permdock 0.4.0 → 0.5.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (514) hide show
  1. package/README.md +37 -35
  2. package/dist/{schema-Bol6gqXA.js → 2020-C9VN-x8c.js} +5 -130
  3. package/dist/a2a/index.d.ts +6 -6
  4. package/dist/a2a/index.js +14 -17
  5. package/dist/{adapter-context-mlWsVGGg.js → adapter-context-CRhqyzCk.js} +1 -1
  6. package/dist/adoption-scan-B4R5fnMU.js +107 -0
  7. package/dist/agent/index.d.ts +3 -0
  8. package/dist/agent/index.js +1 -0
  9. package/dist/ai-sdk/index.d.ts +18 -35
  10. package/dist/ai-sdk/index.js +37 -23
  11. package/dist/{app-data-CV8pqqMi.js → app-data-MuyzVqX8.js} +2 -1
  12. package/dist/approval-header-CJACtHkv.js +23 -0
  13. package/dist/approval-prompt-Dg5LeAcT.js +62 -0
  14. package/dist/approval-prompt-Djo_PyZc.d.ts +57 -0
  15. package/dist/approvals/index.d.ts +5 -3
  16. package/dist/approvals/index.js +8 -5
  17. package/dist/approvals-DJ6Yd5z1.js +995 -0
  18. package/dist/arazzo-B6lebmiQ.js +36 -0
  19. package/dist/{arazzo-C4BcskbX.js → arazzo-BWhNF-k0.js} +20 -14
  20. package/dist/args-IIolxxKA.js +197 -0
  21. package/dist/astro/index.d.ts +43 -0
  22. package/dist/astro/index.js +27 -0
  23. package/dist/audience-Dg8XsRaO.js +55 -0
  24. package/dist/auth-DRLEizbL.js +178 -0
  25. package/dist/authzen/index.d.ts +26 -6
  26. package/dist/authzen/index.js +94 -79
  27. package/dist/automation-BMZPIVUM.d.ts +114 -0
  28. package/dist/automation-DVjOckjV.js +157 -0
  29. package/dist/better-auth/index.d.ts +8 -6
  30. package/dist/better-auth/index.js +9 -8
  31. package/dist/better-supabase/index.d.ts +357 -30
  32. package/dist/better-supabase/index.js +936 -194
  33. package/dist/{bind-BzqG8SMb.d.ts → bind--9EFVYWF.d.ts} +12 -10
  34. package/dist/{bind-kk-uyCwH.js → bind-CZzhx-Vj.js} +14 -10
  35. package/dist/body-CH5of8Ne.js +10 -0
  36. package/dist/body-text-QcXok_SI.js +52 -0
  37. package/dist/{build-instance-DIIV9DbC.js → build-instance-BMnAudHn.js} +4 -3
  38. package/dist/{canonical-json-CFKyFOke.js → canonical-json-BC8_nMTw.js} +5 -3
  39. package/dist/{capability-CksyCWDH.d.ts → capability-BSslw1QV.d.ts} +44 -25
  40. package/dist/{capability-txATtKV4.js → capability-N1K9IpqS.js} +68 -42
  41. package/dist/casbin-Cr7RLtA3.js +30 -0
  42. package/dist/casbin-Dyu2gnUD.js +234 -0
  43. package/dist/casl-64gpT-8x.js +24 -0
  44. package/dist/casl-DjEDhTCP.js +299 -0
  45. package/dist/catalog/index.d.ts +74 -2
  46. package/dist/catalog/index.js +51 -2
  47. package/dist/{catalog-tZUyOfOv.js → catalog-BECMPrwc.js} +51 -6
  48. package/dist/catalog-DjhMYYCq.js +1 -0
  49. package/dist/catalog-R_A__RsH.js +52 -0
  50. package/dist/{catalog-doc-DWtg0gGR.js → catalog-doc-C9wjsfNY.js} +45 -23
  51. package/dist/catalog-fingerprint-CCP0-yQS.js +153 -0
  52. package/dist/chat/index.d.ts +2 -0
  53. package/dist/chat/index.js +224 -0
  54. package/dist/chat-sdk/index.d.ts +87 -0
  55. package/dist/chat-sdk/index.js +197 -0
  56. package/dist/claims-map-7oQ3ue4X.js +13 -0
  57. package/dist/claims-map-Ca-QX8C6.d.ts +32 -0
  58. package/dist/claude-agent/index.d.ts +7 -14
  59. package/dist/claude-agent/index.js +24 -27
  60. package/dist/clerk/index.d.ts +9 -8
  61. package/dist/clerk/index.js +9 -14
  62. package/dist/cli/bin.js +36 -17
  63. package/dist/cli/index.d.ts +19 -5
  64. package/dist/cli/index.js +164 -4
  65. package/dist/cloud/index.d.ts +102 -63
  66. package/dist/cloud/index.js +239 -340
  67. package/dist/cloud-CIoHNevm.js +87 -0
  68. package/dist/codemod-Bmj9dWMH.js +37 -0
  69. package/dist/codemod-Cxvvc70T.js +2084 -0
  70. package/dist/{collect-2SrB7lfk.js → collect-CrZJJnEF.js} +75 -11
  71. package/dist/collect-DloHbDVa.js +55 -0
  72. package/dist/collect-FlXJlhus.js +1 -0
  73. package/dist/command-L8EstFNm.js +6 -0
  74. package/dist/compile/index.d.ts +1 -1
  75. package/dist/compile/index.js +1 -2
  76. package/dist/{compile-CcEu2ZQ1.js → compile-CMqMx_IN.js} +11 -8
  77. package/dist/{compile-CtTP7eur.d.ts → compile-Ckm2HqBZ.d.ts} +5 -3
  78. package/dist/completion-BqhRBJD8.js +143 -0
  79. package/dist/config-B46rm9sc.js +26 -0
  80. package/dist/{config-BIjREpyE.js → config-bs_kZeYq.js} +12 -7
  81. package/dist/{config-report--Xb9APJS.js → config-report-DUgj62Ai.js} +15 -5
  82. package/dist/{connection-DUsczpB5.js → connection-DjhIJSs2.js} +6 -5
  83. package/dist/{context-DieZVJXu.js → context-bbFHR-0D.js} +2 -2
  84. package/dist/convex/index.d.ts +11 -10
  85. package/dist/convex/index.js +6 -4
  86. package/dist/create-0VZ7Pdiu.d.ts +107 -0
  87. package/dist/create-BDS7wc3y.d.ts +138 -0
  88. package/dist/create-BFfm17UA.d.ts +110 -0
  89. package/dist/create-BWRSXgOF.js +403 -0
  90. package/dist/create-C3b4B5eF.js +130 -0
  91. package/dist/{create-BBO24vj6.js → create-DnrmLnLW.js} +31 -32
  92. package/dist/{credential-kue0qpbm.js → credential-DM2um3ha.js} +152 -31
  93. package/dist/credentials-DPyHmYz5.js +74 -0
  94. package/dist/delegation-DaXVdDhM.js +286 -0
  95. package/dist/delivery/index.d.ts +5 -0
  96. package/dist/delivery/index.js +5 -0
  97. package/dist/delivery-DCAgNyCn.js +499 -0
  98. package/dist/delivery-event-xX4obB8F.js +40 -0
  99. package/dist/{denied-text-DfRk15uw.d.ts → denied-text-D8jDHgsl.d.ts} +5 -5
  100. package/dist/{describe-C3ldA9os.d.ts → describe-BZUsixiL.d.ts} +2 -2
  101. package/dist/{describe-Cgkp7eP0.js → describe-BybMRY7A.js} +6 -2
  102. package/dist/device-BARQ8eYG.js +193 -0
  103. package/dist/diff-CxZo9pTq.js +37 -0
  104. package/dist/{diff-rpqoe7Ag.js → diff-DCePiN6M.js} +60 -54
  105. package/dist/doctor-CxiwSfqH.js +44 -0
  106. package/dist/{doctor-owlv6ddh.js → doctor-DFjUxf2f.js} +245 -50
  107. package/dist/drizzle/index.d.ts +5 -3
  108. package/dist/drizzle/index.js +2 -2
  109. package/dist/elysia/index.d.ts +16 -13
  110. package/dist/elysia/index.js +13 -12
  111. package/dist/env-DJZrPjRi.js +8 -0
  112. package/dist/errors-BDUwg2qC.js +27 -0
  113. package/dist/{errors-drnfxYtm.js → errors-BKy0EfhN.js} +5 -9
  114. package/dist/errors-BWXBMaKK.d.ts +11 -0
  115. package/dist/{errors-OD_4c__H.d.ts → errors-C2PXIv4c.d.ts} +2 -2
  116. package/dist/errors-CWTY6uih.js +143 -0
  117. package/dist/evaluate-_R8QkWaf.js +1732 -0
  118. package/dist/evaluations-16UqqQ6W.d.ts +32 -0
  119. package/dist/{evaluations-C9YJsv3H.js → evaluations-DZ2CbV5k.js} +145 -34
  120. package/dist/eve/index.d.ts +12 -16
  121. package/dist/eve/index.js +22 -28
  122. package/dist/event-time-CsegxXxB.js +23 -0
  123. package/dist/expiry-D4_YKRKD.js +52 -0
  124. package/dist/express/index.d.ts +13 -10
  125. package/dist/express/index.js +12 -11
  126. package/dist/fastify/index.d.ts +25 -22
  127. package/dist/fastify/index.js +13 -12
  128. package/dist/fetch-adapter-g0ypLkID.js +120 -0
  129. package/dist/fetch-adapter-qKJBuRqy.d.ts +31 -0
  130. package/dist/fields-D9tPVUUS.js +203 -0
  131. package/dist/files-C5ZI27eV.js +124 -0
  132. package/dist/{fixtures-h2eG2OZV.js → fixtures-B7XrLeY7.js} +8 -7
  133. package/dist/flags-C3DktBDY.js +86 -0
  134. package/dist/{from-snapshot-7REQZe0H.js → from-snapshot-D2lZt4Dd.js} +55 -52
  135. package/dist/{grantee-CXY-0C87.js → grantee-Cn1HyUsI.js} +3 -3
  136. package/dist/{grantee-conditions-MQs5NIuX.js → grantee-conditions-CcXf8hMM.js} +4 -3
  137. package/dist/{grantee-match-fxYp9Nmt.js → grantee-match-DHArqY82.js} +5 -4
  138. package/dist/h3/index.d.ts +37 -0
  139. package/dist/h3/index.js +35 -0
  140. package/dist/headers-BIjfMaoC.js +8 -0
  141. package/dist/headers-CIbDTUTK.d.ts +7 -0
  142. package/dist/{helpers-C9YmyBIa.js → helpers-DTcZOzhF.js} +45 -38
  143. package/dist/hono/index.d.ts +12 -9
  144. package/dist/hono/index.js +13 -12
  145. package/dist/hosted-BZIAYvon.js +315 -0
  146. package/dist/hosted-DBDX0M-P.d.ts +78 -0
  147. package/dist/{http-DPuDaChb.d.ts → http-B_LphE5Y.d.ts} +1 -2
  148. package/dist/http-DXJ37RDA.js +46 -0
  149. package/dist/{http-BEbdMZ05.js → http-ujKm0JXE.js} +1 -2
  150. package/dist/{import-UHk1N7vH.js → import-CNV7I2Dw.js} +25 -20
  151. package/dist/{import-BFIlhetD.js → import-DMmOG27O.js} +190 -53
  152. package/dist/index-BcHcPyIo.d.ts +110 -0
  153. package/dist/index-CaxrMD1A.d.ts +1 -0
  154. package/dist/index-Chrs5fQ-.d.ts +210 -0
  155. package/dist/index-CxGUswIC.d.ts +431 -0
  156. package/dist/index-D8EovfsP.d.ts +91 -0
  157. package/dist/{index-UdVQgq48.d.ts → index-DOVf7RJv.d.ts} +431 -81
  158. package/dist/{index-BwMe94Xq.d.ts → index-SGdIQyzc.d.ts} +34 -16
  159. package/dist/index.d.ts +19 -15
  160. package/dist/index.js +31 -21
  161. package/dist/init-DeMYsnYJ.js +96 -0
  162. package/dist/init-GG6Jh8HD.js +95 -0
  163. package/dist/{instance-options-plkrsAog.d.ts → instance-options-Omfd793B.d.ts} +2 -2
  164. package/dist/instance-snapshot-Cxq4ygFc.js +600 -0
  165. package/dist/instant-BluqDvyS.js +19 -0
  166. package/dist/internals-Dk8A8fX3.js +17 -0
  167. package/dist/{json-schema-DBkdUuCO.js → json-schema-B-vAwlde.js} +45 -6
  168. package/dist/json-schema-CN_iLFH2.d.ts +40 -0
  169. package/dist/jwt/index.d.ts +18 -11
  170. package/dist/jwt/index.js +156 -135
  171. package/dist/{kernel-CB3LrIJM.js → kernel-5JatXyND.js} +52 -24
  172. package/dist/kysely/index.d.ts +5 -3
  173. package/dist/kysely/index.js +2 -2
  174. package/dist/load-BxEtwlBS.js +1 -0
  175. package/dist/{load-C3_oTHyO.js → load-DFS_ry0W.js} +22 -6
  176. package/dist/{load-jose-BL6LH4bL.js → load-jose-DZ4dnjri.js} +1 -4
  177. package/dist/login-Dfe5RlYk.js +68 -0
  178. package/dist/login-imhuwvn3.js +254 -0
  179. package/dist/manifest-C8IzW3Do.js +42 -0
  180. package/dist/manifest-CtKR3GXL.js +370 -0
  181. package/dist/manifest-json-CAGzls-C.js +9 -0
  182. package/dist/{manifest-uDS9y5de.d.ts → manifest-mx5ghSFM.d.ts} +9 -2
  183. package/dist/manifest-schema-C0kK_8V0.js +399 -0
  184. package/dist/{map-claims-AVlBaJoa.js → map-claims-D3oRmTk0.js} +13 -10
  185. package/dist/{map-error-BE27PYkE.js → map-error-TCAdw-eW.js} +3 -3
  186. package/dist/{markers-CiwAOZtO.js → markers-C6joDI3o.js} +2 -1
  187. package/dist/mcp/index.d.ts +22 -12
  188. package/dist/mcp/index.js +57 -39
  189. package/dist/{migrate-BwlB5-Wk.js → migrate-BShP7Vf4.js} +53 -14
  190. package/dist/nest/index.d.ts +12 -9
  191. package/dist/nest/index.js +15 -14
  192. package/dist/next/index.d.ts +18 -21
  193. package/dist/next/index.js +13 -11
  194. package/dist/next/plugin.d.ts +1 -1
  195. package/dist/next/plugin.js +2 -2
  196. package/dist/node/index.d.ts +10 -10
  197. package/dist/node/index.js +7 -9
  198. package/dist/{ocsf-uYFXGVw2.js → ocsf-BFp-PZZA.js} +22 -11
  199. package/dist/openai/index.d.ts +9 -16
  200. package/dist/openai/index.js +17 -24
  201. package/dist/openapi/index.d.ts +3 -3
  202. package/dist/openapi/index.js +1 -1
  203. package/dist/{openapi-DBzHQbov.js → openapi-B7HZ0f-r.js} +8 -8
  204. package/dist/{openapi-BJdBmYDG.js → openapi-DTaEmTSW.js} +10 -9
  205. package/dist/openapi-ahr8rHu3.js +138 -0
  206. package/dist/operation-findings-DgATDpvh.js +36 -0
  207. package/dist/operations-CxybZErY.d.ts +59 -0
  208. package/dist/orpc/index.d.ts +13 -10
  209. package/dist/orpc/index.js +20 -15
  210. package/dist/otel/index.d.ts +3 -2
  211. package/dist/otel/index.js +30 -7
  212. package/dist/output-Dyw8fyPF.js +88 -0
  213. package/dist/output-files-B3IZJksC.js +1 -0
  214. package/dist/{output-files-CgIsvdSa.js → output-files-DhRBBE4n.js} +24 -26
  215. package/dist/{permission-keys-B26jeyUv.js → ownership-BatFgAA4.js} +1698 -869
  216. package/dist/{package-root-DtNnpmUd.js → package-root-Dk_ETdkp.js} +1 -1
  217. package/dist/{parse-CVFQHk6c.js → parse-Cxq0WxrA.js} +2 -2
  218. package/dist/{parse-local-manifest-C-q02Pal.js → parse-local-manifest-CVSs6J9I.js} +1 -1
  219. package/dist/{parse-local-manifest-DvYUR0QL.d.ts → parse-local-manifest-DgqtruPn.d.ts} +1 -1
  220. package/dist/parse-request-D_tUXG6M.js +26 -0
  221. package/dist/paths-DXSHAMIa.js +42 -0
  222. package/dist/pdp/index.d.ts +7 -3
  223. package/dist/pdp/index.js +45 -26
  224. package/dist/{peer-BOr_kJE1.js → peer-C8swJ2GH.js} +23 -4
  225. package/dist/peer-CRvC7Hg1.js +1 -0
  226. package/dist/permdock-B9JxkBwC.js +868 -0
  227. package/dist/permdock-D7eeLJER.d.ts +502 -0
  228. package/dist/{permission-registry-BsblpB-z.js → permission-registry-Br4jSNVi.js} +3 -3
  229. package/dist/permissions-B-wCP5ZC.js +30 -0
  230. package/dist/{permissions-CCJ6lmxB.js → permissions-CZKiUfFM.js} +4 -3
  231. package/dist/{permissions-COH-KRgT.d.ts → permissions-oEWfl-kl.d.ts} +1 -2
  232. package/dist/policies-CO1oOymN.js +295 -0
  233. package/dist/{policy-ur0BBK_e.d.ts → policy-Czo4n3Hs.d.ts} +2 -2
  234. package/dist/{hosted-CBHgkzDl.js → policy-DLZJ5gAp.js} +17 -273
  235. package/dist/policy-from-catalog-DzhEc3Y9.js +450 -0
  236. package/dist/policy-module-CTlwMvLI.js +89 -0
  237. package/dist/{policy-types-sp9P1iIV.d.ts → policy-types-DzwivBgR.d.ts} +434 -631
  238. package/dist/postgrest-CW0IqC-U.js +566 -0
  239. package/dist/postgrest-NUqZT-RB.d.ts +100 -0
  240. package/dist/powersync-BHfuehf3.js +62 -0
  241. package/dist/powersync-CbzkqL_M.js +1 -0
  242. package/dist/{powersync-cZe4kzhL.js → powersync-bYUDLOAO.js} +23 -24
  243. package/dist/preset/index.d.ts +146 -0
  244. package/dist/preset/index.js +1 -0
  245. package/dist/preset-DZdU0tne.js +1768 -0
  246. package/dist/principal-source-pHneukrx.js +103 -0
  247. package/dist/prisma/index.d.ts +6 -3
  248. package/dist/prisma/index.js +2 -2
  249. package/dist/{problem-CnWraVhC.js → problem-CTviyH5L.js} +13 -23
  250. package/dist/{problem-details-rIIo8B2C.d.ts → problem-details-DXlt-vks.d.ts} +1 -1
  251. package/dist/{problem-details-DECUnXAn.js → problem-details-cn5X30gZ.js} +43 -40
  252. package/dist/problem-types-CJ2325SZ.js +5 -0
  253. package/dist/{prompt-CXYhLfsS.js → prompt-DfZLJLIn.js} +2 -2
  254. package/dist/{protected-B3_P7xuw.d.ts → protected-DEPHc2xV.d.ts} +16 -8
  255. package/dist/{protected-BN7BUdY1.js → protected-DfjY5mLA.js} +21 -4
  256. package/dist/{provider-Bi-0HNL3.js → provider-CC-u3bYP.js} +2 -2
  257. package/dist/{provider-kwHC9CZD.d.ts → provider-DMVt6yYn.d.ts} +1 -1
  258. package/dist/{provider-store-Ctt-81Ni.js → provider-store-B5Yrkhzr.js} +2 -2
  259. package/dist/pull-BgIfno6w.js +256 -0
  260. package/dist/pull-ByOks_Tg.js +1 -0
  261. package/dist/push-CmFVBOeI.js +116 -0
  262. package/dist/pushed-policy-BImMTTIM.d.ts +57 -0
  263. package/dist/pushed-policy-DobP7AHI.js +238 -0
  264. package/dist/react/index.d.ts +8 -8
  265. package/dist/react/index.js +6 -6
  266. package/dist/react/provider-client.d.ts +1 -1
  267. package/dist/react/provider-client.js +1 -2
  268. package/dist/react-native/index.d.ts +24 -72
  269. package/dist/react-native/index.js +24 -22
  270. package/dist/{refs-f3imMjNW.js → refs-K6eWUJ0H.js} +1 -1
  271. package/dist/{relation-walk-BXnlLtg2.js → relation-walk-3OyDBF0S.js} +2 -2
  272. package/dist/{relations-CvmSpG67.js → relations-BnCWnJGI.js} +3 -3
  273. package/dist/renames-CGj7YwcQ.js +175 -0
  274. package/dist/{replay-COpmZUfx.d.ts → replay-D7iKcLFe.d.ts} +1 -1
  275. package/dist/{replay-BsOyTrdV.js → replay-Du1tJjG7.js} +2 -1
  276. package/dist/{request-context-BVM7aWNs.js → request-context-BTRTG7OT.js} +3 -3
  277. package/dist/request-schema-CMreVuFM.js +148 -0
  278. package/dist/resend/index.d.ts +126 -0
  279. package/dist/resend/index.js +379 -0
  280. package/dist/{resource-relations-D1Un3pcz.js → resource-relations-D_jw0BFx.js} +1 -1
  281. package/dist/{retire-BFcxL6un.js → retire-CALjIQ7e.js} +2 -2
  282. package/dist/{revocations-Cy06JNx2.d.ts → revocations-R07lFBnX.d.ts} +2 -0
  283. package/dist/rls-BA8an5Ap.js +336 -0
  284. package/dist/{rls-BEktUaqg.js → rls-j6t43t7n.js} +287 -689
  285. package/dist/{role-builder-B4GbKM-i.js → role-builder-CXbis5-X.js} +14 -207
  286. package/dist/{rpc-nYC3cR_u.js → rpc-aPyNi6tA.js} +7 -7
  287. package/dist/run-CNsApDpd.js +1 -0
  288. package/dist/run-DOfMtc9V.js +723 -0
  289. package/dist/run-ticket-BjhTOi6u.d.ts +124 -0
  290. package/dist/run-ticket-sxFI6LAk.js +337 -0
  291. package/dist/{runtime-D_tMXnsq.js → runtime-D3VTAiCA.js} +1 -1
  292. package/dist/{saas-DtaA4JuW.js → saas-FO-Q8oj0.js} +16 -14
  293. package/dist/scan-BOI5tJ-6.js +29 -0
  294. package/dist/{schema-DjQBcAP9.js → schema-B4v0Qrac.js} +102 -8
  295. package/dist/schema-yLuBWWsh.js +130 -0
  296. package/dist/scim/index.d.ts +2 -2
  297. package/dist/scim/index.js +1 -2
  298. package/dist/{scim-vFR1O5oG.js → scim-ClHtpyV3.js} +208 -76
  299. package/dist/{scopes-tvpa34ep.js → scopes-CUPSjo9q.js} +12 -7
  300. package/dist/server/index.d.ts +12 -143
  301. package/dist/server/index.js +12 -9
  302. package/dist/server-DqCT4CgZ.js +453 -0
  303. package/dist/{server-types-DdqBwZN_.d.ts → server-types-BLd4MnBX.d.ts} +51 -68
  304. package/dist/{sha256-BO0swRXL.js → sha256-D9ihqmvd.js} +8 -1
  305. package/dist/{shared-1uhI-e-b.js → shared-CD11nBbC.js} +18 -8
  306. package/dist/{shared-JhMeOsDF.js → shared-DvvFzYXe.js} +8 -9
  307. package/dist/signals-D3NcTKUS.js +32 -0
  308. package/dist/sink-BEZSlMS_.js +957 -0
  309. package/dist/sink-Bj_lDUDq.d.ts +225 -0
  310. package/dist/{skills-BZdRQkxs.js → skills-B6lVdD_W.js} +13 -6
  311. package/dist/skills-CTYwkl44.js +51 -0
  312. package/dist/snapshot-CXUWfsNy.js +269 -0
  313. package/dist/{snapshot-cache-Cod40D-X.js → snapshot-cache-DZHQ0KF6.js} +11 -5
  314. package/dist/{snapshot-cache-J5T7t_vD.d.ts → snapshot-cache-DqK9eDmM.d.ts} +7 -5
  315. package/dist/solid/index.d.ts +11 -12
  316. package/dist/solid/index.js +7 -7
  317. package/dist/solid-start/index.d.ts +52 -0
  318. package/dist/solid-start/index.js +49 -0
  319. package/dist/{sources-Dljy06zL.d.ts → sources-BV9j0DeZ.d.ts} +7 -13
  320. package/dist/{sources-B1-b-R0t.js → sources-vs5dGOsS.js} +125 -119
  321. package/dist/{sql-t8teWOfo.js → sql-B5T1IL83.js} +13 -1
  322. package/dist/src-DLfUWFAI.js +1851 -0
  323. package/dist/ssf/index.d.ts +4 -4
  324. package/dist/ssf/index.js +384 -47
  325. package/dist/standard-webhooks-6lg8v_is.d.ts +88 -0
  326. package/dist/standard-webhooks-DgFFD-Ga.js +228 -0
  327. package/dist/storage-C2bWdvJH.js +132 -0
  328. package/dist/{store-ILkLUj_o.js → store-4u_hxjWa.js} +40 -53
  329. package/dist/{store-options-CbUHDoSe.js → store-options-BqEakYRa.js} +26 -21
  330. package/dist/{stores-BHXdSbw9.js → stores-BbsD4fAR.js} +2 -2
  331. package/dist/{stores-Cxz_80g-.d.ts → stores-ClZUgeoP.d.ts} +7 -8
  332. package/dist/{stream-Dwsg6WwE.d.ts → stream-7-xmnf3U.d.ts} +2 -2
  333. package/dist/{stream-BMui98KK.js → stream-CvdUS9V1.js} +9 -2
  334. package/dist/style-DiKWnAvn.js +1 -0
  335. package/dist/{style-CTm1AXDT.js → style-Uao76wO7.js} +3 -2
  336. package/dist/subject-BGoM5o8B.js +17 -0
  337. package/dist/supabase/index.d.ts +23 -106
  338. package/dist/supabase/index.js +5 -4
  339. package/dist/supabase/middleware.d.ts +7 -6
  340. package/dist/supabase/middleware.js +13 -11
  341. package/dist/supabase-9pqI57pW.js +92 -0
  342. package/dist/{supabase-C1TWlnYt.js → supabase-Dxlp8A94.js} +98 -205
  343. package/dist/supabase-hook-CXcGpHqq.js +1 -0
  344. package/dist/{supabase-hook-Cva3ikXz.js → supabase-hook-DdDQhMlw.js} +951 -60
  345. package/dist/support-session-C6xJQYut.js +158 -0
  346. package/dist/svelte/Protected.svelte +4 -4
  347. package/dist/svelte/index.d.ts +7 -7
  348. package/dist/svelte/index.js +10 -10
  349. package/dist/svelte/runtime.d.ts +3 -3
  350. package/dist/svelte/runtime.js +3 -3
  351. package/dist/svelte/source.d.ts +7 -7
  352. package/dist/svelte/source.js +4 -4
  353. package/dist/sveltekit/index.d.ts +51 -0
  354. package/dist/sveltekit/index.js +27 -0
  355. package/dist/tanstack-start/index.d.ts +51 -0
  356. package/dist/tanstack-start/index.js +40 -0
  357. package/dist/target-Bw37TFNA.js +51 -0
  358. package/dist/{tenancy-DshjqY0n.js → tenancy-DN2QAx9z.js} +5 -5
  359. package/dist/terminal/index.d.ts +11 -9
  360. package/dist/terminal/index.js +23 -287
  361. package/dist/testing/index.d.ts +311 -38
  362. package/dist/testing/index.js +3475 -201
  363. package/dist/testing/saas/index.d.ts +9 -8
  364. package/dist/testing/saas/index.js +2 -2
  365. package/dist/testing/saas/permissions.d.ts +1 -1
  366. package/dist/testing/saas/permissions.js +1 -2
  367. package/dist/text-BMFRfBqc.js +8 -0
  368. package/dist/{text-diff-BdkkYSbi.js → text-diff-BQcUapOb.js} +1 -1
  369. package/dist/thenable-yD7SabqG.js +31 -0
  370. package/dist/time-DkWjdL98.js +71 -0
  371. package/dist/{token-Bx9qy30p.js → token-BLZcjQgt.js} +15 -6
  372. package/dist/{tool-refusal-CQ7OEia9.js → tool-refusal-CMLN5xhn.js} +2 -2
  373. package/dist/trpc/index.d.ts +12 -9
  374. package/dist/trpc/index.js +16 -14
  375. package/dist/{types-7rJVLWe5.d.ts → types-5Ut_pbKy.d.ts} +61 -11
  376. package/dist/{store-9KO4BlkB.d.ts → types-BNORmDM8.d.ts} +100 -75
  377. package/dist/types-BjV-fqcA.d.ts +57 -0
  378. package/dist/{types-CUcFZfpU.d.ts → types-BqAKcRNW.d.ts} +2 -1
  379. package/dist/types-C8-KNsFf.d.ts +107 -0
  380. package/dist/{types-Br9IXUBG.d.ts → types-CCpc2Dcv.d.ts} +77 -17
  381. package/dist/{types-DpWfQdSh.d.ts → types-CZTnPFzM.d.ts} +46 -11
  382. package/dist/{types-CqrjB9o6.d.ts → types-CdlxsYQh.d.ts} +23 -11
  383. package/dist/{types-CIlTojhq.d.ts → types-ClZaWzfb.d.ts} +9 -6
  384. package/dist/types-DX0LaKTb.d.ts +157 -0
  385. package/dist/types-DiQjupG2.d.ts +332 -0
  386. package/dist/types-DqzsnlSA.js +67 -0
  387. package/dist/types-_sHy8BQf.d.ts +65 -0
  388. package/dist/{types-ByUo56un.d.ts → types-fbZ7JEXr.d.ts} +23 -22
  389. package/dist/{types-DHrmBJLH.d.ts → types-tIgIeIKJ.d.ts} +7 -7
  390. package/dist/unplugin/index.d.ts +1 -1
  391. package/dist/unplugin/index.js +2 -2
  392. package/dist/usage-CHOtwL19.js +1 -0
  393. package/dist/usage-DHtE8j4E.js +32 -0
  394. package/dist/{usage-CG9nOYZw.js → usage-T5mXq98v.js} +54 -11
  395. package/dist/{validation-error-BSSw0l_8.d.ts → validation-error-Bg5Tpluk.d.ts} +1 -1
  396. package/dist/{validity-dVrUEPJt.js → validity-CZ7-y0Cj.js} +32 -15
  397. package/dist/{verifier-DMr_Zmb_.js → verifier-DHuh-okk.js} +18 -7
  398. package/dist/{verify-BztUB3GX.js → verify-DbCL9bnB.js} +645 -50
  399. package/dist/{version-BEogC-rB.js → version-CEbQ5UeM.js} +4 -3
  400. package/dist/version-DXkYUISx.js +1 -0
  401. package/dist/{views-CJsrBS1f.js → views-DTIIO-oQ.js} +22 -5
  402. package/dist/{permission-types-Dg39z9Kv.d.ts → vocabulary-D6lPdb4Z.d.ts} +65 -2
  403. package/dist/vue/index.d.ts +9 -10
  404. package/dist/vue/index.js +8 -8
  405. package/dist/waiter-BGUtGYoU.js +67 -0
  406. package/dist/waiter-CKy4MQSY.d.ts +36 -0
  407. package/dist/watch-Cb-NcaUw.js +1 -0
  408. package/dist/{watch-zeucB7eF.js → watch-CszoTJMq.js} +44 -5
  409. package/dist/webmcp/index.d.ts +2 -2
  410. package/dist/webmcp/index.js +3 -3
  411. package/dist/where-scope-Dv-WTP-w.js +306 -0
  412. package/dist/who-can-D0QoYbEb.js +364 -0
  413. package/dist/wire-delegation-Cv3W2eaM.js +36 -0
  414. package/dist/wire-denial-C7PaVYEM.js +27 -0
  415. package/dist/workflow/index.d.ts +5 -0
  416. package/dist/workflow/index.js +223 -0
  417. package/dist/workflow-sdk/index.d.ts +56 -0
  418. package/dist/workflow-sdk/index.js +78 -0
  419. package/dist/{wrap-Cr93qqdP.d.ts → wrap-Bd1Tejur.d.ts} +2 -1
  420. package/dist/{wrap-DWsU_5Bd.js → wrap-gX61EtpB.js} +7 -6
  421. package/package.json +136 -37
  422. package/schemas/access-event-v1.json +118 -0
  423. package/schemas/approval-request-v1.json +34 -1
  424. package/schemas/approval-signature-v1.json +94 -0
  425. package/schemas/automation-event-v1.json +113 -0
  426. package/schemas/capability-v1.json +84 -0
  427. package/schemas/catalog-event-v1.json +87 -0
  428. package/schemas/catalog-v1.json +123 -12
  429. package/schemas/cli-commands-v1.json +164 -0
  430. package/schemas/cli-result-v1.json +96 -0
  431. package/schemas/cloud-api-v1.json +5407 -0
  432. package/schemas/connector-v1.json +408 -0
  433. package/schemas/credential-event-v1.json +81 -0
  434. package/schemas/credential-v1.json +134 -0
  435. package/schemas/decision-event-v1.json +288 -0
  436. package/schemas/delivery-event-v1.json +117 -0
  437. package/schemas/directory-event-v1.json +85 -0
  438. package/schemas/evidence-export-v1.json +54 -0
  439. package/schemas/membership-event-v1.json +93 -0
  440. package/schemas/policy-v1.json +68 -0
  441. package/schemas/pushed-policy-v1.json +236 -0
  442. package/schemas/run-v1.json +162 -0
  443. package/schemas/snapshot-v1.json +138 -0
  444. package/schemas/supabase-claims-v1.json +4 -4
  445. package/schemas/supabase-manifest-v1.json +5 -1
  446. package/schemas/support-session-v1.json +111 -0
  447. package/skills/permdock/SKILL.md +16 -12
  448. package/skills/permdock-agents/SKILL.md +40 -23
  449. package/skills/permdock-agents/references/operations-automations-chat.md +221 -0
  450. package/skills/permdock-agents/references/runtimes.md +22 -18
  451. package/skills/permdock-approvals/SKILL.md +29 -13
  452. package/skills/permdock-approvals/references/delivery-and-waiters.md +172 -0
  453. package/skills/permdock-approvals/references/stores-and-resume.md +21 -7
  454. package/skills/permdock-audit/SKILL.md +3 -3
  455. package/skills/permdock-credentials/SKILL.md +5 -5
  456. package/skills/permdock-credentials/references/tokens-keys-links.md +14 -10
  457. package/skills/permdock-data/SKILL.md +6 -6
  458. package/skills/permdock-data/references/queries-and-rls.md +9 -8
  459. package/skills/permdock-data/references/relationships.md +3 -3
  460. package/skills/permdock-tenancy/SKILL.md +20 -7
  461. package/skills/permdock-tenancy/references/contacts-and-support-sessions.md +122 -0
  462. package/skills/permdock-tenancy/references/ownership-and-custom-roles.md +5 -4
  463. package/skills/permdock-wire/SKILL.md +17 -11
  464. package/skills/permdock-wire/references/adapters.md +139 -51
  465. package/skills/permdock-wire/references/policy-options.md +5 -5
  466. package/skills/permdock-wire/references/presets-and-recipes.md +58 -0
  467. package/dist/approvals-DZL76lKW.js +0 -240
  468. package/dist/arazzo-CD8d0WLb.js +0 -54
  469. package/dist/catalog-6yWAX6Ps.js +0 -2
  470. package/dist/catalog-WHG4kBq7.js +0 -48
  471. package/dist/cloud-C7bSDgX4.js +0 -50
  472. package/dist/cloud-PeBN3IEn.js +0 -118
  473. package/dist/collect-Bw2Jdq1q.js +0 -2
  474. package/dist/collect-CQx4hX4N.js +0 -83
  475. package/dist/commands-Cpip4ULx.js +0 -97
  476. package/dist/config-DLt6BvV7.js +0 -36
  477. package/dist/diff-Cnghh_Ip.js +0 -48
  478. package/dist/doctor-CuVJvhV_.js +0 -53
  479. package/dist/duration-xK2jGFVc.js +0 -25
  480. package/dist/errors-CWfoNg9N.js +0 -47
  481. package/dist/errors-DRnGZHzF.js +0 -30
  482. package/dist/expiry-BoBJ8Tvc.js +0 -7
  483. package/dist/fields-fwfXN01n.js +0 -1016
  484. package/dist/headers-BZSDieNT.js +0 -6
  485. package/dist/headers-Cf-zWvsO.d.ts +0 -6
  486. package/dist/ids-DC4V4CFu.js +0 -18
  487. package/dist/index-DgM7w96K.d.ts +0 -6
  488. package/dist/index-Dz7didpC.d.ts +0 -201
  489. package/dist/load-B_shHrmd.js +0 -2
  490. package/dist/manifest-BngWKryL.js +0 -770
  491. package/dist/may-use-BOn_dR_w.js +0 -78
  492. package/dist/openapi-DcQ1Kg40.js +0 -164
  493. package/dist/ownership-BgnbOJFT.js +0 -851
  494. package/dist/permdock-L26udHSk.js +0 -3646
  495. package/dist/powersync-BFSbSElQ.js +0 -62
  496. package/dist/powersync-DCDgZgfZ.js +0 -2
  497. package/dist/rls-55DQTuf5.js +0 -250
  498. package/dist/run-DMcNW_8T.js +0 -174
  499. package/dist/server-ZYEHtNHS.js +0 -268
  500. package/dist/sink-BTtmfPnE.js +0 -141
  501. package/dist/sink-CPN4zLfs.d.ts +0 -104
  502. package/dist/skills-Dle4ZoLF.js +0 -56
  503. package/dist/snapshot-Dc9CHPME.js +0 -1078
  504. package/dist/src-Bb7no-hS.js +0 -639
  505. package/dist/subject-C6dLxqHU.js +0 -24
  506. package/dist/supabase-Dbqr141s.js +0 -83
  507. package/dist/supabase-hook-BULg7Ut_.js +0 -2
  508. package/dist/thenable-QSmvt-vZ.js +0 -65
  509. package/dist/types-C0dee0Qf.d.ts +0 -197
  510. package/dist/types-DvupZE0w.d.ts +0 -9
  511. package/dist/usage-4G6t643F.js +0 -42
  512. package/dist/usage-iFLJ0-rr.js +0 -2
  513. package/dist/vocabulary-hhEFLFoL.d.ts +0 -65
  514. package/dist/watch-C8TpsAl4.js +0 -2
@@ -1,4 +1,5 @@
1
1
  import { r as isRecord } from "./compact-CAf557ZB.js";
2
+ import { n as isForbiddenKey } from "./paths-DXSHAMIa.js";
2
3
  //#region src/core/json-schema.ts
3
4
  function issue(issues, path, message) {
4
5
  issues.push({
@@ -38,6 +39,12 @@ function copyJson(value, path, issues, ancestors) {
38
39
  ancestors.delete(value);
39
40
  }
40
41
  }
42
+ /** JSON Schema counts string length in code points, not UTF-16 units. */
43
+ function codePoints(value) {
44
+ let count = 0;
45
+ for (const _ of value) count += 1;
46
+ return count;
47
+ }
41
48
  function typeMatches(type, value) {
42
49
  switch (type) {
43
50
  case "object": return isRecord(value);
@@ -45,6 +52,8 @@ function typeMatches(type, value) {
45
52
  case "string": return typeof value === "string";
46
53
  case "boolean": return typeof value === "boolean";
47
54
  case "integer": return Number.isInteger(value);
55
+ case "number": return typeof value === "number" && Number.isFinite(value);
56
+ case "null": return value === null;
48
57
  default: return type;
49
58
  }
50
59
  }
@@ -69,12 +78,32 @@ function checkSchema(node, value, path, issues, root = node) {
69
78
  issue(issues, path, `Expected one of ${node.enum.map((item) => JSON.stringify(item)).join(", ")}`);
70
79
  return;
71
80
  }
72
- if (node.type !== void 0 && !typeMatches(node.type, value)) {
73
- issue(issues, path, `Expected ${node.type}`);
74
- return;
81
+ if (node.type !== void 0) {
82
+ const types = typeof node.type === "string" ? [node.type] : node.type;
83
+ if (!types.some((type) => typeMatches(type, value))) {
84
+ issue(issues, path, `Expected ${types.join(" or ")}`);
85
+ return;
86
+ }
87
+ }
88
+ if (typeof value === "string") {
89
+ if (node.pattern !== void 0 && !new RegExp(node.pattern, "u").test(value)) issue(issues, path, `Expected a string matching ${node.pattern}`);
90
+ if (node.minLength !== void 0 && value.length < node.minLength) issue(issues, path, `Expected at least ${String(node.minLength)} characters`);
91
+ if (node.maxLength !== void 0 && codePoints(value) > node.maxLength) issue(issues, path, `Expected at most ${String(node.maxLength)} characters`);
92
+ }
93
+ if (typeof value === "number") {
94
+ if (node.minimum !== void 0 && value < node.minimum) issue(issues, path, `Expected at least ${String(node.minimum)}`);
95
+ if (node.maximum !== void 0 && value > node.maximum) issue(issues, path, `Expected at most ${String(node.maximum)}`);
96
+ if (node.exclusiveMinimum !== void 0 && value <= node.exclusiveMinimum) issue(issues, path, `Expected more than ${String(node.exclusiveMinimum)}`);
97
+ if (node.exclusiveMaximum !== void 0 && value >= node.exclusiveMaximum) issue(issues, path, `Expected less than ${String(node.exclusiveMaximum)}`);
75
98
  }
76
- if (node.pattern !== void 0 && typeof value === "string" && !new RegExp(node.pattern, "u").test(value)) issue(issues, path, `Expected a string matching ${node.pattern}`);
77
- if (node.minimum !== void 0 && typeof value === "number" && value < node.minimum) issue(issues, path, `Expected at least ${String(node.minimum)}`);
99
+ if (node.anyOf !== void 0) {
100
+ if (!node.anyOf.some((option) => {
101
+ const scratch = [];
102
+ checkSchema(option, value, path, scratch, root);
103
+ return scratch.length === 0;
104
+ })) issue(issues, path, "Expected at least one matching form");
105
+ }
106
+ for (const option of node.allOf ?? []) checkSchema(option, value, path, issues, root);
78
107
  if (node.oneOf !== void 0) {
79
108
  if (node.oneOf.filter((option) => {
80
109
  const scratch = [];
@@ -84,6 +113,7 @@ function checkSchema(node, value, path, issues, root = node) {
84
113
  }
85
114
  if (Array.isArray(value)) {
86
115
  if (node.minItems !== void 0 && value.length < node.minItems) issue(issues, path, `Expected at least ${String(node.minItems)} items`);
116
+ if (node.maxItems !== void 0 && value.length > node.maxItems) issue(issues, path, `Expected at most ${String(node.maxItems)} items`);
87
117
  if (node.uniqueItems === true && new Set(value.map((item) => JSON.stringify(item))).size !== value.length) issue(issues, path, "Expected unique items");
88
118
  if (node.items !== void 0) for (const [index, item] of value.entries()) checkSchema(node.items, item, [...path, index], issues, root);
89
119
  }
@@ -100,5 +130,14 @@ function checkSchema(node, value, path, issues, root = node) {
100
130
  else if (node.additionalProperties !== void 0) checkSchema(node.additionalProperties, value[key], [...path, key], issues, root);
101
131
  }
102
132
  }
133
+ /** The path of the first `__proto__`, `constructor` or `prototype` key in `value`, if any. */
134
+ function forbiddenKeyPath(value, path = []) {
135
+ if (value === null || typeof value !== "object") return;
136
+ for (const [key, child] of Object.entries(value)) {
137
+ if (isForbiddenKey(key)) return [...path, key];
138
+ const found = forbiddenKeyPath(child, [...path, key]);
139
+ if (found !== void 0) return found;
140
+ }
141
+ }
103
142
  //#endregion
104
- export { copyJson as n, checkSchema as t };
143
+ export { copyJson as n, forbiddenKeyPath as r, checkSchema as t };
@@ -0,0 +1,40 @@
1
+ import { StandardSchemaV1 } from "@standard-schema/spec";
2
+ //#region src/core/json-schema.d.ts
3
+ /**
4
+ * The JSON Schema 2020-12 keywords the package's own schemas use;
5
+ * `checkSchema` interprets exactly these. `$ref` resolves only `#/$defs/<name>`
6
+ * against the root node. Annotations (`title`, `description`, `format`) are
7
+ * ignored, so a `format` always sits next to a `pattern` that enforces it.
8
+ */
9
+ type JsonSchemaNode = {
10
+ readonly $schema?: string;
11
+ readonly $id?: string;
12
+ readonly $ref?: string;
13
+ readonly $defs?: Readonly<Record<string, JsonSchemaNode>>;
14
+ readonly title?: string;
15
+ readonly description?: string;
16
+ readonly type?: JsonSchemaType | readonly JsonSchemaType[];
17
+ readonly format?: string;
18
+ readonly const?: unknown;
19
+ readonly enum?: readonly unknown[];
20
+ readonly pattern?: string;
21
+ readonly minLength?: number;
22
+ readonly maxLength?: number;
23
+ readonly minimum?: number;
24
+ readonly maximum?: number;
25
+ readonly exclusiveMinimum?: number;
26
+ readonly exclusiveMaximum?: number;
27
+ readonly minItems?: number;
28
+ readonly maxItems?: number;
29
+ readonly uniqueItems?: boolean;
30
+ readonly required?: readonly string[];
31
+ readonly properties?: Readonly<Record<string, JsonSchemaNode>>;
32
+ readonly additionalProperties?: JsonSchemaNode | false;
33
+ readonly items?: JsonSchemaNode;
34
+ readonly oneOf?: readonly JsonSchemaNode[];
35
+ readonly anyOf?: readonly JsonSchemaNode[];
36
+ readonly allOf?: readonly JsonSchemaNode[];
37
+ };
38
+ type JsonSchemaType = "object" | "array" | "string" | "boolean" | "integer" | "number" | "null";
39
+ //#endregion
40
+ export { JsonSchemaNode as t };
@@ -1,7 +1,7 @@
1
- import { K as JwtClaims, Or as Principal, ct as TokenFailureCause, kr as Subject, lt as TokenSigner, ut as TokenVerifier, yn as AuthEvent } from "../policy-types-sp9P1iIV.js";
2
- import { a as JsonWebKeySet, c as JwtJwks, d as MappedSubject, g as ReplayStore, i as JoseTokenVerifierOptions, l as JwtPrincipal, n as DpopProofResult, o as JwtAlgorithm, r as JoseTokenSignerOptions, s as JwtClaimPaths, t as DiscoveryInput, u as JwtSubjectOptions } from "../types-C0dee0Qf.js";
3
- import { i as LinkPolicy, o as LinkPrincipal, t as Capability } from "../capability-CksyCWDH.js";
4
- import { t as memoryReplayStore } from "../replay-COpmZUfx.js";
1
+ import { Y as JwtClaims, dt as TokenVerifier, ir as Subject, lt as TokenFailureCause, qt as AuthEvent, rr as Principal, ut as TokenSigner } from "../policy-types-DzwivBgR.js";
2
+ import { c as LinkPolicy, o as CapabilityPrincipal, t as Capability } from "../capability-BSslw1QV.js";
3
+ import { B as JwtAlgorithm, F as DpopProofResult, H as JwtPrincipal, I as IntrospectionPrincipal, L as JoseTokenSignerOptions, P as DiscoveryInput, R as JoseTokenVerifierOptions, U as JwtSubjectOptions, V as JwtJwks, W as MappedSubject, l as ReplayStore, z as JsonWebKeySet } from "../types-DiQjupG2.js";
4
+ import { t as memoryReplayStore } from "../replay-D7iKcLFe.js";
5
5
  import { StandardSchemaV1 } from "@standard-schema/spec";
6
6
  //#region src/jwt/capability.d.ts
7
7
  /** `on('auth')` causes: a verification failure, or one of the three capability checks. */
@@ -23,16 +23,23 @@ type CapabilitySubjectOptions = Omit<JoseTokenVerifierOptions, "typ" | "issuer"
23
23
  readonly replay?: ReplayStore;
24
24
  /** The request's own verified subject, checked against the capability's `redeemer`. */
25
25
  readonly viewer?: Subject;
26
+ /**
27
+ * The incoming request. A capability with `cnf` resolves only when the
28
+ * request carries a DPoP proof (RFC 9449) signed by the bound key;
29
+ * without one it is refused.
30
+ */
31
+ readonly request?: Request;
26
32
  readonly onAuth?: (event: AuthEvent) => void;
27
33
  readonly requestId?: string;
28
34
  };
29
35
  /**
30
- * Resolves a `permdock-capability+jwt` into the `link` subject it acts as.
36
+ * Resolves a `vnd.permdock.capability+jwt` into the `link` subject it acts as.
31
37
  * Every failure (signature, `typ`, `iss`, `aud`, expiry, a malformed claim,
32
38
  * a revoked link, a replayed one-time token, a redeemer the viewer does not
33
- * satisfy, a throwing store) is the anonymous subject, never a throw.
39
+ * satisfy, a `cnf` without a matching DPoP proof, a throwing store) is the
40
+ * anonymous subject, never a throw.
34
41
  */
35
- export declare function subjectFromCapability(token: string | undefined | null, options: CapabilitySubjectOptions): Promise<Subject<LinkPrincipal> | Subject>;
42
+ export declare function subjectFromCapability(token: string | undefined | null, options: CapabilitySubjectOptions): Promise<Subject<CapabilityPrincipal>>;
36
43
  //#endregion
37
44
  //#region src/jwt/ci-oidc.d.ts
38
45
  type CiOidcProvider = "github" | "gitlab" | "buildkite";
@@ -76,16 +83,16 @@ type DpopProofOptions = {
76
83
  export declare function verifyDpopProof(request: Request, claims: JwtClaims, accessToken?: string, options?: DpopProofOptions): Promise<DpopProofResult>;
77
84
  //#endregion
78
85
  //#region src/jwt/introspection.d.ts
79
- export declare function subjectFromIntrospection(response: unknown, options?: JwtSubjectOptions): MappedSubject;
86
+ export declare function subjectFromIntrospection(response: unknown, options?: JwtSubjectOptions): Subject<IntrospectionPrincipal>;
80
87
  //#endregion
81
88
  //#region src/jwt/signer.d.ts
82
89
  export declare function joseTokenSigner(options: JoseTokenSignerOptions): TokenSigner;
83
90
  //#endregion
84
91
  //#region src/jwt/subject.d.ts
85
- export declare function subjectFromJwt(token: string | undefined | null, options: JwtSubjectOptions, request?: Request): Promise<MappedSubject>;
86
- export declare function createJwtSubjectResolver(options: JwtSubjectOptions): (token: string | undefined | null, request?: Request) => Promise<MappedSubject>;
92
+ export declare function subjectFromJwt(token: string | undefined | null, options: JwtSubjectOptions, request?: Request): Promise<Subject<JwtPrincipal>>;
93
+ export declare function jwtSubjectResolver(options: JwtSubjectOptions): (token: string | undefined | null, request?: Request) => Promise<MappedSubject>;
87
94
  //#endregion
88
95
  //#region src/jwt/verifier.d.ts
89
96
  export declare function joseTokenVerifier(options: JoseTokenVerifierOptions): TokenVerifier;
90
97
  //#endregion
91
- export { type CapabilityFailureCause, type CapabilitySubjectOptions, type CiOidcPrincipal, type CiOidcProvider, type CiOidcSubjectOptions, type DiscoveryInput, type DpopProofOptions, type DpopProofResult, type JoseTokenSignerOptions, type JoseTokenVerifierOptions, type JsonWebKeySet, type JwtAlgorithm, type JwtClaimPaths, type JwtJwks, type JwtPrincipal, type JwtSubjectOptions, type MappedSubject, type ReplayStore, memoryReplayStore };
98
+ export { type CapabilityFailureCause, type CapabilitySubjectOptions, type CiOidcPrincipal, type CiOidcProvider, type CiOidcSubjectOptions, type DiscoveryInput, type DpopProofOptions, type DpopProofResult, type IntrospectionPrincipal, type JoseTokenSignerOptions, type JoseTokenVerifierOptions, type JsonWebKeySet, type JwtAlgorithm, type JwtJwks, type JwtPrincipal, type JwtSubjectOptions, type ReplayStore, memoryReplayStore };
package/dist/jwt/index.js CHANGED
@@ -1,12 +1,114 @@
1
1
  import { r as isRecord, t as compact } from "../compact-CAf557ZB.js";
2
2
  import { n as freezeDeep } from "../freeze-CrU8nQeX.js";
3
- import { n as sha256, t as bytesToBase64Url } from "../sha256-BO0swRXL.js";
4
- import { t as anonymousSubject } from "../subject-C6dLxqHU.js";
5
- import { i as linkPolicyViolation, o as parseCapability, s as redeemerAllows, t as capabilitySubject } from "../capability-txATtKV4.js";
6
- import { a as decodeHeader, i as issuerFromDiscovery, n as assertSubjectConfig, o as normalizeTyp, r as fail, t as joseTokenVerifier } from "../verifier-DMr_Zmb_.js";
7
- import { t as loadJose } from "../load-jose-BL6LH4bL.js";
8
- import { n as mapClaimsToSubject, r as validateCustomClaims, t as acceptMismatch } from "../map-claims-AVlBaJoa.js";
9
- import { t as memoryReplayStore } from "../replay-BsOyTrdV.js";
3
+ import { o as epochSeconds, p as nowSeconds } from "../time-DkWjdL98.js";
4
+ import { n as sha256, t as bytesToBase64Url } from "../sha256-D9ihqmvd.js";
5
+ import { t as anonymousSubject } from "../subject-BGoM5o8B.js";
6
+ import { i as linkPolicyViolation, r as capabilitySubject, s as redeemerAllows, t as capabilityFromClaims } from "../capability-N1K9IpqS.js";
7
+ import { a as verifierOptions, i as issuerFromDiscovery, n as assertSubjectConfig, o as decodeHeader, r as fail, s as normalizeTyp, t as joseTokenVerifier } from "../verifier-DHuh-okk.js";
8
+ import { t as loadJose } from "../load-jose-DZ4dnjri.js";
9
+ import { n as mapClaimsToSubject, r as validateCustomClaims, t as acceptMismatch } from "../map-claims-D3oRmTk0.js";
10
+ import { t as memoryReplayStore } from "../replay-Du1tJjG7.js";
11
+ //#region src/jwt/dpop.ts
12
+ const DPOP_WINDOW_SECONDS = 60;
13
+ const PROOF_ALGS = /* @__PURE__ */ new Set([
14
+ "ES256",
15
+ "PS256",
16
+ "Ed25519",
17
+ "EdDSA",
18
+ "RS256"
19
+ ]);
20
+ const PRIVATE_MEMBERS = [
21
+ "d",
22
+ "p",
23
+ "q",
24
+ "dp",
25
+ "dq",
26
+ "qi",
27
+ "k"
28
+ ];
29
+ function headerOf(request) {
30
+ return request.headers.get("DPoP") ?? request.headers.get("dpop");
31
+ }
32
+ function withoutQuery(value) {
33
+ if (typeof value !== "string" || !URL.canParse(value)) return null;
34
+ const url = new URL(value);
35
+ url.search = "";
36
+ url.hash = "";
37
+ return url.href;
38
+ }
39
+ async function claimJti(replay, key, expiresAt) {
40
+ if (replay.claim !== void 0) return replay.claim(key, expiresAt);
41
+ if (await replay.seen(key)) return false;
42
+ await replay.remember(key, expiresAt);
43
+ return true;
44
+ }
45
+ function verifyDpopProof(request, claims, accessToken, options = {}) {
46
+ return verify(request, claims, accessToken, options);
47
+ }
48
+ async function verify(request, claims, accessToken, options) {
49
+ const proof = headerOf(request);
50
+ if (proof === null || proof.length === 0) return {
51
+ ok: false,
52
+ cause: "dpop-proof-invalid"
53
+ };
54
+ const expectedJkt = claims["cnf"] !== null && typeof claims["cnf"] === "object" && !Array.isArray(claims["cnf"]) && typeof claims["cnf"].jkt === "string" ? claims["cnf"].jkt : void 0;
55
+ if (expectedJkt === void 0) return {
56
+ ok: false,
57
+ cause: "dpop-proof-invalid"
58
+ };
59
+ const header = decodeHeader(proof);
60
+ if (header?.typ?.toLowerCase() !== "dpop+jwt") return {
61
+ ok: false,
62
+ cause: "dpop-proof-invalid"
63
+ };
64
+ const jwk = header["jwk"];
65
+ if (!PROOF_ALGS.has(header.alg ?? "") || jwk === null || typeof jwk !== "object" || Array.isArray(jwk) || PRIVATE_MEMBERS.some((member) => member in jwk)) return {
66
+ ok: false,
67
+ cause: "dpop-proof-invalid"
68
+ };
69
+ try {
70
+ const jose = await loadJose();
71
+ const key = await jose.importJWK(jwk, header.alg);
72
+ const result = await jose.jwtVerify(proof, key, {
73
+ typ: "dpop+jwt",
74
+ maxTokenAge: DPOP_WINDOW_SECONDS
75
+ });
76
+ const jkt = await jose.calculateJwkThumbprint(jwk, "sha256");
77
+ if (jkt !== expectedJkt) return {
78
+ ok: false,
79
+ cause: "dpop-proof-invalid"
80
+ };
81
+ const htm = result.payload["htm"];
82
+ const htu = result.payload["htu"];
83
+ const expectedHtu = withoutQuery(request.url);
84
+ if (htm !== request.method || expectedHtu === null || withoutQuery(htu) !== expectedHtu) return {
85
+ ok: false,
86
+ cause: "dpop-proof-invalid"
87
+ };
88
+ if (accessToken !== void 0) {
89
+ const ath = bytesToBase64Url(sha256(accessToken));
90
+ if (result.payload["ath"] !== ath) return {
91
+ ok: false,
92
+ cause: "dpop-proof-invalid"
93
+ };
94
+ }
95
+ if (options.replay !== void 0) {
96
+ const jti = result.payload.jti;
97
+ const iat = result.payload.iat;
98
+ if (typeof jti !== "string" || jti === "" || typeof iat !== "number" || !await claimJti(options.replay, `dpop\u0000${jkt}\u0000${jti}`, iat + DPOP_WINDOW_SECONDS)) return {
99
+ ok: false,
100
+ cause: "dpop-proof-invalid"
101
+ };
102
+ }
103
+ return { ok: true };
104
+ } catch {
105
+ return {
106
+ ok: false,
107
+ cause: "dpop-proof-invalid"
108
+ };
109
+ }
110
+ }
111
+ //#endregion
10
112
  //#region src/jwt/capability.ts
11
113
  function emit(options, reason, cause, token) {
12
114
  if (options.onAuth === void 0) return;
@@ -44,10 +146,11 @@ async function stores(options, capability, issuedAt, once) {
44
146
  }
45
147
  }
46
148
  /**
47
- * Resolves a `permdock-capability+jwt` into the `link` subject it acts as.
149
+ * Resolves a `vnd.permdock.capability+jwt` into the `link` subject it acts as.
48
150
  * Every failure (signature, `typ`, `iss`, `aud`, expiry, a malformed claim,
49
151
  * a revoked link, a replayed one-time token, a redeemer the viewer does not
50
- * satisfy, a throwing store) is the anonymous subject, never a throw.
152
+ * satisfy, a `cnf` without a matching DPoP proof, a throwing store) is the
153
+ * anonymous subject, never a throw.
51
154
  */
52
155
  async function subjectFromCapability(token, options) {
53
156
  if (token === void 0 || token === null || token.length === 0) return anonymousSubject();
@@ -61,7 +164,7 @@ async function subjectFromCapability(token, options) {
61
164
  try {
62
165
  verifier = options.verifier ?? joseTokenVerifier({
63
166
  ...options,
64
- typ: "permdock-capability+jwt"
167
+ typ: "vnd.permdock.capability+jwt"
65
168
  });
66
169
  } catch {
67
170
  return deny("malformed");
@@ -69,7 +172,7 @@ async function subjectFromCapability(token, options) {
69
172
  let verified;
70
173
  try {
71
174
  verified = await verifier.verify(token, compact({
72
- typ: "permdock-capability+jwt",
175
+ typ: "vnd.permdock.capability+jwt",
73
176
  issuer: options.issuer,
74
177
  audience: options.audience,
75
178
  clockTolerance: options.clockTolerance
@@ -78,16 +181,14 @@ async function subjectFromCapability(token, options) {
78
181
  return deny("malformed");
79
182
  }
80
183
  if (!verified.ok) return deny(verified.cause);
81
- if (normalizeTyp(verified.header.typ) !== "permdock-capability+jwt") return deny("wrong-token-type");
82
- const parsed = parseCapability(verified.claims["capability"]);
83
- const exp = verified.claims.exp;
84
- if (parsed?.holder !== "link" || verified.claims.sub !== parsed.id || typeof exp !== "number") return deny("invalid-claims");
85
- const capability = {
86
- ...parsed,
87
- expiresAt: Math.min(parsed.expiresAt, exp)
88
- };
89
- const now = Date.now() / 1e3;
184
+ if (normalizeTyp(verified.header.typ) !== "vnd.permdock.capability+jwt") return deny("wrong-token-type");
185
+ const capability = capabilityFromClaims(verified.claims);
186
+ if (capability?.holder !== "link" || verified.claims["cnf"] !== void 0 && capability.cnf === void 0) return deny("invalid-claims");
187
+ const now = epochSeconds();
90
188
  if (capability.expiresAt <= now) return deny("expired");
189
+ if (capability.cnf !== void 0) {
190
+ if (!(options.request === void 0 ? { ok: false } : await verifyDpopProof(options.request, verified.claims, token, compact({ replay: options.replay }))).ok) return deny("dpop-proof-invalid");
191
+ }
91
192
  if (!redeemerAllows(capability.redeemer, options.viewer, now)) return deny("redeemer-mismatch");
92
193
  const jti = verified.claims["jti"];
93
194
  if (capability.once === true && (options.replay === void 0 || typeof jti !== "string" || jti === "")) return deny("invalid-claims");
@@ -217,107 +318,6 @@ async function subjectFromCiOidc(token, options) {
217
318
  });
218
319
  }
219
320
  //#endregion
220
- //#region src/jwt/dpop.ts
221
- const DPOP_WINDOW_SECONDS = 60;
222
- const PROOF_ALGS = /* @__PURE__ */ new Set([
223
- "ES256",
224
- "PS256",
225
- "Ed25519",
226
- "EdDSA",
227
- "RS256"
228
- ]);
229
- const PRIVATE_MEMBERS = [
230
- "d",
231
- "p",
232
- "q",
233
- "dp",
234
- "dq",
235
- "qi",
236
- "k"
237
- ];
238
- function headerOf(request) {
239
- return request.headers.get("DPoP") ?? request.headers.get("dpop");
240
- }
241
- function withoutQuery(value) {
242
- if (typeof value !== "string" || !URL.canParse(value)) return null;
243
- const url = new URL(value);
244
- url.search = "";
245
- url.hash = "";
246
- return url.href;
247
- }
248
- async function claimJti(replay, key, expiresAt) {
249
- if (replay.claim !== void 0) return replay.claim(key, expiresAt);
250
- if (await replay.seen(key)) return false;
251
- await replay.remember(key, expiresAt);
252
- return true;
253
- }
254
- function verifyDpopProof(request, claims, accessToken, options = {}) {
255
- return verify(request, claims, accessToken, options);
256
- }
257
- async function verify(request, claims, accessToken, options) {
258
- const proof = headerOf(request);
259
- if (proof === null || proof.length === 0) return {
260
- ok: false,
261
- cause: "dpop-proof-invalid"
262
- };
263
- const expectedJkt = claims["cnf"] !== null && typeof claims["cnf"] === "object" && !Array.isArray(claims["cnf"]) && typeof claims["cnf"].jkt === "string" ? claims["cnf"].jkt : void 0;
264
- if (expectedJkt === void 0) return {
265
- ok: false,
266
- cause: "dpop-proof-invalid"
267
- };
268
- const header = decodeHeader(proof);
269
- if (header?.typ?.toLowerCase() !== "dpop+jwt") return {
270
- ok: false,
271
- cause: "dpop-proof-invalid"
272
- };
273
- const jwk = header["jwk"];
274
- if (!PROOF_ALGS.has(header.alg ?? "") || jwk === null || typeof jwk !== "object" || Array.isArray(jwk) || PRIVATE_MEMBERS.some((member) => member in jwk)) return {
275
- ok: false,
276
- cause: "dpop-proof-invalid"
277
- };
278
- try {
279
- const jose = await loadJose();
280
- const key = await jose.importJWK(jwk, header.alg);
281
- const result = await jose.jwtVerify(proof, key, {
282
- typ: "dpop+jwt",
283
- maxTokenAge: DPOP_WINDOW_SECONDS
284
- });
285
- const jkt = await jose.calculateJwkThumbprint(jwk, "sha256");
286
- if (jkt !== expectedJkt) return {
287
- ok: false,
288
- cause: "dpop-proof-invalid"
289
- };
290
- const htm = result.payload["htm"];
291
- const htu = result.payload["htu"];
292
- const expectedHtu = withoutQuery(request.url);
293
- if (htm !== request.method || expectedHtu === null || withoutQuery(htu) !== expectedHtu) return {
294
- ok: false,
295
- cause: "dpop-proof-invalid"
296
- };
297
- if (accessToken !== void 0) {
298
- const ath = bytesToBase64Url(sha256(accessToken));
299
- if (result.payload["ath"] !== ath) return {
300
- ok: false,
301
- cause: "dpop-proof-invalid"
302
- };
303
- }
304
- if (options.replay !== void 0) {
305
- const jti = result.payload.jti;
306
- const iat = result.payload.iat;
307
- if (typeof jti !== "string" || jti === "" || typeof iat !== "number" || !await claimJti(options.replay, `dpop\u0000${jkt}\u0000${jti}`, iat + DPOP_WINDOW_SECONDS)) return {
308
- ok: false,
309
- cause: "dpop-proof-invalid"
310
- };
311
- }
312
- return { ok: true };
313
- } catch {
314
- return {
315
- ok: false,
316
- cause: "dpop-proof-invalid"
317
- };
318
- }
319
- }
320
- //#endregion
321
321
  //#region src/jwt/introspection.ts
322
322
  function emitAuth$1(options, cause) {
323
323
  if (options.onAuth === void 0) return;
@@ -426,6 +426,8 @@ function joseTokenSigner(options) {
426
426
  if (options.alg === "HS256" || options.alg === "EdDSA") throw new Error("PermDock: joseTokenSigner refuses HS* and polymorphic EdDSA on outputs.");
427
427
  if (!SIGNING_ALGS.has(options.alg)) throw new Error(`PermDock: unsupported signing alg '${options.alg}'.`);
428
428
  if (options.kid.length === 0) throw new Error("PermDock: joseTokenSigner requires kid.");
429
+ if (typeof options.issuer !== "string" || options.issuer.length === 0) throw new Error("PermDock: joseTokenSigner requires issuer.");
430
+ const issuer = options.issuer;
429
431
  const importKey = async () => {
430
432
  if (options.key instanceof Uint8Array) throw new TypeError("PermDock: HMAC keys cannot sign PermDock outputs.");
431
433
  return (await loadJose()).importJWK(options.key, options.alg);
@@ -441,20 +443,24 @@ function joseTokenSigner(options) {
441
443
  }
442
444
  };
443
445
  async function signJwt(payload, signOptions) {
446
+ const audience = signOptions.audience ?? options.audience;
447
+ if (audience === void 0 || audience.length === 0) throw new Error("PermDock: joseTokenSigner requires an audience.");
448
+ const issuedAt = signOptions.issuedAt ?? nowSeconds();
449
+ if (!Number.isSafeInteger(issuedAt)) throw new TypeError("PermDock: iat must be a whole NumericDate.");
444
450
  const jose = await loadJose();
445
451
  const key = await importKey();
446
- const now = Math.floor(Date.now() / 1e3);
447
- const jwt = new jose.SignJWT({ ...payload });
452
+ const { iss: _iss, aud: _aud, exp: _exp, iat: _iat, nbf: _nbf, jti: _jti, ...claims } = payload;
453
+ const jwt = new jose.SignJWT(claims);
448
454
  jwt.setProtectedHeader({
449
455
  alg: options.alg,
450
456
  kid: options.kid,
451
457
  typ: signOptions.typ
452
458
  });
453
- jwt.setIssuedAt(now);
454
- jwt.setJti(globalThis.crypto.randomUUID());
455
- if (options.issuer !== void 0) jwt.setIssuer(options.issuer);
456
- if (signOptions.audience !== void 0) jwt.setAudience(signOptions.audience);
457
- jwt.setExpirationTime(signOptions.expiresAt ?? now + 3600);
459
+ jwt.setIssuedAt(issuedAt);
460
+ jwt.setJti(signOptions.jti ?? globalThis.crypto.randomUUID());
461
+ jwt.setIssuer(issuer);
462
+ jwt.setAudience(audience);
463
+ jwt.setExpirationTime(signOptions.expiresAt ?? issuedAt + 3600);
458
464
  return jwt.sign(key);
459
465
  }
460
466
  }
@@ -484,6 +490,20 @@ function mtlsThumbprint(claims) {
484
490
  const value = cnf["x5t#S256"];
485
491
  return typeof value === "string" ? value : void 0;
486
492
  }
493
+ /**
494
+ * The sender constraint to enforce. Without a configured `sender`, a token
495
+ * whose `cnf` binds it to a key or a certificate is held to that binding,
496
+ * never accepted as a bearer token (RFC 9449 section 7.1, RFC 8705
497
+ * section 3). An explicit `sender: "none"` is the opt-out for a gateway
498
+ * that verified the binding upstream.
499
+ */
500
+ function senderFor(options, cnf) {
501
+ if (options.sender !== void 0) return options.sender;
502
+ if (options.profile === "fapi2") return "dpop";
503
+ if (cnf === null || typeof cnf !== "object" || Array.isArray(cnf)) return "none";
504
+ if (Object.hasOwn(cnf, "jkt")) return "dpop";
505
+ return Object.hasOwn(cnf, "x5t#S256") ? "mtls" : "none";
506
+ }
487
507
  async function extraMemberships(options, subject, tenant) {
488
508
  if (options.memberships === void 0 || subject.principal === null) return subject;
489
509
  try {
@@ -513,9 +533,9 @@ async function extraMemberships(options, subject, tenant) {
513
533
  function subjectFromJwt(token, options, request) {
514
534
  return resolveSubject(token, options, request);
515
535
  }
516
- function createJwtSubjectResolver(options) {
536
+ function jwtSubjectResolver(options) {
517
537
  assertSubjectConfig(options);
518
- const verifier = options.verifier ?? joseTokenVerifier(options);
538
+ const verifier = options.verifier ?? joseTokenVerifier(verifierOptions(options));
519
539
  return (token, request) => resolveSubject(token, {
520
540
  ...options,
521
541
  verifier
@@ -528,12 +548,13 @@ async function resolveSubject(token, options, request) {
528
548
  emitAuth(options, "token-in-query", token);
529
549
  return anonymousSubject();
530
550
  }
531
- const verifier = options.verifier ?? joseTokenVerifier(options);
551
+ const verifier = options.verifier ?? joseTokenVerifier(verifierOptions(options));
552
+ const audience = options.audience === false ? void 0 : options.audience;
532
553
  const issuer = options.issuer ?? (options.discovery === void 0 ? void 0 : issuerFromDiscovery(options.discovery));
533
554
  let verified;
534
555
  try {
535
556
  verified = await verifier.verify(token, compact({
536
- audience: options.audience,
557
+ audience,
537
558
  issuer,
538
559
  clockTolerance: options.clockTolerance,
539
560
  typ: options.accept === "id-token" ? ["JWT"] : options.profile === "fapi2" ? "at+jwt" : ["at+jwt", "JWT"]
@@ -545,13 +566,13 @@ async function resolveSubject(token, options, request) {
545
566
  emitAuth(options, verified.cause, token);
546
567
  return anonymousSubject();
547
568
  }
548
- if (acceptMismatch(verified.claims, verified.header.typ, options, options.audience)) {
569
+ if (acceptMismatch(verified.claims, verified.header.typ, options, audience)) {
549
570
  emitAuth(options, "wrong-token-type", token);
550
571
  return anonymousSubject();
551
572
  }
552
- const sender = options.sender ?? (options.profile === "fapi2" ? "dpop" : "none");
553
573
  const cnf = verified.claims["cnf"];
554
574
  const hasCnf = cnf !== null && typeof cnf === "object";
575
+ const sender = senderFor(options, cnf);
555
576
  if (options.profile === "fapi2" && !hasCnf) {
556
577
  emitAuth(options, "sender-constraint-required", token);
557
578
  return anonymousSubject();
@@ -587,4 +608,4 @@ async function resolveSubject(token, options, request) {
587
608
  return extraMemberships(options, mapped.subject, mapped.subject.principal.tenant);
588
609
  }
589
610
  //#endregion
590
- export { createJwtSubjectResolver, joseTokenSigner, joseTokenVerifier, memoryReplayStore, subjectFromCapability, subjectFromCiOidc, subjectFromIntrospection, subjectFromJwt, verifyDpopProof };
611
+ export { joseTokenSigner, joseTokenVerifier, jwtSubjectResolver, memoryReplayStore, subjectFromCapability, subjectFromCiOidc, subjectFromIntrospection, subjectFromJwt, verifyDpopProof };