@blamejs/blamejs-shop 0.5.12 → 0.5.13

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (521) hide show
  1. package/CHANGELOG.md +2 -0
  2. package/lib/asset-manifest.json +1 -1
  3. package/lib/vendor/MANIFEST.json +632 -416
  4. package/lib/vendor/blamejs/.clusterfuzzlite/Dockerfile +21 -10
  5. package/lib/vendor/blamejs/.clusterfuzzlite/build.sh +30 -9
  6. package/lib/vendor/blamejs/.github/dependabot.yml +8 -0
  7. package/lib/vendor/blamejs/.github/workflows/actions-lint.yml +3 -3
  8. package/lib/vendor/blamejs/.github/workflows/cflite_batch.yml +7 -2
  9. package/lib/vendor/blamejs/.github/workflows/cflite_pr.yml +7 -2
  10. package/lib/vendor/blamejs/.github/workflows/ci.yml +21 -21
  11. package/lib/vendor/blamejs/.github/workflows/codeql.yml +3 -3
  12. package/lib/vendor/blamejs/.github/workflows/npm-publish.yml +4 -4
  13. package/lib/vendor/blamejs/.github/workflows/release-container.yml +7 -7
  14. package/lib/vendor/blamejs/.github/workflows/scorecard.yml +3 -3
  15. package/lib/vendor/blamejs/.github/workflows/sha-to-tag-verify.yml +1 -1
  16. package/lib/vendor/blamejs/.gitignore +2 -0
  17. package/lib/vendor/blamejs/CHANGELOG.md +122 -0
  18. package/lib/vendor/blamejs/NOTICE +26 -1
  19. package/lib/vendor/blamejs/SECURITY.md +1 -1
  20. package/lib/vendor/blamejs/api-snapshot.json +207 -5
  21. package/lib/vendor/blamejs/docker/keycloak/realm-blamejs-test.json +29 -0
  22. package/lib/vendor/blamejs/examples/wiki/DEPLOY.md +1 -0
  23. package/lib/vendor/blamejs/examples/wiki/lib/build-app.js +31 -0
  24. package/lib/vendor/blamejs/examples/wiki/lib/source-comment-block-validator.js +109 -0
  25. package/lib/vendor/blamejs/examples/wiki/nginx.conf +106 -0
  26. package/lib/vendor/blamejs/examples/wiki/package-lock.json +1 -1
  27. package/lib/vendor/blamejs/examples/wiki/test/e2e.js +92 -0
  28. package/lib/vendor/blamejs/fuzz/asn1-der.fuzz.js +28 -0
  29. package/lib/vendor/blamejs/fuzz/cms-codec.fuzz.js +17 -0
  30. package/lib/vendor/blamejs/fuzz/link-header.fuzz.js +18 -0
  31. package/lib/vendor/blamejs/index.js +6 -0
  32. package/lib/vendor/blamejs/lib/a2a.js +4 -4
  33. package/lib/vendor/blamejs/lib/agent-idempotency.js +18 -2
  34. package/lib/vendor/blamejs/lib/agent-saga.js +36 -8
  35. package/lib/vendor/blamejs/lib/agent-snapshot.js +63 -6
  36. package/lib/vendor/blamejs/lib/app-shutdown.js +23 -20
  37. package/lib/vendor/blamejs/lib/archive-read.js +8 -0
  38. package/lib/vendor/blamejs/lib/archive-tar.js +12 -2
  39. package/lib/vendor/blamejs/lib/arg-parser.js +49 -5
  40. package/lib/vendor/blamejs/lib/asn1-der.js +12 -0
  41. package/lib/vendor/blamejs/lib/audit-sign.js +47 -1
  42. package/lib/vendor/blamejs/lib/audit.js +71 -8
  43. package/lib/vendor/blamejs/lib/auth/ciba.js +14 -2
  44. package/lib/vendor/blamejs/lib/auth/fido-mds3.js +58 -47
  45. package/lib/vendor/blamejs/lib/auth/jwt.js +34 -0
  46. package/lib/vendor/blamejs/lib/auth/oauth.js +90 -13
  47. package/lib/vendor/blamejs/lib/auth/oid4vci.js +20 -17
  48. package/lib/vendor/blamejs/lib/auth/openid-federation.js +214 -23
  49. package/lib/vendor/blamejs/lib/auth/saml.js +38 -20
  50. package/lib/vendor/blamejs/lib/auth/sd-jwt-vc.js +10 -4
  51. package/lib/vendor/blamejs/lib/backup/bundle.js +13 -3
  52. package/lib/vendor/blamejs/lib/backup/index.js +16 -5
  53. package/lib/vendor/blamejs/lib/backup/manifest.js +18 -5
  54. package/lib/vendor/blamejs/lib/base32.js +21 -0
  55. package/lib/vendor/blamejs/lib/break-glass.js +19 -10
  56. package/lib/vendor/blamejs/lib/bundler.js +5 -1
  57. package/lib/vendor/blamejs/lib/cache-status.js +3 -7
  58. package/lib/vendor/blamejs/lib/calendar.js +21 -1
  59. package/lib/vendor/blamejs/lib/cbor.js +12 -1
  60. package/lib/vendor/blamejs/lib/cert.js +29 -11
  61. package/lib/vendor/blamejs/lib/cli.js +94 -24
  62. package/lib/vendor/blamejs/lib/cloud-events.js +2 -2
  63. package/lib/vendor/blamejs/lib/cluster-provider-db.js +13 -3
  64. package/lib/vendor/blamejs/lib/codepoint-class.js +85 -0
  65. package/lib/vendor/blamejs/lib/compliance-ai-act-prohibited.js +8 -4
  66. package/lib/vendor/blamejs/lib/compliance-ai-act-transparency.js +19 -4
  67. package/lib/vendor/blamejs/lib/compliance-ai-act.js +6 -8
  68. package/lib/vendor/blamejs/lib/content-credentials.js +1 -1
  69. package/lib/vendor/blamejs/lib/content-digest.js +2 -1
  70. package/lib/vendor/blamejs/lib/cookies.js +13 -3
  71. package/lib/vendor/blamejs/lib/cose.js +31 -16
  72. package/lib/vendor/blamejs/lib/crypto-field.js +32 -0
  73. package/lib/vendor/blamejs/lib/crypto-oprf.js +11 -2
  74. package/lib/vendor/blamejs/lib/crypto-xwing.js +22 -4
  75. package/lib/vendor/blamejs/lib/crypto.js +314 -19
  76. package/lib/vendor/blamejs/lib/csp.js +11 -3
  77. package/lib/vendor/blamejs/lib/daemon.js +270 -24
  78. package/lib/vendor/blamejs/lib/dark-patterns.js +5 -2
  79. package/lib/vendor/blamejs/lib/db-declare-view.js +2 -2
  80. package/lib/vendor/blamejs/lib/db-query.js +34 -7
  81. package/lib/vendor/blamejs/lib/db.js +18 -6
  82. package/lib/vendor/blamejs/lib/dbsc.js +17 -0
  83. package/lib/vendor/blamejs/lib/dev.js +21 -2
  84. package/lib/vendor/blamejs/lib/dsr.js +157 -102
  85. package/lib/vendor/blamejs/lib/external-db.js +41 -2
  86. package/lib/vendor/blamejs/lib/file-upload.js +25 -7
  87. package/lib/vendor/blamejs/lib/flag-providers.js +27 -15
  88. package/lib/vendor/blamejs/lib/forms.js +113 -27
  89. package/lib/vendor/blamejs/lib/gate-contract.js +23 -10
  90. package/lib/vendor/blamejs/lib/gdpr-ropa.js +8 -1
  91. package/lib/vendor/blamejs/lib/guard-agent-registry.js +1 -1
  92. package/lib/vendor/blamejs/lib/guard-archive.js +2 -2
  93. package/lib/vendor/blamejs/lib/guard-cidr.js +27 -1
  94. package/lib/vendor/blamejs/lib/guard-graphql.js +30 -11
  95. package/lib/vendor/blamejs/lib/guard-html.js +26 -53
  96. package/lib/vendor/blamejs/lib/guard-image.js +24 -5
  97. package/lib/vendor/blamejs/lib/guard-imap-command.js +10 -2
  98. package/lib/vendor/blamejs/lib/guard-jmap.js +19 -3
  99. package/lib/vendor/blamejs/lib/guard-jwt.js +18 -2
  100. package/lib/vendor/blamejs/lib/guard-list-unsubscribe.js +2 -2
  101. package/lib/vendor/blamejs/lib/guard-managesieve-command.js +10 -2
  102. package/lib/vendor/blamejs/lib/guard-markdown.js +11 -24
  103. package/lib/vendor/blamejs/lib/guard-pdf.js +18 -2
  104. package/lib/vendor/blamejs/lib/guard-pop3-command.js +10 -2
  105. package/lib/vendor/blamejs/lib/guard-regex.js +8 -5
  106. package/lib/vendor/blamejs/lib/guard-svg.js +31 -32
  107. package/lib/vendor/blamejs/lib/guard-time.js +1 -1
  108. package/lib/vendor/blamejs/lib/guard-uuid.js +2 -2
  109. package/lib/vendor/blamejs/lib/html-balance.js +3 -3
  110. package/lib/vendor/blamejs/lib/http-client-cache.js +82 -4
  111. package/lib/vendor/blamejs/lib/http-client-cookie-jar.js +16 -1
  112. package/lib/vendor/blamejs/lib/http-client.js +39 -7
  113. package/lib/vendor/blamejs/lib/http-message-signature.js +35 -1
  114. package/lib/vendor/blamejs/lib/i18n-messageformat.js +31 -6
  115. package/lib/vendor/blamejs/lib/i18n.js +35 -21
  116. package/lib/vendor/blamejs/lib/incident-report.js +8 -1
  117. package/lib/vendor/blamejs/lib/ip-utils.js +11 -1
  118. package/lib/vendor/blamejs/lib/json-path.js +23 -1
  119. package/lib/vendor/blamejs/lib/jwk.js +20 -3
  120. package/lib/vendor/blamejs/lib/link-header.js +2 -1
  121. package/lib/vendor/blamejs/lib/log-stream-otlp-grpc.js +5 -1
  122. package/lib/vendor/blamejs/lib/log-stream-otlp.js +5 -1
  123. package/lib/vendor/blamejs/lib/log-stream.js +8 -3
  124. package/lib/vendor/blamejs/lib/mail-auth.js +123 -22
  125. package/lib/vendor/blamejs/lib/mail-bimi.js +1 -1
  126. package/lib/vendor/blamejs/lib/mail-bounce.js +8 -0
  127. package/lib/vendor/blamejs/lib/mail-crypto-pgp.js +46 -10
  128. package/lib/vendor/blamejs/lib/mail-dav.js +22 -3
  129. package/lib/vendor/blamejs/lib/mail-dkim.js +96 -30
  130. package/lib/vendor/blamejs/lib/mail-helo.js +6 -1
  131. package/lib/vendor/blamejs/lib/mail-scan.js +23 -16
  132. package/lib/vendor/blamejs/lib/mail-send-deliver.js +34 -8
  133. package/lib/vendor/blamejs/lib/mail-server-imap.js +3 -4
  134. package/lib/vendor/blamejs/lib/mail-server-managesieve.js +7 -11
  135. package/lib/vendor/blamejs/lib/mail-server-mx.js +93 -7
  136. package/lib/vendor/blamejs/lib/mail-server-registry.js +8 -2
  137. package/lib/vendor/blamejs/lib/mail.js +15 -5
  138. package/lib/vendor/blamejs/lib/metrics.js +268 -63
  139. package/lib/vendor/blamejs/lib/middleware/age-gate.js +7 -1
  140. package/lib/vendor/blamejs/lib/middleware/asyncapi-serve.js +1 -1
  141. package/lib/vendor/blamejs/lib/middleware/body-parser.js +19 -4
  142. package/lib/vendor/blamejs/lib/middleware/bot-guard.js +5 -9
  143. package/lib/vendor/blamejs/lib/middleware/csp-report.js +40 -8
  144. package/lib/vendor/blamejs/lib/middleware/csrf-protect.js +24 -10
  145. package/lib/vendor/blamejs/lib/middleware/dpop.js +10 -5
  146. package/lib/vendor/blamejs/lib/middleware/index.js +6 -1
  147. package/lib/vendor/blamejs/lib/middleware/nel.js +1 -1
  148. package/lib/vendor/blamejs/lib/middleware/openapi-serve.js +1 -1
  149. package/lib/vendor/blamejs/lib/middleware/rate-limit.js +12 -1
  150. package/lib/vendor/blamejs/lib/middleware/require-bound-key.js +1 -1
  151. package/lib/vendor/blamejs/lib/middleware/scim-server.js +1 -1
  152. package/lib/vendor/blamejs/lib/middleware/tus-upload.js +6 -2
  153. package/lib/vendor/blamejs/lib/mtls-ca.js +18 -2
  154. package/lib/vendor/blamejs/lib/network-dns-resolver.js +11 -1
  155. package/lib/vendor/blamejs/lib/network-dns.js +21 -2
  156. package/lib/vendor/blamejs/lib/network-tls.js +69 -7
  157. package/lib/vendor/blamejs/lib/nonce-store.js +9 -1
  158. package/lib/vendor/blamejs/lib/object-store/gcs.js +7 -0
  159. package/lib/vendor/blamejs/lib/object-store/sigv4.js +31 -0
  160. package/lib/vendor/blamejs/lib/observability-otlp-exporter.js +1 -1
  161. package/lib/vendor/blamejs/lib/outbox.js +1 -1
  162. package/lib/vendor/blamejs/lib/parsers/safe-ini.js +9 -1
  163. package/lib/vendor/blamejs/lib/parsers/safe-toml.js +10 -1
  164. package/lib/vendor/blamejs/lib/permissions.js +6 -3
  165. package/lib/vendor/blamejs/lib/pid-probe.js +55 -0
  166. package/lib/vendor/blamejs/lib/pqc-agent.js +8 -1
  167. package/lib/vendor/blamejs/lib/pqc-software.js +3 -3
  168. package/lib/vendor/blamejs/lib/pubsub.js +20 -9
  169. package/lib/vendor/blamejs/lib/queue-local.js +8 -1
  170. package/lib/vendor/blamejs/lib/queue-redis.js +5 -0
  171. package/lib/vendor/blamejs/lib/redact.js +54 -0
  172. package/lib/vendor/blamejs/lib/restore-bundle.js +10 -2
  173. package/lib/vendor/blamejs/lib/restore.js +19 -0
  174. package/lib/vendor/blamejs/lib/retention.js +12 -4
  175. package/lib/vendor/blamejs/lib/router.js +60 -6
  176. package/lib/vendor/blamejs/lib/safe-buffer.js +69 -0
  177. package/lib/vendor/blamejs/lib/safe-decompress.js +8 -2
  178. package/lib/vendor/blamejs/lib/safe-dns.js +25 -20
  179. package/lib/vendor/blamejs/lib/safe-ical.js +7 -3
  180. package/lib/vendor/blamejs/lib/safe-mime.js +12 -1
  181. package/lib/vendor/blamejs/lib/safe-object.js +80 -0
  182. package/lib/vendor/blamejs/lib/safe-path.js +52 -4
  183. package/lib/vendor/blamejs/lib/safe-redirect.js +10 -2
  184. package/lib/vendor/blamejs/lib/safe-schema.js +4 -1
  185. package/lib/vendor/blamejs/lib/safe-sieve.js +33 -1
  186. package/lib/vendor/blamejs/lib/safe-sql.js +88 -0
  187. package/lib/vendor/blamejs/lib/safe-vcard.js +7 -3
  188. package/lib/vendor/blamejs/lib/scheduler.js +8 -1
  189. package/lib/vendor/blamejs/lib/security-assert.js +6 -6
  190. package/lib/vendor/blamejs/lib/self-update-standalone-verifier.js +74 -27
  191. package/lib/vendor/blamejs/lib/self-update.js +517 -87
  192. package/lib/vendor/blamejs/lib/server-timing.js +2 -4
  193. package/lib/vendor/blamejs/lib/session.js +34 -12
  194. package/lib/vendor/blamejs/lib/sql.js +15 -1
  195. package/lib/vendor/blamejs/lib/ssrf-guard.js +52 -0
  196. package/lib/vendor/blamejs/lib/static.js +55 -13
  197. package/lib/vendor/blamejs/lib/storage.js +8 -2
  198. package/lib/vendor/blamejs/lib/subject.js +6 -1
  199. package/lib/vendor/blamejs/lib/tenant-quota.js +52 -13
  200. package/lib/vendor/blamejs/lib/tls-exporter.js +3 -3
  201. package/lib/vendor/blamejs/lib/tsa.js +34 -13
  202. package/lib/vendor/blamejs/lib/uri-template.js +8 -1
  203. package/lib/vendor/blamejs/lib/vault/index.js +13 -0
  204. package/lib/vendor/blamejs/lib/vc.js +44 -5
  205. package/lib/vendor/blamejs/lib/vendor/MANIFEST.json +26 -26
  206. package/lib/vendor/blamejs/lib/vendor/noble-ciphers.cjs +792 -1
  207. package/lib/vendor/blamejs/lib/vendor/noble-curves.cjs +3443 -1
  208. package/lib/vendor/blamejs/lib/vendor/noble-post-quantum.cjs +2737 -1
  209. package/lib/vendor/blamejs/lib/vendor/pki.cjs +39550 -13
  210. package/lib/vendor/blamejs/lib/vendor/public-suffix-list.dat +55 -53
  211. package/lib/vendor/blamejs/lib/vendor/public-suffix-list.data.js +5551 -5554
  212. package/lib/vendor/blamejs/lib/vendor/simplewebauthn-server.cjs +22459 -32
  213. package/lib/vendor/blamejs/lib/watcher.js +89 -17
  214. package/lib/vendor/blamejs/lib/webhook-dispatcher.js +25 -3
  215. package/lib/vendor/blamejs/lib/webhook.js +12 -2
  216. package/lib/vendor/blamejs/lib/ws-client.js +32 -1
  217. package/lib/vendor/blamejs/lib/xml-c14n.js +29 -1
  218. package/lib/vendor/blamejs/oss-fuzz/projects/blamejs/Dockerfile +1 -1
  219. package/lib/vendor/blamejs/package-lock.json +2 -2
  220. package/lib/vendor/blamejs/package.json +1 -1
  221. package/lib/vendor/blamejs/release-notes/v0.16.x.json +1462 -0
  222. package/lib/vendor/blamejs/release-notes/v0.17.0.json +31 -0
  223. package/lib/vendor/blamejs/release-notes/v0.17.1.json +31 -0
  224. package/lib/vendor/blamejs/release-notes/v0.17.10.json +30 -0
  225. package/lib/vendor/blamejs/release-notes/v0.17.11.json +22 -0
  226. package/lib/vendor/blamejs/release-notes/v0.17.12.json +18 -0
  227. package/lib/vendor/blamejs/release-notes/v0.17.13.json +77 -0
  228. package/lib/vendor/blamejs/release-notes/v0.17.14.json +40 -0
  229. package/lib/vendor/blamejs/release-notes/v0.17.15.json +18 -0
  230. package/lib/vendor/blamejs/release-notes/v0.17.16.json +27 -0
  231. package/lib/vendor/blamejs/release-notes/v0.17.17.json +31 -0
  232. package/lib/vendor/blamejs/release-notes/v0.17.18.json +18 -0
  233. package/lib/vendor/blamejs/release-notes/v0.17.19.json +18 -0
  234. package/lib/vendor/blamejs/release-notes/v0.17.2.json +26 -0
  235. package/lib/vendor/blamejs/release-notes/v0.17.20.json +43 -0
  236. package/lib/vendor/blamejs/release-notes/v0.17.21.json +26 -0
  237. package/lib/vendor/blamejs/release-notes/v0.17.22.json +18 -0
  238. package/lib/vendor/blamejs/release-notes/v0.17.3.json +43 -0
  239. package/lib/vendor/blamejs/release-notes/v0.17.4.json +35 -0
  240. package/lib/vendor/blamejs/release-notes/v0.17.5.json +26 -0
  241. package/lib/vendor/blamejs/release-notes/v0.17.6.json +26 -0
  242. package/lib/vendor/blamejs/release-notes/v0.17.7.json +35 -0
  243. package/lib/vendor/blamejs/release-notes/v0.17.8.json +22 -0
  244. package/lib/vendor/blamejs/release-notes/v0.17.9.json +26 -0
  245. package/lib/vendor/blamejs/scripts/validate-source-comment-blocks.js +4 -0
  246. package/lib/vendor/blamejs/scripts/vendor-update.sh +293 -9
  247. package/lib/vendor/blamejs/socket.yml +94 -0
  248. package/lib/vendor/blamejs/test/00-primitives.js +605 -0
  249. package/lib/vendor/blamejs/test/helpers/drivers.js +12 -9
  250. package/lib/vendor/blamejs/test/integration/audit-stack-mysql.test.js +90 -1
  251. package/lib/vendor/blamejs/test/integration/audit-stack-postgres.test.js +122 -1
  252. package/lib/vendor/blamejs/test/integration/data-layer-mysql.test.js +30 -0
  253. package/lib/vendor/blamejs/test/integration/data-layer-pg.test.js +29 -0
  254. package/lib/vendor/blamejs/test/integration/dsr-cluster-mysql.test.js +479 -0
  255. package/lib/vendor/blamejs/test/integration/dsr-cluster-pg.test.js +487 -0
  256. package/lib/vendor/blamejs/test/integration/federation-auth.test.js +313 -5
  257. package/lib/vendor/blamejs/test/integration/mail-dkim.test.js +80 -0
  258. package/lib/vendor/blamejs/test/integration/openid-federation-chain.test.js +275 -0
  259. package/lib/vendor/blamejs/test/integration/webhook-dispatcher-pg.test.js +96 -0
  260. package/lib/vendor/blamejs/test/layer-0-primitives/a2a-tasks.test.js +401 -0
  261. package/lib/vendor/blamejs/test/layer-0-primitives/acme.test.js +1649 -2
  262. package/lib/vendor/blamejs/test/layer-0-primitives/age-gate.test.js +33 -0
  263. package/lib/vendor/blamejs/test/layer-0-primitives/agent-idempotency.test.js +0 -0
  264. package/lib/vendor/blamejs/test/layer-0-primitives/agent-saga.test.js +60 -0
  265. package/lib/vendor/blamejs/test/layer-0-primitives/agent-snapshot.test.js +524 -0
  266. package/lib/vendor/blamejs/test/layer-0-primitives/api-encrypt.test.js +891 -0
  267. package/lib/vendor/blamejs/test/layer-0-primitives/app-shutdown.test.js +128 -1
  268. package/lib/vendor/blamejs/test/layer-0-primitives/archive-adapters.test.js +271 -0
  269. package/lib/vendor/blamejs/test/layer-0-primitives/archive-read.test.js +628 -1
  270. package/lib/vendor/blamejs/test/layer-0-primitives/archive-tar-read.test.js +0 -0
  271. package/lib/vendor/blamejs/test/layer-0-primitives/archive-wrap.test.js +227 -0
  272. package/lib/vendor/blamejs/test/layer-0-primitives/arg-parser.test.js +15 -0
  273. package/lib/vendor/blamejs/test/layer-0-primitives/asn1-der.test.js +73 -0
  274. package/lib/vendor/blamejs/test/layer-0-primitives/atomic-file.test.js +114 -0
  275. package/lib/vendor/blamejs/test/layer-0-primitives/audit-sign-anchor.test.js +141 -0
  276. package/lib/vendor/blamejs/test/layer-0-primitives/audit-tools.test.js +624 -0
  277. package/lib/vendor/blamejs/test/layer-0-primitives/audit.test.js +769 -0
  278. package/lib/vendor/blamejs/test/layer-0-primitives/auth-jwt-defenses.test.js +436 -0
  279. package/lib/vendor/blamejs/test/layer-0-primitives/auth-oauth.test.js +1697 -0
  280. package/lib/vendor/blamejs/test/layer-0-primitives/auth-oid4vp.test.js +495 -0
  281. package/lib/vendor/blamejs/test/layer-0-primitives/auth-password.test.js +500 -0
  282. package/lib/vendor/blamejs/test/layer-0-primitives/auth-saml.test.js +1809 -0
  283. package/lib/vendor/blamejs/test/layer-0-primitives/auth-status-list.test.js +243 -1
  284. package/lib/vendor/blamejs/test/layer-0-primitives/backup-index.test.js +2226 -0
  285. package/lib/vendor/blamejs/test/layer-0-primitives/backup-manifest-signature.test.js +183 -0
  286. package/lib/vendor/blamejs/test/layer-0-primitives/base32.test.js +105 -0
  287. package/lib/vendor/blamejs/test/layer-0-primitives/break-glass.test.js +693 -0
  288. package/lib/vendor/blamejs/test/layer-0-primitives/cache.test.js +603 -0
  289. package/lib/vendor/blamejs/test/layer-0-primitives/calendar.test.js +557 -0
  290. package/lib/vendor/blamejs/test/layer-0-primitives/case-insensitive-security-token-guard.test.js +214 -0
  291. package/lib/vendor/blamejs/test/layer-0-primitives/cbor.test.js +25 -0
  292. package/lib/vendor/blamejs/test/layer-0-primitives/cert.test.js +843 -6
  293. package/lib/vendor/blamejs/test/layer-0-primitives/ciba-authreqid-binding.test.js +77 -2
  294. package/lib/vendor/blamejs/test/layer-0-primitives/ciba.test.js +866 -0
  295. package/lib/vendor/blamejs/test/layer-0-primitives/clear-site-data.test.js +18 -0
  296. package/lib/vendor/blamejs/test/layer-0-primitives/cli-erase.test.js +19 -0
  297. package/lib/vendor/blamejs/test/layer-0-primitives/cli.test.js +2790 -0
  298. package/lib/vendor/blamejs/test/layer-0-primitives/cluster-lease-renewal-ttl.test.js +114 -0
  299. package/lib/vendor/blamejs/test/layer-0-primitives/cluster.test.js +1032 -0
  300. package/lib/vendor/blamejs/test/layer-0-primitives/cms-codec.test.js +575 -0
  301. package/lib/vendor/blamejs/test/layer-0-primitives/codebase-patterns.test.js +739 -1
  302. package/lib/vendor/blamejs/test/layer-0-primitives/codepoint-class.test.js +8 -0
  303. package/lib/vendor/blamejs/test/layer-0-primitives/compliance-ai-act.test.js +194 -0
  304. package/lib/vendor/blamejs/test/layer-0-primitives/compliance-lifecycle-proto-key.test.js +104 -0
  305. package/lib/vendor/blamejs/test/layer-0-primitives/compliance-sanctions.test.js +254 -0
  306. package/lib/vendor/blamejs/test/layer-0-primitives/content-credentials.test.js +613 -3
  307. package/lib/vendor/blamejs/test/layer-0-primitives/cookies.test.js +140 -0
  308. package/lib/vendor/blamejs/test/layer-0-primitives/cose.test.js +407 -0
  309. package/lib/vendor/blamejs/test/layer-0-primitives/crypto-adversarial.test.js +352 -0
  310. package/lib/vendor/blamejs/test/layer-0-primitives/crypto-field-derived-hash.test.js +32 -0
  311. package/lib/vendor/blamejs/test/layer-0-primitives/crypto-field.test.js +575 -0
  312. package/lib/vendor/blamejs/test/layer-0-primitives/crypto-hash-files-parallel.test.js +10 -0
  313. package/lib/vendor/blamejs/test/layer-0-primitives/crypto-hash-stream.test.js +24 -0
  314. package/lib/vendor/blamejs/test/layer-0-primitives/crypto-oprf.test.js +17 -0
  315. package/lib/vendor/blamejs/test/layer-0-primitives/crypto-spki-pin.test.js +183 -0
  316. package/lib/vendor/blamejs/test/layer-0-primitives/crypto-xwing.test.js +48 -0
  317. package/lib/vendor/blamejs/test/layer-0-primitives/crypto.test.js +345 -0
  318. package/lib/vendor/blamejs/test/layer-0-primitives/csp-report.test.js +58 -0
  319. package/lib/vendor/blamejs/test/layer-0-primitives/csv.test.js +48 -0
  320. package/lib/vendor/blamejs/test/layer-0-primitives/daemon.test.js +459 -1
  321. package/lib/vendor/blamejs/test/layer-0-primitives/dark-patterns.test.js +19 -0
  322. package/lib/vendor/blamejs/test/layer-0-primitives/db-query.test.js +1019 -0
  323. package/lib/vendor/blamejs/test/layer-0-primitives/db-raw-residency-gate.test.js +77 -0
  324. package/lib/vendor/blamejs/test/layer-0-primitives/db.test.js +1621 -0
  325. package/lib/vendor/blamejs/test/layer-0-primitives/ddl-change-control.test.js +462 -3
  326. package/lib/vendor/blamejs/test/layer-0-primitives/dnssec.test.js +323 -0
  327. package/lib/vendor/blamejs/test/layer-0-primitives/dpop-middleware-verify.test.js +562 -0
  328. package/lib/vendor/blamejs/test/layer-0-primitives/dsr.test.js +901 -1
  329. package/lib/vendor/blamejs/test/layer-0-primitives/dual-control.test.js +249 -0
  330. package/lib/vendor/blamejs/test/layer-0-primitives/external-db-migrate.test.js +561 -0
  331. package/lib/vendor/blamejs/test/layer-0-primitives/external-db.test.js +1214 -0
  332. package/lib/vendor/blamejs/test/layer-0-primitives/fal.test.js +21 -0
  333. package/lib/vendor/blamejs/test/layer-0-primitives/fedcm-dbsc.test.js +46 -20
  334. package/lib/vendor/blamejs/test/layer-0-primitives/federation-vc-suite.test.js +147 -3
  335. package/lib/vendor/blamejs/test/layer-0-primitives/fido-mds3.test.js +907 -38
  336. package/lib/vendor/blamejs/test/layer-0-primitives/file-upload-content-safety-skip-audit.test.js +29 -0
  337. package/lib/vendor/blamejs/test/layer-0-primitives/file-upload.test.js +1135 -0
  338. package/lib/vendor/blamejs/test/layer-0-primitives/flag.test.js +30 -0
  339. package/lib/vendor/blamejs/test/layer-0-primitives/forms.test.js +747 -0
  340. package/lib/vendor/blamejs/test/layer-0-primitives/gate-contract.test.js +1855 -0
  341. package/lib/vendor/blamejs/test/layer-0-primitives/gdpr-ropa.test.js +30 -0
  342. package/lib/vendor/blamejs/test/layer-0-primitives/guard-archive.test.js +86 -0
  343. package/lib/vendor/blamejs/test/layer-0-primitives/guard-auth.test.js +117 -0
  344. package/lib/vendor/blamejs/test/layer-0-primitives/guard-cidr.test.js +151 -0
  345. package/lib/vendor/blamejs/test/layer-0-primitives/guard-domain.test.js +422 -0
  346. package/lib/vendor/blamejs/test/layer-0-primitives/guard-filename.test.js +424 -0
  347. package/lib/vendor/blamejs/test/layer-0-primitives/{guard-gate-disposition-coverage.test.js → guard-gate-disposition.test.js} +1 -1
  348. package/lib/vendor/blamejs/test/layer-0-primitives/guard-graphql.test.js +340 -0
  349. package/lib/vendor/blamejs/test/layer-0-primitives/guard-html.test.js +29 -0
  350. package/lib/vendor/blamejs/test/layer-0-primitives/guard-idempotency-key.test.js +28 -0
  351. package/lib/vendor/blamejs/test/layer-0-primitives/guard-image.test.js +519 -45
  352. package/lib/vendor/blamejs/test/layer-0-primitives/guard-imap-command.test.js +0 -0
  353. package/lib/vendor/blamejs/test/layer-0-primitives/guard-jmap.test.js +51 -0
  354. package/lib/vendor/blamejs/test/layer-0-primitives/guard-jsonpath.test.js +66 -0
  355. package/lib/vendor/blamejs/test/layer-0-primitives/guard-jwt.test.js +436 -0
  356. package/lib/vendor/blamejs/test/layer-0-primitives/guard-managesieve-command.test.js +25 -0
  357. package/lib/vendor/blamejs/test/layer-0-primitives/guard-markdown.test.js +16 -0
  358. package/lib/vendor/blamejs/test/layer-0-primitives/guard-mime.test.js +86 -0
  359. package/lib/vendor/blamejs/test/layer-0-primitives/guard-oauth.test.js +140 -0
  360. package/lib/vendor/blamejs/test/layer-0-primitives/guard-pdf.test.js +80 -0
  361. package/lib/vendor/blamejs/test/layer-0-primitives/guard-pop3-command.test.js +27 -0
  362. package/lib/vendor/blamejs/test/layer-0-primitives/guard-regex.test.js +99 -0
  363. package/lib/vendor/blamejs/test/layer-0-primitives/guard-shell.test.js +76 -0
  364. package/lib/vendor/blamejs/test/layer-0-primitives/{guard-sql-coverage.test.js → guard-sql.test.js} +3 -3
  365. package/lib/vendor/blamejs/test/layer-0-primitives/guard-svg.test.js +524 -0
  366. package/lib/vendor/blamejs/test/layer-0-primitives/guard-template.test.js +71 -0
  367. package/lib/vendor/blamejs/test/layer-0-primitives/guard-time.test.js +92 -0
  368. package/lib/vendor/blamejs/test/layer-0-primitives/guard-uuid.test.js +86 -0
  369. package/lib/vendor/blamejs/test/layer-0-primitives/html-balance.test.js +38 -0
  370. package/lib/vendor/blamejs/test/layer-0-primitives/http-client-cache-authorization.test.js +347 -0
  371. package/lib/vendor/blamejs/test/layer-0-primitives/http-client-cache.test.js +908 -0
  372. package/lib/vendor/blamejs/test/layer-0-primitives/http-client.test.js +2874 -0
  373. package/lib/vendor/blamejs/test/layer-0-primitives/http-message-signature.test.js +643 -0
  374. package/lib/vendor/blamejs/test/layer-0-primitives/i18n-messageformat.test.js +38 -0
  375. package/lib/vendor/blamejs/test/layer-0-primitives/i18n.test.js +1153 -1
  376. package/lib/vendor/blamejs/test/layer-0-primitives/idempotency-key.test.js +494 -0
  377. package/lib/vendor/blamejs/test/layer-0-primitives/ip-utils.test.js +30 -0
  378. package/lib/vendor/blamejs/test/layer-0-primitives/jsdoc-example-execution.test.js +177 -0
  379. package/lib/vendor/blamejs/test/layer-0-primitives/json-path.test.js +103 -0
  380. package/lib/vendor/blamejs/test/layer-0-primitives/json-schema.test.js +214 -0
  381. package/lib/vendor/blamejs/test/layer-0-primitives/jwk.test.js +41 -0
  382. package/lib/vendor/blamejs/test/layer-0-primitives/jwt-external.test.js +276 -0
  383. package/lib/vendor/blamejs/test/layer-0-primitives/keychain.test.js +0 -0
  384. package/lib/vendor/blamejs/test/layer-0-primitives/log-stream.test.js +241 -0
  385. package/lib/vendor/blamejs/test/layer-0-primitives/log.test.js +106 -0
  386. package/lib/vendor/blamejs/test/layer-0-primitives/mail-agent.test.js +441 -0
  387. package/lib/vendor/blamejs/test/layer-0-primitives/mail-auth.test.js +2136 -4
  388. package/lib/vendor/blamejs/test/layer-0-primitives/mail-bimi.test.js +759 -12
  389. package/lib/vendor/blamejs/test/layer-0-primitives/mail-bounce.test.js +811 -1
  390. package/lib/vendor/blamejs/test/layer-0-primitives/mail-crypto-pgp-experimental.test.js +401 -3
  391. package/lib/vendor/blamejs/test/layer-0-primitives/mail-crypto-pgp.test.js +751 -8
  392. package/lib/vendor/blamejs/test/layer-0-primitives/mail-crypto-smime.test.js +864 -0
  393. package/lib/vendor/blamejs/test/layer-0-primitives/mail-crypto.test.js +110 -0
  394. package/lib/vendor/blamejs/test/layer-0-primitives/mail-dav.test.js +830 -1
  395. package/lib/vendor/blamejs/test/layer-0-primitives/mail-deploy.test.js +635 -86
  396. package/lib/vendor/blamejs/test/layer-0-primitives/mail-dkim.test.js +818 -0
  397. package/lib/vendor/blamejs/test/layer-0-primitives/mail-helo.test.js +27 -0
  398. package/lib/vendor/blamejs/test/layer-0-primitives/mail-scan.test.js +199 -0
  399. package/lib/vendor/blamejs/test/layer-0-primitives/mail-send-deliver.test.js +686 -2
  400. package/lib/vendor/blamejs/test/layer-0-primitives/mail-server-imap.test.js +778 -0
  401. package/lib/vendor/blamejs/test/layer-0-primitives/mail-server-jmap.test.js +1438 -0
  402. package/lib/vendor/blamejs/test/layer-0-primitives/mail-server-managesieve.test.js +449 -6
  403. package/lib/vendor/blamejs/test/layer-0-primitives/mail-server-mx.test.js +773 -2
  404. package/lib/vendor/blamejs/test/layer-0-primitives/mail-server-pop3.test.js +623 -3
  405. package/lib/vendor/blamejs/test/layer-0-primitives/mail-server-rate-limit.test.js +55 -0
  406. package/lib/vendor/blamejs/test/layer-0-primitives/mail-server-registry.test.js +13 -0
  407. package/lib/vendor/blamejs/test/layer-0-primitives/mail-server-submission.test.js +877 -1
  408. package/lib/vendor/blamejs/test/layer-0-primitives/mail-sieve.test.js +326 -0
  409. package/lib/vendor/blamejs/test/layer-0-primitives/mail-store-fts.test.js +55 -0
  410. package/lib/vendor/blamejs/test/layer-0-primitives/mail-store.test.js +242 -0
  411. package/lib/vendor/blamejs/test/layer-0-primitives/mail.test.js +1596 -2
  412. package/lib/vendor/blamejs/test/layer-0-primitives/mcp.test.js +440 -4
  413. package/lib/vendor/blamejs/test/layer-0-primitives/metrics-snapshot.test.js +89 -0
  414. package/lib/vendor/blamejs/test/layer-0-primitives/metrics.test.js +1230 -0
  415. package/lib/vendor/blamejs/test/layer-0-primitives/middleware-assetlinks.test.js +113 -0
  416. package/lib/vendor/blamejs/test/layer-0-primitives/middleware-body-parser.test.js +1169 -0
  417. package/lib/vendor/blamejs/test/layer-0-primitives/middleware-bot-disclose.test.js +123 -0
  418. package/lib/vendor/blamejs/test/layer-0-primitives/middleware-cookies.test.js +108 -0
  419. package/lib/vendor/blamejs/test/layer-0-primitives/middleware-gpc.test.js +121 -0
  420. package/lib/vendor/blamejs/test/layer-0-primitives/middleware-headers.test.js +163 -0
  421. package/lib/vendor/blamejs/test/layer-0-primitives/middleware-host-allowlist.test.js +154 -0
  422. package/lib/vendor/blamejs/test/layer-0-primitives/middleware-require-content-type.test.js +127 -0
  423. package/lib/vendor/blamejs/test/layer-0-primitives/{middleware-tus-upload-coverage.test.js → middleware-tus-upload.test.js} +45 -0
  424. package/lib/vendor/blamejs/test/layer-0-primitives/middleware-web-app-manifest.test.js +132 -0
  425. package/lib/vendor/blamejs/test/layer-0-primitives/mtls-ca-crl-fingerprint-only.test.js +92 -0
  426. package/lib/vendor/blamejs/test/layer-0-primitives/network-dns-resolver.test.js +65 -0
  427. package/lib/vendor/blamejs/test/layer-0-primitives/network-dns.test.js +1727 -1
  428. package/lib/vendor/blamejs/test/layer-0-primitives/network-nts.test.js +699 -0
  429. package/lib/vendor/blamejs/test/layer-0-primitives/network-smtp-policy.test.js +1181 -0
  430. package/lib/vendor/blamejs/test/layer-0-primitives/network-tls.test.js +1876 -3
  431. package/lib/vendor/blamejs/test/layer-0-primitives/network.test.js +32 -0
  432. package/lib/vendor/blamejs/test/layer-0-primitives/nonce-store-enforce-replay-nonboolean.test.js +81 -0
  433. package/lib/vendor/blamejs/test/layer-0-primitives/ntp-check.test.js +122 -0
  434. package/lib/vendor/blamejs/test/layer-0-primitives/observability-tracing.test.js +378 -0
  435. package/lib/vendor/blamejs/test/layer-0-primitives/observability.test.js +77 -0
  436. package/lib/vendor/blamejs/test/layer-0-primitives/oid4vci.test.js +1016 -0
  437. package/lib/vendor/blamejs/test/layer-0-primitives/openid-federation.test.js +946 -0
  438. package/lib/vendor/blamejs/test/layer-0-primitives/outbox.test.js +818 -0
  439. package/lib/vendor/blamejs/test/layer-0-primitives/own-property-membership-guards.test.js +109 -0
  440. package/lib/vendor/blamejs/test/layer-0-primitives/parsers-safe-toml.test.js +543 -0
  441. package/lib/vendor/blamejs/test/layer-0-primitives/{parsers-safe-yaml-coverage.test.js → parsers-safe-yaml.test.js} +2 -2
  442. package/lib/vendor/blamejs/test/layer-0-primitives/parsers-standalone.test.js +73 -0
  443. package/lib/vendor/blamejs/test/layer-0-primitives/passkey.test.js +649 -0
  444. package/lib/vendor/blamejs/test/layer-0-primitives/permissions.test.js +524 -0
  445. package/lib/vendor/blamejs/test/layer-0-primitives/pqc-agent-curve.test.js +22 -0
  446. package/lib/vendor/blamejs/test/layer-0-primitives/pubsub.test.js +295 -0
  447. package/lib/vendor/blamejs/test/layer-0-primitives/queue-flow-repeat.test.js +36 -0
  448. package/lib/vendor/blamejs/test/layer-0-primitives/queue.test.js +83 -0
  449. package/lib/vendor/blamejs/test/layer-0-primitives/rate-limit-xff-spoofing.test.js +34 -0
  450. package/lib/vendor/blamejs/test/layer-0-primitives/redact.test.js +1031 -0
  451. package/lib/vendor/blamejs/test/layer-0-primitives/request-helpers.test.js +94 -0
  452. package/lib/vendor/blamejs/test/layer-0-primitives/require-bound-key.test.js +401 -0
  453. package/lib/vendor/blamejs/test/layer-0-primitives/restore-empty-manifest-wipe.test.js +154 -0
  454. package/lib/vendor/blamejs/test/layer-0-primitives/retention.test.js +600 -0
  455. package/lib/vendor/blamejs/test/layer-0-primitives/router-host-path-injection.test.js +231 -0
  456. package/lib/vendor/blamejs/test/layer-0-primitives/router-tls0rtt.test.js +21 -0
  457. package/lib/vendor/blamejs/test/layer-0-primitives/router.test.js +1277 -0
  458. package/lib/vendor/blamejs/test/layer-0-primitives/safe-async.test.js +133 -0
  459. package/lib/vendor/blamejs/test/layer-0-primitives/safe-buffer-linear-scans.test.js +14 -0
  460. package/lib/vendor/blamejs/test/layer-0-primitives/safe-buffer.test.js +80 -0
  461. package/lib/vendor/blamejs/test/layer-0-primitives/safe-decompress.test.js +28 -0
  462. package/lib/vendor/blamejs/test/layer-0-primitives/safe-dns.test.js +245 -0
  463. package/lib/vendor/blamejs/test/layer-0-primitives/safe-ical.test.js +32 -0
  464. package/lib/vendor/blamejs/test/layer-0-primitives/safe-ini.test.js +376 -0
  465. package/lib/vendor/blamejs/test/layer-0-primitives/safe-json.test.js +175 -0
  466. package/lib/vendor/blamejs/test/layer-0-primitives/safe-mime.test.js +518 -0
  467. package/lib/vendor/blamejs/test/layer-0-primitives/safe-object.test.js +62 -0
  468. package/lib/vendor/blamejs/test/layer-0-primitives/safe-path.test.js +30 -0
  469. package/lib/vendor/blamejs/test/layer-0-primitives/safe-schema.test.js +104 -0
  470. package/lib/vendor/blamejs/test/layer-0-primitives/safe-sql.test.js +142 -0
  471. package/lib/vendor/blamejs/test/layer-0-primitives/safe-url.test.js +112 -0
  472. package/lib/vendor/blamejs/test/layer-0-primitives/safe-vcard.test.js +26 -0
  473. package/lib/vendor/blamejs/test/layer-0-primitives/scheduler.test.js +157 -0
  474. package/lib/vendor/blamejs/test/layer-0-primitives/scim-server.test.js +396 -0
  475. package/lib/vendor/blamejs/test/layer-0-primitives/sd-jwt-vc.test.js +930 -0
  476. package/lib/vendor/blamejs/test/layer-0-primitives/security-assert.test.js +755 -82
  477. package/lib/vendor/blamejs/test/layer-0-primitives/self-update.test.js +1053 -0
  478. package/lib/vendor/blamejs/test/layer-0-primitives/session-device-binding.test.js +200 -0
  479. package/lib/vendor/blamejs/test/layer-0-primitives/session-strict-binding-missing-failclosed.test.js +110 -0
  480. package/lib/vendor/blamejs/test/layer-0-primitives/sigv4-bucket-ops.test.js +636 -0
  481. package/lib/vendor/blamejs/test/layer-0-primitives/sql-offset-without-limit.test.js +94 -0
  482. package/lib/vendor/blamejs/test/layer-0-primitives/sql.test.js +1190 -0
  483. package/lib/vendor/blamejs/test/layer-0-primitives/ssrf-guard.test.js +21 -0
  484. package/lib/vendor/blamejs/test/layer-0-primitives/static.test.js +850 -0
  485. package/lib/vendor/blamejs/test/layer-0-primitives/storage-presigned-url.test.js +146 -0
  486. package/lib/vendor/blamejs/test/layer-0-primitives/storage.test.js +621 -0
  487. package/lib/vendor/blamejs/test/layer-0-primitives/subject.test.js +47 -0
  488. package/lib/vendor/blamejs/test/layer-0-primitives/template.test.js +582 -0
  489. package/lib/vendor/blamejs/test/layer-0-primitives/tenant-quota.test.js +587 -25
  490. package/lib/vendor/blamejs/test/layer-0-primitives/time.test.js +11 -0
  491. package/lib/vendor/blamejs/test/layer-0-primitives/tsa.test.js +524 -63
  492. package/lib/vendor/blamejs/test/layer-0-primitives/uri-template.test.js +27 -0
  493. package/lib/vendor/blamejs/test/layer-0-primitives/vault-rotate.test.js +866 -0
  494. package/lib/vendor/blamejs/test/layer-0-primitives/vault.test.js +74 -0
  495. package/lib/vendor/blamejs/test/layer-0-primitives/vc.test.js +215 -0
  496. package/lib/vendor/blamejs/test/layer-0-primitives/watcher.test.js +550 -0
  497. package/lib/vendor/blamejs/test/layer-0-primitives/webhook-dispatcher.test.js +388 -0
  498. package/lib/vendor/blamejs/test/layer-0-primitives/webhook.test.js +262 -0
  499. package/lib/vendor/blamejs/test/layer-0-primitives/websocket.test.js +1294 -0
  500. package/lib/vendor/blamejs/test/layer-0-primitives/ws-client.test.js +629 -0
  501. package/lib/vendor/blamejs/test/layer-0-primitives/xml-c14n-attr-normalization.test.js +164 -0
  502. package/lib/vendor/blamejs/test/smoke.js +2 -0
  503. package/package.json +1 -1
  504. package/lib/vendor/blamejs/release-notes/v0.16.0.json +0 -44
  505. package/lib/vendor/blamejs/release-notes/v0.16.1.json +0 -36
  506. package/lib/vendor/blamejs/release-notes/v0.16.2.json +0 -71
  507. package/lib/vendor/blamejs/release-notes/v0.16.3.json +0 -71
  508. package/lib/vendor/blamejs/test/layer-0-primitives/acme-coverage.test.js +0 -441
  509. package/lib/vendor/blamejs/test/layer-0-primitives/auth-oauth-coverage.test.js +0 -482
  510. package/lib/vendor/blamejs/test/layer-0-primitives/auth-saml-coverage.test.js +0 -671
  511. package/lib/vendor/blamejs/test/layer-0-primitives/backup-index-coverage.test.js +0 -690
  512. package/lib/vendor/blamejs/test/layer-0-primitives/cli-coverage.test.js +0 -238
  513. package/lib/vendor/blamejs/test/layer-0-primitives/content-credentials-coverage.test.js +0 -319
  514. package/lib/vendor/blamejs/test/layer-0-primitives/keychain-coverage.test.js +0 -0
  515. package/lib/vendor/blamejs/test/layer-0-primitives/mail-auth-coverage.test.js +0 -437
  516. package/lib/vendor/blamejs/test/layer-0-primitives/mcp-coverage.test.js +0 -443
  517. package/lib/vendor/blamejs/test/layer-0-primitives/metrics-coverage.test.js +0 -395
  518. package/lib/vendor/blamejs/test/layer-0-primitives/network-smtp-policy-coverage.test.js +0 -565
  519. package/lib/vendor/blamejs/test/layer-0-primitives/router-coverage.test.js +0 -592
  520. package/lib/vendor/blamejs/test/layer-0-primitives/sql-coverage.test.js +0 -422
  521. package/lib/vendor/blamejs/test/layer-0-primitives/test-coverage.test.js +0 -573
@@ -119,11 +119,11 @@ function _b64uDecodeBuf(s) {
119
119
  }
120
120
 
121
121
  function _hashDisclosure(disclosureStr, hashAlg) {
122
- var nodeAlg = SUPPORTED_HASH_ALGS[hashAlg];
123
- if (!nodeAlg) {
122
+ if (!Object.prototype.hasOwnProperty.call(SUPPORTED_HASH_ALGS, hashAlg)) {
124
123
  throw new AuthError("auth-sd-jwt-vc/bad-hash",
125
124
  "Unsupported hash algorithm: " + hashAlg);
126
125
  }
126
+ var nodeAlg = SUPPORTED_HASH_ALGS[hashAlg];
127
127
  var h = nodeCrypto.createHash(nodeAlg);
128
128
  h.update(disclosureStr, "ascii");
129
129
  return h.digest().toString("base64url");
@@ -338,12 +338,12 @@ function present(opts) {
338
338
  }
339
339
  var _sdAlg = (_issuerPayload && typeof _issuerPayload._sd_alg === "string")
340
340
  ? _issuerPayload._sd_alg : "sha-256";
341
- var _sdNodeHash = SUPPORTED_HASH_ALGS[_sdAlg];
342
- if (!_sdNodeHash) {
341
+ if (!Object.prototype.hasOwnProperty.call(SUPPORTED_HASH_ALGS, _sdAlg)) {
343
342
  throw new AuthError("auth-sd-jwt-vc/bad-hash",
344
343
  "present: issuer credential declares _sd_alg \"" + _sdAlg +
345
344
  "\" which this framework version does not support");
346
345
  }
346
+ var _sdNodeHash = SUPPORTED_HASH_ALGS[_sdAlg];
347
347
 
348
348
  var disclosedNames = Array.isArray(opts.disclosedClaimNames)
349
349
  ? opts.disclosedClaimNames.slice() : [];
@@ -510,6 +510,12 @@ async function verify(presentation, opts) {
510
510
  !Buffer.isBuffer(issuerKey) &&
511
511
  typeof issuerKey.kty === "string") {
512
512
  jwtExternal._assertAlgKtyMatch(alg, issuerKey);
513
+ // node:crypto.verify cannot consume a bare JWK object — import it to
514
+ // a KeyObject first, mirroring the holder KB-JWT path below
515
+ // (bCrypto.importPublicJwk). Without this a resolver that returns a
516
+ // JWK (the common path per the CVE-2026-22817 note above) rejects a
517
+ // VALID credential with ERR_INVALID_ARG_TYPE instead of verifying.
518
+ issuerKey = bCrypto.importPublicJwk(issuerKey);
513
519
  }
514
520
  var jwtParsed = _verifyJwt(jwt, issuerKey, alg);
515
521
  // Post-verify header compare. Pre-verify we parsed the
@@ -51,6 +51,7 @@
51
51
  var nodeFs = require("node:fs");
52
52
  var nodePath = require("node:path");
53
53
  var atomicFile = require("../atomic-file");
54
+ var safePath = require("../safe-path");
54
55
  var bCrypto = require("./crypto");
55
56
  var backupManifest = require("./manifest");
56
57
  var validateOpts = require("../validate-opts");
@@ -122,11 +123,20 @@ async function create(opts) {
122
123
  throw new BackupBundleError("backup-bundle/bad-include",
123
124
  "create: files[" + i + "] requires { relativePath: string }");
124
125
  }
125
- if (entry.relativePath.indexOf("..") !== -1 || /^[/\\]/.test(entry.relativePath)) {
126
+ if (entry.relativePath.indexOf("..") !== -1 || /^[/\\]/.test(entry.relativePath) ||
127
+ entry.relativePath.indexOf(":") !== -1) {
128
+ // A colon anywhere is refused alongside '..' and a leading separator: it
129
+ // covers both a Windows drive prefix (C:\..., absolute) and an NTFS
130
+ // alternate-data-stream marker (db.enc:evil). This friendly pre-screen
131
+ // mirrors b.backupManifest.validate; safePath.resolve below is the
132
+ // authoritative sink for the residual classes (UNC, reserved name, etc.).
126
133
  throw new BackupBundleError("backup-bundle/bad-include",
127
- "create: files[" + i + "].relativePath must be a relative path (got '" + entry.relativePath + "')");
134
+ "create: files[" + i + "].relativePath must be a relative path without '..', a leading separator, or a colon (got '" + entry.relativePath + "')");
128
135
  }
129
- var srcPath = nodePath.join(dataDir, entry.relativePath);
136
+ // Resolve the source path THROUGH dataDir with safePath so a relativePath
137
+ // built from untrusted input can't read a file outside dataDir even if it
138
+ // slips the first-line check (UNC, reserved name, encoded separator, bidi).
139
+ var srcPath = safePath.resolve(dataDir, entry.relativePath);
130
140
  if (!nodeFs.existsSync(srcPath)) {
131
141
  if (entry.required) {
132
142
  throw new BackupBundleError("backup-bundle/missing-required",
@@ -55,6 +55,7 @@ var os = require("node:os");
55
55
  var nodePath = require("node:path");
56
56
  var bCrypto = require("../crypto");
57
57
  var atomicFile = require("../atomic-file");
58
+ var safePath = require("../safe-path");
58
59
  var C = require("../constants");
59
60
  var backupBundle = require("./bundle");
60
61
  var frameworkFiles = require("../framework-files");
@@ -2197,13 +2198,23 @@ bundleAdapterStorage.fsAdapter = function (fsOpts) {
2197
2198
  atomicFile.ensureDir(root);
2198
2199
 
2199
2200
  function _keyPath(key) {
2200
- // Refuse keys with traversal segments defense in depth even
2201
- // though the storage layer also checks.
2202
- if (key.indexOf("..") !== -1 || key.indexOf("\0") !== -1) {
2201
+ // Gate the key under Windows path semantics REGARDLESS of the host, then
2202
+ // resolve the real on-disk path with the host's semantics. An fsAdapter
2203
+ // store is portable a bundle written on one OS is often read on another —
2204
+ // and win32 splits on both `/` and `\`, so a key like `..\evil` (a harmless
2205
+ // literal filename under POSIX, but a climb out of root when the same key is
2206
+ // later interpreted on Windows) is refused everywhere. The gate is a strict
2207
+ // superset of the host's, also refusing an absolute / drive-letter / UNC
2208
+ // prefix, an NTFS alternate-data-stream marker, a Windows reserved name, and
2209
+ // NUL / control bytes; defense in depth even though the storage layer also
2210
+ // checks. A hand-rolled '..' + NUL substring check (the prior shape) missed
2211
+ // the drive / ADS / reserved-name class the shared primitive handles, and a
2212
+ // host-only resolve missed the cross-platform backslash-traversal class.
2213
+ if (safePath.resolveOrNull(root, key, { platform: "win32" }) === null) {
2203
2214
  throw new BackupError("backup/bad-key",
2204
- "fsAdapter: key contains invalid characters: " + JSON.stringify(key));
2215
+ "fsAdapter: key contains invalid or unsafe path characters: " + JSON.stringify(key));
2205
2216
  }
2206
- return nodePath.join(root, key);
2217
+ return safePath.resolve(root, key);
2207
2218
  }
2208
2219
 
2209
2220
  return {
@@ -121,14 +121,19 @@ function _validateFileEntry(f, idx, errors) {
121
121
  }
122
122
  if (typeof f.relativePath !== "string" || f.relativePath.length === 0) {
123
123
  errors.push("files[" + idx + "].relativePath: required non-empty string");
124
- } else if (f.relativePath.indexOf("..") !== -1 || /^[/\\]/.test(f.relativePath)) {
125
- // No traversal — when restored, relativePath joins under dataDir
126
- errors.push("files[" + idx + "].relativePath: must be a relative path without '..' or leading separator");
124
+ } else if (f.relativePath.indexOf("..") !== -1 || /^[/\\]/.test(f.relativePath) || f.relativePath.indexOf(":") !== -1) {
125
+ // No traversal — when restored, relativePath joins under dataDir. A colon
126
+ // anywhere is refused alongside '..' and a leading separator: it covers
127
+ // both a Windows drive prefix (C:\..., absolute — path.resolve would honor
128
+ // it and escape dataDir) and an NTFS alternate-data-stream marker
129
+ // (db.enc:evil), so validate() fails closed before restore, matching the
130
+ // safePath sink b.restoreBundle resolves both paths through.
131
+ errors.push("files[" + idx + "].relativePath: must be a relative path without '..', a leading separator, or a colon (drive letter / NTFS data-stream marker)");
127
132
  }
128
133
  if (typeof f.encryptedPath !== "string" || f.encryptedPath.length === 0) {
129
134
  errors.push("files[" + idx + "].encryptedPath: required non-empty string");
130
- } else if (f.encryptedPath.indexOf("..") !== -1 || /^[/\\]/.test(f.encryptedPath)) {
131
- errors.push("files[" + idx + "].encryptedPath: must be a relative path without '..' or leading separator");
135
+ } else if (f.encryptedPath.indexOf("..") !== -1 || /^[/\\]/.test(f.encryptedPath) || f.encryptedPath.indexOf(":") !== -1) {
136
+ errors.push("files[" + idx + "].encryptedPath: must be a relative path without '..', a leading separator, or a colon (drive letter / NTFS data-stream marker)");
132
137
  }
133
138
  if (typeof f.size !== "number" || !Number.isInteger(f.size) || f.size < 0) {
134
139
  errors.push("files[" + idx + "].size: required non-negative integer");
@@ -172,6 +177,14 @@ function validate(manifest) {
172
177
  }
173
178
  if (!Array.isArray(manifest.files)) {
174
179
  errors.push("files: required array");
180
+ } else if (manifest.files.length === 0) {
181
+ // A backup that describes zero files is never legitimate — the bundle
182
+ // writer refuses to emit one. Refuse it here too: this is the single
183
+ // guard the restore path parses an untrusted manifest through, and a
184
+ // tampered manifest that strips every entry (while keeping a valid
185
+ // wrapped vault key) would otherwise restore to an empty staging dir
186
+ // that the swap moves over the live dataDir — a silent destructive wipe.
187
+ errors.push("files: required non-empty array");
175
188
  } else {
176
189
  // Detect duplicate relativePath / encryptedPath — would corrupt restore
177
190
  var seenRel = Object.create(null);
@@ -128,6 +128,7 @@ function decode(str, opts) {
128
128
  var bytes = [];
129
129
  var value = 0, bits = 0;
130
130
  var inPad = false; // once "=" padding starts, only more "=" may follow
131
+ var dataCount = 0; // count of data symbols (excludes padding + skipped separators)
131
132
  for (var i = 0; i < str.length; i++) {
132
133
  var ch = str.charAt(i);
133
134
  if (ch === "=") { inPad = true; continue; } // trailing padding
@@ -140,11 +141,31 @@ function decode(str, opts) {
140
141
  if (idx === undefined) throw new Base32Error("base32/bad-char", "base32.decode: invalid Base32 character '" + str.charAt(i) + "' at index " + i);
141
142
  value = (value << BITS) | idx;
142
143
  bits += BITS;
144
+ dataCount += 1;
143
145
  if (bits >= 8) { // emit a full output byte
144
146
  bytes.push((value >>> (bits - 8)) & 0xff); // eight-bit output byte mask
145
147
  bits -= 8; // consumed eight bits
146
148
  }
147
149
  }
150
+ // A group of 5 input bytes encodes to 8 symbols; the only valid partial-group
151
+ // symbol counts are 2, 4, 5, 7 (for 1, 2, 3, 4 trailing bytes). A count of
152
+ // 1/3/6 (mod 8) cannot represent any whole-byte input, so the OLD decoder
153
+ // silently returned a truncated/garbage buffer — refuse it.
154
+ var rem = dataCount % GROUP;
155
+ if (rem === 1 || rem === 3 || rem === 6) {
156
+ throw new Base32Error("base32/bad-length",
157
+ "base32.decode: " + dataCount + " data symbol(s) is not a valid Base32 length " +
158
+ "(a partial group is 2, 4, 5 or 7 symbols)");
159
+ }
160
+ // Non-canonical trailing bits (RFC 4648 §3.5): a conforming encoder zeroes the
161
+ // final symbol's unused low bits. Non-zero leftover bits mean two distinct
162
+ // strings decode to the same bytes — decoder malleability. Refuse it so every
163
+ // byte sequence has exactly one Base32 form (matters where the string is a
164
+ // key / secret / dedup handle, e.g. TOTP, identifiers).
165
+ if (bits > 0 && (value & ((1 << bits) - 1)) !== 0) {
166
+ throw new Base32Error("base32/non-canonical",
167
+ "base32.decode: non-canonical encoding — the final symbol's unused low bits must be zero");
168
+ }
148
169
  return Buffer.from(bytes);
149
170
  }
150
171
 
@@ -1431,8 +1431,25 @@ async function unsealRow(grantHandle, table, rowId, opts) {
1431
1431
  .whereOp("expiresAt", ">", Date.now())
1432
1432
  .toSql();
1433
1433
  var updateRes = await clusterStorage.execute(incBuilt.sql, incBuilt.params);
1434
- // executeAll-style result; some backends return rowsAffected, others a count.
1435
- // Re-query to confirm the increment landed and get the post-increment counter.
1434
+ // The atomic compare-and-increment IS the claim, and the count of rows it
1435
+ // CHANGED is the only per-caller signal for whether THIS caller won the
1436
+ // slot. `execute` returns rowCount = the rows the UPDATE modified
1437
+ // (info.changes on local sqlite; the driver's affected-row count in cluster
1438
+ // mode), so rowCount >= 1 means this caller's compare-and-increment landed
1439
+ // and rowCount === 0 means it lost — the grant was exhausted / revoked /
1440
+ // expired concurrently between the runtime checks above and this UPDATE.
1441
+ //
1442
+ // Do NOT infer the claim from a re-read of rowsConsumed against this
1443
+ // caller's stale pre-value: a concurrent WINNER's increment is visible to
1444
+ // the LOSER's re-read, so `post !== pre` is true for the loser too and both
1445
+ // proceed — a double-claim that reads two rows under a maxRowsPerGrant:1
1446
+ // grant, defeating row-by-row auth. The affected-row count is unambiguous.
1447
+ if (!updateRes || Number(updateRes.rowCount) < 1) {
1448
+ throw new BreakGlassError("breakglass/grant-exhausted",
1449
+ "unsealRow: grant " + grantHandle.id + " was exhausted by a concurrent read", true);
1450
+ }
1451
+ // Re-query for the post-increment counter — used ONLY for the audit's
1452
+ // rowsRemaining hint below, no longer for the claim decision.
1436
1453
  var postReadBuilt = sql.select("_blamejs_break_glass_grants", _sqlOpts()) // allow:hand-rolled-sql
1437
1454
  .columns(["rowsConsumed", "revokedAt", "expiresAt"])
1438
1455
  .where("_id", grantHandle.id)
@@ -1443,14 +1460,6 @@ async function unsealRow(grantHandle, table, rowId, opts) {
1443
1460
  "unsealRow: grant " + grantHandle.id + " disappeared during unseal", true);
1444
1461
  }
1445
1462
  var postRowsConsumed = Number(postRows[0].rowsConsumed);
1446
- // If the UPDATE didn't actually increment (race lost — another unseal
1447
- // exhausted the grant or it was revoked / expired between our check
1448
- // and the UPDATE), refuse this read.
1449
- if (postRowsConsumed === Number(grantRow.rowsConsumed)) {
1450
- throw new BreakGlassError("breakglass/grant-exhausted",
1451
- "unsealRow: grant " + grantHandle.id + " was exhausted by a concurrent read", true);
1452
- }
1453
- void updateRes;
1454
1463
  // policy was fetched above for the pin enforcement; reuse it for the
1455
1464
  // Model-A vs Model-B (cryptographic) unseal dispatch.
1456
1465
  var unsealedRow;
@@ -276,7 +276,11 @@ function create(opts) {
276
276
 
277
277
  // Test seam: tests pass a fake watcher so we don't actually nodeFs.watch
278
278
  var watchFn = opts._watch || function (dirOrFile, wopts, listener) {
279
- return nodeFs.watch(dirOrFile, wopts, listener);
279
+ // realpathSync.native expands an 8.3 short-name component before the watch;
280
+ // fs.watch aborts libuv (uncatchable) on a Windows short-name path.
281
+ var target = dirOrFile;
282
+ try { target = nodeFs.realpathSync.native(dirOrFile); } catch (_e) { /* keep raw path */ }
283
+ return nodeFs.watch(target, wopts, listener);
280
284
  };
281
285
  var setTimeoutFn = opts._setTimeout || setTimeout;
282
286
  var clearTimeoutFn = opts._clearTimeout || clearTimeout;
@@ -34,6 +34,7 @@
34
34
  * RFC 9211 Cache-Status header — documents which intermediate caches handled a request with structured `hit` / `fwd` / `ttl` parameters so operators diagnose cache-decision chains.
35
35
  */
36
36
 
37
+ var safeBuffer = require("./safe-buffer");
37
38
  var validateOpts = require("./validate-opts");
38
39
  var { defineClass } = require("./framework-error");
39
40
 
@@ -58,11 +59,6 @@ var BOOLEAN_PARAMS = Object.freeze(["hit", "stored", "collapsed"]);
58
59
  // passing other keys get passed-through verbatim as token=value.
59
60
  var KNOWN_PARAMS = Object.freeze(["hit", "fwd", "fwd-status", "ttl", "stored", "collapsed", "key", "detail"]);
60
61
 
61
- function _sfStringQuote(s) {
62
- // RFC 8941 sf-string — quoted-string with escaping for " and \.
63
- // Operator-supplied detail/key strings get the full quote-escape.
64
- return "\"" + String(s).replace(/\\/g, "\\\\").replace(/"/g, "\\\"") + "\"";
65
- }
66
62
 
67
63
  /**
68
64
  * @primitive b.cacheStatus.append
@@ -178,14 +174,14 @@ function entryString(entry) {
178
174
  throw new CacheStatusError("cache-status/bad-key",
179
175
  "entry.key must be a string when provided");
180
176
  }
181
- parts.push("key=" + _sfStringQuote(entry.key));
177
+ parts.push("key=" + safeBuffer.quoteString(entry.key));
182
178
  }
183
179
  if (entry.detail !== undefined && entry.detail !== null) {
184
180
  if (typeof entry.detail !== "string") {
185
181
  throw new CacheStatusError("cache-status/bad-detail",
186
182
  "entry.detail must be a string when provided");
187
183
  }
188
- parts.push("detail=" + _sfStringQuote(entry.detail));
184
+ parts.push("detail=" + safeBuffer.quoteString(entry.detail));
189
185
  }
190
186
  return parts.join("; ");
191
187
  }
@@ -804,6 +804,11 @@ function _expandSingleRule(rule, startMs, ctx) {
804
804
  throw new CalendarError("calendar/bad-recurrence",
805
805
  "b.calendar.expandRecurrence: unsupported frequency '" + freq + "'");
806
806
  }
807
+ // The caller-supplied `interval` is unbounded; a large one drives
808
+ // _advance's Date arithmetic past the representable range, returning
809
+ // NaN. No further instances can exist — stop before the NaN reaches
810
+ // _msToIsoZ on the next iteration, which throws on an invalid Date.
811
+ if (!isFinite(t)) break;
807
812
  }
808
813
  return { instances: out, stepBudgetRemaining: ctx.stepBudgetRef.remaining };
809
814
  }
@@ -856,6 +861,14 @@ function _expandWithBysetpos(ctx) {
856
861
  while (out.length < count && out.length < maxCount && stepBudgetRef.remaining > 0) {
857
862
  var period = _periodForIndex(freq, startDate, periodIndex * interval);
858
863
  periodIndex += 1;
864
+ // A non-finite period means the FREQ interval (unbounded and
865
+ // caller-supplied) drove Date.UTC past the representable ECMAScript
866
+ // date range. No further instances can exist. This break is also
867
+ // load-bearing against a hang: a NaN period runs the day-enumeration
868
+ // loop zero times, so it never decrements the shared step budget,
869
+ // and the untilMs / toMs comparisons below are NaN no-ops (`NaN > x`
870
+ // is false) — without stopping here the outer loop spins forever.
871
+ if (!isFinite(period.startMs) || !isFinite(period.endMs)) break;
859
872
  // Out-of-window early exit. Window-uppper applies once the period
860
873
  // start crosses toMs; until applies once period-start crosses untilMs.
861
874
  if (period.startMs > untilMs) break;
@@ -1116,7 +1129,14 @@ function _firstParamValue(prop, paramName) {
1116
1129
  if (!prop) return null;
1117
1130
  var first = Array.isArray(prop) ? prop[0] : prop;
1118
1131
  if (!first || !first.params) return null;
1119
- return first.params[paramName] || null;
1132
+ // b.safeIcal exposes each property parameter as a (possibly
1133
+ // multi-valued) array. Consumers here want a scalar — a TZID maps to
1134
+ // the JSCalendar `timeZone` String (RFC 8984 §4.7.1), not an array.
1135
+ // Unwrap to the first element so `timeZone` is a plain string that
1136
+ // round-trips through toIcal's `DTSTART;TZID=<zone>` emission.
1137
+ var v = first.params[paramName];
1138
+ if (v === undefined || v === null) return null;
1139
+ return Array.isArray(v) ? (v.length > 0 ? v[0] : null) : v;
1120
1140
  }
1121
1141
 
1122
1142
  function _icalRruleToJscal(rrule) {
@@ -393,7 +393,18 @@ function _decodeItem(state, depth) {
393
393
  case 0: return _readArgument(state, ai); // unsigned int
394
394
  case 1: { // negative int
395
395
  var n = _readArgument(state, ai);
396
- return (typeof n === "bigint") ? (-1n - n) : (-1 - n);
396
+ if (typeof n === "bigint") return -1n - n;
397
+ // The argument n is a safe Number, but a negative CBOR value is
398
+ // -1 - n, which reaches one below the safe range: n === 2^53-1
399
+ // yields -2^53, NOT a safe integer. The deterministic encoder's
400
+ // integer branch is |v| <= 2^53-1, so it would re-emit that value
401
+ // as a float — breaking round-trip and falsely tripping
402
+ // requireDeterministic on a canonical integer. Promote to BigInt
403
+ // when the value isn't a safe integer so encode() re-emits the
404
+ // integer head (RFC 8949 §3 — a negative-int argument is an
405
+ // integer, never a float).
406
+ var neg = -1 - n;
407
+ return Number.isSafeInteger(neg) ? neg : (-1n - BigInt(n));
397
408
  }
398
409
  case 2: { // byte string
399
410
  var blen = _lenOf(_readArgument(state, ai));
@@ -155,14 +155,16 @@ function _createSealedDiskStorage(opts) {
155
155
  }
156
156
  },
157
157
 
158
- async writeEscrow(relPath, plaintextKeyPem, recipientPub) {
159
- // Encrypt-to-recipient via b.crypto.encryptEnvelope. Recipient is
160
- // an X25519 / ML-KEM hybrid pubkey held offline by the operator
161
- // for break-glass key recovery.
162
- var envelope = bCrypto().encryptEnvelope(Buffer.from(plaintextKeyPem), recipientPub);
158
+ async writeEscrow(relPath, plaintextKeyPem, recipient) {
159
+ // Seal the private key to the operator's offline break-glass
160
+ // recipient via b.crypto.encrypt (ML-KEM-1024 KEM, plus the P-384
161
+ // hybrid leg when the recipient supplies an ecPublicKey). The
162
+ // operator recovers it offline with b.crypto.decrypt and the
163
+ // matching private key(s) — it is never decrypted by the framework.
164
+ var envelope = bCrypto().encrypt(plaintextKeyPem, recipient);
163
165
  var p = nodePath.join(rootDir, relPath);
164
166
  _ensureDir(nodePath.dirname(p));
165
- atomicFile.writeSync(p, JSON.stringify(envelope) + "\n", { mode: 0o600 });
167
+ atomicFile.writeSync(p, envelope + "\n", { mode: 0o600 });
166
168
  },
167
169
  };
168
170
  }
@@ -212,7 +214,10 @@ function _createSealedDiskStorage(opts) {
212
214
  * cleanup: async function (params) { ... }, // required — runs after authorization completes
213
215
  * },
214
216
  * keyEscrow: { // optional — break-glass-only key recovery
215
- * recipient: Buffer | string, // X25519 / ML-KEM hybrid public key (b.crypto.encryptEnvelope recipient)
217
+ * recipient: string | { publicKey, ecPublicKey }, // ML-KEM-1024 pubkey PEM, or a
218
+ * // b.crypto.generateEncryptionKeyPair() hybrid pair; the
219
+ * // renewed key is sealed to it via b.crypto.encrypt and
220
+ * // recovered offline with b.crypto.decrypt
216
221
  * },
217
222
  * }>,
218
223
  * renew: {
@@ -350,10 +355,23 @@ function create(opts) {
350
355
  throw new CertError("cert/bad-key-alg",
351
356
  "cert.create.certs[" + i + "].keyAlg must be ecdsa-p256 / ecdsa-p384 / rsa-2048 / rsa-3072 / rsa-4096");
352
357
  }
353
- if (c.keyEscrow && (!c.keyEscrow.recipient ||
354
- (typeof c.keyEscrow.recipient !== "string" && !Buffer.isBuffer(c.keyEscrow.recipient)))) {
355
- throw new CertError("cert/bad-key-escrow",
356
- "cert.create.certs[" + i + "].keyEscrow.recipient must be a Buffer or PEM/base64 string");
358
+ if (c.keyEscrow) {
359
+ var rec = c.keyEscrow.recipient;
360
+ var okStr = typeof rec === "string" && rec.length > 0;
361
+ // Object form: publicKey (ML-KEM PEM) is required non-empty, matching the
362
+ // string path; ecPublicKey (P-384 hybrid leg) is optional, but if present
363
+ // must itself be a non-empty string — an empty key would otherwise reach
364
+ // b.crypto.encrypt and either fail deeper or silently drop the hybrid leg.
365
+ var okObj = rec && typeof rec === "object" &&
366
+ typeof rec.publicKey === "string" && rec.publicKey.length > 0 &&
367
+ (rec.ecPublicKey == null ||
368
+ (typeof rec.ecPublicKey === "string" && rec.ecPublicKey.length > 0));
369
+ if (!okStr && !okObj) {
370
+ throw new CertError("cert/bad-key-escrow",
371
+ "cert.create.certs[" + i + "].keyEscrow.recipient must be an ML-KEM-1024 " +
372
+ "public-key PEM string, or a { publicKey, ecPublicKey } object from " +
373
+ "b.crypto.generateEncryptionKeyPair() for the P-384 hybrid path");
374
+ }
357
375
  }
358
376
  certsByName[c.name] = {
359
377
  name: c.name,
@@ -84,7 +84,12 @@ function _writeLine(stream, line) {
84
84
  // written flag validation continues to read the same { pos, flags }
85
85
  // shape the cli has always exposed.
86
86
  function _parseArgs(argv) {
87
- return argParser.parseRaw(argv);
87
+ // `--version` is the global boolean version flag — declare it so it never
88
+ // swallows a following token as its value. Without this, `--version <cmd>`
89
+ // (or `<cmd> --version <sub>`) would consume the subcommand and a stray
90
+ // version flag could no-op the command it accompanies. (`-v` is a
91
+ // single-dash flag and is already boolean in parseRaw.)
92
+ return argParser.parseRaw(argv, { booleanNames: ["version"] });
88
93
  }
89
94
 
90
95
  function _resolvePath(p, cwd) {
@@ -93,6 +98,16 @@ function _resolvePath(p, cwd) {
93
98
  return nodePath.resolve(cwd || process.cwd(), p);
94
99
  }
95
100
 
101
+ // A destructive command's --confirm gate is satisfied ONLY by an explicit
102
+ // `true` / "true"; a bare-truthiness check (`!flags.confirm`) would accept
103
+ // `--confirm false` as confirmation, so an operator who typed `--confirm
104
+ // false` — meaning "do NOT proceed" — would still trigger an irreversible
105
+ // operation. Shared by every destructive subcommand so the acknowledgement
106
+ // contract can't drift between them.
107
+ function _isConfirmed(flags) {
108
+ return flags.confirm === true || flags.confirm === "true";
109
+ }
110
+
96
111
  function _openSqlite(dbPath) {
97
112
  // Lazy-required so the CLI doesn't crash on `blamejs version` or
98
113
  // `blamejs help` if node:sqlite isn't usable for some reason.
@@ -424,7 +439,7 @@ async function _runDev(args, ctx) {
424
439
  }
425
440
  var killSignal = args.flags["kill-signal"];
426
441
 
427
- var d = dev.create({
442
+ var d = (ctx._dev || dev.create)({
428
443
  command: String(command),
429
444
  args: argList,
430
445
  watch: watchList.length ? watchList : undefined,
@@ -435,31 +450,51 @@ async function _runDev(args, ctx) {
435
450
  env: ctx.env,
436
451
  });
437
452
 
438
- // Forward parent SIGINT/SIGTERM to the child via stop()
453
+ // Forward parent SIGINT/SIGTERM to the child via stop(). The supervisor
454
+ // resolves ONLY after stop() has fully completed (SIGTERM → SIGKILL
455
+ // escalation → watchers disarmed), so main() never returns — and the bin
456
+ // shim never process.exit()s — while a child kill is still in flight and
457
+ // could be abandoned, orphaning the app child.
439
458
  var stopped = false;
459
+ var onStopComplete;
460
+ var stopComplete = new Promise(function (resolve) { onStopComplete = resolve; });
440
461
  function shutdown() {
441
462
  if (stopped) return;
442
463
  stopped = true;
443
- d.stop().then(function () { /* exit naturally */ });
464
+ Promise.resolve(d.stop()).then(onStopComplete, onStopComplete);
444
465
  }
445
466
  process.once("SIGINT", shutdown);
446
467
  process.once("SIGTERM", shutdown);
468
+ function _clearSignalHandlers() {
469
+ process.removeListener("SIGINT", shutdown);
470
+ process.removeListener("SIGTERM", shutdown);
471
+ }
447
472
 
448
473
  try {
449
474
  await d.start();
450
475
  } catch (e) {
451
476
  _writeLine(ctx.stderr, "blamejs dev: " + ((e && e.message) || String(e)));
477
+ _clearSignalHandlers();
452
478
  return 1;
453
479
  }
454
- // The dev loop runs until the operator interrupts. Resolve a
455
- // never-settling promise so main() awaits forever; the SIGINT handler
456
- // above flips stopped+resolves on Ctrl-C.
457
- await new Promise(function (resolve) {
458
- var iv = setInterval(function () {
459
- if (stopped) { clearInterval(iv); resolve(); }
460
- }, 250);
461
- if (typeof iv.unref === "function") iv.unref();
462
- });
480
+ // The dev loop runs until the operator interrupts. A REF'd heartbeat holds
481
+ // the event loop open so a watched-child CRASH does not drain it and exit
482
+ // the supervisor dev's crash-resilience contract is to stay up and
483
+ // hot-restart on the next file change, but an unref'd keep-alive let a
484
+ // child's exit terminate the parent with a false code 0. Cleared once
485
+ // stop() has completed on SIGINT/SIGTERM. Unref'ing would drain the loop on
486
+ // a child crash and reintroduce the exit-on-crash bug this heartbeat fixes.
487
+ // allow:timer-no-unref-process-pinning supervisor must stay pinned.
488
+ var heartbeat = setInterval(function () {}, C.TIME.minutes(1));
489
+ // Hand the shutdown trigger to a test seam (no-op in production) so a test
490
+ // can drive the signal path deterministically instead of raising SIGINT.
491
+ if (typeof ctx._onDevRunning === "function") ctx._onDevRunning(shutdown);
492
+ try {
493
+ await stopComplete;
494
+ } finally {
495
+ clearInterval(heartbeat);
496
+ _clearSignalHandlers();
497
+ }
463
498
  return 0;
464
499
  }
465
500
 
@@ -713,7 +748,14 @@ async function _runAudit(args, ctx) {
713
748
  var tableV = args.flags.table ? String(args.flags.table) : "audit_log";
714
749
  var maxRows = args.flags["max-rows"];
715
750
  var maxRowsN = maxRows === undefined ? undefined : Number(maxRows);
716
- if (maxRowsN !== undefined && (!Number.isFinite(maxRowsN) || maxRowsN < 1)) {
751
+ // Positive-INTEGER validation, mirroring `migrate down --steps`: reject
752
+ // NaN/Infinity, < 1, AND any fractional value. The message promises "a
753
+ // positive integer", so a value like 2.5 must be refused here at the
754
+ // entry point rather than passed to verifyChain, where a fractional
755
+ // maxRows truncates the walk mid-chain and reports a nonsensical
756
+ // fractional rowsVerified (Math.min(rows.length, 2.5)).
757
+ if (maxRowsN !== undefined &&
758
+ (!Number.isFinite(maxRowsN) || maxRowsN < 1 || Math.floor(maxRowsN) !== maxRowsN)) {
717
759
  _writeLine(ctx.stderr, "blamejs audit verify-chain: --max-rows must be a positive integer");
718
760
  return 2;
719
761
  }
@@ -759,7 +801,7 @@ async function _runAudit(args, ctx) {
759
801
  _writeLine(ctx.stderr, "blamejs audit purge: --archive (path to verified archive bundle) is required");
760
802
  return 2;
761
803
  }
762
- if (args.flags.confirm !== true && args.flags.confirm !== "true") {
804
+ if (!_isConfirmed(args.flags)) {
763
805
  _writeLine(ctx.stderr, "blamejs audit purge: --confirm is REQUIRED — destructive operation");
764
806
  return 2;
765
807
  }
@@ -1044,9 +1086,14 @@ async function _runRestore(args, ctx) {
1044
1086
  report.write("rollback points at " + rollbackRootL + ": " + pts.length);
1045
1087
  for (var p = 0; p < pts.length; p++) {
1046
1088
  var pt = pts[p];
1089
+ // restoreRollback.list() returns { rollbackPath, swappedAt, marker },
1090
+ // and operator metadata (bundleId / reason) rides on marker.operator --
1091
+ // not a top-level recordedAt/bundleId, so those never rendered.
1092
+ var ptOp = pt.marker && pt.marker.operator;
1047
1093
  report.write(" " + (pt.rollbackPath || pt) +
1048
- (pt.recordedAt ? " recordedAt=" + pt.recordedAt : "") +
1049
- (pt.bundleId ? " bundleId=" + pt.bundleId : ""));
1094
+ (pt.swappedAt ? " swappedAt=" + pt.swappedAt : "") +
1095
+ (ptOp && ptOp.bundleId ? " bundleId=" + ptOp.bundleId : "") +
1096
+ (ptOp && ptOp.reason ? " reason=" + ptOp.reason : ""));
1050
1097
  }
1051
1098
  return report.ok();
1052
1099
  } catch (e) {
@@ -1605,10 +1652,21 @@ async function _runVault(args, ctx) {
1605
1652
  var dataDir = _resolvePath(String(args.flags["data-dir"] || "./data"), ctx.cwd);
1606
1653
 
1607
1654
  if (sub === "status") {
1608
- var pre = vaultPassphraseOps.preflightSealable({ dataDir: dataDir });
1609
- var unsealable = vaultPassphraseOps.preflightUnsealable
1610
- ? vaultPassphraseOps.preflightUnsealable({ dataDir: dataDir })
1611
- : null;
1655
+ // A missing / unreadable data-dir must surface as the standard clean
1656
+ // reporter error (exit 1), not an uncaught throw: preflightSealable /
1657
+ // preflightUnsealable raise VaultPassphraseError when the dir doesn't
1658
+ // exist, and without this catch that rejection propagates out of main()
1659
+ // — the bin shim would print a stack trace instead of the one-line
1660
+ // "data-dir does not exist" the sibling seal / unseal / rotate paths give.
1661
+ var pre, unsealable;
1662
+ try {
1663
+ pre = vaultPassphraseOps.preflightSealable({ dataDir: dataDir });
1664
+ unsealable = vaultPassphraseOps.preflightUnsealable
1665
+ ? vaultPassphraseOps.preflightUnsealable({ dataDir: dataDir })
1666
+ : null;
1667
+ } catch (e) {
1668
+ return report.error((e && e.message) || String(e));
1669
+ }
1612
1670
  report.write("data-dir: " + dataDir);
1613
1671
  report.write("vault.key (plaintext): " +
1614
1672
  (pre.ok ? "present (sealable)" : "absent — " + (pre.reason || "n/a")));
@@ -2058,7 +2116,7 @@ async function _runErase(args, ctx) {
2058
2116
  var rowId = args.flags["row-id"];
2059
2117
  if (!table || table === true) return report.error("--table <name> is required", 2);
2060
2118
  if (!rowId || rowId === true) return report.error("--row-id <id> is required", 2);
2061
- if (!args.flags.confirm) {
2119
+ if (!_isConfirmed(args.flags)) {
2062
2120
  return report.error("--confirm is required (this operation is irreversible)", 2);
2063
2121
  }
2064
2122
  var dataDirFlag = args.flags["data-dir"];
@@ -2294,12 +2352,24 @@ async function main(argv, opts) {
2294
2352
  stderr: opts.stderr || process.stderr,
2295
2353
  env: opts.env || process.env,
2296
2354
  cwd: opts.cwd || process.cwd(),
2355
+ // Test seams (undefined in production): _dev injects the dev-supervisor
2356
+ // factory; _onDevRunning receives the shutdown fn once `dev` is live, so
2357
+ // a test can drive graceful teardown without raising a real OS signal.
2358
+ _dev: opts._dev,
2359
+ _onDevRunning: opts._onDevRunning,
2297
2360
  };
2298
2361
  if (!Array.isArray(argv)) argv = [];
2299
2362
  var args = _parseArgs(argv);
2300
2363
 
2301
- // Top-level flags handled before subcommand dispatch
2302
- if (args.flags.version || args.flags.v) {
2364
+ // Version is honored only as the WHOLE invocation — a bare `-v` /
2365
+ // `--version` with no subcommand. `_parseArgs` declares `--version`
2366
+ // boolean, so a stray version flag never swallows a token: it works in any
2367
+ // order (leading, trailing, or between a command and its subcommand) and
2368
+ // leaves the positional list intact, so the command dispatches instead of
2369
+ // a silent version no-op returning a false 0. A `-v` used as another
2370
+ // option's value stays that value, and a version token after the `--`
2371
+ // terminator stays a literal positional.
2372
+ if ((args.flags.version || args.flags.v) && args.pos.length === 0) {
2303
2373
  _writeLine(ctx.stdout, C.version);
2304
2374
  return 0;
2305
2375
  }