permdock 0.6.0 → 0.8.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 (507) hide show
  1. package/README.md +2 -3
  2. package/dist/{2020-C9VN-x8c.js → 2020-CJbO8Bvz.js} +1 -3
  3. package/dist/a2a/index.d.ts +7 -7
  4. package/dist/a2a/index.js +9 -9
  5. package/dist/action-result-CL-QCITA.d.ts +19 -0
  6. package/dist/{adapter-context-CRhqyzCk.js → adapter-context-CIQpQxbE.js} +8 -2
  7. package/dist/{adoption-scan-DCYe60Pi.js → adoption-scan-BLs67P1l.js} +5 -5
  8. package/dist/agent/index.d.ts +3 -3
  9. package/dist/agent/index.js +1 -1
  10. package/dist/ai-sdk/index.d.ts +31 -10
  11. package/dist/ai-sdk/index.js +22 -12
  12. package/dist/{app-data-MuyzVqX8.js → app-data-UNNm07jV.js} +10 -7
  13. package/dist/{approval-header-CJACtHkv.js → approval-header-8QV6MU4H.js} +6 -3
  14. package/dist/{approval-prompt-Dg5LeAcT.js → approval-prompt-B8hQY69x.js} +5 -6
  15. package/dist/{approval-prompt-DvSSPQJX.d.ts → approval-prompt-PYagyQUj.d.ts} +13 -11
  16. package/dist/approvals/index.d.ts +5 -5
  17. package/dist/approvals/index.js +7 -7
  18. package/dist/{approvals-p1PGoVjb.js → approvals-DnIBTuXE.js} +128 -78
  19. package/dist/{approvers-CqPOLD-o.js → approvers-B4r0N_Uz.js} +8 -2
  20. package/dist/{arazzo-41WuzHou.js → arazzo-3RhGfkAK.js} +2 -2
  21. package/dist/{arazzo-CaUVBn7D.js → arazzo-B5-ulWif.js} +6 -6
  22. package/dist/{args-IIolxxKA.js → args-0FrVs5EH.js} +125 -8
  23. package/dist/astro/index.d.ts +30 -12
  24. package/dist/astro/index.js +2 -2
  25. package/dist/{audience-DabClFLQ.js → audience-BAkBDMqn.js} +8 -8
  26. package/dist/{auth-DRLEizbL.js → auth--yPyZNgr.js} +21 -10
  27. package/dist/authzen/index.d.ts +171 -25
  28. package/dist/authzen/index.js +321 -149
  29. package/dist/{automation-BNM3TtDo.d.ts → automation-DqEoWHBc.d.ts} +42 -32
  30. package/dist/{automation-DVjOckjV.js → automation-x3KEUusw.js} +22 -21
  31. package/dist/base-url-BQbddZO5.js +9 -0
  32. package/dist/better-auth/index.d.ts +2 -2
  33. package/dist/better-auth/index.js +13 -7
  34. package/dist/better-supabase/index.d.ts +392 -220
  35. package/dist/better-supabase/index.js +293 -152
  36. package/dist/{bind-DOyrv6zi.d.ts → bind-Cp2hBHzP.d.ts} +27 -12
  37. package/dist/{bind-CAvgUuKs.js → bind-D_sZSVA3.js} +22 -10
  38. package/dist/{body-CH5of8Ne.js → body-CJQwYVa8.js} +3 -3
  39. package/dist/{body-text-QcXok_SI.js → body-text-DQhcmqdY.js} +8 -4
  40. package/dist/{boundary-BM8a_P6E.js → boundary-BV3O1eud.js} +8 -2
  41. package/dist/{boundary-BmHxVH1J.d.ts → boundary-C9ck-3uK.d.ts} +13 -4
  42. package/dist/{budget-NbEtbJC_.js → budget-BELja5A9.js} +6 -3
  43. package/dist/{budget-JqcRqyhK.d.ts → budget-hYsPz_yE.d.ts} +6 -3
  44. package/dist/{build-instance-Bu_eDqYw.js → build-instance-CNWaYJyr.js} +3 -3
  45. package/dist/{canonical-json-BC8_nMTw.js → canonical-json-DwilZ1iB.js} +6 -3
  46. package/dist/{capability-N1K9IpqS.js → capability-BqX94r07.js} +31 -25
  47. package/dist/{capability-Drg-1YhL.d.ts → capability-ChuiONQU.d.ts} +41 -29
  48. package/dist/{casbin-Dyu2gnUD.js → casbin-H0rKxBx2.js} +16 -8
  49. package/dist/{casbin-Cr7RLtA3.js → casbin-cbSbhT_k.js} +2 -2
  50. package/dist/{casl-64gpT-8x.js → casl-C4OINZHI.js} +2 -2
  51. package/dist/{casl-DjEDhTCP.js → casl-CHHoCldP.js} +19 -10
  52. package/dist/catalog/index.d.ts +104 -23
  53. package/dist/catalog/index.js +117 -8
  54. package/dist/{catalog-HD2gf5mY.js → catalog-BFpz2EmT.js} +57 -26
  55. package/dist/{catalog-DZVbrF-z.js → catalog-DCspHDc8.js} +3 -3
  56. package/dist/{catalog-doc-Cdn7-0pQ.js → catalog-doc-DjMKzJp9.js} +53 -16
  57. package/dist/{catalog-fingerprint-CCP0-yQS.js → catalog-fingerprint-e6aCWosn.js} +19 -15
  58. package/dist/catalog-mRQQQhNK.js +1 -0
  59. package/dist/catalog-operations-Dadrl7Z-.js +60 -0
  60. package/dist/{create-CQWIpUG-.js → challenge-DImNcR7B.js} +157 -39
  61. package/dist/chat/index.d.ts +1 -1
  62. package/dist/chat/index.js +13 -10
  63. package/dist/chat-sdk/index.d.ts +44 -26
  64. package/dist/chat-sdk/index.js +17 -17
  65. package/dist/checks-CGkP3Z7A.js +40 -0
  66. package/dist/{claims-map-7oQ3ue4X.js → claims-map-CKkoAAYF.js} +5 -2
  67. package/dist/{claims-map-Ca-QX8C6.d.ts → claims-map-D1Pb5oRq.d.ts} +8 -5
  68. package/dist/claude-agent/index.d.ts +6 -6
  69. package/dist/claude-agent/index.js +6 -3
  70. package/dist/clerk/index.d.ts +11 -7
  71. package/dist/clerk/index.js +6 -6
  72. package/dist/cli/bin.js +4 -4
  73. package/dist/cli/index.d.ts +82 -7
  74. package/dist/cli/index.js +6 -6
  75. package/dist/{clients-C7zLFuWT.d.ts → clients-C_NOET3z.d.ts} +5 -5
  76. package/dist/{clients-DjU5ABMy.js → clients-DYr3U86j.js} +3 -3
  77. package/dist/cloud/index.d.ts +186 -38
  78. package/dist/cloud/index.js +293 -31
  79. package/dist/{cloud-ytQ3uviA.js → cloud-BFlGMaak.js} +5 -6
  80. package/dist/{codemod-5mpSpnUY.js → codemod-DLQ9Zpo4.js} +3 -4
  81. package/dist/{codemod-ua2hHy7w.js → codemod-DWSN2erG.js} +523 -201
  82. package/dist/collect-B5BL3klN.js +1 -0
  83. package/dist/{collect-mLTY4nwb.js → collect-B7ZFAJU3.js} +36 -64
  84. package/dist/{collect-Ci6akVwH.js → collect-Bzv3le0A.js} +6 -6
  85. package/dist/{compare-pfyVnBjE.js → compare-DTfyUunF.js} +2 -2
  86. package/dist/compile/index.d.ts +2 -2
  87. package/dist/compile/index.js +1 -1
  88. package/dist/{compile-1bsAezL0.d.ts → compile-BFzysW3o.d.ts} +36 -12
  89. package/dist/{compile-CMqMx_IN.js → compile-EzEMB-7v.js} +77 -33
  90. package/dist/{completion-BTFrHZhX.js → completion-saoYiRFO.js} +17 -8
  91. package/dist/config-BwPBfN0t.js +108 -0
  92. package/dist/{config-Bj2Ixq3d.js → config-DBeXXmBF.js} +2 -2
  93. package/dist/{config-report-DSpsLpCE.js → config-report-BipSWA6V.js} +9 -6
  94. package/dist/config-shape-ykV0Vm2n.js +134 -0
  95. package/dist/{connection-DjhIJSs2.js → connection-B72dg5Q2.js} +23 -22
  96. package/dist/connector-schema-CYLQNMYq.js +434 -0
  97. package/dist/{context-B_u3_bDJ.js → context-BnIzxTNE.js} +4 -3
  98. package/dist/convex/index.d.ts +13 -7
  99. package/dist/convex/index.js +9 -6
  100. package/dist/core-H-mbhpZc.js +341 -0
  101. package/dist/core-hWIARPDz.d.ts +206 -0
  102. package/dist/{create-CBMmFie-.d.ts → create-BSNrVuxh.d.ts} +87 -34
  103. package/dist/{create-B30OMUOJ.d.ts → create-BVq1lNQE.d.ts} +49 -28
  104. package/dist/{create-D_NmPOdH.d.ts → create-CM1FciYG.d.ts} +37 -29
  105. package/dist/{create-CGm28gyI.js → create-Cq4Uox0f.js} +13 -9
  106. package/dist/{create-DCF2SvoT.js → create-_noSrY1T.js} +15 -21
  107. package/dist/{credential-BcoiejpY.js → credential-CyyyvCsL.js} +42 -39
  108. package/dist/{credentials-DPyHmYz5.js → credentials-CdDxp7jN.js} +6 -6
  109. package/dist/{deciding-columns-Sq12mEA6.js → deciding-columns-NB4wcyBf.js} +13 -2
  110. package/dist/{delegation-j6-rc37o.js → delegation-CDB6_keF.js} +31 -22
  111. package/dist/delivery/index.d.ts +5 -5
  112. package/dist/delivery/index.js +6 -5
  113. package/dist/{delivery-DCAgNyCn.js → delivery-BupfvJIV.js} +81 -20
  114. package/dist/{delivery-event-xX4obB8F.js → delivery-event-JioK5YbS.js} +6 -6
  115. package/dist/denied-text-CHNlVInN.d.ts +22 -0
  116. package/dist/{describe-BybMRY7A.js → describe-Bb4hGK5d.js} +6 -5
  117. package/dist/{describe-B5qgDvEW.d.ts → describe-ByS9LgHK.d.ts} +5 -5
  118. package/dist/{device-BARQ8eYG.js → device-BwbJNmb2.js} +11 -8
  119. package/dist/{diff-CmuSD3vc.js → diff-CN8IYhC_.js} +2 -2
  120. package/dist/{diff-3jbx6Rm4.js → diff-iZWV65nC.js} +23 -14
  121. package/dist/{digest-B3kc_PgQ.d.ts → digest-8Yx2CchM.d.ts} +3 -3
  122. package/dist/{doctor-BdZw53-k.js → doctor-CHD1M9R5.js} +485 -141
  123. package/dist/{doctor-3ZqNHX_G.js → doctor-D3wo-yuz.js} +4 -4
  124. package/dist/drizzle/index.d.ts +33 -19
  125. package/dist/drizzle/index.js +17 -9
  126. package/dist/elysia/index.d.ts +17 -11
  127. package/dist/elysia/index.js +5 -5
  128. package/dist/{errors-BKy0EfhN.js → errors-B6R_lg2a.js} +13 -4
  129. package/dist/{errors-BWXBMaKK.d.ts → errors-CHwoRRpB.d.ts} +4 -1
  130. package/dist/{errors-CWTY6uih.js → errors-Vpu6rKHl.js} +14 -10
  131. package/dist/{errors-DH5QEGXh.d.ts → errors-zi_4T-rx.d.ts} +22 -6
  132. package/dist/{evaluate-CNClBvcj.js → evaluate-Dd8Ta0Ie.js} +185 -80
  133. package/dist/{evaluations-beAooV0n.js → evaluations-IBceAeKT.js} +41 -20
  134. package/dist/{evaluations-C_1vdSZc.d.ts → evaluations-z8dQFDaN.d.ts} +12 -6
  135. package/dist/eve/index.d.ts +9 -6
  136. package/dist/eve/index.js +4 -4
  137. package/dist/{event-time-CsegxXxB.js → event-time-BGy48400.js} +8 -4
  138. package/dist/{expiry-D4_YKRKD.js → expiry-6XByK0dm.js} +8 -5
  139. package/dist/express/index.d.ts +9 -6
  140. package/dist/express/index.js +9 -6
  141. package/dist/fastify/index.d.ts +16 -10
  142. package/dist/fastify/index.js +8 -5
  143. package/dist/{fetch-adapter-Dw0MTS3D.d.ts → fetch-adapter-C1DCvpqV.d.ts} +9 -6
  144. package/dist/{fetch-adapter-DD_gfmrC.js → fetch-adapter-JL43jD3E.js} +14 -11
  145. package/dist/fields-D0vUI6dq.js +498 -0
  146. package/dist/{files-C5ZI27eV.js → files-B3AA05f1.js} +21 -5
  147. package/dist/{files-D_JIzUrP.js → files-BSjrtIHw.js} +11 -4
  148. package/dist/{fixtures-B7XrLeY7.js → fixtures-A1_sp_tR.js} +15 -6
  149. package/dist/{flags-C3DktBDY.js → flags-DXjoTVbS.js} +2 -2
  150. package/dist/{freeze-CrU8nQeX.js → freeze-jjan0lCv.js} +4 -1
  151. package/dist/{from-snapshot-CTCMsFZk.js → from-snapshot-DCakWRsr.js} +26 -16
  152. package/dist/gen-B5kvbAoZ.js +58 -0
  153. package/dist/gen-DWCYcMQM.js +827 -0
  154. package/dist/generate-CRVV5V7l.js +165 -0
  155. package/dist/generate-CezbCaTI.js +275 -0
  156. package/dist/{grantee-hxrUsbpM.js → grantee-Dke-9rd1.js} +4 -4
  157. package/dist/{grantee-conditions-CcXf8hMM.js → grantee-conditions-BrYPe-w0.js} +12 -12
  158. package/dist/{grantee-match-DbENBHLB.js → grantee-match-7RZZvoT_.js} +12 -6
  159. package/dist/{graph-sql-B-dsAT6j.d.ts → graph-sql-BwFC4Qjs.d.ts} +3 -3
  160. package/dist/h3/index.d.ts +10 -7
  161. package/dist/h3/index.js +3 -3
  162. package/dist/headers-B9jQxjtW.d.ts +10 -0
  163. package/dist/{helpers-CBYVMjwh.js → helpers-DJicaG6f.js} +40 -28
  164. package/dist/hono/index.d.ts +16 -10
  165. package/dist/hono/index.js +5 -5
  166. package/dist/{hosted-BPk51-kX.d.ts → hosted-Cmtxogd0.d.ts} +44 -20
  167. package/dist/{hosted-B46-5LYE.js → hosted-D0IzESu_.js} +68 -25
  168. package/dist/{http-ujKm0JXE.js → http-DH94eh6f.js} +4 -4
  169. package/dist/{http-BBoKefeS.js → http-DKLXrFGk.js} +13 -7
  170. package/dist/{http-DXJ37RDA.js → http-DOL33cO0.js} +11 -8
  171. package/dist/{import-wyqXUyjm.js → import-CST57XLp.js} +64 -51
  172. package/dist/{import-CNV7I2Dw.js → import-_YqhhwvX.js} +6 -6
  173. package/dist/{index-B8YjkEZ4.d.ts → index-B8s204GL.d.ts} +64 -52
  174. package/dist/{index-Ch8LpNDp.d.ts → index-BT5-1VsX.d.ts} +64 -25
  175. package/dist/{index-DuWxc5dt.d.ts → index-BW_0MZOS.d.ts} +388 -149
  176. package/dist/index-BhxEUY9J.d.ts +233 -0
  177. package/dist/index-Bv5iXPqU.d.ts +210 -0
  178. package/dist/{index-C-6Letxg.d.ts → index-_9UiQIkt.d.ts} +164 -77
  179. package/dist/index.d.ts +22 -21
  180. package/dist/index.js +35 -33
  181. package/dist/{init-GG6Jh8HD.js → init-Dz_PsHdv.js} +5 -5
  182. package/dist/{init-DeMYsnYJ.js → init-cE3A8aXq.js} +10 -10
  183. package/dist/{instance-options-BsVpyGIk.d.ts → instance-options-B0KXqTrJ.d.ts} +4 -4
  184. package/dist/{instance-snapshot-BOEhcqIF.js → instance-snapshot--JWiTrvO.js} +81 -56
  185. package/dist/{instant-BluqDvyS.js → instant-DK3Iz83e.js} +2 -2
  186. package/dist/{internals-Dk8A8fX3.js → internals-B3IgHrvo.js} +6 -3
  187. package/dist/{json-schema-B-vAwlde.js → json-schema-BPGa-RjQ.js} +9 -3
  188. package/dist/{json-schema-CN_iLFH2.d.ts → json-schema-BfXgnRNT.d.ts} +4 -4
  189. package/dist/jwt/index.d.ts +125 -17
  190. package/dist/jwt/index.js +157 -16
  191. package/dist/{kernel-D0NVb1cK.js → kernel-C-fYydV2.js} +151 -16
  192. package/dist/kysely/index.d.ts +49 -33
  193. package/dist/kysely/index.js +9 -7
  194. package/dist/{live-options-BaAFCIiu.js → live-options-BBIT68le.js} +2 -2
  195. package/dist/{load-DFS_ry0W.js → load-DjSU5KXO.js} +6 -6
  196. package/dist/load-Dm0pSYH3.js +1 -0
  197. package/dist/{login-Dfe5RlYk.js → login-D-8tMqzo.js} +4 -4
  198. package/dist/{login-imhuwvn3.js → login-DplQ0s84.js} +18 -15
  199. package/dist/{manifest-dvL2XEe1.js → manifest-Cgiq5oqc.js} +67 -37
  200. package/dist/{manifest-mx5ghSFM.d.ts → manifest-CzzWtnAb.d.ts} +144 -28
  201. package/dist/{manifest-schema-C0kK_8V0.js → manifest-schema-2r37XRhD.js} +80 -9
  202. package/dist/{manifest-C8IzW3Do.js → manifest-wg8WkkpD.js} +11 -7
  203. package/dist/{map-claims-D3oRmTk0.js → map-claims-BNWCJtmP.js} +27 -18
  204. package/dist/{map-error-Dr70oA_3.js → map-error-pasIGqMT.js} +7 -7
  205. package/dist/{markers-C6joDI3o.js → markers-BeHZ4x9Q.js} +20 -5
  206. package/dist/mcp/index.d.ts +154 -47
  207. package/dist/mcp/index.js +200 -41
  208. package/dist/{migrate-CIq4-E9F.js → migrate-B7oP_sQU.js} +102 -31
  209. package/dist/module-values-BJTBdo6y.js +107 -0
  210. package/dist/nest/index.d.ts +23 -13
  211. package/dist/nest/index.js +18 -11
  212. package/dist/next/client.d.ts +5 -2
  213. package/dist/next/client.js +1 -1
  214. package/dist/next/index.d.ts +72 -26
  215. package/dist/next/index.js +110 -6
  216. package/dist/next/plugin.d.ts +1 -1
  217. package/dist/next/plugin.js +4 -3
  218. package/dist/node/index.d.ts +5 -5
  219. package/dist/node/index.js +3 -3
  220. package/dist/{ocsf-BFp-PZZA.js → ocsf-TcjRBgIs.js} +15 -5
  221. package/dist/openai/index.d.ts +13 -7
  222. package/dist/openai/index.js +3 -3
  223. package/dist/openapi/index.d.ts +61 -30
  224. package/dist/openapi/index.js +2 -2
  225. package/dist/{openapi-B7HZ0f-r.js → openapi-BOsx0xn9.js} +34 -24
  226. package/dist/{openapi-C4dDTVEd.js → openapi-CBZUhA3l.js} +4 -5
  227. package/dist/{openapi-DD1SV-5-.js → openapi-VeHHU2l9.js} +23 -14
  228. package/dist/{operation-findings-DgATDpvh.js → operation-findings-CXtFzlKJ.js} +3 -3
  229. package/dist/{operations-X0VM7F3m.d.ts → operations-Ci_rT6Uo.d.ts} +10 -7
  230. package/dist/orpc/index.d.ts +68 -14
  231. package/dist/orpc/index.js +62 -13
  232. package/dist/otel/index.d.ts +7 -4
  233. package/dist/otel/index.js +8 -5
  234. package/dist/output-files-BHOIlrfD.js +1 -0
  235. package/dist/{output-files-DhRBBE4n.js → output-files-BIQ_9pIs.js} +29 -17
  236. package/dist/{output-1im__-08.js → output-tkju6U7R.js} +15 -7
  237. package/dist/ownership-B4L59T9u.js +1054 -0
  238. package/dist/parse-1_ZheTW5.js +151 -0
  239. package/dist/parse-local-manifest-BQhTlLQS.d.ts +10 -0
  240. package/dist/parse-local-manifest-DEiCF4ah.js +69 -0
  241. package/dist/{parse-request-D_tUXG6M.js → parse-request-CwCZpyjV.js} +7 -8
  242. package/dist/{paths-DXSHAMIa.js → paths-CUvURzHp.js} +4 -1
  243. package/dist/pdp/index.d.ts +9 -6
  244. package/dist/pdp/index.js +23 -12
  245. package/dist/{peer-CRvC7Hg1.js → peer-C9LvBCcb.js} +1 -1
  246. package/dist/peer-Q0fuZ6hx.js +982 -0
  247. package/dist/{permdock-SV8ZINYT.d.ts → permdock-B6Sf4T_S.d.ts} +270 -117
  248. package/dist/{permdock-BrAscV28.js → permdock-L-_I_3zP.js} +226 -74
  249. package/dist/{permission-registry-Br4jSNVi.js → permission-registry-B8tYxPIt.js} +24 -11
  250. package/dist/{vocabulary-CN8H_9UF.d.ts → permission-types-CAY-GU7e.d.ts} +130 -104
  251. package/dist/{permissions-u_KHg-sN.d.ts → permissions-Bx6UI8n1.d.ts} +6 -2
  252. package/dist/{permissions-B-wCP5ZC.js → permissions-CVXmRILq.js} +3 -3
  253. package/dist/{permissions-BPxlwVhN.js → permissions-mDcTWoBs.js} +8 -5
  254. package/dist/pg-DQTqRrou.js +60 -0
  255. package/dist/{pins-8ILTftC9.js → pins-nqarl3oE.js} +4 -1
  256. package/dist/pkce-CnmmYqUZ.js +21 -0
  257. package/dist/{policy-77FSAq_V.d.ts → policy-Ba4bDhaj.d.ts} +5 -5
  258. package/dist/{policy-DbM5YYtV.js → policy-CLQ8__GF.js} +49 -20
  259. package/dist/{policy-from-catalog-C2gMa2Dj.js → policy-from-catalog-CJgOm6aq.js} +28 -25
  260. package/dist/{policy-module-CTlwMvLI.js → policy-module-xym9fnSq.js} +12 -6
  261. package/dist/{policy-types-n0uRTsW8.d.ts → policy-types-CCiDRZBH.d.ts} +802 -334
  262. package/dist/postgres-store-DcyrPS-r.js +1028 -0
  263. package/dist/{postgrest-DAjUkF9w.js → postgrest-D4nuPXIQ.js} +88 -36
  264. package/dist/{postgrest-CEgRbefE.d.ts → postgrest-DicQyqm-.d.ts} +60 -30
  265. package/dist/powersync-DHNQX06W.js +1117 -0
  266. package/dist/{powersync-DISt6SUe.js → powersync-DXqGuq9A.js} +3 -3
  267. package/dist/powersync-Djf-zCpB.js +1 -0
  268. package/dist/preset/index.d.ts +38 -28
  269. package/dist/preset/index.js +1 -1
  270. package/dist/{preset-DZdU0tne.js → preset-BjLzeFpp.js} +58 -34
  271. package/dist/{principal-source-pHneukrx.js → principal-source-C6N60GtM.js} +10 -10
  272. package/dist/prisma/index.d.ts +69 -41
  273. package/dist/prisma/index.js +21 -17
  274. package/dist/{problem-CTviyH5L.js → problem-BVLHFK33.js} +41 -21
  275. package/dist/{problem-details-cn5X30gZ.js → problem-details-CLDgX1KV.js} +13 -4
  276. package/dist/{problem-types-CJ2325SZ.js → problem-types-DSsRfONQ.js} +4 -1
  277. package/dist/prompt-BYc6drYW.js +938 -0
  278. package/dist/protected-action-BE7N_Luo.d.ts +58 -0
  279. package/dist/protected-action-DUYqb-Ma.js +80 -0
  280. package/dist/{protected-BlF0F6wL.js → protected-action-QEA8arRB.js} +48 -14
  281. package/dist/{provider-B1al-AZz.js → provider-C55OGXJ7.js} +5 -4
  282. package/dist/{provider-DILL9oPK.d.ts → provider-DXfq5c2d.d.ts} +1 -1
  283. package/dist/{provider-store-DM6DNcta.js → provider-store-CaTv00tr.js} +13 -9
  284. package/dist/pull-B65ndFNZ.js +1 -0
  285. package/dist/{pull-jEwbf80J.js → pull-CwpGaQSi.js} +12 -11
  286. package/dist/{push-BD4f15co.js → push-DgssgzkK.js} +62 -16
  287. package/dist/{pushed-policy-DCW91KQU.d.ts → pushed-policy-D1Eoi6NM.d.ts} +12 -6
  288. package/dist/{pushed-policy-CqtxkV4G.js → pushed-policy-ITwYKvvH.js} +10 -7
  289. package/dist/react/index.d.ts +9 -8
  290. package/dist/react/index.js +7 -6
  291. package/dist/react/provider-client.d.ts +1 -1
  292. package/dist/react/provider-client.js +1 -1
  293. package/dist/react-native/index.d.ts +104 -51
  294. package/dist/react-native/index.js +394 -67
  295. package/dist/{refs-K6eWUJ0H.js → refs-C8BKxc_e.js} +17 -3
  296. package/dist/{relation-walk-3OyDBF0S.js → relation-walk-DK_gkgL7.js} +12 -9
  297. package/dist/{relations-BnCWnJGI.js → relations-BxvRvDHK.js} +3 -3
  298. package/dist/{replay-Du1tJjG7.js → replay-BU09ad4L.js} +1 -1
  299. package/dist/{replay-Bkm-Ne4l.d.ts → replay-DNftIb_R.d.ts} +1 -1
  300. package/dist/{request-context-C81Pip9n.js → request-context-C25ilqiJ.js} +8 -8
  301. package/dist/{request-schema-CMreVuFM.js → request-schema-DhX7UbfQ.js} +4 -1
  302. package/dist/resend/index.d.ts +34 -28
  303. package/dist/resend/index.js +29 -29
  304. package/dist/resolve-names-CF7xXLSG.js +201 -0
  305. package/dist/{resource-relations-D_jw0BFx.js → resource-relations-8-pCScBO.js} +18 -9
  306. package/dist/{retire-CALjIQ7e.js → retire-B2xffQgY.js} +15 -6
  307. package/dist/{revocations-R07lFBnX.d.ts → revocations-BaUXHM1N.d.ts} +6 -3
  308. package/dist/{rls-DTvYd-lI.js → rls-CNEH2_BG.js} +743 -624
  309. package/dist/{rls-BAqP4q66.js → rls-Ca8Jz9b5.js} +41 -10
  310. package/dist/{role-builder-uWQZ4v84.js → role-builder-BK2-T6oD.js} +41 -20
  311. package/dist/rolldown-runtime-C3I60J0A.js +4 -0
  312. package/dist/{row-conditions-h2HythXQ.js → row-conditions-BAGHOmVq.js} +4 -3
  313. package/dist/{rpc-VSl5ylaQ.js → rpc-fNqAIqQk.js} +8 -5
  314. package/dist/{run-CUKuz0A8.js → run-Bz26OTfO.js} +26 -23
  315. package/dist/run-D-JE8QWb.js +1 -0
  316. package/dist/{run-ticket-DocwaTKn.d.ts → run-ticket-DbWI9f99.d.ts} +33 -13
  317. package/dist/{run-ticket-sxFI6LAk.js → run-ticket-Dv7aF7Dk.js} +29 -8
  318. package/dist/{runtime-D3VTAiCA.js → runtime-BGnrOkVH.js} +5 -2
  319. package/dist/{saas-BCXRuXca.js → saas-iWnUdwCt.js} +42 -29
  320. package/dist/{scan-qvOe0hS3.js → scan-DCj1KQfn.js} +1 -1
  321. package/dist/{schema-B4v0Qrac.js → schema-BOJjqlWL.js} +3 -2
  322. package/dist/{schema-yLuBWWsh.js → schema-Dst9I9Gs.js} +9 -5
  323. package/dist/scim/index.d.ts +3 -2
  324. package/dist/scim/index.js +3 -1
  325. package/dist/scim-D8YupzX1.js +44 -0
  326. package/dist/{scim-ClHtpyV3.js → scim-jJBJ7g1Z.js} +35 -551
  327. package/dist/{scopes-CUPSjo9q.js → scopes-0Up_UA2t.js} +42 -24
  328. package/dist/server/index.d.ts +12 -12
  329. package/dist/server/index.js +13 -13
  330. package/dist/{server-C3WXAHZj.js → server-3cVlTLde.js} +31 -31
  331. package/dist/{server-types-CKQiCnON.d.ts → server-types-CIlpSA2G.d.ts} +81 -46
  332. package/dist/{sha256-D9ihqmvd.js → sha256-C-4WXKIu.js} +4 -3
  333. package/dist/{shared-BAK8t4Uo.js → shared-Afctg7B0.js} +100 -61
  334. package/dist/{shared-DvvFzYXe.js → shared-l0oGGetg.js} +9 -6
  335. package/dist/{signals-D3NcTKUS.js → signals-B1vHR3fN.js} +2 -2
  336. package/dist/{sink-BEZSlMS_.js → sink-D9_vh372.js} +32 -21
  337. package/dist/{sink-4-eQIRWf.d.ts → sink-Dvi7YZG_.d.ts} +44 -20
  338. package/dist/{skills-B6lVdD_W.js → skills-Bjj7BNEQ.js} +16 -12
  339. package/dist/{skills-CTYwkl44.js → skills-OuoMR49L.js} +3 -3
  340. package/dist/{snapshot-B7DkYg6g.js → snapshot-CXlzi69u.js} +21 -18
  341. package/dist/{snapshot-cache-PXI-vGpY.d.ts → snapshot-cache-BAXZ0KOp.d.ts} +21 -12
  342. package/dist/{snapshot-cache-DZHQ0KF6.js → snapshot-cache-Bx_4xC_6.js} +14 -11
  343. package/dist/solid/index.d.ts +55 -15
  344. package/dist/solid/index.js +46 -12
  345. package/dist/solid-start/index.d.ts +30 -12
  346. package/dist/solid-start/index.js +3 -3
  347. package/dist/sources-B1Os_YUu.d.ts +312 -0
  348. package/dist/{sources-vs5dGOsS.js → sources-CMAM-2A3.js} +156 -51
  349. package/dist/sources-qoIJQrJv.js +11 -0
  350. package/dist/{sql-B5T1IL83.js → sql-0WjxIp9g.js} +32 -7
  351. package/dist/sql-B80DFdpG.d.ts +10 -0
  352. package/dist/{src-Cu2m75uo.js → src-DZ0l9UAg.js} +305 -123
  353. package/dist/ssf/index.d.ts +4 -4
  354. package/dist/ssf/index.js +665 -224
  355. package/dist/{standard-webhooks-rbD7LS6h.d.ts → standard-webhooks-C-qX4mJW.d.ts} +7 -7
  356. package/dist/{standard-webhooks-DgFFD-Ga.js → standard-webhooks-D67a3nzk.js} +5 -5
  357. package/dist/{store-BDutJkDL.js → store-RNFvaJJv.js} +43 -29
  358. package/dist/{store-options-u0ycEe8s.js → store-options-Dil3lraY.js} +105 -15
  359. package/dist/stores-C0Kta5Ft.d.ts +59 -0
  360. package/dist/{stores-CGhM8BN_.js → stores-DxZWDXCs.js} +42 -5
  361. package/dist/{stream-CvdUS9V1.js → stream-CDvF0sJm.js} +5 -5
  362. package/dist/{stream-CeCMJmBB.d.ts → stream-ltuLdtTG.d.ts} +4 -3
  363. package/dist/{style-DiKWnAvn.js → style-DblOtSga.js} +1 -1
  364. package/dist/{style-Uao76wO7.js → style-Ds11Hmk4.js} +3 -1
  365. package/dist/{subject-settings-CkEwrw3W.js → subject-settings-8sH5HlII.js} +8 -4
  366. package/dist/{row-check-Dt35czLy.d.ts → subject-settings-vNW8qmUH.d.ts} +30 -18
  367. package/dist/supabase/index.d.ts +48 -37
  368. package/dist/supabase/index.js +6 -6
  369. package/dist/supabase/middleware.d.ts +19 -13
  370. package/dist/supabase/middleware.js +7 -7
  371. package/dist/{supabase-x5JtR2tc.js → supabase-BL1qJzzY.js} +82 -36
  372. package/dist/{supabase-By_frk3U.js → supabase-D39cuGPt.js} +3 -3
  373. package/dist/{supabase-hook-BMoEhZir.js → supabase-hook-B-yXnzUl.js} +1206 -286
  374. package/dist/supabase-hook-H-MtE9Wd.js +1 -0
  375. package/dist/supautils-BU-pAEpf.js +808 -0
  376. package/dist/{support-session-C6xJQYut.js → support-session-BsmPCbz8.js} +22 -22
  377. package/dist/svelte/PermissionBoundary.svelte +2 -6
  378. package/dist/svelte/Protected.svelte +2 -8
  379. package/dist/svelte/index.d.ts +9 -8
  380. package/dist/svelte/index.js +10 -9
  381. package/dist/svelte/runtime.d.ts +4 -4
  382. package/dist/svelte/runtime.js +4 -4
  383. package/dist/svelte/source.d.ts +9 -8
  384. package/dist/svelte/source.js +6 -5
  385. package/dist/sveltekit/index.d.ts +30 -12
  386. package/dist/sveltekit/index.js +2 -2
  387. package/dist/{ownership-DqaJNJPn.js → tables-DeMNEy6V.js} +1025 -1085
  388. package/dist/tanstack-start/index.d.ts +22 -10
  389. package/dist/tanstack-start/index.js +2 -2
  390. package/dist/{target-Bw37TFNA.js → target-qdEAnnhU.js} +6 -6
  391. package/dist/{tenancy-DN2QAx9z.js → tenancy-5d1zVBvK.js} +36 -21
  392. package/dist/terminal/index.d.ts +23 -14
  393. package/dist/terminal/index.js +17 -20
  394. package/dist/testing/core.d.ts +2 -0
  395. package/dist/testing/core.js +1 -0
  396. package/dist/testing/fixtures/index.d.ts +15 -0
  397. package/dist/testing/fixtures/index.js +831 -0
  398. package/dist/testing/index.d.ts +235 -285
  399. package/dist/testing/index.js +502 -927
  400. package/dist/testing/saas/index.d.ts +43 -27
  401. package/dist/testing/saas/index.js +2 -2
  402. package/dist/testing/saas/permissions.d.ts +1 -1
  403. package/dist/testing/saas/permissions.js +1 -1
  404. package/dist/text-diff-BtfSmdUo.js +444 -0
  405. package/dist/{thenable-yD7SabqG.js → thenable-BNSM1U2R.js} +12 -3
  406. package/dist/{time-DkWjdL98.js → time-nR1JesoH.js} +32 -8
  407. package/dist/{token-BLZcjQgt.js → token-DC9EQiet.js} +15 -13
  408. package/dist/{tool-refusal-CMLN5xhn.js → tool-refusal-Qpjs_W6M.js} +5 -2
  409. package/dist/trpc/index.d.ts +11 -8
  410. package/dist/trpc/index.js +15 -9
  411. package/dist/type-helpers-BIPIDa6a.d.ts +50 -0
  412. package/dist/{types-8RnwUAvE.d.ts → types-AMJ5qoU_.d.ts} +49 -30
  413. package/dist/{types-C_IiEs64.d.ts → types-B2mlGuhW.d.ts} +14 -11
  414. package/dist/{types-_WhUP7ud.d.ts → types-B4uqKDnp.d.ts} +25 -12
  415. package/dist/{types-CX7AvRqP.d.ts → types-BJk0BKRX.d.ts} +24 -14
  416. package/dist/types-B_d_g7T3.d.ts +262 -0
  417. package/dist/{types-BdtSDbBO.d.ts → types-B_tiYvk8.d.ts} +59 -32
  418. package/dist/{types-DqzsnlSA.js → types-CcUXciSj.js} +17 -5
  419. package/dist/{types-Dfv0aTER.d.ts → types-DC1Loeh3.d.ts} +449 -168
  420. package/dist/{types-lUlG3TVd.d.ts → types-DHKPcqzr.d.ts} +2 -2
  421. package/dist/{types-C791HFu9.d.ts → types-DjuMBNF9.d.ts} +68 -32
  422. package/dist/{types-C863OQiR.d.ts → types-HzqOtvsJ.d.ts} +23 -12
  423. package/dist/{types-Druu9wLM.d.ts → types-ZzRGoViD.d.ts} +77 -24
  424. package/dist/{types-BzzaHxt3.d.ts → types-ah9NlU6j.d.ts} +137 -48
  425. package/dist/{types-CVZSNocA.d.ts → types-djVzLlIV.d.ts} +31 -14
  426. package/dist/{types-BtHtcKMr.d.ts → types-yUuPR5Hy.d.ts} +47 -24
  427. package/dist/unplugin/index.d.ts +1 -1
  428. package/dist/unplugin/index.js +2 -2
  429. package/dist/usage-CYeXek0p.js +1 -0
  430. package/dist/{usage-SveTRTyr.js → usage-CxEzS4ey.js} +50 -26
  431. package/dist/{usage-CRVl9V3t.js → usage-ab0PdusX.js} +2 -2
  432. package/dist/{validation-error-ZfUHbKvf.js → validation-error-CYg2kJEw.js} +4 -1
  433. package/dist/{validation-error-DHUrAkku.d.ts → validation-error-YGg2mXyH.d.ts} +5 -2
  434. package/dist/{validity-CZ7-y0Cj.js → validity-Buc7w8E9.js} +13 -10
  435. package/dist/{verifier-DHuh-okk.js → verifier-DUV6pLqZ.js} +10 -4
  436. package/dist/{verify-BaAKx7t6.js → verify-DZeqoWu5.js} +417 -489
  437. package/dist/version-DMQ0dnN5.js +48 -0
  438. package/dist/version-DizhmD72.js +1 -0
  439. package/dist/{views-DTIIO-oQ.js → views-CD8wuL4Z.js} +19 -6
  440. package/dist/vocabulary-DEJ5j4mR.d.ts +70 -0
  441. package/dist/vue/index.d.ts +71 -21
  442. package/dist/vue/index.js +50 -13
  443. package/dist/{waiter-B986w1oK.d.ts → waiter-Bu9zAlE0.d.ts} +13 -10
  444. package/dist/{waiter-BGUtGYoU.js → waiter-aBLM63_f.js} +1 -1
  445. package/dist/{watch-vea54PRw.js → watch-Cx_WciLE.js} +8 -8
  446. package/dist/watch-DB42U1ib.js +1 -0
  447. package/dist/webmcp/index.d.ts +11 -11
  448. package/dist/webmcp/index.js +8 -5
  449. package/dist/{where-scope-C9vfEphl.js → where-scope-DlCdCM_8.js} +56 -30
  450. package/dist/{who-can-DWBAcaCQ.js → who-can-rI7dCR9Q.js} +23 -20
  451. package/dist/workflow/index.d.ts +3 -3
  452. package/dist/workflow/index.js +13 -13
  453. package/dist/workflow-sdk/index.d.ts +19 -13
  454. package/dist/workflow-sdk/index.js +6 -6
  455. package/dist/{wrap-gX61EtpB.js → wrap-B2wziJI_.js} +11 -5
  456. package/dist/{wrap-C5jC6sKI.d.ts → wrap-DlJE3gS_.d.ts} +8 -5
  457. package/package.json +25 -14
  458. package/schemas/catalog-v1.json +3 -0
  459. package/schemas/cli-result-v1.json +1 -0
  460. package/schemas/cloud-api-v1.json +152 -7
  461. package/schemas/connector-v1.json +8 -0
  462. package/schemas/supabase-claims-v1.json +5 -0
  463. package/schemas/supabase-manifest-v1.json +308 -75
  464. package/skills/permdock/SKILL.md +1 -0
  465. package/skills/permdock-agents/references/runtimes.md +3 -1
  466. package/skills/permdock-approvals/references/stores-and-resume.md +2 -1
  467. package/skills/permdock-credentials/references/tokens-keys-links.md +8 -6
  468. package/skills/permdock-data/references/queries-and-rls.md +6 -2
  469. package/skills/permdock-tenancy/SKILL.md +1 -1
  470. package/skills/permdock-tenancy/references/ownership-and-custom-roles.md +2 -1
  471. package/skills/permdock-wire/references/adapters.md +28 -22
  472. package/skills/permdock-wire/references/policy-options.md +1 -0
  473. package/dist/catalog-BoWglDPI.js +0 -1
  474. package/dist/collect-D7eQDffE.js +0 -1
  475. package/dist/config-bs_kZeYq.js +0 -162
  476. package/dist/denied-text-CiFQNuMV.d.ts +0 -19
  477. package/dist/fields-OYG_JR78.js +0 -203
  478. package/dist/generate-CNU1pIOo.js +0 -171
  479. package/dist/headers-BIjfMaoC.js +0 -8
  480. package/dist/headers-CIbDTUTK.d.ts +0 -7
  481. package/dist/index-Cp_ilKi1.d.ts +0 -91
  482. package/dist/index-CueFnxQc.d.ts +0 -110
  483. package/dist/load-BxEtwlBS.js +0 -1
  484. package/dist/output-files-B3IZJksC.js +0 -1
  485. package/dist/package-root-Dk_ETdkp.js +0 -31
  486. package/dist/parse-Cxq0WxrA.js +0 -53
  487. package/dist/parse-local-manifest-5ODwqu8b.d.ts +0 -10
  488. package/dist/parse-local-manifest-CVSs6J9I.js +0 -34
  489. package/dist/peer-C8swJ2GH.js +0 -50
  490. package/dist/policies-DP2nqRoF.js +0 -295
  491. package/dist/powersync-BkWWCS1K.js +0 -538
  492. package/dist/powersync-MMJ2mI2q.js +0 -1
  493. package/dist/problem-details-B45V5d2b.d.ts +0 -7
  494. package/dist/prompt-DfZLJLIn.js +0 -32
  495. package/dist/protected-RFGpakN9.d.ts +0 -38
  496. package/dist/pull-CvpINcMK.js +0 -1
  497. package/dist/run-DDwUaJDU.js +0 -1
  498. package/dist/sources-Xc4zkszI.d.ts +0 -190
  499. package/dist/stores-BUGNbJTt.d.ts +0 -30
  500. package/dist/supabase-hook-CCw5m35C.js +0 -1
  501. package/dist/supautils-B6HYL9eL.js +0 -91
  502. package/dist/text-diff-BQcUapOb.js +0 -15
  503. package/dist/types-B3_ooZgZ.d.ts +0 -172
  504. package/dist/usage-CZpSQP6L.js +0 -1
  505. package/dist/version-CEbQ5UeM.js +0 -18
  506. package/dist/version-DXkYUISx.js +0 -1
  507. package/dist/watch--ovlPOc0.js +0 -1
@@ -1,33 +1,35 @@
1
1
  import { r as isRecord, t as compact } from "../compact-CAf557ZB.js";
2
- import { n as freezeDeep } from "../freeze-CrU8nQeX.js";
3
- import { l as asApprover } from "../role-builder-uWQZ4v84.js";
4
- import { a as holder, i as flattenApprovers, r as approverLeaves } from "../approvers-CqPOLD-o.js";
5
- import { t as loadPrincipal } from "../principal-source-pHneukrx.js";
6
- import { a as isId, r as idList } from "../expiry-D4_YKRKD.js";
7
- import { c as listPermissions, n as findPermission, o as isPermission } from "../permission-registry-Br4jSNVi.js";
8
- import { i as dateAt, m as rfc3339, p as nowSeconds, u as isoAt } from "../time-DkWjdL98.js";
9
- import { t as canonicalJson } from "../canonical-json-BC8_nMTw.js";
10
- import { r as sha256Digest } from "../sha256-D9ihqmvd.js";
11
- import { t as decideSupportSession } from "../support-session-C6xJQYut.js";
12
- import { d as scopeList } from "../scopes-CUPSjo9q.js";
13
- import { o as flattenGrantee } from "../grantee-hxrUsbpM.js";
14
- import { t as byCodePoint } from "../compare-pfyVnBjE.js";
15
- import { o as scopesReaching, t as getPermDock } from "../permdock-BrAscV28.js";
2
+ import { n as freezeDeep } from "../freeze-jjan0lCv.js";
3
+ import { l as asApprover } from "../role-builder-BK2-T6oD.js";
4
+ import { a as holder, i as flattenApprovers, r as approverLeaves } from "../approvers-B4r0N_Uz.js";
5
+ import { t as loadPrincipal } from "../principal-source-C6N60GtM.js";
6
+ import { a as isId, r as idList } from "../expiry-6XByK0dm.js";
7
+ import { c as listPermissions, n as findPermission, o as isPermission } from "../permission-registry-B8tYxPIt.js";
8
+ import { i as dateAt, m as rfc3339, p as nowSeconds, u as isoAt } from "../time-nR1JesoH.js";
9
+ import { t as canonicalJson } from "../canonical-json-DwilZ1iB.js";
10
+ import { r as sha256Digest } from "../sha256-C-4WXKIu.js";
11
+ import { t as decideSupportSession } from "../support-session-BsmPCbz8.js";
12
+ import { f as scopeList } from "../scopes-0Up_UA2t.js";
13
+ import { o as flattenGrantee } from "../grantee-Dke-9rd1.js";
14
+ import { a as delegatedScopeMap, s as scopesReaching, t as getPermDock } from "../permdock-L-_I_3zP.js";
16
15
  import { t as anonymousSubject } from "../subject-BGoM5o8B.js";
17
- import { i as linkPolicyViolation, n as capabilityOf, r as capabilitySubject } from "../capability-N1K9IpqS.js";
18
- import { r as credentialSubject, s as parseCredential } from "../credential-BcoiejpY.js";
16
+ import { i as linkPolicyViolation, n as capabilityOf, r as capabilitySubject } from "../capability-BqX94r07.js";
17
+ import { r as credentialSubject, s as parseCredential } from "../credential-CyyyvCsL.js";
19
18
  import { t as AccessReviewError } from "../errors-BDUwg2qC.js";
20
- import { t as policyRowConditionKeys } from "../row-conditions-h2HythXQ.js";
21
- import { n as subscribersFor } from "../audience-DabClFLQ.js";
22
- import { l as sqlIdent, s as quoteSqlLiteral } from "../sql-B5T1IL83.js";
23
- import "../sources-vs5dGOsS.js";
24
- import { c as subjectFromSupabaseSession, t as callRpc } from "../postgrest-DAjUkF9w.js";
25
- import { t as parseSupabaseManifest } from "../manifest-C8IzW3Do.js";
26
- import { t as parseCatalog } from "../parse-Cxq0WxrA.js";
19
+ import { t as policyRowConditionKeys } from "../row-conditions-BAGHOmVq.js";
20
+ import { n as subscribersFor } from "../audience-BAkBDMqn.js";
21
+ import { l as sqlIdent, s as quoteSqlLiteral } from "../sql-0WjxIp9g.js";
22
+ import "../sources-CMAM-2A3.js";
23
+ import { c as subjectFromSupabaseSession, t as callRpc } from "../postgrest-D4nuPXIQ.js";
24
+ import { n as parseSupabaseManifest, t as hasTokenHook } from "../manifest-wg8WkkpD.js";
25
+ import { t as parseCatalog } from "../parse-1_ZheTW5.js";
27
26
  import { AsyncResult, dbError } from "better-supabase";
28
27
  //#region src/better-supabase/access-reviews.ts
29
28
  const NOT_MEMBER = "ORGANIZATION_NOT_MEMBER";
30
- /** The `hint` better-supabase's block functions raise their code in, or the SQLSTATE. */
29
+ /**
30
+ * The `hint` better-supabase's block functions raise their code in, or the
31
+ * SQLSTATE.
32
+ */
31
33
  function errorCode(error) {
32
34
  if ("hint" in error && typeof error.hint === "string" && error.hint !== "") return error.hint;
33
35
  return "code" in error && typeof error.code === "string" ? error.code : void 0;
@@ -40,8 +42,8 @@ var RpcFailure = class extends Error {
40
42
  }
41
43
  };
42
44
  /**
43
- * Whether a member holding `role` at `scope` holds `key` through it. A role
44
- * the policy does not declare, such as a custom role, counts as holding it.
45
+ * Whether a member holding `role` at `scope` holds `key` through it. A role the
46
+ * policy does not declare, such as a custom role, counts as holding it.
45
47
  */
46
48
  function roleGrants(policy, role, scope, key) {
47
49
  if (!policy.index.declaredRoles.has(role)) return true;
@@ -61,14 +63,13 @@ function invitationsOf(data) {
61
63
  }
62
64
  /**
63
65
  * Applies the revoked items of an access review to better-supabase's
64
- * organizations and invitations blocks, then marks each one applied. A
65
- * revoked member moves to the `demoteTo` role when the policy says that
66
- * role lacks the permission, and is removed otherwise. With `email`, the
67
- * tenant's open invitations to the member whose role grants the permission
68
- * are revoked too. A member who is no longer in the organization counts as
69
- * applied. Any other error leaves the item unapplied in `failed`, and one
70
- * item's failure never stops the others. Throws `review-not-found` for an
71
- * unknown review.
66
+ * organizations and invitations blocks, then marks each one applied. A revoked
67
+ * member moves to the `demoteTo` role when the policy says that role lacks the
68
+ * permission, and is removed otherwise. With `email`, the tenant's open
69
+ * invitations to the member whose role grants the permission are revoked too. A
70
+ * member who is no longer in the organization counts as applied. Any other
71
+ * error leaves the item unapplied in `failed`, and one item's failure never
72
+ * stops the others. Throws `review-not-found` for an unknown review.
72
73
  */
73
74
  function accessReviewApplier(options) {
74
75
  const schema = options.schema ?? "better_supabase";
@@ -155,7 +156,10 @@ function accessReviewApplier(options) {
155
156
  //#region src/better-supabase/api-keys.ts
156
157
  const EPOCH = "1970-01-01T00:00:00.000Z";
157
158
  const rfc3339Of = (instant) => isoAt(instant.epochMilliseconds);
158
- /** When a key stops verifying: its expiry, or the end of a rotated key's grace period. */
159
+ /**
160
+ * When a key stops verifying: its expiry, or the end of a rotated key's grace
161
+ * period.
162
+ */
159
163
  function endOf(key) {
160
164
  const { expiresAt, revokedAt } = key;
161
165
  if (revokedAt === void 0) return expiresAt;
@@ -167,9 +171,9 @@ function manifestServiceRoles(manifest) {
167
171
  return manifest === void 0 ? void 0 : parseSupabaseManifest(manifest).rls.apiKeys?.serviceRoles;
168
172
  }
169
173
  /**
170
- * A personal key as a `user` credential acting as its user, a tenant key as
171
- * a `service` credential holding `roles` in its tenant; `null` when `*`
172
- * has no expansion, a tenant key has no roles, or the record is invalid.
174
+ * A personal key as a `user` credential acting as its user, a tenant key as a
175
+ * `service` credential holding `roles` in its tenant; `null` when `*` has no
176
+ * expansion, a tenant key has no roles, or the record is invalid.
173
177
  */
174
178
  function keyCredential(key, roles, allPermissions) {
175
179
  const scopes = key.scopes.includes("*") ? allPermissions?.map((permission) => permission.key) : key.scopes;
@@ -200,18 +204,18 @@ function keyCredential(key, roles, allPermissions) {
200
204
  }) ?? null;
201
205
  }
202
206
  /**
203
- * better-supabase's API keys as a `CredentialVerifier`, for
204
- * `subjectFromApiKey` from `permdock/server`, which reads PermDock's
205
- * `pdk_<id>_<secret>` format: create the keys with `prefix: "pdk"`. The
206
- * credential id is the key's `publicId`, the id in the token. A personal key
207
- * is a `user` credential acting as its user (inside its tenant when the key
208
- * is limited to one), a tenant key a `service` credential holding
209
- * `serviceRoles` in its tenant, and the key's scopes are the credential's
210
- * permissions. better-supabase records the use when it verifies, so there is
211
- * no `touch`. A rotated key in its grace period verifies, and its credential
212
- * expires when the grace period ends. An invalid, revoked, expired or
213
- * rate-limited key, and a failed lookup, are `null`. `permdock/server` exports a different
214
- * `apiKeyVerifier`, over the application's own key records.
207
+ * better-supabase's API keys as a `CredentialVerifier`, for `subjectFromApiKey`
208
+ * from `permdock/server`, which reads PermDock's `pdk_<id>_<secret>` format:
209
+ * create the keys with `prefix: "pdk"`. The credential id is the key's
210
+ * `publicId`, the id in the token. A personal key is a `user` credential acting
211
+ * as its user (inside its tenant when the key is limited to one), a tenant key
212
+ * a `service` credential holding `serviceRoles` in its tenant, and the key's
213
+ * scopes are the credential's permissions. better-supabase records the use when
214
+ * it verifies, so there is no `touch`. A rotated key in its grace period
215
+ * verifies, and its credential expires when the grace period ends. An invalid,
216
+ * revoked, expired or rate-limited key, and a failed lookup, are `null`.
217
+ * `permdock/server` exports a different `apiKeyVerifier`, over the
218
+ * application's own key records.
215
219
  */
216
220
  function apiKeyVerifier(options) {
217
221
  const fallback = manifestServiceRoles(options.manifest);
@@ -239,10 +243,10 @@ function apiKeyVerifier(options) {
239
243
  } });
240
244
  }
241
245
  /**
242
- * The `claim` and `tenantClaim` options of better-supabase's
243
- * `apiKeyClaims()`, from the manifest's `rls.apiKeys`, so a key's token
244
- * carries the scopes ceiling, tenant and roles the `rls generate` helpers
245
- * read. Throws when the manifest has no `rls.apiKeys`.
246
+ * The `claim` and `tenantClaim` options of better-supabase's `apiKeyClaims()`,
247
+ * from the manifest's `rls.apiKeys`, so a key's token carries the scopes
248
+ * ceiling, tenant and roles the `rls generate` helpers read. Throws when the
249
+ * manifest has no `rls.apiKeys`.
246
250
  */
247
251
  function apiKeyClaimOptions(manifest) {
248
252
  const rls = parseSupabaseManifest(manifest).rls;
@@ -301,8 +305,8 @@ function apiKeySubject(session, options) {
301
305
  /**
302
306
  * `subjectFromSupabaseSession` for better-supabase's `AuthSession`, reading
303
307
  * `memberships` for the memberships and the entitlements module's `features`
304
- * claim for `principal.plans` (`plans` names another claim). With `apiKeys`,
305
- * a verified `apiKey` session is the key's credential subject: a personal key
308
+ * claim for `principal.plans` (`plans` names another claim). With `apiKeys`, a
309
+ * verified `apiKey` session is the key's credential subject: a personal key
306
310
  * acts as its user within the key's scopes, a tenant key as a `service`
307
311
  * principal holding `serviceRoles`. Without `apiKeys`, and for `anon`,
308
312
  * `service` and `invalid` sessions, the subject is anonymous.
@@ -331,10 +335,10 @@ function permissionFor(events, type) {
331
335
  }
332
336
  /**
333
337
  * The per-subscriber check for better-supabase's webhooks-out, outbox and
334
- * realtime fan-out: the subscribers whose `principal` `decideFor` grants
335
- * the event type's permission on its row, in the event's tenant, as the
336
- * sender. An unmapped type, an event without a tenant or sender, a sender
337
- * outside the tenant and a throw reach no one.
338
+ * realtime fan-out: the subscribers whose `principal` `decideFor` grants the
339
+ * event type's permission on its row, in the event's tenant, as the sender. An
340
+ * unmapped type, an event without a tenant or sender, a sender outside the
341
+ * tenant and a throw reach no one.
338
342
  */
339
343
  function subscriberPolicy(options) {
340
344
  return async (event, subscribers) => {
@@ -366,8 +370,8 @@ function subscriberPolicy(options) {
366
370
  //#endregion
367
371
  //#region src/better-supabase/support.ts
368
372
  /**
369
- * Bound to the admin, target, tenant, reason and mode, so the same start
370
- * gets the same approval token each time.
373
+ * Bound to the admin, target, tenant, reason and mode, so the same start gets
374
+ * the same approval token each time.
371
375
  */
372
376
  function requestId(input) {
373
377
  return sha256Digest(canonicalJson({
@@ -384,8 +388,8 @@ function requestId(input) {
384
388
  * verified claims become a PermDock subject, and the start is decided with
385
389
  * `permdock.decideSupportSession` in the requested tenant. `true` only for
386
390
  * `granted`: an `approval-required` start passes once `approved` returns a
387
- * distinct approver for its token. `readOnly: false` needs `writable`. A
388
- * throw is `false`.
391
+ * distinct approver for its token. `readOnly: false` needs `writable`. A throw
392
+ * is `false`.
389
393
  */
390
394
  function supportPolicy(options) {
391
395
  return async (input) => {
@@ -440,12 +444,18 @@ function supportPolicy(options) {
440
444
  //#region src/better-supabase/hooks.ts
441
445
  /** better-supabase's claim that caps a context to the permission keys it lists. */
442
446
  const PERMISSION_CAP_CLAIM = "bs_permission_cap";
443
- /** Whether `permdock` is granted `key` with no row; an unknown key and `approval-required` are `false`. */
447
+ /**
448
+ * Whether `permdock` is granted `key` with no row; an unknown key and
449
+ * `approval-required` are `false`.
450
+ */
444
451
  function grants$1(permdock, key) {
445
452
  const permission = findPermission(permdock.permissions, key);
446
453
  return permission !== void 0 && permdock.decide(permission, void 0).outcome === "granted";
447
454
  }
448
- /** A list matches when every entry does, `anyOf` when one does; other leaves match nobody, as in SQL. */
455
+ /**
456
+ * A list matches when every entry does, `anyOf` when one does; other leaves
457
+ * match nobody, as in SQL.
458
+ */
449
459
  function matches(approvers, userId, permdock) {
450
460
  const items = flattenApprovers(approvers);
451
461
  return items.length > 0 && items.every((item) => {
@@ -466,15 +476,15 @@ function matches(approvers, userId, permdock) {
466
476
  });
467
477
  }
468
478
  /**
469
- * better-supabase's `AuthorizationHooks` (`createServer(betterSupabase,
470
- * { authorization })`), decided by `policy`. Every hook builds the
471
- * principal's instance from the claims `claims` loads now, never from the
472
- * request, and fails closed: a throw, an unknown key and `approval-required`
473
- * refuse. `automation` and `delegation` are always set; `identities`,
474
- * `delivery`, `approverOf`, `support` and `tickets` only with the options
475
- * they read. `delegation.permissions` maps each scope to the keys whose
476
- * `.scope` it is, was renamed from, or that a policy `oauthScopes` entry
477
- * covers, and reads no `authorization_details`.
479
+ * better-supabase's `AuthorizationHooks` (`createServer(betterSupabase, {
480
+ * authorization })`), decided by `policy`. Every hook builds the principal's
481
+ * instance from the claims `claims` loads now, never from the request, and
482
+ * fails closed: a throw, an unknown key and `approval-required` refuse.
483
+ * `automation` and `delegation` are always set; `identities`, `delivery`,
484
+ * `approverOf`, `support` and `tickets` only with the options they read.
485
+ * `delegation.permissions` maps each scope to the keys whose `.scope` it is,
486
+ * was renamed from, or that a policy `oauthScopes` entry covers, and reads no
487
+ * `authorization_details`.
478
488
  */
479
489
  function authorizationHooks(options) {
480
490
  const { policy } = options;
@@ -595,16 +605,19 @@ function authorizationHooks(options) {
595
605
  //#region src/better-supabase/approvers.ts
596
606
  /** `rls.approvals`' approver check, executable by `authenticated`. */
597
607
  const IS_APPROVER = "permdock_is_approver";
598
- /** The resource a cover's `resources` names for a request kind: `job` for `job.update`, else the kind. */
608
+ /**
609
+ * The resource a cover's `resources` names for a request kind: `job` for
610
+ * `job.update`, else the kind.
611
+ */
599
612
  function resourceOf(kind) {
600
613
  const dot = kind.indexOf(".");
601
614
  return dot <= 0 ? kind : kind.slice(0, dot);
602
615
  }
603
616
  /**
604
617
  * better-supabase's `isApprover` template: one `case` over `{kind}` whose
605
- * branches call `permdock_is_approver` with the kind's approvers as JSON.
606
- * A kind with no branch is `false`. Only `user`, `holder` and `anyOf`
607
- * approvers match in SQL; other leaves are reported and match nobody.
618
+ * branches call `permdock_is_approver` with the kind's approvers as JSON. A
619
+ * kind with no branch is `false`. Only `user`, `holder` and `anyOf` approvers
620
+ * match in SQL; other leaves are reported and match nobody.
608
621
  */
609
622
  function isApproverTemplate(input) {
610
623
  const problems = [];
@@ -729,6 +742,14 @@ const listedName = (entry) => entry.listedAs ?? entry.helper;
729
742
  * functions; better-supabase fills it for the tenant scope only.
730
743
  */
731
744
  const HOLDERS_OF = "permitted_{scope}_users";
745
+ /**
746
+ * better-supabase calls `teamIdsOf` from RLS policies as `authenticated`, so it
747
+ * fills from the caller-bound `member_<scope>_ids_of`, never from the `_for`
748
+ * form only `supabase_auth_admin` may execute.
749
+ */
750
+ const TEAM_IDS_OF = "member_{scope}_ids_of";
751
+ /** The scope names better-supabase reads as its teams (doctor BS417). */
752
+ const TEAM_SCOPE = /^teams?$/u;
732
753
  const ACTOR_MAY_WRITE = "permdock_actor_may_write";
733
754
  const OPTIONAL = [
734
755
  "idsWithFor",
@@ -741,8 +762,8 @@ const OPTIONAL = [
741
762
  ];
742
763
  /**
743
764
  * Postgres aliases of the id types better-supabase reads (`uuid`, `text`,
744
- * `bigint`, `integer`), matching its `moduleIdType` from
745
- * `better-supabase/sql`, which this runtime entry does not import.
765
+ * `bigint`, `integer`), matching its `moduleIdType` from `better-supabase/sql`,
766
+ * which this runtime entry does not import.
746
767
  */
747
768
  const ID_TYPES = {
748
769
  uuid: "uuid",
@@ -766,7 +787,10 @@ function tenantScopeOf(manifest, explicit) {
766
787
  }
767
788
  const roots = manifest.rls.scopes.filter((scope) => scope.within === void 0);
768
789
  const [root] = roots;
769
- if (root === void 0 || roots.length > 1) throw new TypeError(`PermDock: the manifest has ${roots.length} root scopes (${roots.map((scope) => scope.name).join(", ") || "none"}), so it can't tell which scope tenants are. Pass { scope } with one of ${names.join(", ")}.`);
790
+ if (root === void 0 || roots.length > 1) {
791
+ const listed = roots.map((scope) => scope.name).join(", ");
792
+ throw new TypeError(`PermDock: the manifest has ${roots.length} root scopes (${listed === "" ? "none" : listed}), so it can't tell which scope tenants are. Pass { scope } with one of ${names.join(", ")}.`);
793
+ }
770
794
  return root.name;
771
795
  }
772
796
  function covers(membership, scope) {
@@ -857,9 +881,9 @@ function grantsCommandOf(schemas) {
857
881
  }
858
882
  /**
859
883
  * better-supabase's `permitted` template. An instance of a scope (`{resource}`
860
- * names the scope) is checked against that scope's ids; any other resource
861
- * at the tenant, and with a catalog only for a key without row conditions.
862
- * Without a catalog better-supabase refuses every key anyway.
884
+ * names the scope) is checked against that scope's ids; any other resource at
885
+ * the tenant, and with a catalog only for a key without row conditions. Without
886
+ * a catalog better-supabase refuses every key anyway.
863
887
  */
864
888
  function permittedTemplate(schema, scopes, tenantScope, catalog) {
865
889
  const idsOf = (scope) => `select ids::text from ${schema}.${sqlIdent(`permitted_${scope}_ids_by_permission`)}({permission}) as ids`;
@@ -885,9 +909,9 @@ const EFFECTS = {
885
909
  };
886
910
  /**
887
911
  * The catalog's `defineOperations` entries as better-supabase operations. A
888
- * name with a `.` is used as written (`workflow.node.http`); any other is
889
- * the tool `ai.tool.<name>` and `mcp.tool.<name>`. `critical` risk is
890
- * `high`, and `send` and `spend` effects are `external`.
912
+ * name with a `.` is used as written (`workflow.node.http`); any other is the
913
+ * tool `ai.tool.<name>` and `mcp.tool.<name>`. `critical` risk is `high`, and
914
+ * `send` and `spend` effects are `external`.
891
915
  */
892
916
  function operationsOf(catalog) {
893
917
  const operations = {};
@@ -908,33 +932,25 @@ function operationsOf(catalog) {
908
932
  return operations;
909
933
  }
910
934
  /**
911
- * better-supabase's `delegation.scopes`: each permission's own scope, and
912
- * each coarse scope the catalog's `oauthScopes` lists, to the permission keys
913
- * it reaches, sorted by code point. A key the catalog does not list is
914
- * dropped, so a stale `oauthScopes` entry grants nothing.
935
+ * better-supabase's `delegation.scopes`, the same map `rls.tokenScopes`
936
+ * compiles.
915
937
  */
916
938
  function delegatedScopes(catalog) {
917
- const delegated = {};
918
- const known = /* @__PURE__ */ new Set();
919
- for (const permission of catalog?.permissions ?? []) {
920
- known.add(permission.key);
921
- (delegated[permission.scope] ??= /* @__PURE__ */ new Set()).add(permission.key);
922
- }
923
- for (const entry of catalog?.oauthScopes ?? []) for (const key of entry.permissions) if (known.has(key)) (delegated[entry.scope] ??= /* @__PURE__ */ new Set()).add(key);
924
- return Object.fromEntries(Object.keys(delegated).toSorted(byCodePoint).map((scope) => [scope, [...delegated[scope] ?? []].toSorted(byCodePoint)]));
939
+ return delegatedScopeMap(catalog?.permissions ?? [], catalog?.oauthScopes);
925
940
  }
926
941
  /**
927
942
  * better-supabase's `authorization` config value, built from PermDock's
928
943
  * manifest and catalog: the scopes, the `rls generate` helpers as SQL
929
- * templates, the membership tables, suspension rows, the token hook and
930
- * every catalog key with `sqlComplete` set from its `rowConditions`. A
931
- * `_for` template and `permissionsFor` are set only when the manifest lists
932
- * their helper, which `rls.mode: 'database'` writes; `isApprover` only with
933
- * `approvers` and `permdock_is_approver`, and otherwise `canApprove` only
934
- * with `approver`. `holdersOf` (`permitted_<tenant scope>_users`) and
944
+ * templates, the membership tables, suspension rows, the token hook and every
945
+ * catalog key with `sqlComplete` set from its `rowConditions`. A `_for`
946
+ * template and `permissionsFor` are set only when the manifest lists their
947
+ * helper, which `rls.mode: 'database'` writes; `isApprover` only with
948
+ * `approvers` and `permdock_is_approver`, and otherwise `canApprove` only with
949
+ * `approver`. `holdersOf` (`permitted_<tenant scope>_users`) and
935
950
  * `actorMayWrite` (`permdock_actor_may_write()`) are set when the manifest
936
- * lists their helper. Throws when the manifest or catalog is invalid, or when the
937
- * tenant scope is ambiguous.
951
+ * lists their helper, and so is `teamIdsOf` (`member_<scope>_ids_of({user})`)
952
+ * for a scope named `team` or `teams`. Throws when the manifest or catalog is
953
+ * invalid, or when the tenant scope is ambiguous.
938
954
  */
939
955
  function authorizationProvider(options) {
940
956
  const manifest = parseSupabaseManifest(options.manifest);
@@ -1020,6 +1036,17 @@ function authorizationProvider(options) {
1020
1036
  role: "postgres"
1021
1037
  });
1022
1038
  }
1039
+ let teamIdsOf;
1040
+ const teamHelper = scopeNames.filter((scope) => TEAM_SCOPE.test(scope)).map((scope) => helpers.get(TEAM_IDS_OF.replace("{scope}", scope))).find((helper) => helper !== void 0);
1041
+ if (teamHelper !== void 0) {
1042
+ const fn = `${schema}.${sqlIdent(teamHelper.name)}`;
1043
+ teamIdsOf = `${fn}({user})`;
1044
+ requires.push({
1045
+ function: fn,
1046
+ args: argTypes(teamHelper.args),
1047
+ role: "authenticated"
1048
+ });
1049
+ }
1023
1050
  let actorMayWrite;
1024
1051
  if (helpers.has(ACTOR_MAY_WRITE)) {
1025
1052
  const fn = `${schema}.${sqlIdent(ACTOR_MAY_WRITE)}`;
@@ -1035,6 +1062,7 @@ function authorizationProvider(options) {
1035
1062
  idsWith: `${schema}.${TEMPLATES.idsWith.sql}`,
1036
1063
  isPlatform: `${schema}.${TEMPLATES.isPlatform.sql}`,
1037
1064
  ...holdersOf === void 0 ? {} : { holdersOf },
1065
+ ...teamIdsOf === void 0 ? {} : { teamIdsOf },
1038
1066
  ...actorMayWrite === void 0 ? {} : { actorMayWrite },
1039
1067
  ...isApprover === void 0 ? {} : { isApprover },
1040
1068
  ...permitted === void 0 ? {} : { permitted }
@@ -1070,7 +1098,7 @@ function authorizationProvider(options) {
1070
1098
  ...Object.keys(operations).length > 0 ? { operations } : {},
1071
1099
  ...Object.keys(delegated).length > 0 ? { delegation: { scopes: delegated } } : {},
1072
1100
  decidingColumns: manifest.decidingColumns,
1073
- tokenHook: tokenHookOf(manifest),
1101
+ ...hasTokenHook(manifest) ? { tokenHook: tokenHookOf(manifest) } : {},
1074
1102
  ...problems.length > 0 ? { problems } : {}
1075
1103
  });
1076
1104
  }
@@ -1106,7 +1134,10 @@ function decideWith(permdock, request) {
1106
1134
  if (!isPermission(action)) return denied("Unknown permission.");
1107
1135
  return outcomeOf(permdock.decide(action, request.resource.properties), action.key);
1108
1136
  }
1109
- /** The verified claims better-supabase passes in `subject.properties.claims`, for a user or a delegated agent. */
1137
+ /**
1138
+ * The verified claims better-supabase passes in `subject.properties.claims`,
1139
+ * for a user or a delegated agent.
1140
+ */
1110
1141
  function claimsOf(request) {
1111
1142
  const { subject } = request;
1112
1143
  if (subject.type !== "user" && subject.type !== "agent") return void 0;
@@ -1115,11 +1146,11 @@ function claimsOf(request) {
1115
1146
  }
1116
1147
  /**
1117
1148
  * better-supabase's `authorizer` for PermDock: every resource, action, route
1118
- * guard and MCP tool that declares a `permission` is decided with `decide`.
1119
- * The subject is mapped from the verified claims with
1120
- * `subjectFromBetterSupabase`; the request's `context.tenant` selects the
1121
- * active tenant only among the memberships the claims hold. A caller without
1122
- * claims is anonymous, and a throw denies.
1149
+ * guard and MCP tool that declares a `permission` is decided with `decide`. The
1150
+ * subject is mapped from the verified claims with `subjectFromBetterSupabase`;
1151
+ * the request's `context.tenant` selects the active tenant only among the
1152
+ * memberships the claims hold. A caller without claims is anonymous, and a
1153
+ * throw denies.
1123
1154
  */
1124
1155
  function authorizer(options) {
1125
1156
  const { operations } = options;
@@ -1176,7 +1207,10 @@ function authorizer(options) {
1176
1207
  }
1177
1208
  //#endregion
1178
1209
  //#region src/better-supabase/policies.ts
1179
- /** PermDock splits a key with row conditions into `key#1`, `key#2`, ... in the policies it generates. */
1210
+ /**
1211
+ * PermDock splits a key with row conditions into `key#1`, `key#2`, ... in the
1212
+ * policies it generates.
1213
+ */
1180
1214
  const SPLIT_KEY = /#\d+$/u;
1181
1215
  function checkedKey(where, permission, facts, scope) {
1182
1216
  const key = permission.key;
@@ -1228,11 +1262,10 @@ function target(options) {
1228
1262
  };
1229
1263
  }
1230
1264
  /**
1231
- * A better-supabase bucket `policy` that checks PermDock permissions with
1232
- * the `rls generate` helpers at `scope`. The helpers check role and scope
1233
- * only, so a permission with row conditions (`rowConditions: true` in the
1234
- * catalog, or a conditioned grant in `policy`), or one not granted at
1235
- * `scope`, throws.
1265
+ * A better-supabase bucket `policy` that checks PermDock permissions with the
1266
+ * `rls generate` helpers at `scope`. The helpers check role and scope only, so
1267
+ * a permission with row conditions (`rowConditions: true` in the catalog, or a
1268
+ * conditioned grant in `policy`), or one not granted at `scope`, throws.
1236
1269
  */
1237
1270
  function bucketPolicy(access, options) {
1238
1271
  const { facts, sql } = target(options);
@@ -1266,10 +1299,10 @@ function topicPolicy(access, options) {
1266
1299
  /**
1267
1300
  * `provider` with every `getToken`, `startAuthorization`,
1268
1301
  * `completeAuthorization` and `revoke` decided by PermDock first, on the
1269
- * `CredentialRef` as the row. Anything but `granted` is a `forbidden`
1270
- * error with hint `PERMDOCK_DENIED`, and a failed check is one too.
1271
- * `capabilities` and `verifyInbound` (a third party's request, with no
1272
- * user) pass through. Build it per request, with that request's PermDock.
1302
+ * `CredentialRef` as the row. Anything but `granted` is a `forbidden` error
1303
+ * with hint `PERMDOCK_DENIED`, and a failed check is one too. `capabilities`
1304
+ * and `verifyInbound` (a third party's request, with no user) pass through.
1305
+ * Build it per request, with that request's PermDock.
1273
1306
  */
1274
1307
  function credentialGuard(provider, options) {
1275
1308
  const allowed = async (permission, ref) => {
@@ -1303,10 +1336,10 @@ const refused = (reason) => ({
1303
1336
  });
1304
1337
  /**
1305
1338
  * The `authorize` and `visible` hooks of better-supabase's `createMcp`, for
1306
- * tools whose `meta` is a PermDock permission. A tool without a permission
1307
- * is hidden and refused. `authorize` grants only a `granted` decision: an
1308
- * approval-required call is refused, because `createMcp`
1309
- * has no approval flow. A throw anywhere refuses.
1339
+ * tools whose `meta` is a PermDock permission. A tool without a permission is
1340
+ * hidden and refused. `authorize` grants only a `granted` decision: an
1341
+ * approval-required call is refused, because `createMcp` has no approval flow.
1342
+ * A throw anywhere refuses.
1310
1343
  */
1311
1344
  function toolPolicy(options) {
1312
1345
  return Object.freeze({
@@ -1339,12 +1372,46 @@ function toolPolicy(options) {
1339
1372
  });
1340
1373
  }
1341
1374
  //#endregion
1375
+ //#region src/better-supabase/memberships.ts
1376
+ function isLiveRow(row, userId) {
1377
+ return isRecord(row) && row["user_id"] === userId && typeof row["organization_id"] === "string" && row["organization_id"] !== "" && typeof row["role"] === "string" && row["role"] !== "" && (row["disabled_at"] === void 0 || row["disabled_at"] === null);
1378
+ }
1379
+ /**
1380
+ * The principal `userId` is in the better-supabase organizations block: one
1381
+ * membership per organization, keyed on `organization_id`, holding the role of
1382
+ * each of the user's rows. Rows of another user, disabled rows and malformed
1383
+ * rows are dropped, so a user with none holds no membership.
1384
+ */
1385
+ function principalFromMemberships(userId, rows, options = {}) {
1386
+ const scope = options.scope ?? "tenant";
1387
+ const roles = /* @__PURE__ */ new Map();
1388
+ for (const row of rows) {
1389
+ if (!isLiveRow(row, userId)) continue;
1390
+ const held = roles.get(row.organization_id) ?? [];
1391
+ if (!held.includes(row.role)) held.push(row.role);
1392
+ roles.set(row.organization_id, held);
1393
+ }
1394
+ const memberships = [...roles].map(([id, names]) => ({
1395
+ scope,
1396
+ id,
1397
+ roles: names
1398
+ }));
1399
+ return freezeDeep(options.tenant === void 0 ? {
1400
+ id: userId,
1401
+ memberships
1402
+ } : {
1403
+ id: userId,
1404
+ memberships,
1405
+ tenant: options.tenant
1406
+ });
1407
+ }
1408
+ //#endregion
1342
1409
  //#region src/better-supabase/principals.ts
1343
1410
  /**
1344
1411
  * A `PrincipalSource` over better-supabase: `principal(id)` maps the claims
1345
1412
  * `claims` loads with `subjectFromBetterSupabase`, and `principalByIdentity`
1346
- * follows `identities` to a user or a contact. Claims for another user, a
1347
- * link to a non-contact principal and a missing link are `null`.
1413
+ * follows `identities` to a user or a contact. Claims for another user, a link
1414
+ * to a non-contact principal and a missing link are `null`.
1348
1415
  */
1349
1416
  function principalSource(options) {
1350
1417
  const principal = async (id, lookup = {}) => {
@@ -1369,26 +1436,95 @@ function principalSource(options) {
1369
1436
  });
1370
1437
  }
1371
1438
  //#endregion
1439
+ //#region src/better-supabase/role-order.ts
1440
+ /**
1441
+ * The catalog's role keys highest first, for better-supabase's
1442
+ * `blocks.sso.options.roleOrder`: a role that `assigns` another comes before
1443
+ * it, and roles the `assigns` lists do not order keep catalog order. Roles that
1444
+ * assign each other stay together in catalog order, at the first one's place.
1445
+ */
1446
+ function roleOrderFromCatalog(catalog, options = {}) {
1447
+ const roles = (catalog.roles ?? []).filter((role) => role.key !== options.owner && (options.scope === void 0 || role.on === options.scope));
1448
+ const keys = roles.map((role) => role.key);
1449
+ const assigns = new Map(roles.map((role) => [role.key, (role.assigns ?? []).filter((target) => target !== role.key && keys.includes(target))]));
1450
+ const reach = new Map(keys.map((key) => [key, reachable(key, assigns)]));
1451
+ const group = new Map(keys.map((key) => [key, keys.find((other) => other === key || reach.get(key)?.has(other) === true && reach.get(other)?.has(key) === true) ?? key]));
1452
+ const remaining = new Set(keys);
1453
+ const order = [];
1454
+ while (remaining.size > 0) {
1455
+ const ready = [...remaining].find((key) => {
1456
+ const own = group.get(key);
1457
+ return [...remaining].every((by) => group.get(by) === own || ![...remaining].some((target) => group.get(target) === own && (assigns.get(by) ?? []).includes(target)));
1458
+ });
1459
+ const own = group.get(ready ?? [...remaining][0] ?? "");
1460
+ for (const key of keys) if (remaining.has(key) && group.get(key) === own) {
1461
+ order.push(key);
1462
+ remaining.delete(key);
1463
+ }
1464
+ }
1465
+ return Object.freeze(order);
1466
+ }
1467
+ function reachable(from, assigns) {
1468
+ const seen = /* @__PURE__ */ new Set();
1469
+ const stack = [...assigns.get(from) ?? []];
1470
+ while (stack.length > 0) {
1471
+ const key = stack.pop();
1472
+ if (key !== void 0 && !seen.has(key)) {
1473
+ seen.add(key);
1474
+ stack.push(...assigns.get(key) ?? []);
1475
+ }
1476
+ }
1477
+ return seen;
1478
+ }
1479
+ //#endregion
1372
1480
  //#region src/better-supabase/share-links.ts
1373
1481
  const DEFAULT_TTL = 300;
1374
1482
  const MAX_TTL = 3600;
1375
1483
  function ownEntry(record, key) {
1376
1484
  return Object.hasOwn(record, key) ? record[key] : void 0;
1377
1485
  }
1486
+ function rowSubject(row) {
1487
+ if (!Object.hasOwn(row, "subject")) {
1488
+ const type = row["subjectType"];
1489
+ const id = row["subjectId"];
1490
+ return isId(type) && isId(id) ? {
1491
+ type,
1492
+ id
1493
+ } : void 0;
1494
+ }
1495
+ const subject = row["subject"];
1496
+ if (typeof subject !== "object" || subject === null) return void 0;
1497
+ const ref = Object.fromEntries(Object.entries(subject));
1498
+ const type = ref["type"];
1499
+ const id = ref["id"];
1500
+ return isId(type) && isId(id) ? {
1501
+ type,
1502
+ id
1503
+ } : void 0;
1504
+ }
1505
+ /** The row and its subject, or `undefined` for a malformed row. */
1506
+ function parseRow(value) {
1507
+ if (!isRow(value)) return void 0;
1508
+ const subject = rowSubject(Object.fromEntries(Object.entries(value)));
1509
+ return subject === void 0 ? void 0 : {
1510
+ row: value,
1511
+ subject
1512
+ };
1513
+ }
1378
1514
  function isRow(value) {
1379
1515
  if (typeof value !== "object" || value === null) return false;
1380
1516
  const row = Object.fromEntries(Object.entries(value));
1381
1517
  const expiresAt = row["expiresAt"];
1382
- return isId(row["id"]) && isId(row["organizationId"]) && isId(row["subjectType"]) && isId(row["subjectId"]) && typeof row["role"] === "string" && (row["versionId"] === void 0 || typeof row["versionId"] === "string") && (expiresAt === void 0 || typeof expiresAt === "object" && expiresAt !== null && "epochMilliseconds" in expiresAt && typeof expiresAt.epochMilliseconds === "number" && Number.isFinite(expiresAt.epochMilliseconds));
1518
+ return isId(row["id"]) && isId(row["organizationId"]) && rowSubject(row) !== void 0 && typeof row["role"] === "string" && (row["versionId"] === void 0 || typeof row["versionId"] === "string") && (expiresAt === void 0 || typeof expiresAt === "object" && expiresAt !== null && "epochMilliseconds" in expiresAt && typeof expiresAt.epochMilliseconds === "number" && Number.isFinite(expiresAt.epochMilliseconds));
1383
1519
  }
1384
1520
  /**
1385
- * Resolves a better-supabase share-link token into the `link` subject it
1386
- * acts as, for `exchangeCapability` and `--capabilities` RLS. The row is
1387
- * read on every call, so a revoked or expired link stops resolving at
1388
- * once. An unknown token, subject type or role, a malformed row, a broken
1389
- * link policy, a `resolve` error and a throw are the anonymous subject. So
1390
- * is a link pinned to a version: a capability grants the subject's current
1391
- * rows, so a pinned link reads through `versions.getShared(token)` instead.
1521
+ * Resolves a better-supabase share-link token into the `link` subject it acts
1522
+ * as, for `exchangeCapability` and `--capabilities` RLS. The row is read on
1523
+ * every call, so a revoked or expired link stops resolving at once. An unknown
1524
+ * token, subject type or role, a malformed row, a broken link policy, a
1525
+ * `resolve` error and a throw are the anonymous subject. So is a link pinned to
1526
+ * a version: a capability grants the subject's current rows, so a pinned link
1527
+ * reads through `versions.getShared(token)` instead.
1392
1528
  */
1393
1529
  async function subjectFromShareLink(token, options) {
1394
1530
  if (token === void 0 || token === null || token.length === 0) return anonymousSubject();
@@ -1402,17 +1538,19 @@ async function subjectFromShareLink(token, options) {
1402
1538
  return anonymousSubject();
1403
1539
  };
1404
1540
  let row;
1541
+ let subject;
1405
1542
  try {
1406
1543
  const resolved = await options.shareLinks.resolve(token);
1407
1544
  if (!resolved.ok) return deny("source-threw", "resolve-failed");
1408
1545
  if (resolved.data === null) return deny("invalid-token", "share-link-unknown");
1409
- if (!isRow(resolved.data)) return deny("schema", "share-link-malformed");
1410
- row = resolved.data;
1546
+ const parsed = parseRow(resolved.data);
1547
+ if (parsed === void 0) return deny("schema", "share-link-malformed");
1548
+ ({row, subject} = parsed);
1411
1549
  } catch {
1412
1550
  return deny("source-threw");
1413
1551
  }
1414
1552
  if (row.versionId !== void 0) return deny("invalid-token", "share-link-pinned");
1415
- const target = ownEntry(options.links, row.subjectType);
1553
+ const target = ownEntry(options.links, subject.type);
1416
1554
  if (target === void 0) return deny("invalid-token", "subject-type-unknown");
1417
1555
  const roles = idList(ownEntry(target.roles, row.role));
1418
1556
  if (roles === void 0 || roles.length === 0) return deny("unknown-role");
@@ -1427,7 +1565,7 @@ async function subjectFromShareLink(token, options) {
1427
1565
  id: row.id,
1428
1566
  on: {
1429
1567
  resource: target.resource,
1430
- id: row.subjectId
1568
+ id: subject.id
1431
1569
  },
1432
1570
  roles,
1433
1571
  expiresAt
@@ -1445,7 +1583,10 @@ async function subjectFromShareLink(token, options) {
1445
1583
  }
1446
1584
  //#endregion
1447
1585
  //#region src/better-supabase/workflow.ts
1448
- /** Whether `permdock` is granted the permission `key` (a catalog key or scope) with no row. */
1586
+ /**
1587
+ * Whether `permdock` is granted the permission `key` (a catalog key or scope)
1588
+ * with no row.
1589
+ */
1449
1590
  function grants(permdock, key) {
1450
1591
  try {
1451
1592
  const permission = findPermission(permdock.permissions, key);
@@ -1456,9 +1597,9 @@ function grants(permdock, key) {
1456
1597
  }
1457
1598
  /**
1458
1599
  * The `can` option of better-supabase's `authorizeHook`, for the caller's
1459
- * `permdock`: `true` only when the caller is a member of the hook's tenant
1460
- * and `decide` grants the permission its `hookMetadata` names there. An
1461
- * unknown key, `approval-required` and a throw are `false`.
1600
+ * `permdock`: `true` only when the caller is a member of the hook's tenant and
1601
+ * `decide` grants the permission its `hookMetadata` names there. An unknown
1602
+ * key, `approval-required` and a throw are `false`.
1462
1603
  */
1463
1604
  function hookCan(permdock) {
1464
1605
  return (tenant, key) => {
@@ -1470,10 +1611,10 @@ function hookCan(permdock) {
1470
1611
  };
1471
1612
  }
1472
1613
  /**
1473
- * The `can` option of better-supabase's `protectWebHandler`: `undefined`
1474
- * (401) when the request has no signed-in principal or `getPermDock`
1475
- * throws, otherwise whether `decide` grants the permission in the request's
1476
- * active tenant. An unknown key and `approval-required` are `false` (403).
1614
+ * The `can` option of better-supabase's `protectWebHandler`: `undefined` (401)
1615
+ * when the request has no signed-in principal or `getPermDock` throws,
1616
+ * otherwise whether `decide` grants the permission in the request's active
1617
+ * tenant. An unknown key and `approval-required` are `false` (403).
1477
1618
  */
1478
1619
  function handlerCan(source) {
1479
1620
  return async (request, key) => {
@@ -1488,4 +1629,4 @@ function handlerCan(source) {
1488
1629
  };
1489
1630
  }
1490
1631
  //#endregion
1491
- export { accessReviewApplier, apiKeyClaimOptions, apiKeyVerifier, authorizationHooks, authorizationProvider, authorizer, bucketPolicy, credentialGuard, handlerCan, hookCan, principalSource, subjectFromBetterSupabase, subjectFromShareLink, subscriberPolicy, supportPolicy, toolPolicy, topicPolicy };
1632
+ export { accessReviewApplier, apiKeyClaimOptions, apiKeyVerifier, authorizationHooks, authorizationProvider, authorizer, bucketPolicy, credentialGuard, handlerCan, hookCan, principalFromMemberships, principalSource, roleOrderFromCatalog, subjectFromBetterSupabase, subjectFromShareLink, subscriberPolicy, supportPolicy, toolPolicy, topicPolicy };