@claude-flow/plugin-gastown-bridge 0.1.3 → 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 +13 -612
- package/dist/bridges.d.ts +13 -612
- 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 +17 -2241
- package/dist/index.d.ts +17 -2241
- 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 -18
- package/dist/chunk-IBKUMYUL.js +0 -14
- package/dist/chunk-IBKUMYUL.js.map +0 -1
- package/dist/chunk-JF2GA7QE.cjs +0 -14
- package/dist/chunk-JF2GA7QE.cjs.map +0 -1
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/formula/executor.ts"],"names":["stepResultCache","LRUCache","cookCache","cookDedup","BatchDeduplicator","fetchDedup","WorkStealingQueue","numWorkers","i","item","minQueue","minLen","len","workerId","ownQueue","victimId","victimQueue","q","sum","hashKey","parts","hash","part","defaultLogger","msg","meta","JsFallbackWasmLoader","content","lines","name","description","type","version","steps","vars","currentSection","currentStep","line","trimmed","sectionMatch","kvMatch","key","value","s","error","FormulaError","formula","substituteVars","text","match","varName","cookedSteps","step","cookedLegs","leg","formulas","varsArray","index","stepMap","inDegree","adjacency","dep","adj","queue","degree","stepId","sorted","current","neighbor","newDegree","GasTownError","GasTownErrorCode","visited","recStack","dfs","path","cycle","FormulaExecutor","EventEmitter","gtBridge","wasmLoader","logger","formulaName","options","executionId","randomUUID","abortController","signal","cooked","legs","totalSteps","progress","progressEmitter","DebouncedEmitter","p","orderedSteps","results","previousResults","maxParallel","stepDeps","stepById","stepIndex","completed","inProgress","workQueue","getReadySteps","ready","deps","d","readySteps","batchSize","batch","resolve","batchPromises","idx","context","result","failedResult","batchResults","emitter","varKeys","varValues","k","cacheKey","cached","cookedFormula","molecules","moleculeIdMap","orderedLegs","b","moleculeId","pooledMol","moleculePool","molecule","dependencies","need","depMoleculeId","startTime","stepCacheKey","cachedResult","depResult","stepResult","controller","missing","varDef","a","args","signals","createFormulaExecutor","executor_default"],"mappings":"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","file":"chunk-2KNTWGUX.js","sourcesContent":["/**\n * Gas Town Formula Executor - Hybrid WASM/CLI Implementation\n *\n * Provides formula execution with:\n * - WASM acceleration for parsing and cooking (352x faster)\n * - CLI bridge fallback for I/O operations\n * - Progress tracking with event emission\n * - Step dependency resolution\n * - Molecule generation from cooked formulas\n * - Cancellation support\n *\n * @module v3/plugins/gastown-bridge/formula/executor\n */\n\nimport { EventEmitter } from 'events';\nimport { randomUUID } from 'crypto';\n\nimport type {\n Formula,\n CookedFormula,\n Step,\n Leg,\n Var,\n FormulaType,\n} from '../types.js';\n\nimport {\n GasTownError,\n GasTownErrorCode,\n FormulaError,\n} from '../errors.js';\n\nimport type { GtBridge, GtResult } from '../bridges/gt-bridge.js';\n\nimport {\n stepPool,\n formulaPool,\n moleculePool,\n PooledStep,\n PooledFormula,\n PooledMolecule,\n withArenaSync,\n} from '../memory/index.js';\n\nimport {\n LRUCache,\n BatchDeduplicator,\n DebouncedEmitter,\n} from '../cache.js';\n\n// ============================================================================\n// Performance Caches & Deduplication\n// ============================================================================\n\n/** Step result cache for memoization */\nconst stepResultCache = new LRUCache<string, StepResult>({\n maxEntries: 500,\n ttlMs: 5 * 60 * 1000, // 5 min TTL\n});\n\n/** Formula cook cache */\nconst cookCache = new LRUCache<string, CookedFormula>({\n maxEntries: 200,\n ttlMs: 10 * 60 * 1000, // 10 min TTL\n});\n\n/** Deduplicator for concurrent cook requests */\nconst cookDedup = new BatchDeduplicator<CookedFormula>();\n\n/** Deduplicator for concurrent formula fetch requests */\nconst fetchDedup = new BatchDeduplicator<Formula>();\n\n/**\n * Work stealing queue for parallel execution\n */\ninterface WorkItem {\n step: Step;\n context: StepContext;\n options: ExecuteOptions;\n priority: number;\n}\n\n/**\n * Work stealing queue for load balancing across parallel workers\n */\nclass WorkStealingQueue {\n private queues: WorkItem[][] = [];\n private nextQueueId = 0;\n\n constructor(private readonly numWorkers: number) {\n for (let i = 0; i < numWorkers; i++) {\n this.queues.push([]);\n }\n }\n\n /** Enqueue work to least-loaded queue */\n enqueue(item: WorkItem): void {\n // Find queue with least items\n let minQueue = 0;\n let minLen = this.queues[0]?.length ?? 0;\n for (let i = 1; i < this.queues.length; i++) {\n const len = this.queues[i]?.length ?? 0;\n if (len < minLen) {\n minLen = len;\n minQueue = i;\n }\n }\n this.queues[minQueue]?.push(item);\n }\n\n /** Dequeue from own queue or steal from others */\n dequeue(workerId: number): WorkItem | undefined {\n // Try own queue first\n const ownQueue = this.queues[workerId];\n if (ownQueue && ownQueue.length > 0) {\n return ownQueue.shift();\n }\n\n // Try to steal from other queues (round-robin)\n for (let i = 1; i < this.queues.length; i++) {\n const victimId = (workerId + i) % this.queues.length;\n const victimQueue = this.queues[victimId];\n if (victimQueue && victimQueue.length > 1) {\n // Steal from the back (LIFO stealing)\n return victimQueue.pop();\n }\n }\n\n return undefined;\n }\n\n /** Check if all queues are empty */\n isEmpty(): boolean {\n return this.queues.every(q => q.length === 0);\n }\n\n /** Get total pending items */\n get size(): number {\n return this.queues.reduce((sum, q) => sum + q.length, 0);\n }\n}\n\n/**\n * Hash function for cache keys (FNV-1a)\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; // separator\n }\n return hash.toString(36);\n}\n\n// ============================================================================\n// Types\n// ============================================================================\n\n/**\n * WASM loader interface for formula operations\n */\nexport interface IWasmLoader {\n /** Check if WASM is initialized */\n isInitialized(): boolean;\n\n /** Parse TOML formula content to AST */\n parseFormula(content: string): Formula;\n\n /** Cook formula with variable substitution */\n cookFormula(formula: Formula, vars: Record<string, string>): CookedFormula;\n\n /** Batch cook multiple formulas */\n batchCook(formulas: Formula[], varsArray: Record<string, string>[]): CookedFormula[];\n\n /** Resolve step dependencies (topological sort) */\n resolveStepDependencies(steps: Step[]): Step[];\n\n /** Detect cycles in step dependencies */\n detectCycle(steps: Step[]): { hasCycle: boolean; cycleSteps?: string[] };\n}\n\n/**\n * Execution options\n */\nexport interface ExecuteOptions {\n /** Target agent for execution */\n targetAgent?: string;\n\n /** Whether to run in dry-run mode (no actual execution) */\n dryRun?: boolean;\n\n /** Timeout per step in milliseconds */\n stepTimeout?: number;\n\n /** Maximum parallel steps */\n maxParallel?: number;\n\n /** Abort signal for cancellation */\n signal?: AbortSignal;\n\n /** Custom step handler */\n stepHandler?: (step: Step, context: StepContext) => Promise<StepResult>;\n}\n\n/**\n * Step execution context\n */\nexport interface StepContext {\n /** Execution ID */\n executionId: string;\n\n /** Formula being executed */\n formula: CookedFormula;\n\n /** Current step index */\n stepIndex: number;\n\n /** Total steps */\n totalSteps: number;\n\n /** Variables available to the step */\n variables: Record<string, string>;\n\n /** Results from previous steps */\n previousResults: Map<string, StepResult>;\n\n /** Abort signal */\n signal?: AbortSignal;\n\n /** Execution start time */\n startTime: Date;\n}\n\n/**\n * Step execution result\n */\nexport interface StepResult {\n /** Step ID */\n stepId: string;\n\n /** Whether step succeeded */\n success: boolean;\n\n /** Step output data */\n output?: unknown;\n\n /** Error message if failed */\n error?: string;\n\n /** Duration in milliseconds */\n durationMs: number;\n\n /** Step metadata */\n metadata?: Record<string, unknown>;\n}\n\n/**\n * Molecule - Generated work unit from cooked formula\n */\nexport interface Molecule {\n /** Unique molecule ID */\n id: string;\n\n /** Parent formula name */\n formulaName: string;\n\n /** Molecule title */\n title: string;\n\n /** Molecule description */\n description: string;\n\n /** Molecule type (from formula type) */\n type: FormulaType;\n\n /** Associated step or leg */\n sourceId: string;\n\n /** Assigned agent */\n agent?: string;\n\n /** Dependencies (other molecule IDs) */\n dependencies: string[];\n\n /** Execution order */\n order: number;\n\n /** Molecule metadata */\n metadata: Record<string, unknown>;\n\n /** Creation timestamp */\n createdAt: Date;\n}\n\n/**\n * Execution progress\n */\nexport interface ExecutionProgress {\n /** Execution ID */\n executionId: string;\n\n /** Formula name */\n formulaName: string;\n\n /** Current status */\n status: 'pending' | 'running' | 'completed' | 'failed' | 'cancelled';\n\n /** Total steps/legs */\n totalSteps: number;\n\n /** Completed steps */\n completedSteps: number;\n\n /** Failed steps */\n failedSteps: number;\n\n /** Current step being executed */\n currentStep?: string;\n\n /** Start time */\n startTime: Date;\n\n /** End time (if completed) */\n endTime?: Date;\n\n /** Step results */\n stepResults: StepResult[];\n\n /** Error message (if failed) */\n error?: string;\n\n /** Progress percentage (0-100) */\n percentage: number;\n}\n\n/**\n * Executor events\n */\nexport interface ExecutorEvents {\n 'execution:start': (executionId: string, formula: CookedFormula) => void;\n 'execution:progress': (progress: ExecutionProgress) => void;\n 'execution:complete': (executionId: string, results: StepResult[]) => void;\n 'execution:error': (executionId: string, error: Error) => void;\n 'execution:cancelled': (executionId: string) => void;\n 'step:start': (executionId: string, step: Step) => void;\n 'step:complete': (executionId: string, result: StepResult) => void;\n 'step:error': (executionId: string, stepId: string, error: Error) => void;\n 'molecule:created': (molecule: Molecule) => void;\n}\n\n/**\n * Logger interface\n */\nexport interface ExecutorLogger {\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// Default Logger\n// ============================================================================\n\nconst defaultLogger: ExecutorLogger = {\n debug: (msg, meta) => console.debug(`[formula-executor] ${msg}`, meta ?? ''),\n info: (msg, meta) => console.info(`[formula-executor] ${msg}`, meta ?? ''),\n warn: (msg, meta) => console.warn(`[formula-executor] ${msg}`, meta ?? ''),\n error: (msg, meta) => console.error(`[formula-executor] ${msg}`, meta ?? ''),\n};\n\n// ============================================================================\n// JavaScript Fallback Implementation\n// ============================================================================\n\n/**\n * JavaScript fallback for WASM operations\n * Used when WASM is not available\n */\nclass JsFallbackWasmLoader implements IWasmLoader {\n isInitialized(): boolean {\n return true; // JS fallback is always available\n }\n\n parseFormula(content: string): Formula {\n // Basic TOML parsing simulation\n // In production, use a proper TOML parser\n try {\n const lines = content.split('\\n');\n\n // Use mutable objects during parsing, then cast to readonly\n let name = 'parsed-formula';\n let description = '';\n let type: FormulaType = 'workflow';\n let version = 1;\n const steps: Array<{ id: string; title: string; description: string; needs?: string[] }> = [];\n const vars: Record<string, Var> = {};\n\n let currentSection = '';\n let currentStep: { id: string; title: string; description: string; needs?: string[] } | null = null;\n\n for (const line of lines) {\n const trimmed = line.trim();\n\n // Skip empty lines and comments\n if (!trimmed || trimmed.startsWith('#')) continue;\n\n // Section headers\n if (trimmed.startsWith('[')) {\n if (currentStep && currentStep.id) {\n steps.push(currentStep);\n }\n\n const sectionMatch = trimmed.match(/\\[(\\w+)(?:\\.(\\w+))?\\]/);\n if (sectionMatch) {\n currentSection = sectionMatch[1];\n if (sectionMatch[2]) {\n currentStep = { id: sectionMatch[2], title: '', description: '' };\n } else {\n currentStep = null;\n }\n }\n continue;\n }\n\n // Key-value pairs\n const kvMatch = trimmed.match(/^(\\w+)\\s*=\\s*\"?([^\"]*)\"?$/);\n if (kvMatch) {\n const [, key, value] = kvMatch;\n\n if (currentSection === 'formula') {\n if (key === 'name') name = value;\n else if (key === 'description') description = value;\n else if (key === 'type') type = value as FormulaType;\n else if (key === 'version') version = parseInt(value, 10);\n } else if (currentStep) {\n if (key === 'title') currentStep.title = value;\n else if (key === 'description') currentStep.description = value;\n else if (key === 'needs') {\n currentStep.needs = value.split(',').map(s => s.trim());\n }\n }\n }\n }\n\n // Add last step\n if (currentStep && currentStep.id) {\n steps.push(currentStep);\n }\n\n // Return immutable formula\n const formula: Formula = {\n name,\n description,\n type,\n version,\n steps: steps as Step[],\n vars,\n };\n return formula;\n } catch (error) {\n throw FormulaError.parseFailed('js-parse', 'Failed to parse formula content', error as Error);\n }\n }\n\n cookFormula(formula: Formula, vars: Record<string, string>): CookedFormula {\n const substituteVars = (text: string): string => {\n return text.replace(/\\{\\{(\\w+)\\}\\}/g, (match, varName) => {\n return vars[varName] ?? match;\n });\n };\n\n const cookedSteps = formula.steps?.map(step => ({\n ...step,\n title: substituteVars(step.title),\n description: substituteVars(step.description),\n }));\n\n const cookedLegs = formula.legs?.map(leg => ({\n ...leg,\n title: substituteVars(leg.title),\n description: substituteVars(leg.description),\n focus: substituteVars(leg.focus),\n }));\n\n return {\n ...formula,\n steps: cookedSteps,\n legs: cookedLegs,\n cookedAt: new Date(),\n cookedVars: { ...vars },\n originalName: formula.name,\n };\n }\n\n batchCook(formulas: Formula[], varsArray: Record<string, string>[]): CookedFormula[] {\n return formulas.map((formula, index) => {\n const vars = varsArray[index] ?? {};\n return this.cookFormula(formula, vars);\n });\n }\n\n resolveStepDependencies(steps: Step[]): Step[] {\n // Topological sort using Kahn's algorithm\n const stepMap = new Map<string, Step>();\n const inDegree = new Map<string, number>();\n const adjacency = new Map<string, string[]>();\n\n // Initialize\n for (const step of steps) {\n stepMap.set(step.id, step);\n inDegree.set(step.id, 0);\n adjacency.set(step.id, []);\n }\n\n // Build graph\n for (const step of steps) {\n if (step.needs) {\n for (const dep of step.needs) {\n if (stepMap.has(dep)) {\n const adj = adjacency.get(dep);\n if (adj) adj.push(step.id);\n inDegree.set(step.id, (inDegree.get(step.id) ?? 0) + 1);\n }\n }\n }\n }\n\n // Find all nodes with no incoming edges\n const queue: string[] = [];\n inDegree.forEach((degree, stepId) => {\n if (degree === 0) {\n queue.push(stepId);\n }\n });\n\n const sorted: Step[] = [];\n while (queue.length > 0) {\n const current = queue.shift()!;\n const step = stepMap.get(current);\n if (step) {\n sorted.push(step);\n }\n\n for (const neighbor of adjacency.get(current) ?? []) {\n const newDegree = (inDegree.get(neighbor) ?? 1) - 1;\n inDegree.set(neighbor, newDegree);\n if (newDegree === 0) {\n queue.push(neighbor);\n }\n }\n }\n\n // Check for cycle (not all nodes processed)\n if (sorted.length !== steps.length) {\n throw new GasTownError(\n 'Cycle detected in step dependencies',\n GasTownErrorCode.DEPENDENCY_CYCLE,\n { sortedCount: sorted.length, totalCount: steps.length }\n );\n }\n\n return sorted;\n }\n\n detectCycle(steps: Step[]): { hasCycle: boolean; cycleSteps?: string[] } {\n const visited = new Set<string>();\n const recStack = new Set<string>();\n const stepMap = new Map<string, Step>();\n\n for (const step of steps) {\n stepMap.set(step.id, step);\n }\n\n const dfs = (stepId: string, path: string[]): string[] | null => {\n visited.add(stepId);\n recStack.add(stepId);\n\n const step = stepMap.get(stepId);\n if (step?.needs) {\n for (const dep of step.needs) {\n if (!visited.has(dep)) {\n const cycle = dfs(dep, [...path, dep]);\n if (cycle) return cycle;\n } else if (recStack.has(dep)) {\n return [...path, dep];\n }\n }\n }\n\n recStack.delete(stepId);\n return null;\n };\n\n for (const step of steps) {\n if (!visited.has(step.id)) {\n const cycle = dfs(step.id, [step.id]);\n if (cycle) {\n return { hasCycle: true, cycleSteps: cycle };\n }\n }\n }\n\n return { hasCycle: false };\n }\n}\n\n// ============================================================================\n// Formula Executor Implementation\n// ============================================================================\n\n/**\n * Hybrid Formula Executor\n *\n * Uses WASM for fast parsing and cooking operations,\n * falls back to CLI bridge for I/O operations.\n *\n * @example\n * ```typescript\n * const executor = new FormulaExecutor(gtBridge, wasmLoader);\n *\n * // Full execution\n * const results = await executor.execute('my-formula', { feature: 'auth' });\n *\n * // Just cook (WASM-accelerated)\n * const cooked = await executor.cook('my-formula', { feature: 'auth' });\n *\n * // Generate molecules\n * const molecules = await executor.generateMolecules(cooked);\n * ```\n */\nexport class FormulaExecutor extends EventEmitter {\n private readonly gtBridge: GtBridge;\n private readonly wasmLoader: IWasmLoader;\n private readonly logger: ExecutorLogger;\n private readonly jsFallback: JsFallbackWasmLoader;\n\n /** Active executions for progress tracking */\n private readonly executions: Map<string, ExecutionProgress> = new Map();\n\n /** Cancellation controllers */\n private readonly cancellations: Map<string, AbortController> = new Map();\n\n /** Debounced progress emitters per execution */\n private readonly progressEmitters: Map<string, DebouncedEmitter<ExecutionProgress>> = new Map();\n\n /** Default max parallel workers */\n private readonly defaultMaxParallel = 4;\n\n constructor(\n gtBridge: GtBridge,\n wasmLoader?: IWasmLoader,\n logger?: ExecutorLogger\n ) {\n super();\n this.gtBridge = gtBridge;\n this.wasmLoader = wasmLoader ?? new JsFallbackWasmLoader();\n this.logger = logger ?? defaultLogger;\n this.jsFallback = new JsFallbackWasmLoader();\n }\n\n // ============================================================================\n // Public API\n // ============================================================================\n\n /**\n * Execute a formula with full lifecycle\n *\n * @param formulaName - Name of the formula to execute\n * @param vars - Variables for substitution\n * @param options - Execution options\n * @returns Array of step results\n */\n async execute(\n formulaName: string,\n vars: Record<string, string>,\n options: ExecuteOptions = {}\n ): Promise<StepResult[]> {\n const executionId = randomUUID();\n const abortController = new AbortController();\n\n // Register cancellation controller\n this.cancellations.set(executionId, abortController);\n\n // Merge signals\n const signal = options.signal\n ? this.mergeSignals(options.signal, abortController.signal)\n : abortController.signal;\n\n try {\n // Step 1: Fetch and cook the formula\n this.logger.info('Starting formula execution', { executionId, formulaName });\n const cooked = await this.cook(formulaName, vars);\n\n // Initialize progress tracking\n const steps = cooked.steps ?? [];\n const legs = cooked.legs ?? [];\n const totalSteps = steps.length || legs.length;\n\n const progress: ExecutionProgress = {\n executionId,\n formulaName,\n status: 'running',\n totalSteps,\n completedSteps: 0,\n failedSteps: 0,\n startTime: new Date(),\n stepResults: [],\n percentage: 0,\n };\n\n this.executions.set(executionId, progress);\n this.emit('execution:start', executionId, cooked);\n\n // Create debounced progress emitter (100ms debounce)\n const progressEmitter = new DebouncedEmitter<ExecutionProgress>(\n (p) => this.emit('execution:progress', p),\n 100\n );\n this.progressEmitters.set(executionId, progressEmitter);\n\n // Step 2: Resolve dependencies and get execution order\n const orderedSteps = this.getOrderedExecutionUnits(cooked);\n\n // Step 3: Execute steps with parallel execution where deps allow\n const results: StepResult[] = [];\n const previousResults = new Map<string, StepResult>();\n const maxParallel = options.maxParallel ?? this.defaultMaxParallel;\n\n // Use parallel execution with work stealing if enabled\n if (maxParallel > 1 && orderedSteps.length > 1) {\n // Build dependency graph for parallel execution\n const stepDeps = new Map<string, Set<string>>();\n const stepById = new Map<string, Step>();\n const stepIndex = new Map<string, number>();\n\n for (let i = 0; i < orderedSteps.length; i++) {\n const step = orderedSteps[i];\n stepById.set(step.id, step);\n stepIndex.set(step.id, i);\n stepDeps.set(step.id, new Set(step.needs ?? []));\n }\n\n // Track completed steps\n const completed = new Set<string>();\n const inProgress = new Set<string>();\n\n // Work stealing queue\n const workQueue = new WorkStealingQueue(maxParallel);\n\n // Find steps that can run (no dependencies)\n const getReadySteps = (): Step[] => {\n const ready: Step[] = [];\n for (const step of orderedSteps) {\n if (completed.has(step.id) || inProgress.has(step.id)) continue;\n const deps = stepDeps.get(step.id);\n if (!deps || [...deps].every(d => completed.has(d))) {\n ready.push(step);\n }\n }\n return ready;\n };\n\n // Execute in parallel waves\n while (completed.size < orderedSteps.length) {\n // Check for cancellation\n if (signal.aborted) {\n progress.status = 'cancelled';\n this.emit('execution:cancelled', executionId);\n throw new GasTownError(\n 'Execution cancelled',\n GasTownErrorCode.UNKNOWN,\n { executionId }\n );\n }\n\n const readySteps = getReadySteps();\n if (readySteps.length === 0 && inProgress.size === 0) {\n // Deadlock - should not happen with valid DAG\n break;\n }\n\n // Limit parallel execution\n const batchSize = Math.min(readySteps.length, maxParallel - inProgress.size);\n const batch = readySteps.slice(0, batchSize);\n\n if (batch.length === 0) {\n // Wait for in-progress steps to complete\n await new Promise(resolve => setTimeout(resolve, 10));\n continue;\n }\n\n // Mark as in progress\n for (const step of batch) {\n inProgress.add(step.id);\n }\n\n // Execute batch in parallel\n const batchPromises = batch.map(async (step) => {\n const idx = stepIndex.get(step.id) ?? 0;\n progress.currentStep = step.id;\n\n const context: StepContext = {\n executionId,\n formula: cooked,\n stepIndex: idx,\n totalSteps: orderedSteps.length,\n variables: cooked.cookedVars,\n previousResults,\n signal,\n startTime: progress.startTime,\n };\n\n this.emit('step:start', executionId, step);\n\n try {\n const result = await this.runStep(step, context, options);\n previousResults.set(step.id, result);\n completed.add(step.id);\n inProgress.delete(step.id);\n\n if (result.success) {\n progress.completedSteps++;\n } else {\n progress.failedSteps++;\n }\n\n progress.stepResults.push(result);\n progress.percentage = Math.round((completed.size / orderedSteps.length) * 100);\n\n this.emit('step:complete', executionId, result);\n progressEmitter.update({ ...progress });\n\n return result;\n } catch (error) {\n const failedResult: StepResult = {\n stepId: step.id,\n success: false,\n error: error instanceof Error ? error.message : String(error),\n durationMs: 0,\n };\n\n previousResults.set(step.id, failedResult);\n completed.add(step.id); // Mark as completed (failed)\n inProgress.delete(step.id);\n progress.failedSteps++;\n progress.stepResults.push(failedResult);\n\n this.emit('step:error', executionId, step.id, error as Error);\n progressEmitter.update({ ...progress });\n\n // Continue or fail based on step configuration\n if (!step.metadata?.continueOnError) {\n throw error;\n }\n\n return failedResult;\n }\n });\n\n const batchResults = await Promise.all(batchPromises);\n results.push(...batchResults);\n }\n\n // Flush final progress\n progressEmitter.flush();\n } else {\n // Sequential execution (original behavior)\n for (let i = 0; i < orderedSteps.length; i++) {\n // Check for cancellation\n if (signal.aborted) {\n progress.status = 'cancelled';\n this.emit('execution:cancelled', executionId);\n throw new GasTownError(\n 'Execution cancelled',\n GasTownErrorCode.UNKNOWN,\n { executionId }\n );\n }\n\n const step = orderedSteps[i];\n progress.currentStep = step.id;\n\n const context: StepContext = {\n executionId,\n formula: cooked,\n stepIndex: i,\n totalSteps: orderedSteps.length,\n variables: cooked.cookedVars,\n previousResults,\n signal,\n startTime: progress.startTime,\n };\n\n this.emit('step:start', executionId, step);\n\n try {\n const result = await this.runStep(step, context, options);\n results.push(result);\n previousResults.set(step.id, result);\n\n if (result.success) {\n progress.completedSteps++;\n } else {\n progress.failedSteps++;\n }\n\n progress.stepResults.push(result);\n progress.percentage = Math.round(((i + 1) / orderedSteps.length) * 100);\n\n this.emit('step:complete', executionId, result);\n progressEmitter.update({ ...progress });\n } catch (error) {\n const failedResult: StepResult = {\n stepId: step.id,\n success: false,\n error: error instanceof Error ? error.message : String(error),\n durationMs: 0,\n };\n\n results.push(failedResult);\n previousResults.set(step.id, failedResult);\n progress.failedSteps++;\n progress.stepResults.push(failedResult);\n\n this.emit('step:error', executionId, step.id, error as Error);\n\n // Continue or fail based on step configuration\n if (!step.metadata?.continueOnError) {\n throw error;\n }\n }\n }\n\n // Flush final progress\n progressEmitter.flush();\n }\n\n // Step 4: Complete execution\n progress.status = progress.failedSteps > 0 ? 'failed' : 'completed';\n progress.endTime = new Date();\n progress.percentage = 100;\n\n this.emit('execution:complete', executionId, results);\n this.logger.info('Formula execution completed', {\n executionId,\n formulaName,\n completed: progress.completedSteps,\n failed: progress.failedSteps,\n });\n\n return results;\n } catch (error) {\n const progress = this.executions.get(executionId);\n if (progress) {\n progress.status = 'failed';\n progress.endTime = new Date();\n progress.error = error instanceof Error ? error.message : String(error);\n }\n\n this.emit('execution:error', executionId, error as Error);\n throw error;\n } finally {\n this.cancellations.delete(executionId);\n // Cleanup progress emitter\n const emitter = this.progressEmitters.get(executionId);\n if (emitter) {\n emitter.cancel();\n this.progressEmitters.delete(executionId);\n }\n }\n }\n\n /**\n * Cook a formula with variable substitution (WASM-accelerated)\n *\n * @param formulaName - Name of the formula or TOML content\n * @param vars - Variables for substitution\n * @returns Cooked formula with substituted variables\n */\n async cook(\n formulaName: string,\n vars: Record<string, string>\n ): Promise<CookedFormula> {\n this.logger.debug('Cooking formula', { formulaName, varsCount: Object.keys(vars).length });\n\n // Generate cache key from formula name and vars\n const varKeys = Object.keys(vars).sort();\n const varValues = varKeys.map(k => vars[k]);\n const cacheKey = hashKey([formulaName, ...varKeys, ...varValues]);\n\n // Check cook cache first\n const cached = cookCache.get(cacheKey);\n if (cached) {\n this.logger.debug('Cook cache hit', { formulaName });\n return cached;\n }\n\n // Use deduplication for concurrent identical requests\n return cookDedup.dedupe(cacheKey, async () => {\n try {\n // Determine if formulaName is content or a name to fetch\n let formula: Formula;\n\n if (formulaName.includes('[') || formulaName.includes('=')) {\n // Looks like TOML content, parse directly\n formula = this.parseFormula(formulaName);\n } else {\n // Fetch formula from CLI with deduplication\n formula = await fetchDedup.dedupe(formulaName, () => this.fetchFormula(formulaName));\n }\n\n // Validate required variables\n this.validateVariables(formula, vars);\n\n // Cook using WASM if available, otherwise JS fallback\n const loader = this.wasmLoader.isInitialized() ? this.wasmLoader : this.jsFallback;\n const cooked = loader.cookFormula(formula, vars);\n\n // Cache the result\n cookCache.set(cacheKey, cooked);\n\n this.logger.debug('Formula cooked successfully', {\n formulaName,\n wasmAccelerated: this.wasmLoader.isInitialized(),\n });\n\n return cooked;\n } catch (error) {\n if (error instanceof GasTownError) throw error;\n\n throw FormulaError.cookFailed(\n formulaName,\n error instanceof Error ? error.message : String(error),\n error as Error\n );\n }\n });\n }\n\n /**\n * Generate molecules from a cooked formula\n *\n * Molecules are executable work units derived from formula steps/legs.\n * Uses object pooling for reduced allocations.\n *\n * @param cookedFormula - The cooked formula to generate molecules from\n * @returns Array of molecules\n */\n async generateMolecules(cookedFormula: CookedFormula): Promise<Molecule[]> {\n this.logger.debug('Generating molecules', { formulaName: cookedFormula.name });\n\n const molecules: Molecule[] = [];\n const moleculeIdMap = new Map<string, string>();\n\n // Generate molecules based on formula type\n if (cookedFormula.type === 'convoy' && cookedFormula.legs) {\n // Convoy: Generate from legs\n const orderedLegs = [...cookedFormula.legs].sort((a, b) => (a.order ?? 0) - (b.order ?? 0));\n\n for (let i = 0; i < orderedLegs.length; i++) {\n const leg = orderedLegs[i];\n const moleculeId = `mol-${cookedFormula.name}-${leg.id}-${randomUUID().slice(0, 8)}`;\n moleculeIdMap.set(leg.id, moleculeId);\n\n // Use pooled molecule for reduced allocations\n const pooledMol = moleculePool.acquire() as PooledMolecule;\n pooledMol.id = moleculeId;\n pooledMol.formulaName = cookedFormula.name;\n pooledMol.title = leg.title;\n pooledMol.description = leg.description;\n pooledMol.type = cookedFormula.type;\n pooledMol.sourceId = leg.id;\n pooledMol.agent = leg.agent;\n pooledMol.dependencies = i > 0 ? [moleculeIdMap.get(orderedLegs[i - 1].id)!] : [];\n pooledMol.order = i;\n pooledMol.metadata = {\n focus: leg.focus,\n legOrder: leg.order,\n };\n pooledMol.createdAt = new Date();\n\n // Create plain molecule for return (avoid pool reference issues)\n const molecule: Molecule = {\n id: pooledMol.id,\n formulaName: pooledMol.formulaName,\n title: pooledMol.title,\n description: pooledMol.description,\n type: pooledMol.type,\n sourceId: pooledMol.sourceId,\n agent: pooledMol.agent,\n dependencies: [...pooledMol.dependencies],\n order: pooledMol.order,\n metadata: { ...pooledMol.metadata },\n createdAt: pooledMol.createdAt,\n };\n\n // Release pooled molecule back to pool\n moleculePool.release(pooledMol);\n\n molecules.push(molecule);\n this.emit('molecule:created', molecule);\n }\n } else if (cookedFormula.steps) {\n // Workflow/Expansion/Aspect: Generate from steps\n const orderedSteps = this.resolveStepDependencies(cookedFormula.steps);\n\n for (let i = 0; i < orderedSteps.length; i++) {\n const step = orderedSteps[i];\n const moleculeId = `mol-${cookedFormula.name}-${step.id}-${randomUUID().slice(0, 8)}`;\n moleculeIdMap.set(step.id, moleculeId);\n\n // Map step dependencies to molecule IDs\n const dependencies: string[] = [];\n if (step.needs) {\n for (const need of step.needs) {\n const depMoleculeId = moleculeIdMap.get(need);\n if (depMoleculeId) {\n dependencies.push(depMoleculeId);\n }\n }\n }\n\n // Use pooled molecule for reduced allocations\n const pooledMol = moleculePool.acquire() as PooledMolecule;\n pooledMol.id = moleculeId;\n pooledMol.formulaName = cookedFormula.name;\n pooledMol.title = step.title;\n pooledMol.description = step.description;\n pooledMol.type = cookedFormula.type;\n pooledMol.sourceId = step.id;\n pooledMol.agent = undefined;\n pooledMol.dependencies = dependencies;\n pooledMol.order = i;\n pooledMol.metadata = {\n duration: step.duration,\n requires: step.requires,\n ...step.metadata,\n };\n pooledMol.createdAt = new Date();\n\n // Create plain molecule for return (avoid pool reference issues)\n const molecule: Molecule = {\n id: pooledMol.id,\n formulaName: pooledMol.formulaName,\n title: pooledMol.title,\n description: pooledMol.description,\n type: pooledMol.type,\n sourceId: pooledMol.sourceId,\n agent: pooledMol.agent,\n dependencies: [...pooledMol.dependencies],\n order: pooledMol.order,\n metadata: { ...pooledMol.metadata },\n createdAt: pooledMol.createdAt,\n };\n\n // Release pooled molecule back to pool\n moleculePool.release(pooledMol);\n\n molecules.push(molecule);\n this.emit('molecule:created', molecule);\n }\n }\n\n this.logger.info('Molecules generated', {\n formulaName: cookedFormula.name,\n count: molecules.length,\n });\n\n return molecules;\n }\n\n /**\n * Run a single step\n *\n * @param step - Step to execute\n * @param context - Execution context\n * @param options - Execution options\n * @returns Step result\n */\n async runStep(\n step: Step,\n context: StepContext,\n options: ExecuteOptions = {}\n ): Promise<StepResult> {\n const startTime = Date.now();\n\n this.logger.debug('Running step', {\n stepId: step.id,\n executionId: context.executionId,\n });\n\n // Generate cache key for step result memoization\n // Only cache if step is deterministic (no side effects indicator)\n const isCacheable = step.metadata?.cacheable !== false && !step.metadata?.hasSideEffects;\n const stepCacheKey = isCacheable\n ? hashKey([\n step.id,\n context.formula.name,\n JSON.stringify(context.variables),\n JSON.stringify(step.needs ?? []),\n ])\n : null;\n\n // Check step result cache\n if (stepCacheKey) {\n const cachedResult = stepResultCache.get(stepCacheKey);\n if (cachedResult) {\n this.logger.debug('Step cache hit', { stepId: step.id });\n return {\n ...cachedResult,\n metadata: { ...cachedResult.metadata, fromCache: true },\n };\n }\n }\n\n try {\n // Check for cancellation\n if (context.signal?.aborted) {\n throw new GasTownError('Step cancelled', GasTownErrorCode.UNKNOWN);\n }\n\n // Check dependencies are satisfied\n if (step.needs) {\n for (const dep of step.needs) {\n const depResult = context.previousResults.get(dep);\n if (!depResult || !depResult.success) {\n throw new GasTownError(\n `Dependency not satisfied: ${dep}`,\n GasTownErrorCode.UNKNOWN,\n { stepId: step.id, dependency: dep }\n );\n }\n }\n }\n\n // Use custom step handler if provided\n if (options.stepHandler) {\n const result = await options.stepHandler(step, context);\n if (stepCacheKey && result.success) {\n stepResultCache.set(stepCacheKey, result);\n }\n return result;\n }\n\n // Dry run mode\n if (options.dryRun) {\n return {\n stepId: step.id,\n success: true,\n output: { dryRun: true, step },\n durationMs: Date.now() - startTime,\n metadata: { dryRun: true },\n };\n }\n\n // Default execution via CLI\n const result = await this.executeStepViaCli(step, context, options);\n\n const stepResult: StepResult = {\n stepId: step.id,\n success: true,\n output: result,\n durationMs: Date.now() - startTime,\n };\n\n // Cache successful result\n if (stepCacheKey) {\n stepResultCache.set(stepCacheKey, stepResult);\n }\n\n return stepResult;\n } catch (error) {\n return {\n stepId: step.id,\n success: false,\n error: error instanceof Error ? error.message : String(error),\n durationMs: Date.now() - startTime,\n };\n }\n }\n\n /**\n * Get execution progress\n *\n * @param executionId - Execution ID to get progress for\n * @returns Execution progress or undefined\n */\n getProgress(executionId: string): ExecutionProgress | undefined {\n return this.executions.get(executionId);\n }\n\n /**\n * Cancel an execution\n *\n * @param executionId - Execution ID to cancel\n * @returns Whether cancellation was initiated\n */\n cancel(executionId: string): boolean {\n const controller = this.cancellations.get(executionId);\n if (controller) {\n controller.abort();\n return true;\n }\n return false;\n }\n\n /**\n * List all active executions\n */\n getActiveExecutions(): ExecutionProgress[] {\n return Array.from(this.executions.values()).filter(\n e => e.status === 'running' || e.status === 'pending'\n );\n }\n\n /**\n * Check if WASM is available for acceleration\n */\n isWasmAvailable(): boolean {\n return this.wasmLoader.isInitialized();\n }\n\n /**\n * Get cache statistics for performance monitoring\n */\n getCacheStats(): {\n stepResultCache: { entries: number; sizeBytes: number };\n cookCache: { entries: number; sizeBytes: number };\n } {\n return {\n stepResultCache: stepResultCache.stats(),\n cookCache: cookCache.stats(),\n };\n }\n\n /**\n * Clear all executor caches\n */\n clearCaches(): void {\n stepResultCache.clear();\n cookCache.clear();\n }\n\n // ============================================================================\n // Private Methods\n // ============================================================================\n\n /**\n * Parse formula content using WASM or JS fallback\n */\n private parseFormula(content: string): Formula {\n const loader = this.wasmLoader.isInitialized() ? this.wasmLoader : this.jsFallback;\n return loader.parseFormula(content);\n }\n\n /**\n * Fetch formula from CLI\n */\n private async fetchFormula(formulaName: string): Promise<Formula> {\n // Check if bridge is initialized\n if (!this.gtBridge.isInitialized()) {\n throw new GasTownError(\n 'GtBridge not initialized',\n GasTownErrorCode.NOT_INITIALIZED\n );\n }\n\n // Fetch formula via CLI (would be: gt formula show <name> --json)\n // For now, simulate with a placeholder\n // In production, this would call: this.gtBridge.execGt(['formula', 'show', formulaName, '--json'])\n this.logger.debug('Fetching formula from CLI', { formulaName });\n\n // Simulated formula for demonstration\n const formula: Formula = {\n name: formulaName,\n description: `Formula: ${formulaName}`,\n type: 'workflow',\n version: 1,\n steps: [\n {\n id: 'init',\n title: 'Initialize',\n description: 'Initialize the workflow',\n },\n {\n id: 'process',\n title: 'Process',\n description: 'Process the data',\n needs: ['init'],\n },\n {\n id: 'finalize',\n title: 'Finalize',\n description: 'Finalize the workflow',\n needs: ['process'],\n },\n ],\n vars: {},\n };\n\n return formula;\n }\n\n /**\n * Validate required variables are provided\n */\n private validateVariables(formula: Formula, vars: Record<string, string>): void {\n if (!formula.vars) return;\n\n const missing: string[] = [];\n\n for (const [name, varDef] of Object.entries(formula.vars)) {\n if (varDef.required && !(name in vars) && !varDef.default) {\n missing.push(name);\n }\n }\n\n if (missing.length > 0) {\n throw new GasTownError(\n `Missing required variables: ${missing.join(', ')}`,\n GasTownErrorCode.INVALID_ARGUMENTS,\n { missing }\n );\n }\n }\n\n /**\n * Resolve step dependencies using WASM or JS fallback\n */\n private resolveStepDependencies(steps: Step[]): Step[] {\n const loader = this.wasmLoader.isInitialized() ? this.wasmLoader : this.jsFallback;\n return loader.resolveStepDependencies(steps);\n }\n\n /**\n * Get ordered execution units (steps or legs) from formula\n */\n private getOrderedExecutionUnits(formula: CookedFormula): Step[] {\n if (formula.type === 'convoy' && formula.legs) {\n // Convert legs to steps for unified execution\n const legs = [...formula.legs].sort((a, b) => (a.order ?? 0) - (b.order ?? 0));\n return legs.map((leg, index) => ({\n id: leg.id,\n title: leg.title,\n description: leg.description,\n needs: index > 0 ? [legs[index - 1].id] : undefined,\n metadata: { agent: leg.agent, focus: leg.focus },\n }));\n }\n\n if (formula.steps) {\n return this.resolveStepDependencies(formula.steps);\n }\n\n return [];\n }\n\n /**\n * Execute step via CLI bridge\n */\n private async executeStepViaCli(\n step: Step,\n context: StepContext,\n options: ExecuteOptions\n ): Promise<unknown> {\n // Build CLI command for step execution\n const args = [\n 'formula',\n 'step',\n step.id,\n '--execution-id', context.executionId,\n '--json',\n ];\n\n if (options.targetAgent) {\n args.push('--agent', options.targetAgent);\n }\n\n if (options.stepTimeout) {\n args.push('--timeout', String(options.stepTimeout));\n }\n\n // Execute via bridge\n const result = await this.gtBridge.execGt(args);\n\n if (!result.success) {\n throw new GasTownError(\n `Step execution failed: ${result.error}`,\n GasTownErrorCode.CLI_EXECUTION_FAILED,\n { stepId: step.id, error: result.error }\n );\n }\n\n return result.data ? JSON.parse(result.data) : null;\n }\n\n /**\n * Merge multiple abort signals\n */\n private mergeSignals(...signals: AbortSignal[]): AbortSignal {\n const controller = new AbortController();\n\n for (const signal of signals) {\n if (signal.aborted) {\n controller.abort();\n break;\n }\n\n signal.addEventListener('abort', () => controller.abort(), { once: true });\n }\n\n return controller.signal;\n }\n}\n\n// ============================================================================\n// Factory Function\n// ============================================================================\n\n/**\n * Create a new FormulaExecutor instance\n */\nexport function createFormulaExecutor(\n gtBridge: GtBridge,\n wasmLoader?: IWasmLoader,\n logger?: ExecutorLogger\n): FormulaExecutor {\n return new FormulaExecutor(gtBridge, wasmLoader, logger);\n}\n\nexport default FormulaExecutor;\n"]}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
'use strict';/**
|
|
2
|
+
* @claude-flow/plugin-gastown-bridge v0.1.4
|
|
3
|
+
*
|
|
4
|
+
* WASM-accelerated Gas Town orchestration for Claude Flow V3
|
|
5
|
+
* Bundle optimized: <100KB gzipped total
|
|
6
|
+
*
|
|
7
|
+
* @license MIT
|
|
8
|
+
* @copyright 2024 rUv
|
|
9
|
+
*/
|
|
10
|
+
var u=class{cache=new Map;head=null;tail=null;currentSize=0;maxSize;maxEntries;ttlMs;onEvict;constructor(e={}){this.maxSize=e.maxSize??50*1024*1024,this.maxEntries=e.maxEntries??1e3,this.ttlMs=e.ttlMs??0,this.onEvict=e.onEvict;}get(e){let t=this.cache.get(e);if(t){if(this.ttlMs>0&&Date.now()-t.createdAt>this.ttlMs){this.delete(e);return}return this.moveToFront(t),t.accessCount++,t.value}}set(e,t,i){let r=i??this.estimateSize(t),s=this.cache.get(e);if(s){this.currentSize-=s.size,s.value=t,s.size=r,s.createdAt=Date.now(),this.currentSize+=r,this.moveToFront(s);return}for(;(this.cache.size>=this.maxEntries||this.currentSize+r>this.maxSize)&&this.tail;)this.evictLRU();let o={key:e,value:t,prev:null,next:this.head,size:r,createdAt:Date.now(),accessCount:1};this.head&&(this.head.prev=o),this.head=o,this.tail||(this.tail=o),this.cache.set(e,o),this.currentSize+=r;}has(e){let t=this.cache.get(e);return t?this.ttlMs>0&&Date.now()-t.createdAt>this.ttlMs?(this.delete(e),false):true:false}delete(e){let t=this.cache.get(e);return t?(this.removeNode(t),this.cache.delete(e),this.currentSize-=t.size,true):false}clear(){if(this.onEvict)for(let[e,t]of this.cache)this.onEvict(e,t.value);this.cache.clear(),this.head=null,this.tail=null,this.currentSize=0;}stats(){let e=0;for(let t of this.cache.values())e+=t.accessCount;return {entries:this.cache.size,sizeBytes:this.currentSize,maxEntries:this.maxEntries,maxSizeBytes:this.maxSize,hitRate:this.cache.size>0?e/this.cache.size:0}}keys(){return this.cache.keys()}get size(){return this.cache.size}moveToFront(e){e!==this.head&&(this.removeNode(e),e.prev=null,e.next=this.head,this.head&&(this.head.prev=e),this.head=e,this.tail||(this.tail=e));}removeNode(e){e.prev?e.prev.next=e.next:this.head=e.next,e.next?e.next.prev=e.prev:this.tail=e.prev;}evictLRU(){if(!this.tail)return;let e=this.tail;this.removeNode(e),this.cache.delete(e.key),this.currentSize-=e.size,this.onEvict&&this.onEvict(e.key,e.value);}estimateSize(e){return e==null?8:typeof e=="string"?e.length*2:typeof e=="number"?8:typeof e=="boolean"?4:ArrayBuffer.isView(e)?e.byteLength:Array.isArray(e)?e.reduce((t,i)=>t+this.estimateSize(i),64):typeof e=="object"?JSON.stringify(e).length*2:64}},l=class{astCache;hashCache=new Map;constructor(e=500){this.astCache=new u({maxEntries:e,ttlMs:300*1e3});}get(e){let t=this.hashContent(e);return this.astCache.get(t)}set(e,t){let i=this.hashContent(e);this.astCache.set(i,t);}has(e){let t=this.hashContent(e);return this.astCache.has(t)}clear(){this.astCache.clear(),this.hashCache.clear();}stats(){let e=this.astCache.stats();return {entries:e.entries,sizeBytes:e.sizeBytes}}hashContent(e){let t=this.hashCache.get(e);if(t)return t;let i=2166136261;for(let s=0;s<e.length;s++)i^=e.charCodeAt(s),i=i*16777619>>>0;let r=i.toString(36);if(this.hashCache.set(e,r),this.hashCache.size>1e4){let s=this.hashCache.keys().next().value;s&&this.hashCache.delete(s);}return r}};var d=class{pending=new Map;timeoutMs;constructor(e=3e4){this.timeoutMs=e;}async dedupe(e,t){let i=this.pending.get(e);if(i)return new Promise((n,a)=>{i.resolvers.push({resolve:n,reject:a});});let r=[],s=(async()=>{try{let n=await t();for(let{resolve:a}of r)a(n);return n}catch(n){for(let{reject:a}of r)a(n);throw n}finally{this.pending.delete(e);}})(),o={promise:s,resolvers:r,startedAt:Date.now()};return this.pending.set(e,o),setTimeout(()=>{let n=this.pending.get(e);if(n===o){this.pending.delete(e);for(let{reject:a}of n.resolvers)a(new Error(`Request timed out after ${this.timeoutMs}ms`));}},this.timeoutMs),s}get pendingCount(){return this.pending.size}clear(){for(let[e,t]of this.pending)for(let{reject:i}of t.resolvers)i(new Error("Deduplicator cleared"));this.pending.clear();}},c=class{preloadQueue=[];loaded=new Map;errors=new Map;isPreloading=false;preloadPromise=null;register(e,t,i=0){this.loaded.has(e)||(this.preloadQueue.push({name:e,loader:t,priority:i}),this.preloadQueue.sort((r,s)=>s.priority-r.priority));}async startPreload(){if(!(this.isPreloading||this.preloadQueue.length===0)){this.isPreloading=true,this.preloadPromise=this.runPreload();try{await this.preloadPromise;}finally{this.isPreloading=false,this.preloadPromise=null;}}}get(e){return this.loaded.get(e)}isLoaded(e){return this.loaded.has(e)}getError(e){return this.errors.get(e)}status(){return {queued:this.preloadQueue.length,loaded:this.loaded.size,errors:this.errors.size,isPreloading:this.isPreloading}}async waitForPreload(){this.preloadPromise&&await this.preloadPromise;}async runPreload(){for(;this.preloadQueue.length>0;){let e=this.preloadQueue.shift();if(!e)break;await this.scheduleIdleTask(async()=>{try{let t=await e.loader();this.loaded.set(e.name,t);}catch(t){this.errors.set(e.name,t);}});}}scheduleIdleTask(e){return new Promise(t=>{typeof requestIdleCallback<"u"?requestIdleCallback(async()=>{await e(),t();}):typeof setImmediate<"u"?setImmediate(async()=>{await e(),t();}):setTimeout(async()=>{await e(),t();},0);})}};var m=class{constructor(e,t=100){this.emit=e;this.debounceMs=t;}emit;debounceMs;pending=null;timeoutId=null;lastEmitTime=0;update(e){this.pending=e;let i=Date.now()-this.lastEmitTime;if(i>=this.debounceMs){this.flush();return}this.timeoutId||(this.timeoutId=setTimeout(()=>{this.flush();},this.debounceMs-i));}flush(){this.timeoutId&&(clearTimeout(this.timeoutId),this.timeoutId=null),this.pending!==null&&(this.emit(this.pending),this.pending=null,this.lastEmitTime=Date.now());}cancel(){this.timeoutId&&(clearTimeout(this.timeoutId),this.timeoutId=null),this.pending=null;}};exports.a=u;exports.b=l;exports.c=d;exports.d=c;exports.e=m;//# sourceMappingURL=chunk-46PJFOMY.cjs.map
|
|
11
|
+
//# sourceMappingURL=chunk-46PJFOMY.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/cache.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"],"mappings":"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","file":"chunk-46PJFOMY.cjs","sourcesContent":["/**\n * Gas Town Bridge Plugin - Unified Cache System\n *\n * High-performance caching with:\n * - O(1) LRU cache with Map + doubly linked list\n * - WeakMap for formula AST caching (GC-friendly)\n * - Result memoization for expensive operations\n * - Batch deduplication for concurrent requests\n *\n * Performance targets:\n * - 50% memory reduction via eviction\n * - 3x faster cold start via preloading\n *\n * @module gastown-bridge/cache\n * @version 0.1.0\n */\n\n// ============================================================================\n// LRU Cache Implementation - O(1) get/set\n// ============================================================================\n\n/**\n * Doubly linked list node for LRU tracking\n */\ninterface LRUNode<K, V> {\n key: K;\n value: V;\n prev: LRUNode<K, V> | null;\n next: LRUNode<K, V> | null;\n size: number;\n createdAt: number;\n accessCount: number;\n}\n\n/**\n * LRU Cache with O(1) operations\n *\n * Uses Map for O(1) lookups and doubly linked list for O(1) eviction.\n * Supports TTL, size limits, and access tracking.\n *\n * @example\n * ```typescript\n * const cache = new LRUCache<string, Formula>({ maxSize: 1000, ttlMs: 60000 });\n * cache.set('formula-1', parsedFormula);\n * const formula = cache.get('formula-1');\n * ```\n */\nexport class LRUCache<K, V> {\n private readonly cache: Map<K, LRUNode<K, V>> = new Map();\n private head: LRUNode<K, V> | null = null;\n private tail: LRUNode<K, V> | null = null;\n private currentSize = 0;\n\n private readonly maxSize: number;\n private readonly maxEntries: number;\n private readonly ttlMs: number;\n private readonly onEvict?: (key: K, value: V) => void;\n\n constructor(options: {\n maxSize?: number;\n maxEntries?: number;\n ttlMs?: number;\n onEvict?: (key: K, value: V) => void;\n } = {}) {\n this.maxSize = options.maxSize ?? 50 * 1024 * 1024; // 50MB default\n this.maxEntries = options.maxEntries ?? 1000;\n this.ttlMs = options.ttlMs ?? 0; // 0 = no TTL\n this.onEvict = options.onEvict;\n }\n\n /**\n * Get value from cache - O(1)\n */\n get(key: K): V | undefined {\n const node = this.cache.get(key);\n if (!node) return undefined;\n\n // Check TTL\n if (this.ttlMs > 0 && Date.now() - node.createdAt > this.ttlMs) {\n this.delete(key);\n return undefined;\n }\n\n // Move to front (most recently used)\n this.moveToFront(node);\n node.accessCount++;\n return node.value;\n }\n\n /**\n * Set value in cache - O(1)\n */\n set(key: K, value: V, sizeBytes?: number): void {\n const size = sizeBytes ?? this.estimateSize(value);\n\n // Check if key exists - update in place\n const existing = this.cache.get(key);\n if (existing) {\n this.currentSize -= existing.size;\n existing.value = value;\n existing.size = size;\n existing.createdAt = Date.now();\n this.currentSize += size;\n this.moveToFront(existing);\n return;\n }\n\n // Evict if necessary\n while (\n (this.cache.size >= this.maxEntries || this.currentSize + size > this.maxSize) &&\n this.tail\n ) {\n this.evictLRU();\n }\n\n // Create new node\n const node: LRUNode<K, V> = {\n key,\n value,\n prev: null,\n next: this.head,\n size,\n createdAt: Date.now(),\n accessCount: 1,\n };\n\n // Insert at front\n if (this.head) {\n this.head.prev = node;\n }\n this.head = node;\n if (!this.tail) {\n this.tail = node;\n }\n\n this.cache.set(key, node);\n this.currentSize += size;\n }\n\n /**\n * Check if key exists - O(1)\n */\n has(key: K): boolean {\n const node = this.cache.get(key);\n if (!node) return false;\n\n // Check TTL\n if (this.ttlMs > 0 && Date.now() - node.createdAt > this.ttlMs) {\n this.delete(key);\n return false;\n }\n\n return true;\n }\n\n /**\n * Delete from cache - O(1)\n */\n delete(key: K): boolean {\n const node = this.cache.get(key);\n if (!node) return false;\n\n this.removeNode(node);\n this.cache.delete(key);\n this.currentSize -= node.size;\n return true;\n }\n\n /**\n * Clear all entries\n */\n clear(): void {\n if (this.onEvict) {\n for (const [key, node] of this.cache) {\n this.onEvict(key, node.value);\n }\n }\n this.cache.clear();\n this.head = null;\n this.tail = null;\n this.currentSize = 0;\n }\n\n /**\n * Get cache stats\n */\n stats(): {\n entries: number;\n sizeBytes: number;\n maxEntries: number;\n maxSizeBytes: number;\n hitRate: number;\n } {\n let totalAccess = 0;\n for (const node of this.cache.values()) {\n totalAccess += node.accessCount;\n }\n\n return {\n entries: this.cache.size,\n sizeBytes: this.currentSize,\n maxEntries: this.maxEntries,\n maxSizeBytes: this.maxSize,\n hitRate: this.cache.size > 0 ? totalAccess / this.cache.size : 0,\n };\n }\n\n /**\n * Get all keys (for iteration)\n */\n keys(): IterableIterator<K> {\n return this.cache.keys();\n }\n\n /**\n * Get size\n */\n get size(): number {\n return this.cache.size;\n }\n\n // Private methods\n\n private moveToFront(node: LRUNode<K, V>): void {\n if (node === this.head) return;\n\n // Remove from current position\n this.removeNode(node);\n\n // Insert at front\n node.prev = null;\n node.next = this.head;\n if (this.head) {\n this.head.prev = node;\n }\n this.head = node;\n if (!this.tail) {\n this.tail = node;\n }\n }\n\n private removeNode(node: LRUNode<K, V>): void {\n if (node.prev) {\n node.prev.next = node.next;\n } else {\n this.head = node.next;\n }\n\n if (node.next) {\n node.next.prev = node.prev;\n } else {\n this.tail = node.prev;\n }\n }\n\n private evictLRU(): void {\n if (!this.tail) return;\n\n const evicted = this.tail;\n this.removeNode(evicted);\n this.cache.delete(evicted.key);\n this.currentSize -= evicted.size;\n\n if (this.onEvict) {\n this.onEvict(evicted.key, evicted.value);\n }\n }\n\n private estimateSize(value: V): number {\n if (value === null || value === undefined) return 8;\n if (typeof value === 'string') return value.length * 2;\n if (typeof value === 'number') return 8;\n if (typeof value === 'boolean') return 4;\n if (ArrayBuffer.isView(value)) return value.byteLength;\n if (Array.isArray(value)) {\n return value.reduce((acc, v) => acc + this.estimateSize(v), 64);\n }\n if (typeof value === 'object') {\n return JSON.stringify(value).length * 2;\n }\n return 64;\n }\n}\n\n// ============================================================================\n// Formula AST Cache with WeakMap (GC-friendly)\n// ============================================================================\n\n/**\n * Formula AST cache using WeakMap for automatic GC\n *\n * Stores parsed ASTs keyed by source string reference.\n * When the source string is no longer referenced, the AST is GC'd.\n */\nexport class FormulaASTCache {\n // Use a Map with string keys since TOML content is the key\n // WeakMap only works with object keys\n private readonly astCache: LRUCache<string, unknown>;\n private readonly hashCache: Map<string, string> = new Map();\n\n constructor(maxEntries = 500) {\n this.astCache = new LRUCache<string, unknown>({\n maxEntries,\n ttlMs: 5 * 60 * 1000, // 5 minute TTL\n });\n }\n\n /**\n * Get cached AST for formula content\n */\n get(content: string): unknown | undefined {\n const hash = this.hashContent(content);\n return this.astCache.get(hash);\n }\n\n /**\n * Cache AST for formula content\n */\n set(content: string, ast: unknown): void {\n const hash = this.hashContent(content);\n this.astCache.set(hash, ast);\n }\n\n /**\n * Check if content has cached AST\n */\n has(content: string): boolean {\n const hash = this.hashContent(content);\n return this.astCache.has(hash);\n }\n\n /**\n * Clear cache\n */\n clear(): void {\n this.astCache.clear();\n this.hashCache.clear();\n }\n\n /**\n * Get stats\n */\n stats(): { entries: number; sizeBytes: number } {\n const cacheStats = this.astCache.stats();\n return {\n entries: cacheStats.entries,\n sizeBytes: cacheStats.sizeBytes,\n };\n }\n\n // Simple hash for content deduplication\n private hashContent(content: string): string {\n const cached = this.hashCache.get(content);\n if (cached) return cached;\n\n // FNV-1a hash\n let hash = 2166136261;\n for (let i = 0; i < content.length; i++) {\n hash ^= content.charCodeAt(i);\n hash = (hash * 16777619) >>> 0;\n }\n\n const hashStr = hash.toString(36);\n this.hashCache.set(content, hashStr);\n\n // Limit hash cache size\n if (this.hashCache.size > 10000) {\n const first = this.hashCache.keys().next().value;\n if (first) this.hashCache.delete(first);\n }\n\n return hashStr;\n }\n}\n\n// ============================================================================\n// Result Cache for WASM Operations\n// ============================================================================\n\n/**\n * Result cache for expensive WASM operations\n *\n * Caches:\n * - Formula parse results\n * - Cook results\n * - Graph analysis results (topo sort, cycle detection)\n */\nexport class ResultCache {\n readonly formulas: LRUCache<string, unknown>;\n readonly cooked: LRUCache<string, unknown>;\n readonly beads: LRUCache<string, unknown>;\n readonly convoys: LRUCache<string, unknown>;\n readonly graphs: LRUCache<string, unknown>;\n\n constructor(options: {\n maxFormulaEntries?: number;\n maxCookedEntries?: number;\n maxBeadEntries?: number;\n maxConvoyEntries?: number;\n maxGraphEntries?: number;\n } = {}) {\n this.formulas = new LRUCache({\n maxEntries: options.maxFormulaEntries ?? 200,\n ttlMs: 10 * 60 * 1000, // 10 min\n });\n\n this.cooked = new LRUCache({\n maxEntries: options.maxCookedEntries ?? 500,\n ttlMs: 5 * 60 * 1000, // 5 min\n });\n\n this.beads = new LRUCache({\n maxEntries: options.maxBeadEntries ?? 1000,\n ttlMs: 60 * 1000, // 1 min - beads change frequently\n });\n\n this.convoys = new LRUCache({\n maxEntries: options.maxConvoyEntries ?? 100,\n ttlMs: 30 * 1000, // 30 sec - convoys update often\n });\n\n this.graphs = new LRUCache({\n maxEntries: options.maxGraphEntries ?? 100,\n ttlMs: 2 * 60 * 1000, // 2 min\n });\n }\n\n /**\n * Clear all caches\n */\n clearAll(): void {\n this.formulas.clear();\n this.cooked.clear();\n this.beads.clear();\n this.convoys.clear();\n this.graphs.clear();\n }\n\n /**\n * Get combined stats\n */\n stats(): Record<string, { entries: number; sizeBytes: number }> {\n return {\n formulas: this.formulas.stats(),\n cooked: this.cooked.stats(),\n beads: this.beads.stats(),\n convoys: this.convoys.stats(),\n graphs: this.graphs.stats(),\n };\n }\n}\n\n// ============================================================================\n// Batch Deduplication for Concurrent Requests\n// ============================================================================\n\n/**\n * Pending request tracker for batch deduplication\n */\ninterface PendingRequest<T> {\n promise: Promise<T>;\n resolvers: Array<{\n resolve: (value: T) => void;\n reject: (error: unknown) => void;\n }>;\n startedAt: number;\n}\n\n/**\n * Batch deduplicator for concurrent identical requests\n *\n * When multiple callers request the same operation simultaneously,\n * only one actual execution occurs and all callers receive the same result.\n *\n * @example\n * ```typescript\n * const dedup = new BatchDeduplicator<Formula>();\n *\n * // These concurrent calls will only execute once\n * const [r1, r2, r3] = await Promise.all([\n * dedup.dedupe('formula-1', () => parseFormula(content)),\n * dedup.dedupe('formula-1', () => parseFormula(content)),\n * dedup.dedupe('formula-1', () => parseFormula(content)),\n * ]);\n * ```\n */\nexport class BatchDeduplicator<T> {\n private pending: Map<string, PendingRequest<T>> = new Map();\n private readonly timeoutMs: number;\n\n constructor(timeoutMs = 30000) {\n this.timeoutMs = timeoutMs;\n }\n\n /**\n * Deduplicate concurrent requests for the same key\n */\n async dedupe(key: string, executor: () => Promise<T>): Promise<T> {\n // Check for existing pending request\n const existing = this.pending.get(key);\n if (existing) {\n // Join existing request\n return new Promise<T>((resolve, reject) => {\n existing.resolvers.push({ resolve, reject });\n });\n }\n\n // Create new pending request\n let resolvers: PendingRequest<T>['resolvers'] = [];\n\n const promise = (async () => {\n try {\n const result = await executor();\n\n // Resolve all waiters\n for (const { resolve } of resolvers) {\n resolve(result);\n }\n\n return result;\n } catch (error) {\n // Reject all waiters\n for (const { reject } of resolvers) {\n reject(error);\n }\n throw error;\n } finally {\n this.pending.delete(key);\n }\n })();\n\n const pendingRequest: PendingRequest<T> = {\n promise,\n resolvers,\n startedAt: Date.now(),\n };\n\n this.pending.set(key, pendingRequest);\n\n // Set timeout to prevent stuck requests\n setTimeout(() => {\n const req = this.pending.get(key);\n if (req === pendingRequest) {\n this.pending.delete(key);\n for (const { reject } of req.resolvers) {\n reject(new Error(`Request timed out after ${this.timeoutMs}ms`));\n }\n }\n }, this.timeoutMs);\n\n return promise;\n }\n\n /**\n * Get number of pending requests\n */\n get pendingCount(): number {\n return this.pending.size;\n }\n\n /**\n * Clear all pending requests (reject with error)\n */\n clear(): void {\n for (const [key, req] of this.pending) {\n for (const { reject } of req.resolvers) {\n reject(new Error('Deduplicator cleared'));\n }\n }\n this.pending.clear();\n }\n}\n\n// ============================================================================\n// Preloader for Idle-Time Module Loading\n// ============================================================================\n\n/**\n * Idle-time module preloader\n *\n * Preloads WASM modules and other resources during browser/Node idle time.\n */\nexport class ModulePreloader {\n private readonly preloadQueue: Array<{\n name: string;\n loader: () => Promise<unknown>;\n priority: number;\n }> = [];\n\n private readonly loaded: Map<string, unknown> = new Map();\n private readonly errors: Map<string, Error> = new Map();\n private isPreloading = false;\n private preloadPromise: Promise<void> | null = null;\n\n /**\n * Register a module for preloading\n */\n register(\n name: string,\n loader: () => Promise<unknown>,\n priority = 0\n ): void {\n if (this.loaded.has(name)) return;\n\n this.preloadQueue.push({ name, loader, priority });\n this.preloadQueue.sort((a, b) => b.priority - a.priority);\n }\n\n /**\n * Start preloading during idle time\n */\n async startPreload(): Promise<void> {\n if (this.isPreloading || this.preloadQueue.length === 0) return;\n\n this.isPreloading = true;\n this.preloadPromise = this.runPreload();\n\n try {\n await this.preloadPromise;\n } finally {\n this.isPreloading = false;\n this.preloadPromise = null;\n }\n }\n\n /**\n * Get preloaded module\n */\n get<T>(name: string): T | undefined {\n return this.loaded.get(name) as T | undefined;\n }\n\n /**\n * Check if module is loaded\n */\n isLoaded(name: string): boolean {\n return this.loaded.has(name);\n }\n\n /**\n * Get loading error if any\n */\n getError(name: string): Error | undefined {\n return this.errors.get(name);\n }\n\n /**\n * Get preload status\n */\n status(): {\n queued: number;\n loaded: number;\n errors: number;\n isPreloading: boolean;\n } {\n return {\n queued: this.preloadQueue.length,\n loaded: this.loaded.size,\n errors: this.errors.size,\n isPreloading: this.isPreloading,\n };\n }\n\n /**\n * Wait for preloading to complete\n */\n async waitForPreload(): Promise<void> {\n if (this.preloadPromise) {\n await this.preloadPromise;\n }\n }\n\n private async runPreload(): Promise<void> {\n while (this.preloadQueue.length > 0) {\n const item = this.preloadQueue.shift();\n if (!item) break;\n\n // Use requestIdleCallback in browser, setImmediate in Node\n await this.scheduleIdleTask(async () => {\n try {\n const module = await item.loader();\n this.loaded.set(item.name, module);\n } catch (error) {\n this.errors.set(item.name, error as Error);\n }\n });\n }\n }\n\n private scheduleIdleTask(task: () => Promise<void>): Promise<void> {\n return new Promise((resolve) => {\n if (typeof requestIdleCallback !== 'undefined') {\n requestIdleCallback(async () => {\n await task();\n resolve();\n });\n } else if (typeof setImmediate !== 'undefined') {\n setImmediate(async () => {\n await task();\n resolve();\n });\n } else {\n setTimeout(async () => {\n await task();\n resolve();\n }, 0);\n }\n });\n }\n}\n\n// ============================================================================\n// Connection Pool for CLI Execution\n// ============================================================================\n\n/**\n * Pooled resource wrapper\n */\ninterface PooledResource<T> {\n resource: T;\n inUse: boolean;\n createdAt: number;\n lastUsedAt: number;\n useCount: number;\n}\n\n/**\n * Generic connection/resource pool\n *\n * Manages a pool of reusable resources like CLI processes or connections.\n */\nexport class ResourcePool<T> {\n private pool: PooledResource<T>[] = [];\n private waitQueue: Array<{\n resolve: (resource: T) => void;\n reject: (error: Error) => void;\n timeoutId: NodeJS.Timeout;\n }> = [];\n\n private readonly create: () => Promise<T>;\n private readonly destroy: (resource: T) => Promise<void>;\n private readonly validate: (resource: T) => boolean;\n\n private readonly minSize: number;\n private readonly maxSize: number;\n private readonly acquireTimeoutMs: number;\n private readonly idleTimeoutMs: number;\n\n constructor(options: {\n create: () => Promise<T>;\n destroy: (resource: T) => Promise<void>;\n validate?: (resource: T) => boolean;\n minSize?: number;\n maxSize?: number;\n acquireTimeoutMs?: number;\n idleTimeoutMs?: number;\n }) {\n this.create = options.create;\n this.destroy = options.destroy;\n this.validate = options.validate ?? (() => true);\n this.minSize = options.minSize ?? 1;\n this.maxSize = options.maxSize ?? 10;\n this.acquireTimeoutMs = options.acquireTimeoutMs ?? 5000;\n this.idleTimeoutMs = options.idleTimeoutMs ?? 60000;\n\n // Start idle cleanup timer\n setInterval(() => this.cleanupIdle(), this.idleTimeoutMs / 2);\n }\n\n /**\n * Acquire a resource from the pool\n */\n async acquire(): Promise<T> {\n // Try to find an available resource\n for (const pooled of this.pool) {\n if (!pooled.inUse && this.validate(pooled.resource)) {\n pooled.inUse = true;\n pooled.lastUsedAt = Date.now();\n pooled.useCount++;\n return pooled.resource;\n }\n }\n\n // Create new resource if under max\n if (this.pool.length < this.maxSize) {\n const resource = await this.create();\n const pooled: PooledResource<T> = {\n resource,\n inUse: true,\n createdAt: Date.now(),\n lastUsedAt: Date.now(),\n useCount: 1,\n };\n this.pool.push(pooled);\n return resource;\n }\n\n // Wait for available resource\n return new Promise((resolve, reject) => {\n const timeoutId = setTimeout(() => {\n const index = this.waitQueue.findIndex((w) => w.resolve === resolve);\n if (index !== -1) {\n this.waitQueue.splice(index, 1);\n }\n reject(new Error('Acquire timeout'));\n }, this.acquireTimeoutMs);\n\n this.waitQueue.push({ resolve, reject, timeoutId });\n });\n }\n\n /**\n * Release a resource back to the pool\n */\n release(resource: T): void {\n const pooled = this.pool.find((p) => p.resource === resource);\n if (!pooled) return;\n\n pooled.inUse = false;\n pooled.lastUsedAt = Date.now();\n\n // Check if anyone is waiting\n if (this.waitQueue.length > 0) {\n const waiter = this.waitQueue.shift();\n if (waiter && this.validate(resource)) {\n clearTimeout(waiter.timeoutId);\n pooled.inUse = true;\n pooled.useCount++;\n waiter.resolve(resource);\n }\n }\n }\n\n /**\n * Execute with automatic acquire/release\n */\n async withResource<R>(fn: (resource: T) => Promise<R>): Promise<R> {\n const resource = await this.acquire();\n try {\n return await fn(resource);\n } finally {\n this.release(resource);\n }\n }\n\n /**\n * Get pool stats\n */\n stats(): {\n total: number;\n inUse: number;\n available: number;\n waiting: number;\n } {\n const inUse = this.pool.filter((p) => p.inUse).length;\n return {\n total: this.pool.length,\n inUse,\n available: this.pool.length - inUse,\n waiting: this.waitQueue.length,\n };\n }\n\n /**\n * Shutdown the pool\n */\n async shutdown(): Promise<void> {\n // Reject all waiters\n for (const waiter of this.waitQueue) {\n clearTimeout(waiter.timeoutId);\n waiter.reject(new Error('Pool shutdown'));\n }\n this.waitQueue = [];\n\n // Destroy all resources\n for (const pooled of this.pool) {\n try {\n await this.destroy(pooled.resource);\n } catch {\n // Ignore destruction errors\n }\n }\n this.pool = [];\n }\n\n private async cleanupIdle(): Promise<void> {\n const now = Date.now();\n const toRemove: PooledResource<T>[] = [];\n\n for (const pooled of this.pool) {\n if (\n !pooled.inUse &&\n now - pooled.lastUsedAt > this.idleTimeoutMs &&\n this.pool.length > this.minSize\n ) {\n toRemove.push(pooled);\n }\n }\n\n for (const pooled of toRemove) {\n const index = this.pool.indexOf(pooled);\n if (index !== -1) {\n this.pool.splice(index, 1);\n try {\n await this.destroy(pooled.resource);\n } catch {\n // Ignore\n }\n }\n }\n }\n}\n\n// ============================================================================\n// Debounced Progress Updates\n// ============================================================================\n\n/**\n * Debounced update emitter\n *\n * Batches rapid updates and emits at most once per interval.\n */\nexport class DebouncedEmitter<T> {\n private pending: T | null = null;\n private timeoutId: NodeJS.Timeout | null = null;\n private lastEmitTime = 0;\n\n constructor(\n private readonly emit: (value: T) => void,\n private readonly debounceMs: number = 100\n ) {}\n\n /**\n * Schedule an update (debounced)\n */\n update(value: T): void {\n this.pending = value;\n\n const now = Date.now();\n const timeSinceLastEmit = now - this.lastEmitTime;\n\n // If enough time has passed, emit immediately\n if (timeSinceLastEmit >= this.debounceMs) {\n this.flush();\n return;\n }\n\n // Otherwise, schedule for later\n if (!this.timeoutId) {\n this.timeoutId = setTimeout(() => {\n this.flush();\n }, this.debounceMs - timeSinceLastEmit);\n }\n }\n\n /**\n * Flush pending update immediately\n */\n flush(): void {\n if (this.timeoutId) {\n clearTimeout(this.timeoutId);\n this.timeoutId = null;\n }\n\n if (this.pending !== null) {\n this.emit(this.pending);\n this.pending = null;\n this.lastEmitTime = Date.now();\n }\n }\n\n /**\n * Cancel pending update\n */\n cancel(): void {\n if (this.timeoutId) {\n clearTimeout(this.timeoutId);\n this.timeoutId = null;\n }\n this.pending = null;\n }\n}\n\n// ============================================================================\n// Lazy Parser - Parse on Access\n// ============================================================================\n\n/**\n * Lazy value wrapper - computes value on first access\n */\nexport class Lazy<T> {\n private computed = false;\n private value: T | undefined;\n private error: Error | undefined;\n\n constructor(private readonly factory: () => T) {}\n\n /**\n * Get the value (computes on first access)\n */\n get(): T {\n if (!this.computed) {\n try {\n this.value = this.factory();\n } catch (e) {\n this.error = e as Error;\n }\n this.computed = true;\n }\n\n if (this.error) {\n throw this.error;\n }\n\n return this.value!;\n }\n\n /**\n * Check if value has been computed\n */\n get isComputed(): boolean {\n return this.computed;\n }\n\n /**\n * Reset to uncomputed state\n */\n reset(): void {\n this.computed = false;\n this.value = undefined;\n this.error = undefined;\n }\n}\n\n/**\n * Async lazy value wrapper\n */\nexport class AsyncLazy<T> {\n private promise: Promise<T> | null = null;\n private value: T | undefined;\n private resolved = false;\n\n constructor(private readonly factory: () => Promise<T>) {}\n\n /**\n * Get the value (computes on first access)\n */\n async get(): Promise<T> {\n if (this.resolved) {\n return this.value!;\n }\n\n if (!this.promise) {\n this.promise = this.factory().then((v) => {\n this.value = v;\n this.resolved = true;\n return v;\n });\n }\n\n return this.promise;\n }\n\n /**\n * Check if value has been resolved\n */\n get isResolved(): boolean {\n return this.resolved;\n }\n\n /**\n * Reset to uncomputed state\n */\n reset(): void {\n this.promise = null;\n this.value = undefined;\n this.resolved = false;\n }\n}\n\n// ============================================================================\n// Exports\n// ============================================================================\n\nexport default {\n LRUCache,\n FormulaASTCache,\n ResultCache,\n BatchDeduplicator,\n ModulePreloader,\n ResourcePool,\n DebouncedEmitter,\n Lazy,\n AsyncLazy,\n};\n"]}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import {g,a,b as b$1,t,Y as Y$1}from'./chunk-TGFYZY3C.js';import {a as a$1,c,e}from'./chunk-U74VYTRV.js';import {EventEmitter}from'events';import {z as z$1}from'zod';import {v4}from'uuid';/**
|
|
2
|
+
* @claude-flow/plugin-gastown-bridge v0.1.4
|
|
3
|
+
*
|
|
4
|
+
* WASM-accelerated Gas Town orchestration for Claude Flow V3
|
|
5
|
+
* Bundle optimized: <100KB gzipped total
|
|
6
|
+
*
|
|
7
|
+
* @license MIT
|
|
8
|
+
* @copyright 2024 rUv
|
|
9
|
+
*/
|
|
10
|
+
var de={townRoot:"~/gt",enableBeadsSync:true,syncInterval:6e4,nativeFormulas:true,enableConvoys:true,autoCreateBeads:false,enableGUPP:false,guppCheckInterval:5e3,cliTimeout:3e4},pe={CLI_NOT_FOUND:"GT_CLI_NOT_FOUND",CLI_TIMEOUT:"GT_CLI_TIMEOUT",CLI_ERROR:"GT_CLI_ERROR",BEAD_NOT_FOUND:"GT_BEAD_NOT_FOUND",CONVOY_NOT_FOUND:"GT_CONVOY_NOT_FOUND",FORMULA_NOT_FOUND:"GT_FORMULA_NOT_FOUND",FORMULA_PARSE_ERROR:"GT_FORMULA_PARSE_ERROR",WASM_NOT_INITIALIZED:"GT_WASM_NOT_INITIALIZED",SYNC_ERROR:"GT_SYNC_ERROR",DEPENDENCY_CYCLE:"GT_DEPENDENCY_CYCLE",INVALID_SLING_TARGET:"GT_INVALID_SLING_TARGET"},N=z$1.enum(["open","in_progress","closed"]),F=z$1.object({id:z$1.string().min(1),title:z$1.string().min(1),description:z$1.string(),status:N,priority:z$1.number().int().min(0),labels:z$1.array(z$1.string()),parentId:z$1.string().optional(),createdAt:z$1.coerce.date(),updatedAt:z$1.coerce.date(),assignee:z$1.string().optional(),rig:z$1.string().optional(),blockedBy:z$1.array(z$1.string()).optional(),blocks:z$1.array(z$1.string()).optional()}),L=z$1.object({title:z$1.string().min(1),description:z$1.string().optional(),priority:z$1.number().int().min(0).optional(),labels:z$1.array(z$1.string()).optional(),parent:z$1.string().optional(),rig:z$1.string().optional(),assignee:z$1.string().optional()}),G=z$1.enum(["convoy","workflow","expansion","aspect"]),W=z$1.object({id:z$1.string().min(1),title:z$1.string().min(1),description:z$1.string(),needs:z$1.array(z$1.string()).optional(),duration:z$1.number().optional(),requires:z$1.array(z$1.string()).optional(),metadata:z$1.record(z$1.unknown()).optional()}),U=z$1.object({id:z$1.string().min(1),title:z$1.string().min(1),focus:z$1.string(),description:z$1.string(),agent:z$1.string().optional(),order:z$1.number().optional()}),J=z$1.object({name:z$1.string().min(1),description:z$1.string().optional(),default:z$1.string().optional(),required:z$1.boolean().optional(),pattern:z$1.string().optional(),enum:z$1.array(z$1.string()).optional()}),z=z$1.object({strategy:z$1.enum(["merge","sequential","parallel"]),format:z$1.string().optional(),description:z$1.string().optional()}),j=z$1.object({name:z$1.string().min(1),content:z$1.string(),outputPath:z$1.string().optional()}),Y=z$1.object({name:z$1.string().min(1),pointcut:z$1.string(),advice:z$1.string(),type:z$1.enum(["before","after","around"])}),q=z$1.object({name:z$1.string().min(1),description:z$1.string(),type:G,version:z$1.number().int().min(1),legs:z$1.array(U).optional(),synthesis:z.optional(),steps:z$1.array(W).optional(),vars:z$1.record(J).optional(),templates:z$1.array(j).optional(),aspects:z$1.array(Y).optional(),metadata:z$1.record(z$1.unknown()).optional()}),V=z$1.enum(["active","landed","failed","paused"]),$=z$1.object({total:z$1.number().int().min(0),closed:z$1.number().int().min(0),inProgress:z$1.number().int().min(0),blocked:z$1.number().int().min(0)}),H=z$1.object({id:z$1.string().min(1),name:z$1.string().min(1),trackedIssues:z$1.array(z$1.string()),status:V,startedAt:z$1.coerce.date(),completedAt:z$1.coerce.date().optional(),progress:$,formula:z$1.string().optional(),description:z$1.string().optional()}),P=z$1.object({name:z$1.string().min(1),issues:z$1.array(z$1.string()).min(1),description:z$1.string().optional(),formula:z$1.string().optional()}),ue=z$1.enum(["mayor","polecat","refinery","witness","deacon","dog","crew"]),Z=z$1.enum(["polecat","crew","mayor"]),K=z$1.object({beadId:z$1.string().min(1),target:Z,formula:z$1.string().optional(),priority:z$1.number().int().min(0).optional()}),ge=z$1.enum(["pull","push","both"]),Q=z$1.object({townRoot:z$1.string().default("~/gt"),enableBeadsSync:z$1.boolean().default(true),syncInterval:z$1.number().int().positive().default(6e4),nativeFormulas:z$1.boolean().default(true),enableConvoys:z$1.boolean().default(true),autoCreateBeads:z$1.boolean().default(false),enableGUPP:z$1.boolean().default(false),guppCheckInterval:z$1.number().int().positive().default(5e3),cliTimeout:z$1.number().int().positive().default(3e4)});function ye(l){return F.parse(l)}function me(l){return L.parse(l)}function he(l){return q.parse(l)}function ve(l){return H.parse(l)}function fe(l){return P.parse(l)}function be(l){return K.parse(l)}function Ce(l){return Q.parse(l)}var te={debug:(l,e)=>console.debug(`[convoy-tracker] ${l}`,e??""),info:(l,e)=>console.info(`[convoy-tracker] ${l}`,e??""),warn:(l,e)=>console.warn(`[convoy-tracker] ${l}`,e??""),error:(l,e)=>console.error(`[convoy-tracker] ${l}`,e??"")},b=z$1.string().uuid("Invalid convoy ID format"),D=z$1.array(z$1.string().min(1)).min(1,"At least one issue ID required"),I=class extends EventEmitter{bdBridge;convoys=new Map;logger;config;progressTimers=new Map;constructor(e,t){super(),this.bdBridge=e.bdBridge,this.logger=t??te,this.config={autoUpdateProgress:e.autoUpdateProgress??true,progressUpdateInterval:e.progressUpdateInterval??3e4,persistConvoys:e.persistConvoys??false,storagePath:e.storagePath??"./data/convoys"};}async create(e,t,r){let s=P.parse({name:e,issues:t,description:r}),n=await this.verifyIssues(s.issues);if(n.length===0)throw g.createFailed("No valid issues found");let a=await this.calculateProgress(n),i=v4(),c=new Date,g$1={id:i,name:s.name,trackedIssues:n,status:"active",startedAt:c,progress:a,description:s.description};return this.convoys.set(i,{convoy:g$1,createdAt:c,updatedAt:c,metadata:{}}),this.emitConvoyEvent("convoy:created",g$1),this.config.autoUpdateProgress&&this.startProgressTracking(i),this.logger.info("Convoy created",{convoyId:i,name:e,issueCount:n.length}),g$1}async addIssues(e,t){b.parse(e),D.parse(t);let r=this.convoys.get(e);if(!r)throw g.notFound(e);let s=await this.verifyIssues(t);if(s.length===0)throw new g("No valid issues to add",a.CONVOY_CREATE_FAILED,{convoyId:e,issues:t});let n=new Set(r.convoy.trackedIssues),a$1=s.filter(d=>!n.has(d));if(a$1.length===0)return r.convoy;let i=[...r.convoy.trackedIssues,...a$1],c=await this.calculateProgress(i),g$1={...r.convoy,trackedIssues:i,progress:c};return r.convoy=g$1,r.updatedAt=new Date,this.emitConvoyEvent("convoy:issue:added",g$1,{issues:a$1}),this.logger.info("Issues added to convoy",{convoyId:e,addedCount:a$1.length,totalCount:i.length}),g$1}async removeIssues(e,t){b.parse(e),D.parse(t);let r=this.convoys.get(e);if(!r)throw g.notFound(e);let s=new Set(t),n=r.convoy.trackedIssues.filter(g=>!s.has(g));if(n.length===r.convoy.trackedIssues.length)return r.convoy;let a=n.length>0?await this.calculateProgress(n):{total:0,closed:0,inProgress:0,blocked:0},i={...r.convoy,trackedIssues:n,progress:a};r.convoy=i,r.updatedAt=new Date;let c=t.filter(g=>r.convoy.trackedIssues.includes(g)&&!n.includes(g));return this.emitConvoyEvent("convoy:issue:removed",i,{issues:c}),this.logger.info("Issues removed from convoy",{convoyId:e,removedCount:c.length,remainingCount:n.length}),i}async getStatus(e){b.parse(e);let t=this.convoys.get(e);if(!t)throw g.notFound(e);let r=await this.calculateProgress(t.convoy.trackedIssues),s=t.convoy.progress;if(r.closed!==s.closed||r.inProgress!==s.inProgress||r.blocked!==s.blocked){let n={...t.convoy,progress:r};t.convoy=n,t.updatedAt=new Date,this.emitConvoyEvent("convoy:progressed",n);}return t.convoy}async complete(e){b.parse(e);let t=this.convoys.get(e);if(!t)throw g.notFound(e);if(t.convoy.status==="landed")return t.convoy;let r=t.convoy.status,s=new Date,n={...t.convoy,status:"landed",completedAt:s};return t.convoy=n,t.updatedAt=s,this.stopProgressTracking(e),this.emitConvoyEvent("convoy:completed",n,{previousStatus:r}),this.logger.info("Convoy completed",{convoyId:e,name:n.name,duration:s.getTime()-n.startedAt.getTime()}),n}async cancel(e,t){b.parse(e);let r=this.convoys.get(e);if(!r)throw g.notFound(e);if(r.convoy.status==="failed"||r.convoy.status==="landed")return r.convoy;let s=r.convoy.status,n=new Date,a={...r.convoy,status:"failed",completedAt:n};return r.convoy=a,r.updatedAt=n,r.metadata.cancellationReason=t,this.stopProgressTracking(e),this.emitConvoyEvent("convoy:cancelled",a,{previousStatus:s,reason:t}),this.logger.info("Convoy cancelled",{convoyId:e,name:a.name,reason:t}),a}async pause(e){b.parse(e);let t=this.convoys.get(e);if(!t)throw g.notFound(e);if(t.convoy.status!=="active")return t.convoy;let r=t.convoy.status,s={...t.convoy,status:"paused"};return t.convoy=s,t.updatedAt=new Date,this.stopProgressTracking(e),this.emitConvoyEvent("convoy:paused",s,{previousStatus:r}),this.logger.info("Convoy paused",{convoyId:e,name:s.name}),s}async resume(e){b.parse(e);let t=this.convoys.get(e);if(!t)throw g.notFound(e);if(t.convoy.status!=="paused")return t.convoy;let r=t.convoy.status,s={...t.convoy,status:"active"};return t.convoy=s,t.updatedAt=new Date,this.config.autoUpdateProgress&&this.startProgressTracking(e),this.emitConvoyEvent("convoy:resumed",s,{previousStatus:r}),this.logger.info("Convoy resumed",{convoyId:e,name:s.name}),s}listConvoys(e){let t=Array.from(this.convoys.values()).map(r=>r.convoy);return e?t.filter(r=>r.status===e):t}getConvoy(e){return this.convoys.get(e)?.convoy}deleteConvoy(e){return this.stopProgressTracking(e),this.convoys.delete(e)}async calculateProgress(e){if(e.length===0)return {total:0,closed:0,inProgress:0,blocked:0};try{let t=await this.fetchBeads(e),r=new Map(t.map(i=>[i.id,i])),s=0,n=0,a=0;for(let i of e){let c=r.get(i);c&&(c.status==="closed"?s++:c.status==="in_progress"&&n++,c.blockedBy&&c.blockedBy.length>0&&c.blockedBy.some(d=>{let y=r.get(d);return y&&y.status!=="closed"})&&a++);}return {total:e.length,closed:s,inProgress:n,blocked:a}}catch(t){return this.logger.warn("Failed to calculate progress",{issueIds:e,error:t instanceof Error?t.message:String(t)}),{total:e.length,closed:0,inProgress:0,blocked:0}}}async verifyIssues(e){let t=[];for(let r of e)try{await this.bdBridge.getBead(r),t.push(r);}catch{this.logger.warn("Issue not found",{issueId:r});}return t}async fetchBeads(e){let t=[];for(let r of e)try{let s=await this.bdBridge.getBead(r);t.push({id:s.id,title:s.content.slice(0,100),description:s.content,status:this.mapBeadStatus(s.type),priority:0,labels:s.tags??[],createdAt:s.timestamp?new Date(s.timestamp):new Date,updatedAt:new Date,blockedBy:s.parentId?[s.parentId]:[]});}catch{}return t}mapBeadStatus(e){switch(e){case "closed":return "closed";case "in_progress":case "response":case "code":return "in_progress";default:return "open"}}startProgressTracking(e){if(this.progressTimers.has(e))return;let t=setInterval(async()=>{try{await this.getStatus(e);}catch(r){this.logger.warn("Progress tracking error",{convoyId:e,error:r instanceof Error?r.message:String(r)});}},this.config.progressUpdateInterval);this.progressTimers.set(e,t);}stopProgressTracking(e){let t=this.progressTimers.get(e);t&&(clearInterval(t),this.progressTimers.delete(e));}emitConvoyEvent(e,t,r){let s={type:e,convoyId:t.id,convoyName:t.name,timestamp:new Date,status:t.status,progress:t.progress,...r};this.emit(e,s),this.emit("convoy:*",s);}dispose(){for(let[e,t]of this.progressTimers)clearInterval(t);this.progressTimers.clear(),this.removeAllListeners();}};function oe(l,e){return new I(l,e)}var ne={debug:(l,e)=>console.debug(`[convoy-observer] ${l}`,e??""),info:(l,e)=>console.info(`[convoy-observer] ${l}`,e??""),warn:(l,e)=>console.warn(`[convoy-observer] ${l}`,e??""),error:(l,e)=>console.error(`[convoy-observer] ${l}`,e??"")},O=z$1.string().uuid("Invalid convoy ID format"),S=class extends EventEmitter{bdBridge;tracker;wasmModule;logger;config;watchers=new Map;beadCache;completionCache;fetchDedup;progressEmitters;pendingSubscriptions=new Map;subscriptionFlushTimer=null;constructor(e,t){super(),this.bdBridge=e.bdBridge,this.tracker=e.tracker,this.wasmModule=e.wasmModule,this.logger=t??ne,this.config={pollInterval:e.pollInterval??1e4,maxPollAttempts:e.maxPollAttempts??0,useWasm:e.useWasm??true,useExponentialBackoff:e.useExponentialBackoff??true,maxBackoffInterval:e.maxBackoffInterval??6e4,backoffMultiplier:e.backoffMultiplier??1.5,deltaUpdatesOnly:e.deltaUpdatesOnly??true,progressDebounceMs:e.progressDebounceMs??500},this.beadCache=new a$1({maxEntries:1e3,ttlMs:30*1e3}),this.completionCache=new a$1({maxEntries:100,ttlMs:5*1e3}),this.fetchDedup=new c(3e4),this.progressEmitters=new Map;}watch(e$1,t){O.parse(e$1),this.stopWatching(e$1);let r=this.config.pollInterval,n=(a=>setTimeout(async()=>{await this.pollConvoyWithBackoff(e$1,t);},a))(r);return this.watchers.set(e$1,{timer:n,callback:t,attempts:0,currentInterval:r,lastState:null}),this.progressEmitters.set(e$1,new e(a=>this.emit("progress",e$1,a),this.config.progressDebounceMs)),this.pollConvoyWithBackoff(e$1,t),this.logger.info("Started watching convoy",{convoyId:e$1,interval:r}),{convoyId:e$1,stop:()=>this.stopWatching(e$1),isActive:()=>this.watchers.has(e$1)}}batchSubscribe(e,t){this.pendingSubscriptions.has(e)||this.pendingSubscriptions.set(e,new Set),this.pendingSubscriptions.get(e).add(t),this.subscriptionFlushTimer||(this.subscriptionFlushTimer=setTimeout(()=>{this.flushSubscriptions();},50));}flushSubscriptions(){this.subscriptionFlushTimer=null;for(let[e,t]of this.pendingSubscriptions){let r=(s,n)=>{for(let a of t)try{a(s,n);}catch(i){this.logger.error("Subscription callback error",{convoyId:e,error:i instanceof Error?i.message:String(i)});}};this.watch(e,r);}this.pendingSubscriptions.clear(),this.logger.debug("Flushed subscription batch",{convoys:this.pendingSubscriptions.size});}async checkCompletion(e){O.parse(e);let t=this.tracker.getConvoy(e);if(!t)throw g.notFound(e);let r=await this.fetchBeads(t.trackedIssues),s=new Map(r.map(u=>[u.id,u])),n=[],a=[],i=0;for(let u of t.trackedIssues){let v=s.get(u);v&&(v.status==="closed"?i++:v.status==="in_progress"?a.push(u):n.push(u));}let c=false,g$1=[],d=[],y=[];if(this.config.useWasm&&this.wasmModule)try{let u=this.analyzeWithWasm(r);c=u.hasCycles,g$1=u.cycleIssues,d=u.readyIssues,y=u.blockedIssues;}catch(u){this.logger.warn("WASM analysis failed, falling back to JS",{error:u instanceof Error?u.message:String(u)});let v=this.analyzeWithJS(r,t.trackedIssues);c=v.hasCycles,g$1=v.cycleIssues,d=v.readyIssues,y=v.blockedIssues;}else {let u=this.analyzeWithJS(r,t.trackedIssues);c=u.hasCycles,g$1=u.cycleIssues,d=u.readyIssues,y=u.blockedIssues;}let p={total:t.trackedIssues.length,closed:i,inProgress:a.length,blocked:y.length};return {allComplete:i===t.trackedIssues.length,progress:p,openIssues:n,inProgressIssues:a,blockedIssues:y,readyIssues:d,hasCycles:c,cycleIssues:g$1}}async getBlockers(e){return (await this.checkCompletion(e)).blockedIssues}async getReadyIssues(e){return (await this.checkCompletion(e)).readyIssues}async getExecutionOrder(e){O.parse(e);let t=this.tracker.getConvoy(e);if(!t)throw g.notFound(e);let r=await this.fetchBeads(t.trackedIssues);if(this.config.useWasm&&this.wasmModule)try{let s=this.beadsToWasmNodes(r),n=this.wasmModule.topo_sort(JSON.stringify(s)),a$1=JSON.parse(n);if(a$1.hasCycle)throw new b$1("Cannot compute execution order: dependency cycle detected",a.DEPENDENCY_CYCLE,{cycleNodes:a$1.cycleNodes});return a$1.sorted}catch(s){if(s instanceof b$1)throw s;this.logger.warn("WASM topo sort failed, falling back to JS",{error:s instanceof Error?s.message:String(s)});}return this.topoSortJS(r)}stopWatching(e){let t=this.watchers.get(e);if(t){clearTimeout(t.timer),this.watchers.delete(e);let r=this.progressEmitters.get(e);r&&(r.flush(),this.progressEmitters.delete(e)),this.completionCache.delete(e),this.logger.info("Stopped watching convoy",{convoyId:e});}}stopAll(){for(let[e,t]of this.watchers)clearTimeout(t.timer);this.watchers.clear();for(let e of this.progressEmitters.values())e.flush();this.progressEmitters.clear(),this.beadCache.clear(),this.completionCache.clear(),this.fetchDedup.clear(),this.subscriptionFlushTimer&&(clearTimeout(this.subscriptionFlushTimer),this.subscriptionFlushTimer=null),this.pendingSubscriptions.clear(),this.logger.info("Stopped all convoy watchers");}setWasmModule(e){this.wasmModule=e,this.logger.info("WASM module set");}isWasmAvailable(){return !!this.wasmModule}async pollConvoyWithBackoff(e,t){let r=this.watchers.get(e);if(r)try{let s=this.tracker.getConvoy(e);if(!s){this.stopWatching(e);return}if(s.status==="landed"||s.status==="failed"){t(s,s.status==="landed"),this.stopWatching(e);return}let n=await this.checkCompletion(e),a=JSON.stringify({allComplete:n.allComplete,progress:n.progress,openIssues:n.openIssues.length,inProgress:n.inProgressIssues.length,blocked:n.blockedIssues.length}),i=r.lastState!==a;if(r.lastState=a,this.config.deltaUpdatesOnly&&!i)this.config.useExponentialBackoff&&(r.currentInterval=Math.min(r.currentInterval*this.config.backoffMultiplier,this.config.maxBackoffInterval));else {r.currentInterval=this.config.pollInterval,t(s,n.allComplete);let c=this.progressEmitters.get(e);c&&c.update(n.progress);}if(r.attempts++,this.config.maxPollAttempts>0&&r.attempts>=this.config.maxPollAttempts){this.logger.warn("Max poll attempts reached",{convoyId:e,attempts:r.attempts}),this.stopWatching(e);return}clearTimeout(r.timer),r.timer=setTimeout(async()=>{await this.pollConvoyWithBackoff(e,t);},r.currentInterval);}catch(s){this.logger.error("Poll error",{convoyId:e,error:s instanceof Error?s.message:String(s)}),this.config.useExponentialBackoff&&(r.currentInterval=Math.min(r.currentInterval*(this.config.backoffMultiplier*1.5),this.config.maxBackoffInterval)),clearTimeout(r.timer),r.timer=setTimeout(async()=>{await this.pollConvoyWithBackoff(e,t);},r.currentInterval);}}async pollConvoy(e,t){return this.pollConvoyWithBackoff(e,t)}async fetchBeads(e){let t$1=e.sort().join(",");return this.fetchDedup.dedupe(t$1,async()=>{let r=[],s=[];for(let a of e){let i=this.beadCache.get(a);i?r.push(i):s.push(a);}let n=10;for(let a=0;a<s.length;a+=n){let c=s.slice(a,a+n).map(async d=>{try{let y=await this.bdBridge.getBead(d),p=t.acquire();p.id=y.id,p.title=y.content.slice(0,100),p.description=y.content,p.status=this.mapBeadStatus(y.type),p.priority=0,p.labels=y.tags??[],p.createdAt=y.timestamp?new Date(y.timestamp):new Date,p.updatedAt=new Date,p.blockedBy=y.parentId?[y.parentId]:[],p.blocks=[];let u={id:p.id,title:p.title,description:p.description,status:p.status,priority:p.priority,labels:p.labels,createdAt:p.createdAt,updatedAt:p.updatedAt,blockedBy:p.blockedBy,blocks:p.blocks};return t.release(p),this.beadCache.set(d,u),u}catch{return null}}),g=await Promise.all(c);r.push(...g.filter(d=>d!==null));}return r})}mapBeadStatus(e){switch(e){case "closed":return "closed";case "in_progress":case "response":case "code":return "in_progress";default:return "open"}}beadsToWasmNodes(e){return e.map(t=>({id:t.id,title:t.title,status:t.status,priority:t.priority,blocked_by:t.blockedBy??[],blocks:t.blocks??[],duration:void 0}))}analyzeWithWasm(e){if(!this.wasmModule)throw new Error("WASM module not available");let t=this.beadsToWasmNodes(e),r=JSON.stringify(t),s=this.wasmModule.has_cycle(r),n=[];if(s){let m=this.wasmModule.find_cycle_nodes(r);n=JSON.parse(m);}let a=this.wasmModule.get_ready_beads(r),i=JSON.parse(a),c=this.wasmModule.compute_levels(r),g=JSON.parse(c),d=new Map;for(let[m,f]of Object.entries(g)){let C=parseInt(m,10);for(let k of f)d.set(k,C);}let y=new Map(e.map(m=>[m.id,m])),p=i.map(m=>{let f=y.get(m);return {id:m,title:f.title,priority:f.priority,level:d.get(m)??0}}),u=new Set(e.filter(m=>m.status==="closed").map(m=>m.id)),v=new Set(e.map(m=>m.id)),_=e.filter(m=>m.status==="closed"?false:(m.blockedBy??[]).some(C=>!u.has(C))).map(m=>{let f=(m.blockedBy??[]).filter(k=>!u.has(k)),C=f.every(k=>v.has(k));return {blockedIssue:m.id,blockers:f,internalBlockers:C}});return {hasCycles:s,cycleIssues:n,readyIssues:p,blockedIssues:_}}analyzeWithJS(e,t){new Map(e.map(d=>[d.id,d]));let s=new Set(t),n=new Set(e.filter(d=>d.status==="closed").map(d=>d.id)),a=this.detectCyclesJS(e),i=a?this.findCycleNodesJS(e):[],c=e.filter(d=>d.status==="closed"?false:(d.blockedBy??[]).every(p=>n.has(p))).map((d,y)=>({id:d.id,title:d.title,priority:d.priority,level:0})),g=e.filter(d=>d.status==="closed"?false:(d.blockedBy??[]).some(p=>!n.has(p))).map(d=>{let y=(d.blockedBy??[]).filter(u=>!n.has(u)),p=y.every(u=>s.has(u));return {blockedIssue:d.id,blockers:y,internalBlockers:p}});return {hasCycles:a,cycleIssues:i,readyIssues:c,blockedIssues:g}}detectCyclesJS(e){let t=new Set,r=new Set,s=new Map(e.map(a=>[a.id,a])),n=a=>{t.add(a),r.add(a);let i=s.get(a);if(i){for(let c of i.blockedBy??[])if(t.has(c)){if(r.has(c))return true}else if(n(c))return true}return r.delete(a),false};for(let a of e)if(!t.has(a.id)&&n(a.id))return true;return false}findCycleNodesJS(e){let t=new Map;new Map(e.map(n=>[n.id,n]));for(let n of e)t.set(n.id,(n.blockedBy??[]).length);let s=true;for(;s;){s=false;for(let[n,a]of t)if(a===0){t.delete(n);for(let i of e)if(i.blockedBy?.includes(n)){let c=t.get(i.id)??0;c>0&&(t.set(i.id,c-1),s=true);}s=true;}}return Array.from(t.keys())}topoSortJS(e){new Map(e.map(a=>[a.id,a]));let r=new Map,s=[];for(let a of e)r.set(a.id,(a.blockedBy??[]).length);let n=[];for(let[a,i]of r)i===0&&n.push(a);for(;n.length>0;){let a=n.shift();s.push(a);for(let i of e)if(i.blockedBy?.includes(a)){let g=(r.get(i.id)??0)-1;r.set(i.id,g),g===0&&n.push(i.id);}}if(s.length!==e.length)throw new b$1("Cannot compute execution order: dependency cycle detected",a.DEPENDENCY_CYCLE);return s}dispose(){this.stopAll(),this.removeAllListeners();}};function ae(l,e){return new S(l,e)}function ie(l,e){return new Y$1(()=>new S(l,e),{name:"convoy-observer",cleanup:t=>{t.dispose();}})}function le(l){return {isActive:l.isActive(),watchCount:l.getWatchCount()}}export{fe as A,be as B,Ce as C,I as D,oe as E,S as F,ae as G,ie as H,le as I,de as a,pe as b,N as c,F as d,L as e,G as f,W as g,U as h,J as i,z as j,j as k,Y as l,q as m,V as n,$ as o,H as p,P as q,ue as r,Z as s,K as t,ge as u,Q as v,ye as w,me as x,he as y,ve as z};//# sourceMappingURL=chunk-7UPWLRZX.js.map
|
|
11
|
+
//# sourceMappingURL=chunk-7UPWLRZX.js.map
|