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,236 @@
1
+ /**
2
+ * The unified framework registry (§5.14 step 1).
3
+ *
4
+ * One `FrameworkDef` per compliance framework the crosswalk references, shared
5
+ * by the engine's indicative crosswalk (`crosswalk.ts`) and — by hand-sync,
6
+ * exactly like the report wire schema — the Cloud pack
7
+ * (infraweaver-ui `src/features/crosswalk/pack.ts`). Before this registry the
8
+ * engine used free-text framework names and the Cloud pack used slug ids: two
9
+ * hand-synced naming systems with nothing enforcing either.
10
+ *
11
+ * The `licence` field makes the free-only constraint MACHINE-ENFORCED: we build
12
+ * only on frameworks whose text is free to access and lawful to use
13
+ * commercially (we pay for nothing), and for paywalled/no-derivative texts we
14
+ * ship control IDS + short editorial titles only, never framework text — the
15
+ * lawful lane NIST OLIR itself uses for its ISO mappings. `crosswalk.test.ts`
16
+ * fails any crosswalk entry that embeds text against an `ids-only` licence.
17
+ */
18
+
19
+ /** What we may lawfully ship for a framework, commercially, at zero cost. */
20
+ export type FrameworkLicence =
21
+ /** US-government work / CC0 (e.g. NIST OSCAL) — full control text embeddable. */
22
+ | "public-domain"
23
+ /** OGL v3 / EUR-Lex (Decision 2011/833/EU) — reproducible with attribution. */
24
+ | "open-government"
25
+ /** CC BY 4.0 — reproducible with attribution. */
26
+ | "cc-by-4.0"
27
+ /** Paywalled or no-derivatives text (ISO, CIS, AICPA) — control ids + short
28
+ * editorial titles ONLY; never reproduce the framework's own text. */
29
+ | "ids-only";
30
+
31
+ /** Whether a framework ships free in the OSS engine (`starter`) or is part of the
32
+ * maintained subscription pack (`maintained`). NOTE this is the ENGINE view: the
33
+ * Cloud `STARTER_FRAMEWORK_IDS` gate is narrower (Cyber Essentials only) because
34
+ * most `starter` frameworks here exist solely as the engine`s indicative
35
+ * narration and have no Cloud pack rows to gate. */
36
+ export type FrameworkTier = "starter" | "maintained";
37
+
38
+ export interface FrameworkDef {
39
+ /** Stable slug id — the Cloud pack / API join key. */
40
+ id: string;
41
+ /** Display name — the value the engine's `ControlRef.framework` carries. */
42
+ name: string;
43
+ /** Publishing authority, e.g. "NIST", "NCSC". */
44
+ authority: string;
45
+ /** Where the framework applies, e.g. "UK", "EU", "US", "International". */
46
+ jurisdiction: string;
47
+ /** The pinned upstream revision this crosswalk layer was authored against. */
48
+ revision: string;
49
+ /** ISO date this REGISTRY ENTRY (name/revision/licence classification) was
50
+ * last reviewed. Mapping-layer review dates live with each layer (the engine
51
+ * `CROSSWALK_REVIEWED`, the Cloud pack's per-framework `reviewed`) and
52
+ * version independently (§5.14 step 5). */
53
+ reviewed: string;
54
+ licence: FrameworkLicence;
55
+ tier: FrameworkTier;
56
+ /** Mapped through the themes → NIST 800-53 hub (`THEME_TO_NIST`) rather than
57
+ * hand-themed directly — the §5.14 "one mechanical, auditable hop" path. */
58
+ hubAnchored: boolean;
59
+ }
60
+
61
+ /** True when the licence permits embedding the framework's own control text. */
62
+ export function canEmbedControlText(licence: FrameworkLicence): boolean {
63
+ return licence !== "ids-only";
64
+ }
65
+
66
+ /**
67
+ * Every framework the crosswalk references. Ordered starter-first, then the
68
+ * NIST hub, then the remaining maintained layers.
69
+ *
70
+ * NB the slug for NCSC Cloud Security Principles is the legacy `ncsc-caf` —
71
+ * the Cloud pack and persisted `framework_reporting` rows already use it, so a
72
+ * rename is a data migration. The real CAF therefore ships as `ncsc-caf-v4`
73
+ * (B.2); when the legacy slug is eventually migrated, THAT is the moment to
74
+ * consider collapsing the version suffix — not before, because two frameworks
75
+ * would briefly answer to the same key.
76
+ */
77
+ export const FRAMEWORKS: readonly FrameworkDef[] = [
78
+ {
79
+ id: "cyber-essentials",
80
+ name: "Cyber Essentials",
81
+ authority: "NCSC",
82
+ jurisdiction: "UK",
83
+ revision: "v3.1 (Montpellier)",
84
+ reviewed: "2026-07-24",
85
+ licence: "open-government",
86
+ tier: "starter",
87
+ hubAnchored: false,
88
+ },
89
+ {
90
+ id: "nist-800-53",
91
+ name: "NIST SP 800-53",
92
+ authority: "NIST",
93
+ jurisdiction: "International",
94
+ revision: "rev 5 (5.2.0)",
95
+ reviewed: "2026-07-24",
96
+ licence: "public-domain",
97
+ tier: "maintained",
98
+ hubAnchored: true,
99
+ },
100
+ {
101
+ id: "nist-csf-2.0",
102
+ name: "NIST CSF 2.0",
103
+ authority: "NIST",
104
+ jurisdiction: "International",
105
+ revision: "2.0 (Feb 2024)",
106
+ reviewed: "2026-07-24",
107
+ licence: "public-domain",
108
+ tier: "maintained",
109
+ hubAnchored: true,
110
+ },
111
+ {
112
+ // §5.15. The RTS that gives DORA (Reg. (EU) 2022/2554) Art. 9 "Protection and
113
+ // prevention" + Art. 10 "Detection" their concrete technical form. Cited as
114
+ // the RTS throughout — RTS article numbers do NOT track DORA Level-1 ones.
115
+ id: "dora-rts-2024-1774",
116
+ name: "DORA RTS (EU) 2024/1774",
117
+ authority: "European Commission",
118
+ jurisdiction: "EU",
119
+ // `revision` is the INSTRUMENT's authored scope — the articles the crosswalk
120
+ // was mapped against — not the subset this engine happens to emit. The engine
121
+ // emits Arts. 6-14, 20-21; the pack additionally authors 18-19, 22 and 25 as
122
+ // org-band honesty rows. Stating the emitted subset here made the same
123
+ // auditor-facing provenance field read differently on the two sides, so it
124
+ // now mirrors infraweaver-ui/src/features/crosswalk/pack.ts verbatim. The
125
+ // hand-synced revision strings are pinned by that repo's crosswalk-pack test.
126
+ revision: "Delegated Reg. (EU) 2024/1774, Arts. 6-14, 18-22, 25",
127
+ reviewed: "2026-07-25",
128
+ // EUR-Lex text is reusable commercially under Commission Decision 2011/833/EU.
129
+ licence: "open-government",
130
+ tier: "maintained",
131
+ hubAnchored: true,
132
+ },
133
+ {
134
+ // B.2. The ACTUAL Cyber Assessment Framework — distinct from the entry
135
+ // below, whose legacy `ncsc-caf` slug names the Cloud Security Principles.
136
+ // Until this layer existed, nothing in the product could lawfully be
137
+ // described as "CAF"; five surfaces once did and were corrected 2026-07-25.
138
+ id: "ncsc-caf-v4",
139
+ name: "NCSC Cyber Assessment Framework",
140
+ authority: "NCSC",
141
+ jurisdiction: "UK",
142
+ revision: "v4.0 (2025)",
143
+ reviewed: "2026-07-26",
144
+ // Crown copyright, Open Government Licence v3.0.
145
+ licence: "open-government",
146
+ tier: "maintained",
147
+ hubAnchored: true,
148
+ },
149
+ {
150
+ id: "ncsc-caf",
151
+ name: "NCSC Cloud Security Principles",
152
+ authority: "NCSC",
153
+ jurisdiction: "UK",
154
+ revision: "14 principles",
155
+ reviewed: "2026-07-24",
156
+ licence: "open-government",
157
+ tier: "maintained",
158
+ hubAnchored: false,
159
+ },
160
+ {
161
+ id: "iso-27001",
162
+ name: "ISO/IEC 27001",
163
+ authority: "ISO",
164
+ jurisdiction: "International",
165
+ revision: "2022 (Annex A)",
166
+ reviewed: "2026-07-24",
167
+ licence: "ids-only",
168
+ tier: "maintained",
169
+ hubAnchored: false,
170
+ },
171
+ {
172
+ id: "cis-controls-v8",
173
+ name: "CIS Controls v8",
174
+ authority: "CIS",
175
+ jurisdiction: "International",
176
+ revision: "v8",
177
+ reviewed: "2026-07-24",
178
+ licence: "ids-only",
179
+ tier: "starter",
180
+ hubAnchored: false,
181
+ },
182
+ {
183
+ id: "nhs-dspt",
184
+ name: "NHS DSPT",
185
+ authority: "NHS England",
186
+ jurisdiction: "UK",
187
+ revision: "2024-25 standards",
188
+ reviewed: "2026-07-24",
189
+ licence: "open-government",
190
+ tier: "starter",
191
+ hubAnchored: false,
192
+ },
193
+ {
194
+ id: "secure-by-design",
195
+ name: "Secure by Design",
196
+ authority: "UK Government (GDS)",
197
+ jurisdiction: "UK",
198
+ revision: "10 principles",
199
+ reviewed: "2026-07-24",
200
+ licence: "open-government",
201
+ tier: "starter",
202
+ hubAnchored: false,
203
+ },
204
+ {
205
+ id: "gds-service-standard",
206
+ name: "GDS Service Standard",
207
+ authority: "UK Government (GDS)",
208
+ jurisdiction: "UK",
209
+ revision: "14 points",
210
+ reviewed: "2026-07-24",
211
+ licence: "open-government",
212
+ tier: "starter",
213
+ hubAnchored: false,
214
+ },
215
+ {
216
+ id: "soc-2",
217
+ name: "SOC 2",
218
+ authority: "AICPA",
219
+ jurisdiction: "International",
220
+ revision: "2017 TSC (2022 points of focus)",
221
+ reviewed: "2026-07-24",
222
+ licence: "ids-only",
223
+ tier: "starter",
224
+ hubAnchored: false,
225
+ },
226
+ ];
227
+
228
+ /** Look up a framework by its display name (the engine `ControlRef.framework`). */
229
+ export function frameworkByName(name: string): FrameworkDef | undefined {
230
+ return FRAMEWORKS.find((f) => f.name === name);
231
+ }
232
+
233
+ /** Look up a framework by its slug id (the Cloud pack / API join key). */
234
+ export function frameworkById(id: string): FrameworkDef | undefined {
235
+ return FRAMEWORKS.find((f) => f.id === id);
236
+ }
@@ -0,0 +1,212 @@
1
+ import type { StandardSchemaV1 } from "@standard-schema/spec";
2
+ import type { Tool } from "fastmcp";
3
+ import type { ToolContext } from "#app/mcp/server";
4
+
5
+ // ── gemini schema sanitizer ────────────────────────────────────────────────────
6
+ //
7
+ // gemini's generateContent API expects an OpenAPI 3.0 Schema subset, not full
8
+ // JSON Schema. arktype 2.x emits constructs that gemini rejects with errors like:
9
+ // - "parameters.<field>.enum: only allowed for STRING type"
10
+ // - "functionDeclaration parameters.<field> schema didn't specify the schema type field"
11
+ // - "anyOf must be the only field in a schema node"
12
+ //
13
+ // transforms applied here:
14
+ // 1. add `type: "string"` to enum-only schemas. arktype emits string literal
15
+ // unions as `{enum: ["a","b"]}` without a `type` field — gemini requires
16
+ // the type declaration for any non-object schema.
17
+ // 2. collapse `{anyOf: [{enum:["a"]}, {enum:["b"]}]}` (older arktype form)
18
+ // into `{type:"string", enum:[...]}`. also handles `{const:"a"}` branches.
19
+ // 3. when `anyOf` / `oneOf` can't be collapsed, strip sibling fields (`type`,
20
+ // `description`, `items`, etc.) — gemini rejects `anyOf` alongside any
21
+ // peer keywords. see opencode #14659.
22
+ // 4. drop `$schema` metadata and rename `$defs` → `definitions` (draft-07
23
+ // compatibility; gemini doesn't understand either).
24
+ //
25
+ // gating: `isGeminiRouted()` detects gemini-targeted traffic so other
26
+ // providers continue to see the original (untransformed) schema.
27
+ //
28
+ // delivery: fastmcp (3.x) uses `xsschema.toJsonSchema()` which reads
29
+ // `schema["~standard"].jsonSchema.input({target:"draft-07"})` when present
30
+ // (arktype 2.x exposes this). we proxy the whole `~standard` chain so our
31
+ // transform runs regardless of which path xsschema takes.
32
+
33
+ function parseStringEnumBranch(item: unknown): { values: string[] } | null {
34
+ if (!item || typeof item !== "object") return null;
35
+ const record = item as Record<string, unknown>;
36
+ if (Array.isArray(record.enum)) {
37
+ const strings = record.enum.filter((v): v is string => typeof v === "string");
38
+ return strings.length === record.enum.length && strings.length > 0 ? { values: strings } : null;
39
+ }
40
+ if (typeof record.const === "string") {
41
+ return { values: [record.const] };
42
+ }
43
+ return null;
44
+ }
45
+
46
+ function collapseStringUnion(branches: unknown[]): { type: "string"; enum: string[] } | null {
47
+ const values: string[] = [];
48
+ for (const item of branches) {
49
+ const parsed = parseStringEnumBranch(item);
50
+ if (!parsed) return null;
51
+ values.push(...parsed.values);
52
+ }
53
+ if (values.length === 0) return null;
54
+ return { type: "string", enum: [...new Set(values)] };
55
+ }
56
+
57
+ /**
58
+ * Recursively transform a JSON schema to gemini's stricter subset.
59
+ * See module header for the exact transforms applied.
60
+ */
61
+ export function sanitizeForGemini(schema: unknown): unknown {
62
+ if (!schema || typeof schema !== "object") return schema;
63
+ if (Array.isArray(schema)) return schema.map(sanitizeForGemini);
64
+
65
+ const source = schema as Record<string, unknown>;
66
+
67
+ // case 1: enum-only string union → add `type: "string"`.
68
+ // arktype emits `type: "'A' | 'B'"` as `{enum: ["A","B"]}` without a type.
69
+ if (Array.isArray(source.enum) && typeof source.type !== "string") {
70
+ const allStrings = source.enum.every((v) => typeof v === "string");
71
+ if (allStrings) {
72
+ const result: Record<string, unknown> = { type: "string", enum: source.enum };
73
+ if (typeof source.description === "string") result.description = source.description;
74
+ return result;
75
+ }
76
+ }
77
+
78
+ // case 2: collapsible string-enum union (older arktype form)
79
+ for (const unionKey of ["anyOf", "oneOf"] as const) {
80
+ const branches = source[unionKey];
81
+ if (Array.isArray(branches) && branches.length > 0) {
82
+ const collapsed = collapseStringUnion(branches);
83
+ if (collapsed) {
84
+ const result: Record<string, unknown> = { ...collapsed };
85
+ if (typeof source.description === "string") result.description = source.description;
86
+ return result;
87
+ }
88
+ }
89
+ }
90
+
91
+ // case 3: non-collapsible anyOf/oneOf → strip sibling fields (gemini rule)
92
+ if (Array.isArray(source.anyOf) || Array.isArray(source.oneOf)) {
93
+ const result: Record<string, unknown> = {};
94
+ if (Array.isArray(source.anyOf)) result.anyOf = source.anyOf.map(sanitizeForGemini);
95
+ if (Array.isArray(source.oneOf)) result.oneOf = source.oneOf.map(sanitizeForGemini);
96
+ return result;
97
+ }
98
+
99
+ // case 4: generic pass — drop $schema, rename $defs, recurse
100
+ const sanitized: Record<string, unknown> = {};
101
+ for (const [key, value] of Object.entries(source)) {
102
+ if (key === "$schema") continue;
103
+ if (key === "$defs") {
104
+ sanitized.definitions = sanitizeForGemini(value);
105
+ continue;
106
+ }
107
+ sanitized[key] = sanitizeForGemini(value);
108
+ }
109
+ return sanitized;
110
+ }
111
+
112
+ // ── delivery mechanism ─────────────────────────────────────────────────────────
113
+ //
114
+ // fastmcp 3.x resolves the JSON schema via xsschema, which takes two paths:
115
+ // path A: `schema["~standard"].jsonSchema.input({target:"draft-07"})` when
116
+ // the StandardJSONSchemaV1 extension is present (arktype 2.x).
117
+ // path B: `schema.toJsonSchema()` via a vendor-dispatched function (older
118
+ // arktype, other vendors).
119
+ //
120
+ // we proxy both entry points so the transform runs regardless of which path
121
+ // xsschema picks.
122
+
123
+ function wrapJsonSchemaProducer<T extends object>(producer: T): T {
124
+ return new Proxy(producer, {
125
+ get(target, prop, receiver) {
126
+ const value = Reflect.get(target, prop, receiver);
127
+ if ((prop === "input" || prop === "output") && typeof value === "function") {
128
+ const fn = value as (...args: unknown[]) => unknown;
129
+ return (...args: unknown[]) => sanitizeForGemini(fn.apply(target, args));
130
+ }
131
+ return value;
132
+ },
133
+ });
134
+ }
135
+
136
+ function wrapStandard<T extends object>(standard: T): T {
137
+ return new Proxy(standard, {
138
+ get(target, prop, receiver) {
139
+ if (prop === "jsonSchema") {
140
+ const value = Reflect.get(target, prop, receiver);
141
+ if (value && typeof value === "object") {
142
+ return wrapJsonSchemaProducer(value as object);
143
+ }
144
+ return value;
145
+ }
146
+ return Reflect.get(target, prop, receiver);
147
+ },
148
+ });
149
+ }
150
+
151
+ // thread the schema's own type `S` through instead of collapsing to
152
+ // `StandardSchemaV1<any>`, so callers keep their exact schema type. The Proxy is a
153
+ // transparent sanitizer — it only rewrites the JSON schema emitted for Gemini, leaving
154
+ // the value's shape identical — so the single `as S` cast just re-asserts that shape
155
+ // across the Proxy boundary (TS types `new Proxy` loosely through the handler).
156
+ export function wrapSchemaForGemini<S extends StandardSchemaV1<any>>(schema: S): S {
157
+ return new Proxy(schema, {
158
+ get(target, prop, receiver) {
159
+ if (prop === "~standard") {
160
+ const value = Reflect.get(target, prop, receiver);
161
+ if (value && typeof value === "object") {
162
+ return wrapStandard(value as object);
163
+ }
164
+ return value;
165
+ }
166
+ if (prop === "toJsonSchema") {
167
+ const method = Reflect.get(target, prop, receiver);
168
+ if (typeof method === "function") {
169
+ return () => sanitizeForGemini((method as (...args: unknown[]) => unknown).call(target));
170
+ }
171
+ return method;
172
+ }
173
+ return Reflect.get(target, prop, receiver);
174
+ },
175
+ }) as S;
176
+ }
177
+
178
+ export function sanitizeToolForGemini<T extends Tool<any, any>>(tool: T): T {
179
+ if (!tool.parameters) return tool;
180
+ return { ...tool, parameters: wrapSchemaForGemini(tool.parameters) } as T;
181
+ }
182
+
183
+ /**
184
+ * true when the effective upstream model is — or might become — google
185
+ * generative language API traffic. matches:
186
+ * - direct `google/*`, opencode `opencode/gemini-*`, openrouter
187
+ * `openrouter/google/gemini-*` (slug substring "gemini" wins).
188
+ * - any unresolved specifier: `undefined`, `"auto"`, or a slug that
189
+ * didn't map through the alias registry (no `provider/` prefix).
190
+ * these flow through the agent's own auto-select, which may land
191
+ * on gemini *after* the MCP server has already registered tools —
192
+ * at which point sanitization is too late to apply. erring on the
193
+ * side of sanitizing is safe: cases 1 + 2 are universally
194
+ * compatible JSON-Schema normalizations (enum-only → typed string,
195
+ * collapsible const-unions → string enum); case 3 is gemini-
196
+ * specific but only fires on non-collapsible unions, which arktype
197
+ * does not emit for our current tool schemas. see issue #676 for
198
+ * the prod failure that motivated this widening.
199
+ */
200
+ export function isGeminiRouted(ctx: ToolContext): boolean {
201
+ const effective = ctx.resolvedModel ?? ctx.payload.model;
202
+ if (!effective) return true;
203
+ const normalized = effective.toLowerCase();
204
+ if (normalized.includes("gemini")) return true;
205
+ // every concrete model resolved through the registry carries a
206
+ // `provider/` prefix (e.g. "anthropic/claude-opus-4-7"). anything
207
+ // without a slash is either the literal `"auto"` alias or an
208
+ // unrecognized slug that resolveModel logged a warning for — both
209
+ // route through the agent's late auto-select, which may pick gemini.
210
+ if (!normalized.includes("/")) return true;
211
+ return false;
212
+ }