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
@@ -0,0 +1,808 @@
1
+ import { c as listPermissions, u as renamedKeys } from "./permission-registry-B8tYxPIt.js";
2
+ import { f as scopeList, s as resolveScope } from "./scopes-0Up_UA2t.js";
3
+ import { o as flattenGrantee } from "./grantee-Dke-9rd1.js";
4
+ import { l as policyLevels } from "./policy-CLQ8__GF.js";
5
+ import { a as describeError, i as configError } from "./errors-Vpu6rKHl.js";
6
+ import { d as sqlTextArray, i as qualifySqlTable } from "./sql-0WjxIp9g.js";
7
+ import "./budget-BELja5A9.js";
8
+ import { l as roleColumn } from "./sources-CMAM-2A3.js";
9
+ import { t as beforeFirst } from "./text-BMFRfBqc.js";
10
+ import { c as parseSplit } from "./output-files-BIQ_9pIs.js";
11
+ import { b as resolveAuthorize } from "./supabase-hook-B-yXnzUl.js";
12
+ import { A as quoteQualified, C as parseMembershipsFlag, D as qualified, F as firstScopeType, O as quoteIdent, R as tenantTypeOf, a as customRolesOn, j as quoteTable, k as quoteLiteral, s as signedIn, t as CUSTOM_ROLES } from "./shared-Afctg7B0.js";
13
+ import { G as byKey, H as rolesTableScope, O as tokenScopesPlan, Q as graphSqlName, V as raiseSql, W as byCodeUnit, Y as apiKeysPlan, a as closureDepths, bt as checkSuspension, i as tablelessResources, o as graphPlan, r as tableNames, t as resolveVias, z as currentKeyExpr } from "./tables-DeMNEy6V.js";
14
+ import { o as assignableRoles, r as unsatisfiedKinds, t as ownershipRules, u as roleNames } from "./ownership-B4L59T9u.js";
15
+ import { t as membershipSourcesOf } from "./sources-qoIJQrJv.js";
16
+ import { i as group, o as sqlStatements } from "./deciding-columns-NB4wcyBf.js";
17
+ import { t as resolveNames } from "./resolve-names-CF7xXLSG.js";
18
+ import { d as orSql, h as branchClauses } from "./fields-D0vUI6dq.js";
19
+ import { m as tableFor } from "./verify-DZeqoWu5.js";
20
+ //#region src/cli/rls/custom-role-rebuild.ts
21
+ const PREFIX = "PermDock CLI";
22
+ /** A column of the roles-table row `r`. */
23
+ function col(name) {
24
+ return `r.${quoteIdent(name)}`;
25
+ }
26
+ function schemaOf(table) {
27
+ return table.includes(".") ? beforeFirst(table, ".") : "public";
28
+ }
29
+ /**
30
+ * The roles-table column a reference joins on, after checking it points at
31
+ * `roles`.
32
+ */
33
+ function roleRef(role, table, roles, label) {
34
+ const pairs = Object.entries(role.on);
35
+ const [pair] = pairs;
36
+ if (pair === void 0 || pairs.length !== 1) throw configError(`${PREFIX}: ${label}.on must map exactly one column of ${table} to ${role.through}, for example { role_id: 'id' }`);
37
+ const through = role.through.includes(".") ? role.through : `${schemaOf(table)}.${role.through}`;
38
+ if (qualifySqlTable(through) !== qualifySqlTable(roles.table)) throw configError(`${PREFIX}: ${label}.through must be rls.customRoleWrites.roles.table (${roles.table}), got ${role.through}`);
39
+ if (role.column !== roles.key) throw configError(`${PREFIX}: ${label}.column must be rls.customRoleWrites.roles.key (${roles.key}), got ${role.column}`);
40
+ const [ref, id] = pair;
41
+ return {
42
+ ref,
43
+ id
44
+ };
45
+ }
46
+ /**
47
+ * A legacy key as SQL the way `mapKey` maps it: `rls.migrate.keys`, then
48
+ * `renamed`, then the longest `rls.migrate.prefixes` match, and a former key
49
+ * read as its current key.
50
+ */
51
+ function legacyKeySql(expr, migrate, renamed) {
52
+ const exact = new Map(Object.entries(renamed));
53
+ for (const [from, to] of Object.entries(migrate?.keys ?? {})) exact.set(from, to);
54
+ const prefixes = Object.entries(migrate?.prefixes ?? {}).toSorted(([a], [b]) => b.length - a.length || byCodeUnit(a, b));
55
+ const prefixed = prefixes.length === 0 ? expr : `(case ${prefixes.map(([from, to]) => `when left(${expr}, ${String(from.length)}) = ${quoteLiteral(from)} then ${quoteLiteral(to)} || substr(${expr}, ${String(from.length + 1)})`).join(" ")} else ${expr} end)`;
56
+ const mapped = exact.size === 0 ? prefixed : `(case ${expr} ${[...exact.entries()].toSorted(byKey).map(([from, to]) => `when ${quoteLiteral(from)} then ${quoteLiteral(to)}`).join(" ")} else ${prefixed} end)`;
57
+ const renames = Object.entries(renamed).toSorted(byKey);
58
+ return currentKeyExpr(renames, mapped);
59
+ }
60
+ function sourceSql(source, table, label) {
61
+ return roleColumn(source, table, "x", {
62
+ label,
63
+ prefix: PREFIX
64
+ }).lookup;
65
+ }
66
+ function rebuildPlan(ctx, from, migrate) {
67
+ const custom = ctx.customRoles;
68
+ const root = ctx.scopes[0]?.name;
69
+ if (custom === void 0 || root === void 0) throw configError(`${PREFIX}: rls.customRoles.from needs custom roles on`);
70
+ if (ctx.authorize !== "database") throw configError(`${PREFIX}: rls.customRoles.from needs database mode; in jwt mode custom roles ride the token, so build the grants claim with customRoleClaim`);
71
+ const roles = custom.table;
72
+ if (roles === void 0) throw configError(`${PREFIX}: rls.customRoles.from needs rls.customRoleWrites.roles, the roles table each row belongs to`);
73
+ const leveled = custom.levels === true;
74
+ if (from.permissions.level !== void 0 && !leveled) throw configError(`${PREFIX}: rls.customRoles.from.permissions.level is set, but no resource declares levels`);
75
+ const tenantType = tenantTypeOf(ctx);
76
+ const rolesTable = quoteQualified(roles.table);
77
+ const tenant = roles.tenant === void 0 ? `null::${tenantType}` : `${col(roles.tenant)}::${tenantType}`;
78
+ const scope = rolesTableScope(roles, tenant, root, col);
79
+ const scopeId = roles.id === void 0 || roles.tenant === void 0 ? "null::text" : `case when ${tenant} is null then null else ${col(roles.id)}::text end`;
80
+ const skipped = roles.skip === void 0 || roles.tenant === void 0 ? "false" : `(${tenant} is not null and coalesce(${col(roles.skip)}, false))`;
81
+ const renamed = custom.renamed ?? {};
82
+ const renames = Object.entries(renamed).toSorted(byKey);
83
+ const current = (expr) => currentKeyExpr(renames, expr);
84
+ const known = sqlTextArray([...custom.permissions ?? [], ...renames.map(([former]) => former)]);
85
+ const declared = sqlTextArray(custom.declared);
86
+ const scopes = sqlTextArray(ctx.scopes.map((item) => item.name));
87
+ const ceiling = qualified(ctx, CUSTOM_ROLES.ceiling);
88
+ const rp = qualified(ctx, "role_permissions");
89
+ const perms = qualified(ctx, CUSTOM_ROLES.permissions);
90
+ const includes = qualified(ctx, CUSTOM_ROLES.includes);
91
+ const replace = qualified(ctx, CUSTOM_ROLES.trustedReplace);
92
+ const p = from.permissions;
93
+ const pTable = qualifySqlTable(p.table);
94
+ const pRef = roleRef(p.role, p.table, roles, "rls.customRoles.from.permissions.role");
95
+ const legacy = sourceSql(p.permission, pTable, "rls.customRoles.from.permissions.permission");
96
+ const effect = p.effect === void 0 ? "'allow'" : `coalesce(lower(x.${quoteIdent(p.effect)}::text), 'allow')`;
97
+ const level = p.level === void 0 ? "null::text" : `nullif(x.${quoteIdent(p.level)}::text, '')`;
98
+ const inCeiling = (key) => `exists (select 1 from ${ceiling} c where c.scope = v.scope and c.effect = 'allow' and ${current("c.permission")} = ${key})`;
99
+ const hasLevels = (key) => `exists (select 1 from ${ceiling} c where c.scope = v.scope and c.effect = 'allow' and ${current("c.permission")} = ${key} and position('@' in c.grant_key) > 0)`;
100
+ const levelCheck = leveled ? `
101
+ when m.effect = 'allow' and m.level is not null and ${hasLevels("m.key")} and not exists (
102
+ select 1 from ${ceiling} c
103
+ where c.scope = v.scope and c.effect = 'allow' and ${current("c.permission")} = m.key
104
+ and split_part(c.grant_key, '@', 2) = m.level
105
+ ) then 'level ' || m.level || ' is not declared'` : "";
106
+ const allowEntry = leveled ? "j.key || coalesce('@' || j.level, '')" : "j.key";
107
+ const i = from.includes;
108
+ const iTable = i === void 0 ? void 0 : qualifySqlTable(i.table);
109
+ const iRef = i === void 0 || iTable === void 0 ? void 0 : roleRef(i.role, i.table, roles, "rls.customRoles.from.includes.role");
110
+ const included = i === void 0 || iTable === void 0 ? void 0 : sourceSql(i.include, iTable, "rls.customRoles.from.includes.include");
111
+ const refs = [`${col(pRef.id)} as permissions_ref`, ...iRef === void 0 ? [] : [`${col(iRef.id)} as includes_ref`]].join(", ");
112
+ const includeBlock = (rows) => i === void 0 || iTable === void 0 || iRef === void 0 || included === void 0 || rows === void 0 ? " v_include := null;" : ` with raw as (
113
+ select ${included} as role
114
+ from ${rows}
115
+ where x.${quoteIdent(iRef.ref)} = v.includes_ref
116
+ ),
117
+ judged as (
118
+ select n.role, case
119
+ when n.role is null or not (n.role = any(${declared})) then 'not a declared role'
120
+ when exists (
121
+ select 1 from ${rp} rp
122
+ where rp.role = n.role and rp.effect = 'allow'
123
+ and not ${inCeiling(current("rp.permission"))}
124
+ ) then 'allows permissions outside the ceiling of ' || v.scope
125
+ end as dropped
126
+ from raw n
127
+ )
128
+ select array_agg(distinct j.role) filter (where j.dropped is null),
129
+ array_agg(v.role || ': includes ' || coalesce(j.role, 'null') || ', ' || j.dropped) filter (where j.dropped is not null)
130
+ into v_include, v_lost
131
+ from judged j;
132
+ v_dropped := v_dropped || coalesce(v_lost, '{}'::text[]);`;
133
+ const permissionsBlock = (rows) => ` with raw as (
134
+ select ${legacy} as legacy, ${effect} as effect, ${level} as level
135
+ from ${rows}
136
+ where x.${quoteIdent(pRef.ref)} = v.permissions_ref
137
+ ),
138
+ mapped as (
139
+ select n.legacy, ${legacyKeySql("n.legacy", migrate, renamed)} as key, n.effect, n.level
140
+ from raw n
141
+ ),
142
+ judged as (
143
+ select m.legacy, m.key, m.effect, ${leveled ? `case when ${hasLevels("m.key")} then m.level end` : "m.level"} as level, case
144
+ when m.effect not in ('allow', 'deny') then 'effect ' || m.effect || ' is not allow or deny'
145
+ when m.key is null or not (m.key = any(${known})) then 'not a declared permission'
146
+ when m.effect = 'allow' and not ${inCeiling("m.key")} then 'outside the ceiling of ' || v.scope${levelCheck}
147
+ end as dropped
148
+ from mapped m
149
+ )
150
+ select array_agg(distinct ${allowEntry}) filter (where j.dropped is null and j.effect = 'allow'),
151
+ array_agg(distinct j.key) filter (where j.dropped is null and j.effect = 'deny'),
152
+ array_agg(v.role || ': ' || coalesce(j.legacy, 'null') || ', ' || j.dropped) filter (where j.dropped is not null)
153
+ into v_allow, v_deny, v_lost
154
+ from judged j;
155
+ v_dropped := v_dropped || coalesce(v_lost, '{}'::text[]);`;
156
+ const legacyRows = iTable === void 0 ? void 0 : `${quoteTable(iTable)} x`;
157
+ const newRow = "(select new.*) x";
158
+ return {
159
+ rolesTable,
160
+ identity: `select ${tenant} as tenant_id, ${scope} as scope, ${scopeId} as scope_id, ${col(roles.key)}::text as role, ${refs}`,
161
+ eligible: `not ${skipped} and not (${col(roles.key)}::text = any(${declared}))`,
162
+ permsRef: pRef,
163
+ includesRef: iRef,
164
+ scopes,
165
+ collect: `${permissionsBlock(`${quoteTable(pTable)} x`)}
166
+ ${includeBlock(legacyRows)}`,
167
+ collectNew: {
168
+ permissions: `${permissionsBlock(newRow)}
169
+ v_include := null;`,
170
+ includes: ` v_allow := null;
171
+ v_deny := null;
172
+ ${includeBlock(newRow)}`
173
+ },
174
+ replace,
175
+ perms,
176
+ includes,
177
+ declared,
178
+ roles
179
+ };
180
+ }
181
+ /**
182
+ * `v_dropped` grouped per legacy role (`role: a, b; other: c`), capped at 50
183
+ * entries.
184
+ */
185
+ const DROPPED_LIST = `(select string_agg(g.role || ': ' || g.items, '; ' order by g.role)
186
+ from (
187
+ select split_part(l.d, ': ', 1) as role, string_agg(substr(l.d, strpos(l.d, ': ') + 2), ', ' order by l.d) as items
188
+ from (select u.d from unnest(v_dropped) as u(d) order by u.d limit 50) l
189
+ group by 1
190
+ ) g)`;
191
+ //#endregion
192
+ //#region src/cli/rls/custom-role-sync.ts
193
+ /**
194
+ * `rls.customRoles.from.sync: 'trigger'`: after-row triggers on the legacy
195
+ * permissions table, and on the includes table when mapped, rebuild each
196
+ * affected role through `permdock_trusted_replace_custom_role_grants`, with the
197
+ * same reads the backfill uses. An entry outside the ceiling is dropped with a
198
+ * warning rather than aborting the legacy write, and a tenant role whose name a
199
+ * shared role holds is skipped with a warning (`name-taken`). Before-row
200
+ * triggers hold a signed-in caller at trigger depth 1 to the checks of
201
+ * `permdock_replace_custom_role_grants`: `permdock_custom_role_guard` on each
202
+ * role the row names, then `permdock_custom_role_beyond` on the entry it adds;
203
+ * a refusal aborts the write.
204
+ */
205
+ function customRoleSyncSql(ctx, from, migrate) {
206
+ const plan = rebuildPlan(ctx, from, migrate);
207
+ const shared = qualified(ctx, CUSTOM_ROLES.shared);
208
+ const guard = qualified(ctx, CUSTOM_ROLES.guard);
209
+ const beyond = qualified(ctx, CUSTOM_ROLES.beyond);
210
+ const keepIncludes = plan.includesRef === void 0 ? `
211
+ v_include := array(select c.include_role from ${plan.includes} c where c.tenant_id is not distinct from v.tenant_id and c.scope = v.scope and c.scope_id is not distinct from v.scope_id and c.role = v.role);` : "";
212
+ const one = (name, table, ref) => {
213
+ const fn = qualified(ctx, `${CUSTOM_ROLES.sync}_${name}`);
214
+ const target = quoteTable(qualifySqlTable(table));
215
+ const trigger = `${CUSTOM_ROLES.sync}_${name}`;
216
+ return `create or replace function ${fn}()
217
+ returns trigger
218
+ language plpgsql
219
+ volatile
220
+ security definer
221
+ set search_path = ''
222
+ as $$
223
+ declare
224
+ v record;
225
+ v_allow text[];
226
+ v_deny text[];
227
+ v_include text[];
228
+ v_lost text[];
229
+ v_dropped text[];
230
+ v_refs text[] := array[
231
+ case when tg_op <> 'INSERT' then old.${quoteIdent(ref.ref)}::text end,
232
+ case when tg_op <> 'DELETE' then new.${quoteIdent(ref.ref)}::text end
233
+ ];
234
+ begin
235
+ for v in
236
+ ${plan.identity}
237
+ from ${plan.rolesTable} r
238
+ where ${plan.eligible} and r.${quoteIdent(ref.id)}::text = any(v_refs)
239
+ loop
240
+ if v.role is null or not (v.scope = 'global' or v.scope = any(${plan.scopes})) then
241
+ raise warning 'permdock sync: % has scope %, which is not declared', coalesce(v.role, 'null'), coalesce(v.scope, 'null');
242
+ continue;
243
+ end if;
244
+ if v.tenant_id is not null and ${shared}(v.scope, v.role) then
245
+ raise warning 'permdock sync: % is the name of a shared custom role (name-taken); the legacy write is not copied', v.role;
246
+ continue;
247
+ end if;
248
+ v_dropped := '{}'::text[];
249
+ ${plan.collect}${keepIncludes}
250
+ perform ${plan.replace}(v.tenant_id, v.scope, v.scope_id, v.role, v_allow, v_deny, v_include);
251
+ if cardinality(v_dropped) > 0 then
252
+ raise warning 'permdock sync: dropped % entr(ies) PermDock cannot hold: %', cardinality(v_dropped), ${DROPPED_LIST};
253
+ end if;
254
+ end loop;
255
+ return null;
256
+ end;
257
+ $$;
258
+ revoke execute on function ${fn}() from public, anon, authenticated;
259
+ drop trigger if exists ${quoteIdent(trigger)} on ${target};
260
+ create trigger ${quoteIdent(trigger)}
261
+ after insert or update or delete on ${target}
262
+ for each row execute function ${fn}();`;
263
+ };
264
+ const guardOne = (name, table, ref) => {
265
+ const fn = qualified(ctx, `${CUSTOM_ROLES.syncGuard}_${name}`);
266
+ const target = quoteTable(qualifySqlTable(table));
267
+ const trigger = `${CUSTOM_ROLES.syncGuard}_${name}`;
268
+ return `create or replace function ${fn}()
269
+ returns trigger
270
+ language plpgsql
271
+ volatile
272
+ security definer
273
+ set search_path = ''
274
+ as $$
275
+ declare
276
+ v record;
277
+ v_allow text[];
278
+ v_deny text[];
279
+ v_include text[];
280
+ v_lost text[];
281
+ v_dropped text[];
282
+ v_beyond text;
283
+ v_refs text[] := array[
284
+ case when tg_op <> 'INSERT' then old.${quoteIdent(ref.ref)}::text end,
285
+ case when tg_op <> 'DELETE' then new.${quoteIdent(ref.ref)}::text end
286
+ ];
287
+ begin
288
+ if not (${signedIn(ctx)} and pg_trigger_depth() = 1) then
289
+ return coalesce(new, old);
290
+ end if;
291
+ for v in
292
+ ${plan.identity}
293
+ from ${plan.rolesTable} r
294
+ where ${plan.eligible} and r.${quoteIdent(ref.id)}::text = any(v_refs)
295
+ loop
296
+ if v.role is null or not (v.scope = 'global' or v.scope = any(${plan.scopes})) then
297
+ continue;
298
+ end if;
299
+ if v.tenant_id is not null and ${shared}(v.scope, v.role) then
300
+ continue;
301
+ end if;
302
+ perform ${guard}(v.tenant_id, v.scope, v.scope_id, v.role);
303
+ if tg_op = 'DELETE' then
304
+ continue;
305
+ end if;
306
+ v_dropped := '{}'::text[];
307
+ ${plan.collectNew[name]}
308
+ select string_agg(b, ', ' order by b) into v_beyond
309
+ from ${beyond}(v.tenant_id, v.scope, v.scope_id, v_allow, v_deny, v_include) b;
310
+ if v_beyond is not null then
311
+ ${raiseSql(" ", "42501", `'permdock: ' || v.role || ' would allow ' || v_beyond || ', which the caller may not hand out'`, "not-assignable-by")}
312
+ end if;
313
+ end loop;
314
+ return coalesce(new, old);
315
+ end;
316
+ $$;
317
+ revoke execute on function ${fn}() from public, anon, authenticated;
318
+ drop trigger if exists ${quoteIdent(trigger)} on ${target};
319
+ create trigger ${quoteIdent(trigger)}
320
+ before insert or update or delete on ${target}
321
+ for each row execute function ${fn}();`;
322
+ };
323
+ const chunks = [
324
+ `-- rls.customRoles.from.sync: a write to the application's role tables rebuilds the role's PermDock grants`,
325
+ one("permissions", from.permissions.table, plan.permsRef),
326
+ `-- a signed-in caller writes only what the guarded replace would accept`,
327
+ guardOne("permissions", from.permissions.table, plan.permsRef)
328
+ ];
329
+ if (from.includes !== void 0 && plan.includesRef !== void 0) chunks.push(one("includes", from.includes.table, plan.includesRef), guardOne("includes", from.includes.table, plan.includesRef));
330
+ return `${chunks.join("\n\n")}\n`;
331
+ }
332
+ //#endregion
333
+ //#region src/cli/rls/generate-context.ts
334
+ /**
335
+ * The scopes an `rls.migrate` `role` helper names, so `rls generate` writes
336
+ * their role-filtered member helper.
337
+ */
338
+ function roleMemberScopesOf(migrate) {
339
+ const scopes = [...new Set(Object.values(migrate?.helpers ?? {}).flatMap((helper) => helper.form === "role" ? [helper.scope] : []))].toSorted();
340
+ return scopes.length === 0 ? {} : { roleMemberScopes: scopes };
341
+ }
342
+ /** `rls.customRoleWrites.requires` as permission keys, or why it names none. */
343
+ function writeRequirement(policy, requires) {
344
+ if (requires === void 0) return {};
345
+ const leaves = listPermissions(policy.permissions);
346
+ const keys = requires === "manageRoles" ? leaves.filter((leaf) => leaf.meta.manageRoles === true).map((leaf) => leaf.key) : [...requires];
347
+ if (keys.length === 0) return { error: requires === "manageRoles" ? "rls.customRoleWrites.requires is 'manageRoles', but no permission declares meta.manageRoles" : "rls.customRoleWrites.requires names no permission" };
348
+ const known = new Set(leaves.map((leaf) => leaf.key));
349
+ const unknown = keys.filter((key) => !known.has(key));
350
+ if (unknown.length > 0) return { error: `rls.customRoleWrites.requires names undeclared permissions: ${unknown.join(", ")}` };
351
+ return { keys: [...new Set(keys)].toSorted() };
352
+ }
353
+ /** Declared role names, and those a tenant admin may compose into custom roles. */
354
+ function customRoleNames(policy, requires) {
355
+ const declared = [...roleNames(policy)].toSorted();
356
+ const assignable = assignableRoles(policy);
357
+ const renamed = renamedKeys(policy.vocabulary.permissions);
358
+ const leaves = listPermissions(policy.permissions);
359
+ const manage = leaves.filter((leaf) => leaf.meta.manageRoles === true).map((leaf) => leaf.key);
360
+ return {
361
+ declared,
362
+ assignable,
363
+ ...renamed.size === 0 ? {} : { renamed: Object.fromEntries(renamed) },
364
+ permissions: leaves.map((leaf) => leaf.key).toSorted(),
365
+ ...manage.length === 0 ? {} : { manage: manage.toSorted() },
366
+ ...requires === void 0 ? {} : { requires },
367
+ ...policy.levels === void 0 ? {} : { levels: true }
368
+ };
369
+ }
370
+ function skippedOwnershipTriggers(triggers, scopes) {
371
+ if (triggers === false) return "all";
372
+ return Object.keys(triggers).map((key) => {
373
+ const name = resolveScope(scopes, key);
374
+ if (name === void 0) throw configError(`PermDock CLI: rls.ownershipTriggers.${key} names a scope the policy does not declare`);
375
+ return name;
376
+ });
377
+ }
378
+ /**
379
+ * The SQL context every emitter reads, from the flags, `rls` config and the
380
+ * policy.
381
+ */
382
+ function buildContext(input, policy, options) {
383
+ const rls = input.config.rls;
384
+ const memberships = parseMembershipsFlag(input.memberships) ?? rls?.memberships;
385
+ if (input.rbac && input.dialect !== "supabase") return { refusal: `rls generate --rbac supabase needs --dialect supabase (got ${input.dialect})` };
386
+ const schema = input.rbacSchema ?? rls?.schema ?? rls?.rbac?.schema ?? "permdock";
387
+ const authorize = resolveAuthorize(input.config, {
388
+ authorize: input.authorize,
389
+ rbac: input.rbac,
390
+ memberships
391
+ });
392
+ const writeTable = rls?.customRoleWrites?.roles;
393
+ const guard = writeTable?.tenant === void 0 ? void 0 : {
394
+ table: writeTable.table,
395
+ tenant: writeTable.tenant,
396
+ skip: writeTable.skip,
397
+ declared: [...roleNames(policy)].toSorted()
398
+ };
399
+ const memberSources = membershipSourcesOf(input.config).map((source) => guard === void 0 ? source : source.guarded?.(guard) ?? source);
400
+ const sources = authorize === "database" ? memberSources : void 0;
401
+ const scopes = scopeList(policy.scopes);
402
+ const suspension = checkSuspension(rls?.suspension, scopes);
403
+ const hookRoles = input.config.supabase?.hook?.roles;
404
+ const roles = rls?.roles ?? (hookRoles === false ? void 0 : hookRoles);
405
+ if (roles !== void 0 && input.rbac) return { refusal: "rls generate --rbac supabase creates its own user_roles (user_id, role app_role); drop rls.roles (or supabase.hook.roles) or the --rbac flag" };
406
+ const requires = writeRequirement(policy, rls?.customRoleWrites?.requires);
407
+ if (requires.error !== void 0) return { refusal: requires.error };
408
+ if (rls?.customRoleWrites?.audit !== void 0 && rls.customRoleWrites.roles?.primaryKey === void 0) return { refusal: "rls.customRoleWrites.audit needs rls.customRoleWrites.roles.primaryKey: only the by-id writers call it" };
409
+ const readers = rls?.trustedReaders;
410
+ if (readers !== void 0 && (!Array.isArray(readers) || !readers.every((name) => typeof name === "string" && name !== ""))) return { refusal: "rls.trustedReaders must list Postgres role names, such as ['service_role']" };
411
+ const ownership = ownershipRules(policy, scopes);
412
+ const graph = graphPlan(policy);
413
+ const apiKeys = apiKeysPlan(rls?.apiKeys, new Set(roleNames(policy)), Object.fromEntries(renamedKeys(policy.vocabulary.permissions)));
414
+ const tokenScopesSetting = rls?.tokenScopes;
415
+ if (tokenScopesSetting !== void 0 && typeof tokenScopesSetting !== "boolean") return { refusal: "rls.tokenScopes must be true or false" };
416
+ const tokenScopes = tokenScopesPlan(tokenScopesSetting, policy);
417
+ let vias;
418
+ try {
419
+ vias = resolveVias(rls?.tables, scopes, input.dialect);
420
+ } catch (cause) {
421
+ return { refusal: describeError(cause) };
422
+ }
423
+ const tableless = tablelessResources(rls?.tables);
424
+ let ctx = {
425
+ dialect: input.dialect,
426
+ scopes,
427
+ tenantClaim: rls?.tenantClaim ?? "tenant_id",
428
+ ...roleMemberScopesOf(rls?.migrate),
429
+ ...rls?.roleValues === void 0 ? {} : { roleValues: rls.roleValues },
430
+ ...rls?.tenants === "all" ? { tenants: "all" } : {},
431
+ gucPrefix: input.gucPrefix ?? rls?.gucPrefix ?? "app",
432
+ ...rls?.actions === void 0 ? {} : { actions: rls.actions },
433
+ ...tableless.size === 0 ? {} : { tableless },
434
+ inlineFunctions: input.inlineFunctions || rls?.inlineFunctions === true,
435
+ schema,
436
+ authorize,
437
+ roleClaim: rls?.roleClaim ?? "user_role",
438
+ tenantType: input.tenantType ?? firstScopeType(rls?.scopeTypes, scopes),
439
+ ...rls?.scopeTypes === void 0 ? {} : { scopeTypes: rls.scopeTypes },
440
+ ...memberships === void 0 ? {} : { memberships },
441
+ ...sources === void 0 || sources.length === 0 ? {} : { sources },
442
+ ...memberSources === void 0 || memberSources.length === 0 ? {} : { memberSources },
443
+ ...suspension === void 0 ? {} : { suspension },
444
+ ...roles === void 0 ? {} : { roles },
445
+ ...input.customRoles === true || customRolesOn(rls) ? { customRoles: {
446
+ ...customRoleNames(policy, requires.keys),
447
+ ...rls?.customRoleWrites?.roles === void 0 ? {} : { table: rls.customRoleWrites.roles },
448
+ ...rls?.customRoleWrites?.audit === void 0 ? {} : { audit: rls.customRoleWrites.audit }
449
+ } } : {},
450
+ ...input.capabilities === true || rls?.capabilities === true ? { capabilities: true } : {},
451
+ ...apiKeys === void 0 ? {} : { apiKeys },
452
+ ...tokenScopes === void 0 ? {} : { tokenScopes },
453
+ ...rls?.anonymousSignIns === "deny" ? { anonymousSignIns: "deny" } : {},
454
+ ...ownership === void 0 ? {} : { ownership },
455
+ ...rls?.seeds === void 0 ? {} : { seeds: rls.seeds },
456
+ ...rls?.ownershipTriggers === void 0 ? {} : { skipOwnershipTriggers: skippedOwnershipTriggers(rls.ownershipTriggers, scopes) },
457
+ ...rls?.assignments === void 0 ? {} : { assignments: rls.assignments === true ? { tables: [] } : {
458
+ tables: rls.assignments.tables ?? [],
459
+ ...rls.assignments.ownRole === void 0 ? {} : { ownRole: rls.assignments.ownRole }
460
+ } },
461
+ ...options.fieldsMode === void 0 ? {} : { fields: options.fieldsMode },
462
+ ...vias === void 0 ? {} : { vias },
463
+ ...graph.size === 0 ? {} : { graph: {
464
+ closures: closureDepths(graph),
465
+ resources: policy.resources,
466
+ ...rls?.tables === void 0 ? {} : { tables: tableNames(rls.tables) ?? {} }
467
+ } }
468
+ };
469
+ const from = typeof rls?.customRoles === "object" ? rls.customRoles.from : void 0;
470
+ if (from?.sync === "trigger" && ctx.customRoles !== void 0) try {
471
+ ctx = {
472
+ ...ctx,
473
+ customRoles: {
474
+ ...ctx.customRoles,
475
+ sync: customRoleSyncSql(ctx, from, rls?.migrate)
476
+ }
477
+ };
478
+ } catch (cause) {
479
+ return { refusal: describeError(cause) };
480
+ }
481
+ const [unsatisfied] = unsatisfiedKinds(ctx, policy);
482
+ if (unsatisfied !== void 0) return { refusal: `role ${unsatisfied.role} is for ${unsatisfied.for.join(", ")}, but its membership sources hold ${unsatisfied.sources.join(", ")}: no membership can hold it; set via on a source to one of those kinds` };
483
+ const names = resolveNames(policy, input.config, {
484
+ schema,
485
+ gucPrefix: ctx.gucPrefix,
486
+ tenantClaim: ctx.tenantClaim
487
+ });
488
+ return {
489
+ ctx,
490
+ names,
491
+ graph,
492
+ ownership,
493
+ schema,
494
+ authorize
495
+ };
496
+ }
497
+ //#endregion
498
+ //#region src/cli/rls/generate-options.ts
499
+ function isRefusal(value) {
500
+ return "refusal" in value;
501
+ }
502
+ /** The checks that need no policy: `--fields` and `--revoke-columns`. */
503
+ function generateOptions(input) {
504
+ const rls = input.config.rls;
505
+ const fieldsMode = input.fields ?? rls?.fields;
506
+ if (fieldsMode !== void 0 && fieldsMode !== "views" && fieldsMode !== "mask") return { refusal: `rls generate --fields must be views or mask (got ${fieldsMode})` };
507
+ const revokeColumns = input.revokeColumns === true || rls?.revokeColumns === true;
508
+ if (revokeColumns && fieldsMode === void 0) return { refusal: "rls generate --revoke-columns needs --fields views or mask" };
509
+ return {
510
+ fieldsMode,
511
+ revokeColumns
512
+ };
513
+ }
514
+ /**
515
+ * Whether `--split` names `part`, which then leaves the helpers or the
516
+ * warnings.
517
+ */
518
+ function splitsPart(raw, part) {
519
+ const split = parseSplit(raw);
520
+ return typeof split !== "string" && split?.includes(part) === true;
521
+ }
522
+ //#endregion
523
+ //#region src/cli/rls/rows.ts
524
+ /**
525
+ * `permitted_<resource>_rows(p_permission)`: the resource's row ids the subject
526
+ * may act on with one permission.
527
+ */
528
+ function rowsHelper(resource) {
529
+ const name = graphSqlName(resource);
530
+ const helper = `permitted_${name ?? resource}_rows`;
531
+ if (name === void 0 || new TextEncoder().encode(`${helper}_for`).length > 63) throw configError(`PermDock CLI: rls.rowHelpers cannot name a helper for resource '${resource}'; use a SQL name of at most 45 bytes`);
532
+ return helper;
533
+ }
534
+ /**
535
+ * Every declared `<permission>@<level>` of an instance permission on a resource
536
+ * with levels.
537
+ */
538
+ function levelKeys(policy) {
539
+ const out = [];
540
+ for (const leaf of listPermissions(policy.vocabulary.permissions)) {
541
+ if (leaf.kind !== "instance") continue;
542
+ for (const [level, condition] of policyLevels(policy, leaf.resource)) out.push({
543
+ key: `${leaf.key}@${level}`,
544
+ permission: leaf.key,
545
+ conditioned: !(condition.op === "and" && condition.conditions.length === 0),
546
+ rowHelper: `permitted_${graphSqlName(leaf.resource) ?? leaf.resource}_row`
547
+ });
548
+ }
549
+ return out;
550
+ }
551
+ /**
552
+ * The branches a row check of a permission reads: its allows and denies,
553
+ * inserts included, for signed-in callers.
554
+ */
555
+ function rowBranchesOf(branches, resource) {
556
+ const out = /* @__PURE__ */ new Map();
557
+ for (const branch of branches) {
558
+ if (branch.resource !== resource || branch.coverage === true || !branch.roles.includes("authenticated")) continue;
559
+ out.set(branch.permissionKey, [...out.get(branch.permissionKey) ?? [], branch]);
560
+ }
561
+ return out;
562
+ }
563
+ /**
564
+ * What a branch asks of a row: the `with check` of an insert, which sees the
565
+ * new row, the `using` of every other command.
566
+ */
567
+ function clauseOf(branch) {
568
+ const clauses = branchClauses(branch);
569
+ return (branch.command === "insert" ? clauses.check : clauses.using) ?? "true";
570
+ }
571
+ function usingOf(branches) {
572
+ const parts = branches.map(clauseOf);
573
+ return parts.length === 0 ? void 0 : orSql(parts);
574
+ }
575
+ function permissionCase(key, branches) {
576
+ const allow = usingOf(branches.filter((branch) => branch.effect === "allow"));
577
+ if (allow === void 0) return;
578
+ const deny = usingOf(branches.filter((branch) => branch.effect === "deny"));
579
+ const granted = `coalesce((${allow}), false)`;
580
+ return ` when ${quoteLiteral(key)} then ${deny === void 0 ? granted : `${granted} and (${deny}) is not true`}`;
581
+ }
582
+ function forUserSql(ctx, fn, helper) {
583
+ const user = ctx.dialect === "supabase" ? "uuid" : "text";
584
+ const signature = `${user}, text, jsonb`;
585
+ const head = `create or replace function ${fn}(p_user ${user}, p_permission text, p_claims jsonb default '{}')
586
+ returns setof text
587
+ language plpgsql
588
+ volatile
589
+ security definer
590
+ set search_path = ''
591
+ as $$`;
592
+ const tail = `revoke execute on function ${fn}(${signature}) from public, anon, authenticated;`;
593
+ if (ctx.dialect === "supabase") return `${head}
594
+ declare
595
+ v_claims text := pg_catalog.current_setting('request.jwt.claims', true);
596
+ begin
597
+ perform pg_catalog.set_config(
598
+ 'request.jwt.claims',
599
+ (coalesce(p_claims, '{}'::jsonb) || pg_catalog.jsonb_build_object('sub', p_user::text, 'role', 'authenticated'))::text,
600
+ true
601
+ );
602
+ return query select r.id from ${helper}(p_permission) r(id);
603
+ perform pg_catalog.set_config('request.jwt.claims', coalesce(v_claims, ''), true);
604
+ end
605
+ $$;
606
+ ${tail}`;
607
+ const prefix = ctx.gucPrefix;
608
+ return `${head}
609
+ declare
610
+ v_saved jsonb := '{}'::jsonb;
611
+ v_key text;
612
+ v_value text;
613
+ begin
614
+ for v_key, v_value in
615
+ select 'user_id', p_user
616
+ union all
617
+ select c.key, c.value from pg_catalog.jsonb_each_text(coalesce(p_claims, '{}'::jsonb)) c where c.key <> 'user_id'
618
+ loop
619
+ v_saved := v_saved || pg_catalog.jsonb_build_object(v_key, coalesce(pg_catalog.current_setting(${quoteLiteral(`${prefix}.`)} || v_key, true), ''));
620
+ perform pg_catalog.set_config(${quoteLiteral(`${prefix}.`)} || v_key, v_value, true);
621
+ end loop;
622
+ return query select r.id from ${helper}(p_permission) r(id);
623
+ for v_key, v_value in select s.key, s.value from pg_catalog.jsonb_each_text(v_saved) s loop
624
+ perform pg_catalog.set_config(${quoteLiteral(`${prefix}.`)} || v_key, v_value, true);
625
+ end loop;
626
+ end
627
+ $$;
628
+ ${tail}`;
629
+ }
630
+ function inheritTargets(policy) {
631
+ const out = /* @__PURE__ */ new Set();
632
+ for (const grant of policy.grants) for (const item of flattenGrantee(grant.to)) if (item.kind === "inherit") out.add(item.resource);
633
+ return [...out].toSorted();
634
+ }
635
+ function stubSql(ctx, resource) {
636
+ return `create or replace function ${qualified(ctx, rowsHelper(resource))}(p_permission text)
637
+ returns setof text
638
+ language sql
639
+ stable
640
+ security definer
641
+ set search_path = ''
642
+ as $$
643
+ select null::text where false
644
+ $$;`;
645
+ }
646
+ function rowSql(ctx, rows, table, where) {
647
+ const fn = qualified(ctx, rows.replace(/_rows$/u, "_row"));
648
+ return `create or replace function ${fn}(p_row ${table}, p_permission text)
649
+ returns boolean
650
+ language sql
651
+ stable
652
+ security definer
653
+ set search_path = ''
654
+ as $$
655
+ select exists (select 1 from (select (p_row).*) r where ${where})
656
+ $$;
657
+ revoke execute on function ${fn}(${table}, text) from public, anon;
658
+ grant execute on function ${fn}(${table}, text) to authenticated;`;
659
+ }
660
+ function resourceSql(ctx, node, branches, tables) {
661
+ const name = rowsHelper(node.name);
662
+ const fn = qualified(ctx, name);
663
+ const table = quoteQualified(tableFor(node.name, tables));
664
+ const cases = [...branches.keys()].toSorted().flatMap((key) => {
665
+ const sql = permissionCase(key, branches.get(key) ?? []);
666
+ return sql === void 0 ? [] : [sql];
667
+ });
668
+ const where = cases.length === 0 ? "false" : `case p_permission\n${cases.join("\n")}\n else false\n end`;
669
+ const rows = `-- ${node.name}: ids of the rows the caller may act on with p_permission, as the table's policies decide it
670
+ create or replace function ${fn}(p_permission text)
671
+ returns setof text
672
+ language sql
673
+ stable
674
+ security definer
675
+ set search_path = ''
676
+ as $$
677
+ select ${quoteIdent(node.id)}::text from ${table}
678
+ where ${where}
679
+ $$;
680
+ revoke execute on function ${fn}(text) from public, anon;
681
+ grant execute on function ${fn}(text) to authenticated;
682
+ ${rowSql(ctx, name, table, where)}`;
683
+ if (ctx.dialect === "neon") return rows;
684
+ return `${rows}
685
+ -- the same rows for a user the caller names, with claims it supplies; no client role may execute it
686
+ ${forUserSql(ctx, qualified(ctx, `${name}_for`), fn)}`;
687
+ }
688
+ /**
689
+ * `permitted_<resource>_rows(p_permission)` for each resource `select` names
690
+ * (or every resource a grant reaches with `true`): the ids of its rows the
691
+ * caller may read, update or delete with that permission, from the same
692
+ * compiled allows and denies the table policies use, so closure walks, link
693
+ * hops, the restricted stop, `includes`, groups and `requires` all apply. A
694
+ * `security definer` helper, so hand-written policies and functions call it
695
+ * without restating the graph. Outside the `neon` dialect a
696
+ * `permitted_<resource>_rows_for(p_user, p_permission, p_claims)` form runs it
697
+ * as the named user, with the claims the caller supplies, for trusted SQL.
698
+ */
699
+ function rowHelpersSql(ctx, policy, branches, select, tables, warnings) {
700
+ const names = select === true ? [...new Set(branches.flatMap((branch) => branch.resource === void 0 ? [] : [branch.resource]))].toSorted() : [...new Set(select)];
701
+ const called = inheritTargets(policy);
702
+ for (const name of called) if (!names.includes(name)) names.push(name);
703
+ const chunks = called.map((name) => stubSql(ctx, name));
704
+ for (const name of names) {
705
+ const node = policy.resources.get(name);
706
+ if (node === void 0) throw configError(`PermDock CLI: rls.rowHelpers names '${name}', which the policy does not declare`);
707
+ chunks.push(resourceSql(ctx, node, rowBranchesOf(branches, name), tables));
708
+ }
709
+ if (chunks.length > 0 && ctx.dialect === "neon") warnings.push("rls.rowHelpers: the neon dialect reads the subject from auth.session(), which SQL cannot set, so no permitted_<resource>_rows_for is written");
710
+ return chunks.length === 0 ? "" : `${chunks.join("\n\n")}\n`;
711
+ }
712
+ //#endregion
713
+ //#region src/cli/sql/supautils.ts
714
+ /**
715
+ * `supautils.reserved_roles` of supabase/postgres 17.11.0.002 (supautils
716
+ * 3.4.4).
717
+ */
718
+ const RESERVED_ROLES = /* @__PURE__ */ new Set([
719
+ "supabase_admin",
720
+ "supabase_auth_admin",
721
+ "supabase_storage_admin",
722
+ "supabase_read_only_user",
723
+ "supabase_realtime_admin",
724
+ "supabase_replication_admin",
725
+ "supabase_etl_admin",
726
+ "supabase_privileged_role",
727
+ "dashboard_user",
728
+ "pgbouncer",
729
+ "service_role",
730
+ "authenticator",
731
+ "authenticated",
732
+ "anon"
733
+ ]);
734
+ /**
735
+ * The `*` entries of `reserved_roles`: `postgres` may still `set` or `reset`
736
+ * their settings.
737
+ */
738
+ const CONFIGURABLE_ROLES = /* @__PURE__ */ new Set([
739
+ "service_role",
740
+ "authenticator",
741
+ "authenticated",
742
+ "anon"
743
+ ]);
744
+ /** `supautils.reserved_memberships` of the same image. */
745
+ const RESERVED_MEMBERSHIPS = /* @__PURE__ */ new Set([
746
+ "pg_read_server_files",
747
+ "pg_write_server_files",
748
+ "pg_execute_server_program",
749
+ "supabase_admin",
750
+ "supabase_auth_admin",
751
+ "supabase_storage_admin",
752
+ "supabase_read_only_user",
753
+ "supabase_realtime_admin",
754
+ "supabase_replication_admin",
755
+ "supabase_etl_admin",
756
+ "dashboard_user",
757
+ "pgbouncer",
758
+ "authenticator"
759
+ ]);
760
+ const ROLE = String.raw`(?:"[^"]+"|\w+)`;
761
+ const ROLES = String.raw`${ROLE}(?:\s*,\s*${ROLE})*`;
762
+ const ALTER_ROLE = new RegExp(String.raw`^alter\s+(role|user|group)\s+(${ROLE})\s+([\s\S]*)$`, "iu");
763
+ const DROP_ROLE = new RegExp(String.raw`^drop\s+(?:role|user|group)\s+(?:if\s+exists\s+)?(${ROLES})\s*$`, "iu");
764
+ const GRANT_ROLE = /^grant\s+([\s\S]+?)\s+to\s/iu;
765
+ const CREATE_IN_ROLE = new RegExp(String.raw`^create\s+(?:role|user|group)\s+${ROLE}\b[\s\S]*?\bin\s+(?:role|group)\s+(${ROLES})`, "iu");
766
+ const CONFIG_CHANGE = /^(?:in\s+database\s+\S+\s+)?(?:set|reset)\s/iu;
767
+ function roleName(name) {
768
+ return name.replaceAll("\"", "").toLowerCase();
769
+ }
770
+ function roleList(list) {
771
+ return list.split(",").map((name) => roleName(name.trim()));
772
+ }
773
+ function rejection(text) {
774
+ const alter = ALTER_ROLE.exec(text);
775
+ if (alter !== null) {
776
+ const role = roleName(group(alter, 2));
777
+ const rest = group(alter, 3);
778
+ if (group(alter, 1).toLowerCase() === "group" && /^add\s/iu.test(rest)) return RESERVED_MEMBERSHIPS.has(role) ? `grants membership in the reserved role ${role}` : void 0;
779
+ if (!RESERVED_ROLES.has(role) || CONFIGURABLE_ROLES.has(role) && CONFIG_CHANGE.test(rest)) return;
780
+ return `changes the reserved role ${role}`;
781
+ }
782
+ const drop = DROP_ROLE.exec(text);
783
+ if (drop !== null) {
784
+ const role = roleList(group(drop, 1)).find((name) => RESERVED_ROLES.has(name));
785
+ return role === void 0 ? void 0 : `drops the reserved role ${role}`;
786
+ }
787
+ const grant = GRANT_ROLE.exec(text);
788
+ const granted = CREATE_IN_ROLE.exec(text)?.[1] ?? (grant === null || /\bon\b/iu.test(group(grant, 1)) ? void 0 : group(grant, 1));
789
+ if (granted === void 0) return;
790
+ const role = roleList(granted).find((name) => RESERVED_MEMBERSHIPS.has(name));
791
+ return role === void 0 ? void 0 : `grants membership in the reserved role ${role}`;
792
+ }
793
+ /**
794
+ * The statements of `sql` that supautils rejects for a non-superuser: changing
795
+ * or dropping a reserved role, other than `set` or `reset` on the four API
796
+ * roles, and granting a reserved membership.
797
+ */
798
+ function supautilsRejections(sql) {
799
+ return sqlStatements(sql).flatMap(({ line, text }) => {
800
+ const reason = rejection(text);
801
+ return reason === void 0 ? [] : [{
802
+ line,
803
+ reason
804
+ }];
805
+ });
806
+ }
807
+ //#endregion
808
+ export { generateOptions as a, buildContext as c, rowHelpersSql as i, DROPPED_LIST as l, inheritTargets as n, isRefusal as o, levelKeys as r, splitsPart as s, supautilsRejections as t, rebuildPlan as u };