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,97 @@
1
+ /**
2
+ * Track per-session labels so log lines from parallel subagents can be
3
+ * differentiated. The orchestrator dispatches lens subagents
4
+ * via the Task tool; each subagent runs in its own opencode/claude Session
5
+ * with its own `sessionID` (or `session_id`) tag on the NDJSON event stream.
6
+ *
7
+ * Without per-session prefixing, parallel subagent tool_use / tool_result /
8
+ * text events appear as a single interleaved stream tagged with `[Infraweaver]`,
9
+ * making it impossible for a human reading the logs to attribute work to a
10
+ * specific lens.
11
+ *
12
+ * The labeler is deliberately runtime-agnostic — both opencode.ts and
13
+ * claude.ts feed it the same shape. The contract is FIFO: when the orchestrator
14
+ * dispatches N task tool_use blocks in a single assistant turn (the parallel
15
+ * fan-out the multi-lens prompt requires), the i-th new sessionID is assumed
16
+ * to belong to the i-th task dispatch. This is correct as long as parallel
17
+ * dispatches are emitted in source-order and the runtimes respect that order
18
+ * when assigning child sessions; we do not depend on it for correctness of
19
+ * the read-only contract — only for log readability.
20
+ */
21
+ export interface TaskDispatchInput {
22
+ description?: string | undefined;
23
+ subagent_type?: string | undefined;
24
+ prompt?: string | undefined;
25
+ }
26
+ export declare const ORCHESTRATOR_LABEL = "orchestrator";
27
+ /**
28
+ * Extract a human-readable label from a Task tool's input. Tries (in order):
29
+ * 1. explicit `lens: <name>` marker on a line in the prompt — preferred,
30
+ * lets the orchestrator name the lens deterministically
31
+ * 2. the Task tool's `description` field — short, written by orchestrator
32
+ * per call, usually enough
33
+ * 3. the `subagent_type` — falls back to the named
34
+ * subagent identity when description is missing
35
+ * 4. generic "subagent" — last resort
36
+ */
37
+ export declare function deriveLabelFromTaskInput(input: TaskDispatchInput): string;
38
+ /**
39
+ * Stateful tracker mapping subagent activity back to human-readable labels.
40
+ *
41
+ * Two attribution channels are supported because the runtimes differ:
42
+ *
43
+ * - **OpenCode** spawns each subagent as its own opencode `Session` with
44
+ * a distinct `sessionID`. The harness records each Task dispatch into a
45
+ * pending FIFO queue; the next previously-unseen sessionID consumes the
46
+ * head of the queue and binds it to that label.
47
+ *
48
+ * - **Claude Code** runs subagents inside the orchestrator's session — they
49
+ * all share `session_id` — and instead stamps every subagent message with
50
+ * `parent_tool_use_id` pointing at the Agent tool_use id that spawned them.
51
+ * The harness binds each Agent tool_use id to its dispatched label up
52
+ * front, then `labelFor` looks the label up directly when an event arrives
53
+ * carrying that `parent_tool_use_id`.
54
+ *
55
+ * `labelFor(sessionID, parentToolUseId?)` accepts both: when
56
+ * `parentToolUseId` is set and known it short-circuits to the direct mapping;
57
+ * otherwise it falls through to the FIFO/sessionID path.
58
+ */
59
+ export declare class SessionLabeler {
60
+ private readonly labels;
61
+ private readonly labelsByToolUseId;
62
+ private readonly pendingLabels;
63
+ private fallbackCounter;
64
+ /**
65
+ * Record a Task/Agent tool dispatch.
66
+ *
67
+ * @param input Task tool input — used to derive the lens label.
68
+ * @param toolUseId Optional Agent tool_use id. When provided, future events
69
+ * carrying `parent_tool_use_id === toolUseId` resolve
70
+ * directly to this label without consuming the FIFO queue
71
+ * (Claude path). Always also pushed to the FIFO queue so
72
+ * the OpenCode path still works when toolUseId is absent.
73
+ */
74
+ recordTaskDispatch(input: TaskDispatchInput, toolUseId?: string | null): string;
75
+ /**
76
+ * Return a label for the given event.
77
+ *
78
+ * @param sessionID Session id from the event (OpenCode: per-session;
79
+ * Claude: shared across orchestrator + subagents).
80
+ * @param parentToolUseId Claude's `parent_tool_use_id` — non-null on
81
+ * subagent messages. When set and known, takes
82
+ * priority over the FIFO/sessionID path.
83
+ */
84
+ labelFor(sessionID: string | undefined | null, parentToolUseId?: string | null): string;
85
+ /** number of distinct sessions seen so far (for diagnostics) */
86
+ size(): number;
87
+ /** all (sessionID, label) pairs, oldest first */
88
+ entries(): Array<[string, string]>;
89
+ /** how many pending labels are queued waiting to bind to a new session */
90
+ pendingDispatchCount(): number;
91
+ }
92
+ /**
93
+ * Format a log message with a session label prefix in magenta. Mirrors the
94
+ * style of utils/log.ts:prefixLines() so per-session prefixes look the same
95
+ * as the dormant withLogPrefix-based ones.
96
+ */
97
+ export declare function formatWithLabel(label: string, message: string): string;
@@ -0,0 +1,246 @@
1
+ import type { RunTokenQuota } from "#app/agents/tokenQuota";
2
+ import type { AgentId } from "#app/external";
3
+ import type { ToolState } from "#app/toolState";
4
+ import type { ResolvedInstructions } from "#app/utils/instructions";
5
+ import type { ResolvedPayload } from "#app/utils/payload";
6
+ import type { TodoTracker } from "#app/utils/todoTracking";
7
+ export declare const MAX_STDERR_LINES = 20;
8
+ /**
9
+ * how many times the post-run loop may resume the agent to fix a dirty tree
10
+ * or a failing stop hook before giving up.
11
+ */
12
+ export declare const MAX_POST_RUN_RETRIES = 3;
13
+ export declare function getGitStatus(): string;
14
+ export declare function buildCommitPrompt(status: string): string;
15
+ export interface StopHookFailure {
16
+ exitCode: number;
17
+ output: string;
18
+ }
19
+ export interface SummaryStale {
20
+ /** absolute path to the seeded snapshot file the agent was meant to edit. */
21
+ filePath: string;
22
+ }
23
+ export interface PostRunIssues {
24
+ stopHook?: StopHookFailure;
25
+ dirtyTree?: string;
26
+ /** populated when the rolling PR summary file is byte-identical to its
27
+ * seed, i.e. the agent never touched it. soft gate — nudges once via a
28
+ * resume turn but never fails the run, parallel to dirtyTree semantics. */
29
+ summaryStale?: SummaryStale;
30
+ /**
31
+ * populated when the agent selected a review mode but the post-run check
32
+ * over toolState shows neither a `create_pull_request_review` submission
33
+ * nor a final `report_progress` write happened. derived inline from
34
+ * `toolState.selectedMode` + `toolState.review` + `toolState.finalSummaryWritten`
35
+ * via {@link getUnsubmittedReview} — no parallel toolState flag is stored.
36
+ * carries the mode name so the resume prompt can reference it. handled like
37
+ * `stopHook`: nudge via resume, hard-fail if still unsatisfied after
38
+ * `MAX_POST_RUN_RETRIES`.
39
+ */
40
+ unsubmittedReview?: "Review" | "IncrementalReview" | "TerraformCodeReview";
41
+ }
42
+ export declare function hasPostRunIssues(issues: PostRunIssues): boolean;
43
+ /**
44
+ * token/cost usage data from a single agent run.
45
+ *
46
+ * NOTE on semantics: `inputTokens` here is the *total* billable input for the
47
+ * run — non-cached input + cache read + cache write — matching the per-agent
48
+ * SDK conventions. This is what gets persisted to `WorkflowRun.inputTokens`.
49
+ *
50
+ * The stdout token table and markdown step summary display a different "Input"
51
+ * column that shows only the non-cached portion (derivable as
52
+ * `inputTokens - cacheReadTokens - cacheWriteTokens`) so humans can see the
53
+ * cache hit ratio at a glance. Dashboards that query `WorkflowRun.inputTokens`
54
+ * directly are seeing the full total, not the log column.
55
+ */
56
+ export interface AgentUsage {
57
+ agent: string;
58
+ /** full billable input: non-cached + cache read + cache write */
59
+ inputTokens: number;
60
+ outputTokens: number;
61
+ cacheReadTokens?: number | undefined;
62
+ cacheWriteTokens?: number | undefined;
63
+ costUsd?: number | undefined;
64
+ }
65
+ export interface AgentToolUseEvent {
66
+ toolName: string;
67
+ input: unknown;
68
+ }
69
+ /**
70
+ * Result returned by agent execution
71
+ */
72
+ export interface AgentResult {
73
+ success: boolean;
74
+ output?: string | undefined;
75
+ error?: string | undefined;
76
+ metadata?: Record<string, unknown>;
77
+ usage?: AgentUsage | undefined;
78
+ }
79
+ /**
80
+ * Env var that carries the per-run MCP bearer token to BOTH agent harnesses,
81
+ * which reference it from their MCP client config so the on-disk/in-config form
82
+ * holds only a placeholder, never the raw token:
83
+ * - Claude Code expands `${INFRAWEAVER_MCP_TOKEN}` in .mcp.json headers.
84
+ * - opencode expands `{env:INFRAWEAVER_MCP_TOKEN}` in remote-MCP headers.
85
+ * The `_TOKEN` suffix also makes filterEnv() strip it from the MCP shell
86
+ * sandbox. Set only on the agent/server spawn env (never process.env), so a
87
+ * co-located dependency-install subprocess never inherits it. See
88
+ * ToolContext.mcpServerToken and gateServer.ts for the same pattern.
89
+ */
90
+ export declare const MCP_SERVER_TOKEN_ENV = "INFRAWEAVER_MCP_TOKEN";
91
+ /**
92
+ * Context passed to agent.run() and threaded through the post-run loop.
93
+ *
94
+ * design rule: this is the single object that flows through the harness and
95
+ * downstream utilities by reference. derived predicates (e.g.
96
+ * `getUnsubmittedReview`), tmpfile paths, and seed bytes live on
97
+ * `toolState` — read them at the call site, do not duplicate them onto this
98
+ * interface. utilities that need run state should accept `ctx` whole, not
99
+ * destructure a narrow subset.
100
+ */
101
+ export interface AgentRunContext {
102
+ payload: ResolvedPayload;
103
+ resolvedModel?: string | undefined;
104
+ mcpServerUrl: string;
105
+ /** per-run bearer token the agent's MCP client presents to mcpServerUrl. See
106
+ * ToolContext.mcpServerToken — delivered to the client config out-of-band so
107
+ * it never lands in a readable file. */
108
+ mcpServerToken: string;
109
+ tmpdir: string;
110
+ /** harness-owned secret paths that agent filesystem tools must never read. */
111
+ secretDenyPaths?: string[] | undefined;
112
+ /**
113
+ * canonical bare names of the state-mutating MCP tools subagents must not
114
+ * call, derived from each tool's `mutates` flag (`subagentDeniedToolNames`).
115
+ * Embedded into the claude/opencode subagent gate sources written at startup.
116
+ */
117
+ subagentDeniedTools: readonly string[];
118
+ instructions: ResolvedInstructions;
119
+ todoTracker?: TodoTracker | undefined;
120
+ /**
121
+ * user-configured stop hook script. runs after the agent finishes each
122
+ * attempt; non-zero exit resumes the agent with the hook output as
123
+ * guidance. null when the repo has no stop hook configured.
124
+ */
125
+ stopScript?: string | null | undefined;
126
+ /**
127
+ * mutable per-run state shared with the MCP server (by reference). post-run
128
+ * gates read fresh values from it after each agent attempt — `summaryFilePath`,
129
+ * `summarySeed`, `selectedMode`, `review`, `finalSummaryWritten`,
130
+ * `hadProgressComment` are all consulted by `collectPostRunIssues`. see
131
+ * `action/toolState.ts` for the literal-state design rule.
132
+ */
133
+ toolState: ToolState;
134
+ /**
135
+ * called synchronously when the agent subprocess is killed for inner
136
+ * activity timeout. lets main.ts tear down shared resources (MCP HTTP
137
+ * server) so lingering SSE reconnects don't keep the outer timer alive.
138
+ */
139
+ onActivityTimeout?: (() => void) | undefined;
140
+ onToolUse?: ((event: AgentToolUseEvent) => void) | undefined;
141
+ /**
142
+ * Per-run token ceiling (OWASP LLM10). Harnesses report their running total
143
+ * to `observe()` as usage arrives and must stop the run when it returns true
144
+ * — the activity watchdogs bound idleness, and a runaway loop is never idle.
145
+ * Absent for call sites with nothing to bound (subagents, tests); use
146
+ * `unlimitedTokenQuota()` rather than a null check when one is required.
147
+ */
148
+ tokenQuota?: RunTokenQuota | undefined;
149
+ /**
150
+ * Infraweaver API JWT scoped to this run. agents only need this when they
151
+ * have to write state back to Infraweaver mid-run (today: opencode.ts uses
152
+ * it to seed the post-hook's writeback envelope for Codex auth refresh).
153
+ * empty string when the run wasn't context-resolved (e.g. local dry-runs).
154
+ */
155
+ apiToken: string;
156
+ }
157
+ export interface Agent {
158
+ name: AgentId;
159
+ install: (token?: string) => Promise<string>;
160
+ run: (ctx: AgentRunContext) => Promise<AgentResult>;
161
+ }
162
+ export declare const agent: (input: Agent) => Agent;
163
+ /** format a USD cost to 4 decimal places, always showing the leading zero */
164
+ export declare function formatCostUsd(costUsd: number): string;
165
+ /**
166
+ * Redirect the sub-agent's HOME / XDG config into the run tmpdir so it never
167
+ * reads or writes the runner's real home. Both harnesses build this identically
168
+ * (then `mkdir` under `XDG_CONFIG_HOME` for their provider config).
169
+ */
170
+ export declare function agentHomeEnv(tmpdir: string): {
171
+ HOME: string;
172
+ XDG_CONFIG_HOME: string;
173
+ };
174
+ /**
175
+ * The base spawn env every harness starts from: the process env, the tmpdir
176
+ * HOME/XDG redirect, and `PWD` pinned to the repo dir.
177
+ *
178
+ * PWD is load-bearing: opencode (≥1.14) resolves the session `directory` from
179
+ * `process.env.PWD`, and claude-code (2.1.x) registers `PWD` as a "session"
180
+ * additional working dir when it differs from `process.cwd()` — so inheriting
181
+ * the harness's own PWD via `...process.env` would add the wrong dir to the
182
+ * agent's allowed working set under `pnpm runtest`/`dev:run`. Providers spread
183
+ * this and layer their own keys (config content, credentials) on top.
184
+ */
185
+ export declare function baseAgentEnv(homeEnv: {
186
+ HOME: string;
187
+ XDG_CONFIG_HOME: string;
188
+ }, repoDir: string): NodeJS.ProcessEnv;
189
+ /**
190
+ * Normalize a run's raw token/cost components into an {@link AgentUsage}, or
191
+ * `undefined` when the run produced nothing billable. The single home for the
192
+ * convention both harnesses previously re-implemented in their `buildUsage`:
193
+ * - total `inputTokens` = non-cached input + cache read + cache write
194
+ * - a zero cache / cost field collapses to `undefined` (symmetry with
195
+ * {@link mergeAgentUsage})
196
+ * - all-zero input/output/cost → `undefined` (no empty usage rows)
197
+ */
198
+ export declare function buildAgentUsage(parts: {
199
+ agent: string;
200
+ /** non-cached input tokens sent this run. */
201
+ input: number;
202
+ output: number;
203
+ cacheRead: number;
204
+ cacheWrite: number;
205
+ costUsd: number;
206
+ }): AgentUsage | undefined;
207
+ /**
208
+ * merge two AgentUsage snapshots into one running total.
209
+ *
210
+ * both agent harnesses invoke their runner multiple times per `run()` when the
211
+ * post-run retry loop kicks in (MAX_POST_RUN_RETRIES). each invocation
212
+ * produces its own AgentUsage; we sum them so downstream callers (usage
213
+ * summary, WorkflowRun persistence) see the whole session — not just the
214
+ * final retry's slice.
215
+ *
216
+ * returns `undefined` when both sides are empty so callers can short-circuit
217
+ * without a special case. zero-valued cache / cost fields are dropped to
218
+ * `undefined` for symmetry with each harness's `buildUsage`.
219
+ */
220
+ export declare function mergeAgentUsage(a: AgentUsage | undefined, b: AgentUsage | undefined): AgentUsage | undefined;
221
+ /**
222
+ * unified per-run token table used by every agent harness.
223
+ *
224
+ * columns are kept stable across agents and models so downstream log parsers
225
+ * (scripts/token-usage.ts, cost dashboards) only have to understand one format:
226
+ *
227
+ * Input non-cached input tokens sent this run
228
+ * Cache Read input tokens served from prompt cache (Anthropic, etc.)
229
+ * Cache Write input tokens written to prompt cache this run
230
+ * Output assistant output tokens
231
+ * Total sum of the four columns — the real billable quantity
232
+ * Cost ($) USD cost reported by the provider (only rendered when known)
233
+ *
234
+ * models that don't report prompt caching leave Cache Read / Write at 0.
235
+ * OpenCode emits per-step `part.cost` sourced from models.dev (works across
236
+ * Anthropic, OpenAI, Google, xAI, DeepSeek, Moonshot, OpenRouter, etc.);
237
+ * Claude CLI emits `total_cost_usd` on its final `result` event. pass the
238
+ * accumulated value via `costUsd` to render the Cost column.
239
+ */
240
+ export declare function logTokenTable(t: {
241
+ input: number;
242
+ cacheRead: number;
243
+ cacheWrite: number;
244
+ output: number;
245
+ costUsd?: number | undefined;
246
+ }): void;
@@ -0,0 +1,19 @@
1
+ /**
2
+ * Derive a cheaper subagent model override from the orchestrator's resolved
3
+ * model spec.
4
+ *
5
+ * This is a pure registry lookup: every alias in `action/models.ts` declares
6
+ * its own `subagentModel` (alias key in the same provider). At runtime we
7
+ * reverse-lookup the orchestrator's resolved slug to find the alias that
8
+ * produced it, follow the `subagentModel` pointer, and return the target
9
+ * alias's resolve / openRouterResolve depending on which route the
10
+ * orchestrator was using.
11
+ *
12
+ * Returns `{ reviewer: undefined }` when the orchestrator's alias has no
13
+ * `subagentModel` (e.g. it's already at a sufficiently cheap tier, or its
14
+ * provider doesn't have a clean cheaper-but-capable sibling). See models.ts
15
+ * for the wiring + per-provider rationale.
16
+ */
17
+ export declare function deriveSubagentModels(orchestratorSpec: string | undefined): {
18
+ reviewer: string | undefined;
19
+ };
@@ -0,0 +1,118 @@
1
+ /**
2
+ * Per-run token quota (OWASP **LLM10**, unbounded consumption).
3
+ *
4
+ * WHAT WAS ACTUALLY UNBOUNDED. The engine already bounds a run in *time* — an
5
+ * outer process-output timer, an inner event-silence watchdog, one agent per
6
+ * run — and Infraweaver Cloud already bounds *spend* per run and per tenant. What
7
+ * neither bounds is **tokens inside a single, continuously-progressing run**: an
8
+ * agent that keeps emitting tokens never trips an activity watchdog, because it
9
+ * is not idle. A hostile repository can steer a remediation loop into exactly
10
+ * that shape (a fix that re-breaks its own check, a file that always re-scans
11
+ * dirty), and on a **self-hosted** run there is no Cloud meter watching. Time
12
+ * says nothing about consumption; this module is the missing bound.
13
+ *
14
+ * FAIL-CLOSED, NOT TRUNCATED. When the quota is reached the run STOPS and says
15
+ * so. It does not quietly finish with whatever it had — a truncated compliance
16
+ * run that reports as complete is worse than no run, because the output looks
17
+ * like an assessment and is not one. {@link RunTokenQuota.gap} is the sentence
18
+ * that goes to the operator, phrased as a coverage gap rather than a crash.
19
+ *
20
+ * WHY MONOTONIC-BY-SOURCE. The harnesses do not report deltas. Claude Code
21
+ * accumulates per-message usage and then *replaces* the running total with the
22
+ * authoritative figure from the terminal `result` event; opencode sums per-turn
23
+ * and retries produce a fresh accumulator. Feeding either straight into a `+=`
24
+ * would double-count. So callers report a running TOTAL under a stable source
25
+ * key and the quota charges only the increase — correct whether the harness
26
+ * accumulates, replaces, or restarts, and never decreasing.
27
+ *
28
+ * INPUT-ONLY, NEVER `.infraweaver.yml`. This is a safety limit, so it is settable
29
+ * from the workflow input alone. A quota a pull request could raise in the run
30
+ * that reviews it would not be a quota — the A.1 lesson, applied at birth (the
31
+ * same call TC-0.2 made for `tools_network`).
32
+ */
33
+ /**
34
+ * Thrown (as an abort reason) when a run reaches its token ceiling.
35
+ *
36
+ * A distinct class because the retry paths must be able to tell this apart
37
+ * from a transient provider failure: retrying a run that was stopped for
38
+ * spending too much is precisely the wrong response, and would double the
39
+ * consumption the quota exists to bound.
40
+ */
41
+ export declare class TokenQuotaExceededError extends Error {
42
+ readonly code = "TOKEN_QUOTA_EXCEEDED";
43
+ constructor(message: string);
44
+ }
45
+ /** True when an unknown error is (or wraps) a token-quota abort. */
46
+ export declare function isTokenQuotaError(err: unknown): boolean;
47
+ /**
48
+ * Default ceiling on billable tokens for one run.
49
+ *
50
+ * Sized to bound a runaway, not to ration real work: a heavy Review over a
51
+ * large repository lands in the low millions once cache reads are counted, so
52
+ * this sits roughly an order of magnitude above the worst legitimate run we
53
+ * expect. A limit tuned close to normal usage would turn a control into an
54
+ * outage, which is how safety limits get switched off for good.
55
+ */
56
+ export declare const DEFAULT_RUN_TOKEN_QUOTA = 10000000;
57
+ /** The workflow input that overrides {@link DEFAULT_RUN_TOKEN_QUOTA}. */
58
+ export declare const RUN_TOKEN_QUOTA_INPUT = "max_run_tokens";
59
+ /** The four token components a run is charged for. Cache reads are cheap per
60
+ * token but they are still work performed on the model's behalf, and a
61
+ * runaway loop is visible mostly in cache reads — excluding them would leave
62
+ * the loudest signal of the very failure this bounds outside the count. */
63
+ export interface TokenComponents {
64
+ input?: number | undefined;
65
+ output?: number | undefined;
66
+ cacheRead?: number | undefined;
67
+ cacheWrite?: number | undefined;
68
+ }
69
+ /** Sum the components that count against the quota. Negative and non-finite
70
+ * values are dropped rather than trusted — the numbers come from a provider
71
+ * response, which is not ours. */
72
+ export declare function billableTokens(t: TokenComponents): number;
73
+ export interface RunTokenQuota {
74
+ /** The ceiling, in billable tokens. */
75
+ readonly limit: number;
76
+ /** Billable tokens charged so far across every source. */
77
+ used(): number;
78
+ /**
79
+ * Report a source's running TOTAL (not a delta) and return whether the quota
80
+ * is exhausted as of this observation. `source` must be stable for the life
81
+ * of one accumulator — an attempt id, not a message id.
82
+ */
83
+ observe(source: string, total: TokenComponents | number): boolean;
84
+ /** True once {@link used} has reached the limit. Latches: a quota cannot
85
+ * un-exhaust, so a late-arriving smaller figure can't reopen a stopped run. */
86
+ exhausted(): boolean;
87
+ /** The operator-facing sentence. Stable text — the error renderer and the
88
+ * tests both key on it. */
89
+ gap(): string;
90
+ }
91
+ /**
92
+ * A quota that never trips. Returned when the operator sets the input to `0`,
93
+ * and used by call sites that have no quota to enforce (subagent harnesses,
94
+ * tests) so they need no null checks.
95
+ */
96
+ export declare function unlimitedTokenQuota(): RunTokenQuota;
97
+ /**
98
+ * Create a per-run token quota.
99
+ *
100
+ * `limit <= 0` yields {@link unlimitedTokenQuota} — the explicit opt-out, which
101
+ * an operator has to ask for. There is no accidental path to unlimited.
102
+ */
103
+ export declare function createTokenQuota(limit: number): RunTokenQuota;
104
+ /**
105
+ * Parse the `max_run_tokens` input. A non-negative integer; `0` means unlimited.
106
+ * Anything unparseable returns undefined so the caller applies the default —
107
+ * a typo'd limit must not silently become "no limit".
108
+ *
109
+ * Deliberately stricter than the other numeric input parsers, which use a bare
110
+ * `parseInt`. `parseInt("1e6")` is `1` and `parseInt("5.5")` is `5`: for
111
+ * `max_prs` a prefix-parse is merely surprising, but here it would turn a
112
+ * plausible-looking limit into a one-token quota that aborts every run at the
113
+ * first message. Underscore separators are accepted because a limit of
114
+ * `10_000_000` is far easier to read — and to get right — than `10000000`.
115
+ */
116
+ export declare function parseRunTokenQuota(raw: string | undefined): number | undefined;
117
+ /** Resolve the effective limit from the parsed input, applying the default. */
118
+ export declare function resolveRunTokenQuota(parsed: number | undefined): number;
@@ -0,0 +1,22 @@
1
+ /**
2
+ * The path-decision half of the write-time gates, emitted as source text that
3
+ * both agent runtimes embed into the standalone scripts they drop in the run
4
+ * tmpdir (see action/agents/claudePretoolGate.ts and
5
+ * action/agents/opencodePlugin.ts).
6
+ *
7
+ * It lives in one place because the two runtimes previously derived their base
8
+ * directory differently (the hook payload's `cwd` vs `process.cwd()`), which
9
+ * would silently misalign every glob the moment one of them changed. Sharing
10
+ * the source keeps a single definition of "is this write allowed", and keeps it
11
+ * aligned with the push-time gates in action/mcp/guardrails.ts that re-check
12
+ * the same globs.
13
+ *
14
+ * The emitted code is dependency-free (node builtins only) because the scripts
15
+ * run outside the bundle, with no module resolution available to them.
16
+ */
17
+ /**
18
+ * Shared helper source. Defines `refuseWrite(policy, rawPath, root)` returning
19
+ * a refusal string or null, plus the primitives it needs. Callers supply their
20
+ * own `targetPathOf` because the two runtimes name tool arguments differently.
21
+ */
22
+ export declare const WRITE_GATE_HELPERS_SOURCE: string;
@@ -0,0 +1,79 @@
1
+ /**
2
+ * The write-time counterpart to the push-time path guardrails in
3
+ * `action/mcp/guardrails.ts`.
4
+ *
5
+ * Those gates (`enforceRemediationPaths`, `enforceProtectedPaths`,
6
+ * `assertNoVendoredModuleEdits`) all read `git diff <run-start> HEAD` — so they
7
+ * only fire once a change is already committed and heading for a push. That is
8
+ * fail-safe but LATE: between the write and the push the modified tree is what
9
+ * every subsequent subprocess sees, so a `terraform plan` or a re-scan can run
10
+ * against a file the guardrails would ultimately refuse. This module moves the
11
+ * same allow/deny decision to the moment of the write itself.
12
+ *
13
+ * SCOPE — this covers the agent's file-writing TOOLS, not every possible write.
14
+ * It deliberately does not cover:
15
+ * - the MCP `shell` tool (`cat > f`, `tee`, `sed -i`), which is bounded by
16
+ * the OS sandbox in `action/mcp/shell.ts` rather than by these globs;
17
+ * - the file-emitting MCP tools (`terraform_emit_sarif`, `_emit_evidence`,
18
+ * `_emit_oscal`, `_emit_vex`, `terraform_module_docs`), whose output paths
19
+ * are confined to the workspace by `resolveWithinCwd` but not to
20
+ * `allowed_paths`.
21
+ * Both remain covered by the push-time gates, which still fail closed, so
22
+ * neither is a route to a merged PR — but neither is stopped at write time.
23
+ *
24
+ * The policy is published as a small JSON file in the run's tmpdir rather than
25
+ * baked into the agent's gate script, because `select_mode` sets
26
+ * `toolState.selectedMode` DURING the run (see action/mcp/selectMode.ts) while
27
+ * the gate script is written before the agent launches. The gate re-reads this
28
+ * file on every tool call, so an auto-selected mode is picked up without
29
+ * restarting the agent. No file (or a non-guarded mode) means no restriction —
30
+ * exactly matching the push-time gates, which no-op outside a guarded mode.
31
+ *
32
+ * Both agent runtimes consume it: action/agents/claudePretoolGate.ts (Claude
33
+ * Code `PreToolUse`) and action/agents/opencodePlugin.ts
34
+ * (`tool.execute.before`).
35
+ */
36
+ import { type GuardrailContext } from "#app/mcp/guardrails";
37
+ export declare const WRITE_POLICY_FILENAME: "infraweaver-write-policy.json";
38
+ /**
39
+ * What the gate scripts read. Deliberately a flat, dependency-free shape: the
40
+ * gates are plain `.mjs` with no imports, so anything richer would have to be
41
+ * re-modelled on the other side.
42
+ */
43
+ export interface WritePolicy {
44
+ /** the guarded mode in force — surfaced in the refusal so the model can reason about it. */
45
+ mode: string;
46
+ /**
47
+ * The repo root every glob is resolved against. Carried in the policy rather
48
+ * than derived inside the gates because `main.ts` chdir()s into the `cwd`
49
+ * input for monorepo subdirectories, so neither gate's own process cwd is a
50
+ * safe base — and the push-time globs are always repo-root-relative.
51
+ */
52
+ root: string;
53
+ /** globs a write MUST match (the `allowed_paths` allow-list). */
54
+ allowed: string[];
55
+ /** globs a write must NOT match (the `protected_paths` deny-list). */
56
+ protected: string[];
57
+ /** fetched/vendored module code, which is read-only by the refactor contract. */
58
+ vendored: string[];
59
+ }
60
+ /**
61
+ * Derive the policy for the current run, or `null` when no restriction applies
62
+ * (no mode selected yet, or a mode outside the guarded set — Review, Plan,
63
+ * Assess and friends legitimately write files the Terraform-only allow-list
64
+ * would reject, so gating them would break them).
65
+ */
66
+ export declare function buildWritePolicy(ctx: GuardrailContext): WritePolicy | null;
67
+ export declare function writePolicyPath(tmpdir: string): string;
68
+ /**
69
+ * Publish (or clear) the policy for the gates to read.
70
+ *
71
+ * Written via a temp file + `rename` so a gate that reads concurrently sees
72
+ * either the old policy or the new one, never a half-written file — `rename` is
73
+ * atomic within a filesystem, and the temp file is created in the same tmpdir.
74
+ *
75
+ * Best-effort by design: the push-time guardrails remain the authoritative,
76
+ * fail-closed backstop, so a failure to publish must not abort a run that would
77
+ * otherwise be blocked correctly a few steps later. It is logged, not thrown.
78
+ */
79
+ export declare function refreshWritePolicy(ctx: GuardrailContext): void;
@@ -0,0 +1,67 @@
1
+ /**
2
+ * Single source of truth for the product brand on the engine side.
3
+ *
4
+ * Every user-visible product name, slug, prefix, and brand-derived filename
5
+ * must come from this module — a rebrand (or a white-label build) is then a
6
+ * handful of one-line edits here. The one permitted exception is `action.yml`,
7
+ * which is static YAML and cannot import; src/brand.test.ts asserts it stays
8
+ * in sync with these values.
9
+ *
10
+ * The reviewer subagent name is NOT defined here — it is a separate sub-brand
11
+ * owned by `REVIEWER_AGENT_NAME` in src/agents/reviewer.ts.
12
+ */
13
+ /** Display name — PR bodies, review comments, run summaries, agent labels. */
14
+ export declare const PRODUCT_NAME = "Infraweaver";
15
+ /** Lowercase wordmark — package/dir names, CLI usage strings, slugs. */
16
+ export declare const PRODUCT_SLUG = "infraweaver";
17
+ /** PR comment trigger, e.g. `@infraweaver fix`. */
18
+ export declare const COMMENT_COMMAND = "@infraweaver";
19
+ /** SARIF `driver.name`, CycloneDX VEX tool component, evidence `tool.name` —
20
+ * the emitted artifacts all use the lowercase wordmark. */
21
+ export declare const TOOL_NAME = "infraweaver";
22
+ /** Cloud API token prefix — must match the Cloud UI's `TOKEN_PREFIX`. */
23
+ export declare const TOKEN_PREFIX = "tmnd_";
24
+ /** Prefix for all brand-scoped environment variables. */
25
+ export declare const ENV_PREFIX = "INFRAWEAVER_";
26
+ /** Primary domain — the Cloud API's default host and bearer-credential allowlist root. */
27
+ export declare const PRIMARY_DOMAIN = "infraweaver.dev";
28
+ /** Default Cloud API base URL. */
29
+ export declare const DEFAULT_API_URL = "https://infraweaver.dev";
30
+ /** Docs subdomain, used in in-product setup links. */
31
+ export declare const DOCS_URL = "https://docs.infraweaver.dev";
32
+ /** Status-page subdomain, linked from transient-error messages. */
33
+ export declare const STATUS_URL = "https://status.infraweaver.dev";
34
+ /** Asset-hosting subdomain, used for static images embedded in PR/issue markdown. */
35
+ export declare const UPLOADS_URL = "https://uploads.infraweaver.dev";
36
+ /** Repo config file (YAML). */
37
+ export declare const CONFIG_FILE = ".infraweaver.yml";
38
+ /** Repo config file (`.yaml` spelling variant). */
39
+ export declare const CONFIG_FILE_YAML = ".infraweaver.yaml";
40
+ /** Repo config file (JSON variant). */
41
+ export declare const CONFIG_FILE_JSON = ".infraweaver.json";
42
+ /** Committed baseline of accepted pre-existing findings. */
43
+ export declare const BASELINE_FILE = ".infraweaver.baseline.json";
44
+ /** Committed fix-memory (proven-fix recall) file. */
45
+ export declare const FIX_MEMORY_FILE = ".infraweaver.fix-memory.json";
46
+ /** Repo-committed reviewer learnings file seeded by the server. */
47
+ export declare const LEARNINGS_FILE = "infraweaver-learnings.md";
48
+ /** Rolling PR summary snapshot file. */
49
+ export declare const SUMMARY_FILE = "infraweaver-summary.md";
50
+ /** Signed evidence bundle. */
51
+ export declare const EVIDENCE_FILE = "infraweaver-evidence.json";
52
+ /** Detached signature for the evidence bundle. */
53
+ export declare const EVIDENCE_SIG_FILE = "infraweaver-evidence.json.sig";
54
+ /** SARIF report. */
55
+ export declare const SARIF_FILE = "infraweaver.sarif";
56
+ /** CycloneDX VEX document. */
57
+ export declare const VEX_FILE = "infraweaver-vex.cdx.json";
58
+ /** OSCAL Assessment Results document. */
59
+ export declare const OSCAL_FILE = "infraweaver-oscal.json";
60
+ /** Credential-free cost-analysis artifact committed to the PR (§5.19). */
61
+ export declare const COST_FILE = "cost.md";
62
+ /** The product's GitHub App bot login. */
63
+ export declare const BOT_LOGIN = "infraweaver[bot]";
64
+ /** The bot's GitHub noreply commit-author email. */
65
+ export declare const BOT_EMAIL = "infraweaver[bot]@users.noreply.github.com";
66
+ /** Default GitHub Actions OIDC audience for the product API. */
67
+ export declare const OIDC_AUDIENCE = "infraweaver-api";