terramend 0.2.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 (406) hide show
  1. package/LICENSE +661 -0
  2. package/README.md +145 -0
  3. package/dist/agents/claude.d.ts +73 -0
  4. package/dist/agents/claudePretoolGate.d.ts +99 -0
  5. package/dist/agents/gateServer.d.ts +7 -0
  6. package/dist/agents/index.d.ts +6 -0
  7. package/dist/agents/nativeFsDenies.d.ts +28 -0
  8. package/dist/agents/opencode.d.ts +231 -0
  9. package/dist/agents/opencodePlugin.d.ts +85 -0
  10. package/dist/agents/opencodeShared.d.ts +40 -0
  11. package/dist/agents/postRun.d.ts +132 -0
  12. package/dist/agents/reviewer.d.ts +38 -0
  13. package/dist/agents/sessionLabeler.d.ts +97 -0
  14. package/dist/agents/shared.d.ts +189 -0
  15. package/dist/agents/subagentModels.d.ts +19 -0
  16. package/dist/agents/subagentToolGates.d.ts +55 -0
  17. package/dist/cli.mjs +197426 -0
  18. package/dist/external.d.ts +227 -0
  19. package/dist/index.d.ts +6 -0
  20. package/dist/index.js +196783 -0
  21. package/dist/internal/index.d.ts +18 -0
  22. package/dist/internal.js +1714 -0
  23. package/dist/lifecycle.d.ts +2 -0
  24. package/dist/main.d.ts +8 -0
  25. package/dist/mcp/arkConfig.d.ts +1 -0
  26. package/dist/mcp/checkSuite.d.ts +25 -0
  27. package/dist/mcp/checkout.d.ts +77 -0
  28. package/dist/mcp/comment.d.ts +119 -0
  29. package/dist/mcp/commitInfo.d.ts +9 -0
  30. package/dist/mcp/crosswalk.d.ts +105 -0
  31. package/dist/mcp/dependencies.d.ts +8 -0
  32. package/dist/mcp/geminiSanitizer.d.ts +28 -0
  33. package/dist/mcp/git.d.ts +46 -0
  34. package/dist/mcp/guardrails.d.ts +104 -0
  35. package/dist/mcp/issue.d.ts +18 -0
  36. package/dist/mcp/issueComments.d.ts +9 -0
  37. package/dist/mcp/issueEvents.d.ts +9 -0
  38. package/dist/mcp/issueInfo.d.ts +9 -0
  39. package/dist/mcp/labels.d.ts +12 -0
  40. package/dist/mcp/localContext.d.ts +19 -0
  41. package/dist/mcp/moduleExtraction.d.ts +71 -0
  42. package/dist/mcp/moduleTests.d.ts +104 -0
  43. package/dist/mcp/modules.d.ts +179 -0
  44. package/dist/mcp/output.d.ts +12 -0
  45. package/dist/mcp/pathSafety.d.ts +14 -0
  46. package/dist/mcp/policy.d.ts +48 -0
  47. package/dist/mcp/pr.d.ts +49 -0
  48. package/dist/mcp/prInfo.d.ts +9 -0
  49. package/dist/mcp/providerSchema.d.ts +50 -0
  50. package/dist/mcp/review.d.ts +199 -0
  51. package/dist/mcp/reviewComments.d.ts +178 -0
  52. package/dist/mcp/roots.d.ts +58 -0
  53. package/dist/mcp/scope.d.ts +15 -0
  54. package/dist/mcp/selectMode.d.ts +18 -0
  55. package/dist/mcp/server.d.ts +48 -0
  56. package/dist/mcp/shared.d.ts +47 -0
  57. package/dist/mcp/shell.d.ts +37 -0
  58. package/dist/mcp/staleFix.d.ts +51 -0
  59. package/dist/mcp/terraform/cost.d.ts +55 -0
  60. package/dist/mcp/terraform/currency.d.ts +94 -0
  61. package/dist/mcp/terraform/decisions.d.ts +178 -0
  62. package/dist/mcp/terraform/findings.d.ts +75 -0
  63. package/dist/mcp/terraform/plan.d.ts +157 -0
  64. package/dist/mcp/terraform/scanners.d.ts +131 -0
  65. package/dist/mcp/terraform/tools.d.ts +63 -0
  66. package/dist/mcp/terraform/types.d.ts +172 -0
  67. package/dist/mcp/terraform.d.ts +22 -0
  68. package/dist/mcp/terratest.d.ts +83 -0
  69. package/dist/mcp/upload.d.ts +6 -0
  70. package/dist/models.d.ts +171 -0
  71. package/dist/modes.d.ts +26 -0
  72. package/dist/prep/index.d.ts +7 -0
  73. package/dist/prep/installNodeDependencies.d.ts +2 -0
  74. package/dist/prep/installPythonDependencies.d.ts +2 -0
  75. package/dist/prep/types.d.ts +31 -0
  76. package/dist/reviewQuality.d.ts +64 -0
  77. package/dist/skills/terraform-best-practices/SKILL.md +369 -0
  78. package/dist/toolState.d.ts +135 -0
  79. package/dist/utils/activity.d.ts +40 -0
  80. package/dist/utils/agent.d.ts +20 -0
  81. package/dist/utils/agentHangReport.d.ts +38 -0
  82. package/dist/utils/apiFetch.d.ts +19 -0
  83. package/dist/utils/apiKeys.d.ts +41 -0
  84. package/dist/utils/apiUrl.d.ts +20 -0
  85. package/dist/utils/assets.d.ts +8 -0
  86. package/dist/utils/billingErrors.d.ts +85 -0
  87. package/dist/utils/body.d.ts +34 -0
  88. package/dist/utils/buildTerramendFooter.d.ts +25 -0
  89. package/dist/utils/byokFallback.d.ts +85 -0
  90. package/dist/utils/claudeSubscription.d.ts +30 -0
  91. package/dist/utils/cli.d.ts +10 -0
  92. package/dist/utils/codexHome.d.ts +29 -0
  93. package/dist/utils/codexOAuth.d.ts +60 -0
  94. package/dist/utils/diffCoverage.d.ts +63 -0
  95. package/dist/utils/errorReport.d.ts +17 -0
  96. package/dist/utils/exitHandler.d.ts +8 -0
  97. package/dist/utils/fixDoubleEscapedString.d.ts +1 -0
  98. package/dist/utils/gitAuth.d.ts +84 -0
  99. package/dist/utils/gitAuthServer.d.ts +24 -0
  100. package/dist/utils/github.d.ts +78 -0
  101. package/dist/utils/globals.d.ts +3 -0
  102. package/dist/utils/install.d.ts +60 -0
  103. package/dist/utils/instructions.d.ts +48 -0
  104. package/dist/utils/leapingComment.d.ts +11 -0
  105. package/dist/utils/learnings.d.ts +62 -0
  106. package/dist/utils/learningsTruncate.d.ts +25 -0
  107. package/dist/utils/lifecycle.d.ts +57 -0
  108. package/dist/utils/log.d.ts +111 -0
  109. package/dist/utils/normalizeEnv.d.ts +30 -0
  110. package/dist/utils/openCodeModels.d.ts +11 -0
  111. package/dist/utils/overrides.d.ts +40 -0
  112. package/dist/utils/packageManager.d.ts +49 -0
  113. package/dist/utils/patchWorkflowRunFields.d.ts +29 -0
  114. package/dist/utils/payload.d.ts +105 -0
  115. package/dist/utils/prSummary.d.ts +61 -0
  116. package/dist/utils/progressComment.d.ts +146 -0
  117. package/dist/utils/providerErrors.d.ts +31 -0
  118. package/dist/utils/rangeDiff.d.ts +51 -0
  119. package/dist/utils/remediationCommand.d.ts +55 -0
  120. package/dist/utils/retry.d.ts +13 -0
  121. package/dist/utils/reviewCleanup.d.ts +14 -0
  122. package/dist/utils/run.d.ts +9 -0
  123. package/dist/utils/runContext.d.ts +60 -0
  124. package/dist/utils/runContextData.d.ts +23 -0
  125. package/dist/utils/runErrorRenderer.d.ts +64 -0
  126. package/dist/utils/runLifecycle.d.ts +86 -0
  127. package/dist/utils/runStartupLog.d.ts +15 -0
  128. package/dist/utils/secrets.d.ts +22 -0
  129. package/dist/utils/setup.d.ts +90 -0
  130. package/dist/utils/shell.d.ts +32 -0
  131. package/dist/utils/skills.d.ts +10 -0
  132. package/dist/utils/subprocess.d.ts +80 -0
  133. package/dist/utils/terraformMcp.d.ts +42 -0
  134. package/dist/utils/time.d.ts +15 -0
  135. package/dist/utils/timer.d.ts +23 -0
  136. package/dist/utils/todoTracking.d.ts +16 -0
  137. package/dist/utils/token.d.ts +39 -0
  138. package/dist/utils/version.d.ts +2 -0
  139. package/dist/utils/versioning.d.ts +7 -0
  140. package/dist/utils/vertex.d.ts +16 -0
  141. package/dist/utils/workflow.d.ts +13 -0
  142. package/package.json +119 -0
  143. package/src/agents/claude.test.ts +1016 -0
  144. package/src/agents/claude.ts +1246 -0
  145. package/src/agents/claudePretoolGate.test.ts +28 -0
  146. package/src/agents/claudePretoolGate.ts +173 -0
  147. package/src/agents/gateServer.test.ts +204 -0
  148. package/src/agents/gateServer.ts +124 -0
  149. package/src/agents/index.ts +10 -0
  150. package/src/agents/nativeFsDenies.ts +82 -0
  151. package/src/agents/opencode.test.ts +1440 -0
  152. package/src/agents/opencode.ts +1312 -0
  153. package/src/agents/opencodePlugin.ts +222 -0
  154. package/src/agents/opencodeShared.test.ts +34 -0
  155. package/src/agents/opencodeShared.ts +121 -0
  156. package/src/agents/postRun.test.ts +549 -0
  157. package/src/agents/postRun.ts +535 -0
  158. package/src/agents/reviewer.ts +104 -0
  159. package/src/agents/sessionLabeler.test.ts +247 -0
  160. package/src/agents/sessionLabeler.ts +178 -0
  161. package/src/agents/shared.test.ts +76 -0
  162. package/src/agents/shared.ts +292 -0
  163. package/src/agents/subagentModels.test.ts +113 -0
  164. package/src/agents/subagentModels.ts +40 -0
  165. package/src/agents/subagentRegistration.test.ts +41 -0
  166. package/src/agents/subagentToolGates.ts +114 -0
  167. package/src/cli.test.ts +129 -0
  168. package/src/cli.ts +105 -0
  169. package/src/commands/gha.test.ts +192 -0
  170. package/src/commands/gha.ts +188 -0
  171. package/src/commands/mcp.ts +122 -0
  172. package/src/config.ts +1 -0
  173. package/src/entry.ts +7 -0
  174. package/src/entryPost.stdlibOnly.test.ts +109 -0
  175. package/src/entryPost.ts +99 -0
  176. package/src/external.test.ts +16 -0
  177. package/src/external.ts +302 -0
  178. package/src/index.ts +11 -0
  179. package/src/internal/index.ts +71 -0
  180. package/src/lifecycle.ts +2 -0
  181. package/src/main.test.ts +873 -0
  182. package/src/main.ts +712 -0
  183. package/src/mcp/__fixtures__/terramend-scratch-pr-49-review-3485940013.json +110 -0
  184. package/src/mcp/__fixtures__/terramend-scratch-pr-64-review-3531000326.json +14 -0
  185. package/src/mcp/__fixtures__/terramend-test-repo-pr-1.diff.json +67 -0
  186. package/src/mcp/__snapshots__/checkout.test.ts.snap +109 -0
  187. package/src/mcp/__snapshots__/reviewComments.test.ts.snap +71 -0
  188. package/src/mcp/arkConfig.ts +7 -0
  189. package/src/mcp/checkSuite.test.ts +245 -0
  190. package/src/mcp/checkSuite.ts +255 -0
  191. package/src/mcp/checkout.test.ts +752 -0
  192. package/src/mcp/checkout.ts +886 -0
  193. package/src/mcp/comment.test.ts +772 -0
  194. package/src/mcp/comment.ts +582 -0
  195. package/src/mcp/commitInfo.test.ts +127 -0
  196. package/src/mcp/commitInfo.ts +61 -0
  197. package/src/mcp/crosswalk.test.ts +106 -0
  198. package/src/mcp/crosswalk.ts +339 -0
  199. package/src/mcp/dependencies.test.ts +309 -0
  200. package/src/mcp/dependencies.ts +189 -0
  201. package/src/mcp/geminiSanitizer.test.ts +287 -0
  202. package/src/mcp/geminiSanitizer.ts +207 -0
  203. package/src/mcp/git.test.ts +1083 -0
  204. package/src/mcp/git.ts +890 -0
  205. package/src/mcp/guardrails.test.ts +705 -0
  206. package/src/mcp/guardrails.ts +465 -0
  207. package/src/mcp/issue.test.ts +113 -0
  208. package/src/mcp/issue.ts +73 -0
  209. package/src/mcp/issueComments.test.ts +69 -0
  210. package/src/mcp/issueComments.ts +48 -0
  211. package/src/mcp/issueEvents.test.ts +134 -0
  212. package/src/mcp/issueEvents.ts +100 -0
  213. package/src/mcp/issueInfo.test.ts +104 -0
  214. package/src/mcp/issueInfo.ts +72 -0
  215. package/src/mcp/labels.test.ts +52 -0
  216. package/src/mcp/labels.ts +34 -0
  217. package/src/mcp/localContext.ts +28 -0
  218. package/src/mcp/localServer.test.ts +75 -0
  219. package/src/mcp/localServer.ts +131 -0
  220. package/src/mcp/moduleExtraction.test.ts +261 -0
  221. package/src/mcp/moduleExtraction.ts +313 -0
  222. package/src/mcp/moduleTests.test.ts +269 -0
  223. package/src/mcp/moduleTests.ts +421 -0
  224. package/src/mcp/modules.test.ts +640 -0
  225. package/src/mcp/modules.ts +696 -0
  226. package/src/mcp/output.test.ts +96 -0
  227. package/src/mcp/output.ts +70 -0
  228. package/src/mcp/pathSafety.test.ts +44 -0
  229. package/src/mcp/pathSafety.ts +28 -0
  230. package/src/mcp/policy.test.ts +282 -0
  231. package/src/mcp/policy.ts +199 -0
  232. package/src/mcp/pr.test.ts +387 -0
  233. package/src/mcp/pr.ts +194 -0
  234. package/src/mcp/prInfo.test.ts +96 -0
  235. package/src/mcp/prInfo.ts +91 -0
  236. package/src/mcp/providerSchema.test.ts +85 -0
  237. package/src/mcp/providerSchema.ts +175 -0
  238. package/src/mcp/review.test.ts +936 -0
  239. package/src/mcp/review.ts +923 -0
  240. package/src/mcp/reviewComments.test.ts +549 -0
  241. package/src/mcp/reviewComments.ts +896 -0
  242. package/src/mcp/roots.test.ts +175 -0
  243. package/src/mcp/roots.ts +217 -0
  244. package/src/mcp/scope.test.ts +59 -0
  245. package/src/mcp/scope.ts +65 -0
  246. package/src/mcp/security.test.ts +720 -0
  247. package/src/mcp/selectMode.test.ts +210 -0
  248. package/src/mcp/selectMode.ts +181 -0
  249. package/src/mcp/server.test.ts +292 -0
  250. package/src/mcp/server.ts +403 -0
  251. package/src/mcp/shared.ts +100 -0
  252. package/src/mcp/shell.test.ts +520 -0
  253. package/src/mcp/shell.ts +505 -0
  254. package/src/mcp/staleFix.test.ts +237 -0
  255. package/src/mcp/staleFix.ts +277 -0
  256. package/src/mcp/terraform/cost.ts +163 -0
  257. package/src/mcp/terraform/currency.test.ts +338 -0
  258. package/src/mcp/terraform/currency.ts +336 -0
  259. package/src/mcp/terraform/decisions.ts +527 -0
  260. package/src/mcp/terraform/findings.ts +333 -0
  261. package/src/mcp/terraform/plan.ts +348 -0
  262. package/src/mcp/terraform/scanners.ts +809 -0
  263. package/src/mcp/terraform/tools.test.ts +1071 -0
  264. package/src/mcp/terraform/tools.ts +908 -0
  265. package/src/mcp/terraform/types.ts +305 -0
  266. package/src/mcp/terraform.test.ts +1957 -0
  267. package/src/mcp/terraform.ts +23 -0
  268. package/src/mcp/terratest.test.ts +105 -0
  269. package/src/mcp/terratest.ts +196 -0
  270. package/src/mcp/toolFiltering.test.ts +85 -0
  271. package/src/mcp/upload.test.ts +180 -0
  272. package/src/mcp/upload.ts +112 -0
  273. package/src/models.test.ts +300 -0
  274. package/src/models.ts +708 -0
  275. package/src/modes.test.ts +107 -0
  276. package/src/modes.ts +880 -0
  277. package/src/prep/index.ts +43 -0
  278. package/src/prep/installNodeDependencies.test.ts +298 -0
  279. package/src/prep/installNodeDependencies.ts +196 -0
  280. package/src/prep/installPythonDependencies.test.ts +268 -0
  281. package/src/prep/installPythonDependencies.ts +199 -0
  282. package/src/prep/types.ts +38 -0
  283. package/src/reviewQuality.test.ts +63 -0
  284. package/src/reviewQuality.ts +134 -0
  285. package/src/runCli.test.ts +214 -0
  286. package/src/runCli.ts +282 -0
  287. package/src/skills/terraform-best-practices/SKILL.md +369 -0
  288. package/src/toolState.test.ts +45 -0
  289. package/src/toolState.ts +252 -0
  290. package/src/utils/activity.test.ts +188 -0
  291. package/src/utils/activity.ts +210 -0
  292. package/src/utils/agent.test.ts +251 -0
  293. package/src/utils/agent.ts +139 -0
  294. package/src/utils/agentHangReport.test.ts +203 -0
  295. package/src/utils/agentHangReport.ts +170 -0
  296. package/src/utils/apiFetch.test.ts +115 -0
  297. package/src/utils/apiFetch.ts +62 -0
  298. package/src/utils/apiKeys.test.ts +344 -0
  299. package/src/utils/apiKeys.ts +206 -0
  300. package/src/utils/apiUrl.test.ts +30 -0
  301. package/src/utils/apiUrl.ts +59 -0
  302. package/src/utils/assets.test.ts +153 -0
  303. package/src/utils/assets.ts +107 -0
  304. package/src/utils/billingErrors.test.ts +121 -0
  305. package/src/utils/billingErrors.ts +189 -0
  306. package/src/utils/body.test.ts +217 -0
  307. package/src/utils/body.ts +168 -0
  308. package/src/utils/buildTerramendFooter.test.ts +38 -0
  309. package/src/utils/buildTerramendFooter.ts +82 -0
  310. package/src/utils/byokFallback.test.ts +205 -0
  311. package/src/utils/byokFallback.ts +128 -0
  312. package/src/utils/claudeSubscription.test.ts +179 -0
  313. package/src/utils/claudeSubscription.ts +93 -0
  314. package/src/utils/cli.ts +31 -0
  315. package/src/utils/codexHome.test.ts +190 -0
  316. package/src/utils/codexHome.ts +191 -0
  317. package/src/utils/codexOAuth.ts +147 -0
  318. package/src/utils/codexRefreshDetect.test.ts +85 -0
  319. package/src/utils/codexRefreshDetect.ts +35 -0
  320. package/src/utils/diffCoverage.test.ts +468 -0
  321. package/src/utils/diffCoverage.ts +404 -0
  322. package/src/utils/errorReport.test.ts +135 -0
  323. package/src/utils/errorReport.ts +83 -0
  324. package/src/utils/exitHandler.ts +35 -0
  325. package/src/utils/fixDoubleEscapedString.ts +9 -0
  326. package/src/utils/ghaCore.ts +13 -0
  327. package/src/utils/gitAuth.test.ts +322 -0
  328. package/src/utils/gitAuth.ts +263 -0
  329. package/src/utils/gitAuthServer.test.ts +260 -0
  330. package/src/utils/gitAuthServer.ts +182 -0
  331. package/src/utils/github.test.ts +615 -0
  332. package/src/utils/github.ts +538 -0
  333. package/src/utils/globals.ts +9 -0
  334. package/src/utils/humanEditCapture.test.ts +100 -0
  335. package/src/utils/humanEditCapture.ts +193 -0
  336. package/src/utils/install.test.ts +768 -0
  337. package/src/utils/install.ts +492 -0
  338. package/src/utils/instructions.test.ts +240 -0
  339. package/src/utils/instructions.ts +543 -0
  340. package/src/utils/leapingComment.test.ts +51 -0
  341. package/src/utils/leapingComment.ts +18 -0
  342. package/src/utils/learnings.test.ts +87 -0
  343. package/src/utils/learnings.ts +138 -0
  344. package/src/utils/learningsTocRender.test.ts +116 -0
  345. package/src/utils/learningsTruncate.test.ts +39 -0
  346. package/src/utils/learningsTruncate.ts +42 -0
  347. package/src/utils/lifecycle.test.ts +195 -0
  348. package/src/utils/lifecycle.ts +198 -0
  349. package/src/utils/log.test.ts +402 -0
  350. package/src/utils/log.ts +432 -0
  351. package/src/utils/normalizeEnv.test.ts +91 -0
  352. package/src/utils/normalizeEnv.ts +106 -0
  353. package/src/utils/openCodeModels.ts +82 -0
  354. package/src/utils/overrides.test.ts +89 -0
  355. package/src/utils/overrides.ts +98 -0
  356. package/src/utils/packageManager.test.ts +321 -0
  357. package/src/utils/packageManager.ts +257 -0
  358. package/src/utils/patchWorkflowRunFields.test.ts +92 -0
  359. package/src/utils/patchWorkflowRunFields.ts +150 -0
  360. package/src/utils/payload.test.ts +497 -0
  361. package/src/utils/payload.ts +371 -0
  362. package/src/utils/postApiFetch.ts +51 -0
  363. package/src/utils/prSummary.test.ts +224 -0
  364. package/src/utils/prSummary.ts +147 -0
  365. package/src/utils/progressComment.ts +261 -0
  366. package/src/utils/providerErrors.test.ts +315 -0
  367. package/src/utils/providerErrors.ts +172 -0
  368. package/src/utils/rangeDiff.test.ts +236 -0
  369. package/src/utils/rangeDiff.ts +182 -0
  370. package/src/utils/remediationCommand.test.ts +163 -0
  371. package/src/utils/remediationCommand.ts +119 -0
  372. package/src/utils/retry.test.ts +153 -0
  373. package/src/utils/retry.ts +58 -0
  374. package/src/utils/reviewCleanup.ts +106 -0
  375. package/src/utils/run.ts +99 -0
  376. package/src/utils/runContext.ts +145 -0
  377. package/src/utils/runContextData.ts +58 -0
  378. package/src/utils/runErrorRenderer.test.ts +95 -0
  379. package/src/utils/runErrorRenderer.ts +259 -0
  380. package/src/utils/runFixture.ts +76 -0
  381. package/src/utils/runLifecycle.ts +237 -0
  382. package/src/utils/runStartupLog.ts +60 -0
  383. package/src/utils/secrets.test.ts +103 -0
  384. package/src/utils/secrets.ts +177 -0
  385. package/src/utils/setup.test.ts +509 -0
  386. package/src/utils/setup.ts +352 -0
  387. package/src/utils/shell.ts +103 -0
  388. package/src/utils/skills.test.ts +46 -0
  389. package/src/utils/skills.ts +67 -0
  390. package/src/utils/subprocess.test.ts +170 -0
  391. package/src/utils/subprocess.ts +438 -0
  392. package/src/utils/terraformMcp.test.ts +63 -0
  393. package/src/utils/terraformMcp.ts +83 -0
  394. package/src/utils/time.test.ts +105 -0
  395. package/src/utils/time.ts +59 -0
  396. package/src/utils/timer.test.ts +91 -0
  397. package/src/utils/timer.ts +72 -0
  398. package/src/utils/todoTracking.test.ts +223 -0
  399. package/src/utils/todoTracking.ts +167 -0
  400. package/src/utils/token.test.ts +239 -0
  401. package/src/utils/token.ts +186 -0
  402. package/src/utils/version.ts +10 -0
  403. package/src/utils/versioning.test.ts +34 -0
  404. package/src/utils/versioning.ts +44 -0
  405. package/src/utils/vertex.ts +85 -0
  406. package/src/utils/workflow.ts +25 -0
@@ -0,0 +1,111 @@
1
+ /**
2
+ * Logging utilities that work well in both local and GitHub Actions environments
3
+ */
4
+ import { type AgentUsage } from "#app/agents/shared";
5
+ /** run `fn` with every log line prefixed by `prefix` (e.g. "[task-label]") in magenta */
6
+ export declare function withLogPrefix<T>(prefix: string, fn: () => Promise<T>): Promise<T>;
7
+ type LogSink = "actions" | "stderr";
8
+ /**
9
+ * Route ALL log output to stderr instead of `@actions/core` (which writes to
10
+ * stdout). Required before starting a stdio MCP server: stdout is the JSON-RPC
11
+ * channel there, and a single stray diagnostic line corrupts the framing.
12
+ * The GitHub Action path never calls this — its sink stays `@actions/core`.
13
+ */
14
+ export declare function setLogSink(next: LogSink): void;
15
+ /**
16
+ * Start a collapsed group (GitHub Actions) or regular group (local)
17
+ */
18
+ declare function startGroup(name: string): void;
19
+ /**
20
+ * End a collapsed group
21
+ */
22
+ declare function endGroup(): void;
23
+ /**
24
+ * Run a callback within a collapsed group
25
+ */
26
+ declare function group(name: string, fn: () => void): void;
27
+ /**
28
+ * Print a formatted box with text
29
+ */
30
+ declare function box(text: string, options?: {
31
+ title?: string;
32
+ maxWidth?: number;
33
+ }): void;
34
+ /**
35
+ * Overwrite the job summary with the given text.
36
+ * Skips if:
37
+ * - Not in GitHub Actions
38
+ * - Running inside Docker (CI tests inherit host env vars but can't access host paths)
39
+ * - GITHUB_STEP_SUMMARY not set
40
+ */
41
+ export declare function writeSummary(text: string): Promise<void>;
42
+ /**
43
+ * Print a formatted table using the table package
44
+ */
45
+ declare function printTable(rows: Array<Array<{
46
+ data: string;
47
+ header?: boolean;
48
+ } | string>>, options?: {
49
+ title?: string;
50
+ }): void;
51
+ /**
52
+ * Print a separator line
53
+ */
54
+ declare function separator(length?: number): void;
55
+ /**
56
+ * Main logging utility object - import this once and access all utilities
57
+ */
58
+ export declare const log: {
59
+ /** Print info message */
60
+ info: (...args: unknown[]) => void;
61
+ /** Print a warning message. Use only for warnings that should be displayed in the job summary. */
62
+ warning: (...args: unknown[]) => void;
63
+ /** Print an error message. Use only for errors that should be displayed in the job summary. */
64
+ error: (...args: unknown[]) => void;
65
+ /** Print success message */
66
+ success: (...args: unknown[]) => void;
67
+ /** Print debug message (only when debug mode is enabled) */
68
+ debug: (...args: unknown[]) => void;
69
+ /** Print a formatted box with text */
70
+ box: typeof box;
71
+ /** Print a formatted table using the table package */
72
+ table: typeof printTable;
73
+ /** Print a separator line */
74
+ separator: typeof separator;
75
+ /** Start a collapsed group (GitHub Actions) or regular group (local) */
76
+ startGroup: typeof startGroup;
77
+ /** End a collapsed group */
78
+ endGroup: typeof endGroup;
79
+ /** Run a callback within a collapsed group */
80
+ group: typeof group;
81
+ /** Log tool call information to console with formatted output */
82
+ toolCall: ({ toolName, input }: {
83
+ toolName: string;
84
+ input: unknown;
85
+ }) => void;
86
+ };
87
+ /**
88
+ * Format a value as JSON, using compact format for simple values and pretty-printed for complex ones
89
+ */
90
+ export declare function formatJsonValue(value: unknown): string;
91
+ /**
92
+ * Format a multi-line string with proper indentation for tool call output
93
+ * First line has the label, subsequent lines are indented 4 spaces
94
+ */
95
+ export declare function formatIndentedField(label: string, content: string): string;
96
+ /**
97
+ * format aggregated usage data as a markdown table for the GitHub step summary.
98
+ *
99
+ * columns mirror the per-run stdout token table emitted by `logTokenTable`
100
+ * (Input / Cache Read / Cache Write / Output / Total / Cost ($)) so the job
101
+ * summary and the in-run logs can be compared row-for-row.
102
+ *
103
+ * notes:
104
+ * - `AgentUsage.inputTokens` is the sum of non-cached input + cache read
105
+ * + cache write (set that way by both agent harnesses' `buildUsage`),
106
+ * so the non-cached Input column is recovered by subtracting cache fields.
107
+ * - `costUsd` is sourced from models.dev (OpenCode) or `total_cost_usd`
108
+ * (Claude CLI). absent rows show `—` so per-agent coverage is obvious.
109
+ */
110
+ export declare function formatUsageSummary(entries: AgentUsage[]): string;
111
+ export {};
@@ -0,0 +1,30 @@
1
+ /**
2
+ * Trim surrounding whitespace from a sensitive value and register it as a
3
+ * GitHub Actions log mask. Trailing newlines from terminal-copy paste are a
4
+ * common footgun: the value travels through GH Actions logs and any tool
5
+ * that re-emits parts of it leaks the unmasked tail. Trimming canonicalises
6
+ * the value so the mask matches exactly what downstream tools will print.
7
+ *
8
+ * Masking is delegated to `core.setSecret` (not raw `console.log`) so the
9
+ * toolkit percent-encodes `\r`/`\n`; the runner V2 parser decodes them and
10
+ * registers the full value plus every non-empty line as separate masks. That
11
+ * keeps us safe for embedded-newline values (PEMs, kubeconfigs, JSON blobs)
12
+ * even though they aren't currently used.
13
+ *
14
+ * Returns the trimmed value, or `null` when the input was whitespace-only —
15
+ * callers must leave `process.env` untouched in that case so a misconfigured
16
+ * value surfaces as a clear "missing key" downstream rather than silently
17
+ * mutating to the empty string.
18
+ */
19
+ export declare function sanitizeSecret(key: string, value: string): string | null;
20
+ /**
21
+ * Normalize environment variables to uppercase.
22
+ * This handles case-insensitive env var names (e.g., `anthropic_api_key` -> `ANTHROPIC_API_KEY`).
23
+ *
24
+ * If there are conflicts (same key with different capitalizations but different values),
25
+ * logs a warning and keeps the uppercase version.
26
+ *
27
+ * Also trims and masks sensitive values so accidental trailing whitespace
28
+ * doesn't defeat GitHub Actions log masking.
29
+ */
30
+ export declare function normalizeEnv(): void;
@@ -0,0 +1,11 @@
1
+ /** Snapshot the set of models OpenCode can serve from the current env, BEFORE
2
+ * Terramend-stored credentials are merged in. Call once early in `main.ts`. */
3
+ export declare function captureBaselineModels(cliPath: string): void;
4
+ /** Snapshot the set of models OpenCode can serve AFTER dbSecrets +
5
+ * Codex auth.json are in place. Logs the diff against the baseline as
6
+ * `» BYOK auth enabled N model(s): …`. */
7
+ export declare function captureAuthorizedModels(cliPath: string): void;
8
+ /** Authorized set captured after Terramend-stored auth is applied. Throws if
9
+ * called before `captureAuthorizedModels` — the call sites (fallback gate,
10
+ * api-key validation, auto-select) all run strictly after capture. */
11
+ export declare function getAuthorizedModels(): Set<string>;
@@ -0,0 +1,40 @@
1
+ /**
2
+ * Parse + apply the action's `unsafe_overrides` input — a JSON object of env
3
+ * var overrides that mutate `process.env` at the start of a run. Designed for
4
+ * e2e testing / debugging from `workflow_dispatch`; only callers with
5
+ * `actions:write` on the repo can supply it.
6
+ *
7
+ * The `unsafe` prefix is load-bearing: GH Actions echoes the value verbatim
8
+ * in the runner's step-header log, so the raw JSON (including any values
9
+ * passed in) is visible to anyone with `actions:read` on the calling repo.
10
+ * Treat the run log as compromised for any value placed in `unsafe_overrides`.
11
+ */
12
+ /**
13
+ * Names refused even when present in the input. Overriding these would let a
14
+ * caller escape terramend's scope (GITHUB_TOKEN), break runner internals
15
+ * (ACTIONS_RUNTIME_*), forge OIDC tokens (ACTIONS_ID_TOKEN_REQUEST_*), or
16
+ * substitute our server-side auth (TERRAMEND_API_SECRET). Customer-facing
17
+ * provider keys (ANTHROPIC_API_KEY, OPENAI_API_KEY, CLAUDE_CODE_OAUTH_TOKEN,
18
+ * etc.) are intentionally NOT denied — overriding those is the use case.
19
+ */
20
+ export declare const DENIED_OVERRIDE_NAMES: ReadonlySet<string>;
21
+ export interface ApplyOverridesResult {
22
+ applied: string[];
23
+ denied: string[];
24
+ }
25
+ /** Parse the JSON input. Returns `{}` for empty/whitespace. Throws on shape errors. */
26
+ export declare function parseOverrides(raw: string): Record<string, string>;
27
+ /**
28
+ * Mutate `params.env` in place with the supplied JSON overrides, skipping any
29
+ * names in `DENIED_OVERRIDE_NAMES`. Each applied value is registered with
30
+ * `core.setSecret` so the runner masks it in subsequent log output, and the
31
+ * raw `UNSAFE_OVERRIDES` env var is deleted so spawned subprocesses don't
32
+ * inherit the original JSON (which would defeat both the deny-list and the
33
+ * masking by exposing the values verbatim).
34
+ *
35
+ * Returns the applied/denied breakdown so the caller can render an audit log.
36
+ */
37
+ export declare function applyOverrides(params: {
38
+ raw: string;
39
+ env: NodeJS.ProcessEnv;
40
+ }): ApplyOverridesResult;
@@ -0,0 +1,49 @@
1
+ export type SupportedPackageManager = "npm" | "pnpm" | "yarn" | "bun";
2
+ export interface PackageManagerSpec {
3
+ name: SupportedPackageManager;
4
+ /**
5
+ * either a concrete semver (e.g. "11.1.1") or a range (e.g. "^11.0.0").
6
+ * `concrete` distinguishes — corepack only accepts concrete versions.
7
+ */
8
+ version: string;
9
+ concrete: boolean;
10
+ /** which package.json field this came from */
11
+ source: "devEngines" | "packageManager";
12
+ }
13
+ /**
14
+ * resolve the project's intended package manager from package.json. precedence
15
+ * matches pnpm 11+: `devEngines.packageManager` wins over `packageManager`.
16
+ * when both are present, a concrete `packageManager` that satisfies a
17
+ * `devEngines` range is preferred (we can pin it via corepack); otherwise
18
+ * we warn on disagreement and stick with `devEngines`.
19
+ */
20
+ export declare function resolvePackageManagerSpec(cwd: string): Promise<PackageManagerSpec | null>;
21
+ /** the per-run directory the corepack shim is installed into. deliberately
22
+ * NOT the node bin dir: that's npm's `-g` target, and a corepack shim sitting
23
+ * there makes a customer setup script's `npm i -g pnpm` abort with EEXIST
24
+ * (npm refuses to clobber a binary it doesn't own). lives under the run
25
+ * tmpdir so it's cleaned up with everything else. */
26
+ export declare function packageManagerBinDir(tmpdir: string): string;
27
+ export interface EnsurePackageManagerParams {
28
+ spec: PackageManagerSpec;
29
+ /** directory to install the corepack shim into (see `packageManagerBinDir`).
30
+ * prepended to PATH so the pinned binary resolves by name. */
31
+ binDir: string;
32
+ }
33
+ /**
34
+ * ensure the requested package manager is on PATH at the declared version,
35
+ * provisioning via corepack when applicable. returns true if PATH now
36
+ * resolves to that version, false if we couldn't pin it (in which case
37
+ * the caller should treat PATH as untrusted and may fall back to its
38
+ * legacy install path).
39
+ *
40
+ * the corepack shim is installed into `params.binDir` (prepended to PATH),
41
+ * not the node bin dir, so a later `npm i -g pnpm` in a setup hook can't
42
+ * collide with it. our dir wins the PATH lookup, so the pinned version is
43
+ * also what resolves even if that `npm i -g` succeeds into the node bin dir.
44
+ *
45
+ * never throws: network failure, missing corepack, range-only versions —
46
+ * all degrade to "log warning, return false". the existing PATH binary
47
+ * still works; we just don't get our version guarantee.
48
+ */
49
+ export declare function ensurePackageManager(params: EnsurePackageManagerParams): Promise<boolean>;
@@ -0,0 +1,29 @@
1
+ import type { AgentUsage } from "#app/agents/shared";
2
+ import type { ToolContext } from "#app/mcp/server";
3
+ /**
4
+ * Artifact tracking fields — one-off PATCHes from MCP tools as GitHub entities
5
+ * are created during the run. Strings only (GraphQL node IDs).
6
+ * Keep in sync with `STRING_FIELDS` in `app/api/workflow-run/[runId]/route.ts`.
7
+ */
8
+ export type WorkflowRunArtifactPatchKey = "prNodeId" | "issueNodeId" | "reviewNodeId" | "planCommentNodeId" | "summarySnapshot";
9
+ /**
10
+ * Usage fields — aggregated across all agent calls and PATCHed once at
11
+ * end-of-run. Token counts are Int4 on the DB side (ample for any realistic
12
+ * run); `costUsd` is a Decimal populated by provider-reported dollar amounts.
13
+ * Keep in sync with `INT_FIELDS` + `DECIMAL_FIELDS` in the server route.
14
+ */
15
+ export type WorkflowRunUsagePatchKey = "inputTokens" | "outputTokens" | "cacheReadTokens" | "cacheWriteTokens" | "costUsd";
16
+ export type WorkflowRunPatch = Partial<Record<WorkflowRunArtifactPatchKey, string>> & Partial<Record<WorkflowRunUsagePatchKey, number>>;
17
+ /** PATCH workflow-run fields (Terramend JWT, not GitHub). */
18
+ export declare function patchWorkflowRunFields(ctx: ToolContext, fields: WorkflowRunPatch): Promise<void>;
19
+ /**
20
+ * Sum per-agent usage entries into a single WorkflowRunPatch payload.
21
+ * Returns an empty object when there's nothing to report, which causes
22
+ * `patchWorkflowRunFields` to no-op — safe to call unconditionally from
23
+ * end-of-run paths. Zero-valued fields are dropped so the DB only stores
24
+ * positive sums (and NULL means "not reported").
25
+ *
26
+ * Token sums are clamped to INT4_MAX to guarantee the payload the server
27
+ * sees is always self-consistent across all numeric columns.
28
+ */
29
+ export declare function aggregateUsage(entries: AgentUsage[]): WorkflowRunPatch;
@@ -0,0 +1,105 @@
1
+ import type { PayloadEvent } from "#app/external";
2
+ import type { RepoSettings } from "#app/utils/runContext";
3
+ export declare const JsonPayload: import("arktype/internal/variants/object.ts").ObjectType<{
4
+ "~terramend": true;
5
+ version: string;
6
+ prompt: string;
7
+ model?: string | undefined;
8
+ triggerer?: string | undefined;
9
+ eventInstructions?: string;
10
+ previousRunsNote?: string;
11
+ event?: object;
12
+ timeout?: string | undefined;
13
+ progressComment?: {
14
+ id: string;
15
+ type: "issue" | "review";
16
+ } | undefined;
17
+ generateSummary?: boolean | undefined;
18
+ }, {}>;
19
+ export declare const Inputs: import("arktype/internal/variants/object.ts").ObjectType<{
20
+ prompt: string;
21
+ model?: string | undefined;
22
+ mode?: string | undefined;
23
+ timeout?: string | undefined;
24
+ push?: "disabled" | "enabled" | "restricted" | undefined;
25
+ shell?: "disabled" | "enabled" | "restricted" | undefined;
26
+ cwd?: string | undefined;
27
+ output_schema?: string | undefined;
28
+ scan_scope?: string | undefined;
29
+ severity_threshold?: string | undefined;
30
+ max_prs?: string | undefined;
31
+ allowed_paths?: string | undefined;
32
+ base_branch?: string | undefined;
33
+ allow_replace?: string | undefined;
34
+ protected_paths?: string | undefined;
35
+ autonomy_threshold?: string | undefined;
36
+ gitleaks?: string | undefined;
37
+ cost_increase_block_usd?: string | undefined;
38
+ module_catalogue?: string | undefined;
39
+ terratest?: string | undefined;
40
+ terraform_mcp?: string | undefined;
41
+ review_instructions?: string | undefined;
42
+ fp_filtering_instructions?: string | undefined;
43
+ }, {}>;
44
+ export type Inputs = typeof Inputs.infer;
45
+ export type ResolvedPromptInput = string | typeof JsonPayload.infer;
46
+ export declare function resolvePromptInput(): ResolvedPromptInput;
47
+ /**
48
+ * Canonicalize the `mode` input against the built-in mode names
49
+ * (case-insensitive). Returns the canonical name (e.g. "remediate" →
50
+ * "Remediate") when it matches a built-in mode, letting CI pin a mode
51
+ * deterministically. Unknown non-empty values warn and return undefined so the
52
+ * agent falls back to prompt-driven `select_mode` — mirroring how an unknown
53
+ * `model` slug degrades to auto-select rather than hard-failing the run.
54
+ */
55
+ export declare function parseMode(raw: string | undefined): string | undefined;
56
+ /** parse the base_branch override; trims and strips a leading `refs/heads/`,
57
+ * undefined when unset (downstream resolves the run-start branch / default). */
58
+ export declare function parseBaseBranch(raw: string | undefined): string | undefined;
59
+ /** parse the comma-separated allow_replace list — resource addresses (or globs,
60
+ * or `*`/`all`) permitted to be destroyed/replaced; undefined when unset. */
61
+ export declare function parseAllowReplace(raw: string | undefined): string[] | undefined;
62
+ export declare function resolvePayload(resolvedPromptInput: ResolvedPromptInput, repoSettings: RepoSettings): {
63
+ "~terramend": true;
64
+ version: string;
65
+ model: string | undefined;
66
+ mode: string | undefined;
67
+ prompt: string;
68
+ triggerer: string | undefined;
69
+ eventInstructions: string | undefined;
70
+ previousRunsNote: string | undefined;
71
+ event: PayloadEvent;
72
+ timeout: string | undefined;
73
+ cwd: string | undefined;
74
+ progressComment: {
75
+ id: string;
76
+ type: "issue" | "review";
77
+ } | undefined;
78
+ generateSummary: boolean | undefined;
79
+ push: import("#app/external").PushPermission;
80
+ shell: import("#app/external").ShellPermission;
81
+ scanScope: "diff" | "full" | undefined;
82
+ severityThreshold: string | undefined;
83
+ maxPrs: number | undefined;
84
+ allowedPaths: string[] | undefined;
85
+ protectedPaths: string[] | undefined;
86
+ autonomyThreshold: string | undefined;
87
+ gitleaks: boolean;
88
+ costIncreaseBlockUsd: number | undefined;
89
+ moduleCatalogue: string | undefined;
90
+ terratest: boolean;
91
+ terraformMcp: boolean;
92
+ remediationCommand: import("#app/utils/remediationCommand").RemediationCommand | null;
93
+ baseBranch: string | undefined;
94
+ allowReplace: string[] | undefined;
95
+ reviewInstructions: string | undefined;
96
+ fpFilteringInstructions: string | undefined;
97
+ };
98
+ export type ResolvedPayload = ReturnType<typeof resolvePayload>;
99
+ /**
100
+ * Parse and validate the optional `output_schema` action input. Returns the
101
+ * parsed object when present, or `undefined` when absent. Throws on invalid
102
+ * JSON or non-object payloads — these are workflow-author errors that should
103
+ * surface immediately, not silently degrade to "no schema".
104
+ */
105
+ export declare function resolveOutputSchema(): Record<string, unknown> | undefined;
@@ -0,0 +1,61 @@
1
+ import type { ToolContext } from "#app/mcp/server";
2
+ /**
3
+ * The PR-level summary snapshot is a markdown file the agent edits in place
4
+ * during a Review / IncrementalReview run. The server seeds the file with
5
+ * either the previous run's snapshot (incremental) or a stub scaffold (first
6
+ * run), lets the agent edit it with its native file-editing tools, then
7
+ * reads it back at end-of-run and persists it to `WorkflowRun.summarySnapshot`.
8
+ *
9
+ * The snapshot is an internal artifact — it is consumed by future agent runs
10
+ * as durable cross-run context, not surfaced to humans. User-visible summary
11
+ * content lives in the Review / IncrementalReview review bodies, governed by
12
+ * `action/modes.ts`.
13
+ *
14
+ * Edit-in-place avoids the output-token tax of a tool call that regurgitates
15
+ * the full snapshot, and gives incremental runs a clean surface that
16
+ * range-diffs cleanly across runs because the section headings are stable.
17
+ */
18
+ export declare const SUMMARY_FILE_NAME = "terramend-summary.md";
19
+ /**
20
+ * minimal seed for first-run PRs. just a header + a one-line note about
21
+ * what this file is for. structure is intentionally NOT prescribed —
22
+ * different PRs warrant different organization, and the agent should pick
23
+ * a shape that fits this PR. the agent's prompt (see selectMode.ts
24
+ * `buildSummaryAddendum`) carries the actual instructions for what to
25
+ * capture and how.
26
+ *
27
+ * keeping the seed short also makes the unchanged-from-seed gate more
28
+ * sensitive — any meaningful edit moves the file off the seed, so
29
+ * `persistSummary` can reliably skip the DB write when the agent didn't
30
+ * touch the file.
31
+ */
32
+ export declare const SUMMARY_SCAFFOLD = "# PR summary\n\n<!-- durable cross-run context. edit in place; the next agent run reads this\n before reviewing new commits. structure however serves the PR best. -->\n";
33
+ export declare function summaryFilePath(tmpdir: string): string;
34
+ /** seed the summary file with previous snapshot (incremental) or scaffold (first run). */
35
+ export declare function seedSummaryFile(params: {
36
+ tmpdir: string;
37
+ previousSnapshot: string | null;
38
+ }): Promise<string>;
39
+ /** read + validate the summary file written by the agent.
40
+ * returns null when the file is missing or fails sanity checks. */
41
+ export declare function readSummaryFile(path: string): Promise<string | null>;
42
+ /**
43
+ * Fetch the most recent persisted PR summary snapshot for this PR.
44
+ * Returns null on first-time PRs, when summary is disabled, or on any error.
45
+ * Best-effort: a transient API failure should not block the run.
46
+ */
47
+ export declare function fetchPreviousSnapshot(ctx: ToolContext, prNumber: number): Promise<string | null>;
48
+ /**
49
+ * Read the agent-edited PR summary tmpfile and persist to
50
+ * `WorkflowRun.summarySnapshot`.
51
+ *
52
+ * Best-effort: any failure is logged and does not affect the run's success
53
+ * status. Skips the PATCH when the file is byte-identical to its seed —
54
+ * persisting the seed verbatim would either re-write what the DB already has
55
+ * (on incremental runs) or serialize the placeholder scaffold (on first
56
+ * runs), neither of which is useful.
57
+ *
58
+ * Funnels through both the success path and the SIGINT/SIGTERM handler;
59
+ * `summaryPersistAttempted` guards against double-execution.
60
+ */
61
+ export declare function persistSummary(ctx: ToolContext): Promise<void>;
@@ -0,0 +1,146 @@
1
+ /**
2
+ * Single source of truth for reading, updating, deleting, and creating "progress comments" —
3
+ * the GitHub comments Terramend uses to surface a run's status.
4
+ *
5
+ * A progress comment can be one of two distinct GitHub entities with non-overlapping IDs and
6
+ * distinct REST endpoints:
7
+ * - "issue": a top-level issue/PR timeline comment (octokit.rest.issues.*Comment)
8
+ * - "review": an inline PR review-thread comment (octokit.rest.pulls.*ReviewComment)
9
+ *
10
+ * Callers carry a `ProgressComment` (id + type) value end-to-end so the right endpoint is always
11
+ * picked. Adding a third comment type later means one new branch in this file, not six.
12
+ */
13
+ export type ProgressCommentType = "issue" | "review";
14
+ export type ProgressComment = {
15
+ id: number;
16
+ type: ProgressCommentType;
17
+ };
18
+ /**
19
+ * Parse the on-the-wire `{ id: string; type }` shape (the form carried in `JsonPayload`)
20
+ * into the in-memory `ProgressComment` shape. Returns undefined when the id isn't a
21
+ * positive integer so callers can short-circuit cleanly. Callers handle logging.
22
+ */
23
+ export declare function parseProgressComment(raw: {
24
+ id: string;
25
+ type: ProgressCommentType;
26
+ } | null | undefined): ProgressComment | undefined;
27
+ interface CommentResponse {
28
+ data: {
29
+ id: number;
30
+ body?: string | null | undefined;
31
+ html_url: string;
32
+ node_id?: string;
33
+ };
34
+ }
35
+ export interface ProgressCommentOctokit {
36
+ rest: {
37
+ issues: {
38
+ createComment: (params: {
39
+ owner: string;
40
+ repo: string;
41
+ issue_number: number;
42
+ body: string;
43
+ }) => Promise<CommentResponse>;
44
+ getComment: (params: {
45
+ owner: string;
46
+ repo: string;
47
+ comment_id: number;
48
+ }) => Promise<CommentResponse>;
49
+ updateComment: (params: {
50
+ owner: string;
51
+ repo: string;
52
+ comment_id: number;
53
+ body: string;
54
+ }) => Promise<CommentResponse>;
55
+ deleteComment: (params: {
56
+ owner: string;
57
+ repo: string;
58
+ comment_id: number;
59
+ }) => Promise<unknown>;
60
+ };
61
+ pulls: {
62
+ createReplyForReviewComment: (params: {
63
+ owner: string;
64
+ repo: string;
65
+ pull_number: number;
66
+ comment_id: number;
67
+ body: string;
68
+ }) => Promise<CommentResponse>;
69
+ getReviewComment: (params: {
70
+ owner: string;
71
+ repo: string;
72
+ comment_id: number;
73
+ }) => Promise<CommentResponse>;
74
+ updateReviewComment: (params: {
75
+ owner: string;
76
+ repo: string;
77
+ comment_id: number;
78
+ body: string;
79
+ }) => Promise<CommentResponse>;
80
+ deleteReviewComment: (params: {
81
+ owner: string;
82
+ repo: string;
83
+ comment_id: number;
84
+ }) => Promise<unknown>;
85
+ };
86
+ };
87
+ }
88
+ interface ApiCtx {
89
+ octokit: ProgressCommentOctokit;
90
+ owner: string;
91
+ repo: string;
92
+ }
93
+ /**
94
+ * Fetch a progress comment via the appropriate REST endpoint for its type.
95
+ * Returns the common subset of fields callers actually use.
96
+ */
97
+ export declare function getProgressComment(ctx: ApiCtx, comment: ProgressComment): Promise<{
98
+ id: number;
99
+ body: string | undefined;
100
+ html_url: string;
101
+ }>;
102
+ /**
103
+ * Update a progress comment in place via the appropriate REST endpoint.
104
+ * Returns the common subset of fields callers actually use.
105
+ */
106
+ export declare function updateProgressComment(ctx: ApiCtx, comment: ProgressComment, body: string): Promise<{
107
+ id: number;
108
+ body: string | undefined;
109
+ html_url: string;
110
+ node_id: string | undefined;
111
+ }>;
112
+ /**
113
+ * Delete a progress comment via the appropriate REST endpoint.
114
+ * Lower-level than `deleteProgressComment` in mcp/comment.ts — that one also clears
115
+ * tool state. Callers that don't have a ToolContext (post cleanup, error handlers)
116
+ * should use this directly; the higher-level wrapper delegates here.
117
+ */
118
+ export declare function deleteProgressCommentApi(ctx: ApiCtx, comment: ProgressComment): Promise<void>;
119
+ /**
120
+ * Discriminated target for `createLeapingProgressComment`. The two variants map to the two
121
+ * distinct GitHub create endpoints; review-reply additionally needs the parent comment ID.
122
+ */
123
+ export type CreateProgressCommentTarget = {
124
+ kind: "issue";
125
+ issueNumber: number;
126
+ } | {
127
+ kind: "reviewReply";
128
+ pullNumber: number;
129
+ replyToCommentId: number;
130
+ };
131
+ export interface CreatedProgressComment {
132
+ comment: ProgressComment;
133
+ body: string | undefined;
134
+ html_url: string;
135
+ }
136
+ /**
137
+ * Create the initial "Leaping into action..." progress comment.
138
+ *
139
+ * Reliability: when `kind: "reviewReply"` fails (e.g. the parent comment was deleted or the
140
+ * thread is otherwise unreachable), falls back to a top-level issue comment on the same PR
141
+ * rather than leaving the run with no progress surface. The fallback is logged.
142
+ *
143
+ * (PR # === issue # in GitHub's number space, so `pullNumber` doubles as the fallback target.)
144
+ */
145
+ export declare function createLeapingProgressComment(ctx: ApiCtx, target: CreateProgressCommentTarget, body: string): Promise<CreatedProgressComment>;
146
+ export {};
@@ -0,0 +1,31 @@
1
+ /** Stable label for the BYOK provider-billing-exhausted classification. */
2
+ export declare const PROVIDER_BILLING_EXHAUSTED_LABEL = "provider billing exhausted";
3
+ /**
4
+ * Result of a provider-error scan: the classification label plus a
5
+ * human-readable excerpt centered on the matched line. The excerpt is what
6
+ * gets surfaced in `» provider error detected (...)` log lines — see
7
+ * `extractExcerpt` for the windowing/byte-cap policy.
8
+ */
9
+ export type ProviderErrorMatch = {
10
+ label: string;
11
+ excerpt: string;
12
+ };
13
+ export declare function findProviderErrorMatch(text: string): ProviderErrorMatch | null;
14
+ export declare function detectProviderError(text: string): string | null;
15
+ export declare function isRouterKeylimitExhaustedError(text: string): boolean;
16
+ /**
17
+ * BYOK billing-exhausted: provider rejected the request because the user's
18
+ * provider wallet is empty (DeepSeek "Insufficient Balance", Anthropic
19
+ * "credit balance is too low", OpenCode Zen `CreditsError` /
20
+ * `FreeUsageLimitError`, Gemini "spending cap"). Distinct from
21
+ * `isRouterKeylimitExhaustedError` — that's Terramend's Router wallet, this
22
+ * is the user's own provider account.
23
+ */
24
+ export declare function isProviderBillingExhausted(text: string): boolean;
25
+ /**
26
+ * Extract `providerID=foo` from agent error logs (OpenCode emits this on
27
+ * `provider error detected (...)` lines). Returns the lowercase provider
28
+ * slug, or null when absent. Used to render a provider-specific dashboard
29
+ * link in the BYOK billing-exhausted summary.
30
+ */
31
+ export declare function extractProviderId(text: string): string | null;