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.
- package/LICENSE +201 -0
- package/NOTICE +10 -0
- package/README.md +77 -0
- package/dist/approvals.d.ts +72 -0
- package/dist/approvals.js +167 -0
- package/dist/approvals.js.map +1 -0
- package/dist/audit.d.ts +28 -0
- package/dist/audit.js +40 -0
- package/dist/audit.js.map +1 -0
- package/dist/cli.d.ts +2 -0
- package/dist/cli.js +70 -0
- package/dist/cli.js.map +1 -0
- package/dist/context-files.d.ts +14 -0
- package/dist/context-files.js +113 -0
- package/dist/context-files.js.map +1 -0
- package/dist/contracts.d.ts +258 -0
- package/dist/contracts.js +102 -0
- package/dist/contracts.js.map +1 -0
- package/dist/index.d.ts +28 -0
- package/dist/index.js +106 -0
- package/dist/index.js.map +1 -0
- package/dist/native/darwin-arm64/artifact.json +5 -0
- package/dist/native/darwin-arm64/pi-guard-execpolicy +0 -0
- package/dist/native/linux-x64/artifact.json +5 -0
- package/dist/native/linux-x64/pi-guard-execpolicy +0 -0
- package/dist/policy/domains.d.ts +5 -0
- package/dist/policy/domains.js +18 -0
- package/dist/policy/domains.js.map +1 -0
- package/dist/policy/index.d.ts +56 -0
- package/dist/policy/index.js +304 -0
- package/dist/policy/index.js.map +1 -0
- package/dist/policy/paths.d.ts +5 -0
- package/dist/policy/paths.js +54 -0
- package/dist/policy/paths.js.map +1 -0
- package/dist/policy/rules.d.ts +36 -0
- package/dist/policy/rules.js +61 -0
- package/dist/policy/rules.js.map +1 -0
- package/dist/policy/shell.d.ts +14 -0
- package/dist/policy/shell.js +122 -0
- package/dist/policy/shell.js.map +1 -0
- package/dist/reports.d.ts +21 -0
- package/dist/reports.js +42 -0
- package/dist/reports.js.map +1 -0
- package/dist/review/context.d.ts +25 -0
- package/dist/review/context.js +108 -0
- package/dist/review/context.js.map +1 -0
- package/dist/review/investigation.d.ts +39 -0
- package/dist/review/investigation.js +36 -0
- package/dist/review/investigation.js.map +1 -0
- package/dist/review/lifecycle.d.ts +29 -0
- package/dist/review/lifecycle.js +71 -0
- package/dist/review/lifecycle.js.map +1 -0
- package/dist/review/policy.d.ts +4 -0
- package/dist/review/policy.js +15 -0
- package/dist/review/policy.js.map +1 -0
- package/dist/review/upstream-policy.d.ts +2 -0
- package/dist/review/upstream-policy.js +210 -0
- package/dist/review/upstream-policy.js.map +1 -0
- package/dist/reviewer.d.ts +45 -0
- package/dist/reviewer.js +148 -0
- package/dist/reviewer.js.map +1 -0
- package/dist/sandbox/broker.d.ts +1 -0
- package/dist/sandbox/broker.js +135 -0
- package/dist/sandbox/broker.js.map +1 -0
- package/dist/sandbox/config.d.ts +5 -0
- package/dist/sandbox/config.js +91 -0
- package/dist/sandbox/config.js.map +1 -0
- package/dist/sandbox/executor.d.ts +20 -0
- package/dist/sandbox/executor.js +144 -0
- package/dist/sandbox/executor.js.map +1 -0
- package/dist/sandbox/hard-links.d.ts +4 -0
- package/dist/sandbox/hard-links.js +145 -0
- package/dist/sandbox/hard-links.js.map +1 -0
- package/dist/sandbox/linux-read-paths.d.ts +7 -0
- package/dist/sandbox/linux-read-paths.js +47 -0
- package/dist/sandbox/linux-read-paths.js.map +1 -0
- package/dist/sandbox/paths.d.ts +3 -0
- package/dist/sandbox/paths.js +10 -0
- package/dist/sandbox/paths.js.map +1 -0
- package/dist/sandbox/runtime-write-paths.d.ts +2 -0
- package/dist/sandbox/runtime-write-paths.js +8 -0
- package/dist/sandbox/runtime-write-paths.js.map +1 -0
- package/dist/sandbox/seccomp.d.ts +5 -0
- package/dist/sandbox/seccomp.js +16 -0
- package/dist/sandbox/seccomp.js.map +1 -0
- package/dist/sandbox/worker.d.ts +1 -0
- package/dist/sandbox/worker.js +73 -0
- package/dist/sandbox/worker.js.map +1 -0
- package/dist/signals.d.ts +10 -0
- package/dist/signals.js +21 -0
- package/dist/signals.js.map +1 -0
- package/dist/startup.d.ts +22 -0
- package/dist/startup.js +100 -0
- package/dist/startup.js.map +1 -0
- package/dist/tools/controller.d.ts +63 -0
- package/dist/tools/controller.js +286 -0
- package/dist/tools/controller.js.map +1 -0
- package/dist/tools/external.d.ts +30 -0
- package/dist/tools/external.js +24 -0
- package/dist/tools/external.js.map +1 -0
- package/dist/tools/mcp.d.ts +17 -0
- package/dist/tools/mcp.js +186 -0
- package/dist/tools/mcp.js.map +1 -0
- package/docs/publishing.md +73 -0
- package/docs/security/dependencies.md +43 -0
- package/docs/testing/auto-review-protection.md +130 -0
- package/docs/usage.md +217 -0
- package/native/execpolicy/LICENSE +201 -0
- package/native/execpolicy/NOTICE +6 -0
- package/node_modules/@anthropic-ai/sandbox-runtime/LICENSE +201 -0
- package/node_modules/@anthropic-ai/sandbox-runtime/README.md +901 -0
- package/node_modules/@anthropic-ai/sandbox-runtime/dist/cli.d.ts +3 -0
- package/node_modules/@anthropic-ai/sandbox-runtime/dist/cli.d.ts.map +1 -0
- package/node_modules/@anthropic-ai/sandbox-runtime/dist/cli.js +472 -0
- package/node_modules/@anthropic-ai/sandbox-runtime/dist/cli.js.map +1 -0
- package/node_modules/@anthropic-ai/sandbox-runtime/dist/index.d.ts +19 -0
- package/node_modules/@anthropic-ai/sandbox-runtime/dist/index.d.ts.map +1 -0
- package/node_modules/@anthropic-ai/sandbox-runtime/dist/index.js +17 -0
- package/node_modules/@anthropic-ai/sandbox-runtime/dist/index.js.map +1 -0
- package/node_modules/@anthropic-ai/sandbox-runtime/dist/sandbox/address.d.ts +52 -0
- package/node_modules/@anthropic-ai/sandbox-runtime/dist/sandbox/address.d.ts.map +1 -0
- package/node_modules/@anthropic-ai/sandbox-runtime/dist/sandbox/address.js +153 -0
- package/node_modules/@anthropic-ai/sandbox-runtime/dist/sandbox/address.js.map +1 -0
- package/node_modules/@anthropic-ai/sandbox-runtime/dist/sandbox/aws-sigv4.d.ts +164 -0
- package/node_modules/@anthropic-ai/sandbox-runtime/dist/sandbox/aws-sigv4.d.ts.map +1 -0
- package/node_modules/@anthropic-ai/sandbox-runtime/dist/sandbox/aws-sigv4.js +246 -0
- package/node_modules/@anthropic-ai/sandbox-runtime/dist/sandbox/aws-sigv4.js.map +1 -0
- package/node_modules/@anthropic-ai/sandbox-runtime/dist/sandbox/body-substitution.d.ts +58 -0
- package/node_modules/@anthropic-ai/sandbox-runtime/dist/sandbox/body-substitution.d.ts.map +1 -0
- package/node_modules/@anthropic-ai/sandbox-runtime/dist/sandbox/body-substitution.js +128 -0
- package/node_modules/@anthropic-ai/sandbox-runtime/dist/sandbox/body-substitution.js.map +1 -0
- package/node_modules/@anthropic-ai/sandbox-runtime/dist/sandbox/credential-aws-pairs.d.ts +124 -0
- package/node_modules/@anthropic-ai/sandbox-runtime/dist/sandbox/credential-aws-pairs.d.ts.map +1 -0
- package/node_modules/@anthropic-ai/sandbox-runtime/dist/sandbox/credential-aws-pairs.js +258 -0
- package/node_modules/@anthropic-ai/sandbox-runtime/dist/sandbox/credential-aws-pairs.js.map +1 -0
- package/node_modules/@anthropic-ai/sandbox-runtime/dist/sandbox/credential-decode.d.ts +87 -0
- package/node_modules/@anthropic-ai/sandbox-runtime/dist/sandbox/credential-decode.d.ts.map +1 -0
- package/node_modules/@anthropic-ai/sandbox-runtime/dist/sandbox/credential-decode.js +138 -0
- package/node_modules/@anthropic-ai/sandbox-runtime/dist/sandbox/credential-decode.js.map +1 -0
- package/node_modules/@anthropic-ai/sandbox-runtime/dist/sandbox/credential-extract.d.ts +67 -0
- package/node_modules/@anthropic-ai/sandbox-runtime/dist/sandbox/credential-extract.d.ts.map +1 -0
- package/node_modules/@anthropic-ai/sandbox-runtime/dist/sandbox/credential-extract.js +113 -0
- package/node_modules/@anthropic-ai/sandbox-runtime/dist/sandbox/credential-extract.js.map +1 -0
- package/node_modules/@anthropic-ai/sandbox-runtime/dist/sandbox/credential-mask-env.d.ts +70 -0
- package/node_modules/@anthropic-ai/sandbox-runtime/dist/sandbox/credential-mask-env.d.ts.map +1 -0
- package/node_modules/@anthropic-ai/sandbox-runtime/dist/sandbox/credential-mask-env.js +171 -0
- package/node_modules/@anthropic-ai/sandbox-runtime/dist/sandbox/credential-mask-env.js.map +1 -0
- package/node_modules/@anthropic-ai/sandbox-runtime/dist/sandbox/credential-mask-files.d.ts +120 -0
- package/node_modules/@anthropic-ai/sandbox-runtime/dist/sandbox/credential-mask-files.d.ts.map +1 -0
- package/node_modules/@anthropic-ai/sandbox-runtime/dist/sandbox/credential-mask-files.js +281 -0
- package/node_modules/@anthropic-ai/sandbox-runtime/dist/sandbox/credential-mask-files.js.map +1 -0
- package/node_modules/@anthropic-ai/sandbox-runtime/dist/sandbox/credential-sentinel.d.ts +108 -0
- package/node_modules/@anthropic-ai/sandbox-runtime/dist/sandbox/credential-sentinel.d.ts.map +1 -0
- package/node_modules/@anthropic-ai/sandbox-runtime/dist/sandbox/credential-sentinel.js +208 -0
- package/node_modules/@anthropic-ai/sandbox-runtime/dist/sandbox/credential-sentinel.js.map +1 -0
- package/node_modules/@anthropic-ai/sandbox-runtime/dist/sandbox/domain-pattern.d.ts +82 -0
- package/node_modules/@anthropic-ai/sandbox-runtime/dist/sandbox/domain-pattern.d.ts.map +1 -0
- package/node_modules/@anthropic-ai/sandbox-runtime/dist/sandbox/domain-pattern.js +155 -0
- package/node_modules/@anthropic-ai/sandbox-runtime/dist/sandbox/domain-pattern.js.map +1 -0
- package/node_modules/@anthropic-ai/sandbox-runtime/dist/sandbox/generate-seccomp-filter.d.ts +44 -0
- package/node_modules/@anthropic-ai/sandbox-runtime/dist/sandbox/generate-seccomp-filter.d.ts.map +1 -0
- package/node_modules/@anthropic-ai/sandbox-runtime/dist/sandbox/generate-seccomp-filter.js +220 -0
- package/node_modules/@anthropic-ai/sandbox-runtime/dist/sandbox/generate-seccomp-filter.js.map +1 -0
- package/node_modules/@anthropic-ai/sandbox-runtime/dist/sandbox/http-proxy.d.ts +150 -0
- package/node_modules/@anthropic-ai/sandbox-runtime/dist/sandbox/http-proxy.d.ts.map +1 -0
- package/node_modules/@anthropic-ai/sandbox-runtime/dist/sandbox/http-proxy.js +678 -0
- package/node_modules/@anthropic-ai/sandbox-runtime/dist/sandbox/http-proxy.js.map +1 -0
- package/node_modules/@anthropic-ai/sandbox-runtime/dist/sandbox/java-proxy-agent.d.ts +32 -0
- package/node_modules/@anthropic-ai/sandbox-runtime/dist/sandbox/java-proxy-agent.d.ts.map +1 -0
- package/node_modules/@anthropic-ai/sandbox-runtime/dist/sandbox/java-proxy-agent.js +111 -0
- package/node_modules/@anthropic-ai/sandbox-runtime/dist/sandbox/java-proxy-agent.js.map +1 -0
- package/node_modules/@anthropic-ai/sandbox-runtime/dist/sandbox/linux-sandbox-utils.d.ts +305 -0
- package/node_modules/@anthropic-ai/sandbox-runtime/dist/sandbox/linux-sandbox-utils.d.ts.map +1 -0
- package/node_modules/@anthropic-ai/sandbox-runtime/dist/sandbox/linux-sandbox-utils.js +2605 -0
- package/node_modules/@anthropic-ai/sandbox-runtime/dist/sandbox/linux-sandbox-utils.js.map +1 -0
- package/node_modules/@anthropic-ai/sandbox-runtime/dist/sandbox/linux-violation-monitor.d.ts +55 -0
- package/node_modules/@anthropic-ai/sandbox-runtime/dist/sandbox/linux-violation-monitor.d.ts.map +1 -0
- package/node_modules/@anthropic-ai/sandbox-runtime/dist/sandbox/linux-violation-monitor.js +152 -0
- package/node_modules/@anthropic-ai/sandbox-runtime/dist/sandbox/linux-violation-monitor.js.map +1 -0
- package/node_modules/@anthropic-ai/sandbox-runtime/dist/sandbox/listen-in-range.d.ts +12 -0
- package/node_modules/@anthropic-ai/sandbox-runtime/dist/sandbox/listen-in-range.d.ts.map +1 -0
- package/node_modules/@anthropic-ai/sandbox-runtime/dist/sandbox/listen-in-range.js +43 -0
- package/node_modules/@anthropic-ai/sandbox-runtime/dist/sandbox/listen-in-range.js.map +1 -0
- package/node_modules/@anthropic-ai/sandbox-runtime/dist/sandbox/macos-sandbox-utils.d.ts +116 -0
- package/node_modules/@anthropic-ai/sandbox-runtime/dist/sandbox/macos-sandbox-utils.d.ts.map +1 -0
- package/node_modules/@anthropic-ai/sandbox-runtime/dist/sandbox/macos-sandbox-utils.js +1195 -0
- package/node_modules/@anthropic-ai/sandbox-runtime/dist/sandbox/macos-sandbox-utils.js.map +1 -0
- package/node_modules/@anthropic-ai/sandbox-runtime/dist/sandbox/mitm-ca.d.ts +200 -0
- package/node_modules/@anthropic-ai/sandbox-runtime/dist/sandbox/mitm-ca.d.ts.map +1 -0
- package/node_modules/@anthropic-ai/sandbox-runtime/dist/sandbox/mitm-ca.js +443 -0
- package/node_modules/@anthropic-ai/sandbox-runtime/dist/sandbox/mitm-ca.js.map +1 -0
- package/node_modules/@anthropic-ai/sandbox-runtime/dist/sandbox/mitm-leaf.d.ts +28 -0
- package/node_modules/@anthropic-ai/sandbox-runtime/dist/sandbox/mitm-leaf.d.ts.map +1 -0
- package/node_modules/@anthropic-ai/sandbox-runtime/dist/sandbox/mitm-leaf.js +114 -0
- package/node_modules/@anthropic-ai/sandbox-runtime/dist/sandbox/mitm-leaf.js.map +1 -0
- package/node_modules/@anthropic-ai/sandbox-runtime/dist/sandbox/mux-proxy.d.ts +59 -0
- package/node_modules/@anthropic-ai/sandbox-runtime/dist/sandbox/mux-proxy.d.ts.map +1 -0
- package/node_modules/@anthropic-ai/sandbox-runtime/dist/sandbox/mux-proxy.js +159 -0
- package/node_modules/@anthropic-ai/sandbox-runtime/dist/sandbox/mux-proxy.js.map +1 -0
- package/node_modules/@anthropic-ai/sandbox-runtime/dist/sandbox/parent-proxy.d.ts +147 -0
- package/node_modules/@anthropic-ai/sandbox-runtime/dist/sandbox/parent-proxy.d.ts.map +1 -0
- package/node_modules/@anthropic-ai/sandbox-runtime/dist/sandbox/parent-proxy.js +445 -0
- package/node_modules/@anthropic-ai/sandbox-runtime/dist/sandbox/parent-proxy.js.map +1 -0
- package/node_modules/@anthropic-ai/sandbox-runtime/dist/sandbox/read-deny-glob.d.ts +17 -0
- package/node_modules/@anthropic-ai/sandbox-runtime/dist/sandbox/read-deny-glob.d.ts.map +1 -0
- package/node_modules/@anthropic-ai/sandbox-runtime/dist/sandbox/read-deny-glob.js +163 -0
- package/node_modules/@anthropic-ai/sandbox-runtime/dist/sandbox/read-deny-glob.js.map +1 -0
- package/node_modules/@anthropic-ai/sandbox-runtime/dist/sandbox/request-filter.d.ts +83 -0
- package/node_modules/@anthropic-ai/sandbox-runtime/dist/sandbox/request-filter.d.ts.map +1 -0
- package/node_modules/@anthropic-ai/sandbox-runtime/dist/sandbox/request-filter.js +212 -0
- package/node_modules/@anthropic-ai/sandbox-runtime/dist/sandbox/request-filter.js.map +1 -0
- package/node_modules/@anthropic-ai/sandbox-runtime/dist/sandbox/resolved-address-guard.d.ts +76 -0
- package/node_modules/@anthropic-ai/sandbox-runtime/dist/sandbox/resolved-address-guard.d.ts.map +1 -0
- package/node_modules/@anthropic-ai/sandbox-runtime/dist/sandbox/resolved-address-guard.js +221 -0
- package/node_modules/@anthropic-ai/sandbox-runtime/dist/sandbox/resolved-address-guard.js.map +1 -0
- package/node_modules/@anthropic-ai/sandbox-runtime/dist/sandbox/sandbox-config.d.ts +1691 -0
- package/node_modules/@anthropic-ai/sandbox-runtime/dist/sandbox/sandbox-config.d.ts.map +1 -0
- package/node_modules/@anthropic-ai/sandbox-runtime/dist/sandbox/sandbox-config.js +1233 -0
- package/node_modules/@anthropic-ai/sandbox-runtime/dist/sandbox/sandbox-config.js.map +1 -0
- package/node_modules/@anthropic-ai/sandbox-runtime/dist/sandbox/sandbox-manager.d.ts +97 -0
- package/node_modules/@anthropic-ai/sandbox-runtime/dist/sandbox/sandbox-manager.d.ts.map +1 -0
- package/node_modules/@anthropic-ai/sandbox-runtime/dist/sandbox/sandbox-manager.js +1937 -0
- package/node_modules/@anthropic-ai/sandbox-runtime/dist/sandbox/sandbox-manager.js.map +1 -0
- package/node_modules/@anthropic-ai/sandbox-runtime/dist/sandbox/sandbox-schemas.d.ts +113 -0
- package/node_modules/@anthropic-ai/sandbox-runtime/dist/sandbox/sandbox-schemas.d.ts.map +1 -0
- package/node_modules/@anthropic-ai/sandbox-runtime/dist/sandbox/sandbox-schemas.js +3 -0
- package/node_modules/@anthropic-ai/sandbox-runtime/dist/sandbox/sandbox-schemas.js.map +1 -0
- package/node_modules/@anthropic-ai/sandbox-runtime/dist/sandbox/sandbox-utils.d.ts +411 -0
- package/node_modules/@anthropic-ai/sandbox-runtime/dist/sandbox/sandbox-utils.d.ts.map +1 -0
- package/node_modules/@anthropic-ai/sandbox-runtime/dist/sandbox/sandbox-utils.js +1408 -0
- package/node_modules/@anthropic-ai/sandbox-runtime/dist/sandbox/sandbox-utils.js.map +1 -0
- package/node_modules/@anthropic-ai/sandbox-runtime/dist/sandbox/sandbox-violation-store.d.ts +37 -0
- package/node_modules/@anthropic-ai/sandbox-runtime/dist/sandbox/sandbox-violation-store.d.ts.map +1 -0
- package/node_modules/@anthropic-ai/sandbox-runtime/dist/sandbox/sandbox-violation-store.js +125 -0
- package/node_modules/@anthropic-ai/sandbox-runtime/dist/sandbox/sandbox-violation-store.js.map +1 -0
- package/node_modules/@anthropic-ai/sandbox-runtime/dist/sandbox/socks-proxy.d.ts +57 -0
- package/node_modules/@anthropic-ai/sandbox-runtime/dist/sandbox/socks-proxy.d.ts.map +1 -0
- package/node_modules/@anthropic-ai/sandbox-runtime/dist/sandbox/socks-proxy.js +332 -0
- package/node_modules/@anthropic-ai/sandbox-runtime/dist/sandbox/socks-proxy.js.map +1 -0
- package/node_modules/@anthropic-ai/sandbox-runtime/dist/sandbox/tls-terminate-proxy.d.ts +100 -0
- package/node_modules/@anthropic-ai/sandbox-runtime/dist/sandbox/tls-terminate-proxy.d.ts.map +1 -0
- package/node_modules/@anthropic-ai/sandbox-runtime/dist/sandbox/tls-terminate-proxy.js +546 -0
- package/node_modules/@anthropic-ai/sandbox-runtime/dist/sandbox/tls-terminate-proxy.js.map +1 -0
- package/node_modules/@anthropic-ai/sandbox-runtime/dist/sandbox/windows-sandbox-utils.d.ts +923 -0
- package/node_modules/@anthropic-ai/sandbox-runtime/dist/sandbox/windows-sandbox-utils.d.ts.map +1 -0
- package/node_modules/@anthropic-ai/sandbox-runtime/dist/sandbox/windows-sandbox-utils.js +1419 -0
- package/node_modules/@anthropic-ai/sandbox-runtime/dist/sandbox/windows-sandbox-utils.js.map +1 -0
- package/node_modules/@anthropic-ai/sandbox-runtime/dist/utils/config-loader.d.ts +31 -0
- package/node_modules/@anthropic-ai/sandbox-runtime/dist/utils/config-loader.d.ts.map +1 -0
- package/node_modules/@anthropic-ai/sandbox-runtime/dist/utils/config-loader.js +69 -0
- package/node_modules/@anthropic-ai/sandbox-runtime/dist/utils/config-loader.js.map +1 -0
- package/node_modules/@anthropic-ai/sandbox-runtime/dist/utils/debug.d.ts +7 -0
- package/node_modules/@anthropic-ai/sandbox-runtime/dist/utils/debug.d.ts.map +1 -0
- package/node_modules/@anthropic-ai/sandbox-runtime/dist/utils/debug.js +25 -0
- package/node_modules/@anthropic-ai/sandbox-runtime/dist/utils/debug.js.map +1 -0
- package/node_modules/@anthropic-ai/sandbox-runtime/dist/utils/platform.d.ts +15 -0
- package/node_modules/@anthropic-ai/sandbox-runtime/dist/utils/platform.d.ts.map +1 -0
- package/node_modules/@anthropic-ai/sandbox-runtime/dist/utils/platform.js +49 -0
- package/node_modules/@anthropic-ai/sandbox-runtime/dist/utils/platform.js.map +1 -0
- package/node_modules/@anthropic-ai/sandbox-runtime/dist/utils/ripgrep.d.ts +17 -0
- package/node_modules/@anthropic-ai/sandbox-runtime/dist/utils/ripgrep.d.ts.map +1 -0
- package/node_modules/@anthropic-ai/sandbox-runtime/dist/utils/ripgrep.js +37 -0
- package/node_modules/@anthropic-ai/sandbox-runtime/dist/utils/ripgrep.js.map +1 -0
- package/node_modules/@anthropic-ai/sandbox-runtime/dist/utils/shell-quote.d.ts +27 -0
- package/node_modules/@anthropic-ai/sandbox-runtime/dist/utils/shell-quote.d.ts.map +1 -0
- package/node_modules/@anthropic-ai/sandbox-runtime/dist/utils/shell-quote.js +47 -0
- package/node_modules/@anthropic-ai/sandbox-runtime/dist/utils/shell-quote.js.map +1 -0
- package/node_modules/@anthropic-ai/sandbox-runtime/dist/utils/which.d.ts +9 -0
- package/node_modules/@anthropic-ai/sandbox-runtime/dist/utils/which.d.ts.map +1 -0
- package/node_modules/@anthropic-ai/sandbox-runtime/dist/utils/which.js +25 -0
- package/node_modules/@anthropic-ai/sandbox-runtime/dist/utils/which.js.map +1 -0
- package/node_modules/@anthropic-ai/sandbox-runtime/package.json +88 -0
- package/node_modules/@anthropic-ai/sandbox-runtime/vendor/java-proxy-agent/build.ts +95 -0
- package/node_modules/@anthropic-ai/sandbox-runtime/vendor/java-proxy-agent/srt-proxy-agent.jar +0 -0
- package/node_modules/@anthropic-ai/sandbox-runtime/vendor/seccomp/arm64/apply-seccomp +0 -0
- package/node_modules/@anthropic-ai/sandbox-runtime/vendor/seccomp/build.ts +69 -0
- package/node_modules/@anthropic-ai/sandbox-runtime/vendor/seccomp/x64/apply-seccomp +0 -0
- package/node_modules/@anthropic-ai/sandbox-runtime/vendor/srt-win/arm64/srt-win.exe +0 -0
- package/node_modules/@anthropic-ai/sandbox-runtime/vendor/srt-win/build.ts +28 -0
- package/node_modules/@anthropic-ai/sandbox-runtime/vendor/srt-win/x64/srt-win.exe +0 -0
- package/node_modules/@pondwader/socks5-server/.github/workflows/ci.yml +27 -0
- package/node_modules/@pondwader/socks5-server/LICENSE +20 -0
- package/node_modules/@pondwader/socks5-server/README.md +151 -0
- package/node_modules/@pondwader/socks5-server/dist/index.d.mts +87 -0
- package/node_modules/@pondwader/socks5-server/dist/index.d.ts +87 -0
- package/node_modules/@pondwader/socks5-server/dist/index.js +346 -0
- package/node_modules/@pondwader/socks5-server/dist/index.mjs +307 -0
- package/node_modules/@pondwader/socks5-server/package.json +31 -0
- package/node_modules/commander/LICENSE +22 -0
- package/node_modules/commander/Readme.md +1157 -0
- package/node_modules/commander/esm.mjs +16 -0
- package/node_modules/commander/index.js +24 -0
- package/node_modules/commander/lib/argument.js +149 -0
- package/node_modules/commander/lib/command.js +2509 -0
- package/node_modules/commander/lib/error.js +39 -0
- package/node_modules/commander/lib/help.js +520 -0
- package/node_modules/commander/lib/option.js +330 -0
- package/node_modules/commander/lib/suggestSimilar.js +101 -0
- package/node_modules/commander/package-support.json +16 -0
- package/node_modules/commander/package.json +84 -0
- package/node_modules/commander/typings/esm.d.mts +3 -0
- package/node_modules/commander/typings/index.d.ts +969 -0
- package/node_modules/node-forge/.editorconfig +17 -0
- package/node_modules/node-forge/.eslintrc.js +24 -0
- package/node_modules/node-forge/.github/workflows/main.yaml +96 -0
- package/node_modules/node-forge/.istanbul.yml +2 -0
- package/node_modules/node-forge/.npmignore +15 -0
- package/node_modules/node-forge/CHANGELOG.md +555 -0
- package/node_modules/node-forge/CONTRIBUTING.md +18 -0
- package/node_modules/node-forge/LICENSE +331 -0
- package/node_modules/node-forge/README.md +2071 -0
- package/node_modules/node-forge/RELEASE.md +19 -0
- package/node_modules/node-forge/SECURITY.md +5 -0
- package/node_modules/node-forge/examples/create-cert.js +110 -0
- package/node_modules/node-forge/examples/create-csr.js +66 -0
- package/node_modules/node-forge/examples/create-pkcs12.js +160 -0
- package/node_modules/node-forge/examples/imap.js +46 -0
- package/node_modules/node-forge/examples/sign-p7.js +115 -0
- package/node_modules/node-forge/examples/tls.js +189 -0
- package/node_modules/node-forge/flash/PooledSocket.as +18 -0
- package/node_modules/node-forge/flash/README.md +48 -0
- package/node_modules/node-forge/flash/SocketEvent.as +36 -0
- package/node_modules/node-forge/flash/SocketPool.as +754 -0
- package/node_modules/node-forge/flash/mod_fsp/README +135 -0
- package/node_modules/node-forge/flash/mod_fsp/mod_fsp.c +415 -0
- package/node_modules/node-forge/flash/package.json +28 -0
- package/node_modules/node-forge/flash/policyserver.js +65 -0
- package/node_modules/node-forge/flash/policyserver.py +112 -0
- package/node_modules/node-forge/flash/swf/SocketPool.swf +0 -0
- package/node_modules/node-forge/karma-sauce.conf.js +79 -0
- package/node_modules/node-forge/karma.conf.js +133 -0
- package/node_modules/node-forge/lib/aes.js +1091 -0
- package/node_modules/node-forge/lib/aesCipherSuites.js +282 -0
- package/node_modules/node-forge/lib/asn1-validator.js +91 -0
- package/node_modules/node-forge/lib/asn1.js +1503 -0
- package/node_modules/node-forge/lib/baseN.js +186 -0
- package/node_modules/node-forge/lib/cipher.js +230 -0
- package/node_modules/node-forge/lib/cipherModes.js +999 -0
- package/node_modules/node-forge/lib/des.js +496 -0
- package/node_modules/node-forge/lib/ed25519.js +1091 -0
- package/node_modules/node-forge/lib/forge.js +13 -0
- package/node_modules/node-forge/lib/form.js +149 -0
- package/node_modules/node-forge/lib/hmac.js +146 -0
- package/node_modules/node-forge/lib/http.js +1346 -0
- package/node_modules/node-forge/lib/index.all.js +16 -0
- package/node_modules/node-forge/lib/index.js +33 -0
- package/node_modules/node-forge/lib/jsbn.js +1294 -0
- package/node_modules/node-forge/lib/kem.js +168 -0
- package/node_modules/node-forge/lib/log.js +319 -0
- package/node_modules/node-forge/lib/md.all.js +13 -0
- package/node_modules/node-forge/lib/md.js +11 -0
- package/node_modules/node-forge/lib/md5.js +289 -0
- package/node_modules/node-forge/lib/mgf.js +12 -0
- package/node_modules/node-forge/lib/mgf1.js +57 -0
- package/node_modules/node-forge/lib/oids.js +180 -0
- package/node_modules/node-forge/lib/pbe.js +1023 -0
- package/node_modules/node-forge/lib/pbkdf2.js +211 -0
- package/node_modules/node-forge/lib/pem.js +237 -0
- package/node_modules/node-forge/lib/pkcs1.js +276 -0
- package/node_modules/node-forge/lib/pkcs12.js +1078 -0
- package/node_modules/node-forge/lib/pkcs7.js +1260 -0
- package/node_modules/node-forge/lib/pkcs7asn1.js +410 -0
- package/node_modules/node-forge/lib/pki.js +102 -0
- package/node_modules/node-forge/lib/prime.js +297 -0
- package/node_modules/node-forge/lib/prime.worker.js +168 -0
- package/node_modules/node-forge/lib/prng.js +419 -0
- package/node_modules/node-forge/lib/pss.js +241 -0
- package/node_modules/node-forge/lib/random.js +191 -0
- package/node_modules/node-forge/lib/rc2.js +410 -0
- package/node_modules/node-forge/lib/rsa.js +1973 -0
- package/node_modules/node-forge/lib/sha1.js +319 -0
- package/node_modules/node-forge/lib/sha256.js +327 -0
- package/node_modules/node-forge/lib/sha512.js +561 -0
- package/node_modules/node-forge/lib/socket.js +287 -0
- package/node_modules/node-forge/lib/ssh.js +236 -0
- package/node_modules/node-forge/lib/tls.js +4282 -0
- package/node_modules/node-forge/lib/tlssocket.js +249 -0
- package/node_modules/node-forge/lib/util.js +2652 -0
- package/node_modules/node-forge/lib/x509.js +3251 -0
- package/node_modules/node-forge/lib/xhr.js +738 -0
- package/node_modules/node-forge/package.json +123 -0
- package/node_modules/node-forge/tests/.eslintrc.js +5 -0
- package/node_modules/node-forge/tests/README.md +4 -0
- package/node_modules/node-forge/tests/benchmarks/aes-speed.js +62 -0
- package/node_modules/node-forge/tests/benchmarks/so-44303784.js +246 -0
- package/node_modules/node-forge/tests/flash/README.md +7 -0
- package/node_modules/node-forge/tests/flash/Test.as +96 -0
- package/node_modules/node-forge/tests/flash/build-flash.xml +7 -0
- package/node_modules/node-forge/tests/flash/index.html +28 -0
- package/node_modules/node-forge/tests/index.html +33 -0
- package/node_modules/node-forge/tests/issues/heartbleed.js +55 -0
- package/node_modules/node-forge/tests/issues/issue-428.html +95 -0
- package/node_modules/node-forge/tests/issues/issue-428.js +375 -0
- package/node_modules/node-forge/tests/karma/index.js +8 -0
- package/node_modules/node-forge/tests/karma/testWorker.js +65 -0
- package/node_modules/node-forge/tests/karma/web-worker-rsa.js +55 -0
- package/node_modules/node-forge/tests/legacy/common.html +65 -0
- package/node_modules/node-forge/tests/legacy/common.js +2199 -0
- package/node_modules/node-forge/tests/legacy/form.html +148 -0
- package/node_modules/node-forge/tests/legacy/form.js +40 -0
- package/node_modules/node-forge/tests/legacy/http.html +235 -0
- package/node_modules/node-forge/tests/legacy/index.html +70 -0
- package/node_modules/node-forge/tests/legacy/keygen.html +113 -0
- package/node_modules/node-forge/tests/legacy/login.css +26 -0
- package/node_modules/node-forge/tests/legacy/loginDemo.html +32 -0
- package/node_modules/node-forge/tests/legacy/loginDemo.js +149 -0
- package/node_modules/node-forge/tests/legacy/performance.html +533 -0
- package/node_modules/node-forge/tests/legacy/result.txt +1 -0
- package/node_modules/node-forge/tests/legacy/socketPool.html +302 -0
- package/node_modules/node-forge/tests/legacy/tasks.html +54 -0
- package/node_modules/node-forge/tests/legacy/tasks.js +378 -0
- package/node_modules/node-forge/tests/legacy/tls.html +389 -0
- package/node_modules/node-forge/tests/legacy/webid.html +89 -0
- package/node_modules/node-forge/tests/legacy/webid.js +313 -0
- package/node_modules/node-forge/tests/legacy/ws-webid.js +120 -0
- package/node_modules/node-forge/tests/legacy/xhr.html +67 -0
- package/node_modules/node-forge/tests/legacy/xhr.js +590 -0
- package/node_modules/node-forge/tests/pocs/ghsa-2328-f5f3-gj25.js +85 -0
- package/node_modules/node-forge/tests/pocs/ghsa-ppp5-5v6c-4jwp.js +166 -0
- package/node_modules/node-forge/tests/pocs/ghsa-q67f-28xg-22rw.js +103 -0
- package/node_modules/node-forge/tests/security/cve-2025-12816.js +75 -0
- package/node_modules/node-forge/tests/security/ghsa-554w-wpv2-vw27.js +81 -0
- package/node_modules/node-forge/tests/security/index.js +3 -0
- package/node_modules/node-forge/tests/server.crt +26 -0
- package/node_modules/node-forge/tests/server.js +87 -0
- package/node_modules/node-forge/tests/server.key +27 -0
- package/node_modules/node-forge/tests/support/task.js +718 -0
- package/node_modules/node-forge/tests/tests.css +61 -0
- package/node_modules/node-forge/tests/unit/aes.js +1498 -0
- package/node_modules/node-forge/tests/unit/asn1.js +1337 -0
- package/node_modules/node-forge/tests/unit/csr.js +129 -0
- package/node_modules/node-forge/tests/unit/des.js +231 -0
- package/node_modules/node-forge/tests/unit/ed25519.js +395 -0
- package/node_modules/node-forge/tests/unit/forge.js +2 -0
- package/node_modules/node-forge/tests/unit/hmac.js +64 -0
- package/node_modules/node-forge/tests/unit/index.html +20 -0
- package/node_modules/node-forge/tests/unit/index.js +27 -0
- package/node_modules/node-forge/tests/unit/jsbn.js +40 -0
- package/node_modules/node-forge/tests/unit/kem.js +167 -0
- package/node_modules/node-forge/tests/unit/md5.js +114 -0
- package/node_modules/node-forge/tests/unit/mgf1.js +16 -0
- package/node_modules/node-forge/tests/unit/pbkdf2.js +182 -0
- package/node_modules/node-forge/tests/unit/pem.js +159 -0
- package/node_modules/node-forge/tests/unit/pkcs1.js +1077 -0
- package/node_modules/node-forge/tests/unit/pkcs12.js +739 -0
- package/node_modules/node-forge/tests/unit/pkcs7.js +792 -0
- package/node_modules/node-forge/tests/unit/random.js +48 -0
- package/node_modules/node-forge/tests/unit/rc2.js +88 -0
- package/node_modules/node-forge/tests/unit/rsa.js +1278 -0
- package/node_modules/node-forge/tests/unit/sha1.js +72 -0
- package/node_modules/node-forge/tests/unit/sha256.js +79 -0
- package/node_modules/node-forge/tests/unit/sha512.js +200 -0
- package/node_modules/node-forge/tests/unit/ssh.js +175 -0
- package/node_modules/node-forge/tests/unit/tls.js +175 -0
- package/node_modules/node-forge/tests/unit/util.js +595 -0
- package/node_modules/node-forge/tests/unit/x509.js +1986 -0
- package/node_modules/node-forge/tests/websockets/server-webid.js +495 -0
- package/node_modules/node-forge/tests/websockets/server-ws.js +158 -0
- package/node_modules/node-forge/webpack-tests.config.js +26 -0
- package/node_modules/node-forge/webpack.config.js +130 -0
- package/node_modules/zod/LICENSE +21 -0
- package/node_modules/zod/README.md +208 -0
- package/node_modules/zod/index.cjs +33 -0
- package/node_modules/zod/index.d.cts +4 -0
- package/node_modules/zod/index.d.ts +4 -0
- package/node_modules/zod/index.js +4 -0
- package/node_modules/zod/package.json +118 -0
- package/node_modules/zod/src/index.ts +4 -0
- package/node_modules/zod/src/v3/ZodError.ts +330 -0
- package/node_modules/zod/src/v3/benchmarks/datetime.ts +58 -0
- package/node_modules/zod/src/v3/benchmarks/discriminatedUnion.ts +80 -0
- package/node_modules/zod/src/v3/benchmarks/index.ts +59 -0
- package/node_modules/zod/src/v3/benchmarks/ipv4.ts +57 -0
- package/node_modules/zod/src/v3/benchmarks/object.ts +69 -0
- package/node_modules/zod/src/v3/benchmarks/primitives.ts +162 -0
- package/node_modules/zod/src/v3/benchmarks/realworld.ts +63 -0
- package/node_modules/zod/src/v3/benchmarks/string.ts +55 -0
- package/node_modules/zod/src/v3/benchmarks/union.ts +80 -0
- package/node_modules/zod/src/v3/errors.ts +13 -0
- package/node_modules/zod/src/v3/external.ts +6 -0
- package/node_modules/zod/src/v3/helpers/enumUtil.ts +17 -0
- package/node_modules/zod/src/v3/helpers/errorUtil.ts +8 -0
- package/node_modules/zod/src/v3/helpers/parseUtil.ts +176 -0
- package/node_modules/zod/src/v3/helpers/partialUtil.ts +34 -0
- package/node_modules/zod/src/v3/helpers/typeAliases.ts +2 -0
- package/node_modules/zod/src/v3/helpers/util.ts +224 -0
- package/node_modules/zod/src/v3/index.ts +4 -0
- package/node_modules/zod/src/v3/locales/en.ts +124 -0
- package/node_modules/zod/src/v3/standard-schema.ts +113 -0
- package/node_modules/zod/src/v3/tests/Mocker.ts +54 -0
- package/node_modules/zod/src/v3/tests/all-errors.test.ts +157 -0
- package/node_modules/zod/src/v3/tests/anyunknown.test.ts +28 -0
- package/node_modules/zod/src/v3/tests/array.test.ts +71 -0
- package/node_modules/zod/src/v3/tests/async-parsing.test.ts +388 -0
- package/node_modules/zod/src/v3/tests/async-refinements.test.ts +46 -0
- package/node_modules/zod/src/v3/tests/base.test.ts +29 -0
- package/node_modules/zod/src/v3/tests/bigint.test.ts +55 -0
- package/node_modules/zod/src/v3/tests/branded.test.ts +53 -0
- package/node_modules/zod/src/v3/tests/catch.test.ts +220 -0
- package/node_modules/zod/src/v3/tests/coerce.test.ts +133 -0
- package/node_modules/zod/src/v3/tests/complex.test.ts +56 -0
- package/node_modules/zod/src/v3/tests/custom.test.ts +31 -0
- package/node_modules/zod/src/v3/tests/date.test.ts +32 -0
- package/node_modules/zod/src/v3/tests/deepmasking.test.ts +186 -0
- package/node_modules/zod/src/v3/tests/default.test.ts +112 -0
- package/node_modules/zod/src/v3/tests/description.test.ts +33 -0
- package/node_modules/zod/src/v3/tests/discriminated-unions.test.ts +315 -0
- package/node_modules/zod/src/v3/tests/enum.test.ts +80 -0
- package/node_modules/zod/src/v3/tests/error.test.ts +551 -0
- package/node_modules/zod/src/v3/tests/firstparty.test.ts +87 -0
- package/node_modules/zod/src/v3/tests/firstpartyschematypes.test.ts +21 -0
- package/node_modules/zod/src/v3/tests/function.test.ts +257 -0
- package/node_modules/zod/src/v3/tests/generics.test.ts +48 -0
- package/node_modules/zod/src/v3/tests/instanceof.test.ts +37 -0
- package/node_modules/zod/src/v3/tests/intersection.test.ts +110 -0
- package/node_modules/zod/src/v3/tests/language-server.source.ts +76 -0
- package/node_modules/zod/src/v3/tests/language-server.test.ts +207 -0
- package/node_modules/zod/src/v3/tests/literal.test.ts +36 -0
- package/node_modules/zod/src/v3/tests/map.test.ts +110 -0
- package/node_modules/zod/src/v3/tests/masking.test.ts +4 -0
- package/node_modules/zod/src/v3/tests/mocker.test.ts +19 -0
- package/node_modules/zod/src/v3/tests/nan.test.ts +21 -0
- package/node_modules/zod/src/v3/tests/nativeEnum.test.ts +87 -0
- package/node_modules/zod/src/v3/tests/nullable.test.ts +42 -0
- package/node_modules/zod/src/v3/tests/number.test.ts +176 -0
- package/node_modules/zod/src/v3/tests/object-augmentation.test.ts +29 -0
- package/node_modules/zod/src/v3/tests/object-in-es5-env.test.ts +29 -0
- package/node_modules/zod/src/v3/tests/object.test.ts +434 -0
- package/node_modules/zod/src/v3/tests/optional.test.ts +42 -0
- package/node_modules/zod/src/v3/tests/parseUtil.test.ts +23 -0
- package/node_modules/zod/src/v3/tests/parser.test.ts +41 -0
- package/node_modules/zod/src/v3/tests/partials.test.ts +243 -0
- package/node_modules/zod/src/v3/tests/pickomit.test.ts +111 -0
- package/node_modules/zod/src/v3/tests/pipeline.test.ts +29 -0
- package/node_modules/zod/src/v3/tests/preprocess.test.ts +186 -0
- package/node_modules/zod/src/v3/tests/primitive.test.ts +440 -0
- package/node_modules/zod/src/v3/tests/promise.test.ts +90 -0
- package/node_modules/zod/src/v3/tests/readonly.test.ts +194 -0
- package/node_modules/zod/src/v3/tests/record.test.ts +171 -0
- package/node_modules/zod/src/v3/tests/recursive.test.ts +197 -0
- package/node_modules/zod/src/v3/tests/refine.test.ts +313 -0
- package/node_modules/zod/src/v3/tests/safeparse.test.ts +27 -0
- package/node_modules/zod/src/v3/tests/set.test.ts +142 -0
- package/node_modules/zod/src/v3/tests/standard-schema.test.ts +83 -0
- package/node_modules/zod/src/v3/tests/string.test.ts +916 -0
- package/node_modules/zod/src/v3/tests/transformer.test.ts +233 -0
- package/node_modules/zod/src/v3/tests/tuple.test.ts +90 -0
- package/node_modules/zod/src/v3/tests/unions.test.ts +57 -0
- package/node_modules/zod/src/v3/tests/validations.test.ts +133 -0
- package/node_modules/zod/src/v3/tests/void.test.ts +15 -0
- package/node_modules/zod/src/v3/types.ts +5136 -0
- package/node_modules/zod/src/v4/classic/checks.ts +30 -0
- package/node_modules/zod/src/v4/classic/coerce.ts +27 -0
- package/node_modules/zod/src/v4/classic/compat.ts +66 -0
- package/node_modules/zod/src/v4/classic/errors.ts +75 -0
- package/node_modules/zod/src/v4/classic/external.ts +50 -0
- package/node_modules/zod/src/v4/classic/index.ts +5 -0
- package/node_modules/zod/src/v4/classic/iso.ts +90 -0
- package/node_modules/zod/src/v4/classic/parse.ts +33 -0
- package/node_modules/zod/src/v4/classic/schemas.ts +2054 -0
- package/node_modules/zod/src/v4/classic/tests/anyunknown.test.ts +26 -0
- package/node_modules/zod/src/v4/classic/tests/array.test.ts +264 -0
- package/node_modules/zod/src/v4/classic/tests/assignability.test.ts +210 -0
- package/node_modules/zod/src/v4/classic/tests/async-parsing.test.ts +381 -0
- package/node_modules/zod/src/v4/classic/tests/async-refinements.test.ts +68 -0
- package/node_modules/zod/src/v4/classic/tests/base.test.ts +7 -0
- package/node_modules/zod/src/v4/classic/tests/bigint.test.ts +54 -0
- package/node_modules/zod/src/v4/classic/tests/brand.test.ts +63 -0
- package/node_modules/zod/src/v4/classic/tests/catch.test.ts +252 -0
- package/node_modules/zod/src/v4/classic/tests/coalesce.test.ts +20 -0
- package/node_modules/zod/src/v4/classic/tests/coerce.test.ts +160 -0
- package/node_modules/zod/src/v4/classic/tests/continuability.test.ts +352 -0
- package/node_modules/zod/src/v4/classic/tests/custom.test.ts +40 -0
- package/node_modules/zod/src/v4/classic/tests/date.test.ts +31 -0
- package/node_modules/zod/src/v4/classic/tests/datetime.test.ts +296 -0
- package/node_modules/zod/src/v4/classic/tests/default.test.ts +313 -0
- package/node_modules/zod/src/v4/classic/tests/description.test.ts +32 -0
- package/node_modules/zod/src/v4/classic/tests/discriminated-unions.test.ts +619 -0
- package/node_modules/zod/src/v4/classic/tests/enum.test.ts +285 -0
- package/node_modules/zod/src/v4/classic/tests/error-utils.test.ts +527 -0
- package/node_modules/zod/src/v4/classic/tests/error.test.ts +711 -0
- package/node_modules/zod/src/v4/classic/tests/file.test.ts +91 -0
- package/node_modules/zod/src/v4/classic/tests/firstparty.test.ts +175 -0
- package/node_modules/zod/src/v4/classic/tests/function.test.ts +268 -0
- package/node_modules/zod/src/v4/classic/tests/generics.test.ts +72 -0
- package/node_modules/zod/src/v4/classic/tests/index.test.ts +829 -0
- package/node_modules/zod/src/v4/classic/tests/instanceof.test.ts +34 -0
- package/node_modules/zod/src/v4/classic/tests/intersection.test.ts +171 -0
- package/node_modules/zod/src/v4/classic/tests/json.test.ts +108 -0
- package/node_modules/zod/src/v4/classic/tests/lazy.test.ts +227 -0
- package/node_modules/zod/src/v4/classic/tests/literal.test.ts +92 -0
- package/node_modules/zod/src/v4/classic/tests/map.test.ts +196 -0
- package/node_modules/zod/src/v4/classic/tests/nan.test.ts +21 -0
- package/node_modules/zod/src/v4/classic/tests/nested-refine.test.ts +168 -0
- package/node_modules/zod/src/v4/classic/tests/nonoptional.test.ts +86 -0
- package/node_modules/zod/src/v4/classic/tests/nullable.test.ts +22 -0
- package/node_modules/zod/src/v4/classic/tests/number.test.ts +247 -0
- package/node_modules/zod/src/v4/classic/tests/object.test.ts +563 -0
- package/node_modules/zod/src/v4/classic/tests/optional.test.ts +123 -0
- package/node_modules/zod/src/v4/classic/tests/partial.test.ts +147 -0
- package/node_modules/zod/src/v4/classic/tests/pickomit.test.ts +127 -0
- package/node_modules/zod/src/v4/classic/tests/pipe.test.ts +81 -0
- package/node_modules/zod/src/v4/classic/tests/prefault.test.ts +37 -0
- package/node_modules/zod/src/v4/classic/tests/preprocess.test.ts +298 -0
- package/node_modules/zod/src/v4/classic/tests/primitive.test.ts +175 -0
- package/node_modules/zod/src/v4/classic/tests/promise.test.ts +81 -0
- package/node_modules/zod/src/v4/classic/tests/prototypes.test.ts +23 -0
- package/node_modules/zod/src/v4/classic/tests/readonly.test.ts +252 -0
- package/node_modules/zod/src/v4/classic/tests/record.test.ts +342 -0
- package/node_modules/zod/src/v4/classic/tests/recursive-types.test.ts +356 -0
- package/node_modules/zod/src/v4/classic/tests/refine.test.ts +532 -0
- package/node_modules/zod/src/v4/classic/tests/registries.test.ts +204 -0
- package/node_modules/zod/src/v4/classic/tests/set.test.ts +179 -0
- package/node_modules/zod/src/v4/classic/tests/standard-schema.test.ts +57 -0
- package/node_modules/zod/src/v4/classic/tests/string-formats.test.ts +109 -0
- package/node_modules/zod/src/v4/classic/tests/string.test.ts +881 -0
- package/node_modules/zod/src/v4/classic/tests/stringbool.test.ts +66 -0
- package/node_modules/zod/src/v4/classic/tests/template-literal.test.ts +758 -0
- package/node_modules/zod/src/v4/classic/tests/to-json-schema.test.ts +2314 -0
- package/node_modules/zod/src/v4/classic/tests/transform.test.ts +250 -0
- package/node_modules/zod/src/v4/classic/tests/tuple.test.ts +163 -0
- package/node_modules/zod/src/v4/classic/tests/union.test.ts +94 -0
- package/node_modules/zod/src/v4/classic/tests/validations.test.ts +283 -0
- package/node_modules/zod/src/v4/classic/tests/void.test.ts +12 -0
- package/node_modules/zod/src/v4/core/api.ts +1594 -0
- package/node_modules/zod/src/v4/core/checks.ts +1283 -0
- package/node_modules/zod/src/v4/core/config.ts +15 -0
- package/node_modules/zod/src/v4/core/core.ts +134 -0
- package/node_modules/zod/src/v4/core/doc.ts +44 -0
- package/node_modules/zod/src/v4/core/errors.ts +424 -0
- package/node_modules/zod/src/v4/core/function.ts +176 -0
- package/node_modules/zod/src/v4/core/index.ts +15 -0
- package/node_modules/zod/src/v4/core/json-schema.ts +143 -0
- package/node_modules/zod/src/v4/core/parse.ts +94 -0
- package/node_modules/zod/src/v4/core/regexes.ts +135 -0
- package/node_modules/zod/src/v4/core/registries.ts +96 -0
- package/node_modules/zod/src/v4/core/schemas.ts +3842 -0
- package/node_modules/zod/src/v4/core/standard-schema.ts +64 -0
- package/node_modules/zod/src/v4/core/tests/index.test.ts +46 -0
- package/node_modules/zod/src/v4/core/tests/locales/be.test.ts +124 -0
- package/node_modules/zod/src/v4/core/tests/locales/en.test.ts +22 -0
- package/node_modules/zod/src/v4/core/tests/locales/ru.test.ts +128 -0
- package/node_modules/zod/src/v4/core/tests/locales/tr.test.ts +69 -0
- package/node_modules/zod/src/v4/core/to-json-schema.ts +977 -0
- package/node_modules/zod/src/v4/core/util.ts +775 -0
- package/node_modules/zod/src/v4/core/versions.ts +5 -0
- package/node_modules/zod/src/v4/core/zsf.ts +323 -0
- package/node_modules/zod/src/v4/index.ts +4 -0
- package/node_modules/zod/src/v4/locales/ar.ts +125 -0
- package/node_modules/zod/src/v4/locales/az.ts +121 -0
- package/node_modules/zod/src/v4/locales/be.ts +184 -0
- package/node_modules/zod/src/v4/locales/ca.ts +127 -0
- package/node_modules/zod/src/v4/locales/cs.ts +142 -0
- package/node_modules/zod/src/v4/locales/de.ts +124 -0
- package/node_modules/zod/src/v4/locales/en.ts +127 -0
- package/node_modules/zod/src/v4/locales/eo.ts +125 -0
- package/node_modules/zod/src/v4/locales/es.ts +125 -0
- package/node_modules/zod/src/v4/locales/fa.ts +134 -0
- package/node_modules/zod/src/v4/locales/fi.ts +131 -0
- package/node_modules/zod/src/v4/locales/fr-CA.ts +126 -0
- package/node_modules/zod/src/v4/locales/fr.ts +124 -0
- package/node_modules/zod/src/v4/locales/he.ts +125 -0
- package/node_modules/zod/src/v4/locales/hu.ts +126 -0
- package/node_modules/zod/src/v4/locales/id.ts +125 -0
- package/node_modules/zod/src/v4/locales/index.ts +39 -0
- package/node_modules/zod/src/v4/locales/it.ts +125 -0
- package/node_modules/zod/src/v4/locales/ja.ts +122 -0
- package/node_modules/zod/src/v4/locales/kh.ts +126 -0
- package/node_modules/zod/src/v4/locales/ko.ts +131 -0
- package/node_modules/zod/src/v4/locales/mk.ts +127 -0
- package/node_modules/zod/src/v4/locales/ms.ts +124 -0
- package/node_modules/zod/src/v4/locales/nl.ts +126 -0
- package/node_modules/zod/src/v4/locales/no.ts +124 -0
- package/node_modules/zod/src/v4/locales/ota.ts +125 -0
- package/node_modules/zod/src/v4/locales/pl.ts +126 -0
- package/node_modules/zod/src/v4/locales/ps.ts +133 -0
- package/node_modules/zod/src/v4/locales/pt.ts +123 -0
- package/node_modules/zod/src/v4/locales/ru.ts +184 -0
- package/node_modules/zod/src/v4/locales/sl.ts +126 -0
- package/node_modules/zod/src/v4/locales/sv.ts +127 -0
- package/node_modules/zod/src/v4/locales/ta.ts +125 -0
- package/node_modules/zod/src/v4/locales/th.ts +126 -0
- package/node_modules/zod/src/v4/locales/tr.ts +121 -0
- package/node_modules/zod/src/v4/locales/ua.ts +126 -0
- package/node_modules/zod/src/v4/locales/ur.ts +126 -0
- package/node_modules/zod/src/v4/locales/vi.ts +125 -0
- package/node_modules/zod/src/v4/locales/zh-CN.ts +123 -0
- package/node_modules/zod/src/v4/locales/zh-TW.ts +125 -0
- package/node_modules/zod/src/v4/mini/checks.ts +32 -0
- package/node_modules/zod/src/v4/mini/coerce.ts +22 -0
- package/node_modules/zod/src/v4/mini/external.ts +40 -0
- package/node_modules/zod/src/v4/mini/index.ts +3 -0
- package/node_modules/zod/src/v4/mini/iso.ts +62 -0
- package/node_modules/zod/src/v4/mini/parse.ts +1 -0
- package/node_modules/zod/src/v4/mini/schemas.ts +1579 -0
- package/node_modules/zod/src/v4/mini/tests/assignability.test.ts +129 -0
- package/node_modules/zod/src/v4/mini/tests/brand.test.ts +51 -0
- package/node_modules/zod/src/v4/mini/tests/checks.test.ts +144 -0
- package/node_modules/zod/src/v4/mini/tests/computed.test.ts +36 -0
- package/node_modules/zod/src/v4/mini/tests/error.test.ts +22 -0
- package/node_modules/zod/src/v4/mini/tests/functions.test.ts +43 -0
- package/node_modules/zod/src/v4/mini/tests/index.test.ts +871 -0
- package/node_modules/zod/src/v4/mini/tests/number.test.ts +95 -0
- package/node_modules/zod/src/v4/mini/tests/object.test.ts +185 -0
- package/node_modules/zod/src/v4/mini/tests/prototypes.test.ts +43 -0
- package/node_modules/zod/src/v4/mini/tests/recursive-types.test.ts +275 -0
- package/node_modules/zod/src/v4/mini/tests/string.test.ts +299 -0
- package/node_modules/zod/src/v4-mini/index.ts +1 -0
- package/node_modules/zod/v3/ZodError.cjs +138 -0
- package/node_modules/zod/v3/ZodError.d.cts +164 -0
- package/node_modules/zod/v3/ZodError.d.ts +164 -0
- package/node_modules/zod/v3/ZodError.js +133 -0
- package/node_modules/zod/v3/errors.cjs +17 -0
- package/node_modules/zod/v3/errors.d.cts +5 -0
- package/node_modules/zod/v3/errors.d.ts +5 -0
- package/node_modules/zod/v3/errors.js +9 -0
- package/node_modules/zod/v3/external.cjs +22 -0
- package/node_modules/zod/v3/external.d.cts +6 -0
- package/node_modules/zod/v3/external.d.ts +6 -0
- package/node_modules/zod/v3/external.js +6 -0
- package/node_modules/zod/v3/helpers/enumUtil.cjs +2 -0
- package/node_modules/zod/v3/helpers/enumUtil.d.cts +8 -0
- package/node_modules/zod/v3/helpers/enumUtil.d.ts +8 -0
- package/node_modules/zod/v3/helpers/enumUtil.js +1 -0
- package/node_modules/zod/v3/helpers/errorUtil.cjs +9 -0
- package/node_modules/zod/v3/helpers/errorUtil.d.cts +9 -0
- package/node_modules/zod/v3/helpers/errorUtil.d.ts +9 -0
- package/node_modules/zod/v3/helpers/errorUtil.js +6 -0
- package/node_modules/zod/v3/helpers/parseUtil.cjs +124 -0
- package/node_modules/zod/v3/helpers/parseUtil.d.cts +78 -0
- package/node_modules/zod/v3/helpers/parseUtil.d.ts +78 -0
- package/node_modules/zod/v3/helpers/parseUtil.js +109 -0
- package/node_modules/zod/v3/helpers/partialUtil.cjs +2 -0
- package/node_modules/zod/v3/helpers/partialUtil.d.cts +8 -0
- package/node_modules/zod/v3/helpers/partialUtil.d.ts +8 -0
- package/node_modules/zod/v3/helpers/partialUtil.js +1 -0
- package/node_modules/zod/v3/helpers/typeAliases.cjs +2 -0
- package/node_modules/zod/v3/helpers/typeAliases.d.cts +2 -0
- package/node_modules/zod/v3/helpers/typeAliases.d.ts +2 -0
- package/node_modules/zod/v3/helpers/typeAliases.js +1 -0
- package/node_modules/zod/v3/helpers/util.cjs +137 -0
- package/node_modules/zod/v3/helpers/util.d.cts +85 -0
- package/node_modules/zod/v3/helpers/util.d.ts +85 -0
- package/node_modules/zod/v3/helpers/util.js +133 -0
- package/node_modules/zod/v3/index.cjs +33 -0
- package/node_modules/zod/v3/index.d.cts +4 -0
- package/node_modules/zod/v3/index.d.ts +4 -0
- package/node_modules/zod/v3/index.js +4 -0
- package/node_modules/zod/v3/locales/en.cjs +111 -0
- package/node_modules/zod/v3/locales/en.d.cts +3 -0
- package/node_modules/zod/v3/locales/en.d.ts +3 -0
- package/node_modules/zod/v3/locales/en.js +109 -0
- package/node_modules/zod/v3/standard-schema.cjs +2 -0
- package/node_modules/zod/v3/standard-schema.d.cts +102 -0
- package/node_modules/zod/v3/standard-schema.d.ts +102 -0
- package/node_modules/zod/v3/standard-schema.js +1 -0
- package/node_modules/zod/v3/types.cjs +3775 -0
- package/node_modules/zod/v3/types.d.cts +1031 -0
- package/node_modules/zod/v3/types.d.ts +1031 -0
- package/node_modules/zod/v3/types.js +3693 -0
- package/node_modules/zod/v4/classic/checks.cjs +32 -0
- package/node_modules/zod/v4/classic/checks.d.cts +1 -0
- package/node_modules/zod/v4/classic/checks.d.ts +1 -0
- package/node_modules/zod/v4/classic/checks.js +1 -0
- package/node_modules/zod/v4/classic/coerce.cjs +47 -0
- package/node_modules/zod/v4/classic/coerce.d.cts +17 -0
- package/node_modules/zod/v4/classic/coerce.d.ts +17 -0
- package/node_modules/zod/v4/classic/coerce.js +17 -0
- package/node_modules/zod/v4/classic/compat.cjs +57 -0
- package/node_modules/zod/v4/classic/compat.d.cts +46 -0
- package/node_modules/zod/v4/classic/compat.d.ts +46 -0
- package/node_modules/zod/v4/classic/compat.js +27 -0
- package/node_modules/zod/v4/classic/errors.cjs +67 -0
- package/node_modules/zod/v4/classic/errors.d.cts +30 -0
- package/node_modules/zod/v4/classic/errors.d.ts +30 -0
- package/node_modules/zod/v4/classic/errors.js +41 -0
- package/node_modules/zod/v4/classic/external.cjs +70 -0
- package/node_modules/zod/v4/classic/external.d.cts +13 -0
- package/node_modules/zod/v4/classic/external.d.ts +13 -0
- package/node_modules/zod/v4/classic/external.js +18 -0
- package/node_modules/zod/v4/classic/index.cjs +33 -0
- package/node_modules/zod/v4/classic/index.d.cts +4 -0
- package/node_modules/zod/v4/classic/index.d.ts +4 -0
- package/node_modules/zod/v4/classic/index.js +4 -0
- package/node_modules/zod/v4/classic/iso.cjs +60 -0
- package/node_modules/zod/v4/classic/iso.d.cts +22 -0
- package/node_modules/zod/v4/classic/iso.d.ts +22 -0
- package/node_modules/zod/v4/classic/iso.js +30 -0
- package/node_modules/zod/v4/classic/parse.cjs +32 -0
- package/node_modules/zod/v4/classic/parse.d.cts +23 -0
- package/node_modules/zod/v4/classic/parse.d.ts +23 -0
- package/node_modules/zod/v4/classic/parse.js +6 -0
- package/node_modules/zod/v4/classic/schemas.cjs +1109 -0
- package/node_modules/zod/v4/classic/schemas.d.cts +630 -0
- package/node_modules/zod/v4/classic/schemas.d.ts +630 -0
- package/node_modules/zod/v4/classic/schemas.js +1006 -0
- package/node_modules/zod/v4/core/api.cjs +1039 -0
- package/node_modules/zod/v4/core/api.d.cts +284 -0
- package/node_modules/zod/v4/core/api.d.ts +284 -0
- package/node_modules/zod/v4/core/api.js +906 -0
- package/node_modules/zod/v4/core/checks.cjs +591 -0
- package/node_modules/zod/v4/core/checks.d.cts +278 -0
- package/node_modules/zod/v4/core/checks.d.ts +278 -0
- package/node_modules/zod/v4/core/checks.js +565 -0
- package/node_modules/zod/v4/core/core.cjs +67 -0
- package/node_modules/zod/v4/core/core.d.cts +49 -0
- package/node_modules/zod/v4/core/core.d.ts +49 -0
- package/node_modules/zod/v4/core/core.js +61 -0
- package/node_modules/zod/v4/core/doc.cjs +39 -0
- package/node_modules/zod/v4/core/doc.d.cts +14 -0
- package/node_modules/zod/v4/core/doc.d.ts +14 -0
- package/node_modules/zod/v4/core/doc.js +35 -0
- package/node_modules/zod/v4/core/errors.cjs +226 -0
- package/node_modules/zod/v4/core/errors.d.cts +208 -0
- package/node_modules/zod/v4/core/errors.d.ts +208 -0
- package/node_modules/zod/v4/core/errors.js +195 -0
- package/node_modules/zod/v4/core/function.cjs +102 -0
- package/node_modules/zod/v4/core/function.d.cts +52 -0
- package/node_modules/zod/v4/core/function.d.ts +52 -0
- package/node_modules/zod/v4/core/function.js +75 -0
- package/node_modules/zod/v4/core/index.cjs +44 -0
- package/node_modules/zod/v4/core/index.d.cts +15 -0
- package/node_modules/zod/v4/core/index.d.ts +15 -0
- package/node_modules/zod/v4/core/index.js +15 -0
- package/node_modules/zod/v4/core/json-schema.cjs +2 -0
- package/node_modules/zod/v4/core/json-schema.d.cts +87 -0
- package/node_modules/zod/v4/core/json-schema.d.ts +87 -0
- package/node_modules/zod/v4/core/json-schema.js +1 -0
- package/node_modules/zod/v4/core/parse.cjs +87 -0
- package/node_modules/zod/v4/core/parse.d.cts +25 -0
- package/node_modules/zod/v4/core/parse.d.ts +25 -0
- package/node_modules/zod/v4/core/parse.js +57 -0
- package/node_modules/zod/v4/core/regexes.cjs +103 -0
- package/node_modules/zod/v4/core/regexes.d.cts +62 -0
- package/node_modules/zod/v4/core/regexes.d.ts +62 -0
- package/node_modules/zod/v4/core/regexes.js +95 -0
- package/node_modules/zod/v4/core/registries.cjs +56 -0
- package/node_modules/zod/v4/core/registries.d.cts +35 -0
- package/node_modules/zod/v4/core/registries.d.ts +35 -0
- package/node_modules/zod/v4/core/registries.js +51 -0
- package/node_modules/zod/v4/core/schemas.cjs +1748 -0
- package/node_modules/zod/v4/core/schemas.d.cts +1041 -0
- package/node_modules/zod/v4/core/schemas.d.ts +1041 -0
- package/node_modules/zod/v4/core/schemas.js +1717 -0
- package/node_modules/zod/v4/core/standard-schema.cjs +2 -0
- package/node_modules/zod/v4/core/standard-schema.d.cts +55 -0
- package/node_modules/zod/v4/core/standard-schema.d.ts +55 -0
- package/node_modules/zod/v4/core/standard-schema.js +1 -0
- package/node_modules/zod/v4/core/to-json-schema.cjs +854 -0
- package/node_modules/zod/v4/core/to-json-schema.d.cts +88 -0
- package/node_modules/zod/v4/core/to-json-schema.d.ts +88 -0
- package/node_modules/zod/v4/core/to-json-schema.js +849 -0
- package/node_modules/zod/v4/core/util.cjs +539 -0
- package/node_modules/zod/v4/core/util.d.cts +183 -0
- package/node_modules/zod/v4/core/util.d.ts +183 -0
- package/node_modules/zod/v4/core/util.js +493 -0
- package/node_modules/zod/v4/core/versions.cjs +8 -0
- package/node_modules/zod/v4/core/versions.d.cts +5 -0
- package/node_modules/zod/v4/core/versions.d.ts +5 -0
- package/node_modules/zod/v4/core/versions.js +5 -0
- package/node_modules/zod/v4/index.cjs +22 -0
- package/node_modules/zod/v4/index.d.cts +3 -0
- package/node_modules/zod/v4/index.d.ts +3 -0
- package/node_modules/zod/v4/index.js +3 -0
- package/node_modules/zod/v4/locales/ar.cjs +142 -0
- package/node_modules/zod/v4/locales/ar.d.cts +4 -0
- package/node_modules/zod/v4/locales/ar.d.ts +4 -0
- package/node_modules/zod/v4/locales/ar.js +116 -0
- package/node_modules/zod/v4/locales/az.cjs +141 -0
- package/node_modules/zod/v4/locales/az.d.cts +4 -0
- package/node_modules/zod/v4/locales/az.d.ts +4 -0
- package/node_modules/zod/v4/locales/az.js +115 -0
- package/node_modules/zod/v4/locales/be.cjs +190 -0
- package/node_modules/zod/v4/locales/be.d.cts +4 -0
- package/node_modules/zod/v4/locales/be.d.ts +4 -0
- package/node_modules/zod/v4/locales/be.js +164 -0
- package/node_modules/zod/v4/locales/ca.cjs +144 -0
- package/node_modules/zod/v4/locales/ca.d.cts +4 -0
- package/node_modules/zod/v4/locales/ca.d.ts +4 -0
- package/node_modules/zod/v4/locales/ca.js +118 -0
- package/node_modules/zod/v4/locales/cs.cjs +161 -0
- package/node_modules/zod/v4/locales/cs.d.cts +4 -0
- package/node_modules/zod/v4/locales/cs.d.ts +4 -0
- package/node_modules/zod/v4/locales/cs.js +135 -0
- package/node_modules/zod/v4/locales/de.cjs +142 -0
- package/node_modules/zod/v4/locales/de.d.cts +4 -0
- package/node_modules/zod/v4/locales/de.d.ts +4 -0
- package/node_modules/zod/v4/locales/de.js +116 -0
- package/node_modules/zod/v4/locales/en.cjs +145 -0
- package/node_modules/zod/v4/locales/en.d.cts +5 -0
- package/node_modules/zod/v4/locales/en.d.ts +5 -0
- package/node_modules/zod/v4/locales/en.js +117 -0
- package/node_modules/zod/v4/locales/eo.cjs +144 -0
- package/node_modules/zod/v4/locales/eo.d.cts +5 -0
- package/node_modules/zod/v4/locales/eo.d.ts +5 -0
- package/node_modules/zod/v4/locales/eo.js +116 -0
- package/node_modules/zod/v4/locales/es.cjs +143 -0
- package/node_modules/zod/v4/locales/es.d.cts +4 -0
- package/node_modules/zod/v4/locales/es.d.ts +4 -0
- package/node_modules/zod/v4/locales/es.js +117 -0
- package/node_modules/zod/v4/locales/fa.cjs +148 -0
- package/node_modules/zod/v4/locales/fa.d.cts +4 -0
- package/node_modules/zod/v4/locales/fa.d.ts +4 -0
- package/node_modules/zod/v4/locales/fa.js +122 -0
- package/node_modules/zod/v4/locales/fi.cjs +148 -0
- package/node_modules/zod/v4/locales/fi.d.cts +4 -0
- package/node_modules/zod/v4/locales/fi.d.ts +4 -0
- package/node_modules/zod/v4/locales/fi.js +122 -0
- package/node_modules/zod/v4/locales/fr-CA.cjs +143 -0
- package/node_modules/zod/v4/locales/fr-CA.d.cts +4 -0
- package/node_modules/zod/v4/locales/fr-CA.d.ts +4 -0
- package/node_modules/zod/v4/locales/fr-CA.js +117 -0
- package/node_modules/zod/v4/locales/fr.cjs +142 -0
- package/node_modules/zod/v4/locales/fr.d.cts +4 -0
- package/node_modules/zod/v4/locales/fr.d.ts +4 -0
- package/node_modules/zod/v4/locales/fr.js +116 -0
- package/node_modules/zod/v4/locales/he.cjs +143 -0
- package/node_modules/zod/v4/locales/he.d.cts +4 -0
- package/node_modules/zod/v4/locales/he.d.ts +4 -0
- package/node_modules/zod/v4/locales/he.js +117 -0
- package/node_modules/zod/v4/locales/hu.cjs +143 -0
- package/node_modules/zod/v4/locales/hu.d.cts +4 -0
- package/node_modules/zod/v4/locales/hu.d.ts +4 -0
- package/node_modules/zod/v4/locales/hu.js +117 -0
- package/node_modules/zod/v4/locales/id.cjs +142 -0
- package/node_modules/zod/v4/locales/id.d.cts +4 -0
- package/node_modules/zod/v4/locales/id.d.ts +4 -0
- package/node_modules/zod/v4/locales/id.js +116 -0
- package/node_modules/zod/v4/locales/index.cjs +84 -0
- package/node_modules/zod/v4/locales/index.d.cts +39 -0
- package/node_modules/zod/v4/locales/index.d.ts +39 -0
- package/node_modules/zod/v4/locales/index.js +39 -0
- package/node_modules/zod/v4/locales/it.cjs +143 -0
- package/node_modules/zod/v4/locales/it.d.cts +4 -0
- package/node_modules/zod/v4/locales/it.d.ts +4 -0
- package/node_modules/zod/v4/locales/it.js +117 -0
- package/node_modules/zod/v4/locales/ja.cjs +141 -0
- package/node_modules/zod/v4/locales/ja.d.cts +4 -0
- package/node_modules/zod/v4/locales/ja.d.ts +4 -0
- package/node_modules/zod/v4/locales/ja.js +115 -0
- package/node_modules/zod/v4/locales/kh.cjs +143 -0
- package/node_modules/zod/v4/locales/kh.d.cts +4 -0
- package/node_modules/zod/v4/locales/kh.d.ts +4 -0
- package/node_modules/zod/v4/locales/kh.js +117 -0
- package/node_modules/zod/v4/locales/ko.cjs +147 -0
- package/node_modules/zod/v4/locales/ko.d.cts +4 -0
- package/node_modules/zod/v4/locales/ko.d.ts +4 -0
- package/node_modules/zod/v4/locales/ko.js +121 -0
- package/node_modules/zod/v4/locales/mk.cjs +144 -0
- package/node_modules/zod/v4/locales/mk.d.cts +4 -0
- package/node_modules/zod/v4/locales/mk.d.ts +4 -0
- package/node_modules/zod/v4/locales/mk.js +118 -0
- package/node_modules/zod/v4/locales/ms.cjs +142 -0
- package/node_modules/zod/v4/locales/ms.d.cts +4 -0
- package/node_modules/zod/v4/locales/ms.d.ts +4 -0
- package/node_modules/zod/v4/locales/ms.js +116 -0
- package/node_modules/zod/v4/locales/nl.cjs +143 -0
- package/node_modules/zod/v4/locales/nl.d.cts +4 -0
- package/node_modules/zod/v4/locales/nl.d.ts +4 -0
- package/node_modules/zod/v4/locales/nl.js +117 -0
- package/node_modules/zod/v4/locales/no.cjs +142 -0
- package/node_modules/zod/v4/locales/no.d.cts +4 -0
- package/node_modules/zod/v4/locales/no.d.ts +4 -0
- package/node_modules/zod/v4/locales/no.js +116 -0
- package/node_modules/zod/v4/locales/ota.cjs +143 -0
- package/node_modules/zod/v4/locales/ota.d.cts +4 -0
- package/node_modules/zod/v4/locales/ota.d.ts +4 -0
- package/node_modules/zod/v4/locales/ota.js +117 -0
- package/node_modules/zod/v4/locales/pl.cjs +143 -0
- package/node_modules/zod/v4/locales/pl.d.cts +4 -0
- package/node_modules/zod/v4/locales/pl.d.ts +4 -0
- package/node_modules/zod/v4/locales/pl.js +117 -0
- package/node_modules/zod/v4/locales/ps.cjs +148 -0
- package/node_modules/zod/v4/locales/ps.d.cts +4 -0
- package/node_modules/zod/v4/locales/ps.d.ts +4 -0
- package/node_modules/zod/v4/locales/ps.js +122 -0
- package/node_modules/zod/v4/locales/pt.cjs +142 -0
- package/node_modules/zod/v4/locales/pt.d.cts +4 -0
- package/node_modules/zod/v4/locales/pt.d.ts +4 -0
- package/node_modules/zod/v4/locales/pt.js +116 -0
- package/node_modules/zod/v4/locales/ru.cjs +190 -0
- package/node_modules/zod/v4/locales/ru.d.cts +4 -0
- package/node_modules/zod/v4/locales/ru.d.ts +4 -0
- package/node_modules/zod/v4/locales/ru.js +164 -0
- package/node_modules/zod/v4/locales/sl.cjs +143 -0
- package/node_modules/zod/v4/locales/sl.d.cts +4 -0
- package/node_modules/zod/v4/locales/sl.d.ts +4 -0
- package/node_modules/zod/v4/locales/sl.js +117 -0
- package/node_modules/zod/v4/locales/sv.cjs +144 -0
- package/node_modules/zod/v4/locales/sv.d.cts +4 -0
- package/node_modules/zod/v4/locales/sv.d.ts +4 -0
- package/node_modules/zod/v4/locales/sv.js +118 -0
- package/node_modules/zod/v4/locales/ta.cjs +143 -0
- package/node_modules/zod/v4/locales/ta.d.cts +4 -0
- package/node_modules/zod/v4/locales/ta.d.ts +4 -0
- package/node_modules/zod/v4/locales/ta.js +117 -0
- package/node_modules/zod/v4/locales/th.cjs +143 -0
- package/node_modules/zod/v4/locales/th.d.cts +4 -0
- package/node_modules/zod/v4/locales/th.d.ts +4 -0
- package/node_modules/zod/v4/locales/th.js +117 -0
- package/node_modules/zod/v4/locales/tr.cjs +143 -0
- package/node_modules/zod/v4/locales/tr.d.cts +5 -0
- package/node_modules/zod/v4/locales/tr.d.ts +5 -0
- package/node_modules/zod/v4/locales/tr.js +115 -0
- package/node_modules/zod/v4/locales/ua.cjs +143 -0
- package/node_modules/zod/v4/locales/ua.d.cts +4 -0
- package/node_modules/zod/v4/locales/ua.d.ts +4 -0
- package/node_modules/zod/v4/locales/ua.js +117 -0
- package/node_modules/zod/v4/locales/ur.cjs +143 -0
- package/node_modules/zod/v4/locales/ur.d.cts +4 -0
- package/node_modules/zod/v4/locales/ur.d.ts +4 -0
- package/node_modules/zod/v4/locales/ur.js +117 -0
- package/node_modules/zod/v4/locales/vi.cjs +142 -0
- package/node_modules/zod/v4/locales/vi.d.cts +4 -0
- package/node_modules/zod/v4/locales/vi.d.ts +4 -0
- package/node_modules/zod/v4/locales/vi.js +116 -0
- package/node_modules/zod/v4/locales/zh-CN.cjs +142 -0
- package/node_modules/zod/v4/locales/zh-CN.d.cts +4 -0
- package/node_modules/zod/v4/locales/zh-CN.d.ts +4 -0
- package/node_modules/zod/v4/locales/zh-CN.js +116 -0
- package/node_modules/zod/v4/locales/zh-TW.cjs +143 -0
- package/node_modules/zod/v4/locales/zh-TW.d.cts +4 -0
- package/node_modules/zod/v4/locales/zh-TW.d.ts +4 -0
- package/node_modules/zod/v4/locales/zh-TW.js +117 -0
- package/node_modules/zod/v4/mini/checks.cjs +34 -0
- package/node_modules/zod/v4/mini/checks.d.cts +1 -0
- package/node_modules/zod/v4/mini/checks.d.ts +1 -0
- package/node_modules/zod/v4/mini/checks.js +1 -0
- package/node_modules/zod/v4/mini/coerce.cjs +47 -0
- package/node_modules/zod/v4/mini/coerce.d.cts +7 -0
- package/node_modules/zod/v4/mini/coerce.d.ts +7 -0
- package/node_modules/zod/v4/mini/coerce.js +17 -0
- package/node_modules/zod/v4/mini/external.cjs +62 -0
- package/node_modules/zod/v4/mini/external.d.cts +11 -0
- package/node_modules/zod/v4/mini/external.d.ts +11 -0
- package/node_modules/zod/v4/mini/external.js +13 -0
- package/node_modules/zod/v4/mini/index.cjs +32 -0
- package/node_modules/zod/v4/mini/index.d.cts +3 -0
- package/node_modules/zod/v4/mini/index.d.ts +3 -0
- package/node_modules/zod/v4/mini/index.js +3 -0
- package/node_modules/zod/v4/mini/iso.cjs +60 -0
- package/node_modules/zod/v4/mini/iso.d.cts +22 -0
- package/node_modules/zod/v4/mini/iso.d.ts +22 -0
- package/node_modules/zod/v4/mini/iso.js +30 -0
- package/node_modules/zod/v4/mini/parse.cjs +8 -0
- package/node_modules/zod/v4/mini/parse.d.cts +1 -0
- package/node_modules/zod/v4/mini/parse.d.ts +1 -0
- package/node_modules/zod/v4/mini/parse.js +1 -0
- package/node_modules/zod/v4/mini/schemas.cjs +839 -0
- package/node_modules/zod/v4/mini/schemas.d.cts +356 -0
- package/node_modules/zod/v4/mini/schemas.d.ts +356 -0
- package/node_modules/zod/v4/mini/schemas.js +732 -0
- package/node_modules/zod/v4-mini/index.cjs +17 -0
- package/node_modules/zod/v4-mini/index.d.cts +1 -0
- package/node_modules/zod/v4-mini/index.d.ts +1 -0
- package/node_modules/zod/v4-mini/index.js +1 -0
- 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
|