@a0n/aeon 5.0.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +15 -0
- package/README.md +199 -0
- package/dist/CryptoProvider-SLWjqByk.d.cts +407 -0
- package/dist/CryptoProvider-SLWjqByk.d.ts +407 -0
- package/dist/compression/index.cjs +1445 -0
- package/dist/compression/index.cjs.map +1 -0
- package/dist/compression/index.d.cts +451 -0
- package/dist/compression/index.d.ts +451 -0
- package/dist/compression/index.js +1426 -0
- package/dist/compression/index.js.map +1 -0
- package/dist/core/index.cjs +4 -0
- package/dist/core/index.cjs.map +1 -0
- package/dist/core/index.d.cts +212 -0
- package/dist/core/index.d.ts +212 -0
- package/dist/core/index.js +3 -0
- package/dist/core/index.js.map +1 -0
- package/dist/crypto/index.cjs +130 -0
- package/dist/crypto/index.cjs.map +1 -0
- package/dist/crypto/index.d.cts +56 -0
- package/dist/crypto/index.d.ts +56 -0
- package/dist/crypto/index.js +124 -0
- package/dist/crypto/index.js.map +1 -0
- package/dist/distributed/index.cjs +2586 -0
- package/dist/distributed/index.cjs.map +1 -0
- package/dist/distributed/index.d.cts +1005 -0
- package/dist/distributed/index.d.ts +1005 -0
- package/dist/distributed/index.js +2580 -0
- package/dist/distributed/index.js.map +1 -0
- package/dist/index.cjs +10953 -0
- package/dist/index.cjs.map +1 -0
- package/dist/index.d.cts +1953 -0
- package/dist/index.d.ts +1953 -0
- package/dist/index.js +10828 -0
- package/dist/index.js.map +1 -0
- package/dist/offline/index.cjs +419 -0
- package/dist/offline/index.cjs.map +1 -0
- package/dist/offline/index.d.cts +148 -0
- package/dist/offline/index.d.ts +148 -0
- package/dist/offline/index.js +415 -0
- package/dist/offline/index.js.map +1 -0
- package/dist/optimization/index.cjs +800 -0
- package/dist/optimization/index.cjs.map +1 -0
- package/dist/optimization/index.d.cts +347 -0
- package/dist/optimization/index.d.ts +347 -0
- package/dist/optimization/index.js +790 -0
- package/dist/optimization/index.js.map +1 -0
- package/dist/persistence/index.cjs +207 -0
- package/dist/persistence/index.cjs.map +1 -0
- package/dist/persistence/index.d.cts +95 -0
- package/dist/persistence/index.d.ts +95 -0
- package/dist/persistence/index.js +204 -0
- package/dist/persistence/index.js.map +1 -0
- package/dist/presence/index.cjs +489 -0
- package/dist/presence/index.cjs.map +1 -0
- package/dist/presence/index.d.cts +283 -0
- package/dist/presence/index.d.ts +283 -0
- package/dist/presence/index.js +485 -0
- package/dist/presence/index.js.map +1 -0
- package/dist/types-CMxO7QF0.d.cts +33 -0
- package/dist/types-CMxO7QF0.d.ts +33 -0
- package/dist/utils/index.cjs +64 -0
- package/dist/utils/index.cjs.map +1 -0
- package/dist/utils/index.d.cts +38 -0
- package/dist/utils/index.d.ts +38 -0
- package/dist/utils/index.js +57 -0
- package/dist/utils/index.js.map +1 -0
- package/dist/versioning/index.cjs +1164 -0
- package/dist/versioning/index.cjs.map +1 -0
- package/dist/versioning/index.d.cts +537 -0
- package/dist/versioning/index.d.ts +537 -0
- package/dist/versioning/index.js +1159 -0
- package/dist/versioning/index.js.map +1 -0
- package/package.json +194 -0
|
@@ -0,0 +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/distributed/RecoveryLedger.ts","../src/offline/OfflineOperationQueue.ts","../src/compression/CompressionEngine.ts","../src/compression/DeltaSyncOptimizer.ts","../src/compression/codecs.ts","../src/compression/TopologicalCompressor.ts","../src/optimization/PrefetchingEngine.ts","../src/optimization/BatchTimingOptimizer.ts","../src/optimization/AdaptiveCompressionOptimizer.ts","../src/presence/AgentPresenceManager.ts","../src/crypto/types.ts","../src/crypto/CryptoProvider.ts","../src/crypto/transactionSigner.ts","../src/flow/FlowCodec.ts","../src/flow/types.ts","../src/flow/AeonFlowProtocol.ts","../src/flow/frame-reassembler.ts","../src/flow/UDPFlowTransport.ts","../src/topology/TopologyAnalyzer.ts","../src/topology/TopologySampler.ts","../src/topology/formal-claims.ts","../src/topology/gnosis-impossible-systems.ts","../src/topology/projection.ts","../src/transport/dashrelay.ts","../src/transport/bluetooth.ts","../src/transport/webrtc.ts","../src/transport/tcp.ts","../src/transport/ipc.ts","../src/transport/usb.ts","../src/transport/http.ts","../src/federation/federated-inference.ts","../src/index.ts"],"names":["logger","EventEmitter","result","deltaSize","exports","createHash","encoder","decoder","LENGTH_PREFIX_SIZE"],"mappings":"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","file":"index.cjs","sourcesContent":["/**\n * Aeon Logger Interface\n *\n * Provides a pluggable logging interface that can be configured\n * by consumers to integrate with their preferred logging solution.\n */\n\n/**\n * Logger interface that consumers can implement\n */\nexport interface Logger {\n debug: (...args: unknown[]) => void;\n info: (...args: unknown[]) => void;\n warn: (...args: unknown[]) => void;\n error: (...args: unknown[]) => void;\n}\n\n/**\n * Default console logger implementation\n */\nconst consoleLogger: Logger = {\n debug: (...args: unknown[]) => {\n // eslint-disable-next-line no-console\n console.debug('[AEON:DEBUG]', ...args);\n },\n info: (...args: unknown[]) => {\n // eslint-disable-next-line no-console\n console.info('[AEON:INFO]', ...args);\n },\n warn: (...args: unknown[]) => {\n // eslint-disable-next-line no-console\n console.warn('[AEON:WARN]', ...args);\n },\n error: (...args: unknown[]) => {\n // eslint-disable-next-line no-console\n console.error('[AEON:ERROR]', ...args);\n },\n};\n\n/**\n * No-op logger for production or when logging is disabled\n */\nconst noopLogger: Logger = {\n debug: () => {},\n info: () => {},\n warn: () => {},\n error: () => {},\n};\n\n/**\n * Current logger instance\n */\nlet currentLogger: Logger = consoleLogger;\n\n/**\n * Get the current logger instance\n */\nexport function getLogger(): Logger {\n return currentLogger;\n}\n\n/**\n * Set a custom logger implementation\n */\nexport function setLogger(logger: Logger): void {\n currentLogger = logger;\n}\n\n/**\n * Reset to the default console logger\n */\nexport function resetLogger(): void {\n currentLogger = consoleLogger;\n}\n\n/**\n * Disable all logging\n */\nexport function disableLogging(): void {\n currentLogger = noopLogger;\n}\n\n/**\n * Create a namespaced logger\n */\nexport function createNamespacedLogger(namespace: string): Logger {\n const logger = getLogger();\n return {\n debug: (...args: unknown[]) => logger.debug(`[${namespace}]`, ...args),\n info: (...args: unknown[]) => logger.info(`[${namespace}]`, ...args),\n warn: (...args: unknown[]) => logger.warn(`[${namespace}]`, ...args),\n error: (...args: unknown[]) => logger.error(`[${namespace}]`, ...args),\n };\n}\n\n// Export default logger for convenience\nexport const logger: Logger = {\n debug: (...args: unknown[]) => getLogger().debug(...args),\n info: (...args: unknown[]) => getLogger().info(...args),\n warn: (...args: unknown[]) => getLogger().warn(...args),\n error: (...args: unknown[]) => getLogger().error(...args),\n};\n","import type { StorageAdapter } from './types';\n\nexport interface DashStorageBackend {\n get(key: string): Promise<string | null> | string | null;\n set(key: string, value: string): Promise<void> | void;\n delete(key: string): Promise<void> | void;\n}\n\nexport interface DashStorageChange {\n key: string;\n operation: 'set' | 'delete';\n value?: string;\n timestamp: number;\n}\n\nexport interface DashSyncClient {\n syncChanges(changes: DashStorageChange[]): Promise<void>;\n}\n\nexport type DashSyncUrgency = 'realtime' | 'deferred' | 'lazy';\n\nexport interface DashSyncRule {\n /** How quickly to sync changes for keys matching this rule/prefix */\n urgency: DashSyncUrgency;\n /** Debounce/Interval for deferred/lazy sync (e.g. '1s', '1m', '1h') */\n debounce?: string | number;\n /** Maximum number of pending changes before forcing a sync */\n maxBufferSize?: number;\n /** Whether to return pending values from memory (default: true) */\n readThrough?: boolean;\n}\n\nexport interface DashSyncRules {\n default?: DashSyncRule;\n /** Key prefix mapping to sync rules */\n prefixes?: Record<string, DashSyncRule>;\n}\n\nexport interface DashStorageAdapterHooks {\n onSync?: (changes: DashStorageChange[]) => void;\n onSyncError?: (error: Error, changes: DashStorageChange[]) => void;\n onBufferOverflow?: (prefix: string, size: number, max: number) => void;\n onFlush?: (count: number) => void;\n}\n\nexport interface DashStorageAdapterOptions {\n syncClient?: DashSyncClient;\n rules?: DashSyncRules;\n hooks?: DashStorageAdapterHooks;\n /** @deprecated Use rules.default.debounce */\n syncDebounceMs?: number;\n /** @deprecated Use rules.default.maxBufferSize */\n maxPendingChanges?: number;\n /** @deprecated Use hooks.onSyncError */\n onSyncError?: (error: Error, changes: DashStorageChange[]) => void;\n}\n\nconst DEFAULT_RULE: DashSyncRule = {\n urgency: 'deferred',\n debounce: 50,\n maxBufferSize: 5000,\n readThrough: true,\n};\n\n/**\n * Storage adapter boundary for dash-backed persistence.\n *\n * Provides a \"Write Pool\" layer that buffers local-first writes and flushes\n * them to D1/R2 via a sync client based on declarative rules.\n */\nexport class DashStorageAdapter implements StorageAdapter {\n private readonly backend: DashStorageBackend;\n private readonly syncClient: DashSyncClient | null;\n private readonly rules: DashSyncRules;\n private readonly hooks: DashStorageAdapterHooks;\n private readonly pendingChanges = new Map<string, DashStorageChange>();\n private syncTimer: ReturnType<typeof setTimeout> | null = null;\n private syncInFlight = false;\n private syncPending = false;\n\n constructor(\n backend: DashStorageBackend,\n options: DashStorageAdapterOptions = {}\n ) {\n this.backend = backend;\n this.syncClient = options.syncClient ?? null;\n this.hooks = options.hooks ?? {};\n\n // Migration/Fallback for deprecated options\n const defaultRule: DashSyncRule = {\n ...DEFAULT_RULE,\n ...(options.rules?.default ?? {}),\n };\n if (options.syncDebounceMs !== undefined)\n defaultRule.debounce = options.syncDebounceMs;\n if (options.maxPendingChanges !== undefined)\n defaultRule.maxBufferSize = options.maxPendingChanges;\n if (options.onSyncError && !this.hooks.onSyncError)\n this.hooks.onSyncError = options.onSyncError;\n\n this.rules = {\n default: defaultRule,\n prefixes: options.rules?.prefixes ?? {},\n };\n }\n\n /**\n * Get an item, checking the write pool (pending changes) first for consistency.\n */\n async getItem(key: string): Promise<string | null> {\n const rule = this.getRuleForKey(key);\n\n // Read-through: check memory first if enabled\n if (rule.readThrough !== false) {\n const pending = this.pendingChanges.get(key);\n if (pending) {\n return pending.operation === 'delete' ? null : pending.value ?? null;\n }\n }\n\n return await this.backend.get(key);\n }\n\n async setItem(key: string, value: string): Promise<void> {\n await this.backend.set(key, value);\n this.trackChange({\n key,\n operation: 'set',\n value,\n timestamp: Date.now(),\n });\n }\n\n async removeItem(key: string): Promise<void> {\n await this.backend.delete(key);\n this.trackChange({\n key,\n operation: 'delete',\n timestamp: Date.now(),\n });\n }\n\n getPendingSyncCount(): number {\n return this.pendingChanges.size;\n }\n\n async flushSync(): Promise<void> {\n if (!this.syncClient || this.pendingChanges.size === 0) {\n return;\n }\n if (this.syncTimer) {\n clearTimeout(this.syncTimer);\n this.syncTimer = null;\n }\n await this.performSync();\n }\n\n private trackChange(change: DashStorageChange): void {\n this.pendingChanges.set(change.key, change);\n\n const rule = this.getRuleForKey(change.key);\n\n // Immediate flush for realtime\n if (rule.urgency === 'realtime') {\n void this.performSync();\n return;\n }\n\n // Check for buffer overflow\n const maxSize = rule.maxBufferSize ?? 5000;\n if (this.pendingChanges.size >= maxSize) {\n this.hooks.onBufferOverflow?.(\n this.getPrefixMatch(change.key) || 'default',\n this.pendingChanges.size,\n maxSize\n );\n void this.performSync();\n return;\n }\n\n this.scheduleSync(rule);\n }\n\n private getRuleForKey(key: string): DashSyncRule {\n const prefix = this.getPrefixMatch(key);\n return (\n (prefix ? this.rules.prefixes?.[prefix] : this.rules.default) ??\n this.rules.default!\n );\n }\n\n private getPrefixMatch(key: string): string | null {\n if (!this.rules.prefixes) {\n return null;\n }\n // Match longest prefix first\n const prefixes = Object.keys(this.rules.prefixes).sort(\n (a, b) => b.length - a.length\n );\n return prefixes.find((p) => key.startsWith(p)) ?? null;\n }\n\n private scheduleSync(rule: DashSyncRule): void {\n if (!this.syncClient || this.syncTimer) {\n return;\n }\n\n const debounceMs =\n typeof rule.debounce === 'string'\n ? this.parseInterval(rule.debounce)\n : rule.debounce ?? 50;\n\n this.syncTimer = setTimeout(() => {\n this.syncTimer = null;\n void this.performSync();\n }, debounceMs);\n }\n\n private async performSync(): Promise<void> {\n if (!this.syncClient) {\n return;\n }\n\n if (this.syncInFlight) {\n this.syncPending = true;\n return;\n }\n\n const changes = Array.from(this.pendingChanges.values()).sort(\n (a, b) => a.timestamp - b.timestamp\n );\n if (changes.length === 0) {\n return;\n }\n\n this.pendingChanges.clear();\n this.syncInFlight = true;\n try {\n await this.syncClient.syncChanges(changes);\n this.hooks.onSync?.(changes);\n this.hooks.onFlush?.(changes.length);\n } catch (error) {\n // Re-queue changes if they haven't been overwritten by newer local writes\n for (const change of changes) {\n const current = this.pendingChanges.get(change.key);\n if (!current || change.timestamp > current.timestamp) {\n this.pendingChanges.set(change.key, change);\n }\n }\n\n if (this.hooks.onSyncError) {\n const normalizedError =\n error instanceof Error ? error : new Error(String(error));\n this.hooks.onSyncError(normalizedError, changes);\n }\n } finally {\n this.syncInFlight = false;\n const rerun = this.syncPending || this.pendingChanges.size > 0;\n this.syncPending = false;\n if (rerun) {\n // Use default rule for re-run or wait for next trackChange\n this.scheduleSync(this.rules.default!);\n }\n }\n }\n\n private parseInterval(input: string): number {\n const match = input.match(/^(\\d+)(ms|s|m|h|d)$/);\n if (!match) return 50;\n const value = parseInt(match[1], 10);\n const unit = match[2];\n switch (unit) {\n case 'ms':\n return value;\n case 's':\n return value * 1000;\n case 'm':\n return value * 60 * 1000;\n case 'h':\n return value * 60 * 60 * 1000;\n case 'd':\n return value * 24 * 60 * 60 * 1000;\n default:\n return 50;\n }\n }\n}\n","import type { StorageAdapter } from './types';\n\n/**\n * In-memory adapter for tests and ephemeral runtimes.\n */\nexport class InMemoryStorageAdapter implements StorageAdapter {\n private readonly store = new Map<string, string>();\n\n getItem(key: string): string | null {\n return this.store.get(key) ?? null;\n }\n\n setItem(key: string, value: string): void {\n this.store.set(key, value);\n }\n\n removeItem(key: string): void {\n this.store.delete(key);\n }\n\n async flushSync(): Promise<void> {\n /* noop */\n }\n\n clear(): void {\n this.store.clear();\n }\n}\n","/**\n * Schema Version Manager\n *\n * Manages schema versioning across the application.\n * Tracks version history, compatibility, and migration paths.\n *\n * Features:\n * - Version tracking and comparison\n * - Compatibility matrix management\n * - Migration path calculation\n * - Version validation\n */\n\nimport { logger } from '../utils/logger';\n\nexport interface SchemaVersion {\n major: number;\n minor: number;\n patch: number;\n timestamp: string;\n description: string;\n breaking: boolean;\n}\n\nexport interface VersionMetadata {\n version: SchemaVersion;\n previousVersion?: SchemaVersion;\n changes: string[];\n migrationsRequired: string[];\n rollbackPossible: boolean;\n}\n\nexport interface CompatibilityRule {\n from: string;\n to: string;\n compatible: boolean;\n requiresMigration: boolean;\n migrationSteps: number;\n}\n\n/**\n * Schema Version Manager\n * Tracks and manages schema versions across the application\n */\nexport class SchemaVersionManager {\n private versions: Map<string, SchemaVersion> = new Map();\n private versionHistory: SchemaVersion[] = [];\n private compatibilityMatrix: Map<string, CompatibilityRule[]> = new Map();\n private currentVersion: SchemaVersion | null = null;\n\n constructor() {\n this.initializeDefaultVersions();\n }\n\n /**\n * Initialize default versions\n */\n private initializeDefaultVersions(): void {\n const v1_0_0: SchemaVersion = {\n major: 1,\n minor: 0,\n patch: 0,\n timestamp: new Date().toISOString(),\n description: 'Initial schema version',\n breaking: false,\n };\n\n this.registerVersion(v1_0_0);\n this.currentVersion = v1_0_0;\n }\n\n /**\n * Register a new schema version\n */\n registerVersion(version: SchemaVersion): void {\n const versionString = this.versionToString(version);\n\n this.versions.set(versionString, version);\n this.versionHistory.push(version);\n\n logger.debug('[SchemaVersionManager] Version registered', {\n version: versionString,\n breaking: version.breaking,\n description: version.description,\n });\n }\n\n /**\n * Get current version\n */\n getCurrentVersion(): SchemaVersion {\n if (!this.currentVersion) {\n throw new Error('No current version set');\n }\n return this.currentVersion;\n }\n\n /**\n * Set current version\n */\n setCurrentVersion(version: SchemaVersion): void {\n if (!this.versions.has(this.versionToString(version))) {\n throw new Error(\n `Version ${this.versionToString(version)} not registered`\n );\n }\n\n this.currentVersion = version;\n logger.debug('[SchemaVersionManager] Current version set', {\n version: this.versionToString(version),\n });\n }\n\n /**\n * Get version history\n */\n getVersionHistory(): SchemaVersion[] {\n return [...this.versionHistory];\n }\n\n /**\n * Check if version exists\n */\n hasVersion(version: SchemaVersion): boolean {\n return this.versions.has(this.versionToString(version));\n }\n\n /**\n * Get version by string (e.g., \"1.2.3\")\n */\n getVersion(versionString: string): SchemaVersion | undefined {\n return this.versions.get(versionString);\n }\n\n /**\n * Register compatibility rule\n */\n registerCompatibility(rule: CompatibilityRule): void {\n if (!this.compatibilityMatrix.has(rule.from)) {\n this.compatibilityMatrix.set(rule.from, []);\n }\n\n const rules = this.compatibilityMatrix.get(rule.from);\n if (rules) {\n rules.push(rule);\n }\n\n logger.debug('[SchemaVersionManager] Compatibility rule registered', {\n from: rule.from,\n to: rule.to,\n compatible: rule.compatible,\n requiresMigration: rule.requiresMigration,\n });\n }\n\n /**\n * Check if migration path exists\n */\n canMigrate(\n fromVersion: SchemaVersion | string,\n toVersion: SchemaVersion | string\n ): boolean {\n const fromStr =\n typeof fromVersion === 'string'\n ? fromVersion\n : this.versionToString(fromVersion);\n const toStr =\n typeof toVersion === 'string'\n ? toVersion\n : this.versionToString(toVersion);\n\n const rules = this.compatibilityMatrix.get(fromStr) || [];\n return rules.some((r) => r.to === toStr && r.requiresMigration);\n }\n\n /**\n * Get migration path\n */\n getMigrationPath(\n fromVersion: SchemaVersion,\n toVersion: SchemaVersion\n ): SchemaVersion[] {\n const path: SchemaVersion[] = [];\n let current = fromVersion;\n\n const maxSteps = 100; // Prevent infinite loops\n let steps = 0;\n\n while (this.compareVersions(current, toVersion) !== 0 && steps < maxSteps) {\n const fromStr = this.versionToString(current);\n const rules = this.compatibilityMatrix.get(fromStr) || [];\n\n let found = false;\n for (const rule of rules) {\n const nextVersion = this.getVersion(rule.to);\n if (nextVersion) {\n // Find the closest path to target\n if (\n this.compareVersions(nextVersion, toVersion) <= 0 ||\n this.compareVersions(current, nextVersion) <\n this.compareVersions(current, toVersion)\n ) {\n current = nextVersion;\n path.push(current);\n found = true;\n break;\n }\n }\n }\n\n if (!found) {\n break;\n }\n\n steps++;\n }\n\n return path;\n }\n\n /**\n * Compare two versions\n * Returns: -1 if v1 < v2, 0 if equal, 1 if v1 > v2\n */\n compareVersions(\n v1: SchemaVersion | string,\n v2: SchemaVersion | string\n ): number {\n const ver1 = typeof v1 === 'string' ? this.parseVersion(v1) : v1;\n const ver2 = typeof v2 === 'string' ? this.parseVersion(v2) : v2;\n\n if (ver1.major !== ver2.major) {\n return ver1.major < ver2.major ? -1 : 1;\n }\n if (ver1.minor !== ver2.minor) {\n return ver1.minor < ver2.minor ? -1 : 1;\n }\n if (ver1.patch !== ver2.patch) {\n return ver1.patch < ver2.patch ? -1 : 1;\n }\n return 0;\n }\n\n /**\n * Parse version string to SchemaVersion\n */\n parseVersion(versionString: string): SchemaVersion {\n const parts = versionString.split('.').map(Number);\n const safeInt = (v: number | undefined): number =>\n v !== undefined && Number.isFinite(v) ? v : 0;\n return {\n major: safeInt(parts[0]),\n minor: safeInt(parts[1]),\n patch: safeInt(parts[2]),\n timestamp: new Date().toISOString(),\n description: '',\n breaking: false,\n };\n }\n\n /**\n * Create new version\n */\n createVersion(\n major: number,\n minor: number,\n patch: number,\n description: string,\n breaking: boolean = false\n ): SchemaVersion {\n return {\n major,\n minor,\n patch,\n timestamp: new Date().toISOString(),\n description,\n breaking,\n };\n }\n\n /**\n * Convert version to string\n */\n versionToString(version: SchemaVersion): string {\n return `${version.major}.${version.minor}.${version.patch}`;\n }\n\n /**\n * Get version metadata\n */\n getVersionMetadata(version: SchemaVersion): VersionMetadata {\n const history = this.versionHistory;\n const currentIndex = history.findIndex(\n (v) => this.versionToString(v) === this.versionToString(version)\n );\n\n return {\n version,\n previousVersion: currentIndex > 0 ? history[currentIndex - 1] : undefined,\n changes: [version.description],\n migrationsRequired: this.canMigrate(\n this.currentVersion || version,\n version\n )\n ? [this.versionToString(version)]\n : [],\n rollbackPossible: currentIndex > 0,\n };\n }\n\n /**\n * Get all registered versions\n */\n getAllVersions(): SchemaVersion[] {\n return Array.from(this.versions.values()).sort((a, b) =>\n this.compareVersions(a, b)\n );\n }\n\n /**\n * Clear all versions (for testing)\n */\n clear(): void {\n this.versions.clear();\n this.versionHistory = [];\n this.compatibilityMatrix.clear();\n this.currentVersion = null;\n }\n}\n","/**\n * Migration Engine\n *\n * Executes schema migrations with rollback support.\n * Manages migration execution, error handling, and state management.\n *\n * Features:\n * - Migration execution and tracking\n * - Rollback support\n * - Error handling and recovery\n * - Migration state management\n */\n\nimport { logger } from '../utils/logger';\n\nexport interface Migration {\n id: string;\n version: string;\n name: string;\n up: (data: unknown) => unknown;\n down?: (data: unknown) => unknown;\n timestamp: string;\n description: string;\n}\n\nexport interface MigrationResult {\n migrationId: string;\n success: boolean;\n timestamp: string;\n duration: number;\n itemsAffected: number;\n errors: string[];\n}\n\nexport interface MigrationState {\n currentVersion: string;\n appliedMigrations: string[];\n failedMigrations: string[];\n lastMigrationTime: string;\n totalMigrationsRun: number;\n}\n\n/**\n * Migration Engine\n * Executes and manages schema migrations\n */\nexport class MigrationEngine {\n private migrations: Map<string, Migration> = new Map();\n private executedMigrations: MigrationResult[] = [];\n private state: MigrationState = {\n currentVersion: '1.0.0',\n appliedMigrations: [],\n failedMigrations: [],\n lastMigrationTime: new Date().toISOString(),\n totalMigrationsRun: 0,\n };\n\n /**\n * Register a migration\n */\n registerMigration(migration: Migration): void {\n this.migrations.set(migration.id, migration);\n\n logger.debug('[MigrationEngine] Migration registered', {\n id: migration.id,\n version: migration.version,\n name: migration.name,\n });\n }\n\n /**\n * Execute a migration\n */\n async executeMigration(\n migrationId: string,\n data: unknown\n ): Promise<MigrationResult> {\n const migration = this.migrations.get(migrationId);\n if (!migration) {\n throw new Error(`Migration ${migrationId} not found`);\n }\n\n const startTime = Date.now();\n const result: MigrationResult = {\n migrationId,\n success: false,\n timestamp: new Date().toISOString(),\n duration: 0,\n itemsAffected: 0,\n errors: [],\n };\n\n try {\n logger.debug('[MigrationEngine] Executing migration', {\n id: migrationId,\n version: migration.version,\n });\n\n // Execute up migration\n migration.up(data);\n\n result.success = true;\n result.itemsAffected = Array.isArray(data)\n ? (data as unknown[]).length\n : 1;\n result.duration = Date.now() - startTime;\n\n // Track as applied\n this.state.appliedMigrations.push(migrationId);\n this.state.currentVersion = migration.version;\n this.state.totalMigrationsRun++;\n this.state.lastMigrationTime = result.timestamp;\n\n this.executedMigrations.push(result);\n\n logger.debug('[MigrationEngine] Migration executed successfully', {\n id: migrationId,\n duration: result.duration,\n itemsAffected: result.itemsAffected,\n });\n\n return result;\n } catch (error) {\n result.errors = [error instanceof Error ? error.message : String(error)];\n this.state.failedMigrations.push(migrationId);\n\n this.executedMigrations.push(result);\n\n logger.error('[MigrationEngine] Migration failed', {\n id: migrationId,\n error: result.errors[0],\n });\n\n throw new Error(`Migration ${migrationId} failed: ${result.errors[0]}`);\n }\n }\n\n /**\n * Rollback a migration\n */\n async rollbackMigration(\n migrationId: string,\n data: unknown\n ): Promise<MigrationResult> {\n const migration = this.migrations.get(migrationId);\n if (!migration) {\n throw new Error(`Migration ${migrationId} not found`);\n }\n\n if (!migration.down) {\n throw new Error(`Migration ${migrationId} does not support rollback`);\n }\n\n const startTime = Date.now();\n const result: MigrationResult = {\n migrationId,\n success: false,\n timestamp: new Date().toISOString(),\n duration: 0,\n itemsAffected: 0,\n errors: [],\n };\n\n try {\n logger.debug('[MigrationEngine] Rolling back migration', {\n id: migrationId,\n version: migration.version,\n });\n\n // Execute down migration\n migration.down(data);\n\n result.success = true;\n result.itemsAffected = Array.isArray(data)\n ? (data as unknown[]).length\n : 1;\n result.duration = Date.now() - startTime;\n\n // Remove from applied migrations\n this.state.appliedMigrations = this.state.appliedMigrations.filter(\n (id) => id !== migrationId\n );\n\n this.executedMigrations.push(result);\n\n logger.debug('[MigrationEngine] Migration rolled back', {\n id: migrationId,\n duration: result.duration,\n });\n\n return result;\n } catch (error) {\n result.errors = [error instanceof Error ? error.message : String(error)];\n\n this.executedMigrations.push(result);\n\n logger.error('[MigrationEngine] Rollback failed', {\n id: migrationId,\n error: result.errors[0],\n });\n\n throw new Error(\n `Rollback for ${migrationId} failed: ${result.errors[0]}`\n );\n }\n }\n\n /**\n * Get migration state\n */\n getState(): MigrationState {\n return { ...this.state };\n }\n\n /**\n * Get migration execution history\n */\n getExecutionHistory(): MigrationResult[] {\n return [...this.executedMigrations];\n }\n\n /**\n * Get migration by ID\n */\n getMigration(migrationId: string): Migration | undefined {\n return this.migrations.get(migrationId);\n }\n\n /**\n * Get all registered migrations\n */\n getAllMigrations(): Migration[] {\n return Array.from(this.migrations.values());\n }\n\n /**\n * Get applied migrations\n */\n getAppliedMigrations(): string[] {\n return [...this.state.appliedMigrations];\n }\n\n /**\n * Get failed migrations\n */\n getFailedMigrations(): string[] {\n return [...this.state.failedMigrations];\n }\n\n /**\n * Get pending migrations\n */\n getPendingMigrations(): Migration[] {\n return this.getAllMigrations().filter(\n (m) => !this.state.appliedMigrations.includes(m.id)\n );\n }\n\n /**\n * Get migration statistics\n */\n getStatistics() {\n const successful = this.executedMigrations.filter((m) => m.success).length;\n const failed = this.executedMigrations.filter((m) => !m.success).length;\n const totalDuration = this.executedMigrations.reduce(\n (sum, m) => sum + m.duration,\n 0\n );\n const totalAffected = this.executedMigrations.reduce(\n (sum, m) => sum + m.itemsAffected,\n 0\n );\n\n return {\n totalExecuted: this.executedMigrations.length,\n successful,\n failed,\n successRate:\n this.executedMigrations.length > 0\n ? (successful / this.executedMigrations.length) * 100\n : 0,\n totalDurationMs: totalDuration,\n averageDurationMs:\n this.executedMigrations.length > 0\n ? totalDuration / this.executedMigrations.length\n : 0,\n totalAffected,\n };\n }\n\n /**\n * Clear history (for testing)\n */\n clear(): void {\n this.migrations.clear();\n this.executedMigrations = [];\n this.state = {\n currentVersion: '1.0.0',\n appliedMigrations: [],\n failedMigrations: [],\n lastMigrationTime: new Date().toISOString(),\n totalMigrationsRun: 0,\n };\n }\n}\n","/**\n * Data Transformer\n *\n * Transforms data structures during schema migrations.\n * Handles field transformation, type casting, and validation.\n *\n * Features:\n * - Field-level transformation\n * - Type conversion and casting\n * - Validation during transformation\n * - Error handling and reporting\n * - Batch transformation support\n */\n\nimport { logger } from '../utils/logger';\n\nexport interface FieldTransformer {\n (value: unknown): unknown;\n}\n\nexport interface TransformationRule {\n field: string;\n transformer: FieldTransformer;\n required?: boolean;\n defaultValue?: unknown;\n}\n\nexport interface TransformationResult {\n success: boolean;\n itemsTransformed: number;\n itemsFailed: number;\n errors: Array<{ item: unknown; error: string }>;\n warnings: string[];\n duration: number;\n}\n\n/**\n * Data Transformer\n * Transforms data structures during schema migrations\n */\nexport class DataTransformer {\n private rules: Map<string, TransformationRule> = new Map();\n private transformationHistory: TransformationResult[] = [];\n\n /**\n * Register a transformation rule\n */\n registerRule(rule: TransformationRule): void {\n this.rules.set(rule.field, rule);\n\n logger.debug('[DataTransformer] Rule registered', {\n field: rule.field,\n required: rule.required,\n hasDefault: rule.defaultValue !== undefined,\n });\n }\n\n /**\n * Transform a single field value\n */\n transformField(field: string, value: unknown): unknown {\n const rule = this.rules.get(field);\n if (!rule) {\n // No rule = no transformation\n return value;\n }\n\n try {\n return rule.transformer(value);\n } catch (error) {\n if (rule.required) {\n throw new Error(\n `Failed to transform required field ${field}: ${\n error instanceof Error ? error.message : String(error)\n }`\n );\n }\n\n // Return default value or original value\n return rule.defaultValue !== undefined ? rule.defaultValue : value;\n }\n }\n\n /**\n * Transform a single object\n */\n transformObject(data: Record<string, unknown>): Record<string, unknown> {\n const transformed: Record<string, unknown> = {};\n\n for (const [key, value] of Object.entries(data)) {\n try {\n transformed[key] = this.transformField(key, value);\n } catch (error) {\n logger.warn('[DataTransformer] Field transformation failed', {\n field: key,\n error: error instanceof Error ? error.message : String(error),\n });\n\n // If field is not required, include original value\n const rule = this.rules.get(key);\n if (!rule || !rule.required) {\n transformed[key] = value;\n }\n }\n }\n\n return transformed;\n }\n\n /**\n * Transform a collection of items\n */\n transformCollection(items: unknown[]): TransformationResult {\n const startTime = Date.now();\n const result: TransformationResult = {\n success: true,\n itemsTransformed: 0,\n itemsFailed: 0,\n errors: [],\n warnings: [],\n duration: 0,\n };\n\n for (let i = 0; i < items.length; i++) {\n const item = items[i];\n\n try {\n if (typeof item === 'object' && item !== null && !Array.isArray(item)) {\n this.transformObject(item as Record<string, unknown>);\n result.itemsTransformed++;\n } else {\n // Cannot transform non-object items\n result.warnings.push(`Item ${i} is not a transformable object`);\n }\n } catch (error) {\n result.errors.push({\n item,\n error: error instanceof Error ? error.message : String(error),\n });\n result.itemsFailed++;\n }\n }\n\n result.duration = Date.now() - startTime;\n result.success = result.itemsFailed === 0;\n\n this.transformationHistory.push(result);\n\n logger.debug('[DataTransformer] Collection transformed', {\n total: items.length,\n transformed: result.itemsTransformed,\n failed: result.itemsFailed,\n duration: result.duration,\n });\n\n return result;\n }\n\n /**\n * Validate transformed data\n */\n validateTransformation(\n original: unknown[],\n transformed: unknown[]\n ): {\n valid: boolean;\n issues: string[];\n } {\n const issues: string[] = [];\n\n if (original.length !== transformed.length) {\n issues.push(\n `Item count mismatch: ${original.length} -> ${transformed.length}`\n );\n }\n\n // Check that all items were processed\n for (let i = 0; i < Math.min(original.length, transformed.length); i++) {\n const orig = original[i];\n const trans = transformed[i];\n\n if (!this.validateItem(orig, trans)) {\n issues.push(`Item ${i} validation failed`);\n }\n }\n\n return {\n valid: issues.length === 0,\n issues,\n };\n }\n\n /**\n * Validate a single item transformation\n */\n private validateItem(original: unknown, transformed: unknown): boolean {\n // Basic validation: ensure transformed exists if original exists\n if (original === null || original === undefined) {\n return true;\n }\n\n if (typeof original === 'object' && typeof transformed !== 'object') {\n return false;\n }\n\n return true;\n }\n\n /**\n * Get transformation history\n */\n getTransformationHistory(): TransformationResult[] {\n return [...this.transformationHistory];\n }\n\n /**\n * Get transformation statistics\n */\n getStatistics() {\n const totalTransformed = this.transformationHistory.reduce(\n (sum, r) => sum + r.itemsTransformed,\n 0\n );\n const totalFailed = this.transformationHistory.reduce(\n (sum, r) => sum + r.itemsFailed,\n 0\n );\n const totalDuration = this.transformationHistory.reduce(\n (sum, r) => sum + r.duration,\n 0\n );\n\n return {\n totalBatches: this.transformationHistory.length,\n totalTransformed,\n totalFailed,\n successRate:\n totalTransformed + totalFailed > 0\n ? (totalTransformed / (totalTransformed + totalFailed)) * 100\n : 0,\n totalDurationMs: totalDuration,\n averageBatchDurationMs:\n this.transformationHistory.length > 0\n ? totalDuration / this.transformationHistory.length\n : 0,\n };\n }\n\n /**\n * Get registered rules\n */\n getRules(): TransformationRule[] {\n return Array.from(this.rules.values());\n }\n\n /**\n * Get rule for field\n */\n getRule(field: string): TransformationRule | undefined {\n return this.rules.get(field);\n }\n\n /**\n * Clear all rules (for testing)\n */\n clearRules(): void {\n this.rules.clear();\n }\n\n /**\n * Clear history (for testing)\n */\n clearHistory(): void {\n this.transformationHistory = [];\n }\n\n /**\n * Clear all state (for testing)\n */\n clear(): void {\n this.clearRules();\n this.clearHistory();\n }\n}\n","/**\n * Migration Tracker\n *\n * Tracks migration history and enables rollback.\n * Maintains detailed audit trail of all schema changes.\n *\n * Features:\n * - Migration history tracking\n * - Rollback path calculation\n * - Data snapshots for recovery\n * - Audit trail with timestamps\n * - Migration dependency tracking\n */\n\nimport { logger } from '../utils/logger';\nimport type {\n PersistedEnvelope,\n PersistenceDeserializer,\n PersistenceSerializer,\n StorageAdapter,\n} from '../persistence';\n\nexport interface MigrationRecord {\n id: string;\n migrationId: string;\n timestamp: string;\n version: string;\n direction: 'up' | 'down';\n status: 'pending' | 'applied' | 'failed' | 'rolled-back';\n duration: number;\n itemsAffected: number;\n dataSnapshot?: {\n beforeHash: string;\n afterHash: string;\n itemCount: number;\n };\n errorMessage?: string;\n appliedBy: string;\n metadata?: Record<string, unknown>;\n previousHash?: string;\n integrityHash?: string;\n}\n\nexport interface RollbackPath {\n path: string[];\n canRollback: boolean;\n affectedVersions: string[];\n estimatedDuration: number;\n}\n\nexport interface MigrationIntegrityEntry {\n recordId: string;\n previousHash: string;\n hash: string;\n}\n\nexport interface MigrationTrackerPersistenceData {\n migrations: MigrationRecord[];\n snapshots: Array<{\n recordId: string;\n beforeHash: string;\n afterHash: string;\n itemCount: number;\n }>;\n integrity: {\n algorithm: 'sha256-chain-v1';\n entries: MigrationIntegrityEntry[];\n rootHash: string;\n };\n}\n\nexport interface MigrationTrackerPersistenceConfig {\n adapter: StorageAdapter;\n key?: string;\n autoPersist?: boolean;\n autoLoad?: boolean;\n persistDebounceMs?: number;\n serializer?: PersistenceSerializer<MigrationTrackerPersistenceData>;\n deserializer?: PersistenceDeserializer<MigrationTrackerPersistenceData>;\n}\n\nexport interface MigrationTrackerOptions {\n persistence?: MigrationTrackerPersistenceConfig;\n}\n\n/**\n * Migration Tracker\n * Tracks and manages migration history with rollback support\n */\nexport class MigrationTracker {\n private static readonly DEFAULT_PERSIST_KEY = 'aeon:migration-tracker:v1';\n private static readonly INTEGRITY_ROOT = 'aeon:migration-integrity-root:v1';\n private migrations: MigrationRecord[] = [];\n private snapshots: Map<\n string,\n { beforeHash: string; afterHash: string; itemCount: number }\n > = new Map();\n private persistence:\n | (MigrationTrackerPersistenceConfig & { key: string })\n | null = null;\n private persistTimer: ReturnType<typeof setTimeout> | null = null;\n private persistInFlight = false;\n private persistPending = false;\n\n constructor(options?: MigrationTrackerOptions) {\n if (options?.persistence) {\n this.persistence = {\n ...options.persistence,\n key: options.persistence.key ?? MigrationTracker.DEFAULT_PERSIST_KEY,\n autoPersist: options.persistence.autoPersist ?? true,\n autoLoad: options.persistence.autoLoad ?? false,\n persistDebounceMs: options.persistence.persistDebounceMs ?? 25,\n };\n }\n\n if (this.persistence?.autoLoad) {\n void this.loadFromPersistence().catch((error) => {\n logger.error('[MigrationTracker] Failed to load persistence', {\n key: this.persistence?.key,\n error: error instanceof Error ? error.message : String(error),\n });\n });\n }\n }\n\n /**\n * Track a new migration\n */\n recordMigration(record: MigrationRecord): void {\n this.migrations.push({ ...record });\n this.schedulePersist();\n\n logger.debug('[MigrationTracker] Migration recorded', {\n id: record.id,\n migrationId: record.migrationId,\n version: record.version,\n status: record.status,\n });\n }\n\n /**\n * Track migration with snapshot\n */\n trackMigration(\n migrationId: string,\n version: string,\n beforeHash: string,\n afterHash: string,\n itemCount: number,\n duration: number,\n itemsAffected: number,\n appliedBy = 'system'\n ): void {\n const record: MigrationRecord = {\n id: `${migrationId}-${Date.now()}`,\n migrationId,\n timestamp: new Date().toISOString(),\n version,\n direction: 'up',\n status: 'applied',\n duration,\n itemsAffected,\n dataSnapshot: {\n beforeHash,\n afterHash,\n itemCount,\n },\n appliedBy,\n };\n\n this.recordMigration(record);\n this.snapshots.set(record.id, {\n beforeHash,\n afterHash,\n itemCount,\n });\n }\n\n /**\n * Get all migration records\n */\n getMigrations(): MigrationRecord[] {\n return this.migrations.map((m) => ({ ...m }));\n }\n\n /**\n * Get migrations for a specific version\n */\n getMigrationsForVersion(version: string): MigrationRecord[] {\n return this.migrations.filter((m) => m.version === version);\n }\n\n /**\n * Get migration by ID\n */\n getMigration(id: string): MigrationRecord | undefined {\n return this.migrations.find((m) => m.id === id);\n }\n\n /**\n * Check if can rollback\n */\n canRollback(fromVersion: string, toVersion: string): boolean {\n // Find all migrations from fromVersion going down to toVersion\n const fromIndex = this.migrations.findIndex(\n (m) => m.version === fromVersion\n );\n const toIndex = this.migrations.findIndex((m) => m.version === toVersion);\n\n if (fromIndex === -1 || toIndex === -1) {\n return false;\n }\n\n if (toIndex >= fromIndex) {\n return false;\n }\n\n // Check all migrations in between have rollback support (dataSnapshot)\n for (let i = fromIndex; i > toIndex; i--) {\n if (!this.migrations[i]?.dataSnapshot) {\n return false;\n }\n }\n\n return true;\n }\n\n /**\n * Get rollback path\n */\n getRollbackPath(fromVersion: string, toVersion: string): RollbackPath {\n const canRollback = this.canRollback(fromVersion, toVersion);\n const path: string[] = [];\n const affectedVersions: string[] = [];\n let estimatedDuration = 0;\n\n if (canRollback) {\n const fromIndex = this.migrations.findIndex(\n (m) => m.version === fromVersion\n );\n const toIndex = this.migrations.findIndex((m) => m.version === toVersion);\n\n for (let i = fromIndex; i > toIndex; i--) {\n const migration = this.migrations[i];\n if (migration) {\n path.push(migration.migrationId);\n affectedVersions.push(migration.version);\n estimatedDuration += migration.duration;\n }\n }\n }\n\n return {\n path,\n canRollback,\n affectedVersions,\n estimatedDuration,\n };\n }\n\n /**\n * Get applied migrations\n */\n getAppliedMigrations(): MigrationRecord[] {\n return this.migrations.filter((m) => m.status === 'applied');\n }\n\n /**\n * Get failed migrations\n */\n getFailedMigrations(): MigrationRecord[] {\n return this.migrations.filter((m) => m.status === 'failed');\n }\n\n /**\n * Get pending migrations\n */\n getPendingMigrations(): MigrationRecord[] {\n return this.migrations.filter((m) => m.status === 'pending');\n }\n\n /**\n * Get latest migration\n */\n getLatestMigration(): MigrationRecord | undefined {\n return this.migrations[this.migrations.length - 1];\n }\n\n /**\n * Get migration timeline\n */\n getTimeline(): Array<{ timestamp: string; version: string; status: string }> {\n return this.migrations.map((m) => ({\n timestamp: m.timestamp,\n version: m.version,\n status: m.status,\n }));\n }\n\n /**\n * Get migration statistics\n */\n getStatistics() {\n const applied = this.migrations.filter(\n (m) => m.status === 'applied'\n ).length;\n const failed = this.migrations.filter((m) => m.status === 'failed').length;\n const pending = this.migrations.filter(\n (m) => m.status === 'pending'\n ).length;\n const rolledBack = this.migrations.filter(\n (m) => m.status === 'rolled-back'\n ).length;\n\n const totalDuration = this.migrations.reduce(\n (sum, m) => sum + m.duration,\n 0\n );\n const totalAffected = this.migrations.reduce(\n (sum, m) => sum + m.itemsAffected,\n 0\n );\n\n return {\n total: this.migrations.length,\n applied,\n failed,\n pending,\n rolledBack,\n successRate:\n this.migrations.length > 0\n ? (applied / this.migrations.length) * 100\n : 0,\n totalDurationMs: totalDuration,\n averageDurationMs:\n this.migrations.length > 0 ? totalDuration / this.migrations.length : 0,\n totalItemsAffected: totalAffected,\n };\n }\n\n /**\n * Get audit trail\n */\n getAuditTrail(migrationId?: string) {\n const filtered = migrationId\n ? this.migrations.filter((m) => m.migrationId === migrationId)\n : this.migrations;\n\n return filtered.map((m) => ({\n id: m.id,\n timestamp: m.timestamp,\n migrationId: m.migrationId,\n version: m.version,\n status: m.status,\n appliedBy: m.appliedBy,\n duration: m.duration,\n itemsAffected: m.itemsAffected,\n error: m.errorMessage,\n }));\n }\n\n /**\n * Get data snapshot for recovery\n */\n getSnapshot(recordId: string) {\n return this.snapshots.get(recordId);\n }\n\n /**\n * Update migration status\n */\n updateMigrationStatus(\n recordId: string,\n status: MigrationRecord['status'],\n error?: string\n ): void {\n const migration = this.migrations.find((m) => m.id === recordId);\n if (migration) {\n migration.status = status;\n if (error) {\n migration.errorMessage = error;\n }\n\n logger.debug('[MigrationTracker] Migration status updated', {\n recordId,\n status,\n hasError: !!error,\n });\n this.schedulePersist();\n }\n }\n\n /**\n * Persist tracker state with integrity chain verification metadata.\n */\n async saveToPersistence(): Promise<void> {\n if (!this.persistence) {\n return;\n }\n\n const normalizedMigrations = this.migrations.map((migration) => ({\n ...migration,\n previousHash: undefined,\n integrityHash: undefined,\n }));\n\n const integrityEntries: MigrationIntegrityEntry[] = [];\n let previousHash = MigrationTracker.INTEGRITY_ROOT;\n\n for (const migration of normalizedMigrations) {\n const hash = await this.computeDigestHex(\n `${previousHash}|${this.stableStringify(migration)}`\n );\n integrityEntries.push({\n recordId: migration.id,\n previousHash,\n hash,\n });\n previousHash = hash;\n }\n\n const persistedMigrations = normalizedMigrations.map(\n (migration, index) => ({\n ...migration,\n previousHash: integrityEntries[index]?.previousHash,\n integrityHash: integrityEntries[index]?.hash,\n })\n );\n\n const data: MigrationTrackerPersistenceData = {\n migrations: persistedMigrations,\n snapshots: Array.from(this.snapshots.entries()).map(\n ([recordId, snapshot]) => ({\n recordId,\n beforeHash: snapshot.beforeHash,\n afterHash: snapshot.afterHash,\n itemCount: snapshot.itemCount,\n })\n ),\n integrity: {\n algorithm: 'sha256-chain-v1',\n entries: integrityEntries,\n rootHash: previousHash,\n },\n };\n\n const envelope: PersistedEnvelope<MigrationTrackerPersistenceData> = {\n version: 1,\n updatedAt: Date.now(),\n data,\n };\n\n const serialize =\n this.persistence.serializer ??\n ((value: PersistedEnvelope<MigrationTrackerPersistenceData>) =>\n JSON.stringify(value));\n\n await this.persistence.adapter.setItem(\n this.persistence.key,\n serialize(envelope)\n );\n }\n\n /**\n * Load tracker state and verify integrity chain.\n */\n async loadFromPersistence(): Promise<{\n migrations: number;\n snapshots: number;\n }> {\n if (!this.persistence) {\n return { migrations: 0, snapshots: 0 };\n }\n\n const raw = await this.persistence.adapter.getItem(this.persistence.key);\n if (!raw) {\n return { migrations: 0, snapshots: 0 };\n }\n\n const deserialize =\n this.persistence.deserializer ??\n ((value: string) =>\n JSON.parse(\n value\n ) as PersistedEnvelope<MigrationTrackerPersistenceData>);\n\n const envelope = deserialize(raw);\n if (envelope.version !== 1 || !envelope.data) {\n throw new Error('Invalid migration tracker persistence payload');\n }\n if (\n !Array.isArray(envelope.data.migrations) ||\n !Array.isArray(envelope.data.snapshots) ||\n !envelope.data.integrity ||\n !Array.isArray(envelope.data.integrity.entries) ||\n typeof envelope.data.integrity.rootHash !== 'string'\n ) {\n throw new Error('Invalid migration tracker persistence structure');\n }\n\n if (envelope.data.integrity.algorithm !== 'sha256-chain-v1') {\n throw new Error('Unsupported migration integrity algorithm');\n }\n\n if (\n envelope.data.integrity.entries.length !== envelope.data.migrations.length\n ) {\n throw new Error('Migration integrity entry count mismatch');\n }\n\n const validatedMigrations: MigrationRecord[] = [];\n let previousHash = MigrationTracker.INTEGRITY_ROOT;\n\n for (let i = 0; i < envelope.data.migrations.length; i++) {\n const migration = envelope.data.migrations[i];\n const integrity = envelope.data.integrity.entries[i];\n\n if (!this.isValidMigrationRecord(migration)) {\n throw new Error('Invalid persisted migration record');\n }\n if (\n !integrity ||\n integrity.recordId !== migration.id ||\n integrity.previousHash !== previousHash\n ) {\n throw new Error('Migration integrity chain mismatch');\n }\n\n const expectedHash = await this.computeDigestHex(\n `${previousHash}|${this.stableStringify({\n ...migration,\n previousHash: undefined,\n integrityHash: undefined,\n })}`\n );\n\n if (expectedHash !== integrity.hash) {\n throw new Error('Migration integrity verification failed');\n }\n\n validatedMigrations.push({\n ...migration,\n previousHash: integrity.previousHash,\n integrityHash: integrity.hash,\n });\n\n previousHash = expectedHash;\n }\n\n if (previousHash !== envelope.data.integrity.rootHash) {\n throw new Error('Migration integrity root hash mismatch');\n }\n\n const validatedSnapshots = new Map<\n string,\n { beforeHash: string; afterHash: string; itemCount: number }\n >();\n\n for (const snapshot of envelope.data.snapshots) {\n if (\n typeof snapshot.recordId !== 'string' ||\n typeof snapshot.beforeHash !== 'string' ||\n typeof snapshot.afterHash !== 'string' ||\n typeof snapshot.itemCount !== 'number'\n ) {\n throw new Error('Invalid persisted migration snapshot');\n }\n\n validatedSnapshots.set(snapshot.recordId, {\n beforeHash: snapshot.beforeHash,\n afterHash: snapshot.afterHash,\n itemCount: snapshot.itemCount,\n });\n }\n\n this.migrations = validatedMigrations;\n this.snapshots = validatedSnapshots;\n\n logger.debug('[MigrationTracker] Loaded from persistence', {\n key: this.persistence.key,\n migrations: this.migrations.length,\n snapshots: this.snapshots.size,\n });\n\n return {\n migrations: this.migrations.length,\n snapshots: this.snapshots.size,\n };\n }\n\n /**\n * Remove persisted migration tracker state.\n */\n async clearPersistence(): Promise<void> {\n if (!this.persistence) {\n return;\n }\n await this.persistence.adapter.removeItem(this.persistence.key);\n }\n\n /**\n * Clear history (for testing)\n */\n clear(): void {\n this.migrations = [];\n this.snapshots.clear();\n this.schedulePersist();\n }\n\n /**\n * Get total migrations tracked\n */\n getTotalMigrations(): number {\n return this.migrations.length;\n }\n\n /**\n * Find migrations by time range\n */\n getMigrationsByTimeRange(\n startTime: string,\n endTime: string\n ): MigrationRecord[] {\n const start = new Date(startTime).getTime();\n const end = new Date(endTime).getTime();\n\n return this.migrations.filter((m) => {\n const time = new Date(m.timestamp).getTime();\n return time >= start && time <= end;\n });\n }\n\n private schedulePersist(): void {\n if (!this.persistence || this.persistence.autoPersist === false) {\n return;\n }\n\n if (this.persistTimer) {\n clearTimeout(this.persistTimer);\n }\n\n this.persistTimer = setTimeout(() => {\n void this.persistSafely();\n }, this.persistence.persistDebounceMs ?? 25);\n }\n\n private async persistSafely(): Promise<void> {\n if (!this.persistence) {\n return;\n }\n\n if (this.persistInFlight) {\n this.persistPending = true;\n return;\n }\n\n this.persistInFlight = true;\n try {\n await this.saveToPersistence();\n } catch (error) {\n logger.error('[MigrationTracker] Persistence write failed', {\n key: this.persistence.key,\n error: error instanceof Error ? error.message : String(error),\n });\n } finally {\n this.persistInFlight = false;\n const shouldRunAgain = this.persistPending;\n this.persistPending = false;\n if (shouldRunAgain) {\n void this.persistSafely();\n }\n }\n }\n\n private isValidMigrationRecord(value: unknown): value is MigrationRecord {\n if (typeof value !== 'object' || value === null) {\n return false;\n }\n const record = value as Partial<MigrationRecord>;\n const validDirection =\n record.direction === 'up' || record.direction === 'down';\n const validStatus =\n record.status === 'pending' ||\n record.status === 'applied' ||\n record.status === 'failed' ||\n record.status === 'rolled-back';\n return (\n typeof record.id === 'string' &&\n typeof record.migrationId === 'string' &&\n typeof record.timestamp === 'string' &&\n typeof record.version === 'string' &&\n validDirection &&\n validStatus &&\n typeof record.duration === 'number' &&\n typeof record.itemsAffected === 'number' &&\n typeof record.appliedBy === 'string'\n );\n }\n\n private stableStringify(value: unknown): string {\n if (value === null || typeof value !== 'object') {\n return JSON.stringify(value);\n }\n\n if (Array.isArray(value)) {\n return `[${value.map((item) => this.stableStringify(item)).join(',')}]`;\n }\n\n const entries = Object.entries(value as Record<string, unknown>).sort(\n ([a], [b]) => a.localeCompare(b)\n );\n\n return `{${entries\n .map(\n ([key, entryValue]) =>\n `${JSON.stringify(key)}:${this.stableStringify(entryValue)}`\n )\n .join(',')}}`;\n }\n\n private async computeDigestHex(value: string): Promise<string> {\n if (globalThis.crypto?.subtle) {\n const bytes = new TextEncoder().encode(value);\n const normalized = bytes.buffer.slice(\n bytes.byteOffset,\n bytes.byteOffset + bytes.byteLength\n );\n const digest = await globalThis.crypto.subtle.digest(\n 'SHA-256',\n normalized\n );\n return this.toHex(new Uint8Array(digest));\n }\n\n return this.fallbackDigestHex(value);\n }\n\n private toHex(bytes: Uint8Array): string {\n return Array.from(bytes)\n .map((byte) => byte.toString(16).padStart(2, '0'))\n .join('');\n }\n\n private fallbackDigestHex(value: string): string {\n let hash = 2166136261;\n for (let i = 0; i < value.length; i++) {\n hash ^= value.charCodeAt(i);\n hash = Math.imul(hash, 16777619);\n }\n return (hash >>> 0).toString(16).padStart(8, '0');\n }\n}\n","/**\n * Sync Coordinator\n *\n * Coordinates synchronization between multiple nodes in a distributed system.\n * Manages sync sessions, node registration, and synchronization workflows.\n *\n * Features:\n * - Node registration and discovery\n * - Sync session management\n * - Synchronization workflow orchestration\n * - Node health monitoring\n * - Conflict detection and resolution coordination\n * - DID-based node identification\n * - Authenticated sync sessions\n */\n\nimport { EventEmitter } from 'eventemitter3';\nimport { logger } from '../utils/logger';\nimport type { ICryptoProvider } from '../crypto/CryptoProvider';\nimport type { AeonEncryptionMode } from '../crypto/types';\n\nexport interface SyncNode {\n id: string;\n address: string;\n port: number;\n status: 'online' | 'offline' | 'syncing';\n lastHeartbeat: string;\n version: string;\n capabilities: string[];\n // DID-based identity (optional, for authenticated nodes)\n did?: string;\n // Public signing key for verification\n publicSigningKey?: JsonWebKey;\n // Public encryption key for E2E encryption\n publicEncryptionKey?: JsonWebKey;\n // Granted capabilities via UCAN\n grantedCapabilities?: string[];\n}\n\nexport interface SyncSession {\n id: string;\n initiatorId: string;\n participantIds: string[];\n status: 'pending' | 'active' | 'completed' | 'failed';\n startTime: string;\n endTime?: string;\n itemsSynced: number;\n itemsFailed: number;\n conflictsDetected: number;\n // Security fields for authenticated sessions\n initiatorDID?: string;\n participantDIDs?: string[];\n encryptionMode?: AeonEncryptionMode;\n requiredCapabilities?: string[];\n sessionToken?: string;\n}\n\nexport interface SyncEvent {\n type:\n | 'node-joined'\n | 'node-left'\n | 'sync-started'\n | 'sync-completed'\n | 'conflict-detected';\n sessionId?: string;\n nodeId: string;\n timestamp: string;\n data?: unknown;\n}\n\n/**\n * Sync Coordinator\n * Coordinates synchronization across distributed nodes\n */\nexport class SyncCoordinator extends EventEmitter {\n private static readonly MAX_SYNC_EVENTS = 10000;\n\n private nodes: Map<string, SyncNode> = new Map();\n private sessions: Map<string, SyncSession> = new Map();\n private syncEvents: SyncEvent[] = [];\n private nodeHeartbeats: Map<string, number> = new Map();\n private heartbeatInterval: ReturnType<typeof setInterval> | null = null;\n\n // Crypto support\n private cryptoProvider: ICryptoProvider | null = null;\n private nodesByDID: Map<string, string> = new Map(); // DID -> nodeId\n\n constructor() {\n super();\n }\n\n private addSyncEvent(event: SyncEvent): void {\n this.syncEvents.push(event);\n if (this.syncEvents.length > SyncCoordinator.MAX_SYNC_EVENTS) {\n this.syncEvents = this.syncEvents.slice(-SyncCoordinator.MAX_SYNC_EVENTS);\n }\n }\n\n /**\n * Configure cryptographic provider for authenticated sync\n */\n configureCrypto(provider: ICryptoProvider): void {\n this.cryptoProvider = provider;\n\n logger.debug('[SyncCoordinator] Crypto configured', {\n initialized: provider.isInitialized(),\n });\n }\n\n /**\n * Check if crypto is configured\n */\n isCryptoEnabled(): boolean {\n return this.cryptoProvider !== null && this.cryptoProvider.isInitialized();\n }\n\n /**\n * Register a node with DID-based identity\n */\n async registerAuthenticatedNode(\n nodeInfo: Omit<\n SyncNode,\n 'did' | 'publicSigningKey' | 'publicEncryptionKey'\n > & {\n did: string;\n publicSigningKey: JsonWebKey;\n publicEncryptionKey?: JsonWebKey;\n }\n ): Promise<SyncNode> {\n const node: SyncNode = {\n ...nodeInfo,\n };\n\n this.nodes.set(node.id, node);\n this.nodeHeartbeats.set(node.id, Date.now());\n this.nodesByDID.set(nodeInfo.did, node.id);\n\n // Register with crypto provider if available\n if (this.cryptoProvider) {\n await this.cryptoProvider.registerRemoteNode({\n id: node.id,\n did: nodeInfo.did,\n publicSigningKey: nodeInfo.publicSigningKey,\n publicEncryptionKey: nodeInfo.publicEncryptionKey,\n });\n }\n\n const event: SyncEvent = {\n type: 'node-joined',\n nodeId: node.id,\n timestamp: new Date().toISOString(),\n data: { did: nodeInfo.did, authenticated: true },\n };\n\n this.addSyncEvent(event);\n this.emit('node-joined', node);\n\n logger.debug('[SyncCoordinator] Authenticated node registered', {\n nodeId: node.id,\n did: nodeInfo.did,\n version: node.version,\n });\n\n return node;\n }\n\n /**\n * Get node by DID\n */\n getNodeByDID(did: string): SyncNode | undefined {\n const nodeId = this.nodesByDID.get(did);\n if (!nodeId) return undefined;\n return this.nodes.get(nodeId);\n }\n\n /**\n * Get all authenticated nodes (nodes with DIDs)\n */\n getAuthenticatedNodes(): SyncNode[] {\n return Array.from(this.nodes.values()).filter((n) => n.did);\n }\n\n /**\n * Create an authenticated sync session with UCAN-based authorization\n */\n async createAuthenticatedSyncSession(\n initiatorDID: string,\n participantDIDs: string[],\n options?: {\n encryptionMode?: AeonEncryptionMode;\n requiredCapabilities?: string[];\n }\n ): Promise<SyncSession> {\n // Find the initiator node by DID\n const initiatorNodeId = this.nodesByDID.get(initiatorDID);\n if (!initiatorNodeId) {\n throw new Error(`Initiator node with DID ${initiatorDID} not found`);\n }\n\n // Find participant node IDs\n const participantIds: string[] = [];\n for (const did of participantDIDs) {\n const nodeId = this.nodesByDID.get(did);\n if (nodeId) {\n participantIds.push(nodeId);\n }\n }\n\n // Create session token if crypto is available\n let sessionToken: string | undefined;\n if (this.cryptoProvider && this.cryptoProvider.isInitialized()) {\n // Create a UCAN that grants sync capabilities to all participants\n const capabilities = (\n options?.requiredCapabilities || ['aeon:sync:read', 'aeon:sync:write']\n ).map((cap) => ({ can: cap, with: '*' }));\n\n // Create token for the first participant (in production, you'd create one per participant)\n if (participantDIDs.length > 0) {\n sessionToken = await this.cryptoProvider.createUCAN(\n participantDIDs[0],\n capabilities,\n { expirationSeconds: 3600 } // 1 hour\n );\n }\n }\n\n const session: SyncSession = {\n id: `sync-${Date.now()}-${Math.random().toString(36).slice(2)}`,\n initiatorId: initiatorNodeId,\n participantIds,\n status: 'pending',\n startTime: new Date().toISOString(),\n itemsSynced: 0,\n itemsFailed: 0,\n conflictsDetected: 0,\n initiatorDID,\n participantDIDs,\n encryptionMode: options?.encryptionMode || 'none',\n requiredCapabilities: options?.requiredCapabilities,\n sessionToken,\n };\n\n this.sessions.set(session.id, session);\n\n const event: SyncEvent = {\n type: 'sync-started',\n sessionId: session.id,\n nodeId: initiatorNodeId,\n timestamp: new Date().toISOString(),\n data: {\n authenticated: true,\n initiatorDID,\n participantCount: participantDIDs.length,\n encryptionMode: session.encryptionMode,\n },\n };\n\n this.addSyncEvent(event);\n this.emit('sync-started', session);\n\n logger.debug('[SyncCoordinator] Authenticated sync session created', {\n sessionId: session.id,\n initiatorDID,\n participants: participantDIDs.length,\n encryptionMode: session.encryptionMode,\n });\n\n return session;\n }\n\n /**\n * Verify a node's UCAN capabilities for a session\n */\n async verifyNodeCapabilities(\n sessionId: string,\n nodeDID: string,\n token: string\n ): Promise<{ authorized: boolean; error?: string }> {\n if (!this.cryptoProvider) {\n return { authorized: true }; // No crypto, always authorized\n }\n\n const session = this.sessions.get(sessionId);\n if (!session) {\n return { authorized: false, error: `Session ${sessionId} not found` };\n }\n\n const result = await this.cryptoProvider.verifyUCAN(token, {\n requiredCapabilities: session.requiredCapabilities?.map((cap) => ({\n can: cap,\n with: '*',\n })),\n });\n\n if (!result.authorized) {\n logger.warn('[SyncCoordinator] Node capability verification failed', {\n sessionId,\n nodeDID,\n error: result.error,\n });\n }\n\n return result;\n }\n\n /**\n * Register a node in the cluster\n */\n registerNode(node: SyncNode): void {\n this.nodes.set(node.id, node);\n this.nodeHeartbeats.set(node.id, Date.now());\n\n const event: SyncEvent = {\n type: 'node-joined',\n nodeId: node.id,\n timestamp: new Date().toISOString(),\n };\n\n this.addSyncEvent(event);\n this.emit('node-joined', node);\n\n logger.debug('[SyncCoordinator] Node registered', {\n nodeId: node.id,\n address: node.address,\n version: node.version,\n });\n }\n\n /**\n * Deregister a node from the cluster\n */\n deregisterNode(nodeId: string): void {\n const node = this.nodes.get(nodeId);\n if (!node) {\n throw new Error(`Node ${nodeId} not found`);\n }\n\n this.nodes.delete(nodeId);\n this.nodeHeartbeats.delete(nodeId);\n\n const event: SyncEvent = {\n type: 'node-left',\n nodeId,\n timestamp: new Date().toISOString(),\n };\n\n this.addSyncEvent(event);\n this.emit('node-left', node);\n\n logger.debug('[SyncCoordinator] Node deregistered', { nodeId });\n }\n\n /**\n * Create a new sync session\n */\n createSyncSession(\n initiatorId: string,\n participantIds: string[]\n ): SyncSession {\n const node = this.nodes.get(initiatorId);\n if (!node) {\n throw new Error(`Initiator node ${initiatorId} not found`);\n }\n\n const session: SyncSession = {\n id: `sync-${Date.now()}-${Math.random().toString(36).slice(2)}`,\n initiatorId,\n participantIds,\n status: 'pending',\n startTime: new Date().toISOString(),\n itemsSynced: 0,\n itemsFailed: 0,\n conflictsDetected: 0,\n };\n\n this.sessions.set(session.id, session);\n\n const event: SyncEvent = {\n type: 'sync-started',\n sessionId: session.id,\n nodeId: initiatorId,\n timestamp: new Date().toISOString(),\n };\n\n this.addSyncEvent(event);\n this.emit('sync-started', session);\n\n logger.debug('[SyncCoordinator] Sync session created', {\n sessionId: session.id,\n initiator: initiatorId,\n participants: participantIds.length,\n });\n\n return session;\n }\n\n /**\n * Update sync session\n */\n updateSyncSession(sessionId: string, updates: Partial<SyncSession>): void {\n const session = this.sessions.get(sessionId);\n if (!session) {\n throw new Error(`Session ${sessionId} not found`);\n }\n\n Object.assign(session, updates);\n\n if (updates.status === 'completed' || updates.status === 'failed') {\n session.endTime = new Date().toISOString();\n\n const event: SyncEvent = {\n type: 'sync-completed',\n sessionId,\n nodeId: session.initiatorId,\n timestamp: new Date().toISOString(),\n data: { status: updates.status, itemsSynced: session.itemsSynced },\n };\n\n this.addSyncEvent(event);\n this.emit('sync-completed', session);\n }\n\n logger.debug('[SyncCoordinator] Sync session updated', {\n sessionId,\n status: session.status,\n itemsSynced: session.itemsSynced,\n });\n }\n\n /**\n * Record a conflict during sync\n */\n recordConflict(\n sessionId: string,\n nodeId: string,\n conflictData?: unknown\n ): void {\n const session = this.sessions.get(sessionId);\n if (session) {\n session.conflictsDetected++;\n\n const event: SyncEvent = {\n type: 'conflict-detected',\n sessionId,\n nodeId,\n timestamp: new Date().toISOString(),\n data: conflictData,\n };\n\n this.addSyncEvent(event);\n this.emit('conflict-detected', { session, nodeId, conflictData });\n\n logger.debug('[SyncCoordinator] Conflict recorded', {\n sessionId,\n nodeId,\n totalConflicts: session.conflictsDetected,\n });\n }\n }\n\n /**\n * Update node status\n */\n updateNodeStatus(nodeId: string, status: SyncNode['status']): void {\n const node = this.nodes.get(nodeId);\n if (!node) {\n throw new Error(`Node ${nodeId} not found`);\n }\n\n node.status = status;\n this.nodeHeartbeats.set(nodeId, Date.now());\n\n logger.debug('[SyncCoordinator] Node status updated', {\n nodeId,\n status,\n });\n }\n\n /**\n * Record heartbeat from node\n */\n recordHeartbeat(nodeId: string): void {\n const node = this.nodes.get(nodeId);\n if (!node) {\n return;\n }\n\n node.lastHeartbeat = new Date().toISOString();\n this.nodeHeartbeats.set(nodeId, Date.now());\n }\n\n /**\n * Get all nodes\n */\n getNodes(): SyncNode[] {\n return Array.from(this.nodes.values());\n }\n\n /**\n * Get node by ID\n */\n getNode(nodeId: string): SyncNode | undefined {\n return this.nodes.get(nodeId);\n }\n\n /**\n * Get online nodes\n */\n getOnlineNodes(): SyncNode[] {\n return Array.from(this.nodes.values()).filter((n) => n.status === 'online');\n }\n\n /**\n * Get nodes by capability\n */\n getNodesByCapability(capability: string): SyncNode[] {\n return Array.from(this.nodes.values()).filter((n) =>\n n.capabilities.includes(capability)\n );\n }\n\n /**\n * Get sync session\n */\n getSyncSession(sessionId: string): SyncSession | undefined {\n return this.sessions.get(sessionId);\n }\n\n /**\n * Get all sync sessions\n */\n getAllSyncSessions(): SyncSession[] {\n return Array.from(this.sessions.values());\n }\n\n /**\n * Get active sync sessions\n */\n getActiveSyncSessions(): SyncSession[] {\n return Array.from(this.sessions.values()).filter(\n (s) => s.status === 'active'\n );\n }\n\n /**\n * Get sessions for a node\n */\n getSessionsForNode(nodeId: string): SyncSession[] {\n return Array.from(this.sessions.values()).filter(\n (s) => s.initiatorId === nodeId || s.participantIds.includes(nodeId)\n );\n }\n\n /**\n * Get sync statistics\n */\n getStatistics() {\n const sessions = Array.from(this.sessions.values());\n const completed = sessions.filter((s) => s.status === 'completed').length;\n const failed = sessions.filter((s) => s.status === 'failed').length;\n const active = sessions.filter((s) => s.status === 'active').length;\n\n const totalItemsSynced = sessions.reduce(\n (sum, s) => sum + s.itemsSynced,\n 0\n );\n const totalConflicts = sessions.reduce(\n (sum, s) => sum + s.conflictsDetected,\n 0\n );\n\n return {\n totalNodes: this.nodes.size,\n onlineNodes: this.getOnlineNodes().length,\n offlineNodes: this.nodes.size - this.getOnlineNodes().length,\n totalSessions: sessions.length,\n activeSessions: active,\n completedSessions: completed,\n failedSessions: failed,\n successRate:\n sessions.length > 0 ? (completed / sessions.length) * 100 : 0,\n totalItemsSynced,\n totalConflicts,\n averageConflictsPerSession:\n sessions.length > 0 ? totalConflicts / sessions.length : 0,\n };\n }\n\n /**\n * Get sync events\n */\n getSyncEvents(limit?: number): SyncEvent[] {\n const events = [...this.syncEvents];\n if (limit) {\n return events.slice(-limit);\n }\n return events;\n }\n\n /**\n * Get sync events for session\n */\n getSessionEvents(sessionId: string): SyncEvent[] {\n return this.syncEvents.filter((e) => e.sessionId === sessionId);\n }\n\n /**\n * Check node health\n */\n getNodeHealth(): Record<string, { isHealthy: boolean; downtime: number }> {\n const health: Record<string, { isHealthy: boolean; downtime: number }> = {};\n\n for (const [nodeId, lastHeartbeat] of this.nodeHeartbeats) {\n const now = Date.now();\n const downtime = now - lastHeartbeat;\n const isHealthy = downtime < 30000; // 30 seconds threshold\n\n health[nodeId] = {\n isHealthy,\n downtime,\n };\n }\n\n return health;\n }\n\n /**\n * Start heartbeat monitoring\n */\n startHeartbeatMonitoring(interval: number = 5000): void {\n if (this.heartbeatInterval) {\n return;\n }\n\n this.heartbeatInterval = setInterval(() => {\n const health = this.getNodeHealth();\n\n for (const [nodeId, { isHealthy }] of Object.entries(health)) {\n const node = this.nodes.get(nodeId);\n if (!node) {\n continue;\n }\n\n const newStatus = isHealthy ? 'online' : 'offline';\n if (node.status !== newStatus) {\n this.updateNodeStatus(nodeId, newStatus);\n }\n }\n }, interval);\n\n logger.debug('[SyncCoordinator] Heartbeat monitoring started', {\n interval,\n });\n }\n\n /**\n * Stop heartbeat monitoring\n */\n stopHeartbeatMonitoring(): void {\n if (this.heartbeatInterval) {\n clearInterval(this.heartbeatInterval);\n this.heartbeatInterval = null;\n\n logger.debug('[SyncCoordinator] Heartbeat monitoring stopped');\n }\n }\n\n /**\n * Clear all state (for testing)\n */\n clear(): void {\n this.nodes.clear();\n this.sessions.clear();\n this.syncEvents = [];\n this.nodeHeartbeats.clear();\n this.nodesByDID.clear();\n this.cryptoProvider = null;\n this.stopHeartbeatMonitoring();\n }\n\n /**\n * Get the crypto provider (for advanced usage)\n */\n getCryptoProvider(): ICryptoProvider | null {\n return this.cryptoProvider;\n }\n}\n","/**\n * Replication Manager\n *\n * Manages data replication across multiple nodes.\n * Handles replication policies, consistency levels, and replica coordination.\n *\n * Features:\n * - Replica set management\n * - Replication policy enforcement\n * - Consistency level tracking\n * - Replication health monitoring\n * - Replica synchronization coordination\n * - End-to-end encryption for replicated data\n * - DID-based replica authentication\n */\n\nimport { logger } from '../utils/logger';\nimport type { ICryptoProvider } from '../crypto/CryptoProvider';\nimport type { AeonEncryptionMode } from '../crypto/types';\nimport type {\n PersistedEnvelope,\n PersistenceDeserializer,\n PersistenceSerializer,\n StorageAdapter,\n} from '../persistence';\n\nexport interface Replica {\n id: string;\n nodeId: string;\n status: 'primary' | 'secondary' | 'syncing' | 'failed';\n lastSyncTime: string;\n lagBytes: number;\n lagMillis: number;\n // DID-based identity for authenticated replicas\n did?: string;\n // Whether this replica uses encrypted data\n encrypted?: boolean;\n}\n\nexport interface ReplicationPolicy {\n id: string;\n name: string;\n replicationFactor: number;\n consistencyLevel: 'eventual' | 'read-after-write' | 'strong';\n syncInterval: number;\n maxReplicationLag: number;\n // Encryption settings for this policy\n encryptionMode?: AeonEncryptionMode;\n // Required capabilities for replicas\n requiredCapabilities?: string[];\n}\n\nexport interface ReplicationEvent {\n type: 'replica-added' | 'replica-removed' | 'replica-synced' | 'sync-failed';\n replicaId: string;\n nodeId: string;\n timestamp: string;\n details?: unknown;\n}\n\n/**\n * Encrypted replication data envelope\n */\nexport interface EncryptedReplicationData {\n /** Encrypted ciphertext (base64) */\n ct: string;\n /** Initialization vector (base64) */\n iv: string;\n /** Authentication tag (base64) */\n tag: string;\n /** Ephemeral public key for ECIES */\n epk?: JsonWebKey;\n /** Sender DID */\n senderDID?: string;\n /** Target replica DID */\n targetDID?: string;\n /** Encryption timestamp */\n encryptedAt: number;\n}\n\nexport interface ReplicationPersistenceData {\n replicas: Replica[];\n policies: ReplicationPolicy[];\n syncStatus: Array<{ nodeId: string; synced: number; failed: number }>;\n}\n\nexport interface ReplicationPersistenceConfig {\n adapter: StorageAdapter;\n key?: string;\n autoPersist?: boolean;\n autoLoad?: boolean;\n persistDebounceMs?: number;\n serializer?: PersistenceSerializer<ReplicationPersistenceData>;\n deserializer?: PersistenceDeserializer<ReplicationPersistenceData>;\n}\n\nexport interface ReplicationManagerOptions {\n persistence?: ReplicationPersistenceConfig;\n}\n\n/**\n * Replication Manager\n * Manages data replication across distributed nodes\n */\nexport class ReplicationManager {\n private static readonly DEFAULT_PERSIST_KEY = 'aeon:replication-state:v1';\n private replicas: Map<string, Replica> = new Map();\n private policies: Map<string, ReplicationPolicy> = new Map();\n private replicationEvents: ReplicationEvent[] = [];\n private syncStatus: Map<string, { synced: number; failed: number }> =\n new Map();\n\n // Crypto support\n private cryptoProvider: ICryptoProvider | null = null;\n private replicasByDID: Map<string, string> = new Map(); // DID -> replicaId\n private persistence: (ReplicationPersistenceConfig & { key: string }) | null =\n null;\n private persistTimer: ReturnType<typeof setTimeout> | null = null;\n private persistInFlight = false;\n private persistPending = false;\n\n constructor(options?: ReplicationManagerOptions) {\n if (options?.persistence) {\n this.persistence = {\n ...options.persistence,\n key: options.persistence.key ?? ReplicationManager.DEFAULT_PERSIST_KEY,\n autoPersist: options.persistence.autoPersist ?? true,\n autoLoad: options.persistence.autoLoad ?? false,\n persistDebounceMs: options.persistence.persistDebounceMs ?? 25,\n };\n }\n\n if (this.persistence?.autoLoad) {\n void this.loadFromPersistence().catch((error) => {\n logger.error('[ReplicationManager] Failed to load persistence', {\n key: this.persistence?.key,\n error: error instanceof Error ? error.message : String(error),\n });\n });\n }\n }\n\n /**\n * Configure cryptographic provider for encrypted replication\n */\n configureCrypto(provider: ICryptoProvider): void {\n this.cryptoProvider = provider;\n\n logger.debug('[ReplicationManager] Crypto configured', {\n initialized: provider.isInitialized(),\n });\n }\n\n /**\n * Check if crypto is configured\n */\n isCryptoEnabled(): boolean {\n return this.cryptoProvider !== null && this.cryptoProvider.isInitialized();\n }\n\n /**\n * Register an authenticated replica with DID\n */\n async registerAuthenticatedReplica(\n replica: Omit<Replica, 'did' | 'encrypted'> & {\n did: string;\n publicSigningKey?: JsonWebKey;\n publicEncryptionKey?: JsonWebKey;\n },\n encrypted = false\n ): Promise<Replica> {\n const authenticatedReplica: Replica = {\n ...replica,\n encrypted,\n };\n\n this.replicas.set(replica.id, authenticatedReplica);\n this.replicasByDID.set(replica.did, replica.id);\n\n if (!this.syncStatus.has(replica.nodeId)) {\n this.syncStatus.set(replica.nodeId, { synced: 0, failed: 0 });\n }\n\n // Register with crypto provider if keys provided\n if (this.cryptoProvider && replica.publicSigningKey) {\n await this.cryptoProvider.registerRemoteNode({\n id: replica.nodeId,\n did: replica.did,\n publicSigningKey: replica.publicSigningKey,\n publicEncryptionKey: replica.publicEncryptionKey,\n });\n }\n\n const event: ReplicationEvent = {\n type: 'replica-added',\n replicaId: replica.id,\n nodeId: replica.nodeId,\n timestamp: new Date().toISOString(),\n details: { did: replica.did, encrypted, authenticated: true },\n };\n\n this.replicationEvents.push(event);\n this.schedulePersist();\n\n logger.debug('[ReplicationManager] Authenticated replica registered', {\n replicaId: replica.id,\n did: replica.did,\n encrypted,\n });\n\n return authenticatedReplica;\n }\n\n /**\n * Get replica by DID\n */\n getReplicaByDID(did: string): Replica | undefined {\n const replicaId = this.replicasByDID.get(did);\n if (!replicaId) return undefined;\n return this.replicas.get(replicaId);\n }\n\n /**\n * Get all encrypted replicas\n */\n getEncryptedReplicas(): Replica[] {\n return Array.from(this.replicas.values()).filter((r) => r.encrypted);\n }\n\n /**\n * Encrypt data for replication to a specific replica\n */\n async encryptForReplica(\n data: unknown,\n targetReplicaDID: string\n ): Promise<EncryptedReplicationData> {\n if (!this.cryptoProvider || !this.cryptoProvider.isInitialized()) {\n throw new Error('Crypto provider not initialized');\n }\n\n const dataBytes = new TextEncoder().encode(JSON.stringify(data));\n const encrypted = await this.cryptoProvider.encrypt(\n dataBytes,\n targetReplicaDID\n );\n\n const localDID = this.cryptoProvider.getLocalDID();\n\n return {\n ct: encrypted.ct,\n iv: encrypted.iv,\n tag: encrypted.tag,\n epk: encrypted.epk,\n senderDID: localDID || undefined,\n targetDID: targetReplicaDID,\n encryptedAt: encrypted.encryptedAt,\n };\n }\n\n /**\n * Decrypt data received from replication\n */\n async decryptReplicationData<T>(\n encrypted: EncryptedReplicationData\n ): Promise<T> {\n if (!this.cryptoProvider || !this.cryptoProvider.isInitialized()) {\n throw new Error('Crypto provider not initialized');\n }\n\n const decrypted = await this.cryptoProvider.decrypt(\n {\n alg: 'ECIES-P256',\n ct: encrypted.ct,\n iv: encrypted.iv,\n tag: encrypted.tag,\n epk: encrypted.epk,\n },\n encrypted.senderDID\n );\n\n return JSON.parse(new TextDecoder().decode(decrypted)) as T;\n }\n\n /**\n * Create an encrypted replication policy\n */\n createEncryptedPolicy(\n name: string,\n replicationFactor: number,\n consistencyLevel: 'eventual' | 'read-after-write' | 'strong',\n encryptionMode: AeonEncryptionMode,\n options?: {\n syncInterval?: number;\n maxReplicationLag?: number;\n requiredCapabilities?: string[];\n }\n ): ReplicationPolicy {\n const policy: ReplicationPolicy = {\n id: `policy-${Date.now()}-${Math.random().toString(36).slice(2)}`,\n name,\n replicationFactor,\n consistencyLevel,\n syncInterval: options?.syncInterval || 1000,\n maxReplicationLag: options?.maxReplicationLag || 10000,\n encryptionMode,\n requiredCapabilities: options?.requiredCapabilities,\n };\n\n this.policies.set(policy.id, policy);\n\n logger.debug('[ReplicationManager] Encrypted policy created', {\n policyId: policy.id,\n name,\n replicationFactor,\n encryptionMode,\n });\n\n return policy;\n }\n\n /**\n * Verify a replica's capabilities via UCAN\n */\n async verifyReplicaCapabilities(\n replicaDID: string,\n token: string,\n policyId?: string\n ): Promise<{ authorized: boolean; error?: string }> {\n if (!this.cryptoProvider) {\n return { authorized: true }; // No crypto, always authorized\n }\n\n const policy = policyId ? this.policies.get(policyId) : undefined;\n\n const result = await this.cryptoProvider.verifyUCAN(token, {\n requiredCapabilities: policy?.requiredCapabilities?.map((cap) => ({\n can: cap,\n with: '*',\n })),\n });\n\n if (!result.authorized) {\n logger.warn(\n '[ReplicationManager] Replica capability verification failed',\n {\n replicaDID,\n error: result.error,\n }\n );\n }\n\n return result;\n }\n\n /**\n * Register a replica\n */\n registerReplica(replica: Replica): void {\n this.replicas.set(replica.id, replica);\n\n if (!this.syncStatus.has(replica.nodeId)) {\n this.syncStatus.set(replica.nodeId, { synced: 0, failed: 0 });\n }\n\n const event: ReplicationEvent = {\n type: 'replica-added',\n replicaId: replica.id,\n nodeId: replica.nodeId,\n timestamp: new Date().toISOString(),\n };\n\n this.replicationEvents.push(event);\n this.schedulePersist();\n\n logger.debug('[ReplicationManager] Replica registered', {\n replicaId: replica.id,\n nodeId: replica.nodeId,\n status: replica.status,\n });\n }\n\n /**\n * Remove a replica\n */\n removeReplica(replicaId: string): void {\n const replica = this.replicas.get(replicaId);\n if (!replica) {\n throw new Error(`Replica ${replicaId} not found`);\n }\n\n this.replicas.delete(replicaId);\n\n const event: ReplicationEvent = {\n type: 'replica-removed',\n replicaId,\n nodeId: replica.nodeId,\n timestamp: new Date().toISOString(),\n };\n\n this.replicationEvents.push(event);\n this.schedulePersist();\n\n logger.debug('[ReplicationManager] Replica removed', { replicaId });\n }\n\n /**\n * Create a replication policy\n */\n createPolicy(\n name: string,\n replicationFactor: number,\n consistencyLevel: 'eventual' | 'read-after-write' | 'strong',\n syncInterval = 1000,\n maxReplicationLag = 10000\n ): ReplicationPolicy {\n const policy: ReplicationPolicy = {\n id: `policy-${Date.now()}-${Math.random().toString(36).slice(2)}`,\n name,\n replicationFactor,\n consistencyLevel,\n syncInterval,\n maxReplicationLag,\n };\n\n this.policies.set(policy.id, policy);\n this.schedulePersist();\n\n logger.debug('[ReplicationManager] Policy created', {\n policyId: policy.id,\n name,\n replicationFactor,\n consistencyLevel,\n });\n\n return policy;\n }\n\n /**\n * Update replica status\n */\n updateReplicaStatus(\n replicaId: string,\n status: Replica['status'],\n lagBytes = 0,\n lagMillis = 0\n ): void {\n const replica = this.replicas.get(replicaId);\n if (!replica) {\n throw new Error(`Replica ${replicaId} not found`);\n }\n\n replica.status = status;\n replica.lagBytes = lagBytes;\n replica.lagMillis = lagMillis;\n replica.lastSyncTime = new Date().toISOString();\n\n const event: ReplicationEvent = {\n type: status === 'syncing' ? 'replica-synced' : 'sync-failed',\n replicaId,\n nodeId: replica.nodeId,\n timestamp: new Date().toISOString(),\n details: { status, lagBytes, lagMillis },\n };\n\n this.replicationEvents.push(event);\n\n const syncStatus = this.syncStatus.get(replica.nodeId);\n if (syncStatus) {\n if (status === 'syncing' || status === 'secondary') {\n syncStatus.synced++;\n } else if (status === 'failed') {\n syncStatus.failed++;\n }\n }\n\n logger.debug('[ReplicationManager] Replica status updated', {\n replicaId,\n status,\n lagBytes,\n lagMillis,\n });\n\n this.schedulePersist();\n }\n\n /**\n * Get replicas for node\n */\n getReplicasForNode(nodeId: string): Replica[] {\n return Array.from(this.replicas.values()).filter(\n (r) => r.nodeId === nodeId\n );\n }\n\n /**\n * Get healthy replicas\n */\n getHealthyReplicas(): Replica[] {\n return Array.from(this.replicas.values()).filter(\n (r) => r.status === 'secondary' || r.status === 'primary'\n );\n }\n\n /**\n * Get syncing replicas\n */\n getSyncingReplicas(): Replica[] {\n return Array.from(this.replicas.values()).filter(\n (r) => r.status === 'syncing'\n );\n }\n\n /**\n * Get failed replicas\n */\n getFailedReplicas(): Replica[] {\n return Array.from(this.replicas.values()).filter(\n (r) => r.status === 'failed'\n );\n }\n\n /**\n * Check replication health for policy\n */\n checkReplicationHealth(policyId: string): {\n healthy: boolean;\n replicasInPolicy: number;\n healthyReplicas: number;\n replicationLag: number;\n } {\n const policy = this.policies.get(policyId);\n if (!policy) {\n throw new Error(`Policy ${policyId} not found`);\n }\n\n const healthy = this.getHealthyReplicas();\n const maxLag = Math.max(0, ...healthy.map((r) => r.lagMillis));\n\n return {\n healthy:\n healthy.length >= policy.replicationFactor &&\n maxLag <= policy.maxReplicationLag,\n replicasInPolicy: policy.replicationFactor,\n healthyReplicas: healthy.length,\n replicationLag: maxLag,\n };\n }\n\n /**\n * Get consistency level\n */\n getConsistencyLevel(\n policyId: string\n ): 'eventual' | 'read-after-write' | 'strong' {\n const policy = this.policies.get(policyId);\n if (!policy) {\n return 'eventual';\n }\n\n return policy.consistencyLevel;\n }\n\n /**\n * Get replica\n */\n getReplica(replicaId: string): Replica | undefined {\n return this.replicas.get(replicaId);\n }\n\n /**\n * Get all replicas\n */\n getAllReplicas(): Replica[] {\n return Array.from(this.replicas.values());\n }\n\n /**\n * Get policy\n */\n getPolicy(policyId: string): ReplicationPolicy | undefined {\n return this.policies.get(policyId);\n }\n\n /**\n * Get all policies\n */\n getAllPolicies(): ReplicationPolicy[] {\n return Array.from(this.policies.values());\n }\n\n /**\n * Get replication statistics\n */\n getStatistics() {\n const healthy = this.getHealthyReplicas().length;\n const syncing = this.getSyncingReplicas().length;\n const failed = this.getFailedReplicas().length;\n const total = this.replicas.size;\n\n const replicationLags = Array.from(this.replicas.values()).map(\n (r) => r.lagMillis\n );\n const avgLag =\n replicationLags.length > 0\n ? replicationLags.reduce((a, b) => a + b) / replicationLags.length\n : 0;\n const maxLag =\n replicationLags.length > 0 ? Math.max(...replicationLags) : 0;\n\n return {\n totalReplicas: total,\n healthyReplicas: healthy,\n syncingReplicas: syncing,\n failedReplicas: failed,\n healthiness: total > 0 ? (healthy / total) * 100 : 0,\n averageReplicationLagMs: avgLag,\n maxReplicationLagMs: maxLag,\n totalPolicies: this.policies.size,\n };\n }\n\n /**\n * Get replication events\n */\n getReplicationEvents(limit?: number): ReplicationEvent[] {\n const events = [...this.replicationEvents];\n if (limit) {\n return events.slice(-limit);\n }\n return events;\n }\n\n /**\n * Get sync status for node\n */\n getSyncStatus(nodeId: string): { synced: number; failed: number } {\n return this.syncStatus.get(nodeId) || { synced: 0, failed: 0 };\n }\n\n /**\n * Get replication lag distribution\n */\n getReplicationLagDistribution(): Record<string, number> {\n const distribution: Record<string, number> = {\n '0-100ms': 0,\n '100-500ms': 0,\n '500-1000ms': 0,\n '1000+ms': 0,\n };\n\n for (const replica of this.replicas.values()) {\n if (replica.lagMillis <= 100) {\n distribution['0-100ms']++;\n } else if (replica.lagMillis <= 500) {\n distribution['100-500ms']++;\n } else if (replica.lagMillis <= 1000) {\n distribution['500-1000ms']++;\n } else {\n distribution['1000+ms']++;\n }\n }\n\n return distribution;\n }\n\n /**\n * Check if can satisfy consistency level\n */\n canSatisfyConsistency(policyId: string, _requiredAcks: number): boolean {\n const policy = this.policies.get(policyId);\n if (!policy) {\n return false;\n }\n\n const healthyCount = this.getHealthyReplicas().length;\n\n switch (policy.consistencyLevel) {\n case 'eventual':\n return true; // Always achievable\n case 'read-after-write':\n return healthyCount >= 1;\n case 'strong':\n return healthyCount >= policy.replicationFactor;\n default:\n return false;\n }\n }\n\n /**\n * Persist current replication state snapshot.\n */\n async saveToPersistence(): Promise<void> {\n if (!this.persistence) {\n return;\n }\n\n const data: ReplicationPersistenceData = {\n replicas: this.getAllReplicas(),\n policies: this.getAllPolicies(),\n syncStatus: Array.from(this.syncStatus.entries()).map(\n ([nodeId, state]) => ({\n nodeId,\n synced: state.synced,\n failed: state.failed,\n })\n ),\n };\n\n const envelope: PersistedEnvelope<ReplicationPersistenceData> = {\n version: 1,\n updatedAt: Date.now(),\n data,\n };\n\n const serialize =\n this.persistence.serializer ??\n ((value: PersistedEnvelope<ReplicationPersistenceData>) =>\n JSON.stringify(value));\n\n await this.persistence.adapter.setItem(\n this.persistence.key,\n serialize(envelope)\n );\n }\n\n /**\n * Load replication snapshot from persistence.\n */\n async loadFromPersistence(): Promise<{\n replicas: number;\n policies: number;\n syncStatus: number;\n }> {\n if (!this.persistence) {\n return { replicas: 0, policies: 0, syncStatus: 0 };\n }\n\n const raw = await this.persistence.adapter.getItem(this.persistence.key);\n if (!raw) {\n return { replicas: 0, policies: 0, syncStatus: 0 };\n }\n\n const deserialize =\n this.persistence.deserializer ??\n ((value: string) =>\n JSON.parse(value) as PersistedEnvelope<ReplicationPersistenceData>);\n\n const envelope = deserialize(raw);\n if (envelope.version !== 1 || !envelope.data) {\n throw new Error('Invalid replication persistence payload');\n }\n if (\n !Array.isArray(envelope.data.replicas) ||\n !Array.isArray(envelope.data.policies) ||\n !Array.isArray(envelope.data.syncStatus)\n ) {\n throw new Error('Invalid replication persistence structure');\n }\n\n this.replicas.clear();\n this.policies.clear();\n this.syncStatus.clear();\n this.replicasByDID.clear();\n\n let importedReplicas = 0;\n for (const replica of envelope.data.replicas) {\n if (this.isValidReplica(replica)) {\n this.replicas.set(replica.id, replica);\n if (replica.did) {\n this.replicasByDID.set(replica.did, replica.id);\n }\n importedReplicas++;\n }\n }\n\n let importedPolicies = 0;\n for (const policy of envelope.data.policies) {\n if (this.isValidPolicy(policy)) {\n this.policies.set(policy.id, policy);\n importedPolicies++;\n }\n }\n\n let importedSyncStatus = 0;\n for (const status of envelope.data.syncStatus) {\n if (\n typeof status.nodeId === 'string' &&\n typeof status.synced === 'number' &&\n typeof status.failed === 'number'\n ) {\n this.syncStatus.set(status.nodeId, {\n synced: status.synced,\n failed: status.failed,\n });\n importedSyncStatus++;\n }\n }\n\n logger.debug('[ReplicationManager] Loaded from persistence', {\n key: this.persistence.key,\n replicas: importedReplicas,\n policies: importedPolicies,\n syncStatus: importedSyncStatus,\n });\n\n return {\n replicas: importedReplicas,\n policies: importedPolicies,\n syncStatus: importedSyncStatus,\n };\n }\n\n /**\n * Remove persisted replication snapshot.\n */\n async clearPersistence(): Promise<void> {\n if (!this.persistence) {\n return;\n }\n await this.persistence.adapter.removeItem(this.persistence.key);\n }\n\n private schedulePersist(): void {\n if (!this.persistence || this.persistence.autoPersist === false) {\n return;\n }\n\n if (this.persistTimer) {\n clearTimeout(this.persistTimer);\n }\n\n this.persistTimer = setTimeout(() => {\n void this.persistSafely();\n }, this.persistence.persistDebounceMs ?? 25);\n }\n\n private async persistSafely(): Promise<void> {\n if (!this.persistence) {\n return;\n }\n\n if (this.persistInFlight) {\n this.persistPending = true;\n return;\n }\n\n this.persistInFlight = true;\n try {\n await this.saveToPersistence();\n } catch (error) {\n logger.error('[ReplicationManager] Persistence write failed', {\n key: this.persistence.key,\n error: error instanceof Error ? error.message : String(error),\n });\n } finally {\n this.persistInFlight = false;\n const shouldRunAgain = this.persistPending;\n this.persistPending = false;\n if (shouldRunAgain) {\n void this.persistSafely();\n }\n }\n }\n\n private isValidReplica(value: unknown): value is Replica {\n if (typeof value !== 'object' || value === null) {\n return false;\n }\n const candidate = value as Partial<Replica>;\n const validStatus =\n candidate.status === 'primary' ||\n candidate.status === 'secondary' ||\n candidate.status === 'syncing' ||\n candidate.status === 'failed';\n\n return (\n typeof candidate.id === 'string' &&\n typeof candidate.nodeId === 'string' &&\n validStatus &&\n typeof candidate.lastSyncTime === 'string' &&\n typeof candidate.lagBytes === 'number' &&\n typeof candidate.lagMillis === 'number'\n );\n }\n\n private isValidPolicy(value: unknown): value is ReplicationPolicy {\n if (typeof value !== 'object' || value === null) {\n return false;\n }\n\n const candidate = value as Partial<ReplicationPolicy>;\n const validConsistency =\n candidate.consistencyLevel === 'eventual' ||\n candidate.consistencyLevel === 'read-after-write' ||\n candidate.consistencyLevel === 'strong';\n\n return (\n typeof candidate.id === 'string' &&\n typeof candidate.name === 'string' &&\n typeof candidate.replicationFactor === 'number' &&\n validConsistency &&\n typeof candidate.syncInterval === 'number' &&\n typeof candidate.maxReplicationLag === 'number'\n );\n }\n\n /**\n * Clear all state (for testing)\n */\n clear(): void {\n this.replicas.clear();\n this.policies.clear();\n this.replicationEvents = [];\n this.syncStatus.clear();\n this.replicasByDID.clear();\n this.cryptoProvider = null;\n this.schedulePersist();\n }\n\n /**\n * Get the crypto provider (for advanced usage)\n */\n getCryptoProvider(): ICryptoProvider | null {\n return this.cryptoProvider;\n }\n}\n","/**\n * Sync Protocol\n *\n * Handles synchronization protocol messages and handshaking.\n * Manages message serialization, protocol versioning, and compatibility.\n *\n * Features:\n * - Message serialization and deserialization\n * - Protocol version management\n * - Handshake handling\n * - Message validation and error handling\n * - Protocol state machine\n * - Optional cryptographic authentication and encryption\n */\n\nimport { logger } from '../utils/logger';\nimport type { ICryptoProvider } from '../crypto/CryptoProvider';\nimport type {\n AeonEncryptionMode,\n AuthenticatedMessageFields,\n} from '../crypto/types';\nimport type {\n PersistedEnvelope,\n PersistenceDeserializer,\n PersistenceSerializer,\n StorageAdapter,\n} from '../persistence';\n\nexport interface SyncMessage {\n type: 'handshake' | 'sync-request' | 'sync-response' | 'ack' | 'error';\n version: string;\n sender: string;\n receiver: string;\n messageId: string;\n timestamp: string;\n payload?: unknown;\n // Authentication fields (populated when crypto is configured)\n auth?: AuthenticatedMessageFields;\n}\n\nexport interface Handshake {\n protocolVersion: string;\n nodeId: string;\n capabilities: string[];\n state: 'initiating' | 'responding' | 'completed';\n // DID for authenticated handshakes\n did?: string;\n // Public signing key (JWK)\n publicSigningKey?: JsonWebKey;\n // Public encryption key (JWK)\n publicEncryptionKey?: JsonWebKey;\n // UCAN token for capability verification\n ucan?: string;\n}\n\n/**\n * Crypto configuration for sync protocol\n */\nexport interface SyncProtocolCryptoConfig {\n /** Encryption mode for messages */\n encryptionMode: AeonEncryptionMode;\n /** Require all messages to be signed */\n requireSignatures: boolean;\n /** Require UCAN capability verification */\n requireCapabilities: boolean;\n /** Required capabilities for sync operations */\n requiredCapabilities?: Array<{ can: string; with: string }>;\n}\n\nexport interface SyncRequest {\n sessionId: string;\n fromVersion: string;\n toVersion: string;\n filter?: Record<string, unknown>;\n}\n\nexport interface SyncResponse {\n sessionId: string;\n fromVersion: string;\n toVersion: string;\n data: unknown[];\n hasMore: boolean;\n offset: number;\n}\n\nexport interface ProtocolError {\n code: string;\n message: string;\n recoverable: boolean;\n}\n\nexport interface SyncProtocolPersistenceData {\n protocolVersion: string;\n messageCounter: number;\n messageQueue: SyncMessage[];\n handshakes: Array<{ nodeId: string; handshake: Handshake }>;\n protocolErrors: Array<{ error: ProtocolError; timestamp: string }>;\n}\n\nexport interface SyncProtocolPersistenceConfig {\n adapter: StorageAdapter;\n key?: string;\n autoPersist?: boolean;\n autoLoad?: boolean;\n persistDebounceMs?: number;\n serializer?: PersistenceSerializer<SyncProtocolPersistenceData>;\n deserializer?: PersistenceDeserializer<SyncProtocolPersistenceData>;\n}\n\nexport interface SyncProtocolOptions {\n persistence?: SyncProtocolPersistenceConfig;\n}\n\n/**\n * Sync Protocol\n * Handles synchronization protocol messages and handshaking\n */\nexport class SyncProtocol {\n private static readonly DEFAULT_PERSIST_KEY = 'aeon:sync-protocol:v1';\n private version = '1.0.0';\n private messageQueue: SyncMessage[] = [];\n private messageMap: Map<string, SyncMessage> = new Map();\n private handshakes: Map<string, Handshake> = new Map();\n private protocolErrors: Array<{ error: ProtocolError; timestamp: string }> =\n [];\n private messageCounter = 0;\n\n // Crypto support\n private cryptoProvider: ICryptoProvider | null = null;\n private cryptoConfig: SyncProtocolCryptoConfig | null = null;\n private persistence:\n | (SyncProtocolPersistenceConfig & { key: string })\n | null = null;\n private persistTimer: ReturnType<typeof setTimeout> | null = null;\n private persistInFlight = false;\n private persistPending = false;\n\n constructor(options?: SyncProtocolOptions) {\n if (options?.persistence) {\n this.persistence = {\n ...options.persistence,\n key: options.persistence.key ?? SyncProtocol.DEFAULT_PERSIST_KEY,\n autoPersist: options.persistence.autoPersist ?? true,\n autoLoad: options.persistence.autoLoad ?? false,\n persistDebounceMs: options.persistence.persistDebounceMs ?? 25,\n };\n }\n\n if (this.persistence?.autoLoad) {\n void this.loadFromPersistence().catch((error) => {\n logger.error('[SyncProtocol] Failed to load persistence', {\n key: this.persistence?.key,\n error: error instanceof Error ? error.message : String(error),\n });\n });\n }\n }\n\n /**\n * Configure cryptographic provider for authenticated/encrypted messages\n */\n configureCrypto(\n provider: ICryptoProvider,\n config?: Partial<SyncProtocolCryptoConfig>\n ): void {\n this.cryptoProvider = provider;\n this.cryptoConfig = {\n encryptionMode: config?.encryptionMode ?? 'none',\n requireSignatures: config?.requireSignatures ?? false,\n requireCapabilities: config?.requireCapabilities ?? false,\n requiredCapabilities: config?.requiredCapabilities,\n };\n\n logger.debug('[SyncProtocol] Crypto configured', {\n encryptionMode: this.cryptoConfig.encryptionMode,\n requireSignatures: this.cryptoConfig.requireSignatures,\n requireCapabilities: this.cryptoConfig.requireCapabilities,\n });\n }\n\n /**\n * Check if crypto is configured\n */\n isCryptoEnabled(): boolean {\n return this.cryptoProvider !== null && this.cryptoProvider.isInitialized();\n }\n\n /**\n * Get crypto configuration\n */\n getCryptoConfig(): SyncProtocolCryptoConfig | null {\n return this.cryptoConfig ? { ...this.cryptoConfig } : null;\n }\n\n /**\n * Get protocol version\n */\n getVersion(): string {\n return this.version;\n }\n\n /**\n * Create authenticated handshake message with DID and keys\n */\n async createAuthenticatedHandshake(\n capabilities: string[],\n targetDID?: string\n ): Promise<SyncMessage> {\n if (!this.cryptoProvider || !this.cryptoProvider.isInitialized()) {\n throw new Error('Crypto provider not initialized');\n }\n\n const localDID = this.cryptoProvider.getLocalDID();\n if (!localDID) {\n throw new Error('Local DID not available');\n }\n\n const publicInfo = await this.cryptoProvider.exportPublicIdentity();\n if (!publicInfo) {\n throw new Error('Cannot export public identity');\n }\n\n // Create UCAN if target DID is specified and capabilities are required\n let ucan: string | undefined;\n if (targetDID && this.cryptoConfig?.requireCapabilities) {\n const caps = this.cryptoConfig.requiredCapabilities || [\n { can: 'aeon:sync:read', with: '*' },\n { can: 'aeon:sync:write', with: '*' },\n ];\n ucan = await this.cryptoProvider.createUCAN(targetDID, caps);\n }\n\n const handshakePayload: Handshake = {\n protocolVersion: this.version,\n nodeId: localDID,\n capabilities,\n state: 'initiating',\n did: localDID,\n publicSigningKey: publicInfo.publicSigningKey,\n publicEncryptionKey: publicInfo.publicEncryptionKey,\n ucan,\n };\n\n const message: SyncMessage = {\n type: 'handshake',\n version: this.version,\n sender: localDID,\n receiver: targetDID || '',\n messageId: this.generateMessageId(),\n timestamp: new Date().toISOString(),\n payload: handshakePayload,\n };\n\n // Sign the message if signatures are required\n if (this.cryptoConfig?.requireSignatures) {\n const signed = await this.cryptoProvider.signData(handshakePayload);\n message.auth = {\n senderDID: localDID,\n receiverDID: targetDID,\n signature: signed.signature,\n };\n }\n\n this.messageMap.set(message.messageId, message);\n this.messageQueue.push(message);\n this.schedulePersist();\n\n logger.debug('[SyncProtocol] Authenticated handshake created', {\n messageId: message.messageId,\n did: localDID,\n capabilities: capabilities.length,\n hasUCAN: !!ucan,\n });\n\n return message;\n }\n\n /**\n * Verify and process an authenticated handshake\n */\n async verifyAuthenticatedHandshake(\n message: SyncMessage\n ): Promise<{ valid: boolean; handshake?: Handshake; error?: string }> {\n if (message.type !== 'handshake') {\n return { valid: false, error: 'Message is not a handshake' };\n }\n\n const handshake = message.payload as Handshake;\n\n // If crypto is not configured, just process normally\n if (!this.cryptoProvider || !this.cryptoConfig) {\n this.handshakes.set(message.sender, handshake);\n this.schedulePersist();\n return { valid: true, handshake };\n }\n\n // Register the remote node if we have their keys\n if (handshake.did && handshake.publicSigningKey) {\n await this.cryptoProvider.registerRemoteNode({\n id: handshake.nodeId,\n did: handshake.did,\n publicSigningKey: handshake.publicSigningKey,\n publicEncryptionKey: handshake.publicEncryptionKey,\n });\n }\n\n // Verify signature if required\n if (this.cryptoConfig.requireSignatures && message.auth?.signature) {\n const signed = {\n payload: handshake,\n signature: message.auth.signature,\n signer: message.auth.senderDID || message.sender,\n algorithm: 'ES256',\n signedAt: Date.now(),\n };\n\n const isValid = await this.cryptoProvider.verifySignedData(signed);\n if (!isValid) {\n logger.warn('[SyncProtocol] Handshake signature verification failed', {\n messageId: message.messageId,\n sender: message.sender,\n });\n return { valid: false, error: 'Invalid signature' };\n }\n }\n\n // Verify UCAN if required\n if (this.cryptoConfig.requireCapabilities && handshake.ucan) {\n const localDID = this.cryptoProvider.getLocalDID();\n const result = await this.cryptoProvider.verifyUCAN(handshake.ucan, {\n expectedAudience: localDID || undefined,\n requiredCapabilities: this.cryptoConfig.requiredCapabilities,\n });\n\n if (!result.authorized) {\n logger.warn('[SyncProtocol] Handshake UCAN verification failed', {\n messageId: message.messageId,\n error: result.error,\n });\n return { valid: false, error: result.error || 'Unauthorized' };\n }\n }\n\n this.handshakes.set(message.sender, handshake);\n this.schedulePersist();\n\n logger.debug('[SyncProtocol] Authenticated handshake verified', {\n messageId: message.messageId,\n did: handshake.did,\n });\n\n return { valid: true, handshake };\n }\n\n /**\n * Sign and optionally encrypt a message payload\n */\n async signMessage<T>(\n message: SyncMessage,\n payload: T,\n encrypt = false\n ): Promise<SyncMessage> {\n if (!this.cryptoProvider || !this.cryptoProvider.isInitialized()) {\n throw new Error('Crypto provider not initialized');\n }\n\n const localDID = this.cryptoProvider.getLocalDID();\n\n // Sign the payload\n const signed = await this.cryptoProvider.signData(payload);\n\n message.auth = {\n senderDID: localDID || undefined,\n receiverDID: message.receiver || undefined,\n signature: signed.signature,\n encrypted: false,\n };\n\n // Encrypt if requested and we have a recipient\n if (\n encrypt &&\n message.receiver &&\n this.cryptoConfig?.encryptionMode !== 'none'\n ) {\n const payloadBytes = new TextEncoder().encode(JSON.stringify(payload));\n const encrypted = await this.cryptoProvider.encrypt(\n payloadBytes,\n message.receiver\n );\n\n message.payload = encrypted;\n message.auth.encrypted = true;\n\n logger.debug('[SyncProtocol] Message encrypted', {\n messageId: message.messageId,\n recipient: message.receiver,\n });\n } else {\n message.payload = payload;\n }\n\n return message;\n }\n\n /**\n * Verify signature and optionally decrypt a message\n */\n async verifyMessage<T>(\n message: SyncMessage\n ): Promise<{ valid: boolean; payload?: T; error?: string }> {\n if (!this.cryptoProvider || !message.auth) {\n // No crypto or no auth - return payload as-is\n return { valid: true, payload: message.payload as T };\n }\n\n let payload = message.payload;\n\n // Decrypt if encrypted\n if (message.auth.encrypted && message.payload) {\n try {\n const encrypted = message.payload as {\n alg: string;\n ct: string;\n iv: string;\n tag: string;\n epk?: JsonWebKey;\n };\n\n const decrypted = await this.cryptoProvider.decrypt(\n encrypted,\n message.auth.senderDID\n );\n\n payload = JSON.parse(new TextDecoder().decode(decrypted));\n\n logger.debug('[SyncProtocol] Message decrypted', {\n messageId: message.messageId,\n });\n } catch (error) {\n return {\n valid: false,\n error: `Decryption failed: ${\n error instanceof Error ? error.message : String(error)\n }`,\n };\n }\n }\n\n // Verify signature if present\n if (message.auth.signature && message.auth.senderDID) {\n const signed = {\n payload,\n signature: message.auth.signature,\n signer: message.auth.senderDID,\n algorithm: 'ES256',\n signedAt: Date.now(),\n };\n\n const isValid = await this.cryptoProvider.verifySignedData(signed);\n if (!isValid) {\n return { valid: false, error: 'Invalid signature' };\n }\n }\n\n return { valid: true, payload: payload as T };\n }\n\n /**\n * Create handshake message\n */\n createHandshakeMessage(nodeId: string, capabilities: string[]): SyncMessage {\n const message: SyncMessage = {\n type: 'handshake',\n version: this.version,\n sender: nodeId,\n receiver: '',\n messageId: this.generateMessageId(),\n timestamp: new Date().toISOString(),\n payload: {\n protocolVersion: this.version,\n nodeId,\n capabilities,\n state: 'initiating',\n } as Handshake,\n };\n\n this.messageMap.set(message.messageId, message);\n this.messageQueue.push(message);\n this.schedulePersist();\n\n logger.debug('[SyncProtocol] Handshake message created', {\n messageId: message.messageId,\n nodeId,\n capabilities: capabilities.length,\n });\n\n return message;\n }\n\n /**\n * Create sync request message\n */\n createSyncRequestMessage(\n sender: string,\n receiver: string,\n sessionId: string,\n fromVersion: string,\n toVersion: string,\n filter?: Record<string, unknown>\n ): SyncMessage {\n const message: SyncMessage = {\n type: 'sync-request',\n version: this.version,\n sender,\n receiver,\n messageId: this.generateMessageId(),\n timestamp: new Date().toISOString(),\n payload: {\n sessionId,\n fromVersion,\n toVersion,\n filter,\n } as SyncRequest,\n };\n\n this.messageMap.set(message.messageId, message);\n this.messageQueue.push(message);\n this.schedulePersist();\n\n logger.debug('[SyncProtocol] Sync request created', {\n messageId: message.messageId,\n sessionId,\n fromVersion,\n toVersion,\n });\n\n return message;\n }\n\n /**\n * Create sync response message\n */\n createSyncResponseMessage(\n sender: string,\n receiver: string,\n sessionId: string,\n fromVersion: string,\n toVersion: string,\n data: unknown[],\n hasMore = false,\n offset = 0\n ): SyncMessage {\n const message: SyncMessage = {\n type: 'sync-response',\n version: this.version,\n sender,\n receiver,\n messageId: this.generateMessageId(),\n timestamp: new Date().toISOString(),\n payload: {\n sessionId,\n fromVersion,\n toVersion,\n data,\n hasMore,\n offset,\n } as SyncResponse,\n };\n\n this.messageMap.set(message.messageId, message);\n this.messageQueue.push(message);\n this.schedulePersist();\n\n logger.debug('[SyncProtocol] Sync response created', {\n messageId: message.messageId,\n sessionId,\n itemCount: data.length,\n hasMore,\n });\n\n return message;\n }\n\n /**\n * Create acknowledgement message\n */\n createAckMessage(\n sender: string,\n receiver: string,\n messageId: string\n ): SyncMessage {\n const message: SyncMessage = {\n type: 'ack',\n version: this.version,\n sender,\n receiver,\n messageId: this.generateMessageId(),\n timestamp: new Date().toISOString(),\n payload: { acknowledgedMessageId: messageId },\n };\n\n this.messageMap.set(message.messageId, message);\n this.messageQueue.push(message);\n this.schedulePersist();\n\n return message;\n }\n\n /**\n * Create error message\n */\n createErrorMessage(\n sender: string,\n receiver: string,\n error: ProtocolError,\n relatedMessageId?: string\n ): SyncMessage {\n const message: SyncMessage = {\n type: 'error',\n version: this.version,\n sender,\n receiver,\n messageId: this.generateMessageId(),\n timestamp: new Date().toISOString(),\n payload: {\n error,\n relatedMessageId,\n },\n };\n\n this.messageMap.set(message.messageId, message);\n this.messageQueue.push(message);\n\n this.protocolErrors.push({\n error,\n timestamp: new Date().toISOString(),\n });\n this.schedulePersist();\n\n logger.error('[SyncProtocol] Error message created', {\n messageId: message.messageId,\n errorCode: error.code,\n recoverable: error.recoverable,\n });\n\n return message;\n }\n\n /**\n * Validate message\n */\n validateMessage(message: SyncMessage): { valid: boolean; errors: string[] } {\n const errors: string[] = [];\n\n if (!message.type) {\n errors.push('Message type is required');\n }\n\n if (!message.sender) {\n errors.push('Sender is required');\n }\n\n if (!message.messageId) {\n errors.push('Message ID is required');\n }\n\n if (!message.timestamp) {\n errors.push('Timestamp is required');\n }\n\n const timestampValue = new Date(message.timestamp);\n if (Number.isNaN(timestampValue.getTime())) {\n errors.push('Invalid timestamp format');\n }\n\n return {\n valid: errors.length === 0,\n errors,\n };\n }\n\n /**\n * Serialize message\n */\n serializeMessage(message: SyncMessage): string {\n try {\n return JSON.stringify(message);\n } catch (error) {\n logger.error('[SyncProtocol] Message serialization failed', {\n messageId: message.messageId,\n error: error instanceof Error ? error.message : String(error),\n });\n\n throw new Error(\n `Failed to serialize message: ${\n error instanceof Error ? error.message : String(error)\n }`\n );\n }\n }\n\n /**\n * Deserialize message\n */\n deserializeMessage(data: string): SyncMessage {\n try {\n const message = JSON.parse(data) as SyncMessage;\n const validation = this.validateMessage(message);\n\n if (!validation.valid) {\n throw new Error(`Invalid message: ${validation.errors.join(', ')}`);\n }\n\n return message;\n } catch (error) {\n logger.error('[SyncProtocol] Message deserialization failed', {\n error: error instanceof Error ? error.message : String(error),\n });\n\n throw new Error(\n `Failed to deserialize message: ${\n error instanceof Error ? error.message : String(error)\n }`\n );\n }\n }\n\n /**\n * Process handshake\n */\n processHandshake(message: SyncMessage): Handshake {\n if (message.type !== 'handshake') {\n throw new Error('Message is not a handshake');\n }\n\n const handshake = message.payload as Handshake;\n const nodeId = message.sender;\n\n this.handshakes.set(nodeId, handshake);\n this.schedulePersist();\n\n logger.debug('[SyncProtocol] Handshake processed', {\n nodeId,\n protocolVersion: handshake.protocolVersion,\n capabilities: handshake.capabilities.length,\n });\n\n return handshake;\n }\n\n /**\n * Get message\n */\n getMessage(messageId: string): SyncMessage | undefined {\n return this.messageMap.get(messageId);\n }\n\n /**\n * Get all messages\n */\n getAllMessages(): SyncMessage[] {\n return [...this.messageQueue];\n }\n\n /**\n * Get messages by type\n */\n getMessagesByType(type: SyncMessage['type']): SyncMessage[] {\n return this.messageQueue.filter((m) => m.type === type);\n }\n\n /**\n * Get messages from sender\n */\n getMessagesFromSender(sender: string): SyncMessage[] {\n return this.messageQueue.filter((m) => m.sender === sender);\n }\n\n /**\n * Get pending messages\n */\n getPendingMessages(receiver: string): SyncMessage[] {\n return this.messageQueue.filter((m) => m.receiver === receiver);\n }\n\n /**\n * Get handshakes\n */\n getHandshakes(): Map<string, Handshake> {\n return new Map(this.handshakes);\n }\n\n /**\n * Get protocol statistics\n */\n getStatistics() {\n const messagesByType: Record<string, number> = {};\n for (const message of this.messageQueue) {\n messagesByType[message.type] = (messagesByType[message.type] || 0) + 1;\n }\n\n const errorCount = this.protocolErrors.length;\n const recoverableErrors = this.protocolErrors.filter(\n (e) => e.error.recoverable\n ).length;\n\n return {\n totalMessages: this.messageQueue.length,\n messagesByType,\n totalHandshakes: this.handshakes.size,\n totalErrors: errorCount,\n recoverableErrors,\n unrecoverableErrors: errorCount - recoverableErrors,\n };\n }\n\n /**\n * Get protocol errors\n */\n getErrors(): Array<{ error: ProtocolError; timestamp: string }> {\n return [...this.protocolErrors];\n }\n\n /**\n * Persist protocol state for reconnect/replay.\n */\n async saveToPersistence(): Promise<void> {\n if (!this.persistence) {\n return;\n }\n\n const data: SyncProtocolPersistenceData = {\n protocolVersion: this.version,\n messageCounter: this.messageCounter,\n messageQueue: this.getAllMessages(),\n handshakes: Array.from(this.handshakes.entries()).map(\n ([nodeId, handshake]) => ({\n nodeId,\n handshake,\n })\n ),\n protocolErrors: this.getErrors(),\n };\n\n const envelope: PersistedEnvelope<SyncProtocolPersistenceData> = {\n version: 1,\n updatedAt: Date.now(),\n data,\n };\n\n const serialize =\n this.persistence.serializer ??\n ((value: PersistedEnvelope<SyncProtocolPersistenceData>) =>\n JSON.stringify(value));\n\n await this.persistence.adapter.setItem(\n this.persistence.key,\n serialize(envelope)\n );\n }\n\n /**\n * Load protocol state from persistence.\n */\n async loadFromPersistence(): Promise<{\n messages: number;\n handshakes: number;\n errors: number;\n }> {\n if (!this.persistence) {\n return { messages: 0, handshakes: 0, errors: 0 };\n }\n\n const raw = await this.persistence.adapter.getItem(this.persistence.key);\n if (!raw) {\n return { messages: 0, handshakes: 0, errors: 0 };\n }\n\n const deserialize =\n this.persistence.deserializer ??\n ((value: string) =>\n JSON.parse(value) as PersistedEnvelope<SyncProtocolPersistenceData>);\n\n const envelope = deserialize(raw);\n if (envelope.version !== 1 || !envelope.data) {\n throw new Error('Invalid sync protocol persistence payload');\n }\n if (\n !Array.isArray(envelope.data.messageQueue) ||\n !Array.isArray(envelope.data.handshakes) ||\n !Array.isArray(envelope.data.protocolErrors)\n ) {\n throw new Error('Invalid sync protocol persistence structure');\n }\n\n const nextMessages: SyncMessage[] = [];\n for (const message of envelope.data.messageQueue) {\n const validation = this.validateMessage(message);\n if (!validation.valid) {\n throw new Error(\n `Invalid persisted message ${\n message?.messageId ?? 'unknown'\n }: ${validation.errors.join(', ')}`\n );\n }\n nextMessages.push(message);\n }\n\n const nextHandshakes = new Map<string, Handshake>();\n for (const entry of envelope.data.handshakes) {\n if (\n typeof entry.nodeId !== 'string' ||\n !this.isValidHandshake(entry.handshake)\n ) {\n throw new Error('Invalid persisted handshake payload');\n }\n nextHandshakes.set(entry.nodeId, entry.handshake);\n }\n\n const nextErrors: Array<{ error: ProtocolError; timestamp: string }> = [];\n for (const entry of envelope.data.protocolErrors) {\n if (!this.isValidProtocolErrorEntry(entry)) {\n throw new Error('Invalid persisted protocol error payload');\n }\n nextErrors.push(entry);\n }\n\n this.messageQueue = nextMessages;\n this.messageMap = new Map(nextMessages.map((m) => [m.messageId, m]));\n this.handshakes = nextHandshakes;\n this.protocolErrors = nextErrors;\n this.messageCounter = Math.max(\n envelope.data.messageCounter || 0,\n this.messageQueue.length\n );\n\n logger.debug('[SyncProtocol] Loaded from persistence', {\n key: this.persistence.key,\n messages: this.messageQueue.length,\n handshakes: this.handshakes.size,\n errors: this.protocolErrors.length,\n });\n\n return {\n messages: this.messageQueue.length,\n handshakes: this.handshakes.size,\n errors: this.protocolErrors.length,\n };\n }\n\n /**\n * Clear persisted protocol checkpoint.\n */\n async clearPersistence(): Promise<void> {\n if (!this.persistence) {\n return;\n }\n await this.persistence.adapter.removeItem(this.persistence.key);\n }\n\n private schedulePersist(): void {\n if (!this.persistence || this.persistence.autoPersist === false) {\n return;\n }\n\n if (this.persistTimer) {\n clearTimeout(this.persistTimer);\n }\n\n this.persistTimer = setTimeout(() => {\n void this.persistSafely();\n }, this.persistence.persistDebounceMs ?? 25);\n }\n\n private async persistSafely(): Promise<void> {\n if (!this.persistence) {\n return;\n }\n\n if (this.persistInFlight) {\n this.persistPending = true;\n return;\n }\n\n this.persistInFlight = true;\n try {\n await this.saveToPersistence();\n } catch (error) {\n logger.error('[SyncProtocol] Persistence write failed', {\n key: this.persistence.key,\n error: error instanceof Error ? error.message : String(error),\n });\n } finally {\n this.persistInFlight = false;\n const shouldRunAgain = this.persistPending;\n this.persistPending = false;\n if (shouldRunAgain) {\n void this.persistSafely();\n }\n }\n }\n\n private isValidHandshake(value: unknown): value is Handshake {\n if (typeof value !== 'object' || value === null) {\n return false;\n }\n const handshake = value as Partial<Handshake>;\n const validState =\n handshake.state === 'initiating' ||\n handshake.state === 'responding' ||\n handshake.state === 'completed';\n\n return (\n typeof handshake.protocolVersion === 'string' &&\n typeof handshake.nodeId === 'string' &&\n Array.isArray(handshake.capabilities) &&\n handshake.capabilities.every((cap) => typeof cap === 'string') &&\n validState\n );\n }\n\n private isValidProtocolErrorEntry(\n entry: unknown\n ): entry is { error: ProtocolError; timestamp: string } {\n if (typeof entry !== 'object' || entry === null) {\n return false;\n }\n const candidate = entry as {\n error?: Partial<ProtocolError>;\n timestamp?: string;\n };\n return (\n typeof candidate.timestamp === 'string' &&\n typeof candidate.error?.code === 'string' &&\n typeof candidate.error.message === 'string' &&\n typeof candidate.error.recoverable === 'boolean'\n );\n }\n\n /**\n * Generate message ID\n */\n private generateMessageId(): string {\n this.messageCounter++;\n return `msg-${Date.now()}-${this.messageCounter}`;\n }\n\n /**\n * Clear all state (for testing)\n */\n clear(): void {\n this.messageQueue = [];\n this.messageMap.clear();\n this.handshakes.clear();\n this.protocolErrors = [];\n this.messageCounter = 0;\n this.cryptoProvider = null;\n this.cryptoConfig = null;\n this.schedulePersist();\n }\n\n /**\n * Get the crypto provider (for advanced usage)\n */\n getCryptoProvider(): ICryptoProvider | null {\n return this.cryptoProvider;\n }\n}\n","/**\n * State Reconciler\n *\n * Reconciles conflicting state across multiple nodes in a distributed system.\n * Applies merge strategies and resolves divergent state.\n *\n * Features:\n * - State comparison and diff generation\n * - Multiple merge strategies (last-write-wins, vector-clock based, custom)\n * - Conflict detection and resolution\n * - State validation and verification\n * - Version tracking\n * - Cryptographic verification of state versions\n * - Signed state for tamper detection\n */\n\nimport { logger } from '../utils/logger';\nimport type { ICryptoProvider } from '../crypto/CryptoProvider';\nimport type { SignedSyncData } from '../crypto/types';\n\nexport interface StateVersion {\n version: string;\n timestamp: string;\n nodeId: string;\n hash: string;\n data: unknown;\n // Cryptographic fields for signed versions\n signerDID?: string;\n signature?: string;\n signedAt?: number;\n}\n\nexport interface StateDiff {\n added: Record<string, unknown>;\n modified: Record<string, { old: unknown; new: unknown }>;\n removed: string[];\n timestamp: string;\n}\n\nexport interface ReconciliationResult {\n success: boolean;\n mergedState: unknown;\n conflictsResolved: number;\n strategy: string;\n timestamp: string;\n}\n\nexport type MergeStrategy =\n | 'last-write-wins'\n | 'vector-clock'\n | 'majority-vote'\n | 'custom';\n\n/**\n * State Reconciler\n * Reconciles state conflicts across distributed nodes\n */\nexport class StateReconciler {\n private stateVersions: Map<string, StateVersion[]> = new Map();\n private reconciliationHistory: ReconciliationResult[] = [];\n private cryptoProvider: ICryptoProvider | null = null;\n private requireSignedVersions: boolean = false;\n\n /**\n * Configure cryptographic provider for signed state versions\n */\n configureCrypto(\n provider: ICryptoProvider,\n requireSigned: boolean = false\n ): void {\n this.cryptoProvider = provider;\n this.requireSignedVersions = requireSigned;\n\n logger.debug('[StateReconciler] Crypto configured', {\n initialized: provider.isInitialized(),\n requireSigned,\n });\n }\n\n /**\n * Check if crypto is configured\n */\n isCryptoEnabled(): boolean {\n return this.cryptoProvider !== null && this.cryptoProvider.isInitialized();\n }\n\n /**\n * Record a signed state version with cryptographic verification\n */\n async recordSignedStateVersion(\n key: string,\n version: string,\n data: unknown\n ): Promise<StateVersion> {\n if (!this.cryptoProvider || !this.cryptoProvider.isInitialized()) {\n throw new Error('Crypto provider not initialized');\n }\n\n const localDID = this.cryptoProvider.getLocalDID();\n if (!localDID) {\n throw new Error('Local DID not available');\n }\n\n // Hash the data\n const dataBytes = new TextEncoder().encode(JSON.stringify(data));\n const hashBytes = await this.cryptoProvider.hash(dataBytes);\n const hash = Array.from(hashBytes)\n .map((b) => b.toString(16).padStart(2, '0'))\n .join('');\n\n // Sign the version\n const versionData = { version, data, hash };\n const signed = await this.cryptoProvider.signData(versionData);\n\n const stateVersion: StateVersion = {\n version,\n timestamp: new Date().toISOString(),\n nodeId: localDID,\n hash,\n data,\n signerDID: localDID,\n signature: signed.signature,\n signedAt: signed.signedAt,\n };\n\n if (!this.stateVersions.has(key)) {\n this.stateVersions.set(key, []);\n }\n\n this.stateVersions.get(key)!.push(stateVersion);\n\n logger.debug('[StateReconciler] Signed state version recorded', {\n key,\n version,\n signerDID: localDID,\n hash: hash.slice(0, 16) + '...',\n });\n\n return stateVersion;\n }\n\n /**\n * Verify a state version's signature\n */\n async verifyStateVersion(\n version: StateVersion\n ): Promise<{ valid: boolean; error?: string }> {\n // If no signature, verify based on hash only\n if (!version.signature || !version.signerDID) {\n if (this.requireSignedVersions) {\n return { valid: false, error: 'Signature required but not present' };\n }\n\n // Verify hash matches data\n const dataBytes = new TextEncoder().encode(JSON.stringify(version.data));\n if (this.cryptoProvider) {\n const hashBytes = await this.cryptoProvider.hash(dataBytes);\n const computedHash = Array.from(hashBytes)\n .map((b) => b.toString(16).padStart(2, '0'))\n .join('');\n\n if (computedHash !== version.hash) {\n return { valid: false, error: 'Hash mismatch' };\n }\n }\n\n return { valid: true };\n }\n\n // Verify signature\n if (!this.cryptoProvider) {\n return { valid: false, error: 'Crypto provider not configured' };\n }\n\n const versionData = {\n version: version.version,\n data: version.data,\n hash: version.hash,\n };\n\n const signed: SignedSyncData<typeof versionData> = {\n payload: versionData,\n signature: version.signature,\n signer: version.signerDID,\n algorithm: 'ES256',\n signedAt: version.signedAt || Date.now(),\n };\n\n const isValid = await this.cryptoProvider.verifySignedData(signed);\n if (!isValid) {\n return { valid: false, error: 'Invalid signature' };\n }\n\n return { valid: true };\n }\n\n /**\n * Reconcile with verification - only accept verified versions\n */\n async reconcileWithVerification(\n key: string,\n strategy: MergeStrategy = 'last-write-wins'\n ): Promise<ReconciliationResult & { verificationErrors: string[] }> {\n const versions = this.stateVersions.get(key) || [];\n const verifiedVersions: StateVersion[] = [];\n const verificationErrors: string[] = [];\n\n // Verify all versions\n for (const version of versions) {\n const result = await this.verifyStateVersion(version);\n if (result.valid) {\n verifiedVersions.push(version);\n } else {\n verificationErrors.push(\n `Version ${version.version} from ${version.nodeId}: ${result.error}`\n );\n logger.warn('[StateReconciler] Version verification failed', {\n version: version.version,\n nodeId: version.nodeId,\n error: result.error,\n });\n }\n }\n\n if (verifiedVersions.length === 0) {\n return {\n success: false,\n mergedState: null,\n conflictsResolved: 0,\n strategy,\n timestamp: new Date().toISOString(),\n verificationErrors,\n };\n }\n\n // Apply reconciliation strategy\n let result: ReconciliationResult;\n switch (strategy) {\n case 'last-write-wins':\n result = this.reconcileLastWriteWins(verifiedVersions);\n break;\n case 'vector-clock':\n result = this.reconcileVectorClock(verifiedVersions);\n break;\n case 'majority-vote':\n result = this.reconcileMajorityVote(verifiedVersions);\n break;\n default:\n result = this.reconcileLastWriteWins(verifiedVersions);\n }\n\n return { ...result, verificationErrors };\n }\n\n /**\n * Record a state version\n */\n recordStateVersion(\n key: string,\n version: string,\n timestamp: string,\n nodeId: string,\n hash: string,\n data: unknown\n ): void {\n if (!this.stateVersions.has(key)) {\n this.stateVersions.set(key, []);\n }\n\n const versions = this.stateVersions.get(key)!;\n versions.push({\n version,\n timestamp,\n nodeId,\n hash,\n data,\n });\n\n logger.debug('[StateReconciler] State version recorded', {\n key,\n version,\n nodeId,\n hash,\n });\n }\n\n /**\n * Detect conflicts in state versions\n */\n detectConflicts(key: string): boolean {\n const versions = this.stateVersions.get(key);\n if (!versions || versions.length <= 1) {\n return false;\n }\n\n const hashes = new Set(versions.map((v) => v.hash));\n return hashes.size > 1;\n }\n\n /**\n * Compare two states and generate diff\n */\n compareStates(\n state1: Record<string, unknown>,\n state2: Record<string, unknown>\n ): StateDiff {\n const diff: StateDiff = {\n added: {},\n modified: {},\n removed: [],\n timestamp: new Date().toISOString(),\n };\n\n // Find added and modified\n for (const [key, value] of Object.entries(state2)) {\n if (!(key in state1)) {\n diff.added[key] = value;\n } else if (JSON.stringify(state1[key]) !== JSON.stringify(value)) {\n diff.modified[key] = { old: state1[key], new: value };\n }\n }\n\n // Find removed\n for (const key of Object.keys(state1)) {\n if (!(key in state2)) {\n diff.removed.push(key);\n }\n }\n\n return diff;\n }\n\n /**\n * Reconcile states using last-write-wins strategy\n */\n reconcileLastWriteWins(versions: StateVersion[]): ReconciliationResult {\n if (versions.length === 0) {\n throw new Error('No versions to reconcile');\n }\n\n // Sort by timestamp descending, most recent first\n const sorted = [...versions].sort(\n (a, b) =>\n new Date(b.timestamp).getTime() - new Date(a.timestamp).getTime()\n );\n\n const latest = sorted[0];\n const conflictsResolved = versions.length - 1;\n\n const result: ReconciliationResult = {\n success: true,\n mergedState: latest.data,\n conflictsResolved,\n strategy: 'last-write-wins',\n timestamp: new Date().toISOString(),\n };\n\n this.reconciliationHistory.push(result);\n\n logger.debug('[StateReconciler] State reconciled (last-write-wins)', {\n winnerNode: latest.nodeId,\n conflictsResolved,\n });\n\n return result;\n }\n\n /**\n * Reconcile states using vector clock strategy\n */\n reconcileVectorClock(versions: StateVersion[]): ReconciliationResult {\n if (versions.length === 0) {\n throw new Error('No versions to reconcile');\n }\n\n // For vector clock, use the version with highest timestamp\n // In production, this would use actual vector clocks\n const sorted = [...versions].sort(\n (a, b) =>\n new Date(b.timestamp).getTime() - new Date(a.timestamp).getTime()\n );\n\n const latest = sorted[0];\n let conflictsResolved = 0;\n\n // Count concurrent versions (those with similar timestamps)\n for (const v of versions) {\n const timeDiff = Math.abs(\n new Date(v.timestamp).getTime() - new Date(latest.timestamp).getTime()\n );\n if (timeDiff > 100) {\n // More than 100ms difference\n conflictsResolved++;\n }\n }\n\n const result: ReconciliationResult = {\n success: true,\n mergedState: latest.data,\n conflictsResolved,\n strategy: 'vector-clock',\n timestamp: new Date().toISOString(),\n };\n\n this.reconciliationHistory.push(result);\n\n logger.debug('[StateReconciler] State reconciled (vector-clock)', {\n winnerVersion: latest.version,\n conflictsResolved,\n });\n\n return result;\n }\n\n /**\n * Reconcile states using majority vote strategy\n */\n reconcileMajorityVote(versions: StateVersion[]): ReconciliationResult {\n if (versions.length === 0) {\n throw new Error('No versions to reconcile');\n }\n\n // Group versions by hash\n const hashGroups: Map<string, StateVersion[]> = new Map();\n for (const version of versions) {\n if (!hashGroups.has(version.hash)) {\n hashGroups.set(version.hash, []);\n }\n hashGroups.get(version.hash)!.push(version);\n }\n\n // Find the majority\n let majorityVersion: StateVersion | null = null;\n let maxCount = 0;\n\n for (const [, versionGroup] of hashGroups) {\n if (versionGroup.length > maxCount) {\n maxCount = versionGroup.length;\n majorityVersion = versionGroup[0];\n }\n }\n\n if (!majorityVersion) {\n majorityVersion = versions[0];\n }\n\n const conflictsResolved = versions.length - maxCount;\n\n const result: ReconciliationResult = {\n success: true,\n mergedState: majorityVersion.data,\n conflictsResolved,\n strategy: 'majority-vote',\n timestamp: new Date().toISOString(),\n };\n\n this.reconciliationHistory.push(result);\n\n logger.debug('[StateReconciler] State reconciled (majority-vote)', {\n majorityCount: maxCount,\n conflictsResolved,\n });\n\n return result;\n }\n\n /**\n * Merge multiple states\n */\n mergeStates(states: Record<string, unknown>[]): unknown {\n if (states.length === 0) {\n return {};\n }\n\n if (states.length === 1) {\n return states[0];\n }\n\n // Simple merge: take all keys, preferring later states\n const merged: Record<string, unknown> = {};\n\n for (const state of states) {\n if (typeof state === 'object' && state !== null) {\n Object.assign(merged, state);\n }\n }\n\n return merged;\n }\n\n /**\n * Validate state after reconciliation\n */\n validateState(state: unknown): { valid: boolean; errors: string[] } {\n const errors: string[] = [];\n\n if (state === null) {\n errors.push('State is null');\n } else if (state === undefined) {\n errors.push('State is undefined');\n } else if (typeof state !== 'object') {\n errors.push('State is not an object');\n }\n\n return {\n valid: errors.length === 0,\n errors,\n };\n }\n\n /**\n * Get state versions for a key\n */\n getStateVersions(key: string): StateVersion[] {\n return this.stateVersions.get(key) || [];\n }\n\n /**\n * Get all state versions\n */\n getAllStateVersions(): Record<string, StateVersion[]> {\n const result: Record<string, StateVersion[]> = {};\n\n for (const [key, versions] of this.stateVersions) {\n result[key] = [...versions];\n }\n\n return result;\n }\n\n /**\n * Get reconciliation history\n */\n getReconciliationHistory(): ReconciliationResult[] {\n return [...this.reconciliationHistory];\n }\n\n /**\n * Get reconciliation statistics\n */\n getStatistics() {\n const resolvedConflicts = this.reconciliationHistory.reduce(\n (sum, r) => sum + r.conflictsResolved,\n 0\n );\n\n const strategyUsage: Record<string, number> = {};\n for (const result of this.reconciliationHistory) {\n strategyUsage[result.strategy] =\n (strategyUsage[result.strategy] || 0) + 1;\n }\n\n return {\n totalReconciliations: this.reconciliationHistory.length,\n successfulReconciliations: this.reconciliationHistory.filter(\n (r) => r.success\n ).length,\n totalConflictsResolved: resolvedConflicts,\n averageConflictsPerReconciliation:\n this.reconciliationHistory.length > 0\n ? resolvedConflicts / this.reconciliationHistory.length\n : 0,\n strategyUsage,\n trackedKeys: this.stateVersions.size,\n };\n }\n\n /**\n * Clear all state (for testing)\n */\n clear(): void {\n this.stateVersions.clear();\n this.reconciliationHistory = [];\n this.cryptoProvider = null;\n this.requireSignedVersions = false;\n }\n\n /**\n * Get the crypto provider (for advanced usage)\n */\n getCryptoProvider(): ICryptoProvider | null {\n return this.cryptoProvider;\n }\n}\n","/**\n * Recovery Ledger\n *\n * Monotone request-recovery state for sharded object delivery.\n *\n * The ledger does not store the payload bytes themselves. It stores the\n * convergent facts needed to decide whether an object can be reconstructed:\n * - which request IDs alias the same object fetch\n * - which data/parity shards have been observed\n * - which paths have already succeeded or failed\n * - whether conflicting shard digests make reconstruction unsafe\n *\n * This is the \"shared state without shared mutable state\" surface:\n * every peer can observe partial delivery and merge those observations\n * without coordination. Reconstruction becomes legal once the merged\n * observation crosses the configured threshold.\n */\n\nexport type RecoveryShardRole = 'data' | 'parity';\nexport type RecoveryPathStatus = 'succeeded' | 'failed';\n\nexport interface RecoveryLedgerConfig {\n readonly objectId: string;\n readonly dataShardCount: number;\n readonly parityShardCount?: number;\n /**\n * Number of unique shard units required to reconstruct the object.\n * Defaults to `dataShardCount`, which matches MDS-style parity coding.\n */\n readonly recoveryThreshold?: number;\n}\n\nexport interface RecoveryPathObservation {\n readonly pathId: string;\n readonly status: RecoveryPathStatus;\n readonly requestIds: readonly string[];\n readonly observedBy: readonly string[];\n readonly reasons: readonly string[];\n readonly firstObservedAt: number;\n readonly lastObservedAt: number;\n}\n\nexport interface RecoveryShardObservation {\n readonly shardRole: RecoveryShardRole;\n readonly shardIndex: number;\n readonly digests: readonly string[];\n readonly requestIds: readonly string[];\n readonly observedBy: readonly string[];\n readonly sources: readonly string[];\n readonly firstObservedAt: number;\n readonly lastObservedAt: number;\n}\n\nexport interface RecoveryLedgerSnapshot {\n readonly objectId: string;\n readonly dataShardCount: number;\n readonly parityShardCount: number;\n readonly recoveryThreshold: number;\n readonly requestIds: readonly string[];\n readonly shards: readonly RecoveryShardObservation[];\n readonly paths: readonly RecoveryPathObservation[];\n}\n\nexport interface RecordShardObservationInput {\n readonly shardRole: RecoveryShardRole;\n readonly shardIndex: number;\n readonly digest: string;\n readonly requestId?: string;\n readonly observedBy?: string;\n readonly source?: string;\n readonly observedAt?: number;\n}\n\nexport interface RecordPathObservationInput {\n readonly pathId: string;\n readonly status: RecoveryPathStatus;\n readonly requestId?: string;\n readonly observedBy?: string;\n readonly reason?: string;\n readonly observedAt?: number;\n}\n\nexport interface RecoveryConflict {\n readonly shardRole: RecoveryShardRole;\n readonly shardIndex: number;\n readonly digests: readonly string[];\n}\n\nexport interface RecoveryStatus {\n readonly objectId: string;\n readonly requestIds: readonly string[];\n readonly dataShardCount: number;\n readonly parityShardCount: number;\n readonly recoveryThreshold: number;\n readonly availableDataShards: readonly number[];\n readonly availableParityShards: readonly number[];\n readonly missingDataShards: readonly number[];\n readonly uniqueShardUnits: number;\n readonly directDataComplete: boolean;\n readonly canReconstruct: boolean;\n readonly needsParityDecode: boolean;\n readonly conflictingShards: readonly RecoveryConflict[];\n readonly failedPaths: readonly string[];\n readonly succeededPaths: readonly string[];\n}\n\ninterface MutableRecoveryShardObservation {\n shardRole: RecoveryShardRole;\n shardIndex: number;\n digests: Set<string>;\n requestIds: Set<string>;\n observedBy: Set<string>;\n sources: Set<string>;\n firstObservedAt: number;\n lastObservedAt: number;\n}\n\ninterface MutableRecoveryPathObservation {\n pathId: string;\n status: RecoveryPathStatus;\n requestIds: Set<string>;\n observedBy: Set<string>;\n reasons: Set<string>;\n firstObservedAt: number;\n lastObservedAt: number;\n}\n\nfunction createShardKey(\n shardRole: RecoveryShardRole,\n shardIndex: number,\n): string {\n return `${shardRole}:${shardIndex}`;\n}\n\nfunction sortStrings(values: Iterable<string>): string[] {\n return [...values].sort();\n}\n\nfunction clampObservedAt(observedAt: number | undefined): number {\n return Number.isFinite(observedAt) ? observedAt! : Date.now();\n}\n\nexport class RecoveryLedger {\n private readonly objectId: string;\n private readonly dataShardCount: number;\n private readonly parityShardCount: number;\n private readonly recoveryThreshold: number;\n private readonly requestIds = new Set<string>();\n private readonly shards = new Map<string, MutableRecoveryShardObservation>();\n private readonly paths = new Map<string, MutableRecoveryPathObservation>();\n\n constructor(config: RecoveryLedgerConfig | RecoveryLedgerSnapshot) {\n this.objectId = config.objectId;\n this.dataShardCount = config.dataShardCount;\n this.parityShardCount = config.parityShardCount ?? 0;\n this.recoveryThreshold = config.recoveryThreshold ?? config.dataShardCount;\n\n if (this.dataShardCount <= 0) {\n throw new Error('dataShardCount must be greater than 0');\n }\n\n const maximumShardUnits = this.dataShardCount + this.parityShardCount;\n if (this.recoveryThreshold <= 0 || this.recoveryThreshold > maximumShardUnits) {\n throw new Error('recoveryThreshold must be between 1 and the total number of shard units');\n }\n\n if ('shards' in config) {\n this.merge(config);\n }\n }\n\n static fromSnapshot(snapshot: RecoveryLedgerSnapshot): RecoveryLedger {\n return new RecoveryLedger(snapshot);\n }\n\n getObjectId(): string {\n return this.objectId;\n }\n\n registerRequest(requestId: string): this {\n if (requestId) {\n this.requestIds.add(requestId);\n }\n return this;\n }\n\n recordShardObservation(input: RecordShardObservationInput): this {\n this.assertShardIndex(input.shardRole, input.shardIndex);\n\n const shardKey = createShardKey(input.shardRole, input.shardIndex);\n const observedAt = clampObservedAt(input.observedAt);\n let shard = this.shards.get(shardKey);\n\n if (!shard) {\n shard = {\n shardRole: input.shardRole,\n shardIndex: input.shardIndex,\n digests: new Set(),\n requestIds: new Set(),\n observedBy: new Set(),\n sources: new Set(),\n firstObservedAt: observedAt,\n lastObservedAt: observedAt,\n };\n this.shards.set(shardKey, shard);\n }\n\n shard.digests.add(input.digest);\n if (input.requestId) {\n shard.requestIds.add(input.requestId);\n this.requestIds.add(input.requestId);\n }\n if (input.observedBy) {\n shard.observedBy.add(input.observedBy);\n }\n if (input.source) {\n shard.sources.add(input.source);\n }\n shard.firstObservedAt = Math.min(shard.firstObservedAt, observedAt);\n shard.lastObservedAt = Math.max(shard.lastObservedAt, observedAt);\n\n return this;\n }\n\n recordPathObservation(input: RecordPathObservationInput): this {\n const observedAt = clampObservedAt(input.observedAt);\n let path = this.paths.get(input.pathId);\n\n if (!path) {\n path = {\n pathId: input.pathId,\n status: input.status,\n requestIds: new Set(),\n observedBy: new Set(),\n reasons: new Set(),\n firstObservedAt: observedAt,\n lastObservedAt: observedAt,\n };\n this.paths.set(input.pathId, path);\n }\n\n if (path.status !== input.status) {\n // Success dominates failure because it carries the stronger observation:\n // this path eventually delivered useful work.\n path.status = path.status === 'succeeded' || input.status === 'succeeded'\n ? 'succeeded'\n : 'failed';\n }\n\n if (input.requestId) {\n path.requestIds.add(input.requestId);\n this.requestIds.add(input.requestId);\n }\n if (input.observedBy) {\n path.observedBy.add(input.observedBy);\n }\n if (input.reason) {\n path.reasons.add(input.reason);\n }\n path.firstObservedAt = Math.min(path.firstObservedAt, observedAt);\n path.lastObservedAt = Math.max(path.lastObservedAt, observedAt);\n\n return this;\n }\n\n merge(other: RecoveryLedger | RecoveryLedgerSnapshot): this {\n const snapshot = other instanceof RecoveryLedger ? other.snapshot() : other;\n this.assertCompatibleSnapshot(snapshot);\n\n for (const requestId of snapshot.requestIds) {\n this.requestIds.add(requestId);\n }\n\n for (const shard of snapshot.shards) {\n this.mergeShard(shard);\n }\n\n for (const path of snapshot.paths) {\n this.mergePath(path);\n }\n\n return this;\n }\n\n getStatus(): RecoveryStatus {\n const availableDataShards = this.getAvailableShardIndices('data');\n const availableParityShards = this.getAvailableShardIndices('parity');\n const missingDataShards = this.getMissingDataShardIndices();\n const conflictingShards = this.getConflicts();\n const uniqueShardUnits = availableDataShards.length + availableParityShards.length;\n const directDataComplete = availableDataShards.length === this.dataShardCount;\n const canReconstruct =\n conflictingShards.length === 0 &&\n (directDataComplete || uniqueShardUnits >= this.recoveryThreshold);\n const needsParityDecode = canReconstruct && !directDataComplete;\n\n return {\n objectId: this.objectId,\n requestIds: sortStrings(this.requestIds),\n dataShardCount: this.dataShardCount,\n parityShardCount: this.parityShardCount,\n recoveryThreshold: this.recoveryThreshold,\n availableDataShards,\n availableParityShards,\n missingDataShards,\n uniqueShardUnits,\n directDataComplete,\n canReconstruct,\n needsParityDecode,\n conflictingShards,\n failedPaths: this.getPathsByStatus('failed'),\n succeededPaths: this.getPathsByStatus('succeeded'),\n };\n }\n\n snapshot(): RecoveryLedgerSnapshot {\n const shards = [...this.shards.values()]\n .sort((left, right) => {\n if (left.shardRole !== right.shardRole) {\n return left.shardRole.localeCompare(right.shardRole);\n }\n return left.shardIndex - right.shardIndex;\n })\n .map(shard => ({\n shardRole: shard.shardRole,\n shardIndex: shard.shardIndex,\n digests: sortStrings(shard.digests),\n requestIds: sortStrings(shard.requestIds),\n observedBy: sortStrings(shard.observedBy),\n sources: sortStrings(shard.sources),\n firstObservedAt: shard.firstObservedAt,\n lastObservedAt: shard.lastObservedAt,\n }));\n const paths = [...this.paths.values()]\n .sort((left, right) => left.pathId.localeCompare(right.pathId))\n .map(path => ({\n pathId: path.pathId,\n status: path.status,\n requestIds: sortStrings(path.requestIds),\n observedBy: sortStrings(path.observedBy),\n reasons: sortStrings(path.reasons),\n firstObservedAt: path.firstObservedAt,\n lastObservedAt: path.lastObservedAt,\n }));\n\n return {\n objectId: this.objectId,\n dataShardCount: this.dataShardCount,\n parityShardCount: this.parityShardCount,\n recoveryThreshold: this.recoveryThreshold,\n requestIds: sortStrings(this.requestIds),\n shards,\n paths,\n };\n }\n\n private mergeShard(shard: RecoveryShardObservation): void {\n this.assertShardIndex(shard.shardRole, shard.shardIndex);\n\n const key = createShardKey(shard.shardRole, shard.shardIndex);\n const existing = this.shards.get(key);\n\n if (!existing) {\n this.shards.set(key, {\n shardRole: shard.shardRole,\n shardIndex: shard.shardIndex,\n digests: new Set(shard.digests),\n requestIds: new Set(shard.requestIds),\n observedBy: new Set(shard.observedBy),\n sources: new Set(shard.sources),\n firstObservedAt: shard.firstObservedAt,\n lastObservedAt: shard.lastObservedAt,\n });\n return;\n }\n\n for (const digest of shard.digests) {\n existing.digests.add(digest);\n }\n for (const requestId of shard.requestIds) {\n existing.requestIds.add(requestId);\n this.requestIds.add(requestId);\n }\n for (const observer of shard.observedBy) {\n existing.observedBy.add(observer);\n }\n for (const source of shard.sources) {\n existing.sources.add(source);\n }\n existing.firstObservedAt = Math.min(existing.firstObservedAt, shard.firstObservedAt);\n existing.lastObservedAt = Math.max(existing.lastObservedAt, shard.lastObservedAt);\n }\n\n private mergePath(path: RecoveryPathObservation): void {\n const existing = this.paths.get(path.pathId);\n\n if (!existing) {\n this.paths.set(path.pathId, {\n pathId: path.pathId,\n status: path.status,\n requestIds: new Set(path.requestIds),\n observedBy: new Set(path.observedBy),\n reasons: new Set(path.reasons),\n firstObservedAt: path.firstObservedAt,\n lastObservedAt: path.lastObservedAt,\n });\n for (const requestId of path.requestIds) {\n this.requestIds.add(requestId);\n }\n return;\n }\n\n existing.status = existing.status === 'succeeded' || path.status === 'succeeded'\n ? 'succeeded'\n : 'failed';\n for (const requestId of path.requestIds) {\n existing.requestIds.add(requestId);\n this.requestIds.add(requestId);\n }\n for (const observer of path.observedBy) {\n existing.observedBy.add(observer);\n }\n for (const reason of path.reasons) {\n existing.reasons.add(reason);\n }\n existing.firstObservedAt = Math.min(existing.firstObservedAt, path.firstObservedAt);\n existing.lastObservedAt = Math.max(existing.lastObservedAt, path.lastObservedAt);\n }\n\n private getAvailableShardIndices(role: RecoveryShardRole): number[] {\n return [...this.shards.values()]\n .filter(shard => shard.shardRole === role)\n .map(shard => shard.shardIndex)\n .sort((left, right) => left - right);\n }\n\n private getMissingDataShardIndices(): number[] {\n const available = new Set(this.getAvailableShardIndices('data'));\n const missing: number[] = [];\n\n for (let shardIndex = 0; shardIndex < this.dataShardCount; shardIndex++) {\n if (!available.has(shardIndex)) {\n missing.push(shardIndex);\n }\n }\n\n return missing;\n }\n\n private getPathsByStatus(status: RecoveryPathStatus): string[] {\n return [...this.paths.values()]\n .filter(path => path.status === status)\n .map(path => path.pathId)\n .sort();\n }\n\n private getConflicts(): RecoveryConflict[] {\n return [...this.shards.values()]\n .filter(shard => shard.digests.size > 1)\n .map(shard => ({\n shardRole: shard.shardRole,\n shardIndex: shard.shardIndex,\n digests: sortStrings(shard.digests),\n }))\n .sort((left, right) => {\n if (left.shardRole !== right.shardRole) {\n return left.shardRole.localeCompare(right.shardRole);\n }\n return left.shardIndex - right.shardIndex;\n });\n }\n\n private assertCompatibleSnapshot(snapshot: RecoveryLedgerSnapshot): void {\n if (snapshot.objectId !== this.objectId) {\n throw new Error(`RecoveryLedger object mismatch: expected ${this.objectId}, received ${snapshot.objectId}`);\n }\n if (snapshot.dataShardCount !== this.dataShardCount) {\n throw new Error('RecoveryLedger dataShardCount mismatch');\n }\n if (snapshot.parityShardCount !== this.parityShardCount) {\n throw new Error('RecoveryLedger parityShardCount mismatch');\n }\n if (snapshot.recoveryThreshold !== this.recoveryThreshold) {\n throw new Error('RecoveryLedger recoveryThreshold mismatch');\n }\n }\n\n private assertShardIndex(role: RecoveryShardRole, shardIndex: number): void {\n const upperBound = role === 'data' ? this.dataShardCount : this.parityShardCount;\n if (!Number.isInteger(shardIndex) || shardIndex < 0 || shardIndex >= upperBound) {\n throw new Error(`Invalid ${role} shard index ${shardIndex}`);\n }\n }\n}\n","/**\n * Offline Operation Queue (Phase 11)\n *\n * Manages pending operations for offline-first clients.\n * Provides priority-based queuing, persistence, and retry logic.\n */\n\nimport { EventEmitter } from 'eventemitter3';\nimport { getLogger } from '../utils/logger';\nimport type { Operation, OperationPriority } from '../core/types';\nimport type {\n PersistedEnvelope,\n PersistenceDeserializer,\n PersistenceSerializer,\n StorageAdapter,\n} from '../persistence';\n\nconst logger = getLogger();\n\n// Re-export OperationPriority from core\nexport type { OperationPriority } from '../core/types';\n\nexport interface OfflineOperation {\n id: string;\n type: Operation['type'];\n data: Record<string, unknown>;\n sessionId: string;\n priority: OperationPriority;\n createdAt: number;\n retryCount: number;\n maxRetries: number;\n lastError?: string;\n status: 'pending' | 'syncing' | 'failed' | 'synced';\n}\n\nexport interface OfflineQueueStats {\n pending: number;\n syncing: number;\n failed: number;\n synced: number;\n totalOperations: number;\n oldestPendingMs: number;\n averageRetries: number;\n}\n\nexport interface OfflineQueueEvents {\n 'operation-added': (operation: OfflineOperation) => void;\n 'operation-synced': (operation: OfflineOperation) => void;\n 'operation-failed': (operation: OfflineOperation, error: Error) => void;\n 'queue-empty': () => void;\n 'sync-started': () => void;\n 'sync-completed': (stats: { synced: number; failed: number }) => void;\n}\n\nexport interface OfflineQueuePersistenceConfig {\n adapter: StorageAdapter;\n key?: string;\n autoPersist?: boolean;\n autoLoad?: boolean;\n persistDebounceMs?: number;\n serializer?: PersistenceSerializer<OfflineOperation[]>;\n deserializer?: PersistenceDeserializer<OfflineOperation[]>;\n}\n\nexport interface OfflineOperationQueueOptions {\n maxQueueSize?: number;\n defaultMaxRetries?: number;\n persistence?: OfflineQueuePersistenceConfig;\n}\n\n// ============================================================================\n// Offline Operation Queue\n// ============================================================================\n\nexport class OfflineOperationQueue extends EventEmitter<OfflineQueueEvents> {\n private static readonly DEFAULT_PERSIST_KEY = 'aeon:offline-queue:v1';\n private queue: Map<string, OfflineOperation> = new Map();\n private syncingIds: Set<string> = new Set();\n private maxQueueSize = 1000;\n private defaultMaxRetries = 3;\n private persistence:\n | (OfflineQueuePersistenceConfig & { key: string })\n | null = null;\n private persistTimer: ReturnType<typeof setTimeout> | null = null;\n private persistInFlight = false;\n private persistPending = false;\n\n constructor(\n maxQueueSizeOrOptions: number | OfflineOperationQueueOptions = 1000,\n defaultMaxRetries = 3\n ) {\n super();\n\n if (typeof maxQueueSizeOrOptions === 'number') {\n this.maxQueueSize = maxQueueSizeOrOptions;\n this.defaultMaxRetries = defaultMaxRetries;\n } else {\n this.maxQueueSize = maxQueueSizeOrOptions.maxQueueSize ?? 1000;\n this.defaultMaxRetries = maxQueueSizeOrOptions.defaultMaxRetries ?? 3;\n\n if (maxQueueSizeOrOptions.persistence) {\n this.persistence = {\n ...maxQueueSizeOrOptions.persistence,\n key:\n maxQueueSizeOrOptions.persistence.key ??\n OfflineOperationQueue.DEFAULT_PERSIST_KEY,\n autoPersist: maxQueueSizeOrOptions.persistence.autoPersist ?? true,\n autoLoad: maxQueueSizeOrOptions.persistence.autoLoad ?? false,\n persistDebounceMs:\n maxQueueSizeOrOptions.persistence.persistDebounceMs ?? 25,\n };\n\n if (this.persistence.autoLoad) {\n void this.loadFromPersistence().catch((error) => {\n logger.error('[OfflineOperationQueue] Failed to load persistence', {\n key: this.persistence?.key,\n error: error instanceof Error ? error.message : String(error),\n });\n });\n }\n }\n }\n\n logger.debug('[OfflineOperationQueue] Initialized', {\n maxQueueSize: this.maxQueueSize,\n defaultMaxRetries: this.defaultMaxRetries,\n persistenceEnabled: this.persistence !== null,\n });\n }\n\n /**\n * Add operation to the queue\n */\n enqueue(\n type: Operation['type'],\n data: Record<string, unknown>,\n sessionId: string,\n priority: OperationPriority = 'normal',\n maxRetries?: number\n ): OfflineOperation {\n if (this.queue.size >= this.maxQueueSize) {\n // Remove oldest low-priority operation\n const oldest = this.findOldestLowPriority();\n if (oldest) {\n this.queue.delete(oldest.id);\n logger.warn('[OfflineOperationQueue] Queue full, removed oldest', {\n removedId: oldest.id,\n });\n }\n }\n\n const operation: OfflineOperation = {\n id: `op-${Date.now()}-${Math.random().toString(36).slice(2)}`,\n type,\n data,\n sessionId,\n priority,\n createdAt: Date.now(),\n retryCount: 0,\n maxRetries: maxRetries ?? this.defaultMaxRetries,\n status: 'pending',\n };\n\n this.queue.set(operation.id, operation);\n this.emit('operation-added', operation);\n this.schedulePersist();\n\n logger.debug('[OfflineOperationQueue] Operation enqueued', {\n id: operation.id,\n type,\n priority,\n queueSize: this.queue.size,\n });\n\n return operation;\n }\n\n /**\n * Get next operations to sync (by priority)\n */\n getNextBatch(batchSize = 10): OfflineOperation[] {\n const pending = Array.from(this.queue.values())\n .filter((op) => op.status === 'pending' && !this.syncingIds.has(op.id))\n .sort((a, b) => {\n // Sort by priority first, then by creation time\n const priorityOrder = { high: 0, normal: 1, low: 2 };\n const priorityDiff =\n priorityOrder[a.priority] - priorityOrder[b.priority];\n if (priorityDiff !== 0) return priorityDiff;\n return a.createdAt - b.createdAt;\n });\n\n return pending.slice(0, batchSize);\n }\n\n /**\n * Mark operations as syncing\n */\n markSyncing(operationIds: string[]): void {\n let changed = false;\n for (const id of operationIds) {\n const op = this.queue.get(id);\n if (op) {\n op.status = 'syncing';\n this.syncingIds.add(id);\n changed = true;\n }\n }\n\n if (changed) {\n this.schedulePersist();\n }\n }\n\n /**\n * Mark operation as synced\n */\n markSynced(operationId: string): void {\n const op = this.queue.get(operationId);\n if (op) {\n op.status = 'synced';\n this.syncingIds.delete(operationId);\n this.emit('operation-synced', op);\n this.schedulePersist();\n\n // Remove synced operations after short delay\n setTimeout(() => {\n this.queue.delete(operationId);\n this.schedulePersist();\n if (this.getPendingCount() === 0) {\n this.emit('queue-empty');\n }\n }, 1000);\n }\n }\n\n /**\n * Mark operation as failed\n */\n markFailed(operationId: string, error: Error): void {\n const op = this.queue.get(operationId);\n if (op) {\n op.retryCount++;\n op.lastError = error.message;\n this.syncingIds.delete(operationId);\n\n if (op.retryCount >= op.maxRetries) {\n op.status = 'failed';\n this.emit('operation-failed', op, error);\n logger.error('[OfflineOperationQueue] Operation permanently failed', {\n id: operationId,\n retries: op.retryCount,\n error: error.message,\n });\n } else {\n op.status = 'pending';\n logger.warn('[OfflineOperationQueue] Operation failed, will retry', {\n id: operationId,\n retryCount: op.retryCount,\n maxRetries: op.maxRetries,\n });\n }\n\n this.schedulePersist();\n }\n }\n\n /**\n * Get operation by ID\n */\n getOperation(operationId: string): OfflineOperation | undefined {\n return this.queue.get(operationId);\n }\n\n /**\n * Get all pending operations\n */\n getPendingOperations(): OfflineOperation[] {\n return Array.from(this.queue.values()).filter(\n (op) => op.status === 'pending'\n );\n }\n\n /**\n * Get pending count\n */\n getPendingCount(): number {\n return Array.from(this.queue.values()).filter(\n (op) => op.status === 'pending'\n ).length;\n }\n\n /**\n * Get queue statistics\n */\n getStats(): OfflineQueueStats {\n const operations = Array.from(this.queue.values());\n\n const pending = operations.filter((op) => op.status === 'pending').length;\n const syncing = operations.filter((op) => op.status === 'syncing').length;\n const failed = operations.filter((op) => op.status === 'failed').length;\n const synced = operations.filter((op) => op.status === 'synced').length;\n\n const pendingOps = operations.filter((op) => op.status === 'pending');\n const oldestPendingMs =\n pendingOps.length > 0\n ? Date.now() - Math.min(...pendingOps.map((op) => op.createdAt))\n : 0;\n\n const averageRetries =\n operations.length > 0\n ? operations.reduce((sum, op) => sum + op.retryCount, 0) /\n operations.length\n : 0;\n\n return {\n pending,\n syncing,\n failed,\n synced,\n totalOperations: operations.length,\n oldestPendingMs,\n averageRetries,\n };\n }\n\n /**\n * Clear all operations\n */\n clear(): void {\n this.queue.clear();\n this.syncingIds.clear();\n this.schedulePersist();\n logger.debug('[OfflineOperationQueue] Queue cleared');\n }\n\n /**\n * Clear failed operations\n */\n clearFailed(): void {\n let changed = false;\n for (const [id, op] of this.queue.entries()) {\n if (op.status === 'failed') {\n this.queue.delete(id);\n changed = true;\n }\n }\n\n if (changed) {\n this.schedulePersist();\n }\n }\n\n /**\n * Retry failed operations\n */\n retryFailed(): void {\n let changed = false;\n for (const op of this.queue.values()) {\n if (op.status === 'failed') {\n op.status = 'pending';\n op.retryCount = 0;\n changed = true;\n }\n }\n\n if (changed) {\n this.schedulePersist();\n }\n }\n\n /**\n * Find oldest low-priority operation\n */\n private findOldestLowPriority(): OfflineOperation | null {\n const lowPriority = Array.from(this.queue.values())\n .filter((op) => op.priority === 'low' && op.status === 'pending')\n .sort((a, b) => a.createdAt - b.createdAt);\n\n return lowPriority[0] ?? null;\n }\n\n /**\n * Export queue for persistence\n */\n export(): OfflineOperation[] {\n return Array.from(this.queue.values());\n }\n\n /**\n * Import queue from persistence\n */\n import(operations: OfflineOperation[]): void {\n this.queue.clear();\n this.syncingIds.clear();\n\n for (const op of operations) {\n if (this.isValidOfflineOperation(op)) {\n this.queue.set(op.id, {\n ...op,\n status: op.status === 'syncing' ? 'pending' : op.status,\n });\n }\n }\n\n this.schedulePersist();\n\n logger.debug('[OfflineOperationQueue] Imported operations', {\n count: this.queue.size,\n });\n }\n\n /**\n * Persist current queue snapshot.\n */\n async saveToPersistence(): Promise<void> {\n if (!this.persistence) {\n return;\n }\n\n const envelope: PersistedEnvelope<OfflineOperation[]> = {\n version: 1,\n updatedAt: Date.now(),\n data: this.export(),\n };\n\n const serialize =\n this.persistence.serializer ??\n ((value: PersistedEnvelope<OfflineOperation[]>) => JSON.stringify(value));\n const raw = serialize(envelope);\n\n await this.persistence.adapter.setItem(this.persistence.key, raw);\n }\n\n /**\n * Load queue snapshot from persistence.\n */\n async loadFromPersistence(): Promise<number> {\n if (!this.persistence) {\n return 0;\n }\n\n const raw = await this.persistence.adapter.getItem(this.persistence.key);\n if (!raw) {\n return 0;\n }\n\n const deserialize =\n this.persistence.deserializer ??\n ((value: string) =>\n JSON.parse(value) as PersistedEnvelope<OfflineOperation[]>);\n\n const envelope = deserialize(raw);\n if (envelope.version !== 1 || !Array.isArray(envelope.data)) {\n throw new Error('Invalid offline queue persistence payload');\n }\n\n this.queue.clear();\n this.syncingIds.clear();\n\n let imported = 0;\n for (const operation of envelope.data) {\n if (this.isValidOfflineOperation(operation)) {\n this.queue.set(operation.id, {\n ...operation,\n status: operation.status === 'syncing' ? 'pending' : operation.status,\n });\n imported++;\n }\n }\n\n logger.debug('[OfflineOperationQueue] Loaded from persistence', {\n key: this.persistence.key,\n imported,\n });\n\n return imported;\n }\n\n /**\n * Remove persisted queue snapshot.\n */\n async clearPersistence(): Promise<void> {\n if (!this.persistence) {\n return;\n }\n await this.persistence.adapter.removeItem(this.persistence.key);\n }\n\n private schedulePersist(): void {\n if (!this.persistence || this.persistence.autoPersist === false) {\n return;\n }\n\n if (this.persistTimer) {\n clearTimeout(this.persistTimer);\n }\n\n this.persistTimer = setTimeout(() => {\n void this.persistSafely();\n }, this.persistence.persistDebounceMs ?? 25);\n }\n\n private async persistSafely(): Promise<void> {\n if (!this.persistence) {\n return;\n }\n\n if (this.persistInFlight) {\n this.persistPending = true;\n return;\n }\n\n this.persistInFlight = true;\n\n try {\n await this.saveToPersistence();\n } catch (error) {\n logger.error('[OfflineOperationQueue] Persistence write failed', {\n key: this.persistence.key,\n error: error instanceof Error ? error.message : String(error),\n });\n } finally {\n this.persistInFlight = false;\n const shouldRunAgain = this.persistPending;\n this.persistPending = false;\n if (shouldRunAgain) {\n void this.persistSafely();\n }\n }\n }\n\n private isValidOfflineOperation(value: unknown): value is OfflineOperation {\n if (typeof value !== 'object' || value === null) {\n return false;\n }\n\n const candidate = value as Partial<OfflineOperation>;\n const validType =\n candidate.type === 'create' ||\n candidate.type === 'update' ||\n candidate.type === 'delete' ||\n candidate.type === 'sync' ||\n candidate.type === 'batch';\n const validPriority =\n candidate.priority === 'high' ||\n candidate.priority === 'normal' ||\n candidate.priority === 'low';\n const validStatus =\n candidate.status === 'pending' ||\n candidate.status === 'syncing' ||\n candidate.status === 'failed' ||\n candidate.status === 'synced';\n\n return (\n typeof candidate.id === 'string' &&\n validType &&\n typeof candidate.data === 'object' &&\n candidate.data !== null &&\n !Array.isArray(candidate.data) &&\n typeof candidate.sessionId === 'string' &&\n validPriority &&\n typeof candidate.createdAt === 'number' &&\n typeof candidate.retryCount === 'number' &&\n typeof candidate.maxRetries === 'number' &&\n validStatus\n );\n }\n}\n\n// ============================================================================\n// Singleton Instance\n// ============================================================================\n\nlet offlineQueueInstance: OfflineOperationQueue | null = null;\n\nexport function getOfflineOperationQueue(): OfflineOperationQueue {\n if (!offlineQueueInstance) {\n offlineQueueInstance = new OfflineOperationQueue();\n }\n return offlineQueueInstance;\n}\n\nexport function resetOfflineOperationQueue(): void {\n offlineQueueInstance = null;\n}\n","/**\n * Compression Engine (Phase 12)\n *\n * Provides compression for delta operations using native CompressionStream API.\n * Falls back gracefully when native compression is unavailable.\n */\n\nimport { getLogger } from '../utils/logger';\n\nconst logger = getLogger();\n\n// ============================================================================\n// Types\n// ============================================================================\n\nexport interface CompressedBatch {\n id: string;\n compressed: Uint8Array;\n originalSize: number;\n compressedSize: number;\n compressionRatio: number;\n algorithm: 'gzip' | 'deflate' | 'none';\n timestamp: number;\n}\n\nexport interface CompressedChunk {\n chunkId: string;\n batchId: string;\n data: Uint8Array;\n index: number;\n total: number;\n checksum: string;\n}\n\nexport interface CompressionStats {\n totalCompressed: number;\n totalDecompressed: number;\n totalOriginalBytes: number;\n totalCompressedBytes: number;\n averageCompressionRatio: number;\n compressionTimeMs: number;\n decompressionTimeMs: number;\n}\n\n// ============================================================================\n// Compression Engine\n// ============================================================================\n\nexport class CompressionEngine {\n private stats: CompressionStats = {\n totalCompressed: 0,\n totalDecompressed: 0,\n totalOriginalBytes: 0,\n totalCompressedBytes: 0,\n averageCompressionRatio: 0,\n compressionTimeMs: 0,\n decompressionTimeMs: 0,\n };\n private preferredAlgorithm: 'gzip' | 'deflate' = 'gzip';\n\n constructor(preferredAlgorithm: 'gzip' | 'deflate' = 'gzip') {\n this.preferredAlgorithm = preferredAlgorithm;\n logger.debug('[CompressionEngine] Initialized', {\n algorithm: preferredAlgorithm,\n supportsNative: this.supportsNativeCompression(),\n });\n }\n\n /**\n * Check if native compression is available\n */\n supportsNativeCompression(): boolean {\n return (\n typeof CompressionStream !== 'undefined' &&\n typeof DecompressionStream !== 'undefined'\n );\n }\n\n /**\n * Compress data\n */\n async compress(data: Uint8Array | string): Promise<CompressedBatch> {\n const startTime = performance.now();\n\n const inputData =\n typeof data === 'string' ? new TextEncoder().encode(data) : data;\n const originalSize = inputData.byteLength;\n\n let compressed: Uint8Array;\n let algorithm: 'gzip' | 'deflate' | 'none' = this.preferredAlgorithm;\n\n if (this.supportsNativeCompression()) {\n try {\n compressed = await this.compressNative(\n inputData,\n this.preferredAlgorithm\n );\n } catch (error) {\n logger.warn(\n '[CompressionEngine] Native compression failed, using fallback',\n error\n );\n compressed = inputData;\n algorithm = 'none';\n }\n } else {\n // No native compression - return uncompressed\n compressed = inputData;\n algorithm = 'none';\n }\n\n const compressionRatio =\n originalSize > 0 ? 1 - compressed.byteLength / originalSize : 0;\n\n const batch: CompressedBatch = {\n id: `batch-${Date.now()}-${Math.random().toString(36).slice(2)}`,\n compressed,\n originalSize,\n compressedSize: compressed.byteLength,\n compressionRatio,\n algorithm,\n timestamp: Date.now(),\n };\n\n // Update stats\n const elapsed = performance.now() - startTime;\n this.stats.totalCompressed++;\n this.stats.totalOriginalBytes += originalSize;\n this.stats.totalCompressedBytes += compressed.byteLength;\n this.stats.compressionTimeMs += elapsed;\n this.updateAverageRatio();\n\n logger.debug('[CompressionEngine] Compressed', {\n original: originalSize,\n compressed: compressed.byteLength,\n ratio: (compressionRatio * 100).toFixed(1) + '%',\n algorithm,\n timeMs: elapsed.toFixed(2),\n });\n\n return batch;\n }\n\n /**\n * Decompress data\n */\n async decompress(batch: CompressedBatch): Promise<Uint8Array> {\n const startTime = performance.now();\n\n let decompressed: Uint8Array;\n\n if (batch.algorithm === 'none') {\n decompressed = batch.compressed;\n } else if (this.supportsNativeCompression()) {\n try {\n decompressed = await this.decompressNative(\n batch.compressed,\n batch.algorithm\n );\n } catch (error) {\n logger.warn('[CompressionEngine] Native decompression failed', error);\n throw error;\n }\n } else {\n throw new Error('Native decompression not available');\n }\n\n // Update stats\n const elapsed = performance.now() - startTime;\n this.stats.totalDecompressed++;\n this.stats.decompressionTimeMs += elapsed;\n\n logger.debug('[CompressionEngine] Decompressed', {\n compressed: batch.compressedSize,\n decompressed: decompressed.byteLength,\n algorithm: batch.algorithm,\n timeMs: elapsed.toFixed(2),\n });\n\n return decompressed;\n }\n\n /**\n * Compress using native CompressionStream\n */\n private async compressNative(\n data: Uint8Array,\n algorithm: 'gzip' | 'deflate'\n ): Promise<Uint8Array> {\n const stream = new CompressionStream(algorithm);\n const writer = stream.writable.getWriter();\n const reader = stream.readable.getReader();\n\n writer.write(\n new Uint8Array(\n data.buffer,\n data.byteOffset,\n data.byteLength\n ) as BufferSource\n );\n writer.close();\n\n const chunks: Uint8Array[] = [];\n let done = false;\n\n while (!done) {\n const result = await reader.read();\n done = result.done;\n if (result.value) {\n chunks.push(result.value);\n }\n }\n\n // Combine chunks\n const totalLength = chunks.reduce((sum, chunk) => sum + chunk.length, 0);\n const combined = new Uint8Array(totalLength);\n let offset = 0;\n for (const chunk of chunks) {\n combined.set(chunk, offset);\n offset += chunk.length;\n }\n\n return combined;\n }\n\n /**\n * Decompress using native DecompressionStream\n */\n private async decompressNative(\n data: Uint8Array,\n algorithm: 'gzip' | 'deflate'\n ): Promise<Uint8Array> {\n const stream = new DecompressionStream(algorithm);\n const writer = stream.writable.getWriter();\n const reader = stream.readable.getReader();\n\n writer.write(\n new Uint8Array(\n data.buffer,\n data.byteOffset,\n data.byteLength\n ) as BufferSource\n );\n writer.close();\n\n const chunks: Uint8Array[] = [];\n let done = false;\n\n while (!done) {\n const result = await reader.read();\n done = result.done;\n if (result.value) {\n chunks.push(result.value);\n }\n }\n\n // Combine chunks\n const totalLength = chunks.reduce((sum, chunk) => sum + chunk.length, 0);\n const combined = new Uint8Array(totalLength);\n let offset = 0;\n for (const chunk of chunks) {\n combined.set(chunk, offset);\n offset += chunk.length;\n }\n\n return combined;\n }\n\n /**\n * Split compressed batch into chunks for transmission\n */\n splitIntoChunks(\n batch: CompressedBatch,\n chunkSize = 64 * 1024\n ): CompressedChunk[] {\n const chunks: CompressedChunk[] = [];\n const data = batch.compressed;\n const total = Math.ceil(data.byteLength / chunkSize);\n\n for (let i = 0; i < total; i++) {\n const start = i * chunkSize;\n const end = Math.min(start + chunkSize, data.byteLength);\n const chunkData = data.slice(start, end);\n\n chunks.push({\n chunkId: `${batch.id}-chunk-${i}`,\n batchId: batch.id,\n data: chunkData,\n index: i,\n total,\n checksum: this.simpleChecksum(chunkData),\n });\n }\n\n return chunks;\n }\n\n /**\n * Reassemble chunks into compressed batch\n */\n reassembleChunks(chunks: CompressedChunk[]): Uint8Array {\n // Sort by index\n const sorted = [...chunks].sort((a, b) => a.index - b.index);\n\n // Verify all chunks present\n if (sorted.length === 0) {\n throw new Error('Cannot reassemble: no chunks provided');\n }\n const total = sorted[0].total;\n if (sorted.length !== total) {\n throw new Error(\n `Missing chunks: got ${sorted.length}, expected ${total}`\n );\n }\n\n // Combine\n const totalLength = sorted.reduce(\n (sum, chunk) => sum + chunk.data.length,\n 0\n );\n const combined = new Uint8Array(totalLength);\n let offset = 0;\n\n for (const chunk of sorted) {\n combined.set(chunk.data, offset);\n offset += chunk.data.length;\n }\n\n return combined;\n }\n\n /**\n * Simple checksum for chunk verification\n */\n private simpleChecksum(data: Uint8Array): string {\n let hash = 0;\n for (let i = 0; i < data.length; i++) {\n hash = ((hash << 5) - hash + data[i]) | 0;\n }\n return (hash >>> 0).toString(16);\n }\n\n /**\n * Update average compression ratio\n */\n private updateAverageRatio(): void {\n if (this.stats.totalOriginalBytes > 0) {\n this.stats.averageCompressionRatio =\n 1 - this.stats.totalCompressedBytes / this.stats.totalOriginalBytes;\n }\n }\n\n /**\n * Get statistics\n */\n getStats(): CompressionStats {\n return { ...this.stats };\n }\n\n /**\n * Reset statistics\n */\n resetStats(): void {\n this.stats = {\n totalCompressed: 0,\n totalDecompressed: 0,\n totalOriginalBytes: 0,\n totalCompressedBytes: 0,\n averageCompressionRatio: 0,\n compressionTimeMs: 0,\n decompressionTimeMs: 0,\n };\n }\n}\n\n// ============================================================================\n// Singleton Instance\n// ============================================================================\n\nlet compressionEngineInstance: CompressionEngine | null = null;\n\nexport function getCompressionEngine(): CompressionEngine {\n if (!compressionEngineInstance) {\n compressionEngineInstance = new CompressionEngine();\n }\n return compressionEngineInstance;\n}\n\nexport function resetCompressionEngine(): void {\n compressionEngineInstance = null;\n}\n","/**\n * Delta Sync Optimizer (Phase 12)\n *\n * Implements field-level change detection to reduce payload size.\n * Computes delta between current and previous operation state.\n *\n * Performance Impact:\n * - Delta sync alone: 70-80% payload reduction\n * - Combined with compression: 80-90% total reduction\n */\n\nimport { getLogger } from '../utils/logger';\nimport type { Operation } from '../core/types';\n\nconst logger = getLogger();\n\n// ============================================================================\n// Types\n// ============================================================================\n\n/**\n * Delta operation - represents only changed fields\n */\nexport interface DeltaOperation {\n id: string;\n type: 'full' | 'delta';\n operationId: string;\n operationType: Operation['type'];\n sessionId: string;\n timestamp: number;\n changes?: Record<string, unknown>; // Only for delta type\n changeMask?: string[]; // Field names that changed\n fullData?: Record<string, unknown>; // Only for full type (new records)\n priority?: 'high' | 'normal' | 'low';\n}\n\n/**\n * Batch of delta operations\n */\nexport interface DeltaBatch {\n batchId: string;\n operations: DeltaOperation[];\n timestamp: number;\n totalOriginalSize: number;\n totalDeltaSize: number;\n reductionPercent: number;\n}\n\n/**\n * Statistics about delta sync performance\n */\nexport interface DeltaStats {\n totalOperations: number;\n totalFull: number;\n totalDelta: number;\n totalOriginalSize: number;\n totalDeltaSize: number;\n averageReductionPercent: number;\n lastSyncTime: number;\n fullOperationThreshold: number;\n}\n\n// ============================================================================\n// Delta Sync Optimizer\n// ============================================================================\n\nexport class DeltaSyncOptimizer {\n private static readonly MAX_HISTORY_SIZE = 10000;\n private operationHistory: Map<string, Operation> = new Map();\n private stats: DeltaStats = {\n totalOperations: 0,\n totalFull: 0,\n totalDelta: 0,\n totalOriginalSize: 0,\n totalDeltaSize: 0,\n averageReductionPercent: 0,\n lastSyncTime: 0,\n fullOperationThreshold: 1000, // Force full if delta > 1KB\n };\n\n constructor(fullOperationThreshold = 1000) {\n this.stats.fullOperationThreshold = fullOperationThreshold;\n logger.debug('[DeltaSyncOptimizer] Initialized', {\n threshold: fullOperationThreshold,\n });\n }\n\n /**\n * Compute delta for single operation\n */\n computeDelta(operation: Operation): DeltaOperation {\n const operationJson = JSON.stringify(operation);\n const originalSize = new TextEncoder().encode(operationJson).byteLength;\n\n // Check if we have historical state\n const previous = this.operationHistory.get(operation.id);\n\n if (!previous) {\n // New operation - return as full\n const delta: DeltaOperation = {\n id: `delta-${Date.now()}-${Math.random().toString(36).slice(2)}`,\n type: 'full',\n operationId: operation.id,\n operationType: operation.type,\n sessionId: operation.sessionId,\n timestamp: Date.now(),\n fullData: operation.data,\n priority: operation.priority,\n };\n\n // Update stats\n this.stats.totalOperations++;\n this.stats.totalFull++;\n this.stats.totalOriginalSize += originalSize;\n\n const deltaSize = new TextEncoder().encode(\n JSON.stringify(delta)\n ).byteLength;\n this.stats.totalDeltaSize += deltaSize;\n\n // Store in history (evict oldest if over limit)\n this.operationHistory.set(operation.id, operation);\n if (this.operationHistory.size > DeltaSyncOptimizer.MAX_HISTORY_SIZE) {\n const firstKey = this.operationHistory.keys().next().value;\n if (firstKey !== undefined) this.operationHistory.delete(firstKey);\n }\n\n return delta;\n }\n\n // Compare with previous - extract changed fields\n const changes: Record<string, unknown> = {};\n const changeMask: string[] = [];\n let hasMeaningfulChanges = false;\n\n for (const [key, value] of Object.entries(operation.data)) {\n const oldValue = previous.data[key];\n\n if (!this.deepEqual(value, oldValue)) {\n changes[key] = value;\n changeMask.push(key);\n hasMeaningfulChanges = true;\n }\n }\n\n // Check for deleted fields\n for (const key of Object.keys(previous.data)) {\n if (!(key in operation.data)) {\n changes[key] = null;\n changeMask.push(`${key}:deleted`);\n hasMeaningfulChanges = true;\n }\n }\n\n // Build delta operation\n const deltaData: DeltaOperation = {\n id: `delta-${Date.now()}-${Math.random().toString(36).slice(2)}`,\n type: 'delta',\n operationId: operation.id,\n operationType: operation.type,\n sessionId: operation.sessionId,\n timestamp: Date.now(),\n changes: hasMeaningfulChanges ? changes : undefined,\n changeMask: hasMeaningfulChanges ? changeMask : undefined,\n priority: operation.priority,\n };\n\n // If delta is too large, send as full instead\n const deltaSize = new TextEncoder().encode(\n JSON.stringify(deltaData)\n ).byteLength;\n\n const finalDelta =\n deltaSize > this.stats.fullOperationThreshold\n ? {\n ...deltaData,\n type: 'full' as const,\n fullData: operation.data,\n changes: undefined,\n changeMask: undefined,\n }\n : deltaData;\n\n // Update stats\n this.stats.totalOperations++;\n if (finalDelta.type === 'full') {\n this.stats.totalFull++;\n } else {\n this.stats.totalDelta++;\n }\n\n this.stats.totalOriginalSize += originalSize;\n this.stats.totalDeltaSize += deltaSize;\n\n // Update history (evict oldest if over limit)\n this.operationHistory.set(operation.id, operation);\n if (this.operationHistory.size > DeltaSyncOptimizer.MAX_HISTORY_SIZE) {\n const firstKey = this.operationHistory.keys().next().value;\n if (firstKey !== undefined) this.operationHistory.delete(firstKey);\n }\n\n return finalDelta;\n }\n\n /**\n * Compute deltas for batch of operations\n */\n computeBatchDeltas(operations: Operation[]): DeltaBatch {\n const deltas = operations.map((op) => this.computeDelta(op));\n\n const totalOriginalSize = operations.reduce(\n (sum, op) =>\n sum + new TextEncoder().encode(JSON.stringify(op)).byteLength,\n 0\n );\n\n const totalDeltaSize = deltas.reduce(\n (sum, delta) =>\n sum + new TextEncoder().encode(JSON.stringify(delta)).byteLength,\n 0\n );\n\n const reductionPercent =\n totalOriginalSize > 0\n ? Math.round(\n ((totalOriginalSize - totalDeltaSize) / totalOriginalSize) * 100\n )\n : 0;\n\n const batch: DeltaBatch = {\n batchId: `batch-${Date.now()}-${Math.random().toString(36).slice(2)}`,\n operations: deltas,\n timestamp: Date.now(),\n totalOriginalSize,\n totalDeltaSize,\n reductionPercent,\n };\n\n logger.debug('[DeltaSyncOptimizer] Batch computed', {\n operations: operations.length,\n reduction: reductionPercent,\n size: totalDeltaSize,\n });\n\n return batch;\n }\n\n /**\n * Decompress delta operation back to full operation\n */\n decompressDelta(delta: DeltaOperation): Operation {\n if (delta.type === 'full') {\n return {\n id: delta.operationId,\n type: delta.operationType,\n sessionId: delta.sessionId,\n data: delta.fullData || {},\n status: 'pending',\n createdAt: delta.timestamp,\n };\n }\n\n const previous = this.operationHistory.get(delta.operationId);\n\n if (!previous) {\n logger.warn('[DeltaSyncOptimizer] Cannot decompress - no history', {\n operationId: delta.operationId,\n });\n\n return {\n id: delta.operationId,\n type: delta.operationType,\n sessionId: delta.sessionId,\n data: delta.changes || {},\n status: 'pending',\n createdAt: delta.timestamp,\n };\n }\n\n // Apply changes to historical state\n const reconstructed = {\n ...previous,\n data: {\n ...previous.data,\n ...(delta.changes || {}),\n },\n };\n\n // Remove null fields (marked as deleted)\n if (delta.changes) {\n for (const [key, value] of Object.entries(delta.changes)) {\n if (value === null) {\n delete reconstructed.data[key];\n }\n }\n }\n\n return reconstructed;\n }\n\n /**\n * Update history after successful sync\n */\n updateHistory(operations: Operation[]): void {\n for (const op of operations) {\n this.operationHistory.set(op.id, op);\n }\n // Evict oldest entries if over limit\n while (this.operationHistory.size > DeltaSyncOptimizer.MAX_HISTORY_SIZE) {\n const firstKey = this.operationHistory.keys().next().value;\n if (firstKey !== undefined) this.operationHistory.delete(firstKey);\n else break;\n }\n\n logger.debug('[DeltaSyncOptimizer] History updated', {\n count: operations.length,\n totalHistorySize: this.operationHistory.size,\n });\n }\n\n /**\n * Clear history for specific operations\n */\n clearHistory(operationIds: string[]): void {\n for (const id of operationIds) {\n this.operationHistory.delete(id);\n }\n\n logger.debug('[DeltaSyncOptimizer] History cleared', {\n cleared: operationIds.length,\n remaining: this.operationHistory.size,\n });\n }\n\n /**\n * Get current performance statistics\n */\n getStats(): DeltaStats {\n if (this.stats.totalOperations > 0) {\n this.stats.averageReductionPercent = Math.round(\n ((this.stats.totalOriginalSize - this.stats.totalDeltaSize) /\n this.stats.totalOriginalSize) *\n 100\n );\n }\n\n return { ...this.stats };\n }\n\n /**\n * Reset statistics\n */\n resetStats(): void {\n this.stats = {\n totalOperations: 0,\n totalFull: 0,\n totalDelta: 0,\n totalOriginalSize: 0,\n totalDeltaSize: 0,\n averageReductionPercent: 0,\n lastSyncTime: 0,\n fullOperationThreshold: this.stats.fullOperationThreshold,\n };\n\n logger.debug('[DeltaSyncOptimizer] Stats reset');\n }\n\n /**\n * Set the full operation threshold\n */\n setFullOperationThreshold(bytes: number): void {\n this.stats.fullOperationThreshold = bytes;\n logger.debug('[DeltaSyncOptimizer] Threshold updated', { bytes });\n }\n\n /**\n * Get history size for memory monitoring\n */\n getHistorySize(): number {\n return this.operationHistory.size;\n }\n\n /**\n * Get memory footprint estimate\n */\n getMemoryEstimate(): number {\n let totalBytes = 0;\n\n for (const op of this.operationHistory.values()) {\n totalBytes += new TextEncoder().encode(JSON.stringify(op)).byteLength;\n }\n\n return totalBytes;\n }\n\n /**\n * Deep equality check for nested objects\n */\n private deepEqual(a: unknown, b: unknown): boolean {\n if (a === b) return true;\n if (a == null || b == null) return false;\n if (typeof a !== 'object' || typeof b !== 'object') return false;\n\n const aObj = a as Record<string, unknown>;\n const bObj = b as Record<string, unknown>;\n\n const aKeys = Object.keys(aObj);\n const bKeys = Object.keys(bObj);\n\n if (aKeys.length !== bKeys.length) return false;\n\n for (const key of aKeys) {\n if (!this.deepEqual(aObj[key], bObj[key])) {\n return false;\n }\n }\n\n return true;\n }\n}\n\n// ============================================================================\n// Singleton Instance\n// ============================================================================\n\nlet deltaSyncInstance: DeltaSyncOptimizer | null = null;\n\nexport function getDeltaSyncOptimizer(threshold?: number): DeltaSyncOptimizer {\n if (!deltaSyncInstance) {\n deltaSyncInstance = new DeltaSyncOptimizer(threshold);\n }\n return deltaSyncInstance;\n}\n\nexport function resetDeltaSyncOptimizer(): void {\n deltaSyncInstance = null;\n}\n","/**\n * Compression Codecs — Pluggable implementations for topological compression.\n *\n * Each codec implements the same interface. The TopologicalCompressor races\n * them per chunk — different data regions get different codecs automatically.\n *\n * Pure-JS codecs (0-3, 6-7) — zero dependencies, work everywhere.\n * Platform codecs (4-5) wrap node:zlib for brotli/gzip when available.\n *\n * Codec lineup:\n * 0: Raw (identity) 4: Brotli (node:zlib)\n * 1: RLE 5: Gzip (node:zlib)\n * 2: Delta 6: Huffman (entropy coding)\n * 3: LZ77 7: Dictionary (web content)\n */\n\n// ============================================================================\n// Codec Interface\n// ============================================================================\n\nexport interface CompressionCodec {\n /** Unique identifier (stored in compressed frame header) */\n readonly id: number;\n /** Human-readable name */\n readonly name: string;\n /** Compress data. Returns compressed bytes (may be larger than input). */\n encode(data: Uint8Array): Uint8Array;\n /** Decompress data back to original. */\n decode(data: Uint8Array, originalSize: number): Uint8Array;\n}\n\n// ============================================================================\n// Codec 0: Raw (Identity)\n// ============================================================================\n\nexport class RawCodec implements CompressionCodec {\n readonly id = 0;\n readonly name = 'raw';\n\n encode(data: Uint8Array): Uint8Array {\n return data;\n }\n\n decode(data: Uint8Array): Uint8Array {\n return data;\n }\n}\n\n// ============================================================================\n// Codec 1: Run-Length Encoding\n// ============================================================================\n\n/**\n * RLE — excellent for data with long runs of repeated bytes.\n *\n * Format: [byte, count_high, count_low] triplets.\n * Count is u16 (max run = 65535). Non-runs still emit count=1.\n *\n * Best for: repeated patterns, sparse data, zeroed buffers.\n * Worst for: high-entropy data (3x expansion).\n */\nexport class RLECodec implements CompressionCodec {\n readonly id = 1;\n readonly name = 'rle';\n\n encode(data: Uint8Array): Uint8Array {\n if (data.length === 0) return new Uint8Array(0);\n\n // Worst case: every byte is unique → 3x expansion\n const output = new Uint8Array(data.length * 3);\n let writePos = 0;\n let i = 0;\n\n while (i < data.length) {\n const byte = data[i];\n let runLength = 1;\n\n while (\n i + runLength < data.length &&\n data[i + runLength] === byte &&\n runLength < 65535\n ) {\n runLength++;\n }\n\n output[writePos++] = byte;\n output[writePos++] = (runLength >>> 8) & 0xff;\n output[writePos++] = runLength & 0xff;\n i += runLength;\n }\n\n return output.subarray(0, writePos);\n }\n\n decode(data: Uint8Array, originalSize: number): Uint8Array {\n const output = new Uint8Array(originalSize);\n let readPos = 0;\n let writePos = 0;\n\n while (readPos < data.length && writePos < originalSize) {\n const byte = data[readPos++];\n const count = (data[readPos++] << 8) | data[readPos++];\n const end = Math.min(writePos + count, originalSize);\n output.fill(byte, writePos, end);\n writePos = end;\n }\n\n return output;\n }\n}\n\n// ============================================================================\n// Codec 2: Delta Encoding\n// ============================================================================\n\n/**\n * Delta encoding — stores differences between consecutive bytes.\n *\n * Best for: sequential/incremental data, sensor readings, coordinates.\n * Worst for: random data (no benefit, slight overhead from first byte).\n */\nexport class DeltaCodec implements CompressionCodec {\n readonly id = 2;\n readonly name = 'delta';\n\n encode(data: Uint8Array): Uint8Array {\n if (data.length === 0) return new Uint8Array(0);\n\n const output = new Uint8Array(data.length);\n output[0] = data[0]; // First byte stored as-is\n for (let i = 1; i < data.length; i++) {\n output[i] = (data[i] - data[i - 1]) & 0xff;\n }\n return output;\n }\n\n decode(data: Uint8Array, originalSize: number): Uint8Array {\n const output = new Uint8Array(originalSize);\n if (data.length === 0) return output;\n\n output[0] = data[0];\n for (let i = 1; i < data.length && i < originalSize; i++) {\n output[i] = (output[i - 1] + data[i]) & 0xff;\n }\n return output;\n }\n}\n\n// ============================================================================\n// Codec 3: LZ77-Simple (Sliding Window)\n// ============================================================================\n\n/**\n * Simplified LZ77 — sliding window compression with back-references.\n *\n * Format: control byte per group of 8 items.\n * - Bit 0 = literal byte follows\n * - Bit 1 = back-reference follows: [offset_high:4 | length:4, offset_low:8]\n * offset = 12 bits (max 4095), length = 4 bits + 3 (range 3–18)\n *\n * Window size: 4096 bytes. Min match: 3. Max match: 18.\n *\n * Best for: general-purpose data with repeated patterns.\n * Worst for: truly random data (slight overhead from control bytes).\n */\nexport class LZ77Codec implements CompressionCodec {\n readonly id = 3;\n readonly name = 'lz77';\n\n private static readonly WINDOW_SIZE = 4096;\n private static readonly MIN_MATCH = 3;\n private static readonly MAX_MATCH = 18;\n\n encode(data: Uint8Array): Uint8Array {\n if (data.length === 0) return new Uint8Array(0);\n\n // Generous output buffer (worst case ~1.125x)\n const output = new Uint8Array(data.length + Math.ceil(data.length / 8) + 16);\n let writePos = 0;\n let readPos = 0;\n\n while (readPos < data.length) {\n const controlPos = writePos++;\n let controlByte = 0;\n\n for (let bit = 0; bit < 8 && readPos < data.length; bit++) {\n const windowStart = Math.max(0, readPos - LZ77Codec.WINDOW_SIZE);\n let bestOffset = 0;\n let bestLength = 0;\n\n // Find longest match in window\n for (let j = windowStart; j < readPos; j++) {\n let matchLen = 0;\n while (\n matchLen < LZ77Codec.MAX_MATCH &&\n readPos + matchLen < data.length &&\n data[j + matchLen] === data[readPos + matchLen]\n ) {\n matchLen++;\n }\n if (matchLen >= LZ77Codec.MIN_MATCH && matchLen > bestLength) {\n bestOffset = readPos - j;\n bestLength = matchLen;\n }\n }\n\n if (bestLength >= LZ77Codec.MIN_MATCH) {\n // Back-reference: set bit to 1\n controlByte |= 1 << bit;\n const lengthCode = bestLength - LZ77Codec.MIN_MATCH;\n output[writePos++] = ((bestOffset >>> 8) & 0x0f) | (lengthCode << 4);\n output[writePos++] = bestOffset & 0xff;\n readPos += bestLength;\n } else {\n // Literal: bit stays 0\n output[writePos++] = data[readPos++];\n }\n }\n\n output[controlPos] = controlByte;\n }\n\n return output.subarray(0, writePos);\n }\n\n decode(data: Uint8Array, originalSize: number): Uint8Array {\n const output = new Uint8Array(originalSize);\n let readPos = 0;\n let writePos = 0;\n\n while (readPos < data.length && writePos < originalSize) {\n const controlByte = data[readPos++];\n\n for (let bit = 0; bit < 8 && readPos < data.length && writePos < originalSize; bit++) {\n if (controlByte & (1 << bit)) {\n // Back-reference\n const byte1 = data[readPos++];\n const byte2 = data[readPos++];\n const offset = ((byte1 & 0x0f) << 8) | byte2;\n const length = (byte1 >>> 4) + LZ77Codec.MIN_MATCH;\n\n const srcStart = writePos - offset;\n for (let k = 0; k < length && writePos < originalSize; k++) {\n output[writePos++] = output[srcStart + k];\n }\n } else {\n // Literal\n output[writePos++] = data[readPos++];\n }\n }\n }\n\n return output;\n }\n}\n\n// ============================================================================\n// Codec 4: Brotli (node:zlib wrapper)\n// ============================================================================\n\n/**\n * Brotli via node:zlib — best general-purpose compression ratio.\n *\n * Only available on Node/Bun/Deno. The TopologicalCompressor races it\n * per-chunk against pure-JS codecs — brotli wins on text, raw wins on\n * already-compressed binary. This is the key insight: topological\n * compression adapts per-chunk even when one codec dominates globally.\n *\n * Quality 4 matches nginx on-the-fly default.\n */\nexport class BrotliCodec implements CompressionCodec {\n readonly id = 4;\n readonly name = 'brotli';\n\n private readonly quality: number;\n\n constructor(quality = 4) {\n this.quality = quality;\n }\n\n encode(data: Uint8Array): Uint8Array {\n try {\n const zlib = require('node:zlib');\n return new Uint8Array(zlib.brotliCompressSync(Buffer.from(data), {\n params: {\n [zlib.constants.BROTLI_PARAM_QUALITY]: this.quality,\n },\n }));\n } catch {\n // node:zlib unavailable (browser/CF Workers) — return raw (will be vented)\n return data;\n }\n }\n\n decode(data: Uint8Array): Uint8Array {\n const zlib = require('node:zlib');\n return new Uint8Array(zlib.brotliDecompressSync(Buffer.from(data)));\n }\n}\n\n// ============================================================================\n// Codec 5: Gzip (node:zlib wrapper)\n// ============================================================================\n\n/**\n * Gzip via node:zlib — universal fallback, slightly worse ratio than brotli.\n *\n * Level 6 matches nginx default.\n */\nexport class GzipCodec implements CompressionCodec {\n readonly id = 5;\n readonly name = 'gzip';\n\n private readonly level: number;\n\n constructor(level = 6) {\n this.level = level;\n }\n\n encode(data: Uint8Array): Uint8Array {\n try {\n const zlib = require('node:zlib');\n return new Uint8Array(zlib.gzipSync(Buffer.from(data), {\n level: this.level,\n }));\n } catch {\n return data;\n }\n }\n\n decode(data: Uint8Array): Uint8Array {\n const zlib = require('node:zlib');\n return new Uint8Array(zlib.gunzipSync(Buffer.from(data)));\n }\n}\n\n// ============================================================================\n// Codec 6: Huffman Coding (Pure JS)\n// ============================================================================\n\n/**\n * Canonical Huffman coding — entropy-optimal per-byte compression.\n *\n * Captures the entropy coding stage of Zstandard/DEFLATE. Pure JS,\n * works everywhere. Excels on data with skewed byte distributions\n * where a few byte values dominate.\n *\n * Format:\n * [0..255] u8×256 code_lengths (one per possible byte value)\n * [256..259] u32 total_bits in the encoded stream\n * [260..] packed bits (MSB-first)\n *\n * Overhead: 260 bytes. Only wins on chunks where entropy coding\n * saves more than 260 bytes — the race handles this automatically.\n */\nexport class HuffmanCodec implements CompressionCodec {\n readonly id = 6;\n readonly name = 'huffman';\n\n encode(data: Uint8Array): Uint8Array {\n if (data.length < 32) return data; // too small for 260-byte overhead\n\n // Count byte frequencies\n const freq = new Uint32Array(256);\n for (let i = 0; i < data.length; i++) freq[data[i]]++;\n\n // Collect symbols with non-zero frequency\n const symbols: Array<{ sym: number; freq: number }> = [];\n for (let i = 0; i < 256; i++) {\n if (freq[i] > 0) symbols.push({ sym: i, freq: freq[i] });\n }\n if (symbols.length <= 1) return data; // single symbol — can't Huffman-encode\n\n // Build Huffman tree using sorted-array priority queue\n type HNode = { freq: number; sym: number; left: number; right: number };\n const nodes: HNode[] = symbols.map(s => ({\n freq: s.freq, sym: s.sym, left: -1, right: -1,\n }));\n const heap = [...nodes];\n heap.sort((a, b) => a.freq - b.freq);\n\n while (heap.length > 1) {\n const left = heap.shift()!;\n const right = heap.shift()!;\n const leftIdx = nodes.indexOf(left);\n const rightIdx = nodes.indexOf(right);\n const parent: HNode = {\n freq: left.freq + right.freq, sym: -1,\n left: leftIdx, right: rightIdx,\n };\n nodes.push(parent);\n let idx = 0;\n while (idx < heap.length && heap[idx].freq <= parent.freq) idx++;\n heap.splice(idx, 0, parent);\n }\n\n // Extract code lengths via DFS\n const codeLengths = new Uint8Array(256);\n const root = nodes.length - 1;\n const dfs = (nodeIdx: number, depth: number): void => {\n const node = nodes[nodeIdx];\n if (node.left === -1 && node.right === -1) {\n codeLengths[node.sym] = depth || 1;\n return;\n }\n if (node.left >= 0) dfs(node.left, depth + 1);\n if (node.right >= 0) dfs(node.right, depth + 1);\n };\n dfs(root, 0);\n\n // Bail if any code exceeds 15 bits (pathological distribution)\n for (let i = 0; i < 256; i++) {\n if (codeLengths[i] > 15) return data;\n }\n\n // Generate canonical codes from sorted (length, symbol) pairs\n const sorted: Array<{ sym: number; len: number }> = [];\n for (let i = 0; i < 256; i++) {\n if (codeLengths[i] > 0) sorted.push({ sym: i, len: codeLengths[i] });\n }\n sorted.sort((a, b) => a.len - b.len || a.sym - b.sym);\n\n const codes = new Uint32Array(256);\n let code = 0;\n let prevLen = sorted[0].len;\n codes[sorted[0].sym] = 0;\n for (let i = 1; i < sorted.length; i++) {\n code = (code + 1) << (sorted[i].len - prevLen);\n codes[sorted[i].sym] = code;\n prevLen = sorted[i].len;\n }\n\n // Calculate total bits\n let totalBits = 0;\n for (let i = 0; i < data.length; i++) totalBits += codeLengths[data[i]];\n const totalBytes = Math.ceil(totalBits / 8);\n\n // Pack: [codeLengths:256][totalBits:u32][packedBits]\n const headerSize = 260;\n const output = new Uint8Array(headerSize + totalBytes);\n output.set(codeLengths, 0);\n new DataView(output.buffer).setUint32(256, totalBits);\n\n let bitPos = 0;\n for (let i = 0; i < data.length; i++) {\n const sym = data[i];\n const codeVal = codes[sym];\n const codeLen = codeLengths[sym];\n for (let b = codeLen - 1; b >= 0; b--) {\n if ((codeVal >>> b) & 1) {\n const byteIdx = headerSize + (bitPos >>> 3);\n output[byteIdx] |= 1 << (7 - (bitPos & 7));\n }\n bitPos++;\n }\n }\n\n return output;\n }\n\n decode(data: Uint8Array, originalSize: number): Uint8Array {\n if (data.length < 260) return data.subarray(0, originalSize);\n\n // Read code lengths and total bits\n const codeLengths = data.subarray(0, 256);\n const totalBits = new DataView(\n data.buffer, data.byteOffset + 256, 4,\n ).getUint32(0);\n\n // Reconstruct canonical codes and build decode tree\n const sorted: Array<{ sym: number; len: number }> = [];\n for (let i = 0; i < 256; i++) {\n if (codeLengths[i] > 0) sorted.push({ sym: i, len: codeLengths[i] });\n }\n sorted.sort((a, b) => a.len - b.len || a.sym - b.sym);\n\n // Build binary tree: each node is [leftChild, rightChild, symbol]\n // -1 = no child/no symbol\n const tree: Array<[number, number, number]> = [[-1, -1, -1]];\n const insertCode = (codeVal: number, len: number, sym: number): void => {\n let node = 0;\n for (let b = len - 1; b >= 0; b--) {\n const bit = (codeVal >>> b) & 1;\n if (tree[node][bit] === -1) {\n tree[node][bit] = tree.length;\n tree.push([-1, -1, -1]);\n }\n node = tree[node][bit];\n }\n tree[node][2] = sym;\n };\n\n let code = 0;\n let prevLen = sorted[0].len;\n insertCode(0, sorted[0].len, sorted[0].sym);\n for (let i = 1; i < sorted.length; i++) {\n code = (code + 1) << (sorted[i].len - prevLen);\n insertCode(code, sorted[i].len, sorted[i].sym);\n prevLen = sorted[i].len;\n }\n\n // Decode bits\n const output = new Uint8Array(originalSize);\n let bitPos = 0;\n let outPos = 0;\n const bitsStart = 260;\n\n while (outPos < originalSize && bitPos < totalBits) {\n let node = 0;\n while (tree[node][2] === -1 && bitPos < totalBits) {\n const byteIdx = bitsStart + (bitPos >>> 3);\n const bit = (data[byteIdx] >>> (7 - (bitPos & 7))) & 1;\n node = tree[node][bit];\n bitPos++;\n }\n if (tree[node][2] !== -1) {\n output[outPos++] = tree[node][2];\n }\n }\n\n return output;\n }\n}\n\n// ============================================================================\n// Codec 7: Dictionary Codec (Pure JS, Web-Content Domain)\n// ============================================================================\n\n/**\n * Domain-specific dictionary substitution for web content.\n *\n * Pre-seeded with common HTML, CSS, and JavaScript byte patterns.\n * Replaces matches with 2-byte escape codes: [0x00, index].\n * Literal null bytes are escaped as [0x00, 0x00].\n *\n * Excels on web bundles where repeated keywords, tags, and CSS\n * properties appear frequently. The race picks this codec for\n * text-heavy chunks where dictionary matches are plentiful.\n *\n * Entries sorted longest-first for greedy matching.\n */\n\nconst DICTIONARY_STRINGS = [\n // Long patterns first (most savings per match)\n 'addEventListener', // 16 bytes → 2 = saves 14\n 'querySelector', // 13 → 2 = saves 11\n 'createElement', // 13 → 2 = saves 11\n 'justify-content', // 15 → 2 = saves 13\n 'align-items:center', // 19 → 2 = saves 17\n 'textContent', // 11 → 2 = saves 9\n 'display:flex', // 12 → 2 = saves 10\n 'display:grid', // 12 → 2 = saves 10\n 'display:none', // 12 → 2 = saves 10\n 'background:', // 11 → 2 = saves 9\n 'font-weight:', // 12 → 2 = saves 10\n 'font-size:', // 10 → 2 = saves 8\n 'className', // 9 → 2 = saves 7\n 'undefined', // 9 → 2 = saves 7\n 'container', // 9 → 2 = saves 7\n 'transform:', // 10 → 2 = saves 8\n 'overflow:', // 9 → 2 = saves 7\n 'position:', // 9 → 2 = saves 7\n 'function ', // 9 → 2 = saves 7\n 'children', // 8 → 2 = saves 6\n 'document', // 8 → 2 = saves 6\n 'display:', // 8 → 2 = saves 6\n 'padding:', // 8 → 2 = saves 6\n 'onClick', // 7 → 2 = saves 5\n 'useState', // 8 → 2 = saves 6\n 'https://', // 8 → 2 = saves 6\n 'default', // 7 → 2 = saves 5\n 'extends', // 7 → 2 = saves 5\n 'return ', // 7 → 2 = saves 5\n 'export ', // 7 → 2 = saves 5\n 'import ', // 7 → 2 = saves 5\n 'margin:', // 7 → 2 = saves 5\n 'border:', // 7 → 2 = saves 5\n 'cursor:', // 7 → 2 = saves 5\n 'height:', // 7 → 2 = saves 5\n '</span>', // 7 → 2 = saves 5\n 'color:', // 6 → 2 = saves 4\n 'width:', // 6 → 2 = saves 4\n 'const ', // 6 → 2 = saves 4\n 'class ', // 6 → 2 = saves 4\n '</div>', // 6 → 2 = saves 4\n '<span ', // 6 → 2 = saves 4\n '<div ', // 5 → 2 = saves 3\n 'async', // 5 → 2 = saves 3\n 'await', // 5 → 2 = saves 3\n 'false', // 5 → 2 = saves 3\n 'this.', // 5 → 2 = saves 3\n 'props', // 5 → 2 = saves 3\n 'state', // 5 → 2 = saves 3\n '</p>', // 4 → 2 = saves 2\n 'null', // 4 → 2 = saves 2\n 'true', // 4 → 2 = saves 2\n 'flex', // 4 → 2 = saves 2\n 'grid', // 4 → 2 = saves 2\n 'none', // 4 → 2 = saves 2\n 'auto', // 4 → 2 = saves 2\n 'self', // 4 → 2 = saves 2\n '.css', // 4 → 2 = saves 2\n '.com', // 4 → 2 = saves 2\n 'var(', // 4 → 2 = saves 2\n '<p>', // 3 → 2 = saves 1\n '.js', // 3 → 2 = saves 1\n 'px;', // 3 → 2 = saves 1\n 'rem', // 3 → 2 = saves 1\n];\n\n/** Pre-encoded dictionary entries as byte arrays, sorted longest-first */\nconst DICTIONARY: Uint8Array[] = DICTIONARY_STRINGS.map(\n s => new TextEncoder().encode(s),\n);\n\nexport class DictionaryCodec implements CompressionCodec {\n readonly id = 7;\n readonly name = 'dictionary';\n\n encode(data: Uint8Array): Uint8Array {\n if (data.length < 4) return data;\n\n const output: number[] = [];\n let pos = 0;\n\n while (pos < data.length) {\n let matched = false;\n\n // Greedy: try entries from longest to shortest\n for (let idx = 0; idx < DICTIONARY.length; idx++) {\n const entry = DICTIONARY[idx];\n if (pos + entry.length > data.length) continue;\n\n let match = true;\n for (let j = 0; j < entry.length; j++) {\n if (data[pos + j] !== entry[j]) { match = false; break; }\n }\n\n if (match) {\n output.push(0x00, idx + 1); // escape + 1-indexed entry\n pos += entry.length;\n matched = true;\n break;\n }\n }\n\n if (!matched) {\n if (data[pos] === 0x00) {\n output.push(0x00, 0x00); // escape literal null\n } else {\n output.push(data[pos]);\n }\n pos++;\n }\n }\n\n return new Uint8Array(output);\n }\n\n decode(data: Uint8Array, originalSize: number): Uint8Array {\n const output: number[] = [];\n let pos = 0;\n\n while (pos < data.length && output.length < originalSize) {\n if (data[pos] === 0x00) {\n pos++;\n if (data[pos] === 0x00) {\n output.push(0x00); // literal null\n } else {\n const entry = DICTIONARY[data[pos] - 1];\n for (let j = 0; j < entry.length; j++) output.push(entry[j]);\n }\n pos++;\n } else {\n output.push(data[pos]);\n pos++;\n }\n }\n\n return new Uint8Array(output);\n }\n}\n\n// ============================================================================\n// Codec Registry\n// ============================================================================\n\n/** Pure-JS codecs — zero dependencies, work everywhere */\nexport const PURE_JS_CODECS: CompressionCodec[] = [\n new RawCodec(),\n new RLECodec(),\n new DeltaCodec(),\n new LZ77Codec(),\n new HuffmanCodec(),\n new DictionaryCodec(),\n];\n\n/** All built-in codecs including platform codecs (brotli/gzip via node:zlib) */\nexport const BUILTIN_CODECS: CompressionCodec[] = [\n ...PURE_JS_CODECS,\n new BrotliCodec(),\n new GzipCodec(),\n];\n\n/** Codec registry map for O(1) lookup */\nconst CODEC_MAP = new Map<number, CompressionCodec>(\n BUILTIN_CODECS.map(c => [c.id, c]),\n);\n\n/** Look up a codec by ID */\nexport function getCodecById(id: number): CompressionCodec {\n const codec = CODEC_MAP.get(id);\n if (!codec) {\n throw new Error(`Unknown codec ID: ${id}`);\n }\n return codec;\n}\n","/**\n * Topological Compressor — Fork/Race/Fold Applied to Compression\n *\n * Two-level fork/race/fold:\n *\n * LEVEL 1 (stream): Fork the entire input into global strategies.\n * - Path A: Global brotli on the whole stream (cross-chunk dictionary)\n * - Path B: Global gzip on the whole stream\n * - Path C: Per-chunk topological compression (Level 2)\n * Race all paths. Fold to smallest.\n *\n * LEVEL 2 (chunk): For each chunk, fork all codecs.\n * - Race codecs per chunk. Smallest wins.\n * - Vent codecs whose output >= raw.\n * - Fold: self-describing frame per chunk.\n *\n * Stream-level format (when streamRace is enabled):\n * [0] u8 strategy (0 = per-chunk, N>0 = global codec ID)\n * [1..4] u32 original_size\n * [5..] [u8] compressed data\n *\n * Per-chunk frame format:\n * [0] u8 codec_id\n * [1..4] u32 original_size\n * [5..8] u32 compressed_size\n * [9..] [u8] compressed_data\n *\n * Zero dependencies. Works on CF Workers, Deno, Node, Bun, browsers.\n */\n\nimport type { CompressionCodec } from './codecs';\nimport { BUILTIN_CODECS, getCodecById } from './codecs';\n\n// ============================================================================\n// Types\n// ============================================================================\n\n/** Per-chunk compression result — which codec won and why */\nexport interface ChunkResult {\n /** Index of this chunk in the original data */\n chunkIndex: number;\n /** The codec that won the race for this chunk */\n codecId: number;\n /** Codec name (for diagnostics) */\n codecName: string;\n /** Original size of this chunk in bytes */\n originalSize: number;\n /** Compressed size of this chunk in bytes (including 9-byte header) */\n compressedSize: number;\n /** Compression ratio for this chunk (0 = no compression, 1 = perfect) */\n ratio: number;\n /** How many codecs were vented (output >= input) */\n vented: number;\n}\n\n/** Overall compression result */\nexport interface TopologicalCompressionResult {\n /** The compressed output — concatenated self-describing frames */\n data: Uint8Array;\n /** Per-chunk results */\n chunks: ChunkResult[];\n /** Total original size */\n originalSize: number;\n /** Total compressed size */\n compressedSize: number;\n /** Overall compression ratio */\n ratio: number;\n /** Number of distinct codecs used across all chunks */\n codecsUsed: number;\n /** β₁ during compression (number of parallel codec paths - 1) */\n bettiNumber: number;\n /** Compression time in milliseconds */\n timeMs: number;\n /** Strategy that won the stream-level race (only set when streamRace=true) */\n strategy?: string;\n}\n\n/** Compressor configuration */\nexport interface TopologicalCompressorConfig {\n /** Chunk size in bytes. Smaller = more adaptive, larger = better ratio. */\n chunkSize: number;\n /** Codecs to race. Default: all built-in codecs. */\n codecs: CompressionCodec[];\n /** Enable two-level race: global codecs vs per-chunk topological. Default: false. */\n streamRace?: boolean;\n}\n\n// ============================================================================\n// Self-Describing Chunk Header (9 bytes)\n// ============================================================================\n\nconst CHUNK_HEADER_SIZE = 9;\n\nfunction encodeChunkHeader(\n codecId: number,\n originalSize: number,\n compressedSize: number,\n): Uint8Array {\n const header = new Uint8Array(CHUNK_HEADER_SIZE);\n const view = new DataView(header.buffer);\n header[0] = codecId;\n view.setUint32(1, originalSize);\n view.setUint32(5, compressedSize);\n return header;\n}\n\nfunction decodeChunkHeader(\n data: Uint8Array,\n offset: number,\n): { codecId: number; originalSize: number; compressedSize: number } {\n const codecId = data[offset];\n const view = new DataView(data.buffer, data.byteOffset + offset + 1, 8);\n const originalSize = view.getUint32(0);\n const compressedSize = view.getUint32(4);\n return { codecId, originalSize, compressedSize };\n}\n\n// ============================================================================\n// Stream-Level Header (5 bytes) — only present when streamRace=true\n// ============================================================================\n\nconst STREAM_HEADER_SIZE = 5;\n\nfunction encodeStreamHeader(\n strategy: number,\n originalSize: number,\n): Uint8Array {\n const header = new Uint8Array(STREAM_HEADER_SIZE);\n header[0] = strategy;\n new DataView(header.buffer).setUint32(1, originalSize);\n return header;\n}\n\nfunction decodeStreamHeader(\n data: Uint8Array,\n): { strategy: number; originalSize: number } {\n const strategy = data[0];\n const originalSize = new DataView(\n data.buffer, data.byteOffset + 1, 4,\n ).getUint32(0);\n return { strategy, originalSize };\n}\n\n// ============================================================================\n// Topological Compressor\n// ============================================================================\n\nexport class TopologicalCompressor {\n private readonly config: TopologicalCompressorConfig & { streamRace: boolean };\n\n constructor(config?: Partial<TopologicalCompressorConfig>) {\n this.config = {\n chunkSize: config?.chunkSize ?? 4096,\n codecs: config?.codecs ?? BUILTIN_CODECS,\n streamRace: config?.streamRace ?? false,\n };\n }\n\n /**\n * Compress data using fork/race/fold.\n *\n * When streamRace=false (default): per-chunk race only.\n * When streamRace=true: two-level race — global codecs vs per-chunk topo.\n */\n compress(data: Uint8Array): TopologicalCompressionResult {\n if (data.length === 0) {\n return {\n data: new Uint8Array(0),\n chunks: [],\n originalSize: 0,\n compressedSize: 0,\n ratio: 0,\n codecsUsed: 0,\n bettiNumber: 0,\n timeMs: 0,\n };\n }\n\n if (!this.config.streamRace) {\n return this.compressChunked(data);\n }\n\n return this.compressTwoLevel(data);\n }\n\n /**\n * Decompress data produced by compress().\n */\n decompress(compressed: Uint8Array): Uint8Array {\n if (compressed.length === 0) return new Uint8Array(0);\n\n if (!this.config.streamRace) {\n return this.decompressChunked(compressed);\n }\n\n return this.decompressTwoLevel(compressed);\n }\n\n // ════════════════════════════════════════════════════════════════════════\n // Level 2: Per-Chunk Topological Compression\n // ════════════════════════════════════════════════════════════════════════\n\n private compressChunked(data: Uint8Array): TopologicalCompressionResult {\n const startTime = performance.now();\n const { chunkSize, codecs } = this.config;\n const numChunks = Math.ceil(data.length / chunkSize);\n const compressedChunks: Uint8Array[] = [];\n const chunkResults: ChunkResult[] = [];\n const codecWins = new Set<number>();\n\n const bettiNumber = Math.max(0, codecs.length - 1);\n\n for (let i = 0; i < numChunks; i++) {\n const chunkStart = i * chunkSize;\n const chunkEnd = Math.min(chunkStart + chunkSize, data.length);\n const chunk = data.subarray(chunkStart, chunkEnd);\n\n let bestCodecId = 0;\n let bestCompressed = chunk;\n let ventCount = 0;\n\n for (const codec of codecs) {\n const compressed = codec.encode(chunk);\n\n if (compressed.length >= chunk.length && codec.id !== 0) {\n ventCount++;\n continue;\n }\n\n if (compressed.length < bestCompressed.length) {\n bestCodecId = codec.id;\n bestCompressed = compressed;\n }\n }\n\n const header = encodeChunkHeader(\n bestCodecId,\n chunk.length,\n bestCompressed.length,\n );\n const frame = new Uint8Array(CHUNK_HEADER_SIZE + bestCompressed.length);\n frame.set(header, 0);\n frame.set(bestCompressed, CHUNK_HEADER_SIZE);\n\n compressedChunks.push(frame);\n codecWins.add(bestCodecId);\n\n const codecName =\n codecs.find((c) => c.id === bestCodecId)?.name ?? 'unknown';\n\n chunkResults.push({\n chunkIndex: i,\n codecId: bestCodecId,\n codecName,\n originalSize: chunk.length,\n compressedSize: frame.length,\n ratio: chunk.length > 0 ? 1 - frame.length / chunk.length : 0,\n vented: ventCount,\n });\n }\n\n const totalCompressedSize = compressedChunks.reduce(\n (sum, c) => sum + c.length,\n 0,\n );\n const output = new Uint8Array(totalCompressedSize);\n let offset = 0;\n for (const c of compressedChunks) {\n output.set(c, offset);\n offset += c.length;\n }\n\n return {\n data: output,\n chunks: chunkResults,\n originalSize: data.length,\n compressedSize: totalCompressedSize,\n ratio: data.length > 0 ? 1 - totalCompressedSize / data.length : 0,\n codecsUsed: codecWins.size,\n bettiNumber,\n timeMs: performance.now() - startTime,\n };\n }\n\n private decompressChunked(compressed: Uint8Array): Uint8Array {\n const chunks: Array<{\n codecId: number;\n originalSize: number;\n compressedData: Uint8Array;\n }> = [];\n let totalOriginalSize = 0;\n let readPos = 0;\n\n while (readPos < compressed.length) {\n if (readPos + CHUNK_HEADER_SIZE > compressed.length) {\n throw new Error(`Truncated chunk header at offset ${readPos}`);\n }\n\n const { codecId, originalSize, compressedSize } = decodeChunkHeader(\n compressed,\n readPos,\n );\n readPos += CHUNK_HEADER_SIZE;\n\n if (readPos + compressedSize > compressed.length) {\n throw new Error(\n `Truncated chunk data at offset ${readPos}: need ${compressedSize}, have ${compressed.length - readPos}`,\n );\n }\n\n chunks.push({\n codecId,\n originalSize,\n compressedData: compressed.subarray(readPos, readPos + compressedSize),\n });\n readPos += compressedSize;\n totalOriginalSize += originalSize;\n }\n\n const output = new Uint8Array(totalOriginalSize);\n let writePos = 0;\n\n for (const chunk of chunks) {\n const codec = getCodecById(chunk.codecId);\n const decompressed = codec.decode(\n chunk.compressedData,\n chunk.originalSize,\n );\n output.set(decompressed, writePos);\n writePos += chunk.originalSize;\n }\n\n return output;\n }\n\n // ════════════════════════════════════════════════════════════════════════\n // Level 1: Stream-Level Two-Level Race\n // ════════════════════════════════════════════════════════════════════════\n\n /**\n * Two-level fork/race/fold:\n *\n * FORK (stream level):\n * ├─ Path 0: Per-chunk topological (Level 2)\n * ├─ Path 1: Global codec A on entire stream\n * ├─ Path 2: Global codec B on entire stream\n * └─ ...\n * RACE: Smallest total output wins\n * FOLD: 5-byte strategy header + compressed data\n *\n * On homogeneous text, global brotli wins (cross-chunk dictionary).\n * On mixed content, per-chunk topo wins (adapts per region).\n * The topology decides — not the programmer.\n */\n private compressTwoLevel(data: Uint8Array): TopologicalCompressionResult {\n const startTime = performance.now();\n const { codecs } = this.config;\n\n // ── FORK: Run all strategies in parallel ──\n\n // Strategy 0: Per-chunk topological (Level 2)\n const chunkedResult = this.compressChunked(data);\n const chunkedTotal = STREAM_HEADER_SIZE + chunkedResult.compressedSize;\n\n // Strategies 1+: Each codec globally on the full stream\n interface GlobalCandidate {\n codecId: number;\n codecName: string;\n compressed: Uint8Array;\n totalSize: number; // including 5-byte stream header\n }\n\n const globalCandidates: GlobalCandidate[] = [];\n\n for (const codec of codecs) {\n if (codec.id === 0) continue; // skip raw — can't beat per-chunk raw\n\n try {\n const compressed = codec.encode(data);\n const totalSize = STREAM_HEADER_SIZE + compressed.length;\n\n if (compressed.length < data.length) {\n globalCandidates.push({\n codecId: codec.id,\n codecName: codec.name,\n compressed,\n totalSize,\n });\n }\n } catch {\n // Codec unavailable or failed — vented\n }\n }\n\n // ── RACE: Find the smallest output ──\n let bestStrategy = 0; // 0 = per-chunk\n let bestSize = chunkedTotal;\n let bestGlobal: GlobalCandidate | null = null;\n\n for (const candidate of globalCandidates) {\n if (candidate.totalSize < bestSize) {\n bestStrategy = candidate.codecId;\n bestSize = candidate.totalSize;\n bestGlobal = candidate;\n }\n }\n\n // ── FOLD: Build stream-level output ──\n const streamHeader = encodeStreamHeader(bestStrategy, data.length);\n\n // β₁: outer race has (globalCandidates.length + 1) paths,\n // inner race has codecs.length paths per chunk\n // Total independent cycles = outer_paths - 1 + inner_β₁\n const outerPaths = globalCandidates.length + 1; // +1 for per-chunk\n const innerBeta = Math.max(0, codecs.length - 1);\n const totalBeta = (outerPaths - 1) + innerBeta;\n\n if (bestStrategy === 0) {\n // Per-chunk topological won — prefix with stream header\n const output = new Uint8Array(STREAM_HEADER_SIZE + chunkedResult.data.length);\n output.set(streamHeader, 0);\n output.set(chunkedResult.data, STREAM_HEADER_SIZE);\n\n return {\n ...chunkedResult,\n data: output,\n compressedSize: output.length,\n ratio: data.length > 0 ? 1 - output.length / data.length : 0,\n bettiNumber: totalBeta,\n strategy: 'chunked',\n timeMs: performance.now() - startTime,\n };\n } else {\n // Global codec won\n const output = new Uint8Array(STREAM_HEADER_SIZE + bestGlobal!.compressed.length);\n output.set(streamHeader, 0);\n output.set(bestGlobal!.compressed, STREAM_HEADER_SIZE);\n\n return {\n data: output,\n chunks: [],\n originalSize: data.length,\n compressedSize: output.length,\n ratio: data.length > 0 ? 1 - output.length / data.length : 0,\n codecsUsed: 1,\n bettiNumber: totalBeta,\n strategy: `global:${bestGlobal!.codecName}`,\n timeMs: performance.now() - startTime,\n };\n }\n }\n\n private decompressTwoLevel(compressed: Uint8Array): Uint8Array {\n if (compressed.length < STREAM_HEADER_SIZE) {\n throw new Error('Truncated stream header');\n }\n\n const { strategy, originalSize } = decodeStreamHeader(compressed);\n const payload = compressed.subarray(STREAM_HEADER_SIZE);\n\n if (strategy === 0) {\n // Per-chunk topological\n return this.decompressChunked(payload);\n } else {\n // Global codec\n const codec = getCodecById(strategy);\n return codec.decode(payload, originalSize);\n }\n }\n\n /** Get the codecs available for racing. */\n getCodecs(): ReadonlyArray<CompressionCodec> {\n return this.config.codecs;\n }\n\n /** Get the chunk size. */\n getChunkSize(): number {\n return this.config.chunkSize;\n }\n}\n","/**\n * Prefetching Engine (Phase 13)\n *\n * Predictively pre-compresses batches based on detected operation patterns.\n * Analyzes historical data to predict which operations are most likely to occur.\n */\n\nimport { getLogger } from '../utils/logger';\nimport type { Operation } from '../core/types';\n\nconst logger = getLogger();\n\n// ============================================================================\n// Types\n// ============================================================================\n\n/**\n * Pattern in operation sequence\n */\nexport interface OperationPattern {\n sequence: string[];\n frequency: number;\n probability: number;\n lastOccurred: number;\n avgIntervalMs: number;\n}\n\n/**\n * Prediction for next operations\n */\nexport interface OperationPrediction {\n operationType: string;\n probability: number;\n reason: string;\n shouldPrefetch: boolean;\n estimatedTimeMs: number;\n}\n\n/**\n * Prefetched batch\n */\nexport interface PrefetchedBatch {\n id: string;\n operationType: string;\n compressed: Uint8Array;\n compressedSize: number;\n originalSize: number;\n compressionRatio: number;\n compressed_at: number;\n created_at: number;\n ttl: number;\n expiresAt: number;\n hitCount: number;\n missCount: number;\n}\n\n/**\n * Prefetching statistics\n */\nexport interface PrefetchingStats {\n totalPrefetched: number;\n totalHits: number;\n totalMisses: number;\n totalOverwrites: number;\n hitRatio: number;\n bandwidthSaved: number;\n patternsDetected: number;\n predictionAccuracy: number;\n}\n\n// ============================================================================\n// Prefetching Engine\n// ============================================================================\n\nexport class PrefetchingEngine {\n private operationHistory: Array<{\n type: string;\n timestamp: number;\n size: number;\n }> = [];\n private patterns: Map<string, OperationPattern> = new Map();\n private prefetchCache: Map<string, PrefetchedBatch[]> = new Map();\n private maxHistoryEntries = 1000;\n private maxCachePerType = 5;\n private prefetchTTL = 5 * 60 * 1000; // 5 minutes\n private predictionThreshold = 0.3;\n private stats: PrefetchingStats = {\n totalPrefetched: 0,\n totalHits: 0,\n totalMisses: 0,\n totalOverwrites: 0,\n hitRatio: 0,\n bandwidthSaved: 0,\n patternsDetected: 0,\n predictionAccuracy: 0,\n };\n private lastPredictionTime = 0;\n private predictionInterval = 30 * 1000;\n\n constructor() {\n logger.debug('[PrefetchingEngine] Initialized', {\n ttl: this.prefetchTTL,\n threshold: this.predictionThreshold,\n });\n }\n\n /**\n * Record operation for pattern analysis\n */\n recordOperation(operationType: string, size: number): void {\n const now = Date.now();\n\n this.operationHistory.push({\n type: operationType,\n timestamp: now,\n size,\n });\n\n if (this.operationHistory.length > this.maxHistoryEntries) {\n this.operationHistory.shift();\n }\n\n // Clean expired prefetches periodically\n if (Math.random() < 0.1) {\n this.cleanExpiredPrefetches();\n }\n\n logger.debug('[PrefetchingEngine] Operation recorded', {\n type: operationType,\n size,\n historySize: this.operationHistory.length,\n });\n }\n\n /**\n * Analyze patterns in operation history\n */\n private analyzePatterns(): void {\n if (this.operationHistory.length < 5) {\n return;\n }\n\n const patterns = new Map<string, OperationPattern>();\n\n // Find 2-3 operation sequences\n for (let length = 2; length <= 3; length++) {\n for (let i = 0; i < this.operationHistory.length - length; i++) {\n const sequence = this.operationHistory\n .slice(i, i + length)\n .map((op) => op.type);\n const key = sequence.join(' → ');\n\n if (!patterns.has(key)) {\n patterns.set(key, {\n sequence,\n frequency: 0,\n probability: 0,\n lastOccurred: 0,\n avgIntervalMs: 0,\n });\n }\n\n const pattern = patterns.get(key)!;\n pattern.frequency++;\n pattern.lastOccurred = Date.now();\n }\n }\n\n // Calculate probabilities\n const totalSequences = this.operationHistory.length;\n\n for (const [key, pattern] of patterns.entries()) {\n pattern.probability = Math.min(1, pattern.frequency / totalSequences);\n }\n\n this.patterns = patterns;\n this.stats.patternsDetected = patterns.size;\n\n logger.debug('[PrefetchingEngine] Patterns analyzed', {\n patternsFound: patterns.size,\n });\n }\n\n /**\n * Predict next operations\n */\n predictNextOperations(recentOperations: Operation[]): OperationPrediction[] {\n const now = Date.now();\n\n if (now - this.lastPredictionTime > this.predictionInterval) {\n this.analyzePatterns();\n this.lastPredictionTime = now;\n }\n\n if (this.patterns.size === 0) {\n return [];\n }\n\n const predictions: OperationPrediction[] = [];\n const recentTypeSequence = recentOperations\n .slice(-3)\n .map((op) => op.type)\n .join(' → ');\n\n for (const [key, pattern] of this.patterns.entries()) {\n if (key.includes(recentTypeSequence) && pattern.sequence.length > 0) {\n const nextType = pattern.sequence[pattern.sequence.length - 1];\n\n const prediction: OperationPrediction = {\n operationType: nextType,\n probability: pattern.probability,\n reason: `Detected pattern: ${key}`,\n shouldPrefetch: pattern.probability > this.predictionThreshold,\n estimatedTimeMs: pattern.avgIntervalMs,\n };\n\n predictions.push(prediction);\n }\n }\n\n // Deduplicate and sort\n const deduped = Array.from(\n new Map(predictions.map((p) => [p.operationType, p])).values()\n ).sort((a, b) => b.probability - a.probability);\n\n logger.debug('[PrefetchingEngine] Predictions', {\n predictions: deduped.slice(0, 3).map((p) => ({\n type: p.operationType,\n probability: (p.probability * 100).toFixed(1) + '%',\n })),\n });\n\n return deduped;\n }\n\n /**\n * Add prefetched batch\n */\n addPrefetchedBatch(\n operationType: string,\n compressed: Uint8Array,\n originalSize: number\n ): PrefetchedBatch {\n if (!this.prefetchCache.has(operationType)) {\n this.prefetchCache.set(operationType, []);\n }\n\n const cache = this.prefetchCache.get(operationType)!;\n\n if (cache.length >= this.maxCachePerType) {\n const oldest = cache.shift()!;\n if (oldest.hitCount === 0) {\n this.stats.totalMisses++;\n } else {\n this.stats.totalOverwrites++;\n }\n }\n\n const batch: PrefetchedBatch = {\n id: `prefetch-${operationType}-${Date.now()}-${Math.random()\n .toString(36)\n .substr(2, 9)}`,\n operationType,\n compressed,\n compressedSize: compressed.length,\n originalSize,\n compressionRatio: 1 - compressed.length / originalSize,\n compressed_at: Date.now(),\n created_at: Date.now(),\n ttl: this.prefetchTTL,\n expiresAt: Date.now() + this.prefetchTTL,\n hitCount: 0,\n missCount: 0,\n };\n\n cache.push(batch);\n this.stats.totalPrefetched++;\n this.stats.bandwidthSaved += originalSize - compressed.length;\n\n logger.debug('[PrefetchingEngine] Prefetched batch added', {\n type: operationType,\n id: batch.id,\n ratio: (batch.compressionRatio * 100).toFixed(1) + '%',\n });\n\n return batch;\n }\n\n /**\n * Try to use prefetched batch\n */\n getPrefetchedBatch(operationType: string): PrefetchedBatch | null {\n const cache = this.prefetchCache.get(operationType);\n if (!cache || cache.length === 0) {\n return null;\n }\n\n const now = Date.now();\n for (let i = 0; i < cache.length; i++) {\n const batch = cache[i];\n\n if (batch.expiresAt > now) {\n batch.hitCount++;\n this.stats.totalHits++;\n this.updatePredictionAccuracy(true);\n\n logger.debug('[PrefetchingEngine] Prefetch hit', {\n type: operationType,\n id: batch.id,\n });\n\n return batch;\n } else {\n cache.splice(i, 1);\n i--;\n batch.missCount++;\n this.stats.totalMisses++;\n this.updatePredictionAccuracy(false);\n }\n }\n\n return null;\n }\n\n /**\n * Update prediction accuracy metric\n */\n private updatePredictionAccuracy(hit: boolean): void {\n const total = this.stats.totalHits + this.stats.totalMisses;\n if (total === 0) return;\n\n this.stats.predictionAccuracy = this.stats.totalHits / total;\n }\n\n /**\n * Clean expired prefetches\n */\n private cleanExpiredPrefetches(): void {\n const now = Date.now();\n let cleanedCount = 0;\n\n for (const [type, cache] of this.prefetchCache.entries()) {\n for (let i = cache.length - 1; i >= 0; i--) {\n if (cache[i].expiresAt < now) {\n const batch = cache.splice(i, 1)[0];\n if (batch.hitCount === 0) {\n this.stats.totalMisses++;\n }\n cleanedCount++;\n }\n }\n\n if (cache.length === 0) {\n this.prefetchCache.delete(type);\n }\n }\n\n if (cleanedCount > 0) {\n logger.debug('[PrefetchingEngine] Cleaned expired prefetches', {\n count: cleanedCount,\n });\n }\n }\n\n /**\n * Get statistics\n */\n getStats(): PrefetchingStats {\n const total = this.stats.totalHits + this.stats.totalMisses;\n this.stats.hitRatio = total > 0 ? this.stats.totalHits / total : 0;\n\n return { ...this.stats };\n }\n\n /**\n * Clear all caches\n */\n clear(): void {\n this.operationHistory = [];\n this.patterns.clear();\n this.prefetchCache.clear();\n this.stats = {\n totalPrefetched: 0,\n totalHits: 0,\n totalMisses: 0,\n totalOverwrites: 0,\n hitRatio: 0,\n bandwidthSaved: 0,\n patternsDetected: 0,\n predictionAccuracy: 0,\n };\n logger.debug('[PrefetchingEngine] Cleared all caches');\n }\n}\n\n// ============================================================================\n// Singleton Instance\n// ============================================================================\n\nlet prefetchingEngineInstance: PrefetchingEngine | null = null;\n\nexport function getPrefetchingEngine(): PrefetchingEngine {\n if (!prefetchingEngineInstance) {\n prefetchingEngineInstance = new PrefetchingEngine();\n }\n return prefetchingEngineInstance;\n}\n\nexport function resetPrefetchingEngine(): void {\n prefetchingEngineInstance = null;\n}\n","/**\n * Batch Timing Optimizer (Phase 13)\n *\n * Intelligently schedules batch transmission based on network conditions,\n * device resources, and user activity patterns.\n */\n\nimport { getLogger } from '../utils/logger';\n\nconst logger = getLogger();\n\n// ============================================================================\n// Types\n// ============================================================================\n\n/**\n * Network window quality assessment\n */\nexport interface NetworkWindow {\n startTime: number;\n endTime: number;\n expectedDurationMs: number;\n latencyMs: number;\n bandwidthMbps: number;\n quality: 'excellent' | 'good' | 'fair' | 'poor';\n isStable: boolean;\n congestionLevel: number;\n recommendedBatchSize: number;\n}\n\n/**\n * Activity pattern\n */\nexport interface ActivityPattern {\n type: 'user-active' | 'idle' | 'background' | 'sleep';\n startTime: number;\n duration: number;\n probability: number;\n}\n\n/**\n * Batch scheduling decision\n */\nexport interface SchedulingDecision {\n shouldSendNow: boolean;\n nextOptimalWindowMs: number;\n recommendedDelay: number;\n reason: string;\n priority: 'critical' | 'high' | 'normal' | 'low';\n estimatedDeliveryMs: number;\n}\n\n/**\n * Batch timing statistics\n */\nexport interface BatchTimingStats {\n totalBatches: number;\n immediateDeliveries: number;\n deferredBatches: number;\n averageWaitTimeMs: number;\n averageDeliveryTimeMs: number;\n networkWindowsUsed: number;\n congestionAvoided: number;\n userFocusedOptimizations: number;\n}\n\n// ============================================================================\n// Batch Timing Optimizer\n// ============================================================================\n\nexport class BatchTimingOptimizer {\n private networkHistory: Array<{\n latencyMs: number;\n bandwidthMbps: number;\n timestamp: number;\n quality: 'excellent' | 'good' | 'fair' | 'poor';\n }> = [];\n private activityHistory: ActivityPattern[] = [];\n private stats: BatchTimingStats = {\n totalBatches: 0,\n immediateDeliveries: 0,\n deferredBatches: 0,\n averageWaitTimeMs: 0,\n averageDeliveryTimeMs: 0,\n networkWindowsUsed: 0,\n congestionAvoided: 0,\n userFocusedOptimizations: 0,\n };\n private lastActivityTime = Date.now();\n private isUserActive = true;\n private congestionDetectionWindow = 60 * 1000;\n private optimalBatchSize = 50 * 1024;\n\n constructor() {\n logger.debug('[BatchTimingOptimizer] Initialized', {\n congestionWindow: this.congestionDetectionWindow,\n optimalBatchSize: this.optimalBatchSize,\n });\n }\n\n /**\n * Record network measurement\n */\n recordNetworkMeasurement(latencyMs: number, bandwidthMbps: number): void {\n const quality = this.assessNetworkQuality(latencyMs, bandwidthMbps);\n\n this.networkHistory.push({\n latencyMs,\n bandwidthMbps,\n timestamp: Date.now(),\n quality,\n });\n\n if (this.networkHistory.length > 100) {\n this.networkHistory.shift();\n }\n\n this.stats.networkWindowsUsed++;\n\n logger.debug('[BatchTimingOptimizer] Network measured', {\n latency: latencyMs + 'ms',\n bandwidth: bandwidthMbps.toFixed(1) + ' Mbps',\n quality,\n });\n }\n\n /**\n * Assess network quality\n */\n private assessNetworkQuality(\n latencyMs: number,\n bandwidthMbps: number\n ): 'excellent' | 'good' | 'fair' | 'poor' {\n if (latencyMs < 20 && bandwidthMbps > 10) return 'excellent';\n if (latencyMs < 50 && bandwidthMbps > 5) return 'good';\n if (latencyMs < 100 && bandwidthMbps > 2) return 'fair';\n return 'poor';\n }\n\n /**\n * Detect congestion in network\n */\n private detectCongestion(): number {\n const recentMeasurements = this.networkHistory.filter(\n (m) => Date.now() - m.timestamp < this.congestionDetectionWindow\n );\n\n if (recentMeasurements.length < 3) {\n return 0;\n }\n\n const poorCount = recentMeasurements.filter(\n (m) => m.quality === 'poor'\n ).length;\n\n return poorCount / recentMeasurements.length;\n }\n\n /**\n * Find next optimal network window\n */\n private findOptimalWindow(): NetworkWindow {\n const now = Date.now();\n\n const recentMeasurements = this.networkHistory.slice(-20);\n if (recentMeasurements.length === 0) {\n return {\n startTime: now,\n endTime: now + 1000,\n expectedDurationMs: 1000,\n latencyMs: 50,\n bandwidthMbps: 5,\n quality: 'good',\n isStable: true,\n congestionLevel: 0,\n recommendedBatchSize: this.optimalBatchSize,\n };\n }\n\n const avgLatency =\n recentMeasurements.reduce((sum, m) => sum + m.latencyMs, 0) /\n recentMeasurements.length;\n const avgBandwidth =\n recentMeasurements.reduce((sum, m) => sum + m.bandwidthMbps, 0) /\n recentMeasurements.length;\n\n const latencyVariance =\n Math.sqrt(\n recentMeasurements.reduce(\n (sum, m) => sum + Math.pow(m.latencyMs - avgLatency, 2),\n 0\n ) / recentMeasurements.length\n ) / avgLatency;\n\n const isStable = latencyVariance < 0.2;\n const congestionLevel = this.detectCongestion();\n const quality = this.assessNetworkQuality(avgLatency, avgBandwidth);\n\n const recommendedBatchSize = Math.max(\n 10 * 1024,\n Math.min(500 * 1024, (avgBandwidth * 1024 * 100) / 8)\n );\n\n return {\n startTime: now,\n endTime: now + (isStable ? 30 * 1000 : 10 * 1000),\n expectedDurationMs: isStable ? 30 * 1000 : 10 * 1000,\n latencyMs: avgLatency,\n bandwidthMbps: avgBandwidth,\n quality,\n isStable,\n congestionLevel,\n recommendedBatchSize,\n };\n }\n\n /**\n * Get scheduling decision for a batch\n */\n getSchedulingDecision(\n batchSize: number,\n batchPriority: 'critical' | 'high' | 'normal' | 'low' = 'normal',\n isUserTriggered = false\n ): SchedulingDecision {\n const now = Date.now();\n const currentWindow = this.findOptimalWindow();\n const congestionLevel = this.detectCongestion();\n\n let shouldSendNow = false;\n let recommendedDelay = 0;\n let reason = '';\n let priority = batchPriority;\n\n if (priority === 'critical') {\n shouldSendNow = true;\n reason = 'Critical operation (bypass optimization)';\n } else if (isUserTriggered && this.isUserActive) {\n shouldSendNow = true;\n reason = 'User-triggered operation';\n priority = 'high';\n } else if (\n currentWindow.quality === 'excellent' ||\n currentWindow.quality === 'good'\n ) {\n if (congestionLevel < 0.3) {\n shouldSendNow = true;\n reason = 'Good network conditions';\n } else {\n shouldSendNow = true;\n reason = 'Good network despite some congestion';\n recommendedDelay = 1000 + Math.random() * 2000;\n }\n } else if (currentWindow.quality === 'fair') {\n if (priority === 'high') {\n shouldSendNow = true;\n reason = 'High priority despite fair network';\n } else {\n shouldSendNow = false;\n reason = 'Fair network: waiting for better window';\n recommendedDelay = 30 * 1000 + Math.random() * 30 * 1000;\n }\n } else {\n shouldSendNow = false;\n reason = 'Poor network conditions: deferring';\n if (priority === 'high') {\n recommendedDelay = 60 * 1000 + Math.random() * 30 * 1000;\n } else {\n recommendedDelay = 120 * 1000 + Math.random() * 60 * 1000;\n }\n }\n\n const estimatedDeliveryMs =\n (batchSize / ((currentWindow.bandwidthMbps * 1024 * 1024) / 8)) * 1000 +\n currentWindow.latencyMs +\n recommendedDelay;\n\n const decision: SchedulingDecision = {\n shouldSendNow,\n nextOptimalWindowMs: now + recommendedDelay,\n recommendedDelay,\n reason,\n priority,\n estimatedDeliveryMs,\n };\n\n logger.debug('[BatchTimingOptimizer] Scheduling decision', {\n size: (batchSize / 1024).toFixed(1) + ' KB',\n shouldSendNow,\n delay: recommendedDelay + 'ms',\n reason,\n });\n\n return decision;\n }\n\n /**\n * Apply scheduling and update stats\n */\n applyScheduling(\n batchSize: number,\n sendNow: boolean,\n actualDelay: number\n ): void {\n this.stats.totalBatches++;\n\n if (sendNow) {\n this.stats.immediateDeliveries++;\n } else {\n this.stats.deferredBatches++;\n }\n\n const totalWait =\n this.stats.averageWaitTimeMs * (this.stats.totalBatches - 1) +\n actualDelay;\n this.stats.averageWaitTimeMs = totalWait / this.stats.totalBatches;\n\n if (this.detectCongestion() > 0.3 && !sendNow) {\n this.stats.congestionAvoided++;\n }\n\n if (this.isUserActive) {\n this.stats.userFocusedOptimizations++;\n }\n\n this.stats.networkWindowsUsed++;\n }\n\n /**\n * Get optimal batch size recommendation\n */\n getOptimalBatchSize(): number {\n const window = this.findOptimalWindow();\n return window.recommendedBatchSize;\n }\n\n /**\n * Get current network window\n */\n getCurrentNetworkWindow(): NetworkWindow {\n return this.findOptimalWindow();\n }\n\n /**\n * Set user activity state\n */\n setUserActive(active: boolean): void {\n this.isUserActive = active;\n if (active) {\n this.lastActivityTime = Date.now();\n }\n }\n\n /**\n * Get statistics\n */\n getStats(): BatchTimingStats {\n return { ...this.stats };\n }\n\n /**\n * Clear history\n */\n clear(): void {\n this.networkHistory = [];\n this.activityHistory = [];\n this.stats = {\n totalBatches: 0,\n immediateDeliveries: 0,\n deferredBatches: 0,\n averageWaitTimeMs: 0,\n averageDeliveryTimeMs: 0,\n networkWindowsUsed: 0,\n congestionAvoided: 0,\n userFocusedOptimizations: 0,\n };\n }\n}\n\n// ============================================================================\n// Singleton Instance\n// ============================================================================\n\nlet batchTimingOptimizerInstance: BatchTimingOptimizer | null = null;\n\nexport function getBatchTimingOptimizer(): BatchTimingOptimizer {\n if (!batchTimingOptimizerInstance) {\n batchTimingOptimizerInstance = new BatchTimingOptimizer();\n }\n return batchTimingOptimizerInstance;\n}\n\nexport function resetBatchTimingOptimizer(): void {\n batchTimingOptimizerInstance = null;\n}\n","/**\n * Adaptive Compression Optimizer (Phase 13)\n *\n * Automatically adjusts compression level based on network conditions,\n * device capabilities, and real-time performance metrics.\n */\n\nimport { getLogger } from '../utils/logger';\nimport type { CompressionStats } from '../compression/CompressionEngine';\n\nconst logger = getLogger();\n\n// ============================================================================\n// Types\n// ============================================================================\n\n/**\n * Network conditions affecting compression\n */\nexport interface NetworkProfile {\n estimatedSpeedKbps: number;\n latencyMs: number;\n isOnline: boolean;\n isWifi: boolean;\n isFast: boolean;\n isSlow: boolean;\n isEmpty: boolean;\n}\n\n/**\n * Device capabilities for compression\n */\nexport interface DeviceProfile {\n cpuCores: number;\n cpuUtilization: number;\n memoryAvailableMB: number;\n memoryTotalMB: number;\n isConstrained: boolean;\n isPremium: boolean;\n supportsWebWorkers: boolean;\n supportsWebAssembly: boolean;\n}\n\n/**\n * Compression recommendation based on conditions\n */\nexport interface CompressionRecommendation {\n recommendedLevel: 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9;\n reason: string;\n confidence: number;\n estimatedCompressionMs: number;\n estimatedRatio: number;\n networkFactor: number;\n deviceFactor: number;\n}\n\n/**\n * Adaptive compression statistics\n */\nexport interface AdaptiveStats {\n currentLevel: 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9;\n averageCompressionMs: number;\n averageRatio: number;\n levelsUsed: Set<number>;\n adjustmentCount: number;\n totalBatches: number;\n networkCondition: 'fast' | 'normal' | 'slow' | 'offline';\n}\n\n// ============================================================================\n// Adaptive Compression Optimizer\n// ============================================================================\n\nexport class AdaptiveCompressionOptimizer {\n private currentLevel: 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 = 6;\n private networkProfile: NetworkProfile = {\n estimatedSpeedKbps: 5000,\n latencyMs: 50,\n isOnline: true,\n isWifi: false,\n isFast: true,\n isSlow: false,\n isEmpty: false,\n };\n private deviceProfile: DeviceProfile = {\n cpuCores: 4,\n cpuUtilization: 0.3,\n memoryAvailableMB: 512,\n memoryTotalMB: 1024,\n isConstrained: false,\n isPremium: false,\n supportsWebWorkers: true,\n supportsWebAssembly: true,\n };\n private compressionHistory: Array<{\n level: number;\n ratio: number;\n timeMs: number;\n timestamp: number;\n }> = [];\n private stats: AdaptiveStats = {\n currentLevel: 6,\n averageCompressionMs: 10,\n averageRatio: 0.85,\n levelsUsed: new Set([6]),\n adjustmentCount: 0,\n totalBatches: 0,\n networkCondition: 'normal',\n };\n\n constructor() {\n logger.debug('[AdaptiveCompressionOptimizer] Initialized', {\n level: this.currentLevel,\n });\n }\n\n /**\n * Update network conditions\n */\n updateNetworkConditions(\n speedKbps: number,\n latencyMs?: number,\n isOnline?: boolean\n ): void {\n this.networkProfile.estimatedSpeedKbps = speedKbps;\n if (latencyMs !== undefined) {\n this.networkProfile.latencyMs = latencyMs;\n }\n if (isOnline !== undefined) {\n this.networkProfile.isOnline = isOnline;\n }\n\n this.networkProfile.isFast = speedKbps > 5000;\n this.networkProfile.isSlow = speedKbps < 1000;\n this.networkProfile.isEmpty = speedKbps < 100;\n\n if (isOnline === false) {\n this.stats.networkCondition = 'offline';\n } else if (this.networkProfile.isSlow) {\n this.stats.networkCondition = 'slow';\n } else if (this.networkProfile.isFast) {\n this.stats.networkCondition = 'fast';\n } else {\n this.stats.networkCondition = 'normal';\n }\n\n logger.debug('[AdaptiveCompressionOptimizer] Network updated', {\n speedKbps,\n condition: this.stats.networkCondition,\n });\n }\n\n /**\n * Update device resource usage\n */\n updateDeviceResources(\n cpuUtilization: number,\n memoryAvailableMB: number\n ): void {\n this.deviceProfile.cpuUtilization = Math.max(\n 0,\n Math.min(1, cpuUtilization)\n );\n this.deviceProfile.memoryAvailableMB = memoryAvailableMB;\n this.deviceProfile.isConstrained = memoryAvailableMB < 512;\n this.deviceProfile.isPremium = memoryAvailableMB > 2048;\n\n logger.debug('[AdaptiveCompressionOptimizer] Device resources updated', {\n cpuUtilization: (cpuUtilization * 100).toFixed(1) + '%',\n memoryAvailableMB,\n });\n }\n\n /**\n * Record compression performance\n */\n recordCompressionPerformance(\n level: number,\n compressionMs: number,\n ratio: number\n ): void {\n this.compressionHistory.push({\n level,\n ratio,\n timeMs: compressionMs,\n timestamp: Date.now(),\n });\n\n if (this.compressionHistory.length > 100) {\n this.compressionHistory.shift();\n }\n\n this.stats.totalBatches++;\n const historyLength = this.compressionHistory.length;\n if (historyLength > 0) {\n this.stats.averageCompressionMs =\n this.compressionHistory.reduce((sum, h) => sum + h.timeMs, 0) /\n historyLength;\n this.stats.averageRatio =\n this.compressionHistory.reduce((sum, h) => sum + h.ratio, 0) /\n historyLength;\n }\n }\n\n /**\n * Get compression recommendation based on conditions\n */\n getRecommendedLevel(): CompressionRecommendation {\n const networkFactor = this.calculateNetworkFactor();\n const deviceFactor = this.calculateDeviceFactor();\n const combinedFactor = (networkFactor + deviceFactor) / 2;\n\n const recommendedLevel = Math.max(\n 1,\n Math.min(9, Math.round(combinedFactor * 9))\n ) as 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9;\n\n const estimatedCompressionMs =\n this.estimateCompressionTime(recommendedLevel);\n const estimatedRatio = this.estimateCompressionRatio(recommendedLevel);\n\n let reason = '';\n if (networkFactor < 0.3 && deviceFactor < 0.3) {\n reason = 'Slow network + constrained device: using level 1-2 (fast)';\n } else if (networkFactor > 0.7 && deviceFactor > 0.7) {\n reason =\n 'Fast network + premium device: using level 8-9 (best compression)';\n } else if (networkFactor > 0.7) {\n reason = 'Fast network: prioritizing compression ratio';\n } else if (deviceFactor < 0.3) {\n reason = 'Constrained device: prioritizing speed';\n } else {\n reason = 'Normal conditions: balanced compression level';\n }\n\n const recommendation: CompressionRecommendation = {\n recommendedLevel,\n reason,\n confidence: this.compressionHistory.length > 10 ? 0.9 : 0.5,\n estimatedCompressionMs,\n estimatedRatio,\n networkFactor,\n deviceFactor,\n };\n\n logger.debug(\n '[AdaptiveCompressionOptimizer] Recommendation',\n recommendation\n );\n\n return recommendation;\n }\n\n /**\n * Calculate network factor (0-1)\n */\n private calculateNetworkFactor(): number {\n if (!this.networkProfile.isOnline) return 0;\n\n const speedMbps = this.networkProfile.estimatedSpeedKbps / 1000;\n\n if (speedMbps < 0.1) return 0;\n if (speedMbps < 1) return 0.1 + (speedMbps / 1) * 0.2;\n if (speedMbps < 5) return 0.3 + ((speedMbps - 1) / 4) * 0.3;\n if (speedMbps < 20) return 0.6 + ((speedMbps - 5) / 15) * 0.3;\n return Math.min(1, 0.9 + (speedMbps - 20) / 200);\n }\n\n /**\n * Calculate device factor (0-1)\n */\n private calculateDeviceFactor(): number {\n let factor = 0.5;\n\n if (this.deviceProfile.isPremium) {\n factor = 0.8;\n } else if (this.deviceProfile.isConstrained) {\n factor = 0.2;\n }\n\n if (this.deviceProfile.cpuUtilization > 0.8) {\n factor *= 0.7;\n } else if (this.deviceProfile.cpuUtilization < 0.2) {\n factor *= 1.1;\n }\n\n if (this.deviceProfile.supportsWebAssembly) {\n factor = Math.min(1, factor + 0.1);\n }\n\n return Math.max(0, Math.min(1, factor));\n }\n\n /**\n * Estimate compression time for a level (in ms)\n */\n private estimateCompressionTime(level: number): number {\n return Math.max(1, level * 2.5);\n }\n\n /**\n * Estimate compression ratio for a level\n */\n private estimateCompressionRatio(level: number): number {\n return 0.6 + (level / 9) * 0.3;\n }\n\n /**\n * Apply recommendation and get new level\n */\n applyRecommendation(): 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 {\n const recommendation = this.getRecommendedLevel();\n const oldLevel = this.currentLevel;\n\n const shouldChange =\n recommendation.confidence > 0.7 ||\n Math.abs(recommendation.recommendedLevel - oldLevel) > 2;\n\n if (shouldChange) {\n this.currentLevel = recommendation.recommendedLevel;\n this.stats.levelsUsed.add(this.currentLevel);\n\n if (oldLevel !== this.currentLevel) {\n this.stats.adjustmentCount++;\n logger.debug('[AdaptiveCompressionOptimizer] Level adjusted', {\n from: oldLevel,\n to: this.currentLevel,\n reason: recommendation.reason,\n });\n }\n }\n\n this.stats.currentLevel = this.currentLevel;\n return this.currentLevel;\n }\n\n /**\n * Get current level\n */\n getCurrentLevel(): 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 {\n return this.currentLevel;\n }\n\n /**\n * Get statistics\n */\n getStats(): AdaptiveStats {\n return { ...this.stats };\n }\n\n /**\n * Get detailed analysis\n */\n getDetailedAnalysis() {\n return {\n stats: this.stats,\n network: this.networkProfile,\n device: this.deviceProfile,\n recommendation: this.getRecommendedLevel(),\n history: this.compressionHistory.slice(-20),\n };\n }\n}\n\n// ============================================================================\n// Singleton Instance\n// ============================================================================\n\nlet adaptiveOptimizerInstance: AdaptiveCompressionOptimizer | null = null;\n\nexport function getAdaptiveCompressionOptimizer(): AdaptiveCompressionOptimizer {\n if (!adaptiveOptimizerInstance) {\n adaptiveOptimizerInstance = new AdaptiveCompressionOptimizer();\n }\n return adaptiveOptimizerInstance;\n}\n\nexport function resetAdaptiveCompressionOptimizer(): void {\n adaptiveOptimizerInstance = null;\n}\n","/**\n * Agent Presence Manager (Phase 14)\n *\n * Tracks real-time presence of all agents in a session.\n * Provides status updates, cursor tracking, and activity monitoring.\n */\n\nimport { EventEmitter } from 'eventemitter3';\nimport { getLogger } from '../utils/logger';\n\nconst logger = getLogger();\n\n// ============================================================================\n// Types\n// ============================================================================\n\nexport interface AgentPresence {\n agentId: string;\n name: string;\n role: 'user' | 'assistant' | 'monitor' | 'admin';\n status: 'online' | 'away' | 'offline' | 'reconnecting';\n joinedAt: string;\n lastSeen: string;\n cursorPosition?: { x: number; y: number; path?: string };\n activeSection?: string;\n focusNode?: string;\n selectionRange?: AgentSelectionRange;\n typingState?: AgentTypingState;\n scrollState?: AgentScrollState;\n viewport?: AgentViewportState;\n inputState?: AgentInputState;\n emotionState?: AgentEmotionState;\n metadata?: Record<string, unknown>;\n}\n\nexport interface AgentSelectionRange {\n start: number;\n end: number;\n direction?: 'forward' | 'backward' | 'none';\n path?: string;\n}\n\nexport interface AgentTypingState {\n isTyping: boolean;\n field?: string;\n isComposing?: boolean;\n startedAt?: string;\n stoppedAt?: string;\n}\n\nexport interface AgentScrollState {\n depth: number;\n y?: number;\n viewportHeight?: number;\n documentHeight?: number;\n path?: string;\n}\n\nexport interface AgentViewportState {\n width: number;\n height: number;\n}\n\nexport interface AgentInputState {\n field: string;\n hasFocus: boolean;\n valueLength?: number;\n selectionStart?: number;\n selectionEnd?: number;\n isComposing?: boolean;\n inputMode?: string;\n}\n\nexport interface AgentEmotionState {\n primary?: string;\n secondary?: string;\n confidence?: number;\n intensity?: number;\n valence?: number;\n arousal?: number;\n dominance?: number;\n source?: 'self-report' | 'inferred' | 'sensor' | 'hybrid';\n updatedAt?: string;\n}\n\nexport interface PresenceUpdate {\n agentId: string;\n changes: Partial<AgentPresence>;\n timestamp: string;\n}\n\nexport interface PresenceEvents {\n presence_updated: (data: {\n agentId: string;\n presence: AgentPresence;\n }) => void;\n agent_joined: (data: { agentId: string; presence: AgentPresence }) => void;\n agent_left: (data: { agentId: string; presence: AgentPresence }) => void;\n cursor_updated: (data: {\n agentId: string;\n cursorPosition: { x: number; y: number; path?: string };\n }) => void;\n section_updated: (data: { agentId: string; activeSection: string }) => void;\n focus_updated: (data: { agentId: string; focusNode: string }) => void;\n selection_updated: (data: {\n agentId: string;\n selectionRange: AgentSelectionRange;\n }) => void;\n typing_updated: (data: {\n agentId: string;\n typingState: AgentTypingState;\n }) => void;\n scroll_updated: (data: {\n agentId: string;\n scrollState: AgentScrollState;\n }) => void;\n viewport_updated: (data: {\n agentId: string;\n viewport: AgentViewportState;\n }) => void;\n input_state_updated: (data: {\n agentId: string;\n inputState?: AgentInputState;\n }) => void;\n emotion_updated: (data: {\n agentId: string;\n emotionState?: AgentEmotionState;\n }) => void;\n status_updated: (data: {\n agentId: string;\n status: AgentPresence['status'];\n }) => void;\n}\n\n// ============================================================================\n// Agent Presence Manager\n// ============================================================================\n\nexport class AgentPresenceManager extends EventEmitter<PresenceEvents> {\n private presences: Map<string, AgentPresence> = new Map();\n private sessionId: string;\n private heartbeatInterval: ReturnType<typeof setInterval> | null = null;\n private heartbeatTimeout = 30000;\n private inactivityThreshold = 60000;\n\n constructor(sessionId: string) {\n super();\n this.sessionId = sessionId;\n this.startHeartbeatCheck();\n logger.debug('[AgentPresenceManager] Initialized', { sessionId });\n }\n\n /**\n * Add or update agent presence\n */\n updatePresence(\n agentId: string,\n presence: Omit<AgentPresence, 'joinedAt' | 'lastSeen'>\n ): void {\n const existing = this.presences.get(agentId);\n const now = new Date().toISOString();\n\n const updated: AgentPresence = {\n ...existing,\n ...presence,\n agentId,\n joinedAt: existing?.joinedAt ?? now,\n lastSeen: now,\n };\n\n this.presences.set(agentId, updated);\n\n this.emit('presence_updated', {\n agentId,\n presence: updated,\n });\n }\n\n /**\n * Agent joined\n */\n agentJoined(\n agentId: string,\n name: string,\n role: AgentPresence['role'] = 'user',\n metadata?: Record<string, unknown>\n ): void {\n const now = new Date().toISOString();\n\n const presence: AgentPresence = {\n agentId,\n name,\n role,\n status: 'online',\n joinedAt: now,\n lastSeen: now,\n metadata,\n };\n\n this.presences.set(agentId, presence);\n this.emit('agent_joined', { agentId, presence });\n\n logger.debug('[AgentPresenceManager] Agent joined', {\n agentId,\n name,\n role,\n });\n }\n\n /**\n * Agent left\n */\n agentLeft(agentId: string): void {\n const presence = this.presences.get(agentId);\n\n if (presence) {\n presence.status = 'offline';\n presence.lastSeen = new Date().toISOString();\n\n this.presences.set(agentId, presence);\n this.emit('agent_left', { agentId, presence });\n\n logger.debug('[AgentPresenceManager] Agent left', { agentId });\n }\n }\n\n /**\n * Update cursor position\n */\n updateCursor(agentId: string, x: number, y: number, path?: string): void {\n const presence = this.presences.get(agentId);\n\n if (presence) {\n presence.cursorPosition = { x, y, path };\n presence.lastSeen = new Date().toISOString();\n\n this.presences.set(agentId, presence);\n this.emit('cursor_updated', {\n agentId,\n cursorPosition: presence.cursorPosition,\n });\n }\n }\n\n /**\n * Update active section\n */\n updateActiveSection(agentId: string, section: string): void {\n const presence = this.presences.get(agentId);\n\n if (presence) {\n presence.activeSection = section;\n presence.lastSeen = new Date().toISOString();\n\n this.presences.set(agentId, presence);\n this.emit('section_updated', {\n agentId,\n activeSection: section,\n });\n }\n }\n\n /**\n * Update focused node path\n */\n updateFocusNode(agentId: string, nodePath: string): void {\n const presence = this.presences.get(agentId);\n\n if (presence) {\n presence.focusNode = nodePath;\n presence.lastSeen = new Date().toISOString();\n\n this.presences.set(agentId, presence);\n this.emit('focus_updated', {\n agentId,\n focusNode: nodePath,\n });\n }\n }\n\n /**\n * Update text selection range\n */\n updateSelection(agentId: string, selectionRange: AgentSelectionRange): void {\n const presence = this.presences.get(agentId);\n\n if (presence) {\n presence.selectionRange = selectionRange;\n presence.lastSeen = new Date().toISOString();\n\n this.presences.set(agentId, presence);\n this.emit('selection_updated', {\n agentId,\n selectionRange,\n });\n }\n }\n\n /**\n * Update typing state\n */\n updateTyping(\n agentId: string,\n isTyping: boolean,\n field?: string,\n isComposing = false\n ): void {\n const presence = this.presences.get(agentId);\n\n if (presence) {\n const now = new Date().toISOString();\n const previous = presence.typingState;\n const typingState: AgentTypingState = {\n isTyping,\n field,\n isComposing,\n startedAt:\n isTyping && !previous?.isTyping\n ? now\n : isTyping\n ? previous?.startedAt\n : undefined,\n stoppedAt: isTyping ? undefined : now,\n };\n\n presence.typingState = typingState;\n presence.lastSeen = now;\n\n this.presences.set(agentId, presence);\n this.emit('typing_updated', {\n agentId,\n typingState,\n });\n }\n }\n\n /**\n * Update scroll state\n */\n updateScroll(agentId: string, scrollState: AgentScrollState): void {\n const presence = this.presences.get(agentId);\n\n if (presence) {\n presence.scrollState = {\n ...scrollState,\n depth: Math.max(0, Math.min(1, scrollState.depth)),\n };\n presence.lastSeen = new Date().toISOString();\n\n this.presences.set(agentId, presence);\n this.emit('scroll_updated', {\n agentId,\n scrollState: presence.scrollState,\n });\n }\n }\n\n /**\n * Update viewport size\n */\n updateViewport(agentId: string, width: number, height: number): void {\n const presence = this.presences.get(agentId);\n\n if (presence) {\n presence.viewport = { width, height };\n presence.lastSeen = new Date().toISOString();\n\n this.presences.set(agentId, presence);\n this.emit('viewport_updated', {\n agentId,\n viewport: presence.viewport,\n });\n }\n }\n\n /**\n * Update input state\n */\n updateInputState(agentId: string, inputState: AgentInputState): void {\n const presence = this.presences.get(agentId);\n\n if (presence) {\n presence.inputState = inputState;\n presence.lastSeen = new Date().toISOString();\n\n this.presences.set(agentId, presence);\n this.emit('input_state_updated', {\n agentId,\n inputState,\n });\n }\n }\n\n /**\n * Clear input state\n */\n clearInputState(agentId: string): void {\n const presence = this.presences.get(agentId);\n\n if (presence) {\n presence.inputState = undefined;\n presence.lastSeen = new Date().toISOString();\n\n this.presences.set(agentId, presence);\n this.emit('input_state_updated', {\n agentId,\n inputState: undefined,\n });\n }\n }\n\n /**\n * Update emotional state\n */\n updateEmotionState(\n agentId: string,\n emotionState: Omit<AgentEmotionState, 'updatedAt'>\n ): void {\n const presence = this.presences.get(agentId);\n\n if (presence) {\n const enrichedState: AgentEmotionState = {\n ...emotionState,\n updatedAt: new Date().toISOString(),\n };\n presence.emotionState = enrichedState;\n presence.lastSeen = new Date().toISOString();\n\n this.presences.set(agentId, presence);\n this.emit('emotion_updated', {\n agentId,\n emotionState: enrichedState,\n });\n }\n }\n\n /**\n * Clear emotional state\n */\n clearEmotionState(agentId: string): void {\n const presence = this.presences.get(agentId);\n\n if (presence) {\n presence.emotionState = undefined;\n presence.lastSeen = new Date().toISOString();\n\n this.presences.set(agentId, presence);\n this.emit('emotion_updated', {\n agentId,\n emotionState: undefined,\n });\n }\n }\n\n /**\n * Update status\n */\n updateStatus(agentId: string, status: AgentPresence['status']): void {\n const presence = this.presences.get(agentId);\n\n if (presence) {\n presence.status = status;\n presence.lastSeen = new Date().toISOString();\n\n this.presences.set(agentId, presence);\n this.emit('status_updated', { agentId, status });\n }\n }\n\n /**\n * Heartbeat from agent (keeps them online)\n */\n heartbeat(agentId: string): void {\n const presence = this.presences.get(agentId);\n\n if (presence) {\n if (presence.status === 'reconnecting') {\n presence.status = 'online';\n this.emit('status_updated', { agentId, status: 'online' });\n }\n\n presence.lastSeen = new Date().toISOString();\n this.presences.set(agentId, presence);\n }\n }\n\n /**\n * Get presence for agent\n */\n getPresence(agentId: string): AgentPresence | undefined {\n return this.presences.get(agentId);\n }\n\n /**\n * Get all online agents\n */\n getOnlineAgents(): AgentPresence[] {\n return Array.from(this.presences.values()).filter(\n (p) => p.status === 'online'\n );\n }\n\n /**\n * Get all agents\n */\n getAllAgents(): AgentPresence[] {\n return Array.from(this.presences.values());\n }\n\n /**\n * Get all presences\n */\n getAllPresences(): AgentPresence[] {\n return Array.from(this.presences.values());\n }\n\n /**\n * Get agent count\n */\n getAgentCount(): Record<AgentPresence['status'], number> {\n const counts = {\n online: 0,\n away: 0,\n offline: 0,\n reconnecting: 0,\n };\n\n this.presences.forEach((p) => {\n counts[p.status]++;\n });\n\n return counts;\n }\n\n /**\n * Get statistics\n */\n getStats() {\n return {\n totalAgents: this.presences.size,\n onlineAgents: Array.from(this.presences.values()).filter(\n (p) => p.status === 'online'\n ).length,\n offlineAgents: Array.from(this.presences.values()).filter(\n (p) => p.status === 'offline'\n ).length,\n awayAgents: Array.from(this.presences.values()).filter(\n (p) => p.status === 'away'\n ).length,\n reconnectingAgents: Array.from(this.presences.values()).filter(\n (p) => p.status === 'reconnecting'\n ).length,\n };\n }\n\n /**\n * Clear expired presences\n */\n clearExpiredPresences(maxAgeMs: number): void {\n const now = Date.now();\n const toRemove: string[] = [];\n\n this.presences.forEach((presence, agentId) => {\n const lastSeenTime = new Date(presence.lastSeen).getTime();\n const ageMs = now - lastSeenTime;\n\n if (ageMs > maxAgeMs && presence.status === 'offline') {\n toRemove.push(agentId);\n }\n });\n\n toRemove.forEach((agentId) => {\n this.presences.delete(agentId);\n });\n\n if (toRemove.length > 0) {\n logger.debug('[AgentPresenceManager] Cleared expired presences', {\n count: toRemove.length,\n });\n }\n }\n\n /**\n * Get agents by role\n */\n getByRole(role: AgentPresence['role']): AgentPresence[] {\n return Array.from(this.presences.values()).filter((p) => p.role === role);\n }\n\n /**\n * Get agents in active section\n */\n getInSection(section: string): AgentPresence[] {\n return Array.from(this.presences.values()).filter(\n (p) => p.activeSection === section && p.status === 'online'\n );\n }\n\n /**\n * Get presence timeline\n */\n getPresenceStats() {\n const stats = {\n total: this.presences.size,\n online: 0,\n away: 0,\n offline: 0,\n reconnecting: 0,\n byRole: {} as Record<string, number>,\n };\n\n this.presences.forEach((p) => {\n stats[p.status]++;\n stats.byRole[p.role] = (stats.byRole[p.role] ?? 0) + 1;\n });\n\n return stats;\n }\n\n /**\n * Start heartbeat check (mark inactive agents as away)\n */\n private startHeartbeatCheck(): void {\n this.heartbeatInterval = setInterval(() => {\n const now = Date.now();\n\n this.presences.forEach((presence) => {\n const lastSeenTime = new Date(presence.lastSeen).getTime();\n const timeSinceLastSeen = now - lastSeenTime;\n\n if (\n timeSinceLastSeen > this.inactivityThreshold &&\n presence.status === 'online'\n ) {\n presence.status = 'away';\n this.emit('status_updated', {\n agentId: presence.agentId,\n status: 'away',\n });\n }\n\n if (\n timeSinceLastSeen > this.heartbeatTimeout &&\n presence.status !== 'offline'\n ) {\n presence.status = 'reconnecting';\n this.emit('status_updated', {\n agentId: presence.agentId,\n status: 'reconnecting',\n });\n }\n });\n }, 10000);\n }\n\n /**\n * Stop heartbeat monitoring\n */\n stopHeartbeatMonitoring(): void {\n if (this.heartbeatInterval) {\n clearInterval(this.heartbeatInterval);\n this.heartbeatInterval = null;\n }\n }\n\n /**\n * Clear all presences\n */\n clear(): void {\n this.presences.clear();\n }\n\n /**\n * Destroy the manager\n */\n destroy(): void {\n this.stopHeartbeatMonitoring();\n this.presences.clear();\n this.removeAllListeners();\n logger.debug('[AgentPresenceManager] Destroyed', {\n sessionId: this.sessionId,\n });\n }\n}\n\n// ============================================================================\n// Singleton Instance Map\n// ============================================================================\n\nconst instances = new Map<string, AgentPresenceManager>();\n\nexport function getAgentPresenceManager(\n sessionId: string\n): AgentPresenceManager {\n if (!instances.has(sessionId)) {\n instances.set(sessionId, new AgentPresenceManager(sessionId));\n }\n return instances.get(sessionId)!;\n}\n\nexport function clearAgentPresenceManager(sessionId: string): void {\n const instance = instances.get(sessionId);\n if (instance) {\n instance.destroy();\n instances.delete(sessionId);\n }\n}\n","/**\n * Aeon Crypto Types\n *\n * Type definitions for cryptographic operations in Aeon.\n * These are compatible with @affectively/auth and @affectively/auth.\n */\n\n// =============================================================================\n// IDENTITY TYPES (compatible with @affectively/auth)\n// =============================================================================\n\n/**\n * Decentralized Identifier (DID)\n * Format: did:method:identifier\n */\nexport type DID = `did:${string}:${string}`;\n\n/**\n * Supported signing algorithms\n */\nexport type SigningAlgorithm = 'ES256' | 'Ed25519' | 'ES384' | 'ES512';\n\n/**\n * Key pair for signing and verification\n */\nexport interface KeyPair {\n algorithm: SigningAlgorithm;\n publicKey: JsonWebKey;\n privateKey?: JsonWebKey;\n fingerprint: string;\n}\n\n/**\n * Identity representing a user or node\n */\nexport interface Identity {\n did: DID;\n signingKey: KeyPair;\n encryptionKey?: KeyPair;\n createdAt: number;\n displayName?: string;\n}\n\n/**\n * UCAN Capability structure\n */\nexport interface Capability {\n can: string;\n with: string;\n constraints?: Record<string, unknown>;\n}\n\n/**\n * UCAN Token payload\n */\nexport interface UCANPayload {\n iss: DID;\n aud: DID;\n exp: number;\n nbf?: number;\n iat?: number;\n nonce?: string;\n jti?: string;\n att: Capability[];\n prf?: string[];\n fct?: Record<string, unknown>;\n}\n\n/**\n * Parsed UCAN Token\n */\nexport interface UCANToken {\n payload: UCANPayload;\n raw: string;\n signature: Uint8Array;\n algorithm: string;\n}\n\n/**\n * UCAN verification result\n */\nexport interface VerificationResult {\n valid: boolean;\n payload?: UCANPayload;\n error?: string;\n expired?: boolean;\n shouldRotate?: boolean;\n expiresIn?: number;\n}\n\n// =============================================================================\n// ENCRYPTION TYPES (compatible with @affectively/auth)\n// =============================================================================\n\n/**\n * Encryption algorithms supported\n */\nexport type EncryptionAlgorithm = 'ECIES-P256' | 'AES-256-GCM';\n\n/**\n * HKDF domain separator categories\n */\nexport type DomainCategory =\n | 'default'\n | 'sync'\n | 'message'\n | 'api-key'\n | 'personal-data'\n | string;\n\n/**\n * EC Key pair for ECDH operations\n */\nexport interface ECKeyPair {\n publicKey: JsonWebKey;\n privateKey: JsonWebKey;\n keyId: string;\n createdAt: string;\n}\n\n/**\n * Encrypted data envelope\n */\nexport interface EncryptedPayload {\n alg: EncryptionAlgorithm;\n ct: string;\n iv: string;\n tag: string;\n epk?: JsonWebKey;\n category?: DomainCategory;\n nonce?: string;\n encryptedAt: number;\n}\n\n/**\n * Decryption result\n */\nexport interface DecryptionResult {\n plaintext: Uint8Array;\n category?: DomainCategory;\n encryptedAt: number;\n}\n\n// =============================================================================\n// AEON-SPECIFIC TYPES\n// =============================================================================\n\n/**\n * Aeon encryption mode\n */\nexport type AeonEncryptionMode =\n | 'none' // No encryption (development/testing)\n | 'transport' // Encrypt in transit only (session keys)\n | 'at-rest' // Encrypt for storage\n | 'end-to-end'; // Full E2E encryption between nodes\n\n/**\n * Aeon sync capability namespace\n */\nexport const AEON_CAPABILITIES = {\n // Basic sync operations\n SYNC_READ: 'aeon:sync:read',\n SYNC_WRITE: 'aeon:sync:write',\n SYNC_ADMIN: 'aeon:sync:admin',\n\n // Node operations\n NODE_REGISTER: 'aeon:node:register',\n NODE_HEARTBEAT: 'aeon:node:heartbeat',\n\n // Replication operations\n REPLICATE_READ: 'aeon:replicate:read',\n REPLICATE_WRITE: 'aeon:replicate:write',\n\n // State operations\n STATE_READ: 'aeon:state:read',\n STATE_WRITE: 'aeon:state:write',\n STATE_RECONCILE: 'aeon:state:reconcile',\n} as const;\n\nexport type AeonCapability =\n (typeof AEON_CAPABILITIES)[keyof typeof AEON_CAPABILITIES];\n\n/**\n * Crypto configuration for Aeon\n */\nexport interface AeonCryptoConfig {\n /** Default encryption mode for sync messages */\n defaultEncryptionMode: AeonEncryptionMode;\n /** Require all messages to be signed */\n requireSignatures: boolean;\n /** Require UCAN capability verification */\n requireCapabilities: boolean;\n /** Allowed signature algorithms */\n allowedSignatureAlgorithms: string[];\n /** Allowed encryption algorithms */\n allowedEncryptionAlgorithms: string[];\n /** UCAN audience DID for verification */\n ucanAudience?: string;\n /** Session key expiration (ms) */\n sessionKeyExpiration?: number;\n}\n\n/**\n * Default crypto configuration\n */\nexport const DEFAULT_CRYPTO_CONFIG: AeonCryptoConfig = {\n defaultEncryptionMode: 'none',\n requireSignatures: false,\n requireCapabilities: false,\n allowedSignatureAlgorithms: ['ES256', 'Ed25519'],\n allowedEncryptionAlgorithms: ['ECIES-P256', 'AES-256-GCM'],\n sessionKeyExpiration: 24 * 60 * 60 * 1000, // 24 hours\n};\n\n/**\n * Authenticated sync message fields\n */\nexport interface AuthenticatedMessageFields {\n /** Sender DID */\n senderDID?: string;\n /** Receiver DID */\n receiverDID?: string;\n /** UCAN token for capability verification */\n ucan?: string;\n /** Message signature (base64url) */\n signature?: string;\n /** Whether payload is encrypted */\n encrypted?: boolean;\n}\n\n/**\n * Secure sync session\n */\nexport interface SecureSyncSession {\n id: string;\n initiator: string;\n participants: string[];\n sessionKey?: Uint8Array;\n encryptionMode: AeonEncryptionMode;\n requiredCapabilities: string[];\n status: 'pending' | 'active' | 'completed' | 'failed';\n startTime: string;\n endTime?: string;\n}\n\n/**\n * Node with identity information\n */\nexport interface SecureNodeInfo {\n id: string;\n did?: string;\n publicSigningKey?: JsonWebKey;\n publicEncryptionKey?: JsonWebKey;\n capabilities?: string[];\n lastSeen?: number;\n}\n\n/**\n * Capability verification result\n */\nexport interface AeonCapabilityResult {\n authorized: boolean;\n error?: string;\n issuer?: string;\n grantedCapabilities?: Array<{ can: string; with: string }>;\n}\n\n/**\n * Signed data envelope for sync operations\n */\nexport interface SignedSyncData<T = unknown> {\n payload: T;\n signature: string;\n signer: string;\n algorithm: string;\n signedAt: number;\n}\n","/**\n * Aeon Crypto Provider Interface\n *\n * Abstract interface for cryptographic operations.\n * Aeon core remains zero-dependency - crypto is injected through this interface.\n */\n\nimport type {\n AeonCapabilityResult,\n SignedSyncData,\n SecureNodeInfo,\n} from './types';\n\n/**\n * Abstract crypto provider interface\n *\n * Implementations use @affectively/auth and @affectively/auth\n * or other compatible libraries.\n */\nexport interface ICryptoProvider {\n // ===========================================================================\n // IDENTITY OPERATIONS\n // ===========================================================================\n\n /**\n * Generate a new identity with DID and key pairs\n */\n generateIdentity(displayName?: string): Promise<{\n did: string;\n publicSigningKey: JsonWebKey;\n publicEncryptionKey?: JsonWebKey;\n }>;\n\n /**\n * Get the local identity's DID\n */\n getLocalDID(): string | null;\n\n /**\n * Export local identity's public info for sharing\n */\n exportPublicIdentity(): Promise<SecureNodeInfo | null>;\n\n /**\n * Register a known remote node's public keys\n */\n registerRemoteNode(node: SecureNodeInfo): Promise<void>;\n\n /**\n * Get a remote node's public key\n */\n getRemotePublicKey(did: string): Promise<JsonWebKey | null>;\n\n // ===========================================================================\n // SIGNING OPERATIONS\n // ===========================================================================\n\n /**\n * Sign data with local identity's private key\n */\n sign(data: Uint8Array): Promise<Uint8Array>;\n\n /**\n * Sign structured data and wrap in SignedSyncData envelope\n */\n signData<T>(data: T): Promise<SignedSyncData<T>>;\n\n /**\n * Verify a signature from a remote node\n */\n verify(\n did: string,\n signature: Uint8Array,\n data: Uint8Array\n ): Promise<boolean>;\n\n /**\n * Verify a SignedSyncData envelope\n */\n verifySignedData<T>(signedData: SignedSyncData<T>): Promise<boolean>;\n\n // ===========================================================================\n // ENCRYPTION OPERATIONS\n // ===========================================================================\n\n /**\n * Encrypt data for a recipient\n */\n encrypt(\n plaintext: Uint8Array,\n recipientDID: string\n ): Promise<{\n alg: string;\n ct: string;\n iv: string;\n tag: string;\n epk?: JsonWebKey;\n encryptedAt: number;\n }>;\n\n /**\n * Decrypt data\n */\n decrypt(\n encrypted: {\n alg: string;\n ct: string;\n iv: string;\n tag: string;\n epk?: JsonWebKey;\n },\n senderDID?: string\n ): Promise<Uint8Array>;\n\n /**\n * Derive or get a session key for communication with a peer\n */\n getSessionKey(peerDID: string): Promise<Uint8Array>;\n\n /**\n * Encrypt with a session key\n */\n encryptWithSessionKey(\n plaintext: Uint8Array,\n sessionKey: Uint8Array\n ): Promise<{\n alg: string;\n ct: string;\n iv: string;\n tag: string;\n encryptedAt: number;\n }>;\n\n /**\n * Decrypt with a session key\n */\n decryptWithSessionKey(\n encrypted: {\n ct: string;\n iv: string;\n tag: string;\n },\n sessionKey: Uint8Array\n ): Promise<Uint8Array>;\n\n // ===========================================================================\n // UCAN OPERATIONS\n // ===========================================================================\n\n /**\n * Create a UCAN token\n */\n createUCAN(\n audience: string,\n capabilities: Array<{ can: string; with: string }>,\n options?: {\n expirationSeconds?: number;\n proofs?: string[];\n }\n ): Promise<string>;\n\n /**\n * Verify a UCAN token\n */\n verifyUCAN(\n token: string,\n options?: {\n expectedAudience?: string;\n requiredCapabilities?: Array<{ can: string; with: string }>;\n }\n ): Promise<AeonCapabilityResult>;\n\n /**\n * Delegate capabilities\n */\n delegateCapabilities(\n parentToken: string,\n audience: string,\n capabilities: Array<{ can: string; with: string }>,\n options?: {\n expirationSeconds?: number;\n }\n ): Promise<string>;\n\n // ===========================================================================\n // UTILITY OPERATIONS\n // ===========================================================================\n\n /**\n * Compute hash of data\n */\n hash(data: Uint8Array): Promise<Uint8Array>;\n\n /**\n * Generate random bytes\n */\n randomBytes(length: number): Uint8Array;\n\n /**\n * Check if crypto is properly initialized\n */\n isInitialized(): boolean;\n}\n\n/**\n * Null crypto provider for when crypto is disabled\n *\n * All operations either throw or return permissive defaults.\n */\nexport class NullCryptoProvider implements ICryptoProvider {\n private notConfiguredError(): Error {\n return new Error('Crypto provider not configured');\n }\n\n async generateIdentity(): Promise<{\n did: string;\n publicSigningKey: JsonWebKey;\n publicEncryptionKey?: JsonWebKey;\n }> {\n throw this.notConfiguredError();\n }\n\n getLocalDID(): string | null {\n return null;\n }\n\n async exportPublicIdentity(): Promise<SecureNodeInfo | null> {\n return null;\n }\n\n async registerRemoteNode(): Promise<void> {\n // No-op when crypto disabled\n }\n\n async getRemotePublicKey(): Promise<JsonWebKey | null> {\n return null;\n }\n\n async sign(): Promise<Uint8Array> {\n throw this.notConfiguredError();\n }\n\n async signData<T>(_data: T): Promise<SignedSyncData<T>> {\n throw this.notConfiguredError();\n }\n\n async verify(): Promise<boolean> {\n // Permissive when crypto disabled\n return true;\n }\n\n async verifySignedData(): Promise<boolean> {\n // Permissive when crypto disabled\n return true;\n }\n\n async encrypt(): Promise<{\n alg: string;\n ct: string;\n iv: string;\n tag: string;\n epk?: JsonWebKey;\n encryptedAt: number;\n }> {\n throw this.notConfiguredError();\n }\n\n async decrypt(): Promise<Uint8Array> {\n throw this.notConfiguredError();\n }\n\n async getSessionKey(): Promise<Uint8Array> {\n throw this.notConfiguredError();\n }\n\n async encryptWithSessionKey(): Promise<{\n alg: string;\n ct: string;\n iv: string;\n tag: string;\n encryptedAt: number;\n }> {\n throw this.notConfiguredError();\n }\n\n async decryptWithSessionKey(): Promise<Uint8Array> {\n throw this.notConfiguredError();\n }\n\n async createUCAN(): Promise<string> {\n throw this.notConfiguredError();\n }\n\n async verifyUCAN(): Promise<AeonCapabilityResult> {\n // Permissive when crypto disabled\n return { authorized: true };\n }\n\n async delegateCapabilities(): Promise<string> {\n throw this.notConfiguredError();\n }\n\n async hash(): Promise<Uint8Array> {\n throw this.notConfiguredError();\n }\n\n randomBytes(length: number): Uint8Array {\n // Use crypto.getRandomValues even without full crypto setup\n return crypto.getRandomValues(new Uint8Array(length));\n }\n\n isInitialized(): boolean {\n return false;\n }\n}\n","/**\n * Aeon Transaction Signer Abstraction\n *\n * Keeps sync cryptography (`ICryptoProvider`) decoupled from on-chain write signing.\n * This interface matches custodial signer semantics so server and Aeon callers\n * converge on one contract shape.\n */\n\nexport type HexString = `0x${string}`;\n\nexport type TransactionSignerPayloadMap = Record<string, unknown>;\n\nexport type TransactionSignerExecuteRequest<\n TPayloads extends TransactionSignerPayloadMap,\n TAction extends keyof TPayloads & string = keyof TPayloads & string\n> = {\n action: TAction;\n payload: TPayloads[TAction];\n chainId?: number;\n waitForReceipt?: boolean;\n requestId?: string;\n};\n\nexport type TransactionSignerErrorCode =\n | 'invalid_request'\n | 'signer_unavailable'\n | 'signer_denied'\n | 'tx_failed'\n | 'tx_reverted'\n | 'unauthorized'\n | 'forbidden'\n | 'unknown_action'\n | 'upstream_error';\n\nexport interface TransactionSignerExecuteResponse<\n TAction extends string = string\n> {\n success: boolean;\n action: TAction;\n chainId: number;\n txHash?: HexString;\n receiptStatus?: 'pending' | 'success' | 'reverted';\n signerAddress?: HexString;\n keyVersion?: string;\n errorCode?: TransactionSignerErrorCode;\n errorMessage?: string;\n revertReason?: string;\n}\n\nexport interface TransactionSignerMetadata<TAction extends string = string> {\n action: TAction;\n chainId: number;\n signerAddress: HexString;\n keyVersion: string;\n keyName: string;\n}\n\nexport interface TransactionSignerHealth {\n ok: boolean;\n service: string;\n timestamp: string;\n}\n\nexport interface ITransactionSigner<\n TPayloads extends TransactionSignerPayloadMap = TransactionSignerPayloadMap\n> {\n execute<TAction extends keyof TPayloads & string>(\n request: TransactionSignerExecuteRequest<TPayloads, TAction>\n ): Promise<TransactionSignerExecuteResponse<TAction>>;\n\n getSigner<TAction extends keyof TPayloads & string>(\n action: TAction\n ): Promise<TransactionSignerMetadata<TAction>>;\n\n health(): Promise<TransactionSignerHealth>;\n}\n\nexport class NullTransactionSigner<\n TPayloads extends TransactionSignerPayloadMap = TransactionSignerPayloadMap\n> implements ITransactionSigner<TPayloads>\n{\n async execute<TAction extends keyof TPayloads & string>(\n request: TransactionSignerExecuteRequest<TPayloads, TAction>\n ): Promise<TransactionSignerExecuteResponse<TAction>> {\n return {\n success: false,\n action: request.action,\n chainId: request.chainId || 0,\n errorCode: 'signer_unavailable',\n errorMessage: 'Transaction signer not configured',\n };\n }\n\n async getSigner<TAction extends keyof TPayloads & string>(\n action: TAction\n ): Promise<TransactionSignerMetadata<TAction>> {\n throw new Error(\n `Transaction signer metadata unavailable for action: ${action}`\n );\n }\n\n async health(): Promise<TransactionSignerHealth> {\n return {\n ok: false,\n service: 'transaction-signer',\n timestamp: new Date().toISOString(),\n };\n }\n}\n\nexport function createTransactionSignerAdapter<\n TPayloads extends TransactionSignerPayloadMap\n>(contract: ITransactionSigner<TPayloads>): ITransactionSigner<TPayloads> {\n return contract;\n}\n","/**\n * Aeon Flow Codec — Binary Frame Layer\n *\n * Encodes and decodes FlowFrames into a compact 10-byte header + payload\n * binary wire format. Optionally accelerated by WASM; falls back to pure JS.\n *\n * Wire format (10 bytes header):\n * [0..1] stream_id u16 big-endian\n * [2..5] sequence u32 big-endian\n * [6] flags u8\n * [7..9] length u24 big-endian (payload bytes, max 16 MB)\n *\n * The codec is zerocopy where possible: decode returns a Uint8Array view\n * into the original buffer rather than copying payload bytes.\n *\n * @see docs/ebooks/145-log-rolling-pipelined-prefill/ch14-aeon-flow-protocol.md\n */\n\nimport type { FlowFrame } from './types';\n\n/** Header size in bytes */\nexport const HEADER_SIZE = 10;\n\n/** Maximum payload length (2^24 - 1 = 16,777,215 bytes ≈ 16 MB) */\nexport const MAX_PAYLOAD_LENGTH = 0xFFFFFF;\n\ntype WasmMode = 'auto' | 'off' | 'force';\ntype WasmModuleInput = WebAssembly.Module | BufferSource;\n\nexport interface FlowCodecCreateOptions {\n /**\n * WASM mode:\n * - auto: try WASM, fallback to JS on any failure (default)\n * - off: force JS path\n * - force: require WASM, throw if unavailable\n */\n wasmMode?: WasmMode;\n /**\n * Optional caller-supplied WASM module or bytes.\n * Useful in Node/Bun where the caller controls file loading.\n */\n wasmModule?: WasmModuleInput;\n}\n\ninterface FlowCodecWasmExports {\n memory: WebAssembly.Memory;\n allocate: (size: number) => number;\n decodeFrame: (\n framePtr: number,\n streamIdPtr: number,\n sequencePtr: number,\n flagsPtr: number,\n lengthPtr: number\n ) => number;\n}\n\ninterface FlowCodecWasmState {\n exports: FlowCodecWasmExports;\n framePtr: number;\n streamIdPtr: number;\n sequencePtr: number;\n flagsPtr: number;\n lengthPtr: number;\n memoryBytes: Uint8Array;\n memoryView: DataView;\n}\n\ninterface DecodedHeader {\n streamId: number;\n sequence: number;\n flags: number;\n length: number;\n}\n\n/**\n * FlowCodec — binary encoder/decoder for FlowFrames.\n *\n * Create via `FlowCodec.create()` which attempts WASM acceleration,\n * falling back to the pure JS path (which is always available).\n */\nexport class FlowCodec {\n private wasmInstance: WebAssembly.Instance | null = null;\n private wasmState: FlowCodecWasmState | null = null;\n\n private constructor(wasmInstance: WebAssembly.Instance | null) {\n this.wasmInstance = wasmInstance;\n if (wasmInstance) {\n this.wasmState = FlowCodec.createWasmState(wasmInstance);\n if (!this.wasmState) {\n this.wasmInstance = null;\n }\n }\n }\n\n /**\n * Create a FlowCodec. Tries WASM acceleration, falls back to JS.\n * The JS path is always correct — WASM is a performance optimization only.\n */\n static async create(options: FlowCodecCreateOptions = {}): Promise<FlowCodec> {\n const wasmMode = options.wasmMode ?? 'auto';\n if (wasmMode === 'off') {\n return new FlowCodec(null);\n }\n if (typeof WebAssembly === 'undefined') {\n if (wasmMode === 'force') {\n throw new Error('FlowCodec WASM requested in force mode, but WebAssembly is unavailable');\n }\n return new FlowCodec(null);\n }\n\n let source: WasmModuleInput | null = options.wasmModule ?? null;\n if (!source) {\n source = await FlowCodec.loadDefaultWasmModule();\n if (!source) {\n if (wasmMode === 'force') {\n throw new Error(\n 'FlowCodec WASM module not found (expected src/flow/wasm/aeon-flow-codec.wasm)',\n );\n }\n return new FlowCodec(null);\n }\n }\n\n try {\n const wasmInstance = await FlowCodec.instantiateWasm(source);\n const codec = new FlowCodec(wasmInstance);\n if (codec.isWasmAccelerated) return codec;\n if (wasmMode === 'force') {\n throw new Error('FlowCodec WASM exports are missing required symbols');\n }\n return new FlowCodec(null);\n } catch (error) {\n if (wasmMode === 'force') {\n throw error;\n }\n return new FlowCodec(null);\n }\n }\n\n /**\n * Create a FlowCodec synchronously (JS-only, no WASM attempt).\n */\n static createSync(): FlowCodec {\n return new FlowCodec(null);\n }\n\n /**\n * Whether WASM acceleration is active.\n */\n get isWasmAccelerated(): boolean {\n return this.wasmInstance !== null && this.wasmState !== null;\n }\n\n // ═══════════════════════════════════════════════════════════════════════\n // Encode\n // ═══════════════════════════════════════════════════════════════════════\n\n /**\n * Encode a single FlowFrame into a binary buffer.\n *\n * Returns a new Uint8Array containing the 10-byte header followed by\n * the payload bytes.\n */\n encode(frame: FlowFrame): Uint8Array {\n const payloadLen = frame.payload.length;\n if (payloadLen > MAX_PAYLOAD_LENGTH) {\n throw new RangeError(\n `Payload length ${payloadLen} exceeds maximum ${MAX_PAYLOAD_LENGTH}`\n );\n }\n\n const buf = new Uint8Array(HEADER_SIZE + payloadLen);\n const view = new DataView(buf.buffer, buf.byteOffset, buf.byteLength);\n\n // stream_id: u16\n view.setUint16(0, frame.streamId);\n // sequence: u32\n view.setUint32(2, frame.sequence);\n // flags: u8\n buf[6] = frame.flags;\n // length: u24 big-endian\n buf[7] = (payloadLen >>> 16) & 0xFF;\n buf[8] = (payloadLen >>> 8) & 0xFF;\n buf[9] = payloadLen & 0xFF;\n // payload\n buf.set(frame.payload, HEADER_SIZE);\n\n return buf;\n }\n\n /**\n * Decode a single FlowFrame from a buffer at the given offset.\n *\n * The returned frame's `payload` is a zerocopy view into the original\n * buffer — no data is copied. Callers who need the payload to outlive\n * the original buffer should `.slice()` it.\n *\n * @returns The decoded frame and the number of bytes consumed.\n */\n decode(\n buffer: Uint8Array,\n offset = 0\n ): { frame: FlowFrame; bytesRead: number } {\n if (buffer.length - offset < HEADER_SIZE) {\n throw new RangeError(\n `Buffer too small: need at least ${HEADER_SIZE} bytes, have ${buffer.length - offset}`\n );\n }\n\n const header = this.decodeHeader(buffer, offset);\n const { streamId, sequence, flags, length } = header;\n\n if (buffer.length - offset - HEADER_SIZE < length) {\n throw new RangeError(\n `Buffer too small for payload: need ${length} bytes, have ${buffer.length - offset - HEADER_SIZE}`\n );\n }\n\n // Zerocopy: payload is a view into the original buffer\n const payload = buffer.subarray(\n offset + HEADER_SIZE,\n offset + HEADER_SIZE + length\n );\n\n return {\n frame: { streamId, sequence, flags, payload },\n bytesRead: HEADER_SIZE + length,\n };\n }\n\n // ═══════════════════════════════════════════════════════════════════════\n // Batch encode/decode\n // ═══════════════════════════════════════════════════════════════════════\n\n /**\n * Encode multiple frames into a single contiguous buffer.\n *\n * Frames are laid out sequentially: [header+payload][header+payload]...\n */\n encodeBatch(frames: FlowFrame[]): Uint8Array {\n // Calculate total size\n let totalSize = 0;\n for (const frame of frames) {\n if (frame.payload.length > MAX_PAYLOAD_LENGTH) {\n throw new RangeError(\n `Payload length ${frame.payload.length} exceeds maximum ${MAX_PAYLOAD_LENGTH}`\n );\n }\n totalSize += HEADER_SIZE + frame.payload.length;\n }\n\n const buf = new Uint8Array(totalSize);\n let writeOffset = 0;\n\n for (const frame of frames) {\n const encoded = this.encode(frame);\n buf.set(encoded, writeOffset);\n writeOffset += encoded.length;\n }\n\n return buf;\n }\n\n /**\n * Decode all frames from a contiguous buffer.\n *\n * Payloads are zerocopy views into the original buffer.\n */\n decodeBatch(buffer: Uint8Array): FlowFrame[] {\n const frames: FlowFrame[] = [];\n let offset = 0;\n\n while (offset < buffer.length) {\n // Need at least a header to continue\n if (buffer.length - offset < HEADER_SIZE) {\n throw new RangeError(\n `Truncated frame at offset ${offset}: need ${HEADER_SIZE} bytes, have ${buffer.length - offset}`\n );\n }\n\n const { frame, bytesRead } = this.decode(buffer, offset);\n frames.push(frame);\n offset += bytesRead;\n }\n\n return frames;\n }\n\n private decodeHeader(buffer: Uint8Array, offset: number): DecodedHeader {\n if (!this.wasmState) {\n return this.decodeHeaderInJavaScript(buffer, offset);\n }\n return this.decodeHeaderWithWasm(buffer, offset);\n }\n\n private decodeHeaderInJavaScript(\n buffer: Uint8Array,\n offset: number,\n ): DecodedHeader {\n const view = new DataView(\n buffer.buffer,\n buffer.byteOffset + offset,\n buffer.byteLength - offset\n );\n\n return {\n streamId: view.getUint16(0),\n sequence: view.getUint32(2),\n flags: buffer[offset + 6],\n length:\n (buffer[offset + 7] << 16) |\n (buffer[offset + 8] << 8) |\n buffer[offset + 9],\n };\n }\n\n private decodeHeaderWithWasm(\n buffer: Uint8Array,\n offset: number,\n ): DecodedHeader {\n const wasmState = this.wasmState;\n if (!wasmState) {\n return this.decodeHeaderInJavaScript(buffer, offset);\n }\n\n this.refreshWasmViews(wasmState);\n wasmState.memoryBytes.set(\n buffer.subarray(offset, offset + HEADER_SIZE),\n wasmState.framePtr,\n );\n\n const bytesRead = wasmState.exports.decodeFrame(\n wasmState.framePtr,\n wasmState.streamIdPtr,\n wasmState.sequencePtr,\n wasmState.flagsPtr,\n wasmState.lengthPtr,\n );\n\n if (bytesRead !== HEADER_SIZE) {\n throw new RangeError(\n `WASM decoder returned invalid header size ${bytesRead} (expected ${HEADER_SIZE})`,\n );\n }\n\n return {\n streamId: wasmState.memoryView.getUint16(wasmState.streamIdPtr, true),\n sequence: wasmState.memoryView.getUint32(wasmState.sequencePtr, true),\n flags: wasmState.memoryBytes[wasmState.flagsPtr],\n length: wasmState.memoryView.getUint32(wasmState.lengthPtr, true),\n };\n }\n\n private refreshWasmViews(state: FlowCodecWasmState): void {\n if (state.memoryBytes.buffer === state.exports.memory.buffer) {\n return;\n }\n\n state.memoryBytes = new Uint8Array(state.exports.memory.buffer);\n state.memoryView = new DataView(state.exports.memory.buffer);\n }\n\n private static createWasmState(\n wasmInstance: WebAssembly.Instance,\n ): FlowCodecWasmState | null {\n const exports = wasmInstance.exports as Record<string, unknown>;\n const memory = exports.memory;\n const allocate = exports.allocate;\n const decodeFrame = exports.decode_frame;\n\n if (!(memory instanceof WebAssembly.Memory)) return null;\n if (typeof allocate !== 'function') return null;\n if (typeof decodeFrame !== 'function') return null;\n\n const wasmExports: FlowCodecWasmExports = {\n memory,\n allocate: allocate as FlowCodecWasmExports['allocate'],\n decodeFrame: decodeFrame as FlowCodecWasmExports['decodeFrame'],\n };\n\n const framePtr = wasmExports.allocate(HEADER_SIZE);\n const streamIdPtr = wasmExports.allocate(2);\n const sequencePtr = wasmExports.allocate(4);\n const flagsPtr = wasmExports.allocate(1);\n const lengthPtr = wasmExports.allocate(4);\n\n return {\n exports: wasmExports,\n framePtr,\n streamIdPtr,\n sequencePtr,\n flagsPtr,\n lengthPtr,\n memoryBytes: new Uint8Array(memory.buffer),\n memoryView: new DataView(memory.buffer),\n };\n }\n\n private static async instantiateWasm(\n source: WasmModuleInput,\n ): Promise<WebAssembly.Instance> {\n if (source instanceof WebAssembly.Module) {\n return new WebAssembly.Instance(source, {});\n }\n\n const bytes = FlowCodec.toUint8Array(source);\n const result: unknown = await WebAssembly.instantiate(bytes, {});\n if (result instanceof WebAssembly.Instance) {\n return result;\n }\n\n if (\n typeof result === 'object' &&\n result !== null &&\n 'instance' in result\n ) {\n const maybeInstance = (result as { instance: unknown }).instance;\n if (maybeInstance instanceof WebAssembly.Instance) {\n return maybeInstance;\n }\n }\n\n throw new Error('Unexpected WebAssembly.instantiate result');\n }\n\n private static toUint8Array(source: BufferSource): Uint8Array {\n if (source instanceof ArrayBuffer) {\n return new Uint8Array(source);\n }\n\n return new Uint8Array(source.buffer, source.byteOffset, source.byteLength);\n }\n\n private static async loadDefaultWasmModule(): Promise<Uint8Array | null> {\n if (typeof fetch !== 'function') return null;\n\n // Construct dynamically to avoid hard build-time asset coupling.\n const wasmPath = './wasm/' + 'aeon-flow-codec.wasm';\n const wasmUrl = new URL(wasmPath, import.meta.url);\n\n try {\n const response = await fetch(wasmUrl);\n if (!response.ok) return null;\n return new Uint8Array(await response.arrayBuffer());\n } catch {\n return null;\n }\n }\n}\n","/**\n * Aeon Flow Protocol — Type Definitions\n *\n * The Aeon Flow Protocol extracts the fork/race/fold primitive that\n * appears independently across the entire stack (inference, ESI, sync,\n * shell, frontend) into a unified, protocol-level abstraction with a\n * pure binary wire format.\n *\n * @see docs/ebooks/145-log-rolling-pipelined-prefill/ch14-aeon-flow-protocol.md\n */\n\n// ═══════════════════════════════════════════════════════════════════════════════\n// Frame Flags\n// ═══════════════════════════════════════════════════════════════════════════════\n\n/** Fork: opens child streams from a parent */\nexport const FORK = 0x01;\n/** Race: marks streams as racing — first to complete wins */\nexport const RACE = 0x02;\n/** Fold: merge results from multiple streams into one */\nexport const FOLD = 0x04;\n/** Vent: NaN propagation, error, or cancellation */\nexport const VENT = 0x08;\n/** Fin: stream is complete, no more frames will be sent */\nexport const FIN = 0x10;\n/** Poison: stream is terminated due to error or cancellation */\nexport const POISON = 0x20;\n\n// ═══════════════════════════════════════════════════════════════════════════════\n// Wire Format Types\n// ═══════════════════════════════════════════════════════════════════════════════\n\n/**\n * A single frame on the wire.\n *\n * FlowFrame {\n * stream_id: u16 // multiplexed stream identifier\n * sequence: u32 // position within stream\n * flags: u8 // FORK | RACE | FOLD | VENT | FIN\n * length: u24 // payload length (up to 16MB)\n * payload: [u8] // raw bytes\n * }\n *\n * Total header: 10 bytes.\n */\nexport interface FlowFrame {\n /** Multiplexed stream identifier (u16, 0–65535) */\n streamId: number;\n /** Sequence number within the stream (u32) */\n sequence: number;\n /** Bitfield of frame flags (FORK, RACE, FOLD, VENT, FIN) */\n flags: number;\n /** Raw payload bytes */\n payload: Uint8Array;\n}\n\n// ═══════════════════════════════════════════════════════════════════════════════\n// Stream Types\n// ═══════════════════════════════════════════════════════════════════════════════\n\n/** Stream lifecycle states */\nexport type FlowStreamState =\n | 'open'\n | 'racing'\n | 'folding'\n | 'closed'\n | 'vented';\n\n/**\n * A logical stream within the protocol.\n *\n * Streams form a tree: fork() creates children, race()/fold()\n * operate on sibling streams, vent() propagates down the tree.\n */\nexport interface FlowStream {\n /** Stream identifier (even = client-initiated, odd = server-initiated) */\n id: number;\n /** Current lifecycle state */\n state: FlowStreamState;\n /** Parent stream that forked this one (undefined for root streams) */\n parent?: number;\n /** Child streams forked from this one */\n children: number[];\n /** Next sequence number to assign */\n nextSequence: number;\n /** Number of frames buffered (for backpressure) */\n bufferedFrames: number;\n /** Accumulated result frames (for race/fold) */\n results: Uint8Array[];\n}\n\n// ═══════════════════════════════════════════════════════════════════════════════\n// Transport Abstraction\n// ═══════════════════════════════════════════════════════════════════════════════\n\n/**\n * Transport-agnostic interface for sending/receiving binary data.\n *\n * Implementations exist for WebSocket, TCP, WebRTC DataChannel, IPC,\n * and in-memory (for testing).\n */\nexport interface FlowTransport {\n /** Send binary data over the transport */\n send(data: Uint8Array): void;\n /** Register a handler for incoming data */\n onReceive(handler: (data: Uint8Array) => void): void;\n /** Close the transport */\n close(): void;\n}\n\n// ═══════════════════════════════════════════════════════════════════════════════\n// Protocol Configuration\n// ═══════════════════════════════════════════════════════════════════════════════\n\n/**\n * Configuration for the Aeon Flow Protocol.\n */\nexport interface FlowProtocolConfig {\n /**\n * Per-stream high-water mark for backpressure.\n * When a stream has this many unacknowledged frames buffered,\n * sends are paused until the remote drains.\n * @default 64\n */\n highWaterMark: number;\n\n /**\n * Whether this side initiates even-numbered streams (client)\n * or odd-numbered streams (server). Like HTTP/2.\n * @default 'client'\n */\n role: 'client' | 'server';\n\n /**\n * Maximum number of concurrent open streams.\n * @default 256\n */\n maxConcurrentStreams: number;\n}\n\n/**\n * Default protocol configuration.\n */\nexport const DEFAULT_FLOW_CONFIG: FlowProtocolConfig = {\n highWaterMark: 64,\n role: 'client',\n maxConcurrentStreams: 256,\n};\n\n// ═══════════════════════════════════════════════════════════════════════════════\n// Event Types\n// ═══════════════════════════════════════════════════════════════════════════════\n\n/**\n * Events emitted by the protocol.\n */\nexport interface FlowProtocolEvents {\n /** A new frame arrived on a stream */\n frame: { streamId: number; frame: FlowFrame };\n /** A stream reached the FIN state */\n streamEnd: { streamId: number };\n /** A stream was vented */\n streamVented: { streamId: number };\n /** Backpressure: stream is paused */\n streamPaused: { streamId: number };\n /** Backpressure: stream is resumed */\n streamResumed: { streamId: number };\n}\n","/**\n * Aeon Flow Protocol — Stream Multiplexing with Fork/Race/Fold\n *\n * The Flow Layer sits between the Frame Layer (FlowCodec) and the\n * Application Layer (inference, ESI, sync, shell, speculate). It manages\n * multiplexed streams with three protocol-level primitives:\n *\n * - **Fork**: Create N child streams from a parent stream. Each child\n * runs independently. Used for parallel pipelines, fragment fetching,\n * reality branching.\n *\n * - **Race**: Mark streams as racing. The first to send a FIN frame wins.\n * Losers are automatically vented. Used for speculative decoding,\n * cache races, A/B testing.\n *\n * - **Fold**: Wait for all streams to complete (or vent), then\n * merge their results via a caller-provided function. Used for shard\n * assembly, fragment stitching, branch reconciliation.\n *\n * Stream IDs: even = client-initiated, odd = server-initiated (like HTTP/2).\n * Backpressure via per-stream high-water mark (configurable, default 64).\n * Vent propagates from parent to all descendants.\n *\n * @see docs/ebooks/145-log-rolling-pipelined-prefill/ch14-aeon-flow-protocol.md\n */\n\nimport { FlowCodec } from './FlowCodec';\nimport {\n FORK,\n RACE,\n FOLD,\n VENT,\n FIN,\n DEFAULT_FLOW_CONFIG,\n} from './types';\nimport type {\n FlowFrame,\n FlowStream,\n FlowStreamState,\n FlowTransport,\n FlowProtocolConfig,\n} from './types';\n\n// ═══════════════════════════════════════════════════════════════════════════════\n// Internal helpers\n// ═══════════════════════════════════════════════════════════════════════════════\n\ntype FrameHandler = (frame: FlowFrame) => void;\ntype VoidHandler = () => void;\n\n/**\n * AeonFlowProtocol\n *\n * Manages multiplexed binary streams over a transport with\n * fork/race/fold semantics.\n */\nexport class AeonFlowProtocol {\n private streams: Map<number, FlowStream> = new Map();\n private nextEvenId = 0;\n private nextOddId = 1;\n private codec: FlowCodec;\n private transport: FlowTransport;\n private config: FlowProtocolConfig;\n\n // Event handlers\n private frameHandlers: Map<number, Set<FrameHandler>> = new Map();\n private endHandlers: Map<number, Set<VoidHandler>> = new Map();\n private ventHandlers: Map<number, Set<VoidHandler>> = new Map();\n\n // Race tracking\n private raceGroups: Map<string, {\n streamIds: number[];\n resolve: (result: { winner: number; result: Uint8Array }) => void;\n settled: boolean;\n }> = new Map();\n\n // Fold tracking\n private foldGroups: Map<string, {\n streamIds: number[];\n merger: (results: Map<number, Uint8Array>) => Uint8Array;\n resolve: (result: Uint8Array) => void;\n results: Map<number, Uint8Array>;\n completed: Set<number>;\n settled: boolean;\n }> = new Map();\n\n constructor(\n transport: FlowTransport,\n config?: Partial<FlowProtocolConfig>\n ) {\n this.transport = transport;\n this.config = { ...DEFAULT_FLOW_CONFIG, ...config };\n this.codec = FlowCodec.createSync();\n this.upgradeCodecInBackground();\n\n // Wire up incoming data\n this.transport.onReceive((data: Uint8Array) => {\n this.handleIncoming(data);\n });\n }\n\n // ═══════════════════════════════════════════════════════════════════════\n // Stream management\n // ═══════════════════════════════════════════════════════════════════════\n\n /**\n * Open a new root stream (no parent).\n *\n * Client-initiated streams get even IDs; server-initiated get odd IDs.\n */\n openStream(): number {\n const id = this.allocateStreamId();\n this.createStream(id);\n return id;\n }\n\n /**\n * Get the current state of a stream.\n */\n getStream(streamId: number): FlowStream | undefined {\n return this.streams.get(streamId);\n }\n\n /**\n * Get all active streams.\n */\n getActiveStreams(): FlowStream[] {\n return Array.from(this.streams.values()).filter(\n (s) => s.state !== 'closed' && s.state !== 'vented'\n );\n }\n\n // ═══════════════════════════════════════════════════════════════════════\n // Fork: create N child streams from a parent\n // ═══════════════════════════════════════════════════════════════════════\n\n /**\n * Fork a parent stream into N child streams.\n *\n * Each child stream is independent and can send/receive frames.\n * The parent tracks all children. Venting the parent vents all children.\n *\n * @param parentStreamId The stream to fork from\n * @param count Number of child streams to create\n * @returns Array of child stream IDs\n */\n fork(parentStreamId: number, count: number): number[] {\n const parent = this.requireStream(parentStreamId, 'open');\n if (count < 1) {\n throw new RangeError('Fork count must be at least 1');\n }\n\n if (this.streams.size + count > this.config.maxConcurrentStreams) {\n throw new Error(\n `Cannot fork ${count} streams: would exceed maxConcurrentStreams (${this.config.maxConcurrentStreams})`\n );\n }\n\n const childIds: number[] = [];\n for (let i = 0; i < count; i++) {\n const childId = this.allocateStreamId();\n this.createStream(childId, parentStreamId);\n parent.children.push(childId);\n childIds.push(childId);\n }\n\n // Send FORK frame on parent to notify remote\n this.sendFrame(parentStreamId, FORK, new Uint8Array(\n childIds.flatMap((id) => [(id >>> 8) & 0xFF, id & 0xFF])\n ));\n\n return childIds;\n }\n\n // ═══════════════════════════════════════════════════════════════════════\n // Race: first stream to FIN wins, losers are vented\n // ═══════════════════════════════════════════════════════════════════════\n\n /**\n * Race multiple streams. The first to send a FIN frame wins.\n * All other streams in the race are automatically vented.\n *\n * @param streamIds Streams to race (must all be open)\n * @returns Promise resolving with the winner's stream ID and final payload\n */\n race(streamIds: number[]): Promise<{ winner: number; result: Uint8Array }> {\n if (streamIds.length < 2) {\n throw new RangeError('Race requires at least 2 streams');\n }\n\n // Mark all streams as racing\n for (const id of streamIds) {\n const stream = this.requireStream(id);\n stream.state = 'racing';\n }\n\n // Send RACE frame on each stream\n for (const id of streamIds) {\n const peerIds = streamIds.filter((sid) => sid !== id);\n this.sendFrame(id, RACE, new Uint8Array(\n peerIds.flatMap((pid) => [(pid >>> 8) & 0xFF, pid & 0xFF])\n ));\n }\n\n const groupId = `race-${streamIds.join('-')}-${Date.now()}`;\n\n return new Promise((resolve) => {\n this.raceGroups.set(groupId, {\n streamIds,\n resolve,\n settled: false,\n });\n\n // Listen for FIN on each stream\n for (const id of streamIds) {\n this.onStreamEnd(id, () => {\n this.settleRace(groupId, id);\n });\n }\n });\n }\n\n // ═══════════════════════════════════════════════════════════════════════\n // Fold: wait for all streams, merge results\n // ═══════════════════════════════════════════════════════════════════════\n\n /**\n * Fold multiple streams: wait for all to complete (or vent),\n * then merge their results.\n *\n * @param streamIds Streams to fold\n * @param merger Function that merges results from all streams\n * @returns Promise resolving with the merged result\n */\n fold(\n streamIds: number[],\n merger: (results: Map<number, Uint8Array>) => Uint8Array\n ): Promise<Uint8Array> {\n if (streamIds.length < 1) {\n throw new RangeError('Fold requires at least 1 stream');\n }\n\n // Mark all streams as folding\n for (const id of streamIds) {\n const stream = this.requireStream(id);\n stream.state = 'folding';\n }\n\n // Send FOLD frame on each stream\n for (const id of streamIds) {\n this.sendFrame(id, FOLD, new Uint8Array(0));\n }\n\n const groupId = `fold-${streamIds.join('-')}-${Date.now()}`;\n\n return new Promise((resolve) => {\n const group = {\n streamIds,\n merger,\n resolve,\n results: new Map<number, Uint8Array>(),\n completed: new Set<number>(),\n settled: false,\n };\n\n this.foldGroups.set(groupId, group);\n\n // Listen for FIN or VENT on each stream\n for (const id of streamIds) {\n this.onStreamEnd(id, () => {\n this.settleFold(groupId, id, false);\n });\n this.onStreamVented(id, () => {\n this.settleFold(groupId, id, true);\n });\n }\n });\n }\n\n // ═══════════════════════════════════════════════════════════════════════\n // Send / Vent / Close\n // ═══════════════════════════════════════════════════════════════════════\n\n /**\n * Send a payload on a stream.\n */\n send(streamId: number, payload: Uint8Array, flags = 0): void {\n const stream = this.requireStream(streamId);\n\n // Backpressure check\n if (stream.bufferedFrames >= this.config.highWaterMark) {\n throw new Error(\n `Stream ${streamId} backpressure: ${stream.bufferedFrames} frames buffered (high-water mark: ${this.config.highWaterMark})`\n );\n }\n\n // Accumulate locally so race/fold can read results\n if (payload.length > 0) {\n stream.results.push(payload);\n }\n stream.bufferedFrames++;\n\n this.sendFrame(streamId, flags, payload);\n }\n\n /**\n * Finish a stream. Sends a FIN frame and transitions to 'closed'.\n *\n * @param streamId Stream to finish\n * @param finalPayload Optional final payload to include with the FIN\n */\n finish(streamId: number, finalPayload?: Uint8Array): void {\n const stream = this.requireStream(streamId);\n\n // Accumulate final payload locally\n if (finalPayload && finalPayload.length > 0) {\n stream.results.push(finalPayload);\n }\n\n this.sendFrame(streamId, FIN, finalPayload ?? new Uint8Array(0));\n stream.state = 'closed';\n\n // Notify end handlers\n const handlers = this.endHandlers.get(streamId);\n if (handlers) {\n for (const handler of handlers) {\n handler();\n }\n }\n }\n\n /**\n * Vent a stream. Sends a VENT frame and propagates to all descendants.\n *\n * Venting is the protocol-level equivalent of NaN propagation,\n * AbortSignal cancellation, or error cascading.\n */\n vent(streamId: number): void {\n const stream = this.streams.get(streamId);\n if (!stream || stream.state === 'vented' || stream.state === 'closed') {\n return; // Already dead\n }\n\n stream.state = 'vented';\n this.sendFrame(streamId, VENT, new Uint8Array(0));\n\n // Notify vent handlers\n const handlers = this.ventHandlers.get(streamId);\n if (handlers) {\n for (const handler of handlers) {\n handler();\n }\n }\n\n // Propagate vent to all children (recursively)\n for (const childId of stream.children) {\n this.vent(childId);\n }\n }\n\n // ═══════════════════════════════════════════════════════════════════════\n // Event handlers\n // ═══════════════════════════════════════════════════════════════════════\n\n /**\n * Register a handler for frames arriving on a specific stream.\n */\n onFrame(streamId: number, handler: FrameHandler): () => void {\n let handlers = this.frameHandlers.get(streamId);\n if (!handlers) {\n handlers = new Set();\n this.frameHandlers.set(streamId, handlers);\n }\n handlers.add(handler);\n return () => { handlers!.delete(handler); };\n }\n\n /**\n * Register a handler for when a stream ends (FIN received).\n */\n onStreamEnd(streamId: number, handler: VoidHandler): () => void {\n let handlers = this.endHandlers.get(streamId);\n if (!handlers) {\n handlers = new Set();\n this.endHandlers.set(streamId, handlers);\n }\n handlers.add(handler);\n return () => { handlers!.delete(handler); };\n }\n\n /**\n * Register a handler for when a stream is vented.\n */\n onStreamVented(streamId: number, handler: VoidHandler): () => void {\n let handlers = this.ventHandlers.get(streamId);\n if (!handlers) {\n handlers = new Set();\n this.ventHandlers.set(streamId, handlers);\n }\n handlers.add(handler);\n return () => { handlers!.delete(handler); };\n }\n\n // ═══════════════════════════════════════════════════════════════════════\n // Destroy\n // ═══════════════════════════════════════════════════════════════════════\n\n /**\n * Close the protocol and underlying transport.\n * Vents all open streams first.\n */\n destroy(): void {\n for (const [id, stream] of this.streams) {\n if (stream.state !== 'closed' && stream.state !== 'vented') {\n stream.state = 'closed';\n }\n }\n this.streams.clear();\n this.frameHandlers.clear();\n this.endHandlers.clear();\n this.ventHandlers.clear();\n this.raceGroups.clear();\n this.foldGroups.clear();\n this.transport.close();\n }\n\n // ═══════════════════════════════════════════════════════════════════════\n // Private: incoming frame handling\n // ═══════════════════════════════════════════════════════════════════════\n\n private handleIncoming(data: Uint8Array): void {\n // Decode all frames from the received buffer\n let frames: FlowFrame[];\n try {\n frames = this.codec.decodeBatch(data);\n } catch {\n // Malformed data — nothing to do\n return;\n }\n\n for (const frame of frames) {\n this.handleFrame(frame);\n }\n }\n\n private handleFrame(frame: FlowFrame): void {\n const { streamId, flags } = frame;\n\n // Auto-create stream if we receive a frame on an unknown stream\n // (the remote opened it)\n if (!this.streams.has(streamId)) {\n this.createStream(streamId);\n }\n\n const stream = this.streams.get(streamId)!;\n\n // Handle control flags\n if (flags & VENT) {\n this.vent(streamId);\n return;\n }\n\n if (flags & FIN) {\n // Accumulate final payload if present\n if (frame.payload.length > 0) {\n stream.results.push(frame.payload);\n }\n stream.state = 'closed';\n\n // Notify end handlers\n const endHandlers = this.endHandlers.get(streamId);\n if (endHandlers) {\n for (const handler of endHandlers) {\n handler();\n }\n }\n return;\n }\n\n if (flags & FORK) {\n // Remote is notifying us about forked child streams\n // Parse child IDs from payload (u16 pairs)\n for (let i = 0; i + 1 < frame.payload.length; i += 2) {\n const childId = (frame.payload[i] << 8) | frame.payload[i + 1];\n if (!this.streams.has(childId)) {\n this.createStream(childId, streamId);\n }\n if (!stream.children.includes(childId)) {\n stream.children.push(childId);\n }\n }\n return;\n }\n\n // Data frame — accumulate result and notify handlers\n if (frame.payload.length > 0) {\n stream.results.push(frame.payload);\n }\n stream.bufferedFrames++;\n\n const handlers = this.frameHandlers.get(streamId);\n if (handlers) {\n for (const handler of handlers) {\n handler(frame);\n }\n }\n }\n\n // ═══════════════════════════════════════════════════════════════════════\n // Private: race/fold settlement\n // ═══════════════════════════════════════════════════════════════════════\n\n private settleRace(groupId: string, winnerId: number): void {\n const group = this.raceGroups.get(groupId);\n if (!group || group.settled) return;\n group.settled = true;\n\n const winnerStream = this.streams.get(winnerId);\n const result = winnerStream\n ? this.concatenateResults(winnerStream.results)\n : new Uint8Array(0);\n\n // Vent all losers\n for (const id of group.streamIds) {\n if (id !== winnerId) {\n this.vent(id);\n }\n }\n\n group.resolve({ winner: winnerId, result });\n this.raceGroups.delete(groupId);\n }\n\n private settleFold(\n groupId: string,\n streamId: number,\n wasVented: boolean\n ): void {\n const group = this.foldGroups.get(groupId);\n if (!group || group.settled) return;\n\n group.completed.add(streamId);\n\n if (!wasVented) {\n const stream = this.streams.get(streamId);\n if (stream) {\n group.results.set(streamId, this.concatenateResults(stream.results));\n }\n }\n // Vented streams contribute nothing to the merge\n\n // Check if all streams have completed or been vented\n if (group.completed.size >= group.streamIds.length) {\n group.settled = true;\n const merged = group.merger(group.results);\n group.resolve(merged);\n this.foldGroups.delete(groupId);\n }\n }\n\n // ═══════════════════════════════════════════════════════════════════════\n // Private: stream helpers\n // ═══════════════════════════════════════════════════════════════════════\n\n private allocateStreamId(): number {\n if (this.config.role === 'client') {\n const id = this.nextEvenId;\n this.nextEvenId += 2;\n return id;\n } else {\n const id = this.nextOddId;\n this.nextOddId += 2;\n return id;\n }\n }\n\n private createStream(id: number, parent?: number): FlowStream {\n const stream: FlowStream = {\n id,\n state: 'open',\n parent,\n children: [],\n nextSequence: 0,\n bufferedFrames: 0,\n results: [],\n };\n this.streams.set(id, stream);\n return stream;\n }\n\n private requireStream(\n streamId: number,\n ...allowedStates: FlowStreamState[]\n ): FlowStream {\n const stream = this.streams.get(streamId);\n if (!stream) {\n throw new Error(`Stream ${streamId} does not exist`);\n }\n if (\n allowedStates.length > 0 &&\n !allowedStates.includes(stream.state)\n ) {\n throw new Error(\n `Stream ${streamId} is in state '${stream.state}', expected one of: ${allowedStates.join(', ')}`\n );\n }\n return stream;\n }\n\n private sendFrame(\n streamId: number,\n flags: number,\n payload: Uint8Array\n ): void {\n const stream = this.streams.get(streamId);\n if (!stream) return;\n\n const frame: FlowFrame = {\n streamId,\n sequence: stream.nextSequence++,\n flags,\n payload,\n };\n\n const encoded = this.codec.encode(frame);\n this.transport.send(encoded);\n }\n\n private concatenateResults(chunks: Uint8Array[]): Uint8Array {\n if (chunks.length === 0) return new Uint8Array(0);\n if (chunks.length === 1) return chunks[0];\n\n let totalLen = 0;\n for (const chunk of chunks) totalLen += chunk.length;\n\n const result = new Uint8Array(totalLen);\n let offset = 0;\n for (const chunk of chunks) {\n result.set(chunk, offset);\n offset += chunk.length;\n }\n return result;\n }\n\n /**\n * Attempt to upgrade to WASM codec without delaying protocol startup.\n * JS codec remains the correctness path if WASM is unavailable.\n */\n private upgradeCodecInBackground(): void {\n FlowCodec.create()\n .then((codec) => {\n if (codec.isWasmAccelerated) {\n this.codec = codec;\n }\n })\n .catch(() => {\n // Graceful fallback: keep JS codec\n });\n }\n}\n","/**\n * Frame Reassembler — Out-of-Order Frame Reconstruction\n *\n * Over TCP/WebSocket, frames arrive in order. Over UDP, they don't.\n * The flow header's stream_id (u16) + sequence (u32) already carry\n * the information needed to reassemble — this module uses it.\n *\n * Per-stream reorder buffer with configurable window. Frames arriving\n * out of order are buffered until the gap fills. Frames arriving\n * beyond the window are dropped (assumed lost, will be retransmitted).\n *\n * This is the same insight as QUIC: per-stream ordering eliminates\n * head-of-line blocking across streams. Stream A's lost packet doesn't\n * block Stream B. Only Stream A waits for its own retransmission.\n */\n\nimport type { FlowFrame } from './types';\n\n// ═══════════════════════════════════════════════════════════════════════════════\n// Types\n// ═══════════════════════════════════════════════════════════════════════════════\n\nexport interface ReassemblerConfig {\n /**\n * Maximum number of frames to buffer per stream while waiting\n * for gaps to fill. Frames beyond this are dropped.\n * @default 256\n */\n maxBufferPerStream: number;\n\n /**\n * Maximum number of tracked streams. Oldest streams are evicted\n * when this limit is reached.\n * @default 1024\n */\n maxStreams: number;\n\n /**\n * Maximum gap in sequence numbers before declaring frames lost.\n * If we receive seq 10 but are expecting seq 3, and gap > maxGap,\n * we skip ahead and emit what we have.\n * @default 64\n */\n maxGap: number;\n}\n\nconst DEFAULT_REASSEMBLER_CONFIG: ReassemblerConfig = {\n maxBufferPerStream: 256,\n maxStreams: 1024,\n maxGap: 64,\n};\n\n/** Per-stream reassembly state */\ninterface StreamReassemblyState {\n /** Next expected sequence number */\n nextExpected: number;\n /** Buffered out-of-order frames, keyed by sequence number */\n buffer: Map<number, FlowFrame>;\n /** Last time a frame was received on this stream */\n lastActivity: number;\n /** Sequence numbers we've already emitted (dedup window) */\n emittedSequences: Set<number>;\n}\n\nexport interface ReassemblerStats {\n /** Total frames received */\n framesReceived: number;\n /** Frames delivered in order */\n framesDelivered: number;\n /** Frames currently buffered (waiting for gaps) */\n framesBuffered: number;\n /** Frames dropped (duplicates or beyond window) */\n framesDropped: number;\n /** Frames reordered (delivered from buffer after gap fill) */\n framesReordered: number;\n /** Active streams being tracked */\n activeStreams: number;\n}\n\n// ═══════════════════════════════════════════════════════════════════════════════\n// Reassembler\n// ═══════════════════════════════════════════════════════════════════════════════\n\nexport class FrameReassembler {\n private config: ReassemblerConfig;\n private streams = new Map<number, StreamReassemblyState>();\n private stats: ReassemblerStats = {\n framesReceived: 0,\n framesDelivered: 0,\n framesBuffered: 0,\n framesDropped: 0,\n framesReordered: 0,\n activeStreams: 0,\n };\n\n constructor(config?: Partial<ReassemblerConfig>) {\n this.config = { ...DEFAULT_REASSEMBLER_CONFIG, ...config };\n }\n\n /**\n * Process an incoming frame. Returns an array of frames that are\n * now deliverable in order. May return 0 frames (buffered), 1 frame\n * (in order), or multiple frames (gap was filled, releasing buffered).\n *\n * This is the core reassembly operation:\n * - In-order frame → deliver immediately + flush any buffered followers\n * - Out-of-order frame → buffer until gap fills\n * - Duplicate → drop\n * - Beyond window → drop\n */\n push(frame: FlowFrame): FlowFrame[] {\n this.stats.framesReceived++;\n\n const streamId = frame.streamId;\n let state = this.streams.get(streamId);\n\n if (!state) {\n // New stream — enforce stream limit\n if (this.streams.size >= this.config.maxStreams) {\n this.evictOldestStream();\n }\n\n state = {\n nextExpected: 0,\n buffer: new Map(),\n lastActivity: Date.now(),\n emittedSequences: new Set(),\n };\n this.streams.set(streamId, state);\n this.stats.activeStreams = this.streams.size;\n }\n\n state.lastActivity = Date.now();\n\n // Dedup: already emitted this sequence?\n if (state.emittedSequences.has(frame.sequence)) {\n this.stats.framesDropped++;\n return [];\n }\n\n // Already buffered?\n if (state.buffer.has(frame.sequence)) {\n this.stats.framesDropped++;\n return [];\n }\n\n const seq = frame.sequence;\n\n // Case 1: Frame is exactly what we expected → deliver + flush\n if (seq === state.nextExpected) {\n return this.deliverAndFlush(state, frame);\n }\n\n // Case 2: Frame is behind what we expected → duplicate, drop\n if (seq < state.nextExpected) {\n this.stats.framesDropped++;\n return [];\n }\n\n // Case 3: Frame is ahead of expected → buffer (gap exists)\n const gap = seq - state.nextExpected;\n\n // If gap is too large, skip ahead\n if (gap > this.config.maxGap) {\n // Declare everything in the gap as lost, skip ahead\n state.nextExpected = seq;\n return this.deliverAndFlush(state, frame);\n }\n\n // Buffer the frame if we have space\n if (state.buffer.size >= this.config.maxBufferPerStream) {\n this.stats.framesDropped++;\n return [];\n }\n\n state.buffer.set(seq, frame);\n this.stats.framesBuffered++;\n\n return [];\n }\n\n /**\n * Get the sequence numbers that are missing (gaps) for a stream.\n * Used by the reliability layer to request retransmission.\n */\n getMissingSequences(streamId: number): number[] {\n const state = this.streams.get(streamId);\n if (!state) return [];\n\n const missing: number[] = [];\n const maxBuffered = state.buffer.size > 0\n ? Math.max(...state.buffer.keys())\n : state.nextExpected;\n\n for (let seq = state.nextExpected; seq < maxBuffered; seq++) {\n if (!state.buffer.has(seq)) {\n missing.push(seq);\n }\n }\n\n return missing;\n }\n\n /**\n * Clean up a stream's reassembly state.\n * Call when a stream is closed or vented.\n */\n closeStream(streamId: number): void {\n const state = this.streams.get(streamId);\n if (state) {\n this.stats.framesBuffered -= state.buffer.size;\n this.streams.delete(streamId);\n this.stats.activeStreams = this.streams.size;\n }\n }\n\n /**\n * Get current reassembly statistics.\n */\n getStats(): Readonly<ReassemblerStats> {\n return { ...this.stats };\n }\n\n /**\n * Reset all state.\n */\n reset(): void {\n this.streams.clear();\n this.stats = {\n framesReceived: 0,\n framesDelivered: 0,\n framesBuffered: 0,\n framesDropped: 0,\n framesReordered: 0,\n activeStreams: 0,\n };\n }\n\n // ─── Internal ──────────────────────────────────────────────────────────\n\n /**\n * Deliver a frame and flush any consecutively-buffered followers.\n */\n private deliverAndFlush(\n state: StreamReassemblyState,\n frame: FlowFrame\n ): FlowFrame[] {\n const deliverable: FlowFrame[] = [frame];\n state.emittedSequences.add(frame.sequence);\n state.nextExpected = frame.sequence + 1;\n this.stats.framesDelivered++;\n\n // Flush consecutive frames from buffer\n while (state.buffer.has(state.nextExpected)) {\n const buffered = state.buffer.get(state.nextExpected)!;\n state.buffer.delete(state.nextExpected);\n state.emittedSequences.add(state.nextExpected);\n state.nextExpected++;\n deliverable.push(buffered);\n this.stats.framesBuffered--;\n this.stats.framesDelivered++;\n this.stats.framesReordered++;\n }\n\n // Trim dedup set to avoid unbounded growth\n if (state.emittedSequences.size > 1024) {\n const cutoff = state.nextExpected - 512;\n for (const seq of state.emittedSequences) {\n if (seq < cutoff) state.emittedSequences.delete(seq);\n }\n }\n\n return deliverable;\n }\n\n /**\n * Evict the least-recently-active stream to make room.\n */\n private evictOldestStream(): void {\n let oldestKey = -1;\n let oldestTime = Infinity;\n\n for (const [key, state] of this.streams) {\n if (state.lastActivity < oldestTime) {\n oldestTime = state.lastActivity;\n oldestKey = key;\n }\n }\n\n if (oldestKey >= 0) {\n this.closeStream(oldestKey);\n }\n }\n}\n","/**\n * UDP Flow Transport — Zero Head-of-Line Blocking\n *\n * Aeon Flow works over UDP. The 10-byte header is self-describing —\n * stream_id + sequence in every frame means frames can arrive out of\n * order and be reassembled. No TCP head-of-line blocking.\n *\n * This is the same insight as QUIC (HTTP/3) — but with 10-byte frames\n * instead of QUIC's more complex framing. No TLS ceremony (WASM\n * inference doesn't need it). No connection setup (first datagram IS\n * data). No head-of-line blocking (each stream reassembles independently).\n *\n * Reliability layer:\n * - ACK bitmaps: receiver sends periodic ACK frames with a bitmap\n * of received sequences. Compact: 8 bytes covers 64 contiguous seqs.\n * - Selective retransmit: sender retransmits only missing frames,\n * not the entire window (like TCP SACK but simpler).\n * - Congestion window: simple AIMD (additive-increase multiplicative-\n * decrease) like TCP Reno but per-stream.\n *\n * MTU handling:\n * - Flow frames > MTU are fragmented into MTU-sized UDP datagrams.\n * - Each fragment carries: [frag_header:4][flow_frame_chunk]\n * - Fragment header: [frame_id:u16][frag_index:u8][frag_total:u8]\n * - Max 255 fragments × 1400 bytes = ~350 KB per flow frame over UDP.\n * - Most flow frames are <1400 bytes (10-byte header + small payload).\n * Large payloads (16MB) are rare and better served over WebSocket.\n *\n * Environment support:\n * - Node.js/Bun: native dgram module\n * - Cloudflare Workers: connect() API (Cloudflare's UDP socket support)\n * - Browser: WebTransport (HTTP/3) provides UDP-like unreliable datagrams\n *\n * Usage:\n * const transport = new UDPFlowTransport({ host: '0.0.0.0', port: 4242 });\n * const protocol = new AeonFlowProtocol(transport, { role: 'server' });\n */\n\nimport type { FlowTransport } from './types';\nimport { FlowCodec, HEADER_SIZE } from './FlowCodec';\nimport { FrameReassembler } from './frame-reassembler';\nimport type { FlowFrame } from './types';\n\n// ═══════════════════════════════════════════════════════════════════════════════\n// Constants\n// ═══════════════════════════════════════════════════════════════════════════════\n\n/** Safe MTU for UDP datagrams (1500 Ethernet - 20 IP - 8 UDP) */\nexport const UDP_MTU = 1472;\n\n/** Fragment header size: [frame_id:u16][frag_index:u8][frag_total:u8] */\nexport const FRAGMENT_HEADER_SIZE = 4;\n\n/** Max payload per UDP datagram after fragment header */\nexport const MAX_FRAGMENT_PAYLOAD = UDP_MTU - FRAGMENT_HEADER_SIZE;\n\n/** ACK frame flag — not a real flow flag, internal to UDP transport */\nexport const ACK_FLAG = 0x80;\n\n/** How often to send ACK bitmaps (ms) */\nconst ACK_INTERVAL_MS = 50;\n\n/** How long before retransmitting an unacked frame (ms) */\nconst RETRANSMIT_TIMEOUT_MS = 200;\n\n/** Initial congestion window (frames) */\nconst INITIAL_CWND = 16;\n\n/** Max congestion window (frames) */\nconst MAX_CWND = 256;\n\n// ═══════════════════════════════════════════════════════════════════════════════\n// Types\n// ═══════════════════════════════════════════════════════════════════════════════\n\nexport interface UDPFlowTransportConfig {\n /** Local bind address */\n host: string;\n /** Local bind port */\n port: number;\n /** Remote host (for client mode) */\n remoteHost?: string;\n /** Remote port (for client mode) */\n remotePort?: number;\n /** MTU override (default: 1472) */\n mtu?: number;\n /** Enable reliability (ACKs + retransmit). Default: true */\n reliable?: boolean;\n /** Reassembler config overrides */\n reassembler?: {\n maxBufferPerStream?: number;\n maxStreams?: number;\n maxGap?: number;\n };\n}\n\n/** Sent frame awaiting acknowledgment */\ninterface InflightFrame {\n data: Uint8Array;\n streamId: number;\n sequence: number;\n sentAt: number;\n retransmits: number;\n}\n\n/** ACK bitmap: acknowledges sequences [baseSeq .. baseSeq+63] */\ninterface AckBitmap {\n streamId: number;\n baseSeq: number;\n /** 64-bit bitmap as two u32s */\n bitmapHi: number;\n bitmapLo: number;\n}\n\n/** Fragment reassembly state */\ninterface FragmentGroup {\n frameId: number;\n total: number;\n received: Map<number, Uint8Array>;\n createdAt: number;\n}\n\n// ═══════════════════════════════════════════════════════════════════════════════\n// UDP Flow Transport\n// ═══════════════════════════════════════════════════════════════════════════════\n\n/**\n * UDP-based FlowTransport implementation.\n *\n * Implements the FlowTransport interface over UDP datagrams with:\n * - MTU-safe fragmentation/reassembly\n * - Out-of-order frame reassembly (via FrameReassembler)\n * - Optional reliability (ACK bitmaps + selective retransmit)\n * - Simple AIMD congestion control\n *\n * The same AeonFlowProtocol instance works unchanged — it just sees\n * frames arriving (possibly out of order, which the reassembler fixes).\n */\nexport class UDPFlowTransport implements FlowTransport {\n private config: Required<UDPFlowTransportConfig>;\n private receiveHandler: ((data: Uint8Array) => void) | null = null;\n private closed = false;\n\n // UDP socket (set by bind/connect)\n private socket: UDPSocket | null = null;\n\n // Frame reassembly (out-of-order)\n private reassembler: FrameReassembler;\n\n // Fragment reassembly (MTU splitting)\n private fragmentGroups = new Map<number, FragmentGroup>();\n private nextFrameId = 0;\n\n // Reliability: inflight tracking\n private inflight = new Map<string, InflightFrame>();\n\n // Reliability: ACK state\n private receivedPerStream = new Map<number, Set<number>>();\n private ackTimer: ReturnType<typeof setInterval> | null = null;\n private retransmitTimer: ReturnType<typeof setInterval> | null = null;\n\n // Congestion control\n private cwnd = INITIAL_CWND;\n private inflightCount = 0;\n\n // Flow codec for ACK frame encoding\n private codec = FlowCodec.createSync();\n\n constructor(config: UDPFlowTransportConfig) {\n this.config = {\n host: config.host,\n port: config.port,\n remoteHost: config.remoteHost ?? '',\n remotePort: config.remotePort ?? 0,\n mtu: config.mtu ?? UDP_MTU,\n reliable: config.reliable ?? true,\n reassembler: config.reassembler ?? {},\n };\n\n this.reassembler = new FrameReassembler(this.config.reassembler);\n this.upgradeCodecInBackground();\n }\n\n /**\n * Bind and start the UDP transport.\n *\n * In server mode (no remoteHost), listens for incoming datagrams.\n * In client mode, binds and sets the remote endpoint.\n */\n async bind(): Promise<void> {\n this.socket = await createUDPSocket(this.config.host, this.config.port);\n\n this.socket.onMessage((data: Uint8Array, rinfo: RemoteInfo) => {\n if (this.closed) return;\n\n // Remember remote for server mode\n if (!this.config.remoteHost && rinfo.address) {\n this.config.remoteHost = rinfo.address;\n this.config.remotePort = rinfo.port;\n }\n\n this.handleDatagram(data);\n });\n\n // Start ACK and retransmit timers if reliable\n if (this.config.reliable) {\n this.ackTimer = setInterval(() => this.sendAcks(), ACK_INTERVAL_MS);\n this.retransmitTimer = setInterval(() => this.retransmitLost(), RETRANSMIT_TIMEOUT_MS);\n }\n }\n\n // ─── FlowTransport interface ───────────────────────────────────────────\n\n send(data: Uint8Array): void {\n if (this.closed || !this.socket) return;\n\n // Congestion control: don't exceed window\n if (this.config.reliable && this.inflightCount >= this.cwnd) {\n // Drop — backpressure. Protocol layer will handle via highWaterMark.\n return;\n }\n\n const maxPayload = this.config.mtu - FRAGMENT_HEADER_SIZE;\n\n if (data.length <= maxPayload) {\n // Fits in one datagram — no fragmentation needed\n const frameId = this.nextFrameId++ & 0xFFFF;\n const datagram = this.wrapFragment(frameId, 0, 1, data);\n this.sendDatagram(datagram);\n this.trackInflight(data, frameId);\n } else {\n // Fragment into MTU-sized chunks\n const frameId = this.nextFrameId++ & 0xFFFF;\n const totalFragments = Math.ceil(data.length / maxPayload);\n\n if (totalFragments > 255) {\n // Too large for UDP fragmentation — caller should use WebSocket\n // for payloads > ~350KB\n return;\n }\n\n for (let i = 0; i < totalFragments; i++) {\n const start = i * maxPayload;\n const end = Math.min(start + maxPayload, data.length);\n const chunk = data.slice(start, end);\n const datagram = this.wrapFragment(frameId, i, totalFragments, chunk);\n this.sendDatagram(datagram);\n }\n this.trackInflight(data, frameId);\n }\n }\n\n onReceive(handler: (data: Uint8Array) => void): void {\n this.receiveHandler = handler;\n }\n\n close(): void {\n if (this.closed) return;\n this.closed = true;\n\n if (this.ackTimer) clearInterval(this.ackTimer);\n if (this.retransmitTimer) clearInterval(this.retransmitTimer);\n\n this.socket?.close();\n this.socket = null;\n this.receiveHandler = null;\n this.inflight.clear();\n this.fragmentGroups.clear();\n this.reassembler.reset();\n }\n\n /**\n * Attempt to upgrade to WASM codec without delaying transport readiness.\n */\n private upgradeCodecInBackground(): void {\n FlowCodec.create()\n .then((codec) => {\n if (codec.isWasmAccelerated) {\n this.codec = codec;\n }\n })\n .catch(() => {\n // Graceful fallback: keep JS codec\n });\n }\n\n // ─── Stats ─────────────────────────────────────────────────────────────\n\n /** Get reassembly statistics */\n getReassemblerStats() {\n return this.reassembler.getStats();\n }\n\n /** Current congestion window size */\n get congestionWindow(): number {\n return this.cwnd;\n }\n\n /** Number of frames in flight (unacked) */\n get framesInFlight(): number {\n return this.inflightCount;\n }\n\n // ─── Internal: datagram handling ───────────────────────────────────────\n\n /**\n * Handle an incoming UDP datagram.\n *\n * Datagram format:\n * [frame_id:u16][frag_index:u8][frag_total:u8][payload...]\n */\n private handleDatagram(data: Uint8Array): void {\n if (data.length < FRAGMENT_HEADER_SIZE) return;\n\n const view = new DataView(data.buffer, data.byteOffset, data.byteLength);\n const frameId = view.getUint16(0);\n const fragIndex = data[2];\n const fragTotal = data[3];\n const payload = data.subarray(FRAGMENT_HEADER_SIZE);\n\n if (fragTotal === 1) {\n // Single fragment — no reassembly needed\n this.handleReassembledFrame(payload);\n } else {\n // Multi-fragment — reassemble\n this.handleFragment(frameId, fragIndex, fragTotal, payload);\n }\n }\n\n /**\n * Handle a fragment of a multi-datagram flow frame.\n */\n private handleFragment(\n frameId: number,\n fragIndex: number,\n fragTotal: number,\n payload: Uint8Array\n ): void {\n let group = this.fragmentGroups.get(frameId);\n if (!group) {\n group = {\n frameId,\n total: fragTotal,\n received: new Map(),\n createdAt: Date.now(),\n };\n this.fragmentGroups.set(frameId, group);\n }\n\n group.received.set(fragIndex, payload.slice()); // slice to own the data\n\n // Check if complete\n if (group.received.size === group.total) {\n // Reassemble in order\n let totalLen = 0;\n for (let i = 0; i < group.total; i++) {\n totalLen += group.received.get(i)!.length;\n }\n\n const reassembled = new Uint8Array(totalLen);\n let offset = 0;\n for (let i = 0; i < group.total; i++) {\n const frag = group.received.get(i)!;\n reassembled.set(frag, offset);\n offset += frag.length;\n }\n\n this.fragmentGroups.delete(frameId);\n this.handleReassembledFrame(reassembled);\n }\n\n // Clean up stale fragment groups (>5 seconds old)\n if (this.fragmentGroups.size > 100) {\n const cutoff = Date.now() - 5000;\n for (const [id, g] of this.fragmentGroups) {\n if (g.createdAt < cutoff) {\n this.fragmentGroups.delete(id);\n }\n }\n }\n }\n\n /**\n * Handle a complete (reassembled) flow frame.\n * This is where we do out-of-order reassembly using the stream_id + sequence.\n */\n private handleReassembledFrame(data: Uint8Array): void {\n // Check if this is an ACK frame (internal to UDP transport)\n if (data.length >= HEADER_SIZE) {\n const flags = data[6];\n if (flags & ACK_FLAG) {\n this.handleAck(data);\n return;\n }\n }\n\n // Decode the flow frame to get stream_id + sequence for reassembly\n let frame: FlowFrame;\n try {\n const result = this.codec.decode(data);\n frame = result.frame;\n } catch {\n return; // Malformed\n }\n\n // Track received sequence for ACK generation\n if (this.config.reliable) {\n let seqSet = this.receivedPerStream.get(frame.streamId);\n if (!seqSet) {\n seqSet = new Set();\n this.receivedPerStream.set(frame.streamId, seqSet);\n }\n seqSet.add(frame.sequence);\n }\n\n // Push through the reassembler for ordering\n const deliverable = this.reassembler.push(frame);\n\n // Deliver ordered frames to the protocol layer\n for (const orderedFrame of deliverable) {\n // Re-encode to binary for the FlowTransport interface\n // (the protocol layer expects raw bytes it can decode itself)\n const encoded = this.codec.encode(orderedFrame);\n if (this.receiveHandler) {\n this.receiveHandler(encoded);\n }\n }\n }\n\n // ─── Internal: fragmentation ───────────────────────────────────────────\n\n /**\n * Wrap a flow frame chunk in a fragment header.\n */\n private wrapFragment(\n frameId: number,\n fragIndex: number,\n fragTotal: number,\n payload: Uint8Array\n ): Uint8Array {\n const datagram = new Uint8Array(FRAGMENT_HEADER_SIZE + payload.length);\n const view = new DataView(datagram.buffer);\n view.setUint16(0, frameId);\n datagram[2] = fragIndex;\n datagram[3] = fragTotal;\n datagram.set(payload, FRAGMENT_HEADER_SIZE);\n return datagram;\n }\n\n /**\n * Send a UDP datagram to the remote endpoint.\n */\n private sendDatagram(data: Uint8Array): void {\n if (!this.socket || !this.config.remoteHost) return;\n this.socket.send(data, this.config.remoteHost, this.config.remotePort);\n }\n\n // ─── Internal: reliability ─────────────────────────────────────────────\n\n /**\n * Track a sent frame for potential retransmission.\n */\n private trackInflight(data: Uint8Array, frameId: number): void {\n if (!this.config.reliable) return;\n\n // Extract stream_id and sequence from the flow frame\n if (data.length < HEADER_SIZE) return;\n\n const view = new DataView(data.buffer, data.byteOffset, data.byteLength);\n const streamId = view.getUint16(0);\n const sequence = view.getUint32(2);\n\n const key = `${streamId}:${sequence}`;\n this.inflight.set(key, {\n data: data.slice(),\n streamId,\n sequence,\n sentAt: Date.now(),\n retransmits: 0,\n });\n\n this.inflightCount++;\n }\n\n /**\n * Handle an incoming ACK frame.\n *\n * ACK payload format:\n * [stream_id:u16][base_seq:u32][bitmap_hi:u32][bitmap_lo:u32]\n * (can repeat for multiple streams)\n */\n private handleAck(data: Uint8Array): void {\n // Skip the 10-byte flow header\n const payload = data.subarray(HEADER_SIZE);\n const view = new DataView(payload.buffer, payload.byteOffset, payload.byteLength);\n\n for (let offset = 0; offset + 14 <= payload.length; offset += 14) {\n const streamId = view.getUint16(offset);\n const baseSeq = view.getUint32(offset + 2);\n const bitmapHi = view.getUint32(offset + 6);\n const bitmapLo = view.getUint32(offset + 10);\n\n // Check each bit in the bitmap\n for (let bit = 0; bit < 64; bit++) {\n const seq = baseSeq + bit;\n const isAcked = bit < 32\n ? (bitmapLo & (1 << bit)) !== 0\n : (bitmapHi & (1 << (bit - 32))) !== 0;\n\n if (isAcked) {\n const key = `${streamId}:${seq}`;\n if (this.inflight.has(key)) {\n this.inflight.delete(key);\n this.inflightCount--;\n\n // Congestion control: ACK received, increase window\n if (this.cwnd < MAX_CWND) {\n this.cwnd += 1 / this.cwnd; // AIMD additive increase\n }\n }\n }\n }\n }\n }\n\n /**\n * Send ACK bitmaps for all received sequences.\n */\n private sendAcks(): void {\n if (this.receivedPerStream.size === 0) return;\n\n const ackEntries: Uint8Array[] = [];\n\n for (const [streamId, seqSet] of this.receivedPerStream) {\n if (seqSet.size === 0) continue;\n\n // Find the base sequence (lowest)\n let baseSeq = Infinity;\n for (const seq of seqSet) {\n if (seq < baseSeq) baseSeq = seq;\n }\n\n // Build bitmap for [baseSeq .. baseSeq+63]\n let bitmapHi = 0;\n let bitmapLo = 0;\n\n for (const seq of seqSet) {\n const bit = seq - baseSeq;\n if (bit >= 0 && bit < 64) {\n if (bit < 32) {\n bitmapLo |= (1 << bit);\n } else {\n bitmapHi |= (1 << (bit - 32));\n }\n }\n }\n\n // Encode: [stream_id:u16][base_seq:u32][bitmap_hi:u32][bitmap_lo:u32]\n const entry = new Uint8Array(14);\n const view = new DataView(entry.buffer);\n view.setUint16(0, streamId);\n view.setUint32(2, baseSeq);\n view.setUint32(6, bitmapHi);\n view.setUint32(10, bitmapLo);\n ackEntries.push(entry);\n\n // Trim old sequences\n if (seqSet.size > 128) {\n const cutoff = baseSeq + 64;\n for (const seq of seqSet) {\n if (seq < cutoff) seqSet.delete(seq);\n }\n }\n }\n\n if (ackEntries.length === 0) return;\n\n // Combine all ACK entries into one payload\n let totalLen = 0;\n for (const e of ackEntries) totalLen += e.length;\n const payload = new Uint8Array(totalLen);\n let offset = 0;\n for (const e of ackEntries) {\n payload.set(e, offset);\n offset += e.length;\n }\n\n // Encode as a flow frame with ACK_FLAG\n const ackFrame = this.codec.encode({\n streamId: 0xFFFF, // Reserved stream for transport-level control\n sequence: 0,\n flags: ACK_FLAG,\n payload,\n });\n\n // Send as a single datagram (ACKs are always small)\n const datagram = this.wrapFragment(\n this.nextFrameId++ & 0xFFFF,\n 0,\n 1,\n ackFrame\n );\n this.sendDatagram(datagram);\n }\n\n /**\n * Retransmit frames that haven't been ACKed.\n */\n private retransmitLost(): void {\n const now = Date.now();\n\n for (const [key, frame] of this.inflight) {\n if (now - frame.sentAt > RETRANSMIT_TIMEOUT_MS) {\n if (frame.retransmits >= 5) {\n // Give up after 5 retransmits\n this.inflight.delete(key);\n this.inflightCount--;\n\n // Congestion control: loss detected, halve window\n this.cwnd = Math.max(INITIAL_CWND, Math.floor(this.cwnd / 2));\n continue;\n }\n\n // Retransmit\n frame.retransmits++;\n frame.sentAt = now;\n\n const frameId = this.nextFrameId++ & 0xFFFF;\n const maxPayload = this.config.mtu - FRAGMENT_HEADER_SIZE;\n\n if (frame.data.length <= maxPayload) {\n const datagram = this.wrapFragment(frameId, 0, 1, frame.data);\n this.sendDatagram(datagram);\n } else {\n const totalFragments = Math.ceil(frame.data.length / maxPayload);\n for (let i = 0; i < totalFragments; i++) {\n const start = i * maxPayload;\n const end = Math.min(start + maxPayload, frame.data.length);\n const chunk = frame.data.slice(start, end);\n const datagram = this.wrapFragment(frameId, i, totalFragments, chunk);\n this.sendDatagram(datagram);\n }\n }\n\n // Congestion control: retransmit = loss indicator\n this.cwnd = Math.max(INITIAL_CWND, Math.floor(this.cwnd / 2));\n }\n }\n }\n}\n\n// ═══════════════════════════════════════════════════════════════════════════════\n// UDP Socket Abstraction (Node/Bun dgram)\n// ═══════════════════════════════════════════════════════════════════════════════\n\ninterface RemoteInfo {\n address: string;\n port: number;\n}\n\ninterface UDPSocket {\n send(data: Uint8Array, host: string, port: number): void;\n onMessage(handler: (data: Uint8Array, rinfo: RemoteInfo) => void): void;\n close(): void;\n}\n\n/**\n * Create a UDP socket. Uses Node/Bun dgram module.\n */\nasync function createUDPSocket(host: string, port: number): Promise<UDPSocket> {\n // Dynamic import for Node/Bun dgram (not available in browser/CF Workers)\n const dgram = await import('dgram');\n const socket = dgram.createSocket('udp4');\n\n return new Promise((resolve, reject) => {\n socket.on('error', (err: Error) => reject(err));\n\n socket.bind(port, host, () => {\n const udpSocket: UDPSocket = {\n send(data: Uint8Array, remoteHost: string, remotePort: number) {\n socket.send(data, 0, data.length, remotePort, remoteHost);\n },\n onMessage(handler: (data: Uint8Array, rinfo: RemoteInfo) => void) {\n socket.on('message', (msg: Buffer, rinfo: { address: string; port: number }) => {\n handler(new Uint8Array(msg), { address: rinfo.address, port: rinfo.port });\n });\n },\n close() {\n socket.close();\n },\n };\n resolve(udpSocket);\n });\n });\n}\n\n// ═══════════════════════════════════════════════════════════════════════════════\n// WebTransport Adapter (Browser — HTTP/3 unreliable datagrams)\n// ═══════════════════════════════════════════════════════════════════════════════\n\n/**\n * WebTransport-based FlowTransport for browsers.\n *\n * WebTransport (HTTP/3) provides unreliable datagrams — essentially UDP\n * from the browser. This adapter wraps WebTransport's datagram API with\n * the same fragmentation and reassembly used by UDPFlowTransport.\n *\n * Usage:\n * const transport = await WebTransportFlowTransport.connect(\n * 'https://site.example.com/.aeon/udp'\n * );\n * const protocol = new AeonFlowProtocol(transport, { role: 'client' });\n */\nexport class WebTransportFlowTransport implements FlowTransport {\n private wt: any; // WebTransport instance (typed as any for portability)\n private writer: any;\n private receiveHandler: ((data: Uint8Array) => void) | null = null;\n private closed = false;\n private reassembler: FrameReassembler;\n private fragmentGroups = new Map<number, FragmentGroup>();\n private nextFrameId = 0;\n private codec = FlowCodec.createSync();\n\n private constructor(wt: any) {\n this.wt = wt;\n this.reassembler = new FrameReassembler();\n this.upgradeCodecInBackground();\n }\n\n /**\n * Connect to a WebTransport endpoint and return a FlowTransport.\n */\n static async connect(url: string): Promise<WebTransportFlowTransport> {\n // WebTransport is a browser API — check availability\n if (typeof (globalThis as any).WebTransport === 'undefined') {\n throw new Error('WebTransport not available in this environment');\n }\n\n const wt = new (globalThis as any).WebTransport(url);\n await wt.ready;\n\n const transport = new WebTransportFlowTransport(wt);\n transport.writer = wt.datagrams.writable.getWriter();\n\n // Start reading datagrams\n transport.readLoop(wt.datagrams.readable.getReader());\n\n return transport;\n }\n\n send(data: Uint8Array): void {\n if (this.closed) return;\n\n const maxPayload = UDP_MTU - FRAGMENT_HEADER_SIZE;\n\n if (data.length <= maxPayload) {\n const frameId = this.nextFrameId++ & 0xFFFF;\n const datagram = new Uint8Array(FRAGMENT_HEADER_SIZE + data.length);\n const view = new DataView(datagram.buffer);\n view.setUint16(0, frameId);\n datagram[2] = 0;\n datagram[3] = 1;\n datagram.set(data, FRAGMENT_HEADER_SIZE);\n this.writer.write(datagram).catch(() => undefined);\n } else {\n const frameId = this.nextFrameId++ & 0xFFFF;\n const totalFragments = Math.ceil(data.length / maxPayload);\n if (totalFragments > 255) return;\n\n for (let i = 0; i < totalFragments; i++) {\n const start = i * maxPayload;\n const end = Math.min(start + maxPayload, data.length);\n const chunk = data.slice(start, end);\n const datagram = new Uint8Array(FRAGMENT_HEADER_SIZE + chunk.length);\n const view = new DataView(datagram.buffer);\n view.setUint16(0, frameId);\n datagram[2] = i;\n datagram[3] = totalFragments;\n datagram.set(chunk, FRAGMENT_HEADER_SIZE);\n this.writer.write(datagram).catch(() => undefined);\n }\n }\n }\n\n onReceive(handler: (data: Uint8Array) => void): void {\n this.receiveHandler = handler;\n }\n\n close(): void {\n if (this.closed) return;\n this.closed = true;\n this.wt.close();\n this.receiveHandler = null;\n }\n\n private async readLoop(reader: any): Promise<void> {\n try {\n while (!this.closed) {\n const { value, done } = await reader.read();\n if (done) break;\n\n const data = new Uint8Array(value);\n if (data.length < FRAGMENT_HEADER_SIZE) continue;\n\n const view = new DataView(data.buffer, data.byteOffset, data.byteLength);\n const frameId = view.getUint16(0);\n const fragIndex = data[2];\n const fragTotal = data[3];\n const payload = data.subarray(FRAGMENT_HEADER_SIZE);\n\n let reassembled: Uint8Array;\n\n if (fragTotal === 1) {\n reassembled = payload;\n } else {\n let group = this.fragmentGroups.get(frameId);\n if (!group) {\n group = { frameId, total: fragTotal, received: new Map(), createdAt: Date.now() };\n this.fragmentGroups.set(frameId, group);\n }\n group.received.set(fragIndex, payload.slice());\n\n if (group.received.size < group.total) continue;\n\n let totalLen = 0;\n for (let i = 0; i < group.total; i++) totalLen += group.received.get(i)!.length;\n reassembled = new Uint8Array(totalLen);\n let offset = 0;\n for (let i = 0; i < group.total; i++) {\n const frag = group.received.get(i)!;\n reassembled.set(frag, offset);\n offset += frag.length;\n }\n this.fragmentGroups.delete(frameId);\n }\n\n // Decode flow frame and push through reassembler\n try {\n const result = this.codec.decode(reassembled);\n const deliverable = this.reassembler.push(result.frame);\n for (const frame of deliverable) {\n const encoded = this.codec.encode(frame);\n if (this.receiveHandler) {\n this.receiveHandler(encoded);\n }\n }\n } catch {\n // Malformed frame\n }\n }\n } catch {\n // Stream closed\n }\n }\n\n /**\n * Attempt to upgrade to WASM codec without delaying transport startup.\n */\n private upgradeCodecInBackground(): void {\n FlowCodec.create()\n .then((codec) => {\n if (codec.isWasmAccelerated) {\n this.codec = codec;\n }\n })\n .catch(() => {\n // Graceful fallback: keep JS codec\n });\n }\n}\n","/**\n * TopologyAnalyzer — Compute Betti numbers and topological deficit for DAGs\n *\n * Given a computation graph (nodes + edges), computes:\n * β₀ = connected components (independent computations)\n * β₁ = independent cycles / parallel paths (parallelism)\n * β₂ = voids (unreachable states)\n *\n * Then compares actual β₁ to the problem's intrinsic β₁* to produce\n * the topological deficit Δβ — a quantitative measure of wasted parallelism.\n *\n * Zero dependencies. Works everywhere.\n */\n\n// ============================================================================\n// Types\n// ============================================================================\n\n/** A node in the computation graph */\nexport interface ComputationNode {\n /** Unique identifier */\n id: string;\n /** Optional label for diagnostics */\n label?: string;\n /** Node type for structural analysis */\n type?: 'source' | 'sink' | 'fork' | 'join' | 'process';\n}\n\n/** A directed edge in the computation graph */\nexport interface ComputationEdge {\n /** Source node ID */\n from: string;\n /** Target node ID */\n to: string;\n /** Optional label */\n label?: string;\n}\n\n/** The computation graph to analyze */\nexport interface ComputationGraph {\n nodes: ComputationNode[];\n edges: ComputationEdge[];\n /** The problem's intrinsic Betti number — how parallel the problem COULD be */\n intrinsicBeta1?: number;\n}\n\n/** Betti numbers of a computation graph */\nexport interface BettiNumbers {\n /** β₀: connected components (independent computations) */\n beta0: number;\n /** β₁: independent cycles (parallel paths through fork/join pairs) */\n beta1: number;\n /** β₂: voids (estimated from unreachable states in the DAG) */\n beta2: number;\n}\n\n/** A detected fork/join pair in the graph */\nexport interface ForkJoinPair {\n /** The fork node (where paths diverge) */\n forkNode: string;\n /** The join node (where paths converge) */\n joinNode: string;\n /** Number of parallel paths between fork and join */\n parallelPaths: number;\n /** Contribution to β₁ (parallelPaths - 1) */\n beta1Contribution: number;\n}\n\n/** Report on topological deficit */\nexport interface DeficitReport {\n /** The problem's intrinsic β₁* */\n intrinsicBeta1: number;\n /** The implementation's actual β₁ */\n actualBeta1: number;\n /** Δβ = β₁* - β₁ (0 = optimal, >0 = wasted parallelism). Measured in Bules. */\n deficit: number;\n /** Utilization ratio: β₁ / β₁* (1.0 = fully utilizing natural parallelism) */\n utilization: number;\n /** Human-readable assessment */\n assessment: string;\n}\n\n/** Complete topology report */\nexport interface TopologyReport {\n /** Betti numbers */\n betti: BettiNumbers;\n /** Detected fork/join pairs */\n forkJoinPairs: ForkJoinPair[];\n /** Topological deficit (only if intrinsicBeta1 was provided) */\n deficit?: DeficitReport;\n /** Node count */\n nodeCount: number;\n /** Edge count */\n edgeCount: number;\n /** Is the graph a DAG? */\n isDAG: boolean;\n /** Pipeline Reynolds number estimate (stages / chunks) */\n reynoldsEstimate?: number;\n}\n\n// ============================================================================\n// Implementation\n// ============================================================================\n\nexport class TopologyAnalyzer {\n /**\n * Analyze a computation graph and produce a full topology report.\n */\n static analyze(graph: ComputationGraph): TopologyReport {\n const adjacency = buildAdjacency(graph);\n const reverseAdj = buildReverseAdjacency(graph);\n const nodeIds = graph.nodes.map(n => n.id);\n\n const beta0 = computeBeta0(nodeIds, adjacency);\n const isDAG = checkDAG(nodeIds, adjacency);\n const forkJoinPairs = detectForkJoinPairs(nodeIds, adjacency, reverseAdj);\n const beta1 = computeBeta1(graph.nodes.length, graph.edges.length, beta0, forkJoinPairs);\n const beta2 = estimateBeta2(nodeIds, adjacency, reverseAdj);\n\n const betti: BettiNumbers = { beta0, beta1, beta2 };\n\n const report: TopologyReport = {\n betti,\n forkJoinPairs,\n nodeCount: graph.nodes.length,\n edgeCount: graph.edges.length,\n isDAG,\n };\n\n if (graph.intrinsicBeta1 !== undefined) {\n report.deficit = computeDeficit(betti, graph.intrinsicBeta1);\n }\n\n return report;\n }\n\n /**\n * Quick deficit check — just the number, in Bules.\n * Returns Δβ = intrinsicBeta1 - actualBeta1.\n * 0 Bules = topology-matched. >0 Bules = wasted parallelism.\n * Negative means the system has MORE parallelism than needed (over-forking).\n */\n static deficit(graph: ComputationGraph, intrinsicBeta1: number): number {\n const report = TopologyAnalyzer.analyze({ ...graph, intrinsicBeta1 });\n return report.deficit!.deficit;\n }\n\n /**\n * Build a computation graph from a fork/race/fold description.\n * Convenience for common patterns.\n */\n static fromForkRaceFold(config: {\n /** Number of forked paths */\n forkWidth: number;\n /** Number of pipeline stages per path */\n stagesPerPath?: number;\n /** The problem's intrinsic β₁* */\n intrinsicBeta1?: number;\n }): ComputationGraph {\n const { forkWidth, stagesPerPath = 1, intrinsicBeta1 } = config;\n const nodes: ComputationNode[] = [];\n const edges: ComputationEdge[] = [];\n\n // Source node (before fork)\n nodes.push({ id: 'source', type: 'source' });\n // Fork node\n nodes.push({ id: 'fork', type: 'fork' });\n edges.push({ from: 'source', to: 'fork' });\n\n // Parallel paths with stages\n for (let p = 0; p < forkWidth; p++) {\n const pathNodes: string[] = [];\n for (let s = 0; s < stagesPerPath; s++) {\n const id = `path-${p}-stage-${s}`;\n nodes.push({ id, type: 'process', label: `Path ${p} Stage ${s}` });\n pathNodes.push(id);\n }\n // Connect fork → first stage\n edges.push({ from: 'fork', to: pathNodes[0] });\n // Connect stages sequentially\n for (let s = 1; s < pathNodes.length; s++) {\n edges.push({ from: pathNodes[s - 1], to: pathNodes[s] });\n }\n // Connect last stage → join\n edges.push({ from: pathNodes[pathNodes.length - 1], to: 'join' });\n }\n\n // Join node (fold)\n nodes.push({ id: 'join', type: 'join' });\n // Sink node (after fold)\n nodes.push({ id: 'sink', type: 'sink' });\n edges.push({ from: 'join', to: 'sink' });\n\n return { nodes, edges, intrinsicBeta1 };\n }\n\n /**\n * Build a sequential pipeline graph (β₁ = 0).\n * The degenerate case — Ford's assembly line.\n */\n static sequential(stages: number, intrinsicBeta1?: number): ComputationGraph {\n const nodes: ComputationNode[] = [];\n const edges: ComputationEdge[] = [];\n\n for (let i = 0; i < stages; i++) {\n nodes.push({ id: `stage-${i}`, type: 'process', label: `Stage ${i}` });\n if (i > 0) {\n edges.push({ from: `stage-${i - 1}`, to: `stage-${i}` });\n }\n }\n\n return { nodes, edges, intrinsicBeta1 };\n }\n}\n\n// ============================================================================\n// Graph Algorithms\n// ============================================================================\n\nfunction buildAdjacency(graph: ComputationGraph): Map<string, string[]> {\n const adj = new Map<string, string[]>();\n for (const node of graph.nodes) {\n adj.set(node.id, []);\n }\n for (const edge of graph.edges) {\n const list = adj.get(edge.from);\n if (list) list.push(edge.to);\n }\n return adj;\n}\n\nfunction buildReverseAdjacency(graph: ComputationGraph): Map<string, string[]> {\n const adj = new Map<string, string[]>();\n for (const node of graph.nodes) {\n adj.set(node.id, []);\n }\n for (const edge of graph.edges) {\n const list = adj.get(edge.to);\n if (list) list.push(edge.from);\n }\n return adj;\n}\n\n/** β₀: connected components via union-find */\nfunction computeBeta0(nodeIds: string[], adjacency: Map<string, string[]>): number {\n const parent = new Map<string, string>();\n const rank = new Map<string, number>();\n\n for (const id of nodeIds) {\n parent.set(id, id);\n rank.set(id, 0);\n }\n\n function find(x: string): string {\n let root = x;\n while (parent.get(root) !== root) {\n root = parent.get(root)!;\n }\n // Path compression\n let current = x;\n while (current !== root) {\n const next = parent.get(current)!;\n parent.set(current, root);\n current = next;\n }\n return root;\n }\n\n function union(a: string, b: string): void {\n const ra = find(a);\n const rb = find(b);\n if (ra === rb) return;\n const rankA = rank.get(ra)!;\n const rankB = rank.get(rb)!;\n if (rankA < rankB) {\n parent.set(ra, rb);\n } else if (rankA > rankB) {\n parent.set(rb, ra);\n } else {\n parent.set(rb, ra);\n rank.set(ra, rankA + 1);\n }\n }\n\n // Union all edges (treating as undirected for connectivity)\n for (const [from, tos] of adjacency) {\n for (const to of tos) {\n union(from, to);\n }\n }\n\n const roots = new Set<string>();\n for (const id of nodeIds) {\n roots.add(find(id));\n }\n return roots.size;\n}\n\n/** Check if the graph is a DAG (no cycles) via topological sort */\nfunction checkDAG(nodeIds: string[], adjacency: Map<string, string[]>): boolean {\n const inDegree = new Map<string, number>();\n for (const id of nodeIds) {\n inDegree.set(id, 0);\n }\n for (const [, tos] of adjacency) {\n for (const to of tos) {\n inDegree.set(to, (inDegree.get(to) || 0) + 1);\n }\n }\n\n const queue: string[] = [];\n for (const [id, deg] of inDegree) {\n if (deg === 0) queue.push(id);\n }\n\n let processed = 0;\n while (queue.length > 0) {\n const node = queue.shift()!;\n processed++;\n for (const neighbor of adjacency.get(node) || []) {\n const newDeg = inDegree.get(neighbor)! - 1;\n inDegree.set(neighbor, newDeg);\n if (newDeg === 0) queue.push(neighbor);\n }\n }\n\n return processed === nodeIds.length;\n}\n\n/**\n * Detect fork/join pairs.\n *\n * A fork is a node with out-degree > 1.\n * A join is a node with in-degree > 1.\n * We pair them by finding the nearest downstream join for each fork\n * (the immediate dominator in the reverse graph, approximated by\n * finding the first node reachable from ALL fork children).\n */\nfunction detectForkJoinPairs(\n nodeIds: string[],\n adjacency: Map<string, string[]>,\n reverseAdj: Map<string, string[]>,\n): ForkJoinPair[] {\n const pairs: ForkJoinPair[] = [];\n\n // Find fork nodes (out-degree > 1)\n for (const id of nodeIds) {\n const children = adjacency.get(id) || [];\n if (children.length <= 1) continue;\n\n // For each fork, find the nearest join: BFS from each child,\n // find the first node reachable from ALL children\n const reachSets: Set<string>[] = children.map(child => {\n const reachable = new Set<string>();\n const q = [child];\n while (q.length > 0) {\n const n = q.shift()!;\n if (reachable.has(n)) continue;\n reachable.add(n);\n for (const next of adjacency.get(n) || []) {\n q.push(next);\n }\n }\n return reachable;\n });\n\n // Intersection of all reach sets\n if (reachSets.length === 0) continue;\n const intersection = new Set<string>();\n for (const candidate of reachSets[0]) {\n if (reachSets.every(s => s.has(candidate))) {\n intersection.add(candidate);\n }\n }\n\n // Find the nearest join node (smallest BFS distance from fork)\n if (intersection.size > 0) {\n let nearest: string | null = null;\n let nearestDist = Infinity;\n const distQueue: [string, number][] = [[id, 0]];\n const visited = new Set<string>();\n while (distQueue.length > 0) {\n const [n, d] = distQueue.shift()!;\n if (visited.has(n)) continue;\n visited.add(n);\n if (intersection.has(n) && n !== id) {\n if (d < nearestDist) {\n nearest = n;\n nearestDist = d;\n }\n break; // BFS guarantees this is nearest\n }\n for (const next of adjacency.get(n) || []) {\n distQueue.push([next, d + 1]);\n }\n }\n\n if (nearest) {\n const parallelPaths = children.length;\n pairs.push({\n forkNode: id,\n joinNode: nearest,\n parallelPaths,\n beta1Contribution: parallelPaths - 1,\n });\n }\n }\n }\n\n return pairs;\n}\n\n/**\n * β₁: independent parallel paths.\n *\n * For DAGs with fork/join structure, β₁ is the sum of (parallelPaths - 1)\n * across all fork/join pairs. This counts independent cycles in the\n * undirected version of the graph.\n *\n * For general graphs: β₁ = E - V + β₀ (Euler characteristic).\n * We use the fork/join count when pairs are detected (more informative),\n * and fall back to Euler characteristic otherwise.\n */\nfunction computeBeta1(\n V: number,\n E: number,\n beta0: number,\n forkJoinPairs: ForkJoinPair[],\n): number {\n if (forkJoinPairs.length > 0) {\n return forkJoinPairs.reduce((sum, pair) => sum + pair.beta1Contribution, 0);\n }\n // Euler characteristic fallback\n return Math.max(0, E - V + beta0);\n}\n\n/**\n * β₂: estimate voids (unreachable states).\n *\n * In a fork/race/fold DAG, a void is a dead-end path — a node reachable\n * from the source that cannot reach the primary sink. These are paths\n * that were forked but lead nowhere (not even to a vent).\n *\n * We identify the primary sink as the sink with the largest backward\n * reachability set (the \"real\" output). Other sinks are dead ends.\n * β₂ counts nodes reachable from sources that cannot reach the primary sink.\n *\n * For well-formed fork/race/fold graphs, β₂ should be 0.\n */\nfunction estimateBeta2(\n nodeIds: string[],\n adjacency: Map<string, string[]>,\n reverseAdj: Map<string, string[]>,\n): number {\n // Find sources (in-degree 0) and sinks (out-degree 0)\n const sources = nodeIds.filter(id => (reverseAdj.get(id) || []).length === 0);\n const sinks = nodeIds.filter(id => (adjacency.get(id) || []).length === 0);\n\n if (sources.length === 0 || sinks.length <= 1) return 0;\n\n // Find the primary sink: the one with the largest backward reachability\n let primarySink = sinks[0];\n let primaryReachSize = 0;\n\n for (const sink of sinks) {\n const reachable = new Set<string>();\n const q = [sink];\n while (q.length > 0) {\n const n = q.shift()!;\n if (reachable.has(n)) continue;\n reachable.add(n);\n for (const prev of reverseAdj.get(n) || []) {\n q.push(prev);\n }\n }\n if (reachable.size > primaryReachSize) {\n primaryReachSize = reachable.size;\n primarySink = sink;\n }\n }\n\n // Forward reachability from sources\n const forwardReachable = new Set<string>();\n const fq = [...sources];\n while (fq.length > 0) {\n const n = fq.shift()!;\n if (forwardReachable.has(n)) continue;\n forwardReachable.add(n);\n for (const next of adjacency.get(n) || []) {\n fq.push(next);\n }\n }\n\n // Backward reachability from primary sink only\n const backwardReachable = new Set<string>();\n const bq = [primarySink];\n while (bq.length > 0) {\n const n = bq.shift()!;\n if (backwardReachable.has(n)) continue;\n backwardReachable.add(n);\n for (const prev of reverseAdj.get(n) || []) {\n bq.push(prev);\n }\n }\n\n // Void nodes: reachable from source but cannot reach the primary sink\n let voids = 0;\n for (const id of nodeIds) {\n if (forwardReachable.has(id) && !backwardReachable.has(id)) {\n voids++;\n }\n }\n\n return voids;\n}\n\n/** Compute the topological deficit */\nfunction computeDeficit(betti: BettiNumbers, intrinsicBeta1: number): DeficitReport {\n const deficit = intrinsicBeta1 - betti.beta1;\n const utilization = intrinsicBeta1 === 0 ? 1.0 : Math.min(1.0, betti.beta1 / intrinsicBeta1);\n\n let assessment: string;\n if (deficit === 0) {\n assessment = 'Topology-matched: 0 Bules — implementation topology matches problem topology';\n } else if (deficit < 0) {\n assessment = `Over-forked: ${-deficit} excess parallel paths beyond the problem's intrinsic β₁* = ${intrinsicBeta1}`;\n } else if (utilization >= 0.8) {\n assessment = `Near-matched: ${deficit} Bule${deficit !== 1 ? 's' : ''} of waste — ${(utilization * 100).toFixed(0)}% of natural parallelism utilized`;\n } else if (utilization >= 0.5) {\n assessment = `Underutilized: ${deficit} Bule${deficit !== 1 ? 's' : ''} of waste — ${(utilization * 100).toFixed(0)}% of natural parallelism utilized`;\n } else if (betti.beta1 === 0) {\n assessment = `Sequential bottleneck: ${deficit} Bule${deficit !== 1 ? 's' : ''} of waste — β₁ = 0 on a problem with intrinsic β₁* = ${intrinsicBeta1}`;\n } else {\n assessment = `Severely underutilized: ${deficit} Bule${deficit !== 1 ? 's' : ''} of waste — ${(utilization * 100).toFixed(0)}% of natural parallelism utilized`;\n }\n\n return {\n intrinsicBeta1,\n actualBeta1: betti.beta1,\n deficit,\n utilization,\n assessment,\n };\n}\n","/**\n * TopologySampler — Runtime sampling of topological deficit\n *\n * Instruments a live system by recording fork/race/fold/vent events\n * and periodically computing the topological deficit. Produces a\n * time-series of Betti numbers and deficit measurements.\n *\n * Usage:\n * const sampler = new TopologySampler({ intrinsicBeta1: 7 });\n * sampler.fork('request-1', ['path-a', 'path-b', 'path-c']);\n * sampler.race('request-1', 'path-a'); // path-a won\n * sampler.vent('request-1', 'path-b');\n * sampler.vent('request-1', 'path-c');\n * sampler.fold('request-1');\n * const report = sampler.report();\n *\n * Zero dependencies. Works everywhere.\n */\n\n// ============================================================================\n// Types\n// ============================================================================\n\nexport interface SamplerConfig {\n /** The problem's intrinsic β₁* */\n intrinsicBeta1: number;\n /** Maximum number of samples to retain (ring buffer). Default: 1000 */\n maxSamples?: number;\n}\n\n/** A single point-in-time sample */\nexport interface Sample {\n /** Timestamp (ms since epoch) */\n timestamp: number;\n /** Number of active forks at this moment */\n activeForks: number;\n /** Total parallel paths across all active forks */\n activeParallelPaths: number;\n /** Instantaneous β₁ (sum of parallelPaths - 1 per active fork) */\n beta1: number;\n /** Instantaneous deficit: β₁* - β₁ */\n deficit: number;\n /** Instantaneous utilization: β₁ / β₁* */\n utilization: number;\n /** Cumulative forks emitted */\n totalForks: number;\n /** Cumulative folds completed */\n totalFolds: number;\n /** Cumulative vents */\n totalVents: number;\n /** Cumulative races won */\n totalRaces: number;\n}\n\n/** Aggregate report over all samples */\nexport interface SamplerReport {\n /** Problem's intrinsic β₁* */\n intrinsicBeta1: number;\n /** Number of samples collected */\n sampleCount: number;\n /** Time-weighted average β₁ */\n meanBeta1: number;\n /** Peak β₁ observed */\n peakBeta1: number;\n /** Time-weighted average deficit */\n meanDeficit: number;\n /** Time-weighted average utilization (0–1) */\n meanUtilization: number;\n /** Peak utilization observed */\n peakUtilization: number;\n /** Total forks / folds / vents / races */\n totals: { forks: number; folds: number; vents: number; races: number };\n /** Vent ratio: vents / (vents + races). Higher = more exploration, lower = more exploitation */\n ventRatio: number;\n /** Thermodynamic efficiency estimate: races / (races + vents) ≈ W / (W + Q) */\n efficiency: number;\n /** Human-readable assessment */\n assessment: string;\n /** All retained samples (for plotting) */\n samples: Sample[];\n}\n\n// ============================================================================\n// Active fork tracking\n// ============================================================================\n\ninterface ActiveFork {\n id: string;\n paths: Set<string>;\n startTime: number;\n raceWinner?: string;\n}\n\n// ============================================================================\n// Implementation\n// ============================================================================\n\nexport class TopologySampler {\n private readonly config: Required<SamplerConfig>;\n private readonly activeForks = new Map<string, ActiveFork>();\n private readonly samples: Sample[] = [];\n private totalForks = 0;\n private totalFolds = 0;\n private totalVents = 0;\n private totalRaces = 0;\n\n constructor(config: SamplerConfig) {\n this.config = {\n maxSamples: 1000,\n ...config,\n };\n }\n\n /**\n * Record a fork event: one computation splits into N parallel paths.\n */\n fork(id: string, paths: string[]): void {\n this.activeForks.set(id, {\n id,\n paths: new Set(paths),\n startTime: Date.now(),\n });\n this.totalForks++;\n this.recordSample();\n }\n\n /**\n * Record a race result: one path won.\n */\n race(id: string, winnerPath: string): void {\n const fork = this.activeForks.get(id);\n if (fork) {\n fork.raceWinner = winnerPath;\n }\n this.totalRaces++;\n this.recordSample();\n }\n\n /**\n * Record a vent: a path was released (didn't win, errored, timed out).\n */\n vent(id: string, path: string): void {\n const fork = this.activeForks.get(id);\n if (fork) {\n fork.paths.delete(path);\n }\n this.totalVents++;\n this.recordSample();\n }\n\n /**\n * Record a fold: computation merged to a single result.\n */\n fold(id: string): void {\n this.activeForks.delete(id);\n this.totalFolds++;\n this.recordSample();\n }\n\n /**\n * Take a snapshot without recording an event (for periodic sampling).\n */\n sample(): Sample {\n return this.recordSample();\n }\n\n /**\n * Get the current instantaneous deficit.\n */\n currentDeficit(): number {\n const beta1 = this.currentBeta1();\n return this.config.intrinsicBeta1 - beta1;\n }\n\n /**\n * Get the current instantaneous β₁.\n */\n currentBeta1(): number {\n let beta1 = 0;\n for (const fork of this.activeForks.values()) {\n beta1 += Math.max(0, fork.paths.size - 1);\n }\n return beta1;\n }\n\n /**\n * Generate the aggregate report.\n */\n report(): SamplerReport {\n const samples = this.samples;\n const n = samples.length;\n\n if (n === 0) {\n return {\n intrinsicBeta1: this.config.intrinsicBeta1,\n sampleCount: 0,\n meanBeta1: 0,\n peakBeta1: 0,\n meanDeficit: this.config.intrinsicBeta1,\n meanUtilization: 0,\n peakUtilization: 0,\n totals: { forks: 0, folds: 0, vents: 0, races: 0 },\n ventRatio: 0,\n efficiency: 0,\n assessment: 'No samples collected',\n samples: [],\n };\n }\n\n // Time-weighted averages\n let sumBeta1 = 0;\n let sumDeficit = 0;\n let sumUtilization = 0;\n let peakBeta1 = 0;\n let peakUtilization = 0;\n\n for (let i = 0; i < n; i++) {\n const s = samples[i];\n const weight = i < n - 1 ? samples[i + 1].timestamp - s.timestamp : 1;\n const w = Math.max(weight, 1); // avoid zero-weight for same-ms samples\n sumBeta1 += s.beta1 * w;\n sumDeficit += s.deficit * w;\n sumUtilization += s.utilization * w;\n if (s.beta1 > peakBeta1) peakBeta1 = s.beta1;\n if (s.utilization > peakUtilization) peakUtilization = s.utilization;\n }\n\n const totalWeight = n > 1\n ? samples[n - 1].timestamp - samples[0].timestamp + 1\n : 1;\n\n const meanBeta1 = sumBeta1 / totalWeight;\n const meanDeficit = sumDeficit / totalWeight;\n const meanUtilization = sumUtilization / totalWeight;\n\n const totalEvents = this.totalRaces + this.totalVents;\n const ventRatio = totalEvents > 0 ? this.totalVents / totalEvents : 0;\n const efficiency = totalEvents > 0 ? this.totalRaces / totalEvents : 0;\n\n let assessment: string;\n if (meanUtilization >= 0.95) {\n assessment = `Topology-matched: mean utilization ${(meanUtilization * 100).toFixed(1)}%, mean Δβ = ${meanDeficit.toFixed(1)}`;\n } else if (meanUtilization >= 0.7) {\n assessment = `Near-matched: mean utilization ${(meanUtilization * 100).toFixed(1)}%, mean Δβ = ${meanDeficit.toFixed(1)}. Peak β₁ = ${peakBeta1} shows the system CAN reach higher parallelism`;\n } else if (meanUtilization >= 0.3) {\n assessment = `Underutilized: mean utilization ${(meanUtilization * 100).toFixed(1)}%, mean Δβ = ${meanDeficit.toFixed(1)}. The system is forcing a β₁* = ${this.config.intrinsicBeta1} problem through a β₁ ≈ ${meanBeta1.toFixed(1)} pipe`;\n } else {\n assessment = `Sequential bottleneck: mean utilization ${(meanUtilization * 100).toFixed(1)}%, mean Δβ = ${meanDeficit.toFixed(1)}. Almost all natural parallelism is wasted`;\n }\n\n return {\n intrinsicBeta1: this.config.intrinsicBeta1,\n sampleCount: n,\n meanBeta1,\n peakBeta1,\n meanDeficit,\n meanUtilization,\n peakUtilization,\n totals: {\n forks: this.totalForks,\n folds: this.totalFolds,\n vents: this.totalVents,\n races: this.totalRaces,\n },\n ventRatio,\n efficiency,\n assessment,\n samples: [...samples],\n };\n }\n\n /**\n * Reset all state.\n */\n reset(): void {\n this.activeForks.clear();\n this.samples.length = 0;\n this.totalForks = 0;\n this.totalFolds = 0;\n this.totalVents = 0;\n this.totalRaces = 0;\n }\n\n // ──────────────────────────────────────────────────────────────────────────\n // Internal\n // ──────────────────────────────────────────────────────────────────────────\n\n private recordSample(): Sample {\n let activeParallelPaths = 0;\n let beta1 = 0;\n for (const fork of this.activeForks.values()) {\n activeParallelPaths += fork.paths.size;\n beta1 += Math.max(0, fork.paths.size - 1);\n }\n\n const intrinsic = this.config.intrinsicBeta1;\n const deficit = intrinsic - beta1;\n const utilization = intrinsic === 0 ? 1.0 : Math.min(1.0, beta1 / intrinsic);\n\n const sample: Sample = {\n timestamp: Date.now(),\n activeForks: this.activeForks.size,\n activeParallelPaths,\n beta1,\n deficit,\n utilization,\n totalForks: this.totalForks,\n totalFolds: this.totalFolds,\n totalVents: this.totalVents,\n totalRaces: this.totalRaces,\n };\n\n this.samples.push(sample);\n\n // Ring buffer\n if (this.samples.length > this.config.maxSamples) {\n this.samples.shift();\n }\n\n return sample;\n }\n}\n","export interface WorthingtonWhipResult {\n readonly shards: number;\n readonly numerator: number;\n readonly denominator: number;\n readonly savingsFraction: number;\n}\n\nexport interface SpeculativeTreeResult {\n readonly alpha: number;\n readonly depth: number;\n readonly expectedAccepted: number;\n readonly denominator: number;\n}\n\nexport interface TurbulentIdleResult {\n readonly stageCount: number;\n readonly chunkCount: number;\n readonly numerator: number;\n readonly denominator: number;\n readonly idleFraction: number;\n}\n\nexport interface FrontierFillResult {\n readonly frontierByLayer: readonly number[];\n readonly layerCount: number;\n readonly frontierArea: number;\n readonly peakFrontier: number;\n readonly envelopeArea: number;\n readonly frontierFill: number;\n readonly wallaceNumber: number;\n readonly wally: number;\n readonly frontierDeficit: number;\n}\n\nexport interface PipelineOccupancyResult {\n readonly stageCount: number;\n readonly chunkCount: number;\n readonly frontierArea: number;\n readonly capacityArea: number;\n readonly frontierFill: number;\n readonly occupancyDeficit: number;\n}\n\nexport type PipelineRegime = 'laminar' | 'transitional' | 'turbulent';\n\nexport type ParallelismAction =\n | 'expand'\n | 'staggered-expand'\n | 'hold'\n | 'multiplex'\n | 'constrain';\n\nexport interface AdaptiveParallelismPolicyResult {\n readonly intrinsicBeta1: number;\n readonly actualBeta1: number;\n readonly topologyDeficit: number;\n readonly stageCount: number;\n readonly chunkCount: number;\n readonly reynoldsEstimate: number;\n readonly regime: PipelineRegime;\n readonly frontierFill: number;\n readonly occupancyDeficit: number;\n readonly highOccupancyDeficit: boolean;\n readonly action: ParallelismAction;\n readonly rationale: string;\n}\n\nexport interface QuantumDeficitResult {\n readonly sqrtN: number;\n readonly searchSize: number;\n readonly classicalDeficit: number;\n readonly quantumDeficit: number;\n readonly speedup: number;\n}\n\nexport interface ProtocolDeficitResult {\n readonly streamCount: number;\n readonly intrinsicBeta1: number;\n readonly tcpDeficit: number;\n readonly quicDeficit: number;\n readonly flowDeficit: number;\n}\n\nexport interface SettlementDeficitResult {\n readonly intrinsicBeta1: number;\n readonly sequentialDeficit: number;\n readonly parallelDeficit: number;\n}\n\nfunction assertPositiveInteger(name: string, value: number): number {\n if (!Number.isInteger(value) || value <= 0) {\n throw new Error(`${name} must be a positive integer`);\n }\n return value;\n}\n\nfunction assertUnitIntervalOpen(name: string, value: number): number {\n if (!Number.isFinite(value) || value < 0 || value >= 1) {\n throw new Error(`${name} must be in [0, 1)`);\n }\n return value;\n}\n\nfunction assertNonNegativeFinite(name: string, value: number): number {\n if (!Number.isFinite(value) || value < 0) {\n throw new Error(`${name} must be a non-negative finite number`);\n }\n return value;\n}\n\nfunction assertNonNegativeInteger(name: string, value: number): number {\n if (!Number.isInteger(value) || value < 0) {\n throw new Error(`${name} must be a non-negative integer`);\n }\n return value;\n}\n\nfunction assertNonEmptyFrontier(frontierByLayer: readonly number[]): readonly number[] {\n if (frontierByLayer.length === 0) {\n throw new Error('frontierByLayer must contain at least one layer');\n }\n frontierByLayer.forEach((width, index) => {\n assertNonNegativeInteger(`frontierByLayer[${index}]`, width);\n });\n return frontierByLayer;\n}\n\nexport function worthingtonWhipSavings(shards: number): WorthingtonWhipResult {\n const normalizedShards = assertPositiveInteger('shards', shards);\n const numerator = normalizedShards - 1;\n const denominator = 2 * normalizedShards;\n return {\n shards: normalizedShards,\n numerator,\n denominator,\n savingsFraction: numerator / denominator,\n };\n}\n\nexport function speculativeTreeExpectedAccepted(\n alpha: number,\n depth: number,\n): SpeculativeTreeResult {\n const normalizedAlpha = assertUnitIntervalOpen('alpha', alpha);\n const normalizedDepth = assertPositiveInteger('depth', depth);\n const denominator = 1 - normalizedAlpha;\n return {\n alpha: normalizedAlpha,\n depth: normalizedDepth,\n expectedAccepted:\n (1 - Math.pow(normalizedAlpha, normalizedDepth)) / denominator,\n denominator,\n };\n}\n\nexport function turbulentIdleFraction(\n stageCount: number,\n chunkCount: number,\n): TurbulentIdleResult {\n const normalizedStageCount = assertPositiveInteger('stageCount', stageCount);\n const normalizedChunkCount = assertPositiveInteger('chunkCount', chunkCount);\n const numerator = normalizedStageCount * (normalizedStageCount - 1);\n const denominator =\n normalizedStageCount * (normalizedChunkCount + normalizedStageCount - 1);\n return {\n stageCount: normalizedStageCount,\n chunkCount: normalizedChunkCount,\n numerator,\n denominator,\n idleFraction: numerator / denominator,\n };\n}\n\nexport function frontierFill(\n frontierByLayer: readonly number[],\n): FrontierFillResult {\n const normalizedFrontier = assertNonEmptyFrontier(frontierByLayer);\n const layerCount = normalizedFrontier.length;\n const frontierArea = normalizedFrontier.reduce((sum, width) => sum + width, 0);\n const peakFrontier = normalizedFrontier.reduce(\n (peak, width) => Math.max(peak, width),\n 0,\n );\n const envelopeArea = layerCount * peakFrontier;\n const fill = envelopeArea === 0 ? 1 : frontierArea / envelopeArea;\n const wallaceNumber = 1 - fill;\n\n return {\n frontierByLayer: [...normalizedFrontier],\n layerCount,\n frontierArea,\n peakFrontier,\n envelopeArea,\n frontierFill: fill,\n wallaceNumber,\n wally: wallaceNumber,\n frontierDeficit: wallaceNumber,\n };\n}\n\nexport function pipelineOccupancy(\n stageCount: number,\n chunkCount: number,\n): PipelineOccupancyResult {\n const normalizedStageCount = assertPositiveInteger('stageCount', stageCount);\n const normalizedChunkCount = assertPositiveInteger('chunkCount', chunkCount);\n const frontierArea = normalizedStageCount * normalizedChunkCount;\n const capacityArea =\n normalizedStageCount *\n (normalizedChunkCount + normalizedStageCount - 1);\n const fill = frontierArea / capacityArea;\n\n return {\n stageCount: normalizedStageCount,\n chunkCount: normalizedChunkCount,\n frontierArea,\n capacityArea,\n frontierFill: fill,\n occupancyDeficit: 1 - fill,\n };\n}\n\nexport function classifyPipelineRegime(\n stageCount: number,\n chunkCount: number,\n): PipelineRegime {\n const normalizedStageCount = assertPositiveInteger('stageCount', stageCount);\n const normalizedChunkCount = assertPositiveInteger('chunkCount', chunkCount);\n const reynoldsEstimate = normalizedStageCount / normalizedChunkCount;\n\n if (reynoldsEstimate < 0.3) {\n return 'laminar';\n }\n if (reynoldsEstimate > 0.7) {\n return 'turbulent';\n }\n return 'transitional';\n}\n\nexport function adaptiveParallelismPolicy(config: {\n intrinsicBeta1: number;\n actualBeta1: number;\n stageCount: number;\n chunkCount: number;\n}): AdaptiveParallelismPolicyResult {\n const intrinsicBeta1 = assertNonNegativeFinite(\n 'intrinsicBeta1',\n config.intrinsicBeta1,\n );\n const actualBeta1 = assertNonNegativeFinite('actualBeta1', config.actualBeta1);\n const occupancy = pipelineOccupancy(config.stageCount, config.chunkCount);\n const topologyDeficit = intrinsicBeta1 - actualBeta1;\n const regime = classifyPipelineRegime(config.stageCount, config.chunkCount);\n const highOccupancyDeficit = occupancy.occupancyDeficit >= 0.2;\n const reynoldsEstimate = config.stageCount / config.chunkCount;\n\n let action: ParallelismAction;\n let rationale: string;\n\n if (topologyDeficit > 0 && highOccupancyDeficit) {\n action = 'staggered-expand';\n rationale =\n 'Natural parallelism exceeds the current topology, but warm-up overhead is still high; widen gradually rather than forking to the limit immediately.';\n } else if (topologyDeficit > 0) {\n action = 'expand';\n rationale =\n 'The current implementation is too sequential for the problem and the wavefront is already filling efficiently enough to justify more parallelism.';\n } else if (topologyDeficit < 0 && highOccupancyDeficit) {\n action = 'constrain';\n rationale =\n 'The system is already over-forked relative to the problem and early occupancy is poor; reduce single-request fan-out.';\n } else if (regime === 'turbulent') {\n action = 'multiplex';\n rationale =\n 'The topology is not the bottleneck, but the pipeline is in a high-Reynolds turbulent regime; fill idle slots with cross-request work instead of widening one request.';\n } else {\n action = 'hold';\n rationale =\n 'Topology and occupancy are aligned well enough that the current degree of parallelism should remain stable.';\n }\n\n return {\n intrinsicBeta1,\n actualBeta1,\n topologyDeficit,\n stageCount: config.stageCount,\n chunkCount: config.chunkCount,\n reynoldsEstimate,\n regime,\n frontierFill: occupancy.frontierFill,\n occupancyDeficit: occupancy.occupancyDeficit,\n highOccupancyDeficit,\n action,\n rationale,\n };\n}\n\nexport function quantumDeficitIdentity(sqrtN: number): QuantumDeficitResult {\n const normalizedSqrtN = assertPositiveInteger('sqrtN', sqrtN);\n const searchSize = normalizedSqrtN * normalizedSqrtN;\n const classicalDeficit = normalizedSqrtN - 1;\n return {\n sqrtN: normalizedSqrtN,\n searchSize,\n classicalDeficit,\n quantumDeficit: 0,\n speedup: searchSize / normalizedSqrtN,\n };\n}\n\nexport function protocolDeficits(streamCount: number): ProtocolDeficitResult {\n const normalizedStreamCount = assertPositiveInteger('streamCount', streamCount);\n if (normalizedStreamCount <= 1) {\n throw new Error('streamCount must be greater than 1');\n }\n const intrinsicBeta1 = normalizedStreamCount - 1;\n return {\n streamCount: normalizedStreamCount,\n intrinsicBeta1,\n tcpDeficit: intrinsicBeta1,\n quicDeficit: 0,\n flowDeficit: 0,\n };\n}\n\nexport function settlementDeficits(): SettlementDeficitResult {\n return {\n intrinsicBeta1: 2,\n sequentialDeficit: 2,\n parallelDeficit: 0,\n };\n}\n\nexport function beta2FromBandGap(forbiddenEnergyCount: number): number {\n const normalizedForbiddenCount = assertNonNegativeFinite(\n 'forbiddenEnergyCount',\n forbiddenEnergyCount,\n );\n return normalizedForbiddenCount > 0 ? 1 : 0;\n}\n\nexport function firstLawConserved(\n forkEnergy: number,\n foldWork: number,\n ventEnergy: number,\n tolerance = 1e-9,\n): boolean {\n const normalizedForkEnergy = assertNonNegativeFinite('forkEnergy', forkEnergy);\n const normalizedFoldWork = assertNonNegativeFinite('foldWork', foldWork);\n const normalizedVentEnergy = assertNonNegativeFinite('ventEnergy', ventEnergy);\n if (normalizedFoldWork > normalizedForkEnergy) {\n return false;\n }\n const delta = Math.abs(\n normalizedForkEnergy - (normalizedFoldWork + normalizedVentEnergy),\n );\n return delta <= Math.max(tolerance, 0);\n}\n","export type GnosisImpossibleSystemId =\n | 'edge-pipeline-parallelism'\n | 'audio-token-privacy'\n | 'crdt-split-brain-prevention'\n | 'webgpu-graph-flattening';\n\nexport interface GnosisImpossibleSystemTopology {\n readonly id: GnosisImpossibleSystemId;\n readonly title: string;\n readonly aeonSurface: 'flow' | 'topology' | 'federation';\n readonly gnosisExamplePath: string;\n readonly gnosisTestPath: string;\n readonly summary: string;\n readonly invariants: readonly string[];\n}\n\nexport const GNOSIS_IMPOSSIBLE_SYSTEM_TOPOLOGIES = [\n {\n id: 'edge-pipeline-parallelism',\n title: 'Edge Pipeline Parallelism',\n aeonSurface: 'federation',\n gnosisExamplePath: 'open-source/gnosis/examples/edge-pipeline-parallelism.gg',\n gnosisTestPath: 'open-source/gnosis/examples/impossible-systems.test.gg',\n summary:\n 'Models a 13B request folding across layer-sharded workers that relay quantized hidden state and race a warm standby for failover.',\n invariants: [\n 'no single worker shard exceeds its annotated capacity',\n 'the request still reaches a folded response under warm-standby failover',\n ],\n },\n {\n id: 'audio-token-privacy',\n title: 'Audio Token Privacy',\n aeonSurface: 'flow',\n gnosisExamplePath: 'open-source/gnosis/examples/audio-token-privacy.gg',\n gnosisTestPath: 'open-source/gnosis/examples/impossible-systems.test.gg',\n summary:\n 'Models semantic, prosodic, and biometric token lanes, injecting noise into identity-bearing RVQ layers before anything is folded into the public mesh.',\n invariants: [\n 'identity-bearing layers are noised before the public fold',\n 'semantic and prosodic lanes remain part of the folded output',\n ],\n },\n {\n id: 'crdt-split-brain-prevention',\n title: 'CRDT Split-Brain Prevention',\n aeonSurface: 'topology',\n gnosisExamplePath: 'open-source/gnosis/examples/crdt-split-brain-prevention.gg',\n gnosisTestPath: 'open-source/gnosis/examples/impossible-systems.test.gg',\n summary:\n 'Models geographically separated replicas, nonce-scoped replay guards, and deterministic CRDT observation collapsing to one canonical state.',\n invariants: [\n 'replica writes carry distinct nonce identities',\n 'deterministic CRDT observation collapses to one canonical state',\n ],\n },\n {\n id: 'webgpu-graph-flattening',\n title: 'WebGPU Graph Flattening',\n aeonSurface: 'topology',\n gnosisExamplePath: 'open-source/gnosis/examples/webgpu-graph-flattening.gg',\n gnosisTestPath: 'open-source/gnosis/examples/impossible-systems.test.gg',\n summary:\n 'Models flattening a pointer-chasing object graph into a contiguous Float32Array path that races a scattered CPU walk.',\n invariants: [\n 'the flattened buffer is contiguous Float32Array state',\n 'the packed GPU path is explicit in the topology and races the scattered walk',\n ],\n },\n] as const satisfies readonly GnosisImpossibleSystemTopology[];\n\nexport function getGnosisImpossibleSystemTopology(\n id: GnosisImpossibleSystemId\n): GnosisImpossibleSystemTopology | undefined {\n return GNOSIS_IMPOSSIBLE_SYSTEM_TOPOLOGIES.find((topology) => topology.id === id);\n}\n","import { createHash } from 'node:crypto';\n\nexport type FragmentKind = 'html' | 'css' | 'js' | 'asset' | 'esi';\n\nexport type FragmentObservabilityClass =\n | 'critical'\n | 'visible'\n | 'supporting'\n | 'deferred'\n | 'opaque';\n\nexport type FragmentEffectClass = 'inert' | 'effectful' | 'unknown';\n\nexport type ProjectionProofLevel =\n | 'none'\n | 'strong-html-css'\n | 'conservative-js';\n\nexport interface RequestGuard {\n routes?: string[];\n locales?: string[];\n authTiers?: string[];\n featureFlags?: string[];\n deviceBuckets?: string[];\n viewportBuckets?: string[];\n}\n\nexport interface FragmentRuntimeTemplate {\n envelopeCid: string;\n ownerDid: string;\n parentFragmentId?: string;\n childOfApp?: boolean;\n supervisorStrategy?: 'one_for_one' | 'one_for_all' | 'rest_for_one';\n}\n\nexport interface FragmentNode {\n id: string;\n kind: FragmentKind;\n contentHash: string;\n dependencyIds: string[];\n requestGuard: RequestGuard;\n observabilityClass: FragmentObservabilityClass;\n effectClass?: FragmentEffectClass;\n proofMetadata: {\n level: ProjectionProofLevel;\n reason: string;\n bounded: boolean;\n };\n provenance: {\n sourcePath?: string;\n sourcePaths?: string[];\n buildHash?: string;\n route?: string;\n generatedAt: string;\n };\n contentType: string;\n content?: string;\n metadata?: Record<string, string>;\n runtimeTemplate?: FragmentRuntimeTemplate;\n}\n\nexport interface ProjectionArtifact {\n artifactId: string;\n buildHash: string;\n fragmentGraph: {\n nodes: FragmentNode[];\n entrypoints: Record<string, string>;\n };\n guardSchema: {\n routes: boolean;\n locales: boolean;\n authTiers: boolean;\n featureFlags: boolean;\n deviceBuckets: boolean;\n viewportBuckets: boolean;\n };\n provenance: {\n generatedAt: string;\n ownerDid?: string;\n sourceRoot?: string;\n };\n proofMetadata: {\n maxLevel: ProjectionProofLevel;\n htmlCssClosedWorld: boolean;\n jsConservative: boolean;\n };\n}\n\nexport interface RequestSignature {\n route: string;\n locale: string;\n authTier: string;\n featureFlags: string[];\n deviceBucket: string;\n viewportBucket?: string;\n}\n\nexport interface ProjectedAssetPayload {\n path: string;\n contentType: string;\n body: string;\n etag: string;\n}\n\nexport interface ProjectionResult {\n selectedFragmentIds: string[];\n proofLevel: ProjectionProofLevel;\n cacheKey: string;\n html?: string;\n css?: string;\n js: Array<{\n fragmentId: string;\n path: string;\n content: string;\n effectClass: FragmentEffectClass;\n }>;\n assets: ProjectedAssetPayload[];\n speculativeChildren: string[];\n}\n\nexport interface SpeculationBudget {\n maxProjectedVariants: number;\n maxAnalysisTimeMs: number;\n maxCacheBytes: number;\n minConfidence: number;\n}\n\nexport const DEFAULT_SPECULATION_BUDGET: SpeculationBudget = {\n maxProjectedVariants: 3,\n maxAnalysisTimeMs: 50,\n maxCacheBytes: 512 * 1024,\n minConfidence: 0.25,\n};\n\nexport function stableContentHash(content: string): string {\n return createHash('sha256').update(content).digest('hex');\n}\n\nexport function createProjectionArtifactId(\n buildHash: string,\n nodes: readonly FragmentNode[]\n): string {\n return `projection:${stableContentHash(\n `${buildHash}:${nodes.map((node) => node.contentHash).join(':')}`\n )}`;\n}\n\nexport function canonicalizeFeatureFlags(\n featureFlags: readonly string[]\n): string[] {\n return [...new Set(featureFlags.map((flag) => flag.trim()).filter(Boolean))].sort();\n}\n\nexport function normalizeRequestSignature(\n signature: RequestSignature\n): RequestSignature {\n return {\n ...signature,\n route: signature.route || '/',\n locale: signature.locale || 'und',\n authTier: signature.authTier || 'anonymous',\n deviceBucket: signature.deviceBucket || 'desktop',\n featureFlags: canonicalizeFeatureFlags(signature.featureFlags),\n viewportBucket: signature.viewportBucket || undefined,\n };\n}\n\nexport function requestSignatureKey(signature: RequestSignature): string {\n const normalized = normalizeRequestSignature(signature);\n return [\n normalized.route,\n normalized.locale,\n normalized.authTier,\n normalized.deviceBucket,\n normalized.viewportBucket ?? 'any',\n normalized.featureFlags.join(','),\n ].join('|');\n}\n\nexport function computeProjectionCacheKey(\n artifact: Pick<ProjectionArtifact, 'artifactId' | 'buildHash'>,\n signature: RequestSignature\n): string {\n return stableContentHash(\n `${artifact.artifactId}:${artifact.buildHash}:${requestSignatureKey(signature)}`\n );\n}\n\nexport function matchesRequestGuard(\n guard: RequestGuard,\n signature: RequestSignature\n): boolean {\n const normalized = normalizeRequestSignature(signature);\n\n if (guard.routes?.length && !guard.routes.includes(normalized.route)) {\n return false;\n }\n if (guard.locales?.length && !guard.locales.includes(normalized.locale)) {\n return false;\n }\n if (guard.authTiers?.length && !guard.authTiers.includes(normalized.authTier)) {\n return false;\n }\n if (\n guard.deviceBuckets?.length &&\n !guard.deviceBuckets.includes(normalized.deviceBucket)\n ) {\n return false;\n }\n if (\n guard.viewportBuckets?.length &&\n !guard.viewportBuckets.includes(normalized.viewportBucket ?? '')\n ) {\n return false;\n }\n if (guard.featureFlags?.length) {\n for (const flag of guard.featureFlags) {\n if (!normalized.featureFlags.includes(flag)) {\n return false;\n }\n }\n }\n\n return true;\n}\n","/**\n * DashRelay Flow Transport\n *\n * FlowTransport adapter for DashRelay WebSocket relay.\n * THE backbone transport — all Aeon data flows through DashRelay.\n *\n * DashRelay provides:\n * - Room-based pub/sub (peers join rooms by name)\n * - Binary broadcast to all peers in a room\n * - Peer discovery (join/leave events)\n * - Auth via API key or UCAN token\n * - Automatic reconnection with exponential backoff\n *\n * This transport wraps DashRelay's broadcast/message system as a\n * FlowTransport interface, enabling flow protocol (fork/race/fold)\n * over the relay mesh. Every app in the stack — forge sites, shell,\n * inference, presence, CRDT sync — speaks Aeon flow protocol over\n * DashRelay internally. HTTP is just the normie projection.\n *\n * Two modes:\n * 1. **Room broadcast**: All peers in the room receive all flow frames.\n * Good for mesh networking, federated inference, presence.\n * 2. **Directed**: Flow frames include a target peer ID header.\n * Good for point-to-point within a room (shell ↔ specific forge site).\n *\n * The transport is DashRelay-client agnostic — it takes a minimal\n * interface so it works with any DashRelay client implementation.\n */\n\nimport type { FlowTransport } from '../flow/types';\n\n// ═══════════════════════════════════════════════════════════════════════════════\n// Types\n// ═══════════════════════════════════════════════════════════════════════════════\n\n/**\n * Minimal DashRelay client interface.\n * Works with @dashrelay/client or any compatible implementation.\n */\nexport interface DashRelayLike {\n /** Broadcast binary data to all peers in the room */\n broadcast(payload: Uint8Array): void;\n /** Register handler for incoming messages */\n on(event: 'message', handler: (senderId: string, payload: Uint8Array) => void): void;\n /** Unregister handler */\n off(event: 'message', handler: (senderId: string, payload: Uint8Array) => void): void;\n /** Peer events */\n on(event: 'peerJoined', handler: (peerId: string) => void): void;\n on(event: 'peerLeft', handler: (peerId: string) => void): void;\n off(event: 'peerJoined', handler: (peerId: string) => void): void;\n off(event: 'peerLeft', handler: (peerId: string) => void): void;\n /** Connection events */\n on(event: 'connected', handler: () => void): void;\n on(event: 'disconnected', handler: () => void): void;\n off(event: 'connected', handler: () => void): void;\n off(event: 'disconnected', handler: () => void): void;\n}\n\nexport interface DashRelayFlowConfig {\n /** Target specific peer (directed mode) or broadcast to all (default) */\n targetPeerId?: string;\n /** This peer's ID (for filtering own messages) */\n localPeerId?: string;\n /** Channel tag for multiplexing multiple flow protocols in one room */\n channel?: string;\n}\n\n// ═══════════════════════════════════════════════════════════════════════════════\n// Wire Envelope\n// ═══════════════════════════════════════════════════════════════════════════════\n\n/**\n * Envelope for flow frames over DashRelay broadcast.\n *\n * Format (binary):\n * [0] u8 version (0x01)\n * [1] u8 flags (0x01 = directed, 0x02 = has-channel)\n * [2-5] u32 target peer ID length (0 if broadcast)\n * [6-9] u32 channel length (0 if no channel)\n * [...] target peer ID bytes (if directed)\n * [...] channel bytes (if has-channel)\n * [...] flow frame payload\n */\nconst ENVELOPE_VERSION = 0x01;\nconst FLAG_DIRECTED = 0x01;\nconst FLAG_HAS_CHANNEL = 0x02;\n\nfunction encodeEnvelope(\n payload: Uint8Array,\n targetPeerId?: string,\n channel?: string\n): Uint8Array {\n const encoder = new TextEncoder();\n const targetBytes = targetPeerId ? encoder.encode(targetPeerId) : new Uint8Array(0);\n const channelBytes = channel ? encoder.encode(channel) : new Uint8Array(0);\n\n let flags = 0;\n if (targetPeerId) flags |= FLAG_DIRECTED;\n if (channel) flags |= FLAG_HAS_CHANNEL;\n\n const headerSize = 10; // version(1) + flags(1) + targetLen(4) + channelLen(4)\n const totalSize = headerSize + targetBytes.byteLength + channelBytes.byteLength + payload.byteLength;\n const envelope = new Uint8Array(totalSize);\n const view = new DataView(envelope.buffer);\n\n envelope[0] = ENVELOPE_VERSION;\n envelope[1] = flags;\n view.setUint32(2, targetBytes.byteLength, false);\n view.setUint32(6, channelBytes.byteLength, false);\n\n let offset = headerSize;\n envelope.set(targetBytes, offset);\n offset += targetBytes.byteLength;\n envelope.set(channelBytes, offset);\n offset += channelBytes.byteLength;\n envelope.set(payload, offset);\n\n return envelope;\n}\n\nfunction decodeEnvelope(data: Uint8Array): {\n target: string | null;\n channel: string | null;\n payload: Uint8Array;\n} | null {\n if (data.byteLength < 10) return null;\n\n const view = new DataView(data.buffer, data.byteOffset, data.byteLength);\n\n if (data[0] !== ENVELOPE_VERSION) return null;\n\n const flags = data[1];\n const targetLen = view.getUint32(2, false);\n const channelLen = view.getUint32(6, false);\n\n const headerSize = 10;\n if (data.byteLength < headerSize + targetLen + channelLen) return null;\n\n const decoder = new TextDecoder();\n let offset = headerSize;\n\n const target = (flags & FLAG_DIRECTED)\n ? decoder.decode(data.subarray(offset, offset + targetLen))\n : null;\n offset += targetLen;\n\n const channel = (flags & FLAG_HAS_CHANNEL)\n ? decoder.decode(data.subarray(offset, offset + channelLen))\n : null;\n offset += channelLen;\n\n const payload = data.subarray(offset);\n\n return { target, channel, payload };\n}\n\n// ═══════════════════════════════════════════════════════════════════════════════\n// DashRelay FlowTransport\n// ═══════════════════════════════════════════════════════════════════════════════\n\n/**\n * FlowTransport over DashRelay broadcast.\n *\n * All peers in a DashRelay room receive flow frames.\n * In directed mode, frames include a target peer ID and\n * non-target peers ignore them.\n *\n * This is the primary transport for the Aeon stack.\n * Everything talks Aeon internally over DashRelay.\n */\nexport class DashRelayFlowTransport implements FlowTransport {\n private relay: DashRelayLike;\n private receiveHandler: ((data: Uint8Array) => void) | null = null;\n private closed = false;\n private config: DashRelayFlowConfig;\n private peerHandler: ((senderId: string, payload: Uint8Array) => void) | null = null;\n\n /** Connected peers observed via relay events */\n private peers = new Set<string>();\n private peerJoinHandler: ((peerId: string) => void) | null = null;\n private peerLeaveHandler: ((peerId: string) => void) | null = null;\n\n /** Optional handlers for peer lifecycle events */\n onPeerJoin: ((peerId: string) => void) | null = null;\n onPeerLeave: ((peerId: string) => void) | null = null;\n\n constructor(relay: DashRelayLike, config?: DashRelayFlowConfig) {\n this.relay = relay;\n this.config = config ?? {};\n\n // Wire up message handler\n this.peerHandler = (senderId: string, payload: Uint8Array) => {\n if (!this.receiveHandler) return;\n\n // Ignore own messages\n if (this.config.localPeerId && senderId === this.config.localPeerId) return;\n\n // Decode envelope\n const envelope = decodeEnvelope(payload);\n if (!envelope) return;\n\n // Check if directed to us\n if (envelope.target && this.config.localPeerId && envelope.target !== this.config.localPeerId) {\n return; // Not for us\n }\n\n // Check channel match\n if (this.config.channel && envelope.channel !== this.config.channel) {\n return; // Wrong channel\n }\n\n this.receiveHandler(envelope.payload);\n };\n\n relay.on('message', this.peerHandler);\n\n // Track peers\n this.peerJoinHandler = (peerId: string) => {\n this.peers.add(peerId);\n this.onPeerJoin?.(peerId);\n };\n\n this.peerLeaveHandler = (peerId: string) => {\n this.peers.delete(peerId);\n this.onPeerLeave?.(peerId);\n };\n\n relay.on('peerJoined', this.peerJoinHandler);\n relay.on('peerLeft', this.peerLeaveHandler);\n }\n\n // ─── FlowTransport interface ───────────────────────────────────────\n\n send(data: Uint8Array): void {\n if (this.closed) return;\n\n const envelope = encodeEnvelope(\n data,\n this.config.targetPeerId,\n this.config.channel\n );\n\n this.relay.broadcast(envelope);\n }\n\n onReceive(handler: (data: Uint8Array) => void): void {\n this.receiveHandler = handler;\n }\n\n close(): void {\n if (this.closed) return;\n this.closed = true;\n\n if (this.peerHandler) {\n this.relay.off('message', this.peerHandler);\n }\n if (this.peerJoinHandler) {\n this.relay.off('peerJoined', this.peerJoinHandler);\n }\n if (this.peerLeaveHandler) {\n this.relay.off('peerLeft', this.peerLeaveHandler);\n }\n\n this.receiveHandler = null;\n this.onPeerJoin = null;\n this.onPeerLeave = null;\n }\n\n // ─── Peer awareness ───────────────────────────────────────────────\n\n /** Get all known peers in the room */\n getPeers(): string[] {\n return Array.from(this.peers);\n }\n\n /** Number of peers in the room */\n get peerCount(): number {\n return this.peers.size;\n }\n\n /** Whether the transport is still open */\n get isOpen(): boolean {\n return !this.closed;\n }\n\n /** Send to a specific peer (overrides config.targetPeerId for this call) */\n sendTo(peerId: string, data: Uint8Array): void {\n if (this.closed) return;\n\n const envelope = encodeEnvelope(data, peerId, this.config.channel);\n this.relay.broadcast(envelope);\n }\n}\n\n// ═══════════════════════════════════════════════════════════════════════════════\n// Factory: Create Flow over DashRelay room\n// ═══════════════════════════════════════════════════════════════════════════════\n\n/**\n * Create a FlowTransport connected to a DashRelay room.\n *\n * This is the standard way to establish Aeon flow protocol\n * over the relay mesh. Use channels to multiplex different\n * flow protocols within the same room.\n *\n * @param relay - Connected DashRelay client instance\n * @param channel - Optional channel tag for multiplexing\n * @param config - Optional transport configuration\n */\nexport function createDashRelayFlow(\n relay: DashRelayLike,\n channel?: string,\n config?: Omit<DashRelayFlowConfig, 'channel'>\n): DashRelayFlowTransport {\n return new DashRelayFlowTransport(relay, { ...config, channel });\n}\n","/**\n * Bluetooth Flow Transport\n *\n * FlowTransport adapter for Web Bluetooth API.\n * Enables flow protocol over BLE between nearby devices —\n * the mesh networking primitive for federated inference.\n *\n * Two devices running aeon-flux can fork/race inference across\n * both browsers via Bluetooth, zero cloud cost.\n *\n * Uses GATT characteristics for binary frame exchange:\n * - TX characteristic: this device writes flow frames\n * - RX characteristic: this device reads flow frames\n *\n * MTU-aware: fragments large FlowFrames across multiple BLE writes.\n */\n\nimport type { FlowTransport } from '../flow/types';\n\n// ═══════════════════════════════════════════════════════════════════════════════\n// Web Bluetooth API type declarations\n// These are not included in standard lib.dom.d.ts — declared here to avoid\n// adding a devDependency on @types/web-bluetooth.\n// ═══════════════════════════════════════════════════════════════════════════════\n\ndeclare global {\n interface BluetoothLEScanFilter {\n services?: BluetoothServiceUUID[];\n name?: string;\n namePrefix?: string;\n }\n\n type BluetoothServiceUUID = string | number;\n\n interface BluetoothDevice extends EventTarget {\n readonly id: string;\n readonly name?: string;\n readonly gatt?: BluetoothRemoteGATTServer;\n }\n\n interface BluetoothRemoteGATTServer {\n readonly connected: boolean;\n readonly device: BluetoothDevice;\n connect(): Promise<BluetoothRemoteGATTServer>;\n disconnect(): void;\n getPrimaryService(service: BluetoothServiceUUID): Promise<BluetoothRemoteGATTService>;\n }\n\n interface BluetoothRemoteGATTService {\n readonly device: BluetoothDevice;\n readonly uuid: string;\n getCharacteristic(characteristic: string): Promise<BluetoothRemoteGATTCharacteristic>;\n }\n\n interface BluetoothRemoteGATTCharacteristic extends EventTarget {\n readonly service: BluetoothRemoteGATTService;\n readonly uuid: string;\n readonly value: DataView | null;\n writeValueWithoutResponse(value: BufferSource): Promise<void>;\n startNotifications(): Promise<BluetoothRemoteGATTCharacteristic>;\n stopNotifications(): Promise<BluetoothRemoteGATTCharacteristic>;\n }\n\n interface RequestDeviceOptions {\n filters?: BluetoothLEScanFilter[];\n optionalServices?: BluetoothServiceUUID[];\n acceptAllDevices?: boolean;\n }\n\n interface Bluetooth {\n requestDevice(options: RequestDeviceOptions): Promise<BluetoothDevice>;\n }\n\n interface Navigator {\n bluetooth: Bluetooth;\n }\n}\n\n// ═══════════════════════════════════════════════════════════════════════════════\n// Constants\n// ═══════════════════════════════════════════════════════════════════════════════\n\n/** Aeon Flow BLE Service UUID */\nexport const AEON_FLOW_SERVICE_UUID = '0000af10-0000-1000-8000-00805f9b34fb';\n/** TX Characteristic — write flow frames */\nexport const AEON_FLOW_TX_UUID = '0000af11-0000-1000-8000-00805f9b34fb';\n/** RX Characteristic — receive flow frames (notify) */\nexport const AEON_FLOW_RX_UUID = '0000af12-0000-1000-8000-00805f9b34fb';\n\n/** Default BLE MTU minus ATT overhead */\nconst DEFAULT_MTU = 512 - 3;\n\n/** Frame boundary marker (4 bytes) to reassemble fragmented frames */\nconst FRAME_BOUNDARY = new Uint8Array([0xAE, 0x0F, 0x10, 0xFF]);\n\n// ═══════════════════════════════════════════════════════════════════════════════\n// Types\n// ═══════════════════════════════════════════════════════════════════════════════\n\nexport interface BluetoothFlowConfig {\n /** BLE MTU (default: 509, negotiated at connection time) */\n mtu?: number;\n /** Service UUID override */\n serviceUuid?: string;\n /** Optional name filter for device discovery */\n namePrefix?: string;\n}\n\n// ═══════════════════════════════════════════════════════════════════════════════\n// Bluetooth FlowTransport\n// ═══════════════════════════════════════════════════════════════════════════════\n\n/**\n * FlowTransport over Web Bluetooth GATT.\n *\n * Fragments flow frames to fit within BLE MTU, reassembles on receive.\n * Uses notifications on RX characteristic for incoming frames.\n */\nexport class BluetoothFlowTransport implements FlowTransport {\n private device: BluetoothDevice | null = null;\n private txChar: BluetoothRemoteGATTCharacteristic | null = null;\n private rxChar: BluetoothRemoteGATTCharacteristic | null = null;\n private receiveHandler: ((data: Uint8Array) => void) | null = null;\n private mtu: number;\n private closed = false;\n\n /** Reassembly buffer for fragmented incoming frames */\n private rxBuffer: Uint8Array[] = [];\n\n constructor(private config: BluetoothFlowConfig = {}) {\n this.mtu = config.mtu ?? DEFAULT_MTU;\n }\n\n /**\n * Scan for and connect to a nearby Aeon device.\n * Returns the connected device name.\n */\n async connect(): Promise<string> {\n const serviceUuid = this.config.serviceUuid ?? AEON_FLOW_SERVICE_UUID;\n\n const filters: BluetoothLEScanFilter[] = [];\n if (this.config.namePrefix) {\n filters.push({ namePrefix: this.config.namePrefix });\n }\n filters.push({ services: [serviceUuid] });\n\n this.device = await navigator.bluetooth.requestDevice({\n filters,\n optionalServices: [serviceUuid],\n });\n\n if (!this.device.gatt) {\n throw new Error('GATT not available on device');\n }\n\n const server = await this.device.gatt.connect();\n const service = await server.getPrimaryService(serviceUuid);\n\n this.txChar = await service.getCharacteristic(\n this.config.serviceUuid ? AEON_FLOW_TX_UUID : AEON_FLOW_TX_UUID\n );\n this.rxChar = await service.getCharacteristic(AEON_FLOW_RX_UUID);\n\n // Start notifications on RX\n await this.rxChar.startNotifications();\n this.rxChar.addEventListener(\n 'characteristicvaluechanged',\n this.handleRxNotification\n );\n\n // Handle disconnection\n this.device.addEventListener('gattserverdisconnected', () => {\n this.closed = true;\n this.receiveHandler = null;\n });\n\n return this.device.name || this.device.id;\n }\n\n /**\n * Create from an already-connected GATT server (for peripheral/server mode).\n */\n static fromCharacteristics(\n tx: BluetoothRemoteGATTCharacteristic,\n rx: BluetoothRemoteGATTCharacteristic,\n config?: BluetoothFlowConfig\n ): BluetoothFlowTransport {\n const transport = new BluetoothFlowTransport(config);\n transport.txChar = tx;\n transport.rxChar = rx;\n\n rx.addEventListener(\n 'characteristicvaluechanged',\n transport.handleRxNotification\n );\n\n return transport;\n }\n\n // ─── FlowTransport interface ───────────────────────────────────────\n\n send(data: Uint8Array): void {\n if (this.closed || !this.txChar) return;\n\n // Fragment if data exceeds MTU\n const fragmentSize = this.mtu - FRAME_BOUNDARY.length;\n\n if (data.byteLength <= fragmentSize) {\n // Fits in one write — send with boundary marker\n const packet = new Uint8Array(data.byteLength + FRAME_BOUNDARY.length);\n packet.set(data);\n packet.set(FRAME_BOUNDARY, data.byteLength);\n this.writeCharacteristic(packet);\n } else {\n // Fragment across multiple writes\n let offset = 0;\n while (offset < data.byteLength) {\n const chunkSize = Math.min(fragmentSize, data.byteLength - offset);\n const isLast = offset + chunkSize >= data.byteLength;\n const chunk = data.subarray(offset, offset + chunkSize);\n\n if (isLast) {\n // Last fragment gets boundary marker\n const packet = new Uint8Array(chunk.byteLength + FRAME_BOUNDARY.length);\n packet.set(chunk);\n packet.set(FRAME_BOUNDARY, chunk.byteLength);\n this.writeCharacteristic(packet);\n } else {\n // Intermediate fragment — no boundary\n this.writeCharacteristic(chunk);\n }\n\n offset += chunkSize;\n }\n }\n }\n\n onReceive(handler: (data: Uint8Array) => void): void {\n this.receiveHandler = handler;\n }\n\n close(): void {\n if (this.closed) return;\n this.closed = true;\n\n if (this.rxChar) {\n this.rxChar.removeEventListener(\n 'characteristicvaluechanged',\n this.handleRxNotification\n );\n this.rxChar.stopNotifications().catch(() => {});\n }\n\n if (this.device?.gatt?.connected) {\n this.device.gatt.disconnect();\n }\n\n this.receiveHandler = null;\n this.rxBuffer = [];\n }\n\n /** Whether Bluetooth is connected */\n get isConnected(): boolean {\n return !this.closed && !!this.device?.gatt?.connected;\n }\n\n // ─── Internal ──────────────────────────────────────────────────────\n\n private async writeCharacteristic(data: Uint8Array): Promise<void> {\n if (!this.txChar) return;\n\n try {\n await this.txChar.writeValueWithoutResponse(data);\n } catch {\n // Write failed — BLE disconnected or busy\n }\n }\n\n private handleRxNotification = (event: Event): void => {\n const target = event.target as BluetoothRemoteGATTCharacteristic;\n if (!target.value) return;\n\n const chunk = new Uint8Array(target.value.buffer);\n\n // Check if chunk ends with frame boundary\n if (this.endsWithBoundary(chunk)) {\n // Complete frame (or last fragment)\n const frameData = chunk.subarray(0, chunk.byteLength - FRAME_BOUNDARY.length);\n\n if (this.rxBuffer.length > 0) {\n // Reassemble fragments\n this.rxBuffer.push(frameData);\n const totalLen = this.rxBuffer.reduce((s, b) => s + b.byteLength, 0);\n const assembled = new Uint8Array(totalLen);\n let offset = 0;\n for (const buf of this.rxBuffer) {\n assembled.set(buf, offset);\n offset += buf.byteLength;\n }\n this.rxBuffer = [];\n this.receiveHandler?.(assembled);\n } else {\n // Single-packet frame\n this.receiveHandler?.(frameData);\n }\n } else {\n // Intermediate fragment — buffer it\n this.rxBuffer.push(chunk);\n }\n };\n\n private endsWithBoundary(data: Uint8Array): boolean {\n if (data.byteLength < FRAME_BOUNDARY.length) return false;\n const tail = data.subarray(data.byteLength - FRAME_BOUNDARY.length);\n return (\n tail[0] === FRAME_BOUNDARY[0] &&\n tail[1] === FRAME_BOUNDARY[1] &&\n tail[2] === FRAME_BOUNDARY[2] &&\n tail[3] === FRAME_BOUNDARY[3]\n );\n }\n}\n","/**\n * WebRTC Flow Transport\n *\n * FlowTransport adapter for WebRTC DataChannel.\n * Enables flow protocol between browsers via DashRelay signaling —\n * the foundation for federated browser inference.\n *\n * Two devices open a DataChannel via DashRelay as the signaling layer,\n * then speak flow protocol directly peer-to-peer. The fork/race/fold\n * primitives work across the mesh — inference forked to N peers,\n * fastest result wins.\n *\n * Binary-mode DataChannel: no base64, no JSON wrapping.\n */\n\nimport type { FlowTransport } from '../flow/types';\n\n// ═══════════════════════════════════════════════════════════════════════════════\n// Types\n// ═══════════════════════════════════════════════════════════════════════════════\n\nexport interface WebRTCFlowConfig {\n /** DashRelay signaling URL (default: wss://relay.dashrelay.com) */\n signalingUrl?: string;\n /** Room ID for peer discovery */\n roomId: string;\n /** This peer's ID */\n peerId?: string;\n /** ICE servers (default: Google STUN) */\n iceServers?: RTCIceServer[];\n /** DataChannel label */\n channelLabel?: string;\n /** Max buffered amount before backpressure (default: 16MB) */\n maxBufferedAmount?: number;\n}\n\nexport interface SignalingMessage {\n type: 'offer' | 'answer' | 'ice-candidate';\n from: string;\n to: string;\n payload: RTCSessionDescriptionInit | RTCIceCandidateInit;\n}\n\n// ═══════════════════════════════════════════════════════════════════════════════\n// WebRTC FlowTransport\n// ═══════════════════════════════════════════════════════════════════════════════\n\n/**\n * FlowTransport over WebRTC DataChannel.\n *\n * Uses DashRelay WebSocket for signaling (offer/answer/ICE exchange),\n * then establishes a direct peer-to-peer DataChannel for binary\n * flow frame exchange.\n */\nexport class WebRTCFlowTransport implements FlowTransport {\n private pc: RTCPeerConnection | null = null;\n private dc: RTCDataChannel | null = null;\n private signalingWs: WebSocket | null = null;\n private receiveHandler: ((data: Uint8Array) => void) | null = null;\n private closed = false;\n private peerId: string;\n private config: WebRTCFlowConfig;\n private maxBufferedAmount: number;\n\n constructor(config: WebRTCFlowConfig) {\n this.config = config;\n this.peerId = config.peerId ?? crypto.randomUUID();\n this.maxBufferedAmount = config.maxBufferedAmount ?? 16 * 1024 * 1024;\n }\n\n /**\n * Initialize as the offering peer (initiator).\n * Connects to signaling, creates offer, waits for answer.\n */\n async offer(): Promise<void> {\n await this.connectSignaling();\n\n this.pc = new RTCPeerConnection({\n iceServers: this.config.iceServers ?? [\n { urls: 'stun:stun.l.google.com:19302' },\n ],\n });\n\n // Create DataChannel\n const label = this.config.channelLabel ?? 'aeon-flow';\n this.dc = this.pc.createDataChannel(label, {\n ordered: true,\n protocol: 'aeon-flow',\n });\n this.dc.binaryType = 'arraybuffer';\n this.wireDataChannel(this.dc);\n\n // ICE candidates\n this.pc.onicecandidate = (event) => {\n if (event.candidate) {\n this.sendSignaling({\n type: 'ice-candidate',\n from: this.peerId,\n to: '*',\n payload: event.candidate.toJSON(),\n });\n }\n };\n\n // Create and send offer\n const offer = await this.pc.createOffer();\n await this.pc.setLocalDescription(offer);\n\n this.sendSignaling({\n type: 'offer',\n from: this.peerId,\n to: '*',\n payload: offer,\n });\n }\n\n /**\n * Initialize as the answering peer (responder).\n * Waits for an offer, creates answer.\n */\n async answer(): Promise<void> {\n await this.connectSignaling();\n\n this.pc = new RTCPeerConnection({\n iceServers: this.config.iceServers ?? [\n { urls: 'stun:stun.l.google.com:19302' },\n ],\n });\n\n // ICE candidates\n this.pc.onicecandidate = (event) => {\n if (event.candidate) {\n this.sendSignaling({\n type: 'ice-candidate',\n from: this.peerId,\n to: '*',\n payload: event.candidate.toJSON(),\n });\n }\n };\n\n // Wait for incoming DataChannel\n this.pc.ondatachannel = (event) => {\n this.dc = event.channel;\n this.dc.binaryType = 'arraybuffer';\n this.wireDataChannel(this.dc);\n };\n\n // Wait for offer via signaling\n // (handled in signaling message handler)\n }\n\n /**\n * Wait until the DataChannel is open and ready.\n */\n async waitForOpen(): Promise<void> {\n if (this.dc?.readyState === 'open') return;\n\n return new Promise<void>((resolve, reject) => {\n const timeout = setTimeout(() => {\n reject(new Error('WebRTC DataChannel open timeout'));\n }, 30_000);\n\n const check = () => {\n if (this.dc?.readyState === 'open') {\n clearTimeout(timeout);\n resolve();\n }\n };\n\n // Poll — DataChannel events may have already fired\n const interval = setInterval(check, 100);\n check();\n\n // Also listen for the open event\n if (this.dc) {\n const onOpen = () => {\n clearTimeout(timeout);\n clearInterval(interval);\n resolve();\n };\n this.dc.addEventListener('open', onOpen, { once: true });\n }\n });\n }\n\n // ─── FlowTransport interface ───────────────────────────────────────\n\n send(data: Uint8Array): void {\n if (this.closed || !this.dc) return;\n\n if (this.dc.readyState !== 'open') return;\n\n // Backpressure: check buffered amount\n if (this.dc.bufferedAmount > this.maxBufferedAmount) {\n console.warn('[aeon-webrtc] DataChannel buffer full, dropping frame');\n return;\n }\n\n this.dc.send(data);\n }\n\n onReceive(handler: (data: Uint8Array) => void): void {\n this.receiveHandler = handler;\n }\n\n close(): void {\n if (this.closed) return;\n this.closed = true;\n\n this.dc?.close();\n this.pc?.close();\n this.signalingWs?.close();\n\n this.receiveHandler = null;\n this.dc = null;\n this.pc = null;\n this.signalingWs = null;\n }\n\n /** Whether the DataChannel is open */\n get isOpen(): boolean {\n return !this.closed && this.dc?.readyState === 'open';\n }\n\n /** Get this peer's ID */\n get id(): string {\n return this.peerId;\n }\n\n // ─── Internal ──────────────────────────────────────────────────────\n\n private wireDataChannel(dc: RTCDataChannel): void {\n dc.onmessage = (event) => {\n if (!this.receiveHandler) return;\n\n if (event.data instanceof ArrayBuffer) {\n this.receiveHandler(new Uint8Array(event.data));\n }\n };\n\n dc.onclose = () => {\n this.closed = true;\n this.receiveHandler = null;\n };\n\n dc.onerror = () => {\n // Errors are followed by close\n };\n }\n\n private async connectSignaling(): Promise<void> {\n const url =\n this.config.signalingUrl ?? 'wss://relay.dashrelay.com/relay/sync';\n const roomUrl = `${url}?room=${encodeURIComponent(this.config.roomId)}&peer=${encodeURIComponent(this.peerId)}`;\n\n this.signalingWs = new WebSocket(roomUrl);\n\n await new Promise<void>((resolve, reject) => {\n const ws = this.signalingWs!;\n ws.onopen = () => resolve();\n ws.onerror = () => reject(new Error('Signaling connection failed'));\n });\n\n this.signalingWs.onmessage = async (event) => {\n try {\n const msg: SignalingMessage = JSON.parse(event.data);\n\n // Ignore own messages\n if (msg.from === this.peerId) return;\n\n switch (msg.type) {\n case 'offer': {\n if (!this.pc) return;\n const desc = msg.payload as RTCSessionDescriptionInit;\n await this.pc.setRemoteDescription(desc);\n const answer = await this.pc.createAnswer();\n await this.pc.setLocalDescription(answer);\n this.sendSignaling({\n type: 'answer',\n from: this.peerId,\n to: msg.from,\n payload: answer,\n });\n break;\n }\n\n case 'answer': {\n if (!this.pc) return;\n const desc = msg.payload as RTCSessionDescriptionInit;\n await this.pc.setRemoteDescription(desc);\n break;\n }\n\n case 'ice-candidate': {\n if (!this.pc) return;\n const candidate = msg.payload as RTCIceCandidateInit;\n await this.pc.addIceCandidate(candidate);\n break;\n }\n }\n } catch {\n // Ignore malformed signaling messages\n }\n };\n }\n\n private sendSignaling(msg: SignalingMessage): void {\n if (this.signalingWs?.readyState === WebSocket.OPEN) {\n this.signalingWs.send(JSON.stringify(msg));\n }\n }\n}\n\n// ═══════════════════════════════════════════════════════════════════════════════\n// Factory: Create a peer-to-peer flow connection via DashRelay\n// ═══════════════════════════════════════════════════════════════════════════════\n\n/**\n * Create a flow protocol connection between two peers via WebRTC.\n *\n * Uses DashRelay for signaling, then establishes a direct P2P\n * DataChannel for binary flow frame exchange.\n *\n * @param roomId - Shared room ID for peer discovery\n * @param role - 'initiator' creates the offer, 'responder' waits\n */\nexport async function createP2PFlow(\n roomId: string,\n role: 'initiator' | 'responder',\n config?: Partial<WebRTCFlowConfig>\n): Promise<WebRTCFlowTransport> {\n const transport = new WebRTCFlowTransport({ roomId, ...config });\n\n if (role === 'initiator') {\n await transport.offer();\n } else {\n await transport.answer();\n }\n\n await transport.waitForOpen();\n return transport;\n}\n","/**\n * TCP Flow Transport\n *\n * FlowTransport adapter for Node/Bun TCP sockets.\n * Enables flow protocol between server processes —\n * coordinator ↔ layer nodes, forge ↔ deploy targets.\n *\n * Uses length-prefixed framing over raw TCP to delineate\n * flow frame boundaries. Each message is:\n * [u32 length][payload bytes]\n *\n * This is the backbone transport for server-to-server\n * Aeon protocol communication.\n */\n\nimport type { FlowTransport } from '../flow/types';\n\n// ═══════════════════════════════════════════════════════════════════════════════\n// Types\n// ═══════════════════════════════════════════════════════════════════════════════\n\nexport interface TCPFlowConfig {\n /** Host to connect to (client) or bind to (server) */\n host?: string;\n /** Port number */\n port: number;\n /** Connection timeout in ms (default: 10000) */\n connectTimeout?: number;\n /** Keep-alive interval in ms (default: 30000) */\n keepAliveMs?: number;\n}\n\n/** Minimal TCP socket interface — works with Node net.Socket and Bun */\ninterface TCPSocket {\n write(data: Uint8Array): boolean;\n on(event: 'data', handler: (data: Buffer | Uint8Array) => void): void;\n on(event: 'close', handler: () => void): void;\n on(event: 'error', handler: (err: Error) => void): void;\n end(): void;\n destroy(): void;\n setKeepAlive?(enable: boolean, initialDelay?: number): void;\n setNoDelay?(noDelay?: boolean): void;\n}\n\n// ═══════════════════════════════════════════════════════════════════════════════\n// Length-Prefixed Framing\n// ═══════════════════════════════════════════════════════════════════════════════\n\n/** 4 bytes for u32 length prefix */\nconst LENGTH_PREFIX_SIZE = 4;\n\n/**\n * Encode a message with a u32 length prefix.\n */\nfunction encodeFrame(data: Uint8Array): Uint8Array {\n const frame = new Uint8Array(LENGTH_PREFIX_SIZE + data.byteLength);\n const view = new DataView(frame.buffer);\n view.setUint32(0, data.byteLength, false); // big-endian\n frame.set(data, LENGTH_PREFIX_SIZE);\n return frame;\n}\n\n// ═══════════════════════════════════════════════════════════════════════════════\n// TCP FlowTransport\n// ═══════════════════════════════════════════════════════════════════════════════\n\n/**\n * FlowTransport over TCP with length-prefixed framing.\n *\n * Handles message boundary detection (TCP is a stream, not message-oriented).\n * Uses a u32 length prefix so the receiver knows exactly how many bytes\n * to read for each flow frame.\n */\nexport class TCPFlowTransport implements FlowTransport {\n private socket: TCPSocket;\n private receiveHandler: ((data: Uint8Array) => void) | null = null;\n private closed = false;\n\n /** Reassembly buffer for TCP stream → discrete messages */\n private rxBuffer: Uint8Array = new Uint8Array(0);\n\n constructor(socket: TCPSocket, config?: Partial<TCPFlowConfig>) {\n this.socket = socket;\n\n // TCP optimizations\n socket.setNoDelay?.(true); // Disable Nagle for low-latency\n socket.setKeepAlive?.(true, config?.keepAliveMs ?? 30_000);\n\n // Wire up receive\n socket.on('data', (chunk: Buffer | Uint8Array) => {\n this.onData(new Uint8Array(chunk));\n });\n\n socket.on('close', () => {\n this.closed = true;\n this.receiveHandler = null;\n });\n\n socket.on('error', () => {\n // Errors are followed by close\n });\n }\n\n // ─── FlowTransport interface ───────────────────────────────────────\n\n send(data: Uint8Array): void {\n if (this.closed) return;\n const frame = encodeFrame(data);\n this.socket.write(frame);\n }\n\n onReceive(handler: (data: Uint8Array) => void): void {\n this.receiveHandler = handler;\n }\n\n close(): void {\n if (this.closed) return;\n this.closed = true;\n this.receiveHandler = null;\n this.socket.end();\n }\n\n /** Whether the transport is still open */\n get isOpen(): boolean {\n return !this.closed;\n }\n\n // ─── Internal: Stream Reassembly ──────────────────────────────────\n\n private onData(chunk: Uint8Array): void {\n // Append to reassembly buffer\n const combined = new Uint8Array(this.rxBuffer.byteLength + chunk.byteLength);\n combined.set(this.rxBuffer);\n combined.set(chunk, this.rxBuffer.byteLength);\n this.rxBuffer = combined;\n\n // Extract complete messages\n while (this.rxBuffer.byteLength >= LENGTH_PREFIX_SIZE) {\n const view = new DataView(\n this.rxBuffer.buffer,\n this.rxBuffer.byteOffset,\n this.rxBuffer.byteLength\n );\n const msgLen = view.getUint32(0, false); // big-endian\n\n if (this.rxBuffer.byteLength < LENGTH_PREFIX_SIZE + msgLen) {\n break; // Incomplete message — wait for more data\n }\n\n // Extract the complete message\n const message = this.rxBuffer.slice(\n LENGTH_PREFIX_SIZE,\n LENGTH_PREFIX_SIZE + msgLen\n );\n\n // Advance the buffer\n this.rxBuffer = this.rxBuffer.slice(LENGTH_PREFIX_SIZE + msgLen);\n\n // Deliver\n this.receiveHandler?.(message);\n }\n }\n}\n\n// ═══════════════════════════════════════════════════════════════════════════════\n// Factory: Create TCP FlowTransport from connection params\n// ═══════════════════════════════════════════════════════════════════════════════\n\n/**\n * Create a TCP FlowTransport by connecting to a remote host.\n *\n * Uses dynamic import of 'net' so this module is tree-shakeable\n * in browser builds.\n *\n * @param host - Remote host\n * @param port - Remote port\n * @param config - Optional TCP configuration\n */\nexport async function connectTCPFlow(\n host: string,\n port: number,\n config?: Partial<TCPFlowConfig>\n): Promise<TCPFlowTransport> {\n const net = await import('net');\n const timeout = config?.connectTimeout ?? 10_000;\n\n return new Promise<TCPFlowTransport>((resolve, reject) => {\n const socket = net.createConnection({ host, port }, () => {\n resolve(new TCPFlowTransport(socket, config));\n });\n\n socket.setTimeout(timeout);\n socket.on('timeout', () => {\n socket.destroy();\n reject(new Error(`TCP connection timeout to ${host}:${port}`));\n });\n\n socket.on('error', (err) => {\n reject(new Error(`TCP connection failed to ${host}:${port}: ${err.message}`));\n });\n });\n}\n\n/**\n * Create a TCP flow server that accepts incoming connections.\n *\n * Each accepted connection becomes a FlowTransport.\n *\n * @param port - Port to listen on\n * @param host - Host to bind to (default: '0.0.0.0')\n * @param onConnection - Called for each new flow transport connection\n */\nexport async function listenTCPFlow(\n port: number,\n host: string,\n onConnection: (transport: TCPFlowTransport) => void\n): Promise<{ close: () => void }> {\n const net = await import('net');\n\n const server = net.createServer((socket) => {\n const transport = new TCPFlowTransport(socket);\n onConnection(transport);\n });\n\n return new Promise((resolve, reject) => {\n server.listen(port, host, () => {\n resolve({\n close: () => server.close(),\n });\n });\n\n server.on('error', (err) => {\n reject(new Error(`TCP flow server failed on ${host}:${port}: ${err.message}`));\n });\n });\n}\n","/**\n * IPC Flow Transport\n *\n * FlowTransport adapter for inter-process communication:\n * - MessagePort (Web Workers, SharedWorker, BroadcastChannel)\n * - MessageChannel (Node/Bun worker_threads)\n * - child_process IPC (Node fork)\n *\n * Enables flow protocol between:\n * - Main thread ↔ inference Web Worker (browser)\n * - Shell process ↔ forge daemon (local)\n * - Any two processes on the same machine\n *\n * Zero-copy when possible — transfers ArrayBuffers via\n * structured clone's transfer list.\n */\n\nimport type { FlowTransport } from '../flow/types';\n\n// ═══════════════════════════════════════════════════════════════════════════════\n// Types\n// ═══════════════════════════════════════════════════════════════════════════════\n\n/**\n * Minimal MessagePort-like interface.\n * Covers Web Workers, worker_threads, BroadcastChannel.\n */\nexport interface MessagePortLike {\n postMessage(data: unknown, transfer?: Transferable[]): void;\n addEventListener?(type: 'message', handler: (event: MessageEvent) => void): void;\n removeEventListener?(type: 'message', handler: (event: MessageEvent) => void): void;\n onmessage?: ((event: MessageEvent) => void) | null;\n close?(): void;\n start?(): void;\n}\n\n/**\n * Minimal child_process-like interface for IPC.\n * Covers Node child_process.fork() results.\n */\nexport interface ChildProcessLike {\n send(data: unknown): boolean;\n on(event: 'message', handler: (data: unknown) => void): void;\n on(event: 'exit', handler: (code: number | null) => void): void;\n removeListener?(event: string, handler: (...args: unknown[]) => void): void;\n kill?(): void;\n}\n\nexport interface IPCFlowConfig {\n /** Whether to transfer ArrayBuffers (zero-copy but invalidates sender's ref) */\n transferBuffers?: boolean;\n}\n\n// ═══════════════════════════════════════════════════════════════════════════════\n// MessagePort FlowTransport\n// ═══════════════════════════════════════════════════════════════════════════════\n\n/**\n * FlowTransport over MessagePort (Web Workers, worker_threads, BroadcastChannel).\n *\n * Uses structured clone for binary transfer. When `transferBuffers` is true,\n * the ArrayBuffer backing the Uint8Array is transferred (zero-copy) rather\n * than cloned. This is faster but invalidates the sender's reference.\n */\nexport class MessagePortFlowTransport implements FlowTransport {\n private port: MessagePortLike;\n private receiveHandler: ((data: Uint8Array) => void) | null = null;\n private closed = false;\n private transferBuffers: boolean;\n private messageHandler: ((event: MessageEvent) => void) | null = null;\n\n constructor(port: MessagePortLike, config?: IPCFlowConfig) {\n this.port = port;\n this.transferBuffers = config?.transferBuffers ?? false;\n\n // Start the port if needed (Web MessagePort requires start())\n port.start?.();\n\n // Wire up receive\n this.messageHandler = (event: MessageEvent) => {\n if (!this.receiveHandler) return;\n\n const data = event.data;\n if (data instanceof ArrayBuffer) {\n this.receiveHandler(new Uint8Array(data));\n } else if (data instanceof Uint8Array) {\n this.receiveHandler(data);\n } else if (data?.type === 'aeon-flow' && data.buffer instanceof ArrayBuffer) {\n this.receiveHandler(new Uint8Array(data.buffer));\n }\n };\n\n if (port.addEventListener) {\n port.addEventListener('message', this.messageHandler);\n } else {\n port.onmessage = this.messageHandler;\n }\n }\n\n // ─── FlowTransport interface ───────────────────────────────────────\n\n send(data: Uint8Array): void {\n if (this.closed) return;\n\n if (this.transferBuffers) {\n // Zero-copy transfer — sender loses access to the buffer\n const copy = new Uint8Array(data); // copy first since we transfer\n this.port.postMessage(copy.buffer, [copy.buffer]);\n } else {\n // Structured clone — data is copied, sender retains access\n this.port.postMessage({ type: 'aeon-flow', buffer: data.buffer.slice(0) });\n }\n }\n\n onReceive(handler: (data: Uint8Array) => void): void {\n this.receiveHandler = handler;\n }\n\n close(): void {\n if (this.closed) return;\n this.closed = true;\n\n if (this.messageHandler) {\n if (this.port.removeEventListener) {\n this.port.removeEventListener('message', this.messageHandler);\n } else {\n this.port.onmessage = null;\n }\n }\n\n this.receiveHandler = null;\n this.port.close?.();\n }\n\n /** Whether the transport is still open */\n get isOpen(): boolean {\n return !this.closed;\n }\n}\n\n// ═══════════════════════════════════════════════════════════════════════════════\n// ChildProcess FlowTransport\n// ═══════════════════════════════════════════════════════════════════════════════\n\n/**\n * FlowTransport over Node child_process IPC.\n *\n * Uses process.send()/process.on('message') for fork()-based IPC.\n * Messages are serialized via V8's structured clone, so Uint8Array\n * arrives as a Buffer on the other side.\n */\nexport class ChildProcessFlowTransport implements FlowTransport {\n private process: ChildProcessLike;\n private receiveHandler: ((data: Uint8Array) => void) | null = null;\n private closed = false;\n private ipcHandler: ((data: unknown) => void) | null = null;\n\n constructor(childProcess: ChildProcessLike) {\n this.process = childProcess;\n\n this.ipcHandler = (data: unknown) => {\n if (!this.receiveHandler) return;\n\n if (data instanceof Uint8Array || Buffer.isBuffer(data)) {\n this.receiveHandler(new Uint8Array(data));\n } else if (\n typeof data === 'object' &&\n data !== null &&\n (data as { type?: string }).type === 'aeon-flow'\n ) {\n const buffer = (data as { buffer?: unknown }).buffer;\n if (buffer instanceof ArrayBuffer) {\n this.receiveHandler(new Uint8Array(buffer));\n } else if (\n typeof buffer === 'object' &&\n buffer !== null &&\n 'data' in (buffer as Record<string, unknown>)\n ) {\n // V8 serialization turns Uint8Array into { type: 'Buffer', data: [...] }\n const arr = (buffer as { data: number[] }).data;\n this.receiveHandler(new Uint8Array(arr));\n }\n }\n };\n\n childProcess.on('message', this.ipcHandler);\n\n childProcess.on('exit', () => {\n this.closed = true;\n this.receiveHandler = null;\n });\n }\n\n // ─── FlowTransport interface ───────────────────────────────────────\n\n send(data: Uint8Array): void {\n if (this.closed) return;\n\n // Wrap in an envelope so receiver can identify aeon-flow messages\n // among other IPC traffic\n this.process.send({\n type: 'aeon-flow',\n buffer: Array.from(data), // Serialize as plain array for V8 IPC\n });\n }\n\n onReceive(handler: (data: Uint8Array) => void): void {\n this.receiveHandler = handler;\n }\n\n close(): void {\n if (this.closed) return;\n this.closed = true;\n\n if (this.ipcHandler && this.process.removeListener) {\n this.process.removeListener('message', this.ipcHandler);\n }\n\n this.receiveHandler = null;\n }\n\n /** Whether the transport is still open */\n get isOpen(): boolean {\n return !this.closed;\n }\n}\n\n// ═══════════════════════════════════════════════════════════════════════════════\n// Factory: Create IPC pair (for testing or in-process use)\n// ═══════════════════════════════════════════════════════════════════════════════\n\n/**\n * Create a pair of linked MessagePort FlowTransports.\n *\n * Uses MessageChannel to create a bidirectional pair —\n * data sent on one arrives on the other.\n *\n * Works in browsers, Bun, and Node (with worker_threads).\n */\nexport function createIPCPair(\n config?: IPCFlowConfig\n): [MessagePortFlowTransport, MessagePortFlowTransport] {\n const channel = new MessageChannel();\n return [\n new MessagePortFlowTransport(channel.port1, config),\n new MessagePortFlowTransport(channel.port2, config),\n ];\n}\n","/**\n * USB Flow Transport\n *\n * FlowTransport adapter for WebUSB API.\n * Enables flow protocol between browser and USB devices —\n * the communication channel for Rabbit R1 and other\n * hardware endpoints.\n *\n * Uses bulk transfer endpoints for binary flow frame exchange.\n * Length-prefixed framing (u32) for message boundary detection\n * over the bulk pipe.\n *\n * The device must expose a vendor-specific interface with\n * IN and OUT bulk endpoints that speak Aeon flow frames.\n */\n\nimport type { FlowTransport } from '../flow/types';\n\n// ═══════════════════════════════════════════════════════════════════════════════\n// Constants\n// ═══════════════════════════════════════════════════════════════════════════════\n\n/** Aeon vendor-specific interface class */\nexport const AEON_USB_INTERFACE_CLASS = 0xFF; // Vendor-specific\n/** Aeon vendor-specific subclass */\nexport const AEON_USB_SUBCLASS = 0xAE;\n/** Aeon protocol ID within the interface */\nexport const AEON_USB_PROTOCOL = 0x01;\n\n/** Length prefix size for framing */\nconst LENGTH_PREFIX_SIZE = 4;\n\n/** Default USB transfer size (64KB) */\nconst DEFAULT_TRANSFER_SIZE = 64 * 1024;\n\n// ═══════════════════════════════════════════════════════════════════════════════\n// Types\n// ═══════════════════════════════════════════════════════════════════════════════\n\nexport interface USBFlowConfig {\n /** Interface number to claim (auto-detected if not specified) */\n interfaceNumber?: number;\n /** OUT endpoint number (auto-detected if not specified) */\n outEndpoint?: number;\n /** IN endpoint number (auto-detected if not specified) */\n inEndpoint?: number;\n /** Transfer size for bulk reads (default: 64KB) */\n transferSize?: number;\n /** USB vendor ID filter for device selection */\n vendorId?: number;\n /** USB product ID filter for device selection */\n productId?: number;\n}\n\n// ═══════════════════════════════════════════════════════════════════════════════\n// USB FlowTransport\n// ═══════════════════════════════════════════════════════════════════════════════\n\n/**\n * FlowTransport over WebUSB bulk endpoints.\n *\n * Uses length-prefixed framing over bulk transfers to delineate\n * flow frame boundaries. Continuously polls the IN endpoint\n * for incoming data.\n */\nexport class USBFlowTransport implements FlowTransport {\n private device: USBDevice;\n private receiveHandler: ((data: Uint8Array) => void) | null = null;\n private closed = false;\n private interfaceNum: number;\n private outEndpoint: number;\n private inEndpoint: number;\n private transferSize: number;\n private readLoopRunning = false;\n\n /** Reassembly buffer for length-prefixed framing */\n private rxBuffer: Uint8Array = new Uint8Array(0);\n\n private constructor(\n device: USBDevice,\n interfaceNum: number,\n outEndpoint: number,\n inEndpoint: number,\n transferSize: number\n ) {\n this.device = device;\n this.interfaceNum = interfaceNum;\n this.outEndpoint = outEndpoint;\n this.inEndpoint = inEndpoint;\n this.transferSize = transferSize;\n }\n\n /**\n * Connect to a USB device and create a FlowTransport.\n *\n * Requests device access, opens it, claims the Aeon interface,\n * and auto-detects bulk endpoints if not specified.\n */\n static async connect(config?: USBFlowConfig): Promise<USBFlowTransport> {\n const filters: USBDeviceFilter[] = [];\n\n if (config?.vendorId !== undefined) {\n const filter: USBDeviceFilter = { vendorId: config.vendorId };\n if (config.productId !== undefined) {\n filter.productId = config.productId;\n }\n filters.push(filter);\n }\n\n // Request device — triggers browser permission prompt\n const device = await navigator.usb.requestDevice({\n filters: filters.length > 0 ? filters : [{ classCode: AEON_USB_INTERFACE_CLASS }],\n });\n\n await device.open();\n\n // Find the Aeon interface\n let interfaceNum = config?.interfaceNumber;\n let outEp = config?.outEndpoint;\n let inEp = config?.inEndpoint;\n\n if (interfaceNum === undefined || outEp === undefined || inEp === undefined) {\n // Auto-detect from device configuration\n const iface = device.configuration?.interfaces.find((i) =>\n i.alternates.some(\n (alt) =>\n alt.interfaceClass === AEON_USB_INTERFACE_CLASS &&\n alt.interfaceSubclass === AEON_USB_SUBCLASS\n )\n );\n\n if (!iface) {\n throw new Error('No Aeon USB interface found on device');\n }\n\n interfaceNum = iface.interfaceNumber;\n\n const alternate = iface.alternates.find(\n (alt) =>\n alt.interfaceClass === AEON_USB_INTERFACE_CLASS &&\n alt.interfaceSubclass === AEON_USB_SUBCLASS\n )!;\n\n for (const ep of alternate.endpoints) {\n if (ep.type === 'bulk') {\n if (ep.direction === 'out' && outEp === undefined) {\n outEp = ep.endpointNumber;\n } else if (ep.direction === 'in' && inEp === undefined) {\n inEp = ep.endpointNumber;\n }\n }\n }\n }\n\n if (interfaceNum === undefined || outEp === undefined || inEp === undefined) {\n throw new Error('Could not find bulk endpoints on Aeon USB interface');\n }\n\n await device.claimInterface(interfaceNum);\n\n const transport = new USBFlowTransport(\n device,\n interfaceNum,\n outEp,\n inEp,\n config?.transferSize ?? DEFAULT_TRANSFER_SIZE\n );\n\n // Start the read loop\n transport.startReadLoop();\n\n return transport;\n }\n\n /**\n * Create from an already-opened USB device (for testing or manual setup).\n */\n static fromDevice(\n device: USBDevice,\n interfaceNum: number,\n outEndpoint: number,\n inEndpoint: number,\n config?: Partial<USBFlowConfig>\n ): USBFlowTransport {\n const transport = new USBFlowTransport(\n device,\n interfaceNum,\n outEndpoint,\n inEndpoint,\n config?.transferSize ?? DEFAULT_TRANSFER_SIZE\n );\n transport.startReadLoop();\n return transport;\n }\n\n // ─── FlowTransport interface ───────────────────────────────────────\n\n send(data: Uint8Array): void {\n if (this.closed) return;\n\n // Length-prefixed framing\n const frame = new Uint8Array(LENGTH_PREFIX_SIZE + data.byteLength);\n const view = new DataView(frame.buffer);\n view.setUint32(0, data.byteLength, false);\n frame.set(data, LENGTH_PREFIX_SIZE);\n\n // Fire-and-forget bulk write\n this.device.transferOut(this.outEndpoint, frame).catch(() => {\n // Write failed — device disconnected\n });\n }\n\n onReceive(handler: (data: Uint8Array) => void): void {\n this.receiveHandler = handler;\n }\n\n close(): void {\n if (this.closed) return;\n this.closed = true;\n this.readLoopRunning = false;\n this.receiveHandler = null;\n\n // Release interface and close device\n this.device.releaseInterface(this.interfaceNum).then(() => {\n this.device.close().catch(() => {});\n }).catch(() => {});\n }\n\n /** Whether the transport is still open */\n get isOpen(): boolean {\n return !this.closed;\n }\n\n /** Get the USB device info */\n get deviceInfo(): { vendorId: number; productId: number; name: string } {\n return {\n vendorId: this.device.vendorId,\n productId: this.device.productId,\n name: this.device.productName ?? this.device.serialNumber ?? 'Unknown',\n };\n }\n\n // ─── Internal: Continuous Read Loop ───────────────────────────────\n\n private startReadLoop(): void {\n if (this.readLoopRunning) return;\n this.readLoopRunning = true;\n\n const loop = async () => {\n while (this.readLoopRunning && !this.closed) {\n try {\n const result = await this.device.transferIn(\n this.inEndpoint,\n this.transferSize\n );\n\n if (result.status === 'ok' && result.data && result.data.byteLength > 0) {\n const chunk = new Uint8Array(result.data.buffer);\n this.processChunk(chunk);\n }\n } catch {\n // Transfer failed — device may have disconnected\n if (!this.closed) {\n this.closed = true;\n this.readLoopRunning = false;\n this.receiveHandler = null;\n }\n return;\n }\n }\n };\n\n void loop();\n }\n\n private processChunk(chunk: Uint8Array): void {\n // Append to reassembly buffer\n const combined = new Uint8Array(this.rxBuffer.byteLength + chunk.byteLength);\n combined.set(this.rxBuffer);\n combined.set(chunk, this.rxBuffer.byteLength);\n this.rxBuffer = combined;\n\n // Extract complete messages\n while (this.rxBuffer.byteLength >= LENGTH_PREFIX_SIZE) {\n const view = new DataView(\n this.rxBuffer.buffer,\n this.rxBuffer.byteOffset,\n this.rxBuffer.byteLength\n );\n const msgLen = view.getUint32(0, false);\n\n if (this.rxBuffer.byteLength < LENGTH_PREFIX_SIZE + msgLen) {\n break;\n }\n\n const message = this.rxBuffer.slice(\n LENGTH_PREFIX_SIZE,\n LENGTH_PREFIX_SIZE + msgLen\n );\n this.rxBuffer = this.rxBuffer.slice(LENGTH_PREFIX_SIZE + msgLen);\n\n this.receiveHandler?.(message);\n }\n }\n}\n","/**\n * HTTP Flow Transport (nginx Bridge)\n *\n * FlowTransport adapter that translates between HTTP and Aeon flow protocol.\n * This is the normie projection layer — external clients speak HTTP,\n * the nginx module translates to Aeon flow, and everything internal\n * speaks Aeon natively.\n *\n * Two sides:\n * 1. **Server-side (Aeon→HTTP)**: Receives flow frames from internal Aeon\n * services and translates them into HTTP responses for external clients.\n * 2. **Client-side (HTTP→Aeon)**: Receives HTTP requests from nginx and\n * translates them into flow frames for internal processing.\n *\n * The nginx module handles the C-level WebSocket↔HTTP translation.\n * This TypeScript module handles the flow frame↔HTTP semantic mapping:\n * - HTTP GET → flow stream open + await FIN\n * - HTTP POST → flow stream open + data frames + FIN\n * - HTTP response → flow frames + FIN\n * - HTTP streaming response → flow frames (no FIN until complete)\n * - HTTP error → VENT frame\n *\n * Wire format between nginx module and this bridge:\n * Control messages are length-prefixed JSON.\n * Data messages are raw flow frames.\n */\n\nimport type { FlowTransport } from '../flow/types';\n\n// ═══════════════════════════════════════════════════════════════════════════════\n// Types\n// ═══════════════════════════════════════════════════════════════════════════════\n\n/** HTTP request as received from nginx */\nexport interface AeonHTTPRequest {\n /** HTTP method */\n method: string;\n /** Request path */\n path: string;\n /** Query string (without leading ?) */\n query?: string;\n /** Request headers */\n headers: Record<string, string>;\n /** Request body (for POST/PUT/PATCH) */\n body?: Uint8Array;\n /** Unique request ID assigned by nginx */\n requestId: string;\n}\n\n/** HTTP response to send back through nginx */\nexport interface AeonHTTPResponse {\n /** HTTP status code */\n status: number;\n /** Response headers */\n headers: Record<string, string>;\n /** Response body */\n body: Uint8Array;\n /** Whether this is a streaming response (more chunks follow) */\n streaming?: boolean;\n /** Request ID this response belongs to */\n requestId: string;\n}\n\n/** Control message from nginx → bridge */\nexport interface NginxControlMessage {\n type: 'http-request';\n request: AeonHTTPRequest;\n}\n\n/** Control message from bridge → nginx */\nexport interface BridgeControlMessage {\n type: 'http-response' | 'http-response-chunk' | 'http-response-end';\n response: AeonHTTPResponse;\n}\n\nexport interface HTTPBridgeConfig {\n /** Default content type for responses (default: 'application/octet-stream') */\n defaultContentType?: string;\n /** Maximum request body size in bytes (default: 16MB) */\n maxBodySize?: number;\n /** Timeout for flow response in ms (default: 30000) */\n responseTimeout?: number;\n}\n\n// ═══════════════════════════════════════════════════════════════════════════════\n// HTTP→Aeon Request Encoder\n// ═══════════════════════════════════════════════════════════════════════════════\n\nconst encoder = new TextEncoder();\nconst decoder = new TextDecoder();\n\n/**\n * Encode an HTTP request into flow frame payload.\n *\n * Format:\n * [0-3] u32 method length\n * [4-7] u32 path length\n * [8-11] u32 headers JSON length\n * [12-15] u32 body length\n * [...] method bytes\n * [...] path bytes (includes query string)\n * [...] headers JSON bytes\n * [...] body bytes\n */\nexport function encodeHTTPRequest(req: AeonHTTPRequest): Uint8Array {\n const methodBytes = encoder.encode(req.method);\n const fullPath = req.query ? `${req.path}?${req.query}` : req.path;\n const pathBytes = encoder.encode(fullPath);\n const headersBytes = encoder.encode(JSON.stringify(req.headers));\n const bodyBytes = req.body ?? new Uint8Array(0);\n\n const headerSize = 16;\n const totalSize = headerSize + methodBytes.byteLength + pathBytes.byteLength +\n headersBytes.byteLength + bodyBytes.byteLength;\n const encoded = new Uint8Array(totalSize);\n const view = new DataView(encoded.buffer);\n\n view.setUint32(0, methodBytes.byteLength, false);\n view.setUint32(4, pathBytes.byteLength, false);\n view.setUint32(8, headersBytes.byteLength, false);\n view.setUint32(12, bodyBytes.byteLength, false);\n\n let offset = headerSize;\n encoded.set(methodBytes, offset); offset += methodBytes.byteLength;\n encoded.set(pathBytes, offset); offset += pathBytes.byteLength;\n encoded.set(headersBytes, offset); offset += headersBytes.byteLength;\n encoded.set(bodyBytes, offset);\n\n return encoded;\n}\n\n/**\n * Decode a flow frame payload back into an HTTP request.\n */\nexport function decodeHTTPRequest(data: Uint8Array): AeonHTTPRequest {\n if (data.byteLength < 16) throw new Error('Invalid HTTP request frame');\n\n const view = new DataView(data.buffer, data.byteOffset, data.byteLength);\n const methodLen = view.getUint32(0, false);\n const pathLen = view.getUint32(4, false);\n const headersLen = view.getUint32(8, false);\n const bodyLen = view.getUint32(12, false);\n\n let offset = 16;\n const method = decoder.decode(data.subarray(offset, offset + methodLen));\n offset += methodLen;\n\n const fullPath = decoder.decode(data.subarray(offset, offset + pathLen));\n offset += pathLen;\n\n const headersJson = decoder.decode(data.subarray(offset, offset + headersLen));\n offset += headersLen;\n\n const body = bodyLen > 0 ? data.slice(offset, offset + bodyLen) : undefined;\n\n // Split path and query\n const qIdx = fullPath.indexOf('?');\n const path = qIdx >= 0 ? fullPath.substring(0, qIdx) : fullPath;\n const query = qIdx >= 0 ? fullPath.substring(qIdx + 1) : undefined;\n\n return {\n method,\n path,\n query,\n headers: JSON.parse(headersJson) as Record<string, string>,\n body,\n requestId: '', // Assigned by caller\n };\n}\n\n// ═══════════════════════════════════════════════════════════════════════════════\n// Aeon→HTTP Response Encoder\n// ═══════════════════════════════════════════════════════════════════════════════\n\n/**\n * Encode an HTTP response into flow frame payload.\n *\n * Format:\n * [0-1] u16 status code\n * [2-5] u32 headers JSON length\n * [6-9] u32 body length\n * [...] headers JSON bytes\n * [...] body bytes\n */\nexport function encodeHTTPResponse(res: Omit<AeonHTTPResponse, 'requestId'>): Uint8Array {\n const headersBytes = encoder.encode(JSON.stringify(res.headers));\n const bodyBytes = res.body;\n\n const headerSize = 10;\n const totalSize = headerSize + headersBytes.byteLength + bodyBytes.byteLength;\n const encoded = new Uint8Array(totalSize);\n const view = new DataView(encoded.buffer);\n\n view.setUint16(0, res.status, false);\n view.setUint32(2, headersBytes.byteLength, false);\n view.setUint32(6, bodyBytes.byteLength, false);\n\n let offset = headerSize;\n encoded.set(headersBytes, offset); offset += headersBytes.byteLength;\n encoded.set(bodyBytes, offset);\n\n return encoded;\n}\n\n/**\n * Decode a flow frame payload back into an HTTP response.\n */\nexport function decodeHTTPResponse(data: Uint8Array): Omit<AeonHTTPResponse, 'requestId'> {\n if (data.byteLength < 10) throw new Error('Invalid HTTP response frame');\n\n const view = new DataView(data.buffer, data.byteOffset, data.byteLength);\n const status = view.getUint16(0, false);\n const headersLen = view.getUint32(2, false);\n const bodyLen = view.getUint32(6, false);\n\n let offset = 10;\n const headersJson = decoder.decode(data.subarray(offset, offset + headersLen));\n offset += headersLen;\n\n const body = data.slice(offset, offset + bodyLen);\n\n return {\n status,\n headers: JSON.parse(headersJson) as Record<string, string>,\n body,\n };\n}\n\n// ═══════════════════════════════════════════════════════════════════════════════\n// HTTP↔Aeon Bridge\n// ═══════════════════════════════════════════════════════════════════════════════\n\n/**\n * Bidirectional HTTP↔Aeon flow protocol bridge.\n *\n * Sits between nginx (HTTP) and internal Aeon services (flow protocol).\n * Translates HTTP requests into flow streams and flow responses back\n * into HTTP responses.\n *\n * nginx module sends HTTP requests over a WebSocket to this bridge.\n * This bridge opens flow streams, forwards the request as flow frames,\n * collects the response frames, and sends the HTTP response back to nginx.\n */\nexport class HTTPAeonBridge {\n private transport: FlowTransport;\n private config: HTTPBridgeConfig;\n\n /** Pending HTTP requests waiting for flow responses */\n private pending = new Map<string, {\n resolve: (res: AeonHTTPResponse) => void;\n reject: (err: Error) => void;\n timer: ReturnType<typeof setTimeout>;\n chunks: Uint8Array[];\n }>();\n\n /** Handler for incoming HTTP requests (from nginx side) */\n private requestHandler: ((req: AeonHTTPRequest) => Promise<AeonHTTPResponse>) | null = null;\n\n constructor(transport: FlowTransport, config?: HTTPBridgeConfig) {\n this.transport = transport;\n this.config = config ?? {};\n\n // Wire up receive to handle response frames\n transport.onReceive((data) => {\n this.handleIncoming(data);\n });\n }\n\n /**\n * Register a handler for incoming HTTP requests.\n * This is used on the Aeon side — the bridge receives HTTP requests\n * from nginx, translates them to flow, and calls this handler.\n */\n onRequest(handler: (req: AeonHTTPRequest) => Promise<AeonHTTPResponse>): void {\n this.requestHandler = handler;\n }\n\n /**\n * Send an HTTP request through the bridge (used by nginx side).\n * Translates the HTTP request into flow frames, waits for the\n * flow response, and returns it as an HTTP response.\n */\n async sendRequest(req: AeonHTTPRequest): Promise<AeonHTTPResponse> {\n const timeout = this.config.responseTimeout ?? 30_000;\n\n return new Promise<AeonHTTPResponse>((resolve, reject) => {\n const timer = setTimeout(() => {\n this.pending.delete(req.requestId);\n reject(new Error(`Flow response timeout for ${req.method} ${req.path}`));\n }, timeout);\n\n this.pending.set(req.requestId, { resolve, reject, timer, chunks: [] });\n\n // Encode and send the request as a flow frame\n const payload = encodeHTTPRequest(req);\n\n // Prefix with request ID so the other side can correlate\n const reqIdBytes = encoder.encode(req.requestId);\n const frame = new Uint8Array(4 + reqIdBytes.byteLength + payload.byteLength);\n const view = new DataView(frame.buffer);\n view.setUint32(0, reqIdBytes.byteLength, false);\n frame.set(reqIdBytes, 4);\n frame.set(payload, 4 + reqIdBytes.byteLength);\n\n this.transport.send(frame);\n });\n }\n\n /**\n * Send an HTTP response back through the bridge (used by Aeon side).\n */\n sendResponse(res: AeonHTTPResponse): void {\n const payload = encodeHTTPResponse(res);\n const reqIdBytes = encoder.encode(res.requestId);\n\n // Prefix with request ID and a response marker byte\n const frame = new Uint8Array(5 + reqIdBytes.byteLength + payload.byteLength);\n const view = new DataView(frame.buffer);\n frame[0] = 0x02; // Response marker\n view.setUint32(1, reqIdBytes.byteLength, false);\n frame.set(reqIdBytes, 5);\n frame.set(payload, 5 + reqIdBytes.byteLength);\n\n this.transport.send(frame);\n }\n\n close(): void {\n for (const [, pending] of this.pending) {\n clearTimeout(pending.timer);\n pending.reject(new Error('Bridge closed'));\n }\n this.pending.clear();\n this.transport.close();\n }\n\n // ─── Internal ──────────────────────────────────────────────────────\n\n private handleIncoming(data: Uint8Array): void {\n if (data.byteLength < 5) return;\n\n // Check if this is a response (marker byte 0x02) or a request (no marker)\n if (data[0] === 0x02) {\n this.handleResponseFrame(data);\n } else {\n this.handleRequestFrame(data);\n }\n }\n\n private handleResponseFrame(data: Uint8Array): void {\n const view = new DataView(data.buffer, data.byteOffset, data.byteLength);\n const reqIdLen = view.getUint32(1, false);\n const requestId = decoder.decode(data.subarray(5, 5 + reqIdLen));\n const payload = data.subarray(5 + reqIdLen);\n\n const pending = this.pending.get(requestId);\n if (!pending) return;\n\n clearTimeout(pending.timer);\n this.pending.delete(requestId);\n\n const response = decodeHTTPResponse(payload);\n pending.resolve({ ...response, requestId });\n }\n\n private async handleRequestFrame(data: Uint8Array): Promise<void> {\n if (!this.requestHandler) return;\n\n const view = new DataView(data.buffer, data.byteOffset, data.byteLength);\n const reqIdLen = view.getUint32(0, false);\n const requestId = decoder.decode(data.subarray(4, 4 + reqIdLen));\n const payload = data.subarray(4 + reqIdLen);\n\n const request = decodeHTTPRequest(payload);\n request.requestId = requestId;\n\n try {\n const response = await this.requestHandler(request);\n this.sendResponse(response);\n } catch (err) {\n // Send error response\n this.sendResponse({\n requestId,\n status: 502,\n headers: { 'content-type': 'text/plain' },\n body: encoder.encode(err instanceof Error ? err.message : 'Internal flow error'),\n });\n }\n }\n}\n","/**\n * Federated Browser Inference\n *\n * Fork inference requests across N mesh peers via flow protocol,\n * race the results, winner provides the response. This turns\n * every browser tab with WASM inference into a federated compute node.\n *\n * The coordinator:\n * 1. Discovers peers via DashRelay room or Bluetooth/WebRTC mesh\n * 2. Forks a flow stream per peer for the same prompt\n * 3. Races all streams — fastest inference result wins\n * 4. Vents slower streams to free their resources\n * 5. Returns the winning result to the caller\n *\n * This is fork/race/fold at the network level —\n * the same primitive that handles ESI cache vs inference,\n * but applied across physical devices.\n *\n * Use cases:\n * - 3 phones in a room → fork prompt to all 3, fastest wins\n * - Laptop + tablet → laptop runs 7B, tablet runs 1B, race them\n * - Federated speculative decoding across device mesh\n */\n\nimport { AeonFlowProtocol } from '../flow/AeonFlowProtocol';\nimport type { FlowTransport } from '../flow/types';\n\n// ═══════════════════════════════════════════════════════════════════════════════\n// Types\n// ═══════════════════════════════════════════════════════════════════════════════\n\nexport interface FederatedPeer {\n /** Unique peer identifier */\n id: string;\n /** Flow transport to this peer */\n transport: FlowTransport;\n /** Peer's reported capabilities */\n capabilities: PeerCapabilities;\n /** Last seen timestamp */\n lastSeen: number;\n /** Whether peer is currently available for inference */\n available: boolean;\n}\n\nexport interface PeerCapabilities {\n /** Models available on this peer */\n models: string[];\n /** Acceleration type */\n acceleration: 'webgpu' | 'webnn' | 'wasm' | 'none';\n /** Estimated tokens/second */\n estimatedTps?: number;\n /** Available memory in MB */\n availableMemoryMB?: number;\n /** Whether peer is on battery */\n onBattery?: boolean;\n}\n\nexport interface FederatedInferenceRequest {\n /** Prompt text */\n prompt: string;\n /** Model preference (peers without this model are skipped) */\n model?: string;\n /** Maximum tokens to generate */\n maxTokens?: number;\n /** Temperature */\n temperature?: number;\n /** Whether to include all peer results or just the winner */\n collectAll?: boolean;\n}\n\nexport interface FederatedInferenceResult {\n /** The winning peer's ID */\n winnerId: string;\n /** Generated text */\n text: string;\n /** Time to first token (ms) */\n ttft: number;\n /** Total generation time (ms) */\n totalTime: number;\n /** Tokens per second achieved */\n tokensPerSecond: number;\n /** All peer results (if collectAll was true) */\n allResults?: Map<string, { text: string; time: number }>;\n}\n\nexport interface FederatedInferenceConfig {\n /** Timeout for inference requests in ms (default: 60000) */\n timeout?: number;\n /** Minimum peers required to start federated inference (default: 1) */\n minPeers?: number;\n /** Maximum peers to fork to (default: 8) */\n maxPeers?: number;\n /** Whether to include local inference in the race (default: true) */\n includeLocal?: boolean;\n /** Local inference handler (if includeLocal is true) */\n localInference?: (prompt: string) => Promise<string>;\n}\n\n// ═══════════════════════════════════════════════════════════════════════════════\n// Wire Format for Inference Requests/Responses\n// ═══════════════════════════════════════════════════════════════════════════════\n\nconst MSG_INFERENCE_REQUEST = 0x01;\nconst MSG_INFERENCE_RESPONSE = 0x02;\nconst MSG_CAPABILITY_ANNOUNCE = 0x03;\nconst MSG_CAPABILITY_REQUEST = 0x04;\n\nconst textEncoder = new TextEncoder();\nconst textDecoder = new TextDecoder();\n\nfunction encodeInferenceRequest(req: FederatedInferenceRequest): Uint8Array {\n const json = JSON.stringify(req);\n const jsonBytes = textEncoder.encode(json);\n const frame = new Uint8Array(1 + jsonBytes.byteLength);\n frame[0] = MSG_INFERENCE_REQUEST;\n frame.set(jsonBytes, 1);\n return frame;\n}\n\nfunction encodeInferenceResponse(text: string, metrics: { ttft: number; totalTime: number; tps: number }): Uint8Array {\n const json = JSON.stringify({ text, ...metrics });\n const jsonBytes = textEncoder.encode(json);\n const frame = new Uint8Array(1 + jsonBytes.byteLength);\n frame[0] = MSG_INFERENCE_RESPONSE;\n frame.set(jsonBytes, 1);\n return frame;\n}\n\nfunction encodeCapabilities(caps: PeerCapabilities): Uint8Array {\n const json = JSON.stringify(caps);\n const jsonBytes = textEncoder.encode(json);\n const frame = new Uint8Array(1 + jsonBytes.byteLength);\n frame[0] = MSG_CAPABILITY_ANNOUNCE;\n frame.set(jsonBytes, 1);\n return frame;\n}\n\n// ═══════════════════════════════════════════════════════════════════════════════\n// Federated Inference Coordinator\n// ═══════════════════════════════════════════════════════════════════════════════\n\n/**\n * Coordinates federated inference across a mesh of peers.\n *\n * Each peer runs its own WASM inference engine. The coordinator\n * forks the same prompt to multiple peers, races them, and returns\n * the fastest result.\n *\n * Uses AeonFlowProtocol for fork/race/fold:\n * - fork(root, N) creates N child streams, one per peer\n * - race(children) picks the first to complete\n * - Losers are automatically vented\n */\nexport class FederatedInferenceCoordinator {\n private peers = new Map<string, FederatedPeer>();\n private config: FederatedInferenceConfig;\n private listeners = new Set<(event: FederationEvent) => void>();\n\n constructor(config?: FederatedInferenceConfig) {\n this.config = config ?? {};\n }\n\n // ─── Peer Management ────────────────────────────────────────────\n\n /**\n * Register a peer with its flow transport.\n * The transport should already be connected.\n */\n addPeer(id: string, transport: FlowTransport, capabilities?: PeerCapabilities): void {\n const peer: FederatedPeer = {\n id,\n transport,\n capabilities: capabilities ?? { models: [], acceleration: 'none' },\n lastSeen: Date.now(),\n available: true,\n };\n\n this.peers.set(id, peer);\n this.emit({ type: 'peer-added', peerId: id });\n\n // Request capabilities if not provided\n if (!capabilities) {\n const reqFrame = new Uint8Array([MSG_CAPABILITY_REQUEST]);\n transport.send(reqFrame);\n }\n\n // Listen for capability announcements\n transport.onReceive((data) => {\n if (data[0] === MSG_CAPABILITY_ANNOUNCE) {\n const json = textDecoder.decode(data.subarray(1));\n peer.capabilities = JSON.parse(json) as PeerCapabilities;\n peer.lastSeen = Date.now();\n this.emit({ type: 'peer-capabilities', peerId: id, capabilities: peer.capabilities });\n }\n });\n }\n\n /**\n * Remove a peer from the federation.\n */\n removePeer(id: string): void {\n const peer = this.peers.get(id);\n if (peer) {\n peer.available = false;\n this.peers.delete(id);\n this.emit({ type: 'peer-removed', peerId: id });\n }\n }\n\n /**\n * Get all available peers, optionally filtered by model support.\n */\n getAvailablePeers(model?: string): FederatedPeer[] {\n return Array.from(this.peers.values()).filter((peer) => {\n if (!peer.available) return false;\n if (model && !peer.capabilities.models.includes(model)) return false;\n return true;\n });\n }\n\n // ─── Federated Inference ──────────────────────────────────────────\n\n /**\n * Run federated inference across available peers.\n *\n * Forks the prompt to N peers, races them, returns the fastest result.\n * This is the core fork/race primitive applied at the network level.\n */\n async infer(request: FederatedInferenceRequest): Promise<FederatedInferenceResult> {\n const availablePeers = this.getAvailablePeers(request.model);\n const minPeers = this.config.minPeers ?? 1;\n const maxPeers = this.config.maxPeers ?? 8;\n const timeout = this.config.timeout ?? 60_000;\n const includeLocal = this.config.includeLocal ?? true;\n\n const totalCandidates = availablePeers.length + (includeLocal ? 1 : 0);\n\n if (totalCandidates < minPeers) {\n throw new Error(\n `Not enough peers for federated inference: ${totalCandidates} available, ${minPeers} required`\n );\n }\n\n // Select peers (up to maxPeers, sorted by estimated TPS descending)\n const selectedPeers = availablePeers\n .sort((a, b) => (b.capabilities.estimatedTps ?? 0) - (a.capabilities.estimatedTps ?? 0))\n .slice(0, maxPeers - (includeLocal ? 1 : 0));\n\n const startTime = Date.now();\n this.emit({ type: 'inference-start', peerCount: selectedPeers.length + (includeLocal ? 1 : 0) });\n\n // Race all peers (and optionally local)\n const raceEntries: Array<{\n id: string;\n promise: Promise<{ text: string; ttft: number; totalTime: number; tps: number }>;\n }> = [];\n\n // Fork to each peer\n for (const peer of selectedPeers) {\n const requestFrame = encodeInferenceRequest(request);\n const peerPromise = new Promise<{ text: string; ttft: number; totalTime: number; tps: number }>(\n (resolve, reject) => {\n const timer = setTimeout(() => {\n reject(new Error(`Peer ${peer.id} timeout`));\n }, timeout);\n\n // Store the original handler and set up our inference handler\n const handler = (data: Uint8Array) => {\n if (data[0] === MSG_INFERENCE_RESPONSE) {\n clearTimeout(timer);\n const json = textDecoder.decode(data.subarray(1));\n const result = JSON.parse(json) as { text: string; ttft: number; totalTime: number; tps: number };\n resolve(result);\n }\n };\n\n peer.transport.onReceive(handler);\n peer.transport.send(requestFrame);\n }\n );\n\n raceEntries.push({ id: peer.id, promise: peerPromise });\n }\n\n // Include local inference if configured\n if (includeLocal && this.config.localInference) {\n const localStart = Date.now();\n const localPromise = this.config.localInference(request.prompt).then((text) => {\n const totalTime = Date.now() - localStart;\n const tokens = text.split(/\\s+/).length; // Rough estimate\n return {\n text,\n ttft: totalTime / 2, // Rough estimate\n totalTime,\n tps: tokens / (totalTime / 1000),\n };\n });\n\n raceEntries.push({ id: '__local__', promise: localPromise });\n }\n\n // Race all entries\n if (request.collectAll) {\n // Wait for all results, but return the first one as winner\n const allResults = new Map<string, { text: string; time: number }>();\n let winner: { id: string; result: { text: string; ttft: number; totalTime: number; tps: number } } | null = null;\n\n const settled = await Promise.allSettled(\n raceEntries.map(async (entry) => {\n const result = await entry.promise;\n if (!winner) {\n winner = { id: entry.id, result };\n }\n allResults.set(entry.id, { text: result.text, time: result.totalTime });\n return { id: entry.id, result };\n })\n );\n\n if (!winner) {\n throw new Error('All peers failed inference');\n }\n\n const w = winner as { id: string; result: { text: string; ttft: number; totalTime: number; tps: number } };\n return {\n winnerId: w.id,\n text: w.result.text,\n ttft: w.result.ttft,\n totalTime: w.result.totalTime,\n tokensPerSecond: w.result.tps,\n allResults,\n };\n } else {\n // Pure race — first to resolve wins\n const winner = await Promise.any(\n raceEntries.map(async (entry) => {\n const result = await entry.promise;\n return { id: entry.id, result };\n })\n );\n\n this.emit({\n type: 'inference-complete',\n winnerId: winner.id,\n totalTime: Date.now() - startTime,\n });\n\n return {\n winnerId: winner.id,\n text: winner.result.text,\n ttft: winner.result.ttft,\n totalTime: winner.result.totalTime,\n tokensPerSecond: winner.result.tps,\n };\n }\n }\n\n // ─── Peer-Side: Handle Incoming Inference Requests ────────────────\n\n /**\n * Create a handler for incoming inference requests.\n * Call this on the peer side to process requests from the coordinator.\n *\n * @param inferFn - The actual inference function on this peer\n * @returns A FlowTransport receive handler\n */\n static createPeerHandler(\n inferFn: (prompt: string, options?: { maxTokens?: number; temperature?: number }) => Promise<string>\n ): (data: Uint8Array) => void {\n return (data: Uint8Array) => {\n if (data[0] !== MSG_INFERENCE_REQUEST) return;\n\n const json = textDecoder.decode(data.subarray(1));\n const request = JSON.parse(json) as FederatedInferenceRequest;\n\n const startTime = Date.now();\n let ttft = 0;\n\n void inferFn(request.prompt, {\n maxTokens: request.maxTokens,\n temperature: request.temperature,\n }).then((text) => {\n if (ttft === 0) ttft = Date.now() - startTime;\n const totalTime = Date.now() - startTime;\n const tokens = text.split(/\\s+/).length;\n const tps = tokens / (totalTime / 1000);\n\n // This handler doesn't have direct access to transport.send()\n // The caller should wire this up appropriately\n return encodeInferenceResponse(text, { ttft, totalTime, tps });\n });\n };\n }\n\n /**\n * Set up a peer to respond to federated inference requests.\n *\n * @param transport - The FlowTransport connected to the coordinator\n * @param inferFn - The inference function to run\n * @param capabilities - This peer's capabilities to announce\n */\n static setupPeer(\n transport: FlowTransport,\n inferFn: (prompt: string, options?: { maxTokens?: number; temperature?: number }) => Promise<string>,\n capabilities: PeerCapabilities\n ): void {\n // Announce capabilities\n transport.send(encodeCapabilities(capabilities));\n\n // Handle incoming requests\n transport.onReceive((data) => {\n if (data[0] === MSG_CAPABILITY_REQUEST) {\n transport.send(encodeCapabilities(capabilities));\n return;\n }\n\n if (data[0] !== MSG_INFERENCE_REQUEST) return;\n\n const json = textDecoder.decode(data.subarray(1));\n const request = JSON.parse(json) as FederatedInferenceRequest;\n\n const startTime = Date.now();\n\n void inferFn(request.prompt, {\n maxTokens: request.maxTokens,\n temperature: request.temperature,\n }).then((text) => {\n const totalTime = Date.now() - startTime;\n const tokens = text.split(/\\s+/).length;\n const tps = tokens / Math.max(totalTime / 1000, 0.001);\n const response = encodeInferenceResponse(text, { ttft: totalTime / 2, totalTime, tps });\n transport.send(response);\n }).catch(() => {\n // Inference failed — don't respond, let coordinator timeout\n });\n });\n }\n\n // ─── Events ──────────────────────────────────────────────────────\n\n on(handler: (event: FederationEvent) => void): void {\n this.listeners.add(handler);\n }\n\n off(handler: (event: FederationEvent) => void): void {\n this.listeners.delete(handler);\n }\n\n private emit(event: FederationEvent): void {\n for (const handler of this.listeners) {\n handler(event);\n }\n }\n\n // ─── Status ──────────────────────────────────────────────────────\n\n get peerCount(): number {\n return this.peers.size;\n }\n\n get availablePeerCount(): number {\n return Array.from(this.peers.values()).filter((p) => p.available).length;\n }\n\n destroy(): void {\n for (const peer of this.peers.values()) {\n peer.transport.close();\n }\n this.peers.clear();\n this.listeners.clear();\n }\n}\n\n// ═══════════════════════════════════════════════════════════════════════════════\n// Event Types\n// ═══════════════════════════════════════════════════════════════════════════════\n\nexport type FederationEvent =\n | { type: 'peer-added'; peerId: string }\n | { type: 'peer-removed'; peerId: string }\n | { type: 'peer-capabilities'; peerId: string; capabilities: PeerCapabilities }\n | { type: 'inference-start'; peerCount: number }\n | { type: 'inference-complete'; winnerId: string; totalTime: number }\n | { type: 'error'; message: string };\n","/**\n * Aeon - Distributed Synchronization & Versioning Library\n *\n * A comprehensive library for building distributed, collaborative applications\n * with real-time synchronization, schema versioning, and conflict resolution.\n *\n * @example\n * ```typescript\n * import { SyncCoordinator, SchemaVersionManager } from '@a0n/aeon';\n *\n * // Create a sync coordinator\n * const coordinator = new SyncCoordinator();\n *\n * // Register a node\n * coordinator.registerNode({\n * id: 'node-1',\n * address: 'localhost',\n * port: 3000,\n * status: 'online',\n * lastHeartbeat: new Date().toISOString(),\n * version: '1.0.0',\n * capabilities: ['sync', 'replicate'],\n * });\n *\n * // Create a sync session\n * const session = coordinator.createSyncSession('node-1', ['node-2', 'node-3']);\n * ```\n *\n * @packageDocumentation\n */\n\n// Core types\nexport * from './core';\n\n// Utils\nexport * from './utils';\n\n// Persistence module\nexport * from './persistence';\n\n// Versioning module (Phase 15)\nexport * from './versioning';\n\n// Distributed module (Phase 16)\nexport * from './distributed';\n\n// Offline module (Phase 11)\nexport * from './offline';\n\n// Compression module (Phase 12)\nexport * from './compression';\n\n// Optimization module (Phase 13)\nexport * from './optimization';\n\n// Presence module (Phase 14)\nexport * from './presence';\n\n// Crypto module (UCAN + ZK encryption)\nexport * from './crypto';\n\n// Flow module (fork/race/fold protocol primitive)\nexport * from './flow';\n\n// Topology module (Betti numbers, topological deficit diagnostic)\nexport * from './topology';\n\n// Transport module (every wire format that matters)\nexport * from './transport';\n\n// Federation module (federated inference across mesh)\nexport * from './federation';\n\n/**\n * STUBS for React components and hooks\n * These are normally provided by @a0n/aeon-flux-react but are\n * imported from @a0n/aeon in many legacy parts of edge-web-app.\n *\n * NOTE: Only stub things NOT exported by submodules above.\n * SchemaVersionManager, SyncCoordinator, getAdaptiveCompressionOptimizer,\n * and getAgentPresenceManager are real exports — do NOT shadow them here.\n */\nexport const Link = (() => {\n throw new Error(\n 'Link: Stub called from @a0n/aeon. Import from @a0n/aeon-flux-react or mock in tests.'\n );\n}) as any;\n\nexport const useAeonPage = (() => {\n throw new Error(\n 'useAeonPage: Stub called from @a0n/aeon. Import from @a0n/aeon-flux-react or mock in tests.'\n );\n}) as any;\n"]}
|