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
@@ -11,7 +11,10 @@ type AppData = Readonly<Record<string, MetaValue>>;
11
11
  * its output is the type PermDock gives the `x` field it checks.
12
12
  */
13
13
  type AppDataSchema<X = AppData> = StandardSchemaV1<unknown, X>;
14
- /** A leaf whose `meta.x` is typed by a schema; intersected so it stays assignable to the untyped leaf. */
14
+ /**
15
+ * A leaf whose `meta.x` is typed by a schema; intersected so it stays
16
+ * assignable to the untyped leaf.
17
+ */
15
18
  type WithX<L, X> = [X] extends [never] ? L : L & {
16
19
  readonly meta: {
17
20
  readonly x?: Readonly<X>;
@@ -22,9 +25,26 @@ type WithX<L, X> = [X] extends [never] ? L : L & {
22
25
  declare const RESOURCE_BRAND: unique symbol;
23
26
  /**
24
27
  * Phantom key carrying a tree's resource `x` type for `getResource`. Exported
25
- * as a type only, so a consumer's declaration emit can name it; it has no value.
28
+ * as a type only, so a consumer's declaration emit can name it; it has no
29
+ * value.
26
30
  */
27
31
  declare const RESOURCE_X: unique symbol;
32
+ /**
33
+ * Phantom key carrying the literal `name` a `resource(…, { name })` was given,
34
+ * so its leaves type `resource` by that name rather than the path segment. Type
35
+ * only; it has no value.
36
+ */
37
+ declare const RESOURCE_NAME: unique symbol;
38
+ /**
39
+ * Phantom key carrying a policy's `scopes` input type for `ScopeNameOf`. Type
40
+ * only; it has no value.
41
+ */
42
+ declare const POLICY_SCOPES: unique symbol;
43
+ /**
44
+ * Phantom key carrying a permission's row type for `RowOf`. Type only; a leaf
45
+ * never has it at run time, so leaves stay plain JSON.
46
+ */
47
+ declare const PERMISSION_ROW: unique symbol;
28
48
  //#endregion
29
49
  //#region src/core/permission-types.d.ts
30
50
  /** `definePermissions` options. */
@@ -37,24 +57,33 @@ type PermissionsOptions<PX = never, RX = never> = {
37
57
  */
38
58
  readonly renamed?: Readonly<Record<string, string>>;
39
59
  /**
40
- * Standard Schemas for app data. `permission` checks every action's
41
- * `meta.x` and types it on the leaves; `resource` checks every resource's
42
- * `meta.x` and types it on `getResource`. Both validate synchronously at
43
- * definition time and throw on invalid data.
60
+ * Standard Schemas for app data. `permission` checks every action's `meta.x`
61
+ * and types it on the leaves; `resource` checks every resource's `meta.x` and
62
+ * types it on `getResource`. Both validate synchronously at definition time
63
+ * and throw on invalid data.
44
64
  */
45
65
  readonly x?: {
46
66
  readonly permission?: AppDataSchema<PX>;
47
67
  readonly resource?: AppDataSchema<RX>;
48
68
  };
49
69
  };
50
- /** A resource's metadata. PermDock carries it to the catalog and never reads `x`. */
70
+ /**
71
+ * A resource's metadata. PermDock carries it to the catalog and never reads
72
+ * `x`.
73
+ */
51
74
  type ResourceMeta<X = AppData> = {
52
75
  readonly title?: string;
53
76
  readonly description?: string;
54
- /** Data the application owns. Plain JSON, typed by `definePermissions(…, { x: { resource } })`. */
77
+ /**
78
+ * Data the application owns. Plain JSON, typed by `definePermissions(…, { x:
79
+ * { resource } })`.
80
+ */
55
81
  readonly x?: X;
56
82
  };
57
- /** A tree whose resources carry `meta.x` of type `X`, read through `getResource`. */
83
+ /**
84
+ * A tree whose resources carry `meta.x` of type `X`, read through
85
+ * `getResource`.
86
+ */
58
87
  type ResourceXTree<X> = {
59
88
  readonly [RESOURCE_X]?: X;
60
89
  };
@@ -63,7 +92,10 @@ type ActionMeta = {
63
92
  readonly description?: string;
64
93
  readonly tags?: readonly string[];
65
94
  readonly readOnly?: boolean;
66
- /** The action may destroy or overwrite data; only meaningful when not `readOnly`. */
95
+ /**
96
+ * The action may destroy or overwrite data; only meaningful when not
97
+ * `readOnly`.
98
+ */
67
99
  readonly destructive?: boolean;
68
100
  /** Repeating the action with the same input has no further effect. */
69
101
  readonly idempotent?: boolean;
@@ -72,12 +104,15 @@ type ActionMeta = {
72
104
  * assign the whole custom-role ceiling, not only what they hold themselves.
73
105
  */
74
106
  readonly manageRoles?: boolean;
75
- /** Set by a generator (`permdock openapi import`) to the operation an action was inferred from. */
107
+ /**
108
+ * Set by a generator (`permdock openapi import`) to the operation an action
109
+ * was inferred from.
110
+ */
76
111
  readonly inferredFrom?: string;
77
112
  /**
78
113
  * Data the application owns, such as a risk level or an undo window. Plain
79
- * JSON; PermDock carries it on the leaf, the catalog and snapshots and
80
- * never reads it. `definePermissions(…, { x: { permission } })` types it.
114
+ * JSON; PermDock carries it on the leaf, the catalog and snapshots and never
115
+ * reads it. `definePermissions(…, { x: { permission } })` types it.
81
116
  */
82
117
  readonly x?: AppData;
83
118
  };
@@ -89,7 +124,17 @@ type Permission<K extends string = string, T = unknown, Kind extends PermissionK
89
124
  readonly action: string;
90
125
  readonly meta: ActionMeta;
91
126
  readonly kind: Kind;
92
- } & ([T] extends [never] ? unknown : unknown);
127
+ /**
128
+ * The resource row type. Method syntax keeps it bivariant: a typed leaf is
129
+ * still a `Permission`, and an untyped one still takes a typed closure.
130
+ */
131
+ [PERMISSION_ROW]?(row: T): void;
132
+ };
133
+ /**
134
+ * The row type of a permission's resource; `unknown` for an untyped
135
+ * `Permission`.
136
+ */
137
+ type RowOf<P> = P extends Permission<string, infer T> ? T : unknown;
93
138
  type ResourceParent = {
94
139
  readonly field: string;
95
140
  readonly resource: string;
@@ -101,15 +146,21 @@ type RelationIncludes = {
101
146
  /** The row's `field` holds the principal id (or, with `memberOf`, a scope id). */
102
147
  type FieldRelation = RelationIncludes & {
103
148
  readonly field: string;
104
- /** A declared scope name (or the `tenant` / `team` alias): the field holds that scope's id. */
149
+ /**
150
+ * A declared scope name (or the `tenant` / `team` alias): the field holds
151
+ * that scope's id.
152
+ */
105
153
  readonly memberOf?: string;
106
154
  };
107
- /** Literal values an edge row's columns must hold, so one table backs several relations. */
155
+ /**
156
+ * Literal values an edge row's columns must hold, so one table backs several
157
+ * relations.
158
+ */
108
159
  type EdgeMatch = Readonly<Record<string, string | number | boolean>>;
109
160
  /**
110
- * One group resource of an edge: the relation whoever the row names must
111
- * hold on the group, and, when the group's id has its own typed column, that
112
- * column in place of the edge's `subject`.
161
+ * One group resource of an edge: the relation whoever the row names must hold
162
+ * on the group, and, when the group's id has its own typed column, that column
163
+ * in place of the edge's `subject`.
113
164
  */
114
165
  type EdgeGroup = string | {
115
166
  readonly relation: string;
@@ -117,12 +168,12 @@ type EdgeGroup = string | {
117
168
  };
118
169
  /**
119
170
  * Edge rows that name a group instead of a principal: `column` holds the
120
- * resource name, `subject` the group's id, and the row holds for whoever
121
- * holds `resources[<name>]` on that group. A null `column` (or `direct`)
122
- * names a principal; any other value matches nothing. A group with its own
123
- * `subject` column reads the group's id from it; without `column`, a row
124
- * names that group when the column is not null, and a principal when the
125
- * edge's `subject` is not null.
171
+ * resource name, `subject` the group's id, and the row holds for whoever holds
172
+ * `resources[<name>]` on that group. A null `column` (or `direct`) names a
173
+ * principal; any other value matches nothing. A group with its own `subject`
174
+ * column reads the group's id from it; without `column`, a row names that group
175
+ * when the column is not null, and a principal when the edge's `subject` is not
176
+ * null.
126
177
  */
127
178
  type EdgeGroups = {
128
179
  /** Required unless every group names its own `subject` column. */
@@ -131,7 +182,10 @@ type EdgeGroups = {
131
182
  /** The `column` value of a row naming a principal, besides `null`. */
132
183
  readonly direct?: string;
133
184
  };
134
- /** One row per holder in an edge table: `object` holds the resource id, `subject` the principal id. */
185
+ /**
186
+ * One row per holder in an edge table: `object` holds the resource id,
187
+ * `subject` the principal id.
188
+ */
135
189
  type EdgeRelation = RelationIncludes & {
136
190
  readonly edge: string;
137
191
  /** Default `<resource>_id`. */
@@ -143,10 +197,16 @@ type EdgeRelation = RelationIncludes & {
143
197
  readonly match?: EdgeMatch;
144
198
  readonly groups?: EdgeGroups;
145
199
  };
146
- /** On a principal resource: the row's `principal` column holds the principal who holds the relation over it. */
200
+ /**
201
+ * On a principal resource: the row's `principal` column holds the principal who
202
+ * holds the relation over it.
203
+ */
147
204
  type PrincipalRelation = RelationIncludes & {
148
205
  readonly principal: string;
149
- /** Timestamp columns bounding when the relation holds; `null` leaves that side open. */
206
+ /**
207
+ * Timestamp columns bounding when the relation holds; `null` leaves that side
208
+ * open.
209
+ */
150
210
  readonly period?: {
151
211
  readonly startsAt?: string;
152
212
  readonly expiresAt?: string;
@@ -158,7 +218,10 @@ type ComputedRelation = {
158
218
  };
159
219
  type ResourceRelation = FieldRelation | EdgeRelation | PrincipalRelation | ComputedRelation;
160
220
  type ResourceRelationInput = string | ResourceRelation;
161
- /** A to-one link from a row to another resource's instance, walked by `through: [<link>]`. */
221
+ /**
222
+ * A to-one link from a row to another resource's instance, walked by `through:
223
+ * [<link>]`.
224
+ */
162
225
  type ResourceLink = {
163
226
  readonly field: string;
164
227
  readonly resource: string;
@@ -170,8 +233,8 @@ type ResourceRestricted = {
170
233
  type ActionList = readonly string[] | Record<string, ActionMeta>;
171
234
  type ResourceOptions<A extends ActionList | undefined = ActionList | undefined, C extends ActionList | undefined = ActionList | undefined> = {
172
235
  /**
173
- * The resource name leaves, tables, relations and AuthZEN types use; the
174
- * last path segment when absent. Names are unique across a tree.
236
+ * The resource name leaves, tables, relations and AuthZEN types use; the last
237
+ * path segment when absent. Names are unique across a tree.
175
238
  */
176
239
  readonly name?: string;
177
240
  readonly id?: string;
@@ -182,7 +245,8 @@ type ResourceOptions<A extends ActionList | undefined = ActionList | undefined,
182
245
  readonly relations?: Readonly<Record<string, ResourceRelationInput>>;
183
246
  /**
184
247
  * The row field that changes whenever the row does (`updatedAt`, a revision
185
- * counter). An `approval: { staleOn: 'resource-change' }` binds to its value.
248
+ * counter). An `approval: { staleOn: 'resource-change' }` binds to its
249
+ * value.
186
250
  */
187
251
  readonly version?: string;
188
252
  /**
@@ -198,19 +262,32 @@ type ResourceOptions<A extends ActionList | undefined = ActionList | undefined,
198
262
  /**
199
263
  * Named grant levels a custom role may pick per permission, each a row
200
264
  * condition (`where` shorthand or a `Condition`), such as `own`, `team` and
201
- * `all`. A level narrows the ceiling grant it applies to and never widens
202
- * it; it reaches only instance actions. Names match `^[a-z][a-z0-9_]*$`.
265
+ * `all`. A level narrows the ceiling grant it applies to and never widens it;
266
+ * it reaches only instance actions. Names match `^[a-z][a-z0-9_]*$`.
203
267
  */
204
268
  readonly levels?: Readonly<Record<string, ResourceLevel>>;
205
- /** Display text and app data for the resource; carried to the catalog, never read in evaluation. */
269
+ /**
270
+ * `true`: `levels` run from narrowest to widest in declaration order, and a
271
+ * holder of a level may hand out every level declared before it. Evaluation
272
+ * is unchanged: each level still applies only its own condition.
273
+ */
274
+ readonly orderedLevels?: true;
275
+ /**
276
+ * Display text and app data for the resource; carried to the catalog, never
277
+ * read in evaluation.
278
+ */
206
279
  readonly meta?: ResourceMeta;
207
280
  };
208
- /** A level's row condition: `where` shorthand or a normalised `Condition`, checked by `definePolicy`. */
281
+ /**
282
+ * A level's row condition: `where` shorthand or a normalised `Condition`,
283
+ * checked by `definePolicy`.
284
+ */
209
285
  type ResourceLevel = Readonly<Record<string, unknown>>;
210
- type ResourceInit<T = unknown, A extends ActionList | undefined = ActionList | undefined, C extends ActionList | undefined = ActionList | undefined> = {
286
+ type ResourceInit<T = unknown, A extends ActionList | undefined = ActionList | undefined, C extends ActionList | undefined = ActionList | undefined, N extends string = string> = {
211
287
  readonly [RESOURCE_BRAND]: true;
212
288
  readonly schema: StandardSchemaV1<unknown, T> | undefined;
213
289
  readonly options: ResourceOptions<A, C>;
290
+ readonly [RESOURCE_NAME]?: N;
214
291
  };
215
292
  type ResourceNode<T = unknown> = {
216
293
  readonly name: string;
@@ -226,8 +303,13 @@ type ResourceNode<T = unknown> = {
226
303
  readonly disclosure: "hide" | "reveal";
227
304
  readonly instanceActions: ReadonlySet<string>;
228
305
  readonly collectionActions: ReadonlySet<string>;
229
- /** Declared level names to their raw condition; `definePolicy` normalises them. */
306
+ /**
307
+ * Declared level names to their raw condition; `definePolicy` normalises
308
+ * them.
309
+ */
230
310
  readonly levels?: Readonly<Record<string, ResourceLevel>>;
311
+ /** Set when the resource declares `orderedLevels: true`. */
312
+ readonly orderedLevels?: true;
231
313
  /** The resource's `meta`, when it declares one. */
232
314
  readonly meta?: ResourceMeta;
233
315
  };
@@ -235,73 +317,17 @@ type PermissionTree = {
235
317
  readonly [key: string]: PermissionTree | Permission;
236
318
  };
237
319
  type ActionNames<A extends ActionList | undefined> = A extends readonly string[] ? A[number] : A extends Record<string, ActionMeta> ? keyof A & string : never;
238
- type LeavesFrom<Prefix extends string, Names extends string, T, Kind extends PermissionKind, X = never> = [Names] extends [never] ? object : { readonly [K in Names]: WithX<Permission<Prefix extends "" ? K : `${Prefix}.${K}`, T, Kind>, X>; };
239
- type InferResourceLeaves<R extends ResourceInit, Prefix extends string, X = never> = R extends ResourceInit<infer T, infer A, infer C> ? LeavesFrom<Prefix, ActionNames<A>, T, "instance", X> & LeavesFrom<Prefix, ActionNames<C>, T, "collection", X> : object;
320
+ type LastSegment<Path extends string> = Path extends `${string}.${infer Rest}` ? LastSegment<Rest> : Path;
321
+ type LeavesFrom<Prefix extends string, Names extends string, T, Kind extends PermissionKind, X = never, R extends string = string> = [Names] extends [never] ? object : { readonly [K in Names]: WithX<Permission<Prefix extends "" ? K : `${Prefix}.${K}`, T, Kind> & {
322
+ readonly resource: R;
323
+ readonly action: K;
324
+ }, X>; };
325
+ type InferResourceLeaves<R extends ResourceInit, Prefix extends string, X = never> = R extends ResourceInit<infer T, infer A, infer C, infer N> ? LeavesFrom<Prefix, ActionNames<A>, T, "instance", X, [N] extends [never] ? LastSegment<Prefix> : N> & LeavesFrom<Prefix, ActionNames<C>, T, "collection", X, [N] extends [never] ? LastSegment<Prefix> : N> : object;
240
326
  type InferPermissionTree<Input, Prefix extends string = "", X = never> = Input extends ResourceInit ? InferResourceLeaves<Input, Prefix, X> : Input extends Record<string, unknown> ? { readonly [K in keyof Input & string]: InferPermissionTree<Input[K], Prefix extends "" ? K : `${Prefix}.${K}`, X>; } : never;
241
- //#endregion
242
- //#region src/core/vocabulary.d.ts
243
- declare const ROLE_KIND: "role";
244
- declare const PLAN_KIND: "plan";
245
- /** `defineRoles` and `definePlans` options. */
246
- type VocabularyOptions<X = never> = {
247
- /**
248
- * A Standard Schema for every leaf's `meta.x`, validated synchronously at
249
- * definition time. On a role tree it also checks the `meta.x` of custom
250
- * roles a `CustomRoleSource` returns; an invalid one is dropped, not the role.
251
- */
252
- readonly x?: AppDataSchema<X>;
253
- };
254
327
  /**
255
- * A role's metadata. `audience` names the surface its holders use (`'staff'`,
256
- * `'portal'`, `'platform'`); `permdock.audiences()` lists the distinct
257
- * audiences of the roles held in the active scope.
328
+ * The tree `definePermissions(input, options)` returns, nameable for an
329
+ * explicit annotation under `isolatedDeclarations`.
258
330
  */
259
- type RoleMeta = ActionMeta & {
260
- readonly audience?: string;
261
- };
262
- type Role<K extends string = string> = {
263
- readonly key: K;
264
- /** A declared scope name, or the `tenant` / `team` alias. */
265
- readonly on?: string;
266
- readonly assignable: boolean;
267
- readonly meta: RoleMeta;
268
- /** A shared custom role: the platform defines it for every tenant, and a tenant admin cannot edit it. */
269
- readonly shared?: true;
270
- readonly kind: typeof ROLE_KIND;
271
- };
272
- type Plan<K extends string = string> = {
273
- readonly key: K;
274
- readonly meta: ActionMeta;
275
- readonly kind: typeof PLAN_KIND;
276
- };
277
- type RoleInit = {
278
- /** A declared scope name, or the `tenant` / `team` alias. */
279
- readonly on?: string;
280
- readonly assignable?: boolean;
281
- readonly meta?: RoleMeta;
282
- };
283
- type PlanInit = {
284
- readonly meta?: ActionMeta;
285
- };
286
- type RoleTree = {
287
- readonly [key: string]: Role;
288
- };
289
- type PlanTree = {
290
- readonly [key: string]: Plan;
291
- };
292
- type Vocabulary = {
293
- readonly permissions?: unknown;
294
- readonly roles?: RoleTree;
295
- readonly plans?: PlanTree;
296
- };
297
- type InferRoleTree<Input, X = never> = { readonly [K in keyof Input & string]: WithX<Role<K>, X>; };
298
- type InferPlanTree<Input, X = never> = { readonly [K in keyof Input & string]: WithX<Plan<K>, X>; };
299
- declare function isRole(value: unknown): value is Role;
300
- declare function isPlan(value: unknown): value is Plan;
301
- declare function defineRoles<const Input extends Record<string, RoleInit>, X = never>(input: Input, options?: VocabularyOptions<X>): InferRoleTree<Input, X>;
302
- declare function definePlans<const Input extends Record<string, PlanInit>, X = never>(input: Input, options?: VocabularyOptions<X>): InferPlanTree<Input, X>;
303
- declare function listRoles(tree: RoleTree | undefined): readonly Role[];
304
- declare function listPlans(tree: PlanTree | undefined): readonly Plan[];
305
- declare function findRole(tree: RoleTree | undefined, key: string): Role | undefined;
331
+ type PermissionsOf<Input, PX = never, RX = never> = InferPermissionTree<Input, "", PX> & ResourceXTree<RX>;
306
332
  //#endregion
307
- export { ResourceLevel as A, RESOURCE_X as B, InferPermissionTree as C, PermissionsOptions as D, PermissionTree as E, ResourceParent as F, AppDataSchema as H, ResourceRelation as I, ResourceRelationInput as L, ResourceMeta as M, ResourceNode as N, PrincipalRelation as O, ResourceOptions as P, ResourceRestricted as R, FieldRelation as S, PermissionKind as T, MetaValue as U, AppData as V, ComputedRelation as _, RoleTree as a, EdgeMatch as b, definePlans as c, isPlan as d, isRole as f, ActionMeta as g, ActionList as h, RoleMeta as i, ResourceLink as j, ResourceInit as k, defineRoles as l, listRoles as m, PlanTree as n, Vocabulary as o, listPlans as p, Role as r, VocabularyOptions as s, Plan as t, findRole as u, EdgeGroup as v, Permission as w, EdgeRelation as x, EdgeGroups as y, ResourceXTree as z };
333
+ export { RESOURCE_NAME as A, ResourceRelation as C, RowOf as D, ResourceXTree as E, WithX as F, AppData as M, AppDataSchema as N, PERMISSION_ROW as O, MetaValue as P, ResourceParent as S, ResourceRestricted as T, ResourceLevel as _, EdgeGroups as a, ResourceNode as b, FieldRelation as c, PermissionKind as d, PermissionTree as f, ResourceInit as g, PrincipalRelation as h, EdgeGroup as i, RESOURCE_X as j, POLICY_SCOPES as k, InferPermissionTree as l, PermissionsOptions as m, ActionMeta as n, EdgeMatch as o, PermissionsOf as p, ComputedRelation as r, EdgeRelation as s, ActionList as t, Permission as u, ResourceLink as v, ResourceRelationInput as w, ResourceOptions as x, ResourceMeta as y };
@@ -1,10 +1,14 @@
1
- import { C as InferPermissionTree, k as ResourceInit, r as Role, t as Plan } from "./vocabulary-CN8H_9UF.js";
1
+ import { g as ResourceInit, l as InferPermissionTree } from "./permission-types-CAY-GU7e.js";
2
+ import { r as Role, t as Plan } from "./vocabulary-DEJ5j4mR.js";
2
3
  import { StandardSchemaV1 } from "@standard-schema/spec";
3
4
  //#region src/testing/saas/permissions.d.ts
4
5
  declare const SaasProjectSchema: StandardSchemaV1<SaasProject>;
5
6
  declare const SaasDocSchema: StandardSchemaV1<SaasDoc>;
6
7
  declare const SaasFolderSchema: StandardSchemaV1<SaasFolder>;
7
- /** A folder in an org's tree; `restricted` keeps grants held on its ancestors out. */
8
+ /**
9
+ * A folder in an org's tree; `restricted` keeps grants held on its ancestors
10
+ * out.
11
+ */
8
12
  type SaasFolder = {
9
13
  readonly id: string;
10
14
  readonly orgId: string;
@@ -1,6 +1,6 @@
1
- import { n as freezeDeep } from "./freeze-CrU8nQeX.js";
2
- import { d as attachRegistry, p as walk, r as formerByKey, t as assertKeys } from "./permission-registry-Br4jSNVi.js";
3
- import { r as assertGraphTargets } from "./resource-relations-D_jw0BFx.js";
1
+ import { n as freezeDeep } from "./freeze-jjan0lCv.js";
2
+ import { d as attachRegistry, p as walk, r as formerByKey, t as assertKeys } from "./permission-registry-B8tYxPIt.js";
3
+ import { r as assertGraphTargets } from "./resource-relations-8-pCScBO.js";
4
4
  //#region src/core/operation-risks.ts
5
5
  /** Every `meta.risk` level, lowest first. */
6
6
  const OPERATION_RISKS = Object.freeze([
@@ -1,7 +1,7 @@
1
- import { i as crud } from "./src-Cu2m75uo.js";
2
- import { _ as resource } from "./permission-registry-Br4jSNVi.js";
3
- import { f as definePlans, p as defineRoles } from "./grantee-hxrUsbpM.js";
4
- import { t as definePermissions } from "./permissions-B-wCP5ZC.js";
1
+ import { c as crud } from "./src-DZ0l9UAg.js";
2
+ import { v as resource } from "./permission-registry-B8tYxPIt.js";
3
+ import { f as definePlans, p as defineRoles } from "./grantee-Dke-9rd1.js";
4
+ import { t as definePermissions } from "./permissions-CVXmRILq.js";
5
5
  //#region src/testing/saas/schema.ts
6
6
  function accepts(kind, value) {
7
7
  switch (kind) {
@@ -126,7 +126,10 @@ const saasRoles = defineRoles({
126
126
  on: "team",
127
127
  assignable: true
128
128
  },
129
- /** Resource-scoped; `role(..., { on: saasPermissions.project })` in the policy. */
129
+ /**
130
+ * Resource-scoped; `role(..., { on: saasPermissions.project })` in the
131
+ * policy.
132
+ */
130
133
  collaborator: { assignable: true }
131
134
  });
132
135
  const saasPlans = definePlans({
@@ -0,0 +1,60 @@
1
+ import { n as CliError } from "./errors-Vpu6rKHl.js";
2
+ import { i as requirePeer } from "./peer-Q0fuZ6hx.js";
3
+ //#region src/cli/pg.ts
4
+ const CONNECT_TIMEOUT_MS = 1e4;
5
+ const STATEMENT_TIMEOUT_MS = 6e4;
6
+ function loadPg(command, cwd) {
7
+ return requirePeer(() => import("pg"), "pg", command, cwd);
8
+ }
9
+ function options(db) {
10
+ return {
11
+ connectionString: db,
12
+ connectionTimeoutMillis: CONNECT_TIMEOUT_MS,
13
+ statement_timeout: STATEMENT_TIMEOUT_MS
14
+ };
15
+ }
16
+ function unreachable(command, cause) {
17
+ return new CliError("unavailable", `PermDock CLI: ${command.replace(/^permdock /u, "")} could not connect`, {
18
+ cause,
19
+ code: "database_unreachable"
20
+ });
21
+ }
22
+ /**
23
+ * The default `connect` of a command: one connection, failing with a message
24
+ * that names `command`.
25
+ */
26
+ function pgConnector(command, cwd = process.cwd()) {
27
+ return (db) => connectPg(db, command, cwd);
28
+ }
29
+ /** One connection, for commands that run a transaction. */
30
+ async function connectPg(db, command, cwd) {
31
+ const client = new (await (loadPg(command, cwd))).Client(options(db));
32
+ try {
33
+ await client.connect();
34
+ } catch (cause) {
35
+ throw unreachable(command, cause);
36
+ }
37
+ return {
38
+ query: (sql, values) => client.query(sql, values),
39
+ end: () => client.end()
40
+ };
41
+ }
42
+ /** A small pool, for independent catalog reads that can run in parallel. */
43
+ async function connectPgPool(db, command, cwd = process.cwd()) {
44
+ const pool = new (await (loadPg(command, cwd))).Pool({
45
+ ...options(db),
46
+ max: 4
47
+ });
48
+ try {
49
+ (await pool.connect()).release();
50
+ } catch (cause) {
51
+ await pool.end();
52
+ throw unreachable(command, cause);
53
+ }
54
+ return {
55
+ query: (sql, values) => pool.query(sql, values),
56
+ end: () => pool.end()
57
+ };
58
+ }
59
+ //#endregion
60
+ export { pgConnector as n, connectPgPool as t };
@@ -5,7 +5,10 @@ const DRAFT_PINS = {
5
5
  overlay: "1.2-dev@edd4adea"
6
6
  };
7
7
  const PROFILE_NAMES = { fapi2: "fapi-20-security-profile" };
8
- /** PermDock's published `supportedParametersSchema` per profile, stable across pins. */
8
+ /**
9
+ * PermDock's published `supportedParametersSchema` per profile, stable across
10
+ * pins.
11
+ */
9
12
  const PROFILE_PARAMETERS = { fapi2: "https://permdock.com/schemas/security-profiles/fapi2.json" };
10
13
  const GNAP_RESERVED = "scheme.type 'gnap' is reserved and emits nothing. See https://permdock.com/docs/standards/watch-list#gnap";
11
14
  //#endregion
@@ -0,0 +1,21 @@
1
+ //#region src/cloud/pkce.ts
2
+ function base64url(bytes) {
3
+ let binary = "";
4
+ for (const byte of bytes) binary += String.fromCodePoint(byte);
5
+ return btoa(binary).replaceAll("+", "-").replaceAll("/", "_").replace(/[=]+$/u, "");
6
+ }
7
+ /** `length` random bytes as base64url, from Web Crypto. */
8
+ function randomToken(length) {
9
+ return base64url(globalThis.crypto.getRandomValues(new Uint8Array(length)));
10
+ }
11
+ /** An RFC 7636 verifier of 43 characters and its `S256` challenge. */
12
+ async function pkce() {
13
+ const verifier = randomToken(32);
14
+ const digest = await globalThis.crypto.subtle.digest("SHA-256", new TextEncoder().encode(verifier));
15
+ return {
16
+ verifier,
17
+ challenge: base64url(new Uint8Array(digest))
18
+ };
19
+ }
20
+ //#endregion
21
+ export { randomToken as n, pkce as t };
@@ -1,14 +1,14 @@
1
- import { T as Policy, ar as Subject, rr as Principal } from "./policy-types-n0uRTsW8.js";
2
- import { c as saasPlans, l as saasRoles, s as saasPermissions } from "./permissions-u_KHg-sN.js";
1
+ import { T as Policy, lr as Subject, sr as Principal } from "./policy-types-CCiDRZBH.js";
2
+ import { c as saasPlans, l as saasRoles, s as saasPermissions } from "./permissions-Bx6UI8n1.js";
3
3
  //#region src/testing/saas/policy.d.ts
4
4
  /** Daily API-key quota per subject; the bucket should be per tenant too. */
5
5
  declare const SAAS_API_KEY_LIMIT = 5;
6
6
  /**
7
7
  * The shared multi-tenant SaaS policy: four tenant roles, a team role, a
8
8
  * resource-scoped role, plan-gated features, a closure deny, a quota, an
9
- * approval and a folder tree shared through edges. Row conditions and
10
- * relations are portable; the closure is not, and the folder grants need
11
- * a `RelationSource` (`saasRelations()`).
9
+ * approval and a folder tree shared through edges. Row conditions and relations
10
+ * are portable; the closure is not, and the folder grants need a
11
+ * `RelationSource` (`saasRelations()`).
12
12
  */
13
13
  type SaasVocabulary = {
14
14
  readonly permissions: typeof saasPermissions;