permdock 0.7.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 (483) hide show
  1. package/README.md +1 -3
  2. package/dist/a2a/index.d.ts +7 -7
  3. package/dist/a2a/index.js +8 -8
  4. package/dist/action-result-CL-QCITA.d.ts +19 -0
  5. package/dist/{adapter-context-CRhqyzCk.js → adapter-context-CIQpQxbE.js} +8 -2
  6. package/dist/{adoption-scan-D-feE7BE.js → adoption-scan-BLs67P1l.js} +5 -5
  7. package/dist/agent/index.d.ts +2 -2
  8. package/dist/agent/index.js +1 -1
  9. package/dist/ai-sdk/index.d.ts +19 -13
  10. package/dist/ai-sdk/index.js +6 -6
  11. package/dist/{app-data-MuyzVqX8.js → app-data-UNNm07jV.js} +10 -7
  12. package/dist/{approval-header-CJACtHkv.js → approval-header-8QV6MU4H.js} +6 -3
  13. package/dist/{approval-prompt-Dg5LeAcT.js → approval-prompt-B8hQY69x.js} +5 -6
  14. package/dist/{approval-prompt-K0faOLFp.d.ts → approval-prompt-PYagyQUj.d.ts} +13 -11
  15. package/dist/approvals/index.d.ts +4 -4
  16. package/dist/approvals/index.js +6 -6
  17. package/dist/{approvals-CMRfsbBh.js → approvals-DnIBTuXE.js} +66 -42
  18. package/dist/{approvers-CqPOLD-o.js → approvers-B4r0N_Uz.js} +8 -2
  19. package/dist/{arazzo-ClrF3PVb.js → arazzo-3RhGfkAK.js} +2 -2
  20. package/dist/{arazzo-rdeJ8n1J.js → arazzo-B5-ulWif.js} +6 -6
  21. package/dist/{args-CC3OwyHW.js → args-0FrVs5EH.js} +14 -7
  22. package/dist/astro/index.d.ts +30 -12
  23. package/dist/astro/index.js +2 -2
  24. package/dist/{audience-BrMs8c4o.js → audience-BAkBDMqn.js} +8 -8
  25. package/dist/{auth-CscUX8Sy.js → auth--yPyZNgr.js} +19 -7
  26. package/dist/authzen/index.d.ts +34 -28
  27. package/dist/authzen/index.js +23 -20
  28. package/dist/{automation-DOtAFWdy.d.ts → automation-DqEoWHBc.d.ts} +42 -32
  29. package/dist/{automation-ySsxp_Yp.js → automation-x3KEUusw.js} +22 -21
  30. package/dist/better-auth/index.d.ts +2 -2
  31. package/dist/better-auth/index.js +13 -7
  32. package/dist/better-supabase/index.d.ts +357 -227
  33. package/dist/better-supabase/index.js +219 -140
  34. package/dist/{bind-JDuvxjuW.d.ts → bind-Cp2hBHzP.d.ts} +27 -12
  35. package/dist/{bind-D1nO6fiC.js → bind-D_sZSVA3.js} +22 -10
  36. package/dist/{body-CH5of8Ne.js → body-CJQwYVa8.js} +3 -3
  37. package/dist/{body-text-QcXok_SI.js → body-text-DQhcmqdY.js} +8 -4
  38. package/dist/{boundary-BM8a_P6E.js → boundary-BV3O1eud.js} +8 -2
  39. package/dist/{boundary-BmHxVH1J.d.ts → boundary-C9ck-3uK.d.ts} +13 -4
  40. package/dist/{budget-NbEtbJC_.js → budget-BELja5A9.js} +6 -3
  41. package/dist/{budget-JqcRqyhK.d.ts → budget-hYsPz_yE.d.ts} +6 -3
  42. package/dist/{build-instance-DxE7czo9.js → build-instance-CNWaYJyr.js} +3 -3
  43. package/dist/{capability-L7NnfhiE.js → capability-BqX94r07.js} +31 -25
  44. package/dist/{capability-D4UC9TTW.d.ts → capability-ChuiONQU.d.ts} +41 -29
  45. package/dist/{casbin-BW9pS47J.js → casbin-H0rKxBx2.js} +16 -8
  46. package/dist/{casbin-BHijLuHY.js → casbin-cbSbhT_k.js} +2 -2
  47. package/dist/{casl-CmJlgziS.js → casl-C4OINZHI.js} +2 -2
  48. package/dist/{casl-UbI8v-Wq.js → casl-CHHoCldP.js} +19 -10
  49. package/dist/catalog/index.d.ts +51 -30
  50. package/dist/catalog/index.js +18 -15
  51. package/dist/{catalog-D69WhFii.js → catalog-BFpz2EmT.js} +20 -19
  52. package/dist/{catalog-BaMQfQ6Y.js → catalog-DCspHDc8.js} +3 -3
  53. package/dist/{catalog-doc-CV9s6B1S.js → catalog-doc-DjMKzJp9.js} +28 -14
  54. package/dist/{catalog-fingerprint-C144oW4M.js → catalog-fingerprint-e6aCWosn.js} +18 -14
  55. package/dist/catalog-mRQQQhNK.js +1 -0
  56. package/dist/catalog-operations-Dadrl7Z-.js +60 -0
  57. package/dist/{challenge-nGWma08S.js → challenge-DImNcR7B.js} +48 -27
  58. package/dist/chat/index.d.ts +1 -1
  59. package/dist/chat/index.js +13 -10
  60. package/dist/chat-sdk/index.d.ts +44 -26
  61. package/dist/chat-sdk/index.js +17 -17
  62. package/dist/{checks-BC_0mPIq.js → checks-CGkP3Z7A.js} +4 -1
  63. package/dist/{claims-map-7oQ3ue4X.js → claims-map-CKkoAAYF.js} +5 -2
  64. package/dist/{claims-map-Ca-QX8C6.d.ts → claims-map-D1Pb5oRq.d.ts} +8 -5
  65. package/dist/claude-agent/index.d.ts +6 -6
  66. package/dist/claude-agent/index.js +6 -3
  67. package/dist/clerk/index.d.ts +11 -7
  68. package/dist/clerk/index.js +6 -6
  69. package/dist/cli/bin.js +4 -4
  70. package/dist/cli/index.d.ts +82 -7
  71. package/dist/cli/index.js +6 -6
  72. package/dist/{clients-C7zLFuWT.d.ts → clients-C_NOET3z.d.ts} +5 -5
  73. package/dist/{clients-DjU5ABMy.js → clients-DYr3U86j.js} +3 -3
  74. package/dist/cloud/index.d.ts +84 -52
  75. package/dist/cloud/index.js +53 -39
  76. package/dist/{cloud-CO8pYtwr.js → cloud-BFlGMaak.js} +4 -5
  77. package/dist/{codemod-i4N2BhDc.js → codemod-DLQ9Zpo4.js} +3 -4
  78. package/dist/{codemod-BP6n8N9L.js → codemod-DWSN2erG.js} +523 -201
  79. package/dist/collect-B5BL3klN.js +1 -0
  80. package/dist/{collect-BaWeMjwV.js → collect-B7ZFAJU3.js} +26 -63
  81. package/dist/{collect-DNm3oKOk.js → collect-Bzv3le0A.js} +4 -5
  82. package/dist/{compare-pfyVnBjE.js → compare-DTfyUunF.js} +2 -2
  83. package/dist/compile/index.d.ts +2 -2
  84. package/dist/compile/index.js +1 -1
  85. package/dist/{compile-COM2VKuN.d.ts → compile-BFzysW3o.d.ts} +36 -12
  86. package/dist/{compile-BAEO5bOk.js → compile-EzEMB-7v.js} +77 -33
  87. package/dist/{completion-BNdVf7X2.js → completion-saoYiRFO.js} +17 -8
  88. package/dist/config-BwPBfN0t.js +108 -0
  89. package/dist/{config-DGZzMV1B.js → config-DBeXXmBF.js} +2 -2
  90. package/dist/{config-report-Cm7UITNA.js → config-report-BipSWA6V.js} +9 -6
  91. package/dist/config-shape-ykV0Vm2n.js +134 -0
  92. package/dist/{connection-DjhIJSs2.js → connection-B72dg5Q2.js} +23 -22
  93. package/dist/{connector-schema-_VCSsdtD.js → connector-schema-CYLQNMYq.js} +3 -2
  94. package/dist/{context--uM9V3Ui.js → context-BnIzxTNE.js} +4 -3
  95. package/dist/convex/index.d.ts +13 -7
  96. package/dist/convex/index.js +9 -6
  97. package/dist/{core-B5-w6Kw9.js → core-H-mbhpZc.js} +26 -20
  98. package/dist/{core-CQkE8Esr.d.ts → core-hWIARPDz.d.ts} +49 -22
  99. package/dist/{create-UTnUVETj.d.ts → create-BSNrVuxh.d.ts} +70 -37
  100. package/dist/{create-B2-CQqCI.d.ts → create-BVq1lNQE.d.ts} +49 -28
  101. package/dist/{create-QHuuPw3q.d.ts → create-CM1FciYG.d.ts} +37 -29
  102. package/dist/{create-Cb86Z8Im.js → create-Cq4Uox0f.js} +10 -7
  103. package/dist/{create-DJrlhEp9.js → create-_noSrY1T.js} +15 -21
  104. package/dist/{credential-CIM7wHwA.js → credential-CyyyvCsL.js} +41 -38
  105. package/dist/{credentials-BpuTwd7a.js → credentials-CdDxp7jN.js} +6 -6
  106. package/dist/{deciding-columns-DRo2QM6E.js → deciding-columns-NB4wcyBf.js} +2 -2
  107. package/dist/{delegation-C5rOdTp5.js → delegation-CDB6_keF.js} +31 -22
  108. package/dist/delivery/index.d.ts +4 -4
  109. package/dist/delivery/index.js +5 -5
  110. package/dist/{delivery-rwOKLWRm.js → delivery-BupfvJIV.js} +34 -22
  111. package/dist/{delivery-event-xX4obB8F.js → delivery-event-JioK5YbS.js} +6 -6
  112. package/dist/denied-text-CHNlVInN.d.ts +22 -0
  113. package/dist/{describe-DZlnEtLy.js → describe-Bb4hGK5d.js} +5 -5
  114. package/dist/{describe-O0SwYIK8.d.ts → describe-ByS9LgHK.d.ts} +5 -5
  115. package/dist/{device-BARQ8eYG.js → device-BwbJNmb2.js} +11 -8
  116. package/dist/{diff-Btr1c1Ow.js → diff-CN8IYhC_.js} +2 -2
  117. package/dist/{diff-DzT-xD13.js → diff-iZWV65nC.js} +22 -13
  118. package/dist/{digest-B3kc_PgQ.d.ts → digest-8Yx2CchM.d.ts} +3 -3
  119. package/dist/{doctor-BU1szn63.js → doctor-CHD1M9R5.js} +287 -135
  120. package/dist/{doctor-BoK_y0KO.js → doctor-D3wo-yuz.js} +4 -4
  121. package/dist/drizzle/index.d.ts +33 -19
  122. package/dist/drizzle/index.js +17 -9
  123. package/dist/elysia/index.d.ts +17 -11
  124. package/dist/elysia/index.js +5 -5
  125. package/dist/{errors-BKy0EfhN.js → errors-B6R_lg2a.js} +13 -4
  126. package/dist/{errors-BWXBMaKK.d.ts → errors-CHwoRRpB.d.ts} +4 -1
  127. package/dist/{errors-DpP_U6Bf.js → errors-Vpu6rKHl.js} +13 -10
  128. package/dist/{errors-B_Qg9D3e.d.ts → errors-zi_4T-rx.d.ts} +22 -6
  129. package/dist/{evaluate-B_oqFbWC.js → evaluate-Dd8Ta0Ie.js} +140 -78
  130. package/dist/{evaluations-DReoiVBw.js → evaluations-IBceAeKT.js} +40 -19
  131. package/dist/{evaluations-BCddEOfO.d.ts → evaluations-z8dQFDaN.d.ts} +11 -5
  132. package/dist/eve/index.d.ts +9 -6
  133. package/dist/eve/index.js +4 -4
  134. package/dist/{event-time-CsegxXxB.js → event-time-BGy48400.js} +8 -4
  135. package/dist/{expiry-D4_YKRKD.js → expiry-6XByK0dm.js} +8 -5
  136. package/dist/express/index.d.ts +9 -6
  137. package/dist/express/index.js +9 -6
  138. package/dist/fastify/index.d.ts +16 -10
  139. package/dist/fastify/index.js +8 -5
  140. package/dist/{fetch-adapter-CuhyYwC1.d.ts → fetch-adapter-C1DCvpqV.d.ts} +9 -6
  141. package/dist/{fetch-adapter-De-u6vhJ.js → fetch-adapter-JL43jD3E.js} +14 -11
  142. package/dist/fields-D0vUI6dq.js +498 -0
  143. package/dist/{files-acUbNwWt.js → files-B3AA05f1.js} +8 -5
  144. package/dist/{files-D_JIzUrP.js → files-BSjrtIHw.js} +11 -4
  145. package/dist/{fixtures-BTMW6zgU.js → fixtures-A1_sp_tR.js} +15 -6
  146. package/dist/{flags-aaeRAdiD.js → flags-DXjoTVbS.js} +2 -2
  147. package/dist/{freeze-CrU8nQeX.js → freeze-jjan0lCv.js} +4 -1
  148. package/dist/{from-snapshot-Bz469dIh.js → from-snapshot-DCakWRsr.js} +18 -15
  149. package/dist/gen-B5kvbAoZ.js +58 -0
  150. package/dist/gen-DWCYcMQM.js +827 -0
  151. package/dist/{generate-3FNO5P5Q.js → generate-CRVV5V7l.js} +14 -8
  152. package/dist/generate-CezbCaTI.js +275 -0
  153. package/dist/{grantee-BrRANrpT.js → grantee-Dke-9rd1.js} +4 -4
  154. package/dist/{grantee-conditions-C6P1Tvol.js → grantee-conditions-BrYPe-w0.js} +12 -12
  155. package/dist/{grantee-match-0RtHWQDx.js → grantee-match-7RZZvoT_.js} +12 -6
  156. package/dist/{graph-sql-B-dsAT6j.d.ts → graph-sql-BwFC4Qjs.d.ts} +3 -3
  157. package/dist/h3/index.d.ts +10 -7
  158. package/dist/h3/index.js +3 -3
  159. package/dist/headers-B9jQxjtW.d.ts +10 -0
  160. package/dist/{helpers-DY3vXuGs.js → helpers-DJicaG6f.js} +40 -28
  161. package/dist/hono/index.d.ts +16 -10
  162. package/dist/hono/index.js +5 -5
  163. package/dist/{hosted-BmjzxQhp.d.ts → hosted-Cmtxogd0.d.ts} +33 -21
  164. package/dist/{hosted-XBgU6RGT.js → hosted-D0IzESu_.js} +42 -21
  165. package/dist/{http-ujKm0JXE.js → http-DH94eh6f.js} +4 -4
  166. package/dist/{http-BBoKefeS.js → http-DKLXrFGk.js} +13 -7
  167. package/dist/{http-Ca3Sr5x1.js → http-DOL33cO0.js} +11 -8
  168. package/dist/{import-Bz0GefWg.js → import-CST57XLp.js} +64 -51
  169. package/dist/{import-DB2EG_iy.js → import-_YqhhwvX.js} +6 -6
  170. package/dist/{index-BSfRl0hZ.d.ts → index-B8s204GL.d.ts} +64 -52
  171. package/dist/{index-DH9DUDEM.d.ts → index-BT5-1VsX.d.ts} +54 -30
  172. package/dist/{index-BTkwrK7v.d.ts → index-BW_0MZOS.d.ts} +282 -172
  173. package/dist/{index-CMiPH2Tv.d.ts → index-BhxEUY9J.d.ts} +64 -37
  174. package/dist/{index-DLwcuCN_.d.ts → index-Bv5iXPqU.d.ts} +51 -30
  175. package/dist/{index-BE8y3moU.d.ts → index-_9UiQIkt.d.ts} +127 -82
  176. package/dist/index.d.ts +22 -22
  177. package/dist/index.js +33 -33
  178. package/dist/{init-5TXNji88.js → init-Dz_PsHdv.js} +5 -5
  179. package/dist/{init-B-4t1NzC.js → init-cE3A8aXq.js} +10 -10
  180. package/dist/{instance-options-CU0YQCLH.d.ts → instance-options-B0KXqTrJ.d.ts} +4 -4
  181. package/dist/{instance-snapshot-CjcwnEiV.js → instance-snapshot--JWiTrvO.js} +75 -55
  182. package/dist/{instant-BluqDvyS.js → instant-DK3Iz83e.js} +2 -2
  183. package/dist/{internals-Dk8A8fX3.js → internals-B3IgHrvo.js} +6 -3
  184. package/dist/{json-schema-B-vAwlde.js → json-schema-BPGa-RjQ.js} +9 -3
  185. package/dist/{json-schema-CN_iLFH2.d.ts → json-schema-BfXgnRNT.d.ts} +4 -4
  186. package/dist/jwt/index.d.ts +57 -27
  187. package/dist/jwt/index.js +24 -21
  188. package/dist/{kernel-DVExUwkp.js → kernel-C-fYydV2.js} +32 -23
  189. package/dist/kysely/index.d.ts +49 -33
  190. package/dist/kysely/index.js +9 -7
  191. package/dist/{live-options-BaAFCIiu.js → live-options-BBIT68le.js} +2 -2
  192. package/dist/{load-DxroEzH1.js → load-DjSU5KXO.js} +6 -6
  193. package/dist/load-Dm0pSYH3.js +1 -0
  194. package/dist/{login-ClSJh5t5.js → login-D-8tMqzo.js} +4 -4
  195. package/dist/{login-WC9HPJpU.js → login-DplQ0s84.js} +16 -9
  196. package/dist/{manifest-Dv6q4i5s.js → manifest-Cgiq5oqc.js} +49 -38
  197. package/dist/{manifest-BVhExYhw.d.ts → manifest-CzzWtnAb.d.ts} +126 -31
  198. package/dist/{manifest-schema-Cv492Qev.js → manifest-schema-2r37XRhD.js} +44 -3
  199. package/dist/{manifest-B79YuF2T.js → manifest-wg8WkkpD.js} +6 -6
  200. package/dist/{map-claims-etGIS_Dv.js → map-claims-BNWCJtmP.js} +14 -8
  201. package/dist/{map-error-BQGyDm_M.js → map-error-pasIGqMT.js} +7 -7
  202. package/dist/{markers-C6joDI3o.js → markers-BeHZ4x9Q.js} +20 -5
  203. package/dist/mcp/index.d.ts +114 -61
  204. package/dist/mcp/index.js +70 -40
  205. package/dist/{migrate-Dodel0IJ.js → migrate-B7oP_sQU.js} +35 -17
  206. package/dist/module-values-BJTBdo6y.js +107 -0
  207. package/dist/nest/index.d.ts +23 -13
  208. package/dist/nest/index.js +18 -11
  209. package/dist/next/client.d.ts +5 -2
  210. package/dist/next/client.js +1 -1
  211. package/dist/next/index.d.ts +72 -26
  212. package/dist/next/index.js +110 -6
  213. package/dist/next/plugin.d.ts +1 -1
  214. package/dist/next/plugin.js +4 -3
  215. package/dist/node/index.d.ts +5 -5
  216. package/dist/node/index.js +3 -3
  217. package/dist/{ocsf-BFp-PZZA.js → ocsf-TcjRBgIs.js} +15 -5
  218. package/dist/openai/index.d.ts +13 -7
  219. package/dist/openai/index.js +3 -3
  220. package/dist/openapi/index.d.ts +51 -30
  221. package/dist/openapi/index.js +2 -2
  222. package/dist/{openapi-Ddb4628T.js → openapi-BOsx0xn9.js} +33 -18
  223. package/dist/{openapi-DMocl1bh.js → openapi-CBZUhA3l.js} +4 -5
  224. package/dist/{openapi-ztVaux6j.js → openapi-VeHHU2l9.js} +23 -14
  225. package/dist/{operation-findings-kRcEp8lE.js → operation-findings-CXtFzlKJ.js} +3 -3
  226. package/dist/{operations-BNLes61x.d.ts → operations-Ci_rT6Uo.d.ts} +10 -7
  227. package/dist/orpc/index.d.ts +68 -14
  228. package/dist/orpc/index.js +62 -13
  229. package/dist/otel/index.d.ts +7 -4
  230. package/dist/otel/index.js +8 -5
  231. package/dist/output-files-BHOIlrfD.js +1 -0
  232. package/dist/{output-files-CCMdcFWb.js → output-files-BIQ_9pIs.js} +29 -17
  233. package/dist/{output-DgSDLrta.js → output-tkju6U7R.js} +9 -5
  234. package/dist/ownership-B4L59T9u.js +1054 -0
  235. package/dist/{parse-Ddhz2xf4.js → parse-1_ZheTW5.js} +16 -13
  236. package/dist/parse-local-manifest-BQhTlLQS.d.ts +10 -0
  237. package/dist/{parse-local-manifest-T1Q8X3A2.js → parse-local-manifest-DEiCF4ah.js} +19 -7
  238. package/dist/{parse-request-D_tUXG6M.js → parse-request-CwCZpyjV.js} +7 -8
  239. package/dist/{paths-DXSHAMIa.js → paths-CUvURzHp.js} +4 -1
  240. package/dist/pdp/index.d.ts +9 -6
  241. package/dist/pdp/index.js +20 -13
  242. package/dist/{peer-DOzzMfZL.js → peer-C9LvBCcb.js} +1 -1
  243. package/dist/{peer-12Q5I_RH.js → peer-Q0fuZ6hx.js} +9 -3
  244. package/dist/{permdock-Dco6dyCK.d.ts → permdock-B6Sf4T_S.d.ts} +253 -129
  245. package/dist/{permdock-BfWEeMqk.js → permdock-L-_I_3zP.js} +59 -35
  246. package/dist/{permission-registry-DpPtSKNZ.js → permission-registry-B8tYxPIt.js} +23 -10
  247. package/dist/{permission-types-DhNEmoRG.d.ts → permission-types-CAY-GU7e.d.ts} +127 -41
  248. package/dist/{permissions-CoqCOfJ3.d.ts → permissions-Bx6UI8n1.d.ts} +6 -3
  249. package/dist/{permissions-CyH2MV_B.js → permissions-CVXmRILq.js} +3 -3
  250. package/dist/{permissions-DArULThq.js → permissions-mDcTWoBs.js} +8 -5
  251. package/dist/pg-DQTqRrou.js +60 -0
  252. package/dist/{pins-8ILTftC9.js → pins-nqarl3oE.js} +4 -1
  253. package/dist/{pkce-5h8NgMQJ.js → pkce-CnmmYqUZ.js} +1 -1
  254. package/dist/{policy-B7dg_yzu.d.ts → policy-Ba4bDhaj.d.ts} +5 -5
  255. package/dist/{policy-DaJy4nK4.js → policy-CLQ8__GF.js} +43 -23
  256. package/dist/{policy-from-catalog-DFWYkNdu.js → policy-from-catalog-CJgOm6aq.js} +28 -25
  257. package/dist/{policy-module-CTlwMvLI.js → policy-module-xym9fnSq.js} +12 -6
  258. package/dist/{policy-types-B-F-qAZk.d.ts → policy-types-CCiDRZBH.d.ts} +738 -349
  259. package/dist/{postgres-store-BL9M_CA1.js → postgres-store-DcyrPS-r.js} +43 -16
  260. package/dist/{postgrest-r5faDIzD.js → postgrest-D4nuPXIQ.js} +52 -33
  261. package/dist/{postgrest-CYacM_u7.d.ts → postgrest-DicQyqm-.d.ts} +54 -35
  262. package/dist/{powersync-53ryOZip.js → powersync-DHNQX06W.js} +127 -69
  263. package/dist/{powersync-13odBwiM.js → powersync-DXqGuq9A.js} +3 -3
  264. package/dist/powersync-Djf-zCpB.js +1 -0
  265. package/dist/preset/index.d.ts +38 -28
  266. package/dist/preset/index.js +1 -1
  267. package/dist/{preset-CHTbd-DQ.js → preset-BjLzeFpp.js} +56 -32
  268. package/dist/{principal-source-pHneukrx.js → principal-source-C6N60GtM.js} +10 -10
  269. package/dist/prisma/index.d.ts +69 -41
  270. package/dist/prisma/index.js +21 -17
  271. package/dist/{problem-CTviyH5L.js → problem-BVLHFK33.js} +41 -21
  272. package/dist/{problem-details-cn5X30gZ.js → problem-details-CLDgX1KV.js} +13 -4
  273. package/dist/{problem-types-CJ2325SZ.js → problem-types-DSsRfONQ.js} +4 -1
  274. package/dist/{prompt-DwtVemER.js → prompt-BYc6drYW.js} +4 -1
  275. package/dist/protected-action-BE7N_Luo.d.ts +58 -0
  276. package/dist/protected-action-DUYqb-Ma.js +80 -0
  277. package/dist/{protected-DXE3cQYg.js → protected-action-QEA8arRB.js} +48 -14
  278. package/dist/{provider-BQsTYYy0.js → provider-C55OGXJ7.js} +5 -4
  279. package/dist/{provider-Csk-THAn.d.ts → provider-DXfq5c2d.d.ts} +1 -1
  280. package/dist/{provider-store-IgqQipCO.js → provider-store-CaTv00tr.js} +13 -9
  281. package/dist/pull-B65ndFNZ.js +1 -0
  282. package/dist/{pull-CN5OLxrF.js → pull-CwpGaQSi.js} +12 -11
  283. package/dist/{push-tVdG8dUL.js → push-DgssgzkK.js} +19 -13
  284. package/dist/{pushed-policy-BbcY9r_4.d.ts → pushed-policy-D1Eoi6NM.d.ts} +12 -6
  285. package/dist/{pushed-policy-CmYeSQqq.js → pushed-policy-ITwYKvvH.js} +10 -7
  286. package/dist/react/index.d.ts +9 -8
  287. package/dist/react/index.js +7 -6
  288. package/dist/react/provider-client.d.ts +1 -1
  289. package/dist/react/provider-client.js +1 -1
  290. package/dist/react-native/index.d.ts +94 -55
  291. package/dist/react-native/index.js +200 -61
  292. package/dist/{refs-CNJBiTFo.js → refs-C8BKxc_e.js} +2 -2
  293. package/dist/{relation-walk-3OyDBF0S.js → relation-walk-DK_gkgL7.js} +12 -9
  294. package/dist/{relations-BnCWnJGI.js → relations-BxvRvDHK.js} +3 -3
  295. package/dist/{replay-Du1tJjG7.js → replay-BU09ad4L.js} +1 -1
  296. package/dist/{replay-DCDD_ZfL.d.ts → replay-DNftIb_R.d.ts} +1 -1
  297. package/dist/{request-context-BykKLmyE.js → request-context-C25ilqiJ.js} +8 -8
  298. package/dist/{request-schema-CMreVuFM.js → request-schema-DhX7UbfQ.js} +4 -1
  299. package/dist/resend/index.d.ts +34 -28
  300. package/dist/resend/index.js +29 -29
  301. package/dist/resolve-names-CF7xXLSG.js +201 -0
  302. package/dist/{resource-relations-D_jw0BFx.js → resource-relations-8-pCScBO.js} +18 -9
  303. package/dist/{retire-Wj6dkyDE.js → retire-B2xffQgY.js} +15 -6
  304. package/dist/{revocations-R07lFBnX.d.ts → revocations-BaUXHM1N.d.ts} +6 -3
  305. package/dist/{rls-CxBZb4rZ.js → rls-CNEH2_BG.js} +299 -124
  306. package/dist/{rls-Ck_PocSp.js → rls-Ca8Jz9b5.js} +13 -6
  307. package/dist/{role-builder-C1VJzvcr.js → role-builder-BK2-T6oD.js} +41 -20
  308. package/dist/{row-conditions-h2HythXQ.js → row-conditions-BAGHOmVq.js} +4 -3
  309. package/dist/{rpc-Bk1bE-ch.js → rpc-fNqAIqQk.js} +8 -5
  310. package/dist/{run-uLD2aWuO.js → run-Bz26OTfO.js} +26 -23
  311. package/dist/run-D-JE8QWb.js +1 -0
  312. package/dist/{run-ticket-BpNi7BCi.d.ts → run-ticket-DbWI9f99.d.ts} +29 -14
  313. package/dist/{run-ticket-B5d_63Ma.js → run-ticket-Dv7aF7Dk.js} +9 -9
  314. package/dist/{runtime-Vif3_-zf.js → runtime-BGnrOkVH.js} +5 -2
  315. package/dist/{saas-Az_Kz-4D.js → saas-iWnUdwCt.js} +42 -29
  316. package/dist/{scan-DSljDE1Y.js → scan-DCj1KQfn.js} +1 -1
  317. package/dist/{schema-B4v0Qrac.js → schema-BOJjqlWL.js} +3 -2
  318. package/dist/{schema-gIcCx7zM.js → schema-Dst9I9Gs.js} +8 -4
  319. package/dist/scim/index.d.ts +2 -2
  320. package/dist/scim/index.js +2 -2
  321. package/dist/{scim-C7JYhySg.js → scim-D8YupzX1.js} +2 -2
  322. package/dist/{scim-YNieBO1U.js → scim-jJBJ7g1Z.js} +33 -15
  323. package/dist/{scopes-BHsc-wp-.js → scopes-0Up_UA2t.js} +41 -23
  324. package/dist/server/index.d.ts +11 -11
  325. package/dist/server/index.js +12 -12
  326. package/dist/{server-Bnga6I50.js → server-3cVlTLde.js} +31 -31
  327. package/dist/{server-types-C4gZUEZy.d.ts → server-types-CIlpSA2G.d.ts} +81 -46
  328. package/dist/{sha256-D9ihqmvd.js → sha256-C-4WXKIu.js} +4 -3
  329. package/dist/{shared-fMKOv8hP.js → shared-Afctg7B0.js} +65 -32
  330. package/dist/{shared-C8LjUdVU.js → shared-l0oGGetg.js} +9 -6
  331. package/dist/{signals-D3NcTKUS.js → signals-B1vHR3fN.js} +2 -2
  332. package/dist/{sink-BEZSlMS_.js → sink-D9_vh372.js} +32 -21
  333. package/dist/{sink-Cp_Eot9W.d.ts → sink-Dvi7YZG_.d.ts} +44 -20
  334. package/dist/{skills-Dcjw9_1C.js → skills-Bjj7BNEQ.js} +12 -8
  335. package/dist/{skills-g_3BS9NC.js → skills-OuoMR49L.js} +3 -3
  336. package/dist/{snapshot-CbGmYiJx.js → snapshot-CXlzi69u.js} +21 -18
  337. package/dist/{snapshot-cache-Pahd3IYJ.d.ts → snapshot-cache-BAXZ0KOp.d.ts} +21 -12
  338. package/dist/{snapshot-cache-DT2Kx1F8.js → snapshot-cache-Bx_4xC_6.js} +14 -11
  339. package/dist/solid/index.d.ts +55 -16
  340. package/dist/solid/index.js +46 -12
  341. package/dist/solid-start/index.d.ts +30 -12
  342. package/dist/solid-start/index.js +3 -3
  343. package/dist/{sources-DEEuGb8S.d.ts → sources-B1Os_YUu.d.ts} +126 -53
  344. package/dist/{sources-B-zYB4GS.js → sources-CMAM-2A3.js} +46 -27
  345. package/dist/{sql-B96movIM.js → sql-0WjxIp9g.js} +28 -7
  346. package/dist/{sql-CDEPCA0g.d.ts → sql-B80DFdpG.d.ts} +2 -2
  347. package/dist/{src-DLFrtrrC.js → src-DZ0l9UAg.js} +190 -100
  348. package/dist/ssf/index.d.ts +3 -3
  349. package/dist/ssf/index.js +47 -35
  350. package/dist/{standard-webhooks-B_qRg0ws.d.ts → standard-webhooks-C-qX4mJW.d.ts} +7 -7
  351. package/dist/{standard-webhooks-DgFFD-Ga.js → standard-webhooks-D67a3nzk.js} +5 -5
  352. package/dist/{store-DSP9oGvh.js → store-RNFvaJJv.js} +32 -26
  353. package/dist/{store-options-B_poyYvg.js → store-options-Dil3lraY.js} +105 -15
  354. package/dist/stores-C0Kta5Ft.d.ts +59 -0
  355. package/dist/{stores-BqEuHC05.js → stores-DxZWDXCs.js} +42 -5
  356. package/dist/{stream-CvdUS9V1.js → stream-CDvF0sJm.js} +5 -5
  357. package/dist/{stream-2Vwhl7Er.d.ts → stream-ltuLdtTG.d.ts} +4 -3
  358. package/dist/{style-Ds1gNm77.js → style-DblOtSga.js} +1 -1
  359. package/dist/{style-Cqo7-73x.js → style-Ds11Hmk4.js} +2 -1
  360. package/dist/{subject-settings-CkEwrw3W.js → subject-settings-8sH5HlII.js} +8 -4
  361. package/dist/{row-check-Dt35czLy.d.ts → subject-settings-vNW8qmUH.d.ts} +30 -18
  362. package/dist/supabase/index.d.ts +48 -38
  363. package/dist/supabase/index.js +5 -5
  364. package/dist/supabase/middleware.d.ts +19 -13
  365. package/dist/supabase/middleware.js +7 -7
  366. package/dist/{supabase--0aJdLEd.js → supabase-BL1qJzzY.js} +79 -35
  367. package/dist/{supabase-Bqp7iIY2.js → supabase-D39cuGPt.js} +3 -3
  368. package/dist/{supabase-hook-Dg0SrQWR.js → supabase-hook-B-yXnzUl.js} +175 -196
  369. package/dist/supabase-hook-H-MtE9Wd.js +1 -0
  370. package/dist/{supautils-MESd81bF.js → supautils-BU-pAEpf.js} +166 -47
  371. package/dist/{support-session-Cna49-3f.js → support-session-BsmPCbz8.js} +21 -21
  372. package/dist/svelte/PermissionBoundary.svelte +2 -6
  373. package/dist/svelte/Protected.svelte +2 -8
  374. package/dist/svelte/index.d.ts +9 -8
  375. package/dist/svelte/index.js +10 -9
  376. package/dist/svelte/runtime.d.ts +4 -4
  377. package/dist/svelte/runtime.js +4 -4
  378. package/dist/svelte/source.d.ts +9 -8
  379. package/dist/svelte/source.js +6 -5
  380. package/dist/sveltekit/index.d.ts +30 -12
  381. package/dist/sveltekit/index.js +2 -2
  382. package/dist/{ownership-Z2LpxsGa.js → tables-DeMNEy6V.js} +641 -1104
  383. package/dist/tanstack-start/index.d.ts +22 -10
  384. package/dist/tanstack-start/index.js +2 -2
  385. package/dist/{target-Bw37TFNA.js → target-qdEAnnhU.js} +6 -6
  386. package/dist/{tenancy-CmeBQ6Nv.js → tenancy-5d1zVBvK.js} +25 -19
  387. package/dist/terminal/index.d.ts +23 -14
  388. package/dist/terminal/index.js +17 -20
  389. package/dist/testing/core.d.ts +1 -1
  390. package/dist/testing/core.js +1 -1
  391. package/dist/testing/fixtures/index.d.ts +8 -5
  392. package/dist/testing/fixtures/index.js +78 -17
  393. package/dist/testing/index.d.ts +224 -141
  394. package/dist/testing/index.js +299 -234
  395. package/dist/testing/saas/index.d.ts +43 -27
  396. package/dist/testing/saas/index.js +2 -2
  397. package/dist/testing/saas/permissions.d.ts +1 -1
  398. package/dist/testing/saas/permissions.js +1 -1
  399. package/dist/{text-diff-DhITNCnD.js → text-diff-BtfSmdUo.js} +2 -2
  400. package/dist/{thenable-yD7SabqG.js → thenable-BNSM1U2R.js} +12 -3
  401. package/dist/{time-DkWjdL98.js → time-nR1JesoH.js} +32 -8
  402. package/dist/{token-2qYDvXz2.js → token-DC9EQiet.js} +14 -12
  403. package/dist/{tool-refusal-reAhIzdl.js → tool-refusal-Qpjs_W6M.js} +5 -2
  404. package/dist/trpc/index.d.ts +11 -8
  405. package/dist/trpc/index.js +15 -9
  406. package/dist/type-helpers-BIPIDa6a.d.ts +50 -0
  407. package/dist/{types-DBHftjgS.d.ts → types-AMJ5qoU_.d.ts} +45 -33
  408. package/dist/{types-CfiKC5aN.d.ts → types-B2mlGuhW.d.ts} +14 -11
  409. package/dist/{types-D3A19w4A.d.ts → types-B4uqKDnp.d.ts} +22 -13
  410. package/dist/{types-CQVEQawv.d.ts → types-BJk0BKRX.d.ts} +24 -14
  411. package/dist/types-B_d_g7T3.d.ts +262 -0
  412. package/dist/{types-DC44-hqb.d.ts → types-B_tiYvk8.d.ts} +59 -32
  413. package/dist/{types-DqzsnlSA.js → types-CcUXciSj.js} +17 -5
  414. package/dist/{types-BWZybqs9.d.ts → types-DC1Loeh3.d.ts} +381 -202
  415. package/dist/{types-CIeZcG8v.d.ts → types-DHKPcqzr.d.ts} +2 -2
  416. package/dist/{types-cTos-H7p.d.ts → types-DjuMBNF9.d.ts} +68 -32
  417. package/dist/{types-CeIscIKp.d.ts → types-HzqOtvsJ.d.ts} +23 -12
  418. package/dist/{types-BXMYB7BY.d.ts → types-ZzRGoViD.d.ts} +77 -24
  419. package/dist/{types-BfVmNJO5.d.ts → types-ah9NlU6j.d.ts} +128 -50
  420. package/dist/{types-DXmwu78Z.d.ts → types-djVzLlIV.d.ts} +31 -14
  421. package/dist/{types-g7Oy6Zg4.d.ts → types-yUuPR5Hy.d.ts} +47 -24
  422. package/dist/unplugin/index.d.ts +1 -1
  423. package/dist/unplugin/index.js +2 -2
  424. package/dist/usage-CYeXek0p.js +1 -0
  425. package/dist/{usage-Bybmck7f.js → usage-CxEzS4ey.js} +50 -26
  426. package/dist/{usage-CDaLXCfL.js → usage-ab0PdusX.js} +2 -2
  427. package/dist/{validation-error-ZfUHbKvf.js → validation-error-CYg2kJEw.js} +4 -1
  428. package/dist/{validation-error-CQpoquwj.d.ts → validation-error-YGg2mXyH.d.ts} +5 -2
  429. package/dist/{validity-CZ7-y0Cj.js → validity-Buc7w8E9.js} +13 -10
  430. package/dist/{verifier-DHuh-okk.js → verifier-DUV6pLqZ.js} +10 -4
  431. package/dist/{verify-pe8rL_Qw.js → verify-DZeqoWu5.js} +148 -487
  432. package/dist/version-DMQ0dnN5.js +48 -0
  433. package/dist/version-DizhmD72.js +1 -0
  434. package/dist/{views-BB8E9dTP.js → views-CD8wuL4Z.js} +19 -6
  435. package/dist/{vocabulary-Bg3eeT2H.d.ts → vocabulary-DEJ5j4mR.d.ts} +7 -4
  436. package/dist/vue/index.d.ts +71 -22
  437. package/dist/vue/index.js +50 -13
  438. package/dist/{waiter-DwEyouan.d.ts → waiter-Bu9zAlE0.d.ts} +13 -10
  439. package/dist/{waiter-BGUtGYoU.js → waiter-aBLM63_f.js} +1 -1
  440. package/dist/{watch-C-4VmFlL.js → watch-Cx_WciLE.js} +8 -8
  441. package/dist/watch-DB42U1ib.js +1 -0
  442. package/dist/webmcp/index.d.ts +11 -11
  443. package/dist/webmcp/index.js +8 -5
  444. package/dist/{where-scope-wq2coopv.js → where-scope-DlCdCM_8.js} +24 -18
  445. package/dist/{who-can-BwNsI_Js.js → who-can-rI7dCR9Q.js} +23 -20
  446. package/dist/workflow/index.d.ts +3 -3
  447. package/dist/workflow/index.js +13 -13
  448. package/dist/workflow-sdk/index.d.ts +19 -13
  449. package/dist/workflow-sdk/index.js +6 -6
  450. package/dist/{wrap-CiSc_KCq.js → wrap-B2wziJI_.js} +4 -4
  451. package/dist/{wrap-B6R0cMRL.d.ts → wrap-DlJE3gS_.d.ts} +8 -5
  452. package/package.json +7 -7
  453. package/schemas/catalog-v1.json +3 -0
  454. package/schemas/supabase-manifest-v1.json +33 -1
  455. package/skills/permdock-credentials/references/tokens-keys-links.md +8 -6
  456. package/skills/permdock-data/references/queries-and-rls.md +2 -1
  457. package/skills/permdock-tenancy/references/ownership-and-custom-roles.md +2 -2
  458. package/skills/permdock-wire/references/adapters.md +14 -22
  459. package/dist/catalog-BCCjSAdH.js +0 -1
  460. package/dist/collect-k_Dulxr5.js +0 -1
  461. package/dist/config-CoQHDrDi.js +0 -166
  462. package/dist/denied-text-D4qkEtFz.d.ts +0 -19
  463. package/dist/fields-ClcQLrVc.js +0 -238
  464. package/dist/generate-CNU1pIOo.js +0 -171
  465. package/dist/headers-BIjfMaoC.js +0 -8
  466. package/dist/headers-CIbDTUTK.d.ts +0 -7
  467. package/dist/load-DrMHXzgN.js +0 -1
  468. package/dist/output-files-DPAY7-GX.js +0 -1
  469. package/dist/package-root-Dk_ETdkp.js +0 -31
  470. package/dist/parse-local-manifest-e4mdwAKd.d.ts +0 -10
  471. package/dist/policies-B2lZIurj.js +0 -295
  472. package/dist/powersync-CExtTLyA.js +0 -1
  473. package/dist/problem-details-Tcfmj3bV.d.ts +0 -7
  474. package/dist/protected-BwZYL1X_.d.ts +0 -39
  475. package/dist/pull-Cty6Ovyu.js +0 -1
  476. package/dist/run-Bz7DXGEv.js +0 -1
  477. package/dist/stores-BAZwSYZA.d.ts +0 -31
  478. package/dist/supabase-hook-DJxC4PoP.js +0 -1
  479. package/dist/types-CKV71kKh.d.ts +0 -172
  480. package/dist/usage-y-kBNdqs.js +0 -1
  481. package/dist/version-CEbQ5UeM.js +0 -18
  482. package/dist/version-DXkYUISx.js +0 -1
  483. package/dist/watch-Bd9mx3rd.js +0 -1
@@ -1,32 +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-C1VJzvcr.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-DpPtSKNZ.js";
8
- import { i as dateAt, m as rfc3339, p as nowSeconds, u as isoAt } from "../time-DkWjdL98.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
9
  import { t as canonicalJson } from "../canonical-json-DwilZ1iB.js";
10
- import { r as sha256Digest } from "../sha256-D9ihqmvd.js";
11
- import { t as decideSupportSession } from "../support-session-Cna49-3f.js";
12
- import { f as scopeList } from "../scopes-BHsc-wp-.js";
13
- import { o as flattenGrantee } from "../grantee-BrRANrpT.js";
14
- import { a as delegatedScopeMap, s as scopesReaching, t as getPermDock } from "../permdock-BfWEeMqk.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";
15
15
  import { t as anonymousSubject } from "../subject-BGoM5o8B.js";
16
- import { i as linkPolicyViolation, n as capabilityOf, r as capabilitySubject } from "../capability-L7NnfhiE.js";
17
- import { r as credentialSubject, s as parseCredential } from "../credential-CIM7wHwA.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";
18
18
  import { t as AccessReviewError } from "../errors-BDUwg2qC.js";
19
- import { t as policyRowConditionKeys } from "../row-conditions-h2HythXQ.js";
20
- import { n as subscribersFor } from "../audience-BrMs8c4o.js";
21
- import { l as sqlIdent, s as quoteSqlLiteral } from "../sql-B96movIM.js";
22
- import "../sources-B-zYB4GS.js";
23
- import { c as subjectFromSupabaseSession, t as callRpc } from "../postgrest-r5faDIzD.js";
24
- import { n as parseSupabaseManifest, t as hasTokenHook } from "../manifest-B79YuF2T.js";
25
- import { t as parseCatalog } from "../parse-Ddhz2xf4.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";
26
26
  import { AsyncResult, dbError } from "better-supabase";
27
27
  //#region src/better-supabase/access-reviews.ts
28
28
  const NOT_MEMBER = "ORGANIZATION_NOT_MEMBER";
29
- /** 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
+ */
30
33
  function errorCode(error) {
31
34
  if ("hint" in error && typeof error.hint === "string" && error.hint !== "") return error.hint;
32
35
  return "code" in error && typeof error.code === "string" ? error.code : void 0;
@@ -39,8 +42,8 @@ var RpcFailure = class extends Error {
39
42
  }
40
43
  };
41
44
  /**
42
- * Whether a member holding `role` at `scope` holds `key` through it. A role
43
- * 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.
44
47
  */
45
48
  function roleGrants(policy, role, scope, key) {
46
49
  if (!policy.index.declaredRoles.has(role)) return true;
@@ -60,14 +63,13 @@ function invitationsOf(data) {
60
63
  }
61
64
  /**
62
65
  * Applies the revoked items of an access review to better-supabase's
63
- * organizations and invitations blocks, then marks each one applied. A
64
- * revoked member moves to the `demoteTo` role when the policy says that
65
- * role lacks the permission, and is removed otherwise. With `email`, the
66
- * tenant's open invitations to the member whose role grants the permission
67
- * are revoked too. A member who is no longer in the organization counts as
68
- * applied. Any other error leaves the item unapplied in `failed`, and one
69
- * item's failure never stops the others. Throws `review-not-found` for an
70
- * 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.
71
73
  */
72
74
  function accessReviewApplier(options) {
73
75
  const schema = options.schema ?? "better_supabase";
@@ -154,7 +156,10 @@ function accessReviewApplier(options) {
154
156
  //#region src/better-supabase/api-keys.ts
155
157
  const EPOCH = "1970-01-01T00:00:00.000Z";
156
158
  const rfc3339Of = (instant) => isoAt(instant.epochMilliseconds);
157
- /** 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
+ */
158
163
  function endOf(key) {
159
164
  const { expiresAt, revokedAt } = key;
160
165
  if (revokedAt === void 0) return expiresAt;
@@ -166,9 +171,9 @@ function manifestServiceRoles(manifest) {
166
171
  return manifest === void 0 ? void 0 : parseSupabaseManifest(manifest).rls.apiKeys?.serviceRoles;
167
172
  }
168
173
  /**
169
- * A personal key as a `user` credential acting as its user, a tenant key as
170
- * a `service` credential holding `roles` in its tenant; `null` when `*`
171
- * 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.
172
177
  */
173
178
  function keyCredential(key, roles, allPermissions) {
174
179
  const scopes = key.scopes.includes("*") ? allPermissions?.map((permission) => permission.key) : key.scopes;
@@ -199,18 +204,18 @@ function keyCredential(key, roles, allPermissions) {
199
204
  }) ?? null;
200
205
  }
201
206
  /**
202
- * better-supabase's API keys as a `CredentialVerifier`, for
203
- * `subjectFromApiKey` from `permdock/server`, which reads PermDock's
204
- * `pdk_<id>_<secret>` format: create the keys with `prefix: "pdk"`. The
205
- * credential id is the key's `publicId`, the id in the token. A personal key
206
- * is a `user` credential acting as its user (inside its tenant when the key
207
- * is limited to one), a tenant key a `service` credential holding
208
- * `serviceRoles` in its tenant, and the key's scopes are the credential's
209
- * permissions. better-supabase records the use when it verifies, so there is
210
- * no `touch`. A rotated key in its grace period verifies, and its credential
211
- * expires when the grace period ends. An invalid, revoked, expired or
212
- * rate-limited key, and a failed lookup, are `null`. `permdock/server` exports a different
213
- * `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.
214
219
  */
215
220
  function apiKeyVerifier(options) {
216
221
  const fallback = manifestServiceRoles(options.manifest);
@@ -238,10 +243,10 @@ function apiKeyVerifier(options) {
238
243
  } });
239
244
  }
240
245
  /**
241
- * The `claim` and `tenantClaim` options of better-supabase's
242
- * `apiKeyClaims()`, from the manifest's `rls.apiKeys`, so a key's token
243
- * carries the scopes ceiling, tenant and roles the `rls generate` helpers
244
- * 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`.
245
250
  */
246
251
  function apiKeyClaimOptions(manifest) {
247
252
  const rls = parseSupabaseManifest(manifest).rls;
@@ -300,8 +305,8 @@ function apiKeySubject(session, options) {
300
305
  /**
301
306
  * `subjectFromSupabaseSession` for better-supabase's `AuthSession`, reading
302
307
  * `memberships` for the memberships and the entitlements module's `features`
303
- * claim for `principal.plans` (`plans` names another claim). With `apiKeys`,
304
- * 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
305
310
  * acts as its user within the key's scopes, a tenant key as a `service`
306
311
  * principal holding `serviceRoles`. Without `apiKeys`, and for `anon`,
307
312
  * `service` and `invalid` sessions, the subject is anonymous.
@@ -330,10 +335,10 @@ function permissionFor(events, type) {
330
335
  }
331
336
  /**
332
337
  * The per-subscriber check for better-supabase's webhooks-out, outbox and
333
- * realtime fan-out: the subscribers whose `principal` `decideFor` grants
334
- * the event type's permission on its row, in the event's tenant, as the
335
- * sender. An unmapped type, an event without a tenant or sender, a sender
336
- * 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.
337
342
  */
338
343
  function subscriberPolicy(options) {
339
344
  return async (event, subscribers) => {
@@ -365,8 +370,8 @@ function subscriberPolicy(options) {
365
370
  //#endregion
366
371
  //#region src/better-supabase/support.ts
367
372
  /**
368
- * Bound to the admin, target, tenant, reason and mode, so the same start
369
- * 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.
370
375
  */
371
376
  function requestId(input) {
372
377
  return sha256Digest(canonicalJson({
@@ -383,8 +388,8 @@ function requestId(input) {
383
388
  * verified claims become a PermDock subject, and the start is decided with
384
389
  * `permdock.decideSupportSession` in the requested tenant. `true` only for
385
390
  * `granted`: an `approval-required` start passes once `approved` returns a
386
- * distinct approver for its token. `readOnly: false` needs `writable`. A
387
- * throw is `false`.
391
+ * distinct approver for its token. `readOnly: false` needs `writable`. A throw
392
+ * is `false`.
388
393
  */
389
394
  function supportPolicy(options) {
390
395
  return async (input) => {
@@ -439,12 +444,18 @@ function supportPolicy(options) {
439
444
  //#region src/better-supabase/hooks.ts
440
445
  /** better-supabase's claim that caps a context to the permission keys it lists. */
441
446
  const PERMISSION_CAP_CLAIM = "bs_permission_cap";
442
- /** 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
+ */
443
451
  function grants$1(permdock, key) {
444
452
  const permission = findPermission(permdock.permissions, key);
445
453
  return permission !== void 0 && permdock.decide(permission, void 0).outcome === "granted";
446
454
  }
447
- /** 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
+ */
448
459
  function matches(approvers, userId, permdock) {
449
460
  const items = flattenApprovers(approvers);
450
461
  return items.length > 0 && items.every((item) => {
@@ -465,15 +476,15 @@ function matches(approvers, userId, permdock) {
465
476
  });
466
477
  }
467
478
  /**
468
- * better-supabase's `AuthorizationHooks` (`createServer(betterSupabase,
469
- * { authorization })`), decided by `policy`. Every hook builds the
470
- * principal's instance from the claims `claims` loads now, never from the
471
- * request, and fails closed: a throw, an unknown key and `approval-required`
472
- * refuse. `automation` and `delegation` are always set; `identities`,
473
- * `delivery`, `approverOf`, `support` and `tickets` only with the options
474
- * they read. `delegation.permissions` maps each scope to the keys whose
475
- * `.scope` it is, was renamed from, or that a policy `oauthScopes` entry
476
- * 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`.
477
488
  */
478
489
  function authorizationHooks(options) {
479
490
  const { policy } = options;
@@ -594,16 +605,19 @@ function authorizationHooks(options) {
594
605
  //#region src/better-supabase/approvers.ts
595
606
  /** `rls.approvals`' approver check, executable by `authenticated`. */
596
607
  const IS_APPROVER = "permdock_is_approver";
597
- /** 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
+ */
598
612
  function resourceOf(kind) {
599
613
  const dot = kind.indexOf(".");
600
614
  return dot <= 0 ? kind : kind.slice(0, dot);
601
615
  }
602
616
  /**
603
617
  * better-supabase's `isApprover` template: one `case` over `{kind}` whose
604
- * branches call `permdock_is_approver` with the kind's approvers as JSON.
605
- * A kind with no branch is `false`. Only `user`, `holder` and `anyOf`
606
- * 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.
607
621
  */
608
622
  function isApproverTemplate(input) {
609
623
  const problems = [];
@@ -728,6 +742,14 @@ const listedName = (entry) => entry.listedAs ?? entry.helper;
728
742
  * functions; better-supabase fills it for the tenant scope only.
729
743
  */
730
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;
731
753
  const ACTOR_MAY_WRITE = "permdock_actor_may_write";
732
754
  const OPTIONAL = [
733
755
  "idsWithFor",
@@ -740,8 +762,8 @@ const OPTIONAL = [
740
762
  ];
741
763
  /**
742
764
  * Postgres aliases of the id types better-supabase reads (`uuid`, `text`,
743
- * `bigint`, `integer`), matching its `moduleIdType` from
744
- * `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.
745
767
  */
746
768
  const ID_TYPES = {
747
769
  uuid: "uuid",
@@ -765,7 +787,10 @@ function tenantScopeOf(manifest, explicit) {
765
787
  }
766
788
  const roots = manifest.rls.scopes.filter((scope) => scope.within === void 0);
767
789
  const [root] = roots;
768
- 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
+ }
769
794
  return root.name;
770
795
  }
771
796
  function covers(membership, scope) {
@@ -856,9 +881,9 @@ function grantsCommandOf(schemas) {
856
881
  }
857
882
  /**
858
883
  * better-supabase's `permitted` template. An instance of a scope (`{resource}`
859
- * names the scope) is checked against that scope's ids; any other resource
860
- * at the tenant, and with a catalog only for a key without row conditions.
861
- * 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.
862
887
  */
863
888
  function permittedTemplate(schema, scopes, tenantScope, catalog) {
864
889
  const idsOf = (scope) => `select ids::text from ${schema}.${sqlIdent(`permitted_${scope}_ids_by_permission`)}({permission}) as ids`;
@@ -884,9 +909,9 @@ const EFFECTS = {
884
909
  };
885
910
  /**
886
911
  * The catalog's `defineOperations` entries as better-supabase operations. A
887
- * name with a `.` is used as written (`workflow.node.http`); any other is
888
- * the tool `ai.tool.<name>` and `mcp.tool.<name>`. `critical` risk is
889
- * `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`.
890
915
  */
891
916
  function operationsOf(catalog) {
892
917
  const operations = {};
@@ -906,22 +931,26 @@ function operationsOf(catalog) {
906
931
  }
907
932
  return operations;
908
933
  }
909
- /** better-supabase's `delegation.scopes`, the same map `rls.tokenScopes` compiles. */
934
+ /**
935
+ * better-supabase's `delegation.scopes`, the same map `rls.tokenScopes`
936
+ * compiles.
937
+ */
910
938
  function delegatedScopes(catalog) {
911
939
  return delegatedScopeMap(catalog?.permissions ?? [], catalog?.oauthScopes);
912
940
  }
913
941
  /**
914
942
  * better-supabase's `authorization` config value, built from PermDock's
915
943
  * manifest and catalog: the scopes, the `rls generate` helpers as SQL
916
- * templates, the membership tables, suspension rows, the token hook and
917
- * every catalog key with `sqlComplete` set from its `rowConditions`. A
918
- * `_for` template and `permissionsFor` are set only when the manifest lists
919
- * their helper, which `rls.mode: 'database'` writes; `isApprover` only with
920
- * `approvers` and `permdock_is_approver`, and otherwise `canApprove` only
921
- * 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
922
950
  * `actorMayWrite` (`permdock_actor_may_write()`) are set when the manifest
923
- * lists their helper. Throws when the manifest or catalog is invalid, or when the
924
- * 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.
925
954
  */
926
955
  function authorizationProvider(options) {
927
956
  const manifest = parseSupabaseManifest(options.manifest);
@@ -1007,6 +1036,17 @@ function authorizationProvider(options) {
1007
1036
  role: "postgres"
1008
1037
  });
1009
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
+ }
1010
1050
  let actorMayWrite;
1011
1051
  if (helpers.has(ACTOR_MAY_WRITE)) {
1012
1052
  const fn = `${schema}.${sqlIdent(ACTOR_MAY_WRITE)}`;
@@ -1022,6 +1062,7 @@ function authorizationProvider(options) {
1022
1062
  idsWith: `${schema}.${TEMPLATES.idsWith.sql}`,
1023
1063
  isPlatform: `${schema}.${TEMPLATES.isPlatform.sql}`,
1024
1064
  ...holdersOf === void 0 ? {} : { holdersOf },
1065
+ ...teamIdsOf === void 0 ? {} : { teamIdsOf },
1025
1066
  ...actorMayWrite === void 0 ? {} : { actorMayWrite },
1026
1067
  ...isApprover === void 0 ? {} : { isApprover },
1027
1068
  ...permitted === void 0 ? {} : { permitted }
@@ -1093,7 +1134,10 @@ function decideWith(permdock, request) {
1093
1134
  if (!isPermission(action)) return denied("Unknown permission.");
1094
1135
  return outcomeOf(permdock.decide(action, request.resource.properties), action.key);
1095
1136
  }
1096
- /** 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
+ */
1097
1141
  function claimsOf(request) {
1098
1142
  const { subject } = request;
1099
1143
  if (subject.type !== "user" && subject.type !== "agent") return void 0;
@@ -1102,11 +1146,11 @@ function claimsOf(request) {
1102
1146
  }
1103
1147
  /**
1104
1148
  * better-supabase's `authorizer` for PermDock: every resource, action, route
1105
- * guard and MCP tool that declares a `permission` is decided with `decide`.
1106
- * The subject is mapped from the verified claims with
1107
- * `subjectFromBetterSupabase`; the request's `context.tenant` selects the
1108
- * active tenant only among the memberships the claims hold. A caller without
1109
- * 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.
1110
1154
  */
1111
1155
  function authorizer(options) {
1112
1156
  const { operations } = options;
@@ -1163,7 +1207,10 @@ function authorizer(options) {
1163
1207
  }
1164
1208
  //#endregion
1165
1209
  //#region src/better-supabase/policies.ts
1166
- /** 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
+ */
1167
1214
  const SPLIT_KEY = /#\d+$/u;
1168
1215
  function checkedKey(where, permission, facts, scope) {
1169
1216
  const key = permission.key;
@@ -1215,11 +1262,10 @@ function target(options) {
1215
1262
  };
1216
1263
  }
1217
1264
  /**
1218
- * A better-supabase bucket `policy` that checks PermDock permissions with
1219
- * the `rls generate` helpers at `scope`. The helpers check role and scope
1220
- * only, so a permission with row conditions (`rowConditions: true` in the
1221
- * catalog, or a conditioned grant in `policy`), or one not granted at
1222
- * `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.
1223
1269
  */
1224
1270
  function bucketPolicy(access, options) {
1225
1271
  const { facts, sql } = target(options);
@@ -1253,10 +1299,10 @@ function topicPolicy(access, options) {
1253
1299
  /**
1254
1300
  * `provider` with every `getToken`, `startAuthorization`,
1255
1301
  * `completeAuthorization` and `revoke` decided by PermDock first, on the
1256
- * `CredentialRef` as the row. Anything but `granted` is a `forbidden`
1257
- * error with hint `PERMDOCK_DENIED`, and a failed check is one too.
1258
- * `capabilities` and `verifyInbound` (a third party's request, with no
1259
- * 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.
1260
1306
  */
1261
1307
  function credentialGuard(provider, options) {
1262
1308
  const allowed = async (permission, ref) => {
@@ -1290,10 +1336,10 @@ const refused = (reason) => ({
1290
1336
  });
1291
1337
  /**
1292
1338
  * The `authorize` and `visible` hooks of better-supabase's `createMcp`, for
1293
- * tools whose `meta` is a PermDock permission. A tool without a permission
1294
- * is hidden and refused. `authorize` grants only a `granted` decision: an
1295
- * approval-required call is refused, because `createMcp`
1296
- * 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.
1297
1343
  */
1298
1344
  function toolPolicy(options) {
1299
1345
  return Object.freeze({
@@ -1332,9 +1378,9 @@ function isLiveRow(row, userId) {
1332
1378
  }
1333
1379
  /**
1334
1380
  * The principal `userId` is in the better-supabase organizations block: one
1335
- * membership per organization, keyed on `organization_id`, holding the role
1336
- * of each of the user's rows. Rows of another user, disabled rows and
1337
- * malformed rows are dropped, so a user with none holds no membership.
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.
1338
1384
  */
1339
1385
  function principalFromMemberships(userId, rows, options = {}) {
1340
1386
  const scope = options.scope ?? "tenant";
@@ -1364,8 +1410,8 @@ function principalFromMemberships(userId, rows, options = {}) {
1364
1410
  /**
1365
1411
  * A `PrincipalSource` over better-supabase: `principal(id)` maps the claims
1366
1412
  * `claims` loads with `subjectFromBetterSupabase`, and `principalByIdentity`
1367
- * follows `identities` to a user or a contact. Claims for another user, a
1368
- * 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`.
1369
1415
  */
1370
1416
  function principalSource(options) {
1371
1417
  const principal = async (id, lookup = {}) => {
@@ -1437,20 +1483,48 @@ const MAX_TTL = 3600;
1437
1483
  function ownEntry(record, key) {
1438
1484
  return Object.hasOwn(record, key) ? record[key] : void 0;
1439
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
+ }
1440
1514
  function isRow(value) {
1441
1515
  if (typeof value !== "object" || value === null) return false;
1442
1516
  const row = Object.fromEntries(Object.entries(value));
1443
1517
  const expiresAt = row["expiresAt"];
1444
- 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));
1445
1519
  }
1446
1520
  /**
1447
- * Resolves a better-supabase share-link token into the `link` subject it
1448
- * acts as, for `exchangeCapability` and `--capabilities` RLS. The row is
1449
- * read on every call, so a revoked or expired link stops resolving at
1450
- * once. An unknown token, subject type or role, a malformed row, a broken
1451
- * link policy, a `resolve` error and a throw are the anonymous subject. So
1452
- * is a link pinned to a version: a capability grants the subject's current
1453
- * 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.
1454
1528
  */
1455
1529
  async function subjectFromShareLink(token, options) {
1456
1530
  if (token === void 0 || token === null || token.length === 0) return anonymousSubject();
@@ -1464,17 +1538,19 @@ async function subjectFromShareLink(token, options) {
1464
1538
  return anonymousSubject();
1465
1539
  };
1466
1540
  let row;
1541
+ let subject;
1467
1542
  try {
1468
1543
  const resolved = await options.shareLinks.resolve(token);
1469
1544
  if (!resolved.ok) return deny("source-threw", "resolve-failed");
1470
1545
  if (resolved.data === null) return deny("invalid-token", "share-link-unknown");
1471
- if (!isRow(resolved.data)) return deny("schema", "share-link-malformed");
1472
- row = resolved.data;
1546
+ const parsed = parseRow(resolved.data);
1547
+ if (parsed === void 0) return deny("schema", "share-link-malformed");
1548
+ ({row, subject} = parsed);
1473
1549
  } catch {
1474
1550
  return deny("source-threw");
1475
1551
  }
1476
1552
  if (row.versionId !== void 0) return deny("invalid-token", "share-link-pinned");
1477
- const target = ownEntry(options.links, row.subjectType);
1553
+ const target = ownEntry(options.links, subject.type);
1478
1554
  if (target === void 0) return deny("invalid-token", "subject-type-unknown");
1479
1555
  const roles = idList(ownEntry(target.roles, row.role));
1480
1556
  if (roles === void 0 || roles.length === 0) return deny("unknown-role");
@@ -1489,7 +1565,7 @@ async function subjectFromShareLink(token, options) {
1489
1565
  id: row.id,
1490
1566
  on: {
1491
1567
  resource: target.resource,
1492
- id: row.subjectId
1568
+ id: subject.id
1493
1569
  },
1494
1570
  roles,
1495
1571
  expiresAt
@@ -1507,7 +1583,10 @@ async function subjectFromShareLink(token, options) {
1507
1583
  }
1508
1584
  //#endregion
1509
1585
  //#region src/better-supabase/workflow.ts
1510
- /** 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
+ */
1511
1590
  function grants(permdock, key) {
1512
1591
  try {
1513
1592
  const permission = findPermission(permdock.permissions, key);
@@ -1518,9 +1597,9 @@ function grants(permdock, key) {
1518
1597
  }
1519
1598
  /**
1520
1599
  * The `can` option of better-supabase's `authorizeHook`, for the caller's
1521
- * `permdock`: `true` only when the caller is a member of the hook's tenant
1522
- * and `decide` grants the permission its `hookMetadata` names there. An
1523
- * 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`.
1524
1603
  */
1525
1604
  function hookCan(permdock) {
1526
1605
  return (tenant, key) => {
@@ -1532,10 +1611,10 @@ function hookCan(permdock) {
1532
1611
  };
1533
1612
  }
1534
1613
  /**
1535
- * The `can` option of better-supabase's `protectWebHandler`: `undefined`
1536
- * (401) when the request has no signed-in principal or `getPermDock`
1537
- * throws, otherwise whether `decide` grants the permission in the request's
1538
- * 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).
1539
1618
  */
1540
1619
  function handlerCan(source) {
1541
1620
  return async (request, key) => {