@claude-flow/plugin-gastown-bridge 0.1.2 → 0.1.4
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/bd-bridge-C9wTbkhi.d.cts +318 -0
- package/dist/bd-bridge-C9wTbkhi.d.ts +318 -0
- package/dist/bridges.cjs +1 -1
- package/dist/bridges.d.cts +5 -604
- package/dist/bridges.d.ts +5 -604
- package/dist/bridges.js +1 -1
- package/dist/chunk-2KNTWGUX.js +12 -0
- package/dist/chunk-2KNTWGUX.js.map +1 -0
- package/dist/chunk-46PJFOMY.cjs +11 -0
- package/dist/chunk-46PJFOMY.cjs.map +1 -0
- package/dist/chunk-7UPWLRZX.js +11 -0
- package/dist/chunk-7UPWLRZX.js.map +1 -0
- package/dist/chunk-7VD5N6NG.cjs +11 -0
- package/dist/chunk-7VD5N6NG.cjs.map +1 -0
- package/dist/chunk-EBOVUTYL.js +12 -0
- package/dist/chunk-EBOVUTYL.js.map +1 -0
- package/dist/chunk-I2TLUPMJ.cjs +12 -0
- package/dist/chunk-I2TLUPMJ.cjs.map +1 -0
- package/dist/chunk-Q7MLH722.cjs +11 -0
- package/dist/chunk-Q7MLH722.cjs.map +1 -0
- package/dist/chunk-QFMFM7NE.cjs +13 -0
- package/dist/chunk-QFMFM7NE.cjs.map +1 -0
- package/dist/chunk-SUKPSMVK.cjs +12 -0
- package/dist/chunk-SUKPSMVK.cjs.map +1 -0
- package/dist/chunk-TGFYZY3C.js +11 -0
- package/dist/chunk-TGFYZY3C.js.map +1 -0
- package/dist/chunk-U74VYTRV.js +11 -0
- package/dist/chunk-U74VYTRV.js.map +1 -0
- package/dist/chunk-UJ56JMNG.js +13 -0
- package/dist/chunk-UJ56JMNG.js.map +1 -0
- package/dist/convoy.cjs +2 -0
- package/dist/convoy.cjs.map +1 -0
- package/dist/convoy.d.cts +6 -0
- package/dist/convoy.d.ts +6 -0
- package/dist/convoy.js +2 -0
- package/dist/convoy.js.map +1 -0
- package/dist/formula.cjs +2 -0
- package/dist/formula.cjs.map +1 -0
- package/dist/formula.d.cts +317 -0
- package/dist/formula.d.ts +317 -0
- package/dist/formula.js +2 -0
- package/dist/formula.js.map +1 -0
- package/dist/gt-bridge-B7hZz5vC.d.cts +291 -0
- package/dist/gt-bridge-B7hZz5vC.d.ts +291 -0
- package/dist/index-BzkAx4ho.d.ts +785 -0
- package/dist/index-CGJs8eMa.d.cts +785 -0
- package/dist/index.cjs +8 -9
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +13 -2237
- package/dist/index.d.ts +13 -2237
- package/dist/index.js +8 -9
- package/dist/index.js.map +1 -1
- package/dist/types-CMoOZXrm.d.cts +1146 -0
- package/dist/types-CMoOZXrm.d.ts +1146 -0
- package/dist/wasm-loader.js +1 -1
- package/package.json +16 -20
- package/dist/chunk-2QQ3FUZF.cjs +0 -14
- package/dist/chunk-2QQ3FUZF.cjs.map +0 -1
- package/dist/chunk-GKNIKJVQ.js +0 -14
- package/dist/chunk-GKNIKJVQ.js.map +0 -1
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/bridges/gt-bridge.ts","../src/bridges/sync-bridge.ts"],"names":["execFileAsync","promisify","execFile","resultCache","LRUCache","staticCache","execDedup","BatchDeduplicator","parsedCache","hashArgs","args","hash","arg","i","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","result","error","skipCache","startTime","validatedArgs","subcommand","cacheKey","isCacheable","isStatic","cached","stdout","stderr","durationMs","err","output","parsed","jsonMatch","params","validatedTo","network","validatedData","validatedValue","validatedFrom","txHash","data","abi","validatedAbi","index","createGtBridge","agentDBLookupCache","conflictCache","hashKey","parts","part","ConflictStrategySchema","SyncDirectionSchema","SyncStatusSchema","AgentDBEntrySchema","SyncBridgeError","details","SyncBridge","agentDB","createBdBridge","savedState","beads","lookupPromises","bead","key","existing","lookupResults","conflictCacheKey","hasConflict","offset","hasMore","entries","entry","allBeads","toAgentDBResult","fromAgentDBBeads","c","beadId","resolution","mergedData","conflict","merged","pendingIndex","value","beadTime","entryTime","entryData","mergedBead","createSyncBridge"],"mappings":"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","file":"chunk-UJ56JMNG.js","sourcesContent":["/**\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-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"]}
|
package/dist/convoy.cjs
ADDED
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
'use strict';var chunkQ7MLH722_cjs=require('./chunk-Q7MLH722.cjs');Object.defineProperty(exports,"ConvoyObserver",{enumerable:true,get:function(){return chunkQ7MLH722_cjs.F}});Object.defineProperty(exports,"ConvoyTracker",{enumerable:true,get:function(){return chunkQ7MLH722_cjs.D}});Object.defineProperty(exports,"createConvoyObserver",{enumerable:true,get:function(){return chunkQ7MLH722_cjs.G}});Object.defineProperty(exports,"createConvoyTracker",{enumerable:true,get:function(){return chunkQ7MLH722_cjs.E}});Object.defineProperty(exports,"createLazyConvoyObserver",{enumerable:true,get:function(){return chunkQ7MLH722_cjs.H}});Object.defineProperty(exports,"getLazyObserverStats",{enumerable:true,get:function(){return chunkQ7MLH722_cjs.I}});//# sourceMappingURL=convoy.cjs.map
|
|
2
|
+
//# sourceMappingURL=convoy.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":[],"names":[],"mappings":"","file":"convoy.cjs"}
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
export { B as BlockerInfo, b as CompletionCallback, c as CompletionCheckResult, d as ConvoyEvent, e as ConvoyEventType, f as ConvoyLogger, a as ConvoyObserver, g as ConvoyObserverConfig, C as ConvoyTracker, h as ConvoyTrackerConfig, O as ObserverLogger, R as ReadyIssueInfo, W as WasmGraphModule, p as WatchHandle, q as createConvoyObserver, r as createConvoyTracker, s as createLazyConvoyObserver, w as getLazyObserverStats } from './index-CGJs8eMa.cjs';
|
|
2
|
+
import 'events';
|
|
3
|
+
import './types-CMoOZXrm.cjs';
|
|
4
|
+
import 'zod';
|
|
5
|
+
import './bd-bridge-C9wTbkhi.cjs';
|
|
6
|
+
import 'child_process';
|
package/dist/convoy.d.ts
ADDED
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
export { B as BlockerInfo, b as CompletionCallback, c as CompletionCheckResult, d as ConvoyEvent, e as ConvoyEventType, f as ConvoyLogger, a as ConvoyObserver, g as ConvoyObserverConfig, C as ConvoyTracker, h as ConvoyTrackerConfig, O as ObserverLogger, R as ReadyIssueInfo, W as WasmGraphModule, p as WatchHandle, q as createConvoyObserver, r as createConvoyTracker, s as createLazyConvoyObserver, w as getLazyObserverStats } from './index-BzkAx4ho.js';
|
|
2
|
+
import 'events';
|
|
3
|
+
import './types-CMoOZXrm.js';
|
|
4
|
+
import 'zod';
|
|
5
|
+
import './bd-bridge-C9wTbkhi.js';
|
|
6
|
+
import 'child_process';
|
package/dist/convoy.js
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":[],"names":[],"mappings":"","file":"convoy.js"}
|
package/dist/formula.cjs
ADDED
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
'use strict';Object.defineProperty(exports,'__esModule',{value:true});var chunkSUKPSMVK_cjs=require('./chunk-SUKPSMVK.cjs');Object.defineProperty(exports,"FormulaExecutor",{enumerable:true,get:function(){return chunkSUKPSMVK_cjs.a}});Object.defineProperty(exports,"createFormulaExecutor",{enumerable:true,get:function(){return chunkSUKPSMVK_cjs.b}});Object.defineProperty(exports,"default",{enumerable:true,get:function(){return chunkSUKPSMVK_cjs.c}});//# sourceMappingURL=formula.cjs.map
|
|
2
|
+
//# sourceMappingURL=formula.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":[],"names":[],"mappings":"","file":"formula.cjs"}
|
|
@@ -0,0 +1,317 @@
|
|
|
1
|
+
import { EventEmitter } from 'events';
|
|
2
|
+
import { b as FormulaType, S as Step, x as CookedFormula, F as Formula } from './types-CMoOZXrm.cjs';
|
|
3
|
+
import { G as GtBridge } from './gt-bridge-B7hZz5vC.cjs';
|
|
4
|
+
import 'zod';
|
|
5
|
+
|
|
6
|
+
/**
|
|
7
|
+
* Gas Town Formula Executor - Hybrid WASM/CLI Implementation
|
|
8
|
+
*
|
|
9
|
+
* Provides formula execution with:
|
|
10
|
+
* - WASM acceleration for parsing and cooking (352x faster)
|
|
11
|
+
* - CLI bridge fallback for I/O operations
|
|
12
|
+
* - Progress tracking with event emission
|
|
13
|
+
* - Step dependency resolution
|
|
14
|
+
* - Molecule generation from cooked formulas
|
|
15
|
+
* - Cancellation support
|
|
16
|
+
*
|
|
17
|
+
* @module v3/plugins/gastown-bridge/formula/executor
|
|
18
|
+
*/
|
|
19
|
+
|
|
20
|
+
/**
|
|
21
|
+
* WASM loader interface for formula operations
|
|
22
|
+
*/
|
|
23
|
+
interface IWasmLoader {
|
|
24
|
+
/** Check if WASM is initialized */
|
|
25
|
+
isInitialized(): boolean;
|
|
26
|
+
/** Parse TOML formula content to AST */
|
|
27
|
+
parseFormula(content: string): Formula;
|
|
28
|
+
/** Cook formula with variable substitution */
|
|
29
|
+
cookFormula(formula: Formula, vars: Record<string, string>): CookedFormula;
|
|
30
|
+
/** Batch cook multiple formulas */
|
|
31
|
+
batchCook(formulas: Formula[], varsArray: Record<string, string>[]): CookedFormula[];
|
|
32
|
+
/** Resolve step dependencies (topological sort) */
|
|
33
|
+
resolveStepDependencies(steps: Step[]): Step[];
|
|
34
|
+
/** Detect cycles in step dependencies */
|
|
35
|
+
detectCycle(steps: Step[]): {
|
|
36
|
+
hasCycle: boolean;
|
|
37
|
+
cycleSteps?: string[];
|
|
38
|
+
};
|
|
39
|
+
}
|
|
40
|
+
/**
|
|
41
|
+
* Execution options
|
|
42
|
+
*/
|
|
43
|
+
interface ExecuteOptions {
|
|
44
|
+
/** Target agent for execution */
|
|
45
|
+
targetAgent?: string;
|
|
46
|
+
/** Whether to run in dry-run mode (no actual execution) */
|
|
47
|
+
dryRun?: boolean;
|
|
48
|
+
/** Timeout per step in milliseconds */
|
|
49
|
+
stepTimeout?: number;
|
|
50
|
+
/** Maximum parallel steps */
|
|
51
|
+
maxParallel?: number;
|
|
52
|
+
/** Abort signal for cancellation */
|
|
53
|
+
signal?: AbortSignal;
|
|
54
|
+
/** Custom step handler */
|
|
55
|
+
stepHandler?: (step: Step, context: StepContext) => Promise<StepResult>;
|
|
56
|
+
}
|
|
57
|
+
/**
|
|
58
|
+
* Step execution context
|
|
59
|
+
*/
|
|
60
|
+
interface StepContext {
|
|
61
|
+
/** Execution ID */
|
|
62
|
+
executionId: string;
|
|
63
|
+
/** Formula being executed */
|
|
64
|
+
formula: CookedFormula;
|
|
65
|
+
/** Current step index */
|
|
66
|
+
stepIndex: number;
|
|
67
|
+
/** Total steps */
|
|
68
|
+
totalSteps: number;
|
|
69
|
+
/** Variables available to the step */
|
|
70
|
+
variables: Record<string, string>;
|
|
71
|
+
/** Results from previous steps */
|
|
72
|
+
previousResults: Map<string, StepResult>;
|
|
73
|
+
/** Abort signal */
|
|
74
|
+
signal?: AbortSignal;
|
|
75
|
+
/** Execution start time */
|
|
76
|
+
startTime: Date;
|
|
77
|
+
}
|
|
78
|
+
/**
|
|
79
|
+
* Step execution result
|
|
80
|
+
*/
|
|
81
|
+
interface StepResult {
|
|
82
|
+
/** Step ID */
|
|
83
|
+
stepId: string;
|
|
84
|
+
/** Whether step succeeded */
|
|
85
|
+
success: boolean;
|
|
86
|
+
/** Step output data */
|
|
87
|
+
output?: unknown;
|
|
88
|
+
/** Error message if failed */
|
|
89
|
+
error?: string;
|
|
90
|
+
/** Duration in milliseconds */
|
|
91
|
+
durationMs: number;
|
|
92
|
+
/** Step metadata */
|
|
93
|
+
metadata?: Record<string, unknown>;
|
|
94
|
+
}
|
|
95
|
+
/**
|
|
96
|
+
* Molecule - Generated work unit from cooked formula
|
|
97
|
+
*/
|
|
98
|
+
interface Molecule {
|
|
99
|
+
/** Unique molecule ID */
|
|
100
|
+
id: string;
|
|
101
|
+
/** Parent formula name */
|
|
102
|
+
formulaName: string;
|
|
103
|
+
/** Molecule title */
|
|
104
|
+
title: string;
|
|
105
|
+
/** Molecule description */
|
|
106
|
+
description: string;
|
|
107
|
+
/** Molecule type (from formula type) */
|
|
108
|
+
type: FormulaType;
|
|
109
|
+
/** Associated step or leg */
|
|
110
|
+
sourceId: string;
|
|
111
|
+
/** Assigned agent */
|
|
112
|
+
agent?: string;
|
|
113
|
+
/** Dependencies (other molecule IDs) */
|
|
114
|
+
dependencies: string[];
|
|
115
|
+
/** Execution order */
|
|
116
|
+
order: number;
|
|
117
|
+
/** Molecule metadata */
|
|
118
|
+
metadata: Record<string, unknown>;
|
|
119
|
+
/** Creation timestamp */
|
|
120
|
+
createdAt: Date;
|
|
121
|
+
}
|
|
122
|
+
/**
|
|
123
|
+
* Execution progress
|
|
124
|
+
*/
|
|
125
|
+
interface ExecutionProgress {
|
|
126
|
+
/** Execution ID */
|
|
127
|
+
executionId: string;
|
|
128
|
+
/** Formula name */
|
|
129
|
+
formulaName: string;
|
|
130
|
+
/** Current status */
|
|
131
|
+
status: 'pending' | 'running' | 'completed' | 'failed' | 'cancelled';
|
|
132
|
+
/** Total steps/legs */
|
|
133
|
+
totalSteps: number;
|
|
134
|
+
/** Completed steps */
|
|
135
|
+
completedSteps: number;
|
|
136
|
+
/** Failed steps */
|
|
137
|
+
failedSteps: number;
|
|
138
|
+
/** Current step being executed */
|
|
139
|
+
currentStep?: string;
|
|
140
|
+
/** Start time */
|
|
141
|
+
startTime: Date;
|
|
142
|
+
/** End time (if completed) */
|
|
143
|
+
endTime?: Date;
|
|
144
|
+
/** Step results */
|
|
145
|
+
stepResults: StepResult[];
|
|
146
|
+
/** Error message (if failed) */
|
|
147
|
+
error?: string;
|
|
148
|
+
/** Progress percentage (0-100) */
|
|
149
|
+
percentage: number;
|
|
150
|
+
}
|
|
151
|
+
/**
|
|
152
|
+
* Executor events
|
|
153
|
+
*/
|
|
154
|
+
interface ExecutorEvents {
|
|
155
|
+
'execution:start': (executionId: string, formula: CookedFormula) => void;
|
|
156
|
+
'execution:progress': (progress: ExecutionProgress) => void;
|
|
157
|
+
'execution:complete': (executionId: string, results: StepResult[]) => void;
|
|
158
|
+
'execution:error': (executionId: string, error: Error) => void;
|
|
159
|
+
'execution:cancelled': (executionId: string) => void;
|
|
160
|
+
'step:start': (executionId: string, step: Step) => void;
|
|
161
|
+
'step:complete': (executionId: string, result: StepResult) => void;
|
|
162
|
+
'step:error': (executionId: string, stepId: string, error: Error) => void;
|
|
163
|
+
'molecule:created': (molecule: Molecule) => void;
|
|
164
|
+
}
|
|
165
|
+
/**
|
|
166
|
+
* Logger interface
|
|
167
|
+
*/
|
|
168
|
+
interface ExecutorLogger {
|
|
169
|
+
debug: (msg: string, meta?: Record<string, unknown>) => void;
|
|
170
|
+
info: (msg: string, meta?: Record<string, unknown>) => void;
|
|
171
|
+
warn: (msg: string, meta?: Record<string, unknown>) => void;
|
|
172
|
+
error: (msg: string, meta?: Record<string, unknown>) => void;
|
|
173
|
+
}
|
|
174
|
+
/**
|
|
175
|
+
* Hybrid Formula Executor
|
|
176
|
+
*
|
|
177
|
+
* Uses WASM for fast parsing and cooking operations,
|
|
178
|
+
* falls back to CLI bridge for I/O operations.
|
|
179
|
+
*
|
|
180
|
+
* @example
|
|
181
|
+
* ```typescript
|
|
182
|
+
* const executor = new FormulaExecutor(gtBridge, wasmLoader);
|
|
183
|
+
*
|
|
184
|
+
* // Full execution
|
|
185
|
+
* const results = await executor.execute('my-formula', { feature: 'auth' });
|
|
186
|
+
*
|
|
187
|
+
* // Just cook (WASM-accelerated)
|
|
188
|
+
* const cooked = await executor.cook('my-formula', { feature: 'auth' });
|
|
189
|
+
*
|
|
190
|
+
* // Generate molecules
|
|
191
|
+
* const molecules = await executor.generateMolecules(cooked);
|
|
192
|
+
* ```
|
|
193
|
+
*/
|
|
194
|
+
declare class FormulaExecutor extends EventEmitter {
|
|
195
|
+
private readonly gtBridge;
|
|
196
|
+
private readonly wasmLoader;
|
|
197
|
+
private readonly logger;
|
|
198
|
+
private readonly jsFallback;
|
|
199
|
+
/** Active executions for progress tracking */
|
|
200
|
+
private readonly executions;
|
|
201
|
+
/** Cancellation controllers */
|
|
202
|
+
private readonly cancellations;
|
|
203
|
+
/** Debounced progress emitters per execution */
|
|
204
|
+
private readonly progressEmitters;
|
|
205
|
+
/** Default max parallel workers */
|
|
206
|
+
private readonly defaultMaxParallel;
|
|
207
|
+
constructor(gtBridge: GtBridge, wasmLoader?: IWasmLoader, logger?: ExecutorLogger);
|
|
208
|
+
/**
|
|
209
|
+
* Execute a formula with full lifecycle
|
|
210
|
+
*
|
|
211
|
+
* @param formulaName - Name of the formula to execute
|
|
212
|
+
* @param vars - Variables for substitution
|
|
213
|
+
* @param options - Execution options
|
|
214
|
+
* @returns Array of step results
|
|
215
|
+
*/
|
|
216
|
+
execute(formulaName: string, vars: Record<string, string>, options?: ExecuteOptions): Promise<StepResult[]>;
|
|
217
|
+
/**
|
|
218
|
+
* Cook a formula with variable substitution (WASM-accelerated)
|
|
219
|
+
*
|
|
220
|
+
* @param formulaName - Name of the formula or TOML content
|
|
221
|
+
* @param vars - Variables for substitution
|
|
222
|
+
* @returns Cooked formula with substituted variables
|
|
223
|
+
*/
|
|
224
|
+
cook(formulaName: string, vars: Record<string, string>): Promise<CookedFormula>;
|
|
225
|
+
/**
|
|
226
|
+
* Generate molecules from a cooked formula
|
|
227
|
+
*
|
|
228
|
+
* Molecules are executable work units derived from formula steps/legs.
|
|
229
|
+
* Uses object pooling for reduced allocations.
|
|
230
|
+
*
|
|
231
|
+
* @param cookedFormula - The cooked formula to generate molecules from
|
|
232
|
+
* @returns Array of molecules
|
|
233
|
+
*/
|
|
234
|
+
generateMolecules(cookedFormula: CookedFormula): Promise<Molecule[]>;
|
|
235
|
+
/**
|
|
236
|
+
* Run a single step
|
|
237
|
+
*
|
|
238
|
+
* @param step - Step to execute
|
|
239
|
+
* @param context - Execution context
|
|
240
|
+
* @param options - Execution options
|
|
241
|
+
* @returns Step result
|
|
242
|
+
*/
|
|
243
|
+
runStep(step: Step, context: StepContext, options?: ExecuteOptions): Promise<StepResult>;
|
|
244
|
+
/**
|
|
245
|
+
* Get execution progress
|
|
246
|
+
*
|
|
247
|
+
* @param executionId - Execution ID to get progress for
|
|
248
|
+
* @returns Execution progress or undefined
|
|
249
|
+
*/
|
|
250
|
+
getProgress(executionId: string): ExecutionProgress | undefined;
|
|
251
|
+
/**
|
|
252
|
+
* Cancel an execution
|
|
253
|
+
*
|
|
254
|
+
* @param executionId - Execution ID to cancel
|
|
255
|
+
* @returns Whether cancellation was initiated
|
|
256
|
+
*/
|
|
257
|
+
cancel(executionId: string): boolean;
|
|
258
|
+
/**
|
|
259
|
+
* List all active executions
|
|
260
|
+
*/
|
|
261
|
+
getActiveExecutions(): ExecutionProgress[];
|
|
262
|
+
/**
|
|
263
|
+
* Check if WASM is available for acceleration
|
|
264
|
+
*/
|
|
265
|
+
isWasmAvailable(): boolean;
|
|
266
|
+
/**
|
|
267
|
+
* Get cache statistics for performance monitoring
|
|
268
|
+
*/
|
|
269
|
+
getCacheStats(): {
|
|
270
|
+
stepResultCache: {
|
|
271
|
+
entries: number;
|
|
272
|
+
sizeBytes: number;
|
|
273
|
+
};
|
|
274
|
+
cookCache: {
|
|
275
|
+
entries: number;
|
|
276
|
+
sizeBytes: number;
|
|
277
|
+
};
|
|
278
|
+
};
|
|
279
|
+
/**
|
|
280
|
+
* Clear all executor caches
|
|
281
|
+
*/
|
|
282
|
+
clearCaches(): void;
|
|
283
|
+
/**
|
|
284
|
+
* Parse formula content using WASM or JS fallback
|
|
285
|
+
*/
|
|
286
|
+
private parseFormula;
|
|
287
|
+
/**
|
|
288
|
+
* Fetch formula from CLI
|
|
289
|
+
*/
|
|
290
|
+
private fetchFormula;
|
|
291
|
+
/**
|
|
292
|
+
* Validate required variables are provided
|
|
293
|
+
*/
|
|
294
|
+
private validateVariables;
|
|
295
|
+
/**
|
|
296
|
+
* Resolve step dependencies using WASM or JS fallback
|
|
297
|
+
*/
|
|
298
|
+
private resolveStepDependencies;
|
|
299
|
+
/**
|
|
300
|
+
* Get ordered execution units (steps or legs) from formula
|
|
301
|
+
*/
|
|
302
|
+
private getOrderedExecutionUnits;
|
|
303
|
+
/**
|
|
304
|
+
* Execute step via CLI bridge
|
|
305
|
+
*/
|
|
306
|
+
private executeStepViaCli;
|
|
307
|
+
/**
|
|
308
|
+
* Merge multiple abort signals
|
|
309
|
+
*/
|
|
310
|
+
private mergeSignals;
|
|
311
|
+
}
|
|
312
|
+
/**
|
|
313
|
+
* Create a new FormulaExecutor instance
|
|
314
|
+
*/
|
|
315
|
+
declare function createFormulaExecutor(gtBridge: GtBridge, wasmLoader?: IWasmLoader, logger?: ExecutorLogger): FormulaExecutor;
|
|
316
|
+
|
|
317
|
+
export { type ExecuteOptions, type ExecutionProgress, type ExecutorEvents, type ExecutorLogger, FormulaExecutor, type IWasmLoader, type Molecule, type StepContext, type StepResult, createFormulaExecutor, FormulaExecutor as default };
|