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,100 @@
1
+ import type { AgentResult } from "#app/agents/shared";
2
+ import type { MainResult } from "#app/main";
3
+ import { reportProgress } from "#app/mcp/comment";
4
+ import type { ToolContext } from "#app/mcp/server";
5
+ import { log } from "#app/utils/cli";
6
+ import { reportErrorToComment } from "#app/utils/errorReport";
7
+
8
+ export interface HandleAgentResultParams {
9
+ result: AgentResult;
10
+ toolContext: ToolContext;
11
+ silent: boolean | undefined;
12
+ }
13
+
14
+ function getErrorMessage(error: unknown): string {
15
+ return error instanceof Error ? error.message : String(error);
16
+ }
17
+
18
+ export async function handleAgentResult(ctx: HandleAgentResultParams): Promise<MainResult> {
19
+ if (!ctx.result.success) {
20
+ // rendering + posting for the `!success` branch lives in
21
+ // `finalizeSuccessRun` (called immediately before this function) so the
22
+ // BYOK billing-exhausted, hang, and api-key bodies land on a single
23
+ // surface — both for runs with a pre-existing progress comment AND for
24
+ // silent triggers via `createIfMissing`. see #835.
25
+ return {
26
+ success: false,
27
+ error: ctx.result.error || "Agent execution failed",
28
+ output: ctx.result.output!,
29
+ };
30
+ }
31
+
32
+ // IncrementalReview's non-substantive path exits cleanly without
33
+ // submitting any review, so no MCP write tool flips wasUpdated and the
34
+ // strict completion check below would otherwise fail the run. The
35
+ // isReviewMode skip is load-bearing for that path: the agent's exit
36
+ // code is the completion signal, not a progress-comment write.
37
+ // (Review mode that submits a real review now flips wasUpdated via
38
+ // create_pull_request_review, so the skip is redundant for the
39
+ // substantive-review path but kept for symmetry with IncrementalReview.)
40
+ // See plans/review_progress_comment_cleanup_b0120f6c.plan.md.
41
+ const toolState = ctx.toolContext.toolState;
42
+ const mode = toolState.selectedMode;
43
+ const isReviewMode =
44
+ mode === "Review" || mode === "IncrementalReview" || mode === "TerraformCodeReview";
45
+ if (!isReviewMode && !toolState.wasUpdated && toolState.hadProgressComment && !ctx.silent) {
46
+ // the agent exited successfully but never landed a GitHub write — either it
47
+ // answered the mention in raw assistant text (which is never posted, only
48
+ // logged) or a write tool failed (e.g. report_progress hit a 401). salvage
49
+ // by delivering the content we have to the progress comment so the user
50
+ // actually gets the answer instead of a failed run. (finalizeSuccessRun
51
+ // preserves the progress comment whenever wasUpdated is false, so the write
52
+ // lands here.)
53
+ //
54
+ // stop the todo tracker first: on this path the agent used todowrite but
55
+ // never called report_progress, so a pending debounced render could still
56
+ // be queued — draining it keeps it from clobbering the salvaged answer and
57
+ // from holding the event loop open. mirrors ReportProgressTool.
58
+ const tracker = toolState.todoTracker;
59
+ if (tracker) {
60
+ tracker.cancel();
61
+ await tracker.settled();
62
+ }
63
+ // `lastProgressBody` is the body a failed report_progress already assembled
64
+ // (task-list collapsible included), so use it verbatim; otherwise fall back
65
+ // to the agent's final assistant text and append the collapsible the way
66
+ // report_progress would.
67
+ let salvage = toolState.lastProgressBody?.trim();
68
+ if (!salvage) {
69
+ const output = ctx.result.output?.trim();
70
+ const collapsible = tracker?.renderCollapsible({ completeInProgress: true });
71
+ salvage = output && collapsible ? `${output}\n\n${collapsible}` : output;
72
+ }
73
+ if (salvage) {
74
+ try {
75
+ await reportProgress(ctx.toolContext, { body: salvage });
76
+ log.success("Task complete.");
77
+ return { success: true, output: ctx.result.output || "" };
78
+ } catch (writeError) {
79
+ // the write itself is failing (auth/permissions) — surface THAT, not
80
+ // the generic "no progress" message, so the real cause isn't masked.
81
+ const error = `failed to deliver agent result: ${getErrorMessage(writeError)}`;
82
+ await reportErrorToComment({ toolState, error, title: "Error" }).catch(() => {});
83
+ return { success: false, error, output: ctx.result.output || "" };
84
+ }
85
+ }
86
+
87
+ const error = ctx.result.error || "agent completed without reporting progress";
88
+ try {
89
+ await reportErrorToComment({ toolState, error, title: "Error" });
90
+ } catch {}
91
+ return { success: false, error, output: ctx.result.output || "" };
92
+ }
93
+
94
+ log.success("Task complete.");
95
+
96
+ return {
97
+ success: true,
98
+ output: ctx.result.output || "",
99
+ };
100
+ }
@@ -0,0 +1,276 @@
1
+ import { PRODUCT_NAME, TOKEN_PREFIX } from "#app/brand";
2
+ import type { PushPermission, ShellPermission } from "#app/external";
3
+ import { apiFetch } from "#app/utils/apiFetch";
4
+ import { isBackendConfigured } from "#app/utils/apiUrl";
5
+ import { log } from "#app/utils/cli";
6
+ import type { RepoContext } from "#app/utils/github";
7
+
8
+ export interface Mode {
9
+ id: string;
10
+ name: string;
11
+ description: string;
12
+ prompt: string;
13
+ }
14
+
15
+ /**
16
+ * server-parsed TOC entry for `Repo.learnings`. depth is 1-6 (h1-h6),
17
+ * line numbers are 1-indexed against the raw body. computed by
18
+ * `parseLearningsHeadings` in `utils/learningsToc.ts` (server side) and
19
+ * shipped over the run-context JSON boundary; the canonical declaration
20
+ * lives there. duplicated here because the action runtime can't reach
21
+ * across into the proprietary root-level codebase, and the JSON wire
22
+ * means typecheck can't enforce shape equality across both sides.
23
+ */
24
+ export interface LearningsHeading {
25
+ depth: 1 | 2 | 3 | 4 | 5 | 6;
26
+ title: string;
27
+ startLine: number;
28
+ endLine: number;
29
+ }
30
+
31
+ export interface RepoSettings {
32
+ model: string | null;
33
+ modes: Mode[];
34
+ setupScript: string | null;
35
+ postCheckoutScript: string | null;
36
+ prepushScript: string | null;
37
+ stopScript: string | null;
38
+ push: PushPermission;
39
+ shell: ShellPermission;
40
+ prApproveEnabled: boolean;
41
+ modeInstructions: Record<string, string>;
42
+ learnings: string | null;
43
+ learningsHeadings: LearningsHeading[];
44
+ envAllowlist: string | null;
45
+ }
46
+
47
+ /**
48
+ * Account-level billing plan. Orthogonal to repo-level OSS status. Mirrors
49
+ * the server's `AccountPlan` in `utils/billing.ts`. `"none"` = free tier,
50
+ * `"payg"` = card on file / pay-as-you-go.
51
+ */
52
+ export type AccountPlan = "none" | "payg";
53
+
54
+ /**
55
+ * Cloud-managed module credentials for this repo, entered once in the dashboard's
56
+ * Refactor dialog and sealed at rest. Delivered over the authenticated, repo-scoped
57
+ * run-context call (never the GitHub `repository_dispatch` payload). Used by the
58
+ * engine only as a FALLBACK for the matching action inputs — an explicit
59
+ * `module_fetch_token` / `registry_token` input always wins. Both fields optional;
60
+ * absent on OSS / unmanaged runs or when none were stored.
61
+ */
62
+ export interface ModuleCredentials {
63
+ /** read-only PAT for a private cross-repo `git::` module (refactor b.1). */
64
+ moduleFetchToken?: string;
65
+ /** bearer token for a private Terraform registry module (refactor b.4). */
66
+ registryToken?: string;
67
+ }
68
+
69
+ export interface RunContext {
70
+ settings: RepoSettings;
71
+ apiToken: string;
72
+ oss: boolean;
73
+ plan: AccountPlan;
74
+ /**
75
+ * The maintained-pack control ids this run's ORG marked MANDATORY in the Cloud
76
+ * dashboard (the "required controls" policy). Org-scoped by construction — the
77
+ * run-context call is authenticated to exactly one org + repo, so a run only
78
+ * ever receives its own org's policy. Merged into the gate's `required_controls`
79
+ * so an open finding on any of these fails CI regardless of severity. `[]` for
80
+ * OSS / unmanaged runs.
81
+ */
82
+ requiredControls: string[];
83
+ /** §5.12 the org's proven-fix library — patterns (finding-type → proven
84
+ * transformation) captured from prior `✗→✓` proofs across the org's fleet,
85
+ * served so this run can offer them as priors for matching finding-types. An
86
+ * untrusted blob coerced engine-side (utils/fixMemory `coerceLibrary`). `[]`
87
+ * for OSS / unentitled / unconfigured runs. */
88
+ provenFixes: unknown[];
89
+ /** G7 the org's fleet-wide dismissal record — which rules this org has waived,
90
+ * across how many DISTINCT repos, with the reasons given. A SURFACING signal
91
+ * only: it reorders the low-severity tail and can neither suppress a finding
92
+ * nor change a verdict (see `terraform/noiseProfile`). An untrusted blob
93
+ * coerced engine-side, same posture as {@link RunContext.provenFixes}. `[]`
94
+ * for OSS / unentitled / unconfigured runs. */
95
+ noiseProfile: unknown[];
96
+ /** TC-2.2 the org's fleet-wide record of provider-upgrade transforms that have
97
+ * already planned cleanly elsewhere — counters keyed by transform id, never
98
+ * another repo's configuration. Annotates a detected transform with how widely
99
+ * it has been proven. An untrusted blob coerced engine-side, same posture as
100
+ * {@link RunContext.provenFixes}. `[]` for OSS / unentitled / unconfigured runs. */
101
+ provenTransforms: unknown[];
102
+ /** Cloud-managed module credentials (see {@link ModuleCredentials}); undefined
103
+ * when none are stored for this repo. */
104
+ moduleCredentials?: ModuleCredentials;
105
+ }
106
+
107
+ const defaultSettings: RepoSettings = {
108
+ model: null,
109
+ modes: [],
110
+ setupScript: null,
111
+ postCheckoutScript: null,
112
+ prepushScript: null,
113
+ stopScript: null,
114
+ push: "restricted",
115
+ shell: "restricted",
116
+ prApproveEnabled: false,
117
+ modeInstructions: {},
118
+ learnings: null,
119
+ learningsHeadings: [],
120
+ envAllowlist: null,
121
+ };
122
+
123
+ const defaultRunContext: RunContext = {
124
+ settings: defaultSettings,
125
+ apiToken: "",
126
+ oss: false,
127
+ plan: "none",
128
+ requiredControls: [],
129
+ provenFixes: [],
130
+ noiseProfile: [],
131
+ provenTransforms: [],
132
+ };
133
+
134
+ function fellBackToDefaults(reason: string): RunContext {
135
+ if (isBackendConfigured()) {
136
+ log.warning(
137
+ `» repo settings unavailable (${reason}); using defaults — Cloud policy (required controls, modes, model) is NOT applied for this run`,
138
+ );
139
+ }
140
+ return defaultRunContext;
141
+ }
142
+
143
+ /**
144
+ * Actionable hint for a 401/403 from the run-context call — by far the most common
145
+ * setup mistake. A Cloud-connected workflow authenticates to Infraweaver Cloud one of
146
+ * two ways: the tokenless GitHub App path (the engine mints a GitHub Actions OIDC
147
+ * token, which needs `permissions: id-token: write`), or an org token passed as the
148
+ * `api_token` input. With neither, Cloud only sees the workflow's GitHub job token —
149
+ * which it can't use — and rejects the run, so reporting + learnings silently no-op.
150
+ * The message is tailored to whether an OIDC token was even available this run, so we
151
+ * don't tell someone to add a permission they already granted.
152
+ */
153
+ function cloudAuthHint(status: number, oidcToken: string | undefined): string {
154
+ if (!oidcToken) {
155
+ return (
156
+ `» ${PRODUCT_NAME} Cloud rejected this run (HTTP ${status}) and NO GitHub Actions OIDC token was ` +
157
+ `available. To report via the ${PRODUCT_NAME} GitHub App (tokenless), add \`id-token: write\` to this ` +
158
+ `workflow's \`permissions:\` block — no secret needed. Or pass an \`api_token\` input (a ${TOKEN_PREFIX} org ` +
159
+ "token from the Cloud Tokens page) to use the org-token path instead. Until then this run can't " +
160
+ "reach Cloud and runs as pure OSS (results stay in CI)."
161
+ );
162
+ }
163
+ return (
164
+ `» ${PRODUCT_NAME} Cloud rejected this run's GitHub OIDC identity (HTTP ${status}). The OIDC token was ` +
165
+ `sent, so \`id-token: write\` is set correctly — check instead that the ${PRODUCT_NAME} GitHub App is ` +
166
+ "installed on this repository's owner, and that `GITHUB_OIDC_AUDIENCE` (if you set it) matches " +
167
+ `the value configured in ${PRODUCT_NAME} Cloud.`
168
+ );
169
+ }
170
+
171
+ /** Coerce the untrusted run-context `moduleCredentials` blob into the typed shape,
172
+ * keeping only non-empty string values. Returns undefined when nothing usable is
173
+ * present (so the engine treats it as "no managed credentials"). */
174
+ export function parseModuleCredentials(
175
+ raw: { moduleFetchToken?: unknown; registryToken?: unknown } | undefined,
176
+ ): ModuleCredentials | undefined {
177
+ if (!raw || typeof raw !== "object") return undefined;
178
+ const out: ModuleCredentials = {};
179
+ if (typeof raw.moduleFetchToken === "string" && raw.moduleFetchToken.trim())
180
+ out.moduleFetchToken = raw.moduleFetchToken;
181
+ if (typeof raw.registryToken === "string" && raw.registryToken.trim())
182
+ out.registryToken = raw.registryToken;
183
+ return out.moduleFetchToken || out.registryToken ? out : undefined;
184
+ }
185
+
186
+ /**
187
+ * fetch run context from Infraweaver API
188
+ * returns settings + API token for subsequent calls
189
+ * returns defaults if fetch fails (warns when a backend was configured)
190
+ */
191
+ export async function fetchRunContext(params: {
192
+ token: string;
193
+ repoContext: RepoContext;
194
+ oidcToken?: string | undefined;
195
+ }): Promise<RunContext> {
196
+ const timeoutMs = 30000;
197
+ const controller = new AbortController();
198
+ const timeoutId = setTimeout(() => controller.abort(), timeoutMs);
199
+
200
+ try {
201
+ const headers: Record<string, string> = {
202
+ Authorization: `Bearer ${params.token}`,
203
+ };
204
+ if (params.oidcToken) {
205
+ headers["X-GitHub-OIDC-Token"] = params.oidcToken;
206
+ }
207
+
208
+ const response = await apiFetch({
209
+ path: `/api/repo/${params.repoContext.owner}/${params.repoContext.name}/run-context`,
210
+ headers,
211
+ signal: controller.signal,
212
+ });
213
+
214
+ clearTimeout(timeoutId);
215
+
216
+ if (!response.ok) {
217
+ if (
218
+ (response.status === 401 || response.status === 403) &&
219
+ isBackendConfigured()
220
+ ) {
221
+ log.warning(cloudAuthHint(response.status, params.oidcToken));
222
+ }
223
+ return fellBackToDefaults(`run-context HTTP ${response.status}`);
224
+ }
225
+
226
+ const data = (await response.json()) as {
227
+ settings: RepoSettings | null;
228
+ apiToken: string;
229
+ oss?: boolean;
230
+ plan?: AccountPlan;
231
+ requiredControls?: string[];
232
+ provenFixes?: unknown[];
233
+ provenTransforms?: unknown[];
234
+ noiseProfile?: unknown[];
235
+ moduleCredentials?: {
236
+ moduleFetchToken?: unknown;
237
+ registryToken?: unknown;
238
+ };
239
+ } | null;
240
+
241
+ if (data === null) {
242
+ return fellBackToDefaults("run-context returned no body");
243
+ }
244
+
245
+ const moduleCredentials = parseModuleCredentials(data.moduleCredentials);
246
+ return {
247
+ settings: {
248
+ ...defaultSettings,
249
+ ...data.settings,
250
+ modes: data.settings?.modes ?? [],
251
+ setupScript: data.settings?.setupScript ?? null,
252
+ postCheckoutScript: data.settings?.postCheckoutScript ?? null,
253
+ prepushScript: data.settings?.prepushScript ?? null,
254
+ stopScript: data.settings?.stopScript ?? null,
255
+ learningsHeadings: data.settings?.learningsHeadings ?? [],
256
+ },
257
+ apiToken: data.apiToken,
258
+ oss: data.oss ?? false,
259
+ plan: data.plan ?? "none",
260
+ requiredControls: Array.isArray(data.requiredControls)
261
+ ? data.requiredControls
262
+ : [],
263
+ provenFixes: Array.isArray(data.provenFixes) ? data.provenFixes : [],
264
+ provenTransforms: Array.isArray(data.provenTransforms)
265
+ ? data.provenTransforms
266
+ : [],
267
+ noiseProfile: Array.isArray(data.noiseProfile) ? data.noiseProfile : [],
268
+ ...(moduleCredentials ? { moduleCredentials } : {}),
269
+ };
270
+ } catch (err) {
271
+ clearTimeout(timeoutId);
272
+ return fellBackToDefaults(
273
+ err instanceof Error ? err.message : "request failed",
274
+ );
275
+ }
276
+ }
@@ -0,0 +1,121 @@
1
+ import * as core from "@actions/core";
2
+ import type { Octokit } from "@octokit/rest";
3
+ import { PRODUCT_NAME } from "#app/brand";
4
+ import { cloudOidcAudience } from "#app/utils/apiUrl";
5
+ import { log } from "#app/utils/cli";
6
+ import { type OctokitWithPlugins, parseRepoContext } from "#app/utils/github";
7
+ import { isTransientServerError, retry } from "#app/utils/retry";
8
+ import {
9
+ type AccountPlan,
10
+ fetchRunContext,
11
+ type ModuleCredentials,
12
+ type RepoSettings,
13
+ } from "#app/utils/runContext";
14
+ import packageJson from "#package.json" with { type: "json" };
15
+
16
+ export interface RunContextData {
17
+ repo: {
18
+ owner: string;
19
+ name: string;
20
+ data: Awaited<ReturnType<Octokit["repos"]["get"]>>["data"];
21
+ };
22
+ repoSettings: RepoSettings;
23
+ apiToken: string;
24
+ oss: boolean;
25
+ plan: AccountPlan;
26
+ /** The org's mandatory crosswalk-pack control ids (Cloud "required controls"
27
+ * policy), org-scoped via the authenticated run-context. Merged into the gate. */
28
+ requiredControls: string[];
29
+ /** §5.12 the org's proven-fix library (untrusted blob; coerced engine-side).
30
+ * `[]` for OSS / unentitled runs. */
31
+ provenFixes: unknown[];
32
+ /** TC-2.2 the org's proven provider-upgrade transforms (untrusted blob;
33
+ * coerced engine-side). Counters only — never another repo's configuration.
34
+ * `[]` for OSS / unentitled runs. */
35
+ provenTransforms: unknown[];
36
+ /** G7 the org's fleet-wide dismissal record (untrusted blob; coerced
37
+ * engine-side). Reorders surfacing only — never suppresses. `[]` for OSS /
38
+ * unentitled runs. */
39
+ noiseProfile: unknown[];
40
+ /** Cloud-managed module credentials for this repo (a read-only module-repo PAT /
41
+ * a private-registry token), entered in the dashboard's Refactor dialog. A
42
+ * fallback for the matching action inputs; an explicit input still wins.
43
+ * undefined when none are stored. */
44
+ moduleCredentials?: ModuleCredentials;
45
+ }
46
+
47
+ interface ResolveRunContextDataParams {
48
+ octokit: OctokitWithPlugins;
49
+ token: string;
50
+ }
51
+
52
+ /**
53
+ * initialize run context data: parse context, fetch repo info and settings
54
+ */
55
+ export async function resolveRunContextData(
56
+ params: ResolveRunContextDataParams,
57
+ ): Promise<RunContextData> {
58
+ log.info(`» running ${PRODUCT_NAME} v${packageJson.version}...`);
59
+
60
+ const repoContext = parseRepoContext();
61
+
62
+ // The org-token reporting path authenticates the run to Cloud with an `api_token`.
63
+ // run-context is the FIRST Cloud call and happens before payload resolution, so
64
+ // read the input here and use it as the run-context Bearer — the GitHub job token
65
+ // is no good to Cloud, so without this the org-token path would 401 on run-context
66
+ // (and silently lose org policy/settings) even though its end-of-run report works.
67
+ // The tokenless GitHub App (OIDC) path is the alternative when there is no
68
+ // api_token. Mask it the moment we read it.
69
+ const apiToken = core.getInput("api_token") || undefined;
70
+ if (apiToken) core.setSecret(apiToken);
71
+
72
+ let oidcToken: string | undefined;
73
+ try {
74
+ oidcToken = await core.getIDToken(cloudOidcAudience());
75
+ } catch {
76
+ // OIDC not available (local dev, non-actions environment, fork PRs)
77
+ }
78
+
79
+ const [repoResponse, runContext] = await Promise.all([
80
+ // This runs at run startup, BEFORE the clean-error surface in main.ts, so a
81
+ // transient GitHub 5xx here would reject the Promise.all and hard-crash the
82
+ // run (while its sibling fetchRunContext degrades to defaults). Retry the
83
+ // transient blip; a deterministic 4xx (e.g. 404 repo) still fails fast. #999.
84
+ retry(() => params.octokit.repos.get({ owner: repoContext.owner, repo: repoContext.name }), {
85
+ delaysMs: [100, 500],
86
+ shouldRetry: isTransientServerError,
87
+ label: "repos.get",
88
+ }),
89
+ // Cloud bearer = api_token when set, else the job token (which only authenticates
90
+ // via the OIDC header on the App path). octokit keeps the job token for GitHub.
91
+ fetchRunContext({ token: apiToken ?? params.token, repoContext, oidcToken }),
92
+ ]);
93
+
94
+ // Mask any Cloud-managed module credentials the moment they arrive — they are
95
+ // real secrets (a PAT / registry token) and must never surface in a log line.
96
+ if (runContext.moduleCredentials) {
97
+ for (const v of [
98
+ runContext.moduleCredentials.moduleFetchToken,
99
+ runContext.moduleCredentials.registryToken,
100
+ ]) {
101
+ if (v) core.setSecret(v);
102
+ }
103
+ }
104
+
105
+ return {
106
+ repo: {
107
+ owner: repoContext.owner,
108
+ name: repoContext.name,
109
+ data: repoResponse.data,
110
+ },
111
+ repoSettings: runContext.settings,
112
+ apiToken: runContext.apiToken,
113
+ oss: runContext.oss,
114
+ plan: runContext.plan,
115
+ requiredControls: runContext.requiredControls,
116
+ provenFixes: runContext.provenFixes,
117
+ provenTransforms: runContext.provenTransforms,
118
+ noiseProfile: runContext.noiseProfile,
119
+ ...(runContext.moduleCredentials ? { moduleCredentials: runContext.moduleCredentials } : {}),
120
+ };
121
+ }