@eldrforge/kodrdriv 1.2.128 → 1.2.130

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.
Files changed (32) hide show
  1. package/dist/commands/audio-commit.js +2 -2
  2. package/dist/commands/audio-commit.js.map +1 -1
  3. package/dist/commands/audio-review.js +2 -2
  4. package/dist/commands/audio-review.js.map +1 -1
  5. package/dist/commands/tree.js +4 -4
  6. package/dist/commands/tree.js.map +1 -1
  7. package/dist/constants.js +1 -1
  8. package/dist/util/general.js +3 -52
  9. package/dist/util/general.js.map +1 -1
  10. package/package.json +4 -1
  11. package/dist/execution/CommandValidator.js +0 -192
  12. package/dist/execution/CommandValidator.js.map +0 -1
  13. package/dist/execution/DependencyChecker.js +0 -102
  14. package/dist/execution/DependencyChecker.js.map +0 -1
  15. package/dist/execution/DynamicTaskPool.js +0 -661
  16. package/dist/execution/DynamicTaskPool.js.map +0 -1
  17. package/dist/execution/RecoveryManager.js +0 -584
  18. package/dist/execution/RecoveryManager.js.map +0 -1
  19. package/dist/execution/ResourceMonitor.js +0 -150
  20. package/dist/execution/ResourceMonitor.js.map +0 -1
  21. package/dist/execution/Scheduler.js +0 -98
  22. package/dist/execution/Scheduler.js.map +0 -1
  23. package/dist/execution/TreeExecutionAdapter.js +0 -225
  24. package/dist/execution/TreeExecutionAdapter.js.map +0 -1
  25. package/dist/ui/ProgressFormatter.js +0 -250
  26. package/dist/ui/ProgressFormatter.js.map +0 -1
  27. package/dist/util/checkpointManager.js +0 -166
  28. package/dist/util/checkpointManager.js.map +0 -1
  29. package/dist/util/countdown.js +0 -215
  30. package/dist/util/countdown.js.map +0 -1
  31. package/dist/util/dependencyGraph.js +0 -222
  32. package/dist/util/dependencyGraph.js.map +0 -1
@@ -1 +0,0 @@
1
- {"version":3,"file":"RecoveryManager.js","sources":["../../src/execution/RecoveryManager.ts"],"sourcesContent":["import { getLogger } from '../logging';\nimport { DependencyGraph, findAllDependents } from '../util/dependencyGraph';\nimport { ParallelExecutionCheckpoint, FailedPackageSnapshot, RecoveryHint } from '../types/parallelExecution';\nimport { CheckpointManager } from '../util/checkpointManager';\nimport * as path from 'path';\n\nexport interface ValidationResult {\n valid: boolean;\n issues: string[];\n warnings: string[];\n}\n\nexport interface RecoveryOptions {\n markCompleted?: string[];\n markFailed?: string[];\n skipPackages?: string[];\n retryFailed?: boolean;\n skipFailed?: boolean;\n resetPackage?: string;\n maxRetries?: number;\n}\n\n/**\n * RecoveryManager provides granular control over execution state recovery\n */\nexport class RecoveryManager {\n private checkpoint: ParallelExecutionCheckpoint;\n private graph: DependencyGraph;\n private checkpointManager: CheckpointManager;\n private logger = getLogger();\n\n constructor(\n checkpoint: ParallelExecutionCheckpoint,\n graph: DependencyGraph,\n checkpointManager: CheckpointManager\n ) {\n this.checkpoint = checkpoint;\n this.graph = graph;\n this.checkpointManager = checkpointManager;\n }\n\n /**\n * Resolve a package identifier (directory name or package name) to a package name\n */\n private resolvePackageName(identifier: string): string | null {\n // Try exact package name match first\n if (this.graph.packages.has(identifier)) {\n return identifier;\n }\n\n // Try directory name match\n for (const [pkgName, pkgInfo] of this.graph.packages) {\n const dirName = path.basename(pkgInfo.path);\n if (dirName === identifier) {\n return pkgName;\n }\n }\n\n return null;\n }\n\n /**\n * Mark packages as completed\n * Accepts either package names (e.g., \"@eldrforge/git-tools\") or directory names (e.g., \"git-tools\")\n */\n async markCompleted(packages: string[]): Promise<void> {\n this.logger.info(`RECOVERY_MARKING_COMPLETED: Marking packages as completed | Package Count: ${packages.length} | Action: Update checkpoint state | Purpose: Manual recovery`);\n\n for (const pkgIdentifier of packages) {\n // Resolve identifier to package name\n const pkg = this.resolvePackageName(pkgIdentifier);\n\n if (!pkg) {\n // List available packages for better error message\n const available = Array.from(this.graph.packages.entries())\n .map(([name, info]) => `${path.basename(info.path)} (${name})`)\n .join(', ');\n throw new Error(`Package not found: ${pkgIdentifier}. Available packages: ${available}`);\n }\n\n // Validate not already completed\n if (this.checkpoint.state.completed.includes(pkg)) {\n this.logger.warn(`RECOVERY_ALREADY_COMPLETED: Package already marked as completed | Package: ${pkg} | Action: Skipping | Status: already-completed`);\n continue;\n }\n\n // Remove from other states\n this.removeFromAllStates(pkg);\n\n // Add to completed\n this.checkpoint.state.completed.push(pkg);\n\n this.logger.info(`RECOVERY_PACKAGE_COMPLETED: Package marked as completed | Package: ${pkg} | Status: completed | Checkpoint: Updated`);\n }\n\n // Update ready queue and count what got unblocked\n const beforeSkipped = this.checkpoint.state.skipped.length;\n const beforeReady = this.checkpoint.state.ready.length;\n\n this.updateReadyState();\n\n const afterSkipped = this.checkpoint.state.skipped.length;\n const afterReady = this.checkpoint.state.ready.length;\n\n const unblockedCount = beforeSkipped - afterSkipped;\n const newReadyCount = afterReady - beforeReady;\n\n // Save checkpoint\n await this.saveCheckpoint();\n\n this.logger.info('State updated successfully');\n\n if (unblockedCount > 0) {\n this.logger.info(`✓ Unblocked ${unblockedCount} package(s)`);\n }\n if (newReadyCount > 0) {\n this.logger.info(`✓ ${newReadyCount} package(s) ready to execute`);\n }\n if (unblockedCount === 0 && newReadyCount === 0 && this.checkpoint.state.skipped.length > 0) {\n this.logger.warn(`⚠️ No packages unblocked. ${this.checkpoint.state.skipped.length} packages still blocked by dependencies.`);\n this.logger.warn(' Use --status to see what\\'s blocking them.');\n }\n }\n\n /**\n * Mark packages as failed\n */\n async markFailed(packages: string[], reason: string = 'Manually marked as failed'): Promise<void> {\n this.logger.info(`RECOVERY_MARKING_FAILED: Marking packages as failed | Package Count: ${packages.length} | Action: Update checkpoint state | Purpose: Skip dependent packages`);\n\n for (const pkg of packages) {\n // Validate package exists\n if (!this.graph.packages.has(pkg)) {\n throw new Error(`Package not found: ${pkg}`);\n }\n\n // Remove from other states\n this.removeFromAllStates(pkg);\n\n // Add to failed\n const failureInfo: FailedPackageSnapshot = {\n name: pkg,\n error: reason,\n isRetriable: false,\n attemptNumber: 1,\n failedAt: new Date().toISOString(),\n dependencies: Array.from(this.graph.edges.get(pkg) || []),\n dependents: Array.from(findAllDependents(pkg, this.graph))\n };\n\n this.checkpoint.state.failed.push(failureInfo);\n\n this.logger.info(`RECOVERY_PACKAGE_FAILED: Package marked as failed | Package: ${pkg} | Status: failed | Checkpoint: Updated`);\n\n // Cascade to dependents\n const dependents = findAllDependents(pkg, this.graph);\n for (const dep of dependents) {\n this.removeFromAllStates(dep);\n this.checkpoint.state.skipped.push(dep);\n this.logger.warn(`RECOVERY_DEPENDENT_SKIPPED: Dependent package skipped | Package: ${dep} | Failed Dependency: ${pkg} | Reason: dependency-failed`);\n }\n }\n\n await this.saveCheckpoint();\n }\n\n /**\n * Skip packages and their dependents\n */\n async skipPackages(packages: string[]): Promise<void> {\n this.logger.info(`Skipping ${packages.length} package(s)...`);\n\n const toSkip = new Set<string>(packages);\n\n // Find all dependents\n for (const pkg of packages) {\n const dependents = findAllDependents(pkg, this.graph);\n for (const dep of dependents) {\n toSkip.add(dep);\n }\n }\n\n this.logger.info(`Total packages to skip (including dependents): ${toSkip.size}`);\n\n for (const pkg of toSkip) {\n this.removeFromAllStates(pkg);\n if (!this.checkpoint.state.skipped.includes(pkg)) {\n this.checkpoint.state.skipped.push(pkg);\n }\n this.logger.info(`RECOVERY_PACKAGE_SKIPPED: Package marked as skipped | Package: ${pkg} | Status: skipped | Checkpoint: Updated`);\n }\n\n await this.saveCheckpoint();\n }\n\n /**\n * Retry failed packages\n */\n async retryFailed(options?: { maxRetries?: number }): Promise<void> {\n const failed = this.checkpoint.state.failed;\n\n if (failed.length === 0) {\n this.logger.info('RECOVERY_NO_FAILED: No failed packages found | Action: Nothing to retry | Status: All packages succeeded or skipped');\n return;\n }\n\n this.logger.info(`RECOVERY_RETRY_STARTING: Initiating retry for failed packages | Failed Count: ${failed.length} | Action: Reset to pending and retry`);\n\n const retriable: FailedPackageSnapshot[] = [];\n const nonRetriable: FailedPackageSnapshot[] = [];\n\n for (const failedPkg of failed) {\n if (failedPkg.isRetriable || options?.maxRetries) {\n retriable.push(failedPkg);\n } else {\n nonRetriable.push(failedPkg);\n }\n }\n\n if (nonRetriable.length > 0) {\n this.logger.warn(`${nonRetriable.length} package(s) are not retriable: ${nonRetriable.map(p => p.name).join(', ')}`);\n if (!options?.maxRetries) {\n this.logger.warn('Use --max-retries to force retry of non-retriable packages');\n }\n }\n\n for (const failedPkg of retriable) {\n // Reset retry count if max retries overridden\n if (options?.maxRetries) {\n this.checkpoint.retryAttempts[failedPkg.name] = 0;\n }\n\n // Move back to pending\n this.removeFromAllStates(failedPkg.name);\n this.checkpoint.state.pending.push(failedPkg.name);\n\n // Un-skip dependents if they were skipped\n for (const dependent of failedPkg.dependents) {\n if (this.checkpoint.state.skipped.includes(dependent)) {\n this.checkpoint.state.skipped = this.checkpoint.state.skipped.filter(p => p !== dependent);\n this.checkpoint.state.pending.push(dependent);\n this.logger.info(`RECOVERY_DEPENDENT_RESTORED: Dependent package moved back to pending | Package: ${dependent} | Previous Status: skipped | New Status: pending | Reason: Retry parent package`);\n }\n }\n\n this.logger.info(`RECOVERY_PACKAGE_PENDING: Package moved to pending for retry | Package: ${failedPkg.name} | Previous Status: failed | New Status: pending | Action: Will retry`);\n }\n\n // Keep only non-retriable failures in failed state\n this.checkpoint.state.failed = nonRetriable;\n\n // Update ready queue\n this.updateReadyState();\n\n await this.saveCheckpoint();\n\n this.logger.info(`RECOVERY_RETRY_READY: Packages reset and ready for retry | Package Count: ${retriable.length} | Status: pending | Next: Will execute`);\n }\n\n /**\n * Skip failed packages and continue with remaining\n */\n async skipFailed(): Promise<void> {\n const failed = this.checkpoint.state.failed.map(f => f.name);\n\n if (failed.length === 0) {\n this.logger.info('RECOVERY_NO_FAILED_TO_SKIP: No failed packages found | Action: Nothing to skip | Status: Clean state');\n return;\n }\n\n this.logger.info(`RECOVERY_SKIP_FAILED: Skipping failed packages and dependents | Failed Count: ${failed.length} | Action: Mark as skipped | Purpose: Continue with remaining packages`);\n\n await this.skipPackages(failed);\n\n // Clear failed state\n this.checkpoint.state.failed = [];\n\n this.logger.info('RECOVERY_SKIP_COMPLETE: Failed packages skipped successfully | Status: Execution can continue | Next: Process remaining packages');\n }\n\n /**\n * Reset specific package to initial state\n */\n async resetPackage(packageName: string): Promise<void> {\n this.logger.info(`RECOVERY_PACKAGE_RESETTING: Resetting package to initial state | Package: ${packageName} | Action: Clear all state | Purpose: Fresh start`);\n\n if (!this.graph.packages.has(packageName)) {\n throw new Error(`Package not found: ${packageName}`);\n }\n\n // Remove from all states\n this.removeFromAllStates(packageName);\n\n // Add back to pending\n this.checkpoint.state.pending.push(packageName);\n\n // Clear retry attempts\n delete this.checkpoint.retryAttempts[packageName];\n delete this.checkpoint.packageStartTimes[packageName];\n delete this.checkpoint.packageEndTimes[packageName];\n delete this.checkpoint.packageDurations[packageName];\n\n await this.saveCheckpoint();\n\n this.logger.info(`RECOVERY_PACKAGE_RESET: Package reset to initial state | Package: ${packageName} | Status: pending | Checkpoint: Updated`);\n }\n\n /**\n * Validate checkpoint state integrity\n */\n validateState(): ValidationResult {\n const issues: string[] = [];\n const warnings: string[] = [];\n\n // Check for duplicates across states\n const allPackages: string[] = [\n ...this.checkpoint.state.pending,\n ...this.checkpoint.state.ready,\n ...this.checkpoint.state.running.map(r => r.name),\n ...this.checkpoint.state.completed,\n ...this.checkpoint.state.failed.map(f => f.name),\n ...this.checkpoint.state.skipped,\n ...this.checkpoint.state.skippedNoChanges\n ];\n\n const duplicates = this.findDuplicates(allPackages);\n if (duplicates.length > 0) {\n issues.push(`Packages in multiple states: ${duplicates.join(', ')}`);\n }\n\n // Check for missing packages\n const missing = this.checkpoint.buildOrder.filter(\n pkg => !allPackages.includes(pkg)\n );\n if (missing.length > 0) {\n issues.push(`Missing packages: ${missing.join(', ')}`);\n }\n\n // Check dependency consistency\n for (const pkg of this.checkpoint.state.completed) {\n const deps = this.graph.edges.get(pkg) || new Set();\n for (const dep of deps) {\n if (!this.checkpoint.state.completed.includes(dep)) {\n warnings.push(`${pkg} completed but dependency ${dep} not completed`);\n }\n }\n }\n\n // Check for stale running packages\n const now = Date.now();\n for (const running of this.checkpoint.state.running) {\n const elapsed = now - new Date(running.startTime).getTime();\n if (elapsed > 3600000) { // 1 hour\n warnings.push(`${running.name} has been running for ${this.formatDuration(elapsed)}`);\n }\n }\n\n return {\n valid: issues.length === 0,\n issues,\n warnings\n };\n }\n\n /**\n * Generate recovery hints based on current state\n */\n generateRecoveryHints(): RecoveryHint[] {\n const hints: RecoveryHint[] = [];\n\n // Check for retriable failures\n const retriableFailed = this.checkpoint.state.failed.filter(f => f.isRetriable);\n if (retriableFailed.length > 0) {\n hints.push({\n type: 'info',\n message: `${retriableFailed.length} package(s) failed with retriable errors`,\n actionable: true,\n suggestedCommand: 'kodrdriv tree [command] --continue --retry-failed'\n });\n }\n\n // Check for non-retriable failures\n const permanentFailed = this.checkpoint.state.failed.filter(f => !f.isRetriable);\n if (permanentFailed.length > 0) {\n hints.push({\n type: 'warning',\n message: `${permanentFailed.length} package(s) failed permanently`,\n actionable: true,\n suggestedCommand: 'kodrdriv tree [command] --continue --skip-failed'\n });\n\n for (const pkg of permanentFailed.slice(0, 3)) { // Limit to first 3\n hints.push({\n type: 'error',\n message: `${pkg.name}: ${pkg.error}`,\n actionable: true,\n suggestedCommand: `# Fix the issue, then:\\nkodrdriv tree [command] --continue --mark-completed \"${path.basename(this.graph.packages.get(pkg.name)?.path || pkg.name)}\"`\n });\n }\n }\n\n // Check for long-running packages\n const now = Date.now();\n for (const running of this.checkpoint.state.running) {\n const elapsed = now - new Date(running.startTime).getTime();\n if (elapsed > 1800000) { // 30 minutes\n hints.push({\n type: 'warning',\n message: `${running.name} has been running for ${this.formatDuration(elapsed)} - may be stuck`,\n actionable: false\n });\n }\n }\n\n // Check for state inconsistencies\n const validation = this.validateState();\n if (!validation.valid) {\n hints.push({\n type: 'error',\n message: 'State inconsistencies detected - checkpoint may be corrupted',\n actionable: true,\n suggestedCommand: 'kodrdriv tree --validate-state'\n });\n }\n\n return hints;\n }\n\n /**\n * Show detailed status\n */\n async showStatus(): Promise<string> {\n const lines: string[] = [];\n\n lines.push('═══════════════════════════════════════');\n lines.push(' Parallel Execution Status');\n lines.push('═══════════════════════════════════════');\n lines.push('');\n lines.push(`Execution ID: ${this.checkpoint.executionId}`);\n lines.push(`Started: ${new Date(this.checkpoint.totalStartTime).toLocaleString()}`);\n lines.push(`Last Updated: ${new Date(this.checkpoint.lastUpdated).toLocaleString()}`);\n lines.push('');\n\n // Progress summary\n const total = this.checkpoint.buildOrder.length;\n const completed = this.checkpoint.state.completed.length;\n const skippedNoChanges = this.checkpoint.state.skippedNoChanges.length;\n const failed = this.checkpoint.state.failed.length;\n const skipped = this.checkpoint.state.skipped.length;\n const running = this.checkpoint.state.running.length;\n const pending = this.checkpoint.state.pending.length + this.checkpoint.state.ready.length;\n\n lines.push('📊 Progress:');\n lines.push(` Completed: ${completed}/${total} (${Math.round(completed/total*100)}%)`);\n lines.push(` Skipped (no changes): ${skippedNoChanges}`);\n lines.push(` Running: ${running}`);\n lines.push(` Pending: ${pending}`);\n lines.push(` Failed: ${failed}`);\n lines.push(` Skipped (dependency failed): ${skipped}`);\n lines.push('');\n\n // Progress bar\n const progressBar = this.createProgressBar(completed, total);\n lines.push(`Progress: [${progressBar}] ${Math.round(completed/total*100)}%`);\n lines.push('');\n\n // Running packages\n if (running > 0) {\n lines.push('🔄 Currently Running:');\n for (const pkg of this.checkpoint.state.running) {\n const elapsed = Date.now() - new Date(pkg.startTime).getTime();\n lines.push(` • ${pkg.name} (${this.formatDuration(elapsed)})`);\n }\n lines.push('');\n }\n\n // Failed packages\n if (failed > 0) {\n lines.push('❌ Failed Packages:');\n for (const pkg of this.checkpoint.state.failed) {\n lines.push(` ✗ ${pkg.name}`);\n lines.push(` Error: ${pkg.error}`);\n lines.push(` Retriable: ${pkg.isRetriable ? 'Yes' : 'No'}`);\n lines.push(` Attempts: ${pkg.attemptNumber}`);\n if (pkg.dependents.length > 0) {\n lines.push(` Blocked: ${pkg.dependents.length} dependent(s)`);\n }\n }\n lines.push('');\n }\n\n // Skipped packages with dependency details\n if (skipped > 0) {\n lines.push('🔒 Blocked Packages (dependency issues):');\n for (const pkgName of this.checkpoint.state.skipped) {\n const deps = this.graph.edges.get(pkgName) || new Set();\n const depStatus = Array.from(deps).map(dep => {\n if (this.checkpoint.state.completed.includes(dep) ||\n this.checkpoint.state.skippedNoChanges.includes(dep)) {\n return `${dep} ✓`;\n } else if (this.checkpoint.state.failed.some(f => f.name === dep)) {\n return `${dep} ❌`;\n } else if (this.checkpoint.state.running.some(r => r.name === dep)) {\n return `${dep} ⏳`;\n } else if (this.checkpoint.state.skipped.includes(dep)) {\n return `${dep} 🔒`;\n } else if (this.checkpoint.state.pending.includes(dep) ||\n this.checkpoint.state.ready.includes(dep)) {\n return `${dep} ⏳`;\n } else {\n return `${dep} ❓`;\n }\n });\n\n lines.push(` • ${pkgName}`);\n if (depStatus.length > 0) {\n lines.push(` Dependencies: ${depStatus.join(', ')}`);\n }\n }\n lines.push('');\n lines.push('Legend: ✓ = complete, ❌ = failed, ⏳ = pending/running, 🔒 = blocked');\n lines.push('');\n }\n\n // Ready to execute\n if (this.checkpoint.state.ready.length > 0) {\n lines.push('⏳ Ready to Execute:');\n for (const pkgName of this.checkpoint.state.ready) {\n const deps = this.graph.edges.get(pkgName) || new Set();\n if (deps.size === 0) {\n lines.push(` • ${pkgName} (no dependencies)`);\n } else {\n const depList = Array.from(deps).join(', ');\n lines.push(` • ${pkgName} (depends on: ${depList})`);\n }\n }\n lines.push('');\n }\n\n // Recovery hints\n const hints = this.generateRecoveryHints();\n if (hints.length > 0) {\n lines.push('💡 Recovery Suggestions:');\n for (const hint of hints) {\n const icon = hint.type === 'error' ? '❌' : hint.type === 'warning' ? '⚠️' : 'ℹ️';\n lines.push(` ${icon} ${hint.message}`);\n if (hint.suggestedCommand) {\n lines.push(` ${hint.suggestedCommand}`);\n }\n }\n lines.push('');\n }\n\n // State validation\n const validation = this.validateState();\n if (!validation.valid) {\n lines.push('⚠️ State Issues Detected:');\n for (const issue of validation.issues) {\n lines.push(` • ${issue}`);\n }\n lines.push('');\n }\n\n if (validation.warnings.length > 0) {\n lines.push('⚠️ Warnings:');\n for (const warning of validation.warnings) {\n lines.push(` • ${warning}`);\n }\n lines.push('');\n }\n\n return lines.join('\\n');\n }\n\n /**\n * Apply multiple recovery options at once\n */\n async applyRecoveryOptions(options: RecoveryOptions): Promise<void> {\n this.logger.info('RECOVERY_OPTIONS_APPLYING: Applying recovery options to checkpoint | Purpose: Modify execution state | Options: Complete, fail, skip, retry, reset');\n\n if (options.markCompleted && options.markCompleted.length > 0) {\n await this.markCompleted(options.markCompleted);\n }\n\n if (options.markFailed && options.markFailed.length > 0) {\n await this.markFailed(options.markFailed);\n }\n\n if (options.skipPackages && options.skipPackages.length > 0) {\n await this.skipPackages(options.skipPackages);\n }\n\n if (options.retryFailed) {\n await this.retryFailed({ maxRetries: options.maxRetries });\n }\n\n if (options.skipFailed) {\n await this.skipFailed();\n }\n\n if (options.resetPackage) {\n await this.resetPackage(options.resetPackage);\n }\n\n this.logger.info('RECOVERY_OPTIONS_APPLIED: Recovery options applied successfully | Status: Checkpoint updated | Next: Resume execution or exit');\n }\n\n /**\n * Get checkpoint for external access\n */\n getCheckpoint(): ParallelExecutionCheckpoint {\n return this.checkpoint;\n }\n\n // Private helper methods\n\n private removeFromAllStates(packageName: string): void {\n this.checkpoint.state.pending = this.checkpoint.state.pending.filter(p => p !== packageName);\n this.checkpoint.state.ready = this.checkpoint.state.ready.filter(p => p !== packageName);\n this.checkpoint.state.running = this.checkpoint.state.running.filter(r => r.name !== packageName);\n this.checkpoint.state.completed = this.checkpoint.state.completed.filter(p => p !== packageName);\n this.checkpoint.state.failed = this.checkpoint.state.failed.filter(f => f.name !== packageName);\n this.checkpoint.state.skipped = this.checkpoint.state.skipped.filter(p => p !== packageName);\n this.checkpoint.state.skippedNoChanges = this.checkpoint.state.skippedNoChanges.filter(p => p !== packageName);\n }\n\n private updateReadyState(): void {\n // CRITICAL FIX: First, re-evaluate skipped packages\n // Packages that were skipped due to failed dependencies might now be eligible\n // to run if those dependencies have been completed (e.g., via --mark-completed)\n const unblocked: string[] = [];\n for (const pkg of this.checkpoint.state.skipped) {\n const deps = this.graph.edges.get(pkg) || new Set();\n const allDepsCompleted = Array.from(deps).every(dep =>\n this.checkpoint.state.completed.includes(dep) ||\n this.checkpoint.state.skippedNoChanges.includes(dep)\n );\n\n // Check if any dependencies are still failed\n const anyDepsFailed = Array.from(deps).some(dep =>\n this.checkpoint.state.failed.some(f => f.name === dep)\n );\n\n if (allDepsCompleted && !anyDepsFailed) {\n unblocked.push(pkg);\n }\n }\n\n // Move unblocked packages back to pending\n for (const pkg of unblocked) {\n this.checkpoint.state.skipped = this.checkpoint.state.skipped.filter(p => p !== pkg);\n this.checkpoint.state.pending.push(pkg);\n this.logger.info(`RECOVERY_PACKAGE_UNBLOCKED: Package unblocked due to satisfied dependencies | Package: ${pkg} | Previous Status: skipped | New Status: pending | Reason: Dependencies satisfied`);\n }\n\n // Move packages from pending to ready if dependencies met\n const nowReady: string[] = [];\n\n for (const pkg of this.checkpoint.state.pending) {\n const deps = this.graph.edges.get(pkg) || new Set();\n const allDepsCompleted = Array.from(deps).every(dep =>\n this.checkpoint.state.completed.includes(dep) ||\n this.checkpoint.state.skippedNoChanges.includes(dep)\n );\n\n if (allDepsCompleted) {\n nowReady.push(pkg);\n }\n }\n\n for (const pkg of nowReady) {\n this.checkpoint.state.pending = this.checkpoint.state.pending.filter(p => p !== pkg);\n this.checkpoint.state.ready.push(pkg);\n }\n }\n\n private findDuplicates(arr: string[]): string[] {\n const seen = new Set<string>();\n const duplicates = new Set<string>();\n\n for (const item of arr) {\n if (seen.has(item)) {\n duplicates.add(item);\n }\n seen.add(item);\n }\n\n return Array.from(duplicates);\n }\n\n private async saveCheckpoint(): Promise<void> {\n this.checkpoint.lastUpdated = new Date().toISOString();\n await this.checkpointManager.save(this.checkpoint);\n }\n\n private formatDuration(ms: number): string {\n const seconds = Math.floor(ms / 1000);\n const minutes = Math.floor(seconds / 60);\n const hours = Math.floor(minutes / 60);\n\n if (hours > 0) {\n return `${hours}h ${minutes % 60}m`;\n }\n if (minutes > 0) {\n return `${minutes}m ${seconds % 60}s`;\n }\n return `${seconds}s`;\n }\n\n private createProgressBar(current: number, total: number, width: number = 30): string {\n const percent = current / total;\n const filled = Math.round(width * percent);\n const empty = width - filled;\n\n return '█'.repeat(filled) + '░'.repeat(empty);\n }\n}\n\n/**\n * Load checkpoint and create recovery manager\n */\nexport async function loadRecoveryManager(\n graph: DependencyGraph,\n outputDirectory?: string\n): Promise<RecoveryManager | null> {\n const checkpointManager = new CheckpointManager(outputDirectory);\n const checkpoint = await checkpointManager.load();\n\n if (!checkpoint) {\n return null;\n }\n\n return new RecoveryManager(checkpoint, graph, checkpointManager);\n}\n"],"names":["RecoveryManager","resolvePackageName","identifier","graph","packages","has","pkgName","pkgInfo","dirName","path","basename","markCompleted","logger","info","length","pkgIdentifier","pkg","available","Array","from","entries","map","name","join","Error","checkpoint","state","completed","includes","warn","removeFromAllStates","push","beforeSkipped","skipped","beforeReady","ready","updateReadyState","afterSkipped","afterReady","unblockedCount","newReadyCount","saveCheckpoint","markFailed","reason","failureInfo","error","isRetriable","attemptNumber","failedAt","Date","toISOString","dependencies","edges","get","dependents","findAllDependents","failed","dep","skipPackages","toSkip","Set","add","size","retryFailed","options","retriable","nonRetriable","failedPkg","maxRetries","p","retryAttempts","pending","dependent","filter","skipFailed","f","resetPackage","packageName","packageStartTimes","packageEndTimes","packageDurations","validateState","issues","warnings","allPackages","running","r","skippedNoChanges","duplicates","findDuplicates","missing","buildOrder","deps","now","elapsed","startTime","getTime","formatDuration","valid","generateRecoveryHints","hints","retriableFailed","type","message","actionable","suggestedCommand","permanentFailed","slice","validation","showStatus","lines","executionId","totalStartTime","toLocaleString","lastUpdated","total","Math","round","progressBar","createProgressBar","depStatus","some","depList","hint","icon","issue","warning","applyRecoveryOptions","getCheckpoint","unblocked","allDepsCompleted","every","anyDepsFailed","nowReady","arr","seen","item","checkpointManager","save","ms","seconds","floor","minutes","hours","current","width","percent","filled","empty","repeat","getLogger","loadRecoveryManager","outputDirectory","CheckpointManager","load"],"mappings":"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"}
@@ -1,150 +0,0 @@
1
- import { getLogger } from '../logging.js';
2
- import * as os from 'os';
3
-
4
- function _define_property(obj, key, value) {
5
- if (key in obj) {
6
- Object.defineProperty(obj, key, {
7
- value: value,
8
- enumerable: true,
9
- configurable: true,
10
- writable: true
11
- });
12
- } else {
13
- obj[key] = value;
14
- }
15
- return obj;
16
- }
17
- /**
18
- * ResourceMonitor manages concurrency limits and tracks resource utilization
19
- */ class ResourceMonitor {
20
- /**
21
- * Check if we can allocate N slots
22
- */ canAllocate(count = 1) {
23
- // Check concurrency limit
24
- if (this.currentConcurrency + count > this.maxConcurrency) {
25
- return false;
26
- }
27
- // Check system memory (soft check)
28
- this.checkSystemMemory();
29
- return true;
30
- }
31
- /**
32
- * Log a warning if system memory is low
33
- */ checkSystemMemory() {
34
- try {
35
- const freeMem = os.freemem();
36
- const totalMem = os.totalmem();
37
- const freePercent = freeMem / totalMem * 100;
38
- if (freePercent < this.MEMORY_THRESHOLD_PERCENT) {
39
- const freeGB = (freeMem / (1024 * 1024 * 1024)).toFixed(2);
40
- this.logger.warn(`SYSTEM_MEMORY_LOW: System memory is running low | Free: ${freeGB}GB (${freePercent.toFixed(1)}%) | Action: Proceeding with caution`);
41
- }
42
- } catch (error) {
43
- // Ignore errors in memory check to avoid blocking execution
44
- this.logger.debug(`Failed to check system memory: ${error}`);
45
- }
46
- }
47
- /**
48
- * Allocate resource slots
49
- * @returns true if allocation succeeded, false if not enough slots available
50
- */ allocate(count = 1) {
51
- if (!this.canAllocate(count)) {
52
- return false;
53
- }
54
- this.currentConcurrency += count;
55
- this.metrics.totalAllocations += count;
56
- this.metrics.peakConcurrency = Math.max(this.metrics.peakConcurrency, this.currentConcurrency);
57
- this.allocationHistory.push(this.currentConcurrency);
58
- this.updateAverageConcurrency();
59
- this.logger.debug(`Allocated ${count} slot(s) (${this.currentConcurrency}/${this.maxConcurrency})`);
60
- return true;
61
- }
62
- /**
63
- * Release resource slots
64
- */ release(count = 1) {
65
- this.currentConcurrency = Math.max(0, this.currentConcurrency - count);
66
- this.metrics.totalReleases += count;
67
- this.allocationHistory.push(this.currentConcurrency);
68
- this.updateAverageConcurrency();
69
- this.logger.debug(`Released ${count} slot(s) (${this.currentConcurrency}/${this.maxConcurrency})`);
70
- }
71
- /**
72
- * Get number of available slots
73
- */ getAvailableSlots() {
74
- return this.maxConcurrency - this.currentConcurrency;
75
- }
76
- /**
77
- * Get current concurrency level
78
- */ getCurrentConcurrency() {
79
- return this.currentConcurrency;
80
- }
81
- /**
82
- * Get maximum concurrency limit
83
- */ getMaxConcurrency() {
84
- return this.maxConcurrency;
85
- }
86
- /**
87
- * Get resource utilization metrics
88
- */ getMetrics() {
89
- return {
90
- ...this.metrics
91
- };
92
- }
93
- /**
94
- * Get utilization percentage (0-100)
95
- */ getUtilization() {
96
- if (this.maxConcurrency === 0) return 0;
97
- return this.currentConcurrency / this.maxConcurrency * 100;
98
- }
99
- /**
100
- * Check if resources are fully utilized
101
- */ isFullyUtilized() {
102
- return this.currentConcurrency >= this.maxConcurrency;
103
- }
104
- /**
105
- * Check if resources are idle
106
- */ isIdle() {
107
- return this.currentConcurrency === 0;
108
- }
109
- /**
110
- * Update average concurrency calculation
111
- */ updateAverageConcurrency() {
112
- if (this.allocationHistory.length === 0) {
113
- this.metrics.averageConcurrency = 0;
114
- return;
115
- }
116
- const sum = this.allocationHistory.reduce((a, b)=>a + b, 0);
117
- this.metrics.averageConcurrency = sum / this.allocationHistory.length;
118
- }
119
- /**
120
- * Reset metrics (useful for testing)
121
- */ reset() {
122
- this.currentConcurrency = 0;
123
- this.allocationHistory = [];
124
- this.metrics = {
125
- peakConcurrency: 0,
126
- averageConcurrency: 0,
127
- totalAllocations: 0,
128
- totalReleases: 0
129
- };
130
- }
131
- constructor(maxConcurrency){
132
- _define_property(this, "maxConcurrency", void 0);
133
- _define_property(this, "currentConcurrency", 0);
134
- _define_property(this, "metrics", void 0);
135
- _define_property(this, "allocationHistory", []);
136
- _define_property(this, "logger", getLogger());
137
- // Memory threshold: warn if free memory is below 5%
138
- _define_property(this, "MEMORY_THRESHOLD_PERCENT", 5);
139
- this.maxConcurrency = maxConcurrency;
140
- this.metrics = {
141
- peakConcurrency: 0,
142
- averageConcurrency: 0,
143
- totalAllocations: 0,
144
- totalReleases: 0
145
- };
146
- }
147
- }
148
-
149
- export { ResourceMonitor };
150
- //# sourceMappingURL=ResourceMonitor.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"ResourceMonitor.js","sources":["../../src/execution/ResourceMonitor.ts"],"sourcesContent":["import { getLogger } from '../logging';\nimport * as os from 'os';\n\nexport interface ResourceMetrics {\n peakConcurrency: number;\n averageConcurrency: number;\n totalAllocations: number;\n totalReleases: number;\n freeMemoryBytes?: number;\n}\n\n/**\n * ResourceMonitor manages concurrency limits and tracks resource utilization\n */\nexport class ResourceMonitor {\n private maxConcurrency: number;\n private currentConcurrency: number = 0;\n private metrics: ResourceMetrics;\n private allocationHistory: number[] = [];\n private logger = getLogger();\n\n // Memory threshold: warn if free memory is below 5%\n private readonly MEMORY_THRESHOLD_PERCENT = 5;\n\n constructor(maxConcurrency: number) {\n this.maxConcurrency = maxConcurrency;\n this.metrics = {\n peakConcurrency: 0,\n averageConcurrency: 0,\n totalAllocations: 0,\n totalReleases: 0\n };\n }\n\n /**\n * Check if we can allocate N slots\n */\n canAllocate(count: number = 1): boolean {\n // Check concurrency limit\n if (this.currentConcurrency + count > this.maxConcurrency) {\n return false;\n }\n\n // Check system memory (soft check)\n this.checkSystemMemory();\n\n return true;\n }\n\n /**\n * Log a warning if system memory is low\n */\n private checkSystemMemory(): void {\n try {\n const freeMem = os.freemem();\n const totalMem = os.totalmem();\n const freePercent = (freeMem / totalMem) * 100;\n\n if (freePercent < this.MEMORY_THRESHOLD_PERCENT) {\n const freeGB = (freeMem / (1024 * 1024 * 1024)).toFixed(2);\n this.logger.warn(`SYSTEM_MEMORY_LOW: System memory is running low | Free: ${freeGB}GB (${freePercent.toFixed(1)}%) | Action: Proceeding with caution`);\n }\n } catch (error) {\n // Ignore errors in memory check to avoid blocking execution\n this.logger.debug(`Failed to check system memory: ${error}`);\n }\n }\n\n /**\n * Allocate resource slots\n * @returns true if allocation succeeded, false if not enough slots available\n */\n allocate(count: number = 1): boolean {\n if (!this.canAllocate(count)) {\n return false;\n }\n\n this.currentConcurrency += count;\n this.metrics.totalAllocations += count;\n this.metrics.peakConcurrency = Math.max(\n this.metrics.peakConcurrency,\n this.currentConcurrency\n );\n\n this.allocationHistory.push(this.currentConcurrency);\n this.updateAverageConcurrency();\n\n this.logger.debug(`Allocated ${count} slot(s) (${this.currentConcurrency}/${this.maxConcurrency})`);\n\n return true;\n }\n\n /**\n * Release resource slots\n */\n release(count: number = 1): void {\n this.currentConcurrency = Math.max(0, this.currentConcurrency - count);\n this.metrics.totalReleases += count;\n\n this.allocationHistory.push(this.currentConcurrency);\n this.updateAverageConcurrency();\n\n this.logger.debug(`Released ${count} slot(s) (${this.currentConcurrency}/${this.maxConcurrency})`);\n }\n\n /**\n * Get number of available slots\n */\n getAvailableSlots(): number {\n return this.maxConcurrency - this.currentConcurrency;\n }\n\n /**\n * Get current concurrency level\n */\n getCurrentConcurrency(): number {\n return this.currentConcurrency;\n }\n\n /**\n * Get maximum concurrency limit\n */\n getMaxConcurrency(): number {\n return this.maxConcurrency;\n }\n\n /**\n * Get resource utilization metrics\n */\n getMetrics(): ResourceMetrics {\n return { ...this.metrics };\n }\n\n /**\n * Get utilization percentage (0-100)\n */\n getUtilization(): number {\n if (this.maxConcurrency === 0) return 0;\n return (this.currentConcurrency / this.maxConcurrency) * 100;\n }\n\n /**\n * Check if resources are fully utilized\n */\n isFullyUtilized(): boolean {\n return this.currentConcurrency >= this.maxConcurrency;\n }\n\n /**\n * Check if resources are idle\n */\n isIdle(): boolean {\n return this.currentConcurrency === 0;\n }\n\n /**\n * Update average concurrency calculation\n */\n private updateAverageConcurrency(): void {\n if (this.allocationHistory.length === 0) {\n this.metrics.averageConcurrency = 0;\n return;\n }\n\n const sum = this.allocationHistory.reduce((a, b) => a + b, 0);\n this.metrics.averageConcurrency = sum / this.allocationHistory.length;\n }\n\n /**\n * Reset metrics (useful for testing)\n */\n reset(): void {\n this.currentConcurrency = 0;\n this.allocationHistory = [];\n this.metrics = {\n peakConcurrency: 0,\n averageConcurrency: 0,\n totalAllocations: 0,\n totalReleases: 0\n };\n }\n}\n"],"names":["ResourceMonitor","canAllocate","count","currentConcurrency","maxConcurrency","checkSystemMemory","freeMem","os","freemem","totalMem","totalmem","freePercent","MEMORY_THRESHOLD_PERCENT","freeGB","toFixed","logger","warn","error","debug","allocate","metrics","totalAllocations","peakConcurrency","Math","max","allocationHistory","push","updateAverageConcurrency","release","totalReleases","getAvailableSlots","getCurrentConcurrency","getMaxConcurrency","getMetrics","getUtilization","isFullyUtilized","isIdle","length","averageConcurrency","sum","reduce","a","b","reset","getLogger"],"mappings":"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"}
@@ -1,98 +0,0 @@
1
- function _define_property(obj, key, value) {
2
- if (key in obj) {
3
- Object.defineProperty(obj, key, {
4
- value: value,
5
- enumerable: true,
6
- configurable: true,
7
- writable: true
8
- });
9
- } else {
10
- obj[key] = value;
11
- }
12
- return obj;
13
- }
14
- /**
15
- * Scheduler determines which packages to execute next based on priority
16
- */ class Scheduler {
17
- /**
18
- * Get next packages to schedule based on available slots
19
- * Returns packages sorted by priority (highest priority first)
20
- */ getNext(availableSlots, state) {
21
- if (availableSlots <= 0 || state.ready.length === 0) {
22
- return [];
23
- }
24
- // Sort ready packages by priority
25
- const sorted = [
26
- ...state.ready
27
- ].sort((a, b)=>this.calculatePriority(b, state) - this.calculatePriority(a, state));
28
- // Return top N packages that fit in available slots
29
- return sorted.slice(0, availableSlots);
30
- }
31
- /**
32
- * Calculate priority score for a package
33
- * Higher score = higher priority = execute sooner
34
- *
35
- * Priority factors:
36
- * 1. Number of dependents (more = higher priority, unblocks more packages)
37
- * 2. Depth in dependency tree (shallower = higher priority, enables earlier unlocking)
38
- * 3. Retry attempts (fewer = higher priority, give fresh packages a chance)
39
- */ calculatePriority(packageName, state) {
40
- let score = 0;
41
- // Factor 1: More dependents = higher priority (weight: 100)
42
- // Packages that unblock many others should run first
43
- const dependentCount = this.checker.getDependentCount(packageName);
44
- score += dependentCount * 100;
45
- // Factor 2: Depth penalty (weight: -10)
46
- // Prefer packages closer to the root of the dependency tree
47
- const depth = this.checker.getDepth(packageName);
48
- score -= depth * 10;
49
- // Factor 3: Retry penalty (weight: -50)
50
- // Packages that have failed before get lower priority
51
- const retries = state.failed.filter((f)=>f.name === packageName).length;
52
- score -= retries * 50;
53
- // Factor 4: Bonus for packages with no dependents (leaf nodes)
54
- // These are usually final deliverables and good to complete early for feedback
55
- if (!this.checker.hasDependents(packageName)) {
56
- score += 5;
57
- }
58
- return score;
59
- }
60
- /**
61
- * Get estimated completion order (for progress reporting)
62
- */ getEstimatedOrder(state) {
63
- const allPending = [
64
- ...state.pending,
65
- ...state.ready
66
- ];
67
- return allPending.sort((a, b)=>this.calculatePriority(b, state) - this.calculatePriority(a, state));
68
- }
69
- /**
70
- * Predict which packages will become ready next
71
- * Useful for pre-loading or progress estimation
72
- */ predictNextReady(state) {
73
- const predictions = [];
74
- // Look at currently running packages
75
- const runningNames = state.running.map((r)=>r.name);
76
- // For each running package, see which pending packages only depend on it
77
- for (const runningPkg of runningNames){
78
- for (const pendingPkg of state.pending){
79
- const deps = this.checker.getDependencies(pendingPkg);
80
- // Check if this pending package will be ready when running completes
81
- const blockedBy = Array.from(deps).filter((dep)=>!state.completed.includes(dep) && dep !== runningPkg);
82
- if (blockedBy.length === 0) {
83
- predictions.push(pendingPkg);
84
- }
85
- }
86
- }
87
- return predictions;
88
- }
89
- constructor(graph, checker){
90
- _define_property(this, "graph", void 0);
91
- _define_property(this, "checker", void 0);
92
- this.graph = graph;
93
- this.checker = checker;
94
- }
95
- }
96
-
97
- export { Scheduler };
98
- //# sourceMappingURL=Scheduler.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"Scheduler.js","sources":["../../src/execution/Scheduler.ts"],"sourcesContent":["import { DependencyGraph } from '../util/dependencyGraph';\nimport { ExecutionState } from '../types/parallelExecution';\nimport { DependencyChecker } from './DependencyChecker';\n\n/**\n * Scheduler determines which packages to execute next based on priority\n */\nexport class Scheduler {\n private graph: DependencyGraph;\n private checker: DependencyChecker;\n\n constructor(graph: DependencyGraph, checker: DependencyChecker) {\n this.graph = graph;\n this.checker = checker;\n }\n\n /**\n * Get next packages to schedule based on available slots\n * Returns packages sorted by priority (highest priority first)\n */\n getNext(availableSlots: number, state: ExecutionState): string[] {\n if (availableSlots <= 0 || state.ready.length === 0) {\n return [];\n }\n\n // Sort ready packages by priority\n const sorted = [...state.ready].sort((a, b) =>\n this.calculatePriority(b, state) - this.calculatePriority(a, state)\n );\n\n // Return top N packages that fit in available slots\n return sorted.slice(0, availableSlots);\n }\n\n /**\n * Calculate priority score for a package\n * Higher score = higher priority = execute sooner\n *\n * Priority factors:\n * 1. Number of dependents (more = higher priority, unblocks more packages)\n * 2. Depth in dependency tree (shallower = higher priority, enables earlier unlocking)\n * 3. Retry attempts (fewer = higher priority, give fresh packages a chance)\n */\n calculatePriority(packageName: string, state: ExecutionState): number {\n let score = 0;\n\n // Factor 1: More dependents = higher priority (weight: 100)\n // Packages that unblock many others should run first\n const dependentCount = this.checker.getDependentCount(packageName);\n score += dependentCount * 100;\n\n // Factor 2: Depth penalty (weight: -10)\n // Prefer packages closer to the root of the dependency tree\n const depth = this.checker.getDepth(packageName);\n score -= depth * 10;\n\n // Factor 3: Retry penalty (weight: -50)\n // Packages that have failed before get lower priority\n const retries = state.failed.filter(f => f.name === packageName).length;\n score -= retries * 50;\n\n // Factor 4: Bonus for packages with no dependents (leaf nodes)\n // These are usually final deliverables and good to complete early for feedback\n if (!this.checker.hasDependents(packageName)) {\n score += 5;\n }\n\n return score;\n }\n\n /**\n * Get estimated completion order (for progress reporting)\n */\n getEstimatedOrder(state: ExecutionState): string[] {\n const allPending = [...state.pending, ...state.ready];\n\n return allPending.sort((a, b) =>\n this.calculatePriority(b, state) - this.calculatePriority(a, state)\n );\n }\n\n /**\n * Predict which packages will become ready next\n * Useful for pre-loading or progress estimation\n */\n predictNextReady(state: ExecutionState): string[] {\n const predictions: string[] = [];\n\n // Look at currently running packages\n const runningNames = state.running.map(r => r.name);\n\n // For each running package, see which pending packages only depend on it\n for (const runningPkg of runningNames) {\n for (const pendingPkg of state.pending) {\n const deps = this.checker.getDependencies(pendingPkg);\n\n // Check if this pending package will be ready when running completes\n const blockedBy = Array.from(deps).filter(dep =>\n !state.completed.includes(dep) && dep !== runningPkg\n );\n\n if (blockedBy.length === 0) {\n predictions.push(pendingPkg);\n }\n }\n }\n\n return predictions;\n }\n}\n"],"names":["Scheduler","getNext","availableSlots","state","ready","length","sorted","sort","a","b","calculatePriority","slice","packageName","score","dependentCount","checker","getDependentCount","depth","getDepth","retries","failed","filter","f","name","hasDependents","getEstimatedOrder","allPending","pending","predictNextReady","predictions","runningNames","running","map","r","runningPkg","pendingPkg","deps","getDependencies","blockedBy","Array","from","dep","completed","includes","push","graph"],"mappings":"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"}