@blamejs/blamejs-shop 0.0.44
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/CHANGELOG.md +87 -0
- package/LICENSE +17 -0
- package/README.md +117 -0
- package/SECURITY.md +139 -0
- package/lib/admin.js +952 -0
- package/lib/analytics.js +267 -0
- package/lib/cart.js +279 -0
- package/lib/catalog-import.js +344 -0
- package/lib/catalog.js +769 -0
- package/lib/checkout.js +320 -0
- package/lib/config.js +151 -0
- package/lib/customers.js +322 -0
- package/lib/email.js +242 -0
- package/lib/externaldb-d1.js +283 -0
- package/lib/index.js +57 -0
- package/lib/inventory-alerts.js +198 -0
- package/lib/newsletter.js +142 -0
- package/lib/order.js +380 -0
- package/lib/payment.js +318 -0
- package/lib/pricing.js +185 -0
- package/lib/r2-bridge.js +169 -0
- package/lib/shipping.js +185 -0
- package/lib/storefront.js +2160 -0
- package/lib/subscriptions.js +410 -0
- package/lib/tax.js +161 -0
- package/lib/theme.js +194 -0
- package/lib/vendor/MANIFEST.json +19 -0
- package/lib/vendor/blamejs/.clusterfuzzlite/Dockerfile +23 -0
- package/lib/vendor/blamejs/.clusterfuzzlite/build.sh +34 -0
- package/lib/vendor/blamejs/.clusterfuzzlite/project.yaml +16 -0
- package/lib/vendor/blamejs/.dockerignore +45 -0
- package/lib/vendor/blamejs/.gitattributes +42 -0
- package/lib/vendor/blamejs/.github/CODEOWNERS +4 -0
- package/lib/vendor/blamejs/.github/FUNDING.yml +2 -0
- package/lib/vendor/blamejs/.github/ISSUE_TEMPLATE/bug_report.md +58 -0
- package/lib/vendor/blamejs/.github/ISSUE_TEMPLATE/config.yml +8 -0
- package/lib/vendor/blamejs/.github/ISSUE_TEMPLATE/feature_request.md +99 -0
- package/lib/vendor/blamejs/.github/PULL_REQUEST_TEMPLATE.md +77 -0
- package/lib/vendor/blamejs/.github/dependabot.yml +37 -0
- package/lib/vendor/blamejs/.github/workflows/actions-lint.yml +148 -0
- package/lib/vendor/blamejs/.github/workflows/cflite_batch.yml +107 -0
- package/lib/vendor/blamejs/.github/workflows/cflite_pr.yml +122 -0
- package/lib/vendor/blamejs/.github/workflows/ci.yml +511 -0
- package/lib/vendor/blamejs/.github/workflows/codeql.yml +50 -0
- package/lib/vendor/blamejs/.github/workflows/npm-publish.yml +655 -0
- package/lib/vendor/blamejs/.github/workflows/release-container.yml +406 -0
- package/lib/vendor/blamejs/.github/workflows/scorecard.yml +101 -0
- package/lib/vendor/blamejs/.github/workflows/sha-to-tag-verify.yml +134 -0
- package/lib/vendor/blamejs/.gitignore +102 -0
- package/lib/vendor/blamejs/.gitleaks.toml +166 -0
- package/lib/vendor/blamejs/.hadolint.yaml +18 -0
- package/lib/vendor/blamejs/.npmrc +5 -0
- package/lib/vendor/blamejs/.pinact.yaml +17 -0
- package/lib/vendor/blamejs/ARCHITECTURE.md +158 -0
- package/lib/vendor/blamejs/CHANGELOG.md +1351 -0
- package/lib/vendor/blamejs/CODE_OF_CONDUCT.md +86 -0
- package/lib/vendor/blamejs/CONTRIBUTING.md +156 -0
- package/lib/vendor/blamejs/GOVERNANCE.md +201 -0
- package/lib/vendor/blamejs/LICENSE +201 -0
- package/lib/vendor/blamejs/LTS-CALENDAR.md +29 -0
- package/lib/vendor/blamejs/MIGRATING.md +29 -0
- package/lib/vendor/blamejs/NOTICE +81 -0
- package/lib/vendor/blamejs/README.md +304 -0
- package/lib/vendor/blamejs/SECURITY.md +432 -0
- package/lib/vendor/blamejs/api-snapshot.json +48709 -0
- package/lib/vendor/blamejs/assets/BlameJS_Logo.png +0 -0
- package/lib/vendor/blamejs/assets/BlameJS_Logo.svg +129 -0
- package/lib/vendor/blamejs/bench/README.md +77 -0
- package/lib/vendor/blamejs/bench/_helpers.js +70 -0
- package/lib/vendor/blamejs/bench/baseline.json +183 -0
- package/lib/vendor/blamejs/bench/crypto-hash.bench.js +19 -0
- package/lib/vendor/blamejs/bench/crypto-symmetric.bench.js +28 -0
- package/lib/vendor/blamejs/bench/run.js +140 -0
- package/lib/vendor/blamejs/bench/safe-json.bench.js +31 -0
- package/lib/vendor/blamejs/bin/blamejs.js +13 -0
- package/lib/vendor/blamejs/docker/caddy/Caddyfile +46 -0
- package/lib/vendor/blamejs/docker/coredns/Corefile +37 -0
- package/lib/vendor/blamejs/docker/haproxy/haproxy.cfg +52 -0
- package/lib/vendor/blamejs/docker/init/generate-certs.sh +118 -0
- package/lib/vendor/blamejs/docker/keycloak/realm-blamejs-test.json +87 -0
- package/lib/vendor/blamejs/docker/mitmproxy/config.yaml +16 -0
- package/lib/vendor/blamejs/docker/mongo/init-tls.sh +17 -0
- package/lib/vendor/blamejs/docker/mysql/my.cnf +12 -0
- package/lib/vendor/blamejs/docker/nats/nats.conf +33 -0
- package/lib/vendor/blamejs/docker/postgres/init-tls.sh +17 -0
- package/lib/vendor/blamejs/docker/postgres/postgresql.conf +18 -0
- package/lib/vendor/blamejs/docker/rabbitmq/rabbitmq.conf +18 -0
- package/lib/vendor/blamejs/docker/redis/redis.conf +15 -0
- package/lib/vendor/blamejs/docker/squid/squid.conf +24 -0
- package/lib/vendor/blamejs/docker/syslog/syslog-ng.conf +34 -0
- package/lib/vendor/blamejs/docker-compose.test.yml +545 -0
- package/lib/vendor/blamejs/docs/cis-postgres-crosswalk.md +102 -0
- package/lib/vendor/blamejs/docs/cis-sqlite-equivalent.md +92 -0
- package/lib/vendor/blamejs/eslint.config.mjs +204 -0
- package/lib/vendor/blamejs/examples/wiki/Caddyfile +40 -0
- package/lib/vendor/blamejs/examples/wiki/DEPLOY.md +218 -0
- package/lib/vendor/blamejs/examples/wiki/Dockerfile +120 -0
- package/lib/vendor/blamejs/examples/wiki/README.md +157 -0
- package/lib/vendor/blamejs/examples/wiki/cli-snapshot.json +250 -0
- package/lib/vendor/blamejs/examples/wiki/docker-compose.prod.yml +231 -0
- package/lib/vendor/blamejs/examples/wiki/docker-compose.yml +166 -0
- package/lib/vendor/blamejs/examples/wiki/env-snapshot.json +217 -0
- package/lib/vendor/blamejs/examples/wiki/lib/auto-site-entries.js +139 -0
- package/lib/vendor/blamejs/examples/wiki/lib/build-app.js +555 -0
- package/lib/vendor/blamejs/examples/wiki/lib/harvest-cli.js +507 -0
- package/lib/vendor/blamejs/examples/wiki/lib/harvest-env-vars.js +435 -0
- package/lib/vendor/blamejs/examples/wiki/lib/harvest-errors.js +282 -0
- package/lib/vendor/blamejs/examples/wiki/lib/harvest-vendored-deps.js +321 -0
- package/lib/vendor/blamejs/examples/wiki/lib/nav.js +15 -0
- package/lib/vendor/blamejs/examples/wiki/lib/opts-resolver.js +75 -0
- package/lib/vendor/blamejs/examples/wiki/lib/page-generator.js +508 -0
- package/lib/vendor/blamejs/examples/wiki/lib/section.js +276 -0
- package/lib/vendor/blamejs/examples/wiki/lib/source-comment-block-validator.js +587 -0
- package/lib/vendor/blamejs/examples/wiki/lib/source-doc-parser.js +318 -0
- package/lib/vendor/blamejs/examples/wiki/lib/symbol-index.js +122 -0
- package/lib/vendor/blamejs/examples/wiki/migrations/0001-pages-schema.js +74 -0
- package/lib/vendor/blamejs/examples/wiki/package.json +18 -0
- package/lib/vendor/blamejs/examples/wiki/public/img/blamejs-logo.png +0 -0
- package/lib/vendor/blamejs/examples/wiki/public/img/blamejs-logo.svg +129 -0
- package/lib/vendor/blamejs/examples/wiki/public/robots.txt +5 -0
- package/lib/vendor/blamejs/examples/wiki/public/vendor/MANIFEST.json +30 -0
- package/lib/vendor/blamejs/examples/wiki/public/vendor/prism.css +1 -0
- package/lib/vendor/blamejs/examples/wiki/public/vendor/prism.js +15 -0
- package/lib/vendor/blamejs/examples/wiki/public/wiki.css +1250 -0
- package/lib/vendor/blamejs/examples/wiki/routes/admin.js +366 -0
- package/lib/vendor/blamejs/examples/wiki/routes/integration.js +230 -0
- package/lib/vendor/blamejs/examples/wiki/routes/pages.js +266 -0
- package/lib/vendor/blamejs/examples/wiki/scripts/backfill-module-metadata.js +214 -0
- package/lib/vendor/blamejs/examples/wiki/seeders/prod/0001-default-pages.js +35 -0
- package/lib/vendor/blamejs/examples/wiki/seeders/prod/pages/_index.js +34 -0
- package/lib/vendor/blamejs/examples/wiki/seeders/prod/pages/api.js +76 -0
- package/lib/vendor/blamejs/examples/wiki/server.js +129 -0
- package/lib/vendor/blamejs/examples/wiki/site.config.js +197 -0
- package/lib/vendor/blamejs/examples/wiki/snippets/README.md +38 -0
- package/lib/vendor/blamejs/examples/wiki/snippets/auth/password-hash.example.js +15 -0
- package/lib/vendor/blamejs/examples/wiki/src/editor.js +103 -0
- package/lib/vendor/blamejs/examples/wiki/src/wiki.js +349 -0
- package/lib/vendor/blamejs/examples/wiki/test/AUDIT.md +155 -0
- package/lib/vendor/blamejs/examples/wiki/test/codebase-patterns.test.js +594 -0
- package/lib/vendor/blamejs/examples/wiki/test/e2e.js +741 -0
- package/lib/vendor/blamejs/examples/wiki/test/find-missing-pages.js +254 -0
- package/lib/vendor/blamejs/examples/wiki/test/integration.js +391 -0
- package/lib/vendor/blamejs/examples/wiki/test/validate-cli-snapshot.js +379 -0
- package/lib/vendor/blamejs/examples/wiki/test/validate-env-snapshot.js +346 -0
- package/lib/vendor/blamejs/examples/wiki/test/validate-nav-coverage.js +212 -0
- package/lib/vendor/blamejs/examples/wiki/test/validate-site-coverage.js +252 -0
- package/lib/vendor/blamejs/examples/wiki/test/validate-source-comment-blocks.js +107 -0
- package/lib/vendor/blamejs/examples/wiki/views/_layout.html +115 -0
- package/lib/vendor/blamejs/examples/wiki/views/admin/api-keys.html +51 -0
- package/lib/vendor/blamejs/examples/wiki/views/admin/dashboard.html +22 -0
- package/lib/vendor/blamejs/examples/wiki/views/admin/edit.html +17 -0
- package/lib/vendor/blamejs/examples/wiki/views/home.html +85 -0
- package/lib/vendor/blamejs/examples/wiki/views/login.html +18 -0
- package/lib/vendor/blamejs/examples/wiki/views/page.html +5 -0
- package/lib/vendor/blamejs/examples/wiki/views/partials/nav.html +13 -0
- package/lib/vendor/blamejs/examples/wiki/views/search.html +19 -0
- package/lib/vendor/blamejs/examples/wiki/wiki.config.js +15 -0
- package/lib/vendor/blamejs/fuzz/README.md +137 -0
- package/lib/vendor/blamejs/fuzz/_expected.js +35 -0
- package/lib/vendor/blamejs/fuzz/guard-agent-registry.fuzz.js +22 -0
- package/lib/vendor/blamejs/fuzz/guard-csv.fuzz.js +16 -0
- package/lib/vendor/blamejs/fuzz/guard-csv_seed_corpus/01-basic.csv +3 -0
- package/lib/vendor/blamejs/fuzz/guard-csv_seed_corpus/02-formula.csv +1 -0
- package/lib/vendor/blamejs/fuzz/guard-csv_seed_corpus/03-hyperlink.csv +1 -0
- package/lib/vendor/blamejs/fuzz/guard-dsn.fuzz.js +22 -0
- package/lib/vendor/blamejs/fuzz/guard-email.fuzz.js +16 -0
- package/lib/vendor/blamejs/fuzz/guard-email_seed_corpus/01-basic.eml +5 -0
- package/lib/vendor/blamejs/fuzz/guard-envelope.fuzz.js +24 -0
- package/lib/vendor/blamejs/fuzz/guard-event-bus-payload.fuzz.js +24 -0
- package/lib/vendor/blamejs/fuzz/guard-event-bus-topic.fuzz.js +20 -0
- package/lib/vendor/blamejs/fuzz/guard-html.fuzz.js +16 -0
- package/lib/vendor/blamejs/fuzz/guard-html_seed_corpus/01-basic.html +1 -0
- package/lib/vendor/blamejs/fuzz/guard-html_seed_corpus/02-script.html +1 -0
- package/lib/vendor/blamejs/fuzz/guard-html_seed_corpus/03-event.html +1 -0
- package/lib/vendor/blamejs/fuzz/guard-html_seed_corpus/04-jsurl.html +1 -0
- package/lib/vendor/blamejs/fuzz/guard-idempotency-key.fuzz.js +20 -0
- package/lib/vendor/blamejs/fuzz/guard-imap-command.fuzz.js +35 -0
- package/lib/vendor/blamejs/fuzz/guard-jmap.fuzz.js +41 -0
- package/lib/vendor/blamejs/fuzz/guard-json.fuzz.js +16 -0
- package/lib/vendor/blamejs/fuzz/guard-json_seed_corpus/01-basic.json +1 -0
- package/lib/vendor/blamejs/fuzz/guard-json_seed_corpus/02-proto.json +1 -0
- package/lib/vendor/blamejs/fuzz/guard-json_seed_corpus/03-dupkey.json +1 -0
- package/lib/vendor/blamejs/fuzz/guard-json_seed_corpus/04-nan.json +1 -0
- package/lib/vendor/blamejs/fuzz/guard-json_seed_corpus/05-bom.json +1 -0
- package/lib/vendor/blamejs/fuzz/guard-list-id.fuzz.js +21 -0
- package/lib/vendor/blamejs/fuzz/guard-list-unsubscribe.fuzz.js +25 -0
- package/lib/vendor/blamejs/fuzz/guard-mail-compose.fuzz.js +22 -0
- package/lib/vendor/blamejs/fuzz/guard-mail-move.fuzz.js +22 -0
- package/lib/vendor/blamejs/fuzz/guard-mail-query.fuzz.js +27 -0
- package/lib/vendor/blamejs/fuzz/guard-mail-reply.fuzz.js +23 -0
- package/lib/vendor/blamejs/fuzz/guard-mail-sieve.fuzz.js +36 -0
- package/lib/vendor/blamejs/fuzz/guard-managesieve-command.fuzz.js +26 -0
- package/lib/vendor/blamejs/fuzz/guard-markdown.fuzz.js +16 -0
- package/lib/vendor/blamejs/fuzz/guard-markdown_seed_corpus/01-basic.md +2 -0
- package/lib/vendor/blamejs/fuzz/guard-markdown_seed_corpus/02-jsurl.md +1 -0
- package/lib/vendor/blamejs/fuzz/guard-markdown_seed_corpus/03-jsimg.md +1 -0
- package/lib/vendor/blamejs/fuzz/guard-message-id.fuzz.js +26 -0
- package/lib/vendor/blamejs/fuzz/guard-pop3-command.fuzz.js +23 -0
- package/lib/vendor/blamejs/fuzz/guard-posture-chain.fuzz.js +22 -0
- package/lib/vendor/blamejs/fuzz/guard-saga-config.fuzz.js +32 -0
- package/lib/vendor/blamejs/fuzz/guard-smtp-command.fuzz.js +27 -0
- package/lib/vendor/blamejs/fuzz/guard-snapshot-envelope.fuzz.js +22 -0
- package/lib/vendor/blamejs/fuzz/guard-stream-args.fuzz.js +22 -0
- package/lib/vendor/blamejs/fuzz/guard-svg.fuzz.js +16 -0
- package/lib/vendor/blamejs/fuzz/guard-svg_seed_corpus/01-basic.svg +1 -0
- package/lib/vendor/blamejs/fuzz/guard-svg_seed_corpus/02-script.svg +1 -0
- package/lib/vendor/blamejs/fuzz/guard-tenant-id.fuzz.js +20 -0
- package/lib/vendor/blamejs/fuzz/guard-trace-context.fuzz.js +30 -0
- package/lib/vendor/blamejs/fuzz/guard-xml.fuzz.js +16 -0
- package/lib/vendor/blamejs/fuzz/guard-xml_seed_corpus/01-basic.xml +1 -0
- package/lib/vendor/blamejs/fuzz/guard-xml_seed_corpus/02-xxe.xml +1 -0
- package/lib/vendor/blamejs/fuzz/guard-yaml.fuzz.js +16 -0
- package/lib/vendor/blamejs/fuzz/guard-yaml_seed_corpus/01-basic.yaml +2 -0
- package/lib/vendor/blamejs/fuzz/guard-yaml_seed_corpus/02-anchor.yaml +2 -0
- package/lib/vendor/blamejs/fuzz/guard-yaml_seed_corpus/03-norway.yaml +1 -0
- package/lib/vendor/blamejs/fuzz/guard-yaml_seed_corpus/04-multidoc.yaml +4 -0
- package/lib/vendor/blamejs/fuzz/parsers__safe-ini.fuzz.js +16 -0
- package/lib/vendor/blamejs/fuzz/parsers__safe-ini_seed_corpus/01-basic.ini +2 -0
- package/lib/vendor/blamejs/fuzz/parsers__safe-toml.fuzz.js +16 -0
- package/lib/vendor/blamejs/fuzz/parsers__safe-toml_seed_corpus/01-basic.toml +4 -0
- package/lib/vendor/blamejs/fuzz/parsers__safe-xml.fuzz.js +16 -0
- package/lib/vendor/blamejs/fuzz/parsers__safe-xml_seed_corpus/01-basic.xml +1 -0
- package/lib/vendor/blamejs/fuzz/parsers__safe-yaml.fuzz.js +16 -0
- package/lib/vendor/blamejs/fuzz/parsers__safe-yaml_seed_corpus/01-basic.yaml +4 -0
- package/lib/vendor/blamejs/fuzz/safe-decompress.fuzz.js +49 -0
- package/lib/vendor/blamejs/fuzz/safe-dns.fuzz.js +29 -0
- package/lib/vendor/blamejs/fuzz/safe-ical.fuzz.js +16 -0
- package/lib/vendor/blamejs/fuzz/safe-icap.fuzz.js +42 -0
- package/lib/vendor/blamejs/fuzz/safe-json.fuzz.js +25 -0
- package/lib/vendor/blamejs/fuzz/safe-json_seed_corpus/01-object.txt +1 -0
- package/lib/vendor/blamejs/fuzz/safe-json_seed_corpus/02-array.txt +1 -0
- package/lib/vendor/blamejs/fuzz/safe-json_seed_corpus/03-string.txt +1 -0
- package/lib/vendor/blamejs/fuzz/safe-json_seed_corpus/04-proto.txt +1 -0
- package/lib/vendor/blamejs/fuzz/safe-json_seed_corpus/05-deep.txt +1 -0
- package/lib/vendor/blamejs/fuzz/safe-jsonpath.fuzz.js +16 -0
- package/lib/vendor/blamejs/fuzz/safe-jsonpath_seed_corpus/01-basic.txt +1 -0
- package/lib/vendor/blamejs/fuzz/safe-jsonpath_seed_corpus/02-filter.txt +1 -0
- package/lib/vendor/blamejs/fuzz/safe-jsonpath_seed_corpus/03-deepscan.txt +1 -0
- package/lib/vendor/blamejs/fuzz/safe-jsonpath_seed_corpus/04-slice.txt +1 -0
- package/lib/vendor/blamejs/fuzz/safe-mime.fuzz.js +27 -0
- package/lib/vendor/blamejs/fuzz/safe-mount-info.fuzz.js +33 -0
- package/lib/vendor/blamejs/fuzz/safe-sieve.fuzz.js +28 -0
- package/lib/vendor/blamejs/fuzz/safe-smtp.fuzz.js +64 -0
- package/lib/vendor/blamejs/fuzz/safe-url.fuzz.js +16 -0
- package/lib/vendor/blamejs/fuzz/safe-url_seed_corpus/01-basic.txt +1 -0
- package/lib/vendor/blamejs/fuzz/safe-url_seed_corpus/02-userinfo.txt +1 -0
- package/lib/vendor/blamejs/fuzz/safe-url_seed_corpus/03-dangerous.txt +1 -0
- package/lib/vendor/blamejs/fuzz/safe-url_seed_corpus/04-data.txt +1 -0
- package/lib/vendor/blamejs/fuzz/safe-url_seed_corpus/05-ipv6.txt +1 -0
- package/lib/vendor/blamejs/fuzz/safe-url_seed_corpus/06-idn.txt +1 -0
- package/lib/vendor/blamejs/fuzz/safe-vcard.fuzz.js +16 -0
- package/lib/vendor/blamejs/index.js +678 -0
- package/lib/vendor/blamejs/keys/release-pqc-pub.json +7 -0
- package/lib/vendor/blamejs/lib/_test/crypto-fixtures.js +67 -0
- package/lib/vendor/blamejs/lib/a2a-tasks.js +598 -0
- package/lib/vendor/blamejs/lib/a2a.js +407 -0
- package/lib/vendor/blamejs/lib/acme.js +1448 -0
- package/lib/vendor/blamejs/lib/agent-audit.js +45 -0
- package/lib/vendor/blamejs/lib/agent-event-bus.js +382 -0
- package/lib/vendor/blamejs/lib/agent-idempotency.js +497 -0
- package/lib/vendor/blamejs/lib/agent-orchestrator.js +717 -0
- package/lib/vendor/blamejs/lib/agent-posture-chain.js +366 -0
- package/lib/vendor/blamejs/lib/agent-saga.js +321 -0
- package/lib/vendor/blamejs/lib/agent-snapshot.js +676 -0
- package/lib/vendor/blamejs/lib/agent-stream.js +269 -0
- package/lib/vendor/blamejs/lib/agent-tenant.js +632 -0
- package/lib/vendor/blamejs/lib/agent-trace.js +281 -0
- package/lib/vendor/blamejs/lib/ai-adverse-decision.js +184 -0
- package/lib/vendor/blamejs/lib/ai-content-detect.js +268 -0
- package/lib/vendor/blamejs/lib/ai-input.js +201 -0
- package/lib/vendor/blamejs/lib/ai-model-manifest.js +363 -0
- package/lib/vendor/blamejs/lib/ai-pref.js +340 -0
- package/lib/vendor/blamejs/lib/api-key.js +721 -0
- package/lib/vendor/blamejs/lib/api-snapshot.js +458 -0
- package/lib/vendor/blamejs/lib/app-shutdown.js +557 -0
- package/lib/vendor/blamejs/lib/app.js +365 -0
- package/lib/vendor/blamejs/lib/archive.js +547 -0
- package/lib/vendor/blamejs/lib/arg-parser.js +697 -0
- package/lib/vendor/blamejs/lib/argon2-builtin.js +173 -0
- package/lib/vendor/blamejs/lib/asn1-der.js +424 -0
- package/lib/vendor/blamejs/lib/asyncapi-bindings.js +160 -0
- package/lib/vendor/blamejs/lib/asyncapi-traits.js +143 -0
- package/lib/vendor/blamejs/lib/asyncapi.js +575 -0
- package/lib/vendor/blamejs/lib/atomic-file.js +1023 -0
- package/lib/vendor/blamejs/lib/audit-chain.js +266 -0
- package/lib/vendor/blamejs/lib/audit-daily-review.js +389 -0
- package/lib/vendor/blamejs/lib/audit-sign.js +751 -0
- package/lib/vendor/blamejs/lib/audit-tools.js +1113 -0
- package/lib/vendor/blamejs/lib/audit.js +1671 -0
- package/lib/vendor/blamejs/lib/auth/aal.js +169 -0
- package/lib/vendor/blamejs/lib/auth/access-lock.js +220 -0
- package/lib/vendor/blamejs/lib/auth/acr-vocabulary.js +265 -0
- package/lib/vendor/blamejs/lib/auth/ato-kill-switch.js +112 -0
- package/lib/vendor/blamejs/lib/auth/auth-time-tracker.js +111 -0
- package/lib/vendor/blamejs/lib/auth/bot-challenge.js +573 -0
- package/lib/vendor/blamejs/lib/auth/ciba.js +637 -0
- package/lib/vendor/blamejs/lib/auth/dpop.js +516 -0
- package/lib/vendor/blamejs/lib/auth/elevation-grant.js +306 -0
- package/lib/vendor/blamejs/lib/auth/fal.js +229 -0
- package/lib/vendor/blamejs/lib/auth/fido-mds3.js +681 -0
- package/lib/vendor/blamejs/lib/auth/jwt-external.js +519 -0
- package/lib/vendor/blamejs/lib/auth/jwt.js +430 -0
- package/lib/vendor/blamejs/lib/auth/lockout.js +449 -0
- package/lib/vendor/blamejs/lib/auth/oauth.js +2141 -0
- package/lib/vendor/blamejs/lib/auth/oid4vci.js +657 -0
- package/lib/vendor/blamejs/lib/auth/oid4vp.js +531 -0
- package/lib/vendor/blamejs/lib/auth/openid-federation.js +600 -0
- package/lib/vendor/blamejs/lib/auth/passkey.js +676 -0
- package/lib/vendor/blamejs/lib/auth/password.js +693 -0
- package/lib/vendor/blamejs/lib/auth/saml.js +2109 -0
- package/lib/vendor/blamejs/lib/auth/sd-jwt-vc-disclosure.js +95 -0
- package/lib/vendor/blamejs/lib/auth/sd-jwt-vc-holder.js +225 -0
- package/lib/vendor/blamejs/lib/auth/sd-jwt-vc-issuer.js +197 -0
- package/lib/vendor/blamejs/lib/auth/sd-jwt-vc.js +728 -0
- package/lib/vendor/blamejs/lib/auth/status-list.js +272 -0
- package/lib/vendor/blamejs/lib/auth/step-up-policy.js +335 -0
- package/lib/vendor/blamejs/lib/auth/step-up.js +454 -0
- package/lib/vendor/blamejs/lib/auth-bot-challenge.js +505 -0
- package/lib/vendor/blamejs/lib/auth-header.js +148 -0
- package/lib/vendor/blamejs/lib/backup/bundle.js +265 -0
- package/lib/vendor/blamejs/lib/backup/crypto.js +176 -0
- package/lib/vendor/blamejs/lib/backup/index.js +1001 -0
- package/lib/vendor/blamejs/lib/backup/manifest.js +443 -0
- package/lib/vendor/blamejs/lib/boot-gates.js +174 -0
- package/lib/vendor/blamejs/lib/breach-deadline.js +272 -0
- package/lib/vendor/blamejs/lib/break-glass.js +1753 -0
- package/lib/vendor/blamejs/lib/budr.js +205 -0
- package/lib/vendor/blamejs/lib/bundler.js +461 -0
- package/lib/vendor/blamejs/lib/cache-redis.js +256 -0
- package/lib/vendor/blamejs/lib/cache-status.js +288 -0
- package/lib/vendor/blamejs/lib/cache.js +1331 -0
- package/lib/vendor/blamejs/lib/calendar.js +1240 -0
- package/lib/vendor/blamejs/lib/canonical-json.js +143 -0
- package/lib/vendor/blamejs/lib/cdn-cache-control.js +473 -0
- package/lib/vendor/blamejs/lib/cert.js +763 -0
- package/lib/vendor/blamejs/lib/chain-writer.js +259 -0
- package/lib/vendor/blamejs/lib/circuit-breaker.js +101 -0
- package/lib/vendor/blamejs/lib/cli-helpers.js +237 -0
- package/lib/vendor/blamejs/lib/cli.js +2328 -0
- package/lib/vendor/blamejs/lib/client-hints.js +318 -0
- package/lib/vendor/blamejs/lib/cloud-events.js +277 -0
- package/lib/vendor/blamejs/lib/cluster-provider-db.js +317 -0
- package/lib/vendor/blamejs/lib/cluster-storage.js +351 -0
- package/lib/vendor/blamejs/lib/cluster.js +1017 -0
- package/lib/vendor/blamejs/lib/cms-codec.js +826 -0
- package/lib/vendor/blamejs/lib/codepoint-class.js +262 -0
- package/lib/vendor/blamejs/lib/compliance-ai-act-logging.js +190 -0
- package/lib/vendor/blamejs/lib/compliance-ai-act-prohibited.js +205 -0
- package/lib/vendor/blamejs/lib/compliance-ai-act-risk.js +189 -0
- package/lib/vendor/blamejs/lib/compliance-ai-act-transparency.js +200 -0
- package/lib/vendor/blamejs/lib/compliance-ai-act.js +821 -0
- package/lib/vendor/blamejs/lib/compliance-eaa.js +204 -0
- package/lib/vendor/blamejs/lib/compliance-sanctions-aliases.js +167 -0
- package/lib/vendor/blamejs/lib/compliance-sanctions-fetcher.js +206 -0
- package/lib/vendor/blamejs/lib/compliance-sanctions-fuzzy.js +297 -0
- package/lib/vendor/blamejs/lib/compliance-sanctions.js +569 -0
- package/lib/vendor/blamejs/lib/compliance.js +1558 -0
- package/lib/vendor/blamejs/lib/config-drift.js +426 -0
- package/lib/vendor/blamejs/lib/config.js +446 -0
- package/lib/vendor/blamejs/lib/consent.js +369 -0
- package/lib/vendor/blamejs/lib/constants.js +209 -0
- package/lib/vendor/blamejs/lib/content-credentials.js +704 -0
- package/lib/vendor/blamejs/lib/cookies.js +560 -0
- package/lib/vendor/blamejs/lib/cra-report.js +299 -0
- package/lib/vendor/blamejs/lib/credential-hash.js +394 -0
- package/lib/vendor/blamejs/lib/crypto-field.js +1017 -0
- package/lib/vendor/blamejs/lib/crypto-hpke-pq.js +187 -0
- package/lib/vendor/blamejs/lib/crypto-hpke.js +256 -0
- package/lib/vendor/blamejs/lib/crypto.js +1908 -0
- package/lib/vendor/blamejs/lib/csp.js +271 -0
- package/lib/vendor/blamejs/lib/csv.js +418 -0
- package/lib/vendor/blamejs/lib/daemon.js +481 -0
- package/lib/vendor/blamejs/lib/dark-patterns.js +488 -0
- package/lib/vendor/blamejs/lib/data-act.js +328 -0
- package/lib/vendor/blamejs/lib/db-collection.js +587 -0
- package/lib/vendor/blamejs/lib/db-declare-row-policy.js +267 -0
- package/lib/vendor/blamejs/lib/db-declare-view.js +420 -0
- package/lib/vendor/blamejs/lib/db-file-lifecycle.js +333 -0
- package/lib/vendor/blamejs/lib/db-query.js +802 -0
- package/lib/vendor/blamejs/lib/db-role-context.js +50 -0
- package/lib/vendor/blamejs/lib/db-schema.js +322 -0
- package/lib/vendor/blamejs/lib/db.js +3111 -0
- package/lib/vendor/blamejs/lib/dbsc.js +299 -0
- package/lib/vendor/blamejs/lib/ddl-change-control.js +523 -0
- package/lib/vendor/blamejs/lib/deprecate.js +377 -0
- package/lib/vendor/blamejs/lib/dev.js +405 -0
- package/lib/vendor/blamejs/lib/dora.js +402 -0
- package/lib/vendor/blamejs/lib/dr-runbook.js +368 -0
- package/lib/vendor/blamejs/lib/dsr.js +1188 -0
- package/lib/vendor/blamejs/lib/dual-control.js +526 -0
- package/lib/vendor/blamejs/lib/early-hints.js +212 -0
- package/lib/vendor/blamejs/lib/error-page.js +420 -0
- package/lib/vendor/blamejs/lib/events.js +214 -0
- package/lib/vendor/blamejs/lib/external-db-migrate.js +659 -0
- package/lib/vendor/blamejs/lib/external-db.js +1877 -0
- package/lib/vendor/blamejs/lib/fapi2.js +394 -0
- package/lib/vendor/blamejs/lib/fda-21cfr11.js +395 -0
- package/lib/vendor/blamejs/lib/fdx.js +370 -0
- package/lib/vendor/blamejs/lib/fedcm.js +264 -0
- package/lib/vendor/blamejs/lib/file-type.js +360 -0
- package/lib/vendor/blamejs/lib/file-upload.js +1256 -0
- package/lib/vendor/blamejs/lib/flag-cache.js +136 -0
- package/lib/vendor/blamejs/lib/flag-evaluation-context.js +135 -0
- package/lib/vendor/blamejs/lib/flag-providers.js +279 -0
- package/lib/vendor/blamejs/lib/flag-targeting.js +210 -0
- package/lib/vendor/blamejs/lib/flag.js +346 -0
- package/lib/vendor/blamejs/lib/forms.js +525 -0
- package/lib/vendor/blamejs/lib/framework-error.js +724 -0
- package/lib/vendor/blamejs/lib/framework-schema.js +845 -0
- package/lib/vendor/blamejs/lib/framework-sha1-hibp.js +34 -0
- package/lib/vendor/blamejs/lib/fsm.js +469 -0
- package/lib/vendor/blamejs/lib/gate-contract.js +1661 -0
- package/lib/vendor/blamejs/lib/gdpr-ropa.js +261 -0
- package/lib/vendor/blamejs/lib/graphql-federation.js +234 -0
- package/lib/vendor/blamejs/lib/guard-agent-registry.js +179 -0
- package/lib/vendor/blamejs/lib/guard-all.js +555 -0
- package/lib/vendor/blamejs/lib/guard-archive.js +901 -0
- package/lib/vendor/blamejs/lib/guard-auth.js +451 -0
- package/lib/vendor/blamejs/lib/guard-cidr.js +676 -0
- package/lib/vendor/blamejs/lib/guard-csv.js +1176 -0
- package/lib/vendor/blamejs/lib/guard-domain.js +814 -0
- package/lib/vendor/blamejs/lib/guard-dsn.js +382 -0
- package/lib/vendor/blamejs/lib/guard-email.js +951 -0
- package/lib/vendor/blamejs/lib/guard-envelope.js +294 -0
- package/lib/vendor/blamejs/lib/guard-event-bus-payload.js +217 -0
- package/lib/vendor/blamejs/lib/guard-event-bus-topic.js +150 -0
- package/lib/vendor/blamejs/lib/guard-filename.js +956 -0
- package/lib/vendor/blamejs/lib/guard-graphql.js +731 -0
- package/lib/vendor/blamejs/lib/guard-html-wcag-aria.js +164 -0
- package/lib/vendor/blamejs/lib/guard-html-wcag-forms.js +144 -0
- package/lib/vendor/blamejs/lib/guard-html-wcag-tables.js +154 -0
- package/lib/vendor/blamejs/lib/guard-html-wcag-tagwalk.js +44 -0
- package/lib/vendor/blamejs/lib/guard-html-wcag.js +470 -0
- package/lib/vendor/blamejs/lib/guard-html.js +1209 -0
- package/lib/vendor/blamejs/lib/guard-idempotency-key.js +151 -0
- package/lib/vendor/blamejs/lib/guard-image.js +584 -0
- package/lib/vendor/blamejs/lib/guard-imap-command.js +337 -0
- package/lib/vendor/blamejs/lib/guard-jmap.js +321 -0
- package/lib/vendor/blamejs/lib/guard-json.js +935 -0
- package/lib/vendor/blamejs/lib/guard-jsonpath.js +512 -0
- package/lib/vendor/blamejs/lib/guard-jwt.js +772 -0
- package/lib/vendor/blamejs/lib/guard-list-id.js +318 -0
- package/lib/vendor/blamejs/lib/guard-list-unsubscribe.js +412 -0
- package/lib/vendor/blamejs/lib/guard-mail-compose.js +282 -0
- package/lib/vendor/blamejs/lib/guard-mail-move.js +202 -0
- package/lib/vendor/blamejs/lib/guard-mail-query.js +310 -0
- package/lib/vendor/blamejs/lib/guard-mail-reply.js +172 -0
- package/lib/vendor/blamejs/lib/guard-mail-sieve.js +207 -0
- package/lib/vendor/blamejs/lib/guard-managesieve-command.js +566 -0
- package/lib/vendor/blamejs/lib/guard-markdown.js +768 -0
- package/lib/vendor/blamejs/lib/guard-message-id.js +267 -0
- package/lib/vendor/blamejs/lib/guard-mime.js +609 -0
- package/lib/vendor/blamejs/lib/guard-oauth.js +650 -0
- package/lib/vendor/blamejs/lib/guard-pdf.js +569 -0
- package/lib/vendor/blamejs/lib/guard-pop3-command.js +317 -0
- package/lib/vendor/blamejs/lib/guard-posture-chain.js +201 -0
- package/lib/vendor/blamejs/lib/guard-regex.js +632 -0
- package/lib/vendor/blamejs/lib/guard-saga-config.js +157 -0
- package/lib/vendor/blamejs/lib/guard-shell.js +522 -0
- package/lib/vendor/blamejs/lib/guard-smtp-command.js +594 -0
- package/lib/vendor/blamejs/lib/guard-snapshot-envelope.js +168 -0
- package/lib/vendor/blamejs/lib/guard-stream-args.js +166 -0
- package/lib/vendor/blamejs/lib/guard-svg.js +1163 -0
- package/lib/vendor/blamejs/lib/guard-template.js +490 -0
- package/lib/vendor/blamejs/lib/guard-tenant-id.js +138 -0
- package/lib/vendor/blamejs/lib/guard-time.js +586 -0
- package/lib/vendor/blamejs/lib/guard-trace-context.js +172 -0
- package/lib/vendor/blamejs/lib/guard-uuid.js +548 -0
- package/lib/vendor/blamejs/lib/guard-xml.js +666 -0
- package/lib/vendor/blamejs/lib/guard-yaml.js +726 -0
- package/lib/vendor/blamejs/lib/hal.js +125 -0
- package/lib/vendor/blamejs/lib/handlers.js +350 -0
- package/lib/vendor/blamejs/lib/honeytoken.js +168 -0
- package/lib/vendor/blamejs/lib/html-balance.js +347 -0
- package/lib/vendor/blamejs/lib/http-client-cache.js +923 -0
- package/lib/vendor/blamejs/lib/http-client-cookie-jar.js +519 -0
- package/lib/vendor/blamejs/lib/http-client.js +2152 -0
- package/lib/vendor/blamejs/lib/http-message-signature.js +589 -0
- package/lib/vendor/blamejs/lib/http2-teardown.js +34 -0
- package/lib/vendor/blamejs/lib/i18n-messageformat.js +398 -0
- package/lib/vendor/blamejs/lib/i18n.js +931 -0
- package/lib/vendor/blamejs/lib/iab-mspa.js +257 -0
- package/lib/vendor/blamejs/lib/iab-tcf.js +461 -0
- package/lib/vendor/blamejs/lib/importmap-integrity.js +90 -0
- package/lib/vendor/blamejs/lib/inbox.js +435 -0
- package/lib/vendor/blamejs/lib/incident-report.js +314 -0
- package/lib/vendor/blamejs/lib/ip-utils.js +102 -0
- package/lib/vendor/blamejs/lib/jobs.js +185 -0
- package/lib/vendor/blamejs/lib/jose-jwe-experimental.js +228 -0
- package/lib/vendor/blamejs/lib/jsonapi.js +230 -0
- package/lib/vendor/blamejs/lib/keychain.js +865 -0
- package/lib/vendor/blamejs/lib/lazy-require.js +48 -0
- package/lib/vendor/blamejs/lib/legal-hold.js +374 -0
- package/lib/vendor/blamejs/lib/local-db-thin.js +321 -0
- package/lib/vendor/blamejs/lib/log-stream-cloudwatch.js +369 -0
- package/lib/vendor/blamejs/lib/log-stream-local.js +146 -0
- package/lib/vendor/blamejs/lib/log-stream-otlp-grpc.js +410 -0
- package/lib/vendor/blamejs/lib/log-stream-otlp.js +286 -0
- package/lib/vendor/blamejs/lib/log-stream-syslog.js +310 -0
- package/lib/vendor/blamejs/lib/log-stream-webhook.js +199 -0
- package/lib/vendor/blamejs/lib/log-stream.js +584 -0
- package/lib/vendor/blamejs/lib/log.js +625 -0
- package/lib/vendor/blamejs/lib/lro.js +200 -0
- package/lib/vendor/blamejs/lib/mail-agent.js +786 -0
- package/lib/vendor/blamejs/lib/mail-arc-sign.js +417 -0
- package/lib/vendor/blamejs/lib/mail-arf.js +343 -0
- package/lib/vendor/blamejs/lib/mail-auth.js +2144 -0
- package/lib/vendor/blamejs/lib/mail-bimi.js +1047 -0
- package/lib/vendor/blamejs/lib/mail-bounce.js +955 -0
- package/lib/vendor/blamejs/lib/mail-crypto-pgp.js +1286 -0
- package/lib/vendor/blamejs/lib/mail-crypto-smime.js +789 -0
- package/lib/vendor/blamejs/lib/mail-crypto.js +108 -0
- package/lib/vendor/blamejs/lib/mail-dav.js +1224 -0
- package/lib/vendor/blamejs/lib/mail-deploy.js +1119 -0
- package/lib/vendor/blamejs/lib/mail-dkim.js +1250 -0
- package/lib/vendor/blamejs/lib/mail-greylist.js +448 -0
- package/lib/vendor/blamejs/lib/mail-helo.js +473 -0
- package/lib/vendor/blamejs/lib/mail-journal.js +435 -0
- package/lib/vendor/blamejs/lib/mail-mdn.js +424 -0
- package/lib/vendor/blamejs/lib/mail-rbl.js +392 -0
- package/lib/vendor/blamejs/lib/mail-require-tls.js +198 -0
- package/lib/vendor/blamejs/lib/mail-scan.js +502 -0
- package/lib/vendor/blamejs/lib/mail-send-deliver.js +629 -0
- package/lib/vendor/blamejs/lib/mail-server-imap.js +1858 -0
- package/lib/vendor/blamejs/lib/mail-server-jmap.js +1565 -0
- package/lib/vendor/blamejs/lib/mail-server-managesieve.js +908 -0
- package/lib/vendor/blamejs/lib/mail-server-mx.js +969 -0
- package/lib/vendor/blamejs/lib/mail-server-pop3.js +915 -0
- package/lib/vendor/blamejs/lib/mail-server-rate-limit.js +315 -0
- package/lib/vendor/blamejs/lib/mail-server-registry.js +378 -0
- package/lib/vendor/blamejs/lib/mail-server-submission.js +1396 -0
- package/lib/vendor/blamejs/lib/mail-server-tls.js +445 -0
- package/lib/vendor/blamejs/lib/mail-sieve.js +557 -0
- package/lib/vendor/blamejs/lib/mail-spam-score.js +284 -0
- package/lib/vendor/blamejs/lib/mail-srs.js +248 -0
- package/lib/vendor/blamejs/lib/mail-store-fts.js +394 -0
- package/lib/vendor/blamejs/lib/mail-store.js +929 -0
- package/lib/vendor/blamejs/lib/mail-unsubscribe.js +400 -0
- package/lib/vendor/blamejs/lib/mail.js +1971 -0
- package/lib/vendor/blamejs/lib/mcp-tool-registry.js +473 -0
- package/lib/vendor/blamejs/lib/mcp.js +950 -0
- package/lib/vendor/blamejs/lib/metrics.js +1503 -0
- package/lib/vendor/blamejs/lib/middleware/age-gate.js +177 -0
- package/lib/vendor/blamejs/lib/middleware/ai-act-disclosure.js +203 -0
- package/lib/vendor/blamejs/lib/middleware/api-encrypt.js +981 -0
- package/lib/vendor/blamejs/lib/middleware/assetlinks.js +137 -0
- package/lib/vendor/blamejs/lib/middleware/asyncapi-serve.js +171 -0
- package/lib/vendor/blamejs/lib/middleware/attach-user.js +220 -0
- package/lib/vendor/blamejs/lib/middleware/bearer-auth.js +293 -0
- package/lib/vendor/blamejs/lib/middleware/body-parser.js +1519 -0
- package/lib/vendor/blamejs/lib/middleware/bot-disclose.js +183 -0
- package/lib/vendor/blamejs/lib/middleware/bot-guard.js +217 -0
- package/lib/vendor/blamejs/lib/middleware/clear-site-data.js +122 -0
- package/lib/vendor/blamejs/lib/middleware/compose-pipeline.js +355 -0
- package/lib/vendor/blamejs/lib/middleware/compression.js +489 -0
- package/lib/vendor/blamejs/lib/middleware/cookies.js +130 -0
- package/lib/vendor/blamejs/lib/middleware/cors.js +386 -0
- package/lib/vendor/blamejs/lib/middleware/csp-nonce.js +388 -0
- package/lib/vendor/blamejs/lib/middleware/csp-report.js +167 -0
- package/lib/vendor/blamejs/lib/middleware/csrf-protect.js +499 -0
- package/lib/vendor/blamejs/lib/middleware/daily-byte-quota.js +243 -0
- package/lib/vendor/blamejs/lib/middleware/db-role-for.js +304 -0
- package/lib/vendor/blamejs/lib/middleware/dpop.js +402 -0
- package/lib/vendor/blamejs/lib/middleware/error-handler.js +69 -0
- package/lib/vendor/blamejs/lib/middleware/fetch-metadata.js +168 -0
- package/lib/vendor/blamejs/lib/middleware/flag-context.js +110 -0
- package/lib/vendor/blamejs/lib/middleware/gpc.js +153 -0
- package/lib/vendor/blamejs/lib/middleware/headers.js +242 -0
- package/lib/vendor/blamejs/lib/middleware/health.js +438 -0
- package/lib/vendor/blamejs/lib/middleware/host-allowlist.js +189 -0
- package/lib/vendor/blamejs/lib/middleware/idempotency-key.js +964 -0
- package/lib/vendor/blamejs/lib/middleware/index.js +183 -0
- package/lib/vendor/blamejs/lib/middleware/nel.js +214 -0
- package/lib/vendor/blamejs/lib/middleware/network-allowlist.js +237 -0
- package/lib/vendor/blamejs/lib/middleware/no-cache.js +106 -0
- package/lib/vendor/blamejs/lib/middleware/openapi-serve.js +177 -0
- package/lib/vendor/blamejs/lib/middleware/protected-resource-metadata.js +277 -0
- package/lib/vendor/blamejs/lib/middleware/rate-limit.js +556 -0
- package/lib/vendor/blamejs/lib/middleware/request-id.js +79 -0
- package/lib/vendor/blamejs/lib/middleware/request-log.js +205 -0
- package/lib/vendor/blamejs/lib/middleware/require-aal.js +138 -0
- package/lib/vendor/blamejs/lib/middleware/require-auth.js +144 -0
- package/lib/vendor/blamejs/lib/middleware/require-bound-key.js +290 -0
- package/lib/vendor/blamejs/lib/middleware/require-content-type.js +113 -0
- package/lib/vendor/blamejs/lib/middleware/require-methods.js +97 -0
- package/lib/vendor/blamejs/lib/middleware/require-mtls.js +212 -0
- package/lib/vendor/blamejs/lib/middleware/require-step-up.js +226 -0
- package/lib/vendor/blamejs/lib/middleware/scim-server.js +375 -0
- package/lib/vendor/blamejs/lib/middleware/security-headers.js +285 -0
- package/lib/vendor/blamejs/lib/middleware/security-txt.js +170 -0
- package/lib/vendor/blamejs/lib/middleware/span-http-server.js +280 -0
- package/lib/vendor/blamejs/lib/middleware/speculation-rules.js +323 -0
- package/lib/vendor/blamejs/lib/middleware/sse.js +200 -0
- package/lib/vendor/blamejs/lib/middleware/trace-log-correlation.js +167 -0
- package/lib/vendor/blamejs/lib/middleware/trace-propagate.js +148 -0
- package/lib/vendor/blamejs/lib/middleware/tus-upload.js +749 -0
- package/lib/vendor/blamejs/lib/middleware/web-app-manifest.js +164 -0
- package/lib/vendor/blamejs/lib/migration-files.js +37 -0
- package/lib/vendor/blamejs/lib/migrations.js +385 -0
- package/lib/vendor/blamejs/lib/mime-parse.js +198 -0
- package/lib/vendor/blamejs/lib/money.js +699 -0
- package/lib/vendor/blamejs/lib/mtls-ca.js +572 -0
- package/lib/vendor/blamejs/lib/mtls-engine-default.js +501 -0
- package/lib/vendor/blamejs/lib/network-byte-quota.js +308 -0
- package/lib/vendor/blamejs/lib/network-dns-resolver.js +533 -0
- package/lib/vendor/blamejs/lib/network-dns.js +1930 -0
- package/lib/vendor/blamejs/lib/network-heartbeat.js +425 -0
- package/lib/vendor/blamejs/lib/network-nts.js +574 -0
- package/lib/vendor/blamejs/lib/network-proxy.js +265 -0
- package/lib/vendor/blamejs/lib/network-smtp-policy.js +836 -0
- package/lib/vendor/blamejs/lib/network-tls.js +3126 -0
- package/lib/vendor/blamejs/lib/network.js +346 -0
- package/lib/vendor/blamejs/lib/nis2-report.js +181 -0
- package/lib/vendor/blamejs/lib/nist-crosswalk.js +293 -0
- package/lib/vendor/blamejs/lib/nonce-store.js +177 -0
- package/lib/vendor/blamejs/lib/notify.js +683 -0
- package/lib/vendor/blamejs/lib/ntp-check.js +458 -0
- package/lib/vendor/blamejs/lib/numeric-bounds.js +111 -0
- package/lib/vendor/blamejs/lib/numeric-checks.js +40 -0
- package/lib/vendor/blamejs/lib/object-store/azure-blob-bucket-ops.js +349 -0
- package/lib/vendor/blamejs/lib/object-store/azure-blob.js +488 -0
- package/lib/vendor/blamejs/lib/object-store/gcs-bucket-ops.js +351 -0
- package/lib/vendor/blamejs/lib/object-store/gcs.js +515 -0
- package/lib/vendor/blamejs/lib/object-store/http-put.js +153 -0
- package/lib/vendor/blamejs/lib/object-store/http-request.js +38 -0
- package/lib/vendor/blamejs/lib/object-store/index.js +197 -0
- package/lib/vendor/blamejs/lib/object-store/local.js +163 -0
- package/lib/vendor/blamejs/lib/object-store/sigv4-bucket-ops.js +1133 -0
- package/lib/vendor/blamejs/lib/object-store/sigv4.js +957 -0
- package/lib/vendor/blamejs/lib/observability-otlp-exporter.js +420 -0
- package/lib/vendor/blamejs/lib/observability-tracer.js +395 -0
- package/lib/vendor/blamejs/lib/observability.js +720 -0
- package/lib/vendor/blamejs/lib/openapi-paths-builder.js +248 -0
- package/lib/vendor/blamejs/lib/openapi-schema-walk.js +192 -0
- package/lib/vendor/blamejs/lib/openapi-security.js +169 -0
- package/lib/vendor/blamejs/lib/openapi-yaml.js +154 -0
- package/lib/vendor/blamejs/lib/openapi.js +489 -0
- package/lib/vendor/blamejs/lib/otel-export.js +278 -0
- package/lib/vendor/blamejs/lib/outbox.js +547 -0
- package/lib/vendor/blamejs/lib/pagination.js +542 -0
- package/lib/vendor/blamejs/lib/parsers/index.js +91 -0
- package/lib/vendor/blamejs/lib/parsers/safe-env.js +642 -0
- package/lib/vendor/blamejs/lib/parsers/safe-ini.js +293 -0
- package/lib/vendor/blamejs/lib/parsers/safe-toml.js +784 -0
- package/lib/vendor/blamejs/lib/parsers/safe-xml.js +390 -0
- package/lib/vendor/blamejs/lib/parsers/safe-yaml.js +1015 -0
- package/lib/vendor/blamejs/lib/permissions.js +793 -0
- package/lib/vendor/blamejs/lib/pick.js +105 -0
- package/lib/vendor/blamejs/lib/pqc-agent.js +351 -0
- package/lib/vendor/blamejs/lib/pqc-gate.js +279 -0
- package/lib/vendor/blamejs/lib/pqc-software.js +271 -0
- package/lib/vendor/blamejs/lib/problem-details.js +482 -0
- package/lib/vendor/blamejs/lib/process-spawn.js +196 -0
- package/lib/vendor/blamejs/lib/promise-pool.js +162 -0
- package/lib/vendor/blamejs/lib/protobuf-encoder.js +190 -0
- package/lib/vendor/blamejs/lib/protocol-dispatcher.js +161 -0
- package/lib/vendor/blamejs/lib/public-suffix.js +403 -0
- package/lib/vendor/blamejs/lib/pubsub-cluster.js +154 -0
- package/lib/vendor/blamejs/lib/pubsub-redis.js +167 -0
- package/lib/vendor/blamejs/lib/pubsub.js +463 -0
- package/lib/vendor/blamejs/lib/queue-local.js +476 -0
- package/lib/vendor/blamejs/lib/queue-redis.js +745 -0
- package/lib/vendor/blamejs/lib/queue-sqs.js +319 -0
- package/lib/vendor/blamejs/lib/queue.js +1016 -0
- package/lib/vendor/blamejs/lib/redact.js +1007 -0
- package/lib/vendor/blamejs/lib/redis-client.js +520 -0
- package/lib/vendor/blamejs/lib/render.js +285 -0
- package/lib/vendor/blamejs/lib/request-helpers.js +767 -0
- package/lib/vendor/blamejs/lib/resource-access-lock.js +116 -0
- package/lib/vendor/blamejs/lib/restore-bundle.js +340 -0
- package/lib/vendor/blamejs/lib/restore-rollback.js +365 -0
- package/lib/vendor/blamejs/lib/restore.js +409 -0
- package/lib/vendor/blamejs/lib/retention.js +640 -0
- package/lib/vendor/blamejs/lib/retry.js +523 -0
- package/lib/vendor/blamejs/lib/router.js +1289 -0
- package/lib/vendor/blamejs/lib/safe-async.js +1184 -0
- package/lib/vendor/blamejs/lib/safe-buffer.js +562 -0
- package/lib/vendor/blamejs/lib/safe-decompress.js +297 -0
- package/lib/vendor/blamejs/lib/safe-dns.js +665 -0
- package/lib/vendor/blamejs/lib/safe-ical.js +634 -0
- package/lib/vendor/blamejs/lib/safe-icap.js +502 -0
- package/lib/vendor/blamejs/lib/safe-json.js +946 -0
- package/lib/vendor/blamejs/lib/safe-jsonpath.js +285 -0
- package/lib/vendor/blamejs/lib/safe-mime.js +831 -0
- package/lib/vendor/blamejs/lib/safe-mount-info.js +306 -0
- package/lib/vendor/blamejs/lib/safe-path.js +254 -0
- package/lib/vendor/blamejs/lib/safe-redirect.js +106 -0
- package/lib/vendor/blamejs/lib/safe-schema.js +1810 -0
- package/lib/vendor/blamejs/lib/safe-sieve.js +684 -0
- package/lib/vendor/blamejs/lib/safe-smtp.js +185 -0
- package/lib/vendor/blamejs/lib/safe-sql.js +363 -0
- package/lib/vendor/blamejs/lib/safe-url.js +428 -0
- package/lib/vendor/blamejs/lib/safe-vcard.js +473 -0
- package/lib/vendor/blamejs/lib/sandbox-worker.js +135 -0
- package/lib/vendor/blamejs/lib/sandbox.js +358 -0
- package/lib/vendor/blamejs/lib/scheduler.js +827 -0
- package/lib/vendor/blamejs/lib/sd-notify.js +269 -0
- package/lib/vendor/blamejs/lib/sec-cyber.js +214 -0
- package/lib/vendor/blamejs/lib/security-assert.js +395 -0
- package/lib/vendor/blamejs/lib/seeders.js +620 -0
- package/lib/vendor/blamejs/lib/self-update-standalone-verifier.js +309 -0
- package/lib/vendor/blamejs/lib/self-update.js +804 -0
- package/lib/vendor/blamejs/lib/server-timing.js +174 -0
- package/lib/vendor/blamejs/lib/session-device-binding.js +431 -0
- package/lib/vendor/blamejs/lib/session-stores.js +138 -0
- package/lib/vendor/blamejs/lib/session.js +1162 -0
- package/lib/vendor/blamejs/lib/slug.js +381 -0
- package/lib/vendor/blamejs/lib/sse.js +349 -0
- package/lib/vendor/blamejs/lib/ssrf-guard.js +792 -0
- package/lib/vendor/blamejs/lib/standard-webhooks.js +183 -0
- package/lib/vendor/blamejs/lib/static.js +1249 -0
- package/lib/vendor/blamejs/lib/storage.js +1272 -0
- package/lib/vendor/blamejs/lib/stream-throttle.js +235 -0
- package/lib/vendor/blamejs/lib/structured-fields.js +244 -0
- package/lib/vendor/blamejs/lib/subject.js +667 -0
- package/lib/vendor/blamejs/lib/tcpa-10dlc.js +175 -0
- package/lib/vendor/blamejs/lib/template.js +931 -0
- package/lib/vendor/blamejs/lib/tenant-quota.js +545 -0
- package/lib/vendor/blamejs/lib/test-harness.js +275 -0
- package/lib/vendor/blamejs/lib/testing.js +1185 -0
- package/lib/vendor/blamejs/lib/time.js +578 -0
- package/lib/vendor/blamejs/lib/tls-exporter.js +239 -0
- package/lib/vendor/blamejs/lib/totp.js +318 -0
- package/lib/vendor/blamejs/lib/tracing.js +546 -0
- package/lib/vendor/blamejs/lib/uuid.js +207 -0
- package/lib/vendor/blamejs/lib/validate-opts.js +381 -0
- package/lib/vendor/blamejs/lib/vault/index.js +638 -0
- package/lib/vendor/blamejs/lib/vault/passphrase-ops.js +311 -0
- package/lib/vendor/blamejs/lib/vault/passphrase-source.js +198 -0
- package/lib/vendor/blamejs/lib/vault/rotate.js +803 -0
- package/lib/vendor/blamejs/lib/vault/seal-pem-file.js +471 -0
- package/lib/vendor/blamejs/lib/vault/wrap.js +296 -0
- package/lib/vendor/blamejs/lib/vault-aad.js +259 -0
- package/lib/vendor/blamejs/lib/vendor/.vendor-data-pubkey +4 -0
- package/lib/vendor/blamejs/lib/vendor/MANIFEST.json +161 -0
- package/lib/vendor/blamejs/lib/vendor/bimi-trust-anchors.data.js +68 -0
- package/lib/vendor/blamejs/lib/vendor/bimi-trust-anchors.pem +33 -0
- package/lib/vendor/blamejs/lib/vendor/common-passwords-top-10000.data.js +1325 -0
- package/lib/vendor/blamejs/lib/vendor/common-passwords-top-10000.txt +10002 -0
- package/lib/vendor/blamejs/lib/vendor/noble-ciphers.cjs +9 -0
- package/lib/vendor/blamejs/lib/vendor/noble-post-quantum.cjs +18 -0
- package/lib/vendor/blamejs/lib/vendor/pki.cjs +181 -0
- package/lib/vendor/blamejs/lib/vendor/public-suffix-list.dat +16382 -0
- package/lib/vendor/blamejs/lib/vendor/public-suffix-list.data.js +5881 -0
- package/lib/vendor/blamejs/lib/vendor/simplewebauthn-server.cjs +328 -0
- package/lib/vendor/blamejs/lib/vendor/vendor-data-pubkey.js +16 -0
- package/lib/vendor/blamejs/lib/vendor-data.js +520 -0
- package/lib/vendor/blamejs/lib/vex.js +630 -0
- package/lib/vendor/blamejs/lib/watcher.js +608 -0
- package/lib/vendor/blamejs/lib/web-push-vapid.js +322 -0
- package/lib/vendor/blamejs/lib/webhook.js +977 -0
- package/lib/vendor/blamejs/lib/websocket-channels.js +327 -0
- package/lib/vendor/blamejs/lib/websocket.js +1561 -0
- package/lib/vendor/blamejs/lib/wiki-concepts.js +338 -0
- package/lib/vendor/blamejs/lib/worker-pool.js +464 -0
- package/lib/vendor/blamejs/lib/ws-client.js +978 -0
- package/lib/vendor/blamejs/lib/xml-c14n.js +506 -0
- package/lib/vendor/blamejs/memory/specs/node-26-map-getorinsert-migration.md +164 -0
- package/lib/vendor/blamejs/oss-fuzz/projects/blamejs/Dockerfile +19 -0
- package/lib/vendor/blamejs/oss-fuzz/projects/blamejs/README.md +88 -0
- package/lib/vendor/blamejs/oss-fuzz/projects/blamejs/build.sh +26 -0
- package/lib/vendor/blamejs/oss-fuzz/projects/blamejs/project.yaml +28 -0
- package/lib/vendor/blamejs/package.json +81 -0
- package/lib/vendor/blamejs/release-notes/v0.0.x.json +310 -0
- package/lib/vendor/blamejs/release-notes/v0.1.x.json +1798 -0
- package/lib/vendor/blamejs/release-notes/v0.10.x.json +1288 -0
- package/lib/vendor/blamejs/release-notes/v0.11.x.json +2551 -0
- package/lib/vendor/blamejs/release-notes/v0.12.0.json +64 -0
- package/lib/vendor/blamejs/release-notes/v0.12.1.json +32 -0
- package/lib/vendor/blamejs/release-notes/v0.12.2.json +45 -0
- package/lib/vendor/blamejs/release-notes/v0.2.x.json +706 -0
- package/lib/vendor/blamejs/release-notes/v0.3.x.json +786 -0
- package/lib/vendor/blamejs/release-notes/v0.4.x.json +588 -0
- package/lib/vendor/blamejs/release-notes/v0.5.x.json +390 -0
- package/lib/vendor/blamejs/release-notes/v0.6.x.json +1947 -0
- package/lib/vendor/blamejs/release-notes/v0.7.x.json +3811 -0
- package/lib/vendor/blamejs/release-notes/v0.8.x.json +3318 -0
- package/lib/vendor/blamejs/release-notes/v0.9.x.json +2257 -0
- package/lib/vendor/blamejs/scripts/build-vendored-sbom.js +325 -0
- package/lib/vendor/blamejs/scripts/check-api-snapshot.js +62 -0
- package/lib/vendor/blamejs/scripts/check-changelog-extract.js +108 -0
- package/lib/vendor/blamejs/scripts/check-pack-against-gitignore.js +83 -0
- package/lib/vendor/blamejs/scripts/check-services.js +483 -0
- package/lib/vendor/blamejs/scripts/check-vendor-currency.js +349 -0
- package/lib/vendor/blamejs/scripts/consolidate-release-notes.js +216 -0
- package/lib/vendor/blamejs/scripts/gen-migrating.js +275 -0
- package/lib/vendor/blamejs/scripts/generate-changelog-entry.js +577 -0
- package/lib/vendor/blamejs/scripts/generate-release-signing-key.js +79 -0
- package/lib/vendor/blamejs/scripts/publish-dep-confusion-placeholder.sh +101 -0
- package/lib/vendor/blamejs/scripts/refresh-api-snapshot.js +31 -0
- package/lib/vendor/blamejs/scripts/refresh-vendor-manifest.js +132 -0
- package/lib/vendor/blamejs/scripts/release.js +652 -0
- package/lib/vendor/blamejs/scripts/sha3-digest.js +62 -0
- package/lib/vendor/blamejs/scripts/sign-release-artifact.js +92 -0
- package/lib/vendor/blamejs/scripts/test-integration.js +181 -0
- package/lib/vendor/blamejs/scripts/test-wiki-integration.js +126 -0
- package/lib/vendor/blamejs/scripts/validate-source-comment-blocks.js +77 -0
- package/lib/vendor/blamejs/scripts/vendor-data-gen.js +186 -0
- package/lib/vendor/blamejs/scripts/vendor-data-keygen.js +101 -0
- package/lib/vendor/blamejs/scripts/vendor-update.sh +278 -0
- package/lib/vendor/blamejs/test/00-primitives.js +19075 -0
- package/lib/vendor/blamejs/test/10-state.js +622 -0
- package/lib/vendor/blamejs/test/20-db.js +561 -0
- package/lib/vendor/blamejs/test/30-chain.js +2110 -0
- package/lib/vendor/blamejs/test/40-consumers.js +2453 -0
- package/lib/vendor/blamejs/test/50-integration.js +486 -0
- package/lib/vendor/blamejs/test/_helpers.js +10 -0
- package/lib/vendor/blamejs/test/_smoke-worker.js +69 -0
- package/lib/vendor/blamejs/test/fixtures/exploit-corpus/corpus.json +368 -0
- package/lib/vendor/blamejs/test/fixtures/http-client-stream-payload.txt +2 -0
- package/lib/vendor/blamejs/test/fixtures/worker-pool/echo.js +52 -0
- package/lib/vendor/blamejs/test/helpers/_codebase-shingle-worker.js +24 -0
- package/lib/vendor/blamejs/test/helpers/_codebase-shingle.js +203 -0
- package/lib/vendor/blamejs/test/helpers/_shape-match.js +513 -0
- package/lib/vendor/blamejs/test/helpers/check.js +36 -0
- package/lib/vendor/blamejs/test/helpers/cluster.js +70 -0
- package/lib/vendor/blamejs/test/helpers/db.js +143 -0
- package/lib/vendor/blamejs/test/helpers/drivers.js +207 -0
- package/lib/vendor/blamejs/test/helpers/fs-watch.js +101 -0
- package/lib/vendor/blamejs/test/helpers/http.js +14 -0
- package/lib/vendor/blamejs/test/helpers/index.js +93 -0
- package/lib/vendor/blamejs/test/helpers/json-round-trip.js +120 -0
- package/lib/vendor/blamejs/test/helpers/mocks.js +20 -0
- package/lib/vendor/blamejs/test/helpers/otel.js +13 -0
- package/lib/vendor/blamejs/test/helpers/services.js +380 -0
- package/lib/vendor/blamejs/test/helpers/wait.js +206 -0
- package/lib/vendor/blamejs/test/integration/cache.test.js +235 -0
- package/lib/vendor/blamejs/test/integration/cluster-provider-mysql.test.js +174 -0
- package/lib/vendor/blamejs/test/integration/federation-auth.test.js +611 -0
- package/lib/vendor/blamejs/test/integration/http-client.test.js +129 -0
- package/lib/vendor/blamejs/test/integration/log-stream.test.js +219 -0
- package/lib/vendor/blamejs/test/integration/mail-crypto-smime.test.js +181 -0
- package/lib/vendor/blamejs/test/integration/mail-dkim.test.js +152 -0
- package/lib/vendor/blamejs/test/integration/mail-smtp.test.js +161 -0
- package/lib/vendor/blamejs/test/integration/mtls-ca.test.js +289 -0
- package/lib/vendor/blamejs/test/integration/network-dns.test.js +123 -0
- package/lib/vendor/blamejs/test/integration/network-heartbeat.test.js +101 -0
- package/lib/vendor/blamejs/test/integration/ntp-check.test.js +89 -0
- package/lib/vendor/blamejs/test/integration/object-store-sigv4.test.js +403 -0
- package/lib/vendor/blamejs/test/integration/pqc-pkcs8-forward-compat.test.js +271 -0
- package/lib/vendor/blamejs/test/integration/pubsub.test.js +137 -0
- package/lib/vendor/blamejs/test/integration/queue-redis.test.js +352 -0
- package/lib/vendor/blamejs/test/integration/redis-client-tls.test.js +96 -0
- package/lib/vendor/blamejs/test/integration/ssrf-guard.test.js +98 -0
- package/lib/vendor/blamejs/test/integration/websocket-permessage-deflate.test.js +261 -0
- package/lib/vendor/blamejs/test/integration/ws-client-roundtrip.test.js +230 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/a2a-tasks.test.js +211 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/a2a.test.js +59 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/access-lock.test.js +136 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/acme.test.js +219 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/age-gate.test.js +69 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/agent-event-bus.test.js +266 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/agent-idempotency.test.js +262 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/agent-orchestrator.test.js +390 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/agent-posture-chain.test.js +174 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/agent-saga.test.js +279 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/agent-snapshot.test.js +322 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/agent-stream.test.js +227 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/agent-tenant.test.js +302 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/agent-trace.test.js +150 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/ai-adverse-decision.test.js +44 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/ai-content-detect.test.js +150 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/ai-input.test.js +50 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/ai-model-manifest.test.js +96 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/ai-pref.test.js +76 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/api-encrypt.test.js +1080 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/app-shutdown.test.js +311 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/archive-zip-stream.test.js +291 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/archive.test.js +140 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/arg-parser.test.js +267 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/asn1-der.test.js +108 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/asyncapi.test.js +929 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/atomic-file-conflict-path.test.js +80 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/audit-cve-defensive.test.js +176 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/audit-daily-review.test.js +132 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/audit-export-cadf.test.js +97 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/audit-framework-namespaces.test.js +141 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/audit-segregation.test.js +115 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/audit-sign-ml-dsa-65.test.js +163 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/audit-use-store.test.js +246 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/auth-bot-challenge-verifier.test.js +485 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/auth-bot-challenge.test.js +331 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/auth-jwt-defenses.test.js +352 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/auth-lockout.test.js +572 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/auth-password-audit.test.js +61 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/azure-blob-bucket-ops.test.js +258 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/backup-manifest-signature.test.js +105 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/backup-worker.test.js +34 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/bearer-auth.test.js +107 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/body-parser-chunked-malformed.test.js +131 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/body-parser-smuggling.test.js +118 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/boot-gates.test.js +85 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/breach-deadline.test.js +38 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/break-glass.test.js +861 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/budr.test.js +55 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/bundler-engine.test.js +209 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/cache-status.test.js +129 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/cache.test.js +871 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/calendar.test.js +891 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/canonical-json-jcs.test.js +43 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/cdn-cache-control.test.js +243 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/cert.test.js +550 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/clear-site-data.test.js +107 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/cli-api-key.test.js +147 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/cli-audit-verify-chain.test.js +104 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/cli-backup.test.js +135 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/cli-config-drift.test.js +67 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/cli-erase.test.js +75 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/cli-file-type.test.js +98 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/cli-helpers.test.js +145 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/cli-mtls.test.js +133 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/cli-password.test.js +97 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/cli-restore.test.js +160 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/cli-retention.test.js +84 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/cli-security.test.js +69 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/cli-vault.test.js +142 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/client-hints.test.js +133 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/cms-codec.test.js +237 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/codebase-patterns.test.js +9600 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/compliance-ai-act.test.js +575 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/compliance-cascade.test.js +89 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/compliance-eaa.test.js +36 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/compliance-sanctions.test.js +712 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/compliance.test.js +278 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/config-drift.test.js +97 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/config.test.js +424 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/content-credentials.test.js +94 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/cors.test.js +357 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/cra-report.test.js +31 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/credential-hash.test.js +226 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/crypto-base64url.test.js +86 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/crypto-envelope.test.js +85 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/crypto-hash-files-parallel.test.js +193 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/crypto-hash-stream.test.js +98 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/crypto-hpke-pq.test.js +132 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/crypto-hpke.test.js +155 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/crypto-mlkem768-x25519.test.js +129 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/crypto-namespace-hash.test.js +0 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/crypto-random-int.test.js +72 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/csp-builder.test.js +96 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/csp-nonce.test.js +401 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/csp-report.test.js +34 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/csv.test.js +180 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/daemon.test.js +210 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/daily-byte-quota.test.js +153 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/dark-patterns.test.js +66 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/data-act.test.js +74 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/db-collection-extensions.test.js +226 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/db-collection.test.js +136 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/db-init-extensions.test.js +165 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/db-query-cross-schema.test.js +150 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/db-query-extensions.test.js +191 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/db-role-for.test.js +228 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/db-vacuum.test.js +55 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/db-worm.test.js +89 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/ddl-change-control.test.js +184 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/declare-row-policy.test.js +203 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/declare-view.test.js +303 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/dns-dnssec-algorithm.test.js +163 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/dns-null-mx.test.js +39 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/dora.test.js +165 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/dr-runbook.test.js +59 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/dsr-state-rules.test.js +55 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/dsr.test.js +786 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/dual-control.test.js +105 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/early-hints.test.js +147 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/events.test.js +105 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/exploit-replay.test.js +243 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/external-db-hardening.test.js +181 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/external-db-migrate.test.js +190 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/external-db-routing.test.js +531 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/fal.test.js +118 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/fapi2.test.js +89 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/fda-21cfr11.test.js +156 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/fdx.test.js +79 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/fedcm-dbsc.test.js +216 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/federation-vc-suite.test.js +434 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/fido-mds3.test.js +432 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/file-type.test.js +81 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/flag.test.js +887 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/forensic-snapshot.test.js +51 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/fsm.test.js +375 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/gcs-bucket-ops.test.js +321 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/gdpr-ropa.test.js +41 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/graphql-federation.test.js +32 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/guard-agent-registry.test.js +87 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/guard-all.test.js +328 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/guard-archive.test.js +339 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/guard-csv.test.js +694 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/guard-dsn.test.js +296 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/guard-email.test.js +234 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/guard-envelope.test.js +192 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/guard-event-bus-payload.test.js +89 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/guard-event-bus-topic.test.js +71 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/guard-filename.test.js +386 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/guard-html-wcag.test.js +859 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/guard-html.test.js +357 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/guard-idempotency-key.test.js +92 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/guard-imap-command.test.js +0 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/guard-jmap.test.js +174 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/guard-json.test.js +317 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/guard-list-id.test.js +199 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/guard-list-unsubscribe.test.js +214 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/guard-mail-compose.test.js +111 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/guard-mail-move.test.js +110 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/guard-mail-query.test.js +112 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/guard-mail-reply.test.js +86 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/guard-mail-sieve.test.js +92 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/guard-managesieve-command.test.js +301 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/guard-markdown.test.js +265 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/guard-message-id.test.js +0 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/guard-pop3-command.test.js +161 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/guard-posture-chain.test.js +100 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/guard-saga-config.test.js +79 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/guard-smtp-command.test.js +269 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/guard-snapshot-envelope.test.js +89 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/guard-stream-args.test.js +78 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/guard-svg.test.js +288 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/guard-tenant-id.test.js +69 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/guard-trace-context.test.js +102 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/guard-xml.test.js +202 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/guard-yaml.test.js +203 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/hal.test.js +51 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/honeytoken.test.js +50 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/html-balance.test.js +37 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/http-client-cache.test.js +692 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/http-client-stream.test.js +280 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/http-message-signature.test.js +225 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/i18n-messageformat.test.js +203 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/i18n.test.js +991 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/iab-mspa.test.js +63 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/iab-tcf.test.js +73 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/idempotency-key.test.js +612 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/importmap-integrity.test.js +56 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/inbox.test.js +166 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/incident-report.test.js +29 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/jose-jwe-experimental.test.js +121 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/json-api.test.js +58 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/json-round-trip-helper.test.js +110 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/jwt-external.test.js +159 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/keychain.test.js +0 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/legal-hold.test.js +118 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/local-db-thin.test.js +150 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/log-stream-cloudwatch.test.js +489 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/log-stream-otlp-grpc.test.js +207 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/log-stream-otlp.test.js +283 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/lro.test.js +65 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/mail-agent.test.js +417 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/mail-arf.test.js +208 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/mail-auth.test.js +910 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/mail-bimi.test.js +502 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/mail-bounce.test.js +680 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/mail-canspam.test.js +128 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/mail-crypto-pgp-experimental.test.js +149 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/mail-crypto-pgp.test.js +323 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/mail-crypto-smime.test.js +297 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/mail-dav.test.js +514 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/mail-deploy-tlsrpt.test.js +369 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/mail-deploy.test.js +199 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/mail-dkim.test.js +627 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/mail-feedback-id.test.js +56 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/mail-greylist.test.js +217 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/mail-helo.test.js +283 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/mail-journal.test.js +217 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/mail-mdn.test.js +334 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/mail-rbl.test.js +271 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/mail-require-tls.test.js +128 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/mail-scan.test.js +215 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/mail-send-deliver.test.js +336 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/mail-server-imap.test.js +732 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/mail-server-jmap.test.js +840 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/mail-server-managesieve.test.js +130 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/mail-server-mx.test.js +285 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/mail-server-pop3.test.js +74 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/mail-server-rate-limit.test.js +112 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/mail-server-registry.test.js +229 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/mail-server-submission.test.js +394 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/mail-server-tls.test.js +147 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/mail-sieve.test.js +151 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/mail-spam-score.test.js +204 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/mail-srs.test.js +152 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/mail-store-fts.test.js +279 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/mail-store.test.js +323 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/mail-unsubscribe.test.js +165 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/mail.test.js +439 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/mcp-tool-registry.test.js +202 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/mcp.test.js +155 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/metrics-shadow-registry.test.js +112 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/metrics-snapshot.test.js +224 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/middleware-compose-pipeline.test.js +278 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/money.test.js +376 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/mtls-ca-paths.test.js +89 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/nel.test.js +200 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/network-allowlist.test.js +106 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/network-byte-quota.test.js +133 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/network-dns-resolver.test.js +372 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/network-dns.test.js +635 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/network-heartbeat-passive.test.js +128 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/network-tls-build-options.test.js +130 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/network-tls-ct-inclusion.test.js +179 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/network-tls.test.js +447 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/network.test.js +369 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/nis2-report.test.js +21 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/nist-crosswalk.test.js +42 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/no-cache.test.js +98 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/notify.test.js +707 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/numeric-bounds.test.js +142 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/oauth-callback.test.js +72 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/observability-tracing.test.js +597 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/observability.test.js +190 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/openapi.test.js +877 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/otel-export.test.js +257 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/pagination.test.js +522 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/parsers-standalone.test.js +216 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/passkey.test.js +324 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/permissions.test.js +546 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/pqc-agent-curve.test.js +153 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/pqc-software.test.js +94 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/problem-details.test.js +195 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/process-spawn.test.js +62 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/promise-pool.test.js +93 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/protected-resource-metadata.test.js +68 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/protobuf-encoder.test.js +138 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/protocol-dispatcher.test.js +174 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/public-suffix.test.js +197 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/pubsub.test.js +232 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/queue-dlq-extend-lease.test.js +178 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/queue-flow-repeat.test.js +322 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/queue-priority-rate-progress.test.js +266 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/queue-sqs.test.js +300 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/rate-limit-cluster.test.js +338 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/rate-limit-registry.test.js +75 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/redact-dlp.test.js +246 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/redis-client.test.js +130 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/request-helpers.test.js +335 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/request-log.test.js +170 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/require-auth-cache-control.test.js +93 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/require-mtls.test.js +34 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/resource-access-lock.test.js +52 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/retention-floor.test.js +67 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/retry.test.js +535 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/router-cross-origin-redirect.test.js +0 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/router-tls0rtt.test.js +128 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/safe-async-loops.test.js +163 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/safe-async-parallel.test.js +170 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/safe-decompress.test.js +248 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/safe-dns.test.js +451 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/safe-ical.test.js +289 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/safe-icap.test.js +206 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/safe-jsonpath.test.js +104 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/safe-mime.test.js +339 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/safe-mount-info.test.js +180 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/safe-path.test.js +78 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/safe-sieve.test.js +123 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/safe-smtp.test.js +95 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/safe-url-idn-homograph.test.js +77 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/safe-vcard.test.js +257 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/saml-slo.test.js +249 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/sandbox.test.js +228 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/scheduler-exactly-once.test.js +238 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/scim-server.test.js +92 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/sd-jwt-vc.test.js +700 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/sd-notify.test.js +67 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/sec-cyber.test.js +85 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/security-assert.test.js +107 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/security-headers.test.js +175 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/seeders.test.js +816 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/self-update-standalone-verifier.test.js +168 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/self-update.test.js +302 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/server-timing.test.js +93 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/session-device-binding.test.js +247 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/session-extensions.test.js +295 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/shape-match.test.js +142 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/sigv4-bucket-ops.test.js +952 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/sigv4-multipart-sse.test.js +441 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/slug.test.js +330 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/smtp-policy.test.js +233 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/source-comment-blocks.test.js +105 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/speculation-rules.test.js +319 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/sse.test.js +148 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/ssrf-guard.test.js +283 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/standard-webhooks.test.js +67 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/static.test.js +266 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/step-up.test.js +487 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/storage-chunk-scratch.test.js +0 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/storage-presigned-url.test.js +773 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/stream-throttle.test.js +173 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/structured-fields.test.js +180 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/tcpa-10dlc.test.js +66 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/tenant-quota.test.js +89 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/test-coverage.test.js +571 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/test-harness.test.js +190 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/testing-request.test.js +119 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/testing.test.js +522 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/time.test.js +151 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/tls-exporter.test.js +168 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/tls-ocsp-ct.test.js +275 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/tls-ocsp-verify.test.js +105 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/tls-pinset-drift.test.js +35 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/tls-preferred-groups.test.js +81 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/tracing.test.js +280 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/uuid.test.js +93 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/vault-aad.test.js +277 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/vault-seal-pem-file.test.js +252 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/vendor-data.test.js +149 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/vendor-manifest.test.js +92 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/vex.test.js +661 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/watcher.test.js +308 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/web-push-vapid.test.js +144 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/webhook.test.js +674 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/websocket-channels.test.js +360 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/worker-pool.test.js +302 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/ws-client.test.js +349 -0
- package/lib/vendor/blamejs/test/layer-1-state/api-key.test.js +717 -0
- package/lib/vendor/blamejs/test/layer-5-integration/bundler-output.test.js +444 -0
- package/lib/vendor/blamejs/test/layer-5-integration/guard-host-integration.test.js +597 -0
- package/lib/vendor/blamejs/test/layer-5-integration/security-chaos.test.js +308 -0
- package/lib/vendor/blamejs/test/smoke.js +431 -0
- package/lib/webhooks.js +305 -0
- package/package.json +43 -0
|
@@ -0,0 +1,1288 @@
|
|
|
1
|
+
{
|
|
2
|
+
"$schema": "../scripts/release-notes-consolidated-schema.json",
|
|
3
|
+
"minor": "0.10",
|
|
4
|
+
"releases": [
|
|
5
|
+
{
|
|
6
|
+
"version": "0.10.15",
|
|
7
|
+
"date": "2026-05-18",
|
|
8
|
+
"headline": "TLS-RPT receiver — RFC 8460 aggregate-report ingest",
|
|
9
|
+
"summary": "New primitive surface under `b.mail.deploy` that closes the receive-side of TLS-RPT (the publish-side shipped earlier in v0.7.29 + v0.9.56). HTTPS POST handler factory, pure parser + schema validator, and a schema descriptor for operator dashboards, with bomb-class defenses (CVE-2025-0725) and SSRF refusals baked in.",
|
|
10
|
+
"sections": [
|
|
11
|
+
{
|
|
12
|
+
"heading": "Added",
|
|
13
|
+
"items": [
|
|
14
|
+
{
|
|
15
|
+
"title": "`b.mail.deploy.parseTlsRptReport(bytes, opts?)`",
|
|
16
|
+
"body": "Pure parser + RFC 8460 §4.4 schema validator. Accepts `application/tlsrpt+json` (raw) and `application/tlsrpt+gzip` (auto-detected via the RFC 1952 gzip magic bytes `0x1f 0x8b` or routed when `opts.contentType` names a gzip media-type). Caps compressed payload at 4 MiB (RFC 8460 §5.2 community ceiling), decompressed at 32 MiB (operator-overridable), and refuses decompression amplification > 50:1 — defends CVE-2025-0725 (libcurl + zlib decompression amplification) and the broader zlib bomb class. Routes through `b.guardJson.parse` for proto-pollution / depth / key-count defenses before walking the §4.4 schema. Refuses on missing required fields (`organization-name` / `contact-info` / `report-id` / `date-range.{start,end}-datetime` / `policies`) and enforces the §4.4 erratum that `policies` MUST be a non-empty array even for single-policy reports. Returns the normalized report shape plus `sessionTotals: { success, failure }` and a `wasCompressed` flag."
|
|
17
|
+
},
|
|
18
|
+
{
|
|
19
|
+
"title": "`b.mail.deploy.tlsRptIngestHttp({...})`",
|
|
20
|
+
"body": "Factory returning an `(req, res)` HTTPS POST handler mounted at the operator's `rua=https://<host>/<path>` endpoint per RFC 8460 §5.4. Negotiates the two IANA-registered media types (RFC 8460 §6.4-6.5), returns 405 on non-POST, 415 on bad media-type (with `Accept:` header), 413 on size / bomb / ratio refusal, 400 on parse failure (with `Error-Type:` header naming the typed error code), 201 on accept. Optional `trustedReporters` array refuses non-trusted reporting domains (RFC 8460 §5.3-class defense extended to the HTTPS path). Body collection routes through `b.safeBuffer.boundedChunkCollector` — cap enforced at every `push()`, not after — so a hostile reporter sending a 10-GB body rejects on the chunk that overflows. Emits the `mail.tlsrpt.ingest_http` audit event with `policyDomains` set + session totals on every accept / refuse."
|
|
21
|
+
},
|
|
22
|
+
{
|
|
23
|
+
"title": "`b.mail.deploy.tlsRptReportSchema()`",
|
|
24
|
+
"body": "Schema descriptor (required fields, policy types, result types) for operator dashboards. Pure function."
|
|
25
|
+
}
|
|
26
|
+
]
|
|
27
|
+
},
|
|
28
|
+
{
|
|
29
|
+
"heading": "Detectors",
|
|
30
|
+
"items": [
|
|
31
|
+
{
|
|
32
|
+
"title": "`gunzip-without-output-size-cap` (lib-side)",
|
|
33
|
+
"body": "Every `zlib.gunzipSync` / `zlib.createGunzip` / `zlib.brotliDecompressSync` MUST sit in a file that also names `maxOutputLength` (Node-native cap) per the CVE-2025-0725 defense class. Companion-check `requires` field added to the lib-side runner."
|
|
34
|
+
}
|
|
35
|
+
]
|
|
36
|
+
},
|
|
37
|
+
{
|
|
38
|
+
"heading": "Migration",
|
|
39
|
+
"items": [
|
|
40
|
+
{
|
|
41
|
+
"title": "Operator impact — HTTPS-only ingest in v1; deferred-with-condition for mailto: + brotli",
|
|
42
|
+
"body": "mailto: ingest is not implemented in v1 (no operator demand surfaced — HTTPS POST is the de-facto deployment shape for TLS-RPT; operators wanting mailto: today compose `b.mail.server.mx` + `parseTlsRptReport`). Brotli decompression is similarly deferred (no fielded reporter uses `Content-Encoding: br` for TLS-RPT; the RFC 8460 §6.4-6.5 IANA registry only names `+json` and `+gzip`). Each reopens with a documented condition."
|
|
43
|
+
}
|
|
44
|
+
]
|
|
45
|
+
}
|
|
46
|
+
],
|
|
47
|
+
"references": [
|
|
48
|
+
{
|
|
49
|
+
"label": "RFC 8460 SMTP TLS Reporting",
|
|
50
|
+
"url": "https://www.rfc-editor.org/rfc/rfc8460.html"
|
|
51
|
+
},
|
|
52
|
+
{
|
|
53
|
+
"label": "RFC 8461 MTA-STS",
|
|
54
|
+
"url": "https://www.rfc-editor.org/rfc/rfc8461.html"
|
|
55
|
+
},
|
|
56
|
+
{
|
|
57
|
+
"label": "RFC 1952 gzip",
|
|
58
|
+
"url": "https://www.rfc-editor.org/rfc/rfc1952.html"
|
|
59
|
+
},
|
|
60
|
+
{
|
|
61
|
+
"label": "CVE-2025-0725",
|
|
62
|
+
"url": "https://nvd.nist.gov/vuln/detail/CVE-2025-0725"
|
|
63
|
+
}
|
|
64
|
+
]
|
|
65
|
+
},
|
|
66
|
+
{
|
|
67
|
+
"version": "0.10.14",
|
|
68
|
+
"date": "2026-05-18",
|
|
69
|
+
"headline": "Codebase-patterns hardening — test-side catalog gains basename matching + new detectors; lib-side gains comment-skip",
|
|
70
|
+
"summary": "Closes the same class of bug that caused the v0.10.13 macOS hang (test-discipline-without-enforcement). The test-side antipattern runner now supports `matchOn: \"basename\"` mode and `requires` companion-content checks; three new test-side detectors land, one rule migrates from the lib-side catalog, and the lib-side runner gains a `skipCommentLines` per-entry opt and a real `audit.emit` drop-silent fix in `lib/subject.js`.",
|
|
71
|
+
"sections": [
|
|
72
|
+
{
|
|
73
|
+
"heading": "Added",
|
|
74
|
+
"items": [
|
|
75
|
+
{
|
|
76
|
+
"title": "`test-codebase-patterns.test.js` — test-side antipattern runner",
|
|
77
|
+
"body": "Now supports `matchOn: \"basename\"` mode and `requires` companion-content checks. The lib-side runner gains a `skipCommentLines` per-entry opt so docstring `@example` lines don't trip detectors that match comment-friendly tokens."
|
|
78
|
+
}
|
|
79
|
+
]
|
|
80
|
+
},
|
|
81
|
+
{
|
|
82
|
+
"heading": "Detectors",
|
|
83
|
+
"items": [
|
|
84
|
+
{
|
|
85
|
+
"title": "Migration — `testNoReleaseNamedTestFiles` moves to test-side catalog",
|
|
86
|
+
"body": "The rule scans test-file basenames, not lib-source content, so it migrates from the lib-side catalog to the test-side catalog where it belongs."
|
|
87
|
+
},
|
|
88
|
+
{
|
|
89
|
+
"title": "`Promise + setTimeout` direct sleep in tests refused",
|
|
90
|
+
"body": "Tests calling `await new Promise(r => setTimeout(r, N))` for synchronization MUST use `helpers.waitUntil` — the framework's polling-predicate primitive replaces fixed-budget sleeps that race under runner contention. 49 pre-existing files are allowlisted as a documented migration backlog; the gate prevents new occurrences."
|
|
91
|
+
},
|
|
92
|
+
{
|
|
93
|
+
"title": "Hardcoded server bind ports refused",
|
|
94
|
+
"body": "Tests calling `.listen(N)` with a literal non-zero port MUST use `.listen(0)` + `server.address().port` to avoid `SMOKE_PARALLEL=64` bind races. Detector scoped to the bind path (`.listen(...)`); read-only protocol-constant references (`port: 993` / `port: 587` in autoconfig XML) don't trip."
|
|
95
|
+
},
|
|
96
|
+
{
|
|
97
|
+
"title": "Tests creating `b.db` handles without an isolation primitive refused",
|
|
98
|
+
"body": "Any test calling `b.db.create(` MUST also wire one of `helpers.setupTestDb` / `helpers.setupVaultOnly` / `node:fs.mkdtempSync`. Leaked per-test SQLite state corrupts subsequent tests under `SMOKE_PARALLEL=64`."
|
|
99
|
+
},
|
|
100
|
+
{
|
|
101
|
+
"title": "Raw `audit.emit(...)` outside drop-silent wrap refused (lib)",
|
|
102
|
+
"body": "Hot-path audit sinks must be drop-silent: a misconfigured sink that throws would crash the request the audit was recording. Detector found and fixed an existing violation in `lib/subject.js:_writeAudit` whose comment promised swallowing but actually let the throw escape."
|
|
103
|
+
}
|
|
104
|
+
]
|
|
105
|
+
},
|
|
106
|
+
{
|
|
107
|
+
"heading": "Migration",
|
|
108
|
+
"items": [
|
|
109
|
+
{
|
|
110
|
+
"title": "Operator impact — no runtime change; one deferred semantic detector",
|
|
111
|
+
"body": "`Date.now()` vs `process.hrtime()` for elapsed-time math needs semantic distinction (elapsed-math vs row-age); regex alone is too noisy. The v0.10.13 stream-throttle elapsed-clamp shipped the highest-value fix already; remaining call sites get per-file review in a later patch."
|
|
112
|
+
}
|
|
113
|
+
]
|
|
114
|
+
}
|
|
115
|
+
]
|
|
116
|
+
},
|
|
117
|
+
{
|
|
118
|
+
"version": "0.10.13",
|
|
119
|
+
"date": "2026-05-18",
|
|
120
|
+
"headline": "`b.cms` codec + `b.streamThrottle` + histogram-aware snapshot + Windows-safe daemonize",
|
|
121
|
+
"summary": "New `b.cms` PQC-first CMS encoder + decoder (RFC 5652 / 9629 / 9909 / 9881 / 9936 / 8103) built on the existing `b.asn1Der` walker. New `b.streamThrottle` token-bucket bandwidth limiter shared across pipelines. Histogram-aware `b.metrics.snapshot.startWriter`. Windows-safe `b.daemon.start` detached-fork path. Closes issues #94 / #100 / #101 (and #92 / #93 already shipped in v0.10.9).",
|
|
122
|
+
"sections": [
|
|
123
|
+
{
|
|
124
|
+
"heading": "Added",
|
|
125
|
+
"items": [
|
|
126
|
+
{
|
|
127
|
+
"title": "`b.cms.encodeSignedData({ encapContent, digestAlg, signers })`",
|
|
128
|
+
"body": "Emits a DER-encoded `ContentInfo` carrying `SignedData` per RFC 5652 §5 with PQC signers: ML-DSA-65 + ML-DSA-87 (RFC 9909) and SLH-DSA-SHAKE-256f (RFC 9881). Digest algorithms are SHA3-256 or SHA3-512 (PQC-first; SHA-2 family refused with `cms/bad-digest`). Signed-attributes carry `contentType` + `messageDigest` + `signingTime` in DER-canonical SET-OF ordering; the signature input re-tags the IMPLICIT `[0]` to the universal SET (`0x31`) per §5.4 paragraph 3 so signatures round-trip with any conforming verifier. Signer identifiers carry the full `issuerAndSerialNumber` extracted from the operator-supplied cert DER (RFC 5652 §10.2.4)."
|
|
129
|
+
},
|
|
130
|
+
{
|
|
131
|
+
"title": "`b.cms.encodeEnvelopedData({ plaintext, recipients })`",
|
|
132
|
+
"body": "Emits a DER-encoded `ContentInfo` carrying `EnvelopedData` with `KEMRecipientInfo` recipients per RFC 9629 and ML-KEM-1024 per RFC 9936. Each recipient encapsulates against the operator-supplied ML-KEM-1024 public key; the framework's SHAKE256 KDF derives a 32-byte content-encryption KEK from the KEM shared-secret bound to the literal label `cms/kemri/chacha20-poly1305` (so a key derived for this composition cannot be confused with one derived for any other framework path). Content encryption is ChaCha20-Poly1305 (RFC 8103 OID); the AEAD tag makes Efail-class CBC-malleability impossible by construction (CVE-2017-17688 / CVE-2017-17689)."
|
|
133
|
+
},
|
|
134
|
+
{
|
|
135
|
+
"title": "`b.cms.decode(buf, { maxBytes? })`",
|
|
136
|
+
"body": "Returns `{ contentType, content }` where `contentType` is the dotted-OID string and `content` is the inner `asn1-der` node. Refuses input past `maxBytes` (default 64 MiB), non-SEQUENCE top-level, missing `[0] EXPLICIT` content, and malformed OID encodings (closes the CVE-2022-47629 libksba class via the existing `b.asn1Der` strict-decode posture). Refusal posture documented in `lib/cms-codec.js`: only PQC signature algorithms (`cms/bad-sig-alg`), only ML-KEM-1024 recipients (`cms/bad-recipient-type`), non-empty signers / recipients required at encode (`cms/no-signers` / `cms/no-recipients`)."
|
|
137
|
+
},
|
|
138
|
+
{
|
|
139
|
+
"title": "`b.streamThrottle.create({ bytesPerSec, burstBytes? })` token-bucket bandwidth limiter",
|
|
140
|
+
"body": "Returns a shared token bucket whose `.transform()` instances each consume from the same budget. The missing primitive between per-request rate-limit and per-process worker pools: N parallel transfers share the operator-configured byte budget rather than each getting their own. Composes with `node:stream.pipeline` as a regular `stream.Transform`; chunks larger than `burstBytes` refuse with `stream-throttle/oversize-chunk` unless `transform({ allowOversize: true })`. Algorithm is the RFC 2697 srTCM single-rate token-bucket shape, with lazy refill so there is no per-throttle background timer."
|
|
141
|
+
},
|
|
142
|
+
{
|
|
143
|
+
"title": "Histogram-aware metrics snapshot writer",
|
|
144
|
+
"body": "`b.metrics.snapshot.startWriter` gains an opt-in `registry` field. When supplied, the JSON snapshot grows a `metrics` field carrying every registered counter / gauge / histogram in structured form — histograms include `buckets` + `observations: [{ labels, counts, sum, count }]`, so sidecar readers compose `histogram_quantile()` against the snapshot file without running a separate `/metrics` HTTP endpoint. `fileMode` default unchanged (0o640)."
|
|
145
|
+
},
|
|
146
|
+
{
|
|
147
|
+
"title": "Windows-safe daemonize",
|
|
148
|
+
"body": "`b.daemon.start` detached-fork mode now branches by platform. POSIX continues inheriting the parent-opened log FD via `stdio: [\"ignore\", logFd, logFd]` (unchanged). Windows now uses `stdio: \"ignore\"` + `windowsHide: true` so the child has no inherited handles that the OS invalidates on parent exit — the previously-broken Windows daemonize path now produces a survivable detached process. The child is responsible for opening its own log file (operators pass `--log` in `opts.args`). `daemon.started` audit gains `stdioMode` so operators can grep for the chosen strategy."
|
|
149
|
+
}
|
|
150
|
+
]
|
|
151
|
+
},
|
|
152
|
+
{
|
|
153
|
+
"heading": "Migration",
|
|
154
|
+
"items": [
|
|
155
|
+
{
|
|
156
|
+
"title": "Operator impact — no breaking changes; mail-crypto wire layers in a follow-up",
|
|
157
|
+
"body": "No breaking changes; new primitive at `b.cms`. The on-the-wire S/MIME 4.0 layer (RFC 8551 `multipart/signed` framing, base64 DER body, `micalg` mapping) and OpenPGP encrypt + decrypt + WKD discovery (RFC 9580 §5.1 / §5.13 packets plus draft-koch-openpgp-webkey-service) land together in a follow-up patch so the mail-crypto surface lights up coherently. AuthEnvelopedData (RFC 5083) as a distinct `ContentInfo` shape is deferred — EnvelopedData with ChaCha20-Poly1305 is already AEAD by construction; the §5083 OID rewrap lights up alongside S/MIME for peers that refuse the EnvelopedData form. Closes issues #94, #100, #101; also closes #92 and #93 (already shipped in v0.10.9 as `b.promisePool` / `b.sdNotify` — left open until now)."
|
|
158
|
+
}
|
|
159
|
+
]
|
|
160
|
+
}
|
|
161
|
+
],
|
|
162
|
+
"references": [
|
|
163
|
+
{
|
|
164
|
+
"label": "RFC 5652 CMS",
|
|
165
|
+
"url": "https://www.rfc-editor.org/rfc/rfc5652.html"
|
|
166
|
+
},
|
|
167
|
+
{
|
|
168
|
+
"label": "RFC 9629 KEMRecipientInfo",
|
|
169
|
+
"url": "https://www.rfc-editor.org/rfc/rfc9629.html"
|
|
170
|
+
},
|
|
171
|
+
{
|
|
172
|
+
"label": "RFC 9909 ML-DSA in X.509+CMS",
|
|
173
|
+
"url": "https://www.rfc-editor.org/rfc/rfc9909.html"
|
|
174
|
+
},
|
|
175
|
+
{
|
|
176
|
+
"label": "RFC 9881 SLH-DSA in X.509+CMS",
|
|
177
|
+
"url": "https://www.rfc-editor.org/rfc/rfc9881.html"
|
|
178
|
+
},
|
|
179
|
+
{
|
|
180
|
+
"label": "RFC 9936 ML-KEM in CMS",
|
|
181
|
+
"url": "https://www.rfc-editor.org/rfc/rfc9936.html"
|
|
182
|
+
},
|
|
183
|
+
{
|
|
184
|
+
"label": "RFC 8103 ChaCha20-Poly1305 in CMS",
|
|
185
|
+
"url": "https://www.rfc-editor.org/rfc/rfc8103.html"
|
|
186
|
+
},
|
|
187
|
+
{
|
|
188
|
+
"label": "RFC 2697 srTCM",
|
|
189
|
+
"url": "https://www.rfc-editor.org/rfc/rfc2697.html"
|
|
190
|
+
},
|
|
191
|
+
{
|
|
192
|
+
"label": "CVE-2017-17688 Efail",
|
|
193
|
+
"url": "https://nvd.nist.gov/vuln/detail/CVE-2017-17688"
|
|
194
|
+
},
|
|
195
|
+
{
|
|
196
|
+
"label": "CVE-2017-17689 Efail",
|
|
197
|
+
"url": "https://nvd.nist.gov/vuln/detail/CVE-2017-17689"
|
|
198
|
+
},
|
|
199
|
+
{
|
|
200
|
+
"label": "CVE-2022-47629 libksba",
|
|
201
|
+
"url": "https://nvd.nist.gov/vuln/detail/CVE-2022-47629"
|
|
202
|
+
}
|
|
203
|
+
]
|
|
204
|
+
},
|
|
205
|
+
{
|
|
206
|
+
"version": "0.10.12",
|
|
207
|
+
"date": "2026-05-18",
|
|
208
|
+
"headline": "`b.agent.tenant` adoption across the mail-server listeners",
|
|
209
|
+
"summary": "The shared `b.mail.serverRegistry` primitive gains optional `opts.tenantScope` (a `b.agent.tenant.create()` instance) + `opts.agentTenantId` (the tenant this listener serves). When supplied, every method dispatch gates on `tenantScope.check(state.actor, agentTenantId)` BEFORE guard validation or audit emission; cross-tenant access surfaces as the typed `agent-tenant/cross-tenant-access-refused` which the listener's catch-path converts to the protocol's `BAD` / `NO` refusal reply.",
|
|
210
|
+
"sections": [
|
|
211
|
+
{
|
|
212
|
+
"heading": "Added",
|
|
213
|
+
"items": [
|
|
214
|
+
{
|
|
215
|
+
"title": "`b.mail.server.imap.create({ tenantScope, agentTenantId })`",
|
|
216
|
+
"body": "IMAP dispatch is gated for every command after AUTH; cross-tenant access surfaces through the listener's typed refusal path."
|
|
217
|
+
},
|
|
218
|
+
{
|
|
219
|
+
"title": "`b.mail.server.jmap.create({ tenantScope, agentTenantId })`",
|
|
220
|
+
"body": "JMAP per-method dispatch routes through the tenant scope alongside its existing per-`accountId` isolation."
|
|
221
|
+
},
|
|
222
|
+
{
|
|
223
|
+
"title": "`b.mail.server.managesieve.create({ tenantScope, agentTenantId })`",
|
|
224
|
+
"body": "ManageSieve same pattern — every method dispatch gates on the tenant scope before guard validation."
|
|
225
|
+
},
|
|
226
|
+
{
|
|
227
|
+
"title": "`b.mail.server.submission.create({ tenantScope, agentTenantId })`",
|
|
228
|
+
"body": "Submission listener gates at the AUTH-success boundary (before `state.actor` is committed) so cross-tenant authentication surfaces as `535 5.7.0 Authentication rejected (cross-tenant)` and the SMTP envelope never begins under the wrong tenant."
|
|
229
|
+
},
|
|
230
|
+
{
|
|
231
|
+
"title": "`b.mail.server.pop3.create({ tenantScope, agentTenantId })`",
|
|
232
|
+
"body": "Same AUTH-success gate; cross-tenant refusal returns `-ERR Authentication rejected (cross-tenant)`. New audit events: `mail.server.submission.cross_tenant_refused` and `mail.server.pop3.cross_tenant_refused`."
|
|
233
|
+
}
|
|
234
|
+
]
|
|
235
|
+
},
|
|
236
|
+
{
|
|
237
|
+
"heading": "Migration",
|
|
238
|
+
"items": [
|
|
239
|
+
{
|
|
240
|
+
"title": "Operator impact — opt-in tenancy, no behavior change without `tenantScope`",
|
|
241
|
+
"body": "No breaking changes — `tenantScope` / `agentTenantId` are optional; operators not running multi-tenant see identical behavior. Operators with multi-tenant deployments wire `b.agent.tenant.create({...})` once and pass the same scope to every per-tenant listener instance — cross-tenant isolation becomes structural rather than per-handler opt-in. Per-tenant `b.mailStore` seal-key derivation via `tenantScope.derivedKey(tenantId, \"seal\")` and per-tenant audit namespaces via `tenantScope.auditFor(tenantId)` ship in a follow-up patch. Today every mail listener seals through the framework primary vault key — adequate for single-tenant and multi-tenant-trusted deployments; the follow-up adds per-tenant key separation for compromise-isolation use cases."
|
|
242
|
+
}
|
|
243
|
+
]
|
|
244
|
+
}
|
|
245
|
+
],
|
|
246
|
+
"references": [
|
|
247
|
+
{
|
|
248
|
+
"label": "RFC 9051 IMAP4rev2 §3 state machine",
|
|
249
|
+
"url": "https://www.rfc-editor.org/rfc/rfc9051#section-3"
|
|
250
|
+
},
|
|
251
|
+
{
|
|
252
|
+
"label": "RFC 8620 JMAP Core §1.6.2 accountId",
|
|
253
|
+
"url": "https://www.rfc-editor.org/rfc/rfc8620#section-1.6.2"
|
|
254
|
+
},
|
|
255
|
+
{
|
|
256
|
+
"label": "RFC 6409 Submission §6.1 actor-to-MAIL-FROM identity binding",
|
|
257
|
+
"url": "https://www.rfc-editor.org/rfc/rfc6409#section-6.1"
|
|
258
|
+
},
|
|
259
|
+
{
|
|
260
|
+
"label": "RFC 1939 POP3 §6 transaction state",
|
|
261
|
+
"url": "https://www.rfc-editor.org/rfc/rfc1939#section-6"
|
|
262
|
+
}
|
|
263
|
+
]
|
|
264
|
+
},
|
|
265
|
+
{
|
|
266
|
+
"version": "0.10.11",
|
|
267
|
+
"date": "2026-05-18",
|
|
268
|
+
"headline": "Mail-server per-method registration — shared `b.mail.serverRegistry`",
|
|
269
|
+
"summary": "New shared primitive `b.mail.serverRegistry` (`lib/mail-server-registry.js`) replaces the hand-rolled `switch (verb)` dispatchers in the IMAP, JMAP, and ManageSieve listener factories. Operators can override individual command / method handlers via `opts.overrides` with required per-handler resource budgets without re-implementing wire-protocol state machines or bypassing the guard substrate.",
|
|
270
|
+
"sections": [
|
|
271
|
+
{
|
|
272
|
+
"heading": "Added",
|
|
273
|
+
"items": [
|
|
274
|
+
{
|
|
275
|
+
"title": "Per-handler resource budgets — required at registration",
|
|
276
|
+
"body": "Operators MUST supply `maxHandlerBytes` (≤ 256 MiB) and `maxHandlerMs` (≤ 5 min) on every override; the registration throws `mail-server-registry/bad-max-handler-bytes` / `bad-max-handler-ms` on missing or out-of-range budgets. Defends CVE-2024-34055 (Cyrus authenticated OOM) and CVE-2026-26312 (Stalwart malformed nested `message/rfc822` cyclical OOM) by forcing operators to declare the resource ceiling explicitly."
|
|
277
|
+
},
|
|
278
|
+
{
|
|
279
|
+
"title": "Catalogue gate",
|
|
280
|
+
"body": "Per-protocol method names outside the IANA / RFC catalogue refuse registration unless `allowExperimental: true` is supplied — opting in audits the registration so operators can grep for off-spec handlers."
|
|
281
|
+
},
|
|
282
|
+
{
|
|
283
|
+
"title": "Guard chain preserved",
|
|
284
|
+
"body": "The listener factories run `b.guardImapCommand` / `b.guardJmap` / `b.guardManagesieveCommand` BEFORE the registry lookup; operator overrides cannot bypass the wire-protocol validation, smuggling defenses, or rate-limit budgets."
|
|
285
|
+
},
|
|
286
|
+
{
|
|
287
|
+
"title": "Handler timeout",
|
|
288
|
+
"body": "Promise-returning handlers wrap through `b.safeAsync.withTimeout(maxHandlerMs)`; a runaway override raises `mail-server-registry/handler-timeout` rather than pinning the connection."
|
|
289
|
+
},
|
|
290
|
+
{
|
|
291
|
+
"title": "Defaults seeded for IMAP / ManageSieve / JMAP",
|
|
292
|
+
"body": "IMAP picks up 30 verbs (CAPABILITY, NOOP, LOGOUT, ID, STARTTLS, AUTHENTICATE, LOGIN, ENABLE, SELECT, EXAMINE, LIST, STATUS, NAMESPACE, APPEND, CHECK, CLOSE, UNSELECT, EXPUNGE, FETCH, STORE, UID, IDLE, DONE — plus the previously-undispatched SEARCH / CREATE / DELETE / RENAME / SUBSCRIBE / UNSUBSCRIBE / COPY / MOVE which default to `NO not-configured` until operator overrides); ManageSieve picks up 12 verbs (CAPABILITY, NOOP, STARTTLS, LOGOUT, AUTHENTICATE, HAVESPACE, PUTSCRIPT, LISTSCRIPTS, SETACTIVE, GETSCRIPT, DELETESCRIPT, RENAMESCRIPT); JMAP wraps the existing `opts.methods` map with a one-time deprecation audit (`mail.server.jmap.methods_opt_deprecated`) and routes through the same registry — operators migrate to `opts.overrides` with explicit budgets."
|
|
293
|
+
},
|
|
294
|
+
{
|
|
295
|
+
"title": "New audit events",
|
|
296
|
+
"body": "`mail.serverRegistry.method_dispatch` carries `{ protocol, name, source: \"builtin\" | \"operator-override\" }` on every dispatch; `mail.serverRegistry.experimental_registration` audits opt-in off-catalogue registrations."
|
|
297
|
+
}
|
|
298
|
+
]
|
|
299
|
+
},
|
|
300
|
+
{
|
|
301
|
+
"heading": "Migration",
|
|
302
|
+
"items": [
|
|
303
|
+
{
|
|
304
|
+
"title": "Operator impact — explicit budgets required for new overrides",
|
|
305
|
+
"body": "Existing JMAP `opts.methods` callers see the deprecation audit but continue to function (legacy auto-budget = 10 MiB / 30 s); existing IMAP / ManageSieve operators have no migration burden — the listener factories continue to accept the same opts shape. Operators wiring NEW overrides MUST supply explicit budgets."
|
|
306
|
+
}
|
|
307
|
+
]
|
|
308
|
+
}
|
|
309
|
+
],
|
|
310
|
+
"references": [
|
|
311
|
+
{
|
|
312
|
+
"label": "RFC 9051 IMAP4rev2",
|
|
313
|
+
"url": "https://www.rfc-editor.org/rfc/rfc9051"
|
|
314
|
+
},
|
|
315
|
+
{
|
|
316
|
+
"label": "RFC 8620 JMAP Core",
|
|
317
|
+
"url": "https://www.rfc-editor.org/rfc/rfc8620"
|
|
318
|
+
},
|
|
319
|
+
{
|
|
320
|
+
"label": "RFC 8621 JMAP for Mail",
|
|
321
|
+
"url": "https://www.rfc-editor.org/rfc/rfc8621"
|
|
322
|
+
},
|
|
323
|
+
{
|
|
324
|
+
"label": "RFC 5804 ManageSieve",
|
|
325
|
+
"url": "https://www.rfc-editor.org/rfc/rfc5804"
|
|
326
|
+
},
|
|
327
|
+
{
|
|
328
|
+
"label": "RFC 2971 IMAP4 ID",
|
|
329
|
+
"url": "https://www.rfc-editor.org/rfc/rfc2971"
|
|
330
|
+
},
|
|
331
|
+
{
|
|
332
|
+
"label": "RFC 2177 IMAP IDLE",
|
|
333
|
+
"url": "https://www.rfc-editor.org/rfc/rfc2177"
|
|
334
|
+
},
|
|
335
|
+
{
|
|
336
|
+
"label": "CVE-2024-34055",
|
|
337
|
+
"url": "https://nvd.nist.gov/vuln/detail/CVE-2024-34055"
|
|
338
|
+
},
|
|
339
|
+
{
|
|
340
|
+
"label": "CVE-2026-26312",
|
|
341
|
+
"url": "https://nvd.nist.gov/vuln/detail/CVE-2026-26312"
|
|
342
|
+
}
|
|
343
|
+
]
|
|
344
|
+
},
|
|
345
|
+
{
|
|
346
|
+
"version": "0.10.10",
|
|
347
|
+
"date": "2026-05-17",
|
|
348
|
+
"headline": "PQC envelope completion (experimental) — JWE-PQ + dual PQ-HPKE drafts",
|
|
349
|
+
"summary": "Two new opt-in PQC-protocol primitives behind explicit experimental namespaces: ML-KEM-1024 + XChaCha20-Poly1305 JOSE JWE and the two active PQ-HPKE drafts (connolly individual + IETF WG) with draft-isolation labels so cross-draft substitution refuses by construction.",
|
|
350
|
+
"sections": [
|
|
351
|
+
{
|
|
352
|
+
"heading": "Added",
|
|
353
|
+
"items": [
|
|
354
|
+
{
|
|
355
|
+
"title": "`b.jose.jwe.experimental.encrypt` / `.decrypt`",
|
|
356
|
+
"body": "RFC 7516 compact-serialization JWE with ML-KEM-1024 key encapsulation and XChaCha20-Poly1305 AEAD content encryption. Lives under `b.jose.jwe.experimental` because the JOSE PQC IANA codepoint registration (draft-ietf-jose-pqc-kem-05) hasn't finalized — the namespace name is the contract: codepoints may change between minors without affecting the framework's stable surface. Header carries `{ alg: \"ML-KEM-1024\", enc: \"XC20P\", \"x-blamejs-experimental\": true }`; decrypt refuses any envelope missing the experimental marker (defends a stable-system consumer that accidentally ingests an experimental envelope and treats it as IANA-compliant). Header bytes route through `b.safeJson.parse` for proto-pollution / depth / size defenses; header is byte-capped at 4 KiB."
|
|
357
|
+
},
|
|
358
|
+
{
|
|
359
|
+
"title": "`b.crypto.hpke.pq.connolly.seal` / `.open` + `b.crypto.hpke.pq.wg.seal` / `.open`",
|
|
360
|
+
"body": "Both active PQ-HPKE drafts behind explicit opt-in: draft-connolly-cfrg-hpke-mlkem-04 (individual; codepoints today) and draft-ietf-hpke-pq-03 (WG-adopted). Each wrapper binds a draft-distinguishing label into the RFC 9180 §5.1 `info` parameter so cross-draft substitution (sealing under connolly and opening as wg, or vice versa) refuses by construction — the derived AEAD key diverges and Poly1305 verify fails. Both compose the existing `b.crypto.hpke.seal` / `.open` core (ML-KEM-1024 KEM + HKDF-SHA3-512 + ChaCha20-Poly1305 per project PQC-first policy); the wrappers add the draft-isolation label without touching the wire-format primitives."
|
|
361
|
+
},
|
|
362
|
+
{
|
|
363
|
+
"title": "New `jose` audit namespace",
|
|
364
|
+
"body": "Emits `jose.jwe.experimental.encrypt` / `jose.jwe.experimental.decrypt` events on every envelope. Defers COSE-PQ signatures (pending IANA codepoint registration for draft-ietf-cose-pqc-*), the JWE JSON serialization variant (compact-only at this experimental tier), and FIPS 203 KAT test vectors against the vendored bundle (functional parity is established by the existing hybrid-KEM verify path)."
|
|
365
|
+
}
|
|
366
|
+
]
|
|
367
|
+
},
|
|
368
|
+
{
|
|
369
|
+
"heading": "Migration",
|
|
370
|
+
"items": [
|
|
371
|
+
{
|
|
372
|
+
"title": "Operator impact — stable surface unaffected, experimental opt-in only",
|
|
373
|
+
"body": "No breaking changes. The stable `b.crypto.hpke.seal` and the existing `b.crypto.encrypt` envelope shape are unaffected. Operators integrating against systems speaking one of the active PQ-HPKE drafts use the explicit `.pq.connolly` / `.pq.wg` paths; operators wanting IANA-final codepoints wait for graduation to the stable surface (one-minor deprecation window will ship when IANA registration lands). The framework refuses to silently pick a winner between the two drafts."
|
|
374
|
+
}
|
|
375
|
+
]
|
|
376
|
+
}
|
|
377
|
+
],
|
|
378
|
+
"references": [
|
|
379
|
+
{
|
|
380
|
+
"label": "draft-ietf-jose-pqc-kem-05",
|
|
381
|
+
"url": "https://datatracker.ietf.org/doc/draft-ietf-jose-pqc-kem/"
|
|
382
|
+
},
|
|
383
|
+
{
|
|
384
|
+
"label": "draft-connolly-cfrg-hpke-mlkem-04",
|
|
385
|
+
"url": "https://datatracker.ietf.org/doc/draft-connolly-cfrg-hpke-mlkem/"
|
|
386
|
+
},
|
|
387
|
+
{
|
|
388
|
+
"label": "draft-ietf-hpke-pq-03",
|
|
389
|
+
"url": "https://datatracker.ietf.org/doc/draft-ietf-hpke-pq/"
|
|
390
|
+
},
|
|
391
|
+
{
|
|
392
|
+
"label": "RFC 9180 HPKE",
|
|
393
|
+
"url": "https://www.rfc-editor.org/rfc/rfc9180.html"
|
|
394
|
+
},
|
|
395
|
+
{
|
|
396
|
+
"label": "RFC 7516 JWE",
|
|
397
|
+
"url": "https://www.rfc-editor.org/rfc/rfc7516.html"
|
|
398
|
+
},
|
|
399
|
+
{
|
|
400
|
+
"label": "FIPS 203 ML-KEM",
|
|
401
|
+
"url": "https://csrc.nist.gov/pubs/fips/203/final"
|
|
402
|
+
},
|
|
403
|
+
{
|
|
404
|
+
"label": "draft-irtf-cfrg-xchacha XChaCha20-Poly1305",
|
|
405
|
+
"url": "https://datatracker.ietf.org/doc/draft-irtf-cfrg-xchacha/"
|
|
406
|
+
}
|
|
407
|
+
]
|
|
408
|
+
},
|
|
409
|
+
{
|
|
410
|
+
"version": "0.10.9",
|
|
411
|
+
"date": "2026-05-17",
|
|
412
|
+
"headline": "Ergonomic helpers bundle — `b.safePath`, `b.bootGates`, shadow metrics, cert reload, render groups, ISO timestamps",
|
|
413
|
+
"summary": "Six small DX primitives bundled into one release: path-traversal-safe resolve, sequential boot-invariant runner, namespaced shadow metrics registry, per-instance `agent.reloadCerts`, group-sectioned metrics text format, and ISO-8601 timestamp render-eligibility.",
|
|
414
|
+
"sections": [
|
|
415
|
+
{
|
|
416
|
+
"heading": "Added",
|
|
417
|
+
"items": [
|
|
418
|
+
{
|
|
419
|
+
"title": "`b.safePath.resolve` / `.resolveOrNull` / `.validate`",
|
|
420
|
+
"body": "Path-traversal-safe multi-segment resolve. Refuses absolute / UNC / drive-letter `rel`, NUL bytes, C0 control chars, bidi-override codepoints (CVE-2021-42574 Trojan Source class), URL-encoded + fullwidth + division-slash path separators, Windows reserved device names CON / PRN / AUX / NUL / COM[0-9] / LPT[0-9] on EVERY platform (closes CVE-2025-27210 cross-mount class), trailing-`.`/trailing-space segments under windows-mode, NTFS Alternate Data Stream markers (CVE-2024-12217 class), and `..` segments that escape `base` after lexical resolve. Optional `opts.realpath: true` adds symlink-escape detection via `fs.realpathSync.native`. Every documented failure mode produces a coded refusal (`safe-path/absolute-rel` / `null-byte` / `bidi` / `win-reserved` / `escapes-base` / etc.); no best-effort path."
|
|
421
|
+
},
|
|
422
|
+
{
|
|
423
|
+
"title": "`b.bootGates.run([{ name, fn, timeoutMs?, exitCode?, onFail? }], opts?)`",
|
|
424
|
+
"body": "Sequential boot-invariant runner. Each gate runs in order; on first failure: emits `bootgates.failed` audit, runs the gate's `onFail` callback (swallows + audits onFail throws), writes a single-line failure summary via `opts.log`, and calls the operator-supplied `opts.exit(code)`. The default `exit` throws `BootGatesError(\"bootgates/no-exit-wired\")` rather than calling `process.exit` directly (lib/ never terminates the process — the CLI surface owns that wiring). Each gate runs under a 60s default `timeoutMs` budget configurable per-gate; overall budget via `opts.overallTimeoutMs`."
|
|
425
|
+
},
|
|
426
|
+
{
|
|
427
|
+
"title": "`b.metrics.snapshot.shadowRegistry({ namespace, counters, gauges, info, cardinalityCap?, onCardinalityExceeded? })`",
|
|
428
|
+
"body": "Namespaced shadow registry that mirrors a subset of a primary registry's metrics for export to systems needing isolated views (sidecar / per-tenant scrape endpoint / compliance-tagged subset). Cardinality cap (default 10000 per metric name) closes the client_golang CVE-2022-21698 unbounded-cardinality DoS class; policy is `drop` (default), `audit-only`, or `refuse`. Emits `metrics.shadow.cardinality_dropped` audit (rate-limited to 1/sec per shadow registry)."
|
|
429
|
+
},
|
|
430
|
+
{
|
|
431
|
+
"title": "Per-instance `agent.reloadCerts({ cert, key, ca })` on `b.pqcAgent.create()`",
|
|
432
|
+
"body": "Long-running daemons that rotate TLS material via explicit `b.pqcAgent.create()` agents previously needed a process restart; the new instance method tests the new material via `tls.createSecureContext`, swaps `agent.options` atomically, closes idle keep-alive sockets via `agent.destroy()` (in-flight sockets complete naturally), and emits `pqcagent.reloadCerts` audit. Cert/key mismatch surfaces as `pqcagent/reload-mismatch` with the OpenSSL chain; CA bundle parse failures surface as `pqcagent/reload-bad-ca`."
|
|
433
|
+
},
|
|
434
|
+
{
|
|
435
|
+
"title": "`b.metrics.snapshot.render(snap, { format: \"text\", groups })`",
|
|
436
|
+
"body": "Operator-readable text format gains an `opts.groups` map that sections the output (`== HTTP ==` / `== Queue ==` / `== TLS ==`); fields not named in any group fall to `== Other ==`. Group ordering preserved per insertion order. Prometheus / OpenMetrics formats unchanged."
|
|
437
|
+
},
|
|
438
|
+
{
|
|
439
|
+
"title": "ISO-8601 date strings render-eligible in metrics text format",
|
|
440
|
+
"body": "Timestamps shaped as `2026-05-17T20:00:00.000Z` (length-bounded at 64 chars) now render verbatim in the text format instead of degrading to `[skipped: non-numeric]`; the Prometheus format gets a parallel `<name>_epoch_ms` gauge so downstream alerting can compute durations per OpenMetrics 1.0 §3.4 (Timestamps MUST be float64 Unix-epoch). Non-ISO strings continue to skip in Prometheus (label-value injection defense). New audit namespaces `bootgates` and `metrics`."
|
|
441
|
+
}
|
|
442
|
+
]
|
|
443
|
+
},
|
|
444
|
+
{
|
|
445
|
+
"heading": "Migration",
|
|
446
|
+
"items": [
|
|
447
|
+
{
|
|
448
|
+
"title": "Operator impact — wire `opts.exit` for `b.bootGates.run`",
|
|
449
|
+
"body": "No breaking changes. `b.bootGates.run` callers MUST supply `opts.exit: process.exit.bind(process)` from their daemon main() if they want the failure path to terminate the process — the default-throw shape exists so lib/-internal callers can't accidentally `process.exit` from inside a primitive. `b.safePath.resolve` is a brand-new primitive; existing code is unaffected."
|
|
450
|
+
}
|
|
451
|
+
]
|
|
452
|
+
}
|
|
453
|
+
],
|
|
454
|
+
"references": [
|
|
455
|
+
{
|
|
456
|
+
"label": "Node.js path.resolve docs",
|
|
457
|
+
"url": "https://nodejs.org/api/path.html#pathresolvepaths"
|
|
458
|
+
},
|
|
459
|
+
{
|
|
460
|
+
"label": "CVE-2025-27210 Windows device-name bypass",
|
|
461
|
+
"url": "https://nvd.nist.gov/vuln/detail/CVE-2025-27210"
|
|
462
|
+
},
|
|
463
|
+
{
|
|
464
|
+
"label": "CVE-2024-12217 NTFS ADS",
|
|
465
|
+
"url": "https://nvd.nist.gov/vuln/detail/CVE-2024-12217"
|
|
466
|
+
},
|
|
467
|
+
{
|
|
468
|
+
"label": "CVE-2021-42574 Trojan Source",
|
|
469
|
+
"url": "https://nvd.nist.gov/vuln/detail/CVE-2021-42574"
|
|
470
|
+
},
|
|
471
|
+
{
|
|
472
|
+
"label": "CVE-2022-21698 Prometheus cardinality DoS",
|
|
473
|
+
"url": "https://nvd.nist.gov/vuln/detail/CVE-2022-21698"
|
|
474
|
+
},
|
|
475
|
+
{
|
|
476
|
+
"label": "OpenMetrics 1.0 spec",
|
|
477
|
+
"url": "https://github.com/prometheus/OpenMetrics/blob/v1.0.0/specification/OpenMetrics.md"
|
|
478
|
+
},
|
|
479
|
+
{
|
|
480
|
+
"label": "CVE-2026-21637 SNI sync-throw",
|
|
481
|
+
"url": "https://nvd.nist.gov/vuln/detail/CVE-2026-21637"
|
|
482
|
+
}
|
|
483
|
+
]
|
|
484
|
+
},
|
|
485
|
+
{
|
|
486
|
+
"version": "0.10.8",
|
|
487
|
+
"date": "2026-05-17",
|
|
488
|
+
"headline": "EU AI Act Art. 50 + AB-853 + CAC implicit label + AIBOM + operator-surfaced DX primitives",
|
|
489
|
+
"summary": "Calendar-bound release ahead of the 2026-08-02 EU AI Act Art. 50 transparency / California SB-942-as-amended-by-AB-853 effective date and the live (2025-09-01) China CAC GB 45438-2025 labeling regime. Three new AI-transparency surfaces plus three operator-surfaced DX primitives (issues #91 / #92 / #93).",
|
|
490
|
+
"sections": [
|
|
491
|
+
{
|
|
492
|
+
"heading": "Added",
|
|
493
|
+
"items": [
|
|
494
|
+
{
|
|
495
|
+
"title": "`b.ai.aiContentDetect.report` — inbound-asset provenance detector",
|
|
496
|
+
"body": "Operators extract C2PA-COSE envelopes / CAC implicit-label JSON / IPTC PhotoMetadata via their format-specific muxer and feed the artifacts to `report({...})`; the framework verifies signatures, anchors against an operator-pinned trust list, and returns a normalized provenance report for the AB-853 §22757.21 disclosure UI. Trust-list-empty surfaces as an alert rather than silent acceptance. Profile / posture cascade: `ca-ab-853`, `ca-sb-942`, `eu-ai-act-art-50`, `cac-genai-label` pin to `strict` (refuse on signer not on trust list); `nist-ai-600-1`, `iso-42001`, `iso-23894`, `nist-ai-rmf` pin to `balanced`."
|
|
497
|
+
},
|
|
498
|
+
{
|
|
499
|
+
"title": "`b.contentCredentials.cacImplicitLabel` + `.cacImplicitLabelRead`",
|
|
500
|
+
"body": "China CAC (Cyberspace Administration) labeling measures for synthetic content produced by generative models + mandatory standard GB 45438-2025 implicit metadata emitter and reverse parser. Validates the 18-character Chinese unified social credit code (per GB 32100-2015), `aigcMarker` field, and `contentKind` enum at the config-time tier. Operators co-emit alongside the C2PA-COSE manifest by declaring `cac-genai-label` posture on the existing `b.contentCredentials.build`."
|
|
501
|
+
},
|
|
502
|
+
{
|
|
503
|
+
"title": "`b.ai.modelManifest.build` / `.sign` / `.verify` — CycloneDX 1.6 ML-BOM",
|
|
504
|
+
"body": "EU AI Act Art. 11 + Annex IV require technical documentation for high-risk AI systems; CycloneDX 1.6 ML-BOM is the de-facto serialization (and forward-positioned for EU CRA 2027-12-11 — Regulation (EU) 2024/2847 requires SBOM-style documentation for AI components in products with digital elements). Emits `bomFormat: \"CycloneDX\"` + `specVersion: \"1.6\"` + `serialNumber` UUIDv4 URN + `metadata.timestamp` + `metadata.tools[]` + `metadata.component` (primary model with `type: \"machine-learning-model\"`) + `components[]` datasets + `properties[]` hyperparameters + `formulation[]` workflows + `services[]` external model APIs. ML-DSA-87 signature over canonical-JSON-1785 representation; verify path NEVER trusts an embedded `signedBytes` field — defends the CVE-2025-29774 / CVE-2025-29775 xml-crypto-style signature-substitution class. Self-validates required CycloneDX 1.6 fields at emit time."
|
|
505
|
+
},
|
|
506
|
+
{
|
|
507
|
+
"title": "`b.atomicFile.conflictPath` — conflict-suffix path builder (issue #91)",
|
|
508
|
+
"body": "Filesystem-portable conflict-suffix path builder: `notes.md` → `notes.conflict-2026-05-17T19-30-00Z.md`; Windows-safe (no `:` / `.`), extension-preserving, dotfile-aware, optional `tag` + `suffix` disambiguator for same-second collisions. Composes the existing `b.atomicFile.pathTimestamp`."
|
|
509
|
+
},
|
|
510
|
+
{
|
|
511
|
+
"title": "`b.promisePool.create` — bounded-concurrency promise pool (issue #92)",
|
|
512
|
+
"body": "The gap between `b.workerPool` (worker-thread CPU-bound work) and `b.queue` (durable cross-process messaging). `run(taskFn)` / `fire(taskFn)` / `drain({ close? })` shape with back-pressure on enqueue, queueLimit refusal, composes with `b.appShutdown` for drain-on-shutdown. No hidden retry — operators compose `b.retry.withRetry` inside the task body when they want it."
|
|
513
|
+
},
|
|
514
|
+
{
|
|
515
|
+
"title": "`b.sdNotify` — sd_notify protocol surface (issue #93)",
|
|
516
|
+
"body": "`.send` / `.ready` / `.stopping` / `.reloading` / `.watchdog` for systemd Type=notify daemons. Reads `$NOTIFY_SOCKET` via `b.parsers.safeEnv.readVar`, dispatches `READY=1` / `STOPPING=1` / `RELOADING=1` / `WATCHDOG=1` via `systemd-notify(1)` with `execFile` (no shell). No-op (with audit) when `$NOTIFY_SOCKET` is unset (foreground / container / non-systemd init). Compose with `b.appShutdown.create` for the STOPPING signal; compose with a periodic watchdog interval for systemd's auto-restart-on-hang guarantee."
|
|
517
|
+
},
|
|
518
|
+
{
|
|
519
|
+
"title": "`b.crypto.randomInt` substrate exported",
|
|
520
|
+
"body": "Exported alongside the AIBOM UUID generator to give the new code a single greppable random-int path."
|
|
521
|
+
},
|
|
522
|
+
{
|
|
523
|
+
"title": "New compliance postures",
|
|
524
|
+
"body": "`ca-ab-853`, `ca-sb-942`, `eu-ai-act-art-50`, `eu-ai-act-art-11`, `cac-genai-label`, `nist-ai-600-1`, `nist-ai-rmf`, `iso-42001`, `iso-23894` across `b.contentCredentials` / `b.ai.aiContentDetect` / `b.ai.modelManifest`. New audit namespaces: `aibom` (aibom.signed / aibom.verified), `aicontentdetect` (aicontentdetect.report), `sdnotify` (sdnotify.send / sdnotify.send.skipped)."
|
|
525
|
+
}
|
|
526
|
+
]
|
|
527
|
+
},
|
|
528
|
+
{
|
|
529
|
+
"heading": "Migration",
|
|
530
|
+
"items": [
|
|
531
|
+
{
|
|
532
|
+
"title": "Operator impact — pin trust list, runway to 2027-01-01",
|
|
533
|
+
"body": "No breaking changes. Operators already declaring `eu-ai-act-art-50` posture should pin a trust list via the new primitive before turning on default-on detection in production; AB-853 §22757.21 platform-detection obligations are 2027-01-01 effective so there's runway. In-tree IPTC PhotoMetadata reader for `digitalSourceType` field defers to a follow-up release — operators pre-parse with their tool of choice and pass via `opts.ipmd`."
|
|
534
|
+
}
|
|
535
|
+
]
|
|
536
|
+
}
|
|
537
|
+
],
|
|
538
|
+
"references": [
|
|
539
|
+
{
|
|
540
|
+
"label": "EU AI Act Regulation (EU) 2024/1689",
|
|
541
|
+
"url": "https://eur-lex.europa.eu/eli/reg/2024/1689"
|
|
542
|
+
},
|
|
543
|
+
{
|
|
544
|
+
"label": "California SB-942 + AB-853",
|
|
545
|
+
"url": "https://leginfo.legislature.ca.gov/faces/billNavClient.xhtml?bill_id=202320240SB942"
|
|
546
|
+
},
|
|
547
|
+
{
|
|
548
|
+
"label": "CAC GB 45438-2025",
|
|
549
|
+
"url": "https://www.cac.gov.cn/2025-03/14/c_1742700786675936.htm"
|
|
550
|
+
},
|
|
551
|
+
{
|
|
552
|
+
"label": "C2PA 2.2 spec",
|
|
553
|
+
"url": "https://c2pa.org/specifications/specifications/2.2/"
|
|
554
|
+
},
|
|
555
|
+
{
|
|
556
|
+
"label": "CycloneDX 1.6 ML-BOM",
|
|
557
|
+
"url": "https://cyclonedx.org/docs/1.6/json/"
|
|
558
|
+
},
|
|
559
|
+
{
|
|
560
|
+
"label": "OWASP CycloneDX AI/ML-BOM Authoritative Guide",
|
|
561
|
+
"url": "https://owasp.org/www-project-cyclonedx/"
|
|
562
|
+
},
|
|
563
|
+
{
|
|
564
|
+
"label": "NIST AI 600-1 Generative AI Profile",
|
|
565
|
+
"url": "https://nvlpubs.nist.gov/nistpubs/ai/NIST.AI.600-1.pdf"
|
|
566
|
+
},
|
|
567
|
+
{
|
|
568
|
+
"label": "ISO/IEC 42001:2023",
|
|
569
|
+
"url": "https://www.iso.org/standard/81230.html"
|
|
570
|
+
},
|
|
571
|
+
{
|
|
572
|
+
"label": "systemd-notify(1)",
|
|
573
|
+
"url": "https://www.freedesktop.org/software/systemd/man/latest/systemd-notify.html"
|
|
574
|
+
},
|
|
575
|
+
{
|
|
576
|
+
"label": "CVE-2025-29774",
|
|
577
|
+
"url": "https://nvd.nist.gov/vuln/detail/CVE-2025-29774"
|
|
578
|
+
},
|
|
579
|
+
{
|
|
580
|
+
"label": "CVE-2025-29775",
|
|
581
|
+
"url": "https://nvd.nist.gov/vuln/detail/CVE-2025-29775"
|
|
582
|
+
},
|
|
583
|
+
{
|
|
584
|
+
"label": "CVE-2025-32711 EchoLeak",
|
|
585
|
+
"url": "https://nvd.nist.gov/vuln/detail/CVE-2025-32711"
|
|
586
|
+
}
|
|
587
|
+
]
|
|
588
|
+
},
|
|
589
|
+
{
|
|
590
|
+
"version": "0.10.7",
|
|
591
|
+
"date": "2026-05-17",
|
|
592
|
+
"headline": "Mail-stack P3 / P4 hardening sweep",
|
|
593
|
+
"summary": "Twenty-plus refusals + observability additions across the four mail listeners, the DKIM verifier, ARC signer, MIME parser, and the DNS / DSN / List-* guards. One substrate addition (`b.crypto.randomInt`); two new operator-visible opts on the submission listener.",
|
|
594
|
+
"sections": [
|
|
595
|
+
{
|
|
596
|
+
"heading": "Added",
|
|
597
|
+
"items": [
|
|
598
|
+
{
|
|
599
|
+
"title": "`b.crypto.randomInt(min, max)` substrate wrapper",
|
|
600
|
+
"body": "Routes every framework integer draw through one greppable primitive. Migrates the inline `nodeCrypto.randomInt` sites in `b.network.dns` / `b.network.dns.resolver` (DNS query-ID), `b.mail.auth` (DMARC `pct` sampling), and `b.externalDb` (transaction-retry jitter) so the audit trail is uniform and future detectors see one shape."
|
|
601
|
+
},
|
|
602
|
+
{
|
|
603
|
+
"title": "`b.mail.server.submission.create({ requireDkim, dkimRequireMode })`",
|
|
604
|
+
"body": "Outbound DKIM-required gate per Yahoo / Google 2024 bulk-sender alignment. `requireDkim` defaults `true` under `strict` profile (`false` under `balanced` / `permissive`). `dkimRequireMode` is `\"self\"` (signer's `d=` must match authenticated identity's domain), `\"any\"` (any signer present), or `\"off\"` (no gate). Default `\"any\"`. Submission listener that doesn't carry a `DKIM-Signature:` header at DATA-end refuses with `5.7.20`."
|
|
605
|
+
},
|
|
606
|
+
{
|
|
607
|
+
"title": "`b.mail.server.{mx,submission}.create({ allowSmtpUtf8 })`",
|
|
608
|
+
"body": "Single per-listener SMTPUTF8 (RFC 6531) switch threaded end-to-end into `guardSmtpCommand.validate`. Default `false`. Operators that accept EAI envelopes flip to `true` and the toggle reaches every wire-line guard call."
|
|
609
|
+
}
|
|
610
|
+
]
|
|
611
|
+
},
|
|
612
|
+
{
|
|
613
|
+
"heading": "Changed",
|
|
614
|
+
"items": [
|
|
615
|
+
{
|
|
616
|
+
"title": "DKIM verifier signature-count cap",
|
|
617
|
+
"body": "`b.mail.dkim.verify` now refuses (`policy` verdict) rather than silently truncating when a message carries more `DKIM-Signature` headers than `maxSignatures` (default 8). The opt is range-checked at config time against a ceiling of 16; out-of-range throws `dkim/bad-max-signatures`. Closes a verifier-fan-out DoS shape per RFC 6376 §6.1. Emits `dkim.verify.signature_count_cap` audit on the refusal so postmasters see DoS attempts in the authentication-results stream."
|
|
618
|
+
},
|
|
619
|
+
{
|
|
620
|
+
"title": "MX listener size-overrun + observability",
|
|
621
|
+
"body": "`MAIL FROM SIZE=` is now reconciled against the actual DATA byte count after dot-stuffing reversal — senders that understate `SIZE=` to probe `maxMessageBytes` get `552 5.3.4` rather than silently accepted, with `mail.server.mx.size_overrun` audit. Refused-recipient list (bounded at 32 per transaction) now surfaces in the `data_accepted` / `delivered` audit metadata. Write-backpressure on every reply attaches a once-per-socket `mail.server.mx.write_backpressure` audit so operators see stalled connections without flooding on every reply."
|
|
622
|
+
},
|
|
623
|
+
{
|
|
624
|
+
"title": "ARC signer hop-count ceiling",
|
|
625
|
+
"body": "`b.mail.arc.sign` extracts prior hops with the RFC 8617 §5 50-hop cap; an inbound chain claiming >50 hops or an out-of-range `i=` tag is refused rather than enumerated."
|
|
626
|
+
},
|
|
627
|
+
{
|
|
628
|
+
"title": "`b.safeMime` charset coverage + observability",
|
|
629
|
+
"body": "`b.safeMime.parse` now decodes `utf-16` (RFC 2781 §3.3 BOM detection + BE default), `utf-16be`, and `utf-16le` end-to-end — the prior shape advertised `utf-16` / `utf-16be` in the allowlist but only decoded `utf-16le`. `binary` Content-Transfer-Encoding is removed from the default allowlist (RFC 3030 §3 — `binary` requires explicit BINARYMIME negotiation; operators that wire BINARYMIME opt back in via `transferEncodingAllowlist: [..., \"binary\"]`). Control-character refusal errors now report the BYTE offset (via `Buffer.byteLength` on the JS string prefix) rather than the UTF-16 code-unit index, so audit lines align with wire-level inspection."
|
|
630
|
+
},
|
|
631
|
+
{
|
|
632
|
+
"title": "`b.mailStore` JMAP objectid bump to 128 bits",
|
|
633
|
+
"body": "RFC 8474 §1.5.1 — the prior 24-char hex prefix cut entropy to 96 bits; full 32-char hex restores 128 bits."
|
|
634
|
+
}
|
|
635
|
+
]
|
|
636
|
+
},
|
|
637
|
+
{
|
|
638
|
+
"heading": "Fixed",
|
|
639
|
+
"items": [
|
|
640
|
+
{
|
|
641
|
+
"title": "IMAP `APPEND` date-time + `FETCH` / `STORE` state + `LOGIN` quoted escape",
|
|
642
|
+
"body": "`APPEND mailbox [flags] [date-time] {literal}` now honors the optional RFC 9051 §6.3.12 date-time argument (parsed into `internalDate` ms-epoch, refused with `BAD` rather than silently falling back to `Date.now()`). `FETCH` / `STORE` outside of Selected state now respond `BAD` (RFC 9051 §6.4.5 / §6.4.6 — protocol-context violation, not policy refusal). `LOGIN` quoted-string args honor `\\\"` / `\\\\` escape pairs per the RFC 9051 §5.1 grammar (the prior shape terminated at the first `\"`, letting a hostile client smuggle `LOGIN \"alice\\\"@example.com\" \"pw\"` past the username binding)."
|
|
643
|
+
},
|
|
644
|
+
{
|
|
645
|
+
"title": "DKIM / DMARC / ARC / iPrev / DSN tightening",
|
|
646
|
+
"body": "`b.guardDsn` splits the RFC 3464 §2.1.1 block separator on literal `\\r\\n\\r\\n` only (the prior `\\n\\s*\\n` accepted `\\v` / `\\f` whitespace as a block boundary, letting a hostile sender bend the per-message vs per-recipient boundary). `b.guardMessageId` now validates id-left + id-right against RFC 5322 §3.2.3 dot-atom-text shape under `strict` profile; `b.guardListId` extends the localhost FQDN exception to `.local` (RFC 6762) and `.lan` (draft-chapin-rfc2606bis)."
|
|
647
|
+
},
|
|
648
|
+
{
|
|
649
|
+
"title": "`b.guardListUnsubscribe` SSRF defense",
|
|
650
|
+
"body": "HTTPS one-click URIs now refuse IP-literal hosts (v4 + v6), reserved-local hostnames (`localhost` / `localhost.localdomain` / `ip6-localhost` / `ip6-loopback`), and reserved-local TLD suffixes (`.local` / `.lan` / `.internal`). New optional `allowedHosts` opt provides a domain allowlist — when supplied, every HTTPS host (or any ancestor) must be on the list."
|
|
651
|
+
}
|
|
652
|
+
]
|
|
653
|
+
},
|
|
654
|
+
{
|
|
655
|
+
"heading": "Migration",
|
|
656
|
+
"items": [
|
|
657
|
+
{
|
|
658
|
+
"title": "Operator impact — submission DKIM gate, header / DSN refusals, MIME charset",
|
|
659
|
+
"body": "Submission listeners on `strict` profile WITHOUT operator-side DKIM signing (`b.mail.dkim.sign` pre-relay) now refuse outbound DATA — operators in this state either wire DKIM signing, opt to `dkimRequireMode: \"off\"`, or step down to `balanced`. `b.mail.dkim.verify` callers passing `maxSignatures > 16` now throw at config time — clamp via the opt or rely on the framework default. `b.safeMime.parse` callers that legitimately receive `binary` Content-Transfer-Encoding (BINARYMIME-aware downstream pipelines) opt back in via `transferEncodingAllowlist`. `b.guardListUnsubscribe.validate` callers that legitimately rely on IP-literal one-click URIs (test harnesses, internal-network operators) opt in via `allowedHosts: [\"10.0.0.0/8\"]` style ancestor matches. Per-tenant pepper on `b.mailStore` derived hashes (`from_hash` / `message_id_hash`) ships in a later release alongside the `b.agent.tenant` adoption refactor; the schema migration is too invasive to fold into this patch."
|
|
660
|
+
}
|
|
661
|
+
]
|
|
662
|
+
}
|
|
663
|
+
],
|
|
664
|
+
"references": [
|
|
665
|
+
{
|
|
666
|
+
"label": "RFC 9051 IMAP4rev2",
|
|
667
|
+
"url": "https://www.rfc-editor.org/rfc/rfc9051"
|
|
668
|
+
},
|
|
669
|
+
{
|
|
670
|
+
"label": "RFC 6376 DKIM §6.1",
|
|
671
|
+
"url": "https://www.rfc-editor.org/rfc/rfc6376#section-6.1"
|
|
672
|
+
},
|
|
673
|
+
{
|
|
674
|
+
"label": "RFC 6531 SMTPUTF8",
|
|
675
|
+
"url": "https://www.rfc-editor.org/rfc/rfc6531"
|
|
676
|
+
},
|
|
677
|
+
{
|
|
678
|
+
"label": "RFC 3030 BINARYMIME",
|
|
679
|
+
"url": "https://www.rfc-editor.org/rfc/rfc3030"
|
|
680
|
+
},
|
|
681
|
+
{
|
|
682
|
+
"label": "RFC 2781 UTF-16 BOM",
|
|
683
|
+
"url": "https://www.rfc-editor.org/rfc/rfc2781"
|
|
684
|
+
},
|
|
685
|
+
{
|
|
686
|
+
"label": "RFC 1870 SMTP SIZE",
|
|
687
|
+
"url": "https://www.rfc-editor.org/rfc/rfc1870"
|
|
688
|
+
},
|
|
689
|
+
{
|
|
690
|
+
"label": "RFC 8474 JMAP objectid",
|
|
691
|
+
"url": "https://www.rfc-editor.org/rfc/rfc8474"
|
|
692
|
+
},
|
|
693
|
+
{
|
|
694
|
+
"label": "RFC 8617 ARC §5",
|
|
695
|
+
"url": "https://www.rfc-editor.org/rfc/rfc8617#section-5"
|
|
696
|
+
},
|
|
697
|
+
{
|
|
698
|
+
"label": "RFC 3464 DSN §2.1.1",
|
|
699
|
+
"url": "https://www.rfc-editor.org/rfc/rfc3464#section-2.1.1"
|
|
700
|
+
},
|
|
701
|
+
{
|
|
702
|
+
"label": "RFC 5322 Message Format §3.2.3",
|
|
703
|
+
"url": "https://www.rfc-editor.org/rfc/rfc5322#section-3.2.3"
|
|
704
|
+
},
|
|
705
|
+
{
|
|
706
|
+
"label": "RFC 6761 Reserved Domain Names",
|
|
707
|
+
"url": "https://www.rfc-editor.org/rfc/rfc6761"
|
|
708
|
+
},
|
|
709
|
+
{
|
|
710
|
+
"label": "Yahoo / Gmail bulk-sender 2024",
|
|
711
|
+
"url": "https://blog.google/products/gmail/gmail-security-authentication-spam-protection/"
|
|
712
|
+
}
|
|
713
|
+
]
|
|
714
|
+
},
|
|
715
|
+
{
|
|
716
|
+
"version": "0.10.6",
|
|
717
|
+
"date": "2026-05-17",
|
|
718
|
+
"headline": "Vendored-SBOM CycloneDX 1.6 conformance + cosign verification recipe pin",
|
|
719
|
+
"summary": "Build-side + verification-side improvements with no runtime changes. The vendored SBOM emitter now produces CPE-matched components with proper supplier attribution + transitive sub-component graphs; the Sigstore-keyless verification recipe constrains the certificate identity to the specific workflow file + tag-ref shape.",
|
|
720
|
+
"sections": [
|
|
721
|
+
{
|
|
722
|
+
"heading": "Added",
|
|
723
|
+
"items": [
|
|
724
|
+
{
|
|
725
|
+
"title": "Per-component `cpe` field in `scripts/build-vendored-sbom.js`",
|
|
726
|
+
"body": "Every vendored bundle gets a CPE 2.3 string (`cpe:2.3:a:<vendor>:<product>:<version>:*:*:*:*:*:*:*`). CISA / NVD CVE-matching tools (Dependency-Track, OWASP Dependency-Check, Snyk SBOM Monitor) match CVE advisories against components by CPE; the prior emit had no CPE field, so vendored bundles were invisible to operator-side CVE scanners."
|
|
727
|
+
},
|
|
728
|
+
{
|
|
729
|
+
"title": "Per-component `supplier` block",
|
|
730
|
+
"body": "`metadata.supplier` (framework-level) was already populated; each vendored bundle now also carries its own `components[].supplier` with the upstream maintainer / org per SLSA v1.0 provenance requirements — operators auditing the SBOM see both the framework supplier (blamejs) AND the vendored bundle's upstream supplier (noble-curves, noble-ciphers, etc.) at the component level."
|
|
731
|
+
},
|
|
732
|
+
{
|
|
733
|
+
"title": "`metadata.lifecycles[].externalReferences[]`",
|
|
734
|
+
"body": "CycloneDX 1.6 §4.4.2 requires `lifecycles` entries to carry build-provenance references (workflow URL, run ID); the npm-publish workflow now populates these so the SBOM points back at the SLSA-attesting workflow run that produced the tarball."
|
|
735
|
+
},
|
|
736
|
+
{
|
|
737
|
+
"title": "Sub-component `dependsOn` graph",
|
|
738
|
+
"body": "When a vendored bundle exposes sub-components (e.g. `noble-ciphers` exports `xchacha20poly1305` + `aes-gcm` as named sub-modules), each sub-component now emits its own SBOM entry with a `dependencies` edge pointing to its parent (CycloneDX 1.6 §4.7). Operators get the full transitive graph instead of just the top-level vendored bundle."
|
|
739
|
+
}
|
|
740
|
+
]
|
|
741
|
+
},
|
|
742
|
+
{
|
|
743
|
+
"heading": "Changed",
|
|
744
|
+
"items": [
|
|
745
|
+
{
|
|
746
|
+
"title": "`SECURITY.md` cosign verification recipe pinned to workflow path + tag-ref",
|
|
747
|
+
"body": "The operator-side recipe now constrains `cosign verify-blob --certificate-identity-regexp` to the specific workflow file (`.github/workflows/npm-publish.yml`) + tag-ref shape (`refs/tags/v[0-9]+\\.[0-9]+\\.[0-9]+`), refusing certificates issued for any other workflow or ref class. Also documents `--rekor-url` for operators running on an air-gapped network with a local transparency log + offline TUF root path for `cosign initialize --root <local-root.json>`."
|
|
748
|
+
},
|
|
749
|
+
{
|
|
750
|
+
"title": "`.github/workflows/npm-publish.yml` recipe comment synchronized",
|
|
751
|
+
"body": "The in-workflow comment matches the SECURITY.md recipe so operators copy-pasting from either source see identical verification steps."
|
|
752
|
+
}
|
|
753
|
+
]
|
|
754
|
+
},
|
|
755
|
+
{
|
|
756
|
+
"heading": "Fixed",
|
|
757
|
+
"items": [
|
|
758
|
+
{
|
|
759
|
+
"title": "`_licenseFor()` inline-path fix",
|
|
760
|
+
"body": "The path-resolution branch that handles vendored bundles whose `package.json` is under `lib/vendor/<name>/package.json` now correctly returns the SPDX `license.id` (was returning `null` for that branch, causing CycloneDX-validator warnings)."
|
|
761
|
+
}
|
|
762
|
+
]
|
|
763
|
+
},
|
|
764
|
+
{
|
|
765
|
+
"heading": "Migration",
|
|
766
|
+
"items": [
|
|
767
|
+
{
|
|
768
|
+
"title": "Operator impact — SBOM CPE matching + tighter Sigstore identity",
|
|
769
|
+
"body": "SBOM consumers that previously saw vendored bundles as opaque now see CPE-matched components with proper supplier attribution + transitive sub-component graph. The Sigstore-keyless verification recipe is more restrictive (rejects certificates issued for non-`npm-publish.yml` workflows on this repo) — operators already verifying against the prior recipe see the same successful verification with the tighter identity match."
|
|
770
|
+
}
|
|
771
|
+
]
|
|
772
|
+
}
|
|
773
|
+
],
|
|
774
|
+
"references": [
|
|
775
|
+
{
|
|
776
|
+
"label": "CycloneDX 1.6 spec",
|
|
777
|
+
"url": "https://cyclonedx.org/docs/1.6/json/"
|
|
778
|
+
},
|
|
779
|
+
{
|
|
780
|
+
"label": "CPE 2.3 spec (NIST IR 7695)",
|
|
781
|
+
"url": "https://nvlpubs.nist.gov/nistpubs/Legacy/IR/nistir7695.pdf"
|
|
782
|
+
},
|
|
783
|
+
{
|
|
784
|
+
"label": "SLSA v1.0 provenance",
|
|
785
|
+
"url": "https://slsa.dev/spec/v1.0/provenance"
|
|
786
|
+
},
|
|
787
|
+
{
|
|
788
|
+
"label": "Sigstore cosign verify-blob",
|
|
789
|
+
"url": "https://docs.sigstore.dev/cosign/verifying/verify/"
|
|
790
|
+
},
|
|
791
|
+
{
|
|
792
|
+
"label": "TUF specification",
|
|
793
|
+
"url": "https://theupdateframework.github.io/specification/latest/"
|
|
794
|
+
}
|
|
795
|
+
]
|
|
796
|
+
},
|
|
797
|
+
{
|
|
798
|
+
"version": "0.10.5",
|
|
799
|
+
"date": "2026-05-16",
|
|
800
|
+
"headline": "`b.mail.server.pop3` APOP cleartext refusal + `b.vendorData` constant-time digest compares",
|
|
801
|
+
"summary": "Two small entry-tier refusals on the mail and vendor-data surfaces. POP3 APOP joins USER / PASS in the cleartext-credentials refusal; `b.vendorData` boot-time digest compares run constant-time.",
|
|
802
|
+
"sections": [
|
|
803
|
+
{
|
|
804
|
+
"heading": "Fixed",
|
|
805
|
+
"items": [
|
|
806
|
+
{
|
|
807
|
+
"title": "`b.mail.server.pop3._handleApop` refuses APOP over cleartext",
|
|
808
|
+
"body": "Refuses APOP when the connection is cleartext and the profile is not permissive, symmetric with the existing USER / PASS refusal. APOP transmits `MD5(timestamp+secret)` (not cleartext credentials), but an attacker who captures the digest plus the known greeting timestamp can mount an offline dictionary attack against the shared secret. RFC 1939 §7 explicitly warns about this; the wire MUST be TLS-protected to deny the offline-attack vector. Emits the same `mail.server.pop3.auth_refused_cleartext` audit event + writes `-ERR APOP refused over cleartext (use STLS first; RFC 1939 §7)`. The cleartext-refusal line was advertised in the v0.10.4 release notes but the wire-level enforcement only lands here; operators relying on v0.10.4 saw the comment but not the runtime gate."
|
|
809
|
+
},
|
|
810
|
+
{
|
|
811
|
+
"title": "`b.vendorData.verifyAll()` boot-time digest compares run constant-time",
|
|
812
|
+
"body": "SHA-256 layer 1, SHA3-512 layer 2, and the SLH-DSA-SHAKE-256f pubkey-fingerprint cross-check now compare via a length-prechecked `nodeCrypto.timingSafeEqual` instead of `!==`. The framework convention is that every digest / MAC compare is constant-time regardless of whether the value is a secret — reaching for `!==` whenever a value \"isn't a secret\" is the smell; the convention is the gate. Uses `nodeCrypto.timingSafeEqual` directly (not `b.crypto.timingSafeEqual`) because `b.crypto` is `lazyRequire`'d to break a circular load chain and isn't available during boot-time `verifyAll()`."
|
|
813
|
+
}
|
|
814
|
+
]
|
|
815
|
+
},
|
|
816
|
+
{
|
|
817
|
+
"heading": "Migration",
|
|
818
|
+
"items": [
|
|
819
|
+
{
|
|
820
|
+
"title": "Operator impact — POP3 APOP requires STLS first",
|
|
821
|
+
"body": "APOP users on plaintext POP3 (port 110) without STLS first now get `-ERR` instead of authenticating — the operator either wires STLS, switches the listener to implicit TLS (port 995), or sets `profile: \"permissive\"` for the deliberately-open path. `b.vendorData` consumers see no behavioral change — the timing-safe compare returns the same boolean as `!==` for length-equal inputs."
|
|
822
|
+
}
|
|
823
|
+
]
|
|
824
|
+
}
|
|
825
|
+
],
|
|
826
|
+
"references": [
|
|
827
|
+
{
|
|
828
|
+
"label": "RFC 1939 §7 POP3 Security",
|
|
829
|
+
"url": "https://www.rfc-editor.org/rfc/rfc1939#section-7"
|
|
830
|
+
},
|
|
831
|
+
{
|
|
832
|
+
"label": "CWE-208 Observable Timing Discrepancy",
|
|
833
|
+
"url": "https://cwe.mitre.org/data/definitions/208.html"
|
|
834
|
+
},
|
|
835
|
+
{
|
|
836
|
+
"label": "NIST SP 800-38B §6.3 MAC verification",
|
|
837
|
+
"url": "https://nvlpubs.nist.gov/nistpubs/SpecialPublications/NIST.SP.800-38B.pdf"
|
|
838
|
+
}
|
|
839
|
+
]
|
|
840
|
+
},
|
|
841
|
+
{
|
|
842
|
+
"version": "0.10.4",
|
|
843
|
+
"date": "2026-05-16",
|
|
844
|
+
"headline": "Mail-protocol hardening across the four listener primitives",
|
|
845
|
+
"summary": "Ten refusals + two new operator-visible opts spanning `b.mail.server.{mx,submission,imap,pop3}`, `b.mail.server.rateLimit`, `b.safeMime`, and `b.guardListUnsubscribe`. Addresses residual gaps in inbound RCPT enumeration, header-count amplification, POP3 UPDATE-state commit timeouts, list-unsubscribe URI shape, and the per-listener auth-failure / connection-rate maps.",
|
|
846
|
+
"sections": [
|
|
847
|
+
{
|
|
848
|
+
"heading": "Added",
|
|
849
|
+
"items": [
|
|
850
|
+
{
|
|
851
|
+
"title": "`b.mail.server.rateLimit.checkRcptAdmit(ip)` + `noteRcptFailure(ip)`",
|
|
852
|
+
"body": "New per-IP RCPT-failure budget (default 50/min, rolling 60s window) wired into the MX + submission listeners. RFC 5321 §3.5 enumeration class: an attacker probing `RCPT TO:` to map valid recipients now trips the budget after 50 failures and gets `421` for the next minute. Operators tune via `rateLimit.create({ rcptFailuresPerMinute, rcptWindowMs })`."
|
|
853
|
+
},
|
|
854
|
+
{
|
|
855
|
+
"title": "`b.safeMime.parse({ maxHeaderCount })` opt",
|
|
856
|
+
"body": "Default 512. Bounded header-count cap prevents `From: ...\\r\\nSubject: ...\\r\\n` × 100k header-list amplification in operator pipelines that pass full RFC 5322 messages through `safeMime.parse`. Refused with `safe-mime/too-many-headers` when exceeded."
|
|
857
|
+
},
|
|
858
|
+
{
|
|
859
|
+
"title": "`b.mail.server.pop3.create({ commitTimeoutMs })` opt",
|
|
860
|
+
"body": "Default `C.TIME.seconds(30)`. POP3 UPDATE-state commit (DELE materialization) now runs under `safeAsync.withTimeout` so a hung commit can no longer pin the connection past `idleTimeoutMs`. Past the cap, the connection gets `421` and the in-flight DELE batch is rolled back (RFC 1939 §6 — UPDATE state aborts on transport failure)."
|
|
861
|
+
}
|
|
862
|
+
]
|
|
863
|
+
},
|
|
864
|
+
{
|
|
865
|
+
"heading": "Fixed",
|
|
866
|
+
"items": [
|
|
867
|
+
{
|
|
868
|
+
"title": "`b.guardListUnsubscribe.validate` refuses empty `<>` URI lists",
|
|
869
|
+
"body": "Per RFC 2369 §3.1 the `List-Unsubscribe` header value `<>` is a smuggled-empty class that downstream mail-renderers may interpret as an active unsubscribe link to the local-origin."
|
|
870
|
+
},
|
|
871
|
+
{
|
|
872
|
+
"title": "`b.mail.server.rateLimit` GC sweep over `connectionTimes`",
|
|
873
|
+
"body": "The previously asymmetric `connectionTimes` Map (filled in `noteConnection`, never explicitly cleaned) now sweeps empty arrays alongside the existing `authFailureTimes` cleanup. Closes a CWE-770 unbounded-memory class for long-running mail servers seeing transient IP fan-in."
|
|
874
|
+
},
|
|
875
|
+
{
|
|
876
|
+
"title": "`b.mail.server.imap` `_close()` writes `state.stage = \"closed\"`",
|
|
877
|
+
"body": "The drain-loop guard was previously unreachable because the close path didn't update the state machine. Operators on the older path saw `state.stage === \"authenticated\"` linger after socket close; the new path resolves cleanly."
|
|
878
|
+
},
|
|
879
|
+
{
|
|
880
|
+
"title": "`b.mail.server.imap` per-line cap before `Buffer.concat`",
|
|
881
|
+
"body": "Closes a CWE-770 unbounded-`Buffer.concat` class on the IMAP line accumulator (the cap was applied AFTER concat, so a malicious peer could send 10 GiB of unterminated tag bytes and the listener would allocate before refusing). Per-line cap now gates the concat."
|
|
882
|
+
},
|
|
883
|
+
{
|
|
884
|
+
"title": "`b.mail.server.pop3` `_handleApop` cleartext refusal",
|
|
885
|
+
"body": "APOP gets the same `!state.tls && profile !== \"permissive\"` refusal as USER / PASS, closing the cleartext-credentials gap symmetric to the other auth verbs (RFC 1939 §7 APOP MD5 is also cleartext in transit)."
|
|
886
|
+
},
|
|
887
|
+
{
|
|
888
|
+
"title": "`b.mail.server.pop3` RETR / TOP dot-stuffing via `safeSmtp.dotStuff(buf)`",
|
|
889
|
+
"body": "The prior `.replace(/^\\./gm, \"..\")` on a JS string treats bare LF as a line boundary, so bodies containing bare-LF lines starting with `.` gained spurious stuffing that the receiver's strict-CRLF parser couldn't undo. Routes through the byte-level dot-stuffer that only recognizes canonical `\\r\\n` (RFC 1939 §3 / RFC 5321 §4.5.2)."
|
|
890
|
+
},
|
|
891
|
+
{
|
|
892
|
+
"title": "`b.mail.store` deletion atomicity",
|
|
893
|
+
"body": "Sealed deletion no longer leaves partial state when the in-memory delete succeeds but the disk flush fails (CWE-707 transactional integrity)."
|
|
894
|
+
},
|
|
895
|
+
{
|
|
896
|
+
"title": "`b.mail.server.submission` cleartext-AUTH audit captures mechanism",
|
|
897
|
+
"body": "The `auth_success` audit emit captures the `mechanism` field before nulling `authPending` (was recording `null`); operators tailing the audit log now see which SASL mechanism succeeded."
|
|
898
|
+
}
|
|
899
|
+
]
|
|
900
|
+
},
|
|
901
|
+
{
|
|
902
|
+
"heading": "Detectors",
|
|
903
|
+
"items": [
|
|
904
|
+
{
|
|
905
|
+
"title": "Rate-limit admit-check shape across mail listeners",
|
|
906
|
+
"body": "New `family-subset` entry covering the rate-limit admit-check shape across `mail-server-{imap,mx,submission}` so the contract is enforced at every listener (every primitive that opens a peer socket on a mail port must consult the rate limiter before sending the greeting)."
|
|
907
|
+
}
|
|
908
|
+
]
|
|
909
|
+
},
|
|
910
|
+
{
|
|
911
|
+
"heading": "Migration",
|
|
912
|
+
"items": [
|
|
913
|
+
{
|
|
914
|
+
"title": "Operator impact — new opts default applied retroactively",
|
|
915
|
+
"body": "`b.mail.server.rateLimit` consumers see a new public surface (`checkRcptAdmit` / `noteRcptFailure`); existing operators who don't wire these get the framework default (50/min). `b.safeMime.parse` callers with >512-header messages now get `safe-mime/too-many-headers` — operators with bespoke headers (DMARC aggregate reports can run into hundreds of `Authentication-Results`) opt up via `maxHeaderCount: 4096` per call. POP3 operators see a new `commitTimeoutMs` opt — default applies retroactively."
|
|
916
|
+
}
|
|
917
|
+
]
|
|
918
|
+
}
|
|
919
|
+
],
|
|
920
|
+
"references": [
|
|
921
|
+
{
|
|
922
|
+
"label": "RFC 5321 §3.5 SMTP",
|
|
923
|
+
"url": "https://www.rfc-editor.org/rfc/rfc5321#section-3.5"
|
|
924
|
+
},
|
|
925
|
+
{
|
|
926
|
+
"label": "RFC 5322 Message Format",
|
|
927
|
+
"url": "https://www.rfc-editor.org/rfc/rfc5322"
|
|
928
|
+
},
|
|
929
|
+
{
|
|
930
|
+
"label": "RFC 1939 POP3",
|
|
931
|
+
"url": "https://www.rfc-editor.org/rfc/rfc1939"
|
|
932
|
+
},
|
|
933
|
+
{
|
|
934
|
+
"label": "RFC 2369 §3.1 List-Unsubscribe",
|
|
935
|
+
"url": "https://www.rfc-editor.org/rfc/rfc2369#section-3.1"
|
|
936
|
+
},
|
|
937
|
+
{
|
|
938
|
+
"label": "CWE-770 Allocation of Resources Without Limits",
|
|
939
|
+
"url": "https://cwe.mitre.org/data/definitions/770.html"
|
|
940
|
+
},
|
|
941
|
+
{
|
|
942
|
+
"label": "CWE-707 Improper Neutralization",
|
|
943
|
+
"url": "https://cwe.mitre.org/data/definitions/707.html"
|
|
944
|
+
}
|
|
945
|
+
]
|
|
946
|
+
},
|
|
947
|
+
{
|
|
948
|
+
"version": "0.10.3",
|
|
949
|
+
"date": "2026-05-16",
|
|
950
|
+
"headline": "`b.crypto` hardening — three entry-tier refusals on hot paths",
|
|
951
|
+
"summary": "Three small entry-tier refusals on `b.crypto.timingSafeEqual`, `b.crypto.hashCertFingerprint`, and `b.crypto.namespaceHash` close prototype-pollution coercion, polynomial-ReDoS, and log-injection shapes on hot paths.",
|
|
952
|
+
"sections": [
|
|
953
|
+
{
|
|
954
|
+
"heading": "Fixed",
|
|
955
|
+
"items": [
|
|
956
|
+
{
|
|
957
|
+
"title": "`b.crypto.timingSafeEqual` rejects non-Buffer / non-string inputs",
|
|
958
|
+
"body": "Previous `Buffer.from(String(x))` coercion let a prototype-pollution-influenced caller (an Object whose `toString` returns attacker-chosen bytes) redirect the compare through bytes unrelated to the supplied value. Now throws `TypeError` at the entry boundary; string args use explicit `Buffer.from(s, \"utf8\")` instead of bare coercion."
|
|
959
|
+
},
|
|
960
|
+
{
|
|
961
|
+
"title": "`b.crypto.hashCertFingerprint` caps PEM input at 64 KiB",
|
|
962
|
+
"body": "The `/-----BEGIN .+? -----END/` lazy-quantifier on this hot path (mTLS bootstrap / webhook verification / peer-cert pinning) is polynomial-ReDoS-class on multi-MB attacker-controlled input. 64 KiB covers a P-384 cert + full chain at ~3× margin; larger inputs throw `TypeError` before the regex runs."
|
|
963
|
+
},
|
|
964
|
+
{
|
|
965
|
+
"title": "`b.crypto.namespaceHash` refuses CR / LF in string-typed `value`",
|
|
966
|
+
"body": "Closes a log-injection / record-separator surface where an attacker-controlled HTTP header (e.g. `Idempotency-Key`) could smuggle line-break bytes into any consumer that logs the value verbatim before hashing (debug paths, audit envelopes, derived-column shadow logs). NUL is NOT refused — multiple internal callers (`b.agent.idempotency` / `b.mail.greylist` / `b.middleware.composePipeline`) use NUL as a composite-key separator, and NUL is not a log-injection byte in any standard logger. `Buffer` / `Uint8Array` inputs remain operator-side opaque bytes by contract — `namespaceHash` digests them as raw bytes, not as text, so the control-char gate does not apply there either."
|
|
967
|
+
}
|
|
968
|
+
]
|
|
969
|
+
},
|
|
970
|
+
{
|
|
971
|
+
"heading": "Migration",
|
|
972
|
+
"items": [
|
|
973
|
+
{
|
|
974
|
+
"title": "Operator impact — entry-tier throws on coerced / oversized / line-break inputs",
|
|
975
|
+
"body": "Any caller passing a number / Object / boolean to `b.crypto.timingSafeEqual` now throws at the entry boundary instead of silently comparing coerced bytes — the API contract was already documented as Buffer-or-string, this enforces it. PEM strings larger than 64 KiB to `b.crypto.hashCertFingerprint` now throw — operators with bespoke multi-cert bundles split the inputs before calling. `namespaceHash` callers passing strings with embedded CR / LF now throw — operators ingesting attacker-influenced text validate / strip line-break bytes at the boundary, or hash opaque bytes via `Buffer` / `Uint8Array`."
|
|
976
|
+
}
|
|
977
|
+
]
|
|
978
|
+
}
|
|
979
|
+
],
|
|
980
|
+
"references": [
|
|
981
|
+
{
|
|
982
|
+
"label": "OWASP Log Injection",
|
|
983
|
+
"url": "https://owasp.org/www-community/attacks/Log_Injection"
|
|
984
|
+
},
|
|
985
|
+
{
|
|
986
|
+
"label": "CWE-117 Improper Output Neutralization for Logs",
|
|
987
|
+
"url": "https://cwe.mitre.org/data/definitions/117.html"
|
|
988
|
+
},
|
|
989
|
+
{
|
|
990
|
+
"label": "CWE-1333 ReDoS",
|
|
991
|
+
"url": "https://cwe.mitre.org/data/definitions/1333.html"
|
|
992
|
+
},
|
|
993
|
+
{
|
|
994
|
+
"label": "CodeQL js/polynomial-redos",
|
|
995
|
+
"url": "https://codeql.github.com/codeql-query-help/javascript/js-polynomial-redos/"
|
|
996
|
+
}
|
|
997
|
+
]
|
|
998
|
+
},
|
|
999
|
+
{
|
|
1000
|
+
"version": "0.10.2",
|
|
1001
|
+
"date": "2026-05-16",
|
|
1002
|
+
"headline": "CVE backstops layered on top of v0.10.0",
|
|
1003
|
+
"summary": "Five additional refusals across `b.guardRegex`, `b.otelExport`, `b.guardXml`, `b.guardGraphql`, plus a host-side ingress route for `b.cli`. Every change is opt-out (refusal at every profile); no API removals.",
|
|
1004
|
+
"sections": [
|
|
1005
|
+
{
|
|
1006
|
+
"heading": "Added",
|
|
1007
|
+
"items": [
|
|
1008
|
+
{
|
|
1009
|
+
"title": "`b.guardRegex` glob-shape detectors with explicit `inputKind` gate",
|
|
1010
|
+
"body": "New `consecutiveStarPolicy` + `nestedExtglobPolicy` (defaults `\"reject\"`) + `maxConsecutiveStars` (default 2) + `inputKind: \"regex\" | \"glob\"` (default `\"regex\"`). The glob-shape detectors fire ONLY when the caller passes `inputKind: \"glob\"` — ECMAScript regex syntax cannot produce `***` (SyntaxError) and the extglob heads `*(`/`+(`/`?(`/`@(`/`!(` collide with valid `quantifier + capturing group` shapes, so applying these detectors to regex inputs is false-positive territory. Callers handling glob fragments (picomatch / micromatch-style patterns) opt in via `inputKind: \"glob\"` and get refusals for >=3 consecutive `*` metacharacters (CVE-2026-26996 — O(4^N) backtracking on non-matching literal) and for any extglob whose body contains another extglob (CVE-2026-33671 — picomatch nested-quantifier backtracking). `**` recursive-glob stays permitted under `maxConsecutiveStars: 2`."
|
|
1011
|
+
},
|
|
1012
|
+
{
|
|
1013
|
+
"title": "`b.cli --ignore` ReDoS ingress closure",
|
|
1014
|
+
"body": "`cli --ignore <pattern>` arguments route through `b.guardRegex.sanitize({ profile: \"strict\" })` before reaching `new RegExp(pattern)`. Strict-profile refusal of nested-quantifier / lookaround-quantifier / unbounded-bounded-repeat shapes still applies in default `inputKind: \"regex\"` mode, closing the host-side surface for the classic ReDoS classes."
|
|
1015
|
+
},
|
|
1016
|
+
{
|
|
1017
|
+
"title": "`b.otelExport.flush()` response cap",
|
|
1018
|
+
"body": "Every outbound OTLP request now pins `maxResponseBytes: 1 MiB` + a typed `errorClass`, so a malicious / misconfigured collector cannot exhaust memory in the export loop (CVE-2026-40891 / CVE-2026-40182 class)."
|
|
1019
|
+
},
|
|
1020
|
+
{
|
|
1021
|
+
"title": "`b.guardXml` numeric-character-reference fan-out cap",
|
|
1022
|
+
"body": "New `maxNumericCharRefs` opt (strict 1024 / balanced 16384 / permissive 262144). NCRs are counted independently of `entityPolicy`, so a signed-XML path that legitimately permits entity expansion cannot accidentally disable the NCR cap (CVE-2026-26278 / CVE-2026-33036 — billion-NCR fan-out class)."
|
|
1023
|
+
},
|
|
1024
|
+
{
|
|
1025
|
+
"title": "`b.guardGraphql` prototype-pollution refusal",
|
|
1026
|
+
"body": "Refuses `__proto__` / `constructor` / `prototype` as top-level variable keys (`Object.prototype.hasOwnProperty.call(variables, ...)` check, sidesteps a poisoned-prototype `in` lookup) AND as field / alias / `$variable` identifiers in the query body, including the no-whitespace alias form `query { a:__proto__ }` (the colon is a valid identifier-position prefix). Refused at every profile, severity `critical` (CVE-2026-32621 class)."
|
|
1027
|
+
}
|
|
1028
|
+
]
|
|
1029
|
+
},
|
|
1030
|
+
{
|
|
1031
|
+
"heading": "Changed",
|
|
1032
|
+
"items": [
|
|
1033
|
+
{
|
|
1034
|
+
"title": "`b.auth.sdJwtVc.present()` defense-in-depth comment",
|
|
1035
|
+
"body": "Documents that the holder-side pre-parse of `_sd_alg` reads from unsigned bytes safely because `verify()` re-parses from the cryptographically-verified signing input; no behavioral change."
|
|
1036
|
+
},
|
|
1037
|
+
{
|
|
1038
|
+
"title": "Operator impact summary",
|
|
1039
|
+
"body": "Existing operators see no change in default behavior — the new glob detectors are opt-in via `inputKind: \"glob\"`. Operators wiring `b.guardRegex` over glob fragments (file-pattern allowlists, rsync-style rules) opt in and get the CVE-2026-26996 / -33671 refusals; opt back out per call via `consecutiveStarPolicy: \"allow\"` / `nestedExtglobPolicy: \"allow\"`. `b.guardXml` operators on signed-XML pipelines opt out via `maxNumericCharRefs: Infinity` if they bound NCRs upstream. GraphQL variable / query-body refusals are not opt-out — `__proto__` / `constructor` / `prototype` are never legitimate identifiers in operator-supplied input."
|
|
1040
|
+
}
|
|
1041
|
+
]
|
|
1042
|
+
},
|
|
1043
|
+
{
|
|
1044
|
+
"heading": "Fixed",
|
|
1045
|
+
"items": [
|
|
1046
|
+
{
|
|
1047
|
+
"title": "Regression coverage in exploit corpus",
|
|
1048
|
+
"body": "`test/fixtures/exploit-corpus/corpus.json` gains four entries: glob-mode positive refusal for `***+nonmatch` and `*(*(a))`, regex-mode pass for `a*(b+(c))` (false-positive class the design refused to ship), and the colon-prefix GraphQL alias `query { a:__proto__ }`."
|
|
1049
|
+
}
|
|
1050
|
+
]
|
|
1051
|
+
}
|
|
1052
|
+
],
|
|
1053
|
+
"references": [
|
|
1054
|
+
{
|
|
1055
|
+
"label": "CVE-2026-26996",
|
|
1056
|
+
"url": "https://nvd.nist.gov/vuln/detail/CVE-2026-26996"
|
|
1057
|
+
},
|
|
1058
|
+
{
|
|
1059
|
+
"label": "CVE-2026-33671",
|
|
1060
|
+
"url": "https://nvd.nist.gov/vuln/detail/CVE-2026-33671"
|
|
1061
|
+
},
|
|
1062
|
+
{
|
|
1063
|
+
"label": "CVE-2026-40891",
|
|
1064
|
+
"url": "https://nvd.nist.gov/vuln/detail/CVE-2026-40891"
|
|
1065
|
+
},
|
|
1066
|
+
{
|
|
1067
|
+
"label": "CVE-2026-40182",
|
|
1068
|
+
"url": "https://nvd.nist.gov/vuln/detail/CVE-2026-40182"
|
|
1069
|
+
},
|
|
1070
|
+
{
|
|
1071
|
+
"label": "CVE-2026-26278",
|
|
1072
|
+
"url": "https://nvd.nist.gov/vuln/detail/CVE-2026-26278"
|
|
1073
|
+
},
|
|
1074
|
+
{
|
|
1075
|
+
"label": "CVE-2026-33036",
|
|
1076
|
+
"url": "https://nvd.nist.gov/vuln/detail/CVE-2026-33036"
|
|
1077
|
+
},
|
|
1078
|
+
{
|
|
1079
|
+
"label": "CVE-2026-32621",
|
|
1080
|
+
"url": "https://nvd.nist.gov/vuln/detail/CVE-2026-32621"
|
|
1081
|
+
},
|
|
1082
|
+
{
|
|
1083
|
+
"label": "picomatch CVE-2024-4067 family",
|
|
1084
|
+
"url": "https://nvd.nist.gov/vuln/detail/CVE-2024-4067"
|
|
1085
|
+
},
|
|
1086
|
+
{
|
|
1087
|
+
"label": "OWASP ReDoS",
|
|
1088
|
+
"url": "https://owasp.org/www-community/attacks/Regular_expression_Denial_of_Service_-_ReDoS"
|
|
1089
|
+
},
|
|
1090
|
+
{
|
|
1091
|
+
"label": "OWASP XXE / Billion Laughs",
|
|
1092
|
+
"url": "https://owasp.org/www-community/vulnerabilities/XML_Entity_Expansion"
|
|
1093
|
+
},
|
|
1094
|
+
{
|
|
1095
|
+
"label": "GraphQL Server Security Best Practices",
|
|
1096
|
+
"url": "https://www.apollographql.com/docs/router/configuration/overview/"
|
|
1097
|
+
}
|
|
1098
|
+
]
|
|
1099
|
+
},
|
|
1100
|
+
{
|
|
1101
|
+
"version": "0.10.1",
|
|
1102
|
+
"date": "2026-05-16",
|
|
1103
|
+
"headline": "First npm-published v0.10.x artifact",
|
|
1104
|
+
"summary": "v0.10.0 was tagged and released on GitHub but its npm-publish workflow OOM'd at the lint+smoke gate (default Node ~4GB heap could not load the expanded mail-stack + audit-fix test surface). v0.10.1 ships the workflow fix; no runtime or API changes from v0.10.0.",
|
|
1105
|
+
"sections": [
|
|
1106
|
+
{
|
|
1107
|
+
"heading": "Fixed",
|
|
1108
|
+
"items": [
|
|
1109
|
+
{
|
|
1110
|
+
"title": "npm-publish workflow heap headroom",
|
|
1111
|
+
"body": "Adds `NODE_OPTIONS=--max-old-space-size=8192` to the workflow's smoke step so the parent process gets the same headroom the forked test workers already get. No runtime / API changes from v0.10.0 — every primitive, posture, and security default ships exactly as documented in the v0.10.0 release notes. Operators who fetched the v0.10.0 git tag can re-tag from v0.10.1 (`git fetch origin v0.10.1`) to land on the npm-published commit; the framework code itself is byte-identical apart from the workflow file + version bump."
|
|
1112
|
+
}
|
|
1113
|
+
]
|
|
1114
|
+
}
|
|
1115
|
+
]
|
|
1116
|
+
},
|
|
1117
|
+
{
|
|
1118
|
+
"version": "0.10.0",
|
|
1119
|
+
"date": "2026-05-16",
|
|
1120
|
+
"headline": "Mail-stack feature-complete + cross-surface hardening",
|
|
1121
|
+
"summary": "Bundled minor closing the blamepost mail-stack roadmap (five new operator-facing namespaces) plus a multi-domain hardening across auth, crypto, vendor data, mail-protocol, mail-auth, agent substrate, and Node.js CVE backstops. Every change is read-side-compatible — existing sealed rows continue to read; new INSERTs adopt AAD-bound envelopes.",
|
|
1122
|
+
"sections": [
|
|
1123
|
+
{
|
|
1124
|
+
"heading": "Added",
|
|
1125
|
+
"items": [
|
|
1126
|
+
{
|
|
1127
|
+
"title": "`b.mail.server.managesieve` — RFC 5804 ManageSieve listener (TCP/4190)",
|
|
1128
|
+
"body": "Script-management listener for MUAs to upload + activate Sieve filters. Composes `b.safeSieve.validate` for PUTSCRIPT pre-validation per §2.3 + `b.guardManageSieveCommand` + `b.mail.server.rateLimit`. State machine NOT-AUTHENTICATED → STARTTLS → AUTHENTICATED → LOGOUT. SCRAM-SHA-256 / OAUTHBEARER / EXTERNAL; PLAIN refused pre-TLS under strict. STARTTLS-injection defense (CVE-2021-38371, CVE-2021-33515, CVE-2011-0411). CAPABILITY advertises AUTH=<mech> only for operator-wired mechanisms. Script-name shape per §2.1 (1–512 octets, no NUL/CR/LF/slash — path-traversal defense)."
|
|
1129
|
+
},
|
|
1130
|
+
{
|
|
1131
|
+
"title": "`b.safeIcap` + `b.mail.scan` + `b.mail.spamScore` — content-inspection suite",
|
|
1132
|
+
"body": "safeIcap is the bounded RFC 3507 ICAP response parser (status-code allowlist refuses unexpected 1xx/3xx — header-injection class). mail.scan composes safeIcap for ICAP RESPMOD + a raw ClamAV INSTREAM backend; optionally composes `b.guardArchive` for zip-slip / hardlink-escape refusal before the AV daemon sees the bytes. mail.spamScore is the operator-scorer-hook pipeline with threshold comparison + reason-tag hardening (per-tag 256-byte cap, ≤32 tags, control-byte refusal)."
|
|
1133
|
+
},
|
|
1134
|
+
{
|
|
1135
|
+
"title": "`b.mail.crypto.pgp` — RFC 9580 v4 OpenPGP detached-signature sign + verify",
|
|
1136
|
+
"body": "Hand-rolled v4 signature packets via `node:crypto` only — no third-party crypto vendored. Ed25519Legacy (pub-alg 22) + RSA (pub-alg 1, EMSA-PKCS1-v1_5 + SHA-256). ASCII armor with CRC-24 + BEGIN/END framing per §6. RFC 3156 multipart/signed wrapper. Hash-left-16 fast-fail per §5.2.4. Fingerprint pinning enforces issuer-fpr subpacket equality (key-substitution defense). Refuses RSA < 2048 bits per RFC 8301 §3.1. EFAIL (CVE-2017-17688 / CVE-2017-17689) threat model documented. PGP encrypt + decrypt and v6 signatures are deferred-with-condition (reopens when operator demand or ≥2 major impls ship v6 verify-by-default)."
|
|
1137
|
+
},
|
|
1138
|
+
{
|
|
1139
|
+
"title": "`b.mail.crypto.smime` — RFC 8551 S/MIME 4.0 v1",
|
|
1140
|
+
"body": "Ships `checkCert(certPem)` operator-side cert preflight refusing SHA-1 / MD5 cert signatures + sub-2048-bit RSA — defends CVE-2017-9006 class. `sign()` + `verify()` deferred-with-condition: `node:crypto` exposes no CMS codec; hand-rolling RFC 5652 BER/DER + §5.4 set-of attribute DER sort lights up in v0.10.13's `b.cms` codec. Operator escape hatch: wire `node-forge` / `pkijs` / `openssl(1)` in consumer code."
|
|
1141
|
+
},
|
|
1142
|
+
{
|
|
1143
|
+
"title": "`b.safeIcal` + `b.safeVcard` + `b.mail.dav` — calendar + contacts protocol suite",
|
|
1144
|
+
"body": "safeIcal is the bounded RFC 5545 iCalendar parser. Defends CVE-2024-39687 (ical4j RRULE recursion / Outlook calendar bomb): RRULE COUNT > 10 000 + BYxxx list > 24 refused regardless of profile. safeVcard is the RFC 6350 vCard 4.0 parser. mail.dav — CalDAV (RFC 4791) + CardDAV (RFC 6352) HTTP route handlers + RFC 6764 `.well-known/caldav` + `.well-known/carddav` discovery. Verbs: OPTIONS, PROPFIND, REPORT (calendar-query + calendar-multiget + addressbook-query + addressbook-multiget), GET, PUT, DELETE, MKCALENDAR, MKCOL. Per-tenant URL isolation — every URL must start with `/<principal>/...`; cross-principal access refused 403. PUT-body validation through safeIcal / safeVcard before the storage backend sees it. Path-traversal (`..`, `%2e%2e`, NUL byte) refused 400. ETag preconditions (412 on If-Match mismatch). XML body parsing via `b.xmlC14n.parse` (DOCTYPE/ENTITY refused — XXE / billion-laughs defense). WebDAV ACL (RFC 3744), CalDAV scheduling (RFC 6638), iTIP-over-mail handler + iMIP (RFC 6047), JSCalendar (RFC 8984), xCard / jCard (RFC 6351 / 7095), and `sync-collection` (RFC 6578) are deferred-with-condition."
|
|
1145
|
+
},
|
|
1146
|
+
{
|
|
1147
|
+
"title": "Auth hardening across `lib/auth/*` + bearer-auth + fetch-metadata",
|
|
1148
|
+
"body": "JWT `alg` / `kty` confusion defenses, mandatory `crit` checking, nonce-replay protection, DPoP-bound access token verification, PRM (PAR) request-object validation, WebAuthn FAL (RFC 9470 fed-auth-level) signaling, multi-credential SASL state machine for IMAP / POP3 / SMTP-submission. Closes 22 audit findings."
|
|
1149
|
+
},
|
|
1150
|
+
{
|
|
1151
|
+
"title": "Crypto-surface hardening — AAD-bound seals + corrupt-row no-delete + base64url strict + parallel hash defaults",
|
|
1152
|
+
"body": "AAD-bound sealed columns: `b.cryptoField.registerTable({ aad: true, rowIdField, schemaVersion })` + `b.vault.aad.seal` integration; DB-write attacker who copies a sealed value from one row into another row triggers Poly1305 verification failure on read. `b.middleware.idempotencyKey.dbStore` adopts AAD form by default; existing plain-vault rows continue to read via shape auto-detect. `b.middleware.idempotencyKey.dbStore({ fingerprintSeal: true })` — cached request fingerprint is now an HMAC under a vault-derived secret by default. `b.middleware.idempotencyKey({ bodyFingerprintFallback: \"deny\" })` — body-bearing requests without parsed body refused HTTP 400 by default (previously silently degraded to method+path-only). Corrupt-row no-delete in dbStore — unseal failure emits audit + returns null instead of deleting (closes a key-presence oracle). `b.crypto.fromBase64Url(s, { strict: true })` — crypto-context base64url decoding refuses non-canonical input by default (CVE-2022-0235 class). `b.crypto.hashFilesParallel` default-refuses symlinks (opt-in via `followSymlinks: true`), refuses FIFOs / sockets / character / block devices, caps per-file read at 1 GiB by default. `b.vendorData` SLH-DSA-SHAKE-256f pubkey-fingerprint cross-check — every per-entry signature verify now compares declared fingerprint against actual `sha256(pemToRaw(PUBKEY_PEM))`. `b.metrics.snapshot.startWriter({ fileMode })` defaults `0o640` + credential-shape redaction in label coercion ([REDACTED-CREDENTIAL] for RFC 6750 Bearer / RFC 7617 Basic / Stripe `sk-` / GitHub `ghp_` / JWT three-segment / high-entropy >40-char tokens). `b.network.tls.wrapSNICallback(operatorCb)` exposes the synchronous-throw catch wrapper (CVE-2026-21637). `b.selfUpdate.compareTags` strict SemVer 2.0.0 §11 pre-release ordering (numeric identifiers compare as numbers; numeric < alphanumeric; no-pre > with-pre; build metadata ignored per §10). `b.retry.backoffDelay` jitter via `Math.random` (no CSPRNG burn under retry storms — the per-request delay is observable to every peer by construction)."
|
|
1153
|
+
},
|
|
1154
|
+
{
|
|
1155
|
+
"title": "Vendor-data / supply-chain hardening — CSAF 2.1 + audited boot-verify deferral + split SBOM",
|
|
1156
|
+
"body": "`b.vex` upgrades to CSAF 2.1 conformance (operator-supplied `vulnerabilities[].cwes` per §3.2.3.4, TLP 2.0 with AMBER+STRICT label, structured profile selection). `BLAMEJS_VENDOR_DATA_DEFER_BOOT_VERIFY=1` now requires a non-empty `BLAMEJS_VENDOR_DATA_DEFER_BOOT_VERIFY_REASON` companion env var + emits `vendor-data.boot_verify_deferred` audit (SSDF PW.4 — every security-default-disable lives in the audit log with an operator-attributed reason). SBOM split into module + vendored CycloneDX 1.6 documents with Sigstore-keyless signatures."
|
|
1157
|
+
},
|
|
1158
|
+
{
|
|
1159
|
+
"title": "Agent substrate hardening — signed snapshots, persisted saga state, per-tenant HKDF keys",
|
|
1160
|
+
"body": "`b.agent.snapshot` snapshots are sealed + Ed25519-signed at write + signature-verified at read (every operator who uses snapshot/restore inherits tamper detection). `b.agent.saga` persists per-step compensation state to the sealed backing store. `b.agent.tenant` derives per-tenant vault keys via HKDF-SHA3-512 over a tenant-ID label (per-tenant blast radius bound). `b.outbox` consumer + saga step `_runHandler` route user-supplied callbacks through the same try/catch + typed-audit shape."
|
|
1161
|
+
}
|
|
1162
|
+
]
|
|
1163
|
+
},
|
|
1164
|
+
{
|
|
1165
|
+
"heading": "Changed",
|
|
1166
|
+
"items": [
|
|
1167
|
+
{
|
|
1168
|
+
"title": "Mail-auth hardening — DKIM `l=` removed, dual-permerror SPF, DMARC report bounds, ARC `i=` monotonic",
|
|
1169
|
+
"body": "DKIM — `b.mail.dkim.verify` refuses `l=` body-length tag (RFC 6376 §3.5 deprecated; downgrade attack class), enforces strict canonical/simple body algorithm match, refuses RSA < 2048 (RFC 8301 §3.1). SPF — dual-permerror posture (refuses both `+all` and missing-record states as a permerror under strict). DMARC — aggregate-report parser bounds (max 1 MiB raw / 8 MiB unzipped; refuses external XML entities). ARC — chain-validation `i=` strict-monotonic-increment enforcement, instance count cap of 50 (CVE-2023-44388 class)."
|
|
1170
|
+
},
|
|
1171
|
+
{
|
|
1172
|
+
"title": "Mail-protocol close-out — STARTTLS upgrade helper + smuggling detect + dot-stuffing + close-state guards",
|
|
1173
|
+
"body": "`b.mail.server.tls.upgradeSocket` — new shared STARTTLS / STLS upgrade helper used by every mail listener (removes plain-socket `\"data\"` listener before TLSSocket wraps, defense vs CVE-2021-33515 Dovecot / CVE-2021-38371 Exim STARTTLS-injection); new mail-protocol listeners trip a codebase-patterns detector if they construct a `TLSSocket` from an attached plain socket directly. IMAP STARTTLS drain extended (`pendingLiteral` + `authPending` cleared at upgrade alongside `lineBuffer`). `b.guardSmtpCommand.detectBodySmuggling` covers `\\n.\\n` / `\\r\\n.\\n` / `\\n.\\r\\n` / buffer-start dot / bare-CR variants (CVE-2023-51764 / -51765 / -51766 / 2024-32178). `b.safeMime` RFC 2047 header-injection defense — encoded-word decoders refuse decoded CR / LF / NUL (CVE-2020-7244 class). Submission listener PIPELINING DATA-race gate — when `rcptsPending > 0` (async recipientPolicy not yet resolved), DATA returns `451 4.5.0 RCPT TO verdicts pending`. Submission `auth_success` audit captures mechanism before nulling `authPending` (was recording null). POP3 cleartext USER / PASS gate — refuses over cleartext under non-permissive even if guard-* bypassed. POP3 RETR / TOP dot-stuffing routes through `b.safeSmtp.dotStuff(buf)` on raw Buffer (strict-CRLF only). IMAP `_close` writes `state.stage = \"closed\"` (drain-loop guard was unreachable). IMAP per-line cap before `Buffer.concat` (CWE-770). `b.network.dns.resolver` `maxCacheEntries: 5000` LRU eviction (CWE-400/770). `b.mail.server.rateLimit.connectionTimes` GC sweep (closes asymmetric Map leak). `b.mail.create` outbound SMTP CRLF-injection refusal in `ehloName` / `user` / `pass` / `host` / `servername` (GHSA-c7w3-x93f-qmm8 nodemailer-CRLF class)."
|
|
1174
|
+
},
|
|
1175
|
+
{
|
|
1176
|
+
"title": "Node.js CVE backstops (January 2026 release)",
|
|
1177
|
+
"body": "`engines.node` is pinned at `>=24.14.1` (fixed-release floor); operator-side backstops mean deploys against older Node — or hostile peers that target shapes the parser fix doesn't bound — still don't crash, hang, or burn CPU. CVE-2026-21717 V8 HashDoS — query-string key count capped at 1000 distinct keys per request in `b.router`; `b.db.from(t).where({...})` capped at 256 keys. CVE-2026-21712 IDN crash via `url.format()` — adds `b.safeUrl.format(url, opts?)` with assertion-class throw caught + translated to a refused `safe-url/format-failed`. CVE-2026-22036 chained Content-Encoding amplification — `b.httpClient` refuses any response with more than one non-identity `Content-Encoding` layer. CVE-2026-4923 multi-wildcard router — `registerRoute` refuses patterns with more than 3 consecutive `*` metacharacters. CVE-2026-21710 prototype-poisoned `req.headersDistinct` — `b.requestHelpers.safeHeadersDistinct(req)` is the defensive replacement (null-prototype object, skips `__proto__` / `constructor` / `prototype`). CVE-2026-21714 H/2 WINDOW_UPDATE leak after GOAWAY — `b.router` tracks GOAWAY state per session + force-destroys on post-GOAWAY stream activity."
|
|
1178
|
+
}
|
|
1179
|
+
]
|
|
1180
|
+
},
|
|
1181
|
+
{
|
|
1182
|
+
"heading": "Detectors",
|
|
1183
|
+
"items": [
|
|
1184
|
+
{
|
|
1185
|
+
"title": "Six new codebase-patterns detectors",
|
|
1186
|
+
"body": "`inline-require-in-deferred` (require() inside setImmediate / process.nextTick / queueMicrotask lifts to top-of-file `lazyRequire`); `seal-without-aad` (`vault.seal` direct in dbStore-shaped paths routes through `vault.aad.seal`); `raw-mib-literal` (`N * 1024 * 1024` byte-shape literal routes through `C.BYTES.mib`); `hex-sha-compare-equals` (hex HMAC / MAC / signature compared with `timingSafeEqual` per CVE-2026-21713); `mountinfo-without-field4` (procfs bind-mount detection consults RFC 9293 mountinfo field 4); `tls-socket-without-upgrade-helper` (raw `new tls.TLSSocket(plainSocket, ...)` outside the shared upgrade helper)."
|
|
1187
|
+
}
|
|
1188
|
+
]
|
|
1189
|
+
},
|
|
1190
|
+
{
|
|
1191
|
+
"heading": "Migration",
|
|
1192
|
+
"items": [
|
|
1193
|
+
{
|
|
1194
|
+
"title": "Operator impact — read-side-compatible; opt-back-in routes documented",
|
|
1195
|
+
"body": "Every change is read-side-compatible. Existing pre-v0.10.0 sealed rows continue to read; new INSERTs under `b.middleware.idempotencyKey.dbStore` produce AAD-bound envelopes. The `bodyFingerprintFallback: \"deny\"` default refuses body-bearing requests that arrive without parsed-body data — operators with a documented method+path-only use case opt back into the prior behavior via `bodyFingerprintFallback: \"method-path-only\"`. `BLAMEJS_VENDOR_DATA_DEFER_BOOT_VERIFY=1` deploys now require a companion `_REASON` env var."
|
|
1196
|
+
}
|
|
1197
|
+
]
|
|
1198
|
+
}
|
|
1199
|
+
],
|
|
1200
|
+
"references": [
|
|
1201
|
+
{
|
|
1202
|
+
"label": "RFC 5804 ManageSieve",
|
|
1203
|
+
"url": "https://www.rfc-editor.org/rfc/rfc5804"
|
|
1204
|
+
},
|
|
1205
|
+
{
|
|
1206
|
+
"label": "RFC 3507 ICAP",
|
|
1207
|
+
"url": "https://www.rfc-editor.org/rfc/rfc3507"
|
|
1208
|
+
},
|
|
1209
|
+
{
|
|
1210
|
+
"label": "RFC 9580 OpenPGP",
|
|
1211
|
+
"url": "https://www.rfc-editor.org/rfc/rfc9580"
|
|
1212
|
+
},
|
|
1213
|
+
{
|
|
1214
|
+
"label": "RFC 8551 S/MIME 4.0",
|
|
1215
|
+
"url": "https://www.rfc-editor.org/rfc/rfc8551"
|
|
1216
|
+
},
|
|
1217
|
+
{
|
|
1218
|
+
"label": "RFC 5545 iCalendar",
|
|
1219
|
+
"url": "https://www.rfc-editor.org/rfc/rfc5545"
|
|
1220
|
+
},
|
|
1221
|
+
{
|
|
1222
|
+
"label": "RFC 6350 vCard 4.0",
|
|
1223
|
+
"url": "https://www.rfc-editor.org/rfc/rfc6350"
|
|
1224
|
+
},
|
|
1225
|
+
{
|
|
1226
|
+
"label": "RFC 4791 CalDAV",
|
|
1227
|
+
"url": "https://www.rfc-editor.org/rfc/rfc4791"
|
|
1228
|
+
},
|
|
1229
|
+
{
|
|
1230
|
+
"label": "RFC 6352 CardDAV",
|
|
1231
|
+
"url": "https://www.rfc-editor.org/rfc/rfc6352"
|
|
1232
|
+
},
|
|
1233
|
+
{
|
|
1234
|
+
"label": "RFC 6376 DKIM",
|
|
1235
|
+
"url": "https://www.rfc-editor.org/rfc/rfc6376"
|
|
1236
|
+
},
|
|
1237
|
+
{
|
|
1238
|
+
"label": "RFC 8301 DKIM RSA Key Size",
|
|
1239
|
+
"url": "https://www.rfc-editor.org/rfc/rfc8301"
|
|
1240
|
+
},
|
|
1241
|
+
{
|
|
1242
|
+
"label": "RFC 8617 ARC",
|
|
1243
|
+
"url": "https://www.rfc-editor.org/rfc/rfc8617"
|
|
1244
|
+
},
|
|
1245
|
+
{
|
|
1246
|
+
"label": "NIST SP 800-38D §5.2",
|
|
1247
|
+
"url": "https://nvlpubs.nist.gov/nistpubs/Legacy/SP/nistspecialpublication800-38d.pdf"
|
|
1248
|
+
},
|
|
1249
|
+
{
|
|
1250
|
+
"label": "OWASP A02 Cryptographic Failures",
|
|
1251
|
+
"url": "https://owasp.org/Top10/A02_2021-Cryptographic_Failures/"
|
|
1252
|
+
},
|
|
1253
|
+
{
|
|
1254
|
+
"label": "SemVer 2.0.0 §11",
|
|
1255
|
+
"url": "https://semver.org/spec/v2.0.0.html#spec-item-11"
|
|
1256
|
+
},
|
|
1257
|
+
{
|
|
1258
|
+
"label": "RFC 4648 §5 base64url",
|
|
1259
|
+
"url": "https://www.rfc-editor.org/rfc/rfc4648#section-5"
|
|
1260
|
+
},
|
|
1261
|
+
{
|
|
1262
|
+
"label": "RFC 6066 §3 SNI",
|
|
1263
|
+
"url": "https://www.rfc-editor.org/rfc/rfc6066#section-3"
|
|
1264
|
+
},
|
|
1265
|
+
{
|
|
1266
|
+
"label": "CVE-2024-39687 ical4j RRULE recursion",
|
|
1267
|
+
"url": "https://nvd.nist.gov/vuln/detail/CVE-2024-39687"
|
|
1268
|
+
},
|
|
1269
|
+
{
|
|
1270
|
+
"label": "CVE-2023-44388 ARC instance enumeration",
|
|
1271
|
+
"url": "https://nvd.nist.gov/vuln/detail/CVE-2023-44388"
|
|
1272
|
+
},
|
|
1273
|
+
{
|
|
1274
|
+
"label": "CVE-2021-33515 Dovecot STARTTLS",
|
|
1275
|
+
"url": "https://nvd.nist.gov/vuln/detail/CVE-2021-33515"
|
|
1276
|
+
},
|
|
1277
|
+
{
|
|
1278
|
+
"label": "CVE-2021-38371 Exim STARTTLS",
|
|
1279
|
+
"url": "https://nvd.nist.gov/vuln/detail/CVE-2021-38371"
|
|
1280
|
+
},
|
|
1281
|
+
{
|
|
1282
|
+
"label": "GHSA-c7w3-x93f-qmm8 nodemailer CRLF",
|
|
1283
|
+
"url": "https://github.com/advisories/GHSA-c7w3-x93f-qmm8"
|
|
1284
|
+
}
|
|
1285
|
+
]
|
|
1286
|
+
}
|
|
1287
|
+
]
|
|
1288
|
+
}
|