@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,1113 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* @module b.auditTools
|
|
4
|
+
* @nav Observability
|
|
5
|
+
* @title Audit Tools
|
|
6
|
+
*
|
|
7
|
+
* @intro
|
|
8
|
+
* Operator-side audit-chain inspection / export — verify chain
|
|
9
|
+
* integrity end-to-end, export RFC 8785 canonical-JSON slices,
|
|
10
|
+
* format rows for downstream SIEM (CADF / ISO 19395), and generate
|
|
11
|
+
* tamper-evident compliance-evidence bundles auditors can verify
|
|
12
|
+
* off-line.
|
|
13
|
+
*
|
|
14
|
+
* Four core operations on top of the live `audit_log` chain:
|
|
15
|
+
*
|
|
16
|
+
* archive(opts) Bundle rows older than `before` into a
|
|
17
|
+
* PQC-encrypted archive with chain proof + a
|
|
18
|
+
* covering signed checkpoint. Live rows are
|
|
19
|
+
* untouched until a separate `purge()` call.
|
|
20
|
+
* exportSlice(opts) Auditor-shaped slice (date range / action
|
|
21
|
+
* filter) with chain proof — deliver evidence
|
|
22
|
+
* to an external auditor without surrendering
|
|
23
|
+
* the whole log.
|
|
24
|
+
* verifyBundle(opts) Round-trip integrity: decrypt the bundle,
|
|
25
|
+
* walk chain math across the contained rows,
|
|
26
|
+
* verify the covering checkpoint's ML-DSA
|
|
27
|
+
* signature (archive bundles only).
|
|
28
|
+
* purge(opts) Confirmation-gated deletion of live rows
|
|
29
|
+
* already captured in a verified archive
|
|
30
|
+
* bundle. Inserts a purge-anchor so
|
|
31
|
+
* `b.audit.verify()` keeps working post-purge.
|
|
32
|
+
*
|
|
33
|
+
* Bundle layout (POSIX-flat directory; matches the backup-bundle
|
|
34
|
+
* shape so operators see one mental model for "encrypted blamejs
|
|
35
|
+
* bundle"):
|
|
36
|
+
*
|
|
37
|
+
* <out>/manifest.json Canonical-JSON manifest (format / kind /
|
|
38
|
+
* range / rowCount / per-blob salts /
|
|
39
|
+
* framework version; archive bundles also
|
|
40
|
+
* carry the covering checkpoint summary).
|
|
41
|
+
* <out>/rows.enc PQC-encrypted JSONL of audit rows in
|
|
42
|
+
* sealed form so rowHash stays computable
|
|
43
|
+
* from disk bytes byte-for-byte.
|
|
44
|
+
* <out>/checkpoint.enc Archive-only. PQC-encrypted JSON of the
|
|
45
|
+
* covering audit_checkpoints row.
|
|
46
|
+
*
|
|
47
|
+
* `kind="archive"` bundles always include a covering checkpoint
|
|
48
|
+
* (atMonotonicCounter >= lastCounter) so the off-chain signature
|
|
49
|
+
* tamper-evidences the whole archive. `kind="export"` bundles are
|
|
50
|
+
* auditor evidence; the chain math is self-contained, with the
|
|
51
|
+
* upstream signature anchor optional.
|
|
52
|
+
*
|
|
53
|
+
* @card
|
|
54
|
+
* Operator-side audit-chain inspection / export — verify chain integrity end-to-end, export RFC 8785 canonical-JSON slices, format rows for downstream SIEM (CADF / ISO 19395), and generate tamper-evident compliance-evidence bundles auditors can verify off-line.
|
|
55
|
+
*/
|
|
56
|
+
|
|
57
|
+
var nodeFs = require("node:fs");
|
|
58
|
+
var nodePath = require("node:path");
|
|
59
|
+
var pkg = require("../package.json");
|
|
60
|
+
var atomicFile = require("./atomic-file");
|
|
61
|
+
var auditChain = require("./audit-chain");
|
|
62
|
+
var canonicalJson = require("./canonical-json");
|
|
63
|
+
var auditSign = require("./audit-sign");
|
|
64
|
+
var backupCrypto = require("./backup/crypto");
|
|
65
|
+
var clusterStorage = require("./cluster-storage");
|
|
66
|
+
var lazyRequire = require("./lazy-require");
|
|
67
|
+
var validateOpts = require("./validate-opts");
|
|
68
|
+
var safeJson = require("./safe-json");
|
|
69
|
+
var { defineClass } = require("./framework-error");
|
|
70
|
+
|
|
71
|
+
var FRAMEWORK_VERSION = (pkg && pkg.version) || "unknown";
|
|
72
|
+
|
|
73
|
+
// Lazy `db` — db requires audit at top-of-file, audit transitively
|
|
74
|
+
// reaches into audit-tools via the operator-supplied default fns,
|
|
75
|
+
// so importing db at audit-tools' top would close the cycle. Lazy
|
|
76
|
+
// keeps the load order one-way.
|
|
77
|
+
var db = lazyRequire(function () { return require("./db"); });
|
|
78
|
+
|
|
79
|
+
var AuditToolsError = defineClass("AuditToolsError", { alwaysPermanent: true });
|
|
80
|
+
|
|
81
|
+
var BUNDLE_FORMAT = "blamejs-audit-bundle-v1";
|
|
82
|
+
var KIND_ARCHIVE = "archive";
|
|
83
|
+
var KIND_EXPORT = "export";
|
|
84
|
+
var VALID_KINDS = { archive: true, export: true };
|
|
85
|
+
|
|
86
|
+
// ---- Helpers ----
|
|
87
|
+
|
|
88
|
+
function _toMs(value) {
|
|
89
|
+
if (value == null) return null;
|
|
90
|
+
if (typeof value === "number") return value;
|
|
91
|
+
if (value instanceof Date) return value.getTime();
|
|
92
|
+
if (typeof value === "string") {
|
|
93
|
+
var ms = Date.parse(value);
|
|
94
|
+
if (isNaN(ms)) {
|
|
95
|
+
throw new AuditToolsError("audit-tools/bad-date",
|
|
96
|
+
"invalid date value: " + value);
|
|
97
|
+
}
|
|
98
|
+
return ms;
|
|
99
|
+
}
|
|
100
|
+
throw new AuditToolsError("audit-tools/bad-date",
|
|
101
|
+
"date must be a number, Date, or parseable string");
|
|
102
|
+
}
|
|
103
|
+
|
|
104
|
+
function _requirePassphrase(passphrase) {
|
|
105
|
+
if (!Buffer.isBuffer(passphrase) && typeof passphrase !== "string") {
|
|
106
|
+
throw new AuditToolsError("audit-tools/no-passphrase",
|
|
107
|
+
"opts.passphrase is required (Buffer or string)");
|
|
108
|
+
}
|
|
109
|
+
if (passphrase.length === 0) {
|
|
110
|
+
throw new AuditToolsError("audit-tools/no-passphrase",
|
|
111
|
+
"opts.passphrase must be non-empty");
|
|
112
|
+
}
|
|
113
|
+
}
|
|
114
|
+
|
|
115
|
+
function _requireOutDir(outDir, kind) {
|
|
116
|
+
if (typeof outDir !== "string" || outDir.length === 0) {
|
|
117
|
+
throw new AuditToolsError("audit-tools/no-outdir",
|
|
118
|
+
kind + ": opts.out is required");
|
|
119
|
+
}
|
|
120
|
+
if (nodeFs.existsSync(outDir)) {
|
|
121
|
+
throw new AuditToolsError("audit-tools/outdir-exists",
|
|
122
|
+
kind + ": out already exists: " + outDir +
|
|
123
|
+
" (refusing to overwrite — pick a fresh path)");
|
|
124
|
+
}
|
|
125
|
+
}
|
|
126
|
+
|
|
127
|
+
// Canonical-JSON via the shared lib/canonical-json walker — same bytes
|
|
128
|
+
// as audit-chain.canonicalize, config-drift._stableStringify, and
|
|
129
|
+
// pagination._canonicalize for the same input. Pre-v0.6.67 each site
|
|
130
|
+
// had its own copy of the walk, all carrying the same silent-loss bug
|
|
131
|
+
// for Date / Buffer / Map / Set / BigInt / circular renodeFs.
|
|
132
|
+
function _canonicalize(value) { return canonicalJson.stringify(value); }
|
|
133
|
+
|
|
134
|
+
// Convert a single audit_log row to its on-disk-canonical JSON shape.
|
|
135
|
+
// Buffers become hex strings (matches audit-chain.canonicalize). Used
|
|
136
|
+
// so JSONL written into rows.enc has the exact bytes a verifier needs
|
|
137
|
+
// to recompute rowHash.
|
|
138
|
+
function _rowToWireForm(row) {
|
|
139
|
+
var out = {};
|
|
140
|
+
var keys = Object.keys(row);
|
|
141
|
+
for (var i = 0; i < keys.length; i++) {
|
|
142
|
+
var k = keys[i];
|
|
143
|
+
var v = row[k];
|
|
144
|
+
if (Buffer.isBuffer(v)) out[k] = "hex:" + v.toString("hex");
|
|
145
|
+
else if (v instanceof Uint8Array) out[k] = "hex:" + Buffer.from(v).toString("hex");
|
|
146
|
+
else if (v === undefined) out[k] = null;
|
|
147
|
+
else out[k] = v;
|
|
148
|
+
}
|
|
149
|
+
return out;
|
|
150
|
+
}
|
|
151
|
+
|
|
152
|
+
// F-AUD-4 — operator-facing wire helper that surfaces recordedAt as
|
|
153
|
+
// ISO-8601 / RFC 3339 alongside the existing Unix-ms integer.
|
|
154
|
+
// Auditors comparing rows against external SIEM events expect ISO
|
|
155
|
+
// with explicit Z; the framework's primary ms storage stays
|
|
156
|
+
// unchanged AND _rowToWireForm (which the chain-hash canonicalizes
|
|
157
|
+
// over) doesn't change its bytes — so chain verify continues to
|
|
158
|
+
// match. Operators call this on retrieved rows for export.
|
|
159
|
+
/**
|
|
160
|
+
* @primitive b.auditTools.withRecordedAtIso
|
|
161
|
+
* @signature b.auditTools.withRecordedAtIso(row)
|
|
162
|
+
* @since 0.7.30
|
|
163
|
+
* @related b.auditTools.exportSlice, b.auditTools.exportCadf
|
|
164
|
+
*
|
|
165
|
+
* Surface `recordedAt` as ISO-8601 / RFC 3339 (with explicit `Z`)
|
|
166
|
+
* alongside the framework's primary Unix-ms integer. Auditors
|
|
167
|
+
* comparing rows against external SIEM events expect ISO; the chain
|
|
168
|
+
* hash is unaffected because the canonical wire form used for
|
|
169
|
+
* hashing doesn't include the derived `recordedAtIso` field.
|
|
170
|
+
*
|
|
171
|
+
* Returns a shallow copy with `recordedAtIso` added when
|
|
172
|
+
* `recordedAt` is a finite number / bigint; otherwise returns the
|
|
173
|
+
* input unchanged.
|
|
174
|
+
*
|
|
175
|
+
* @example
|
|
176
|
+
* var row = { _id: "evt-1", recordedAt: 1762560000000, action: "auth.login" };
|
|
177
|
+
* var formatted = b.auditTools.withRecordedAtIso(row);
|
|
178
|
+
* // → { _id: "evt-1", recordedAt: 1762560000000,
|
|
179
|
+
* // recordedAtIso: "2025-11-08T00:00:00.000Z", action: "auth.login" }
|
|
180
|
+
*/
|
|
181
|
+
function withRecordedAtIso(row) {
|
|
182
|
+
if (!row) return row;
|
|
183
|
+
var out = Object.assign({}, row);
|
|
184
|
+
if (typeof row.recordedAt === "number" || typeof row.recordedAt === "bigint") {
|
|
185
|
+
var ms = typeof row.recordedAt === "bigint" ? Number(row.recordedAt) : row.recordedAt;
|
|
186
|
+
if (isFinite(ms)) out.recordedAtIso = new Date(ms).toISOString();
|
|
187
|
+
}
|
|
188
|
+
return out;
|
|
189
|
+
}
|
|
190
|
+
|
|
191
|
+
function _wireFormToRow(wire) {
|
|
192
|
+
var out = {};
|
|
193
|
+
var keys = Object.keys(wire);
|
|
194
|
+
for (var i = 0; i < keys.length; i++) {
|
|
195
|
+
var k = keys[i];
|
|
196
|
+
var v = wire[k];
|
|
197
|
+
if (typeof v === "string" && v.indexOf("hex:") === 0) {
|
|
198
|
+
out[k] = Buffer.from(v.slice(4), "hex");
|
|
199
|
+
} else {
|
|
200
|
+
out[k] = v;
|
|
201
|
+
}
|
|
202
|
+
}
|
|
203
|
+
return out;
|
|
204
|
+
}
|
|
205
|
+
|
|
206
|
+
// Walk a slice of audit rows recomputing their hash chain. Returns
|
|
207
|
+
// { ok, rowsVerified, breakAt? }. The starting prevHash is the caller's
|
|
208
|
+
// responsibility — for archive/export slices it's the row preceding the
|
|
209
|
+
// slice's first row (which is itself in the bundle's manifest as a
|
|
210
|
+
// witness, or ZERO_HASH for slices that start at counter=1).
|
|
211
|
+
function _verifyChainSlice(rows, startPrevHash) {
|
|
212
|
+
var prevHash = startPrevHash;
|
|
213
|
+
for (var i = 0; i < rows.length; i++) {
|
|
214
|
+
var row = rows[i];
|
|
215
|
+
if (row.prevHash !== prevHash) {
|
|
216
|
+
return {
|
|
217
|
+
ok: false, rowsVerified: i, breakAt: i,
|
|
218
|
+
reason: "prevHash mismatch",
|
|
219
|
+
expected: prevHash,
|
|
220
|
+
actual: row.prevHash,
|
|
221
|
+
};
|
|
222
|
+
}
|
|
223
|
+
var fields = Object.assign({}, row);
|
|
224
|
+
delete fields.prevHash;
|
|
225
|
+
delete fields.rowHash;
|
|
226
|
+
delete fields.nonce;
|
|
227
|
+
delete fields.fencingToken;
|
|
228
|
+
var nonceBuf = Buffer.isBuffer(row.nonce) ? row.nonce : Buffer.from(row.nonce);
|
|
229
|
+
var computed = auditChain.computeRowHash(prevHash, fields, nonceBuf);
|
|
230
|
+
if (computed !== row.rowHash) {
|
|
231
|
+
return {
|
|
232
|
+
ok: false, rowsVerified: i, breakAt: i,
|
|
233
|
+
reason: "rowHash mismatch",
|
|
234
|
+
expected: computed,
|
|
235
|
+
actual: row.rowHash,
|
|
236
|
+
};
|
|
237
|
+
}
|
|
238
|
+
prevHash = row.rowHash;
|
|
239
|
+
}
|
|
240
|
+
return { ok: true, rowsVerified: rows.length, lastHash: prevHash };
|
|
241
|
+
}
|
|
242
|
+
|
|
243
|
+
// Read all audit rows from the operator's reader. Defaults to a
|
|
244
|
+
// cluster-storage reader so the tooling works in both single-node and
|
|
245
|
+
// cluster deployments without the caller knowing which mode is active.
|
|
246
|
+
async function _defaultReadRows(criteria) {
|
|
247
|
+
var sql = 'SELECT * FROM "audit_log"';
|
|
248
|
+
var conds = [];
|
|
249
|
+
var params = [];
|
|
250
|
+
if (criteria.fromMs != null) { conds.push("recordedAt >= ?"); params.push(criteria.fromMs); }
|
|
251
|
+
if (criteria.toMs != null) { conds.push("recordedAt <= ?"); params.push(criteria.toMs); }
|
|
252
|
+
if (criteria.beforeMs != null) { conds.push("recordedAt < ?"); params.push(criteria.beforeMs); }
|
|
253
|
+
if (criteria.action) { conds.push("action = ?"); params.push(criteria.action); }
|
|
254
|
+
if (criteria.firstCounter != null) { conds.push("monotonicCounter >= ?"); params.push(criteria.firstCounter); }
|
|
255
|
+
if (criteria.lastCounter != null) { conds.push("monotonicCounter <= ?"); params.push(criteria.lastCounter); }
|
|
256
|
+
if (conds.length > 0) sql += " WHERE " + conds.join(" AND ");
|
|
257
|
+
sql += " ORDER BY monotonicCounter ASC";
|
|
258
|
+
return clusterStorage.executeAll(sql, params);
|
|
259
|
+
}
|
|
260
|
+
|
|
261
|
+
async function _defaultReadCoveringCheckpoint(lastCounter) {
|
|
262
|
+
return clusterStorage.executeOne(
|
|
263
|
+
"SELECT * FROM audit_checkpoints " +
|
|
264
|
+
"WHERE atMonotonicCounter >= ? " +
|
|
265
|
+
"ORDER BY atMonotonicCounter ASC LIMIT 1",
|
|
266
|
+
[lastCounter]
|
|
267
|
+
);
|
|
268
|
+
}
|
|
269
|
+
|
|
270
|
+
async function _defaultReadPredecessorRowHash(firstCounter) {
|
|
271
|
+
if (firstCounter <= 1) return auditChain.ZERO_HASH;
|
|
272
|
+
var row = await clusterStorage.executeOne(
|
|
273
|
+
"SELECT rowHash FROM audit_log WHERE monotonicCounter = ?",
|
|
274
|
+
[firstCounter - 1]
|
|
275
|
+
);
|
|
276
|
+
if (!row) {
|
|
277
|
+
// First row of the slice is right after a purged range. Read the
|
|
278
|
+
// purge anchor's lastRowHash instead.
|
|
279
|
+
var anchor = await clusterStorage.executeOne(
|
|
280
|
+
"SELECT lastPurgedRowHash, lastPurgedCounter FROM _blamejs_audit_purge_anchor " +
|
|
281
|
+
"WHERE scope = 'audit'"
|
|
282
|
+
);
|
|
283
|
+
if (anchor && Number(anchor.lastPurgedCounter) === firstCounter - 1) {
|
|
284
|
+
return anchor.lastPurgedRowHash;
|
|
285
|
+
}
|
|
286
|
+
throw new AuditToolsError("audit-tools/no-predecessor",
|
|
287
|
+
"predecessor row at counter=" + (firstCounter - 1) + " missing — chain proof would be ungrounded");
|
|
288
|
+
}
|
|
289
|
+
return row.rowHash;
|
|
290
|
+
}
|
|
291
|
+
|
|
292
|
+
// ---- Bundle writer ----
|
|
293
|
+
|
|
294
|
+
async function _writeBundle(args) {
|
|
295
|
+
var outDir = args.outDir;
|
|
296
|
+
var kind = args.kind;
|
|
297
|
+
var rows = args.rows;
|
|
298
|
+
var checkpoint = args.checkpoint || null;
|
|
299
|
+
var passphrase = args.passphrase;
|
|
300
|
+
var predecessorRowHash = args.predecessorRowHash;
|
|
301
|
+
|
|
302
|
+
atomicFile.ensureDir(outDir);
|
|
303
|
+
|
|
304
|
+
var firstRow = rows[0];
|
|
305
|
+
var lastRow = rows[rows.length - 1];
|
|
306
|
+
|
|
307
|
+
// 1. Encrypt the rows JSONL
|
|
308
|
+
var jsonl = rows.map(function (r) {
|
|
309
|
+
return JSON.stringify(_rowToWireForm(r));
|
|
310
|
+
}).join("\n") + "\n";
|
|
311
|
+
var rowsEnc = await backupCrypto.encryptWithFreshSalt(jsonl, passphrase);
|
|
312
|
+
atomicFile.writeSync(nodePath.join(outDir, "rows.enc"), rowsEnc.encrypted, { fileMode: 0o600 });
|
|
313
|
+
|
|
314
|
+
// 2. (archive) Encrypt the checkpoint JSON
|
|
315
|
+
var checkpointSalt = null;
|
|
316
|
+
if (checkpoint) {
|
|
317
|
+
var ckptJson = _canonicalize(_rowToWireForm(checkpoint));
|
|
318
|
+
var ckptEnc = await backupCrypto.encryptWithFreshSalt(ckptJson, passphrase);
|
|
319
|
+
atomicFile.writeSync(nodePath.join(outDir, "checkpoint.enc"), ckptEnc.encrypted, { fileMode: 0o600 });
|
|
320
|
+
checkpointSalt = ckptEnc.salt;
|
|
321
|
+
}
|
|
322
|
+
|
|
323
|
+
// 3. Build manifest
|
|
324
|
+
var manifest = {
|
|
325
|
+
format: BUNDLE_FORMAT,
|
|
326
|
+
kind: kind,
|
|
327
|
+
createdAt: Date.now(),
|
|
328
|
+
frameworkVersion: FRAMEWORK_VERSION,
|
|
329
|
+
rowCount: rows.length,
|
|
330
|
+
range: {
|
|
331
|
+
firstCounter: Number(firstRow.monotonicCounter),
|
|
332
|
+
lastCounter: Number(lastRow.monotonicCounter),
|
|
333
|
+
firstRecordedAt: Number(firstRow.recordedAt),
|
|
334
|
+
lastRecordedAt: Number(lastRow.recordedAt),
|
|
335
|
+
firstRowHash: String(firstRow.rowHash),
|
|
336
|
+
lastRowHash: String(lastRow.rowHash),
|
|
337
|
+
predecessorRowHash: String(predecessorRowHash),
|
|
338
|
+
},
|
|
339
|
+
salts: {
|
|
340
|
+
rows: rowsEnc.salt,
|
|
341
|
+
checkpoint: checkpointSalt,
|
|
342
|
+
},
|
|
343
|
+
checksum: {
|
|
344
|
+
rowsSha3_512: backupCrypto.checksum(rowsEnc.encrypted),
|
|
345
|
+
checkpointSha3_512: checkpointSalt
|
|
346
|
+
? backupCrypto.checksum(nodeFs.readFileSync(nodePath.join(outDir, "checkpoint.enc")))
|
|
347
|
+
: null,
|
|
348
|
+
},
|
|
349
|
+
};
|
|
350
|
+
if (checkpoint) {
|
|
351
|
+
manifest.checkpoint = {
|
|
352
|
+
atMonotonicCounter: Number(checkpoint.atMonotonicCounter),
|
|
353
|
+
atRowHash: String(checkpoint.atRowHash),
|
|
354
|
+
publicKeyFingerprint: String(checkpoint.publicKeyFingerprint),
|
|
355
|
+
checkpointId: String(checkpoint._id),
|
|
356
|
+
};
|
|
357
|
+
}
|
|
358
|
+
var manifestPath = nodePath.join(outDir, "manifest.json");
|
|
359
|
+
atomicFile.writeSync(manifestPath, _canonicalize(manifest), { fileMode: 0o600 });
|
|
360
|
+
return { manifest: manifest, manifestPath: manifestPath };
|
|
361
|
+
}
|
|
362
|
+
|
|
363
|
+
// ---- Bundle reader ----
|
|
364
|
+
|
|
365
|
+
async function _readBundle(inDir, passphrase) {
|
|
366
|
+
if (typeof inDir !== "string" || !nodeFs.existsSync(inDir)) {
|
|
367
|
+
throw new AuditToolsError("audit-tools/no-bundle",
|
|
368
|
+
"bundle directory does not exist: " + inDir);
|
|
369
|
+
}
|
|
370
|
+
var manifestPath = nodePath.join(inDir, "manifest.json");
|
|
371
|
+
if (!nodeFs.existsSync(manifestPath)) {
|
|
372
|
+
throw new AuditToolsError("audit-tools/no-manifest",
|
|
373
|
+
"manifest.json missing in " + inDir);
|
|
374
|
+
}
|
|
375
|
+
var manifest = safeJson.parse(nodeFs.readFileSync(manifestPath, "utf8"));
|
|
376
|
+
if (!manifest || manifest.format !== BUNDLE_FORMAT) {
|
|
377
|
+
throw new AuditToolsError("audit-tools/bad-format",
|
|
378
|
+
"manifest.format is not " + BUNDLE_FORMAT);
|
|
379
|
+
}
|
|
380
|
+
if (!VALID_KINDS[manifest.kind]) {
|
|
381
|
+
throw new AuditToolsError("audit-tools/bad-kind",
|
|
382
|
+
"manifest.kind must be one of " + Object.keys(VALID_KINDS).join(", "));
|
|
383
|
+
}
|
|
384
|
+
|
|
385
|
+
var rowsEncPath = nodePath.join(inDir, "rows.enc");
|
|
386
|
+
if (!nodeFs.existsSync(rowsEncPath)) {
|
|
387
|
+
throw new AuditToolsError("audit-tools/no-rows-blob",
|
|
388
|
+
"rows.enc missing in " + inDir);
|
|
389
|
+
}
|
|
390
|
+
var rowsEnc = nodeFs.readFileSync(rowsEncPath);
|
|
391
|
+
if (manifest.checksum && manifest.checksum.rowsSha3_512 &&
|
|
392
|
+
backupCrypto.checksum(rowsEnc) !== manifest.checksum.rowsSha3_512) {
|
|
393
|
+
throw new AuditToolsError("audit-tools/rows-checksum-mismatch",
|
|
394
|
+
"rows.enc checksum does not match manifest — bundle was tampered with");
|
|
395
|
+
}
|
|
396
|
+
var rowsPlainBuf = await backupCrypto.decryptWithPassphrase(rowsEnc, passphrase, manifest.salts.rows);
|
|
397
|
+
var rowsPlain = rowsPlainBuf.toString("utf8");
|
|
398
|
+
var lines = rowsPlain.split("\n").filter(function (l) { return l.length > 0; });
|
|
399
|
+
var rows = lines.map(function (l) { return _wireFormToRow(safeJson.parse(l)); });
|
|
400
|
+
|
|
401
|
+
var checkpoint = null;
|
|
402
|
+
if (manifest.kind === KIND_ARCHIVE) {
|
|
403
|
+
var ckptPath = nodePath.join(inDir, "checkpoint.enc");
|
|
404
|
+
if (!nodeFs.existsSync(ckptPath)) {
|
|
405
|
+
throw new AuditToolsError("audit-tools/no-checkpoint-blob",
|
|
406
|
+
"checkpoint.enc missing in " + inDir + " (archive bundles must include the covering checkpoint)");
|
|
407
|
+
}
|
|
408
|
+
var ckptEnc = nodeFs.readFileSync(ckptPath);
|
|
409
|
+
if (manifest.checksum && manifest.checksum.checkpointSha3_512 &&
|
|
410
|
+
backupCrypto.checksum(ckptEnc) !== manifest.checksum.checkpointSha3_512) {
|
|
411
|
+
throw new AuditToolsError("audit-tools/checkpoint-checksum-mismatch",
|
|
412
|
+
"checkpoint.enc checksum does not match manifest");
|
|
413
|
+
}
|
|
414
|
+
var ckptPlain = (await backupCrypto.decryptWithPassphrase(ckptEnc, passphrase, manifest.salts.checkpoint))
|
|
415
|
+
.toString("utf8");
|
|
416
|
+
checkpoint = _wireFormToRow(safeJson.parse(ckptPlain));
|
|
417
|
+
}
|
|
418
|
+
|
|
419
|
+
return { manifest: manifest, rows: rows, checkpoint: checkpoint };
|
|
420
|
+
}
|
|
421
|
+
|
|
422
|
+
// ---- Public ops ----
|
|
423
|
+
|
|
424
|
+
/**
|
|
425
|
+
* @primitive b.auditTools.archive
|
|
426
|
+
* @signature b.auditTools.archive(opts)
|
|
427
|
+
* @since 0.7.30
|
|
428
|
+
* @compliance hipaa, pci-dss, gdpr, soc2, sox-404
|
|
429
|
+
* @related b.auditTools.verifyBundle, b.auditTools.purge, b.audit.checkpoint
|
|
430
|
+
*
|
|
431
|
+
* Bundle every audit row older than `opts.before` into a
|
|
432
|
+
* PQC-encrypted archive (XChaCha20-Poly1305 + Argon2id-derived key)
|
|
433
|
+
* containing a chain proof and the covering ML-DSA-87 checkpoint.
|
|
434
|
+
* Live rows are untouched — call `b.auditTools.purge` separately
|
|
435
|
+
* once the archive is verified.
|
|
436
|
+
*
|
|
437
|
+
* Refuses if `opts.out` exists, no rows match, or no signed
|
|
438
|
+
* checkpoint covers the slice (run `b.audit.checkpoint()` first).
|
|
439
|
+
*
|
|
440
|
+
* @opts
|
|
441
|
+
* out: string, // fresh directory path for the bundle
|
|
442
|
+
* before: number|Date|string, // archive rows recordedAt < this
|
|
443
|
+
* passphrase: Buffer|string, // bundle-encryption passphrase
|
|
444
|
+
*
|
|
445
|
+
* @example
|
|
446
|
+
* var ninetyDaysAgo = Date.now() - 90 * 24 * 60 * 60 * 1000;
|
|
447
|
+
* var result = await b.auditTools.archive({
|
|
448
|
+
* out: "/var/audit/2026-Q1.bundle",
|
|
449
|
+
* before: ninetyDaysAgo,
|
|
450
|
+
* passphrase: process.env.AUDIT_BUNDLE_PASSPHRASE,
|
|
451
|
+
* });
|
|
452
|
+
* // → { rowCount: 14823, range: { firstCounter: 1, lastCounter: 14823, ... },
|
|
453
|
+
* // manifestPath: "/var/audit/2026-Q1.bundle/manifest.json", ... }
|
|
454
|
+
*/
|
|
455
|
+
async function archive(opts) {
|
|
456
|
+
opts = opts || {};
|
|
457
|
+
_requirePassphrase(opts.passphrase);
|
|
458
|
+
_requireOutDir(opts.out, "archive");
|
|
459
|
+
var beforeMs = _toMs(opts.before);
|
|
460
|
+
if (beforeMs == null) {
|
|
461
|
+
throw new AuditToolsError("audit-tools/no-before",
|
|
462
|
+
"archive: opts.before is required (date older than which rows are archived)");
|
|
463
|
+
}
|
|
464
|
+
var readRows = opts.readRows || _defaultReadRows;
|
|
465
|
+
var readCovering = opts.readCoveringCheckpoint || _defaultReadCoveringCheckpoint;
|
|
466
|
+
var readPredecessorHash = opts.readPredecessorRowHash || _defaultReadPredecessorRowHash;
|
|
467
|
+
|
|
468
|
+
var rows = await readRows({ beforeMs: beforeMs });
|
|
469
|
+
if (rows.length === 0) {
|
|
470
|
+
throw new AuditToolsError("audit-tools/empty",
|
|
471
|
+
"archive: no audit rows match (before=" + new Date(beforeMs).toISOString() + ")");
|
|
472
|
+
}
|
|
473
|
+
var lastCounter = Number(rows[rows.length - 1].monotonicCounter);
|
|
474
|
+
var firstCounter = Number(rows[0].monotonicCounter);
|
|
475
|
+
|
|
476
|
+
var checkpoint = await readCovering(lastCounter);
|
|
477
|
+
if (!checkpoint) {
|
|
478
|
+
throw new AuditToolsError("audit-tools/no-covering-checkpoint",
|
|
479
|
+
"archive: no signed checkpoint covers counter=" + lastCounter +
|
|
480
|
+
" — run audit.checkpoint() before archiving so the bundle has an off-chain anchor");
|
|
481
|
+
}
|
|
482
|
+
|
|
483
|
+
var predecessorRowHash = await readPredecessorHash(firstCounter);
|
|
484
|
+
|
|
485
|
+
var written = await _writeBundle({
|
|
486
|
+
outDir: opts.out,
|
|
487
|
+
kind: KIND_ARCHIVE,
|
|
488
|
+
rows: rows,
|
|
489
|
+
checkpoint: checkpoint,
|
|
490
|
+
passphrase: opts.passphrase,
|
|
491
|
+
predecessorRowHash: predecessorRowHash,
|
|
492
|
+
});
|
|
493
|
+
|
|
494
|
+
return {
|
|
495
|
+
manifest: written.manifest,
|
|
496
|
+
manifestPath: written.manifestPath,
|
|
497
|
+
outDir: opts.out,
|
|
498
|
+
rowCount: rows.length,
|
|
499
|
+
range: written.manifest.range,
|
|
500
|
+
};
|
|
501
|
+
}
|
|
502
|
+
|
|
503
|
+
/**
|
|
504
|
+
* @primitive b.auditTools.exportSlice
|
|
505
|
+
* @signature b.auditTools.exportSlice(opts)
|
|
506
|
+
* @since 0.7.30
|
|
507
|
+
* @compliance hipaa, pci-dss, gdpr, soc2
|
|
508
|
+
* @related b.auditTools.archive, b.auditTools.verifyBundle, b.auditTools.exportCadf
|
|
509
|
+
*
|
|
510
|
+
* Auditor-shaped slice — bundle the audit rows in `[from, to]`
|
|
511
|
+
* (optionally filtered by exact `action`) into a PQC-encrypted
|
|
512
|
+
* directory carrying chain-proof material. Refuses non-contiguous
|
|
513
|
+
* slices because chain verification cannot ground a sequence with
|
|
514
|
+
* gaps in `monotonicCounter`.
|
|
515
|
+
*
|
|
516
|
+
* Use date-range filters that cover every row in the range; an
|
|
517
|
+
* action filter that drops intermediate counters is rejected with
|
|
518
|
+
* `audit-tools/non-contiguous`.
|
|
519
|
+
*
|
|
520
|
+
* @opts
|
|
521
|
+
* out: string, // fresh directory path
|
|
522
|
+
* from: number|Date|string, // recordedAt >= this (inclusive)
|
|
523
|
+
* to: number|Date|string, // recordedAt <= this (inclusive)
|
|
524
|
+
* action: string, // exact action match (optional)
|
|
525
|
+
* passphrase: Buffer|string, // bundle-encryption passphrase
|
|
526
|
+
*
|
|
527
|
+
* @example
|
|
528
|
+
* var bundle = await b.auditTools.exportSlice({
|
|
529
|
+
* out: "/tmp/audit-2026-q1.bundle",
|
|
530
|
+
* from: "2026-01-01T00:00:00Z",
|
|
531
|
+
* to: "2026-03-31T23:59:59Z",
|
|
532
|
+
* passphrase: process.env.AUDIT_BUNDLE_PASSPHRASE,
|
|
533
|
+
* });
|
|
534
|
+
* // → { rowCount: 4218, manifest: { kind: "export", ... }, ... }
|
|
535
|
+
*/
|
|
536
|
+
async function exportSlice(opts) {
|
|
537
|
+
opts = opts || {};
|
|
538
|
+
_requirePassphrase(opts.passphrase);
|
|
539
|
+
_requireOutDir(opts.out, "export");
|
|
540
|
+
var fromMs = _toMs(opts.from);
|
|
541
|
+
var toMs = _toMs(opts.to);
|
|
542
|
+
var readRows = opts.readRows || _defaultReadRows;
|
|
543
|
+
var readPredecessorHash = opts.readPredecessorRowHash || _defaultReadPredecessorRowHash;
|
|
544
|
+
|
|
545
|
+
var criteria = {};
|
|
546
|
+
if (fromMs != null) criteria.fromMs = fromMs;
|
|
547
|
+
if (toMs != null) criteria.toMs = toMs;
|
|
548
|
+
if (opts.action) criteria.action = opts.action;
|
|
549
|
+
|
|
550
|
+
var rows = await readRows(criteria);
|
|
551
|
+
if (rows.length === 0) {
|
|
552
|
+
throw new AuditToolsError("audit-tools/empty",
|
|
553
|
+
"export: no audit rows match criteria");
|
|
554
|
+
}
|
|
555
|
+
// For an export the slice may be non-contiguous in counter space (e.g.
|
|
556
|
+
// filtered by action). Reject non-contiguous slices because chain
|
|
557
|
+
// verification can't ground a non-contiguous sequence.
|
|
558
|
+
for (var i = 1; i < rows.length; i++) {
|
|
559
|
+
var prev = Number(rows[i - 1].monotonicCounter);
|
|
560
|
+
var cur = Number(rows[i].monotonicCounter);
|
|
561
|
+
if (cur !== prev + 1) {
|
|
562
|
+
throw new AuditToolsError("audit-tools/non-contiguous",
|
|
563
|
+
"export: slice is non-contiguous in monotonicCounter (" + prev + " → " + cur + "). " +
|
|
564
|
+
"Filtered exports break chain proof; use date-range filters that cover all rows in the range.");
|
|
565
|
+
}
|
|
566
|
+
}
|
|
567
|
+
var firstCounter = Number(rows[0].monotonicCounter);
|
|
568
|
+
var predecessorRowHash = await readPredecessorHash(firstCounter);
|
|
569
|
+
|
|
570
|
+
var written = await _writeBundle({
|
|
571
|
+
outDir: opts.out,
|
|
572
|
+
kind: KIND_EXPORT,
|
|
573
|
+
rows: rows,
|
|
574
|
+
checkpoint: null,
|
|
575
|
+
passphrase: opts.passphrase,
|
|
576
|
+
predecessorRowHash: predecessorRowHash,
|
|
577
|
+
});
|
|
578
|
+
|
|
579
|
+
return {
|
|
580
|
+
manifest: written.manifest,
|
|
581
|
+
manifestPath: written.manifestPath,
|
|
582
|
+
outDir: opts.out,
|
|
583
|
+
rowCount: rows.length,
|
|
584
|
+
range: written.manifest.range,
|
|
585
|
+
};
|
|
586
|
+
}
|
|
587
|
+
|
|
588
|
+
/**
|
|
589
|
+
* @primitive b.auditTools.verifyBundle
|
|
590
|
+
* @signature b.auditTools.verifyBundle(opts)
|
|
591
|
+
* @since 0.7.30
|
|
592
|
+
* @compliance hipaa, pci-dss, gdpr, soc2, sox-404
|
|
593
|
+
* @related b.auditTools.archive, b.auditTools.exportSlice, b.auditTools.purge
|
|
594
|
+
*
|
|
595
|
+
* Round-trip integrity check on a bundle directory: decrypt
|
|
596
|
+
* `rows.enc`, walk the prevHash → rowHash chain across the contained
|
|
597
|
+
* rows starting from the manifest's `predecessorRowHash` witness,
|
|
598
|
+
* confirm `firstRowHash` / `lastRowHash` match, and (archive only)
|
|
599
|
+
* verify the covering checkpoint's ML-DSA-87 signature against the
|
|
600
|
+
* locally-loaded audit-sign public key (or `opts.verifySignature`
|
|
601
|
+
* for cross-machine auditors).
|
|
602
|
+
*
|
|
603
|
+
* Returns `{ ok: true, kind, rowsVerified, range, manifest }` on
|
|
604
|
+
* success or `{ ok: false, reason, breakAt? }` at the first break.
|
|
605
|
+
*
|
|
606
|
+
* @opts
|
|
607
|
+
* in: string, // bundle directory
|
|
608
|
+
* passphrase: Buffer|string, // decryption passphrase
|
|
609
|
+
* verifyCheckpointSignature: boolean, // default true
|
|
610
|
+
* verifySignature: function(checkpoint), // override the default verifier
|
|
611
|
+
* includeRows: boolean, // attach decrypted rows to result
|
|
612
|
+
*
|
|
613
|
+
* @example
|
|
614
|
+
* var result = await b.auditTools.verifyBundle({
|
|
615
|
+
* in: "/var/audit/2026-Q1.bundle",
|
|
616
|
+
* passphrase: process.env.AUDIT_BUNDLE_PASSPHRASE,
|
|
617
|
+
* });
|
|
618
|
+
* if (!result.ok) {
|
|
619
|
+
* console.error("bundle integrity break:", result.reason);
|
|
620
|
+
* process.exit(1);
|
|
621
|
+
* }
|
|
622
|
+
* // → { ok: true, kind: "archive", rowsVerified: 14823, range: { ... } }
|
|
623
|
+
*/
|
|
624
|
+
async function verifyBundle(opts) {
|
|
625
|
+
opts = opts || {};
|
|
626
|
+
_requirePassphrase(opts.passphrase);
|
|
627
|
+
if (typeof opts.in !== "string") {
|
|
628
|
+
throw new AuditToolsError("audit-tools/no-indir",
|
|
629
|
+
"verifyBundle: opts.in is required (bundle directory)");
|
|
630
|
+
}
|
|
631
|
+
var read = await _readBundle(opts.in, opts.passphrase);
|
|
632
|
+
|
|
633
|
+
// 1. Walk the chain math across the slice.
|
|
634
|
+
var chainResult = _verifyChainSlice(read.rows, read.manifest.range.predecessorRowHash);
|
|
635
|
+
if (!chainResult.ok) {
|
|
636
|
+
return {
|
|
637
|
+
ok: false,
|
|
638
|
+
kind: read.manifest.kind,
|
|
639
|
+
rowsVerified: chainResult.rowsVerified,
|
|
640
|
+
breakAt: chainResult.breakAt,
|
|
641
|
+
reason: "chain " + chainResult.reason +
|
|
642
|
+
" (counter=" + Number(read.rows[chainResult.breakAt].monotonicCounter) + ")",
|
|
643
|
+
expected: chainResult.expected,
|
|
644
|
+
actual: chainResult.actual,
|
|
645
|
+
};
|
|
646
|
+
}
|
|
647
|
+
|
|
648
|
+
// 2. Confirm the stored firstRowHash + lastRowHash match the slice
|
|
649
|
+
if (read.rows[0].rowHash !== read.manifest.range.firstRowHash) {
|
|
650
|
+
return {
|
|
651
|
+
ok: false, kind: read.manifest.kind, rowsVerified: read.rows.length,
|
|
652
|
+
reason: "manifest.range.firstRowHash does not match first row's rowHash",
|
|
653
|
+
};
|
|
654
|
+
}
|
|
655
|
+
if (read.rows[read.rows.length - 1].rowHash !== read.manifest.range.lastRowHash) {
|
|
656
|
+
return {
|
|
657
|
+
ok: false, kind: read.manifest.kind, rowsVerified: read.rows.length,
|
|
658
|
+
reason: "manifest.range.lastRowHash does not match last row's rowHash",
|
|
659
|
+
};
|
|
660
|
+
}
|
|
661
|
+
|
|
662
|
+
// 3. (archive only) verify the covering checkpoint signature
|
|
663
|
+
if (read.manifest.kind === KIND_ARCHIVE) {
|
|
664
|
+
if (!read.checkpoint) {
|
|
665
|
+
return { ok: false, kind: KIND_ARCHIVE, reason: "checkpoint missing from archive bundle" };
|
|
666
|
+
}
|
|
667
|
+
if (Number(read.checkpoint.atMonotonicCounter) < Number(read.manifest.range.lastCounter)) {
|
|
668
|
+
return {
|
|
669
|
+
ok: false, kind: KIND_ARCHIVE,
|
|
670
|
+
reason: "checkpoint atMonotonicCounter (" + read.checkpoint.atMonotonicCounter +
|
|
671
|
+
") < archive lastCounter (" + read.manifest.range.lastCounter + ")",
|
|
672
|
+
};
|
|
673
|
+
}
|
|
674
|
+
if (opts.verifyCheckpointSignature !== false) {
|
|
675
|
+
var verifier = opts.verifySignature || _defaultVerifyCheckpointSignature;
|
|
676
|
+
var sigOk = verifier(read.checkpoint);
|
|
677
|
+
if (!sigOk) {
|
|
678
|
+
return {
|
|
679
|
+
ok: false, kind: KIND_ARCHIVE,
|
|
680
|
+
reason: "checkpoint ML-DSA signature verification failed (auditor's audit-sign public key may differ from archive's; pass opts.verifySignature to override)",
|
|
681
|
+
};
|
|
682
|
+
}
|
|
683
|
+
}
|
|
684
|
+
}
|
|
685
|
+
|
|
686
|
+
return {
|
|
687
|
+
ok: true,
|
|
688
|
+
kind: read.manifest.kind,
|
|
689
|
+
rowsVerified: read.rows.length,
|
|
690
|
+
range: read.manifest.range,
|
|
691
|
+
manifest: read.manifest,
|
|
692
|
+
rows: opts.includeRows ? read.rows : undefined,
|
|
693
|
+
};
|
|
694
|
+
}
|
|
695
|
+
|
|
696
|
+
function _defaultVerifyCheckpointSignature(checkpoint) {
|
|
697
|
+
// Use the locally-loaded audit-sign keypair. Auditors verifying an
|
|
698
|
+
// archive on a different machine will need to pass opts.verifySignature
|
|
699
|
+
// with their own loaded public key. The framework deliberately doesn't
|
|
700
|
+
// ship public keys inside the bundle — the public key fingerprint in
|
|
701
|
+
// the checkpoint row is the verifier's lookup key.
|
|
702
|
+
try {
|
|
703
|
+
var pub = auditSign.getPublicKey();
|
|
704
|
+
var fp = auditSign.getPublicKeyFingerprint();
|
|
705
|
+
if (fp !== checkpoint.publicKeyFingerprint) return false;
|
|
706
|
+
var payload = Buffer.from(
|
|
707
|
+
"blamejs-audit-checkpoint-v1\n" +
|
|
708
|
+
String(checkpoint.atMonotonicCounter) + "\n" +
|
|
709
|
+
checkpoint.atRowHash + "\n" +
|
|
710
|
+
String(checkpoint.createdAt),
|
|
711
|
+
"utf8"
|
|
712
|
+
);
|
|
713
|
+
var sig = Buffer.isBuffer(checkpoint.signature) ? checkpoint.signature : Buffer.from(checkpoint.signature);
|
|
714
|
+
return auditSign.verify(payload, sig, pub);
|
|
715
|
+
} catch (_e) { return false; }
|
|
716
|
+
}
|
|
717
|
+
|
|
718
|
+
/**
|
|
719
|
+
* @primitive b.auditTools.purge
|
|
720
|
+
* @signature b.auditTools.purge(opts)
|
|
721
|
+
* @since 0.7.30
|
|
722
|
+
* @compliance hipaa, pci-dss, gdpr, soc2, sox-404
|
|
723
|
+
* @related b.auditTools.archive, b.auditTools.verifyBundle, b.audit.verify
|
|
724
|
+
*
|
|
725
|
+
* Confirmation-gated deletion of live audit rows already captured in
|
|
726
|
+
* a verified archive bundle. Refuses unless `opts.confirm === true`,
|
|
727
|
+
* the bundle verifies clean as `kind="archive"`, and the bundle's
|
|
728
|
+
* `firstCounter` / `predecessorRowHash` match the next contiguous
|
|
729
|
+
* purge point on disk. Inserts a `_blamejs_audit_purge_anchor` row
|
|
730
|
+
* so `b.audit.verify()` keeps chaining post-purge — the anchor's
|
|
731
|
+
* `lastPurgedRowHash` becomes the new chain origin.
|
|
732
|
+
*
|
|
733
|
+
* @opts
|
|
734
|
+
* confirm: true, // exact `true` required
|
|
735
|
+
* archive: string, // path to a verified archive bundle
|
|
736
|
+
* passphrase: Buffer|string, // bundle decryption passphrase
|
|
737
|
+
* verifySignature: function(checkpoint),// auditor pubkey override
|
|
738
|
+
*
|
|
739
|
+
* @example
|
|
740
|
+
* var result = await b.auditTools.purge({
|
|
741
|
+
* confirm: true,
|
|
742
|
+
* archive: "/var/audit/2026-Q1.bundle",
|
|
743
|
+
* passphrase: process.env.AUDIT_BUNDLE_PASSPHRASE,
|
|
744
|
+
* });
|
|
745
|
+
* // → { purged: true, rowsDeleted: 14823, lastPurgedCounter: 14823, ... }
|
|
746
|
+
*/
|
|
747
|
+
async function purge(opts) {
|
|
748
|
+
opts = opts || {};
|
|
749
|
+
if (opts.confirm !== true) {
|
|
750
|
+
throw new AuditToolsError("audit-tools/no-confirm",
|
|
751
|
+
"purge: opts.confirm must be exactly true — destructive operation requires explicit acknowledgement");
|
|
752
|
+
}
|
|
753
|
+
if (typeof opts.archive !== "string") {
|
|
754
|
+
throw new AuditToolsError("audit-tools/no-archive",
|
|
755
|
+
"purge: opts.archive is required (path to a verified archive bundle)");
|
|
756
|
+
}
|
|
757
|
+
_requirePassphrase(opts.passphrase);
|
|
758
|
+
|
|
759
|
+
// 1. Verify the archive bundle. Refuses with a clear reason if not ok.
|
|
760
|
+
var v = await verifyBundle({
|
|
761
|
+
in: opts.archive,
|
|
762
|
+
passphrase: opts.passphrase,
|
|
763
|
+
verifySignature: opts.verifySignature, // auditor pubkey override
|
|
764
|
+
});
|
|
765
|
+
if (!v.ok) {
|
|
766
|
+
throw new AuditToolsError("audit-tools/archive-not-ok",
|
|
767
|
+
"purge: archive failed verification: " + v.reason);
|
|
768
|
+
}
|
|
769
|
+
if (v.kind !== KIND_ARCHIVE) {
|
|
770
|
+
throw new AuditToolsError("audit-tools/wrong-kind",
|
|
771
|
+
"purge: bundle kind is '" + v.kind + "', must be 'archive'");
|
|
772
|
+
}
|
|
773
|
+
|
|
774
|
+
// 2. Refuse if the archive doesn't start at the next purge point. Keeps
|
|
775
|
+
// the chain anchor monotonic — operators can't jump-purge a middle range.
|
|
776
|
+
var readAnchor = opts.readAnchor || _defaultReadPurgeAnchor;
|
|
777
|
+
var anchor = await readAnchor();
|
|
778
|
+
var expectedFirstCounter = anchor ? Number(anchor.lastPurgedCounter) + 1 : 1;
|
|
779
|
+
if (Number(v.range.firstCounter) !== expectedFirstCounter) {
|
|
780
|
+
throw new AuditToolsError("audit-tools/non-monotonic-purge",
|
|
781
|
+
"purge: archive's firstCounter=" + v.range.firstCounter +
|
|
782
|
+
" does not match expected next-purge counter=" + expectedFirstCounter +
|
|
783
|
+
" (purges must be contiguous from the chain origin or last anchor)");
|
|
784
|
+
}
|
|
785
|
+
if (anchor && v.range.predecessorRowHash !== anchor.lastPurgedRowHash) {
|
|
786
|
+
throw new AuditToolsError("audit-tools/anchor-mismatch",
|
|
787
|
+
"purge: archive's predecessorRowHash does not match the prior purge anchor's lastPurgedRowHash");
|
|
788
|
+
}
|
|
789
|
+
|
|
790
|
+
// 3. Apply the deletion + new anchor write. This is the only mutation
|
|
791
|
+
// path — operator-supplied for testability; default executes against
|
|
792
|
+
// the live cluster-storage.
|
|
793
|
+
var apply = opts.apply || _defaultApplyPurge;
|
|
794
|
+
var result = await apply({
|
|
795
|
+
lastPurgedCounter: Number(v.range.lastCounter),
|
|
796
|
+
lastPurgedRowHash: v.range.lastRowHash,
|
|
797
|
+
archiveBundleId: v.manifest.checkpoint && v.manifest.checkpoint.checkpointId
|
|
798
|
+
|| ("manifest:" + v.range.lastCounter),
|
|
799
|
+
purgedAt: Date.now(),
|
|
800
|
+
});
|
|
801
|
+
|
|
802
|
+
return {
|
|
803
|
+
purged: true,
|
|
804
|
+
rowsDeleted: result.rowsDeleted,
|
|
805
|
+
checkpointsDeleted: result.checkpointsDeleted,
|
|
806
|
+
lastPurgedCounter: Number(v.range.lastCounter),
|
|
807
|
+
lastPurgedRowHash: v.range.lastRowHash,
|
|
808
|
+
archiveBundleId: result.archiveBundleId,
|
|
809
|
+
};
|
|
810
|
+
}
|
|
811
|
+
|
|
812
|
+
async function _defaultReadPurgeAnchor() {
|
|
813
|
+
return clusterStorage.executeOne(
|
|
814
|
+
"SELECT * FROM _blamejs_audit_purge_anchor WHERE scope = 'audit'"
|
|
815
|
+
);
|
|
816
|
+
}
|
|
817
|
+
|
|
818
|
+
async function _defaultApplyPurge(args) {
|
|
819
|
+
var del = await db().purgeAuditChain({ lastPurgedCounter: args.lastPurgedCounter });
|
|
820
|
+
// UPSERT the single-row anchor. SQLite + Postgres both support
|
|
821
|
+
// INSERT ... ON CONFLICT(scope) DO UPDATE.
|
|
822
|
+
await clusterStorage.execute(
|
|
823
|
+
"INSERT INTO _blamejs_audit_purge_anchor " +
|
|
824
|
+
"(scope, lastPurgedCounter, lastPurgedRowHash, archiveBundleId, purgedAt) " +
|
|
825
|
+
"VALUES ('audit', ?, ?, ?, ?) " +
|
|
826
|
+
"ON CONFLICT(scope) DO UPDATE SET " +
|
|
827
|
+
"lastPurgedCounter = excluded.lastPurgedCounter, " +
|
|
828
|
+
"lastPurgedRowHash = excluded.lastPurgedRowHash, " +
|
|
829
|
+
"archiveBundleId = excluded.archiveBundleId, " +
|
|
830
|
+
"purgedAt = excluded.purgedAt",
|
|
831
|
+
[args.lastPurgedCounter, args.lastPurgedRowHash, args.archiveBundleId, args.purgedAt]
|
|
832
|
+
);
|
|
833
|
+
return {
|
|
834
|
+
rowsDeleted: del.rowsDeleted,
|
|
835
|
+
checkpointsDeleted: del.checkpointsDeleted,
|
|
836
|
+
archiveBundleId: args.archiveBundleId,
|
|
837
|
+
};
|
|
838
|
+
}
|
|
839
|
+
|
|
840
|
+
/**
|
|
841
|
+
* @primitive b.auditTools.forensicSnapshot
|
|
842
|
+
* @signature b.auditTools.forensicSnapshot(opts)
|
|
843
|
+
* @since 0.8.40
|
|
844
|
+
* @compliance hipaa, pci-dss, gdpr, soc2, sox-404, dora, nis2
|
|
845
|
+
* @related b.auditTools.exportSlice, b.auditTools.archive
|
|
846
|
+
*
|
|
847
|
+
* Post-compromise composer that bundles an audit slice (from
|
|
848
|
+
* `since` → now) plus operator-supplied incident metadata
|
|
849
|
+
* (incidentId, reason, actor) and runtime fingerprint (Node version
|
|
850
|
+
* / platform / pid / uptime) into a single tamper-evident artifact
|
|
851
|
+
* for legal / regulators / the IR team. Emits an
|
|
852
|
+
* `audit.forensic_snapshot.composed` audit event so the act of
|
|
853
|
+
* composing the snapshot is itself on-chain.
|
|
854
|
+
*
|
|
855
|
+
* @opts
|
|
856
|
+
* out: string, // fresh directory path
|
|
857
|
+
* since: number|Date|string, // include rows recordedAt >= this
|
|
858
|
+
* passphrase: Buffer|string, // bundle-encryption passphrase
|
|
859
|
+
* reason: string, // required incident-context reason
|
|
860
|
+
* incidentId: string, // optional ticket / incident id
|
|
861
|
+
* actor: { id, role }, // optional incident-commander identity
|
|
862
|
+
*
|
|
863
|
+
* @example
|
|
864
|
+
* var snap = await b.auditTools.forensicSnapshot({
|
|
865
|
+
* out: "/forensics/2026-05-08-inc-42",
|
|
866
|
+
* since: Date.now() - 7 * 24 * 60 * 60 * 1000,
|
|
867
|
+
* passphrase: process.env.AUDIT_BUNDLE_PASSPHRASE,
|
|
868
|
+
* incidentId: "inc-2026-05-08-42",
|
|
869
|
+
* reason: "ATO investigation: 14 failed MFA from new geo, user u-42",
|
|
870
|
+
* actor: { id: "alice@ops.example.com", role: "incident-commander" },
|
|
871
|
+
* });
|
|
872
|
+
* // → { snapshotKind: "forensic", incidentId: "inc-2026-05-08-42", ... }
|
|
873
|
+
*/
|
|
874
|
+
async function forensicSnapshot(opts) {
|
|
875
|
+
opts = opts || {};
|
|
876
|
+
_requirePassphrase(opts.passphrase);
|
|
877
|
+
_requireOutDir(opts.out, "forensicSnapshot");
|
|
878
|
+
var sinceMs = _toMs(opts.since);
|
|
879
|
+
if (sinceMs == null) {
|
|
880
|
+
throw new AuditToolsError("audit-tools/no-since",
|
|
881
|
+
"forensicSnapshot: opts.since is required");
|
|
882
|
+
}
|
|
883
|
+
validateOpts.requireNonEmptyString(opts.reason, "reason", AuditToolsError, "audit-tools/no-reason");
|
|
884
|
+
var sliceResult = await exportSlice({
|
|
885
|
+
out: opts.out,
|
|
886
|
+
since: sinceMs,
|
|
887
|
+
until: Date.now(),
|
|
888
|
+
passphrase: opts.passphrase,
|
|
889
|
+
readRows: opts.readRows,
|
|
890
|
+
readCoveringCheckpoint: opts.readCoveringCheckpoint,
|
|
891
|
+
});
|
|
892
|
+
// Compose snapshot manifest with operator-supplied IR context.
|
|
893
|
+
var manifest = {
|
|
894
|
+
snapshotKind: "forensic",
|
|
895
|
+
incidentId: opts.incidentId || null,
|
|
896
|
+
reason: opts.reason,
|
|
897
|
+
actor: opts.actor || null,
|
|
898
|
+
composedAt: new Date().toISOString(),
|
|
899
|
+
auditSliceFile: sliceResult && sliceResult.path,
|
|
900
|
+
auditSliceCount: sliceResult && sliceResult.rowCount,
|
|
901
|
+
runtime: {
|
|
902
|
+
nodeVersion: process.version,
|
|
903
|
+
platform: process.platform,
|
|
904
|
+
arch: process.arch,
|
|
905
|
+
pid: process.pid,
|
|
906
|
+
uptimeSec: Math.round(process.uptime()),
|
|
907
|
+
},
|
|
908
|
+
};
|
|
909
|
+
var manifestPath = require("node:path").join(opts.out, "forensic-snapshot.json");
|
|
910
|
+
require("node:fs").writeFileSync(manifestPath, _canonicalize(manifest), "utf8");
|
|
911
|
+
try {
|
|
912
|
+
require("./audit").safeEmit({
|
|
913
|
+
action: "audit.forensic_snapshot.composed",
|
|
914
|
+
outcome: "success",
|
|
915
|
+
metadata: {
|
|
916
|
+
out: opts.out,
|
|
917
|
+
incidentId: manifest.incidentId,
|
|
918
|
+
reason: opts.reason,
|
|
919
|
+
actor: opts.actor || null,
|
|
920
|
+
rowCount: manifest.auditSliceCount || 0,
|
|
921
|
+
},
|
|
922
|
+
});
|
|
923
|
+
} catch (_e) { /* audit best-effort */ }
|
|
924
|
+
return Object.assign({}, manifest, { manifestPath: manifestPath });
|
|
925
|
+
}
|
|
926
|
+
|
|
927
|
+
// CADF (Cloud Auditing Data Federation, ISO/IEC 19395:2017) is the
|
|
928
|
+
// OpenStack/FedRAMP-tier cloud-audit envelope auditors increasingly
|
|
929
|
+
// expect for federated tooling (cross-tenant SIEM, CSP reporting).
|
|
930
|
+
//
|
|
931
|
+
// We map blamejs audit fields onto CADF attributes:
|
|
932
|
+
//
|
|
933
|
+
// blamejs CADF
|
|
934
|
+
// ---------------------- ----------------------------------
|
|
935
|
+
// _id eventid (UUID-ish)
|
|
936
|
+
// action action (typed verb namespace)
|
|
937
|
+
// outcome outcome (success | failure | unknown | pending)
|
|
938
|
+
// actorUserId initiator.id (typed via initiator.typeURI)
|
|
939
|
+
// resourceKind+resourceId target.id + target.typeURI
|
|
940
|
+
// recordedAt eventTime (ISO-8601)
|
|
941
|
+
// reason reason.reasonCode + reason.policyType
|
|
942
|
+
// metadata attachments[] (operator-supplied free-form)
|
|
943
|
+
// prevHash/rowHash observer.id link to chain anchor
|
|
944
|
+
//
|
|
945
|
+
// CADF requires every event to declare its observer (the auditing
|
|
946
|
+
// system). We declare blamejs as the observer with a typeURI of
|
|
947
|
+
// service/audit. The framework version pins observer.id so an auditor
|
|
948
|
+
// can correlate envelope-level events back to a deployment.
|
|
949
|
+
function _toCadfOutcome(outcome) {
|
|
950
|
+
if (outcome === "success") return "success";
|
|
951
|
+
if (outcome === "failure" || outcome === "denied") return "failure";
|
|
952
|
+
if (outcome === "warning") return "unknown";
|
|
953
|
+
return outcome || "unknown";
|
|
954
|
+
}
|
|
955
|
+
|
|
956
|
+
function _toCadfEvent(row) {
|
|
957
|
+
var meta = null;
|
|
958
|
+
if (row.metadata) {
|
|
959
|
+
try { meta = typeof row.metadata === "string" ? safeJson.parse(row.metadata) : row.metadata; }
|
|
960
|
+
catch (_e) { meta = { raw: String(row.metadata) }; }
|
|
961
|
+
}
|
|
962
|
+
var ev = {
|
|
963
|
+
typeURI: "http://schemas.dmtf.org/cloud/audit/1.0/event",
|
|
964
|
+
eventType: "activity",
|
|
965
|
+
id: row._id,
|
|
966
|
+
eventTime: new Date(Number(row.recordedAt)).toISOString(),
|
|
967
|
+
action: row.action,
|
|
968
|
+
outcome: _toCadfOutcome(row.outcome),
|
|
969
|
+
initiator: {
|
|
970
|
+
id: row.actorUserIdHash || row.actorUserId || "unknown",
|
|
971
|
+
typeURI: "service/security/account/user",
|
|
972
|
+
addresses: row.actorIp ? [{ url: row.actorIp, name: "actorIp" }] : undefined,
|
|
973
|
+
name: row.actorSessionId || undefined,
|
|
974
|
+
},
|
|
975
|
+
target: {
|
|
976
|
+
id: row.resourceIdHash || row.resourceId || row.resourceKind || "n/a",
|
|
977
|
+
typeURI: row.resourceKind ? ("service/storage/" + row.resourceKind) : "service/security",
|
|
978
|
+
},
|
|
979
|
+
observer: {
|
|
980
|
+
id: "blamejs:" + (pkg.version || "unknown"),
|
|
981
|
+
typeURI: "service/security/audit",
|
|
982
|
+
name: "blamejs.audit",
|
|
983
|
+
},
|
|
984
|
+
reason: row.reason ? {
|
|
985
|
+
reasonCode: String(row.reason).slice(0, 256), // allow:raw-byte-literal — reason cap
|
|
986
|
+
policyType: "blamejs.audit-chain",
|
|
987
|
+
} : undefined,
|
|
988
|
+
attachments: meta ? [{
|
|
989
|
+
contentType: "application/json",
|
|
990
|
+
content: JSON.stringify(meta),
|
|
991
|
+
name: "blamejs.metadata",
|
|
992
|
+
}] : undefined,
|
|
993
|
+
// Custom CADF extension — anchors back into the audit chain.
|
|
994
|
+
"blamejs:chain": {
|
|
995
|
+
monotonicCounter: Number(row.monotonicCounter),
|
|
996
|
+
prevHash: row.prevHash,
|
|
997
|
+
rowHash: row.rowHash,
|
|
998
|
+
},
|
|
999
|
+
};
|
|
1000
|
+
return ev;
|
|
1001
|
+
}
|
|
1002
|
+
|
|
1003
|
+
/**
|
|
1004
|
+
* @primitive b.auditTools.exportCadf
|
|
1005
|
+
* @signature b.auditTools.exportCadf(opts)
|
|
1006
|
+
* @since 0.7.30
|
|
1007
|
+
* @compliance soc2, pci-dss, gdpr
|
|
1008
|
+
* @related b.auditTools.exportAudit, b.auditTools.exportSlice
|
|
1009
|
+
*
|
|
1010
|
+
* Format an audit slice as a CADF event-batch (Cloud Auditing Data
|
|
1011
|
+
* Federation, ISO/IEC 19395:2017 + DMTF) — the FedRAMP / OpenStack
|
|
1012
|
+
* envelope cross-tenant SIEMs and CSP reporting tools expect for
|
|
1013
|
+
* federated tooling. Maps blamejs fields onto CADF attributes
|
|
1014
|
+
* (initiator / target / observer / outcome / reason) and embeds a
|
|
1015
|
+
* `blamejs:chain` extension carrying `monotonicCounter` / prevHash /
|
|
1016
|
+
* rowHash so auditors can correlate the envelope back to the chain.
|
|
1017
|
+
*
|
|
1018
|
+
* Returns an object with `events: [...]` ready to ship as JSON.
|
|
1019
|
+
*
|
|
1020
|
+
* @opts
|
|
1021
|
+
* format: "cadf", // optional — defaults to "cadf"
|
|
1022
|
+
* from: number|Date|string, // recordedAt >= this
|
|
1023
|
+
* to: number|Date|string, // recordedAt <= this
|
|
1024
|
+
* action: string, // exact action filter
|
|
1025
|
+
*
|
|
1026
|
+
* @example
|
|
1027
|
+
* var batch = await b.auditTools.exportCadf({
|
|
1028
|
+
* from: "2026-05-01T00:00:00Z",
|
|
1029
|
+
* to: "2026-05-08T00:00:00Z",
|
|
1030
|
+
* action: "auth.login",
|
|
1031
|
+
* });
|
|
1032
|
+
* // → { typeURI: ".../event-batch", framework: "blamejs", events: [...] }
|
|
1033
|
+
*/
|
|
1034
|
+
async function exportCadf(opts) {
|
|
1035
|
+
opts = opts || {};
|
|
1036
|
+
if (opts.format !== undefined && opts.format !== "cadf") {
|
|
1037
|
+
throw new AuditToolsError("audit-tools/bad-format",
|
|
1038
|
+
"audit.export: format must be 'cadf' for exportCadf");
|
|
1039
|
+
}
|
|
1040
|
+
var fromMs = _toMs(opts.from);
|
|
1041
|
+
var toMs = _toMs(opts.to);
|
|
1042
|
+
var readRows = opts.readRows || _defaultReadRows;
|
|
1043
|
+
var criteria = {};
|
|
1044
|
+
if (fromMs != null) criteria.fromMs = fromMs;
|
|
1045
|
+
if (toMs != null) criteria.toMs = toMs;
|
|
1046
|
+
if (opts.action) criteria.action = opts.action;
|
|
1047
|
+
var rows = await readRows(criteria);
|
|
1048
|
+
var events = new Array(rows.length);
|
|
1049
|
+
for (var i = 0; i < rows.length; i++) {
|
|
1050
|
+
events[i] = _toCadfEvent(rows[i]);
|
|
1051
|
+
}
|
|
1052
|
+
return {
|
|
1053
|
+
typeURI: "http://schemas.dmtf.org/cloud/audit/1.0/event-batch",
|
|
1054
|
+
framework: "blamejs",
|
|
1055
|
+
frameworkVersion: pkg.version,
|
|
1056
|
+
range: {
|
|
1057
|
+
from: fromMs != null ? new Date(fromMs).toISOString() : null,
|
|
1058
|
+
to: toMs != null ? new Date(toMs).toISOString() : null,
|
|
1059
|
+
},
|
|
1060
|
+
events: events,
|
|
1061
|
+
};
|
|
1062
|
+
}
|
|
1063
|
+
|
|
1064
|
+
// Operator-facing dispatcher — `b.audit.export({ format })`. Future
|
|
1065
|
+
// formats register here.
|
|
1066
|
+
/**
|
|
1067
|
+
* @primitive b.auditTools.exportAudit
|
|
1068
|
+
* @signature b.auditTools.exportAudit(opts)
|
|
1069
|
+
* @since 0.7.30
|
|
1070
|
+
* @compliance soc2, pci-dss, gdpr
|
|
1071
|
+
* @related b.auditTools.exportCadf, b.auditTools.exportSlice
|
|
1072
|
+
*
|
|
1073
|
+
* Format dispatcher for downstream-SIEM exports. Reads `opts.format`
|
|
1074
|
+
* (default `"cadf"`) and delegates to the matching formatter. Future
|
|
1075
|
+
* envelope formats (CEF / OCSF / etc.) register here so callers stay
|
|
1076
|
+
* on a stable signature even when the framework adds formats.
|
|
1077
|
+
*
|
|
1078
|
+
* @opts
|
|
1079
|
+
* format: "cadf", // selector — defaults to "cadf"
|
|
1080
|
+
* from: number|Date|string, // recordedAt >= this
|
|
1081
|
+
* to: number|Date|string, // recordedAt <= this
|
|
1082
|
+
* action: string, // exact action filter
|
|
1083
|
+
*
|
|
1084
|
+
* @example
|
|
1085
|
+
* var batch = await b.auditTools.exportAudit({
|
|
1086
|
+
* format: "cadf",
|
|
1087
|
+
* from: "2026-05-01T00:00:00Z",
|
|
1088
|
+
* to: "2026-05-08T00:00:00Z",
|
|
1089
|
+
* });
|
|
1090
|
+
* // → { typeURI: ".../event-batch", framework: "blamejs", events: [...] }
|
|
1091
|
+
*/
|
|
1092
|
+
async function exportAudit(opts) {
|
|
1093
|
+
opts = opts || {};
|
|
1094
|
+
var format = opts.format || "cadf";
|
|
1095
|
+
if (format === "cadf") return await exportCadf(opts);
|
|
1096
|
+
throw new AuditToolsError("audit-tools/bad-format",
|
|
1097
|
+
"audit.export: format must be one of: cadf (got '" + format + "')");
|
|
1098
|
+
}
|
|
1099
|
+
|
|
1100
|
+
module.exports = {
|
|
1101
|
+
archive: archive,
|
|
1102
|
+
exportSlice: exportSlice,
|
|
1103
|
+
exportAudit: exportAudit,
|
|
1104
|
+
exportCadf: exportCadf,
|
|
1105
|
+
forensicSnapshot: forensicSnapshot,
|
|
1106
|
+
verifyBundle: verifyBundle,
|
|
1107
|
+
purge: purge,
|
|
1108
|
+
withRecordedAtIso: withRecordedAtIso,
|
|
1109
|
+
BUNDLE_FORMAT: BUNDLE_FORMAT,
|
|
1110
|
+
KIND_ARCHIVE: KIND_ARCHIVE,
|
|
1111
|
+
KIND_EXPORT: KIND_EXPORT,
|
|
1112
|
+
AuditToolsError: AuditToolsError,
|
|
1113
|
+
};
|