@claude-flow/plugin-gastown-bridge 0.1.0 → 0.1.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +5 -2
- package/dist/bridges.cjs +1 -1
- package/dist/bridges.js +1 -1
- package/dist/{chunk-JU7XR5TR.cjs → chunk-CL5Y5TGX.cjs} +3 -3
- package/dist/{chunk-JU7XR5TR.cjs.map → chunk-CL5Y5TGX.cjs.map} +1 -1
- package/dist/{chunk-HACN5YC7.js → chunk-GTFAMI2F.js} +3 -3
- package/dist/{chunk-HACN5YC7.js.map → chunk-GTFAMI2F.js.map} +1 -1
- package/dist/index.cjs +6 -6
- package/dist/index.js +2 -2
- package/dist/wasm-loader.js +1 -1
- package/package.json +3 -2
|
@@ -1 +1 @@
|
|
|
1
|
-
{"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-HACN5YC7.js","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"]}
|
|
1
|
+
{"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-GTFAMI2F.js","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"]}
|