autoremediator 0.19.0 → 0.20.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/dist/api/change-request/index.d.ts.map +1 -1
- package/dist/api/options-schema.d.ts.map +1 -1
- package/dist/api/patches/reconcile.d.ts.map +1 -1
- package/dist/api/scan-execution.d.ts.map +1 -1
- package/dist/api/vex/index.d.ts +6 -2
- package/dist/api/vex/index.d.ts.map +1 -1
- package/dist/{chunk-7BORIBPY.js → chunk-ZGLGT4XQ.js} +2589 -885
- package/dist/cli/program.d.ts.map +1 -1
- package/dist/cli/runners.d.ts.map +1 -1
- package/dist/cli/triage.d.ts +9 -1
- package/dist/cli/triage.d.ts.map +1 -1
- package/dist/cli/types.d.ts.map +1 -1
- package/dist/cli.js +74 -33
- package/dist/index.js +2464 -882
- package/dist/index.js.map +1 -1
- package/dist/intelligence/snapshot.d.ts +2 -0
- package/dist/intelligence/snapshot.d.ts.map +1 -0
- package/dist/intelligence/sources/registry.d.ts +1 -0
- package/dist/intelligence/sources/registry.d.ts.map +1 -1
- package/dist/intelligence/sources/snapshot.d.ts +1 -1
- package/dist/intelligence/sources/snapshot.d.ts.map +1 -1
- package/dist/mcp/server.js +1 -1
- package/dist/openapi/handlers/routes.d.ts.map +1 -1
- package/dist/openapi/handlers/validators.d.ts.map +1 -1
- package/dist/openapi/http-utils.d.ts.map +1 -1
- package/dist/openapi/server.js +20 -7
- package/dist/platform/jobs.d.ts +39 -1
- package/dist/platform/jobs.d.ts.map +1 -1
- package/dist/platform/policy.d.ts +10 -0
- package/dist/platform/policy.d.ts.map +1 -1
- package/dist/platform/rollback.d.ts +11 -0
- package/dist/platform/rollback.d.ts.map +1 -1
- package/dist/platform/types.d.ts +5 -0
- package/dist/platform/types.d.ts.map +1 -1
- package/dist/remediation/local/disposition.d.ts +5 -2
- package/dist/remediation/local/disposition.d.ts.map +1 -1
- package/dist/remediation/local/fallback.d.ts.map +1 -1
- package/dist/remediation/local/options.d.ts.map +1 -1
- package/dist/remediation/local/primary-strategy.d.ts +4 -0
- package/dist/remediation/local/primary-strategy.d.ts.map +1 -1
- package/dist/remediation/local/run.d.ts.map +1 -1
- package/dist/remediation/pipeline-runtime/tool-wrappers.d.ts.map +1 -1
- package/dist/remediation/proof-of-fix/runner.d.ts +52 -0
- package/dist/remediation/proof-of-fix/runner.d.ts.map +1 -1
- package/dist/remediation/refactor/call-site-finder.d.ts +21 -0
- package/dist/remediation/refactor/call-site-finder.d.ts.map +1 -1
- package/dist/remediation/refactor/refactor-agent.d.ts +18 -0
- package/dist/remediation/refactor/refactor-agent.d.ts.map +1 -1
- package/dist/remediation/tools/apply-package-override/index.d.ts +4 -0
- package/dist/remediation/tools/apply-package-override/index.d.ts.map +1 -1
- package/dist/remediation/tools/apply-patch-file/index.d.ts +2 -1
- package/dist/remediation/tools/apply-patch-file/index.d.ts.map +1 -1
- package/dist/remediation/tools/apply-version-bump.d.ts +4 -0
- package/dist/remediation/tools/apply-version-bump.d.ts.map +1 -1
- package/dist/remediation/tools/check-inventory.d.ts +1 -0
- package/dist/remediation/tools/check-inventory.d.ts.map +1 -1
- package/dist/remediation/tools/fetch-package-source.d.ts.map +1 -1
- package/dist/remediation/tools/find-fixed-version.d.ts.map +1 -1
- package/dist/remediation/tools/generate-patch/helpers.d.ts +3 -3
- package/dist/remediation/tools/generate-patch/helpers.d.ts.map +1 -1
- package/package.json +6 -4
- package/dist/api/change-request/index.test.d.ts +0 -2
- package/dist/api/change-request/index.test.d.ts.map +0 -1
- package/dist/api/delta-scan/delta-scan.test.d.ts +0 -2
- package/dist/api/delta-scan/delta-scan.test.d.ts.map +0 -1
- package/dist/api/evaluate/evaluate.test.d.ts +0 -2
- package/dist/api/evaluate/evaluate.test.d.ts.map +0 -1
- package/dist/api/index.test.d.ts +0 -2
- package/dist/api/index.test.d.ts.map +0 -1
- package/dist/api/jobs/index.test.d.ts +0 -2
- package/dist/api/jobs/index.test.d.ts.map +0 -1
- package/dist/api/patches/reconcile.test.d.ts +0 -2
- package/dist/api/patches/reconcile.test.d.ts.map +0 -1
- package/dist/api/patches.test.d.ts +0 -2
- package/dist/api/patches.test.d.ts.map +0 -1
- package/dist/api/portfolio/portfolio.test.d.ts +0 -2
- package/dist/api/portfolio/portfolio.test.d.ts.map +0 -1
- package/dist/api/portfolio/risk-score.test.d.ts +0 -2
- package/dist/api/portfolio/risk-score.test.d.ts.map +0 -1
- package/dist/api/reachability/reachability.test.d.ts +0 -2
- package/dist/api/reachability/reachability.test.d.ts.map +0 -1
- package/dist/api/update-outdated/index.test.d.ts +0 -2
- package/dist/api/update-outdated/index.test.d.ts.map +0 -1
- package/dist/api/vex/index.test.d.ts +0 -2
- package/dist/api/vex/index.test.d.ts.map +0 -1
- package/dist/cli/index.test.d.ts +0 -2
- package/dist/cli/index.test.d.ts.map +0 -1
- package/dist/intelligence/sources/certcc.test.d.ts +0 -2
- package/dist/intelligence/sources/certcc.test.d.ts.map +0 -1
- package/dist/intelligence/sources/cisa-kev.test.d.ts +0 -2
- package/dist/intelligence/sources/cisa-kev.test.d.ts.map +0 -1
- package/dist/intelligence/sources/cve-services.test.d.ts +0 -2
- package/dist/intelligence/sources/cve-services.test.d.ts.map +0 -1
- package/dist/intelligence/sources/deps-dev.test.d.ts +0 -2
- package/dist/intelligence/sources/deps-dev.test.d.ts.map +0 -1
- package/dist/intelligence/sources/epss.test.d.ts +0 -2
- package/dist/intelligence/sources/epss.test.d.ts.map +0 -1
- package/dist/intelligence/sources/external-feeds.test.d.ts +0 -2
- package/dist/intelligence/sources/external-feeds.test.d.ts.map +0 -1
- package/dist/intelligence/sources/gitlab-advisory.test.d.ts +0 -2
- package/dist/intelligence/sources/gitlab-advisory.test.d.ts.map +0 -1
- package/dist/intelligence/sources/nvd.test.d.ts +0 -2
- package/dist/intelligence/sources/nvd.test.d.ts.map +0 -1
- package/dist/intelligence/sources/ossf-scorecard.test.d.ts +0 -2
- package/dist/intelligence/sources/ossf-scorecard.test.d.ts.map +0 -1
- package/dist/intelligence/sources/osv.test.d.ts +0 -2
- package/dist/intelligence/sources/osv.test.d.ts.map +0 -1
- package/dist/intelligence/sources/registry.test.d.ts +0 -2
- package/dist/intelligence/sources/registry.test.d.ts.map +0 -1
- package/dist/intelligence/sources/snapshot.test.d.ts +0 -2
- package/dist/intelligence/sources/snapshot.test.d.ts.map +0 -1
- package/dist/mcp/server.test.d.ts +0 -2
- package/dist/mcp/server.test.d.ts.map +0 -1
- package/dist/openapi/server.test.d.ts +0 -2
- package/dist/openapi/server.test.d.ts.map +0 -1
- package/dist/platform/architecture-guardrails.test.d.ts +0 -2
- package/dist/platform/architecture-guardrails.test.d.ts.map +0 -1
- package/dist/platform/audit-logger.test.d.ts +0 -2
- package/dist/platform/audit-logger.test.d.ts.map +0 -1
- package/dist/platform/escalation.test.d.ts +0 -2
- package/dist/platform/escalation.test.d.ts.map +0 -1
- package/dist/platform/evidence.test.d.ts +0 -2
- package/dist/platform/evidence.test.d.ts.map +0 -1
- package/dist/platform/package-manager/index.test.d.ts +0 -2
- package/dist/platform/package-manager/index.test.d.ts.map +0 -1
- package/dist/platform/package-manager/list-parser.test.d.ts +0 -2
- package/dist/platform/package-manager/list-parser.test.d.ts.map +0 -1
- package/dist/platform/package-manager.test.d.ts +0 -2
- package/dist/platform/package-manager.test.d.ts.map +0 -1
- package/dist/platform/policy.test.d.ts +0 -2
- package/dist/platform/policy.test.d.ts.map +0 -1
- package/dist/platform/repo-lock.test.d.ts +0 -2
- package/dist/platform/repo-lock.test.d.ts.map +0 -1
- package/dist/platform/rollback.test.d.ts +0 -2
- package/dist/platform/rollback.test.d.ts.map +0 -1
- package/dist/platform/safe-exec.test.d.ts +0 -2
- package/dist/platform/safe-exec.test.d.ts.map +0 -1
- package/dist/platform/sla.test.d.ts +0 -2
- package/dist/platform/sla.test.d.ts.map +0 -1
- package/dist/platform/supply-chain.test.d.ts +0 -2
- package/dist/platform/supply-chain.test.d.ts.map +0 -1
- package/dist/platform/workspace.test.d.ts +0 -2
- package/dist/platform/workspace.test.d.ts.map +0 -1
- package/dist/remediation/local/consensus-gate.test.d.ts +0 -2
- package/dist/remediation/local/consensus-gate.test.d.ts.map +0 -1
- package/dist/remediation/local/disposition.test.d.ts +0 -2
- package/dist/remediation/local/disposition.test.d.ts.map +0 -1
- package/dist/remediation/local/run.secops.test.d.ts +0 -2
- package/dist/remediation/local/run.secops.test.d.ts.map +0 -1
- package/dist/remediation/local/sbom.test.d.ts +0 -2
- package/dist/remediation/local/sbom.test.d.ts.map +0 -1
- package/dist/remediation/local/vulnerability-match.test.d.ts +0 -2
- package/dist/remediation/local/vulnerability-match.test.d.ts.map +0 -1
- package/dist/remediation/pipeline.test.d.ts +0 -2
- package/dist/remediation/pipeline.test.d.ts.map +0 -1
- package/dist/remediation/proof-of-fix/runner.test.d.ts +0 -2
- package/dist/remediation/proof-of-fix/runner.test.d.ts.map +0 -1
- package/dist/remediation/refactor/refactor.test.d.ts +0 -2
- package/dist/remediation/refactor/refactor.test.d.ts.map +0 -1
- package/dist/remediation/tools/apply-package-override.test.d.ts +0 -2
- package/dist/remediation/tools/apply-package-override.test.d.ts.map +0 -1
- package/dist/remediation/tools/apply-patch-file.test.d.ts +0 -2
- package/dist/remediation/tools/apply-patch-file.test.d.ts.map +0 -1
- package/dist/remediation/tools/apply-version-bump.test.d.ts +0 -2
- package/dist/remediation/tools/apply-version-bump.test.d.ts.map +0 -1
- package/dist/remediation/tools/check-exploit-signal.test.d.ts +0 -2
- package/dist/remediation/tools/check-exploit-signal.test.d.ts.map +0 -1
- package/dist/remediation/tools/check-reachability.test.d.ts +0 -2
- package/dist/remediation/tools/check-reachability.test.d.ts.map +0 -1
- package/dist/remediation/tools/check-suppression.test.d.ts +0 -2
- package/dist/remediation/tools/check-suppression.test.d.ts.map +0 -1
- package/dist/remediation/tools/generate-patch/helpers.test.d.ts +0 -2
- package/dist/remediation/tools/generate-patch/helpers.test.d.ts.map +0 -1
- package/dist/remediation/tools/lookup-cve.test.d.ts +0 -2
- package/dist/remediation/tools/lookup-cve.test.d.ts.map +0 -1
- package/dist/scanner/adapters/npm-audit.test.d.ts +0 -2
- package/dist/scanner/adapters/npm-audit.test.d.ts.map +0 -1
- package/dist/scanner/adapters/sarif.test.d.ts +0 -2
- package/dist/scanner/adapters/sarif.test.d.ts.map +0 -1
- package/dist/scanner/adapters/yarn-audit.test.d.ts +0 -2
- package/dist/scanner/adapters/yarn-audit.test.d.ts.map +0 -1
- package/dist/scanner/lockfile-diff.test.d.ts +0 -2
- package/dist/scanner/lockfile-diff.test.d.ts.map +0 -1
- package/dist/scanner/parse-input.test.d.ts +0 -2
- package/dist/scanner/parse-input.test.d.ts.map +0 -1
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/api/options-schema.ts","../src/api/reporting.ts","../src/api/sarif.ts","../src/api/vex/index.ts","../src/api/patches/inspection.ts","../src/remediation/strategies/patch-utils.ts","../src/platform/package-manager/index.ts","../src/platform/package-manager/list-parser.ts","../src/platform/package-manager/driver.ts","../src/api/patches/helpers.ts","../src/remediation/tools/tool-compat.ts","../src/remediation/tools/check-inventory.ts","../src/platform/policy.ts","../src/platform/workspace.ts","../src/api/patches/validation.ts","../src/api/patches/reconcile.ts","../src/remediation/evaluate-package.ts","../src/platform/http-client.ts","../src/intelligence/sources/osv.ts","../src/platform/config.ts","../src/intelligence/sources/epss.ts","../src/intelligence/sources/cisa-kev.ts","../src/intelligence/sources/registry.ts","../src/platform/idempotency.ts","../src/remediation/pipeline.ts","../src/remediation/local/run.ts","../src/intelligence/sources/github-advisory.ts","../src/intelligence/sources/nvd.ts","../src/intelligence/sources/snapshot.ts","../src/remediation/tools/check-reachability.ts","../src/remediation/tools/check-exploit-signal.ts","../src/remediation/local/secops-preflight.ts","../src/remediation/local/sbom.ts","../src/remediation/tools/apply-version-bump.ts","../src/platform/safe-exec.ts","../src/platform/repo-lock.ts","../src/remediation/refactor/call-site-finder.ts","../src/remediation/refactor/refactor-agent.ts","../src/remediation/tools/apply-package-override/index.ts","../src/remediation/tools/apply-package-override/helpers.ts","../src/platform/supply-chain.ts","../src/remediation/local/primary-strategy.ts","../src/remediation/tools/fetch-package-source.ts","../src/remediation/tools/generate-patch/index.ts","../src/remediation/strategies/patch-synthesis-prompt.ts","../src/remediation/tools/generate-patch/helpers.ts","../src/remediation/tools/apply-patch-file/index.ts","../src/remediation/proof-of-fix/runner.ts","../src/remediation/tools/apply-patch-file/helpers.ts","../src/remediation/local/consensus-gate.ts","../src/remediation/local/fallback.ts","../src/remediation/local/options.ts","../src/remediation/local/vulnerability-match.ts","../src/remediation/local/summary.ts","../src/remediation/local/disposition.ts","../src/platform/escalation.ts","../src/remediation/strategies/pipeline-telemetry.ts","../src/remediation/orchestration-prompt.ts","../src/remediation/pipeline-runtime/progress.ts","../src/remediation/tools/lookup-cve.ts","../src/intelligence/sources/cve-services.ts","../src/intelligence/sources/gitlab-advisory.ts","../src/intelligence/sources/certcc.ts","../src/intelligence/sources/deps-dev.ts","../src/intelligence/sources/ossf-scorecard.ts","../src/intelligence/sources/external-feeds.ts","../src/remediation/tools/check-version-match.ts","../src/remediation/tools/find-fixed-version.ts","../src/remediation/tools/check-suppression.ts","../src/remediation/runtime-tools.ts","../src/remediation/pipeline-runtime/tool-wrappers.ts","../src/remediation/pipeline-runtime/index.ts","../src/api/change-request/index.ts","../src/api/context.ts","../src/platform/evidence.ts","../src/api/remediate.evidence.ts","../src/api/remediate/validators.ts","../src/api/remediate/index.ts","../src/scanner/parse-input.ts","../src/scanner/adapters/npm-audit.ts","../src/scanner/adapters/yarn-audit.ts","../src/scanner/adapters/sarif.ts","../src/scanner/unique-cve-ids.ts","../src/api/scan-execution.ts","../src/api/scan-outcome.ts","../src/api/remediate-from-scan/report-metrics.ts","../src/api/remediate-from-scan/index.ts","../src/api/portfolio/risk-score.ts","../src/api/portfolio/index.ts","../src/api/update-outdated/index.ts","../src/api/reachability/index.ts","../src/scanner/delta-scan.ts","../src/scanner/lockfile-diff.ts","../src/api/jobs/index.ts","../src/platform/jobs.ts"],"sourcesContent":["export type JsonSchemaProperty = Record<string, unknown>;\n\nexport const PACKAGE_MANAGER_VALUES = [\"npm\", \"pnpm\", \"yarn\", \"bun\", \"deno\"] as const;\nexport const LLM_PROVIDER_VALUES = [\"remote\", \"local\"] as const;\nexport const PROVENANCE_SOURCE_VALUES = [\"cli\", \"sdk\", \"mcp\", \"openapi\", \"unknown\"] as const;\n\nexport const OPTION_DESCRIPTIONS = {\n cveId: \"CVE ID, e.g. CVE-2021-23337\",\n inputPath: \"Absolute path to the scanner output file\",\n cwd: \"Absolute path to the project root (default: process.cwd())\",\n packageManager: \"Package manager override (auto-detected by default)\",\n dryRun: \"If true, plan changes but write nothing\",\n preview: \"If true, enforce non-mutating preview mode\",\n simulationMode:\n \"If true, attach deterministic simulation and rebuttal metadata for dry-run or preview execution\",\n runTests: \"Run package-manager test command after applying fix\",\n llmProvider: \"LLM provider override (remote|local)\",\n model: \"LLM model override\",\n modelPersonality: \"Prompt behavior profile: analytical|pragmatic|balanced\",\n providerSafetyProfile: \"Safety posture profile for confidence gates: strict|relaxed\",\n requireConsensusForHighRisk: \"Require second-provider agreement for high-risk generated patches\",\n consensusProvider: \"Provider override for high-risk consensus verification (remote|local)\",\n consensusModel: \"Model override for high-risk consensus verification\",\n patchConfidenceThresholdLow: \"Patch acceptance confidence threshold for low-risk patches (0..1)\",\n patchConfidenceThresholdMedium:\n \"Patch acceptance confidence threshold for medium-risk patches (0..1)\",\n patchConfidenceThresholdHigh:\n \"Patch acceptance confidence threshold for high-risk patches (0..1)\",\n dynamicModelRouting: \"Enable dynamic model selection by input size\",\n dynamicRoutingThresholdChars: \"Input size threshold used by dynamic model routing\",\n patchesDir: \"Directory to write .patch files (default: ./patches)\",\n policy: \"Optional path to .github/autoremediator.yml policy file\",\n requestId: \"Request correlation ID\",\n sessionId: \"Session correlation ID\",\n parentRunId: \"Parent run correlation ID\",\n idempotencyKey: \"Idempotency key for replay-safe execution\",\n resume: \"Return cached result for matching idempotency key when available\",\n actor: \"Actor identity for evidence provenance\",\n source: \"Source system for provenance\",\n format: \"Scanner format (default: auto)\",\n audit: \"Run package-manager-native audit command instead of reading a scan file\",\n evidence: \"Write evidence JSON to .autoremediator/evidence/ (default: true)\",\n directDependenciesOnly: \"Restrict remediation to direct dependencies only\",\n preferVersionBump:\n \"Reject override and patch remediation when version-bump-only policy is required\",\n installMode: \"Install behavior profile: deterministic|prefer-offline|standard\",\n installPreferOffline: \"Override prefer-offline flag behavior for install commands\",\n enforceFrozenLockfile: \"Override frozen lockfile behavior for install commands\",\n workspace: \"Workspace/package selector for scoped remediation in monorepos\",\n createChangeRequest: \"Enable creation of native pull request / merge request after remediation\",\n changeRequestProvider: \"Change request provider (github|gitlab)\",\n changeRequestGrouping: \"Grouping strategy for change requests (all|per-cve|per-package)\",\n changeRequestRepository: \"Repository slug override for change request creation\",\n changeRequestBaseBranch: \"Base branch used for change request targeting\",\n changeRequestBranchPrefix: \"Branch prefix for generated change request branches\",\n changeRequestTitlePrefix: \"Title prefix for generated change requests\",\n includeTransitive: \"Include transitive dependencies in the outdated check. Default: false.\",\n updateOutdated:\n \"Run in update-outdated mode: bump all outdated npm packages without requiring a CVE.\",\n kevMandatory:\n \"If true, CVEs with active CISA KEV status bypass severity filtering and are treated as mandatory\",\n epssThreshold:\n \"EPSS probability threshold (0..1) above which a CVE is treated as mandatory regardless of severity\",\n suppressionsFile:\n \"Path to a YAML file containing additional VEX suppression entries to merge with policy-inline suppressions\",\n slaCheck:\n \"Compare CVE publication dates against configured SLA windows and include breach records in the report output\",\n skipUnreachable:\n \"Skip remediation for CVEs where the vulnerable package cannot be reached from any project entry point (requires static import analysis)\",\n regressionCheck:\n \"After applying a fix, verify the patched version falls outside the CVE's vulnerable range and flag any regression in the report\",\n dispositionPolicy:\n \"Autonomous disposition policy controlling when fixes are auto-applied, held, or escalated\",\n dispositionPolicyMinConfidenceForAutoApply:\n \"Minimum patch confidence (0–1) required for auto-apply disposition\",\n dispositionPolicyHoldForTransitive:\n \"Hold transitive dependency fixes for human review instead of auto-applying\",\n dispositionPolicyEscalateOnSlaBreachSeverities:\n \"CVE severities that trigger escalate disposition on SLA breach\",\n dispositionPolicyEscalateOnKev: \"Escalate disposition for CVEs with active CISA KEV status\",\n containmentMode:\n \"Block escalation-disposition results from being applied and record containment in evidence\",\n campaignMode: \"Enable portfolio campaign mode to risk-rank targets before execution\",\n escalationGraph: \"Optional mapping from unresolved reasons to intended escalation actions\",\n offlineIntelligence:\n \"Skip all network calls to intelligence sources. Only local inventory and npm-registry version resolution proceed.\",\n intelligenceSnapshotPath:\n \"Path to a local JSON snapshot of pre-fetched CVE intelligence (keyed by CVE ID) used when offline mode is active.\",\n proofOfFix:\n \"If true, enforce dual-stage exploit reproduction proof-of-fix verification (assert failure pre-patch, assert pass post-patch)\",\n requireProofOfFix: \"If true, reject patches and roll back if proof-of-fix verification fails\",\n breakingChangeRefactor:\n \"If true, attempt agentic call-site refactoring when major version upgrades introduce breaking API changes\",\n} as const;\n\nexport function createConstraintSchemaProperties(): Record<string, JsonSchemaProperty> {\n return {\n directDependenciesOnly: {\n type: \"boolean\",\n description: OPTION_DESCRIPTIONS.directDependenciesOnly,\n },\n preferVersionBump: { type: \"boolean\", description: OPTION_DESCRIPTIONS.preferVersionBump },\n installMode: {\n type: \"string\",\n enum: [\"deterministic\", \"prefer-offline\", \"standard\"],\n description: OPTION_DESCRIPTIONS.installMode,\n },\n installPreferOffline: {\n type: \"boolean\",\n description: OPTION_DESCRIPTIONS.installPreferOffline,\n },\n enforceFrozenLockfile: {\n type: \"boolean\",\n description: OPTION_DESCRIPTIONS.enforceFrozenLockfile,\n },\n workspace: { type: \"string\", description: OPTION_DESCRIPTIONS.workspace },\n requireProofOfFix: { type: \"boolean\", description: OPTION_DESCRIPTIONS.requireProofOfFix },\n enableBreakingChangeRefactor: {\n type: \"boolean\",\n description: OPTION_DESCRIPTIONS.breakingChangeRefactor,\n },\n };\n}\n\n\nexport function createRemediateOptionSchemaProperties(options?: {\n includeDryRun?: boolean;\n includePreview?: boolean;\n includeSimulationMode?: boolean;\n includeEvidence?: boolean;\n}): Record<string, JsonSchemaProperty> {\n const includeDryRun = options?.includeDryRun ?? true;\n const includePreview = options?.includePreview ?? true;\n const includeSimulationMode = options?.includeSimulationMode ?? true;\n const includeEvidence = options?.includeEvidence ?? true;\n\n return {\n cwd: { type: \"string\", description: OPTION_DESCRIPTIONS.cwd },\n packageManager: {\n type: \"string\",\n enum: [...PACKAGE_MANAGER_VALUES],\n description: OPTION_DESCRIPTIONS.packageManager,\n },\n ...(includeDryRun\n ? { dryRun: { type: \"boolean\", description: OPTION_DESCRIPTIONS.dryRun } }\n : {}),\n ...(includePreview\n ? { preview: { type: \"boolean\", description: OPTION_DESCRIPTIONS.preview } }\n : {}),\n ...(includeSimulationMode\n ? { simulationMode: { type: \"boolean\", description: OPTION_DESCRIPTIONS.simulationMode } }\n : {}),\n runTests: { type: \"boolean\", description: OPTION_DESCRIPTIONS.runTests },\n llmProvider: {\n type: \"string\",\n enum: [...LLM_PROVIDER_VALUES],\n description: OPTION_DESCRIPTIONS.llmProvider,\n },\n model: { type: \"string\", description: OPTION_DESCRIPTIONS.model },\n modelPersonality: {\n type: \"string\",\n enum: [\"analytical\", \"pragmatic\", \"balanced\"],\n description: OPTION_DESCRIPTIONS.modelPersonality,\n },\n providerSafetyProfile: {\n type: \"string\",\n enum: [\"strict\", \"relaxed\"],\n description: OPTION_DESCRIPTIONS.providerSafetyProfile,\n },\n requireConsensusForHighRisk: {\n type: \"boolean\",\n description: OPTION_DESCRIPTIONS.requireConsensusForHighRisk,\n },\n consensusProvider: {\n type: \"string\",\n enum: [...LLM_PROVIDER_VALUES],\n description: OPTION_DESCRIPTIONS.consensusProvider,\n },\n consensusModel: { type: \"string\", description: OPTION_DESCRIPTIONS.consensusModel },\n patchConfidenceThresholds: {\n type: \"object\",\n properties: {\n low: {\n type: \"number\",\n minimum: 0,\n maximum: 1,\n description: OPTION_DESCRIPTIONS.patchConfidenceThresholdLow,\n },\n medium: {\n type: \"number\",\n minimum: 0,\n maximum: 1,\n description: OPTION_DESCRIPTIONS.patchConfidenceThresholdMedium,\n },\n high: {\n type: \"number\",\n minimum: 0,\n maximum: 1,\n description: OPTION_DESCRIPTIONS.patchConfidenceThresholdHigh,\n },\n },\n },\n dynamicModelRouting: { type: \"boolean\", description: OPTION_DESCRIPTIONS.dynamicModelRouting },\n dynamicRoutingThresholdChars: {\n type: \"number\",\n description: OPTION_DESCRIPTIONS.dynamicRoutingThresholdChars,\n },\n patchesDir: { type: \"string\", description: OPTION_DESCRIPTIONS.patchesDir },\n policy: { type: \"string\", description: OPTION_DESCRIPTIONS.policy },\n ...(includeEvidence\n ? { evidence: { type: \"boolean\", description: OPTION_DESCRIPTIONS.evidence } }\n : {}),\n requestId: { type: \"string\", description: OPTION_DESCRIPTIONS.requestId },\n sessionId: { type: \"string\", description: OPTION_DESCRIPTIONS.sessionId },\n parentRunId: { type: \"string\", description: OPTION_DESCRIPTIONS.parentRunId },\n idempotencyKey: { type: \"string\", description: OPTION_DESCRIPTIONS.idempotencyKey },\n resume: { type: \"boolean\", description: OPTION_DESCRIPTIONS.resume },\n actor: { type: \"string\", description: OPTION_DESCRIPTIONS.actor },\n source: {\n type: \"string\",\n enum: [...PROVENANCE_SOURCE_VALUES],\n description: OPTION_DESCRIPTIONS.source,\n },\n constraints: {\n type: \"object\",\n properties: createConstraintSchemaProperties(),\n },\n changeRequest: {\n type: \"object\",\n properties: {\n enabled: { type: \"boolean\", description: OPTION_DESCRIPTIONS.createChangeRequest },\n provider: {\n type: \"string\",\n enum: [\"github\", \"gitlab\"],\n description: OPTION_DESCRIPTIONS.changeRequestProvider,\n },\n grouping: {\n type: \"string\",\n enum: [\"all\", \"per-cve\", \"per-package\"],\n description: OPTION_DESCRIPTIONS.changeRequestGrouping,\n },\n repository: { type: \"string\", description: OPTION_DESCRIPTIONS.changeRequestRepository },\n baseBranch: { type: \"string\", description: OPTION_DESCRIPTIONS.changeRequestBaseBranch },\n branchPrefix: {\n type: \"string\",\n description: OPTION_DESCRIPTIONS.changeRequestBranchPrefix,\n },\n titlePrefix: { type: \"string\", description: OPTION_DESCRIPTIONS.changeRequestTitlePrefix },\n },\n },\n kevMandatory: { type: \"boolean\", description: OPTION_DESCRIPTIONS.kevMandatory },\n epssThreshold: {\n type: \"number\",\n minimum: 0,\n maximum: 1,\n description: OPTION_DESCRIPTIONS.epssThreshold,\n },\n suppressionsFile: { type: \"string\", description: OPTION_DESCRIPTIONS.suppressionsFile },\n slaCheck: { type: \"boolean\", description: OPTION_DESCRIPTIONS.slaCheck },\n skipUnreachable: { type: \"boolean\", description: OPTION_DESCRIPTIONS.skipUnreachable },\n regressionCheck: { type: \"boolean\", description: OPTION_DESCRIPTIONS.regressionCheck },\n dispositionPolicy: {\n type: \"object\",\n description: OPTION_DESCRIPTIONS.dispositionPolicy,\n properties: {\n minConfidenceForAutoApply: {\n type: \"number\",\n minimum: 0,\n maximum: 1,\n description: OPTION_DESCRIPTIONS.dispositionPolicyMinConfidenceForAutoApply,\n },\n holdForTransitive: {\n type: \"boolean\",\n description: OPTION_DESCRIPTIONS.dispositionPolicyHoldForTransitive,\n },\n escalateOnSlaBreachSeverities: {\n type: \"array\",\n items: { type: \"string\", enum: [\"critical\", \"high\", \"medium\", \"low\"] },\n description: OPTION_DESCRIPTIONS.dispositionPolicyEscalateOnSlaBreachSeverities,\n },\n escalateOnKev: {\n type: \"boolean\",\n description: OPTION_DESCRIPTIONS.dispositionPolicyEscalateOnKev,\n },\n },\n },\n containmentMode: { type: \"boolean\", description: OPTION_DESCRIPTIONS.containmentMode },\n campaignMode: { type: \"boolean\", description: OPTION_DESCRIPTIONS.campaignMode },\n escalationGraph: {\n type: \"object\",\n description: OPTION_DESCRIPTIONS.escalationGraph,\n properties: {\n \"consensus-failed\": {\n type: \"string\",\n enum: [\"open-issue\", \"notify-channel\", \"create-draft-pr\", \"hold-branch\", \"none\"],\n },\n \"constraint-blocked\": {\n type: \"string\",\n enum: [\"open-issue\", \"notify-channel\", \"create-draft-pr\", \"hold-branch\", \"none\"],\n },\n \"transitive-dependency\": {\n type: \"string\",\n enum: [\"open-issue\", \"notify-channel\", \"create-draft-pr\", \"hold-branch\", \"none\"],\n },\n \"install-failed\": {\n type: \"string\",\n enum: [\"open-issue\", \"notify-channel\", \"create-draft-pr\", \"hold-branch\", \"none\"],\n },\n \"major-bump-required\": {\n type: \"string\",\n enum: [\"open-issue\", \"notify-channel\", \"create-draft-pr\", \"hold-branch\", \"none\"],\n },\n \"no-safe-version\": {\n type: \"string\",\n enum: [\"open-issue\", \"notify-channel\", \"create-draft-pr\", \"hold-branch\", \"none\"],\n },\n \"override-apply-failed\": {\n type: \"string\",\n enum: [\"open-issue\", \"notify-channel\", \"create-draft-pr\", \"hold-branch\", \"none\"],\n },\n \"package-json-not-found\": {\n type: \"string\",\n enum: [\"open-issue\", \"notify-channel\", \"create-draft-pr\", \"hold-branch\", \"none\"],\n },\n \"patch-apply-failed\": {\n type: \"string\",\n enum: [\"open-issue\", \"notify-channel\", \"create-draft-pr\", \"hold-branch\", \"none\"],\n },\n \"patch-confidence-too-low\": {\n type: \"string\",\n enum: [\"open-issue\", \"notify-channel\", \"create-draft-pr\", \"hold-branch\", \"none\"],\n },\n \"patch-generation-failed\": {\n type: \"string\",\n enum: [\"open-issue\", \"notify-channel\", \"create-draft-pr\", \"hold-branch\", \"none\"],\n },\n \"patch-validation-failed\": {\n type: \"string\",\n enum: [\"open-issue\", \"notify-channel\", \"create-draft-pr\", \"hold-branch\", \"none\"],\n },\n \"policy-blocked\": {\n type: \"string\",\n enum: [\"open-issue\", \"notify-channel\", \"create-draft-pr\", \"hold-branch\", \"none\"],\n },\n \"requires-llm-fallback\": {\n type: \"string\",\n enum: [\"open-issue\", \"notify-channel\", \"create-draft-pr\", \"hold-branch\", \"none\"],\n },\n \"source-fetch-failed\": {\n type: \"string\",\n enum: [\"open-issue\", \"notify-channel\", \"create-draft-pr\", \"hold-branch\", \"none\"],\n },\n \"validation-failed\": {\n type: \"string\",\n enum: [\"open-issue\", \"notify-channel\", \"create-draft-pr\", \"hold-branch\", \"none\"],\n },\n \"proof-of-fix-failed\": {\n type: \"string\",\n enum: [\"open-issue\", \"notify-channel\", \"create-draft-pr\", \"hold-branch\", \"none\"],\n },\n \"breaking-change-unresolved\": {\n type: \"string\",\n enum: [\"open-issue\", \"notify-channel\", \"create-draft-pr\", \"hold-branch\", \"none\"],\n },\n },\n additionalProperties: false,\n },\n offlineIntelligence: { type: \"boolean\", description: OPTION_DESCRIPTIONS.offlineIntelligence },\n intelligenceSnapshotPath: {\n type: \"string\",\n description: OPTION_DESCRIPTIONS.intelligenceSnapshotPath,\n },\n proofOfFix: { type: \"boolean\", description: OPTION_DESCRIPTIONS.proofOfFix },\n requireProofOfFix: { type: \"boolean\", description: OPTION_DESCRIPTIONS.requireProofOfFix },\n breakingChangeRefactor: {\n type: \"boolean\",\n description: OPTION_DESCRIPTIONS.breakingChangeRefactor,\n },\n };\n}\n\n\nexport function createScanOptionSchemaProperties(): Record<string, JsonSchemaProperty> {\n return {\n ...createRemediateOptionSchemaProperties({ includeEvidence: true }),\n format: {\n type: \"string\",\n enum: [\"npm-audit\", \"yarn-audit\", \"sarif\", \"auto\"],\n description: OPTION_DESCRIPTIONS.format,\n },\n audit: { type: \"boolean\", description: OPTION_DESCRIPTIONS.audit },\n slaCheck: { type: \"boolean\", description: OPTION_DESCRIPTIONS.slaCheck },\n };\n}\n\nexport function createScanReportSchemaProperties(): Record<string, JsonSchemaProperty> {\n return {\n schemaVersion: { type: \"string\" },\n status: { type: \"string\", enum: [\"ok\", \"partial\", \"failed\"] },\n generatedAt: { type: \"string\" },\n cveIds: { type: \"array\", items: { type: \"string\" } },\n reports: { type: \"array\", items: { type: \"object\" } },\n successCount: { type: \"number\" },\n failedCount: { type: \"number\" },\n errors: { type: \"array\", items: { type: \"object\" } },\n evidenceFile: { type: \"string\" },\n patchCount: { type: \"number\" },\n patchValidationFailures: { type: \"array\", items: { type: \"object\" } },\n strategyCounts: {\n type: \"object\",\n additionalProperties: { type: \"number\" },\n },\n dependencyScopeCounts: {\n type: \"object\",\n additionalProperties: { type: \"number\" },\n },\n unresolvedByReason: {\n type: \"object\",\n additionalProperties: { type: \"number\" },\n },\n escalationCounts: {\n type: \"object\",\n additionalProperties: { type: \"number\" },\n },\n patchesDir: { type: \"string\" },\n correlation: { type: \"object\" },\n provenance: { type: \"object\" },\n constraints: { type: \"object\" },\n idempotencyKey: { type: \"string\" },\n llmUsageCount: { type: \"number\" },\n estimatedCostUsd: { type: \"number\" },\n totalLlmLatencyMs: { type: \"number\" },\n changeRequests: { type: \"array\", items: { type: \"object\" } },\n simulationSummary: { type: \"object\" },\n };\n}\n\nexport function createUpdateOutdatedOptionSchemaProperties(): Record<string, JsonSchemaProperty> {\n return {\n ...createRemediateOptionSchemaProperties({\n includeEvidence: true,\n includeSimulationMode: false,\n }),\n includeTransitive: { type: \"boolean\", description: OPTION_DESCRIPTIONS.includeTransitive },\n };\n}\n","import type {\n DependencyScope,\n DependencyScopeCounts,\n DispositionCounts,\n EscalationAction,\n EscalationCounts,\n RemediateOptions,\n PatchResult,\n PatchStrategyCounts,\n RemediationReport,\n ResultSimulation,\n SimulationMutation,\n SimulationMutationTarget,\n SimulationRebuttalCode,\n SimulationRebuttalFinding,\n SimulationSummary,\n SlaBreachEntry,\n SlaBreachSummary,\n UnresolvedReasonCounts,\n} from \"../platform/types.js\";\nimport type { CiSummary, ScanReport } from \"./contracts.js\";\n\nconst SIMULATION_MUTATION_REASONS: Record<SimulationMutationTarget, string> = {\n \"package-manifest\": \"Would update the package manifest dependency declaration.\",\n lockfile: \"Would update the dependency lockfile to reflect resolved versions.\",\n \"patch-file\": \"Would write a generated patch artifact.\",\n \"patch-manifest\": \"Would write patch artifact manifest metadata.\",\n \"install-state\": \"Would refresh installed dependency state.\",\n \"test-command\": \"Would execute the configured test command.\",\n};\n\nconst SIMULATION_REBUTTAL_MESSAGES: Record<SimulationRebuttalCode, string> = {\n \"unresolved-reason\": \"The remediation remains unresolved in simulation mode.\",\n \"policy-blocked\": \"Policy would block this remediation from being applied.\",\n \"consensus-failed\": \"Consensus verification would block this remediation path.\",\n \"validation-risk\": \"Validation signals indicate this remediation may fail or be unsafe.\",\n \"regression-risk\": \"Regression signals indicate the target may remain vulnerable after apply.\",\n \"low-confidence\": \"Patch confidence is below the acceptance threshold.\",\n \"high-risk-patch\": \"This remediation path is classified as high risk.\",\n \"transitive-target\": \"This result targets a transitive dependency.\",\n \"escalation-planned\": \"This remediation is planned for escalation instead of direct apply.\",\n \"exploit-signal\": \"Exploit-signal prioritization was triggered for this CVE.\",\n \"sla-breach\": \"This CVE breaches the configured remediation SLA.\",\n \"tests-not-run\": \"Tests would not run for this mutating remediation path.\",\n};\n\nfunction getSimulationMode(\n options: Pick<RemediateOptions, \"dryRun\" | \"preview\" | \"simulationMode\">,\n): ResultSimulation[\"mode\"] | undefined {\n if (!options.simulationMode) {\n return undefined;\n }\n\n if (options.preview === true) {\n return \"preview\";\n }\n\n if (options.dryRun === true) {\n return \"dry-run\";\n }\n\n return undefined;\n}\n\nexport function assertValidSimulationMode(\n options: Pick<RemediateOptions, \"dryRun\" | \"preview\" | \"simulationMode\">,\n): void {\n if (options.simulationMode !== true) {\n return;\n }\n\n if (!getSimulationMode(options)) {\n throw new Error(\"simulationMode requires dryRun=true or preview=true.\");\n }\n}\n\nfunction createDependencyScopeLookup(report: RemediationReport): Map<string, DependencyScope> {\n const scopes = new Map<string, DependencyScope>();\n\n for (const vulnerablePackage of report.vulnerablePackages) {\n const scope = toDependencyScope(vulnerablePackage.installed.type);\n const current = scopes.get(vulnerablePackage.installed.name);\n if (!current || current !== \"direct\") {\n scopes.set(vulnerablePackage.installed.name, scope);\n }\n }\n\n return scopes;\n}\n\nfunction createSimulationMutation(\n target: SimulationMutationTarget,\n path?: string,\n): SimulationMutation {\n return {\n target,\n reason: SIMULATION_MUTATION_REASONS[target],\n ...(path ? { path } : {}),\n };\n}\n\nfunction buildPlannedMutations(result: PatchResult, runTests: boolean): SimulationMutation[] {\n if (result.strategy === \"version-bump\" || result.strategy === \"override\") {\n return [\n createSimulationMutation(\"package-manifest\"),\n createSimulationMutation(\"lockfile\"),\n createSimulationMutation(\"install-state\"),\n ...(runTests ? [createSimulationMutation(\"test-command\")] : []),\n ];\n }\n\n if (result.strategy === \"patch-file\") {\n const patchFilePath = result.patchArtifact?.patchFilePath ?? result.patchFilePath;\n const manifestFilePath = result.patchArtifact?.manifestFilePath;\n\n return [\n createSimulationMutation(\"patch-file\", patchFilePath),\n ...(manifestFilePath ? [createSimulationMutation(\"patch-manifest\", manifestFilePath)] : []),\n createSimulationMutation(\"install-state\"),\n ...(runTests ? [createSimulationMutation(\"test-command\")] : []),\n ];\n }\n\n return [];\n}\n\nfunction addRebuttalFinding(\n findings: Map<SimulationRebuttalCode, SimulationRebuttalFinding>,\n code: SimulationRebuttalCode,\n severity: SimulationRebuttalFinding[\"severity\"],\n sourceSignals: string[],\n): void {\n const existing = findings.get(code);\n if (existing) {\n existing.sourceSignals = Array.from(new Set([...existing.sourceSignals, ...sourceSignals]));\n return;\n }\n\n findings.set(code, {\n code,\n severity,\n message: SIMULATION_REBUTTAL_MESSAGES[code],\n sourceSignals: Array.from(new Set(sourceSignals)),\n });\n}\n\nfunction hasValidationRisk(result: PatchResult): boolean {\n return (\n result.validation?.passed === false ||\n result.validationPhases?.some((phase) => phase.passed === false) === true ||\n result.patchArtifact?.validationPhases?.some((phase) => phase.passed === false) === true\n );\n}\n\nfunction buildRebuttalFindings(params: {\n report: RemediationReport;\n result: PatchResult;\n dependencyScope?: DependencyScope;\n wouldMutate: boolean;\n runTests: boolean;\n}): SimulationRebuttalFinding[] {\n const findings = new Map<SimulationRebuttalCode, SimulationRebuttalFinding>();\n const { report, result, dependencyScope, wouldMutate, runTests } = params;\n\n if (result.unresolvedReason) {\n addRebuttalFinding(findings, \"unresolved-reason\", \"warning\", [\"unresolvedReason\"]);\n }\n\n if (result.unresolvedReason === \"policy-blocked\") {\n addRebuttalFinding(findings, \"policy-blocked\", \"high\", [\"unresolvedReason\"]);\n }\n\n if (\n result.unresolvedReason === \"consensus-failed\" ||\n result.dispositionReason === \"consensus-failed\"\n ) {\n addRebuttalFinding(findings, \"consensus-failed\", \"high\", [\n ...(result.unresolvedReason === \"consensus-failed\" ? [\"unresolvedReason\"] : []),\n ...(result.dispositionReason === \"consensus-failed\" ? [\"dispositionReason\"] : []),\n ]);\n }\n\n if (hasValidationRisk(result)) {\n addRebuttalFinding(findings, \"validation-risk\", \"high\", [\"validation\", \"validationPhases\"]);\n }\n\n if (result.regressionDetected) {\n addRebuttalFinding(findings, \"regression-risk\", \"high\", [\"regressionDetected\"]);\n }\n\n if (\n result.unresolvedReason === \"patch-confidence-too-low\" ||\n result.dispositionReason === \"low-confidence\"\n ) {\n addRebuttalFinding(findings, \"low-confidence\", \"warning\", [\n ...(result.unresolvedReason === \"patch-confidence-too-low\" ? [\"unresolvedReason\"] : []),\n ...(result.dispositionReason === \"low-confidence\" ? [\"dispositionReason\"] : []),\n ]);\n }\n\n if (result.riskLevel === \"high\") {\n addRebuttalFinding(findings, \"high-risk-patch\", \"warning\", [\"riskLevel\"]);\n }\n\n if (dependencyScope === \"transitive\") {\n addRebuttalFinding(findings, \"transitive-target\", \"info\", [\"dependencyScope\"]);\n }\n\n if (result.escalationAction && result.escalationAction !== \"none\") {\n addRebuttalFinding(findings, \"escalation-planned\", \"warning\", [\"escalationAction\"]);\n }\n\n if (report.exploitSignalTriggered === true) {\n addRebuttalFinding(findings, \"exploit-signal\", \"high\", [\"exploitSignalTriggered\"]);\n }\n\n if ((report.slaBreaches?.length ?? 0) > 0) {\n addRebuttalFinding(findings, \"sla-breach\", \"warning\", [\"slaBreaches\"]);\n }\n\n if (wouldMutate && !runTests) {\n addRebuttalFinding(findings, \"tests-not-run\", \"warning\", [\"runTests\"]);\n }\n\n return [...findings.values()];\n}\n\nexport function buildResultSimulation(\n report: RemediationReport,\n result: PatchResult,\n options: Pick<RemediateOptions, \"dryRun\" | \"preview\" | \"runTests\" | \"simulationMode\">,\n): ResultSimulation | undefined {\n const mode = getSimulationMode(options);\n if (!mode) {\n return undefined;\n }\n\n const dependencyScopeLookup = createDependencyScopeLookup(report);\n const dependencyScope = result.dependencyScope ?? dependencyScopeLookup.get(result.packageName);\n const plannedMutations = buildPlannedMutations(result, options.runTests === true);\n const wouldMutate = plannedMutations.length > 0;\n\n let unifiedDiff: string | undefined;\n if (result.patchArtifact?.patchFilePath) {\n unifiedDiff = `--- ${result.patchArtifact.patchFilePath}\\n+++ ${result.patchArtifact.patchFilePath}`;\n } else if (result.strategy === \"version-bump\" && result.toVersion) {\n unifiedDiff = `--- package.json\\n+++ package.json\\n@@ -1,3 +1,3 @@\\n- \"${result.packageName}\": \"${result.fromVersion}\"\\n+ \"${result.packageName}\": \"^${result.toVersion}\"`;\n } else if (result.strategy === \"override\" && result.toVersion) {\n unifiedDiff = `--- package.json\\n+++ package.json\\n@@ -1,3 +1,3 @@\\n+ \"overrides\": {\\n+ \"${result.packageName}\": \"${result.toVersion}\"\\n+ }`;\n }\n\n return {\n mode,\n wouldMutate,\n plannedMutations,\n rebuttalFindings: buildRebuttalFindings({\n report,\n result,\n dependencyScope,\n wouldMutate,\n runTests: options.runTests === true,\n }),\n unifiedDiff,\n };\n}\n\nexport function buildSimulationSummary(\n reports: RemediationReport[],\n): SimulationSummary | undefined {\n let mode: SimulationSummary[\"mode\"] | undefined;\n let resultCount = 0;\n let wouldMutateCount = 0;\n let rebuttalResultCount = 0;\n const plannedMutationCounts: Partial<Record<SimulationMutationTarget, number>> = {};\n const rebuttalCounts: Partial<Record<SimulationRebuttalCode, number>> = {};\n\n for (const report of reports) {\n for (const result of report.results) {\n if (!result.simulation) {\n continue;\n }\n\n mode ??= result.simulation.mode;\n resultCount += 1;\n if (result.simulation.wouldMutate) {\n wouldMutateCount += 1;\n }\n if (result.simulation.rebuttalFindings.length > 0) {\n rebuttalResultCount += 1;\n }\n\n for (const mutation of result.simulation.plannedMutations) {\n plannedMutationCounts[mutation.target] = (plannedMutationCounts[mutation.target] ?? 0) + 1;\n }\n\n for (const finding of result.simulation.rebuttalFindings) {\n rebuttalCounts[finding.code] = (rebuttalCounts[finding.code] ?? 0) + 1;\n }\n }\n }\n\n if (!mode) {\n return undefined;\n }\n\n return {\n mode,\n resultCount,\n wouldMutateCount,\n nonMutatingCount: resultCount - wouldMutateCount,\n rebuttalResultCount,\n plannedMutationCounts:\n Object.keys(plannedMutationCounts).length > 0 ? plannedMutationCounts : undefined,\n rebuttalCounts: Object.keys(rebuttalCounts).length > 0 ? rebuttalCounts : undefined,\n };\n}\n\nexport function applySimulationMetadata(\n report: RemediationReport,\n options: Pick<RemediateOptions, \"dryRun\" | \"preview\" | \"runTests\" | \"simulationMode\">,\n): RemediationReport {\n const mode = getSimulationMode(options);\n if (!mode) {\n return report;\n }\n\n const enrichedReport: RemediationReport = {\n ...report,\n results: report.results.map((result) => ({\n ...result,\n simulation: buildResultSimulation(report, result, options),\n })),\n };\n\n return {\n ...enrichedReport,\n simulationSummary: buildSimulationSummary([enrichedReport]),\n };\n}\n\nexport function buildStrategyCounts(reports: RemediationReport[]): PatchStrategyCounts | undefined {\n const counts: PatchStrategyCounts = {};\n\n for (const report of reports) {\n for (const result of report.results) {\n counts[result.strategy] = (counts[result.strategy] ?? 0) + 1;\n }\n }\n\n return Object.keys(counts).length > 0 ? counts : undefined;\n}\n\nfunction toDependencyScope(installedType: \"direct\" | \"transitive\"): DependencyScope {\n return installedType === \"direct\" ? \"direct\" : \"transitive\";\n}\n\nexport function buildDependencyScopeCounts(\n reports: RemediationReport[],\n): DependencyScopeCounts | undefined {\n const counts: DependencyScopeCounts = {};\n\n for (const report of reports) {\n const packageScopes = new Map<string, DependencyScope>();\n\n for (const vulnerablePackage of report.vulnerablePackages) {\n const scope = toDependencyScope(vulnerablePackage.installed.type);\n const current = packageScopes.get(vulnerablePackage.installed.name);\n if (!current || current !== \"direct\") {\n packageScopes.set(vulnerablePackage.installed.name, scope);\n }\n }\n\n for (const result of report.results) {\n const scope = packageScopes.get(result.packageName);\n if (!scope) continue;\n counts[scope] = (counts[scope] ?? 0) + 1;\n }\n }\n\n return Object.keys(counts).length > 0 ? counts : undefined;\n}\n\nexport function buildUnresolvedReasonCounts(\n reports: RemediationReport[],\n): UnresolvedReasonCounts | undefined {\n const counts: UnresolvedReasonCounts = {};\n\n for (const report of reports) {\n for (const result of report.results) {\n if (!result.unresolvedReason) continue;\n counts[result.unresolvedReason] = (counts[result.unresolvedReason] ?? 0) + 1;\n }\n }\n\n return Object.keys(counts).length > 0 ? counts : undefined;\n}\n\nexport function buildDispositionCounts(\n reports: RemediationReport[],\n): DispositionCounts | undefined {\n const counts: DispositionCounts = {};\n\n for (const report of reports) {\n for (const result of report.results) {\n if (!result.disposition) continue;\n counts[result.disposition] = (counts[result.disposition] ?? 0) + 1;\n }\n }\n\n return Object.keys(counts).length > 0 ? counts : undefined;\n}\n\nexport function buildEscalationCounts(results: PatchResult[]): EscalationCounts | undefined {\n const counts: EscalationCounts = {};\n\n for (const result of results) {\n if (!result.escalationAction) continue;\n counts[result.escalationAction] = (counts[result.escalationAction] ?? 0) + 1;\n }\n\n return Object.keys(counts).length > 0 ? counts : undefined;\n}\n\nexport function buildSlaBreachSummary(reports: RemediationReport[]): SlaBreachSummary | undefined {\n const breaches: SlaBreachEntry[] = [];\n\n for (const report of reports) {\n if (!report.slaBreaches || report.slaBreaches.length === 0) continue;\n\n // Derive recommended action: first non-\"none\" escalationAction from any result in this report, else \"open-issue\"\n const recommendedAction: EscalationAction =\n report.results.map((r) => r.escalationAction).find((a) => a != null && a !== \"none\") ??\n \"open-issue\";\n\n for (const breach of report.slaBreaches) {\n breaches.push({\n cveId: breach.cveId,\n severity: breach.severity,\n hoursOverdue: breach.hoursOverdue,\n deadlineAt: breach.deadlineAt,\n recommendedAction,\n });\n }\n }\n\n return breaches.length > 0 ? { breachCount: breaches.length, breaches } : undefined;\n}\n\nexport function toCiSummary(report: ScanReport): CiSummary {\n let remediationCount = 0;\n for (const cveReport of report.reports) {\n remediationCount += cveReport.results.length;\n }\n\n return {\n schemaVersion: report.schemaVersion,\n status: report.status,\n generatedAt: report.generatedAt,\n cveCount: report.cveIds.length,\n remediationCount,\n successCount: report.successCount,\n failedCount: report.failedCount,\n errors: report.errors,\n evidenceFile: report.evidenceFile,\n patchCount: report.patchCount || 0,\n patchValidationFailures: report.patchValidationFailures,\n strategyCounts: report.strategyCounts,\n dependencyScopeCounts: report.dependencyScopeCounts,\n unresolvedByReason: report.unresolvedByReason,\n escalationCounts:\n report.escalationCounts ??\n buildEscalationCounts(\n report.reports.flatMap((remediationReport) => remediationReport.results),\n ),\n patchesDir: report.patchesDir,\n correlation: report.correlation,\n provenance: report.provenance,\n constraints: report.constraints,\n idempotencyKey: report.idempotencyKey,\n llmUsageCount: report.llmUsageCount,\n estimatedCostUsd: report.estimatedCostUsd,\n totalLlmLatencyMs: report.totalLlmLatencyMs,\n slaBreaches: report.slaBreaches,\n slaBreachSummary: buildSlaBreachSummary(report.reports),\n dispositionCounts: report.dispositionCounts,\n simulationSummary: report.simulationSummary,\n };\n}\n\nexport function ciExitCode(summary: CiSummary): number {\n return summary.failedCount > 0 ? 1 : 0;\n}\n","import type { ScanReport } from \"./contracts.js\";\n\ntype SarifLevel = \"error\" | \"warning\" | \"note\" | \"none\";\n\ninterface SarifRule {\n id: string;\n name: string;\n shortDescription: { text: string };\n fullDescription: { text: string };\n defaultConfiguration: { level: SarifLevel };\n helpUri: string;\n properties: { severity: string };\n}\n\ninterface SarifResult {\n ruleId: string;\n level: SarifLevel;\n message: { text: string };\n locations: Array<{\n physicalLocation: {\n artifactLocation: { uri: string; uriBaseId: string };\n };\n }>;\n}\n\nexport interface SarifOutput {\n version: \"2.1.0\";\n $schema: string;\n runs: Array<{\n tool: {\n driver: {\n name: string;\n informationUri: string;\n rules: SarifRule[];\n };\n };\n results: SarifResult[];\n }>;\n}\n\nfunction severityToSarifLevel(severity: string): SarifLevel {\n if (severity === \"CRITICAL\" || severity === \"HIGH\") return \"error\";\n if (severity === \"MEDIUM\") return \"warning\";\n if (severity === \"LOW\") return \"note\";\n return \"warning\";\n}\n\nexport function toSarifOutput(report: ScanReport): SarifOutput {\n const rules: SarifRule[] = [];\n const results: SarifResult[] = [];\n const seenRules = new Set<string>();\n\n for (const cveReport of report.reports) {\n const severity = cveReport.cveDetails?.severity ?? \"UNKNOWN\";\n const level = severityToSarifLevel(severity);\n const summary = cveReport.cveDetails?.summary ?? cveReport.cveId;\n\n if (!seenRules.has(cveReport.cveId)) {\n seenRules.add(cveReport.cveId);\n rules.push({\n id: cveReport.cveId,\n name: \"VulnerableDependency\",\n shortDescription: { text: cveReport.cveId },\n fullDescription: { text: summary },\n defaultConfiguration: { level },\n helpUri: `https://osv.dev/vulnerability/${cveReport.cveId}`,\n properties: { severity },\n });\n }\n\n for (const vulnerablePackage of cveReport.vulnerablePackages) {\n const fixText = vulnerablePackage.affected.firstPatchedVersion\n ? ` Fix: upgrade to ${vulnerablePackage.affected.firstPatchedVersion}.`\n : \" No fixed version available.\";\n results.push({\n ruleId: cveReport.cveId,\n level,\n message: {\n text: `${vulnerablePackage.installed.name}@${vulnerablePackage.installed.version} is vulnerable to ${cveReport.cveId}: ${summary}${fixText}`,\n },\n locations: [\n {\n physicalLocation: {\n artifactLocation: { uri: \"package.json\", uriBaseId: \"%SRCROOT%\" },\n },\n },\n ],\n });\n }\n }\n\n return {\n version: \"2.1.0\",\n $schema:\n \"https://raw.githubusercontent.com/oasis-tcs/sarif-spec/master/Documents/CommitteeSpecifications/2.1.0/sarif-schema-2.1.0.json\",\n runs: [\n {\n tool: {\n driver: {\n name: \"autoremediator\",\n informationUri: \"https://github.com/Rawlings/autoremediator\",\n rules,\n },\n },\n results,\n },\n ],\n };\n}\n","import { randomUUID } from \"node:crypto\";\nimport type { RemediationReport } from \"../../platform/types.js\";\nimport type { ScanReport } from \"../contracts.js\";\n\nexport interface CycloneDxVexVulnerabilityAnalysis {\n state: \"resolved\" | \"not_affected\" | \"in_triage\";\n justification?: \"code_not_in_execute_path\" | \"code_not_reachable\" | (string & {});\n detail?: string;\n response?: (\"update\" | \"workaround_available\")[];\n}\n\nexport interface CycloneDxVexVulnerability {\n id: string;\n analysis: CycloneDxVexVulnerabilityAnalysis;\n}\n\nexport interface CycloneDxVexDocument {\n bomFormat: \"CycloneDX\";\n specVersion: \"1.5\";\n version: 1;\n serialNumber: string;\n metadata: {\n timestamp: string;\n tools: Array<{ name: string; version: string }>;\n };\n vulnerabilities: CycloneDxVexVulnerability[];\n}\n\nexport interface ToCycloneDxVexOptions {\n toolVersion?: string;\n}\n\nfunction mapReportToVulnerability(report: RemediationReport): CycloneDxVexVulnerability {\n const hasResolved = report.results.some((r) => r.applied && !r.unresolvedReason);\n const hasSuppressed = report.results.some((r) => r.suppressedBy != null);\n const notReachableResult = report.results.find((r) => r.reachability?.status === \"not-reachable\");\n\n if (notReachableResult && !hasResolved) {\n return {\n id: report.cveId,\n analysis: {\n state: \"not_affected\",\n justification: notReachableResult.reachability?.justification ?? \"code_not_in_execute_path\",\n detail: notReachableResult.reachability?.reason ?? \"Code is not in execution path\",\n },\n };\n }\n\n if (hasSuppressed && !hasResolved) {\n const suppressed = report.results.find((r) => r.suppressedBy != null)!;\n return {\n id: report.cveId,\n analysis: {\n state: \"not_affected\",\n justification: suppressed.suppressedBy!.justification,\n detail: suppressed.suppressedBy!.notes ?? suppressed.suppressedBy!.justification,\n },\n };\n }\n\n if (hasResolved) {\n const resolvedResults = report.results.filter((r) => r.applied && !r.unresolvedReason);\n const hasVersionBumpOrOverride = resolvedResults.some(\n (r) => r.strategy === \"version-bump\" || r.strategy === \"override\",\n );\n const hasPatchFile = resolvedResults.some((r) => r.strategy === \"patch-file\");\n\n const response: (\"update\" | \"workaround_available\")[] = [];\n if (hasVersionBumpOrOverride) response.push(\"update\");\n if (hasPatchFile) response.push(\"workaround_available\");\n\n return {\n id: report.cveId,\n analysis: {\n state: \"resolved\",\n response: response.length > 0 ? response : undefined,\n },\n };\n }\n\n const firstUnresolved = report.results.find((r) => r.unresolvedReason);\n return {\n id: report.cveId,\n analysis: {\n state: \"in_triage\",\n detail: firstUnresolved?.unresolvedReason,\n },\n };\n}\n\nexport function toCycloneDxVex(\n report: ScanReport | RemediationReport,\n options: ToCycloneDxVexOptions = {},\n): CycloneDxVexDocument {\n const toolVersion = options.toolVersion ?? \"unknown\";\n const timestamp = new Date().toISOString();\n const serialNumber = `urn:uuid:${randomUUID()}`;\n\n let remediationReports: RemediationReport[];\n\n // Discriminate: ScanReport has `reports` array; RemediationReport has `cveId`\n if (\"reports\" in report && Array.isArray((report as ScanReport).reports)) {\n remediationReports = (report as ScanReport).reports;\n } else {\n remediationReports = [report as RemediationReport];\n }\n\n const vulnerabilities = remediationReports.map(mapReportToVulnerability);\n\n return {\n bomFormat: \"CycloneDX\",\n specVersion: \"1.5\",\n version: 1,\n serialNumber,\n metadata: {\n timestamp,\n tools: [{ name: \"autoremediator\", version: toolVersion }],\n },\n vulnerabilities,\n };\n}\n","import { existsSync } from \"node:fs\";\nimport { readdir, readFile, stat } from \"node:fs/promises\";\nimport { join } from \"node:path\";\nimport type {\n PatchArtifactInspection,\n PatchArtifactQueryOptions,\n PatchArtifactSummary,\n} from \"../../platform/types.js\";\nimport { validatePatchDiff } from \"../../remediation/strategies/patch-utils.js\";\nimport {\n readManifest,\n resolveArtifactPath,\n resolvePatchesDir,\n toSummary,\n derivePatchMetadata,\n} from \"./helpers.js\";\n\nexport async function listPatchArtifacts(\n options: PatchArtifactQueryOptions = {},\n): Promise<PatchArtifactSummary[]> {\n const cwd = options.cwd ?? process.cwd();\n const patchesDirPath = resolvePatchesDir(cwd, options.patchesDir);\n\n if (!existsSync(patchesDirPath)) {\n return [];\n }\n\n const entries = await readdir(patchesDirPath, { withFileTypes: true });\n const patchFiles = entries\n .filter((entry) => entry.isFile() && entry.name.endsWith(\".patch\"))\n .map((entry) => join(patchesDirPath, entry.name))\n .sort((left, right) => left.localeCompare(right));\n\n const summaries = await Promise.all(\n patchFiles.map(async (patchFilePath) => {\n const inspection = await inspectPatchArtifact(patchFilePath, options);\n return toSummary(inspection);\n }),\n );\n\n return summaries;\n}\n\nexport async function inspectPatchArtifact(\n patchFilePath: string,\n options: PatchArtifactQueryOptions = {},\n): Promise<PatchArtifactInspection> {\n const cwd = options.cwd ?? process.cwd();\n const resolvedPatchPath = resolveArtifactPath(cwd, patchFilePath);\n const patchFileName = resolvedPatchPath.split(\"/\").pop() ?? resolvedPatchPath;\n const manifestFilePath = `${resolvedPatchPath}.json`;\n\n if (!existsSync(resolvedPatchPath)) {\n return {\n patchFilePath: resolvedPatchPath,\n manifestFilePath: existsSync(manifestFilePath) ? manifestFilePath : undefined,\n patchFileName,\n exists: false,\n diffValid: false,\n formatError: \"Patch file does not exist.\",\n };\n }\n\n const [patchContent, fileStats, manifest] = await Promise.all([\n readFile(resolvedPatchPath, \"utf8\"),\n stat(resolvedPatchPath),\n readManifest(manifestFilePath),\n ]);\n\n const format = validatePatchDiff(patchContent);\n const derived = derivePatchMetadata(patchContent);\n\n return {\n patchFilePath: resolvedPatchPath,\n manifestFilePath: manifest ? manifestFilePath : undefined,\n patchFileName,\n cveId: manifest?.cveId,\n packageName: manifest?.packageName,\n vulnerableVersion: manifest?.vulnerableVersion,\n patchMode: manifest?.patchMode,\n confidence: manifest?.confidence,\n riskLevel: manifest?.riskLevel,\n generatedAt: manifest?.generatedAt,\n files: manifest?.files ?? derived.files,\n hunkCount: manifest?.hunkCount ?? derived.hunkCount,\n exists: true,\n diffValid: format.valid,\n formatError: format.error,\n patchSizeBytes: fileStats.size,\n lineCount: patchContent.split(/\\r?\\n/).length,\n manifest,\n };\n}\n","/**\n * Patch generation utilities for Autoremediator\n *\n * Provides functions for:\n * - Writing patch files to disk\n * - Validating unified diff format\n * - Managing patch-package integration\n * - Fetching source files from npm\n */\n\nimport { existsSync, mkdirSync, writeFileSync, readFileSync } from \"node:fs\";\nimport { join } from \"node:path\";\nimport { execa } from \"execa\";\nimport {\n detectPackageManager,\n getPackageManagerCommands,\n} from \"../../platform/package-manager/index.js\";\n\n/**\n * Validation result type for patch diffs\n */\nexport interface PatchValidationResult {\n valid: boolean;\n error?: string;\n}\n\n/**\n * Write a unified diff patch to the patches directory\n *\n * Creates patches/ directory if it doesn't exist and writes the patch with\n * naming convention: <packageName>+<version>.patch\n *\n * @param packageName - The npm package name\n * @param version - The package version\n * @param patchContent - The unified diff content\n * @param projectDir - Project root directory\n * @returns Full file path to the written patch file\n */\nexport function writePatchFile(\n packageName: string,\n version: string,\n patchContent: string,\n projectDir: string,\n): string {\n const patchesDir = join(projectDir, \"patches\");\n\n // Create patches directory if missing\n if (!existsSync(patchesDir)) {\n mkdirSync(patchesDir, { recursive: true });\n }\n\n // Sanitize package name for filename (remove @ from scoped packages)\n const safeName = packageName.replace(/^@/, \"\").replace(/\\//g, \"+\");\n const filename = `${safeName}+${version}.patch`;\n const filePath = join(patchesDir, filename);\n\n // Write patch file\n writeFileSync(filePath, patchContent, \"utf8\");\n\n return filePath;\n}\n\n/**\n * Validate that patch content matches unified diff format\n *\n * Checks for:\n * - Presence of --- and +++ header lines\n * - Presence of @@ hunk headers\n * - Valid unified diff structure\n *\n * @param patchContent - The patch content to validate\n * @returns Validation result with error details if invalid\n */\nexport function validatePatchDiff(patchContent: string): PatchValidationResult {\n if (!patchContent || typeof patchContent !== \"string\") {\n return {\n valid: false,\n error: \"Patch content must be a non-empty string\",\n };\n }\n\n // Check for basic unified diff structure\n const hasFromLine = /^---\\s+\\S+/m.test(patchContent);\n const hasToLine = /^\\+\\+\\+\\s+\\S+/m.test(patchContent);\n const hasHunkHeader = /^@@\\s+-\\d+/m.test(patchContent);\n\n if (!hasFromLine) {\n return {\n valid: false,\n error: 'Missing \"---\" line in patch format',\n };\n }\n\n if (!hasToLine) {\n return {\n valid: false,\n error: 'Missing \"+++\" line in patch format',\n };\n }\n\n if (!hasHunkHeader) {\n return {\n valid: false,\n error: \"No hunk headers (@@...) found in patch\",\n };\n }\n\n return { valid: true };\n}\n\n/**\n * Ensure patch-package is installed and configured\n *\n * Checks if patch-package is in devDependencies. If not, either:\n * - Installs it automatically (if not in dry-run context)\n * - Logs a warning with installation instructions\n *\n * Updates package.json postinstall script if needed:\n * Add \"postinstall\": \"patch-package\" or append to existing script\n *\n * @param projectDir - Project root directory\n * @returns Promise that resolves when patch-package is ensured\n */\nexport async function ensurePatchPackage(projectDir: string): Promise<void> {\n const pkgPath = join(projectDir, \"package.json\");\n\n // Read package.json\n let pkgJson: Record<string, unknown>;\n try {\n const content = readFileSync(pkgPath, \"utf8\");\n pkgJson = JSON.parse(content) as Record<string, unknown>;\n } catch (err) {\n throw new Error(\n `Failed to read package.json: ${err instanceof Error ? err.message : String(err)}`,\n );\n }\n\n const devDeps = (pkgJson.devDependencies as Record<string, string> | undefined) || {};\n\n // Check if patch-package is already installed\n if (devDeps[\"patch-package\"]) {\n return; // Already present\n }\n\n // Install patch-package\n try {\n const packageManager = detectPackageManager(projectDir);\n const commands = getPackageManagerCommands(packageManager);\n const [cmd, ...args] = commands.installDev(\"patch-package\");\n await execa(cmd, args, {\n cwd: projectDir,\n stdio: \"inherit\",\n });\n } catch (err) {\n throw new Error(\n `Failed to install patch-package: ${err instanceof Error ? err.message : String(err)}`,\n );\n }\n\n // Update postinstall script in package.json\n let scripts = (pkgJson.scripts as Record<string, string> | undefined) || {};\n const existingPostinstall = scripts.postinstall || \"\";\n const newPostinstall = existingPostinstall\n ? `${existingPostinstall} && patch-package`\n : \"patch-package\";\n\n scripts.postinstall = newPostinstall;\n pkgJson.scripts = scripts;\n\n // Write updated package.json\n try {\n writeFileSync(pkgPath, JSON.stringify(pkgJson, null, 2) + \"\\n\", \"utf8\");\n } catch (err) {\n throw new Error(\n `Failed to update package.json: ${err instanceof Error ? err.message : String(err)}`,\n );\n }\n}\n\n/**\n * Fetch the content of a specific file from an npm package\n *\n * Downloads the package tarball from npm, extracts the specified file,\n * and returns its content. Useful for LLM analysis of vulnerable source code.\n *\n * @param packageName - The npm package name\n * @param version - The package version\n * @param filePath - Path to file within package (relative to package root)\n * @returns Promise resolving to file content as string\n */\nexport async function getVulnerableFileContent(\n packageName: string,\n version: string,\n filePath: string,\n): Promise<string> {\n // Use npm view to fetch tarball URL\n let tarballUrl: string;\n try {\n const result = await execa(\"npm\", [\"view\", `${packageName}@${version}`, \"dist.tarball\"], {\n stdio: \"pipe\",\n });\n tarballUrl = (result.stdout as string).trim();\n } catch (err) {\n throw new Error(\n `Failed to get tarball URL for ${packageName}@${version}: ${\n err instanceof Error ? err.message : String(err)\n }`,\n );\n }\n\n if (!tarballUrl) {\n throw new Error(`No tarball URL found for ${packageName}@${version}`);\n }\n\n // Create temporary directory for extraction\n const tempDir = join(\"/tmp\", `autoremediator-${packageName}-${version}-${Date.now()}`);\n mkdirSync(tempDir, { recursive: true });\n\n try {\n // Alternative: use curl and tar\n await execa(\"bash\", [\"-c\", `curl -s \"${tarballUrl}\" | tar xz -C \"${tempDir}\"`]);\n\n // Read the file from extracted package (npm extracts under \"package/\" directory)\n const extractedPath = join(tempDir, \"package\", filePath);\n const content = readFileSync(extractedPath, \"utf8\");\n\n return content;\n } catch (err) {\n throw new Error(\n `Failed to fetch file ${filePath} from ${packageName}@${version}: ${\n err instanceof Error ? err.message : String(err)\n }`,\n );\n } finally {\n // Clean up temporary directory\n try {\n await execa(\"rm\", [\"-rf\", tempDir]);\n } catch {\n // Ignore cleanup errors\n }\n }\n}\n","import { existsSync, readFileSync } from \"node:fs\";\nimport { join } from \"node:path\";\nimport { execa } from \"execa\";\nimport type { PackageManager, RemediationConstraints } from \"../types.js\";\nimport { parsePackageManagerListOutput } from \"./list-parser.js\";\nexport * from \"./driver.js\";\n\nexport type { PackageManager };\n\nexport interface PackageManagerCommands {\n install: string[];\n installPreferOffline: string[];\n installDeterministic: string[];\n installDev: (pkg: string) => string[];\n test: string[];\n list: string[];\n lockfileName: string;\n}\n\n/**\n * Detect the installed yarn major version by running `yarn --version`.\n * Returns 1 for classic yarn (1.x), or the actual major for berry (2+).\n * Falls back to 1 when the version cannot be determined.\n */\nexport async function getYarnMajorVersion(cwd: string): Promise<number> {\n try {\n const result = await execa(\"yarn\", [\"--version\"], { cwd, stdio: \"pipe\" });\n const major = Number.parseInt(result.stdout.trim().split(\".\")[0] ?? \"1\", 10);\n return Number.isNaN(major) ? 1 : major;\n } catch {\n return 1;\n }\n}\n\nexport function detectPackageManager(cwd: string): PackageManager {\n if (existsSync(join(cwd, \"pnpm-lock.yaml\"))) return \"pnpm\";\n if (existsSync(join(cwd, \"yarn.lock\"))) return \"yarn\";\n if (existsSync(join(cwd, \"bun.lockb\")) || existsSync(join(cwd, \"bun.lock\"))) return \"bun\";\n if (existsSync(join(cwd, \"deno.lock\"))) return \"deno\";\n return \"npm\";\n}\n\nfunction withWorkspace(command: string[], pm: PackageManager, workspace?: string): string[] {\n if (!workspace) return command;\n\n if (pm === \"pnpm\") {\n // pnpm expects filters before the subcommand: pnpm --filter <selector> install\n return [command[0], \"--filter\", workspace, ...command.slice(1)];\n }\n\n if (pm === \"npm\") {\n return [...command, \"--workspace\", workspace];\n }\n\n // Bun, Deno, and Yarn workspace command semantics differ by version; keep default behavior.\n return command;\n}\n\nexport function resolveInstallCommand(\n pm: PackageManager,\n constraints?: RemediationConstraints,\n yarnMajor?: number,\n): string[] {\n const installMode = constraints?.installMode ?? \"deterministic\";\n const preferOfflineOverride = constraints?.installPreferOffline;\n const frozenOverride = constraints?.enforceFrozenLockfile;\n\n // Bun: frozen-lockfile flag\n if (pm === \"bun\") {\n const frozen = frozenOverride ?? installMode === \"deterministic\";\n const command = [\"bun\", \"install\"];\n if (frozen) command.push(\"--frozen-lockfile\");\n return withWorkspace(command, pm, constraints?.workspace);\n }\n\n // Deno: --frozen flag; approximate prefer-offline with --cache-only\n if (pm === \"deno\") {\n const frozen = frozenOverride ?? installMode === \"deterministic\";\n const preferOffline = preferOfflineOverride ?? installMode === \"prefer-offline\";\n const command = [\"deno\", \"install\"];\n if (frozen) command.push(\"--frozen\");\n if (preferOffline && !frozen) command.push(\"--cache-only\");\n return withWorkspace(command, pm, constraints?.workspace);\n }\n\n const includePreferOffline =\n pm !== \"yarn\" && (preferOfflineOverride ?? installMode !== \"standard\");\n\n let includeFrozenLockfile = pm !== \"npm\" && (frozenOverride ?? installMode === \"deterministic\");\n\n if (frozenOverride === false) {\n includeFrozenLockfile = false;\n }\n\n const useNpmCi =\n pm === \"npm\" &&\n (frozenOverride === true || (frozenOverride === undefined && installMode === \"deterministic\"));\n\n const command: string[] = [pm, pm === \"npm\" ? (useNpmCi ? \"ci\" : \"install\") : \"install\"];\n\n if (includeFrozenLockfile) {\n // Yarn Berry (v2+) uses --immutable instead of --frozen-lockfile\n const isYarnBerry = pm === \"yarn\" && (yarnMajor ?? 1) >= 2;\n command.push(isYarnBerry ? \"--immutable\" : \"--frozen-lockfile\");\n }\n\n if (includePreferOffline) {\n command.push(\"--prefer-offline\");\n }\n\n return withWorkspace(command, pm, constraints?.workspace);\n}\n\nexport function resolveListCommand(\n pm: PackageManager,\n constraints?: RemediationConstraints,\n): string[] {\n if (pm === \"deno\") {\n // Deno inventory is built by reading deno.lock directly, not via a shell command.\n // Callers that receive an empty array should use resolveDenoInventory() instead.\n return [];\n }\n\n const base =\n pm === \"pnpm\"\n ? [\"pnpm\", \"list\", \"--json\", \"--depth\", \"99\"]\n : pm === \"yarn\"\n ? [\"yarn\", \"list\", \"--json\"]\n : pm === \"bun\"\n ? [\"bun\", \"pm\", \"ls\", \"--all\"]\n : [\"npm\", \"list\", \"--json\", \"--all\"];\n\n return withWorkspace(base, pm, constraints?.workspace);\n}\n\nexport function resolveTestCommand(\n pm: PackageManager,\n constraints?: RemediationConstraints,\n): string[] {\n const base =\n pm === \"pnpm\"\n ? [\"pnpm\", \"test\"]\n : pm === \"yarn\"\n ? [\"yarn\", \"test\"]\n : pm === \"bun\"\n ? [\"bun\", \"test\"]\n : pm === \"deno\"\n ? [\"deno\", \"test\"]\n : [\"npm\", \"test\"];\n return withWorkspace(base, pm, constraints?.workspace);\n}\n\nexport function resolveTypecheckCommand(\n pm: PackageManager,\n constraints?: RemediationConstraints,\n cwd: string = process.cwd(),\n): string[] {\n const pkgJsonPath = join(cwd, \"package.json\");\n let hasTypecheckScript = false;\n const hasTsConfig = existsSync(join(cwd, \"tsconfig.json\"));\n\n if (existsSync(pkgJsonPath)) {\n try {\n const pkg = JSON.parse(readFileSync(pkgJsonPath, \"utf8\")) as {\n scripts?: Record<string, string>;\n };\n if (pkg.scripts?.typecheck) {\n hasTypecheckScript = true;\n }\n } catch {\n // Ignore\n }\n }\n\n if (hasTypecheckScript) {\n const base = [pm, \"run\", \"typecheck\"];\n return withWorkspace(base, pm, constraints?.workspace);\n }\n\n if (hasTsConfig) {\n if (pm === \"deno\") {\n return withWorkspace([\"deno\", \"check\"], pm, constraints?.workspace);\n }\n const base = [\"npx\", \"tsc\", \"--noEmit\"];\n return withWorkspace(base, pm, constraints?.workspace);\n }\n\n return [];\n}\n\nexport function resolveAuditCommand(\n pm: PackageManager,\n constraints?: RemediationConstraints,\n): string[] {\n if (pm === \"deno\") {\n throw new Error(\n \"Deno does not support a native audit command. Use --input with a SARIF or npm-audit scan file instead.\",\n );\n }\n const base = pm === \"yarn\" ? [\"yarn\", \"audit\", \"--json\"] : [pm, \"audit\", \"--json\"];\n return withWorkspace(base, pm, constraints?.workspace);\n}\n\nexport function resolveWhyCommand(\n pm: PackageManager,\n packageName: string,\n constraints?: RemediationConstraints,\n): string[] {\n if (pm === \"deno\") return [];\n if (pm === \"bun\") {\n const base = [\"bun\", \"pm\", \"why\", packageName];\n return withWorkspace(base, pm, constraints?.workspace);\n }\n const base = pm === \"npm\" ? [\"npm\", \"explain\", packageName] : [pm, \"why\", packageName];\n return withWorkspace(base, pm, constraints?.workspace);\n}\n\nexport function resolveDedupeCommand(\n pm: PackageManager,\n constraints?: RemediationConstraints,\n): string[] {\n if (pm === \"bun\" || pm === \"deno\") return [];\n const base = [pm, \"dedupe\"];\n return withWorkspace(base, pm, constraints?.workspace);\n}\n\nexport function getPackageManagerCommands(pm: PackageManager): PackageManagerCommands {\n if (pm === \"pnpm\") {\n return {\n install: [\"pnpm\", \"install\"],\n installPreferOffline: [\"pnpm\", \"install\", \"--prefer-offline\"],\n installDeterministic: resolveInstallCommand(\"pnpm\", { installMode: \"deterministic\" }),\n installDev: (pkg: string) => [\"pnpm\", \"add\", \"-D\", pkg],\n test: [\"pnpm\", \"test\"],\n list: [\"pnpm\", \"list\", \"--json\", \"--depth\", \"99\"],\n lockfileName: \"pnpm-lock.yaml\",\n };\n }\n\n if (pm === \"yarn\") {\n return {\n install: [\"yarn\", \"install\"],\n installPreferOffline: [\"yarn\", \"install\"],\n installDeterministic: resolveInstallCommand(\"yarn\", { installMode: \"deterministic\" }),\n installDev: (pkg: string) => [\"yarn\", \"add\", \"--dev\", pkg],\n test: [\"yarn\", \"test\"],\n list: [\"yarn\", \"list\", \"--json\"],\n lockfileName: \"yarn.lock\",\n };\n }\n\n if (pm === \"bun\") {\n return {\n install: [\"bun\", \"install\"],\n installPreferOffline: [\"bun\", \"install\"],\n installDeterministic: resolveInstallCommand(\"bun\", { installMode: \"deterministic\" }),\n installDev: (pkg: string) => [\"bun\", \"add\", \"-d\", pkg],\n test: [\"bun\", \"test\"],\n list: [\"bun\", \"pm\", \"ls\", \"--all\"],\n lockfileName: \"bun.lockb\",\n };\n }\n\n if (pm === \"deno\") {\n return {\n install: [\"deno\", \"install\"],\n installPreferOffline: [\"deno\", \"install\", \"--cache-only\"],\n installDeterministic: resolveInstallCommand(\"deno\", { installMode: \"deterministic\" }),\n installDev: (pkg: string) => [\"deno\", \"add\", pkg],\n test: [\"deno\", \"test\"],\n list: [],\n lockfileName: \"deno.lock\",\n };\n }\n\n return {\n install: [\"npm\", \"install\"],\n installPreferOffline: [\"npm\", \"install\", \"--prefer-offline\"],\n installDeterministic: resolveInstallCommand(\"npm\", { installMode: \"deterministic\" }),\n installDev: (pkg: string) => [\"npm\", \"install\", \"--save-dev\", pkg],\n test: [\"npm\", \"test\"],\n list: [\"npm\", \"list\", \"--json\", \"--all\"],\n lockfileName: \"package-lock.json\",\n };\n}\n\nexport function parseListOutput(pm: PackageManager, stdout: string): Map<string, string> {\n return parsePackageManagerListOutput(pm, stdout);\n}\n","import { readFileSync } from \"node:fs\";\nimport { join } from \"node:path\";\nimport type { PackageManager } from \"./index.js\";\n\nexport function parsePackageManagerListOutput(\n pm: PackageManager,\n stdout: string,\n): Map<string, string> {\n const versions = new Map<string, string>();\n\n if (pm === \"bun\") {\n return parseBunListOutput(stdout, versions);\n }\n\n if (!stdout.trim()) return versions;\n\n if (pm === \"yarn\") {\n return parseYarnListOutput(stdout, versions);\n }\n\n let parsed: unknown;\n try {\n parsed = JSON.parse(stdout);\n } catch {\n return versions;\n }\n\n const root = Array.isArray(parsed) ? parsed[0] : parsed;\n collectDependencyTree(\n (root as { dependencies?: Record<string, DependencyTree> } | undefined)?.dependencies,\n versions,\n );\n\n return versions;\n}\n\ntype DependencyTree = {\n version?: string;\n dependencies?: Record<string, DependencyTree>;\n};\n\nfunction parseYarnListOutput(stdout: string, versions: Map<string, string>): Map<string, string> {\n const lines = stdout\n .split(\"\\n\")\n .map((line) => line.trim())\n .filter(Boolean);\n\n for (const line of lines) {\n try {\n const obj = JSON.parse(line) as {\n type?: string;\n data?: { trees?: Array<{ name?: string }> };\n };\n if (obj.type !== \"tree\") continue;\n\n for (const tree of obj.data?.trees ?? []) {\n const raw = tree.name ?? \"\";\n const at = raw.lastIndexOf(\"@\");\n if (at <= 0) continue;\n\n const name = raw.slice(0, at);\n const version = raw.slice(at + 1);\n if (name && version) {\n versions.set(name, version);\n }\n }\n } catch {\n // Ignore non-json lines from yarn output.\n }\n }\n\n return versions;\n}\n\nfunction collectDependencyTree(\n tree: Record<string, DependencyTree> | undefined,\n versions: Map<string, string>,\n): void {\n if (!tree) return;\n\n for (const [name, entry] of Object.entries(tree)) {\n if (!entry || typeof entry !== \"object\") continue;\n const version = entry.version;\n if (typeof version === \"string\" && version) {\n versions.set(name, version);\n }\n collectDependencyTree(entry.dependencies, versions);\n }\n}\n\n/**\n * Parse `bun pm ls --all` text output.\n * Each dependency line ends with `name@version`; leading tree-drawing characters\n * (├──, └──, │, spaces) are stripped before splitting on the last `@`.\n */\nfunction parseBunListOutput(stdout: string, versions: Map<string, string>): Map<string, string> {\n const lines = stdout\n .split(\"\\n\")\n .map((line) => line.replace(/^[\\s│├└─]+/, \"\").trim())\n .filter(Boolean);\n\n for (const line of lines) {\n const at = line.lastIndexOf(\"@\");\n if (at <= 0) continue;\n const name = line.slice(0, at);\n const version = line.slice(at + 1);\n if (name && version) {\n versions.set(name, version);\n }\n }\n\n return versions;\n}\n\n/**\n * Read `deno.lock` JSON from disk and extract installed npm package versions.\n * Supports both deno.lock v3 (packages.npm map) and v4 (packages object with npm: prefix keys).\n */\nexport function resolveDenoInventory(cwd: string): Map<string, string> {\n const versions = new Map<string, string>();\n let raw: string;\n try {\n raw = readFileSync(join(cwd, \"deno.lock\"), \"utf8\");\n } catch {\n return versions;\n }\n\n let lock: unknown;\n try {\n lock = JSON.parse(raw);\n } catch {\n return versions;\n }\n\n if (!lock || typeof lock !== \"object\") return versions;\n const lockObj = lock as Record<string, unknown>;\n\n // deno.lock v3: { version: \"3\", packages: { npm: { \"pkg@version\": ... } } }\n const packages = lockObj[\"packages\"];\n if (packages && typeof packages === \"object\") {\n const pkgsObj = packages as Record<string, unknown>;\n\n // v3 format: packages.npm keys are \"name@version\"\n const npmMap = pkgsObj[\"npm\"];\n if (npmMap && typeof npmMap === \"object\") {\n for (const key of Object.keys(npmMap as object)) {\n extractNameVersion(key, versions);\n }\n return versions;\n }\n\n // v4 format: packages keys may be \"npm:name@version\"\n for (const key of Object.keys(pkgsObj)) {\n const stripped = key.startsWith(\"npm:\") ? key.slice(4) : key;\n extractNameVersion(stripped, versions);\n }\n }\n\n return versions;\n}\n\nfunction extractNameVersion(spec: string, versions: Map<string, string>): void {\n // Handle scoped packages: \"@scope/name@version\" — lastIndexOf('@') after index 0\n const at = spec.lastIndexOf(\"@\");\n if (at <= 0) return;\n const name = spec.slice(0, at);\n const version = spec.slice(at + 1);\n if (name && version) {\n versions.set(name, version);\n }\n}\n","import { existsSync } from \"node:fs\";\nimport { join } from \"node:path\";\nimport type { PackageManager, RemediationConstraints } from \"../types.js\";\n\nexport type Ecosystem = \"npm\";\n\nexport interface PackageManagerDriver {\n id: PackageManager;\n ecosystem: Ecosystem;\n lockfileName: string;\n detect(cwd: string): boolean;\n resolveInstallCommand(constraints?: RemediationConstraints, yarnMajor?: number): string[];\n resolveTestCommand(constraints?: RemediationConstraints): string[];\n resolveAuditCommand(options?: { workspace?: string }): string[];\n resolveDedupeCommand?(constraints?: RemediationConstraints): string[] | undefined;\n}\n\nfunction withWorkspace(command: string[], pm: PackageManager, workspace?: string): string[] {\n if (!workspace) return command;\n if (pm === \"pnpm\") return [command[0], \"--filter\", workspace, ...command.slice(1)];\n if (pm === \"npm\") return [...command, \"--workspace\", workspace];\n return command;\n}\n\nexport const npmDriver: PackageManagerDriver = {\n id: \"npm\",\n ecosystem: \"npm\",\n lockfileName: \"package-lock.json\",\n detect: (cwd) => existsSync(join(cwd, \"package-lock.json\")),\n resolveInstallCommand(constraints) {\n const installMode = constraints?.installMode ?? \"deterministic\";\n const frozenOverride = constraints?.enforceFrozenLockfile;\n const preferOfflineOverride = constraints?.installPreferOffline;\n const useCi =\n frozenOverride === true || (frozenOverride === undefined && installMode === \"deterministic\");\n const cmd = [\"npm\", useCi ? \"ci\" : \"install\"];\n if (!useCi && (preferOfflineOverride ?? installMode !== \"standard\")) {\n cmd.push(\"--prefer-offline\");\n }\n return withWorkspace(cmd, \"npm\", constraints?.workspace);\n },\n resolveTestCommand: (constraints) =>\n withWorkspace([\"npm\", \"test\"], \"npm\", constraints?.workspace),\n resolveAuditCommand: (opts) => withWorkspace([\"npm\", \"audit\", \"--json\"], \"npm\", opts?.workspace),\n resolveDedupeCommand: (constraints) =>\n withWorkspace([\"npm\", \"dedupe\"], \"npm\", constraints?.workspace),\n};\n\nexport const pnpmDriver: PackageManagerDriver = {\n id: \"pnpm\",\n ecosystem: \"npm\",\n lockfileName: \"pnpm-lock.yaml\",\n detect: (cwd) => existsSync(join(cwd, \"pnpm-lock.yaml\")),\n resolveInstallCommand(constraints) {\n const installMode = constraints?.installMode ?? \"deterministic\";\n const frozen = constraints?.enforceFrozenLockfile ?? installMode === \"deterministic\";\n const preferOffline = constraints?.installPreferOffline ?? installMode !== \"standard\";\n const cmd = [\"pnpm\", \"install\"];\n if (frozen) cmd.push(\"--frozen-lockfile\");\n if (preferOffline) cmd.push(\"--prefer-offline\");\n return withWorkspace(cmd, \"pnpm\", constraints?.workspace);\n },\n resolveTestCommand: (constraints) =>\n withWorkspace([\"pnpm\", \"test\"], \"pnpm\", constraints?.workspace),\n resolveAuditCommand: (opts) =>\n withWorkspace([\"pnpm\", \"audit\", \"--json\"], \"pnpm\", opts?.workspace),\n resolveDedupeCommand: (constraints) =>\n withWorkspace([\"pnpm\", \"dedupe\"], \"pnpm\", constraints?.workspace),\n};\n\nexport const yarnDriver: PackageManagerDriver = {\n id: \"yarn\",\n ecosystem: \"npm\",\n lockfileName: \"yarn.lock\",\n detect: (cwd) => existsSync(join(cwd, \"yarn.lock\")),\n resolveInstallCommand(constraints, yarnMajor = 1) {\n const installMode = constraints?.installMode ?? \"deterministic\";\n const frozen = constraints?.enforceFrozenLockfile ?? installMode === \"deterministic\";\n const cmd = [\"yarn\", \"install\"];\n if (frozen) {\n if (yarnMajor >= 2) cmd.push(\"--immutable\");\n else cmd.push(\"--frozen-lockfile\");\n }\n return withWorkspace(cmd, \"yarn\", constraints?.workspace);\n },\n resolveTestCommand: (constraints) =>\n withWorkspace([\"yarn\", \"test\"], \"yarn\", constraints?.workspace),\n resolveAuditCommand: (opts) =>\n withWorkspace([\"yarn\", \"audit\", \"--json\"], \"yarn\", opts?.workspace),\n resolveDedupeCommand: (constraints) =>\n withWorkspace([\"yarn\", \"dedupe\"], \"yarn\", constraints?.workspace),\n};\n\nexport const bunDriver: PackageManagerDriver = {\n id: \"bun\",\n ecosystem: \"npm\",\n lockfileName: \"bun.lockb\",\n detect: (cwd) => existsSync(join(cwd, \"bun.lockb\")) || existsSync(join(cwd, \"bun.lock\")),\n resolveInstallCommand(constraints) {\n const installMode = constraints?.installMode ?? \"deterministic\";\n const frozen = constraints?.enforceFrozenLockfile ?? installMode === \"deterministic\";\n const cmd = [\"bun\", \"install\"];\n if (frozen) cmd.push(\"--frozen-lockfile\");\n return withWorkspace(cmd, \"bun\", constraints?.workspace);\n },\n resolveTestCommand: (constraints) =>\n withWorkspace([\"bun\", \"test\"], \"bun\", constraints?.workspace),\n resolveAuditCommand: () => [\"bun\", \"audit\", \"--json\"],\n};\n\nexport const denoDriver: PackageManagerDriver = {\n id: \"deno\",\n ecosystem: \"npm\",\n lockfileName: \"deno.lock\",\n detect: (cwd) => existsSync(join(cwd, \"deno.lock\")) || existsSync(join(cwd, \"deno.json\")),\n resolveInstallCommand(constraints) {\n const installMode = constraints?.installMode ?? \"deterministic\";\n const frozen = constraints?.enforceFrozenLockfile ?? installMode === \"deterministic\";\n const preferOffline = constraints?.installPreferOffline ?? installMode === \"prefer-offline\";\n const cmd = [\"deno\", \"install\"];\n if (frozen) cmd.push(\"--frozen\");\n if (preferOffline && !frozen) cmd.push(\"--cache-only\");\n return withWorkspace(cmd, \"deno\", constraints?.workspace);\n },\n resolveTestCommand: (constraints) =>\n withWorkspace([\"deno\", \"test\"], \"deno\", constraints?.workspace),\n resolveAuditCommand: () => {\n throw new Error(\n \"Deno does not support a native audit command. Use --input with a SARIF or npm-audit scan file instead.\",\n );\n },\n};\n\nconst driverRegistry = new Map<PackageManager, PackageManagerDriver>([\n [\"npm\", npmDriver],\n [\"pnpm\", pnpmDriver],\n [\"yarn\", yarnDriver],\n [\"bun\", bunDriver],\n [\"deno\", denoDriver],\n]);\n\nexport function getDriver(pm: PackageManager): PackageManagerDriver {\n const driver = driverRegistry.get(pm);\n if (!driver) {\n throw new Error(`Unsupported package manager: ${pm}`);\n }\n return driver;\n}\n\nexport function detectPackageManagerDriver(cwd: string): PackageManagerDriver {\n if (pnpmDriver.detect(cwd)) return pnpmDriver;\n if (yarnDriver.detect(cwd)) return yarnDriver;\n if (bunDriver.detect(cwd)) return bunDriver;\n if (denoDriver.detect(cwd)) return denoDriver;\n return npmDriver;\n}\n\nexport function registerPackageManagerDriver(driver: PackageManagerDriver): void {\n driverRegistry.set(driver.id, driver);\n}\n","import { existsSync } from \"node:fs\";\nimport { readFile } from \"node:fs/promises\";\nimport { isAbsolute, resolve, sep } from \"node:path\";\nimport type {\n PatchArtifact,\n PatchArtifactInspection,\n PatchArtifactSummary,\n} from \"../../platform/types.js\";\n\nexport const DEFAULT_PATCHES_DIR = \"./patches\";\n\nexport function resolvePatchesDir(cwd: string, patchesDir = DEFAULT_PATCHES_DIR): string {\n return isAbsolute(patchesDir) ? patchesDir : resolve(cwd, patchesDir);\n}\n\nexport function resolveArtifactPath(cwd: string, patchFilePath: string): string {\n const resolved = isAbsolute(patchFilePath) ? patchFilePath : resolve(cwd, patchFilePath);\n if (!resolved.endsWith(\".patch\")) {\n throw new Error(`patchFilePath must point to a .patch file: ${patchFilePath}`);\n }\n const patchesRoot = resolvePatchesDir(cwd);\n if (!resolved.startsWith(patchesRoot + sep)) {\n throw new Error(`patchFilePath must be inside the patches directory: ${patchFilePath}`);\n }\n return resolved;\n}\n\nexport async function readManifest(manifestFilePath: string): Promise<PatchArtifact | undefined> {\n if (!existsSync(manifestFilePath)) {\n return undefined;\n }\n\n try {\n const raw = await readFile(manifestFilePath, \"utf8\");\n const parsed = JSON.parse(raw);\n if (\n parsed === null ||\n typeof parsed !== \"object\" ||\n parsed.schemaVersion !== \"1.0\" ||\n typeof parsed.packageName !== \"string\" ||\n typeof parsed.vulnerableVersion !== \"string\" ||\n typeof parsed.patchFilePath !== \"string\" ||\n typeof parsed.patchFileName !== \"string\" ||\n typeof parsed.applied !== \"boolean\" ||\n typeof parsed.dryRun !== \"boolean\" ||\n typeof parsed.generatedAt !== \"string\"\n ) {\n return undefined;\n }\n return parsed as PatchArtifact;\n } catch {\n return undefined;\n }\n}\n\nexport function derivePatchMetadata(patchContent: string): { files: string[]; hunkCount: number } {\n const files = Array.from(\n new Set(\n patchContent\n .split(/\\r?\\n/)\n .filter((line) => line.startsWith(\"+++ b/\"))\n .map((line) => line.slice(\"+++ b/\".length)),\n ),\n );\n const hunkCount = patchContent.split(/\\r?\\n/).filter((line) => line.startsWith(\"@@ \")).length;\n\n return { files, hunkCount };\n}\n\nexport function toSummary(inspection: PatchArtifactInspection): PatchArtifactSummary {\n return {\n patchFilePath: inspection.patchFilePath,\n manifestFilePath: inspection.manifestFilePath,\n patchFileName: inspection.patchFileName,\n cveId: inspection.cveId,\n packageName: inspection.packageName,\n vulnerableVersion: inspection.vulnerableVersion,\n patchMode: inspection.patchMode,\n confidence: inspection.confidence,\n riskLevel: inspection.riskLevel,\n generatedAt: inspection.generatedAt,\n files: inspection.files,\n hunkCount: inspection.hunkCount,\n diffValid: inspection.diffValid,\n };\n}\n","import { tool } from \"ai\";\nimport type { z } from \"zod\";\n\ntype AnyZodSchema = z.ZodTypeAny;\n\nexport interface CompatToolConfig<TSchema extends AnyZodSchema, TResult> {\n description: string;\n parameters: TSchema;\n execute: (input: z.infer<TSchema>) => Promise<TResult> | TResult;\n}\n\nexport type ExecutableTool<TSchema extends AnyZodSchema, TResult> = {\n description: string;\n parameters: TSchema;\n execute: (input: z.input<TSchema>) => Promise<TResult>;\n};\n\nexport function defineTool<TSchema extends AnyZodSchema, TResult>(\n config: CompatToolConfig<TSchema, TResult>,\n): ExecutableTool<TSchema, TResult> {\n return tool(config as any) as unknown as ExecutableTool<TSchema, TResult>;\n}\n","/**\n * Tool: check-inventory\n *\n * Reads the consumer's package.json and installed dependency tree to produce\n * a flat list of installed packages and their resolved versions.\n */\nimport { defineTool } from \"./tool-compat.js\";\nimport { z } from \"zod\";\nimport { readFileSync } from \"node:fs\";\nimport { join } from \"node:path\";\nimport { execa } from \"execa\";\nimport type { InventoryPackage } from \"../../platform/types.js\";\nimport {\n detectPackageManager,\n parseListOutput,\n resolveListCommand,\n type PackageManager,\n} from \"../../platform/package-manager/index.js\";\nimport { resolveDenoInventory } from \"../../platform/package-manager/list-parser.js\";\nimport { loadPolicy } from \"../../platform/policy.js\";\nimport { findDeclaringWorkspacePackage } from \"../../platform/workspace.js\";\n\ninterface PackageJson {\n dependencies?: Record<string, string>;\n devDependencies?: Record<string, string>;\n peerDependencies?: Record<string, string>;\n}\n\nexport const checkInventoryTool = defineTool({\n description:\n \"Read the project's package.json and installed dependencies to list packages and exact versions. Must be called before checking version matches.\",\n parameters: z.object({\n cwd: z.string().describe(\"Absolute path to the consumer project's root directory\"),\n packageManager: z\n .enum([\"npm\", \"pnpm\", \"yarn\", \"bun\", \"deno\"])\n .optional()\n .describe(\"Package manager used by the target project (auto-detected if omitted)\"),\n policy: z\n .string()\n .optional()\n .describe(\"Optional path to .github/autoremediator.yml policy file\"),\n workspace: z.string().optional().describe(\"Optional workspace/package selector for monorepos\"),\n }),\n execute: async ({\n cwd,\n packageManager,\n policy,\n workspace,\n }): Promise<{ packages: InventoryPackage[]; error?: string }> => {\n let pkgJson: PackageJson;\n\n try {\n pkgJson = JSON.parse(readFileSync(join(cwd, \"package.json\"), \"utf8\")) as PackageJson;\n } catch {\n return {\n packages: [],\n error: `Could not read package.json in \"${cwd}\". Is this a Node.js project?`,\n };\n }\n\n const pm = (packageManager ?? detectPackageManager(cwd)) as PackageManager;\n const loadedPolicy = loadPolicy(cwd, policy);\n const listCommand = resolveListCommand(pm, {\n ...loadedPolicy.constraints,\n workspace: workspace ?? loadedPolicy.constraints?.workspace,\n });\n let installedVersions = new Map<string, string>();\n\n if (pm === \"deno\") {\n // Deno inventory is built from deno.lock directly, not a shell command.\n installedVersions = resolveDenoInventory(cwd);\n } else {\n try {\n const [cmd, ...args] = listCommand;\n if (cmd) {\n const listResult = await execa(cmd, args, {\n cwd,\n stdio: \"pipe\",\n reject: false,\n });\n installedVersions = parseListOutput(pm, listResult.stdout || \"\");\n }\n } catch {\n // Fallback to package.json-only view when list command fails.\n }\n }\n\n const packages: InventoryPackage[] = [];\n\n for (const [name, version] of installedVersions.entries()) {\n const declaringWorkspace = findDeclaringWorkspacePackage(cwd, name, workspace);\n const isDirect =\n Boolean(pkgJson.dependencies?.[name]) ||\n Boolean(pkgJson.devDependencies?.[name]) ||\n Boolean(pkgJson.peerDependencies?.[name]) ||\n Boolean(declaringWorkspace);\n\n packages.push({\n name,\n version,\n type: isDirect ? \"direct\" : \"transitive\",\n });\n }\n\n if (packages.length === 0) {\n // Fallback: only direct deps from package.json (best-effort versions)\n const allDeps = {\n ...pkgJson.dependencies,\n ...pkgJson.devDependencies,\n };\n for (const [name, version] of Object.entries(allDeps)) {\n const cleaned = version.replace(/^[\\^~>=<]+/, \"\").trim();\n packages.push({ name, version: cleaned, type: \"direct\" });\n }\n }\n\n return { packages };\n },\n});\n","import { existsSync, readFileSync } from \"node:fs\";\nimport { join } from \"node:path\";\nimport { parse as yamlParse } from \"yaml\";\nimport type {\n CveSeverity,\n DispositionPolicy,\n EscalationGraph,\n ExploitSignalOverridePolicy,\n PatchConfidenceThresholds,\n RemediationConstraints,\n SlaBreach,\n SlaPolicy,\n VexSuppression,\n} from \"./types.js\";\n\nexport interface AutoremediatorPolicy {\n allowMajorBumps: boolean;\n denyPackages: string[];\n allowPackages: string[];\n constraints?: RemediationConstraints;\n modelDefaults?: Partial<Record<\"remote\" | \"local\", string>>;\n providerSafetyProfile?: \"strict\" | \"relaxed\";\n requireConsensusForHighRisk?: boolean;\n consensusProvider?: \"remote\" | \"local\";\n consensusModel?: string;\n patchConfidenceThresholds?: PatchConfidenceThresholds;\n dynamicModelRouting?: boolean;\n dynamicRoutingThresholdChars?: number;\n exploitSignalOverride?: ExploitSignalOverridePolicy;\n suppressions?: VexSuppression[];\n sla?: SlaPolicy;\n skipUnreachable?: boolean;\n dispositionPolicy?: DispositionPolicy;\n containmentMode?: boolean;\n escalationGraph?: EscalationGraph;\n}\n\nexport const DEFAULT_POLICY: AutoremediatorPolicy = {\n allowMajorBumps: false,\n denyPackages: [],\n allowPackages: [],\n constraints: {\n directDependenciesOnly: false,\n preferVersionBump: false,\n installMode: \"deterministic\",\n installPreferOffline: undefined,\n enforceFrozenLockfile: undefined,\n workspace: undefined,\n },\n modelDefaults: {},\n providerSafetyProfile: \"relaxed\",\n requireConsensusForHighRisk: false,\n consensusProvider: \"remote\",\n consensusModel: undefined,\n patchConfidenceThresholds: {},\n dynamicModelRouting: false,\n dynamicRoutingThresholdChars: 18000,\n exploitSignalOverride: undefined,\n suppressions: [],\n sla: undefined,\n skipUnreachable: false,\n dispositionPolicy: undefined,\n containmentMode: false,\n escalationGraph: undefined,\n};\n\nexport function loadPolicy(cwd: string, explicitPath?: string): AutoremediatorPolicy {\n const candidate = explicitPath ?? join(cwd, \".github\", \"autoremediator.yml\");\n if (!existsSync(candidate)) return DEFAULT_POLICY;\n\n try {\n const parsed = yamlParse(readFileSync(candidate, \"utf8\")) as Partial<AutoremediatorPolicy>;\n return {\n allowMajorBumps: parsed.allowMajorBumps ?? DEFAULT_POLICY.allowMajorBumps,\n denyPackages: parsed.denyPackages ?? DEFAULT_POLICY.denyPackages,\n allowPackages: parsed.allowPackages ?? DEFAULT_POLICY.allowPackages,\n constraints: {\n directDependenciesOnly:\n parsed.constraints?.directDependenciesOnly ??\n DEFAULT_POLICY.constraints?.directDependenciesOnly ??\n false,\n preferVersionBump:\n parsed.constraints?.preferVersionBump ??\n DEFAULT_POLICY.constraints?.preferVersionBump ??\n false,\n installMode:\n parsed.constraints?.installMode ??\n DEFAULT_POLICY.constraints?.installMode ??\n \"deterministic\",\n installPreferOffline:\n parsed.constraints?.installPreferOffline ??\n DEFAULT_POLICY.constraints?.installPreferOffline,\n enforceFrozenLockfile:\n parsed.constraints?.enforceFrozenLockfile ??\n DEFAULT_POLICY.constraints?.enforceFrozenLockfile,\n workspace: parsed.constraints?.workspace ?? DEFAULT_POLICY.constraints?.workspace,\n },\n modelDefaults: {\n remote: parsed.modelDefaults?.remote ?? DEFAULT_POLICY.modelDefaults?.remote,\n local: parsed.modelDefaults?.local ?? DEFAULT_POLICY.modelDefaults?.local,\n },\n providerSafetyProfile: parsed.providerSafetyProfile ?? DEFAULT_POLICY.providerSafetyProfile,\n requireConsensusForHighRisk:\n parsed.requireConsensusForHighRisk ?? DEFAULT_POLICY.requireConsensusForHighRisk,\n consensusProvider: parsed.consensusProvider ?? DEFAULT_POLICY.consensusProvider,\n consensusModel: parsed.consensusModel ?? DEFAULT_POLICY.consensusModel,\n patchConfidenceThresholds: {\n low: parsed.patchConfidenceThresholds?.low ?? DEFAULT_POLICY.patchConfidenceThresholds?.low,\n medium:\n parsed.patchConfidenceThresholds?.medium ??\n DEFAULT_POLICY.patchConfidenceThresholds?.medium,\n high:\n parsed.patchConfidenceThresholds?.high ?? DEFAULT_POLICY.patchConfidenceThresholds?.high,\n },\n dynamicModelRouting: parsed.dynamicModelRouting ?? DEFAULT_POLICY.dynamicModelRouting,\n dynamicRoutingThresholdChars:\n parsed.dynamicRoutingThresholdChars ?? DEFAULT_POLICY.dynamicRoutingThresholdChars,\n exploitSignalOverride: parsed.exploitSignalOverride\n ? {\n kev: parsed.exploitSignalOverride.kev ?? undefined,\n epss: parsed.exploitSignalOverride.epss ?? undefined,\n }\n : undefined,\n suppressions: Array.isArray(parsed.suppressions)\n ? (parsed.suppressions as VexSuppression[])\n : DEFAULT_POLICY.suppressions,\n sla: parsed.sla\n ? {\n critical: (parsed.sla as SlaPolicy).critical,\n high: (parsed.sla as SlaPolicy).high,\n medium: (parsed.sla as SlaPolicy).medium,\n low: (parsed.sla as SlaPolicy).low,\n }\n : undefined,\n skipUnreachable:\n (parsed as AutoremediatorPolicy).skipUnreachable ?? DEFAULT_POLICY.skipUnreachable,\n dispositionPolicy:\n (parsed as AutoremediatorPolicy).dispositionPolicy ?? DEFAULT_POLICY.dispositionPolicy,\n containmentMode:\n (parsed as AutoremediatorPolicy).containmentMode ?? DEFAULT_POLICY.containmentMode,\n escalationGraph:\n (parsed as AutoremediatorPolicy).escalationGraph ?? DEFAULT_POLICY.escalationGraph,\n };\n } catch {\n return DEFAULT_POLICY;\n }\n}\n\nexport function isPackageAllowed(policy: AutoremediatorPolicy, packageName: string): boolean {\n if (policy.denyPackages.includes(packageName)) return false;\n if (policy.allowPackages.length > 0 && !policy.allowPackages.includes(packageName)) {\n return false;\n }\n return true;\n}\n\nexport function isActiveSuppression(suppression: VexSuppression): boolean {\n if (!suppression.expiresAt) return true;\n return new Date(suppression.expiresAt) > new Date();\n}\n\nexport function findSuppression(\n policy: AutoremediatorPolicy,\n cveId: string,\n): VexSuppression | undefined {\n return (policy.suppressions ?? []).find((s) => s.cveId === cveId && isActiveSuppression(s));\n}\n\nexport function loadSuppressionsFile(filePath: string): VexSuppression[] {\n try {\n const content = readFileSync(filePath, \"utf8\");\n const parsed = yamlParse(content) as { suppressions?: unknown };\n return Array.isArray(parsed?.suppressions) ? (parsed.suppressions as VexSuppression[]) : [];\n } catch {\n return [];\n }\n}\n\nexport function checkSlaBreach(\n cveId: string,\n severity: CveSeverity,\n publishedAt: string,\n slaPolicy: SlaPolicy,\n): SlaBreach | null {\n const severityKey = severity.toLowerCase() as keyof SlaPolicy;\n const deadlineHours = slaPolicy[severityKey];\n if (typeof deadlineHours !== \"number\") return null;\n\n const publishedMs = new Date(publishedAt).getTime();\n if (isNaN(publishedMs)) return null;\n\n const deadlineMs = publishedMs + deadlineHours * 60 * 60 * 1000;\n const nowMs = Date.now();\n if (nowMs <= deadlineMs) return null;\n\n const hoursOverdue = Math.round((nowMs - deadlineMs) / (60 * 60 * 1000));\n return {\n cveId,\n severity,\n publishedAt,\n deadlineAt: new Date(deadlineMs).toISOString(),\n hoursOverdue,\n };\n}\n","import { existsSync, readdirSync, readFileSync, statSync } from \"node:fs\";\nimport { join, resolve, relative } from \"node:path\";\nimport yaml from \"yaml\";\n\nexport interface WorkspacePackage {\n name: string;\n relativeDir: string;\n absoluteDir: string;\n manifestPath: string;\n manifest: {\n name?: string;\n dependencies?: Record<string, string>;\n devDependencies?: Record<string, string>;\n peerDependencies?: Record<string, string>;\n [key: string]: unknown;\n };\n}\n\n/**\n * Finds the workspace root directory by walking up from startDir until\n * pnpm-workspace.yaml or package.json with workspaces is found.\n */\nexport function findWorkspaceRoot(startDir: string): string | null {\n let curr = resolve(startDir);\n while (true) {\n if (existsSync(join(curr, \"pnpm-workspace.yaml\"))) return curr;\n const pkgPath = join(curr, \"package.json\");\n if (existsSync(pkgPath)) {\n try {\n const parsed = JSON.parse(readFileSync(pkgPath, \"utf8\")) as { workspaces?: unknown };\n if (parsed.workspaces) return curr;\n } catch {\n // Ignore JSON error\n }\n }\n const parent = resolve(curr, \"..\");\n if (parent === curr) break;\n curr = parent;\n }\n return null;\n}\n\n/**\n * Discovers all workspace package directories and parses their manifests.\n */\nexport function findWorkspacePackages(cwd: string): WorkspacePackage[] {\n const rootCwd = findWorkspaceRoot(cwd) ?? resolve(cwd);\n const packages: WorkspacePackage[] = [];\n const packageGlobs: string[] = [];\n\n // 1. Check pnpm-workspace.yaml\n const pnpmWorkspaceFile = join(rootCwd, \"pnpm-workspace.yaml\");\n if (existsSync(pnpmWorkspaceFile)) {\n try {\n const content = readFileSync(pnpmWorkspaceFile, \"utf8\");\n const parsed = yaml.parse(content) as { packages?: string[] } | null;\n if (Array.isArray(parsed?.packages)) {\n packageGlobs.push(...parsed.packages);\n }\n } catch {\n // Ignore parse errors\n }\n }\n\n // 2. Check root package.json workspaces\n const rootPkgFile = join(rootCwd, \"package.json\");\n if (existsSync(rootPkgFile)) {\n try {\n const rootPkg = JSON.parse(readFileSync(rootPkgFile, \"utf8\")) as {\n workspaces?: string[] | { packages?: string[] };\n };\n if (Array.isArray(rootPkg.workspaces)) {\n packageGlobs.push(...rootPkg.workspaces);\n } else if (Array.isArray(rootPkg.workspaces?.packages)) {\n packageGlobs.push(...rootPkg.workspaces.packages);\n }\n } catch {\n // Ignore parse errors\n }\n }\n\n // 3. Check deno.json workspace\n const denoJsonFile = join(rootCwd, \"deno.json\");\n if (existsSync(denoJsonFile)) {\n try {\n const denoJson = JSON.parse(readFileSync(denoJsonFile, \"utf8\")) as {\n workspace?: string[];\n };\n if (Array.isArray(denoJson.workspace)) {\n packageGlobs.push(...denoJson.workspace);\n }\n } catch {\n // Ignore parse errors\n }\n }\n\n if (packageGlobs.length === 0) {\n return packages;\n }\n\n const seenDirs = new Set<string>();\n\n for (const glob of packageGlobs) {\n const cleanGlob = glob.trim().replace(/\\/+$/, \"\");\n if (!cleanGlob || cleanGlob.startsWith(\"!\")) continue;\n\n if (cleanGlob.endsWith(\"/*\")) {\n const parentDir = join(rootCwd, cleanGlob.slice(0, -2));\n if (!existsSync(parentDir)) continue;\n try {\n const entries = readdirSync(parentDir);\n for (const entry of entries) {\n if (entry.startsWith(\".\") || entry === \"node_modules\") continue;\n const subDir = join(parentDir, entry);\n try {\n if (statSync(subDir).isDirectory()) {\n addWorkspacePackage(rootCwd, subDir, packages, seenDirs);\n }\n } catch {\n // Ignore stat errors\n }\n }\n } catch {\n // Ignore readdir errors\n }\n } else {\n const directDir = join(rootCwd, cleanGlob);\n if (existsSync(directDir)) {\n try {\n if (statSync(directDir).isDirectory()) {\n addWorkspacePackage(rootCwd, directDir, packages, seenDirs);\n }\n } catch {\n // Ignore\n }\n }\n }\n }\n\n return packages;\n}\n\nfunction addWorkspacePackage(\n rootCwd: string,\n dir: string,\n out: WorkspacePackage[],\n seen: Set<string>,\n): void {\n const norm = resolve(dir);\n if (seen.has(norm)) return;\n seen.add(norm);\n\n const manifestPath = join(dir, \"package.json\");\n if (!existsSync(manifestPath)) return;\n\n try {\n const content = readFileSync(manifestPath, \"utf8\");\n const manifest = JSON.parse(content) as WorkspacePackage[\"manifest\"];\n out.push({\n name: manifest.name ?? relative(rootCwd, dir),\n relativeDir: relative(rootCwd, dir),\n absoluteDir: norm,\n manifestPath,\n manifest,\n });\n } catch {\n // Ignore invalid manifests\n }\n}\n\n/**\n * Finds the workspace package that directly declares the given dependency name.\n * If `filterWorkspace` is provided, restricts search to that workspace.\n */\nexport function findDeclaringWorkspacePackage(\n cwd: string,\n dependencyName: string,\n filterWorkspace?: string,\n): WorkspacePackage | null {\n const workspaces = findWorkspacePackages(cwd);\n if (workspaces.length === 0) return null;\n\n const matchesFilter = (wp: WorkspacePackage): boolean => {\n if (!filterWorkspace) return true;\n const filter = filterWorkspace.trim();\n return (\n wp.name === filter ||\n wp.relativeDir === filter ||\n wp.relativeDir.replace(/\\\\/g, \"/\") === filter.replace(/\\\\/g, \"/\")\n );\n };\n\n for (const wp of workspaces) {\n if (!matchesFilter(wp)) continue;\n const isDeclared =\n Boolean(wp.manifest.dependencies?.[dependencyName]) ||\n Boolean(wp.manifest.devDependencies?.[dependencyName]) ||\n Boolean(wp.manifest.peerDependencies?.[dependencyName]);\n\n if (isDeclared) {\n return wp;\n }\n }\n\n return null;\n}\n","import type {\n PatchArtifactQueryOptions,\n PatchArtifactValidationReport,\n PatchValidationPhase,\n} from \"../../platform/types.js\";\nimport { detectPackageManager } from \"../../platform/package-manager/index.js\";\nimport { checkInventoryTool } from \"../../remediation/tools/check-inventory.js\";\nimport { inspectPatchArtifact } from \"./inspection.js\";\n\nexport async function validatePatchArtifact(\n patchFilePath: string,\n options: PatchArtifactQueryOptions = {},\n): Promise<PatchArtifactValidationReport> {\n const inspection = await inspectPatchArtifact(patchFilePath, options);\n const validationPhases: PatchValidationPhase[] = [\n {\n phase: \"diff-format\",\n passed: inspection.diffValid,\n error: inspection.diffValid ? undefined : inspection.formatError,\n message: inspection.diffValid ? \"Patch content is a valid unified diff.\" : undefined,\n },\n ];\n\n if (!inspection.exists) {\n return {\n patchFilePath: inspection.patchFilePath,\n manifestFilePath: inspection.manifestFilePath,\n exists: false,\n manifestFound: false,\n diffValid: false,\n formatError: inspection.formatError,\n driftDetected: false,\n validationPhases,\n };\n }\n\n const manifest = inspection.manifest;\n const manifestFound = Boolean(manifest);\n\n if (!manifest) {\n validationPhases.push({\n phase: \"manifest-write\",\n passed: false,\n error: \"No patch manifest found for this patch artifact.\",\n });\n\n return {\n patchFilePath: inspection.patchFilePath,\n manifestFilePath: inspection.manifestFilePath,\n exists: true,\n manifestFound,\n diffValid: inspection.diffValid,\n formatError: inspection.formatError,\n driftDetected: false,\n validationPhases,\n };\n }\n\n validationPhases.push({\n phase: \"manifest-write\",\n passed: true,\n message: \"Patch manifest is present.\",\n });\n\n const cwd = options.cwd ?? process.cwd();\n const packageManager = options.packageManager ?? detectPackageManager(cwd);\n const inventory = (await (checkInventoryTool as any).execute({\n cwd,\n packageManager,\n })) as {\n error?: string;\n packages?: Array<{ name: string; version: string }>;\n };\n\n if (inventory.error) {\n validationPhases.push({\n phase: \"drift\",\n passed: false,\n error: inventory.error,\n });\n\n return {\n patchFilePath: inspection.patchFilePath,\n manifestFilePath: inspection.manifestFilePath,\n exists: true,\n manifestFound,\n diffValid: inspection.diffValid,\n formatError: inspection.formatError,\n driftDetected: false,\n cveId: manifest.cveId,\n packageName: manifest.packageName,\n vulnerableVersion: manifest.vulnerableVersion,\n validationPhases,\n };\n }\n\n const matchingPackages = (inventory.packages ?? []).filter(\n (pkg) => pkg.name === manifest.packageName,\n );\n const installedVersion = matchingPackages[0]?.version;\n const inventoryMatch = matchingPackages.some((pkg) => pkg.version === manifest.vulnerableVersion);\n const driftDetected = matchingPackages.length > 0 && !inventoryMatch;\n\n validationPhases.push({\n phase: \"drift\",\n passed: !driftDetected,\n message:\n matchingPackages.length === 0\n ? `Package ${manifest.packageName} is not currently installed.`\n : inventoryMatch\n ? `Installed version matches manifest target ${manifest.vulnerableVersion}.`\n : `Installed version ${installedVersion} does not match manifest target ${manifest.vulnerableVersion}.`,\n error: driftDetected\n ? \"Patch manifest does not match the installed dependency version.\"\n : undefined,\n });\n\n return {\n patchFilePath: inspection.patchFilePath,\n manifestFilePath: inspection.manifestFilePath,\n exists: true,\n manifestFound,\n diffValid: inspection.diffValid,\n formatError: inspection.formatError,\n driftDetected,\n cveId: manifest.cveId,\n packageName: manifest.packageName,\n vulnerableVersion: manifest.vulnerableVersion,\n installedVersion,\n inventoryMatch,\n validationPhases,\n };\n}\n","import { existsSync } from \"node:fs\";\nimport { readFile, rm, writeFile } from \"node:fs/promises\";\nimport { join } from \"node:path\";\nimport { execa } from \"execa\";\nimport { evaluatePackage } from \"../../remediation/evaluate-package.js\";\nimport {\n detectPackageManager,\n resolveInstallCommand,\n resolveTestCommand,\n} from \"../../platform/package-manager/index.js\";\nimport type {\n PatchReconcileOptions,\n PatchReconcileReport,\n PatchReconcileResult,\n} from \"../../platform/types.js\";\nimport { inspectPatchArtifact, listPatchArtifacts } from \"./inspection.js\";\n\n/**\n * Reconciles active patch artifacts in patchesDir against upstream registries.\n * If safe upstream releases have been published, the patches can be retired and packages upgraded.\n */\nexport async function reconcilePatchArtifacts(\n options: PatchReconcileOptions = {},\n): Promise<PatchReconcileReport> {\n const cwd = options.cwd ?? process.cwd();\n const pm = options.packageManager ?? detectPackageManager(cwd);\n\n const summaries = await listPatchArtifacts(options);\n const results: PatchReconcileResult[] = [];\n\n for (const summary of summaries) {\n const inspection = await inspectPatchArtifact(summary.patchFilePath, options);\n let packageName = inspection.packageName;\n let vulnerableVersion = inspection.vulnerableVersion;\n const cveId = inspection.cveId;\n\n if (!packageName && summary.patchFileName) {\n const basename = summary.patchFileName.replace(/\\.patch$/, \"\");\n const plusIdx = basename.lastIndexOf(\"+\");\n if (plusIdx > 0) {\n let rawPkg = basename.slice(0, plusIdx);\n vulnerableVersion = basename.slice(plusIdx + 1);\n if (rawPkg.includes(\"+\")) {\n rawPkg = \"@\" + rawPkg.replace(\"+\", \"/\");\n }\n packageName = rawPkg;\n } else {\n packageName = basename;\n }\n }\n\n if (!packageName) {\n results.push({\n patchFilePath: summary.patchFilePath,\n packageName: \"unknown\",\n cveId,\n status: \"patch-retained\",\n reason: \"Cannot determine package name from patch artifact.\",\n });\n continue;\n }\n\n let safeUpgradeVersion: string | undefined;\n try {\n const evaluation = await evaluatePackage(packageName, {\n version: vulnerableVersion,\n enrichIntelligence: false,\n });\n\n if (cveId) {\n const vuln = evaluation.vulnerabilities.find(\n (v) => v.cveId.toLowerCase() === cveId.toLowerCase(),\n );\n if (vuln?.safeUpgradeVersion) {\n safeUpgradeVersion = vuln.safeUpgradeVersion;\n }\n } else {\n safeUpgradeVersion = evaluation.vulnerabilities.find(\n (v) => v.safeUpgradeVersion,\n )?.safeUpgradeVersion;\n }\n } catch {\n // Ignore evaluation query errors\n }\n\n if (!safeUpgradeVersion) {\n results.push({\n patchFilePath: summary.patchFilePath,\n packageName,\n cveId,\n installedVersion: vulnerableVersion,\n status: \"patch-retained\",\n reason: \"No safe upstream release exists yet; patch remains necessary.\",\n });\n continue;\n }\n\n if (!options.autoApply) {\n results.push({\n patchFilePath: summary.patchFilePath,\n packageName,\n cveId,\n installedVersion: vulnerableVersion,\n safeUpstreamVersion: safeUpgradeVersion,\n status: \"safe-version-available\",\n reason: `Safe upstream version ${safeUpgradeVersion} is available. Re-run with autoApply: true or --auto-apply to upgrade.`,\n });\n continue;\n }\n\n try {\n const pkgJsonPath = join(cwd, \"package.json\");\n if (existsSync(pkgJsonPath)) {\n const pkgJson = JSON.parse(await readFile(pkgJsonPath, \"utf8\")) as Record<string, any>;\n let updated = false;\n\n const depSections = [\n \"dependencies\",\n \"devDependencies\",\n \"peerDependencies\",\n \"optionalDependencies\",\n ];\n for (const depSection of depSections) {\n if (pkgJson[depSection] && pkgJson[depSection][packageName]) {\n pkgJson[depSection][packageName] = `^${safeUpgradeVersion}`;\n updated = true;\n }\n }\n\n if (pkgJson.pnpm?.patchedDependencies) {\n for (const key of Object.keys(pkgJson.pnpm.patchedDependencies)) {\n if (key.startsWith(`${packageName}@`)) {\n delete pkgJson.pnpm.patchedDependencies[key];\n updated = true;\n }\n }\n }\n\n if (updated) {\n await writeFile(pkgJsonPath, JSON.stringify(pkgJson, null, 2) + \"\\n\", \"utf8\");\n }\n }\n\n await rm(summary.patchFilePath, { force: true });\n if (inspection.manifestFilePath) {\n await rm(inspection.manifestFilePath, { force: true });\n }\n\n const installCmd = resolveInstallCommand(pm);\n await execa(installCmd[0], installCmd.slice(1), { cwd, reject: false });\n\n if (options.runTests) {\n const testCmd = resolveTestCommand(pm);\n await execa(testCmd[0], testCmd.slice(1), { cwd, reject: false });\n }\n\n results.push({\n patchFilePath: summary.patchFilePath,\n packageName,\n cveId,\n installedVersion: vulnerableVersion,\n safeUpstreamVersion: safeUpgradeVersion,\n status: \"upgraded\",\n reason: `Successfully upgraded to ${safeUpgradeVersion} and retired patch artifact.`,\n });\n } catch (err) {\n results.push({\n patchFilePath: summary.patchFilePath,\n packageName,\n cveId,\n installedVersion: vulnerableVersion,\n safeUpstreamVersion: safeUpgradeVersion,\n status: \"error\",\n reason: err instanceof Error ? err.message : String(err),\n });\n }\n }\n\n const reconciledCount = results.filter((r) => r.status === \"upgraded\").length;\n const retainedCount = results.filter(\n (r) => r.status === \"patch-retained\" || r.status === \"safe-version-available\",\n ).length;\n\n return {\n reconciled: results,\n reconciledCount,\n retainedCount,\n };\n}\n","/**\n * Package pre-installation security evaluator\n *\n * Used to evaluate security posture of an npm package before installing or updating it.\n * Queries OSV for known vulnerabilities, enriches with EPSS and CISA KEV exploit telemetry,\n * and recommends safe upgrade targets.\n */\nimport semver from \"semver\";\nimport { queryOsvPackage, parseOsvVuln } from \"../intelligence/sources/osv.js\";\nimport { fetchEpss } from \"../intelligence/sources/epss.js\";\nimport { fetchCisaKevFeed, findKevEntry } from \"../intelligence/sources/cisa-kev.js\";\nimport { fetchPackageVersions, findSafeUpgradeVersion } from \"../intelligence/sources/registry.js\";\nimport type {\n EvaluatePackageOptions,\n PackageEvaluationReport,\n VulnerabilityEvaluationEntry,\n} from \"../platform/types.js\";\n\nexport async function evaluatePackage(\n packageName: string,\n options: EvaluatePackageOptions = {},\n): Promise<PackageEvaluationReport> {\n const version = options.version?.trim();\n const enrich = options.enrichIntelligence !== false;\n\n let versions: string[] = [];\n let latestVersion: string | undefined;\n\n try {\n versions = await fetchPackageVersions(packageName);\n if (versions.length > 0) {\n const valid = versions.filter((v) => semver.valid(v)).sort((a, b) => semver.compare(a, b));\n latestVersion = valid[valid.length - 1];\n }\n } catch {\n // Registry lookup failure shouldn't abort OSV checks\n }\n\n let rawVulns: Awaited<ReturnType<typeof queryOsvPackage>> = [];\n try {\n rawVulns = await queryOsvPackage(packageName, version);\n } catch {\n rawVulns = [];\n }\n\n // Load CISA KEV feed if enrichment is enabled\n let kevFeed: Awaited<ReturnType<typeof fetchCisaKevFeed>> | null = null;\n if (enrich) {\n try {\n kevFeed = await fetchCisaKevFeed();\n } catch {\n kevFeed = null;\n }\n }\n\n const entries: VulnerabilityEvaluationEntry[] = [];\n\n for (const raw of rawVulns) {\n const cveDetails = parseOsvVuln(raw);\n const affected = cveDetails.affectedPackages.find(\n (p) => p.name.toLowerCase() === packageName.toLowerCase(),\n );\n\n // If a specific version was requested, verify semver matching\n if (version && affected?.vulnerableRange) {\n const cleanVer = semver.clean(version) || version;\n if (semver.valid(cleanVer) && !semver.satisfies(cleanVer, affected.vulnerableRange)) {\n continue;\n }\n }\n\n let inCisaKev = false;\n let epssScore: number | undefined;\n let epssPercentile: number | undefined;\n\n if (enrich && cveDetails.id.startsWith(\"CVE-\")) {\n if (kevFeed) {\n inCisaKev = Boolean(findKevEntry(kevFeed, cveDetails.id));\n }\n try {\n const epss = await fetchEpss(cveDetails.id);\n if (epss) {\n epssScore = Number.parseFloat(epss.epss);\n epssPercentile = Number.parseFloat(epss.percentile);\n }\n } catch {\n // Soft fail on individual EPSS queries\n }\n }\n\n let safeUpgradeVersion: string | undefined;\n if (affected?.firstPatchedVersion) {\n try {\n const safe = await findSafeUpgradeVersion(\n packageName,\n version || \"0.0.0\",\n affected.firstPatchedVersion,\n );\n safeUpgradeVersion = safe ?? affected.firstPatchedVersion;\n } catch {\n safeUpgradeVersion = affected.firstPatchedVersion;\n }\n }\n\n entries.push({\n cveId: cveDetails.id,\n severity: cveDetails.severity,\n summary: cveDetails.summary,\n vulnerableRange: affected?.vulnerableRange,\n firstPatchedVersion: affected?.firstPatchedVersion,\n safeUpgradeVersion,\n epssScore,\n epssPercentile,\n inCisaKev,\n references: cveDetails.references,\n });\n }\n\n const isVulnerable = entries.length > 0;\n let verdict: PackageEvaluationReport[\"verdict\"] = \"safe\";\n\n if (isVulnerable) {\n const hasKevOrHighEpss = entries.some((e) => e.inCisaKev || (e.epssScore && e.epssScore > 0.5));\n const hasHighOrCritical = entries.some(\n (e) => e.severity === \"CRITICAL\" || e.severity === \"HIGH\",\n );\n\n if (hasKevOrHighEpss) {\n verdict = \"actively-exploited\";\n } else if (hasHighOrCritical) {\n verdict = \"vulnerable\";\n } else {\n verdict = \"caution\";\n }\n }\n\n // Determine recommended safe version\n let recommendedVersion: string | undefined;\n if (isVulnerable) {\n const upgradeCandidates = entries\n .map((e) => e.safeUpgradeVersion)\n .filter((v): v is string => Boolean(v && semver.valid(v)))\n .sort((a, b) => semver.compare(a, b));\n\n recommendedVersion = upgradeCandidates[upgradeCandidates.length - 1] || latestVersion;\n } else {\n recommendedVersion = version || latestVersion;\n }\n\n const summary = isVulnerable\n ? `Package \"${packageName}${version ? `@${version}` : \"\"}\" has ${entries.length} known vulnerability(ies) (verdict: ${verdict}). Recommended safe version: ${recommendedVersion || \"none\"}.`\n : `Package \"${packageName}${version ? `@${version}` : \"\"}\" has no known vulnerabilities. Safe to install.`;\n\n return {\n schemaVersion: \"1.0\",\n packageName,\n evaluatedVersion: version,\n isVulnerable,\n verdict,\n summary,\n vulnerabilities: entries,\n recommendedVersion,\n latestVersion,\n generatedAt: new Date().toISOString(),\n };\n}\n","/**\n * Shared HTTP client wrapper for all non-SDK external API calls.\n *\n * Provides a consistent interface for JSON API calls with:\n * - Unified error handling and logging\n * - Timeout and retry semantics\n * - Request/response validation\n * - No external dependencies (uses native fetch)\n *\n * Used for: OSV, CVE Services, npm registry, EPSS, deps.dev, Scorecard.\n */\n\nexport interface HttpClientRequest {\n url: string | URL;\n method?: \"GET\" | \"POST\" | \"PUT\" | \"DELETE\";\n headers?: Record<string, string>;\n body?: unknown;\n timeout?: number;\n}\n\nexport interface HttpClientResponse<T = unknown> {\n status: number;\n ok: boolean;\n data: T;\n text: string;\n}\n\nconst DEFAULT_TIMEOUT_MS = 10_000;\n\nasync function requestWithTimeout(\n url: string | URL,\n init: RequestInit,\n timeoutMs: number,\n): Promise<Response> {\n const controller = new AbortController();\n const timeoutId = setTimeout(() => controller.abort(), timeoutMs);\n\n try {\n return await fetch(url, { ...init, signal: controller.signal });\n } finally {\n clearTimeout(timeoutId);\n }\n}\n\n/**\n * Execute an HTTP request with timeout, error handling, and response parsing.\n *\n * @param request - HTTP request configuration\n * @returns Parsed response with status, ok flag, and data\n * @throws HttpError on network failure or timeout (caught errors are logged and safe to continue)\n */\nexport async function httpClient(request: HttpClientRequest): Promise<HttpClientResponse> {\n const { url, method = \"GET\", headers = {}, body, timeout = DEFAULT_TIMEOUT_MS } = request;\n\n const init: RequestInit = {\n method,\n headers: {\n Accept: \"application/json\",\n ...headers,\n },\n };\n\n if (body !== undefined) {\n init.body = typeof body === \"string\" ? body : JSON.stringify(body);\n const headersObj = (init.headers ?? {}) as Record<string, string>;\n if (!headersObj[\"Content-Type\"]) {\n headersObj[\"Content-Type\"] = \"application/json\";\n }\n init.headers = headersObj;\n }\n\n try {\n const res = await requestWithTimeout(url, init, timeout);\n\n // Cap response size before reading to prevent memory exhaustion from\n // malicious or compromised intelligence sources.\n const MAX_RESPONSE_BYTES = 10 * 1024 * 1024; // 10 MB\n const contentLength = res.headers?.get?.(\"content-length\") ?? null;\n if (contentLength && parseInt(contentLength, 10) > MAX_RESPONSE_BYTES) {\n throw new HttpError(`Response too large (content-length: ${contentLength})`, \"HTTP_ERROR\");\n }\n\n const text = await res.text();\n if (Buffer.byteLength(text) > MAX_RESPONSE_BYTES) {\n throw new HttpError(\"Response body exceeds 10 MB limit\", \"HTTP_ERROR\");\n }\n\n // Parse JSON if response has content, otherwise return empty object\n let data: unknown;\n try {\n data = text ? JSON.parse(text) : {};\n } catch {\n // Response is not JSON; store as-is\n data = text;\n }\n\n return {\n status: res.status,\n ok: res.ok,\n data,\n text,\n };\n } catch (err) {\n // Timeout or network error\n const errorMsg = err instanceof Error ? err.message : String(err);\n if (errorMsg.includes(\"AbortError\")) {\n throw new HttpError(`Request timeout after ${timeout}ms`, \"TIMEOUT\");\n }\n throw new HttpError(`Network error: ${errorMsg}`, \"NETWORK_ERROR\");\n }\n}\n\n/**\n * Execute an HTTP request and throw if response is not ok.\n * Returns parsed JSON data on success.\n */\nexport async function httpClientJson<T = unknown>(request: HttpClientRequest): Promise<T> {\n const res = await httpClient(request);\n if (!res.ok) {\n throw new HttpError(`HTTP ${res.status}: ${res.text}`, \"HTTP_ERROR\");\n }\n return res.data as T;\n}\n\n/**\n * Custom error class for HTTP client failures.\n */\nexport class HttpError extends Error {\n constructor(\n message: string,\n public readonly code: \"TIMEOUT\" | \"NETWORK_ERROR\" | \"HTTP_ERROR\",\n ) {\n super(message);\n this.name = \"HttpError\";\n }\n}\n","/**\n * OSV API client (https://osv.dev)\n *\n * Used as the primary source for CVE → affected npm package mapping.\n * No auth required. SEMVER event ranges are machine-readable.\n * Uses shared HTTP client for consistent error handling and timeouts.\n */\nimport type { AffectedPackage, CveDetails } from \"../../platform/types.js\";\nimport { httpClient } from \"../../platform/http-client.js\";\n\nconst OSV_BASE = \"https://api.osv.dev/v1\";\n\n// ---------------------------------------------------------------------------\n// Raw OSV response types\n// ---------------------------------------------------------------------------\n\ninterface OsvSemverEvent {\n introduced?: string;\n fixed?: string;\n last_affected?: string;\n limit?: string;\n}\n\ninterface OsvRange {\n type: \"SEMVER\" | \"GIT\" | \"ECOSYSTEM\";\n events: OsvSemverEvent[];\n repo?: string;\n}\n\ninterface OsvAffected {\n package: {\n name: string;\n ecosystem: string;\n purl?: string;\n };\n ranges?: OsvRange[];\n versions?: string[];\n database_specific?: Record<string, unknown>;\n ecosystem_specific?: Record<string, unknown>;\n}\n\ninterface OsvVulnerability {\n id: string;\n aliases?: string[];\n summary?: string;\n details?: string;\n severity?: Array<{\n type: string;\n score: string;\n }>;\n affected?: OsvAffected[];\n references?: Array<{ type: string; url: string }>;\n schema_version?: string;\n modified?: string;\n published?: string;\n}\n\n// ---------------------------------------------------------------------------\n// Public API\n// ---------------------------------------------------------------------------\n\n/**\n * Fetch a vulnerability by CVE ID (or any OSV/GHSA ID).\n * Returns null if the CVE is not found in OSV.\n */\nexport async function fetchOsvVuln(cveId: string): Promise<OsvVulnerability | null> {\n const url = `${OSV_BASE}/vulns/${encodeURIComponent(cveId)}`;\n\n try {\n const res = await httpClient({ url });\n\n if (res.status === 404) return null;\n if (!res.ok) {\n throw new Error(`OSV API error ${res.status} for ${cveId}: ${res.text}`);\n }\n\n return res.data as OsvVulnerability;\n } catch (err) {\n // If httpClient throws (timeout, network error), convert to HTTP error\n if (err instanceof Error) {\n throw new Error(`OSV API error for ${cveId}: ${err.message}`);\n }\n throw err;\n }\n}\n\n/**\n * Query OSV for all vulnerabilities affecting a specific npm package and optional version.\n */\nexport async function queryOsvPackage(\n packageName: string,\n version?: string,\n): Promise<OsvVulnerability[]> {\n const url = `${OSV_BASE}/query`;\n const body: Record<string, unknown> = {\n package: {\n name: packageName,\n ecosystem: \"npm\",\n },\n };\n if (version) {\n body.version = version;\n }\n\n try {\n const res = await httpClient({\n url,\n method: \"POST\",\n body,\n headers: { \"Content-Type\": \"application/json\" },\n });\n\n if (res.status === 404) return [];\n if (!res.ok) {\n throw new Error(`OSV API error ${res.status} for query \"${packageName}\": ${res.text}`);\n }\n\n const data = res.data as { vulns?: OsvVulnerability[] };\n return data.vulns ?? [];\n } catch (err) {\n if (err instanceof Error) {\n throw new Error(`OSV API error for query \"${packageName}\": ${err.message}`);\n }\n throw err;\n }\n}\n\n/**\n * Convert an OSV SEMVER range event array to a semver range string.\n * OSV uses ordered [introduced, fixed) events.\n * e.g. [{ introduced: \"0\" }, { fixed: \"4.17.21\" }] → \">=0.0.0 <4.17.21\"\n */\nfunction osvEventsToSemverRange(events: OsvSemverEvent[]): string {\n const parts: string[] = [];\n\n for (const event of events) {\n if (event.introduced !== undefined) {\n const v = event.introduced === \"0\" ? \"0.0.0\" : event.introduced;\n parts.push(`>=${v}`);\n }\n if (event.fixed !== undefined) {\n parts.push(`<${event.fixed}`);\n }\n if (event.last_affected !== undefined) {\n parts.push(`<=${event.last_affected}`);\n }\n }\n\n return parts.join(\" \") || \">=0.0.0\";\n}\n\n/**\n * Parse an OSV vulnerability into autoremediator's CveDetails shape,\n * filtering affected entries to npm ecosystem only.\n */\nexport function parseOsvVuln(vuln: OsvVulnerability): CveDetails {\n const npmAffected: AffectedPackage[] = [];\n\n for (const affected of vuln.affected ?? []) {\n const ecosystem = affected.package?.ecosystem;\n const packageName = affected.package?.name;\n if (!ecosystem || typeof ecosystem !== \"string\") continue;\n if (!packageName || typeof packageName !== \"string\") continue;\n if (ecosystem.toLowerCase() !== \"npm\") continue;\n\n // Find the best SEMVER range\n const semverRange = affected.ranges?.find((r) => r.type === \"SEMVER\");\n const vulnerableRange = semverRange ? osvEventsToSemverRange(semverRange.events) : \">=0.0.0\";\n\n // Derive firstPatchedVersion from the \"fixed\" event\n const fixedEvent = semverRange?.events.find((e) => e.fixed !== undefined);\n\n npmAffected.push({\n name: packageName,\n ecosystem: \"npm\",\n vulnerableRange,\n firstPatchedVersion: fixedEvent?.fixed,\n source: \"osv\",\n });\n }\n\n // Best-effort severity from CVSS score string (e.g. \"CVSS:3.1/.../7.5\")\n const severity = deriveSeverity(vuln.severity);\n\n return {\n id: vuln.id,\n summary: vuln.summary ?? vuln.details ?? \"No summary available.\",\n severity,\n references: vuln.references?.map((r) => r.url) ?? [],\n affectedPackages: npmAffected,\n };\n}\n\nfunction deriveSeverity(severityEntries?: OsvVulnerability[\"severity\"]): CveDetails[\"severity\"] {\n if (!severityEntries?.length) return \"UNKNOWN\";\n\n // Prefer CVSS_V3 type\n const cvssEntry = severityEntries.find((s) => s.type === \"CVSS_V3\") ?? severityEntries[0];\n\n // Extract base score from vector string, e.g. \"CVSS:3.1/AV:N/AC:L/.../7.5/...\"\n const scoreMatch = cvssEntry.score.match(/(\\d+\\.\\d+)$/);\n if (scoreMatch) {\n const score = parseFloat(scoreMatch[1]);\n if (score >= 9.0) return \"CRITICAL\";\n if (score >= 7.0) return \"HIGH\";\n if (score >= 4.0) return \"MEDIUM\";\n return \"LOW\";\n }\n\n return \"UNKNOWN\";\n}\n\n/** High-level convenience: fetch + parse */\nexport async function lookupCveOsv(cveId: string): Promise<CveDetails | null> {\n const vuln = await fetchOsvVuln(cveId);\n if (!vuln) return null;\n return parseOsvVuln(vuln);\n}\n","import type { LanguageModel } from \"ai\";\nimport type { PatchConfidenceThresholds, PatchRiskLevel, RemediateOptions } from \"./types.js\";\nimport { loadPolicy } from \"./policy.js\";\n\nexport type SupportedProvider = \"remote\" | \"local\";\n\ninterface ModelRoutingContext {\n inputChars?: number;\n}\n\ninterface RemoteAdapterModule {\n [key: string]: unknown;\n}\n\ninterface RemoteModelFactory {\n (options: { apiKey: string }): (modelName: string) => LanguageModel;\n}\n\nexport function resolveProvider(options: RemediateOptions = {}): SupportedProvider {\n const raw = options.llmProvider ?? process.env.AUTOREMEDIATOR_LLM_PROVIDER ?? \"remote\";\n if (raw !== \"remote\" && raw !== \"local\") {\n throw new Error(\n `Unsupported LLM provider \"${raw}\". Set AUTOREMEDIATOR_LLM_PROVIDER to \"remote\" or \"local\".`,\n );\n }\n return raw;\n}\n\nexport function resolveModelName(\n provider: SupportedProvider,\n options: RemediateOptions = {},\n routing: ModelRoutingContext = {},\n): string {\n if (options.model) return options.model;\n if (process.env.AUTOREMEDIATOR_MODEL) return process.env.AUTOREMEDIATOR_MODEL;\n\n const cwd = options.cwd ?? process.cwd();\n const policy = loadPolicy(cwd, options.policy);\n\n const providerEnvModel =\n provider === \"remote\"\n ? process.env.AUTOREMEDIATOR_MODEL_REMOTE\n : process.env.AUTOREMEDIATOR_MODEL_LOCAL;\n if (providerEnvModel) return providerEnvModel;\n\n const policyPinnedModel =\n provider === \"remote\" ? policy.modelDefaults?.remote : policy.modelDefaults?.local;\n if (policyPinnedModel) return policyPinnedModel;\n\n const defaults: Record<SupportedProvider, string> = {\n remote: \"remote-default\",\n local: \"local\",\n };\n\n const routingEnabled = options.dynamicModelRouting ?? policy.dynamicModelRouting ?? false;\n const threshold =\n options.dynamicRoutingThresholdChars ?? policy.dynamicRoutingThresholdChars ?? 18000;\n\n if (\n provider === \"remote\" &&\n routingEnabled &&\n typeof routing.inputChars === \"number\" &&\n routing.inputChars >= threshold\n ) {\n return process.env.AUTOREMEDIATOR_MODEL_REMOTE_LARGE ?? \"remote-large\";\n }\n\n return defaults[provider];\n}\n\nasync function loadRemoteFactory(): Promise<RemoteModelFactory> {\n const moduleName = process.env.AUTOREMEDIATOR_REMOTE_CLIENT_MODULE;\n const exportName = process.env.AUTOREMEDIATOR_REMOTE_CLIENT_FACTORY ?? \"createRemoteClient\";\n\n if (!moduleName) {\n throw new Error(\n \"AUTOREMEDIATOR_REMOTE_CLIENT_MODULE is required for remote provider model loading.\",\n );\n }\n\n // Reject relative paths and non-identifier module specifiers to prevent\n // loading arbitrary local files via path traversal.\n if (\n moduleName.startsWith(\"./\") ||\n moduleName.startsWith(\"../\") ||\n moduleName.startsWith(\"/\") ||\n moduleName.startsWith(\"file:\")\n ) {\n throw new Error(\n `AUTOREMEDIATOR_REMOTE_CLIENT_MODULE must be a package name, not a file path: ${moduleName}`,\n );\n }\n\n const loaded = (await import(moduleName)) as RemoteAdapterModule;\n const factory = loaded[exportName];\n if (typeof factory !== \"function\") {\n throw new Error(\n `Remote client factory \"${exportName}\" was not found in module \"${moduleName}\".`,\n );\n }\n\n return factory as RemoteModelFactory;\n}\n\nexport async function createModel(\n options: RemediateOptions = {},\n routing: ModelRoutingContext = {},\n): Promise<LanguageModel> {\n const provider = resolveProvider(options);\n\n if (provider === \"local\") {\n throw new Error(\n \"Local provider does not create a language model. Use the deterministic pipeline path instead.\",\n );\n }\n\n const apiKey = process.env.AUTOREMEDIATOR_REMOTE_API_KEY;\n if (!apiKey) {\n throw new Error(\n \"AUTOREMEDIATOR_REMOTE_API_KEY environment variable is required for remote provider.\",\n );\n }\n\n const modelName = resolveModelName(provider, options, routing);\n const createRemoteClient = await loadRemoteFactory();\n const remoteClient = createRemoteClient({ apiKey });\n return remoteClient(modelName);\n}\n\nexport function getPatchConfidenceThreshold(\n provider: SupportedProvider,\n safetyProfile: \"strict\" | \"relaxed\" = \"relaxed\",\n riskLevel: PatchRiskLevel = \"medium\",\n overrides?: PatchConfidenceThresholds,\n): number {\n const relaxed: Record<SupportedProvider, Record<PatchRiskLevel, number>> = {\n remote: { low: 0.65, medium: 0.7, high: 0.8 },\n local: { low: 0.65, medium: 0.7, high: 0.8 },\n };\n const strict: Record<SupportedProvider, Record<PatchRiskLevel, number>> = {\n remote: { low: 0.8, medium: 0.85, high: 0.9 },\n local: { low: 0.8, medium: 0.85, high: 0.9 },\n };\n\n const baseThreshold =\n safetyProfile === \"strict\" ? strict[provider][riskLevel] : relaxed[provider][riskLevel];\n const override = overrides?.[riskLevel];\n\n if (typeof override === \"number\" && Number.isFinite(override)) {\n return Math.max(0, Math.min(1, override));\n }\n\n return baseThreshold;\n}\n\nexport function estimateModelCostUsd(params: {\n provider: SupportedProvider;\n promptChars: number;\n completionChars: number;\n}): number {\n const inputTokens = params.promptChars / 4;\n const outputTokens = params.completionChars / 4;\n\n const pricePerThousand =\n params.provider === \"remote\" ? { input: 0.006, output: 0.02 } : { input: 0, output: 0 };\n\n return (\n (inputTokens / 1000) * pricePerThousand.input + (outputTokens / 1000) * pricePerThousand.output\n );\n}\n\nexport interface NvdConfig {\n apiKey?: string;\n}\n\nexport function getNvdConfig(): NvdConfig {\n return {\n apiKey: process.env.AUTOREMEDIATOR_NVD_API_KEY,\n };\n}\n\nexport function getGitHubToken(): string | undefined {\n return process.env.GITHUB_TOKEN;\n}\n\nexport interface IntelligenceSourceConfig {\n gitLabAdvisoryApi?: string;\n certCcSearchUrl?: string;\n epssApi?: string;\n cveServicesApi?: string;\n depsDevApi?: string;\n scorecardApi?: string;\n vendorAdvisoryFeeds: string[];\n commercialFeeds: string[];\n commercialFeedToken?: string;\n}\n\nexport function getIntelligenceSourceConfig(): IntelligenceSourceConfig {\n return {\n gitLabAdvisoryApi:\n process.env.AUTOREMEDIATOR_GITLAB_ADVISORY_API ??\n \"https://advisories.gitlab.com/api/v1/advisories\",\n certCcSearchUrl:\n process.env.AUTOREMEDIATOR_CERTCC_SEARCH_URL ?? \"https://www.kb.cert.org/vuls/search\",\n epssApi: process.env.AUTOREMEDIATOR_EPSS_API ?? \"https://api.first.org/data/v1/epss\",\n cveServicesApi:\n process.env.AUTOREMEDIATOR_CVE_SERVICES_API ?? \"https://cveawg.mitre.org/api/cve\",\n depsDevApi: process.env.AUTOREMEDIATOR_DEPSDEV_API ?? \"https://api.deps.dev/v3\",\n scorecardApi: process.env.AUTOREMEDIATOR_SCORECARD_API ?? \"https://api.securityscorecards.dev\",\n vendorAdvisoryFeeds: (process.env.AUTOREMEDIATOR_VENDOR_ADVISORY_FEEDS ?? \"\")\n .split(\",\")\n .map((v) => v.trim())\n .filter(Boolean),\n commercialFeeds: (process.env.AUTOREMEDIATOR_COMMERCIAL_FEEDS ?? \"\")\n .split(\",\")\n .map((v) => v.trim())\n .filter(Boolean),\n commercialFeedToken: process.env.AUTOREMEDIATOR_COMMERCIAL_FEED_TOKEN,\n };\n}\n","/**\n * FIRST EPSS API client.\n *\n * Adds exploitation probability metadata for prioritization.\n * Uses shared HTTP client for consistent error handling and timeouts.\n */\nimport type { CveDetails } from \"../../platform/types.js\";\nimport { getIntelligenceSourceConfig } from \"../../platform/config.js\";\nimport { httpClient } from \"../../platform/http-client.js\";\n\ninterface EpssRow {\n cve: string;\n epss: string;\n percentile: string;\n date?: string;\n}\n\ninterface EpssResponse {\n data?: EpssRow[];\n}\n\nexport async function fetchEpss(cveId: string): Promise<EpssRow | undefined> {\n const { epssApi } = getIntelligenceSourceConfig();\n if (!epssApi) return undefined;\n\n try {\n const url = new URL(epssApi);\n url.searchParams.set(\"cve\", cveId);\n\n const res = await httpClient({ url: url.toString() });\n if (!res.ok) return undefined;\n\n const body = res.data as EpssResponse;\n return body.data?.[0];\n } catch {\n return undefined;\n }\n}\n\nexport async function enrichWithEpss(details: CveDetails): Promise<CveDetails> {\n const row = await fetchEpss(details.id);\n if (!row) return details;\n\n const score = Number.parseFloat(row.epss);\n const percentile = Number.parseFloat(row.percentile);\n if (!Number.isFinite(score) || !Number.isFinite(percentile)) {\n return details;\n }\n\n details.epss = {\n score,\n percentile,\n date: row.date,\n };\n return details;\n}\n","/**\n * CISA Known Exploited Vulnerabilities (KEV) feed client.\n *\n * Used for risk-priority enrichment only. This source does not provide\n * npm package range intelligence.\n * Uses shared HTTP client for consistent error handling and timeouts.\n */\nimport type { CveDetails } from \"../../platform/types.js\";\nimport { httpClient } from \"../../platform/http-client.js\";\n\nconst CISA_KEV_URL =\n \"https://www.cisa.gov/sites/default/files/feeds/known_exploited_vulnerabilities.json\";\n\ninterface CisaKevVulnerability {\n cveID: string;\n dateAdded?: string;\n dueDate?: string;\n requiredAction?: string;\n knownRansomwareCampaignUse?: string;\n}\n\ninterface CisaKevFeed {\n vulnerabilities?: CisaKevVulnerability[];\n}\n\nexport async function fetchCisaKevFeed(): Promise<CisaKevFeed | undefined> {\n try {\n const res = await httpClient({ url: CISA_KEV_URL });\n if (!res.ok) return undefined;\n return res.data as CisaKevFeed;\n } catch {\n // KEV is enrichment only; failures are non-fatal.\n return undefined;\n }\n}\n\nexport function findKevEntry(\n feed: CisaKevFeed | undefined,\n cveId: string,\n): CisaKevVulnerability | undefined {\n if (!feed?.vulnerabilities?.length) return undefined;\n const normalized = cveId.toUpperCase();\n return feed.vulnerabilities.find((v) => v.cveID.toUpperCase() === normalized);\n}\n\nexport async function enrichWithCisaKev(details: CveDetails): Promise<CveDetails> {\n const feed = await fetchCisaKevFeed();\n const entry = findKevEntry(feed, details.id);\n if (!entry) return details;\n\n details.kev = {\n knownExploited: true,\n dateAdded: entry.dateAdded,\n dueDate: entry.dueDate,\n requiredAction: entry.requiredAction,\n knownRansomwareCampaignUse: entry.knownRansomwareCampaignUse,\n };\n\n if (!details.references.includes(CISA_KEV_URL)) {\n details.references.push(CISA_KEV_URL);\n }\n\n return details;\n}\n","/**\n * npm registry API client\n *\n * Used to:\n * - Fetch the full list of published versions for a package\n * - Find the lowest semver-compatible safe upgrade from `firstPatchedVersion`\n * - Download tarballs for patch generation (fallback path)\n * - Query installed packages for outdated version information via the package manager\n *\n * Uses shared HTTP client for consistent error handling and timeouts.\n */\nimport { readFileSync } from \"node:fs\";\nimport { join } from \"node:path\";\nimport { execa } from \"execa\";\nimport semver from \"semver\";\nimport { httpClient } from \"../../platform/http-client.js\";\nimport { type PackageManager, detectPackageManager } from \"../../platform/package-manager/index.js\";\n\nconst NPM_REGISTRY = \"https://registry.npmjs.org\";\n\nexport type SafeUpgradeLevel = \"patch\" | \"minor\" | \"major\";\n\nexport interface SafeUpgradeResolution {\n safeVersion?: string;\n upgradeLevel?: SafeUpgradeLevel;\n candidates: Partial<Record<SafeUpgradeLevel, string>>;\n majorOnlyFixAvailable: boolean;\n}\n\n// ---------------------------------------------------------------------------\n// Raw registry types (abbreviated)\n// ---------------------------------------------------------------------------\n\ninterface NpmPackument {\n name: string;\n versions: Record<string, { version: string; dist: { tarball: string } }>;\n \"dist-tags\": Record<string, string>;\n time: Record<string, string>;\n}\n\n// ---------------------------------------------------------------------------\n// Public API\n// ---------------------------------------------------------------------------\n\n/**\n * Fetch all published versions for an npm package.\n * Returns an empty array if the package is not found.\n */\nexport async function fetchPackageVersions(packageName: string): Promise<string[]> {\n const url = `${NPM_REGISTRY}/${encodeURIComponent(packageName)}`;\n\n try {\n const res = await httpClient({ url });\n\n if (res.status === 404) return [];\n if (!res.ok) {\n throw new Error(`npm registry error ${res.status} for \"${packageName}\": ${res.text}`);\n }\n\n const data = res.data as NpmPackument;\n return Object.keys(data.versions);\n } catch (err) {\n // If httpClient throws (timeout, network error), treat as not found\n if (err instanceof Error && err.message.includes(\"registry error\")) {\n throw err;\n }\n return [];\n }\n}\n\n/**\n * Find the lowest published version that satisfies `>= firstPatchedVersion`\n * and is semver-compatible with the currently installed version (same major,\n * unless there is no same-major option).\n *\n * Strategy:\n * 1. Try same-major, lowest version >= firstPatchedVersion\n * 2. Fallback: any published version >= firstPatchedVersion (lowest)\n * 3. Returns undefined if nothing found\n */\nexport async function findSafeUpgradeVersion(\n packageName: string,\n installedVersion: string,\n firstPatchedVersion: string,\n vulnerableRange?: string,\n): Promise<string | undefined> {\n const resolution = await resolveSafeUpgradeVersion(\n packageName,\n installedVersion,\n firstPatchedVersion,\n vulnerableRange,\n );\n\n return resolution.safeVersion;\n}\n\nexport async function resolveSafeUpgradeVersion(\n packageName: string,\n installedVersion: string,\n firstPatchedVersion: string,\n vulnerableRange?: string,\n): Promise<SafeUpgradeResolution> {\n const versions = await fetchPackageVersions(packageName);\n if (!versions.length) {\n return {\n candidates: {},\n majorOnlyFixAvailable: false,\n };\n }\n\n const installed = semver.parse(installedVersion);\n\n // All versions >= firstPatchedVersion, sorted ascending\n const candidates = versions\n .filter((v) => semver.valid(v) && semver.gte(v, firstPatchedVersion))\n .filter((v) => {\n if (!vulnerableRange) return true;\n try {\n return !semver.satisfies(v, vulnerableRange, { includePrerelease: false });\n } catch {\n // If vulnerable range cannot be parsed, avoid filtering out candidates.\n return true;\n }\n })\n .sort(semver.compare);\n\n if (!candidates.length) {\n return {\n candidates: {},\n majorOnlyFixAvailable: false,\n };\n }\n\n const categorizedCandidates: SafeUpgradeResolution[\"candidates\"] = {};\n\n for (const candidate of candidates) {\n const level = classifyUpgradeLevel(installedVersion, candidate);\n if (!level) continue;\n if (!categorizedCandidates[level]) {\n categorizedCandidates[level] = candidate;\n }\n }\n\n const safeVersion =\n categorizedCandidates.patch ?? categorizedCandidates.minor ?? categorizedCandidates.major;\n\n if (!safeVersion) {\n return {\n candidates: categorizedCandidates,\n majorOnlyFixAvailable: false,\n };\n }\n\n const upgradeLevel = classifyUpgradeLevel(installedVersion, safeVersion);\n const majorOnlyFixAvailable =\n !categorizedCandidates.patch &&\n !categorizedCandidates.minor &&\n Boolean(categorizedCandidates.major);\n\n if (!installed || !upgradeLevel) {\n return {\n safeVersion,\n upgradeLevel,\n candidates: categorizedCandidates,\n majorOnlyFixAvailable,\n };\n }\n\n return {\n safeVersion,\n upgradeLevel,\n candidates: categorizedCandidates,\n majorOnlyFixAvailable,\n };\n}\n\nfunction classifyUpgradeLevel(\n installedVersion: string,\n candidateVersion: string,\n): SafeUpgradeLevel | undefined {\n const installed = semver.parse(installedVersion);\n const candidate = semver.parse(candidateVersion);\n\n if (!installed || !candidate) return undefined;\n if (candidate.major > installed.major) return \"major\";\n if (candidate.minor > installed.minor) return \"minor\";\n if (candidate.patch > installed.patch || candidate.version === installed.version) {\n return \"patch\";\n }\n\n return undefined;\n}\n\n/**\n * Get the tarball URL for a specific package version.\n * Used by the patch generation fallback path.\n */\nexport async function getTarballUrl(\n packageName: string,\n version: string,\n): Promise<string | undefined> {\n const url = `${NPM_REGISTRY}/${encodeURIComponent(packageName)}/${encodeURIComponent(version)}`;\n\n try {\n const res = await httpClient({ url });\n\n if (!res.ok) return undefined;\n\n const data = res.data as {\n dist?: { tarball?: string };\n };\n return data.dist?.tarball;\n } catch {\n return undefined;\n }\n}\n\n// ---------------------------------------------------------------------------\n// Outdated package detection\n// ---------------------------------------------------------------------------\n\nexport interface NpmRegistryPackageInfo {\n /** The version currently installed in node_modules */\n currentVersion: string;\n /** Latest version satisfying the declared semver range */\n wantedVersion: string;\n /** Absolute latest version published on the registry */\n latestVersion: string;\n /** True when latestVersion crosses a major boundary from currentVersion */\n isMajorBump: boolean;\n /** \"direct\" if listed in root package.json; \"transitive\" otherwise */\n dependencyScope: \"direct\" | \"transitive\";\n}\n\ninterface NpmOutdatedEntry {\n current?: string;\n wanted?: string;\n latest?: string;\n type?: string;\n}\n\n/**\n * Reads package.json at cwd, resolves all deps against npm registry via the\n * package-manager's outdated command, and returns info keyed by package name.\n *\n * If `includeTransitive` is false (default), only direct dependencies are returned.\n * Private/unavailable packages are skipped silently.\n * Registry unavailability throws with a descriptive message.\n */\nexport async function queryOutdatedPackages(\n cwd: string,\n options: { includeTransitive?: boolean; packageManager?: string } = {},\n): Promise<Map<string, NpmRegistryPackageInfo>> {\n const pm = (options.packageManager ?? detectPackageManager(cwd)) as PackageManager;\n\n // Determine the outdated command per PM\n let stdout: string;\n try {\n // npm and pnpm both use --json for machine-readable output.\n // Yarn v1 uses --json as well (NDJSON), so we attempt all the same way.\n // These commands exit with code 1 when outdated packages exist — that is expected.\n const args: string[] = pm === \"pnpm\" ? [\"outdated\", \"--json\"] : [\"outdated\", \"--json\"];\n const yarnArgs = pm === \"yarn\" ? [\"outdated\", \"--json\"] : undefined;\n const finalArgs = yarnArgs ?? args;\n\n const result = await execa(pm, finalArgs, {\n cwd,\n reject: false,\n stdio: \"pipe\",\n });\n\n // Exit code 0 = no outdated packages; 1 = outdated packages (expected).\n // Any other code or no stdout on a non-zero exit = real failure.\n if (result.exitCode !== 0 && result.exitCode !== 1) {\n const stderr = typeof result.stderr === \"string\" ? result.stderr : \"\";\n if (!result.stdout) {\n throw new Error(\n `${pm} outdated --json failed (exit ${result.exitCode}): ${stderr.slice(0, 500)}`,\n );\n }\n }\n stdout = typeof result.stdout === \"string\" ? result.stdout : \"\";\n } catch (err) {\n if (err instanceof Error && !err.message.includes(\"outdated --json failed\")) {\n throw new Error(`Failed to query outdated packages: ${err.message}`);\n }\n throw err;\n }\n\n if (!stdout.trim()) {\n return new Map();\n }\n\n // Parse the npm/pnpm JSON format.\n // npm: { \"packageName\": { current, wanted, latest, type } }\n // pnpm v7+: may be array — handle both as best effort.\n // yarn v1: NDJSON — parse each line.\n const rawEntries: Record<string, NpmOutdatedEntry> = {};\n\n if (pm === \"yarn\") {\n // yarn outdated --json emits newline-delimited JSON objects\n for (const line of stdout.split(\"\\n\")) {\n const trimmed = line.trim();\n if (!trimmed) continue;\n try {\n const parsed = JSON.parse(trimmed) as { type?: string; data?: unknown };\n if (parsed.type === \"table\" && parsed.data) {\n const tableData = parsed.data as {\n head?: string[];\n body?: string[][];\n };\n const head = tableData.head ?? [];\n const currentIdx = head.indexOf(\"Current\");\n const wantedIdx = head.indexOf(\"Wanted\");\n const latestIdx = head.indexOf(\"Latest\");\n for (const row of tableData.body ?? []) {\n const name = row[0];\n if (!name) continue;\n rawEntries[name] = {\n current: row[currentIdx] ?? \"\",\n wanted: row[wantedIdx] ?? \"\",\n latest: row[latestIdx] ?? \"\",\n type: row[head.indexOf(\"Package Type\")] ?? \"dependencies\",\n };\n }\n }\n } catch {\n // Skip unparseable lines\n }\n }\n } else {\n // npm and pnpm JSON formats\n try {\n const parsed = JSON.parse(stdout);\n if (Array.isArray(parsed)) {\n // pnpm v7+ array format: [{ name, current, wanted, latest, dependencyType }]\n for (const entry of parsed as Array<{\n name?: string;\n packageName?: string;\n current?: string;\n wanted?: string;\n latest?: string;\n dependencyType?: string;\n }>) {\n const name = entry.name ?? entry.packageName;\n if (!name) continue;\n rawEntries[name] = {\n current: entry.current,\n wanted: entry.wanted,\n latest: entry.latest,\n type: entry.dependencyType,\n };\n }\n } else {\n // npm standard object format\n Object.assign(rawEntries, parsed as Record<string, NpmOutdatedEntry>);\n }\n } catch {\n throw new Error(`Could not parse ${pm} outdated --json output.`);\n }\n }\n\n // Read package.json to determine direct vs transitive deps\n let directDeps: Set<string>;\n try {\n const pkgRaw = JSON.parse(readFileSync(join(cwd, \"package.json\"), \"utf8\")) as {\n dependencies?: Record<string, string>;\n devDependencies?: Record<string, string>;\n };\n directDeps = new Set([\n ...Object.keys(pkgRaw.dependencies ?? {}),\n ...Object.keys(pkgRaw.devDependencies ?? {}),\n ]);\n } catch {\n directDeps = new Set();\n }\n\n const result = new Map<string, NpmRegistryPackageInfo>();\n\n for (const [name, entry] of Object.entries(rawEntries)) {\n const currentVersion = entry.current ?? \"\";\n const wantedVersion = entry.wanted ?? currentVersion;\n const latestVersion = entry.latest ?? currentVersion;\n\n if (!currentVersion || !latestVersion) continue;\n\n const dependencyScope: \"direct\" | \"transitive\" = directDeps.has(name) ? \"direct\" : \"transitive\";\n\n // Skip transitive if not requested\n if (!options.includeTransitive && dependencyScope === \"transitive\") continue;\n\n const isMajorBump =\n semver.valid(currentVersion) !== null &&\n semver.valid(latestVersion) !== null &&\n semver.major(latestVersion) > semver.major(currentVersion);\n\n result.set(name, {\n currentVersion,\n wantedVersion,\n latestVersion,\n isMajorBump,\n dependencyScope,\n });\n }\n\n return result;\n}\n","import { existsSync, mkdirSync, readFileSync, writeFileSync } from \"node:fs\";\nimport { join } from \"node:path\";\nimport type { RemediationReport } from \"./types.js\";\n\ninterface IdempotencyEntry {\n key: string;\n cveId: string;\n report: RemediationReport;\n savedAt: string;\n}\n\ninterface IdempotencyIndex {\n schemaVersion: \"1.0\";\n entries: Record<string, IdempotencyEntry>;\n}\n\nconst DEFAULT_INDEX: IdempotencyIndex = {\n schemaVersion: \"1.0\",\n entries: {},\n};\n\nfunction indexFilePath(cwd: string): string {\n return join(cwd, \".autoremediator\", \"state\", \"idempotency.json\");\n}\n\nfunction entryKey(idempotencyKey: string, cveId: string): string {\n return `${idempotencyKey}::${cveId.toUpperCase()}`;\n}\n\nfunction loadIndex(cwd: string): IdempotencyIndex {\n const filePath = indexFilePath(cwd);\n if (!existsSync(filePath)) return DEFAULT_INDEX;\n\n try {\n const parsed = JSON.parse(readFileSync(filePath, \"utf8\")) as IdempotencyIndex;\n if (parsed && parsed.schemaVersion === \"1.0\" && parsed.entries) {\n return parsed;\n }\n return DEFAULT_INDEX;\n } catch {\n return DEFAULT_INDEX;\n }\n}\n\nfunction saveIndex(cwd: string, index: IdempotencyIndex): void {\n const filePath = indexFilePath(cwd);\n mkdirSync(join(cwd, \".autoremediator\", \"state\"), { recursive: true });\n writeFileSync(filePath, JSON.stringify(index, null, 2) + \"\\n\", \"utf8\");\n}\n\nexport function readIdempotentReport(\n cwd: string,\n idempotencyKey: string,\n cveId: string,\n): RemediationReport | undefined {\n const index = loadIndex(cwd);\n const key = entryKey(idempotencyKey, cveId);\n return index.entries[key]?.report;\n}\n\nexport function storeIdempotentReport(\n cwd: string,\n idempotencyKey: string,\n cveId: string,\n report: RemediationReport,\n): void {\n const index = loadIndex(cwd);\n const key = entryKey(idempotencyKey, cveId);\n index.entries[key] = {\n key: idempotencyKey,\n cveId: cveId.toUpperCase(),\n report,\n savedAt: new Date().toISOString(),\n };\n saveIndex(cwd, index);\n}\n","/**\n * Autoremediator agentic loop\n *\n * Orchestrates the full CVE patching pipeline using Vercel AI SDK's\n * generateText with a tool-calling loop.\n */\nimport { generateText } from \"ai\";\nimport { estimateModelCostUsd, resolveProvider } from \"../platform/config.js\";\nimport type {\n CveDetails,\n LlmUsageMetrics,\n PatchResult,\n RemediateOptions,\n RemediationReport,\n VulnerablePackage,\n} from \"../platform/types.js\";\nimport { runLocalRemediationPipeline } from \"./local/index.js\";\nexport { assessPackageReachability } from \"./tools/check-reachability.js\";\nimport { accumulateStepResults } from \"./strategies/pipeline-telemetry.js\";\nimport {\n createPipelineRuntime,\n createProgressEmitter,\n createRuntimeToolsForRun,\n} from \"./pipeline-runtime/index.js\";\n\nexport async function runRemediationPipeline(\n cveId: string,\n options: RemediateOptions = {},\n): Promise<RemediationReport> {\n const provider = resolveProvider(options);\n if (provider === \"local\") {\n return runLocalRemediationPipeline(cveId, options);\n }\n\n const emitProgress = createProgressEmitter(options);\n\n emitProgress(\"pipeline-start\", `Starting remediation for ${cveId}.`, { provider });\n\n const runtime = await createPipelineRuntime(cveId, options);\n const { model, modelName, prompt, systemPrompt } = runtime;\n emitProgress(\"model-selected\", `Selected model ${modelName}.`, { provider, model: modelName });\n\n let collectedResults: PatchResult[] = [];\n let vulnerablePackages: VulnerablePackage[] = [];\n let cveDetails: CveDetails | null = null;\n let agentSteps = 0;\n\n function getDependencyScope(packageName: string): \"direct\" | \"transitive\" | undefined {\n const match = vulnerablePackages.find((pkg) => pkg.installed.name === packageName);\n if (!match) return undefined;\n return match.installed.type === \"direct\" ? \"direct\" : \"transitive\";\n }\n const tools = createRuntimeToolsForRun(options);\n\n const started = Date.now();\n const result = await generateText({\n model,\n system: systemPrompt,\n prompt,\n tools,\n stopWhen: ({ steps }) => steps.length >= 25,\n onStepFinish(stepResult) {\n agentSteps += 1;\n\n const toolResults = (stepResult.toolResults ?? []) as Array<{\n toolName: string;\n result?: unknown;\n }>;\n\n const aggregation = accumulateStepResults({\n toolResults,\n cveDetails,\n vulnerablePackages,\n collectedResults,\n getDependencyScope,\n });\n cveDetails = aggregation.cveDetails;\n vulnerablePackages = aggregation.vulnerablePackages;\n collectedResults = aggregation.collectedResults;\n\n emitProgress(\n \"agent-step\",\n `Completed agent step ${agentSteps} with ${toolResults.length} tool result(s).`,\n {\n provider,\n model: modelName,\n },\n );\n },\n });\n\n const llmUsage: LlmUsageMetrics[] = [\n {\n purpose: \"orchestration\",\n provider,\n model: modelName,\n latencyMs: Date.now() - started,\n promptChars: prompt.length + systemPrompt.length,\n completionChars: result.text.length,\n estimatedCostUsd: estimateModelCostUsd({\n provider,\n promptChars: prompt.length + systemPrompt.length,\n completionChars: result.text.length,\n }),\n },\n ];\n\n emitProgress(\n \"pipeline-finish\",\n `Completed remediation with ${collectedResults.length} result(s).`,\n {\n provider,\n model: modelName,\n },\n );\n\n return {\n cveId,\n cveDetails,\n vulnerablePackages,\n results: collectedResults,\n agentSteps,\n summary: result.text,\n llmUsage,\n correlation: {\n requestId: options.requestId,\n sessionId: options.sessionId,\n parentRunId: options.parentRunId,\n },\n };\n}\n","import semver from \"semver\";\nimport { lookupCveOsv } from \"../../intelligence/sources/osv.js\";\nimport {\n lookupCveGitHub,\n mergeGhDataIntoCveDetails,\n} from \"../../intelligence/sources/github-advisory.js\";\nimport { enrichWithNvd } from \"../../intelligence/sources/nvd.js\";\nimport {\n loadIntelligenceSnapshot,\n lookupSnapshotCve,\n} from \"../../intelligence/sources/snapshot.js\";\nimport type {\n CveDetails,\n InventoryPackage,\n LlmUsageMetrics,\n PatchResult,\n RemediateOptions,\n RemediationReport,\n VulnerablePackage,\n} from \"../../platform/types.js\";\nimport { checkInventoryTool } from \"../tools/check-inventory.js\";\nimport { assessPackageReachability } from \"../tools/check-reachability.js\";\nimport { runSecOpsPreflight } from \"./secops-preflight.js\";\nimport { buildSbom } from \"./sbom.js\";\nimport { resolvePrimaryResult } from \"./primary-strategy.js\";\nimport { shouldAttemptPatchFallback, tryLocalPatchFallback } from \"./fallback.js\";\nimport { resolveLocalRunOptions } from \"./options.js\";\nimport { findVulnerablePackages } from \"./vulnerability-match.js\";\nimport { buildLocalSummary } from \"./summary.js\";\nimport { applyDispositionAndContainment } from \"./disposition.js\";\nimport { computeEscalationAction } from \"../../platform/escalation.js\";\n\nexport async function runLocalRemediationPipeline(\n cveId: string,\n options: RemediateOptions = {},\n): Promise<RemediationReport> {\n const resolved = resolveLocalRunOptions(options);\n const {\n cwd,\n packageManager,\n dryRun,\n runTests,\n policy,\n patchesDir,\n constraints,\n llmProvider,\n providerSafetyProfile,\n requireConsensusForHighRisk,\n consensusProvider,\n consensusModel,\n patchConfidenceThresholds,\n dynamicModelRouting,\n dynamicRoutingThresholdChars,\n exploitSignalOverride,\n suppressions,\n suppressionsFile,\n slaCheck,\n slaPolicy,\n skipUnreachable,\n regressionCheck,\n escalationGraph,\n offlineIntelligence,\n intelligenceSnapshotPath,\n proofOfFix,\n requireProofOfFix,\n } = resolved;\n\n const correlation = {\n requestId: options.requestId,\n sessionId: options.sessionId,\n parentRunId: options.parentRunId,\n };\n\n const collectedResults: PatchResult[] = [];\n const llmUsage: LlmUsageMetrics[] = [];\n let vulnerablePackages: VulnerablePackage[] = [];\n let cveDetails: CveDetails | null = null;\n let agentSteps = 0;\n\n const normalizedId = cveId.toUpperCase();\n let osvDetails: Awaited<ReturnType<typeof lookupCveOsv>> = null;\n let ghPackages: Awaited<ReturnType<typeof lookupCveGitHub>> = [];\n\n if (offlineIntelligence) {\n if (intelligenceSnapshotPath) {\n osvDetails = lookupSnapshotCve(\n loadIntelligenceSnapshot(intelligenceSnapshotPath),\n normalizedId,\n );\n }\n } else {\n [osvDetails, ghPackages] = await Promise.all([\n lookupCveOsv(normalizedId),\n lookupCveGitHub(normalizedId).catch(() => []),\n ]);\n agentSteps += 2;\n }\n\n if (!osvDetails && ghPackages.length === 0) {\n return {\n cveId,\n cveDetails: null,\n vulnerablePackages,\n results: collectedResults,\n agentSteps,\n summary: offlineIntelligence\n ? `Offline mode: ${normalizedId} not found in intelligence snapshot.`\n : `Local mode failed at lookup-cve: ${normalizedId} not found in OSV or GitHub advisory data.`,\n correlation,\n };\n }\n\n cveDetails = osvDetails ?? {\n id: normalizedId,\n summary: \"Details sourced from GitHub Advisory Database.\",\n severity: \"UNKNOWN\",\n references: [],\n affectedPackages: [],\n };\n\n if (ghPackages.length > 0) {\n cveDetails = mergeGhDataIntoCveDetails(cveDetails, ghPackages);\n }\n if (!offlineIntelligence) {\n cveDetails = await enrichWithNvd(cveDetails);\n }\n\n const preflight = await runSecOpsPreflight(normalizedId, cveDetails, {\n suppressions,\n suppressionsFile,\n exploitSignalOverride,\n slaCheck,\n slaPolicy,\n });\n\n if (preflight.suppressed) {\n return {\n cveId,\n cveDetails,\n vulnerablePackages: [],\n results: [],\n agentSteps,\n summary: preflight.summary,\n correlation,\n };\n }\n\n const { exploitSignalTriggered, slaBreaches } = preflight;\n\n if (cveDetails.affectedPackages.length === 0) {\n return {\n cveId,\n cveDetails,\n vulnerablePackages,\n results: collectedResults,\n agentSteps,\n summary: `Local mode lookup succeeded but no npm affected packages were found for ${normalizedId}.`,\n exploitSignalTriggered,\n slaBreaches,\n correlation,\n };\n }\n\n const inventory = await checkInventoryTool.execute({\n cwd,\n packageManager,\n policy: options.policy,\n workspace: constraints.workspace,\n });\n agentSteps += 1;\n\n if (inventory?.error) {\n return {\n cveId,\n cveDetails,\n vulnerablePackages,\n results: collectedResults,\n agentSteps,\n summary: `Local mode failed at check-inventory: ${inventory.error}`,\n exploitSignalTriggered,\n slaBreaches,\n correlation,\n };\n }\n\n const installedPackages = (inventory.packages ?? []) as Array<{\n name: string;\n version: string;\n type: \"direct\" | \"transitive\";\n }>;\n\n vulnerablePackages = findVulnerablePackages(cveDetails, installedPackages);\n agentSteps += 1;\n\n const finalizePatchResult = (result: PatchResult): PatchResult => {\n const withDisposition = applyDispositionAndContainment(result, {\n exploitSignalTriggered,\n slaBreaches,\n severity: cveDetails?.severity,\n policy: options.dispositionPolicy,\n containmentMode: options.containmentMode,\n });\n if (withDisposition.unresolvedReason) {\n withDisposition.escalationAction = computeEscalationAction(\n withDisposition.unresolvedReason,\n escalationGraph,\n );\n }\n return withDisposition;\n };\n\n for (const vulnerable of vulnerablePackages) {\n if (skipUnreachable) {\n const reach = assessPackageReachability(cwd, vulnerable.installed.name);\n if (reach.status === \"not-reachable\") {\n collectedResults.push({\n packageName: vulnerable.installed.name,\n fromVersion: vulnerable.installed.version,\n strategy: \"none\",\n applied: false,\n dryRun,\n message: `Skipped: '${vulnerable.installed.name}' is not reachable from source code.`,\n reachability: reach,\n });\n continue;\n }\n }\n const primary = await resolvePrimaryResult({\n vulnerable,\n cwd,\n packageManager,\n dryRun,\n policy,\n runTests,\n constraints,\n });\n agentSteps += primary.steps;\n\n if (shouldAttemptPatchFallback(primary.result, constraints.preferVersionBump ?? false)) {\n const fallback = await tryLocalPatchFallback({\n cwd,\n packageManager,\n packageName: vulnerable.installed.name,\n vulnerableVersion: vulnerable.installed.version,\n cveId: normalizedId,\n cveSummary: cveDetails?.summary ?? normalizedId,\n dependencyScope: vulnerable.installed.type === \"direct\" ? \"direct\" : \"transitive\",\n dryRun,\n runTests,\n patchesDir,\n llmProvider,\n model: options.model,\n policy: options.policy,\n modelPersonality: options.modelPersonality,\n providerSafetyProfile,\n requireConsensusForHighRisk,\n consensusProvider,\n consensusModel,\n patchConfidenceThresholds,\n dynamicModelRouting,\n dynamicRoutingThresholdChars,\n installMode: constraints.installMode,\n installPreferOffline: constraints.installPreferOffline,\n enforceFrozenLockfile: constraints.enforceFrozenLockfile,\n workspace: constraints.workspace,\n vulnerableRange: vulnerable.affected.vulnerableRange,\n proofOfFix,\n requireProofOfFix,\n });\n agentSteps += fallback.steps;\n collectedResults.push(finalizePatchResult(fallback.result));\n if (fallback.usage) {\n llmUsage.push(...fallback.usage);\n }\n continue;\n }\n\n const primaryResult: PatchResult = {\n ...primary.result,\n dependencyScope: vulnerable.installed.type === \"direct\" ? \"direct\" : \"transitive\",\n };\n\n if (regressionCheck && primaryResult.applied && !dryRun && primaryResult.toVersion) {\n try {\n if (\n semver.satisfies(primaryResult.toVersion, vulnerable.affected.vulnerableRange, {\n includePrerelease: false,\n })\n ) {\n primaryResult.regressionDetected = true;\n }\n } catch {\n // ignore malformed range\n }\n }\n\n collectedResults.push(finalizePatchResult(primaryResult));\n }\n\n const vulnerableNames = new Set(vulnerablePackages.map((v) => v.installed.name));\n const sbom = buildSbom(\n installedPackages as InventoryPackage[],\n vulnerableNames,\n collectedResults,\n );\n\n return {\n cveId,\n cveDetails,\n vulnerablePackages,\n results: collectedResults,\n agentSteps,\n summary: buildLocalSummary(vulnerablePackages, collectedResults),\n llmUsage: llmUsage.length > 0 ? llmUsage : undefined,\n exploitSignalTriggered,\n slaBreaches,\n sbom,\n correlation,\n };\n}\n","/**\n * GitHub Advisory Database API client\n *\n * Used as a secondary source to enrich CVE data with `first_patched_version`.\n * Unauthenticated access works; set GITHUB_TOKEN env var for higher rate limits.\n *\n * Uses shared HTTP client for all API communication.\n */\nimport type { AffectedPackage, CveDetails } from \"../../platform/types.js\";\nimport { getGitHubToken } from \"../../platform/config.js\";\nimport { httpClient } from \"../../platform/http-client.js\";\n\n// ---------------------------------------------------------------------------\n// Raw GitHub Advisory response types\n// ---------------------------------------------------------------------------\n\ninterface GhVulnerability {\n package: {\n ecosystem: string;\n name: string;\n };\n vulnerable_version_range: string | null;\n first_patched_version: string | null;\n}\n\ninterface GhAdvisory {\n ghsa_id: string;\n cve_id: string | null;\n summary: string;\n severity: \"low\" | \"moderate\" | \"high\" | \"critical\" | \"unknown\";\n vulnerabilities: GhVulnerability[];\n cvss?: { score: number; vector_string: string };\n references: Array<{ url: string }>;\n}\n\n// ---------------------------------------------------------------------------\n// Public API\n// ---------------------------------------------------------------------------\n\nconst GITHUB_API_BASE = \"https://api.github.com/advisories\";\n\n/**\n * Fetch GitHub advisories for a given CVE ID filtered to npm ecosystem.\n * Returns an empty array if none found.\n */\nexport async function fetchGhAdvisories(cveId: string): Promise<GhAdvisory[]> {\n const token = getGitHubToken();\n const headers: Record<string, string> = {\n \"X-GitHub-Api-Version\": \"2022-11-28\",\n \"User-Agent\": \"autoremediator\",\n };\n\n if (token) {\n headers[\"Authorization\"] = `token ${token}`;\n }\n\n const normalized = cveId.trim();\n if (normalized.toUpperCase().startsWith(\"GHSA-\")) {\n const url = `${GITHUB_API_BASE}/${encodeURIComponent(normalized)}`;\n try {\n const res = await httpClient({ url, headers });\n if (!res.ok) {\n if (res.status === 404) return [];\n throw new Error(`HTTP ${res.status}: ${res.text}`);\n }\n return res.data ? [res.data as GhAdvisory] : [];\n } catch (err) {\n const errorMsg = err instanceof Error ? err.message : String(err);\n console.warn(\n `[autoremediator] GitHub Advisory API error for ${cveId}: ${errorMsg} — skipping.`,\n );\n return [];\n }\n }\n\n const url = new URL(GITHUB_API_BASE);\n url.searchParams.set(\"cve_id\", cveId);\n url.searchParams.set(\"ecosystem\", \"npm\");\n url.searchParams.set(\"type\", \"reviewed\");\n url.searchParams.set(\"per_page\", \"10\");\n\n try {\n const res = await httpClient({\n url: url.toString(),\n headers,\n });\n\n if (!res.ok) {\n if (res.status === 404) return [];\n throw new Error(`HTTP ${res.status}: ${res.text}`);\n }\n\n return (Array.isArray(res.data) ? res.data : []) as GhAdvisory[];\n } catch (err) {\n // Non-fatal: log and return empty so OSV can still succeed\n const errorMsg = err instanceof Error ? err.message : String(err);\n console.warn(\n `[autoremediator] GitHub Advisory API error for ${cveId}: ${errorMsg} — skipping.`,\n );\n return [];\n }\n}\n\n/**\n * Parse GitHub advisories into AffectedPackage entries.\n * Deduplication against OSV results is handled in lookup-cve.ts.\n */\nexport function parseGhAdvisories(advisories: GhAdvisory[]): AffectedPackage[] {\n const packages: AffectedPackage[] = [];\n\n for (const advisory of advisories) {\n for (const vuln of advisory.vulnerabilities) {\n if (vuln.package.ecosystem.toLowerCase() !== \"npm\") continue;\n\n packages.push({\n name: vuln.package.name,\n ecosystem: \"npm\",\n vulnerableRange: vuln.vulnerable_version_range ?? \">=0.0.0\",\n firstPatchedVersion: vuln.first_patched_version ?? undefined,\n source: \"github-advisory\",\n });\n }\n }\n\n return packages;\n}\n\n/**\n * Merge data from GitHub advisory into a CveDetails object built from OSV.\n * Fills in `firstPatchedVersion` where OSV didn't have it, and enriches CVSS.\n */\nexport function mergeGhDataIntoCveDetails(\n details: CveDetails,\n ghPackages: AffectedPackage[],\n): CveDetails {\n const enriched = { ...details };\n\n for (const ghPkg of ghPackages) {\n const existing = enriched.affectedPackages.find((p) => p.name === ghPkg.name);\n\n if (existing) {\n // Backfill firstPatchedVersion if OSV didn't have it\n if (!existing.firstPatchedVersion && ghPkg.firstPatchedVersion) {\n existing.firstPatchedVersion = ghPkg.firstPatchedVersion;\n }\n } else {\n // Package only known via GitHub Advisory (not yet in OSV)\n enriched.affectedPackages.push(ghPkg);\n }\n }\n\n return enriched;\n}\n\n/** High-level convenience: fetch + parse, returns enrichment packages */\nexport async function lookupCveGitHub(cveId: string): Promise<AffectedPackage[]> {\n const advisories = await fetchGhAdvisories(cveId);\n return parseGhAdvisories(advisories);\n}\n","/**\n * NVD (National Vulnerability Database) API v2 client\n *\n * Used ONLY for fetching authoritative CVSS scores and severity.\n * NVD CPE data is too inconsistent for npm package discovery — use OSV for that.\n *\n * Rate limits: 5 req/30s without key, 50 req/30s with AUTOREMEDIATOR_NVD_API_KEY\n * Uses shared HTTP client for consistent error handling and timeouts.\n */\nimport type { CveDetails } from \"../../platform/types.js\";\nimport { getNvdConfig } from \"../../platform/config.js\";\nimport { httpClient } from \"../../platform/http-client.js\";\n\nconst NVD_BASE = \"https://services.nvd.nist.gov/rest/json/cves/2.0\";\n\ninterface NvdCvssMetric {\n cvssData: {\n baseScore: number;\n baseSeverity: string;\n vectorString: string;\n };\n}\n\ninterface NvdVulnerability {\n cve: {\n id: string;\n metrics?: {\n cvssMetricV31?: NvdCvssMetric[];\n cvssMetricV30?: NvdCvssMetric[];\n cvssMetricV2?: NvdCvssMetric[];\n };\n references?: Array<{ url: string; tags?: string[] }>;\n };\n}\n\ninterface NvdResponse {\n vulnerabilities?: NvdVulnerability[];\n totalResults?: number;\n}\n\nfunction buildNvdHeaders(): Record<string, string> {\n const { apiKey } = getNvdConfig();\n const headers: Record<string, string> = { Accept: \"application/json\" };\n if (apiKey) {\n headers.apiKey = apiKey;\n }\n return headers;\n}\n\n/**\n * Fetch CVSS score for a CVE from NVD.\n * Returns undefined if NVD doesn't have data or the request fails.\n * Non-fatal — callers should handle undefined gracefully.\n */\nexport async function fetchNvdCvss(\n cveId: string,\n): Promise<{ score: number; severity: CveDetails[\"severity\"] } | undefined> {\n const url = `${NVD_BASE}?cveId=${encodeURIComponent(cveId)}`;\n const headers = buildNvdHeaders();\n\n try {\n const res = await httpClient({ url, headers });\n if (!res.ok) return undefined;\n\n const data = res.data as NvdResponse;\n const vuln = data.vulnerabilities?.[0];\n if (!vuln) return undefined;\n\n const metrics = vuln.cve.metrics;\n const metric =\n metrics?.cvssMetricV31?.[0] ?? metrics?.cvssMetricV30?.[0] ?? metrics?.cvssMetricV2?.[0];\n\n if (!metric) return undefined;\n\n const score = metric.cvssData.baseScore;\n const rawSeverity = metric.cvssData.baseSeverity.toUpperCase();\n\n const severityMap: Record<string, CveDetails[\"severity\"]> = {\n CRITICAL: \"CRITICAL\",\n HIGH: \"HIGH\",\n MEDIUM: \"MEDIUM\",\n LOW: \"LOW\",\n };\n\n return {\n score,\n severity: severityMap[rawSeverity] ?? \"UNKNOWN\",\n };\n } catch {\n // NVD is non-critical; don't crash the pipeline on network failures\n return undefined;\n }\n}\n\n/**\n * Enrich an existing CveDetails with NVD CVSS data.\n * Mutates in place and returns the same object.\n */\nexport async function enrichWithNvd(details: CveDetails): Promise<CveDetails> {\n const cvss = await fetchNvdCvss(details.id);\n if (cvss) {\n details.cvssScore = cvss.score;\n if (details.severity === \"UNKNOWN\") {\n details.severity = cvss.severity;\n }\n }\n return details;\n}\n","import { readFileSync } from \"node:fs\";\nimport type { CveDetails } from \"../../platform/types.js\";\n\nexport interface IntelligenceSnapshot {\n [cveId: string]: CveDetails;\n}\n\nexport function loadIntelligenceSnapshot(filePath: string): IntelligenceSnapshot {\n const raw = readFileSync(filePath, \"utf8\");\n const parsed = JSON.parse(raw) as unknown;\n if (typeof parsed !== \"object\" || parsed === null || Array.isArray(parsed)) {\n throw new Error(`Intelligence snapshot at ${filePath} must be a JSON object keyed by CVE ID.`);\n }\n return parsed as IntelligenceSnapshot;\n}\n\nexport function lookupSnapshotCve(\n snapshot: IntelligenceSnapshot,\n cveId: string,\n): CveDetails | null {\n return snapshot[cveId.toUpperCase()] ?? snapshot[cveId] ?? null;\n}\n","/**\n * Tool: check-reachability (Pillar 3.1)\n *\n * Uses the high-performance Oxc (Oxidation Compiler) AST parser to scan project\n * source files for static imports, dynamic imports, CommonJS require calls,\n * and re-exports. Performs interprocedural AST call-graph tracing for target symbols\n * and resolves tsconfig/jsconfig path aliases.\n */\nimport { existsSync, readdirSync, readFileSync, statSync } from \"node:fs\";\nimport { isAbsolute, join, resolve } from \"node:path\";\nimport { parseSync, type ParseResult } from \"oxc-parser\";\nimport { defineTool } from \"./tool-compat.js\";\nimport { z } from \"zod\";\nimport type { ReachabilityAssessment, ReachabilityEvidence } from \"../../platform/types.js\";\n\nconst SOURCE_EXTENSIONS = new Set([\".ts\", \".tsx\", \".js\", \".jsx\", \".mjs\", \".cjs\", \".mts\", \".cts\"]);\nconst IGNORED_DIRS = new Set([\n \"node_modules\",\n \".git\",\n \"dist\",\n \"build\",\n \"coverage\",\n \".next\",\n \".turbo\",\n \".pnpm-store\",\n]);\n\nexport interface TsconfigPathsConfig {\n baseUrl: string;\n paths: Record<string, string[]>;\n}\n\n/**\n * Loads compilerOptions.baseUrl and compilerOptions.paths from tsconfig.json or jsconfig.json\n */\nexport function loadTsconfigPaths(cwd: string): TsconfigPathsConfig | undefined {\n for (const configName of [\"tsconfig.json\", \"jsconfig.json\"]) {\n const fullPath = join(cwd, configName);\n if (!existsSync(fullPath)) continue;\n try {\n const raw = readFileSync(fullPath, \"utf8\");\n // Remove trailing commas / comments if any for robust parsing\n const cleaned = raw.replace(/\\/\\*[\\s\\S]*?\\*\\/|\\/\\/.*/g, \"\");\n const parsed = JSON.parse(cleaned);\n const compilerOptions = parsed.compilerOptions;\n if (compilerOptions?.paths) {\n return {\n baseUrl: compilerOptions.baseUrl ? resolve(cwd, compilerOptions.baseUrl) : cwd,\n paths: compilerOptions.paths,\n };\n }\n } catch {\n // Ignore invalid config\n }\n }\n return undefined;\n}\n\n/**\n * Resolves an aliased import path according to tsconfig paths mapping\n */\nexport function resolveAliasedPath(\n importSource: string,\n config?: TsconfigPathsConfig,\n): string | undefined {\n if (!config || !config.paths || isAbsolute(importSource) || importSource.startsWith(\".\")) {\n return undefined;\n }\n\n for (const [pattern, replacements] of Object.entries(config.paths)) {\n if (pattern === importSource && replacements[0]) {\n return resolve(config.baseUrl, replacements[0]);\n }\n if (pattern.endsWith(\"/*\")) {\n const prefix = pattern.slice(0, -2);\n if (importSource.startsWith(prefix)) {\n const suffix = importSource.slice(prefix.length);\n const replacement = replacements[0]?.slice(0, -2) ?? \"\";\n return resolve(config.baseUrl, replacement + suffix);\n }\n }\n }\n return undefined;\n}\n\nfunction* walkSourceFiles(dir: string): Generator<string> {\n let entries: string[];\n try {\n entries = readdirSync(dir);\n } catch {\n return;\n }\n for (const entry of entries) {\n if (IGNORED_DIRS.has(entry)) continue;\n const full = join(dir, entry);\n let stat;\n try {\n stat = statSync(full);\n } catch {\n continue;\n }\n if (stat.isDirectory()) {\n yield* walkSourceFiles(full);\n } else if (SOURCE_EXTENSIONS.has(full.slice(full.lastIndexOf(\".\")))) {\n yield full;\n }\n }\n}\n\nfunction matchesPackage(\n sourceValue: string,\n packageName: string,\n tsconfig?: TsconfigPathsConfig,\n): boolean {\n if (sourceValue === packageName || sourceValue.startsWith(`${packageName}/`)) {\n return true;\n }\n const resolved = resolveAliasedPath(sourceValue, tsconfig);\n if (resolved && (resolved.includes(`/${packageName}/`) || resolved.endsWith(`/${packageName}`))) {\n return true;\n }\n return false;\n}\n\ninterface AstNode {\n type: string;\n [key: string]: unknown;\n}\n\nfunction walkAst(node: AstNode | null | undefined, visitor: (node: AstNode) => void): void {\n if (!node || typeof node !== \"object\") return;\n visitor(node);\n\n for (const key of Object.keys(node)) {\n if (key === \"parent\" || key === \"start\" || key === \"end\") continue;\n const value = node[key];\n if (Array.isArray(value)) {\n for (const child of value) {\n if (child && typeof child === \"object\" && \"type\" in child) {\n walkAst(child as AstNode, visitor);\n }\n }\n } else if (value && typeof value === \"object\" && \"type\" in value) {\n walkAst(value as AstNode, visitor);\n }\n }\n}\n\nexport interface ExtractedReference {\n matchType: ReachabilityEvidence[\"matchType\"];\n symbols: string[];\n importedIdentifiers: Map<string, string>; // local variable name -> imported member name\n isReExported: boolean;\n}\n\nexport function toRootPackageName(importSource: string): string {\n if (importSource.startsWith(\"@\")) {\n const parts = importSource.split(\"/\");\n return parts.slice(0, 2).join(\"/\");\n }\n return importSource.split(\"/\")[0] ?? importSource;\n}\n\nexport function findTransitiveDependencyPath(\n cwd: string,\n targetPackage: string,\n importedDirectPackages: Set<string>,\n): { directDependency: string; version?: string } | null {\n for (const directPkg of importedDirectPackages) {\n const manifestPath = join(cwd, \"node_modules\", directPkg, \"package.json\");\n if (!existsSync(manifestPath)) continue;\n try {\n const manifest = JSON.parse(readFileSync(manifestPath, \"utf8\")) as {\n dependencies?: Record<string, string>;\n };\n if (manifest.dependencies && manifest.dependencies[targetPackage]) {\n return {\n directDependency: directPkg,\n version: manifest.dependencies[targetPackage],\n };\n }\n } catch {\n // Ignore read errors\n }\n }\n return null;\n}\n\n/**\n * Extracts package references and imported symbols using the Oxc AST parser.\n */\nexport function extractPackageReferences(\n filename: string,\n content: string,\n packageName: string,\n tsconfig?: TsconfigPathsConfig,\n outImportedDirectPackages?: Set<string>,\n): ExtractedReference[] {\n const results: ExtractedReference[] = [];\n\n let parseResult: ParseResult | undefined;\n try {\n parseResult = parseSync(filename, content);\n } catch {\n return results;\n }\n\n if (!parseResult?.program) return results;\n\n walkAst(parseResult.program as unknown as AstNode, (node) => {\n // 1. Static Import Declarations: import ... from 'pkg'\n if (node.type === \"ImportDeclaration\") {\n const source = node.source as { value?: string } | undefined;\n if (source?.value && !source.value.startsWith(\".\") && !isAbsolute(source.value)) {\n outImportedDirectPackages?.add(toRootPackageName(source.value));\n }\n if (source?.value && matchesPackage(source.value, packageName, tsconfig)) {\n const symbols: string[] = [];\n const importedIdentifiers = new Map<string, string>();\n const specifiers = (node.specifiers ?? []) as AstNode[];\n\n for (const spec of specifiers) {\n if (spec.type === \"ImportSpecifier\") {\n const imported = spec.imported as { name?: string; value?: string } | undefined;\n const local = spec.local as { name?: string } | undefined;\n const importedName = imported?.name ?? imported?.value ?? local?.name;\n const localName = local?.name ?? importedName;\n if (importedName && localName) {\n symbols.push(importedName);\n importedIdentifiers.set(localName, importedName);\n }\n } else if (spec.type === \"ImportDefaultSpecifier\") {\n const local = spec.local as { name?: string } | undefined;\n symbols.push(\"default\");\n if (local?.name) importedIdentifiers.set(local.name, \"default\");\n } else if (spec.type === \"ImportNamespaceSpecifier\") {\n const local = spec.local as { name?: string } | undefined;\n symbols.push(\"*\");\n if (local?.name) importedIdentifiers.set(local.name, \"*\");\n }\n }\n\n results.push({\n matchType: \"import\",\n symbols: symbols.length > 0 ? symbols : [\"*\"],\n importedIdentifiers,\n isReExported: false,\n });\n }\n }\n\n // 2. Dynamic Import Expressions: import('pkg')\n if (node.type === \"ImportExpression\") {\n const source = node.source as { value?: string } | undefined;\n if (source?.value && !source.value.startsWith(\".\") && !isAbsolute(source.value)) {\n outImportedDirectPackages?.add(toRootPackageName(source.value));\n }\n if (source?.value && matchesPackage(source.value, packageName, tsconfig)) {\n results.push({\n matchType: \"dynamic-import\",\n symbols: [\"*\"],\n importedIdentifiers: new Map(),\n isReExported: false,\n });\n }\n }\n\n // 3. CommonJS Require Calls: require('pkg')\n if (\n node.type === \"CallExpression\" &&\n (node.callee as { name?: string })?.name === \"require\" &&\n Array.isArray(node.arguments) &&\n node.arguments.length > 0\n ) {\n const firstArg = node.arguments[0] as { value?: string } | undefined;\n if (\n firstArg?.value &&\n typeof firstArg.value === \"string\" &&\n !firstArg.value.startsWith(\".\") &&\n !isAbsolute(firstArg.value)\n ) {\n outImportedDirectPackages?.add(toRootPackageName(firstArg.value));\n }\n if (\n firstArg?.value &&\n typeof firstArg.value === \"string\" &&\n matchesPackage(firstArg.value, packageName, tsconfig)\n ) {\n results.push({\n matchType: \"require\",\n symbols: [\"*\"],\n importedIdentifiers: new Map(),\n isReExported: false,\n });\n }\n }\n\n // 4. Re-export Declarations: export ... from 'pkg'\n if (node.type === \"ExportNamedDeclaration\" || node.type === \"ExportAllDeclaration\") {\n const source = node.source as { value?: string } | undefined;\n if (source?.value && !source.value.startsWith(\".\") && !isAbsolute(source.value)) {\n outImportedDirectPackages?.add(toRootPackageName(source.value));\n }\n if (source?.value && matchesPackage(source.value, packageName, tsconfig)) {\n const symbols: string[] = [];\n if (node.type === \"ExportAllDeclaration\") {\n symbols.push(\"*\");\n } else {\n const specifiers = (node.specifiers ?? []) as AstNode[];\n for (const spec of specifiers) {\n const local = spec.local as { name?: string; value?: string } | undefined;\n const exported = spec.exported as { name?: string; value?: string } | undefined;\n const name = exported?.name ?? exported?.value ?? local?.name ?? local?.value;\n if (name) symbols.push(name);\n }\n }\n results.push({\n matchType: \"re-export\",\n symbols: symbols.length > 0 ? symbols : [\"*\"],\n importedIdentifiers: new Map(),\n isReExported: true,\n });\n }\n }\n });\n\n return results;\n}\n\n/**\n * Traces AST call expressions to see if the vulnerable symbol is actually invoked.\n */\nexport function traceSymbolInvocations(\n content: string,\n filename: string,\n importedIdentifiers: Map<string, string>,\n targetSymbol?: string,\n): { invoked: boolean; callCount: number } {\n if (!targetSymbol) {\n return { invoked: true, callCount: 1 };\n }\n\n let parseResult: ParseResult | undefined;\n try {\n parseResult = parseSync(filename, content);\n } catch {\n return { invoked: true, callCount: 1 };\n }\n\n if (!parseResult?.program) {\n return { invoked: true, callCount: 1 };\n }\n\n let callCount = 0;\n\n walkAst(parseResult.program as unknown as AstNode, (node) => {\n // Check direct function calls: func() or new Func()\n if (node.type === \"CallExpression\" || node.type === \"NewExpression\") {\n const callee = node.callee as AstNode | undefined;\n if (!callee) return;\n\n // 1. Direct identifier invocation: template()\n if (callee.type === \"Identifier\") {\n const name = (callee as { name?: string }).name;\n if (name) {\n const importedName = importedIdentifiers.get(name);\n if (importedName === targetSymbol || name === targetSymbol) {\n callCount++;\n }\n }\n }\n\n // 2. Member expression invocation: _.template() or lodash.template()\n if (callee.type === \"MemberExpression\") {\n const object = callee.object as { name?: string } | undefined;\n const property = callee.property as { name?: string; value?: string } | undefined;\n const propName = property?.name ?? property?.value;\n\n if (object?.name && propName) {\n const importedName = importedIdentifiers.get(object.name);\n if (\n (importedName === \"*\" ||\n importedName === \"default\" ||\n object.name === \"lodash\" ||\n object.name === \"_\") &&\n propName === targetSymbol\n ) {\n callCount++;\n }\n }\n }\n }\n });\n\n return {\n invoked: callCount > 0,\n callCount,\n };\n}\n\nexport function assessPackageReachability(\n cwd: string,\n packageName: string,\n targetSymbol?: string,\n): ReachabilityAssessment {\n const tsconfig = loadTsconfigPaths(cwd);\n const evidence: ReachabilityEvidence[] = [];\n let scanned = 0;\n let hasReExport = false;\n let totalInvocations = 0;\n let hasPackageImport = false;\n\n const importedDirectPackages = new Set<string>();\n\n for (const filePath of walkSourceFiles(cwd)) {\n scanned++;\n let content: string;\n try {\n content = readFileSync(filePath, \"utf8\");\n } catch {\n continue;\n }\n\n const refs = extractPackageReferences(\n filePath,\n content,\n packageName,\n tsconfig,\n importedDirectPackages,\n );\n if (refs.length > 0) {\n hasPackageImport = true;\n }\n\n for (const ref of refs) {\n if (ref.isReExported) {\n hasReExport = true;\n }\n\n const matchesSymbol =\n !targetSymbol ||\n ref.symbols.includes(\"*\") ||\n ref.symbols.includes(\"default\") ||\n ref.symbols.includes(targetSymbol);\n\n if (matchesSymbol) {\n let invoked = true;\n let callCount = 1;\n\n if (targetSymbol && !ref.isReExported) {\n const trace = traceSymbolInvocations(\n content,\n filePath,\n ref.importedIdentifiers,\n targetSymbol,\n );\n invoked = trace.invoked;\n callCount = trace.callCount;\n totalInvocations += callCount;\n }\n\n evidence.push({\n filePath,\n matchType: ref.matchType,\n importedSymbols: ref.symbols,\n symbol: targetSymbol,\n invoked,\n callCount,\n });\n }\n }\n }\n\n if (scanned === 0) {\n return {\n packageName,\n status: \"unknown\",\n reason: `No source files found under ${cwd}`,\n reachabilityBasis: \"unknown\",\n };\n }\n\n if (!hasPackageImport) {\n const transitivePath = findTransitiveDependencyPath(cwd, packageName, importedDirectPackages);\n if (transitivePath) {\n return {\n packageName,\n status: \"reachable\",\n reason: `Package '${packageName}' is a transitive dependency of imported package '${transitivePath.directDependency}'`,\n reachabilityBasis: \"transitive-path-found\",\n evidence: [],\n };\n }\n\n return {\n packageName,\n status: \"not-reachable\",\n reason: `No source files reference '${packageName}'`,\n reachabilityBasis: \"import-present\",\n justification: \"code_not_in_execute_path\",\n evidence: [],\n };\n }\n\n // If targetSymbol was specified\n if (targetSymbol) {\n const isReachable = hasReExport || totalInvocations > 0;\n if (isReachable) {\n return {\n packageName,\n status: \"reachable\",\n reason: hasReExport\n ? `Package '${packageName}' re-exports symbols to external consumers`\n : `Found ${totalInvocations} call-site(s) invoking vulnerable symbol '${targetSymbol}' across ${evidence.filter((e) => e.invoked).length} file(s)`,\n reachabilityBasis: \"call-path-found\",\n evidence,\n };\n }\n\n return {\n packageName,\n status: \"not-reachable\",\n reason: `Package '${packageName}' is imported but vulnerable symbol '${targetSymbol}' is never invoked in any execution path`,\n reachabilityBasis: \"call-graph-uninvoked\",\n justification: \"code_not_in_execute_path\",\n evidence,\n };\n }\n\n return {\n packageName,\n status: \"reachable\",\n reason: `Found ${evidence.length} source file(s) referencing '${packageName}'`,\n reachabilityBasis: \"import-present\",\n evidence,\n };\n}\n\nexport const checkReachabilityTool = defineTool({\n description:\n \"Scan project source files for import/require/export references and perform AST call-graph reachability analysis for a package and vulnerable symbols using Oxc AST parser. Returns reachability status: reachable, not-reachable, or unknown.\",\n parameters: z.object({\n cwd: z.string().describe(\"Project root directory to scan\"),\n packageName: z.string().describe(\"Package name to search for (e.g. 'lodash' or '@babel/core')\"),\n symbol: z\n .string()\n .optional()\n .describe(\"Optional vulnerable function/symbol name to check specifically in call graph\"),\n }),\n execute({ cwd, packageName, symbol }) {\n return assessPackageReachability(cwd, packageName, symbol);\n },\n});\n","/**\n * Tool: check-exploit-signal\n *\n * Evaluates KEV and EPSS signals from CveDetails against policy thresholds\n * to determine whether this CVE should be treated as mandatory regardless of\n * severity filtering.\n */\nimport { defineTool } from \"./tool-compat.js\";\nimport { z } from \"zod\";\n\nconst kevSchema = z\n .object({\n knownExploited: z.boolean(),\n dateAdded: z.string().optional(),\n dueDate: z.string().optional(),\n requiredAction: z.string().optional(),\n knownRansomwareCampaignUse: z.string().optional(),\n })\n .passthrough();\n\nconst epssSchema = z\n .object({\n score: z.number(),\n percentile: z.number(),\n date: z.string().optional(),\n })\n .passthrough();\n\nconst exploitSignalPolicySchema = z\n .object({\n kev: z.object({ mandatory: z.boolean() }).optional(),\n epss: z.object({ mandatory: z.boolean(), threshold: z.number() }).optional(),\n })\n .optional();\n\nexport const checkExploitSignalTool = defineTool({\n description:\n \"Evaluate KEV and EPSS exploit signals for a CVE against policy thresholds. Returns whether the exploit signal overrides severity filtering (mandatory gate).\",\n parameters: z.object({\n cveDetails: z\n .object({\n id: z.string(),\n kev: kevSchema.optional(),\n epss: epssSchema.optional(),\n })\n .passthrough()\n .describe(\"CveDetails object from lookup-cve\"),\n policy: z\n .object({\n exploitSignalOverride: exploitSignalPolicySchema,\n })\n .passthrough()\n .describe(\"Policy object containing exploitSignalOverride configuration\"),\n }),\n execute: async ({\n cveDetails,\n policy,\n }): Promise<{\n exploitSignalTriggered: boolean;\n reason: string;\n }> => {\n const override = policy.exploitSignalOverride;\n\n if (!override) {\n return {\n exploitSignalTriggered: false,\n reason: \"No exploitSignalOverride policy configured.\",\n };\n }\n\n // KEV check\n if (override.kev?.mandatory && cveDetails.kev?.knownExploited === true) {\n return {\n exploitSignalTriggered: true,\n reason: `CVE ${cveDetails.id} is in the CISA Known Exploited Vulnerabilities (KEV) catalog and kev.mandatory is enabled.`,\n };\n }\n\n // EPSS check\n if (\n override.epss?.mandatory &&\n typeof override.epss.threshold === \"number\" &&\n typeof cveDetails.epss?.score === \"number\" &&\n cveDetails.epss.score >= override.epss.threshold\n ) {\n return {\n exploitSignalTriggered: true,\n reason: `CVE ${cveDetails.id} EPSS score ${cveDetails.epss.score} meets or exceeds threshold ${override.epss.threshold} and epss.mandatory is enabled.`,\n };\n }\n\n return {\n exploitSignalTriggered: false,\n reason: \"Exploit signal thresholds not met.\",\n };\n },\n});\n","/**\n * SecOps pre-flight checks for the local remediation pipeline.\n *\n * Runs before inventory and per-package remediation:\n * 1. VEX suppression — exits early if the CVE is actively suppressed\n * 2. Exploit signal — KEV / EPSS override gate\n * 3. SLA breach — detects response-window violations\n */\nimport type {\n CveDetails,\n ExploitSignalOverridePolicy,\n SlaBreach,\n SlaPolicy,\n VexSuppression,\n} from \"../../platform/types.js\";\nimport {\n checkSlaBreach,\n isActiveSuppression,\n loadSuppressionsFile,\n} from \"../../platform/policy.js\";\nimport { checkExploitSignalTool } from \"../tools/check-exploit-signal.js\";\n\nexport interface SecOpsPreflightOptions {\n suppressions: VexSuppression[];\n suppressionsFile?: string;\n exploitSignalOverride?: ExploitSignalOverridePolicy;\n slaCheck: boolean;\n slaPolicy?: SlaPolicy;\n}\n\nexport type SecOpsPreflightResult =\n | { suppressed: true; summary: string }\n | {\n suppressed: false;\n exploitSignalTriggered?: boolean;\n slaBreaches?: SlaBreach[];\n };\n\nexport async function runSecOpsPreflight(\n normalizedId: string,\n cveDetails: CveDetails,\n opts: SecOpsPreflightOptions,\n): Promise<SecOpsPreflightResult> {\n const allSuppressions = opts.suppressionsFile\n ? [...opts.suppressions, ...loadSuppressionsFile(opts.suppressionsFile)]\n : opts.suppressions;\n\n const activeSuppression = allSuppressions.find(\n (s) => s.cveId === normalizedId && isActiveSuppression(s),\n );\n if (activeSuppression) {\n return {\n suppressed: true,\n summary: `CVE ${normalizedId} suppressed by VEX policy: ${activeSuppression.justification}${activeSuppression.notes ? ` — ${activeSuppression.notes}` : \"\"}`,\n };\n }\n\n let exploitSignalTriggered: boolean | undefined;\n if (opts.exploitSignalOverride) {\n const result = await checkExploitSignalTool.execute({\n cveDetails: {\n id: cveDetails.id,\n kev: cveDetails.kev,\n epss: cveDetails.epss,\n },\n policy: { exploitSignalOverride: opts.exploitSignalOverride },\n });\n if (result.exploitSignalTriggered) {\n exploitSignalTriggered = true;\n }\n }\n\n let slaBreaches: SlaBreach[] | undefined;\n if (opts.slaCheck && opts.slaPolicy && cveDetails.publishedAt) {\n const breach = checkSlaBreach(\n normalizedId,\n cveDetails.severity,\n cveDetails.publishedAt,\n opts.slaPolicy,\n );\n if (breach) {\n slaBreaches = [breach];\n }\n }\n\n return { suppressed: false, exploitSignalTriggered, slaBreaches };\n}\n","import type { InventoryPackage, PatchResult, SbomEntry, SbomStatus } from \"../../platform/types.js\";\n\n/**\n * Build a Software Bill of Materials from the installed package inventory,\n * cross-referencing each package against the vulnerable and remediated sets.\n */\nexport function buildSbom(\n packages: InventoryPackage[],\n vulnerableNames: Set<string>,\n results: PatchResult[],\n): SbomEntry[] {\n const statusByPackage = new Map<string, SbomStatus>();\n for (const result of results) {\n if (!vulnerableNames.has(result.packageName)) continue;\n if (result.suppressedBy) {\n statusByPackage.set(result.packageName, \"suppressed\");\n } else if (!result.applied && result.strategy === \"none\") {\n statusByPackage.set(result.packageName, \"skipped\");\n } else if (result.applied) {\n statusByPackage.set(result.packageName, \"patched\");\n } else {\n statusByPackage.set(result.packageName, \"unpatched\");\n }\n }\n\n return packages.map((pkg) => {\n const isVulnerable = vulnerableNames.has(pkg.name);\n const entry: SbomEntry = {\n name: pkg.name,\n version: pkg.version,\n scope: pkg.type === \"direct\" ? \"direct\" : \"transitive\",\n };\n if (isVulnerable) {\n entry.status = statusByPackage.get(pkg.name) ?? \"unpatched\";\n }\n return entry;\n });\n}\n","/**\n * Tool: apply-version-bump\n *\n * Updates the consumer's package.json to the safe version and runs npm install.\n * Respects --dry-run: in dry-run mode it reports what would happen but writes nothing.\n */\nimport { defineTool } from \"./tool-compat.js\";\nimport { z } from \"zod\";\nimport { join } from \"node:path\";\nimport { readFileSync, writeFileSync } from \"node:fs\";\nimport { safeExeca } from \"../../platform/safe-exec.js\";\nimport semver from \"semver\";\nimport type { PatchResult } from \"../../platform/types.js\";\nimport { isPackageAllowed, loadPolicy } from \"../../platform/policy.js\";\nimport { withRepoLock } from \"../../platform/repo-lock.js\";\nimport {\n detectPackageManager,\n getYarnMajorVersion,\n resolveDedupeCommand,\n resolveInstallCommand,\n resolveTestCommand,\n resolveTypecheckCommand,\n type PackageManager,\n} from \"../../platform/package-manager/index.js\";\n\nimport { findDeclaringWorkspacePackage } from \"../../platform/workspace.js\";\nimport { findPackageCallSites } from \"../refactor/call-site-finder.js\";\nimport { refactorConsumerCallSites, revertRefactorSnapshots } from \"../refactor/refactor-agent.js\";\n\n\ninterface RawPackageJson {\n dependencies?: Record<string, string>;\n devDependencies?: Record<string, string>;\n peerDependencies?: Record<string, string>;\n [key: string]: unknown;\n}\n\ntype DepField = \"dependencies\" | \"devDependencies\" | \"peerDependencies\";\n\nexport const applyVersionBumpTool = defineTool({\n description:\n \"Update package.json to use the safe version of a vulnerable package and run the project's package manager install. In dry-run mode, only reports what would change.\",\n parameters: z.object({\n cwd: z.string().describe(\"Absolute path to the consumer project root\"),\n packageManager: z\n .enum([\"npm\", \"pnpm\", \"yarn\", \"bun\", \"deno\"])\n .optional()\n .describe(\"Package manager used by the target project (auto-detected if omitted)\"),\n packageName: z.string().describe(\"The npm package to upgrade\"),\n fromVersion: z.string().describe(\"The currently installed vulnerable version\"),\n toVersion: z.string().describe(\"The safe target version to upgrade to\"),\n dryRun: z.boolean().default(false).describe(\"If true, report changes but do not write\"),\n policy: z.string().optional().describe(\"Optional path to .autoremediator policy file\"),\n runTests: z\n .boolean()\n .default(false)\n .describe(\"If true, run test validation after applying the fix\"),\n typecheck: z\n .boolean()\n .default(false)\n .describe(\"If true, run typecheck validation after applying the fix\"),\n installMode: z.enum([\"standard\", \"prefer-offline\", \"deterministic\"]).optional(),\n installPreferOffline: z.boolean().optional(),\n enforceFrozenLockfile: z.boolean().optional(),\n workspace: z.string().optional(),\n breakingChangeRefactor: z\n .boolean()\n .optional()\n .describe(\"If true, attempt agentic call-site refactoring when validation fails after major upgrade\"),\n }),\n execute: async ({\n cwd,\n packageManager,\n packageName,\n fromVersion,\n toVersion,\n dryRun,\n policy,\n runTests,\n typecheck,\n installMode,\n installPreferOffline,\n enforceFrozenLockfile,\n workspace,\n breakingChangeRefactor,\n }): Promise<PatchResult> => {\n const pm = (packageManager ?? detectPackageManager(cwd)) as PackageManager;\n\n let pkgPath = join(cwd, \"package.json\");\n const loadedPolicy = loadPolicy(cwd, policy);\n const commandConstraints = {\n ...loadedPolicy.constraints,\n installMode: installMode ?? loadedPolicy.constraints?.installMode,\n installPreferOffline: installPreferOffline ?? loadedPolicy.constraints?.installPreferOffline,\n enforceFrozenLockfile:\n enforceFrozenLockfile ?? loadedPolicy.constraints?.enforceFrozenLockfile,\n workspace: workspace ?? loadedPolicy.constraints?.workspace,\n };\n const yarnMajor = pm === \"yarn\" ? await getYarnMajorVersion(cwd) : undefined;\n\n if (!isPackageAllowed(loadedPolicy, packageName)) {\n return {\n packageName,\n strategy: \"none\",\n fromVersion,\n toVersion,\n applied: false,\n dryRun,\n unresolvedReason: \"policy-blocked\",\n message: `Policy blocked changes for package \"${packageName}\".`,\n };\n }\n\n const isMajorBump =\n semver.valid(fromVersion) &&\n semver.valid(toVersion) &&\n semver.major(toVersion) > semver.major(fromVersion);\n\n if (isMajorBump && !loadedPolicy.allowMajorBumps) {\n return {\n packageName,\n strategy: \"none\",\n fromVersion,\n toVersion,\n applied: false,\n dryRun,\n unresolvedReason: \"major-bump-required\",\n message: `Policy blocked major bump for \"${packageName}\" (${fromVersion} -> ${toVersion}).`,\n };\n }\n\n pkgPath = join(cwd, \"package.json\");\n let pkgJson: RawPackageJson;\n try {\n pkgJson = JSON.parse(readFileSync(pkgPath, \"utf8\")) as RawPackageJson;\n } catch {\n return {\n packageName,\n strategy: \"none\",\n fromVersion,\n applied: false,\n dryRun,\n unresolvedReason: \"package-json-not-found\",\n message: `Could not read package.json at \"${pkgPath}\".`,\n };\n }\n\n // Locate which dependency field this package lives in\n let depField = ([\"dependencies\", \"devDependencies\", \"peerDependencies\"] as DepField[]).find(\n (f) => pkgJson[f]?.[packageName] !== undefined,\n );\n\n if (!depField) {\n // Check monorepo child workspaces\n const declaringWorkspace = findDeclaringWorkspacePackage(cwd, packageName, workspace);\n if (declaringWorkspace) {\n pkgPath = declaringWorkspace.manifestPath;\n pkgJson = declaringWorkspace.manifest as RawPackageJson;\n depField = ([\"dependencies\", \"devDependencies\", \"peerDependencies\"] as DepField[]).find(\n (f) => pkgJson[f]?.[packageName] !== undefined,\n );\n commandConstraints.workspace = workspace ?? declaringWorkspace.name;\n }\n }\n\n if (!depField) {\n return {\n packageName,\n strategy: \"none\",\n fromVersion,\n applied: false,\n dryRun,\n unresolvedReason: \"transitive-dependency\",\n message: `\"${packageName}\" was not found in package.json dependencies (it may be a transitive dependency). Cannot auto-bump.`,\n };\n }\n\n const currentRange = pkgJson[depField]![packageName]!;\n\n // Preserve the range prefix (^, ~, empty) from the existing entry\n const prefixMatch = currentRange.match(/^([~^]?)/);\n const prefix = prefixMatch?.[1] ?? \"\";\n const newRange = `${prefix}${toVersion}`;\n\n const effectiveInstallCommand = resolveInstallCommand(pm, commandConstraints, yarnMajor);\n const effectiveTestCommand = resolveTestCommand(pm, commandConstraints);\n const effectiveTypecheckCommand = resolveTypecheckCommand(pm, commandConstraints, cwd);\n const effectiveDedupeCommand = resolveDedupeCommand(pm, commandConstraints);\n const shouldTypecheck = typecheck || Boolean(commandConstraints.typecheck);\n\n if (dryRun) {\n const installCmd = effectiveInstallCommand.join(\" \");\n const testCmd = effectiveTestCommand.join(\" \");\n return {\n packageName,\n strategy: \"version-bump\",\n fromVersion,\n toVersion,\n applied: false,\n dryRun: true,\n message: `[DRY RUN] Would update ${depField}.${packageName}: \"${currentRange}\" -> \"${newRange}\", then run ${installCmd}${runTests ? ` and ${testCmd}` : \"\"}${effectiveDedupeCommand.length > 0 ? ` and ${effectiveDedupeCommand.join(\" \")} (best-effort)` : \"\"}.`,\n };\n }\n\n return withRepoLock(cwd, async () => {\n // Write updated package.json\n pkgJson[depField]![packageName] = newRange;\n writeFileSync(pkgPath, JSON.stringify(pkgJson, null, 2) + \"\\n\", \"utf8\");\n\n // Run package-manager install\n try {\n const [installCmd, ...installArgs] = effectiveInstallCommand;\n await safeExeca(installCmd, installArgs, {\n cwd,\n stdio: \"pipe\",\n });\n } catch (err) {\n // Revert the package.json change on install failure\n pkgJson[depField]![packageName] = currentRange;\n writeFileSync(pkgPath, JSON.stringify(pkgJson, null, 2) + \"\\n\", \"utf8\");\n\n const message = err instanceof Error ? err.message : String(err);\n return {\n packageName,\n strategy: \"version-bump\",\n fromVersion,\n toVersion,\n applied: false,\n dryRun: false,\n unresolvedReason: \"install-failed\",\n message: `${effectiveInstallCommand.join(\" \")} failed after updating \"${packageName}\" to ${toVersion}. Reverted. Error: ${message}`,\n };\n }\n\n const shouldAttemptRefactor = Boolean(\n breakingChangeRefactor ?? loadedPolicy.constraints?.enableBreakingChangeRefactor,\n );\n\n async function runValidationSteps(): Promise<{\n passed: boolean;\n error?: string;\n isTypecheck?: boolean;\n }> {\n if (runTests) {\n try {\n const [testCmd, ...testArgs] = effectiveTestCommand;\n await safeExeca(testCmd, testArgs, { cwd, stdio: \"pipe\" });\n } catch (err) {\n const execErr = err as { stdout?: string; stderr?: string; message?: string };\n const fullOutput = [execErr.stdout, execErr.stderr, execErr.message]\n .filter(Boolean)\n .join(\"\\n\");\n return {\n passed: false,\n error: fullOutput || (err instanceof Error ? err.message : String(err)),\n };\n }\n }\n if (shouldTypecheck && effectiveTypecheckCommand.length > 0) {\n try {\n const [tcCmd, ...tcArgs] = effectiveTypecheckCommand;\n await safeExeca(tcCmd, tcArgs, { cwd, stdio: \"pipe\" });\n } catch (err) {\n const execErr = err as { stdout?: string; stderr?: string; message?: string };\n const fullOutput = [execErr.stdout, execErr.stderr, execErr.message]\n .filter(Boolean)\n .join(\"\\n\");\n return {\n passed: false,\n isTypecheck: true,\n error: fullOutput || (err instanceof Error ? err.message : String(err)),\n };\n }\n }\n return { passed: true };\n }\n\n let validationResult = await runValidationSteps();\n let refactoredFilesList: string[] | undefined;\n\n if (!validationResult.passed && shouldAttemptRefactor) {\n const callSites = findPackageCallSites(cwd, packageName);\n if (callSites.length > 0) {\n const refactorAttempt = await refactorConsumerCallSites({\n cwd,\n packageName,\n fromVersion,\n toVersion,\n diagnosticError: validationResult.error || \"\",\n callSites,\n });\n\n if (refactorAttempt.applied) {\n const postRefactorValidation = await runValidationSteps();\n if (postRefactorValidation.passed) {\n validationResult = { passed: true };\n refactoredFilesList = refactorAttempt.refactoredFiles;\n } else {\n revertRefactorSnapshots(refactorAttempt.snapshots);\n }\n }\n }\n }\n\n if (!validationResult.passed) {\n pkgJson[depField]![packageName] = currentRange;\n writeFileSync(pkgPath, JSON.stringify(pkgJson, null, 2) + \"\\n\", \"utf8\");\n\n try {\n const [rollbackCmd, ...rollbackArgs] = effectiveInstallCommand;\n await safeExeca(rollbackCmd, rollbackArgs, {\n cwd,\n stdio: \"pipe\",\n });\n } catch {}\n\n const failureMessage = validationResult.error || \"Unknown validation error\";\n const prefix = validationResult.isTypecheck\n ? `TypeCheck validation failed (${effectiveTypecheckCommand.join(\" \")})`\n : `${effectiveTestCommand.join(\" \")} failed`;\n\n return {\n packageName,\n strategy: \"version-bump\",\n fromVersion,\n toVersion,\n applied: false,\n dryRun: false,\n unresolvedReason: shouldAttemptRefactor\n ? \"breaking-change-unresolved\"\n : \"validation-failed\",\n message: `${prefix} after upgrading \"${packageName}\" to ${toVersion}. Rolled back to ${currentRange}. Error: ${failureMessage}`,\n };\n }\n\n\n if (refactoredFilesList && refactoredFilesList.length > 0) {\n return {\n packageName,\n strategy: \"breaking-change-refactor\",\n fromVersion,\n toVersion,\n applied: true,\n dryRun: false,\n refactoredFiles: refactoredFilesList,\n message: `Upgraded \"${packageName}\" from ${fromVersion} to ${toVersion} and refactored ${refactoredFilesList.length} call-site file(s) across breaking API changes.`,\n };\n }\n\n\n let dedupeNote = \"\";\n\n if (effectiveDedupeCommand.length > 0) {\n try {\n const [dedupeCmd, ...dedupeArgs] = effectiveDedupeCommand;\n await safeExeca(dedupeCmd, dedupeArgs, {\n cwd,\n stdio: \"pipe\",\n });\n } catch (err) {\n const message = err instanceof Error ? err.message : String(err);\n dedupeNote = ` Dedupe warning: ${effectiveDedupeCommand.join(\" \")} failed (${message}).`;\n }\n }\n\n return {\n packageName,\n strategy: \"version-bump\",\n fromVersion,\n toVersion,\n applied: true,\n dryRun: false,\n message: `Successfully upgraded \"${packageName}\" from ${fromVersion} to ${toVersion} in ${depField}, then ran ${effectiveInstallCommand.join(\" \")}${runTests ? ` and passed ${effectiveTestCommand.join(\" \")}` : \"\"}.${dedupeNote}`,\n };\n });\n },\n});\n","import { execa, type Options as ExecaOptions, type ResultPromise } from \"execa\";\n\nexport type SafeExecOptions = ExecaOptions & {\n timeoutMs?: number;\n allowNodeOptions?: boolean;\n};\n\nconst DANGEROUS_ENV_VARS = new Set([\n \"NODE_OPTIONS\",\n \"NODE_PATH\",\n \"LD_PRELOAD\",\n \"LD_LIBRARY_PATH\",\n \"DYLD_INSERT_LIBRARIES\",\n \"DYLD_LIBRARY_PATH\",\n \"PERL5OPT\",\n \"PERL5LIB\",\n \"PYTHONWARNINGS\",\n \"PYTHONPATH\",\n \"RUBYOPT\",\n \"RUBYLIB\",\n \"BASH_ENV\",\n \"ENV\",\n]);\n\n/**\n * Sanitizes environment variables to prevent process-injection and supply chain attacks.\n */\nexport function sanitizeEnvironment(\n env: NodeJS.ProcessEnv = process.env,\n allowNodeOptions = false,\n): NodeJS.ProcessEnv {\n const sanitized: NodeJS.ProcessEnv = {};\n\n for (const [key, value] of Object.entries(env)) {\n if (value === undefined) continue;\n if (key.includes(\"\\0\") || (typeof value === \"string\" && value.includes(\"\\0\"))) continue;\n if (DANGEROUS_ENV_VARS.has(key)) {\n if (key === \"NODE_OPTIONS\" && allowNodeOptions) {\n sanitized[key] = value;\n }\n continue;\n }\n sanitized[key] = value;\n }\n\n return sanitized;\n}\n\n/**\n * Validates command line arguments for safety (blocking null bytes and malformed tokens).\n */\nexport function validateCommandArguments(file: string, args: readonly string[] = []): void {\n if (file.includes(\"\\0\")) {\n throw new Error(\"Command execution blocked: executable path contains null bytes\");\n }\n for (const arg of args) {\n if (arg.includes(\"\\0\")) {\n throw new Error(`Command execution blocked: argument contains null bytes: ${arg}`);\n }\n }\n}\n\n/**\n * Safe wrapper around execa that enforces environment sanitization, timeouts, and argument safety.\n */\nexport function safeExeca(\n file: string,\n args: readonly string[] = [],\n options: SafeExecOptions = {},\n): ResultPromise {\n validateCommandArguments(file, args);\n\n const timeout =\n options.timeoutMs ?? (typeof options.timeout === \"number\" ? options.timeout : 60_000);\n const sanitizedEnv = sanitizeEnvironment(\n (options.env as NodeJS.ProcessEnv) ?? process.env,\n options.allowNodeOptions,\n );\n\n return execa(file, args as string[], {\n ...options,\n timeout,\n env: sanitizedEnv,\n });\n}\n","import { mkdir, rm } from \"node:fs/promises\";\nimport { join } from \"node:path\";\n\ninterface RepoLockOptions {\n timeoutMs?: number;\n retryDelayMs?: number;\n}\n\ninterface RepoLock {\n lockPath: string;\n release: () => Promise<void>;\n}\n\nasync function sleep(ms: number): Promise<void> {\n await new Promise((resolve) => setTimeout(resolve, ms));\n}\n\nexport async function acquireRepoLock(\n cwd: string,\n options: RepoLockOptions = {},\n): Promise<RepoLock> {\n const timeoutMs = options.timeoutMs ?? 15000;\n const retryDelayMs = options.retryDelayMs ?? 125;\n const lockRoot = join(cwd, \".autoremediator\", \"locks\");\n const lockPath = join(cwd, \".autoremediator\", \"locks\", \"remediation.lock\");\n const startedAt = Date.now();\n\n await mkdir(lockRoot, { recursive: true });\n\n while (true) {\n try {\n await mkdir(lockPath, { recursive: false });\n return {\n lockPath,\n release: async () => {\n await rm(lockPath, { recursive: true, force: true });\n },\n };\n } catch {\n if (Date.now() - startedAt > timeoutMs) {\n throw new Error(`Timed out waiting for repository lock at ${lockPath}.`);\n }\n await sleep(retryDelayMs);\n }\n }\n}\n\nexport async function withRepoLock<T>(\n cwd: string,\n fn: () => Promise<T>,\n options?: RepoLockOptions,\n): Promise<T> {\n const lock = await acquireRepoLock(cwd, options);\n try {\n return await fn();\n } finally {\n await lock.release();\n }\n}\n","/**\n * Call-Site Finder for Breaking Change Remediation\n *\n * Scans project source files using oxc-parser to identify all call sites,\n * import statements, and member expressions referencing a target dependency.\n */\nimport { existsSync, readdirSync, readFileSync, statSync } from \"node:fs\";\nimport { isAbsolute, join, resolve } from \"node:path\";\nimport { parseSync } from \"oxc-parser\";\n\nconst SOURCE_EXTENSIONS = new Set([\".ts\", \".tsx\", \".js\", \".jsx\", \".mjs\", \".cjs\", \".mts\", \".cts\"]);\nconst IGNORED_DIRS = new Set([\n \"node_modules\",\n \".git\",\n \"dist\",\n \"build\",\n \"coverage\",\n \".next\",\n \".turbo\",\n \".pnpm-store\",\n]);\n\nexport interface ImportReference {\n localName: string;\n importedName: string;\n isDefault: boolean;\n isNamespace: boolean;\n}\n\nexport interface ConsumerCallSite {\n filePath: string;\n sourceContent: string;\n importSources: string[];\n imports: ImportReference[];\n referencedLines: number[];\n}\n\nfunction* walkFiles(dir: string): Generator<string> {\n let entries: string[];\n try {\n entries = readdirSync(dir);\n } catch {\n return;\n }\n for (const entry of entries) {\n if (IGNORED_DIRS.has(entry)) continue;\n const full = join(dir, entry);\n let stat;\n try {\n stat = statSync(full);\n } catch {\n continue;\n }\n if (stat.isDirectory()) {\n yield* walkFiles(full);\n } else {\n const ext = full.slice(full.lastIndexOf(\".\"));\n if (SOURCE_EXTENSIONS.has(ext)) {\n yield full;\n }\n }\n }\n}\n\nexport function findPackageCallSites(\n cwd: string,\n packageName: string,\n): ConsumerCallSite[] {\n const callSites: ConsumerCallSite[] = [];\n\n for (const filePath of walkFiles(cwd)) {\n let content: string;\n try {\n content = readFileSync(filePath, \"utf8\");\n } catch {\n continue;\n }\n\n // Quick regex pre-filter to avoid unnecessary AST parsing\n if (!content.includes(packageName)) {\n continue;\n }\n\n try {\n const parseResult = parseSync(filePath, content);\n if (!parseResult.program) continue;\n\n const program = parseResult.program as unknown as {\n body: Array<{\n type: string;\n source?: { value?: string };\n specifiers?: Array<{\n type: string;\n local?: { name?: string; loc?: { start?: { line?: number } }; };\n imported?: { name?: string };\n }>;\n [key: string]: unknown;\n }>;\n };\n\n const imports: ImportReference[] = [];\n const importSources: string[] = [];\n const localNames = new Set<string>();\n\n for (const statement of program.body) {\n if (statement.type === \"ImportDeclaration\" && statement.source?.value) {\n const importSource = statement.source.value;\n if (importSource === packageName || importSource.startsWith(`${packageName}/`)) {\n importSources.push(importSource);\n\n for (const spec of statement.specifiers || []) {\n const localName = spec.local?.name || \"\";\n if (!localName) continue;\n localNames.add(localName);\n\n if (spec.type === \"ImportDefaultSpecifier\") {\n imports.push({\n localName,\n importedName: \"default\",\n isDefault: true,\n isNamespace: false,\n });\n } else if (spec.type === \"ImportNamespaceSpecifier\") {\n imports.push({\n localName,\n importedName: \"*\",\n isDefault: false,\n isNamespace: true,\n });\n } else if (spec.type === \"ImportSpecifier\") {\n imports.push({\n localName,\n importedName: spec.imported?.name || localName,\n isDefault: false,\n isNamespace: false,\n });\n }\n }\n }\n }\n }\n\n if (imports.length > 0 || importSources.length > 0) {\n // Collect line numbers referencing the imported identifiers\n const lines = content.split(\"\\n\");\n const referencedLines: number[] = [];\n\n lines.forEach((line, index) => {\n for (const local of localNames) {\n // Word boundary match\n const regex = new RegExp(`\\\\b${local}\\\\b`);\n if (regex.test(line)) {\n referencedLines.push(index + 1);\n break;\n }\n }\n });\n\n callSites.push({\n filePath,\n sourceContent: content,\n importSources,\n imports,\n referencedLines,\n });\n }\n } catch {\n // Ignore parser syntax errors in consumer files\n }\n }\n\n return callSites;\n}\n","/**\n * Breaking Change Refactoring Engine\n *\n * Automatically refactors consumer call sites when upgrading a vulnerable package\n * across breaking major versions or breaking minor changes.\n */\nimport { readFileSync, writeFileSync } from \"node:fs\";\nimport type { ConsumerCallSite } from \"./call-site-finder.js\";\n\nexport interface RefactorParams {\n cwd: string;\n packageName: string;\n fromVersion: string;\n toVersion: string;\n diagnosticError: string;\n callSites: ConsumerCallSite[];\n}\n\nexport interface RefactorExecutionResult {\n applied: boolean;\n refactoredFiles: string[];\n snapshots: Record<string, string>;\n error?: string;\n}\n\nexport interface ParsedTsDiagnostic {\n filePath?: string;\n line?: number;\n column?: number;\n code?: string;\n message: string;\n suggestedSymbol?: string;\n missingMember?: string;\n}\n\n/**\n * Parses compiler/typecheck diagnostic output into structured errors.\n */\nexport function parseCompilerDiagnostics(diagnosticError: string): ParsedTsDiagnostic[] {\n const diagnostics: ParsedTsDiagnostic[] = [];\n const lines = diagnosticError.split(\"\\n\");\n\n for (const line of lines) {\n const trimmed = line.trim();\n if (!trimmed) continue;\n\n // Pattern 1: path/to/file.ts(line,col): error TSxxxx: message\n // Pattern 2: path/to/file.ts:line:col - error TSxxxx: message\n const match = trimmed.match(\n /(?:([^\\s:(]+)[:(](\\d+)[:,](\\d+)\\)?:?\\s*(?:-\\s*)?(?:error\\s+)?(TS\\d+)?:?\\s*(.*))/i,\n );\n\n if (match) {\n const [, filePath, lineStr, colStr, code, message] = match;\n const diag: ParsedTsDiagnostic = {\n filePath,\n line: lineStr ? parseInt(lineStr, 10) : undefined,\n column: colStr ? parseInt(colStr, 10) : undefined,\n code,\n message: message || trimmed,\n };\n\n // Extract \"Did you mean 'xyz'?\"\n const suggestionMatch = diag.message.match(/Did you mean ['\"]([a-zA-Z0-9_$]+)['\"]\\?/i);\n if (suggestionMatch) {\n diag.suggestedSymbol = suggestionMatch[1];\n }\n\n // Extract missing exported member or property\n const missingMatch =\n diag.message.match(/has no exported member ['\"]([a-zA-Z0-9_$]+)['\"]/i) ||\n diag.message.match(/Property ['\"]([a-zA-Z0-9_$]+)['\"] does not exist/i);\n if (missingMatch) {\n diag.missingMember = missingMatch[1];\n }\n\n diagnostics.push(diag);\n }\n }\n\n return diagnostics;\n}\n\n/**\n * Restores original file contents from snapshot in case of failure.\n */\nexport function revertRefactorSnapshots(snapshots: Record<string, string>): void {\n for (const [filePath, content] of Object.entries(snapshots)) {\n try {\n writeFileSync(filePath, content, \"utf8\");\n } catch {\n // Ignore write errors during emergency rollback\n }\n }\n}\n\n/**\n * Known library breaking change migration transforms\n */\nconst KNOWN_MIGRATIONS: Record<\n string,\n Array<{\n detect: (content: string, diag: string) => boolean;\n transform: (content: string) => string;\n }>\n> = {\n rimraf: [\n {\n detect: (content, diag) => diag.includes(\"sync\") && content.includes(\"rimraf.sync(\"),\n transform: (content) => {\n let res = content.replace(/import\\s+rimraf\\s+from\\s+['\"]rimraf['\"];?/g, \"\");\n res = `import { rimrafSync } from \"rimraf\";\\n` + res;\n return res.replace(/rimraf\\.sync\\(/g, \"rimrafSync(\");\n },\n },\n ],\n uuid: [\n {\n detect: (content, diag) => diag.includes(\"v4\") && content.includes(\"uuid.v4(\"),\n transform: (content) => {\n let res = content.replace(/import\\s+uuid\\s+from\\s+['\"]uuid['\"];?/g, \"\");\n res = `import { v4 as uuidv4 } from \"uuid\";\\n` + res;\n return res.replace(/uuid\\.v4\\(/g, \"uuidv4(\");\n },\n },\n {\n // Subpath import migration: `import v4 from \"uuid/v4\"` -> `import { v4 } from \"uuid\"`\n detect: (content) => /from\\s+['\"]uuid\\/v4['\"]/.test(content),\n transform: (content) =>\n content.replace(\n /import\\s+([a-zA-Z0-9_$]+)\\s+from\\s+['\"]uuid\\/v4['\"];?/g,\n `import { v4 as $1 } from \"uuid\";`,\n ),\n },\n ],\n glob: [\n {\n detect: (content, diag) => diag.includes(\"sync\") && content.includes(\"glob.sync(\"),\n transform: (content) => {\n let res = content.replace(/import\\s+glob\\s+from\\s+['\"]glob['\"];?/g, \"\");\n res = `import { globSync } from \"glob\";\\n` + res;\n return res.replace(/glob\\.sync\\(/g, \"globSync(\");\n },\n },\n ],\n mkdirp: [\n {\n detect: (content, diag) => diag.includes(\"sync\") && content.includes(\"mkdirp.sync(\"),\n transform: (content) => {\n let res = content.replace(/import\\s+mkdirp\\s+from\\s+['\"]mkdirp['\"];?/g, \"\");\n res = `import { mkdirpSync } from \"mkdirp\";\\n` + res;\n return res.replace(/mkdirp\\.sync\\(/g, \"mkdirpSync(\");\n },\n },\n ],\n};\n\nfunction escapeRegex(str: string): string {\n return str.replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\");\n}\n\n/**\n * Applies deterministic and compiler-guided transformations to a source file.\n */\nfunction transformFileContent(\n content: string,\n packageName: string,\n diagnosticError: string,\n filePath?: string,\n): { modified: boolean; newContent: string } {\n let modified = false;\n let newContent = content;\n\n // 1. Check known library migrations\n const migrations = KNOWN_MIGRATIONS[packageName];\n if (migrations) {\n for (const mig of migrations) {\n if (mig.detect(newContent, diagnosticError)) {\n const transformed = mig.transform(newContent);\n if (transformed !== newContent) {\n newContent = transformed;\n modified = true;\n }\n }\n }\n }\n\n // 2. Default export removed in favor of namespace or named export\n // e.g. \"Module '\\\"chalk\\\"' has no default export\", \"has no exported member 'default'\", TS2614, TS1192\n if (\n diagnosticError.includes(\"no default export\") ||\n diagnosticError.includes(\"has no exported member 'default'\") ||\n diagnosticError.includes(\"has no exported member default\") ||\n diagnosticError.includes(\"TS2614\") ||\n diagnosticError.includes(\"TS1192\")\n ) {\n // `import foo from \"pkg\"` -> `import * as foo from \"pkg\"`\n const defaultImportRegex = new RegExp(\n `import\\\\s+([a-zA-Z0-9_$]+)\\\\s+from\\\\s+['\"]${escapeRegex(packageName)}['\"]`,\n \"g\",\n );\n if (defaultImportRegex.test(newContent)) {\n newContent = newContent.replace(\n defaultImportRegex,\n `import * as $1 from \"${packageName}\"`,\n );\n modified = true;\n }\n }\n\n // 3. Namespace import deprecated in favor of default import\n // e.g. \"This module is declared with using 'export =', and can only be used with a default import\" (TS1259)\n if (\n diagnosticError.includes(\"can only be used with a default import\") ||\n diagnosticError.includes(\"only be used with a default import\") ||\n diagnosticError.includes(\"TS1259\")\n ) {\n const starImportRegex = new RegExp(\n `import\\\\s+\\\\*\\\\s+as\\\\s+([a-zA-Z0-9_$]+)\\\\s+from\\\\s+['\"]${escapeRegex(packageName)}['\"]`,\n \"g\",\n );\n if (starImportRegex.test(newContent)) {\n newContent = newContent.replace(\n starImportRegex,\n `import $1 from \"${packageName}\"`,\n );\n modified = true;\n }\n }\n\n // 4. Compiler feedback: \"Did you mean 'XYZ'?\" auto-replacement\n const diagnostics = parseCompilerDiagnostics(diagnosticError);\n for (const diag of diagnostics) {\n if (diag.missingMember && diag.suggestedSymbol) {\n const missingMember = diag.missingMember;\n const suggestedSymbol = diag.suggestedSymbol;\n\n // If error specified a line number in this file, target that line specifically\n if (\n filePath &&\n diag.filePath &&\n filePath.endsWith(diag.filePath) &&\n diag.line &&\n diag.line > 0\n ) {\n const fileLines = newContent.split(\"\\n\");\n const idx = diag.line - 1;\n if (idx >= 0 && idx < fileLines.length) {\n const line = fileLines[idx]!;\n const replaced = line\n .replace(new RegExp(`\\\\.${escapeRegex(missingMember)}\\\\b`, \"g\"), `.${suggestedSymbol}`)\n .replace(new RegExp(`\\\\b${escapeRegex(missingMember)}\\\\b`, \"g\"), suggestedSymbol);\n if (replaced !== line) {\n fileLines[idx] = replaced;\n newContent = fileLines.join(\"\\n\");\n modified = true;\n }\n }\n } else {\n // Replace member expression: pkg.missingMember -> pkg.suggestedSymbol\n const memberRegex = new RegExp(`\\\\.${escapeRegex(missingMember)}\\\\b`, \"g\");\n if (memberRegex.test(newContent)) {\n newContent = newContent.replace(memberRegex, `.${suggestedSymbol}`);\n modified = true;\n }\n\n // Replace in named imports: import { missingMember } from \"pkg\"\n const importPattern = new RegExp(\n `import\\\\s*\\\\{[^}]*\\\\b${escapeRegex(missingMember)}\\\\b[^}]*\\\\}\\\\s*from\\\\s*['\"]${escapeRegex(packageName)}['\"]`,\n \"g\",\n );\n if (importPattern.test(newContent)) {\n newContent = newContent.replace(\n importPattern,\n (match) => match.replace(new RegExp(`\\\\b${escapeRegex(missingMember)}\\\\b`, \"g\"), suggestedSymbol),\n );\n modified = true;\n }\n }\n }\n }\n\n // 5. Targeted type error suppression if errors point specifically to this file\n // Sort descending by line number to avoid line-shift index skew!\n const lineDiags = diagnostics\n .filter(\n (d) =>\n Boolean(filePath && d.filePath && filePath.endsWith(d.filePath) && typeof d.line === \"number\" && d.line > 0),\n )\n .sort((a, b) => b.line! - a.line!);\n\n const processedLines = new Set<number>();\n for (const diag of lineDiags) {\n if (processedLines.has(diag.line!)) continue;\n processedLines.add(diag.line!);\n\n const fileLines = newContent.split(\"\\n\");\n const targetLineIdx = diag.line! - 1;\n if (targetLineIdx >= 0 && targetLineIdx < fileLines.length) {\n const prevLine = targetLineIdx > 0 ? fileLines[targetLineIdx - 1] : \"\";\n if (!prevLine?.includes(\"@ts-expect-error\") && !fileLines[targetLineIdx]?.includes(\"@ts-expect-error\")) {\n const indent = fileLines[targetLineIdx]?.match(/^\\s*/)?.[0] || \"\";\n fileLines.splice(\n targetLineIdx,\n 0,\n `${indent}// @ts-expect-error [autoremediator-refactor]: breaking change in ${packageName}`,\n );\n newContent = fileLines.join(\"\\n\");\n modified = true;\n }\n }\n }\n\n return { modified, newContent };\n}\n\nexport async function refactorConsumerCallSites(\n params: RefactorParams,\n): Promise<RefactorExecutionResult> {\n const { packageName, diagnosticError, callSites } = params;\n\n if (callSites.length === 0) {\n return {\n applied: false,\n refactoredFiles: [],\n snapshots: {},\n error: `No consumer call sites found for \"${packageName}\".`,\n };\n }\n\n const snapshots: Record<string, string> = {};\n const refactoredFiles: string[] = [];\n\n try {\n for (const site of callSites) {\n const originalContent = site.sourceContent || readFileSync(site.filePath, \"utf8\");\n snapshots[site.filePath] = originalContent;\n\n const { modified, newContent } = transformFileContent(\n originalContent,\n packageName,\n diagnosticError,\n site.filePath,\n );\n\n if (modified && newContent !== originalContent) {\n writeFileSync(site.filePath, newContent, \"utf8\");\n refactoredFiles.push(site.filePath);\n }\n }\n\n if (refactoredFiles.length === 0) {\n return {\n applied: false,\n refactoredFiles: [],\n snapshots,\n error: \"No automated codemod pattern matched the diagnostic error.\",\n };\n }\n\n return {\n applied: true,\n refactoredFiles,\n snapshots,\n };\n } catch (err) {\n revertRefactorSnapshots(snapshots);\n const message = err instanceof Error ? err.message : String(err);\n return {\n applied: false,\n refactoredFiles: [],\n snapshots: {},\n error: `Failed to apply breaking change refactoring: ${message}`,\n };\n }\n}\n","import { defineTool } from \"../tool-compat.js\";\nimport { z } from \"zod\";\nimport { join } from \"node:path\";\nimport { existsSync, readFileSync, writeFileSync } from \"node:fs\";\nimport { safeExeca } from \"../../../platform/safe-exec.js\";\nimport semver from \"semver\";\nimport type { PatchResult } from \"../../../platform/types.js\";\nimport { isPackageAllowed, loadPolicy } from \"../../../platform/policy.js\";\nimport { withRepoLock } from \"../../../platform/repo-lock.js\";\nimport {\n detectPackageManager,\n getYarnMajorVersion,\n resolveDedupeCommand,\n resolveInstallCommand,\n resolveTestCommand,\n type PackageManager,\n} from \"../../../platform/package-manager/index.js\";\nimport {\n collectDependencyTrace,\n describeOverrideField,\n getDenoJsonImportValue,\n getOverrideValue,\n restoreDenoJsonImportValue,\n restoreOverrideValue,\n setDenoJsonImportValue,\n setOverrideValue,\n type DenoJson,\n type RawPackageJson,\n} from \"./helpers.js\";\n\nexport const applyPackageOverrideTool = defineTool({\n description:\n \"Apply a package-manager-native package.json override for a vulnerable transitive dependency and reinstall. Uses npm overrides, pnpm.overrides, yarn resolutions, bun overrides, or deno.json imports.\",\n parameters: z.object({\n cwd: z.string().describe(\"Absolute path to the consumer project root\"),\n packageManager: z\n .enum([\"npm\", \"pnpm\", \"yarn\", \"bun\", \"deno\"])\n .optional()\n .describe(\"Package manager used by the target project (auto-detected if omitted)\"),\n packageName: z.string().describe(\"The npm package to override\"),\n selector: z\n .string()\n .optional()\n .describe(\"Optional manager-native override selector key (for nested or scoped overrides)\"),\n fromVersion: z.string().describe(\"The currently installed vulnerable version\"),\n toVersion: z.string().describe(\"The safe target version to override to\"),\n dryRun: z.boolean().default(false).describe(\"If true, report changes but do not write\"),\n policy: z.string().optional().describe(\"Optional path to .autoremediator policy file\"),\n runTests: z\n .boolean()\n .default(false)\n .describe(\"If true, run test validation after applying the override\"),\n installMode: z.enum([\"standard\", \"prefer-offline\", \"deterministic\"]).optional(),\n installPreferOffline: z.boolean().optional(),\n enforceFrozenLockfile: z.boolean().optional(),\n workspace: z.string().optional(),\n }),\n execute: async ({\n cwd,\n packageManager,\n packageName,\n selector,\n fromVersion,\n toVersion,\n dryRun,\n policy,\n runTests,\n installMode,\n installPreferOffline,\n enforceFrozenLockfile,\n workspace,\n }): Promise<PatchResult> => {\n const pm = (packageManager ?? detectPackageManager(cwd)) as PackageManager;\n const pkgPath = join(cwd, \"package.json\");\n const denoJsonPath = join(cwd, \"deno.json\");\n const isDenoNative = pm === \"deno\" && !existsSync(pkgPath);\n const loadedPolicy = loadPolicy(cwd, policy);\n const commandConstraints = {\n ...loadedPolicy.constraints,\n installMode: installMode ?? loadedPolicy.constraints?.installMode,\n installPreferOffline: installPreferOffline ?? loadedPolicy.constraints?.installPreferOffline,\n enforceFrozenLockfile:\n enforceFrozenLockfile ?? loadedPolicy.constraints?.enforceFrozenLockfile,\n workspace: workspace ?? loadedPolicy.constraints?.workspace,\n };\n const yarnMajor = pm === \"yarn\" ? await getYarnMajorVersion(cwd) : undefined;\n const installCommand = resolveInstallCommand(pm, commandConstraints, yarnMajor);\n const testCommand = resolveTestCommand(pm, commandConstraints);\n const dedupeCommand = resolveDedupeCommand(pm, commandConstraints);\n const overrideSelector = selector?.trim() || packageName;\n\n if (!isPackageAllowed(loadedPolicy, packageName)) {\n return {\n packageName,\n strategy: \"none\",\n fromVersion,\n toVersion,\n applied: false,\n dryRun,\n unresolvedReason: \"policy-blocked\",\n message: `Policy blocked changes for package \"${packageName}\".`,\n };\n }\n\n const isMajorBump =\n semver.valid(fromVersion) &&\n semver.valid(toVersion) &&\n semver.major(toVersion) > semver.major(fromVersion);\n\n if (isMajorBump && !loadedPolicy.allowMajorBumps) {\n return {\n packageName,\n strategy: \"none\",\n fromVersion,\n toVersion,\n applied: false,\n dryRun,\n unresolvedReason: \"major-bump-required\",\n message: `Policy blocked major override for \"${packageName}\" (${fromVersion} -> ${toVersion}).`,\n };\n }\n\n // ---- Deno native path (deno.json import map, no package.json) ----\n if (isDenoNative) {\n let denoJson: DenoJson;\n try {\n denoJson = JSON.parse(readFileSync(denoJsonPath, \"utf8\")) as DenoJson;\n } catch {\n return {\n packageName,\n strategy: \"none\",\n fromVersion,\n toVersion,\n applied: false,\n dryRun,\n unresolvedReason: \"package-json-not-found\",\n message: `Could not read deno.json at \"${denoJsonPath}\".`,\n };\n }\n\n const existingEntry = getDenoJsonImportValue(denoJson, overrideSelector);\n if (!existingEntry) {\n return {\n packageName,\n strategy: \"none\",\n fromVersion,\n toVersion,\n applied: false,\n dryRun,\n unresolvedReason: \"transitive-override-unsupported-deno-native\",\n message: `Cannot apply transitive override for \"${overrideSelector}\" in a native Deno project (no package.json). Only direct dependencies declared in deno.json imports can be overridden.`,\n };\n }\n\n const dependencyTrace = await collectDependencyTrace(\n cwd,\n pm,\n packageName,\n commandConstraints,\n );\n const dependencyTraceSuffix = dependencyTrace ? ` Dependency trace: ${dependencyTrace}` : \"\";\n\n if (dryRun) {\n return {\n packageName,\n strategy: \"override\",\n fromVersion,\n toVersion,\n applied: false,\n dryRun: true,\n message: `[DRY RUN] Would update deno.json imports[\"${existingEntry.key}\"] to \"npm:${overrideSelector}@${toVersion}\", then run ${installCommand.join(\" \")}.${dependencyTraceSuffix}`,\n };\n }\n\n return withRepoLock(cwd, async () => {\n setDenoJsonImportValue(denoJson, overrideSelector, toVersion);\n writeFileSync(denoJsonPath, JSON.stringify(denoJson, null, 2) + \"\\n\", \"utf8\");\n\n try {\n const [installCmd, ...installArgs] = installCommand;\n await safeExeca(installCmd, installArgs, { cwd, stdio: \"pipe\" });\n } catch (err) {\n restoreDenoJsonImportValue(denoJson, overrideSelector, existingEntry);\n writeFileSync(denoJsonPath, JSON.stringify(denoJson, null, 2) + \"\\n\", \"utf8\");\n const message = err instanceof Error ? err.message : String(err);\n return {\n packageName,\n strategy: \"override\",\n fromVersion,\n toVersion,\n applied: false,\n dryRun: false,\n unresolvedReason: \"override-apply-failed\",\n message: `${installCommand.join(\" \")} failed after updating deno.json imports for \"${overrideSelector}\" to ${toVersion}. Reverted. Error: ${message}${dependencyTraceSuffix}`,\n };\n }\n\n if (runTests) {\n try {\n const [testCmd, ...testArgs] = testCommand;\n await safeExeca(testCmd, testArgs, { cwd, stdio: \"pipe\" });\n } catch (err) {\n restoreDenoJsonImportValue(denoJson, overrideSelector, existingEntry);\n writeFileSync(denoJsonPath, JSON.stringify(denoJson, null, 2) + \"\\n\", \"utf8\");\n\n try {\n const [rollbackCmd, ...rollbackArgs] = installCommand;\n await safeExeca(rollbackCmd, rollbackArgs, { cwd, stdio: \"pipe\" });\n } catch {\n // Ignore rollback failure.\n }\n\n const message = err instanceof Error ? err.message : String(err);\n return {\n packageName,\n strategy: \"override\",\n fromVersion,\n toVersion,\n applied: false,\n dryRun: false,\n unresolvedReason: \"validation-failed\",\n message: `${testCommand.join(\" \")} failed after updating deno.json imports for \"${overrideSelector}\" to ${toVersion}. Reverted. Error: ${message}${dependencyTraceSuffix}`,\n };\n }\n }\n\n return {\n packageName,\n strategy: \"override\",\n fromVersion,\n toVersion,\n applied: true,\n dryRun: false,\n message: `Successfully updated deno.json imports[\"${existingEntry.key}\"] for \"${overrideSelector}\" from ${fromVersion} to ${toVersion}, then ran ${installCommand.join(\" \")}${runTests ? ` and passed ${testCommand.join(\" \")}` : \"\"}.${dependencyTraceSuffix}`,\n };\n });\n }\n\n // ---- npm / pnpm / yarn / bun / deno-npm-compat path ----\n let pkgJson: RawPackageJson;\n try {\n pkgJson = JSON.parse(readFileSync(pkgPath, \"utf8\")) as RawPackageJson;\n } catch {\n return {\n packageName,\n strategy: \"none\",\n fromVersion,\n toVersion,\n applied: false,\n dryRun,\n unresolvedReason: \"package-json-not-found\",\n message: `Could not read package.json at \"${pkgPath}\".`,\n };\n }\n\n const overrideLabel = describeOverrideField(pm);\n const previousValue = getOverrideValue(pkgJson, pm, overrideSelector);\n\n const dependencyTrace = await collectDependencyTrace(cwd, pm, packageName, commandConstraints);\n const dependencyTraceSuffix = dependencyTrace ? ` Dependency trace: ${dependencyTrace}` : \"\";\n\n if (dryRun) {\n return {\n packageName,\n strategy: \"override\",\n fromVersion,\n toVersion,\n applied: false,\n dryRun: true,\n message: `[DRY RUN] Would set ${overrideLabel}.${overrideSelector} to \"${toVersion}\", then run ${installCommand.join(\" \")}${runTests ? ` and ${testCommand.join(\" \")}` : \"\"}${dedupeCommand.length > 0 ? ` and ${dedupeCommand.join(\" \")} (best-effort)` : \"\"}.${dependencyTraceSuffix}`,\n };\n }\n\n return withRepoLock(cwd, async () => {\n setOverrideValue(pkgJson, pm, overrideSelector, toVersion);\n writeFileSync(pkgPath, JSON.stringify(pkgJson, null, 2) + \"\\n\", \"utf8\");\n\n try {\n const [installCmd, ...installArgs] = installCommand;\n await safeExeca(installCmd, installArgs, { cwd, stdio: \"pipe\" });\n } catch (err) {\n restoreOverrideValue(pkgJson, pm, overrideSelector, previousValue);\n writeFileSync(pkgPath, JSON.stringify(pkgJson, null, 2) + \"\\n\", \"utf8\");\n const message = err instanceof Error ? err.message : String(err);\n return {\n packageName,\n strategy: \"override\",\n fromVersion,\n toVersion,\n applied: false,\n dryRun: false,\n unresolvedReason: \"override-apply-failed\",\n message: `${installCommand.join(\" \")} failed after applying ${overrideLabel} for \"${overrideSelector}\" to ${toVersion}. Reverted. Error: ${message}${dependencyTraceSuffix}`,\n };\n }\n\n if (runTests) {\n try {\n const [testCmd, ...testArgs] = testCommand;\n await safeExeca(testCmd, testArgs, { cwd, stdio: \"pipe\" });\n } catch (err) {\n restoreOverrideValue(pkgJson, pm, overrideSelector, previousValue);\n writeFileSync(pkgPath, JSON.stringify(pkgJson, null, 2) + \"\\n\", \"utf8\");\n\n try {\n const [rollbackCmd, ...rollbackArgs] = installCommand;\n await safeExeca(rollbackCmd, rollbackArgs, { cwd, stdio: \"pipe\" });\n } catch {\n // Ignore rollback install failure and return original test failure context.\n }\n\n const message = err instanceof Error ? err.message : String(err);\n return {\n packageName,\n strategy: \"override\",\n fromVersion,\n toVersion,\n applied: false,\n dryRun: false,\n unresolvedReason: \"validation-failed\",\n message: `${testCommand.join(\" \")} failed after applying ${overrideLabel} for \"${overrideSelector}\" to ${toVersion}. Reverted. Error: ${message}${dependencyTraceSuffix}`,\n };\n }\n }\n\n let dedupeNote = \"\";\n if (dedupeCommand.length > 0) {\n try {\n const [dedupeCmd, ...dedupeArgs] = dedupeCommand;\n await safeExeca(dedupeCmd, dedupeArgs, { cwd, stdio: \"pipe\" });\n } catch (err) {\n const message = err instanceof Error ? err.message : String(err);\n dedupeNote = ` Dedupe warning: ${dedupeCommand.join(\" \")} failed (${message}).`;\n }\n }\n\n return {\n packageName,\n strategy: \"override\",\n fromVersion,\n toVersion,\n applied: true,\n dryRun: false,\n message: `Successfully applied ${overrideLabel} for \"${overrideSelector}\" from ${fromVersion} to ${toVersion}, then ran ${installCommand.join(\" \")}${runTests ? ` and passed ${testCommand.join(\" \")}` : \"\"}.${dedupeNote}${dependencyTraceSuffix}`,\n };\n });\n },\n});\n","import { safeExeca } from \"../../../platform/safe-exec.js\";\nimport { resolveWhyCommand, type PackageManager } from \"../../../platform/package-manager/index.js\";\n\nexport interface RawPackageJson {\n overrides?: Record<string, string>;\n resolutions?: Record<string, string>;\n pnpm?: {\n overrides?: Record<string, string>;\n [key: string]: unknown;\n };\n [key: string]: unknown;\n}\n\nexport interface WhyConstraints {\n workspace?: string;\n}\n\nexport async function collectDependencyTrace(\n cwd: string,\n pm: PackageManager,\n packageName: string,\n constraints: WhyConstraints,\n): Promise<string | undefined> {\n try {\n const whyCommand = resolveWhyCommand(pm, packageName, constraints);\n if (whyCommand.length === 0) return undefined;\n const [whyCmd, ...whyArgs] = whyCommand;\n const result = await safeExeca(whyCmd, whyArgs, {\n cwd,\n stdio: \"pipe\",\n reject: false,\n });\n\n const output = [result.stdout, result.stderr]\n .filter(Boolean)\n .join(\"\\n\")\n .split(\"\\n\")\n .map((line) => line.trim())\n .filter(Boolean);\n\n if (output.length === 0) return undefined;\n return output.slice(0, 3).join(\" | \");\n } catch {\n return undefined;\n }\n}\n\nexport function describeOverrideField(packageManager: PackageManager): string {\n if (packageManager === \"npm\" || packageManager === \"bun\") return \"overrides\";\n if (packageManager === \"pnpm\") return \"pnpm.overrides\";\n if (packageManager === \"deno\") return \"overrides\";\n return \"resolutions\";\n}\n\nexport function getOverrideValue(\n pkgJson: RawPackageJson,\n packageManager: PackageManager,\n packageName: string,\n): string | undefined {\n if (packageManager === \"npm\" || packageManager === \"bun\" || packageManager === \"deno\") {\n return pkgJson.overrides?.[packageName];\n }\n if (packageManager === \"pnpm\") return pkgJson.pnpm?.overrides?.[packageName];\n return pkgJson.resolutions?.[packageName];\n}\n\nexport function setOverrideValue(\n pkgJson: RawPackageJson,\n packageManager: PackageManager,\n packageName: string,\n version: string,\n): void {\n if (packageManager === \"npm\" || packageManager === \"bun\" || packageManager === \"deno\") {\n pkgJson.overrides = { ...pkgJson.overrides, [packageName]: version };\n return;\n }\n\n if (packageManager === \"pnpm\") {\n pkgJson.pnpm = {\n ...pkgJson.pnpm,\n overrides: {\n ...pkgJson.pnpm?.overrides,\n [packageName]: version,\n },\n };\n return;\n }\n\n pkgJson.resolutions = { ...pkgJson.resolutions, [packageName]: version };\n}\n\nexport function restoreOverrideValue(\n pkgJson: RawPackageJson,\n packageManager: PackageManager,\n packageName: string,\n previousValue?: string,\n): void {\n if (packageManager === \"npm\" || packageManager === \"bun\" || packageManager === \"deno\") {\n pkgJson.overrides = restoreRecord(pkgJson.overrides, packageName, previousValue);\n return;\n }\n\n if (packageManager === \"pnpm\") {\n pkgJson.pnpm = {\n ...pkgJson.pnpm,\n overrides: restoreRecord(pkgJson.pnpm?.overrides, packageName, previousValue),\n };\n if (!pkgJson.pnpm.overrides) {\n delete pkgJson.pnpm.overrides;\n }\n if (Object.keys(pkgJson.pnpm).length === 0) {\n delete pkgJson.pnpm;\n }\n return;\n }\n\n pkgJson.resolutions = restoreRecord(pkgJson.resolutions, packageName, previousValue);\n}\n\n// ---- Deno native (deno.json import map) override helpers ----\n\nexport interface DenoJson {\n imports?: Record<string, string>;\n [key: string]: unknown;\n}\n\n/**\n * Get the current entry for a package from deno.json imports.\n * Checks both bare `\"pkgName\"` and `\"npm:pkgName\"` specifier forms.\n */\nexport function getDenoJsonImportValue(\n denoJson: DenoJson,\n packageName: string,\n): { key: string; value: string } | undefined {\n const imports = denoJson.imports ?? {};\n if (imports[packageName] !== undefined) {\n return { key: packageName, value: imports[packageName] };\n }\n const npmKey = `npm:${packageName}`;\n if (imports[npmKey] !== undefined) {\n return { key: npmKey, value: imports[npmKey] };\n }\n return undefined;\n}\n\n/**\n * Set an import-map entry for a package in deno.json to the target npm version.\n * Uses the existing key form if present, otherwise adds `\"npm:pkgName\"`.\n */\nexport function setDenoJsonImportValue(\n denoJson: DenoJson,\n packageName: string,\n version: string,\n): void {\n const existing = getDenoJsonImportValue(denoJson, packageName);\n const key = existing?.key ?? `npm:${packageName}`;\n denoJson.imports = { ...denoJson.imports, [key]: `npm:${packageName}@${version}` };\n}\n\n/**\n * Restore a deno.json import entry to its previous state.\n * If no previous entry existed, removes the key that was added.\n */\nexport function restoreDenoJsonImportValue(\n denoJson: DenoJson,\n packageName: string,\n previousEntry?: { key: string; value: string },\n): void {\n const existing = getDenoJsonImportValue(denoJson, packageName);\n if (!existing) return;\n\n const imports = { ...denoJson.imports };\n if (previousEntry === undefined) {\n delete imports[existing.key];\n } else {\n // Remove the current key (may differ in form) and restore previous\n delete imports[existing.key];\n imports[previousEntry.key] = previousEntry.value;\n }\n\n denoJson.imports = Object.keys(imports).length > 0 ? imports : undefined;\n}\n\nfunction restoreRecord(\n record: Record<string, string> | undefined,\n key: string,\n previousValue?: string,\n): Record<string, string> | undefined {\n const nextRecord = { ...record };\n\n if (previousValue === undefined) {\n delete nextRecord[key];\n } else {\n nextRecord[key] = previousValue;\n }\n\n return Object.keys(nextRecord).length > 0 ? nextRecord : undefined;\n}\n","/**\n * Supply chain trust & anti-poisoning verification gate\n *\n * Inspects package metadata before auto-upgrades to protect against:\n * 1. Freshly published releases (e.g. account hijacking window < 48-72h)\n * 2. Malicious install scripts (preinstall/postinstall execution)\n * 3. Unattested builds when provenance is required\n */\nimport { httpClient } from \"./http-client.js\";\nimport type { SupplyChainPolicy } from \"./types.js\";\n\nexport interface PackageTrustVerdict {\n trusted: boolean;\n reason?: string;\n publishAgeHours?: number;\n hasInstallScripts?: boolean;\n hasProvenance?: boolean;\n}\n\ninterface NpmPackumentVersion {\n name: string;\n version: string;\n scripts?: Record<string, string>;\n dist?: {\n attestations?: {\n url?: string;\n provenance?: { predicateType?: string };\n };\n tarball?: string;\n integrity?: string;\n };\n _hasShrinkwrap?: boolean;\n}\n\ninterface NpmPackument {\n name: string;\n time?: Record<string, string>;\n versions?: Record<string, NpmPackumentVersion>;\n}\n\nexport async function verifyPackageTrust(\n packageName: string,\n targetVersion: string,\n policy?: SupplyChainPolicy,\n): Promise<PackageTrustVerdict> {\n if (\n !policy ||\n (!policy.minPublishAgeHours && !policy.blockInstallScripts && !policy.requireProvenance)\n ) {\n return { trusted: true };\n }\n\n const url = `https://registry.npmjs.org/${encodeURIComponent(packageName)}`;\n\n let packument: NpmPackument | null = null;\n try {\n const res = await httpClient({\n url,\n headers: { Accept: \"application/vnd.npm.install-v1+json; q=1.0, application/json; q=0.8\" },\n });\n if (res.ok && res.data) {\n packument = res.data as NpmPackument;\n }\n } catch (err) {\n // If registry is unreachable, fail closed only if strict policy\n const msg = err instanceof Error ? err.message : String(err);\n return {\n trusted: false,\n reason: `Could not verify supply-chain trust for \"${packageName}@${targetVersion}\": ${msg}`,\n };\n }\n\n if (!packument) {\n return {\n trusted: false,\n reason: `Package packument for \"${packageName}\" not found on registry.`,\n };\n }\n\n // 1. Check publish age\n let publishAgeHours: number | undefined;\n if (packument.time?.[targetVersion]) {\n const publishedAt = new Date(packument.time[targetVersion]).getTime();\n publishAgeHours = Math.max(0, (Date.now() - publishedAt) / (1000 * 60 * 60));\n\n if (policy.minPublishAgeHours && publishAgeHours < policy.minPublishAgeHours) {\n return {\n trusted: false,\n publishAgeHours,\n reason: `Target release \"${packageName}@${targetVersion}\" was published only ${publishAgeHours.toFixed(1)}h ago (minimum required age is ${policy.minPublishAgeHours}h).`,\n };\n }\n }\n\n const versionData = packument.versions?.[targetVersion];\n\n // 2. Check install lifecycle scripts\n const scripts = versionData?.scripts ?? {};\n const installScriptKeys = [\"preinstall\", \"install\", \"postinstall\"].filter((k) =>\n Boolean(scripts[k]),\n );\n const hasInstallScripts = installScriptKeys.length > 0;\n\n if (policy.blockInstallScripts && hasInstallScripts) {\n return {\n trusted: false,\n publishAgeHours,\n hasInstallScripts: true,\n reason: `Target release \"${packageName}@${targetVersion}\" defines risky lifecycle scripts (${installScriptKeys.join(\", \")}).`,\n };\n }\n\n // 3. Check provenance attestation\n const hasProvenance = Boolean(\n versionData?.dist?.attestations?.provenance || versionData?.dist?.attestations?.url,\n );\n if (policy.requireProvenance && !hasProvenance) {\n return {\n trusted: false,\n publishAgeHours,\n hasInstallScripts,\n hasProvenance: false,\n reason: `Target release \"${packageName}@${targetVersion}\" does not have cryptographic build provenance attestations.`,\n };\n }\n\n return {\n trusted: true,\n publishAgeHours,\n hasInstallScripts,\n hasProvenance,\n };\n}\n","import { resolveSafeUpgradeVersion } from \"../../intelligence/sources/registry.js\";\nimport { applyVersionBumpTool } from \"../tools/apply-version-bump.js\";\nimport { applyPackageOverrideTool } from \"../tools/apply-package-override/index.js\";\nimport { verifyPackageTrust } from \"../../platform/supply-chain.js\";\nimport type {\n PackageManager,\n PatchResult,\n RemediationConstraints,\n SupplyChainPolicy,\n VulnerablePackage,\n} from \"../../platform/types.js\";\n\nexport async function resolvePrimaryResult(params: {\n vulnerable: VulnerablePackage;\n cwd: string;\n packageManager: PackageManager;\n dryRun: boolean;\n policy: string;\n runTests: boolean;\n constraints: RemediationConstraints;\n}): Promise<{ result: PatchResult; steps: number }> {\n const { vulnerable, cwd, packageManager, dryRun, policy, runTests, constraints } = params;\n const pkg = vulnerable.installed;\n const firstPatchedVersion = vulnerable.affected.firstPatchedVersion;\n\n if (pkg.type === \"transitive\") {\n if (constraints.directDependenciesOnly) {\n return {\n steps: 0,\n result: {\n packageName: pkg.name,\n strategy: \"none\",\n fromVersion: pkg.version,\n applied: false,\n dryRun,\n unresolvedReason: \"constraint-blocked\",\n message: `Constraint blocked remediation for transitive dependency \"${pkg.name}\".`,\n },\n };\n }\n\n if (constraints.preferVersionBump) {\n return {\n steps: 0,\n result: {\n packageName: pkg.name,\n strategy: \"none\",\n fromVersion: pkg.version,\n applied: false,\n dryRun,\n unresolvedReason: \"constraint-blocked\",\n message: `Constraint prefers version-bump and rejected override remediation for \"${pkg.name}\".`,\n },\n };\n }\n\n if (!firstPatchedVersion) {\n return {\n steps: 0,\n result: {\n packageName: pkg.name,\n strategy: \"none\",\n fromVersion: pkg.version,\n applied: false,\n dryRun,\n unresolvedReason: \"no-safe-version\",\n vulnerableRange: vulnerable.affected.vulnerableRange,\n message: `No firstPatchedVersion available for ${pkg.name}; cannot resolve deterministic override in local mode.`,\n },\n };\n }\n\n const safeUpgrade = await resolveSafeUpgradeVersion(\n pkg.name,\n pkg.version,\n firstPatchedVersion,\n vulnerable.affected.vulnerableRange,\n );\n\n if (!safeUpgrade.safeVersion) {\n return {\n steps: 1,\n result: {\n packageName: pkg.name,\n strategy: \"none\",\n fromVersion: pkg.version,\n applied: false,\n dryRun,\n unresolvedReason: \"no-safe-version\",\n vulnerableRange: vulnerable.affected.vulnerableRange,\n message: `No safe override version found for ${pkg.name}.`,\n },\n };\n }\n\n const trust = await verifyPackageTrust(\n pkg.name,\n safeUpgrade.safeVersion,\n constraints.supplyChainPolicy,\n );\n if (!trust.trusted) {\n return {\n steps: 1,\n result: {\n packageName: pkg.name,\n strategy: \"none\",\n fromVersion: pkg.version,\n applied: false,\n dryRun,\n unresolvedReason: \"policy-blocked\",\n vulnerableRange: vulnerable.affected.vulnerableRange,\n message: `Supply chain trust gate blocked \"${pkg.name}@${safeUpgrade.safeVersion}\": ${trust.reason}`,\n },\n };\n }\n\n const overrideResult = await applyPackageOverrideTool.execute({\n cwd,\n packageManager,\n packageName: pkg.name,\n fromVersion: pkg.version,\n toVersion: safeUpgrade.safeVersion,\n dryRun,\n policy,\n runTests,\n installMode: constraints.installMode,\n installPreferOffline: constraints.installPreferOffline,\n enforceFrozenLockfile: constraints.enforceFrozenLockfile,\n workspace: constraints.workspace,\n });\n\n return {\n steps: 2,\n result: { ...overrideResult, vulnerableRange: vulnerable.affected.vulnerableRange },\n };\n }\n\n if (!firstPatchedVersion) {\n return {\n steps: 0,\n result: {\n packageName: pkg.name,\n strategy: \"none\",\n fromVersion: pkg.version,\n applied: false,\n dryRun,\n unresolvedReason: \"no-safe-version\",\n vulnerableRange: vulnerable.affected.vulnerableRange,\n message: `No firstPatchedVersion available for ${pkg.name}; cannot resolve deterministic upgrade in local mode.`,\n },\n };\n }\n\n const safeUpgrade = await resolveSafeUpgradeVersion(\n pkg.name,\n pkg.version,\n firstPatchedVersion,\n vulnerable.affected.vulnerableRange,\n );\n\n if (!safeUpgrade.safeVersion) {\n return {\n steps: 1,\n result: {\n packageName: pkg.name,\n strategy: \"none\",\n fromVersion: pkg.version,\n applied: false,\n dryRun,\n unresolvedReason: \"no-safe-version\",\n vulnerableRange: vulnerable.affected.vulnerableRange,\n message: `No safe upgrade version found for ${pkg.name}.`,\n },\n };\n }\n\n const trust = await verifyPackageTrust(\n pkg.name,\n safeUpgrade.safeVersion,\n constraints.supplyChainPolicy,\n );\n if (!trust.trusted) {\n return {\n steps: 1,\n result: {\n packageName: pkg.name,\n strategy: \"none\",\n fromVersion: pkg.version,\n applied: false,\n dryRun,\n unresolvedReason: \"policy-blocked\",\n vulnerableRange: vulnerable.affected.vulnerableRange,\n message: `Supply chain trust gate blocked \"${pkg.name}@${safeUpgrade.safeVersion}\": ${trust.reason}`,\n },\n };\n }\n\n const applyResult = await applyVersionBumpTool.execute({\n cwd,\n packageManager,\n packageName: pkg.name,\n fromVersion: pkg.version,\n toVersion: safeUpgrade.safeVersion,\n dryRun,\n policy,\n runTests,\n typecheck: constraints.typecheck,\n installMode: constraints.installMode,\n installPreferOffline: constraints.installPreferOffline,\n enforceFrozenLockfile: constraints.enforceFrozenLockfile,\n workspace: constraints.workspace,\n breakingChangeRefactor: constraints.enableBreakingChangeRefactor,\n });\n\n return {\n steps: 2,\n result: { ...applyResult, vulnerableRange: vulnerable.affected.vulnerableRange },\n };\n}\n","/**\n * Tool: fetch-package-source\n *\n * Downloads a package tarball from npm registry and extracts source files for CVE analysis.\n * Uses Node.js fetch API to download and execa to extract tar archives.\n */\nimport { defineTool } from \"./tool-compat.js\";\nimport { z } from \"zod\";\nimport { mkdir, mkdtemp, readdir, readFile, rm } from \"node:fs/promises\";\nimport { join } from \"node:path\";\nimport { tmpdir } from \"node:os\";\nimport { execa } from \"execa\";\n\n/**\n * Interface for the tool's return value.\n */\ninterface FetchPackageSourceResult {\n success: boolean;\n sourceFiles?: Record<string, string>;\n packageDir?: string;\n error?: string;\n}\n\nexport const fetchPackageSourceTool = defineTool({\n description:\n \"Download package tarball from npm and extract source files for CVE analysis. Supports custom file patterns (default: *.js, *.ts).\",\n parameters: z.object({\n packageName: z\n .string()\n .min(1)\n .describe(\"The npm package name (e.g., 'lodash', '@scope/package')\"),\n version: z\n .string()\n .regex(/^\\d+\\.\\d+\\.\\d+/, \"Must be a valid semver version\")\n .describe(\"Exact package version to download\"),\n filePatterns: z\n .array(z.string())\n .optional()\n .default([\"*.js\", \"*.ts\"])\n .describe(\"File patterns to extract (glob patterns, default: *.js, *.ts)\"),\n }),\n execute: async ({ packageName, version, filePatterns }): Promise<FetchPackageSourceResult> => {\n // Validate package name against npm spec before using in URL\n if (!/^(@[a-z0-9][a-z0-9._-]*\\/)?[a-z0-9][a-z0-9._-]*$/i.test(packageName)) {\n return { success: false, error: `Invalid package name: ${packageName}` };\n }\n\n // Validate file patterns to prevent ReDoS\n const safePatterns = (filePatterns ?? [\"*.js\", \"*.ts\"]).filter((p) =>\n /^[a-zA-Z0-9._/*?-]+$/.test(p),\n );\n if (safePatterns.length === 0) {\n return { success: false, error: \"No valid file patterns provided.\" };\n }\n\n const tempBaseDir = await mkdtemp(join(tmpdir(), \"autoremediator-pkg-\"));\n const extractDir = join(tempBaseDir, \"out\");\n\n try {\n // Step 1: Construct npm registry URL and download tarball\n const scopedName = packageName.split(\"/\").pop()!;\n const npmUrl = `https://registry.npmjs.org/${packageName}/-/${scopedName}-${version}.tgz`;\n\n // Create temp directory\n await mkdir(tempBaseDir, { recursive: true });\n\n // Download tarball using curl (reliable method)\n const tarballPath = join(tempBaseDir, \"package.tgz\");\n await execa(\"curl\", [\"-L\", \"-o\", tarballPath, npmUrl]);\n\n // Step 2: Extract tar.gz\n await mkdir(extractDir, { recursive: true });\n await execa(\"tar\", [\"-xzf\", tarballPath, \"-C\", extractDir]);\n\n // Step 3: Discover package root (tar extracts to 'package/' subdirectory)\n const extractedContents = await readdir(extractDir);\n const packageRootDir = extractedContents.includes(\"package\")\n ? join(extractDir, \"package\")\n : extractDir;\n\n // Step 4: Recursively find and read matching source files\n const sourceCode: Record<string, string> = {};\n\n async function walkDir(dir: string, relativeBase: string): Promise<void> {\n try {\n const files = await readdir(dir, { withFileTypes: true });\n\n for (const file of files) {\n const fullPath = join(dir, file.name);\n const relPath = join(relativeBase, file.name);\n\n if (file.isDirectory()) {\n // Skip common non-source directories\n if (\n ![\"node_modules\", \".git\", \"dist\", \"build\", \"coverage\", \".next\", \"out\"].includes(\n file.name,\n )\n ) {\n await walkDir(fullPath, relPath);\n }\n } else if (file.isFile()) {\n // Check if file matches any pattern\n const matches = safePatterns.some((pattern) => {\n const regex = new RegExp(`^${pattern.replace(/\\*/g, \".*\").replace(/\\./g, \"\\\\.\")}$`);\n return regex.test(file.name);\n });\n\n if (matches) {\n try {\n const content = await readFile(fullPath, \"utf8\");\n sourceCode[relPath] = content;\n } catch {\n // Skip files that can't be read as UTF-8\n }\n }\n }\n }\n } catch {\n // Skip directories that can't be read\n }\n }\n\n await walkDir(packageRootDir, \"\");\n\n if (Object.keys(sourceCode).length === 0) {\n return {\n success: false,\n error: `No source files matching patterns [${safePatterns.join(\", \")}] found in ${packageName}@${version}. Download succeeded but extraction yielded no matching files.`,\n };\n }\n\n return {\n success: true,\n sourceFiles: sourceCode,\n packageDir: packageRootDir,\n };\n } catch (err) {\n const message = err instanceof Error ? err.message : String(err);\n\n // Check if it's a 404 from npm\n if (message.includes(\"404\") || message.includes(\"not found\")) {\n return {\n success: false,\n error: `Package ${packageName}@${version} not found on npm registry. It may not exist or the version may be incorrect.`,\n };\n }\n\n return {\n success: false,\n error: `Failed to fetch and extract package ${packageName}@${version}: ${message}`,\n };\n } finally {\n await rm(tempBaseDir, { recursive: true, force: true });\n }\n },\n});\n","/**\n * Tool: generate-patch\n *\n * Calls the LLM to analyze vulnerable source code and generate a unified diff patch.\n * Parses LLM response and validates patch format.\n */\nimport { defineTool } from \"../tool-compat.js\";\nimport { z } from \"zod\";\nimport { generateText } from \"ai\";\nimport {\n createModel,\n estimateModelCostUsd,\n getPatchConfidenceThreshold,\n resolveProvider,\n} from \"../../../platform/config.js\";\nimport { buildPatchPrompt } from \"../../strategies/patch-synthesis-prompt.js\";\nimport {\n buildGeneratedPatches,\n isValidLlmAnalysis,\n parseLlmAnalysisResponse,\n validatePatchedCodeSyntax,\n type GeneratedPatch,\n} from \"./helpers.js\";\n\n/**\n * Result from the patch generation tool.\n */\ninterface GeneratePatchResult {\n success: boolean;\n patches?: GeneratedPatch[];\n patchContent?: string;\n reproductionTest?: string;\n llmProvider: \"remote\" | \"local\";\n llmModel: string;\n latencyMs?: number;\n estimatedCostUsd?: number;\n confidence: number;\n riskLevel: \"low\" | \"medium\" | \"high\";\n confidenceThreshold?: number;\n error?: string;\n}\n\nexport const generatePatchTool = defineTool({\n description:\n \"Generate a unified diff patch for a CVE using LLM analysis of vulnerable source code.\",\n parameters: z.object({\n packageName: z.string().min(1).describe(\"The npm package name\"),\n vulnerableVersion: z.string().describe(\"The vulnerable version string\"),\n cveId: z\n .string()\n .regex(/^CVE-\\d{4}-\\d+$/i)\n .describe(\"CVE ID (e.g., CVE-2021-23337)\"),\n cveSummary: z.string().min(10).describe(\"CVE description and impact\"),\n sourceFiles: z\n .record(z.string(), z.string())\n .describe(\"Map of file paths to source code contents from fetch-package-source\"),\n vulnerabilityCategory: z\n .enum([\"redos\", \"code-injection\", \"path-traversal\", \"unknown\"])\n .optional()\n .default(\"unknown\")\n .describe(\"Category of the vulnerability for better context\"),\n dryRun: z\n .boolean()\n .optional()\n .default(false)\n .describe(\"If true, return analysis without generating patches\"),\n llmProvider: z\n .enum([\"remote\", \"local\"])\n .optional()\n .describe(\"Optional provider override for patch generation\"),\n model: z.string().optional().describe(\"Optional model override for patch generation\"),\n policy: z\n .string()\n .optional()\n .describe(\"Optional policy file path for model default resolution\"),\n cwd: z.string().optional().describe(\"Optional working directory for policy/model resolution\"),\n providerSafetyProfile: z\n .enum([\"strict\", \"relaxed\"])\n .optional()\n .describe(\"Confidence threshold profile for patch acceptance\"),\n patchConfidenceThresholds: z\n .object({\n low: z.number().min(0).max(1).optional(),\n medium: z.number().min(0).max(1).optional(),\n high: z.number().min(0).max(1).optional(),\n })\n .optional()\n .describe(\"Optional per-risk confidence thresholds for patch acceptance\"),\n dynamicModelRouting: z\n .boolean()\n .optional()\n .describe(\"Enable dynamic model routing by input size\"),\n dynamicRoutingThresholdChars: z\n .number()\n .int()\n .positive()\n .optional()\n .describe(\"Threshold for dynamic model routing\"),\n modelPersonality: z\n .enum([\"analytical\", \"pragmatic\", \"balanced\"])\n .optional()\n .describe(\"Prompt personality for patch-generation guidance\"),\n }),\n execute: async ({\n packageName,\n vulnerableVersion,\n cveId,\n cveSummary,\n sourceFiles,\n vulnerabilityCategory,\n dryRun,\n llmProvider,\n model,\n policy,\n cwd,\n providerSafetyProfile,\n patchConfidenceThresholds,\n dynamicModelRouting,\n dynamicRoutingThresholdChars,\n modelPersonality,\n }): Promise<GeneratePatchResult> => {\n try {\n const resolvedSourceFiles = sourceFiles;\n const effectiveOptions = {\n llmProvider,\n model,\n policy,\n cwd,\n providerSafetyProfile,\n dynamicModelRouting,\n dynamicRoutingThresholdChars,\n modelPersonality,\n };\n const provider = resolveProvider(effectiveOptions);\n if (Object.keys(resolvedSourceFiles).length === 0) {\n return {\n success: false,\n llmProvider: provider,\n llmModel: \"unknown\",\n confidence: 0,\n riskLevel: \"high\",\n error:\n \"No source files were provided. Call fetch-package-source first and pass sourceFiles.\",\n };\n }\n\n const inputChars = JSON.stringify(resolvedSourceFiles).length + cveSummary.length;\n const modelInstance = await createModel(effectiveOptions, { inputChars });\n const modelName =\n typeof modelInstance === \"string\"\n ? modelInstance\n : \"modelId\" in modelInstance && typeof modelInstance.modelId === \"string\"\n ? modelInstance.modelId\n : \"unknown-model\";\n\n const prompt = buildPatchPrompt({\n cveId,\n packageName,\n vulnerableVersion,\n vulnerabilityCategory,\n cveSummary,\n sourceFiles: resolvedSourceFiles,\n modelPersonality,\n });\n\n const started = Date.now();\n const { text } = await generateText({\n model: modelInstance,\n prompt,\n temperature: 0.3,\n });\n const latencyMs = Date.now() - started;\n\n const parsed = parseLlmAnalysisResponse(text);\n if (!parsed.ok) {\n return {\n success: false,\n llmProvider: provider,\n llmModel: modelName,\n confidence: 0,\n riskLevel: \"high\",\n latencyMs,\n error: `Failed to parse LLM response: ${parsed.error}`,\n };\n }\n const analysis = parsed.analysis;\n\n if (!isValidLlmAnalysis(analysis)) {\n return {\n success: false,\n llmProvider: provider,\n llmModel: modelName,\n confidence: 0,\n riskLevel: \"high\",\n latencyMs,\n error:\n \"LLM response missing required fields (analysis, fixedCode, confidence, riskLevel)\",\n };\n }\n\n const confidenceThreshold = getPatchConfidenceThreshold(\n provider,\n providerSafetyProfile ?? \"relaxed\",\n analysis.riskLevel,\n patchConfidenceThresholds,\n );\n const estimatedCostUsd = estimateModelCostUsd({\n provider,\n promptChars: prompt.length,\n completionChars: text.length,\n });\n\n if (dryRun) {\n return {\n success: true,\n llmProvider: provider,\n llmModel: modelName,\n latencyMs,\n estimatedCostUsd,\n confidenceThreshold,\n confidence: analysis.confidence,\n riskLevel: analysis.riskLevel,\n };\n }\n\n for (const [filePath, fixedCode] of Object.entries(analysis.fixedCode)) {\n const check = validatePatchedCodeSyntax(filePath, fixedCode);\n if (!check.valid) {\n return {\n success: false,\n llmProvider: provider,\n llmModel: modelName,\n latencyMs,\n estimatedCostUsd,\n confidenceThreshold,\n confidence: analysis.confidence,\n riskLevel: analysis.riskLevel,\n error: check.error ?? `Invalid syntax in patched code for ${filePath}`,\n };\n }\n }\n\n const patches = buildGeneratedPatches(resolvedSourceFiles, analysis.fixedCode);\n\n if (patches.length === 0) {\n return {\n success: false,\n llmProvider: provider,\n llmModel: modelName,\n latencyMs,\n estimatedCostUsd,\n confidenceThreshold,\n confidence: analysis.confidence,\n riskLevel: analysis.riskLevel,\n error: \"No valid patches could be generated from LLM response\",\n };\n }\n\n return {\n success: true,\n patches,\n patchContent: patches[0]?.unifiedDiff,\n reproductionTest: analysis.reproductionTest,\n llmProvider: provider,\n llmModel: modelName,\n latencyMs,\n estimatedCostUsd,\n confidenceThreshold,\n confidence: analysis.confidence,\n riskLevel: analysis.riskLevel,\n };\n } catch (err) {\n const message = err instanceof Error ? err.message : String(err);\n return {\n success: false,\n llmProvider: \"local\",\n llmModel: \"unknown\",\n confidence: 0,\n riskLevel: \"high\",\n error: `Patch generation failed: ${message}`,\n };\n }\n },\n});\n","export interface BuildPatchPromptParams {\n cveId: string;\n packageName: string;\n vulnerableVersion: string;\n vulnerabilityCategory: string;\n cveSummary: string;\n sourceFiles: Record<string, string>;\n modelPersonality: string | undefined;\n}\n\nconst VULNERABILITY_DESCRIPTIONS: Record<string, string> = {\n redos:\n \"Regular Expression Denial of Service (ReDoS): The vulnerability is caused by poorly constructed regular expressions that cause excessive backtracking when processing certain inputs. The fix should optimize the regex to avoid catastrophic backtracking or replace it with a safer alternative.\",\n \"code-injection\":\n \"Code Injection: The vulnerability allows injected code to be executed. The fix must properly sanitize/validate inputs and prevent dynamic code execution, or use safe alternatives like template literals with proper escaping.\",\n \"path-traversal\":\n \"Path Traversal: The vulnerability allows access to files outside intended directories through path traversal sequences (../, etc.). The fix must validate and normalize file paths, use path.resolve() and path.relative() checks.\",\n unknown:\n \"Unknown vulnerability type: Analyze the CVE summary carefully and implement the most appropriate fix for the security issue described.\",\n};\n\nexport function buildPatchPrompt(params: BuildPatchPromptParams): string {\n const {\n cveId,\n packageName,\n vulnerableVersion,\n vulnerabilityCategory,\n cveSummary,\n sourceFiles,\n modelPersonality,\n } = params;\n\n const sourceContext = Object.entries(sourceFiles)\n .map(([filePath, content]) => `\\n### File: ${filePath}\\n\\`\\`\\`typescript\\n${content}\\n\\`\\`\\``)\n .join(\"\\n\");\n\n const vulnerabilityContext =\n VULNERABILITY_DESCRIPTIONS[vulnerabilityCategory] || VULNERABILITY_DESCRIPTIONS.unknown;\n\n const personalityDirective =\n modelPersonality === \"analytical\"\n ? \"Provide concise analysis with explicit risk tradeoffs.\"\n : modelPersonality === \"pragmatic\"\n ? \"Prioritize minimal, safe changes with low operational risk.\"\n : \"Balance analytical explanation with practical remediation.\";\n\n return `You are a security expert tasked with analyzing a CVE vulnerability and generating a secure patch.\n\n## CVE Information\n- CVE ID: ${cveId}\n- Package: ${packageName}@${vulnerableVersion}\n- Category: ${vulnerabilityCategory}\n\n## Vulnerability Summary\n${cveSummary}\n\n## Vulnerability Type Context\n${vulnerabilityContext}\n\n## Model Behavior\n${personalityDirective}\n\n## Vulnerable Source Code\n${sourceContext}\n\n## Your Task\nAnalyze the source code to:\n1. Identify the exact code location causing the vulnerability\n2. Explain the root cause of the security issue\n3. Propose a secure fix that addresses the vulnerability\n4. Provide the complete fixed version of affected files\n5. Optionally provide a standalone Node.js reproduction/regression test script\n\n## Response Format\nRespond ONLY with valid JSON (no markdown, no extra text):\n{\n \"analysis\": \"Detailed explanation of the vulnerability root cause and why it's a security issue\",\n \"fixedCode\": {\n \"path/to/file.js\": \"Complete fixed source code for this file\",\n \"path/to/other.ts\": \"Complete fixed source code for this file\"\n },\n \"confidence\": 0.95,\n \"riskLevel\": \"medium\",\n \"reproductionTest\": \"// Node.js script asserting the patch resolves the exploit/regression\"\n}\n\nImportant:\n- confidence: number between 0 and 1 indicating how confident you are in the fix\n- riskLevel: \"low\", \"medium\", or \"high\" - assess the risk of the proposed fix breaking functionality\n- fixedCode: must contain the COMPLETE file contents (not just diffs), with the vulnerability addressed\n- Only include files that need modification`;\n}\n","import { parseSync } from \"oxc-parser\";\nimport YAML from \"yaml\";\n\n/**\n * Represents a single generated patch file.\n */\nexport interface GeneratedPatch {\n filePath: string;\n unifiedDiff: string;\n}\n\n/**\n * LLM analysis response schema.\n */\nexport interface LlmAnalysis {\n analysis: string;\n fixedCode: Record<string, string>;\n confidence: number;\n riskLevel: \"low\" | \"medium\" | \"high\";\n reproductionTest?: string;\n}\n\nexport function parseLlmAnalysisResponse(\n text: string,\n): { ok: true; analysis: LlmAnalysis } | { ok: false; error: string } {\n try {\n const jsonMatch = text.match(/\\{[\\s\\S]*\\}/);\n if (!jsonMatch) {\n return { ok: false, error: \"No JSON found in LLM response\" };\n }\n return { ok: true, analysis: JSON.parse(jsonMatch[0]) as LlmAnalysis };\n } catch (error) {\n const message = error instanceof Error ? error.message : \"unknown error\";\n return { ok: false, error: message };\n }\n}\n\nexport function isValidLlmAnalysis(analysis: LlmAnalysis): boolean {\n return Boolean(\n analysis.analysis &&\n analysis.fixedCode &&\n typeof analysis.confidence === \"number\" &&\n [\"low\", \"medium\", \"high\"].includes(analysis.riskLevel),\n );\n}\n\n/**\n * Validates that patched code across JS/TS, JSON, and YAML is syntactically sound.\n */\nexport function validatePatchedCodeSyntax(\n filePath: string,\n code: string,\n): { valid: boolean; error?: string } {\n const lowerPath = filePath.toLowerCase();\n\n // 1. JavaScript / TypeScript AST Validation\n if (/\\.[cm]?[jt]sx?$/i.test(lowerPath)) {\n try {\n const res = parseSync(filePath, code);\n if (res.errors && res.errors.length > 0) {\n const errorMsg = res.errors.map((e) => e.message).join(\"; \");\n return {\n valid: false,\n error: `Syntax error in generated patch for ${filePath}: ${errorMsg}`,\n };\n }\n return { valid: true };\n } catch (err) {\n const msg = err instanceof Error ? err.message : String(err);\n return { valid: false, error: `AST validation failed for ${filePath}: ${msg}` };\n }\n }\n\n // 2. JSON Validation\n if (lowerPath.endsWith(\".json\")) {\n try {\n JSON.parse(code);\n return { valid: true };\n } catch (err) {\n const msg = err instanceof Error ? err.message : String(err);\n return { valid: false, error: `JSON parse error in generated patch for ${filePath}: ${msg}` };\n }\n }\n\n // 3. YAML Validation\n if (lowerPath.endsWith(\".yml\") || lowerPath.endsWith(\".yaml\")) {\n try {\n YAML.parse(code);\n return { valid: true };\n } catch (err) {\n const msg = err instanceof Error ? err.message : String(err);\n return { valid: false, error: `YAML parse error in generated patch for ${filePath}: ${msg}` };\n }\n }\n\n return { valid: true };\n}\n\nexport function buildGeneratedPatches(\n sourceFiles: Record<string, string>,\n fixedCodeByFile: Record<string, string>,\n): GeneratedPatch[] {\n const patches: GeneratedPatch[] = [];\n\n for (const [filePath, fixedCode] of Object.entries(fixedCodeByFile)) {\n const sourceFile = sourceFiles[filePath];\n if (!sourceFile) {\n continue;\n }\n\n const syntaxCheck = validatePatchedCodeSyntax(filePath, fixedCode);\n if (!syntaxCheck.valid) {\n continue;\n }\n\n const unifiedDiff = generateUnifiedDiff(sourceFile, fixedCode, filePath);\n if (unifiedDiff) {\n patches.push({ filePath, unifiedDiff });\n }\n }\n\n return patches;\n}\n\n/**\n * Generate a unified diff between two strings.\n * Returns a unified diff format or null if there are no differences.\n */\nexport function generateUnifiedDiff(\n original: string,\n fixed: string,\n filePath: string,\n): string | null {\n if (original === fixed) {\n return null;\n }\n\n const originalLines = original.split(\"\\n\");\n const fixedLines = fixed.split(\"\\n\");\n\n const diff: string[] = [];\n diff.push(`--- a/${filePath}`);\n diff.push(`+++ b/${filePath}`);\n diff.push(`@@ -1,${originalLines.length} +1,${fixedLines.length} @@`);\n\n const maxLen = Math.max(originalLines.length, fixedLines.length);\n\n for (let i = 0; i < maxLen; i++) {\n const origLine = originalLines[i] || \"\";\n const fixedLine = fixedLines[i] || \"\";\n\n if (origLine !== fixedLine) {\n if (origLine) {\n diff.push(`-${origLine}`);\n }\n if (fixedLine) {\n diff.push(`+${fixedLine}`);\n }\n } else if (origLine) {\n diff.push(` ${origLine}`);\n }\n }\n\n return diff.join(\"\\n\");\n}\n","/**\n * Tool: apply-patch-file\n *\n * Writes generated patch files to disk and applies them using package-manager-aware\n * patch mechanisms (native pnpm/yarn when available, patch-package compatibility otherwise).\n * Optionally validates patches by running tests.\n */\nimport { defineTool } from \"../tool-compat.js\";\nimport { z } from \"zod\";\nimport { mkdir, writeFile } from \"node:fs/promises\";\nimport { existsSync } from \"node:fs\";\nimport { isAbsolute, join } from \"node:path\";\nimport { execa } from \"execa\";\nimport {\n detectPackageManager,\n getYarnMajorVersion,\n resolveInstallCommand,\n resolveTestCommand,\n type PackageManager,\n} from \"../../../platform/package-manager/index.js\";\nimport { withRepoLock } from \"../../../platform/repo-lock.js\";\nimport { loadPolicy } from \"../../../platform/policy.js\";\nimport { validatePatchDiff } from \"../../strategies/patch-utils.js\";\nimport type {\n PatchArtifact,\n PatchMode,\n PatchValidationPhase,\n ProofOfFixPhaseResult,\n ProofOfFixVerification,\n} from \"../../../platform/types.js\";\nimport { assembleProofOfFixVerification, runProofOfFixPhase } from \"../../proof-of-fix/runner.js\";\nimport {\n applyNativePatch,\n buildPatchFileName,\n capturePackageJsonSnapshot,\n cleanupPatchArtifacts,\n computePatchIntegrity,\n configurePatchPackagePostinstall,\n countPatchHunks,\n extractPatchedFiles,\n patchModeRequiresPackageJsonSnapshot,\n resolvePatchMode,\n validatePatchWithTests,\n writePatchManifest,\n type ValidationResult,\n} from \"./helpers.js\";\n\ninterface ApplyPatchFileResult {\n success: boolean;\n packageName: string;\n vulnerableVersion: string;\n applied: boolean;\n dryRun: boolean;\n message: string;\n patchFilePath?: string;\n manifestFilePath?: string;\n patchPath?: string;\n patchMode?: PatchMode;\n postinstallConfigured?: boolean;\n patchArtifact?: PatchArtifact;\n validation?: ValidationResult;\n validationPhases?: PatchValidationPhase[];\n proofOfFix?: ProofOfFixVerification;\n error?: string;\n}\n\nexport const applyPatchFileTool = defineTool({\n description:\n \"Write generated patch file and apply it using package-manager-native patch flow when available, falling back to patch-package when needed.\",\n parameters: z\n .object({\n packageName: z.string().min(1).describe(\"The npm package name\"),\n vulnerableVersion: z.string().describe(\"The vulnerable version string\"),\n patchContent: z\n .string()\n .min(10)\n .optional()\n .describe(\"Unified diff patch content from generate-patch\"),\n cveId: z.string().optional().describe(\"Optional CVE ID associated with this patch artifact\"),\n confidence: z\n .number()\n .min(0)\n .max(1)\n .optional()\n .describe(\"Optional patch confidence score from generate-patch\"),\n riskLevel: z\n .enum([\"low\", \"medium\", \"high\"])\n .optional()\n .describe(\"Optional risk level from generate-patch\"),\n patches: z\n .array(\n z.object({\n filePath: z.string().min(1),\n unifiedDiff: z.string().min(10),\n }),\n )\n .optional()\n .describe(\"Patch list from generate-patch; first patch is applied\"),\n patchesDir: z\n .string()\n .optional()\n .default(\"./patches\")\n .describe(\"Directory to store patch files\"),\n cwd: z.string().describe(\"Project root directory (for package.json)\"),\n packageManager: z\n .enum([\"npm\", \"pnpm\", \"yarn\", \"bun\", \"deno\"])\n .optional()\n .describe(\"Package manager used by the target project (auto-detected if omitted)\"),\n policy: z.string().optional().describe(\"Optional path to .autoremediator policy file\"),\n installMode: z.enum([\"standard\", \"prefer-offline\", \"deterministic\"]).optional(),\n installPreferOffline: z.boolean().optional(),\n enforceFrozenLockfile: z.boolean().optional(),\n workspace: z.string().optional(),\n validateWithTests: z\n .boolean()\n .optional()\n .default(true)\n .describe(\"Run package manager test command to validate patch doesn't break anything\"),\n reproductionTest: z\n .string()\n .optional()\n .describe(\"Optional synthesized reproduction test script verifying fix\"),\n proofOfFix: z\n .union([z.boolean(), z.string()])\n .optional()\n .describe(\n \"If true or script path/content, enforce dual-stage exploit reproduction (assert failure pre-patch, assert pass post-patch)\",\n ),\n requireProofOfFix: z\n .boolean()\n .optional()\n .describe(\"If true, fail and roll back patch if proof-of-fix verification fails\"),\n dryRun: z\n .boolean()\n .optional()\n .default(false)\n .describe(\"If true, report but do not mutate files\"),\n })\n .refine((value) => Boolean(value.patchContent || (value.patches && value.patches.length > 0)), {\n message: \"Either patchContent or patches must be provided\",\n }),\n execute: async ({\n packageName,\n vulnerableVersion,\n patchContent,\n cveId,\n confidence,\n patches,\n patchesDir,\n cwd,\n packageManager,\n policy,\n installMode,\n installPreferOffline,\n enforceFrozenLockfile,\n workspace,\n riskLevel,\n validateWithTests,\n reproductionTest,\n proofOfFix,\n requireProofOfFix,\n dryRun,\n }): Promise<ApplyPatchFileResult> => {\n try {\n const pm = (packageManager ?? detectPackageManager(cwd)) as PackageManager;\n const loadedPolicy = loadPolicy(cwd, policy);\n const commandConstraints = {\n ...loadedPolicy.constraints,\n installMode: installMode ?? loadedPolicy.constraints?.installMode,\n installPreferOffline:\n installPreferOffline ?? loadedPolicy.constraints?.installPreferOffline,\n enforceFrozenLockfile:\n enforceFrozenLockfile ?? loadedPolicy.constraints?.enforceFrozenLockfile,\n workspace: workspace ?? loadedPolicy.constraints?.workspace,\n };\n const yarnMajor = pm === \"yarn\" ? await getYarnMajorVersion(cwd) : undefined;\n const installCommand = resolveInstallCommand(pm, commandConstraints, yarnMajor);\n const testCommand = resolveTestCommand(pm, commandConstraints);\n const selectedPatch = patchContent ?? patches?.[0]?.unifiedDiff;\n const patchFiles = extractPatchedFiles(selectedPatch ?? \"\");\n const hunkCount = countPatchHunks(selectedPatch ?? \"\");\n const validationPhases: PatchValidationPhase[] = [];\n\n if (!selectedPatch) {\n return {\n success: false,\n packageName,\n vulnerableVersion,\n applied: false,\n dryRun,\n message: \"No patch content provided.\",\n error: \"No patch content provided.\",\n };\n }\n\n const patchValidation = validatePatchDiff(selectedPatch);\n validationPhases.push({\n phase: \"diff-format\",\n passed: patchValidation.valid,\n error: patchValidation.valid ? undefined : patchValidation.error,\n message: patchValidation.valid ? \"Patch content is a valid unified diff.\" : undefined,\n });\n\n if (!patchValidation.valid) {\n return {\n success: false,\n packageName,\n vulnerableVersion,\n applied: false,\n dryRun,\n message: patchValidation.error ?? \"Patch content is not a valid unified diff.\",\n validationPhases,\n error: patchValidation.error ?? \"Patch content is not a valid unified diff.\",\n };\n }\n\n const patchFileName = buildPatchFileName(packageName, vulnerableVersion);\n const patchFilePath = join(cwd, patchesDir, patchFileName);\n const manifestFilePath = `${patchFilePath}.json`;\n const generatedAt = new Date().toISOString();\n const baseArtifact: PatchArtifact = {\n schemaVersion: \"1.0\",\n cveId,\n packageName,\n vulnerableVersion,\n patchFilePath,\n manifestFilePath,\n patchFileName,\n patchesDir,\n confidence,\n riskLevel,\n generatedAt,\n files: patchFiles,\n hunkCount,\n applied: false,\n dryRun,\n integrity: computePatchIntegrity(selectedPatch),\n validationPhases,\n };\n\n if (dryRun) {\n return {\n success: true,\n packageName,\n vulnerableVersion,\n applied: false,\n dryRun: true,\n message: `[DRY RUN] Would write and configure patch at ${patchFilePath}.`,\n patchFilePath,\n manifestFilePath,\n patchPath: patchFilePath,\n patchArtifact: baseArtifact,\n validationPhases,\n };\n }\n\n return withRepoLock(cwd, async () => {\n const packageJsonSnapshot = patchModeRequiresPackageJsonSnapshot(pm)\n ? await capturePackageJsonSnapshot(cwd)\n : undefined;\n\n const patchesDirPath = join(cwd, patchesDir);\n await mkdir(patchesDirPath, { recursive: true });\n\n await writeFile(patchFilePath, selectedPatch, \"utf8\");\n validationPhases.push({\n phase: \"patch-write\",\n passed: true,\n message: `Patch file written to ${patchFilePath}.`,\n });\n\n let validationResult: ValidationResult | undefined;\n const patchMode = await resolvePatchMode(pm, cwd);\n const artifact: PatchArtifact = {\n ...baseArtifact,\n patchMode,\n validationPhases,\n };\n\n await writePatchManifest(manifestFilePath, artifact);\n validationPhases.push({\n phase: \"manifest-write\",\n passed: true,\n message: `Patch manifest written to ${manifestFilePath}.`,\n });\n artifact.validationPhases = validationPhases;\n await writePatchManifest(manifestFilePath, artifact);\n\n let reproductionTestPath: string | undefined;\n let negativePhaseResult: ProofOfFixPhaseResult | undefined;\n\n if (typeof proofOfFix === \"string\" && proofOfFix.trim().length > 0) {\n const resolvedPath = isAbsolute(proofOfFix) ? proofOfFix : join(cwd, proofOfFix);\n if (existsSync(resolvedPath)) {\n reproductionTestPath = resolvedPath;\n } else {\n const safeName = packageName.replace(/^@/, \"\").replace(/\\//g, \"+\");\n reproductionTestPath = join(patchesDirPath, `${safeName}+${vulnerableVersion}.test.cjs`);\n await writeFile(reproductionTestPath, proofOfFix, \"utf8\");\n }\n } else if (reproductionTest) {\n const safeName = packageName.replace(/^@/, \"\").replace(/\\//g, \"+\");\n reproductionTestPath = join(patchesDirPath, `${safeName}+${vulnerableVersion}.test.cjs`);\n await writeFile(reproductionTestPath, reproductionTest, \"utf8\");\n }\n\n const isProofOfFixActive = Boolean(proofOfFix || requireProofOfFix);\n\n if (isProofOfFixActive) {\n if (!reproductionTestPath) {\n if (requireProofOfFix) {\n await cleanupPatchArtifacts({\n cwd,\n patchFilePath,\n manifestFilePath,\n patchMode,\n packageJsonSnapshot,\n installCommand,\n rerunInstall: false,\n });\n return {\n success: false,\n packageName,\n vulnerableVersion,\n applied: false,\n dryRun: false,\n message: \"Proof-of-fix verification required, but no reproduction test or script was supplied.\",\n patchFilePath,\n manifestFilePath,\n patchPath: patchFilePath,\n patchMode,\n postinstallConfigured: false,\n patchArtifact: {\n ...artifact,\n applied: false,\n validationPhases,\n },\n validationPhases,\n error: \"Proof-of-fix verification required, but no reproduction test or script was supplied.\",\n };\n }\n } else {\n negativePhaseResult = await runProofOfFixPhase({\n stage: \"negative\",\n testFilePath: reproductionTestPath,\n cwd,\n });\n\n validationPhases.push({\n phase: \"proof-of-fix-negative\",\n passed: negativePhaseResult.passed,\n message: negativePhaseResult.passed\n ? \"Reproduction test reproduced vulnerability on unpatched code.\"\n : undefined,\n error: negativePhaseResult.passed ? undefined : negativePhaseResult.error,\n });\n\n if (!negativePhaseResult.passed && requireProofOfFix) {\n await cleanupPatchArtifacts({\n cwd,\n patchFilePath,\n manifestFilePath,\n patchMode,\n packageJsonSnapshot,\n installCommand,\n rerunInstall: false,\n });\n return {\n success: false,\n packageName,\n vulnerableVersion,\n applied: false,\n dryRun: false,\n message: `Proof-of-fix negative phase failed: ${negativePhaseResult.error}`,\n patchFilePath,\n manifestFilePath,\n patchPath: patchFilePath,\n patchMode,\n postinstallConfigured: false,\n patchArtifact: {\n ...artifact,\n applied: false,\n validationPhases,\n },\n validationPhases,\n error: `Proof-of-fix negative phase failed: ${negativePhaseResult.error}`,\n };\n }\n }\n }\n\n const applyResult =\n patchMode === \"patch-package\"\n ? await configurePatchPackagePostinstall(cwd, pm)\n : await applyNativePatch({\n cwd,\n packageName,\n vulnerableVersion,\n patchContent: selectedPatch,\n patchMode,\n validationPhases,\n });\n\n if (!applyResult.success) {\n await cleanupPatchArtifacts({\n cwd,\n patchFilePath,\n manifestFilePath,\n patchMode,\n packageJsonSnapshot,\n installCommand,\n rerunInstall: patchMode === \"patch-package\",\n });\n return {\n success: false,\n packageName,\n vulnerableVersion,\n applied: false,\n dryRun: false,\n message: applyResult.error,\n patchFilePath,\n manifestFilePath,\n patchPath: patchFilePath,\n patchMode,\n postinstallConfigured: patchMode === \"patch-package\" ? false : undefined,\n patchArtifact: {\n ...artifact,\n applied: false,\n validationPhases,\n },\n validationPhases,\n error: applyResult.error,\n };\n }\n\n validationPhases.push({\n phase: \"apply\",\n passed: true,\n message: `Patch applied using ${patchMode}.`,\n });\n\n if (patchMode === \"patch-package\") {\n try {\n const [installCmd, ...installArgs] = installCommand;\n await execa(installCmd, installArgs, {\n cwd,\n stdio: \"pipe\",\n });\n validationPhases.push({\n phase: \"install\",\n passed: true,\n message: `${installCommand.join(\" \")} completed successfully.`,\n });\n } catch (err) {\n await cleanupPatchArtifacts({\n cwd,\n patchFilePath,\n manifestFilePath,\n patchMode,\n packageJsonSnapshot,\n installCommand,\n rerunInstall: true,\n });\n const error = err instanceof Error ? err.message : String(err);\n validationPhases.push({\n phase: \"install\",\n passed: false,\n error,\n });\n return {\n success: false,\n packageName,\n vulnerableVersion,\n applied: false,\n dryRun: false,\n message: `Failed to apply patch-package workflow for ${packageName}@${vulnerableVersion}: ${error}`,\n patchFilePath,\n manifestFilePath,\n patchPath: patchFilePath,\n patchMode,\n postinstallConfigured: false,\n patchArtifact: {\n ...artifact,\n applied: false,\n validationPhases,\n },\n validationPhases,\n error: `Failed to apply patch-package workflow for ${packageName}@${vulnerableVersion}: ${error}`,\n };\n }\n }\n\n if (validateWithTests) {\n validationResult = await validatePatchWithTests(cwd, testCommand);\n if (!validationResult.passed) {\n await cleanupPatchArtifacts({\n cwd,\n patchFilePath,\n manifestFilePath,\n patchMode,\n packageJsonSnapshot,\n installCommand,\n rerunInstall: patchMode === \"patch-package\",\n });\n const validationError = \"Patch validation failed after apply; patch marked unresolved.\";\n validationPhases.push({\n phase: \"test\",\n passed: false,\n error: validationResult.error,\n });\n return {\n success: false,\n packageName,\n vulnerableVersion,\n applied: false,\n dryRun: false,\n message: validationError,\n patchFilePath,\n manifestFilePath,\n patchPath: patchFilePath,\n patchMode,\n postinstallConfigured: false,\n patchArtifact: {\n ...artifact,\n applied: false,\n validationPhases,\n },\n validation: validationResult,\n validationPhases,\n error: validationError,\n };\n }\n\n validationPhases.push({\n phase: \"test\",\n passed: true,\n message: \"Patch validation tests passed.\",\n });\n }\n\n let positivePhaseResult: ProofOfFixPhaseResult | undefined;\n if (reproductionTestPath) {\n if (isProofOfFixActive) {\n positivePhaseResult = await runProofOfFixPhase({\n stage: \"positive\",\n testFilePath: reproductionTestPath,\n cwd,\n });\n\n validationPhases.push({\n phase: \"proof-of-fix-positive\",\n passed: positivePhaseResult.passed,\n message: positivePhaseResult.passed\n ? \"Reproduction test passed on patched code (vulnerability mitigated).\"\n : undefined,\n error: positivePhaseResult.passed ? undefined : positivePhaseResult.error,\n });\n\n if (!positivePhaseResult.passed && (requireProofOfFix || validateWithTests)) {\n await cleanupPatchArtifacts({\n cwd,\n patchFilePath,\n manifestFilePath,\n patchMode,\n packageJsonSnapshot,\n installCommand,\n rerunInstall: patchMode === \"patch-package\",\n });\n return {\n success: false,\n packageName,\n vulnerableVersion,\n applied: false,\n dryRun: false,\n message: `Proof-of-fix positive phase failed: ${positivePhaseResult.error}`,\n patchFilePath,\n manifestFilePath,\n patchPath: patchFilePath,\n patchMode,\n postinstallConfigured: false,\n patchArtifact: {\n ...artifact,\n applied: false,\n validationPhases,\n },\n validationPhases,\n error: `Proof-of-fix positive phase failed: ${positivePhaseResult.error}`,\n };\n }\n } else {\n try {\n const reproRun = await execa(\"node\", [reproductionTestPath], { cwd, stdio: \"pipe\" });\n validationPhases.push({\n phase: \"reproduction-test\",\n passed: reproRun.exitCode === 0,\n message: \"Reproduction test verified fix successfully.\",\n });\n } catch (err) {\n const reproErr = err instanceof Error ? err.message : String(err);\n validationPhases.push({\n phase: \"reproduction-test\",\n passed: false,\n error: `Reproduction test failed: ${reproErr}`,\n });\n }\n }\n }\n\n let proofOfFixVerification: ProofOfFixVerification | undefined;\n if (negativePhaseResult && positivePhaseResult) {\n proofOfFixVerification = assembleProofOfFixVerification({\n reproductionTestPath,\n negativePhase: negativePhaseResult,\n positivePhase: positivePhaseResult,\n regressionPhase: validationResult\n ? {\n executed: true,\n passed: validationResult.passed,\n error: validationResult.error,\n }\n : undefined,\n });\n }\n\n const finalArtifact: PatchArtifact = {\n ...artifact,\n applied: true,\n dryRun: false,\n reproductionTest,\n reproductionTestPath,\n validationPhases,\n proofOfFix: proofOfFixVerification,\n };\n await writePatchManifest(manifestFilePath, finalArtifact);\n\n return {\n success: true,\n packageName,\n vulnerableVersion,\n applied: true,\n dryRun: false,\n message: `Patch applied successfully for ${packageName}@${vulnerableVersion}.`,\n patchFilePath,\n manifestFilePath,\n patchPath: patchFilePath,\n patchMode,\n postinstallConfigured: patchMode === \"patch-package\",\n patchArtifact: finalArtifact,\n validation: validationResult,\n validationPhases,\n proofOfFix: proofOfFixVerification,\n };\n });\n } catch (err) {\n const message = err instanceof Error ? err.message : String(err);\n return {\n success: false,\n packageName,\n vulnerableVersion,\n applied: false,\n dryRun,\n message: `Failed to apply patch file: ${message}`,\n error: `Failed to apply patch file: ${message}`,\n };\n }\n },\n});\n","/**\n * Proof-of-Fix Runner\n *\n * Implements dual-stage exploit reproduction and independent verification:\n * Stage 1 (Negative Phase): Must FAIL on unpatched / vulnerable target (proving exploitability).\n * Stage 2 (Positive Phase): Must PASS on patched target (proving remediation).\n * Stage 3 (Regression Phase): Must PASS on full project test suite (proving zero regressions).\n */\nimport { safeExeca } from \"../../platform/safe-exec.js\";\nimport type {\n ProofOfFixPhaseResult,\n ProofOfFixStatus,\n ProofOfFixVerification,\n} from \"../../platform/types.js\";\n\nexport interface RunProofOfFixPhaseOptions {\n stage: \"negative\" | \"positive\";\n testFilePath: string;\n cwd: string;\n timeoutMs?: number;\n}\n\nexport async function runProofOfFixPhase(\n options: RunProofOfFixPhaseOptions,\n): Promise<ProofOfFixPhaseResult> {\n const { stage, testFilePath, cwd, timeoutMs = 15_000 } = options;\n const started = Date.now();\n\n const isTs = testFilePath.endsWith(\".ts\");\n const nodeArgs = isTs ? [\"--experimental-strip-types\", testFilePath] : [testFilePath];\n\n try {\n const result = await safeExeca(\"node\", nodeArgs, {\n cwd,\n timeoutMs,\n stdio: \"pipe\",\n });\n\n const durationMs = Date.now() - started;\n const output = `${result.stdout || \"\"}\\n${result.stderr || \"\"}`.trim();\n\n if (stage === \"negative\") {\n // In negative phase, passing means the bug was NOT reproduced (false negative).\n return {\n executed: true,\n passed: false,\n exitCode: 0,\n output,\n durationMs,\n error:\n \"Exploit reproduction test passed on vulnerable target (failed to reproduce vulnerability).\",\n };\n }\n\n // In positive phase, exit code 0 means remediation succeeded.\n return {\n executed: true,\n passed: true,\n exitCode: 0,\n output,\n durationMs,\n };\n } catch (err: unknown) {\n const durationMs = Date.now() - started;\n const execaErr = err as {\n exitCode?: number;\n stdout?: string;\n stderr?: string;\n message?: string;\n timedOut?: boolean;\n };\n const exitCode = typeof execaErr.exitCode === \"number\" ? execaErr.exitCode : 1;\n const errorMsg = execaErr.message || String(err);\n const output = [execaErr.stdout, execaErr.stderr, errorMsg].filter(Boolean).join(\"\\n\").trim();\n\n if (stage === \"negative\") {\n if (execaErr.timedOut || errorMsg.includes(\"timed out\")) {\n return {\n executed: true,\n passed: false,\n exitCode,\n output,\n durationMs,\n error: \"Exploit reproduction test timed out (execution hung).\",\n };\n }\n\n // Differentiate harness execution failures from true exploit reproduction\n const isHarnessFailure =\n exitCode === 127 ||\n errorMsg.includes(\"ENOENT\") ||\n output.includes(\"bad option:\") ||\n (output.includes(\"Cannot find module\") && output.includes(testFilePath));\n\n if (isHarnessFailure) {\n return {\n executed: false,\n passed: false,\n exitCode,\n output,\n durationMs,\n error: `Reproduction test failed to execute (harness error): ${errorMsg}`,\n };\n }\n\n // In negative phase, non-zero exit code from test assertions means exploit reproduced!\n return {\n executed: true,\n passed: true,\n exitCode,\n output,\n durationMs,\n };\n }\n\n // In positive phase, non-zero exit code means the exploit still reproduced or code crashed.\n return {\n executed: true,\n passed: false,\n exitCode,\n output,\n durationMs,\n error: `Reproduction test failed on patched target: ${errorMsg}`,\n };\n }\n}\n\nexport interface AssembleProofOfFixParams {\n reproductionTestPath?: string;\n negativePhase: ProofOfFixPhaseResult;\n positivePhase: ProofOfFixPhaseResult;\n regressionPhase?: ProofOfFixPhaseResult;\n}\n\nexport function assembleProofOfFixVerification(\n params: AssembleProofOfFixParams,\n): ProofOfFixVerification {\n const { reproductionTestPath, negativePhase, positivePhase, regressionPhase } = params;\n\n const regPhase: ProofOfFixPhaseResult = regressionPhase ?? {\n executed: false,\n passed: true,\n };\n\n let status: ProofOfFixStatus = \"verified\";\n let failureReason: string | undefined;\n\n if (!negativePhase.passed) {\n status = \"failed\";\n failureReason = negativePhase.error || \"negative-phase-failed\";\n } else if (!positivePhase.passed) {\n status = \"failed\";\n failureReason = positivePhase.error || \"positive-phase-failed\";\n } else if (regPhase.executed && !regPhase.passed) {\n status = \"failed\";\n failureReason = regPhase.error || \"regression-phase-failed\";\n }\n\n const durationMs =\n (negativePhase.durationMs || 0) + (positivePhase.durationMs || 0) + (regPhase.durationMs || 0);\n\n return {\n status,\n reproductionTestPath,\n negativePhase,\n positivePhase,\n regressionPhase: regPhase,\n durationMs,\n failureReason,\n };\n}\n","import { existsSync } from \"node:fs\";\nimport { mkdtemp, readFile, rm, writeFile } from \"node:fs/promises\";\nimport { createHash } from \"node:crypto\";\nimport { tmpdir } from \"node:os\";\nimport { join } from \"node:path\";\nimport { execa } from \"execa\";\nimport {\n getPackageManagerCommands,\n getYarnMajorVersion,\n type PackageManager,\n} from \"../../../platform/package-manager/index.js\";\nimport type { PatchArtifact, PatchMode, PatchValidationPhase } from \"../../../platform/types.js\";\n\nexport interface ValidationResult {\n passed: boolean;\n error?: string;\n output?: string;\n failedTests?: string[];\n}\n\nexport interface RawPackageJson {\n devDependencies?: Record<string, string>;\n scripts?: Record<string, string>;\n [key: string]: unknown;\n}\n\nexport interface PackageJsonSnapshot {\n path: string;\n content: string;\n}\n\nexport async function resolvePatchMode(\n packageManager: PackageManager,\n cwd: string,\n): Promise<PatchMode> {\n if (packageManager === \"npm\" || packageManager === \"bun\" || packageManager === \"deno\")\n return \"patch-package\";\n if (packageManager === \"pnpm\") return \"native-pnpm\";\n\n const major = await getYarnMajorVersion(cwd);\n return major >= 2 ? \"native-yarn\" : \"patch-package\";\n}\n\nexport function patchModeRequiresPackageJsonSnapshot(packageManager: PackageManager): boolean {\n if (packageManager === \"pnpm\") return false;\n return true;\n}\n\nexport function buildPatchFileName(packageName: string, vulnerableVersion: string): string {\n const safeName = packageName.replace(/^@/, \"\").replace(/\\//g, \"+\");\n return `${safeName}+${vulnerableVersion}.patch`;\n}\n\nexport function extractPatchedFiles(patchContent: string): string[] {\n return Array.from(\n new Set(\n patchContent\n .split(/\\r?\\n/)\n .filter((line) => line.startsWith(\"+++ b/\"))\n .map((line) => line.slice(\"+++ b/\".length)),\n ),\n );\n}\n\nexport function countPatchHunks(patchContent: string): number {\n return patchContent.split(/\\r?\\n/).filter((line) => line.startsWith(\"@@ \")).length;\n}\n\nexport function computePatchIntegrity(patchContent: string): string {\n const hex = createHash(\"sha256\").update(patchContent, \"utf8\").digest(\"hex\");\n return `sha256:${hex}`;\n}\n\nexport async function writePatchManifest(\n manifestFilePath: string,\n artifact: PatchArtifact,\n): Promise<void> {\n await writeFile(manifestFilePath, JSON.stringify(artifact, null, 2) + \"\\n\", \"utf8\");\n}\n\nexport async function configurePatchPackagePostinstall(\n cwd: string,\n packageManager: PackageManager,\n): Promise<{ success: true } | { success: false; error: string }> {\n const pkgJsonPath = join(cwd, \"package.json\");\n let pkgJson: RawPackageJson;\n\n try {\n pkgJson = JSON.parse(await readFile(pkgJsonPath, \"utf8\")) as RawPackageJson;\n } catch {\n return {\n success: false,\n error: `Could not read package.json at ${pkgJsonPath}`,\n };\n }\n\n const devDependencies = pkgJson.devDependencies ?? {};\n if (!devDependencies[\"patch-package\"]) {\n try {\n const commands = getPackageManagerCommands(packageManager);\n const [cmd, ...args] = commands.installDev(\"patch-package\");\n await execa(cmd, args, {\n cwd,\n stdio: \"pipe\",\n });\n } catch (err) {\n return {\n success: false,\n error: `Failed to install patch-package: ${err instanceof Error ? err.message : String(err)}`,\n };\n }\n }\n\n if (!pkgJson.scripts) {\n pkgJson.scripts = {};\n }\n\n const patchApplyCmd = \"patch-package\";\n const currentPostinstall = pkgJson.scripts.postinstall || \"\";\n\n if (currentPostinstall && !currentPostinstall.includes(\"patch-package\")) {\n pkgJson.scripts.postinstall = `${currentPostinstall} && ${patchApplyCmd}`;\n } else if (!currentPostinstall) {\n pkgJson.scripts.postinstall = patchApplyCmd;\n }\n\n await writeFile(pkgJsonPath, JSON.stringify(pkgJson, null, 2) + \"\\n\", \"utf8\");\n return { success: true };\n}\n\nexport async function capturePackageJsonSnapshot(\n cwd: string,\n): Promise<PackageJsonSnapshot | undefined> {\n const path = join(cwd, \"package.json\");\n\n try {\n const content = await readFile(path, \"utf8\");\n return { path, content };\n } catch {\n return undefined;\n }\n}\n\nexport async function cleanupPatchArtifacts(params: {\n cwd: string;\n patchFilePath: string;\n manifestFilePath?: string;\n patchMode: PatchMode;\n packageJsonSnapshot?: PackageJsonSnapshot;\n installCommand: string[];\n rerunInstall: boolean;\n}): Promise<void> {\n const {\n cwd,\n patchFilePath,\n manifestFilePath,\n patchMode,\n packageJsonSnapshot,\n installCommand,\n rerunInstall,\n } = params;\n\n await rm(patchFilePath, { force: true }).catch(() => undefined);\n if (manifestFilePath) {\n await rm(manifestFilePath, { force: true }).catch(() => undefined);\n }\n\n if (patchMode === \"patch-package\" && packageJsonSnapshot) {\n await writeFile(packageJsonSnapshot.path, packageJsonSnapshot.content, \"utf8\").catch(\n () => undefined,\n );\n }\n\n if (!rerunInstall) return;\n\n try {\n const [installCmd, ...installArgs] = installCommand;\n await execa(installCmd, installArgs, {\n cwd,\n stdio: \"pipe\",\n });\n } catch {\n // Ignore cleanup install failures and preserve the original remediation error.\n }\n}\n\nexport async function applyNativePatch(params: {\n cwd: string;\n packageName: string;\n vulnerableVersion: string;\n patchContent: string;\n patchMode: \"native-pnpm\" | \"native-yarn\";\n validationPhases: PatchValidationPhase[];\n}): Promise<{ success: true } | { success: false; error: string }> {\n const { cwd, packageName, vulnerableVersion, patchContent, patchMode, validationPhases } = params;\n const packageSpec = `${packageName}@${vulnerableVersion}`;\n\n const createCommand = patchMode === \"native-pnpm\" ? \"pnpm\" : \"yarn\";\n const createArgs = [\"patch\", packageSpec];\n\n let patchDir: string;\n try {\n const createResult = await execa(createCommand, createArgs, {\n cwd,\n stdio: \"pipe\",\n });\n patchDir = extractPatchDirectory(`${createResult.stdout}\\n${createResult.stderr}`);\n } catch (err) {\n validationPhases.push({\n phase: \"apply\",\n passed: false,\n error: err instanceof Error ? err.message : String(err),\n });\n return {\n success: false,\n error: `Failed to create native patch workspace for ${packageSpec}: ${\n err instanceof Error ? err.message : String(err)\n }`,\n };\n }\n\n if (!patchDir) {\n validationPhases.push({\n phase: \"apply\",\n passed: false,\n error: `Could not determine native patch directory for ${packageSpec}.`,\n });\n return {\n success: false,\n error: `Could not determine native patch directory for ${packageSpec}.`,\n };\n }\n\n const tempPatchDir = await mkdtemp(join(tmpdir(), \"autoremediator-native-patch-\"));\n const tempPatchFile = join(tempPatchDir, \"change.patch\");\n\n try {\n await writeFile(tempPatchFile, patchContent, \"utf8\");\n await execa(\"patch\", [\"-p1\", \"-i\", tempPatchFile], {\n cwd: patchDir,\n stdio: \"pipe\",\n });\n\n const commitCommand = patchMode === \"native-pnpm\" ? \"pnpm\" : \"yarn\";\n const commitArgs =\n patchMode === \"native-pnpm\" ? [\"patch-commit\", patchDir] : [\"patch-commit\", \"-s\", patchDir];\n\n await execa(commitCommand, commitArgs, {\n cwd,\n stdio: \"pipe\",\n });\n } catch (err) {\n validationPhases.push({\n phase: \"apply\",\n passed: false,\n error: err instanceof Error ? err.message : String(err),\n });\n return {\n success: false,\n error: `Failed to apply native patch for ${packageSpec}: ${\n err instanceof Error ? err.message : String(err)\n }`,\n };\n } finally {\n await rm(tempPatchDir, { recursive: true, force: true });\n }\n\n return { success: true };\n}\n\nfunction extractPatchDirectory(output: string): string {\n const lines = output\n .split(/\\r?\\n/)\n .map((line) => line.trim())\n .filter(Boolean);\n\n for (const line of lines) {\n if (existsSync(line)) {\n return line;\n }\n\n const tokens = line.split(/\\s+/).map((token) => token.replace(/^['\"]|['\"]$/g, \"\"));\n for (const token of tokens) {\n if (token.startsWith(\"/\") && existsSync(token)) {\n return token;\n }\n }\n }\n\n return \"\";\n}\n\nexport async function validatePatchWithTests(\n cwd: string,\n testCommand: string[],\n): Promise<ValidationResult> {\n try {\n const [cmd, ...args] = testCommand;\n const result = await execa(cmd, args, {\n cwd,\n timeout: 60000,\n stdio: \"pipe\",\n });\n\n return {\n passed: true,\n output: result.stdout,\n };\n } catch (err) {\n const stdoutVal =\n typeof err === \"object\" && err !== null && \"stdout\" in err\n ? (err as { stdout?: unknown }).stdout\n : \"\";\n const errorOutput =\n typeof stdoutVal === \"string\"\n ? stdoutVal\n : Buffer.isBuffer(stdoutVal)\n ? (stdoutVal as Buffer).toString(\"utf8\")\n : \"\";\n const failedTests = extractFailedTests(errorOutput);\n\n return {\n passed: false,\n error:\n failedTests.length > 0\n ? `Failed tests: ${failedTests.join(\", \")}`\n : \"Package-manager test validation failed.\",\n output: errorOutput,\n failedTests,\n };\n }\n}\n\nfunction extractFailedTests(output: string): string[] {\n const failedTests: string[] = [];\n const patterns = [/✖\\s+(.+?)(?:\\n|$)/g, /●\\s+(.+)(?:\\n|$)/g, /^FAIL\\s+(.+?)(?:\\n|$)/gm];\n\n for (const pattern of patterns) {\n let match;\n while ((match = pattern.exec(output)) !== null) {\n if (match[1]) {\n failedTests.push(match[1].trim());\n }\n }\n }\n\n return failedTests.slice(0, 5);\n}\n","import type { ConsensusVerdict, PatchConfidenceThresholds } from \"../../platform/types.js\";\nimport { generatePatchTool } from \"../tools/generate-patch/index.js\";\n\nexport interface ConsensusGateParams {\n packageName: string;\n vulnerableVersion: string;\n cveId: string;\n cveSummary: string;\n sourceFiles: Record<string, string>;\n policy?: string;\n cwd: string;\n llmProvider: \"remote\" | \"local\";\n model?: string;\n consensusProvider: \"remote\" | \"local\";\n consensusModel?: string;\n modelPersonality?: \"analytical\" | \"pragmatic\" | \"balanced\";\n providerSafetyProfile?: \"strict\" | \"relaxed\";\n patchConfidenceThresholds?: PatchConfidenceThresholds;\n dynamicModelRouting?: boolean;\n dynamicRoutingThresholdChars?: number;\n primaryPatches: Array<{ filePath: string; unifiedDiff: string }>;\n}\n\nexport async function runConsensusGate(params: ConsensusGateParams): Promise<ConsensusVerdict> {\n const consensus = await generatePatchTool.execute({\n packageName: params.packageName,\n vulnerableVersion: params.vulnerableVersion,\n cveId: params.cveId,\n cveSummary: params.cveSummary,\n sourceFiles: params.sourceFiles,\n vulnerabilityCategory: \"unknown\",\n dryRun: false,\n llmProvider: params.consensusProvider,\n model: params.consensusModel,\n policy: params.policy,\n cwd: params.cwd,\n modelPersonality: params.modelPersonality,\n providerSafetyProfile: params.providerSafetyProfile,\n patchConfidenceThresholds: params.patchConfidenceThresholds,\n dynamicModelRouting: params.dynamicModelRouting,\n dynamicRoutingThresholdChars: params.dynamicRoutingThresholdChars,\n });\n\n const provider = consensus.llmProvider ?? params.consensusProvider;\n const model = consensus.llmModel ?? params.consensusModel ?? params.model ?? \"unknown\";\n const primaryDiff = params.primaryPatches[0]?.unifiedDiff;\n const secondaryDiff = consensus.patches?.[0]?.unifiedDiff;\n\n if (!consensus.success) {\n return {\n agreed: false,\n provider,\n model,\n reason: consensus.error ?? \"Consensus patch generation failed.\",\n latencyMs: consensus.latencyMs,\n estimatedCostUsd: consensus.estimatedCostUsd,\n };\n }\n\n if (!primaryDiff || !secondaryDiff) {\n return {\n agreed: false,\n provider,\n model,\n reason: \"Consensus could not compare patch output.\",\n latencyMs: consensus.latencyMs,\n estimatedCostUsd: consensus.estimatedCostUsd,\n };\n }\n\n if (primaryDiff !== secondaryDiff) {\n return {\n agreed: false,\n provider,\n model,\n reason: \"High-risk patch did not pass consensus verification.\",\n latencyMs: consensus.latencyMs,\n estimatedCostUsd: consensus.estimatedCostUsd,\n };\n }\n\n return {\n agreed: true,\n provider,\n model,\n latencyMs: consensus.latencyMs,\n estimatedCostUsd: consensus.estimatedCostUsd,\n };\n}\n","import { fetchPackageSourceTool } from \"../tools/fetch-package-source.js\";\nimport { generatePatchTool } from \"../tools/generate-patch/index.js\";\nimport { applyPatchFileTool } from \"../tools/apply-patch-file/index.js\";\nimport { runConsensusGate } from \"./consensus-gate.js\";\nimport type {\n ConsensusVerdict,\n LlmUsageMetrics,\n PackageManager,\n PatchConfidenceThresholds,\n PatchResult,\n UnresolvedReason,\n} from \"../../platform/types.js\";\nimport { getPatchConfidenceThreshold } from \"../../platform/config.js\";\n\nfunction resolvePatchProvider(provider: \"remote\" | \"local\"): \"remote\" | \"local\" {\n if (provider === \"local\") {\n return \"remote\";\n }\n return provider;\n}\n\nexport function shouldAttemptPatchFallback(\n result: PatchResult,\n preferVersionBump: boolean,\n): boolean {\n if (preferVersionBump) return false;\n if (result.applied || result.dryRun) return false;\n\n return (\n result.unresolvedReason === \"no-safe-version\" ||\n result.unresolvedReason === \"install-failed\" ||\n result.unresolvedReason === \"override-apply-failed\" ||\n result.unresolvedReason === \"validation-failed\" ||\n result.unresolvedReason === \"major-bump-required\" ||\n result.unresolvedReason === \"transitive-dependency\"\n );\n}\n\nexport async function tryLocalPatchFallback(params: {\n cwd: string;\n packageManager: PackageManager;\n packageName: string;\n vulnerableVersion: string;\n cveId: string;\n cveSummary: string;\n dependencyScope: \"direct\" | \"transitive\";\n dryRun: boolean;\n runTests: boolean;\n patchesDir: string;\n llmProvider: \"remote\" | \"local\";\n model?: string;\n policy?: string;\n modelPersonality?: \"analytical\" | \"pragmatic\" | \"balanced\";\n providerSafetyProfile?: \"strict\" | \"relaxed\";\n requireConsensusForHighRisk?: boolean;\n consensusProvider?: \"remote\" | \"local\";\n consensusModel?: string;\n patchConfidenceThresholds?: PatchConfidenceThresholds;\n dynamicModelRouting?: boolean;\n dynamicRoutingThresholdChars?: number;\n installMode?: \"standard\" | \"prefer-offline\" | \"deterministic\";\n installPreferOffline?: boolean;\n enforceFrozenLockfile?: boolean;\n workspace?: string;\n vulnerableRange?: string;\n proofOfFix?: boolean | string;\n requireProofOfFix?: boolean;\n}): Promise<{ result: PatchResult; steps: number; usage: LlmUsageMetrics[] }> {\n const usage: LlmUsageMetrics[] = [];\n let steps = 0;\n let consensusVerdict: ConsensusVerdict | undefined;\n\n const sourceResult = await fetchPackageSourceTool.execute({\n packageName: params.packageName,\n version: params.vulnerableVersion,\n });\n steps += 1;\n\n if (!sourceResult?.success || !sourceResult.sourceFiles) {\n return {\n steps,\n usage,\n result: {\n packageName: params.packageName,\n strategy: \"none\",\n fromVersion: params.vulnerableVersion,\n applied: false,\n dryRun: params.dryRun,\n dependencyScope: params.dependencyScope,\n unresolvedReason: \"source-fetch-failed\",\n message:\n sourceResult?.error ??\n `Failed to fetch source for ${params.packageName}@${params.vulnerableVersion}.`,\n },\n };\n }\n\n const primaryProvider = resolvePatchProvider(params.llmProvider);\n const patchResult = await generatePatchTool.execute({\n packageName: params.packageName,\n vulnerableVersion: params.vulnerableVersion,\n cveId: params.cveId,\n cveSummary: params.cveSummary,\n sourceFiles: sourceResult.sourceFiles,\n vulnerabilityCategory: \"unknown\",\n dryRun: params.dryRun,\n llmProvider: primaryProvider,\n model: params.model,\n policy: params.policy,\n cwd: params.cwd,\n modelPersonality: params.modelPersonality,\n providerSafetyProfile: params.providerSafetyProfile,\n patchConfidenceThresholds: params.patchConfidenceThresholds,\n dynamicModelRouting: params.dynamicModelRouting,\n dynamicRoutingThresholdChars: params.dynamicRoutingThresholdChars,\n });\n steps += 1;\n\n if (!patchResult?.success) {\n const error = patchResult?.error ?? \"Patch generation failed.\";\n const unresolvedReason: UnresolvedReason =\n error.includes(\"API_KEY\") || error.includes(\"does not create a language model\")\n ? \"requires-llm-fallback\"\n : \"patch-generation-failed\";\n return {\n steps,\n usage,\n result: {\n packageName: params.packageName,\n strategy: \"none\",\n fromVersion: params.vulnerableVersion,\n applied: false,\n dryRun: params.dryRun,\n dependencyScope: params.dependencyScope,\n unresolvedReason,\n message: error,\n },\n };\n }\n\n const effectiveProvider = patchResult.llmProvider ?? primaryProvider;\n const confidenceThreshold =\n patchResult.confidenceThreshold ??\n getPatchConfidenceThreshold(\n effectiveProvider,\n params.providerSafetyProfile ?? \"relaxed\",\n patchResult.riskLevel ?? \"medium\",\n params.patchConfidenceThresholds,\n );\n\n if (typeof patchResult.confidence === \"number\" && patchResult.confidence < confidenceThreshold) {\n return {\n steps,\n usage,\n result: {\n packageName: params.packageName,\n strategy: \"none\",\n fromVersion: params.vulnerableVersion,\n applied: false,\n dryRun: params.dryRun,\n dependencyScope: params.dependencyScope,\n confidence: patchResult.confidence,\n riskLevel: patchResult.riskLevel,\n unresolvedReason: \"patch-confidence-too-low\",\n message: `Patch confidence ${patchResult.confidence.toFixed(2)} is below threshold ${confidenceThreshold.toFixed(2)}.`,\n },\n };\n }\n\n if (params.requireConsensusForHighRisk && patchResult.riskLevel === \"high\" && !params.dryRun) {\n const consensusProvider = resolvePatchProvider(params.consensusProvider ?? primaryProvider);\n consensusVerdict = await runConsensusGate({\n packageName: params.packageName,\n vulnerableVersion: params.vulnerableVersion,\n cveId: params.cveId,\n cveSummary: params.cveSummary,\n sourceFiles: sourceResult.sourceFiles,\n policy: params.policy,\n cwd: params.cwd,\n llmProvider: primaryProvider,\n model: params.model,\n consensusProvider,\n consensusModel: params.consensusModel,\n modelPersonality: params.modelPersonality,\n providerSafetyProfile: params.providerSafetyProfile,\n patchConfidenceThresholds: params.patchConfidenceThresholds,\n dynamicModelRouting: params.dynamicModelRouting,\n dynamicRoutingThresholdChars: params.dynamicRoutingThresholdChars,\n primaryPatches: patchResult.patches ?? [],\n });\n steps += 1;\n\n if (!consensusVerdict.agreed) {\n return {\n steps,\n usage,\n result: {\n packageName: params.packageName,\n strategy: \"none\",\n fromVersion: params.vulnerableVersion,\n applied: false,\n dryRun: params.dryRun,\n dependencyScope: params.dependencyScope,\n unresolvedReason: \"consensus-failed\",\n message:\n consensusVerdict.reason ?? \"High-risk patch did not pass consensus verification.\",\n },\n };\n }\n\n usage.push({\n purpose: \"patch-consensus\",\n provider: consensusProvider,\n model: consensusVerdict.model,\n latencyMs: consensusVerdict.latencyMs,\n estimatedCostUsd: consensusVerdict.estimatedCostUsd,\n });\n }\n\n const applyResult = await applyPatchFileTool.execute({\n packageName: params.packageName,\n vulnerableVersion: params.vulnerableVersion,\n cveId: params.cveId,\n confidence: patchResult.confidence,\n patchContent: patchResult.patchContent,\n patches: patchResult.patches,\n patchesDir: params.patchesDir,\n cwd: params.cwd,\n packageManager: params.packageManager,\n policy: params.policy,\n installMode: params.installMode,\n installPreferOffline: params.installPreferOffline,\n enforceFrozenLockfile: params.enforceFrozenLockfile,\n workspace: params.workspace,\n riskLevel: patchResult.riskLevel,\n validateWithTests: params.runTests,\n reproductionTest: patchResult.reproductionTest,\n proofOfFix: params.proofOfFix,\n requireProofOfFix: params.requireProofOfFix,\n dryRun: params.dryRun,\n });\n steps += 1;\n\n if (patchResult.llmProvider && patchResult.llmModel) {\n usage.push({\n purpose: \"patch-generation\",\n provider: patchResult.llmProvider,\n model: patchResult.llmModel,\n latencyMs: patchResult.latencyMs,\n estimatedCostUsd: patchResult.estimatedCostUsd,\n });\n }\n\n return {\n steps,\n usage,\n result: {\n packageName: params.packageName,\n strategy: \"patch-file\",\n fromVersion: params.vulnerableVersion,\n patchFilePath: applyResult.patchFilePath ?? applyResult.patchPath,\n patchArtifact: applyResult.patchArtifact,\n applied: Boolean(applyResult.applied),\n dryRun: Boolean(applyResult.dryRun),\n dependencyScope: params.dependencyScope,\n confidence: patchResult.confidence,\n riskLevel: patchResult.riskLevel,\n vulnerableRange: params.vulnerableRange,\n consensusVerdict,\n unresolvedReason:\n !applyResult.applied && !applyResult.dryRun\n ? applyResult.validation?.passed === false\n ? \"patch-validation-failed\"\n : \"patch-apply-failed\"\n : undefined,\n message: applyResult.message ?? applyResult.error ?? \"Patch-file strategy finished.\",\n validation:\n typeof applyResult.validation?.passed === \"boolean\"\n ? {\n passed: applyResult.validation.passed,\n error: applyResult.validation.error,\n }\n : undefined,\n validationPhases: applyResult.validationPhases,\n },\n };\n}\n","import { resolveProvider } from \"../../platform/config.js\";\nimport { loadPolicy } from \"../../platform/policy.js\";\nimport type {\n EscalationGraph,\n ExploitSignalOverridePolicy,\n PackageManager,\n PatchConfidenceThresholds,\n RemediateOptions,\n SlaPolicy,\n VexSuppression,\n} from \"../../platform/types.js\";\nimport { detectPackageManager } from \"../../platform/package-manager/index.js\";\n\nexport interface LocalRunOptions {\n cwd: string;\n packageManager: PackageManager;\n preview: boolean;\n dryRun: boolean;\n runTests: boolean;\n policy: string;\n patchesDir: string;\n constraints: NonNullable<RemediateOptions[\"constraints\"]>;\n llmProvider: \"remote\" | \"local\";\n providerSafetyProfile: \"strict\" | \"relaxed\";\n requireConsensusForHighRisk: boolean;\n consensusProvider: \"remote\" | \"local\";\n consensusModel?: string;\n patchConfidenceThresholds?: PatchConfidenceThresholds;\n dynamicModelRouting: boolean;\n dynamicRoutingThresholdChars?: number;\n exploitSignalOverride?: ExploitSignalOverridePolicy;\n suppressions: VexSuppression[];\n suppressionsFile?: string;\n slaCheck: boolean;\n slaPolicy?: SlaPolicy;\n skipUnreachable: boolean;\n regressionCheck: boolean;\n escalationGraph?: EscalationGraph;\n offlineIntelligence: boolean;\n intelligenceSnapshotPath?: string;\n proofOfFix?: boolean | string;\n requireProofOfFix?: boolean;\n breakingChangeRefactor?: boolean;\n}\n\nexport function resolveLocalRunOptions(options: RemediateOptions): LocalRunOptions {\n const cwd = options.cwd ?? process.cwd();\n const packageManager = options.packageManager ?? detectPackageManager(cwd);\n const preview = options.preview ?? false;\n const dryRun = (options.dryRun ?? false) || preview;\n const runTests = options.runTests ?? false;\n const policy = options.policy ?? \"\";\n const patchesDir = options.patchesDir || \"./patches\";\n const loadedPolicy = loadPolicy(cwd, options.policy);\n const constraints = {\n ...options.constraints,\n typecheck: options.typecheck ?? options.constraints?.typecheck ?? loadedPolicy.constraints?.typecheck,\n supplyChainPolicy: options.supplyChainPolicy ?? options.constraints?.supplyChainPolicy ?? loadedPolicy.constraints?.supplyChainPolicy,\n enableBreakingChangeRefactor:\n options.breakingChangeRefactor ??\n options.constraints?.enableBreakingChangeRefactor ??\n loadedPolicy.constraints?.enableBreakingChangeRefactor,\n requireProofOfFix:\n options.requireProofOfFix ??\n options.constraints?.requireProofOfFix ??\n loadedPolicy.constraints?.requireProofOfFix,\n };\n\n const llmProvider = resolveProvider(options);\n\n return {\n cwd,\n packageManager,\n preview,\n dryRun,\n runTests,\n policy,\n patchesDir,\n constraints,\n llmProvider,\n providerSafetyProfile:\n options.providerSafetyProfile ?? loadedPolicy.providerSafetyProfile ?? \"relaxed\",\n requireConsensusForHighRisk:\n options.requireConsensusForHighRisk ?? loadedPolicy.requireConsensusForHighRisk ?? false,\n consensusProvider: options.consensusProvider ?? loadedPolicy.consensusProvider ?? \"remote\",\n consensusModel: options.consensusModel ?? loadedPolicy.consensusModel,\n patchConfidenceThresholds: {\n ...loadedPolicy.patchConfidenceThresholds,\n ...options.patchConfidenceThresholds,\n },\n dynamicModelRouting: options.dynamicModelRouting ?? loadedPolicy.dynamicModelRouting ?? false,\n dynamicRoutingThresholdChars:\n options.dynamicRoutingThresholdChars ?? loadedPolicy.dynamicRoutingThresholdChars,\n exploitSignalOverride: options.exploitSignalOverride ?? loadedPolicy.exploitSignalOverride,\n suppressions: loadedPolicy.suppressions ?? [],\n suppressionsFile: options.suppressionsFile,\n slaCheck: options.slaCheck ?? false,\n slaPolicy: loadedPolicy.sla,\n skipUnreachable: options.skipUnreachable ?? loadedPolicy.skipUnreachable ?? false,\n regressionCheck: options.regressionCheck ?? false,\n escalationGraph: options.escalationGraph ?? loadedPolicy.escalationGraph,\n offlineIntelligence: options.offlineIntelligence ?? false,\n intelligenceSnapshotPath: options.intelligenceSnapshotPath,\n proofOfFix: options.proofOfFix,\n requireProofOfFix: options.requireProofOfFix ?? constraints.requireProofOfFix,\n breakingChangeRefactor: options.breakingChangeRefactor ?? constraints.enableBreakingChangeRefactor,\n };\n}\n","import semver from \"semver\";\nimport type { CveDetails, VulnerablePackage } from \"../../platform/types.js\";\n\ninterface InstalledPackage {\n name: string;\n version: string;\n type: \"direct\" | \"transitive\";\n}\n\nexport function findVulnerablePackages(\n cveDetails: CveDetails,\n installedPackages: InstalledPackage[],\n): VulnerablePackage[] {\n const vulnerablePackages: VulnerablePackage[] = [];\n\n for (const affected of cveDetails.affectedPackages) {\n if (!affected || typeof affected !== \"object\") continue;\n if (!affected.name || !affected.vulnerableRange) continue;\n if (affected.ecosystem !== \"npm\") continue;\n\n const matches = installedPackages.filter((pkg) => pkg.name === affected.name);\n for (const installed of matches) {\n if (!semver.valid(installed.version)) continue;\n\n let isVulnerable = false;\n try {\n isVulnerable = semver.satisfies(installed.version, affected.vulnerableRange, {\n includePrerelease: false,\n });\n } catch {\n continue;\n }\n\n if (isVulnerable) {\n vulnerablePackages.push({ installed, affected });\n }\n }\n }\n\n return vulnerablePackages;\n}\n","import type { PatchResult, VulnerablePackage } from \"../../platform/types.js\";\n\nexport function buildLocalSummary(\n vulnerablePackages: VulnerablePackage[],\n collectedResults: PatchResult[],\n): string {\n const appliedCount = collectedResults.filter((result) => result.applied).length;\n const unresolvedCount = collectedResults.filter(\n (result) => !result.applied && !result.dryRun,\n ).length;\n const dryRunCount = collectedResults.filter((result) => result.dryRun).length;\n\n return `Local mode completed: vulnerable=${vulnerablePackages.length}, applied=${appliedCount}, dryRun=${dryRunCount}, unresolved=${unresolvedCount}`;\n}\n","import type {\n CveSeverity,\n Disposition,\n DispositionPolicy,\n DispositionSignals,\n PatchResult,\n SlaBreach,\n} from \"../../platform/types.js\";\n\nconst ESCALATE_SEVERITIES_DEFAULT = [\"CRITICAL\", \"HIGH\"] as const;\n\n/**\n * Compute the autonomous disposition for a single PatchResult.\n * Precedence order is deterministic — first match wins.\n */\nexport function computeDisposition(\n signals: DispositionSignals,\n policy?: DispositionPolicy,\n): { disposition: Disposition; dispositionReason: string } {\n const escalateOnKev = policy?.escalateOnKev ?? true;\n const escalateOnSlaBreachSeverities =\n policy?.escalateOnSlaBreachSeverities ?? (ESCALATE_SEVERITIES_DEFAULT as unknown as string[]);\n const holdForTransitive = policy?.holdForTransitive ?? false;\n const minConfidenceForAutoApply = policy?.minConfidenceForAutoApply ?? 0.7;\n\n // 1. Regression detected\n if (signals.regressionDetected === true) {\n return { disposition: \"escalate\", dispositionReason: \"regression-detected\" };\n }\n\n // 2. Consensus failed\n if (signals.consensusFailed === true) {\n return { disposition: \"escalate\", dispositionReason: \"consensus-failed\" };\n }\n\n // 3. Hard-fail unresolved reasons\n const hardFailReasons = [\n \"validation-failed\",\n \"patch-validation-failed\",\n \"install-failed\",\n ] as const;\n if (\n signals.unresolvedReason &&\n (hardFailReasons as readonly string[]).includes(signals.unresolvedReason)\n ) {\n return { disposition: \"escalate\", dispositionReason: signals.unresolvedReason };\n }\n\n // 4. KEV exploit signal\n if (signals.exploitSignalTriggered && escalateOnKev) {\n return { disposition: \"escalate\", dispositionReason: \"kev-exploit-signal\" };\n }\n\n // 5. SLA breach on escalatable severity\n if (signals.slaBreaches && signals.slaBreaches.length > 0) {\n const matched = signals.slaBreaches.some((b) =>\n escalateOnSlaBreachSeverities.includes(b.severity),\n );\n if (matched) {\n return { disposition: \"escalate\", dispositionReason: \"sla-breach\" };\n }\n }\n\n // 6. Patch confidence too low\n if (signals.unresolvedReason === \"patch-confidence-too-low\") {\n return { disposition: \"hold-for-approval\", dispositionReason: \"patch-confidence-too-low\" };\n }\n\n // 7. Hold for transitive\n if (holdForTransitive && signals.dependencyScope === \"transitive\") {\n return { disposition: \"hold-for-approval\", dispositionReason: \"transitive-dependency\" };\n }\n\n // 8. Unresolved (not applied)\n if (!signals.applied && signals.unresolvedReason) {\n return { disposition: \"simulate-only\", dispositionReason: signals.unresolvedReason };\n }\n\n // 9. Applied but low confidence\n if (\n signals.applied &&\n signals.confidence !== undefined &&\n signals.confidence < minConfidenceForAutoApply\n ) {\n return { disposition: \"hold-for-approval\", dispositionReason: \"low-confidence\" };\n }\n\n // 10. Applied\n if (signals.applied) {\n return { disposition: \"auto-apply\", dispositionReason: \"safe-apply\" };\n }\n\n // 11. Default\n return { disposition: \"simulate-only\", dispositionReason: \"unresolved\" };\n}\n\ninterface DispositionContext {\n exploitSignalTriggered?: boolean;\n slaBreaches?: SlaBreach[];\n severity?: CveSeverity;\n policy?: DispositionPolicy;\n containmentMode?: boolean;\n}\n\nexport function applyDispositionAndContainment(\n result: PatchResult,\n context: DispositionContext,\n): PatchResult {\n const disposition = computeDisposition(\n {\n exploitSignalTriggered: context.exploitSignalTriggered,\n slaBreaches: context.slaBreaches,\n dependencyScope: result.dependencyScope,\n unresolvedReason: result.unresolvedReason,\n confidence: result.confidence,\n riskLevel: result.riskLevel,\n regressionDetected: result.regressionDetected,\n consensusFailed: result.unresolvedReason === \"consensus-failed\",\n applied: result.applied,\n severity: context.severity,\n },\n context.policy,\n );\n\n const withDisposition: PatchResult = {\n ...result,\n disposition: disposition.disposition,\n dispositionReason: disposition.dispositionReason,\n };\n\n if (\n context.containmentMode &&\n withDisposition.disposition === \"escalate\" &&\n withDisposition.applied\n ) {\n return {\n ...withDisposition,\n applied: false,\n unresolvedReason: \"policy-blocked\",\n };\n }\n\n return withDisposition;\n}\n","import type { EscalationAction, EscalationGraph, UnresolvedReason } from \"./types.js\";\n\nexport const DEFAULT_ESCALATION_GRAPH: EscalationGraph = {\n \"consensus-failed\": \"create-draft-pr\",\n \"patch-validation-failed\": \"open-issue\",\n \"patch-confidence-too-low\": \"open-issue\",\n \"source-fetch-failed\": \"notify-channel\",\n \"patch-generation-failed\": \"notify-channel\",\n \"no-safe-version\": \"open-issue\",\n \"validation-failed\": \"create-draft-pr\",\n};\n\nexport function computeEscalationAction(\n reason: UnresolvedReason | undefined,\n graph?: EscalationGraph,\n): EscalationAction {\n if (!reason) return \"none\";\n\n const mergedGraph: EscalationGraph = {\n ...DEFAULT_ESCALATION_GRAPH,\n ...graph,\n };\n\n return mergedGraph[reason] ?? \"none\";\n}\n","import type { CveDetails, PatchResult, VulnerablePackage } from \"../../platform/types.js\";\n\ninterface StepToolResult {\n toolName: string;\n result?: unknown;\n}\n\ninterface AccumulateStepResultsParams {\n toolResults: StepToolResult[];\n cveDetails: CveDetails | null;\n vulnerablePackages: VulnerablePackage[];\n collectedResults: PatchResult[];\n getDependencyScope: (packageName: string) => \"direct\" | \"transitive\" | undefined;\n}\n\ninterface AccumulateStepResultsOutput {\n cveDetails: CveDetails | null;\n vulnerablePackages: VulnerablePackage[];\n collectedResults: PatchResult[];\n}\n\nexport function accumulateStepResults(\n params: AccumulateStepResultsParams,\n): AccumulateStepResultsOutput {\n const { toolResults, cveDetails, vulnerablePackages, collectedResults, getDependencyScope } =\n params;\n\n let nextCveDetails = cveDetails;\n const nextVulnerablePackages = [...vulnerablePackages];\n const nextCollectedResults = [...collectedResults];\n\n for (const tr of toolResults) {\n const toolResult = tr.result as Record<string, unknown> | undefined;\n\n if (tr.toolName === \"lookup-cve\" && toolResult?.data) {\n nextCveDetails = toolResult.data as CveDetails;\n }\n\n if (tr.toolName === \"check-version-match\" && toolResult?.vulnerablePackages) {\n nextVulnerablePackages.push(...(toolResult.vulnerablePackages as VulnerablePackage[]));\n }\n\n if (tr.toolName === \"apply-version-bump\") {\n const typed = toolResult as unknown as PatchResult;\n nextCollectedResults.push({\n ...typed,\n dependencyScope: typed.packageName\n ? getDependencyScope(typed.packageName)\n : typed.dependencyScope,\n });\n }\n\n if (tr.toolName === \"apply-package-override\") {\n const typed = toolResult as unknown as PatchResult;\n nextCollectedResults.push({\n ...typed,\n dependencyScope: typed.packageName\n ? getDependencyScope(typed.packageName)\n : typed.dependencyScope,\n });\n }\n\n if (tr.toolName === \"apply-patch-file\" && toolResult) {\n const validation = toolResult.validation as { passed?: boolean; error?: string } | undefined;\n const message =\n typeof toolResult.message === \"string\"\n ? toolResult.message\n : typeof toolResult.error === \"string\"\n ? toolResult.error\n : \"Patch-file strategy finished.\";\n\n nextCollectedResults.push({\n packageName:\n typeof toolResult.packageName === \"string\" ? toolResult.packageName : \"unknown-package\",\n strategy: \"patch-file\",\n fromVersion:\n typeof toolResult.vulnerableVersion === \"string\"\n ? toolResult.vulnerableVersion\n : \"unknown\",\n patchFilePath:\n typeof toolResult.patchFilePath === \"string\"\n ? toolResult.patchFilePath\n : typeof toolResult.patchPath === \"string\"\n ? toolResult.patchPath\n : undefined,\n patchArtifact:\n typeof toolResult.patchArtifact === \"object\" && toolResult.patchArtifact !== null\n ? (toolResult.patchArtifact as PatchResult[\"patchArtifact\"])\n : undefined,\n applied: Boolean(toolResult.applied),\n dryRun: Boolean(toolResult.dryRun),\n dependencyScope:\n typeof toolResult.packageName === \"string\"\n ? getDependencyScope(toolResult.packageName)\n : undefined,\n confidence:\n typeof toolResult.patchArtifact === \"object\" &&\n toolResult.patchArtifact !== null &&\n typeof (toolResult.patchArtifact as Record<string, unknown>).confidence === \"number\"\n ? ((toolResult.patchArtifact as Record<string, unknown>).confidence as number)\n : undefined,\n riskLevel:\n typeof toolResult.patchArtifact === \"object\" &&\n toolResult.patchArtifact !== null &&\n typeof (toolResult.patchArtifact as Record<string, unknown>).riskLevel === \"string\"\n ? ((toolResult.patchArtifact as Record<string, unknown>)\n .riskLevel as PatchResult[\"riskLevel\"])\n : undefined,\n unresolvedReason:\n !toolResult.applied && !toolResult.dryRun\n ? validation && validation.passed === false\n ? \"patch-validation-failed\"\n : \"patch-apply-failed\"\n : undefined,\n message,\n validation:\n validation && typeof validation.passed === \"boolean\"\n ? {\n passed: validation.passed,\n error: typeof validation.error === \"string\" ? validation.error : undefined,\n }\n : undefined,\n validationPhases: Array.isArray(toolResult.validationPhases)\n ? (toolResult.validationPhases as PatchResult[\"validationPhases\"])\n : undefined,\n });\n }\n }\n\n return {\n cveDetails: nextCveDetails,\n vulnerablePackages: nextVulnerablePackages,\n collectedResults: nextCollectedResults,\n };\n}\n","import { existsSync, readFileSync } from \"node:fs\";\nimport { join } from \"node:path\";\nimport type { PackageManager } from \"../platform/types.js\";\n\ninterface PromptContext {\n cveId: string;\n cwd: string;\n llmProvider: \"remote\" | \"local\";\n modelPersonality?: \"analytical\" | \"pragmatic\" | \"balanced\";\n packageManager: PackageManager;\n dryRun: boolean;\n runTests: boolean;\n policy: string;\n patchesDir: string;\n constraints: {\n directDependenciesOnly?: boolean;\n preferVersionBump?: boolean;\n };\n}\n\nfunction buildProviderAddendum(\n provider: \"remote\" | \"local\",\n personality: \"analytical\" | \"pragmatic\" | \"balanced\" = \"balanced\",\n): string {\n const personalityDirective =\n personality === \"analytical\"\n ? \"Use concise, explicit rationale for tool decisions and unresolved outcomes.\"\n : personality === \"pragmatic\"\n ? \"Prefer the smallest safe remediation path while preserving policy and validation gates.\"\n : \"Balance concise execution with brief rationale for risky or unresolved outcomes.\";\n\n const providerDirective =\n provider === \"remote\"\n ? \"Use strict structured output and deterministic reporting fields.\"\n : \"Use deterministic-first behavior and only rely on remote model fallback when required by patch generation.\";\n\n return `\\nProvider profile:\\n- Provider: ${provider}\\n- ${providerDirective}\\n- ${personalityDirective}`;\n}\n\nexport function loadOrchestrationPrompt(ctx: PromptContext): string {\n const promptPath = join(\n process.cwd(),\n \".github\",\n \"instructions\",\n \"orchestration.instructions.md\",\n );\n\n if (!existsSync(promptPath)) {\n return `You are autoremediator, an agentic security remediation system for Node.js package dependencies.\nWorking directory: ${ctx.cwd}\n Package manager: ${ctx.packageManager}\nDry run: ${ctx.dryRun}\nRun tests: ${ctx.runTests}\nPolicy: ${ctx.policy || \"undefined\"}\nPatches dir: ${ctx.patchesDir}\nDirect dependencies only: ${String(ctx.constraints.directDependenciesOnly ?? false)}\nPrefer version bump: ${String(ctx.constraints.preferVersionBump ?? false)}\n\nRequired sequence:\n1. lookup-cve\n2. check-inventory\n3. check-version-match\n4. find-fixed-version\n5. apply-version-bump\n6. apply-package-override\n\nFallback sequence (when neither version bump nor override can be applied):\n1. fetch-package-source\n2. generate-patch\n3. apply-patch-file\n\nAlways respect dryRun and policy constraints.`;\n }\n\n const template = readFileSync(promptPath, \"utf8\");\n return (\n template\n .replaceAll(\"{{cveId}}\", ctx.cveId)\n .replaceAll(\"{{cwd}}\", ctx.cwd)\n .replaceAll(\"{{packageManager}}\", ctx.packageManager)\n .replaceAll(\"{{dryRun}}\", String(ctx.dryRun))\n .replaceAll(\"{{runTests}}\", String(ctx.runTests))\n .replaceAll(\"{{policy}}\", ctx.policy || \"undefined\")\n .replaceAll(\"{{patchesDir}}\", ctx.patchesDir)\n .replaceAll(\n \"{{directDependenciesOnly}}\",\n String(ctx.constraints.directDependenciesOnly ?? false),\n )\n .replaceAll(\"{{preferVersionBump}}\", String(ctx.constraints.preferVersionBump ?? false)) +\n buildProviderAddendum(ctx.llmProvider, ctx.modelPersonality)\n );\n}\n","import type { RemediateOptions } from \"../../platform/types.js\";\n\nexport type ProgressStage =\n | \"pipeline-start\"\n | \"model-selected\"\n | \"agent-step\"\n | \"pipeline-finish\"\n | \"patch-fallback\"\n | \"patch-consensus\";\n\nexport function createProgressEmitter(options: RemediateOptions) {\n return (\n stage: ProgressStage,\n detail: string,\n extra?: { provider?: \"remote\" | \"local\"; model?: string },\n ): void => {\n if (!options.onProgress) return;\n options.onProgress({\n stage,\n detail,\n at: new Date().toISOString(),\n provider: extra?.provider,\n model: extra?.model,\n });\n };\n}\n","/**\n * Tool: lookup-cve\n *\n * Fetches CVE details from OSV (primary) and GitHub Advisory (secondary),\n * merges them, and optionally enriches with supplemental intelligence data.\n */\nimport { defineTool } from \"./tool-compat.js\";\nimport { z } from \"zod\";\nimport { lookupCveOsv } from \"../../intelligence/sources/osv.js\";\nimport {\n lookupCveGitHub,\n mergeGhDataIntoCveDetails,\n} from \"../../intelligence/sources/github-advisory.js\";\nimport { enrichWithNvd } from \"../../intelligence/sources/nvd.js\";\nimport { enrichWithCisaKev } from \"../../intelligence/sources/cisa-kev.js\";\nimport { enrichWithEpss } from \"../../intelligence/sources/epss.js\";\nimport { enrichWithCveServices } from \"../../intelligence/sources/cve-services.js\";\nimport { enrichWithGitLabAdvisory } from \"../../intelligence/sources/gitlab-advisory.js\";\nimport { enrichWithCertCc } from \"../../intelligence/sources/certcc.js\";\nimport { enrichWithDepsDev } from \"../../intelligence/sources/deps-dev.js\";\nimport { enrichWithOssfScorecard } from \"../../intelligence/sources/ossf-scorecard.js\";\nimport { enrichWithExternalFeeds } from \"../../intelligence/sources/external-feeds.js\";\nimport type { CveDetails } from \"../../platform/types.js\";\n\nexport const lookupCveTool = defineTool({\n description:\n \"Look up a CVE ID and return the list of affected npm packages, their vulnerable version ranges, and the first patched version. Always call this first.\",\n parameters: z.object({\n cveId: z.string().regex(/^CVE-\\d{4}-\\d+$/i, \"Must be a valid CVE ID like CVE-2021-23337\"),\n }),\n execute: async ({ cveId }): Promise<{ success: boolean; data?: CveDetails; error?: string }> => {\n const normalizedId = cveId.toUpperCase();\n\n // Fan out to OSV + GitHub Advisory in parallel\n const [osvDetails, ghPackages] = await Promise.all([\n lookupCveOsv(normalizedId),\n lookupCveGitHub(normalizedId),\n ]);\n\n if (!osvDetails && ghPackages.length === 0) {\n return {\n success: false,\n error: `CVE \"${normalizedId}\" was not found in OSV or GitHub Advisory databases. It may be too new, or not affect npm packages.`,\n };\n }\n\n // Start from OSV result or construct a minimal shell from GH data\n let details: CveDetails = osvDetails ?? {\n id: normalizedId,\n summary: \"Details sourced from GitHub Advisory Database.\",\n severity: \"UNKNOWN\",\n references: [],\n affectedPackages: [],\n };\n\n // Merge GitHub Advisory data (adds firstPatchedVersion, fills gaps)\n if (ghPackages.length > 0) {\n details = mergeGhDataIntoCveDetails(details, ghPackages);\n }\n\n const sourceHealth: Record<string, { attempted: boolean; changed: boolean; error?: string }> =\n {};\n\n const applyEnricher = async (\n sourceName: string,\n enricher: (input: CveDetails) => Promise<CveDetails>,\n ): Promise<void> => {\n const before = JSON.stringify(details);\n try {\n details = await enricher(details);\n const after = JSON.stringify(details);\n sourceHealth[sourceName] = {\n attempted: true,\n changed: before !== after,\n };\n } catch (error) {\n sourceHealth[sourceName] = {\n attempted: true,\n changed: false,\n error: error instanceof Error ? error.message : String(error),\n };\n }\n };\n\n await applyEnricher(\"nvd\", enrichWithNvd);\n await applyEnricher(\"cisa-kev\", enrichWithCisaKev);\n await applyEnricher(\"epss\", enrichWithEpss);\n await applyEnricher(\"cve-services\", enrichWithCveServices);\n await applyEnricher(\"gitlab-advisory\", enrichWithGitLabAdvisory);\n await applyEnricher(\"certcc\", enrichWithCertCc);\n await applyEnricher(\"deps-dev\", enrichWithDepsDev);\n await applyEnricher(\"ossf-scorecard\", enrichWithOssfScorecard);\n await applyEnricher(\"external-feeds\", enrichWithExternalFeeds);\n\n details.intelligence = {\n ...details.intelligence,\n sourceHealth,\n };\n\n if (details.affectedPackages.length === 0) {\n return {\n success: false,\n error: `CVE \"${normalizedId}\" was found but has no npm-specific affected packages listed. It may affect a different ecosystem.`,\n };\n }\n\n return { success: true, data: details };\n },\n});\n","/**\n * CVE Services (CVE.org/MITRE) client.\n *\n * Adds supplemental references and summary data when available.\n * Uses shared HTTP client for consistent error handling and timeouts.\n */\nimport type { CveDetails } from \"../../platform/types.js\";\nimport { getIntelligenceSourceConfig } from \"../../platform/config.js\";\nimport { httpClient } from \"../../platform/http-client.js\";\n\ninterface CveContainer {\n descriptions?: Array<{ lang?: string; value?: string }>;\n references?: Array<{ url?: string }>;\n}\n\ninterface CveRecord {\n containers?: {\n cna?: CveContainer;\n adp?: CveContainer[];\n };\n}\n\nfunction pickEnglishDescription(container?: CveContainer): string | undefined {\n if (!container?.descriptions?.length) return undefined;\n const en = container.descriptions.find((d) => d.lang === \"en\" && d.value);\n return (en?.value ?? container.descriptions[0]?.value)?.trim() || undefined;\n}\n\nfunction collectReferences(record: CveRecord): string[] {\n const refs = new Set<string>();\n const cnaRefs = record.containers?.cna?.references ?? [];\n const adpRefs = (record.containers?.adp ?? []).flatMap((c) => c.references ?? []);\n\n for (const ref of [...cnaRefs, ...adpRefs]) {\n if (ref.url) refs.add(ref.url);\n }\n return Array.from(refs);\n}\n\nexport async function fetchCveServicesRecord(cveId: string): Promise<CveRecord | undefined> {\n const { cveServicesApi } = getIntelligenceSourceConfig();\n if (!cveServicesApi) return undefined;\n\n try {\n const res = await httpClient({\n url: `${cveServicesApi}/${encodeURIComponent(cveId)}`,\n });\n if (!res.ok) return undefined;\n return res.data as CveRecord;\n } catch {\n return undefined;\n }\n}\n\nexport async function enrichWithCveServices(details: CveDetails): Promise<CveDetails> {\n const record = await fetchCveServicesRecord(details.id);\n if (!record) return details;\n\n const summary = pickEnglishDescription(record.containers?.cna);\n if (summary && (!details.summary || details.summary.includes(\"No summary available\"))) {\n details.summary = summary;\n }\n\n const refs = collectReferences(record);\n if (refs.length > 0) {\n const merged = new Set([...details.references, ...refs]);\n details.references = Array.from(merged);\n }\n\n details.intelligence = {\n ...details.intelligence,\n cveServicesEnriched: true,\n };\n\n return details;\n}\n","/**\n * GitLab advisory enrichment client.\n *\n * Endpoint is configurable because deployment paths vary by mirror.\n * Uses shared HTTP client for consistent error handling and timeouts.\n */\nimport type { CveDetails } from \"../../platform/types.js\";\nimport { getIntelligenceSourceConfig } from \"../../platform/config.js\";\nimport { httpClient } from \"../../platform/http-client.js\";\n\ninterface GitLabAdvisoryRecord {\n identifiers?: Array<{ type?: string; value?: string }>;\n references?: string[];\n}\n\nfunction advisoryMatchesCve(advisory: GitLabAdvisoryRecord, cveId: string): boolean {\n const normalized = cveId.toUpperCase();\n return (advisory.identifiers ?? []).some(\n (id) => id.type?.toUpperCase() === \"CVE\" && id.value?.toUpperCase() === normalized,\n );\n}\n\nexport async function fetchGitLabAdvisories(cveId: string): Promise<GitLabAdvisoryRecord[]> {\n const { gitLabAdvisoryApi } = getIntelligenceSourceConfig();\n if (!gitLabAdvisoryApi) return [];\n\n try {\n const url = new URL(gitLabAdvisoryApi);\n url.searchParams.set(\"identifier\", cveId);\n url.searchParams.set(\"ecosystem\", \"npm\");\n\n const res = await httpClient({ url: url.toString() });\n if (!res.ok) return [];\n\n const body = res.data;\n return Array.isArray(body) ? (body as GitLabAdvisoryRecord[]) : [];\n } catch {\n return [];\n }\n}\n\nexport async function enrichWithGitLabAdvisory(details: CveDetails): Promise<CveDetails> {\n const advisories = await fetchGitLabAdvisories(details.id);\n const matched = advisories.filter((a) => advisoryMatchesCve(a, details.id));\n if (matched.length === 0) return details;\n\n const refs = matched.flatMap((m) => m.references ?? []);\n if (refs.length > 0) {\n const merged = new Set([...details.references, ...refs]);\n details.references = Array.from(merged);\n }\n\n details.intelligence = {\n ...details.intelligence,\n gitlabAdvisoryMatched: true,\n };\n\n return details;\n}\n","/**\n * CERT/CC search enrichment.\n *\n * This source tries to locate a CERT/CC page mentioning a CVE.\n * Uses shared HTTP client for consistent error handling and timeouts.\n */\nimport type { CveDetails } from \"../../platform/types.js\";\nimport { getIntelligenceSourceConfig } from \"../../platform/config.js\";\nimport { httpClient } from \"../../platform/http-client.js\";\n\nconst CERTCC_HOME = \"https://www.kb.cert.org/vuls/\";\n\nexport async function findCertCcReference(cveId: string): Promise<string | undefined> {\n const { certCcSearchUrl } = getIntelligenceSourceConfig();\n if (!certCcSearchUrl) return undefined;\n\n try {\n const url = new URL(certCcSearchUrl);\n url.searchParams.set(\"query\", cveId);\n\n const res = await httpClient({\n url: url.toString(),\n headers: { Accept: \"text/html\" },\n });\n if (!res.ok) return undefined;\n\n const html = res.text;\n const match = html.match(/https:\\/\\/www\\.kb\\.cert\\.org\\/vuls\\/id\\/\\d+/i);\n return match?.[0] ?? undefined;\n } catch {\n return undefined;\n }\n}\n\nexport async function enrichWithCertCc(details: CveDetails): Promise<CveDetails> {\n const ref = await findCertCcReference(details.id);\n if (!ref) return details;\n\n if (!details.references.includes(ref)) {\n details.references.push(ref);\n }\n\n details.intelligence = {\n ...details.intelligence,\n certCcMatched: true,\n };\n\n if (!details.references.includes(CERTCC_HOME)) {\n details.references.push(CERTCC_HOME);\n }\n\n return details;\n}\n","/**\n * deps.dev enrichment.\n *\n * Adds package metadata lookup coverage count for affected npm packages.\n * Uses shared HTTP client for consistent error handling and timeouts.\n */\nimport type { CveDetails } from \"../../platform/types.js\";\nimport { getIntelligenceSourceConfig } from \"../../platform/config.js\";\nimport { httpClient } from \"../../platform/http-client.js\";\n\nasync function fetchDepsDevPackage(name: string): Promise<boolean> {\n const { depsDevApi } = getIntelligenceSourceConfig();\n if (!depsDevApi) return false;\n\n try {\n const url = `${depsDevApi}/systems/npm/packages/${encodeURIComponent(name)}`;\n const res = await httpClient({ url });\n return res.ok;\n } catch {\n return false;\n }\n}\n\nexport async function enrichWithDepsDev(details: CveDetails): Promise<CveDetails> {\n const names = Array.from(new Set(details.affectedPackages.map((p) => p.name))).slice(0, 20);\n if (names.length === 0) return details;\n\n const checks = await Promise.all(names.map((name) => fetchDepsDevPackage(name)));\n const matched = checks.filter(Boolean).length;\n if (matched === 0) return details;\n\n details.intelligence = {\n ...details.intelligence,\n depsDevEnrichedPackages: matched,\n };\n return details;\n}\n","/**\n * OpenSSF Scorecard enrichment.\n *\n * Uses best-effort project checks from affected package names.\n * Uses shared HTTP client for consistent error handling and timeouts.\n */\nimport type { CveDetails } from \"../../platform/types.js\";\nimport { getIntelligenceSourceConfig } from \"../../platform/config.js\";\nimport { httpClient } from \"../../platform/http-client.js\";\n\nasync function checkProject(project: string): Promise<boolean> {\n const { scorecardApi } = getIntelligenceSourceConfig();\n if (!scorecardApi) return false;\n\n try {\n const url = new URL(`${scorecardApi}/projects`);\n url.searchParams.set(\"project\", project);\n const res = await httpClient({ url: url.toString() });\n return res.ok;\n } catch {\n return false;\n }\n}\n\nexport async function enrichWithOssfScorecard(details: CveDetails): Promise<CveDetails> {\n const projects = Array.from(\n new Set(details.affectedPackages.map((p) => `github.com/${p.name}/${p.name}`)),\n ).slice(0, 10);\n\n if (projects.length === 0) return details;\n\n const checks = await Promise.all(projects.map((project) => checkProject(project)));\n const matched = checks.filter(Boolean).length;\n if (matched === 0) return details;\n\n details.intelligence = {\n ...details.intelligence,\n scorecardProjects: matched,\n };\n\n return details;\n}\n","/**\n * Optional vendor and commercial intelligence connectors.\n *\n * Connectors are URL-based and environment configured so enterprise users can\n * plug in proprietary feeds without hard-coding dependencies.\n * Uses shared HTTP client for consistent error handling and timeouts.\n */\nimport type { CveDetails } from \"../../platform/types.js\";\nimport { getIntelligenceSourceConfig } from \"../../platform/config.js\";\nimport { httpClient } from \"../../platform/http-client.js\";\n\nasync function probeFeed(url: string, cveId: string, token?: string): Promise<string | undefined> {\n try {\n const feedUrl = new URL(url);\n\n // Block SSRF to private/loopback/link-local addresses\n const hostname = feedUrl.hostname.toLowerCase();\n if (\n hostname === \"localhost\" ||\n hostname.startsWith(\"127.\") ||\n hostname.startsWith(\"10.\") ||\n /^172\\.(1[6-9]|2\\d|3[01])\\./.test(hostname) ||\n hostname.startsWith(\"192.168.\") ||\n hostname === \"0.0.0.0\" ||\n hostname.startsWith(\"169.254.\") ||\n hostname === \"[::1]\" ||\n hostname === \"::1\"\n ) {\n return undefined;\n }\n if (feedUrl.protocol !== \"https:\" && feedUrl.protocol !== \"http:\") {\n return undefined;\n }\n\n feedUrl.searchParams.set(\"cve\", cveId);\n\n const headers: Record<string, string> = {};\n if (token) headers.Authorization = `Bearer ${token}`;\n\n const res = await httpClient({ url: feedUrl.toString(), headers });\n if (!res.ok) return undefined;\n return feedUrl.toString();\n } catch {\n return undefined;\n }\n}\n\nexport async function enrichWithExternalFeeds(details: CveDetails): Promise<CveDetails> {\n const { vendorAdvisoryFeeds, commercialFeeds, commercialFeedToken } =\n getIntelligenceSourceConfig();\n\n const vendorHits = (\n await Promise.all(vendorAdvisoryFeeds.map((url) => probeFeed(url, details.id)))\n ).filter((v): v is string => Boolean(v));\n\n const commercialHits = (\n await Promise.all(commercialFeeds.map((url) => probeFeed(url, details.id, commercialFeedToken)))\n ).filter((v): v is string => Boolean(v));\n\n if (vendorHits.length === 0 && commercialHits.length === 0) {\n return details;\n }\n\n details.intelligence = {\n ...details.intelligence,\n vendorAdvisories: vendorHits.length > 0 ? vendorHits : details.intelligence?.vendorAdvisories,\n commercialFeeds:\n commercialHits.length > 0 ? commercialHits : details.intelligence?.commercialFeeds,\n };\n\n const mergedRefs = new Set([...details.references, ...vendorHits, ...commercialHits]);\n details.references = Array.from(mergedRefs);\n\n return details;\n}\n","/**\n * Tool: check-version-match\n *\n * Cross-references inventory packages against CVE-affected package ranges\n * to find which installed packages are actually vulnerable.\n */\nimport { defineTool } from \"./tool-compat.js\";\nimport { z } from \"zod\";\nimport semver from \"semver\";\nimport type { AffectedPackage, InventoryPackage, VulnerablePackage } from \"../../platform/types.js\";\n\nconst affectedPackageSchema = z.object({\n name: z.string(),\n ecosystem: z.literal(\"npm\"),\n vulnerableRange: z.string(),\n firstPatchedVersion: z.string().optional(),\n source: z.enum([\"osv\", \"github-advisory\"]),\n});\n\nconst inventoryPackageSchema = z.object({\n name: z.string(),\n version: z.string(),\n type: z.enum([\"direct\", \"transitive\"]),\n});\n\nexport const checkVersionMatchTool = defineTool({\n description:\n \"Check which of the project's installed packages fall within the CVE's vulnerable version ranges. Returns only the packages that are actually vulnerable.\",\n parameters: z.object({\n installedPackages: z\n .array(inventoryPackageSchema)\n .describe(\"Output from the check-inventory tool\"),\n affectedPackages: z\n .array(affectedPackageSchema)\n .describe(\"affectedPackages array from the lookup-cve tool result\"),\n }),\n execute: async ({\n installedPackages,\n affectedPackages,\n }): Promise<{\n vulnerablePackages: VulnerablePackage[];\n checkedCount: number;\n }> => {\n const vulnerable: VulnerablePackage[] = [];\n\n for (const affected of affectedPackages as AffectedPackage[]) {\n // Find all installed packages with matching name\n const matches = (installedPackages as InventoryPackage[]).filter(\n (p) => p.name === affected.name,\n );\n\n for (const installed of matches) {\n // Validate the installed version is parseable\n if (!semver.valid(installed.version)) continue;\n\n let isVulnerable = false;\n try {\n isVulnerable = semver.satisfies(installed.version, affected.vulnerableRange, {\n includePrerelease: false,\n });\n } catch {\n // Malformed range — skip rather than crash\n continue;\n }\n\n if (isVulnerable) {\n vulnerable.push({ installed, affected });\n }\n }\n }\n\n return {\n vulnerablePackages: vulnerable,\n checkedCount: installedPackages.length,\n };\n },\n});\n","/**\n * Tool: find-fixed-version\n *\n * Queries the npm registry to find the best safe upgrade version\n * for a vulnerable package.\n */\nimport { defineTool } from \"./tool-compat.js\";\nimport { z } from \"zod\";\nimport { resolveSafeUpgradeVersion } from \"../../intelligence/sources/registry.js\";\n\nexport const findFixedVersionTool = defineTool({\n description:\n \"Query the npm registry to find the safest published upgrade version for a package that is >= the first patched version. Prefer patch upgrades first, then minor, and only fall back to major when no same-major fix exists.\",\n parameters: z.object({\n packageName: z.string().describe(\"The npm package name\"),\n installedVersion: z.string().describe(\"The currently installed version (exact semver)\"),\n firstPatchedVersion: z\n .string()\n .describe(\n \"The first version that is NOT vulnerable (from lookup-cve). Use this as the floor.\",\n ),\n vulnerableRange: z\n .string()\n .optional()\n .describe(\"Optional vulnerable semver range used to exclude still-vulnerable versions\"),\n }),\n execute: async ({\n packageName,\n installedVersion,\n firstPatchedVersion,\n vulnerableRange,\n }): Promise<{\n safeVersion?: string;\n upgradeLevel?: \"patch\" | \"minor\" | \"major\";\n candidates: Partial<Record<\"patch\" | \"minor\" | \"major\", string>>;\n isMajorBump: boolean;\n majorOnlyFixAvailable: boolean;\n message: string;\n }> => {\n const resolution = await resolveSafeUpgradeVersion(\n packageName,\n installedVersion,\n firstPatchedVersion,\n vulnerableRange,\n );\n const { safeVersion, upgradeLevel, candidates, majorOnlyFixAvailable } = resolution;\n\n if (!safeVersion) {\n return {\n candidates,\n isMajorBump: false,\n majorOnlyFixAvailable: false,\n message: `No safe upgrade version found for \"${packageName}\". The patch-file path will be needed.`,\n };\n }\n\n const installedMajor = parseInt(installedVersion.split(\".\")[0] ?? \"0\", 10);\n const safeMajor = parseInt(safeVersion.split(\".\")[0] ?? \"0\", 10);\n const isMajorBump = safeMajor > installedMajor;\n\n return {\n safeVersion,\n upgradeLevel,\n candidates,\n isMajorBump,\n majorOnlyFixAvailable,\n message: isMajorBump\n ? `Found safe version ${safeVersion} for \"${packageName}\", but only a major upgrade is available from ${installedVersion}. This should remain blocked unless policy explicitly allows major bumps.`\n : `Found ${upgradeLevel ?? \"safe\"} upgrade ${safeVersion} for \"${packageName}\" (from ${installedVersion}).`,\n };\n },\n});\n","/**\n * Tool: check-suppression\n *\n * Matches a CVE ID against the active VEX suppressions in the policy.\n * A suppression is active when its expiresAt is absent or in the future.\n */\nimport { defineTool } from \"./tool-compat.js\";\nimport { z } from \"zod\";\nimport { isActiveSuppression } from \"../../platform/policy.js\";\nimport type { VexJustification } from \"../../platform/types.js\";\n\nconst suppressionSchema = z.object({\n cveId: z.string(),\n justification: z.enum([\"not_affected\", \"fixed\", \"mitigated\", \"under_investigation\"]),\n notes: z.string().optional(),\n expiresAt: z.string().optional(),\n});\n\nexport const checkSuppressionTool = defineTool({\n description:\n \"Check whether a CVE is suppressed by an active VEX suppression entry in the policy. Returns suppressed=true and the justification if an active match is found. Call this after check-version-match.\",\n parameters: z.object({\n cveId: z.string().describe(\"The CVE ID to look up in suppressions\"),\n suppressions: z\n .array(suppressionSchema)\n .describe(\"The suppressions array from the loaded policy\"),\n }),\n execute: async ({\n cveId,\n suppressions,\n }): Promise<{\n suppressed: boolean;\n justification?: VexJustification;\n notes?: string;\n }> => {\n const match = suppressions.find((s) => s.cveId === cveId && isActiveSuppression(s));\n\n if (!match) {\n return { suppressed: false };\n }\n\n return {\n suppressed: true,\n justification: match.justification as VexJustification,\n notes: match.notes,\n };\n },\n});\n","import type { Tool } from \"ai\";\nimport { lookupCveTool } from \"./tools/lookup-cve.js\";\nimport { checkVersionMatchTool } from \"./tools/check-version-match.js\";\nimport { findFixedVersionTool } from \"./tools/find-fixed-version.js\";\nimport { fetchPackageSourceTool } from \"./tools/fetch-package-source.js\";\nimport { generatePatchTool } from \"./tools/generate-patch/index.js\";\nimport { checkSuppressionTool } from \"./tools/check-suppression.js\";\nimport { checkExploitSignalTool } from \"./tools/check-exploit-signal.js\";\nimport { checkReachabilityTool } from \"./tools/check-reachability.js\";\n\ninterface RuntimeToolLike {\n description?: string;\n parameters?: unknown;\n execute: (input: any) => Promise<unknown>;\n [key: string]: unknown;\n}\n\ninterface RuntimeToolContext {\n checkInventoryToolForRun: RuntimeToolLike;\n applyVersionBumpToolForRun: RuntimeToolLike;\n applyPackageOverrideToolForRun: RuntimeToolLike;\n applyPatchFileToolForRun: RuntimeToolLike;\n constraints: {\n directDependenciesOnly?: boolean;\n preferVersionBump?: boolean;\n workspace?: string;\n installMode?: \"standard\" | \"prefer-offline\" | \"deterministic\";\n installPreferOffline?: boolean;\n enforceFrozenLockfile?: boolean;\n };\n}\n\nexport function buildRuntimeTools(ctx: RuntimeToolContext): Record<string, Tool> {\n const tools: Record<string, Tool> = {\n \"lookup-cve\": lookupCveTool as unknown as Tool,\n \"check-inventory\": ctx.checkInventoryToolForRun as unknown as Tool,\n \"check-version-match\": checkVersionMatchTool as unknown as Tool,\n \"find-fixed-version\": findFixedVersionTool as unknown as Tool,\n \"apply-version-bump\": ctx.applyVersionBumpToolForRun as unknown as Tool,\n \"check-suppression\": checkSuppressionTool as unknown as Tool,\n \"check-exploit-signal\": checkExploitSignalTool as unknown as Tool,\n \"check-reachability\": checkReachabilityTool as unknown as Tool,\n };\n\n if (!ctx.constraints.directDependenciesOnly && !ctx.constraints.preferVersionBump) {\n tools[\"apply-package-override\"] = ctx.applyPackageOverrideToolForRun as unknown as Tool;\n }\n\n if (!ctx.constraints.preferVersionBump) {\n tools[\"fetch-package-source\"] = fetchPackageSourceTool as unknown as Tool;\n tools[\"generate-patch\"] = generatePatchTool as unknown as Tool;\n tools[\"apply-patch-file\"] = ctx.applyPatchFileToolForRun as unknown as Tool;\n }\n\n return tools;\n}\n","import type { RemediateOptions } from \"../../platform/types.js\";\nimport { applyPackageOverrideTool } from \"../tools/apply-package-override/index.js\";\nimport { applyPatchFileTool } from \"../tools/apply-patch-file/index.js\";\nimport { applyVersionBumpTool } from \"../tools/apply-version-bump.js\";\nimport { checkInventoryTool } from \"../tools/check-inventory.js\";\nimport { buildRuntimeTools } from \"../runtime-tools.js\";\n\nexport function createRuntimeToolsForRun(options: RemediateOptions) {\n const preview = options.preview ?? false;\n const constraints = options.constraints ?? {};\n const policy = options.policy ?? \"\";\n\n const checkInventoryToolForRun = {\n ...checkInventoryTool,\n execute: async (input: Parameters<typeof checkInventoryTool.execute>[0]) =>\n checkInventoryTool.execute({\n ...input,\n policy,\n workspace: constraints.workspace,\n }),\n };\n\n const applyVersionBumpToolForRun = {\n ...applyVersionBumpTool,\n execute: async (input: Parameters<typeof applyVersionBumpTool.execute>[0]) =>\n applyVersionBumpTool.execute({\n ...input,\n policy,\n installMode: constraints.installMode,\n installPreferOffline: constraints.installPreferOffline,\n enforceFrozenLockfile: constraints.enforceFrozenLockfile,\n workspace: constraints.workspace,\n typecheck: input.typecheck ?? options.typecheck ?? constraints.typecheck,\n breakingChangeRefactor:\n input.breakingChangeRefactor ??\n options.breakingChangeRefactor ??\n constraints.enableBreakingChangeRefactor,\n dryRun: preview ? true : input.dryRun,\n }),\n };\n\n const applyPackageOverrideToolForRun = {\n ...applyPackageOverrideTool,\n execute: async (input: Parameters<typeof applyPackageOverrideTool.execute>[0]) =>\n applyPackageOverrideTool.execute({\n ...input,\n policy,\n installMode: constraints.installMode,\n installPreferOffline: constraints.installPreferOffline,\n enforceFrozenLockfile: constraints.enforceFrozenLockfile,\n workspace: constraints.workspace,\n dryRun: preview ? true : input.dryRun,\n }),\n };\n\n const applyPatchFileToolForRun = {\n ...applyPatchFileTool,\n execute: async (input: Parameters<typeof applyPatchFileTool.execute>[0]) =>\n applyPatchFileTool.execute({\n ...input,\n policy,\n installMode: constraints.installMode,\n installPreferOffline: constraints.installPreferOffline,\n enforceFrozenLockfile: constraints.enforceFrozenLockfile,\n workspace: constraints.workspace,\n proofOfFix: input.proofOfFix ?? options.proofOfFix,\n requireProofOfFix:\n input.requireProofOfFix ??\n options.requireProofOfFix ??\n constraints.requireProofOfFix,\n dryRun: preview ? true : input.dryRun,\n }),\n };\n\n const tools = buildRuntimeTools({\n checkInventoryToolForRun,\n applyVersionBumpToolForRun,\n applyPackageOverrideToolForRun,\n applyPatchFileToolForRun,\n constraints,\n });\n\n if (options.offlineIntelligence) {\n const offlineMessage = options.intelligenceSnapshotPath\n ? `Offline mode: intelligence lookup via snapshot only. No live network calls.`\n : `Offline mode: intelligence lookup skipped (no snapshot provided).`;\n\n (tools as Record<string, unknown>)[\"lookup-cve\"] = {\n ...((tools as Record<string, unknown>)[\"lookup-cve\"] as Record<string, unknown>),\n execute: async (_input: Record<string, unknown>) => ({\n cveId: ((_input as { cveId?: string }).cveId ?? \"unknown\").toUpperCase(),\n found: false,\n offlineMode: true,\n message: offlineMessage,\n }),\n };\n }\n\n return tools;\n}\n","import { createModel, resolveProvider } from \"../../platform/config.js\";\nimport { detectPackageManager } from \"../../platform/package-manager/index.js\";\nimport type { PackageManager, RemediateOptions } from \"../../platform/types.js\";\nimport { loadOrchestrationPrompt } from \"../orchestration-prompt.js\";\nimport { createProgressEmitter } from \"./progress.js\";\nimport { createRuntimeToolsForRun } from \"./tool-wrappers.js\";\n\nexport { createProgressEmitter, createRuntimeToolsForRun };\n\nexport async function createPipelineRuntime(\n cveId: string,\n options: RemediateOptions,\n): Promise<{\n provider: \"remote\" | \"local\";\n cwd: string;\n packageManager: PackageManager;\n dryRun: boolean;\n model: Awaited<ReturnType<typeof createModel>>;\n modelName: string;\n prompt: string;\n systemPrompt: string;\n}> {\n const provider = resolveProvider(options);\n const cwd = options.cwd ?? process.cwd();\n const packageManager = options.packageManager ?? detectPackageManager(cwd);\n const preview = options.preview ?? false;\n const dryRun = (options.dryRun ?? false) || preview;\n const runTests = options.runTests ?? false;\n const policy = options.policy ?? \"\";\n const patchesDir = options.patchesDir || \"./patches\";\n const constraints = options.constraints ?? {};\n\n const prompt = `Patch vulnerable dependencies affected by ${cveId} in the project at: ${cwd}. Package manager: ${packageManager}.`;\n const model = await createModel(options, { inputChars: prompt.length });\n const modelName =\n typeof model === \"string\"\n ? model\n : \"modelId\" in model && typeof model.modelId === \"string\"\n ? model.modelId\n : \"unknown-model\";\n const systemPrompt = loadOrchestrationPrompt({\n cveId,\n cwd,\n llmProvider: provider,\n modelPersonality: options.modelPersonality,\n dryRun,\n runTests,\n policy,\n patchesDir,\n packageManager,\n constraints,\n });\n\n return {\n provider,\n cwd,\n packageManager,\n dryRun,\n model,\n modelName,\n prompt,\n systemPrompt,\n };\n}\n","import { execa } from \"execa\";\nimport { randomBytes } from \"node:crypto\";\nimport type {\n ChangeRequestGrouping,\n ChangeRequestOptions,\n ChangeRequestResult,\n RemediationReport,\n} from \"../../platform/types.js\";\n\ninterface ChangeRequestPlan {\n cveIds: string[];\n packageNames: string[];\n title: string;\n body: string;\n}\n\nfunction sanitizeBranchToken(value: string): string {\n return value\n .toLowerCase()\n .replace(/[^a-z0-9._/-]+/g, \"-\")\n .replace(/^-+|-+$/g, \"\")\n .slice(0, 80);\n}\n\nfunction buildPlan(reports: RemediationReport[]): ChangeRequestPlan {\n const cveIds = Array.from(new Set(reports.map((report) => report.cveId)));\n const packageNames = Array.from(\n new Set(reports.flatMap((report) => report.results.map((result) => result.packageName))),\n );\n\n const titleSuffix = cveIds.length === 1 ? cveIds[0]! : `${cveIds.length} CVEs`;\n const title = `security remediation: ${titleSuffix}`;\n const body = [\n \"Automated remediation generated by autoremediator.\",\n \"\",\n `CVEs: ${cveIds.join(\", \")}`,\n `Packages: ${packageNames.join(\", \")}`,\n ].join(\"\\n\");\n\n return {\n cveIds,\n packageNames,\n title,\n body,\n };\n}\n\nfunction resolveProvider(options: ChangeRequestOptions): \"github\" | \"gitlab\" {\n return options.provider ?? \"github\";\n}\n\nfunction resolveGrouping(options: ChangeRequestOptions): ChangeRequestGrouping {\n const allowed: ChangeRequestGrouping[] = [\"all\", \"per-cve\", \"per-package\", \"by-severity\"];\n if (options.grouping && !allowed.includes(options.grouping)) {\n throw new Error(\n `Unsupported changeRequest.grouping: \"${options.grouping}\". Supported values: ${allowed.join(\", \")}`,\n );\n }\n return options.grouping ?? \"all\";\n}\n\nexport function groupReports(\n reports: RemediationReport[],\n grouping: ChangeRequestGrouping,\n): RemediationReport[][] {\n if (reports.length === 0) return [];\n if (grouping === \"all\") {\n return [reports];\n }\n\n if (grouping === \"per-cve\") {\n const map = new Map<string, RemediationReport[]>();\n for (const report of reports) {\n const key = report.cveId.toUpperCase();\n const list = map.get(key) ?? [];\n list.push(report);\n map.set(key, list);\n }\n return Array.from(map.values());\n }\n\n if (grouping === \"per-package\") {\n const map = new Map<string, RemediationReport[]>();\n for (const report of reports) {\n const pkgs = new Set(report.results.map((r) => r.packageName));\n if (pkgs.size === 0) {\n const list = map.get(\"misc\") ?? [];\n list.push(report);\n map.set(\"misc\", list);\n } else {\n for (const pkg of pkgs) {\n const list = map.get(pkg) ?? [];\n list.push(report);\n map.set(pkg, list);\n }\n }\n }\n return Array.from(map.values());\n }\n\n if (grouping === \"by-severity\") {\n const map = new Map<string, RemediationReport[]>();\n for (const report of reports) {\n const sev = report.cveDetails?.severity ?? \"UNKNOWN\";\n const list = map.get(sev) ?? [];\n list.push(report);\n map.set(sev, list);\n }\n return Array.from(map.values());\n }\n\n return [reports];\n}\n\nasync function detectCurrentBranch(cwd: string): Promise<string> {\n const result = await execa(\"git\", [\"rev-parse\", \"--abbrev-ref\", \"HEAD\"], {\n cwd,\n stdio: \"pipe\",\n });\n return result.stdout.trim();\n}\n\nasync function ensureRepoHasChanges(cwd: string): Promise<boolean> {\n const diff = await execa(\"git\", [\"status\", \"--porcelain\"], {\n cwd,\n stdio: \"pipe\",\n });\n return diff.stdout.trim().length > 0;\n}\n\nfunction toBranchName(prefix: string, cveIds: string[]): string {\n const token = sanitizeBranchToken(cveIds.join(\"-\") || \"remediation\");\n return `${sanitizeBranchToken(prefix)}/${token}-${randomBytes(6).toString(\"hex\")}`;\n}\n\nasync function createGitHubRequest(params: {\n cwd: string;\n repository?: string;\n head: string;\n base: string;\n title: string;\n body: string;\n draft?: boolean;\n}): Promise<string | undefined> {\n const args = [\n \"pr\",\n \"create\",\n \"--head\",\n params.head,\n \"--base\",\n params.base,\n \"--title\",\n params.title,\n \"--body\",\n params.body,\n ];\n if (params.repository) {\n args.push(\"--repo\", params.repository);\n }\n if (params.draft) {\n args.push(\"--draft\");\n }\n\n const result = await execa(\"gh\", args, {\n cwd: params.cwd,\n stdio: \"pipe\",\n });\n return result.stdout.trim() || undefined;\n}\n\nasync function createGitLabRequest(params: {\n cwd: string;\n repository?: string;\n source: string;\n target: string;\n title: string;\n body: string;\n draft?: boolean;\n}): Promise<string | undefined> {\n const args = [\n \"mr\",\n \"create\",\n \"--source-branch\",\n params.source,\n \"--target-branch\",\n params.target,\n \"--title\",\n params.title,\n \"--description\",\n params.body,\n ];\n if (params.repository) {\n args.push(\"-R\", params.repository);\n }\n if (params.draft) {\n args.push(\"--draft\");\n }\n\n const result = await execa(\"glab\", args, {\n cwd: params.cwd,\n stdio: \"pipe\",\n });\n return result.stdout.trim() || undefined;\n}\n\nexport async function createChangeRequestsForReports(params: {\n cwd: string;\n options: ChangeRequestOptions;\n reports: RemediationReport[];\n}): Promise<ChangeRequestResult[]> {\n const { cwd, options, reports } = params;\n const provider = resolveProvider(options);\n const grouping = resolveGrouping(options);\n const groups = groupReports(reports, grouping);\n\n if (groups.length === 0) {\n return [];\n }\n\n const results: ChangeRequestResult[] = [];\n const hasChanges = await ensureRepoHasChanges(cwd).catch(() => false);\n\n const baseBranch = options.baseBranch ?? (await detectCurrentBranch(cwd).catch(() => \"main\"));\n const branchPrefix = options.branchPrefix ?? \"autoremediator\";\n const pushRemote = options.pushRemote ?? \"origin\";\n if (options.pushRemote && !/^[a-zA-Z0-9._-]+$/.test(options.pushRemote)) {\n throw new Error(`Invalid pushRemote value: ${options.pushRemote}`);\n }\n if (options.repository && !/^[a-zA-Z0-9._-]+\\/[a-zA-Z0-9._-]+$/.test(options.repository)) {\n throw new Error(`Invalid repository format: ${options.repository}`);\n }\n\n for (const group of groups) {\n const plan = buildPlan(group);\n const titlePrefix = options.titlePrefix?.trim().slice(0, 200);\n const bodyFooter = options.bodyFooter ? options.bodyFooter.slice(0, 2000) : undefined;\n const title = titlePrefix ? `${titlePrefix} ${plan.title}` : plan.title;\n const body = bodyFooter ? `${plan.body}\\n\\n${bodyFooter}` : plan.body;\n\n if (!hasChanges) {\n results.push({\n provider,\n grouping,\n repository: options.repository,\n branchName: \"\",\n title,\n body,\n created: false,\n cveIds: plan.cveIds,\n packageNames: plan.packageNames,\n error: \"No repository changes to include in change request.\",\n });\n continue;\n }\n\n const branchName = toBranchName(branchPrefix, plan.cveIds);\n\n try {\n await execa(\"git\", [\"checkout\", \"-b\", branchName], { cwd, stdio: \"pipe\" });\n await execa(\"git\", [\"add\", \"-A\"], { cwd, stdio: \"pipe\" });\n await execa(\"git\", [\"commit\", \"-m\", title], { cwd, stdio: \"pipe\" });\n await execa(\"git\", [\"push\", \"-u\", pushRemote, branchName], { cwd, stdio: \"pipe\" });\n\n const url =\n provider === \"github\"\n ? await createGitHubRequest({\n cwd,\n repository: options.repository,\n head: branchName,\n base: baseBranch,\n title,\n body,\n draft: options.draft,\n })\n : await createGitLabRequest({\n cwd,\n repository: options.repository,\n source: branchName,\n target: baseBranch,\n title,\n body,\n draft: options.draft,\n });\n\n results.push({\n provider,\n grouping,\n repository: options.repository,\n branchName,\n title,\n body,\n created: true,\n draft: options.draft,\n url,\n cveIds: plan.cveIds,\n packageNames: plan.packageNames,\n });\n\n // Switch back to base branch if more groups remain\n if (groups.length > 1) {\n await execa(\"git\", [\"checkout\", baseBranch], { cwd, stdio: \"pipe\" }).catch(() => {});\n }\n } catch (error) {\n results.push({\n provider,\n grouping,\n repository: options.repository,\n branchName: \"\",\n title,\n body,\n created: false,\n draft: options.draft,\n cveIds: plan.cveIds,\n packageNames: plan.packageNames,\n error: error instanceof Error ? error.message : String(error),\n });\n }\n }\n\n return results;\n}\n","import type {\n CorrelationContext,\n ProvenanceContext,\n RemediateOptions,\n RemediationConstraints,\n} from \"../platform/types.js\";\nimport { loadPolicy } from \"../platform/policy.js\";\n\nfunction buildRequestId(): string {\n return `req-${Date.now()}-${Math.random().toString(36).slice(2, 8)}`;\n}\n\nexport function resolveCorrelationContext(\n options: RemediateOptions,\n): Required<Pick<CorrelationContext, \"requestId\">> & CorrelationContext {\n return {\n requestId: options.requestId ?? buildRequestId(),\n sessionId: options.sessionId,\n parentRunId: options.parentRunId,\n };\n}\n\nexport function resolveProvenanceContext(options: RemediateOptions): ProvenanceContext {\n return {\n actor: options.actor,\n source: options.source ?? \"sdk\",\n };\n}\n\nexport function resolveConstraints(options: RemediateOptions, cwd: string): RemediationConstraints {\n const policy = loadPolicy(cwd, options.policy);\n return {\n directDependenciesOnly:\n options.constraints?.directDependenciesOnly ??\n policy.constraints?.directDependenciesOnly ??\n false,\n preferVersionBump:\n options.constraints?.preferVersionBump ?? policy.constraints?.preferVersionBump ?? false,\n installMode:\n options.constraints?.installMode ?? policy.constraints?.installMode ?? \"deterministic\",\n installPreferOffline:\n options.constraints?.installPreferOffline ?? policy.constraints?.installPreferOffline,\n enforceFrozenLockfile:\n options.constraints?.enforceFrozenLockfile ?? policy.constraints?.enforceFrozenLockfile,\n workspace: options.constraints?.workspace ?? policy.constraints?.workspace,\n typecheck: options.typecheck ?? options.constraints?.typecheck ?? policy.constraints?.typecheck,\n requireProofOfFix:\n options.requireProofOfFix ??\n options.constraints?.requireProofOfFix ??\n policy.constraints?.requireProofOfFix,\n enableBreakingChangeRefactor:\n options.breakingChangeRefactor ??\n options.constraints?.enableBreakingChangeRefactor ??\n policy.constraints?.enableBreakingChangeRefactor,\n supplyChainPolicy:\n options.supplyChainPolicy ??\n options.constraints?.supplyChainPolicy ??\n policy.constraints?.supplyChainPolicy,\n };\n}\n","import { mkdirSync, writeFileSync } from \"node:fs\";\nimport { join } from \"node:path\";\nimport type {\n DependencyScopeCounts,\n DispositionCounts,\n EscalationCounts,\n PatchStrategyCounts,\n SimulationSummary,\n SlaBreachSummary,\n UnresolvedReasonCounts,\n} from \"./types.js\";\n\nexport interface EvidenceStep {\n at: string;\n action: string;\n input?: Record<string, unknown>;\n output?: Record<string, unknown>;\n error?: string;\n}\n\nexport interface EvidenceSummary {\n status: \"ok\" | \"partial\" | \"failed\";\n cveCount: number;\n remediationCount: number;\n successCount: number;\n failedCount: number;\n patchCount: number;\n patchValidationFailures?: Array<{\n packageName: string;\n cveId: string;\n error: string;\n }>;\n strategyCounts?: PatchStrategyCounts;\n unresolvedByReason?: UnresolvedReasonCounts;\n dependencyScopeCounts?: DependencyScopeCounts;\n patchesDir?: string;\n llmUsageCount?: number;\n estimatedCostUsd?: number;\n totalLlmLatencyMs?: number;\n exploitSignalCount?: number;\n slaBreachCount?: number;\n dispositionCounts?: DispositionCounts;\n escalationCounts?: EscalationCounts;\n containmentCount?: number;\n simulationSummary?: SimulationSummary;\n slaBreachSummary?: SlaBreachSummary;\n proofOfFixCount?: number;\n refactoredCount?: number;\n}\n\nexport interface EvidenceLog {\n runId: string;\n requestId?: string;\n sessionId?: string;\n parentRunId?: string;\n actor?: string;\n source?: \"cli\" | \"sdk\" | \"mcp\" | \"openapi\" | \"unknown\";\n llmProvider?: \"remote\" | \"local\";\n idempotencyKey?: string;\n offlineMode?: boolean;\n cveIds: string[];\n cwd: string;\n startedAt: string;\n finishedAt?: string;\n summary?: EvidenceSummary;\n steps: EvidenceStep[];\n}\n\ninterface EvidenceContext {\n requestId?: string;\n sessionId?: string;\n parentRunId?: string;\n actor?: string;\n source?: \"cli\" | \"sdk\" | \"mcp\" | \"openapi\" | \"unknown\";\n llmProvider?: \"remote\" | \"local\";\n idempotencyKey?: string;\n offlineMode?: boolean;\n}\n\nexport function createEvidenceLog(\n cwd: string,\n cveIds: string[],\n context: EvidenceContext = {},\n): EvidenceLog {\n return {\n runId: `${Date.now()}-${Math.random().toString(36).slice(2, 8)}`,\n requestId: context.requestId,\n sessionId: context.sessionId,\n parentRunId: context.parentRunId,\n actor: context.actor,\n source: context.source,\n llmProvider: context.llmProvider,\n idempotencyKey: context.idempotencyKey,\n offlineMode: context.offlineMode,\n cveIds,\n cwd,\n startedAt: new Date().toISOString(),\n steps: [],\n };\n}\n\nexport function addEvidenceStep(\n log: EvidenceLog,\n action: string,\n input?: Record<string, unknown>,\n output?: Record<string, unknown>,\n error?: string,\n): void {\n log.steps.push({\n at: new Date().toISOString(),\n action,\n input,\n output,\n error,\n });\n}\n\nexport function finalizeEvidence(log: EvidenceLog): EvidenceLog {\n log.finishedAt = new Date().toISOString();\n return log;\n}\n\nexport function writeEvidenceLog(cwd: string, log: EvidenceLog): string {\n const dir = join(cwd, \".autoremediator\", \"evidence\");\n mkdirSync(dir, { recursive: true });\n const filePath = join(dir, `${log.runId}.json`);\n writeFileSync(filePath, JSON.stringify(log, null, 2) + \"\\n\", \"utf8\");\n return filePath;\n}\n","import type { RemediateOptions, RemediationReport } from \"../platform/types.js\";\nimport {\n addEvidenceStep,\n createEvidenceLog,\n finalizeEvidence,\n type EvidenceLog,\n writeEvidenceLog,\n} from \"../platform/evidence.js\";\n\nexport function createRemediateEvidence(params: {\n cwd: string;\n cveId: string;\n options: RemediateOptions;\n llmProvider: \"remote\" | \"local\";\n correlation: { requestId?: string; sessionId?: string; parentRunId?: string };\n provenance: { actor?: string; source?: \"cli\" | \"sdk\" | \"mcp\" | \"openapi\" | \"unknown\" };\n}): EvidenceLog | undefined {\n if (params.options.evidence === false) {\n return undefined;\n }\n\n return createEvidenceLog(params.cwd, [params.cveId], {\n ...params.correlation,\n actor: params.provenance.actor,\n source: params.provenance.source,\n llmProvider: params.llmProvider,\n idempotencyKey: params.options.idempotencyKey,\n offlineMode: params.options.offlineIntelligence === true ? true : undefined,\n });\n}\n\nexport function addRemediateStartStep(params: {\n evidence: EvidenceLog | undefined;\n cveId: string;\n options: RemediateOptions;\n llmProvider: \"remote\" | \"local\";\n constraints: { directDependenciesOnly?: boolean; preferVersionBump?: boolean };\n}): void {\n if (!params.evidence) {\n return;\n }\n\n addEvidenceStep(\n params.evidence,\n \"remediate.start\",\n {\n cveId: params.cveId,\n dryRun: Boolean(params.options.dryRun),\n preview: Boolean(params.options.preview),\n simulationMode: Boolean(params.options.simulationMode),\n llmProvider: params.llmProvider,\n },\n {\n directDependenciesOnly: Boolean(params.constraints.directDependenciesOnly),\n preferVersionBump: Boolean(params.constraints.preferVersionBump),\n },\n );\n}\n\nexport function addRemediateResultSteps(\n evidence: EvidenceLog | undefined,\n cveId: string,\n report: RemediationReport,\n): void {\n if (!evidence) {\n return;\n }\n\n for (const result of report.results) {\n addEvidenceStep(\n evidence,\n \"remediate.package-result\",\n {\n packageName: result.packageName,\n strategy: result.strategy,\n fromVersion: result.fromVersion,\n toVersion: result.toVersion,\n },\n {\n applied: result.applied,\n dryRun: result.dryRun,\n unresolvedReason: result.unresolvedReason,\n reachability: result.reachability?.status,\n hasAlternatives: Boolean(result.alternativeSuggestions?.length),\n suppressedBy: result.suppressedBy?.justification,\n regressionDetected: result.regressionDetected,\n simulationWouldMutate: result.simulation?.wouldMutate,\n simulationRebuttalCount: result.simulation?.rebuttalFindings.length,\n },\n );\n }\n\n const containmentCount = report.results.filter(\n (result) => result.unresolvedReason === \"policy-blocked\" && result.disposition === \"escalate\",\n ).length;\n\n if (containmentCount > 0) {\n addEvidenceStep(\n evidence,\n \"containment-summary\",\n { cveId },\n {\n containmentCount,\n blockedUnresolvedReason: \"policy-blocked\",\n blockedDisposition: \"escalate\",\n },\n );\n }\n\n addEvidenceStep(\n evidence,\n \"remediate.finish\",\n { cveId },\n {\n resultCount: report.results.length,\n vulnerableCount: report.vulnerablePackages.length,\n llmUsage: report.llmUsage,\n exploitSignalTriggered: report.exploitSignalTriggered ?? false,\n slaBreachCount: report.slaBreaches?.length ?? 0,\n regressionDetectedCount: report.results.filter((r) => r.regressionDetected).length,\n containmentCount,\n sbomEntryCount: report.sbom?.length ?? 0,\n simulationSummary: report.simulationSummary,\n },\n );\n finalizeEvidence(evidence);\n}\n\nexport function addRemediateDispositionStep(\n evidence: EvidenceLog | undefined,\n cveId: string,\n report: RemediationReport,\n): void {\n if (!evidence) {\n return;\n }\n\n const byCveId: Record<\n string,\n Record<string, { disposition: string; dispositionReason?: string }>\n > = {};\n\n for (const result of report.results) {\n if (!result.disposition) continue;\n if (!byCveId[cveId]) {\n byCveId[cveId] = {};\n }\n byCveId[cveId][result.packageName] = {\n disposition: result.disposition,\n dispositionReason: result.dispositionReason,\n };\n }\n\n if (Object.keys(byCveId).length === 0) {\n return;\n }\n\n addEvidenceStep(evidence, \"disposition-summary\", { cveId }, { byCveId });\n}\n\nexport function addRemediateErrorStep(\n evidence: EvidenceLog | undefined,\n cveId: string,\n error: unknown,\n): void {\n if (!evidence) {\n return;\n }\n\n const message = error instanceof Error ? error.message : String(error);\n addEvidenceStep(evidence, \"remediate.error\", { cveId }, undefined, message);\n finalizeEvidence(evidence);\n}\n\nexport function addRemediateResumeStep(evidence: EvidenceLog | undefined, cveId: string): void {\n if (!evidence) {\n return;\n }\n addEvidenceStep(evidence, \"remediate.resume-cache\", { cveId });\n finalizeEvidence(evidence);\n}\n\nexport function writeRemediateEvidence(\n cwd: string,\n evidence: EvidenceLog | undefined,\n): string | undefined {\n return evidence ? writeEvidenceLog(cwd, evidence) : undefined;\n}\n","export const CVE_ID_REGEX = /^CVE-\\d{4}-\\d{1,7}$/i;\nexport const GHSA_ID_REGEX = /^GHSA-[a-z0-9]{4}-[a-z0-9]{4}-[a-z0-9]{4}$/i;\n\nexport function isVulnerabilityId(id: string): boolean {\n return CVE_ID_REGEX.test(id) || GHSA_ID_REGEX.test(id);\n}\n\nexport function assertValidCveId(cveId: string): void {\n if (!isVulnerabilityId(cveId)) {\n throw new Error(\n `Invalid vulnerability ID: \"${cveId}\". Expected format: CVE-YYYY-NNNNN (e.g. CVE-2021-23337) or GHSA-xxxx-xxxx-xxxx.`,\n );\n }\n}\n","import { resolveProvider } from \"../../platform/config.js\";\nimport { readIdempotentReport, storeIdempotentReport } from \"../../platform/idempotency.js\";\nimport type { RemediateOptions, RemediationReport } from \"../../platform/types.js\";\nimport { runRemediationPipeline } from \"../../remediation/pipeline.js\";\nimport { createChangeRequestsForReports } from \"../change-request/index.js\";\nimport {\n resolveConstraints,\n resolveCorrelationContext,\n resolveProvenanceContext,\n} from \"../context.js\";\nimport {\n addRemediateDispositionStep,\n addRemediateErrorStep,\n addRemediateResultSteps,\n addRemediateResumeStep,\n addRemediateStartStep,\n createRemediateEvidence,\n writeRemediateEvidence,\n} from \"../remediate.evidence.js\";\nimport { applySimulationMetadata, assertValidSimulationMode } from \"../reporting.js\";\nimport { assertValidCveId } from \"./validators.js\";\n\nexport async function remediate(\n cveId: string,\n options: RemediateOptions = {},\n): Promise<RemediationReport> {\n assertValidCveId(cveId);\n assertValidSimulationMode(options);\n\n const normalizedCveId = cveId.toUpperCase();\n const cwd = options.cwd ?? process.cwd();\n const constraints = resolveConstraints(options, cwd);\n const provenance = resolveProvenanceContext(options);\n const correlation = resolveCorrelationContext(options);\n const llmProvider = resolveProvider(options);\n const evidence = createRemediateEvidence({\n cwd,\n cveId: normalizedCveId,\n options,\n llmProvider,\n correlation,\n provenance,\n });\n\n if (options.resume && options.idempotencyKey) {\n const cached = readIdempotentReport(cwd, options.idempotencyKey, normalizedCveId);\n if (cached) {\n addRemediateResumeStep(evidence, normalizedCveId);\n const evidenceFile = writeRemediateEvidence(cwd, evidence);\n return {\n ...cached,\n summary: `${cached.summary} (resumed from idempotency cache)`,\n evidenceFile,\n correlation,\n provenance,\n constraints,\n resumedFromCache: true,\n };\n }\n }\n\n addRemediateStartStep({\n evidence,\n cveId: normalizedCveId,\n options,\n llmProvider,\n constraints,\n });\n\n let report: RemediationReport;\n try {\n report = await runRemediationPipeline(normalizedCveId, {\n ...options,\n ...correlation,\n constraints,\n });\n } catch (error) {\n addRemediateErrorStep(evidence, normalizedCveId, error);\n writeRemediateEvidence(cwd, evidence);\n throw error;\n }\n\n report = applySimulationMetadata(report, options);\n\n addRemediateResultSteps(evidence, normalizedCveId, report);\n addRemediateDispositionStep(evidence, normalizedCveId, report);\n\n const evidenceFile = writeRemediateEvidence(cwd, evidence);\n\n const finalReport: RemediationReport = {\n ...report,\n evidenceFile,\n correlation,\n provenance,\n constraints,\n resumedFromCache: false,\n };\n\n if (options.changeRequest?.enabled) {\n finalReport.changeRequests = await createChangeRequestsForReports({\n cwd,\n options: options.changeRequest,\n reports: [finalReport],\n });\n }\n\n if (options.idempotencyKey && !options.dryRun && !options.preview) {\n storeIdempotentReport(cwd, options.idempotencyKey, normalizedCveId, finalReport);\n }\n\n return finalReport;\n}\n\nexport async function planRemediation(\n cveId: string,\n options: RemediateOptions = {},\n): Promise<RemediationReport> {\n if (Object.hasOwn(options, \"dryRun\") || Object.hasOwn(options, \"preview\")) {\n throw new Error(\n \"planRemediation always runs with dryRun=true and preview=true. Remove dryRun/preview from options.\",\n );\n }\n\n return remediate(cveId, {\n ...options,\n preview: true,\n dryRun: true,\n });\n}\n","import { extname, resolve } from \"node:path\";\nimport { readFileSync } from \"node:fs\";\nimport { execa } from \"execa\";\nimport { parseNpmAuditJsonFile, type NormalizedFinding } from \"./adapters/npm-audit.js\";\nimport { parseNpmAuditJsonFromString } from \"./adapters/npm-audit.js\";\nimport { parseYarnAuditJsonFile } from \"./adapters/yarn-audit.js\";\nimport { parseYarnAuditJsonFromString } from \"./adapters/yarn-audit.js\";\nimport { parseSarifFile } from \"./adapters/sarif.js\";\nimport type { ScanInputFormat } from \"./index.js\";\nimport {\n detectPackageManager,\n resolveAuditCommand,\n type PackageManager,\n} from \"../platform/package-manager/index.js\";\n\nexport function parseScanInput(filePath: string, format: ScanInputFormat): NormalizedFinding[] {\n // Reject null bytes to prevent path injection attacks\n if (filePath.includes(\"\\0\")) {\n throw new Error(\"Invalid scan input path: path contains null bytes\");\n }\n const resolvedPath = resolve(filePath);\n const resolved = format === \"auto\" ? inferFormat(resolvedPath) : format;\n\n if (resolved === \"npm-audit\") {\n return parseNpmAuditJsonFile(resolvedPath);\n }\n if (resolved === \"yarn-audit\") {\n return parseYarnAuditJsonFile(resolvedPath);\n }\n if (resolved === \"sarif\") {\n return parseSarifFile(resolvedPath);\n }\n\n throw new Error(`Unsupported input format: ${String(resolved)}`);\n}\n\nexport async function parseScanInputFromAudit(params: {\n cwd: string;\n packageManager?: PackageManager;\n format: ScanInputFormat;\n workspace?: string;\n}): Promise<NormalizedFinding[]> {\n const pm = params.packageManager ?? detectPackageManager(params.cwd);\n const resolved = params.format === \"auto\" ? defaultAuditFormat(pm) : params.format;\n\n ensureAuditFormatCompatibility(pm, resolved);\n\n if (resolved === \"sarif\") {\n throw new Error(\"SARIF format is not supported with --audit mode.\");\n }\n\n const command = resolveAuditCommand(pm, { workspace: params.workspace });\n const [cmd, ...args] = command;\n\n const result = await execa(cmd, args, {\n cwd: params.cwd,\n stdio: \"pipe\",\n reject: false,\n });\n\n const output = [result.stdout, result.stderr].filter(Boolean).join(\"\\n\");\n if (!output.trim()) {\n throw new Error(`No audit output received from ${command.join(\" \")}.`);\n }\n\n try {\n const findings =\n resolved === \"yarn-audit\"\n ? parseYarnAuditJsonFromString(output)\n : parseNpmAuditJsonFromString(output);\n\n if ((result.exitCode ?? 0) !== 0 && findings.length === 0) {\n throw new Error(\"audit command returned non-zero exit without parseable findings\");\n }\n\n return findings;\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n const exit = (result.exitCode ?? 0) !== 0 ? ` (exit code ${result.exitCode})` : \"\";\n throw new Error(\n `Failed to parse output from ${command.join(\" \")}${exit} as ${resolved}: ${message}`,\n );\n }\n}\n\nfunction defaultAuditFormat(pm: PackageManager): Exclude<ScanInputFormat, \"auto\" | \"sarif\"> {\n if (pm === \"yarn\") return \"yarn-audit\";\n if (pm === \"deno\") {\n throw new Error(\n \"Deno does not support a native audit command. Use --input with a SARIF or npm-audit scan file instead.\",\n );\n }\n return \"npm-audit\";\n}\n\nfunction ensureAuditFormatCompatibility(\n pm: PackageManager,\n resolved: Exclude<ScanInputFormat, \"auto\">,\n): void {\n if (resolved === \"sarif\") return;\n\n if (pm === \"deno\") {\n throw new Error(\n \"Deno does not support a native audit command. Use --input with a SARIF or npm-audit scan file instead.\",\n );\n }\n\n if (pm === \"yarn\" && resolved !== \"yarn-audit\") {\n throw new Error(\n 'Format \"npm-audit\" is not supported with package manager \"yarn\" in --audit mode. Use --format yarn-audit or --format auto.',\n );\n }\n\n if (pm !== \"yarn\" && resolved !== \"npm-audit\") {\n throw new Error(\n `Format \"${resolved}\" is not supported with package manager \"${pm}\" in --audit mode. Use --format npm-audit or --format auto.`,\n );\n }\n}\n\nfunction inferFormat(filePath: string): Exclude<ScanInputFormat, \"auto\"> {\n const ext = extname(filePath).toLowerCase();\n if (ext === \".sarif\") return \"sarif\";\n\n try {\n const content = readFileSync(filePath, \"utf8\");\n const firstLine = content.split(\"\\n\").find((line) => line.trim().startsWith(\"{\"));\n if (firstLine) {\n const parsed = JSON.parse(firstLine) as { type?: string };\n if (parsed.type === \"auditAdvisory\" || parsed.type === \"auditSummary\") {\n return \"yarn-audit\";\n }\n }\n } catch {\n // Ignore parse failures and fall back to npm-audit.\n }\n\n return \"npm-audit\";\n}\n","import { readFileSync } from \"node:fs\";\nimport type { CveSeverity } from \"../../platform/types.js\";\n\nexport interface NormalizedFinding {\n cveId: string;\n source: \"npm-audit\" | \"yarn-audit\" | \"sarif\";\n packageName?: string;\n severity?: CveSeverity;\n}\n\ninterface NpmAuditVulnerability {\n name: string;\n via: Array<\n | string\n | {\n source?: number;\n name?: string;\n url?: string;\n severity?: string;\n cwe?: string[];\n cvss?: { score?: number };\n }\n >;\n severity?: string;\n}\n\ninterface NpmAuditReport {\n vulnerabilities?: Record<string, NpmAuditVulnerability>;\n}\n\nconst CVE_REGEX = /CVE-\\d{4}-\\d{1,7}/gi;\nconst GHSA_REGEX = /GHSA-[a-z0-9]{4}-[a-z0-9]{4}-[a-z0-9]{4}/gi;\n\nfunction normalizeSeverity(raw?: string): NormalizedFinding[\"severity\"] {\n if (!raw) return \"UNKNOWN\";\n const up = raw.toUpperCase();\n if (up === \"CRITICAL\" || up === \"HIGH\" || up === \"LOW\") return up;\n if (up === \"MEDIUM\" || up === \"MODERATE\") return \"MEDIUM\";\n return \"UNKNOWN\";\n}\n\nexport function parseNpmAuditJsonFromString(content: string): NormalizedFinding[] {\n const report = JSON.parse(content) as NpmAuditReport;\n const findings: NormalizedFinding[] = [];\n const seen = new Set<string>();\n\n for (const vuln of Object.values(report.vulnerabilities ?? {})) {\n for (const viaEntry of vuln.via ?? []) {\n const text =\n typeof viaEntry === \"string\" ? viaEntry : `${viaEntry.url ?? \"\"} ${viaEntry.name ?? \"\"}`;\n const cveMatches = text.match(CVE_REGEX) ?? [];\n const matches = cveMatches.length > 0 ? cveMatches : (text.match(GHSA_REGEX) ?? []);\n for (const match of matches) {\n const cveId = match.toUpperCase();\n const key = `${cveId}:${vuln.name}`;\n if (seen.has(key)) continue;\n seen.add(key);\n findings.push({\n cveId,\n source: \"npm-audit\",\n packageName: vuln.name,\n severity: normalizeSeverity(vuln.severity),\n });\n }\n }\n }\n\n return findings;\n}\n\nexport function parseNpmAuditJsonFile(filePath: string): NormalizedFinding[] {\n const content = readFileSync(filePath, \"utf8\");\n return parseNpmAuditJsonFromString(content);\n}\n","import { readFileSync } from \"node:fs\";\nimport type { NormalizedFinding } from \"./npm-audit.js\";\n\nconst CVE_REGEX = /CVE-\\d{4}-\\d{1,7}/gi;\nconst GHSA_REGEX = /GHSA-[a-z0-9]{4}-[a-z0-9]{4}-[a-z0-9]{4}/gi;\n\nfunction normalizeSeverity(raw?: string): NormalizedFinding[\"severity\"] {\n if (!raw) return \"UNKNOWN\";\n const up = raw.toUpperCase();\n if (up === \"CRITICAL\" || up === \"HIGH\" || up === \"LOW\") return up;\n if (up === \"MEDIUM\" || up === \"MODERATE\") return \"MEDIUM\";\n return \"UNKNOWN\";\n}\n\nexport function parseYarnAuditJsonFromString(content: string): NormalizedFinding[] {\n const findings: NormalizedFinding[] = [];\n const seen = new Set<string>();\n\n const lines = content\n .split(\"\\n\")\n .map((line) => line.trim())\n .filter(Boolean);\n\n for (const line of lines) {\n let parsed: unknown;\n try {\n parsed = JSON.parse(line);\n } catch {\n continue;\n }\n\n const event = parsed as {\n type?: string;\n data?: {\n advisory?: {\n module_name?: string;\n severity?: string;\n url?: string;\n cves?: string[];\n };\n };\n };\n\n if (event.type !== \"auditAdvisory\") continue;\n\n const advisory = event.data?.advisory;\n const packageName = advisory?.module_name;\n const severity = normalizeSeverity(advisory?.severity);\n\n const text = `${advisory?.url ?? \"\"} ${(advisory?.cves ?? []).join(\" \")}`;\n const cveMatches = text.match(CVE_REGEX) ?? [];\n const matches = cveMatches.length > 0 ? cveMatches : (text.match(GHSA_REGEX) ?? []);\n\n for (const match of matches) {\n const cveId = match.toUpperCase();\n const key = `${cveId}:${packageName ?? \"\"}`;\n if (seen.has(key)) continue;\n seen.add(key);\n\n findings.push({\n cveId,\n source: \"yarn-audit\",\n packageName,\n severity,\n });\n }\n }\n\n return findings;\n}\n\nexport function parseYarnAuditJsonFile(filePath: string): NormalizedFinding[] {\n const content = readFileSync(filePath, \"utf8\");\n return parseYarnAuditJsonFromString(content);\n}\n","import { readFileSync } from \"node:fs\";\nimport type { NormalizedFinding } from \"./npm-audit.js\";\n\ninterface SarifResult {\n ruleId?: string;\n message?: { text?: string };\n properties?: Record<string, unknown>;\n}\n\ninterface SarifRun {\n results?: SarifResult[];\n}\n\ninterface SarifReport {\n runs?: SarifRun[];\n}\n\nconst CVE_REGEX = /CVE-\\d{4}-\\d{1,7}/gi;\n\nfunction extractPackageName(result: SarifResult): string | undefined {\n const pkg = result.properties?.[\"packageName\"];\n return typeof pkg === \"string\" ? pkg : undefined;\n}\n\nexport function parseSarifFromString(content: string): NormalizedFinding[] {\n const report = JSON.parse(content) as SarifReport;\n const findings: NormalizedFinding[] = [];\n const seen = new Set<string>();\n\n const MAX_RUNS = 100;\n const MAX_TOTAL_RESULTS = 10_000;\n let totalResults = 0;\n\n for (const run of (report.runs ?? []).slice(0, MAX_RUNS)) {\n for (const result of run.results ?? []) {\n if (totalResults++ >= MAX_TOTAL_RESULTS) break;\n const ruleId = (result.ruleId ?? \"\").slice(0, 1024);\n const messageText = (result.message?.text ?? \"\").slice(0, 4096);\n const combined = `${ruleId} ${messageText}`;\n const matches = combined.match(CVE_REGEX) ?? [];\n for (const match of matches) {\n const cveId = match.toUpperCase();\n const pkg = extractPackageName(result);\n const key = `${cveId}:${pkg ?? \"\"}`;\n if (seen.has(key)) continue;\n seen.add(key);\n findings.push({\n cveId,\n source: \"sarif\",\n packageName: pkg,\n severity: \"UNKNOWN\",\n });\n }\n }\n }\n\n return findings;\n}\n\nexport function parseSarifFile(filePath: string): NormalizedFinding[] {\n const content = readFileSync(filePath, \"utf8\");\n return parseSarifFromString(content);\n}\n","import type { NormalizedFinding } from \"./adapters/npm-audit.js\";\n\nexport function uniqueCveIds(findings: NormalizedFinding[]): string[] {\n return [...new Set(findings.map((f) => f.cveId.toUpperCase()))];\n}\n","import type { RemediationReport } from \"../platform/types.js\";\nimport type { ProvenanceContext } from \"../platform/types.js\";\nimport { addEvidenceStep } from \"../platform/evidence.js\";\nimport type { EvidenceLog } from \"../platform/evidence.js\";\nimport { isPackageAllowed } from \"../platform/policy.js\";\nimport type { AutoremediatorPolicy } from \"../platform/policy.js\";\nimport type { ScanOptions } from \"./contracts.js\";\nimport { remediate } from \"./remediate/index.js\";\n\nexport interface ScanExecutionResult {\n reports: RemediationReport[];\n errors: Array<{ cveId: string; message: string }>;\n patchCount: number;\n patchValidationFailures: Array<{\n packageName: string;\n cveId: string;\n error: string;\n }>;\n}\n\nexport async function executeScanRemediations(params: {\n cveIds: string[];\n options: ScanOptions;\n patchesDir: string;\n policy: AutoremediatorPolicy;\n correlation: { requestId: string; sessionId?: string; parentRunId?: string };\n provenance: ProvenanceContext;\n constraints: { directDependenciesOnly?: boolean; preferVersionBump?: boolean };\n evidence: EvidenceLog;\n}): Promise<ScanExecutionResult> {\n const reports: RemediationReport[] = [];\n const errors: Array<{ cveId: string; message: string }> = [];\n const patchValidationFailures: Array<{\n packageName: string;\n cveId: string;\n error: string;\n }> = [];\n let patchCount = 0;\n\n for (const cveId of params.cveIds) {\n try {\n addEvidenceStep(params.evidence, \"remediate.start\", { cveId });\n const report = await remediate(cveId, {\n ...params.options,\n patchesDir: params.patchesDir,\n evidence: false,\n ...params.correlation,\n actor: params.provenance.actor,\n source: params.provenance.source,\n constraints: params.constraints,\n });\n\n report.results = report.results.filter((result) =>\n isPackageAllowed(params.policy, result.packageName),\n );\n\n for (const result of report.results) {\n if (result.strategy === \"patch-file\") {\n patchCount += 1;\n }\n if (result.validation?.passed === false && result.validation?.error) {\n patchValidationFailures.push({\n packageName: result.packageName,\n cveId,\n error: result.validation.error,\n });\n }\n }\n\n reports.push(report);\n addEvidenceStep(\n params.evidence,\n \"remediate.finish\",\n { cveId },\n { results: report.results.length },\n );\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n errors.push({ cveId, message });\n addEvidenceStep(params.evidence, \"remediate.error\", { cveId }, undefined, message);\n }\n }\n\n return {\n reports,\n errors,\n patchCount,\n patchValidationFailures,\n };\n}\n","import type { RemediationReport } from \"../platform/types.js\";\nimport type { ScanReport } from \"./contracts.js\";\nimport {\n buildDependencyScopeCounts,\n buildDispositionCounts,\n buildSimulationSummary,\n buildStrategyCounts,\n buildUnresolvedReasonCounts,\n} from \"./reporting.js\";\n\nexport interface ScanOutcome {\n status: ScanReport[\"status\"];\n successCount: number;\n failedCount: number;\n strategyCounts: ReturnType<typeof buildStrategyCounts>;\n dependencyScopeCounts: ReturnType<typeof buildDependencyScopeCounts>;\n unresolvedByReason: ReturnType<typeof buildUnresolvedReasonCounts>;\n dispositionCounts: ReturnType<typeof buildDispositionCounts>;\n simulationSummary: ReturnType<typeof buildSimulationSummary>;\n remediationCount: number;\n}\n\nexport function buildScanOutcome(params: {\n reports: RemediationReport[];\n errors: Array<{ cveId: string; message: string }>;\n}): ScanOutcome {\n let successCount = 0;\n let failedCount = 0;\n for (const report of params.reports) {\n for (const result of report.results) {\n if (result.applied || result.dryRun) {\n successCount += 1;\n } else {\n failedCount += 1;\n }\n }\n }\n\n failedCount += params.errors.length;\n\n let status: ScanReport[\"status\"] = \"ok\";\n if (failedCount > 0 && successCount > 0) {\n status = \"partial\";\n } else if (failedCount > 0 && successCount === 0) {\n status = \"failed\";\n }\n\n const strategyCounts = buildStrategyCounts(params.reports);\n const dependencyScopeCounts = buildDependencyScopeCounts(params.reports);\n const unresolvedByReason = buildUnresolvedReasonCounts(params.reports);\n const dispositionCounts = buildDispositionCounts(params.reports);\n const simulationSummary = buildSimulationSummary(params.reports);\n const remediationCount = params.reports.reduce((sum, report) => sum + report.results.length, 0);\n\n return {\n status,\n successCount,\n failedCount,\n strategyCounts,\n dependencyScopeCounts,\n unresolvedByReason,\n dispositionCounts,\n simulationSummary,\n remediationCount,\n };\n}\n","import type { RemediationReport } from \"../../platform/types.js\";\n\nexport interface ScanLlmUsageTotals {\n llmUsageCount: number;\n estimatedCostUsd?: number;\n totalLlmLatencyMs?: number;\n}\n\nexport function aggregateScanLlmUsage(reports: RemediationReport[]): ScanLlmUsageTotals {\n let llmUsageCount = 0;\n let estimatedCostUsd = 0;\n let totalLlmLatencyMs = 0;\n\n for (const report of reports) {\n for (const usage of report.llmUsage ?? []) {\n llmUsageCount += 1;\n estimatedCostUsd += usage.estimatedCostUsd ?? 0;\n totalLlmLatencyMs += usage.latencyMs ?? 0;\n }\n }\n\n return {\n llmUsageCount,\n estimatedCostUsd: llmUsageCount > 0 ? Number(estimatedCostUsd.toFixed(6)) : undefined,\n totalLlmLatencyMs: llmUsageCount > 0 ? totalLlmLatencyMs : undefined,\n };\n}\n","import type { RemediationReport } from \"../../platform/types.js\";\nimport { resolveProvider } from \"../../platform/config.js\";\nimport {\n addEvidenceStep,\n createEvidenceLog,\n finalizeEvidence,\n writeEvidenceLog,\n} from \"../../platform/evidence.js\";\nimport { loadPolicy } from \"../../platform/policy.js\";\nimport { parseScanInput, parseScanInputFromAudit, uniqueCveIds } from \"../../scanner/index.js\";\nimport type { ScanOptions, ScanReport } from \"../contracts.js\";\nimport { createChangeRequestsForReports } from \"../change-request/index.js\";\nimport {\n resolveConstraints,\n resolveCorrelationContext,\n resolveProvenanceContext,\n} from \"../context.js\";\nimport { executeScanRemediations } from \"../scan-execution.js\";\nimport { buildScanOutcome } from \"../scan-outcome.js\";\nimport { aggregateScanLlmUsage } from \"./report-metrics.js\";\nimport {\n assertValidSimulationMode,\n buildEscalationCounts,\n buildSlaBreachSummary,\n} from \"../reporting.js\";\n\nfunction countContainedResults(reports: RemediationReport[]): number {\n let containmentCount = 0;\n for (const report of reports) {\n for (const result of report.results) {\n if (result.unresolvedReason === \"policy-blocked\" && result.disposition === \"escalate\") {\n containmentCount += 1;\n }\n }\n }\n return containmentCount;\n}\n\nexport async function remediateFromScan(\n inputPath: string,\n options: ScanOptions = {},\n): Promise<ScanReport> {\n assertValidSimulationMode(options);\n const cwd = options.cwd ?? process.cwd();\n\n const policy = loadPolicy(cwd, options.policy);\n const format = options.format ?? \"auto\";\n const patchesDir = options.patchesDir ?? \"./patches\";\n const audit = options.audit ?? false;\n const workspace = options.constraints?.workspace ?? policy.constraints?.workspace;\n\n const findings = audit\n ? await parseScanInputFromAudit({\n cwd,\n packageManager: options.packageManager,\n format,\n workspace,\n })\n : parseScanInput(inputPath, format);\n const cveIds = uniqueCveIds(findings);\n const llmProvider = resolveProvider(options);\n const correlation = resolveCorrelationContext(options);\n const provenance = resolveProvenanceContext(options);\n const constraints = resolveConstraints(options, cwd);\n\n const evidence = createEvidenceLog(cwd, cveIds, {\n ...correlation,\n actor: provenance.actor,\n source: provenance.source,\n llmProvider,\n idempotencyKey: options.idempotencyKey,\n });\n addEvidenceStep(\n evidence,\n \"scan.parse\",\n { inputPath, format, audit },\n { findingCount: findings.length, cveCount: cveIds.length },\n );\n\n const execution = await executeScanRemediations({\n cveIds,\n options,\n patchesDir,\n policy,\n correlation,\n provenance,\n constraints,\n evidence,\n });\n const reports: RemediationReport[] = execution.reports;\n const { errors, patchCount, patchValidationFailures } = execution;\n const containmentCount = countContainedResults(reports);\n const escalationCounts = buildEscalationCounts(reports.flatMap((report) => report.results));\n\n const llmUsageTotals = aggregateScanLlmUsage(reports);\n const outcome = buildScanOutcome({ reports, errors });\n const {\n status,\n successCount,\n failedCount,\n strategyCounts,\n dependencyScopeCounts,\n unresolvedByReason,\n dispositionCounts,\n simulationSummary,\n remediationCount,\n } = outcome;\n\n evidence.summary = {\n status,\n cveCount: cveIds.length,\n remediationCount,\n successCount,\n failedCount,\n patchCount,\n patchValidationFailures:\n patchValidationFailures.length > 0 ? patchValidationFailures : undefined,\n strategyCounts,\n dependencyScopeCounts,\n unresolvedByReason,\n dispositionCounts,\n escalationCounts,\n containmentCount,\n simulationSummary,\n slaBreachSummary: buildSlaBreachSummary(reports),\n patchesDir: patchCount > 0 ? patchesDir : undefined,\n llmUsageCount: llmUsageTotals.llmUsageCount > 0 ? llmUsageTotals.llmUsageCount : undefined,\n estimatedCostUsd: llmUsageTotals.estimatedCostUsd,\n totalLlmLatencyMs: llmUsageTotals.totalLlmLatencyMs,\n };\n\n finalizeEvidence(evidence);\n const evidenceFile = options.evidence === false ? undefined : writeEvidenceLog(cwd, evidence);\n\n const changeRequests = options.changeRequest?.enabled\n ? await createChangeRequestsForReports({\n cwd,\n options: options.changeRequest,\n reports,\n })\n : undefined;\n\n return {\n schemaVersion: \"1.0\",\n status,\n generatedAt: new Date().toISOString(),\n cveIds,\n reports,\n successCount,\n failedCount,\n errors,\n evidenceFile,\n patchCount,\n patchValidationFailures:\n patchValidationFailures.length > 0 ? patchValidationFailures : undefined,\n strategyCounts,\n dependencyScopeCounts,\n unresolvedByReason,\n dispositionCounts,\n escalationCounts,\n patchesDir: patchCount > 0 ? patchesDir : undefined,\n correlation,\n provenance,\n constraints,\n idempotencyKey: options.idempotencyKey,\n llmUsageCount: llmUsageTotals.llmUsageCount > 0 ? llmUsageTotals.llmUsageCount : undefined,\n estimatedCostUsd: llmUsageTotals.estimatedCostUsd,\n totalLlmLatencyMs: llmUsageTotals.totalLlmLatencyMs,\n changeRequests,\n simulationSummary,\n slaBreachSummary: buildSlaBreachSummary(reports),\n };\n}\n","import type { PortfolioTarget } from \"../../platform/types.js\";\n\nconst SEVERITY_WEIGHT: Record<string, number> = {\n CRITICAL: 40,\n HIGH: 30,\n MEDIUM: 10,\n LOW: 5,\n UNKNOWN: 0,\n};\n\nexport function scorePortfolioTarget(target: PortfolioTarget): number {\n const severity = target.riskHint?.severity;\n const severityWeight = severity ? (SEVERITY_WEIGHT[severity] ?? 0) : 0;\n const exploitSignalBonus = target.riskHint?.exploitSignal === true ? 25 : 0;\n const slaBreachBonus = target.riskHint?.slaBreached === true ? 20 : 0;\n\n return severityWeight + exploitSignalBonus + slaBreachBonus;\n}\n\nexport function rankPortfolioTargets(\n targets: PortfolioTarget[],\n): Array<{ target: PortfolioTarget; rank: number }> {\n const scoredTargets = targets.map((target, index) => ({\n target,\n index,\n score: scorePortfolioTarget(target),\n }));\n\n scoredTargets.sort((left, right) => {\n if (right.score !== left.score) {\n return right.score - left.score;\n }\n return left.index - right.index;\n });\n\n return scoredTargets.map((entry, index) => ({\n target: entry.target,\n rank: index + 1,\n }));\n}\n","import type {\n PortfolioReport,\n PortfolioTarget,\n PortfolioTargetResult,\n RemediateOptions,\n RemediationReport,\n} from \"../../platform/types.js\";\nimport type { ScanReport } from \"../contracts.js\";\nimport { remediate } from \"../remediate/index.js\";\nimport { remediateFromScan } from \"../remediate-from-scan/index.js\";\nimport { assertValidSimulationMode, buildSlaBreachSummary } from \"../reporting.js\";\nimport { rankPortfolioTargets } from \"./risk-score.js\";\n\nfunction toTargetStatusFromRemediation(report: RemediationReport): \"ok\" | \"partial\" | \"failed\" {\n const failed = report.results.some((result) => !result.applied && !result.dryRun);\n const succeeded = report.results.some((result) => result.applied || result.dryRun);\n if (!failed) return \"ok\";\n return succeeded ? \"partial\" : \"failed\";\n}\n\nfunction normalizeTargetInput(target: PortfolioTarget): {\n cveId?: string;\n inputPath?: string;\n audit: boolean;\n} {\n return {\n cveId: target.cveId?.trim() || undefined,\n inputPath: target.inputPath?.trim() || undefined,\n audit: target.audit ?? false,\n };\n}\n\nfunction validateTarget(target: PortfolioTarget, index: number): void {\n if (!target.cwd || typeof target.cwd !== \"string\") {\n throw new Error(`Invalid portfolio target at index ${index}: cwd is required.`);\n }\n\n const { cveId, inputPath, audit } = normalizeTargetInput(target);\n const hasScanInput = Boolean(inputPath) || audit;\n\n if (Boolean(cveId) === hasScanInput) {\n throw new Error(\n `Invalid portfolio target at index ${index}: provide exactly one mode (cveId OR inputPath/audit).`,\n );\n }\n}\n\nexport async function remediatePortfolio(\n targets: PortfolioTarget[],\n options: RemediateOptions = {},\n): Promise<PortfolioReport> {\n assertValidSimulationMode(options);\n const normalizedTargets = Array.isArray(targets) ? targets : [];\n\n if (normalizedTargets.length === 0) {\n throw new Error(\"Portfolio requires at least one target.\");\n }\n\n normalizedTargets.forEach((target, index) => validateTarget(target, index));\n\n const executionTargets =\n options.campaignMode === true\n ? rankPortfolioTargets(normalizedTargets)\n : normalizedTargets.map((target) => ({ target, rank: undefined }));\n\n const results: PortfolioTargetResult[] = [];\n const changeRequests = [] as NonNullable<PortfolioReport[\"changeRequests\"]>;\n let successCount = 0;\n let failedCount = 0;\n\n for (const executionTarget of executionTargets) {\n const target = executionTarget.target;\n const threatRank = options.campaignMode === true ? executionTarget.rank : undefined;\n const { cveId, inputPath, audit } = normalizeTargetInput(target);\n\n try {\n if (cveId) {\n const remediationReport = await remediate(cveId, {\n ...options,\n cwd: target.cwd,\n source: options.source,\n });\n\n const status = toTargetStatusFromRemediation(remediationReport);\n results.push({\n target,\n status,\n ...(threatRank !== undefined ? { threatRank } : {}),\n remediationReport,\n changeRequests: remediationReport.changeRequests,\n });\n\n if (remediationReport.changeRequests?.length) {\n changeRequests.push(...remediationReport.changeRequests);\n }\n\n if (status === \"failed\") {\n failedCount += 1;\n } else {\n successCount += 1;\n }\n continue;\n }\n\n const scanReport = await remediateFromScan(inputPath ?? \"\", {\n ...options,\n cwd: target.cwd,\n audit,\n format: target.format,\n source: options.source,\n });\n\n results.push({\n target,\n status: scanReport.status,\n ...(threatRank !== undefined ? { threatRank } : {}),\n scanReport,\n changeRequests: scanReport.changeRequests,\n });\n\n if (scanReport.changeRequests?.length) {\n changeRequests.push(...scanReport.changeRequests);\n }\n\n if (scanReport.status === \"failed\") {\n failedCount += 1;\n } else {\n successCount += 1;\n }\n } catch (error) {\n results.push({\n target,\n status: \"failed\",\n ...(threatRank !== undefined ? { threatRank } : {}),\n error: error instanceof Error ? error.message : String(error),\n });\n failedCount += 1;\n }\n }\n\n const overallStatus = failedCount === 0 ? \"ok\" : successCount > 0 ? \"partial\" : \"failed\";\n\n const allRemediationReports: RemediationReport[] = results.flatMap((r) => {\n if (r.remediationReport) return [r.remediationReport];\n const scan = r.scanReport as ScanReport | undefined;\n return scan?.reports ?? [];\n });\n\n return {\n schemaVersion: \"1.0\",\n status: overallStatus,\n generatedAt: new Date().toISOString(),\n targets: results,\n successCount,\n failedCount,\n changeRequests: changeRequests.length > 0 ? changeRequests : undefined,\n slaBreachSummary: buildSlaBreachSummary(allRemediationReports),\n };\n}\n","import { join } from \"node:path\";\nimport { readFileSync, writeFileSync } from \"node:fs\";\nimport { execa } from \"execa\";\nimport {\n addEvidenceStep,\n createEvidenceLog,\n finalizeEvidence,\n writeEvidenceLog,\n} from \"../../platform/evidence.js\";\nimport { loadPolicy } from \"../../platform/policy.js\";\nimport { withRepoLock } from \"../../platform/repo-lock.js\";\nimport {\n detectPackageManager,\n getYarnMajorVersion,\n resolveInstallCommand,\n resolveTestCommand,\n type PackageManager,\n} from \"../../platform/package-manager/index.js\";\nimport type {\n OutdatedPackage,\n UpdateOutdatedOptions,\n UpdateOutdatedReport,\n} from \"../../platform/types.js\";\nimport {\n resolveConstraints,\n resolveCorrelationContext,\n resolveProvenanceContext,\n} from \"../context.js\";\nimport { queryOutdatedPackages } from \"../../intelligence/sources/registry.js\";\nimport { createChangeRequestsForReports } from \"../change-request/index.js\";\n\n// ---------------------------------------------------------------------------\n// Internal types\n// ---------------------------------------------------------------------------\n\ninterface RawPackageJson {\n dependencies?: Record<string, string>;\n devDependencies?: Record<string, string>;\n peerDependencies?: Record<string, string>;\n [key: string]: unknown;\n}\n\ntype DepField = \"dependencies\" | \"devDependencies\" | \"peerDependencies\";\n\ninterface BumpResult {\n applied: boolean;\n message: string;\n}\n\n// ---------------------------------------------------------------------------\n// Internal helpers\n// ---------------------------------------------------------------------------\n\nasync function applyBump(params: {\n cwd: string;\n packageName: string;\n fromVersion: string;\n toVersion: string;\n pm: PackageManager;\n installCommand: string[];\n testCommand: string[];\n runTests: boolean;\n}): Promise<BumpResult> {\n const pkgPath = join(params.cwd, \"package.json\");\n\n let pkgJson: RawPackageJson;\n try {\n pkgJson = JSON.parse(readFileSync(pkgPath, \"utf8\")) as RawPackageJson;\n } catch {\n return {\n applied: false,\n message: `Could not read package.json at \"${pkgPath}\".`,\n };\n }\n\n const depField = ([\"dependencies\", \"devDependencies\", \"peerDependencies\"] as DepField[]).find(\n (f) => pkgJson[f]?.[params.packageName] !== undefined,\n );\n\n if (!depField) {\n return {\n applied: false,\n message: `\"${params.packageName}\" was not found in package.json dependencies.`,\n };\n }\n\n const currentRange = pkgJson[depField]![params.packageName]!;\n const prefixMatch = currentRange.match(/^([~^]?)/);\n const prefix = prefixMatch?.[1] ?? \"\";\n const newRange = `${prefix}${params.toVersion}`;\n\n return withRepoLock(params.cwd, async () => {\n pkgJson[depField]![params.packageName] = newRange;\n writeFileSync(pkgPath, JSON.stringify(pkgJson, null, 2) + \"\\n\", \"utf8\");\n\n try {\n const [installCmd, ...installArgs] = params.installCommand;\n await execa(installCmd, installArgs, { cwd: params.cwd, stdio: \"pipe\" });\n } catch (err) {\n pkgJson[depField]![params.packageName] = currentRange;\n writeFileSync(pkgPath, JSON.stringify(pkgJson, null, 2) + \"\\n\", \"utf8\");\n const message = err instanceof Error ? err.message : String(err);\n return {\n applied: false,\n message: `${params.installCommand.join(\" \")} failed after updating \"${params.packageName}\" to ${params.toVersion}. Reverted. Error: ${message}`,\n };\n }\n\n if (params.runTests) {\n try {\n const [testCmd, ...testArgs] = params.testCommand;\n await execa(testCmd, testArgs, { cwd: params.cwd, stdio: \"pipe\" });\n } catch (err) {\n pkgJson[depField]![params.packageName] = currentRange;\n writeFileSync(pkgPath, JSON.stringify(pkgJson, null, 2) + \"\\n\", \"utf8\");\n try {\n const [rollbackCmd, ...rollbackArgs] = params.installCommand;\n await execa(rollbackCmd, rollbackArgs, { cwd: params.cwd, stdio: \"pipe\" });\n } catch {\n // Ignore rollback install failure.\n }\n const message = err instanceof Error ? err.message : String(err);\n return {\n applied: false,\n message: `Tests failed after upgrading \"${params.packageName}\" to ${params.toVersion}. Rolled back. Error: ${message}`,\n };\n }\n }\n\n return {\n applied: true,\n message: `Updated ${params.packageName} from ${params.fromVersion} to ${params.toVersion}.`,\n };\n });\n}\n\n// ---------------------------------------------------------------------------\n// Public function\n// ---------------------------------------------------------------------------\n\nexport async function updateOutdated(\n options: UpdateOutdatedOptions = {},\n): Promise<UpdateOutdatedReport> {\n const cwd = options.cwd ?? process.cwd();\n\n // Load policy exactly once\n const policy = loadPolicy(cwd, options.policy);\n const correlation = resolveCorrelationContext(options);\n const provenance = resolveProvenanceContext(options);\n const constraints = resolveConstraints(options, cwd);\n\n const evidence = createEvidenceLog(cwd, [], {\n requestId: correlation.requestId,\n sessionId: correlation.sessionId,\n parentRunId: correlation.parentRunId,\n actor: provenance.actor,\n source: provenance.source,\n });\n\n addEvidenceStep(evidence, \"update-outdated.start\", {\n cwd,\n includeTransitive: options.includeTransitive ?? false,\n dryRun: options.dryRun ?? false,\n });\n\n // Query outdated packages\n let outdatedMap: Awaited<ReturnType<typeof queryOutdatedPackages>>;\n try {\n outdatedMap = await queryOutdatedPackages(cwd, {\n includeTransitive: options.includeTransitive ?? false,\n packageManager: options.packageManager,\n });\n } catch (err) {\n addEvidenceStep(\n evidence,\n \"update-outdated.registry-query-failed\",\n {},\n { error: err instanceof Error ? err.message : String(err) },\n );\n finalizeEvidence(evidence);\n const evidenceFile = options.evidence === false ? undefined : writeEvidenceLog(cwd, evidence);\n\n return {\n schemaVersion: \"1.0\",\n status: \"failed\",\n generatedAt: new Date().toISOString(),\n outdatedPackages: [],\n successCount: 0,\n failedCount: 1,\n skippedCount: 0,\n errors: [{ packageName: \"*\", message: err instanceof Error ? err.message : String(err) }],\n evidenceFile,\n patchCount: 0,\n constraints,\n correlation,\n provenance,\n };\n }\n\n const outdatedPackages: OutdatedPackage[] = Array.from(outdatedMap.entries()).map(\n ([name, info]) => ({\n name,\n currentVersion: info.currentVersion,\n wantedVersion: info.wantedVersion,\n latestVersion: info.latestVersion,\n isMajorBump: info.isMajorBump,\n dependencyScope: info.dependencyScope,\n }),\n );\n\n addEvidenceStep(\n evidence,\n \"update-outdated.registry-query\",\n {},\n { packageCount: outdatedPackages.length },\n );\n\n // Resolve install/test commands once (before the loop)\n const pm = (options.packageManager ?? detectPackageManager(cwd)) as PackageManager;\n const yarnMajor = pm === \"yarn\" ? await getYarnMajorVersion(cwd) : undefined;\n const installCommand = resolveInstallCommand(pm, constraints, yarnMajor);\n const testCommand = resolveTestCommand(pm, constraints);\n\n let successCount = 0;\n let failedCount = 0;\n let skippedCount = 0;\n const errors: Array<{ packageName: string; message: string }> = [];\n\n for (const [packageName, info] of outdatedMap) {\n // Skip major bumps when policy disallows them\n if (info.isMajorBump && !policy.allowMajorBumps) {\n skippedCount++;\n addEvidenceStep(\n evidence,\n \"update-outdated.skip\",\n { packageName, reason: \"major-bump-not-allowed\" },\n {},\n );\n continue;\n }\n\n // In dry-run mode, count as success but do not write\n if (options.dryRun) {\n successCount++;\n addEvidenceStep(\n evidence,\n \"update-outdated.dry-run\",\n { packageName, fromVersion: info.currentVersion, toVersion: info.latestVersion },\n {},\n );\n continue;\n }\n\n addEvidenceStep(evidence, \"update-outdated.apply\", {\n packageName,\n fromVersion: info.currentVersion,\n toVersion: info.latestVersion,\n });\n\n const result = await applyBump({\n cwd,\n packageName,\n fromVersion: info.currentVersion,\n toVersion: info.latestVersion,\n pm,\n installCommand,\n testCommand,\n runTests: options.runTests ?? false,\n });\n\n if (result.applied) {\n successCount++;\n addEvidenceStep(\n evidence,\n \"update-outdated.apply.success\",\n { packageName },\n { toVersion: info.latestVersion },\n );\n } else {\n failedCount++;\n errors.push({ packageName, message: result.message });\n addEvidenceStep(\n evidence,\n \"update-outdated.apply.failed\",\n { packageName },\n { error: result.message },\n );\n }\n }\n\n const status: UpdateOutdatedReport[\"status\"] =\n failedCount > 0 && successCount > 0\n ? \"partial\"\n : failedCount > 0 && successCount === 0\n ? \"failed\"\n : \"ok\";\n\n evidence.summary = {\n status,\n cveCount: 0,\n remediationCount: successCount + failedCount + skippedCount,\n successCount,\n failedCount,\n patchCount: 0,\n };\n\n finalizeEvidence(evidence);\n const evidenceFile = options.evidence === false ? undefined : writeEvidenceLog(cwd, evidence);\n\n const changeRequests =\n options.changeRequest?.enabled && successCount > 0\n ? await createChangeRequestsForReports({\n cwd,\n options: options.changeRequest,\n reports: [\n {\n cveId: \"UPDATE-OUTDATED\",\n cveDetails: null,\n vulnerablePackages: [],\n results: outdatedPackages\n .filter((pkg) => !pkg.isMajorBump)\n .map((pkg) => ({\n packageName: pkg.name,\n strategy: \"version-bump\" as const,\n fromVersion: pkg.currentVersion,\n toVersion: pkg.latestVersion,\n applied: true,\n dryRun: Boolean(options.dryRun),\n message: `Updated ${pkg.name} to ${pkg.latestVersion}`,\n })),\n agentSteps: 0,\n summary: \"update-outdated\",\n },\n ],\n })\n : undefined;\n\n return {\n schemaVersion: \"1.0\",\n status,\n generatedAt: new Date().toISOString(),\n outdatedPackages,\n successCount,\n failedCount,\n skippedCount,\n errors,\n evidenceFile,\n patchCount: 0,\n constraints,\n correlation,\n provenance,\n changeRequests,\n };\n}\n","/**\n * Public SDK API: checkReachability\n */\nimport { assessPackageReachability } from \"../../remediation/tools/check-reachability.js\";\nimport type { CheckReachabilityOptions, ReachabilityAssessment } from \"../../platform/types.js\";\n\nexport async function checkReachability(\n options: CheckReachabilityOptions,\n): Promise<ReachabilityAssessment> {\n const cwd = options.cwd ?? process.cwd();\n return assessPackageReachability(cwd, options.packageName, options.symbol);\n}\n","/**\n * Git-aware delta vulnerability scanner\n *\n * Compares dependency manifests between a git base reference (e.g. HEAD, origin/main)\n * and the active working tree or branch to identify newly introduced or resolved CVEs.\n */\nimport { existsSync, readFileSync } from \"node:fs\";\nimport { join } from \"node:path\";\nimport { execa } from \"execa\";\nimport semver from \"semver\";\nimport { evaluatePackage } from \"../remediation/evaluate-package.js\";\nimport type {\n DeltaDependencyChange,\n DeltaFinding,\n DeltaScanOptions,\n DeltaScanReport,\n} from \"../platform/types.js\";\n\nconst DEP_SECTIONS = [\n \"dependencies\",\n \"devDependencies\",\n \"peerDependencies\",\n \"optionalDependencies\",\n] as const;\n\ninterface PackageJsonSubset {\n name?: string;\n dependencies?: Record<string, string>;\n devDependencies?: Record<string, string>;\n peerDependencies?: Record<string, string>;\n optionalDependencies?: Record<string, string>;\n}\n\nasync function getChangedManifestPaths(cwd: string, baseRef: string): Promise<string[]> {\n const manifests = new Set<string>();\n\n try {\n // 1. Files changed between baseRef and working tree/index\n const { stdout: diffFiles } = await execa(\n \"git\",\n [\"diff\", \"--name-only\", baseRef, \"--\", \"package.json\", \"**/package.json\"],\n { cwd, reject: false },\n );\n for (const f of diffFiles.split(\"\\n\")) {\n const trimmed = f.trim();\n if (trimmed && trimmed.endsWith(\"package.json\") && !trimmed.includes(\"node_modules\")) {\n manifests.add(trimmed);\n }\n }\n\n // 2. Untracked new package.json files\n const { stdout: untrackedFiles } = await execa(\n \"git\",\n [\"ls-files\", \"--others\", \"--exclude-standard\", \"--\", \"package.json\", \"**/package.json\"],\n { cwd, reject: false },\n );\n for (const f of untrackedFiles.split(\"\\n\")) {\n const trimmed = f.trim();\n if (trimmed && trimmed.endsWith(\"package.json\") && !trimmed.includes(\"node_modules\")) {\n manifests.add(trimmed);\n }\n }\n } catch {\n // If not a git repository or git command fails, check if local package.json exists\n if (existsSync(join(cwd, \"package.json\"))) {\n manifests.add(\"package.json\");\n }\n }\n\n return Array.from(manifests);\n}\n\nasync function getOldManifestContent(\n cwd: string,\n baseRef: string,\n relPath: string,\n): Promise<PackageJsonSubset | null> {\n try {\n const { stdout } = await execa(\"git\", [\"show\", `${baseRef}:${relPath}`], {\n cwd,\n reject: false,\n });\n if (!stdout || !stdout.trim()) return null;\n return JSON.parse(stdout) as PackageJsonSubset;\n } catch {\n return null;\n }\n}\n\nfunction getNewManifestContent(cwd: string, relPath: string): PackageJsonSubset | null {\n const fullPath = join(cwd, relPath);\n if (!existsSync(fullPath)) return null;\n try {\n return JSON.parse(readFileSync(fullPath, \"utf8\")) as PackageJsonSubset;\n } catch {\n return null;\n }\n}\n\nfunction computeDependencyDiff(\n relPath: string,\n oldPkg: PackageJsonSubset | null,\n newPkg: PackageJsonSubset | null,\n): DeltaDependencyChange[] {\n const changes: DeltaDependencyChange[] = [];\n\n for (const section of DEP_SECTIONS) {\n const oldDeps = oldPkg?.[section] ?? {};\n const newDeps = newPkg?.[section] ?? {};\n\n // Check added or updated dependencies\n for (const [pkgName, newVer] of Object.entries(newDeps)) {\n const oldVer = oldDeps[pkgName];\n if (!oldVer) {\n changes.push({\n packageName: pkgName,\n changeType: \"added\",\n newVersion: newVer,\n dependencyType: section,\n manifestPath: relPath,\n });\n } else if (oldVer !== newVer) {\n const cleanOld = semver.clean(oldVer) || semver.coerce(oldVer)?.version;\n const cleanNew = semver.clean(newVer) || semver.coerce(newVer)?.version;\n const isUpgrade =\n cleanOld && cleanNew && semver.valid(cleanOld) && semver.valid(cleanNew)\n ? semver.gt(cleanNew, cleanOld)\n : true;\n\n changes.push({\n packageName: pkgName,\n changeType: isUpgrade ? \"upgraded\" : \"downgraded\",\n oldVersion: oldVer,\n newVersion: newVer,\n dependencyType: section,\n manifestPath: relPath,\n });\n }\n }\n\n // Check removed dependencies\n for (const [pkgName, oldVer] of Object.entries(oldDeps)) {\n if (!(pkgName in newDeps)) {\n changes.push({\n packageName: pkgName,\n changeType: \"removed\",\n oldVersion: oldVer,\n dependencyType: section,\n manifestPath: relPath,\n });\n }\n }\n }\n\n return changes;\n}\n\nimport { computeLockfileDiff } from \"./lockfile-diff.js\";\n\nconst LOCKFILE_PATTERNS = [\n \"package-lock.json\",\n \"**/package-lock.json\",\n \"pnpm-lock.yaml\",\n \"**/pnpm-lock.yaml\",\n \"yarn.lock\",\n \"**/yarn.lock\",\n];\n\nasync function getChangedLockfilePaths(cwd: string, baseRef: string): Promise<string[]> {\n const lockfiles = new Set<string>();\n try {\n const { stdout: diffFiles } = await execa(\n \"git\",\n [\"diff\", \"--name-only\", baseRef, \"--\", ...LOCKFILE_PATTERNS],\n { cwd, reject: false },\n );\n for (const f of diffFiles.split(\"\\n\")) {\n const trimmed = f.trim();\n if (\n trimmed &&\n !trimmed.includes(\"node_modules\") &&\n (trimmed.endsWith(\"package-lock.json\") ||\n trimmed.endsWith(\"pnpm-lock.yaml\") ||\n trimmed.endsWith(\"yarn.lock\"))\n ) {\n lockfiles.add(trimmed);\n }\n }\n const { stdout: untrackedFiles } = await execa(\n \"git\",\n [\"ls-files\", \"--others\", \"--exclude-standard\", \"--\", ...LOCKFILE_PATTERNS],\n { cwd, reject: false },\n );\n for (const f of untrackedFiles.split(\"\\n\")) {\n const trimmed = f.trim();\n if (\n trimmed &&\n !trimmed.includes(\"node_modules\") &&\n (trimmed.endsWith(\"package-lock.json\") ||\n trimmed.endsWith(\"pnpm-lock.yaml\") ||\n trimmed.endsWith(\"yarn.lock\"))\n ) {\n lockfiles.add(trimmed);\n }\n }\n } catch {\n // Ignore git errors\n }\n return Array.from(lockfiles);\n}\n\nasync function getFileContentAtRef(\n cwd: string,\n baseRef: string,\n relPath: string,\n): Promise<string | null> {\n try {\n const { stdout } = await execa(\"git\", [\"show\", `${baseRef}:${relPath}`], {\n cwd,\n reject: false,\n });\n return stdout || null;\n } catch {\n return null;\n }\n}\n\nexport async function scanDelta(options: DeltaScanOptions = {}): Promise<DeltaScanReport> {\n const cwd = options.cwd ?? process.cwd();\n const baseRef = options.baseRef ?? \"HEAD\";\n\n const changedManifests = await getChangedManifestPaths(cwd, baseRef);\n const changedLockfiles = await getChangedLockfilePaths(cwd, baseRef);\n const dependencyChanges: DeltaDependencyChange[] = [];\n const directPkgs = new Set<string>();\n\n for (const manifestRel of changedManifests) {\n const oldPkg = await getOldManifestContent(cwd, baseRef, manifestRel);\n const newPkg = getNewManifestContent(cwd, manifestRel);\n const diffs = computeDependencyDiff(manifestRel, oldPkg, newPkg);\n for (const d of diffs) {\n directPkgs.add(d.packageName);\n }\n dependencyChanges.push(...diffs);\n }\n\n for (const lockfileRel of changedLockfiles) {\n const oldContent = await getFileContentAtRef(cwd, baseRef, lockfileRel);\n const fullPath = join(cwd, lockfileRel);\n const newContent = existsSync(fullPath) ? readFileSync(fullPath, \"utf8\") : null;\n const lockDiffs = computeLockfileDiff(lockfileRel, oldContent, newContent);\n for (const change of lockDiffs) {\n if (!directPkgs.has(change.packageName)) {\n dependencyChanges.push(change);\n }\n }\n if (!changedManifests.includes(lockfileRel)) {\n changedManifests.push(lockfileRel);\n }\n }\n\n const introducedFindings: DeltaFinding[] = [];\n const resolvedFindings: DeltaFinding[] = [];\n\n // Evaluate newly added or modified dependencies\n for (const change of dependencyChanges) {\n if (\n change.changeType === \"added\" ||\n change.changeType === \"upgraded\" ||\n change.changeType === \"downgraded\"\n ) {\n const cleanVer = semver.coerce(change.newVersion)?.version ?? change.newVersion;\n const evaluation = await evaluatePackage(change.packageName, {\n version: cleanVer,\n enrichIntelligence: true,\n });\n\n for (const vuln of evaluation.vulnerabilities) {\n introducedFindings.push({\n packageName: change.packageName,\n cveId: vuln.cveId,\n severity: vuln.severity,\n summary: vuln.summary,\n deltaType: \"introduced\",\n installedVersion: change.newVersion,\n safeUpgradeVersion: vuln.safeUpgradeVersion,\n inCisaKev: vuln.inCisaKev,\n epssScore: vuln.epssScore,\n });\n }\n }\n\n // Check if the old version had vulnerabilities resolved by this upgrade/removal\n if (\n change.oldVersion &&\n (change.changeType === \"upgraded\" || change.changeType === \"removed\")\n ) {\n const cleanOldVer = semver.coerce(change.oldVersion)?.version ?? change.oldVersion;\n const oldEval = await evaluatePackage(change.packageName, {\n version: cleanOldVer,\n enrichIntelligence: true,\n });\n\n const cleanNewVer = change.newVersion\n ? (semver.coerce(change.newVersion)?.version ?? change.newVersion)\n : undefined;\n const newEval = cleanNewVer\n ? await evaluatePackage(change.packageName, {\n version: cleanNewVer,\n enrichIntelligence: false,\n })\n : { vulnerabilities: [] };\n\n const newCveSet = new Set(newEval.vulnerabilities.map((v) => v.cveId));\n\n for (const oldVuln of oldEval.vulnerabilities) {\n if (!newCveSet.has(oldVuln.cveId)) {\n resolvedFindings.push({\n packageName: change.packageName,\n cveId: oldVuln.cveId,\n severity: oldVuln.severity,\n summary: oldVuln.summary,\n deltaType: \"resolved\",\n installedVersion: change.oldVersion,\n safeUpgradeVersion: oldVuln.safeUpgradeVersion,\n inCisaKev: oldVuln.inCisaKev,\n epssScore: oldVuln.epssScore,\n });\n }\n }\n }\n }\n\n let netRiskVerdict: DeltaScanReport[\"netRiskVerdict\"] = \"neutral\";\n let status: DeltaScanReport[\"status\"] = \"ok\";\n\n if (introducedFindings.length > 0) {\n netRiskVerdict = \"degraded\";\n status = \"degraded\";\n } else if (resolvedFindings.length > 0) {\n netRiskVerdict = \"improved\";\n status = \"improved\";\n }\n\n const summary =\n introducedFindings.length > 0\n ? `Delta scan against ${baseRef} found ${introducedFindings.length} newly introduced vulnerability(ies) across ${dependencyChanges.length} dependency change(s) (net risk: degraded).`\n : resolvedFindings.length > 0\n ? `Delta scan against ${baseRef} resolved ${resolvedFindings.length} vulnerability(ies) across ${dependencyChanges.length} dependency change(s) (net risk: improved).`\n : `Delta scan against ${baseRef} found 0 new vulnerabilities across ${dependencyChanges.length} dependency change(s) (net risk: neutral).`;\n\n return {\n schemaVersion: \"1.0\",\n status,\n baseRef,\n targetRef: \"working-tree\",\n changedManifests,\n dependencyChanges,\n introducedFindings,\n resolvedFindings,\n netRiskVerdict,\n summary,\n generatedAt: new Date().toISOString(),\n };\n}\n","import YAML from \"yaml\";\nimport semver from \"semver\";\nimport type { DeltaDependencyChange } from \"../platform/types.js\";\n\n/**\n * Extracts a map of package names to their resolved versions from a lockfile content.\n */\nexport function parseLockfileDependencies(\n filename: string,\n content: string,\n): Map<string, Set<string>> {\n const result = new Map<string, Set<string>>();\n\n const add = (name: string, ver?: string) => {\n if (!name || !ver) return;\n const cleanVer = semver.clean(ver) || semver.coerce(ver)?.version || ver;\n let set = result.get(name);\n if (!set) {\n set = new Set();\n result.set(name, set);\n }\n set.add(cleanVer);\n };\n\n if (filename.endsWith(\"package-lock.json\")) {\n try {\n const data = JSON.parse(content);\n if (data.packages && typeof data.packages === \"object\") {\n for (const [key, pkg] of Object.entries(data.packages)) {\n if (!key || key === \"\" || typeof pkg !== \"object\" || !pkg) continue;\n const idx = key.lastIndexOf(\"node_modules/\");\n if (idx !== -1) {\n const rawName = key.slice(idx + \"node_modules/\".length);\n const ver = (pkg as { version?: string }).version;\n add(rawName, ver);\n }\n }\n }\n if (data.dependencies && typeof data.dependencies === \"object\") {\n const walkDeps = (deps: Record<string, unknown>) => {\n for (const [name, info] of Object.entries(deps)) {\n if (!info || typeof info !== \"object\") continue;\n const depObj = info as { version?: string; dependencies?: Record<string, unknown> };\n add(name, depObj.version);\n if (depObj.dependencies && typeof depObj.dependencies === \"object\") {\n walkDeps(depObj.dependencies);\n }\n }\n };\n walkDeps(data.dependencies as Record<string, unknown>);\n }\n } catch {\n // Ignore JSON parse error\n }\n } else if (filename.endsWith(\"pnpm-lock.yaml\")) {\n try {\n const data = YAML.parse(content) as {\n packages?: Record<string, { name?: string; version?: string }>;\n snapshots?: Record<string, unknown>;\n };\n if (data?.packages && typeof data.packages === \"object\") {\n for (const [key, val] of Object.entries(data.packages)) {\n let rawKey = key.replace(/^\\//, \"\");\n const parenIdx = rawKey.indexOf(\"(\");\n if (parenIdx !== -1) {\n rawKey = rawKey.slice(0, parenIdx);\n }\n const lastAt = rawKey.lastIndexOf(\"@\");\n if (lastAt > 0) {\n const name = val?.name ?? rawKey.slice(0, lastAt);\n const version = val?.version ?? rawKey.slice(lastAt + 1);\n add(name, version);\n }\n }\n }\n if (data?.snapshots && typeof data.snapshots === \"object\") {\n for (const key of Object.keys(data.snapshots)) {\n let rawKey = key.replace(/^\\//, \"\");\n const parenIdx = rawKey.indexOf(\"(\");\n if (parenIdx !== -1) {\n rawKey = rawKey.slice(0, parenIdx);\n }\n const lastAt = rawKey.lastIndexOf(\"@\");\n if (lastAt > 0) {\n const name = rawKey.slice(0, lastAt);\n const version = rawKey.slice(lastAt + 1);\n add(name, version);\n }\n }\n }\n } catch {\n // Ignore YAML parse error\n }\n } else if (filename.endsWith(\"yarn.lock\")) {\n const lines = content.split(\"\\n\");\n let currentPackages: string[] = [];\n for (const line of lines) {\n if (line.startsWith(\"#\") || line.trim() === \"\") continue;\n if (!line.startsWith(\" \")) {\n currentPackages = [];\n const parts = line.split(\",\").map((p) => p.trim().replace(/^\"/, \"\").replace(/\":?$/, \"\"));\n for (const part of parts) {\n const lastAt = part.lastIndexOf(\"@\");\n if (lastAt > 0) {\n currentPackages.push(part.slice(0, lastAt));\n }\n }\n } else {\n const match = line.match(/^\\s+version\\s+\"?([^\"\\s]+)\"?/);\n if (match && currentPackages.length > 0) {\n const ver = match[1];\n for (const pkg of currentPackages) {\n add(pkg, ver);\n }\n currentPackages = [];\n }\n }\n }\n }\n\n return result;\n}\n\n/**\n * Computes difference between old and new lockfile content.\n */\nexport function computeLockfileDiff(\n filename: string,\n oldContent: string | null,\n newContent: string | null,\n): DeltaDependencyChange[] {\n const changes: DeltaDependencyChange[] = [];\n const oldDeps = oldContent\n ? parseLockfileDependencies(filename, oldContent)\n : new Map<string, Set<string>>();\n const newDeps = newContent\n ? parseLockfileDependencies(filename, newContent)\n : new Map<string, Set<string>>();\n\n const allPkgs = new Set([...oldDeps.keys(), ...newDeps.keys()]);\n\n for (const pkg of allPkgs) {\n const oldVers = oldDeps.get(pkg) ?? new Set();\n const newVers = newDeps.get(pkg) ?? new Set();\n\n // Check newly introduced versions\n for (const nVer of newVers) {\n if (!oldVers.has(nVer)) {\n if (oldVers.size === 0) {\n changes.push({\n packageName: pkg,\n changeType: \"added\",\n newVersion: nVer,\n dependencyType: \"transitive\",\n manifestPath: filename,\n });\n } else {\n const [firstOld] = oldVers;\n const cleanOld = semver.clean(firstOld) || semver.coerce(firstOld)?.version;\n const cleanNew = semver.clean(nVer) || semver.coerce(nVer)?.version;\n const isUpgrade =\n cleanOld && cleanNew && semver.valid(cleanOld) && semver.valid(cleanNew)\n ? semver.gt(cleanNew, cleanOld)\n : true;\n\n changes.push({\n packageName: pkg,\n changeType: isUpgrade ? \"upgraded\" : \"downgraded\",\n oldVersion: firstOld,\n newVersion: nVer,\n dependencyType: \"transitive\",\n manifestPath: filename,\n });\n }\n }\n }\n\n // Check removed versions (only if package no longer exists in new lockfile)\n if (newVers.size === 0 && oldVers.size > 0) {\n for (const oVer of oldVers) {\n changes.push({\n packageName: pkg,\n changeType: \"removed\",\n oldVersion: oVer,\n dependencyType: \"transitive\",\n manifestPath: filename,\n });\n }\n }\n }\n\n return changes;\n}\n","import { randomUUID } from \"node:crypto\";\nimport { jobRegistry } from \"../../platform/jobs.js\";\nimport type { AsyncRemediationJob, JobHandle } from \"../../platform/jobs.js\";\nimport type {\n RemediateOptions,\n PortfolioTarget,\n RemediationReport,\n PortfolioReport,\n} from \"../../platform/types.js\";\nimport type { ScanReport, ScanOptions } from \"../contracts.js\";\nimport { remediate } from \"../remediate/index.js\";\nimport { remediateFromScan } from \"../remediate-from-scan/index.js\";\nimport { remediatePortfolio } from \"../portfolio/index.js\";\n\nexport type { JobHandle, AsyncRemediationJob } from \"../../platform/jobs.js\";\n\nexport type TypedAsyncRemediationJob = Omit<AsyncRemediationJob, \"result\"> & {\n result?: RemediationReport | ScanReport | PortfolioReport;\n};\n\nfunction createJob(): AsyncRemediationJob {\n const jobId = randomUUID();\n const submittedAt = new Date().toISOString();\n const job: AsyncRemediationJob = { jobId, status: \"pending\", submittedAt };\n jobRegistry.set(jobId, job);\n return job;\n}\n\nfunction runJobAsync(job: AsyncRemediationJob, work: () => Promise<unknown>): void {\n Promise.resolve()\n .then(() => {\n job.status = \"running\";\n return work();\n })\n .then((result) => {\n job.status = \"done\";\n job.result = result;\n job.completedAt = new Date().toISOString();\n })\n .catch((error: unknown) => {\n job.status = \"failed\";\n job.error = error instanceof Error ? error.message : String(error);\n job.completedAt = new Date().toISOString();\n });\n}\n\nexport function submitRemediateJob(cveId: string, options?: RemediateOptions): JobHandle {\n const job = createJob();\n runJobAsync(job, () => remediate(cveId, options));\n return { jobId: job.jobId, status: job.status, submittedAt: job.submittedAt };\n}\n\nexport function submitScanJob(inputPath: string, options?: ScanOptions): JobHandle {\n const job = createJob();\n runJobAsync(job, () => remediateFromScan(inputPath, options));\n return { jobId: job.jobId, status: job.status, submittedAt: job.submittedAt };\n}\n\nexport function submitPortfolioJob(\n targets: PortfolioTarget[],\n options?: RemediateOptions,\n): JobHandle {\n const job = createJob();\n runJobAsync(job, () => remediatePortfolio(targets, options));\n return { jobId: job.jobId, status: job.status, submittedAt: job.submittedAt };\n}\n\nexport function pollJob(jobId: string): TypedAsyncRemediationJob {\n const job = jobRegistry.get(jobId);\n if (!job) {\n throw new Error(`Job not found: ${jobId}`);\n }\n return job as TypedAsyncRemediationJob;\n}\n","// platform-safe types only — no imports from other packages/core/src/ modules\n\nexport interface JobHandle {\n jobId: string;\n status: \"pending\" | \"running\" | \"done\" | \"failed\";\n submittedAt: string;\n}\n\nexport interface AsyncRemediationJob extends JobHandle {\n result?: unknown;\n error?: string;\n completedAt?: string;\n}\n\nexport const jobRegistry = new Map<string, AsyncRemediationJob>();\n"],"mappings":"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","names":["existsSync","readFile","join","existsSync","readFileSync","join","execa","existsSync","readFileSync","join","join","existsSync","join","command","readFileSync","base","existsSync","existsSync","join","readFile","readFileSync","join","execa","existsSync","readFileSync","join","readFileSync","existsSync","readFileSync","join","resolve","readFileSync","join","execa","existsSync","readFile","join","execa","semver","readFileSync","join","execa","result","execa","readFileSync","join","semver","join","existsSync","readFile","execa","existsSync","mkdirSync","readFileSync","writeFileSync","join","generateText","semver","url","readFileSync","existsSync","readdirSync","readFileSync","statSync","isAbsolute","join","resolve","z","join","existsSync","readFileSync","resolve","isAbsolute","readdirSync","stat","statSync","z","z","join","readFileSync","writeFileSync","execa","semver","rm","join","resolve","readdirSync","readFileSync","statSync","join","parseSync","SOURCE_EXTENSIONS","IGNORED_DIRS","stat","readFileSync","writeFileSync","z","join","semver","readFileSync","writeFileSync","prefix","z","join","existsSync","readFileSync","writeFileSync","semver","z","join","existsSync","semver","readFileSync","dependencyTrace","dependencyTraceSuffix","writeFileSync","safeUpgrade","trust","z","mkdir","readdir","readFile","rm","join","execa","z","parseSync","z","z","mkdir","writeFile","existsSync","isAbsolute","join","execa","existsSync","mkdtemp","readFile","rm","writeFile","tmpdir","join","execa","writeFile","join","readFile","execa","rm","mkdtemp","tmpdir","existsSync","z","join","mkdir","writeFile","isAbsolute","existsSync","execa","semver","semver","existsSync","readFileSync","join","z","z","z","semver","z","z","z","z","generateText","execa","resolveProvider","mkdirSync","writeFileSync","join","evidenceFile","resolve","readFileSync","execa","readFileSync","readFileSync","CVE_REGEX","GHSA_REGEX","normalizeSeverity","readFileSync","CVE_REGEX","resolve","execa","readFileSync","join","readFileSync","writeFileSync","execa","join","readFileSync","writeFileSync","execa","evidenceFile","existsSync","readFileSync","join","execa","semver","YAML","semver","execa","existsSync","join","readFileSync","semver","randomUUID","randomUUID"]}
|
|
1
|
+
{"version":3,"sources":["../src/api/options-schema.ts","../src/api/reporting.ts","../src/api/sarif.ts","../src/api/vex/index.ts","../src/api/patches/inspection.ts","../src/remediation/strategies/patch-utils.ts","../src/platform/package-manager/index.ts","../src/platform/package-manager/list-parser.ts","../src/platform/package-manager/driver.ts","../src/api/patches/helpers.ts","../src/remediation/tools/tool-compat.ts","../src/remediation/tools/check-inventory.ts","../src/platform/policy.ts","../src/platform/workspace.ts","../src/api/patches/validation.ts","../src/api/patches/reconcile.ts","../src/remediation/evaluate-package.ts","../src/platform/http-client.ts","../src/intelligence/sources/osv.ts","../src/platform/config.ts","../src/intelligence/sources/epss.ts","../src/intelligence/sources/cisa-kev.ts","../src/intelligence/sources/registry.ts","../src/platform/safe-exec.ts","../src/remediation/tools/apply-package-override/helpers.ts","../src/platform/idempotency.ts","../src/remediation/pipeline.ts","../src/remediation/local/run.ts","../src/intelligence/sources/github-advisory.ts","../src/intelligence/sources/nvd.ts","../src/intelligence/sources/snapshot.ts","../src/remediation/tools/check-reachability.ts","../src/remediation/tools/check-exploit-signal.ts","../src/remediation/local/secops-preflight.ts","../src/remediation/local/sbom.ts","../src/remediation/tools/apply-version-bump.ts","../src/remediation/proof-of-fix/runner.ts","../src/platform/repo-lock.ts","../src/remediation/refactor/call-site-finder.ts","../src/remediation/refactor/refactor-agent.ts","../src/remediation/tools/apply-package-override/index.ts","../src/platform/supply-chain.ts","../src/remediation/local/primary-strategy.ts","../src/remediation/tools/fetch-package-source.ts","../src/remediation/tools/generate-patch/index.ts","../src/remediation/strategies/patch-synthesis-prompt.ts","../src/remediation/tools/generate-patch/helpers.ts","../src/remediation/tools/apply-patch-file/index.ts","../src/platform/rollback.ts","../src/remediation/tools/apply-patch-file/helpers.ts","../src/remediation/local/consensus-gate.ts","../src/remediation/local/fallback.ts","../src/remediation/local/options.ts","../src/remediation/local/vulnerability-match.ts","../src/remediation/local/summary.ts","../src/remediation/local/disposition.ts","../src/platform/escalation.ts","../src/remediation/strategies/pipeline-telemetry.ts","../src/remediation/orchestration-prompt.ts","../src/remediation/pipeline-runtime/progress.ts","../src/remediation/pipeline-runtime/tool-wrappers.ts","../src/remediation/tools/lookup-cve.ts","../src/intelligence/sources/cve-services.ts","../src/intelligence/sources/gitlab-advisory.ts","../src/intelligence/sources/certcc.ts","../src/intelligence/sources/deps-dev.ts","../src/intelligence/sources/ossf-scorecard.ts","../src/intelligence/sources/external-feeds.ts","../src/remediation/tools/check-version-match.ts","../src/remediation/tools/find-fixed-version.ts","../src/remediation/tools/check-suppression.ts","../src/remediation/runtime-tools.ts","../src/remediation/pipeline-runtime/index.ts","../src/api/change-request/index.ts","../src/api/context.ts","../src/platform/evidence.ts","../src/api/remediate.evidence.ts","../src/api/remediate/validators.ts","../src/api/remediate/index.ts","../src/scanner/parse-input.ts","../src/scanner/adapters/npm-audit.ts","../src/scanner/adapters/yarn-audit.ts","../src/scanner/adapters/sarif.ts","../src/scanner/unique-cve-ids.ts","../src/api/scan-execution.ts","../src/api/scan-outcome.ts","../src/api/remediate-from-scan/report-metrics.ts","../src/api/remediate-from-scan/index.ts","../src/api/portfolio/risk-score.ts","../src/api/portfolio/index.ts","../src/api/update-outdated/index.ts","../src/api/reachability/index.ts","../src/scanner/delta-scan.ts","../src/scanner/lockfile-diff.ts","../src/api/jobs/index.ts","../src/platform/jobs.ts"],"sourcesContent":["export type JsonSchemaProperty = Record<string, unknown>;\n\nexport const PACKAGE_MANAGER_VALUES = [\"npm\", \"pnpm\", \"yarn\", \"bun\", \"deno\"] as const;\nexport const LLM_PROVIDER_VALUES = [\"remote\", \"local\"] as const;\nexport const PROVENANCE_SOURCE_VALUES = [\"cli\", \"sdk\", \"mcp\", \"openapi\", \"unknown\"] as const;\n\nexport const OPTION_DESCRIPTIONS = {\n cveId: \"CVE ID, e.g. CVE-2021-23337\",\n inputPath: \"Absolute path to the scanner output file\",\n cwd: \"Absolute path to the project root (default: process.cwd())\",\n packageManager: \"Package manager override (auto-detected by default)\",\n dryRun: \"If true, plan changes but write nothing\",\n preview: \"If true, enforce non-mutating preview mode\",\n simulationMode:\n \"If true, attach deterministic simulation and rebuttal metadata for dry-run or preview execution\",\n runTests: \"Run package-manager test command after applying fix\",\n llmProvider: \"LLM provider override (remote|local)\",\n model: \"LLM model override\",\n modelPersonality: \"Prompt behavior profile: analytical|pragmatic|balanced\",\n providerSafetyProfile: \"Safety posture profile for confidence gates: strict|relaxed\",\n requireConsensusForHighRisk: \"Require second-provider agreement for high-risk generated patches\",\n consensusProvider: \"Provider override for high-risk consensus verification (remote|local)\",\n consensusModel: \"Model override for high-risk consensus verification\",\n patchConfidenceThresholdLow: \"Patch acceptance confidence threshold for low-risk patches (0..1)\",\n patchConfidenceThresholdMedium:\n \"Patch acceptance confidence threshold for medium-risk patches (0..1)\",\n patchConfidenceThresholdHigh:\n \"Patch acceptance confidence threshold for high-risk patches (0..1)\",\n dynamicModelRouting: \"Enable dynamic model selection by input size\",\n dynamicRoutingThresholdChars: \"Input size threshold used by dynamic model routing\",\n patchesDir: \"Directory to write .patch files (default: ./patches)\",\n policy: \"Optional path to .github/autoremediator.yml policy file\",\n requestId: \"Request correlation ID\",\n sessionId: \"Session correlation ID\",\n parentRunId: \"Parent run correlation ID\",\n idempotencyKey: \"Idempotency key for replay-safe execution\",\n resume: \"Return cached result for matching idempotency key when available\",\n actor: \"Actor identity for evidence provenance\",\n source: \"Source system for provenance\",\n format: \"Scanner format (default: auto)\",\n audit: \"Run package-manager-native audit command instead of reading a scan file\",\n evidence: \"Write evidence JSON to .autoremediator/evidence/ (default: true)\",\n directDependenciesOnly: \"Restrict remediation to direct dependencies only\",\n preferVersionBump:\n \"Reject override and patch remediation when version-bump-only policy is required\",\n installMode: \"Install behavior profile: deterministic|prefer-offline|standard\",\n installPreferOffline: \"Override prefer-offline flag behavior for install commands\",\n enforceFrozenLockfile: \"Override frozen lockfile behavior for install commands\",\n workspace: \"Workspace/package selector for scoped remediation in monorepos\",\n createChangeRequest: \"Enable creation of native pull request / merge request after remediation\",\n changeRequestProvider: \"Change request provider (github|gitlab)\",\n changeRequestGrouping: \"Grouping strategy for change requests (all|per-cve|per-package)\",\n changeRequestRepository: \"Repository slug override for change request creation\",\n changeRequestBaseBranch: \"Base branch used for change request targeting\",\n changeRequestBranchPrefix: \"Branch prefix for generated change request branches\",\n changeRequestTitlePrefix: \"Title prefix for generated change requests\",\n includeTransitive: \"Include transitive dependencies in the outdated check. Default: false.\",\n updateOutdated:\n \"Run in update-outdated mode: bump all outdated npm packages without requiring a CVE.\",\n kevMandatory:\n \"If true, CVEs with active CISA KEV status bypass severity filtering and are treated as mandatory\",\n epssThreshold:\n \"EPSS probability threshold (0..1) above which a CVE is treated as mandatory regardless of severity\",\n suppressionsFile:\n \"Path to a YAML file containing additional VEX suppression entries to merge with policy-inline suppressions\",\n slaCheck:\n \"Compare CVE publication dates against configured SLA windows and include breach records in the report output\",\n skipUnreachable:\n \"Skip remediation for CVEs where the vulnerable package cannot be reached from any project entry point (requires static import analysis)\",\n regressionCheck:\n \"After applying a fix, verify the patched version falls outside the CVE's vulnerable range and flag any regression in the report\",\n dispositionPolicy:\n \"Autonomous disposition policy controlling when fixes are auto-applied, held, or escalated\",\n dispositionPolicyMinConfidenceForAutoApply:\n \"Minimum patch confidence (0–1) required for auto-apply disposition\",\n dispositionPolicyHoldForTransitive:\n \"Hold transitive dependency fixes for human review instead of auto-applying\",\n dispositionPolicyEscalateOnSlaBreachSeverities:\n \"CVE severities that trigger escalate disposition on SLA breach\",\n dispositionPolicyEscalateOnKev: \"Escalate disposition for CVEs with active CISA KEV status\",\n containmentMode:\n \"Block escalation-disposition results from being applied and record containment in evidence\",\n campaignMode: \"Enable portfolio campaign mode to risk-rank targets before execution\",\n escalationGraph: \"Optional mapping from unresolved reasons to intended escalation actions\",\n offlineIntelligence:\n \"Skip all network calls to intelligence sources. Only local inventory and npm-registry version resolution proceed.\",\n intelligenceSnapshotPath:\n \"Path to a local JSON snapshot of pre-fetched CVE intelligence (keyed by CVE ID) used when offline mode is active.\",\n proofOfFix:\n \"If true, enforce dual-stage exploit reproduction proof-of-fix verification (assert failure pre-patch, assert pass post-patch)\",\n requireProofOfFix: \"If true, reject patches and roll back if proof-of-fix verification fails\",\n breakingChangeRefactor:\n \"If true, attempt agentic call-site refactoring when major version upgrades introduce breaking API changes\",\n} as const;\n\nexport function createConstraintSchemaProperties(): Record<string, JsonSchemaProperty> {\n return {\n directDependenciesOnly: {\n type: \"boolean\",\n description: OPTION_DESCRIPTIONS.directDependenciesOnly,\n },\n preferVersionBump: { type: \"boolean\", description: OPTION_DESCRIPTIONS.preferVersionBump },\n installMode: {\n type: \"string\",\n enum: [\"deterministic\", \"prefer-offline\", \"standard\"],\n description: OPTION_DESCRIPTIONS.installMode,\n },\n installPreferOffline: {\n type: \"boolean\",\n description: OPTION_DESCRIPTIONS.installPreferOffline,\n },\n enforceFrozenLockfile: {\n type: \"boolean\",\n description: OPTION_DESCRIPTIONS.enforceFrozenLockfile,\n },\n workspace: { type: \"string\", description: OPTION_DESCRIPTIONS.workspace },\n requireProofOfFix: { type: \"boolean\", description: OPTION_DESCRIPTIONS.requireProofOfFix },\n enableBreakingChangeRefactor: {\n type: \"boolean\",\n description: OPTION_DESCRIPTIONS.breakingChangeRefactor,\n },\n };\n}\n\nexport function createRemediateOptionSchemaProperties(options?: {\n includeDryRun?: boolean;\n includePreview?: boolean;\n includeSimulationMode?: boolean;\n includeEvidence?: boolean;\n}): Record<string, JsonSchemaProperty> {\n const includeDryRun = options?.includeDryRun ?? true;\n const includePreview = options?.includePreview ?? true;\n const includeSimulationMode = options?.includeSimulationMode ?? true;\n const includeEvidence = options?.includeEvidence ?? true;\n\n return {\n cwd: { type: \"string\", description: OPTION_DESCRIPTIONS.cwd },\n packageManager: {\n type: \"string\",\n enum: [...PACKAGE_MANAGER_VALUES],\n description: OPTION_DESCRIPTIONS.packageManager,\n },\n ...(includeDryRun\n ? { dryRun: { type: \"boolean\", description: OPTION_DESCRIPTIONS.dryRun } }\n : {}),\n ...(includePreview\n ? { preview: { type: \"boolean\", description: OPTION_DESCRIPTIONS.preview } }\n : {}),\n ...(includeSimulationMode\n ? { simulationMode: { type: \"boolean\", description: OPTION_DESCRIPTIONS.simulationMode } }\n : {}),\n runTests: { type: \"boolean\", description: OPTION_DESCRIPTIONS.runTests },\n llmProvider: {\n type: \"string\",\n enum: [...LLM_PROVIDER_VALUES],\n description: OPTION_DESCRIPTIONS.llmProvider,\n },\n model: { type: \"string\", description: OPTION_DESCRIPTIONS.model },\n modelPersonality: {\n type: \"string\",\n enum: [\"analytical\", \"pragmatic\", \"balanced\"],\n description: OPTION_DESCRIPTIONS.modelPersonality,\n },\n providerSafetyProfile: {\n type: \"string\",\n enum: [\"strict\", \"relaxed\"],\n description: OPTION_DESCRIPTIONS.providerSafetyProfile,\n },\n requireConsensusForHighRisk: {\n type: \"boolean\",\n description: OPTION_DESCRIPTIONS.requireConsensusForHighRisk,\n },\n consensusProvider: {\n type: \"string\",\n enum: [...LLM_PROVIDER_VALUES],\n description: OPTION_DESCRIPTIONS.consensusProvider,\n },\n consensusModel: { type: \"string\", description: OPTION_DESCRIPTIONS.consensusModel },\n patchConfidenceThresholds: {\n type: \"object\",\n properties: {\n low: {\n type: \"number\",\n minimum: 0,\n maximum: 1,\n description: OPTION_DESCRIPTIONS.patchConfidenceThresholdLow,\n },\n medium: {\n type: \"number\",\n minimum: 0,\n maximum: 1,\n description: OPTION_DESCRIPTIONS.patchConfidenceThresholdMedium,\n },\n high: {\n type: \"number\",\n minimum: 0,\n maximum: 1,\n description: OPTION_DESCRIPTIONS.patchConfidenceThresholdHigh,\n },\n },\n },\n dynamicModelRouting: { type: \"boolean\", description: OPTION_DESCRIPTIONS.dynamicModelRouting },\n dynamicRoutingThresholdChars: {\n type: \"number\",\n description: OPTION_DESCRIPTIONS.dynamicRoutingThresholdChars,\n },\n patchesDir: { type: \"string\", description: OPTION_DESCRIPTIONS.patchesDir },\n policy: { type: \"string\", description: OPTION_DESCRIPTIONS.policy },\n ...(includeEvidence\n ? { evidence: { type: \"boolean\", description: OPTION_DESCRIPTIONS.evidence } }\n : {}),\n requestId: { type: \"string\", description: OPTION_DESCRIPTIONS.requestId },\n sessionId: { type: \"string\", description: OPTION_DESCRIPTIONS.sessionId },\n parentRunId: { type: \"string\", description: OPTION_DESCRIPTIONS.parentRunId },\n idempotencyKey: { type: \"string\", description: OPTION_DESCRIPTIONS.idempotencyKey },\n resume: { type: \"boolean\", description: OPTION_DESCRIPTIONS.resume },\n actor: { type: \"string\", description: OPTION_DESCRIPTIONS.actor },\n source: {\n type: \"string\",\n enum: [...PROVENANCE_SOURCE_VALUES],\n description: OPTION_DESCRIPTIONS.source,\n },\n constraints: {\n type: \"object\",\n properties: createConstraintSchemaProperties(),\n },\n changeRequest: {\n type: \"object\",\n properties: {\n enabled: { type: \"boolean\", description: OPTION_DESCRIPTIONS.createChangeRequest },\n provider: {\n type: \"string\",\n enum: [\"github\", \"gitlab\"],\n description: OPTION_DESCRIPTIONS.changeRequestProvider,\n },\n grouping: {\n type: \"string\",\n enum: [\"all\", \"per-cve\", \"per-package\"],\n description: OPTION_DESCRIPTIONS.changeRequestGrouping,\n },\n repository: { type: \"string\", description: OPTION_DESCRIPTIONS.changeRequestRepository },\n baseBranch: { type: \"string\", description: OPTION_DESCRIPTIONS.changeRequestBaseBranch },\n branchPrefix: {\n type: \"string\",\n description: OPTION_DESCRIPTIONS.changeRequestBranchPrefix,\n },\n titlePrefix: { type: \"string\", description: OPTION_DESCRIPTIONS.changeRequestTitlePrefix },\n },\n },\n kevMandatory: { type: \"boolean\", description: OPTION_DESCRIPTIONS.kevMandatory },\n epssThreshold: {\n type: \"number\",\n minimum: 0,\n maximum: 1,\n description: OPTION_DESCRIPTIONS.epssThreshold,\n },\n suppressionsFile: { type: \"string\", description: OPTION_DESCRIPTIONS.suppressionsFile },\n slaCheck: { type: \"boolean\", description: OPTION_DESCRIPTIONS.slaCheck },\n skipUnreachable: { type: \"boolean\", description: OPTION_DESCRIPTIONS.skipUnreachable },\n regressionCheck: { type: \"boolean\", description: OPTION_DESCRIPTIONS.regressionCheck },\n dispositionPolicy: {\n type: \"object\",\n description: OPTION_DESCRIPTIONS.dispositionPolicy,\n properties: {\n minConfidenceForAutoApply: {\n type: \"number\",\n minimum: 0,\n maximum: 1,\n description: OPTION_DESCRIPTIONS.dispositionPolicyMinConfidenceForAutoApply,\n },\n holdForTransitive: {\n type: \"boolean\",\n description: OPTION_DESCRIPTIONS.dispositionPolicyHoldForTransitive,\n },\n escalateOnSlaBreachSeverities: {\n type: \"array\",\n items: { type: \"string\", enum: [\"critical\", \"high\", \"medium\", \"low\"] },\n description: OPTION_DESCRIPTIONS.dispositionPolicyEscalateOnSlaBreachSeverities,\n },\n escalateOnKev: {\n type: \"boolean\",\n description: OPTION_DESCRIPTIONS.dispositionPolicyEscalateOnKev,\n },\n },\n },\n containmentMode: { type: \"boolean\", description: OPTION_DESCRIPTIONS.containmentMode },\n campaignMode: { type: \"boolean\", description: OPTION_DESCRIPTIONS.campaignMode },\n escalationGraph: {\n type: \"object\",\n description: OPTION_DESCRIPTIONS.escalationGraph,\n properties: {\n \"consensus-failed\": {\n type: \"string\",\n enum: [\"open-issue\", \"notify-channel\", \"create-draft-pr\", \"hold-branch\", \"none\"],\n },\n \"constraint-blocked\": {\n type: \"string\",\n enum: [\"open-issue\", \"notify-channel\", \"create-draft-pr\", \"hold-branch\", \"none\"],\n },\n \"transitive-dependency\": {\n type: \"string\",\n enum: [\"open-issue\", \"notify-channel\", \"create-draft-pr\", \"hold-branch\", \"none\"],\n },\n \"install-failed\": {\n type: \"string\",\n enum: [\"open-issue\", \"notify-channel\", \"create-draft-pr\", \"hold-branch\", \"none\"],\n },\n \"major-bump-required\": {\n type: \"string\",\n enum: [\"open-issue\", \"notify-channel\", \"create-draft-pr\", \"hold-branch\", \"none\"],\n },\n \"no-safe-version\": {\n type: \"string\",\n enum: [\"open-issue\", \"notify-channel\", \"create-draft-pr\", \"hold-branch\", \"none\"],\n },\n \"override-apply-failed\": {\n type: \"string\",\n enum: [\"open-issue\", \"notify-channel\", \"create-draft-pr\", \"hold-branch\", \"none\"],\n },\n \"package-json-not-found\": {\n type: \"string\",\n enum: [\"open-issue\", \"notify-channel\", \"create-draft-pr\", \"hold-branch\", \"none\"],\n },\n \"patch-apply-failed\": {\n type: \"string\",\n enum: [\"open-issue\", \"notify-channel\", \"create-draft-pr\", \"hold-branch\", \"none\"],\n },\n \"patch-confidence-too-low\": {\n type: \"string\",\n enum: [\"open-issue\", \"notify-channel\", \"create-draft-pr\", \"hold-branch\", \"none\"],\n },\n \"patch-generation-failed\": {\n type: \"string\",\n enum: [\"open-issue\", \"notify-channel\", \"create-draft-pr\", \"hold-branch\", \"none\"],\n },\n \"patch-validation-failed\": {\n type: \"string\",\n enum: [\"open-issue\", \"notify-channel\", \"create-draft-pr\", \"hold-branch\", \"none\"],\n },\n \"policy-blocked\": {\n type: \"string\",\n enum: [\"open-issue\", \"notify-channel\", \"create-draft-pr\", \"hold-branch\", \"none\"],\n },\n \"requires-llm-fallback\": {\n type: \"string\",\n enum: [\"open-issue\", \"notify-channel\", \"create-draft-pr\", \"hold-branch\", \"none\"],\n },\n \"source-fetch-failed\": {\n type: \"string\",\n enum: [\"open-issue\", \"notify-channel\", \"create-draft-pr\", \"hold-branch\", \"none\"],\n },\n \"validation-failed\": {\n type: \"string\",\n enum: [\"open-issue\", \"notify-channel\", \"create-draft-pr\", \"hold-branch\", \"none\"],\n },\n \"proof-of-fix-failed\": {\n type: \"string\",\n enum: [\"open-issue\", \"notify-channel\", \"create-draft-pr\", \"hold-branch\", \"none\"],\n },\n \"breaking-change-unresolved\": {\n type: \"string\",\n enum: [\"open-issue\", \"notify-channel\", \"create-draft-pr\", \"hold-branch\", \"none\"],\n },\n },\n additionalProperties: false,\n },\n offlineIntelligence: { type: \"boolean\", description: OPTION_DESCRIPTIONS.offlineIntelligence },\n intelligenceSnapshotPath: {\n type: \"string\",\n description: OPTION_DESCRIPTIONS.intelligenceSnapshotPath,\n },\n proofOfFix: { type: \"boolean\", description: OPTION_DESCRIPTIONS.proofOfFix },\n requireProofOfFix: { type: \"boolean\", description: OPTION_DESCRIPTIONS.requireProofOfFix },\n breakingChangeRefactor: {\n type: \"boolean\",\n description: OPTION_DESCRIPTIONS.breakingChangeRefactor,\n },\n };\n}\n\nexport function createScanOptionSchemaProperties(): Record<string, JsonSchemaProperty> {\n return {\n ...createRemediateOptionSchemaProperties({ includeEvidence: true }),\n format: {\n type: \"string\",\n enum: [\"npm-audit\", \"yarn-audit\", \"sarif\", \"auto\"],\n description: OPTION_DESCRIPTIONS.format,\n },\n audit: { type: \"boolean\", description: OPTION_DESCRIPTIONS.audit },\n slaCheck: { type: \"boolean\", description: OPTION_DESCRIPTIONS.slaCheck },\n };\n}\n\nexport function createScanReportSchemaProperties(): Record<string, JsonSchemaProperty> {\n return {\n schemaVersion: { type: \"string\" },\n status: { type: \"string\", enum: [\"ok\", \"partial\", \"failed\"] },\n generatedAt: { type: \"string\" },\n cveIds: { type: \"array\", items: { type: \"string\" } },\n reports: { type: \"array\", items: { type: \"object\" } },\n successCount: { type: \"number\" },\n failedCount: { type: \"number\" },\n errors: { type: \"array\", items: { type: \"object\" } },\n evidenceFile: { type: \"string\" },\n patchCount: { type: \"number\" },\n patchValidationFailures: { type: \"array\", items: { type: \"object\" } },\n strategyCounts: {\n type: \"object\",\n additionalProperties: { type: \"number\" },\n },\n dependencyScopeCounts: {\n type: \"object\",\n additionalProperties: { type: \"number\" },\n },\n unresolvedByReason: {\n type: \"object\",\n additionalProperties: { type: \"number\" },\n },\n escalationCounts: {\n type: \"object\",\n additionalProperties: { type: \"number\" },\n },\n patchesDir: { type: \"string\" },\n correlation: { type: \"object\" },\n provenance: { type: \"object\" },\n constraints: { type: \"object\" },\n idempotencyKey: { type: \"string\" },\n llmUsageCount: { type: \"number\" },\n estimatedCostUsd: { type: \"number\" },\n totalLlmLatencyMs: { type: \"number\" },\n changeRequests: { type: \"array\", items: { type: \"object\" } },\n simulationSummary: { type: \"object\" },\n };\n}\n\nexport function createUpdateOutdatedOptionSchemaProperties(): Record<string, JsonSchemaProperty> {\n return {\n ...createRemediateOptionSchemaProperties({\n includeEvidence: true,\n includeSimulationMode: false,\n }),\n includeTransitive: { type: \"boolean\", description: OPTION_DESCRIPTIONS.includeTransitive },\n };\n}\n","import type {\n DependencyScope,\n DependencyScopeCounts,\n DispositionCounts,\n EscalationAction,\n EscalationCounts,\n RemediateOptions,\n PatchResult,\n PatchStrategyCounts,\n RemediationReport,\n ResultSimulation,\n SimulationMutation,\n SimulationMutationTarget,\n SimulationRebuttalCode,\n SimulationRebuttalFinding,\n SimulationSummary,\n SlaBreachEntry,\n SlaBreachSummary,\n UnresolvedReasonCounts,\n} from \"../platform/types.js\";\nimport type { CiSummary, ScanReport } from \"./contracts.js\";\n\nconst SIMULATION_MUTATION_REASONS: Record<SimulationMutationTarget, string> = {\n \"package-manifest\": \"Would update the package manifest dependency declaration.\",\n lockfile: \"Would update the dependency lockfile to reflect resolved versions.\",\n \"patch-file\": \"Would write a generated patch artifact.\",\n \"patch-manifest\": \"Would write patch artifact manifest metadata.\",\n \"install-state\": \"Would refresh installed dependency state.\",\n \"test-command\": \"Would execute the configured test command.\",\n};\n\nconst SIMULATION_REBUTTAL_MESSAGES: Record<SimulationRebuttalCode, string> = {\n \"unresolved-reason\": \"The remediation remains unresolved in simulation mode.\",\n \"policy-blocked\": \"Policy would block this remediation from being applied.\",\n \"consensus-failed\": \"Consensus verification would block this remediation path.\",\n \"validation-risk\": \"Validation signals indicate this remediation may fail or be unsafe.\",\n \"regression-risk\": \"Regression signals indicate the target may remain vulnerable after apply.\",\n \"low-confidence\": \"Patch confidence is below the acceptance threshold.\",\n \"high-risk-patch\": \"This remediation path is classified as high risk.\",\n \"transitive-target\": \"This result targets a transitive dependency.\",\n \"escalation-planned\": \"This remediation is planned for escalation instead of direct apply.\",\n \"exploit-signal\": \"Exploit-signal prioritization was triggered for this CVE.\",\n \"sla-breach\": \"This CVE breaches the configured remediation SLA.\",\n \"tests-not-run\": \"Tests would not run for this mutating remediation path.\",\n};\n\nfunction getSimulationMode(\n options: Pick<RemediateOptions, \"dryRun\" | \"preview\" | \"simulationMode\">,\n): ResultSimulation[\"mode\"] | undefined {\n if (!options.simulationMode) {\n return undefined;\n }\n\n if (options.preview === true) {\n return \"preview\";\n }\n\n if (options.dryRun === true) {\n return \"dry-run\";\n }\n\n return undefined;\n}\n\nexport function assertValidSimulationMode(\n options: Pick<RemediateOptions, \"dryRun\" | \"preview\" | \"simulationMode\">,\n): void {\n if (options.simulationMode !== true) {\n return;\n }\n\n if (!getSimulationMode(options)) {\n throw new Error(\"simulationMode requires dryRun=true or preview=true.\");\n }\n}\n\nfunction createDependencyScopeLookup(report: RemediationReport): Map<string, DependencyScope> {\n const scopes = new Map<string, DependencyScope>();\n\n for (const vulnerablePackage of report.vulnerablePackages) {\n const scope = toDependencyScope(vulnerablePackage.installed.type);\n const current = scopes.get(vulnerablePackage.installed.name);\n if (!current || current !== \"direct\") {\n scopes.set(vulnerablePackage.installed.name, scope);\n }\n }\n\n return scopes;\n}\n\nfunction createSimulationMutation(\n target: SimulationMutationTarget,\n path?: string,\n): SimulationMutation {\n return {\n target,\n reason: SIMULATION_MUTATION_REASONS[target],\n ...(path ? { path } : {}),\n };\n}\n\nfunction buildPlannedMutations(result: PatchResult, runTests: boolean): SimulationMutation[] {\n if (result.strategy === \"version-bump\" || result.strategy === \"override\") {\n return [\n createSimulationMutation(\"package-manifest\"),\n createSimulationMutation(\"lockfile\"),\n createSimulationMutation(\"install-state\"),\n ...(runTests ? [createSimulationMutation(\"test-command\")] : []),\n ];\n }\n\n if (result.strategy === \"patch-file\") {\n const patchFilePath = result.patchArtifact?.patchFilePath ?? result.patchFilePath;\n const manifestFilePath = result.patchArtifact?.manifestFilePath;\n\n return [\n createSimulationMutation(\"patch-file\", patchFilePath),\n ...(manifestFilePath ? [createSimulationMutation(\"patch-manifest\", manifestFilePath)] : []),\n createSimulationMutation(\"install-state\"),\n ...(runTests ? [createSimulationMutation(\"test-command\")] : []),\n ];\n }\n\n return [];\n}\n\nfunction addRebuttalFinding(\n findings: Map<SimulationRebuttalCode, SimulationRebuttalFinding>,\n code: SimulationRebuttalCode,\n severity: SimulationRebuttalFinding[\"severity\"],\n sourceSignals: string[],\n): void {\n const existing = findings.get(code);\n if (existing) {\n existing.sourceSignals = Array.from(new Set([...existing.sourceSignals, ...sourceSignals]));\n return;\n }\n\n findings.set(code, {\n code,\n severity,\n message: SIMULATION_REBUTTAL_MESSAGES[code],\n sourceSignals: Array.from(new Set(sourceSignals)),\n });\n}\n\nfunction hasValidationRisk(result: PatchResult): boolean {\n return (\n result.validation?.passed === false ||\n result.validationPhases?.some((phase) => phase.passed === false) === true ||\n result.patchArtifact?.validationPhases?.some((phase) => phase.passed === false) === true\n );\n}\n\nfunction buildRebuttalFindings(params: {\n report: RemediationReport;\n result: PatchResult;\n dependencyScope?: DependencyScope;\n wouldMutate: boolean;\n runTests: boolean;\n}): SimulationRebuttalFinding[] {\n const findings = new Map<SimulationRebuttalCode, SimulationRebuttalFinding>();\n const { report, result, dependencyScope, wouldMutate, runTests } = params;\n\n if (result.unresolvedReason) {\n addRebuttalFinding(findings, \"unresolved-reason\", \"warning\", [\"unresolvedReason\"]);\n }\n\n if (result.unresolvedReason === \"policy-blocked\") {\n addRebuttalFinding(findings, \"policy-blocked\", \"high\", [\"unresolvedReason\"]);\n }\n\n if (\n result.unresolvedReason === \"consensus-failed\" ||\n result.dispositionReason === \"consensus-failed\"\n ) {\n addRebuttalFinding(findings, \"consensus-failed\", \"high\", [\n ...(result.unresolvedReason === \"consensus-failed\" ? [\"unresolvedReason\"] : []),\n ...(result.dispositionReason === \"consensus-failed\" ? [\"dispositionReason\"] : []),\n ]);\n }\n\n if (hasValidationRisk(result)) {\n addRebuttalFinding(findings, \"validation-risk\", \"high\", [\"validation\", \"validationPhases\"]);\n }\n\n if (result.regressionDetected) {\n addRebuttalFinding(findings, \"regression-risk\", \"high\", [\"regressionDetected\"]);\n }\n\n if (\n result.unresolvedReason === \"patch-confidence-too-low\" ||\n result.dispositionReason === \"low-confidence\"\n ) {\n addRebuttalFinding(findings, \"low-confidence\", \"warning\", [\n ...(result.unresolvedReason === \"patch-confidence-too-low\" ? [\"unresolvedReason\"] : []),\n ...(result.dispositionReason === \"low-confidence\" ? [\"dispositionReason\"] : []),\n ]);\n }\n\n if (result.riskLevel === \"high\") {\n addRebuttalFinding(findings, \"high-risk-patch\", \"warning\", [\"riskLevel\"]);\n }\n\n if (dependencyScope === \"transitive\") {\n addRebuttalFinding(findings, \"transitive-target\", \"info\", [\"dependencyScope\"]);\n }\n\n if (result.escalationAction && result.escalationAction !== \"none\") {\n addRebuttalFinding(findings, \"escalation-planned\", \"warning\", [\"escalationAction\"]);\n }\n\n if (report.exploitSignalTriggered === true) {\n addRebuttalFinding(findings, \"exploit-signal\", \"high\", [\"exploitSignalTriggered\"]);\n }\n\n if ((report.slaBreaches?.length ?? 0) > 0) {\n addRebuttalFinding(findings, \"sla-breach\", \"warning\", [\"slaBreaches\"]);\n }\n\n if (wouldMutate && !runTests) {\n addRebuttalFinding(findings, \"tests-not-run\", \"warning\", [\"runTests\"]);\n }\n\n return [...findings.values()];\n}\n\nexport function buildResultSimulation(\n report: RemediationReport,\n result: PatchResult,\n options: Pick<RemediateOptions, \"dryRun\" | \"preview\" | \"runTests\" | \"simulationMode\">,\n): ResultSimulation | undefined {\n const mode = getSimulationMode(options);\n if (!mode) {\n return undefined;\n }\n\n const dependencyScopeLookup = createDependencyScopeLookup(report);\n const dependencyScope = result.dependencyScope ?? dependencyScopeLookup.get(result.packageName);\n const plannedMutations = buildPlannedMutations(result, options.runTests === true);\n const wouldMutate = plannedMutations.length > 0;\n\n let unifiedDiff: string | undefined;\n if (result.patchArtifact?.patchFilePath) {\n unifiedDiff = `--- ${result.patchArtifact.patchFilePath}\\n+++ ${result.patchArtifact.patchFilePath}`;\n } else if (result.strategy === \"version-bump\" && result.toVersion) {\n unifiedDiff = `--- package.json\\n+++ package.json\\n@@ -1,3 +1,3 @@\\n- \"${result.packageName}\": \"${result.fromVersion}\"\\n+ \"${result.packageName}\": \"^${result.toVersion}\"`;\n } else if (result.strategy === \"override\" && result.toVersion) {\n unifiedDiff = `--- package.json\\n+++ package.json\\n@@ -1,3 +1,3 @@\\n+ \"overrides\": {\\n+ \"${result.packageName}\": \"${result.toVersion}\"\\n+ }`;\n }\n\n return {\n mode,\n wouldMutate,\n plannedMutations,\n rebuttalFindings: buildRebuttalFindings({\n report,\n result,\n dependencyScope,\n wouldMutate,\n runTests: options.runTests === true,\n }),\n unifiedDiff,\n };\n}\n\nexport function buildSimulationSummary(\n reports: RemediationReport[],\n): SimulationSummary | undefined {\n let mode: SimulationSummary[\"mode\"] | undefined;\n let resultCount = 0;\n let wouldMutateCount = 0;\n let rebuttalResultCount = 0;\n const plannedMutationCounts: Partial<Record<SimulationMutationTarget, number>> = {};\n const rebuttalCounts: Partial<Record<SimulationRebuttalCode, number>> = {};\n\n for (const report of reports) {\n for (const result of report.results) {\n if (!result.simulation) {\n continue;\n }\n\n mode ??= result.simulation.mode;\n resultCount += 1;\n if (result.simulation.wouldMutate) {\n wouldMutateCount += 1;\n }\n if (result.simulation.rebuttalFindings.length > 0) {\n rebuttalResultCount += 1;\n }\n\n for (const mutation of result.simulation.plannedMutations) {\n plannedMutationCounts[mutation.target] = (plannedMutationCounts[mutation.target] ?? 0) + 1;\n }\n\n for (const finding of result.simulation.rebuttalFindings) {\n rebuttalCounts[finding.code] = (rebuttalCounts[finding.code] ?? 0) + 1;\n }\n }\n }\n\n if (!mode) {\n return undefined;\n }\n\n return {\n mode,\n resultCount,\n wouldMutateCount,\n nonMutatingCount: resultCount - wouldMutateCount,\n rebuttalResultCount,\n plannedMutationCounts:\n Object.keys(plannedMutationCounts).length > 0 ? plannedMutationCounts : undefined,\n rebuttalCounts: Object.keys(rebuttalCounts).length > 0 ? rebuttalCounts : undefined,\n };\n}\n\nexport function applySimulationMetadata(\n report: RemediationReport,\n options: Pick<RemediateOptions, \"dryRun\" | \"preview\" | \"runTests\" | \"simulationMode\">,\n): RemediationReport {\n const mode = getSimulationMode(options);\n if (!mode) {\n return report;\n }\n\n const enrichedReport: RemediationReport = {\n ...report,\n results: report.results.map((result) => ({\n ...result,\n simulation: buildResultSimulation(report, result, options),\n })),\n };\n\n return {\n ...enrichedReport,\n simulationSummary: buildSimulationSummary([enrichedReport]),\n };\n}\n\nexport function buildStrategyCounts(reports: RemediationReport[]): PatchStrategyCounts | undefined {\n const counts: PatchStrategyCounts = {};\n\n for (const report of reports) {\n for (const result of report.results) {\n counts[result.strategy] = (counts[result.strategy] ?? 0) + 1;\n }\n }\n\n return Object.keys(counts).length > 0 ? counts : undefined;\n}\n\nfunction toDependencyScope(installedType: \"direct\" | \"transitive\"): DependencyScope {\n return installedType === \"direct\" ? \"direct\" : \"transitive\";\n}\n\nexport function buildDependencyScopeCounts(\n reports: RemediationReport[],\n): DependencyScopeCounts | undefined {\n const counts: DependencyScopeCounts = {};\n\n for (const report of reports) {\n const packageScopes = new Map<string, DependencyScope>();\n\n for (const vulnerablePackage of report.vulnerablePackages) {\n const scope = toDependencyScope(vulnerablePackage.installed.type);\n const current = packageScopes.get(vulnerablePackage.installed.name);\n if (!current || current !== \"direct\") {\n packageScopes.set(vulnerablePackage.installed.name, scope);\n }\n }\n\n for (const result of report.results) {\n const scope = packageScopes.get(result.packageName);\n if (!scope) continue;\n counts[scope] = (counts[scope] ?? 0) + 1;\n }\n }\n\n return Object.keys(counts).length > 0 ? counts : undefined;\n}\n\nexport function buildUnresolvedReasonCounts(\n reports: RemediationReport[],\n): UnresolvedReasonCounts | undefined {\n const counts: UnresolvedReasonCounts = {};\n\n for (const report of reports) {\n for (const result of report.results) {\n if (!result.unresolvedReason) continue;\n counts[result.unresolvedReason] = (counts[result.unresolvedReason] ?? 0) + 1;\n }\n }\n\n return Object.keys(counts).length > 0 ? counts : undefined;\n}\n\nexport function buildDispositionCounts(\n reports: RemediationReport[],\n): DispositionCounts | undefined {\n const counts: DispositionCounts = {};\n\n for (const report of reports) {\n for (const result of report.results) {\n if (!result.disposition) continue;\n counts[result.disposition] = (counts[result.disposition] ?? 0) + 1;\n }\n }\n\n return Object.keys(counts).length > 0 ? counts : undefined;\n}\n\nexport function buildEscalationCounts(results: PatchResult[]): EscalationCounts | undefined {\n const counts: EscalationCounts = {};\n\n for (const result of results) {\n if (!result.escalationAction) continue;\n counts[result.escalationAction] = (counts[result.escalationAction] ?? 0) + 1;\n }\n\n return Object.keys(counts).length > 0 ? counts : undefined;\n}\n\nexport function buildSlaBreachSummary(reports: RemediationReport[]): SlaBreachSummary | undefined {\n const breaches: SlaBreachEntry[] = [];\n\n for (const report of reports) {\n if (!report.slaBreaches || report.slaBreaches.length === 0) continue;\n\n // Derive recommended action: first non-\"none\" escalationAction from any result in this report, else \"open-issue\"\n const recommendedAction: EscalationAction =\n report.results.map((r) => r.escalationAction).find((a) => a != null && a !== \"none\") ??\n \"open-issue\";\n\n for (const breach of report.slaBreaches) {\n breaches.push({\n cveId: breach.cveId,\n severity: breach.severity,\n hoursOverdue: breach.hoursOverdue,\n deadlineAt: breach.deadlineAt,\n recommendedAction,\n });\n }\n }\n\n return breaches.length > 0 ? { breachCount: breaches.length, breaches } : undefined;\n}\n\nexport function toCiSummary(report: ScanReport): CiSummary {\n let remediationCount = 0;\n for (const cveReport of report.reports) {\n remediationCount += cveReport.results.length;\n }\n\n return {\n schemaVersion: report.schemaVersion,\n status: report.status,\n generatedAt: report.generatedAt,\n cveCount: report.cveIds.length,\n remediationCount,\n successCount: report.successCount,\n failedCount: report.failedCount,\n errors: report.errors,\n evidenceFile: report.evidenceFile,\n patchCount: report.patchCount || 0,\n patchValidationFailures: report.patchValidationFailures,\n strategyCounts: report.strategyCounts,\n dependencyScopeCounts: report.dependencyScopeCounts,\n unresolvedByReason: report.unresolvedByReason,\n escalationCounts:\n report.escalationCounts ??\n buildEscalationCounts(\n report.reports.flatMap((remediationReport) => remediationReport.results),\n ),\n patchesDir: report.patchesDir,\n correlation: report.correlation,\n provenance: report.provenance,\n constraints: report.constraints,\n idempotencyKey: report.idempotencyKey,\n llmUsageCount: report.llmUsageCount,\n estimatedCostUsd: report.estimatedCostUsd,\n totalLlmLatencyMs: report.totalLlmLatencyMs,\n slaBreaches: report.slaBreaches,\n slaBreachSummary: buildSlaBreachSummary(report.reports),\n dispositionCounts: report.dispositionCounts,\n simulationSummary: report.simulationSummary,\n };\n}\n\nexport function ciExitCode(summary: CiSummary): number {\n return summary.failedCount > 0 ? 1 : 0;\n}\n","import type { ScanReport } from \"./contracts.js\";\n\ntype SarifLevel = \"error\" | \"warning\" | \"note\" | \"none\";\n\ninterface SarifRule {\n id: string;\n name: string;\n shortDescription: { text: string };\n fullDescription: { text: string };\n defaultConfiguration: { level: SarifLevel };\n helpUri: string;\n properties: { severity: string };\n}\n\ninterface SarifResult {\n ruleId: string;\n level: SarifLevel;\n message: { text: string };\n locations: Array<{\n physicalLocation: {\n artifactLocation: { uri: string; uriBaseId: string };\n };\n }>;\n}\n\nexport interface SarifOutput {\n version: \"2.1.0\";\n $schema: string;\n runs: Array<{\n tool: {\n driver: {\n name: string;\n informationUri: string;\n rules: SarifRule[];\n };\n };\n results: SarifResult[];\n }>;\n}\n\nfunction severityToSarifLevel(severity: string): SarifLevel {\n if (severity === \"CRITICAL\" || severity === \"HIGH\") return \"error\";\n if (severity === \"MEDIUM\") return \"warning\";\n if (severity === \"LOW\") return \"note\";\n return \"warning\";\n}\n\nexport function toSarifOutput(report: ScanReport): SarifOutput {\n const rules: SarifRule[] = [];\n const results: SarifResult[] = [];\n const seenRules = new Set<string>();\n\n for (const cveReport of report.reports) {\n const severity = cveReport.cveDetails?.severity ?? \"UNKNOWN\";\n const level = severityToSarifLevel(severity);\n const summary = cveReport.cveDetails?.summary ?? cveReport.cveId;\n\n if (!seenRules.has(cveReport.cveId)) {\n seenRules.add(cveReport.cveId);\n rules.push({\n id: cveReport.cveId,\n name: \"VulnerableDependency\",\n shortDescription: { text: cveReport.cveId },\n fullDescription: { text: summary },\n defaultConfiguration: { level },\n helpUri: `https://osv.dev/vulnerability/${cveReport.cveId}`,\n properties: { severity },\n });\n }\n\n for (const vulnerablePackage of cveReport.vulnerablePackages) {\n const fixText = vulnerablePackage.affected.firstPatchedVersion\n ? ` Fix: upgrade to ${vulnerablePackage.affected.firstPatchedVersion}.`\n : \" No fixed version available.\";\n results.push({\n ruleId: cveReport.cveId,\n level,\n message: {\n text: `${vulnerablePackage.installed.name}@${vulnerablePackage.installed.version} is vulnerable to ${cveReport.cveId}: ${summary}${fixText}`,\n },\n locations: [\n {\n physicalLocation: {\n artifactLocation: { uri: \"package.json\", uriBaseId: \"%SRCROOT%\" },\n },\n },\n ],\n });\n }\n }\n\n return {\n version: \"2.1.0\",\n $schema:\n \"https://raw.githubusercontent.com/oasis-tcs/sarif-spec/master/Documents/CommitteeSpecifications/2.1.0/sarif-schema-2.1.0.json\",\n runs: [\n {\n tool: {\n driver: {\n name: \"autoremediator\",\n informationUri: \"https://github.com/Rawlings/autoremediator\",\n rules,\n },\n },\n results,\n },\n ],\n };\n}\n","import { existsSync, mkdirSync, readFileSync, writeFileSync } from \"node:fs\";\nimport { dirname } from \"node:path\";\nimport { randomUUID } from \"node:crypto\";\nimport type { RemediationReport, VexSuppression } from \"../../platform/types.js\";\nimport type { ScanReport } from \"../contracts.js\";\n\nexport interface CycloneDxVexVulnerabilityAnalysis {\n state: \"resolved\" | \"not_affected\" | \"in_triage\";\n justification?: \"code_not_in_execute_path\" | \"code_not_reachable\" | (string & {});\n detail?: string;\n response?: (\"update\" | \"workaround_available\")[];\n}\n\nexport interface CycloneDxVexVulnerability {\n id: string;\n analysis: CycloneDxVexVulnerabilityAnalysis;\n}\n\nexport interface CycloneDxVexDocument {\n bomFormat: \"CycloneDX\";\n specVersion: \"1.5\";\n version: number;\n serialNumber: string;\n metadata: {\n timestamp: string;\n tools: Array<{ name: string; version: string }>;\n };\n vulnerabilities: CycloneDxVexVulnerability[];\n}\n\nexport interface ToCycloneDxVexOptions {\n toolVersion?: string;\n}\n\nfunction mapReportToVulnerability(report: RemediationReport): CycloneDxVexVulnerability {\n const hasResolved = report.results.some((r) => r.applied && !r.unresolvedReason);\n const hasSuppressed = report.results.some((r) => r.suppressedBy != null);\n const notReachableResult = report.results.find((r) => r.reachability?.status === \"not-reachable\");\n\n if (notReachableResult && !hasResolved) {\n return {\n id: report.cveId,\n analysis: {\n state: \"not_affected\",\n justification: notReachableResult.reachability?.justification ?? \"code_not_in_execute_path\",\n detail: notReachableResult.reachability?.reason ?? \"Code is not in execution path\",\n },\n };\n }\n\n if (hasSuppressed && !hasResolved) {\n const suppressed = report.results.find((r) => r.suppressedBy != null)!;\n return {\n id: report.cveId,\n analysis: {\n state: \"not_affected\",\n justification: suppressed.suppressedBy!.justification,\n detail: suppressed.suppressedBy!.notes ?? suppressed.suppressedBy!.justification,\n },\n };\n }\n\n if (hasResolved) {\n const resolvedResults = report.results.filter((r) => r.applied && !r.unresolvedReason);\n const hasVersionBumpOrOverride = resolvedResults.some(\n (r) => r.strategy === \"version-bump\" || r.strategy === \"override\",\n );\n const hasPatchFile = resolvedResults.some((r) => r.strategy === \"patch-file\");\n\n const response: (\"update\" | \"workaround_available\")[] = [];\n if (hasVersionBumpOrOverride) response.push(\"update\");\n if (hasPatchFile) response.push(\"workaround_available\");\n\n return {\n id: report.cveId,\n analysis: {\n state: \"resolved\",\n response: response.length > 0 ? response : undefined,\n },\n };\n }\n\n const firstUnresolved = report.results.find((r) => r.unresolvedReason);\n return {\n id: report.cveId,\n analysis: {\n state: \"in_triage\",\n detail: firstUnresolved?.unresolvedReason,\n },\n };\n}\n\nexport function toCycloneDxVex(\n report: ScanReport | RemediationReport,\n options: ToCycloneDxVexOptions = {},\n): CycloneDxVexDocument {\n const toolVersion = options.toolVersion ?? \"unknown\";\n const timestamp = new Date().toISOString();\n const serialNumber = `urn:uuid:${randomUUID()}`;\n\n let remediationReports: RemediationReport[];\n\n // Discriminate: ScanReport has `reports` array; RemediationReport has `cveId`\n if (\"reports\" in report && Array.isArray((report as ScanReport).reports)) {\n remediationReports = (report as ScanReport).reports;\n } else {\n remediationReports = [report as RemediationReport];\n }\n\n const vulnerabilities = remediationReports.map(mapReportToVulnerability);\n\n return {\n bomFormat: \"CycloneDX\",\n specVersion: \"1.5\",\n version: 1,\n serialNumber,\n metadata: {\n timestamp,\n tools: [{ name: \"autoremediator\", version: toolVersion }],\n },\n vulnerabilities,\n };\n}\n\n/**\n * Persists or updates a CycloneDX 1.5 VEX document with a suppressed vulnerability entry.\n */\nexport function saveSuppressionToVexDocument(\n filePath: string,\n suppression: VexSuppression,\n toolVersion = \"unknown\",\n): void {\n const targetDir = dirname(filePath);\n if (!existsSync(targetDir)) {\n mkdirSync(targetDir, { recursive: true });\n }\n\n let doc: CycloneDxVexDocument;\n if (existsSync(filePath)) {\n try {\n doc = JSON.parse(readFileSync(filePath, \"utf8\")) as CycloneDxVexDocument;\n } catch {\n doc = createEmptyVexDocument(toolVersion);\n }\n } else {\n doc = createEmptyVexDocument(toolVersion);\n }\n\n if (!Array.isArray(doc.vulnerabilities)) {\n doc.vulnerabilities = [];\n }\n\n const existingIndex = doc.vulnerabilities.findIndex(\n (v) => v.id.toUpperCase() === suppression.cveId.toUpperCase(),\n );\n\n const vulnEntry: CycloneDxVexVulnerability = {\n id: suppression.cveId,\n analysis: {\n state: \"not_affected\",\n justification: suppression.justification,\n detail: suppression.notes ?? suppression.justification,\n },\n };\n\n if (existingIndex >= 0) {\n doc.vulnerabilities[existingIndex] = vulnEntry;\n } else {\n doc.vulnerabilities.push(vulnEntry);\n }\n\n doc.metadata.timestamp = new Date().toISOString();\n doc.version = ((doc.version as number) ?? 1) + 1;\n\n writeFileSync(filePath, JSON.stringify(doc, null, 2) + \"\\n\", \"utf8\");\n}\n\nfunction createEmptyVexDocument(toolVersion: string): CycloneDxVexDocument {\n return {\n bomFormat: \"CycloneDX\",\n specVersion: \"1.5\",\n version: 1,\n serialNumber: `urn:uuid:${randomUUID()}`,\n metadata: {\n timestamp: new Date().toISOString(),\n tools: [{ name: \"autoremediator\", version: toolVersion }],\n },\n vulnerabilities: [],\n };\n}\n","import { existsSync } from \"node:fs\";\nimport { readdir, readFile, stat } from \"node:fs/promises\";\nimport { join } from \"node:path\";\nimport type {\n PatchArtifactInspection,\n PatchArtifactQueryOptions,\n PatchArtifactSummary,\n} from \"../../platform/types.js\";\nimport { validatePatchDiff } from \"../../remediation/strategies/patch-utils.js\";\nimport {\n readManifest,\n resolveArtifactPath,\n resolvePatchesDir,\n toSummary,\n derivePatchMetadata,\n} from \"./helpers.js\";\n\nexport async function listPatchArtifacts(\n options: PatchArtifactQueryOptions = {},\n): Promise<PatchArtifactSummary[]> {\n const cwd = options.cwd ?? process.cwd();\n const patchesDirPath = resolvePatchesDir(cwd, options.patchesDir);\n\n if (!existsSync(patchesDirPath)) {\n return [];\n }\n\n const entries = await readdir(patchesDirPath, { withFileTypes: true });\n const patchFiles = entries\n .filter((entry) => entry.isFile() && entry.name.endsWith(\".patch\"))\n .map((entry) => join(patchesDirPath, entry.name))\n .sort((left, right) => left.localeCompare(right));\n\n const summaries = await Promise.all(\n patchFiles.map(async (patchFilePath) => {\n const inspection = await inspectPatchArtifact(patchFilePath, options);\n return toSummary(inspection);\n }),\n );\n\n return summaries;\n}\n\nexport async function inspectPatchArtifact(\n patchFilePath: string,\n options: PatchArtifactQueryOptions = {},\n): Promise<PatchArtifactInspection> {\n const cwd = options.cwd ?? process.cwd();\n const resolvedPatchPath = resolveArtifactPath(cwd, patchFilePath);\n const patchFileName = resolvedPatchPath.split(\"/\").pop() ?? resolvedPatchPath;\n const manifestFilePath = `${resolvedPatchPath}.json`;\n\n if (!existsSync(resolvedPatchPath)) {\n return {\n patchFilePath: resolvedPatchPath,\n manifestFilePath: existsSync(manifestFilePath) ? manifestFilePath : undefined,\n patchFileName,\n exists: false,\n diffValid: false,\n formatError: \"Patch file does not exist.\",\n };\n }\n\n const [patchContent, fileStats, manifest] = await Promise.all([\n readFile(resolvedPatchPath, \"utf8\"),\n stat(resolvedPatchPath),\n readManifest(manifestFilePath),\n ]);\n\n const format = validatePatchDiff(patchContent);\n const derived = derivePatchMetadata(patchContent);\n\n return {\n patchFilePath: resolvedPatchPath,\n manifestFilePath: manifest ? manifestFilePath : undefined,\n patchFileName,\n cveId: manifest?.cveId,\n packageName: manifest?.packageName,\n vulnerableVersion: manifest?.vulnerableVersion,\n patchMode: manifest?.patchMode,\n confidence: manifest?.confidence,\n riskLevel: manifest?.riskLevel,\n generatedAt: manifest?.generatedAt,\n files: manifest?.files ?? derived.files,\n hunkCount: manifest?.hunkCount ?? derived.hunkCount,\n exists: true,\n diffValid: format.valid,\n formatError: format.error,\n patchSizeBytes: fileStats.size,\n lineCount: patchContent.split(/\\r?\\n/).length,\n manifest,\n };\n}\n","/**\n * Patch generation utilities for Autoremediator\n *\n * Provides functions for:\n * - Writing patch files to disk\n * - Validating unified diff format\n * - Managing patch-package integration\n * - Fetching source files from npm\n */\n\nimport { existsSync, mkdirSync, writeFileSync, readFileSync } from \"node:fs\";\nimport { join } from \"node:path\";\nimport { execa } from \"execa\";\nimport {\n detectPackageManager,\n getPackageManagerCommands,\n} from \"../../platform/package-manager/index.js\";\n\n/**\n * Validation result type for patch diffs\n */\nexport interface PatchValidationResult {\n valid: boolean;\n error?: string;\n}\n\n/**\n * Write a unified diff patch to the patches directory\n *\n * Creates patches/ directory if it doesn't exist and writes the patch with\n * naming convention: <packageName>+<version>.patch\n *\n * @param packageName - The npm package name\n * @param version - The package version\n * @param patchContent - The unified diff content\n * @param projectDir - Project root directory\n * @returns Full file path to the written patch file\n */\nexport function writePatchFile(\n packageName: string,\n version: string,\n patchContent: string,\n projectDir: string,\n): string {\n const patchesDir = join(projectDir, \"patches\");\n\n // Create patches directory if missing\n if (!existsSync(patchesDir)) {\n mkdirSync(patchesDir, { recursive: true });\n }\n\n // Sanitize package name for filename (remove @ from scoped packages)\n const safeName = packageName.replace(/^@/, \"\").replace(/\\//g, \"+\");\n const filename = `${safeName}+${version}.patch`;\n const filePath = join(patchesDir, filename);\n\n // Write patch file\n writeFileSync(filePath, patchContent, \"utf8\");\n\n return filePath;\n}\n\n/**\n * Validate that patch content matches unified diff format\n *\n * Checks for:\n * - Presence of --- and +++ header lines\n * - Presence of @@ hunk headers\n * - Valid unified diff structure\n *\n * @param patchContent - The patch content to validate\n * @returns Validation result with error details if invalid\n */\nexport function validatePatchDiff(patchContent: string): PatchValidationResult {\n if (!patchContent || typeof patchContent !== \"string\") {\n return {\n valid: false,\n error: \"Patch content must be a non-empty string\",\n };\n }\n\n // Check for basic unified diff structure\n const hasFromLine = /^---\\s+\\S+/m.test(patchContent);\n const hasToLine = /^\\+\\+\\+\\s+\\S+/m.test(patchContent);\n const hasHunkHeader = /^@@\\s+-\\d+/m.test(patchContent);\n\n if (!hasFromLine) {\n return {\n valid: false,\n error: 'Missing \"---\" line in patch format',\n };\n }\n\n if (!hasToLine) {\n return {\n valid: false,\n error: 'Missing \"+++\" line in patch format',\n };\n }\n\n if (!hasHunkHeader) {\n return {\n valid: false,\n error: \"No hunk headers (@@...) found in patch\",\n };\n }\n\n return { valid: true };\n}\n\n/**\n * Ensure patch-package is installed and configured\n *\n * Checks if patch-package is in devDependencies. If not, either:\n * - Installs it automatically (if not in dry-run context)\n * - Logs a warning with installation instructions\n *\n * Updates package.json postinstall script if needed:\n * Add \"postinstall\": \"patch-package\" or append to existing script\n *\n * @param projectDir - Project root directory\n * @returns Promise that resolves when patch-package is ensured\n */\nexport async function ensurePatchPackage(projectDir: string): Promise<void> {\n const pkgPath = join(projectDir, \"package.json\");\n\n // Read package.json\n let pkgJson: Record<string, unknown>;\n try {\n const content = readFileSync(pkgPath, \"utf8\");\n pkgJson = JSON.parse(content) as Record<string, unknown>;\n } catch (err) {\n throw new Error(\n `Failed to read package.json: ${err instanceof Error ? err.message : String(err)}`,\n );\n }\n\n const devDeps = (pkgJson.devDependencies as Record<string, string> | undefined) || {};\n\n // Check if patch-package is already installed\n if (devDeps[\"patch-package\"]) {\n return; // Already present\n }\n\n // Install patch-package\n try {\n const packageManager = detectPackageManager(projectDir);\n const commands = getPackageManagerCommands(packageManager);\n const [cmd, ...args] = commands.installDev(\"patch-package\");\n await execa(cmd, args, {\n cwd: projectDir,\n stdio: \"inherit\",\n });\n } catch (err) {\n throw new Error(\n `Failed to install patch-package: ${err instanceof Error ? err.message : String(err)}`,\n );\n }\n\n // Update postinstall script in package.json\n let scripts = (pkgJson.scripts as Record<string, string> | undefined) || {};\n const existingPostinstall = scripts.postinstall || \"\";\n const newPostinstall = existingPostinstall\n ? `${existingPostinstall} && patch-package`\n : \"patch-package\";\n\n scripts.postinstall = newPostinstall;\n pkgJson.scripts = scripts;\n\n // Write updated package.json\n try {\n writeFileSync(pkgPath, JSON.stringify(pkgJson, null, 2) + \"\\n\", \"utf8\");\n } catch (err) {\n throw new Error(\n `Failed to update package.json: ${err instanceof Error ? err.message : String(err)}`,\n );\n }\n}\n\n/**\n * Fetch the content of a specific file from an npm package\n *\n * Downloads the package tarball from npm, extracts the specified file,\n * and returns its content. Useful for LLM analysis of vulnerable source code.\n *\n * @param packageName - The npm package name\n * @param version - The package version\n * @param filePath - Path to file within package (relative to package root)\n * @returns Promise resolving to file content as string\n */\nexport async function getVulnerableFileContent(\n packageName: string,\n version: string,\n filePath: string,\n): Promise<string> {\n // Use npm view to fetch tarball URL\n let tarballUrl: string;\n try {\n const result = await execa(\"npm\", [\"view\", `${packageName}@${version}`, \"dist.tarball\"], {\n stdio: \"pipe\",\n });\n tarballUrl = (result.stdout as string).trim();\n } catch (err) {\n throw new Error(\n `Failed to get tarball URL for ${packageName}@${version}: ${\n err instanceof Error ? err.message : String(err)\n }`,\n );\n }\n\n if (!tarballUrl) {\n throw new Error(`No tarball URL found for ${packageName}@${version}`);\n }\n\n // Create temporary directory for extraction\n const tempDir = join(\"/tmp\", `autoremediator-${packageName}-${version}-${Date.now()}`);\n mkdirSync(tempDir, { recursive: true });\n\n try {\n // Alternative: use curl and tar\n await execa(\"bash\", [\"-c\", `curl -s \"${tarballUrl}\" | tar xz -C \"${tempDir}\"`]);\n\n // Read the file from extracted package (npm extracts under \"package/\" directory)\n const extractedPath = join(tempDir, \"package\", filePath);\n const content = readFileSync(extractedPath, \"utf8\");\n\n return content;\n } catch (err) {\n throw new Error(\n `Failed to fetch file ${filePath} from ${packageName}@${version}: ${\n err instanceof Error ? err.message : String(err)\n }`,\n );\n } finally {\n // Clean up temporary directory\n try {\n await execa(\"rm\", [\"-rf\", tempDir]);\n } catch {\n // Ignore cleanup errors\n }\n }\n}\n","import { existsSync, readFileSync } from \"node:fs\";\nimport { join } from \"node:path\";\nimport { execa } from \"execa\";\nimport type { PackageManager, RemediationConstraints } from \"../types.js\";\nimport { parsePackageManagerListOutput } from \"./list-parser.js\";\nexport * from \"./driver.js\";\n\nexport type { PackageManager };\n\nexport interface PackageManagerCommands {\n install: string[];\n installPreferOffline: string[];\n installDeterministic: string[];\n installDev: (pkg: string) => string[];\n test: string[];\n list: string[];\n lockfileName: string;\n}\n\n/**\n * Detect the installed yarn major version by running `yarn --version`.\n * Returns 1 for classic yarn (1.x), or the actual major for berry (2+).\n * Falls back to 1 when the version cannot be determined.\n */\nexport async function getYarnMajorVersion(cwd: string): Promise<number> {\n try {\n const result = await execa(\"yarn\", [\"--version\"], { cwd, stdio: \"pipe\" });\n const major = Number.parseInt(result.stdout.trim().split(\".\")[0] ?? \"1\", 10);\n return Number.isNaN(major) ? 1 : major;\n } catch {\n return 1;\n }\n}\n\nexport function detectPackageManager(cwd: string): PackageManager {\n if (existsSync(join(cwd, \"pnpm-lock.yaml\"))) return \"pnpm\";\n if (existsSync(join(cwd, \"yarn.lock\"))) return \"yarn\";\n if (existsSync(join(cwd, \"bun.lockb\")) || existsSync(join(cwd, \"bun.lock\"))) return \"bun\";\n if (existsSync(join(cwd, \"deno.lock\"))) return \"deno\";\n return \"npm\";\n}\n\nfunction withWorkspace(command: string[], pm: PackageManager, workspace?: string): string[] {\n if (!workspace) return command;\n\n if (pm === \"pnpm\") {\n // pnpm expects filters before the subcommand: pnpm --filter <selector> install\n return [command[0], \"--filter\", workspace, ...command.slice(1)];\n }\n\n if (pm === \"npm\") {\n return [...command, \"--workspace\", workspace];\n }\n\n // Bun, Deno, and Yarn workspace command semantics differ by version; keep default behavior.\n return command;\n}\n\nexport function resolveInstallCommand(\n pm: PackageManager,\n constraints?: RemediationConstraints,\n yarnMajor?: number,\n): string[] {\n const installMode = constraints?.installMode ?? \"deterministic\";\n const preferOfflineOverride = constraints?.installPreferOffline;\n const frozenOverride = constraints?.enforceFrozenLockfile;\n\n // Bun: frozen-lockfile flag\n if (pm === \"bun\") {\n const frozen = frozenOverride ?? installMode === \"deterministic\";\n const command = [\"bun\", \"install\"];\n if (frozen) command.push(\"--frozen-lockfile\");\n return withWorkspace(command, pm, constraints?.workspace);\n }\n\n // Deno: --frozen flag; approximate prefer-offline with --cache-only\n if (pm === \"deno\") {\n const frozen = frozenOverride ?? installMode === \"deterministic\";\n const preferOffline = preferOfflineOverride ?? installMode === \"prefer-offline\";\n const command = [\"deno\", \"install\"];\n if (frozen) command.push(\"--frozen\");\n if (preferOffline && !frozen) command.push(\"--cache-only\");\n return withWorkspace(command, pm, constraints?.workspace);\n }\n\n const includePreferOffline =\n pm !== \"yarn\" && (preferOfflineOverride ?? installMode !== \"standard\");\n\n let includeFrozenLockfile = pm !== \"npm\" && (frozenOverride ?? installMode === \"deterministic\");\n\n if (frozenOverride === false) {\n includeFrozenLockfile = false;\n }\n\n const useNpmCi =\n pm === \"npm\" &&\n (frozenOverride === true || (frozenOverride === undefined && installMode === \"deterministic\"));\n\n const command: string[] = [pm, pm === \"npm\" ? (useNpmCi ? \"ci\" : \"install\") : \"install\"];\n\n if (includeFrozenLockfile) {\n // Yarn Berry (v2+) uses --immutable instead of --frozen-lockfile\n const isYarnBerry = pm === \"yarn\" && (yarnMajor ?? 1) >= 2;\n command.push(isYarnBerry ? \"--immutable\" : \"--frozen-lockfile\");\n }\n\n if (includePreferOffline) {\n command.push(\"--prefer-offline\");\n }\n\n return withWorkspace(command, pm, constraints?.workspace);\n}\n\nexport function resolveListCommand(\n pm: PackageManager,\n constraints?: RemediationConstraints,\n): string[] {\n if (pm === \"deno\") {\n // Deno inventory is built by reading deno.lock directly, not via a shell command.\n // Callers that receive an empty array should use resolveDenoInventory() instead.\n return [];\n }\n\n const base =\n pm === \"pnpm\"\n ? [\"pnpm\", \"list\", \"--json\", \"--depth\", \"99\"]\n : pm === \"yarn\"\n ? [\"yarn\", \"list\", \"--json\"]\n : pm === \"bun\"\n ? [\"bun\", \"pm\", \"ls\", \"--all\"]\n : [\"npm\", \"list\", \"--json\", \"--all\"];\n\n return withWorkspace(base, pm, constraints?.workspace);\n}\n\nexport function resolveTestCommand(\n pm: PackageManager,\n constraints?: RemediationConstraints,\n): string[] {\n const base =\n pm === \"pnpm\"\n ? [\"pnpm\", \"test\"]\n : pm === \"yarn\"\n ? [\"yarn\", \"test\"]\n : pm === \"bun\"\n ? [\"bun\", \"test\"]\n : pm === \"deno\"\n ? [\"deno\", \"test\"]\n : [\"npm\", \"test\"];\n return withWorkspace(base, pm, constraints?.workspace);\n}\n\nexport function resolveTypecheckCommand(\n pm: PackageManager,\n constraints?: RemediationConstraints,\n cwd: string = process.cwd(),\n): string[] {\n const pkgJsonPath = join(cwd, \"package.json\");\n let hasTypecheckScript = false;\n const hasTsConfig = existsSync(join(cwd, \"tsconfig.json\"));\n\n if (existsSync(pkgJsonPath)) {\n try {\n const pkg = JSON.parse(readFileSync(pkgJsonPath, \"utf8\")) as {\n scripts?: Record<string, string>;\n };\n if (pkg.scripts?.typecheck) {\n hasTypecheckScript = true;\n }\n } catch {\n // Ignore\n }\n }\n\n if (hasTypecheckScript) {\n const base = [pm, \"run\", \"typecheck\"];\n return withWorkspace(base, pm, constraints?.workspace);\n }\n\n if (hasTsConfig) {\n if (pm === \"deno\") {\n return withWorkspace([\"deno\", \"check\"], pm, constraints?.workspace);\n }\n const base = [\"npx\", \"tsc\", \"--noEmit\"];\n return withWorkspace(base, pm, constraints?.workspace);\n }\n\n return [];\n}\n\nexport function resolveAuditCommand(\n pm: PackageManager,\n constraints?: RemediationConstraints,\n): string[] {\n if (pm === \"deno\") {\n throw new Error(\n \"Deno does not support a native audit command. Use --input with a SARIF or npm-audit scan file instead.\",\n );\n }\n const base = pm === \"yarn\" ? [\"yarn\", \"audit\", \"--json\"] : [pm, \"audit\", \"--json\"];\n return withWorkspace(base, pm, constraints?.workspace);\n}\n\nexport function resolveWhyCommand(\n pm: PackageManager,\n packageName: string,\n constraints?: RemediationConstraints,\n): string[] {\n if (pm === \"deno\") return [];\n if (pm === \"bun\") {\n const base = [\"bun\", \"pm\", \"why\", packageName];\n return withWorkspace(base, pm, constraints?.workspace);\n }\n const base = pm === \"npm\" ? [\"npm\", \"explain\", packageName] : [pm, \"why\", packageName];\n return withWorkspace(base, pm, constraints?.workspace);\n}\n\nexport function resolveDedupeCommand(\n pm: PackageManager,\n constraints?: RemediationConstraints,\n): string[] {\n if (pm === \"bun\" || pm === \"deno\") return [];\n const base = [pm, \"dedupe\"];\n return withWorkspace(base, pm, constraints?.workspace);\n}\n\nexport function getPackageManagerCommands(pm: PackageManager): PackageManagerCommands {\n if (pm === \"pnpm\") {\n return {\n install: [\"pnpm\", \"install\"],\n installPreferOffline: [\"pnpm\", \"install\", \"--prefer-offline\"],\n installDeterministic: resolveInstallCommand(\"pnpm\", { installMode: \"deterministic\" }),\n installDev: (pkg: string) => [\"pnpm\", \"add\", \"-D\", pkg],\n test: [\"pnpm\", \"test\"],\n list: [\"pnpm\", \"list\", \"--json\", \"--depth\", \"99\"],\n lockfileName: \"pnpm-lock.yaml\",\n };\n }\n\n if (pm === \"yarn\") {\n return {\n install: [\"yarn\", \"install\"],\n installPreferOffline: [\"yarn\", \"install\"],\n installDeterministic: resolveInstallCommand(\"yarn\", { installMode: \"deterministic\" }),\n installDev: (pkg: string) => [\"yarn\", \"add\", \"--dev\", pkg],\n test: [\"yarn\", \"test\"],\n list: [\"yarn\", \"list\", \"--json\"],\n lockfileName: \"yarn.lock\",\n };\n }\n\n if (pm === \"bun\") {\n return {\n install: [\"bun\", \"install\"],\n installPreferOffline: [\"bun\", \"install\"],\n installDeterministic: resolveInstallCommand(\"bun\", { installMode: \"deterministic\" }),\n installDev: (pkg: string) => [\"bun\", \"add\", \"-d\", pkg],\n test: [\"bun\", \"test\"],\n list: [\"bun\", \"pm\", \"ls\", \"--all\"],\n lockfileName: \"bun.lockb\",\n };\n }\n\n if (pm === \"deno\") {\n return {\n install: [\"deno\", \"install\"],\n installPreferOffline: [\"deno\", \"install\", \"--cache-only\"],\n installDeterministic: resolveInstallCommand(\"deno\", { installMode: \"deterministic\" }),\n installDev: (pkg: string) => [\"deno\", \"add\", pkg],\n test: [\"deno\", \"test\"],\n list: [],\n lockfileName: \"deno.lock\",\n };\n }\n\n return {\n install: [\"npm\", \"install\"],\n installPreferOffline: [\"npm\", \"install\", \"--prefer-offline\"],\n installDeterministic: resolveInstallCommand(\"npm\", { installMode: \"deterministic\" }),\n installDev: (pkg: string) => [\"npm\", \"install\", \"--save-dev\", pkg],\n test: [\"npm\", \"test\"],\n list: [\"npm\", \"list\", \"--json\", \"--all\"],\n lockfileName: \"package-lock.json\",\n };\n}\n\nexport function parseListOutput(pm: PackageManager, stdout: string): Map<string, string> {\n return parsePackageManagerListOutput(pm, stdout);\n}\n","import { readFileSync } from \"node:fs\";\nimport { join } from \"node:path\";\nimport type { PackageManager } from \"./index.js\";\n\nexport function parsePackageManagerListOutput(\n pm: PackageManager,\n stdout: string,\n): Map<string, string> {\n const versions = new Map<string, string>();\n\n if (pm === \"bun\") {\n return parseBunListOutput(stdout, versions);\n }\n\n if (!stdout.trim()) return versions;\n\n if (pm === \"yarn\") {\n return parseYarnListOutput(stdout, versions);\n }\n\n let parsed: unknown;\n try {\n parsed = JSON.parse(stdout);\n } catch {\n return versions;\n }\n\n const root = Array.isArray(parsed) ? parsed[0] : parsed;\n collectDependencyTree(\n (root as { dependencies?: Record<string, DependencyTree> } | undefined)?.dependencies,\n versions,\n );\n\n return versions;\n}\n\ntype DependencyTree = {\n version?: string;\n dependencies?: Record<string, DependencyTree>;\n};\n\nfunction parseYarnListOutput(stdout: string, versions: Map<string, string>): Map<string, string> {\n const lines = stdout\n .split(\"\\n\")\n .map((line) => line.trim())\n .filter(Boolean);\n\n for (const line of lines) {\n try {\n const obj = JSON.parse(line) as {\n type?: string;\n data?: { trees?: Array<{ name?: string }> };\n };\n if (obj.type !== \"tree\") continue;\n\n for (const tree of obj.data?.trees ?? []) {\n const raw = tree.name ?? \"\";\n const at = raw.lastIndexOf(\"@\");\n if (at <= 0) continue;\n\n const name = raw.slice(0, at);\n const version = raw.slice(at + 1);\n if (name && version) {\n versions.set(name, version);\n }\n }\n } catch {\n // Ignore non-json lines from yarn output.\n }\n }\n\n return versions;\n}\n\nfunction collectDependencyTree(\n tree: Record<string, DependencyTree> | undefined,\n versions: Map<string, string>,\n): void {\n if (!tree) return;\n\n for (const [name, entry] of Object.entries(tree)) {\n if (!entry || typeof entry !== \"object\") continue;\n const version = entry.version;\n if (typeof version === \"string\" && version) {\n versions.set(name, version);\n }\n collectDependencyTree(entry.dependencies, versions);\n }\n}\n\n/**\n * Parse `bun pm ls --all` text output.\n * Each dependency line ends with `name@version`; leading tree-drawing characters\n * (├──, └──, │, spaces) are stripped before splitting on the last `@`.\n */\nfunction parseBunListOutput(stdout: string, versions: Map<string, string>): Map<string, string> {\n const lines = stdout\n .split(\"\\n\")\n .map((line) => line.replace(/^[\\s│├└─]+/, \"\").trim())\n .filter(Boolean);\n\n for (const line of lines) {\n const at = line.lastIndexOf(\"@\");\n if (at <= 0) continue;\n const name = line.slice(0, at);\n const version = line.slice(at + 1);\n if (name && version) {\n versions.set(name, version);\n }\n }\n\n return versions;\n}\n\n/**\n * Read `deno.lock` JSON from disk and extract installed npm package versions.\n * Supports both deno.lock v3 (packages.npm map) and v4 (packages object with npm: prefix keys).\n */\nexport function resolveDenoInventory(cwd: string): Map<string, string> {\n const versions = new Map<string, string>();\n let raw: string;\n try {\n raw = readFileSync(join(cwd, \"deno.lock\"), \"utf8\");\n } catch {\n return versions;\n }\n\n let lock: unknown;\n try {\n lock = JSON.parse(raw);\n } catch {\n return versions;\n }\n\n if (!lock || typeof lock !== \"object\") return versions;\n const lockObj = lock as Record<string, unknown>;\n\n // deno.lock v3: { version: \"3\", packages: { npm: { \"pkg@version\": ... } } }\n const packages = lockObj[\"packages\"];\n if (packages && typeof packages === \"object\") {\n const pkgsObj = packages as Record<string, unknown>;\n\n // v3 format: packages.npm keys are \"name@version\"\n const npmMap = pkgsObj[\"npm\"];\n if (npmMap && typeof npmMap === \"object\") {\n for (const key of Object.keys(npmMap as object)) {\n extractNameVersion(key, versions);\n }\n return versions;\n }\n\n // v4 format: packages keys may be \"npm:name@version\"\n for (const key of Object.keys(pkgsObj)) {\n const stripped = key.startsWith(\"npm:\") ? key.slice(4) : key;\n extractNameVersion(stripped, versions);\n }\n }\n\n return versions;\n}\n\nfunction extractNameVersion(spec: string, versions: Map<string, string>): void {\n // Handle scoped packages: \"@scope/name@version\" — lastIndexOf('@') after index 0\n const at = spec.lastIndexOf(\"@\");\n if (at <= 0) return;\n const name = spec.slice(0, at);\n const version = spec.slice(at + 1);\n if (name && version) {\n versions.set(name, version);\n }\n}\n","import { existsSync } from \"node:fs\";\nimport { join } from \"node:path\";\nimport type { PackageManager, RemediationConstraints } from \"../types.js\";\n\nexport type Ecosystem = \"npm\";\n\nexport interface PackageManagerDriver {\n id: PackageManager;\n ecosystem: Ecosystem;\n lockfileName: string;\n detect(cwd: string): boolean;\n resolveInstallCommand(constraints?: RemediationConstraints, yarnMajor?: number): string[];\n resolveTestCommand(constraints?: RemediationConstraints): string[];\n resolveAuditCommand(options?: { workspace?: string }): string[];\n resolveDedupeCommand?(constraints?: RemediationConstraints): string[] | undefined;\n}\n\nfunction withWorkspace(command: string[], pm: PackageManager, workspace?: string): string[] {\n if (!workspace) return command;\n if (pm === \"pnpm\") return [command[0], \"--filter\", workspace, ...command.slice(1)];\n if (pm === \"npm\") return [...command, \"--workspace\", workspace];\n return command;\n}\n\nexport const npmDriver: PackageManagerDriver = {\n id: \"npm\",\n ecosystem: \"npm\",\n lockfileName: \"package-lock.json\",\n detect: (cwd) => existsSync(join(cwd, \"package-lock.json\")),\n resolveInstallCommand(constraints) {\n const installMode = constraints?.installMode ?? \"deterministic\";\n const frozenOverride = constraints?.enforceFrozenLockfile;\n const preferOfflineOverride = constraints?.installPreferOffline;\n const useCi =\n frozenOverride === true || (frozenOverride === undefined && installMode === \"deterministic\");\n const cmd = [\"npm\", useCi ? \"ci\" : \"install\"];\n if (!useCi && (preferOfflineOverride ?? installMode !== \"standard\")) {\n cmd.push(\"--prefer-offline\");\n }\n return withWorkspace(cmd, \"npm\", constraints?.workspace);\n },\n resolveTestCommand: (constraints) =>\n withWorkspace([\"npm\", \"test\"], \"npm\", constraints?.workspace),\n resolveAuditCommand: (opts) => withWorkspace([\"npm\", \"audit\", \"--json\"], \"npm\", opts?.workspace),\n resolveDedupeCommand: (constraints) =>\n withWorkspace([\"npm\", \"dedupe\"], \"npm\", constraints?.workspace),\n};\n\nexport const pnpmDriver: PackageManagerDriver = {\n id: \"pnpm\",\n ecosystem: \"npm\",\n lockfileName: \"pnpm-lock.yaml\",\n detect: (cwd) => existsSync(join(cwd, \"pnpm-lock.yaml\")),\n resolveInstallCommand(constraints) {\n const installMode = constraints?.installMode ?? \"deterministic\";\n const frozen = constraints?.enforceFrozenLockfile ?? installMode === \"deterministic\";\n const preferOffline = constraints?.installPreferOffline ?? installMode !== \"standard\";\n const cmd = [\"pnpm\", \"install\"];\n if (frozen) cmd.push(\"--frozen-lockfile\");\n if (preferOffline) cmd.push(\"--prefer-offline\");\n return withWorkspace(cmd, \"pnpm\", constraints?.workspace);\n },\n resolveTestCommand: (constraints) =>\n withWorkspace([\"pnpm\", \"test\"], \"pnpm\", constraints?.workspace),\n resolveAuditCommand: (opts) =>\n withWorkspace([\"pnpm\", \"audit\", \"--json\"], \"pnpm\", opts?.workspace),\n resolveDedupeCommand: (constraints) =>\n withWorkspace([\"pnpm\", \"dedupe\"], \"pnpm\", constraints?.workspace),\n};\n\nexport const yarnDriver: PackageManagerDriver = {\n id: \"yarn\",\n ecosystem: \"npm\",\n lockfileName: \"yarn.lock\",\n detect: (cwd) => existsSync(join(cwd, \"yarn.lock\")),\n resolveInstallCommand(constraints, yarnMajor = 1) {\n const installMode = constraints?.installMode ?? \"deterministic\";\n const frozen = constraints?.enforceFrozenLockfile ?? installMode === \"deterministic\";\n const cmd = [\"yarn\", \"install\"];\n if (frozen) {\n if (yarnMajor >= 2) cmd.push(\"--immutable\");\n else cmd.push(\"--frozen-lockfile\");\n }\n return withWorkspace(cmd, \"yarn\", constraints?.workspace);\n },\n resolveTestCommand: (constraints) =>\n withWorkspace([\"yarn\", \"test\"], \"yarn\", constraints?.workspace),\n resolveAuditCommand: (opts) =>\n withWorkspace([\"yarn\", \"audit\", \"--json\"], \"yarn\", opts?.workspace),\n resolveDedupeCommand: (constraints) =>\n withWorkspace([\"yarn\", \"dedupe\"], \"yarn\", constraints?.workspace),\n};\n\nexport const bunDriver: PackageManagerDriver = {\n id: \"bun\",\n ecosystem: \"npm\",\n lockfileName: \"bun.lockb\",\n detect: (cwd) => existsSync(join(cwd, \"bun.lockb\")) || existsSync(join(cwd, \"bun.lock\")),\n resolveInstallCommand(constraints) {\n const installMode = constraints?.installMode ?? \"deterministic\";\n const frozen = constraints?.enforceFrozenLockfile ?? installMode === \"deterministic\";\n const cmd = [\"bun\", \"install\"];\n if (frozen) cmd.push(\"--frozen-lockfile\");\n return withWorkspace(cmd, \"bun\", constraints?.workspace);\n },\n resolveTestCommand: (constraints) =>\n withWorkspace([\"bun\", \"test\"], \"bun\", constraints?.workspace),\n resolveAuditCommand: () => [\"bun\", \"audit\", \"--json\"],\n};\n\nexport const denoDriver: PackageManagerDriver = {\n id: \"deno\",\n ecosystem: \"npm\",\n lockfileName: \"deno.lock\",\n detect: (cwd) => existsSync(join(cwd, \"deno.lock\")) || existsSync(join(cwd, \"deno.json\")),\n resolveInstallCommand(constraints) {\n const installMode = constraints?.installMode ?? \"deterministic\";\n const frozen = constraints?.enforceFrozenLockfile ?? installMode === \"deterministic\";\n const preferOffline = constraints?.installPreferOffline ?? installMode === \"prefer-offline\";\n const cmd = [\"deno\", \"install\"];\n if (frozen) cmd.push(\"--frozen\");\n if (preferOffline && !frozen) cmd.push(\"--cache-only\");\n return withWorkspace(cmd, \"deno\", constraints?.workspace);\n },\n resolveTestCommand: (constraints) =>\n withWorkspace([\"deno\", \"test\"], \"deno\", constraints?.workspace),\n resolveAuditCommand: () => {\n throw new Error(\n \"Deno does not support a native audit command. Use --input with a SARIF or npm-audit scan file instead.\",\n );\n },\n};\n\nconst driverRegistry = new Map<PackageManager, PackageManagerDriver>([\n [\"npm\", npmDriver],\n [\"pnpm\", pnpmDriver],\n [\"yarn\", yarnDriver],\n [\"bun\", bunDriver],\n [\"deno\", denoDriver],\n]);\n\nexport function getDriver(pm: PackageManager): PackageManagerDriver {\n const driver = driverRegistry.get(pm);\n if (!driver) {\n throw new Error(`Unsupported package manager: ${pm}`);\n }\n return driver;\n}\n\nexport function detectPackageManagerDriver(cwd: string): PackageManagerDriver {\n if (pnpmDriver.detect(cwd)) return pnpmDriver;\n if (yarnDriver.detect(cwd)) return yarnDriver;\n if (bunDriver.detect(cwd)) return bunDriver;\n if (denoDriver.detect(cwd)) return denoDriver;\n return npmDriver;\n}\n\nexport function registerPackageManagerDriver(driver: PackageManagerDriver): void {\n driverRegistry.set(driver.id, driver);\n}\n","import { existsSync } from \"node:fs\";\nimport { readFile } from \"node:fs/promises\";\nimport { isAbsolute, resolve, sep } from \"node:path\";\nimport type {\n PatchArtifact,\n PatchArtifactInspection,\n PatchArtifactSummary,\n} from \"../../platform/types.js\";\n\nexport const DEFAULT_PATCHES_DIR = \"./patches\";\n\nexport function resolvePatchesDir(cwd: string, patchesDir = DEFAULT_PATCHES_DIR): string {\n return isAbsolute(patchesDir) ? patchesDir : resolve(cwd, patchesDir);\n}\n\nexport function resolveArtifactPath(cwd: string, patchFilePath: string): string {\n const resolved = isAbsolute(patchFilePath) ? patchFilePath : resolve(cwd, patchFilePath);\n if (!resolved.endsWith(\".patch\")) {\n throw new Error(`patchFilePath must point to a .patch file: ${patchFilePath}`);\n }\n const patchesRoot = resolvePatchesDir(cwd);\n if (!resolved.startsWith(patchesRoot + sep)) {\n throw new Error(`patchFilePath must be inside the patches directory: ${patchFilePath}`);\n }\n return resolved;\n}\n\nexport async function readManifest(manifestFilePath: string): Promise<PatchArtifact | undefined> {\n if (!existsSync(manifestFilePath)) {\n return undefined;\n }\n\n try {\n const raw = await readFile(manifestFilePath, \"utf8\");\n const parsed = JSON.parse(raw);\n if (\n parsed === null ||\n typeof parsed !== \"object\" ||\n parsed.schemaVersion !== \"1.0\" ||\n typeof parsed.packageName !== \"string\" ||\n typeof parsed.vulnerableVersion !== \"string\" ||\n typeof parsed.patchFilePath !== \"string\" ||\n typeof parsed.patchFileName !== \"string\" ||\n typeof parsed.applied !== \"boolean\" ||\n typeof parsed.dryRun !== \"boolean\" ||\n typeof parsed.generatedAt !== \"string\"\n ) {\n return undefined;\n }\n return parsed as PatchArtifact;\n } catch {\n return undefined;\n }\n}\n\nexport function derivePatchMetadata(patchContent: string): { files: string[]; hunkCount: number } {\n const files = Array.from(\n new Set(\n patchContent\n .split(/\\r?\\n/)\n .filter((line) => line.startsWith(\"+++ b/\"))\n .map((line) => line.slice(\"+++ b/\".length)),\n ),\n );\n const hunkCount = patchContent.split(/\\r?\\n/).filter((line) => line.startsWith(\"@@ \")).length;\n\n return { files, hunkCount };\n}\n\nexport function toSummary(inspection: PatchArtifactInspection): PatchArtifactSummary {\n return {\n patchFilePath: inspection.patchFilePath,\n manifestFilePath: inspection.manifestFilePath,\n patchFileName: inspection.patchFileName,\n cveId: inspection.cveId,\n packageName: inspection.packageName,\n vulnerableVersion: inspection.vulnerableVersion,\n patchMode: inspection.patchMode,\n confidence: inspection.confidence,\n riskLevel: inspection.riskLevel,\n generatedAt: inspection.generatedAt,\n files: inspection.files,\n hunkCount: inspection.hunkCount,\n diffValid: inspection.diffValid,\n };\n}\n","import { tool } from \"ai\";\nimport type { z } from \"zod\";\n\ntype AnyZodSchema = z.ZodTypeAny;\n\nexport interface CompatToolConfig<TSchema extends AnyZodSchema, TResult> {\n description: string;\n parameters: TSchema;\n execute: (input: z.infer<TSchema>) => Promise<TResult> | TResult;\n}\n\nexport type ExecutableTool<TSchema extends AnyZodSchema, TResult> = {\n description: string;\n parameters: TSchema;\n execute: (input: z.input<TSchema>) => Promise<TResult>;\n};\n\nexport function defineTool<TSchema extends AnyZodSchema, TResult>(\n config: CompatToolConfig<TSchema, TResult>,\n): ExecutableTool<TSchema, TResult> {\n return tool(config as any) as unknown as ExecutableTool<TSchema, TResult>;\n}\n","/**\n * Tool: check-inventory\n *\n * Reads the consumer's package.json and installed dependency tree to produce\n * a flat list of installed packages and their resolved versions.\n */\nimport { defineTool } from \"./tool-compat.js\";\nimport { z } from \"zod\";\nimport { readFileSync } from \"node:fs\";\nimport { join } from \"node:path\";\nimport { execa } from \"execa\";\nimport type { InventoryPackage } from \"../../platform/types.js\";\nimport {\n detectPackageManager,\n parseListOutput,\n resolveListCommand,\n type PackageManager,\n} from \"../../platform/package-manager/index.js\";\nimport { resolveDenoInventory } from \"../../platform/package-manager/list-parser.js\";\nimport { loadPolicy } from \"../../platform/policy.js\";\nimport semver from \"semver\";\nimport { findDeclaringWorkspacePackage } from \"../../platform/workspace.js\";\n\ninterface PackageJson {\n dependencies?: Record<string, string>;\n devDependencies?: Record<string, string>;\n peerDependencies?: Record<string, string>;\n}\n\nexport function resolveInventoryVersion(rawVersion: string): string {\n const trimmed = rawVersion.trim();\n if (semver.valid(trimmed)) {\n return semver.clean(trimmed) ?? trimmed;\n }\n\n let spec = trimmed;\n if (spec.startsWith(\"npm:\") && spec.includes(\"@\")) {\n spec = spec.slice(spec.lastIndexOf(\"@\") + 1);\n }\n if (spec.startsWith(\"workspace:\")) {\n spec = spec.slice(\"workspace:\".length).trim();\n }\n\n if (semver.valid(spec)) {\n return semver.clean(spec) ?? spec;\n }\n\n try {\n const min = semver.minVersion(spec);\n if (min?.version && semver.valid(min.version)) {\n return min.version;\n }\n } catch {\n // Invalid semver range syntax\n }\n\n try {\n const coerced = semver.coerce(spec);\n if (coerced?.version && semver.valid(coerced.version)) {\n return coerced.version;\n }\n } catch {\n // Coercion failure\n }\n\n return semver.clean(trimmed) ?? trimmed;\n}\n\nexport const checkInventoryTool = defineTool({\n description:\n \"Read the project's package.json and installed dependencies to list packages and exact versions. Must be called before checking version matches.\",\n parameters: z.object({\n cwd: z.string().describe(\"Absolute path to the consumer project's root directory\"),\n packageManager: z\n .enum([\"npm\", \"pnpm\", \"yarn\", \"bun\", \"deno\"])\n .optional()\n .describe(\"Package manager used by the target project (auto-detected if omitted)\"),\n policy: z\n .string()\n .optional()\n .describe(\"Optional path to .github/autoremediator.yml policy file\"),\n workspace: z.string().optional().describe(\"Optional workspace/package selector for monorepos\"),\n }),\n execute: async ({\n cwd,\n packageManager,\n policy,\n workspace,\n }): Promise<{ packages: InventoryPackage[]; error?: string }> => {\n let pkgJson: PackageJson;\n\n try {\n pkgJson = JSON.parse(readFileSync(join(cwd, \"package.json\"), \"utf8\")) as PackageJson;\n } catch {\n return {\n packages: [],\n error: `Could not read package.json in \"${cwd}\". Is this a Node.js project?`,\n };\n }\n\n const pm = (packageManager ?? detectPackageManager(cwd)) as PackageManager;\n const loadedPolicy = loadPolicy(cwd, policy);\n const listCommand = resolveListCommand(pm, {\n ...loadedPolicy.constraints,\n workspace: workspace ?? loadedPolicy.constraints?.workspace,\n });\n let installedVersions = new Map<string, string>();\n\n if (pm === \"deno\") {\n // Deno inventory is built from deno.lock directly, not a shell command.\n installedVersions = resolveDenoInventory(cwd);\n } else {\n try {\n const [cmd, ...args] = listCommand;\n if (cmd) {\n const listResult = await execa(cmd, args, {\n cwd,\n stdio: \"pipe\",\n reject: false,\n });\n installedVersions = parseListOutput(pm, listResult.stdout || \"\");\n }\n } catch {\n // Fallback to package.json-only view when list command fails.\n }\n }\n\n const packages: InventoryPackage[] = [];\n\n for (const [name, version] of installedVersions.entries()) {\n const declaringWorkspace = findDeclaringWorkspacePackage(cwd, name, workspace);\n const isDirect =\n Boolean(pkgJson.dependencies?.[name]) ||\n Boolean(pkgJson.devDependencies?.[name]) ||\n Boolean(pkgJson.peerDependencies?.[name]) ||\n Boolean(declaringWorkspace);\n\n packages.push({\n name,\n version,\n type: isDirect ? \"direct\" : \"transitive\",\n });\n }\n\n if (packages.length === 0) {\n // Fallback: direct deps from package.json (best-effort versions)\n const allDeps = {\n ...pkgJson.dependencies,\n ...pkgJson.devDependencies,\n ...pkgJson.peerDependencies,\n };\n for (const [name, rawVersion] of Object.entries(allDeps)) {\n const version = resolveInventoryVersion(rawVersion);\n packages.push({ name, version, type: \"direct\" });\n }\n }\n\n return { packages };\n },\n});\n","import { existsSync, mkdirSync, readFileSync, writeFileSync } from \"node:fs\";\nimport { dirname, join } from \"node:path\";\nimport { parse as yamlParse, stringify as yamlStringify } from \"yaml\";\nimport type {\n CveSeverity,\n DispositionPolicy,\n EscalationGraph,\n ExploitSignalOverridePolicy,\n PatchConfidenceThresholds,\n RemediationConstraints,\n SlaBreach,\n SlaPolicy,\n VexSuppression,\n} from \"./types.js\";\n\nexport interface AutoremediatorPolicy {\n allowMajorBumps: boolean;\n denyPackages: string[];\n allowPackages: string[];\n constraints?: RemediationConstraints;\n modelDefaults?: Partial<Record<\"remote\" | \"local\", string>>;\n providerSafetyProfile?: \"strict\" | \"relaxed\";\n requireConsensusForHighRisk?: boolean;\n consensusProvider?: \"remote\" | \"local\";\n consensusModel?: string;\n patchConfidenceThresholds?: PatchConfidenceThresholds;\n dynamicModelRouting?: boolean;\n dynamicRoutingThresholdChars?: number;\n exploitSignalOverride?: ExploitSignalOverridePolicy;\n suppressions?: VexSuppression[];\n sla?: SlaPolicy;\n skipUnreachable?: boolean;\n dispositionPolicy?: DispositionPolicy;\n containmentMode?: boolean;\n escalationGraph?: EscalationGraph;\n}\n\nexport const DEFAULT_POLICY: AutoremediatorPolicy = {\n allowMajorBumps: false,\n denyPackages: [],\n allowPackages: [],\n constraints: {\n directDependenciesOnly: false,\n preferVersionBump: false,\n installMode: \"deterministic\",\n installPreferOffline: undefined,\n enforceFrozenLockfile: undefined,\n workspace: undefined,\n },\n modelDefaults: {},\n providerSafetyProfile: \"relaxed\",\n requireConsensusForHighRisk: false,\n consensusProvider: \"remote\",\n consensusModel: undefined,\n patchConfidenceThresholds: {},\n dynamicModelRouting: false,\n dynamicRoutingThresholdChars: 18000,\n exploitSignalOverride: undefined,\n suppressions: [],\n sla: undefined,\n skipUnreachable: false,\n dispositionPolicy: undefined,\n containmentMode: false,\n escalationGraph: undefined,\n};\n\nexport function loadPolicy(cwd: string, explicitPath?: string): AutoremediatorPolicy {\n let content: string | undefined;\n if (\n explicitPath &&\n (explicitPath.trim().startsWith(\"{\") || explicitPath.trim().startsWith(\"---\"))\n ) {\n content = explicitPath;\n } else {\n const candidate = explicitPath ?? join(cwd, \".github\", \"autoremediator.yml\");\n if (!existsSync(candidate)) return DEFAULT_POLICY;\n try {\n content = readFileSync(candidate, \"utf8\");\n } catch {\n return DEFAULT_POLICY;\n }\n }\n\n try {\n const parsed = yamlParse(content) as Partial<AutoremediatorPolicy>;\n return {\n allowMajorBumps: parsed.allowMajorBumps ?? DEFAULT_POLICY.allowMajorBumps,\n denyPackages: Array.isArray(parsed.denyPackages)\n ? (parsed.denyPackages.filter(\n (p): p is string => typeof p === \"string\" && p.trim().length > 0,\n ) as string[])\n : DEFAULT_POLICY.denyPackages,\n allowPackages: Array.isArray(parsed.allowPackages)\n ? (parsed.allowPackages.filter(\n (p): p is string => typeof p === \"string\" && p.trim().length > 0,\n ) as string[])\n : DEFAULT_POLICY.allowPackages,\n constraints: {\n directDependenciesOnly:\n parsed.constraints?.directDependenciesOnly ??\n DEFAULT_POLICY.constraints?.directDependenciesOnly ??\n false,\n preferVersionBump:\n parsed.constraints?.preferVersionBump ??\n DEFAULT_POLICY.constraints?.preferVersionBump ??\n false,\n installMode:\n parsed.constraints?.installMode ??\n DEFAULT_POLICY.constraints?.installMode ??\n \"deterministic\",\n installPreferOffline:\n parsed.constraints?.installPreferOffline ??\n DEFAULT_POLICY.constraints?.installPreferOffline,\n enforceFrozenLockfile:\n parsed.constraints?.enforceFrozenLockfile ??\n DEFAULT_POLICY.constraints?.enforceFrozenLockfile,\n workspace: parsed.constraints?.workspace ?? DEFAULT_POLICY.constraints?.workspace,\n },\n modelDefaults: {\n remote: parsed.modelDefaults?.remote ?? DEFAULT_POLICY.modelDefaults?.remote,\n local: parsed.modelDefaults?.local ?? DEFAULT_POLICY.modelDefaults?.local,\n },\n providerSafetyProfile: parsed.providerSafetyProfile ?? DEFAULT_POLICY.providerSafetyProfile,\n requireConsensusForHighRisk:\n parsed.requireConsensusForHighRisk ?? DEFAULT_POLICY.requireConsensusForHighRisk,\n consensusProvider: parsed.consensusProvider ?? DEFAULT_POLICY.consensusProvider,\n consensusModel: parsed.consensusModel ?? DEFAULT_POLICY.consensusModel,\n patchConfidenceThresholds: {\n low: parsed.patchConfidenceThresholds?.low ?? DEFAULT_POLICY.patchConfidenceThresholds?.low,\n medium:\n parsed.patchConfidenceThresholds?.medium ??\n DEFAULT_POLICY.patchConfidenceThresholds?.medium,\n high:\n parsed.patchConfidenceThresholds?.high ?? DEFAULT_POLICY.patchConfidenceThresholds?.high,\n },\n dynamicModelRouting: parsed.dynamicModelRouting ?? DEFAULT_POLICY.dynamicModelRouting,\n dynamicRoutingThresholdChars:\n parsed.dynamicRoutingThresholdChars ?? DEFAULT_POLICY.dynamicRoutingThresholdChars,\n exploitSignalOverride: parsed.exploitSignalOverride\n ? {\n kev: parsed.exploitSignalOverride.kev ?? undefined,\n epss: parsed.exploitSignalOverride.epss ?? undefined,\n }\n : undefined,\n suppressions: Array.isArray(parsed.suppressions)\n ? (parsed.suppressions as VexSuppression[])\n : DEFAULT_POLICY.suppressions,\n sla: parsed.sla\n ? {\n critical: (parsed.sla as SlaPolicy).critical,\n high: (parsed.sla as SlaPolicy).high,\n medium: (parsed.sla as SlaPolicy).medium,\n low: (parsed.sla as SlaPolicy).low,\n }\n : undefined,\n skipUnreachable:\n (parsed as AutoremediatorPolicy).skipUnreachable ?? DEFAULT_POLICY.skipUnreachable,\n dispositionPolicy:\n (parsed as AutoremediatorPolicy).dispositionPolicy ?? DEFAULT_POLICY.dispositionPolicy,\n containmentMode:\n (parsed as AutoremediatorPolicy).containmentMode ?? DEFAULT_POLICY.containmentMode,\n escalationGraph:\n (parsed as AutoremediatorPolicy).escalationGraph ?? DEFAULT_POLICY.escalationGraph,\n };\n } catch {\n return DEFAULT_POLICY;\n }\n}\n\nfunction isPackageInList(list: unknown[] | undefined, packageName: string): boolean {\n if (!list || !Array.isArray(list) || typeof packageName !== \"string\" || !packageName.trim()) {\n return false;\n }\n const target = packageName.trim();\n return list.some((pattern) => {\n if (typeof pattern !== \"string\") return false;\n const cleanPattern = pattern.trim();\n if (!cleanPattern) return false;\n if (cleanPattern === target) return true;\n if (cleanPattern === \"*\") return true;\n if (cleanPattern.endsWith(\"/*\")) {\n const prefix = cleanPattern.slice(0, -1);\n return target.startsWith(prefix);\n }\n if (cleanPattern.endsWith(\"*\")) {\n const prefix = cleanPattern.slice(0, -1);\n return target.startsWith(prefix);\n }\n return false;\n });\n}\n\nexport function isPackageAllowed(policy: AutoremediatorPolicy, packageName: string): boolean {\n if (!policy || typeof policy !== \"object\" || typeof packageName !== \"string\") {\n return true;\n }\n if (isPackageInList(policy.denyPackages, packageName)) return false;\n const allowList = Array.isArray(policy.allowPackages)\n ? policy.allowPackages.filter((p): p is string => typeof p === \"string\" && p.trim().length > 0)\n : [];\n if (allowList.length > 0 && !isPackageInList(allowList, packageName)) {\n return false;\n }\n return true;\n}\n\nexport function isActiveSuppression(suppression: VexSuppression): boolean {\n if (!suppression || typeof suppression !== \"object\") return false;\n if (!suppression.expiresAt) return true;\n const expires = new Date(suppression.expiresAt).getTime();\n if (isNaN(expires)) return true;\n return expires > Date.now();\n}\n\nexport function findSuppression(\n policy: AutoremediatorPolicy,\n cveId: string,\n): VexSuppression | undefined {\n if (!policy || !Array.isArray(policy.suppressions) || typeof cveId !== \"string\") {\n return undefined;\n }\n return policy.suppressions.find(\n (s) =>\n s &&\n typeof s === \"object\" &&\n typeof s.cveId === \"string\" &&\n s.cveId.toUpperCase() === cveId.toUpperCase() &&\n isActiveSuppression(s),\n );\n}\n\nexport function loadSuppressionsFile(filePath: string): VexSuppression[] {\n try {\n const content = readFileSync(filePath, \"utf8\");\n const parsed = yamlParse(content) as { suppressions?: unknown };\n return Array.isArray(parsed?.suppressions) ? (parsed.suppressions as VexSuppression[]) : [];\n } catch {\n return [];\n }\n}\n\nexport function checkSlaBreach(\n cveId: string,\n severity: CveSeverity,\n publishedAt: string,\n slaPolicy: SlaPolicy,\n): SlaBreach | null {\n if (typeof severity !== \"string\" || !slaPolicy || typeof slaPolicy !== \"object\") {\n return null;\n }\n const severityKey = severity.toLowerCase() as keyof SlaPolicy;\n const deadlineHours = slaPolicy[severityKey];\n if (typeof deadlineHours !== \"number\") return null;\n\n const publishedMs = new Date(publishedAt).getTime();\n if (isNaN(publishedMs)) return null;\n\n const deadlineMs = publishedMs + deadlineHours * 60 * 60 * 1000;\n const nowMs = Date.now();\n if (nowMs <= deadlineMs) return null;\n\n const hoursOverdue = Math.round((nowMs - deadlineMs) / (60 * 60 * 1000));\n return {\n cveId,\n severity,\n publishedAt,\n deadlineAt: new Date(deadlineMs).toISOString(),\n hoursOverdue,\n };\n}\n\n/**\n * Persists a VEX suppression entry to the repository policy configuration (.github/autoremediator.yml or explicit path).\n * Preserves existing policy settings and updates or appends the suppression entry.\n * Returns the resolved path where the policy was written.\n */\nexport function saveSuppressionToPolicy(\n cwd: string,\n suppression: VexSuppression,\n explicitPath?: string,\n): string {\n const targetPath = explicitPath ?? join(cwd, \".github\", \"autoremediator.yml\");\n const targetDir = dirname(targetPath);\n if (!existsSync(targetDir)) {\n mkdirSync(targetDir, { recursive: true });\n }\n\n let data: Record<string, unknown> = {};\n if (existsSync(targetPath)) {\n try {\n const content = readFileSync(targetPath, \"utf8\");\n const parsed = yamlParse(content);\n if (parsed && typeof parsed === \"object\") {\n data = parsed as Record<string, unknown>;\n }\n } catch {\n data = {};\n }\n }\n\n const existingSuppressions = Array.isArray(data.suppressions)\n ? (data.suppressions as VexSuppression[])\n : [];\n\n const existingIndex = existingSuppressions.findIndex(\n (s) =>\n s &&\n typeof s === \"object\" &&\n typeof s.cveId === \"string\" &&\n s.cveId.toUpperCase() === suppression.cveId.toUpperCase(),\n );\n\n if (existingIndex >= 0) {\n existingSuppressions[existingIndex] = {\n ...existingSuppressions[existingIndex],\n ...suppression,\n };\n } else {\n existingSuppressions.push(suppression);\n }\n\n data.suppressions = existingSuppressions;\n writeFileSync(targetPath, yamlStringify(data), \"utf8\");\n return targetPath;\n}\n\n/**\n * Persists a VEX suppression entry to a dedicated suppressions YAML file.\n */\nexport function saveSuppressionToFile(filePath: string, suppression: VexSuppression): void {\n const targetDir = dirname(filePath);\n if (!existsSync(targetDir)) {\n mkdirSync(targetDir, { recursive: true });\n }\n\n let data: { suppressions?: VexSuppression[] } = {};\n if (existsSync(filePath)) {\n try {\n const content = readFileSync(filePath, \"utf8\");\n const parsed = yamlParse(content);\n if (parsed && typeof parsed === \"object\") {\n data = parsed as { suppressions?: VexSuppression[] };\n }\n } catch {\n data = {};\n }\n }\n\n const existingSuppressions = Array.isArray(data.suppressions) ? data.suppressions : [];\n const existingIndex = existingSuppressions.findIndex(\n (s) =>\n s &&\n typeof s === \"object\" &&\n typeof s.cveId === \"string\" &&\n s.cveId.toUpperCase() === suppression.cveId.toUpperCase(),\n );\n\n if (existingIndex >= 0) {\n existingSuppressions[existingIndex] = {\n ...existingSuppressions[existingIndex],\n ...suppression,\n };\n } else {\n existingSuppressions.push(suppression);\n }\n\n data.suppressions = existingSuppressions;\n writeFileSync(filePath, yamlStringify(data), \"utf8\");\n}\n","import { existsSync, readdirSync, readFileSync, statSync } from \"node:fs\";\nimport { join, resolve, relative } from \"node:path\";\nimport yaml from \"yaml\";\n\nexport interface WorkspacePackage {\n name: string;\n relativeDir: string;\n absoluteDir: string;\n manifestPath: string;\n manifest: {\n name?: string;\n dependencies?: Record<string, string>;\n devDependencies?: Record<string, string>;\n peerDependencies?: Record<string, string>;\n [key: string]: unknown;\n };\n}\n\n/**\n * Finds the workspace root directory by walking up from startDir until\n * pnpm-workspace.yaml or package.json with workspaces is found.\n */\nexport function findWorkspaceRoot(startDir: string): string | null {\n let curr = resolve(startDir);\n while (true) {\n if (existsSync(join(curr, \"pnpm-workspace.yaml\"))) return curr;\n const pkgPath = join(curr, \"package.json\");\n if (existsSync(pkgPath)) {\n try {\n const parsed = JSON.parse(readFileSync(pkgPath, \"utf8\")) as { workspaces?: unknown };\n if (parsed.workspaces) return curr;\n } catch {\n // Ignore JSON error\n }\n }\n const parent = resolve(curr, \"..\");\n if (parent === curr) break;\n curr = parent;\n }\n return null;\n}\n\n/**\n * Discovers all workspace package directories and parses their manifests.\n */\nexport function findWorkspacePackages(cwd: string): WorkspacePackage[] {\n const rootCwd = findWorkspaceRoot(cwd) ?? resolve(cwd);\n const packages: WorkspacePackage[] = [];\n const packageGlobs: string[] = [];\n\n // 1. Check pnpm-workspace.yaml\n const pnpmWorkspaceFile = join(rootCwd, \"pnpm-workspace.yaml\");\n if (existsSync(pnpmWorkspaceFile)) {\n try {\n const content = readFileSync(pnpmWorkspaceFile, \"utf8\");\n const parsed = yaml.parse(content) as { packages?: string[] } | null;\n if (Array.isArray(parsed?.packages)) {\n packageGlobs.push(...parsed.packages);\n }\n } catch {\n // Ignore parse errors\n }\n }\n\n // 2. Check root package.json workspaces\n const rootPkgFile = join(rootCwd, \"package.json\");\n if (existsSync(rootPkgFile)) {\n try {\n const rootPkg = JSON.parse(readFileSync(rootPkgFile, \"utf8\")) as {\n workspaces?: string[] | { packages?: string[] };\n };\n if (Array.isArray(rootPkg.workspaces)) {\n packageGlobs.push(...rootPkg.workspaces);\n } else if (Array.isArray(rootPkg.workspaces?.packages)) {\n packageGlobs.push(...rootPkg.workspaces.packages);\n }\n } catch {\n // Ignore parse errors\n }\n }\n\n // 3. Check deno.json workspace\n const denoJsonFile = join(rootCwd, \"deno.json\");\n if (existsSync(denoJsonFile)) {\n try {\n const denoJson = JSON.parse(readFileSync(denoJsonFile, \"utf8\")) as {\n workspace?: string[];\n };\n if (Array.isArray(denoJson.workspace)) {\n packageGlobs.push(...denoJson.workspace);\n }\n } catch {\n // Ignore parse errors\n }\n }\n\n if (packageGlobs.length === 0) {\n return packages;\n }\n\n const seenDirs = new Set<string>();\n\n for (const glob of packageGlobs) {\n const cleanGlob = glob.trim().replace(/\\/+$/, \"\");\n if (!cleanGlob || cleanGlob.startsWith(\"!\")) continue;\n\n if (cleanGlob.endsWith(\"/*\")) {\n const parentDir = join(rootCwd, cleanGlob.slice(0, -2));\n if (!existsSync(parentDir)) continue;\n try {\n const entries = readdirSync(parentDir);\n for (const entry of entries) {\n if (entry.startsWith(\".\") || entry === \"node_modules\") continue;\n const subDir = join(parentDir, entry);\n try {\n if (statSync(subDir).isDirectory()) {\n addWorkspacePackage(rootCwd, subDir, packages, seenDirs);\n }\n } catch {\n // Ignore stat errors\n }\n }\n } catch {\n // Ignore readdir errors\n }\n } else {\n const directDir = join(rootCwd, cleanGlob);\n if (existsSync(directDir)) {\n try {\n if (statSync(directDir).isDirectory()) {\n addWorkspacePackage(rootCwd, directDir, packages, seenDirs);\n }\n } catch {\n // Ignore\n }\n }\n }\n }\n\n return packages;\n}\n\nfunction addWorkspacePackage(\n rootCwd: string,\n dir: string,\n out: WorkspacePackage[],\n seen: Set<string>,\n): void {\n const norm = resolve(dir);\n if (seen.has(norm)) return;\n seen.add(norm);\n\n const manifestPath = join(dir, \"package.json\");\n if (!existsSync(manifestPath)) return;\n\n try {\n const content = readFileSync(manifestPath, \"utf8\");\n const manifest = JSON.parse(content) as WorkspacePackage[\"manifest\"];\n out.push({\n name: manifest.name ?? relative(rootCwd, dir),\n relativeDir: relative(rootCwd, dir),\n absoluteDir: norm,\n manifestPath,\n manifest,\n });\n } catch {\n // Ignore invalid manifests\n }\n}\n\n/**\n * Finds the workspace package that directly declares the given dependency name.\n * If `filterWorkspace` is provided, restricts search to that workspace.\n */\nexport function findDeclaringWorkspacePackage(\n cwd: string,\n dependencyName: string,\n filterWorkspace?: string,\n): WorkspacePackage | null {\n const workspaces = findWorkspacePackages(cwd);\n if (workspaces.length === 0) return null;\n\n const matchesFilter = (wp: WorkspacePackage): boolean => {\n if (!filterWorkspace) return true;\n const filter = filterWorkspace.trim();\n return (\n wp.name === filter ||\n wp.relativeDir === filter ||\n wp.relativeDir.replace(/\\\\/g, \"/\") === filter.replace(/\\\\/g, \"/\")\n );\n };\n\n for (const wp of workspaces) {\n if (!matchesFilter(wp)) continue;\n const isDeclared =\n Boolean(wp.manifest.dependencies?.[dependencyName]) ||\n Boolean(wp.manifest.devDependencies?.[dependencyName]) ||\n Boolean(wp.manifest.peerDependencies?.[dependencyName]);\n\n if (isDeclared) {\n return wp;\n }\n }\n\n return null;\n}\n","import type {\n PatchArtifactQueryOptions,\n PatchArtifactValidationReport,\n PatchValidationPhase,\n} from \"../../platform/types.js\";\nimport { detectPackageManager } from \"../../platform/package-manager/index.js\";\nimport { checkInventoryTool } from \"../../remediation/tools/check-inventory.js\";\nimport { inspectPatchArtifact } from \"./inspection.js\";\n\nexport async function validatePatchArtifact(\n patchFilePath: string,\n options: PatchArtifactQueryOptions = {},\n): Promise<PatchArtifactValidationReport> {\n const inspection = await inspectPatchArtifact(patchFilePath, options);\n const validationPhases: PatchValidationPhase[] = [\n {\n phase: \"diff-format\",\n passed: inspection.diffValid,\n error: inspection.diffValid ? undefined : inspection.formatError,\n message: inspection.diffValid ? \"Patch content is a valid unified diff.\" : undefined,\n },\n ];\n\n if (!inspection.exists) {\n return {\n patchFilePath: inspection.patchFilePath,\n manifestFilePath: inspection.manifestFilePath,\n exists: false,\n manifestFound: false,\n diffValid: false,\n formatError: inspection.formatError,\n driftDetected: false,\n validationPhases,\n };\n }\n\n const manifest = inspection.manifest;\n const manifestFound = Boolean(manifest);\n\n if (!manifest) {\n validationPhases.push({\n phase: \"manifest-write\",\n passed: false,\n error: \"No patch manifest found for this patch artifact.\",\n });\n\n return {\n patchFilePath: inspection.patchFilePath,\n manifestFilePath: inspection.manifestFilePath,\n exists: true,\n manifestFound,\n diffValid: inspection.diffValid,\n formatError: inspection.formatError,\n driftDetected: false,\n validationPhases,\n };\n }\n\n validationPhases.push({\n phase: \"manifest-write\",\n passed: true,\n message: \"Patch manifest is present.\",\n });\n\n const cwd = options.cwd ?? process.cwd();\n const packageManager = options.packageManager ?? detectPackageManager(cwd);\n const inventory = (await (checkInventoryTool as any).execute({\n cwd,\n packageManager,\n })) as {\n error?: string;\n packages?: Array<{ name: string; version: string }>;\n };\n\n if (inventory.error) {\n validationPhases.push({\n phase: \"drift\",\n passed: false,\n error: inventory.error,\n });\n\n return {\n patchFilePath: inspection.patchFilePath,\n manifestFilePath: inspection.manifestFilePath,\n exists: true,\n manifestFound,\n diffValid: inspection.diffValid,\n formatError: inspection.formatError,\n driftDetected: false,\n cveId: manifest.cveId,\n packageName: manifest.packageName,\n vulnerableVersion: manifest.vulnerableVersion,\n validationPhases,\n };\n }\n\n const matchingPackages = (inventory.packages ?? []).filter(\n (pkg) => pkg.name === manifest.packageName,\n );\n const installedVersion = matchingPackages[0]?.version;\n const inventoryMatch = matchingPackages.some((pkg) => pkg.version === manifest.vulnerableVersion);\n const driftDetected = matchingPackages.length > 0 && !inventoryMatch;\n\n validationPhases.push({\n phase: \"drift\",\n passed: !driftDetected,\n message:\n matchingPackages.length === 0\n ? `Package ${manifest.packageName} is not currently installed.`\n : inventoryMatch\n ? `Installed version matches manifest target ${manifest.vulnerableVersion}.`\n : `Installed version ${installedVersion} does not match manifest target ${manifest.vulnerableVersion}.`,\n error: driftDetected\n ? \"Patch manifest does not match the installed dependency version.\"\n : undefined,\n });\n\n return {\n patchFilePath: inspection.patchFilePath,\n manifestFilePath: inspection.manifestFilePath,\n exists: true,\n manifestFound,\n diffValid: inspection.diffValid,\n formatError: inspection.formatError,\n driftDetected,\n cveId: manifest.cveId,\n packageName: manifest.packageName,\n vulnerableVersion: manifest.vulnerableVersion,\n installedVersion,\n inventoryMatch,\n validationPhases,\n };\n}\n","import { existsSync } from \"node:fs\";\nimport { readFile, rm, writeFile } from \"node:fs/promises\";\nimport { join } from \"node:path\";\nimport { evaluatePackage } from \"../../remediation/evaluate-package.js\";\nimport {\n detectPackageManager,\n resolveInstallCommand,\n resolveTestCommand,\n} from \"../../platform/package-manager/index.js\";\nimport { safeExeca } from \"../../platform/safe-exec.js\";\nimport {\n getOverrideValue,\n setOverrideValue,\n type RawPackageJson,\n} from \"../../remediation/tools/apply-package-override/helpers.js\";\nimport type {\n PatchReconcileOptions,\n PatchReconcileReport,\n PatchReconcileResult,\n} from \"../../platform/types.js\";\nimport { inspectPatchArtifact, listPatchArtifacts } from \"./inspection.js\";\n\n/**\n * Reconciles active patch artifacts in patchesDir against upstream registries.\n * If safe upstream releases have been published, the patches can be retired and packages upgraded.\n */\nexport async function reconcilePatchArtifacts(\n options: PatchReconcileOptions = {},\n): Promise<PatchReconcileReport> {\n const cwd = options.cwd ?? process.cwd();\n const pm = options.packageManager ?? detectPackageManager(cwd);\n\n const summaries = await listPatchArtifacts(options);\n const results: PatchReconcileResult[] = [];\n\n for (const summary of summaries) {\n const inspection = await inspectPatchArtifact(summary.patchFilePath, options);\n let packageName = inspection.packageName;\n let vulnerableVersion = inspection.vulnerableVersion;\n const cveId = inspection.cveId;\n\n if (!packageName && summary.patchFileName) {\n const basename = summary.patchFileName.replace(/\\.patch$/, \"\");\n const plusIdx = basename.lastIndexOf(\"+\");\n if (plusIdx > 0) {\n let rawPkg = basename.slice(0, plusIdx);\n vulnerableVersion = basename.slice(plusIdx + 1);\n if (rawPkg.includes(\"+\")) {\n rawPkg = \"@\" + rawPkg.replace(\"+\", \"/\");\n }\n packageName = rawPkg;\n } else {\n packageName = basename;\n }\n }\n\n if (!packageName) {\n results.push({\n patchFilePath: summary.patchFilePath,\n packageName: \"unknown\",\n cveId,\n status: \"patch-retained\",\n reason: \"Cannot determine package name from patch artifact.\",\n });\n continue;\n }\n\n let safeUpgradeVersion: string | undefined;\n try {\n const evaluation = await evaluatePackage(packageName, {\n version: vulnerableVersion,\n enrichIntelligence: false,\n });\n\n if (cveId) {\n const vuln = evaluation.vulnerabilities.find(\n (v) => v.cveId.toLowerCase() === cveId.toLowerCase(),\n );\n if (vuln?.safeUpgradeVersion) {\n safeUpgradeVersion = vuln.safeUpgradeVersion;\n }\n } else {\n safeUpgradeVersion = evaluation.vulnerabilities.find(\n (v) => v.safeUpgradeVersion,\n )?.safeUpgradeVersion;\n }\n } catch (evalError) {\n // Evaluation query failed or offline; record reason in diagnostic trail\n const _ignored = evalError;\n }\n\n if (!safeUpgradeVersion) {\n results.push({\n patchFilePath: summary.patchFilePath,\n packageName,\n cveId,\n installedVersion: vulnerableVersion,\n status: \"patch-retained\",\n reason: \"No safe upstream release exists yet; patch remains necessary.\",\n });\n continue;\n }\n\n if (!options.autoApply) {\n results.push({\n patchFilePath: summary.patchFilePath,\n packageName,\n cveId,\n installedVersion: vulnerableVersion,\n safeUpstreamVersion: safeUpgradeVersion,\n status: \"safe-version-available\",\n reason: `Safe upstream version ${safeUpgradeVersion} is available. Re-run with autoApply: true or --auto-apply to upgrade.`,\n });\n continue;\n }\n\n // Snapshot pre-mutation state for truthful rollback on command failure\n const pkgJsonPath = join(cwd, \"package.json\");\n const manifestPath = inspection.manifestFilePath ?? `${summary.patchFilePath}.json`;\n let originalPkgJsonContent: string | undefined;\n let originalPatchContent: string | undefined;\n let originalManifestContent: string | undefined;\n\n try {\n if (existsSync(pkgJsonPath)) {\n originalPkgJsonContent = await readFile(pkgJsonPath, \"utf8\");\n }\n if (existsSync(summary.patchFilePath)) {\n originalPatchContent = await readFile(summary.patchFilePath, \"utf8\");\n }\n if (existsSync(manifestPath)) {\n originalManifestContent = await readFile(manifestPath, \"utf8\");\n }\n\n if (originalPkgJsonContent) {\n const pkgJson = JSON.parse(originalPkgJsonContent) as RawPackageJson & Record<string, any>;\n let updated = false;\n\n const depSections = [\n \"dependencies\",\n \"devDependencies\",\n \"peerDependencies\",\n \"optionalDependencies\",\n ];\n\n let foundInDirectDeps = false;\n for (const depSection of depSections) {\n if (pkgJson[depSection] && pkgJson[depSection][packageName]) {\n pkgJson[depSection][packageName] = `^${safeUpgradeVersion}`;\n updated = true;\n foundInDirectDeps = true;\n }\n }\n\n // Handle existing or newly needed transitive overrides\n const existingOverride = getOverrideValue(pkgJson, pm, packageName);\n if (existingOverride || !foundInDirectDeps) {\n setOverrideValue(pkgJson, pm, packageName, safeUpgradeVersion);\n updated = true;\n }\n\n // Remove from pnpm patchedDependencies if present\n if (pkgJson.pnpm?.patchedDependencies) {\n const patched = pkgJson.pnpm.patchedDependencies as Record<string, string>;\n for (const key of Object.keys(patched)) {\n if (key.startsWith(`${packageName}@`)) {\n delete patched[key];\n updated = true;\n }\n }\n }\n\n if (updated) {\n await writeFile(pkgJsonPath, JSON.stringify(pkgJson, null, 2) + \"\\n\", \"utf8\");\n }\n }\n\n // Remove patch artifacts\n await rm(summary.patchFilePath, { force: true });\n if (existsSync(manifestPath)) {\n await rm(manifestPath, { force: true });\n }\n\n // Execute package installation truthfully\n const installCmd = resolveInstallCommand(pm);\n try {\n await safeExeca(installCmd[0], installCmd.slice(1), { cwd, stdio: \"pipe\" });\n } catch (installErr) {\n // Rollback state on install failure\n if (originalPkgJsonContent) {\n await writeFile(pkgJsonPath, originalPkgJsonContent, \"utf8\");\n }\n if (originalPatchContent) {\n await writeFile(summary.patchFilePath, originalPatchContent, \"utf8\");\n }\n if (originalManifestContent) {\n await writeFile(manifestPath, originalManifestContent, \"utf8\");\n }\n\n const msg = installErr instanceof Error ? installErr.message : String(installErr);\n results.push({\n patchFilePath: summary.patchFilePath,\n packageName,\n cveId,\n installedVersion: vulnerableVersion,\n safeUpstreamVersion: safeUpgradeVersion,\n status: \"error\",\n reason: `Package manager installation failed (${installCmd.join(\" \")}): ${msg}. Restored original package.json and patch artifacts.`,\n });\n continue;\n }\n\n // Execute tests truthfully if requested\n if (options.runTests) {\n const testCmd = resolveTestCommand(pm);\n try {\n await safeExeca(testCmd[0], testCmd.slice(1), { cwd, stdio: \"pipe\" });\n } catch (testErr) {\n // Rollback state on test failure\n if (originalPkgJsonContent) {\n await writeFile(pkgJsonPath, originalPkgJsonContent, \"utf8\");\n }\n if (originalPatchContent) {\n await writeFile(summary.patchFilePath, originalPatchContent, \"utf8\");\n }\n if (originalManifestContent) {\n await writeFile(manifestPath, originalManifestContent, \"utf8\");\n }\n\n const msg = testErr instanceof Error ? testErr.message : String(testErr);\n results.push({\n patchFilePath: summary.patchFilePath,\n packageName,\n cveId,\n installedVersion: vulnerableVersion,\n safeUpstreamVersion: safeUpgradeVersion,\n status: \"error\",\n reason: `Validation tests failed post-upgrade (${testCmd.join(\" \")}): ${msg}. Restored original package.json and patch artifacts.`,\n });\n continue;\n }\n }\n\n results.push({\n patchFilePath: summary.patchFilePath,\n packageName,\n cveId,\n installedVersion: vulnerableVersion,\n safeUpstreamVersion: safeUpgradeVersion,\n status: \"upgraded\",\n reason: `Successfully upgraded to ${safeUpgradeVersion} and retired patch artifact.`,\n });\n } catch (err) {\n results.push({\n patchFilePath: summary.patchFilePath,\n packageName,\n cveId,\n installedVersion: vulnerableVersion,\n safeUpstreamVersion: safeUpgradeVersion,\n status: \"error\",\n reason: err instanceof Error ? err.message : String(err),\n });\n }\n }\n\n const reconciledCount = results.filter((r) => r.status === \"upgraded\").length;\n const retainedCount = results.filter(\n (r) => r.status === \"patch-retained\" || r.status === \"safe-version-available\",\n ).length;\n\n return {\n reconciled: results,\n reconciledCount,\n retainedCount,\n };\n}\n","/**\n * Package pre-installation security evaluator\n *\n * Used to evaluate security posture of an npm package before installing or updating it.\n * Queries OSV for known vulnerabilities, enriches with EPSS and CISA KEV exploit telemetry,\n * and recommends safe upgrade targets.\n */\nimport semver from \"semver\";\nimport { queryOsvPackage, parseOsvVuln } from \"../intelligence/sources/osv.js\";\nimport { fetchEpss } from \"../intelligence/sources/epss.js\";\nimport { fetchCisaKevFeed, findKevEntry } from \"../intelligence/sources/cisa-kev.js\";\nimport { fetchPackageVersions, findSafeUpgradeVersion } from \"../intelligence/sources/registry.js\";\nimport type {\n EvaluatePackageOptions,\n PackageEvaluationReport,\n VulnerabilityEvaluationEntry,\n} from \"../platform/types.js\";\n\nexport async function evaluatePackage(\n packageName: string,\n options: EvaluatePackageOptions = {},\n): Promise<PackageEvaluationReport> {\n const version = options.version?.trim();\n const enrich = options.enrichIntelligence !== false;\n\n let versions: string[] = [];\n let latestVersion: string | undefined;\n\n try {\n versions = await fetchPackageVersions(packageName);\n if (versions.length > 0) {\n const valid = versions.filter((v) => semver.valid(v)).sort((a, b) => semver.compare(a, b));\n latestVersion = valid[valid.length - 1];\n }\n } catch {\n // Registry lookup failure shouldn't abort OSV checks\n }\n\n let rawVulns: Awaited<ReturnType<typeof queryOsvPackage>> = [];\n try {\n rawVulns = await queryOsvPackage(packageName, version);\n } catch {\n rawVulns = [];\n }\n\n // Load CISA KEV feed if enrichment is enabled\n let kevFeed: Awaited<ReturnType<typeof fetchCisaKevFeed>> | null = null;\n if (enrich) {\n try {\n kevFeed = await fetchCisaKevFeed();\n } catch {\n kevFeed = null;\n }\n }\n\n const entries: VulnerabilityEvaluationEntry[] = [];\n\n for (const raw of rawVulns) {\n const cveDetails = parseOsvVuln(raw);\n const affected = cveDetails.affectedPackages.find(\n (p) => p.name.toLowerCase() === packageName.toLowerCase(),\n );\n\n // If a specific version was requested, verify semver matching\n if (version && affected?.vulnerableRange) {\n const cleanVer = semver.clean(version) || version;\n if (semver.valid(cleanVer) && !semver.satisfies(cleanVer, affected.vulnerableRange)) {\n continue;\n }\n }\n\n let inCisaKev = false;\n let epssScore: number | undefined;\n let epssPercentile: number | undefined;\n\n if (enrich && cveDetails.id.startsWith(\"CVE-\")) {\n if (kevFeed) {\n inCisaKev = Boolean(findKevEntry(kevFeed, cveDetails.id));\n }\n try {\n const epss = await fetchEpss(cveDetails.id);\n if (epss) {\n epssScore = Number.parseFloat(epss.epss);\n epssPercentile = Number.parseFloat(epss.percentile);\n }\n } catch {\n // Soft fail on individual EPSS queries\n }\n }\n\n let safeUpgradeVersion: string | undefined;\n if (affected?.firstPatchedVersion) {\n try {\n const safe = await findSafeUpgradeVersion(\n packageName,\n version || \"0.0.0\",\n affected.firstPatchedVersion,\n );\n safeUpgradeVersion = safe ?? affected.firstPatchedVersion;\n } catch {\n safeUpgradeVersion = affected.firstPatchedVersion;\n }\n }\n\n entries.push({\n cveId: cveDetails.id,\n severity: cveDetails.severity,\n summary: cveDetails.summary,\n vulnerableRange: affected?.vulnerableRange,\n firstPatchedVersion: affected?.firstPatchedVersion,\n safeUpgradeVersion,\n epssScore,\n epssPercentile,\n inCisaKev,\n references: cveDetails.references,\n });\n }\n\n const isVulnerable = entries.length > 0;\n let verdict: PackageEvaluationReport[\"verdict\"] = \"safe\";\n\n if (isVulnerable) {\n const hasKevOrHighEpss = entries.some((e) => e.inCisaKev || (e.epssScore && e.epssScore > 0.5));\n const hasHighOrCritical = entries.some(\n (e) => e.severity === \"CRITICAL\" || e.severity === \"HIGH\",\n );\n\n if (hasKevOrHighEpss) {\n verdict = \"actively-exploited\";\n } else if (hasHighOrCritical) {\n verdict = \"vulnerable\";\n } else {\n verdict = \"caution\";\n }\n }\n\n // Determine recommended safe version\n let recommendedVersion: string | undefined;\n if (isVulnerable) {\n const upgradeCandidates = entries\n .map((e) => e.safeUpgradeVersion)\n .filter((v): v is string => Boolean(v && semver.valid(v)))\n .sort((a, b) => semver.compare(a, b));\n\n recommendedVersion = upgradeCandidates[upgradeCandidates.length - 1] || latestVersion;\n } else {\n recommendedVersion = version || latestVersion;\n }\n\n const summary = isVulnerable\n ? `Package \"${packageName}${version ? `@${version}` : \"\"}\" has ${entries.length} known vulnerability(ies) (verdict: ${verdict}). Recommended safe version: ${recommendedVersion || \"none\"}.`\n : `Package \"${packageName}${version ? `@${version}` : \"\"}\" has no known vulnerabilities. Safe to install.`;\n\n return {\n schemaVersion: \"1.0\",\n packageName,\n evaluatedVersion: version,\n isVulnerable,\n verdict,\n summary,\n vulnerabilities: entries,\n recommendedVersion,\n latestVersion,\n generatedAt: new Date().toISOString(),\n };\n}\n","/**\n * Shared HTTP client wrapper for all non-SDK external API calls.\n *\n * Provides a consistent interface for JSON API calls with:\n * - Unified error handling and logging\n * - Timeout and retry semantics\n * - Request/response validation\n * - No external dependencies (uses native fetch)\n *\n * Used for: OSV, CVE Services, npm registry, EPSS, deps.dev, Scorecard.\n */\n\nexport interface HttpClientRequest {\n url: string | URL;\n method?: \"GET\" | \"POST\" | \"PUT\" | \"DELETE\";\n headers?: Record<string, string>;\n body?: unknown;\n timeout?: number;\n}\n\nexport interface HttpClientResponse<T = unknown> {\n status: number;\n ok: boolean;\n data: T;\n text: string;\n}\n\nconst DEFAULT_TIMEOUT_MS = 10_000;\n\nasync function requestWithTimeout(\n url: string | URL,\n init: RequestInit,\n timeoutMs: number,\n): Promise<Response> {\n const controller = new AbortController();\n const timeoutId = setTimeout(() => controller.abort(), timeoutMs);\n\n try {\n return await fetch(url, { ...init, signal: controller.signal });\n } finally {\n clearTimeout(timeoutId);\n }\n}\n\n/**\n * Execute an HTTP request with timeout, error handling, and response parsing.\n *\n * @param request - HTTP request configuration\n * @returns Parsed response with status, ok flag, and data\n * @throws HttpError on network failure or timeout (caught errors are logged and safe to continue)\n */\nexport async function httpClient(request: HttpClientRequest): Promise<HttpClientResponse> {\n const { url, method = \"GET\", headers = {}, body, timeout = DEFAULT_TIMEOUT_MS } = request;\n\n const init: RequestInit = {\n method,\n headers: {\n Accept: \"application/json\",\n ...headers,\n },\n };\n\n if (body !== undefined) {\n init.body = typeof body === \"string\" ? body : JSON.stringify(body);\n const headersObj = (init.headers ?? {}) as Record<string, string>;\n if (!headersObj[\"Content-Type\"]) {\n headersObj[\"Content-Type\"] = \"application/json\";\n }\n init.headers = headersObj;\n }\n\n try {\n const res = await requestWithTimeout(url, init, timeout);\n\n // Cap response size before reading to prevent memory exhaustion from\n // malicious or compromised intelligence sources.\n const MAX_RESPONSE_BYTES = 10 * 1024 * 1024; // 10 MB\n const contentLength = res.headers?.get?.(\"content-length\") ?? null;\n if (contentLength && parseInt(contentLength, 10) > MAX_RESPONSE_BYTES) {\n throw new HttpError(`Response too large (content-length: ${contentLength})`, \"HTTP_ERROR\");\n }\n\n const text = await res.text();\n if (Buffer.byteLength(text) > MAX_RESPONSE_BYTES) {\n throw new HttpError(\"Response body exceeds 10 MB limit\", \"HTTP_ERROR\");\n }\n\n // Parse JSON if response has content, otherwise return empty object\n let data: unknown;\n try {\n data = text ? JSON.parse(text) : {};\n } catch {\n // Response is not JSON; store as-is\n data = text;\n }\n\n return {\n status: res.status,\n ok: res.ok,\n data,\n text,\n };\n } catch (err) {\n // Timeout or network error\n const errorMsg = err instanceof Error ? err.message : String(err);\n if (errorMsg.includes(\"AbortError\")) {\n throw new HttpError(`Request timeout after ${timeout}ms`, \"TIMEOUT\");\n }\n throw new HttpError(`Network error: ${errorMsg}`, \"NETWORK_ERROR\");\n }\n}\n\n/**\n * Execute an HTTP request and throw if response is not ok.\n * Returns parsed JSON data on success.\n */\nexport async function httpClientJson<T = unknown>(request: HttpClientRequest): Promise<T> {\n const res = await httpClient(request);\n if (!res.ok) {\n throw new HttpError(`HTTP ${res.status}: ${res.text}`, \"HTTP_ERROR\");\n }\n return res.data as T;\n}\n\n/**\n * Custom error class for HTTP client failures.\n */\nexport class HttpError extends Error {\n constructor(\n message: string,\n public readonly code: \"TIMEOUT\" | \"NETWORK_ERROR\" | \"HTTP_ERROR\",\n ) {\n super(message);\n this.name = \"HttpError\";\n }\n}\n","/**\n * OSV API client (https://osv.dev)\n *\n * Used as the primary source for CVE → affected npm package mapping.\n * No auth required. SEMVER event ranges are machine-readable.\n * Uses shared HTTP client for consistent error handling and timeouts.\n */\nimport type { AffectedPackage, CveDetails } from \"../../platform/types.js\";\nimport { httpClient } from \"../../platform/http-client.js\";\n\nconst OSV_BASE = \"https://api.osv.dev/v1\";\n\n// ---------------------------------------------------------------------------\n// Raw OSV response types\n// ---------------------------------------------------------------------------\n\ninterface OsvSemverEvent {\n introduced?: string;\n fixed?: string;\n last_affected?: string;\n limit?: string;\n}\n\ninterface OsvRange {\n type: \"SEMVER\" | \"GIT\" | \"ECOSYSTEM\";\n events: OsvSemverEvent[];\n repo?: string;\n}\n\ninterface OsvAffected {\n package: {\n name: string;\n ecosystem: string;\n purl?: string;\n };\n ranges?: OsvRange[];\n versions?: string[];\n database_specific?: Record<string, unknown>;\n ecosystem_specific?: Record<string, unknown>;\n}\n\ninterface OsvVulnerability {\n id: string;\n aliases?: string[];\n summary?: string;\n details?: string;\n severity?: Array<{\n type: string;\n score: string;\n }>;\n affected?: OsvAffected[];\n references?: Array<{ type: string; url: string }>;\n schema_version?: string;\n modified?: string;\n published?: string;\n}\n\n// ---------------------------------------------------------------------------\n// Public API\n// ---------------------------------------------------------------------------\n\n/**\n * Fetch a vulnerability by CVE ID (or any OSV/GHSA ID).\n * Returns null if the CVE is not found in OSV.\n */\nexport async function fetchOsvVuln(cveId: string): Promise<OsvVulnerability | null> {\n const url = `${OSV_BASE}/vulns/${encodeURIComponent(cveId)}`;\n\n try {\n const res = await httpClient({ url });\n\n if (res.status === 404) return null;\n if (!res.ok) {\n throw new Error(`OSV API error ${res.status} for ${cveId}: ${res.text}`);\n }\n\n return res.data as OsvVulnerability;\n } catch (err) {\n // If httpClient throws (timeout, network error), convert to HTTP error\n if (err instanceof Error) {\n throw new Error(`OSV API error for ${cveId}: ${err.message}`);\n }\n throw err;\n }\n}\n\n/**\n * Query OSV for all vulnerabilities affecting a specific npm package and optional version.\n */\nexport async function queryOsvPackage(\n packageName: string,\n version?: string,\n): Promise<OsvVulnerability[]> {\n const url = `${OSV_BASE}/query`;\n const body: Record<string, unknown> = {\n package: {\n name: packageName,\n ecosystem: \"npm\",\n },\n };\n if (version) {\n body.version = version;\n }\n\n try {\n const res = await httpClient({\n url,\n method: \"POST\",\n body,\n headers: { \"Content-Type\": \"application/json\" },\n });\n\n if (res.status === 404) return [];\n if (!res.ok) {\n throw new Error(`OSV API error ${res.status} for query \"${packageName}\": ${res.text}`);\n }\n\n const data = res.data as { vulns?: OsvVulnerability[] };\n return data.vulns ?? [];\n } catch (err) {\n if (err instanceof Error) {\n throw new Error(`OSV API error for query \"${packageName}\": ${err.message}`);\n }\n throw err;\n }\n}\n\n/**\n * Convert an OSV SEMVER range event array to a semver range string.\n * OSV uses ordered [introduced, fixed) events.\n * e.g. [{ introduced: \"0\" }, { fixed: \"4.17.21\" }] → \">=0.0.0 <4.17.21\"\n */\nfunction osvEventsToSemverRange(events: OsvSemverEvent[]): string {\n const parts: string[] = [];\n\n for (const event of events) {\n if (event.introduced !== undefined) {\n const v = event.introduced === \"0\" ? \"0.0.0\" : event.introduced;\n parts.push(`>=${v}`);\n }\n if (event.fixed !== undefined) {\n parts.push(`<${event.fixed}`);\n }\n if (event.last_affected !== undefined) {\n parts.push(`<=${event.last_affected}`);\n }\n }\n\n return parts.join(\" \") || \">=0.0.0\";\n}\n\n/**\n * Parse an OSV vulnerability into autoremediator's CveDetails shape,\n * filtering affected entries to npm ecosystem only.\n */\nexport function parseOsvVuln(vuln: OsvVulnerability): CveDetails {\n const npmAffected: AffectedPackage[] = [];\n\n for (const affected of vuln.affected ?? []) {\n const ecosystem = affected.package?.ecosystem;\n const packageName = affected.package?.name;\n if (!ecosystem || typeof ecosystem !== \"string\") continue;\n if (!packageName || typeof packageName !== \"string\") continue;\n if (ecosystem.toLowerCase() !== \"npm\") continue;\n\n // Find the best SEMVER range\n const semverRange = affected.ranges?.find((r) => r.type === \"SEMVER\");\n const vulnerableRange = semverRange ? osvEventsToSemverRange(semverRange.events) : \">=0.0.0\";\n\n // Derive firstPatchedVersion from the \"fixed\" event\n const fixedEvent = semverRange?.events.find((e) => e.fixed !== undefined);\n\n npmAffected.push({\n name: packageName,\n ecosystem: \"npm\",\n vulnerableRange,\n firstPatchedVersion: fixedEvent?.fixed,\n source: \"osv\",\n });\n }\n\n // Best-effort severity from CVSS score string (e.g. \"CVSS:3.1/.../7.5\")\n const severity = deriveSeverity(vuln.severity);\n\n return {\n id: vuln.id,\n summary: vuln.summary ?? vuln.details ?? \"No summary available.\",\n severity,\n references: vuln.references?.map((r) => r.url) ?? [],\n affectedPackages: npmAffected,\n };\n}\n\nfunction deriveSeverity(severityEntries?: OsvVulnerability[\"severity\"]): CveDetails[\"severity\"] {\n if (!severityEntries?.length) return \"UNKNOWN\";\n\n // Prefer CVSS_V3 type\n const cvssEntry = severityEntries.find((s) => s.type === \"CVSS_V3\") ?? severityEntries[0];\n\n // Extract base score from vector string, e.g. \"CVSS:3.1/AV:N/AC:L/.../7.5/...\"\n const scoreMatch = cvssEntry.score.match(/(\\d+\\.\\d+)$/);\n if (scoreMatch) {\n const score = parseFloat(scoreMatch[1]);\n if (score >= 9.0) return \"CRITICAL\";\n if (score >= 7.0) return \"HIGH\";\n if (score >= 4.0) return \"MEDIUM\";\n return \"LOW\";\n }\n\n return \"UNKNOWN\";\n}\n\n/** High-level convenience: fetch + parse */\nexport async function lookupCveOsv(cveId: string): Promise<CveDetails | null> {\n const vuln = await fetchOsvVuln(cveId);\n if (!vuln) return null;\n return parseOsvVuln(vuln);\n}\n","import type { LanguageModel } from \"ai\";\nimport type { PatchConfidenceThresholds, PatchRiskLevel, RemediateOptions } from \"./types.js\";\nimport { loadPolicy } from \"./policy.js\";\n\nexport type SupportedProvider = \"remote\" | \"local\";\n\ninterface ModelRoutingContext {\n inputChars?: number;\n}\n\ninterface RemoteAdapterModule {\n [key: string]: unknown;\n}\n\ninterface RemoteModelFactory {\n (options: { apiKey: string }): (modelName: string) => LanguageModel;\n}\n\nexport function resolveProvider(options: RemediateOptions = {}): SupportedProvider {\n const raw = options.llmProvider ?? process.env.AUTOREMEDIATOR_LLM_PROVIDER ?? \"remote\";\n if (raw !== \"remote\" && raw !== \"local\") {\n throw new Error(\n `Unsupported LLM provider \"${raw}\". Set AUTOREMEDIATOR_LLM_PROVIDER to \"remote\" or \"local\".`,\n );\n }\n return raw;\n}\n\nexport function resolveModelName(\n provider: SupportedProvider,\n options: RemediateOptions = {},\n routing: ModelRoutingContext = {},\n): string {\n if (options.model) return options.model;\n if (process.env.AUTOREMEDIATOR_MODEL) return process.env.AUTOREMEDIATOR_MODEL;\n\n const cwd = options.cwd ?? process.cwd();\n const policy = loadPolicy(cwd, options.policy);\n\n const providerEnvModel =\n provider === \"remote\"\n ? process.env.AUTOREMEDIATOR_MODEL_REMOTE\n : process.env.AUTOREMEDIATOR_MODEL_LOCAL;\n if (providerEnvModel) return providerEnvModel;\n\n const policyPinnedModel =\n provider === \"remote\" ? policy.modelDefaults?.remote : policy.modelDefaults?.local;\n if (policyPinnedModel) return policyPinnedModel;\n\n const defaults: Record<SupportedProvider, string> = {\n remote: \"remote-default\",\n local: \"local\",\n };\n\n const routingEnabled = options.dynamicModelRouting ?? policy.dynamicModelRouting ?? false;\n const threshold =\n options.dynamicRoutingThresholdChars ?? policy.dynamicRoutingThresholdChars ?? 18000;\n\n if (\n provider === \"remote\" &&\n routingEnabled &&\n typeof routing.inputChars === \"number\" &&\n routing.inputChars >= threshold\n ) {\n return process.env.AUTOREMEDIATOR_MODEL_REMOTE_LARGE ?? \"remote-large\";\n }\n\n return defaults[provider];\n}\n\nasync function loadRemoteFactory(): Promise<RemoteModelFactory> {\n const moduleName = process.env.AUTOREMEDIATOR_REMOTE_CLIENT_MODULE;\n const exportName = process.env.AUTOREMEDIATOR_REMOTE_CLIENT_FACTORY ?? \"createRemoteClient\";\n\n if (!moduleName) {\n throw new Error(\n \"AUTOREMEDIATOR_REMOTE_CLIENT_MODULE is required for remote provider model loading.\",\n );\n }\n\n // Reject relative paths and non-identifier module specifiers to prevent\n // loading arbitrary local files via path traversal.\n if (\n moduleName.startsWith(\"./\") ||\n moduleName.startsWith(\"../\") ||\n moduleName.startsWith(\"/\") ||\n moduleName.startsWith(\"file:\")\n ) {\n throw new Error(\n `AUTOREMEDIATOR_REMOTE_CLIENT_MODULE must be a package name, not a file path: ${moduleName}`,\n );\n }\n\n const loaded = (await import(moduleName)) as RemoteAdapterModule;\n const factory = loaded[exportName];\n if (typeof factory !== \"function\") {\n throw new Error(\n `Remote client factory \"${exportName}\" was not found in module \"${moduleName}\".`,\n );\n }\n\n return factory as RemoteModelFactory;\n}\n\nexport async function createModel(\n options: RemediateOptions = {},\n routing: ModelRoutingContext = {},\n): Promise<LanguageModel> {\n const provider = resolveProvider(options);\n\n if (provider === \"local\") {\n throw new Error(\n \"Local provider does not create a language model. Use the deterministic pipeline path instead.\",\n );\n }\n\n const apiKey = process.env.AUTOREMEDIATOR_REMOTE_API_KEY;\n if (!apiKey) {\n throw new Error(\n \"AUTOREMEDIATOR_REMOTE_API_KEY environment variable is required for remote provider.\",\n );\n }\n\n const modelName = resolveModelName(provider, options, routing);\n const createRemoteClient = await loadRemoteFactory();\n const remoteClient = createRemoteClient({ apiKey });\n return remoteClient(modelName);\n}\n\nexport function getPatchConfidenceThreshold(\n provider: SupportedProvider,\n safetyProfile: \"strict\" | \"relaxed\" = \"relaxed\",\n riskLevel: PatchRiskLevel = \"medium\",\n overrides?: PatchConfidenceThresholds,\n): number {\n const relaxed: Record<SupportedProvider, Record<PatchRiskLevel, number>> = {\n remote: { low: 0.65, medium: 0.7, high: 0.8 },\n local: { low: 0.65, medium: 0.7, high: 0.8 },\n };\n const strict: Record<SupportedProvider, Record<PatchRiskLevel, number>> = {\n remote: { low: 0.8, medium: 0.85, high: 0.9 },\n local: { low: 0.8, medium: 0.85, high: 0.9 },\n };\n\n const baseThreshold =\n safetyProfile === \"strict\" ? strict[provider][riskLevel] : relaxed[provider][riskLevel];\n const override = overrides?.[riskLevel];\n\n if (typeof override === \"number\" && Number.isFinite(override)) {\n return Math.max(0, Math.min(1, override));\n }\n\n return baseThreshold;\n}\n\nexport function estimateModelCostUsd(params: {\n provider: SupportedProvider;\n promptChars: number;\n completionChars: number;\n}): number {\n const inputTokens = params.promptChars / 4;\n const outputTokens = params.completionChars / 4;\n\n const pricePerThousand =\n params.provider === \"remote\" ? { input: 0.006, output: 0.02 } : { input: 0, output: 0 };\n\n return (\n (inputTokens / 1000) * pricePerThousand.input + (outputTokens / 1000) * pricePerThousand.output\n );\n}\n\nexport interface NvdConfig {\n apiKey?: string;\n}\n\nexport function getNvdConfig(): NvdConfig {\n return {\n apiKey: process.env.AUTOREMEDIATOR_NVD_API_KEY,\n };\n}\n\nexport function getGitHubToken(): string | undefined {\n return process.env.GITHUB_TOKEN;\n}\n\nexport interface IntelligenceSourceConfig {\n gitLabAdvisoryApi?: string;\n certCcSearchUrl?: string;\n epssApi?: string;\n cveServicesApi?: string;\n depsDevApi?: string;\n scorecardApi?: string;\n vendorAdvisoryFeeds: string[];\n commercialFeeds: string[];\n commercialFeedToken?: string;\n}\n\nexport function getIntelligenceSourceConfig(): IntelligenceSourceConfig {\n return {\n gitLabAdvisoryApi:\n process.env.AUTOREMEDIATOR_GITLAB_ADVISORY_API ??\n \"https://advisories.gitlab.com/api/v1/advisories\",\n certCcSearchUrl:\n process.env.AUTOREMEDIATOR_CERTCC_SEARCH_URL ?? \"https://www.kb.cert.org/vuls/search\",\n epssApi: process.env.AUTOREMEDIATOR_EPSS_API ?? \"https://api.first.org/data/v1/epss\",\n cveServicesApi:\n process.env.AUTOREMEDIATOR_CVE_SERVICES_API ?? \"https://cveawg.mitre.org/api/cve\",\n depsDevApi: process.env.AUTOREMEDIATOR_DEPSDEV_API ?? \"https://api.deps.dev/v3\",\n scorecardApi: process.env.AUTOREMEDIATOR_SCORECARD_API ?? \"https://api.securityscorecards.dev\",\n vendorAdvisoryFeeds: (process.env.AUTOREMEDIATOR_VENDOR_ADVISORY_FEEDS ?? \"\")\n .split(\",\")\n .map((v) => v.trim())\n .filter(Boolean),\n commercialFeeds: (process.env.AUTOREMEDIATOR_COMMERCIAL_FEEDS ?? \"\")\n .split(\",\")\n .map((v) => v.trim())\n .filter(Boolean),\n commercialFeedToken: process.env.AUTOREMEDIATOR_COMMERCIAL_FEED_TOKEN,\n };\n}\n","/**\n * FIRST EPSS API client.\n *\n * Adds exploitation probability metadata for prioritization.\n * Uses shared HTTP client for consistent error handling and timeouts.\n */\nimport type { CveDetails } from \"../../platform/types.js\";\nimport { getIntelligenceSourceConfig } from \"../../platform/config.js\";\nimport { httpClient } from \"../../platform/http-client.js\";\n\ninterface EpssRow {\n cve: string;\n epss: string;\n percentile: string;\n date?: string;\n}\n\ninterface EpssResponse {\n data?: EpssRow[];\n}\n\nexport async function fetchEpss(cveId: string): Promise<EpssRow | undefined> {\n const { epssApi } = getIntelligenceSourceConfig();\n if (!epssApi) return undefined;\n\n try {\n const url = new URL(epssApi);\n url.searchParams.set(\"cve\", cveId);\n\n const res = await httpClient({ url: url.toString() });\n if (!res.ok) return undefined;\n\n const body = res.data as EpssResponse;\n return body.data?.[0];\n } catch {\n return undefined;\n }\n}\n\nexport async function enrichWithEpss(details: CveDetails): Promise<CveDetails> {\n const row = await fetchEpss(details.id);\n if (!row) return details;\n\n const score = Number.parseFloat(row.epss);\n const percentile = Number.parseFloat(row.percentile);\n if (!Number.isFinite(score) || !Number.isFinite(percentile)) {\n return details;\n }\n\n details.epss = {\n score,\n percentile,\n date: row.date,\n };\n return details;\n}\n","/**\n * CISA Known Exploited Vulnerabilities (KEV) feed client.\n *\n * Used for risk-priority enrichment only. This source does not provide\n * npm package range intelligence.\n * Uses shared HTTP client for consistent error handling and timeouts.\n */\nimport type { CveDetails } from \"../../platform/types.js\";\nimport { httpClient } from \"../../platform/http-client.js\";\n\nconst CISA_KEV_URL =\n \"https://www.cisa.gov/sites/default/files/feeds/known_exploited_vulnerabilities.json\";\n\ninterface CisaKevVulnerability {\n cveID: string;\n dateAdded?: string;\n dueDate?: string;\n requiredAction?: string;\n knownRansomwareCampaignUse?: string;\n}\n\ninterface CisaKevFeed {\n vulnerabilities?: CisaKevVulnerability[];\n}\n\nexport async function fetchCisaKevFeed(): Promise<CisaKevFeed | undefined> {\n try {\n const res = await httpClient({ url: CISA_KEV_URL });\n if (!res.ok) return undefined;\n return res.data as CisaKevFeed;\n } catch {\n // KEV is enrichment only; failures are non-fatal.\n return undefined;\n }\n}\n\nexport function findKevEntry(\n feed: CisaKevFeed | undefined,\n cveId: string,\n): CisaKevVulnerability | undefined {\n if (!feed?.vulnerabilities?.length) return undefined;\n const normalized = cveId.toUpperCase();\n return feed.vulnerabilities.find((v) => v.cveID.toUpperCase() === normalized);\n}\n\nexport async function enrichWithCisaKev(details: CveDetails): Promise<CveDetails> {\n const feed = await fetchCisaKevFeed();\n const entry = findKevEntry(feed, details.id);\n if (!entry) return details;\n\n details.kev = {\n knownExploited: true,\n dateAdded: entry.dateAdded,\n dueDate: entry.dueDate,\n requiredAction: entry.requiredAction,\n knownRansomwareCampaignUse: entry.knownRansomwareCampaignUse,\n };\n\n if (!details.references.includes(CISA_KEV_URL)) {\n details.references.push(CISA_KEV_URL);\n }\n\n return details;\n}\n","/**\n * npm registry API client\n *\n * Used to:\n * - Fetch the full list of published versions for a package\n * - Find the lowest semver-compatible safe upgrade from `firstPatchedVersion`\n * - Download tarballs for patch generation (fallback path)\n * - Query installed packages for outdated version information via the package manager\n *\n * Uses shared HTTP client for consistent error handling and timeouts.\n */\nimport { readFileSync } from \"node:fs\";\nimport { join } from \"node:path\";\nimport { execa } from \"execa\";\nimport semver from \"semver\";\nimport { httpClient } from \"../../platform/http-client.js\";\nimport { type PackageManager, detectPackageManager } from \"../../platform/package-manager/index.js\";\n\nconst NPM_REGISTRY = \"https://registry.npmjs.org\";\n\nexport type SafeUpgradeLevel = \"patch\" | \"minor\" | \"major\";\n\nexport interface SafeUpgradeResolution {\n safeVersion?: string;\n upgradeLevel?: SafeUpgradeLevel;\n candidates: Partial<Record<SafeUpgradeLevel, string>>;\n majorOnlyFixAvailable: boolean;\n}\n\n// ---------------------------------------------------------------------------\n// Raw registry types (abbreviated)\n// ---------------------------------------------------------------------------\n\ninterface NpmPackument {\n name: string;\n versions: Record<string, { version: string; dist: { tarball: string } }>;\n \"dist-tags\": Record<string, string>;\n time: Record<string, string>;\n}\n\n// ---------------------------------------------------------------------------\n// Public API\n// ---------------------------------------------------------------------------\n\n/**\n * Fetch all published versions for an npm package.\n * Returns an empty array if the package is not found.\n */\nexport async function fetchPackageVersions(packageName: string): Promise<string[]> {\n const url = `${NPM_REGISTRY}/${encodeURIComponent(packageName)}`;\n\n try {\n const res = await httpClient({ url });\n\n if (res.status === 404) return [];\n if (!res.ok) {\n throw new Error(`npm registry error ${res.status} for \"${packageName}\": ${res.text}`);\n }\n\n const data = res.data as NpmPackument;\n return Object.keys(data.versions);\n } catch (err) {\n // If httpClient throws (timeout, network error), treat as not found\n if (err instanceof Error && err.message.includes(\"registry error\")) {\n throw err;\n }\n return [];\n }\n}\n\n/**\n * Find the lowest published version that satisfies `>= firstPatchedVersion`\n * and is semver-compatible with the currently installed version (same major,\n * unless there is no same-major option).\n *\n * Strategy:\n * 1. Try same-major, lowest version >= firstPatchedVersion\n * 2. Fallback: any published version >= firstPatchedVersion (lowest)\n * 3. Returns undefined if nothing found\n */\nexport async function findSafeUpgradeVersion(\n packageName: string,\n installedVersion: string,\n firstPatchedVersion: string,\n vulnerableRange?: string,\n): Promise<string | undefined> {\n const resolution = await resolveSafeUpgradeVersion(\n packageName,\n installedVersion,\n firstPatchedVersion,\n vulnerableRange,\n );\n\n return resolution.safeVersion;\n}\n\nexport async function resolveSafeUpgradeVersion(\n packageName: string,\n installedVersion: string,\n firstPatchedVersion: string,\n vulnerableRange?: string,\n): Promise<SafeUpgradeResolution> {\n const versions = await fetchPackageVersions(packageName);\n if (!versions.length) {\n return {\n candidates: {},\n majorOnlyFixAvailable: false,\n };\n }\n\n const installed = semver.parse(installedVersion);\n\n // All versions >= firstPatchedVersion, sorted ascending\n const candidates = versions\n .filter((v) => semver.valid(v) && semver.gte(v, firstPatchedVersion))\n .filter((v) => {\n if (!vulnerableRange) return true;\n try {\n return !semver.satisfies(v, vulnerableRange, { includePrerelease: false });\n } catch {\n // If vulnerable range cannot be parsed, avoid filtering out candidates.\n return true;\n }\n })\n .sort(semver.compare);\n\n if (!candidates.length) {\n return {\n candidates: {},\n majorOnlyFixAvailable: false,\n };\n }\n\n const categorizedCandidates: SafeUpgradeResolution[\"candidates\"] = {};\n\n for (const candidate of candidates) {\n const level = classifyUpgradeLevel(installedVersion, candidate);\n if (!level) continue;\n if (!categorizedCandidates[level]) {\n categorizedCandidates[level] = candidate;\n }\n }\n\n const safeVersion =\n categorizedCandidates.patch ?? categorizedCandidates.minor ?? categorizedCandidates.major;\n\n if (!safeVersion) {\n return {\n candidates: categorizedCandidates,\n majorOnlyFixAvailable: false,\n };\n }\n\n const upgradeLevel = classifyUpgradeLevel(installedVersion, safeVersion);\n const majorOnlyFixAvailable =\n !categorizedCandidates.patch &&\n !categorizedCandidates.minor &&\n Boolean(categorizedCandidates.major);\n\n if (!installed || !upgradeLevel) {\n return {\n safeVersion,\n upgradeLevel,\n candidates: categorizedCandidates,\n majorOnlyFixAvailable,\n };\n }\n\n return {\n safeVersion,\n upgradeLevel,\n candidates: categorizedCandidates,\n majorOnlyFixAvailable,\n };\n}\n\nexport function classifyUpgradeLevel(\n installedVersion: string,\n candidateVersion: string,\n): SafeUpgradeLevel | undefined {\n const installed = semver.parse(installedVersion) ?? semver.coerce(installedVersion);\n const candidate = semver.parse(candidateVersion) ?? semver.coerce(candidateVersion);\n\n if (!installed || !candidate) return undefined;\n if (!semver.gte(candidate.version, installed.version)) return undefined;\n\n if (candidate.major > installed.major) return \"major\";\n if (candidate.major === installed.major && candidate.minor > installed.minor) return \"minor\";\n if (candidate.major === installed.major && candidate.minor === installed.minor) {\n if (candidate.patch >= installed.patch) return \"patch\";\n }\n\n return undefined;\n}\n\n/**\n * Get the tarball URL for a specific package version.\n * Used by the patch generation fallback path.\n */\nexport async function getTarballUrl(\n packageName: string,\n version: string,\n): Promise<string | undefined> {\n const url = `${NPM_REGISTRY}/${encodeURIComponent(packageName)}/${encodeURIComponent(version)}`;\n\n try {\n const res = await httpClient({ url });\n\n if (!res.ok) return undefined;\n\n const data = res.data as {\n dist?: { tarball?: string };\n };\n return data.dist?.tarball;\n } catch {\n return undefined;\n }\n}\n\n// ---------------------------------------------------------------------------\n// Outdated package detection\n// ---------------------------------------------------------------------------\n\nexport interface NpmRegistryPackageInfo {\n /** The version currently installed in node_modules */\n currentVersion: string;\n /** Latest version satisfying the declared semver range */\n wantedVersion: string;\n /** Absolute latest version published on the registry */\n latestVersion: string;\n /** True when latestVersion crosses a major boundary from currentVersion */\n isMajorBump: boolean;\n /** \"direct\" if listed in root package.json; \"transitive\" otherwise */\n dependencyScope: \"direct\" | \"transitive\";\n}\n\ninterface NpmOutdatedEntry {\n current?: string;\n wanted?: string;\n latest?: string;\n type?: string;\n}\n\n/**\n * Reads package.json at cwd, resolves all deps against npm registry via the\n * package-manager's outdated command, and returns info keyed by package name.\n *\n * If `includeTransitive` is false (default), only direct dependencies are returned.\n * Private/unavailable packages are skipped silently.\n * Registry unavailability throws with a descriptive message.\n */\nexport async function queryOutdatedPackages(\n cwd: string,\n options: { includeTransitive?: boolean; packageManager?: string } = {},\n): Promise<Map<string, NpmRegistryPackageInfo>> {\n const pm = (options.packageManager ?? detectPackageManager(cwd)) as PackageManager;\n\n // Determine the outdated command per PM\n let stdout: string;\n try {\n // npm and pnpm both use --json for machine-readable output.\n // Yarn v1 uses --json as well (NDJSON), so we attempt all the same way.\n // These commands exit with code 1 when outdated packages exist — that is expected.\n const args: string[] = pm === \"pnpm\" ? [\"outdated\", \"--json\"] : [\"outdated\", \"--json\"];\n const yarnArgs = pm === \"yarn\" ? [\"outdated\", \"--json\"] : undefined;\n const finalArgs = yarnArgs ?? args;\n\n const result = await execa(pm, finalArgs, {\n cwd,\n reject: false,\n stdio: \"pipe\",\n });\n\n // Exit code 0 = no outdated packages; 1 = outdated packages (expected).\n // Any other code or no stdout on a non-zero exit = real failure.\n if (result.exitCode !== 0 && result.exitCode !== 1) {\n const stderr = typeof result.stderr === \"string\" ? result.stderr : \"\";\n if (!result.stdout) {\n throw new Error(\n `${pm} outdated --json failed (exit ${result.exitCode}): ${stderr.slice(0, 500)}`,\n );\n }\n }\n stdout = typeof result.stdout === \"string\" ? result.stdout : \"\";\n } catch (err) {\n if (err instanceof Error && !err.message.includes(\"outdated --json failed\")) {\n throw new Error(`Failed to query outdated packages: ${err.message}`);\n }\n throw err;\n }\n\n if (!stdout.trim()) {\n return new Map();\n }\n\n // Parse the npm/pnpm JSON format.\n // npm: { \"packageName\": { current, wanted, latest, type } }\n // pnpm v7+: may be array — handle both as best effort.\n // yarn v1: NDJSON — parse each line.\n const rawEntries: Record<string, NpmOutdatedEntry> = {};\n\n if (pm === \"yarn\") {\n // yarn outdated --json emits newline-delimited JSON objects\n for (const line of stdout.split(\"\\n\")) {\n const trimmed = line.trim();\n if (!trimmed) continue;\n try {\n const parsed = JSON.parse(trimmed) as { type?: string; data?: unknown };\n if (parsed.type === \"table\" && parsed.data) {\n const tableData = parsed.data as {\n head?: string[];\n body?: string[][];\n };\n const head = tableData.head ?? [];\n const currentIdx = head.indexOf(\"Current\");\n const wantedIdx = head.indexOf(\"Wanted\");\n const latestIdx = head.indexOf(\"Latest\");\n for (const row of tableData.body ?? []) {\n const name = row[0];\n if (!name) continue;\n rawEntries[name] = {\n current: row[currentIdx] ?? \"\",\n wanted: row[wantedIdx] ?? \"\",\n latest: row[latestIdx] ?? \"\",\n type: row[head.indexOf(\"Package Type\")] ?? \"dependencies\",\n };\n }\n }\n } catch {\n // Skip unparseable lines\n }\n }\n } else {\n // npm and pnpm JSON formats\n try {\n const parsed = JSON.parse(stdout);\n if (Array.isArray(parsed)) {\n // pnpm v7+ array format: [{ name, current, wanted, latest, dependencyType }]\n for (const entry of parsed as Array<{\n name?: string;\n packageName?: string;\n current?: string;\n wanted?: string;\n latest?: string;\n dependencyType?: string;\n }>) {\n const name = entry.name ?? entry.packageName;\n if (!name) continue;\n rawEntries[name] = {\n current: entry.current,\n wanted: entry.wanted,\n latest: entry.latest,\n type: entry.dependencyType,\n };\n }\n } else {\n // npm standard object format\n Object.assign(rawEntries, parsed as Record<string, NpmOutdatedEntry>);\n }\n } catch {\n throw new Error(`Could not parse ${pm} outdated --json output.`);\n }\n }\n\n // Read package.json to determine direct vs transitive deps\n let directDeps: Set<string>;\n try {\n const pkgRaw = JSON.parse(readFileSync(join(cwd, \"package.json\"), \"utf8\")) as {\n dependencies?: Record<string, string>;\n devDependencies?: Record<string, string>;\n };\n directDeps = new Set([\n ...Object.keys(pkgRaw.dependencies ?? {}),\n ...Object.keys(pkgRaw.devDependencies ?? {}),\n ]);\n } catch {\n directDeps = new Set();\n }\n\n const result = new Map<string, NpmRegistryPackageInfo>();\n\n for (const [name, entry] of Object.entries(rawEntries)) {\n const currentVersion = entry.current ?? \"\";\n const wantedVersion = entry.wanted ?? currentVersion;\n const latestVersion = entry.latest ?? currentVersion;\n\n if (!currentVersion || !latestVersion) continue;\n\n const dependencyScope: \"direct\" | \"transitive\" = directDeps.has(name) ? \"direct\" : \"transitive\";\n\n // Skip transitive if not requested\n if (!options.includeTransitive && dependencyScope === \"transitive\") continue;\n\n const isMajorBump =\n semver.valid(currentVersion) !== null &&\n semver.valid(latestVersion) !== null &&\n semver.major(latestVersion) > semver.major(currentVersion);\n\n result.set(name, {\n currentVersion,\n wantedVersion,\n latestVersion,\n isMajorBump,\n dependencyScope,\n });\n }\n\n return result;\n}\n","import { execa, type Options as ExecaOptions, type ResultPromise } from \"execa\";\n\nexport type SafeExecOptions = ExecaOptions & {\n timeoutMs?: number;\n allowNodeOptions?: boolean;\n};\n\nconst DANGEROUS_ENV_VARS = new Set([\n \"NODE_OPTIONS\",\n \"NODE_PATH\",\n \"LD_PRELOAD\",\n \"LD_LIBRARY_PATH\",\n \"DYLD_INSERT_LIBRARIES\",\n \"DYLD_LIBRARY_PATH\",\n \"PERL5OPT\",\n \"PERL5LIB\",\n \"PYTHONWARNINGS\",\n \"PYTHONPATH\",\n \"RUBYOPT\",\n \"RUBYLIB\",\n \"BASH_ENV\",\n \"ENV\",\n]);\n\n/**\n * Sanitizes environment variables to prevent process-injection and supply chain attacks.\n */\nexport function sanitizeEnvironment(\n env: NodeJS.ProcessEnv = process.env,\n allowNodeOptions = false,\n): NodeJS.ProcessEnv {\n const sanitized: NodeJS.ProcessEnv = {};\n\n for (const [key, value] of Object.entries(env)) {\n if (value === undefined) continue;\n if (key.includes(\"\\0\") || (typeof value === \"string\" && value.includes(\"\\0\"))) continue;\n if (DANGEROUS_ENV_VARS.has(key)) {\n if (key === \"NODE_OPTIONS\" && allowNodeOptions) {\n sanitized[key] = value;\n }\n continue;\n }\n sanitized[key] = value;\n }\n\n return sanitized;\n}\n\n/**\n * Validates command line arguments for safety (blocking null bytes and malformed tokens).\n */\nexport function validateCommandArguments(file: string, args: readonly string[] = []): void {\n if (file.includes(\"\\0\")) {\n throw new Error(\"Command execution blocked: executable path contains null bytes\");\n }\n for (const arg of args) {\n if (arg.includes(\"\\0\")) {\n throw new Error(`Command execution blocked: argument contains null bytes: ${arg}`);\n }\n }\n}\n\n/**\n * Safe wrapper around execa that enforces environment sanitization, timeouts, and argument safety.\n */\nexport function safeExeca(\n file: string,\n args: readonly string[] = [],\n options: SafeExecOptions = {},\n): ResultPromise {\n validateCommandArguments(file, args);\n\n const timeout =\n options.timeoutMs ?? (typeof options.timeout === \"number\" ? options.timeout : 60_000);\n const sanitizedEnv = sanitizeEnvironment(\n (options.env as NodeJS.ProcessEnv) ?? process.env,\n options.allowNodeOptions,\n );\n\n return execa(file, args as string[], {\n ...options,\n timeout,\n env: sanitizedEnv,\n });\n}\n","import { safeExeca } from \"../../../platform/safe-exec.js\";\nimport { resolveWhyCommand, type PackageManager } from \"../../../platform/package-manager/index.js\";\n\nexport interface RawPackageJson {\n overrides?: Record<string, string>;\n resolutions?: Record<string, string>;\n pnpm?: {\n overrides?: Record<string, string>;\n [key: string]: unknown;\n };\n [key: string]: unknown;\n}\n\nexport interface WhyConstraints {\n workspace?: string;\n}\n\nexport async function collectDependencyTrace(\n cwd: string,\n pm: PackageManager,\n packageName: string,\n constraints: WhyConstraints,\n): Promise<string | undefined> {\n try {\n const whyCommand = resolveWhyCommand(pm, packageName, constraints);\n if (whyCommand.length === 0) return undefined;\n const [whyCmd, ...whyArgs] = whyCommand;\n const result = await safeExeca(whyCmd, whyArgs, {\n cwd,\n stdio: \"pipe\",\n reject: false,\n });\n\n const output = [result.stdout, result.stderr]\n .filter(Boolean)\n .join(\"\\n\")\n .split(\"\\n\")\n .map((line) => line.trim())\n .filter(Boolean);\n\n if (output.length === 0) return undefined;\n return output.slice(0, 3).join(\" | \");\n } catch {\n return undefined;\n }\n}\n\nexport function describeOverrideField(packageManager: PackageManager): string {\n if (packageManager === \"npm\" || packageManager === \"bun\") return \"overrides\";\n if (packageManager === \"pnpm\") return \"pnpm.overrides\";\n if (packageManager === \"deno\") return \"overrides\";\n return \"resolutions\";\n}\n\nexport function getOverrideValue(\n pkgJson: RawPackageJson,\n packageManager: PackageManager,\n packageName: string,\n): string | undefined {\n if (packageManager === \"npm\" || packageManager === \"bun\" || packageManager === \"deno\") {\n return pkgJson.overrides?.[packageName];\n }\n if (packageManager === \"pnpm\") return pkgJson.pnpm?.overrides?.[packageName];\n return pkgJson.resolutions?.[packageName];\n}\n\nexport function setOverrideValue(\n pkgJson: RawPackageJson,\n packageManager: PackageManager,\n packageName: string,\n version: string,\n): void {\n if (packageManager === \"npm\" || packageManager === \"bun\" || packageManager === \"deno\") {\n pkgJson.overrides = { ...pkgJson.overrides, [packageName]: version };\n return;\n }\n\n if (packageManager === \"pnpm\") {\n pkgJson.pnpm = {\n ...pkgJson.pnpm,\n overrides: {\n ...pkgJson.pnpm?.overrides,\n [packageName]: version,\n },\n };\n return;\n }\n\n pkgJson.resolutions = { ...pkgJson.resolutions, [packageName]: version };\n}\n\nexport function restoreOverrideValue(\n pkgJson: RawPackageJson,\n packageManager: PackageManager,\n packageName: string,\n previousValue?: string,\n): void {\n if (packageManager === \"npm\" || packageManager === \"bun\" || packageManager === \"deno\") {\n pkgJson.overrides = restoreRecord(pkgJson.overrides, packageName, previousValue);\n return;\n }\n\n if (packageManager === \"pnpm\") {\n pkgJson.pnpm = {\n ...pkgJson.pnpm,\n overrides: restoreRecord(pkgJson.pnpm?.overrides, packageName, previousValue),\n };\n if (!pkgJson.pnpm.overrides) {\n delete pkgJson.pnpm.overrides;\n }\n if (Object.keys(pkgJson.pnpm).length === 0) {\n delete pkgJson.pnpm;\n }\n return;\n }\n\n pkgJson.resolutions = restoreRecord(pkgJson.resolutions, packageName, previousValue);\n}\n\n// ---- Deno native (deno.json import map) override helpers ----\n\nexport interface DenoJson {\n imports?: Record<string, string>;\n [key: string]: unknown;\n}\n\n/**\n * Get the current entry for a package from deno.json imports.\n * Checks both bare `\"pkgName\"` and `\"npm:pkgName\"` specifier forms.\n */\nexport function getDenoJsonImportValue(\n denoJson: DenoJson,\n packageName: string,\n): { key: string; value: string } | undefined {\n const imports = denoJson.imports ?? {};\n if (imports[packageName] !== undefined) {\n return { key: packageName, value: imports[packageName] };\n }\n const npmKey = `npm:${packageName}`;\n if (imports[npmKey] !== undefined) {\n return { key: npmKey, value: imports[npmKey] };\n }\n return undefined;\n}\n\n/**\n * Set an import-map entry for a package in deno.json to the target npm version.\n * Uses the existing key form if present, otherwise adds `\"npm:pkgName\"`.\n */\nexport function setDenoJsonImportValue(\n denoJson: DenoJson,\n packageName: string,\n version: string,\n): void {\n const existing = getDenoJsonImportValue(denoJson, packageName);\n const key = existing?.key ?? `npm:${packageName}`;\n denoJson.imports = { ...denoJson.imports, [key]: `npm:${packageName}@${version}` };\n}\n\n/**\n * Restore a deno.json import entry to its previous state.\n * If no previous entry existed, removes the key that was added.\n */\nexport function restoreDenoJsonImportValue(\n denoJson: DenoJson,\n packageName: string,\n previousEntry?: { key: string; value: string },\n): void {\n const existing = getDenoJsonImportValue(denoJson, packageName);\n if (!existing) return;\n\n const imports = { ...denoJson.imports };\n if (previousEntry === undefined) {\n delete imports[existing.key];\n } else {\n // Remove the current key (may differ in form) and restore previous\n delete imports[existing.key];\n imports[previousEntry.key] = previousEntry.value;\n }\n\n denoJson.imports = Object.keys(imports).length > 0 ? imports : undefined;\n}\n\nfunction restoreRecord(\n record: Record<string, string> | undefined,\n key: string,\n previousValue?: string,\n): Record<string, string> | undefined {\n const nextRecord = { ...record };\n\n if (previousValue === undefined) {\n delete nextRecord[key];\n } else {\n nextRecord[key] = previousValue;\n }\n\n return Object.keys(nextRecord).length > 0 ? nextRecord : undefined;\n}\n","import { existsSync, mkdirSync, readFileSync, writeFileSync } from \"node:fs\";\nimport { join } from \"node:path\";\nimport type { RemediationReport } from \"./types.js\";\n\ninterface IdempotencyEntry {\n key: string;\n cveId: string;\n report: RemediationReport;\n savedAt: string;\n}\n\ninterface IdempotencyIndex {\n schemaVersion: \"1.0\";\n entries: Record<string, IdempotencyEntry>;\n}\n\nconst DEFAULT_INDEX: IdempotencyIndex = {\n schemaVersion: \"1.0\",\n entries: {},\n};\n\nfunction indexFilePath(cwd: string): string {\n return join(cwd, \".autoremediator\", \"state\", \"idempotency.json\");\n}\n\nfunction entryKey(idempotencyKey: string, cveId: string): string {\n return `${idempotencyKey}::${cveId.toUpperCase()}`;\n}\n\nfunction loadIndex(cwd: string): IdempotencyIndex {\n const filePath = indexFilePath(cwd);\n if (!existsSync(filePath)) return DEFAULT_INDEX;\n\n try {\n const parsed = JSON.parse(readFileSync(filePath, \"utf8\")) as IdempotencyIndex;\n if (parsed && parsed.schemaVersion === \"1.0\" && parsed.entries) {\n return parsed;\n }\n return DEFAULT_INDEX;\n } catch {\n return DEFAULT_INDEX;\n }\n}\n\nfunction saveIndex(cwd: string, index: IdempotencyIndex): void {\n const filePath = indexFilePath(cwd);\n mkdirSync(join(cwd, \".autoremediator\", \"state\"), { recursive: true });\n writeFileSync(filePath, JSON.stringify(index, null, 2) + \"\\n\", \"utf8\");\n}\n\nexport function readIdempotentReport(\n cwd: string,\n idempotencyKey: string,\n cveId: string,\n): RemediationReport | undefined {\n const index = loadIndex(cwd);\n const key = entryKey(idempotencyKey, cveId);\n return index.entries[key]?.report;\n}\n\nexport function storeIdempotentReport(\n cwd: string,\n idempotencyKey: string,\n cveId: string,\n report: RemediationReport,\n): void {\n const index = loadIndex(cwd);\n const key = entryKey(idempotencyKey, cveId);\n index.entries[key] = {\n key: idempotencyKey,\n cveId: cveId.toUpperCase(),\n report,\n savedAt: new Date().toISOString(),\n };\n saveIndex(cwd, index);\n}\n","/**\n * Autoremediator agentic loop\n *\n * Orchestrates the full CVE patching pipeline using Vercel AI SDK's\n * generateText with a tool-calling loop.\n */\nimport { generateText } from \"ai\";\nimport { estimateModelCostUsd, resolveProvider } from \"../platform/config.js\";\nimport type {\n CveDetails,\n LlmUsageMetrics,\n PatchResult,\n RemediateOptions,\n RemediationReport,\n VulnerablePackage,\n} from \"../platform/types.js\";\nimport { runLocalRemediationPipeline } from \"./local/index.js\";\nexport { assessPackageReachability } from \"./tools/check-reachability.js\";\nimport { accumulateStepResults } from \"./strategies/pipeline-telemetry.js\";\nimport {\n createPipelineRuntime,\n createProgressEmitter,\n createRuntimeToolsForRun,\n} from \"./pipeline-runtime/index.js\";\n\nexport async function runRemediationPipeline(\n cveId: string,\n options: RemediateOptions = {},\n): Promise<RemediationReport> {\n const provider = resolveProvider(options);\n if (provider === \"local\") {\n return runLocalRemediationPipeline(cveId, options);\n }\n\n const emitProgress = createProgressEmitter(options);\n\n emitProgress(\"pipeline-start\", `Starting remediation for ${cveId}.`, { provider });\n\n const runtime = await createPipelineRuntime(cveId, options);\n const { model, modelName, prompt, systemPrompt } = runtime;\n emitProgress(\"model-selected\", `Selected model ${modelName}.`, { provider, model: modelName });\n\n let collectedResults: PatchResult[] = [];\n let vulnerablePackages: VulnerablePackage[] = [];\n let cveDetails: CveDetails | null = null;\n let agentSteps = 0;\n\n function getDependencyScope(packageName: string): \"direct\" | \"transitive\" | undefined {\n const match = vulnerablePackages.find((pkg) => pkg.installed.name === packageName);\n if (!match) return undefined;\n return match.installed.type === \"direct\" ? \"direct\" : \"transitive\";\n }\n const tools = createRuntimeToolsForRun(options);\n\n const started = Date.now();\n const result = await generateText({\n model,\n system: systemPrompt,\n prompt,\n tools,\n stopWhen: ({ steps }) => steps.length >= 25,\n onStepFinish(stepResult) {\n agentSteps += 1;\n\n const toolResults = (stepResult.toolResults ?? []) as Array<{\n toolName: string;\n result?: unknown;\n }>;\n\n const aggregation = accumulateStepResults({\n toolResults,\n cveDetails,\n vulnerablePackages,\n collectedResults,\n getDependencyScope,\n });\n cveDetails = aggregation.cveDetails;\n vulnerablePackages = aggregation.vulnerablePackages;\n collectedResults = aggregation.collectedResults;\n\n emitProgress(\n \"agent-step\",\n `Completed agent step ${agentSteps} with ${toolResults.length} tool result(s).`,\n {\n provider,\n model: modelName,\n },\n );\n },\n });\n\n const llmUsage: LlmUsageMetrics[] = [\n {\n purpose: \"orchestration\",\n provider,\n model: modelName,\n latencyMs: Date.now() - started,\n promptChars: prompt.length + systemPrompt.length,\n completionChars: result.text.length,\n estimatedCostUsd: estimateModelCostUsd({\n provider,\n promptChars: prompt.length + systemPrompt.length,\n completionChars: result.text.length,\n }),\n },\n ];\n\n emitProgress(\n \"pipeline-finish\",\n `Completed remediation with ${collectedResults.length} result(s).`,\n {\n provider,\n model: modelName,\n },\n );\n\n return {\n cveId,\n cveDetails,\n vulnerablePackages,\n results: collectedResults,\n agentSteps,\n summary: result.text,\n llmUsage,\n correlation: {\n requestId: options.requestId,\n sessionId: options.sessionId,\n parentRunId: options.parentRunId,\n },\n };\n}\n","import semver from \"semver\";\nimport { lookupCveOsv } from \"../../intelligence/sources/osv.js\";\nimport {\n lookupCveGitHub,\n mergeGhDataIntoCveDetails,\n} from \"../../intelligence/sources/github-advisory.js\";\nimport { enrichWithNvd } from \"../../intelligence/sources/nvd.js\";\nimport {\n loadIntelligenceSnapshot,\n lookupSnapshotCve,\n} from \"../../intelligence/sources/snapshot.js\";\nimport type {\n CveDetails,\n InventoryPackage,\n LlmUsageMetrics,\n PatchResult,\n RemediateOptions,\n RemediationReport,\n VulnerablePackage,\n} from \"../../platform/types.js\";\nimport { checkInventoryTool } from \"../tools/check-inventory.js\";\nimport { assessPackageReachability } from \"../tools/check-reachability.js\";\nimport { runSecOpsPreflight } from \"./secops-preflight.js\";\nimport { buildSbom } from \"./sbom.js\";\nimport { resolvePrimaryResult } from \"./primary-strategy.js\";\nimport { shouldAttemptPatchFallback, tryLocalPatchFallback } from \"./fallback.js\";\nimport { resolveLocalRunOptions } from \"./options.js\";\nimport { findVulnerablePackages } from \"./vulnerability-match.js\";\nimport { buildLocalSummary } from \"./summary.js\";\nimport { applyDispositionAndContainment } from \"./disposition.js\";\nimport { computeEscalationAction } from \"../../platform/escalation.js\";\nimport { createProjectSnapshot } from \"../../platform/rollback.js\";\nimport { isPackageAllowed, loadPolicy } from \"../../platform/policy.js\";\n\nexport async function runLocalRemediationPipeline(\n cveId: string,\n options: RemediateOptions = {},\n): Promise<RemediationReport> {\n const resolved = resolveLocalRunOptions(options);\n const { cwd, packageManager, dryRun, constraints } = resolved;\n\n const correlation = {\n requestId: options.requestId,\n sessionId: options.sessionId,\n parentRunId: options.parentRunId,\n };\n\n const collectedResults: PatchResult[] = [];\n const llmUsage: LlmUsageMetrics[] = [];\n let vulnerablePackages: VulnerablePackage[] = [];\n let cveDetails: CveDetails | null = null;\n let agentSteps = 0;\n\n const normalizedId = cveId.toUpperCase();\n let osvDetails: Awaited<ReturnType<typeof lookupCveOsv>> = null;\n let ghPackages: Awaited<ReturnType<typeof lookupCveGitHub>> = [];\n\n if (resolved.offlineIntelligence) {\n if (resolved.intelligenceSnapshotPath) {\n osvDetails = lookupSnapshotCve(\n loadIntelligenceSnapshot(resolved.intelligenceSnapshotPath),\n normalizedId,\n );\n }\n } else {\n [osvDetails, ghPackages] = await Promise.all([\n lookupCveOsv(normalizedId),\n lookupCveGitHub(normalizedId).catch(() => []),\n ]);\n agentSteps += 2;\n }\n\n if (!osvDetails && ghPackages.length === 0) {\n return {\n cveId,\n cveDetails: null,\n vulnerablePackages,\n results: collectedResults,\n agentSteps,\n summary: resolved.offlineIntelligence\n ? `Offline mode: ${normalizedId} not found in intelligence snapshot.`\n : `Local mode failed at lookup-cve: ${normalizedId} not found in OSV or GitHub advisory data.`,\n correlation,\n };\n }\n\n cveDetails = osvDetails ?? {\n id: normalizedId,\n summary: \"Details sourced from GitHub Advisory Database.\",\n severity: \"UNKNOWN\",\n references: [],\n affectedPackages: [],\n };\n\n if (ghPackages.length > 0) {\n cveDetails = mergeGhDataIntoCveDetails(cveDetails, ghPackages);\n }\n if (!resolved.offlineIntelligence) {\n cveDetails = await enrichWithNvd(cveDetails);\n }\n\n const preflight = await runSecOpsPreflight(normalizedId, cveDetails, resolved);\n\n if (preflight.suppressed) {\n return {\n cveId,\n cveDetails,\n vulnerablePackages: [],\n results: [],\n agentSteps,\n summary: preflight.summary,\n correlation,\n };\n }\n\n const { exploitSignalTriggered, slaBreaches } = preflight;\n\n if (cveDetails.affectedPackages.length === 0) {\n return {\n cveId,\n cveDetails,\n vulnerablePackages,\n results: collectedResults,\n agentSteps,\n summary: `Local mode lookup succeeded but no npm affected packages were found for ${normalizedId}.`,\n exploitSignalTriggered,\n slaBreaches,\n correlation,\n };\n }\n\n const inventory = await checkInventoryTool.execute({\n cwd,\n packageManager,\n policy: options.policy,\n workspace: constraints.workspace,\n });\n agentSteps += 1;\n\n if (inventory?.error) {\n return {\n cveId,\n cveDetails,\n vulnerablePackages,\n results: collectedResults,\n agentSteps,\n summary: `Local mode failed at check-inventory: ${inventory.error}`,\n exploitSignalTriggered,\n slaBreaches,\n correlation,\n };\n }\n\n const installedPackages = (inventory.packages ?? []) as Array<{\n name: string;\n version: string;\n type: \"direct\" | \"transitive\";\n }>;\n\n vulnerablePackages = findVulnerablePackages(cveDetails, installedPackages);\n agentSteps += 1;\n\n const effectivePolicy = loadPolicy(cwd, options.policy);\n const containmentMode = options.containmentMode ?? effectivePolicy.containmentMode ?? false;\n const dispositionPolicy = options.dispositionPolicy ?? effectivePolicy.dispositionPolicy;\n\n for (const vulnerable of vulnerablePackages) {\n const snapshot = await createProjectSnapshot(cwd);\n\n const finalizePatchResult = (result: PatchResult): PatchResult => {\n const withDisposition = applyDispositionAndContainment(result, {\n exploitSignalTriggered,\n slaBreaches,\n severity: cveDetails?.severity,\n policy: dispositionPolicy,\n containmentMode,\n cwd,\n snapshot,\n });\n if (withDisposition.unresolvedReason) {\n withDisposition.escalationAction = computeEscalationAction(\n withDisposition.unresolvedReason,\n resolved.escalationGraph,\n );\n }\n return withDisposition;\n };\n\n if (!isPackageAllowed(effectivePolicy, vulnerable.installed.name)) {\n collectedResults.push(\n finalizePatchResult({\n packageName: vulnerable.installed.name,\n fromVersion: vulnerable.installed.version,\n strategy: \"none\",\n applied: false,\n dryRun,\n unresolvedReason: \"policy-blocked\",\n message: `Policy denyPackages blocked changes for package \"${vulnerable.installed.name}\".`,\n }),\n );\n continue;\n }\n\n if (resolved.skipUnreachable) {\n const reach = assessPackageReachability(cwd, vulnerable.installed.name);\n if (reach.status === \"not-reachable\") {\n collectedResults.push(\n finalizePatchResult({\n packageName: vulnerable.installed.name,\n fromVersion: vulnerable.installed.version,\n strategy: \"none\",\n applied: false,\n dryRun,\n message: `Skipped: '${vulnerable.installed.name}' is not reachable from source code.`,\n reachability: reach,\n }),\n );\n continue;\n }\n }\n const primary = await resolvePrimaryResult({\n vulnerable,\n cwd,\n packageManager,\n dryRun,\n policy: resolved.policy,\n runTests: resolved.runTests,\n constraints,\n proofOfFix: resolved.proofOfFix,\n requireProofOfFix: resolved.requireProofOfFix,\n reproductionTest: options.reproductionTest,\n patchesDir: resolved.patchesDir,\n });\n agentSteps += primary.steps;\n\n if (shouldAttemptPatchFallback(primary.result, constraints.preferVersionBump ?? false)) {\n const fallback = await tryLocalPatchFallback({\n cwd,\n packageManager,\n packageName: vulnerable.installed.name,\n vulnerableVersion: vulnerable.installed.version,\n cveId: normalizedId,\n cveSummary: cveDetails?.summary ?? normalizedId,\n dependencyScope: vulnerable.installed.type === \"direct\" ? \"direct\" : \"transitive\",\n dryRun,\n runTests: resolved.runTests,\n patchesDir: resolved.patchesDir,\n llmProvider: resolved.llmProvider,\n model: options.model,\n policy: options.policy,\n modelPersonality: options.modelPersonality,\n providerSafetyProfile: resolved.providerSafetyProfile,\n requireConsensusForHighRisk: resolved.requireConsensusForHighRisk,\n consensusProvider: resolved.consensusProvider,\n consensusModel: resolved.consensusModel,\n patchConfidenceThresholds: resolved.patchConfidenceThresholds,\n dynamicModelRouting: resolved.dynamicModelRouting,\n dynamicRoutingThresholdChars: resolved.dynamicRoutingThresholdChars,\n installMode: constraints.installMode,\n installPreferOffline: constraints.installPreferOffline,\n enforceFrozenLockfile: constraints.enforceFrozenLockfile,\n workspace: constraints.workspace,\n vulnerableRange: vulnerable.affected.vulnerableRange,\n proofOfFix: resolved.proofOfFix,\n requireProofOfFix: resolved.requireProofOfFix,\n });\n agentSteps += fallback.steps;\n collectedResults.push(finalizePatchResult(fallback.result));\n if (fallback.usage) {\n llmUsage.push(...fallback.usage);\n }\n continue;\n }\n\n const primaryResult: PatchResult = {\n ...primary.result,\n dependencyScope: vulnerable.installed.type === \"direct\" ? \"direct\" : \"transitive\",\n };\n\n if (resolved.regressionCheck && primaryResult.applied && !dryRun && primaryResult.toVersion) {\n try {\n if (\n semver.satisfies(primaryResult.toVersion, vulnerable.affected.vulnerableRange, {\n includePrerelease: false,\n })\n ) {\n primaryResult.regressionDetected = true;\n }\n } catch {\n primaryResult.regressionDetected = false;\n }\n }\n\n collectedResults.push(finalizePatchResult(primaryResult));\n }\n\n const vulnerableNames = new Set(vulnerablePackages.map((v) => v.installed.name));\n const sbom = buildSbom(\n installedPackages as InventoryPackage[],\n vulnerableNames,\n collectedResults,\n );\n\n return {\n cveId,\n cveDetails,\n vulnerablePackages,\n results: collectedResults,\n agentSteps,\n summary: buildLocalSummary(vulnerablePackages, collectedResults),\n llmUsage: llmUsage.length > 0 ? llmUsage : undefined,\n exploitSignalTriggered,\n slaBreaches,\n sbom,\n correlation,\n };\n}\n","/**\n * GitHub Advisory Database API client\n *\n * Used as a secondary source to enrich CVE data with `first_patched_version`.\n * Unauthenticated access works; set GITHUB_TOKEN env var for higher rate limits.\n *\n * Uses shared HTTP client for all API communication.\n */\nimport type { AffectedPackage, CveDetails } from \"../../platform/types.js\";\nimport { getGitHubToken } from \"../../platform/config.js\";\nimport { httpClient } from \"../../platform/http-client.js\";\n\n// ---------------------------------------------------------------------------\n// Raw GitHub Advisory response types\n// ---------------------------------------------------------------------------\n\ninterface GhVulnerability {\n package: {\n ecosystem: string;\n name: string;\n };\n vulnerable_version_range: string | null;\n first_patched_version: string | null;\n}\n\ninterface GhAdvisory {\n ghsa_id: string;\n cve_id: string | null;\n summary: string;\n severity: \"low\" | \"moderate\" | \"high\" | \"critical\" | \"unknown\";\n vulnerabilities: GhVulnerability[];\n cvss?: { score: number; vector_string: string };\n references: Array<{ url: string }>;\n}\n\n// ---------------------------------------------------------------------------\n// Public API\n// ---------------------------------------------------------------------------\n\nconst GITHUB_API_BASE = \"https://api.github.com/advisories\";\n\n/**\n * Fetch GitHub advisories for a given CVE ID filtered to npm ecosystem.\n * Returns an empty array if none found.\n */\nexport async function fetchGhAdvisories(cveId: string): Promise<GhAdvisory[]> {\n const token = getGitHubToken();\n const headers: Record<string, string> = {\n \"X-GitHub-Api-Version\": \"2022-11-28\",\n \"User-Agent\": \"autoremediator\",\n };\n\n if (token) {\n headers[\"Authorization\"] = `token ${token}`;\n }\n\n const normalized = cveId.trim();\n if (normalized.toUpperCase().startsWith(\"GHSA-\")) {\n const url = `${GITHUB_API_BASE}/${encodeURIComponent(normalized)}`;\n try {\n const res = await httpClient({ url, headers });\n if (!res.ok) {\n if (res.status === 404) return [];\n throw new Error(`HTTP ${res.status}: ${res.text}`);\n }\n return res.data ? [res.data as GhAdvisory] : [];\n } catch (err) {\n const errorMsg = err instanceof Error ? err.message : String(err);\n console.warn(\n `[autoremediator] GitHub Advisory API error for ${cveId}: ${errorMsg} — skipping.`,\n );\n return [];\n }\n }\n\n const url = new URL(GITHUB_API_BASE);\n url.searchParams.set(\"cve_id\", cveId);\n url.searchParams.set(\"ecosystem\", \"npm\");\n url.searchParams.set(\"type\", \"reviewed\");\n url.searchParams.set(\"per_page\", \"10\");\n\n try {\n const res = await httpClient({\n url: url.toString(),\n headers,\n });\n\n if (!res.ok) {\n if (res.status === 404) return [];\n throw new Error(`HTTP ${res.status}: ${res.text}`);\n }\n\n return (Array.isArray(res.data) ? res.data : []) as GhAdvisory[];\n } catch (err) {\n // Non-fatal: log and return empty so OSV can still succeed\n const errorMsg = err instanceof Error ? err.message : String(err);\n console.warn(\n `[autoremediator] GitHub Advisory API error for ${cveId}: ${errorMsg} — skipping.`,\n );\n return [];\n }\n}\n\n/**\n * Parse GitHub advisories into AffectedPackage entries.\n * Deduplication against OSV results is handled in lookup-cve.ts.\n */\nexport function parseGhAdvisories(advisories: GhAdvisory[]): AffectedPackage[] {\n const packages: AffectedPackage[] = [];\n\n for (const advisory of advisories) {\n for (const vuln of advisory.vulnerabilities) {\n if (vuln.package.ecosystem.toLowerCase() !== \"npm\") continue;\n\n packages.push({\n name: vuln.package.name,\n ecosystem: \"npm\",\n vulnerableRange: vuln.vulnerable_version_range ?? \">=0.0.0\",\n firstPatchedVersion: vuln.first_patched_version ?? undefined,\n source: \"github-advisory\",\n });\n }\n }\n\n return packages;\n}\n\n/**\n * Merge data from GitHub advisory into a CveDetails object built from OSV.\n * Fills in `firstPatchedVersion` where OSV didn't have it, and enriches CVSS.\n */\nexport function mergeGhDataIntoCveDetails(\n details: CveDetails,\n ghPackages: AffectedPackage[],\n): CveDetails {\n const enriched = { ...details };\n\n for (const ghPkg of ghPackages) {\n const existing = enriched.affectedPackages.find((p) => p.name === ghPkg.name);\n\n if (existing) {\n // Backfill firstPatchedVersion if OSV didn't have it\n if (!existing.firstPatchedVersion && ghPkg.firstPatchedVersion) {\n existing.firstPatchedVersion = ghPkg.firstPatchedVersion;\n }\n } else {\n // Package only known via GitHub Advisory (not yet in OSV)\n enriched.affectedPackages.push(ghPkg);\n }\n }\n\n return enriched;\n}\n\n/** High-level convenience: fetch + parse, returns enrichment packages */\nexport async function lookupCveGitHub(cveId: string): Promise<AffectedPackage[]> {\n const advisories = await fetchGhAdvisories(cveId);\n return parseGhAdvisories(advisories);\n}\n","/**\n * NVD (National Vulnerability Database) API v2 client\n *\n * Used ONLY for fetching authoritative CVSS scores and severity.\n * NVD CPE data is too inconsistent for npm package discovery — use OSV for that.\n *\n * Rate limits: 5 req/30s without key, 50 req/30s with AUTOREMEDIATOR_NVD_API_KEY\n * Uses shared HTTP client for consistent error handling and timeouts.\n */\nimport type { CveDetails } from \"../../platform/types.js\";\nimport { getNvdConfig } from \"../../platform/config.js\";\nimport { httpClient } from \"../../platform/http-client.js\";\n\nconst NVD_BASE = \"https://services.nvd.nist.gov/rest/json/cves/2.0\";\n\ninterface NvdCvssMetric {\n cvssData: {\n baseScore: number;\n baseSeverity: string;\n vectorString: string;\n };\n}\n\ninterface NvdVulnerability {\n cve: {\n id: string;\n metrics?: {\n cvssMetricV31?: NvdCvssMetric[];\n cvssMetricV30?: NvdCvssMetric[];\n cvssMetricV2?: NvdCvssMetric[];\n };\n references?: Array<{ url: string; tags?: string[] }>;\n };\n}\n\ninterface NvdResponse {\n vulnerabilities?: NvdVulnerability[];\n totalResults?: number;\n}\n\nfunction buildNvdHeaders(): Record<string, string> {\n const { apiKey } = getNvdConfig();\n const headers: Record<string, string> = { Accept: \"application/json\" };\n if (apiKey) {\n headers.apiKey = apiKey;\n }\n return headers;\n}\n\n/**\n * Fetch CVSS score for a CVE from NVD.\n * Returns undefined if NVD doesn't have data or the request fails.\n * Non-fatal — callers should handle undefined gracefully.\n */\nexport async function fetchNvdCvss(\n cveId: string,\n): Promise<{ score: number; severity: CveDetails[\"severity\"] } | undefined> {\n const url = `${NVD_BASE}?cveId=${encodeURIComponent(cveId)}`;\n const headers = buildNvdHeaders();\n\n try {\n const res = await httpClient({ url, headers });\n if (!res.ok) return undefined;\n\n const data = res.data as NvdResponse;\n const vuln = data.vulnerabilities?.[0];\n if (!vuln) return undefined;\n\n const metrics = vuln.cve.metrics;\n const metric =\n metrics?.cvssMetricV31?.[0] ?? metrics?.cvssMetricV30?.[0] ?? metrics?.cvssMetricV2?.[0];\n\n if (!metric) return undefined;\n\n const score = metric.cvssData.baseScore;\n const rawSeverity = metric.cvssData.baseSeverity.toUpperCase();\n\n const severityMap: Record<string, CveDetails[\"severity\"]> = {\n CRITICAL: \"CRITICAL\",\n HIGH: \"HIGH\",\n MEDIUM: \"MEDIUM\",\n LOW: \"LOW\",\n };\n\n return {\n score,\n severity: severityMap[rawSeverity] ?? \"UNKNOWN\",\n };\n } catch {\n // NVD is non-critical; don't crash the pipeline on network failures\n return undefined;\n }\n}\n\n/**\n * Enrich an existing CveDetails with NVD CVSS data.\n * Mutates in place and returns the same object.\n */\nexport async function enrichWithNvd(details: CveDetails): Promise<CveDetails> {\n const cvss = await fetchNvdCvss(details.id);\n if (cvss) {\n details.cvssScore = cvss.score;\n if (details.severity === \"UNKNOWN\") {\n details.severity = cvss.severity;\n }\n }\n return details;\n}\n","import { readFileSync } from \"node:fs\";\nimport type { CveDetails } from \"../../platform/types.js\";\n\nexport interface IntelligenceSnapshot {\n [cveId: string]: any;\n}\n\nexport function loadIntelligenceSnapshot(filePath: string): IntelligenceSnapshot {\n const raw = readFileSync(filePath, \"utf8\");\n const parsed = JSON.parse(raw) as unknown;\n if (typeof parsed !== \"object\" || parsed === null || Array.isArray(parsed)) {\n throw new Error(`Intelligence snapshot at ${filePath} must be a JSON object keyed by CVE ID.`);\n }\n return parsed as IntelligenceSnapshot;\n}\n\nexport function lookupSnapshotCve(\n snapshot: IntelligenceSnapshot,\n cveId: string,\n): CveDetails | null {\n const store =\n (snapshot as Record<string, unknown>).cves &&\n typeof (snapshot as Record<string, unknown>).cves === \"object\" &&\n !Array.isArray((snapshot as Record<string, unknown>).cves)\n ? ((snapshot as Record<string, unknown>).cves as Record<string, unknown>)\n : (snapshot as Record<string, unknown>);\n\n const normalizedId = cveId.toUpperCase();\n const rawEntry = (store[normalizedId] ?? store[cveId] ?? store[cveId.toLowerCase()]) as\n | Record<string, any>\n | undefined;\n\n if (!rawEntry || typeof rawEntry !== \"object\") return null;\n\n if (\n typeof rawEntry.id === \"string\" &&\n Array.isArray(rawEntry.affectedPackages) &&\n typeof rawEntry.summary === \"string\"\n ) {\n return rawEntry as CveDetails;\n }\n\n const affectedPackages = Array.isArray(rawEntry.affectedPackages)\n ? rawEntry.affectedPackages\n : rawEntry.packageName\n ? [\n {\n name: rawEntry.packageName,\n ecosystem: \"npm\",\n vulnerableRange: rawEntry.vulnerableRange ?? \"\",\n firstPatchedVersion: rawEntry.firstPatchedVersion,\n source: \"offline-snapshot\",\n },\n ]\n : [];\n\n const details: CveDetails = {\n id: rawEntry.id ?? rawEntry.cveId ?? normalizedId,\n summary: rawEntry.summary ?? `Offline intelligence details for ${normalizedId}`,\n severity: rawEntry.severity ?? \"UNKNOWN\",\n references: Array.isArray(rawEntry.references) ? rawEntry.references : [],\n affectedPackages,\n cvssScore: typeof rawEntry.cvssScore === \"number\" ? rawEntry.cvssScore : undefined,\n epss:\n rawEntry.epss ??\n (typeof rawEntry.epssScore === \"number\"\n ? { score: rawEntry.epssScore, percentile: rawEntry.epssScore }\n : undefined),\n kev:\n rawEntry.kev ??\n (rawEntry.cisaKev !== undefined ? { knownExploited: Boolean(rawEntry.cisaKev) } : undefined),\n };\n\n return details;\n}\n","/**\n * Tool: check-reachability (Pillar 3.1)\n *\n * Uses the high-performance Oxc (Oxidation Compiler) AST parser to scan project\n * source files for static imports, dynamic imports, CommonJS require calls,\n * and re-exports. Performs interprocedural AST call-graph tracing for target symbols\n * and resolves tsconfig/jsconfig path aliases.\n */\nimport { existsSync, readdirSync, readFileSync, statSync } from \"node:fs\";\nimport { isAbsolute, join, resolve } from \"node:path\";\nimport { parseSync, type ParseResult } from \"oxc-parser\";\nimport { defineTool } from \"./tool-compat.js\";\nimport { z } from \"zod\";\nimport type { ReachabilityAssessment, ReachabilityEvidence } from \"../../platform/types.js\";\n\nconst SOURCE_EXTENSIONS = new Set([\".ts\", \".tsx\", \".js\", \".jsx\", \".mjs\", \".cjs\", \".mts\", \".cts\"]);\nconst IGNORED_DIRS = new Set([\n \"node_modules\",\n \".git\",\n \"dist\",\n \"build\",\n \"coverage\",\n \".next\",\n \".turbo\",\n \".pnpm-store\",\n]);\n\nexport interface TsconfigPathsConfig {\n baseUrl: string;\n paths: Record<string, string[]>;\n}\n\n/**\n * Loads compilerOptions.baseUrl and compilerOptions.paths from tsconfig.json or jsconfig.json\n */\nexport function loadTsconfigPaths(cwd: string): TsconfigPathsConfig | undefined {\n for (const configName of [\"tsconfig.json\", \"jsconfig.json\"]) {\n const fullPath = join(cwd, configName);\n if (!existsSync(fullPath)) continue;\n try {\n const raw = readFileSync(fullPath, \"utf8\");\n // Remove trailing commas / comments if any for robust parsing\n const cleaned = raw.replace(/\\/\\*[\\s\\S]*?\\*\\/|\\/\\/.*/g, \"\");\n const parsed = JSON.parse(cleaned);\n const compilerOptions = parsed.compilerOptions;\n if (compilerOptions?.paths) {\n return {\n baseUrl: compilerOptions.baseUrl ? resolve(cwd, compilerOptions.baseUrl) : cwd,\n paths: compilerOptions.paths,\n };\n }\n } catch {\n // Ignore invalid config\n }\n }\n return undefined;\n}\n\n/**\n * Resolves an aliased import path according to tsconfig paths mapping\n */\nexport function resolveAliasedPath(\n importSource: string,\n config?: TsconfigPathsConfig,\n): string | undefined {\n if (!config || !config.paths || isAbsolute(importSource) || importSource.startsWith(\".\")) {\n return undefined;\n }\n\n for (const [pattern, replacements] of Object.entries(config.paths)) {\n if (pattern === importSource && replacements[0]) {\n return resolve(config.baseUrl, replacements[0]);\n }\n if (pattern.endsWith(\"/*\")) {\n const prefix = pattern.slice(0, -2);\n if (importSource.startsWith(prefix)) {\n const suffix = importSource.slice(prefix.length);\n const replacement = replacements[0]?.slice(0, -2) ?? \"\";\n return resolve(config.baseUrl, replacement + suffix);\n }\n }\n }\n return undefined;\n}\n\nfunction* walkSourceFiles(dir: string): Generator<string> {\n let entries: string[];\n try {\n entries = readdirSync(dir);\n } catch {\n return;\n }\n for (const entry of entries) {\n if (IGNORED_DIRS.has(entry)) continue;\n const full = join(dir, entry);\n let stat;\n try {\n stat = statSync(full);\n } catch {\n continue;\n }\n if (stat.isDirectory()) {\n yield* walkSourceFiles(full);\n } else if (SOURCE_EXTENSIONS.has(full.slice(full.lastIndexOf(\".\")))) {\n yield full;\n }\n }\n}\n\nfunction matchesPackage(\n sourceValue: string,\n packageName: string,\n tsconfig?: TsconfigPathsConfig,\n): boolean {\n if (sourceValue === packageName || sourceValue.startsWith(`${packageName}/`)) {\n return true;\n }\n const resolved = resolveAliasedPath(sourceValue, tsconfig);\n if (resolved && (resolved.includes(`/${packageName}/`) || resolved.endsWith(`/${packageName}`))) {\n return true;\n }\n return false;\n}\n\ninterface AstNode {\n type: string;\n [key: string]: unknown;\n}\n\nfunction walkAst(node: AstNode | null | undefined, visitor: (node: AstNode) => void): void {\n if (!node || typeof node !== \"object\") return;\n visitor(node);\n\n for (const key of Object.keys(node)) {\n if (key === \"parent\" || key === \"start\" || key === \"end\") continue;\n const value = node[key];\n if (Array.isArray(value)) {\n for (const child of value) {\n if (child && typeof child === \"object\" && \"type\" in child) {\n walkAst(child as AstNode, visitor);\n }\n }\n } else if (value && typeof value === \"object\" && \"type\" in value) {\n walkAst(value as AstNode, visitor);\n }\n }\n}\n\nexport interface ExtractedReference {\n matchType: ReachabilityEvidence[\"matchType\"];\n symbols: string[];\n importedIdentifiers: Map<string, string>; // local variable name -> imported member name\n isReExported: boolean;\n}\n\nexport function toRootPackageName(importSource: string): string {\n if (importSource.startsWith(\"@\")) {\n const parts = importSource.split(\"/\");\n return parts.slice(0, 2).join(\"/\");\n }\n return importSource.split(\"/\")[0] ?? importSource;\n}\n\nexport function findTransitiveDependencyPath(\n cwd: string,\n targetPackage: string,\n importedDirectPackages: Set<string>,\n): { directDependency: string; version?: string } | null {\n for (const directPkg of importedDirectPackages) {\n const manifestPath = join(cwd, \"node_modules\", directPkg, \"package.json\");\n if (!existsSync(manifestPath)) continue;\n try {\n const manifest = JSON.parse(readFileSync(manifestPath, \"utf8\")) as {\n dependencies?: Record<string, string>;\n };\n if (manifest.dependencies && manifest.dependencies[targetPackage]) {\n return {\n directDependency: directPkg,\n version: manifest.dependencies[targetPackage],\n };\n }\n } catch {\n // Ignore read errors\n }\n }\n return null;\n}\n\n/**\n * Extracts package references and imported symbols using the Oxc AST parser.\n */\nexport function extractPackageReferences(\n filename: string,\n content: string,\n packageName: string,\n tsconfig?: TsconfigPathsConfig,\n outImportedDirectPackages?: Set<string>,\n): ExtractedReference[] {\n const results: ExtractedReference[] = [];\n\n let parseResult: ParseResult | undefined;\n try {\n parseResult = parseSync(filename, content);\n } catch {\n return results;\n }\n\n if (!parseResult?.program) return results;\n\n walkAst(parseResult.program as unknown as AstNode, (node) => {\n // 1. Static Import Declarations: import ... from 'pkg'\n if (node.type === \"ImportDeclaration\") {\n const source = node.source as { value?: string } | undefined;\n if (source?.value && !source.value.startsWith(\".\") && !isAbsolute(source.value)) {\n outImportedDirectPackages?.add(toRootPackageName(source.value));\n }\n if (source?.value && matchesPackage(source.value, packageName, tsconfig)) {\n const symbols: string[] = [];\n const importedIdentifiers = new Map<string, string>();\n const specifiers = (node.specifiers ?? []) as AstNode[];\n\n for (const spec of specifiers) {\n if (spec.type === \"ImportSpecifier\") {\n const imported = spec.imported as { name?: string; value?: string } | undefined;\n const local = spec.local as { name?: string } | undefined;\n const importedName = imported?.name ?? imported?.value ?? local?.name;\n const localName = local?.name ?? importedName;\n if (importedName && localName) {\n symbols.push(importedName);\n importedIdentifiers.set(localName, importedName);\n }\n } else if (spec.type === \"ImportDefaultSpecifier\") {\n const local = spec.local as { name?: string } | undefined;\n symbols.push(\"default\");\n if (local?.name) importedIdentifiers.set(local.name, \"default\");\n } else if (spec.type === \"ImportNamespaceSpecifier\") {\n const local = spec.local as { name?: string } | undefined;\n symbols.push(\"*\");\n if (local?.name) importedIdentifiers.set(local.name, \"*\");\n }\n }\n\n results.push({\n matchType: \"import\",\n symbols: symbols.length > 0 ? symbols : [\"*\"],\n importedIdentifiers,\n isReExported: false,\n });\n }\n }\n\n // 2. Dynamic Import Expressions: import('pkg')\n if (node.type === \"ImportExpression\") {\n const source = node.source as { value?: string } | undefined;\n if (source?.value && !source.value.startsWith(\".\") && !isAbsolute(source.value)) {\n outImportedDirectPackages?.add(toRootPackageName(source.value));\n }\n if (source?.value && matchesPackage(source.value, packageName, tsconfig)) {\n results.push({\n matchType: \"dynamic-import\",\n symbols: [\"*\"],\n importedIdentifiers: new Map(),\n isReExported: false,\n });\n }\n }\n\n // 3. CommonJS Require Calls: require('pkg')\n if (\n node.type === \"CallExpression\" &&\n (node.callee as { name?: string })?.name === \"require\" &&\n Array.isArray(node.arguments) &&\n node.arguments.length > 0\n ) {\n const firstArg = node.arguments[0] as { value?: string } | undefined;\n if (\n firstArg?.value &&\n typeof firstArg.value === \"string\" &&\n !firstArg.value.startsWith(\".\") &&\n !isAbsolute(firstArg.value)\n ) {\n outImportedDirectPackages?.add(toRootPackageName(firstArg.value));\n }\n if (\n firstArg?.value &&\n typeof firstArg.value === \"string\" &&\n matchesPackage(firstArg.value, packageName, tsconfig)\n ) {\n results.push({\n matchType: \"require\",\n symbols: [\"*\"],\n importedIdentifiers: new Map(),\n isReExported: false,\n });\n }\n }\n\n // 4. Re-export Declarations: export ... from 'pkg'\n if (node.type === \"ExportNamedDeclaration\" || node.type === \"ExportAllDeclaration\") {\n const source = node.source as { value?: string } | undefined;\n if (source?.value && !source.value.startsWith(\".\") && !isAbsolute(source.value)) {\n outImportedDirectPackages?.add(toRootPackageName(source.value));\n }\n if (source?.value && matchesPackage(source.value, packageName, tsconfig)) {\n const symbols: string[] = [];\n if (node.type === \"ExportAllDeclaration\") {\n symbols.push(\"*\");\n } else {\n const specifiers = (node.specifiers ?? []) as AstNode[];\n for (const spec of specifiers) {\n const local = spec.local as { name?: string; value?: string } | undefined;\n const exported = spec.exported as { name?: string; value?: string } | undefined;\n const name = exported?.name ?? exported?.value ?? local?.name ?? local?.value;\n if (name) symbols.push(name);\n }\n }\n results.push({\n matchType: \"re-export\",\n symbols: symbols.length > 0 ? symbols : [\"*\"],\n importedIdentifiers: new Map(),\n isReExported: true,\n });\n }\n }\n });\n\n return results;\n}\n\n/**\n * Traces AST call expressions to see if the vulnerable symbol is actually invoked.\n */\nexport function traceSymbolInvocations(\n content: string,\n filename: string,\n importedIdentifiers: Map<string, string>,\n targetSymbol?: string,\n): { invoked: boolean; callCount: number } {\n if (!targetSymbol) {\n return { invoked: true, callCount: 1 };\n }\n\n let parseResult: ParseResult | undefined;\n try {\n parseResult = parseSync(filename, content);\n } catch {\n return { invoked: true, callCount: 1 };\n }\n\n if (!parseResult?.program) {\n return { invoked: true, callCount: 1 };\n }\n\n let callCount = 0;\n\n walkAst(parseResult.program as unknown as AstNode, (node) => {\n // Check direct function calls: func() or new Func()\n if (node.type === \"CallExpression\" || node.type === \"NewExpression\") {\n const callee = node.callee as AstNode | undefined;\n if (!callee) return;\n\n // 1. Direct identifier invocation: template()\n if (callee.type === \"Identifier\") {\n const name = (callee as { name?: string }).name;\n if (name) {\n const importedName = importedIdentifiers.get(name);\n if (importedName === targetSymbol || name === targetSymbol) {\n callCount++;\n }\n }\n }\n\n // 2. Member expression invocation: _.template() or lodash.template()\n if (callee.type === \"MemberExpression\") {\n const object = callee.object as { name?: string } | undefined;\n const property = callee.property as { name?: string; value?: string } | undefined;\n const propName = property?.name ?? property?.value;\n\n if (object?.name && propName) {\n const importedName = importedIdentifiers.get(object.name);\n if (\n (importedName === \"*\" ||\n importedName === \"default\" ||\n object.name === \"lodash\" ||\n object.name === \"_\") &&\n propName === targetSymbol\n ) {\n callCount++;\n }\n }\n }\n }\n });\n\n return {\n invoked: callCount > 0,\n callCount,\n };\n}\n\nexport function assessPackageReachability(\n cwd: string,\n packageName: string,\n targetSymbol?: string,\n): ReachabilityAssessment {\n const tsconfig = loadTsconfigPaths(cwd);\n const evidence: ReachabilityEvidence[] = [];\n let scanned = 0;\n let hasReExport = false;\n let totalInvocations = 0;\n let hasPackageImport = false;\n\n const importedDirectPackages = new Set<string>();\n\n for (const filePath of walkSourceFiles(cwd)) {\n scanned++;\n let content: string;\n try {\n content = readFileSync(filePath, \"utf8\");\n } catch {\n continue;\n }\n\n const refs = extractPackageReferences(\n filePath,\n content,\n packageName,\n tsconfig,\n importedDirectPackages,\n );\n if (refs.length > 0) {\n hasPackageImport = true;\n }\n\n for (const ref of refs) {\n if (ref.isReExported) {\n hasReExport = true;\n }\n\n const matchesSymbol =\n !targetSymbol ||\n ref.symbols.includes(\"*\") ||\n ref.symbols.includes(\"default\") ||\n ref.symbols.includes(targetSymbol);\n\n if (matchesSymbol) {\n let invoked = true;\n let callCount = 1;\n\n if (targetSymbol && !ref.isReExported) {\n const trace = traceSymbolInvocations(\n content,\n filePath,\n ref.importedIdentifiers,\n targetSymbol,\n );\n invoked = trace.invoked;\n callCount = trace.callCount;\n totalInvocations += callCount;\n }\n\n evidence.push({\n filePath,\n matchType: ref.matchType,\n importedSymbols: ref.symbols,\n symbol: targetSymbol,\n invoked,\n callCount,\n });\n }\n }\n }\n\n if (scanned === 0) {\n return {\n packageName,\n status: \"unknown\",\n reason: `No source files found under ${cwd}`,\n reachabilityBasis: \"unknown\",\n };\n }\n\n if (!hasPackageImport) {\n const transitivePath = findTransitiveDependencyPath(cwd, packageName, importedDirectPackages);\n if (transitivePath) {\n return {\n packageName,\n status: \"reachable\",\n reason: `Package '${packageName}' is a transitive dependency of imported package '${transitivePath.directDependency}'`,\n reachabilityBasis: \"transitive-path-found\",\n evidence: [],\n };\n }\n\n return {\n packageName,\n status: \"not-reachable\",\n reason: `No source files reference '${packageName}'`,\n reachabilityBasis: \"import-present\",\n justification: \"code_not_in_execute_path\",\n evidence: [],\n };\n }\n\n // If targetSymbol was specified\n if (targetSymbol) {\n const isReachable = hasReExport || totalInvocations > 0;\n if (isReachable) {\n return {\n packageName,\n status: \"reachable\",\n reason: hasReExport\n ? `Package '${packageName}' re-exports symbols to external consumers`\n : `Found ${totalInvocations} call-site(s) invoking vulnerable symbol '${targetSymbol}' across ${evidence.filter((e) => e.invoked).length} file(s)`,\n reachabilityBasis: \"call-path-found\",\n evidence,\n };\n }\n\n return {\n packageName,\n status: \"not-reachable\",\n reason: `Package '${packageName}' is imported but vulnerable symbol '${targetSymbol}' is never invoked in any execution path`,\n reachabilityBasis: \"call-graph-uninvoked\",\n justification: \"code_not_in_execute_path\",\n evidence,\n };\n }\n\n return {\n packageName,\n status: \"reachable\",\n reason: `Found ${evidence.length} source file(s) referencing '${packageName}'`,\n reachabilityBasis: \"import-present\",\n evidence,\n };\n}\n\nexport const checkReachabilityTool = defineTool({\n description:\n \"Scan project source files for import/require/export references and perform AST call-graph reachability analysis for a package and vulnerable symbols using Oxc AST parser. Returns reachability status: reachable, not-reachable, or unknown.\",\n parameters: z.object({\n cwd: z.string().describe(\"Project root directory to scan\"),\n packageName: z.string().describe(\"Package name to search for (e.g. 'lodash' or '@babel/core')\"),\n symbol: z\n .string()\n .optional()\n .describe(\"Optional vulnerable function/symbol name to check specifically in call graph\"),\n }),\n execute({ cwd, packageName, symbol }) {\n return assessPackageReachability(cwd, packageName, symbol);\n },\n});\n","/**\n * Tool: check-exploit-signal\n *\n * Evaluates KEV and EPSS signals from CveDetails against policy thresholds\n * to determine whether this CVE should be treated as mandatory regardless of\n * severity filtering.\n */\nimport { defineTool } from \"./tool-compat.js\";\nimport { z } from \"zod\";\n\nconst kevSchema = z\n .object({\n knownExploited: z.boolean(),\n dateAdded: z.string().optional(),\n dueDate: z.string().optional(),\n requiredAction: z.string().optional(),\n knownRansomwareCampaignUse: z.string().optional(),\n })\n .passthrough();\n\nconst epssSchema = z\n .object({\n score: z.number(),\n percentile: z.number(),\n date: z.string().optional(),\n })\n .passthrough();\n\nconst exploitSignalPolicySchema = z\n .object({\n kev: z.object({ mandatory: z.boolean() }).optional(),\n epss: z.object({ mandatory: z.boolean(), threshold: z.number() }).optional(),\n })\n .optional();\n\nexport const checkExploitSignalTool = defineTool({\n description:\n \"Evaluate KEV and EPSS exploit signals for a CVE against policy thresholds. Returns whether the exploit signal overrides severity filtering (mandatory gate).\",\n parameters: z.object({\n cveDetails: z\n .object({\n id: z.string(),\n kev: kevSchema.optional(),\n epss: epssSchema.optional(),\n })\n .passthrough()\n .describe(\"CveDetails object from lookup-cve\"),\n policy: z\n .object({\n exploitSignalOverride: exploitSignalPolicySchema,\n })\n .passthrough()\n .describe(\"Policy object containing exploitSignalOverride configuration\"),\n }),\n execute: async ({\n cveDetails,\n policy,\n }): Promise<{\n exploitSignalTriggered: boolean;\n reason: string;\n }> => {\n const override = policy.exploitSignalOverride;\n\n if (!override) {\n return {\n exploitSignalTriggered: false,\n reason: \"No exploitSignalOverride policy configured.\",\n };\n }\n\n // KEV check\n if (override.kev?.mandatory && cveDetails.kev?.knownExploited === true) {\n return {\n exploitSignalTriggered: true,\n reason: `CVE ${cveDetails.id} is in the CISA Known Exploited Vulnerabilities (KEV) catalog and kev.mandatory is enabled.`,\n };\n }\n\n // EPSS check\n if (\n override.epss?.mandatory &&\n typeof override.epss.threshold === \"number\" &&\n typeof cveDetails.epss?.score === \"number\" &&\n cveDetails.epss.score >= override.epss.threshold\n ) {\n return {\n exploitSignalTriggered: true,\n reason: `CVE ${cveDetails.id} EPSS score ${cveDetails.epss.score} meets or exceeds threshold ${override.epss.threshold} and epss.mandatory is enabled.`,\n };\n }\n\n return {\n exploitSignalTriggered: false,\n reason: \"Exploit signal thresholds not met.\",\n };\n },\n});\n","/**\n * SecOps pre-flight checks for the local remediation pipeline.\n *\n * Runs before inventory and per-package remediation:\n * 1. VEX suppression — exits early if the CVE is actively suppressed\n * 2. Exploit signal — KEV / EPSS override gate\n * 3. SLA breach — detects response-window violations\n */\nimport type {\n CveDetails,\n ExploitSignalOverridePolicy,\n SlaBreach,\n SlaPolicy,\n VexSuppression,\n} from \"../../platform/types.js\";\nimport {\n checkSlaBreach,\n isActiveSuppression,\n loadSuppressionsFile,\n} from \"../../platform/policy.js\";\nimport { checkExploitSignalTool } from \"../tools/check-exploit-signal.js\";\n\nexport interface SecOpsPreflightOptions {\n suppressions: VexSuppression[];\n suppressionsFile?: string;\n exploitSignalOverride?: ExploitSignalOverridePolicy;\n slaCheck: boolean;\n slaPolicy?: SlaPolicy;\n}\n\nexport type SecOpsPreflightResult =\n | { suppressed: true; summary: string }\n | {\n suppressed: false;\n exploitSignalTriggered?: boolean;\n slaBreaches?: SlaBreach[];\n };\n\nexport async function runSecOpsPreflight(\n normalizedId: string,\n cveDetails: CveDetails,\n opts: SecOpsPreflightOptions,\n): Promise<SecOpsPreflightResult> {\n const allSuppressions = opts.suppressionsFile\n ? [...opts.suppressions, ...loadSuppressionsFile(opts.suppressionsFile)]\n : opts.suppressions;\n\n const activeSuppression = allSuppressions.find(\n (s) => s.cveId === normalizedId && isActiveSuppression(s),\n );\n if (activeSuppression) {\n return {\n suppressed: true,\n summary: `CVE ${normalizedId} suppressed by VEX policy: ${activeSuppression.justification}${activeSuppression.notes ? ` — ${activeSuppression.notes}` : \"\"}`,\n };\n }\n\n let exploitSignalTriggered: boolean | undefined;\n if (opts.exploitSignalOverride) {\n const result = await checkExploitSignalTool.execute({\n cveDetails: {\n id: cveDetails.id,\n kev: cveDetails.kev,\n epss: cveDetails.epss,\n },\n policy: { exploitSignalOverride: opts.exploitSignalOverride },\n });\n if (result.exploitSignalTriggered) {\n exploitSignalTriggered = true;\n }\n }\n\n let slaBreaches: SlaBreach[] | undefined;\n if (opts.slaCheck && opts.slaPolicy && cveDetails.publishedAt) {\n const breach = checkSlaBreach(\n normalizedId,\n cveDetails.severity,\n cveDetails.publishedAt,\n opts.slaPolicy,\n );\n if (breach) {\n slaBreaches = [breach];\n }\n }\n\n return { suppressed: false, exploitSignalTriggered, slaBreaches };\n}\n","import type { InventoryPackage, PatchResult, SbomEntry, SbomStatus } from \"../../platform/types.js\";\n\n/**\n * Build a Software Bill of Materials from the installed package inventory,\n * cross-referencing each package against the vulnerable and remediated sets.\n */\nexport function buildSbom(\n packages: InventoryPackage[],\n vulnerableNames: Set<string>,\n results: PatchResult[],\n): SbomEntry[] {\n const statusByPackage = new Map<string, SbomStatus>();\n for (const result of results) {\n if (!vulnerableNames.has(result.packageName)) continue;\n if (result.suppressedBy) {\n statusByPackage.set(result.packageName, \"suppressed\");\n } else if (!result.applied && result.strategy === \"none\") {\n statusByPackage.set(result.packageName, \"skipped\");\n } else if (result.applied) {\n statusByPackage.set(result.packageName, \"patched\");\n } else {\n statusByPackage.set(result.packageName, \"unpatched\");\n }\n }\n\n return packages.map((pkg) => {\n const isVulnerable = vulnerableNames.has(pkg.name);\n const entry: SbomEntry = {\n name: pkg.name,\n version: pkg.version,\n scope: pkg.type === \"direct\" ? \"direct\" : \"transitive\",\n };\n if (isVulnerable) {\n entry.status = statusByPackage.get(pkg.name) ?? \"unpatched\";\n }\n return entry;\n });\n}\n","/**\n * Tool: apply-version-bump\n *\n * Updates the consumer's package.json to the safe version and runs npm install.\n * Respects --dry-run: in dry-run mode it reports what would happen but writes nothing.\n */\nimport { defineTool } from \"./tool-compat.js\";\nimport { z } from \"zod\";\nimport { join } from \"node:path\";\nimport { readFileSync, writeFileSync } from \"node:fs\";\nimport { rm } from \"node:fs/promises\";\nimport { safeExeca } from \"../../platform/safe-exec.js\";\nimport semver from \"semver\";\nimport type {\n PatchResult,\n ProofOfFixPhaseResult,\n ProofOfFixVerification,\n} from \"../../platform/types.js\";\nimport {\n assembleProofOfFixVerification,\n prepareReproductionTestFile,\n runProofOfFixPhase,\n} from \"../proof-of-fix/runner.js\";\nimport { isPackageAllowed, loadPolicy } from \"../../platform/policy.js\";\nimport { withRepoLock } from \"../../platform/repo-lock.js\";\nimport {\n detectPackageManager,\n getYarnMajorVersion,\n resolveDedupeCommand,\n resolveInstallCommand,\n resolveTestCommand,\n resolveTypecheckCommand,\n type PackageManager,\n} from \"../../platform/package-manager/index.js\";\n\nimport { findDeclaringWorkspacePackage } from \"../../platform/workspace.js\";\nimport { findPackageCallSites } from \"../refactor/call-site-finder.js\";\nimport { refactorConsumerCallSites, revertRefactorSnapshots } from \"../refactor/refactor-agent.js\";\n\ninterface RawPackageJson {\n dependencies?: Record<string, string>;\n devDependencies?: Record<string, string>;\n peerDependencies?: Record<string, string>;\n [key: string]: unknown;\n}\n\ntype DepField = \"dependencies\" | \"devDependencies\" | \"peerDependencies\";\n\nexport const applyVersionBumpTool = defineTool({\n description:\n \"Update package.json to use the safe version of a vulnerable package and run the project's package manager install. In dry-run mode, only reports what would change.\",\n parameters: z.object({\n cwd: z.string().describe(\"Absolute path to the consumer project root\"),\n packageManager: z\n .enum([\"npm\", \"pnpm\", \"yarn\", \"bun\", \"deno\"])\n .optional()\n .describe(\"Package manager used by the target project (auto-detected if omitted)\"),\n packageName: z.string().describe(\"The npm package to upgrade\"),\n fromVersion: z.string().describe(\"The currently installed vulnerable version\"),\n toVersion: z.string().describe(\"The safe target version to upgrade to\"),\n dryRun: z.boolean().default(false).describe(\"If true, report changes but do not write\"),\n policy: z.string().optional().describe(\"Optional path to .autoremediator policy file\"),\n runTests: z\n .boolean()\n .default(false)\n .describe(\"If true, run test validation after applying the fix\"),\n typecheck: z\n .boolean()\n .default(false)\n .describe(\"If true, run typecheck validation after applying the fix\"),\n installMode: z.enum([\"standard\", \"prefer-offline\", \"deterministic\"]).optional(),\n installPreferOffline: z.boolean().optional(),\n enforceFrozenLockfile: z.boolean().optional(),\n workspace: z.string().optional(),\n breakingChangeRefactor: z\n .boolean()\n .optional()\n .describe(\n \"If true, attempt agentic call-site refactoring when validation fails after major upgrade\",\n ),\n reproductionTest: z\n .string()\n .optional()\n .describe(\"Optional reproduction test script verifying fix\"),\n proofOfFix: z\n .union([z.boolean(), z.string()])\n .optional()\n .describe(\"If true or script path/content, enforce dual-stage exploit reproduction\"),\n requireProofOfFix: z\n .boolean()\n .optional()\n .describe(\"If true, fail and rollback version bump if proof-of-fix verification fails\"),\n patchesDir: z\n .string()\n .optional()\n .default(\"./patches\")\n .describe(\"Directory containing patch/reproduction artifacts\"),\n }),\n execute: async ({\n cwd,\n packageManager,\n packageName,\n fromVersion,\n toVersion,\n dryRun,\n policy,\n runTests,\n typecheck,\n installMode,\n installPreferOffline,\n enforceFrozenLockfile,\n workspace,\n breakingChangeRefactor,\n reproductionTest,\n proofOfFix,\n requireProofOfFix,\n patchesDir,\n }): Promise<PatchResult> => {\n const pm = (packageManager ?? detectPackageManager(cwd)) as PackageManager;\n\n let pkgPath = join(cwd, \"package.json\");\n const loadedPolicy = loadPolicy(cwd, policy);\n const commandConstraints = {\n ...loadedPolicy.constraints,\n installMode: installMode ?? loadedPolicy.constraints?.installMode,\n installPreferOffline: installPreferOffline ?? loadedPolicy.constraints?.installPreferOffline,\n enforceFrozenLockfile:\n enforceFrozenLockfile ?? loadedPolicy.constraints?.enforceFrozenLockfile,\n workspace: workspace ?? loadedPolicy.constraints?.workspace,\n };\n const yarnMajor = pm === \"yarn\" ? await getYarnMajorVersion(cwd) : undefined;\n\n if (!isPackageAllowed(loadedPolicy, packageName)) {\n return {\n packageName,\n strategy: \"none\",\n fromVersion,\n toVersion,\n applied: false,\n dryRun,\n unresolvedReason: \"policy-blocked\",\n message: `Policy blocked changes for package \"${packageName}\".`,\n };\n }\n\n const isMajorBump =\n semver.valid(fromVersion) &&\n semver.valid(toVersion) &&\n semver.major(toVersion) > semver.major(fromVersion);\n\n if (isMajorBump && !loadedPolicy.allowMajorBumps) {\n return {\n packageName,\n strategy: \"none\",\n fromVersion,\n toVersion,\n applied: false,\n dryRun,\n unresolvedReason: \"major-bump-required\",\n message: `Policy blocked major bump for \"${packageName}\" (${fromVersion} -> ${toVersion}).`,\n };\n }\n\n pkgPath = join(cwd, \"package.json\");\n let pkgJson: RawPackageJson;\n try {\n pkgJson = JSON.parse(readFileSync(pkgPath, \"utf8\")) as RawPackageJson;\n } catch {\n return {\n packageName,\n strategy: \"none\",\n fromVersion,\n applied: false,\n dryRun,\n unresolvedReason: \"package-json-not-found\",\n message: `Could not read package.json at \"${pkgPath}\".`,\n };\n }\n\n // Locate which dependency field this package lives in\n let depField = ([\"dependencies\", \"devDependencies\", \"peerDependencies\"] as DepField[]).find(\n (f) => pkgJson[f]?.[packageName] !== undefined,\n );\n\n if (!depField) {\n // Check monorepo child workspaces\n const declaringWorkspace = findDeclaringWorkspacePackage(cwd, packageName, workspace);\n if (declaringWorkspace) {\n pkgPath = declaringWorkspace.manifestPath;\n pkgJson = declaringWorkspace.manifest as RawPackageJson;\n depField = ([\"dependencies\", \"devDependencies\", \"peerDependencies\"] as DepField[]).find(\n (f) => pkgJson[f]?.[packageName] !== undefined,\n );\n commandConstraints.workspace = workspace ?? declaringWorkspace.name;\n }\n }\n\n if (!depField) {\n return {\n packageName,\n strategy: \"none\",\n fromVersion,\n applied: false,\n dryRun,\n unresolvedReason: \"transitive-dependency\",\n message: `\"${packageName}\" was not found in package.json dependencies (it may be a transitive dependency). Cannot auto-bump.`,\n };\n }\n\n const currentRange = pkgJson[depField]![packageName]!;\n\n // Preserve the range prefix (^, ~, empty) from the existing entry\n const prefixMatch = currentRange.match(/^([~^]?)/);\n const prefix = prefixMatch?.[1] ?? \"\";\n const newRange = `${prefix}${toVersion}`;\n\n const effectiveInstallCommand = resolveInstallCommand(pm, commandConstraints, yarnMajor);\n const effectiveTestCommand = resolveTestCommand(pm, commandConstraints);\n const effectiveTypecheckCommand = resolveTypecheckCommand(pm, commandConstraints, cwd);\n const effectiveDedupeCommand = resolveDedupeCommand(pm, commandConstraints);\n const shouldTypecheck = typecheck || Boolean(commandConstraints.typecheck);\n\n if (dryRun) {\n const installCmd = effectiveInstallCommand.join(\" \");\n const testCmd = effectiveTestCommand.join(\" \");\n return {\n packageName,\n strategy: \"version-bump\",\n fromVersion,\n toVersion,\n applied: false,\n dryRun: true,\n message: `[DRY RUN] Would update ${depField}.${packageName}: \"${currentRange}\" -> \"${newRange}\", then run ${installCmd}${runTests ? ` and ${testCmd}` : \"\"}${effectiveDedupeCommand.length > 0 ? ` and ${effectiveDedupeCommand.join(\" \")} (best-effort)` : \"\"}.`,\n };\n }\n\n return withRepoLock(cwd, async () => {\n const prepared = await prepareReproductionTestFile({\n cwd,\n packageName,\n vulnerableVersion: fromVersion,\n patchesDir,\n proofOfFix,\n reproductionTest,\n });\n const reproTestPath = prepared.testFilePath;\n const isProofActive = Boolean(reproTestPath || proofOfFix || requireProofOfFix);\n\n let negativePhaseResult: ProofOfFixPhaseResult | undefined;\n if (isProofActive) {\n if (!reproTestPath) {\n if (requireProofOfFix) {\n return {\n packageName,\n strategy: \"none\",\n fromVersion,\n toVersion,\n applied: false,\n dryRun,\n unresolvedReason: \"policy-blocked\",\n message:\n \"Proof-of-fix verification required, but no reproduction test or script was supplied.\",\n };\n }\n } else {\n negativePhaseResult = await runProofOfFixPhase({\n stage: \"negative\",\n testFilePath: reproTestPath,\n cwd,\n });\n\n if (!negativePhaseResult.passed) {\n if (prepared.isCreated && reproTestPath) {\n await rm(reproTestPath, { force: true }).catch(() => {});\n }\n return {\n packageName,\n strategy: \"version-bump\",\n fromVersion,\n toVersion,\n applied: false,\n dryRun: false,\n unresolvedReason: requireProofOfFix ? \"policy-blocked\" : \"proof-of-fix-failed\",\n message: `Proof-of-fix negative phase failed: ${negativePhaseResult.error}`,\n };\n }\n }\n }\n\n // Write updated package.json\n pkgJson[depField]![packageName] = newRange;\n writeFileSync(pkgPath, JSON.stringify(pkgJson, null, 2) + \"\\n\", \"utf8\");\n\n // Run package-manager install\n try {\n const [installCmd, ...installArgs] = effectiveInstallCommand;\n await safeExeca(installCmd, installArgs, {\n cwd,\n stdio: \"pipe\",\n });\n } catch (err) {\n // Revert the package.json change on install failure\n pkgJson[depField]![packageName] = currentRange;\n writeFileSync(pkgPath, JSON.stringify(pkgJson, null, 2) + \"\\n\", \"utf8\");\n\n const message = err instanceof Error ? err.message : String(err);\n return {\n packageName,\n strategy: \"version-bump\",\n fromVersion,\n toVersion,\n applied: false,\n dryRun: false,\n unresolvedReason: \"install-failed\",\n message: `${effectiveInstallCommand.join(\" \")} failed after updating \"${packageName}\" to ${toVersion}. Reverted. Error: ${message}`,\n };\n }\n\n const shouldAttemptRefactor = Boolean(\n breakingChangeRefactor ?? loadedPolicy.constraints?.enableBreakingChangeRefactor,\n );\n\n async function runValidationSteps(): Promise<{\n passed: boolean;\n error?: string;\n isTypecheck?: boolean;\n }> {\n if (runTests) {\n try {\n const [testCmd, ...testArgs] = effectiveTestCommand;\n await safeExeca(testCmd, testArgs, { cwd, stdio: \"pipe\" });\n } catch (err) {\n const execErr = err as { stdout?: string; stderr?: string; message?: string };\n const fullOutput = [execErr.stdout, execErr.stderr, execErr.message]\n .filter(Boolean)\n .join(\"\\n\");\n return {\n passed: false,\n error: fullOutput || (err instanceof Error ? err.message : String(err)),\n };\n }\n }\n if (shouldTypecheck && effectiveTypecheckCommand.length > 0) {\n try {\n const [tcCmd, ...tcArgs] = effectiveTypecheckCommand;\n await safeExeca(tcCmd, tcArgs, { cwd, stdio: \"pipe\" });\n } catch (err) {\n const execErr = err as { stdout?: string; stderr?: string; message?: string };\n const fullOutput = [execErr.stdout, execErr.stderr, execErr.message]\n .filter(Boolean)\n .join(\"\\n\");\n return {\n passed: false,\n isTypecheck: true,\n error: fullOutput || (err instanceof Error ? err.message : String(err)),\n };\n }\n }\n return { passed: true };\n }\n\n let validationResult = await runValidationSteps();\n let refactoredFilesList: string[] | undefined;\n\n if (!validationResult.passed && shouldAttemptRefactor) {\n const callSites = findPackageCallSites(cwd, packageName);\n if (callSites.length > 0) {\n const refactorAttempt = await refactorConsumerCallSites({\n cwd,\n packageName,\n fromVersion,\n toVersion,\n diagnosticError: validationResult.error || \"\",\n callSites,\n });\n\n if (refactorAttempt.applied) {\n const postRefactorValidation = await runValidationSteps();\n if (postRefactorValidation.passed) {\n validationResult = { passed: true };\n refactoredFilesList = refactorAttempt.refactoredFiles;\n } else {\n revertRefactorSnapshots(refactorAttempt.snapshots);\n }\n }\n }\n }\n\n if (!validationResult.passed) {\n pkgJson[depField]![packageName] = currentRange;\n writeFileSync(pkgPath, JSON.stringify(pkgJson, null, 2) + \"\\n\", \"utf8\");\n\n try {\n const [rollbackCmd, ...rollbackArgs] = effectiveInstallCommand;\n await safeExeca(rollbackCmd, rollbackArgs, {\n cwd,\n stdio: \"pipe\",\n });\n } catch {}\n\n const failureMessage = validationResult.error || \"Unknown validation error\";\n const prefix = validationResult.isTypecheck\n ? `TypeCheck validation failed (${effectiveTypecheckCommand.join(\" \")})`\n : `${effectiveTestCommand.join(\" \")} failed`;\n\n return {\n packageName,\n strategy: \"version-bump\",\n fromVersion,\n toVersion,\n applied: false,\n dryRun: false,\n unresolvedReason: shouldAttemptRefactor\n ? \"breaking-change-unresolved\"\n : \"validation-failed\",\n message: `${prefix} after upgrading \"${packageName}\" to ${toVersion}. Rolled back to ${currentRange}. Error: ${failureMessage}`,\n };\n }\n\n let proofOfFixVerification: ProofOfFixVerification | undefined;\n if (reproTestPath && negativePhaseResult?.passed) {\n const positivePhaseResult = await runProofOfFixPhase({\n stage: \"positive\",\n testFilePath: reproTestPath,\n cwd,\n });\n\n if (!positivePhaseResult.passed) {\n pkgJson[depField]![packageName] = currentRange;\n writeFileSync(pkgPath, JSON.stringify(pkgJson, null, 2) + \"\\n\", \"utf8\");\n\n try {\n const [rollbackCmd, ...rollbackArgs] = effectiveInstallCommand;\n await safeExeca(rollbackCmd, rollbackArgs, {\n cwd,\n stdio: \"pipe\",\n });\n } catch {}\n\n if (prepared.isCreated && reproTestPath) {\n await rm(reproTestPath, { force: true }).catch(() => {});\n }\n\n return {\n packageName,\n strategy: \"version-bump\",\n fromVersion,\n toVersion,\n applied: false,\n dryRun: false,\n unresolvedReason: requireProofOfFix ? \"policy-blocked\" : \"proof-of-fix-failed\",\n message: `Proof-of-fix positive phase failed: ${positivePhaseResult.error}`,\n };\n }\n\n proofOfFixVerification = assembleProofOfFixVerification({\n reproductionTestPath: reproTestPath,\n negativePhase: negativePhaseResult,\n positivePhase: positivePhaseResult,\n regressionPhase: {\n executed: runTests,\n passed: validationResult.passed,\n },\n });\n }\n\n if (refactoredFilesList && refactoredFilesList.length > 0) {\n return {\n packageName,\n strategy: \"breaking-change-refactor\",\n fromVersion,\n toVersion,\n applied: true,\n dryRun: false,\n refactoredFiles: refactoredFilesList,\n proofOfFix: proofOfFixVerification,\n message: `Upgraded \"${packageName}\" from ${fromVersion} to ${toVersion} and refactored ${refactoredFilesList.length} call-site file(s) across breaking API changes.`,\n };\n }\n\n let dedupeNote = \"\";\n\n if (effectiveDedupeCommand.length > 0) {\n try {\n const [dedupeCmd, ...dedupeArgs] = effectiveDedupeCommand;\n await safeExeca(dedupeCmd, dedupeArgs, {\n cwd,\n stdio: \"pipe\",\n });\n } catch (err) {\n const message = err instanceof Error ? err.message : String(err);\n dedupeNote = ` Dedupe warning: ${effectiveDedupeCommand.join(\" \")} failed (${message}).`;\n }\n }\n\n return {\n packageName,\n strategy: \"version-bump\",\n fromVersion,\n toVersion,\n applied: true,\n dryRun: false,\n proofOfFix: proofOfFixVerification,\n message: `Successfully upgraded \"${packageName}\" from ${fromVersion} to ${toVersion} in ${depField}, then ran ${effectiveInstallCommand.join(\" \")}${runTests ? ` and passed ${effectiveTestCommand.join(\" \")}` : \"\"}.${dedupeNote}`,\n };\n });\n },\n});\n","/**\n * Proof-of-Fix Runner\n *\n * Implements dual-stage exploit reproduction and independent verification:\n * Stage 1 (Negative Phase): Must FAIL assertion on unpatched / vulnerable target (proving exploitability).\n * Stage 2 (Positive Phase): Must PASS on patched target (proving remediation).\n * Stage 3 (Regression Phase): Must PASS on full project test suite (proving zero regressions).\n */\nimport { existsSync } from \"node:fs\";\nimport { mkdir, writeFile } from \"node:fs/promises\";\nimport { isAbsolute, join } from \"node:path\";\nimport { safeExeca } from \"../../platform/safe-exec.js\";\nimport type {\n ProofOfFixPhaseResult,\n ProofOfFixStatus,\n ProofOfFixVerification,\n} from \"../../platform/types.js\";\n\nexport interface RunProofOfFixPhaseOptions {\n stage: \"negative\" | \"positive\";\n testFilePath: string;\n cwd: string;\n timeoutMs?: number;\n}\n\nexport interface HarnessFailureContext {\n exitCode?: number;\n output: string;\n errorMsg?: string;\n testFilePath?: string;\n signal?: string;\n}\n\n/**\n * Sanitizes file paths and directory names from diagnostic text\n * to prevent repository paths from colliding with error classification tokens.\n */\nexport function sanitizePathLeakage(text: string, paths: (string | undefined)[] = []): string {\n let sanitized = text;\n for (const p of paths) {\n if (!p || p.trim().length === 0) continue;\n sanitized = sanitized.split(p).join(\"<path>\");\n }\n return sanitized;\n}\n\n/**\n * Strips V8 / Node.js call site stack frames (` at ...`) from diagnostic text\n * so that directory names and file paths in stack traces never leak into token matching.\n */\nexport function stripStackTraceFrames(text: string): string {\n return text\n .split(\"\\n\")\n .filter((line) => !/^\\s*at\\s+/.test(line))\n .join(\"\\n\");\n}\n\n/**\n * Determines whether a process failure was caused by harness / execution defects\n * (syntax error, missing module, missing file, bad CLI flag, fatal signal, or runtime crash)\n * rather than a genuine exploit assertion failure.\n */\nexport function isHarnessFailure(context: HarnessFailureContext): boolean {\n const { exitCode, output, errorMsg = \"\", signal } = context;\n const errorMsgEmbedsPath =\n errorMsg.includes(\"Command failed\") ||\n (context.testFilePath && errorMsg.includes(context.testFilePath)) ||\n errorMsg.includes(\"/\") ||\n errorMsg.includes(\"\\\\\");\n const filteredErrorMsg = errorMsgEmbedsPath ? \"\" : errorMsg;\n const combined = filteredErrorMsg ? `${output}\\n${filteredErrorMsg}` : output;\n\n // 1. Process termination signals or non-executable / invalid exit codes\n if (signal !== undefined) {\n return true;\n }\n if (typeof exitCode === \"number\" && (exitCode === 126 || exitCode === 127 || exitCode > 128)) {\n return true;\n }\n\n // 2. Missing test file or missing binary (ENOENT)\n if (combined.includes(\"ENOENT\") || combined.includes(\"no such file or directory\")) {\n return true;\n }\n\n // 3. Node CLI invocation / bad option errors\n if (\n combined.includes(\"bad option:\") ||\n combined.includes(\"bad option\") ||\n combined.includes(\"Unrecognized option\") ||\n combined.includes(\"illegal option\") ||\n combined.includes(\"invalid option\")\n ) {\n return true;\n }\n\n // 4. Syntax errors in reproduction test or imported target code\n if (\n combined.includes(\"SyntaxError\") ||\n combined.includes(\"Unexpected token\") ||\n combined.includes(\"Cannot use import statement outside a module\")\n ) {\n return true;\n }\n\n // 5. Module resolution and import failures\n if (\n combined.includes(\"Cannot find module\") ||\n combined.includes(\"Cannot find package\") ||\n combined.includes(\"MODULE_NOT_FOUND\") ||\n combined.includes(\"ERR_MODULE_NOT_FOUND\") ||\n combined.includes(\"ERR_REQUIRE_ESM\") ||\n combined.includes(\"ERR_UNKNOWN_FILE_EXTENSION\") ||\n combined.includes(\"ERR_PACKAGE_PATH_NOT_EXPORTED\") ||\n combined.includes(\"ERR_PACKAGE_IMPORT_NOT_DEFINED\") ||\n combined.includes(\"ERR_UNSUPPORTED_DIR_IMPORT\") ||\n combined.includes(\"ERR_UNSUPPORTED_ESM_URL_SCHEME\") ||\n combined.includes(\"ERR_INVALID_MODULE_SPECIFIER\")\n ) {\n return true;\n }\n\n // 6. Test harness runtime crashes / memory exhaustion / unhandled runtime errors\n if (\n combined.includes(\"Allocation failed - JavaScript heap out of memory\") ||\n combined.includes(\"FATAL ERROR:\") ||\n combined.includes(\"UnhandledPromiseRejection:\") ||\n combined.includes(\"ERR_UNHANDLED_REJECTION\") ||\n combined.includes(\"(Use `node --trace-uncaught\") ||\n /^\\s*(?!(?:AssertionError)\\b)[A-Z]\\w*Error:\\s/m.test(combined)\n ) {\n return true;\n }\n\n return false;\n}\n\n/**\n * Validates whether output indicates a genuine exploit assertion failure.\n *\n * Requirements:\n * 1. Process must exit with code 1.\n * 2. Unhandled runtime crashes (TypeError, ReferenceError, RangeError, URIError, EvalError, SyntaxError)\n * veto assertion qualification even if preceded by stdout debug logs or keywords.\n * 3. Stack frames (` at ...`) are stripped so directory paths never collide with assertion tokens.\n * 4. Assertion matching requires structured line-anchored headers (e.g. `AssertionError:`, `AssertionError [ERR_ASSERTION]:`),\n * error codes (`ERR_ASSERTION`), or explicit exploit reproduction token (`EXPLOIT_REPRODUCED`).\n */\nexport function isAssertionFailure(output: string, exitCode?: number): boolean {\n if (exitCode !== 1) {\n return false;\n }\n\n // 1. Strip stack frames so call site file paths never leak into token matching\n const nonStackOutput = stripStackTraceFrames(output);\n\n // 2. Reject unhandled runtime crashes that are not assertions\n const hasUnhandledCrash =\n /^\\s*(?:(?!(?:AssertionError)\\b)[A-Z]\\w*Error|Error|UnhandledPromiseRejection):\\s/m.test(\n nonStackOutput,\n ) ||\n /^\\s*FATAL ERROR:/m.test(nonStackOutput) ||\n /\\(Use `node --trace-uncaught/m.test(nonStackOutput);\n\n if (hasUnhandledCrash) {\n return false;\n }\n\n // 3. Match structured line-anchored assertion headers and explicit reproduction tokens\n return (\n /^\\s*AssertionError(?:\\s*\\[ERR_ASSERTION\\])?(?::|$)/m.test(nonStackOutput) ||\n /^\\s*(?:Error\\s*)?\\[ERR_ASSERTION\\](?::|$)/m.test(nonStackOutput) ||\n /^\\s*ERR_ASSERTION(?::|\\s*$)/m.test(nonStackOutput) ||\n /^\\s*EXPLOIT_REPRODUCED(?::|\\s*$)/m.test(nonStackOutput) ||\n /^\\s*Assertion failed(?::|$)/im.test(nonStackOutput)\n );\n}\n\nexport interface PrepareReproductionTestParams {\n cwd: string;\n packageName: string;\n vulnerableVersion: string;\n patchesDir?: string;\n proofOfFix?: boolean | string;\n reproductionTest?: string;\n}\n\nexport interface PreparedReproductionTest {\n testFilePath?: string;\n isCreated: boolean;\n}\n\n/**\n * Prepares reproduction test artifact on disk if provided as script string,\n * or verifies existence of path if provided as file reference.\n */\nexport async function prepareReproductionTestFile(\n params: PrepareReproductionTestParams,\n): Promise<PreparedReproductionTest> {\n const {\n cwd,\n packageName,\n vulnerableVersion,\n patchesDir = \"./patches\",\n proofOfFix,\n reproductionTest,\n } = params;\n const patchesDirPath = isAbsolute(patchesDir) ? patchesDir : join(cwd, patchesDir);\n const safeName = packageName.replace(/^@/, \"\").replace(/\\//g, \"+\");\n const defaultTestPath = join(patchesDirPath, `${safeName}+${vulnerableVersion}.test.cjs`);\n\n if (typeof proofOfFix === \"string\" && proofOfFix.trim().length > 0) {\n const resolvedPath = isAbsolute(proofOfFix) ? proofOfFix : join(cwd, proofOfFix);\n if (existsSync(resolvedPath)) {\n return { testFilePath: resolvedPath, isCreated: false };\n }\n await mkdir(patchesDirPath, { recursive: true });\n await writeFile(defaultTestPath, proofOfFix, \"utf8\");\n return { testFilePath: defaultTestPath, isCreated: true };\n }\n\n if (reproductionTest && reproductionTest.trim().length > 0) {\n const resolvedPath = isAbsolute(reproductionTest)\n ? reproductionTest\n : join(cwd, reproductionTest);\n if (existsSync(resolvedPath)) {\n return { testFilePath: resolvedPath, isCreated: false };\n }\n await mkdir(patchesDirPath, { recursive: true });\n await writeFile(defaultTestPath, reproductionTest, \"utf8\");\n return { testFilePath: defaultTestPath, isCreated: true };\n }\n\n if (proofOfFix === true && existsSync(defaultTestPath)) {\n return { testFilePath: defaultTestPath, isCreated: false };\n }\n\n return { testFilePath: undefined, isCreated: false };\n}\n\nexport async function runProofOfFixPhase(\n options: RunProofOfFixPhaseOptions,\n): Promise<ProofOfFixPhaseResult> {\n const { stage, testFilePath, cwd, timeoutMs = 15_000 } = options;\n const started = Date.now();\n\n const isTs = testFilePath.endsWith(\".ts\");\n const nodeArgs = isTs ? [\"--experimental-strip-types\", testFilePath] : [testFilePath];\n\n try {\n const result = await safeExeca(\"node\", nodeArgs, {\n cwd,\n timeoutMs,\n stdio: \"pipe\",\n });\n\n const durationMs = Date.now() - started;\n const stdout = String(result.stdout ?? \"\");\n const stderr = String(result.stderr ?? \"\");\n const output = `${stdout}\\n${stderr}`.trim();\n\n if (stage === \"negative\") {\n // In negative phase, passing cleanly (exitCode 0) means vulnerability was NOT reproduced (false negative).\n return {\n executed: true,\n passed: false,\n exitCode: 0,\n output,\n durationMs,\n error:\n \"Exploit reproduction test passed on vulnerable target (failed to reproduce vulnerability).\",\n };\n }\n\n // In positive phase, exit code 0 means remediation succeeded cleanly.\n return {\n executed: true,\n passed: true,\n exitCode: 0,\n output,\n durationMs,\n };\n } catch (err: unknown) {\n const durationMs = Date.now() - started;\n const execaErr = err as {\n exitCode?: number;\n stdout?: string;\n stderr?: string;\n message?: string;\n timedOut?: boolean;\n signal?: string;\n code?: string;\n };\n const exitCode = typeof execaErr.exitCode === \"number\" ? execaErr.exitCode : 1;\n const errorMsg = execaErr.message || String(err);\n const rawStdout = String(execaErr.stdout ?? \"\").trim();\n const rawStderr = String(execaErr.stderr ?? \"\").trim();\n const processOutput = [rawStdout, rawStderr].filter(Boolean).join(\"\\n\").trim();\n const output = processOutput || errorMsg;\n\n if (stage === \"negative\") {\n // 1. Timeout handling\n if (\n execaErr.timedOut ||\n errorMsg.includes(\"timed out\") ||\n output.includes(\"timed out\") ||\n execaErr.code === \"ETIMEDOUT\"\n ) {\n return {\n executed: true,\n passed: false,\n harnessFailure: true,\n exitCode,\n output,\n durationMs,\n error: \"Exploit reproduction test timed out (execution hung).\",\n };\n }\n\n // 2. Reject harness execution failures (syntax error, missing module, missing file, bad CLI, crash)\n if (\n isHarnessFailure({\n exitCode,\n output,\n errorMsg,\n testFilePath,\n signal: execaErr.signal,\n })\n ) {\n return {\n executed: false,\n passed: false,\n harnessFailure: true,\n exitCode,\n output,\n durationMs,\n error: `Reproduction test failed to execute (harness error): ${errorMsg}`,\n };\n }\n\n // 3. Verify genuine exploit assertion failure with stream precedence and path decoupling\n const knownPaths = [\n cwd,\n testFilePath,\n isAbsolute(testFilePath) ? testFilePath : join(cwd, testFilePath),\n ];\n\n // A. Evaluate stderr first (Node.js writes uncaught exceptions and assertions to stderr)\n if (rawStderr) {\n const stderrSanitized = sanitizePathLeakage(stripStackTraceFrames(rawStderr), knownPaths);\n if (isAssertionFailure(stderrSanitized, exitCode)) {\n return {\n executed: true,\n passed: true,\n exitCode,\n output,\n durationMs,\n };\n }\n\n // Check if stderr contains an unhandled runtime error crash that vetoes stdout\n const hasStderrCrash =\n /^\\s*(?:(?!(?:AssertionError)\\b)[A-Z]\\w*Error|Error|UnhandledPromiseRejection|UnhandledPromiseRejectionWarning):\\s/m.test(\n stderrSanitized,\n ) ||\n /^\\s*FATAL ERROR:/m.test(stderrSanitized) ||\n stderrSanitized.includes(\"Allocation failed - JavaScript heap out of memory\") ||\n /\\(Use `node --trace-uncaught/m.test(rawStderr) ||\n /\\bERR_UNHANDLED_REJECTION\\b/.test(rawStderr) ||\n /^\\s*at\\s+/m.test(rawStderr) ||\n /Node\\.js v\\d+/m.test(rawStderr);\n\n if (hasStderrCrash) {\n return {\n executed: false,\n passed: false,\n harnessFailure: true,\n exitCode,\n output,\n durationMs,\n error: `Reproduction test failed with runtime error instead of exploit assertion: ${errorMsg}`,\n };\n }\n }\n\n // B. If stderr did not contain a crash, evaluate stdout for explicit assertion tokens\n if (rawStdout) {\n const stdoutSanitized = sanitizePathLeakage(stripStackTraceFrames(rawStdout), knownPaths);\n if (isAssertionFailure(stdoutSanitized, exitCode)) {\n return {\n executed: true,\n passed: true,\n exitCode,\n output,\n durationMs,\n };\n }\n }\n\n // C. If stderr/stdout did not match but errorMsg contains an assertion (e.g. simulated rejections)\n if (errorMsg) {\n const errorMsgSanitized = sanitizePathLeakage(stripStackTraceFrames(errorMsg), knownPaths);\n if (isAssertionFailure(errorMsgSanitized, exitCode)) {\n return {\n executed: true,\n passed: true,\n exitCode,\n output,\n durationMs,\n };\n }\n }\n\n // 4. Non-zero exit code without genuine exploit assertion is an unhandled runtime error\n return {\n executed: false,\n passed: false,\n harnessFailure: true,\n exitCode,\n output,\n durationMs,\n error: `Reproduction test failed with runtime error instead of exploit assertion: ${errorMsg}`,\n };\n }\n\n // In positive phase, non-zero exit code means exploit still reproduced or target crashed.\n return {\n executed: true,\n passed: false,\n exitCode,\n output,\n durationMs,\n error: `Reproduction test failed on patched target: ${errorMsg}`,\n };\n }\n}\n\nexport interface AssembleProofOfFixParams {\n reproductionTestPath?: string;\n negativePhase: ProofOfFixPhaseResult;\n positivePhase: ProofOfFixPhaseResult;\n regressionPhase?: ProofOfFixPhaseResult;\n}\n\nexport function assembleProofOfFixVerification(\n params: AssembleProofOfFixParams,\n): ProofOfFixVerification {\n const { reproductionTestPath, negativePhase, positivePhase, regressionPhase } = params;\n\n const regPhase: ProofOfFixPhaseResult = regressionPhase ?? {\n executed: false,\n passed: true,\n };\n\n let status: ProofOfFixStatus = \"verified\";\n let failureReason: string | undefined;\n\n if (!negativePhase.passed) {\n status = \"failed\";\n failureReason = negativePhase.error || \"negative-phase-failed\";\n } else if (!positivePhase.passed) {\n status = \"failed\";\n failureReason = positivePhase.error || \"positive-phase-failed\";\n } else if (regPhase.executed && !regPhase.passed) {\n status = \"failed\";\n failureReason = regPhase.error || \"regression-phase-failed\";\n }\n\n const durationMs =\n (negativePhase.durationMs || 0) + (positivePhase.durationMs || 0) + (regPhase.durationMs || 0);\n\n return {\n status,\n reproductionTestPath,\n negativePhase,\n positivePhase,\n regressionPhase: regPhase,\n durationMs,\n failureReason,\n };\n}\n","import { mkdir, rm } from \"node:fs/promises\";\nimport { join } from \"node:path\";\n\ninterface RepoLockOptions {\n timeoutMs?: number;\n retryDelayMs?: number;\n}\n\ninterface RepoLock {\n lockPath: string;\n release: () => Promise<void>;\n}\n\nasync function sleep(ms: number): Promise<void> {\n await new Promise((resolve) => setTimeout(resolve, ms));\n}\n\nexport async function acquireRepoLock(\n cwd: string,\n options: RepoLockOptions = {},\n): Promise<RepoLock> {\n const timeoutMs = options.timeoutMs ?? 15000;\n const retryDelayMs = options.retryDelayMs ?? 125;\n const lockRoot = join(cwd, \".autoremediator\", \"locks\");\n const lockPath = join(cwd, \".autoremediator\", \"locks\", \"remediation.lock\");\n const startedAt = Date.now();\n\n await mkdir(lockRoot, { recursive: true });\n\n while (true) {\n try {\n await mkdir(lockPath, { recursive: false });\n return {\n lockPath,\n release: async () => {\n await rm(lockPath, { recursive: true, force: true });\n },\n };\n } catch {\n if (Date.now() - startedAt > timeoutMs) {\n throw new Error(`Timed out waiting for repository lock at ${lockPath}.`);\n }\n await sleep(retryDelayMs);\n }\n }\n}\n\nexport async function withRepoLock<T>(\n cwd: string,\n fn: () => Promise<T>,\n options?: RepoLockOptions,\n): Promise<T> {\n const lock = await acquireRepoLock(cwd, options);\n try {\n return await fn();\n } finally {\n await lock.release();\n }\n}\n","/**\n * Call-Site Finder for Breaking Change Remediation\n *\n * Scans project source files using oxc-parser AST parsing to identify\n * all call sites, import statements, member expressions, and argument usages\n * referencing a target dependency without false positives from comments or strings.\n */\nimport { readdirSync, readFileSync, statSync } from \"node:fs\";\nimport { join } from \"node:path\";\nimport { parseSync } from \"oxc-parser\";\n\nconst SOURCE_EXTENSIONS = new Set([\".ts\", \".tsx\", \".js\", \".jsx\", \".mjs\", \".cjs\", \".mts\", \".cts\"]);\nconst IGNORED_DIRS = new Set([\n \"node_modules\",\n \".git\",\n \"dist\",\n \"build\",\n \"coverage\",\n \".next\",\n \".turbo\",\n \".pnpm-store\",\n]);\n\nexport type ImportKind =\n | \"default\"\n | \"namespace\"\n | \"named\"\n | \"require-default\"\n | \"require-destructured\";\n\nexport interface ImportReference {\n localName: string;\n importedName: string;\n isDefault: boolean;\n isNamespace: boolean;\n kind?: ImportKind;\n start?: number;\n end?: number;\n}\n\nexport interface AstCallSite {\n start: number;\n end: number;\n line: number;\n column: number;\n calleeText: string;\n expressionType: \"call\" | \"property-access\";\n localSymbol: string;\n memberName?: string;\n argumentCount: number;\n argumentSpans: Array<{ start: number; end: number; text: string }>;\n}\n\nexport interface ConsumerCallSite {\n filePath: string;\n sourceContent: string;\n importSources: string[];\n imports: ImportReference[];\n referencedLines: number[];\n callSites?: AstCallSite[];\n}\n\nfunction* walkFiles(dir: string): Generator<string> {\n let entries: string[];\n try {\n entries = readdirSync(dir);\n } catch {\n return;\n }\n for (const entry of entries) {\n if (IGNORED_DIRS.has(entry)) continue;\n const full = join(dir, entry);\n let stat;\n try {\n stat = statSync(full);\n } catch {\n continue;\n }\n if (stat.isDirectory()) {\n yield* walkFiles(full);\n } else {\n const ext = full.slice(full.lastIndexOf(\".\"));\n if (SOURCE_EXTENSIONS.has(ext)) {\n yield full;\n }\n }\n }\n}\n\nexport function findPackageCallSites(cwd: string, packageName: string): ConsumerCallSite[] {\n const callSites: ConsumerCallSite[] = [];\n\n for (const filePath of walkFiles(cwd)) {\n let content: string;\n try {\n content = readFileSync(filePath, \"utf8\");\n } catch {\n continue;\n }\n\n // Quick pre-filter to avoid unnecessary parsing\n if (!content.includes(packageName)) {\n continue;\n }\n\n try {\n const parseResult = parseSync(filePath, content);\n if (!parseResult.program) continue;\n\n const program = parseResult.program as unknown as {\n body: Array<any>;\n };\n\n const imports: ImportReference[] = [];\n const importSources: string[] = [];\n const localNames = new Set<string>();\n\n // 1. Identify all imports targeting packageName\n for (const statement of program.body) {\n if (statement.type === \"ImportDeclaration\" && statement.source?.value) {\n const importSource = String(statement.source.value);\n if (importSource === packageName || importSource.startsWith(`${packageName}/`)) {\n importSources.push(importSource);\n\n for (const spec of statement.specifiers || []) {\n const localName = spec.local?.name || \"\";\n if (!localName) continue;\n localNames.add(localName);\n\n if (spec.type === \"ImportDefaultSpecifier\") {\n imports.push({\n localName,\n importedName: \"default\",\n isDefault: true,\n isNamespace: false,\n kind: \"default\",\n start: spec.local?.start,\n end: spec.local?.end,\n });\n } else if (spec.type === \"ImportNamespaceSpecifier\") {\n imports.push({\n localName,\n importedName: \"*\",\n isDefault: false,\n isNamespace: true,\n kind: \"namespace\",\n start: spec.local?.start,\n end: spec.local?.end,\n });\n } else if (spec.type === \"ImportSpecifier\") {\n imports.push({\n localName,\n importedName: spec.imported?.name || localName,\n isDefault: false,\n isNamespace: false,\n kind: \"named\",\n start: spec.local?.start,\n end: spec.local?.end,\n });\n }\n }\n }\n }\n\n // CommonJS require handling\n if (statement.type === \"VariableDeclaration\") {\n for (const decl of statement.declarations || []) {\n if (\n decl.init?.type === \"CallExpression\" &&\n decl.init.callee?.type === \"Identifier\" &&\n decl.init.callee.name === \"require\" &&\n decl.init.arguments?.[0]?.value\n ) {\n const importSource = String(decl.init.arguments[0].value);\n if (importSource === packageName || importSource.startsWith(`${packageName}/`)) {\n importSources.push(importSource);\n if (decl.id?.type === \"Identifier\") {\n const localName = decl.id.name;\n localNames.add(localName);\n imports.push({\n localName,\n importedName: \"default\",\n isDefault: true,\n isNamespace: false,\n kind: \"require-default\",\n });\n } else if (decl.id?.type === \"ObjectPattern\") {\n for (const prop of decl.id.properties || []) {\n const localName = prop.value?.name || prop.key?.name;\n if (localName) {\n localNames.add(localName);\n imports.push({\n localName,\n importedName: prop.key?.name || localName,\n isDefault: false,\n isNamespace: false,\n kind: \"require-destructured\",\n });\n }\n }\n }\n }\n }\n }\n }\n }\n\n if (imports.length === 0 && importSources.length === 0) {\n continue;\n }\n\n // Compute line starts for accurate line/col lookup\n const lineStarts: number[] = [0];\n for (let i = 0; i < content.length; i++) {\n if (content[i] === \"\\n\") lineStarts.push(i + 1);\n }\n function getLineCol(offset: number): { line: number; column: number } {\n let low = 0;\n let high = lineStarts.length - 1;\n while (low <= high) {\n const mid = Math.floor((low + high) / 2);\n if (lineStarts[mid]! <= offset) {\n if (mid === lineStarts.length - 1 || lineStarts[mid + 1]! > offset) {\n return { line: mid + 1, column: offset - lineStarts[mid]! + 1 };\n }\n low = mid + 1;\n } else {\n high = mid - 1;\n }\n }\n return { line: 1, column: offset + 1 };\n }\n\n // 2. Walk AST to find genuine call sites and member references (not in strings or comments)\n const referencedLinesSet = new Set<number>();\n const astCallSites: AstCallSite[] = [];\n\n function walk(node: any, parentType?: string) {\n if (!node || typeof node !== \"object\") return;\n\n if (node.type === \"CallExpression\") {\n let localSymbol = \"\";\n let memberName: string | undefined;\n\n if (node.callee?.type === \"Identifier\" && localNames.has(node.callee.name)) {\n localSymbol = node.callee.name;\n } else if (\n node.callee?.type === \"MemberExpression\" &&\n node.callee.object?.type === \"Identifier\" &&\n localNames.has(node.callee.object.name)\n ) {\n localSymbol = node.callee.object.name;\n memberName = node.callee.property?.name;\n }\n\n if (localSymbol) {\n const { line, column } = getLineCol(node.start);\n referencedLinesSet.add(line);\n\n const argumentSpans = (node.arguments || []).map((arg: any) => ({\n start: arg.start,\n end: arg.end,\n text: content.slice(arg.start, arg.end),\n }));\n\n astCallSites.push({\n start: node.start,\n end: node.end,\n line,\n column,\n calleeText: content.slice(node.callee.start, node.callee.end),\n expressionType: \"call\",\n localSymbol,\n memberName,\n argumentCount: (node.arguments || []).length,\n argumentSpans,\n });\n }\n } else if (node.type === \"MemberExpression\") {\n if (node.object?.type === \"Identifier\" && localNames.has(node.object.name)) {\n const { line, column } = getLineCol(node.start);\n referencedLinesSet.add(line);\n\n if (parentType !== \"CallExpression\") {\n astCallSites.push({\n start: node.start,\n end: node.end,\n line,\n column,\n calleeText: content.slice(node.start, node.end),\n expressionType: \"property-access\",\n localSymbol: node.object.name,\n memberName: node.property?.name,\n argumentCount: 0,\n argumentSpans: [],\n });\n }\n }\n } else if (node.type === \"Identifier\") {\n if (localNames.has(node.name)) {\n const isImportDecl = Boolean(parentType?.startsWith(\"Import\"));\n if (!isImportDecl) {\n const { line } = getLineCol(node.start);\n referencedLinesSet.add(line);\n }\n }\n }\n\n for (const key of Object.keys(node)) {\n if (key === \"parent\") continue;\n const child = node[key];\n if (Array.isArray(child)) {\n for (const item of child) {\n walk(item, node.type);\n }\n } else if (child && typeof child === \"object\") {\n walk(child, node.type);\n }\n }\n }\n\n walk(program);\n\n const referencedLines = Array.from(referencedLinesSet).sort((a, b) => a - b);\n\n callSites.push({\n filePath,\n sourceContent: content,\n importSources,\n imports,\n referencedLines,\n callSites: astCallSites,\n });\n } catch {\n // Ignore parser syntax errors in consumer files\n }\n }\n\n return callSites;\n}\n","/**\n * Breaking Change Refactoring Engine\n *\n * Automatically refactors consumer call sites when upgrading a vulnerable package\n * across breaking major versions or breaking minor changes using AST analysis.\n */\nimport { readFileSync, writeFileSync } from \"node:fs\";\nimport { parseSync } from \"oxc-parser\";\nimport type { ConsumerCallSite } from \"./call-site-finder.js\";\n\nexport interface ArgumentTransformOptions {\n callee: string;\n dropIndex?: number;\n reorder?: [number, number];\n}\n\nexport interface RefactorParams {\n cwd: string;\n packageName: string;\n fromVersion: string;\n toVersion: string;\n diagnosticError: string;\n callSites: ConsumerCallSite[];\n argumentTransforms?: ArgumentTransformOptions;\n}\n\nexport interface RefactorExecutionResult {\n applied: boolean;\n refactoredFiles: string[];\n snapshots: Record<string, string>;\n error?: string;\n}\n\nexport interface ParsedTsDiagnostic {\n filePath?: string;\n line?: number;\n column?: number;\n code?: string;\n message: string;\n suggestedSymbol?: string;\n missingMember?: string;\n}\n\ninterface TextEdit {\n start: number;\n end: number;\n replacement: string;\n}\n\nfunction applyEdits(source: string, edits: TextEdit[]): string {\n if (edits.length === 0) return source;\n // Sort descending by start offset to avoid line/index shift skew\n const sorted = [...edits].sort((a, b) => b.start - a.start);\n let result = source;\n for (const edit of sorted) {\n result = result.slice(0, edit.start) + edit.replacement + result.slice(edit.end);\n }\n return result;\n}\n\n/**\n * Parses compiler/typecheck diagnostic output into structured errors.\n */\nexport function parseCompilerDiagnostics(diagnosticError: string): ParsedTsDiagnostic[] {\n const diagnostics: ParsedTsDiagnostic[] = [];\n const lines = diagnosticError.split(\"\\n\");\n\n for (const line of lines) {\n const trimmed = line.trim();\n if (!trimmed) continue;\n\n // Pattern 1: path/to/file.ts(line,col): error TSxxxx: message\n // Pattern 2: path/to/file.ts:line:col - error TSxxxx: message\n const match = trimmed.match(\n /(?:([^\\s:(]+)[:(](\\d+)[:,](\\d+)\\)?:?\\s*(?:-\\s*)?(?:error\\s+)?(TS\\d+)?:?\\s*(.*))/i,\n );\n\n if (match) {\n const [, filePath, lineStr, colStr, code, message] = match;\n const diag: ParsedTsDiagnostic = {\n filePath,\n line: lineStr ? parseInt(lineStr, 10) : undefined,\n column: colStr ? parseInt(colStr, 10) : undefined,\n code,\n message: message || trimmed,\n };\n\n // Extract \"Did you mean 'xyz'?\"\n const suggestionMatch = diag.message.match(/Did you mean ['\"]([a-zA-Z0-9_$]+)['\"]\\?/i);\n if (suggestionMatch) {\n diag.suggestedSymbol = suggestionMatch[1];\n }\n\n // Extract missing exported member or property\n const missingMatch =\n diag.message.match(/has no exported member ['\"]([a-zA-Z0-9_$]+)['\"]/i) ||\n diag.message.match(/Property ['\"]([a-zA-Z0-9_$]+)['\"] does not exist/i);\n if (missingMatch) {\n diag.missingMember = missingMatch[1];\n }\n\n diagnostics.push(diag);\n }\n }\n\n return diagnostics;\n}\n\n/**\n * Restores original file contents from snapshot in case of failure.\n */\nexport function revertRefactorSnapshots(snapshots: Record<string, string>): void {\n for (const [filePath, content] of Object.entries(snapshots)) {\n try {\n writeFileSync(filePath, content, \"utf8\");\n } catch {\n // Ignore write errors during emergency rollback\n }\n }\n}\n\n/**\n * Transforms function call arguments via AST manipulation (dropping parameters, reordering arguments).\n */\nexport function transformCallArguments(\n content: string,\n options: {\n callee: string;\n dropIndex?: number;\n reorder?: [number, number];\n filePath?: string;\n },\n): { modified: boolean; newContent: string } {\n const parseResult = parseSync(options.filePath ?? \"file.ts\", content);\n if (!parseResult.program) {\n return { modified: false, newContent: content };\n }\n\n const edits: TextEdit[] = [];\n\n function walk(node: any) {\n if (!node || typeof node !== \"object\") return;\n\n if (node.type === \"CallExpression\") {\n const calleeText = content.slice(node.callee.start, node.callee.end);\n const matchesCallee =\n calleeText === options.callee || calleeText.endsWith(`.${options.callee}`);\n\n if (matchesCallee) {\n const args = node.arguments || [];\n\n // Parameter removal / argument dropping\n if (options.dropIndex !== undefined) {\n const idx = options.dropIndex;\n if (idx >= 0 && idx < args.length) {\n if (args.length === 1) {\n edits.push({\n start: args[0].start,\n end: args[0].end,\n replacement: \"\",\n });\n } else if (idx < args.length - 1) {\n // Not the last argument: remove up to the start of the next argument\n edits.push({\n start: args[idx].start,\n end: args[idx + 1].start,\n replacement: \"\",\n });\n } else {\n // Last argument: remove from the end of the previous argument up to end of this argument\n edits.push({\n start: args[idx - 1].end,\n end: args[idx].end,\n replacement: \"\",\n });\n }\n }\n }\n\n // Argument reordering\n if (options.reorder) {\n const [i, j] = options.reorder;\n if (i >= 0 && j >= 0 && i < args.length && j < args.length && i !== j) {\n const argIText = content.slice(args[i].start, args[i].end);\n const argJText = content.slice(args[j].start, args[j].end);\n edits.push({\n start: args[i].start,\n end: args[i].end,\n replacement: argJText,\n });\n edits.push({\n start: args[j].start,\n end: args[j].end,\n replacement: argIText,\n });\n }\n }\n }\n }\n\n for (const key of Object.keys(node)) {\n if (key === \"parent\") continue;\n const child = node[key];\n if (Array.isArray(child)) {\n for (const item of child) walk(item);\n } else if (child && typeof child === \"object\") {\n walk(child);\n }\n }\n }\n\n walk(parseResult.program);\n\n if (edits.length === 0) {\n return { modified: false, newContent: content };\n }\n\n return { modified: true, newContent: applyEdits(content, edits) };\n}\n\n/**\n * Applies deterministic and compiler-guided AST transformations to a source file.\n */\nfunction transformFileContent(\n content: string,\n packageName: string,\n diagnosticError: string,\n filePath?: string,\n argumentTransforms?: ArgumentTransformOptions,\n): { modified: boolean; newContent: string } {\n let currentContent = content;\n let modified = false;\n\n const parseResult = parseSync(filePath ?? \"file.ts\", currentContent);\n if (!parseResult.program) {\n return { modified: false, newContent: content };\n }\n\n const edits: TextEdit[] = [];\n const body = (parseResult.program as any).body || [];\n\n let defaultLocalName: string | undefined;\n let namespaceLocalName: string | undefined;\n let defaultImportDecl: any;\n let subpathImportDecl: any;\n let subpathName: string | undefined;\n\n for (const statement of body) {\n if (statement.type === \"ImportDeclaration\" && statement.source?.value) {\n const specText = String(statement.source.value);\n if (specText === packageName) {\n for (const spec of statement.specifiers || []) {\n if (spec.type === \"ImportDefaultSpecifier\") {\n defaultLocalName = spec.local?.name;\n defaultImportDecl = statement;\n } else if (spec.type === \"ImportNamespaceSpecifier\") {\n namespaceLocalName = spec.local?.name;\n }\n }\n } else if (specText.startsWith(`${packageName}/`)) {\n subpathImportDecl = statement;\n subpathName = specText.slice(packageName.length + 1);\n for (const spec of statement.specifiers || []) {\n if (spec.type === \"ImportDefaultSpecifier\") {\n defaultLocalName = spec.local?.name;\n }\n }\n }\n }\n }\n\n // 1. Subpath Import Migration: e.g. `import v4 from \"uuid/v4\"` -> `import { v4 as v4 } from \"uuid\";`\n if (\n subpathImportDecl &&\n (diagnosticError.includes(`Cannot find module '${packageName}/`) ||\n diagnosticError.includes(`Cannot find module \"${packageName}/`))\n ) {\n const local = defaultLocalName || subpathName || \"default\";\n const newImport = `import { ${subpathName} as ${local} } from \"${packageName}\";`;\n edits.push({\n start: subpathImportDecl.start,\n end: subpathImportDecl.end,\n replacement: newImport,\n });\n }\n\n // 2. Known library breaking change migrations\n // A. rimraf: rimraf.sync(...) -> rimrafSync(...) with import { rimrafSync } from \"rimraf\"\n if (\n packageName === \"rimraf\" &&\n (diagnosticError.includes(\"sync\") ||\n diagnosticError.includes(\"rimrafSync\") ||\n currentContent.includes(\"rimraf.sync(\") ||\n (defaultLocalName && currentContent.includes(`${defaultLocalName}.sync(`)))\n ) {\n const targetLocal = defaultLocalName || \"rimraf\";\n function walkRimraf(node: any) {\n if (!node || typeof node !== \"object\") return;\n if (\n node.type === \"CallExpression\" &&\n node.callee?.type === \"MemberExpression\" &&\n node.callee.object?.type === \"Identifier\" &&\n node.callee.object.name === targetLocal &&\n node.callee.property?.name === \"sync\"\n ) {\n edits.push({\n start: node.callee.start,\n end: node.callee.end,\n replacement: \"rimrafSync\",\n });\n }\n for (const k of Object.keys(node)) {\n if (k === \"parent\") continue;\n const v = node[k];\n if (Array.isArray(v)) v.forEach(walkRimraf);\n else if (v && typeof v === \"object\") walkRimraf(v);\n }\n }\n walkRimraf(parseResult.program);\n\n if (defaultImportDecl) {\n edits.push({\n start: defaultImportDecl.start,\n end: defaultImportDecl.end,\n replacement: `import { rimrafSync } from \"rimraf\";`,\n });\n }\n }\n\n // B. uuid: uuid.v4(...) -> uuidv4(...) with import { v4 as uuidv4 } from \"uuid\"\n if (\n packageName === \"uuid\" &&\n (diagnosticError.includes(\"v4\") ||\n diagnosticError.includes(\"uuidv4\") ||\n currentContent.includes(\"uuid.v4(\") ||\n (defaultLocalName && currentContent.includes(`${defaultLocalName}.v4(`)))\n ) {\n const targetLocal = defaultLocalName || \"uuid\";\n function walkUuid(node: any) {\n if (!node || typeof node !== \"object\") return;\n if (\n node.type === \"CallExpression\" &&\n node.callee?.type === \"MemberExpression\" &&\n node.callee.object?.type === \"Identifier\" &&\n node.callee.object.name === targetLocal &&\n node.callee.property?.name === \"v4\"\n ) {\n edits.push({\n start: node.callee.start,\n end: node.callee.end,\n replacement: \"uuidv4\",\n });\n }\n for (const k of Object.keys(node)) {\n if (k === \"parent\") continue;\n const v = node[k];\n if (Array.isArray(v)) v.forEach(walkUuid);\n else if (v && typeof v === \"object\") walkUuid(v);\n }\n }\n walkUuid(parseResult.program);\n\n if (defaultImportDecl) {\n edits.push({\n start: defaultImportDecl.start,\n end: defaultImportDecl.end,\n replacement: `import { v4 as uuidv4 } from \"uuid\";`,\n });\n }\n }\n\n // C. glob: glob.sync(...) -> globSync(...) with import { globSync } from \"glob\"\n if (\n packageName === \"glob\" &&\n (diagnosticError.includes(\"sync\") ||\n diagnosticError.includes(\"globSync\") ||\n currentContent.includes(\"glob.sync(\") ||\n (defaultLocalName && currentContent.includes(`${defaultLocalName}.sync(`)))\n ) {\n const targetLocal = defaultLocalName || \"glob\";\n function walkGlob(node: any) {\n if (!node || typeof node !== \"object\") return;\n if (\n node.type === \"CallExpression\" &&\n node.callee?.type === \"MemberExpression\" &&\n node.callee.object?.type === \"Identifier\" &&\n node.callee.object.name === targetLocal &&\n node.callee.property?.name === \"sync\"\n ) {\n edits.push({\n start: node.callee.start,\n end: node.callee.end,\n replacement: \"globSync\",\n });\n }\n for (const k of Object.keys(node)) {\n if (k === \"parent\") continue;\n const v = node[k];\n if (Array.isArray(v)) v.forEach(walkGlob);\n else if (v && typeof v === \"object\") walkGlob(v);\n }\n }\n walkGlob(parseResult.program);\n\n if (defaultImportDecl) {\n edits.push({\n start: defaultImportDecl.start,\n end: defaultImportDecl.end,\n replacement: `import { globSync } from \"glob\";`,\n });\n }\n }\n\n // D. mkdirp: mkdirp.sync(...) -> mkdirpSync(...) with import { mkdirpSync } from \"mkdirp\"\n if (\n packageName === \"mkdirp\" &&\n (diagnosticError.includes(\"sync\") ||\n diagnosticError.includes(\"mkdirpSync\") ||\n currentContent.includes(\"mkdirp.sync(\") ||\n (defaultLocalName && currentContent.includes(`${defaultLocalName}.sync(`)))\n ) {\n const targetLocal = defaultLocalName || \"mkdirp\";\n function walkMkdirp(node: any) {\n if (!node || typeof node !== \"object\") return;\n if (\n node.type === \"CallExpression\" &&\n node.callee?.type === \"MemberExpression\" &&\n node.callee.object?.type === \"Identifier\" &&\n node.callee.object.name === targetLocal &&\n node.callee.property?.name === \"sync\"\n ) {\n edits.push({\n start: node.callee.start,\n end: node.callee.end,\n replacement: \"mkdirpSync\",\n });\n }\n for (const k of Object.keys(node)) {\n if (k === \"parent\") continue;\n const v = node[k];\n if (Array.isArray(v)) v.forEach(walkMkdirp);\n else if (v && typeof v === \"object\") walkMkdirp(v);\n }\n }\n walkMkdirp(parseResult.program);\n\n if (defaultImportDecl) {\n edits.push({\n start: defaultImportDecl.start,\n end: defaultImportDecl.end,\n replacement: `import { mkdirpSync } from \"mkdirp\";`,\n });\n }\n }\n\n // 3. Default export removed in favor of namespace (TS2614, TS1192, \"no default export\")\n if (\n defaultImportDecl &&\n defaultLocalName &&\n (diagnosticError.includes(\"no default export\") ||\n diagnosticError.includes(\"has no exported member 'default'\") ||\n diagnosticError.includes(\"has no exported member default\") ||\n diagnosticError.includes(\"TS2614\") ||\n diagnosticError.includes(\"TS1192\"))\n ) {\n edits.push({\n start: defaultImportDecl.start,\n end: defaultImportDecl.end,\n replacement: `import * as ${defaultLocalName} from \"${packageName}\";`,\n });\n }\n\n // 4. Namespace import deprecated in favor of default import (TS1259)\n if (\n namespaceLocalName &&\n (diagnosticError.includes(\"can only be used with a default import\") ||\n diagnosticError.includes(\"only be used with a default import\") ||\n diagnosticError.includes(\"TS1259\"))\n ) {\n for (const statement of body) {\n if (\n statement.type === \"ImportDeclaration\" &&\n String(statement.source?.value) === packageName\n ) {\n edits.push({\n start: statement.start,\n end: statement.end,\n replacement: `import ${namespaceLocalName} from \"${packageName}\";`,\n });\n }\n }\n }\n\n // 5. Compiler feedback: \"Did you mean 'XYZ'?\" auto-replacement\n const diagnostics = parseCompilerDiagnostics(diagnosticError);\n for (const diag of diagnostics) {\n if (diag.missingMember && diag.suggestedSymbol) {\n const missing = diag.missingMember;\n const suggested = diag.suggestedSymbol;\n\n const lineStarts: number[] = [0];\n for (let i = 0; i < currentContent.length; i++) {\n if (currentContent[i] === \"\\n\") lineStarts.push(i + 1);\n }\n function getLine(offset: number): number {\n let low = 0;\n let high = lineStarts.length - 1;\n while (low <= high) {\n const mid = Math.floor((low + high) / 2);\n if (lineStarts[mid]! <= offset) {\n if (mid === lineStarts.length - 1 || lineStarts[mid + 1]! > offset) {\n return mid + 1;\n }\n low = mid + 1;\n } else {\n high = mid - 1;\n }\n }\n return 1;\n }\n\n function walkDiagnostics(node: any) {\n if (!node || typeof node !== \"object\") return;\n if (node.type === \"MemberExpression\" && node.property?.name === missing) {\n const line = getLine(node.start);\n const lineMatches = !diag.line || diag.line === line;\n if (lineMatches) {\n edits.push({\n start: node.property.start,\n end: node.property.end,\n replacement: suggested,\n });\n }\n }\n if (\n node.type === \"ImportSpecifier\" &&\n (node.imported?.name === missing || node.local?.name === missing)\n ) {\n edits.push({\n start: node.local.start,\n end: node.local.end,\n replacement: suggested,\n });\n }\n for (const k of Object.keys(node)) {\n if (k === \"parent\") continue;\n const v = node[k];\n if (Array.isArray(v)) v.forEach(walkDiagnostics);\n else if (v && typeof v === \"object\") walkDiagnostics(v);\n }\n }\n\n walkDiagnostics(parseResult.program);\n }\n }\n\n if (edits.length > 0) {\n currentContent = applyEdits(currentContent, edits);\n modified = true;\n }\n\n // 6. Explicit argument transforms if supplied\n if (argumentTransforms) {\n const argResult = transformCallArguments(currentContent, {\n ...argumentTransforms,\n filePath,\n });\n if (argResult.modified) {\n currentContent = argResult.newContent;\n modified = true;\n }\n }\n\n return { modified, newContent: currentContent };\n}\n\nexport async function refactorConsumerCallSites(\n params: RefactorParams,\n): Promise<RefactorExecutionResult> {\n const { packageName, diagnosticError, callSites, argumentTransforms } = params;\n\n if (callSites.length === 0) {\n return {\n applied: false,\n refactoredFiles: [],\n snapshots: {},\n error: `No consumer call sites found for \"${packageName}\".`,\n };\n }\n\n const snapshots: Record<string, string> = {};\n const refactoredFiles: string[] = [];\n\n try {\n for (const site of callSites) {\n const originalContent = site.sourceContent || readFileSync(site.filePath, \"utf8\");\n snapshots[site.filePath] = originalContent;\n\n const { modified, newContent } = transformFileContent(\n originalContent,\n packageName,\n diagnosticError,\n site.filePath,\n argumentTransforms,\n );\n\n if (modified && newContent !== originalContent) {\n writeFileSync(site.filePath, newContent, \"utf8\");\n refactoredFiles.push(site.filePath);\n }\n }\n\n if (refactoredFiles.length === 0) {\n return {\n applied: false,\n refactoredFiles: [],\n snapshots,\n error: \"No automated codemod pattern matched the diagnostic error.\",\n };\n }\n\n return {\n applied: true,\n refactoredFiles,\n snapshots,\n };\n } catch (err) {\n revertRefactorSnapshots(snapshots);\n const message = err instanceof Error ? err.message : String(err);\n return {\n applied: false,\n refactoredFiles: [],\n snapshots,\n error: `Failed to apply breaking change refactoring: ${message}`,\n };\n }\n}\n","import { defineTool } from \"../tool-compat.js\";\nimport { z } from \"zod\";\nimport { join } from \"node:path\";\nimport { existsSync, readFileSync, writeFileSync } from \"node:fs\";\nimport { rm } from \"node:fs/promises\";\nimport { safeExeca } from \"../../../platform/safe-exec.js\";\nimport semver from \"semver\";\nimport type {\n PatchResult,\n ProofOfFixPhaseResult,\n ProofOfFixVerification,\n} from \"../../../platform/types.js\";\nimport {\n assembleProofOfFixVerification,\n prepareReproductionTestFile,\n runProofOfFixPhase,\n} from \"../../proof-of-fix/runner.js\";\nimport { isPackageAllowed, loadPolicy } from \"../../../platform/policy.js\";\nimport { withRepoLock } from \"../../../platform/repo-lock.js\";\nimport {\n detectPackageManager,\n getYarnMajorVersion,\n resolveDedupeCommand,\n resolveInstallCommand,\n resolveTestCommand,\n type PackageManager,\n} from \"../../../platform/package-manager/index.js\";\nimport {\n collectDependencyTrace,\n describeOverrideField,\n getDenoJsonImportValue,\n getOverrideValue,\n restoreDenoJsonImportValue,\n restoreOverrideValue,\n setDenoJsonImportValue,\n setOverrideValue,\n type DenoJson,\n type RawPackageJson,\n} from \"./helpers.js\";\n\nexport const applyPackageOverrideTool = defineTool({\n description:\n \"Apply a package-manager-native package.json override for a vulnerable transitive dependency and reinstall. Uses npm overrides, pnpm.overrides, yarn resolutions, bun overrides, or deno.json imports.\",\n parameters: z.object({\n cwd: z.string().describe(\"Absolute path to the consumer project root\"),\n packageManager: z\n .enum([\"npm\", \"pnpm\", \"yarn\", \"bun\", \"deno\"])\n .optional()\n .describe(\"Package manager used by the target project (auto-detected if omitted)\"),\n packageName: z.string().describe(\"The npm package to override\"),\n selector: z\n .string()\n .optional()\n .describe(\"Optional manager-native override selector key (for nested or scoped overrides)\"),\n fromVersion: z.string().describe(\"The currently installed vulnerable version\"),\n toVersion: z.string().describe(\"The safe target version to override to\"),\n dryRun: z.boolean().default(false).describe(\"If true, report changes but do not write\"),\n policy: z.string().optional().describe(\"Optional path to .autoremediator policy file\"),\n runTests: z\n .boolean()\n .default(false)\n .describe(\"If true, run test validation after applying the override\"),\n installMode: z.enum([\"standard\", \"prefer-offline\", \"deterministic\"]).optional(),\n installPreferOffline: z.boolean().optional(),\n enforceFrozenLockfile: z.boolean().optional(),\n workspace: z.string().optional(),\n reproductionTest: z\n .string()\n .optional()\n .describe(\"Optional reproduction test script verifying fix\"),\n proofOfFix: z\n .union([z.boolean(), z.string()])\n .optional()\n .describe(\"If true or script path/content, enforce dual-stage exploit reproduction\"),\n requireProofOfFix: z\n .boolean()\n .optional()\n .describe(\"If true, fail and rollback override if proof-of-fix verification fails\"),\n patchesDir: z\n .string()\n .optional()\n .default(\"./patches\")\n .describe(\"Directory containing patch/reproduction artifacts\"),\n }),\n execute: async ({\n cwd,\n packageManager,\n packageName,\n selector,\n fromVersion,\n toVersion,\n dryRun,\n policy,\n runTests,\n installMode,\n installPreferOffline,\n enforceFrozenLockfile,\n workspace,\n reproductionTest,\n proofOfFix,\n requireProofOfFix,\n patchesDir,\n }): Promise<PatchResult> => {\n const pm = (packageManager ?? detectPackageManager(cwd)) as PackageManager;\n const pkgPath = join(cwd, \"package.json\");\n const denoJsonPath = join(cwd, \"deno.json\");\n const isDenoNative = pm === \"deno\" && !existsSync(pkgPath);\n const loadedPolicy = loadPolicy(cwd, policy);\n const commandConstraints = {\n ...loadedPolicy.constraints,\n installMode: installMode ?? loadedPolicy.constraints?.installMode,\n installPreferOffline: installPreferOffline ?? loadedPolicy.constraints?.installPreferOffline,\n enforceFrozenLockfile:\n enforceFrozenLockfile ?? loadedPolicy.constraints?.enforceFrozenLockfile,\n workspace: workspace ?? loadedPolicy.constraints?.workspace,\n };\n const yarnMajor = pm === \"yarn\" ? await getYarnMajorVersion(cwd) : undefined;\n const installCommand = resolveInstallCommand(pm, commandConstraints, yarnMajor);\n const testCommand = resolveTestCommand(pm, commandConstraints);\n const dedupeCommand = resolveDedupeCommand(pm, commandConstraints);\n const overrideSelector = selector?.trim() || packageName;\n\n if (!isPackageAllowed(loadedPolicy, packageName)) {\n return {\n packageName,\n strategy: \"none\",\n fromVersion,\n toVersion,\n applied: false,\n dryRun,\n unresolvedReason: \"policy-blocked\",\n message: `Policy blocked changes for package \"${packageName}\".`,\n };\n }\n\n const isMajorBump =\n semver.valid(fromVersion) &&\n semver.valid(toVersion) &&\n semver.major(toVersion) > semver.major(fromVersion);\n\n if (isMajorBump && !loadedPolicy.allowMajorBumps) {\n return {\n packageName,\n strategy: \"none\",\n fromVersion,\n toVersion,\n applied: false,\n dryRun,\n unresolvedReason: \"major-bump-required\",\n message: `Policy blocked major override for \"${packageName}\" (${fromVersion} -> ${toVersion}).`,\n };\n }\n\n // ---- Deno native path (deno.json import map, no package.json) ----\n if (isDenoNative) {\n let denoJson: DenoJson;\n try {\n denoJson = JSON.parse(readFileSync(denoJsonPath, \"utf8\")) as DenoJson;\n } catch {\n return {\n packageName,\n strategy: \"none\",\n fromVersion,\n toVersion,\n applied: false,\n dryRun,\n unresolvedReason: \"package-json-not-found\",\n message: `Could not read deno.json at \"${denoJsonPath}\".`,\n };\n }\n\n const existingEntry = getDenoJsonImportValue(denoJson, overrideSelector);\n if (!existingEntry) {\n return {\n packageName,\n strategy: \"none\",\n fromVersion,\n toVersion,\n applied: false,\n dryRun,\n unresolvedReason: \"transitive-override-unsupported-deno-native\",\n message: `Cannot apply transitive override for \"${overrideSelector}\" in a native Deno project (no package.json). Only direct dependencies declared in deno.json imports can be overridden.`,\n };\n }\n\n const dependencyTrace = await collectDependencyTrace(\n cwd,\n pm,\n packageName,\n commandConstraints,\n );\n const dependencyTraceSuffix = dependencyTrace ? ` Dependency trace: ${dependencyTrace}` : \"\";\n\n if (dryRun) {\n return {\n packageName,\n strategy: \"override\",\n fromVersion,\n toVersion,\n applied: false,\n dryRun: true,\n message: `[DRY RUN] Would update deno.json imports[\"${existingEntry.key}\"] to \"npm:${overrideSelector}@${toVersion}\", then run ${installCommand.join(\" \")}.${dependencyTraceSuffix}`,\n };\n }\n\n return withRepoLock(cwd, async () => {\n const prepared = await prepareReproductionTestFile({\n cwd,\n packageName,\n vulnerableVersion: fromVersion,\n patchesDir,\n proofOfFix,\n reproductionTest,\n });\n const reproTestPath = prepared.testFilePath;\n const isProofActive = Boolean(reproTestPath || proofOfFix || requireProofOfFix);\n\n let negativePhaseResult: ProofOfFixPhaseResult | undefined;\n if (isProofActive) {\n if (!reproTestPath) {\n if (requireProofOfFix) {\n return {\n packageName,\n strategy: \"none\",\n fromVersion,\n toVersion,\n applied: false,\n dryRun,\n unresolvedReason: \"policy-blocked\",\n message:\n \"Proof-of-fix verification required, but no reproduction test or script was supplied.\",\n };\n }\n } else {\n negativePhaseResult = await runProofOfFixPhase({\n stage: \"negative\",\n testFilePath: reproTestPath,\n cwd,\n });\n\n if (!negativePhaseResult.passed) {\n if (prepared.isCreated && reproTestPath) {\n await rm(reproTestPath, { force: true }).catch(() => {});\n }\n return {\n packageName,\n strategy: \"override\",\n fromVersion,\n toVersion,\n applied: false,\n dryRun: false,\n unresolvedReason: requireProofOfFix ? \"policy-blocked\" : \"proof-of-fix-failed\",\n message: `Proof-of-fix negative phase failed: ${negativePhaseResult.error}`,\n };\n }\n }\n }\n\n setDenoJsonImportValue(denoJson, overrideSelector, toVersion);\n writeFileSync(denoJsonPath, JSON.stringify(denoJson, null, 2) + \"\\n\", \"utf8\");\n\n try {\n const [installCmd, ...installArgs] = installCommand;\n await safeExeca(installCmd, installArgs, { cwd, stdio: \"pipe\" });\n } catch (err) {\n restoreDenoJsonImportValue(denoJson, overrideSelector, existingEntry);\n writeFileSync(denoJsonPath, JSON.stringify(denoJson, null, 2) + \"\\n\", \"utf8\");\n const message = err instanceof Error ? err.message : String(err);\n return {\n packageName,\n strategy: \"override\",\n fromVersion,\n toVersion,\n applied: false,\n dryRun: false,\n unresolvedReason: \"override-apply-failed\",\n message: `${installCommand.join(\" \")} failed after updating deno.json imports for \"${overrideSelector}\" to ${toVersion}. Reverted. Error: ${message}${dependencyTraceSuffix}`,\n };\n }\n\n if (runTests) {\n try {\n const [testCmd, ...testArgs] = testCommand;\n await safeExeca(testCmd, testArgs, { cwd, stdio: \"pipe\" });\n } catch (err) {\n restoreDenoJsonImportValue(denoJson, overrideSelector, existingEntry);\n writeFileSync(denoJsonPath, JSON.stringify(denoJson, null, 2) + \"\\n\", \"utf8\");\n\n try {\n const [rollbackCmd, ...rollbackArgs] = installCommand;\n await safeExeca(rollbackCmd, rollbackArgs, { cwd, stdio: \"pipe\" });\n } catch {\n // Ignore rollback failure.\n }\n\n const message = err instanceof Error ? err.message : String(err);\n return {\n packageName,\n strategy: \"override\",\n fromVersion,\n toVersion,\n applied: false,\n dryRun: false,\n unresolvedReason: \"validation-failed\",\n message: `${testCommand.join(\" \")} failed after updating deno.json imports for \"${overrideSelector}\" to ${toVersion}. Reverted. Error: ${message}${dependencyTraceSuffix}`,\n };\n }\n }\n\n let proofOfFixVerification: ProofOfFixVerification | undefined;\n if (reproTestPath && negativePhaseResult?.passed) {\n const positivePhaseResult = await runProofOfFixPhase({\n stage: \"positive\",\n testFilePath: reproTestPath,\n cwd,\n });\n\n if (!positivePhaseResult.passed) {\n restoreDenoJsonImportValue(denoJson, overrideSelector, existingEntry);\n writeFileSync(denoJsonPath, JSON.stringify(denoJson, null, 2) + \"\\n\", \"utf8\");\n\n try {\n const [rollbackCmd, ...rollbackArgs] = installCommand;\n await safeExeca(rollbackCmd, rollbackArgs, { cwd, stdio: \"pipe\" });\n } catch {}\n\n if (prepared.isCreated && reproTestPath) {\n await rm(reproTestPath, { force: true }).catch(() => {});\n }\n\n return {\n packageName,\n strategy: \"override\",\n fromVersion,\n toVersion,\n applied: false,\n dryRun: false,\n unresolvedReason: requireProofOfFix ? \"policy-blocked\" : \"proof-of-fix-failed\",\n message: `Proof-of-fix positive phase failed: ${positivePhaseResult.error}`,\n };\n }\n\n proofOfFixVerification = assembleProofOfFixVerification({\n reproductionTestPath: reproTestPath,\n negativePhase: negativePhaseResult,\n positivePhase: positivePhaseResult,\n regressionPhase: {\n executed: runTests,\n passed: true,\n },\n });\n }\n\n return {\n packageName,\n strategy: \"override\",\n fromVersion,\n toVersion,\n applied: true,\n dryRun: false,\n proofOfFix: proofOfFixVerification,\n message: `Successfully updated deno.json imports[\"${existingEntry.key}\"] for \"${overrideSelector}\" from ${fromVersion} to ${toVersion}, then ran ${installCommand.join(\" \")}${runTests ? ` and passed ${testCommand.join(\" \")}` : \"\"}.${dependencyTraceSuffix}`,\n };\n });\n }\n\n // ---- npm / pnpm / yarn / bun / deno-npm-compat path ----\n let pkgJson: RawPackageJson;\n try {\n pkgJson = JSON.parse(readFileSync(pkgPath, \"utf8\")) as RawPackageJson;\n } catch {\n return {\n packageName,\n strategy: \"none\",\n fromVersion,\n toVersion,\n applied: false,\n dryRun,\n unresolvedReason: \"package-json-not-found\",\n message: `Could not read package.json at \"${pkgPath}\".`,\n };\n }\n\n const overrideLabel = describeOverrideField(pm);\n const previousValue = getOverrideValue(pkgJson, pm, overrideSelector);\n\n const dependencyTrace = await collectDependencyTrace(cwd, pm, packageName, commandConstraints);\n const dependencyTraceSuffix = dependencyTrace ? ` Dependency trace: ${dependencyTrace}` : \"\";\n\n if (dryRun) {\n return {\n packageName,\n strategy: \"override\",\n fromVersion,\n toVersion,\n applied: false,\n dryRun: true,\n message: `[DRY RUN] Would set ${overrideLabel}.${overrideSelector} to \"${toVersion}\", then run ${installCommand.join(\" \")}${runTests ? ` and ${testCommand.join(\" \")}` : \"\"}${dedupeCommand.length > 0 ? ` and ${dedupeCommand.join(\" \")} (best-effort)` : \"\"}.${dependencyTraceSuffix}`,\n };\n }\n\n return withRepoLock(cwd, async () => {\n const prepared = await prepareReproductionTestFile({\n cwd,\n packageName,\n vulnerableVersion: fromVersion,\n patchesDir,\n proofOfFix,\n reproductionTest,\n });\n const reproTestPath = prepared.testFilePath;\n const isProofActive = Boolean(reproTestPath || proofOfFix || requireProofOfFix);\n\n let negativePhaseResult: ProofOfFixPhaseResult | undefined;\n if (isProofActive) {\n if (!reproTestPath) {\n if (requireProofOfFix) {\n return {\n packageName,\n strategy: \"none\",\n fromVersion,\n toVersion,\n applied: false,\n dryRun,\n unresolvedReason: \"policy-blocked\",\n message:\n \"Proof-of-fix verification required, but no reproduction test or script was supplied.\",\n };\n }\n } else {\n negativePhaseResult = await runProofOfFixPhase({\n stage: \"negative\",\n testFilePath: reproTestPath,\n cwd,\n });\n\n if (!negativePhaseResult.passed) {\n if (prepared.isCreated && reproTestPath) {\n await rm(reproTestPath, { force: true }).catch(() => {});\n }\n return {\n packageName,\n strategy: \"override\",\n fromVersion,\n toVersion,\n applied: false,\n dryRun: false,\n unresolvedReason: requireProofOfFix ? \"policy-blocked\" : \"proof-of-fix-failed\",\n message: `Proof-of-fix negative phase failed: ${negativePhaseResult.error}`,\n };\n }\n }\n }\n\n setOverrideValue(pkgJson, pm, overrideSelector, toVersion);\n writeFileSync(pkgPath, JSON.stringify(pkgJson, null, 2) + \"\\n\", \"utf8\");\n\n try {\n const [installCmd, ...installArgs] = installCommand;\n await safeExeca(installCmd, installArgs, { cwd, stdio: \"pipe\" });\n } catch (err) {\n restoreOverrideValue(pkgJson, pm, overrideSelector, previousValue);\n writeFileSync(pkgPath, JSON.stringify(pkgJson, null, 2) + \"\\n\", \"utf8\");\n const message = err instanceof Error ? err.message : String(err);\n return {\n packageName,\n strategy: \"override\",\n fromVersion,\n toVersion,\n applied: false,\n dryRun: false,\n unresolvedReason: \"override-apply-failed\",\n message: `${installCommand.join(\" \")} failed after applying ${overrideLabel} for \"${overrideSelector}\" to ${toVersion}. Reverted. Error: ${message}${dependencyTraceSuffix}`,\n };\n }\n\n if (runTests) {\n try {\n const [testCmd, ...testArgs] = testCommand;\n await safeExeca(testCmd, testArgs, { cwd, stdio: \"pipe\" });\n } catch (err) {\n restoreOverrideValue(pkgJson, pm, overrideSelector, previousValue);\n writeFileSync(pkgPath, JSON.stringify(pkgJson, null, 2) + \"\\n\", \"utf8\");\n\n try {\n const [rollbackCmd, ...rollbackArgs] = installCommand;\n await safeExeca(rollbackCmd, rollbackArgs, { cwd, stdio: \"pipe\" });\n } catch {\n // Ignore rollback install failure and return original test failure context.\n }\n\n const message = err instanceof Error ? err.message : String(err);\n return {\n packageName,\n strategy: \"override\",\n fromVersion,\n toVersion,\n applied: false,\n dryRun: false,\n unresolvedReason: \"validation-failed\",\n message: `${testCommand.join(\" \")} failed after applying ${overrideLabel} for \"${overrideSelector}\" to ${toVersion}. Reverted. Error: ${message}${dependencyTraceSuffix}`,\n };\n }\n }\n\n let proofOfFixVerification: ProofOfFixVerification | undefined;\n if (reproTestPath && negativePhaseResult?.passed) {\n const positivePhaseResult = await runProofOfFixPhase({\n stage: \"positive\",\n testFilePath: reproTestPath,\n cwd,\n });\n\n if (!positivePhaseResult.passed) {\n restoreOverrideValue(pkgJson, pm, overrideSelector, previousValue);\n writeFileSync(pkgPath, JSON.stringify(pkgJson, null, 2) + \"\\n\", \"utf8\");\n\n try {\n const [rollbackCmd, ...rollbackArgs] = installCommand;\n await safeExeca(rollbackCmd, rollbackArgs, { cwd, stdio: \"pipe\" });\n } catch {}\n\n if (prepared.isCreated && reproTestPath) {\n await rm(reproTestPath, { force: true }).catch(() => {});\n }\n\n return {\n packageName,\n strategy: \"override\",\n fromVersion,\n toVersion,\n applied: false,\n dryRun: false,\n unresolvedReason: requireProofOfFix ? \"policy-blocked\" : \"proof-of-fix-failed\",\n message: `Proof-of-fix positive phase failed: ${positivePhaseResult.error}`,\n };\n }\n\n proofOfFixVerification = assembleProofOfFixVerification({\n reproductionTestPath: reproTestPath,\n negativePhase: negativePhaseResult,\n positivePhase: positivePhaseResult,\n regressionPhase: {\n executed: runTests,\n passed: true,\n },\n });\n }\n\n let dedupeNote = \"\";\n if (dedupeCommand.length > 0) {\n try {\n const [dedupeCmd, ...dedupeArgs] = dedupeCommand;\n await safeExeca(dedupeCmd, dedupeArgs, { cwd, stdio: \"pipe\" });\n } catch (err) {\n const message = err instanceof Error ? err.message : String(err);\n dedupeNote = ` Dedupe warning: ${dedupeCommand.join(\" \")} failed (${message}).`;\n }\n }\n\n return {\n packageName,\n strategy: \"override\",\n fromVersion,\n toVersion,\n applied: true,\n dryRun: false,\n proofOfFix: proofOfFixVerification,\n message: `Successfully applied ${overrideLabel} for \"${overrideSelector}\" from ${fromVersion} to ${toVersion}, then ran ${installCommand.join(\" \")}${runTests ? ` and passed ${testCommand.join(\" \")}` : \"\"}.${dedupeNote}${dependencyTraceSuffix}`,\n };\n });\n },\n});\n","/**\n * Supply chain trust & anti-poisoning verification gate\n *\n * Inspects package metadata before auto-upgrades to protect against:\n * 1. Freshly published releases (e.g. account hijacking window < 48-72h)\n * 2. Malicious install scripts (preinstall/postinstall execution)\n * 3. Unattested builds when provenance is required\n */\nimport { httpClient } from \"./http-client.js\";\nimport type { SupplyChainPolicy } from \"./types.js\";\n\nexport interface PackageTrustVerdict {\n trusted: boolean;\n reason?: string;\n publishAgeHours?: number;\n hasInstallScripts?: boolean;\n hasProvenance?: boolean;\n}\n\ninterface NpmPackumentVersion {\n name: string;\n version: string;\n scripts?: Record<string, string>;\n dist?: {\n attestations?: {\n url?: string;\n provenance?: { predicateType?: string };\n };\n tarball?: string;\n integrity?: string;\n };\n _hasShrinkwrap?: boolean;\n}\n\ninterface NpmPackument {\n name: string;\n time?: Record<string, string>;\n versions?: Record<string, NpmPackumentVersion>;\n}\n\nexport async function verifyPackageTrust(\n packageName: string,\n targetVersion: string,\n policy?: SupplyChainPolicy,\n): Promise<PackageTrustVerdict> {\n if (\n !policy ||\n (!policy.minPublishAgeHours && !policy.blockInstallScripts && !policy.requireProvenance)\n ) {\n return { trusted: true };\n }\n\n const url = `https://registry.npmjs.org/${encodeURIComponent(packageName)}`;\n\n let packument: NpmPackument | null = null;\n try {\n const res = await httpClient({\n url,\n headers: { Accept: \"application/vnd.npm.install-v1+json; q=1.0, application/json; q=0.8\" },\n });\n if (res.ok && res.data) {\n packument = res.data as NpmPackument;\n }\n } catch (err) {\n // If registry is unreachable, fail closed only if strict policy\n const msg = err instanceof Error ? err.message : String(err);\n return {\n trusted: false,\n reason: `Could not verify supply-chain trust for \"${packageName}@${targetVersion}\": ${msg}`,\n };\n }\n\n if (!packument) {\n return {\n trusted: false,\n reason: `Package packument for \"${packageName}\" not found on registry.`,\n };\n }\n\n // 1. Check publish age\n let publishAgeHours: number | undefined;\n if (packument.time?.[targetVersion]) {\n const publishedAt = new Date(packument.time[targetVersion]).getTime();\n publishAgeHours = Math.max(0, (Date.now() - publishedAt) / (1000 * 60 * 60));\n\n if (policy.minPublishAgeHours && publishAgeHours < policy.minPublishAgeHours) {\n return {\n trusted: false,\n publishAgeHours,\n reason: `Target release \"${packageName}@${targetVersion}\" was published only ${publishAgeHours.toFixed(1)}h ago (minimum required age is ${policy.minPublishAgeHours}h).`,\n };\n }\n }\n\n const versionData = packument.versions?.[targetVersion];\n\n // 2. Check install lifecycle scripts\n const scripts = versionData?.scripts ?? {};\n const installScriptKeys = [\"preinstall\", \"install\", \"postinstall\"].filter((k) =>\n Boolean(scripts[k]),\n );\n const hasInstallScripts = installScriptKeys.length > 0;\n\n if (policy.blockInstallScripts && hasInstallScripts) {\n return {\n trusted: false,\n publishAgeHours,\n hasInstallScripts: true,\n reason: `Target release \"${packageName}@${targetVersion}\" defines risky lifecycle scripts (${installScriptKeys.join(\", \")}).`,\n };\n }\n\n // 3. Check provenance attestation\n const hasProvenance = Boolean(\n versionData?.dist?.attestations?.provenance || versionData?.dist?.attestations?.url,\n );\n if (policy.requireProvenance && !hasProvenance) {\n return {\n trusted: false,\n publishAgeHours,\n hasInstallScripts,\n hasProvenance: false,\n reason: `Target release \"${packageName}@${targetVersion}\" does not have cryptographic build provenance attestations.`,\n };\n }\n\n return {\n trusted: true,\n publishAgeHours,\n hasInstallScripts,\n hasProvenance,\n };\n}\n","import { resolveSafeUpgradeVersion } from \"../../intelligence/sources/registry.js\";\nimport { applyVersionBumpTool } from \"../tools/apply-version-bump.js\";\nimport { applyPackageOverrideTool } from \"../tools/apply-package-override/index.js\";\nimport { verifyPackageTrust } from \"../../platform/supply-chain.js\";\nimport type {\n PackageManager,\n PatchResult,\n RemediationConstraints,\n VulnerablePackage,\n} from \"../../platform/types.js\";\n\nexport async function resolvePrimaryResult(params: {\n vulnerable: VulnerablePackage;\n cwd: string;\n packageManager: PackageManager;\n dryRun: boolean;\n policy: string;\n runTests: boolean;\n constraints: RemediationConstraints;\n proofOfFix?: boolean | string;\n requireProofOfFix?: boolean;\n reproductionTest?: string;\n patchesDir?: string;\n}): Promise<{ result: PatchResult; steps: number }> {\n const {\n vulnerable,\n cwd,\n packageManager,\n dryRun,\n policy,\n runTests,\n constraints,\n proofOfFix,\n requireProofOfFix = constraints.requireProofOfFix,\n reproductionTest,\n patchesDir,\n } = params;\n const pkg = vulnerable.installed;\n const firstPatchedVersion = vulnerable.affected.firstPatchedVersion;\n\n if (pkg.type === \"transitive\") {\n if (constraints.directDependenciesOnly) {\n return {\n steps: 0,\n result: {\n packageName: pkg.name,\n strategy: \"none\",\n fromVersion: pkg.version,\n applied: false,\n dryRun,\n unresolvedReason: \"constraint-blocked\",\n message: `Constraint blocked remediation for transitive dependency \"${pkg.name}\".`,\n },\n };\n }\n\n if (constraints.preferVersionBump) {\n return {\n steps: 0,\n result: {\n packageName: pkg.name,\n strategy: \"none\",\n fromVersion: pkg.version,\n applied: false,\n dryRun,\n unresolvedReason: \"constraint-blocked\",\n message: `Constraint prefers version-bump and rejected override remediation for \"${pkg.name}\".`,\n },\n };\n }\n\n if (!firstPatchedVersion) {\n return {\n steps: 0,\n result: {\n packageName: pkg.name,\n strategy: \"none\",\n fromVersion: pkg.version,\n applied: false,\n dryRun,\n unresolvedReason: \"no-safe-version\",\n vulnerableRange: vulnerable.affected.vulnerableRange,\n message: `No firstPatchedVersion available for ${pkg.name}; cannot resolve deterministic override in local mode.`,\n },\n };\n }\n\n const safeUpgrade = await resolveSafeUpgradeVersion(\n pkg.name,\n pkg.version,\n firstPatchedVersion,\n vulnerable.affected.vulnerableRange,\n );\n\n if (!safeUpgrade.safeVersion) {\n return {\n steps: 1,\n result: {\n packageName: pkg.name,\n strategy: \"none\",\n fromVersion: pkg.version,\n applied: false,\n dryRun,\n unresolvedReason: \"no-safe-version\",\n vulnerableRange: vulnerable.affected.vulnerableRange,\n message: `No safe override version found for ${pkg.name}.`,\n },\n };\n }\n\n const trust = await verifyPackageTrust(\n pkg.name,\n safeUpgrade.safeVersion,\n constraints.supplyChainPolicy,\n );\n if (!trust.trusted) {\n return {\n steps: 1,\n result: {\n packageName: pkg.name,\n strategy: \"none\",\n fromVersion: pkg.version,\n applied: false,\n dryRun,\n unresolvedReason: \"policy-blocked\",\n vulnerableRange: vulnerable.affected.vulnerableRange,\n message: `Supply chain trust gate blocked \"${pkg.name}@${safeUpgrade.safeVersion}\": ${trust.reason}`,\n },\n };\n }\n\n const overrideResult = await applyPackageOverrideTool.execute({\n cwd,\n packageManager,\n packageName: pkg.name,\n fromVersion: pkg.version,\n toVersion: safeUpgrade.safeVersion,\n dryRun,\n policy,\n runTests,\n installMode: constraints.installMode,\n installPreferOffline: constraints.installPreferOffline,\n enforceFrozenLockfile: constraints.enforceFrozenLockfile,\n workspace: constraints.workspace,\n proofOfFix,\n requireProofOfFix,\n reproductionTest,\n patchesDir,\n });\n\n return {\n steps: 2,\n result: { ...overrideResult, vulnerableRange: vulnerable.affected.vulnerableRange },\n };\n }\n\n if (!firstPatchedVersion) {\n return {\n steps: 0,\n result: {\n packageName: pkg.name,\n strategy: \"none\",\n fromVersion: pkg.version,\n applied: false,\n dryRun,\n unresolvedReason: \"no-safe-version\",\n vulnerableRange: vulnerable.affected.vulnerableRange,\n message: `No firstPatchedVersion available for ${pkg.name}; cannot resolve deterministic upgrade in local mode.`,\n },\n };\n }\n\n const safeUpgrade = await resolveSafeUpgradeVersion(\n pkg.name,\n pkg.version,\n firstPatchedVersion,\n vulnerable.affected.vulnerableRange,\n );\n\n if (!safeUpgrade.safeVersion) {\n return {\n steps: 1,\n result: {\n packageName: pkg.name,\n strategy: \"none\",\n fromVersion: pkg.version,\n applied: false,\n dryRun,\n unresolvedReason: \"no-safe-version\",\n vulnerableRange: vulnerable.affected.vulnerableRange,\n message: `No safe upgrade version found for ${pkg.name}.`,\n },\n };\n }\n\n const trust = await verifyPackageTrust(\n pkg.name,\n safeUpgrade.safeVersion,\n constraints.supplyChainPolicy,\n );\n if (!trust.trusted) {\n return {\n steps: 1,\n result: {\n packageName: pkg.name,\n strategy: \"none\",\n fromVersion: pkg.version,\n applied: false,\n dryRun,\n unresolvedReason: \"policy-blocked\",\n vulnerableRange: vulnerable.affected.vulnerableRange,\n message: `Supply chain trust gate blocked \"${pkg.name}@${safeUpgrade.safeVersion}\": ${trust.reason}`,\n },\n };\n }\n\n const applyResult = await applyVersionBumpTool.execute({\n cwd,\n packageManager,\n packageName: pkg.name,\n fromVersion: pkg.version,\n toVersion: safeUpgrade.safeVersion,\n dryRun,\n policy,\n runTests,\n typecheck: constraints.typecheck,\n installMode: constraints.installMode,\n installPreferOffline: constraints.installPreferOffline,\n enforceFrozenLockfile: constraints.enforceFrozenLockfile,\n workspace: constraints.workspace,\n breakingChangeRefactor: constraints.enableBreakingChangeRefactor,\n proofOfFix,\n requireProofOfFix,\n reproductionTest,\n patchesDir,\n });\n\n return {\n steps: 2,\n result: { ...applyResult, vulnerableRange: vulnerable.affected.vulnerableRange },\n };\n}\n","/**\n * Tool: fetch-package-source\n *\n * Downloads a package tarball from npm registry and extracts source files for CVE analysis.\n * Uses curl with -f -s -S -L to download and execa to extract tar archives.\n */\nimport { defineTool } from \"./tool-compat.js\";\nimport { z } from \"zod\";\nimport { mkdir, mkdtemp, readdir, readFile, rm } from \"node:fs/promises\";\nimport { join } from \"node:path\";\nimport { tmpdir } from \"node:os\";\nimport { execa } from \"execa\";\n\n/**\n * Interface for the tool's return value.\n */\ninterface FetchPackageSourceResult {\n success: boolean;\n sourceFiles?: Record<string, string>;\n packageDir?: string;\n error?: string;\n}\n\nexport const fetchPackageSourceTool = defineTool({\n description:\n \"Download package tarball from npm and extract source files for CVE analysis. Supports custom file patterns (default: *.js, *.ts).\",\n parameters: z.object({\n packageName: z\n .string()\n .min(1)\n .describe(\"The npm package name (e.g., 'lodash', '@scope/package')\"),\n version: z\n .string()\n .regex(/^\\d+\\.\\d+\\.\\d+/, \"Must be a valid semver version\")\n .describe(\"Exact package version to download\"),\n filePatterns: z\n .array(z.string())\n .optional()\n .default([\"*.js\", \"*.ts\"])\n .describe(\"File patterns to extract (glob patterns, default: *.js, *.ts)\"),\n }),\n execute: async ({ packageName, version, filePatterns }): Promise<FetchPackageSourceResult> => {\n // Validate package name against npm spec before using in URL\n if (!/^(@[a-z0-9][a-z0-9._-]*\\/)?[a-z0-9][a-z0-9._-]*$/i.test(packageName)) {\n return { success: false, error: `Invalid package name: ${packageName}` };\n }\n\n // Validate file patterns to prevent ReDoS\n const safePatterns = (filePatterns ?? [\"*.js\", \"*.ts\"]).filter((p) =>\n /^[a-zA-Z0-9._/*?-]+$/.test(p),\n );\n if (safePatterns.length === 0) {\n return { success: false, error: \"No valid file patterns provided.\" };\n }\n\n const tempBaseDir = await mkdtemp(join(tmpdir(), \"autoremediator-pkg-\"));\n const extractDir = join(tempBaseDir, \"out\");\n\n try {\n // Step 1: Construct npm registry URL and download tarball\n const scopedName = packageName.split(\"/\").pop()!;\n const npmUrl = `https://registry.npmjs.org/${packageName}/-/${scopedName}-${version}.tgz`;\n\n // Create temp directory\n await mkdir(tempBaseDir, { recursive: true });\n\n // Download tarball using curl with fail-on-error flag (-f -s -S -L)\n const tarballPath = join(tempBaseDir, \"package.tgz\");\n await execa(\"curl\", [\"-f\", \"-s\", \"-S\", \"-L\", \"-o\", tarballPath, npmUrl]);\n\n // Step 2: Extract tar.gz\n await mkdir(extractDir, { recursive: true });\n await execa(\"tar\", [\"-xzf\", tarballPath, \"-C\", extractDir]);\n\n // Step 3: Discover package root (tar extracts to 'package/' subdirectory)\n const extractedContents = await readdir(extractDir);\n const packageRootDir = extractedContents.includes(\"package\")\n ? join(extractDir, \"package\")\n : extractDir;\n\n // Step 4: Recursively find and read matching source files\n const sourceCode: Record<string, string> = {};\n\n async function walkDir(dir: string, relativeBase: string): Promise<void> {\n try {\n const files = await readdir(dir, { withFileTypes: true });\n\n for (const file of files) {\n const fullPath = join(dir, file.name);\n const relPath = join(relativeBase, file.name);\n\n if (file.isDirectory()) {\n // Skip non-source directories (retain dist, build, and out for published packages)\n if (![\"node_modules\", \".git\", \"coverage\", \".next\"].includes(file.name)) {\n await walkDir(fullPath, relPath);\n }\n } else if (file.isFile()) {\n // Check if file matches any pattern (escape dots before expanding wildcards)\n const matches = safePatterns.some((pattern) => {\n const escaped = pattern.replace(/\\./g, \"\\\\.\").replace(/\\*/g, \".*\");\n const regex = new RegExp(`^${escaped}$`);\n return regex.test(file.name);\n });\n\n if (matches) {\n try {\n const content = await readFile(fullPath, \"utf8\");\n sourceCode[relPath] = content;\n } catch {\n // Skip files that can't be read as UTF-8\n }\n }\n }\n }\n } catch {\n // Skip directories that can't be read\n }\n }\n\n await walkDir(packageRootDir, \"\");\n\n if (Object.keys(sourceCode).length === 0) {\n return {\n success: false,\n error: `No source files matching patterns [${safePatterns.join(\", \")}] found in ${packageName}@${version}. Download succeeded but extraction yielded no matching files.`,\n };\n }\n\n return {\n success: true,\n sourceFiles: sourceCode,\n packageDir: packageRootDir,\n };\n } catch (err) {\n const message = err instanceof Error ? err.message : String(err);\n const exitCode =\n typeof (err as { exitCode?: number }).exitCode === \"number\"\n ? (err as { exitCode?: number }).exitCode\n : undefined;\n\n // Check if it's a 404 from npm registry (curl exit code 22 with -f or error 404)\n if (\n exitCode === 22 ||\n message.includes(\"404\") ||\n message.includes(\"not found\") ||\n message.includes(\"returned error: 404\")\n ) {\n return {\n success: false,\n error: `Package ${packageName}@${version} not found on npm registry. It may not exist or the version may be incorrect.`,\n };\n }\n\n return {\n success: false,\n error: `Failed to fetch and extract package ${packageName}@${version}: ${message}`,\n };\n } finally {\n await rm(tempBaseDir, { recursive: true, force: true });\n }\n },\n});\n","/**\n * Tool: generate-patch\n *\n * Calls the LLM to analyze vulnerable source code and generate a unified diff patch.\n * Parses LLM response and validates patch format.\n */\nimport { defineTool } from \"../tool-compat.js\";\nimport { z } from \"zod\";\nimport { generateText } from \"ai\";\nimport {\n createModel,\n estimateModelCostUsd,\n getPatchConfidenceThreshold,\n resolveProvider,\n} from \"../../../platform/config.js\";\nimport { buildPatchPrompt } from \"../../strategies/patch-synthesis-prompt.js\";\nimport {\n buildGeneratedPatches,\n isValidLlmAnalysis,\n parseLlmAnalysisResponse,\n validatePatchedCodeSyntax,\n type GeneratedPatch,\n} from \"./helpers.js\";\n\n/**\n * Result from the patch generation tool.\n */\ninterface GeneratePatchResult {\n success: boolean;\n patches?: GeneratedPatch[];\n patchContent?: string;\n reproductionTest?: string;\n llmProvider: \"remote\" | \"local\";\n llmModel: string;\n latencyMs?: number;\n estimatedCostUsd?: number;\n confidence: number;\n riskLevel: \"low\" | \"medium\" | \"high\";\n confidenceThreshold?: number;\n error?: string;\n}\n\nexport const generatePatchTool = defineTool({\n description:\n \"Generate a unified diff patch for a CVE using LLM analysis of vulnerable source code.\",\n parameters: z.object({\n packageName: z.string().min(1).describe(\"The npm package name\"),\n vulnerableVersion: z.string().describe(\"The vulnerable version string\"),\n cveId: z\n .string()\n .regex(/^CVE-\\d{4}-\\d+$/i)\n .describe(\"CVE ID (e.g., CVE-2021-23337)\"),\n cveSummary: z.string().min(10).describe(\"CVE description and impact\"),\n sourceFiles: z\n .record(z.string(), z.string())\n .describe(\"Map of file paths to source code contents from fetch-package-source\"),\n vulnerabilityCategory: z\n .enum([\"redos\", \"code-injection\", \"path-traversal\", \"unknown\"])\n .optional()\n .default(\"unknown\")\n .describe(\"Category of the vulnerability for better context\"),\n dryRun: z\n .boolean()\n .optional()\n .default(false)\n .describe(\"If true, return analysis without generating patches\"),\n llmProvider: z\n .enum([\"remote\", \"local\"])\n .optional()\n .describe(\"Optional provider override for patch generation\"),\n model: z.string().optional().describe(\"Optional model override for patch generation\"),\n policy: z\n .string()\n .optional()\n .describe(\"Optional policy file path for model default resolution\"),\n cwd: z.string().optional().describe(\"Optional working directory for policy/model resolution\"),\n providerSafetyProfile: z\n .enum([\"strict\", \"relaxed\"])\n .optional()\n .describe(\"Confidence threshold profile for patch acceptance\"),\n patchConfidenceThresholds: z\n .object({\n low: z.number().min(0).max(1).optional(),\n medium: z.number().min(0).max(1).optional(),\n high: z.number().min(0).max(1).optional(),\n })\n .optional()\n .describe(\"Optional per-risk confidence thresholds for patch acceptance\"),\n dynamicModelRouting: z\n .boolean()\n .optional()\n .describe(\"Enable dynamic model routing by input size\"),\n dynamicRoutingThresholdChars: z\n .number()\n .int()\n .positive()\n .optional()\n .describe(\"Threshold for dynamic model routing\"),\n modelPersonality: z\n .enum([\"analytical\", \"pragmatic\", \"balanced\"])\n .optional()\n .describe(\"Prompt personality for patch-generation guidance\"),\n }),\n execute: async ({\n packageName,\n vulnerableVersion,\n cveId,\n cveSummary,\n sourceFiles,\n vulnerabilityCategory,\n dryRun,\n llmProvider,\n model,\n policy,\n cwd,\n providerSafetyProfile,\n patchConfidenceThresholds,\n dynamicModelRouting,\n dynamicRoutingThresholdChars,\n modelPersonality,\n }): Promise<GeneratePatchResult> => {\n try {\n const resolvedSourceFiles = sourceFiles;\n const effectiveOptions = {\n llmProvider,\n model,\n policy,\n cwd,\n providerSafetyProfile,\n dynamicModelRouting,\n dynamicRoutingThresholdChars,\n modelPersonality,\n };\n const provider = resolveProvider(effectiveOptions);\n if (Object.keys(resolvedSourceFiles).length === 0) {\n return {\n success: false,\n llmProvider: provider,\n llmModel: \"unknown\",\n confidence: 0,\n riskLevel: \"high\",\n error:\n \"No source files were provided. Call fetch-package-source first and pass sourceFiles.\",\n };\n }\n\n const inputChars = JSON.stringify(resolvedSourceFiles).length + cveSummary.length;\n const modelInstance = await createModel(effectiveOptions, { inputChars });\n const modelName =\n typeof modelInstance === \"string\"\n ? modelInstance\n : \"modelId\" in modelInstance && typeof modelInstance.modelId === \"string\"\n ? modelInstance.modelId\n : \"unknown-model\";\n\n const prompt = buildPatchPrompt({\n cveId,\n packageName,\n vulnerableVersion,\n vulnerabilityCategory,\n cveSummary,\n sourceFiles: resolvedSourceFiles,\n modelPersonality,\n });\n\n const started = Date.now();\n const { text } = await generateText({\n model: modelInstance,\n prompt,\n temperature: 0.3,\n });\n const latencyMs = Date.now() - started;\n\n const parsed = parseLlmAnalysisResponse(text);\n if (!parsed.ok) {\n return {\n success: false,\n llmProvider: provider,\n llmModel: modelName,\n confidence: 0,\n riskLevel: \"high\",\n latencyMs,\n error: `Failed to parse LLM response: ${parsed.error}`,\n };\n }\n const analysis = parsed.analysis;\n\n if (!isValidLlmAnalysis(analysis)) {\n return {\n success: false,\n llmProvider: provider,\n llmModel: modelName,\n confidence: 0,\n riskLevel: \"high\",\n latencyMs,\n error:\n \"LLM response missing required fields (analysis, fixedCode, confidence, riskLevel)\",\n };\n }\n\n const confidenceThreshold = getPatchConfidenceThreshold(\n provider,\n providerSafetyProfile ?? \"relaxed\",\n analysis.riskLevel,\n patchConfidenceThresholds,\n );\n const estimatedCostUsd = estimateModelCostUsd({\n provider,\n promptChars: prompt.length,\n completionChars: text.length,\n });\n\n if (dryRun) {\n return {\n success: true,\n llmProvider: provider,\n llmModel: modelName,\n latencyMs,\n estimatedCostUsd,\n confidenceThreshold,\n confidence: analysis.confidence,\n riskLevel: analysis.riskLevel,\n };\n }\n\n for (const [filePath, fixedCode] of Object.entries(analysis.fixedCode)) {\n const check = validatePatchedCodeSyntax(filePath, fixedCode);\n if (!check.valid) {\n return {\n success: false,\n llmProvider: provider,\n llmModel: modelName,\n latencyMs,\n estimatedCostUsd,\n confidenceThreshold,\n confidence: analysis.confidence,\n riskLevel: analysis.riskLevel,\n error: check.error ?? `Invalid syntax in patched code for ${filePath}`,\n };\n }\n }\n\n const patches = buildGeneratedPatches(resolvedSourceFiles, analysis.fixedCode);\n\n if (patches.length === 0) {\n return {\n success: false,\n llmProvider: provider,\n llmModel: modelName,\n latencyMs,\n estimatedCostUsd,\n confidenceThreshold,\n confidence: analysis.confidence,\n riskLevel: analysis.riskLevel,\n error: \"No valid patches could be generated from LLM response\",\n };\n }\n\n return {\n success: true,\n patches,\n patchContent: patches[0]?.unifiedDiff,\n reproductionTest: analysis.reproductionTest,\n llmProvider: provider,\n llmModel: modelName,\n latencyMs,\n estimatedCostUsd,\n confidenceThreshold,\n confidence: analysis.confidence,\n riskLevel: analysis.riskLevel,\n };\n } catch (err) {\n const message = err instanceof Error ? err.message : String(err);\n return {\n success: false,\n llmProvider: \"local\",\n llmModel: \"unknown\",\n confidence: 0,\n riskLevel: \"high\",\n error: `Patch generation failed: ${message}`,\n };\n }\n },\n});\n","export interface BuildPatchPromptParams {\n cveId: string;\n packageName: string;\n vulnerableVersion: string;\n vulnerabilityCategory: string;\n cveSummary: string;\n sourceFiles: Record<string, string>;\n modelPersonality: string | undefined;\n}\n\nconst VULNERABILITY_DESCRIPTIONS: Record<string, string> = {\n redos:\n \"Regular Expression Denial of Service (ReDoS): The vulnerability is caused by poorly constructed regular expressions that cause excessive backtracking when processing certain inputs. The fix should optimize the regex to avoid catastrophic backtracking or replace it with a safer alternative.\",\n \"code-injection\":\n \"Code Injection: The vulnerability allows injected code to be executed. The fix must properly sanitize/validate inputs and prevent dynamic code execution, or use safe alternatives like template literals with proper escaping.\",\n \"path-traversal\":\n \"Path Traversal: The vulnerability allows access to files outside intended directories through path traversal sequences (../, etc.). The fix must validate and normalize file paths, use path.resolve() and path.relative() checks.\",\n unknown:\n \"Unknown vulnerability type: Analyze the CVE summary carefully and implement the most appropriate fix for the security issue described.\",\n};\n\nexport function buildPatchPrompt(params: BuildPatchPromptParams): string {\n const {\n cveId,\n packageName,\n vulnerableVersion,\n vulnerabilityCategory,\n cveSummary,\n sourceFiles,\n modelPersonality,\n } = params;\n\n const sourceContext = Object.entries(sourceFiles)\n .map(([filePath, content]) => `\\n### File: ${filePath}\\n\\`\\`\\`typescript\\n${content}\\n\\`\\`\\``)\n .join(\"\\n\");\n\n const vulnerabilityContext =\n VULNERABILITY_DESCRIPTIONS[vulnerabilityCategory] || VULNERABILITY_DESCRIPTIONS.unknown;\n\n const personalityDirective =\n modelPersonality === \"analytical\"\n ? \"Provide concise analysis with explicit risk tradeoffs.\"\n : modelPersonality === \"pragmatic\"\n ? \"Prioritize minimal, safe changes with low operational risk.\"\n : \"Balance analytical explanation with practical remediation.\";\n\n return `You are a security expert tasked with analyzing a CVE vulnerability and generating a secure patch.\n\n## CVE Information\n- CVE ID: ${cveId}\n- Package: ${packageName}@${vulnerableVersion}\n- Category: ${vulnerabilityCategory}\n\n## Vulnerability Summary\n${cveSummary}\n\n## Vulnerability Type Context\n${vulnerabilityContext}\n\n## Model Behavior\n${personalityDirective}\n\n## Vulnerable Source Code\n${sourceContext}\n\n## Your Task\nAnalyze the source code to:\n1. Identify the exact code location causing the vulnerability\n2. Explain the root cause of the security issue\n3. Propose a secure fix that addresses the vulnerability\n4. Provide the complete fixed version of affected files\n5. Optionally provide a standalone Node.js reproduction/regression test script\n\n## Response Format\nRespond ONLY with valid JSON (no markdown, no extra text):\n{\n \"analysis\": \"Detailed explanation of the vulnerability root cause and why it's a security issue\",\n \"fixedCode\": {\n \"path/to/file.js\": \"Complete fixed source code for this file\",\n \"path/to/other.ts\": \"Complete fixed source code for this file\"\n },\n \"confidence\": 0.95,\n \"riskLevel\": \"medium\",\n \"reproductionTest\": \"// Node.js script asserting the patch resolves the exploit/regression\"\n}\n\nImportant:\n- confidence: number between 0 and 1 indicating how confident you are in the fix\n- riskLevel: \"low\", \"medium\", or \"high\" - assess the risk of the proposed fix breaking functionality\n- fixedCode: must contain the COMPLETE file contents (not just diffs), with the vulnerability addressed\n- Only include files that need modification`;\n}\n","import { parseSync } from \"oxc-parser\";\nimport YAML from \"yaml\";\n\n/**\n * Represents a single generated patch file.\n */\nexport interface GeneratedPatch {\n filePath: string;\n unifiedDiff: string;\n}\n\n/**\n * LLM analysis response schema.\n */\nexport interface LlmAnalysis {\n analysis: string;\n fixedCode: Record<string, string>;\n confidence: number;\n riskLevel: \"low\" | \"medium\" | \"high\";\n reproductionTest?: string;\n}\n\nexport function parseLlmAnalysisResponse(\n text: string,\n): { ok: true; analysis: LlmAnalysis } | { ok: false; error: string } {\n try {\n const jsonMatch = text.match(/\\{[\\s\\S]*\\}/);\n if (!jsonMatch) {\n return { ok: false, error: \"No JSON found in LLM response\" };\n }\n return { ok: true, analysis: JSON.parse(jsonMatch[0]) as LlmAnalysis };\n } catch (error) {\n const message = error instanceof Error ? error.message : \"unknown error\";\n return { ok: false, error: message };\n }\n}\n\nexport function isValidLlmAnalysis(analysis: LlmAnalysis): boolean {\n return Boolean(\n analysis.analysis &&\n analysis.fixedCode &&\n typeof analysis.confidence === \"number\" &&\n [\"low\", \"medium\", \"high\"].includes(analysis.riskLevel),\n );\n}\n\n/**\n * Validates that patched code across JS/TS, JSON, and YAML is syntactically sound.\n */\nexport function validatePatchedCodeSyntax(\n filePath: string,\n code: string,\n): { valid: boolean; error?: string } {\n const lowerPath = filePath.toLowerCase();\n\n // 1. JavaScript / TypeScript AST Validation\n if (/\\.[cm]?[jt]sx?$/i.test(lowerPath)) {\n try {\n const res = parseSync(filePath, code);\n if (res.errors && res.errors.length > 0) {\n const errorMsg = res.errors.map((e) => e.message).join(\"; \");\n return {\n valid: false,\n error: `Syntax error in generated patch for ${filePath}: ${errorMsg}`,\n };\n }\n return { valid: true };\n } catch (err) {\n const msg = err instanceof Error ? err.message : String(err);\n return { valid: false, error: `AST validation failed for ${filePath}: ${msg}` };\n }\n }\n\n // 2. JSON Validation\n if (lowerPath.endsWith(\".json\")) {\n try {\n JSON.parse(code);\n return { valid: true };\n } catch (err) {\n const msg = err instanceof Error ? err.message : String(err);\n return { valid: false, error: `JSON parse error in generated patch for ${filePath}: ${msg}` };\n }\n }\n\n // 3. YAML Validation\n if (lowerPath.endsWith(\".yml\") || lowerPath.endsWith(\".yaml\")) {\n try {\n YAML.parse(code);\n return { valid: true };\n } catch (err) {\n const msg = err instanceof Error ? err.message : String(err);\n return { valid: false, error: `YAML parse error in generated patch for ${filePath}: ${msg}` };\n }\n }\n\n return { valid: true };\n}\n\nexport function buildGeneratedPatches(\n sourceFiles: Record<string, string>,\n fixedCodeByFile: Record<string, string>,\n): GeneratedPatch[] {\n const patches: GeneratedPatch[] = [];\n\n for (const [filePath, fixedCode] of Object.entries(fixedCodeByFile)) {\n const sourceFile = sourceFiles[filePath];\n if (!sourceFile) {\n continue;\n }\n\n const syntaxCheck = validatePatchedCodeSyntax(filePath, fixedCode);\n if (!syntaxCheck.valid) {\n continue;\n }\n\n const unifiedDiff = generateUnifiedDiff(sourceFile, fixedCode, filePath);\n if (unifiedDiff) {\n patches.push({ filePath, unifiedDiff });\n }\n }\n\n return patches;\n}\n\ninterface DiffEdit {\n type: \"common\" | \"insert\" | \"delete\";\n text: string;\n}\n\nfunction splitLines(text: string): string[] {\n if (text.length === 0) return [];\n const lines = text.split(/\\r?\\n/);\n if (lines.length > 0 && lines[lines.length - 1] === \"\") {\n lines.pop();\n }\n return lines;\n}\n\nfunction myersDiff(aLines: string[], bLines: string[]): DiffEdit[] {\n const N = aLines.length;\n const M = bLines.length;\n const max = N + M;\n if (max === 0) return [];\n\n const offset = max;\n const v = new Int32Array(2 * max + 1);\n const history: Int32Array[] = [];\n\n v[offset + 1] = 0;\n\n let dFound = -1;\n for (let d = 0; d <= max; d++) {\n const vCopy = new Int32Array(v);\n history.push(vCopy);\n\n for (let k = -d; k <= d; k += 2) {\n let x: number;\n if (k === -d || (k !== d && v[offset + k - 1] < v[offset + k + 1])) {\n x = v[offset + k + 1]!;\n } else {\n x = v[offset + k - 1]! + 1;\n }\n let y = x - k;\n\n while (x < N && y < M && aLines[x] === bLines[y]) {\n x++;\n y++;\n }\n\n v[offset + k] = x;\n\n if (x >= N && y >= M) {\n dFound = d;\n break;\n }\n }\n if (dFound !== -1) break;\n }\n\n let x = N;\n let y = M;\n const edits: DiffEdit[] = [];\n\n for (let d = dFound; d > 0; d--) {\n const k = x - y;\n const vPrev = history[d]!;\n let prevK: number;\n if (k === -d || (k !== d && vPrev[offset + k - 1]! < vPrev[offset + k + 1]!)) {\n prevK = k + 1;\n } else {\n prevK = k - 1;\n }\n\n const prevX = vPrev[offset + prevK]!;\n const prevY = prevX - prevK;\n\n while (x > prevX && y > prevY) {\n edits.push({ type: \"common\", text: aLines[x - 1]! });\n x--;\n y--;\n }\n\n if (x === prevX) {\n edits.push({ type: \"insert\", text: bLines[y - 1]! });\n y--;\n } else {\n edits.push({ type: \"delete\", text: aLines[x - 1]! });\n x--;\n }\n }\n\n while (x > 0 && y > 0) {\n edits.push({ type: \"common\", text: aLines[x - 1]! });\n x--;\n y--;\n }\n\n edits.reverse();\n return edits;\n}\n\n/**\n * Generate a standard Myers unified diff between two strings.\n * Returns unified diff format or null if there are no differences.\n */\nexport function generateUnifiedDiff(\n original: string,\n fixed: string,\n filePath: string,\n context: number = 3,\n): string | null {\n if (original === fixed) {\n return null;\n }\n\n const aLines = splitLines(original);\n const bLines = splitLines(fixed);\n\n // Fast-path: trim common prefix and suffix for performance\n let prefixCount = 0;\n while (\n prefixCount < aLines.length &&\n prefixCount < bLines.length &&\n aLines[prefixCount] === bLines[prefixCount]\n ) {\n prefixCount++;\n }\n\n let suffixCount = 0;\n while (\n suffixCount < aLines.length - prefixCount &&\n suffixCount < bLines.length - prefixCount &&\n aLines[aLines.length - 1 - suffixCount] === bLines[bLines.length - 1 - suffixCount]\n ) {\n suffixCount++;\n }\n\n const prefixEdits: DiffEdit[] = [];\n for (let i = 0; i < prefixCount; i++) {\n prefixEdits.push({ type: \"common\", text: aLines[i]! });\n }\n\n const suffixEdits: DiffEdit[] = [];\n for (let i = aLines.length - suffixCount; i < aLines.length; i++) {\n suffixEdits.push({ type: \"common\", text: aLines[i]! });\n }\n\n const aMiddle = aLines.slice(prefixCount, aLines.length - suffixCount);\n const bMiddle = bLines.slice(prefixCount, bLines.length - suffixCount);\n\n const middleEdits = myersDiff(aMiddle, bMiddle);\n const edits = [...prefixEdits, ...middleEdits, ...suffixEdits];\n\n // Find edit indices\n const changeIndices: number[] = [];\n for (let i = 0; i < edits.length; i++) {\n if (edits[i]!.type !== \"common\") {\n changeIndices.push(i);\n }\n }\n\n if (changeIndices.length === 0) {\n return null;\n }\n\n // Group into hunks separated by > 2 * context unchanged lines\n const groups: number[][] = [];\n let currentGroup: number[] = [changeIndices[0]!];\n\n for (let i = 1; i < changeIndices.length; i++) {\n const prev = changeIndices[i - 1]!;\n const curr = changeIndices[i]!;\n if (curr - prev - 1 <= 2 * context) {\n currentGroup.push(curr);\n } else {\n groups.push(currentGroup);\n currentGroup = [curr];\n }\n }\n groups.push(currentGroup);\n\n const hunkStrings: string[] = [];\n\n for (const group of groups) {\n const firstChange = group[0]!;\n const lastChange = group[group.length - 1]!;\n\n const startIndex = Math.max(0, firstChange - context);\n const endIndex = Math.min(edits.length, lastChange + context + 1);\n const hunkEdits = edits.slice(startIndex, endIndex);\n\n // Track original and fixed 1-based start line\n let curOrig = 1;\n let curFixed = 1;\n for (let i = 0; i < startIndex; i++) {\n if (edits[i]!.type === \"common\") {\n curOrig++;\n curFixed++;\n } else if (edits[i]!.type === \"delete\") {\n curOrig++;\n } else if (edits[i]!.type === \"insert\") {\n curFixed++;\n }\n }\n\n let origStart = curOrig;\n let fixedStart = curFixed;\n let origCount = 0;\n let fixedCount = 0;\n\n for (const edit of hunkEdits) {\n if (edit.type === \"common\") {\n origCount++;\n fixedCount++;\n } else if (edit.type === \"delete\") {\n origCount++;\n } else if (edit.type === \"insert\") {\n fixedCount++;\n }\n }\n\n if (origCount === 0) origStart = Math.max(0, origStart - 1);\n if (fixedCount === 0) fixedStart = Math.max(0, fixedStart - 1);\n\n const lines: string[] = [];\n lines.push(`@@ -${origStart},${origCount} +${fixedStart},${fixedCount} @@`);\n\n for (const edit of hunkEdits) {\n if (edit.type === \"common\") {\n lines.push(` ${edit.text}`);\n } else if (edit.type === \"delete\") {\n lines.push(`-${edit.text}`);\n } else if (edit.type === \"insert\") {\n lines.push(`+${edit.text}`);\n }\n }\n\n hunkStrings.push(lines.join(\"\\n\"));\n }\n\n return [`--- a/${filePath}`, `+++ b/${filePath}`, ...hunkStrings].join(\"\\n\") + \"\\n\";\n}\n","/**\n * Tool: apply-patch-file\n *\n * Writes generated patch files to disk and applies them using package-manager-aware\n * patch mechanisms (native pnpm/yarn when available, patch-package compatibility otherwise).\n * Optionally validates patches by running tests.\n */\nimport { defineTool } from \"../tool-compat.js\";\nimport { z } from \"zod\";\nimport { mkdir, writeFile } from \"node:fs/promises\";\nimport { join } from \"node:path\";\nimport { execa } from \"execa\";\nimport {\n detectPackageManager,\n getYarnMajorVersion,\n resolveInstallCommand,\n resolveTestCommand,\n type PackageManager,\n} from \"../../../platform/package-manager/index.js\";\nimport { withRepoLock } from \"../../../platform/repo-lock.js\";\nimport { isPackageAllowed, loadPolicy } from \"../../../platform/policy.js\";\nimport { recordFileTouch } from \"../../../platform/rollback.js\";\nimport { validatePatchDiff } from \"../../strategies/patch-utils.js\";\nimport type {\n PatchArtifact,\n PatchMode,\n PatchValidationPhase,\n ProofOfFixPhaseResult,\n ProofOfFixVerification,\n UnresolvedReason,\n} from \"../../../platform/types.js\";\nimport {\n assembleProofOfFixVerification,\n prepareReproductionTestFile,\n runProofOfFixPhase,\n} from \"../../proof-of-fix/runner.js\";\nimport {\n applyNativePatch,\n buildPatchFileName,\n capturePackageJsonSnapshot,\n cleanupPatchArtifacts,\n computePatchIntegrity,\n configurePatchPackagePostinstall,\n countPatchHunks,\n extractPatchedFiles,\n patchModeRequiresPackageJsonSnapshot,\n resolvePatchMode,\n validatePatchWithTests,\n writePatchManifest,\n type ValidationResult,\n} from \"./helpers.js\";\n\ninterface ApplyPatchFileResult {\n success: boolean;\n packageName: string;\n vulnerableVersion: string;\n applied: boolean;\n dryRun: boolean;\n message: string;\n patchFilePath?: string;\n manifestFilePath?: string;\n patchPath?: string;\n patchMode?: PatchMode;\n postinstallConfigured?: boolean;\n patchArtifact?: PatchArtifact;\n validation?: ValidationResult;\n validationPhases?: PatchValidationPhase[];\n proofOfFix?: ProofOfFixVerification;\n unresolvedReason?: UnresolvedReason;\n error?: string;\n}\n\nexport const applyPatchFileTool = defineTool({\n description:\n \"Write generated patch file and apply it using package-manager-native patch flow when available, falling back to patch-package when needed.\",\n parameters: z\n .object({\n packageName: z.string().min(1).describe(\"The npm package name\"),\n vulnerableVersion: z.string().describe(\"The vulnerable version string\"),\n patchContent: z\n .string()\n .min(10)\n .optional()\n .describe(\"Unified diff patch content from generate-patch\"),\n cveId: z.string().optional().describe(\"Optional CVE ID associated with this patch artifact\"),\n confidence: z\n .number()\n .min(0)\n .max(1)\n .optional()\n .describe(\"Optional patch confidence score from generate-patch\"),\n riskLevel: z\n .enum([\"low\", \"medium\", \"high\"])\n .optional()\n .describe(\"Optional risk level from generate-patch\"),\n patches: z\n .array(\n z.object({\n filePath: z.string().min(1),\n unifiedDiff: z.string().min(10),\n }),\n )\n .optional()\n .describe(\"Patch list from generate-patch; first patch is applied\"),\n patchesDir: z\n .string()\n .optional()\n .default(\"./patches\")\n .describe(\"Directory to store patch files\"),\n cwd: z.string().describe(\"Project root directory (for package.json)\"),\n packageManager: z\n .enum([\"npm\", \"pnpm\", \"yarn\", \"bun\", \"deno\"])\n .optional()\n .describe(\"Package manager used by the target project (auto-detected if omitted)\"),\n policy: z.string().optional().describe(\"Optional path to .autoremediator policy file\"),\n installMode: z.enum([\"standard\", \"prefer-offline\", \"deterministic\"]).optional(),\n installPreferOffline: z.boolean().optional(),\n enforceFrozenLockfile: z.boolean().optional(),\n workspace: z.string().optional(),\n validateWithTests: z\n .boolean()\n .optional()\n .default(true)\n .describe(\"Run package manager test command to validate patch doesn't break anything\"),\n reproductionTest: z\n .string()\n .optional()\n .describe(\"Optional synthesized reproduction test script verifying fix\"),\n proofOfFix: z\n .union([z.boolean(), z.string()])\n .optional()\n .describe(\n \"If true or script path/content, enforce dual-stage exploit reproduction (assert failure pre-patch, assert pass post-patch)\",\n ),\n requireProofOfFix: z\n .boolean()\n .optional()\n .describe(\"If true, fail and roll back patch if proof-of-fix verification fails\"),\n dryRun: z\n .boolean()\n .optional()\n .default(false)\n .describe(\"If true, report but do not mutate files\"),\n })\n .refine((value) => Boolean(value.patchContent || (value.patches && value.patches.length > 0)), {\n message: \"Either patchContent or patches must be provided\",\n }),\n execute: async ({\n packageName,\n vulnerableVersion,\n patchContent,\n cveId,\n confidence,\n patches,\n patchesDir,\n cwd,\n packageManager,\n policy,\n installMode,\n installPreferOffline,\n enforceFrozenLockfile,\n workspace,\n riskLevel,\n validateWithTests,\n reproductionTest,\n proofOfFix,\n requireProofOfFix,\n dryRun,\n }): Promise<ApplyPatchFileResult> => {\n try {\n const pm = (packageManager ?? detectPackageManager(cwd)) as PackageManager;\n const loadedPolicy = loadPolicy(cwd, policy);\n if (!isPackageAllowed(loadedPolicy, packageName)) {\n return {\n success: false,\n packageName,\n vulnerableVersion,\n applied: false,\n dryRun,\n unresolvedReason: \"policy-blocked\",\n message: `Policy denyPackages blocked changes for package \"${packageName}\".`,\n error: `Policy denyPackages blocked changes for package \"${packageName}\".`,\n };\n }\n const commandConstraints = {\n ...loadedPolicy.constraints,\n installMode: installMode ?? loadedPolicy.constraints?.installMode,\n installPreferOffline:\n installPreferOffline ?? loadedPolicy.constraints?.installPreferOffline,\n enforceFrozenLockfile:\n enforceFrozenLockfile ?? loadedPolicy.constraints?.enforceFrozenLockfile,\n workspace: workspace ?? loadedPolicy.constraints?.workspace,\n };\n const yarnMajor = pm === \"yarn\" ? await getYarnMajorVersion(cwd) : undefined;\n const installCommand = resolveInstallCommand(pm, commandConstraints, yarnMajor);\n const testCommand = resolveTestCommand(pm, commandConstraints);\n const selectedPatch = patchContent ?? patches?.[0]?.unifiedDiff;\n const patchFiles = extractPatchedFiles(selectedPatch ?? \"\");\n const hunkCount = countPatchHunks(selectedPatch ?? \"\");\n const validationPhases: PatchValidationPhase[] = [];\n\n if (!selectedPatch) {\n return {\n success: false,\n packageName,\n vulnerableVersion,\n applied: false,\n dryRun,\n message: \"No patch content provided.\",\n error: \"No patch content provided.\",\n };\n }\n\n const patchValidation = validatePatchDiff(selectedPatch);\n validationPhases.push({\n phase: \"diff-format\",\n passed: patchValidation.valid,\n error: patchValidation.valid ? undefined : patchValidation.error,\n message: patchValidation.valid ? \"Patch content is a valid unified diff.\" : undefined,\n });\n\n if (!patchValidation.valid) {\n return {\n success: false,\n packageName,\n vulnerableVersion,\n applied: false,\n dryRun,\n message: patchValidation.error ?? \"Patch content is not a valid unified diff.\",\n validationPhases,\n error: patchValidation.error ?? \"Patch content is not a valid unified diff.\",\n };\n }\n\n const patchFileName = buildPatchFileName(packageName, vulnerableVersion);\n const patchFilePath = join(cwd, patchesDir, patchFileName);\n const manifestFilePath = `${patchFilePath}.json`;\n const generatedAt = new Date().toISOString();\n const baseArtifact: PatchArtifact = {\n schemaVersion: \"1.0\",\n cveId,\n packageName,\n vulnerableVersion,\n patchFilePath,\n manifestFilePath,\n patchFileName,\n patchesDir,\n confidence,\n riskLevel,\n generatedAt,\n files: patchFiles,\n hunkCount,\n applied: false,\n dryRun,\n integrity: computePatchIntegrity(selectedPatch),\n validationPhases,\n };\n\n if (dryRun) {\n return {\n success: true,\n packageName,\n vulnerableVersion,\n applied: false,\n dryRun: true,\n message: `[DRY RUN] Would write and configure patch at ${patchFilePath}.`,\n patchFilePath,\n manifestFilePath,\n patchPath: patchFilePath,\n patchArtifact: baseArtifact,\n validationPhases,\n };\n }\n\n return withRepoLock(cwd, async () => {\n const packageJsonSnapshot = patchModeRequiresPackageJsonSnapshot(pm)\n ? await capturePackageJsonSnapshot(cwd)\n : undefined;\n\n const patchesDirPath = join(cwd, patchesDir);\n await mkdir(patchesDirPath, { recursive: true });\n\n recordFileTouch(patchFilePath);\n recordFileTouch(manifestFilePath);\n await writeFile(patchFilePath, selectedPatch, \"utf8\");\n validationPhases.push({\n phase: \"patch-write\",\n passed: true,\n message: `Patch file written to ${patchFilePath}.`,\n });\n\n let validationResult: ValidationResult | undefined;\n const patchMode = await resolvePatchMode(pm, cwd);\n const artifact: PatchArtifact = {\n ...baseArtifact,\n patchMode,\n validationPhases,\n };\n\n await writePatchManifest(manifestFilePath, artifact);\n validationPhases.push({\n phase: \"manifest-write\",\n passed: true,\n message: `Patch manifest written to ${manifestFilePath}.`,\n });\n artifact.validationPhases = validationPhases;\n await writePatchManifest(manifestFilePath, artifact);\n\n let reproductionTestPath: string | undefined;\n let negativePhaseResult: ProofOfFixPhaseResult | undefined;\n\n const preparedRepro = await prepareReproductionTestFile({\n cwd,\n packageName,\n vulnerableVersion,\n patchesDir: patchesDirPath,\n proofOfFix,\n reproductionTest,\n });\n reproductionTestPath = preparedRepro.testFilePath;\n\n const hasReproductionScript = Boolean(reproductionTestPath);\n const isProofOfFixActive = Boolean(\n hasReproductionScript || proofOfFix || requireProofOfFix,\n );\n\n if (isProofOfFixActive) {\n if (!reproductionTestPath) {\n if (requireProofOfFix) {\n await cleanupPatchArtifacts({\n cwd,\n patchFilePath,\n manifestFilePath,\n patchMode,\n packageJsonSnapshot,\n installCommand,\n rerunInstall: false,\n });\n return {\n success: false,\n packageName,\n vulnerableVersion,\n applied: false,\n dryRun: false,\n unresolvedReason: \"policy-blocked\",\n message:\n \"Proof-of-fix verification required, but no reproduction test or script was supplied.\",\n patchFilePath,\n manifestFilePath,\n patchPath: patchFilePath,\n patchMode,\n postinstallConfigured: false,\n patchArtifact: {\n ...artifact,\n applied: false,\n validationPhases,\n },\n validationPhases,\n error:\n \"Proof-of-fix verification required, but no reproduction test or script was supplied.\",\n };\n }\n } else {\n negativePhaseResult = await runProofOfFixPhase({\n stage: \"negative\",\n testFilePath: reproductionTestPath,\n cwd,\n });\n\n validationPhases.push({\n phase: \"proof-of-fix-negative\",\n passed: negativePhaseResult.passed,\n message: negativePhaseResult.passed\n ? \"Reproduction test reproduced vulnerability on unpatched code.\"\n : undefined,\n error: negativePhaseResult.passed ? undefined : negativePhaseResult.error,\n });\n\n if (!negativePhaseResult.passed) {\n await cleanupPatchArtifacts({\n cwd,\n patchFilePath,\n manifestFilePath,\n patchMode,\n packageJsonSnapshot,\n installCommand,\n rerunInstall: false,\n });\n return {\n success: false,\n packageName,\n vulnerableVersion,\n applied: false,\n dryRun: false,\n unresolvedReason: requireProofOfFix ? \"policy-blocked\" : \"proof-of-fix-failed\",\n message: `Proof-of-fix negative phase failed: ${negativePhaseResult.error}`,\n patchFilePath,\n manifestFilePath,\n patchPath: patchFilePath,\n patchMode,\n postinstallConfigured: false,\n patchArtifact: {\n ...artifact,\n applied: false,\n validationPhases,\n },\n validationPhases,\n error: `Proof-of-fix negative phase failed: ${negativePhaseResult.error}`,\n };\n }\n }\n }\n\n const applyResult =\n patchMode === \"patch-package\"\n ? await configurePatchPackagePostinstall(cwd, pm)\n : await applyNativePatch({\n cwd,\n packageName,\n vulnerableVersion,\n patchContent: selectedPatch,\n patchMode,\n validationPhases,\n });\n\n if (!applyResult.success) {\n await cleanupPatchArtifacts({\n cwd,\n patchFilePath,\n manifestFilePath,\n patchMode,\n packageJsonSnapshot,\n installCommand,\n rerunInstall: patchMode === \"patch-package\",\n });\n return {\n success: false,\n packageName,\n vulnerableVersion,\n applied: false,\n dryRun: false,\n message: applyResult.error,\n patchFilePath,\n manifestFilePath,\n patchPath: patchFilePath,\n patchMode,\n postinstallConfigured: patchMode === \"patch-package\" ? false : undefined,\n patchArtifact: {\n ...artifact,\n applied: false,\n validationPhases,\n },\n validationPhases,\n error: applyResult.error,\n };\n }\n\n validationPhases.push({\n phase: \"apply\",\n passed: true,\n message: `Patch applied using ${patchMode}.`,\n });\n\n if (patchMode === \"patch-package\") {\n try {\n const [installCmd, ...installArgs] = installCommand;\n await execa(installCmd, installArgs, {\n cwd,\n stdio: \"pipe\",\n });\n validationPhases.push({\n phase: \"install\",\n passed: true,\n message: `${installCommand.join(\" \")} completed successfully.`,\n });\n } catch (err) {\n await cleanupPatchArtifacts({\n cwd,\n patchFilePath,\n manifestFilePath,\n patchMode,\n packageJsonSnapshot,\n installCommand,\n rerunInstall: true,\n });\n const error = err instanceof Error ? err.message : String(err);\n validationPhases.push({\n phase: \"install\",\n passed: false,\n error,\n });\n return {\n success: false,\n packageName,\n vulnerableVersion,\n applied: false,\n dryRun: false,\n message: `Failed to apply patch-package workflow for ${packageName}@${vulnerableVersion}: ${error}`,\n patchFilePath,\n manifestFilePath,\n patchPath: patchFilePath,\n patchMode,\n postinstallConfigured: false,\n patchArtifact: {\n ...artifact,\n applied: false,\n validationPhases,\n },\n validationPhases,\n error: `Failed to apply patch-package workflow for ${packageName}@${vulnerableVersion}: ${error}`,\n };\n }\n }\n\n if (validateWithTests) {\n validationResult = await validatePatchWithTests(cwd, testCommand);\n if (!validationResult.passed) {\n await cleanupPatchArtifacts({\n cwd,\n patchFilePath,\n manifestFilePath,\n patchMode,\n packageJsonSnapshot,\n installCommand,\n rerunInstall: patchMode === \"patch-package\",\n });\n const validationError = \"Patch validation failed after apply; patch marked unresolved.\";\n validationPhases.push({\n phase: \"test\",\n passed: false,\n error: validationResult.error,\n });\n return {\n success: false,\n packageName,\n vulnerableVersion,\n applied: false,\n dryRun: false,\n message: validationError,\n patchFilePath,\n manifestFilePath,\n patchPath: patchFilePath,\n patchMode,\n postinstallConfigured: false,\n patchArtifact: {\n ...artifact,\n applied: false,\n validationPhases,\n },\n validation: validationResult,\n validationPhases,\n error: validationError,\n };\n }\n\n validationPhases.push({\n phase: \"test\",\n passed: true,\n message: \"Patch validation tests passed.\",\n });\n }\n\n let positivePhaseResult: ProofOfFixPhaseResult | undefined;\n if (reproductionTestPath && isProofOfFixActive) {\n positivePhaseResult = await runProofOfFixPhase({\n stage: \"positive\",\n testFilePath: reproductionTestPath,\n cwd,\n });\n\n validationPhases.push({\n phase: \"proof-of-fix-positive\",\n passed: positivePhaseResult.passed,\n message: positivePhaseResult.passed\n ? \"Reproduction test passed on patched code (vulnerability mitigated).\"\n : undefined,\n error: positivePhaseResult.passed ? undefined : positivePhaseResult.error,\n });\n\n if (!positivePhaseResult.passed) {\n await cleanupPatchArtifacts({\n cwd,\n patchFilePath,\n manifestFilePath,\n patchMode,\n packageJsonSnapshot,\n installCommand,\n rerunInstall: patchMode === \"patch-package\",\n });\n return {\n success: false,\n packageName,\n vulnerableVersion,\n applied: false,\n dryRun: false,\n unresolvedReason: requireProofOfFix ? \"policy-blocked\" : \"proof-of-fix-failed\",\n message: `Proof-of-fix positive phase failed: ${positivePhaseResult.error}`,\n patchFilePath,\n manifestFilePath,\n patchPath: patchFilePath,\n patchMode,\n postinstallConfigured: false,\n patchArtifact: {\n ...artifact,\n applied: false,\n validationPhases,\n },\n validationPhases,\n error: `Proof-of-fix positive phase failed: ${positivePhaseResult.error}`,\n };\n }\n }\n\n let proofOfFixVerification: ProofOfFixVerification | undefined;\n if (negativePhaseResult && positivePhaseResult) {\n proofOfFixVerification = assembleProofOfFixVerification({\n reproductionTestPath,\n negativePhase: negativePhaseResult,\n positivePhase: positivePhaseResult,\n regressionPhase: validationResult\n ? {\n executed: true,\n passed: validationResult.passed,\n error: validationResult.error,\n }\n : undefined,\n });\n }\n\n const finalArtifact: PatchArtifact = {\n ...artifact,\n applied: true,\n dryRun: false,\n reproductionTest,\n reproductionTestPath,\n validationPhases,\n proofOfFix: proofOfFixVerification,\n };\n await writePatchManifest(manifestFilePath, finalArtifact);\n\n return {\n success: true,\n packageName,\n vulnerableVersion,\n applied: true,\n dryRun: false,\n message: `Patch applied successfully for ${packageName}@${vulnerableVersion}.`,\n patchFilePath,\n manifestFilePath,\n patchPath: patchFilePath,\n patchMode,\n postinstallConfigured: patchMode === \"patch-package\",\n patchArtifact: finalArtifact,\n validation: validationResult,\n validationPhases,\n proofOfFix: proofOfFixVerification,\n };\n });\n } catch (err) {\n const message = err instanceof Error ? err.message : String(err);\n return {\n success: false,\n packageName,\n vulnerableVersion,\n applied: false,\n dryRun,\n message: `Failed to apply patch file: ${message}`,\n error: `Failed to apply patch file: ${message}`,\n };\n }\n },\n});\n","import { execFileSync, execSync } from \"node:child_process\";\nimport { existsSync, readdirSync, readFileSync, rmSync, statSync, writeFileSync } from \"node:fs\";\nimport { isAbsolute, join, relative } from \"node:path\";\nimport { safeExeca } from \"./safe-exec.js\";\n\nexport interface ProjectSnapshot {\n cwd: string;\n isGit: boolean;\n gitStatusBefore?: string[];\n fileSnapshots: Map<string, string | null>; // relative path -> content or null (if non-existent)\n}\n\nconst MANIFEST_PATTERNS = [\n /package\\.json$/,\n /.*lock.*/,\n /deno\\.jsonc?$/,\n /\\.patch$/,\n /\\.autoremediator\\.ya?ml$/,\n /tsconfig.*\\.json$/,\n];\n\nconst IGNORED_DIRS = new Set([\"node_modules\", \".git\", \"dist\", \"build\", \"coverage\", \".pnpm-store\"]);\n\n// Global registry of active rollback snapshots for dynamic file touch tracking\nconst activeSnapshots: Set<ProjectSnapshot> = new Set();\n\nexport function registerActiveSnapshot(snapshot: ProjectSnapshot): void {\n activeSnapshots.add(snapshot);\n}\n\nexport function unregisterActiveSnapshot(snapshot: ProjectSnapshot): void {\n activeSnapshots.delete(snapshot);\n}\n\n/**\n * Registers an arbitrary file that is about to be modified/created in any active rollback transactions.\n */\nexport function recordFileTouch(filePath: string): void {\n for (const snapshot of activeSnapshots) {\n const absPath = isAbsolute(filePath) ? filePath : join(snapshot.cwd, filePath);\n if (!absPath.startsWith(snapshot.cwd)) continue;\n\n const relPath = relative(snapshot.cwd, absPath);\n if (!snapshot.fileSnapshots.has(relPath)) {\n if (existsSync(absPath)) {\n try {\n snapshot.fileSnapshots.set(relPath, readFileSync(absPath, \"utf8\"));\n } catch {\n try {\n snapshot.fileSnapshots.set(relPath, readFileSync(absPath).toString(\"base64\"));\n } catch {\n snapshot.fileSnapshots.set(relPath, null);\n }\n }\n } else {\n snapshot.fileSnapshots.set(relPath, null);\n }\n }\n }\n}\n\n/**\n * Dynamically discovers manifest, lockfile, and patch configuration files across the project tree.\n */\nexport function discoverProjectFiles(dir: string, maxDepth = 4, currentDepth = 0): string[] {\n const discovered: string[] = [];\n if (currentDepth > maxDepth) return discovered;\n\n let entries: string[];\n try {\n entries = readdirSync(dir);\n } catch {\n return discovered;\n }\n\n for (const entry of entries) {\n if (IGNORED_DIRS.has(entry)) continue;\n const fullPath = join(dir, entry);\n let stat;\n try {\n stat = statSync(fullPath);\n } catch {\n continue;\n }\n\n if (stat.isDirectory()) {\n discovered.push(...discoverProjectFiles(fullPath, maxDepth, currentDepth + 1));\n } else if (stat.isFile()) {\n const matchesPattern = MANIFEST_PATTERNS.some((pattern) => pattern.test(entry));\n if (matchesPattern) {\n discovered.push(fullPath);\n }\n }\n }\n\n return discovered;\n}\n\nasync function isGitRepository(cwd: string): Promise<boolean> {\n try {\n const res = await safeExeca(\"git\", [\"rev-parse\", \"--is-inside-work-tree\"], {\n cwd,\n stdio: \"pipe\",\n });\n return String(res.stdout).trim() === \"true\";\n } catch {\n return false;\n }\n}\n\nexport function parsePorcelainLines(stdout: string): string[] {\n return stdout\n .split(/\\r?\\n/)\n .map((l) => l.replace(/\\r$/, \"\"))\n .filter((l) => l.length >= 3 && l.slice(0, 2).trim().length > 0);\n}\n\nexport function parseGitPorcelainLine(\n line: string,\n): { statusCode: string; filePath: string } | null {\n if (!line || line.length < 3) return null;\n const statusCode = line.slice(0, 2).trim();\n let filePath = line.slice(3).trim();\n if (filePath.includes(\" -> \")) {\n filePath = filePath.split(\" -> \").pop()!.trim();\n }\n if (filePath.startsWith('\"') && filePath.endsWith('\"')) {\n filePath = filePath.slice(1, -1).replace(/\\\\\"/g, '\"');\n }\n return { statusCode, filePath };\n}\n\nasync function getGitStatusPorcelain(cwd: string): Promise<string[]> {\n try {\n const res = await safeExeca(\"git\", [\"status\", \"--porcelain=v1\", \"-uall\"], {\n cwd,\n stdio: \"pipe\",\n });\n return parsePorcelainLines(String(res.stdout));\n } catch {\n return [];\n }\n}\n\n/**\n * Creates an intelligent, Git-aware snapshot of the repository state.\n */\nexport async function createProjectSnapshot(\n cwd: string,\n explicitFiles?: string[],\n): Promise<ProjectSnapshot> {\n const isGit = await isGitRepository(cwd);\n const gitStatusBefore = isGit ? await getGitStatusPorcelain(cwd) : undefined;\n const fileSnapshots = new Map<string, string | null>();\n\n const targetFiles = explicitFiles\n ? explicitFiles.map((f) => (f.startsWith(cwd) ? f : join(cwd, f)))\n : discoverProjectFiles(cwd);\n\n for (const fullPath of targetFiles) {\n const relPath = relative(cwd, fullPath);\n if (existsSync(fullPath)) {\n try {\n fileSnapshots.set(relPath, readFileSync(fullPath, \"utf8\"));\n } catch {\n try {\n fileSnapshots.set(relPath, readFileSync(fullPath).toString(\"base64\"));\n } catch {\n // Skip unreadable files\n }\n }\n } else {\n fileSnapshots.set(relPath, null);\n }\n }\n\n const snapshot: ProjectSnapshot = {\n cwd,\n isGit,\n gitStatusBefore,\n fileSnapshots,\n };\n\n return snapshot;\n}\n\n/**\n * Restores project state from snapshot using Git transaction restore or in-memory fallback.\n */\nexport async function restoreProjectSnapshot(snapshot: ProjectSnapshot): Promise<void> {\n // 1. In-memory exact file restoration for all tracked and dynamically touched files\n for (const [relPath, previousContent] of snapshot.fileSnapshots.entries()) {\n const fullPath = join(snapshot.cwd, relPath);\n if (previousContent === null) {\n if (existsSync(fullPath)) {\n try {\n rmSync(fullPath, { force: true, recursive: true });\n } catch {\n // Ignore removal error\n }\n }\n } else {\n try {\n writeFileSync(fullPath, previousContent, \"utf8\");\n } catch {\n // Ignore write error\n }\n }\n }\n\n // 2. Discover any newly created files matching manifest/patch patterns that were not in snapshot\n const currentFiles = discoverProjectFiles(snapshot.cwd);\n for (const fullPath of currentFiles) {\n const relPath = relative(snapshot.cwd, fullPath);\n if (!snapshot.fileSnapshots.has(relPath)) {\n try {\n rmSync(fullPath, { force: true, recursive: true });\n } catch {\n // Ignore removal error\n }\n }\n }\n\n // 3. If inside Git repo, clean any newly introduced untracked artifacts not in before-status\n if (snapshot.isGit) {\n try {\n const currentStatus = await getGitStatusPorcelain(snapshot.cwd);\n const beforeSet = new Set(snapshot.gitStatusBefore ?? []);\n\n for (const line of currentStatus) {\n if (beforeSet.has(line)) continue;\n const parsed = parseGitPorcelainLine(line);\n if (!parsed) continue;\n const { statusCode, filePath } = parsed;\n const fullPath = join(snapshot.cwd, filePath);\n\n if (statusCode === \"??\" && existsSync(fullPath)) {\n // Untracked newly generated file\n try {\n rmSync(fullPath, { force: true, recursive: true });\n } catch {\n // Ignore\n }\n } else if (\n statusCode === \"M\" ||\n statusCode === \"MM\" ||\n statusCode === \"D\" ||\n statusCode.includes(\"M\") ||\n statusCode.includes(\"D\") ||\n statusCode.includes(\"T\")\n ) {\n // Revert tracked modified or deleted file\n try {\n await safeExeca(\"git\", [\"checkout\", \"--\", filePath], {\n cwd: snapshot.cwd,\n stdio: \"pipe\",\n });\n } catch {\n // Ignore\n }\n }\n }\n } catch {\n // Non-fatal Git clean error\n }\n }\n}\n\n/**\n * Synchronously restores project state from snapshot.\n */\nexport function restoreProjectSnapshotSync(snapshot: ProjectSnapshot): void {\n // 1. In-memory exact file restoration for all tracked and dynamically touched files\n for (const [relPath, previousContent] of snapshot.fileSnapshots.entries()) {\n const fullPath = join(snapshot.cwd, relPath);\n if (previousContent === null) {\n if (existsSync(fullPath)) {\n try {\n rmSync(fullPath, { force: true, recursive: true });\n } catch {\n // Ignore removal error\n }\n }\n } else {\n try {\n writeFileSync(fullPath, previousContent, \"utf8\");\n } catch {\n // Ignore write error\n }\n }\n }\n\n // 2. Discover any newly created files matching manifest/patch patterns that were not in snapshot\n const currentFiles = discoverProjectFiles(snapshot.cwd);\n for (const fullPath of currentFiles) {\n const relPath = relative(snapshot.cwd, fullPath);\n if (!snapshot.fileSnapshots.has(relPath)) {\n try {\n rmSync(fullPath, { force: true, recursive: true });\n } catch {\n // Ignore removal error\n }\n }\n }\n\n // 3. If inside a Git repository, clean untracked artifacts and revert tracked modified files\n if (snapshot.isGit) {\n try {\n const stdout = execSync(\"git status --porcelain=v1 -uall\", {\n cwd: snapshot.cwd,\n stdio: [\"pipe\", \"pipe\", \"ignore\"],\n encoding: \"utf8\",\n });\n const currentStatus = parsePorcelainLines(stdout);\n const beforeSet = new Set(snapshot.gitStatusBefore ?? []);\n\n for (const line of currentStatus) {\n if (beforeSet.has(line)) continue;\n const parsed = parseGitPorcelainLine(line);\n if (!parsed) continue;\n const { statusCode, filePath } = parsed;\n const fullPath = join(snapshot.cwd, filePath);\n\n if (statusCode === \"??\" && existsSync(fullPath)) {\n try {\n rmSync(fullPath, { force: true, recursive: true });\n } catch {\n // Ignore\n }\n } else if (\n statusCode === \"M\" ||\n statusCode === \"MM\" ||\n statusCode === \"D\" ||\n statusCode.includes(\"M\") ||\n statusCode.includes(\"D\") ||\n statusCode.includes(\"T\")\n ) {\n try {\n execFileSync(\"git\", [\"checkout\", \"--\", filePath], {\n cwd: snapshot.cwd,\n stdio: \"ignore\",\n });\n } catch {\n // Ignore\n }\n }\n }\n } catch {\n // Non-fatal Git error\n }\n }\n}\n\n/**\n * Executes an action inside an atomic rollback transaction envelope.\n */\nexport async function withAtomicRollback<T>(\n cwd: string,\n action: () => Promise<T>,\n options: {\n filesToTrack?: string[];\n shouldRollback?: (result: T) => boolean;\n } = {},\n): Promise<T> {\n const snapshot = await createProjectSnapshot(cwd, options.filesToTrack);\n activeSnapshots.add(snapshot);\n\n try {\n const result = await action();\n if (options.shouldRollback && options.shouldRollback(result)) {\n await restoreProjectSnapshot(snapshot);\n }\n return result;\n } catch (error) {\n await restoreProjectSnapshot(snapshot);\n throw error;\n } finally {\n activeSnapshots.delete(snapshot);\n }\n}\n","import { existsSync } from \"node:fs\";\nimport { mkdtemp, readFile, rm, writeFile } from \"node:fs/promises\";\nimport { createHash } from \"node:crypto\";\nimport { tmpdir } from \"node:os\";\nimport { join } from \"node:path\";\nimport { execa } from \"execa\";\nimport {\n getPackageManagerCommands,\n getYarnMajorVersion,\n type PackageManager,\n} from \"../../../platform/package-manager/index.js\";\nimport type { PatchArtifact, PatchMode, PatchValidationPhase } from \"../../../platform/types.js\";\n\nexport interface ValidationResult {\n passed: boolean;\n error?: string;\n output?: string;\n failedTests?: string[];\n}\n\nexport interface RawPackageJson {\n devDependencies?: Record<string, string>;\n scripts?: Record<string, string>;\n [key: string]: unknown;\n}\n\nexport interface PackageJsonSnapshot {\n path: string;\n content: string;\n}\n\nexport async function resolvePatchMode(\n packageManager: PackageManager,\n cwd: string,\n): Promise<PatchMode> {\n if (packageManager === \"npm\" || packageManager === \"bun\" || packageManager === \"deno\")\n return \"patch-package\";\n if (packageManager === \"pnpm\") return \"native-pnpm\";\n\n const major = await getYarnMajorVersion(cwd);\n return major >= 2 ? \"native-yarn\" : \"patch-package\";\n}\n\nexport function patchModeRequiresPackageJsonSnapshot(packageManager: PackageManager): boolean {\n if (packageManager === \"pnpm\") return false;\n return true;\n}\n\nexport function buildPatchFileName(packageName: string, vulnerableVersion: string): string {\n const safeName = packageName.replace(/^@/, \"\").replace(/\\//g, \"+\");\n return `${safeName}+${vulnerableVersion}.patch`;\n}\n\nexport function extractPatchedFiles(patchContent: string): string[] {\n return Array.from(\n new Set(\n patchContent\n .split(/\\r?\\n/)\n .filter((line) => line.startsWith(\"+++ b/\"))\n .map((line) => line.slice(\"+++ b/\".length)),\n ),\n );\n}\n\nexport function countPatchHunks(patchContent: string): number {\n return patchContent.split(/\\r?\\n/).filter((line) => line.startsWith(\"@@ \")).length;\n}\n\nexport function computePatchIntegrity(patchContent: string): string {\n const hex = createHash(\"sha256\").update(patchContent, \"utf8\").digest(\"hex\");\n return `sha256:${hex}`;\n}\n\nexport async function writePatchManifest(\n manifestFilePath: string,\n artifact: PatchArtifact,\n): Promise<void> {\n await writeFile(manifestFilePath, JSON.stringify(artifact, null, 2) + \"\\n\", \"utf8\");\n}\n\nexport async function configurePatchPackagePostinstall(\n cwd: string,\n packageManager: PackageManager,\n): Promise<{ success: true } | { success: false; error: string }> {\n const pkgJsonPath = join(cwd, \"package.json\");\n let pkgJson: RawPackageJson;\n\n try {\n pkgJson = JSON.parse(await readFile(pkgJsonPath, \"utf8\")) as RawPackageJson;\n } catch {\n return {\n success: false,\n error: `Could not read package.json at ${pkgJsonPath}`,\n };\n }\n\n const devDependencies = pkgJson.devDependencies ?? {};\n if (!devDependencies[\"patch-package\"]) {\n try {\n const commands = getPackageManagerCommands(packageManager);\n const [cmd, ...args] = commands.installDev(\"patch-package\");\n await execa(cmd, args, {\n cwd,\n stdio: \"pipe\",\n });\n } catch (err) {\n return {\n success: false,\n error: `Failed to install patch-package: ${err instanceof Error ? err.message : String(err)}`,\n };\n }\n }\n\n if (!pkgJson.scripts) {\n pkgJson.scripts = {};\n }\n\n const patchApplyCmd = \"patch-package\";\n const currentPostinstall = pkgJson.scripts.postinstall || \"\";\n\n if (currentPostinstall && !currentPostinstall.includes(\"patch-package\")) {\n pkgJson.scripts.postinstall = `${currentPostinstall} && ${patchApplyCmd}`;\n } else if (!currentPostinstall) {\n pkgJson.scripts.postinstall = patchApplyCmd;\n }\n\n await writeFile(pkgJsonPath, JSON.stringify(pkgJson, null, 2) + \"\\n\", \"utf8\");\n return { success: true };\n}\n\nexport async function capturePackageJsonSnapshot(\n cwd: string,\n): Promise<PackageJsonSnapshot | undefined> {\n const path = join(cwd, \"package.json\");\n\n try {\n const content = await readFile(path, \"utf8\");\n return { path, content };\n } catch {\n return undefined;\n }\n}\n\nexport async function cleanupPatchArtifacts(params: {\n cwd: string;\n patchFilePath: string;\n manifestFilePath?: string;\n patchMode: PatchMode;\n packageJsonSnapshot?: PackageJsonSnapshot;\n installCommand: string[];\n rerunInstall: boolean;\n}): Promise<void> {\n const {\n cwd,\n patchFilePath,\n manifestFilePath,\n patchMode,\n packageJsonSnapshot,\n installCommand,\n rerunInstall,\n } = params;\n\n await rm(patchFilePath, { force: true }).catch(() => undefined);\n if (manifestFilePath) {\n await rm(manifestFilePath, { force: true }).catch(() => undefined);\n }\n\n if (patchMode === \"patch-package\" && packageJsonSnapshot) {\n await writeFile(packageJsonSnapshot.path, packageJsonSnapshot.content, \"utf8\").catch(\n () => undefined,\n );\n }\n\n if (!rerunInstall) return;\n\n try {\n const [installCmd, ...installArgs] = installCommand;\n await execa(installCmd, installArgs, {\n cwd,\n stdio: \"pipe\",\n });\n } catch {\n // Ignore cleanup install failures and preserve the original remediation error.\n }\n}\n\nexport async function applyNativePatch(params: {\n cwd: string;\n packageName: string;\n vulnerableVersion: string;\n patchContent: string;\n patchMode: \"native-pnpm\" | \"native-yarn\";\n validationPhases: PatchValidationPhase[];\n}): Promise<{ success: true } | { success: false; error: string }> {\n const { cwd, packageName, vulnerableVersion, patchContent, patchMode, validationPhases } = params;\n const packageSpec = `${packageName}@${vulnerableVersion}`;\n\n const createCommand = patchMode === \"native-pnpm\" ? \"pnpm\" : \"yarn\";\n const createArgs = [\"patch\", packageSpec];\n\n let patchDir: string;\n try {\n const createResult = await execa(createCommand, createArgs, {\n cwd,\n stdio: \"pipe\",\n });\n patchDir = extractPatchDirectory(`${createResult.stdout}\\n${createResult.stderr}`);\n } catch (err) {\n validationPhases.push({\n phase: \"apply\",\n passed: false,\n error: err instanceof Error ? err.message : String(err),\n });\n return {\n success: false,\n error: `Failed to create native patch workspace for ${packageSpec}: ${\n err instanceof Error ? err.message : String(err)\n }`,\n };\n }\n\n if (!patchDir) {\n validationPhases.push({\n phase: \"apply\",\n passed: false,\n error: `Could not determine native patch directory for ${packageSpec}.`,\n });\n return {\n success: false,\n error: `Could not determine native patch directory for ${packageSpec}.`,\n };\n }\n\n const tempPatchDir = await mkdtemp(join(tmpdir(), \"autoremediator-native-patch-\"));\n const tempPatchFile = join(tempPatchDir, \"change.patch\");\n\n try {\n await writeFile(tempPatchFile, patchContent, \"utf8\");\n await execa(\"patch\", [\"-p1\", \"-i\", tempPatchFile], {\n cwd: patchDir,\n stdio: \"pipe\",\n });\n\n const commitCommand = patchMode === \"native-pnpm\" ? \"pnpm\" : \"yarn\";\n const commitArgs =\n patchMode === \"native-pnpm\" ? [\"patch-commit\", patchDir] : [\"patch-commit\", \"-s\", patchDir];\n\n await execa(commitCommand, commitArgs, {\n cwd,\n stdio: \"pipe\",\n });\n } catch (err) {\n validationPhases.push({\n phase: \"apply\",\n passed: false,\n error: err instanceof Error ? err.message : String(err),\n });\n return {\n success: false,\n error: `Failed to apply native patch for ${packageSpec}: ${\n err instanceof Error ? err.message : String(err)\n }`,\n };\n } finally {\n await rm(tempPatchDir, { recursive: true, force: true });\n }\n\n return { success: true };\n}\n\nfunction extractPatchDirectory(output: string): string {\n const lines = output\n .split(/\\r?\\n/)\n .map((line) => line.trim())\n .filter(Boolean);\n\n for (const line of lines) {\n if (existsSync(line)) {\n return line;\n }\n\n const tokens = line.split(/\\s+/).map((token) => token.replace(/^['\"]|['\"]$/g, \"\"));\n for (const token of tokens) {\n if (token.startsWith(\"/\") && existsSync(token)) {\n return token;\n }\n }\n }\n\n return \"\";\n}\n\nexport async function validatePatchWithTests(\n cwd: string,\n testCommand: string[],\n): Promise<ValidationResult> {\n try {\n const [cmd, ...args] = testCommand;\n const result = await execa(cmd, args, {\n cwd,\n timeout: 60000,\n stdio: \"pipe\",\n });\n\n return {\n passed: true,\n output: result.stdout,\n };\n } catch (err) {\n const stdoutVal =\n typeof err === \"object\" && err !== null && \"stdout\" in err\n ? (err as { stdout?: unknown }).stdout\n : \"\";\n const errorOutput =\n typeof stdoutVal === \"string\"\n ? stdoutVal\n : Buffer.isBuffer(stdoutVal)\n ? (stdoutVal as Buffer).toString(\"utf8\")\n : \"\";\n const failedTests = extractFailedTests(errorOutput);\n\n return {\n passed: false,\n error:\n failedTests.length > 0\n ? `Failed tests: ${failedTests.join(\", \")}`\n : \"Package-manager test validation failed.\",\n output: errorOutput,\n failedTests,\n };\n }\n}\n\nfunction extractFailedTests(output: string): string[] {\n const failedTests: string[] = [];\n const patterns = [/✖\\s+(.+?)(?:\\n|$)/g, /●\\s+(.+)(?:\\n|$)/g, /^FAIL\\s+(.+?)(?:\\n|$)/gm];\n\n for (const pattern of patterns) {\n let match;\n while ((match = pattern.exec(output)) !== null) {\n if (match[1]) {\n failedTests.push(match[1].trim());\n }\n }\n }\n\n return failedTests.slice(0, 5);\n}\n","import type { ConsensusVerdict, PatchConfidenceThresholds } from \"../../platform/types.js\";\nimport { generatePatchTool } from \"../tools/generate-patch/index.js\";\n\nexport interface ConsensusGateParams {\n packageName: string;\n vulnerableVersion: string;\n cveId: string;\n cveSummary: string;\n sourceFiles: Record<string, string>;\n policy?: string;\n cwd: string;\n llmProvider: \"remote\" | \"local\";\n model?: string;\n consensusProvider: \"remote\" | \"local\";\n consensusModel?: string;\n modelPersonality?: \"analytical\" | \"pragmatic\" | \"balanced\";\n providerSafetyProfile?: \"strict\" | \"relaxed\";\n patchConfidenceThresholds?: PatchConfidenceThresholds;\n dynamicModelRouting?: boolean;\n dynamicRoutingThresholdChars?: number;\n primaryPatches: Array<{ filePath: string; unifiedDiff: string }>;\n}\n\nexport async function runConsensusGate(params: ConsensusGateParams): Promise<ConsensusVerdict> {\n const consensus = await generatePatchTool.execute({\n packageName: params.packageName,\n vulnerableVersion: params.vulnerableVersion,\n cveId: params.cveId,\n cveSummary: params.cveSummary,\n sourceFiles: params.sourceFiles,\n vulnerabilityCategory: \"unknown\",\n dryRun: false,\n llmProvider: params.consensusProvider,\n model: params.consensusModel,\n policy: params.policy,\n cwd: params.cwd,\n modelPersonality: params.modelPersonality,\n providerSafetyProfile: params.providerSafetyProfile,\n patchConfidenceThresholds: params.patchConfidenceThresholds,\n dynamicModelRouting: params.dynamicModelRouting,\n dynamicRoutingThresholdChars: params.dynamicRoutingThresholdChars,\n });\n\n const provider = consensus.llmProvider ?? params.consensusProvider;\n const model = consensus.llmModel ?? params.consensusModel ?? params.model ?? \"unknown\";\n const primaryDiff = params.primaryPatches[0]?.unifiedDiff;\n const secondaryDiff = consensus.patches?.[0]?.unifiedDiff;\n\n if (!consensus.success) {\n return {\n agreed: false,\n provider,\n model,\n reason: consensus.error ?? \"Consensus patch generation failed.\",\n latencyMs: consensus.latencyMs,\n estimatedCostUsd: consensus.estimatedCostUsd,\n };\n }\n\n if (!primaryDiff || !secondaryDiff) {\n return {\n agreed: false,\n provider,\n model,\n reason: \"Consensus could not compare patch output.\",\n latencyMs: consensus.latencyMs,\n estimatedCostUsd: consensus.estimatedCostUsd,\n };\n }\n\n if (primaryDiff !== secondaryDiff) {\n return {\n agreed: false,\n provider,\n model,\n reason: \"High-risk patch did not pass consensus verification.\",\n latencyMs: consensus.latencyMs,\n estimatedCostUsd: consensus.estimatedCostUsd,\n };\n }\n\n return {\n agreed: true,\n provider,\n model,\n latencyMs: consensus.latencyMs,\n estimatedCostUsd: consensus.estimatedCostUsd,\n };\n}\n","import { fetchPackageSourceTool } from \"../tools/fetch-package-source.js\";\nimport { generatePatchTool } from \"../tools/generate-patch/index.js\";\nimport { applyPatchFileTool } from \"../tools/apply-patch-file/index.js\";\nimport { runConsensusGate } from \"./consensus-gate.js\";\nimport type {\n ConsensusVerdict,\n LlmUsageMetrics,\n PackageManager,\n PatchConfidenceThresholds,\n PatchResult,\n UnresolvedReason,\n} from \"../../platform/types.js\";\nimport { getPatchConfidenceThreshold } from \"../../platform/config.js\";\nimport { isPackageAllowed, loadPolicy } from \"../../platform/policy.js\";\n\nfunction resolvePatchProvider(provider: \"remote\" | \"local\"): \"remote\" | \"local\" {\n if (provider === \"local\") {\n return \"remote\";\n }\n return provider;\n}\n\nexport function shouldAttemptPatchFallback(\n result: PatchResult,\n preferVersionBump: boolean,\n): boolean {\n if (preferVersionBump) return false;\n if (result.applied || result.dryRun) return false;\n\n return (\n result.unresolvedReason === \"no-safe-version\" ||\n result.unresolvedReason === \"install-failed\" ||\n result.unresolvedReason === \"override-apply-failed\" ||\n result.unresolvedReason === \"validation-failed\" ||\n result.unresolvedReason === \"major-bump-required\" ||\n result.unresolvedReason === \"transitive-dependency\" ||\n result.unresolvedReason === \"proof-of-fix-failed\"\n );\n}\n\nexport async function tryLocalPatchFallback(params: {\n cwd: string;\n packageManager: PackageManager;\n packageName: string;\n vulnerableVersion: string;\n cveId: string;\n cveSummary: string;\n dependencyScope: \"direct\" | \"transitive\";\n dryRun: boolean;\n runTests: boolean;\n patchesDir: string;\n llmProvider: \"remote\" | \"local\";\n model?: string;\n policy?: string;\n modelPersonality?: \"analytical\" | \"pragmatic\" | \"balanced\";\n providerSafetyProfile?: \"strict\" | \"relaxed\";\n requireConsensusForHighRisk?: boolean;\n consensusProvider?: \"remote\" | \"local\";\n consensusModel?: string;\n patchConfidenceThresholds?: PatchConfidenceThresholds;\n dynamicModelRouting?: boolean;\n dynamicRoutingThresholdChars?: number;\n installMode?: \"standard\" | \"prefer-offline\" | \"deterministic\";\n installPreferOffline?: boolean;\n enforceFrozenLockfile?: boolean;\n workspace?: string;\n vulnerableRange?: string;\n proofOfFix?: boolean | string;\n requireProofOfFix?: boolean;\n}): Promise<{ result: PatchResult; steps: number; usage: LlmUsageMetrics[] }> {\n const usage: LlmUsageMetrics[] = [];\n let steps = 0;\n let consensusVerdict: ConsensusVerdict | undefined;\n\n const loadedPolicy = loadPolicy(params.cwd, params.policy);\n if (!isPackageAllowed(loadedPolicy, params.packageName)) {\n return {\n steps: 0,\n usage,\n result: {\n packageName: params.packageName,\n strategy: \"none\",\n fromVersion: params.vulnerableVersion,\n applied: false,\n dryRun: params.dryRun,\n dependencyScope: params.dependencyScope,\n unresolvedReason: \"policy-blocked\",\n message: `Policy denyPackages blocked patch fallback for package \"${params.packageName}\".`,\n },\n };\n }\n\n const sourceResult = await fetchPackageSourceTool.execute({\n packageName: params.packageName,\n version: params.vulnerableVersion,\n });\n steps += 1;\n\n if (!sourceResult?.success || !sourceResult.sourceFiles) {\n return {\n steps,\n usage,\n result: {\n packageName: params.packageName,\n strategy: \"none\",\n fromVersion: params.vulnerableVersion,\n applied: false,\n dryRun: params.dryRun,\n dependencyScope: params.dependencyScope,\n unresolvedReason: \"source-fetch-failed\",\n message:\n sourceResult?.error ??\n `Failed to fetch source for ${params.packageName}@${params.vulnerableVersion}.`,\n },\n };\n }\n\n const primaryProvider = resolvePatchProvider(params.llmProvider);\n const patchResult = await generatePatchTool.execute({\n packageName: params.packageName,\n vulnerableVersion: params.vulnerableVersion,\n cveId: params.cveId,\n cveSummary: params.cveSummary,\n sourceFiles: sourceResult.sourceFiles,\n vulnerabilityCategory: \"unknown\",\n dryRun: params.dryRun,\n llmProvider: primaryProvider,\n model: params.model,\n policy: params.policy,\n cwd: params.cwd,\n modelPersonality: params.modelPersonality,\n providerSafetyProfile: params.providerSafetyProfile,\n patchConfidenceThresholds: params.patchConfidenceThresholds,\n dynamicModelRouting: params.dynamicModelRouting,\n dynamicRoutingThresholdChars: params.dynamicRoutingThresholdChars,\n });\n steps += 1;\n\n if (!patchResult?.success) {\n const error = patchResult?.error ?? \"Patch generation failed.\";\n const unresolvedReason: UnresolvedReason =\n error.includes(\"API_KEY\") || error.includes(\"does not create a language model\")\n ? \"requires-llm-fallback\"\n : \"patch-generation-failed\";\n return {\n steps,\n usage,\n result: {\n packageName: params.packageName,\n strategy: \"none\",\n fromVersion: params.vulnerableVersion,\n applied: false,\n dryRun: params.dryRun,\n dependencyScope: params.dependencyScope,\n unresolvedReason,\n message: error,\n },\n };\n }\n\n const effectiveProvider = patchResult.llmProvider ?? primaryProvider;\n const confidenceThreshold =\n patchResult.confidenceThreshold ??\n getPatchConfidenceThreshold(\n effectiveProvider,\n params.providerSafetyProfile ?? \"relaxed\",\n patchResult.riskLevel ?? \"medium\",\n params.patchConfidenceThresholds,\n );\n\n if (typeof patchResult.confidence === \"number\" && patchResult.confidence < confidenceThreshold) {\n return {\n steps,\n usage,\n result: {\n packageName: params.packageName,\n strategy: \"none\",\n fromVersion: params.vulnerableVersion,\n applied: false,\n dryRun: params.dryRun,\n dependencyScope: params.dependencyScope,\n confidence: patchResult.confidence,\n riskLevel: patchResult.riskLevel,\n unresolvedReason: \"patch-confidence-too-low\",\n message: `Patch confidence ${patchResult.confidence.toFixed(2)} is below threshold ${confidenceThreshold.toFixed(2)}.`,\n },\n };\n }\n\n if (params.requireConsensusForHighRisk && patchResult.riskLevel === \"high\" && !params.dryRun) {\n const consensusProvider = resolvePatchProvider(params.consensusProvider ?? primaryProvider);\n consensusVerdict = await runConsensusGate({\n packageName: params.packageName,\n vulnerableVersion: params.vulnerableVersion,\n cveId: params.cveId,\n cveSummary: params.cveSummary,\n sourceFiles: sourceResult.sourceFiles,\n policy: params.policy,\n cwd: params.cwd,\n llmProvider: primaryProvider,\n model: params.model,\n consensusProvider,\n consensusModel: params.consensusModel,\n modelPersonality: params.modelPersonality,\n providerSafetyProfile: params.providerSafetyProfile,\n patchConfidenceThresholds: params.patchConfidenceThresholds,\n dynamicModelRouting: params.dynamicModelRouting,\n dynamicRoutingThresholdChars: params.dynamicRoutingThresholdChars,\n primaryPatches: patchResult.patches ?? [],\n });\n steps += 1;\n\n if (!consensusVerdict.agreed) {\n return {\n steps,\n usage,\n result: {\n packageName: params.packageName,\n strategy: \"none\",\n fromVersion: params.vulnerableVersion,\n applied: false,\n dryRun: params.dryRun,\n dependencyScope: params.dependencyScope,\n unresolvedReason: \"consensus-failed\",\n message:\n consensusVerdict.reason ?? \"High-risk patch did not pass consensus verification.\",\n },\n };\n }\n\n usage.push({\n purpose: \"patch-consensus\",\n provider: consensusProvider,\n model: consensusVerdict.model,\n latencyMs: consensusVerdict.latencyMs,\n estimatedCostUsd: consensusVerdict.estimatedCostUsd,\n });\n }\n\n const applyResult = await applyPatchFileTool.execute({\n packageName: params.packageName,\n vulnerableVersion: params.vulnerableVersion,\n cveId: params.cveId,\n confidence: patchResult.confidence,\n patchContent: patchResult.patchContent,\n patches: patchResult.patches,\n patchesDir: params.patchesDir,\n cwd: params.cwd,\n packageManager: params.packageManager,\n policy: params.policy,\n installMode: params.installMode,\n installPreferOffline: params.installPreferOffline,\n enforceFrozenLockfile: params.enforceFrozenLockfile,\n workspace: params.workspace,\n riskLevel: patchResult.riskLevel,\n validateWithTests: params.runTests,\n reproductionTest: patchResult.reproductionTest,\n proofOfFix: params.proofOfFix,\n requireProofOfFix: params.requireProofOfFix,\n dryRun: params.dryRun,\n });\n steps += 1;\n\n if (patchResult.llmProvider && patchResult.llmModel) {\n usage.push({\n purpose: \"patch-generation\",\n provider: patchResult.llmProvider,\n model: patchResult.llmModel,\n latencyMs: patchResult.latencyMs,\n estimatedCostUsd: patchResult.estimatedCostUsd,\n });\n }\n\n return {\n steps,\n usage,\n result: {\n packageName: params.packageName,\n strategy: \"patch-file\",\n fromVersion: params.vulnerableVersion,\n patchFilePath: applyResult.patchFilePath ?? applyResult.patchPath,\n patchArtifact: applyResult.patchArtifact,\n applied: Boolean(applyResult.applied),\n dryRun: Boolean(applyResult.dryRun),\n dependencyScope: params.dependencyScope,\n confidence: patchResult.confidence,\n riskLevel: patchResult.riskLevel,\n vulnerableRange: params.vulnerableRange,\n consensusVerdict,\n unresolvedReason:\n !applyResult.applied && !applyResult.dryRun\n ? (applyResult.unresolvedReason ??\n (applyResult.validation?.passed === false\n ? \"patch-validation-failed\"\n : \"patch-apply-failed\"))\n : undefined,\n message: applyResult.message ?? applyResult.error ?? \"Patch-file strategy finished.\",\n validation:\n typeof applyResult.validation?.passed === \"boolean\"\n ? {\n passed: applyResult.validation.passed,\n error: applyResult.validation.error,\n }\n : undefined,\n validationPhases: applyResult.validationPhases,\n },\n };\n}\n","import { resolveProvider } from \"../../platform/config.js\";\nimport { loadPolicy } from \"../../platform/policy.js\";\nimport type {\n EscalationGraph,\n ExploitSignalOverridePolicy,\n PackageManager,\n PatchConfidenceThresholds,\n RemediateOptions,\n SlaPolicy,\n VexSuppression,\n} from \"../../platform/types.js\";\nimport { detectPackageManager } from \"../../platform/package-manager/index.js\";\n\nexport interface LocalRunOptions {\n cwd: string;\n packageManager: PackageManager;\n preview: boolean;\n dryRun: boolean;\n runTests: boolean;\n policy: string;\n patchesDir: string;\n constraints: NonNullable<RemediateOptions[\"constraints\"]>;\n llmProvider: \"remote\" | \"local\";\n providerSafetyProfile: \"strict\" | \"relaxed\";\n requireConsensusForHighRisk: boolean;\n consensusProvider: \"remote\" | \"local\";\n consensusModel?: string;\n patchConfidenceThresholds?: PatchConfidenceThresholds;\n dynamicModelRouting: boolean;\n dynamicRoutingThresholdChars?: number;\n exploitSignalOverride?: ExploitSignalOverridePolicy;\n suppressions: VexSuppression[];\n suppressionsFile?: string;\n slaCheck: boolean;\n slaPolicy?: SlaPolicy;\n skipUnreachable: boolean;\n regressionCheck: boolean;\n escalationGraph?: EscalationGraph;\n offlineIntelligence: boolean;\n intelligenceSnapshotPath?: string;\n proofOfFix?: boolean | string;\n requireProofOfFix?: boolean;\n breakingChangeRefactor?: boolean;\n}\n\nexport function resolveLocalRunOptions(options: RemediateOptions): LocalRunOptions {\n const cwd = options.cwd ?? process.cwd();\n const packageManager = options.packageManager ?? detectPackageManager(cwd);\n const preview = options.preview ?? false;\n const dryRun = (options.dryRun ?? false) || preview;\n const runTests = options.runTests ?? false;\n const policy = options.policy ?? \"\";\n const patchesDir = options.patchesDir || \"./patches\";\n const loadedPolicy = loadPolicy(cwd, options.policy);\n const constraints = {\n ...options.constraints,\n typecheck:\n options.typecheck ?? options.constraints?.typecheck ?? loadedPolicy.constraints?.typecheck,\n supplyChainPolicy:\n options.supplyChainPolicy ??\n options.constraints?.supplyChainPolicy ??\n loadedPolicy.constraints?.supplyChainPolicy,\n enableBreakingChangeRefactor:\n options.breakingChangeRefactor ??\n options.constraints?.enableBreakingChangeRefactor ??\n loadedPolicy.constraints?.enableBreakingChangeRefactor,\n requireProofOfFix:\n options.requireProofOfFix ??\n options.constraints?.requireProofOfFix ??\n loadedPolicy.constraints?.requireProofOfFix,\n };\n\n const llmProvider = resolveProvider(options);\n\n return {\n cwd,\n packageManager,\n preview,\n dryRun,\n runTests,\n policy,\n patchesDir,\n constraints,\n llmProvider,\n providerSafetyProfile:\n options.providerSafetyProfile ?? loadedPolicy.providerSafetyProfile ?? \"relaxed\",\n requireConsensusForHighRisk:\n options.requireConsensusForHighRisk ?? loadedPolicy.requireConsensusForHighRisk ?? false,\n consensusProvider: options.consensusProvider ?? loadedPolicy.consensusProvider ?? \"remote\",\n consensusModel: options.consensusModel ?? loadedPolicy.consensusModel,\n patchConfidenceThresholds: {\n ...loadedPolicy.patchConfidenceThresholds,\n ...options.patchConfidenceThresholds,\n },\n dynamicModelRouting: options.dynamicModelRouting ?? loadedPolicy.dynamicModelRouting ?? false,\n dynamicRoutingThresholdChars:\n options.dynamicRoutingThresholdChars ?? loadedPolicy.dynamicRoutingThresholdChars,\n exploitSignalOverride: options.exploitSignalOverride ?? loadedPolicy.exploitSignalOverride,\n suppressions: loadedPolicy.suppressions ?? [],\n suppressionsFile: options.suppressionsFile,\n slaCheck: options.slaCheck ?? false,\n slaPolicy: loadedPolicy.sla,\n skipUnreachable: options.skipUnreachable ?? loadedPolicy.skipUnreachable ?? false,\n regressionCheck: options.regressionCheck ?? false,\n escalationGraph: options.escalationGraph ?? loadedPolicy.escalationGraph,\n offlineIntelligence: options.offlineIntelligence ?? false,\n intelligenceSnapshotPath: options.intelligenceSnapshotPath,\n proofOfFix: options.proofOfFix,\n requireProofOfFix: options.requireProofOfFix ?? constraints.requireProofOfFix,\n breakingChangeRefactor:\n options.breakingChangeRefactor ?? constraints.enableBreakingChangeRefactor,\n };\n}\n","import semver from \"semver\";\nimport type { CveDetails, VulnerablePackage } from \"../../platform/types.js\";\n\ninterface InstalledPackage {\n name: string;\n version: string;\n type: \"direct\" | \"transitive\";\n}\n\nexport function findVulnerablePackages(\n cveDetails: CveDetails,\n installedPackages: InstalledPackage[],\n): VulnerablePackage[] {\n const vulnerablePackages: VulnerablePackage[] = [];\n\n for (const affected of cveDetails.affectedPackages) {\n if (!affected || typeof affected !== \"object\") continue;\n if (!affected.name || !affected.vulnerableRange) continue;\n if (affected.ecosystem !== \"npm\") continue;\n\n const matches = installedPackages.filter((pkg) => pkg.name === affected.name);\n for (const installed of matches) {\n if (!semver.valid(installed.version)) continue;\n\n let isVulnerable = false;\n try {\n isVulnerable = semver.satisfies(installed.version, affected.vulnerableRange, {\n includePrerelease: false,\n });\n } catch {\n continue;\n }\n\n if (isVulnerable) {\n vulnerablePackages.push({ installed, affected });\n }\n }\n }\n\n return vulnerablePackages;\n}\n","import type { PatchResult, VulnerablePackage } from \"../../platform/types.js\";\n\nexport function buildLocalSummary(\n vulnerablePackages: VulnerablePackage[],\n collectedResults: PatchResult[],\n): string {\n const appliedCount = collectedResults.filter((result) => result.applied).length;\n const unresolvedCount = collectedResults.filter(\n (result) => !result.applied && !result.dryRun,\n ).length;\n const dryRunCount = collectedResults.filter((result) => result.dryRun).length;\n\n return `Local mode completed: vulnerable=${vulnerablePackages.length}, applied=${appliedCount}, dryRun=${dryRunCount}, unresolved=${unresolvedCount}`;\n}\n","import type {\n CveSeverity,\n Disposition,\n DispositionPolicy,\n DispositionSignals,\n PatchResult,\n SlaBreach,\n} from \"../../platform/types.js\";\nimport type { ProjectSnapshot } from \"../../platform/rollback.js\";\nimport { restoreProjectSnapshotSync } from \"../../platform/rollback.js\";\n\nconst ESCALATE_SEVERITIES_DEFAULT = [\"CRITICAL\", \"HIGH\"] as const;\n\n/**\n * Compute the autonomous disposition for a single PatchResult.\n * Precedence order is deterministic — first match wins.\n */\nexport function computeDisposition(\n signals: DispositionSignals,\n policy?: DispositionPolicy,\n): { disposition: Disposition; dispositionReason: string } {\n const escalateOnKev = policy?.escalateOnKev ?? true;\n const escalateOnSlaBreachSeverities =\n policy?.escalateOnSlaBreachSeverities ?? (ESCALATE_SEVERITIES_DEFAULT as unknown as string[]);\n const holdForTransitive = policy?.holdForTransitive ?? false;\n const minConfidenceForAutoApply = policy?.minConfidenceForAutoApply ?? 0.7;\n\n // 1. Regression detected\n if (signals.regressionDetected === true) {\n return { disposition: \"escalate\", dispositionReason: \"regression-detected\" };\n }\n\n // 2. Consensus failed\n if (signals.consensusFailed === true) {\n return { disposition: \"escalate\", dispositionReason: \"consensus-failed\" };\n }\n\n // 3. Hard-fail unresolved reasons\n const hardFailReasons = [\n \"validation-failed\",\n \"patch-validation-failed\",\n \"install-failed\",\n ] as const;\n if (\n signals.unresolvedReason &&\n (hardFailReasons as readonly string[]).includes(signals.unresolvedReason)\n ) {\n return { disposition: \"escalate\", dispositionReason: signals.unresolvedReason };\n }\n\n // 4. KEV exploit signal\n if (signals.exploitSignalTriggered && escalateOnKev) {\n return { disposition: \"escalate\", dispositionReason: \"kev-exploit-signal\" };\n }\n\n // 5. SLA breach on escalatable severity\n if (signals.slaBreaches && signals.slaBreaches.length > 0) {\n const matched = signals.slaBreaches.some((b) =>\n escalateOnSlaBreachSeverities.includes(b.severity),\n );\n if (matched) {\n return { disposition: \"escalate\", dispositionReason: \"sla-breach\" };\n }\n }\n\n // 6. Patch confidence too low\n if (signals.unresolvedReason === \"patch-confidence-too-low\") {\n return { disposition: \"hold-for-approval\", dispositionReason: \"patch-confidence-too-low\" };\n }\n\n // 7. Hold for transitive\n if (holdForTransitive && signals.dependencyScope === \"transitive\") {\n return { disposition: \"hold-for-approval\", dispositionReason: \"transitive-dependency\" };\n }\n\n // 8. Unresolved (not applied)\n if (!signals.applied && signals.unresolvedReason) {\n return { disposition: \"simulate-only\", dispositionReason: signals.unresolvedReason };\n }\n\n // 9. Applied but low confidence\n if (\n signals.applied &&\n signals.confidence !== undefined &&\n signals.confidence < minConfidenceForAutoApply\n ) {\n return { disposition: \"hold-for-approval\", dispositionReason: \"low-confidence\" };\n }\n\n // 10. Applied\n if (signals.applied) {\n return { disposition: \"auto-apply\", dispositionReason: \"safe-apply\" };\n }\n\n // 11. Default\n return { disposition: \"simulate-only\", dispositionReason: \"unresolved\" };\n}\n\nexport interface DispositionContext {\n exploitSignalTriggered?: boolean;\n slaBreaches?: SlaBreach[];\n severity?: CveSeverity;\n policy?: DispositionPolicy;\n containmentMode?: boolean;\n cwd?: string;\n snapshot?: ProjectSnapshot;\n onContainmentRollback?: () => void;\n}\n\nexport function applyDispositionAndContainment(\n result: PatchResult,\n context: DispositionContext,\n): PatchResult {\n const disposition = computeDisposition(\n {\n exploitSignalTriggered: context.exploitSignalTriggered,\n slaBreaches: context.slaBreaches,\n dependencyScope: result.dependencyScope,\n unresolvedReason: result.unresolvedReason,\n confidence: result.confidence,\n riskLevel: result.riskLevel,\n regressionDetected: result.regressionDetected,\n consensusFailed: result.unresolvedReason === \"consensus-failed\",\n applied: result.applied,\n severity: context.severity,\n },\n context.policy,\n );\n\n const withDisposition: PatchResult = {\n ...result,\n disposition: disposition.disposition,\n dispositionReason: disposition.dispositionReason,\n };\n\n if (\n context.containmentMode &&\n withDisposition.disposition === \"escalate\" &&\n withDisposition.applied\n ) {\n if (context.snapshot) {\n restoreProjectSnapshotSync(context.snapshot);\n }\n if (context.onContainmentRollback) {\n try {\n context.onContainmentRollback();\n } catch {\n // Non-fatal callback error\n }\n }\n return {\n ...withDisposition,\n applied: false,\n unresolvedReason: \"policy-blocked\",\n };\n }\n\n return withDisposition;\n}\n","import type { EscalationAction, EscalationGraph, UnresolvedReason } from \"./types.js\";\n\nexport const DEFAULT_ESCALATION_GRAPH: EscalationGraph = {\n \"consensus-failed\": \"create-draft-pr\",\n \"patch-validation-failed\": \"open-issue\",\n \"patch-confidence-too-low\": \"open-issue\",\n \"source-fetch-failed\": \"notify-channel\",\n \"patch-generation-failed\": \"notify-channel\",\n \"no-safe-version\": \"open-issue\",\n \"validation-failed\": \"create-draft-pr\",\n};\n\nexport function computeEscalationAction(\n reason: UnresolvedReason | undefined,\n graph?: EscalationGraph,\n): EscalationAction {\n if (!reason) return \"none\";\n\n const mergedGraph: EscalationGraph = {\n ...DEFAULT_ESCALATION_GRAPH,\n ...graph,\n };\n\n return mergedGraph[reason] ?? \"none\";\n}\n","import type { CveDetails, PatchResult, VulnerablePackage } from \"../../platform/types.js\";\n\ninterface StepToolResult {\n toolName: string;\n result?: unknown;\n}\n\ninterface AccumulateStepResultsParams {\n toolResults: StepToolResult[];\n cveDetails: CveDetails | null;\n vulnerablePackages: VulnerablePackage[];\n collectedResults: PatchResult[];\n getDependencyScope: (packageName: string) => \"direct\" | \"transitive\" | undefined;\n}\n\ninterface AccumulateStepResultsOutput {\n cveDetails: CveDetails | null;\n vulnerablePackages: VulnerablePackage[];\n collectedResults: PatchResult[];\n}\n\nexport function accumulateStepResults(\n params: AccumulateStepResultsParams,\n): AccumulateStepResultsOutput {\n const { toolResults, cveDetails, vulnerablePackages, collectedResults, getDependencyScope } =\n params;\n\n let nextCveDetails = cveDetails;\n const nextVulnerablePackages = [...vulnerablePackages];\n const nextCollectedResults = [...collectedResults];\n\n for (const tr of toolResults) {\n const toolResult = tr.result as Record<string, unknown> | undefined;\n\n if (tr.toolName === \"lookup-cve\" && toolResult?.data) {\n nextCveDetails = toolResult.data as CveDetails;\n }\n\n if (tr.toolName === \"check-version-match\" && toolResult?.vulnerablePackages) {\n nextVulnerablePackages.push(...(toolResult.vulnerablePackages as VulnerablePackage[]));\n }\n\n if (tr.toolName === \"apply-version-bump\") {\n const typed = toolResult as unknown as PatchResult;\n nextCollectedResults.push({\n ...typed,\n dependencyScope: typed.packageName\n ? getDependencyScope(typed.packageName)\n : typed.dependencyScope,\n });\n }\n\n if (tr.toolName === \"apply-package-override\") {\n const typed = toolResult as unknown as PatchResult;\n nextCollectedResults.push({\n ...typed,\n dependencyScope: typed.packageName\n ? getDependencyScope(typed.packageName)\n : typed.dependencyScope,\n });\n }\n\n if (tr.toolName === \"apply-patch-file\" && toolResult) {\n const validation = toolResult.validation as { passed?: boolean; error?: string } | undefined;\n const message =\n typeof toolResult.message === \"string\"\n ? toolResult.message\n : typeof toolResult.error === \"string\"\n ? toolResult.error\n : \"Patch-file strategy finished.\";\n\n nextCollectedResults.push({\n packageName:\n typeof toolResult.packageName === \"string\" ? toolResult.packageName : \"unknown-package\",\n strategy: \"patch-file\",\n fromVersion:\n typeof toolResult.vulnerableVersion === \"string\"\n ? toolResult.vulnerableVersion\n : \"unknown\",\n patchFilePath:\n typeof toolResult.patchFilePath === \"string\"\n ? toolResult.patchFilePath\n : typeof toolResult.patchPath === \"string\"\n ? toolResult.patchPath\n : undefined,\n patchArtifact:\n typeof toolResult.patchArtifact === \"object\" && toolResult.patchArtifact !== null\n ? (toolResult.patchArtifact as PatchResult[\"patchArtifact\"])\n : undefined,\n applied: Boolean(toolResult.applied),\n dryRun: Boolean(toolResult.dryRun),\n dependencyScope:\n typeof toolResult.packageName === \"string\"\n ? getDependencyScope(toolResult.packageName)\n : undefined,\n confidence:\n typeof toolResult.patchArtifact === \"object\" &&\n toolResult.patchArtifact !== null &&\n typeof (toolResult.patchArtifact as Record<string, unknown>).confidence === \"number\"\n ? ((toolResult.patchArtifact as Record<string, unknown>).confidence as number)\n : undefined,\n riskLevel:\n typeof toolResult.patchArtifact === \"object\" &&\n toolResult.patchArtifact !== null &&\n typeof (toolResult.patchArtifact as Record<string, unknown>).riskLevel === \"string\"\n ? ((toolResult.patchArtifact as Record<string, unknown>)\n .riskLevel as PatchResult[\"riskLevel\"])\n : undefined,\n unresolvedReason:\n !toolResult.applied && !toolResult.dryRun\n ? validation && validation.passed === false\n ? \"patch-validation-failed\"\n : \"patch-apply-failed\"\n : undefined,\n message,\n validation:\n validation && typeof validation.passed === \"boolean\"\n ? {\n passed: validation.passed,\n error: typeof validation.error === \"string\" ? validation.error : undefined,\n }\n : undefined,\n validationPhases: Array.isArray(toolResult.validationPhases)\n ? (toolResult.validationPhases as PatchResult[\"validationPhases\"])\n : undefined,\n });\n }\n }\n\n return {\n cveDetails: nextCveDetails,\n vulnerablePackages: nextVulnerablePackages,\n collectedResults: nextCollectedResults,\n };\n}\n","import { existsSync, readFileSync } from \"node:fs\";\nimport { join } from \"node:path\";\nimport type { PackageManager } from \"../platform/types.js\";\n\ninterface PromptContext {\n cveId: string;\n cwd: string;\n llmProvider: \"remote\" | \"local\";\n modelPersonality?: \"analytical\" | \"pragmatic\" | \"balanced\";\n packageManager: PackageManager;\n dryRun: boolean;\n runTests: boolean;\n policy: string;\n patchesDir: string;\n constraints: {\n directDependenciesOnly?: boolean;\n preferVersionBump?: boolean;\n };\n}\n\nfunction buildProviderAddendum(\n provider: \"remote\" | \"local\",\n personality: \"analytical\" | \"pragmatic\" | \"balanced\" = \"balanced\",\n): string {\n const personalityDirective =\n personality === \"analytical\"\n ? \"Use concise, explicit rationale for tool decisions and unresolved outcomes.\"\n : personality === \"pragmatic\"\n ? \"Prefer the smallest safe remediation path while preserving policy and validation gates.\"\n : \"Balance concise execution with brief rationale for risky or unresolved outcomes.\";\n\n const providerDirective =\n provider === \"remote\"\n ? \"Use strict structured output and deterministic reporting fields.\"\n : \"Use deterministic-first behavior and only rely on remote model fallback when required by patch generation.\";\n\n return `\\nProvider profile:\\n- Provider: ${provider}\\n- ${providerDirective}\\n- ${personalityDirective}`;\n}\n\nexport function loadOrchestrationPrompt(ctx: PromptContext): string {\n const promptPath = join(\n process.cwd(),\n \".github\",\n \"instructions\",\n \"orchestration.instructions.md\",\n );\n\n if (!existsSync(promptPath)) {\n return `You are autoremediator, an agentic security remediation system for Node.js package dependencies.\nWorking directory: ${ctx.cwd}\n Package manager: ${ctx.packageManager}\nDry run: ${ctx.dryRun}\nRun tests: ${ctx.runTests}\nPolicy: ${ctx.policy || \"undefined\"}\nPatches dir: ${ctx.patchesDir}\nDirect dependencies only: ${String(ctx.constraints.directDependenciesOnly ?? false)}\nPrefer version bump: ${String(ctx.constraints.preferVersionBump ?? false)}\n\nRequired sequence:\n1. lookup-cve\n2. check-inventory\n3. check-version-match\n4. find-fixed-version\n5. apply-version-bump\n6. apply-package-override\n\nFallback sequence (when neither version bump nor override can be applied):\n1. fetch-package-source\n2. generate-patch\n3. apply-patch-file\n\nAlways respect dryRun and policy constraints.`;\n }\n\n const template = readFileSync(promptPath, \"utf8\");\n return (\n template\n .replaceAll(\"{{cveId}}\", ctx.cveId)\n .replaceAll(\"{{cwd}}\", ctx.cwd)\n .replaceAll(\"{{packageManager}}\", ctx.packageManager)\n .replaceAll(\"{{dryRun}}\", String(ctx.dryRun))\n .replaceAll(\"{{runTests}}\", String(ctx.runTests))\n .replaceAll(\"{{policy}}\", ctx.policy || \"undefined\")\n .replaceAll(\"{{patchesDir}}\", ctx.patchesDir)\n .replaceAll(\n \"{{directDependenciesOnly}}\",\n String(ctx.constraints.directDependenciesOnly ?? false),\n )\n .replaceAll(\"{{preferVersionBump}}\", String(ctx.constraints.preferVersionBump ?? false)) +\n buildProviderAddendum(ctx.llmProvider, ctx.modelPersonality)\n );\n}\n","import type { RemediateOptions } from \"../../platform/types.js\";\n\nexport type ProgressStage =\n | \"pipeline-start\"\n | \"model-selected\"\n | \"agent-step\"\n | \"pipeline-finish\"\n | \"patch-fallback\"\n | \"patch-consensus\";\n\nexport function createProgressEmitter(options: RemediateOptions) {\n return (\n stage: ProgressStage,\n detail: string,\n extra?: { provider?: \"remote\" | \"local\"; model?: string },\n ): void => {\n if (!options.onProgress) return;\n options.onProgress({\n stage,\n detail,\n at: new Date().toISOString(),\n provider: extra?.provider,\n model: extra?.model,\n });\n };\n}\n","import { existsSync } from \"node:fs\";\nimport type { RemediateOptions } from \"../../platform/types.js\";\nimport {\n loadIntelligenceSnapshot,\n lookupSnapshotCve,\n type IntelligenceSnapshot,\n} from \"../../intelligence/sources/snapshot.js\";\nimport { applyPackageOverrideTool } from \"../tools/apply-package-override/index.js\";\nimport { applyPatchFileTool } from \"../tools/apply-patch-file/index.js\";\nimport { applyVersionBumpTool } from \"../tools/apply-version-bump.js\";\nimport { checkInventoryTool } from \"../tools/check-inventory.js\";\nimport { buildRuntimeTools } from \"../runtime-tools.js\";\n\nexport function createRuntimeToolsForRun(options: RemediateOptions) {\n const preview = options.preview ?? false;\n const constraints = options.constraints ?? {};\n const policy = options.policy ?? \"\";\n\n const checkInventoryToolForRun = {\n ...checkInventoryTool,\n execute: async (input: Parameters<typeof checkInventoryTool.execute>[0]) =>\n checkInventoryTool.execute({\n ...input,\n policy,\n workspace: constraints.workspace,\n }),\n };\n\n const applyVersionBumpToolForRun = {\n ...applyVersionBumpTool,\n execute: async (input: Parameters<typeof applyVersionBumpTool.execute>[0]) =>\n applyVersionBumpTool.execute({\n ...input,\n policy,\n installMode: constraints.installMode,\n installPreferOffline: constraints.installPreferOffline,\n enforceFrozenLockfile: constraints.enforceFrozenLockfile,\n workspace: constraints.workspace,\n typecheck: input.typecheck ?? options.typecheck ?? constraints.typecheck,\n breakingChangeRefactor:\n input.breakingChangeRefactor ??\n options.breakingChangeRefactor ??\n constraints.enableBreakingChangeRefactor,\n proofOfFix: input.proofOfFix ?? options.proofOfFix,\n requireProofOfFix:\n input.requireProofOfFix ?? options.requireProofOfFix ?? constraints.requireProofOfFix,\n reproductionTest: input.reproductionTest ?? options.reproductionTest,\n patchesDir: input.patchesDir ?? options.patchesDir,\n dryRun: preview ? true : input.dryRun,\n }),\n };\n\n const applyPackageOverrideToolForRun = {\n ...applyPackageOverrideTool,\n execute: async (input: Parameters<typeof applyPackageOverrideTool.execute>[0]) =>\n applyPackageOverrideTool.execute({\n ...input,\n policy,\n installMode: constraints.installMode,\n installPreferOffline: constraints.installPreferOffline,\n enforceFrozenLockfile: constraints.enforceFrozenLockfile,\n workspace: constraints.workspace,\n proofOfFix: input.proofOfFix ?? options.proofOfFix,\n requireProofOfFix:\n input.requireProofOfFix ?? options.requireProofOfFix ?? constraints.requireProofOfFix,\n reproductionTest: input.reproductionTest ?? options.reproductionTest,\n patchesDir: input.patchesDir ?? options.patchesDir,\n dryRun: preview ? true : input.dryRun,\n }),\n };\n\n const applyPatchFileToolForRun = {\n ...applyPatchFileTool,\n execute: async (input: Parameters<typeof applyPatchFileTool.execute>[0]) =>\n applyPatchFileTool.execute({\n ...input,\n policy,\n installMode: constraints.installMode,\n installPreferOffline: constraints.installPreferOffline,\n enforceFrozenLockfile: constraints.enforceFrozenLockfile,\n workspace: constraints.workspace,\n proofOfFix: input.proofOfFix ?? options.proofOfFix,\n requireProofOfFix:\n input.requireProofOfFix ?? options.requireProofOfFix ?? constraints.requireProofOfFix,\n reproductionTest: input.reproductionTest ?? options.reproductionTest,\n patchesDir: input.patchesDir ?? options.patchesDir,\n dryRun: preview ? true : input.dryRun,\n }),\n };\n\n const tools = buildRuntimeTools({\n checkInventoryToolForRun,\n applyVersionBumpToolForRun,\n applyPackageOverrideToolForRun,\n applyPatchFileToolForRun,\n constraints,\n });\n\n if (options.offlineIntelligence) {\n let snapshot: IntelligenceSnapshot | null = null;\n if (options.intelligenceSnapshotPath && existsSync(options.intelligenceSnapshotPath)) {\n try {\n snapshot = loadIntelligenceSnapshot(options.intelligenceSnapshotPath);\n } catch (err) {\n const _ignored = err;\n snapshot = null;\n }\n }\n\n (tools as Record<string, unknown>)[\"lookup-cve\"] = {\n ...((tools as Record<string, unknown>)[\"lookup-cve\"] as Record<string, unknown>),\n execute: async (_input: Record<string, unknown>) => {\n const cveId = ((_input as { cveId?: string }).cveId ?? \"unknown\").toUpperCase();\n if (snapshot) {\n const details = lookupSnapshotCve(snapshot, cveId);\n if (details) {\n return {\n success: true,\n found: true,\n cveId,\n offlineMode: true,\n data: details,\n message: `Offline mode: intelligence lookup resolved from snapshot for ${cveId}.`,\n };\n }\n return {\n success: false,\n found: false,\n cveId,\n offlineMode: true,\n error: `Offline mode: ${cveId} not found in intelligence snapshot.`,\n message: `Offline mode: ${cveId} not found in intelligence snapshot.`,\n };\n }\n\n const snapshotErrorMsg = options.intelligenceSnapshotPath\n ? `Offline mode: intelligence snapshot file not found or invalid at ${options.intelligenceSnapshotPath}.`\n : `Offline mode: intelligence lookup skipped (no snapshot provided).`;\n\n return {\n success: false,\n found: false,\n cveId,\n offlineMode: true,\n error: snapshotErrorMsg,\n message: snapshotErrorMsg,\n };\n },\n };\n }\n\n return tools;\n}\n","/**\n * Tool: lookup-cve\n *\n * Fetches CVE details from OSV (primary) and GitHub Advisory (secondary),\n * merges them, and optionally enriches with supplemental intelligence data.\n */\nimport { defineTool } from \"./tool-compat.js\";\nimport { z } from \"zod\";\nimport { lookupCveOsv } from \"../../intelligence/sources/osv.js\";\nimport {\n lookupCveGitHub,\n mergeGhDataIntoCveDetails,\n} from \"../../intelligence/sources/github-advisory.js\";\nimport { enrichWithNvd } from \"../../intelligence/sources/nvd.js\";\nimport { enrichWithCisaKev } from \"../../intelligence/sources/cisa-kev.js\";\nimport { enrichWithEpss } from \"../../intelligence/sources/epss.js\";\nimport { enrichWithCveServices } from \"../../intelligence/sources/cve-services.js\";\nimport { enrichWithGitLabAdvisory } from \"../../intelligence/sources/gitlab-advisory.js\";\nimport { enrichWithCertCc } from \"../../intelligence/sources/certcc.js\";\nimport { enrichWithDepsDev } from \"../../intelligence/sources/deps-dev.js\";\nimport { enrichWithOssfScorecard } from \"../../intelligence/sources/ossf-scorecard.js\";\nimport { enrichWithExternalFeeds } from \"../../intelligence/sources/external-feeds.js\";\nimport type { CveDetails } from \"../../platform/types.js\";\n\nexport const lookupCveTool = defineTool({\n description:\n \"Look up a CVE ID and return the list of affected npm packages, their vulnerable version ranges, and the first patched version. Always call this first.\",\n parameters: z.object({\n cveId: z.string().regex(/^CVE-\\d{4}-\\d+$/i, \"Must be a valid CVE ID like CVE-2021-23337\"),\n }),\n execute: async ({ cveId }): Promise<{ success: boolean; data?: CveDetails; error?: string }> => {\n const normalizedId = cveId.toUpperCase();\n\n // Fan out to OSV + GitHub Advisory in parallel\n const [osvDetails, ghPackages] = await Promise.all([\n lookupCveOsv(normalizedId),\n lookupCveGitHub(normalizedId),\n ]);\n\n if (!osvDetails && ghPackages.length === 0) {\n return {\n success: false,\n error: `CVE \"${normalizedId}\" was not found in OSV or GitHub Advisory databases. It may be too new, or not affect npm packages.`,\n };\n }\n\n // Start from OSV result or construct a minimal shell from GH data\n let details: CveDetails = osvDetails ?? {\n id: normalizedId,\n summary: \"Details sourced from GitHub Advisory Database.\",\n severity: \"UNKNOWN\",\n references: [],\n affectedPackages: [],\n };\n\n // Merge GitHub Advisory data (adds firstPatchedVersion, fills gaps)\n if (ghPackages.length > 0) {\n details = mergeGhDataIntoCveDetails(details, ghPackages);\n }\n\n const sourceHealth: Record<string, { attempted: boolean; changed: boolean; error?: string }> =\n {};\n\n const applyEnricher = async (\n sourceName: string,\n enricher: (input: CveDetails) => Promise<CveDetails>,\n ): Promise<void> => {\n const before = JSON.stringify(details);\n try {\n details = await enricher(details);\n const after = JSON.stringify(details);\n sourceHealth[sourceName] = {\n attempted: true,\n changed: before !== after,\n };\n } catch (error) {\n sourceHealth[sourceName] = {\n attempted: true,\n changed: false,\n error: error instanceof Error ? error.message : String(error),\n };\n }\n };\n\n await applyEnricher(\"nvd\", enrichWithNvd);\n await applyEnricher(\"cisa-kev\", enrichWithCisaKev);\n await applyEnricher(\"epss\", enrichWithEpss);\n await applyEnricher(\"cve-services\", enrichWithCveServices);\n await applyEnricher(\"gitlab-advisory\", enrichWithGitLabAdvisory);\n await applyEnricher(\"certcc\", enrichWithCertCc);\n await applyEnricher(\"deps-dev\", enrichWithDepsDev);\n await applyEnricher(\"ossf-scorecard\", enrichWithOssfScorecard);\n await applyEnricher(\"external-feeds\", enrichWithExternalFeeds);\n\n details.intelligence = {\n ...details.intelligence,\n sourceHealth,\n };\n\n if (details.affectedPackages.length === 0) {\n return {\n success: false,\n error: `CVE \"${normalizedId}\" was found but has no npm-specific affected packages listed. It may affect a different ecosystem.`,\n };\n }\n\n return { success: true, data: details };\n },\n});\n","/**\n * CVE Services (CVE.org/MITRE) client.\n *\n * Adds supplemental references and summary data when available.\n * Uses shared HTTP client for consistent error handling and timeouts.\n */\nimport type { CveDetails } from \"../../platform/types.js\";\nimport { getIntelligenceSourceConfig } from \"../../platform/config.js\";\nimport { httpClient } from \"../../platform/http-client.js\";\n\ninterface CveContainer {\n descriptions?: Array<{ lang?: string; value?: string }>;\n references?: Array<{ url?: string }>;\n}\n\ninterface CveRecord {\n containers?: {\n cna?: CveContainer;\n adp?: CveContainer[];\n };\n}\n\nfunction pickEnglishDescription(container?: CveContainer): string | undefined {\n if (!container?.descriptions?.length) return undefined;\n const en = container.descriptions.find((d) => d.lang === \"en\" && d.value);\n return (en?.value ?? container.descriptions[0]?.value)?.trim() || undefined;\n}\n\nfunction collectReferences(record: CveRecord): string[] {\n const refs = new Set<string>();\n const cnaRefs = record.containers?.cna?.references ?? [];\n const adpRefs = (record.containers?.adp ?? []).flatMap((c) => c.references ?? []);\n\n for (const ref of [...cnaRefs, ...adpRefs]) {\n if (ref.url) refs.add(ref.url);\n }\n return Array.from(refs);\n}\n\nexport async function fetchCveServicesRecord(cveId: string): Promise<CveRecord | undefined> {\n const { cveServicesApi } = getIntelligenceSourceConfig();\n if (!cveServicesApi) return undefined;\n\n try {\n const res = await httpClient({\n url: `${cveServicesApi}/${encodeURIComponent(cveId)}`,\n });\n if (!res.ok) return undefined;\n return res.data as CveRecord;\n } catch {\n return undefined;\n }\n}\n\nexport async function enrichWithCveServices(details: CveDetails): Promise<CveDetails> {\n const record = await fetchCveServicesRecord(details.id);\n if (!record) return details;\n\n const summary = pickEnglishDescription(record.containers?.cna);\n if (summary && (!details.summary || details.summary.includes(\"No summary available\"))) {\n details.summary = summary;\n }\n\n const refs = collectReferences(record);\n if (refs.length > 0) {\n const merged = new Set([...details.references, ...refs]);\n details.references = Array.from(merged);\n }\n\n details.intelligence = {\n ...details.intelligence,\n cveServicesEnriched: true,\n };\n\n return details;\n}\n","/**\n * GitLab advisory enrichment client.\n *\n * Endpoint is configurable because deployment paths vary by mirror.\n * Uses shared HTTP client for consistent error handling and timeouts.\n */\nimport type { CveDetails } from \"../../platform/types.js\";\nimport { getIntelligenceSourceConfig } from \"../../platform/config.js\";\nimport { httpClient } from \"../../platform/http-client.js\";\n\ninterface GitLabAdvisoryRecord {\n identifiers?: Array<{ type?: string; value?: string }>;\n references?: string[];\n}\n\nfunction advisoryMatchesCve(advisory: GitLabAdvisoryRecord, cveId: string): boolean {\n const normalized = cveId.toUpperCase();\n return (advisory.identifiers ?? []).some(\n (id) => id.type?.toUpperCase() === \"CVE\" && id.value?.toUpperCase() === normalized,\n );\n}\n\nexport async function fetchGitLabAdvisories(cveId: string): Promise<GitLabAdvisoryRecord[]> {\n const { gitLabAdvisoryApi } = getIntelligenceSourceConfig();\n if (!gitLabAdvisoryApi) return [];\n\n try {\n const url = new URL(gitLabAdvisoryApi);\n url.searchParams.set(\"identifier\", cveId);\n url.searchParams.set(\"ecosystem\", \"npm\");\n\n const res = await httpClient({ url: url.toString() });\n if (!res.ok) return [];\n\n const body = res.data;\n return Array.isArray(body) ? (body as GitLabAdvisoryRecord[]) : [];\n } catch {\n return [];\n }\n}\n\nexport async function enrichWithGitLabAdvisory(details: CveDetails): Promise<CveDetails> {\n const advisories = await fetchGitLabAdvisories(details.id);\n const matched = advisories.filter((a) => advisoryMatchesCve(a, details.id));\n if (matched.length === 0) return details;\n\n const refs = matched.flatMap((m) => m.references ?? []);\n if (refs.length > 0) {\n const merged = new Set([...details.references, ...refs]);\n details.references = Array.from(merged);\n }\n\n details.intelligence = {\n ...details.intelligence,\n gitlabAdvisoryMatched: true,\n };\n\n return details;\n}\n","/**\n * CERT/CC search enrichment.\n *\n * This source tries to locate a CERT/CC page mentioning a CVE.\n * Uses shared HTTP client for consistent error handling and timeouts.\n */\nimport type { CveDetails } from \"../../platform/types.js\";\nimport { getIntelligenceSourceConfig } from \"../../platform/config.js\";\nimport { httpClient } from \"../../platform/http-client.js\";\n\nconst CERTCC_HOME = \"https://www.kb.cert.org/vuls/\";\n\nexport async function findCertCcReference(cveId: string): Promise<string | undefined> {\n const { certCcSearchUrl } = getIntelligenceSourceConfig();\n if (!certCcSearchUrl) return undefined;\n\n try {\n const url = new URL(certCcSearchUrl);\n url.searchParams.set(\"query\", cveId);\n\n const res = await httpClient({\n url: url.toString(),\n headers: { Accept: \"text/html\" },\n });\n if (!res.ok) return undefined;\n\n const html = res.text;\n const match = html.match(/https:\\/\\/www\\.kb\\.cert\\.org\\/vuls\\/id\\/\\d+/i);\n return match?.[0] ?? undefined;\n } catch {\n return undefined;\n }\n}\n\nexport async function enrichWithCertCc(details: CveDetails): Promise<CveDetails> {\n const ref = await findCertCcReference(details.id);\n if (!ref) return details;\n\n if (!details.references.includes(ref)) {\n details.references.push(ref);\n }\n\n details.intelligence = {\n ...details.intelligence,\n certCcMatched: true,\n };\n\n if (!details.references.includes(CERTCC_HOME)) {\n details.references.push(CERTCC_HOME);\n }\n\n return details;\n}\n","/**\n * deps.dev enrichment.\n *\n * Adds package metadata lookup coverage count for affected npm packages.\n * Uses shared HTTP client for consistent error handling and timeouts.\n */\nimport type { CveDetails } from \"../../platform/types.js\";\nimport { getIntelligenceSourceConfig } from \"../../platform/config.js\";\nimport { httpClient } from \"../../platform/http-client.js\";\n\nasync function fetchDepsDevPackage(name: string): Promise<boolean> {\n const { depsDevApi } = getIntelligenceSourceConfig();\n if (!depsDevApi) return false;\n\n try {\n const url = `${depsDevApi}/systems/npm/packages/${encodeURIComponent(name)}`;\n const res = await httpClient({ url });\n return res.ok;\n } catch {\n return false;\n }\n}\n\nexport async function enrichWithDepsDev(details: CveDetails): Promise<CveDetails> {\n const names = Array.from(new Set(details.affectedPackages.map((p) => p.name))).slice(0, 20);\n if (names.length === 0) return details;\n\n const checks = await Promise.all(names.map((name) => fetchDepsDevPackage(name)));\n const matched = checks.filter(Boolean).length;\n if (matched === 0) return details;\n\n details.intelligence = {\n ...details.intelligence,\n depsDevEnrichedPackages: matched,\n };\n return details;\n}\n","/**\n * OpenSSF Scorecard enrichment.\n *\n * Uses best-effort project checks from affected package names.\n * Uses shared HTTP client for consistent error handling and timeouts.\n */\nimport type { CveDetails } from \"../../platform/types.js\";\nimport { getIntelligenceSourceConfig } from \"../../platform/config.js\";\nimport { httpClient } from \"../../platform/http-client.js\";\n\nasync function checkProject(project: string): Promise<boolean> {\n const { scorecardApi } = getIntelligenceSourceConfig();\n if (!scorecardApi) return false;\n\n try {\n const url = new URL(`${scorecardApi}/projects`);\n url.searchParams.set(\"project\", project);\n const res = await httpClient({ url: url.toString() });\n return res.ok;\n } catch {\n return false;\n }\n}\n\nexport async function enrichWithOssfScorecard(details: CveDetails): Promise<CveDetails> {\n const projects = Array.from(\n new Set(details.affectedPackages.map((p) => `github.com/${p.name}/${p.name}`)),\n ).slice(0, 10);\n\n if (projects.length === 0) return details;\n\n const checks = await Promise.all(projects.map((project) => checkProject(project)));\n const matched = checks.filter(Boolean).length;\n if (matched === 0) return details;\n\n details.intelligence = {\n ...details.intelligence,\n scorecardProjects: matched,\n };\n\n return details;\n}\n","/**\n * Optional vendor and commercial intelligence connectors.\n *\n * Connectors are URL-based and environment configured so enterprise users can\n * plug in proprietary feeds without hard-coding dependencies.\n * Uses shared HTTP client for consistent error handling and timeouts.\n */\nimport type { CveDetails } from \"../../platform/types.js\";\nimport { getIntelligenceSourceConfig } from \"../../platform/config.js\";\nimport { httpClient } from \"../../platform/http-client.js\";\n\nasync function probeFeed(url: string, cveId: string, token?: string): Promise<string | undefined> {\n try {\n const feedUrl = new URL(url);\n\n // Block SSRF to private/loopback/link-local addresses\n const hostname = feedUrl.hostname.toLowerCase();\n if (\n hostname === \"localhost\" ||\n hostname.startsWith(\"127.\") ||\n hostname.startsWith(\"10.\") ||\n /^172\\.(1[6-9]|2\\d|3[01])\\./.test(hostname) ||\n hostname.startsWith(\"192.168.\") ||\n hostname === \"0.0.0.0\" ||\n hostname.startsWith(\"169.254.\") ||\n hostname === \"[::1]\" ||\n hostname === \"::1\"\n ) {\n return undefined;\n }\n if (feedUrl.protocol !== \"https:\" && feedUrl.protocol !== \"http:\") {\n return undefined;\n }\n\n feedUrl.searchParams.set(\"cve\", cveId);\n\n const headers: Record<string, string> = {};\n if (token) headers.Authorization = `Bearer ${token}`;\n\n const res = await httpClient({ url: feedUrl.toString(), headers });\n if (!res.ok) return undefined;\n return feedUrl.toString();\n } catch {\n return undefined;\n }\n}\n\nexport async function enrichWithExternalFeeds(details: CveDetails): Promise<CveDetails> {\n const { vendorAdvisoryFeeds, commercialFeeds, commercialFeedToken } =\n getIntelligenceSourceConfig();\n\n const vendorHits = (\n await Promise.all(vendorAdvisoryFeeds.map((url) => probeFeed(url, details.id)))\n ).filter((v): v is string => Boolean(v));\n\n const commercialHits = (\n await Promise.all(commercialFeeds.map((url) => probeFeed(url, details.id, commercialFeedToken)))\n ).filter((v): v is string => Boolean(v));\n\n if (vendorHits.length === 0 && commercialHits.length === 0) {\n return details;\n }\n\n details.intelligence = {\n ...details.intelligence,\n vendorAdvisories: vendorHits.length > 0 ? vendorHits : details.intelligence?.vendorAdvisories,\n commercialFeeds:\n commercialHits.length > 0 ? commercialHits : details.intelligence?.commercialFeeds,\n };\n\n const mergedRefs = new Set([...details.references, ...vendorHits, ...commercialHits]);\n details.references = Array.from(mergedRefs);\n\n return details;\n}\n","/**\n * Tool: check-version-match\n *\n * Cross-references inventory packages against CVE-affected package ranges\n * to find which installed packages are actually vulnerable.\n */\nimport { defineTool } from \"./tool-compat.js\";\nimport { z } from \"zod\";\nimport semver from \"semver\";\nimport type { AffectedPackage, InventoryPackage, VulnerablePackage } from \"../../platform/types.js\";\n\nconst affectedPackageSchema = z.object({\n name: z.string(),\n ecosystem: z.literal(\"npm\"),\n vulnerableRange: z.string(),\n firstPatchedVersion: z.string().optional(),\n source: z.enum([\"osv\", \"github-advisory\"]),\n});\n\nconst inventoryPackageSchema = z.object({\n name: z.string(),\n version: z.string(),\n type: z.enum([\"direct\", \"transitive\"]),\n});\n\nexport const checkVersionMatchTool = defineTool({\n description:\n \"Check which of the project's installed packages fall within the CVE's vulnerable version ranges. Returns only the packages that are actually vulnerable.\",\n parameters: z.object({\n installedPackages: z\n .array(inventoryPackageSchema)\n .describe(\"Output from the check-inventory tool\"),\n affectedPackages: z\n .array(affectedPackageSchema)\n .describe(\"affectedPackages array from the lookup-cve tool result\"),\n }),\n execute: async ({\n installedPackages,\n affectedPackages,\n }): Promise<{\n vulnerablePackages: VulnerablePackage[];\n checkedCount: number;\n }> => {\n const vulnerable: VulnerablePackage[] = [];\n\n for (const affected of affectedPackages as AffectedPackage[]) {\n // Find all installed packages with matching name\n const matches = (installedPackages as InventoryPackage[]).filter(\n (p) => p.name === affected.name,\n );\n\n for (const installed of matches) {\n // Validate the installed version is parseable\n if (!semver.valid(installed.version)) continue;\n\n let isVulnerable = false;\n try {\n isVulnerable = semver.satisfies(installed.version, affected.vulnerableRange, {\n includePrerelease: false,\n });\n } catch {\n // Malformed range — skip rather than crash\n continue;\n }\n\n if (isVulnerable) {\n vulnerable.push({ installed, affected });\n }\n }\n }\n\n return {\n vulnerablePackages: vulnerable,\n checkedCount: installedPackages.length,\n };\n },\n});\n","/**\n * Tool: find-fixed-version\n *\n * Queries the npm registry to find the best safe upgrade version\n * for a vulnerable package.\n */\nimport { defineTool } from \"./tool-compat.js\";\nimport { z } from \"zod\";\nimport semver from \"semver\";\nimport { resolveSafeUpgradeVersion } from \"../../intelligence/sources/registry.js\";\n\nexport const findFixedVersionTool = defineTool({\n description:\n \"Query the npm registry to find the safest published upgrade version for a package that is >= the first patched version. Prefer patch upgrades first, then minor, and only fall back to major when no same-major fix exists.\",\n parameters: z.object({\n packageName: z.string().describe(\"The npm package name\"),\n installedVersion: z.string().describe(\"The currently installed version (exact semver)\"),\n firstPatchedVersion: z\n .string()\n .describe(\n \"The first version that is NOT vulnerable (from lookup-cve). Use this as the floor.\",\n ),\n vulnerableRange: z\n .string()\n .optional()\n .describe(\"Optional vulnerable semver range used to exclude still-vulnerable versions\"),\n }),\n execute: async ({\n packageName,\n installedVersion,\n firstPatchedVersion,\n vulnerableRange,\n }): Promise<{\n safeVersion?: string;\n upgradeLevel?: \"patch\" | \"minor\" | \"major\";\n candidates: Partial<Record<\"patch\" | \"minor\" | \"major\", string>>;\n isMajorBump: boolean;\n majorOnlyFixAvailable: boolean;\n message: string;\n }> => {\n const resolution = await resolveSafeUpgradeVersion(\n packageName,\n installedVersion,\n firstPatchedVersion,\n vulnerableRange,\n );\n const { safeVersion, upgradeLevel, candidates, majorOnlyFixAvailable } = resolution;\n\n if (!safeVersion) {\n return {\n candidates,\n isMajorBump: false,\n majorOnlyFixAvailable: false,\n message: `No safe upgrade version found for \"${packageName}\". The patch-file path will be needed.`,\n };\n }\n\n const parsedInstalled = semver.parse(installedVersion) ?? semver.coerce(installedVersion);\n const parsedSafe = semver.parse(safeVersion) ?? semver.coerce(safeVersion);\n const isMajorBump = Boolean(\n parsedInstalled && parsedSafe && parsedSafe.major > parsedInstalled.major,\n );\n\n return {\n safeVersion,\n upgradeLevel,\n candidates,\n isMajorBump,\n majorOnlyFixAvailable,\n message: isMajorBump\n ? `Found safe version ${safeVersion} for \"${packageName}\", but only a major upgrade is available from ${installedVersion}. This should remain blocked unless policy explicitly allows major bumps.`\n : `Found ${upgradeLevel ?? \"safe\"} upgrade ${safeVersion} for \"${packageName}\" (from ${installedVersion}).`,\n };\n },\n});\n","/**\n * Tool: check-suppression\n *\n * Matches a CVE ID against the active VEX suppressions in the policy.\n * A suppression is active when its expiresAt is absent or in the future.\n */\nimport { defineTool } from \"./tool-compat.js\";\nimport { z } from \"zod\";\nimport { isActiveSuppression } from \"../../platform/policy.js\";\nimport type { VexJustification } from \"../../platform/types.js\";\n\nconst suppressionSchema = z.object({\n cveId: z.string(),\n justification: z.enum([\"not_affected\", \"fixed\", \"mitigated\", \"under_investigation\"]),\n notes: z.string().optional(),\n expiresAt: z.string().optional(),\n});\n\nexport const checkSuppressionTool = defineTool({\n description:\n \"Check whether a CVE is suppressed by an active VEX suppression entry in the policy. Returns suppressed=true and the justification if an active match is found. Call this after check-version-match.\",\n parameters: z.object({\n cveId: z.string().describe(\"The CVE ID to look up in suppressions\"),\n suppressions: z\n .array(suppressionSchema)\n .describe(\"The suppressions array from the loaded policy\"),\n }),\n execute: async ({\n cveId,\n suppressions,\n }): Promise<{\n suppressed: boolean;\n justification?: VexJustification;\n notes?: string;\n }> => {\n const match = suppressions.find((s) => s.cveId === cveId && isActiveSuppression(s));\n\n if (!match) {\n return { suppressed: false };\n }\n\n return {\n suppressed: true,\n justification: match.justification as VexJustification,\n notes: match.notes,\n };\n },\n});\n","import type { Tool } from \"ai\";\nimport { lookupCveTool } from \"./tools/lookup-cve.js\";\nimport { checkVersionMatchTool } from \"./tools/check-version-match.js\";\nimport { findFixedVersionTool } from \"./tools/find-fixed-version.js\";\nimport { fetchPackageSourceTool } from \"./tools/fetch-package-source.js\";\nimport { generatePatchTool } from \"./tools/generate-patch/index.js\";\nimport { checkSuppressionTool } from \"./tools/check-suppression.js\";\nimport { checkExploitSignalTool } from \"./tools/check-exploit-signal.js\";\nimport { checkReachabilityTool } from \"./tools/check-reachability.js\";\n\ninterface RuntimeToolLike {\n description?: string;\n parameters?: unknown;\n execute: (input: any) => Promise<unknown>;\n [key: string]: unknown;\n}\n\ninterface RuntimeToolContext {\n checkInventoryToolForRun: RuntimeToolLike;\n applyVersionBumpToolForRun: RuntimeToolLike;\n applyPackageOverrideToolForRun: RuntimeToolLike;\n applyPatchFileToolForRun: RuntimeToolLike;\n constraints: {\n directDependenciesOnly?: boolean;\n preferVersionBump?: boolean;\n workspace?: string;\n installMode?: \"standard\" | \"prefer-offline\" | \"deterministic\";\n installPreferOffline?: boolean;\n enforceFrozenLockfile?: boolean;\n };\n}\n\nexport function buildRuntimeTools(ctx: RuntimeToolContext): Record<string, Tool> {\n const tools: Record<string, Tool> = {\n \"lookup-cve\": lookupCveTool as unknown as Tool,\n \"check-inventory\": ctx.checkInventoryToolForRun as unknown as Tool,\n \"check-version-match\": checkVersionMatchTool as unknown as Tool,\n \"find-fixed-version\": findFixedVersionTool as unknown as Tool,\n \"apply-version-bump\": ctx.applyVersionBumpToolForRun as unknown as Tool,\n \"check-suppression\": checkSuppressionTool as unknown as Tool,\n \"check-exploit-signal\": checkExploitSignalTool as unknown as Tool,\n \"check-reachability\": checkReachabilityTool as unknown as Tool,\n };\n\n if (!ctx.constraints.directDependenciesOnly && !ctx.constraints.preferVersionBump) {\n tools[\"apply-package-override\"] = ctx.applyPackageOverrideToolForRun as unknown as Tool;\n }\n\n if (!ctx.constraints.preferVersionBump) {\n tools[\"fetch-package-source\"] = fetchPackageSourceTool as unknown as Tool;\n tools[\"generate-patch\"] = generatePatchTool as unknown as Tool;\n tools[\"apply-patch-file\"] = ctx.applyPatchFileToolForRun as unknown as Tool;\n }\n\n return tools;\n}\n","import { createModel, resolveProvider } from \"../../platform/config.js\";\nimport { detectPackageManager } from \"../../platform/package-manager/index.js\";\nimport type { PackageManager, RemediateOptions } from \"../../platform/types.js\";\nimport { loadOrchestrationPrompt } from \"../orchestration-prompt.js\";\nimport { createProgressEmitter } from \"./progress.js\";\nimport { createRuntimeToolsForRun } from \"./tool-wrappers.js\";\n\nexport { createProgressEmitter, createRuntimeToolsForRun };\n\nexport async function createPipelineRuntime(\n cveId: string,\n options: RemediateOptions,\n): Promise<{\n provider: \"remote\" | \"local\";\n cwd: string;\n packageManager: PackageManager;\n dryRun: boolean;\n model: Awaited<ReturnType<typeof createModel>>;\n modelName: string;\n prompt: string;\n systemPrompt: string;\n}> {\n const provider = resolveProvider(options);\n const cwd = options.cwd ?? process.cwd();\n const packageManager = options.packageManager ?? detectPackageManager(cwd);\n const preview = options.preview ?? false;\n const dryRun = (options.dryRun ?? false) || preview;\n const runTests = options.runTests ?? false;\n const policy = options.policy ?? \"\";\n const patchesDir = options.patchesDir || \"./patches\";\n const constraints = options.constraints ?? {};\n\n const prompt = `Patch vulnerable dependencies affected by ${cveId} in the project at: ${cwd}. Package manager: ${packageManager}.`;\n const model = await createModel(options, { inputChars: prompt.length });\n const modelName =\n typeof model === \"string\"\n ? model\n : \"modelId\" in model && typeof model.modelId === \"string\"\n ? model.modelId\n : \"unknown-model\";\n const systemPrompt = loadOrchestrationPrompt({\n cveId,\n cwd,\n llmProvider: provider,\n modelPersonality: options.modelPersonality,\n dryRun,\n runTests,\n policy,\n patchesDir,\n packageManager,\n constraints,\n });\n\n return {\n provider,\n cwd,\n packageManager,\n dryRun,\n model,\n modelName,\n prompt,\n systemPrompt,\n };\n}\n","import { execa } from \"execa\";\nimport { randomBytes } from \"node:crypto\";\nimport type {\n ChangeRequestGrouping,\n ChangeRequestOptions,\n ChangeRequestResult,\n RemediationReport,\n} from \"../../platform/types.js\";\n\ninterface ChangeRequestPlan {\n cveIds: string[];\n packageNames: string[];\n title: string;\n body: string;\n}\n\nfunction sanitizeBranchToken(value: string): string {\n return value\n .toLowerCase()\n .replace(/[^a-z0-9._/-]+/g, \"-\")\n .replace(/^-+|-+$/g, \"\")\n .slice(0, 80);\n}\n\nfunction buildPlan(reports: RemediationReport[]): ChangeRequestPlan {\n const cveIds = Array.from(new Set(reports.map((report) => report.cveId)));\n const packageNames = Array.from(\n new Set(reports.flatMap((report) => report.results.map((result) => result.packageName))),\n );\n\n const titleSuffix = cveIds.length === 1 ? cveIds[0]! : `${cveIds.length} CVEs`;\n const title = `security remediation: ${titleSuffix}`;\n const body = [\n \"Automated remediation generated by autoremediator.\",\n \"\",\n `CVEs: ${cveIds.join(\", \")}`,\n `Packages: ${packageNames.join(\", \")}`,\n ].join(\"\\n\");\n\n return {\n cveIds,\n packageNames,\n title,\n body,\n };\n}\n\nfunction resolveProvider(options: ChangeRequestOptions): \"github\" | \"gitlab\" {\n return options.provider ?? \"github\";\n}\n\nfunction resolveGrouping(options: ChangeRequestOptions): ChangeRequestGrouping {\n const allowed: ChangeRequestGrouping[] = [\"all\", \"per-cve\", \"per-package\", \"by-severity\"];\n if (options.grouping && !allowed.includes(options.grouping)) {\n throw new Error(\n `Unsupported changeRequest.grouping: \"${options.grouping}\". Supported values: ${allowed.join(\", \")}`,\n );\n }\n return options.grouping ?? \"all\";\n}\n\nexport function groupReports(\n reports: RemediationReport[],\n grouping: ChangeRequestGrouping,\n): RemediationReport[][] {\n if (reports.length === 0) return [];\n if (grouping === \"all\") {\n return [reports];\n }\n\n if (grouping === \"per-cve\") {\n const map = new Map<string, RemediationReport[]>();\n for (const report of reports) {\n const key = report.cveId.toUpperCase();\n const list = map.get(key) ?? [];\n list.push(report);\n map.set(key, list);\n }\n return Array.from(map.values());\n }\n\n if (grouping === \"per-package\") {\n const map = new Map<string, RemediationReport[]>();\n for (const report of reports) {\n const pkgs = new Set(report.results.map((r) => r.packageName));\n if (pkgs.size === 0) {\n const list = map.get(\"misc\") ?? [];\n list.push(report);\n map.set(\"misc\", list);\n } else {\n for (const pkg of pkgs) {\n const list = map.get(pkg) ?? [];\n list.push(report);\n map.set(pkg, list);\n }\n }\n }\n return Array.from(map.values());\n }\n\n if (grouping === \"by-severity\") {\n const map = new Map<string, RemediationReport[]>();\n for (const report of reports) {\n const sev = report.cveDetails?.severity ?? \"UNKNOWN\";\n const list = map.get(sev) ?? [];\n list.push(report);\n map.set(sev, list);\n }\n return Array.from(map.values());\n }\n\n return [reports];\n}\n\nasync function detectCurrentBranch(cwd: string): Promise<string> {\n const result = await execa(\"git\", [\"rev-parse\", \"--abbrev-ref\", \"HEAD\"], {\n cwd,\n stdio: \"pipe\",\n });\n return result.stdout.trim();\n}\n\nasync function ensureRepoHasChanges(cwd: string): Promise<boolean> {\n const diff = await execa(\"git\", [\"status\", \"--porcelain\"], {\n cwd,\n stdio: \"pipe\",\n });\n return diff.stdout.trim().length > 0;\n}\n\nfunction toBranchName(prefix: string, cveIds: string[]): string {\n const token = sanitizeBranchToken(cveIds.join(\"-\") || \"remediation\");\n return `${sanitizeBranchToken(prefix)}/${token}-${randomBytes(6).toString(\"hex\")}`;\n}\n\nasync function detectRepoFromRemote(cwd: string): Promise<string | undefined> {\n const result = await execa(\"git\", [\"config\", \"--get\", \"remote.origin.url\"], {\n cwd,\n stdio: \"pipe\",\n }).catch(() => ({ stdout: \"\" }));\n const url = result.stdout.trim();\n const match = url.match(/[:/]([^/]+)\\/([^/]+?)(?:\\.git)?$/);\n if (match) {\n return `${match[1]}/${match[2]}`;\n }\n return undefined;\n}\n\nasync function ensureRepoHasStagedChanges(cwd: string): Promise<boolean> {\n const result = await execa(\"git\", [\"diff\", \"--cached\", \"--name-only\"], {\n cwd,\n stdio: \"pipe\",\n }).catch(() => ({ stdout: \"\" }));\n return result.stdout.trim().length > 0;\n}\n\nasync function createGitHubRequest(params: {\n cwd: string;\n repository?: string;\n head: string;\n base: string;\n title: string;\n body: string;\n draft?: boolean;\n token?: string;\n githubApiUrl?: string;\n}): Promise<string | undefined> {\n const token = params.token ?? process.env.GITHUB_TOKEN ?? process.env.GH_TOKEN;\n\n let repository = params.repository;\n if (!repository) {\n repository = await detectRepoFromRemote(params.cwd);\n }\n\n if (token && repository) {\n const [owner, repo] = repository.split(\"/\");\n const baseUrl = params.githubApiUrl?.replace(/\\/+$/, \"\") || \"https://api.github.com\";\n const endpoint = `${baseUrl}/repos/${owner}/${repo}/pulls`;\n const response = await fetch(endpoint, {\n method: \"POST\",\n headers: {\n authorization: `Bearer ${token}`,\n accept: \"application/vnd.github+json\",\n \"content-type\": \"application/json\",\n \"user-agent\": \"autoremediator\",\n \"x-github-api-version\": \"2022-11-28\",\n },\n body: JSON.stringify({\n title: params.title,\n head: params.head,\n base: params.base,\n body: params.body,\n draft: Boolean(params.draft),\n }),\n });\n\n if (!response.ok) {\n const errText = await response.text().catch(() => \"\");\n throw new Error(`GitHub API create pull request failed (${response.status}): ${errText}`);\n }\n\n const data = (await response.json()) as { html_url?: string };\n return data.html_url || undefined;\n }\n\n const args = [\n \"pr\",\n \"create\",\n \"--head\",\n params.head,\n \"--base\",\n params.base,\n \"--title\",\n params.title,\n \"--body\",\n params.body,\n ];\n if (params.repository) {\n args.push(\"--repo\", params.repository);\n }\n if (params.draft) {\n args.push(\"--draft\");\n }\n\n const result = await execa(\"gh\", args, {\n cwd: params.cwd,\n stdio: \"pipe\",\n });\n return result.stdout.trim() || undefined;\n}\n\nasync function createGitLabRequest(params: {\n cwd: string;\n repository?: string;\n source: string;\n target: string;\n title: string;\n body: string;\n draft?: boolean;\n}): Promise<string | undefined> {\n const args = [\n \"mr\",\n \"create\",\n \"--source-branch\",\n params.source,\n \"--target-branch\",\n params.target,\n \"--title\",\n params.title,\n \"--description\",\n params.body,\n ];\n if (params.repository) {\n args.push(\"-R\", params.repository);\n }\n if (params.draft) {\n args.push(\"--draft\");\n }\n\n const result = await execa(\"glab\", args, {\n cwd: params.cwd,\n stdio: \"pipe\",\n });\n return result.stdout.trim() || undefined;\n}\n\nexport async function createChangeRequestsForReports(params: {\n cwd: string;\n options: ChangeRequestOptions;\n reports: RemediationReport[];\n}): Promise<ChangeRequestResult[]> {\n const { cwd, options, reports } = params;\n const provider = resolveProvider(options);\n const grouping = resolveGrouping(options);\n const groups = groupReports(reports, grouping);\n\n if (groups.length === 0) {\n return [];\n }\n\n const results: ChangeRequestResult[] = [];\n const token =\n options.token ??\n (options.tokenEnvVar ? process.env[options.tokenEnvVar] : undefined) ??\n process.env.GITHUB_TOKEN ??\n process.env.GH_TOKEN;\n\n const baseBranch = options.baseBranch ?? (await detectCurrentBranch(cwd).catch(() => \"main\"));\n const branchPrefix = options.branchPrefix ?? \"autoremediator\";\n const pushRemote = options.pushRemote ?? \"origin\";\n if (options.pushRemote && !/^[a-zA-Z0-9._-]+$/.test(options.pushRemote)) {\n throw new Error(`Invalid pushRemote value: ${options.pushRemote}`);\n }\n if (options.repository && !/^[a-zA-Z0-9._-]+\\/[a-zA-Z0-9._-]+$/.test(options.repository)) {\n throw new Error(`Invalid repository format: ${options.repository}`);\n }\n\n for (const group of groups) {\n const plan = buildPlan(group);\n const titlePrefix = options.titlePrefix?.trim().slice(0, 200);\n const bodyFooter = options.bodyFooter ? options.bodyFooter.slice(0, 2000) : undefined;\n const title = titlePrefix ? `${titlePrefix} ${plan.title}` : plan.title;\n const body = bodyFooter ? `${plan.body}\\n\\n${bodyFooter}` : plan.body;\n\n const hasChanges = await ensureRepoHasChanges(cwd).catch(() => false);\n if (!hasChanges) {\n results.push({\n provider,\n grouping,\n repository: options.repository,\n branchName: \"\",\n title,\n body,\n created: false,\n cveIds: plan.cveIds,\n packageNames: plan.packageNames,\n error: \"No repository changes to include in change request.\",\n });\n continue;\n }\n\n const branchName = toBranchName(branchPrefix, plan.cveIds);\n let branchCreated = false;\n\n try {\n await execa(\"git\", [\"checkout\", \"-b\", branchName], { cwd, stdio: \"pipe\" });\n branchCreated = true;\n await execa(\"git\", [\"add\", \"-A\"], { cwd, stdio: \"pipe\" });\n\n const hasStaged = await ensureRepoHasStagedChanges(cwd);\n if (!hasStaged) {\n results.push({\n provider,\n grouping,\n repository: options.repository,\n branchName: \"\",\n title,\n body,\n created: false,\n cveIds: plan.cveIds,\n packageNames: plan.packageNames,\n error: \"No repository changes to include in change request.\",\n });\n continue;\n }\n\n await execa(\n \"git\",\n [\n \"-c\",\n \"user.name=autoremediator[bot]\",\n \"-c\",\n \"user.email=41898282+github-actions[bot]@users.noreply.github.com\",\n \"commit\",\n \"-m\",\n title,\n ],\n { cwd, stdio: \"pipe\" },\n );\n\n const pushArgs = token\n ? [\n \"-c\",\n `http.extraheader=AUTHORIZATION: basic ${Buffer.from(`x-access-token:${token}`).toString(\"base64\")}`,\n \"push\",\n \"-u\",\n pushRemote,\n branchName,\n ]\n : [\"push\", \"-u\", pushRemote, branchName];\n await execa(\"git\", pushArgs, { cwd, stdio: \"pipe\" });\n\n const url =\n provider === \"github\"\n ? await createGitHubRequest({\n cwd,\n repository: options.repository,\n head: branchName,\n base: baseBranch,\n title,\n body,\n draft: options.draft,\n token,\n githubApiUrl: options.githubApiUrl,\n })\n : await createGitLabRequest({\n cwd,\n repository: options.repository,\n source: branchName,\n target: baseBranch,\n title,\n body,\n draft: options.draft,\n });\n\n results.push({\n provider,\n grouping,\n repository: options.repository,\n branchName,\n title,\n body,\n created: true,\n draft: options.draft,\n url,\n cveIds: plan.cveIds,\n packageNames: plan.packageNames,\n });\n } catch (error) {\n results.push({\n provider,\n grouping,\n repository: options.repository,\n branchName: \"\",\n title,\n body,\n created: false,\n draft: options.draft,\n cveIds: plan.cveIds,\n packageNames: plan.packageNames,\n error: error instanceof Error ? error.message : String(error),\n });\n } finally {\n if (branchCreated) {\n await execa(\"git\", [\"checkout\", baseBranch], { cwd, stdio: \"pipe\" }).catch(() => {});\n }\n }\n }\n\n return results;\n}\n","import type {\n CorrelationContext,\n ProvenanceContext,\n RemediateOptions,\n RemediationConstraints,\n} from \"../platform/types.js\";\nimport { loadPolicy } from \"../platform/policy.js\";\n\nfunction buildRequestId(): string {\n return `req-${Date.now()}-${Math.random().toString(36).slice(2, 8)}`;\n}\n\nexport function resolveCorrelationContext(\n options: RemediateOptions,\n): Required<Pick<CorrelationContext, \"requestId\">> & CorrelationContext {\n return {\n requestId: options.requestId ?? buildRequestId(),\n sessionId: options.sessionId,\n parentRunId: options.parentRunId,\n };\n}\n\nexport function resolveProvenanceContext(options: RemediateOptions): ProvenanceContext {\n return {\n actor: options.actor,\n source: options.source ?? \"sdk\",\n };\n}\n\nexport function resolveConstraints(options: RemediateOptions, cwd: string): RemediationConstraints {\n const policy = loadPolicy(cwd, options.policy);\n return {\n directDependenciesOnly:\n options.constraints?.directDependenciesOnly ??\n policy.constraints?.directDependenciesOnly ??\n false,\n preferVersionBump:\n options.constraints?.preferVersionBump ?? policy.constraints?.preferVersionBump ?? false,\n installMode:\n options.constraints?.installMode ?? policy.constraints?.installMode ?? \"deterministic\",\n installPreferOffline:\n options.constraints?.installPreferOffline ?? policy.constraints?.installPreferOffline,\n enforceFrozenLockfile:\n options.constraints?.enforceFrozenLockfile ?? policy.constraints?.enforceFrozenLockfile,\n workspace: options.constraints?.workspace ?? policy.constraints?.workspace,\n typecheck: options.typecheck ?? options.constraints?.typecheck ?? policy.constraints?.typecheck,\n requireProofOfFix:\n options.requireProofOfFix ??\n options.constraints?.requireProofOfFix ??\n policy.constraints?.requireProofOfFix,\n enableBreakingChangeRefactor:\n options.breakingChangeRefactor ??\n options.constraints?.enableBreakingChangeRefactor ??\n policy.constraints?.enableBreakingChangeRefactor,\n supplyChainPolicy:\n options.supplyChainPolicy ??\n options.constraints?.supplyChainPolicy ??\n policy.constraints?.supplyChainPolicy,\n };\n}\n","import { mkdirSync, writeFileSync } from \"node:fs\";\nimport { join } from \"node:path\";\nimport type {\n DependencyScopeCounts,\n DispositionCounts,\n EscalationCounts,\n PatchStrategyCounts,\n SimulationSummary,\n SlaBreachSummary,\n UnresolvedReasonCounts,\n} from \"./types.js\";\n\nexport interface EvidenceStep {\n at: string;\n action: string;\n input?: Record<string, unknown>;\n output?: Record<string, unknown>;\n error?: string;\n}\n\nexport interface EvidenceSummary {\n status: \"ok\" | \"partial\" | \"failed\";\n cveCount: number;\n remediationCount: number;\n successCount: number;\n failedCount: number;\n patchCount: number;\n patchValidationFailures?: Array<{\n packageName: string;\n cveId: string;\n error: string;\n }>;\n strategyCounts?: PatchStrategyCounts;\n unresolvedByReason?: UnresolvedReasonCounts;\n dependencyScopeCounts?: DependencyScopeCounts;\n patchesDir?: string;\n llmUsageCount?: number;\n estimatedCostUsd?: number;\n totalLlmLatencyMs?: number;\n exploitSignalCount?: number;\n slaBreachCount?: number;\n dispositionCounts?: DispositionCounts;\n escalationCounts?: EscalationCounts;\n containmentCount?: number;\n simulationSummary?: SimulationSummary;\n slaBreachSummary?: SlaBreachSummary;\n proofOfFixCount?: number;\n refactoredCount?: number;\n}\n\nexport interface EvidenceLog {\n runId: string;\n requestId?: string;\n sessionId?: string;\n parentRunId?: string;\n actor?: string;\n source?: \"cli\" | \"sdk\" | \"mcp\" | \"openapi\" | \"unknown\";\n llmProvider?: \"remote\" | \"local\";\n idempotencyKey?: string;\n offlineMode?: boolean;\n cveIds: string[];\n cwd: string;\n startedAt: string;\n finishedAt?: string;\n summary?: EvidenceSummary;\n steps: EvidenceStep[];\n}\n\ninterface EvidenceContext {\n requestId?: string;\n sessionId?: string;\n parentRunId?: string;\n actor?: string;\n source?: \"cli\" | \"sdk\" | \"mcp\" | \"openapi\" | \"unknown\";\n llmProvider?: \"remote\" | \"local\";\n idempotencyKey?: string;\n offlineMode?: boolean;\n}\n\nexport function createEvidenceLog(\n cwd: string,\n cveIds: string[],\n context: EvidenceContext = {},\n): EvidenceLog {\n return {\n runId: `${Date.now()}-${Math.random().toString(36).slice(2, 8)}`,\n requestId: context.requestId,\n sessionId: context.sessionId,\n parentRunId: context.parentRunId,\n actor: context.actor,\n source: context.source,\n llmProvider: context.llmProvider,\n idempotencyKey: context.idempotencyKey,\n offlineMode: context.offlineMode,\n cveIds,\n cwd,\n startedAt: new Date().toISOString(),\n steps: [],\n };\n}\n\nexport function addEvidenceStep(\n log: EvidenceLog,\n action: string,\n input?: Record<string, unknown>,\n output?: Record<string, unknown>,\n error?: string,\n): void {\n log.steps.push({\n at: new Date().toISOString(),\n action,\n input,\n output,\n error,\n });\n}\n\nexport function finalizeEvidence(log: EvidenceLog): EvidenceLog {\n log.finishedAt = new Date().toISOString();\n return log;\n}\n\nexport function writeEvidenceLog(cwd: string, log: EvidenceLog): string {\n const dir = join(cwd, \".autoremediator\", \"evidence\");\n mkdirSync(dir, { recursive: true });\n const filePath = join(dir, `${log.runId}.json`);\n writeFileSync(filePath, JSON.stringify(log, null, 2) + \"\\n\", \"utf8\");\n return filePath;\n}\n","import type { RemediateOptions, RemediationReport } from \"../platform/types.js\";\nimport {\n addEvidenceStep,\n createEvidenceLog,\n finalizeEvidence,\n type EvidenceLog,\n writeEvidenceLog,\n} from \"../platform/evidence.js\";\n\nexport function createRemediateEvidence(params: {\n cwd: string;\n cveId: string;\n options: RemediateOptions;\n llmProvider: \"remote\" | \"local\";\n correlation: { requestId?: string; sessionId?: string; parentRunId?: string };\n provenance: { actor?: string; source?: \"cli\" | \"sdk\" | \"mcp\" | \"openapi\" | \"unknown\" };\n}): EvidenceLog | undefined {\n if (params.options.evidence === false) {\n return undefined;\n }\n\n return createEvidenceLog(params.cwd, [params.cveId], {\n ...params.correlation,\n actor: params.provenance.actor,\n source: params.provenance.source,\n llmProvider: params.llmProvider,\n idempotencyKey: params.options.idempotencyKey,\n offlineMode: params.options.offlineIntelligence === true ? true : undefined,\n });\n}\n\nexport function addRemediateStartStep(params: {\n evidence: EvidenceLog | undefined;\n cveId: string;\n options: RemediateOptions;\n llmProvider: \"remote\" | \"local\";\n constraints: { directDependenciesOnly?: boolean; preferVersionBump?: boolean };\n}): void {\n if (!params.evidence) {\n return;\n }\n\n addEvidenceStep(\n params.evidence,\n \"remediate.start\",\n {\n cveId: params.cveId,\n dryRun: Boolean(params.options.dryRun),\n preview: Boolean(params.options.preview),\n simulationMode: Boolean(params.options.simulationMode),\n llmProvider: params.llmProvider,\n },\n {\n directDependenciesOnly: Boolean(params.constraints.directDependenciesOnly),\n preferVersionBump: Boolean(params.constraints.preferVersionBump),\n },\n );\n}\n\nexport function addRemediateResultSteps(\n evidence: EvidenceLog | undefined,\n cveId: string,\n report: RemediationReport,\n): void {\n if (!evidence) {\n return;\n }\n\n for (const result of report.results) {\n addEvidenceStep(\n evidence,\n \"remediate.package-result\",\n {\n packageName: result.packageName,\n strategy: result.strategy,\n fromVersion: result.fromVersion,\n toVersion: result.toVersion,\n },\n {\n applied: result.applied,\n dryRun: result.dryRun,\n unresolvedReason: result.unresolvedReason,\n reachability: result.reachability?.status,\n hasAlternatives: Boolean(result.alternativeSuggestions?.length),\n suppressedBy: result.suppressedBy?.justification,\n regressionDetected: result.regressionDetected,\n simulationWouldMutate: result.simulation?.wouldMutate,\n simulationRebuttalCount: result.simulation?.rebuttalFindings.length,\n },\n );\n }\n\n const containmentCount = report.results.filter(\n (result) => result.unresolvedReason === \"policy-blocked\" && result.disposition === \"escalate\",\n ).length;\n\n if (containmentCount > 0) {\n addEvidenceStep(\n evidence,\n \"containment-summary\",\n { cveId },\n {\n containmentCount,\n blockedUnresolvedReason: \"policy-blocked\",\n blockedDisposition: \"escalate\",\n },\n );\n }\n\n addEvidenceStep(\n evidence,\n \"remediate.finish\",\n { cveId },\n {\n resultCount: report.results.length,\n vulnerableCount: report.vulnerablePackages.length,\n llmUsage: report.llmUsage,\n exploitSignalTriggered: report.exploitSignalTriggered ?? false,\n slaBreachCount: report.slaBreaches?.length ?? 0,\n regressionDetectedCount: report.results.filter((r) => r.regressionDetected).length,\n containmentCount,\n sbomEntryCount: report.sbom?.length ?? 0,\n simulationSummary: report.simulationSummary,\n },\n );\n finalizeEvidence(evidence);\n}\n\nexport function addRemediateDispositionStep(\n evidence: EvidenceLog | undefined,\n cveId: string,\n report: RemediationReport,\n): void {\n if (!evidence) {\n return;\n }\n\n const byCveId: Record<\n string,\n Record<string, { disposition: string; dispositionReason?: string }>\n > = {};\n\n for (const result of report.results) {\n if (!result.disposition) continue;\n if (!byCveId[cveId]) {\n byCveId[cveId] = {};\n }\n byCveId[cveId][result.packageName] = {\n disposition: result.disposition,\n dispositionReason: result.dispositionReason,\n };\n }\n\n if (Object.keys(byCveId).length === 0) {\n return;\n }\n\n addEvidenceStep(evidence, \"disposition-summary\", { cveId }, { byCveId });\n}\n\nexport function addRemediateErrorStep(\n evidence: EvidenceLog | undefined,\n cveId: string,\n error: unknown,\n): void {\n if (!evidence) {\n return;\n }\n\n const message = error instanceof Error ? error.message : String(error);\n addEvidenceStep(evidence, \"remediate.error\", { cveId }, undefined, message);\n finalizeEvidence(evidence);\n}\n\nexport function addRemediateResumeStep(evidence: EvidenceLog | undefined, cveId: string): void {\n if (!evidence) {\n return;\n }\n addEvidenceStep(evidence, \"remediate.resume-cache\", { cveId });\n finalizeEvidence(evidence);\n}\n\nexport function writeRemediateEvidence(\n cwd: string,\n evidence: EvidenceLog | undefined,\n): string | undefined {\n return evidence ? writeEvidenceLog(cwd, evidence) : undefined;\n}\n","export const CVE_ID_REGEX = /^CVE-\\d{4}-\\d{1,7}$/i;\nexport const GHSA_ID_REGEX = /^GHSA-[a-z0-9]{4}-[a-z0-9]{4}-[a-z0-9]{4}$/i;\n\nexport function isVulnerabilityId(id: string): boolean {\n return CVE_ID_REGEX.test(id) || GHSA_ID_REGEX.test(id);\n}\n\nexport function assertValidCveId(cveId: string): void {\n if (!isVulnerabilityId(cveId)) {\n throw new Error(\n `Invalid vulnerability ID: \"${cveId}\". Expected format: CVE-YYYY-NNNNN (e.g. CVE-2021-23337) or GHSA-xxxx-xxxx-xxxx.`,\n );\n }\n}\n","import { resolveProvider } from \"../../platform/config.js\";\nimport { readIdempotentReport, storeIdempotentReport } from \"../../platform/idempotency.js\";\nimport type { RemediateOptions, RemediationReport } from \"../../platform/types.js\";\nimport { runRemediationPipeline } from \"../../remediation/pipeline.js\";\nimport { createChangeRequestsForReports } from \"../change-request/index.js\";\nimport {\n resolveConstraints,\n resolveCorrelationContext,\n resolveProvenanceContext,\n} from \"../context.js\";\nimport {\n addRemediateDispositionStep,\n addRemediateErrorStep,\n addRemediateResultSteps,\n addRemediateResumeStep,\n addRemediateStartStep,\n createRemediateEvidence,\n writeRemediateEvidence,\n} from \"../remediate.evidence.js\";\nimport { applySimulationMetadata, assertValidSimulationMode } from \"../reporting.js\";\nimport { assertValidCveId } from \"./validators.js\";\n\nexport async function remediate(\n cveId: string,\n options: RemediateOptions = {},\n): Promise<RemediationReport> {\n assertValidCveId(cveId);\n assertValidSimulationMode(options);\n\n const normalizedCveId = cveId.toUpperCase();\n const cwd = options.cwd ?? process.cwd();\n const constraints = resolveConstraints(options, cwd);\n const provenance = resolveProvenanceContext(options);\n const correlation = resolveCorrelationContext(options);\n const llmProvider = resolveProvider(options);\n const evidence = createRemediateEvidence({\n cwd,\n cveId: normalizedCveId,\n options,\n llmProvider,\n correlation,\n provenance,\n });\n\n if (options.resume && options.idempotencyKey) {\n const cached = readIdempotentReport(cwd, options.idempotencyKey, normalizedCveId);\n if (cached) {\n addRemediateResumeStep(evidence, normalizedCveId);\n const evidenceFile = writeRemediateEvidence(cwd, evidence);\n return {\n ...cached,\n summary: `${cached.summary} (resumed from idempotency cache)`,\n evidenceFile,\n correlation,\n provenance,\n constraints,\n resumedFromCache: true,\n };\n }\n }\n\n addRemediateStartStep({\n evidence,\n cveId: normalizedCveId,\n options,\n llmProvider,\n constraints,\n });\n\n let report: RemediationReport;\n try {\n report = await runRemediationPipeline(normalizedCveId, {\n ...options,\n ...correlation,\n constraints,\n });\n } catch (error) {\n addRemediateErrorStep(evidence, normalizedCveId, error);\n writeRemediateEvidence(cwd, evidence);\n throw error;\n }\n\n report = applySimulationMetadata(report, options);\n\n addRemediateResultSteps(evidence, normalizedCveId, report);\n addRemediateDispositionStep(evidence, normalizedCveId, report);\n\n const evidenceFile = writeRemediateEvidence(cwd, evidence);\n\n const finalReport: RemediationReport = {\n ...report,\n evidenceFile,\n correlation,\n provenance,\n constraints,\n resumedFromCache: false,\n };\n\n if (options.changeRequest?.enabled) {\n finalReport.changeRequests = await createChangeRequestsForReports({\n cwd,\n options: options.changeRequest,\n reports: [finalReport],\n });\n }\n\n if (options.idempotencyKey && !options.dryRun && !options.preview) {\n storeIdempotentReport(cwd, options.idempotencyKey, normalizedCveId, finalReport);\n }\n\n return finalReport;\n}\n\nexport async function planRemediation(\n cveId: string,\n options: RemediateOptions = {},\n): Promise<RemediationReport> {\n if (Object.hasOwn(options, \"dryRun\") || Object.hasOwn(options, \"preview\")) {\n throw new Error(\n \"planRemediation always runs with dryRun=true and preview=true. Remove dryRun/preview from options.\",\n );\n }\n\n return remediate(cveId, {\n ...options,\n preview: true,\n dryRun: true,\n });\n}\n","import { extname, resolve } from \"node:path\";\nimport { readFileSync } from \"node:fs\";\nimport { execa } from \"execa\";\nimport { parseNpmAuditJsonFile, type NormalizedFinding } from \"./adapters/npm-audit.js\";\nimport { parseNpmAuditJsonFromString } from \"./adapters/npm-audit.js\";\nimport { parseYarnAuditJsonFile } from \"./adapters/yarn-audit.js\";\nimport { parseYarnAuditJsonFromString } from \"./adapters/yarn-audit.js\";\nimport { parseSarifFile } from \"./adapters/sarif.js\";\nimport type { ScanInputFormat } from \"./index.js\";\nimport {\n detectPackageManager,\n resolveAuditCommand,\n type PackageManager,\n} from \"../platform/package-manager/index.js\";\n\nexport function parseScanInput(filePath: string, format: ScanInputFormat): NormalizedFinding[] {\n // Reject null bytes to prevent path injection attacks\n if (filePath.includes(\"\\0\")) {\n throw new Error(\"Invalid scan input path: path contains null bytes\");\n }\n const resolvedPath = resolve(filePath);\n const resolved = format === \"auto\" ? inferFormat(resolvedPath) : format;\n\n if (resolved === \"npm-audit\") {\n return parseNpmAuditJsonFile(resolvedPath);\n }\n if (resolved === \"yarn-audit\") {\n return parseYarnAuditJsonFile(resolvedPath);\n }\n if (resolved === \"sarif\") {\n return parseSarifFile(resolvedPath);\n }\n\n throw new Error(`Unsupported input format: ${String(resolved)}`);\n}\n\nexport async function parseScanInputFromAudit(params: {\n cwd: string;\n packageManager?: PackageManager;\n format: ScanInputFormat;\n workspace?: string;\n}): Promise<NormalizedFinding[]> {\n const pm = params.packageManager ?? detectPackageManager(params.cwd);\n const resolved = params.format === \"auto\" ? defaultAuditFormat(pm) : params.format;\n\n ensureAuditFormatCompatibility(pm, resolved);\n\n if (resolved === \"sarif\") {\n throw new Error(\"SARIF format is not supported with --audit mode.\");\n }\n\n const command = resolveAuditCommand(pm, { workspace: params.workspace });\n const [cmd, ...args] = command;\n\n const result = await execa(cmd, args, {\n cwd: params.cwd,\n stdio: \"pipe\",\n reject: false,\n });\n\n const output = [result.stdout, result.stderr].filter(Boolean).join(\"\\n\");\n if (!output.trim()) {\n throw new Error(`No audit output received from ${command.join(\" \")}.`);\n }\n\n try {\n const findings =\n resolved === \"yarn-audit\"\n ? parseYarnAuditJsonFromString(output)\n : parseNpmAuditJsonFromString(output);\n\n if ((result.exitCode ?? 0) !== 0 && findings.length === 0) {\n throw new Error(\"audit command returned non-zero exit without parseable findings\");\n }\n\n return findings;\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n const exit = (result.exitCode ?? 0) !== 0 ? ` (exit code ${result.exitCode})` : \"\";\n throw new Error(\n `Failed to parse output from ${command.join(\" \")}${exit} as ${resolved}: ${message}`,\n );\n }\n}\n\nfunction defaultAuditFormat(pm: PackageManager): Exclude<ScanInputFormat, \"auto\" | \"sarif\"> {\n if (pm === \"yarn\") return \"yarn-audit\";\n if (pm === \"deno\") {\n throw new Error(\n \"Deno does not support a native audit command. Use --input with a SARIF or npm-audit scan file instead.\",\n );\n }\n return \"npm-audit\";\n}\n\nfunction ensureAuditFormatCompatibility(\n pm: PackageManager,\n resolved: Exclude<ScanInputFormat, \"auto\">,\n): void {\n if (resolved === \"sarif\") return;\n\n if (pm === \"deno\") {\n throw new Error(\n \"Deno does not support a native audit command. Use --input with a SARIF or npm-audit scan file instead.\",\n );\n }\n\n if (pm === \"yarn\" && resolved !== \"yarn-audit\") {\n throw new Error(\n 'Format \"npm-audit\" is not supported with package manager \"yarn\" in --audit mode. Use --format yarn-audit or --format auto.',\n );\n }\n\n if (pm !== \"yarn\" && resolved !== \"npm-audit\") {\n throw new Error(\n `Format \"${resolved}\" is not supported with package manager \"${pm}\" in --audit mode. Use --format npm-audit or --format auto.`,\n );\n }\n}\n\nfunction inferFormat(filePath: string): Exclude<ScanInputFormat, \"auto\"> {\n const ext = extname(filePath).toLowerCase();\n if (ext === \".sarif\") return \"sarif\";\n\n try {\n const content = readFileSync(filePath, \"utf8\");\n const firstLine = content.split(\"\\n\").find((line) => line.trim().startsWith(\"{\"));\n if (firstLine) {\n const parsed = JSON.parse(firstLine) as { type?: string };\n if (parsed.type === \"auditAdvisory\" || parsed.type === \"auditSummary\") {\n return \"yarn-audit\";\n }\n }\n } catch {\n // Ignore parse failures and fall back to npm-audit.\n }\n\n return \"npm-audit\";\n}\n","import { readFileSync } from \"node:fs\";\nimport type { CveSeverity } from \"../../platform/types.js\";\n\nexport interface NormalizedFinding {\n cveId: string;\n source: \"npm-audit\" | \"yarn-audit\" | \"sarif\";\n packageName?: string;\n severity?: CveSeverity;\n}\n\ninterface NpmAuditVulnerability {\n name: string;\n via: Array<\n | string\n | {\n source?: number;\n name?: string;\n url?: string;\n severity?: string;\n cwe?: string[];\n cvss?: { score?: number };\n }\n >;\n severity?: string;\n}\n\ninterface NpmAuditReport {\n vulnerabilities?: Record<string, NpmAuditVulnerability>;\n}\n\nconst CVE_REGEX = /CVE-\\d{4}-\\d{1,7}/gi;\nconst GHSA_REGEX = /GHSA-[a-z0-9]{4}-[a-z0-9]{4}-[a-z0-9]{4}/gi;\n\nfunction normalizeSeverity(raw?: string): NormalizedFinding[\"severity\"] {\n if (!raw) return \"UNKNOWN\";\n const up = raw.toUpperCase();\n if (up === \"CRITICAL\" || up === \"HIGH\" || up === \"LOW\") return up;\n if (up === \"MEDIUM\" || up === \"MODERATE\") return \"MEDIUM\";\n return \"UNKNOWN\";\n}\n\nexport function parseNpmAuditJsonFromString(content: string): NormalizedFinding[] {\n const report = JSON.parse(content) as NpmAuditReport;\n const findings: NormalizedFinding[] = [];\n const seen = new Set<string>();\n\n for (const vuln of Object.values(report.vulnerabilities ?? {})) {\n for (const viaEntry of vuln.via ?? []) {\n const text =\n typeof viaEntry === \"string\" ? viaEntry : `${viaEntry.url ?? \"\"} ${viaEntry.name ?? \"\"}`;\n const cveMatches = text.match(CVE_REGEX) ?? [];\n const matches = cveMatches.length > 0 ? cveMatches : (text.match(GHSA_REGEX) ?? []);\n for (const match of matches) {\n const cveId = match.toUpperCase();\n const key = `${cveId}:${vuln.name}`;\n if (seen.has(key)) continue;\n seen.add(key);\n findings.push({\n cveId,\n source: \"npm-audit\",\n packageName: vuln.name,\n severity: normalizeSeverity(vuln.severity),\n });\n }\n }\n }\n\n return findings;\n}\n\nexport function parseNpmAuditJsonFile(filePath: string): NormalizedFinding[] {\n const content = readFileSync(filePath, \"utf8\");\n return parseNpmAuditJsonFromString(content);\n}\n","import { readFileSync } from \"node:fs\";\nimport type { NormalizedFinding } from \"./npm-audit.js\";\n\nconst CVE_REGEX = /CVE-\\d{4}-\\d{1,7}/gi;\nconst GHSA_REGEX = /GHSA-[a-z0-9]{4}-[a-z0-9]{4}-[a-z0-9]{4}/gi;\n\nfunction normalizeSeverity(raw?: string): NormalizedFinding[\"severity\"] {\n if (!raw) return \"UNKNOWN\";\n const up = raw.toUpperCase();\n if (up === \"CRITICAL\" || up === \"HIGH\" || up === \"LOW\") return up;\n if (up === \"MEDIUM\" || up === \"MODERATE\") return \"MEDIUM\";\n return \"UNKNOWN\";\n}\n\nexport function parseYarnAuditJsonFromString(content: string): NormalizedFinding[] {\n const findings: NormalizedFinding[] = [];\n const seen = new Set<string>();\n\n const lines = content\n .split(\"\\n\")\n .map((line) => line.trim())\n .filter(Boolean);\n\n for (const line of lines) {\n let parsed: unknown;\n try {\n parsed = JSON.parse(line);\n } catch {\n continue;\n }\n\n const event = parsed as {\n type?: string;\n data?: {\n advisory?: {\n module_name?: string;\n severity?: string;\n url?: string;\n cves?: string[];\n };\n };\n };\n\n if (event.type !== \"auditAdvisory\") continue;\n\n const advisory = event.data?.advisory;\n const packageName = advisory?.module_name;\n const severity = normalizeSeverity(advisory?.severity);\n\n const text = `${advisory?.url ?? \"\"} ${(advisory?.cves ?? []).join(\" \")}`;\n const cveMatches = text.match(CVE_REGEX) ?? [];\n const matches = cveMatches.length > 0 ? cveMatches : (text.match(GHSA_REGEX) ?? []);\n\n for (const match of matches) {\n const cveId = match.toUpperCase();\n const key = `${cveId}:${packageName ?? \"\"}`;\n if (seen.has(key)) continue;\n seen.add(key);\n\n findings.push({\n cveId,\n source: \"yarn-audit\",\n packageName,\n severity,\n });\n }\n }\n\n return findings;\n}\n\nexport function parseYarnAuditJsonFile(filePath: string): NormalizedFinding[] {\n const content = readFileSync(filePath, \"utf8\");\n return parseYarnAuditJsonFromString(content);\n}\n","import { readFileSync } from \"node:fs\";\nimport type { NormalizedFinding } from \"./npm-audit.js\";\n\ninterface SarifResult {\n ruleId?: string;\n message?: { text?: string };\n properties?: Record<string, unknown>;\n}\n\ninterface SarifRun {\n results?: SarifResult[];\n}\n\ninterface SarifReport {\n runs?: SarifRun[];\n}\n\nconst CVE_REGEX = /CVE-\\d{4}-\\d{1,7}/gi;\n\nfunction extractPackageName(result: SarifResult): string | undefined {\n const pkg = result.properties?.[\"packageName\"];\n return typeof pkg === \"string\" ? pkg : undefined;\n}\n\nexport function parseSarifFromString(content: string): NormalizedFinding[] {\n const report = JSON.parse(content) as SarifReport;\n const findings: NormalizedFinding[] = [];\n const seen = new Set<string>();\n\n const MAX_RUNS = 100;\n const MAX_TOTAL_RESULTS = 10_000;\n let totalResults = 0;\n\n for (const run of (report.runs ?? []).slice(0, MAX_RUNS)) {\n for (const result of run.results ?? []) {\n if (totalResults++ >= MAX_TOTAL_RESULTS) break;\n const ruleId = (result.ruleId ?? \"\").slice(0, 1024);\n const messageText = (result.message?.text ?? \"\").slice(0, 4096);\n const combined = `${ruleId} ${messageText}`;\n const matches = combined.match(CVE_REGEX) ?? [];\n for (const match of matches) {\n const cveId = match.toUpperCase();\n const pkg = extractPackageName(result);\n const key = `${cveId}:${pkg ?? \"\"}`;\n if (seen.has(key)) continue;\n seen.add(key);\n findings.push({\n cveId,\n source: \"sarif\",\n packageName: pkg,\n severity: \"UNKNOWN\",\n });\n }\n }\n }\n\n return findings;\n}\n\nexport function parseSarifFile(filePath: string): NormalizedFinding[] {\n const content = readFileSync(filePath, \"utf8\");\n return parseSarifFromString(content);\n}\n","import type { NormalizedFinding } from \"./adapters/npm-audit.js\";\n\nexport function uniqueCveIds(findings: NormalizedFinding[]): string[] {\n return [...new Set(findings.map((f) => f.cveId.toUpperCase()))];\n}\n","import type { RemediationReport } from \"../platform/types.js\";\nimport type { ProvenanceContext } from \"../platform/types.js\";\nimport { addEvidenceStep } from \"../platform/evidence.js\";\nimport type { EvidenceLog } from \"../platform/evidence.js\";\nimport type { AutoremediatorPolicy } from \"../platform/policy.js\";\nimport type { ScanOptions } from \"./contracts.js\";\nimport { remediate } from \"./remediate/index.js\";\n\nexport interface ScanExecutionResult {\n reports: RemediationReport[];\n errors: Array<{ cveId: string; message: string }>;\n patchCount: number;\n patchValidationFailures: Array<{\n packageName: string;\n cveId: string;\n error: string;\n }>;\n}\n\nexport async function executeScanRemediations(params: {\n cveIds: string[];\n options: ScanOptions;\n patchesDir: string;\n policy: AutoremediatorPolicy;\n correlation: { requestId: string; sessionId?: string; parentRunId?: string };\n provenance: ProvenanceContext;\n constraints: { directDependenciesOnly?: boolean; preferVersionBump?: boolean };\n evidence: EvidenceLog;\n}): Promise<ScanExecutionResult> {\n const reports: RemediationReport[] = [];\n const errors: Array<{ cveId: string; message: string }> = [];\n const patchValidationFailures: Array<{\n packageName: string;\n cveId: string;\n error: string;\n }> = [];\n let patchCount = 0;\n\n for (const cveId of params.cveIds) {\n try {\n addEvidenceStep(params.evidence, \"remediate.start\", { cveId });\n const report = await remediate(cveId, {\n ...params.options,\n patchesDir: params.patchesDir,\n evidence: false,\n ...params.correlation,\n actor: params.provenance.actor,\n source: params.provenance.source,\n constraints: params.constraints,\n });\n\n for (const result of report.results) {\n if (result.strategy === \"patch-file\") {\n patchCount += 1;\n }\n if (result.validation?.passed === false && result.validation?.error) {\n patchValidationFailures.push({\n packageName: result.packageName,\n cveId,\n error: result.validation.error,\n });\n }\n }\n\n reports.push(report);\n addEvidenceStep(\n params.evidence,\n \"remediate.finish\",\n { cveId },\n { results: report.results.length },\n );\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n errors.push({ cveId, message });\n addEvidenceStep(params.evidence, \"remediate.error\", { cveId }, undefined, message);\n }\n }\n\n return {\n reports,\n errors,\n patchCount,\n patchValidationFailures,\n };\n}\n","import type { RemediationReport } from \"../platform/types.js\";\nimport type { ScanReport } from \"./contracts.js\";\nimport {\n buildDependencyScopeCounts,\n buildDispositionCounts,\n buildSimulationSummary,\n buildStrategyCounts,\n buildUnresolvedReasonCounts,\n} from \"./reporting.js\";\n\nexport interface ScanOutcome {\n status: ScanReport[\"status\"];\n successCount: number;\n failedCount: number;\n strategyCounts: ReturnType<typeof buildStrategyCounts>;\n dependencyScopeCounts: ReturnType<typeof buildDependencyScopeCounts>;\n unresolvedByReason: ReturnType<typeof buildUnresolvedReasonCounts>;\n dispositionCounts: ReturnType<typeof buildDispositionCounts>;\n simulationSummary: ReturnType<typeof buildSimulationSummary>;\n remediationCount: number;\n}\n\nexport function buildScanOutcome(params: {\n reports: RemediationReport[];\n errors: Array<{ cveId: string; message: string }>;\n}): ScanOutcome {\n let successCount = 0;\n let failedCount = 0;\n for (const report of params.reports) {\n for (const result of report.results) {\n if (result.applied || result.dryRun) {\n successCount += 1;\n } else {\n failedCount += 1;\n }\n }\n }\n\n failedCount += params.errors.length;\n\n let status: ScanReport[\"status\"] = \"ok\";\n if (failedCount > 0 && successCount > 0) {\n status = \"partial\";\n } else if (failedCount > 0 && successCount === 0) {\n status = \"failed\";\n }\n\n const strategyCounts = buildStrategyCounts(params.reports);\n const dependencyScopeCounts = buildDependencyScopeCounts(params.reports);\n const unresolvedByReason = buildUnresolvedReasonCounts(params.reports);\n const dispositionCounts = buildDispositionCounts(params.reports);\n const simulationSummary = buildSimulationSummary(params.reports);\n const remediationCount = params.reports.reduce((sum, report) => sum + report.results.length, 0);\n\n return {\n status,\n successCount,\n failedCount,\n strategyCounts,\n dependencyScopeCounts,\n unresolvedByReason,\n dispositionCounts,\n simulationSummary,\n remediationCount,\n };\n}\n","import type { RemediationReport } from \"../../platform/types.js\";\n\nexport interface ScanLlmUsageTotals {\n llmUsageCount: number;\n estimatedCostUsd?: number;\n totalLlmLatencyMs?: number;\n}\n\nexport function aggregateScanLlmUsage(reports: RemediationReport[]): ScanLlmUsageTotals {\n let llmUsageCount = 0;\n let estimatedCostUsd = 0;\n let totalLlmLatencyMs = 0;\n\n for (const report of reports) {\n for (const usage of report.llmUsage ?? []) {\n llmUsageCount += 1;\n estimatedCostUsd += usage.estimatedCostUsd ?? 0;\n totalLlmLatencyMs += usage.latencyMs ?? 0;\n }\n }\n\n return {\n llmUsageCount,\n estimatedCostUsd: llmUsageCount > 0 ? Number(estimatedCostUsd.toFixed(6)) : undefined,\n totalLlmLatencyMs: llmUsageCount > 0 ? totalLlmLatencyMs : undefined,\n };\n}\n","import type { RemediationReport } from \"../../platform/types.js\";\nimport { resolveProvider } from \"../../platform/config.js\";\nimport {\n addEvidenceStep,\n createEvidenceLog,\n finalizeEvidence,\n writeEvidenceLog,\n} from \"../../platform/evidence.js\";\nimport { loadPolicy } from \"../../platform/policy.js\";\nimport { parseScanInput, parseScanInputFromAudit, uniqueCveIds } from \"../../scanner/index.js\";\nimport type { ScanOptions, ScanReport } from \"../contracts.js\";\nimport { createChangeRequestsForReports } from \"../change-request/index.js\";\nimport {\n resolveConstraints,\n resolveCorrelationContext,\n resolveProvenanceContext,\n} from \"../context.js\";\nimport { executeScanRemediations } from \"../scan-execution.js\";\nimport { buildScanOutcome } from \"../scan-outcome.js\";\nimport { aggregateScanLlmUsage } from \"./report-metrics.js\";\nimport {\n assertValidSimulationMode,\n buildEscalationCounts,\n buildSlaBreachSummary,\n} from \"../reporting.js\";\n\nfunction countContainedResults(reports: RemediationReport[]): number {\n let containmentCount = 0;\n for (const report of reports) {\n for (const result of report.results) {\n if (result.unresolvedReason === \"policy-blocked\" && result.disposition === \"escalate\") {\n containmentCount += 1;\n }\n }\n }\n return containmentCount;\n}\n\nexport async function remediateFromScan(\n inputPath: string,\n options: ScanOptions = {},\n): Promise<ScanReport> {\n assertValidSimulationMode(options);\n const cwd = options.cwd ?? process.cwd();\n\n const policy = loadPolicy(cwd, options.policy);\n const format = options.format ?? \"auto\";\n const patchesDir = options.patchesDir ?? \"./patches\";\n const audit = options.audit ?? false;\n const workspace = options.constraints?.workspace ?? policy.constraints?.workspace;\n\n const findings = audit\n ? await parseScanInputFromAudit({\n cwd,\n packageManager: options.packageManager,\n format,\n workspace,\n })\n : parseScanInput(inputPath, format);\n const cveIds = uniqueCveIds(findings);\n const llmProvider = resolveProvider(options);\n const correlation = resolveCorrelationContext(options);\n const provenance = resolveProvenanceContext(options);\n const constraints = resolveConstraints(options, cwd);\n\n const evidence = createEvidenceLog(cwd, cveIds, {\n ...correlation,\n actor: provenance.actor,\n source: provenance.source,\n llmProvider,\n idempotencyKey: options.idempotencyKey,\n });\n addEvidenceStep(\n evidence,\n \"scan.parse\",\n { inputPath, format, audit },\n { findingCount: findings.length, cveCount: cveIds.length },\n );\n\n const execution = await executeScanRemediations({\n cveIds,\n options,\n patchesDir,\n policy,\n correlation,\n provenance,\n constraints,\n evidence,\n });\n const reports: RemediationReport[] = execution.reports;\n const { errors, patchCount, patchValidationFailures } = execution;\n const containmentCount = countContainedResults(reports);\n const escalationCounts = buildEscalationCounts(reports.flatMap((report) => report.results));\n\n const llmUsageTotals = aggregateScanLlmUsage(reports);\n const outcome = buildScanOutcome({ reports, errors });\n const {\n status,\n successCount,\n failedCount,\n strategyCounts,\n dependencyScopeCounts,\n unresolvedByReason,\n dispositionCounts,\n simulationSummary,\n remediationCount,\n } = outcome;\n\n evidence.summary = {\n status,\n cveCount: cveIds.length,\n remediationCount,\n successCount,\n failedCount,\n patchCount,\n patchValidationFailures:\n patchValidationFailures.length > 0 ? patchValidationFailures : undefined,\n strategyCounts,\n dependencyScopeCounts,\n unresolvedByReason,\n dispositionCounts,\n escalationCounts,\n containmentCount,\n simulationSummary,\n slaBreachSummary: buildSlaBreachSummary(reports),\n patchesDir: patchCount > 0 ? patchesDir : undefined,\n llmUsageCount: llmUsageTotals.llmUsageCount > 0 ? llmUsageTotals.llmUsageCount : undefined,\n estimatedCostUsd: llmUsageTotals.estimatedCostUsd,\n totalLlmLatencyMs: llmUsageTotals.totalLlmLatencyMs,\n };\n\n finalizeEvidence(evidence);\n const evidenceFile = options.evidence === false ? undefined : writeEvidenceLog(cwd, evidence);\n\n const changeRequests = options.changeRequest?.enabled\n ? await createChangeRequestsForReports({\n cwd,\n options: options.changeRequest,\n reports,\n })\n : undefined;\n\n return {\n schemaVersion: \"1.0\",\n status,\n generatedAt: new Date().toISOString(),\n cveIds,\n reports,\n successCount,\n failedCount,\n errors,\n evidenceFile,\n patchCount,\n patchValidationFailures:\n patchValidationFailures.length > 0 ? patchValidationFailures : undefined,\n strategyCounts,\n dependencyScopeCounts,\n unresolvedByReason,\n dispositionCounts,\n escalationCounts,\n patchesDir: patchCount > 0 ? patchesDir : undefined,\n correlation,\n provenance,\n constraints,\n idempotencyKey: options.idempotencyKey,\n llmUsageCount: llmUsageTotals.llmUsageCount > 0 ? llmUsageTotals.llmUsageCount : undefined,\n estimatedCostUsd: llmUsageTotals.estimatedCostUsd,\n totalLlmLatencyMs: llmUsageTotals.totalLlmLatencyMs,\n changeRequests,\n simulationSummary,\n slaBreachSummary: buildSlaBreachSummary(reports),\n };\n}\n","import type { PortfolioTarget } from \"../../platform/types.js\";\n\nconst SEVERITY_WEIGHT: Record<string, number> = {\n CRITICAL: 40,\n HIGH: 30,\n MEDIUM: 10,\n LOW: 5,\n UNKNOWN: 0,\n};\n\nexport function scorePortfolioTarget(target: PortfolioTarget): number {\n const severity = target.riskHint?.severity;\n const severityWeight = severity ? (SEVERITY_WEIGHT[severity] ?? 0) : 0;\n const exploitSignalBonus = target.riskHint?.exploitSignal === true ? 25 : 0;\n const slaBreachBonus = target.riskHint?.slaBreached === true ? 20 : 0;\n\n return severityWeight + exploitSignalBonus + slaBreachBonus;\n}\n\nexport function rankPortfolioTargets(\n targets: PortfolioTarget[],\n): Array<{ target: PortfolioTarget; rank: number }> {\n const scoredTargets = targets.map((target, index) => ({\n target,\n index,\n score: scorePortfolioTarget(target),\n }));\n\n scoredTargets.sort((left, right) => {\n if (right.score !== left.score) {\n return right.score - left.score;\n }\n return left.index - right.index;\n });\n\n return scoredTargets.map((entry, index) => ({\n target: entry.target,\n rank: index + 1,\n }));\n}\n","import type {\n PortfolioReport,\n PortfolioTarget,\n PortfolioTargetResult,\n RemediateOptions,\n RemediationReport,\n} from \"../../platform/types.js\";\nimport type { ScanReport } from \"../contracts.js\";\nimport { remediate } from \"../remediate/index.js\";\nimport { remediateFromScan } from \"../remediate-from-scan/index.js\";\nimport { assertValidSimulationMode, buildSlaBreachSummary } from \"../reporting.js\";\nimport { rankPortfolioTargets } from \"./risk-score.js\";\n\nfunction toTargetStatusFromRemediation(report: RemediationReport): \"ok\" | \"partial\" | \"failed\" {\n const failed = report.results.some((result) => !result.applied && !result.dryRun);\n const succeeded = report.results.some((result) => result.applied || result.dryRun);\n if (!failed) return \"ok\";\n return succeeded ? \"partial\" : \"failed\";\n}\n\nfunction normalizeTargetInput(target: PortfolioTarget): {\n cveId?: string;\n inputPath?: string;\n audit: boolean;\n} {\n return {\n cveId: target.cveId?.trim() || undefined,\n inputPath: target.inputPath?.trim() || undefined,\n audit: target.audit ?? false,\n };\n}\n\nfunction validateTarget(target: PortfolioTarget, index: number): void {\n if (!target.cwd || typeof target.cwd !== \"string\") {\n throw new Error(`Invalid portfolio target at index ${index}: cwd is required.`);\n }\n\n const { cveId, inputPath, audit } = normalizeTargetInput(target);\n const hasScanInput = Boolean(inputPath) || audit;\n\n if (Boolean(cveId) === hasScanInput) {\n throw new Error(\n `Invalid portfolio target at index ${index}: provide exactly one mode (cveId OR inputPath/audit).`,\n );\n }\n}\n\nexport async function remediatePortfolio(\n targets: PortfolioTarget[],\n options: RemediateOptions = {},\n): Promise<PortfolioReport> {\n assertValidSimulationMode(options);\n const normalizedTargets = Array.isArray(targets) ? targets : [];\n\n if (normalizedTargets.length === 0) {\n throw new Error(\"Portfolio requires at least one target.\");\n }\n\n normalizedTargets.forEach((target, index) => validateTarget(target, index));\n\n const executionTargets =\n options.campaignMode === true\n ? rankPortfolioTargets(normalizedTargets)\n : normalizedTargets.map((target) => ({ target, rank: undefined }));\n\n const results: PortfolioTargetResult[] = [];\n const changeRequests = [] as NonNullable<PortfolioReport[\"changeRequests\"]>;\n let successCount = 0;\n let failedCount = 0;\n\n for (const executionTarget of executionTargets) {\n const target = executionTarget.target;\n const threatRank = options.campaignMode === true ? executionTarget.rank : undefined;\n const { cveId, inputPath, audit } = normalizeTargetInput(target);\n\n try {\n if (cveId) {\n const remediationReport = await remediate(cveId, {\n ...options,\n cwd: target.cwd,\n source: options.source,\n });\n\n const status = toTargetStatusFromRemediation(remediationReport);\n results.push({\n target,\n status,\n ...(threatRank !== undefined ? { threatRank } : {}),\n remediationReport,\n changeRequests: remediationReport.changeRequests,\n });\n\n if (remediationReport.changeRequests?.length) {\n changeRequests.push(...remediationReport.changeRequests);\n }\n\n if (status === \"failed\") {\n failedCount += 1;\n } else {\n successCount += 1;\n }\n continue;\n }\n\n const scanReport = await remediateFromScan(inputPath ?? \"\", {\n ...options,\n cwd: target.cwd,\n audit,\n format: target.format,\n source: options.source,\n });\n\n results.push({\n target,\n status: scanReport.status,\n ...(threatRank !== undefined ? { threatRank } : {}),\n scanReport,\n changeRequests: scanReport.changeRequests,\n });\n\n if (scanReport.changeRequests?.length) {\n changeRequests.push(...scanReport.changeRequests);\n }\n\n if (scanReport.status === \"failed\") {\n failedCount += 1;\n } else {\n successCount += 1;\n }\n } catch (error) {\n results.push({\n target,\n status: \"failed\",\n ...(threatRank !== undefined ? { threatRank } : {}),\n error: error instanceof Error ? error.message : String(error),\n });\n failedCount += 1;\n }\n }\n\n const overallStatus = failedCount === 0 ? \"ok\" : successCount > 0 ? \"partial\" : \"failed\";\n\n const allRemediationReports: RemediationReport[] = results.flatMap((r) => {\n if (r.remediationReport) return [r.remediationReport];\n const scan = r.scanReport as ScanReport | undefined;\n return scan?.reports ?? [];\n });\n\n return {\n schemaVersion: \"1.0\",\n status: overallStatus,\n generatedAt: new Date().toISOString(),\n targets: results,\n successCount,\n failedCount,\n changeRequests: changeRequests.length > 0 ? changeRequests : undefined,\n slaBreachSummary: buildSlaBreachSummary(allRemediationReports),\n };\n}\n","import { join } from \"node:path\";\nimport { readFileSync, writeFileSync } from \"node:fs\";\nimport { execa } from \"execa\";\nimport {\n addEvidenceStep,\n createEvidenceLog,\n finalizeEvidence,\n writeEvidenceLog,\n} from \"../../platform/evidence.js\";\nimport { loadPolicy } from \"../../platform/policy.js\";\nimport { withRepoLock } from \"../../platform/repo-lock.js\";\nimport {\n detectPackageManager,\n getYarnMajorVersion,\n resolveInstallCommand,\n resolveTestCommand,\n type PackageManager,\n} from \"../../platform/package-manager/index.js\";\nimport type {\n OutdatedPackage,\n UpdateOutdatedOptions,\n UpdateOutdatedReport,\n} from \"../../platform/types.js\";\nimport {\n resolveConstraints,\n resolveCorrelationContext,\n resolveProvenanceContext,\n} from \"../context.js\";\nimport { queryOutdatedPackages } from \"../../intelligence/sources/registry.js\";\nimport { createChangeRequestsForReports } from \"../change-request/index.js\";\n\n// ---------------------------------------------------------------------------\n// Internal types\n// ---------------------------------------------------------------------------\n\ninterface RawPackageJson {\n dependencies?: Record<string, string>;\n devDependencies?: Record<string, string>;\n peerDependencies?: Record<string, string>;\n [key: string]: unknown;\n}\n\ntype DepField = \"dependencies\" | \"devDependencies\" | \"peerDependencies\";\n\ninterface BumpResult {\n applied: boolean;\n message: string;\n}\n\n// ---------------------------------------------------------------------------\n// Internal helpers\n// ---------------------------------------------------------------------------\n\nasync function applyBump(params: {\n cwd: string;\n packageName: string;\n fromVersion: string;\n toVersion: string;\n pm: PackageManager;\n installCommand: string[];\n testCommand: string[];\n runTests: boolean;\n}): Promise<BumpResult> {\n const pkgPath = join(params.cwd, \"package.json\");\n\n let pkgJson: RawPackageJson;\n try {\n pkgJson = JSON.parse(readFileSync(pkgPath, \"utf8\")) as RawPackageJson;\n } catch {\n return {\n applied: false,\n message: `Could not read package.json at \"${pkgPath}\".`,\n };\n }\n\n const depField = ([\"dependencies\", \"devDependencies\", \"peerDependencies\"] as DepField[]).find(\n (f) => pkgJson[f]?.[params.packageName] !== undefined,\n );\n\n if (!depField) {\n return {\n applied: false,\n message: `\"${params.packageName}\" was not found in package.json dependencies.`,\n };\n }\n\n const currentRange = pkgJson[depField]![params.packageName]!;\n const prefixMatch = currentRange.match(/^([~^]?)/);\n const prefix = prefixMatch?.[1] ?? \"\";\n const newRange = `${prefix}${params.toVersion}`;\n\n return withRepoLock(params.cwd, async () => {\n pkgJson[depField]![params.packageName] = newRange;\n writeFileSync(pkgPath, JSON.stringify(pkgJson, null, 2) + \"\\n\", \"utf8\");\n\n try {\n const [installCmd, ...installArgs] = params.installCommand;\n await execa(installCmd, installArgs, { cwd: params.cwd, stdio: \"pipe\" });\n } catch (err) {\n pkgJson[depField]![params.packageName] = currentRange;\n writeFileSync(pkgPath, JSON.stringify(pkgJson, null, 2) + \"\\n\", \"utf8\");\n const message = err instanceof Error ? err.message : String(err);\n return {\n applied: false,\n message: `${params.installCommand.join(\" \")} failed after updating \"${params.packageName}\" to ${params.toVersion}. Reverted. Error: ${message}`,\n };\n }\n\n if (params.runTests) {\n try {\n const [testCmd, ...testArgs] = params.testCommand;\n await execa(testCmd, testArgs, { cwd: params.cwd, stdio: \"pipe\" });\n } catch (err) {\n pkgJson[depField]![params.packageName] = currentRange;\n writeFileSync(pkgPath, JSON.stringify(pkgJson, null, 2) + \"\\n\", \"utf8\");\n try {\n const [rollbackCmd, ...rollbackArgs] = params.installCommand;\n await execa(rollbackCmd, rollbackArgs, { cwd: params.cwd, stdio: \"pipe\" });\n } catch {\n // Ignore rollback install failure.\n }\n const message = err instanceof Error ? err.message : String(err);\n return {\n applied: false,\n message: `Tests failed after upgrading \"${params.packageName}\" to ${params.toVersion}. Rolled back. Error: ${message}`,\n };\n }\n }\n\n return {\n applied: true,\n message: `Updated ${params.packageName} from ${params.fromVersion} to ${params.toVersion}.`,\n };\n });\n}\n\n// ---------------------------------------------------------------------------\n// Public function\n// ---------------------------------------------------------------------------\n\nexport async function updateOutdated(\n options: UpdateOutdatedOptions = {},\n): Promise<UpdateOutdatedReport> {\n const cwd = options.cwd ?? process.cwd();\n\n // Load policy exactly once\n const policy = loadPolicy(cwd, options.policy);\n const correlation = resolveCorrelationContext(options);\n const provenance = resolveProvenanceContext(options);\n const constraints = resolveConstraints(options, cwd);\n\n const evidence = createEvidenceLog(cwd, [], {\n requestId: correlation.requestId,\n sessionId: correlation.sessionId,\n parentRunId: correlation.parentRunId,\n actor: provenance.actor,\n source: provenance.source,\n });\n\n addEvidenceStep(evidence, \"update-outdated.start\", {\n cwd,\n includeTransitive: options.includeTransitive ?? false,\n dryRun: options.dryRun ?? false,\n });\n\n // Query outdated packages\n let outdatedMap: Awaited<ReturnType<typeof queryOutdatedPackages>>;\n try {\n outdatedMap = await queryOutdatedPackages(cwd, {\n includeTransitive: options.includeTransitive ?? false,\n packageManager: options.packageManager,\n });\n } catch (err) {\n addEvidenceStep(\n evidence,\n \"update-outdated.registry-query-failed\",\n {},\n { error: err instanceof Error ? err.message : String(err) },\n );\n finalizeEvidence(evidence);\n const evidenceFile = options.evidence === false ? undefined : writeEvidenceLog(cwd, evidence);\n\n return {\n schemaVersion: \"1.0\",\n status: \"failed\",\n generatedAt: new Date().toISOString(),\n outdatedPackages: [],\n successCount: 0,\n failedCount: 1,\n skippedCount: 0,\n errors: [{ packageName: \"*\", message: err instanceof Error ? err.message : String(err) }],\n evidenceFile,\n patchCount: 0,\n constraints,\n correlation,\n provenance,\n };\n }\n\n const outdatedPackages: OutdatedPackage[] = Array.from(outdatedMap.entries()).map(\n ([name, info]) => ({\n name,\n currentVersion: info.currentVersion,\n wantedVersion: info.wantedVersion,\n latestVersion: info.latestVersion,\n isMajorBump: info.isMajorBump,\n dependencyScope: info.dependencyScope,\n }),\n );\n\n addEvidenceStep(\n evidence,\n \"update-outdated.registry-query\",\n {},\n { packageCount: outdatedPackages.length },\n );\n\n // Resolve install/test commands once (before the loop)\n const pm = (options.packageManager ?? detectPackageManager(cwd)) as PackageManager;\n const yarnMajor = pm === \"yarn\" ? await getYarnMajorVersion(cwd) : undefined;\n const installCommand = resolveInstallCommand(pm, constraints, yarnMajor);\n const testCommand = resolveTestCommand(pm, constraints);\n\n let successCount = 0;\n let failedCount = 0;\n let skippedCount = 0;\n const errors: Array<{ packageName: string; message: string }> = [];\n\n for (const [packageName, info] of outdatedMap) {\n // Skip major bumps when policy disallows them\n if (info.isMajorBump && !policy.allowMajorBumps) {\n skippedCount++;\n addEvidenceStep(\n evidence,\n \"update-outdated.skip\",\n { packageName, reason: \"major-bump-not-allowed\" },\n {},\n );\n continue;\n }\n\n // In dry-run mode, count as success but do not write\n if (options.dryRun) {\n successCount++;\n addEvidenceStep(\n evidence,\n \"update-outdated.dry-run\",\n { packageName, fromVersion: info.currentVersion, toVersion: info.latestVersion },\n {},\n );\n continue;\n }\n\n addEvidenceStep(evidence, \"update-outdated.apply\", {\n packageName,\n fromVersion: info.currentVersion,\n toVersion: info.latestVersion,\n });\n\n const result = await applyBump({\n cwd,\n packageName,\n fromVersion: info.currentVersion,\n toVersion: info.latestVersion,\n pm,\n installCommand,\n testCommand,\n runTests: options.runTests ?? false,\n });\n\n if (result.applied) {\n successCount++;\n addEvidenceStep(\n evidence,\n \"update-outdated.apply.success\",\n { packageName },\n { toVersion: info.latestVersion },\n );\n } else {\n failedCount++;\n errors.push({ packageName, message: result.message });\n addEvidenceStep(\n evidence,\n \"update-outdated.apply.failed\",\n { packageName },\n { error: result.message },\n );\n }\n }\n\n const status: UpdateOutdatedReport[\"status\"] =\n failedCount > 0 && successCount > 0\n ? \"partial\"\n : failedCount > 0 && successCount === 0\n ? \"failed\"\n : \"ok\";\n\n evidence.summary = {\n status,\n cveCount: 0,\n remediationCount: successCount + failedCount + skippedCount,\n successCount,\n failedCount,\n patchCount: 0,\n };\n\n finalizeEvidence(evidence);\n const evidenceFile = options.evidence === false ? undefined : writeEvidenceLog(cwd, evidence);\n\n const changeRequests =\n options.changeRequest?.enabled && successCount > 0\n ? await createChangeRequestsForReports({\n cwd,\n options: options.changeRequest,\n reports: [\n {\n cveId: \"UPDATE-OUTDATED\",\n cveDetails: null,\n vulnerablePackages: [],\n results: outdatedPackages\n .filter((pkg) => !pkg.isMajorBump)\n .map((pkg) => ({\n packageName: pkg.name,\n strategy: \"version-bump\" as const,\n fromVersion: pkg.currentVersion,\n toVersion: pkg.latestVersion,\n applied: true,\n dryRun: Boolean(options.dryRun),\n message: `Updated ${pkg.name} to ${pkg.latestVersion}`,\n })),\n agentSteps: 0,\n summary: \"update-outdated\",\n },\n ],\n })\n : undefined;\n\n return {\n schemaVersion: \"1.0\",\n status,\n generatedAt: new Date().toISOString(),\n outdatedPackages,\n successCount,\n failedCount,\n skippedCount,\n errors,\n evidenceFile,\n patchCount: 0,\n constraints,\n correlation,\n provenance,\n changeRequests,\n };\n}\n","/**\n * Public SDK API: checkReachability\n */\nimport { assessPackageReachability } from \"../../remediation/tools/check-reachability.js\";\nimport type { CheckReachabilityOptions, ReachabilityAssessment } from \"../../platform/types.js\";\n\nexport async function checkReachability(\n options: CheckReachabilityOptions,\n): Promise<ReachabilityAssessment> {\n const cwd = options.cwd ?? process.cwd();\n return assessPackageReachability(cwd, options.packageName, options.symbol);\n}\n","/**\n * Git-aware delta vulnerability scanner\n *\n * Compares dependency manifests between a git base reference (e.g. HEAD, origin/main)\n * and the active working tree or branch to identify newly introduced or resolved CVEs.\n */\nimport { existsSync, readFileSync } from \"node:fs\";\nimport { join } from \"node:path\";\nimport { execa } from \"execa\";\nimport semver from \"semver\";\nimport { evaluatePackage } from \"../remediation/evaluate-package.js\";\nimport type {\n DeltaDependencyChange,\n DeltaFinding,\n DeltaScanOptions,\n DeltaScanReport,\n} from \"../platform/types.js\";\n\nconst DEP_SECTIONS = [\n \"dependencies\",\n \"devDependencies\",\n \"peerDependencies\",\n \"optionalDependencies\",\n] as const;\n\ninterface PackageJsonSubset {\n name?: string;\n dependencies?: Record<string, string>;\n devDependencies?: Record<string, string>;\n peerDependencies?: Record<string, string>;\n optionalDependencies?: Record<string, string>;\n}\n\nasync function getChangedManifestPaths(cwd: string, baseRef: string): Promise<string[]> {\n const manifests = new Set<string>();\n\n try {\n // 1. Files changed between baseRef and working tree/index\n const { stdout: diffFiles } = await execa(\n \"git\",\n [\"diff\", \"--name-only\", baseRef, \"--\", \"package.json\", \"**/package.json\"],\n { cwd, reject: false },\n );\n for (const f of diffFiles.split(\"\\n\")) {\n const trimmed = f.trim();\n if (trimmed && trimmed.endsWith(\"package.json\") && !trimmed.includes(\"node_modules\")) {\n manifests.add(trimmed);\n }\n }\n\n // 2. Untracked new package.json files\n const { stdout: untrackedFiles } = await execa(\n \"git\",\n [\"ls-files\", \"--others\", \"--exclude-standard\", \"--\", \"package.json\", \"**/package.json\"],\n { cwd, reject: false },\n );\n for (const f of untrackedFiles.split(\"\\n\")) {\n const trimmed = f.trim();\n if (trimmed && trimmed.endsWith(\"package.json\") && !trimmed.includes(\"node_modules\")) {\n manifests.add(trimmed);\n }\n }\n } catch {\n // If not a git repository or git command fails, check if local package.json exists\n if (existsSync(join(cwd, \"package.json\"))) {\n manifests.add(\"package.json\");\n }\n }\n\n return Array.from(manifests);\n}\n\nasync function getOldManifestContent(\n cwd: string,\n baseRef: string,\n relPath: string,\n): Promise<PackageJsonSubset | null> {\n try {\n const { stdout } = await execa(\"git\", [\"show\", `${baseRef}:${relPath}`], {\n cwd,\n reject: false,\n });\n if (!stdout || !stdout.trim()) return null;\n return JSON.parse(stdout) as PackageJsonSubset;\n } catch {\n return null;\n }\n}\n\nfunction getNewManifestContent(cwd: string, relPath: string): PackageJsonSubset | null {\n const fullPath = join(cwd, relPath);\n if (!existsSync(fullPath)) return null;\n try {\n return JSON.parse(readFileSync(fullPath, \"utf8\")) as PackageJsonSubset;\n } catch {\n return null;\n }\n}\n\nfunction computeDependencyDiff(\n relPath: string,\n oldPkg: PackageJsonSubset | null,\n newPkg: PackageJsonSubset | null,\n): DeltaDependencyChange[] {\n const changes: DeltaDependencyChange[] = [];\n\n for (const section of DEP_SECTIONS) {\n const oldDeps = oldPkg?.[section] ?? {};\n const newDeps = newPkg?.[section] ?? {};\n\n // Check added or updated dependencies\n for (const [pkgName, newVer] of Object.entries(newDeps)) {\n const oldVer = oldDeps[pkgName];\n if (!oldVer) {\n changes.push({\n packageName: pkgName,\n changeType: \"added\",\n newVersion: newVer,\n dependencyType: section,\n manifestPath: relPath,\n });\n } else if (oldVer !== newVer) {\n const cleanOld = semver.clean(oldVer) || semver.coerce(oldVer)?.version;\n const cleanNew = semver.clean(newVer) || semver.coerce(newVer)?.version;\n const isUpgrade =\n cleanOld && cleanNew && semver.valid(cleanOld) && semver.valid(cleanNew)\n ? semver.gt(cleanNew, cleanOld)\n : true;\n\n changes.push({\n packageName: pkgName,\n changeType: isUpgrade ? \"upgraded\" : \"downgraded\",\n oldVersion: oldVer,\n newVersion: newVer,\n dependencyType: section,\n manifestPath: relPath,\n });\n }\n }\n\n // Check removed dependencies\n for (const [pkgName, oldVer] of Object.entries(oldDeps)) {\n if (!(pkgName in newDeps)) {\n changes.push({\n packageName: pkgName,\n changeType: \"removed\",\n oldVersion: oldVer,\n dependencyType: section,\n manifestPath: relPath,\n });\n }\n }\n }\n\n return changes;\n}\n\nimport { computeLockfileDiff } from \"./lockfile-diff.js\";\n\nconst LOCKFILE_PATTERNS = [\n \"package-lock.json\",\n \"**/package-lock.json\",\n \"pnpm-lock.yaml\",\n \"**/pnpm-lock.yaml\",\n \"yarn.lock\",\n \"**/yarn.lock\",\n];\n\nasync function getChangedLockfilePaths(cwd: string, baseRef: string): Promise<string[]> {\n const lockfiles = new Set<string>();\n try {\n const { stdout: diffFiles } = await execa(\n \"git\",\n [\"diff\", \"--name-only\", baseRef, \"--\", ...LOCKFILE_PATTERNS],\n { cwd, reject: false },\n );\n for (const f of diffFiles.split(\"\\n\")) {\n const trimmed = f.trim();\n if (\n trimmed &&\n !trimmed.includes(\"node_modules\") &&\n (trimmed.endsWith(\"package-lock.json\") ||\n trimmed.endsWith(\"pnpm-lock.yaml\") ||\n trimmed.endsWith(\"yarn.lock\"))\n ) {\n lockfiles.add(trimmed);\n }\n }\n const { stdout: untrackedFiles } = await execa(\n \"git\",\n [\"ls-files\", \"--others\", \"--exclude-standard\", \"--\", ...LOCKFILE_PATTERNS],\n { cwd, reject: false },\n );\n for (const f of untrackedFiles.split(\"\\n\")) {\n const trimmed = f.trim();\n if (\n trimmed &&\n !trimmed.includes(\"node_modules\") &&\n (trimmed.endsWith(\"package-lock.json\") ||\n trimmed.endsWith(\"pnpm-lock.yaml\") ||\n trimmed.endsWith(\"yarn.lock\"))\n ) {\n lockfiles.add(trimmed);\n }\n }\n } catch {\n // Ignore git errors\n }\n return Array.from(lockfiles);\n}\n\nasync function getFileContentAtRef(\n cwd: string,\n baseRef: string,\n relPath: string,\n): Promise<string | null> {\n try {\n const { stdout } = await execa(\"git\", [\"show\", `${baseRef}:${relPath}`], {\n cwd,\n reject: false,\n });\n return stdout || null;\n } catch {\n return null;\n }\n}\n\nexport async function scanDelta(options: DeltaScanOptions = {}): Promise<DeltaScanReport> {\n const cwd = options.cwd ?? process.cwd();\n const baseRef = options.baseRef ?? \"HEAD\";\n\n const changedManifests = await getChangedManifestPaths(cwd, baseRef);\n const changedLockfiles = await getChangedLockfilePaths(cwd, baseRef);\n const dependencyChanges: DeltaDependencyChange[] = [];\n const directPkgs = new Set<string>();\n\n for (const manifestRel of changedManifests) {\n const oldPkg = await getOldManifestContent(cwd, baseRef, manifestRel);\n const newPkg = getNewManifestContent(cwd, manifestRel);\n const diffs = computeDependencyDiff(manifestRel, oldPkg, newPkg);\n for (const d of diffs) {\n directPkgs.add(d.packageName);\n }\n dependencyChanges.push(...diffs);\n }\n\n for (const lockfileRel of changedLockfiles) {\n const oldContent = await getFileContentAtRef(cwd, baseRef, lockfileRel);\n const fullPath = join(cwd, lockfileRel);\n const newContent = existsSync(fullPath) ? readFileSync(fullPath, \"utf8\") : null;\n const lockDiffs = computeLockfileDiff(lockfileRel, oldContent, newContent);\n for (const change of lockDiffs) {\n if (!directPkgs.has(change.packageName)) {\n dependencyChanges.push(change);\n }\n }\n if (!changedManifests.includes(lockfileRel)) {\n changedManifests.push(lockfileRel);\n }\n }\n\n const introducedFindings: DeltaFinding[] = [];\n const resolvedFindings: DeltaFinding[] = [];\n\n // Evaluate newly added or modified dependencies\n for (const change of dependencyChanges) {\n if (\n change.changeType === \"added\" ||\n change.changeType === \"upgraded\" ||\n change.changeType === \"downgraded\"\n ) {\n const cleanVer = semver.coerce(change.newVersion)?.version ?? change.newVersion;\n const evaluation = await evaluatePackage(change.packageName, {\n version: cleanVer,\n enrichIntelligence: true,\n });\n\n for (const vuln of evaluation.vulnerabilities) {\n introducedFindings.push({\n packageName: change.packageName,\n cveId: vuln.cveId,\n severity: vuln.severity,\n summary: vuln.summary,\n deltaType: \"introduced\",\n installedVersion: change.newVersion,\n safeUpgradeVersion: vuln.safeUpgradeVersion,\n inCisaKev: vuln.inCisaKev,\n epssScore: vuln.epssScore,\n });\n }\n }\n\n // Check if the old version had vulnerabilities resolved by this upgrade/removal\n if (\n change.oldVersion &&\n (change.changeType === \"upgraded\" || change.changeType === \"removed\")\n ) {\n const cleanOldVer = semver.coerce(change.oldVersion)?.version ?? change.oldVersion;\n const oldEval = await evaluatePackage(change.packageName, {\n version: cleanOldVer,\n enrichIntelligence: true,\n });\n\n const cleanNewVer = change.newVersion\n ? (semver.coerce(change.newVersion)?.version ?? change.newVersion)\n : undefined;\n const newEval = cleanNewVer\n ? await evaluatePackage(change.packageName, {\n version: cleanNewVer,\n enrichIntelligence: false,\n })\n : { vulnerabilities: [] };\n\n const newCveSet = new Set(newEval.vulnerabilities.map((v) => v.cveId));\n\n for (const oldVuln of oldEval.vulnerabilities) {\n if (!newCveSet.has(oldVuln.cveId)) {\n resolvedFindings.push({\n packageName: change.packageName,\n cveId: oldVuln.cveId,\n severity: oldVuln.severity,\n summary: oldVuln.summary,\n deltaType: \"resolved\",\n installedVersion: change.oldVersion,\n safeUpgradeVersion: oldVuln.safeUpgradeVersion,\n inCisaKev: oldVuln.inCisaKev,\n epssScore: oldVuln.epssScore,\n });\n }\n }\n }\n }\n\n let netRiskVerdict: DeltaScanReport[\"netRiskVerdict\"] = \"neutral\";\n let status: DeltaScanReport[\"status\"] = \"ok\";\n\n if (introducedFindings.length > 0) {\n netRiskVerdict = \"degraded\";\n status = \"degraded\";\n } else if (resolvedFindings.length > 0) {\n netRiskVerdict = \"improved\";\n status = \"improved\";\n }\n\n const summary =\n introducedFindings.length > 0\n ? `Delta scan against ${baseRef} found ${introducedFindings.length} newly introduced vulnerability(ies) across ${dependencyChanges.length} dependency change(s) (net risk: degraded).`\n : resolvedFindings.length > 0\n ? `Delta scan against ${baseRef} resolved ${resolvedFindings.length} vulnerability(ies) across ${dependencyChanges.length} dependency change(s) (net risk: improved).`\n : `Delta scan against ${baseRef} found 0 new vulnerabilities across ${dependencyChanges.length} dependency change(s) (net risk: neutral).`;\n\n return {\n schemaVersion: \"1.0\",\n status,\n baseRef,\n targetRef: \"working-tree\",\n changedManifests,\n dependencyChanges,\n introducedFindings,\n resolvedFindings,\n netRiskVerdict,\n summary,\n generatedAt: new Date().toISOString(),\n };\n}\n","import YAML from \"yaml\";\nimport semver from \"semver\";\nimport type { DeltaDependencyChange } from \"../platform/types.js\";\n\n/**\n * Extracts a map of package names to their resolved versions from a lockfile content.\n */\nexport function parseLockfileDependencies(\n filename: string,\n content: string,\n): Map<string, Set<string>> {\n const result = new Map<string, Set<string>>();\n\n const add = (name: string, ver?: string) => {\n if (!name || !ver) return;\n const cleanVer = semver.clean(ver) || semver.coerce(ver)?.version || ver;\n let set = result.get(name);\n if (!set) {\n set = new Set();\n result.set(name, set);\n }\n set.add(cleanVer);\n };\n\n if (filename.endsWith(\"package-lock.json\")) {\n try {\n const data = JSON.parse(content);\n if (data.packages && typeof data.packages === \"object\") {\n for (const [key, pkg] of Object.entries(data.packages)) {\n if (!key || key === \"\" || typeof pkg !== \"object\" || !pkg) continue;\n const idx = key.lastIndexOf(\"node_modules/\");\n if (idx !== -1) {\n const rawName = key.slice(idx + \"node_modules/\".length);\n const ver = (pkg as { version?: string }).version;\n add(rawName, ver);\n }\n }\n }\n if (data.dependencies && typeof data.dependencies === \"object\") {\n const walkDeps = (deps: Record<string, unknown>) => {\n for (const [name, info] of Object.entries(deps)) {\n if (!info || typeof info !== \"object\") continue;\n const depObj = info as { version?: string; dependencies?: Record<string, unknown> };\n add(name, depObj.version);\n if (depObj.dependencies && typeof depObj.dependencies === \"object\") {\n walkDeps(depObj.dependencies);\n }\n }\n };\n walkDeps(data.dependencies as Record<string, unknown>);\n }\n } catch {\n // Ignore JSON parse error\n }\n } else if (filename.endsWith(\"pnpm-lock.yaml\")) {\n try {\n const data = YAML.parse(content) as {\n packages?: Record<string, { name?: string; version?: string }>;\n snapshots?: Record<string, unknown>;\n };\n if (data?.packages && typeof data.packages === \"object\") {\n for (const [key, val] of Object.entries(data.packages)) {\n let rawKey = key.replace(/^\\//, \"\");\n const parenIdx = rawKey.indexOf(\"(\");\n if (parenIdx !== -1) {\n rawKey = rawKey.slice(0, parenIdx);\n }\n const lastAt = rawKey.lastIndexOf(\"@\");\n if (lastAt > 0) {\n const name = val?.name ?? rawKey.slice(0, lastAt);\n const version = val?.version ?? rawKey.slice(lastAt + 1);\n add(name, version);\n }\n }\n }\n if (data?.snapshots && typeof data.snapshots === \"object\") {\n for (const key of Object.keys(data.snapshots)) {\n let rawKey = key.replace(/^\\//, \"\");\n const parenIdx = rawKey.indexOf(\"(\");\n if (parenIdx !== -1) {\n rawKey = rawKey.slice(0, parenIdx);\n }\n const lastAt = rawKey.lastIndexOf(\"@\");\n if (lastAt > 0) {\n const name = rawKey.slice(0, lastAt);\n const version = rawKey.slice(lastAt + 1);\n add(name, version);\n }\n }\n }\n } catch {\n // Ignore YAML parse error\n }\n } else if (filename.endsWith(\"yarn.lock\")) {\n const lines = content.split(\"\\n\");\n let currentPackages: string[] = [];\n for (const line of lines) {\n if (line.startsWith(\"#\") || line.trim() === \"\") continue;\n if (!line.startsWith(\" \")) {\n currentPackages = [];\n const parts = line.split(\",\").map((p) => p.trim().replace(/^\"/, \"\").replace(/\":?$/, \"\"));\n for (const part of parts) {\n const lastAt = part.lastIndexOf(\"@\");\n if (lastAt > 0) {\n currentPackages.push(part.slice(0, lastAt));\n }\n }\n } else {\n const match = line.match(/^\\s+version\\s+\"?([^\"\\s]+)\"?/);\n if (match && currentPackages.length > 0) {\n const ver = match[1];\n for (const pkg of currentPackages) {\n add(pkg, ver);\n }\n currentPackages = [];\n }\n }\n }\n }\n\n return result;\n}\n\n/**\n * Computes difference between old and new lockfile content.\n */\nexport function computeLockfileDiff(\n filename: string,\n oldContent: string | null,\n newContent: string | null,\n): DeltaDependencyChange[] {\n const changes: DeltaDependencyChange[] = [];\n const oldDeps = oldContent\n ? parseLockfileDependencies(filename, oldContent)\n : new Map<string, Set<string>>();\n const newDeps = newContent\n ? parseLockfileDependencies(filename, newContent)\n : new Map<string, Set<string>>();\n\n const allPkgs = new Set([...oldDeps.keys(), ...newDeps.keys()]);\n\n for (const pkg of allPkgs) {\n const oldVers = oldDeps.get(pkg) ?? new Set();\n const newVers = newDeps.get(pkg) ?? new Set();\n\n // Check newly introduced versions\n for (const nVer of newVers) {\n if (!oldVers.has(nVer)) {\n if (oldVers.size === 0) {\n changes.push({\n packageName: pkg,\n changeType: \"added\",\n newVersion: nVer,\n dependencyType: \"transitive\",\n manifestPath: filename,\n });\n } else {\n const [firstOld] = oldVers;\n const cleanOld = semver.clean(firstOld) || semver.coerce(firstOld)?.version;\n const cleanNew = semver.clean(nVer) || semver.coerce(nVer)?.version;\n const isUpgrade =\n cleanOld && cleanNew && semver.valid(cleanOld) && semver.valid(cleanNew)\n ? semver.gt(cleanNew, cleanOld)\n : true;\n\n changes.push({\n packageName: pkg,\n changeType: isUpgrade ? \"upgraded\" : \"downgraded\",\n oldVersion: firstOld,\n newVersion: nVer,\n dependencyType: \"transitive\",\n manifestPath: filename,\n });\n }\n }\n }\n\n // Check removed versions (only if package no longer exists in new lockfile)\n if (newVers.size === 0 && oldVers.size > 0) {\n for (const oVer of oldVers) {\n changes.push({\n packageName: pkg,\n changeType: \"removed\",\n oldVersion: oVer,\n dependencyType: \"transitive\",\n manifestPath: filename,\n });\n }\n }\n }\n\n return changes;\n}\n","import { randomUUID } from \"node:crypto\";\nimport { jobRegistry } from \"../../platform/jobs.js\";\nimport type { AsyncRemediationJob, JobHandle } from \"../../platform/jobs.js\";\nimport type {\n RemediateOptions,\n PortfolioTarget,\n RemediationReport,\n PortfolioReport,\n} from \"../../platform/types.js\";\nimport type { ScanReport, ScanOptions } from \"../contracts.js\";\nimport { remediate } from \"../remediate/index.js\";\nimport { remediateFromScan } from \"../remediate-from-scan/index.js\";\nimport { remediatePortfolio } from \"../portfolio/index.js\";\n\nexport type { JobHandle, AsyncRemediationJob } from \"../../platform/jobs.js\";\n\nexport type TypedAsyncRemediationJob = Omit<AsyncRemediationJob, \"result\"> & {\n result?: RemediationReport | ScanReport | PortfolioReport;\n};\n\nfunction createJob(): AsyncRemediationJob {\n const jobId = randomUUID();\n const submittedAt = new Date().toISOString();\n const job: AsyncRemediationJob = { jobId, status: \"pending\", submittedAt };\n jobRegistry.set(jobId, job);\n return job;\n}\n\nfunction runJobAsync(job: AsyncRemediationJob, work: () => Promise<unknown>): void {\n Promise.resolve()\n .then(() => {\n job.status = \"running\";\n return work();\n })\n .then((result) => {\n job.status = \"done\";\n job.result = result;\n job.completedAt = new Date().toISOString();\n })\n .catch((error: unknown) => {\n job.status = \"failed\";\n job.error = error instanceof Error ? error.message : String(error);\n job.completedAt = new Date().toISOString();\n });\n}\n\nexport function submitRemediateJob(cveId: string, options?: RemediateOptions): JobHandle {\n const job = createJob();\n runJobAsync(job, () => remediate(cveId, options));\n return { jobId: job.jobId, status: job.status, submittedAt: job.submittedAt };\n}\n\nexport function submitScanJob(inputPath: string, options?: ScanOptions): JobHandle {\n const job = createJob();\n runJobAsync(job, () => remediateFromScan(inputPath, options));\n return { jobId: job.jobId, status: job.status, submittedAt: job.submittedAt };\n}\n\nexport function submitPortfolioJob(\n targets: PortfolioTarget[],\n options?: RemediateOptions,\n): JobHandle {\n const job = createJob();\n runJobAsync(job, () => remediatePortfolio(targets, options));\n return { jobId: job.jobId, status: job.status, submittedAt: job.submittedAt };\n}\n\nexport function pollJob(jobId: string): TypedAsyncRemediationJob {\n const job = jobRegistry.get(jobId);\n if (!job) {\n throw new Error(`Job not found: ${jobId}`);\n }\n return job as TypedAsyncRemediationJob;\n}\n","// platform-safe types only — no imports from other packages/core/src/ modules\n\nexport interface JobHandle {\n jobId: string;\n status: \"pending\" | \"running\" | \"done\" | \"failed\";\n submittedAt: string;\n}\n\nexport interface AsyncRemediationJob extends JobHandle {\n result?: unknown;\n error?: string;\n completedAt?: string;\n}\n\nexport interface BoundedJobRegistryOptions {\n /** Maximum number of jobs retained in memory. Defaults to 1000. */\n maxCapacity?: number;\n /** Time-to-live in milliseconds before a job is eligible for TTL eviction. Defaults to 24 hours (86,400,000 ms). */\n ttlMs?: number;\n}\n\nexport interface JobRegistryStats {\n size: number;\n maxCapacity: number;\n ttlMs: number;\n pending: number;\n running: number;\n done: number;\n failed: number;\n}\n\n/**\n * Bounded in-memory job registry with TTL eviction and capacity capping.\n * Extends Map<string, AsyncRemediationJob> to maintain full backward compatibility\n * with all existing map operations (get, set, has, delete, clear, iterations).\n */\nexport class BoundedJobRegistry extends Map<string, AsyncRemediationJob> {\n private maxCapacity: number;\n private ttlMs: number;\n\n constructor(options: BoundedJobRegistryOptions = {}) {\n super();\n this.maxCapacity = options.maxCapacity ?? 1000;\n this.ttlMs = options.ttlMs ?? 24 * 60 * 60 * 1000;\n }\n\n public getMaxCapacity(): number {\n return this.maxCapacity;\n }\n\n public setMaxCapacity(capacity: number): void {\n if (capacity <= 0) {\n throw new Error(`maxCapacity must be greater than 0, received ${capacity}`);\n }\n this.maxCapacity = capacity;\n this.enforceCapacity();\n }\n\n public getTtl(): number {\n return this.ttlMs;\n }\n\n public setTtl(ttlMs: number): void {\n if (ttlMs <= 0) {\n throw new Error(`ttlMs must be greater than 0, received ${ttlMs}`);\n }\n this.ttlMs = ttlMs;\n }\n\n public isExpired(job: AsyncRemediationJob, now = Date.now()): boolean {\n const timestampStr = job.completedAt ?? job.submittedAt;\n const timeMs = new Date(timestampStr).getTime();\n if (isNaN(timeMs)) return false;\n return now - timeMs > this.ttlMs;\n }\n\n public evictExpired(now = Date.now()): number {\n let count = 0;\n for (const [id, job] of super.entries()) {\n if (this.isExpired(job, now)) {\n super.delete(id);\n count++;\n }\n }\n return count;\n }\n\n public prune(now = Date.now()): number {\n return this.evictExpired(now);\n }\n\n override get(jobId: string): AsyncRemediationJob | undefined {\n const job = super.get(jobId);\n if (!job) return undefined;\n if (this.isExpired(job)) {\n super.delete(jobId);\n return undefined;\n }\n return job;\n }\n\n override has(jobId: string): boolean {\n const job = super.get(jobId);\n if (!job) return false;\n if (this.isExpired(job)) {\n super.delete(jobId);\n return false;\n }\n return true;\n }\n\n override set(jobId: string, job: AsyncRemediationJob): this {\n if (super.has(jobId)) {\n super.set(jobId, job);\n return this;\n }\n\n // Lazy cleanup of any expired jobs before capacity check\n this.evictExpired();\n\n if (this.size >= this.maxCapacity) {\n this.evictOneCandidate();\n }\n\n super.set(jobId, job);\n return this;\n }\n\n private evictOneCandidate(): void {\n let oldestTerminalId: string | undefined;\n let oldestTerminalTime = Infinity;\n\n let oldestOverallId: string | undefined;\n let oldestOverallTime = Infinity;\n\n for (const [id, job] of super.entries()) {\n const submittedMs = new Date(job.submittedAt).getTime() || 0;\n if (submittedMs < oldestOverallTime) {\n oldestOverallTime = submittedMs;\n oldestOverallId = id;\n }\n\n if (job.status === \"done\" || job.status === \"failed\") {\n const terminalMs = new Date(job.completedAt ?? job.submittedAt).getTime() || 0;\n if (terminalMs < oldestTerminalTime) {\n oldestTerminalTime = terminalMs;\n oldestTerminalId = id;\n }\n }\n }\n\n const targetId = oldestTerminalId ?? oldestOverallId;\n if (targetId) {\n super.delete(targetId);\n }\n }\n\n private enforceCapacity(): void {\n this.evictExpired();\n while (this.size > this.maxCapacity) {\n this.evictOneCandidate();\n }\n }\n\n public stats(): JobRegistryStats {\n let pending = 0;\n let running = 0;\n let done = 0;\n let failed = 0;\n for (const job of super.values()) {\n switch (job.status) {\n case \"pending\":\n pending++;\n break;\n case \"running\":\n running++;\n break;\n case \"done\":\n done++;\n break;\n case \"failed\":\n failed++;\n break;\n }\n }\n return {\n size: this.size,\n maxCapacity: this.maxCapacity,\n ttlMs: this.ttlMs,\n pending,\n running,\n done,\n failed,\n };\n }\n}\n\nexport const jobRegistry = new BoundedJobRegistry();\n"],"mappings":"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","names":["existsSync","readFile","join","existsSync","mkdirSync","writeFileSync","readFileSync","join","execa","existsSync","readFileSync","join","readFileSync","existsSync","join","existsSync","join","command","readFileSync","base","existsSync","existsSync","join","readFile","readFileSync","join","execa","existsSync","mkdirSync","readFileSync","writeFileSync","dirname","join","readFileSync","existsSync","readFileSync","join","resolve","readFileSync","join","execa","existsSync","readFile","join","semver","readFileSync","join","execa","semver","semver","result","execa","readFileSync","join","semver","semver","execa","join","existsSync","readFile","existsSync","mkdirSync","readFileSync","writeFileSync","join","generateText","semver","url","readFileSync","existsSync","readdirSync","readFileSync","statSync","isAbsolute","join","resolve","z","join","existsSync","readFileSync","resolve","isAbsolute","readdirSync","stat","statSync","z","z","join","readFileSync","writeFileSync","rm","semver","existsSync","writeFile","isAbsolute","join","isAbsolute","join","existsSync","writeFile","mkdir","rm","join","resolve","readdirSync","readFileSync","statSync","join","parseSync","SOURCE_EXTENSIONS","IGNORED_DIRS","stat","getLineCol","walk","readFileSync","writeFileSync","parseSync","walkRimraf","walkUuid","walkGlob","walkMkdirp","getLine","walkDiagnostics","z","join","semver","readFileSync","rm","writeFileSync","prefix","z","join","existsSync","readFileSync","writeFileSync","rm","semver","z","join","existsSync","semver","readFileSync","dependencyTrace","dependencyTraceSuffix","rm","writeFileSync","safeUpgrade","trust","z","mkdir","readdir","readFile","rm","join","execa","z","parseSync","x","y","z","z","mkdir","writeFile","join","execa","existsSync","readdirSync","readFileSync","statSync","writeFileSync","isAbsolute","join","relative","IGNORED_DIRS","isAbsolute","join","relative","existsSync","readFileSync","readdirSync","IGNORED_DIRS","stat","statSync","join","existsSync","writeFileSync","relative","existsSync","mkdtemp","readFile","rm","writeFile","tmpdir","join","execa","writeFile","join","readFile","execa","rm","mkdtemp","tmpdir","existsSync","z","join","mkdir","writeFile","execa","semver","semver","existsSync","readFileSync","join","existsSync","z","z","z","semver","z","semver","z","semver","z","z","existsSync","generateText","execa","resolveProvider","mkdirSync","writeFileSync","join","evidenceFile","resolve","readFileSync","execa","readFileSync","readFileSync","CVE_REGEX","GHSA_REGEX","normalizeSeverity","readFileSync","CVE_REGEX","resolve","execa","readFileSync","join","readFileSync","writeFileSync","execa","join","readFileSync","writeFileSync","execa","evidenceFile","existsSync","readFileSync","join","execa","semver","YAML","semver","execa","existsSync","join","readFileSync","semver","randomUUID","randomUUID"]}
|