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,284 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* OpenCode agent — in-process harness (opencode-ai >=1.14.x SDK-v2 / Effect-ts
|
|
3
|
+
* CLI rewrite).
|
|
4
|
+
*
|
|
5
|
+
* Architecture, post v2-in-process migration:
|
|
6
|
+
*
|
|
7
|
+
* 1. Spawn ONE `opencode serve --port <p>` subprocess per Infraweaver run via
|
|
8
|
+
* `node:child_process.spawn` directly (NOT our `spawn()` wrapper — see
|
|
9
|
+
* `bootOpencodeServer` for why: long-lived stdio streaming, manual
|
|
10
|
+
* activity gating against the SDK event loop, killGroup teardown).
|
|
11
|
+
* 2. Talk to it over loopback HTTP via the typed `@opencode-ai/sdk/v2`
|
|
12
|
+
* `createOpencodeClient({ baseUrl })` — no `Server.Default()` embed,
|
|
13
|
+
* no `createOpencode()` SDK lifecycle (would re-wrap our subprocess).
|
|
14
|
+
* 3. Create ONE session up front (`client.session.create`).
|
|
15
|
+
* 4. Subscribe to events once (`client.event.subscribe`) and pump them
|
|
16
|
+
* through a single per-run handler set for live logging + activity
|
|
17
|
+
* tracking + subagent labeling.
|
|
18
|
+
* 5. Run the initial prompt via `client.session.prompt({ sessionID, parts })`.
|
|
19
|
+
* Every post-run gate retry AND the reflection turn re-enter the same
|
|
20
|
+
* session via another `client.session.prompt()` call. Warm MCP, warm
|
|
21
|
+
* plugins, warm provider connections, same context window — no
|
|
22
|
+
* `--continue` subprocess respawn.
|
|
23
|
+
* 6. Close the server in a finally.
|
|
24
|
+
*
|
|
25
|
+
* What that replaces (vs the pre-migration v2 harness):
|
|
26
|
+
* - The per-run `opencode run --format json --print-logs --thinking` CLI
|
|
27
|
+
* subprocess that emitted NDJSON envelopes.
|
|
28
|
+
* - The `runOpenCode(... args: [...baseArgs, "--continue", c.prompt] ...)`
|
|
29
|
+
* resume callback that booted a SECOND opencode process (fresh MCP,
|
|
30
|
+
* fresh plugins, cold cache) for each gate retry / reflection turn.
|
|
31
|
+
* - The `opencodePlugin.ts` bus-event re-emitter — we subscribe to the
|
|
32
|
+
* global event stream now, so subagent events arrive naturally without
|
|
33
|
+
* a stdout sentinel envelope.
|
|
34
|
+
*
|
|
35
|
+
* What stays identical:
|
|
36
|
+
* - bash: "deny" via OPENCODE_CONFIG_CONTENT
|
|
37
|
+
* - OPENCODE_PERMISSION filesystem sandbox — deny-all + allow /tmp
|
|
38
|
+
* - MCP Infraweaver server injected via `mcp.<name> = { type: "remote", url }`
|
|
39
|
+
* - ASKPASS for git auth
|
|
40
|
+
* - codex auth materialization + post-hook writeback
|
|
41
|
+
* - loupe subagent config / model derivation
|
|
42
|
+
* - bedrock model prefix routing
|
|
43
|
+
* - skills install
|
|
44
|
+
* - todo tracker / onToolUse forwarding
|
|
45
|
+
*/
|
|
46
|
+
import { type ChildProcess } from "node:child_process";
|
|
47
|
+
import { type AssistantMessage, type EventSubscribeResponse, type OpencodeClient, type Part } from "@opencode-ai/sdk/v2";
|
|
48
|
+
import { SessionLabeler } from "#app/agents/sessionLabeler";
|
|
49
|
+
import { type AgentResult, type AgentRunContext, type AgentUsage } from "#app/agents/shared";
|
|
50
|
+
import { type RunTokenQuota } from "#app/agents/tokenQuota";
|
|
51
|
+
import type { ToolState } from "#app/toolState";
|
|
52
|
+
import type { AgentDiagnostic } from "#app/utils/agentHangReport";
|
|
53
|
+
import type { TodoTracker } from "#app/utils/todoTracking";
|
|
54
|
+
export declare function buildSecurityConfig(ctx: AgentRunContext, model: string | undefined): string;
|
|
55
|
+
/** split `<providerID>/<modelID>` into the SDK's prompt model shape. */
|
|
56
|
+
export declare function parseModel(value: string | undefined): {
|
|
57
|
+
providerID: string;
|
|
58
|
+
modelID: string;
|
|
59
|
+
} | undefined;
|
|
60
|
+
interface ServerHandle {
|
|
61
|
+
baseUrl: string;
|
|
62
|
+
proc: ChildProcess;
|
|
63
|
+
/** kill the server; idempotent. */
|
|
64
|
+
close: () => Promise<void>;
|
|
65
|
+
/** rolling tail of server stderr for diagnostics. */
|
|
66
|
+
recentStderr: string[];
|
|
67
|
+
}
|
|
68
|
+
/**
|
|
69
|
+
* Spawn `<cliPath> serve --port 0 --hostname 127.0.0.1` and wait for the
|
|
70
|
+
* "opencode server listening on http://..." stdout line.
|
|
71
|
+
*
|
|
72
|
+
* Direct node:child_process.spawn instead of our `spawn()` wrapper because
|
|
73
|
+
* the wrapper's contract is "Promise<SpawnResult> that resolves on exit" —
|
|
74
|
+
* we need a handle that stays alive across many session.prompt() calls.
|
|
75
|
+
* We still register with `trackChild()` so Ctrl-C kills the server alongside
|
|
76
|
+
* everything else.
|
|
77
|
+
*/
|
|
78
|
+
export declare function bootOpencodeServer(params: {
|
|
79
|
+
cliPath: string;
|
|
80
|
+
env: NodeJS.ProcessEnv;
|
|
81
|
+
cwd: string;
|
|
82
|
+
}): Promise<ServerHandle>;
|
|
83
|
+
/**
|
|
84
|
+
* What we collect during a single session.prompt() turn so we can render a
|
|
85
|
+
* unified AgentResult at the end. Per-turn snapshot is reset between turns
|
|
86
|
+
* inside the event loop via `beginTurn()` / `endTurn()`.
|
|
87
|
+
*/
|
|
88
|
+
export interface TurnAccumulator {
|
|
89
|
+
finalText: string;
|
|
90
|
+
/**
|
|
91
|
+
* Aggregate token totals from step-finish parts across the orchestrator AND
|
|
92
|
+
* any subagent sessions dispatched during the turn (e.g. loupe).
|
|
93
|
+
* Mirrors v1's `accumulatedTokens` semantics so production billing/audit
|
|
94
|
+
* numbers stay apples-to-apples across the migration.
|
|
95
|
+
*/
|
|
96
|
+
tokens: {
|
|
97
|
+
input: number;
|
|
98
|
+
output: number;
|
|
99
|
+
cacheRead: number;
|
|
100
|
+
cacheWrite: number;
|
|
101
|
+
};
|
|
102
|
+
costUsd: number;
|
|
103
|
+
sessionError: string | null;
|
|
104
|
+
/** populated when a tool_use part on the orchestrator session reports error. */
|
|
105
|
+
lastToolError: string | null;
|
|
106
|
+
/**
|
|
107
|
+
* The token quota's source key for this turn. `tokens` above is reset per
|
|
108
|
+
* turn, and the quota charges only the increase under a key — so every turn
|
|
109
|
+
* needs its own, or the second turn's tokens would be free until they
|
|
110
|
+
* exceeded the first turn's total. See tokenQuota.ts.
|
|
111
|
+
*/
|
|
112
|
+
quotaSource: string;
|
|
113
|
+
}
|
|
114
|
+
export declare function newTurn(): TurnAccumulator;
|
|
115
|
+
/**
|
|
116
|
+
* Charge the run's token quota with this turn's running total and, if the
|
|
117
|
+
* ceiling is reached, abort the turn (LLM10).
|
|
118
|
+
*
|
|
119
|
+
* Aborting is the point: a flag alone would let the loop keep streaming until
|
|
120
|
+
* it happened to finish, which is the consumption we are bounding. The shared
|
|
121
|
+
* abort controller also serves the activity watchdog, so `tokenQuotaExceeded`
|
|
122
|
+
* records which of the two fired.
|
|
123
|
+
*/
|
|
124
|
+
export declare function chargeTokenQuota(ctx: RunnerContext): void;
|
|
125
|
+
export interface RunnerContext {
|
|
126
|
+
client: OpencodeClient;
|
|
127
|
+
sessionID: string;
|
|
128
|
+
label: string;
|
|
129
|
+
orchestratorSessionID: string;
|
|
130
|
+
labeler: SessionLabeler;
|
|
131
|
+
toolState: ToolState;
|
|
132
|
+
todoTracker?: TodoTracker | undefined;
|
|
133
|
+
onActivityTimeout?: (() => void) | undefined;
|
|
134
|
+
onToolUse?: ((event: {
|
|
135
|
+
toolName: string;
|
|
136
|
+
input: unknown;
|
|
137
|
+
}) => void) | undefined;
|
|
138
|
+
/** current per-turn aggregator; nullable between turns. */
|
|
139
|
+
currentTurn: TurnAccumulator | null;
|
|
140
|
+
/** monotonic event count for diagnostics. */
|
|
141
|
+
eventCount: number;
|
|
142
|
+
/** last activity timestamp (event-stream silence detector). */
|
|
143
|
+
lastEventAt: number;
|
|
144
|
+
/** active task dispatch metadata keyed by callID (for subagent timing). */
|
|
145
|
+
taskDispatchByCallID: Map<string, {
|
|
146
|
+
label: string;
|
|
147
|
+
startedAt: number;
|
|
148
|
+
}>;
|
|
149
|
+
/**
|
|
150
|
+
* orchestrator tool callIDs already surfaced via `log.info(» ${tool}(...))`,
|
|
151
|
+
* tracked so the end-of-turn fallback can re-emit only the calls the live
|
|
152
|
+
* event stream missed. closes the SSE-connect race against the first
|
|
153
|
+
* `session.prompt()` (the SDK opens the SSE lazily on first iteration; by
|
|
154
|
+
* then the server may already have emitted the turn's tool part-updated
|
|
155
|
+
* events). without the fallback those calls never appear in stdout, which
|
|
156
|
+
* breaks every validator that greps for tool-call shape.
|
|
157
|
+
*/
|
|
158
|
+
loggedToolCallIDs: Set<string>;
|
|
159
|
+
/**
|
|
160
|
+
* server-side `time.end` of the newest `todowrite` applied to the todo
|
|
161
|
+
* tracker. the end-of-turn replay processes callIDs the live stream missed
|
|
162
|
+
* — the *earliest* calls of the first turn — so without this ordering guard
|
|
163
|
+
* a replayed older todo list would overwrite a newer one already applied
|
|
164
|
+
* live, and the post-run flush would post the stale checklist to GitHub.
|
|
165
|
+
*/
|
|
166
|
+
lastTodoUpdateEndMs: number;
|
|
167
|
+
/** rolling stderr tail from the server process (for diagnostics). */
|
|
168
|
+
recentStderr: string[];
|
|
169
|
+
diagnostic: AgentDiagnostic;
|
|
170
|
+
/**
|
|
171
|
+
* LLM10 — the per-run token ceiling, charged from `step-finish` parts. The
|
|
172
|
+
* inner watchdog bounds SILENCE; a remediation loop that cannot converge
|
|
173
|
+
* streams tokens the whole time and is never silent, so it needs this
|
|
174
|
+
* separate bound. Absent when there is nothing to enforce.
|
|
175
|
+
*/
|
|
176
|
+
tokenQuota?: RunTokenQuota | undefined;
|
|
177
|
+
/**
|
|
178
|
+
* Set when {@link RunnerContext.tokenQuota} tripped and aborted the turn.
|
|
179
|
+
* The abort controller is shared with the activity watchdog, so without this
|
|
180
|
+
* flag a quota stop would be reported as "the model went silent" — the
|
|
181
|
+
* opposite of what happened.
|
|
182
|
+
*/
|
|
183
|
+
tokenQuotaExceeded: boolean;
|
|
184
|
+
/**
|
|
185
|
+
* Aborts the in-flight turn. Assigned by the runner once the turn's abort
|
|
186
|
+
* controller exists (the context is built first), so it is optional here and
|
|
187
|
+
* a no-op in unit tests that drive the event handlers directly.
|
|
188
|
+
*/
|
|
189
|
+
abortRun?: ((reason: Error) => void) | undefined;
|
|
190
|
+
}
|
|
191
|
+
/**
|
|
192
|
+
* orchestrate the event stream consumer for the entire server lifetime.
|
|
193
|
+
*
|
|
194
|
+
* NB: the SDK subscribe is lazy — the SSE fetch only opens on the first
|
|
195
|
+
* iteration. so the first turn's tool part-updated events can race the
|
|
196
|
+
* connect and be missed. live-stream logging is best-effort; see the
|
|
197
|
+
* end-of-turn `logUnseenToolCalls` fallback for the guarantee.
|
|
198
|
+
*
|
|
199
|
+
* the subscription is wrapped in a reconnect loop: a single `for await` with
|
|
200
|
+
* no retry meant any mid-turn stream error/end permanently killed event
|
|
201
|
+
* consumption, freezing `ctx.lastEventAt` while the turn kept streaming over
|
|
202
|
+
* its separate `session.prompt` connection — after the flat idle budget the
|
|
203
|
+
* inner watchdog then aborted a healthy, progressing run as "model went
|
|
204
|
+
* silent". reconnects continue (bounded backoff) until the signal aborts.
|
|
205
|
+
*/
|
|
206
|
+
export declare function consumeEvents(ctx: RunnerContext, signal: AbortSignal): Promise<void>;
|
|
207
|
+
export declare function dispatchEvent(ctx: RunnerContext, event: EventSubscribeResponse): Promise<void>;
|
|
208
|
+
/**
|
|
209
|
+
* shared terminal bookkeeping for a tool part: log line, dedup callID, run
|
|
210
|
+
* orchestrator-side hooks (`onToolUse` → diff-coverage tracker; `todowrite` /
|
|
211
|
+
* `report_progress` → todo tracker; tool-error → `lastToolError`), and emit
|
|
212
|
+
* subagent-finish summary on `task` returns.
|
|
213
|
+
*
|
|
214
|
+
* called from both the live SSE path (`onToolPart`) and the end-of-turn
|
|
215
|
+
* fallback (`logUnseenToolCalls`) — `loggedToolCallIDs` is the dedup guard
|
|
216
|
+
* so each call's side effects fire exactly once across both paths. critical
|
|
217
|
+
* for diff-coverage: a first-turn `Read` that races SSE attach would
|
|
218
|
+
* otherwise be missed by `recordDiffReadFromToolUse`, and the subsequent
|
|
219
|
+
* `create_pull_request_review` pre-flight would reject the review.
|
|
220
|
+
*/
|
|
221
|
+
export declare function processTerminalToolPart(ctx: RunnerContext, part: Extract<Part, {
|
|
222
|
+
type: "tool";
|
|
223
|
+
}>, label: string, isOrchestrator: boolean): void;
|
|
224
|
+
export declare function formatPartDuration(time: {
|
|
225
|
+
start?: number;
|
|
226
|
+
end?: number;
|
|
227
|
+
} | undefined): string;
|
|
228
|
+
/**
|
|
229
|
+
* Run a single prompt turn against the persistent server. Resets the per-turn
|
|
230
|
+
* accumulator, calls `client.session.prompt()`, then assembles an AgentResult
|
|
231
|
+
* from the returned AssistantMessage + accumulated event state.
|
|
232
|
+
*
|
|
233
|
+
* Token / cost: `AssistantMessage.tokens` and `.cost` are authoritative for
|
|
234
|
+
* the turn. The event-stream accumulator is a fallback / sanity-check path
|
|
235
|
+
* used when the response is missing (e.g. abort, transport error) — and as
|
|
236
|
+
* the only source of per-step subagent attribution if we ever surface it.
|
|
237
|
+
*/
|
|
238
|
+
export declare function runPromptTurn(ctx: RunnerContext, params: {
|
|
239
|
+
text: string;
|
|
240
|
+
model: {
|
|
241
|
+
providerID: string;
|
|
242
|
+
modelID: string;
|
|
243
|
+
} | undefined;
|
|
244
|
+
signal: AbortSignal;
|
|
245
|
+
}): Promise<AgentResult>;
|
|
246
|
+
export declare function buildUsage(turn: TurnAccumulator, assistant: AssistantMessage | undefined): AgentUsage | undefined;
|
|
247
|
+
export declare function extractTextFromParts(parts: Part[] | undefined): string | undefined;
|
|
248
|
+
export declare function formatPromptError(error: unknown): string;
|
|
249
|
+
/**
|
|
250
|
+
* Start an event-silence watchdog. The outer process-level activity timer
|
|
251
|
+
* (main.ts `createProcessOutputActivityTimeout`) watches `process.stdout.write`
|
|
252
|
+
* which our harness log lines drive — but it doesn't see SSE event silence
|
|
253
|
+
* when the harness is itself quiet. This inner timer specifically watches
|
|
254
|
+
* `ctx.lastEventAt` and fires `onActivityTimeout` so main.ts can tear down
|
|
255
|
+
* the MCP server early, mirroring the per-spawn watchdog in `subprocess.ts`.
|
|
256
|
+
*
|
|
257
|
+
* `ctx.lastEventAt` is refreshed only on meaningful progress (token/tool
|
|
258
|
+
* part.updated), so any prolonged gap with no progress advances the clock —
|
|
259
|
+
* including a long in-flight tool call. the budget is the same flat idle
|
|
260
|
+
* timeout as the outer watchdog, sized to exceed the worst-case legitimate
|
|
261
|
+
* silent tool window (#760), so a real tool can't trip it; a genuinely stalled
|
|
262
|
+
* provider or a hung tool does, at the flat budget.
|
|
263
|
+
*/
|
|
264
|
+
export declare function startInnerActivityWatchdog(params: {
|
|
265
|
+
ctx: RunnerContext;
|
|
266
|
+
timeoutMs: number;
|
|
267
|
+
abortController: AbortController;
|
|
268
|
+
}): {
|
|
269
|
+
stop: () => void;
|
|
270
|
+
};
|
|
271
|
+
export declare const opencode: import("#app/agents/shared").Agent;
|
|
272
|
+
/**
|
|
273
|
+
* Safety net around a single turn: convert any unexpected throw that escapes
|
|
274
|
+
* `runPromptTurn` into a `success: false` result so the post-run gate loop
|
|
275
|
+
* (which expects a result, not a rejection) can surface it through the generic
|
|
276
|
+
* renderer.
|
|
277
|
+
*
|
|
278
|
+
* Watchdog-fired aborts do NOT reach here — `runPromptTurn` owns the abort
|
|
279
|
+
* signal, catches the aborted `session.prompt` rejection internally, and
|
|
280
|
+
* classifies it as an `activity timeout` error itself. This wrapper must not
|
|
281
|
+
* re-classify, since a stray post-prompt throw is not a hang.
|
|
282
|
+
*/
|
|
283
|
+
export declare function runTurnGuarded(ctx: RunnerContext, fn: () => Promise<AgentResult>): Promise<AgentResult>;
|
|
284
|
+
export {};
|
|
@@ -0,0 +1,96 @@
|
|
|
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
|
+
* opencode's native file-writing tools (it lower-cases tool names). The Claude
|
|
54
|
+
* runtime's equivalent set is `CLAUDE_WRITE_TOOL_NAMES`; both gates enforce the
|
|
55
|
+
* same policy file so the two runtimes can't diverge on what a guarded mode is
|
|
56
|
+
* allowed to touch.
|
|
57
|
+
*/
|
|
58
|
+
export declare const OPENCODE_WRITE_TOOL_NAMES: readonly ["write", "edit", "patch"];
|
|
59
|
+
export declare const INFRAWEAVER_BUS_EVENT_TYPE: "infraweaver_bus_event";
|
|
60
|
+
export declare const INFRAWEAVER_OPENCODE_PLUGIN_FILENAME: "infraweaver-events.ts";
|
|
61
|
+
export declare const INFRAWEAVER_OPENCODE_GATE_PLUGIN_FILENAME: "infraweaver-subagent-gate.ts";
|
|
62
|
+
/**
|
|
63
|
+
* Source written verbatim to `<XDG_CONFIG_HOME>/opencode/plugin/infraweaver-events.ts`.
|
|
64
|
+
*
|
|
65
|
+
* - Structural typing only (no runtime import of `@opencode-ai/plugin`):
|
|
66
|
+
* opencode installs that dep into the directory containing the plugin
|
|
67
|
+
* alongside discovery, but a) the dep isn't required for the structural
|
|
68
|
+
* shape we use, and b) keeping zero imports avoids any module-resolution
|
|
69
|
+
* coupling to opencode's plugin-loader internals across versions.
|
|
70
|
+
* - default export is the plugin factory (opencode's plugin loader accepts
|
|
71
|
+
* default exports as the server entrypoint).
|
|
72
|
+
* - we only forward `message.part.updated`. that's where the user-visible
|
|
73
|
+
* subagent activity (tool calls, text, step transitions) lives. add more
|
|
74
|
+
* event types here if the parent needs them.
|
|
75
|
+
* - JSON.stringify+single write keeps the line atomic up to PIPE_BUF (4KB on
|
|
76
|
+
* Linux). longer parts may interleave with concurrent stdout writers; the
|
|
77
|
+
* parser tolerates non-JSON lines (logs them at debug) so a torn line is a
|
|
78
|
+
* missed event, not a crash.
|
|
79
|
+
*/
|
|
80
|
+
export declare const INFRAWEAVER_OPENCODE_PLUGIN_SOURCE: string;
|
|
81
|
+
/**
|
|
82
|
+
* Standalone subagent gate plugin written to
|
|
83
|
+
* `<XDG_CONFIG_HOME>/opencode/plugin/infraweaver-subagent-gate.ts`. Installed by
|
|
84
|
+
* the in-process `opencode.ts` harness — the gate is the load-bearing security
|
|
85
|
+
* fence, so it ships independently of the events re-emitter above (which the
|
|
86
|
+
* in-process harness doesn't need).
|
|
87
|
+
*
|
|
88
|
+
* Hard-blocks state-mutating MCP tool calls originating from a subagent
|
|
89
|
+
* session via `tool.execute.before`, complementing the runtime backstops from
|
|
90
|
+
* PR #796 (action/mcp/checkout.ts, action/mcp/git.ts).
|
|
91
|
+
*
|
|
92
|
+
* `deniedTools` is the per-run deny set derived from each MCP tool's `mutates`
|
|
93
|
+
* flag (see `subagentDeniedToolNames`), embedded into the plugin's `Set` literal
|
|
94
|
+
* so it fences exactly the mutating tools registered for this run.
|
|
95
|
+
*/
|
|
96
|
+
export declare function buildOpencodeSubagentGateSource(deniedTools: readonly string[], writePolicyAbsolutePath: string): string;
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
export type OpenCodeConfig = {
|
|
2
|
+
mcp?: Record<string, unknown>;
|
|
3
|
+
permission?: Record<string, unknown>;
|
|
4
|
+
provider?: Record<string, unknown>;
|
|
5
|
+
agent?: Record<string, unknown>;
|
|
6
|
+
experimental?: Record<string, unknown>;
|
|
7
|
+
model?: string;
|
|
8
|
+
enabled_providers?: string[];
|
|
9
|
+
[key: string]: unknown;
|
|
10
|
+
};
|
|
11
|
+
/**
|
|
12
|
+
* Build the `provider.google.models[id].options` map that pins every direct-Google
|
|
13
|
+
* Gemini alias to `thinkingLevel: "high"`. Sourced from the model registry so
|
|
14
|
+
* adding/renaming a Google alias in `action/models.ts` flows through automatically.
|
|
15
|
+
*/
|
|
16
|
+
export declare function geminiHighThinkingOverrides(): Record<string, {
|
|
17
|
+
options: object;
|
|
18
|
+
}>;
|
|
19
|
+
/**
|
|
20
|
+
* Read-only `loupe` subagent for lens-based review. Non-mutative +
|
|
21
|
+
* non-recursive — enforced by the system prompt in reviewer.ts.
|
|
22
|
+
*
|
|
23
|
+
* Per-subagent `model:` override is driven by the registry in
|
|
24
|
+
* `action/models.ts` via each alias's `subagentModel` field. Currently wired:
|
|
25
|
+
* Anthropic opus → sonnet, OpenAI gpt-pro → gpt and gpt → gpt-5.4, Google
|
|
26
|
+
* gemini-pro → gemini-flash. Other providers inherit (no override).
|
|
27
|
+
*/
|
|
28
|
+
export declare function buildReviewerAgentConfig(orchestratorModel: string | undefined): Record<string, unknown>;
|
|
29
|
+
/**
|
|
30
|
+
* Install the opencode-ai npm tarball and return the path to the executable.
|
|
31
|
+
*
|
|
32
|
+
* The bin path differs by version: v1.4.x and earlier shipped `bin/opencode`;
|
|
33
|
+
* v1.14+ renames the platform-specific binary to `bin/opencode.exe` for every
|
|
34
|
+
* OS via the postinstall script. Callers pass the binPath that matches their
|
|
35
|
+
* pinned version so a v1↔v2 swap can't silently install the wrong file.
|
|
36
|
+
*/
|
|
37
|
+
export declare function installOpencodeCli(params: {
|
|
38
|
+
binPath: string;
|
|
39
|
+
}): Promise<string>;
|
|
40
|
+
export declare function autoSelectModel(): string | undefined;
|
|
@@ -0,0 +1,126 @@
|
|
|
1
|
+
import { type AgentResult, type AgentRunContext, type AgentUsage, type PostRunIssues, type StopHookFailure } from "#app/agents/shared";
|
|
2
|
+
import type { ToolState } from "#app/toolState";
|
|
3
|
+
/**
|
|
4
|
+
* derive "agent picked a review mode but never produced visible output" from
|
|
5
|
+
* the literal facts on `toolState`. returns the selected mode when the gate
|
|
6
|
+
* should fire, `null` otherwise — pure read, no side effects, safe to invoke
|
|
7
|
+
* after every agent attempt.
|
|
8
|
+
*
|
|
9
|
+
* the gate is anchored to `hadProgressComment` so silent runs (non-issue
|
|
10
|
+
* events, dispatcher skipped seeding) don't fire a nudge there's no UI for.
|
|
11
|
+
*
|
|
12
|
+
* `Review` and `IncrementalReview` have different valid exits:
|
|
13
|
+
* - Review: only `create_pull_request_review` counts. `report_progress` is
|
|
14
|
+
* not a substitute — a Review run that exits with just a summary comment
|
|
15
|
+
* has produced nothing reviewable on the PR. matches the hard-fail
|
|
16
|
+
* message at `expected = "create_pull_request_review"` below.
|
|
17
|
+
* - IncrementalReview: `report_progress` is a legitimate "no review
|
|
18
|
+
* warranted" exit, so either toolState flag short-circuits.
|
|
19
|
+
* splitting per mode also closes the bypass where a subagent (e.g. a
|
|
20
|
+
* `task`-dispatched `loupe` lens) calls `report_progress` and silences
|
|
21
|
+
* the gate even though the orchestrator never submitted a review.
|
|
22
|
+
*
|
|
23
|
+
* `dispatchedMode` (the payload's pinned mode) backstops `selectedMode`,
|
|
24
|
+
* which is only set when the agent voluntarily calls `select_mode` — a
|
|
25
|
+
* review-dispatched run that never opts in would otherwise produce no review
|
|
26
|
+
* yet pass the gate, the exact silent outcome the gate exists to catch.
|
|
27
|
+
* `selectedMode` still wins when present: it reflects what actually ran.
|
|
28
|
+
*/
|
|
29
|
+
export declare function getUnsubmittedReview(toolState: ToolState, dispatchedMode?: string | undefined): "Review" | "IncrementalReview" | "TerraformCodeReview" | null;
|
|
30
|
+
/**
|
|
31
|
+
* run the user-configured stop hook.
|
|
32
|
+
*
|
|
33
|
+
* parallel to `executeLifecycleHook` (which soft-fails with a warning), but
|
|
34
|
+
* returns structured output so agent harnesses can feed the failure back into
|
|
35
|
+
* the session as a resume prompt.
|
|
36
|
+
*
|
|
37
|
+
* - non-zero exit → `StopHookFailure`, actionable: the output is fed to the
|
|
38
|
+
* agent so it can fix the underlying issue.
|
|
39
|
+
* - timeout / spawn error → null, treated as passed: we can't usefully ask the
|
|
40
|
+
* agent to fix an infrastructure problem, and retrying would risk infinite
|
|
41
|
+
* loops.
|
|
42
|
+
*/
|
|
43
|
+
export declare function executeStopHook(script: string): Promise<StopHookFailure | null>;
|
|
44
|
+
export declare function buildStopHookPrompt(failure: StopHookFailure): string;
|
|
45
|
+
export declare function buildSummaryStalePrompt(filePath: string): string;
|
|
46
|
+
export declare function buildUnsubmittedReviewPrompt(mode: "Review" | "IncrementalReview" | "TerraformCodeReview"): string;
|
|
47
|
+
export declare function collectPostRunIssues(ctx: AgentRunContext, options?: {
|
|
48
|
+
skipSummaryStale?: boolean;
|
|
49
|
+
}): Promise<PostRunIssues>;
|
|
50
|
+
export declare function buildPostRunPrompt(issues: PostRunIssues): string;
|
|
51
|
+
/**
|
|
52
|
+
* terminal-only post-run finalize: re-checks the hard-fail gates after the
|
|
53
|
+
* agent has exited and converts a successful result to a hard-fail when
|
|
54
|
+
* `stopHook` or `unsubmittedReview` is still failing. used by harnesses
|
|
55
|
+
* that inject follow-up turns via a mechanism other than the resume
|
|
56
|
+
* callback (e.g. the Claude managed Stop hook + gate server). soft gates
|
|
57
|
+
* (`dirtyTree`, `summaryStale`) are intentionally not re-checked here —
|
|
58
|
+
* they never flip a successful run to failed.
|
|
59
|
+
*/
|
|
60
|
+
export declare function finalizeAgentResult<R extends AgentResult>(params: {
|
|
61
|
+
ctx: AgentRunContext;
|
|
62
|
+
result: R;
|
|
63
|
+
}): Promise<R>;
|
|
64
|
+
export declare function shouldRunReflection(mode: string | undefined): boolean;
|
|
65
|
+
/**
|
|
66
|
+
* prompt for a dedicated post-run reflection turn nudging the agent to edit
|
|
67
|
+
* the rolling learnings file if it discovered anything worth persisting.
|
|
68
|
+
*
|
|
69
|
+
* this exists because passive "if you learned something, write it down"
|
|
70
|
+
* instructions baked into mode checklists are frequently ignored — the agent
|
|
71
|
+
* stays focused on the task and the meta-ask falls through. delivering it
|
|
72
|
+
* as its own resume turn, with nothing competing for attention, raises the
|
|
73
|
+
* fire rate substantially.
|
|
74
|
+
*
|
|
75
|
+
* the file is the single source of truth — there is no separate MCP tool
|
|
76
|
+
* call. the server reads the file at end-of-run and persists any edits to
|
|
77
|
+
* `Repo.learnings`.
|
|
78
|
+
*
|
|
79
|
+
* the prompt copy is shaped by repo-wide audits of the actual content the
|
|
80
|
+
* agent has been writing (issue #619 in infraweaver/app). recurring failure
|
|
81
|
+
* modes the framing pushes back on:
|
|
82
|
+
* - massive multi-paragraph "bullets" that are really mini-articles
|
|
83
|
+
* - facts anchored to moving repo state (PR / review / commit / branch
|
|
84
|
+
* refs, dates, version pins, line numbers) that decay within weeks
|
|
85
|
+
* - sections growing into giant flat lists with no internal structure,
|
|
86
|
+
* forcing future runs to read kilobytes to find one fact
|
|
87
|
+
*
|
|
88
|
+
* single litmus delivered in the prompt: "would a future run on this repo
|
|
89
|
+
* do its work better because this bullet exists?". tool-quirk workarounds
|
|
90
|
+
* are explicitly allowed when the agent burned calls discovering the
|
|
91
|
+
* quirk this run — recording the workaround prevents next run from
|
|
92
|
+
* repeating the waste. tradeoff: the same quirk gets duplicated across
|
|
93
|
+
* repos, so when a quirk is fixed upstream in tool descriptions the
|
|
94
|
+
* per-repo bullets go stale and we have no batch-invalidation path.
|
|
95
|
+
*/
|
|
96
|
+
export declare function buildLearningsReflectionPrompt(filePath: string): string;
|
|
97
|
+
/**
|
|
98
|
+
* shared post-run retry loop used by every agent harness.
|
|
99
|
+
*
|
|
100
|
+
* checks the post-run gates (stop hook + dirty tree), and if either is
|
|
101
|
+
* failing, invokes `resume` to let the agent fix and push in the same turn.
|
|
102
|
+
* bails at `MAX_POST_RUN_RETRIES` attempts. the `canResume` predicate is
|
|
103
|
+
* consulted before each retry — harnesses that can't re-enter the session
|
|
104
|
+
* (e.g. claude without a sessionId) return false here.
|
|
105
|
+
*
|
|
106
|
+
* an optional `reflectionPrompt` fires exactly once, after the gates first
|
|
107
|
+
* observe a clean state. it's a one-shot nudge (e.g. "update learnings if
|
|
108
|
+
* relevant"), not a gate, so it does not consume the gate-retry budget. if
|
|
109
|
+
* the reflection turn dirties the tree, the loop picks that up on the next
|
|
110
|
+
* iteration via the normal dirty-tree gate.
|
|
111
|
+
*
|
|
112
|
+
* stop hook must pass for the run to succeed; persistent hook failures are
|
|
113
|
+
* surfaced as `AgentResult.error`. dirty-tree-only failures preserve prior
|
|
114
|
+
* behavior: they're logged but don't fail the run.
|
|
115
|
+
*/
|
|
116
|
+
export declare function runPostRunRetryLoop<R extends AgentResult>(params: {
|
|
117
|
+
ctx: AgentRunContext;
|
|
118
|
+
initialResult: R;
|
|
119
|
+
initialUsage: AgentUsage | undefined;
|
|
120
|
+
resume: (context: {
|
|
121
|
+
prompt: string;
|
|
122
|
+
previousResult: R;
|
|
123
|
+
}) => Promise<R>;
|
|
124
|
+
canResume?: ((result: R) => boolean) | undefined;
|
|
125
|
+
reflectionPrompt?: string | undefined;
|
|
126
|
+
}): Promise<AgentResult>;
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Definition of the `loupe` named subagent — the constrained
|
|
3
|
+
* read-only worker dispatched by Build mode self-review and the in-Infraweaver
|
|
4
|
+
* /anneal multi-lens review.
|
|
5
|
+
*
|
|
6
|
+
* The contract: non-mutative + non-recursive.
|
|
7
|
+
* allow: file reads, grep/glob, web search/fetch, read-only MCP queries,
|
|
8
|
+
* read-only shell (git diff/log, cat, ls)
|
|
9
|
+
* deny: state-changing MCP tools, file writes, side-effectful shell, nested
|
|
10
|
+
* subagent dispatch
|
|
11
|
+
*
|
|
12
|
+
* Enforcement is now belt-and-suspenders:
|
|
13
|
+
* 1. Machine-enforced PreToolUse gates intercept every state-mutating MCP
|
|
14
|
+
* tool call originating from a subagent session and refuse it before
|
|
15
|
+
* MCP runs. The deny set is derived per-run from each MCP tool's `mutates`
|
|
16
|
+
* flag (`subagentDeniedToolNames` in action/mcp/server.ts), embedded into
|
|
17
|
+
* action/agents/claudePretoolGate.ts (Claude Code's PreToolUse hook),
|
|
18
|
+
* and action/agents/opencodePlugin.ts (opencode's tool.execute.before
|
|
19
|
+
* hook). Followed PR #796 which added runtime backstops inside
|
|
20
|
+
* checkout_pr / push_branch after a subagent-originated tool call
|
|
21
|
+
* clobbered an unrelated PR branch in zed-industries/cloud.
|
|
22
|
+
* 2. The prose system prompt below as a backup against (a) tools added
|
|
23
|
+
* to the MCP server without a corresponding deny-list update, and
|
|
24
|
+
* (b) shell/git read-vs-write distinctions the static gate can't see.
|
|
25
|
+
* It states the rule as a no-op-if-reverted invariant the model can
|
|
26
|
+
* apply to any tool, including ones added after this comment was
|
|
27
|
+
* written.
|
|
28
|
+
*
|
|
29
|
+
* Historical note: per-agent `disallowedTools` in claude-code is upstream-
|
|
30
|
+
* broken for subagent-spawned tool calls (anthropics/claude-agent-sdk-
|
|
31
|
+
* typescript#172, open as of Mar 2026), which is why the gate runs at
|
|
32
|
+
* PreToolUse rather than tool-registration time.
|
|
33
|
+
*/
|
|
34
|
+
export declare const REVIEWER_AGENT_NAME = "loupe";
|
|
35
|
+
/**
|
|
36
|
+
* System prompt baked into the named reviewer subagent. The orchestrator
|
|
37
|
+
* supplies the per-call task content (YOUR TASK, the diff, the lens) at
|
|
38
|
+
* dispatch time; this preamble enforces the role and constraints regardless
|
|
39
|
+
* of what the orchestrator sends.
|
|
40
|
+
*/
|
|
41
|
+
export declare const REVIEWER_SYSTEM_PROMPT: string;
|