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.
Files changed (524) hide show
  1. package/LICENSE +661 -0
  2. package/README.md +244 -0
  3. package/dist/agents/claude.d.ts +113 -0
  4. package/dist/agents/claudePretoolGate.d.ts +137 -0
  5. package/dist/agents/dispatchMetrics.d.ts +77 -0
  6. package/dist/agents/gateServer.d.ts +7 -0
  7. package/dist/agents/index.d.ts +6 -0
  8. package/dist/agents/nativeFsDenies.d.ts +46 -0
  9. package/dist/agents/opencode.d.ts +284 -0
  10. package/dist/agents/opencodePlugin.d.ts +96 -0
  11. package/dist/agents/opencodeShared.d.ts +40 -0
  12. package/dist/agents/postRun.d.ts +126 -0
  13. package/dist/agents/reviewer.d.ts +41 -0
  14. package/dist/agents/sessionLabeler.d.ts +97 -0
  15. package/dist/agents/shared.d.ts +246 -0
  16. package/dist/agents/subagentModels.d.ts +19 -0
  17. package/dist/agents/tokenQuota.d.ts +118 -0
  18. package/dist/agents/writeGateSource.d.ts +22 -0
  19. package/dist/agents/writePolicy.d.ts +79 -0
  20. package/dist/brand.d.ts +67 -0
  21. package/dist/cli.mjs +247846 -0
  22. package/dist/external.d.ts +227 -0
  23. package/dist/i18n/scaffolding.d.ts +59 -0
  24. package/dist/index.d.ts +6 -0
  25. package/dist/index.js +247061 -0
  26. package/dist/internal/index.d.ts +18 -0
  27. package/dist/internal.js +2398 -0
  28. package/dist/lifecycle.d.ts +2 -0
  29. package/dist/main.d.ts +8 -0
  30. package/dist/mcp/arkConfig.d.ts +1 -0
  31. package/dist/mcp/assess.d.ts +157 -0
  32. package/dist/mcp/capabilityContext.d.ts +71 -0
  33. package/dist/mcp/changeSummary.d.ts +52 -0
  34. package/dist/mcp/checkSuite.d.ts +27 -0
  35. package/dist/mcp/checkout.d.ts +92 -0
  36. package/dist/mcp/comment.d.ts +127 -0
  37. package/dist/mcp/commitInfo.d.ts +11 -0
  38. package/dist/mcp/crosswalk.d.ts +178 -0
  39. package/dist/mcp/crosswalkDigest.d.ts +1 -0
  40. package/dist/mcp/cyberEssentials.d.ts +24 -0
  41. package/dist/mcp/dashboard.d.ts +125 -0
  42. package/dist/mcp/dependencies.d.ts +12 -0
  43. package/dist/mcp/frameworks.d.ts +74 -0
  44. package/dist/mcp/geminiSanitizer.d.ts +28 -0
  45. package/dist/mcp/git.d.ts +60 -0
  46. package/dist/mcp/guardrails.d.ts +222 -0
  47. package/dist/mcp/issue.d.ts +20 -0
  48. package/dist/mcp/issueComments.d.ts +11 -0
  49. package/dist/mcp/issueEvents.d.ts +11 -0
  50. package/dist/mcp/issueInfo.d.ts +11 -0
  51. package/dist/mcp/labels.d.ts +14 -0
  52. package/dist/mcp/localContext.d.ts +26 -0
  53. package/dist/mcp/moduleExtraction.d.ts +79 -0
  54. package/dist/mcp/moduleTests.d.ts +106 -0
  55. package/dist/mcp/modules.d.ts +198 -0
  56. package/dist/mcp/output.d.ts +16 -0
  57. package/dist/mcp/pathSafety.d.ts +14 -0
  58. package/dist/mcp/policy.d.ts +50 -0
  59. package/dist/mcp/pr.d.ts +64 -0
  60. package/dist/mcp/prInfo.d.ts +11 -0
  61. package/dist/mcp/providerSchema.d.ts +52 -0
  62. package/dist/mcp/review.d.ts +212 -0
  63. package/dist/mcp/reviewComments.d.ts +245 -0
  64. package/dist/mcp/roots.d.ts +60 -0
  65. package/dist/mcp/scope.d.ts +26 -0
  66. package/dist/mcp/selectMode.d.ts +20 -0
  67. package/dist/mcp/server.d.ts +61 -0
  68. package/dist/mcp/shared.d.ts +62 -0
  69. package/dist/mcp/shell.d.ts +58 -0
  70. package/dist/mcp/staleFix.d.ts +138 -0
  71. package/dist/mcp/terraform/azurePrices.d.ts +8 -0
  72. package/dist/mcp/terraform/baseline.d.ts +57 -0
  73. package/dist/mcp/terraform/concernResult.d.ts +38 -0
  74. package/dist/mcp/terraform/cost.d.ts +55 -0
  75. package/dist/mcp/terraform/cspm.d.ts +80 -0
  76. package/dist/mcp/terraform/currency.d.ts +110 -0
  77. package/dist/mcp/terraform/decisions.d.ts +178 -0
  78. package/dist/mcp/terraform/eidas.d.ts +100 -0
  79. package/dist/mcp/terraform/evidence.d.ts +343 -0
  80. package/dist/mcp/terraform/findings.d.ts +76 -0
  81. package/dist/mcp/terraform/fixMemory.d.ts +81 -0
  82. package/dist/mcp/terraform/governance.d.ts +56 -0
  83. package/dist/mcp/terraform/hcl.d.ts +115 -0
  84. package/dist/mcp/terraform/iacLanguages.d.ts +120 -0
  85. package/dist/mcp/terraform/idleFloor.d.ts +78 -0
  86. package/dist/mcp/terraform/keyless.d.ts +68 -0
  87. package/dist/mcp/terraform/moduleDocs.d.ts +56 -0
  88. package/dist/mcp/terraform/nativeRules.d.ts +38 -0
  89. package/dist/mcp/terraform/nativeScan.d.ts +11 -0
  90. package/dist/mcp/terraform/noiseProfile.d.ts +100 -0
  91. package/dist/mcp/terraform/normalization.d.ts +52 -0
  92. package/dist/mcp/terraform/oscal.d.ts +103 -0
  93. package/dist/mcp/terraform/packs/azurerm-3-4.d.ts +2 -0
  94. package/dist/mcp/terraform/packs/cloudflare-4-5.d.ts +2 -0
  95. package/dist/mcp/terraform/paths.d.ts +28 -0
  96. package/dist/mcp/terraform/plan.d.ts +157 -0
  97. package/dist/mcp/terraform/planDrift.d.ts +199 -0
  98. package/dist/mcp/terraform/policyAuthor.d.ts +191 -0
  99. package/dist/mcp/terraform/prowlerOcsf.d.ts +136 -0
  100. package/dist/mcp/terraform/refactor.d.ts +183 -0
  101. package/dist/mcp/terraform/registry.d.ts +108 -0
  102. package/dist/mcp/terraform/risk.d.ts +41 -0
  103. package/dist/mcp/terraform/scanSession.d.ts +116 -0
  104. package/dist/mcp/terraform/scannerCache.d.ts +15 -0
  105. package/dist/mcp/terraform/scannerEgress.d.ts +72 -0
  106. package/dist/mcp/terraform/scannerJson.d.ts +13 -0
  107. package/dist/mcp/terraform/scanners.d.ts +205 -0
  108. package/dist/mcp/terraform/signing.d.ts +61 -0
  109. package/dist/mcp/terraform/stateLocking.d.ts +18 -0
  110. package/dist/mcp/terraform/subprocess.d.ts +43 -0
  111. package/dist/mcp/terraform/suppressions.d.ts +90 -0
  112. package/dist/mcp/terraform/taxonomy.d.ts +39 -0
  113. package/dist/mcp/terraform/tfquery.d.ts +47 -0
  114. package/dist/mcp/terraform/toolchainIntegrity.d.ts +82 -0
  115. package/dist/mcp/terraform/tools/authorPolicy.d.ts +59 -0
  116. package/dist/mcp/terraform/tools/detectPlanDrift.d.ts +20 -0
  117. package/dist/mcp/terraform/tools/emitCost.d.ts +11 -0
  118. package/dist/mcp/terraform/tools/emitSarif.d.ts +14 -0
  119. package/dist/mcp/terraform/tools/fixMemory.d.ts +19 -0
  120. package/dist/mcp/terraform/tools/infracostDiff.d.ts +22 -0
  121. package/dist/mcp/terraform/tools/ingestExternalFindings.d.ts +21 -0
  122. package/dist/mcp/terraform/tools/moduleLookup.d.ts +14 -0
  123. package/dist/mcp/terraform/tools/moduleSearch.d.ts +23 -0
  124. package/dist/mcp/terraform/tools/plan.d.ts +59 -0
  125. package/dist/mcp/terraform/tools/providerUpgrade.d.ts +55 -0
  126. package/dist/mcp/terraform/tools/readFindings.d.ts +17 -0
  127. package/dist/mcp/terraform/tools/scan.d.ts +114 -0
  128. package/dist/mcp/terraform/tools/validate.d.ts +31 -0
  129. package/dist/mcp/terraform/tools/verifyRemediation.d.ts +31 -0
  130. package/dist/mcp/terraform/tools/versionCurrency.d.ts +5 -0
  131. package/dist/mcp/terraform/tools.d.ts +16 -0
  132. package/dist/mcp/terraform/transformPacks.d.ts +267 -0
  133. package/dist/mcp/terraform/types.d.ts +226 -0
  134. package/dist/mcp/terraform/verification.d.ts +81 -0
  135. package/dist/mcp/terraform/vex.d.ts +115 -0
  136. package/dist/mcp/terraform/writeOnly.d.ts +67 -0
  137. package/dist/mcp/terraform.d.ts +51 -0
  138. package/dist/mcp/terratest.d.ts +85 -0
  139. package/dist/mcp/untrustedContent.d.ts +76 -0
  140. package/dist/mcp/upload.d.ts +8 -0
  141. package/dist/models.d.ts +181 -0
  142. package/dist/modes/address-reviews.d.ts +2 -0
  143. package/dist/modes/assess.d.ts +2 -0
  144. package/dist/modes/build.d.ts +2 -0
  145. package/dist/modes/compliance-audit.d.ts +2 -0
  146. package/dist/modes/cost-optimization.d.ts +2 -0
  147. package/dist/modes/drift-detect.d.ts +2 -0
  148. package/dist/modes/fix.d.ts +2 -0
  149. package/dist/modes/incremental-review.d.ts +2 -0
  150. package/dist/modes/index.d.ts +24 -0
  151. package/dist/modes/modernize-deprecated.d.ts +2 -0
  152. package/dist/modes/plan.d.ts +2 -0
  153. package/dist/modes/policy-gate.d.ts +2 -0
  154. package/dist/modes/prFormats.d.ts +3 -0
  155. package/dist/modes/refactor.d.ts +2 -0
  156. package/dist/modes/refresh-remediation.d.ts +2 -0
  157. package/dist/modes/remediate-and-refactor.d.ts +2 -0
  158. package/dist/modes/remediate.d.ts +2 -0
  159. package/dist/modes/resolve-conflicts.d.ts +2 -0
  160. package/dist/modes/review.d.ts +2 -0
  161. package/dist/modes/summarize-pr.d.ts +2 -0
  162. package/dist/modes/task.d.ts +2 -0
  163. package/dist/modes/terraform-code-review.d.ts +2 -0
  164. package/dist/modes/types.d.ts +9 -0
  165. package/dist/modes/update-dependencies.d.ts +2 -0
  166. package/dist/prep/index.d.ts +7 -0
  167. package/dist/prep/installNodeDependencies.d.ts +2 -0
  168. package/dist/prep/installPythonDependencies.d.ts +2 -0
  169. package/dist/prep/types.d.ts +31 -0
  170. package/dist/reviewQuality.d.ts +107 -0
  171. package/dist/skills/terraform-best-practices/SKILL.md +379 -0
  172. package/dist/toolState.d.ts +123 -0
  173. package/dist/utils/activity.d.ts +40 -0
  174. package/dist/utils/agent.d.ts +47 -0
  175. package/dist/utils/agentHangReport.d.ts +38 -0
  176. package/dist/utils/annotations.d.ts +17 -0
  177. package/dist/utils/apiFetch.d.ts +11 -0
  178. package/dist/utils/apiKeys.d.ts +48 -0
  179. package/dist/utils/apiUrl.d.ts +28 -0
  180. package/dist/utils/assets.d.ts +8 -0
  181. package/dist/utils/baseRefConfig.d.ts +121 -0
  182. package/dist/utils/billingErrors.d.ts +85 -0
  183. package/dist/utils/body.d.ts +34 -0
  184. package/dist/utils/buildInfraweaverFooter.d.ts +29 -0
  185. package/dist/utils/byokFallback.d.ts +85 -0
  186. package/dist/utils/changeImpact.d.ts +101 -0
  187. package/dist/utils/claudeSubscription.d.ts +30 -0
  188. package/dist/utils/cli.d.ts +10 -0
  189. package/dist/utils/cloudClient.d.ts +33 -0
  190. package/dist/utils/cloudFetchCore.d.ts +42 -0
  191. package/dist/utils/cloudReport.d.ts +114 -0
  192. package/dist/utils/codexHome.d.ts +29 -0
  193. package/dist/utils/codexOAuth.d.ts +60 -0
  194. package/dist/utils/diffCoverage.d.ts +63 -0
  195. package/dist/utils/env.d.ts +46 -0
  196. package/dist/utils/errorReport.d.ts +17 -0
  197. package/dist/utils/exitHandler.d.ts +8 -0
  198. package/dist/utils/fixDoubleEscapedString.d.ts +1 -0
  199. package/dist/utils/gitAuth.d.ts +84 -0
  200. package/dist/utils/gitAuthServer.d.ts +24 -0
  201. package/dist/utils/github.d.ts +104 -0
  202. package/dist/utils/globals.d.ts +3 -0
  203. package/dist/utils/infraweaverConfig.d.ts +56 -0
  204. package/dist/utils/install.d.ts +37 -0
  205. package/dist/utils/instructions.d.ts +48 -0
  206. package/dist/utils/keylessOidc.d.ts +28 -0
  207. package/dist/utils/leapingComment.d.ts +11 -0
  208. package/dist/utils/learnings.d.ts +62 -0
  209. package/dist/utils/learningsTruncate.d.ts +25 -0
  210. package/dist/utils/lifecycle.d.ts +57 -0
  211. package/dist/utils/log.d.ts +111 -0
  212. package/dist/utils/modelResolver.d.ts +63 -0
  213. package/dist/utils/moduleFetch.d.ts +39 -0
  214. package/dist/utils/normalizeEnv.d.ts +30 -0
  215. package/dist/utils/openCodeModels.d.ts +11 -0
  216. package/dist/utils/openaiCompatible.d.ts +26 -0
  217. package/dist/utils/opentofuMcp.d.ts +50 -0
  218. package/dist/utils/overrides.d.ts +40 -0
  219. package/dist/utils/packageManager.d.ts +49 -0
  220. package/dist/utils/patchWorkflowRunFields.d.ts +29 -0
  221. package/dist/utils/payload.d.ts +249 -0
  222. package/dist/utils/prSummary.d.ts +61 -0
  223. package/dist/utils/presets.d.ts +36 -0
  224. package/dist/utils/progressComment.d.ts +146 -0
  225. package/dist/utils/providerErrors.d.ts +31 -0
  226. package/dist/utils/proxyModel.d.ts +76 -0
  227. package/dist/utils/rangeDiff.d.ts +51 -0
  228. package/dist/utils/redact.d.ts +33 -0
  229. package/dist/utils/registryAuth.d.ts +52 -0
  230. package/dist/utils/remediationCommand.d.ts +58 -0
  231. package/dist/utils/retry.d.ts +38 -0
  232. package/dist/utils/reviewCleanup.d.ts +14 -0
  233. package/dist/utils/run.d.ts +9 -0
  234. package/dist/utils/runContext.d.ts +112 -0
  235. package/dist/utils/runContextData.d.ts +42 -0
  236. package/dist/utils/runErrorRenderer.d.ts +64 -0
  237. package/dist/utils/runLifecycle.d.ts +89 -0
  238. package/dist/utils/runStartupLog.d.ts +15 -0
  239. package/dist/utils/secrets.d.ts +34 -0
  240. package/dist/utils/setup.d.ts +90 -0
  241. package/dist/utils/shell.d.ts +44 -0
  242. package/dist/utils/skills.d.ts +10 -0
  243. package/dist/utils/subprocess.d.ts +81 -0
  244. package/dist/utils/terraformMcp.d.ts +46 -0
  245. package/dist/utils/time.d.ts +15 -0
  246. package/dist/utils/timer.d.ts +23 -0
  247. package/dist/utils/todoTracking.d.ts +16 -0
  248. package/dist/utils/token.d.ts +52 -0
  249. package/dist/utils/toolLicensing.d.ts +56 -0
  250. package/dist/utils/toolSelection.d.ts +73 -0
  251. package/dist/utils/toon.d.ts +16 -0
  252. package/dist/utils/version.d.ts +2 -0
  253. package/dist/utils/versioning.d.ts +7 -0
  254. package/dist/utils/vertex.d.ts +16 -0
  255. package/dist/utils/workflow.d.ts +13 -0
  256. package/package.json +132 -0
  257. package/src/agents/claude.ts +1588 -0
  258. package/src/agents/claudePretoolGate.ts +286 -0
  259. package/src/agents/dispatchMetrics.ts +162 -0
  260. package/src/agents/gateServer.ts +178 -0
  261. package/src/agents/index.ts +10 -0
  262. package/src/agents/nativeFsDenies.ts +164 -0
  263. package/src/agents/opencode.ts +1600 -0
  264. package/src/agents/opencodePlugin.ts +304 -0
  265. package/src/agents/opencodeShared.ts +134 -0
  266. package/src/agents/postRun.ts +615 -0
  267. package/src/agents/reviewer.ts +134 -0
  268. package/src/agents/sessionLabeler.ts +185 -0
  269. package/src/agents/shared.ts +377 -0
  270. package/src/agents/subagentModels.ts +40 -0
  271. package/src/agents/tokenQuota.ts +203 -0
  272. package/src/agents/writeGateSource.ts +148 -0
  273. package/src/agents/writePolicy.ts +132 -0
  274. package/src/brand.ts +84 -0
  275. package/src/cli.ts +117 -0
  276. package/src/commands/gha.ts +188 -0
  277. package/src/commands/mcp.ts +126 -0
  278. package/src/commands/verifyEvidence.ts +100 -0
  279. package/src/entry.ts +7 -0
  280. package/src/entryPost.ts +109 -0
  281. package/src/external.ts +308 -0
  282. package/src/i18n/scaffolding.ts +191 -0
  283. package/src/index.ts +7 -0
  284. package/src/internal/index.ts +74 -0
  285. package/src/lifecycle.ts +2 -0
  286. package/src/main.ts +815 -0
  287. package/src/mcp/__fixtures__/infraweaver-scratch-pr-49-review-3485940013.json +110 -0
  288. package/src/mcp/__fixtures__/infraweaver-scratch-pr-64-review-3531000326.json +14 -0
  289. package/src/mcp/__fixtures__/infraweaver-test-repo-pr-1.diff.json +67 -0
  290. package/src/mcp/__snapshots__/checkout.test.ts.snap +109 -0
  291. package/src/mcp/__snapshots__/reviewComments.test.ts.snap +71 -0
  292. package/src/mcp/arkConfig.ts +7 -0
  293. package/src/mcp/assess.ts +723 -0
  294. package/src/mcp/capabilityContext.ts +80 -0
  295. package/src/mcp/changeSummary.ts +145 -0
  296. package/src/mcp/checkSuite.ts +261 -0
  297. package/src/mcp/checkout.ts +1015 -0
  298. package/src/mcp/comment.ts +683 -0
  299. package/src/mcp/commitInfo.ts +57 -0
  300. package/src/mcp/crosswalk.ts +1253 -0
  301. package/src/mcp/crosswalkDigest.ts +5 -0
  302. package/src/mcp/cyberEssentials.ts +60 -0
  303. package/src/mcp/dashboard.ts +232 -0
  304. package/src/mcp/dependencies.ts +190 -0
  305. package/src/mcp/frameworks.ts +236 -0
  306. package/src/mcp/geminiSanitizer.ts +212 -0
  307. package/src/mcp/git.ts +1116 -0
  308. package/src/mcp/guardrails.ts +771 -0
  309. package/src/mcp/issue.ts +74 -0
  310. package/src/mcp/issueComments.ts +48 -0
  311. package/src/mcp/issueEvents.ts +100 -0
  312. package/src/mcp/issueInfo.ts +72 -0
  313. package/src/mcp/labels.ts +35 -0
  314. package/src/mcp/localContext.ts +65 -0
  315. package/src/mcp/localServer.ts +217 -0
  316. package/src/mcp/moduleExtraction.ts +368 -0
  317. package/src/mcp/moduleTests.ts +421 -0
  318. package/src/mcp/modules.ts +752 -0
  319. package/src/mcp/output.ts +71 -0
  320. package/src/mcp/pathSafety.ts +28 -0
  321. package/src/mcp/policy.ts +226 -0
  322. package/src/mcp/pr.ts +238 -0
  323. package/src/mcp/prInfo.ts +91 -0
  324. package/src/mcp/providerSchema.ts +175 -0
  325. package/src/mcp/review.ts +1081 -0
  326. package/src/mcp/reviewComments.ts +1137 -0
  327. package/src/mcp/roots.ts +217 -0
  328. package/src/mcp/scope.ts +82 -0
  329. package/src/mcp/selectMode.ts +207 -0
  330. package/src/mcp/server.ts +498 -0
  331. package/src/mcp/shared.ts +120 -0
  332. package/src/mcp/shell.ts +631 -0
  333. package/src/mcp/staleFix.ts +557 -0
  334. package/src/mcp/terraform/__snapshots__/moduleDocs.test.ts.snap +40 -0
  335. package/src/mcp/terraform/azurePrices.ts +38 -0
  336. package/src/mcp/terraform/baseline.ts +172 -0
  337. package/src/mcp/terraform/concernResult.ts +111 -0
  338. package/src/mcp/terraform/cost.ts +175 -0
  339. package/src/mcp/terraform/cspm.ts +326 -0
  340. package/src/mcp/terraform/currency.ts +354 -0
  341. package/src/mcp/terraform/decisions.ts +590 -0
  342. package/src/mcp/terraform/eidas.ts +134 -0
  343. package/src/mcp/terraform/evidence.ts +771 -0
  344. package/src/mcp/terraform/findings.ts +383 -0
  345. package/src/mcp/terraform/fixMemory.ts +253 -0
  346. package/src/mcp/terraform/governance.ts +231 -0
  347. package/src/mcp/terraform/hcl.ts +273 -0
  348. package/src/mcp/terraform/iacLanguages.ts +431 -0
  349. package/src/mcp/terraform/idleFloor.ts +304 -0
  350. package/src/mcp/terraform/keyless.ts +123 -0
  351. package/src/mcp/terraform/moduleDocs.ts +303 -0
  352. package/src/mcp/terraform/nativeRules.ts +152 -0
  353. package/src/mcp/terraform/nativeScan.ts +67 -0
  354. package/src/mcp/terraform/noiseProfile.ts +183 -0
  355. package/src/mcp/terraform/normalization.ts +265 -0
  356. package/src/mcp/terraform/oscal.ts +283 -0
  357. package/src/mcp/terraform/packs/azurerm-3-4.ts +382 -0
  358. package/src/mcp/terraform/packs/cloudflare-4-5.ts +114 -0
  359. package/src/mcp/terraform/paths.ts +59 -0
  360. package/src/mcp/terraform/plan.ts +377 -0
  361. package/src/mcp/terraform/planDrift.ts +520 -0
  362. package/src/mcp/terraform/policyAuthor.ts +886 -0
  363. package/src/mcp/terraform/prowlerOcsf.ts +380 -0
  364. package/src/mcp/terraform/refactor.ts +879 -0
  365. package/src/mcp/terraform/registry.ts +317 -0
  366. package/src/mcp/terraform/risk.ts +99 -0
  367. package/src/mcp/terraform/scanSession.ts +242 -0
  368. package/src/mcp/terraform/scannerCache.ts +86 -0
  369. package/src/mcp/terraform/scannerEgress.ts +141 -0
  370. package/src/mcp/terraform/scannerJson.ts +22 -0
  371. package/src/mcp/terraform/scanners.ts +1134 -0
  372. package/src/mcp/terraform/signing.ts +151 -0
  373. package/src/mcp/terraform/stateLocking.ts +106 -0
  374. package/src/mcp/terraform/subprocess.ts +102 -0
  375. package/src/mcp/terraform/suppressions.ts +551 -0
  376. package/src/mcp/terraform/taxonomy.ts +0 -0
  377. package/src/mcp/terraform/tfquery.ts +159 -0
  378. package/src/mcp/terraform/toolchainIntegrity.ts +151 -0
  379. package/src/mcp/terraform/tools/authorPolicy.ts +185 -0
  380. package/src/mcp/terraform/tools/detectPlanDrift.ts +279 -0
  381. package/src/mcp/terraform/tools/emitCost.ts +130 -0
  382. package/src/mcp/terraform/tools/emitSarif.ts +108 -0
  383. package/src/mcp/terraform/tools/fixMemory.ts +82 -0
  384. package/src/mcp/terraform/tools/infracostDiff.ts +110 -0
  385. package/src/mcp/terraform/tools/ingestExternalFindings.ts +259 -0
  386. package/src/mcp/terraform/tools/moduleLookup.ts +86 -0
  387. package/src/mcp/terraform/tools/moduleSearch.ts +46 -0
  388. package/src/mcp/terraform/tools/plan.ts +384 -0
  389. package/src/mcp/terraform/tools/providerUpgrade.ts +217 -0
  390. package/src/mcp/terraform/tools/readFindings.ts +138 -0
  391. package/src/mcp/terraform/tools/scan.ts +303 -0
  392. package/src/mcp/terraform/tools/validate.ts +160 -0
  393. package/src/mcp/terraform/tools/verifyRemediation.ts +190 -0
  394. package/src/mcp/terraform/tools/versionCurrency.ts +64 -0
  395. package/src/mcp/terraform/tools.ts +62 -0
  396. package/src/mcp/terraform/transformPacks.ts +594 -0
  397. package/src/mcp/terraform/types.ts +382 -0
  398. package/src/mcp/terraform/verification.ts +150 -0
  399. package/src/mcp/terraform/vex.ts +367 -0
  400. package/src/mcp/terraform/writeOnly.ts +252 -0
  401. package/src/mcp/terraform.ts +52 -0
  402. package/src/mcp/terratest.ts +215 -0
  403. package/src/mcp/untrustedContent.ts +126 -0
  404. package/src/mcp/upload.ts +123 -0
  405. package/src/models.ts +753 -0
  406. package/src/modes/address-reviews.ts +35 -0
  407. package/src/modes/assess.ts +27 -0
  408. package/src/modes/build.ts +86 -0
  409. package/src/modes/compliance-audit.ts +25 -0
  410. package/src/modes/cost-optimization.ts +36 -0
  411. package/src/modes/drift-detect.ts +31 -0
  412. package/src/modes/fix.ts +29 -0
  413. package/src/modes/incremental-review.ts +103 -0
  414. package/src/modes/index.ts +94 -0
  415. package/src/modes/modernize-deprecated.ts +36 -0
  416. package/src/modes/plan.ts +21 -0
  417. package/src/modes/policy-gate.ts +27 -0
  418. package/src/modes/prFormats.ts +325 -0
  419. package/src/modes/refactor.ts +74 -0
  420. package/src/modes/refresh-remediation.ts +40 -0
  421. package/src/modes/remediate-and-refactor.ts +42 -0
  422. package/src/modes/remediate.ts +78 -0
  423. package/src/modes/resolve-conflicts.ts +32 -0
  424. package/src/modes/review.ts +135 -0
  425. package/src/modes/summarize-pr.ts +42 -0
  426. package/src/modes/task.ts +26 -0
  427. package/src/modes/terraform-code-review.ts +68 -0
  428. package/src/modes/types.ts +17 -0
  429. package/src/modes/update-dependencies.ts +44 -0
  430. package/src/prep/index.ts +96 -0
  431. package/src/prep/installNodeDependencies.ts +251 -0
  432. package/src/prep/installPythonDependencies.ts +235 -0
  433. package/src/prep/types.ts +38 -0
  434. package/src/reviewQuality.ts +237 -0
  435. package/src/runCli.ts +335 -0
  436. package/src/skills/terraform-best-practices/SKILL.md +379 -0
  437. package/src/toolState.ts +241 -0
  438. package/src/utils/activity.ts +210 -0
  439. package/src/utils/agent.ts +245 -0
  440. package/src/utils/agentHangReport.ts +180 -0
  441. package/src/utils/annotations.ts +56 -0
  442. package/src/utils/apiFetch.ts +19 -0
  443. package/src/utils/apiKeys.ts +305 -0
  444. package/src/utils/apiUrl.ts +42 -0
  445. package/src/utils/assets.ts +123 -0
  446. package/src/utils/baseRefConfig.ts +254 -0
  447. package/src/utils/billingErrors.ts +210 -0
  448. package/src/utils/body.ts +168 -0
  449. package/src/utils/buildInfraweaverFooter.ts +104 -0
  450. package/src/utils/byokFallback.ts +137 -0
  451. package/src/utils/changeImpact.ts +330 -0
  452. package/src/utils/claudeSubscription.ts +93 -0
  453. package/src/utils/cli.ts +36 -0
  454. package/src/utils/cloudClient.ts +57 -0
  455. package/src/utils/cloudFetchCore.ts +139 -0
  456. package/src/utils/cloudReport.ts +316 -0
  457. package/src/utils/codexHome.ts +204 -0
  458. package/src/utils/codexOAuth.ts +154 -0
  459. package/src/utils/codexRefreshDetect.ts +36 -0
  460. package/src/utils/diffCoverage.ts +404 -0
  461. package/src/utils/env.ts +84 -0
  462. package/src/utils/errorReport.ts +94 -0
  463. package/src/utils/exitHandler.ts +35 -0
  464. package/src/utils/fixDoubleEscapedString.ts +9 -0
  465. package/src/utils/ghaCore.ts +13 -0
  466. package/src/utils/gitAuth.ts +268 -0
  467. package/src/utils/gitAuthServer.ts +186 -0
  468. package/src/utils/github.ts +676 -0
  469. package/src/utils/globals.ts +9 -0
  470. package/src/utils/humanEditCapture.ts +198 -0
  471. package/src/utils/infraweaverConfig.ts +202 -0
  472. package/src/utils/install.ts +279 -0
  473. package/src/utils/instructions.ts +640 -0
  474. package/src/utils/keylessOidc.ts +47 -0
  475. package/src/utils/leapingComment.ts +20 -0
  476. package/src/utils/learnings.ts +145 -0
  477. package/src/utils/learningsTruncate.ts +42 -0
  478. package/src/utils/lifecycle.ts +198 -0
  479. package/src/utils/log.ts +452 -0
  480. package/src/utils/modelResolver.ts +105 -0
  481. package/src/utils/moduleFetch.ts +138 -0
  482. package/src/utils/normalizeEnv.ts +106 -0
  483. package/src/utils/openCodeModels.ts +86 -0
  484. package/src/utils/openaiCompatible.ts +52 -0
  485. package/src/utils/opentofuMcp.ts +61 -0
  486. package/src/utils/overrides.ts +100 -0
  487. package/src/utils/packageManager.ts +257 -0
  488. package/src/utils/patchWorkflowRunFields.ts +173 -0
  489. package/src/utils/payload.ts +1206 -0
  490. package/src/utils/prSummary.ts +148 -0
  491. package/src/utils/presets.ts +105 -0
  492. package/src/utils/progressComment.ts +266 -0
  493. package/src/utils/providerErrors.ts +189 -0
  494. package/src/utils/proxyModel.ts +239 -0
  495. package/src/utils/rangeDiff.ts +182 -0
  496. package/src/utils/redact.ts +86 -0
  497. package/src/utils/registryAuth.ts +115 -0
  498. package/src/utils/remediationCommand.ts +144 -0
  499. package/src/utils/retry.ts +180 -0
  500. package/src/utils/reviewCleanup.ts +116 -0
  501. package/src/utils/run.ts +100 -0
  502. package/src/utils/runContext.ts +276 -0
  503. package/src/utils/runContextData.ts +121 -0
  504. package/src/utils/runErrorRenderer.ts +282 -0
  505. package/src/utils/runFixture.ts +91 -0
  506. package/src/utils/runLifecycle.ts +360 -0
  507. package/src/utils/runStartupLog.ts +67 -0
  508. package/src/utils/secrets.ts +208 -0
  509. package/src/utils/setup.ts +368 -0
  510. package/src/utils/shell.ts +132 -0
  511. package/src/utils/skills.ts +67 -0
  512. package/src/utils/subprocess.ts +474 -0
  513. package/src/utils/terraformMcp.ts +99 -0
  514. package/src/utils/time.ts +59 -0
  515. package/src/utils/timer.ts +72 -0
  516. package/src/utils/todoTracking.ts +168 -0
  517. package/src/utils/token.ts +294 -0
  518. package/src/utils/toolLicensing.ts +152 -0
  519. package/src/utils/toolSelection.ts +239 -0
  520. package/src/utils/toon.ts +76 -0
  521. package/src/utils/version.ts +10 -0
  522. package/src/utils/versioning.ts +44 -0
  523. package/src/utils/vertex.ts +94 -0
  524. 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;