infraweaver 0.1.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/LICENSE +661 -0
- package/README.md +244 -0
- package/dist/agents/claude.d.ts +113 -0
- package/dist/agents/claudePretoolGate.d.ts +137 -0
- package/dist/agents/dispatchMetrics.d.ts +77 -0
- package/dist/agents/gateServer.d.ts +7 -0
- package/dist/agents/index.d.ts +6 -0
- package/dist/agents/nativeFsDenies.d.ts +46 -0
- package/dist/agents/opencode.d.ts +284 -0
- package/dist/agents/opencodePlugin.d.ts +96 -0
- package/dist/agents/opencodeShared.d.ts +40 -0
- package/dist/agents/postRun.d.ts +126 -0
- package/dist/agents/reviewer.d.ts +41 -0
- package/dist/agents/sessionLabeler.d.ts +97 -0
- package/dist/agents/shared.d.ts +246 -0
- package/dist/agents/subagentModels.d.ts +19 -0
- package/dist/agents/tokenQuota.d.ts +118 -0
- package/dist/agents/writeGateSource.d.ts +22 -0
- package/dist/agents/writePolicy.d.ts +79 -0
- package/dist/brand.d.ts +67 -0
- package/dist/cli.mjs +247846 -0
- package/dist/external.d.ts +227 -0
- package/dist/i18n/scaffolding.d.ts +59 -0
- package/dist/index.d.ts +6 -0
- package/dist/index.js +247061 -0
- package/dist/internal/index.d.ts +18 -0
- package/dist/internal.js +2398 -0
- package/dist/lifecycle.d.ts +2 -0
- package/dist/main.d.ts +8 -0
- package/dist/mcp/arkConfig.d.ts +1 -0
- package/dist/mcp/assess.d.ts +157 -0
- package/dist/mcp/capabilityContext.d.ts +71 -0
- package/dist/mcp/changeSummary.d.ts +52 -0
- package/dist/mcp/checkSuite.d.ts +27 -0
- package/dist/mcp/checkout.d.ts +92 -0
- package/dist/mcp/comment.d.ts +127 -0
- package/dist/mcp/commitInfo.d.ts +11 -0
- package/dist/mcp/crosswalk.d.ts +178 -0
- package/dist/mcp/crosswalkDigest.d.ts +1 -0
- package/dist/mcp/cyberEssentials.d.ts +24 -0
- package/dist/mcp/dashboard.d.ts +125 -0
- package/dist/mcp/dependencies.d.ts +12 -0
- package/dist/mcp/frameworks.d.ts +74 -0
- package/dist/mcp/geminiSanitizer.d.ts +28 -0
- package/dist/mcp/git.d.ts +60 -0
- package/dist/mcp/guardrails.d.ts +222 -0
- package/dist/mcp/issue.d.ts +20 -0
- package/dist/mcp/issueComments.d.ts +11 -0
- package/dist/mcp/issueEvents.d.ts +11 -0
- package/dist/mcp/issueInfo.d.ts +11 -0
- package/dist/mcp/labels.d.ts +14 -0
- package/dist/mcp/localContext.d.ts +26 -0
- package/dist/mcp/moduleExtraction.d.ts +79 -0
- package/dist/mcp/moduleTests.d.ts +106 -0
- package/dist/mcp/modules.d.ts +198 -0
- package/dist/mcp/output.d.ts +16 -0
- package/dist/mcp/pathSafety.d.ts +14 -0
- package/dist/mcp/policy.d.ts +50 -0
- package/dist/mcp/pr.d.ts +64 -0
- package/dist/mcp/prInfo.d.ts +11 -0
- package/dist/mcp/providerSchema.d.ts +52 -0
- package/dist/mcp/review.d.ts +212 -0
- package/dist/mcp/reviewComments.d.ts +245 -0
- package/dist/mcp/roots.d.ts +60 -0
- package/dist/mcp/scope.d.ts +26 -0
- package/dist/mcp/selectMode.d.ts +20 -0
- package/dist/mcp/server.d.ts +61 -0
- package/dist/mcp/shared.d.ts +62 -0
- package/dist/mcp/shell.d.ts +58 -0
- package/dist/mcp/staleFix.d.ts +138 -0
- package/dist/mcp/terraform/azurePrices.d.ts +8 -0
- package/dist/mcp/terraform/baseline.d.ts +57 -0
- package/dist/mcp/terraform/concernResult.d.ts +38 -0
- package/dist/mcp/terraform/cost.d.ts +55 -0
- package/dist/mcp/terraform/cspm.d.ts +80 -0
- package/dist/mcp/terraform/currency.d.ts +110 -0
- package/dist/mcp/terraform/decisions.d.ts +178 -0
- package/dist/mcp/terraform/eidas.d.ts +100 -0
- package/dist/mcp/terraform/evidence.d.ts +343 -0
- package/dist/mcp/terraform/findings.d.ts +76 -0
- package/dist/mcp/terraform/fixMemory.d.ts +81 -0
- package/dist/mcp/terraform/governance.d.ts +56 -0
- package/dist/mcp/terraform/hcl.d.ts +115 -0
- package/dist/mcp/terraform/iacLanguages.d.ts +120 -0
- package/dist/mcp/terraform/idleFloor.d.ts +78 -0
- package/dist/mcp/terraform/keyless.d.ts +68 -0
- package/dist/mcp/terraform/moduleDocs.d.ts +56 -0
- package/dist/mcp/terraform/nativeRules.d.ts +38 -0
- package/dist/mcp/terraform/nativeScan.d.ts +11 -0
- package/dist/mcp/terraform/noiseProfile.d.ts +100 -0
- package/dist/mcp/terraform/normalization.d.ts +52 -0
- package/dist/mcp/terraform/oscal.d.ts +103 -0
- package/dist/mcp/terraform/packs/azurerm-3-4.d.ts +2 -0
- package/dist/mcp/terraform/packs/cloudflare-4-5.d.ts +2 -0
- package/dist/mcp/terraform/paths.d.ts +28 -0
- package/dist/mcp/terraform/plan.d.ts +157 -0
- package/dist/mcp/terraform/planDrift.d.ts +199 -0
- package/dist/mcp/terraform/policyAuthor.d.ts +191 -0
- package/dist/mcp/terraform/prowlerOcsf.d.ts +136 -0
- package/dist/mcp/terraform/refactor.d.ts +183 -0
- package/dist/mcp/terraform/registry.d.ts +108 -0
- package/dist/mcp/terraform/risk.d.ts +41 -0
- package/dist/mcp/terraform/scanSession.d.ts +116 -0
- package/dist/mcp/terraform/scannerCache.d.ts +15 -0
- package/dist/mcp/terraform/scannerEgress.d.ts +72 -0
- package/dist/mcp/terraform/scannerJson.d.ts +13 -0
- package/dist/mcp/terraform/scanners.d.ts +205 -0
- package/dist/mcp/terraform/signing.d.ts +61 -0
- package/dist/mcp/terraform/stateLocking.d.ts +18 -0
- package/dist/mcp/terraform/subprocess.d.ts +43 -0
- package/dist/mcp/terraform/suppressions.d.ts +90 -0
- package/dist/mcp/terraform/taxonomy.d.ts +39 -0
- package/dist/mcp/terraform/tfquery.d.ts +47 -0
- package/dist/mcp/terraform/toolchainIntegrity.d.ts +82 -0
- package/dist/mcp/terraform/tools/authorPolicy.d.ts +59 -0
- package/dist/mcp/terraform/tools/detectPlanDrift.d.ts +20 -0
- package/dist/mcp/terraform/tools/emitCost.d.ts +11 -0
- package/dist/mcp/terraform/tools/emitSarif.d.ts +14 -0
- package/dist/mcp/terraform/tools/fixMemory.d.ts +19 -0
- package/dist/mcp/terraform/tools/infracostDiff.d.ts +22 -0
- package/dist/mcp/terraform/tools/ingestExternalFindings.d.ts +21 -0
- package/dist/mcp/terraform/tools/moduleLookup.d.ts +14 -0
- package/dist/mcp/terraform/tools/moduleSearch.d.ts +23 -0
- package/dist/mcp/terraform/tools/plan.d.ts +59 -0
- package/dist/mcp/terraform/tools/providerUpgrade.d.ts +55 -0
- package/dist/mcp/terraform/tools/readFindings.d.ts +17 -0
- package/dist/mcp/terraform/tools/scan.d.ts +114 -0
- package/dist/mcp/terraform/tools/validate.d.ts +31 -0
- package/dist/mcp/terraform/tools/verifyRemediation.d.ts +31 -0
- package/dist/mcp/terraform/tools/versionCurrency.d.ts +5 -0
- package/dist/mcp/terraform/tools.d.ts +16 -0
- package/dist/mcp/terraform/transformPacks.d.ts +267 -0
- package/dist/mcp/terraform/types.d.ts +226 -0
- package/dist/mcp/terraform/verification.d.ts +81 -0
- package/dist/mcp/terraform/vex.d.ts +115 -0
- package/dist/mcp/terraform/writeOnly.d.ts +67 -0
- package/dist/mcp/terraform.d.ts +51 -0
- package/dist/mcp/terratest.d.ts +85 -0
- package/dist/mcp/untrustedContent.d.ts +76 -0
- package/dist/mcp/upload.d.ts +8 -0
- package/dist/models.d.ts +181 -0
- package/dist/modes/address-reviews.d.ts +2 -0
- package/dist/modes/assess.d.ts +2 -0
- package/dist/modes/build.d.ts +2 -0
- package/dist/modes/compliance-audit.d.ts +2 -0
- package/dist/modes/cost-optimization.d.ts +2 -0
- package/dist/modes/drift-detect.d.ts +2 -0
- package/dist/modes/fix.d.ts +2 -0
- package/dist/modes/incremental-review.d.ts +2 -0
- package/dist/modes/index.d.ts +24 -0
- package/dist/modes/modernize-deprecated.d.ts +2 -0
- package/dist/modes/plan.d.ts +2 -0
- package/dist/modes/policy-gate.d.ts +2 -0
- package/dist/modes/prFormats.d.ts +3 -0
- package/dist/modes/refactor.d.ts +2 -0
- package/dist/modes/refresh-remediation.d.ts +2 -0
- package/dist/modes/remediate-and-refactor.d.ts +2 -0
- package/dist/modes/remediate.d.ts +2 -0
- package/dist/modes/resolve-conflicts.d.ts +2 -0
- package/dist/modes/review.d.ts +2 -0
- package/dist/modes/summarize-pr.d.ts +2 -0
- package/dist/modes/task.d.ts +2 -0
- package/dist/modes/terraform-code-review.d.ts +2 -0
- package/dist/modes/types.d.ts +9 -0
- package/dist/modes/update-dependencies.d.ts +2 -0
- package/dist/prep/index.d.ts +7 -0
- package/dist/prep/installNodeDependencies.d.ts +2 -0
- package/dist/prep/installPythonDependencies.d.ts +2 -0
- package/dist/prep/types.d.ts +31 -0
- package/dist/reviewQuality.d.ts +107 -0
- package/dist/skills/terraform-best-practices/SKILL.md +379 -0
- package/dist/toolState.d.ts +123 -0
- package/dist/utils/activity.d.ts +40 -0
- package/dist/utils/agent.d.ts +47 -0
- package/dist/utils/agentHangReport.d.ts +38 -0
- package/dist/utils/annotations.d.ts +17 -0
- package/dist/utils/apiFetch.d.ts +11 -0
- package/dist/utils/apiKeys.d.ts +48 -0
- package/dist/utils/apiUrl.d.ts +28 -0
- package/dist/utils/assets.d.ts +8 -0
- package/dist/utils/baseRefConfig.d.ts +121 -0
- package/dist/utils/billingErrors.d.ts +85 -0
- package/dist/utils/body.d.ts +34 -0
- package/dist/utils/buildInfraweaverFooter.d.ts +29 -0
- package/dist/utils/byokFallback.d.ts +85 -0
- package/dist/utils/changeImpact.d.ts +101 -0
- package/dist/utils/claudeSubscription.d.ts +30 -0
- package/dist/utils/cli.d.ts +10 -0
- package/dist/utils/cloudClient.d.ts +33 -0
- package/dist/utils/cloudFetchCore.d.ts +42 -0
- package/dist/utils/cloudReport.d.ts +114 -0
- package/dist/utils/codexHome.d.ts +29 -0
- package/dist/utils/codexOAuth.d.ts +60 -0
- package/dist/utils/diffCoverage.d.ts +63 -0
- package/dist/utils/env.d.ts +46 -0
- package/dist/utils/errorReport.d.ts +17 -0
- package/dist/utils/exitHandler.d.ts +8 -0
- package/dist/utils/fixDoubleEscapedString.d.ts +1 -0
- package/dist/utils/gitAuth.d.ts +84 -0
- package/dist/utils/gitAuthServer.d.ts +24 -0
- package/dist/utils/github.d.ts +104 -0
- package/dist/utils/globals.d.ts +3 -0
- package/dist/utils/infraweaverConfig.d.ts +56 -0
- package/dist/utils/install.d.ts +37 -0
- package/dist/utils/instructions.d.ts +48 -0
- package/dist/utils/keylessOidc.d.ts +28 -0
- package/dist/utils/leapingComment.d.ts +11 -0
- package/dist/utils/learnings.d.ts +62 -0
- package/dist/utils/learningsTruncate.d.ts +25 -0
- package/dist/utils/lifecycle.d.ts +57 -0
- package/dist/utils/log.d.ts +111 -0
- package/dist/utils/modelResolver.d.ts +63 -0
- package/dist/utils/moduleFetch.d.ts +39 -0
- package/dist/utils/normalizeEnv.d.ts +30 -0
- package/dist/utils/openCodeModels.d.ts +11 -0
- package/dist/utils/openaiCompatible.d.ts +26 -0
- package/dist/utils/opentofuMcp.d.ts +50 -0
- package/dist/utils/overrides.d.ts +40 -0
- package/dist/utils/packageManager.d.ts +49 -0
- package/dist/utils/patchWorkflowRunFields.d.ts +29 -0
- package/dist/utils/payload.d.ts +249 -0
- package/dist/utils/prSummary.d.ts +61 -0
- package/dist/utils/presets.d.ts +36 -0
- package/dist/utils/progressComment.d.ts +146 -0
- package/dist/utils/providerErrors.d.ts +31 -0
- package/dist/utils/proxyModel.d.ts +76 -0
- package/dist/utils/rangeDiff.d.ts +51 -0
- package/dist/utils/redact.d.ts +33 -0
- package/dist/utils/registryAuth.d.ts +52 -0
- package/dist/utils/remediationCommand.d.ts +58 -0
- package/dist/utils/retry.d.ts +38 -0
- package/dist/utils/reviewCleanup.d.ts +14 -0
- package/dist/utils/run.d.ts +9 -0
- package/dist/utils/runContext.d.ts +112 -0
- package/dist/utils/runContextData.d.ts +42 -0
- package/dist/utils/runErrorRenderer.d.ts +64 -0
- package/dist/utils/runLifecycle.d.ts +89 -0
- package/dist/utils/runStartupLog.d.ts +15 -0
- package/dist/utils/secrets.d.ts +34 -0
- package/dist/utils/setup.d.ts +90 -0
- package/dist/utils/shell.d.ts +44 -0
- package/dist/utils/skills.d.ts +10 -0
- package/dist/utils/subprocess.d.ts +81 -0
- package/dist/utils/terraformMcp.d.ts +46 -0
- package/dist/utils/time.d.ts +15 -0
- package/dist/utils/timer.d.ts +23 -0
- package/dist/utils/todoTracking.d.ts +16 -0
- package/dist/utils/token.d.ts +52 -0
- package/dist/utils/toolLicensing.d.ts +56 -0
- package/dist/utils/toolSelection.d.ts +73 -0
- package/dist/utils/toon.d.ts +16 -0
- package/dist/utils/version.d.ts +2 -0
- package/dist/utils/versioning.d.ts +7 -0
- package/dist/utils/vertex.d.ts +16 -0
- package/dist/utils/workflow.d.ts +13 -0
- package/package.json +132 -0
- package/src/agents/claude.ts +1588 -0
- package/src/agents/claudePretoolGate.ts +286 -0
- package/src/agents/dispatchMetrics.ts +162 -0
- package/src/agents/gateServer.ts +178 -0
- package/src/agents/index.ts +10 -0
- package/src/agents/nativeFsDenies.ts +164 -0
- package/src/agents/opencode.ts +1600 -0
- package/src/agents/opencodePlugin.ts +304 -0
- package/src/agents/opencodeShared.ts +134 -0
- package/src/agents/postRun.ts +615 -0
- package/src/agents/reviewer.ts +134 -0
- package/src/agents/sessionLabeler.ts +185 -0
- package/src/agents/shared.ts +377 -0
- package/src/agents/subagentModels.ts +40 -0
- package/src/agents/tokenQuota.ts +203 -0
- package/src/agents/writeGateSource.ts +148 -0
- package/src/agents/writePolicy.ts +132 -0
- package/src/brand.ts +84 -0
- package/src/cli.ts +117 -0
- package/src/commands/gha.ts +188 -0
- package/src/commands/mcp.ts +126 -0
- package/src/commands/verifyEvidence.ts +100 -0
- package/src/entry.ts +7 -0
- package/src/entryPost.ts +109 -0
- package/src/external.ts +308 -0
- package/src/i18n/scaffolding.ts +191 -0
- package/src/index.ts +7 -0
- package/src/internal/index.ts +74 -0
- package/src/lifecycle.ts +2 -0
- package/src/main.ts +815 -0
- package/src/mcp/__fixtures__/infraweaver-scratch-pr-49-review-3485940013.json +110 -0
- package/src/mcp/__fixtures__/infraweaver-scratch-pr-64-review-3531000326.json +14 -0
- package/src/mcp/__fixtures__/infraweaver-test-repo-pr-1.diff.json +67 -0
- package/src/mcp/__snapshots__/checkout.test.ts.snap +109 -0
- package/src/mcp/__snapshots__/reviewComments.test.ts.snap +71 -0
- package/src/mcp/arkConfig.ts +7 -0
- package/src/mcp/assess.ts +723 -0
- package/src/mcp/capabilityContext.ts +80 -0
- package/src/mcp/changeSummary.ts +145 -0
- package/src/mcp/checkSuite.ts +261 -0
- package/src/mcp/checkout.ts +1015 -0
- package/src/mcp/comment.ts +683 -0
- package/src/mcp/commitInfo.ts +57 -0
- package/src/mcp/crosswalk.ts +1253 -0
- package/src/mcp/crosswalkDigest.ts +5 -0
- package/src/mcp/cyberEssentials.ts +60 -0
- package/src/mcp/dashboard.ts +232 -0
- package/src/mcp/dependencies.ts +190 -0
- package/src/mcp/frameworks.ts +236 -0
- package/src/mcp/geminiSanitizer.ts +212 -0
- package/src/mcp/git.ts +1116 -0
- package/src/mcp/guardrails.ts +771 -0
- package/src/mcp/issue.ts +74 -0
- package/src/mcp/issueComments.ts +48 -0
- package/src/mcp/issueEvents.ts +100 -0
- package/src/mcp/issueInfo.ts +72 -0
- package/src/mcp/labels.ts +35 -0
- package/src/mcp/localContext.ts +65 -0
- package/src/mcp/localServer.ts +217 -0
- package/src/mcp/moduleExtraction.ts +368 -0
- package/src/mcp/moduleTests.ts +421 -0
- package/src/mcp/modules.ts +752 -0
- package/src/mcp/output.ts +71 -0
- package/src/mcp/pathSafety.ts +28 -0
- package/src/mcp/policy.ts +226 -0
- package/src/mcp/pr.ts +238 -0
- package/src/mcp/prInfo.ts +91 -0
- package/src/mcp/providerSchema.ts +175 -0
- package/src/mcp/review.ts +1081 -0
- package/src/mcp/reviewComments.ts +1137 -0
- package/src/mcp/roots.ts +217 -0
- package/src/mcp/scope.ts +82 -0
- package/src/mcp/selectMode.ts +207 -0
- package/src/mcp/server.ts +498 -0
- package/src/mcp/shared.ts +120 -0
- package/src/mcp/shell.ts +631 -0
- package/src/mcp/staleFix.ts +557 -0
- package/src/mcp/terraform/__snapshots__/moduleDocs.test.ts.snap +40 -0
- package/src/mcp/terraform/azurePrices.ts +38 -0
- package/src/mcp/terraform/baseline.ts +172 -0
- package/src/mcp/terraform/concernResult.ts +111 -0
- package/src/mcp/terraform/cost.ts +175 -0
- package/src/mcp/terraform/cspm.ts +326 -0
- package/src/mcp/terraform/currency.ts +354 -0
- package/src/mcp/terraform/decisions.ts +590 -0
- package/src/mcp/terraform/eidas.ts +134 -0
- package/src/mcp/terraform/evidence.ts +771 -0
- package/src/mcp/terraform/findings.ts +383 -0
- package/src/mcp/terraform/fixMemory.ts +253 -0
- package/src/mcp/terraform/governance.ts +231 -0
- package/src/mcp/terraform/hcl.ts +273 -0
- package/src/mcp/terraform/iacLanguages.ts +431 -0
- package/src/mcp/terraform/idleFloor.ts +304 -0
- package/src/mcp/terraform/keyless.ts +123 -0
- package/src/mcp/terraform/moduleDocs.ts +303 -0
- package/src/mcp/terraform/nativeRules.ts +152 -0
- package/src/mcp/terraform/nativeScan.ts +67 -0
- package/src/mcp/terraform/noiseProfile.ts +183 -0
- package/src/mcp/terraform/normalization.ts +265 -0
- package/src/mcp/terraform/oscal.ts +283 -0
- package/src/mcp/terraform/packs/azurerm-3-4.ts +382 -0
- package/src/mcp/terraform/packs/cloudflare-4-5.ts +114 -0
- package/src/mcp/terraform/paths.ts +59 -0
- package/src/mcp/terraform/plan.ts +377 -0
- package/src/mcp/terraform/planDrift.ts +520 -0
- package/src/mcp/terraform/policyAuthor.ts +886 -0
- package/src/mcp/terraform/prowlerOcsf.ts +380 -0
- package/src/mcp/terraform/refactor.ts +879 -0
- package/src/mcp/terraform/registry.ts +317 -0
- package/src/mcp/terraform/risk.ts +99 -0
- package/src/mcp/terraform/scanSession.ts +242 -0
- package/src/mcp/terraform/scannerCache.ts +86 -0
- package/src/mcp/terraform/scannerEgress.ts +141 -0
- package/src/mcp/terraform/scannerJson.ts +22 -0
- package/src/mcp/terraform/scanners.ts +1134 -0
- package/src/mcp/terraform/signing.ts +151 -0
- package/src/mcp/terraform/stateLocking.ts +106 -0
- package/src/mcp/terraform/subprocess.ts +102 -0
- package/src/mcp/terraform/suppressions.ts +551 -0
- package/src/mcp/terraform/taxonomy.ts +0 -0
- package/src/mcp/terraform/tfquery.ts +159 -0
- package/src/mcp/terraform/toolchainIntegrity.ts +151 -0
- package/src/mcp/terraform/tools/authorPolicy.ts +185 -0
- package/src/mcp/terraform/tools/detectPlanDrift.ts +279 -0
- package/src/mcp/terraform/tools/emitCost.ts +130 -0
- package/src/mcp/terraform/tools/emitSarif.ts +108 -0
- package/src/mcp/terraform/tools/fixMemory.ts +82 -0
- package/src/mcp/terraform/tools/infracostDiff.ts +110 -0
- package/src/mcp/terraform/tools/ingestExternalFindings.ts +259 -0
- package/src/mcp/terraform/tools/moduleLookup.ts +86 -0
- package/src/mcp/terraform/tools/moduleSearch.ts +46 -0
- package/src/mcp/terraform/tools/plan.ts +384 -0
- package/src/mcp/terraform/tools/providerUpgrade.ts +217 -0
- package/src/mcp/terraform/tools/readFindings.ts +138 -0
- package/src/mcp/terraform/tools/scan.ts +303 -0
- package/src/mcp/terraform/tools/validate.ts +160 -0
- package/src/mcp/terraform/tools/verifyRemediation.ts +190 -0
- package/src/mcp/terraform/tools/versionCurrency.ts +64 -0
- package/src/mcp/terraform/tools.ts +62 -0
- package/src/mcp/terraform/transformPacks.ts +594 -0
- package/src/mcp/terraform/types.ts +382 -0
- package/src/mcp/terraform/verification.ts +150 -0
- package/src/mcp/terraform/vex.ts +367 -0
- package/src/mcp/terraform/writeOnly.ts +252 -0
- package/src/mcp/terraform.ts +52 -0
- package/src/mcp/terratest.ts +215 -0
- package/src/mcp/untrustedContent.ts +126 -0
- package/src/mcp/upload.ts +123 -0
- package/src/models.ts +753 -0
- package/src/modes/address-reviews.ts +35 -0
- package/src/modes/assess.ts +27 -0
- package/src/modes/build.ts +86 -0
- package/src/modes/compliance-audit.ts +25 -0
- package/src/modes/cost-optimization.ts +36 -0
- package/src/modes/drift-detect.ts +31 -0
- package/src/modes/fix.ts +29 -0
- package/src/modes/incremental-review.ts +103 -0
- package/src/modes/index.ts +94 -0
- package/src/modes/modernize-deprecated.ts +36 -0
- package/src/modes/plan.ts +21 -0
- package/src/modes/policy-gate.ts +27 -0
- package/src/modes/prFormats.ts +325 -0
- package/src/modes/refactor.ts +74 -0
- package/src/modes/refresh-remediation.ts +40 -0
- package/src/modes/remediate-and-refactor.ts +42 -0
- package/src/modes/remediate.ts +78 -0
- package/src/modes/resolve-conflicts.ts +32 -0
- package/src/modes/review.ts +135 -0
- package/src/modes/summarize-pr.ts +42 -0
- package/src/modes/task.ts +26 -0
- package/src/modes/terraform-code-review.ts +68 -0
- package/src/modes/types.ts +17 -0
- package/src/modes/update-dependencies.ts +44 -0
- package/src/prep/index.ts +96 -0
- package/src/prep/installNodeDependencies.ts +251 -0
- package/src/prep/installPythonDependencies.ts +235 -0
- package/src/prep/types.ts +38 -0
- package/src/reviewQuality.ts +237 -0
- package/src/runCli.ts +335 -0
- package/src/skills/terraform-best-practices/SKILL.md +379 -0
- package/src/toolState.ts +241 -0
- package/src/utils/activity.ts +210 -0
- package/src/utils/agent.ts +245 -0
- package/src/utils/agentHangReport.ts +180 -0
- package/src/utils/annotations.ts +56 -0
- package/src/utils/apiFetch.ts +19 -0
- package/src/utils/apiKeys.ts +305 -0
- package/src/utils/apiUrl.ts +42 -0
- package/src/utils/assets.ts +123 -0
- package/src/utils/baseRefConfig.ts +254 -0
- package/src/utils/billingErrors.ts +210 -0
- package/src/utils/body.ts +168 -0
- package/src/utils/buildInfraweaverFooter.ts +104 -0
- package/src/utils/byokFallback.ts +137 -0
- package/src/utils/changeImpact.ts +330 -0
- package/src/utils/claudeSubscription.ts +93 -0
- package/src/utils/cli.ts +36 -0
- package/src/utils/cloudClient.ts +57 -0
- package/src/utils/cloudFetchCore.ts +139 -0
- package/src/utils/cloudReport.ts +316 -0
- package/src/utils/codexHome.ts +204 -0
- package/src/utils/codexOAuth.ts +154 -0
- package/src/utils/codexRefreshDetect.ts +36 -0
- package/src/utils/diffCoverage.ts +404 -0
- package/src/utils/env.ts +84 -0
- package/src/utils/errorReport.ts +94 -0
- package/src/utils/exitHandler.ts +35 -0
- package/src/utils/fixDoubleEscapedString.ts +9 -0
- package/src/utils/ghaCore.ts +13 -0
- package/src/utils/gitAuth.ts +268 -0
- package/src/utils/gitAuthServer.ts +186 -0
- package/src/utils/github.ts +676 -0
- package/src/utils/globals.ts +9 -0
- package/src/utils/humanEditCapture.ts +198 -0
- package/src/utils/infraweaverConfig.ts +202 -0
- package/src/utils/install.ts +279 -0
- package/src/utils/instructions.ts +640 -0
- package/src/utils/keylessOidc.ts +47 -0
- package/src/utils/leapingComment.ts +20 -0
- package/src/utils/learnings.ts +145 -0
- package/src/utils/learningsTruncate.ts +42 -0
- package/src/utils/lifecycle.ts +198 -0
- package/src/utils/log.ts +452 -0
- package/src/utils/modelResolver.ts +105 -0
- package/src/utils/moduleFetch.ts +138 -0
- package/src/utils/normalizeEnv.ts +106 -0
- package/src/utils/openCodeModels.ts +86 -0
- package/src/utils/openaiCompatible.ts +52 -0
- package/src/utils/opentofuMcp.ts +61 -0
- package/src/utils/overrides.ts +100 -0
- package/src/utils/packageManager.ts +257 -0
- package/src/utils/patchWorkflowRunFields.ts +173 -0
- package/src/utils/payload.ts +1206 -0
- package/src/utils/prSummary.ts +148 -0
- package/src/utils/presets.ts +105 -0
- package/src/utils/progressComment.ts +266 -0
- package/src/utils/providerErrors.ts +189 -0
- package/src/utils/proxyModel.ts +239 -0
- package/src/utils/rangeDiff.ts +182 -0
- package/src/utils/redact.ts +86 -0
- package/src/utils/registryAuth.ts +115 -0
- package/src/utils/remediationCommand.ts +144 -0
- package/src/utils/retry.ts +180 -0
- package/src/utils/reviewCleanup.ts +116 -0
- package/src/utils/run.ts +100 -0
- package/src/utils/runContext.ts +276 -0
- package/src/utils/runContextData.ts +121 -0
- package/src/utils/runErrorRenderer.ts +282 -0
- package/src/utils/runFixture.ts +91 -0
- package/src/utils/runLifecycle.ts +360 -0
- package/src/utils/runStartupLog.ts +67 -0
- package/src/utils/secrets.ts +208 -0
- package/src/utils/setup.ts +368 -0
- package/src/utils/shell.ts +132 -0
- package/src/utils/skills.ts +67 -0
- package/src/utils/subprocess.ts +474 -0
- package/src/utils/terraformMcp.ts +99 -0
- package/src/utils/time.ts +59 -0
- package/src/utils/timer.ts +72 -0
- package/src/utils/todoTracking.ts +168 -0
- package/src/utils/token.ts +294 -0
- package/src/utils/toolLicensing.ts +152 -0
- package/src/utils/toolSelection.ts +239 -0
- package/src/utils/toon.ts +76 -0
- package/src/utils/version.ts +10 -0
- package/src/utils/versioning.ts +44 -0
- package/src/utils/vertex.ts +94 -0
- package/src/utils/workflow.ts +25 -0
package/src/utils/run.ts
ADDED
|
@@ -0,0 +1,100 @@
|
|
|
1
|
+
import type { AgentResult } from "#app/agents/shared";
|
|
2
|
+
import type { MainResult } from "#app/main";
|
|
3
|
+
import { reportProgress } from "#app/mcp/comment";
|
|
4
|
+
import type { ToolContext } from "#app/mcp/server";
|
|
5
|
+
import { log } from "#app/utils/cli";
|
|
6
|
+
import { reportErrorToComment } from "#app/utils/errorReport";
|
|
7
|
+
|
|
8
|
+
export interface HandleAgentResultParams {
|
|
9
|
+
result: AgentResult;
|
|
10
|
+
toolContext: ToolContext;
|
|
11
|
+
silent: boolean | undefined;
|
|
12
|
+
}
|
|
13
|
+
|
|
14
|
+
function getErrorMessage(error: unknown): string {
|
|
15
|
+
return error instanceof Error ? error.message : String(error);
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
export async function handleAgentResult(ctx: HandleAgentResultParams): Promise<MainResult> {
|
|
19
|
+
if (!ctx.result.success) {
|
|
20
|
+
// rendering + posting for the `!success` branch lives in
|
|
21
|
+
// `finalizeSuccessRun` (called immediately before this function) so the
|
|
22
|
+
// BYOK billing-exhausted, hang, and api-key bodies land on a single
|
|
23
|
+
// surface — both for runs with a pre-existing progress comment AND for
|
|
24
|
+
// silent triggers via `createIfMissing`. see #835.
|
|
25
|
+
return {
|
|
26
|
+
success: false,
|
|
27
|
+
error: ctx.result.error || "Agent execution failed",
|
|
28
|
+
output: ctx.result.output!,
|
|
29
|
+
};
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
// IncrementalReview's non-substantive path exits cleanly without
|
|
33
|
+
// submitting any review, so no MCP write tool flips wasUpdated and the
|
|
34
|
+
// strict completion check below would otherwise fail the run. The
|
|
35
|
+
// isReviewMode skip is load-bearing for that path: the agent's exit
|
|
36
|
+
// code is the completion signal, not a progress-comment write.
|
|
37
|
+
// (Review mode that submits a real review now flips wasUpdated via
|
|
38
|
+
// create_pull_request_review, so the skip is redundant for the
|
|
39
|
+
// substantive-review path but kept for symmetry with IncrementalReview.)
|
|
40
|
+
// See plans/review_progress_comment_cleanup_b0120f6c.plan.md.
|
|
41
|
+
const toolState = ctx.toolContext.toolState;
|
|
42
|
+
const mode = toolState.selectedMode;
|
|
43
|
+
const isReviewMode =
|
|
44
|
+
mode === "Review" || mode === "IncrementalReview" || mode === "TerraformCodeReview";
|
|
45
|
+
if (!isReviewMode && !toolState.wasUpdated && toolState.hadProgressComment && !ctx.silent) {
|
|
46
|
+
// the agent exited successfully but never landed a GitHub write — either it
|
|
47
|
+
// answered the mention in raw assistant text (which is never posted, only
|
|
48
|
+
// logged) or a write tool failed (e.g. report_progress hit a 401). salvage
|
|
49
|
+
// by delivering the content we have to the progress comment so the user
|
|
50
|
+
// actually gets the answer instead of a failed run. (finalizeSuccessRun
|
|
51
|
+
// preserves the progress comment whenever wasUpdated is false, so the write
|
|
52
|
+
// lands here.)
|
|
53
|
+
//
|
|
54
|
+
// stop the todo tracker first: on this path the agent used todowrite but
|
|
55
|
+
// never called report_progress, so a pending debounced render could still
|
|
56
|
+
// be queued — draining it keeps it from clobbering the salvaged answer and
|
|
57
|
+
// from holding the event loop open. mirrors ReportProgressTool.
|
|
58
|
+
const tracker = toolState.todoTracker;
|
|
59
|
+
if (tracker) {
|
|
60
|
+
tracker.cancel();
|
|
61
|
+
await tracker.settled();
|
|
62
|
+
}
|
|
63
|
+
// `lastProgressBody` is the body a failed report_progress already assembled
|
|
64
|
+
// (task-list collapsible included), so use it verbatim; otherwise fall back
|
|
65
|
+
// to the agent's final assistant text and append the collapsible the way
|
|
66
|
+
// report_progress would.
|
|
67
|
+
let salvage = toolState.lastProgressBody?.trim();
|
|
68
|
+
if (!salvage) {
|
|
69
|
+
const output = ctx.result.output?.trim();
|
|
70
|
+
const collapsible = tracker?.renderCollapsible({ completeInProgress: true });
|
|
71
|
+
salvage = output && collapsible ? `${output}\n\n${collapsible}` : output;
|
|
72
|
+
}
|
|
73
|
+
if (salvage) {
|
|
74
|
+
try {
|
|
75
|
+
await reportProgress(ctx.toolContext, { body: salvage });
|
|
76
|
+
log.success("Task complete.");
|
|
77
|
+
return { success: true, output: ctx.result.output || "" };
|
|
78
|
+
} catch (writeError) {
|
|
79
|
+
// the write itself is failing (auth/permissions) — surface THAT, not
|
|
80
|
+
// the generic "no progress" message, so the real cause isn't masked.
|
|
81
|
+
const error = `failed to deliver agent result: ${getErrorMessage(writeError)}`;
|
|
82
|
+
await reportErrorToComment({ toolState, error, title: "Error" }).catch(() => {});
|
|
83
|
+
return { success: false, error, output: ctx.result.output || "" };
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
|
|
87
|
+
const error = ctx.result.error || "agent completed without reporting progress";
|
|
88
|
+
try {
|
|
89
|
+
await reportErrorToComment({ toolState, error, title: "Error" });
|
|
90
|
+
} catch {}
|
|
91
|
+
return { success: false, error, output: ctx.result.output || "" };
|
|
92
|
+
}
|
|
93
|
+
|
|
94
|
+
log.success("Task complete.");
|
|
95
|
+
|
|
96
|
+
return {
|
|
97
|
+
success: true,
|
|
98
|
+
output: ctx.result.output || "",
|
|
99
|
+
};
|
|
100
|
+
}
|
|
@@ -0,0 +1,276 @@
|
|
|
1
|
+
import { PRODUCT_NAME, TOKEN_PREFIX } from "#app/brand";
|
|
2
|
+
import type { PushPermission, ShellPermission } from "#app/external";
|
|
3
|
+
import { apiFetch } from "#app/utils/apiFetch";
|
|
4
|
+
import { isBackendConfigured } from "#app/utils/apiUrl";
|
|
5
|
+
import { log } from "#app/utils/cli";
|
|
6
|
+
import type { RepoContext } from "#app/utils/github";
|
|
7
|
+
|
|
8
|
+
export interface Mode {
|
|
9
|
+
id: string;
|
|
10
|
+
name: string;
|
|
11
|
+
description: string;
|
|
12
|
+
prompt: string;
|
|
13
|
+
}
|
|
14
|
+
|
|
15
|
+
/**
|
|
16
|
+
* server-parsed TOC entry for `Repo.learnings`. depth is 1-6 (h1-h6),
|
|
17
|
+
* line numbers are 1-indexed against the raw body. computed by
|
|
18
|
+
* `parseLearningsHeadings` in `utils/learningsToc.ts` (server side) and
|
|
19
|
+
* shipped over the run-context JSON boundary; the canonical declaration
|
|
20
|
+
* lives there. duplicated here because the action runtime can't reach
|
|
21
|
+
* across into the proprietary root-level codebase, and the JSON wire
|
|
22
|
+
* means typecheck can't enforce shape equality across both sides.
|
|
23
|
+
*/
|
|
24
|
+
export interface LearningsHeading {
|
|
25
|
+
depth: 1 | 2 | 3 | 4 | 5 | 6;
|
|
26
|
+
title: string;
|
|
27
|
+
startLine: number;
|
|
28
|
+
endLine: number;
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
export interface RepoSettings {
|
|
32
|
+
model: string | null;
|
|
33
|
+
modes: Mode[];
|
|
34
|
+
setupScript: string | null;
|
|
35
|
+
postCheckoutScript: string | null;
|
|
36
|
+
prepushScript: string | null;
|
|
37
|
+
stopScript: string | null;
|
|
38
|
+
push: PushPermission;
|
|
39
|
+
shell: ShellPermission;
|
|
40
|
+
prApproveEnabled: boolean;
|
|
41
|
+
modeInstructions: Record<string, string>;
|
|
42
|
+
learnings: string | null;
|
|
43
|
+
learningsHeadings: LearningsHeading[];
|
|
44
|
+
envAllowlist: string | null;
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
/**
|
|
48
|
+
* Account-level billing plan. Orthogonal to repo-level OSS status. Mirrors
|
|
49
|
+
* the server's `AccountPlan` in `utils/billing.ts`. `"none"` = free tier,
|
|
50
|
+
* `"payg"` = card on file / pay-as-you-go.
|
|
51
|
+
*/
|
|
52
|
+
export type AccountPlan = "none" | "payg";
|
|
53
|
+
|
|
54
|
+
/**
|
|
55
|
+
* Cloud-managed module credentials for this repo, entered once in the dashboard's
|
|
56
|
+
* Refactor dialog and sealed at rest. Delivered over the authenticated, repo-scoped
|
|
57
|
+
* run-context call (never the GitHub `repository_dispatch` payload). Used by the
|
|
58
|
+
* engine only as a FALLBACK for the matching action inputs — an explicit
|
|
59
|
+
* `module_fetch_token` / `registry_token` input always wins. Both fields optional;
|
|
60
|
+
* absent on OSS / unmanaged runs or when none were stored.
|
|
61
|
+
*/
|
|
62
|
+
export interface ModuleCredentials {
|
|
63
|
+
/** read-only PAT for a private cross-repo `git::` module (refactor b.1). */
|
|
64
|
+
moduleFetchToken?: string;
|
|
65
|
+
/** bearer token for a private Terraform registry module (refactor b.4). */
|
|
66
|
+
registryToken?: string;
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
export interface RunContext {
|
|
70
|
+
settings: RepoSettings;
|
|
71
|
+
apiToken: string;
|
|
72
|
+
oss: boolean;
|
|
73
|
+
plan: AccountPlan;
|
|
74
|
+
/**
|
|
75
|
+
* The maintained-pack control ids this run's ORG marked MANDATORY in the Cloud
|
|
76
|
+
* dashboard (the "required controls" policy). Org-scoped by construction — the
|
|
77
|
+
* run-context call is authenticated to exactly one org + repo, so a run only
|
|
78
|
+
* ever receives its own org's policy. Merged into the gate's `required_controls`
|
|
79
|
+
* so an open finding on any of these fails CI regardless of severity. `[]` for
|
|
80
|
+
* OSS / unmanaged runs.
|
|
81
|
+
*/
|
|
82
|
+
requiredControls: string[];
|
|
83
|
+
/** §5.12 the org's proven-fix library — patterns (finding-type → proven
|
|
84
|
+
* transformation) captured from prior `✗→✓` proofs across the org's fleet,
|
|
85
|
+
* served so this run can offer them as priors for matching finding-types. An
|
|
86
|
+
* untrusted blob coerced engine-side (utils/fixMemory `coerceLibrary`). `[]`
|
|
87
|
+
* for OSS / unentitled / unconfigured runs. */
|
|
88
|
+
provenFixes: unknown[];
|
|
89
|
+
/** G7 the org's fleet-wide dismissal record — which rules this org has waived,
|
|
90
|
+
* across how many DISTINCT repos, with the reasons given. A SURFACING signal
|
|
91
|
+
* only: it reorders the low-severity tail and can neither suppress a finding
|
|
92
|
+
* nor change a verdict (see `terraform/noiseProfile`). An untrusted blob
|
|
93
|
+
* coerced engine-side, same posture as {@link RunContext.provenFixes}. `[]`
|
|
94
|
+
* for OSS / unentitled / unconfigured runs. */
|
|
95
|
+
noiseProfile: unknown[];
|
|
96
|
+
/** TC-2.2 the org's fleet-wide record of provider-upgrade transforms that have
|
|
97
|
+
* already planned cleanly elsewhere — counters keyed by transform id, never
|
|
98
|
+
* another repo's configuration. Annotates a detected transform with how widely
|
|
99
|
+
* it has been proven. An untrusted blob coerced engine-side, same posture as
|
|
100
|
+
* {@link RunContext.provenFixes}. `[]` for OSS / unentitled / unconfigured runs. */
|
|
101
|
+
provenTransforms: unknown[];
|
|
102
|
+
/** Cloud-managed module credentials (see {@link ModuleCredentials}); undefined
|
|
103
|
+
* when none are stored for this repo. */
|
|
104
|
+
moduleCredentials?: ModuleCredentials;
|
|
105
|
+
}
|
|
106
|
+
|
|
107
|
+
const defaultSettings: RepoSettings = {
|
|
108
|
+
model: null,
|
|
109
|
+
modes: [],
|
|
110
|
+
setupScript: null,
|
|
111
|
+
postCheckoutScript: null,
|
|
112
|
+
prepushScript: null,
|
|
113
|
+
stopScript: null,
|
|
114
|
+
push: "restricted",
|
|
115
|
+
shell: "restricted",
|
|
116
|
+
prApproveEnabled: false,
|
|
117
|
+
modeInstructions: {},
|
|
118
|
+
learnings: null,
|
|
119
|
+
learningsHeadings: [],
|
|
120
|
+
envAllowlist: null,
|
|
121
|
+
};
|
|
122
|
+
|
|
123
|
+
const defaultRunContext: RunContext = {
|
|
124
|
+
settings: defaultSettings,
|
|
125
|
+
apiToken: "",
|
|
126
|
+
oss: false,
|
|
127
|
+
plan: "none",
|
|
128
|
+
requiredControls: [],
|
|
129
|
+
provenFixes: [],
|
|
130
|
+
noiseProfile: [],
|
|
131
|
+
provenTransforms: [],
|
|
132
|
+
};
|
|
133
|
+
|
|
134
|
+
function fellBackToDefaults(reason: string): RunContext {
|
|
135
|
+
if (isBackendConfigured()) {
|
|
136
|
+
log.warning(
|
|
137
|
+
`» repo settings unavailable (${reason}); using defaults — Cloud policy (required controls, modes, model) is NOT applied for this run`,
|
|
138
|
+
);
|
|
139
|
+
}
|
|
140
|
+
return defaultRunContext;
|
|
141
|
+
}
|
|
142
|
+
|
|
143
|
+
/**
|
|
144
|
+
* Actionable hint for a 401/403 from the run-context call — by far the most common
|
|
145
|
+
* setup mistake. A Cloud-connected workflow authenticates to Infraweaver Cloud one of
|
|
146
|
+
* two ways: the tokenless GitHub App path (the engine mints a GitHub Actions OIDC
|
|
147
|
+
* token, which needs `permissions: id-token: write`), or an org token passed as the
|
|
148
|
+
* `api_token` input. With neither, Cloud only sees the workflow's GitHub job token —
|
|
149
|
+
* which it can't use — and rejects the run, so reporting + learnings silently no-op.
|
|
150
|
+
* The message is tailored to whether an OIDC token was even available this run, so we
|
|
151
|
+
* don't tell someone to add a permission they already granted.
|
|
152
|
+
*/
|
|
153
|
+
function cloudAuthHint(status: number, oidcToken: string | undefined): string {
|
|
154
|
+
if (!oidcToken) {
|
|
155
|
+
return (
|
|
156
|
+
`» ${PRODUCT_NAME} Cloud rejected this run (HTTP ${status}) and NO GitHub Actions OIDC token was ` +
|
|
157
|
+
`available. To report via the ${PRODUCT_NAME} GitHub App (tokenless), add \`id-token: write\` to this ` +
|
|
158
|
+
`workflow's \`permissions:\` block — no secret needed. Or pass an \`api_token\` input (a ${TOKEN_PREFIX} org ` +
|
|
159
|
+
"token from the Cloud Tokens page) to use the org-token path instead. Until then this run can't " +
|
|
160
|
+
"reach Cloud and runs as pure OSS (results stay in CI)."
|
|
161
|
+
);
|
|
162
|
+
}
|
|
163
|
+
return (
|
|
164
|
+
`» ${PRODUCT_NAME} Cloud rejected this run's GitHub OIDC identity (HTTP ${status}). The OIDC token was ` +
|
|
165
|
+
`sent, so \`id-token: write\` is set correctly — check instead that the ${PRODUCT_NAME} GitHub App is ` +
|
|
166
|
+
"installed on this repository's owner, and that `GITHUB_OIDC_AUDIENCE` (if you set it) matches " +
|
|
167
|
+
`the value configured in ${PRODUCT_NAME} Cloud.`
|
|
168
|
+
);
|
|
169
|
+
}
|
|
170
|
+
|
|
171
|
+
/** Coerce the untrusted run-context `moduleCredentials` blob into the typed shape,
|
|
172
|
+
* keeping only non-empty string values. Returns undefined when nothing usable is
|
|
173
|
+
* present (so the engine treats it as "no managed credentials"). */
|
|
174
|
+
export function parseModuleCredentials(
|
|
175
|
+
raw: { moduleFetchToken?: unknown; registryToken?: unknown } | undefined,
|
|
176
|
+
): ModuleCredentials | undefined {
|
|
177
|
+
if (!raw || typeof raw !== "object") return undefined;
|
|
178
|
+
const out: ModuleCredentials = {};
|
|
179
|
+
if (typeof raw.moduleFetchToken === "string" && raw.moduleFetchToken.trim())
|
|
180
|
+
out.moduleFetchToken = raw.moduleFetchToken;
|
|
181
|
+
if (typeof raw.registryToken === "string" && raw.registryToken.trim())
|
|
182
|
+
out.registryToken = raw.registryToken;
|
|
183
|
+
return out.moduleFetchToken || out.registryToken ? out : undefined;
|
|
184
|
+
}
|
|
185
|
+
|
|
186
|
+
/**
|
|
187
|
+
* fetch run context from Infraweaver API
|
|
188
|
+
* returns settings + API token for subsequent calls
|
|
189
|
+
* returns defaults if fetch fails (warns when a backend was configured)
|
|
190
|
+
*/
|
|
191
|
+
export async function fetchRunContext(params: {
|
|
192
|
+
token: string;
|
|
193
|
+
repoContext: RepoContext;
|
|
194
|
+
oidcToken?: string | undefined;
|
|
195
|
+
}): Promise<RunContext> {
|
|
196
|
+
const timeoutMs = 30000;
|
|
197
|
+
const controller = new AbortController();
|
|
198
|
+
const timeoutId = setTimeout(() => controller.abort(), timeoutMs);
|
|
199
|
+
|
|
200
|
+
try {
|
|
201
|
+
const headers: Record<string, string> = {
|
|
202
|
+
Authorization: `Bearer ${params.token}`,
|
|
203
|
+
};
|
|
204
|
+
if (params.oidcToken) {
|
|
205
|
+
headers["X-GitHub-OIDC-Token"] = params.oidcToken;
|
|
206
|
+
}
|
|
207
|
+
|
|
208
|
+
const response = await apiFetch({
|
|
209
|
+
path: `/api/repo/${params.repoContext.owner}/${params.repoContext.name}/run-context`,
|
|
210
|
+
headers,
|
|
211
|
+
signal: controller.signal,
|
|
212
|
+
});
|
|
213
|
+
|
|
214
|
+
clearTimeout(timeoutId);
|
|
215
|
+
|
|
216
|
+
if (!response.ok) {
|
|
217
|
+
if (
|
|
218
|
+
(response.status === 401 || response.status === 403) &&
|
|
219
|
+
isBackendConfigured()
|
|
220
|
+
) {
|
|
221
|
+
log.warning(cloudAuthHint(response.status, params.oidcToken));
|
|
222
|
+
}
|
|
223
|
+
return fellBackToDefaults(`run-context HTTP ${response.status}`);
|
|
224
|
+
}
|
|
225
|
+
|
|
226
|
+
const data = (await response.json()) as {
|
|
227
|
+
settings: RepoSettings | null;
|
|
228
|
+
apiToken: string;
|
|
229
|
+
oss?: boolean;
|
|
230
|
+
plan?: AccountPlan;
|
|
231
|
+
requiredControls?: string[];
|
|
232
|
+
provenFixes?: unknown[];
|
|
233
|
+
provenTransforms?: unknown[];
|
|
234
|
+
noiseProfile?: unknown[];
|
|
235
|
+
moduleCredentials?: {
|
|
236
|
+
moduleFetchToken?: unknown;
|
|
237
|
+
registryToken?: unknown;
|
|
238
|
+
};
|
|
239
|
+
} | null;
|
|
240
|
+
|
|
241
|
+
if (data === null) {
|
|
242
|
+
return fellBackToDefaults("run-context returned no body");
|
|
243
|
+
}
|
|
244
|
+
|
|
245
|
+
const moduleCredentials = parseModuleCredentials(data.moduleCredentials);
|
|
246
|
+
return {
|
|
247
|
+
settings: {
|
|
248
|
+
...defaultSettings,
|
|
249
|
+
...data.settings,
|
|
250
|
+
modes: data.settings?.modes ?? [],
|
|
251
|
+
setupScript: data.settings?.setupScript ?? null,
|
|
252
|
+
postCheckoutScript: data.settings?.postCheckoutScript ?? null,
|
|
253
|
+
prepushScript: data.settings?.prepushScript ?? null,
|
|
254
|
+
stopScript: data.settings?.stopScript ?? null,
|
|
255
|
+
learningsHeadings: data.settings?.learningsHeadings ?? [],
|
|
256
|
+
},
|
|
257
|
+
apiToken: data.apiToken,
|
|
258
|
+
oss: data.oss ?? false,
|
|
259
|
+
plan: data.plan ?? "none",
|
|
260
|
+
requiredControls: Array.isArray(data.requiredControls)
|
|
261
|
+
? data.requiredControls
|
|
262
|
+
: [],
|
|
263
|
+
provenFixes: Array.isArray(data.provenFixes) ? data.provenFixes : [],
|
|
264
|
+
provenTransforms: Array.isArray(data.provenTransforms)
|
|
265
|
+
? data.provenTransforms
|
|
266
|
+
: [],
|
|
267
|
+
noiseProfile: Array.isArray(data.noiseProfile) ? data.noiseProfile : [],
|
|
268
|
+
...(moduleCredentials ? { moduleCredentials } : {}),
|
|
269
|
+
};
|
|
270
|
+
} catch (err) {
|
|
271
|
+
clearTimeout(timeoutId);
|
|
272
|
+
return fellBackToDefaults(
|
|
273
|
+
err instanceof Error ? err.message : "request failed",
|
|
274
|
+
);
|
|
275
|
+
}
|
|
276
|
+
}
|
|
@@ -0,0 +1,121 @@
|
|
|
1
|
+
import * as core from "@actions/core";
|
|
2
|
+
import type { Octokit } from "@octokit/rest";
|
|
3
|
+
import { PRODUCT_NAME } from "#app/brand";
|
|
4
|
+
import { cloudOidcAudience } from "#app/utils/apiUrl";
|
|
5
|
+
import { log } from "#app/utils/cli";
|
|
6
|
+
import { type OctokitWithPlugins, parseRepoContext } from "#app/utils/github";
|
|
7
|
+
import { isTransientServerError, retry } from "#app/utils/retry";
|
|
8
|
+
import {
|
|
9
|
+
type AccountPlan,
|
|
10
|
+
fetchRunContext,
|
|
11
|
+
type ModuleCredentials,
|
|
12
|
+
type RepoSettings,
|
|
13
|
+
} from "#app/utils/runContext";
|
|
14
|
+
import packageJson from "#package.json" with { type: "json" };
|
|
15
|
+
|
|
16
|
+
export interface RunContextData {
|
|
17
|
+
repo: {
|
|
18
|
+
owner: string;
|
|
19
|
+
name: string;
|
|
20
|
+
data: Awaited<ReturnType<Octokit["repos"]["get"]>>["data"];
|
|
21
|
+
};
|
|
22
|
+
repoSettings: RepoSettings;
|
|
23
|
+
apiToken: string;
|
|
24
|
+
oss: boolean;
|
|
25
|
+
plan: AccountPlan;
|
|
26
|
+
/** The org's mandatory crosswalk-pack control ids (Cloud "required controls"
|
|
27
|
+
* policy), org-scoped via the authenticated run-context. Merged into the gate. */
|
|
28
|
+
requiredControls: string[];
|
|
29
|
+
/** §5.12 the org's proven-fix library (untrusted blob; coerced engine-side).
|
|
30
|
+
* `[]` for OSS / unentitled runs. */
|
|
31
|
+
provenFixes: unknown[];
|
|
32
|
+
/** TC-2.2 the org's proven provider-upgrade transforms (untrusted blob;
|
|
33
|
+
* coerced engine-side). Counters only — never another repo's configuration.
|
|
34
|
+
* `[]` for OSS / unentitled runs. */
|
|
35
|
+
provenTransforms: unknown[];
|
|
36
|
+
/** G7 the org's fleet-wide dismissal record (untrusted blob; coerced
|
|
37
|
+
* engine-side). Reorders surfacing only — never suppresses. `[]` for OSS /
|
|
38
|
+
* unentitled runs. */
|
|
39
|
+
noiseProfile: unknown[];
|
|
40
|
+
/** Cloud-managed module credentials for this repo (a read-only module-repo PAT /
|
|
41
|
+
* a private-registry token), entered in the dashboard's Refactor dialog. A
|
|
42
|
+
* fallback for the matching action inputs; an explicit input still wins.
|
|
43
|
+
* undefined when none are stored. */
|
|
44
|
+
moduleCredentials?: ModuleCredentials;
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
interface ResolveRunContextDataParams {
|
|
48
|
+
octokit: OctokitWithPlugins;
|
|
49
|
+
token: string;
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
/**
|
|
53
|
+
* initialize run context data: parse context, fetch repo info and settings
|
|
54
|
+
*/
|
|
55
|
+
export async function resolveRunContextData(
|
|
56
|
+
params: ResolveRunContextDataParams,
|
|
57
|
+
): Promise<RunContextData> {
|
|
58
|
+
log.info(`» running ${PRODUCT_NAME} v${packageJson.version}...`);
|
|
59
|
+
|
|
60
|
+
const repoContext = parseRepoContext();
|
|
61
|
+
|
|
62
|
+
// The org-token reporting path authenticates the run to Cloud with an `api_token`.
|
|
63
|
+
// run-context is the FIRST Cloud call and happens before payload resolution, so
|
|
64
|
+
// read the input here and use it as the run-context Bearer — the GitHub job token
|
|
65
|
+
// is no good to Cloud, so without this the org-token path would 401 on run-context
|
|
66
|
+
// (and silently lose org policy/settings) even though its end-of-run report works.
|
|
67
|
+
// The tokenless GitHub App (OIDC) path is the alternative when there is no
|
|
68
|
+
// api_token. Mask it the moment we read it.
|
|
69
|
+
const apiToken = core.getInput("api_token") || undefined;
|
|
70
|
+
if (apiToken) core.setSecret(apiToken);
|
|
71
|
+
|
|
72
|
+
let oidcToken: string | undefined;
|
|
73
|
+
try {
|
|
74
|
+
oidcToken = await core.getIDToken(cloudOidcAudience());
|
|
75
|
+
} catch {
|
|
76
|
+
// OIDC not available (local dev, non-actions environment, fork PRs)
|
|
77
|
+
}
|
|
78
|
+
|
|
79
|
+
const [repoResponse, runContext] = await Promise.all([
|
|
80
|
+
// This runs at run startup, BEFORE the clean-error surface in main.ts, so a
|
|
81
|
+
// transient GitHub 5xx here would reject the Promise.all and hard-crash the
|
|
82
|
+
// run (while its sibling fetchRunContext degrades to defaults). Retry the
|
|
83
|
+
// transient blip; a deterministic 4xx (e.g. 404 repo) still fails fast. #999.
|
|
84
|
+
retry(() => params.octokit.repos.get({ owner: repoContext.owner, repo: repoContext.name }), {
|
|
85
|
+
delaysMs: [100, 500],
|
|
86
|
+
shouldRetry: isTransientServerError,
|
|
87
|
+
label: "repos.get",
|
|
88
|
+
}),
|
|
89
|
+
// Cloud bearer = api_token when set, else the job token (which only authenticates
|
|
90
|
+
// via the OIDC header on the App path). octokit keeps the job token for GitHub.
|
|
91
|
+
fetchRunContext({ token: apiToken ?? params.token, repoContext, oidcToken }),
|
|
92
|
+
]);
|
|
93
|
+
|
|
94
|
+
// Mask any Cloud-managed module credentials the moment they arrive — they are
|
|
95
|
+
// real secrets (a PAT / registry token) and must never surface in a log line.
|
|
96
|
+
if (runContext.moduleCredentials) {
|
|
97
|
+
for (const v of [
|
|
98
|
+
runContext.moduleCredentials.moduleFetchToken,
|
|
99
|
+
runContext.moduleCredentials.registryToken,
|
|
100
|
+
]) {
|
|
101
|
+
if (v) core.setSecret(v);
|
|
102
|
+
}
|
|
103
|
+
}
|
|
104
|
+
|
|
105
|
+
return {
|
|
106
|
+
repo: {
|
|
107
|
+
owner: repoContext.owner,
|
|
108
|
+
name: repoContext.name,
|
|
109
|
+
data: repoResponse.data,
|
|
110
|
+
},
|
|
111
|
+
repoSettings: runContext.settings,
|
|
112
|
+
apiToken: runContext.apiToken,
|
|
113
|
+
oss: runContext.oss,
|
|
114
|
+
plan: runContext.plan,
|
|
115
|
+
requiredControls: runContext.requiredControls,
|
|
116
|
+
provenFixes: runContext.provenFixes,
|
|
117
|
+
provenTransforms: runContext.provenTransforms,
|
|
118
|
+
noiseProfile: runContext.noiseProfile,
|
|
119
|
+
...(runContext.moduleCredentials ? { moduleCredentials: runContext.moduleCredentials } : {}),
|
|
120
|
+
};
|
|
121
|
+
}
|