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
|
@@ -0,0 +1,304 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Source for the opencode plugin we drop into the per-run tmpdir at
|
|
3
|
+
* `<XDG_CONFIG_HOME>/opencode/plugin/infraweaver-events.ts`. The harness already
|
|
4
|
+
* redirects `XDG_CONFIG_HOME` to `ctx.tmpdir/.config` (see `opencode.ts`
|
|
5
|
+
* `homeEnv`), so opencode's auto-discovery scans the tmpdir, never the user's
|
|
6
|
+
* working tree. opencode's `Global.Path.config` resolves to
|
|
7
|
+
* `path.join(xdgConfig, "opencode")` and the config layer auto-discovers
|
|
8
|
+
* plugins from every directory in its scan list — including
|
|
9
|
+
* `Global.Path.config` — by globbing `{plugin,plugins}/*.{ts,js}` via
|
|
10
|
+
* `ConfigPlugin.load(dir)`.
|
|
11
|
+
*
|
|
12
|
+
* We MUST NOT write into the user's repo working tree. The repo is a checkout
|
|
13
|
+
* the agent operates on; only the agent's own tools (gated by
|
|
14
|
+
* `OPENCODE_PERMISSION`) may modify it. The whole reason we redirect HOME and
|
|
15
|
+
* XDG_CONFIG_HOME is so harness-side files (config, plugins, scratch state)
|
|
16
|
+
* land in the tmpdir.
|
|
17
|
+
*
|
|
18
|
+
* Why the events plugin exists: opencode's `task` tool runs subagents
|
|
19
|
+
* in-process and the CLI's `cli/cmd/run.ts` event loop filters
|
|
20
|
+
* `part.sessionID !== sessionID`, so subagent-internal `message.part.updated`
|
|
21
|
+
* events are silently discarded before reaching our parent NDJSON stream.
|
|
22
|
+
* plugins, by contrast, receive EVERY bus event via `bus.subscribeAll()`
|
|
23
|
+
* regardless of session.
|
|
24
|
+
*
|
|
25
|
+
* The events plugin re-emits every relevant bus event onto opencode's stdout
|
|
26
|
+
* as a single JSON line wrapped in a sentinel envelope. our `runOpenCode`
|
|
27
|
+
* parser recognises the envelope, unpacks it, and routes the inner part
|
|
28
|
+
* through the existing handlers with a per-session label from `SessionLabeler`
|
|
29
|
+
* so each subagent's tool calls / text appear inline alongside the
|
|
30
|
+
* orchestrator's.
|
|
31
|
+
*
|
|
32
|
+
* The subagent gate (the `tool.execute.before` hook that hard-blocks
|
|
33
|
+
* state-mutating MCP tool calls from a subagent session) lives in a SEPARATE
|
|
34
|
+
* plugin — `buildOpencodeSubagentGateSource` below — because it's the
|
|
35
|
+
* load-bearing security fence and must ship into the opencode harness,
|
|
36
|
+
* whereas this events re-emitter was only needed by the legacy CLI-parsing
|
|
37
|
+
* path (the active `opencode.ts` reads subagent events directly off the SDK
|
|
38
|
+
* event stream, so it installs ONLY the gate plugin). Deny set: derived per-run
|
|
39
|
+
* from each MCP tool's `mutates` flag (`subagentDeniedToolNames` in
|
|
40
|
+
* src/mcp/server.ts).
|
|
41
|
+
*
|
|
42
|
+
* Dumb plugin / smart parent split: the events plugin emits every part for
|
|
43
|
+
* every session. the parent dedupes against the orchestrator's own session id
|
|
44
|
+
* (which it already knows from the `init` event). this keeps the plugin trivial
|
|
45
|
+
* and keeps the per-session attribution logic on the parent side where the
|
|
46
|
+
* SessionLabeler already lives.
|
|
47
|
+
*
|
|
48
|
+
* Event-name prefixing: the wrapped event-type sentinel is
|
|
49
|
+
* `infraweaver_bus_event` — picked to be unmistakably ours so a future opencode
|
|
50
|
+
* release that introduces a coincidentally-named event type won't collide.
|
|
51
|
+
*/
|
|
52
|
+
|
|
53
|
+
import { WRITE_GATE_HELPERS_SOURCE } from "#app/agents/writeGateSource";
|
|
54
|
+
import { PRODUCT_NAME } from "#app/brand";
|
|
55
|
+
|
|
56
|
+
/**
|
|
57
|
+
* opencode's native file-writing tools (it lower-cases tool names). The Claude
|
|
58
|
+
* runtime's equivalent set is `CLAUDE_WRITE_TOOL_NAMES`; both gates enforce the
|
|
59
|
+
* same policy file so the two runtimes can't diverge on what a guarded mode is
|
|
60
|
+
* allowed to touch.
|
|
61
|
+
*/
|
|
62
|
+
export const OPENCODE_WRITE_TOOL_NAMES = ["write", "edit", "patch"] as const;
|
|
63
|
+
|
|
64
|
+
export const INFRAWEAVER_BUS_EVENT_TYPE = "infraweaver_bus_event" as const;
|
|
65
|
+
|
|
66
|
+
export const INFRAWEAVER_OPENCODE_PLUGIN_FILENAME =
|
|
67
|
+
"infraweaver-events.ts" as const;
|
|
68
|
+
|
|
69
|
+
export const INFRAWEAVER_OPENCODE_GATE_PLUGIN_FILENAME =
|
|
70
|
+
"infraweaver-subagent-gate.ts" as const;
|
|
71
|
+
|
|
72
|
+
/**
|
|
73
|
+
* Source written verbatim to `<XDG_CONFIG_HOME>/opencode/plugin/infraweaver-events.ts`.
|
|
74
|
+
*
|
|
75
|
+
* - Structural typing only (no runtime import of `@opencode-ai/plugin`):
|
|
76
|
+
* opencode installs that dep into the directory containing the plugin
|
|
77
|
+
* alongside discovery, but a) the dep isn't required for the structural
|
|
78
|
+
* shape we use, and b) keeping zero imports avoids any module-resolution
|
|
79
|
+
* coupling to opencode's plugin-loader internals across versions.
|
|
80
|
+
* - default export is the plugin factory (opencode's plugin loader accepts
|
|
81
|
+
* default exports as the server entrypoint).
|
|
82
|
+
* - we only forward `message.part.updated`. that's where the user-visible
|
|
83
|
+
* subagent activity (tool calls, text, step transitions) lives. add more
|
|
84
|
+
* event types here if the parent needs them.
|
|
85
|
+
* - JSON.stringify+single write keeps the line atomic up to PIPE_BUF (4KB on
|
|
86
|
+
* Linux). longer parts may interleave with concurrent stdout writers; the
|
|
87
|
+
* parser tolerates non-JSON lines (logs them at debug) so a torn line is a
|
|
88
|
+
* missed event, not a crash.
|
|
89
|
+
*/
|
|
90
|
+
export const INFRAWEAVER_OPENCODE_PLUGIN_SOURCE = `// AUTOGENERATED by ${PRODUCT_NAME}. do not edit; it'll be overwritten on the next run.
|
|
91
|
+
// surfaces opencode subagent activity that the CLI's run-loop discards. see
|
|
92
|
+
// action/agents/opencodePlugin.ts in infraweaver/app for why this exists. lives
|
|
93
|
+
// inside the per-run tmpdir (XDG_CONFIG_HOME/opencode/plugin/), never inside
|
|
94
|
+
// the user's working tree. the subagent gate ships as a separate plugin
|
|
95
|
+
// (infraweaver-subagent-gate.ts).
|
|
96
|
+
|
|
97
|
+
const INFRAWEAVER_BUS_EVENT_TYPE = ${JSON.stringify(INFRAWEAVER_BUS_EVENT_TYPE)};
|
|
98
|
+
|
|
99
|
+
// orchestratorSessionID locks to the first sessionID we observe on the bus
|
|
100
|
+
// (\`message.part.updated\`). opencode's run command creates exactly one
|
|
101
|
+
// top-level session before any subagent is dispatched, and the orchestrator
|
|
102
|
+
// emits at least one event before any subagent does — so first-seen-wins
|
|
103
|
+
// captures the orchestrator; every subagent part has a non-matching
|
|
104
|
+
// sessionID.
|
|
105
|
+
let orchestratorSessionID: string | undefined;
|
|
106
|
+
|
|
107
|
+
function isOrchestratorTaskDispatch(part: {
|
|
108
|
+
type?: string;
|
|
109
|
+
tool?: string;
|
|
110
|
+
state?: { status?: string };
|
|
111
|
+
} | undefined): boolean {
|
|
112
|
+
if (!part || part.type !== "tool") return false;
|
|
113
|
+
if (part.tool !== "task") return false;
|
|
114
|
+
// only forward at status="running" (not "pending"). at pending the
|
|
115
|
+
// state.input is still {} — the orchestrator has emitted the part shell
|
|
116
|
+
// but the LLM hasn't filled in description/subagent_type/prompt yet. by
|
|
117
|
+
// running, input is populated and recordTaskDispatch can derive the lens
|
|
118
|
+
// label correctly.
|
|
119
|
+
return part.state?.status === "running";
|
|
120
|
+
}
|
|
121
|
+
|
|
122
|
+
export default async function infraweaverEventsPlugin() {
|
|
123
|
+
return {
|
|
124
|
+
event: async (input: {
|
|
125
|
+
event: {
|
|
126
|
+
type: string;
|
|
127
|
+
properties?: {
|
|
128
|
+
part?: {
|
|
129
|
+
sessionID?: string;
|
|
130
|
+
type?: string;
|
|
131
|
+
tool?: string;
|
|
132
|
+
state?: { status?: string };
|
|
133
|
+
};
|
|
134
|
+
};
|
|
135
|
+
};
|
|
136
|
+
}) => {
|
|
137
|
+
const event = input?.event;
|
|
138
|
+
if (!event || typeof event !== "object") return;
|
|
139
|
+
if (event.type !== "message.part.updated") return;
|
|
140
|
+
const part = event.properties?.part;
|
|
141
|
+
const sessionID = part?.sessionID;
|
|
142
|
+
if (typeof sessionID !== "string" || sessionID.length === 0) return;
|
|
143
|
+
if (orchestratorSessionID === undefined) orchestratorSessionID = sessionID;
|
|
144
|
+
|
|
145
|
+
if (sessionID === orchestratorSessionID) {
|
|
146
|
+
// skip orchestrator events EXCEPT early task dispatches.
|
|
147
|
+
if (!isOrchestratorTaskDispatch(part)) return;
|
|
148
|
+
}
|
|
149
|
+
|
|
150
|
+
try {
|
|
151
|
+
const line = JSON.stringify({
|
|
152
|
+
type: INFRAWEAVER_BUS_EVENT_TYPE,
|
|
153
|
+
bus_event: event,
|
|
154
|
+
});
|
|
155
|
+
process.stdout.write(line + "\\n");
|
|
156
|
+
} catch {
|
|
157
|
+
// a circular reference or BigInt etc. would throw; swallow rather
|
|
158
|
+
// than letting a single bad event take down the plugin.
|
|
159
|
+
}
|
|
160
|
+
},
|
|
161
|
+
};
|
|
162
|
+
}
|
|
163
|
+
`;
|
|
164
|
+
|
|
165
|
+
/**
|
|
166
|
+
* Standalone subagent gate plugin written to
|
|
167
|
+
* `<XDG_CONFIG_HOME>/opencode/plugin/infraweaver-subagent-gate.ts`. Installed by
|
|
168
|
+
* the in-process `opencode.ts` harness — the gate is the load-bearing security
|
|
169
|
+
* fence, so it ships independently of the events re-emitter above (which the
|
|
170
|
+
* in-process harness doesn't need).
|
|
171
|
+
*
|
|
172
|
+
* Hard-blocks state-mutating MCP tool calls originating from a subagent
|
|
173
|
+
* session via `tool.execute.before`, complementing the runtime backstops from
|
|
174
|
+
* PR #796 (action/mcp/checkout.ts, action/mcp/git.ts).
|
|
175
|
+
*
|
|
176
|
+
* `deniedTools` is the per-run deny set derived from each MCP tool's `mutates`
|
|
177
|
+
* flag (see `subagentDeniedToolNames`), embedded into the plugin's `Set` literal
|
|
178
|
+
* so it fences exactly the mutating tools registered for this run.
|
|
179
|
+
*/
|
|
180
|
+
export function buildOpencodeSubagentGateSource(
|
|
181
|
+
deniedTools: readonly string[],
|
|
182
|
+
writePolicyAbsolutePath: string,
|
|
183
|
+
): string {
|
|
184
|
+
return `// AUTOGENERATED by ${PRODUCT_NAME}. do not edit; it'll be overwritten on the next run.
|
|
185
|
+
// hard-blocks state-mutating MCP tool calls from opencode subagents (PR
|
|
186
|
+
// following infraweaver/app#796), and enforces the allowed_paths /
|
|
187
|
+
// protected_paths policy at write time. see action/agents/opencodePlugin.ts in
|
|
188
|
+
// infraweaver/app for why this exists. lives inside the per-run tmpdir
|
|
189
|
+
// (XDG_CONFIG_HOME/opencode/plugin/), never inside the user's working tree.
|
|
190
|
+
|
|
191
|
+
// embedded at template-render time (derived from each tool's \`mutates\` flag)
|
|
192
|
+
// so the plugin source needs no project imports.
|
|
193
|
+
const SUBAGENT_DENIED_TOOLS = new Set(${JSON.stringify(deniedTools)});
|
|
194
|
+
|
|
195
|
+
// opencode's native file-writing tools, lower-cased (its naming convention).
|
|
196
|
+
// The Claude runtime gates the equivalent set via CLAUDE_WRITE_TOOL_NAMES.
|
|
197
|
+
const WRITE_TOOLS = new Set(${JSON.stringify(OPENCODE_WRITE_TOOL_NAMES)});
|
|
198
|
+
const WRITE_POLICY_PATH = ${JSON.stringify(writePolicyAbsolutePath)};
|
|
199
|
+
${WRITE_GATE_HELPERS_SOURCE}
|
|
200
|
+
/**
|
|
201
|
+
* Every path a tool call would write, across opencode's arg shapes.
|
|
202
|
+
*
|
|
203
|
+
* \`patch\` is the awkward one: it carries no path argument at all — its schema
|
|
204
|
+
* is \`{ patchText }\`, with targets encoded inside the payload as
|
|
205
|
+
* \`*** Add File: <path>\` / \`*** Update File: <path>\` / \`*** Delete File: <path>\`.
|
|
206
|
+
* Returning nothing for it would let a single \`patch\` call rewrite protected
|
|
207
|
+
* or vendored files with no write-time check whatsoever, so the header lines
|
|
208
|
+
* are parsed out and every one of them is gated.
|
|
209
|
+
*/
|
|
210
|
+
function targetPathsOf(tool: string, args: Record<string, unknown> | undefined): string[] {
|
|
211
|
+
if (!args || typeof args !== "object") return [];
|
|
212
|
+
const patchText = (args as Record<string, unknown>).patchText;
|
|
213
|
+
if (typeof patchText === "string" && patchText) {
|
|
214
|
+
const paths: string[] = [];
|
|
215
|
+
for (const line of patchText.split("\\n")) {
|
|
216
|
+
const match = /^\\*\\*\\*\\s+(?:Add|Update|Delete)\\s+File:\\s*(.+?)\\s*$/.exec(line);
|
|
217
|
+
if (match && match[1]) paths.push(match[1]);
|
|
218
|
+
}
|
|
219
|
+
// a patch whose headers we cannot parse must NOT sail through unchecked —
|
|
220
|
+
// refuse by returning a sentinel the caller treats as un-gateable.
|
|
221
|
+
return paths.length > 0 ? paths : ["\\u0000unparsed-patch"];
|
|
222
|
+
}
|
|
223
|
+
for (const key of ["filePath", "file_path", "path"]) {
|
|
224
|
+
const value = (args as Record<string, unknown>)[key];
|
|
225
|
+
if (typeof value === "string" && value) return [value];
|
|
226
|
+
}
|
|
227
|
+
return [];
|
|
228
|
+
}
|
|
229
|
+
|
|
230
|
+
// opencode presents MCP tools as \`infraweaver_<bare>\`; strip that to compare
|
|
231
|
+
// against the canonical bare names in SUBAGENT_DENIED_TOOLS. native tools
|
|
232
|
+
// (read, write, bash, task, etc.) lack the prefix and never match the deny
|
|
233
|
+
// list anyway.
|
|
234
|
+
function stripInfraweaverPrefix(toolName: string): string {
|
|
235
|
+
if (toolName.startsWith("infraweaver_")) return toolName.slice("infraweaver_".length);
|
|
236
|
+
return toolName;
|
|
237
|
+
}
|
|
238
|
+
|
|
239
|
+
// orchestratorSessionID locks to the first sessionID we observe on
|
|
240
|
+
// \`tool.execute.before\`. the orchestrator must invoke a tool (e.g. its
|
|
241
|
+
// \`task\` dispatch) before any subagent session exists, so first-seen-wins
|
|
242
|
+
// always captures the orchestrator; every subagent call therefore has a
|
|
243
|
+
// non-matching sessionID and is subject to the deny check.
|
|
244
|
+
let orchestratorSessionID: string | undefined;
|
|
245
|
+
|
|
246
|
+
export default async function infraweaverSubagentGatePlugin() {
|
|
247
|
+
return {
|
|
248
|
+
"tool.execute.before": async (
|
|
249
|
+
input: { tool?: string; sessionID?: string; callID?: string },
|
|
250
|
+
output: { args?: Record<string, unknown> }
|
|
251
|
+
) => {
|
|
252
|
+
// input: { tool, sessionID, callID } — confirmed against
|
|
253
|
+
// anomalyco/opencode packages/opencode/src/session/tools.ts which
|
|
254
|
+
// calls plugin.trigger("tool.execute.before", { tool, sessionID,
|
|
255
|
+
// callID }, { args }). throwing here surfaces as a tool error to the
|
|
256
|
+
// model (Effect's run.promise propagates the rejection through the
|
|
257
|
+
// AI SDK's tool-runtime), so the subagent sees a denial and can
|
|
258
|
+
// pick a different action.
|
|
259
|
+
const sessionID = typeof input?.sessionID === "string" ? input.sessionID : "";
|
|
260
|
+
const tool = typeof input?.tool === "string" ? input.tool : "";
|
|
261
|
+
if (!sessionID || !tool) return;
|
|
262
|
+
// capture the orchestrator session BEFORE any branch below can return,
|
|
263
|
+
// so a write tool arriving first can't shift which session is treated as
|
|
264
|
+
// the orchestrator (first-seen-wins is the whole basis of the deny).
|
|
265
|
+
if (orchestratorSessionID === undefined) orchestratorSessionID = sessionID;
|
|
266
|
+
|
|
267
|
+
// write-path enforcement applies to every session, orchestrator included
|
|
268
|
+
// — it does most of the writing — so it precedes the subagent-only deny.
|
|
269
|
+
if (WRITE_TOOLS.has(tool)) {
|
|
270
|
+
const policy = readWritePolicy(WRITE_POLICY_PATH);
|
|
271
|
+
if (!policy) return;
|
|
272
|
+
const rawPaths = targetPathsOf(tool, output?.args);
|
|
273
|
+
// an unrecognised arg shape (a future opencode version) passes through:
|
|
274
|
+
// the push-time guardrails still catch it, and failing closed on an
|
|
275
|
+
// unknown shape would break the run outright.
|
|
276
|
+
if (rawPaths.length === 0) return;
|
|
277
|
+
for (const rawPath of rawPaths) {
|
|
278
|
+
if (rawPath === "\\u0000unparsed-patch") {
|
|
279
|
+
throw new Error(
|
|
280
|
+
"write blocked (Terraform-only guardrail): this patch's file headers could not be parsed, " +
|
|
281
|
+
"so its targets cannot be checked against the allowed paths. Use the write or edit tool instead."
|
|
282
|
+
);
|
|
283
|
+
}
|
|
284
|
+
const refusal = refuseWrite(policy, rawPath, policy.root);
|
|
285
|
+
if (refusal) throw new Error(refusal);
|
|
286
|
+
}
|
|
287
|
+
return;
|
|
288
|
+
}
|
|
289
|
+
|
|
290
|
+
if (sessionID === orchestratorSessionID) return;
|
|
291
|
+
const bare = stripInfraweaverPrefix(tool);
|
|
292
|
+
if (!SUBAGENT_DENIED_TOOLS.has(bare)) return;
|
|
293
|
+
throw new Error(
|
|
294
|
+
"subagent attempted to call denied tool '" + bare + "'. " +
|
|
295
|
+
"subagents share the orchestrator's in-process working tree and toolState; " +
|
|
296
|
+
"state-changing MCP tools (checkout_pr, push_branch, create_pull_request_review, " +
|
|
297
|
+
"report_progress, etc.) are reserved for the orchestrator. " +
|
|
298
|
+
"report findings back to the orchestrator and let it perform the mutation."
|
|
299
|
+
);
|
|
300
|
+
},
|
|
301
|
+
};
|
|
302
|
+
}
|
|
303
|
+
`;
|
|
304
|
+
}
|
|
@@ -0,0 +1,134 @@
|
|
|
1
|
+
// Shared helpers for the OpenCode agent harness (`./opencode.ts`). Pure config
|
|
2
|
+
// / model-registry / install glue — nothing here touches the SDK event loop.
|
|
3
|
+
// Kept as a separate module so this config surface stays unit-testable in
|
|
4
|
+
// isolation (see `./opencodeShared.test.ts`).
|
|
5
|
+
|
|
6
|
+
import {
|
|
7
|
+
REVIEWER_AGENT_NAME,
|
|
8
|
+
REVIEWER_SYSTEM_PROMPT,
|
|
9
|
+
} from "#app/agents/reviewer";
|
|
10
|
+
import { PRIMARY_DOMAIN, PRODUCT_NAME } from "#app/brand";
|
|
11
|
+
import { deriveSubagentModels } from "#app/agents/subagentModels";
|
|
12
|
+
import { modelAliases } from "#app/models";
|
|
13
|
+
import { log } from "#app/utils/cli";
|
|
14
|
+
import { installFromNpmTarball } from "#app/utils/install";
|
|
15
|
+
import { getAuthorizedModels } from "#app/utils/openCodeModels";
|
|
16
|
+
import { getDevDependencyVersion } from "#app/utils/version";
|
|
17
|
+
|
|
18
|
+
// ── config ─────────────────────────────────────────────────────────────────────
|
|
19
|
+
|
|
20
|
+
export type OpenCodeConfig = {
|
|
21
|
+
mcp?: Record<string, unknown>;
|
|
22
|
+
permission?: Record<string, unknown>;
|
|
23
|
+
provider?: Record<string, unknown>;
|
|
24
|
+
agent?: Record<string, unknown>;
|
|
25
|
+
experimental?: Record<string, unknown>;
|
|
26
|
+
model?: string;
|
|
27
|
+
enabled_providers?: string[];
|
|
28
|
+
[key: string]: unknown;
|
|
29
|
+
};
|
|
30
|
+
|
|
31
|
+
/**
|
|
32
|
+
* Build the `provider.google.models[id].options` map that pins every direct-Google
|
|
33
|
+
* Gemini alias to `thinkingLevel: "high"`. Sourced from the model registry so
|
|
34
|
+
* adding/renaming a Google alias in `action/models.ts` flows through automatically.
|
|
35
|
+
*/
|
|
36
|
+
export function geminiHighThinkingOverrides(): Record<
|
|
37
|
+
string,
|
|
38
|
+
{ options: object }
|
|
39
|
+
> {
|
|
40
|
+
return Object.fromEntries(
|
|
41
|
+
modelAliases
|
|
42
|
+
.filter((a) => a.provider === "google")
|
|
43
|
+
.map((a) => [
|
|
44
|
+
a.resolve.replace(/^google\//, ""),
|
|
45
|
+
{ options: { thinkingConfig: { thinkingLevel: "high" } } },
|
|
46
|
+
]),
|
|
47
|
+
);
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
/**
|
|
51
|
+
* Read-only `loupe` subagent for lens-based review. Non-mutative +
|
|
52
|
+
* non-recursive — enforced by the system prompt in reviewer.ts.
|
|
53
|
+
*
|
|
54
|
+
* Per-subagent `model:` override is driven by the registry in
|
|
55
|
+
* `action/models.ts` via each alias's `subagentModel` field. Currently wired:
|
|
56
|
+
* Anthropic opus → sonnet, OpenAI gpt-pro → gpt and gpt → gpt-5.4, Google
|
|
57
|
+
* gemini-pro → gemini-flash. Other providers inherit (no override).
|
|
58
|
+
*/
|
|
59
|
+
export function buildReviewerAgentConfig(
|
|
60
|
+
orchestratorModel: string | undefined,
|
|
61
|
+
): Record<string, unknown> {
|
|
62
|
+
const overrides = deriveSubagentModels(orchestratorModel);
|
|
63
|
+
return {
|
|
64
|
+
[REVIEWER_AGENT_NAME]: {
|
|
65
|
+
description:
|
|
66
|
+
"Read-only review subagent for lens-based code review (correctness, security, billing-subsystem, etc.). " +
|
|
67
|
+
"Reads only — no writes, no state-changing shell or MCP calls, no nested subagent dispatch.",
|
|
68
|
+
mode: "subagent",
|
|
69
|
+
prompt: REVIEWER_SYSTEM_PROMPT,
|
|
70
|
+
...(overrides.reviewer !== undefined
|
|
71
|
+
? { model: overrides.reviewer }
|
|
72
|
+
: {}),
|
|
73
|
+
},
|
|
74
|
+
};
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
// ── install ────────────────────────────────────────────────────────────────────
|
|
78
|
+
|
|
79
|
+
/**
|
|
80
|
+
* Install the opencode-ai npm tarball and return the path to the executable.
|
|
81
|
+
*
|
|
82
|
+
* The bin path differs by version: v1.4.x and earlier shipped `bin/opencode`;
|
|
83
|
+
* v1.14+ renames the platform-specific binary to `bin/opencode.exe` for every
|
|
84
|
+
* OS via the postinstall script. Callers pass the binPath that matches their
|
|
85
|
+
* pinned version so a v1↔v2 swap can't silently install the wrong file.
|
|
86
|
+
*/
|
|
87
|
+
export async function installOpencodeCli(params: {
|
|
88
|
+
binPath: string;
|
|
89
|
+
}): Promise<string> {
|
|
90
|
+
return await installFromNpmTarball({
|
|
91
|
+
packageName: "opencode-ai",
|
|
92
|
+
version: getDevDependencyVersion("opencode-ai"),
|
|
93
|
+
executablePath: params.binPath,
|
|
94
|
+
installDependencies: true,
|
|
95
|
+
});
|
|
96
|
+
}
|
|
97
|
+
|
|
98
|
+
// ── model auto-select fallback ──────────────────────────────────────────────────
|
|
99
|
+
//
|
|
100
|
+
// steps 1–2 of model resolution (INFRAWEAVER_MODEL env, slug resolution) happen
|
|
101
|
+
// in resolveModel() in utils/agent.ts before the agent runs. this is step 3:
|
|
102
|
+
// auto-select using the authorized model set captured in main.ts via
|
|
103
|
+
// `opencode models` introspection.
|
|
104
|
+
|
|
105
|
+
const AUTO_SELECT_WARNING = `select a model explicitly in the ${PRODUCT_NAME} console (https://${PRIMARY_DOMAIN}/console) to avoid this.`;
|
|
106
|
+
|
|
107
|
+
export function autoSelectModel(): string | undefined {
|
|
108
|
+
const authorized = getAuthorizedModels();
|
|
109
|
+
if (authorized.size > 0) {
|
|
110
|
+
// skip hidden aliases (internal subagent-tier targets like
|
|
111
|
+
// opencode/gpt-5.4) — they should never surface as a user-facing
|
|
112
|
+
// orchestrator pick. mirrors the selectable-list filter in
|
|
113
|
+
// components/ModelSelector.tsx.
|
|
114
|
+
const match =
|
|
115
|
+
modelAliases.find(
|
|
116
|
+
(a) => !a.hidden && a.preferred && authorized.has(a.resolve),
|
|
117
|
+
) ?? modelAliases.find((a) => !a.hidden && authorized.has(a.resolve));
|
|
118
|
+
if (match) {
|
|
119
|
+
log.info(
|
|
120
|
+
`» model: ${match.resolve} (auto-selected${match.preferred ? " — preferred" : ""} curated match)`,
|
|
121
|
+
);
|
|
122
|
+
log.warning(`» model auto-selected. ${AUTO_SELECT_WARNING}`);
|
|
123
|
+
return match.resolve;
|
|
124
|
+
}
|
|
125
|
+
log.info(
|
|
126
|
+
`» opencode has ${authorized.size} models but none match curated aliases — letting OpenCode auto-select`,
|
|
127
|
+
);
|
|
128
|
+
}
|
|
129
|
+
|
|
130
|
+
log.warning(
|
|
131
|
+
`» no model resolved. letting OpenCode auto-select. ${AUTO_SELECT_WARNING}`,
|
|
132
|
+
);
|
|
133
|
+
return undefined;
|
|
134
|
+
}
|