vaspera 2.5.0
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/CHANGELOG.md +184 -0
- package/LICENSE +21 -0
- package/README.md +809 -0
- package/dist/__tests__/integration/certification-flow.test.d.ts +5 -0
- package/dist/__tests__/integration/certification-flow.test.d.ts.map +1 -0
- package/dist/__tests__/integration/certification-flow.test.js +245 -0
- package/dist/__tests__/integration/certification-flow.test.js.map +1 -0
- package/dist/__tests__/integration/commands.test.d.ts +5 -0
- package/dist/__tests__/integration/commands.test.d.ts.map +1 -0
- package/dist/__tests__/integration/commands.test.js +93 -0
- package/dist/__tests__/integration/commands.test.js.map +1 -0
- package/dist/action/diff-mode.d.ts +34 -0
- package/dist/action/diff-mode.d.ts.map +1 -0
- package/dist/action/diff-mode.js +201 -0
- package/dist/action/diff-mode.js.map +1 -0
- package/dist/action/diff-mode.test.d.ts +5 -0
- package/dist/action/diff-mode.test.d.ts.map +1 -0
- package/dist/action/diff-mode.test.js +162 -0
- package/dist/action/diff-mode.test.js.map +1 -0
- package/dist/action/index.d.ts +10 -0
- package/dist/action/index.d.ts.map +1 -0
- package/dist/action/index.js +231 -0
- package/dist/action/index.js.map +1 -0
- package/dist/action/pr-comment.d.ts +30 -0
- package/dist/action/pr-comment.d.ts.map +1 -0
- package/dist/action/pr-comment.js +301 -0
- package/dist/action/pr-comment.js.map +1 -0
- package/dist/action/pr-comment.test.d.ts +5 -0
- package/dist/action/pr-comment.test.d.ts.map +1 -0
- package/dist/action/pr-comment.test.js +189 -0
- package/dist/action/pr-comment.test.js.map +1 -0
- package/dist/action/sarif-upload.d.ts +104 -0
- package/dist/action/sarif-upload.d.ts.map +1 -0
- package/dist/action/sarif-upload.js +188 -0
- package/dist/action/sarif-upload.js.map +1 -0
- package/dist/action/sarif-upload.test.d.ts +5 -0
- package/dist/action/sarif-upload.test.d.ts.map +1 -0
- package/dist/action/sarif-upload.test.js +206 -0
- package/dist/action/sarif-upload.test.js.map +1 -0
- package/dist/action/types.d.ts +104 -0
- package/dist/action/types.d.ts.map +1 -0
- package/dist/action/types.js +33 -0
- package/dist/action/types.js.map +1 -0
- package/dist/action/types.test.d.ts +5 -0
- package/dist/action/types.test.d.ts.map +1 -0
- package/dist/action/types.test.js +79 -0
- package/dist/action/types.test.js.map +1 -0
- package/dist/agents/agent-integrity.d.ts +111 -0
- package/dist/agents/agent-integrity.d.ts.map +1 -0
- package/dist/agents/agent-integrity.js +308 -0
- package/dist/agents/agent-integrity.js.map +1 -0
- package/dist/agents/agent-privacy.d.ts +68 -0
- package/dist/agents/agent-privacy.d.ts.map +1 -0
- package/dist/agents/agent-privacy.js +345 -0
- package/dist/agents/agent-privacy.js.map +1 -0
- package/dist/agents/exploit-chain.d.ts +64 -0
- package/dist/agents/exploit-chain.d.ts.map +1 -0
- package/dist/agents/exploit-chain.js +477 -0
- package/dist/agents/exploit-chain.js.map +1 -0
- package/dist/agents/exploit-chain.test.d.ts +5 -0
- package/dist/agents/exploit-chain.test.d.ts.map +1 -0
- package/dist/agents/exploit-chain.test.js +455 -0
- package/dist/agents/exploit-chain.test.js.map +1 -0
- package/dist/agents/index.d.ts +14 -0
- package/dist/agents/index.d.ts.map +1 -0
- package/dist/agents/index.js +19 -0
- package/dist/agents/index.js.map +1 -0
- package/dist/agents/logic-flaw-detector.d.ts +55 -0
- package/dist/agents/logic-flaw-detector.d.ts.map +1 -0
- package/dist/agents/logic-flaw-detector.js +454 -0
- package/dist/agents/logic-flaw-detector.js.map +1 -0
- package/dist/agents/zero-day-hunter.d.ts +69 -0
- package/dist/agents/zero-day-hunter.d.ts.map +1 -0
- package/dist/agents/zero-day-hunter.js +591 -0
- package/dist/agents/zero-day-hunter.js.map +1 -0
- package/dist/certification/artifacts.d.ts +21 -0
- package/dist/certification/artifacts.d.ts.map +1 -0
- package/dist/certification/artifacts.js +275 -0
- package/dist/certification/artifacts.js.map +1 -0
- package/dist/certification/autofix.d.ts +122 -0
- package/dist/certification/autofix.d.ts.map +1 -0
- package/dist/certification/autofix.js +476 -0
- package/dist/certification/autofix.js.map +1 -0
- package/dist/certification/badge.d.ts +56 -0
- package/dist/certification/badge.d.ts.map +1 -0
- package/dist/certification/badge.js +155 -0
- package/dist/certification/badge.js.map +1 -0
- package/dist/certification/cache.d.ts +121 -0
- package/dist/certification/cache.d.ts.map +1 -0
- package/dist/certification/cache.js +275 -0
- package/dist/certification/cache.js.map +1 -0
- package/dist/certification/cache.test.d.ts +5 -0
- package/dist/certification/cache.test.d.ts.map +1 -0
- package/dist/certification/cache.test.js +270 -0
- package/dist/certification/cache.test.js.map +1 -0
- package/dist/certification/consensus.d.ts +105 -0
- package/dist/certification/consensus.d.ts.map +1 -0
- package/dist/certification/consensus.js +353 -0
- package/dist/certification/consensus.js.map +1 -0
- package/dist/certification/consensus.test.d.ts +5 -0
- package/dist/certification/consensus.test.d.ts.map +1 -0
- package/dist/certification/consensus.test.js +342 -0
- package/dist/certification/consensus.test.js.map +1 -0
- package/dist/certification/index.d.ts +14 -0
- package/dist/certification/index.d.ts.map +1 -0
- package/dist/certification/index.js +14 -0
- package/dist/certification/index.js.map +1 -0
- package/dist/certification/rules.d.ts +89 -0
- package/dist/certification/rules.d.ts.map +1 -0
- package/dist/certification/rules.js +317 -0
- package/dist/certification/rules.js.map +1 -0
- package/dist/certification/sarif.d.ts +107 -0
- package/dist/certification/sarif.d.ts.map +1 -0
- package/dist/certification/sarif.js +191 -0
- package/dist/certification/sarif.js.map +1 -0
- package/dist/certification/store.d.ts +255 -0
- package/dist/certification/store.d.ts.map +1 -0
- package/dist/certification/store.js +835 -0
- package/dist/certification/store.js.map +1 -0
- package/dist/certification/store.test.d.ts +5 -0
- package/dist/certification/store.test.d.ts.map +1 -0
- package/dist/certification/store.test.js +468 -0
- package/dist/certification/store.test.js.map +1 -0
- package/dist/certification/summary.d.ts +72 -0
- package/dist/certification/summary.d.ts.map +1 -0
- package/dist/certification/summary.js +296 -0
- package/dist/certification/summary.js.map +1 -0
- package/dist/certification/types.d.ts +138 -0
- package/dist/certification/types.d.ts.map +1 -0
- package/dist/certification/types.js +34 -0
- package/dist/certification/types.js.map +1 -0
- package/dist/commands/audits/api-check.d.ts +3 -0
- package/dist/commands/audits/api-check.d.ts.map +1 -0
- package/dist/commands/audits/api-check.js +71 -0
- package/dist/commands/audits/api-check.js.map +1 -0
- package/dist/commands/audits/deadcode.d.ts +3 -0
- package/dist/commands/audits/deadcode.d.ts.map +1 -0
- package/dist/commands/audits/deadcode.js +63 -0
- package/dist/commands/audits/deadcode.js.map +1 -0
- package/dist/commands/audits/deps.d.ts +3 -0
- package/dist/commands/audits/deps.d.ts.map +1 -0
- package/dist/commands/audits/deps.js +56 -0
- package/dist/commands/audits/deps.js.map +1 -0
- package/dist/commands/audits/errors.d.ts +3 -0
- package/dist/commands/audits/errors.d.ts.map +1 -0
- package/dist/commands/audits/errors.js +65 -0
- package/dist/commands/audits/errors.js.map +1 -0
- package/dist/commands/audits/index.d.ts +3 -0
- package/dist/commands/audits/index.d.ts.map +1 -0
- package/dist/commands/audits/index.js +15 -0
- package/dist/commands/audits/index.js.map +1 -0
- package/dist/commands/audits/perf.d.ts +3 -0
- package/dist/commands/audits/perf.d.ts.map +1 -0
- package/dist/commands/audits/perf.js +85 -0
- package/dist/commands/audits/perf.js.map +1 -0
- package/dist/commands/audits/secrets.d.ts +3 -0
- package/dist/commands/audits/secrets.d.ts.map +1 -0
- package/dist/commands/audits/secrets.js +71 -0
- package/dist/commands/audits/secrets.js.map +1 -0
- package/dist/commands/certification/certify.d.ts +3 -0
- package/dist/commands/certification/certify.d.ts.map +1 -0
- package/dist/commands/certification/certify.js +108 -0
- package/dist/commands/certification/certify.js.map +1 -0
- package/dist/commands/certification/index.d.ts +3 -0
- package/dist/commands/certification/index.d.ts.map +1 -0
- package/dist/commands/certification/index.js +17 -0
- package/dist/commands/certification/index.js.map +1 -0
- package/dist/commands/certification/performance.d.ts +3 -0
- package/dist/commands/certification/performance.d.ts.map +1 -0
- package/dist/commands/certification/performance.js +89 -0
- package/dist/commands/certification/performance.js.map +1 -0
- package/dist/commands/certification/quality.d.ts +3 -0
- package/dist/commands/certification/quality.d.ts.map +1 -0
- package/dist/commands/certification/quality.js +92 -0
- package/dist/commands/certification/quality.js.map +1 -0
- package/dist/commands/certification/redteam.d.ts +3 -0
- package/dist/commands/certification/redteam.d.ts.map +1 -0
- package/dist/commands/certification/redteam.js +114 -0
- package/dist/commands/certification/redteam.js.map +1 -0
- package/dist/commands/certification/reliability.d.ts +3 -0
- package/dist/commands/certification/reliability.d.ts.map +1 -0
- package/dist/commands/certification/reliability.js +93 -0
- package/dist/commands/certification/reliability.js.map +1 -0
- package/dist/commands/certification/security.d.ts +3 -0
- package/dist/commands/certification/security.d.ts.map +1 -0
- package/dist/commands/certification/security.js +90 -0
- package/dist/commands/certification/security.js.map +1 -0
- package/dist/commands/certification/typesafety.d.ts +3 -0
- package/dist/commands/certification/typesafety.d.ts.map +1 -0
- package/dist/commands/certification/typesafety.js +87 -0
- package/dist/commands/certification/typesafety.js.map +1 -0
- package/dist/commands/core/add-tests.d.ts +3 -0
- package/dist/commands/core/add-tests.d.ts.map +1 -0
- package/dist/commands/core/add-tests.js +29 -0
- package/dist/commands/core/add-tests.js.map +1 -0
- package/dist/commands/core/audit.d.ts +3 -0
- package/dist/commands/core/audit.d.ts.map +1 -0
- package/dist/commands/core/audit.js +64 -0
- package/dist/commands/core/audit.js.map +1 -0
- package/dist/commands/core/fix-critical.d.ts +3 -0
- package/dist/commands/core/fix-critical.d.ts.map +1 -0
- package/dist/commands/core/fix-critical.js +22 -0
- package/dist/commands/core/fix-critical.js.map +1 -0
- package/dist/commands/core/fix-high.d.ts +3 -0
- package/dist/commands/core/fix-high.d.ts.map +1 -0
- package/dist/commands/core/fix-high.js +32 -0
- package/dist/commands/core/fix-high.js.map +1 -0
- package/dist/commands/core/fix-medium.d.ts +3 -0
- package/dist/commands/core/fix-medium.d.ts.map +1 -0
- package/dist/commands/core/fix-medium.js +29 -0
- package/dist/commands/core/fix-medium.js.map +1 -0
- package/dist/commands/core/fix-rls.d.ts +3 -0
- package/dist/commands/core/fix-rls.d.ts.map +1 -0
- package/dist/commands/core/fix-rls.js +17 -0
- package/dist/commands/core/fix-rls.js.map +1 -0
- package/dist/commands/core/harden.d.ts +3 -0
- package/dist/commands/core/harden.d.ts.map +1 -0
- package/dist/commands/core/harden.js +19 -0
- package/dist/commands/core/harden.js.map +1 -0
- package/dist/commands/core/index.d.ts +3 -0
- package/dist/commands/core/index.d.ts.map +1 -0
- package/dist/commands/core/index.js +21 -0
- package/dist/commands/core/index.js.map +1 -0
- package/dist/commands/core/preflight.d.ts +3 -0
- package/dist/commands/core/preflight.d.ts.map +1 -0
- package/dist/commands/core/preflight.js +50 -0
- package/dist/commands/core/preflight.js.map +1 -0
- package/dist/commands/core/verify.d.ts +3 -0
- package/dist/commands/core/verify.d.ts.map +1 -0
- package/dist/commands/core/verify.js +32 -0
- package/dist/commands/core/verify.js.map +1 -0
- package/dist/commands/index.d.ts +28 -0
- package/dist/commands/index.d.ts.map +1 -0
- package/dist/commands/index.js +37 -0
- package/dist/commands/index.js.map +1 -0
- package/dist/commands/types.d.ts +9 -0
- package/dist/commands/types.d.ts.map +1 -0
- package/dist/commands/types.js +5 -0
- package/dist/commands/types.js.map +1 -0
- package/dist/compliance/cis.d.ts +29 -0
- package/dist/compliance/cis.d.ts.map +1 -0
- package/dist/compliance/cis.js +316 -0
- package/dist/compliance/cis.js.map +1 -0
- package/dist/compliance/frameworks/eu-ai-act.d.ts +55 -0
- package/dist/compliance/frameworks/eu-ai-act.d.ts.map +1 -0
- package/dist/compliance/frameworks/eu-ai-act.js +621 -0
- package/dist/compliance/frameworks/eu-ai-act.js.map +1 -0
- package/dist/compliance/frameworks/index.d.ts +67 -0
- package/dist/compliance/frameworks/index.d.ts.map +1 -0
- package/dist/compliance/frameworks/index.js +97 -0
- package/dist/compliance/frameworks/index.js.map +1 -0
- package/dist/compliance/frameworks/iso-42001.d.ts +59 -0
- package/dist/compliance/frameworks/iso-42001.d.ts.map +1 -0
- package/dist/compliance/frameworks/iso-42001.js +719 -0
- package/dist/compliance/frameworks/iso-42001.js.map +1 -0
- package/dist/compliance/frameworks/mitre-atlas.d.ts +58 -0
- package/dist/compliance/frameworks/mitre-atlas.d.ts.map +1 -0
- package/dist/compliance/frameworks/mitre-atlas.js +686 -0
- package/dist/compliance/frameworks/mitre-atlas.js.map +1 -0
- package/dist/compliance/frameworks/nist-ai-rmf.d.ts +51 -0
- package/dist/compliance/frameworks/nist-ai-rmf.d.ts.map +1 -0
- package/dist/compliance/frameworks/nist-ai-rmf.js +677 -0
- package/dist/compliance/frameworks/nist-ai-rmf.js.map +1 -0
- package/dist/compliance/frameworks/owasp-llm.d.ts +58 -0
- package/dist/compliance/frameworks/owasp-llm.d.ts.map +1 -0
- package/dist/compliance/frameworks/owasp-llm.js +399 -0
- package/dist/compliance/frameworks/owasp-llm.js.map +1 -0
- package/dist/compliance/gdpr.d.ts +34 -0
- package/dist/compliance/gdpr.d.ts.map +1 -0
- package/dist/compliance/gdpr.js +319 -0
- package/dist/compliance/gdpr.js.map +1 -0
- package/dist/compliance/hipaa.d.ts +29 -0
- package/dist/compliance/hipaa.d.ts.map +1 -0
- package/dist/compliance/hipaa.js +205 -0
- package/dist/compliance/hipaa.js.map +1 -0
- package/dist/compliance/index.d.ts +18 -0
- package/dist/compliance/index.d.ts.map +1 -0
- package/dist/compliance/index.js +26 -0
- package/dist/compliance/index.js.map +1 -0
- package/dist/compliance/iso27001.d.ts +30 -0
- package/dist/compliance/iso27001.d.ts.map +1 -0
- package/dist/compliance/iso27001.js +332 -0
- package/dist/compliance/iso27001.js.map +1 -0
- package/dist/compliance/mapper.d.ts +42 -0
- package/dist/compliance/mapper.d.ts.map +1 -0
- package/dist/compliance/mapper.js +269 -0
- package/dist/compliance/mapper.js.map +1 -0
- package/dist/compliance/mapper.test.d.ts +5 -0
- package/dist/compliance/mapper.test.d.ts.map +1 -0
- package/dist/compliance/mapper.test.js +360 -0
- package/dist/compliance/mapper.test.js.map +1 -0
- package/dist/compliance/pci-dss.d.ts +29 -0
- package/dist/compliance/pci-dss.d.ts.map +1 -0
- package/dist/compliance/pci-dss.js +247 -0
- package/dist/compliance/pci-dss.js.map +1 -0
- package/dist/compliance/report.d.ts +25 -0
- package/dist/compliance/report.d.ts.map +1 -0
- package/dist/compliance/report.js +254 -0
- package/dist/compliance/report.js.map +1 -0
- package/dist/compliance/report.test.d.ts +5 -0
- package/dist/compliance/report.test.d.ts.map +1 -0
- package/dist/compliance/report.test.js +128 -0
- package/dist/compliance/report.test.js.map +1 -0
- package/dist/compliance/soc2.d.ts +30 -0
- package/dist/compliance/soc2.d.ts.map +1 -0
- package/dist/compliance/soc2.js +262 -0
- package/dist/compliance/soc2.js.map +1 -0
- package/dist/compliance/soc2.test.d.ts +5 -0
- package/dist/compliance/soc2.test.d.ts.map +1 -0
- package/dist/compliance/soc2.test.js +86 -0
- package/dist/compliance/soc2.test.js.map +1 -0
- package/dist/compliance/types.d.ts +125 -0
- package/dist/compliance/types.d.ts.map +1 -0
- package/dist/compliance/types.js +10 -0
- package/dist/compliance/types.js.map +1 -0
- package/dist/config/flags.d.ts +456 -0
- package/dist/config/flags.d.ts.map +1 -0
- package/dist/config/flags.js +464 -0
- package/dist/config/flags.js.map +1 -0
- package/dist/config/index.d.ts +10 -0
- package/dist/config/index.d.ts.map +1 -0
- package/dist/config/index.js +10 -0
- package/dist/config/index.js.map +1 -0
- package/dist/config/severity-overrides.d.ts +209 -0
- package/dist/config/severity-overrides.d.ts.map +1 -0
- package/dist/config/severity-overrides.js +380 -0
- package/dist/config/severity-overrides.js.map +1 -0
- package/dist/cost/index.d.ts +11 -0
- package/dist/cost/index.d.ts.map +1 -0
- package/dist/cost/index.js +12 -0
- package/dist/cost/index.js.map +1 -0
- package/dist/cost/pricing.d.ts +57 -0
- package/dist/cost/pricing.d.ts.map +1 -0
- package/dist/cost/pricing.js +196 -0
- package/dist/cost/pricing.js.map +1 -0
- package/dist/cost/pricing.test.d.ts +5 -0
- package/dist/cost/pricing.test.d.ts.map +1 -0
- package/dist/cost/pricing.test.js +195 -0
- package/dist/cost/pricing.test.js.map +1 -0
- package/dist/cost/tracker.d.ts +100 -0
- package/dist/cost/tracker.d.ts.map +1 -0
- package/dist/cost/tracker.js +366 -0
- package/dist/cost/tracker.js.map +1 -0
- package/dist/cost/tracker.test.d.ts +5 -0
- package/dist/cost/tracker.test.d.ts.map +1 -0
- package/dist/cost/tracker.test.js +360 -0
- package/dist/cost/tracker.test.js.map +1 -0
- package/dist/cost/types.d.ts +135 -0
- package/dist/cost/types.d.ts.map +1 -0
- package/dist/cost/types.js +9 -0
- package/dist/cost/types.js.map +1 -0
- package/dist/enterprise/auth/oidc.d.ts +231 -0
- package/dist/enterprise/auth/oidc.d.ts.map +1 -0
- package/dist/enterprise/auth/oidc.js +372 -0
- package/dist/enterprise/auth/oidc.js.map +1 -0
- package/dist/enterprise/auth/oidc.test.d.ts +5 -0
- package/dist/enterprise/auth/oidc.test.d.ts.map +1 -0
- package/dist/enterprise/auth/oidc.test.js +435 -0
- package/dist/enterprise/auth/oidc.test.js.map +1 -0
- package/dist/enterprise/index.d.ts +14 -0
- package/dist/enterprise/index.d.ts.map +1 -0
- package/dist/enterprise/index.js +19 -0
- package/dist/enterprise/index.js.map +1 -0
- package/dist/enterprise/integrations/chat.d.ts +205 -0
- package/dist/enterprise/integrations/chat.d.ts.map +1 -0
- package/dist/enterprise/integrations/chat.js +624 -0
- package/dist/enterprise/integrations/chat.js.map +1 -0
- package/dist/enterprise/integrations/chat.test.d.ts +5 -0
- package/dist/enterprise/integrations/chat.test.d.ts.map +1 -0
- package/dist/enterprise/integrations/chat.test.js +557 -0
- package/dist/enterprise/integrations/chat.test.js.map +1 -0
- package/dist/enterprise/integrations/ticketing.d.ts +257 -0
- package/dist/enterprise/integrations/ticketing.d.ts.map +1 -0
- package/dist/enterprise/integrations/ticketing.js +548 -0
- package/dist/enterprise/integrations/ticketing.js.map +1 -0
- package/dist/enterprise/integrations/ticketing.test.d.ts +5 -0
- package/dist/enterprise/integrations/ticketing.test.d.ts.map +1 -0
- package/dist/enterprise/integrations/ticketing.test.js +693 -0
- package/dist/enterprise/integrations/ticketing.test.js.map +1 -0
- package/dist/enterprise/policy/opa.d.ts +194 -0
- package/dist/enterprise/policy/opa.d.ts.map +1 -0
- package/dist/enterprise/policy/opa.js +385 -0
- package/dist/enterprise/policy/opa.js.map +1 -0
- package/dist/enterprise/policy/opa.test.d.ts +5 -0
- package/dist/enterprise/policy/opa.test.d.ts.map +1 -0
- package/dist/enterprise/policy/opa.test.js +702 -0
- package/dist/enterprise/policy/opa.test.js.map +1 -0
- package/dist/enterprise/signing/kms.d.ts +211 -0
- package/dist/enterprise/signing/kms.d.ts.map +1 -0
- package/dist/enterprise/signing/kms.js +480 -0
- package/dist/enterprise/signing/kms.js.map +1 -0
- package/dist/enterprise/signing/kms.test.d.ts +5 -0
- package/dist/enterprise/signing/kms.test.d.ts.map +1 -0
- package/dist/enterprise/signing/kms.test.js +511 -0
- package/dist/enterprise/signing/kms.test.js.map +1 -0
- package/dist/eval/fixtures.d.ts +58 -0
- package/dist/eval/fixtures.d.ts.map +1 -0
- package/dist/eval/fixtures.js +571 -0
- package/dist/eval/fixtures.js.map +1 -0
- package/dist/eval/fixtures.test.d.ts +5 -0
- package/dist/eval/fixtures.test.d.ts.map +1 -0
- package/dist/eval/fixtures.test.js +193 -0
- package/dist/eval/fixtures.test.js.map +1 -0
- package/dist/eval/harness.d.ts +30 -0
- package/dist/eval/harness.d.ts.map +1 -0
- package/dist/eval/harness.js +221 -0
- package/dist/eval/harness.js.map +1 -0
- package/dist/eval/harness.test.d.ts +5 -0
- package/dist/eval/harness.test.d.ts.map +1 -0
- package/dist/eval/harness.test.js +314 -0
- package/dist/eval/harness.test.js.map +1 -0
- package/dist/eval/index.d.ts +15 -0
- package/dist/eval/index.d.ts.map +1 -0
- package/dist/eval/index.js +18 -0
- package/dist/eval/index.js.map +1 -0
- package/dist/eval/metrics.d.ts +56 -0
- package/dist/eval/metrics.d.ts.map +1 -0
- package/dist/eval/metrics.js +298 -0
- package/dist/eval/metrics.js.map +1 -0
- package/dist/eval/metrics.test.d.ts +5 -0
- package/dist/eval/metrics.test.d.ts.map +1 -0
- package/dist/eval/metrics.test.js +426 -0
- package/dist/eval/metrics.test.js.map +1 -0
- package/dist/eval/report.d.ts +30 -0
- package/dist/eval/report.d.ts.map +1 -0
- package/dist/eval/report.js +333 -0
- package/dist/eval/report.js.map +1 -0
- package/dist/eval/report.test.d.ts +5 -0
- package/dist/eval/report.test.d.ts.map +1 -0
- package/dist/eval/report.test.js +275 -0
- package/dist/eval/report.test.js.map +1 -0
- package/dist/eval/types.d.ts +234 -0
- package/dist/eval/types.d.ts.map +1 -0
- package/dist/eval/types.js +27 -0
- package/dist/eval/types.js.map +1 -0
- package/dist/http-server.d.ts +3 -0
- package/dist/http-server.d.ts.map +1 -0
- package/dist/http-server.js +127 -0
- package/dist/http-server.js.map +1 -0
- package/dist/index.d.ts +33 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +4120 -0
- package/dist/index.js.map +1 -0
- package/dist/logger.d.ts +46 -0
- package/dist/logger.d.ts.map +1 -0
- package/dist/logger.js +131 -0
- package/dist/logger.js.map +1 -0
- package/dist/multimodel/consensus.d.ts +49 -0
- package/dist/multimodel/consensus.d.ts.map +1 -0
- package/dist/multimodel/consensus.js +454 -0
- package/dist/multimodel/consensus.js.map +1 -0
- package/dist/multimodel/consensus.test.d.ts +5 -0
- package/dist/multimodel/consensus.test.d.ts.map +1 -0
- package/dist/multimodel/consensus.test.js +415 -0
- package/dist/multimodel/consensus.test.js.map +1 -0
- package/dist/multimodel/index.d.ts +13 -0
- package/dist/multimodel/index.d.ts.map +1 -0
- package/dist/multimodel/index.js +14 -0
- package/dist/multimodel/index.js.map +1 -0
- package/dist/multimodel/runner.d.ts +95 -0
- package/dist/multimodel/runner.d.ts.map +1 -0
- package/dist/multimodel/runner.js +312 -0
- package/dist/multimodel/runner.js.map +1 -0
- package/dist/multimodel/runner.test.d.ts +5 -0
- package/dist/multimodel/runner.test.d.ts.map +1 -0
- package/dist/multimodel/runner.test.js +224 -0
- package/dist/multimodel/runner.test.js.map +1 -0
- package/dist/multimodel/types.d.ts +202 -0
- package/dist/multimodel/types.d.ts.map +1 -0
- package/dist/multimodel/types.js +10 -0
- package/dist/multimodel/types.js.map +1 -0
- package/dist/observability/index.d.ts +9 -0
- package/dist/observability/index.d.ts.map +1 -0
- package/dist/observability/index.js +9 -0
- package/dist/observability/index.js.map +1 -0
- package/dist/observability/otel.d.ts +102 -0
- package/dist/observability/otel.d.ts.map +1 -0
- package/dist/observability/otel.js +284 -0
- package/dist/observability/otel.js.map +1 -0
- package/dist/plugins/index.d.ts +10 -0
- package/dist/plugins/index.d.ts.map +1 -0
- package/dist/plugins/index.js +10 -0
- package/dist/plugins/index.js.map +1 -0
- package/dist/plugins/loader.d.ts +78 -0
- package/dist/plugins/loader.d.ts.map +1 -0
- package/dist/plugins/loader.js +470 -0
- package/dist/plugins/loader.js.map +1 -0
- package/dist/plugins/types.d.ts +304 -0
- package/dist/plugins/types.d.ts.map +1 -0
- package/dist/plugins/types.js +100 -0
- package/dist/plugins/types.js.map +1 -0
- package/dist/sbom/cyclonedx.d.ts +30 -0
- package/dist/sbom/cyclonedx.d.ts.map +1 -0
- package/dist/sbom/cyclonedx.js +392 -0
- package/dist/sbom/cyclonedx.js.map +1 -0
- package/dist/sbom/cyclonedx.test.d.ts +5 -0
- package/dist/sbom/cyclonedx.test.d.ts.map +1 -0
- package/dist/sbom/cyclonedx.test.js +244 -0
- package/dist/sbom/cyclonedx.test.js.map +1 -0
- package/dist/sbom/index.d.ts +13 -0
- package/dist/sbom/index.d.ts.map +1 -0
- package/dist/sbom/index.js +15 -0
- package/dist/sbom/index.js.map +1 -0
- package/dist/sbom/provenance.d.ts +37 -0
- package/dist/sbom/provenance.d.ts.map +1 -0
- package/dist/sbom/provenance.js +268 -0
- package/dist/sbom/provenance.js.map +1 -0
- package/dist/sbom/provenance.test.d.ts +5 -0
- package/dist/sbom/provenance.test.d.ts.map +1 -0
- package/dist/sbom/provenance.test.js +189 -0
- package/dist/sbom/provenance.test.js.map +1 -0
- package/dist/sbom/signing.d.ts +87 -0
- package/dist/sbom/signing.d.ts.map +1 -0
- package/dist/sbom/signing.js +354 -0
- package/dist/sbom/signing.js.map +1 -0
- package/dist/sbom/signing.test.d.ts +5 -0
- package/dist/sbom/signing.test.d.ts.map +1 -0
- package/dist/sbom/signing.test.js +170 -0
- package/dist/sbom/signing.test.js.map +1 -0
- package/dist/sbom/types.d.ts +384 -0
- package/dist/sbom/types.d.ts.map +1 -0
- package/dist/sbom/types.js +17 -0
- package/dist/sbom/types.js.map +1 -0
- package/dist/scanners/agent/credential-scope-audit.d.ts +40 -0
- package/dist/scanners/agent/credential-scope-audit.d.ts.map +1 -0
- package/dist/scanners/agent/credential-scope-audit.js +404 -0
- package/dist/scanners/agent/credential-scope-audit.js.map +1 -0
- package/dist/scanners/agent/exfil-path-graph.d.ts +50 -0
- package/dist/scanners/agent/exfil-path-graph.d.ts.map +1 -0
- package/dist/scanners/agent/exfil-path-graph.js +764 -0
- package/dist/scanners/agent/exfil-path-graph.js.map +1 -0
- package/dist/scanners/agent/index.d.ts +43 -0
- package/dist/scanners/agent/index.d.ts.map +1 -0
- package/dist/scanners/agent/index.js +616 -0
- package/dist/scanners/agent/index.js.map +1 -0
- package/dist/scanners/agent/manifest-audit.d.ts +43 -0
- package/dist/scanners/agent/manifest-audit.d.ts.map +1 -0
- package/dist/scanners/agent/manifest-audit.js +403 -0
- package/dist/scanners/agent/manifest-audit.js.map +1 -0
- package/dist/scanners/agent/payloads/index.d.ts +44 -0
- package/dist/scanners/agent/payloads/index.d.ts.map +1 -0
- package/dist/scanners/agent/payloads/index.js +184 -0
- package/dist/scanners/agent/payloads/index.js.map +1 -0
- package/dist/scanners/agent/permission-minimiser.d.ts +48 -0
- package/dist/scanners/agent/permission-minimiser.d.ts.map +1 -0
- package/dist/scanners/agent/permission-minimiser.js +551 -0
- package/dist/scanners/agent/permission-minimiser.js.map +1 -0
- package/dist/scanners/agent/prompt-injection-fuzzer.d.ts +39 -0
- package/dist/scanners/agent/prompt-injection-fuzzer.d.ts.map +1 -0
- package/dist/scanners/agent/prompt-injection-fuzzer.js +720 -0
- package/dist/scanners/agent/prompt-injection-fuzzer.js.map +1 -0
- package/dist/scanners/agent/sandbox-audit.d.ts +44 -0
- package/dist/scanners/agent/sandbox-audit.d.ts.map +1 -0
- package/dist/scanners/agent/sandbox-audit.js +425 -0
- package/dist/scanners/agent/sandbox-audit.js.map +1 -0
- package/dist/scanners/agent/supply-chain-mcp.d.ts +53 -0
- package/dist/scanners/agent/supply-chain-mcp.d.ts.map +1 -0
- package/dist/scanners/agent/supply-chain-mcp.js +479 -0
- package/dist/scanners/agent/supply-chain-mcp.js.map +1 -0
- package/dist/scanners/agent/tool-description-drift.d.ts +62 -0
- package/dist/scanners/agent/tool-description-drift.d.ts.map +1 -0
- package/dist/scanners/agent/tool-description-drift.js +365 -0
- package/dist/scanners/agent/tool-description-drift.js.map +1 -0
- package/dist/scanners/agent/types.d.ts +840 -0
- package/dist/scanners/agent/types.d.ts.map +1 -0
- package/dist/scanners/agent/types.js +149 -0
- package/dist/scanners/agent/types.js.map +1 -0
- package/dist/scanners/bandit.d.ts +25 -0
- package/dist/scanners/bandit.d.ts.map +1 -0
- package/dist/scanners/bandit.js +129 -0
- package/dist/scanners/bandit.js.map +1 -0
- package/dist/scanners/binary-analysis.d.ts +41 -0
- package/dist/scanners/binary-analysis.d.ts.map +1 -0
- package/dist/scanners/binary-analysis.js +587 -0
- package/dist/scanners/binary-analysis.js.map +1 -0
- package/dist/scanners/binary-analysis.test.d.ts +5 -0
- package/dist/scanners/binary-analysis.test.d.ts.map +1 -0
- package/dist/scanners/binary-analysis.test.js +291 -0
- package/dist/scanners/binary-analysis.test.js.map +1 -0
- package/dist/scanners/brakeman.d.ts +30 -0
- package/dist/scanners/brakeman.d.ts.map +1 -0
- package/dist/scanners/brakeman.js +271 -0
- package/dist/scanners/brakeman.js.map +1 -0
- package/dist/scanners/dependencies.d.ts +22 -0
- package/dist/scanners/dependencies.d.ts.map +1 -0
- package/dist/scanners/dependencies.js +202 -0
- package/dist/scanners/dependencies.js.map +1 -0
- package/dist/scanners/dependencies.test.d.ts +5 -0
- package/dist/scanners/dependencies.test.d.ts.map +1 -0
- package/dist/scanners/dependencies.test.js +185 -0
- package/dist/scanners/dependencies.test.js.map +1 -0
- package/dist/scanners/eslint.d.ts +25 -0
- package/dist/scanners/eslint.d.ts.map +1 -0
- package/dist/scanners/eslint.js +220 -0
- package/dist/scanners/eslint.js.map +1 -0
- package/dist/scanners/gosec.d.ts +25 -0
- package/dist/scanners/gosec.d.ts.map +1 -0
- package/dist/scanners/gosec.js +128 -0
- package/dist/scanners/gosec.js.map +1 -0
- package/dist/scanners/index.d.ts +128 -0
- package/dist/scanners/index.d.ts.map +1 -0
- package/dist/scanners/index.js +811 -0
- package/dist/scanners/index.js.map +1 -0
- package/dist/scanners/index.test.d.ts +5 -0
- package/dist/scanners/index.test.d.ts.map +1 -0
- package/dist/scanners/index.test.js +424 -0
- package/dist/scanners/index.test.js.map +1 -0
- package/dist/scanners/memory-safety.d.ts +44 -0
- package/dist/scanners/memory-safety.d.ts.map +1 -0
- package/dist/scanners/memory-safety.js +571 -0
- package/dist/scanners/memory-safety.js.map +1 -0
- package/dist/scanners/memory-safety.test.d.ts +5 -0
- package/dist/scanners/memory-safety.test.d.ts.map +1 -0
- package/dist/scanners/memory-safety.test.js +321 -0
- package/dist/scanners/memory-safety.test.js.map +1 -0
- package/dist/scanners/race-condition.d.ts +25 -0
- package/dist/scanners/race-condition.d.ts.map +1 -0
- package/dist/scanners/race-condition.js +443 -0
- package/dist/scanners/race-condition.js.map +1 -0
- package/dist/scanners/race-condition.test.d.ts +5 -0
- package/dist/scanners/race-condition.test.d.ts.map +1 -0
- package/dist/scanners/race-condition.test.js +428 -0
- package/dist/scanners/race-condition.test.js.map +1 -0
- package/dist/scanners/secrets.d.ts +25 -0
- package/dist/scanners/secrets.d.ts.map +1 -0
- package/dist/scanners/secrets.js +367 -0
- package/dist/scanners/secrets.js.map +1 -0
- package/dist/scanners/secrets.test.d.ts +5 -0
- package/dist/scanners/secrets.test.d.ts.map +1 -0
- package/dist/scanners/secrets.test.js +160 -0
- package/dist/scanners/secrets.test.js.map +1 -0
- package/dist/scanners/semgrep.d.ts +33 -0
- package/dist/scanners/semgrep.d.ts.map +1 -0
- package/dist/scanners/semgrep.js +350 -0
- package/dist/scanners/semgrep.js.map +1 -0
- package/dist/scanners/semgrep.test.d.ts +8 -0
- package/dist/scanners/semgrep.test.d.ts.map +1 -0
- package/dist/scanners/semgrep.test.js +254 -0
- package/dist/scanners/semgrep.test.js.map +1 -0
- package/dist/scanners/trivy.d.ts +26 -0
- package/dist/scanners/trivy.d.ts.map +1 -0
- package/dist/scanners/trivy.js +187 -0
- package/dist/scanners/trivy.js.map +1 -0
- package/dist/scanners/types.d.ts +210 -0
- package/dist/scanners/types.d.ts.map +1 -0
- package/dist/scanners/types.js +106 -0
- package/dist/scanners/types.js.map +1 -0
- package/dist/scanners/types.test.d.ts +5 -0
- package/dist/scanners/types.test.d.ts.map +1 -0
- package/dist/scanners/types.test.js +103 -0
- package/dist/scanners/types.test.js.map +1 -0
- package/dist/scanners/typescript.d.ts +32 -0
- package/dist/scanners/typescript.d.ts.map +1 -0
- package/dist/scanners/typescript.js +300 -0
- package/dist/scanners/typescript.js.map +1 -0
- package/dist/scanners/typescript.test.d.ts +5 -0
- package/dist/scanners/typescript.test.d.ts.map +1 -0
- package/dist/scanners/typescript.test.js +296 -0
- package/dist/scanners/typescript.test.js.map +1 -0
- package/dist/transcripts/index.d.ts +13 -0
- package/dist/transcripts/index.d.ts.map +1 -0
- package/dist/transcripts/index.js +17 -0
- package/dist/transcripts/index.js.map +1 -0
- package/dist/transcripts/logger.d.ts +190 -0
- package/dist/transcripts/logger.d.ts.map +1 -0
- package/dist/transcripts/logger.js +385 -0
- package/dist/transcripts/logger.js.map +1 -0
- package/dist/transcripts/logger.test.d.ts +5 -0
- package/dist/transcripts/logger.test.d.ts.map +1 -0
- package/dist/transcripts/logger.test.js +227 -0
- package/dist/transcripts/logger.test.js.map +1 -0
- package/dist/transcripts/redaction.d.ts +125 -0
- package/dist/transcripts/redaction.d.ts.map +1 -0
- package/dist/transcripts/redaction.js +416 -0
- package/dist/transcripts/redaction.js.map +1 -0
- package/dist/transcripts/redaction.test.d.ts +5 -0
- package/dist/transcripts/redaction.test.d.ts.map +1 -0
- package/dist/transcripts/redaction.test.js +267 -0
- package/dist/transcripts/redaction.test.js.map +1 -0
- package/dist/transcripts/signing.d.ts +108 -0
- package/dist/transcripts/signing.d.ts.map +1 -0
- package/dist/transcripts/signing.js +173 -0
- package/dist/transcripts/signing.js.map +1 -0
- package/dist/transcripts/verifier.d.ts +133 -0
- package/dist/transcripts/verifier.d.ts.map +1 -0
- package/dist/transcripts/verifier.js +489 -0
- package/dist/transcripts/verifier.js.map +1 -0
- package/dist/transcripts/verifier.test.d.ts +5 -0
- package/dist/transcripts/verifier.test.d.ts.map +1 -0
- package/dist/transcripts/verifier.test.js +330 -0
- package/dist/transcripts/verifier.test.js.map +1 -0
- package/dist/util/concurrency.d.ts +221 -0
- package/dist/util/concurrency.d.ts.map +1 -0
- package/dist/util/concurrency.js +339 -0
- package/dist/util/concurrency.js.map +1 -0
- package/dist/util/index.d.ts +12 -0
- package/dist/util/index.d.ts.map +1 -0
- package/dist/util/index.js +12 -0
- package/dist/util/index.js.map +1 -0
- package/dist/util/json.d.ts +63 -0
- package/dist/util/json.d.ts.map +1 -0
- package/dist/util/json.js +134 -0
- package/dist/util/json.js.map +1 -0
- package/dist/util/paths.d.ts +56 -0
- package/dist/util/paths.d.ts.map +1 -0
- package/dist/util/paths.js +128 -0
- package/dist/util/paths.js.map +1 -0
- package/dist/util/retry.d.ts +185 -0
- package/dist/util/retry.d.ts.map +1 -0
- package/dist/util/retry.js +338 -0
- package/dist/util/retry.js.map +1 -0
- package/package.json +79 -0
|
@@ -0,0 +1,128 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Path Validation Utilities
|
|
3
|
+
*
|
|
4
|
+
* Security-focused path validation to prevent path traversal attacks
|
|
5
|
+
* and ensure paths are within allowed boundaries.
|
|
6
|
+
*
|
|
7
|
+
* @module util/paths
|
|
8
|
+
*/
|
|
9
|
+
import { stat, lstat, realpath } from "fs/promises";
|
|
10
|
+
import path from "path";
|
|
11
|
+
/**
|
|
12
|
+
* Error thrown when path validation fails
|
|
13
|
+
*/
|
|
14
|
+
export class PathValidationError extends Error {
|
|
15
|
+
path;
|
|
16
|
+
reason;
|
|
17
|
+
constructor(message, path, reason) {
|
|
18
|
+
super(message);
|
|
19
|
+
this.path = path;
|
|
20
|
+
this.reason = reason;
|
|
21
|
+
this.name = "PathValidationError";
|
|
22
|
+
}
|
|
23
|
+
}
|
|
24
|
+
/**
|
|
25
|
+
* Validate a project path for security
|
|
26
|
+
*
|
|
27
|
+
* Checks:
|
|
28
|
+
* 1. Path is absolute after resolution
|
|
29
|
+
* 2. Path exists on the filesystem
|
|
30
|
+
* 3. Path is a directory (optional)
|
|
31
|
+
* 4. Symlinks are resolved and checked (optional)
|
|
32
|
+
* 5. Path doesn't escape base directory (optional)
|
|
33
|
+
*
|
|
34
|
+
* @param projectPath - The path to validate
|
|
35
|
+
* @param options - Validation options
|
|
36
|
+
* @returns The validated, resolved absolute path
|
|
37
|
+
* @throws PathValidationError if validation fails
|
|
38
|
+
*/
|
|
39
|
+
export async function validateProjectPath(projectPath, options = {}) {
|
|
40
|
+
const { requireDirectory = true, allowSymlinks = false, basePath } = options;
|
|
41
|
+
// Resolve to absolute path
|
|
42
|
+
const resolvedPath = path.resolve(projectPath);
|
|
43
|
+
// Check for path traversal attempts
|
|
44
|
+
if (projectPath.includes("..") && !path.isAbsolute(projectPath)) {
|
|
45
|
+
// Verify the resolved path doesn't escape intended boundaries
|
|
46
|
+
const normalizedInput = path.normalize(projectPath);
|
|
47
|
+
if (normalizedInput.startsWith("..")) {
|
|
48
|
+
throw new PathValidationError(`Path traversal detected: ${projectPath}`, projectPath, "path_traversal");
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
try {
|
|
52
|
+
// Check if path exists (using lstat to detect symlinks)
|
|
53
|
+
const lstats = await lstat(resolvedPath);
|
|
54
|
+
// Handle symlinks
|
|
55
|
+
if (lstats.isSymbolicLink()) {
|
|
56
|
+
if (!allowSymlinks) {
|
|
57
|
+
// Resolve the symlink and verify it doesn't escape
|
|
58
|
+
const realPath = await realpath(resolvedPath);
|
|
59
|
+
// If basePath is specified, ensure symlink target is within it
|
|
60
|
+
if (basePath) {
|
|
61
|
+
const resolvedBase = path.resolve(basePath);
|
|
62
|
+
if (!realPath.startsWith(resolvedBase)) {
|
|
63
|
+
throw new PathValidationError(`Symlink escapes base directory: ${projectPath} -> ${realPath}`, projectPath, "symlink_escape");
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
// Use the real path
|
|
67
|
+
const realStats = await stat(realPath);
|
|
68
|
+
if (requireDirectory && !realStats.isDirectory()) {
|
|
69
|
+
throw new PathValidationError(`Path is not a directory: ${projectPath}`, projectPath, "not_directory");
|
|
70
|
+
}
|
|
71
|
+
return realPath;
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
// Check if it's a directory (if required)
|
|
75
|
+
if (requireDirectory && !lstats.isDirectory()) {
|
|
76
|
+
throw new PathValidationError(`Path is not a directory: ${projectPath}`, projectPath, "not_directory");
|
|
77
|
+
}
|
|
78
|
+
// If basePath is specified, ensure the path is within it
|
|
79
|
+
if (basePath) {
|
|
80
|
+
const resolvedBase = path.resolve(basePath);
|
|
81
|
+
if (!resolvedPath.startsWith(resolvedBase)) {
|
|
82
|
+
throw new PathValidationError(`Path is outside base directory: ${projectPath}`, projectPath, "path_traversal");
|
|
83
|
+
}
|
|
84
|
+
}
|
|
85
|
+
return resolvedPath;
|
|
86
|
+
}
|
|
87
|
+
catch (error) {
|
|
88
|
+
if (error instanceof PathValidationError) {
|
|
89
|
+
throw error;
|
|
90
|
+
}
|
|
91
|
+
// Handle ENOENT (file not found)
|
|
92
|
+
if (error.code === "ENOENT") {
|
|
93
|
+
throw new PathValidationError(`Path does not exist: ${projectPath}`, projectPath, "not_found");
|
|
94
|
+
}
|
|
95
|
+
// Re-throw other errors
|
|
96
|
+
throw new PathValidationError(`Invalid path: ${projectPath} - ${error.message}`, projectPath, "invalid_path");
|
|
97
|
+
}
|
|
98
|
+
}
|
|
99
|
+
/**
|
|
100
|
+
* Validate a file path (not requiring directory)
|
|
101
|
+
*/
|
|
102
|
+
export async function validateFilePath(filePath, options = {}) {
|
|
103
|
+
return validateProjectPath(filePath, { ...options, requireDirectory: false });
|
|
104
|
+
}
|
|
105
|
+
/**
|
|
106
|
+
* Check if a path is safe (doesn't throw, returns boolean)
|
|
107
|
+
*/
|
|
108
|
+
export async function isPathSafe(projectPath, options = {}) {
|
|
109
|
+
try {
|
|
110
|
+
await validateProjectPath(projectPath, options);
|
|
111
|
+
return true;
|
|
112
|
+
}
|
|
113
|
+
catch {
|
|
114
|
+
return false;
|
|
115
|
+
}
|
|
116
|
+
}
|
|
117
|
+
/**
|
|
118
|
+
* Sanitize a path for use in error messages (remove sensitive info)
|
|
119
|
+
*/
|
|
120
|
+
export function sanitizePathForLogging(inputPath) {
|
|
121
|
+
// Remove home directory prefix if present
|
|
122
|
+
const homeDir = process.env.HOME || process.env.USERPROFILE || "";
|
|
123
|
+
if (homeDir && inputPath.startsWith(homeDir)) {
|
|
124
|
+
return "~" + inputPath.slice(homeDir.length);
|
|
125
|
+
}
|
|
126
|
+
return inputPath;
|
|
127
|
+
}
|
|
128
|
+
//# sourceMappingURL=paths.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"paths.js","sourceRoot":"","sources":["../../src/util/paths.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,185 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Retry and Circuit Breaker Utilities
|
|
3
|
+
*
|
|
4
|
+
* Provides retry logic with exponential backoff and circuit breaker pattern
|
|
5
|
+
* for handling transient failures in scanner and LLM operations.
|
|
6
|
+
*
|
|
7
|
+
* @module util/retry
|
|
8
|
+
*/
|
|
9
|
+
/**
|
|
10
|
+
* Error classification for retry decisions
|
|
11
|
+
*/
|
|
12
|
+
export type ErrorType = "transient" | "permanent" | "unknown";
|
|
13
|
+
/**
|
|
14
|
+
* Circuit breaker state
|
|
15
|
+
*/
|
|
16
|
+
export type CircuitState = "closed" | "open" | "half-open";
|
|
17
|
+
/**
|
|
18
|
+
* Options for retry behavior
|
|
19
|
+
*/
|
|
20
|
+
export interface RetryOptions {
|
|
21
|
+
/** Maximum number of retry attempts (default: 3) */
|
|
22
|
+
maxAttempts?: number;
|
|
23
|
+
/** Initial delay in ms before first retry (default: 1000) */
|
|
24
|
+
initialDelayMs?: number;
|
|
25
|
+
/** Maximum delay in ms between retries (default: 30000) */
|
|
26
|
+
maxDelayMs?: number;
|
|
27
|
+
/** Multiplier for exponential backoff (default: 2) */
|
|
28
|
+
backoffMultiplier?: number;
|
|
29
|
+
/** Add jitter to delays to prevent thundering herd (default: true) */
|
|
30
|
+
jitter?: boolean;
|
|
31
|
+
/** Timeout for each attempt in ms (optional) */
|
|
32
|
+
attemptTimeoutMs?: number;
|
|
33
|
+
/** Custom error classifier (default: classifyError) */
|
|
34
|
+
classifyError?: (error: Error) => ErrorType;
|
|
35
|
+
/** Callback for retry attempts */
|
|
36
|
+
onRetry?: (attempt: number, error: Error, delayMs: number) => void;
|
|
37
|
+
}
|
|
38
|
+
/**
|
|
39
|
+
* Circuit breaker options
|
|
40
|
+
*/
|
|
41
|
+
export interface CircuitBreakerOptions {
|
|
42
|
+
/** Number of failures before opening circuit (default: 5) */
|
|
43
|
+
failureThreshold?: number;
|
|
44
|
+
/** Time in ms before attempting to close circuit (default: 30000) */
|
|
45
|
+
resetTimeoutMs?: number;
|
|
46
|
+
/** Number of successes in half-open state to close circuit (default: 2) */
|
|
47
|
+
successThreshold?: number;
|
|
48
|
+
/** Callback when circuit state changes */
|
|
49
|
+
onStateChange?: (from: CircuitState, to: CircuitState) => void;
|
|
50
|
+
}
|
|
51
|
+
/**
|
|
52
|
+
* Classify an error as transient or permanent
|
|
53
|
+
*
|
|
54
|
+
* Transient errors (should retry):
|
|
55
|
+
* - Timeout errors (ETIMEDOUT, ESOCKETTIMEDOUT)
|
|
56
|
+
* - Rate limiting (429)
|
|
57
|
+
* - Server errors (5xx)
|
|
58
|
+
* - Network errors (ECONNRESET, ECONNREFUSED, ENOTFOUND)
|
|
59
|
+
*
|
|
60
|
+
* Permanent errors (should not retry):
|
|
61
|
+
* - File not found (ENOENT)
|
|
62
|
+
* - Permission denied (EACCES, EPERM)
|
|
63
|
+
* - Invalid input (4xx except 429)
|
|
64
|
+
* - Authentication errors (401, 403)
|
|
65
|
+
*/
|
|
66
|
+
export declare function classifyError(error: Error): ErrorType;
|
|
67
|
+
/**
|
|
68
|
+
* Retry error thrown when all attempts fail
|
|
69
|
+
*/
|
|
70
|
+
export declare class RetryError extends Error {
|
|
71
|
+
readonly attempts: number;
|
|
72
|
+
readonly lastError: Error;
|
|
73
|
+
readonly errors: Error[];
|
|
74
|
+
constructor(message: string, attempts: number, lastError: Error, errors: Error[]);
|
|
75
|
+
}
|
|
76
|
+
/**
|
|
77
|
+
* Circuit breaker error thrown when circuit is open
|
|
78
|
+
*/
|
|
79
|
+
export declare class CircuitOpenError extends Error {
|
|
80
|
+
readonly circuitName: string;
|
|
81
|
+
readonly openedAt: Date;
|
|
82
|
+
readonly resetAt: Date;
|
|
83
|
+
constructor(circuitName: string, openedAt: Date, resetAt: Date);
|
|
84
|
+
}
|
|
85
|
+
/**
|
|
86
|
+
* Execute a function with retry logic
|
|
87
|
+
*
|
|
88
|
+
* @param fn - The async function to execute
|
|
89
|
+
* @param options - Retry options
|
|
90
|
+
* @returns The result of the function
|
|
91
|
+
* @throws RetryError if all attempts fail
|
|
92
|
+
*
|
|
93
|
+
* @example
|
|
94
|
+
* ```typescript
|
|
95
|
+
* const result = await withRetry(
|
|
96
|
+
* () => fetchData(),
|
|
97
|
+
* { maxAttempts: 3, onRetry: (attempt, err) => console.log(`Retry ${attempt}: ${err.message}`) }
|
|
98
|
+
* );
|
|
99
|
+
* ```
|
|
100
|
+
*/
|
|
101
|
+
export declare function withRetry<T>(fn: () => Promise<T>, options?: RetryOptions): Promise<T>;
|
|
102
|
+
/**
|
|
103
|
+
* Circuit breaker implementation
|
|
104
|
+
*
|
|
105
|
+
* States:
|
|
106
|
+
* - CLOSED: Normal operation, requests pass through
|
|
107
|
+
* - OPEN: Circuit tripped, requests fail fast
|
|
108
|
+
* - HALF-OPEN: Testing if service recovered
|
|
109
|
+
*/
|
|
110
|
+
export declare class CircuitBreaker {
|
|
111
|
+
private state;
|
|
112
|
+
private failures;
|
|
113
|
+
private successes;
|
|
114
|
+
private lastFailureTime;
|
|
115
|
+
private readonly name;
|
|
116
|
+
private readonly failureThreshold;
|
|
117
|
+
private readonly resetTimeoutMs;
|
|
118
|
+
private readonly successThreshold;
|
|
119
|
+
private readonly onStateChange?;
|
|
120
|
+
constructor(name: string, options?: CircuitBreakerOptions);
|
|
121
|
+
/**
|
|
122
|
+
* Get the current circuit state
|
|
123
|
+
*/
|
|
124
|
+
getState(): CircuitState;
|
|
125
|
+
/**
|
|
126
|
+
* Check if the circuit allows requests
|
|
127
|
+
*/
|
|
128
|
+
canExecute(): boolean;
|
|
129
|
+
/**
|
|
130
|
+
* Execute a function through the circuit breaker
|
|
131
|
+
*
|
|
132
|
+
* @param fn - The async function to execute
|
|
133
|
+
* @returns The result of the function
|
|
134
|
+
* @throws CircuitOpenError if circuit is open
|
|
135
|
+
*/
|
|
136
|
+
execute<T>(fn: () => Promise<T>): Promise<T>;
|
|
137
|
+
/**
|
|
138
|
+
* Record a successful execution
|
|
139
|
+
*/
|
|
140
|
+
private onSuccess;
|
|
141
|
+
/**
|
|
142
|
+
* Record a failed execution
|
|
143
|
+
*/
|
|
144
|
+
private onFailure;
|
|
145
|
+
/**
|
|
146
|
+
* Transition to a new state
|
|
147
|
+
*/
|
|
148
|
+
private transition;
|
|
149
|
+
/**
|
|
150
|
+
* Reset the circuit breaker
|
|
151
|
+
*/
|
|
152
|
+
private reset;
|
|
153
|
+
/**
|
|
154
|
+
* Force the circuit to a specific state (for testing)
|
|
155
|
+
*/
|
|
156
|
+
forceState(state: CircuitState): void;
|
|
157
|
+
/**
|
|
158
|
+
* Get circuit breaker stats
|
|
159
|
+
*/
|
|
160
|
+
getStats(): {
|
|
161
|
+
name: string;
|
|
162
|
+
state: CircuitState;
|
|
163
|
+
failures: number;
|
|
164
|
+
successes: number;
|
|
165
|
+
lastFailureTime: Date | null;
|
|
166
|
+
};
|
|
167
|
+
}
|
|
168
|
+
/**
|
|
169
|
+
* Execute a function with both retry and circuit breaker
|
|
170
|
+
*
|
|
171
|
+
* @param circuitBreaker - The circuit breaker instance
|
|
172
|
+
* @param fn - The async function to execute
|
|
173
|
+
* @param retryOptions - Retry options
|
|
174
|
+
* @returns The result of the function
|
|
175
|
+
*/
|
|
176
|
+
export declare function withRetryAndCircuitBreaker<T>(circuitBreaker: CircuitBreaker, fn: () => Promise<T>, retryOptions?: RetryOptions): Promise<T>;
|
|
177
|
+
/**
|
|
178
|
+
* Create a retry wrapper for a function
|
|
179
|
+
*
|
|
180
|
+
* @param fn - The async function to wrap
|
|
181
|
+
* @param options - Retry options
|
|
182
|
+
* @returns A wrapped function that retries on failure
|
|
183
|
+
*/
|
|
184
|
+
export declare function createRetryWrapper<TArgs extends unknown[], TResult>(fn: (...args: TArgs) => Promise<TResult>, options?: RetryOptions): (...args: TArgs) => Promise<TResult>;
|
|
185
|
+
//# sourceMappingURL=retry.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"retry.d.ts","sourceRoot":"","sources":["../../src/util/retry.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,338 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Retry and Circuit Breaker Utilities
|
|
3
|
+
*
|
|
4
|
+
* Provides retry logic with exponential backoff and circuit breaker pattern
|
|
5
|
+
* for handling transient failures in scanner and LLM operations.
|
|
6
|
+
*
|
|
7
|
+
* @module util/retry
|
|
8
|
+
*/
|
|
9
|
+
/**
|
|
10
|
+
* Classify an error as transient or permanent
|
|
11
|
+
*
|
|
12
|
+
* Transient errors (should retry):
|
|
13
|
+
* - Timeout errors (ETIMEDOUT, ESOCKETTIMEDOUT)
|
|
14
|
+
* - Rate limiting (429)
|
|
15
|
+
* - Server errors (5xx)
|
|
16
|
+
* - Network errors (ECONNRESET, ECONNREFUSED, ENOTFOUND)
|
|
17
|
+
*
|
|
18
|
+
* Permanent errors (should not retry):
|
|
19
|
+
* - File not found (ENOENT)
|
|
20
|
+
* - Permission denied (EACCES, EPERM)
|
|
21
|
+
* - Invalid input (4xx except 429)
|
|
22
|
+
* - Authentication errors (401, 403)
|
|
23
|
+
*/
|
|
24
|
+
export function classifyError(error) {
|
|
25
|
+
const message = error.message.toLowerCase();
|
|
26
|
+
const code = error.code;
|
|
27
|
+
// Check for transient errors
|
|
28
|
+
if (code === "ETIMEDOUT" ||
|
|
29
|
+
code === "ESOCKETTIMEDOUT" ||
|
|
30
|
+
code === "ECONNRESET" ||
|
|
31
|
+
code === "ECONNREFUSED" ||
|
|
32
|
+
code === "ENOTFOUND" ||
|
|
33
|
+
code === "ENETUNREACH" ||
|
|
34
|
+
code === "EAI_AGAIN") {
|
|
35
|
+
return "transient";
|
|
36
|
+
}
|
|
37
|
+
// Check for permanent errors
|
|
38
|
+
if (code === "ENOENT" || code === "EACCES" || code === "EPERM" || code === "EEXIST") {
|
|
39
|
+
return "permanent";
|
|
40
|
+
}
|
|
41
|
+
// Check message for HTTP status codes
|
|
42
|
+
if (message.includes("429") || message.includes("rate limit")) {
|
|
43
|
+
return "transient";
|
|
44
|
+
}
|
|
45
|
+
if (message.includes("500") ||
|
|
46
|
+
message.includes("502") ||
|
|
47
|
+
message.includes("503") ||
|
|
48
|
+
message.includes("504") ||
|
|
49
|
+
message.includes("internal server error") ||
|
|
50
|
+
message.includes("bad gateway") ||
|
|
51
|
+
message.includes("service unavailable") ||
|
|
52
|
+
message.includes("gateway timeout")) {
|
|
53
|
+
return "transient";
|
|
54
|
+
}
|
|
55
|
+
if (message.includes("401") ||
|
|
56
|
+
message.includes("403") ||
|
|
57
|
+
message.includes("404") ||
|
|
58
|
+
message.includes("unauthorized") ||
|
|
59
|
+
message.includes("forbidden") ||
|
|
60
|
+
message.includes("not found")) {
|
|
61
|
+
return "permanent";
|
|
62
|
+
}
|
|
63
|
+
// Check for timeout in message
|
|
64
|
+
if (message.includes("timeout") || message.includes("timed out")) {
|
|
65
|
+
return "transient";
|
|
66
|
+
}
|
|
67
|
+
return "unknown";
|
|
68
|
+
}
|
|
69
|
+
/**
|
|
70
|
+
* Calculate delay with exponential backoff and optional jitter
|
|
71
|
+
*/
|
|
72
|
+
function calculateDelay(attempt, initialDelayMs, maxDelayMs, backoffMultiplier, jitter) {
|
|
73
|
+
// Exponential backoff: initialDelay * multiplier^(attempt-1)
|
|
74
|
+
let delay = initialDelayMs * Math.pow(backoffMultiplier, attempt - 1);
|
|
75
|
+
// Cap at max delay
|
|
76
|
+
delay = Math.min(delay, maxDelayMs);
|
|
77
|
+
// Add jitter (±25%)
|
|
78
|
+
if (jitter) {
|
|
79
|
+
const jitterRange = delay * 0.25;
|
|
80
|
+
delay = delay + (Math.random() * 2 - 1) * jitterRange;
|
|
81
|
+
}
|
|
82
|
+
return Math.round(delay);
|
|
83
|
+
}
|
|
84
|
+
/**
|
|
85
|
+
* Sleep for a given number of milliseconds
|
|
86
|
+
*/
|
|
87
|
+
function sleep(ms) {
|
|
88
|
+
return new Promise((resolve) => setTimeout(resolve, ms));
|
|
89
|
+
}
|
|
90
|
+
/**
|
|
91
|
+
* Retry error thrown when all attempts fail
|
|
92
|
+
*/
|
|
93
|
+
export class RetryError extends Error {
|
|
94
|
+
attempts;
|
|
95
|
+
lastError;
|
|
96
|
+
errors;
|
|
97
|
+
constructor(message, attempts, lastError, errors) {
|
|
98
|
+
super(message);
|
|
99
|
+
this.attempts = attempts;
|
|
100
|
+
this.lastError = lastError;
|
|
101
|
+
this.errors = errors;
|
|
102
|
+
this.name = "RetryError";
|
|
103
|
+
}
|
|
104
|
+
}
|
|
105
|
+
/**
|
|
106
|
+
* Circuit breaker error thrown when circuit is open
|
|
107
|
+
*/
|
|
108
|
+
export class CircuitOpenError extends Error {
|
|
109
|
+
circuitName;
|
|
110
|
+
openedAt;
|
|
111
|
+
resetAt;
|
|
112
|
+
constructor(circuitName, openedAt, resetAt) {
|
|
113
|
+
super(`Circuit '${circuitName}' is open. Will reset at ${resetAt.toISOString()}`);
|
|
114
|
+
this.circuitName = circuitName;
|
|
115
|
+
this.openedAt = openedAt;
|
|
116
|
+
this.resetAt = resetAt;
|
|
117
|
+
this.name = "CircuitOpenError";
|
|
118
|
+
}
|
|
119
|
+
}
|
|
120
|
+
/**
|
|
121
|
+
* Execute a function with retry logic
|
|
122
|
+
*
|
|
123
|
+
* @param fn - The async function to execute
|
|
124
|
+
* @param options - Retry options
|
|
125
|
+
* @returns The result of the function
|
|
126
|
+
* @throws RetryError if all attempts fail
|
|
127
|
+
*
|
|
128
|
+
* @example
|
|
129
|
+
* ```typescript
|
|
130
|
+
* const result = await withRetry(
|
|
131
|
+
* () => fetchData(),
|
|
132
|
+
* { maxAttempts: 3, onRetry: (attempt, err) => console.log(`Retry ${attempt}: ${err.message}`) }
|
|
133
|
+
* );
|
|
134
|
+
* ```
|
|
135
|
+
*/
|
|
136
|
+
export async function withRetry(fn, options = {}) {
|
|
137
|
+
const { maxAttempts = 3, initialDelayMs = 1000, maxDelayMs = 30000, backoffMultiplier = 2, jitter = true, attemptTimeoutMs, classifyError: classifier = classifyError, onRetry, } = options;
|
|
138
|
+
const errors = [];
|
|
139
|
+
for (let attempt = 1; attempt <= maxAttempts; attempt++) {
|
|
140
|
+
try {
|
|
141
|
+
// Wrap with timeout if specified
|
|
142
|
+
if (attemptTimeoutMs) {
|
|
143
|
+
return await Promise.race([
|
|
144
|
+
fn(),
|
|
145
|
+
new Promise((_, reject) => setTimeout(() => reject(new Error(`Attempt ${attempt} timed out after ${attemptTimeoutMs}ms`)), attemptTimeoutMs)),
|
|
146
|
+
]);
|
|
147
|
+
}
|
|
148
|
+
return await fn();
|
|
149
|
+
}
|
|
150
|
+
catch (error) {
|
|
151
|
+
const err = error;
|
|
152
|
+
errors.push(err);
|
|
153
|
+
// Check if this is the last attempt
|
|
154
|
+
if (attempt >= maxAttempts) {
|
|
155
|
+
throw new RetryError(`All ${maxAttempts} attempts failed. Last error: ${err.message}`, attempt, err, errors);
|
|
156
|
+
}
|
|
157
|
+
// Classify the error
|
|
158
|
+
const errorType = classifier(err);
|
|
159
|
+
// Don't retry permanent errors
|
|
160
|
+
if (errorType === "permanent") {
|
|
161
|
+
throw new RetryError(`Permanent error after ${attempt} attempt(s): ${err.message}`, attempt, err, errors);
|
|
162
|
+
}
|
|
163
|
+
// Calculate delay for next attempt
|
|
164
|
+
const delayMs = calculateDelay(attempt, initialDelayMs, maxDelayMs, backoffMultiplier, jitter);
|
|
165
|
+
// Notify about retry
|
|
166
|
+
if (onRetry) {
|
|
167
|
+
onRetry(attempt, err, delayMs);
|
|
168
|
+
}
|
|
169
|
+
// Wait before retrying
|
|
170
|
+
await sleep(delayMs);
|
|
171
|
+
}
|
|
172
|
+
}
|
|
173
|
+
// This should never be reached, but TypeScript needs it
|
|
174
|
+
throw new Error("Unexpected retry loop exit");
|
|
175
|
+
}
|
|
176
|
+
/**
|
|
177
|
+
* Circuit breaker implementation
|
|
178
|
+
*
|
|
179
|
+
* States:
|
|
180
|
+
* - CLOSED: Normal operation, requests pass through
|
|
181
|
+
* - OPEN: Circuit tripped, requests fail fast
|
|
182
|
+
* - HALF-OPEN: Testing if service recovered
|
|
183
|
+
*/
|
|
184
|
+
export class CircuitBreaker {
|
|
185
|
+
state = "closed";
|
|
186
|
+
failures = 0;
|
|
187
|
+
successes = 0;
|
|
188
|
+
lastFailureTime = null;
|
|
189
|
+
name;
|
|
190
|
+
failureThreshold;
|
|
191
|
+
resetTimeoutMs;
|
|
192
|
+
successThreshold;
|
|
193
|
+
onStateChange;
|
|
194
|
+
constructor(name, options = {}) {
|
|
195
|
+
this.name = name;
|
|
196
|
+
this.failureThreshold = options.failureThreshold ?? 5;
|
|
197
|
+
this.resetTimeoutMs = options.resetTimeoutMs ?? 30000;
|
|
198
|
+
this.successThreshold = options.successThreshold ?? 2;
|
|
199
|
+
this.onStateChange = options.onStateChange;
|
|
200
|
+
}
|
|
201
|
+
/**
|
|
202
|
+
* Get the current circuit state
|
|
203
|
+
*/
|
|
204
|
+
getState() {
|
|
205
|
+
// Check if we should transition from open to half-open
|
|
206
|
+
if (this.state === "open" && this.lastFailureTime) {
|
|
207
|
+
const elapsed = Date.now() - this.lastFailureTime.getTime();
|
|
208
|
+
if (elapsed >= this.resetTimeoutMs) {
|
|
209
|
+
this.transition("half-open");
|
|
210
|
+
}
|
|
211
|
+
}
|
|
212
|
+
return this.state;
|
|
213
|
+
}
|
|
214
|
+
/**
|
|
215
|
+
* Check if the circuit allows requests
|
|
216
|
+
*/
|
|
217
|
+
canExecute() {
|
|
218
|
+
const state = this.getState();
|
|
219
|
+
return state === "closed" || state === "half-open";
|
|
220
|
+
}
|
|
221
|
+
/**
|
|
222
|
+
* Execute a function through the circuit breaker
|
|
223
|
+
*
|
|
224
|
+
* @param fn - The async function to execute
|
|
225
|
+
* @returns The result of the function
|
|
226
|
+
* @throws CircuitOpenError if circuit is open
|
|
227
|
+
*/
|
|
228
|
+
async execute(fn) {
|
|
229
|
+
const state = this.getState();
|
|
230
|
+
if (state === "open") {
|
|
231
|
+
const resetAt = new Date(this.lastFailureTime.getTime() + this.resetTimeoutMs);
|
|
232
|
+
throw new CircuitOpenError(this.name, this.lastFailureTime, resetAt);
|
|
233
|
+
}
|
|
234
|
+
try {
|
|
235
|
+
const result = await fn();
|
|
236
|
+
this.onSuccess();
|
|
237
|
+
return result;
|
|
238
|
+
}
|
|
239
|
+
catch (error) {
|
|
240
|
+
this.onFailure();
|
|
241
|
+
throw error;
|
|
242
|
+
}
|
|
243
|
+
}
|
|
244
|
+
/**
|
|
245
|
+
* Record a successful execution
|
|
246
|
+
*/
|
|
247
|
+
onSuccess() {
|
|
248
|
+
if (this.state === "half-open") {
|
|
249
|
+
this.successes++;
|
|
250
|
+
if (this.successes >= this.successThreshold) {
|
|
251
|
+
this.transition("closed");
|
|
252
|
+
this.reset();
|
|
253
|
+
}
|
|
254
|
+
}
|
|
255
|
+
else {
|
|
256
|
+
// Reset failure count on success in closed state
|
|
257
|
+
this.failures = 0;
|
|
258
|
+
}
|
|
259
|
+
}
|
|
260
|
+
/**
|
|
261
|
+
* Record a failed execution
|
|
262
|
+
*/
|
|
263
|
+
onFailure() {
|
|
264
|
+
this.failures++;
|
|
265
|
+
this.lastFailureTime = new Date();
|
|
266
|
+
if (this.state === "half-open") {
|
|
267
|
+
// Any failure in half-open goes back to open
|
|
268
|
+
this.transition("open");
|
|
269
|
+
this.successes = 0;
|
|
270
|
+
}
|
|
271
|
+
else if (this.state === "closed" && this.failures >= this.failureThreshold) {
|
|
272
|
+
this.transition("open");
|
|
273
|
+
}
|
|
274
|
+
}
|
|
275
|
+
/**
|
|
276
|
+
* Transition to a new state
|
|
277
|
+
*/
|
|
278
|
+
transition(newState) {
|
|
279
|
+
if (this.state !== newState) {
|
|
280
|
+
const oldState = this.state;
|
|
281
|
+
this.state = newState;
|
|
282
|
+
if (this.onStateChange) {
|
|
283
|
+
this.onStateChange(oldState, newState);
|
|
284
|
+
}
|
|
285
|
+
}
|
|
286
|
+
}
|
|
287
|
+
/**
|
|
288
|
+
* Reset the circuit breaker
|
|
289
|
+
*/
|
|
290
|
+
reset() {
|
|
291
|
+
this.failures = 0;
|
|
292
|
+
this.successes = 0;
|
|
293
|
+
this.lastFailureTime = null;
|
|
294
|
+
}
|
|
295
|
+
/**
|
|
296
|
+
* Force the circuit to a specific state (for testing)
|
|
297
|
+
*/
|
|
298
|
+
forceState(state) {
|
|
299
|
+
this.transition(state);
|
|
300
|
+
if (state === "closed") {
|
|
301
|
+
this.reset();
|
|
302
|
+
}
|
|
303
|
+
}
|
|
304
|
+
/**
|
|
305
|
+
* Get circuit breaker stats
|
|
306
|
+
*/
|
|
307
|
+
getStats() {
|
|
308
|
+
return {
|
|
309
|
+
name: this.name,
|
|
310
|
+
state: this.getState(),
|
|
311
|
+
failures: this.failures,
|
|
312
|
+
successes: this.successes,
|
|
313
|
+
lastFailureTime: this.lastFailureTime,
|
|
314
|
+
};
|
|
315
|
+
}
|
|
316
|
+
}
|
|
317
|
+
/**
|
|
318
|
+
* Execute a function with both retry and circuit breaker
|
|
319
|
+
*
|
|
320
|
+
* @param circuitBreaker - The circuit breaker instance
|
|
321
|
+
* @param fn - The async function to execute
|
|
322
|
+
* @param retryOptions - Retry options
|
|
323
|
+
* @returns The result of the function
|
|
324
|
+
*/
|
|
325
|
+
export async function withRetryAndCircuitBreaker(circuitBreaker, fn, retryOptions = {}) {
|
|
326
|
+
return circuitBreaker.execute(() => withRetry(fn, retryOptions));
|
|
327
|
+
}
|
|
328
|
+
/**
|
|
329
|
+
* Create a retry wrapper for a function
|
|
330
|
+
*
|
|
331
|
+
* @param fn - The async function to wrap
|
|
332
|
+
* @param options - Retry options
|
|
333
|
+
* @returns A wrapped function that retries on failure
|
|
334
|
+
*/
|
|
335
|
+
export function createRetryWrapper(fn, options = {}) {
|
|
336
|
+
return (...args) => withRetry(() => fn(...args), options);
|
|
337
|
+
}
|
|
338
|
+
//# sourceMappingURL=retry.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"retry.js","sourceRoot":"","sources":["../../src/util/retry.ts"],"names":[],"mappings":"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"}
|