permdock 0.3.1 → 0.5.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (552) hide show
  1. package/README.md +37 -35
  2. package/dist/{openapi-schema--ARjyfQr.js → 2020-C9VN-x8c.js} +5 -132
  3. package/dist/a2a/index.d.ts +8 -6
  4. package/dist/a2a/index.js +21 -31
  5. package/dist/{adapter-context-mlWsVGGg.js → adapter-context-CRhqyzCk.js} +1 -1
  6. package/dist/adoption-scan-B4R5fnMU.js +107 -0
  7. package/dist/agent/index.d.ts +3 -0
  8. package/dist/agent/index.js +1 -0
  9. package/dist/ai-sdk/index.d.ts +18 -23
  10. package/dist/ai-sdk/index.js +38 -21
  11. package/dist/app-data-MuyzVqX8.js +60 -0
  12. package/dist/approval-header-CJACtHkv.js +23 -0
  13. package/dist/approval-prompt-Dg5LeAcT.js +62 -0
  14. package/dist/approval-prompt-Djo_PyZc.d.ts +57 -0
  15. package/dist/approvals/index.d.ts +5 -3
  16. package/dist/approvals/index.js +8 -5
  17. package/dist/approvals-DJ6Yd5z1.js +995 -0
  18. package/dist/{approvers-DT4AVyIg.js → approvers-CqPOLD-o.js} +1 -1
  19. package/dist/arazzo-B6lebmiQ.js +36 -0
  20. package/dist/{arazzo-BAgw9ap6.js → arazzo-BWhNF-k0.js} +24 -17
  21. package/dist/args-IIolxxKA.js +197 -0
  22. package/dist/astro/index.d.ts +43 -0
  23. package/dist/astro/index.js +27 -0
  24. package/dist/audience-Dg8XsRaO.js +55 -0
  25. package/dist/auth-DRLEizbL.js +178 -0
  26. package/dist/authzen/index.d.ts +26 -6
  27. package/dist/authzen/index.js +228 -75
  28. package/dist/automation-BMZPIVUM.d.ts +114 -0
  29. package/dist/automation-DVjOckjV.js +157 -0
  30. package/dist/better-auth/index.d.ts +8 -6
  31. package/dist/better-auth/index.js +11 -23
  32. package/dist/better-supabase/index.d.ts +438 -86
  33. package/dist/better-supabase/index.js +1027 -184
  34. package/dist/bind--9EFVYWF.d.ts +38 -0
  35. package/dist/{bind-CuzGytRf.js → bind-CZzhx-Vj.js} +22 -10
  36. package/dist/body-CH5of8Ne.js +10 -0
  37. package/dist/body-text-QcXok_SI.js +52 -0
  38. package/dist/build-instance-BMnAudHn.js +52 -0
  39. package/dist/{canonical-json-DemiK4Vp.js → canonical-json-BC8_nMTw.js} +6 -6
  40. package/dist/{capability-2kYTMWDv.d.ts → capability-BSslw1QV.d.ts} +44 -25
  41. package/dist/{capability-4qPdO9gk.js → capability-N1K9IpqS.js} +69 -42
  42. package/dist/casbin-Cr7RLtA3.js +30 -0
  43. package/dist/casbin-Dyu2gnUD.js +234 -0
  44. package/dist/casl-64gpT-8x.js +24 -0
  45. package/dist/casl-DjEDhTCP.js +299 -0
  46. package/dist/catalog/index.d.ts +74 -2
  47. package/dist/catalog/index.js +51 -2
  48. package/dist/catalog-BECMPrwc.js +100 -0
  49. package/dist/catalog-DjhMYYCq.js +1 -0
  50. package/dist/catalog-R_A__RsH.js +52 -0
  51. package/dist/{catalog-doc-DdGm82XT.js → catalog-doc-C9wjsfNY.js} +54 -25
  52. package/dist/catalog-fingerprint-CCP0-yQS.js +153 -0
  53. package/dist/chat/index.d.ts +2 -0
  54. package/dist/chat/index.js +224 -0
  55. package/dist/chat-sdk/index.d.ts +87 -0
  56. package/dist/chat-sdk/index.js +197 -0
  57. package/dist/claims-map-7oQ3ue4X.js +13 -0
  58. package/dist/claims-map-Ca-QX8C6.d.ts +32 -0
  59. package/dist/claude-agent/index.d.ts +7 -14
  60. package/dist/claude-agent/index.js +26 -30
  61. package/dist/clerk/index.d.ts +9 -8
  62. package/dist/clerk/index.js +15 -45
  63. package/dist/cli/bin.js +36 -17
  64. package/dist/cli/index.d.ts +20 -6
  65. package/dist/cli/index.js +164 -4
  66. package/dist/cloud/index.d.ts +102 -63
  67. package/dist/cloud/index.js +240 -347
  68. package/dist/cloud-CIoHNevm.js +87 -0
  69. package/dist/codemod-Bmj9dWMH.js +37 -0
  70. package/dist/codemod-Cxvvc70T.js +2084 -0
  71. package/dist/{collect-DSTE3ml9.js → collect-CrZJJnEF.js} +79 -17
  72. package/dist/collect-DloHbDVa.js +55 -0
  73. package/dist/collect-FlXJlhus.js +1 -0
  74. package/dist/command-L8EstFNm.js +6 -0
  75. package/dist/{compact-y6vfu2_f.js → compact-CAf557ZB.js} +11 -1
  76. package/dist/compile/index.d.ts +1 -1
  77. package/dist/compile/index.js +1 -2
  78. package/dist/{compile-Ba4blROR.js → compile-CMqMx_IN.js} +13 -9
  79. package/dist/{compile-BkRyBDBw.d.ts → compile-Ckm2HqBZ.d.ts} +5 -3
  80. package/dist/completion-BqhRBJD8.js +143 -0
  81. package/dist/config-B46rm9sc.js +26 -0
  82. package/dist/{config-BJiM-xAm.js → config-bs_kZeYq.js} +15 -10
  83. package/dist/{config-report-CdCgbRnV.js → config-report-DUgj62Ai.js} +17 -8
  84. package/dist/{connection-CU8MQxRi.js → connection-DjhIJSs2.js} +8 -6
  85. package/dist/constants-DcJABbLW.js +20 -0
  86. package/dist/{context-Bcy85rGi.js → context-bbFHR-0D.js} +16 -5
  87. package/dist/convex/index.d.ts +11 -10
  88. package/dist/convex/index.js +18 -18
  89. package/dist/create-0VZ7Pdiu.d.ts +107 -0
  90. package/dist/create-BDS7wc3y.d.ts +138 -0
  91. package/dist/create-BFfm17UA.d.ts +110 -0
  92. package/dist/create-BWRSXgOF.js +403 -0
  93. package/dist/create-C3b4B5eF.js +130 -0
  94. package/dist/create-DnrmLnLW.js +323 -0
  95. package/dist/{credential-8P81ff4u.js → credential-DM2um3ha.js} +153 -32
  96. package/dist/credentials-DPyHmYz5.js +74 -0
  97. package/dist/deciding-columns-Sq12mEA6.js +123 -0
  98. package/dist/delegation-DaXVdDhM.js +286 -0
  99. package/dist/delegation-input-FTxMK3ji.js +19 -0
  100. package/dist/delivery/index.d.ts +5 -0
  101. package/dist/delivery/index.js +5 -0
  102. package/dist/delivery-DCAgNyCn.js +499 -0
  103. package/dist/delivery-event-xX4obB8F.js +40 -0
  104. package/dist/denied-text-D8jDHgsl.d.ts +19 -0
  105. package/dist/{describe-DMYiCjJV.d.ts → describe-BZUsixiL.d.ts} +11 -2
  106. package/dist/{describe-B_gVZEVi.js → describe-BybMRY7A.js} +10 -5
  107. package/dist/device-BARQ8eYG.js +193 -0
  108. package/dist/diff-CxZo9pTq.js +37 -0
  109. package/dist/{diff-2VaeChzX.js → diff-DCePiN6M.js} +61 -55
  110. package/dist/doctor-CxiwSfqH.js +44 -0
  111. package/dist/doctor-DFjUxf2f.js +2361 -0
  112. package/dist/drizzle/index.d.ts +5 -3
  113. package/dist/drizzle/index.js +6 -14
  114. package/dist/elysia/index.d.ts +16 -13
  115. package/dist/elysia/index.js +14 -13
  116. package/dist/env-DJZrPjRi.js +8 -0
  117. package/dist/errors-BDUwg2qC.js +27 -0
  118. package/dist/{errors-Cz5zn0mW.js → errors-BKy0EfhN.js} +6 -10
  119. package/dist/errors-BWXBMaKK.d.ts +11 -0
  120. package/dist/{errors-DPdqI50v.d.ts → errors-C2PXIv4c.d.ts} +2 -2
  121. package/dist/errors-CWTY6uih.js +143 -0
  122. package/dist/evaluate-_R8QkWaf.js +1732 -0
  123. package/dist/evaluations-16UqqQ6W.d.ts +32 -0
  124. package/dist/{evaluations-tz6D9A2G.js → evaluations-DZ2CbV5k.js} +181 -32
  125. package/dist/eve/index.d.ts +12 -16
  126. package/dist/eve/index.js +23 -29
  127. package/dist/event-time-CsegxXxB.js +23 -0
  128. package/dist/expiry-D4_YKRKD.js +52 -0
  129. package/dist/express/index.d.ts +13 -10
  130. package/dist/express/index.js +14 -12
  131. package/dist/fastify/index.d.ts +26 -13
  132. package/dist/fastify/index.js +17 -36
  133. package/dist/fetch-adapter-g0ypLkID.js +120 -0
  134. package/dist/fetch-adapter-qKJBuRqy.d.ts +31 -0
  135. package/dist/fields-D9tPVUUS.js +203 -0
  136. package/dist/files-C5ZI27eV.js +124 -0
  137. package/dist/{files-DWUN9PzI.js → files-D_JIzUrP.js} +12 -3
  138. package/dist/{fixtures-ht28Cplr.js → fixtures-B7XrLeY7.js} +12 -12
  139. package/dist/flags-C3DktBDY.js +86 -0
  140. package/dist/{from-snapshot-CTLijvdm.js → from-snapshot-D2lZt4Dd.js} +78 -65
  141. package/dist/{generate-CH7ThJ14.js → generate-CNU1pIOo.js} +1 -3
  142. package/dist/grantee-Cn1HyUsI.js +254 -0
  143. package/dist/grantee-conditions-CcXf8hMM.js +271 -0
  144. package/dist/grantee-match-DHArqY82.js +142 -0
  145. package/dist/h3/index.d.ts +37 -0
  146. package/dist/h3/index.js +35 -0
  147. package/dist/headers-BIjfMaoC.js +8 -0
  148. package/dist/headers-CIbDTUTK.d.ts +7 -0
  149. package/dist/{helpers-H_KARDVC.js → helpers-DTcZOzhF.js} +47 -39
  150. package/dist/hono/index.d.ts +12 -9
  151. package/dist/hono/index.js +14 -13
  152. package/dist/{hosted-DJQw46hn.js → hosted-BZIAYvon.js} +64 -15
  153. package/dist/hosted-DBDX0M-P.d.ts +78 -0
  154. package/dist/{http-SO7qGttf.js → http-BBoKefeS.js} +35 -2
  155. package/dist/{http-DPuDaChb.d.ts → http-B_LphE5Y.d.ts} +1 -2
  156. package/dist/http-DXJ37RDA.js +46 -0
  157. package/dist/{http-BIhmLfCc.js → http-ujKm0JXE.js} +3 -26
  158. package/dist/{openapi-import-cmwetbzw.js → import-CNV7I2Dw.js} +30 -26
  159. package/dist/{rls-import-4lLW_pbb.js → import-DMmOG27O.js} +271 -128
  160. package/dist/index-BcHcPyIo.d.ts +110 -0
  161. package/dist/index-CaxrMD1A.d.ts +1 -0
  162. package/dist/index-Chrs5fQ-.d.ts +210 -0
  163. package/dist/index-CxGUswIC.d.ts +431 -0
  164. package/dist/index-D8EovfsP.d.ts +91 -0
  165. package/dist/index-DOVf7RJv.d.ts +900 -0
  166. package/dist/{index-C8z4RjQV.d.ts → index-SGdIQyzc.d.ts} +34 -16
  167. package/dist/index.d.ts +20 -14
  168. package/dist/index.js +33 -23
  169. package/dist/init-DeMYsnYJ.js +96 -0
  170. package/dist/init-GG6Jh8HD.js +95 -0
  171. package/dist/{instance-options-jARdwfPN.d.ts → instance-options-Omfd793B.d.ts} +2 -2
  172. package/dist/instance-snapshot-Cxq4ygFc.js +600 -0
  173. package/dist/instant-BluqDvyS.js +19 -0
  174. package/dist/internals-Dk8A8fX3.js +17 -0
  175. package/dist/{json-schema-BsAflUGW.js → json-schema-B-vAwlde.js} +46 -9
  176. package/dist/json-schema-CN_iLFH2.d.ts +40 -0
  177. package/dist/jwt/index.d.ts +18 -11
  178. package/dist/jwt/index.js +166 -145
  179. package/dist/{kernel-_RRHmnMY.js → kernel-5JatXyND.js} +120 -43
  180. package/dist/kysely/index.d.ts +5 -3
  181. package/dist/kysely/index.js +6 -14
  182. package/dist/{live-options-H2eG8dfJ.js → live-options-BaAFCIiu.js} +16 -3
  183. package/dist/load-BxEtwlBS.js +1 -0
  184. package/dist/{load-DhWEB9P1.js → load-DFS_ry0W.js} +31 -7
  185. package/dist/{load-jose-BL6LH4bL.js → load-jose-DZ4dnjri.js} +1 -4
  186. package/dist/login-Dfe5RlYk.js +68 -0
  187. package/dist/login-imhuwvn3.js +254 -0
  188. package/dist/manifest-C8IzW3Do.js +42 -0
  189. package/dist/manifest-CtKR3GXL.js +370 -0
  190. package/dist/manifest-json-CAGzls-C.js +9 -0
  191. package/dist/{manifest-uDS9y5de.d.ts → manifest-mx5ghSFM.d.ts} +9 -2
  192. package/dist/manifest-schema-C0kK_8V0.js +399 -0
  193. package/dist/{map-claims-Z4QZOiFF.js → map-claims-D3oRmTk0.js} +19 -25
  194. package/dist/{map-error-pgUWNNtG.js → map-error-TCAdw-eW.js} +5 -5
  195. package/dist/{markers-B0hYLvMD.js → markers-C6joDI3o.js} +8 -3
  196. package/dist/mcp/index.d.ts +36 -9
  197. package/dist/mcp/index.js +476 -448
  198. package/dist/{rls-migrate-CN4TlJTO.js → migrate-BShP7Vf4.js} +119 -20
  199. package/dist/nest/index.d.ts +12 -9
  200. package/dist/nest/index.js +20 -20
  201. package/dist/next/index.d.ts +40 -20
  202. package/dist/next/index.js +37 -39
  203. package/dist/next/plugin.d.ts +1 -1
  204. package/dist/next/plugin.js +2 -2
  205. package/dist/node/index.d.ts +10 -10
  206. package/dist/node/index.js +7 -9
  207. package/dist/ocsf-BFp-PZZA.js +126 -0
  208. package/dist/openai/index.d.ts +9 -16
  209. package/dist/openai/index.js +18 -25
  210. package/dist/openapi/index.d.ts +3 -3
  211. package/dist/openapi/index.js +1 -1
  212. package/dist/{openapi-BqRBvAng.js → openapi-B7HZ0f-r.js} +9 -12
  213. package/dist/{openapi-CqqEbHsL.js → openapi-DTaEmTSW.js} +23 -26
  214. package/dist/openapi-ahr8rHu3.js +138 -0
  215. package/dist/operation-findings-DgATDpvh.js +36 -0
  216. package/dist/operations-CxybZErY.d.ts +59 -0
  217. package/dist/orpc/index.d.ts +13 -10
  218. package/dist/orpc/index.js +23 -20
  219. package/dist/otel/index.d.ts +3 -2
  220. package/dist/otel/index.js +53 -27
  221. package/dist/output-Dyw8fyPF.js +88 -0
  222. package/dist/output-files-B3IZJksC.js +1 -0
  223. package/dist/output-files-DhRBBE4n.js +138 -0
  224. package/dist/{rls-fields-CZOMlwHl.js → ownership-BatFgAA4.js} +2393 -2349
  225. package/dist/{package-root-zGkxO3oN.js → package-root-Dk_ETdkp.js} +4 -3
  226. package/dist/{parse-BuyjxhZV.js → parse-Cxq0WxrA.js} +3 -3
  227. package/dist/{parse-local-manifest-BrMozJCo.js → parse-local-manifest-CVSs6J9I.js} +2 -4
  228. package/dist/{parse-local-manifest-JLnaBH0S.d.ts → parse-local-manifest-DgqtruPn.d.ts} +1 -1
  229. package/dist/parse-request-D_tUXG6M.js +26 -0
  230. package/dist/paths-DXSHAMIa.js +42 -0
  231. package/dist/pdp/index.d.ts +7 -3
  232. package/dist/pdp/index.js +47 -29
  233. package/dist/{peer-BOr_kJE1.js → peer-C8swJ2GH.js} +23 -4
  234. package/dist/peer-CRvC7Hg1.js +1 -0
  235. package/dist/permdock-B9JxkBwC.js +868 -0
  236. package/dist/permdock-D7eeLJER.d.ts +502 -0
  237. package/dist/permission-registry-Br4jSNVi.js +385 -0
  238. package/dist/permissions-B-wCP5ZC.js +30 -0
  239. package/dist/{permissions-RJrovw98.js → permissions-CZKiUfFM.js} +4 -3
  240. package/dist/{permissions-CDgvKG5L.d.ts → permissions-oEWfl-kl.d.ts} +1 -2
  241. package/dist/policies-CO1oOymN.js +295 -0
  242. package/dist/{policy-D2W7uv19.d.ts → policy-Czo4n3Hs.d.ts} +2 -2
  243. package/dist/policy-DLZJ5gAp.js +399 -0
  244. package/dist/policy-from-catalog-DzhEc3Y9.js +450 -0
  245. package/dist/policy-module-CTlwMvLI.js +89 -0
  246. package/dist/{policy-IB6yxpC3.d.ts → policy-types-DzwivBgR.d.ts} +939 -1057
  247. package/dist/postgrest-CW0IqC-U.js +566 -0
  248. package/dist/postgrest-NUqZT-RB.d.ts +100 -0
  249. package/dist/powersync-BHfuehf3.js +62 -0
  250. package/dist/powersync-CbzkqL_M.js +1 -0
  251. package/dist/{powersync-Dv1_aWF7.js → powersync-bYUDLOAO.js} +30 -32
  252. package/dist/preset/index.d.ts +146 -0
  253. package/dist/preset/index.js +1 -0
  254. package/dist/preset-DZdU0tne.js +1768 -0
  255. package/dist/principal-source-pHneukrx.js +103 -0
  256. package/dist/prisma/index.d.ts +6 -3
  257. package/dist/prisma/index.js +6 -12
  258. package/dist/{problem-B43ztKIm.js → problem-CTviyH5L.js} +18 -27
  259. package/dist/{problem-details-DX075l9V.d.ts → problem-details-DXlt-vks.d.ts} +1 -1
  260. package/dist/{problem-details-_AMOYz-w.js → problem-details-cn5X30gZ.js} +45 -42
  261. package/dist/problem-types-CJ2325SZ.js +5 -0
  262. package/dist/{prompt-CXYhLfsS.js → prompt-DfZLJLIn.js} +2 -2
  263. package/dist/protected-DEPHc2xV.d.ts +38 -0
  264. package/dist/{protected-utU-SLuy.js → protected-DfjY5mLA.js} +37 -8
  265. package/dist/{provider-CSQd7m92.js → provider-CC-u3bYP.js} +23 -10
  266. package/dist/{provider-DZY281jO.d.ts → provider-DMVt6yYn.d.ts} +1 -1
  267. package/dist/{provider-store-Cfbvo4DE.js → provider-store-B5Yrkhzr.js} +6 -3
  268. package/dist/pull-BgIfno6w.js +256 -0
  269. package/dist/pull-ByOks_Tg.js +1 -0
  270. package/dist/push-CmFVBOeI.js +116 -0
  271. package/dist/pushed-policy-BImMTTIM.d.ts +57 -0
  272. package/dist/pushed-policy-DobP7AHI.js +238 -0
  273. package/dist/react/index.d.ts +8 -8
  274. package/dist/react/index.js +6 -6
  275. package/dist/react/provider-client.d.ts +1 -1
  276. package/dist/react/provider-client.js +1 -2
  277. package/dist/react-native/index.d.ts +24 -63
  278. package/dist/react-native/index.js +45 -27
  279. package/dist/{refs-KYb4ntaz.js → refs-K6eWUJ0H.js} +1 -1
  280. package/dist/relation-walk-3OyDBF0S.js +186 -0
  281. package/dist/relations-BnCWnJGI.js +163 -0
  282. package/dist/renames-CGj7YwcQ.js +175 -0
  283. package/dist/{replay-CYyiLiwO.d.ts → replay-D7iKcLFe.d.ts} +1 -1
  284. package/dist/{replay-BsOyTrdV.js → replay-Du1tJjG7.js} +2 -1
  285. package/dist/request-context-BTRTG7OT.js +71 -0
  286. package/dist/request-context-C2_1lchh.d.ts +5 -0
  287. package/dist/request-schema-CMreVuFM.js +148 -0
  288. package/dist/resend/index.d.ts +126 -0
  289. package/dist/resend/index.js +379 -0
  290. package/dist/resource-relations-D_jw0BFx.js +243 -0
  291. package/dist/retire-CALjIQ7e.js +240 -0
  292. package/dist/{revocations-Cy06JNx2.d.ts → revocations-R07lFBnX.d.ts} +2 -0
  293. package/dist/rls-BA8an5Ap.js +336 -0
  294. package/dist/{rls-DiinlRML.js → rls-j6t43t7n.js} +1066 -1068
  295. package/dist/role-builder-CXbis5-X.js +623 -0
  296. package/dist/{rpc-DL9Sqvb1.js → rpc-aPyNi6tA.js} +18 -8
  297. package/dist/run-CNsApDpd.js +1 -0
  298. package/dist/run-DOfMtc9V.js +723 -0
  299. package/dist/run-ticket-BjhTOi6u.d.ts +124 -0
  300. package/dist/run-ticket-sxFI6LAk.js +337 -0
  301. package/dist/{runtime-CB8gQFvS.js → runtime-D3VTAiCA.js} +1 -1
  302. package/dist/{saas-DhpJjnBA.js → saas-FO-Q8oj0.js} +18 -15
  303. package/dist/scan-BOI5tJ-6.js +29 -0
  304. package/dist/{schema-D3MnDMxa.js → schema-B4v0Qrac.js} +106 -10
  305. package/dist/schema-yLuBWWsh.js +130 -0
  306. package/dist/scim/index.d.ts +2 -2
  307. package/dist/scim/index.js +1 -2
  308. package/dist/{scim-BFGBBAqR.js → scim-ClHtpyV3.js} +213 -87
  309. package/dist/{scopes-CVdPrWN-.js → scopes-CUPSjo9q.js} +20 -7
  310. package/dist/server/index.d.ts +13 -134
  311. package/dist/server/index.js +13 -10
  312. package/dist/server-DqCT4CgZ.js +453 -0
  313. package/dist/{create-B1d519XK.d.ts → server-types-BLd4MnBX.d.ts} +89 -70
  314. package/dist/{sha256-BO0swRXL.js → sha256-D9ihqmvd.js} +8 -1
  315. package/dist/shared-CD11nBbC.js +304 -0
  316. package/dist/{shared-DRu8VFVM.js → shared-DvvFzYXe.js} +8 -9
  317. package/dist/signals-D3NcTKUS.js +32 -0
  318. package/dist/sink-BEZSlMS_.js +957 -0
  319. package/dist/sink-Bj_lDUDq.d.ts +225 -0
  320. package/dist/{skills-Biq5uup3.js → skills-B6lVdD_W.js} +16 -8
  321. package/dist/skills-CTYwkl44.js +51 -0
  322. package/dist/snapshot-CXUWfsNy.js +269 -0
  323. package/dist/{snapshot-cache-D6jLelln.js → snapshot-cache-DZHQ0KF6.js} +11 -5
  324. package/dist/{snapshot-cache-B-LxUahj.d.ts → snapshot-cache-DqK9eDmM.d.ts} +7 -5
  325. package/dist/solid/index.d.ts +24 -25
  326. package/dist/solid/index.js +41 -11
  327. package/dist/solid-start/index.d.ts +52 -0
  328. package/dist/solid-start/index.js +49 -0
  329. package/dist/{sources-BdOYLw9j.d.ts → sources-BV9j0DeZ.d.ts} +11 -13
  330. package/dist/{sources-4p0-4xQm.js → sources-vs5dGOsS.js} +147 -142
  331. package/dist/sql-B5T1IL83.js +55 -0
  332. package/dist/src-DLfUWFAI.js +1851 -0
  333. package/dist/ssf/index.d.ts +4 -4
  334. package/dist/ssf/index.js +440 -106
  335. package/dist/standard-webhooks-6lg8v_is.d.ts +88 -0
  336. package/dist/standard-webhooks-DgFFD-Ga.js +228 -0
  337. package/dist/storage-C2bWdvJH.js +132 -0
  338. package/dist/{store-DMAWwAJV.js → store-4u_hxjWa.js} +42 -55
  339. package/dist/{store-options-ByhZq1jV.js → store-options-BqEakYRa.js} +38 -24
  340. package/dist/{stores-BT2pSCub.js → stores-BbsD4fAR.js} +7 -3
  341. package/dist/stores-ClZUgeoP.d.ts +30 -0
  342. package/dist/{stream-D1RXubw2.d.ts → stream-7-xmnf3U.d.ts} +2 -2
  343. package/dist/{stream-DDpvynSB.js → stream-CvdUS9V1.js} +10 -2
  344. package/dist/style-DiKWnAvn.js +1 -0
  345. package/dist/{style-CTm1AXDT.js → style-Uao76wO7.js} +3 -2
  346. package/dist/subject-BGoM5o8B.js +17 -0
  347. package/dist/{subject-settings-BwBmCdTR.js → subject-settings-CkEwrw3W.js} +23 -5
  348. package/dist/supabase/index.d.ts +23 -106
  349. package/dist/supabase/index.js +5 -4
  350. package/dist/supabase/middleware.d.ts +13 -6
  351. package/dist/supabase/middleware.js +16 -11
  352. package/dist/supabase-9pqI57pW.js +92 -0
  353. package/dist/{supabase-C0qESOa-.js → supabase-Dxlp8A94.js} +124 -247
  354. package/dist/supabase-hook-CXcGpHqq.js +1 -0
  355. package/dist/{supabase-hook-ntETYCQu.js → supabase-hook-DdDQhMlw.js} +1659 -819
  356. package/dist/{supautils-u8jXTGrt.js → supautils-B6HYL9eL.js} +2 -2
  357. package/dist/support-session-C6xJQYut.js +158 -0
  358. package/dist/svelte/Protected.svelte +11 -4
  359. package/dist/svelte/index.d.ts +7 -7
  360. package/dist/svelte/index.js +26 -12
  361. package/dist/svelte/runtime.d.ts +10 -3
  362. package/dist/svelte/runtime.js +4 -3
  363. package/dist/svelte/source.d.ts +7 -7
  364. package/dist/svelte/source.js +5 -5
  365. package/dist/sveltekit/index.d.ts +51 -0
  366. package/dist/sveltekit/index.js +27 -0
  367. package/dist/tanstack-start/index.d.ts +51 -0
  368. package/dist/tanstack-start/index.js +40 -0
  369. package/dist/target-Bw37TFNA.js +51 -0
  370. package/dist/{validity-uOp8UpYn.js → tenancy-DN2QAx9z.js} +6 -42
  371. package/dist/terminal/index.d.ts +11 -9
  372. package/dist/terminal/index.js +36 -316
  373. package/dist/testing/index.d.ts +391 -106
  374. package/dist/testing/index.js +4574 -1286
  375. package/dist/testing/saas/index.d.ts +9 -8
  376. package/dist/testing/saas/index.js +2 -2
  377. package/dist/testing/saas/permissions.d.ts +1 -1
  378. package/dist/testing/saas/permissions.js +1 -2
  379. package/dist/text-BMFRfBqc.js +8 -0
  380. package/dist/{text-diff-BdkkYSbi.js → text-diff-BQcUapOb.js} +1 -1
  381. package/dist/thenable-yD7SabqG.js +31 -0
  382. package/dist/time-DkWjdL98.js +71 -0
  383. package/dist/{token-CIWxJOCh.js → token-BLZcjQgt.js} +15 -6
  384. package/dist/tool-refusal-CMLN5xhn.js +41 -0
  385. package/dist/trpc/index.d.ts +12 -9
  386. package/dist/trpc/index.js +18 -17
  387. package/dist/{types-DbjRN55U.d.ts → types-5Ut_pbKy.d.ts} +141 -13
  388. package/dist/types-BNORmDM8.d.ts +172 -0
  389. package/dist/types-BjV-fqcA.d.ts +57 -0
  390. package/dist/{types-QCuYJh4q.d.ts → types-BqAKcRNW.d.ts} +2 -1
  391. package/dist/types-C8-KNsFf.d.ts +107 -0
  392. package/dist/{types-aqOHTHcp.d.ts → types-CCpc2Dcv.d.ts} +77 -17
  393. package/dist/{types-Dnemwd77.d.ts → types-CZTnPFzM.d.ts} +50 -11
  394. package/dist/{types-C97IskBw.d.ts → types-CdlxsYQh.d.ts} +23 -11
  395. package/dist/{types-DxiCGmmd.d.ts → types-ClZaWzfb.d.ts} +9 -6
  396. package/dist/types-DX0LaKTb.d.ts +157 -0
  397. package/dist/types-DiQjupG2.d.ts +332 -0
  398. package/dist/types-DqzsnlSA.js +67 -0
  399. package/dist/types-_sHy8BQf.d.ts +65 -0
  400. package/dist/types-fbZ7JEXr.d.ts +89 -0
  401. package/dist/types-tIgIeIKJ.d.ts +66 -0
  402. package/dist/unplugin/index.d.ts +1 -1
  403. package/dist/unplugin/index.js +2 -2
  404. package/dist/usage-CHOtwL19.js +1 -0
  405. package/dist/usage-DHtE8j4E.js +32 -0
  406. package/dist/{usage-ItS7nLcl.js → usage-T5mXq98v.js} +56 -13
  407. package/dist/{validation-error-Ba264OaJ.d.ts → validation-error-Bg5Tpluk.d.ts} +1 -1
  408. package/dist/{validation-error-CnjZ4t92.js → validation-error-ZfUHbKvf.js} +1 -1
  409. package/dist/validity-CZ7-y0Cj.js +79 -0
  410. package/dist/{verifier-BxBo6I44.js → verifier-DHuh-okk.js} +68 -21
  411. package/dist/verify-DbCL9bnB.js +1770 -0
  412. package/dist/{version-BvacVTZR.js → version-CEbQ5UeM.js} +4 -3
  413. package/dist/version-DXkYUISx.js +1 -0
  414. package/dist/{views-Soe7bGSC.js → views-DTIIO-oQ.js} +41 -2
  415. package/dist/{permissions-DttnqqxC.d.ts → vocabulary-D6lPdb4Z.d.ts} +120 -29
  416. package/dist/vue/index.d.ts +25 -21
  417. package/dist/vue/index.js +25 -9
  418. package/dist/waiter-BGUtGYoU.js +67 -0
  419. package/dist/waiter-CKy4MQSY.d.ts +36 -0
  420. package/dist/watch-Cb-NcaUw.js +1 -0
  421. package/dist/{watch-DVBJ9cBq.js → watch-CszoTJMq.js} +47 -8
  422. package/dist/webmcp/index.d.ts +2 -2
  423. package/dist/webmcp/index.js +13 -37
  424. package/dist/where-scope-Dv-WTP-w.js +306 -0
  425. package/dist/who-can-D0QoYbEb.js +364 -0
  426. package/dist/wire-delegation-Cv3W2eaM.js +36 -0
  427. package/dist/wire-denial-C7PaVYEM.js +27 -0
  428. package/dist/workflow/index.d.ts +5 -0
  429. package/dist/workflow/index.js +223 -0
  430. package/dist/workflow-sdk/index.d.ts +56 -0
  431. package/dist/workflow-sdk/index.js +78 -0
  432. package/dist/wrap-Bd1Tejur.d.ts +15 -0
  433. package/dist/wrap-gX61EtpB.js +27 -0
  434. package/package.json +140 -41
  435. package/schemas/access-event-v1.json +118 -0
  436. package/schemas/approval-request-v1.json +34 -1
  437. package/schemas/approval-signature-v1.json +94 -0
  438. package/schemas/automation-event-v1.json +113 -0
  439. package/schemas/capability-v1.json +84 -0
  440. package/schemas/catalog-event-v1.json +87 -0
  441. package/schemas/catalog-v1.json +129 -12
  442. package/schemas/cli-commands-v1.json +164 -0
  443. package/schemas/cli-result-v1.json +96 -0
  444. package/schemas/cloud-api-v1.json +5407 -0
  445. package/schemas/connector-v1.json +408 -0
  446. package/schemas/credential-event-v1.json +81 -0
  447. package/schemas/credential-v1.json +134 -0
  448. package/schemas/decision-event-v1.json +288 -0
  449. package/schemas/delivery-event-v1.json +117 -0
  450. package/schemas/directory-event-v1.json +85 -0
  451. package/schemas/evidence-export-v1.json +54 -0
  452. package/schemas/membership-event-v1.json +93 -0
  453. package/schemas/policy-v1.json +68 -0
  454. package/schemas/pushed-policy-v1.json +236 -0
  455. package/schemas/run-v1.json +162 -0
  456. package/schemas/snapshot-v1.json +138 -0
  457. package/schemas/supabase-claims-v1.json +4 -4
  458. package/schemas/supabase-manifest-v1.json +5 -1
  459. package/schemas/support-session-v1.json +111 -0
  460. package/skills/permdock/SKILL.md +16 -12
  461. package/skills/permdock-agents/SKILL.md +40 -23
  462. package/skills/permdock-agents/references/operations-automations-chat.md +221 -0
  463. package/skills/permdock-agents/references/runtimes.md +22 -18
  464. package/skills/permdock-approvals/SKILL.md +29 -13
  465. package/skills/permdock-approvals/references/delivery-and-waiters.md +172 -0
  466. package/skills/permdock-approvals/references/stores-and-resume.md +21 -7
  467. package/skills/permdock-audit/SKILL.md +3 -3
  468. package/skills/permdock-credentials/SKILL.md +5 -5
  469. package/skills/permdock-credentials/references/tokens-keys-links.md +19 -10
  470. package/skills/permdock-data/SKILL.md +6 -6
  471. package/skills/permdock-data/references/queries-and-rls.md +13 -8
  472. package/skills/permdock-data/references/relationships.md +3 -3
  473. package/skills/permdock-tenancy/SKILL.md +20 -7
  474. package/skills/permdock-tenancy/references/contacts-and-support-sessions.md +122 -0
  475. package/skills/permdock-tenancy/references/ownership-and-custom-roles.md +6 -4
  476. package/skills/permdock-wire/SKILL.md +18 -12
  477. package/skills/permdock-wire/references/adapters.md +146 -50
  478. package/skills/permdock-wire/references/policy-options.md +15 -6
  479. package/skills/permdock-wire/references/presets-and-recipes.md +58 -0
  480. package/dist/approvals-DbYAuNkG.js +0 -224
  481. package/dist/arazzo-C9chp3ST.js +0 -54
  482. package/dist/bind-C_ob3LKa.d.ts +0 -25
  483. package/dist/catalog-CRW5Mx_B.js +0 -2
  484. package/dist/catalog-CYj-mX2O.js +0 -48
  485. package/dist/catalog-DWF5cYqB.js +0 -55
  486. package/dist/cloud-CfwZ39Rl.js +0 -50
  487. package/dist/cloud-DWLXO2af.js +0 -118
  488. package/dist/collect-CHB22Sx4.js +0 -83
  489. package/dist/collect-DSWOk19R.js +0 -2
  490. package/dist/commands-BeaGNj_o.js +0 -97
  491. package/dist/config-ir40y8m0.js +0 -36
  492. package/dist/create-CMwIl-w2.js +0 -253
  493. package/dist/delegation-D8pUEuce.js +0 -103
  494. package/dist/diff-C9RDjjhs.js +0 -48
  495. package/dist/doctor-Djh6JDEk.js +0 -53
  496. package/dist/doctor-DvH0IQff.js +0 -1194
  497. package/dist/doctor-collect-CjdO0wQX.js +0 -665
  498. package/dist/duration-xK2jGFVc.js +0 -25
  499. package/dist/errors-CWfoNg9N.js +0 -47
  500. package/dist/errors-DRnGZHzF.js +0 -30
  501. package/dist/evaluation-items-CfCCejQd.js +0 -40
  502. package/dist/expiry-BoBJ8Tvc.js +0 -7
  503. package/dist/fields-BMl1RxoX.js +0 -26
  504. package/dist/grantee-Cv5Sogfv.js +0 -602
  505. package/dist/headers-BZSDieNT.js +0 -6
  506. package/dist/headers-Cf-zWvsO.d.ts +0 -6
  507. package/dist/ids-DC4V4CFu.js +0 -18
  508. package/dist/index-0nNqHspG.d.ts +0 -6
  509. package/dist/index-BNc7Wer_.d.ts +0 -483
  510. package/dist/index-C7Tw7MaW.d.ts +0 -201
  511. package/dist/instance-options-Dhhcnm3y.js +0 -22
  512. package/dist/load-DwJUafYN.js +0 -2
  513. package/dist/manifest-iaoBXHKc.js +0 -783
  514. package/dist/map-AcxK9o_D.js +0 -147
  515. package/dist/may-use-DndQ5tQ-.js +0 -77
  516. package/dist/openapi-CQTsgKoB.js +0 -164
  517. package/dist/permdock-CbgvLnuo.js +0 -3479
  518. package/dist/permissions-DVoF6dMt.js +0 -662
  519. package/dist/policy-xyWg7QdR.js +0 -1122
  520. package/dist/powersync-CrBX8hY6.js +0 -2
  521. package/dist/powersync-DE19b9dT.js +0 -62
  522. package/dist/protected-BdnIEFkY.d.ts +0 -27
  523. package/dist/protected-xAr24FEC.d.ts +0 -40
  524. package/dist/relations-cjOL01hZ.js +0 -505
  525. package/dist/rls-P-BeBx0n.js +0 -238
  526. package/dist/rls-graph-CHwx0V8q.js +0 -435
  527. package/dist/rls-ownership-DcYlZ09B.js +0 -843
  528. package/dist/rls-shared-Cewd_-zI.js +0 -495
  529. package/dist/rls-verify-CMv9H3wV.js +0 -746
  530. package/dist/run-BWc9qqvE.js +0 -174
  531. package/dist/server-DlZ28Oz5.js +0 -268
  532. package/dist/sink-B1fZzIMf.d.ts +0 -104
  533. package/dist/sink-Bd9PSyfq.js +0 -141
  534. package/dist/skills-C5CbhhpG.js +0 -56
  535. package/dist/snapshot-Enxd0n-s.js +0 -975
  536. package/dist/sql-xdg5f4Fi.js +0 -27
  537. package/dist/src-BDwEZWrZ.js +0 -568
  538. package/dist/store-jOBYpiXC.d.ts +0 -36
  539. package/dist/stores-C0IMQrGI.d.ts +0 -52
  540. package/dist/subject-C6dLxqHU.js +0 -24
  541. package/dist/supabase-config-Bj3iDH2I.js +0 -472
  542. package/dist/supabase-hook-gd3s8bxB.js +0 -2
  543. package/dist/supabase-s4o9s1O1.js +0 -83
  544. package/dist/thenable-okc2xDsj.js +0 -10
  545. package/dist/types-BnIEz1sU.d.ts +0 -48
  546. package/dist/types-Bvc4oWT6.d.ts +0 -9
  547. package/dist/types-CKNSyIf_.d.ts +0 -52
  548. package/dist/types-Cq_H8N_X.d.ts +0 -197
  549. package/dist/usage-B0YuTQRO.js +0 -42
  550. package/dist/usage-DorAJiU_.js +0 -2
  551. package/dist/vocabulary-DA8a8zif.d.ts +0 -56
  552. package/dist/watch-BwxLTYMZ.js +0 -2
@@ -1,238 +0,0 @@
1
- import { i as globalArgs, s as stringArg, t as COMMAND_DESCRIPTIONS } from "./commands-BeaGNj_o.js";
2
- import { defineCommand } from "citty";
3
- //#region src/cli/commands/rls.ts
4
- function rls(ctx) {
5
- return defineCommand({
6
- meta: {
7
- name: "rls",
8
- description: COMMAND_DESCRIPTIONS.rls
9
- },
10
- args: {
11
- ...globalArgs,
12
- action: {
13
- type: "positional",
14
- required: false,
15
- description: "generate, import, verify or migrate"
16
- },
17
- target: {
18
- type: "enum",
19
- options: [
20
- "sql",
21
- "drizzle",
22
- "prisma"
23
- ],
24
- description: "generate: output form"
25
- },
26
- dialect: {
27
- type: "enum",
28
- options: [
29
- "supabase",
30
- "neon",
31
- "guc"
32
- ],
33
- description: "How the database reads the subject (default rls.dialect)"
34
- },
35
- out: {
36
- type: "string",
37
- description: "File to write",
38
- valueHint: "file"
39
- },
40
- from: {
41
- type: "string",
42
- description: "Module exporting the policy, instead of the config",
43
- valueHint: "module"
44
- },
45
- sql: {
46
- type: "string",
47
- description: "import / migrate: SQL file or folder to read",
48
- valueHint: "path"
49
- },
50
- db: {
51
- type: "string",
52
- description: "Postgres connection string",
53
- valueHint: "url"
54
- },
55
- fixtures: {
56
- type: "string",
57
- description: "verify: fixtures file",
58
- valueHint: "file"
59
- },
60
- schema: {
61
- type: "string",
62
- description: "import: schema library, or the helper schema",
63
- valueHint: "name"
64
- },
65
- memberships: {
66
- type: "string",
67
- description: "import: membership table",
68
- valueHint: "table"
69
- },
70
- format: {
71
- type: "string",
72
- description: "verify: node or pgtap",
73
- valueHint: "format"
74
- },
75
- emit: {
76
- type: "string",
77
- description: "Alias of --format",
78
- valueHint: "format"
79
- },
80
- rbac: {
81
- type: "enum",
82
- options: ["supabase"],
83
- description: "generate: scaffold the role tables for this provider"
84
- },
85
- "rbac-scaffold": {
86
- type: "boolean",
87
- description: "generate: scaffold the role tables"
88
- },
89
- "rbac-schema": {
90
- type: "string",
91
- description: "Schema for the scaffolded role tables",
92
- valueHint: "name"
93
- },
94
- authorize: {
95
- type: "string",
96
- description: "Where roles are read: 'jwt' or 'database'",
97
- valueHint: "mode"
98
- },
99
- check: {
100
- type: "boolean",
101
- description: "Exit 1 when the files on disk are stale; write nothing"
102
- },
103
- "skip-closures": {
104
- type: "boolean",
105
- description: "Skip grants with closures instead of failing"
106
- },
107
- "inline-functions": {
108
- type: "boolean",
109
- description: "Inline helper calls into the policies"
110
- },
111
- force: {
112
- type: "boolean",
113
- description: "Overwrite an existing file"
114
- },
115
- "guc-prefix": {
116
- type: "string",
117
- description: "guc dialect: setting prefix",
118
- valueHint: "prefix"
119
- },
120
- "policy-per-role": {
121
- type: "boolean",
122
- description: "One policy per role instead of one per command"
123
- },
124
- "policy-name": {
125
- type: "string",
126
- description: "Policy name template",
127
- valueHint: "template"
128
- },
129
- "tenant-type": {
130
- type: "string",
131
- description: "Postgres type of the tenant column",
132
- valueHint: "type"
133
- },
134
- "custom-roles": {
135
- type: "boolean",
136
- description: "Emit the custom role tables and helpers"
137
- },
138
- capabilities: {
139
- type: "boolean",
140
- description: "Emit the link capability helpers"
141
- },
142
- fields: {
143
- type: "string",
144
- description: "Field security: 'views'",
145
- valueHint: "mode"
146
- },
147
- "revoke-columns": {
148
- type: "boolean",
149
- description: "Revoke restricted columns on the table"
150
- },
151
- tree: {
152
- type: "boolean",
153
- description: "verify: check the relationship closure"
154
- },
155
- introspect: {
156
- type: "boolean",
157
- description: "verify: compare against the live database"
158
- },
159
- advisors: {
160
- type: "boolean",
161
- description: "verify: run the Supabase security advisors"
162
- },
163
- split: {
164
- type: "string",
165
- description: "Write helpers, seeds, policies and hook as separate parts",
166
- valueHint: "parts"
167
- },
168
- "grants-out": {
169
- type: "string",
170
- description: "File for the helper and hook privileges db diff drops",
171
- valueHint: "file"
172
- },
173
- "seeds-out": {
174
- type: "string",
175
- description: "File for the role_permissions seeds",
176
- valueHint: "file"
177
- },
178
- "helpers-only": {
179
- type: "boolean",
180
- description: "Write the helpers and keep the policies hand-written"
181
- },
182
- shims: {
183
- type: "boolean",
184
- description: "Wrap each rls.migrate helper under its legacy name"
185
- },
186
- write: {
187
- type: "boolean",
188
- description: "migrate: rewrite the files instead of a dry run"
189
- }
190
- },
191
- async run({ args: parsed }) {
192
- const result = await (await import("./rls-DiinlRML.js")).runRls({
193
- cwd: ctx.cwd,
194
- config: ctx.config,
195
- rest: parsed._,
196
- target: parsed.target,
197
- dialect: parsed.dialect,
198
- out: stringArg(parsed.out),
199
- from: stringArg(parsed.from),
200
- sql: stringArg(parsed.sql),
201
- db: stringArg(parsed.db),
202
- fixtures: stringArg(parsed.fixtures),
203
- schema: stringArg(parsed.schema),
204
- memberships: stringArg(parsed.memberships),
205
- format: stringArg(parsed.format) ?? stringArg(parsed.emit),
206
- rbac: parsed["rbac-scaffold"] === true || parsed.rbac === "supabase",
207
- rbacSchema: stringArg(parsed["rbac-schema"]),
208
- authorize: stringArg(parsed.authorize),
209
- check: parsed.check === true,
210
- skipClosures: parsed["skip-closures"] === true,
211
- inlineFunctions: parsed["inline-functions"] === true,
212
- force: parsed.force === true,
213
- gucPrefix: stringArg(parsed["guc-prefix"]),
214
- policyPerRole: parsed["policy-per-role"] === true,
215
- policyName: stringArg(parsed["policy-name"]),
216
- tenantType: stringArg(parsed["tenant-type"]),
217
- customRoles: parsed["custom-roles"] === true,
218
- capabilities: parsed.capabilities === true,
219
- fields: stringArg(parsed.fields),
220
- revokeColumns: parsed["revoke-columns"] === true,
221
- tree: parsed.tree === true,
222
- introspect: parsed.introspect === true,
223
- advisors: parsed.advisors === true,
224
- split: stringArg(parsed.split),
225
- grantsOut: stringArg(parsed["grants-out"]),
226
- seedsOut: stringArg(parsed["seeds-out"]),
227
- helpersOnly: parsed["helpers-only"] === true,
228
- shims: parsed.shims === true,
229
- write: parsed.write === true,
230
- json: ctx.json,
231
- io: ctx.io
232
- });
233
- ctx.report(result);
234
- }
235
- });
236
- }
237
- //#endregion
238
- export { rls };
@@ -1,435 +0,0 @@
1
- import { S as restrictedFor, d as isEdgeRelation, f as isFieldRelation, g as isSelfParented, l as groupEntries, m as isPrincipalRelation, r as expandRelation } from "./permissions-DVoF6dMt.js";
2
- import { d as scopeList } from "./scopes-CVdPrWN-.js";
3
- import { l as inheritCondition, m as relationCondition, s as flattenGrantee } from "./grantee-Cv5Sogfv.js";
4
- import { c as relationArmSql, u as restrictedRowsSql } from "./compile-Ba4blROR.js";
5
- import "./sources-4p0-4xQm.js";
6
- import { E as graphSqlText, G as quoteIdent, J as restrictedHelper, K as quoteLiteral, N as linkHelper, T as graphSqlName, W as qualifiedTable, _ as activeUserSql, d as CLOSURE, q as quoteTable, r as HELPERS, w as graphHelper } from "./rls-shared-Cewd_-zI.js";
7
- //#region src/cli/helper-calls.ts
8
- /**
9
- * Tables whose policies other packages write by calling the SQL helpers
10
- * directly (storage buckets and realtime topics).
11
- */
12
- const HELPER_TABLES = ["storage.objects", "realtime.messages"];
13
- const HELPER_CALL = new RegExp(String.raw`\b(${HELPERS.has}(?:_permission)?|permitted_[a-z][a-z0-9_]*_ids(?:_by_permission)?)\s*\(\s*'((?:[^']|'')+)'(\s*,\s*(false\b)?)?`, "giu");
14
- const ANY_HELPER = new RegExp(String.raw`\b(?:${HELPERS.has}(?:_permission)?(?:_for)?|permitted_[a-z][a-z0-9_]*_ids(?:_by_permission)?(?:_for)?|member_[a-z][a-z0-9_]*_ids(?:_for)?)\s*\(`, "iu");
15
- /** Whether a policy expression calls any generated helper, the key-less `member_<scope>_ids` included. */
16
- function callsHelper(sql) {
17
- return ANY_HELPER.test(sql);
18
- }
19
- /**
20
- * The permission keys a policy expression passes to `permdock_has`,
21
- * `permitted_<scope>_ids` or their permission-key forms, `#n` stripped. With
22
- * `blind`, only the calls that ignore row conditions: the grant-key forms,
23
- * and a permission-key form asked for conditioned allows. A plain
24
- * `permdock_has_permission(key)` or `permitted_<scope>_ids_by_permission(key)`
25
- * counts only allows without a row condition, so it never grants more than
26
- * the application does.
27
- */
28
- function helperCallKeys(sql, blind = false) {
29
- const keys = /* @__PURE__ */ new Set();
30
- for (const [, name = "", literal = "", extra, falsy] of sql.matchAll(HELPER_CALL)) {
31
- const byPermission = /_permission$/iu.test(name);
32
- if (blind && byPermission && (extra === void 0 || falsy !== void 0)) continue;
33
- const key = literal.replaceAll("''", "'").split("#")[0] ?? "";
34
- if (key !== "") keys.add(key);
35
- }
36
- return [...keys];
37
- }
38
- const CREATE_POLICY = /\bcreate\s+policy\s+("(?:[^"]|"")+"|\w+)\s+on\s+((?:"[^"]+"|\w+)\.(?:"[^"]+"|\w+))([\s\S]*?);/giu;
39
- function tableName(name) {
40
- return name.replaceAll("\"", "").toLowerCase();
41
- }
42
- function helperTable(name) {
43
- const table = tableName(name);
44
- return HELPER_TABLES.find((candidate) => candidate === table);
45
- }
46
- /** `create policy` statements on {@link HELPER_TABLES} in migration SQL, with the keys their condition-blind helper calls pass. */
47
- function helperTablePolicies(sql) {
48
- const text = sql.replaceAll(/--[^\n]*/gu, "").replaceAll(/\/\*[\s\S]*?\*\//gu, "");
49
- const found = [];
50
- for (const [, name = "", target = "", body = ""] of text.matchAll(CREATE_POLICY)) {
51
- const table = helperTable(target);
52
- const keys = helperCallKeys(body, true);
53
- if (table !== void 0 && keys.length > 0) found.push({
54
- table,
55
- name: name.replaceAll("\"", ""),
56
- keys
57
- });
58
- }
59
- return found;
60
- }
61
- /** `pg_policies` rows on {@link HELPER_TABLES}, read by `rls verify --db`. */
62
- const HELPER_TABLE_POLICIES_SQL = `select schemaname || '.' || tablename as target, policyname, coalesce(qual, '') || ' ' || coalesce(with_check, '') as body
63
- from pg_policies
64
- where (schemaname, tablename) in (('storage', 'objects'), ('realtime', 'messages'))`;
65
- /** The same rows as {@link helperTablePolicies}, from `pg_policies`. */
66
- function helperTablePoliciesFromRows(rows) {
67
- const found = [];
68
- for (const row of rows) {
69
- const table = helperTable(String(row["target"] ?? ""));
70
- const keys = helperCallKeys(String(row["body"] ?? ""), true);
71
- if (table !== void 0 && keys.length > 0) found.push({
72
- table,
73
- name: String(row["policyname"] ?? ""),
74
- keys
75
- });
76
- }
77
- return found;
78
- }
79
- /** The message PD037 and `rls verify --db` report for one policy. */
80
- function rowConditionMessage(policy, keys) {
81
- return `${policy.table} policy '${policy.name}' calls the SQL helpers with ${keys.join(", ")}, whose grants carry row conditions the helpers do not check: the policy grants more than the application does`;
82
- }
83
- const ROW_CONDITION_FIX = "call permitted_<scope>_ids_by_permission('<key>') or permdock_has_permission('<key>'), which count only the allows without a row condition (a relationship grant never reaches a topic or a folder), or use a permission whose catalog entry has rowConditions: false";
84
- //#endregion
85
- //#region src/cli/rls-graph.ts
86
- function qualified(ctx, name) {
87
- return `${quoteIdent(ctx.schema ?? "permdock")}.${name}`;
88
- }
89
- function tableFor(resource, tables) {
90
- return tables?.[resource] ?? resource;
91
- }
92
- /** Every `related` condition the policy's grants compile to, with the resource graph they need, groups included. */
93
- function graphPlan(policy) {
94
- const scopes = scopeList(policy.scopes);
95
- const plan = /* @__PURE__ */ new Map();
96
- const entryFor = (node) => {
97
- const entry = plan.get(node.name) ?? {
98
- node,
99
- relations: /* @__PURE__ */ new Set(),
100
- links: /* @__PURE__ */ new Set()
101
- };
102
- plan.set(node.name, entry);
103
- return entry;
104
- };
105
- const addRelation = (node, relation) => {
106
- const entry = entryFor(node);
107
- if (entry.relations.has(relation)) return;
108
- entry.relations.add(relation);
109
- for (const name of expandRelation(node, relation)) {
110
- const spec = node.relations[name];
111
- if (!isEdgeRelation(spec) || spec.groups === void 0) continue;
112
- for (const { resource, relation: groupRelation } of groupEntries(spec)) {
113
- const target = policy.resources.get(resource);
114
- if (target !== void 0 && target.name !== node.name) addRelation(target, groupRelation);
115
- }
116
- }
117
- };
118
- const addLinks = (hops) => {
119
- for (let index = 1; index < hops.length; index += 1) {
120
- const from = policy.resources.get(hops[index - 1]?.resource ?? "");
121
- const hop = hops[index];
122
- if (from !== void 0 && hop !== void 0) entryFor(from).links.add(hop.link);
123
- }
124
- };
125
- const addAbove = (above) => {
126
- const node = above === void 0 ? void 0 : policy.resources.get(above.resource);
127
- if (above === void 0 || node === void 0) return;
128
- const entry = entryFor(node);
129
- entry.closure = Math.max(entry.closure ?? 0, above.depth);
130
- entry.restrictedAncestors = above;
131
- };
132
- for (const grant of policy.grants) {
133
- const row = policy.resources.get(grant.permission.resource);
134
- for (const item of flattenGrantee(grant.to)) {
135
- if (item.kind === "inherit") {
136
- const inherited = inheritCondition(item, row, policy.resources);
137
- addLinks(inherited?.hops ?? []);
138
- addAbove(inherited?.restrictedAncestors);
139
- continue;
140
- }
141
- if (item.kind !== "relation") continue;
142
- const condition = relationCondition(item, row, scopes, { resources: policy.resources });
143
- if (condition?.op !== "related") continue;
144
- const node = policy.resources.get(condition.resource);
145
- if (node === void 0) continue;
146
- addRelation(node, condition.relation);
147
- const entry = entryFor(node);
148
- if (condition.depth > 0 && isSelfParented(node)) entry.closure = Math.max(entry.closure ?? 0, condition.depth);
149
- addLinks(condition.hops ?? []);
150
- addAbove(condition.restrictedAncestors);
151
- }
152
- }
153
- return plan;
154
- }
155
- /** The closure depth per walked resource, as `RlsSqlContext.graph` carries it. */
156
- function closureDepths(plan) {
157
- const out = {};
158
- for (const [name, entry] of plan) if (entry.closure !== void 0) out[name] = entry.closure;
159
- return out;
160
- }
161
- function tableSql(name) {
162
- return quoteTable(qualifiedTable(name));
163
- }
164
- /**
165
- * The `permitted_<resource>_ids(relation)` arm for one concrete relation:
166
- * ids of `resource` the subject holds it on, directly or through a group.
167
- * `asked` are the relation names that include it, so a call for any of them
168
- * (or for all, with null) reads this arm.
169
- */
170
- function relationArm(ctx, plan, node, relation, asked, tables) {
171
- const spec = node.relations[relation];
172
- if (!isEdgeRelation(spec) && !isPrincipalRelation(spec) && (!isFieldRelation(spec) || spec.memberOf !== void 0)) throw new Error(`PermDock CLI: relation '${relation}' on ${node.name} is not a graph relation RLS can compile`);
173
- const guard = asked.length === 1 ? `(p_relation is null or p_relation = ${quoteLiteral(asked[0] ?? relation)})` : `(p_relation is null or p_relation in (${asked.map(quoteLiteral).join(", ")}))`;
174
- return ` select a.id from (${graphSqlText(relationArmSql(node.name, relation, {
175
- resources: new Map([...plan].map(([name, item]) => [name, item.node])),
176
- ...tables === void 0 ? {} : { tables },
177
- qualify: qualifiedTable,
178
- holders: (resource, groupRelation) => [{ text: `select ${qualified(ctx, graphHelper(resource))}(${quoteLiteral(groupRelation)})` }]
179
- }), ctx)}) a\n where ${guard}${activeUserSql(ctx).map((part) => ` and ${part}`).join("")}`;
180
- }
181
- function permittedSql(ctx, plan, entry, tables) {
182
- const fn = qualified(ctx, graphHelper(entry.node.name));
183
- const asked = [...entry.relations].toSorted();
184
- const arms = [...new Set(asked.flatMap((name) => expandRelation(entry.node, name)))].toSorted().map((relation) => relationArm(ctx, plan, entry.node, relation, asked.filter((name) => expandRelation(entry.node, name).includes(relation)), tables));
185
- if (arms.length === 0) arms.push(" select null::text where false");
186
- return `-- ${entry.node.name}: ids the subject holds a relation on (all relations when p_relation is null)
187
- create or replace function ${fn}(p_relation text)
188
- returns setof text
189
- language sql
190
- stable
191
- security definer
192
- set search_path = ''
193
- as $$
194
- ${arms.join("\n union\n")}
195
- $$;
196
- revoke execute on function ${fn}(text) from public, anon;
197
- grant execute on function ${fn}(text) to authenticated;`;
198
- }
199
- /** `permdock_link_<resource>_<link>(ids)`: ids of `resource` whose link points into `ids`, read past the table's own policies. */
200
- function linkSql(ctx, node, link, tables) {
201
- const spec = Object.hasOwn(node.links, link) ? node.links[link] : void 0;
202
- if (spec === void 0) throw new Error(`PermDock CLI: ${node.name} has no link '${link}'`);
203
- const fn = qualified(ctx, linkHelper(node.name, link));
204
- return `-- ${node.name}.${link}: rows whose ${spec.field} points at one of the given ${spec.resource} ids
205
- create or replace function ${fn}(p_ids text[])
206
- returns setof text
207
- language sql
208
- stable
209
- security definer
210
- set search_path = ''
211
- as $$
212
- select t.${quoteIdent(node.id)}::text from ${tableSql(tableFor(node.name, tables))} t
213
- where t.${quoteIdent(spec.field)}::text = any(p_ids)
214
- $$;
215
- revoke execute on function ${fn}(text[]) from public, anon;
216
- grant execute on function ${fn}(text[]) to authenticated;`;
217
- }
218
- function closureTableSql(ctx) {
219
- const table = qualified(ctx, CLOSURE.table);
220
- return `-- the object graph: one row per (ancestor, descendant) within each walked resource's depth,
221
- -- never crossing a restricted row; kept current by statement triggers on each self-parented table
222
- create table if not exists ${table} (
223
- resource text not null,
224
- ancestor text not null,
225
- descendant text not null,
226
- depth integer not null check (depth >= 0),
227
- primary key (resource, descendant, ancestor)
228
- );
229
- create index if not exists ${quoteIdent(`${CLOSURE.table}_ancestor`)} on ${table} (resource, ancestor);
230
- alter table ${table} enable row level security;
231
- revoke all on table ${table} from anon, authenticated, public;
232
- grant select on table ${table} to authenticated;`;
233
- }
234
- function closureObjectsSql(ctx, entry, depth, tables) {
235
- const { node } = entry;
236
- const parent = node.parent;
237
- if (parent === void 0) return "";
238
- const name = node.name;
239
- const sqlName = graphSqlName(name) ?? name;
240
- const closure = qualified(ctx, CLOSURE.table);
241
- const table = tableSql(tableFor(name, tables));
242
- const id = quoteIdent(node.id);
243
- const up = quoteIdent(parent.field);
244
- const restricted = restrictedFor(node, "parent");
245
- const stop = restricted === void 0 ? "false" : `coalesce(t.${quoteIdent(restricted)}, false)`;
246
- const stopParent = restricted === void 0 ? "false" : `coalesce(p.${quoteIdent(restricted)}, false)`;
247
- const refresh = qualified(ctx, `${CLOSURE.table}_${sqlName}`);
248
- const changed = qualified(ctx, `${CLOSURE.table}_${sqlName}_changed`);
249
- const literal = quoteLiteral(name);
250
- const restrictedChanged = restricted === void 0 ? "" : ` or n.${quoteIdent(restricted)} is distinct from o.${quoteIdent(restricted)}`;
251
- const trigger = (suffix) => quoteIdent(`${CLOSURE.table}_${sqlName}_${suffix}`);
252
- return `-- ${name}: ${restricted === void 0 ? `rows reach their ancestors up to depth ${String(depth)}` : `rows reach their ancestors up to depth ${String(depth)}, stopping at a restricted row`}
253
- drop policy if exists ${quoteIdent(`${CLOSURE.table}_${sqlName}`)} on ${closure};
254
- create policy ${quoteIdent(`${CLOSURE.table}_${sqlName}`)} on ${closure}
255
- for select to authenticated
256
- using (resource = ${literal} and ancestor in (select ${qualified(ctx, graphHelper(name))}(null)));
257
- create or replace function ${refresh}(p_ids text[])
258
- returns void
259
- language plpgsql
260
- security definer
261
- set search_path = ''
262
- as $$
263
- declare
264
- v_cycle text;
265
- v_affected text[];
266
- begin
267
- with recursive walk(start, next, path) as (
268
- select t.${id}, t.${up}, array[t.${id}::text]
269
- from ${table} t
270
- where t.${id}::text = any(p_ids)
271
- union all
272
- select walk.start, t.${up}, walk.path || t.${id}::text
273
- from walk join ${table} t on t.${id} = walk.next
274
- where not (walk.next::text = any(walk.path))
275
- )
276
- select walk.start::text into v_cycle
277
- from walk
278
- where walk.next::text = any(walk.path)
279
- limit 1;
280
- if v_cycle is not null then
281
- raise exception 'permdock: % % is its own ancestor', ${literal}, v_cycle
282
- using errcode = 'check_violation';
283
- end if;
284
- with recursive down(id, level) as (
285
- select t.${id}, 0
286
- from ${table} t
287
- where t.${id}::text = any(p_ids) or t.${up}::text = any(p_ids)
288
- union
289
- select t.${id}, down.level + 1
290
- from down join ${table} t on t.${up} = down.id
291
- where down.level < ${String(depth)}
292
- )
293
- select coalesce(array_agg(distinct down.id::text), '{}') into v_affected from down;
294
- delete from ${closure} c
295
- where c.resource = ${literal}
296
- and (c.descendant = any(p_ids) or c.descendant = any(v_affected));
297
- insert into ${closure} (resource, ancestor, descendant, depth)
298
- with recursive walk(descendant, ancestor, parent, depth, stop) as (
299
- select t.${id}::text, t.${id}, t.${up}, 0, ${stop}
300
- from ${table} t
301
- where t.${id}::text = any(v_affected)
302
- union all
303
- select walk.descendant, p.${id}, p.${up}, walk.depth + 1, ${stopParent}
304
- from walk join ${table} p on p.${id} = walk.parent
305
- where not walk.stop and walk.depth < ${String(depth)}
306
- )
307
- select ${literal}, walk.ancestor::text, walk.descendant, walk.depth from walk
308
- on conflict do nothing;
309
- end
310
- $$;
311
- revoke execute on function ${refresh}(text[]) from public, anon, authenticated;
312
- create or replace function ${changed}()
313
- returns trigger
314
- language plpgsql
315
- security definer
316
- set search_path = ''
317
- as $$
318
- begin
319
- if tg_op = 'TRUNCATE' then
320
- delete from ${closure} where resource = ${literal};
321
- elsif tg_op = 'INSERT' then
322
- perform ${refresh}(array(select n.${id}::text from new_rows n));
323
- elsif tg_op = 'DELETE' then
324
- perform ${refresh}(array(select o.${id}::text from old_rows o));
325
- else
326
- perform ${refresh}(array(
327
- select n.${id}::text
328
- from new_rows n left join old_rows o on o.${id} = n.${id}
329
- where o.${id} is null or n.${up} is distinct from o.${up}${restrictedChanged}
330
- union
331
- select o.${id}::text
332
- from old_rows o left join new_rows n on n.${id} = o.${id}
333
- where n.${id} is null
334
- ));
335
- end if;
336
- return null;
337
- end
338
- $$;
339
- revoke execute on function ${changed}() from public, anon, authenticated;
340
- drop trigger if exists ${trigger("insert")} on ${table};
341
- create trigger ${trigger("insert")} after insert on ${table}
342
- referencing new table as new_rows
343
- for each statement execute function ${changed}();
344
- drop trigger if exists ${trigger("update")} on ${table};
345
- create trigger ${trigger("update")} after update on ${table}
346
- referencing old table as old_rows new table as new_rows
347
- for each statement execute function ${changed}();
348
- drop trigger if exists ${trigger("delete")} on ${table};
349
- create trigger ${trigger("delete")} after delete on ${table}
350
- referencing old table as old_rows
351
- for each statement execute function ${changed}();
352
- drop trigger if exists ${trigger("truncate")} on ${table};
353
- create trigger ${trigger("truncate")} after truncate on ${table}
354
- for each statement execute function ${changed}();
355
- select ${refresh}(array(select t.${id}::text from ${table} t));`;
356
- }
357
- function restrictedRowsHelperSql(ctx, plan, entry, tables) {
358
- const above = entry.restrictedAncestors;
359
- if (above === void 0) return "";
360
- const fn = qualified(ctx, restrictedHelper(entry.node.name));
361
- const body = graphSqlText(restrictedRowsSql(above, {
362
- resources: new Map([...plan].map(([name, item]) => [name, item.node])),
363
- ...tables === void 0 ? {} : { tables },
364
- qualify: qualifiedTable,
365
- closure: `${ctx.schema ?? "permdock"}.${CLOSURE.table}`,
366
- closureDepths: closureDepths(plan)
367
- }), ctx);
368
- return `-- ${entry.node.name}: rows a stopped link does not reach below: restricted, under a restricted row within ${String(above.depth - 1)} levels, or deeper
369
- create or replace function ${fn}()
370
- returns setof text
371
- language sql
372
- stable
373
- security definer
374
- set search_path = ''
375
- as $$
376
- ${body}
377
- $$;
378
- revoke execute on function ${fn}() from public, anon;
379
- grant execute on function ${fn}() to authenticated;`;
380
- }
381
- /** Group resources a resource's asked relations name, other than itself. */
382
- function groupTargets(entry) {
383
- const out = /* @__PURE__ */ new Set();
384
- for (const asked of entry.relations) for (const name of expandRelation(entry.node, asked)) {
385
- const spec = entry.node.relations[name];
386
- const resources = isEdgeRelation(spec) ? groupEntries(spec).map((group) => group.resource) : [];
387
- for (const resource of resources) if (resource !== entry.node.name) out.add(resource);
388
- }
389
- return [...out].toSorted();
390
- }
391
- /** Plan entries by name, each after the group resources its helper calls (SQL function bodies are checked on create). */
392
- function dependencyOrder(plan) {
393
- const out = [];
394
- const done = /* @__PURE__ */ new Set();
395
- const visit = (name) => {
396
- const entry = plan.get(name);
397
- if (entry === void 0 || done.has(name)) return;
398
- done.add(name);
399
- for (const target of groupTargets(entry)) visit(target);
400
- out.push(entry);
401
- };
402
- for (const name of [...plan.keys()].toSorted()) visit(name);
403
- return out;
404
- }
405
- /**
406
- * The graph preamble: `permitted_<resource>_ids` for every resource a graph
407
- * grant reads, and the closure table with its triggers for every
408
- * self-parented resource a grant walks. Empty when no grant is a graph grant.
409
- */
410
- function graphSql(ctx, plan, tables) {
411
- if (plan.size === 0) return "";
412
- const sqlNames = /* @__PURE__ */ new Map();
413
- for (const name of plan.keys()) {
414
- const helper = graphHelper(name);
415
- const sql = graphSqlName(name) ?? name;
416
- if (ctx.scopes.some((scope) => scope.name === sql)) throw new Error(`PermDock CLI: resource '${name}' has graph relations and shares its SQL name with the ${sql} scope, so ${helper} would replace the scope helper; rename the resource (permdock doctor PD032)`);
417
- const other = sqlNames.get(sql);
418
- if (other !== void 0) throw new Error(`PermDock CLI: resources '${other}' and '${name}' both name the SQL helper ${helper}; rename one (permdock doctor PD032)`);
419
- sqlNames.set(sql, name);
420
- }
421
- const entries = dependencyOrder(plan);
422
- const chunks = entries.flatMap((entry) => [...entry.relations.size === 0 && entry.closure === void 0 ? [] : [permittedSql(ctx, plan, entry, tables)], ...[...entry.links].toSorted().map((link) => linkSql(ctx, entry.node, link, tables))]);
423
- const walked = entries.filter((entry) => entry.closure !== void 0);
424
- if (walked.length > 0) {
425
- chunks.push(closureTableSql(ctx));
426
- for (const entry of walked) chunks.push(closureObjectsSql(ctx, entry, entry.closure ?? 0, tables));
427
- for (const entry of walked) {
428
- const helper = restrictedRowsHelperSql(ctx, plan, entry, tables);
429
- if (helper !== "") chunks.push(helper);
430
- }
431
- }
432
- return `${chunks.join("\n\n")}\n`;
433
- }
434
- //#endregion
435
- export { HELPER_TABLE_POLICIES_SQL as a, helperCallKeys as c, rowConditionMessage as d, HELPER_TABLES as i, helperTablePolicies as l, graphPlan as n, ROW_CONDITION_FIX as o, graphSql as r, callsHelper as s, closureDepths as t, helperTablePoliciesFromRows as u };