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