@jterrats/smart-deployment 1.0.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +193 -0
- package/lib/ai/agentforce-error-handler.d.ts +81 -0
- package/lib/ai/agentforce-error-handler.js +196 -0
- package/lib/ai/agentforce-error-handler.js.map +1 -0
- package/lib/ai/agentforce-priority-service.d.ts +82 -0
- package/lib/ai/agentforce-priority-service.js +257 -0
- package/lib/ai/agentforce-priority-service.js.map +1 -0
- package/lib/ai/agentforce-service.d.ts +99 -0
- package/lib/ai/agentforce-service.js +300 -0
- package/lib/ai/agentforce-service.js.map +1 -0
- package/lib/ai/circuit-breaker.d.ts +115 -0
- package/lib/ai/circuit-breaker.js +277 -0
- package/lib/ai/circuit-breaker.js.map +1 -0
- package/lib/ai/dependency-inference-service.d.ts +76 -0
- package/lib/ai/dependency-inference-service.js +220 -0
- package/lib/ai/dependency-inference-service.js.map +1 -0
- package/lib/ai/llm-provider-factory.d.ts +15 -0
- package/lib/ai/llm-provider-factory.js +36 -0
- package/lib/ai/llm-provider-factory.js.map +1 -0
- package/lib/ai/llm-provider.d.ts +27 -0
- package/lib/ai/llm-provider.js +2 -0
- package/lib/ai/llm-provider.js.map +1 -0
- package/lib/ai/openai-service.d.ts +20 -0
- package/lib/ai/openai-service.js +89 -0
- package/lib/ai/openai-service.js.map +1 -0
- package/lib/ai/prompt-builder.d.ts +79 -0
- package/lib/ai/prompt-builder.js +180 -0
- package/lib/ai/prompt-builder.js.map +1 -0
- package/lib/ai/response-parser.d.ts +67 -0
- package/lib/ai/response-parser.js +234 -0
- package/lib/ai/response-parser.js.map +1 -0
- package/lib/ai/wave-validation-service.d.ts +111 -0
- package/lib/ai/wave-validation-service.js +381 -0
- package/lib/ai/wave-validation-service.js.map +1 -0
- package/lib/analysis/analysis-reporter.d.ts +56 -0
- package/lib/analysis/analysis-reporter.js +170 -0
- package/lib/analysis/analysis-reporter.js.map +1 -0
- package/lib/analytics/error-analytics.d.ts +80 -0
- package/lib/analytics/error-analytics.js +162 -0
- package/lib/analytics/error-analytics.js.map +1 -0
- package/lib/commands/analyze.d.ts +49 -0
- package/lib/commands/analyze.js +232 -0
- package/lib/commands/analyze.js.map +1 -0
- package/lib/commands/config.d.ts +42 -0
- package/lib/commands/config.js +219 -0
- package/lib/commands/config.js.map +1 -0
- package/lib/commands/resume.d.ts +26 -0
- package/lib/commands/resume.js +69 -0
- package/lib/commands/resume.js.map +1 -0
- package/lib/commands/start.d.ts +70 -0
- package/lib/commands/start.js +659 -0
- package/lib/commands/start.js.map +1 -0
- package/lib/commands/status.d.ts +37 -0
- package/lib/commands/status.js +69 -0
- package/lib/commands/status.js.map +1 -0
- package/lib/commands/validate.d.ts +33 -0
- package/lib/commands/validate.js +66 -0
- package/lib/commands/validate.js.map +1 -0
- package/lib/config/repo-config.d.ts +22 -0
- package/lib/config/repo-config.js +31 -0
- package/lib/config/repo-config.js.map +1 -0
- package/lib/constants/agentforce-limits.d.ts +174 -0
- package/lib/constants/agentforce-limits.js +262 -0
- package/lib/constants/agentforce-limits.js.map +1 -0
- package/lib/constants/api-version.d.ts +70 -0
- package/lib/constants/api-version.js +122 -0
- package/lib/constants/api-version.js.map +1 -0
- package/lib/constants/deployment-order.d.ts +68 -0
- package/lib/constants/deployment-order.js +162 -0
- package/lib/constants/deployment-order.js.map +1 -0
- package/lib/constants/salesforce-limits.d.ts +107 -0
- package/lib/constants/salesforce-limits.js +104 -0
- package/lib/constants/salesforce-limits.js.map +1 -0
- package/lib/dependencies/circular-dependency-detector.d.ts +137 -0
- package/lib/dependencies/circular-dependency-detector.js +329 -0
- package/lib/dependencies/circular-dependency-detector.js.map +1 -0
- package/lib/dependencies/cycle-remediation-planner.d.ts +50 -0
- package/lib/dependencies/cycle-remediation-planner.js +192 -0
- package/lib/dependencies/cycle-remediation-planner.js.map +1 -0
- package/lib/dependencies/dependency-cache.d.ts +134 -0
- package/lib/dependencies/dependency-cache.js +303 -0
- package/lib/dependencies/dependency-cache.js.map +1 -0
- package/lib/dependencies/dependency-depth-calculator.d.ts +145 -0
- package/lib/dependencies/dependency-depth-calculator.js +368 -0
- package/lib/dependencies/dependency-depth-calculator.js.map +1 -0
- package/lib/dependencies/dependency-graph-builder.d.ts +151 -0
- package/lib/dependencies/dependency-graph-builder.js +411 -0
- package/lib/dependencies/dependency-graph-builder.js.map +1 -0
- package/lib/dependencies/dependency-impact-analyzer.d.ts +145 -0
- package/lib/dependencies/dependency-impact-analyzer.js +330 -0
- package/lib/dependencies/dependency-impact-analyzer.js.map +1 -0
- package/lib/dependencies/dependency-merger.d.ts +122 -0
- package/lib/dependencies/dependency-merger.js +245 -0
- package/lib/dependencies/dependency-merger.js.map +1 -0
- package/lib/dependencies/dependency-resolver.d.ts +157 -0
- package/lib/dependencies/dependency-resolver.js +298 -0
- package/lib/dependencies/dependency-resolver.js.map +1 -0
- package/lib/dependencies/dependency-validator.d.ts +123 -0
- package/lib/dependencies/dependency-validator.js +291 -0
- package/lib/dependencies/dependency-validator.js.map +1 -0
- package/lib/dependencies/graph-visualizer.d.ts +110 -0
- package/lib/dependencies/graph-visualizer.js +262 -0
- package/lib/dependencies/graph-visualizer.js.map +1 -0
- package/lib/dependencies/heuristic-inference.d.ts +136 -0
- package/lib/dependencies/heuristic-inference.js +430 -0
- package/lib/dependencies/heuristic-inference.js.map +1 -0
- package/lib/deployment/cycle-source-editor.d.ts +34 -0
- package/lib/deployment/cycle-source-editor.js +121 -0
- package/lib/deployment/cycle-source-editor.js.map +1 -0
- package/lib/deployment/deployment-error-handler.d.ts +38 -0
- package/lib/deployment/deployment-error-handler.js +79 -0
- package/lib/deployment/deployment-error-handler.js.map +1 -0
- package/lib/deployment/deployment-reporter.d.ts +63 -0
- package/lib/deployment/deployment-reporter.js +150 -0
- package/lib/deployment/deployment-reporter.js.map +1 -0
- package/lib/deployment/deployment-state-summary.d.ts +38 -0
- package/lib/deployment/deployment-state-summary.js +209 -0
- package/lib/deployment/deployment-state-summary.js.map +1 -0
- package/lib/deployment/deployment-status-service.d.ts +36 -0
- package/lib/deployment/deployment-status-service.js +128 -0
- package/lib/deployment/deployment-status-service.js.map +1 -0
- package/lib/deployment/deployment-tracker.d.ts +42 -0
- package/lib/deployment/deployment-tracker.js +79 -0
- package/lib/deployment/deployment-tracker.js.map +1 -0
- package/lib/deployment/deployment-validation-service.d.ts +28 -0
- package/lib/deployment/deployment-validation-service.js +161 -0
- package/lib/deployment/deployment-validation-service.js.map +1 -0
- package/lib/deployment/retry-handler.d.ts +37 -0
- package/lib/deployment/retry-handler.js +86 -0
- package/lib/deployment/retry-handler.js.map +1 -0
- package/lib/deployment/sf-cli-integration.d.ts +42 -0
- package/lib/deployment/sf-cli-integration.js +105 -0
- package/lib/deployment/sf-cli-integration.js.map +1 -0
- package/lib/deployment/state-manager.d.ts +61 -0
- package/lib/deployment/state-manager.js +83 -0
- package/lib/deployment/state-manager.js.map +1 -0
- package/lib/deployment/test-executor.d.ts +41 -0
- package/lib/deployment/test-executor.js +87 -0
- package/lib/deployment/test-executor.js.map +1 -0
- package/lib/errors/base-error.d.ts +24 -0
- package/lib/errors/base-error.js +66 -0
- package/lib/errors/base-error.js.map +1 -0
- package/lib/errors/dependency-error.d.ts +37 -0
- package/lib/errors/dependency-error.js +76 -0
- package/lib/errors/dependency-error.js.map +1 -0
- package/lib/errors/deployment-error.d.ts +55 -0
- package/lib/errors/deployment-error.js +132 -0
- package/lib/errors/deployment-error.js.map +1 -0
- package/lib/errors/index.d.ts +45 -0
- package/lib/errors/index.js +71 -0
- package/lib/errors/index.js.map +1 -0
- package/lib/errors/network-error.d.ts +53 -0
- package/lib/errors/network-error.js +111 -0
- package/lib/errors/network-error.js.map +1 -0
- package/lib/errors/parsing-error.d.ts +41 -0
- package/lib/errors/parsing-error.js +69 -0
- package/lib/errors/parsing-error.js.map +1 -0
- package/lib/errors/validation-error-reporter.d.ts +34 -0
- package/lib/errors/validation-error-reporter.js +99 -0
- package/lib/errors/validation-error-reporter.js.map +1 -0
- package/lib/errors/validation-error.d.ts +58 -0
- package/lib/errors/validation-error.js +131 -0
- package/lib/errors/validation-error.js.map +1 -0
- package/lib/index.d.ts +2 -0
- package/lib/index.js +2 -0
- package/lib/index.js.map +1 -0
- package/lib/monitoring/performance-monitor.d.ts +98 -0
- package/lib/monitoring/performance-monitor.js +260 -0
- package/lib/monitoring/performance-monitor.js.map +1 -0
- package/lib/parsers/apex-class-parser.d.ts +47 -0
- package/lib/parsers/apex-class-parser.js +368 -0
- package/lib/parsers/apex-class-parser.js.map +1 -0
- package/lib/parsers/apex-trigger-parser.d.ts +48 -0
- package/lib/parsers/apex-trigger-parser.js +229 -0
- package/lib/parsers/apex-trigger-parser.js.map +1 -0
- package/lib/parsers/aura-parser.d.ts +55 -0
- package/lib/parsers/aura-parser.js +229 -0
- package/lib/parsers/aura-parser.js.map +1 -0
- package/lib/parsers/bot-parser.d.ts +65 -0
- package/lib/parsers/bot-parser.js +225 -0
- package/lib/parsers/bot-parser.js.map +1 -0
- package/lib/parsers/custom-metadata-parser.d.ts +94 -0
- package/lib/parsers/custom-metadata-parser.js +199 -0
- package/lib/parsers/custom-metadata-parser.js.map +1 -0
- package/lib/parsers/custom-object-parser.d.ts +62 -0
- package/lib/parsers/custom-object-parser.js +297 -0
- package/lib/parsers/custom-object-parser.js.map +1 -0
- package/lib/parsers/email-template-parser.d.ts +64 -0
- package/lib/parsers/email-template-parser.js +238 -0
- package/lib/parsers/email-template-parser.js.map +1 -0
- package/lib/parsers/error-resilient-parser.d.ts +110 -0
- package/lib/parsers/error-resilient-parser.js +277 -0
- package/lib/parsers/error-resilient-parser.js.map +1 -0
- package/lib/parsers/flexipage-parser.d.ts +64 -0
- package/lib/parsers/flexipage-parser.js +196 -0
- package/lib/parsers/flexipage-parser.js.map +1 -0
- package/lib/parsers/flow-parser.d.ts +54 -0
- package/lib/parsers/flow-parser.js +287 -0
- package/lib/parsers/flow-parser.js.map +1 -0
- package/lib/parsers/genai-prompt-parser.d.ts +67 -0
- package/lib/parsers/genai-prompt-parser.js +160 -0
- package/lib/parsers/genai-prompt-parser.js.map +1 -0
- package/lib/parsers/layout-parser.d.ts +64 -0
- package/lib/parsers/layout-parser.js +267 -0
- package/lib/parsers/layout-parser.js.map +1 -0
- package/lib/parsers/lwc-parser.d.ts +60 -0
- package/lib/parsers/lwc-parser.js +264 -0
- package/lib/parsers/lwc-parser.js.map +1 -0
- package/lib/parsers/permission-set-parser.d.ts +86 -0
- package/lib/parsers/permission-set-parser.js +152 -0
- package/lib/parsers/permission-set-parser.js.map +1 -0
- package/lib/parsers/profile-parser.d.ts +81 -0
- package/lib/parsers/profile-parser.js +141 -0
- package/lib/parsers/profile-parser.js.map +1 -0
- package/lib/parsers/visualforce-parser.d.ts +47 -0
- package/lib/parsers/visualforce-parser.js +180 -0
- package/lib/parsers/visualforce-parser.js.map +1 -0
- package/lib/provisioning/data-provisioner.d.ts +88 -0
- package/lib/provisioning/data-provisioner.js +257 -0
- package/lib/provisioning/data-provisioner.js.map +1 -0
- package/lib/scanner/custom-structure-scanner.d.ts +66 -0
- package/lib/scanner/custom-structure-scanner.js +229 -0
- package/lib/scanner/custom-structure-scanner.js.map +1 -0
- package/lib/scanner/forceignore-parser.d.ts +69 -0
- package/lib/scanner/forceignore-parser.js +195 -0
- package/lib/scanner/forceignore-parser.js.map +1 -0
- package/lib/scanner/metadata-format-scanner.d.ts +77 -0
- package/lib/scanner/metadata-format-scanner.js +282 -0
- package/lib/scanner/metadata-format-scanner.js.map +1 -0
- package/lib/scanner/monorepo-scanner.d.ts +71 -0
- package/lib/scanner/monorepo-scanner.js +225 -0
- package/lib/scanner/monorepo-scanner.js.map +1 -0
- package/lib/scanner/project-validator.d.ts +55 -0
- package/lib/scanner/project-validator.js +235 -0
- package/lib/scanner/project-validator.js.map +1 -0
- package/lib/scanner/sfdx-project-detector.d.ts +86 -0
- package/lib/scanner/sfdx-project-detector.js +240 -0
- package/lib/scanner/sfdx-project-detector.js.map +1 -0
- package/lib/scanner/structure-validator.d.ts +64 -0
- package/lib/scanner/structure-validator.js +296 -0
- package/lib/scanner/structure-validator.js.map +1 -0
- package/lib/services/metadata-scanner-service.d.ts +64 -0
- package/lib/services/metadata-scanner-service.js +651 -0
- package/lib/services/metadata-scanner-service.js.map +1 -0
- package/lib/types/agentforce.d.ts +157 -0
- package/lib/types/agentforce.js +2 -0
- package/lib/types/agentforce.js.map +1 -0
- package/lib/types/dependency.d.ts +98 -0
- package/lib/types/dependency.js +5 -0
- package/lib/types/dependency.js.map +1 -0
- package/lib/types/deployment-plan.d.ts +81 -0
- package/lib/types/deployment-plan.js +6 -0
- package/lib/types/deployment-plan.js.map +1 -0
- package/lib/types/deployment.d.ts +88 -0
- package/lib/types/deployment.js +5 -0
- package/lib/types/deployment.js.map +1 -0
- package/lib/types/graph.d.ts +35 -0
- package/lib/types/graph.js +5 -0
- package/lib/types/graph.js.map +1 -0
- package/lib/types/index.d.ts +12 -0
- package/lib/types/index.js +17 -0
- package/lib/types/index.js.map +1 -0
- package/lib/types/metadata.d.ts +101 -0
- package/lib/types/metadata.js +13 -0
- package/lib/types/metadata.js.map +1 -0
- package/lib/types/project.d.ts +156 -0
- package/lib/types/project.js +56 -0
- package/lib/types/project.js.map +1 -0
- package/lib/types/salesforce/apex.d.ts +94 -0
- package/lib/types/salesforce/apex.js +6 -0
- package/lib/types/salesforce/apex.js.map +1 -0
- package/lib/types/salesforce/aura.d.ts +150 -0
- package/lib/types/salesforce/aura.js +6 -0
- package/lib/types/salesforce/aura.js.map +1 -0
- package/lib/types/salesforce/bot.d.ts +293 -0
- package/lib/types/salesforce/bot.js +6 -0
- package/lib/types/salesforce/bot.js.map +1 -0
- package/lib/types/salesforce/common.d.ts +15 -0
- package/lib/types/salesforce/common.js +5 -0
- package/lib/types/salesforce/common.js.map +1 -0
- package/lib/types/salesforce/custom-metadata.d.ts +92 -0
- package/lib/types/salesforce/custom-metadata.js +6 -0
- package/lib/types/salesforce/custom-metadata.js.map +1 -0
- package/lib/types/salesforce/email.d.ts +56 -0
- package/lib/types/salesforce/email.js +6 -0
- package/lib/types/salesforce/email.js.map +1 -0
- package/lib/types/salesforce/flexipage.d.ts +149 -0
- package/lib/types/salesforce/flexipage.js +6 -0
- package/lib/types/salesforce/flexipage.js.map +1 -0
- package/lib/types/salesforce/flow.d.ts +516 -0
- package/lib/types/salesforce/flow.js +6 -0
- package/lib/types/salesforce/flow.js.map +1 -0
- package/lib/types/salesforce/genai.d.ts +67 -0
- package/lib/types/salesforce/genai.js +6 -0
- package/lib/types/salesforce/genai.js.map +1 -0
- package/lib/types/salesforce/index.d.ts +27 -0
- package/lib/types/salesforce/index.js +43 -0
- package/lib/types/salesforce/index.js.map +1 -0
- package/lib/types/salesforce/layout.d.ts +236 -0
- package/lib/types/salesforce/layout.js +6 -0
- package/lib/types/salesforce/layout.js.map +1 -0
- package/lib/types/salesforce/lwc.d.ts +123 -0
- package/lib/types/salesforce/lwc.js +6 -0
- package/lib/types/salesforce/lwc.js.map +1 -0
- package/lib/types/salesforce/object.d.ts +427 -0
- package/lib/types/salesforce/object.js +6 -0
- package/lib/types/salesforce/object.js.map +1 -0
- package/lib/types/salesforce/parser-types.d.ts +79 -0
- package/lib/types/salesforce/parser-types.js +80 -0
- package/lib/types/salesforce/parser-types.js.map +1 -0
- package/lib/types/salesforce/permission.d.ts +289 -0
- package/lib/types/salesforce/permission.js +6 -0
- package/lib/types/salesforce/permission.js.map +1 -0
- package/lib/types/salesforce/resource.d.ts +93 -0
- package/lib/types/salesforce/resource.js +6 -0
- package/lib/types/salesforce/resource.js.map +1 -0
- package/lib/types/salesforce/visualforce.d.ts +70 -0
- package/lib/types/salesforce/visualforce.js +6 -0
- package/lib/types/salesforce/visualforce.js.map +1 -0
- package/lib/utils/cache-manager.d.ts +158 -0
- package/lib/utils/cache-manager.js +429 -0
- package/lib/utils/cache-manager.js.map +1 -0
- package/lib/utils/deployment-plan-manager.d.ts +40 -0
- package/lib/utils/deployment-plan-manager.js +183 -0
- package/lib/utils/deployment-plan-manager.js.map +1 -0
- package/lib/utils/error-aggregator.d.ts +117 -0
- package/lib/utils/error-aggregator.js +268 -0
- package/lib/utils/error-aggregator.js.map +1 -0
- package/lib/utils/file-system.d.ts +62 -0
- package/lib/utils/file-system.js +167 -0
- package/lib/utils/file-system.js.map +1 -0
- package/lib/utils/functional.d.ts +52 -0
- package/lib/utils/functional.js +61 -0
- package/lib/utils/functional.js.map +1 -0
- package/lib/utils/graph-algorithms.d.ts +53 -0
- package/lib/utils/graph-algorithms.js +177 -0
- package/lib/utils/graph-algorithms.js.map +1 -0
- package/lib/utils/logger.d.ts +154 -0
- package/lib/utils/logger.js +327 -0
- package/lib/utils/logger.js.map +1 -0
- package/lib/utils/network-handler.d.ts +64 -0
- package/lib/utils/network-handler.js +147 -0
- package/lib/utils/network-handler.js.map +1 -0
- package/lib/utils/performance.d.ts +148 -0
- package/lib/utils/performance.js +294 -0
- package/lib/utils/performance.js.map +1 -0
- package/lib/utils/string.d.ts +197 -0
- package/lib/utils/string.js +331 -0
- package/lib/utils/string.js.map +1 -0
- package/lib/utils/xml.d.ts +97 -0
- package/lib/utils/xml.js +227 -0
- package/lib/utils/xml.js.map +1 -0
- package/lib/validators/xml-metadata-validator.d.ts +106 -0
- package/lib/validators/xml-metadata-validator.js +509 -0
- package/lib/validators/xml-metadata-validator.js.map +1 -0
- package/lib/waves/priority-wave-generator-ai.d.ts +85 -0
- package/lib/waves/priority-wave-generator-ai.js +191 -0
- package/lib/waves/priority-wave-generator-ai.js.map +1 -0
- package/lib/waves/priority-wave-generator.d.ts +47 -0
- package/lib/waves/priority-wave-generator.js +88 -0
- package/lib/waves/priority-wave-generator.js.map +1 -0
- package/lib/waves/test-optimizer.d.ts +155 -0
- package/lib/waves/test-optimizer.js +290 -0
- package/lib/waves/test-optimizer.js.map +1 -0
- package/lib/waves/wave-builder.d.ts +147 -0
- package/lib/waves/wave-builder.js +286 -0
- package/lib/waves/wave-builder.js.map +1 -0
- package/lib/waves/wave-diff-generator.d.ts +17 -0
- package/lib/waves/wave-diff-generator.js +6 -0
- package/lib/waves/wave-diff-generator.js.map +1 -0
- package/lib/waves/wave-executor.d.ts +33 -0
- package/lib/waves/wave-executor.js +50 -0
- package/lib/waves/wave-executor.js.map +1 -0
- package/lib/waves/wave-merger.d.ts +96 -0
- package/lib/waves/wave-merger.js +181 -0
- package/lib/waves/wave-merger.js.map +1 -0
- package/lib/waves/wave-metadata-generator.d.ts +13 -0
- package/lib/waves/wave-metadata-generator.js +12 -0
- package/lib/waves/wave-metadata-generator.js.map +1 -0
- package/lib/waves/wave-splitter.d.ts +154 -0
- package/lib/waves/wave-splitter.js +307 -0
- package/lib/waves/wave-splitter.js.map +1 -0
- package/lib/waves/wave-validator.d.ts +17 -0
- package/lib/waves/wave-validator.js +15 -0
- package/lib/waves/wave-validator.js.map +1 -0
- package/messages/analyze.json +18 -0
- package/messages/config.json +29 -0
- package/messages/resume.json +9 -0
- package/messages/start.json +24 -0
- package/messages/status.json +8 -0
- package/messages/validate.json +9 -0
- package/npm-shrinkwrap.json +25676 -0
- package/oclif.lock +11988 -0
- package/oclif.manifest.json +589 -0
- package/package.json +224 -0
|
@@ -0,0 +1,115 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* AI Circuit Breaker - US-060
|
|
3
|
+
* Circuit breaker pattern for AI calls to handle service failures
|
|
4
|
+
*
|
|
5
|
+
* @ac US-060-AC-1: Track failure rate
|
|
6
|
+
* @ac US-060-AC-2: Open circuit after N failures
|
|
7
|
+
* @ac US-060-AC-3: Automatic fallback to static analysis
|
|
8
|
+
* @ac US-060-AC-4: Reset after timeout
|
|
9
|
+
* @ac US-060-AC-5: Monitor circuit state
|
|
10
|
+
* @ac US-060-AC-6: Alert on circuit open
|
|
11
|
+
* @issue #60
|
|
12
|
+
*/
|
|
13
|
+
export type CircuitState = 'closed' | 'open' | 'half-open';
|
|
14
|
+
export type CircuitBreakerOptions = {
|
|
15
|
+
failureThreshold: number;
|
|
16
|
+
successThreshold: number;
|
|
17
|
+
timeout: number;
|
|
18
|
+
monitoringWindow: number;
|
|
19
|
+
};
|
|
20
|
+
export type CircuitBreakerStats = {
|
|
21
|
+
state: CircuitState;
|
|
22
|
+
failures: number;
|
|
23
|
+
successes: number;
|
|
24
|
+
consecutiveFailures: number;
|
|
25
|
+
lastFailureTime?: Date;
|
|
26
|
+
lastSuccessTime?: Date;
|
|
27
|
+
tripCount: number;
|
|
28
|
+
};
|
|
29
|
+
/**
|
|
30
|
+
* @ac US-060-AC-1: Track failure rate
|
|
31
|
+
* @ac US-060-AC-2: Open circuit after N failures
|
|
32
|
+
* @ac US-060-AC-5: Monitor circuit state
|
|
33
|
+
*/
|
|
34
|
+
export declare class CircuitBreaker {
|
|
35
|
+
private state;
|
|
36
|
+
private failures;
|
|
37
|
+
private successes;
|
|
38
|
+
private consecutiveFailures;
|
|
39
|
+
private lastFailureTime?;
|
|
40
|
+
private lastSuccessTime?;
|
|
41
|
+
private tripCount;
|
|
42
|
+
private readonly options;
|
|
43
|
+
constructor(options?: Partial<CircuitBreakerOptions>);
|
|
44
|
+
/**
|
|
45
|
+
* @ac US-060-AC-2: Open circuit after N failures
|
|
46
|
+
* @ac US-060-AC-3: Automatic fallback to static analysis
|
|
47
|
+
* Execute function with circuit breaker protection
|
|
48
|
+
*/
|
|
49
|
+
execute<T>(fn: () => Promise<T>, fallback?: () => T | Promise<T>): Promise<T>;
|
|
50
|
+
/**
|
|
51
|
+
* @ac US-060-AC-1: Track failure rate
|
|
52
|
+
* Record successful execution
|
|
53
|
+
*/
|
|
54
|
+
private onSuccess;
|
|
55
|
+
/**
|
|
56
|
+
* @ac US-060-AC-1: Track failure rate
|
|
57
|
+
* @ac US-060-AC-2: Open circuit after N failures
|
|
58
|
+
* Record failed execution
|
|
59
|
+
*/
|
|
60
|
+
private onFailure;
|
|
61
|
+
/**
|
|
62
|
+
* @ac US-060-AC-2: Open circuit after N failures
|
|
63
|
+
* @ac US-060-AC-6: Alert on circuit open
|
|
64
|
+
* Open the circuit
|
|
65
|
+
*/
|
|
66
|
+
private openCircuit;
|
|
67
|
+
/**
|
|
68
|
+
* Close the circuit
|
|
69
|
+
*/
|
|
70
|
+
private closeCircuit;
|
|
71
|
+
/**
|
|
72
|
+
* @ac US-060-AC-4: Reset after timeout
|
|
73
|
+
* Check if circuit should transition to half-open
|
|
74
|
+
*/
|
|
75
|
+
private checkStateTransition;
|
|
76
|
+
/**
|
|
77
|
+
* @ac US-060-AC-5: Monitor circuit state
|
|
78
|
+
* Get current statistics
|
|
79
|
+
*/
|
|
80
|
+
getStats(): CircuitBreakerStats;
|
|
81
|
+
/**
|
|
82
|
+
* @ac US-060-AC-1: Track failure rate
|
|
83
|
+
* Get failure rate within monitoring window
|
|
84
|
+
*/
|
|
85
|
+
getFailureRate(): number;
|
|
86
|
+
/**
|
|
87
|
+
* Get current state
|
|
88
|
+
*/
|
|
89
|
+
getState(): CircuitState;
|
|
90
|
+
/**
|
|
91
|
+
* Check if circuit is allowing requests
|
|
92
|
+
*/
|
|
93
|
+
isOpen(): boolean;
|
|
94
|
+
/**
|
|
95
|
+
* Manual reset (for testing or manual intervention)
|
|
96
|
+
*/
|
|
97
|
+
reset(): void;
|
|
98
|
+
/**
|
|
99
|
+
* @ac US-060-AC-6: Alert on circuit open
|
|
100
|
+
* Send alert (integration point for monitoring)
|
|
101
|
+
*/
|
|
102
|
+
private sendAlert;
|
|
103
|
+
/**
|
|
104
|
+
* Format monitoring report
|
|
105
|
+
*/
|
|
106
|
+
formatReport(): string;
|
|
107
|
+
/**
|
|
108
|
+
* Get state icon
|
|
109
|
+
*/
|
|
110
|
+
private getStateIcon;
|
|
111
|
+
/**
|
|
112
|
+
* Get time until half-open state
|
|
113
|
+
*/
|
|
114
|
+
private getTimeUntilHalfOpen;
|
|
115
|
+
}
|
|
@@ -0,0 +1,277 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* AI Circuit Breaker - US-060
|
|
3
|
+
* Circuit breaker pattern for AI calls to handle service failures
|
|
4
|
+
*
|
|
5
|
+
* @ac US-060-AC-1: Track failure rate
|
|
6
|
+
* @ac US-060-AC-2: Open circuit after N failures
|
|
7
|
+
* @ac US-060-AC-3: Automatic fallback to static analysis
|
|
8
|
+
* @ac US-060-AC-4: Reset after timeout
|
|
9
|
+
* @ac US-060-AC-5: Monitor circuit state
|
|
10
|
+
* @ac US-060-AC-6: Alert on circuit open
|
|
11
|
+
* @issue #60
|
|
12
|
+
*/
|
|
13
|
+
import { getLogger } from '../utils/logger.js';
|
|
14
|
+
const logger = getLogger('CircuitBreaker');
|
|
15
|
+
/**
|
|
16
|
+
* @ac US-060-AC-1: Track failure rate
|
|
17
|
+
* @ac US-060-AC-2: Open circuit after N failures
|
|
18
|
+
* @ac US-060-AC-5: Monitor circuit state
|
|
19
|
+
*/
|
|
20
|
+
export class CircuitBreaker {
|
|
21
|
+
state = 'closed';
|
|
22
|
+
failures = 0;
|
|
23
|
+
successes = 0;
|
|
24
|
+
consecutiveFailures = 0;
|
|
25
|
+
lastFailureTime;
|
|
26
|
+
lastSuccessTime;
|
|
27
|
+
tripCount = 0;
|
|
28
|
+
options;
|
|
29
|
+
constructor(options) {
|
|
30
|
+
this.options = {
|
|
31
|
+
failureThreshold: options?.failureThreshold ?? 5,
|
|
32
|
+
successThreshold: options?.successThreshold ?? 2,
|
|
33
|
+
timeout: options?.timeout ?? 60_000, // 1 minute
|
|
34
|
+
monitoringWindow: options?.monitoringWindow ?? 300_000, // 5 minutes
|
|
35
|
+
};
|
|
36
|
+
logger.info('Circuit breaker initialized', {
|
|
37
|
+
failureThreshold: this.options.failureThreshold,
|
|
38
|
+
timeout: this.options.timeout,
|
|
39
|
+
});
|
|
40
|
+
}
|
|
41
|
+
/**
|
|
42
|
+
* @ac US-060-AC-2: Open circuit after N failures
|
|
43
|
+
* @ac US-060-AC-3: Automatic fallback to static analysis
|
|
44
|
+
* Execute function with circuit breaker protection
|
|
45
|
+
*/
|
|
46
|
+
async execute(fn, fallback) {
|
|
47
|
+
// Check if circuit should transition states
|
|
48
|
+
this.checkStateTransition();
|
|
49
|
+
if (this.state === 'open') {
|
|
50
|
+
logger.warn('Circuit breaker is OPEN, using fallback');
|
|
51
|
+
if (fallback) {
|
|
52
|
+
return Promise.resolve(fallback());
|
|
53
|
+
}
|
|
54
|
+
throw new Error('Circuit breaker is OPEN and no fallback provided');
|
|
55
|
+
}
|
|
56
|
+
try {
|
|
57
|
+
const result = await fn();
|
|
58
|
+
this.onSuccess();
|
|
59
|
+
return result;
|
|
60
|
+
}
|
|
61
|
+
catch (error) {
|
|
62
|
+
this.onFailure();
|
|
63
|
+
// If circuit just opened, use fallback
|
|
64
|
+
// Re-check state after onFailure() which may have changed it
|
|
65
|
+
if (this.getState() === 'open' && fallback) {
|
|
66
|
+
logger.info('Circuit opened, using fallback');
|
|
67
|
+
return Promise.resolve(fallback());
|
|
68
|
+
}
|
|
69
|
+
throw error;
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
/**
|
|
73
|
+
* @ac US-060-AC-1: Track failure rate
|
|
74
|
+
* Record successful execution
|
|
75
|
+
*/
|
|
76
|
+
onSuccess() {
|
|
77
|
+
this.successes++;
|
|
78
|
+
this.consecutiveFailures = 0;
|
|
79
|
+
this.lastSuccessTime = new Date();
|
|
80
|
+
logger.debug('Circuit breaker: success recorded', {
|
|
81
|
+
state: this.state,
|
|
82
|
+
successes: this.successes,
|
|
83
|
+
});
|
|
84
|
+
// If half-open and enough successes, close circuit
|
|
85
|
+
if (this.state === 'half-open' && this.successes >= this.options.successThreshold) {
|
|
86
|
+
this.closeCircuit();
|
|
87
|
+
}
|
|
88
|
+
}
|
|
89
|
+
/**
|
|
90
|
+
* @ac US-060-AC-1: Track failure rate
|
|
91
|
+
* @ac US-060-AC-2: Open circuit after N failures
|
|
92
|
+
* Record failed execution
|
|
93
|
+
*/
|
|
94
|
+
onFailure() {
|
|
95
|
+
this.failures++;
|
|
96
|
+
this.consecutiveFailures++;
|
|
97
|
+
this.lastFailureTime = new Date();
|
|
98
|
+
logger.warn('Circuit breaker: failure recorded', {
|
|
99
|
+
state: this.state,
|
|
100
|
+
failures: this.failures,
|
|
101
|
+
consecutiveFailures: this.consecutiveFailures,
|
|
102
|
+
});
|
|
103
|
+
// Open circuit if threshold reached
|
|
104
|
+
if (this.consecutiveFailures >= this.options.failureThreshold) {
|
|
105
|
+
this.openCircuit();
|
|
106
|
+
}
|
|
107
|
+
}
|
|
108
|
+
/**
|
|
109
|
+
* @ac US-060-AC-2: Open circuit after N failures
|
|
110
|
+
* @ac US-060-AC-6: Alert on circuit open
|
|
111
|
+
* Open the circuit
|
|
112
|
+
*/
|
|
113
|
+
openCircuit() {
|
|
114
|
+
if (this.state === 'open')
|
|
115
|
+
return;
|
|
116
|
+
this.state = 'open';
|
|
117
|
+
this.tripCount++;
|
|
118
|
+
logger.error('🔴 CIRCUIT BREAKER OPENED', {
|
|
119
|
+
tripCount: this.tripCount,
|
|
120
|
+
consecutiveFailures: this.consecutiveFailures,
|
|
121
|
+
timeout: this.options.timeout,
|
|
122
|
+
});
|
|
123
|
+
// Alert (in production, this would send to monitoring system)
|
|
124
|
+
this.sendAlert('Circuit breaker opened due to repeated failures');
|
|
125
|
+
}
|
|
126
|
+
/**
|
|
127
|
+
* Close the circuit
|
|
128
|
+
*/
|
|
129
|
+
closeCircuit() {
|
|
130
|
+
this.state = 'closed';
|
|
131
|
+
this.consecutiveFailures = 0;
|
|
132
|
+
this.successes = 0;
|
|
133
|
+
logger.info('🟢 Circuit breaker CLOSED', {
|
|
134
|
+
tripCount: this.tripCount,
|
|
135
|
+
});
|
|
136
|
+
}
|
|
137
|
+
/**
|
|
138
|
+
* @ac US-060-AC-4: Reset after timeout
|
|
139
|
+
* Check if circuit should transition to half-open
|
|
140
|
+
*/
|
|
141
|
+
checkStateTransition() {
|
|
142
|
+
if (this.state !== 'open')
|
|
143
|
+
return;
|
|
144
|
+
if (!this.lastFailureTime)
|
|
145
|
+
return;
|
|
146
|
+
const timeSinceLastFailure = Date.now() - this.lastFailureTime.getTime();
|
|
147
|
+
if (timeSinceLastFailure >= this.options.timeout) {
|
|
148
|
+
this.state = 'half-open';
|
|
149
|
+
this.successes = 0; // Reset success counter for half-open test
|
|
150
|
+
logger.info('🟡 Circuit breaker HALF-OPEN (testing)', {
|
|
151
|
+
timeout: this.options.timeout,
|
|
152
|
+
timeSinceLastFailure,
|
|
153
|
+
});
|
|
154
|
+
}
|
|
155
|
+
}
|
|
156
|
+
/**
|
|
157
|
+
* @ac US-060-AC-5: Monitor circuit state
|
|
158
|
+
* Get current statistics
|
|
159
|
+
*/
|
|
160
|
+
getStats() {
|
|
161
|
+
return {
|
|
162
|
+
state: this.state,
|
|
163
|
+
failures: this.failures,
|
|
164
|
+
successes: this.successes,
|
|
165
|
+
consecutiveFailures: this.consecutiveFailures,
|
|
166
|
+
lastFailureTime: this.lastFailureTime,
|
|
167
|
+
lastSuccessTime: this.lastSuccessTime,
|
|
168
|
+
tripCount: this.tripCount,
|
|
169
|
+
};
|
|
170
|
+
}
|
|
171
|
+
/**
|
|
172
|
+
* @ac US-060-AC-1: Track failure rate
|
|
173
|
+
* Get failure rate within monitoring window
|
|
174
|
+
*/
|
|
175
|
+
getFailureRate() {
|
|
176
|
+
if (!this.lastFailureTime)
|
|
177
|
+
return 0;
|
|
178
|
+
const windowStart = Date.now() - this.options.monitoringWindow;
|
|
179
|
+
const lastFailureTime = this.lastFailureTime.getTime();
|
|
180
|
+
if (lastFailureTime < windowStart) {
|
|
181
|
+
return 0; // Failures outside window
|
|
182
|
+
}
|
|
183
|
+
const total = this.failures + this.successes;
|
|
184
|
+
return total > 0 ? this.failures / total : 0;
|
|
185
|
+
}
|
|
186
|
+
/**
|
|
187
|
+
* Get current state
|
|
188
|
+
*/
|
|
189
|
+
getState() {
|
|
190
|
+
this.checkStateTransition();
|
|
191
|
+
return this.state;
|
|
192
|
+
}
|
|
193
|
+
/**
|
|
194
|
+
* Check if circuit is allowing requests
|
|
195
|
+
*/
|
|
196
|
+
isOpen() {
|
|
197
|
+
this.checkStateTransition();
|
|
198
|
+
return this.state === 'open';
|
|
199
|
+
}
|
|
200
|
+
/**
|
|
201
|
+
* Manual reset (for testing or manual intervention)
|
|
202
|
+
*/
|
|
203
|
+
reset() {
|
|
204
|
+
this.state = 'closed';
|
|
205
|
+
this.failures = 0;
|
|
206
|
+
this.successes = 0;
|
|
207
|
+
this.consecutiveFailures = 0;
|
|
208
|
+
this.lastFailureTime = undefined;
|
|
209
|
+
this.lastSuccessTime = undefined;
|
|
210
|
+
logger.info('Circuit breaker manually reset');
|
|
211
|
+
}
|
|
212
|
+
/**
|
|
213
|
+
* @ac US-060-AC-6: Alert on circuit open
|
|
214
|
+
* Send alert (integration point for monitoring)
|
|
215
|
+
*/
|
|
216
|
+
sendAlert(message) {
|
|
217
|
+
// In production, this would integrate with:
|
|
218
|
+
// - PagerDuty
|
|
219
|
+
// - Slack
|
|
220
|
+
// - CloudWatch Alarms
|
|
221
|
+
// - Datadog
|
|
222
|
+
// etc.
|
|
223
|
+
logger.error('🚨 ALERT:', { message, stats: this.getStats() });
|
|
224
|
+
// For now, just log. In production, implement actual alerting.
|
|
225
|
+
}
|
|
226
|
+
/**
|
|
227
|
+
* Format monitoring report
|
|
228
|
+
*/
|
|
229
|
+
formatReport() {
|
|
230
|
+
const stats = this.getStats();
|
|
231
|
+
const failureRate = (this.getFailureRate() * 100).toFixed(1);
|
|
232
|
+
const lines = [];
|
|
233
|
+
lines.push('⚡ Circuit Breaker Status');
|
|
234
|
+
lines.push('═══════════════════════════════════════');
|
|
235
|
+
lines.push(`State: ${this.getStateIcon()} ${stats.state.toUpperCase()}`);
|
|
236
|
+
lines.push(`Failure Rate: ${failureRate}%`);
|
|
237
|
+
lines.push(`Consecutive Failures: ${stats.consecutiveFailures}/${this.options.failureThreshold}`);
|
|
238
|
+
lines.push(`Trip Count: ${stats.tripCount}`);
|
|
239
|
+
lines.push('');
|
|
240
|
+
lines.push(`Total Successes: ${stats.successes}`);
|
|
241
|
+
lines.push(`Total Failures: ${stats.failures}`);
|
|
242
|
+
if (stats.lastFailureTime) {
|
|
243
|
+
const timeSince = Date.now() - stats.lastFailureTime.getTime();
|
|
244
|
+
lines.push(`Last Failure: ${Math.floor(timeSince / 1000)}s ago`);
|
|
245
|
+
}
|
|
246
|
+
if (this.state === 'open') {
|
|
247
|
+
lines.push('');
|
|
248
|
+
lines.push(`⏰ Reset in: ${this.getTimeUntilHalfOpen()}ms`);
|
|
249
|
+
}
|
|
250
|
+
return lines.join('\n');
|
|
251
|
+
}
|
|
252
|
+
/**
|
|
253
|
+
* Get state icon
|
|
254
|
+
*/
|
|
255
|
+
getStateIcon() {
|
|
256
|
+
switch (this.state) {
|
|
257
|
+
case 'closed':
|
|
258
|
+
return '🟢';
|
|
259
|
+
case 'open':
|
|
260
|
+
return '🔴';
|
|
261
|
+
case 'half-open':
|
|
262
|
+
return '🟡';
|
|
263
|
+
default:
|
|
264
|
+
return '⚪';
|
|
265
|
+
}
|
|
266
|
+
}
|
|
267
|
+
/**
|
|
268
|
+
* Get time until half-open state
|
|
269
|
+
*/
|
|
270
|
+
getTimeUntilHalfOpen() {
|
|
271
|
+
if (this.state !== 'open' || !this.lastFailureTime)
|
|
272
|
+
return 0;
|
|
273
|
+
const timeSinceFailure = Date.now() - this.lastFailureTime.getTime();
|
|
274
|
+
return Math.max(0, this.options.timeout - timeSinceFailure);
|
|
275
|
+
}
|
|
276
|
+
}
|
|
277
|
+
//# sourceMappingURL=circuit-breaker.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"circuit-breaker.js","sourceRoot":"","sources":["../../src/ai/circuit-breaker.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,76 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* AI Dependency Inference Service - US-055
|
|
3
|
+
* Uses Agentforce to infer non-obvious dependencies
|
|
4
|
+
*
|
|
5
|
+
* @ac US-055-AC-1: Send component context to Agentforce
|
|
6
|
+
* @ac US-055-AC-2: Receive dependency inferences
|
|
7
|
+
* @ac US-055-AC-3: Parse AI responses
|
|
8
|
+
* @ac US-055-AC-4: Confidence scoring
|
|
9
|
+
* @ac US-055-AC-5: Fallback to static analysis if AI fails
|
|
10
|
+
* @ac US-055-AC-6: Cache AI results
|
|
11
|
+
* @issue #55
|
|
12
|
+
*/
|
|
13
|
+
import type { MetadataComponent } from '../types/metadata.js';
|
|
14
|
+
import type { DependencyGraph } from '../types/dependency.js';
|
|
15
|
+
import type { LLMProvider } from './llm-provider.js';
|
|
16
|
+
export type InferredDependency = {
|
|
17
|
+
from: string;
|
|
18
|
+
to: string;
|
|
19
|
+
type: 'implicit' | 'dynamic' | 'runtime' | 'business-logic';
|
|
20
|
+
confidence: number;
|
|
21
|
+
reason: string;
|
|
22
|
+
lineNumber?: number;
|
|
23
|
+
};
|
|
24
|
+
export type InferenceResult = {
|
|
25
|
+
dependencies: InferredDependency[];
|
|
26
|
+
totalInferred: number;
|
|
27
|
+
highConfidenceCount: number;
|
|
28
|
+
executionTime: number;
|
|
29
|
+
usedCache: boolean;
|
|
30
|
+
fallbackToStatic: boolean;
|
|
31
|
+
};
|
|
32
|
+
export type DependencyInferenceServiceOptions = {
|
|
33
|
+
baseDir?: string;
|
|
34
|
+
};
|
|
35
|
+
/**
|
|
36
|
+
* @ac US-055-AC-1: Send component context to Agentforce
|
|
37
|
+
* @ac US-055-AC-2: Receive dependency inferences
|
|
38
|
+
*/
|
|
39
|
+
export declare class DependencyInferenceService {
|
|
40
|
+
private readonly llmProvider;
|
|
41
|
+
private readonly cache;
|
|
42
|
+
private readonly confidenceThreshold;
|
|
43
|
+
constructor(llmProviderOrOptions?: LLMProvider | DependencyInferenceServiceOptions, confidenceThreshold?: number);
|
|
44
|
+
private resolveProvider;
|
|
45
|
+
/**
|
|
46
|
+
* @ac US-055-AC-1: Send component context to Agentforce
|
|
47
|
+
* Infer dependencies for components
|
|
48
|
+
*/
|
|
49
|
+
inferDependencies(components: MetadataComponent[], existingGraph?: DependencyGraph): Promise<InferenceResult>;
|
|
50
|
+
/**
|
|
51
|
+
* Build prompt for dependency inference
|
|
52
|
+
*/
|
|
53
|
+
private buildInferencePrompt;
|
|
54
|
+
/**
|
|
55
|
+
* @ac US-055-AC-3: Parse AI responses
|
|
56
|
+
* Parse Agentforce response into structured data
|
|
57
|
+
*/
|
|
58
|
+
private parseInferenceResponse;
|
|
59
|
+
/**
|
|
60
|
+
* @ac US-055-AC-6: Cache AI results
|
|
61
|
+
* Generate cache key for components
|
|
62
|
+
*/
|
|
63
|
+
private getCacheKey;
|
|
64
|
+
/**
|
|
65
|
+
* Clear cache
|
|
66
|
+
*/
|
|
67
|
+
clearCache(): void;
|
|
68
|
+
/**
|
|
69
|
+
* Get cache size
|
|
70
|
+
*/
|
|
71
|
+
getCacheSize(): number;
|
|
72
|
+
/**
|
|
73
|
+
* Get confidence threshold
|
|
74
|
+
*/
|
|
75
|
+
getConfidenceThreshold(): number;
|
|
76
|
+
}
|