permdock 0.5.0 → 0.7.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 (399) hide show
  1. package/README.md +1 -0
  2. package/dist/{2020-C9VN-x8c.js → 2020-CJbO8Bvz.js} +1 -3
  3. package/dist/a2a/index.d.ts +5 -5
  4. package/dist/a2a/index.js +4 -4
  5. package/dist/{adoption-scan-B4R5fnMU.js → adoption-scan-D-feE7BE.js} +1 -1
  6. package/dist/agent/index.d.ts +3 -3
  7. package/dist/agent/index.js +1 -1
  8. package/dist/ai-sdk/index.d.ts +21 -6
  9. package/dist/ai-sdk/index.js +19 -9
  10. package/dist/{approval-prompt-Djo_PyZc.d.ts → approval-prompt-K0faOLFp.d.ts} +2 -2
  11. package/dist/approvals/index.d.ts +4 -4
  12. package/dist/approvals/index.js +4 -4
  13. package/dist/{approvals-DJ6Yd5z1.js → approvals-CMRfsbBh.js} +74 -48
  14. package/dist/{arazzo-B6lebmiQ.js → arazzo-ClrF3PVb.js} +2 -2
  15. package/dist/{arazzo-BWhNF-k0.js → arazzo-rdeJ8n1J.js} +4 -4
  16. package/dist/{args-IIolxxKA.js → args-CC3OwyHW.js} +112 -2
  17. package/dist/astro/index.d.ts +6 -6
  18. package/dist/astro/index.js +2 -2
  19. package/dist/{audience-Dg8XsRaO.js → audience-BrMs8c4o.js} +1 -1
  20. package/dist/{auth-DRLEizbL.js → auth-CscUX8Sy.js} +3 -4
  21. package/dist/authzen/index.d.ts +162 -22
  22. package/dist/authzen/index.js +315 -146
  23. package/dist/{automation-BMZPIVUM.d.ts → automation-DOtAFWdy.d.ts} +3 -3
  24. package/dist/{automation-DVjOckjV.js → automation-ySsxp_Yp.js} +1 -1
  25. package/dist/base-url-BQbddZO5.js +9 -0
  26. package/dist/better-auth/index.d.ts +2 -2
  27. package/dist/better-auth/index.js +2 -2
  28. package/dist/better-supabase/index.d.ts +50 -8
  29. package/dist/better-supabase/index.js +94 -32
  30. package/dist/{bind-CZzhx-Vj.js → bind-D1nO6fiC.js} +5 -5
  31. package/dist/{bind--9EFVYWF.d.ts → bind-JDuvxjuW.d.ts} +7 -7
  32. package/dist/{build-instance-BMnAudHn.js → build-instance-DxE7czo9.js} +1 -1
  33. package/dist/{canonical-json-BC8_nMTw.js → canonical-json-DwilZ1iB.js} +6 -3
  34. package/dist/{capability-BSslw1QV.d.ts → capability-D4UC9TTW.d.ts} +2 -2
  35. package/dist/{capability-N1K9IpqS.js → capability-L7NnfhiE.js} +1 -1
  36. package/dist/{casbin-Cr7RLtA3.js → casbin-BHijLuHY.js} +2 -2
  37. package/dist/{casbin-Dyu2gnUD.js → casbin-BW9pS47J.js} +1 -1
  38. package/dist/{casl-64gpT-8x.js → casl-CmJlgziS.js} +2 -2
  39. package/dist/{casl-DjEDhTCP.js → casl-UbI8v-Wq.js} +1 -1
  40. package/dist/catalog/index.d.ts +70 -10
  41. package/dist/catalog/index.js +112 -6
  42. package/dist/catalog-BCCjSAdH.js +1 -0
  43. package/dist/{catalog-R_A__RsH.js → catalog-BaMQfQ6Y.js} +3 -3
  44. package/dist/{catalog-BECMPrwc.js → catalog-D69WhFii.js} +43 -13
  45. package/dist/{catalog-doc-C9wjsfNY.js → catalog-doc-CV9s6B1S.js} +28 -5
  46. package/dist/{catalog-fingerprint-CCP0-yQS.js → catalog-fingerprint-C144oW4M.js} +1 -1
  47. package/dist/{create-BWRSXgOF.js → challenge-nGWma08S.js} +122 -25
  48. package/dist/chat/index.d.ts +1 -1
  49. package/dist/chat/index.js +2 -2
  50. package/dist/chat-sdk/index.d.ts +3 -3
  51. package/dist/checks-BC_0mPIq.js +37 -0
  52. package/dist/claude-agent/index.d.ts +3 -3
  53. package/dist/claude-agent/index.js +2 -2
  54. package/dist/clerk/index.d.ts +3 -3
  55. package/dist/clerk/index.js +1 -1
  56. package/dist/cli/bin.js +2 -2
  57. package/dist/cli/index.d.ts +3 -3
  58. package/dist/cli/index.js +3 -3
  59. package/dist/cloud/index.d.ts +127 -11
  60. package/dist/cloud/index.js +251 -3
  61. package/dist/{cloud-CIoHNevm.js → cloud-CO8pYtwr.js} +5 -5
  62. package/dist/{codemod-Cxvvc70T.js → codemod-BP6n8N9L.js} +3 -3
  63. package/dist/{codemod-Bmj9dWMH.js → codemod-i4N2BhDc.js} +3 -3
  64. package/dist/{collect-CrZJJnEF.js → collect-BaWeMjwV.js} +17 -8
  65. package/dist/{collect-DloHbDVa.js → collect-DNm3oKOk.js} +6 -5
  66. package/dist/collect-k_Dulxr5.js +1 -0
  67. package/dist/compile/index.d.ts +1 -1
  68. package/dist/compile/index.js +1 -1
  69. package/dist/{compile-CMqMx_IN.js → compile-BAEO5bOk.js} +2 -2
  70. package/dist/{compile-Ckm2HqBZ.d.ts → compile-COM2VKuN.d.ts} +3 -3
  71. package/dist/{completion-BqhRBJD8.js → completion-BNdVf7X2.js} +3 -3
  72. package/dist/{config-bs_kZeYq.js → config-CoQHDrDi.js} +7 -3
  73. package/dist/{config-B46rm9sc.js → config-DGZzMV1B.js} +2 -2
  74. package/dist/{config-report-DUgj62Ai.js → config-report-Cm7UITNA.js} +3 -3
  75. package/dist/connector-schema-_VCSsdtD.js +433 -0
  76. package/dist/{context-bbFHR-0D.js → context--uM9V3Ui.js} +2 -2
  77. package/dist/convex/index.d.ts +5 -5
  78. package/dist/convex/index.js +2 -2
  79. package/dist/core-B5-w6Kw9.js +335 -0
  80. package/dist/core-CQkE8Esr.d.ts +179 -0
  81. package/dist/{create-0VZ7Pdiu.d.ts → create-B2-CQqCI.d.ts} +5 -5
  82. package/dist/{create-C3b4B5eF.js → create-Cb86Z8Im.js} +9 -8
  83. package/dist/{create-DnrmLnLW.js → create-DJrlhEp9.js} +5 -5
  84. package/dist/{create-BFfm17UA.d.ts → create-QHuuPw3q.d.ts} +7 -7
  85. package/dist/{create-BDS7wc3y.d.ts → create-UTnUVETj.d.ts} +30 -10
  86. package/dist/{credential-DM2um3ha.js → credential-CIM7wHwA.js} +4 -4
  87. package/dist/{credentials-DPyHmYz5.js → credentials-BpuTwd7a.js} +1 -1
  88. package/dist/{deciding-columns-Sq12mEA6.js → deciding-columns-DRo2QM6E.js} +13 -2
  89. package/dist/{delegation-DaXVdDhM.js → delegation-C5rOdTp5.js} +5 -5
  90. package/dist/delivery/index.d.ts +5 -5
  91. package/dist/delivery/index.js +4 -3
  92. package/dist/{delivery-DCAgNyCn.js → delivery-rwOKLWRm.js} +51 -2
  93. package/dist/{denied-text-D8jDHgsl.d.ts → denied-text-D4qkEtFz.d.ts} +2 -2
  94. package/dist/{describe-BybMRY7A.js → describe-DZlnEtLy.js} +1 -0
  95. package/dist/{describe-BZUsixiL.d.ts → describe-O0SwYIK8.d.ts} +2 -2
  96. package/dist/{diff-CxZo9pTq.js → diff-Btr1c1Ow.js} +2 -2
  97. package/dist/{diff-DCePiN6M.js → diff-DzT-xD13.js} +10 -10
  98. package/dist/{doctor-DFjUxf2f.js → doctor-BU1szn63.js} +241 -49
  99. package/dist/{doctor-CxiwSfqH.js → doctor-BoK_y0KO.js} +4 -4
  100. package/dist/drizzle/index.d.ts +3 -3
  101. package/dist/drizzle/index.js +1 -1
  102. package/dist/elysia/index.d.ts +5 -5
  103. package/dist/elysia/index.js +3 -3
  104. package/dist/{errors-C2PXIv4c.d.ts → errors-B_Qg9D3e.d.ts} +2 -2
  105. package/dist/{errors-CWTY6uih.js → errors-DpP_U6Bf.js} +1 -0
  106. package/dist/{evaluate-_R8QkWaf.js → evaluate-B_oqFbWC.js} +130 -34
  107. package/dist/{evaluations-16UqqQ6W.d.ts → evaluations-BCddEOfO.d.ts} +4 -4
  108. package/dist/{evaluations-DZ2CbV5k.js → evaluations-DReoiVBw.js} +4 -4
  109. package/dist/eve/index.d.ts +5 -5
  110. package/dist/eve/index.js +3 -3
  111. package/dist/express/index.d.ts +5 -5
  112. package/dist/express/index.js +3 -3
  113. package/dist/fastify/index.d.ts +5 -5
  114. package/dist/fastify/index.js +3 -3
  115. package/dist/{fetch-adapter-qKJBuRqy.d.ts → fetch-adapter-CuhyYwC1.d.ts} +4 -4
  116. package/dist/{fetch-adapter-g0ypLkID.js → fetch-adapter-De-u6vhJ.js} +3 -3
  117. package/dist/{fields-D9tPVUUS.js → fields-ClcQLrVc.js} +48 -13
  118. package/dist/{files-C5ZI27eV.js → files-acUbNwWt.js} +15 -2
  119. package/dist/{fixtures-B7XrLeY7.js → fixtures-BTMW6zgU.js} +2 -2
  120. package/dist/{flags-C3DktBDY.js → flags-aaeRAdiD.js} +2 -2
  121. package/dist/{from-snapshot-D2lZt4Dd.js → from-snapshot-Bz469dIh.js} +17 -10
  122. package/dist/generate-3FNO5P5Q.js +159 -0
  123. package/dist/{grantee-Cn1HyUsI.js → grantee-BrRANrpT.js} +14 -4
  124. package/dist/{grantee-conditions-CcXf8hMM.js → grantee-conditions-C6P1Tvol.js} +1 -1
  125. package/dist/{grantee-match-DHArqY82.js → grantee-match-0RtHWQDx.js} +3 -3
  126. package/dist/h3/index.d.ts +4 -4
  127. package/dist/h3/index.js +3 -3
  128. package/dist/{helpers-DTcZOzhF.js → helpers-DY3vXuGs.js} +3 -3
  129. package/dist/hono/index.d.ts +5 -5
  130. package/dist/hono/index.js +3 -3
  131. package/dist/{hosted-DBDX0M-P.d.ts → hosted-BmjzxQhp.d.ts} +14 -2
  132. package/dist/{hosted-BZIAYvon.js → hosted-XBgU6RGT.js} +34 -12
  133. package/dist/{http-DXJ37RDA.js → http-Ca3Sr5x1.js} +1 -1
  134. package/dist/{import-DMmOG27O.js → import-Bz0GefWg.js} +5 -5
  135. package/dist/{import-CNV7I2Dw.js → import-DB2EG_iy.js} +3 -3
  136. package/dist/{index-CxGUswIC.d.ts → index-BE8y3moU.d.ts} +50 -8
  137. package/dist/{index-Chrs5fQ-.d.ts → index-BSfRl0hZ.d.ts} +6 -6
  138. package/dist/{index-DOVf7RJv.d.ts → index-BTkwrK7v.d.ts} +155 -17
  139. package/dist/index-CMiPH2Tv.d.ts +206 -0
  140. package/dist/{index-SGdIQyzc.d.ts → index-DH9DUDEM.d.ts} +18 -3
  141. package/dist/{index-BcHcPyIo.d.ts → index-DLwcuCN_.d.ts} +86 -7
  142. package/dist/index.d.ts +18 -17
  143. package/dist/index.js +27 -25
  144. package/dist/{init-GG6Jh8HD.js → init-5TXNji88.js} +5 -5
  145. package/dist/{init-DeMYsnYJ.js → init-B-4t1NzC.js} +4 -4
  146. package/dist/{instance-options-Omfd793B.d.ts → instance-options-CU0YQCLH.d.ts} +1 -1
  147. package/dist/{instance-snapshot-Cxq4ygFc.js → instance-snapshot-CjcwnEiV.js} +20 -14
  148. package/dist/jwt/index.d.ts +83 -5
  149. package/dist/jwt/index.js +143 -5
  150. package/dist/{kernel-5JatXyND.js → kernel-DVExUwkp.js} +138 -12
  151. package/dist/kysely/index.d.ts +3 -3
  152. package/dist/kysely/index.js +1 -1
  153. package/dist/load-DrMHXzgN.js +1 -0
  154. package/dist/{load-DFS_ry0W.js → load-DxroEzH1.js} +2 -2
  155. package/dist/{login-Dfe5RlYk.js → login-ClSJh5t5.js} +4 -4
  156. package/dist/{login-imhuwvn3.js → login-WC9HPJpU.js} +6 -10
  157. package/dist/{manifest-C8IzW3Do.js → manifest-B79YuF2T.js} +6 -2
  158. package/dist/{manifest-mx5ghSFM.d.ts → manifest-BVhExYhw.d.ts} +23 -2
  159. package/dist/{manifest-CtKR3GXL.js → manifest-Dv6q4i5s.js} +54 -35
  160. package/dist/{manifest-schema-C0kK_8V0.js → manifest-schema-Cv492Qev.js} +37 -7
  161. package/dist/{map-claims-D3oRmTk0.js → map-claims-etGIS_Dv.js} +14 -11
  162. package/dist/{map-error-TCAdw-eW.js → map-error-BQGyDm_M.js} +1 -1
  163. package/dist/mcp/index.d.ts +64 -10
  164. package/dist/mcp/index.js +151 -22
  165. package/dist/{migrate-BShP7Vf4.js → migrate-Dodel0IJ.js} +77 -24
  166. package/dist/nest/index.d.ts +5 -5
  167. package/dist/nest/index.js +3 -3
  168. package/dist/next/index.d.ts +9 -9
  169. package/dist/next/index.js +5 -5
  170. package/dist/next/plugin.d.ts +1 -1
  171. package/dist/next/plugin.js +2 -2
  172. package/dist/node/index.d.ts +5 -5
  173. package/dist/node/index.js +2 -2
  174. package/dist/openai/index.d.ts +5 -5
  175. package/dist/openai/index.js +3 -3
  176. package/dist/openapi/index.d.ts +14 -4
  177. package/dist/openapi/index.js +1 -1
  178. package/dist/{openapi-ahr8rHu3.js → openapi-DMocl1bh.js} +4 -4
  179. package/dist/{openapi-B7HZ0f-r.js → openapi-Ddb4628T.js} +2 -7
  180. package/dist/{openapi-DTaEmTSW.js → openapi-ztVaux6j.js} +8 -8
  181. package/dist/{operation-findings-DgATDpvh.js → operation-findings-kRcEp8lE.js} +1 -1
  182. package/dist/{operations-CxybZErY.d.ts → operations-BNLes61x.d.ts} +1 -1
  183. package/dist/orpc/index.d.ts +6 -6
  184. package/dist/orpc/index.js +4 -4
  185. package/dist/otel/index.d.ts +3 -3
  186. package/dist/otel/index.js +1 -1
  187. package/dist/{output-Dyw8fyPF.js → output-DgSDLrta.js} +7 -3
  188. package/dist/{output-files-DhRBBE4n.js → output-files-CCMdcFWb.js} +2 -2
  189. package/dist/output-files-DPAY7-GX.js +1 -0
  190. package/dist/{ownership-BatFgAA4.js → ownership-Z2LpxsGa.js} +1349 -883
  191. package/dist/parse-Ddhz2xf4.js +148 -0
  192. package/dist/{parse-local-manifest-CVSs6J9I.js → parse-local-manifest-T1Q8X3A2.js} +24 -1
  193. package/dist/{parse-local-manifest-DgqtruPn.d.ts → parse-local-manifest-e4mdwAKd.d.ts} +1 -1
  194. package/dist/pdp/index.d.ts +3 -3
  195. package/dist/pdp/index.js +7 -3
  196. package/dist/peer-12Q5I_RH.js +976 -0
  197. package/dist/{peer-CRvC7Hg1.js → peer-DOzzMfZL.js} +1 -1
  198. package/dist/{permdock-B9JxkBwC.js → permdock-BfWEeMqk.js} +177 -49
  199. package/dist/{permdock-D7eeLJER.d.ts → permdock-Dco6dyCK.d.ts} +34 -5
  200. package/dist/{permission-registry-Br4jSNVi.js → permission-registry-DpPtSKNZ.js} +1 -1
  201. package/dist/{vocabulary-D6lPdb4Z.d.ts → permission-types-DhNEmoRG.d.ts} +4 -62
  202. package/dist/{permissions-oEWfl-kl.d.ts → permissions-CoqCOfJ3.d.ts} +2 -1
  203. package/dist/{permissions-B-wCP5ZC.js → permissions-CyH2MV_B.js} +1 -1
  204. package/dist/{permissions-CZKiUfFM.js → permissions-DArULThq.js} +4 -4
  205. package/dist/pkce-5h8NgMQJ.js +21 -0
  206. package/dist/{policies-CO1oOymN.js → policies-B2lZIurj.js} +3 -3
  207. package/dist/{policy-Czo4n3Hs.d.ts → policy-B7dg_yzu.d.ts} +2 -2
  208. package/dist/{policy-DLZJ5gAp.js → policy-DaJy4nK4.js} +17 -8
  209. package/dist/{policy-from-catalog-DzhEc3Y9.js → policy-from-catalog-DFWYkNdu.js} +9 -9
  210. package/dist/{policy-types-DzwivBgR.d.ts → policy-types-B-F-qAZk.d.ts} +109 -5
  211. package/dist/postgres-store-BL9M_CA1.js +1001 -0
  212. package/dist/{postgrest-NUqZT-RB.d.ts → postgrest-CYacM_u7.d.ts} +12 -1
  213. package/dist/{postgrest-CW0IqC-U.js → postgrest-r5faDIzD.js} +47 -5
  214. package/dist/{powersync-BHfuehf3.js → powersync-13odBwiM.js} +3 -3
  215. package/dist/powersync-53ryOZip.js +1059 -0
  216. package/dist/powersync-CExtTLyA.js +1 -0
  217. package/dist/preset/index.js +1 -1
  218. package/dist/{preset-DZdU0tne.js → preset-CHTbd-DQ.js} +2 -2
  219. package/dist/prisma/index.d.ts +2 -2
  220. package/dist/prisma/index.js +1 -1
  221. package/dist/{problem-details-DXlt-vks.d.ts → problem-details-Tcfmj3bV.d.ts} +1 -1
  222. package/dist/prompt-DwtVemER.js +935 -0
  223. package/dist/{protected-DEPHc2xV.d.ts → protected-BwZYL1X_.d.ts} +6 -5
  224. package/dist/{protected-DfjY5mLA.js → protected-DXE3cQYg.js} +2 -2
  225. package/dist/{provider-CC-u3bYP.js → provider-BQsTYYy0.js} +2 -2
  226. package/dist/{provider-DMVt6yYn.d.ts → provider-Csk-THAn.d.ts} +1 -1
  227. package/dist/{provider-store-B5Yrkhzr.js → provider-store-IgqQipCO.js} +2 -2
  228. package/dist/{pull-BgIfno6w.js → pull-CN5OLxrF.js} +7 -7
  229. package/dist/pull-Cty6Ovyu.js +1 -0
  230. package/dist/{push-CmFVBOeI.js → push-tVdG8dUL.js} +54 -14
  231. package/dist/{pushed-policy-BImMTTIM.d.ts → pushed-policy-BbcY9r_4.d.ts} +1 -1
  232. package/dist/{pushed-policy-DobP7AHI.js → pushed-policy-CmYeSQqq.js} +1 -1
  233. package/dist/react/index.d.ts +6 -6
  234. package/dist/react/index.js +3 -3
  235. package/dist/react/provider-client.d.ts +1 -1
  236. package/dist/react/provider-client.js +1 -1
  237. package/dist/react-native/index.d.ts +25 -11
  238. package/dist/react-native/index.js +214 -24
  239. package/dist/{refs-K6eWUJ0H.js → refs-CNJBiTFo.js} +15 -1
  240. package/dist/{replay-D7iKcLFe.d.ts → replay-DCDD_ZfL.d.ts} +1 -1
  241. package/dist/{request-context-BTRTG7OT.js → request-context-BykKLmyE.js} +2 -2
  242. package/dist/resend/index.d.ts +4 -4
  243. package/dist/{retire-CALjIQ7e.js → retire-Wj6dkyDE.js} +2 -2
  244. package/dist/{rls-BA8an5Ap.js → rls-Ck_PocSp.js} +32 -8
  245. package/dist/{rls-j6t43t7n.js → rls-CxBZb4rZ.js} +478 -534
  246. package/dist/{role-builder-CXbis5-X.js → role-builder-C1VJzvcr.js} +3 -3
  247. package/dist/rolldown-runtime-C3I60J0A.js +4 -0
  248. package/dist/{rpc-aPyNi6tA.js → rpc-Bk1bE-ch.js} +1 -1
  249. package/dist/run-Bz7DXGEv.js +1 -0
  250. package/dist/{run-ticket-sxFI6LAk.js → run-ticket-B5d_63Ma.js} +22 -1
  251. package/dist/{run-ticket-BjhTOi6u.d.ts → run-ticket-BpNi7BCi.d.ts} +8 -3
  252. package/dist/{run-DOfMtc9V.js → run-uLD2aWuO.js} +7 -7
  253. package/dist/{runtime-D3VTAiCA.js → runtime-Vif3_-zf.js} +1 -1
  254. package/dist/{saas-FO-Q8oj0.js → saas-Az_Kz-4D.js} +7 -7
  255. package/dist/{scan-BOI5tJ-6.js → scan-DSljDE1Y.js} +1 -1
  256. package/dist/{schema-yLuBWWsh.js → schema-gIcCx7zM.js} +1 -1
  257. package/dist/scim/index.d.ts +3 -2
  258. package/dist/scim/index.js +3 -1
  259. package/dist/scim-C7JYhySg.js +44 -0
  260. package/dist/{scim-ClHtpyV3.js → scim-YNieBO1U.js} +3 -537
  261. package/dist/{scopes-CUPSjo9q.js → scopes-BHsc-wp-.js} +1 -1
  262. package/dist/server/index.d.ts +11 -11
  263. package/dist/server/index.js +7 -7
  264. package/dist/{server-DqCT4CgZ.js → server-Bnga6I50.js} +3 -3
  265. package/dist/{server-types-BLd4MnBX.d.ts → server-types-C4gZUEZy.d.ts} +9 -9
  266. package/dist/{shared-DvvFzYXe.js → shared-C8LjUdVU.js} +1 -1
  267. package/dist/{shared-CD11nBbC.js → shared-fMKOv8hP.js} +46 -39
  268. package/dist/{sink-Bj_lDUDq.d.ts → sink-Cp_Eot9W.d.ts} +4 -4
  269. package/dist/{skills-B6lVdD_W.js → skills-Dcjw9_1C.js} +5 -5
  270. package/dist/{skills-CTYwkl44.js → skills-g_3BS9NC.js} +3 -3
  271. package/dist/{snapshot-CXUWfsNy.js → snapshot-CbGmYiJx.js} +4 -4
  272. package/dist/{snapshot-cache-DZHQ0KF6.js → snapshot-cache-DT2Kx1F8.js} +1 -1
  273. package/dist/{snapshot-cache-DqK9eDmM.d.ts → snapshot-cache-Pahd3IYJ.d.ts} +1 -1
  274. package/dist/solid/index.d.ts +6 -5
  275. package/dist/solid/index.js +4 -4
  276. package/dist/solid-start/index.d.ts +6 -6
  277. package/dist/solid-start/index.js +3 -3
  278. package/dist/{sources-vs5dGOsS.js → sources-B-zYB4GS.js} +111 -25
  279. package/dist/{sources-BV9j0DeZ.d.ts → sources-DEEuGb8S.d.ts} +63 -14
  280. package/dist/sources-qoIJQrJv.js +11 -0
  281. package/dist/{sql-B5T1IL83.js → sql-B96movIM.js} +5 -1
  282. package/dist/sql-CDEPCA0g.d.ts +10 -0
  283. package/dist/{src-DLfUWFAI.js → src-DLFrtrrC.js} +154 -53
  284. package/dist/ssf/index.d.ts +4 -4
  285. package/dist/ssf/index.js +640 -211
  286. package/dist/{standard-webhooks-6lg8v_is.d.ts → standard-webhooks-B_qRg0ws.d.ts} +2 -2
  287. package/dist/{store-4u_hxjWa.js → store-DSP9oGvh.js} +15 -7
  288. package/dist/{store-options-BqEakYRa.js → store-options-B_poyYvg.js} +6 -6
  289. package/dist/{stores-ClZUgeoP.d.ts → stores-BAZwSYZA.d.ts} +6 -5
  290. package/dist/{stores-BbsD4fAR.js → stores-BqEuHC05.js} +2 -2
  291. package/dist/{stream-7-xmnf3U.d.ts → stream-2Vwhl7Er.d.ts} +2 -2
  292. package/dist/{style-Uao76wO7.js → style-Cqo7-73x.js} +1 -0
  293. package/dist/{style-DiKWnAvn.js → style-Ds1gNm77.js} +1 -1
  294. package/dist/supabase/index.d.ts +8 -7
  295. package/dist/supabase/index.js +5 -5
  296. package/dist/supabase/middleware.d.ts +6 -6
  297. package/dist/supabase/middleware.js +6 -6
  298. package/dist/{supabase-Dxlp8A94.js → supabase--0aJdLEd.js} +9 -7
  299. package/dist/{supabase-9pqI57pW.js → supabase-Bqp7iIY2.js} +3 -3
  300. package/dist/supabase-hook-DJxC4PoP.js +1 -0
  301. package/dist/{supabase-hook-DdDQhMlw.js → supabase-hook-Dg0SrQWR.js} +1069 -123
  302. package/dist/supautils-MESd81bF.js +689 -0
  303. package/dist/{support-session-C6xJQYut.js → support-session-Cna49-3f.js} +2 -2
  304. package/dist/svelte/index.d.ts +5 -5
  305. package/dist/svelte/index.js +5 -5
  306. package/dist/svelte/runtime.d.ts +3 -3
  307. package/dist/svelte/runtime.js +3 -3
  308. package/dist/svelte/source.d.ts +5 -5
  309. package/dist/svelte/source.js +2 -2
  310. package/dist/sveltekit/index.d.ts +6 -6
  311. package/dist/sveltekit/index.js +2 -2
  312. package/dist/tanstack-start/index.d.ts +6 -6
  313. package/dist/tanstack-start/index.js +2 -2
  314. package/dist/{tenancy-DN2QAx9z.js → tenancy-CmeBQ6Nv.js} +12 -3
  315. package/dist/terminal/index.d.ts +6 -6
  316. package/dist/terminal/index.js +3 -3
  317. package/dist/testing/core.d.ts +2 -0
  318. package/dist/testing/core.js +1 -0
  319. package/dist/testing/fixtures/index.d.ts +12 -0
  320. package/dist/testing/fixtures/index.js +770 -0
  321. package/dist/testing/index.d.ts +41 -174
  322. package/dist/testing/index.js +241 -731
  323. package/dist/testing/saas/index.d.ts +5 -5
  324. package/dist/testing/saas/index.js +2 -2
  325. package/dist/testing/saas/permissions.d.ts +1 -1
  326. package/dist/testing/saas/permissions.js +1 -1
  327. package/dist/text-diff-DhITNCnD.js +444 -0
  328. package/dist/{token-BLZcjQgt.js → token-2qYDvXz2.js} +1 -1
  329. package/dist/{tool-refusal-CMLN5xhn.js → tool-refusal-reAhIzdl.js} +1 -1
  330. package/dist/trpc/index.d.ts +6 -6
  331. package/dist/trpc/index.js +3 -3
  332. package/dist/{types-5Ut_pbKy.d.ts → types-BWZybqs9.d.ts} +112 -8
  333. package/dist/{types-CZTnPFzM.d.ts → types-BXMYB7BY.d.ts} +2 -2
  334. package/dist/{types-CdlxsYQh.d.ts → types-BfVmNJO5.d.ts} +14 -3
  335. package/dist/{types-BqAKcRNW.d.ts → types-CIeZcG8v.d.ts} +2 -2
  336. package/dist/{types-BNORmDM8.d.ts → types-CKV71kKh.d.ts} +4 -4
  337. package/dist/{types-tIgIeIKJ.d.ts → types-CQVEQawv.d.ts} +4 -4
  338. package/dist/{types-BjV-fqcA.d.ts → types-CeIscIKp.d.ts} +4 -4
  339. package/dist/{types-_sHy8BQf.d.ts → types-CfiKC5aN.d.ts} +1 -1
  340. package/dist/{types-ClZaWzfb.d.ts → types-D3A19w4A.d.ts} +8 -4
  341. package/dist/{types-C8-KNsFf.d.ts → types-DBHftjgS.d.ts} +15 -8
  342. package/dist/{types-CCpc2Dcv.d.ts → types-DC44-hqb.d.ts} +2 -2
  343. package/dist/{types-fbZ7JEXr.d.ts → types-DXmwu78Z.d.ts} +4 -4
  344. package/dist/{types-DiQjupG2.d.ts → types-cTos-H7p.d.ts} +2 -2
  345. package/dist/{types-DX0LaKTb.d.ts → types-g7Oy6Zg4.d.ts} +3 -3
  346. package/dist/unplugin/index.d.ts +1 -1
  347. package/dist/unplugin/index.js +2 -2
  348. package/dist/{usage-T5mXq98v.js → usage-Bybmck7f.js} +7 -7
  349. package/dist/{usage-DHtE8j4E.js → usage-CDaLXCfL.js} +2 -2
  350. package/dist/usage-y-kBNdqs.js +1 -0
  351. package/dist/{validation-error-Bg5Tpluk.d.ts → validation-error-CQpoquwj.d.ts} +1 -1
  352. package/dist/{verify-DbCL9bnB.js → verify-pe8rL_Qw.js} +350 -83
  353. package/dist/{views-DTIIO-oQ.js → views-BB8E9dTP.js} +1 -1
  354. package/dist/vocabulary-Bg3eeT2H.d.ts +67 -0
  355. package/dist/vue/index.d.ts +6 -5
  356. package/dist/vue/index.js +4 -4
  357. package/dist/{waiter-CKy4MQSY.d.ts → waiter-DwEyouan.d.ts} +2 -2
  358. package/dist/watch-Bd9mx3rd.js +1 -0
  359. package/dist/{watch-CszoTJMq.js → watch-C-4VmFlL.js} +3 -3
  360. package/dist/webmcp/index.d.ts +2 -2
  361. package/dist/webmcp/index.js +2 -2
  362. package/dist/{where-scope-Dv-WTP-w.js → where-scope-wq2coopv.js} +41 -21
  363. package/dist/{who-can-D0QoYbEb.js → who-can-BwNsI_Js.js} +6 -6
  364. package/dist/workflow/index.d.ts +3 -3
  365. package/dist/workflow/index.js +5 -5
  366. package/dist/workflow-sdk/index.d.ts +5 -5
  367. package/dist/{wrap-Bd1Tejur.d.ts → wrap-B6R0cMRL.d.ts} +2 -2
  368. package/dist/{wrap-gX61EtpB.js → wrap-CiSc_KCq.js} +8 -2
  369. package/package.json +22 -11
  370. package/schemas/cli-result-v1.json +1 -0
  371. package/schemas/cloud-api-v1.json +152 -7
  372. package/schemas/connector-v1.json +8 -0
  373. package/schemas/supabase-claims-v1.json +5 -0
  374. package/schemas/supabase-manifest-v1.json +276 -75
  375. package/skills/permdock/SKILL.md +1 -0
  376. package/skills/permdock-agents/references/runtimes.md +3 -1
  377. package/skills/permdock-approvals/references/stores-and-resume.md +2 -1
  378. package/skills/permdock-data/references/queries-and-rls.md +5 -2
  379. package/skills/permdock-tenancy/SKILL.md +1 -1
  380. package/skills/permdock-tenancy/references/ownership-and-custom-roles.md +2 -0
  381. package/skills/permdock-wire/references/adapters.md +14 -0
  382. package/skills/permdock-wire/references/policy-options.md +1 -0
  383. package/dist/catalog-DjhMYYCq.js +0 -1
  384. package/dist/collect-FlXJlhus.js +0 -1
  385. package/dist/index-D8EovfsP.d.ts +0 -91
  386. package/dist/load-BxEtwlBS.js +0 -1
  387. package/dist/output-files-B3IZJksC.js +0 -1
  388. package/dist/parse-Cxq0WxrA.js +0 -53
  389. package/dist/peer-C8swJ2GH.js +0 -50
  390. package/dist/powersync-CbzkqL_M.js +0 -1
  391. package/dist/powersync-bYUDLOAO.js +0 -538
  392. package/dist/prompt-DfZLJLIn.js +0 -32
  393. package/dist/pull-ByOks_Tg.js +0 -1
  394. package/dist/run-CNsApDpd.js +0 -1
  395. package/dist/supabase-hook-CXcGpHqq.js +0 -1
  396. package/dist/supautils-B6HYL9eL.js +0 -91
  397. package/dist/text-diff-BQcUapOb.js +0 -15
  398. package/dist/usage-CHOtwL19.js +0 -1
  399. package/dist/watch-Cb-NcaUw.js +0 -1
@@ -1,6 +1,7 @@
1
- import { et as MembershipSource } from "./policy-types-DzwivBgR.js";
2
- import { n as RoleThrough, y as SupabaseSuspension } from "./types-CdlxsYQh.js";
3
- import { o as SupabaseManifestMembership } from "./manifest-mx5ghSFM.js";
1
+ import { et as MembershipSource } from "./policy-types-B-F-qAZk.js";
2
+ import { b as SupabaseSuspension, n as RoleMap, r as RoleThrough } from "./types-BfVmNJO5.js";
3
+ import { t as SqlQuery } from "./sql-CDEPCA0g.js";
4
+ import { c as SupabaseManifestMembership } from "./manifest-BVhExYhw.js";
4
5
  //#region src/supabase/roles.d.ts
5
6
  /** A roles table a role column references, by `schema.table`. */
6
7
  type RoleKeys = {
@@ -12,15 +13,26 @@ type RoleKeys = {
12
13
  /** The referencing table's column. */
13
14
  readonly ref: string;
14
15
  };
15
- //#endregion
16
- //#region src/supabase/sources.d.ts
16
+ /** One role source of a membership row: a key column, or a reference to a roles table. */
17
+ type RoleSource = string | RoleThrough | RoleMap;
18
+ /** A role source, or several the row holds at once. */
19
+ type RoleSpec = RoleSource | readonly RoleSource[];
17
20
  /**
18
- * Runs one parameterised statement: `pg`'s `client.query` (which resolves
19
- * `{ rows }`) and `postgres`'s `sql.unsafe` (which resolves the rows) both fit.
21
+ * A roles table whose tenant rows are written by tenants. A role key read
22
+ * through it from a tenant row that is one of `declared` reads as null, so a
23
+ * tenant cannot claim the grants of a declared role by naming a role after it.
20
24
  */
21
- type SqlQuery = (text: string, values: readonly unknown[]) => Promise<readonly Record<string, unknown>[] | {
22
- readonly rows: readonly Record<string, unknown>[];
23
- }>;
25
+ type RoleGuard = {
26
+ /** `schema.table`, or `public`. */
27
+ readonly table: string;
28
+ /** The tenant column of the roles table. */
29
+ readonly tenant: string;
30
+ /** A tenant row with this column true is the application's own copy of a declared role. */
31
+ readonly skip?: string | undefined;
32
+ readonly declared: readonly string[];
33
+ };
34
+ //#endregion
35
+ //#region src/supabase/sources.d.ts
24
36
  type Common = {
25
37
  readonly table: string;
26
38
  /** Runs the lookups; without it the source only describes SQL (for `permdock supabase hook generate`). */
@@ -41,7 +53,7 @@ type MembershipTableOptions = Common & {
41
53
  * The role key column, a reference to a roles table that holds the key,
42
54
  * or several of them: the row holds every non-null key.
43
55
  */
44
- readonly role?: string | RoleThrough | readonly (string | RoleThrough)[];
56
+ readonly role?: RoleSpec;
45
57
  readonly via?: string;
46
58
  readonly expiresAt?: string;
47
59
  readonly disabledAt?: string;
@@ -73,8 +85,8 @@ type MembershipJunctionOptions = Common & {
73
85
  * roles every row holds (a contact table with no role column), or
74
86
  * `{ sources }`: several role columns whose non-null keys the row holds.
75
87
  */
76
- readonly roles: string | RoleThrough | readonly string[] | {
77
- readonly sources: readonly (string | RoleThrough)[];
88
+ readonly roles: string | RoleThrough | RoleMap | readonly string[] | {
89
+ readonly sources: readonly RoleSource[];
78
90
  };
79
91
  /** The membership kind every row has (`contact`, `staff`, `partner`). */
80
92
  readonly via?: string;
@@ -135,6 +147,41 @@ type MembershipSql = {
135
147
  readonly manifest: SupabaseManifestMembership;
136
148
  /** What the ownership triggers count; absent on a source that is not a table. */
137
149
  readonly holders?: MembershipHolders;
150
+ /** The rows as plain columns, for Sync Streams and `powerSyncSource`; a source without it does not sync. */
151
+ readonly stream?: MembershipStream;
152
+ };
153
+ /**
154
+ * One membership source as columns a Sync Streams query can filter on.
155
+ * Tables are `schema.table`; a `through` table is qualified in the source's
156
+ * schema when it names none.
157
+ */
158
+ type MembershipStream = {
159
+ readonly table: string;
160
+ /** The user id column, or the reference to the table that holds the user id. */
161
+ readonly user: string | RoleThrough;
162
+ /** The scope column, or the scope every row is a membership of. */
163
+ readonly scope: {
164
+ readonly column: string;
165
+ } | {
166
+ readonly value: string;
167
+ };
168
+ readonly id: string;
169
+ /** The role sources (the row holds every non-null key), or the fixed roles every row holds. */
170
+ readonly roles: RoleSpec | {
171
+ readonly value: readonly string[];
172
+ };
173
+ /** The membership kind column, or the kind every row has. */
174
+ readonly via?: {
175
+ readonly column: string;
176
+ } | {
177
+ readonly value: string;
178
+ };
179
+ readonly expiresAt?: string;
180
+ readonly disabledAt?: string;
181
+ /** A row may hold no role key: such a row is no membership, and a reader drops it. */
182
+ readonly nullableRoles: boolean;
183
+ /** The guard the source reads its roles table with: a tenant row named like a declared role is no role. */
184
+ readonly guard?: RoleGuard;
138
185
  };
139
186
  /**
140
187
  * The rows of a membership table, for the holder-count and transfer-only
@@ -158,6 +205,8 @@ type MembershipHolders = {
158
205
  };
159
206
  type SqlMembershipSource = MembershipSource & {
160
207
  readonly sql: MembershipSql;
208
+ /** The same source with the role keys of tenant rows of `guard.table` named like a declared role read as null. */
209
+ readonly guarded?: (guard: RoleGuard) => SqlMembershipSource;
161
210
  };
162
211
  /** The part of `@supabase/server`'s `PostgresApi` a `SqlQuery` needs. */
163
212
  type SupabasePostgres = {
@@ -187,4 +236,4 @@ declare function authzVersion(options: {
187
236
  readonly schema?: string;
188
237
  }): NonNullable<MembershipSource["version"]>;
189
238
  //#endregion
190
- export { MembershipTableOptions as a, SupabasePostgres as c, supabasePostgresQuery as d, tableMembershipSource as f, MembershipSql as i, authzVersion as l, MembershipHolders as n, SqlMembershipSource as o, MembershipJunctionOptions as r, SqlQuery as s, AUTHZ_VERSION_TABLE as t, junctionMembershipSource as u };
239
+ export { MembershipStream as a, SupabasePostgres as c, supabasePostgresQuery as d, tableMembershipSource as f, MembershipSql as i, authzVersion as l, MembershipHolders as n, MembershipTableOptions as o, MembershipJunctionOptions as r, SqlMembershipSource as s, AUTHZ_VERSION_TABLE as t, junctionMembershipSource as u };
@@ -0,0 +1,11 @@
1
+ //#region src/cli/sql/sources.ts
2
+ /**
3
+ * The membership sources a project reads: `rls.membershipSources`, else
4
+ * `supabase.hook.memberships`. Every generator, doctor check and verifier
5
+ * resolves them here, so they all read the same tables.
6
+ */
7
+ function membershipSourcesOf(config) {
8
+ return config.rls?.membershipSources ?? config.supabase?.hook?.memberships ?? [];
9
+ }
10
+ //#endregion
11
+ export { membershipSourcesOf as t };
@@ -1,4 +1,8 @@
1
1
  //#region src/core/sql.ts
2
+ /** The rows of a `SqlQuery` result, whichever of its two shapes the driver resolved. */
3
+ function sqlRows(result) {
4
+ return Array.isArray(result) ? result : result.rows;
5
+ }
2
6
  /** A bare Postgres identifier PermDock emits unquoted-safe: letters, digits and `_`, not starting with a digit. */
3
7
  const SQL_IDENT = /^[A-Za-z_][A-Za-z0-9_]*$/u;
4
8
  /** A validated, double-quoted identifier; anything outside `SQL_IDENT` throws. */
@@ -52,4 +56,4 @@ function defaultSqlCommand(action) {
52
56
  }
53
57
  }
54
58
  //#endregion
55
- export { quoteQualifiedTable as a, quoteSqlTable as c, qualifySqlTable as i, sqlIdent as l, defaultSqlCommand as n, quoteSqlIdent as o, escapeSqlIdent as r, quoteSqlLiteral as s, SQL_IDENT as t, sqlTextArray as u };
59
+ export { quoteQualifiedTable as a, quoteSqlTable as c, sqlTextArray as d, qualifySqlTable as i, sqlIdent as l, defaultSqlCommand as n, quoteSqlIdent as o, escapeSqlIdent as r, quoteSqlLiteral as s, SQL_IDENT as t, sqlRows as u };
@@ -0,0 +1,10 @@
1
+ //#region src/core/sql.d.ts
2
+ /**
3
+ * Runs one parameterised statement: `pg`'s `client.query` (which resolves
4
+ * `{ rows }`) and `postgres`'s `sql.unsafe` (which resolves the rows) both fit.
5
+ */
6
+ type SqlQuery = (text: string, values: readonly unknown[]) => Promise<readonly Record<string, unknown>[] | {
7
+ readonly rows: readonly Record<string, unknown>[];
8
+ }>;
9
+ //#endregion
10
+ export { SqlQuery as t };
@@ -1,29 +1,29 @@
1
1
  import { n as isReadonlyArray, r as isRecord, t as compact } from "./compact-CAf557ZB.js";
2
2
  import { n as freezeDeep } from "./freeze-CrU8nQeX.js";
3
3
  import { n as isForbiddenKey, r as ownGet } from "./paths-DXSHAMIa.js";
4
- import { f as normalizeApproval, g as assertSqlFunctionName, h as assertSqlFunctionArg, m as assertPortableTwin, p as normalizeWhere, u as assertApprovalRelations } from "./role-builder-CXbis5-X.js";
4
+ import { f as normalizeApproval, g as assertSqlFunctionName, h as assertSqlFunctionArg, m as assertPortableTwin, p as normalizeWhere, u as assertApprovalRelations } from "./role-builder-C1VJzvcr.js";
5
5
  import { n as PermDockDeniedError } from "./errors-BKy0EfhN.js";
6
6
  import { o as sameId } from "./expiry-D4_YKRKD.js";
7
7
  import { n as internalsOf } from "./internals-Dk8A8fX3.js";
8
- import { c as listPermissions, i as getRegistry, n as findPermission, o as isPermission } from "./permission-registry-Br4jSNVi.js";
8
+ import { c as listPermissions, i as getRegistry, n as findPermission, o as isPermission } from "./permission-registry-DpPtSKNZ.js";
9
9
  import { n as isThenable$1 } from "./thenable-yD7SabqG.js";
10
10
  import { c as isEdgeRelation, m as restrictedStops, o as groupEntries, s as isComputedRelation, u as isPrincipalRelation } from "./resource-relations-D_jw0BFx.js";
11
11
  import { a as durationOf, g as secondsOf, m as rfc3339, p as nowSeconds } from "./time-DkWjdL98.js";
12
- import { d as scopeList, l as scopeChain, m as tenantOf, o as resolveScope, u as scopeIdOf } from "./scopes-CUPSjo9q.js";
13
- import { u as evaluateCondition } from "./delegation-DaXVdDhM.js";
14
- import { _ as listPlans, a as authenticated, m as findRole, o as flattenGrantee } from "./grantee-Cn1HyUsI.js";
15
- import { m as tenantsOf, r as isMembershipExpired } from "./tenancy-DN2QAx9z.js";
16
- import { o as levelNames, r as grantList, t as declaredRoleNames } from "./policy-DLZJ5gAp.js";
17
- import { r as isPortableCondition } from "./hosted-BZIAYvon.js";
18
- import { n as OPERATION_RISKS, r as isOperationRisk } from "./permissions-B-wCP5ZC.js";
19
- import { b as tenantCustomRoles, f as customRoleId, l as ceilingGrants, p as customRoleScope, v as resolveCustomRole } from "./evaluate-_R8QkWaf.js";
20
- import { d as rankRoles, f as usesAssigns, i as collectSnapshotGrants, n as snapshotScopes, t as snapshotOf, u as bindingOf } from "./instance-snapshot-Cxq4ygFc.js";
12
+ import { a as normalizeMembership$1, d as scopeIdOf, f as scopeList, h as tenantOf, o as normalizeMemberships$1, s as resolveScope$1, u as scopeChain } from "./scopes-BHsc-wp-.js";
13
+ import { u as evaluateCondition } from "./delegation-C5rOdTp5.js";
14
+ import { _ as listPlans, a as authenticated, m as findRole, o as flattenGrantee } from "./grantee-BrRANrpT.js";
15
+ import { m as tenantsOf, r as isMembershipExpired } from "./tenancy-CmeBQ6Nv.js";
16
+ import { r as grantList, s as levelNames, t as declaredRoleNames } from "./policy-DaJy4nK4.js";
17
+ import { o as isPortableCondition } from "./hosted-XBgU6RGT.js";
18
+ import { n as OPERATION_RISKS, r as isOperationRisk } from "./permissions-CyH2MV_B.js";
19
+ import { C as tenantCustomRoles, f as customRoleId, l as ceilingGrants, m as customRoleScope, p as customRoleOf, x as resolveCustomRole } from "./evaluate-B_oqFbWC.js";
20
+ import { d as rankRoles, f as usesAssigns, i as collectSnapshotGrants, n as snapshotScopes, t as snapshotOf, u as bindingOf } from "./instance-snapshot-CjcwnEiV.js";
21
21
  import { n as relationId } from "./relations-BnCWnJGI.js";
22
- import { r as snapshotGrant, t as buildSnapshot } from "./snapshot-CXUWfsNy.js";
23
- import { n as LOCAL_CUSTOM_ROLE } from "./parse-local-manifest-CVSs6J9I.js";
24
- import { r as resolveSubject, s as APP } from "./permdock-B9JxkBwC.js";
25
- import { i as memoryApprovalStore } from "./store-4u_hxjWa.js";
26
- import { n as wrapPermDock } from "./wrap-gX61EtpB.js";
22
+ import { r as snapshotGrant, t as buildSnapshot } from "./snapshot-CbGmYiJx.js";
23
+ import { n as LOCAL_CUSTOM_ROLE } from "./parse-local-manifest-T1Q8X3A2.js";
24
+ import { c as APP, r as resolveSubject } from "./permdock-BfWEeMqk.js";
25
+ import { i as memoryApprovalStore } from "./store-DSP9oGvh.js";
26
+ import { n as wrapPermDock } from "./wrap-CiSc_KCq.js";
27
27
  //#region src/conditions/sql-function.ts
28
28
  function sqlFunction(name, options) {
29
29
  assertSqlFunctionName(name);
@@ -89,7 +89,12 @@ function memorySnapshotSource(initial) {
89
89
  function memoryCustomRoleSource(customRoles) {
90
90
  const byTenant = /* @__PURE__ */ new Map();
91
91
  const global = [];
92
+ const shared = [];
92
93
  for (const role of customRoles) {
94
+ if (role.shared === true) {
95
+ shared.push(role);
96
+ continue;
97
+ }
93
98
  if (role.tenant === void 0) {
94
99
  global.push(role);
95
100
  continue;
@@ -104,6 +109,9 @@ function memoryCustomRoleSource(customRoles) {
104
109
  },
105
110
  globalRoles() {
106
111
  return [...global];
112
+ },
113
+ sharedRoles() {
114
+ return [...shared];
107
115
  }
108
116
  };
109
117
  }
@@ -1460,8 +1468,8 @@ function ofTenant(tenant, roles) {
1460
1468
  /**
1461
1469
  * A `CustomRoleSource` over a reader that returns every custom role of a tenant.
1462
1470
  * It keeps only the roles of the requested tenant. With `read: 'held'` it
1463
- * skips a tenant's read, and `globalRoles`, when the subject holds only
1464
- * declared roles there.
1471
+ * skips a tenant's read, and `globalRoles` and `sharedRoles`, when the
1472
+ * subject holds only declared roles there.
1465
1473
  */
1466
1474
  function customRoleSource(reader, options = {}) {
1467
1475
  const declared = options.read === "held" ? declaredRoleNames(options.policy) : void 0;
@@ -1472,7 +1480,8 @@ function customRoleSource(reader, options = {}) {
1472
1480
  return isThenable$1(roles) ? roles.then((list) => ofTenant(tenant, list)) : ofTenant(tenant, roles);
1473
1481
  },
1474
1482
  ...reader.assignable === void 0 ? {} : { assignable: (tenant) => reader.assignable?.(tenant) ?? [] },
1475
- ...reader.globalRoles === void 0 ? {} : { globalRoles: (context) => declared !== void 0 && context?.held.every((name) => declared.has(name)) === true ? [] : reader.globalRoles?.() ?? [] }
1483
+ ...reader.globalRoles === void 0 ? {} : { globalRoles: (context) => declared !== void 0 && context?.held.every((name) => declared.has(name)) === true ? [] : reader.globalRoles?.() ?? [] },
1484
+ ...reader.sharedRoles === void 0 ? {} : { sharedRoles: (context) => declared !== void 0 && context?.held.every((name) => declared.has(name)) === true ? [] : reader.sharedRoles?.() ?? [] }
1476
1485
  });
1477
1486
  }
1478
1487
  //#endregion
@@ -1503,7 +1512,7 @@ function snapshotFor(policy, user, options = {}) {
1503
1512
  if (isThenable$1(resolved)) throw new TypeError("PermDock: snapshotFor() needs synchronous subject and context mappers. Resolve async data first and pass it as a Subject, or use (await getPermDock(...)).snapshot().");
1504
1513
  const subject = withPlans(resolved, options.plans);
1505
1514
  const tenants = new Set(tenantsOf(subject.principal, scopeList(policy.scopes)));
1506
- const customRoles = (options.customRoles ?? []).filter((item) => item.scope === "global" || item.tenant !== void 0 && tenants.has(item.tenant));
1515
+ const customRoles = (options.customRoles ?? []).filter((item) => item.scope === "global" || item.shared === true && tenants.size > 0 || item.tenant !== void 0 && tenants.has(item.tenant));
1507
1516
  const names = options.assignable;
1508
1517
  const assignable = names === void 0 ? void 0 : new Map([...tenants].map((tenant) => [tenant, Object.hasOwn(names, tenant) ? names[tenant] ?? [] : []]));
1509
1518
  return snapshotOf(policy, subject, compact({
@@ -1590,12 +1599,34 @@ function writable(options) {
1590
1599
  return finishPreset(WRITABLE_ACTIONS, WRITABLE_COLLECTION, options);
1591
1600
  }
1592
1601
  //#endregion
1602
+ //#region src/core/scope-helpers.ts
1603
+ /**
1604
+ * The canonical form PermDock evaluates one membership in, or `undefined`
1605
+ * when it is malformed and grants nothing. `scopes` is the policy's or the
1606
+ * catalog's scope list; absent or empty means the implicit `tenant` and
1607
+ * `team` pair.
1608
+ */
1609
+ function normalizeMembership(input, scopes) {
1610
+ return normalizeMembership$1(input, scopeList(scopes));
1611
+ }
1612
+ /** Every well-formed membership of `input` in canonical form; malformed entries are dropped. */
1613
+ function normalizeMemberships(input, scopes) {
1614
+ return normalizeMemberships$1(input, scopeList(scopes));
1615
+ }
1616
+ /**
1617
+ * The declared scope `name` stands for: the name itself, or the scope the
1618
+ * `tenant` (first) or `team` (second) alias names. `undefined` otherwise.
1619
+ */
1620
+ function resolveScope(scopes, name) {
1621
+ return resolveScope$1(scopeList(scopes), name);
1622
+ }
1623
+ //#endregion
1593
1624
  //#region src/core/ownership.ts
1594
1625
  function coversInstance(membership, scopes, scope, id, within) {
1595
1626
  if (membership.scope === void 0 || membership.id === void 0) return false;
1596
1627
  if (membership.scope === scope) return sameId(membership.id, id);
1597
1628
  if (!scopeChain(scopes, scope).slice(1).includes(membership.scope)) return false;
1598
- const wanted = within === void 0 ? void 0 : Object.entries(within).find(([key]) => resolveScope(scopes, key) === membership.scope)?.[1] ?? void 0;
1629
+ const wanted = within === void 0 ? void 0 : Object.entries(within).find(([key]) => resolveScope$1(scopes, key) === membership.scope)?.[1] ?? void 0;
1599
1630
  return wanted !== void 0 && scopeIdOf(membership, membership.scope) === wanted;
1600
1631
  }
1601
1632
  /** Roles the principal holds at the instance, at an ancestor named in `within`, or globally. */
@@ -1630,12 +1661,13 @@ function conflictsWith(policy, role) {
1630
1661
  return out;
1631
1662
  }
1632
1663
  /** What the change does to the instance's holder count. */
1633
- function countRules(binding, role, holders, delta, deny) {
1634
- if (binding === void 0 || delta === 0) return;
1635
- const min = binding.min ?? 0;
1636
- if (!(min > 0 || binding.max !== void 0 || binding.transferOnly === true)) return;
1664
+ function countRules(rules, holders, delta, deny) {
1665
+ const role = rules.key;
1666
+ if (delta === 0) return;
1667
+ const min = rules.min ?? 0;
1668
+ if (!(min > 0 || rules.max !== void 0 || rules.transferOnly === true)) return;
1637
1669
  if (!(holders !== void 0 && Number.isInteger(holders) && holders >= 0)) {
1638
- deny(delta < 0 && min > 0 ? "last-holder" : delta > 0 && binding.max !== void 0 ? "max-holders" : "transfer-only", {
1670
+ deny(delta < 0 && min > 0 ? "last-holder" : delta > 0 && rules.max !== void 0 ? "max-holders" : "transfer-only", {
1639
1671
  role,
1640
1672
  holders: null
1641
1673
  });
@@ -1647,17 +1679,85 @@ function countRules(binding, role, holders, delta, deny) {
1647
1679
  min,
1648
1680
  holders
1649
1681
  });
1650
- if (delta > 0 && binding.max !== void 0 && after > binding.max) deny("max-holders", {
1682
+ if (delta > 0 && rules.max !== void 0 && after > rules.max) deny("max-holders", {
1651
1683
  role,
1652
- max: binding.max,
1684
+ max: rules.max,
1653
1685
  holders
1654
1686
  });
1655
- if (binding.transferOnly === true && holders > 0 && after > 0) deny("transfer-only", {
1687
+ if (rules.transferOnly === true && holders > 0 && after > 0) deny("transfer-only", {
1656
1688
  role,
1657
1689
  holders
1658
1690
  });
1659
1691
  }
1660
1692
  /**
1693
+ * The rules of a role change that need no subject: `assigns`, `for`,
1694
+ * `exclusiveWith`, `min`, `max` and `transferOnly`, from holder counts and
1695
+ * the target's roles alone. `decideRoleChange` runs the same function after
1696
+ * its actor, tenant and ceiling checks; a service that holds only the
1697
+ * catalog calls it with the `CatalogRole` entries.
1698
+ */
1699
+ function checkRoleChange(role, input) {
1700
+ const name = role.key;
1701
+ const denials = [];
1702
+ const deny = (reason, detail) => {
1703
+ denials.push(compact({
1704
+ role: name,
1705
+ reason,
1706
+ detail
1707
+ }));
1708
+ };
1709
+ const kind = input.change?.kind;
1710
+ const target = input.change?.target;
1711
+ if (kind !== "assign" && kind !== "revoke" && kind !== "transfer" || target === null || typeof target !== "object") {
1712
+ deny("validation");
1713
+ return freezeDeep({
1714
+ ok: false,
1715
+ denials
1716
+ });
1717
+ }
1718
+ const roles = input.roles ?? [];
1719
+ const targetRoles = isReadonlyArray(target.roles) ? target.roles : [];
1720
+ const already = targetRoles.includes(name);
1721
+ let by = null;
1722
+ if (kind !== "transfer" && input.actorRoles !== void 0 && roles.some((rules) => rules.assigns !== void 0)) {
1723
+ const held = input.actorRoles;
1724
+ by = held.find((actorRole) => roles.find((rules) => rules.key === actorRole)?.assigns?.includes(name) === true) ?? null;
1725
+ if (by === null) deny("not-assignable-by", { held });
1726
+ }
1727
+ if (kind !== "revoke" && !already) {
1728
+ const kinds = role.for;
1729
+ if (kinds !== void 0 && (target.via === void 0 || !kinds.includes(target.via))) deny("not-allowed-for-membership", {
1730
+ via: target.via ?? null,
1731
+ for: kinds
1732
+ });
1733
+ const conflicts = new Set(role.exclusiveWith ?? []);
1734
+ for (const rules of roles) if (rules.exclusiveWith?.includes(name) === true) conflicts.add(rules.key);
1735
+ const clash = targetRoles.filter((held) => conflicts.has(held));
1736
+ if (clash.length > 0) deny("conflicting-role", { with: clash });
1737
+ }
1738
+ const delta = kind === "assign" ? already ? 0 : 1 : kind === "revoke" ? targetRoles.length > 0 && !already ? 0 : -1 : already ? -1 : 0;
1739
+ countRules(role, input.holders, delta, deny);
1740
+ return freezeDeep(denials.length === 0 ? {
1741
+ ok: true,
1742
+ by
1743
+ } : {
1744
+ ok: false,
1745
+ denials
1746
+ });
1747
+ }
1748
+ /** A declared binding's rules, by the name `checkRoleChange` reads. */
1749
+ function rulesOf(binding) {
1750
+ return compact({
1751
+ key: binding.name,
1752
+ min: binding.min,
1753
+ max: binding.max,
1754
+ transferOnly: binding.transferOnly,
1755
+ assigns: binding.assigns,
1756
+ for: binding.for,
1757
+ exclusiveWith: binding.exclusiveWith
1758
+ });
1759
+ }
1760
+ /**
1661
1761
  * A live membership of the principal on the instance or on an instance under
1662
1762
  * it: the one in-band fact that ties a nested instance to a tenant.
1663
1763
  */
@@ -1736,10 +1836,10 @@ function decideRoleChangeWith(policy, principal, scopes, change, customRoles, au
1736
1836
  deny("unknown-role");
1737
1837
  return done(null);
1738
1838
  }
1739
- const scope = global ? "global" : resolveScope(scopes, change.scope);
1839
+ const scope = global ? "global" : resolveScope$1(scopes, change.scope);
1740
1840
  const customAt = named.map((role) => customRoleScope(role, scopes));
1741
1841
  const on = declared ? binding?.on ?? findRole(policy.vocabulary?.roles, name)?.on : customAt.includes(scope) ? scope : customAt[0];
1742
- const heldAt = typeof on === "string" ? resolveScope(scopes, on) : global ? "global" : void 0;
1842
+ const heldAt = typeof on === "string" ? resolveScope$1(scopes, on) : global ? "global" : void 0;
1743
1843
  if (scope === void 0 || heldAt === void 0 || heldAt !== scope) {
1744
1844
  deny("scope", { expected: heldAt ?? null });
1745
1845
  return done(null);
@@ -1749,7 +1849,7 @@ function decideRoleChangeWith(policy, principal, scopes, change, customRoles, au
1749
1849
  let custom;
1750
1850
  if (!global) {
1751
1851
  const root = scopes[0]?.name;
1752
- const supplied = change.within === void 0 ? void 0 : Object.entries(change.within).find(([key]) => resolveScope(scopes, key) === root)?.[1];
1852
+ const supplied = change.within === void 0 ? void 0 : Object.entries(change.within).find(([key]) => resolveScope$1(scopes, key) === root)?.[1];
1753
1853
  if (scope === root) tenant = id;
1754
1854
  else {
1755
1855
  const anchor = heldAnchor(principal, scopes, scope, id, now);
@@ -1767,7 +1867,7 @@ function decideRoleChangeWith(policy, principal, scopes, change, customRoles, au
1767
1867
  return done(null);
1768
1868
  }
1769
1869
  const found = tenant;
1770
- custom = named.find((role) => sameId(role.tenant, found) && customRoleScope(role, scopes) === scope && sameId(customRoleId(role) ?? id, id));
1870
+ custom = named.find((role) => customRoleOf(role, found) && customRoleScope(role, scopes) === scope && sameId(customRoleId(role) ?? id, id));
1771
1871
  }
1772
1872
  if (!declared && custom === void 0) {
1773
1873
  deny("unknown-role");
@@ -1778,9 +1878,8 @@ function decideRoleChangeWith(policy, principal, scopes, change, customRoles, au
1778
1878
  return done(null);
1779
1879
  }
1780
1880
  const self = target.id === principal.id;
1781
- const targetRoles = isReadonlyArray(target.roles) ? target.roles : [];
1782
- const already = targetRoles.includes(name);
1783
1881
  let by = null;
1882
+ let actorRoles;
1784
1883
  if (kind === "transfer") {
1785
1884
  if (self) deny("self-demotion");
1786
1885
  if (global ? (principal.roles ?? []).includes(name) : holdsAt(principal, name, scope, id, now)) by = name;
@@ -1790,24 +1889,26 @@ function decideRoleChangeWith(policy, principal, scopes, change, customRoles, au
1790
1889
  const allowed = authority(tenant);
1791
1890
  const revocable = kind === "revoke" && custom !== void 0 && allowed.inert?.has(name);
1792
1891
  if (!allowed.assignable.has(name) && revocable !== true) deny("not-assignable-by");
1793
- else if (custom === void 0 && usesAssigns(policy) && !allowed.manage) {
1794
- const held = global ? rankRoles(policy, (principal.roles ?? []).filter((role) => declaredRoleNames(policy).has(role))) : rolesAtInstance(policy, principal, scopes, scope, id, within, now);
1795
- by = held.find((role) => bindingOf(policy, role)?.assigns?.includes(name) === true) ?? null;
1796
- if (by === null) deny("not-assignable-by", { held });
1797
- }
1892
+ else if (custom === void 0 && usesAssigns(policy) && !allowed.manage) actorRoles = global ? rankRoles(policy, (principal.roles ?? []).filter((role) => declaredRoleNames(policy).has(role))) : rolesAtInstance(policy, principal, scopes, scope, id, within, now);
1798
1893
  }
1799
- if (kind !== "revoke" && !already) {
1800
- const kinds = custom === void 0 ? binding?.for : customForKinds(policy, custom);
1801
- if (kinds !== void 0 && (target.via === void 0 || !kinds.includes(target.via))) deny("not-allowed-for-membership", {
1802
- via: target.via ?? null,
1803
- for: kinds
1804
- });
1805
- const conflicts = custom === void 0 ? conflictsWith(policy, name) : new Set(includedRoles(custom).flatMap((include) => Array.from(conflictsWith(policy, include))));
1806
- const clash = targetRoles.filter((role) => conflicts.has(role));
1807
- if (clash.length > 0) deny("conflicting-role", { with: clash });
1808
- }
1809
- const delta = kind === "assign" ? already ? 0 : 1 : kind === "revoke" ? targetRoles.length > 0 && !already ? 0 : -1 : already ? -1 : 0;
1810
- countRules(binding, name, change.holders, delta, deny);
1894
+ const conflicts = custom === void 0 ? conflictsWith(policy, name) : new Set(includedRoles(custom).flatMap((include) => Array.from(conflictsWith(policy, include))));
1895
+ const checked = checkRoleChange(compact({
1896
+ ...binding === void 0 ? {} : rulesOf(binding),
1897
+ key: name,
1898
+ for: custom === void 0 ? binding?.for : customForKinds(policy, custom),
1899
+ exclusiveWith: [...conflicts],
1900
+ assigns: void 0
1901
+ }), compact({
1902
+ change: {
1903
+ kind,
1904
+ target
1905
+ },
1906
+ holders: change.holders,
1907
+ roles: actorRoles === void 0 ? void 0 : policy.roles.map(rulesOf),
1908
+ actorRoles
1909
+ }));
1910
+ if (checked.ok) by = actorRoles === void 0 ? by : checked.by;
1911
+ else denials.push(...checked.denials);
1811
1912
  return done(by);
1812
1913
  }
1813
1914
  //#endregion
@@ -1848,4 +1949,4 @@ function toCsvRow(event) {
1848
1949
  ].map(field).join(",");
1849
1950
  }
1850
1951
  //#endregion
1851
- export { memorySnapshotSource as A, validateApprovalPolicy as C, memoryEntitlementSource as D, memoryCustomRoleSource as E, memoryMembershipSource as O, memoryApprovalPolicySource as S, isOperationEffect as T, limits as _, readable as a, approvalPolicies as b, customRoleSource as c, defineApp as d, localSnapshotManifest as f, memoryRelationSource as g, signPolicyDocument as h, crud as i, sqlFunction as j, memorySettingsSource as k, mayAccess as l, simulateArazzo as m, toCsvRow as n, writable as o, arazzoFindings as p, decideRoleChange as r, snapshotFor as s, CSV_COLUMNS as t, shadowMode as u, memoryLimitStore as v, defineOperations as w, approvalPoliciesFor as x, stripeEntitlementSource as y };
1952
+ export { memoryCustomRoleSource as A, stripeEntitlementSource as C, validateApprovalPolicy as D, memoryApprovalPolicySource as E, sqlFunction as F, memoryMembershipSource as M, memorySettingsSource as N, defineOperations as O, memorySnapshotSource as P, memoryLimitStore as S, approvalPoliciesFor as T, arazzoFindings as _, normalizeMembership as a, memoryRelationSource as b, crud as c, snapshotFor as d, customRoleSource as f, localSnapshotManifest as g, defineApp as h, decideRoleChange as i, memoryEntitlementSource as j, isOperationEffect as k, readable as l, shadowMode as m, toCsvRow as n, normalizeMemberships as o, mayAccess as p, checkRoleChange as r, resolveScope as s, CSV_COLUMNS as t, writable as u, simulateArazzo as v, approvalPolicies as w, limits as x, signPolicyDocument as y };
@@ -1,4 +1,4 @@
1
- import { A as SsfSubject, C as SsfEventName, D as SsfReceiver, E as SsfPermDockOptions, M as SsfTransmitterConfiguration, N as SsfVerification, O as SsfStreamConfiguration, S as SsfEventListener, T as SsfPermDock, _ as SetSubject, a as PollHandle, b as SsfEventHandler, c as PushSetOptions, d as SetDelivery, f as SetDeliveryFailureCause, g as SetQueue, h as SetPollHandlerOptions, i as CaepReason, j as SsfSubjectResolver, k as SsfStreamStatus, l as ReplayStore, m as SetEvent, n as CaepEventName, o as PollOptions, p as SetError, r as CaepInitiatingEntity, s as PollResult, t as CaepCommon, u as RiscEventName, v as SignSetOptions, w as SsfOnEvent, x as SsfEventInput, y as SsfAuditEvent } from "../types-DiQjupG2.js";
2
- import { t as memoryReplayStore } from "../replay-D7iKcLFe.js";
3
- import { _ as setPollHandler, a as CaepTokenClaimsChange, c as RiscEvents, d as caepEvents, f as pushSet, g as memorySetQueue, h as streamVerificationEvent, i as CaepEvents, l as SSF_POLL_DELIVERY, m as signSet, n as CaepCredentialChange, o as RiscAccountDisabled, p as riscEvents, r as CaepDeviceComplianceChange, s as RiscCredentialCompromise, t as CaepAssuranceLevelChange, u as SSF_PUSH_DELIVERY, v as createPermDock } from "../index-D8EovfsP.js";
4
- export { type CaepAssuranceLevelChange, type CaepCommon, type CaepCredentialChange, type CaepDeviceComplianceChange, type CaepEventName, type CaepEvents, type CaepInitiatingEntity, type CaepReason, type CaepTokenClaimsChange, type PollHandle, type PollOptions, type PollResult, type PushSetOptions, type ReplayStore, type RiscAccountDisabled, type RiscCredentialCompromise, type RiscEventName, type RiscEvents, SSF_POLL_DELIVERY, SSF_PUSH_DELIVERY, type SetDelivery, type SetDeliveryFailureCause, type SetError, type SetEvent, type SetPollHandlerOptions, type SetQueue, type SetSubject, type SignSetOptions, type SsfAuditEvent, type SsfEventHandler, type SsfEventInput, type SsfEventListener, type SsfEventName, type SsfOnEvent, type SsfPermDock, type SsfPermDockOptions, type SsfReceiver, type SsfStreamConfiguration, type SsfStreamStatus, type SsfSubject, type SsfSubjectResolver, type SsfTransmitterConfiguration, type SsfVerification, caepEvents, createPermDock, memoryReplayStore, memorySetQueue, pushSet, riscEvents, setPollHandler, signSet, streamVerificationEvent };
1
+ import { A as SsfSubject, C as SsfEventName, D as SsfReceiver, E as SsfPermDockOptions, M as SsfTransmitterConfiguration, N as SsfVerification, O as SsfStreamConfiguration, S as SsfEventListener, T as SsfPermDock, _ as SetSubject, a as PollHandle, b as SsfEventHandler, c as PushSetOptions, d as SetDelivery, f as SetDeliveryFailureCause, g as SetQueue, h as SetPollHandlerOptions, i as CaepReason, j as SsfSubjectResolver, k as SsfStreamStatus, l as ReplayStore, m as SetEvent, n as CaepEventName, o as PollOptions, p as SetError, r as CaepInitiatingEntity, s as PollResult, t as CaepCommon, u as RiscEventName, v as SignSetOptions, w as SsfOnEvent, x as SsfEventInput, y as SsfAuditEvent } from "../types-cTos-H7p.js";
2
+ import { t as memoryReplayStore } from "../replay-DCDD_ZfL.js";
3
+ import { A as createPermDock, C as memorySsfStreamStore, D as PollSetsResult, E as PollSetsOptions, O as PolledSet, S as SsfStreamStore, T as setPollHandler, _ as SsfFanOut, a as CaepTokenClaimsChange, b as ssfTransmitter, c as RiscEvents, d as caepEvents, f as pushSet, g as FanOutSetOptions, h as streamVerificationEvent, i as CaepEvents, k as pollSets, l as SSF_POLL_DELIVERY, m as signSet, n as CaepCredentialChange, o as RiscAccountDisabled, p as riscEvents, r as CaepDeviceComplianceChange, s as RiscCredentialCompromise, t as CaepAssuranceLevelChange, u as SSF_PUSH_DELIVERY, v as SsfTransmitterOptions, w as memorySetQueue, x as SsfStream, y as fanOutSet } from "../index-CMiPH2Tv.js";
4
+ export { type CaepAssuranceLevelChange, type CaepCommon, type CaepCredentialChange, type CaepDeviceComplianceChange, type CaepEventName, type CaepEvents, type CaepInitiatingEntity, type CaepReason, type CaepTokenClaimsChange, type FanOutSetOptions, type PollHandle, type PollOptions, type PollResult, type PollSetsOptions, type PollSetsResult, type PolledSet, type PushSetOptions, type ReplayStore, type RiscAccountDisabled, type RiscCredentialCompromise, type RiscEventName, type RiscEvents, SSF_POLL_DELIVERY, SSF_PUSH_DELIVERY, type SetDelivery, type SetDeliveryFailureCause, type SetError, type SetEvent, type SetPollHandlerOptions, type SetQueue, type SetSubject, type SignSetOptions, type SsfAuditEvent, type SsfEventHandler, type SsfEventInput, type SsfEventListener, type SsfEventName, type SsfFanOut, type SsfOnEvent, type SsfPermDock, type SsfPermDockOptions, type SsfReceiver, type SsfStream, type SsfStreamConfiguration, type SsfStreamStatus, type SsfStreamStore, type SsfSubject, type SsfSubjectResolver, type SsfTransmitterConfiguration, type SsfTransmitterOptions, type SsfVerification, caepEvents, createPermDock, fanOutSet, memoryReplayStore, memorySetQueue, memorySsfStreamStore, pollSets, pushSet, riscEvents, setPollHandler, signSet, ssfTransmitter, streamVerificationEvent };