1 line
152 KiB
Plaintext
1 line
152 KiB
Plaintext
{"version":3,"sources":["../src/cache.ts","../src/bridges/gt-bridge.ts","../src/bridges/bd-bridge.ts","../src/bridges/sync-bridge.ts"],"names":["LRUCache","options","key","node","value","sizeBytes","size","existing","totalAccess","evicted","acc","v","FormulaASTCache","maxEntries","content","hash","ast","cacheStats","cached","i","hashStr","first","BatchDeduplicator","timeoutMs","executor","resolve","reject","resolvers","promise","result","error","pendingRequest","req","ModulePreloader","name","loader","priority","a","b","item","module","task","DebouncedEmitter","emit","debounceMs","timeSinceLastEmit","execFileAsync","promisify","execFile","resultCache","staticCache","execDedup","parsedCache","hashArgs","args","arg","SafeStringSchema","z","val","IdentifierSchema","GasPriceSchema","GasLimitSchema","TxHashSchema","AddressSchema","NetworkSchema","GtArgumentSchema","GtBridgeError","message","code","command","cause","defaultLogger","msg","meta","ALLOWED_GT_COMMANDS","GtBridge","_GtBridge","config","logger","skipCache","startTime","validatedArgs","subcommand","cacheKey","isCacheable","isStatic","stdout","stderr","durationMs","err","output","parsed","jsonMatch","params","validatedTo","network","validatedData","validatedValue","validatedFrom","txHash","data","abi","validatedAbi","index","createGtBridge","beadQueryCache","singleBeadCache","BeadIdSchema","BeadTypeSchema","BeadSchema","BdArgumentSchema","BdBridgeError","ALLOWED_BD_COMMANDS","BdBridge","_BdBridge","childProcess","spawn","lines","beads","errors","line","validated","query","types","type","tag","beadId","validatedId","bead","createBdBridge","agentDBLookupCache","conflictCache","hashKey","parts","part","ConflictStrategySchema","SyncDirectionSchema","SyncStatusSchema","AgentDBEntrySchema","SyncBridgeError","details","SyncBridge","agentDB","savedState","lookupPromises","lookupResults","conflictCacheKey","hasConflict","offset","hasMore","entries","entry","allBeads","toAgentDBResult","fromAgentDBBeads","c","resolution","mergedData","conflict","merged","pendingIndex","beadTime","entryTime","entryData","mergedBead","createSyncBridge"],"mappings":"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","file":"chunk-JF2GA7QE.cjs","sourcesContent":["/**\n * Gas Town Bridge Plugin - Unified Cache System\n *\n * High-performance caching with:\n * - O(1) LRU cache with Map + doubly linked list\n * - WeakMap for formula AST caching (GC-friendly)\n * - Result memoization for expensive operations\n * - Batch deduplication for concurrent requests\n *\n * Performance targets:\n * - 50% memory reduction via eviction\n * - 3x faster cold start via preloading\n *\n * @module gastown-bridge/cache\n * @version 0.1.0\n */\n\n// ============================================================================\n// LRU Cache Implementation - O(1) get/set\n// ============================================================================\n\n/**\n * Doubly linked list node for LRU tracking\n */\ninterface LRUNode<K, V> {\n key: K;\n value: V;\n prev: LRUNode<K, V> | null;\n next: LRUNode<K, V> | null;\n size: number;\n createdAt: number;\n accessCount: number;\n}\n\n/**\n * LRU Cache with O(1) operations\n *\n * Uses Map for O(1) lookups and doubly linked list for O(1) eviction.\n * Supports TTL, size limits, and access tracking.\n *\n * @example\n * ```typescript\n * const cache = new LRUCache<string, Formula>({ maxSize: 1000, ttlMs: 60000 });\n * cache.set('formula-1', parsedFormula);\n * const formula = cache.get('formula-1');\n * ```\n */\nexport class LRUCache<K, V> {\n private readonly cache: Map<K, LRUNode<K, V>> = new Map();\n private head: LRUNode<K, V> | null = null;\n private tail: LRUNode<K, V> | null = null;\n private currentSize = 0;\n\n private readonly maxSize: number;\n private readonly maxEntries: number;\n private readonly ttlMs: number;\n private readonly onEvict?: (key: K, value: V) => void;\n\n constructor(options: {\n maxSize?: number;\n maxEntries?: number;\n ttlMs?: number;\n onEvict?: (key: K, value: V) => void;\n } = {}) {\n this.maxSize = options.maxSize ?? 50 * 1024 * 1024; // 50MB default\n this.maxEntries = options.maxEntries ?? 1000;\n this.ttlMs = options.ttlMs ?? 0; // 0 = no TTL\n this.onEvict = options.onEvict;\n }\n\n /**\n * Get value from cache - O(1)\n */\n get(key: K): V | undefined {\n const node = this.cache.get(key);\n if (!node) return undefined;\n\n // Check TTL\n if (this.ttlMs > 0 && Date.now() - node.createdAt > this.ttlMs) {\n this.delete(key);\n return undefined;\n }\n\n // Move to front (most recently used)\n this.moveToFront(node);\n node.accessCount++;\n return node.value;\n }\n\n /**\n * Set value in cache - O(1)\n */\n set(key: K, value: V, sizeBytes?: number): void {\n const size = sizeBytes ?? this.estimateSize(value);\n\n // Check if key exists - update in place\n const existing = this.cache.get(key);\n if (existing) {\n this.currentSize -= existing.size;\n existing.value = value;\n existing.size = size;\n existing.createdAt = Date.now();\n this.currentSize += size;\n this.moveToFront(existing);\n return;\n }\n\n // Evict if necessary\n while (\n (this.cache.size >= this.maxEntries || this.currentSize + size > this.maxSize) &&\n this.tail\n ) {\n this.evictLRU();\n }\n\n // Create new node\n const node: LRUNode<K, V> = {\n key,\n value,\n prev: null,\n next: this.head,\n size,\n createdAt: Date.now(),\n accessCount: 1,\n };\n\n // Insert at front\n if (this.head) {\n this.head.prev = node;\n }\n this.head = node;\n if (!this.tail) {\n this.tail = node;\n }\n\n this.cache.set(key, node);\n this.currentSize += size;\n }\n\n /**\n * Check if key exists - O(1)\n */\n has(key: K): boolean {\n const node = this.cache.get(key);\n if (!node) return false;\n\n // Check TTL\n if (this.ttlMs > 0 && Date.now() - node.createdAt > this.ttlMs) {\n this.delete(key);\n return false;\n }\n\n return true;\n }\n\n /**\n * Delete from cache - O(1)\n */\n delete(key: K): boolean {\n const node = this.cache.get(key);\n if (!node) return false;\n\n this.removeNode(node);\n this.cache.delete(key);\n this.currentSize -= node.size;\n return true;\n }\n\n /**\n * Clear all entries\n */\n clear(): void {\n if (this.onEvict) {\n for (const [key, node] of this.cache) {\n this.onEvict(key, node.value);\n }\n }\n this.cache.clear();\n this.head = null;\n this.tail = null;\n this.currentSize = 0;\n }\n\n /**\n * Get cache stats\n */\n stats(): {\n entries: number;\n sizeBytes: number;\n maxEntries: number;\n maxSizeBytes: number;\n hitRate: number;\n } {\n let totalAccess = 0;\n for (const node of this.cache.values()) {\n totalAccess += node.accessCount;\n }\n\n return {\n entries: this.cache.size,\n sizeBytes: this.currentSize,\n maxEntries: this.maxEntries,\n maxSizeBytes: this.maxSize,\n hitRate: this.cache.size > 0 ? totalAccess / this.cache.size : 0,\n };\n }\n\n /**\n * Get all keys (for iteration)\n */\n keys(): IterableIterator<K> {\n return this.cache.keys();\n }\n\n /**\n * Get size\n */\n get size(): number {\n return this.cache.size;\n }\n\n // Private methods\n\n private moveToFront(node: LRUNode<K, V>): void {\n if (node === this.head) return;\n\n // Remove from current position\n this.removeNode(node);\n\n // Insert at front\n node.prev = null;\n node.next = this.head;\n if (this.head) {\n this.head.prev = node;\n }\n this.head = node;\n if (!this.tail) {\n this.tail = node;\n }\n }\n\n private removeNode(node: LRUNode<K, V>): void {\n if (node.prev) {\n node.prev.next = node.next;\n } else {\n this.head = node.next;\n }\n\n if (node.next) {\n node.next.prev = node.prev;\n } else {\n this.tail = node.prev;\n }\n }\n\n private evictLRU(): void {\n if (!this.tail) return;\n\n const evicted = this.tail;\n this.removeNode(evicted);\n this.cache.delete(evicted.key);\n this.currentSize -= evicted.size;\n\n if (this.onEvict) {\n this.onEvict(evicted.key, evicted.value);\n }\n }\n\n private estimateSize(value: V): number {\n if (value === null || value === undefined) return 8;\n if (typeof value === 'string') return value.length * 2;\n if (typeof value === 'number') return 8;\n if (typeof value === 'boolean') return 4;\n if (ArrayBuffer.isView(value)) return value.byteLength;\n if (Array.isArray(value)) {\n return value.reduce((acc, v) => acc + this.estimateSize(v), 64);\n }\n if (typeof value === 'object') {\n return JSON.stringify(value).length * 2;\n }\n return 64;\n }\n}\n\n// ============================================================================\n// Formula AST Cache with WeakMap (GC-friendly)\n// ============================================================================\n\n/**\n * Formula AST cache using WeakMap for automatic GC\n *\n * Stores parsed ASTs keyed by source string reference.\n * When the source string is no longer referenced, the AST is GC'd.\n */\nexport class FormulaASTCache {\n // Use a Map with string keys since TOML content is the key\n // WeakMap only works with object keys\n private readonly astCache: LRUCache<string, unknown>;\n private readonly hashCache: Map<string, string> = new Map();\n\n constructor(maxEntries = 500) {\n this.astCache = new LRUCache<string, unknown>({\n maxEntries,\n ttlMs: 5 * 60 * 1000, // 5 minute TTL\n });\n }\n\n /**\n * Get cached AST for formula content\n */\n get(content: string): unknown | undefined {\n const hash = this.hashContent(content);\n return this.astCache.get(hash);\n }\n\n /**\n * Cache AST for formula content\n */\n set(content: string, ast: unknown): void {\n const hash = this.hashContent(content);\n this.astCache.set(hash, ast);\n }\n\n /**\n * Check if content has cached AST\n */\n has(content: string): boolean {\n const hash = this.hashContent(content);\n return this.astCache.has(hash);\n }\n\n /**\n * Clear cache\n */\n clear(): void {\n this.astCache.clear();\n this.hashCache.clear();\n }\n\n /**\n * Get stats\n */\n stats(): { entries: number; sizeBytes: number } {\n const cacheStats = this.astCache.stats();\n return {\n entries: cacheStats.entries,\n sizeBytes: cacheStats.sizeBytes,\n };\n }\n\n // Simple hash for content deduplication\n private hashContent(content: string): string {\n const cached = this.hashCache.get(content);\n if (cached) return cached;\n\n // FNV-1a hash\n let hash = 2166136261;\n for (let i = 0; i < content.length; i++) {\n hash ^= content.charCodeAt(i);\n hash = (hash * 16777619) >>> 0;\n }\n\n const hashStr = hash.toString(36);\n this.hashCache.set(content, hashStr);\n\n // Limit hash cache size\n if (this.hashCache.size > 10000) {\n const first = this.hashCache.keys().next().value;\n if (first) this.hashCache.delete(first);\n }\n\n return hashStr;\n }\n}\n\n// ============================================================================\n// Result Cache for WASM Operations\n// ============================================================================\n\n/**\n * Result cache for expensive WASM operations\n *\n * Caches:\n * - Formula parse results\n * - Cook results\n * - Graph analysis results (topo sort, cycle detection)\n */\nexport class ResultCache {\n readonly formulas: LRUCache<string, unknown>;\n readonly cooked: LRUCache<string, unknown>;\n readonly beads: LRUCache<string, unknown>;\n readonly convoys: LRUCache<string, unknown>;\n readonly graphs: LRUCache<string, unknown>;\n\n constructor(options: {\n maxFormulaEntries?: number;\n maxCookedEntries?: number;\n maxBeadEntries?: number;\n maxConvoyEntries?: number;\n maxGraphEntries?: number;\n } = {}) {\n this.formulas = new LRUCache({\n maxEntries: options.maxFormulaEntries ?? 200,\n ttlMs: 10 * 60 * 1000, // 10 min\n });\n\n this.cooked = new LRUCache({\n maxEntries: options.maxCookedEntries ?? 500,\n ttlMs: 5 * 60 * 1000, // 5 min\n });\n\n this.beads = new LRUCache({\n maxEntries: options.maxBeadEntries ?? 1000,\n ttlMs: 60 * 1000, // 1 min - beads change frequently\n });\n\n this.convoys = new LRUCache({\n maxEntries: options.maxConvoyEntries ?? 100,\n ttlMs: 30 * 1000, // 30 sec - convoys update often\n });\n\n this.graphs = new LRUCache({\n maxEntries: options.maxGraphEntries ?? 100,\n ttlMs: 2 * 60 * 1000, // 2 min\n });\n }\n\n /**\n * Clear all caches\n */\n clearAll(): void {\n this.formulas.clear();\n this.cooked.clear();\n this.beads.clear();\n this.convoys.clear();\n this.graphs.clear();\n }\n\n /**\n * Get combined stats\n */\n stats(): Record<string, { entries: number; sizeBytes: number }> {\n return {\n formulas: this.formulas.stats(),\n cooked: this.cooked.stats(),\n beads: this.beads.stats(),\n convoys: this.convoys.stats(),\n graphs: this.graphs.stats(),\n };\n }\n}\n\n// ============================================================================\n// Batch Deduplication for Concurrent Requests\n// ============================================================================\n\n/**\n * Pending request tracker for batch deduplication\n */\ninterface PendingRequest<T> {\n promise: Promise<T>;\n resolvers: Array<{\n resolve: (value: T) => void;\n reject: (error: unknown) => void;\n }>;\n startedAt: number;\n}\n\n/**\n * Batch deduplicator for concurrent identical requests\n *\n * When multiple callers request the same operation simultaneously,\n * only one actual execution occurs and all callers receive the same result.\n *\n * @example\n * ```typescript\n * const dedup = new BatchDeduplicator<Formula>();\n *\n * // These concurrent calls will only execute once\n * const [r1, r2, r3] = await Promise.all([\n * dedup.dedupe('formula-1', () => parseFormula(content)),\n * dedup.dedupe('formula-1', () => parseFormula(content)),\n * dedup.dedupe('formula-1', () => parseFormula(content)),\n * ]);\n * ```\n */\nexport class BatchDeduplicator<T> {\n private pending: Map<string, PendingRequest<T>> = new Map();\n private readonly timeoutMs: number;\n\n constructor(timeoutMs = 30000) {\n this.timeoutMs = timeoutMs;\n }\n\n /**\n * Deduplicate concurrent requests for the same key\n */\n async dedupe(key: string, executor: () => Promise<T>): Promise<T> {\n // Check for existing pending request\n const existing = this.pending.get(key);\n if (existing) {\n // Join existing request\n return new Promise<T>((resolve, reject) => {\n existing.resolvers.push({ resolve, reject });\n });\n }\n\n // Create new pending request\n let resolvers: PendingRequest<T>['resolvers'] = [];\n\n const promise = (async () => {\n try {\n const result = await executor();\n\n // Resolve all waiters\n for (const { resolve } of resolvers) {\n resolve(result);\n }\n\n return result;\n } catch (error) {\n // Reject all waiters\n for (const { reject } of resolvers) {\n reject(error);\n }\n throw error;\n } finally {\n this.pending.delete(key);\n }\n })();\n\n const pendingRequest: PendingRequest<T> = {\n promise,\n resolvers,\n startedAt: Date.now(),\n };\n\n this.pending.set(key, pendingRequest);\n\n // Set timeout to prevent stuck requests\n setTimeout(() => {\n const req = this.pending.get(key);\n if (req === pendingRequest) {\n this.pending.delete(key);\n for (const { reject } of req.resolvers) {\n reject(new Error(`Request timed out after ${this.timeoutMs}ms`));\n }\n }\n }, this.timeoutMs);\n\n return promise;\n }\n\n /**\n * Get number of pending requests\n */\n get pendingCount(): number {\n return this.pending.size;\n }\n\n /**\n * Clear all pending requests (reject with error)\n */\n clear(): void {\n for (const [key, req] of this.pending) {\n for (const { reject } of req.resolvers) {\n reject(new Error('Deduplicator cleared'));\n }\n }\n this.pending.clear();\n }\n}\n\n// ============================================================================\n// Preloader for Idle-Time Module Loading\n// ============================================================================\n\n/**\n * Idle-time module preloader\n *\n * Preloads WASM modules and other resources during browser/Node idle time.\n */\nexport class ModulePreloader {\n private readonly preloadQueue: Array<{\n name: string;\n loader: () => Promise<unknown>;\n priority: number;\n }> = [];\n\n private readonly loaded: Map<string, unknown> = new Map();\n private readonly errors: Map<string, Error> = new Map();\n private isPreloading = false;\n private preloadPromise: Promise<void> | null = null;\n\n /**\n * Register a module for preloading\n */\n register(\n name: string,\n loader: () => Promise<unknown>,\n priority = 0\n ): void {\n if (this.loaded.has(name)) return;\n\n this.preloadQueue.push({ name, loader, priority });\n this.preloadQueue.sort((a, b) => b.priority - a.priority);\n }\n\n /**\n * Start preloading during idle time\n */\n async startPreload(): Promise<void> {\n if (this.isPreloading || this.preloadQueue.length === 0) return;\n\n this.isPreloading = true;\n this.preloadPromise = this.runPreload();\n\n try {\n await this.preloadPromise;\n } finally {\n this.isPreloading = false;\n this.preloadPromise = null;\n }\n }\n\n /**\n * Get preloaded module\n */\n get<T>(name: string): T | undefined {\n return this.loaded.get(name) as T | undefined;\n }\n\n /**\n * Check if module is loaded\n */\n isLoaded(name: string): boolean {\n return this.loaded.has(name);\n }\n\n /**\n * Get loading error if any\n */\n getError(name: string): Error | undefined {\n return this.errors.get(name);\n }\n\n /**\n * Get preload status\n */\n status(): {\n queued: number;\n loaded: number;\n errors: number;\n isPreloading: boolean;\n } {\n return {\n queued: this.preloadQueue.length,\n loaded: this.loaded.size,\n errors: this.errors.size,\n isPreloading: this.isPreloading,\n };\n }\n\n /**\n * Wait for preloading to complete\n */\n async waitForPreload(): Promise<void> {\n if (this.preloadPromise) {\n await this.preloadPromise;\n }\n }\n\n private async runPreload(): Promise<void> {\n while (this.preloadQueue.length > 0) {\n const item = this.preloadQueue.shift();\n if (!item) break;\n\n // Use requestIdleCallback in browser, setImmediate in Node\n await this.scheduleIdleTask(async () => {\n try {\n const module = await item.loader();\n this.loaded.set(item.name, module);\n } catch (error) {\n this.errors.set(item.name, error as Error);\n }\n });\n }\n }\n\n private scheduleIdleTask(task: () => Promise<void>): Promise<void> {\n return new Promise((resolve) => {\n if (typeof requestIdleCallback !== 'undefined') {\n requestIdleCallback(async () => {\n await task();\n resolve();\n });\n } else if (typeof setImmediate !== 'undefined') {\n setImmediate(async () => {\n await task();\n resolve();\n });\n } else {\n setTimeout(async () => {\n await task();\n resolve();\n }, 0);\n }\n });\n }\n}\n\n// ============================================================================\n// Connection Pool for CLI Execution\n// ============================================================================\n\n/**\n * Pooled resource wrapper\n */\ninterface PooledResource<T> {\n resource: T;\n inUse: boolean;\n createdAt: number;\n lastUsedAt: number;\n useCount: number;\n}\n\n/**\n * Generic connection/resource pool\n *\n * Manages a pool of reusable resources like CLI processes or connections.\n */\nexport class ResourcePool<T> {\n private pool: PooledResource<T>[] = [];\n private waitQueue: Array<{\n resolve: (resource: T) => void;\n reject: (error: Error) => void;\n timeoutId: NodeJS.Timeout;\n }> = [];\n\n private readonly create: () => Promise<T>;\n private readonly destroy: (resource: T) => Promise<void>;\n private readonly validate: (resource: T) => boolean;\n\n private readonly minSize: number;\n private readonly maxSize: number;\n private readonly acquireTimeoutMs: number;\n private readonly idleTimeoutMs: number;\n\n constructor(options: {\n create: () => Promise<T>;\n destroy: (resource: T) => Promise<void>;\n validate?: (resource: T) => boolean;\n minSize?: number;\n maxSize?: number;\n acquireTimeoutMs?: number;\n idleTimeoutMs?: number;\n }) {\n this.create = options.create;\n this.destroy = options.destroy;\n this.validate = options.validate ?? (() => true);\n this.minSize = options.minSize ?? 1;\n this.maxSize = options.maxSize ?? 10;\n this.acquireTimeoutMs = options.acquireTimeoutMs ?? 5000;\n this.idleTimeoutMs = options.idleTimeoutMs ?? 60000;\n\n // Start idle cleanup timer\n setInterval(() => this.cleanupIdle(), this.idleTimeoutMs / 2);\n }\n\n /**\n * Acquire a resource from the pool\n */\n async acquire(): Promise<T> {\n // Try to find an available resource\n for (const pooled of this.pool) {\n if (!pooled.inUse && this.validate(pooled.resource)) {\n pooled.inUse = true;\n pooled.lastUsedAt = Date.now();\n pooled.useCount++;\n return pooled.resource;\n }\n }\n\n // Create new resource if under max\n if (this.pool.length < this.maxSize) {\n const resource = await this.create();\n const pooled: PooledResource<T> = {\n resource,\n inUse: true,\n createdAt: Date.now(),\n lastUsedAt: Date.now(),\n useCount: 1,\n };\n this.pool.push(pooled);\n return resource;\n }\n\n // Wait for available resource\n return new Promise((resolve, reject) => {\n const timeoutId = setTimeout(() => {\n const index = this.waitQueue.findIndex((w) => w.resolve === resolve);\n if (index !== -1) {\n this.waitQueue.splice(index, 1);\n }\n reject(new Error('Acquire timeout'));\n }, this.acquireTimeoutMs);\n\n this.waitQueue.push({ resolve, reject, timeoutId });\n });\n }\n\n /**\n * Release a resource back to the pool\n */\n release(resource: T): void {\n const pooled = this.pool.find((p) => p.resource === resource);\n if (!pooled) return;\n\n pooled.inUse = false;\n pooled.lastUsedAt = Date.now();\n\n // Check if anyone is waiting\n if (this.waitQueue.length > 0) {\n const waiter = this.waitQueue.shift();\n if (waiter && this.validate(resource)) {\n clearTimeout(waiter.timeoutId);\n pooled.inUse = true;\n pooled.useCount++;\n waiter.resolve(resource);\n }\n }\n }\n\n /**\n * Execute with automatic acquire/release\n */\n async withResource<R>(fn: (resource: T) => Promise<R>): Promise<R> {\n const resource = await this.acquire();\n try {\n return await fn(resource);\n } finally {\n this.release(resource);\n }\n }\n\n /**\n * Get pool stats\n */\n stats(): {\n total: number;\n inUse: number;\n available: number;\n waiting: number;\n } {\n const inUse = this.pool.filter((p) => p.inUse).length;\n return {\n total: this.pool.length,\n inUse,\n available: this.pool.length - inUse,\n waiting: this.waitQueue.length,\n };\n }\n\n /**\n * Shutdown the pool\n */\n async shutdown(): Promise<void> {\n // Reject all waiters\n for (const waiter of this.waitQueue) {\n clearTimeout(waiter.timeoutId);\n waiter.reject(new Error('Pool shutdown'));\n }\n this.waitQueue = [];\n\n // Destroy all resources\n for (const pooled of this.pool) {\n try {\n await this.destroy(pooled.resource);\n } catch {\n // Ignore destruction errors\n }\n }\n this.pool = [];\n }\n\n private async cleanupIdle(): Promise<void> {\n const now = Date.now();\n const toRemove: PooledResource<T>[] = [];\n\n for (const pooled of this.pool) {\n if (\n !pooled.inUse &&\n now - pooled.lastUsedAt > this.idleTimeoutMs &&\n this.pool.length > this.minSize\n ) {\n toRemove.push(pooled);\n }\n }\n\n for (const pooled of toRemove) {\n const index = this.pool.indexOf(pooled);\n if (index !== -1) {\n this.pool.splice(index, 1);\n try {\n await this.destroy(pooled.resource);\n } catch {\n // Ignore\n }\n }\n }\n }\n}\n\n// ============================================================================\n// Debounced Progress Updates\n// ============================================================================\n\n/**\n * Debounced update emitter\n *\n * Batches rapid updates and emits at most once per interval.\n */\nexport class DebouncedEmitter<T> {\n private pending: T | null = null;\n private timeoutId: NodeJS.Timeout | null = null;\n private lastEmitTime = 0;\n\n constructor(\n private readonly emit: (value: T) => void,\n private readonly debounceMs: number = 100\n ) {}\n\n /**\n * Schedule an update (debounced)\n */\n update(value: T): void {\n this.pending = value;\n\n const now = Date.now();\n const timeSinceLastEmit = now - this.lastEmitTime;\n\n // If enough time has passed, emit immediately\n if (timeSinceLastEmit >= this.debounceMs) {\n this.flush();\n return;\n }\n\n // Otherwise, schedule for later\n if (!this.timeoutId) {\n this.timeoutId = setTimeout(() => {\n this.flush();\n }, this.debounceMs - timeSinceLastEmit);\n }\n }\n\n /**\n * Flush pending update immediately\n */\n flush(): void {\n if (this.timeoutId) {\n clearTimeout(this.timeoutId);\n this.timeoutId = null;\n }\n\n if (this.pending !== null) {\n this.emit(this.pending);\n this.pending = null;\n this.lastEmitTime = Date.now();\n }\n }\n\n /**\n * Cancel pending update\n */\n cancel(): void {\n if (this.timeoutId) {\n clearTimeout(this.timeoutId);\n this.timeoutId = null;\n }\n this.pending = null;\n }\n}\n\n// ============================================================================\n// Lazy Parser - Parse on Access\n// ============================================================================\n\n/**\n * Lazy value wrapper - computes value on first access\n */\nexport class Lazy<T> {\n private computed = false;\n private value: T | undefined;\n private error: Error | undefined;\n\n constructor(private readonly factory: () => T) {}\n\n /**\n * Get the value (computes on first access)\n */\n get(): T {\n if (!this.computed) {\n try {\n this.value = this.factory();\n } catch (e) {\n this.error = e as Error;\n }\n this.computed = true;\n }\n\n if (this.error) {\n throw this.error;\n }\n\n return this.value!;\n }\n\n /**\n * Check if value has been computed\n */\n get isComputed(): boolean {\n return this.computed;\n }\n\n /**\n * Reset to uncomputed state\n */\n reset(): void {\n this.computed = false;\n this.value = undefined;\n this.error = undefined;\n }\n}\n\n/**\n * Async lazy value wrapper\n */\nexport class AsyncLazy<T> {\n private promise: Promise<T> | null = null;\n private value: T | undefined;\n private resolved = false;\n\n constructor(private readonly factory: () => Promise<T>) {}\n\n /**\n * Get the value (computes on first access)\n */\n async get(): Promise<T> {\n if (this.resolved) {\n return this.value!;\n }\n\n if (!this.promise) {\n this.promise = this.factory().then((v) => {\n this.value = v;\n this.resolved = true;\n return v;\n });\n }\n\n return this.promise;\n }\n\n /**\n * Check if value has been resolved\n */\n get isResolved(): boolean {\n return this.resolved;\n }\n\n /**\n * Reset to uncomputed state\n */\n reset(): void {\n this.promise = null;\n this.value = undefined;\n this.resolved = false;\n }\n}\n\n// ============================================================================\n// Exports\n// ============================================================================\n\nexport default {\n LRUCache,\n FormulaASTCache,\n ResultCache,\n BatchDeduplicator,\n ModulePreloader,\n ResourcePool,\n DebouncedEmitter,\n Lazy,\n AsyncLazy,\n};\n","/**\n * Gas Town CLI Bridge\n *\n * Provides a secure wrapper around the `gt` (Gas Town) CLI tool.\n * Implements command execution with proper input sanitization,\n * argument validation, and error handling.\n *\n * Security Features:\n * - All inputs validated with Zod schemas\n * - No shell execution (uses execFile)\n * - Command allowlist enforcement\n * - Argument sanitization\n *\n * @module v3/plugins/gastown-bridge/bridges/gt-bridge\n */\n\nimport { execFile } from 'child_process';\nimport { promisify } from 'util';\nimport { z } from 'zod';\n\nimport {\n LRUCache,\n BatchDeduplicator,\n Lazy,\n} from '../cache.js';\n\nconst execFileAsync = promisify(execFile);\n\n// ============================================================================\n// Performance Caches\n// ============================================================================\n\n/** Result cache for memoizing expensive CLI calls */\nconst resultCache = new LRUCache<string, GtResult<string>>({\n maxEntries: 200,\n ttlMs: 30 * 1000, // 30 sec TTL (gas prices change frequently)\n});\n\n/** Longer cache for static data like tx status */\nconst staticCache = new LRUCache<string, unknown>({\n maxEntries: 500,\n ttlMs: 5 * 60 * 1000, // 5 min TTL\n});\n\n/** Deduplicator for concurrent identical CLI calls */\nconst execDedup = new BatchDeduplicator<GtResult<string>>();\n\n/** Lazy parsed output cache */\nconst parsedCache = new LRUCache<string, unknown>({\n maxEntries: 500,\n ttlMs: 60 * 1000, // 1 min TTL\n});\n\n/**\n * FNV-1a hash for cache keys\n */\nfunction hashArgs(args: string[]): string {\n let hash = 2166136261;\n for (const arg of args) {\n for (let i = 0; i < arg.length; i++) {\n hash ^= arg.charCodeAt(i);\n hash = (hash * 16777619) >>> 0;\n }\n hash ^= 0xff; // separator\n }\n return hash.toString(36);\n}\n\n// ============================================================================\n// Zod Validation Schemas\n// ============================================================================\n\n/**\n * Safe string pattern - no shell metacharacters\n */\nconst SafeStringSchema = z.string()\n .max(1024, 'String too long')\n .refine(\n (val) => !/[;&|`$(){}><\\n\\r\\0]/.test(val),\n 'String contains shell metacharacters'\n );\n\n/**\n * Safe identifier pattern - alphanumeric with underscore/hyphen\n */\nconst IdentifierSchema = z.string()\n .min(1, 'Identifier cannot be empty')\n .max(64, 'Identifier too long')\n .regex(/^[a-zA-Z][a-zA-Z0-9_-]*$/, 'Invalid identifier format');\n\n/**\n * Gas price schema\n */\nconst GasPriceSchema = z.number()\n .positive('Gas price must be positive')\n .max(1_000_000, 'Gas price exceeds maximum');\n\n/**\n * Gas limit schema\n */\nconst GasLimitSchema = z.number()\n .int('Gas limit must be an integer')\n .positive('Gas limit must be positive')\n .max(30_000_000, 'Gas limit exceeds maximum');\n\n/**\n * Transaction hash schema (0x prefixed hex)\n */\nconst TxHashSchema = z.string()\n .regex(/^0x[a-fA-F0-9]{64}$/, 'Invalid transaction hash format');\n\n/**\n * Address schema (0x prefixed hex)\n */\nconst AddressSchema = z.string()\n .regex(/^0x[a-fA-F0-9]{40}$/, 'Invalid address format');\n\n/**\n * Network schema\n */\nconst NetworkSchema = z.enum([\n 'mainnet',\n 'goerli',\n 'sepolia',\n 'polygon',\n 'arbitrum',\n 'optimism',\n 'base',\n 'local',\n]);\n\n/**\n * GT command argument schema\n */\nconst GtArgumentSchema = z.string()\n .max(512, 'Argument too long')\n .refine(\n (val) => !val.includes('\\0'),\n 'Argument contains null byte'\n )\n .refine(\n (val) => !/[;&|`$(){}><]/.test(val),\n 'Argument contains shell metacharacters'\n );\n\n// ============================================================================\n// Types\n// ============================================================================\n\n/**\n * Gas Town executor configuration\n */\nexport interface GtBridgeConfig {\n /**\n * Path to gt executable\n * Default: 'gt' (assumes in PATH)\n */\n gtPath?: string;\n\n /**\n * Working directory for execution\n */\n cwd?: string;\n\n /**\n * Execution timeout in milliseconds\n * Default: 30000 (30 seconds)\n */\n timeout?: number;\n\n /**\n * Maximum buffer size for output\n * Default: 10MB\n */\n maxBuffer?: number;\n\n /**\n * Environment variables\n */\n env?: NodeJS.ProcessEnv;\n\n /**\n * Default network\n */\n defaultNetwork?: z.infer<typeof NetworkSchema>;\n}\n\n/**\n * Gas estimation result\n */\nexport interface GasEstimate {\n gasLimit: number;\n gasPrice: string;\n maxFeePerGas?: string;\n maxPriorityFeePerGas?: string;\n estimatedCost: string;\n estimatedCostUsd?: number;\n}\n\n/**\n * Transaction status\n */\nexport interface TxStatus {\n hash: string;\n status: 'pending' | 'confirmed' | 'failed' | 'dropped';\n blockNumber?: number;\n confirmations?: number;\n gasUsed?: number;\n effectiveGasPrice?: string;\n error?: string;\n}\n\n/**\n * Network status\n */\nexport interface NetworkStatus {\n network: string;\n chainId: number;\n blockNumber: number;\n baseFee?: string;\n gasPrice?: string;\n connected: boolean;\n}\n\n/**\n * GT execution result\n */\nexport interface GtResult<T = unknown> {\n success: boolean;\n data?: T;\n error?: string;\n command: string;\n args: string[];\n durationMs: number;\n}\n\n/**\n * Logger interface\n */\nexport interface GtLogger {\n debug: (msg: string, meta?: Record<string, unknown>) => void;\n info: (msg: string, meta?: Record<string, unknown>) => void;\n warn: (msg: string, meta?: Record<string, unknown>) => void;\n error: (msg: string, meta?: Record<string, unknown>) => void;\n}\n\n// ============================================================================\n// Errors\n// ============================================================================\n\n/**\n * Gas Town bridge error codes\n */\nexport type GtErrorCode =\n | 'COMMAND_NOT_FOUND'\n | 'EXECUTION_FAILED'\n | 'TIMEOUT'\n | 'INVALID_ARGUMENT'\n | 'INVALID_OUTPUT'\n | 'NETWORK_ERROR'\n | 'VALIDATION_ERROR';\n\n/**\n * Gas Town bridge error\n */\nexport class GtBridgeError extends Error {\n constructor(\n message: string,\n public readonly code: GtErrorCode,\n public readonly command?: string,\n public readonly args?: string[],\n public readonly cause?: Error\n ) {\n super(message);\n this.name = 'GtBridgeError';\n }\n}\n\n// ============================================================================\n// Default Logger\n// ============================================================================\n\nconst defaultLogger: GtLogger = {\n debug: (msg, meta) => console.debug(`[gt-bridge] ${msg}`, meta ?? ''),\n info: (msg, meta) => console.info(`[gt-bridge] ${msg}`, meta ?? ''),\n warn: (msg, meta) => console.warn(`[gt-bridge] ${msg}`, meta ?? ''),\n error: (msg, meta) => console.error(`[gt-bridge] ${msg}`, meta ?? ''),\n};\n\n// ============================================================================\n// Allowed Commands\n// ============================================================================\n\n/**\n * Allowed gt subcommands (allowlist)\n */\nconst ALLOWED_GT_COMMANDS = new Set([\n 'estimate',\n 'status',\n 'network',\n 'price',\n 'tx',\n 'simulate',\n 'decode',\n 'encode',\n 'help',\n 'version',\n 'config',\n]);\n\n// ============================================================================\n// Gas Town Bridge Implementation\n// ============================================================================\n\n/**\n * Gas Town CLI Bridge\n *\n * Secure wrapper around the `gt` CLI tool for gas estimation\n * and transaction management.\n *\n * @example\n * ```typescript\n * const gtBridge = new GtBridge({ gtPath: '/usr/local/bin/gt' });\n * await gtBridge.initialize();\n *\n * const estimate = await gtBridge.estimateGas({\n * to: '0x...',\n * data: '0x...',\n * network: 'mainnet',\n * });\n * ```\n */\nexport class GtBridge {\n private config: Required<GtBridgeConfig>;\n private logger: GtLogger;\n private initialized = false;\n\n /** Commands that can be cached (read-only, no side effects) */\n private static readonly CACHEABLE_COMMANDS = new Set([\n 'version',\n 'status',\n 'price',\n 'decode',\n 'help',\n 'config',\n ]);\n\n /** Commands that should use longer cache (static data) */\n private static readonly STATIC_COMMANDS = new Set([\n 'version',\n 'help',\n 'decode',\n ]);\n\n constructor(config?: GtBridgeConfig, logger?: GtLogger) {\n this.config = {\n gtPath: config?.gtPath ?? 'gt',\n cwd: config?.cwd ?? process.cwd(),\n timeout: config?.timeout ?? 30000,\n maxBuffer: config?.maxBuffer ?? 10 * 1024 * 1024,\n env: config?.env ?? process.env,\n defaultNetwork: config?.defaultNetwork ?? 'mainnet',\n };\n this.logger = logger ?? defaultLogger;\n }\n\n /**\n * Initialize the bridge and verify gt is available\n */\n async initialize(): Promise<void> {\n try {\n const result = await this.execGt(['version']);\n if (!result.success) {\n throw new GtBridgeError(\n 'Failed to verify gt installation',\n 'COMMAND_NOT_FOUND',\n 'gt',\n ['version']\n );\n }\n this.initialized = true;\n this.logger.info('Gas Town bridge initialized', {\n gtPath: this.config.gtPath,\n version: result.data,\n });\n } catch (error) {\n if (error instanceof GtBridgeError) throw error;\n throw new GtBridgeError(\n 'Failed to initialize Gas Town bridge',\n 'COMMAND_NOT_FOUND',\n 'gt',\n ['version'],\n error as Error\n );\n }\n }\n\n /**\n * Execute a gt command with validated arguments\n *\n * @param args - Command arguments (validated and sanitized)\n * @returns Command output\n */\n async execGt(args: string[], skipCache = false): Promise<GtResult<string>> {\n const startTime = Date.now();\n\n // Validate all arguments\n const validatedArgs = this.validateAndSanitizeArgs(args);\n\n // Validate subcommand is allowed\n const subcommand = validatedArgs[0];\n if (subcommand && !ALLOWED_GT_COMMANDS.has(subcommand)) {\n throw new GtBridgeError(\n `Command not allowed: ${subcommand}`,\n 'INVALID_ARGUMENT',\n 'gt',\n validatedArgs\n );\n }\n\n // Check cache for cacheable commands\n const cacheKey = hashArgs(validatedArgs);\n const isCacheable = !skipCache && subcommand && GtBridge.CACHEABLE_COMMANDS.has(subcommand);\n const isStatic = subcommand && GtBridge.STATIC_COMMANDS.has(subcommand);\n\n if (isCacheable) {\n const cached = isStatic\n ? staticCache.get(cacheKey) as GtResult<string> | undefined\n : resultCache.get(cacheKey);\n if (cached) {\n this.logger.debug('Cache hit for gt command', { command: subcommand });\n return {\n ...cached,\n durationMs: 0, // Cached result\n };\n }\n }\n\n // Use deduplication for concurrent identical calls\n return execDedup.dedupe(cacheKey, async () => {\n try {\n this.logger.debug('Executing gt command', {\n command: 'gt',\n args: validatedArgs,\n });\n\n const { stdout, stderr } = await execFileAsync(\n this.config.gtPath,\n validatedArgs,\n {\n cwd: this.config.cwd,\n env: this.config.env,\n timeout: this.config.timeout,\n maxBuffer: this.config.maxBuffer,\n shell: false, // CRITICAL: Never use shell\n windowsHide: true,\n }\n );\n\n const durationMs = Date.now() - startTime;\n\n if (stderr && stderr.trim()) {\n this.logger.warn('gt stderr output', { stderr });\n }\n\n const result: GtResult<string> = {\n success: true,\n data: stdout.trim(),\n command: 'gt',\n args: validatedArgs,\n durationMs,\n };\n\n // Cache successful results\n if (isCacheable && result.success) {\n if (isStatic) {\n staticCache.set(cacheKey, result);\n } else {\n resultCache.set(cacheKey, result);\n }\n }\n\n return result;\n } catch (error: unknown) {\n const durationMs = Date.now() - startTime;\n const err = error as NodeJS.ErrnoException & {\n killed?: boolean;\n stdout?: string;\n stderr?: string;\n };\n\n if (err.killed) {\n throw new GtBridgeError(\n 'Command execution timed out',\n 'TIMEOUT',\n 'gt',\n validatedArgs\n );\n }\n\n if (err.code === 'ENOENT') {\n throw new GtBridgeError(\n `gt executable not found at: ${this.config.gtPath}`,\n 'COMMAND_NOT_FOUND',\n 'gt',\n validatedArgs\n );\n }\n\n return {\n success: false,\n error: err.stderr || err.message,\n command: 'gt',\n args: validatedArgs,\n durationMs,\n };\n }\n });\n }\n\n /**\n * Parse JSON output from gt command\n *\n * @param output - Raw command output\n * @returns Parsed JSON object\n */\n parseGtOutput<T>(output: string): T {\n if (!output || output.trim() === '') {\n throw new GtBridgeError(\n 'Empty output from gt command',\n 'INVALID_OUTPUT'\n );\n }\n\n // Check parsed cache first\n const cacheKey = hashArgs([output]);\n const cached = parsedCache.get(cacheKey);\n if (cached !== undefined) {\n return cached as T;\n }\n\n try {\n // Try to parse as JSON\n const parsed = JSON.parse(output) as T;\n parsedCache.set(cacheKey, parsed);\n return parsed;\n } catch {\n // If not JSON, try to extract JSON from output\n const jsonMatch = output.match(/\\{[\\s\\S]*\\}|\\[[\\s\\S]*\\]/);\n if (jsonMatch) {\n try {\n const parsed = JSON.parse(jsonMatch[0]) as T;\n parsedCache.set(cacheKey, parsed);\n return parsed;\n } catch {\n throw new GtBridgeError(\n 'Failed to parse gt output as JSON',\n 'INVALID_OUTPUT'\n );\n }\n }\n\n throw new GtBridgeError(\n 'Output is not valid JSON',\n 'INVALID_OUTPUT'\n );\n }\n }\n\n /**\n * Estimate gas for a transaction\n */\n async estimateGas(params: {\n to: string;\n data?: string;\n value?: string;\n from?: string;\n network?: z.infer<typeof NetworkSchema>;\n }): Promise<GasEstimate> {\n this.ensureInitialized();\n\n // Validate parameters\n const validatedTo = AddressSchema.parse(params.to);\n const network = params.network ?? this.config.defaultNetwork;\n\n const args = ['estimate', '--to', validatedTo, '--network', network, '--json'];\n\n if (params.data) {\n const validatedData = SafeStringSchema.parse(params.data);\n args.push('--data', validatedData);\n }\n\n if (params.value) {\n const validatedValue = SafeStringSchema.parse(params.value);\n args.push('--value', validatedValue);\n }\n\n if (params.from) {\n const validatedFrom = AddressSchema.parse(params.from);\n args.push('--from', validatedFrom);\n }\n\n const result = await this.execGt(args);\n if (!result.success || !result.data) {\n throw new GtBridgeError(\n result.error ?? 'Gas estimation failed',\n 'EXECUTION_FAILED',\n 'gt',\n args\n );\n }\n\n return this.parseGtOutput<GasEstimate>(result.data);\n }\n\n /**\n * Get transaction status\n */\n async getTxStatus(txHash: string, network?: z.infer<typeof NetworkSchema>): Promise<TxStatus> {\n this.ensureInitialized();\n\n const validatedHash = TxHashSchema.parse(txHash);\n const args = [\n 'tx',\n 'status',\n validatedHash,\n '--network',\n network ?? this.config.defaultNetwork,\n '--json',\n ];\n\n const result = await this.execGt(args);\n if (!result.success || !result.data) {\n throw new GtBridgeError(\n result.error ?? 'Failed to get transaction status',\n 'EXECUTION_FAILED',\n 'gt',\n args\n );\n }\n\n return this.parseGtOutput<TxStatus>(result.data);\n }\n\n /**\n * Get network status\n */\n async getNetworkStatus(network?: z.infer<typeof NetworkSchema>): Promise<NetworkStatus> {\n this.ensureInitialized();\n\n const args = [\n 'network',\n 'status',\n '--network',\n network ?? this.config.defaultNetwork,\n '--json',\n ];\n\n const result = await this.execGt(args);\n if (!result.success || !result.data) {\n throw new GtBridgeError(\n result.error ?? 'Failed to get network status',\n 'NETWORK_ERROR',\n 'gt',\n args\n );\n }\n\n return this.parseGtOutput<NetworkStatus>(result.data);\n }\n\n /**\n * Get current gas price\n */\n async getGasPrice(network?: z.infer<typeof NetworkSchema>): Promise<{\n gasPrice: string;\n maxFeePerGas?: string;\n maxPriorityFeePerGas?: string;\n baseFee?: string;\n }> {\n this.ensureInitialized();\n\n const args = [\n 'price',\n '--network',\n network ?? this.config.defaultNetwork,\n '--json',\n ];\n\n const result = await this.execGt(args);\n if (!result.success || !result.data) {\n throw new GtBridgeError(\n result.error ?? 'Failed to get gas price',\n 'EXECUTION_FAILED',\n 'gt',\n args\n );\n }\n\n return this.parseGtOutput(result.data);\n }\n\n /**\n * Simulate a transaction\n */\n async simulate(params: {\n to: string;\n data: string;\n value?: string;\n from?: string;\n network?: z.infer<typeof NetworkSchema>;\n blockNumber?: number;\n }): Promise<{\n success: boolean;\n returnData?: string;\n gasUsed?: number;\n logs?: unknown[];\n error?: string;\n }> {\n this.ensureInitialized();\n\n const validatedTo = AddressSchema.parse(params.to);\n const validatedData = SafeStringSchema.parse(params.data);\n const network = params.network ?? this.config.defaultNetwork;\n\n const args = [\n 'simulate',\n '--to', validatedTo,\n '--data', validatedData,\n '--network', network,\n '--json',\n ];\n\n if (params.value) {\n args.push('--value', SafeStringSchema.parse(params.value));\n }\n\n if (params.from) {\n args.push('--from', AddressSchema.parse(params.from));\n }\n\n if (params.blockNumber !== undefined) {\n args.push('--block', String(params.blockNumber));\n }\n\n const result = await this.execGt(args);\n if (!result.success || !result.data) {\n throw new GtBridgeError(\n result.error ?? 'Transaction simulation failed',\n 'EXECUTION_FAILED',\n 'gt',\n args\n );\n }\n\n return this.parseGtOutput(result.data);\n }\n\n /**\n * Decode transaction data\n */\n async decode(data: string, abi?: string): Promise<{\n method: string;\n args: unknown[];\n signature: string;\n }> {\n this.ensureInitialized();\n\n const validatedData = SafeStringSchema.parse(data);\n const args = ['decode', validatedData, '--json'];\n\n if (abi) {\n const validatedAbi = SafeStringSchema.parse(abi);\n args.push('--abi', validatedAbi);\n }\n\n const result = await this.execGt(args);\n if (!result.success || !result.data) {\n throw new GtBridgeError(\n result.error ?? 'Failed to decode transaction data',\n 'EXECUTION_FAILED',\n 'gt',\n args\n );\n }\n\n return this.parseGtOutput(result.data);\n }\n\n /**\n * Validate and sanitize command arguments\n */\n private validateAndSanitizeArgs(args: string[]): string[] {\n return args.map((arg, index) => {\n try {\n return GtArgumentSchema.parse(arg);\n } catch (error) {\n throw new GtBridgeError(\n `Invalid argument at index ${index}: ${arg}`,\n 'VALIDATION_ERROR',\n 'gt',\n args,\n error as Error\n );\n }\n });\n }\n\n /**\n * Ensure bridge is initialized\n */\n private ensureInitialized(): void {\n if (!this.initialized) {\n throw new GtBridgeError(\n 'Gas Town bridge not initialized. Call initialize() first.',\n 'EXECUTION_FAILED'\n );\n }\n }\n\n /**\n * Check if bridge is initialized\n */\n isInitialized(): boolean {\n return this.initialized;\n }\n\n /**\n * Get current configuration\n */\n getConfig(): Readonly<Required<GtBridgeConfig>> {\n return { ...this.config };\n }\n\n /**\n * Get cache statistics for performance monitoring\n */\n getCacheStats(): {\n resultCache: { entries: number; sizeBytes: number };\n staticCache: { entries: number; sizeBytes: number };\n parsedCache: { entries: number; sizeBytes: number };\n } {\n return {\n resultCache: resultCache.stats(),\n staticCache: staticCache.stats(),\n parsedCache: parsedCache.stats(),\n };\n }\n\n /**\n * Clear all caches (useful for testing or memory pressure)\n */\n clearCaches(): void {\n resultCache.clear();\n staticCache.clear();\n parsedCache.clear();\n }\n}\n\n/**\n * Create a new Gas Town bridge instance\n */\nexport function createGtBridge(config?: GtBridgeConfig, logger?: GtLogger): GtBridge {\n return new GtBridge(config, logger);\n}\n\n// Export schemas for external use\nexport {\n SafeStringSchema,\n IdentifierSchema,\n GasPriceSchema,\n GasLimitSchema,\n TxHashSchema,\n AddressSchema,\n NetworkSchema,\n GtArgumentSchema,\n};\n\nexport default GtBridge;\n","/**\n * Beads CLI Bridge\n *\n * Provides a secure wrapper around the `bd` (Beads) CLI tool.\n * Implements command execution with proper input sanitization,\n * argument validation, JSONL parsing, and error handling.\n *\n * Security Features:\n * - All inputs validated with Zod schemas\n * - No shell execution (uses execFile)\n * - Command allowlist enforcement\n * - Argument sanitization\n * - JSONL streaming support\n *\n * @module v3/plugins/gastown-bridge/bridges/bd-bridge\n */\n\nimport { execFile, spawn, ChildProcess } from 'child_process';\nimport { promisify } from 'util';\nimport { z } from 'zod';\n\nimport {\n LRUCache,\n BatchDeduplicator,\n Lazy,\n} from '../cache.js';\n\nconst execFileAsync = promisify(execFile);\n\n// ============================================================================\n// Performance Caches\n// ============================================================================\n\n/** Result cache for memoizing bead queries */\nconst beadQueryCache = new LRUCache<string, Bead[]>({\n maxEntries: 100,\n ttlMs: 30 * 1000, // 30 sec TTL (beads may change)\n});\n\n/** Single bead cache */\nconst singleBeadCache = new LRUCache<string, Bead>({\n maxEntries: 500,\n ttlMs: 60 * 1000, // 1 min TTL\n});\n\n/** Static data cache (version, stats) */\nconst staticCache = new LRUCache<string, unknown>({\n maxEntries: 50,\n ttlMs: 5 * 60 * 1000, // 5 min TTL\n});\n\n/** Deduplicator for concurrent CLI calls */\nconst execDedup = new BatchDeduplicator<BdResult<string>>();\n\n/** Parsed JSONL cache */\nconst parsedCache = new LRUCache<string, Bead[]>({\n maxEntries: 100,\n ttlMs: 30 * 1000,\n});\n\n/**\n * FNV-1a hash for cache keys\n */\nfunction hashArgs(args: string[]): string {\n let hash = 2166136261;\n for (const arg of args) {\n for (let i = 0; i < arg.length; i++) {\n hash ^= arg.charCodeAt(i);\n hash = (hash * 16777619) >>> 0;\n }\n hash ^= 0xff; // separator\n }\n return hash.toString(36);\n}\n\n// ============================================================================\n// Zod Validation Schemas\n// ============================================================================\n\n/**\n * Safe string pattern - no shell metacharacters\n */\nconst SafeStringSchema = z.string()\n .max(4096, 'String too long')\n .refine(\n (val) => !/[;&|`$(){}><\\n\\r\\0]/.test(val),\n 'String contains shell metacharacters'\n );\n\n/**\n * Safe identifier pattern\n */\nconst IdentifierSchema = z.string()\n .min(1, 'Identifier cannot be empty')\n .max(128, 'Identifier too long')\n .regex(/^[a-zA-Z][a-zA-Z0-9_-]*$/, 'Invalid identifier format');\n\n/**\n * Bead ID schema (UUID or custom format)\n */\nconst BeadIdSchema = z.string()\n .min(1, 'Bead ID cannot be empty')\n .max(64, 'Bead ID too long')\n .regex(/^[a-zA-Z0-9_-]+$/, 'Invalid bead ID format');\n\n/**\n * Bead type schema\n */\nconst BeadTypeSchema = z.enum([\n 'prompt',\n 'response',\n 'code',\n 'context',\n 'memory',\n 'tool-call',\n 'tool-result',\n 'system',\n 'error',\n 'metadata',\n]);\n\n/**\n * Bead schema\n */\nexport const BeadSchema = z.object({\n id: BeadIdSchema,\n type: BeadTypeSchema,\n content: z.string(),\n timestamp: z.string().datetime().optional(),\n metadata: z.record(z.unknown()).optional(),\n parentId: BeadIdSchema.optional(),\n threadId: z.string().optional(),\n agentId: z.string().optional(),\n tags: z.array(z.string()).optional(),\n embedding: z.array(z.number()).optional(),\n hash: z.string().optional(),\n});\n\n/**\n * BD command argument schema\n */\nconst BdArgumentSchema = z.string()\n .max(1024, 'Argument too long')\n .refine(\n (val) => !val.includes('\\0'),\n 'Argument contains null byte'\n )\n .refine(\n (val) => !/[;&|`$(){}><]/.test(val),\n 'Argument contains shell metacharacters'\n );\n\n// ============================================================================\n// Types\n// ============================================================================\n\n/**\n * Bead type (inferred from schema)\n */\nexport type Bead = z.infer<typeof BeadSchema>;\n\n/**\n * Bead type enum\n */\nexport type BeadType = z.infer<typeof BeadTypeSchema>;\n\n/**\n * Beads bridge configuration\n */\nexport interface BdBridgeConfig {\n /**\n * Path to bd executable\n * Default: 'bd' (assumes in PATH)\n */\n bdPath?: string;\n\n /**\n * Working directory for execution\n */\n cwd?: string;\n\n /**\n * Execution timeout in milliseconds\n * Default: 60000 (60 seconds)\n */\n timeout?: number;\n\n /**\n * Maximum buffer size for output\n * Default: 50MB (beads can be large)\n */\n maxBuffer?: number;\n\n /**\n * Environment variables\n */\n env?: NodeJS.ProcessEnv;\n\n /**\n * Default storage path\n */\n storagePath?: string;\n}\n\n/**\n * Bead query parameters\n */\nexport interface BeadQuery {\n type?: BeadType | BeadType[];\n threadId?: string;\n agentId?: string;\n tags?: string[];\n after?: string; // ISO timestamp\n before?: string; // ISO timestamp\n limit?: number;\n offset?: number;\n sortBy?: 'timestamp' | 'id' | 'type';\n sortOrder?: 'asc' | 'desc';\n}\n\n/**\n * Bead creation parameters\n */\nexport interface CreateBeadParams {\n type: BeadType;\n content: string;\n parentId?: string;\n threadId?: string;\n agentId?: string;\n tags?: string[];\n metadata?: Record<string, unknown>;\n}\n\n/**\n * BD execution result\n */\nexport interface BdResult<T = unknown> {\n success: boolean;\n data?: T;\n error?: string;\n command: string;\n args: string[];\n durationMs: number;\n}\n\n/**\n * Streaming execution result\n */\nexport interface BdStreamResult {\n process: ChildProcess;\n stdout: NodeJS.ReadableStream | null;\n stderr: NodeJS.ReadableStream | null;\n promise: Promise<BdResult<string>>;\n}\n\n/**\n * Logger interface\n */\nexport interface BdLogger {\n debug: (msg: string, meta?: Record<string, unknown>) => void;\n info: (msg: string, meta?: Record<string, unknown>) => void;\n warn: (msg: string, meta?: Record<string, unknown>) => void;\n error: (msg: string, meta?: Record<string, unknown>) => void;\n}\n\n// ============================================================================\n// Errors\n// ============================================================================\n\n/**\n * Beads bridge error codes\n */\nexport type BdErrorCode =\n | 'COMMAND_NOT_FOUND'\n | 'EXECUTION_FAILED'\n | 'TIMEOUT'\n | 'INVALID_ARGUMENT'\n | 'INVALID_OUTPUT'\n | 'PARSE_ERROR'\n | 'VALIDATION_ERROR'\n | 'BEAD_NOT_FOUND';\n\n/**\n * Beads bridge error\n */\nexport class BdBridgeError extends Error {\n constructor(\n message: string,\n public readonly code: BdErrorCode,\n public readonly command?: string,\n public readonly args?: string[],\n public readonly cause?: Error\n ) {\n super(message);\n this.name = 'BdBridgeError';\n }\n}\n\n// ============================================================================\n// Default Logger\n// ============================================================================\n\nconst defaultLogger: BdLogger = {\n debug: (msg, meta) => console.debug(`[bd-bridge] ${msg}`, meta ?? ''),\n info: (msg, meta) => console.info(`[bd-bridge] ${msg}`, meta ?? ''),\n warn: (msg, meta) => console.warn(`[bd-bridge] ${msg}`, meta ?? ''),\n error: (msg, meta) => console.error(`[bd-bridge] ${msg}`, meta ?? ''),\n};\n\n// ============================================================================\n// Allowed Commands\n// ============================================================================\n\n/**\n * Allowed bd subcommands (allowlist)\n */\nconst ALLOWED_BD_COMMANDS = new Set([\n 'list',\n 'get',\n 'create',\n 'update',\n 'delete',\n 'search',\n 'export',\n 'import',\n 'thread',\n 'stats',\n 'help',\n 'version',\n 'config',\n 'sync',\n]);\n\n// ============================================================================\n// Beads Bridge Implementation\n// ============================================================================\n\n/**\n * Beads CLI Bridge\n *\n * Secure wrapper around the `bd` CLI tool for bead management.\n * Supports JSONL output parsing for streaming large datasets.\n *\n * @example\n * ```typescript\n * const bdBridge = new BdBridge({ bdPath: '/usr/local/bin/bd' });\n * await bdBridge.initialize();\n *\n * const beads = await bdBridge.listBeads({ type: 'prompt', limit: 100 });\n * ```\n */\nexport class BdBridge {\n private config: Required<BdBridgeConfig>;\n private logger: BdLogger;\n private initialized = false;\n\n /** Commands that can be cached (read-only, no side effects) */\n private static readonly CACHEABLE_COMMANDS = new Set([\n 'list',\n 'get',\n 'search',\n 'stats',\n 'version',\n 'help',\n 'config',\n ]);\n\n /** Commands that should use longer cache (static data) */\n private static readonly STATIC_COMMANDS = new Set([\n 'version',\n 'help',\n 'stats',\n 'config',\n ]);\n\n constructor(config?: BdBridgeConfig, logger?: BdLogger) {\n this.config = {\n bdPath: config?.bdPath ?? 'bd',\n cwd: config?.cwd ?? process.cwd(),\n timeout: config?.timeout ?? 60000,\n maxBuffer: config?.maxBuffer ?? 50 * 1024 * 1024,\n env: config?.env ?? process.env,\n storagePath: config?.storagePath ?? '',\n };\n this.logger = logger ?? defaultLogger;\n }\n\n /**\n * Initialize the bridge and verify bd is available\n */\n async initialize(): Promise<void> {\n try {\n const result = await this.execBd(['version']);\n if (!result.success) {\n throw new BdBridgeError(\n 'Failed to verify bd installation',\n 'COMMAND_NOT_FOUND',\n 'bd',\n ['version']\n );\n }\n this.initialized = true;\n this.logger.info('Beads bridge initialized', {\n bdPath: this.config.bdPath,\n version: result.data,\n });\n } catch (error) {\n if (error instanceof BdBridgeError) throw error;\n throw new BdBridgeError(\n 'Failed to initialize Beads bridge',\n 'COMMAND_NOT_FOUND',\n 'bd',\n ['version'],\n error as Error\n );\n }\n }\n\n /**\n * Execute a bd command with validated arguments\n *\n * @param args - Command arguments (validated and sanitized)\n * @returns Command output\n */\n async execBd(args: string[], skipCache = false): Promise<BdResult<string>> {\n const startTime = Date.now();\n\n // Validate all arguments\n const validatedArgs = this.validateAndSanitizeArgs(args);\n\n // Validate subcommand is allowed\n const subcommand = validatedArgs[0];\n if (subcommand && !ALLOWED_BD_COMMANDS.has(subcommand)) {\n throw new BdBridgeError(\n `Command not allowed: ${subcommand}`,\n 'INVALID_ARGUMENT',\n 'bd',\n validatedArgs\n );\n }\n\n // Check cache for cacheable commands\n const cacheKey = hashArgs(validatedArgs);\n const isCacheable = !skipCache && subcommand && BdBridge.CACHEABLE_COMMANDS.has(subcommand);\n const isStatic = subcommand && BdBridge.STATIC_COMMANDS.has(subcommand);\n\n if (isCacheable) {\n const cached = staticCache.get(cacheKey) as BdResult<string> | undefined;\n if (cached) {\n this.logger.debug('Cache hit for bd command', { command: subcommand });\n return {\n ...cached,\n durationMs: 0, // Cached result\n };\n }\n }\n\n // Use deduplication for concurrent identical calls\n return execDedup.dedupe(cacheKey, async () => {\n try {\n this.logger.debug('Executing bd command', {\n command: 'bd',\n args: validatedArgs,\n });\n\n const { stdout, stderr } = await execFileAsync(\n this.config.bdPath,\n validatedArgs,\n {\n cwd: this.config.cwd,\n env: this.config.env,\n timeout: this.config.timeout,\n maxBuffer: this.config.maxBuffer,\n shell: false, // CRITICAL: Never use shell\n windowsHide: true,\n }\n );\n\n const durationMs = Date.now() - startTime;\n\n if (stderr && stderr.trim()) {\n this.logger.warn('bd stderr output', { stderr });\n }\n\n const result: BdResult<string> = {\n success: true,\n data: stdout.trim(),\n command: 'bd',\n args: validatedArgs,\n durationMs,\n };\n\n // Cache successful results\n if (isCacheable && result.success) {\n staticCache.set(cacheKey, result);\n }\n\n return result;\n } catch (error: unknown) {\n const durationMs = Date.now() - startTime;\n const err = error as NodeJS.ErrnoException & {\n killed?: boolean;\n stdout?: string;\n stderr?: string;\n };\n\n if (err.killed) {\n throw new BdBridgeError(\n 'Command execution timed out',\n 'TIMEOUT',\n 'bd',\n validatedArgs\n );\n }\n\n if (err.code === 'ENOENT') {\n throw new BdBridgeError(\n `bd executable not found at: ${this.config.bdPath}`,\n 'COMMAND_NOT_FOUND',\n 'bd',\n validatedArgs\n );\n }\n\n return {\n success: false,\n error: err.stderr || err.message,\n command: 'bd',\n args: validatedArgs,\n durationMs,\n };\n }\n });\n }\n\n /**\n * Execute bd command with streaming output\n */\n execBdStreaming(args: string[]): BdStreamResult {\n const startTime = Date.now();\n\n // Validate all arguments\n const validatedArgs = this.validateAndSanitizeArgs(args);\n\n // Validate subcommand is allowed\n const subcommand = validatedArgs[0];\n if (subcommand && !ALLOWED_BD_COMMANDS.has(subcommand)) {\n throw new BdBridgeError(\n `Command not allowed: ${subcommand}`,\n 'INVALID_ARGUMENT',\n 'bd',\n validatedArgs\n );\n }\n\n this.logger.debug('Executing bd command (streaming)', {\n command: 'bd',\n args: validatedArgs,\n });\n\n const childProcess = spawn(this.config.bdPath, validatedArgs, {\n cwd: this.config.cwd,\n env: this.config.env,\n timeout: this.config.timeout,\n shell: false, // CRITICAL: Never use shell\n windowsHide: true,\n });\n\n const promise = new Promise<BdResult<string>>((resolve, reject) => {\n let stdout = '';\n let stderr = '';\n\n childProcess.stdout?.on('data', (data: Buffer) => {\n stdout += data.toString();\n });\n\n childProcess.stderr?.on('data', (data: Buffer) => {\n stderr += data.toString();\n });\n\n childProcess.on('close', (code) => {\n const durationMs = Date.now() - startTime;\n if (code === 0) {\n resolve({\n success: true,\n data: stdout.trim(),\n command: 'bd',\n args: validatedArgs,\n durationMs,\n });\n } else {\n resolve({\n success: false,\n error: stderr || `Process exited with code ${code}`,\n command: 'bd',\n args: validatedArgs,\n durationMs,\n });\n }\n });\n\n childProcess.on('error', (error) => {\n reject(new BdBridgeError(\n error.message,\n 'EXECUTION_FAILED',\n 'bd',\n validatedArgs\n ));\n });\n });\n\n return {\n process: childProcess,\n stdout: childProcess.stdout,\n stderr: childProcess.stderr,\n promise,\n };\n }\n\n /**\n * Parse JSONL output from bd command into Bead array\n *\n * @param output - JSONL formatted output\n * @returns Array of parsed and validated beads\n */\n parseBdOutput(output: string): Bead[] {\n if (!output || output.trim() === '') {\n return [];\n }\n\n // Check parsed cache first\n const cacheKey = hashArgs([output]);\n const cached = parsedCache.get(cacheKey);\n if (cached) {\n return cached;\n }\n\n const lines = output.trim().split('\\n');\n const beads: Bead[] = [];\n const errors: Array<{ line: number; error: string }> = [];\n\n for (let i = 0; i < lines.length; i++) {\n const line = lines[i]?.trim();\n if (!line) continue;\n\n try {\n const parsed = JSON.parse(line);\n const validated = BeadSchema.parse(parsed);\n beads.push(validated);\n\n // Also cache individual beads\n singleBeadCache.set(validated.id, validated);\n } catch (error) {\n errors.push({\n line: i + 1,\n error: error instanceof Error ? error.message : String(error),\n });\n }\n }\n\n if (errors.length > 0) {\n this.logger.warn('Some beads failed to parse', {\n totalLines: lines.length,\n parsed: beads.length,\n errors: errors.length,\n firstErrors: errors.slice(0, 3),\n });\n }\n\n // Cache the parsed result\n parsedCache.set(cacheKey, beads);\n\n return beads;\n }\n\n /**\n * Parse single bead from JSON output\n */\n parseSingleBead(output: string): Bead {\n if (!output || output.trim() === '') {\n throw new BdBridgeError(\n 'Empty output from bd command',\n 'INVALID_OUTPUT'\n );\n }\n\n try {\n const parsed = JSON.parse(output);\n return BeadSchema.parse(parsed);\n } catch (error) {\n throw new BdBridgeError(\n 'Failed to parse bead output',\n 'PARSE_ERROR',\n undefined,\n undefined,\n error as Error\n );\n }\n }\n\n /**\n * List beads with optional query parameters\n */\n async listBeads(query?: BeadQuery): Promise<Bead[]> {\n this.ensureInitialized();\n\n const args = ['list', '--format', 'jsonl'];\n\n if (query?.type) {\n const types = Array.isArray(query.type) ? query.type : [query.type];\n for (const type of types) {\n args.push('--type', type);\n }\n }\n\n if (query?.threadId) {\n args.push('--thread', SafeStringSchema.parse(query.threadId));\n }\n\n if (query?.agentId) {\n args.push('--agent', SafeStringSchema.parse(query.agentId));\n }\n\n if (query?.tags && query.tags.length > 0) {\n for (const tag of query.tags) {\n args.push('--tag', SafeStringSchema.parse(tag));\n }\n }\n\n if (query?.after) {\n args.push('--after', query.after);\n }\n\n if (query?.before) {\n args.push('--before', query.before);\n }\n\n if (query?.limit !== undefined) {\n args.push('--limit', String(Math.min(query.limit, 10000)));\n }\n\n if (query?.offset !== undefined) {\n args.push('--offset', String(query.offset));\n }\n\n if (query?.sortBy) {\n args.push('--sort', query.sortBy);\n }\n\n if (query?.sortOrder) {\n args.push('--order', query.sortOrder);\n }\n\n const result = await this.execBd(args);\n if (!result.success) {\n throw new BdBridgeError(\n result.error ?? 'Failed to list beads',\n 'EXECUTION_FAILED',\n 'bd',\n args\n );\n }\n\n return this.parseBdOutput(result.data ?? '');\n }\n\n /**\n * Get a single bead by ID\n */\n async getBead(beadId: string): Promise<Bead> {\n this.ensureInitialized();\n\n const validatedId = BeadIdSchema.parse(beadId);\n\n // Check single bead cache first\n const cached = singleBeadCache.get(validatedId);\n if (cached) {\n this.logger.debug('Bead cache hit', { beadId: validatedId });\n return cached;\n }\n\n const args = ['get', validatedId, '--format', 'json'];\n\n const result = await this.execBd(args);\n if (!result.success) {\n if (result.error?.includes('not found')) {\n throw new BdBridgeError(\n `Bead not found: ${beadId}`,\n 'BEAD_NOT_FOUND',\n 'bd',\n args\n );\n }\n throw new BdBridgeError(\n result.error ?? 'Failed to get bead',\n 'EXECUTION_FAILED',\n 'bd',\n args\n );\n }\n\n const bead = this.parseSingleBead(result.data ?? '');\n\n // Cache the result\n singleBeadCache.set(bead.id, bead);\n\n return bead;\n }\n\n /**\n * Create a new bead\n */\n async createBead(params: CreateBeadParams): Promise<Bead> {\n this.ensureInitialized();\n\n const args = [\n 'create',\n '--type', params.type,\n '--content', SafeStringSchema.parse(params.content),\n '--format', 'json',\n ];\n\n if (params.parentId) {\n args.push('--parent', BeadIdSchema.parse(params.parentId));\n }\n\n if (params.threadId) {\n args.push('--thread', SafeStringSchema.parse(params.threadId));\n }\n\n if (params.agentId) {\n args.push('--agent', SafeStringSchema.parse(params.agentId));\n }\n\n if (params.tags && params.tags.length > 0) {\n for (const tag of params.tags) {\n args.push('--tag', SafeStringSchema.parse(tag));\n }\n }\n\n if (params.metadata) {\n args.push('--metadata', JSON.stringify(params.metadata));\n }\n\n const result = await this.execBd(args);\n if (!result.success) {\n throw new BdBridgeError(\n result.error ?? 'Failed to create bead',\n 'EXECUTION_FAILED',\n 'bd',\n args\n );\n }\n\n return this.parseSingleBead(result.data ?? '');\n }\n\n /**\n * Search beads with semantic query\n */\n async searchBeads(query: string, options?: {\n limit?: number;\n threshold?: number;\n type?: BeadType | BeadType[];\n }): Promise<Bead[]> {\n this.ensureInitialized();\n\n const args = [\n 'search',\n SafeStringSchema.parse(query),\n '--format', 'jsonl',\n ];\n\n if (options?.limit !== undefined) {\n args.push('--limit', String(Math.min(options.limit, 1000)));\n }\n\n if (options?.threshold !== undefined) {\n args.push('--threshold', String(options.threshold));\n }\n\n if (options?.type) {\n const types = Array.isArray(options.type) ? options.type : [options.type];\n for (const type of types) {\n args.push('--type', type);\n }\n }\n\n const result = await this.execBd(args);\n if (!result.success) {\n throw new BdBridgeError(\n result.error ?? 'Bead search failed',\n 'EXECUTION_FAILED',\n 'bd',\n args\n );\n }\n\n return this.parseBdOutput(result.data ?? '');\n }\n\n /**\n * Export beads to JSONL format\n */\n async exportBeads(query?: BeadQuery): Promise<string> {\n this.ensureInitialized();\n\n const args = ['export', '--format', 'jsonl'];\n\n if (query?.threadId) {\n args.push('--thread', SafeStringSchema.parse(query.threadId));\n }\n\n if (query?.after) {\n args.push('--after', query.after);\n }\n\n if (query?.before) {\n args.push('--before', query.before);\n }\n\n const result = await this.execBd(args);\n if (!result.success) {\n throw new BdBridgeError(\n result.error ?? 'Export failed',\n 'EXECUTION_FAILED',\n 'bd',\n args\n );\n }\n\n return result.data ?? '';\n }\n\n /**\n * Get bead statistics\n */\n async getStats(): Promise<{\n totalBeads: number;\n beadsByType: Record<string, number>;\n totalThreads: number;\n oldestBead?: string;\n newestBead?: string;\n storageSize?: number;\n }> {\n this.ensureInitialized();\n\n const args = ['stats', '--format', 'json'];\n\n const result = await this.execBd(args);\n if (!result.success) {\n throw new BdBridgeError(\n result.error ?? 'Failed to get stats',\n 'EXECUTION_FAILED',\n 'bd',\n args\n );\n }\n\n try {\n return JSON.parse(result.data ?? '{}');\n } catch {\n throw new BdBridgeError(\n 'Failed to parse stats output',\n 'PARSE_ERROR',\n 'bd',\n args\n );\n }\n }\n\n /**\n * Validate and sanitize command arguments\n */\n private validateAndSanitizeArgs(args: string[]): string[] {\n return args.map((arg, index) => {\n try {\n return BdArgumentSchema.parse(arg);\n } catch (error) {\n throw new BdBridgeError(\n `Invalid argument at index ${index}: ${arg}`,\n 'VALIDATION_ERROR',\n 'bd',\n args,\n error as Error\n );\n }\n });\n }\n\n /**\n * Ensure bridge is initialized\n */\n private ensureInitialized(): void {\n if (!this.initialized) {\n throw new BdBridgeError(\n 'Beads bridge not initialized. Call initialize() first.',\n 'EXECUTION_FAILED'\n );\n }\n }\n\n /**\n * Check if bridge is initialized\n */\n isInitialized(): boolean {\n return this.initialized;\n }\n\n /**\n * Get current configuration\n */\n getConfig(): Readonly<Required<BdBridgeConfig>> {\n return { ...this.config };\n }\n\n /**\n * Get cache statistics for performance monitoring\n */\n getCacheStats(): {\n beadQueryCache: { entries: number; sizeBytes: number };\n singleBeadCache: { entries: number; sizeBytes: number };\n staticCache: { entries: number; sizeBytes: number };\n parsedCache: { entries: number; sizeBytes: number };\n } {\n return {\n beadQueryCache: beadQueryCache.stats(),\n singleBeadCache: singleBeadCache.stats(),\n staticCache: staticCache.stats(),\n parsedCache: parsedCache.stats(),\n };\n }\n\n /**\n * Clear all caches (useful for testing or memory pressure)\n */\n clearCaches(): void {\n beadQueryCache.clear();\n singleBeadCache.clear();\n staticCache.clear();\n parsedCache.clear();\n }\n\n /**\n * Invalidate cache for a specific bead (after create/update/delete)\n */\n invalidateBeadCache(beadId: string): void {\n singleBeadCache.delete(beadId);\n // Also clear query caches since they may contain stale data\n beadQueryCache.clear();\n parsedCache.clear();\n }\n}\n\n/**\n * Create a new Beads bridge instance\n */\nexport function createBdBridge(config?: BdBridgeConfig, logger?: BdLogger): BdBridge {\n return new BdBridge(config, logger);\n}\n\n// Export schemas for external use\nexport {\n SafeStringSchema,\n IdentifierSchema,\n BeadIdSchema,\n BeadTypeSchema,\n BdArgumentSchema,\n};\n\nexport default BdBridge;\n","/**\n * Beads-AgentDB Sync Bridge\n *\n * Provides bidirectional synchronization between Beads (bd)\n * and AgentDB. Implements conflict resolution strategies\n * and maintains consistency between the two systems.\n *\n * Features:\n * - Bidirectional sync (Beads <-> AgentDB)\n * - Conflict resolution strategies\n * - Incremental sync support\n * - Transaction-safe operations\n * - Embedding preservation\n *\n * @module v3/plugins/gastown-bridge/bridges/sync-bridge\n */\n\nimport { z } from 'zod';\nimport { BdBridge, createBdBridge, type Bead, type BeadType, type BdBridgeConfig } from './bd-bridge.js';\n\nimport {\n LRUCache,\n BatchDeduplicator,\n} from '../cache.js';\n\n// ============================================================================\n// Performance Caches\n// ============================================================================\n\n/** Cache for AgentDB lookups during sync */\nconst agentDBLookupCache = new LRUCache<string, AgentDBEntry | null>({\n maxEntries: 500,\n ttlMs: 30 * 1000, // 30 sec TTL\n});\n\n/** Cache for conflict detection results */\nconst conflictCache = new LRUCache<string, boolean>({\n maxEntries: 200,\n ttlMs: 10 * 1000, // 10 sec TTL\n});\n\n/** Deduplicator for concurrent sync operations */\nconst syncDedup = new BatchDeduplicator<SyncResult>();\n\n/**\n * FNV-1a hash for cache keys\n */\nfunction hashKey(parts: string[]): string {\n let hash = 2166136261;\n for (const part of parts) {\n for (let i = 0; i < part.length; i++) {\n hash ^= part.charCodeAt(i);\n hash = (hash * 16777619) >>> 0;\n }\n hash ^= 0xff;\n }\n return hash.toString(36);\n}\n\n// ============================================================================\n// Zod Validation Schemas\n// ============================================================================\n\n/**\n * Sync conflict resolution strategy\n */\nconst ConflictStrategySchema = z.enum([\n 'beads-wins', // Beads data takes precedence\n 'agentdb-wins', // AgentDB data takes precedence\n 'newest-wins', // Most recent timestamp wins\n 'merge', // Attempt to merge fields\n 'manual', // Flag for manual resolution\n]);\n\n/**\n * Sync direction\n */\nconst SyncDirectionSchema = z.enum([\n 'to-agentdb', // Beads -> AgentDB\n 'from-agentdb', // AgentDB -> Beads\n 'bidirectional', // Both directions\n]);\n\n/**\n * Sync status\n */\nconst SyncStatusSchema = z.enum([\n 'pending',\n 'in-progress',\n 'completed',\n 'failed',\n 'conflict',\n]);\n\n/**\n * AgentDB entry schema (compatible with claude-flow memory)\n */\nconst AgentDBEntrySchema = z.object({\n key: z.string(),\n value: z.unknown(),\n namespace: z.string().optional(),\n metadata: z.record(z.unknown()).optional(),\n embedding: z.array(z.number()).optional(),\n createdAt: z.string().datetime().optional(),\n updatedAt: z.string().datetime().optional(),\n version: z.number().optional(),\n});\n\n// ============================================================================\n// Types\n// ============================================================================\n\n/**\n * Conflict resolution strategy type\n */\nexport type ConflictStrategy = z.infer<typeof ConflictStrategySchema>;\n\n/**\n * Sync direction type\n */\nexport type SyncDirection = z.infer<typeof SyncDirectionSchema>;\n\n/**\n * Sync status type\n */\nexport type SyncStatus = z.infer<typeof SyncStatusSchema>;\n\n/**\n * AgentDB entry type\n */\nexport type AgentDBEntry = z.infer<typeof AgentDBEntrySchema>;\n\n/**\n * Sync bridge configuration\n */\nexport interface SyncBridgeConfig {\n /**\n * Beads bridge configuration\n */\n beadsBridge?: BdBridgeConfig;\n\n /**\n * AgentDB namespace for beads\n * Default: 'beads'\n */\n agentdbNamespace?: string;\n\n /**\n * Conflict resolution strategy\n * Default: 'newest-wins'\n */\n conflictStrategy?: ConflictStrategy;\n\n /**\n * Batch size for sync operations\n * Default: 100\n */\n batchSize?: number;\n\n /**\n * Whether to preserve embeddings during sync\n * Default: true\n */\n preserveEmbeddings?: boolean;\n\n /**\n * Whether to sync metadata\n * Default: true\n */\n syncMetadata?: boolean;\n}\n\n/**\n * Sync operation result\n */\nexport interface SyncResult {\n success: boolean;\n direction: SyncDirection;\n synced: number;\n created: number;\n updated: number;\n deleted: number;\n conflicts: number;\n errors: Array<{ id: string; error: string }>;\n durationMs: number;\n timestamp: string;\n}\n\n/**\n * Conflict record\n */\nexport interface SyncConflict {\n beadId: string;\n beadData: Bead;\n agentdbData: AgentDBEntry;\n conflictType: 'update' | 'delete' | 'create';\n resolution?: 'beads' | 'agentdb' | 'merged' | 'pending';\n resolvedAt?: string;\n}\n\n/**\n * Sync state for incremental sync\n */\nexport interface SyncState {\n lastSyncTime: string;\n lastBeadId?: string;\n lastAgentDBKey?: string;\n pendingConflicts: string[];\n version: number;\n}\n\n/**\n * AgentDB interface (to be provided by claude-flow)\n */\nexport interface IAgentDBService {\n store(key: string, value: unknown, namespace?: string, metadata?: Record<string, unknown>): Promise<void>;\n retrieve(key: string, namespace?: string): Promise<AgentDBEntry | null>;\n search(query: string, namespace?: string, limit?: number): Promise<AgentDBEntry[]>;\n list(namespace?: string, limit?: number, offset?: number): Promise<AgentDBEntry[]>;\n delete(key: string, namespace?: string): Promise<void>;\n getNamespaceStats(namespace: string): Promise<{ count: number; lastUpdated?: string }>;\n}\n\n/**\n * Logger interface\n */\nexport interface SyncLogger {\n debug: (msg: string, meta?: Record<string, unknown>) => void;\n info: (msg: string, meta?: Record<string, unknown>) => void;\n warn: (msg: string, meta?: Record<string, unknown>) => void;\n error: (msg: string, meta?: Record<string, unknown>) => void;\n}\n\n// ============================================================================\n// Errors\n// ============================================================================\n\n/**\n * Sync bridge error codes\n */\nexport type SyncErrorCode =\n | 'NOT_INITIALIZED'\n | 'SYNC_FAILED'\n | 'CONFLICT_UNRESOLVED'\n | 'AGENTDB_ERROR'\n | 'BEADS_ERROR'\n | 'VALIDATION_ERROR'\n | 'TRANSACTION_FAILED';\n\n/**\n * Sync bridge error\n */\nexport class SyncBridgeError extends Error {\n constructor(\n message: string,\n public readonly code: SyncErrorCode,\n public readonly details?: Record<string, unknown>,\n public readonly cause?: Error\n ) {\n super(message);\n this.name = 'SyncBridgeError';\n }\n}\n\n// ============================================================================\n// Default Logger\n// ============================================================================\n\nconst defaultLogger: SyncLogger = {\n debug: (msg, meta) => console.debug(`[sync-bridge] ${msg}`, meta ?? ''),\n info: (msg, meta) => console.info(`[sync-bridge] ${msg}`, meta ?? ''),\n warn: (msg, meta) => console.warn(`[sync-bridge] ${msg}`, meta ?? ''),\n error: (msg, meta) => console.error(`[sync-bridge] ${msg}`, meta ?? ''),\n};\n\n// ============================================================================\n// Sync Bridge Implementation\n// ============================================================================\n\n/**\n * Beads-AgentDB Sync Bridge\n *\n * Provides bidirectional synchronization between Beads and AgentDB\n * with configurable conflict resolution.\n *\n * @example\n * ```typescript\n * const syncBridge = new SyncBridge(agentDB, {\n * conflictStrategy: 'newest-wins',\n * agentdbNamespace: 'conversation-beads',\n * });\n * await syncBridge.initialize();\n *\n * // Sync beads to AgentDB\n * const result = await syncBridge.syncToAgentDB(beads);\n *\n * // Sync from AgentDB back to beads\n * const beads = await syncBridge.syncFromAgentDB();\n * ```\n */\nexport class SyncBridge {\n private bdBridge: BdBridge;\n private agentDB: IAgentDBService;\n private config: Required<SyncBridgeConfig>;\n private logger: SyncLogger;\n private initialized = false;\n private syncState: SyncState;\n private conflicts: Map<string, SyncConflict> = new Map();\n\n constructor(\n agentDB: IAgentDBService,\n config?: SyncBridgeConfig,\n logger?: SyncLogger\n ) {\n this.agentDB = agentDB;\n this.config = {\n beadsBridge: config?.beadsBridge ?? {},\n agentdbNamespace: config?.agentdbNamespace ?? 'beads',\n conflictStrategy: config?.conflictStrategy ?? 'newest-wins',\n batchSize: config?.batchSize ?? 100,\n preserveEmbeddings: config?.preserveEmbeddings ?? true,\n syncMetadata: config?.syncMetadata ?? true,\n };\n this.logger = logger ?? defaultLogger;\n this.bdBridge = createBdBridge(this.config.beadsBridge, {\n debug: (msg, meta) => this.logger.debug(`[bd] ${msg}`, meta),\n info: (msg, meta) => this.logger.info(`[bd] ${msg}`, meta),\n warn: (msg, meta) => this.logger.warn(`[bd] ${msg}`, meta),\n error: (msg, meta) => this.logger.error(`[bd] ${msg}`, meta),\n });\n this.syncState = {\n lastSyncTime: new Date(0).toISOString(),\n pendingConflicts: [],\n version: 1,\n };\n }\n\n /**\n * Initialize the sync bridge\n */\n async initialize(): Promise<void> {\n try {\n await this.bdBridge.initialize();\n\n // Load sync state from AgentDB if exists\n const savedState = await this.agentDB.retrieve(\n '_sync_state',\n this.config.agentdbNamespace\n );\n\n if (savedState?.value) {\n const parsed = savedState.value as SyncState;\n this.syncState = {\n lastSyncTime: parsed.lastSyncTime ?? new Date(0).toISOString(),\n lastBeadId: parsed.lastBeadId,\n lastAgentDBKey: parsed.lastAgentDBKey,\n pendingConflicts: parsed.pendingConflicts ?? [],\n version: (parsed.version ?? 0) + 1,\n };\n }\n\n this.initialized = true;\n this.logger.info('Sync bridge initialized', {\n namespace: this.config.agentdbNamespace,\n conflictStrategy: this.config.conflictStrategy,\n syncState: this.syncState,\n });\n } catch (error) {\n throw new SyncBridgeError(\n 'Failed to initialize sync bridge',\n 'NOT_INITIALIZED',\n undefined,\n error as Error\n );\n }\n }\n\n /**\n * Sync beads to AgentDB\n */\n async syncToAgentDB(beads: Bead[]): Promise<SyncResult> {\n this.ensureInitialized();\n\n const startTime = Date.now();\n const result: SyncResult = {\n success: true,\n direction: 'to-agentdb',\n synced: 0,\n created: 0,\n updated: 0,\n deleted: 0,\n conflicts: 0,\n errors: [],\n durationMs: 0,\n timestamp: new Date().toISOString(),\n };\n\n this.logger.info(`Starting sync to AgentDB: ${beads.length} beads`);\n\n // Process in batches with parallel lookups\n for (let i = 0; i < beads.length; i += this.config.batchSize) {\n const batch = beads.slice(i, i + this.config.batchSize);\n\n // Parallel lookup for all beads in batch\n const lookupPromises = batch.map(async (bead) => {\n const key = this.beadToKey(bead);\n const cacheKey = hashKey([key, this.config.agentdbNamespace]);\n\n // Check cache first\n if (agentDBLookupCache.has(cacheKey)) {\n return { bead, key, existing: agentDBLookupCache.get(cacheKey) };\n }\n\n const existing = await this.agentDB.retrieve(key, this.config.agentdbNamespace);\n agentDBLookupCache.set(cacheKey, existing);\n return { bead, key, existing };\n });\n\n const lookupResults = await Promise.all(lookupPromises);\n\n // Process results\n for (const { bead, key, existing } of lookupResults) {\n try {\n if (existing) {\n // Check for conflicts (use cache)\n const conflictCacheKey = hashKey([bead.id, bead.content, existing.key]);\n let hasConflict = conflictCache.get(conflictCacheKey);\n\n if (hasConflict === undefined) {\n hasConflict = await this.detectConflict(bead, existing);\n conflictCache.set(conflictCacheKey, hasConflict);\n }\n\n if (hasConflict) {\n const resolved = await this.resolveConflict(bead, existing);\n if (!resolved) {\n result.conflicts++;\n continue;\n }\n }\n result.updated++;\n } else {\n result.created++;\n }\n\n // Store bead in AgentDB\n await this.agentDB.store(\n key,\n this.beadToAgentDBValue(bead),\n this.config.agentdbNamespace,\n this.buildMetadata(bead)\n );\n\n // Invalidate lookup cache for this key\n const cacheKey = hashKey([key, this.config.agentdbNamespace]);\n agentDBLookupCache.delete(cacheKey);\n\n result.synced++;\n } catch (error) {\n result.errors.push({\n id: bead.id,\n error: error instanceof Error ? error.message : String(error),\n });\n this.logger.error(`Failed to sync bead ${bead.id}`, { error });\n }\n }\n }\n\n // Update sync state\n this.syncState.lastSyncTime = result.timestamp;\n if (beads.length > 0) {\n this.syncState.lastBeadId = beads[beads.length - 1]?.id;\n }\n await this.saveSyncState();\n\n result.durationMs = Date.now() - startTime;\n result.success = result.errors.length === 0 && result.conflicts === 0;\n\n this.logger.info('Sync to AgentDB complete', {\n synced: result.synced,\n created: result.created,\n updated: result.updated,\n conflicts: result.conflicts,\n errors: result.errors.length,\n durationMs: result.durationMs,\n });\n\n return result;\n }\n\n /**\n * Sync from AgentDB to Beads\n */\n async syncFromAgentDB(): Promise<Bead[]> {\n this.ensureInitialized();\n\n const startTime = Date.now();\n const beads: Bead[] = [];\n\n this.logger.info('Starting sync from AgentDB');\n\n try {\n // Get all entries from AgentDB namespace\n let offset = 0;\n let hasMore = true;\n\n while (hasMore) {\n const entries = await this.agentDB.list(\n this.config.agentdbNamespace,\n this.config.batchSize,\n offset\n );\n\n if (entries.length === 0) {\n hasMore = false;\n continue;\n }\n\n for (const entry of entries) {\n // Skip sync state entry\n if (entry.key === '_sync_state') continue;\n\n try {\n const bead = this.agentDBToBead(entry);\n if (bead) {\n beads.push(bead);\n }\n } catch (error) {\n this.logger.warn(`Failed to convert AgentDB entry to bead: ${entry.key}`, {\n error: error instanceof Error ? error.message : String(error),\n });\n }\n }\n\n offset += entries.length;\n hasMore = entries.length === this.config.batchSize;\n }\n\n // Update sync state\n this.syncState.lastSyncTime = new Date().toISOString();\n await this.saveSyncState();\n\n const durationMs = Date.now() - startTime;\n this.logger.info('Sync from AgentDB complete', {\n beads: beads.length,\n durationMs,\n });\n\n return beads;\n } catch (error) {\n throw new SyncBridgeError(\n 'Failed to sync from AgentDB',\n 'SYNC_FAILED',\n undefined,\n error as Error\n );\n }\n }\n\n /**\n * Perform full bidirectional sync\n */\n async syncBidirectional(): Promise<{\n toAgentDB: SyncResult;\n fromAgentDB: Bead[];\n }> {\n this.ensureInitialized();\n\n this.logger.info('Starting bidirectional sync');\n\n // First sync from beads to AgentDB\n const allBeads = await this.bdBridge.listBeads({\n after: this.syncState.lastSyncTime,\n });\n\n const toAgentDBResult = await this.syncToAgentDB(allBeads);\n\n // Then sync from AgentDB to beads\n const fromAgentDBBeads = await this.syncFromAgentDB();\n\n return {\n toAgentDB: toAgentDBResult,\n fromAgentDB: fromAgentDBBeads,\n };\n }\n\n /**\n * Get pending conflicts\n */\n getPendingConflicts(): SyncConflict[] {\n return Array.from(this.conflicts.values()).filter(\n c => c.resolution === 'pending' || !c.resolution\n );\n }\n\n /**\n * Resolve a specific conflict manually\n */\n async resolveConflictManually(\n beadId: string,\n resolution: 'beads' | 'agentdb' | 'merged',\n mergedData?: Partial<Bead>\n ): Promise<void> {\n const conflict = this.conflicts.get(beadId);\n if (!conflict) {\n throw new SyncBridgeError(\n `No conflict found for bead: ${beadId}`,\n 'VALIDATION_ERROR'\n );\n }\n\n const key = this.beadToKey(conflict.beadData);\n\n switch (resolution) {\n case 'beads':\n await this.agentDB.store(\n key,\n this.beadToAgentDBValue(conflict.beadData),\n this.config.agentdbNamespace,\n this.buildMetadata(conflict.beadData)\n );\n break;\n\n case 'agentdb':\n // AgentDB data is already stored, nothing to do\n break;\n\n case 'merged':\n if (!mergedData) {\n throw new SyncBridgeError(\n 'Merged data required for merge resolution',\n 'VALIDATION_ERROR'\n );\n }\n const merged = { ...conflict.beadData, ...mergedData };\n await this.agentDB.store(\n key,\n this.beadToAgentDBValue(merged as Bead),\n this.config.agentdbNamespace,\n this.buildMetadata(merged as Bead)\n );\n break;\n }\n\n conflict.resolution = resolution;\n conflict.resolvedAt = new Date().toISOString();\n\n // Remove from pending\n const pendingIndex = this.syncState.pendingConflicts.indexOf(beadId);\n if (pendingIndex !== -1) {\n this.syncState.pendingConflicts.splice(pendingIndex, 1);\n await this.saveSyncState();\n }\n\n this.logger.info(`Conflict resolved for bead ${beadId}`, { resolution });\n }\n\n /**\n * Get sync state\n */\n getSyncState(): Readonly<SyncState> {\n return { ...this.syncState };\n }\n\n /**\n * Get sync statistics\n */\n async getSyncStats(): Promise<{\n agentdbCount: number;\n lastSyncTime: string;\n pendingConflicts: number;\n syncVersion: number;\n }> {\n this.ensureInitialized();\n\n const stats = await this.agentDB.getNamespaceStats(this.config.agentdbNamespace);\n\n return {\n agentdbCount: stats.count,\n lastSyncTime: this.syncState.lastSyncTime,\n pendingConflicts: this.syncState.pendingConflicts.length,\n syncVersion: this.syncState.version,\n };\n }\n\n // ============================================================================\n // Private Methods\n // ============================================================================\n\n /**\n * Convert bead to AgentDB key\n */\n private beadToKey(bead: Bead): string {\n return `bead:${bead.id}`;\n }\n\n /**\n * Convert bead to AgentDB value\n */\n private beadToAgentDBValue(bead: Bead): Record<string, unknown> {\n const value: Record<string, unknown> = {\n id: bead.id,\n type: bead.type,\n content: bead.content,\n timestamp: bead.timestamp,\n parentId: bead.parentId,\n threadId: bead.threadId,\n agentId: bead.agentId,\n tags: bead.tags,\n hash: bead.hash,\n };\n\n if (this.config.preserveEmbeddings && bead.embedding) {\n value.embedding = bead.embedding;\n }\n\n if (this.config.syncMetadata && bead.metadata) {\n value.metadata = bead.metadata;\n }\n\n return value;\n }\n\n /**\n * Build metadata for AgentDB entry\n */\n private buildMetadata(bead: Bead): Record<string, unknown> {\n return {\n beadType: bead.type,\n threadId: bead.threadId,\n agentId: bead.agentId,\n syncedAt: new Date().toISOString(),\n syncVersion: this.syncState.version,\n };\n }\n\n /**\n * Convert AgentDB entry to Bead\n */\n private agentDBToBead(entry: AgentDBEntry): Bead | null {\n if (!entry.value || typeof entry.value !== 'object') {\n return null;\n }\n\n const data = entry.value as Record<string, unknown>;\n\n // Validate required fields\n if (!data.id || !data.type || !data.content) {\n return null;\n }\n\n return {\n id: String(data.id),\n type: data.type as BeadType,\n content: String(data.content),\n timestamp: data.timestamp as string | undefined,\n parentId: data.parentId as string | undefined,\n threadId: data.threadId as string | undefined,\n agentId: data.agentId as string | undefined,\n tags: data.tags as string[] | undefined,\n metadata: data.metadata as Record<string, unknown> | undefined,\n embedding: data.embedding as number[] | undefined,\n hash: data.hash as string | undefined,\n };\n }\n\n /**\n * Detect if there's a conflict between bead and AgentDB entry\n */\n private async detectConflict(bead: Bead, entry: AgentDBEntry): Promise<boolean> {\n if (!entry.value || typeof entry.value !== 'object') {\n return false;\n }\n\n const data = entry.value as Record<string, unknown>;\n\n // No conflict if content is the same\n if (data.content === bead.content) {\n return false;\n }\n\n // Check timestamps\n const beadTime = bead.timestamp ? new Date(bead.timestamp).getTime() : 0;\n const entryTime = entry.updatedAt ? new Date(entry.updatedAt).getTime() : 0;\n\n // If bead is newer, no conflict - it should update\n if (beadTime > entryTime) {\n return false;\n }\n\n // If AgentDB is newer and content differs, conflict\n if (entryTime > beadTime && data.content !== bead.content) {\n return true;\n }\n\n return false;\n }\n\n /**\n * Resolve conflict based on strategy\n */\n private async resolveConflict(bead: Bead, entry: AgentDBEntry): Promise<boolean> {\n const conflict: SyncConflict = {\n beadId: bead.id,\n beadData: bead,\n agentdbData: entry,\n conflictType: 'update',\n };\n\n switch (this.config.conflictStrategy) {\n case 'beads-wins':\n conflict.resolution = 'beads';\n this.conflicts.set(bead.id, conflict);\n return true;\n\n case 'agentdb-wins':\n conflict.resolution = 'agentdb';\n this.conflicts.set(bead.id, conflict);\n return false; // Don't update AgentDB\n\n case 'newest-wins': {\n const beadTime = bead.timestamp ? new Date(bead.timestamp).getTime() : 0;\n const entryTime = entry.updatedAt ? new Date(entry.updatedAt).getTime() : 0;\n\n if (beadTime >= entryTime) {\n conflict.resolution = 'beads';\n this.conflicts.set(bead.id, conflict);\n return true;\n } else {\n conflict.resolution = 'agentdb';\n this.conflicts.set(bead.id, conflict);\n return false;\n }\n }\n\n case 'merge': {\n // Simple merge: keep both contents with separator\n const entryData = entry.value as Record<string, unknown>;\n const mergedBead: Bead = {\n ...bead,\n content: `${bead.content}\\n---\\n${entryData.content}`,\n metadata: {\n ...bead.metadata,\n merged: true,\n mergedAt: new Date().toISOString(),\n },\n };\n conflict.beadData = mergedBead;\n conflict.resolution = 'merged';\n this.conflicts.set(bead.id, conflict);\n return true;\n }\n\n case 'manual':\n conflict.resolution = 'pending';\n this.conflicts.set(bead.id, conflict);\n this.syncState.pendingConflicts.push(bead.id);\n return false;\n\n default:\n return false;\n }\n }\n\n /**\n * Save sync state to AgentDB\n */\n private async saveSyncState(): Promise<void> {\n try {\n await this.agentDB.store(\n '_sync_state',\n this.syncState,\n this.config.agentdbNamespace,\n { type: 'sync-state' }\n );\n } catch (error) {\n this.logger.error('Failed to save sync state', {\n error: error instanceof Error ? error.message : String(error),\n });\n }\n }\n\n /**\n * Ensure bridge is initialized\n */\n private ensureInitialized(): void {\n if (!this.initialized) {\n throw new SyncBridgeError(\n 'Sync bridge not initialized. Call initialize() first.',\n 'NOT_INITIALIZED'\n );\n }\n }\n\n /**\n * Check if bridge is initialized\n */\n isInitialized(): boolean {\n return this.initialized;\n }\n\n /**\n * Get beads bridge instance\n */\n getBeadsBridge(): BdBridge {\n return this.bdBridge;\n }\n\n /**\n * Get cache statistics for performance monitoring\n */\n getCacheStats(): {\n agentDBLookupCache: { entries: number; sizeBytes: number };\n conflictCache: { entries: number; sizeBytes: number };\n } {\n return {\n agentDBLookupCache: agentDBLookupCache.stats(),\n conflictCache: conflictCache.stats(),\n };\n }\n\n /**\n * Clear all sync caches\n */\n clearCaches(): void {\n agentDBLookupCache.clear();\n conflictCache.clear();\n }\n}\n\n/**\n * Create a new sync bridge instance\n */\nexport function createSyncBridge(\n agentDB: IAgentDBService,\n config?: SyncBridgeConfig,\n logger?: SyncLogger\n): SyncBridge {\n return new SyncBridge(agentDB, config, logger);\n}\n\n// Export schemas for external use\nexport {\n ConflictStrategySchema,\n SyncDirectionSchema,\n SyncStatusSchema,\n AgentDBEntrySchema,\n};\n\nexport default SyncBridge;\n"]} |