pi-codex-auto-review 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 (1057) hide show
  1. package/LICENSE +201 -0
  2. package/NOTICE +10 -0
  3. package/README.md +77 -0
  4. package/dist/approvals.d.ts +72 -0
  5. package/dist/approvals.js +167 -0
  6. package/dist/approvals.js.map +1 -0
  7. package/dist/audit.d.ts +28 -0
  8. package/dist/audit.js +40 -0
  9. package/dist/audit.js.map +1 -0
  10. package/dist/cli.d.ts +2 -0
  11. package/dist/cli.js +70 -0
  12. package/dist/cli.js.map +1 -0
  13. package/dist/context-files.d.ts +14 -0
  14. package/dist/context-files.js +113 -0
  15. package/dist/context-files.js.map +1 -0
  16. package/dist/contracts.d.ts +258 -0
  17. package/dist/contracts.js +102 -0
  18. package/dist/contracts.js.map +1 -0
  19. package/dist/index.d.ts +28 -0
  20. package/dist/index.js +106 -0
  21. package/dist/index.js.map +1 -0
  22. package/dist/native/darwin-arm64/artifact.json +5 -0
  23. package/dist/native/darwin-arm64/pi-guard-execpolicy +0 -0
  24. package/dist/native/linux-x64/artifact.json +5 -0
  25. package/dist/native/linux-x64/pi-guard-execpolicy +0 -0
  26. package/dist/policy/domains.d.ts +5 -0
  27. package/dist/policy/domains.js +18 -0
  28. package/dist/policy/domains.js.map +1 -0
  29. package/dist/policy/index.d.ts +56 -0
  30. package/dist/policy/index.js +304 -0
  31. package/dist/policy/index.js.map +1 -0
  32. package/dist/policy/paths.d.ts +5 -0
  33. package/dist/policy/paths.js +54 -0
  34. package/dist/policy/paths.js.map +1 -0
  35. package/dist/policy/rules.d.ts +36 -0
  36. package/dist/policy/rules.js +61 -0
  37. package/dist/policy/rules.js.map +1 -0
  38. package/dist/policy/shell.d.ts +14 -0
  39. package/dist/policy/shell.js +122 -0
  40. package/dist/policy/shell.js.map +1 -0
  41. package/dist/reports.d.ts +21 -0
  42. package/dist/reports.js +42 -0
  43. package/dist/reports.js.map +1 -0
  44. package/dist/review/context.d.ts +25 -0
  45. package/dist/review/context.js +108 -0
  46. package/dist/review/context.js.map +1 -0
  47. package/dist/review/investigation.d.ts +39 -0
  48. package/dist/review/investigation.js +36 -0
  49. package/dist/review/investigation.js.map +1 -0
  50. package/dist/review/lifecycle.d.ts +29 -0
  51. package/dist/review/lifecycle.js +71 -0
  52. package/dist/review/lifecycle.js.map +1 -0
  53. package/dist/review/policy.d.ts +4 -0
  54. package/dist/review/policy.js +15 -0
  55. package/dist/review/policy.js.map +1 -0
  56. package/dist/review/upstream-policy.d.ts +2 -0
  57. package/dist/review/upstream-policy.js +210 -0
  58. package/dist/review/upstream-policy.js.map +1 -0
  59. package/dist/reviewer.d.ts +45 -0
  60. package/dist/reviewer.js +148 -0
  61. package/dist/reviewer.js.map +1 -0
  62. package/dist/sandbox/broker.d.ts +1 -0
  63. package/dist/sandbox/broker.js +135 -0
  64. package/dist/sandbox/broker.js.map +1 -0
  65. package/dist/sandbox/config.d.ts +5 -0
  66. package/dist/sandbox/config.js +91 -0
  67. package/dist/sandbox/config.js.map +1 -0
  68. package/dist/sandbox/executor.d.ts +20 -0
  69. package/dist/sandbox/executor.js +144 -0
  70. package/dist/sandbox/executor.js.map +1 -0
  71. package/dist/sandbox/hard-links.d.ts +4 -0
  72. package/dist/sandbox/hard-links.js +145 -0
  73. package/dist/sandbox/hard-links.js.map +1 -0
  74. package/dist/sandbox/linux-read-paths.d.ts +7 -0
  75. package/dist/sandbox/linux-read-paths.js +47 -0
  76. package/dist/sandbox/linux-read-paths.js.map +1 -0
  77. package/dist/sandbox/paths.d.ts +3 -0
  78. package/dist/sandbox/paths.js +10 -0
  79. package/dist/sandbox/paths.js.map +1 -0
  80. package/dist/sandbox/runtime-write-paths.d.ts +2 -0
  81. package/dist/sandbox/runtime-write-paths.js +8 -0
  82. package/dist/sandbox/runtime-write-paths.js.map +1 -0
  83. package/dist/sandbox/seccomp.d.ts +5 -0
  84. package/dist/sandbox/seccomp.js +16 -0
  85. package/dist/sandbox/seccomp.js.map +1 -0
  86. package/dist/sandbox/worker.d.ts +1 -0
  87. package/dist/sandbox/worker.js +73 -0
  88. package/dist/sandbox/worker.js.map +1 -0
  89. package/dist/signals.d.ts +10 -0
  90. package/dist/signals.js +21 -0
  91. package/dist/signals.js.map +1 -0
  92. package/dist/startup.d.ts +22 -0
  93. package/dist/startup.js +100 -0
  94. package/dist/startup.js.map +1 -0
  95. package/dist/tools/controller.d.ts +63 -0
  96. package/dist/tools/controller.js +286 -0
  97. package/dist/tools/controller.js.map +1 -0
  98. package/dist/tools/external.d.ts +30 -0
  99. package/dist/tools/external.js +24 -0
  100. package/dist/tools/external.js.map +1 -0
  101. package/dist/tools/mcp.d.ts +17 -0
  102. package/dist/tools/mcp.js +186 -0
  103. package/dist/tools/mcp.js.map +1 -0
  104. package/docs/publishing.md +73 -0
  105. package/docs/security/dependencies.md +43 -0
  106. package/docs/testing/auto-review-protection.md +130 -0
  107. package/docs/usage.md +217 -0
  108. package/native/execpolicy/LICENSE +201 -0
  109. package/native/execpolicy/NOTICE +6 -0
  110. package/node_modules/@anthropic-ai/sandbox-runtime/LICENSE +201 -0
  111. package/node_modules/@anthropic-ai/sandbox-runtime/README.md +901 -0
  112. package/node_modules/@anthropic-ai/sandbox-runtime/dist/cli.d.ts +3 -0
  113. package/node_modules/@anthropic-ai/sandbox-runtime/dist/cli.d.ts.map +1 -0
  114. package/node_modules/@anthropic-ai/sandbox-runtime/dist/cli.js +472 -0
  115. package/node_modules/@anthropic-ai/sandbox-runtime/dist/cli.js.map +1 -0
  116. package/node_modules/@anthropic-ai/sandbox-runtime/dist/index.d.ts +19 -0
  117. package/node_modules/@anthropic-ai/sandbox-runtime/dist/index.d.ts.map +1 -0
  118. package/node_modules/@anthropic-ai/sandbox-runtime/dist/index.js +17 -0
  119. package/node_modules/@anthropic-ai/sandbox-runtime/dist/index.js.map +1 -0
  120. package/node_modules/@anthropic-ai/sandbox-runtime/dist/sandbox/address.d.ts +52 -0
  121. package/node_modules/@anthropic-ai/sandbox-runtime/dist/sandbox/address.d.ts.map +1 -0
  122. package/node_modules/@anthropic-ai/sandbox-runtime/dist/sandbox/address.js +153 -0
  123. package/node_modules/@anthropic-ai/sandbox-runtime/dist/sandbox/address.js.map +1 -0
  124. package/node_modules/@anthropic-ai/sandbox-runtime/dist/sandbox/aws-sigv4.d.ts +164 -0
  125. package/node_modules/@anthropic-ai/sandbox-runtime/dist/sandbox/aws-sigv4.d.ts.map +1 -0
  126. package/node_modules/@anthropic-ai/sandbox-runtime/dist/sandbox/aws-sigv4.js +246 -0
  127. package/node_modules/@anthropic-ai/sandbox-runtime/dist/sandbox/aws-sigv4.js.map +1 -0
  128. package/node_modules/@anthropic-ai/sandbox-runtime/dist/sandbox/body-substitution.d.ts +58 -0
  129. package/node_modules/@anthropic-ai/sandbox-runtime/dist/sandbox/body-substitution.d.ts.map +1 -0
  130. package/node_modules/@anthropic-ai/sandbox-runtime/dist/sandbox/body-substitution.js +128 -0
  131. package/node_modules/@anthropic-ai/sandbox-runtime/dist/sandbox/body-substitution.js.map +1 -0
  132. package/node_modules/@anthropic-ai/sandbox-runtime/dist/sandbox/credential-aws-pairs.d.ts +124 -0
  133. package/node_modules/@anthropic-ai/sandbox-runtime/dist/sandbox/credential-aws-pairs.d.ts.map +1 -0
  134. package/node_modules/@anthropic-ai/sandbox-runtime/dist/sandbox/credential-aws-pairs.js +258 -0
  135. package/node_modules/@anthropic-ai/sandbox-runtime/dist/sandbox/credential-aws-pairs.js.map +1 -0
  136. package/node_modules/@anthropic-ai/sandbox-runtime/dist/sandbox/credential-decode.d.ts +87 -0
  137. package/node_modules/@anthropic-ai/sandbox-runtime/dist/sandbox/credential-decode.d.ts.map +1 -0
  138. package/node_modules/@anthropic-ai/sandbox-runtime/dist/sandbox/credential-decode.js +138 -0
  139. package/node_modules/@anthropic-ai/sandbox-runtime/dist/sandbox/credential-decode.js.map +1 -0
  140. package/node_modules/@anthropic-ai/sandbox-runtime/dist/sandbox/credential-extract.d.ts +67 -0
  141. package/node_modules/@anthropic-ai/sandbox-runtime/dist/sandbox/credential-extract.d.ts.map +1 -0
  142. package/node_modules/@anthropic-ai/sandbox-runtime/dist/sandbox/credential-extract.js +113 -0
  143. package/node_modules/@anthropic-ai/sandbox-runtime/dist/sandbox/credential-extract.js.map +1 -0
  144. package/node_modules/@anthropic-ai/sandbox-runtime/dist/sandbox/credential-mask-env.d.ts +70 -0
  145. package/node_modules/@anthropic-ai/sandbox-runtime/dist/sandbox/credential-mask-env.d.ts.map +1 -0
  146. package/node_modules/@anthropic-ai/sandbox-runtime/dist/sandbox/credential-mask-env.js +171 -0
  147. package/node_modules/@anthropic-ai/sandbox-runtime/dist/sandbox/credential-mask-env.js.map +1 -0
  148. package/node_modules/@anthropic-ai/sandbox-runtime/dist/sandbox/credential-mask-files.d.ts +120 -0
  149. package/node_modules/@anthropic-ai/sandbox-runtime/dist/sandbox/credential-mask-files.d.ts.map +1 -0
  150. package/node_modules/@anthropic-ai/sandbox-runtime/dist/sandbox/credential-mask-files.js +281 -0
  151. package/node_modules/@anthropic-ai/sandbox-runtime/dist/sandbox/credential-mask-files.js.map +1 -0
  152. package/node_modules/@anthropic-ai/sandbox-runtime/dist/sandbox/credential-sentinel.d.ts +108 -0
  153. package/node_modules/@anthropic-ai/sandbox-runtime/dist/sandbox/credential-sentinel.d.ts.map +1 -0
  154. package/node_modules/@anthropic-ai/sandbox-runtime/dist/sandbox/credential-sentinel.js +208 -0
  155. package/node_modules/@anthropic-ai/sandbox-runtime/dist/sandbox/credential-sentinel.js.map +1 -0
  156. package/node_modules/@anthropic-ai/sandbox-runtime/dist/sandbox/domain-pattern.d.ts +82 -0
  157. package/node_modules/@anthropic-ai/sandbox-runtime/dist/sandbox/domain-pattern.d.ts.map +1 -0
  158. package/node_modules/@anthropic-ai/sandbox-runtime/dist/sandbox/domain-pattern.js +155 -0
  159. package/node_modules/@anthropic-ai/sandbox-runtime/dist/sandbox/domain-pattern.js.map +1 -0
  160. package/node_modules/@anthropic-ai/sandbox-runtime/dist/sandbox/generate-seccomp-filter.d.ts +44 -0
  161. package/node_modules/@anthropic-ai/sandbox-runtime/dist/sandbox/generate-seccomp-filter.d.ts.map +1 -0
  162. package/node_modules/@anthropic-ai/sandbox-runtime/dist/sandbox/generate-seccomp-filter.js +220 -0
  163. package/node_modules/@anthropic-ai/sandbox-runtime/dist/sandbox/generate-seccomp-filter.js.map +1 -0
  164. package/node_modules/@anthropic-ai/sandbox-runtime/dist/sandbox/http-proxy.d.ts +150 -0
  165. package/node_modules/@anthropic-ai/sandbox-runtime/dist/sandbox/http-proxy.d.ts.map +1 -0
  166. package/node_modules/@anthropic-ai/sandbox-runtime/dist/sandbox/http-proxy.js +678 -0
  167. package/node_modules/@anthropic-ai/sandbox-runtime/dist/sandbox/http-proxy.js.map +1 -0
  168. package/node_modules/@anthropic-ai/sandbox-runtime/dist/sandbox/java-proxy-agent.d.ts +32 -0
  169. package/node_modules/@anthropic-ai/sandbox-runtime/dist/sandbox/java-proxy-agent.d.ts.map +1 -0
  170. package/node_modules/@anthropic-ai/sandbox-runtime/dist/sandbox/java-proxy-agent.js +111 -0
  171. package/node_modules/@anthropic-ai/sandbox-runtime/dist/sandbox/java-proxy-agent.js.map +1 -0
  172. package/node_modules/@anthropic-ai/sandbox-runtime/dist/sandbox/linux-sandbox-utils.d.ts +305 -0
  173. package/node_modules/@anthropic-ai/sandbox-runtime/dist/sandbox/linux-sandbox-utils.d.ts.map +1 -0
  174. package/node_modules/@anthropic-ai/sandbox-runtime/dist/sandbox/linux-sandbox-utils.js +2605 -0
  175. package/node_modules/@anthropic-ai/sandbox-runtime/dist/sandbox/linux-sandbox-utils.js.map +1 -0
  176. package/node_modules/@anthropic-ai/sandbox-runtime/dist/sandbox/linux-violation-monitor.d.ts +55 -0
  177. package/node_modules/@anthropic-ai/sandbox-runtime/dist/sandbox/linux-violation-monitor.d.ts.map +1 -0
  178. package/node_modules/@anthropic-ai/sandbox-runtime/dist/sandbox/linux-violation-monitor.js +152 -0
  179. package/node_modules/@anthropic-ai/sandbox-runtime/dist/sandbox/linux-violation-monitor.js.map +1 -0
  180. package/node_modules/@anthropic-ai/sandbox-runtime/dist/sandbox/listen-in-range.d.ts +12 -0
  181. package/node_modules/@anthropic-ai/sandbox-runtime/dist/sandbox/listen-in-range.d.ts.map +1 -0
  182. package/node_modules/@anthropic-ai/sandbox-runtime/dist/sandbox/listen-in-range.js +43 -0
  183. package/node_modules/@anthropic-ai/sandbox-runtime/dist/sandbox/listen-in-range.js.map +1 -0
  184. package/node_modules/@anthropic-ai/sandbox-runtime/dist/sandbox/macos-sandbox-utils.d.ts +116 -0
  185. package/node_modules/@anthropic-ai/sandbox-runtime/dist/sandbox/macos-sandbox-utils.d.ts.map +1 -0
  186. package/node_modules/@anthropic-ai/sandbox-runtime/dist/sandbox/macos-sandbox-utils.js +1195 -0
  187. package/node_modules/@anthropic-ai/sandbox-runtime/dist/sandbox/macos-sandbox-utils.js.map +1 -0
  188. package/node_modules/@anthropic-ai/sandbox-runtime/dist/sandbox/mitm-ca.d.ts +200 -0
  189. package/node_modules/@anthropic-ai/sandbox-runtime/dist/sandbox/mitm-ca.d.ts.map +1 -0
  190. package/node_modules/@anthropic-ai/sandbox-runtime/dist/sandbox/mitm-ca.js +443 -0
  191. package/node_modules/@anthropic-ai/sandbox-runtime/dist/sandbox/mitm-ca.js.map +1 -0
  192. package/node_modules/@anthropic-ai/sandbox-runtime/dist/sandbox/mitm-leaf.d.ts +28 -0
  193. package/node_modules/@anthropic-ai/sandbox-runtime/dist/sandbox/mitm-leaf.d.ts.map +1 -0
  194. package/node_modules/@anthropic-ai/sandbox-runtime/dist/sandbox/mitm-leaf.js +114 -0
  195. package/node_modules/@anthropic-ai/sandbox-runtime/dist/sandbox/mitm-leaf.js.map +1 -0
  196. package/node_modules/@anthropic-ai/sandbox-runtime/dist/sandbox/mux-proxy.d.ts +59 -0
  197. package/node_modules/@anthropic-ai/sandbox-runtime/dist/sandbox/mux-proxy.d.ts.map +1 -0
  198. package/node_modules/@anthropic-ai/sandbox-runtime/dist/sandbox/mux-proxy.js +159 -0
  199. package/node_modules/@anthropic-ai/sandbox-runtime/dist/sandbox/mux-proxy.js.map +1 -0
  200. package/node_modules/@anthropic-ai/sandbox-runtime/dist/sandbox/parent-proxy.d.ts +147 -0
  201. package/node_modules/@anthropic-ai/sandbox-runtime/dist/sandbox/parent-proxy.d.ts.map +1 -0
  202. package/node_modules/@anthropic-ai/sandbox-runtime/dist/sandbox/parent-proxy.js +445 -0
  203. package/node_modules/@anthropic-ai/sandbox-runtime/dist/sandbox/parent-proxy.js.map +1 -0
  204. package/node_modules/@anthropic-ai/sandbox-runtime/dist/sandbox/read-deny-glob.d.ts +17 -0
  205. package/node_modules/@anthropic-ai/sandbox-runtime/dist/sandbox/read-deny-glob.d.ts.map +1 -0
  206. package/node_modules/@anthropic-ai/sandbox-runtime/dist/sandbox/read-deny-glob.js +163 -0
  207. package/node_modules/@anthropic-ai/sandbox-runtime/dist/sandbox/read-deny-glob.js.map +1 -0
  208. package/node_modules/@anthropic-ai/sandbox-runtime/dist/sandbox/request-filter.d.ts +83 -0
  209. package/node_modules/@anthropic-ai/sandbox-runtime/dist/sandbox/request-filter.d.ts.map +1 -0
  210. package/node_modules/@anthropic-ai/sandbox-runtime/dist/sandbox/request-filter.js +212 -0
  211. package/node_modules/@anthropic-ai/sandbox-runtime/dist/sandbox/request-filter.js.map +1 -0
  212. package/node_modules/@anthropic-ai/sandbox-runtime/dist/sandbox/resolved-address-guard.d.ts +76 -0
  213. package/node_modules/@anthropic-ai/sandbox-runtime/dist/sandbox/resolved-address-guard.d.ts.map +1 -0
  214. package/node_modules/@anthropic-ai/sandbox-runtime/dist/sandbox/resolved-address-guard.js +221 -0
  215. package/node_modules/@anthropic-ai/sandbox-runtime/dist/sandbox/resolved-address-guard.js.map +1 -0
  216. package/node_modules/@anthropic-ai/sandbox-runtime/dist/sandbox/sandbox-config.d.ts +1691 -0
  217. package/node_modules/@anthropic-ai/sandbox-runtime/dist/sandbox/sandbox-config.d.ts.map +1 -0
  218. package/node_modules/@anthropic-ai/sandbox-runtime/dist/sandbox/sandbox-config.js +1233 -0
  219. package/node_modules/@anthropic-ai/sandbox-runtime/dist/sandbox/sandbox-config.js.map +1 -0
  220. package/node_modules/@anthropic-ai/sandbox-runtime/dist/sandbox/sandbox-manager.d.ts +97 -0
  221. package/node_modules/@anthropic-ai/sandbox-runtime/dist/sandbox/sandbox-manager.d.ts.map +1 -0
  222. package/node_modules/@anthropic-ai/sandbox-runtime/dist/sandbox/sandbox-manager.js +1937 -0
  223. package/node_modules/@anthropic-ai/sandbox-runtime/dist/sandbox/sandbox-manager.js.map +1 -0
  224. package/node_modules/@anthropic-ai/sandbox-runtime/dist/sandbox/sandbox-schemas.d.ts +113 -0
  225. package/node_modules/@anthropic-ai/sandbox-runtime/dist/sandbox/sandbox-schemas.d.ts.map +1 -0
  226. package/node_modules/@anthropic-ai/sandbox-runtime/dist/sandbox/sandbox-schemas.js +3 -0
  227. package/node_modules/@anthropic-ai/sandbox-runtime/dist/sandbox/sandbox-schemas.js.map +1 -0
  228. package/node_modules/@anthropic-ai/sandbox-runtime/dist/sandbox/sandbox-utils.d.ts +411 -0
  229. package/node_modules/@anthropic-ai/sandbox-runtime/dist/sandbox/sandbox-utils.d.ts.map +1 -0
  230. package/node_modules/@anthropic-ai/sandbox-runtime/dist/sandbox/sandbox-utils.js +1408 -0
  231. package/node_modules/@anthropic-ai/sandbox-runtime/dist/sandbox/sandbox-utils.js.map +1 -0
  232. package/node_modules/@anthropic-ai/sandbox-runtime/dist/sandbox/sandbox-violation-store.d.ts +37 -0
  233. package/node_modules/@anthropic-ai/sandbox-runtime/dist/sandbox/sandbox-violation-store.d.ts.map +1 -0
  234. package/node_modules/@anthropic-ai/sandbox-runtime/dist/sandbox/sandbox-violation-store.js +125 -0
  235. package/node_modules/@anthropic-ai/sandbox-runtime/dist/sandbox/sandbox-violation-store.js.map +1 -0
  236. package/node_modules/@anthropic-ai/sandbox-runtime/dist/sandbox/socks-proxy.d.ts +57 -0
  237. package/node_modules/@anthropic-ai/sandbox-runtime/dist/sandbox/socks-proxy.d.ts.map +1 -0
  238. package/node_modules/@anthropic-ai/sandbox-runtime/dist/sandbox/socks-proxy.js +332 -0
  239. package/node_modules/@anthropic-ai/sandbox-runtime/dist/sandbox/socks-proxy.js.map +1 -0
  240. package/node_modules/@anthropic-ai/sandbox-runtime/dist/sandbox/tls-terminate-proxy.d.ts +100 -0
  241. package/node_modules/@anthropic-ai/sandbox-runtime/dist/sandbox/tls-terminate-proxy.d.ts.map +1 -0
  242. package/node_modules/@anthropic-ai/sandbox-runtime/dist/sandbox/tls-terminate-proxy.js +546 -0
  243. package/node_modules/@anthropic-ai/sandbox-runtime/dist/sandbox/tls-terminate-proxy.js.map +1 -0
  244. package/node_modules/@anthropic-ai/sandbox-runtime/dist/sandbox/windows-sandbox-utils.d.ts +923 -0
  245. package/node_modules/@anthropic-ai/sandbox-runtime/dist/sandbox/windows-sandbox-utils.d.ts.map +1 -0
  246. package/node_modules/@anthropic-ai/sandbox-runtime/dist/sandbox/windows-sandbox-utils.js +1419 -0
  247. package/node_modules/@anthropic-ai/sandbox-runtime/dist/sandbox/windows-sandbox-utils.js.map +1 -0
  248. package/node_modules/@anthropic-ai/sandbox-runtime/dist/utils/config-loader.d.ts +31 -0
  249. package/node_modules/@anthropic-ai/sandbox-runtime/dist/utils/config-loader.d.ts.map +1 -0
  250. package/node_modules/@anthropic-ai/sandbox-runtime/dist/utils/config-loader.js +69 -0
  251. package/node_modules/@anthropic-ai/sandbox-runtime/dist/utils/config-loader.js.map +1 -0
  252. package/node_modules/@anthropic-ai/sandbox-runtime/dist/utils/debug.d.ts +7 -0
  253. package/node_modules/@anthropic-ai/sandbox-runtime/dist/utils/debug.d.ts.map +1 -0
  254. package/node_modules/@anthropic-ai/sandbox-runtime/dist/utils/debug.js +25 -0
  255. package/node_modules/@anthropic-ai/sandbox-runtime/dist/utils/debug.js.map +1 -0
  256. package/node_modules/@anthropic-ai/sandbox-runtime/dist/utils/platform.d.ts +15 -0
  257. package/node_modules/@anthropic-ai/sandbox-runtime/dist/utils/platform.d.ts.map +1 -0
  258. package/node_modules/@anthropic-ai/sandbox-runtime/dist/utils/platform.js +49 -0
  259. package/node_modules/@anthropic-ai/sandbox-runtime/dist/utils/platform.js.map +1 -0
  260. package/node_modules/@anthropic-ai/sandbox-runtime/dist/utils/ripgrep.d.ts +17 -0
  261. package/node_modules/@anthropic-ai/sandbox-runtime/dist/utils/ripgrep.d.ts.map +1 -0
  262. package/node_modules/@anthropic-ai/sandbox-runtime/dist/utils/ripgrep.js +37 -0
  263. package/node_modules/@anthropic-ai/sandbox-runtime/dist/utils/ripgrep.js.map +1 -0
  264. package/node_modules/@anthropic-ai/sandbox-runtime/dist/utils/shell-quote.d.ts +27 -0
  265. package/node_modules/@anthropic-ai/sandbox-runtime/dist/utils/shell-quote.d.ts.map +1 -0
  266. package/node_modules/@anthropic-ai/sandbox-runtime/dist/utils/shell-quote.js +47 -0
  267. package/node_modules/@anthropic-ai/sandbox-runtime/dist/utils/shell-quote.js.map +1 -0
  268. package/node_modules/@anthropic-ai/sandbox-runtime/dist/utils/which.d.ts +9 -0
  269. package/node_modules/@anthropic-ai/sandbox-runtime/dist/utils/which.d.ts.map +1 -0
  270. package/node_modules/@anthropic-ai/sandbox-runtime/dist/utils/which.js +25 -0
  271. package/node_modules/@anthropic-ai/sandbox-runtime/dist/utils/which.js.map +1 -0
  272. package/node_modules/@anthropic-ai/sandbox-runtime/package.json +88 -0
  273. package/node_modules/@anthropic-ai/sandbox-runtime/vendor/java-proxy-agent/build.ts +95 -0
  274. package/node_modules/@anthropic-ai/sandbox-runtime/vendor/java-proxy-agent/srt-proxy-agent.jar +0 -0
  275. package/node_modules/@anthropic-ai/sandbox-runtime/vendor/seccomp/arm64/apply-seccomp +0 -0
  276. package/node_modules/@anthropic-ai/sandbox-runtime/vendor/seccomp/build.ts +69 -0
  277. package/node_modules/@anthropic-ai/sandbox-runtime/vendor/seccomp/x64/apply-seccomp +0 -0
  278. package/node_modules/@anthropic-ai/sandbox-runtime/vendor/srt-win/arm64/srt-win.exe +0 -0
  279. package/node_modules/@anthropic-ai/sandbox-runtime/vendor/srt-win/build.ts +28 -0
  280. package/node_modules/@anthropic-ai/sandbox-runtime/vendor/srt-win/x64/srt-win.exe +0 -0
  281. package/node_modules/@pondwader/socks5-server/.github/workflows/ci.yml +27 -0
  282. package/node_modules/@pondwader/socks5-server/LICENSE +20 -0
  283. package/node_modules/@pondwader/socks5-server/README.md +151 -0
  284. package/node_modules/@pondwader/socks5-server/dist/index.d.mts +87 -0
  285. package/node_modules/@pondwader/socks5-server/dist/index.d.ts +87 -0
  286. package/node_modules/@pondwader/socks5-server/dist/index.js +346 -0
  287. package/node_modules/@pondwader/socks5-server/dist/index.mjs +307 -0
  288. package/node_modules/@pondwader/socks5-server/package.json +31 -0
  289. package/node_modules/commander/LICENSE +22 -0
  290. package/node_modules/commander/Readme.md +1157 -0
  291. package/node_modules/commander/esm.mjs +16 -0
  292. package/node_modules/commander/index.js +24 -0
  293. package/node_modules/commander/lib/argument.js +149 -0
  294. package/node_modules/commander/lib/command.js +2509 -0
  295. package/node_modules/commander/lib/error.js +39 -0
  296. package/node_modules/commander/lib/help.js +520 -0
  297. package/node_modules/commander/lib/option.js +330 -0
  298. package/node_modules/commander/lib/suggestSimilar.js +101 -0
  299. package/node_modules/commander/package-support.json +16 -0
  300. package/node_modules/commander/package.json +84 -0
  301. package/node_modules/commander/typings/esm.d.mts +3 -0
  302. package/node_modules/commander/typings/index.d.ts +969 -0
  303. package/node_modules/node-forge/.editorconfig +17 -0
  304. package/node_modules/node-forge/.eslintrc.js +24 -0
  305. package/node_modules/node-forge/.github/workflows/main.yaml +96 -0
  306. package/node_modules/node-forge/.istanbul.yml +2 -0
  307. package/node_modules/node-forge/.npmignore +15 -0
  308. package/node_modules/node-forge/CHANGELOG.md +555 -0
  309. package/node_modules/node-forge/CONTRIBUTING.md +18 -0
  310. package/node_modules/node-forge/LICENSE +331 -0
  311. package/node_modules/node-forge/README.md +2071 -0
  312. package/node_modules/node-forge/RELEASE.md +19 -0
  313. package/node_modules/node-forge/SECURITY.md +5 -0
  314. package/node_modules/node-forge/examples/create-cert.js +110 -0
  315. package/node_modules/node-forge/examples/create-csr.js +66 -0
  316. package/node_modules/node-forge/examples/create-pkcs12.js +160 -0
  317. package/node_modules/node-forge/examples/imap.js +46 -0
  318. package/node_modules/node-forge/examples/sign-p7.js +115 -0
  319. package/node_modules/node-forge/examples/tls.js +189 -0
  320. package/node_modules/node-forge/flash/PooledSocket.as +18 -0
  321. package/node_modules/node-forge/flash/README.md +48 -0
  322. package/node_modules/node-forge/flash/SocketEvent.as +36 -0
  323. package/node_modules/node-forge/flash/SocketPool.as +754 -0
  324. package/node_modules/node-forge/flash/mod_fsp/README +135 -0
  325. package/node_modules/node-forge/flash/mod_fsp/mod_fsp.c +415 -0
  326. package/node_modules/node-forge/flash/package.json +28 -0
  327. package/node_modules/node-forge/flash/policyserver.js +65 -0
  328. package/node_modules/node-forge/flash/policyserver.py +112 -0
  329. package/node_modules/node-forge/flash/swf/SocketPool.swf +0 -0
  330. package/node_modules/node-forge/karma-sauce.conf.js +79 -0
  331. package/node_modules/node-forge/karma.conf.js +133 -0
  332. package/node_modules/node-forge/lib/aes.js +1091 -0
  333. package/node_modules/node-forge/lib/aesCipherSuites.js +282 -0
  334. package/node_modules/node-forge/lib/asn1-validator.js +91 -0
  335. package/node_modules/node-forge/lib/asn1.js +1503 -0
  336. package/node_modules/node-forge/lib/baseN.js +186 -0
  337. package/node_modules/node-forge/lib/cipher.js +230 -0
  338. package/node_modules/node-forge/lib/cipherModes.js +999 -0
  339. package/node_modules/node-forge/lib/des.js +496 -0
  340. package/node_modules/node-forge/lib/ed25519.js +1091 -0
  341. package/node_modules/node-forge/lib/forge.js +13 -0
  342. package/node_modules/node-forge/lib/form.js +149 -0
  343. package/node_modules/node-forge/lib/hmac.js +146 -0
  344. package/node_modules/node-forge/lib/http.js +1346 -0
  345. package/node_modules/node-forge/lib/index.all.js +16 -0
  346. package/node_modules/node-forge/lib/index.js +33 -0
  347. package/node_modules/node-forge/lib/jsbn.js +1294 -0
  348. package/node_modules/node-forge/lib/kem.js +168 -0
  349. package/node_modules/node-forge/lib/log.js +319 -0
  350. package/node_modules/node-forge/lib/md.all.js +13 -0
  351. package/node_modules/node-forge/lib/md.js +11 -0
  352. package/node_modules/node-forge/lib/md5.js +289 -0
  353. package/node_modules/node-forge/lib/mgf.js +12 -0
  354. package/node_modules/node-forge/lib/mgf1.js +57 -0
  355. package/node_modules/node-forge/lib/oids.js +180 -0
  356. package/node_modules/node-forge/lib/pbe.js +1023 -0
  357. package/node_modules/node-forge/lib/pbkdf2.js +211 -0
  358. package/node_modules/node-forge/lib/pem.js +237 -0
  359. package/node_modules/node-forge/lib/pkcs1.js +276 -0
  360. package/node_modules/node-forge/lib/pkcs12.js +1078 -0
  361. package/node_modules/node-forge/lib/pkcs7.js +1260 -0
  362. package/node_modules/node-forge/lib/pkcs7asn1.js +410 -0
  363. package/node_modules/node-forge/lib/pki.js +102 -0
  364. package/node_modules/node-forge/lib/prime.js +297 -0
  365. package/node_modules/node-forge/lib/prime.worker.js +168 -0
  366. package/node_modules/node-forge/lib/prng.js +419 -0
  367. package/node_modules/node-forge/lib/pss.js +241 -0
  368. package/node_modules/node-forge/lib/random.js +191 -0
  369. package/node_modules/node-forge/lib/rc2.js +410 -0
  370. package/node_modules/node-forge/lib/rsa.js +1973 -0
  371. package/node_modules/node-forge/lib/sha1.js +319 -0
  372. package/node_modules/node-forge/lib/sha256.js +327 -0
  373. package/node_modules/node-forge/lib/sha512.js +561 -0
  374. package/node_modules/node-forge/lib/socket.js +287 -0
  375. package/node_modules/node-forge/lib/ssh.js +236 -0
  376. package/node_modules/node-forge/lib/tls.js +4282 -0
  377. package/node_modules/node-forge/lib/tlssocket.js +249 -0
  378. package/node_modules/node-forge/lib/util.js +2652 -0
  379. package/node_modules/node-forge/lib/x509.js +3251 -0
  380. package/node_modules/node-forge/lib/xhr.js +738 -0
  381. package/node_modules/node-forge/package.json +123 -0
  382. package/node_modules/node-forge/tests/.eslintrc.js +5 -0
  383. package/node_modules/node-forge/tests/README.md +4 -0
  384. package/node_modules/node-forge/tests/benchmarks/aes-speed.js +62 -0
  385. package/node_modules/node-forge/tests/benchmarks/so-44303784.js +246 -0
  386. package/node_modules/node-forge/tests/flash/README.md +7 -0
  387. package/node_modules/node-forge/tests/flash/Test.as +96 -0
  388. package/node_modules/node-forge/tests/flash/build-flash.xml +7 -0
  389. package/node_modules/node-forge/tests/flash/index.html +28 -0
  390. package/node_modules/node-forge/tests/index.html +33 -0
  391. package/node_modules/node-forge/tests/issues/heartbleed.js +55 -0
  392. package/node_modules/node-forge/tests/issues/issue-428.html +95 -0
  393. package/node_modules/node-forge/tests/issues/issue-428.js +375 -0
  394. package/node_modules/node-forge/tests/karma/index.js +8 -0
  395. package/node_modules/node-forge/tests/karma/testWorker.js +65 -0
  396. package/node_modules/node-forge/tests/karma/web-worker-rsa.js +55 -0
  397. package/node_modules/node-forge/tests/legacy/common.html +65 -0
  398. package/node_modules/node-forge/tests/legacy/common.js +2199 -0
  399. package/node_modules/node-forge/tests/legacy/form.html +148 -0
  400. package/node_modules/node-forge/tests/legacy/form.js +40 -0
  401. package/node_modules/node-forge/tests/legacy/http.html +235 -0
  402. package/node_modules/node-forge/tests/legacy/index.html +70 -0
  403. package/node_modules/node-forge/tests/legacy/keygen.html +113 -0
  404. package/node_modules/node-forge/tests/legacy/login.css +26 -0
  405. package/node_modules/node-forge/tests/legacy/loginDemo.html +32 -0
  406. package/node_modules/node-forge/tests/legacy/loginDemo.js +149 -0
  407. package/node_modules/node-forge/tests/legacy/performance.html +533 -0
  408. package/node_modules/node-forge/tests/legacy/result.txt +1 -0
  409. package/node_modules/node-forge/tests/legacy/socketPool.html +302 -0
  410. package/node_modules/node-forge/tests/legacy/tasks.html +54 -0
  411. package/node_modules/node-forge/tests/legacy/tasks.js +378 -0
  412. package/node_modules/node-forge/tests/legacy/tls.html +389 -0
  413. package/node_modules/node-forge/tests/legacy/webid.html +89 -0
  414. package/node_modules/node-forge/tests/legacy/webid.js +313 -0
  415. package/node_modules/node-forge/tests/legacy/ws-webid.js +120 -0
  416. package/node_modules/node-forge/tests/legacy/xhr.html +67 -0
  417. package/node_modules/node-forge/tests/legacy/xhr.js +590 -0
  418. package/node_modules/node-forge/tests/pocs/ghsa-2328-f5f3-gj25.js +85 -0
  419. package/node_modules/node-forge/tests/pocs/ghsa-ppp5-5v6c-4jwp.js +166 -0
  420. package/node_modules/node-forge/tests/pocs/ghsa-q67f-28xg-22rw.js +103 -0
  421. package/node_modules/node-forge/tests/security/cve-2025-12816.js +75 -0
  422. package/node_modules/node-forge/tests/security/ghsa-554w-wpv2-vw27.js +81 -0
  423. package/node_modules/node-forge/tests/security/index.js +3 -0
  424. package/node_modules/node-forge/tests/server.crt +26 -0
  425. package/node_modules/node-forge/tests/server.js +87 -0
  426. package/node_modules/node-forge/tests/server.key +27 -0
  427. package/node_modules/node-forge/tests/support/task.js +718 -0
  428. package/node_modules/node-forge/tests/tests.css +61 -0
  429. package/node_modules/node-forge/tests/unit/aes.js +1498 -0
  430. package/node_modules/node-forge/tests/unit/asn1.js +1337 -0
  431. package/node_modules/node-forge/tests/unit/csr.js +129 -0
  432. package/node_modules/node-forge/tests/unit/des.js +231 -0
  433. package/node_modules/node-forge/tests/unit/ed25519.js +395 -0
  434. package/node_modules/node-forge/tests/unit/forge.js +2 -0
  435. package/node_modules/node-forge/tests/unit/hmac.js +64 -0
  436. package/node_modules/node-forge/tests/unit/index.html +20 -0
  437. package/node_modules/node-forge/tests/unit/index.js +27 -0
  438. package/node_modules/node-forge/tests/unit/jsbn.js +40 -0
  439. package/node_modules/node-forge/tests/unit/kem.js +167 -0
  440. package/node_modules/node-forge/tests/unit/md5.js +114 -0
  441. package/node_modules/node-forge/tests/unit/mgf1.js +16 -0
  442. package/node_modules/node-forge/tests/unit/pbkdf2.js +182 -0
  443. package/node_modules/node-forge/tests/unit/pem.js +159 -0
  444. package/node_modules/node-forge/tests/unit/pkcs1.js +1077 -0
  445. package/node_modules/node-forge/tests/unit/pkcs12.js +739 -0
  446. package/node_modules/node-forge/tests/unit/pkcs7.js +792 -0
  447. package/node_modules/node-forge/tests/unit/random.js +48 -0
  448. package/node_modules/node-forge/tests/unit/rc2.js +88 -0
  449. package/node_modules/node-forge/tests/unit/rsa.js +1278 -0
  450. package/node_modules/node-forge/tests/unit/sha1.js +72 -0
  451. package/node_modules/node-forge/tests/unit/sha256.js +79 -0
  452. package/node_modules/node-forge/tests/unit/sha512.js +200 -0
  453. package/node_modules/node-forge/tests/unit/ssh.js +175 -0
  454. package/node_modules/node-forge/tests/unit/tls.js +175 -0
  455. package/node_modules/node-forge/tests/unit/util.js +595 -0
  456. package/node_modules/node-forge/tests/unit/x509.js +1986 -0
  457. package/node_modules/node-forge/tests/websockets/server-webid.js +495 -0
  458. package/node_modules/node-forge/tests/websockets/server-ws.js +158 -0
  459. package/node_modules/node-forge/webpack-tests.config.js +26 -0
  460. package/node_modules/node-forge/webpack.config.js +130 -0
  461. package/node_modules/zod/LICENSE +21 -0
  462. package/node_modules/zod/README.md +208 -0
  463. package/node_modules/zod/index.cjs +33 -0
  464. package/node_modules/zod/index.d.cts +4 -0
  465. package/node_modules/zod/index.d.ts +4 -0
  466. package/node_modules/zod/index.js +4 -0
  467. package/node_modules/zod/package.json +118 -0
  468. package/node_modules/zod/src/index.ts +4 -0
  469. package/node_modules/zod/src/v3/ZodError.ts +330 -0
  470. package/node_modules/zod/src/v3/benchmarks/datetime.ts +58 -0
  471. package/node_modules/zod/src/v3/benchmarks/discriminatedUnion.ts +80 -0
  472. package/node_modules/zod/src/v3/benchmarks/index.ts +59 -0
  473. package/node_modules/zod/src/v3/benchmarks/ipv4.ts +57 -0
  474. package/node_modules/zod/src/v3/benchmarks/object.ts +69 -0
  475. package/node_modules/zod/src/v3/benchmarks/primitives.ts +162 -0
  476. package/node_modules/zod/src/v3/benchmarks/realworld.ts +63 -0
  477. package/node_modules/zod/src/v3/benchmarks/string.ts +55 -0
  478. package/node_modules/zod/src/v3/benchmarks/union.ts +80 -0
  479. package/node_modules/zod/src/v3/errors.ts +13 -0
  480. package/node_modules/zod/src/v3/external.ts +6 -0
  481. package/node_modules/zod/src/v3/helpers/enumUtil.ts +17 -0
  482. package/node_modules/zod/src/v3/helpers/errorUtil.ts +8 -0
  483. package/node_modules/zod/src/v3/helpers/parseUtil.ts +176 -0
  484. package/node_modules/zod/src/v3/helpers/partialUtil.ts +34 -0
  485. package/node_modules/zod/src/v3/helpers/typeAliases.ts +2 -0
  486. package/node_modules/zod/src/v3/helpers/util.ts +224 -0
  487. package/node_modules/zod/src/v3/index.ts +4 -0
  488. package/node_modules/zod/src/v3/locales/en.ts +124 -0
  489. package/node_modules/zod/src/v3/standard-schema.ts +113 -0
  490. package/node_modules/zod/src/v3/tests/Mocker.ts +54 -0
  491. package/node_modules/zod/src/v3/tests/all-errors.test.ts +157 -0
  492. package/node_modules/zod/src/v3/tests/anyunknown.test.ts +28 -0
  493. package/node_modules/zod/src/v3/tests/array.test.ts +71 -0
  494. package/node_modules/zod/src/v3/tests/async-parsing.test.ts +388 -0
  495. package/node_modules/zod/src/v3/tests/async-refinements.test.ts +46 -0
  496. package/node_modules/zod/src/v3/tests/base.test.ts +29 -0
  497. package/node_modules/zod/src/v3/tests/bigint.test.ts +55 -0
  498. package/node_modules/zod/src/v3/tests/branded.test.ts +53 -0
  499. package/node_modules/zod/src/v3/tests/catch.test.ts +220 -0
  500. package/node_modules/zod/src/v3/tests/coerce.test.ts +133 -0
  501. package/node_modules/zod/src/v3/tests/complex.test.ts +56 -0
  502. package/node_modules/zod/src/v3/tests/custom.test.ts +31 -0
  503. package/node_modules/zod/src/v3/tests/date.test.ts +32 -0
  504. package/node_modules/zod/src/v3/tests/deepmasking.test.ts +186 -0
  505. package/node_modules/zod/src/v3/tests/default.test.ts +112 -0
  506. package/node_modules/zod/src/v3/tests/description.test.ts +33 -0
  507. package/node_modules/zod/src/v3/tests/discriminated-unions.test.ts +315 -0
  508. package/node_modules/zod/src/v3/tests/enum.test.ts +80 -0
  509. package/node_modules/zod/src/v3/tests/error.test.ts +551 -0
  510. package/node_modules/zod/src/v3/tests/firstparty.test.ts +87 -0
  511. package/node_modules/zod/src/v3/tests/firstpartyschematypes.test.ts +21 -0
  512. package/node_modules/zod/src/v3/tests/function.test.ts +257 -0
  513. package/node_modules/zod/src/v3/tests/generics.test.ts +48 -0
  514. package/node_modules/zod/src/v3/tests/instanceof.test.ts +37 -0
  515. package/node_modules/zod/src/v3/tests/intersection.test.ts +110 -0
  516. package/node_modules/zod/src/v3/tests/language-server.source.ts +76 -0
  517. package/node_modules/zod/src/v3/tests/language-server.test.ts +207 -0
  518. package/node_modules/zod/src/v3/tests/literal.test.ts +36 -0
  519. package/node_modules/zod/src/v3/tests/map.test.ts +110 -0
  520. package/node_modules/zod/src/v3/tests/masking.test.ts +4 -0
  521. package/node_modules/zod/src/v3/tests/mocker.test.ts +19 -0
  522. package/node_modules/zod/src/v3/tests/nan.test.ts +21 -0
  523. package/node_modules/zod/src/v3/tests/nativeEnum.test.ts +87 -0
  524. package/node_modules/zod/src/v3/tests/nullable.test.ts +42 -0
  525. package/node_modules/zod/src/v3/tests/number.test.ts +176 -0
  526. package/node_modules/zod/src/v3/tests/object-augmentation.test.ts +29 -0
  527. package/node_modules/zod/src/v3/tests/object-in-es5-env.test.ts +29 -0
  528. package/node_modules/zod/src/v3/tests/object.test.ts +434 -0
  529. package/node_modules/zod/src/v3/tests/optional.test.ts +42 -0
  530. package/node_modules/zod/src/v3/tests/parseUtil.test.ts +23 -0
  531. package/node_modules/zod/src/v3/tests/parser.test.ts +41 -0
  532. package/node_modules/zod/src/v3/tests/partials.test.ts +243 -0
  533. package/node_modules/zod/src/v3/tests/pickomit.test.ts +111 -0
  534. package/node_modules/zod/src/v3/tests/pipeline.test.ts +29 -0
  535. package/node_modules/zod/src/v3/tests/preprocess.test.ts +186 -0
  536. package/node_modules/zod/src/v3/tests/primitive.test.ts +440 -0
  537. package/node_modules/zod/src/v3/tests/promise.test.ts +90 -0
  538. package/node_modules/zod/src/v3/tests/readonly.test.ts +194 -0
  539. package/node_modules/zod/src/v3/tests/record.test.ts +171 -0
  540. package/node_modules/zod/src/v3/tests/recursive.test.ts +197 -0
  541. package/node_modules/zod/src/v3/tests/refine.test.ts +313 -0
  542. package/node_modules/zod/src/v3/tests/safeparse.test.ts +27 -0
  543. package/node_modules/zod/src/v3/tests/set.test.ts +142 -0
  544. package/node_modules/zod/src/v3/tests/standard-schema.test.ts +83 -0
  545. package/node_modules/zod/src/v3/tests/string.test.ts +916 -0
  546. package/node_modules/zod/src/v3/tests/transformer.test.ts +233 -0
  547. package/node_modules/zod/src/v3/tests/tuple.test.ts +90 -0
  548. package/node_modules/zod/src/v3/tests/unions.test.ts +57 -0
  549. package/node_modules/zod/src/v3/tests/validations.test.ts +133 -0
  550. package/node_modules/zod/src/v3/tests/void.test.ts +15 -0
  551. package/node_modules/zod/src/v3/types.ts +5136 -0
  552. package/node_modules/zod/src/v4/classic/checks.ts +30 -0
  553. package/node_modules/zod/src/v4/classic/coerce.ts +27 -0
  554. package/node_modules/zod/src/v4/classic/compat.ts +66 -0
  555. package/node_modules/zod/src/v4/classic/errors.ts +75 -0
  556. package/node_modules/zod/src/v4/classic/external.ts +50 -0
  557. package/node_modules/zod/src/v4/classic/index.ts +5 -0
  558. package/node_modules/zod/src/v4/classic/iso.ts +90 -0
  559. package/node_modules/zod/src/v4/classic/parse.ts +33 -0
  560. package/node_modules/zod/src/v4/classic/schemas.ts +2054 -0
  561. package/node_modules/zod/src/v4/classic/tests/anyunknown.test.ts +26 -0
  562. package/node_modules/zod/src/v4/classic/tests/array.test.ts +264 -0
  563. package/node_modules/zod/src/v4/classic/tests/assignability.test.ts +210 -0
  564. package/node_modules/zod/src/v4/classic/tests/async-parsing.test.ts +381 -0
  565. package/node_modules/zod/src/v4/classic/tests/async-refinements.test.ts +68 -0
  566. package/node_modules/zod/src/v4/classic/tests/base.test.ts +7 -0
  567. package/node_modules/zod/src/v4/classic/tests/bigint.test.ts +54 -0
  568. package/node_modules/zod/src/v4/classic/tests/brand.test.ts +63 -0
  569. package/node_modules/zod/src/v4/classic/tests/catch.test.ts +252 -0
  570. package/node_modules/zod/src/v4/classic/tests/coalesce.test.ts +20 -0
  571. package/node_modules/zod/src/v4/classic/tests/coerce.test.ts +160 -0
  572. package/node_modules/zod/src/v4/classic/tests/continuability.test.ts +352 -0
  573. package/node_modules/zod/src/v4/classic/tests/custom.test.ts +40 -0
  574. package/node_modules/zod/src/v4/classic/tests/date.test.ts +31 -0
  575. package/node_modules/zod/src/v4/classic/tests/datetime.test.ts +296 -0
  576. package/node_modules/zod/src/v4/classic/tests/default.test.ts +313 -0
  577. package/node_modules/zod/src/v4/classic/tests/description.test.ts +32 -0
  578. package/node_modules/zod/src/v4/classic/tests/discriminated-unions.test.ts +619 -0
  579. package/node_modules/zod/src/v4/classic/tests/enum.test.ts +285 -0
  580. package/node_modules/zod/src/v4/classic/tests/error-utils.test.ts +527 -0
  581. package/node_modules/zod/src/v4/classic/tests/error.test.ts +711 -0
  582. package/node_modules/zod/src/v4/classic/tests/file.test.ts +91 -0
  583. package/node_modules/zod/src/v4/classic/tests/firstparty.test.ts +175 -0
  584. package/node_modules/zod/src/v4/classic/tests/function.test.ts +268 -0
  585. package/node_modules/zod/src/v4/classic/tests/generics.test.ts +72 -0
  586. package/node_modules/zod/src/v4/classic/tests/index.test.ts +829 -0
  587. package/node_modules/zod/src/v4/classic/tests/instanceof.test.ts +34 -0
  588. package/node_modules/zod/src/v4/classic/tests/intersection.test.ts +171 -0
  589. package/node_modules/zod/src/v4/classic/tests/json.test.ts +108 -0
  590. package/node_modules/zod/src/v4/classic/tests/lazy.test.ts +227 -0
  591. package/node_modules/zod/src/v4/classic/tests/literal.test.ts +92 -0
  592. package/node_modules/zod/src/v4/classic/tests/map.test.ts +196 -0
  593. package/node_modules/zod/src/v4/classic/tests/nan.test.ts +21 -0
  594. package/node_modules/zod/src/v4/classic/tests/nested-refine.test.ts +168 -0
  595. package/node_modules/zod/src/v4/classic/tests/nonoptional.test.ts +86 -0
  596. package/node_modules/zod/src/v4/classic/tests/nullable.test.ts +22 -0
  597. package/node_modules/zod/src/v4/classic/tests/number.test.ts +247 -0
  598. package/node_modules/zod/src/v4/classic/tests/object.test.ts +563 -0
  599. package/node_modules/zod/src/v4/classic/tests/optional.test.ts +123 -0
  600. package/node_modules/zod/src/v4/classic/tests/partial.test.ts +147 -0
  601. package/node_modules/zod/src/v4/classic/tests/pickomit.test.ts +127 -0
  602. package/node_modules/zod/src/v4/classic/tests/pipe.test.ts +81 -0
  603. package/node_modules/zod/src/v4/classic/tests/prefault.test.ts +37 -0
  604. package/node_modules/zod/src/v4/classic/tests/preprocess.test.ts +298 -0
  605. package/node_modules/zod/src/v4/classic/tests/primitive.test.ts +175 -0
  606. package/node_modules/zod/src/v4/classic/tests/promise.test.ts +81 -0
  607. package/node_modules/zod/src/v4/classic/tests/prototypes.test.ts +23 -0
  608. package/node_modules/zod/src/v4/classic/tests/readonly.test.ts +252 -0
  609. package/node_modules/zod/src/v4/classic/tests/record.test.ts +342 -0
  610. package/node_modules/zod/src/v4/classic/tests/recursive-types.test.ts +356 -0
  611. package/node_modules/zod/src/v4/classic/tests/refine.test.ts +532 -0
  612. package/node_modules/zod/src/v4/classic/tests/registries.test.ts +204 -0
  613. package/node_modules/zod/src/v4/classic/tests/set.test.ts +179 -0
  614. package/node_modules/zod/src/v4/classic/tests/standard-schema.test.ts +57 -0
  615. package/node_modules/zod/src/v4/classic/tests/string-formats.test.ts +109 -0
  616. package/node_modules/zod/src/v4/classic/tests/string.test.ts +881 -0
  617. package/node_modules/zod/src/v4/classic/tests/stringbool.test.ts +66 -0
  618. package/node_modules/zod/src/v4/classic/tests/template-literal.test.ts +758 -0
  619. package/node_modules/zod/src/v4/classic/tests/to-json-schema.test.ts +2314 -0
  620. package/node_modules/zod/src/v4/classic/tests/transform.test.ts +250 -0
  621. package/node_modules/zod/src/v4/classic/tests/tuple.test.ts +163 -0
  622. package/node_modules/zod/src/v4/classic/tests/union.test.ts +94 -0
  623. package/node_modules/zod/src/v4/classic/tests/validations.test.ts +283 -0
  624. package/node_modules/zod/src/v4/classic/tests/void.test.ts +12 -0
  625. package/node_modules/zod/src/v4/core/api.ts +1594 -0
  626. package/node_modules/zod/src/v4/core/checks.ts +1283 -0
  627. package/node_modules/zod/src/v4/core/config.ts +15 -0
  628. package/node_modules/zod/src/v4/core/core.ts +134 -0
  629. package/node_modules/zod/src/v4/core/doc.ts +44 -0
  630. package/node_modules/zod/src/v4/core/errors.ts +424 -0
  631. package/node_modules/zod/src/v4/core/function.ts +176 -0
  632. package/node_modules/zod/src/v4/core/index.ts +15 -0
  633. package/node_modules/zod/src/v4/core/json-schema.ts +143 -0
  634. package/node_modules/zod/src/v4/core/parse.ts +94 -0
  635. package/node_modules/zod/src/v4/core/regexes.ts +135 -0
  636. package/node_modules/zod/src/v4/core/registries.ts +96 -0
  637. package/node_modules/zod/src/v4/core/schemas.ts +3842 -0
  638. package/node_modules/zod/src/v4/core/standard-schema.ts +64 -0
  639. package/node_modules/zod/src/v4/core/tests/index.test.ts +46 -0
  640. package/node_modules/zod/src/v4/core/tests/locales/be.test.ts +124 -0
  641. package/node_modules/zod/src/v4/core/tests/locales/en.test.ts +22 -0
  642. package/node_modules/zod/src/v4/core/tests/locales/ru.test.ts +128 -0
  643. package/node_modules/zod/src/v4/core/tests/locales/tr.test.ts +69 -0
  644. package/node_modules/zod/src/v4/core/to-json-schema.ts +977 -0
  645. package/node_modules/zod/src/v4/core/util.ts +775 -0
  646. package/node_modules/zod/src/v4/core/versions.ts +5 -0
  647. package/node_modules/zod/src/v4/core/zsf.ts +323 -0
  648. package/node_modules/zod/src/v4/index.ts +4 -0
  649. package/node_modules/zod/src/v4/locales/ar.ts +125 -0
  650. package/node_modules/zod/src/v4/locales/az.ts +121 -0
  651. package/node_modules/zod/src/v4/locales/be.ts +184 -0
  652. package/node_modules/zod/src/v4/locales/ca.ts +127 -0
  653. package/node_modules/zod/src/v4/locales/cs.ts +142 -0
  654. package/node_modules/zod/src/v4/locales/de.ts +124 -0
  655. package/node_modules/zod/src/v4/locales/en.ts +127 -0
  656. package/node_modules/zod/src/v4/locales/eo.ts +125 -0
  657. package/node_modules/zod/src/v4/locales/es.ts +125 -0
  658. package/node_modules/zod/src/v4/locales/fa.ts +134 -0
  659. package/node_modules/zod/src/v4/locales/fi.ts +131 -0
  660. package/node_modules/zod/src/v4/locales/fr-CA.ts +126 -0
  661. package/node_modules/zod/src/v4/locales/fr.ts +124 -0
  662. package/node_modules/zod/src/v4/locales/he.ts +125 -0
  663. package/node_modules/zod/src/v4/locales/hu.ts +126 -0
  664. package/node_modules/zod/src/v4/locales/id.ts +125 -0
  665. package/node_modules/zod/src/v4/locales/index.ts +39 -0
  666. package/node_modules/zod/src/v4/locales/it.ts +125 -0
  667. package/node_modules/zod/src/v4/locales/ja.ts +122 -0
  668. package/node_modules/zod/src/v4/locales/kh.ts +126 -0
  669. package/node_modules/zod/src/v4/locales/ko.ts +131 -0
  670. package/node_modules/zod/src/v4/locales/mk.ts +127 -0
  671. package/node_modules/zod/src/v4/locales/ms.ts +124 -0
  672. package/node_modules/zod/src/v4/locales/nl.ts +126 -0
  673. package/node_modules/zod/src/v4/locales/no.ts +124 -0
  674. package/node_modules/zod/src/v4/locales/ota.ts +125 -0
  675. package/node_modules/zod/src/v4/locales/pl.ts +126 -0
  676. package/node_modules/zod/src/v4/locales/ps.ts +133 -0
  677. package/node_modules/zod/src/v4/locales/pt.ts +123 -0
  678. package/node_modules/zod/src/v4/locales/ru.ts +184 -0
  679. package/node_modules/zod/src/v4/locales/sl.ts +126 -0
  680. package/node_modules/zod/src/v4/locales/sv.ts +127 -0
  681. package/node_modules/zod/src/v4/locales/ta.ts +125 -0
  682. package/node_modules/zod/src/v4/locales/th.ts +126 -0
  683. package/node_modules/zod/src/v4/locales/tr.ts +121 -0
  684. package/node_modules/zod/src/v4/locales/ua.ts +126 -0
  685. package/node_modules/zod/src/v4/locales/ur.ts +126 -0
  686. package/node_modules/zod/src/v4/locales/vi.ts +125 -0
  687. package/node_modules/zod/src/v4/locales/zh-CN.ts +123 -0
  688. package/node_modules/zod/src/v4/locales/zh-TW.ts +125 -0
  689. package/node_modules/zod/src/v4/mini/checks.ts +32 -0
  690. package/node_modules/zod/src/v4/mini/coerce.ts +22 -0
  691. package/node_modules/zod/src/v4/mini/external.ts +40 -0
  692. package/node_modules/zod/src/v4/mini/index.ts +3 -0
  693. package/node_modules/zod/src/v4/mini/iso.ts +62 -0
  694. package/node_modules/zod/src/v4/mini/parse.ts +1 -0
  695. package/node_modules/zod/src/v4/mini/schemas.ts +1579 -0
  696. package/node_modules/zod/src/v4/mini/tests/assignability.test.ts +129 -0
  697. package/node_modules/zod/src/v4/mini/tests/brand.test.ts +51 -0
  698. package/node_modules/zod/src/v4/mini/tests/checks.test.ts +144 -0
  699. package/node_modules/zod/src/v4/mini/tests/computed.test.ts +36 -0
  700. package/node_modules/zod/src/v4/mini/tests/error.test.ts +22 -0
  701. package/node_modules/zod/src/v4/mini/tests/functions.test.ts +43 -0
  702. package/node_modules/zod/src/v4/mini/tests/index.test.ts +871 -0
  703. package/node_modules/zod/src/v4/mini/tests/number.test.ts +95 -0
  704. package/node_modules/zod/src/v4/mini/tests/object.test.ts +185 -0
  705. package/node_modules/zod/src/v4/mini/tests/prototypes.test.ts +43 -0
  706. package/node_modules/zod/src/v4/mini/tests/recursive-types.test.ts +275 -0
  707. package/node_modules/zod/src/v4/mini/tests/string.test.ts +299 -0
  708. package/node_modules/zod/src/v4-mini/index.ts +1 -0
  709. package/node_modules/zod/v3/ZodError.cjs +138 -0
  710. package/node_modules/zod/v3/ZodError.d.cts +164 -0
  711. package/node_modules/zod/v3/ZodError.d.ts +164 -0
  712. package/node_modules/zod/v3/ZodError.js +133 -0
  713. package/node_modules/zod/v3/errors.cjs +17 -0
  714. package/node_modules/zod/v3/errors.d.cts +5 -0
  715. package/node_modules/zod/v3/errors.d.ts +5 -0
  716. package/node_modules/zod/v3/errors.js +9 -0
  717. package/node_modules/zod/v3/external.cjs +22 -0
  718. package/node_modules/zod/v3/external.d.cts +6 -0
  719. package/node_modules/zod/v3/external.d.ts +6 -0
  720. package/node_modules/zod/v3/external.js +6 -0
  721. package/node_modules/zod/v3/helpers/enumUtil.cjs +2 -0
  722. package/node_modules/zod/v3/helpers/enumUtil.d.cts +8 -0
  723. package/node_modules/zod/v3/helpers/enumUtil.d.ts +8 -0
  724. package/node_modules/zod/v3/helpers/enumUtil.js +1 -0
  725. package/node_modules/zod/v3/helpers/errorUtil.cjs +9 -0
  726. package/node_modules/zod/v3/helpers/errorUtil.d.cts +9 -0
  727. package/node_modules/zod/v3/helpers/errorUtil.d.ts +9 -0
  728. package/node_modules/zod/v3/helpers/errorUtil.js +6 -0
  729. package/node_modules/zod/v3/helpers/parseUtil.cjs +124 -0
  730. package/node_modules/zod/v3/helpers/parseUtil.d.cts +78 -0
  731. package/node_modules/zod/v3/helpers/parseUtil.d.ts +78 -0
  732. package/node_modules/zod/v3/helpers/parseUtil.js +109 -0
  733. package/node_modules/zod/v3/helpers/partialUtil.cjs +2 -0
  734. package/node_modules/zod/v3/helpers/partialUtil.d.cts +8 -0
  735. package/node_modules/zod/v3/helpers/partialUtil.d.ts +8 -0
  736. package/node_modules/zod/v3/helpers/partialUtil.js +1 -0
  737. package/node_modules/zod/v3/helpers/typeAliases.cjs +2 -0
  738. package/node_modules/zod/v3/helpers/typeAliases.d.cts +2 -0
  739. package/node_modules/zod/v3/helpers/typeAliases.d.ts +2 -0
  740. package/node_modules/zod/v3/helpers/typeAliases.js +1 -0
  741. package/node_modules/zod/v3/helpers/util.cjs +137 -0
  742. package/node_modules/zod/v3/helpers/util.d.cts +85 -0
  743. package/node_modules/zod/v3/helpers/util.d.ts +85 -0
  744. package/node_modules/zod/v3/helpers/util.js +133 -0
  745. package/node_modules/zod/v3/index.cjs +33 -0
  746. package/node_modules/zod/v3/index.d.cts +4 -0
  747. package/node_modules/zod/v3/index.d.ts +4 -0
  748. package/node_modules/zod/v3/index.js +4 -0
  749. package/node_modules/zod/v3/locales/en.cjs +111 -0
  750. package/node_modules/zod/v3/locales/en.d.cts +3 -0
  751. package/node_modules/zod/v3/locales/en.d.ts +3 -0
  752. package/node_modules/zod/v3/locales/en.js +109 -0
  753. package/node_modules/zod/v3/standard-schema.cjs +2 -0
  754. package/node_modules/zod/v3/standard-schema.d.cts +102 -0
  755. package/node_modules/zod/v3/standard-schema.d.ts +102 -0
  756. package/node_modules/zod/v3/standard-schema.js +1 -0
  757. package/node_modules/zod/v3/types.cjs +3775 -0
  758. package/node_modules/zod/v3/types.d.cts +1031 -0
  759. package/node_modules/zod/v3/types.d.ts +1031 -0
  760. package/node_modules/zod/v3/types.js +3693 -0
  761. package/node_modules/zod/v4/classic/checks.cjs +32 -0
  762. package/node_modules/zod/v4/classic/checks.d.cts +1 -0
  763. package/node_modules/zod/v4/classic/checks.d.ts +1 -0
  764. package/node_modules/zod/v4/classic/checks.js +1 -0
  765. package/node_modules/zod/v4/classic/coerce.cjs +47 -0
  766. package/node_modules/zod/v4/classic/coerce.d.cts +17 -0
  767. package/node_modules/zod/v4/classic/coerce.d.ts +17 -0
  768. package/node_modules/zod/v4/classic/coerce.js +17 -0
  769. package/node_modules/zod/v4/classic/compat.cjs +57 -0
  770. package/node_modules/zod/v4/classic/compat.d.cts +46 -0
  771. package/node_modules/zod/v4/classic/compat.d.ts +46 -0
  772. package/node_modules/zod/v4/classic/compat.js +27 -0
  773. package/node_modules/zod/v4/classic/errors.cjs +67 -0
  774. package/node_modules/zod/v4/classic/errors.d.cts +30 -0
  775. package/node_modules/zod/v4/classic/errors.d.ts +30 -0
  776. package/node_modules/zod/v4/classic/errors.js +41 -0
  777. package/node_modules/zod/v4/classic/external.cjs +70 -0
  778. package/node_modules/zod/v4/classic/external.d.cts +13 -0
  779. package/node_modules/zod/v4/classic/external.d.ts +13 -0
  780. package/node_modules/zod/v4/classic/external.js +18 -0
  781. package/node_modules/zod/v4/classic/index.cjs +33 -0
  782. package/node_modules/zod/v4/classic/index.d.cts +4 -0
  783. package/node_modules/zod/v4/classic/index.d.ts +4 -0
  784. package/node_modules/zod/v4/classic/index.js +4 -0
  785. package/node_modules/zod/v4/classic/iso.cjs +60 -0
  786. package/node_modules/zod/v4/classic/iso.d.cts +22 -0
  787. package/node_modules/zod/v4/classic/iso.d.ts +22 -0
  788. package/node_modules/zod/v4/classic/iso.js +30 -0
  789. package/node_modules/zod/v4/classic/parse.cjs +32 -0
  790. package/node_modules/zod/v4/classic/parse.d.cts +23 -0
  791. package/node_modules/zod/v4/classic/parse.d.ts +23 -0
  792. package/node_modules/zod/v4/classic/parse.js +6 -0
  793. package/node_modules/zod/v4/classic/schemas.cjs +1109 -0
  794. package/node_modules/zod/v4/classic/schemas.d.cts +630 -0
  795. package/node_modules/zod/v4/classic/schemas.d.ts +630 -0
  796. package/node_modules/zod/v4/classic/schemas.js +1006 -0
  797. package/node_modules/zod/v4/core/api.cjs +1039 -0
  798. package/node_modules/zod/v4/core/api.d.cts +284 -0
  799. package/node_modules/zod/v4/core/api.d.ts +284 -0
  800. package/node_modules/zod/v4/core/api.js +906 -0
  801. package/node_modules/zod/v4/core/checks.cjs +591 -0
  802. package/node_modules/zod/v4/core/checks.d.cts +278 -0
  803. package/node_modules/zod/v4/core/checks.d.ts +278 -0
  804. package/node_modules/zod/v4/core/checks.js +565 -0
  805. package/node_modules/zod/v4/core/core.cjs +67 -0
  806. package/node_modules/zod/v4/core/core.d.cts +49 -0
  807. package/node_modules/zod/v4/core/core.d.ts +49 -0
  808. package/node_modules/zod/v4/core/core.js +61 -0
  809. package/node_modules/zod/v4/core/doc.cjs +39 -0
  810. package/node_modules/zod/v4/core/doc.d.cts +14 -0
  811. package/node_modules/zod/v4/core/doc.d.ts +14 -0
  812. package/node_modules/zod/v4/core/doc.js +35 -0
  813. package/node_modules/zod/v4/core/errors.cjs +226 -0
  814. package/node_modules/zod/v4/core/errors.d.cts +208 -0
  815. package/node_modules/zod/v4/core/errors.d.ts +208 -0
  816. package/node_modules/zod/v4/core/errors.js +195 -0
  817. package/node_modules/zod/v4/core/function.cjs +102 -0
  818. package/node_modules/zod/v4/core/function.d.cts +52 -0
  819. package/node_modules/zod/v4/core/function.d.ts +52 -0
  820. package/node_modules/zod/v4/core/function.js +75 -0
  821. package/node_modules/zod/v4/core/index.cjs +44 -0
  822. package/node_modules/zod/v4/core/index.d.cts +15 -0
  823. package/node_modules/zod/v4/core/index.d.ts +15 -0
  824. package/node_modules/zod/v4/core/index.js +15 -0
  825. package/node_modules/zod/v4/core/json-schema.cjs +2 -0
  826. package/node_modules/zod/v4/core/json-schema.d.cts +87 -0
  827. package/node_modules/zod/v4/core/json-schema.d.ts +87 -0
  828. package/node_modules/zod/v4/core/json-schema.js +1 -0
  829. package/node_modules/zod/v4/core/parse.cjs +87 -0
  830. package/node_modules/zod/v4/core/parse.d.cts +25 -0
  831. package/node_modules/zod/v4/core/parse.d.ts +25 -0
  832. package/node_modules/zod/v4/core/parse.js +57 -0
  833. package/node_modules/zod/v4/core/regexes.cjs +103 -0
  834. package/node_modules/zod/v4/core/regexes.d.cts +62 -0
  835. package/node_modules/zod/v4/core/regexes.d.ts +62 -0
  836. package/node_modules/zod/v4/core/regexes.js +95 -0
  837. package/node_modules/zod/v4/core/registries.cjs +56 -0
  838. package/node_modules/zod/v4/core/registries.d.cts +35 -0
  839. package/node_modules/zod/v4/core/registries.d.ts +35 -0
  840. package/node_modules/zod/v4/core/registries.js +51 -0
  841. package/node_modules/zod/v4/core/schemas.cjs +1748 -0
  842. package/node_modules/zod/v4/core/schemas.d.cts +1041 -0
  843. package/node_modules/zod/v4/core/schemas.d.ts +1041 -0
  844. package/node_modules/zod/v4/core/schemas.js +1717 -0
  845. package/node_modules/zod/v4/core/standard-schema.cjs +2 -0
  846. package/node_modules/zod/v4/core/standard-schema.d.cts +55 -0
  847. package/node_modules/zod/v4/core/standard-schema.d.ts +55 -0
  848. package/node_modules/zod/v4/core/standard-schema.js +1 -0
  849. package/node_modules/zod/v4/core/to-json-schema.cjs +854 -0
  850. package/node_modules/zod/v4/core/to-json-schema.d.cts +88 -0
  851. package/node_modules/zod/v4/core/to-json-schema.d.ts +88 -0
  852. package/node_modules/zod/v4/core/to-json-schema.js +849 -0
  853. package/node_modules/zod/v4/core/util.cjs +539 -0
  854. package/node_modules/zod/v4/core/util.d.cts +183 -0
  855. package/node_modules/zod/v4/core/util.d.ts +183 -0
  856. package/node_modules/zod/v4/core/util.js +493 -0
  857. package/node_modules/zod/v4/core/versions.cjs +8 -0
  858. package/node_modules/zod/v4/core/versions.d.cts +5 -0
  859. package/node_modules/zod/v4/core/versions.d.ts +5 -0
  860. package/node_modules/zod/v4/core/versions.js +5 -0
  861. package/node_modules/zod/v4/index.cjs +22 -0
  862. package/node_modules/zod/v4/index.d.cts +3 -0
  863. package/node_modules/zod/v4/index.d.ts +3 -0
  864. package/node_modules/zod/v4/index.js +3 -0
  865. package/node_modules/zod/v4/locales/ar.cjs +142 -0
  866. package/node_modules/zod/v4/locales/ar.d.cts +4 -0
  867. package/node_modules/zod/v4/locales/ar.d.ts +4 -0
  868. package/node_modules/zod/v4/locales/ar.js +116 -0
  869. package/node_modules/zod/v4/locales/az.cjs +141 -0
  870. package/node_modules/zod/v4/locales/az.d.cts +4 -0
  871. package/node_modules/zod/v4/locales/az.d.ts +4 -0
  872. package/node_modules/zod/v4/locales/az.js +115 -0
  873. package/node_modules/zod/v4/locales/be.cjs +190 -0
  874. package/node_modules/zod/v4/locales/be.d.cts +4 -0
  875. package/node_modules/zod/v4/locales/be.d.ts +4 -0
  876. package/node_modules/zod/v4/locales/be.js +164 -0
  877. package/node_modules/zod/v4/locales/ca.cjs +144 -0
  878. package/node_modules/zod/v4/locales/ca.d.cts +4 -0
  879. package/node_modules/zod/v4/locales/ca.d.ts +4 -0
  880. package/node_modules/zod/v4/locales/ca.js +118 -0
  881. package/node_modules/zod/v4/locales/cs.cjs +161 -0
  882. package/node_modules/zod/v4/locales/cs.d.cts +4 -0
  883. package/node_modules/zod/v4/locales/cs.d.ts +4 -0
  884. package/node_modules/zod/v4/locales/cs.js +135 -0
  885. package/node_modules/zod/v4/locales/de.cjs +142 -0
  886. package/node_modules/zod/v4/locales/de.d.cts +4 -0
  887. package/node_modules/zod/v4/locales/de.d.ts +4 -0
  888. package/node_modules/zod/v4/locales/de.js +116 -0
  889. package/node_modules/zod/v4/locales/en.cjs +145 -0
  890. package/node_modules/zod/v4/locales/en.d.cts +5 -0
  891. package/node_modules/zod/v4/locales/en.d.ts +5 -0
  892. package/node_modules/zod/v4/locales/en.js +117 -0
  893. package/node_modules/zod/v4/locales/eo.cjs +144 -0
  894. package/node_modules/zod/v4/locales/eo.d.cts +5 -0
  895. package/node_modules/zod/v4/locales/eo.d.ts +5 -0
  896. package/node_modules/zod/v4/locales/eo.js +116 -0
  897. package/node_modules/zod/v4/locales/es.cjs +143 -0
  898. package/node_modules/zod/v4/locales/es.d.cts +4 -0
  899. package/node_modules/zod/v4/locales/es.d.ts +4 -0
  900. package/node_modules/zod/v4/locales/es.js +117 -0
  901. package/node_modules/zod/v4/locales/fa.cjs +148 -0
  902. package/node_modules/zod/v4/locales/fa.d.cts +4 -0
  903. package/node_modules/zod/v4/locales/fa.d.ts +4 -0
  904. package/node_modules/zod/v4/locales/fa.js +122 -0
  905. package/node_modules/zod/v4/locales/fi.cjs +148 -0
  906. package/node_modules/zod/v4/locales/fi.d.cts +4 -0
  907. package/node_modules/zod/v4/locales/fi.d.ts +4 -0
  908. package/node_modules/zod/v4/locales/fi.js +122 -0
  909. package/node_modules/zod/v4/locales/fr-CA.cjs +143 -0
  910. package/node_modules/zod/v4/locales/fr-CA.d.cts +4 -0
  911. package/node_modules/zod/v4/locales/fr-CA.d.ts +4 -0
  912. package/node_modules/zod/v4/locales/fr-CA.js +117 -0
  913. package/node_modules/zod/v4/locales/fr.cjs +142 -0
  914. package/node_modules/zod/v4/locales/fr.d.cts +4 -0
  915. package/node_modules/zod/v4/locales/fr.d.ts +4 -0
  916. package/node_modules/zod/v4/locales/fr.js +116 -0
  917. package/node_modules/zod/v4/locales/he.cjs +143 -0
  918. package/node_modules/zod/v4/locales/he.d.cts +4 -0
  919. package/node_modules/zod/v4/locales/he.d.ts +4 -0
  920. package/node_modules/zod/v4/locales/he.js +117 -0
  921. package/node_modules/zod/v4/locales/hu.cjs +143 -0
  922. package/node_modules/zod/v4/locales/hu.d.cts +4 -0
  923. package/node_modules/zod/v4/locales/hu.d.ts +4 -0
  924. package/node_modules/zod/v4/locales/hu.js +117 -0
  925. package/node_modules/zod/v4/locales/id.cjs +142 -0
  926. package/node_modules/zod/v4/locales/id.d.cts +4 -0
  927. package/node_modules/zod/v4/locales/id.d.ts +4 -0
  928. package/node_modules/zod/v4/locales/id.js +116 -0
  929. package/node_modules/zod/v4/locales/index.cjs +84 -0
  930. package/node_modules/zod/v4/locales/index.d.cts +39 -0
  931. package/node_modules/zod/v4/locales/index.d.ts +39 -0
  932. package/node_modules/zod/v4/locales/index.js +39 -0
  933. package/node_modules/zod/v4/locales/it.cjs +143 -0
  934. package/node_modules/zod/v4/locales/it.d.cts +4 -0
  935. package/node_modules/zod/v4/locales/it.d.ts +4 -0
  936. package/node_modules/zod/v4/locales/it.js +117 -0
  937. package/node_modules/zod/v4/locales/ja.cjs +141 -0
  938. package/node_modules/zod/v4/locales/ja.d.cts +4 -0
  939. package/node_modules/zod/v4/locales/ja.d.ts +4 -0
  940. package/node_modules/zod/v4/locales/ja.js +115 -0
  941. package/node_modules/zod/v4/locales/kh.cjs +143 -0
  942. package/node_modules/zod/v4/locales/kh.d.cts +4 -0
  943. package/node_modules/zod/v4/locales/kh.d.ts +4 -0
  944. package/node_modules/zod/v4/locales/kh.js +117 -0
  945. package/node_modules/zod/v4/locales/ko.cjs +147 -0
  946. package/node_modules/zod/v4/locales/ko.d.cts +4 -0
  947. package/node_modules/zod/v4/locales/ko.d.ts +4 -0
  948. package/node_modules/zod/v4/locales/ko.js +121 -0
  949. package/node_modules/zod/v4/locales/mk.cjs +144 -0
  950. package/node_modules/zod/v4/locales/mk.d.cts +4 -0
  951. package/node_modules/zod/v4/locales/mk.d.ts +4 -0
  952. package/node_modules/zod/v4/locales/mk.js +118 -0
  953. package/node_modules/zod/v4/locales/ms.cjs +142 -0
  954. package/node_modules/zod/v4/locales/ms.d.cts +4 -0
  955. package/node_modules/zod/v4/locales/ms.d.ts +4 -0
  956. package/node_modules/zod/v4/locales/ms.js +116 -0
  957. package/node_modules/zod/v4/locales/nl.cjs +143 -0
  958. package/node_modules/zod/v4/locales/nl.d.cts +4 -0
  959. package/node_modules/zod/v4/locales/nl.d.ts +4 -0
  960. package/node_modules/zod/v4/locales/nl.js +117 -0
  961. package/node_modules/zod/v4/locales/no.cjs +142 -0
  962. package/node_modules/zod/v4/locales/no.d.cts +4 -0
  963. package/node_modules/zod/v4/locales/no.d.ts +4 -0
  964. package/node_modules/zod/v4/locales/no.js +116 -0
  965. package/node_modules/zod/v4/locales/ota.cjs +143 -0
  966. package/node_modules/zod/v4/locales/ota.d.cts +4 -0
  967. package/node_modules/zod/v4/locales/ota.d.ts +4 -0
  968. package/node_modules/zod/v4/locales/ota.js +117 -0
  969. package/node_modules/zod/v4/locales/pl.cjs +143 -0
  970. package/node_modules/zod/v4/locales/pl.d.cts +4 -0
  971. package/node_modules/zod/v4/locales/pl.d.ts +4 -0
  972. package/node_modules/zod/v4/locales/pl.js +117 -0
  973. package/node_modules/zod/v4/locales/ps.cjs +148 -0
  974. package/node_modules/zod/v4/locales/ps.d.cts +4 -0
  975. package/node_modules/zod/v4/locales/ps.d.ts +4 -0
  976. package/node_modules/zod/v4/locales/ps.js +122 -0
  977. package/node_modules/zod/v4/locales/pt.cjs +142 -0
  978. package/node_modules/zod/v4/locales/pt.d.cts +4 -0
  979. package/node_modules/zod/v4/locales/pt.d.ts +4 -0
  980. package/node_modules/zod/v4/locales/pt.js +116 -0
  981. package/node_modules/zod/v4/locales/ru.cjs +190 -0
  982. package/node_modules/zod/v4/locales/ru.d.cts +4 -0
  983. package/node_modules/zod/v4/locales/ru.d.ts +4 -0
  984. package/node_modules/zod/v4/locales/ru.js +164 -0
  985. package/node_modules/zod/v4/locales/sl.cjs +143 -0
  986. package/node_modules/zod/v4/locales/sl.d.cts +4 -0
  987. package/node_modules/zod/v4/locales/sl.d.ts +4 -0
  988. package/node_modules/zod/v4/locales/sl.js +117 -0
  989. package/node_modules/zod/v4/locales/sv.cjs +144 -0
  990. package/node_modules/zod/v4/locales/sv.d.cts +4 -0
  991. package/node_modules/zod/v4/locales/sv.d.ts +4 -0
  992. package/node_modules/zod/v4/locales/sv.js +118 -0
  993. package/node_modules/zod/v4/locales/ta.cjs +143 -0
  994. package/node_modules/zod/v4/locales/ta.d.cts +4 -0
  995. package/node_modules/zod/v4/locales/ta.d.ts +4 -0
  996. package/node_modules/zod/v4/locales/ta.js +117 -0
  997. package/node_modules/zod/v4/locales/th.cjs +143 -0
  998. package/node_modules/zod/v4/locales/th.d.cts +4 -0
  999. package/node_modules/zod/v4/locales/th.d.ts +4 -0
  1000. package/node_modules/zod/v4/locales/th.js +117 -0
  1001. package/node_modules/zod/v4/locales/tr.cjs +143 -0
  1002. package/node_modules/zod/v4/locales/tr.d.cts +5 -0
  1003. package/node_modules/zod/v4/locales/tr.d.ts +5 -0
  1004. package/node_modules/zod/v4/locales/tr.js +115 -0
  1005. package/node_modules/zod/v4/locales/ua.cjs +143 -0
  1006. package/node_modules/zod/v4/locales/ua.d.cts +4 -0
  1007. package/node_modules/zod/v4/locales/ua.d.ts +4 -0
  1008. package/node_modules/zod/v4/locales/ua.js +117 -0
  1009. package/node_modules/zod/v4/locales/ur.cjs +143 -0
  1010. package/node_modules/zod/v4/locales/ur.d.cts +4 -0
  1011. package/node_modules/zod/v4/locales/ur.d.ts +4 -0
  1012. package/node_modules/zod/v4/locales/ur.js +117 -0
  1013. package/node_modules/zod/v4/locales/vi.cjs +142 -0
  1014. package/node_modules/zod/v4/locales/vi.d.cts +4 -0
  1015. package/node_modules/zod/v4/locales/vi.d.ts +4 -0
  1016. package/node_modules/zod/v4/locales/vi.js +116 -0
  1017. package/node_modules/zod/v4/locales/zh-CN.cjs +142 -0
  1018. package/node_modules/zod/v4/locales/zh-CN.d.cts +4 -0
  1019. package/node_modules/zod/v4/locales/zh-CN.d.ts +4 -0
  1020. package/node_modules/zod/v4/locales/zh-CN.js +116 -0
  1021. package/node_modules/zod/v4/locales/zh-TW.cjs +143 -0
  1022. package/node_modules/zod/v4/locales/zh-TW.d.cts +4 -0
  1023. package/node_modules/zod/v4/locales/zh-TW.d.ts +4 -0
  1024. package/node_modules/zod/v4/locales/zh-TW.js +117 -0
  1025. package/node_modules/zod/v4/mini/checks.cjs +34 -0
  1026. package/node_modules/zod/v4/mini/checks.d.cts +1 -0
  1027. package/node_modules/zod/v4/mini/checks.d.ts +1 -0
  1028. package/node_modules/zod/v4/mini/checks.js +1 -0
  1029. package/node_modules/zod/v4/mini/coerce.cjs +47 -0
  1030. package/node_modules/zod/v4/mini/coerce.d.cts +7 -0
  1031. package/node_modules/zod/v4/mini/coerce.d.ts +7 -0
  1032. package/node_modules/zod/v4/mini/coerce.js +17 -0
  1033. package/node_modules/zod/v4/mini/external.cjs +62 -0
  1034. package/node_modules/zod/v4/mini/external.d.cts +11 -0
  1035. package/node_modules/zod/v4/mini/external.d.ts +11 -0
  1036. package/node_modules/zod/v4/mini/external.js +13 -0
  1037. package/node_modules/zod/v4/mini/index.cjs +32 -0
  1038. package/node_modules/zod/v4/mini/index.d.cts +3 -0
  1039. package/node_modules/zod/v4/mini/index.d.ts +3 -0
  1040. package/node_modules/zod/v4/mini/index.js +3 -0
  1041. package/node_modules/zod/v4/mini/iso.cjs +60 -0
  1042. package/node_modules/zod/v4/mini/iso.d.cts +22 -0
  1043. package/node_modules/zod/v4/mini/iso.d.ts +22 -0
  1044. package/node_modules/zod/v4/mini/iso.js +30 -0
  1045. package/node_modules/zod/v4/mini/parse.cjs +8 -0
  1046. package/node_modules/zod/v4/mini/parse.d.cts +1 -0
  1047. package/node_modules/zod/v4/mini/parse.d.ts +1 -0
  1048. package/node_modules/zod/v4/mini/parse.js +1 -0
  1049. package/node_modules/zod/v4/mini/schemas.cjs +839 -0
  1050. package/node_modules/zod/v4/mini/schemas.d.cts +356 -0
  1051. package/node_modules/zod/v4/mini/schemas.d.ts +356 -0
  1052. package/node_modules/zod/v4/mini/schemas.js +732 -0
  1053. package/node_modules/zod/v4-mini/index.cjs +17 -0
  1054. package/node_modules/zod/v4-mini/index.d.cts +1 -0
  1055. package/node_modules/zod/v4-mini/index.d.ts +1 -0
  1056. package/node_modules/zod/v4-mini/index.js +1 -0
  1057. package/package.json +97 -0
@@ -0,0 +1,1233 @@
1
+ /**
2
+ * Configuration for Sandbox Runtime
3
+ * This is the main configuration interface that consumers pass to SandboxManager.initialize()
4
+ */
5
+ import { isIP } from 'node:net';
6
+ import { isAbsolute, posix as posixPath, win32 as win32Path } from 'node:path';
7
+ // The 'zod/v3' subpath, not bare 'zod': it exists from zod 3.25 on and is the
8
+ // v3 API under both zod 3.25+ and zod 4. Where a consumer's dependency tree
9
+ // resolves this package's zod to version 4, the bare import would hand these
10
+ // schemas the v4 API they are not written against.
11
+ import { z } from 'zod/v3';
12
+ import { isInjectHostCoveredByAllowedDomains, splitDomainPatternPort, stripDomainPatternPort, } from './domain-pattern.js';
13
+ import { parseAddressRange } from './address.js';
14
+ import { containsGlobCharsForPlatform } from './sandbox-utils.js';
15
+ import { getPlatform } from '../utils/platform.js';
16
+ /**
17
+ * Host-only pattern check (e.g., "example.com", "*.npmjs.org"). Rejects
18
+ * protocols, paths, ports, and overly broad wildcards.
19
+ */
20
+ function isValidDomainPattern(val) {
21
+ // A bare IPv6 literal as produced by splitDomainPatternPort for a
22
+ // bracketed entry (`[::1]`, `[2001:db8::1]:443` → `::1`, `2001:db8::1`).
23
+ // Whether the *raw* entry was bracketed is enforced separately
24
+ // (hasValidIpv6Bracketing) before the split.
25
+ if (isIP(val) === 6)
26
+ return true;
27
+ // Reject protocols, paths, ports, etc.
28
+ if (val.includes('://') || val.includes('/') || val.includes(':')) {
29
+ return false;
30
+ }
31
+ // Allow localhost
32
+ if (val === 'localhost')
33
+ return true;
34
+ // Allow wildcard domains like *.example.com
35
+ if (val.startsWith('*.')) {
36
+ const domain = val.slice(2);
37
+ // After the *. there must be a valid domain with at least one more dot
38
+ // e.g., *.example.com is valid, *.com is not (too broad)
39
+ if (!domain.includes('.') ||
40
+ domain.startsWith('.') ||
41
+ domain.endsWith('.')) {
42
+ return false;
43
+ }
44
+ // Count dots - must have at least 2 parts after the wildcard (e.g., example.com)
45
+ const parts = domain.split('.');
46
+ return parts.length >= 2 && parts.every(p => p.length > 0);
47
+ }
48
+ // Reject any other use of wildcards (e.g., *, *., etc.)
49
+ if (val.includes('*')) {
50
+ return false;
51
+ }
52
+ // Regular domains must have at least one dot and only valid characters
53
+ return val.includes('.') && !val.startsWith('.') && !val.endsWith('.');
54
+ }
55
+ const DOMAIN_PATTERN_MESSAGE = 'Invalid domain pattern. Must be a valid domain (e.g., "example.com"), a wildcard (e.g., "*.example.com"), or a bracketed IPv6 literal (e.g., "[::1]", "[2001:db8::1]:443"). Overly broad patterns like "*.com" or "*" are not allowed for security reasons.';
56
+ /**
57
+ * Schema for domain patterns (e.g., "example.com", "*.npmjs.org")
58
+ * Validates that domain patterns are safe and don't include overly broad wildcards
59
+ */
60
+ const domainPatternSchema = z
61
+ .string()
62
+ .refine(isValidDomainPattern, { message: DOMAIN_PATTERN_MESSAGE });
63
+ /**
64
+ * Domain pattern with an optional `:port` suffix (e.g., "example.com:443",
65
+ * "*.npmjs.org:8443"). Used for allowedDomains / deniedDomains, where the
66
+ * proxy knows the destination port; an entry without a port matches any port.
67
+ */
68
+ /**
69
+ * Raw-entry rule applied before the port split: an entry with two or more
70
+ * colons is an IPv6 literal and must use RFC 3986 brackets (`[::1]`,
71
+ * `[::1]:443`). Unbracketed it is ambiguous — `2001:db8::1:443` is itself a
72
+ * valid 8-hextet address — so reject it and make the user say which they
73
+ * mean, rather than accept an entry that can silently match the wrong thing.
74
+ */
75
+ function hasValidIpv6Bracketing(val) {
76
+ const first = val.indexOf(':');
77
+ const multiColon = first !== -1 && val.indexOf(':', first + 1) !== -1;
78
+ return !multiColon || val.startsWith('[');
79
+ }
80
+ const domainPortPatternSchema = z
81
+ .string()
82
+ .refine(val => hasValidIpv6Bracketing(val) &&
83
+ isValidDomainPattern(splitDomainPatternPort(val).hostPattern), {
84
+ message: DOMAIN_PATTERN_MESSAGE +
85
+ ' An optional ":port" suffix (1-65535) restricts the entry to that port.',
86
+ });
87
+ /**
88
+ * deniedDomains entry: a domainPortPattern, or a bare "*" / "*:port"
89
+ * (deny-all, optionally per-port).
90
+ */
91
+ const deniedDomainPatternSchema = z.string().refine(val => {
92
+ if (!hasValidIpv6Bracketing(val))
93
+ return false;
94
+ const { hostPattern } = splitDomainPatternPort(val);
95
+ return hostPattern === '*' || isValidDomainPattern(hostPattern);
96
+ }, {
97
+ message: DOMAIN_PATTERN_MESSAGE +
98
+ ' In deniedDomains a bare "*" (deny-all) is also accepted, and an optional ":port" suffix (1-65535) restricts the entry to that port.',
99
+ });
100
+ /** IP literal or CIDR range (`10.0.0.0/8`, `fc00::/7`, `169.254.169.254`). */
101
+ const addressRangeSchema = z
102
+ .string()
103
+ .refine(v => parseAddressRange(v) !== undefined, {
104
+ message: 'Invalid IP address or CIDR range. Use an IPv4/IPv6 literal or CIDR, e.g. "10.0.0.0/8", "192.168.1.10", "fc00::/7" (IPv6 unbracketed).',
105
+ });
106
+ /**
107
+ * Schema for filesystem paths
108
+ */
109
+ const filesystemPathSchema = z.string().min(1, 'Path cannot be empty');
110
+ /**
111
+ * Schema for an absolute path to an external binary.
112
+ * Relative paths are rejected to prevent PATH/CWD-based hijacking — these
113
+ * overrides are intended for admin-managed installs at fixed locations.
114
+ */
115
+ const binaryPathSchema = z
116
+ .string()
117
+ .min(1, 'Path cannot be empty')
118
+ .refine(val => isAbsolute(val), {
119
+ message: 'Binary path must be absolute',
120
+ });
121
+ /**
122
+ * Schema for MITM proxy configuration
123
+ * Allows routing specific domains through an upstream MITM proxy via Unix socket
124
+ */
125
+ const MitmProxyConfigSchema = z.object({
126
+ socketPath: z.string().min(1).describe('Unix socket path to the MITM proxy'),
127
+ domains: z
128
+ .array(domainPatternSchema)
129
+ .min(1)
130
+ .describe('Domains to route through the MITM proxy (e.g., ["api.example.com", "*.internal.org"])'),
131
+ });
132
+ /**
133
+ * Schema for upstream/parent HTTP proxy configuration.
134
+ * Used when SRT itself runs behind a corporate proxy and cannot make direct
135
+ * outbound connections.
136
+ */
137
+ const ParentProxyConfigSchema = z.object({
138
+ http: z
139
+ .string()
140
+ .url()
141
+ .optional()
142
+ .describe('Upstream proxy URL for plain HTTP traffic'),
143
+ https: z
144
+ .string()
145
+ .url()
146
+ .optional()
147
+ .describe('Upstream proxy URL for HTTPS/CONNECT traffic (falls back to http if unset)'),
148
+ noProxy: z
149
+ .string()
150
+ .optional()
151
+ .describe('Comma-separated NO_PROXY list (hostname suffixes and CIDR ranges). ' +
152
+ 'Matching destinations connect directly instead of via the parent proxy.'),
153
+ });
154
+ /**
155
+ * Schema for the access mode of a declared credential source.
156
+ *
157
+ * - `deny` — the sandboxed process cannot read the file / does not see the
158
+ * environment variable.
159
+ * - `mask` — the sandboxed process sees a per-session sentinel value; the
160
+ * host proxy substitutes sentinel→real on egress to `injectHosts`.
161
+ * For files this is whole-file masking (Linux only; degrades to `deny`
162
+ * on macOS — see {@link CredentialFileConfigSchema}).
163
+ */
164
+ const credentialModeSchema = z.enum(['deny', 'mask']);
165
+ /**
166
+ * Schema for an environment variable name. Restricted to POSIX identifiers so
167
+ * the name can never be parsed as a flag by `env -u` (macOS) or bwrap
168
+ * `--unsetenv` (Linux).
169
+ */
170
+ const envVarNameSchema = z
171
+ .string()
172
+ .regex(/^[A-Za-z_][A-Za-z0-9_]*$/, 'Environment variable name must start with a letter or underscore and contain only letters, digits, and underscores');
173
+ /**
174
+ * Schema for the optional structured-extraction regex on a masked file.
175
+ *
176
+ * Validates that the string compiles as a JavaScript RegExp and declares at
177
+ * least one capturing group — capture group 1 is the contract for "the
178
+ * credential value to mask". A pattern with zero groups would silently mask
179
+ * nothing useful, so it is rejected at config time rather than at runtime.
180
+ *
181
+ * Group count is determined by appending `|` (alternation with empty) and
182
+ * matching the empty string: the result array length is `1 + groupCount`,
183
+ * which counts capturing groups (including named ones) and ignores
184
+ * non-capturing `(?:…)`.
185
+ */
186
+ const extractPatternSchema = z.string().superRefine((val, ctx) => {
187
+ let re;
188
+ try {
189
+ re = new RegExp(val);
190
+ }
191
+ catch (err) {
192
+ ctx.addIssue({
193
+ code: z.ZodIssueCode.custom,
194
+ message: `extract is not a valid regular expression: ${err.message}`,
195
+ });
196
+ return;
197
+ }
198
+ const groupCount = new RegExp(re.source + '|').exec('').length - 1;
199
+ if (groupCount < 1) {
200
+ ctx.addIssue({
201
+ code: z.ZodIssueCode.custom,
202
+ message: 'extract must contain at least one capturing group — group 1 is ' +
203
+ 'the credential value to mask (e.g. "token:\\s*(\\S+)").',
204
+ });
205
+ }
206
+ });
207
+ /**
208
+ * Schema for a single credential file/directory entry.
209
+ *
210
+ * `mode: "mask"` without `extract` is **whole-file** masking: the entire
211
+ * file content is replaced inside the sandbox with one sentinel string,
212
+ * and the proxy substitutes that sentinel back to the real bytes on egress.
213
+ * This works for files whose content *is* the credential (a token file, a
214
+ * single-line secret).
215
+ *
216
+ * `mode: "mask"` with `extract` is **structured** masking: the regex is
217
+ * applied globally to the real file, capture group 1 of each match is a
218
+ * credential value, and only those captured spans are replaced with
219
+ * sentinels — the rest of the file is preserved byte-for-byte. This lets a
220
+ * tool that parses the file (`.netrc`, JSON/YAML configs) still succeed
221
+ * inside the sandbox while the credential values are protected. If the
222
+ * pattern matches nothing, behaviour is governed by `onExtractNoMatch`
223
+ * (default `"warn"` — the file is left readable as-is and a stderr
224
+ * warning is emitted).
225
+ *
226
+ * `mode: "mask"` with `decode: "jwt"` extends structured masking into
227
+ * encoded values: where `extract` opens plain text to mask a span inside
228
+ * it, `decode` opens the encoding so masking can target fields inside the
229
+ * decoded payload (`maskClaims`):
230
+ *
231
+ * - **Default pattern**: when `extract` is absent, a built-in JWT regex is
232
+ * used (every JWT starts `eyJ` — base64url of `{"`), so authors don't
233
+ * hand-write it. An explicit `extract` wins; its group-1 captures are the
234
+ * candidates.
235
+ * - **Decode-verification**: each candidate must actually BE a JWT (three
236
+ * segments, JSON header/payload, `alg` in the header) before it is
237
+ * masked; candidates failing verification are left untouched.
238
+ * - **Claim-level masking** (`maskClaims`): each named top-level payload
239
+ * claim present with a string value is replaced by its own sentinel and
240
+ * the token is rebuilt around the modified payload (original header,
241
+ * filler signature). All other claims stay real, so a client that
242
+ * decodes the token and reads a non-secret claim keeps working. The
243
+ * proxy substitutes both the whole rebuilt token (sent as a bearer
244
+ * credential) and each claim sentinel (extracted and sent alone).
245
+ * - **Whole-token fallback** (no `maskClaims`): the whole decoded value is
246
+ * treated as the credential — for bearer-style usage where the token
247
+ * itself is the secret — and replaced with a structurally valid fake JWT
248
+ * (parseable header/payload, far-future `exp`), so client-side token
249
+ * parsing inside the sandbox doesn't break. Its header declares
250
+ * `alg: HS256` (not `alg: none`, which misconfigured validators accept)
251
+ * with a garbage signature, so any validator the unswapped fake reaches
252
+ * rejects it.
253
+ * - **No verified candidate**: if nothing matches, no candidate verifies,
254
+ * or (with `maskClaims`) no named claim matches in any verified token,
255
+ * behaviour is governed by `onExtractNoMatch` — same as a non-matching
256
+ * `extract` (default `"warn"`: stderr warning, file left readable
257
+ * as-is).
258
+ *
259
+ * `maskDuplicates: true` (only meaningful with `extract` or `decode`)
260
+ * additionally replaces every verbatim occurrence of each masked value
261
+ * *outside* the regex-matched spans — for a secret repeated where the
262
+ * regex does not reach (e.g. pasted into a comment). The scan is raw
263
+ * substring matching, so a short or common captured value may also hit
264
+ * unrelated content that happens to contain it; intended for long,
265
+ * high-entropy secrets. Composed with `decode`, only captures that passed
266
+ * verification are scanned — a duplicate is the same value and reuses the
267
+ * verified capture's fake without re-verification.
268
+ *
269
+ * On macOS, SBPL cannot redirect reads, so `mode: "mask"` (with or without
270
+ * `extract`/`decode`) currently degrades to `mode: "deny"` (the file is
271
+ * unreadable inside the sandbox).
272
+ */
273
+ export const CredentialFileConfigSchema = z.object({
274
+ path: filesystemPathSchema.describe('Path to a credential file or directory. Supports the same path forms as ' +
275
+ 'filesystem.denyRead (absolute paths and ~ expansion).'),
276
+ mode: credentialModeSchema.describe('Access mode for this path'),
277
+ extract: extractPatternSchema
278
+ .optional()
279
+ .describe('Optional regex for structured masking. Applied globally; capture ' +
280
+ 'group 1 of each match is masked, the rest of the file is preserved. ' +
281
+ 'If the pattern matches nothing, behaviour is governed by ' +
282
+ 'onExtractNoMatch (default "warn"). Only meaningful when mode is ' +
283
+ '"mask"; accepted but ignored for "deny".'),
284
+ /**
285
+ * What to do when `extract` matches nothing in the file at runtime —
286
+ * or, with `decode`, when no candidate survives verification.
287
+ *
288
+ * - `"warn"` (default): emit a stderr warning and leave the file
289
+ * readable as-is inside the sandbox (fail-open). A non-matching
290
+ * pattern is treated as a config error to surface and fix, not a
291
+ * reason to break a tool that needs the file when the credential is
292
+ * legitimately absent.
293
+ * - `"deny"`: degrade the entry to `mode: "deny"` so the file is
294
+ * unreadable inside the sandbox (fail-closed). The operator declared
295
+ * this file as containing a credential; if the regex cannot find it,
296
+ * block access rather than expose it.
297
+ * - `"error"`: throw at wrap time so nothing runs until the operator
298
+ * fixes the config.
299
+ *
300
+ * Only meaningful when `mode` is `"mask"` and `extract` or `decode` is
301
+ * set; accepted but ignored otherwise.
302
+ */
303
+ onExtractNoMatch: z
304
+ .enum(['warn', 'deny', 'error'])
305
+ .optional()
306
+ .describe('What to do when extract matches nothing (or, with decode, no ' +
307
+ 'candidate verifies): "warn" (default — stderr warning, file left ' +
308
+ 'readable), "deny" (degrade to mode "deny" — file unreadable), or ' +
309
+ '"error" (throw at wrap time). Only meaningful with mode "mask" ' +
310
+ 'and extract or decode set.'),
311
+ decode: z
312
+ .enum(['jwt'])
313
+ .optional()
314
+ .describe('Optional encoded-credential format. "jwt": decodes recognized JWTs ' +
315
+ 'so masking can target fields inside them (see maskClaims). ' +
316
+ 'Candidates are located with a built-in JWT regex (or the explicit ' +
317
+ 'extract pattern, if set) and verified to actually be JWTs before ' +
318
+ 'masking. Without maskClaims, the whole decoded value is treated ' +
319
+ 'as the credential and replaced with a structurally valid fake ' +
320
+ 'JWT, so client-side token parsing keeps working. If no candidate ' +
321
+ 'verifies, behaviour is governed by onExtractNoMatch (default ' +
322
+ '"warn"). Only meaningful when mode is "mask"; accepted but ' +
323
+ 'ignored for "deny".'),
324
+ /**
325
+ * Names of top-level payload claims to mask inside each decoded value —
326
+ * the claim-level counterpart of `extract`: where `extract` opens plain
327
+ * text to mask a span inside it, `decode` + `maskClaims` opens the
328
+ * encoding to mask a field inside the decoded payload.
329
+ *
330
+ * For each verified JWT candidate, every named claim present with a
331
+ * string value is replaced by its own sentinel and the token is rebuilt
332
+ * around the modified payload (original header, filler signature). All
333
+ * other claims are preserved verbatim, so a tool that decodes the token
334
+ * and reads a non-secret claim (issuer, audience, user id) keeps
335
+ * working while the secret claim is protected. A named claim that is
336
+ * absent or non-string in a given token is skipped. If no named claim
337
+ * matches in any verified token, behaviour is governed by
338
+ * `onExtractNoMatch` — same as no candidate verifying.
339
+ *
340
+ * Requires `decode` (there is no payload to look inside otherwise); an
341
+ * explicitly empty list is rejected — see the superRefine below.
342
+ */
343
+ maskClaims: z
344
+ .array(z.string().min(1))
345
+ .optional()
346
+ .describe('Names of top-level payload claims to mask inside each decoded ' +
347
+ 'value, instead of replacing the whole token. Each named claim ' +
348
+ 'present with a string value gets its own sentinel; all other ' +
349
+ 'claims are preserved so claim-reading clients keep working. ' +
350
+ 'Requires decode. If no named claim matches in any verified ' +
351
+ 'token, behaviour is governed by onExtractNoMatch (default ' +
352
+ '"warn"). Only meaningful when mode is "mask"; accepted but ' +
353
+ 'ignored for "deny".'),
354
+ maskDuplicates: z
355
+ .boolean()
356
+ .optional()
357
+ .describe('If true, verbatim occurrences of each captured credential value ' +
358
+ 'outside the regex-matched spans are also replaced with the ' +
359
+ 'corresponding sentinel — for a secret repeated where the regex ' +
360
+ 'does not reach (e.g. in a comment). Matches raw substrings: short ' +
361
+ 'or common credential values may corrupt unrelated content, so ' +
362
+ 'this is intended for long, high-entropy secrets. With decode, ' +
363
+ 'only values that passed verification are scanned; duplicates ' +
364
+ "reuse the verified value's fake without re-verification. " +
365
+ 'Defaults to false. Only meaningful with mode "mask" and extract ' +
366
+ 'or decode set; accepted but ignored otherwise.'),
367
+ injectHosts: z
368
+ .array(domainPatternSchema)
369
+ .optional()
370
+ .describe('Optional narrowing of where the proxy substitutes this credential. ' +
371
+ 'If unset, defaults to network.allowedDomains — the credential is ' +
372
+ 'injected at every reachable host. Only meaningful when mode is ' +
373
+ '"mask"; accepted but ignored for "deny".'),
374
+ });
375
+ /**
376
+ * Schema for a single credential environment variable entry.
377
+ *
378
+ * `mode: "mask"` replaces the variable's value inside the sandbox with a
379
+ * per-session sentinel; the proxy substitutes sentinel→real on egress to
380
+ * the credential's injectHosts. A masked var that is unset on the host is
381
+ * skipped — there is nothing to protect.
382
+ *
383
+ * `mode: "mask"` without `extract` is **whole-value** masking: the entire
384
+ * value is replaced inside the sandbox with one sentinel string, and the
385
+ * proxy substitutes that sentinel back to the real value on egress. This
386
+ * works for variables whose value *is* the credential (a bare token).
387
+ *
388
+ * `mode: "mask"` with `extract` is **structured** masking: the regex is
389
+ * applied globally to the real value, capture group 1 of each match is a
390
+ * credential value, and only those captured spans are replaced with
391
+ * sentinels — the rest of the value is preserved byte-for-byte. This lets
392
+ * a tool that parses the value (a `DATABASE_URL` connection string, a
393
+ * composite `KEY:SECRET` pair) still succeed inside the sandbox while the
394
+ * credential spans are protected. If the pattern matches nothing,
395
+ * behaviour is governed by `onExtractNoMatch` (default `"warn"` — the
396
+ * variable passes through unmasked and a stderr warning is emitted).
397
+ *
398
+ * `mode: "mask"` with `decode: "jwt"` handles a variable whose whole value
399
+ * is a JWT (CI OIDC tokens, Supabase keys, ...). `decode` opens the encoded
400
+ * value for masking: without claim-level configuration the entire token is
401
+ * replaced by a structurally valid fake JWT — parseable three-segment shape
402
+ * with JSON header/payload and far-future `exp`, so a tool that inspects
403
+ * the token before sending it (segment count, exp, claims) keeps working.
404
+ * The fake's header declares `alg: HS256` — never `alg: none`, which
405
+ * misconfigured validators accept — with a filler signature, so a verifier
406
+ * the unswapped fake ever reaches rejects it cryptographically. The proxy
407
+ * swaps the whole fake token for the real one on egress.
408
+ *
409
+ * `decode: "jwt"` with `maskClaims` masks at the claim level instead: each
410
+ * named top-level payload claim present with a string value is replaced by
411
+ * its own sentinel and the token is rebuilt around the modified payload
412
+ * (original header segment, filler signature). All other claims stay real,
413
+ * so a client that decodes the token and reads a non-secret claim keeps
414
+ * working. The proxy substitutes both the whole rebuilt token (sent as a
415
+ * bearer credential) and each claim sentinel (extracted and sent alone).
416
+ *
417
+ * If the variable is set but its value does not verify as a JWT — or, with
418
+ * `maskClaims`, no named claim is present as a string — nothing was masked:
419
+ * the entry currently fails open — the real value stays in the sandbox
420
+ * environment and a loud stderr warning names the variable.
421
+ */
422
+ export const CredentialEnvVarConfigSchema = z.object({
423
+ name: envVarNameSchema.describe('Environment variable name'),
424
+ mode: credentialModeSchema.describe('Access mode for this environment variable'),
425
+ extract: extractPatternSchema
426
+ .optional()
427
+ .describe('Optional regex for structured masking. Applied globally; capture ' +
428
+ 'group 1 of each match is masked, the rest of the value is ' +
429
+ 'preserved. If the pattern matches nothing, behaviour is governed ' +
430
+ 'by onExtractNoMatch (default "warn"). Only meaningful when mode ' +
431
+ 'is "mask"; accepted but ignored for "deny".'),
432
+ /**
433
+ * What to do when `extract` matches nothing in the value at runtime.
434
+ *
435
+ * - `"warn"` (default): emit a stderr warning and let the variable pass
436
+ * through unmasked inside the sandbox (fail-open). A non-matching
437
+ * pattern is treated as a config error to surface and fix, not a
438
+ * reason to break a tool that needs the variable when the credential
439
+ * is legitimately absent from it.
440
+ * - `"deny"`: unset the variable inside the sandbox (fail-closed) — the
441
+ * env analog of degrading a file to `mode: "deny"`. The operator
442
+ * declared this variable as containing a credential; if the regex
443
+ * cannot find it, withhold the value rather than expose it.
444
+ * - `"error"`: throw at wrap time so nothing runs until the operator
445
+ * fixes the regex.
446
+ *
447
+ * Only meaningful when `mode` is `"mask"` and `extract` is set;
448
+ * accepted but ignored otherwise.
449
+ */
450
+ onExtractNoMatch: z
451
+ .enum(['warn', 'deny', 'error'])
452
+ .optional()
453
+ .describe('What to do when extract matches nothing: "warn" (default — stderr ' +
454
+ 'warning, variable passes through unmasked), "deny" (variable ' +
455
+ 'unset inside the sandbox), or "error" (throw at wrap time). Only ' +
456
+ 'meaningful with mode "mask" and extract set.'),
457
+ decode: z
458
+ .enum(['jwt'])
459
+ .optional()
460
+ .describe('Optional encoded-credential format. "jwt": the variable\'s whole ' +
461
+ 'value is verified to actually be a JWT and replaced with a ' +
462
+ 'structurally valid fake JWT so client-side token parsing keeps ' +
463
+ 'working; the proxy swaps the whole fake token on egress. If the ' +
464
+ 'value does not verify, the variable is left unmasked with a ' +
465
+ 'stderr warning (fail-open). Only meaningful when mode is "mask"; ' +
466
+ 'accepted but ignored for "deny".'),
467
+ /**
468
+ * Names of top-level payload claims to mask inside the decoded value —
469
+ * the env-var counterpart of the `maskClaims` on a file entry: `decode`
470
+ * opens the variable's encoded value so masking can target a field
471
+ * inside the decoded payload instead of replacing the whole token.
472
+ *
473
+ * Every named claim present with a string value is replaced by its own
474
+ * sentinel and the token is rebuilt around the modified payload
475
+ * (original header segment, filler signature). All other claims are
476
+ * preserved verbatim, so a tool that decodes the token and reads a
477
+ * non-secret claim (issuer, audience, user id) keeps working while the
478
+ * secret claim is protected. A named claim that is absent or non-string
479
+ * is skipped. If no named claim matches, nothing was masked and the
480
+ * entry fails open with a stderr warning — same path as a value that
481
+ * does not verify as a JWT.
482
+ *
483
+ * Requires `decode` (there is no payload to look inside otherwise); an
484
+ * explicitly empty list is rejected — see the superRefine below.
485
+ */
486
+ maskClaims: z
487
+ .array(z.string().min(1))
488
+ .optional()
489
+ .describe('Names of top-level payload claims to mask inside the decoded ' +
490
+ 'value, instead of replacing the whole token. Each named claim ' +
491
+ 'present with a string value gets its own sentinel; all other ' +
492
+ 'claims are preserved so claim-reading clients keep working. ' +
493
+ 'Requires decode. If no named claim matches, the variable is left ' +
494
+ 'unmasked with a stderr warning (fail-open). Only meaningful when ' +
495
+ 'mode is "mask"; accepted but ignored for "deny".'),
496
+ injectHosts: z
497
+ .array(domainPatternSchema)
498
+ .optional()
499
+ .describe('Optional narrowing of where the proxy substitutes this credential. ' +
500
+ 'If unset, defaults to network.allowedDomains — the credential is ' +
501
+ 'injected at every reachable host. Only meaningful when mode is ' +
502
+ '"mask"; accepted but ignored for "deny".'),
503
+ });
504
+ /**
505
+ * Explicit grouping of masked env vars into an AWS credential pair for
506
+ * SigV4 re-signing.
507
+ *
508
+ * A SigV4 signature is an HMAC derived from the secret access key, so a
509
+ * client signing with a masked (fake) secret produces a signature no
510
+ * substitution can repair — the proxy must re-sign with the real secret.
511
+ * Re-signing needs the access key id, secret, and optional session token
512
+ * *linked* as one credential: this entry names the `credentials.envVars`
513
+ * entries (all `mode: "mask"`, whole-value — no `extract`/`decode`) that
514
+ * hold each part.
515
+ *
516
+ * The conventional trio AWS_ACCESS_KEY_ID / AWS_SECRET_ACCESS_KEY /
517
+ * AWS_SESSION_TOKEN is paired automatically when those vars are masked
518
+ * whole-value and no explicit awsPairs entry references them — this
519
+ * config exists for non-standard variable names.
520
+ *
521
+ * Re-signing triggers only on requests whose signature scope references
522
+ * the pair's fake access key id (exact match); everything else — including
523
+ * requests signed with real, unmasked AWS credentials — is untouched. The
524
+ * substitution gate is the access-key-id entry's `injectHosts` (defaulting
525
+ * to network.allowedDomains); the secret/session-token entries' own
526
+ * injectHosts are not consulted for re-signing.
527
+ */
528
+ export const AwsPairConfigSchema = z
529
+ .object({
530
+ accessKeyIdVar: envVarNameSchema.describe('Name of the masked env var holding the AWS access key id.'),
531
+ secretAccessKeyVar: envVarNameSchema.describe('Name of the masked env var holding the AWS secret access key.'),
532
+ sessionTokenVar: envVarNameSchema
533
+ .optional()
534
+ .describe('Optional name of the masked env var holding the AWS session ' +
535
+ 'token (temporary credentials). When set, the proxy sends the ' +
536
+ 'real token as x-amz-security-token on re-signed requests and ' +
537
+ 'adds it to the signed header set if the client did not.'),
538
+ })
539
+ .strict();
540
+ const sigv4PolicySchema = z.enum(['deny', 'passthrough']);
541
+ /**
542
+ * Per-shape policy for AWS SigV4 request forms the proxy cannot re-sign.
543
+ * Applies only to requests whose signature references a masked pair's
544
+ * fake access key id; requests signed with unmasked credentials are never
545
+ * affected.
546
+ *
547
+ * - `"deny"` (default): fail closed with a 403 naming the case, so the
548
+ * sandboxed client sees a policy block instead of a confusing upstream
549
+ * signature error.
550
+ * - `"passthrough"`: forward the request without re-signing. Ordinary
551
+ * header substitution still applies, but the signature was computed
552
+ * from the masked placeholder secret, so the upstream will reject it —
553
+ * set this only when that failure mode is preferable to a proxy denial.
554
+ *
555
+ * Re-signable header-SigV4 requests that sign a literal body hash are
556
+ * buffered (up to 64 MiB — MAX_SIGV4_RESIGN_BODY_BYTES in
557
+ * tls-terminate-proxy.ts) so the hash can be recomputed over the bytes
558
+ * actually forwarded; larger bodies are denied with a 403. Payloads
559
+ * signed as UNSIGNED-PAYLOAD stream through without buffering.
560
+ */
561
+ export const Sigv4ConfigSchema = z
562
+ .object({
563
+ streaming: sigv4PolicySchema
564
+ .optional()
565
+ .describe('Policy for aws-chunked streaming uploads (x-amz-content-sha256: ' +
566
+ 'STREAMING-*): per-chunk signatures chain off the seed ' +
567
+ 'signature, so re-signing would require rewriting the body. ' +
568
+ 'Default "deny".'),
569
+ presigned: sigv4PolicySchema
570
+ .optional()
571
+ .describe('Policy for presigned URLs (X-Amz-Algorithm/X-Amz-Signature in ' +
572
+ 'the query, no Authorization header): the signature lives in ' +
573
+ 'the URL itself. Default "deny".'),
574
+ sigv4a: sigv4PolicySchema
575
+ .optional()
576
+ .describe('Policy for SigV4A (AWS4-ECDSA-P256-SHA256) asymmetric ' +
577
+ 'signatures: there is no shared-key HMAC to recompute. ' +
578
+ 'Default "deny".'),
579
+ })
580
+ .strict();
581
+ /**
582
+ * Credentials configuration schema for validation.
583
+ *
584
+ * Declares credential sources (files and environment variables) with a
585
+ * per-source mode; see {@link credentialModeSchema} for what each mode does.
586
+ *
587
+ * Only the sources declared here are affected; the section applies no
588
+ * implicit restrictions beyond them.
589
+ */
590
+ export const CredentialsConfigSchema = z
591
+ .object({
592
+ files: z
593
+ .array(CredentialFileConfigSchema)
594
+ .optional()
595
+ .describe('Credential files or directories to protect'),
596
+ envVars: z
597
+ .array(CredentialEnvVarConfigSchema)
598
+ .optional()
599
+ .describe('Environment variables to protect'),
600
+ allowPlaintextInject: z
601
+ .boolean()
602
+ .optional()
603
+ .describe('Allow sentinel→real substitution on the plain-HTTP proxy path. ' +
604
+ 'Defaults to false: without TLS termination the upstream identity ' +
605
+ 'is unverified and the credential travels in cleartext. Set only ' +
606
+ 'for trusted-network test fixtures.'),
607
+ awsPairs: z
608
+ .array(AwsPairConfigSchema)
609
+ .optional()
610
+ .describe('Explicit groupings of masked env vars into AWS credential pairs ' +
611
+ 'for SigV4 re-signing, for non-standard variable names. The ' +
612
+ 'conventional AWS_ACCESS_KEY_ID / AWS_SECRET_ACCESS_KEY / ' +
613
+ 'AWS_SESSION_TOKEN trio is paired automatically when masked.'),
614
+ sigv4: Sigv4ConfigSchema.optional().describe('Policies for AWS SigV4 request shapes the proxy cannot re-sign ' +
615
+ '(streaming, presigned, sigv4a) when they reference a masked ' +
616
+ 'credential pair: "deny" (default) or "passthrough".'),
617
+ })
618
+ // Reject unknown keys so a stale `credentials.injectHosts` (the removed
619
+ // block-level default) fails loudly instead of being silently stripped.
620
+ .strict();
621
+ /**
622
+ * Network configuration schema for validation
623
+ */
624
+ export const NetworkConfigSchema = z.object({
625
+ allowedDomains: z
626
+ .array(domainPortPatternSchema)
627
+ .describe('List of allowed domains (e.g., ["github.com", "*.npmjs.org", "api.example.com:443"]). ' +
628
+ 'An optional ":port" suffix restricts the entry to that destination port.'),
629
+ deniedDomains: z
630
+ .array(deniedDomainPatternSchema)
631
+ .describe('List of denied domains. Unlike allowedDomains, a bare "*" is accepted here (deny-all). ' +
632
+ 'An optional ":port" suffix (e.g., "*:22") restricts the entry to that destination port.'),
633
+ deniedDomainReasons: z
634
+ .record(z.string(), z.string().min(1))
635
+ .optional()
636
+ .describe('Optional model-facing reason keyed by the exact deniedDomains entry it explains (e.g., {"github.com:22": "SSH pushes to GitHub are blocked; use an https remote"}). ' +
637
+ 'Reported in the <sandbox_violations> line when that entry denies a connection; entries without one use a generic reason. ' +
638
+ 'Keys are matched by exact entry string, so a key with no matching deniedDomains entry never fires.'),
639
+ strictAllowlist: z
640
+ .boolean()
641
+ .optional()
642
+ .describe('If true, hosts not in allowedDomains are denied without consulting the ask callback. Set this when allowedDomains is policy enforcement, not a prompt-suppression hint.'),
643
+ deniedResolvedAddresses: z
644
+ .array(addressRangeSchema)
645
+ .optional()
646
+ .describe('IP addresses / CIDR ranges (IPv4 or IPv6, unbracketed) that an allowed HOSTNAME must not resolve to, ' +
647
+ 'in addition to the built-in set (see README "Resolved-address check") and any IP literal listed in ' +
648
+ 'deniedDomains. A permitted name that resolves only into these is refused instead of dialed. A name may ' +
649
+ 'resolve to a denied address only if that IP literal (and port) is itself in allowedDomains. Not evaluated ' +
650
+ 'for connections routed through parentProxy (including one taken from HTTP_PROXY/HTTPS_PROXY) or mitmProxy (that hop resolves the name).'),
651
+ allowUnixSockets: z
652
+ .array(z.string())
653
+ .optional()
654
+ .describe('macOS only: Unix socket paths to allow. Ignored on Linux (seccomp cannot filter by path).'),
655
+ allowAllUnixSockets: z
656
+ .boolean()
657
+ .optional()
658
+ .describe('If true, allow all Unix sockets (disables blocking on both platforms).'),
659
+ allowLocalBinding: z
660
+ .boolean()
661
+ .optional()
662
+ .describe('Whether to allow binding to local ports (default: false)'),
663
+ allowMachLookup: z
664
+ .array(z.string().refine(val => {
665
+ const prefix = val.endsWith('*') ? val.slice(0, -1) : val;
666
+ return !prefix.includes('*');
667
+ }, {
668
+ message: 'Wildcards are only allowed as a single trailing "*" (e.g., "com.example.*" or "*" for all services).',
669
+ }))
670
+ .optional()
671
+ .describe('macOS only: Additional XPC/Mach service names to allow looking up. Supports trailing-wildcard prefix matching (e.g., "2BUA8C4S2C.com.1password.*"). Needed for tools like 1Password CLI, Playwright, or the iOS Simulator that communicate via XPC.'),
672
+ httpProxyPort: z
673
+ .number()
674
+ .int()
675
+ .min(1)
676
+ .max(65535)
677
+ .optional()
678
+ .describe('Port of an external HTTP proxy to use instead of starting a local one. When provided, the library will skip starting its own HTTP proxy and use this port. The external proxy must handle domain filtering.'),
679
+ socksProxyPort: z
680
+ .number()
681
+ .int()
682
+ .min(1)
683
+ .max(65535)
684
+ .optional()
685
+ .describe('Port of an external SOCKS proxy to use instead of starting a local one. When provided, the library will skip starting its own SOCKS proxy and use this port. The external proxy must handle domain filtering.'),
686
+ mitmProxy: MitmProxyConfigSchema.optional().describe('Optional MITM proxy configuration. Routes matching domains through an upstream proxy via Unix socket while SRT still handles allow/deny filtering.'),
687
+ filterRequest: z
688
+ .custom(v => typeof v === 'function', {
689
+ message: 'filterRequest must be a function',
690
+ })
691
+ .optional()
692
+ .describe('Per-request filter callback. Receives the parsed HTTP request ' +
693
+ '(web-standard Request) and returns {action, reason?}. Denied ' +
694
+ 'requests get a 403 with the reason. If the callback throws, the ' +
695
+ 'request is denied. Applies to plain HTTP through the proxy and, ' +
696
+ 'when tlsTerminate is configured, to terminated HTTPS. SRT does not ' +
697
+ 'provide a policy language; library consumers own matching.'),
698
+ tlsTerminate: z
699
+ .object({
700
+ caCertPath: z
701
+ .string()
702
+ .min(1)
703
+ .optional()
704
+ .describe('Path to a PEM-encoded CA certificate. The sandboxed child is ' +
705
+ 'configured to trust this CA, and the TLS-terminating proxy uses ' +
706
+ 'it to sign per-host certificates. If omitted, on Windows SRT ' +
707
+ 'generates-if-absent a persistent CA under ' +
708
+ '%ProgramData%\\sandbox-runtime\\ca\\ and trusts it in the ' +
709
+ "sandbox user's Root store; on other platforms SRT generates " +
710
+ 'an ephemeral CA into a temp directory for the lifetime of the ' +
711
+ 'session.'),
712
+ caKeyPath: z
713
+ .string()
714
+ .min(1)
715
+ .optional()
716
+ .describe('Path to the PEM-encoded private key for caCertPath.'),
717
+ excludeDomains: z
718
+ .array(domainPatternSchema)
719
+ .optional()
720
+ .describe('Domain patterns (same syntax as allowedDomains) whose HTTPS ' +
721
+ 'connections are NOT terminated. Matching CONNECTs are opaque ' +
722
+ 'byte tunnels: still subject to the allow/deny domain lists, ' +
723
+ 'but the sandboxed client completes its own TLS handshake with ' +
724
+ 'the upstream, so filterRequest and credential injection do not ' +
725
+ 'apply to their HTTPS traffic (plain-HTTP requests to the same ' +
726
+ 'hosts keep the normal request pipeline). Use for hosts the ' +
727
+ 'proxy must not re-originate: ' +
728
+ 'mTLS upstreams (only the client holds the client certificate) ' +
729
+ 'and clients that pin the upstream certificate and would reject ' +
730
+ 'the MITM CA. Hosts still need to be reachable via ' +
731
+ 'allowedDomains; this list only changes how they are tunnelled.'),
732
+ extraCaCertPaths: z
733
+ .array(z.string().min(1))
734
+ .optional()
735
+ .describe('Paths to PEM CA certificate files appended to the trust bundle ' +
736
+ 'the sandboxed child is pointed at, after the MITM CA and the ' +
737
+ "host's regular roots. Use for site-local roots (e.g. an " +
738
+ 'internal mTLS CA) presented by excluded/passthrough hosts, so ' +
739
+ 'the child can verify them itself. Only the CERTIFICATE blocks ' +
740
+ 'of each file are copied; files that are missing, unreadable, ' +
741
+ 'or contain no PEM CERTIFICATE block are skipped (with a debug ' +
742
+ 'log), so paths that exist on only some hosts are safe to list.'),
743
+ })
744
+ .refine(o => !o.caCertPath === !o.caKeyPath, {
745
+ message: 'caCertPath and caKeyPath must be provided together',
746
+ })
747
+ .optional()
748
+ .describe('[EXPERIMENTAL] Enable in-process TLS termination so HTTPS ' +
749
+ 'request/response bodies are visible to SRT. Provide a CA cert+key, ' +
750
+ 'or omit both to have SRT generate an ephemeral one.'),
751
+ parentProxy: ParentProxyConfigSchema.optional().describe("Upstream HTTP proxy for outbound connections. When set, SRT's proxy " +
752
+ 'tunnels non-mitmProxy traffic through this parent instead of ' +
753
+ 'connecting directly. Falls back to HTTP_PROXY/HTTPS_PROXY/NO_PROXY ' +
754
+ 'env vars if unset.'),
755
+ });
756
+ /**
757
+ * Filesystem configuration schema for validation
758
+ */
759
+ export const FilesystemConfigSchema = z.object({
760
+ disabled: z
761
+ .boolean()
762
+ .optional()
763
+ .describe('Disable all filesystem policy enforcement. When true, no read or write rules are emitted: ' +
764
+ 'denyRead/allowRead/allowWrite/denyWrite are ignored, and the built-in mandatory write ' +
765
+ 'protections (.git/hooks, .git/config, shell rc files, .mcp.json, .vscode/.idea, ' +
766
+ '.claude/commands, .claude/agents) are NOT applied. Use only when the sandboxed process ' +
767
+ 'is trusted with full host filesystem access. Network and credential-env restrictions ' +
768
+ 'still apply. On Linux, /dev is still replaced by the bwrap minimal devtmpfs.'),
769
+ denyRead: z.array(filesystemPathSchema).describe('Paths denied for reading'),
770
+ allowRead: z
771
+ .array(filesystemPathSchema)
772
+ .optional()
773
+ .describe('Paths to re-allow reading within denied regions (takes precedence over denyRead). ' +
774
+ 'Use with denyRead to deny a broad region then allow back specific subdirectories.'),
775
+ allowWrite: z
776
+ .array(filesystemPathSchema)
777
+ .describe('Paths allowed for writing'),
778
+ denyWrite: z
779
+ .array(filesystemPathSchema)
780
+ .describe('Paths denied for writing (takes precedence over allowWrite)'),
781
+ allowGitConfig: z
782
+ .boolean()
783
+ .optional()
784
+ .describe('Allow writes to .git/config files (default: false). Enables git remote URL updates while keeping .git/hooks protected.'),
785
+ });
786
+ /**
787
+ * Configuration schema for ignoring specific sandbox violations
788
+ * Maps command patterns to filesystem paths to ignore violations for.
789
+ */
790
+ export const IgnoreViolationsConfigSchema = z
791
+ .record(z.string(), z.array(z.string()))
792
+ .describe('Map of command patterns to filesystem paths to ignore violations for. Use "*" to match all commands');
793
+ /**
794
+ * Ripgrep configuration schema
795
+ */
796
+ export const RipgrepConfigSchema = z.object({
797
+ command: z.string().describe('The ripgrep command to execute'),
798
+ args: z
799
+ .array(z.string())
800
+ .optional()
801
+ .describe('Additional arguments to pass before ripgrep args'),
802
+ argv0: z
803
+ .string()
804
+ .optional()
805
+ .describe('Override argv[0] when spawning (for multicall binaries that dispatch on argv[0])'),
806
+ });
807
+ /**
808
+ * Git configuration schema (cross-platform). Injected via
809
+ * `GIT_CONFIG_COUNT` / `GIT_CONFIG_KEY_<n>` / `GIT_CONFIG_VALUE_<n>`
810
+ * env vars — see `buildGitConfigEnv` in `sandbox-utils.ts`.
811
+ */
812
+ export const GitConfigSchema = z.object({
813
+ safeDirectories: z
814
+ .array(z.string())
815
+ .default([])
816
+ .describe('Directories git should treat as safe (`safe.directory`) even though ' +
817
+ "they're owned by a different user inside the sandbox. Use for the " +
818
+ 'repo top-level when launching from a subdirectory. Does NOT grant ' +
819
+ 'write.'),
820
+ });
821
+ /**
822
+ * Configuration for locating/invoking the `srt-win` helper (Windows
823
+ * only). An embedder that links `srt-win`'s CLI into its own
824
+ * multicall binary points `path` at that binary; spawns then pass
825
+ * `--srt-win` as `argv[1]` (see `SRT_WIN_DISPATCH_ARG1` in
826
+ * `windows-sandbox-utils.ts` / `srt_win::SRT_WIN_DISPATCH_ARG1`) so
827
+ * the embedder's dispatcher can route to `srt_win::run_from_args`.
828
+ * Windows cannot reliably preserve a spoofed `argv[0]` across
829
+ * `CreateProcessWithLogonW` / `ShellExecuteExW(runas)`, so dispatch
830
+ * keys on `argv[1]`, not on `argv[0]` like
831
+ * {@link SeccompConfigSchema} does on Linux.
832
+ */
833
+ export const SrtWinConfigSchema = z.object({
834
+ path: z
835
+ .string()
836
+ .min(1)
837
+ .describe('Path to the srt-win binary. Pass the exported ' +
838
+ 'VENDORED_SRT_WIN_EXE constant to use the packaged ' +
839
+ 'vendor/srt-win/<arch>/srt-win.exe (see its WARNING: in a dev ' +
840
+ 'checkout that file may sit inside your sandbox write grant). ' +
841
+ 'The binary is spawned with the `--srt-win` argv[1] sentinel so ' +
842
+ "a multicall dispatcher can route to srt-win's CLI."),
843
+ });
844
+ /**
845
+ * Windows-specific configuration schema. See
846
+ * `windows-sandbox-utils.ts` for the install flow these settings
847
+ * must agree with.
848
+ *
849
+ * Canonical: `sublayerGuid`; the `wfpSublayerGuid` alias is resolved
850
+ * at read sites (`sublayerGuid ?? wfpSublayerGuid`) rather than via
851
+ * `.transform()` so this stays a plain `ZodObject` for consumers that
852
+ * `.extend()`/`.shape` it.
853
+ */
854
+ export const WindowsConfigSchema = z.object({
855
+ sandboxUser: z
856
+ .string()
857
+ .min(1)
858
+ .max(20, 'Windows local usernames are limited to 20 characters')
859
+ .optional()
860
+ .describe('Name for the dedicated sandbox user account that `srt-win install` ' +
861
+ 'creates and the sandboxed child runs as. Default: `srt-sandbox`. ' +
862
+ 'Install refuses if an account by this name already exists and ' +
863
+ 'srt-win did not create it (it will not rotate the password of an ' +
864
+ 'account it does not own). Must match what `srt-win install ' +
865
+ '--sandbox-user` was run with.'),
866
+ sublayerGuid: z
867
+ .string()
868
+ .uuid()
869
+ .optional()
870
+ .describe('WFP sublayer GUID under which the filters were installed. Omit to ' +
871
+ 'use the srt-win compile-time default. Set this when filters were ' +
872
+ 'installed by enterprise tooling under a custom sublayer.'),
873
+ wfpSublayerGuid: z
874
+ .string()
875
+ .uuid()
876
+ .optional()
877
+ .describe('Deprecated alias for sublayerGuid.'),
878
+ proxyPortRange: z
879
+ .tuple([z.number().int().min(1), z.number().int().max(65535)])
880
+ .refine(([lo, hi]) => lo <= hi && hi - lo <= 64, {
881
+ message: 'low must be ≤ high and range width ≤ 64',
882
+ })
883
+ .optional()
884
+ .describe('Inclusive [low, high] port range the JS mux proxy listeners bind ' +
885
+ 'inside. MUST match the range passed to `srt-win install ' +
886
+ '--proxy-port-range` (default 60080–60089) — the WFP loopback ' +
887
+ 'permit only covers ports in that range.'),
888
+ srtWin: SrtWinConfigSchema.optional().describe('How to locate/invoke the srt-win helper binary. `srtWin.path` is ' +
889
+ 'required to use the Windows sandbox — your own (multicall) binary, ' +
890
+ 'or the exported VENDORED_SRT_WIN_EXE constant for the packaged exe.'),
891
+ });
892
+ /**
893
+ * Seccomp configuration schema (Linux only)
894
+ */
895
+ export const SeccompConfigSchema = z.object({
896
+ applyPath: z.string().optional().describe('Path to the apply-seccomp binary'),
897
+ argv0: z
898
+ .string()
899
+ .optional()
900
+ .describe('Invoke apply-seccomp as a multicall binary that dispatches on the ' +
901
+ 'ARGV0 environment variable. When set, applyPath is used verbatim ' +
902
+ '(no existence check) and the invocation inside bwrap is prefixed ' +
903
+ 'with ARGV0=<this value>. The caller is responsible for ensuring ' +
904
+ 'applyPath resolves inside the bwrap namespace and that the target ' +
905
+ 'binary implements the apply-seccomp interface when ARGV0 matches.'),
906
+ });
907
+ /**
908
+ * An inert deny is fail-open, so a deny glob whose trailing separator leaves
909
+ * it matching nothing is rejected; the same glob as an allow fails closed,
910
+ * so the allow lists keep the plain path schema.
911
+ */
912
+ function addInertSlashedDenyGlobIssue(value, path, ctx) {
913
+ const onWindows = getPlatform() === 'windows';
914
+ const trailingSeparator = onWindows ? /[\\/]+$/ : /\/+$/;
915
+ if (!trailingSeparator.test(value))
916
+ return;
917
+ if (!containsGlobCharsForPlatform(value))
918
+ return;
919
+ // Only absolute and `~`-rooted spellings reach a backend with the
920
+ // separator still attached: normalizePathForSandbox resolves a relative
921
+ // spelling through path.resolve, which drops it, so `build/*/` is live.
922
+ const rooted = onWindows
923
+ ? win32Path.isAbsolute(value)
924
+ : posixPath.isAbsolute(value);
925
+ if (!rooted && !value.startsWith('~'))
926
+ return;
927
+ ctx.addIssue({
928
+ code: z.ZodIssueCode.custom,
929
+ path,
930
+ message: `Deny glob "${value}" ends in a separator, so the pattern can match ` +
931
+ `no path. Write "${value.replace(trailingSeparator, '')}", or add a ` +
932
+ `"**" segment to match at any depth.`,
933
+ });
934
+ }
935
+ /**
936
+ * Main configuration schema for Sandbox Runtime validation
937
+ */
938
+ export const SandboxRuntimeConfigSchema = z
939
+ .object({
940
+ network: NetworkConfigSchema.describe('Network restrictions configuration'),
941
+ filesystem: FilesystemConfigSchema.describe('Filesystem restrictions configuration'),
942
+ credentials: CredentialsConfigSchema.optional().describe('Credential handling configuration. Only the explicitly declared files ' +
943
+ 'and environment variables are restricted.'),
944
+ ignoreViolations: IgnoreViolationsConfigSchema.optional().describe('Optional configuration for ignoring specific violations'),
945
+ enableWeakerNestedSandbox: z
946
+ .boolean()
947
+ .optional()
948
+ .describe('Enable weaker nested sandbox mode (for Docker environments)'),
949
+ enableWeakerNetworkIsolation: z
950
+ .boolean()
951
+ .optional()
952
+ .describe('Enable weaker network isolation to allow access to com.apple.trustd.agent (macOS only). ' +
953
+ 'This is needed for Go programs (gh, gcloud, terraform, kubectl, etc.) to verify TLS certificates ' +
954
+ 'when using httpProxyPort with a MITM proxy and custom CA. Enabling this opens a potential data ' +
955
+ 'exfiltration vector through the trustd service. Only enable if you need Go TLS verification.'),
956
+ allowAppleEvents: z
957
+ .boolean()
958
+ .optional()
959
+ .describe('Allow sending Apple Events and Launch Services open requests from the sandbox (macOS only). ' +
960
+ 'Needed for open, osascript, and anything that opens URLs or scripts other apps via AppleScript. ' +
961
+ 'This removes code-execution isolation: sandboxed commands can launch other applications ' +
962
+ 'unsandboxed with no user prompt (launched apps are not subject to the sandbox filesystem or ' +
963
+ 'network restrictions), and can script running apps subject to TCC automation consent. ' +
964
+ 'Default: false.'),
965
+ ripgrep: RipgrepConfigSchema.optional().describe('Custom ripgrep configuration (default: { command: "rg" })'),
966
+ mandatoryDenySearchDepth: z
967
+ .number()
968
+ .int()
969
+ .min(1)
970
+ .max(10)
971
+ .optional()
972
+ .describe('Maximum directory depth to search for dangerous files on Linux (default: 3). ' +
973
+ 'Higher values provide more protection but slower performance.'),
974
+ allowPty: z
975
+ .boolean()
976
+ .optional()
977
+ .describe('Allow pseudo-terminal (pty) operations (macOS only)'),
978
+ seccomp: SeccompConfigSchema.optional().describe('Custom seccomp binary paths (Linux only).'),
979
+ bwrapPath: binaryPathSchema
980
+ .optional()
981
+ .describe('Linux only: absolute path to the bwrap (bubblewrap) binary. ' +
982
+ 'When set, this path is used directly instead of resolving "bwrap" via PATH.'),
983
+ socatPath: binaryPathSchema
984
+ .optional()
985
+ .describe('Linux only: absolute path to the socat binary. ' +
986
+ 'When set, this path is used directly instead of resolving "socat" via PATH.'),
987
+ javaAgentJarPath: binaryPathSchema
988
+ .optional()
989
+ .describe('macOS/Linux: absolute path to srt-proxy-agent.jar, the JVM agent ' +
990
+ 'injected via JAVA_TOOL_OPTIONS so Java tools honor the proxy. ' +
991
+ 'When set, used instead of looking under vendor/java-proxy-agent/. ' +
992
+ 'For consumers that bundle sandbox-runtime and ship the jar separately.'),
993
+ windows: WindowsConfigSchema.optional().describe('Windows-specific settings (WFP sublayer, proxy port range).'),
994
+ git: GitConfigSchema.optional().describe('Git configuration to inject via GIT_CONFIG_* env vars ' +
995
+ '(cross-platform). `safeDirectories` marks paths as ' +
996
+ '`safe.directory` without adding them to `filesystem.allowWrite`.'),
997
+ })
998
+ .superRefine((cfg, ctx) => {
999
+ // filesystem.disabled drops every filesystem rule, the credential file
1000
+ // denies included (getFsReadConfig, getFsWriteConfig and
1001
+ // computeWindowsFsAccessSet all short-circuit on it), so an inert deny
1002
+ // under it is not a hole.
1003
+ const fsEnforced = !cfg.filesystem.disabled;
1004
+ if (fsEnforced) {
1005
+ for (const [idx, p] of cfg.filesystem.denyRead.entries()) {
1006
+ addInertSlashedDenyGlobIssue(p, ['filesystem', 'denyRead', idx], ctx);
1007
+ }
1008
+ for (const [idx, p] of cfg.filesystem.denyWrite.entries()) {
1009
+ addInertSlashedDenyGlobIssue(p, ['filesystem', 'denyWrite', idx], ctx);
1010
+ }
1011
+ }
1012
+ const creds = cfg.credentials;
1013
+ if (!creds)
1014
+ return;
1015
+ // Every per-entry injectHosts pattern must be reachable via
1016
+ // allowedDomains — semantic (wildcard-aware) coverage, not literal
1017
+ // string membership, so `injectHosts: ['api.github.com']` is accepted
1018
+ // when `allowedDomains: ['*.github.com']`.
1019
+ // Host-scoped view of the allowlist (":port" suffixes dropped) —
1020
+ // injection is per-host, not per-port.
1021
+ const allowedHosts = cfg.network.allowedDomains.map(stripDomainPatternPort);
1022
+ const checkSubset = (hosts, path) => {
1023
+ for (const [i, host] of hosts.entries()) {
1024
+ if (!isInjectHostCoveredByAllowedDomains(host, allowedHosts)) {
1025
+ ctx.addIssue({
1026
+ code: z.ZodIssueCode.custom,
1027
+ path: [...path, i],
1028
+ message: `injectHosts entry "${host}" is not reachable via ` +
1029
+ `network.allowedDomains — add "${host}" (or a covering ` +
1030
+ `wildcard) to allowedDomains, or remove it from injectHosts.`,
1031
+ });
1032
+ }
1033
+ }
1034
+ };
1035
+ // Per-credential checks. Substitution is gated per sentinel; an entry
1036
+ // with no injectHosts defaults to network.allowedDomains (every
1037
+ // reachable host), so absence is fine. An *explicit* empty list is
1038
+ // rejected — "mask but never inject" is self-contradictory and almost
1039
+ // certainly a config mistake. Applies to both env vars and files.
1040
+ let hasMasked = false;
1041
+ const checkMaskedEntry = (entry, path) => {
1042
+ if (entry.injectHosts) {
1043
+ checkSubset(entry.injectHosts, [...path, 'injectHosts']);
1044
+ }
1045
+ if (entry.mode !== 'mask')
1046
+ return;
1047
+ hasMasked = true;
1048
+ // Credential substitution only runs on the TLS-terminated path, so a
1049
+ // host covered by tlsTerminate.excludeDomains can never receive the
1050
+ // real value — the upstream sees the placeholder. Reject the
1051
+ // spellings that are *entirely* self-contradictory:
1052
+ // - an explicit injectHosts entry whose every concrete host is
1053
+ // excluded (isInjectHostCoveredByAllowedDomains is the generic
1054
+ // "pattern fully covered by pattern list" predicate);
1055
+ // - no injectHosts (= every allowedDomain) while excludeDomains
1056
+ // covers all of allowedDomains, i.e. injection could never
1057
+ // happen anywhere.
1058
+ // A *partial* overlap is legitimate (excluded hosts simply don't get
1059
+ // the credential) and is reported at runtime instead.
1060
+ const exclude = cfg.network.tlsTerminate?.excludeDomains;
1061
+ if (exclude?.length) {
1062
+ if (entry.injectHosts) {
1063
+ for (const [i, host] of entry.injectHosts.entries()) {
1064
+ if (isInjectHostCoveredByAllowedDomains(host, exclude)) {
1065
+ ctx.addIssue({
1066
+ code: z.ZodIssueCode.custom,
1067
+ path: [...path, 'injectHosts', i],
1068
+ message: `injectHosts entry "${host}" is entirely covered by ` +
1069
+ `network.tlsTerminate.excludeDomains. Credential ` +
1070
+ `injection only runs on TLS-terminated connections, so ` +
1071
+ `this host would receive the placeholder instead of the ` +
1072
+ `credential. Remove it from one of the two lists.`,
1073
+ });
1074
+ }
1075
+ }
1076
+ }
1077
+ else if (allowedHosts.length > 0 &&
1078
+ allowedHosts.every(p => isInjectHostCoveredByAllowedDomains(p, exclude))) {
1079
+ ctx.addIssue({
1080
+ code: z.ZodIssueCode.custom,
1081
+ path,
1082
+ message: `This masked credential has no injectHosts, so it defaults ` +
1083
+ `to network.allowedDomains — but ` +
1084
+ `network.tlsTerminate.excludeDomains covers every allowed ` +
1085
+ `domain, so it could never be injected anywhere. Credential ` +
1086
+ `injection only runs on TLS-terminated connections.`,
1087
+ });
1088
+ }
1089
+ }
1090
+ if (entry.injectHosts !== undefined && entry.injectHosts.length === 0) {
1091
+ ctx.addIssue({
1092
+ code: z.ZodIssueCode.custom,
1093
+ path,
1094
+ message: `injectHosts is explicitly empty — the credential would be ` +
1095
+ `masked but never injected. Omit injectHosts to default to ` +
1096
+ `network.allowedDomains, or list the intended hosts.`,
1097
+ });
1098
+ }
1099
+ };
1100
+ for (const [idx, v] of (creds.envVars ?? []).entries()) {
1101
+ checkMaskedEntry(v, ['credentials', 'envVars', idx]);
1102
+ // maskClaims names fields inside a decoded payload; without decode
1103
+ // there is no payload to look inside — reject the contradiction
1104
+ // loudly rather than silently masking nothing.
1105
+ if (v.maskClaims !== undefined && v.decode === undefined) {
1106
+ ctx.addIssue({
1107
+ code: z.ZodIssueCode.custom,
1108
+ path: ['credentials', 'envVars', idx, 'maskClaims'],
1109
+ message: `maskClaims requires decode — it names claims inside the ` +
1110
+ `decoded payload. Set decode (e.g. "jwt"), or remove ` +
1111
+ `maskClaims to mask the whole value.`,
1112
+ });
1113
+ }
1114
+ // Same posture as an explicitly empty injectHosts: "decode but mask
1115
+ // no claims" is self-contradictory and almost certainly a mistake.
1116
+ if (v.maskClaims !== undefined && v.maskClaims.length === 0) {
1117
+ ctx.addIssue({
1118
+ code: z.ZodIssueCode.custom,
1119
+ path: ['credentials', 'envVars', idx, 'maskClaims'],
1120
+ message: `maskClaims is explicitly empty — no claim would ever be ` +
1121
+ `masked. Omit maskClaims to mask the whole token, or list ` +
1122
+ `the claims to protect.`,
1123
+ });
1124
+ }
1125
+ }
1126
+ for (const [idx, f] of (creds.files ?? []).entries()) {
1127
+ checkMaskedEntry(f, ['credentials', 'files', idx]);
1128
+ // maskClaims names fields inside a decoded payload; without decode
1129
+ // there is no payload to look inside — reject the contradiction
1130
+ // loudly rather than silently masking nothing.
1131
+ if (f.maskClaims !== undefined && f.decode === undefined) {
1132
+ ctx.addIssue({
1133
+ code: z.ZodIssueCode.custom,
1134
+ path: ['credentials', 'files', idx, 'maskClaims'],
1135
+ message: `maskClaims requires decode — it names claims inside the ` +
1136
+ `decoded payload. Set decode (e.g. "jwt"), or remove ` +
1137
+ `maskClaims to mask the extracted value whole.`,
1138
+ });
1139
+ }
1140
+ // Same posture as an explicitly empty injectHosts: "decode but mask
1141
+ // no claims" is self-contradictory and almost certainly a mistake.
1142
+ if (f.maskClaims !== undefined && f.maskClaims.length === 0) {
1143
+ ctx.addIssue({
1144
+ code: z.ZodIssueCode.custom,
1145
+ path: ['credentials', 'files', idx, 'maskClaims'],
1146
+ message: `maskClaims is explicitly empty — no claim would ever be ` +
1147
+ `masked. Omit maskClaims to mask the whole token, or list ` +
1148
+ `the claims to protect.`,
1149
+ });
1150
+ }
1151
+ // Whole-file masking replaces one file's bytes with one sentinel;
1152
+ // a directory has no single content to mask. The hard check is at
1153
+ // runtime (stat after path normalization) — this catches the obvious
1154
+ // syntactic case (trailing slash) early with a clearer error.
1155
+ if (f.mode === 'mask' && f.path.endsWith('/')) {
1156
+ ctx.addIssue({
1157
+ code: z.ZodIssueCode.custom,
1158
+ path: ['credentials', 'files', idx, 'path'],
1159
+ message: `Credential mode "mask" applies to a single file, not a ` +
1160
+ `directory. Use mode "deny" for "${f.path}", or point at the ` +
1161
+ `credential file inside it.`,
1162
+ });
1163
+ }
1164
+ // A `mode: 'deny'` path is unioned into the read-deny set and takes
1165
+ // the same glob branches as filesystem.denyRead.
1166
+ if (fsEnforced && f.mode === 'deny') {
1167
+ addInertSlashedDenyGlobIssue(f.path, ['credentials', 'files', idx, 'path'], ctx);
1168
+ }
1169
+ }
1170
+ // awsPairs entries must reference whole-value masked env vars: the
1171
+ // re-signer needs the fake value to BE the sentinel (exact-match
1172
+ // trigger on the access key id in the credential scope) and the real
1173
+ // value to be the entire secret. extract/decode entries violate both.
1174
+ const seenPairVars = new Set();
1175
+ for (const [idx, pair] of (creds.awsPairs ?? []).entries()) {
1176
+ const vars = [
1177
+ ['accessKeyIdVar', pair.accessKeyIdVar],
1178
+ ['secretAccessKeyVar', pair.secretAccessKeyVar],
1179
+ ];
1180
+ if (pair.sessionTokenVar !== undefined) {
1181
+ vars.push(['sessionTokenVar', pair.sessionTokenVar]);
1182
+ }
1183
+ for (const [field, name] of vars) {
1184
+ const path = ['credentials', 'awsPairs', idx, field];
1185
+ if (seenPairVars.has(name)) {
1186
+ ctx.addIssue({
1187
+ code: z.ZodIssueCode.custom,
1188
+ path,
1189
+ message: `"${name}" appears in more than one awsPairs slot (within ` +
1190
+ `or across pairs) — each variable can fill exactly one slot.`,
1191
+ });
1192
+ continue;
1193
+ }
1194
+ seenPairVars.add(name);
1195
+ const entry = (creds.envVars ?? []).find(v => v.name === name);
1196
+ if (entry === undefined || entry.mode !== 'mask') {
1197
+ ctx.addIssue({
1198
+ code: z.ZodIssueCode.custom,
1199
+ path,
1200
+ message: `"${name}" does not reference a credentials.envVars entry ` +
1201
+ `with mode "mask" — an AWS pair links already-masked ` +
1202
+ `variables; add the entry (masking is the opt-in for ` +
1203
+ `SigV4 re-signing).`,
1204
+ });
1205
+ }
1206
+ else if (entry.extract !== undefined || entry.decode !== undefined) {
1207
+ ctx.addIssue({
1208
+ code: z.ZodIssueCode.custom,
1209
+ path,
1210
+ message: `"${name}" uses extract/decode, but an AWS pair member ` +
1211
+ `must be masked whole-value: the SigV4 trigger is an ` +
1212
+ `exact match of the fake access key id, and the signer ` +
1213
+ `needs the entire real value.`,
1214
+ });
1215
+ }
1216
+ }
1217
+ }
1218
+ // Masked credentials require the TLS-terminated proxy path so the real
1219
+ // value is only sent to a cert-verified upstream. allowPlaintextInject
1220
+ // is the explicit escape hatch.
1221
+ if (hasMasked &&
1222
+ cfg.network.tlsTerminate === undefined &&
1223
+ !creds.allowPlaintextInject) {
1224
+ ctx.addIssue({
1225
+ code: z.ZodIssueCode.custom,
1226
+ path: ['credentials'],
1227
+ message: 'Credential masking requires network.tlsTerminate so substitution ' +
1228
+ 'runs only over a verified TLS connection. Enable tlsTerminate, or ' +
1229
+ 'set credentials.allowPlaintextInject to opt out (not recommended).',
1230
+ });
1231
+ }
1232
+ });
1233
+ //# sourceMappingURL=sandbox-config.js.map