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
@@ -0,0 +1,566 @@
1
+ import { r as isRecord, t as compact } from "./compact-CAf557ZB.js";
2
+ import { n as freezeDeep } from "./freeze-CrU8nQeX.js";
3
+ import { r as validateRecord } from "./thenable-yD7SabqG.js";
4
+ import { t as anonymousSubject } from "./subject-BGoM5o8B.js";
5
+ import { t as readClaim } from "./claims-map-7oQ3ue4X.js";
6
+ import { t as clientNameOf } from "./clients-DjU5ABMy.js";
7
+ import "./budget-NbEtbJC_.js";
8
+ import { a as hookApiNames } from "./sources-vs5dGOsS.js";
9
+ //#region src/supabase/subject.ts
10
+ const REGISTERED = /* @__PURE__ */ new Set([
11
+ "sub",
12
+ "role",
13
+ "iss",
14
+ "aud",
15
+ "exp",
16
+ "iat",
17
+ "nbf",
18
+ "aal",
19
+ "amr",
20
+ "acr",
21
+ "session_id",
22
+ "email",
23
+ "phone",
24
+ "is_anonymous",
25
+ "app_metadata",
26
+ "user_metadata",
27
+ "act",
28
+ "client_id",
29
+ "scope"
30
+ ]);
31
+ /** Top-level first, then `app_metadata`. `null` counts as absent: the RBAC hook writes `null` for a user with no role row. */
32
+ function claimNamed(claims, name) {
33
+ const top = Object.hasOwn(claims, name) ? claims[name] : void 0;
34
+ if (top !== void 0 && top !== null) return top;
35
+ const meta = claims["app_metadata"];
36
+ if (isRecord(meta) && Object.hasOwn(meta, name)) return meta[name] ?? void 0;
37
+ }
38
+ /** A `ClaimPath`: a name read at the top level, then in `app_metadata`; or a function over the claims. */
39
+ function claimAt(claims, path) {
40
+ return typeof path === "string" ? claimNamed(claims, path) : readClaim(claims, path);
41
+ }
42
+ function asRoles(value, declared) {
43
+ const raw = typeof value === "string" ? value === "" ? [] : [value] : Array.isArray(value) ? value.filter((item) => typeof item === "string") : [];
44
+ if (declared === void 0) return raw;
45
+ const allowed = new Set(declared);
46
+ return raw.filter((role) => allowed.has(role));
47
+ }
48
+ /** Reads the `memberships` claim; an entry it cannot read is dropped and its index reported. */
49
+ function readMemberships(value) {
50
+ if (!Array.isArray(value)) return {
51
+ memberships: [],
52
+ dropped: []
53
+ };
54
+ const out = [];
55
+ const dropped = [];
56
+ for (const [index, item] of value.entries()) {
57
+ const membership = asMembership(item);
58
+ if (membership === void 0) dropped.push(index);
59
+ else out.push(membership);
60
+ }
61
+ return {
62
+ memberships: out,
63
+ dropped
64
+ };
65
+ }
66
+ function asMembership(item) {
67
+ if (!isRecord(item) || !Array.isArray(item["roles"])) return;
68
+ const roles = item["roles"].filter((role) => typeof role === "string");
69
+ if (roles.length === 0) return;
70
+ const scope = typeof item["scope"] === "string" ? item["scope"] : void 0;
71
+ const id = typeof item["id"] === "string" ? item["id"] : void 0;
72
+ const within = isRecord(item["within"]) ? Object.fromEntries(Object.entries(item["within"]).filter((entry) => typeof entry[1] === "string")) : void 0;
73
+ const tenant = typeof item["tenant"] === "string" ? item["tenant"] : void 0;
74
+ const team = typeof item["team"] === "string" ? item["team"] : void 0;
75
+ const onRecord = isRecord(item["on"]) ? item["on"] : void 0;
76
+ const on = onRecord !== void 0 && typeof onRecord["resource"] === "string" && typeof onRecord["id"] === "string" ? {
77
+ resource: onRecord["resource"],
78
+ id: onRecord["id"]
79
+ } : void 0;
80
+ if ((scope === void 0 || id === void 0) && tenant === void 0 && team === void 0 && on === void 0) return;
81
+ const keep = item["keep"];
82
+ if (keep !== void 0 && (!Array.isArray(keep) || !keep.every((key) => typeof key === "string" && key !== ""))) return;
83
+ return compact({
84
+ roles,
85
+ scope,
86
+ id,
87
+ within,
88
+ tenant,
89
+ team,
90
+ on,
91
+ via: typeof item["via"] === "string" ? item["via"] : void 0,
92
+ expiresAt: typeof item["expires_at"] === "number" ? item["expires_at"] : void 0,
93
+ grantedBy: typeof item["granted_by"] === "string" ? item["granted_by"] : void 0,
94
+ reason: typeof item["reason"] === "string" ? item["reason"] : void 0,
95
+ member: memberOf(item["member"]),
96
+ managedBy: item["managed_by"] === "idp" ? "idp" : void 0,
97
+ entitlements: Array.isArray(item["entitlements"]) ? item["entitlements"].filter((seat) => typeof seat === "string") : void 0,
98
+ keep: keep === void 0 ? void 0 : asStrings(keep)
99
+ });
100
+ }
101
+ function memberOf(value) {
102
+ if (value === null || typeof value !== "object" || !Object.hasOwn(value, "group")) return;
103
+ const group = value.group;
104
+ return typeof group === "string" && group !== "" ? { group } : void 0;
105
+ }
106
+ function asStrings(value) {
107
+ return Array.isArray(value) ? value.filter((item) => typeof item === "string") : [];
108
+ }
109
+ /** `claims[plans][tenant]`: only the active tenant's entry, never another tenant's. */
110
+ function plansFor(claims, name, tenant) {
111
+ if (name === void 0 || tenant === void 0) return [];
112
+ const byTenant = claimAt(claims, name);
113
+ if (!isRecord(byTenant) || !Object.hasOwn(byTenant, tenant)) return [];
114
+ return asStrings(byTenant[tenant]);
115
+ }
116
+ const INVALID_CHAIN = Object.freeze({
117
+ ok: false,
118
+ reason: "invalid-chain"
119
+ });
120
+ const NO_ACTOR = Object.freeze({ ok: true });
121
+ /** Own entries of one `act` level, with the nested `act` copied the same way. */
122
+ function copyAct(level) {
123
+ const entries = Object.entries(level).map(([key, value]) => [key, key === "act" && isRecord(value) ? copyAct(value) : value]);
124
+ return Object.fromEntries(entries);
125
+ }
126
+ function isToolList(value) {
127
+ return Array.isArray(value) && value.every((tool) => typeof tool === "string" && tool !== "");
128
+ }
129
+ /**
130
+ * The outer `act` level by its `kind`, the marker a support tool writes: none is an OAuth client
131
+ * or agent chain, `support` a support session (with `session_id`), `impersonation` an admin acting
132
+ * as the user, `agent` an agent run with the `tools` it may call. Any other `kind`, a support level
133
+ * without `session_id`, and an agent level with `session_id`, `tools` that are not non-empty
134
+ * strings or a `read_only` that is not a boolean are invalid, as better-supabase reads them.
135
+ */
136
+ function actingParty(outer, id) {
137
+ const marked = Object.hasOwn(outer, "kind") ? outer["kind"] : void 0;
138
+ const kind = marked === void 0 && Object.hasOwn(outer, "session_id") ? "support" : marked;
139
+ const chain = copyAct(outer);
140
+ const reason = typeof outer["reason"] === "string" ? outer["reason"] : void 0;
141
+ switch (kind) {
142
+ case void 0: return freezeDeep({
143
+ ok: true,
144
+ actor: {
145
+ id,
146
+ kind: "oauth-client",
147
+ chain
148
+ }
149
+ });
150
+ case "support": {
151
+ const session = outer["session_id"];
152
+ const readOnly = Object.hasOwn(outer, "read_only") ? outer["read_only"] : true;
153
+ if (typeof session !== "string" || session === "" || typeof readOnly !== "boolean") return INVALID_CHAIN;
154
+ return freezeDeep({
155
+ ok: true,
156
+ actor: compact({
157
+ id,
158
+ kind: "support",
159
+ sessionId: session,
160
+ readOnly,
161
+ reason,
162
+ chain
163
+ })
164
+ });
165
+ }
166
+ case "impersonation": return freezeDeep({
167
+ ok: true,
168
+ actor: compact({
169
+ id,
170
+ kind: "impersonation",
171
+ reason,
172
+ chain
173
+ })
174
+ });
175
+ case "agent": {
176
+ const tools = Object.hasOwn(outer, "tools") ? outer["tools"] : void 0;
177
+ const readOnly = Object.hasOwn(outer, "read_only") ? outer["read_only"] : false;
178
+ if (Object.hasOwn(outer, "session_id") || tools !== void 0 && !isToolList(tools) || typeof readOnly !== "boolean") return INVALID_CHAIN;
179
+ return freezeDeep({
180
+ ok: true,
181
+ actor: compact({
182
+ id,
183
+ kind: "agent",
184
+ tools,
185
+ readOnly,
186
+ chain
187
+ })
188
+ });
189
+ }
190
+ default: return INVALID_CHAIN;
191
+ }
192
+ }
193
+ function readActor(claims) {
194
+ if (Object.hasOwn(claims, "act") && claims["act"] !== void 0) {
195
+ let current = claims["act"];
196
+ while (current !== void 0) {
197
+ const level = isRecord(current) ? current["sub"] : void 0;
198
+ if (!isRecord(current) || typeof level !== "string" || level === "") return INVALID_CHAIN;
199
+ current = Object.hasOwn(current, "act") ? current["act"] : void 0;
200
+ }
201
+ const outer = claims["act"];
202
+ const sub = isRecord(outer) ? outer["sub"] : void 0;
203
+ if (!isRecord(outer) || typeof sub !== "string") return INVALID_CHAIN;
204
+ return actingParty(outer, sub);
205
+ }
206
+ const client = Object.hasOwn(claims, "client_id") ? claims["client_id"] : void 0;
207
+ if (typeof client === "string" && client !== "") return freezeDeep({
208
+ ok: true,
209
+ actor: {
210
+ id: client,
211
+ kind: "oauth-client"
212
+ }
213
+ });
214
+ return NO_ACTOR;
215
+ }
216
+ /**
217
+ * Who acts for the user: the outermost `sub` of an RFC 8693 `act` chain (the current
218
+ * actor; nested levels are prior actors, kept on `chain` for audit), else the
219
+ * OAuth `client_id` of a third-party app. The outer level's `kind` names the actor:
220
+ * none is `oauth-client`, `support` a support session, `impersonation` an admin acting as the
221
+ * user. Reads only `act` and `client_id`; the caller applies the role rule first (`anon` and
222
+ * `service_role` are anonymous and carry no actor). An `act` that is not a chain of objects each
223
+ * with a non-empty `sub`, that names another `kind`, or a support level without `session_id`,
224
+ * is `{ ok: false }` and must deny.
225
+ */
226
+ function actorOf(claims) {
227
+ try {
228
+ return isRecord(claims) ? readActor(claims) : NO_ACTOR;
229
+ } catch {
230
+ return INVALID_CHAIN;
231
+ }
232
+ }
233
+ const IDENTITY_SCOPES = /* @__PURE__ */ new Set([
234
+ "openid",
235
+ "profile",
236
+ "email",
237
+ "address",
238
+ "phone",
239
+ "offline_access"
240
+ ]);
241
+ /**
242
+ * The OAuth `scope` claim (a space-separated string or a list) as `scopes`,
243
+ * without the OpenID Connect identity scopes; `undefined` when none is left.
244
+ */
245
+ function delegationOf(claims) {
246
+ try {
247
+ if (!isRecord(claims) || !Object.hasOwn(claims, "scope")) return;
248
+ const scope = claims["scope"];
249
+ const scopes = (typeof scope === "string" ? scope.split(/\s+/u).filter(Boolean) : asStrings(scope)).filter((name) => !IDENTITY_SCOPES.has(name));
250
+ return scopes.length > 0 ? freezeDeep({ scopes }) : void 0;
251
+ } catch {
252
+ return;
253
+ }
254
+ }
255
+ function subjectDelegation(claims, chain) {
256
+ const delegation = compact({
257
+ scopes: delegationOf(claims)?.scopes,
258
+ chain
259
+ });
260
+ return Object.keys(delegation).length === 0 ? void 0 : delegation;
261
+ }
262
+ function emit(options, reason, cause) {
263
+ try {
264
+ options.onAuth?.({
265
+ reason,
266
+ cause,
267
+ source: "supabase"
268
+ });
269
+ } catch {}
270
+ }
271
+ function extraClaims(claims) {
272
+ const extra = {};
273
+ const meta = claims["app_metadata"];
274
+ if (isRecord(meta)) for (const [key, value] of Object.entries(meta)) extra[key] = value;
275
+ for (const [key, value] of Object.entries(claims)) {
276
+ if (REGISTERED.has(key) || key === "user_metadata") continue;
277
+ extra[key] = value;
278
+ }
279
+ return extra;
280
+ }
281
+ function subjectActor(actor, options) {
282
+ switch (actor.kind) {
283
+ case "support": return {
284
+ id: actor.id,
285
+ kind: actor.kind,
286
+ sessionId: actor.sessionId,
287
+ readOnly: actor.readOnly
288
+ };
289
+ case "oauth-client": return compact({
290
+ id: actor.id,
291
+ kind: actor.kind,
292
+ client: clientNameOf(options.clients, actor.id)
293
+ });
294
+ case "impersonation": return {
295
+ id: actor.id,
296
+ kind: actor.kind
297
+ };
298
+ case "agent": return compact({
299
+ id: actor.id,
300
+ kind: actor.kind,
301
+ tools: actor.tools,
302
+ readOnly: actor.readOnly
303
+ });
304
+ default: return actor;
305
+ }
306
+ }
307
+ function mapClaims(claims, options) {
308
+ const role = claims["role"];
309
+ if (role === "anon" || role === "service_role") return anonymousSubject();
310
+ const id = claims["sub"];
311
+ if (typeof id !== "string" || id === "") return anonymousSubject();
312
+ const act = readActor(claims);
313
+ if (!act.ok) {
314
+ emit(options, "invalid-token", act.reason);
315
+ return anonymousSubject();
316
+ }
317
+ if (options.anonymousSignIns === "deny" && claims["is_anonymous"] === true) return anonymousSubject();
318
+ const actor = act.actor === void 0 ? void 0 : subjectActor(act.actor, options);
319
+ const roleClaim = options.claims?.roles ?? "user_role";
320
+ const tenantClaim = options.claims?.tenant ?? "tenant_id";
321
+ const membershipsClaim = options.claims?.memberships ?? "memberships";
322
+ let extra = extraClaims(claims);
323
+ if (options.schema !== void 0) extra = validateRecord(options.schema, extra) ?? {};
324
+ const include = new Set(options.include ?? []);
325
+ const tenantValue = claimAt(claims, tenantClaim);
326
+ const version = claimAt(claims, "authz_ver");
327
+ const tenant = typeof tenantValue === "string" ? tenantValue : void 0;
328
+ const { memberships, dropped } = readMemberships(claimAt(claims, membershipsClaim));
329
+ if (dropped.length > 0) emit(options, "schema", "membership-dropped");
330
+ const plans = plansFor(claims, options.claims?.plans, tenant);
331
+ const principal = compact({
332
+ id,
333
+ kind: "user",
334
+ roles: asRoles(claimAt(claims, roleClaim), options.declared),
335
+ tenant,
336
+ plans: plans.length > 0 ? plans : void 0,
337
+ memberships,
338
+ membershipsTruncated: claimAt(claims, "memberships_truncated") === true ? true : void 0,
339
+ authzVersion: typeof version === "number" && Number.isInteger(version) ? version : void 0,
340
+ issuer: typeof claims["iss"] === "string" ? claims["iss"] : void 0,
341
+ assurance: typeof claims["aal"] === "string" ? { acr: claims["aal"] } : void 0,
342
+ claims: Object.keys(extra).length === 0 ? void 0 : extra,
343
+ email: include.has("email") && typeof claims["email"] === "string" ? claims["email"] : void 0,
344
+ phone: include.has("phone") && typeof claims["phone"] === "string" ? claims["phone"] : void 0,
345
+ is_anonymous: include.has("is_anonymous") && typeof claims["is_anonymous"] === "boolean" ? claims["is_anonymous"] : void 0
346
+ });
347
+ const session = typeof claims["session_id"] === "string" ? claims["session_id"] : void 0;
348
+ const expiresAt = typeof claims["exp"] === "number" ? claims["exp"] : void 0;
349
+ return freezeDeep(compact({
350
+ principal,
351
+ actor,
352
+ delegation: act.actor?.kind === "oauth-client" || act.actor?.kind === "agent" ? subjectDelegation(claims, act.actor.chain) : void 0,
353
+ context: {},
354
+ session,
355
+ expiresAt,
356
+ liveSession: options.liveSession === true && session !== void 0 ? true : void 0
357
+ }));
358
+ }
359
+ function subjectFromSupabase(claims, options = {}) {
360
+ try {
361
+ if (!isRecord(claims)) return anonymousSubject();
362
+ const rest = {};
363
+ for (const [key, value] of Object.entries(claims)) {
364
+ if (key === "user_metadata") continue;
365
+ rest[key] = value;
366
+ }
367
+ return mapClaims(rest, options);
368
+ } catch {
369
+ return anonymousSubject();
370
+ }
371
+ }
372
+ /**
373
+ * A verified session object (`{ kind, claims }`) in, `Subject` out.
374
+ * Only `kind: 'user'` sessions map; `anon`, `service`, `invalid` and anything else are anonymous.
375
+ */
376
+ function subjectFromSupabaseSession(session, options = {}) {
377
+ try {
378
+ if (session === null || session === void 0 || session.kind !== "user") return anonymousSubject();
379
+ return subjectFromSupabase(session.claims, options);
380
+ } catch {
381
+ return anonymousSubject();
382
+ }
383
+ }
384
+ //#endregion
385
+ //#region src/supabase/postgrest.ts
386
+ function callRpc(client, schema, fn, args) {
387
+ return client.schema(schema).rpc(fn, args);
388
+ }
389
+ function strings(value) {
390
+ return Array.isArray(value) ? value.filter((item) => typeof item === "string") : [];
391
+ }
392
+ function grantOf(value) {
393
+ if (!isRecord(value) || typeof value["permission"] !== "string") return;
394
+ return compact({
395
+ permission: value["permission"],
396
+ effect: value["effect"] === "deny" ? "deny" : "allow",
397
+ level: typeof value["level"] === "string" ? value["level"] : void 0
398
+ });
399
+ }
400
+ function customRoleOf(value) {
401
+ if (!isRecord(value) || typeof value["name"] !== "string") return;
402
+ const grants = Array.isArray(value["grants"]) ? value["grants"].flatMap((item) => {
403
+ const grant = grantOf(item);
404
+ return grant === void 0 ? [] : [grant];
405
+ }) : [];
406
+ const includes = strings(value["includes"]);
407
+ const body = {
408
+ name: value["name"],
409
+ grants,
410
+ ...includes.length === 0 ? {} : { includes }
411
+ };
412
+ if (value["scope"] === "global") return value["tenant"] === void 0 ? {
413
+ ...body,
414
+ scope: "global"
415
+ } : void 0;
416
+ if (typeof value["tenant"] !== "string") return;
417
+ return compact({
418
+ ...body,
419
+ tenant: value["tenant"],
420
+ scope: typeof value["scope"] === "string" ? value["scope"] : void 0,
421
+ id: typeof value["id"] === "string" ? value["id"] : void 0
422
+ });
423
+ }
424
+ function readMemberEntries(value) {
425
+ if (!Array.isArray(value)) return [];
426
+ return value.flatMap((item) => {
427
+ if (!isRecord(item) || !isRecord(item["principal"])) return [];
428
+ const id = item["principal"]["id"];
429
+ const [membership] = readMemberships([item["membership"]]).memberships;
430
+ return typeof id === "string" && id !== "" && membership !== void 0 ? [{
431
+ principal: { id },
432
+ membership
433
+ }] : [];
434
+ });
435
+ }
436
+ function versionOf(value) {
437
+ const version = typeof value === "string" ? Number(value) : value;
438
+ return typeof version === "number" && Number.isFinite(version) ? version : void 0;
439
+ }
440
+ /** Reads `subject_for`'s JSON; anything it cannot read is left out, and a malformed record is no record. */
441
+ function readSubjectRecord(value) {
442
+ if (!isRecord(value) || typeof value["id"] !== "string") return;
443
+ if (value["active"] !== true) return {
444
+ id: value["id"],
445
+ active: false,
446
+ roles: [],
447
+ memberships: [],
448
+ customRoles: []
449
+ };
450
+ const version = value["authzVersion"];
451
+ return compact({
452
+ id: value["id"],
453
+ active: true,
454
+ roles: strings(value["roles"]),
455
+ memberships: readMemberships(value["memberships"]).memberships,
456
+ customRoles: Array.isArray(value["customRoles"]) ? value["customRoles"].flatMap((item) => {
457
+ const role = customRoleOf(item);
458
+ return role === void 0 ? [] : [role];
459
+ }) : [],
460
+ authzVersion: typeof version === "number" && Number.isFinite(version) ? version : void 0
461
+ });
462
+ }
463
+ /**
464
+ * Membership, custom-role and subject sources over the `subject_for(p_user)`,
465
+ * `authz_version_for(p_user)` and `members_of(p_scope, p_id)` functions
466
+ * `permdock supabase hook generate` writes, for a backend that reaches
467
+ * Postgres only through PostgREST. `memberships.version` reads only the
468
+ * version, so `claimsFirst` with `onStale: 'reread'` reads the full subject
469
+ * only for a stale token; when the version function is missing it falls back
470
+ * to `subject_for`. With `policy`, a token that claims a custom role has its
471
+ * subject read in one `subject_for` call instead, and custom roles are read
472
+ * only for a subject that holds one. Each user and each instance is read once per
473
+ * `postgrestSources` call, so create it per request or per job.
474
+ */
475
+ function postgrestSources(client, options = {}) {
476
+ const api = options.api;
477
+ const names = api === void 0 ? void 0 : hookApiNames(api.prefix);
478
+ const schema = options.schema ?? (api === void 0 ? "permdock" : api.schema ?? "public");
479
+ const fn = options.fn ?? names?.subjectFor ?? "subject_for";
480
+ const membersFn = options.membersFn ?? names?.membersOf ?? "members_of";
481
+ const versionFn = options.versionFn ?? names?.authzVersionFor ?? "authz_version_for";
482
+ const declared = options.policy === void 0 ? void 0 : options.policy.index.declaredRoles;
483
+ const onlyDeclared = (held) => declared !== void 0 && held?.every((name) => declared.has(name)) === true;
484
+ const loaded = /* @__PURE__ */ new Map();
485
+ const versions = /* @__PURE__ */ new Map();
486
+ const listed = /* @__PURE__ */ new Map();
487
+ const list = (query) => {
488
+ const key = JSON.stringify([query.scope, query.id]);
489
+ const cached = listed.get(key);
490
+ if (cached !== void 0) return cached.then((entries) => [...entries]);
491
+ const pending = Promise.resolve(callRpc(client, schema, membersFn, {
492
+ p_scope: query.scope,
493
+ p_id: query.id
494
+ })).then((result) => {
495
+ if (result.error !== null) throw new Error(`PermDock: ${schema}.${membersFn} failed: ${result.error.message}`);
496
+ return readMemberEntries(result.data);
497
+ });
498
+ listed.set(key, pending);
499
+ return pending.then((entries) => [...entries]);
500
+ };
501
+ const record = (userId) => {
502
+ const cached = loaded.get(userId);
503
+ if (cached !== void 0) return cached;
504
+ const pending = Promise.resolve(callRpc(client, schema, fn, { p_user: userId })).then((result) => {
505
+ if (result.error !== null) throw new Error(`PermDock: ${schema}.${fn} failed: ${result.error.message}`);
506
+ return readSubjectRecord(result.data);
507
+ });
508
+ loaded.set(userId, pending);
509
+ return pending;
510
+ };
511
+ const version = (userId) => {
512
+ const read = loaded.get(userId);
513
+ if (read !== void 0) return read.then((found) => found?.authzVersion);
514
+ const cached = versions.get(userId);
515
+ if (cached !== void 0) return cached;
516
+ const pending = Promise.resolve(callRpc(client, schema, versionFn, { p_user: userId })).then((result) => result.error === null ? versionOf(result.data) : record(userId).then((found) => found?.authzVersion));
517
+ versions.set(userId, pending);
518
+ return pending;
519
+ };
520
+ const live = async (userId) => {
521
+ const found = await record(userId);
522
+ return found?.active === true ? found : void 0;
523
+ };
524
+ return {
525
+ memberships: {
526
+ async membershipsFor(principal) {
527
+ return [...(await live(principal.id))?.memberships ?? []];
528
+ },
529
+ version(principal) {
530
+ return declared !== void 0 && !onlyDeclared([...principal.roles ?? [], ...(principal.memberships ?? []).flatMap((membership) => membership.roles)]) ? record(principal.id).then((found) => found?.authzVersion) : version(principal.id);
531
+ },
532
+ list
533
+ },
534
+ customRoles(principal) {
535
+ return {
536
+ async rolesFor(tenant, context) {
537
+ if (onlyDeclared(context?.held)) return [];
538
+ return ((await live(principal.id))?.customRoles ?? []).filter((role) => role.tenant === tenant);
539
+ },
540
+ async globalRoles(context) {
541
+ if (onlyDeclared(context?.held)) return [];
542
+ return ((await live(principal.id))?.customRoles ?? []).filter((role) => role.scope === "global");
543
+ }
544
+ };
545
+ },
546
+ async subject(userId) {
547
+ const found = await live(userId);
548
+ if (found === void 0) return {
549
+ principal: null,
550
+ context: {}
551
+ };
552
+ return {
553
+ principal: compact({
554
+ id: found.id,
555
+ roles: found.roles,
556
+ memberships: found.memberships,
557
+ authzVersion: found.authzVersion
558
+ }),
559
+ context: {}
560
+ };
561
+ },
562
+ record
563
+ };
564
+ }
565
+ //#endregion
566
+ export { delegationOf as a, subjectFromSupabaseSession as c, actorOf as i, postgrestSources as n, readMemberships as o, readSubjectRecord as r, subjectFromSupabase as s, callRpc as t };
@@ -0,0 +1,100 @@
1
+ import { $ as MemberEntry, T as Policy, W as CustomRoleSource, Zn as CustomRole, et as MembershipSource, ir as Subject, nr as Membership } from "./policy-types-DzwivBgR.js";
2
+ //#region src/supabase/postgrest.d.ts
3
+ /** What a supabase-js `rpc` call resolves to: `data` or an `error` with a message. */
4
+ type SupabaseRpcResult = {
5
+ readonly data: unknown;
6
+ readonly error: {
7
+ readonly message: string;
8
+ } | null;
9
+ };
10
+ /**
11
+ * The part of a supabase-js client `postgrestSources` calls:
12
+ * `client.schema(name).rpc(fn, args)`. Pass a client that may execute the
13
+ * function, such as a `service_role` client after the grant the docs show.
14
+ */
15
+ type SupabaseRpcClient = {
16
+ schema(name: string): {
17
+ rpc(fn: string, args: Readonly<Record<string, unknown>>): PromiseLike<SupabaseRpcResult>;
18
+ };
19
+ };
20
+ type SupabaseRpcCaller = {
21
+ schema(name: never): {
22
+ rpc(fn: never, args: never): PromiseLike<SupabaseRpcResult>;
23
+ };
24
+ };
25
+ type PostgrestSourcesOptions = {
26
+ /**
27
+ * The `supabase.hook.api` setting the hook file was generated with: the
28
+ * wrappers live in `schema` (default `public`) as `<prefix>subject_for`,
29
+ * `<prefix>members_of` and `<prefix>authz_version_for` (default prefix
30
+ * `permdock_`). It sets the defaults of `schema`, `fn`, `membersFn` and
31
+ * `versionFn`, which still override it.
32
+ */
33
+ readonly api?: {
34
+ readonly schema?: string;
35
+ readonly prefix?: string;
36
+ };
37
+ /** Schema of the functions. Default `permdock`, where the hook generates `subject_for` and `members_of`. */
38
+ readonly schema?: string;
39
+ /** Function name, for a wrapper in an exposed schema. Default `subject_for`. */
40
+ readonly fn?: string;
41
+ readonly membersFn?: string;
42
+ /** The version-only function `memberships.version` calls. Default `authz_version_for`. */
43
+ readonly versionFn?: string;
44
+ /**
45
+ * The policy whose declared roles tell custom roles apart. With it,
46
+ * `customRoles` reads nothing while every role the subject holds is
47
+ * declared, and `memberships.version` reads the whole subject in one call
48
+ * when the token claims a custom role, which the custom roles need anyway.
49
+ */
50
+ readonly policy?: Policy;
51
+ };
52
+ /** One user as `subject_for(p_user)` returns it. */
53
+ type SubjectRecord = {
54
+ readonly id: string;
55
+ /** `false` for a suspended user, who holds no roles or memberships. */
56
+ readonly active: boolean;
57
+ readonly roles: readonly string[];
58
+ readonly memberships: readonly Membership[];
59
+ readonly customRoles: readonly CustomRole[];
60
+ readonly authzVersion?: number;
61
+ };
62
+ type PostgrestSources = {
63
+ /**
64
+ * Memberships and the authorization version of any principal, and `list`,
65
+ * the live members of one scope instance through `members_of`, for
66
+ * `countHolders` and `whoCan`. Wrap it in `claimsFirst` to read only when
67
+ * the token was truncated.
68
+ */
69
+ readonly memberships: MembershipSource & {
70
+ list(query: {
71
+ readonly scope: string;
72
+ readonly id: string;
73
+ }): Promise<MemberEntry[]>;
74
+ };
75
+ /** The custom roles `principal` holds, for `createPermDock`'s `customRoles`. */
76
+ customRoles(principal: {
77
+ readonly id: string;
78
+ }): CustomRoleSource;
79
+ /** The subject the hook would mint for `userId`: anonymous when the user is unknown or suspended. */
80
+ subject(userId: string): Promise<Subject>;
81
+ /** The raw record, `undefined` for an unknown user. */
82
+ record(userId: string): Promise<SubjectRecord | undefined>;
83
+ };
84
+ /** Reads `subject_for`'s JSON; anything it cannot read is left out, and a malformed record is no record. */
85
+ declare function readSubjectRecord(value: unknown): SubjectRecord | undefined;
86
+ /**
87
+ * Membership, custom-role and subject sources over the `subject_for(p_user)`,
88
+ * `authz_version_for(p_user)` and `members_of(p_scope, p_id)` functions
89
+ * `permdock supabase hook generate` writes, for a backend that reaches
90
+ * Postgres only through PostgREST. `memberships.version` reads only the
91
+ * version, so `claimsFirst` with `onStale: 'reread'` reads the full subject
92
+ * only for a stale token; when the version function is missing it falls back
93
+ * to `subject_for`. With `policy`, a token that claims a custom role has its
94
+ * subject read in one `subject_for` call instead, and custom roles are read
95
+ * only for a subject that holds one. Each user and each instance is read once per
96
+ * `postgrestSources` call, so create it per request or per job.
97
+ */
98
+ declare function postgrestSources(client: SupabaseRpcCaller, options?: PostgrestSourcesOptions): PostgrestSources;
99
+ //#endregion
100
+ export { SupabaseRpcClient as a, readSubjectRecord as c, SupabaseRpcCaller as i, PostgrestSourcesOptions as n, SupabaseRpcResult as o, SubjectRecord as r, postgrestSources as s, PostgrestSources as t };