permdock 0.4.0 → 0.6.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 (515) hide show
  1. package/README.md +37 -35
  2. package/dist/{schema-Bol6gqXA.js → 2020-C9VN-x8c.js} +5 -130
  3. package/dist/a2a/index.d.ts +6 -6
  4. package/dist/a2a/index.js +14 -17
  5. package/dist/{adapter-context-mlWsVGGg.js → adapter-context-CRhqyzCk.js} +1 -1
  6. package/dist/adoption-scan-DCYe60Pi.js +107 -0
  7. package/dist/agent/index.d.ts +3 -0
  8. package/dist/agent/index.js +1 -0
  9. package/dist/ai-sdk/index.d.ts +18 -35
  10. package/dist/ai-sdk/index.js +37 -23
  11. package/dist/{app-data-CV8pqqMi.js → app-data-MuyzVqX8.js} +2 -1
  12. package/dist/approval-header-CJACtHkv.js +23 -0
  13. package/dist/approval-prompt-Dg5LeAcT.js +62 -0
  14. package/dist/approval-prompt-DvSSPQJX.d.ts +57 -0
  15. package/dist/approvals/index.d.ts +5 -3
  16. package/dist/approvals/index.js +8 -5
  17. package/dist/approvals-p1PGoVjb.js +995 -0
  18. package/dist/arazzo-41WuzHou.js +36 -0
  19. package/dist/{arazzo-C4BcskbX.js → arazzo-CaUVBn7D.js} +20 -14
  20. package/dist/args-IIolxxKA.js +197 -0
  21. package/dist/astro/index.d.ts +43 -0
  22. package/dist/astro/index.js +27 -0
  23. package/dist/audience-DabClFLQ.js +55 -0
  24. package/dist/auth-DRLEizbL.js +178 -0
  25. package/dist/authzen/index.d.ts +26 -6
  26. package/dist/authzen/index.js +94 -79
  27. package/dist/automation-BNM3TtDo.d.ts +114 -0
  28. package/dist/automation-DVjOckjV.js +157 -0
  29. package/dist/better-auth/index.d.ts +8 -6
  30. package/dist/better-auth/index.js +9 -8
  31. package/dist/better-supabase/index.d.ts +357 -30
  32. package/dist/better-supabase/index.js +936 -194
  33. package/dist/{bind-kk-uyCwH.js → bind-CAvgUuKs.js} +14 -10
  34. package/dist/{bind-BzqG8SMb.d.ts → bind-DOyrv6zi.d.ts} +12 -10
  35. package/dist/body-CH5of8Ne.js +10 -0
  36. package/dist/body-text-QcXok_SI.js +52 -0
  37. package/dist/{build-instance-DIIV9DbC.js → build-instance-Bu_eDqYw.js} +4 -3
  38. package/dist/{canonical-json-CFKyFOke.js → canonical-json-BC8_nMTw.js} +5 -3
  39. package/dist/{capability-CksyCWDH.d.ts → capability-Drg-1YhL.d.ts} +44 -25
  40. package/dist/{capability-txATtKV4.js → capability-N1K9IpqS.js} +68 -42
  41. package/dist/casbin-Cr7RLtA3.js +30 -0
  42. package/dist/casbin-Dyu2gnUD.js +234 -0
  43. package/dist/casl-64gpT-8x.js +24 -0
  44. package/dist/casl-DjEDhTCP.js +299 -0
  45. package/dist/catalog/index.d.ts +74 -2
  46. package/dist/catalog/index.js +51 -2
  47. package/dist/catalog-BoWglDPI.js +1 -0
  48. package/dist/catalog-DZVbrF-z.js +52 -0
  49. package/dist/{catalog-tZUyOfOv.js → catalog-HD2gf5mY.js} +51 -6
  50. package/dist/{catalog-doc-DWtg0gGR.js → catalog-doc-Cdn7-0pQ.js} +45 -23
  51. package/dist/catalog-fingerprint-CCP0-yQS.js +153 -0
  52. package/dist/chat/index.d.ts +2 -0
  53. package/dist/chat/index.js +224 -0
  54. package/dist/chat-sdk/index.d.ts +87 -0
  55. package/dist/chat-sdk/index.js +197 -0
  56. package/dist/claims-map-7oQ3ue4X.js +13 -0
  57. package/dist/claims-map-Ca-QX8C6.d.ts +32 -0
  58. package/dist/claude-agent/index.d.ts +7 -14
  59. package/dist/claude-agent/index.js +24 -27
  60. package/dist/clerk/index.d.ts +9 -8
  61. package/dist/clerk/index.js +9 -14
  62. package/dist/cli/bin.js +36 -17
  63. package/dist/cli/index.d.ts +19 -5
  64. package/dist/cli/index.js +164 -4
  65. package/dist/cloud/index.d.ts +102 -63
  66. package/dist/cloud/index.js +239 -340
  67. package/dist/cloud-ytQ3uviA.js +87 -0
  68. package/dist/codemod-5mpSpnUY.js +37 -0
  69. package/dist/codemod-ua2hHy7w.js +2084 -0
  70. package/dist/collect-Ci6akVwH.js +55 -0
  71. package/dist/collect-D7eQDffE.js +1 -0
  72. package/dist/{collect-2SrB7lfk.js → collect-mLTY4nwb.js} +75 -11
  73. package/dist/command-L8EstFNm.js +6 -0
  74. package/dist/compile/index.d.ts +1 -1
  75. package/dist/compile/index.js +1 -2
  76. package/dist/{compile-CtTP7eur.d.ts → compile-1bsAezL0.d.ts} +5 -3
  77. package/dist/{compile-CcEu2ZQ1.js → compile-CMqMx_IN.js} +11 -8
  78. package/dist/completion-BTFrHZhX.js +143 -0
  79. package/dist/config-Bj2Ixq3d.js +26 -0
  80. package/dist/{config-BIjREpyE.js → config-bs_kZeYq.js} +12 -7
  81. package/dist/{config-report--Xb9APJS.js → config-report-DSpsLpCE.js} +15 -5
  82. package/dist/{connection-DUsczpB5.js → connection-DjhIJSs2.js} +6 -5
  83. package/dist/{context-DieZVJXu.js → context-B_u3_bDJ.js} +2 -2
  84. package/dist/convex/index.d.ts +11 -10
  85. package/dist/convex/index.js +6 -4
  86. package/dist/create-B30OMUOJ.d.ts +107 -0
  87. package/dist/create-CBMmFie-.d.ts +138 -0
  88. package/dist/create-CGm28gyI.js +130 -0
  89. package/dist/create-CQWIpUG-.js +403 -0
  90. package/dist/{create-BBO24vj6.js → create-DCF2SvoT.js} +31 -32
  91. package/dist/create-D_NmPOdH.d.ts +110 -0
  92. package/dist/{credential-kue0qpbm.js → credential-BcoiejpY.js} +152 -31
  93. package/dist/credentials-DPyHmYz5.js +74 -0
  94. package/dist/delegation-j6-rc37o.js +286 -0
  95. package/dist/delivery/index.d.ts +5 -0
  96. package/dist/delivery/index.js +5 -0
  97. package/dist/delivery-DCAgNyCn.js +499 -0
  98. package/dist/delivery-event-xX4obB8F.js +40 -0
  99. package/dist/{denied-text-DfRk15uw.d.ts → denied-text-CiFQNuMV.d.ts} +5 -5
  100. package/dist/{describe-C3ldA9os.d.ts → describe-B5qgDvEW.d.ts} +2 -2
  101. package/dist/{describe-Cgkp7eP0.js → describe-BybMRY7A.js} +6 -2
  102. package/dist/device-BARQ8eYG.js +193 -0
  103. package/dist/{diff-rpqoe7Ag.js → diff-3jbx6Rm4.js} +60 -54
  104. package/dist/diff-CmuSD3vc.js +37 -0
  105. package/dist/doctor-3ZqNHX_G.js +44 -0
  106. package/dist/{doctor-owlv6ddh.js → doctor-BdZw53-k.js} +245 -50
  107. package/dist/drizzle/index.d.ts +5 -3
  108. package/dist/drizzle/index.js +2 -2
  109. package/dist/elysia/index.d.ts +16 -13
  110. package/dist/elysia/index.js +13 -12
  111. package/dist/env-DJZrPjRi.js +8 -0
  112. package/dist/errors-BDUwg2qC.js +27 -0
  113. package/dist/{errors-drnfxYtm.js → errors-BKy0EfhN.js} +5 -9
  114. package/dist/errors-BWXBMaKK.d.ts +11 -0
  115. package/dist/errors-CWTY6uih.js +143 -0
  116. package/dist/{errors-OD_4c__H.d.ts → errors-DH5QEGXh.d.ts} +2 -2
  117. package/dist/evaluate-CNClBvcj.js +1785 -0
  118. package/dist/evaluations-C_1vdSZc.d.ts +32 -0
  119. package/dist/{evaluations-C9YJsv3H.js → evaluations-beAooV0n.js} +145 -34
  120. package/dist/eve/index.d.ts +12 -16
  121. package/dist/eve/index.js +22 -28
  122. package/dist/event-time-CsegxXxB.js +23 -0
  123. package/dist/expiry-D4_YKRKD.js +52 -0
  124. package/dist/express/index.d.ts +13 -10
  125. package/dist/express/index.js +12 -11
  126. package/dist/fastify/index.d.ts +25 -22
  127. package/dist/fastify/index.js +13 -12
  128. package/dist/fetch-adapter-DD_gfmrC.js +120 -0
  129. package/dist/fetch-adapter-Dw0MTS3D.d.ts +31 -0
  130. package/dist/fields-OYG_JR78.js +203 -0
  131. package/dist/files-C5ZI27eV.js +124 -0
  132. package/dist/{fixtures-h2eG2OZV.js → fixtures-B7XrLeY7.js} +8 -7
  133. package/dist/flags-C3DktBDY.js +86 -0
  134. package/dist/{from-snapshot-7REQZe0H.js → from-snapshot-CTCMsFZk.js} +55 -52
  135. package/dist/{grantee-conditions-MQs5NIuX.js → grantee-conditions-CcXf8hMM.js} +4 -3
  136. package/dist/{grantee-CXY-0C87.js → grantee-hxrUsbpM.js} +16 -6
  137. package/dist/{grantee-match-fxYp9Nmt.js → grantee-match-DbENBHLB.js} +5 -4
  138. package/dist/h3/index.d.ts +37 -0
  139. package/dist/h3/index.js +35 -0
  140. package/dist/headers-BIjfMaoC.js +8 -0
  141. package/dist/headers-CIbDTUTK.d.ts +7 -0
  142. package/dist/{helpers-C9YmyBIa.js → helpers-CBYVMjwh.js} +45 -38
  143. package/dist/hono/index.d.ts +12 -9
  144. package/dist/hono/index.js +13 -12
  145. package/dist/hosted-B46-5LYE.js +315 -0
  146. package/dist/hosted-BPk51-kX.d.ts +78 -0
  147. package/dist/{http-DPuDaChb.d.ts → http-B_LphE5Y.d.ts} +1 -2
  148. package/dist/http-DXJ37RDA.js +46 -0
  149. package/dist/{http-BEbdMZ05.js → http-ujKm0JXE.js} +1 -2
  150. package/dist/{import-UHk1N7vH.js → import-CNV7I2Dw.js} +25 -20
  151. package/dist/{import-BFIlhetD.js → import-wyqXUyjm.js} +190 -53
  152. package/dist/index-B8YjkEZ4.d.ts +210 -0
  153. package/dist/index-C-6Letxg.d.ts +431 -0
  154. package/dist/index-CaxrMD1A.d.ts +1 -0
  155. package/dist/{index-BwMe94Xq.d.ts → index-Ch8LpNDp.d.ts} +34 -16
  156. package/dist/index-Cp_ilKi1.d.ts +91 -0
  157. package/dist/index-CueFnxQc.d.ts +110 -0
  158. package/dist/index-DuWxc5dt.d.ts +909 -0
  159. package/dist/index.d.ts +19 -15
  160. package/dist/index.js +31 -21
  161. package/dist/init-DeMYsnYJ.js +96 -0
  162. package/dist/init-GG6Jh8HD.js +95 -0
  163. package/dist/{instance-options-plkrsAog.d.ts → instance-options-BsVpyGIk.d.ts} +2 -2
  164. package/dist/instance-snapshot-BOEhcqIF.js +601 -0
  165. package/dist/instant-BluqDvyS.js +19 -0
  166. package/dist/internals-Dk8A8fX3.js +17 -0
  167. package/dist/{json-schema-DBkdUuCO.js → json-schema-B-vAwlde.js} +45 -6
  168. package/dist/json-schema-CN_iLFH2.d.ts +40 -0
  169. package/dist/jwt/index.d.ts +18 -11
  170. package/dist/jwt/index.js +156 -135
  171. package/dist/{kernel-CB3LrIJM.js → kernel-D0NVb1cK.js} +52 -24
  172. package/dist/kysely/index.d.ts +5 -3
  173. package/dist/kysely/index.js +2 -2
  174. package/dist/load-BxEtwlBS.js +1 -0
  175. package/dist/{load-C3_oTHyO.js → load-DFS_ry0W.js} +22 -6
  176. package/dist/{load-jose-BL6LH4bL.js → load-jose-DZ4dnjri.js} +1 -4
  177. package/dist/login-Dfe5RlYk.js +68 -0
  178. package/dist/login-imhuwvn3.js +254 -0
  179. package/dist/manifest-C8IzW3Do.js +42 -0
  180. package/dist/manifest-dvL2XEe1.js +370 -0
  181. package/dist/manifest-json-CAGzls-C.js +9 -0
  182. package/dist/{manifest-uDS9y5de.d.ts → manifest-mx5ghSFM.d.ts} +9 -2
  183. package/dist/manifest-schema-C0kK_8V0.js +399 -0
  184. package/dist/{map-claims-AVlBaJoa.js → map-claims-D3oRmTk0.js} +13 -10
  185. package/dist/{map-error-BE27PYkE.js → map-error-Dr70oA_3.js} +3 -3
  186. package/dist/{markers-CiwAOZtO.js → markers-C6joDI3o.js} +2 -1
  187. package/dist/mcp/index.d.ts +22 -12
  188. package/dist/mcp/index.js +57 -39
  189. package/dist/{migrate-BwlB5-Wk.js → migrate-CIq4-E9F.js} +53 -14
  190. package/dist/nest/index.d.ts +12 -9
  191. package/dist/nest/index.js +15 -14
  192. package/dist/next/index.d.ts +18 -21
  193. package/dist/next/index.js +13 -11
  194. package/dist/next/plugin.d.ts +1 -1
  195. package/dist/next/plugin.js +2 -2
  196. package/dist/node/index.d.ts +10 -10
  197. package/dist/node/index.js +7 -9
  198. package/dist/{ocsf-uYFXGVw2.js → ocsf-BFp-PZZA.js} +22 -11
  199. package/dist/openai/index.d.ts +9 -16
  200. package/dist/openai/index.js +17 -24
  201. package/dist/openapi/index.d.ts +3 -3
  202. package/dist/openapi/index.js +1 -1
  203. package/dist/{openapi-DBzHQbov.js → openapi-B7HZ0f-r.js} +8 -8
  204. package/dist/openapi-C4dDTVEd.js +138 -0
  205. package/dist/{openapi-BJdBmYDG.js → openapi-DD1SV-5-.js} +10 -9
  206. package/dist/operation-findings-DgATDpvh.js +36 -0
  207. package/dist/operations-X0VM7F3m.d.ts +59 -0
  208. package/dist/orpc/index.d.ts +13 -10
  209. package/dist/orpc/index.js +20 -15
  210. package/dist/otel/index.d.ts +3 -2
  211. package/dist/otel/index.js +30 -7
  212. package/dist/output-1im__-08.js +88 -0
  213. package/dist/output-files-B3IZJksC.js +1 -0
  214. package/dist/{output-files-CgIsvdSa.js → output-files-DhRBBE4n.js} +24 -26
  215. package/dist/{permission-keys-B26jeyUv.js → ownership-DqaJNJPn.js} +1045 -153
  216. package/dist/{package-root-DtNnpmUd.js → package-root-Dk_ETdkp.js} +1 -1
  217. package/dist/{parse-CVFQHk6c.js → parse-Cxq0WxrA.js} +2 -2
  218. package/dist/{parse-local-manifest-DvYUR0QL.d.ts → parse-local-manifest-5ODwqu8b.d.ts} +1 -1
  219. package/dist/{parse-local-manifest-C-q02Pal.js → parse-local-manifest-CVSs6J9I.js} +1 -1
  220. package/dist/parse-request-D_tUXG6M.js +26 -0
  221. package/dist/paths-DXSHAMIa.js +42 -0
  222. package/dist/pdp/index.d.ts +7 -3
  223. package/dist/pdp/index.js +45 -26
  224. package/dist/{peer-BOr_kJE1.js → peer-C8swJ2GH.js} +23 -4
  225. package/dist/peer-CRvC7Hg1.js +1 -0
  226. package/dist/permdock-BrAscV28.js +868 -0
  227. package/dist/permdock-SV8ZINYT.d.ts +502 -0
  228. package/dist/{permission-registry-BsblpB-z.js → permission-registry-Br4jSNVi.js} +3 -3
  229. package/dist/permissions-B-wCP5ZC.js +30 -0
  230. package/dist/{permissions-CCJ6lmxB.js → permissions-BPxlwVhN.js} +4 -3
  231. package/dist/{permissions-COH-KRgT.d.ts → permissions-u_KHg-sN.d.ts} +1 -2
  232. package/dist/policies-DP2nqRoF.js +295 -0
  233. package/dist/{policy-ur0BBK_e.d.ts → policy-77FSAq_V.d.ts} +2 -2
  234. package/dist/{hosted-CBHgkzDl.js → policy-DbM5YYtV.js} +17 -273
  235. package/dist/policy-from-catalog-C2gMa2Dj.js +450 -0
  236. package/dist/policy-module-CTlwMvLI.js +89 -0
  237. package/dist/{policy-types-sp9P1iIV.d.ts → policy-types-n0uRTsW8.d.ts} +460 -632
  238. package/dist/postgrest-CEgRbefE.d.ts +100 -0
  239. package/dist/postgrest-DAjUkF9w.js +575 -0
  240. package/dist/{powersync-cZe4kzhL.js → powersync-BkWWCS1K.js} +23 -24
  241. package/dist/powersync-DISt6SUe.js +62 -0
  242. package/dist/powersync-MMJ2mI2q.js +1 -0
  243. package/dist/preset/index.d.ts +146 -0
  244. package/dist/preset/index.js +1 -0
  245. package/dist/preset-DZdU0tne.js +1768 -0
  246. package/dist/principal-source-pHneukrx.js +103 -0
  247. package/dist/prisma/index.d.ts +6 -3
  248. package/dist/prisma/index.js +2 -2
  249. package/dist/{problem-CnWraVhC.js → problem-CTviyH5L.js} +13 -23
  250. package/dist/{problem-details-rIIo8B2C.d.ts → problem-details-B45V5d2b.d.ts} +1 -1
  251. package/dist/{problem-details-DECUnXAn.js → problem-details-cn5X30gZ.js} +43 -40
  252. package/dist/problem-types-CJ2325SZ.js +5 -0
  253. package/dist/{prompt-CXYhLfsS.js → prompt-DfZLJLIn.js} +2 -2
  254. package/dist/{protected-BN7BUdY1.js → protected-BlF0F6wL.js} +21 -4
  255. package/dist/{protected-B3_P7xuw.d.ts → protected-RFGpakN9.d.ts} +16 -8
  256. package/dist/{provider-Bi-0HNL3.js → provider-B1al-AZz.js} +2 -2
  257. package/dist/{provider-kwHC9CZD.d.ts → provider-DILL9oPK.d.ts} +1 -1
  258. package/dist/{provider-store-Ctt-81Ni.js → provider-store-DM6DNcta.js} +2 -2
  259. package/dist/pull-CvpINcMK.js +1 -0
  260. package/dist/pull-jEwbf80J.js +256 -0
  261. package/dist/push-BD4f15co.js +116 -0
  262. package/dist/pushed-policy-CqtxkV4G.js +238 -0
  263. package/dist/pushed-policy-DCW91KQU.d.ts +57 -0
  264. package/dist/react/index.d.ts +8 -8
  265. package/dist/react/index.js +6 -6
  266. package/dist/react/provider-client.d.ts +1 -1
  267. package/dist/react/provider-client.js +1 -2
  268. package/dist/react-native/index.d.ts +24 -72
  269. package/dist/react-native/index.js +29 -25
  270. package/dist/{refs-f3imMjNW.js → refs-K6eWUJ0H.js} +1 -1
  271. package/dist/{relation-walk-BXnlLtg2.js → relation-walk-3OyDBF0S.js} +2 -2
  272. package/dist/{relations-CvmSpG67.js → relations-BnCWnJGI.js} +3 -3
  273. package/dist/renames-CGj7YwcQ.js +175 -0
  274. package/dist/{replay-COpmZUfx.d.ts → replay-Bkm-Ne4l.d.ts} +1 -1
  275. package/dist/{replay-BsOyTrdV.js → replay-Du1tJjG7.js} +2 -1
  276. package/dist/{request-context-BVM7aWNs.js → request-context-C81Pip9n.js} +3 -3
  277. package/dist/request-schema-CMreVuFM.js +148 -0
  278. package/dist/resend/index.d.ts +126 -0
  279. package/dist/resend/index.js +379 -0
  280. package/dist/{resource-relations-D1Un3pcz.js → resource-relations-D_jw0BFx.js} +1 -1
  281. package/dist/{retire-BFcxL6un.js → retire-CALjIQ7e.js} +2 -2
  282. package/dist/{revocations-Cy06JNx2.d.ts → revocations-R07lFBnX.d.ts} +2 -0
  283. package/dist/rls-BAqP4q66.js +336 -0
  284. package/dist/{rls-BEktUaqg.js → rls-DTvYd-lI.js} +288 -690
  285. package/dist/{role-builder-B4GbKM-i.js → role-builder-uWQZ4v84.js} +14 -207
  286. package/dist/{rpc-nYC3cR_u.js → rpc-VSl5ylaQ.js} +7 -7
  287. package/dist/run-CUKuz0A8.js +723 -0
  288. package/dist/run-DDwUaJDU.js +1 -0
  289. package/dist/run-ticket-DocwaTKn.d.ts +124 -0
  290. package/dist/run-ticket-sxFI6LAk.js +337 -0
  291. package/dist/{runtime-D_tMXnsq.js → runtime-D3VTAiCA.js} +1 -1
  292. package/dist/{saas-DtaA4JuW.js → saas-BCXRuXca.js} +16 -14
  293. package/dist/scan-qvOe0hS3.js +29 -0
  294. package/dist/{schema-DjQBcAP9.js → schema-B4v0Qrac.js} +102 -8
  295. package/dist/schema-yLuBWWsh.js +130 -0
  296. package/dist/scim/index.d.ts +2 -2
  297. package/dist/scim/index.js +1 -2
  298. package/dist/{scim-vFR1O5oG.js → scim-ClHtpyV3.js} +208 -76
  299. package/dist/{scopes-tvpa34ep.js → scopes-CUPSjo9q.js} +12 -7
  300. package/dist/server/index.d.ts +12 -143
  301. package/dist/server/index.js +12 -9
  302. package/dist/server-C3WXAHZj.js +453 -0
  303. package/dist/{server-types-DdqBwZN_.d.ts → server-types-CKQiCnON.d.ts} +51 -68
  304. package/dist/{sha256-BO0swRXL.js → sha256-D9ihqmvd.js} +8 -1
  305. package/dist/{shared-1uhI-e-b.js → shared-BAK8t4Uo.js} +20 -9
  306. package/dist/{shared-JhMeOsDF.js → shared-DvvFzYXe.js} +8 -9
  307. package/dist/signals-D3NcTKUS.js +32 -0
  308. package/dist/sink-4-eQIRWf.d.ts +225 -0
  309. package/dist/sink-BEZSlMS_.js +957 -0
  310. package/dist/{skills-BZdRQkxs.js → skills-B6lVdD_W.js} +13 -6
  311. package/dist/skills-CTYwkl44.js +51 -0
  312. package/dist/snapshot-B7DkYg6g.js +269 -0
  313. package/dist/{snapshot-cache-Cod40D-X.js → snapshot-cache-DZHQ0KF6.js} +11 -5
  314. package/dist/{snapshot-cache-J5T7t_vD.d.ts → snapshot-cache-PXI-vGpY.d.ts} +7 -5
  315. package/dist/solid/index.d.ts +11 -12
  316. package/dist/solid/index.js +7 -7
  317. package/dist/solid-start/index.d.ts +52 -0
  318. package/dist/solid-start/index.js +49 -0
  319. package/dist/{sources-Dljy06zL.d.ts → sources-Xc4zkszI.d.ts} +7 -13
  320. package/dist/{sources-B1-b-R0t.js → sources-vs5dGOsS.js} +125 -119
  321. package/dist/{sql-t8teWOfo.js → sql-B5T1IL83.js} +13 -1
  322. package/dist/src-Cu2m75uo.js +1860 -0
  323. package/dist/ssf/index.d.ts +4 -4
  324. package/dist/ssf/index.js +384 -47
  325. package/dist/standard-webhooks-DgFFD-Ga.js +228 -0
  326. package/dist/standard-webhooks-rbD7LS6h.d.ts +88 -0
  327. package/dist/storage-C2bWdvJH.js +132 -0
  328. package/dist/{store-ILkLUj_o.js → store-BDutJkDL.js} +40 -53
  329. package/dist/{store-options-CbUHDoSe.js → store-options-u0ycEe8s.js} +26 -21
  330. package/dist/{stores-Cxz_80g-.d.ts → stores-BUGNbJTt.d.ts} +7 -8
  331. package/dist/{stores-BHXdSbw9.js → stores-CGhM8BN_.js} +2 -2
  332. package/dist/{stream-Dwsg6WwE.d.ts → stream-CeCMJmBB.d.ts} +2 -2
  333. package/dist/{stream-BMui98KK.js → stream-CvdUS9V1.js} +9 -2
  334. package/dist/style-DiKWnAvn.js +1 -0
  335. package/dist/{style-CTm1AXDT.js → style-Uao76wO7.js} +3 -2
  336. package/dist/subject-BGoM5o8B.js +17 -0
  337. package/dist/supabase/index.d.ts +23 -106
  338. package/dist/supabase/index.js +5 -4
  339. package/dist/supabase/middleware.d.ts +7 -6
  340. package/dist/supabase/middleware.js +13 -11
  341. package/dist/supabase-By_frk3U.js +92 -0
  342. package/dist/{supabase-hook-Cva3ikXz.js → supabase-hook-BMoEhZir.js} +960 -64
  343. package/dist/supabase-hook-CCw5m35C.js +1 -0
  344. package/dist/{supabase-C1TWlnYt.js → supabase-x5JtR2tc.js} +99 -206
  345. package/dist/support-session-C6xJQYut.js +158 -0
  346. package/dist/svelte/Protected.svelte +4 -4
  347. package/dist/svelte/index.d.ts +7 -7
  348. package/dist/svelte/index.js +10 -10
  349. package/dist/svelte/runtime.d.ts +3 -3
  350. package/dist/svelte/runtime.js +3 -3
  351. package/dist/svelte/source.d.ts +7 -7
  352. package/dist/svelte/source.js +4 -4
  353. package/dist/sveltekit/index.d.ts +51 -0
  354. package/dist/sveltekit/index.js +27 -0
  355. package/dist/tanstack-start/index.d.ts +51 -0
  356. package/dist/tanstack-start/index.js +40 -0
  357. package/dist/target-Bw37TFNA.js +51 -0
  358. package/dist/{tenancy-DshjqY0n.js → tenancy-DN2QAx9z.js} +5 -5
  359. package/dist/terminal/index.d.ts +11 -9
  360. package/dist/terminal/index.js +23 -287
  361. package/dist/testing/index.d.ts +311 -38
  362. package/dist/testing/index.js +3475 -201
  363. package/dist/testing/saas/index.d.ts +9 -8
  364. package/dist/testing/saas/index.js +2 -2
  365. package/dist/testing/saas/permissions.d.ts +1 -1
  366. package/dist/testing/saas/permissions.js +1 -2
  367. package/dist/text-BMFRfBqc.js +8 -0
  368. package/dist/{text-diff-BdkkYSbi.js → text-diff-BQcUapOb.js} +1 -1
  369. package/dist/thenable-yD7SabqG.js +31 -0
  370. package/dist/time-DkWjdL98.js +71 -0
  371. package/dist/{token-Bx9qy30p.js → token-BLZcjQgt.js} +15 -6
  372. package/dist/{tool-refusal-CQ7OEia9.js → tool-refusal-CMLN5xhn.js} +2 -2
  373. package/dist/trpc/index.d.ts +12 -9
  374. package/dist/trpc/index.js +16 -14
  375. package/dist/types-8RnwUAvE.d.ts +107 -0
  376. package/dist/{store-9KO4BlkB.d.ts → types-B3_ooZgZ.d.ts} +100 -75
  377. package/dist/{types-Br9IXUBG.d.ts → types-BdtSDbBO.d.ts} +77 -17
  378. package/dist/types-BtHtcKMr.d.ts +157 -0
  379. package/dist/{types-CqrjB9o6.d.ts → types-BzzaHxt3.d.ts} +23 -11
  380. package/dist/types-C791HFu9.d.ts +332 -0
  381. package/dist/types-C863OQiR.d.ts +57 -0
  382. package/dist/{types-ByUo56un.d.ts → types-CVZSNocA.d.ts} +23 -22
  383. package/dist/{types-DHrmBJLH.d.ts → types-CX7AvRqP.d.ts} +7 -7
  384. package/dist/types-C_IiEs64.d.ts +65 -0
  385. package/dist/{types-7rJVLWe5.d.ts → types-Dfv0aTER.d.ts} +63 -11
  386. package/dist/types-DqzsnlSA.js +67 -0
  387. package/dist/{types-DpWfQdSh.d.ts → types-Druu9wLM.d.ts} +46 -11
  388. package/dist/{types-CIlTojhq.d.ts → types-_WhUP7ud.d.ts} +9 -6
  389. package/dist/{types-CUcFZfpU.d.ts → types-lUlG3TVd.d.ts} +2 -1
  390. package/dist/unplugin/index.d.ts +1 -1
  391. package/dist/unplugin/index.js +2 -2
  392. package/dist/usage-CRVl9V3t.js +32 -0
  393. package/dist/usage-CZpSQP6L.js +1 -0
  394. package/dist/{usage-CG9nOYZw.js → usage-SveTRTyr.js} +54 -11
  395. package/dist/{validation-error-BSSw0l_8.d.ts → validation-error-DHUrAkku.d.ts} +1 -1
  396. package/dist/{validity-dVrUEPJt.js → validity-CZ7-y0Cj.js} +32 -15
  397. package/dist/{verifier-DMr_Zmb_.js → verifier-DHuh-okk.js} +18 -7
  398. package/dist/{verify-BztUB3GX.js → verify-BaAKx7t6.js} +645 -50
  399. package/dist/{version-BEogC-rB.js → version-CEbQ5UeM.js} +4 -3
  400. package/dist/version-DXkYUISx.js +1 -0
  401. package/dist/{views-CJsrBS1f.js → views-DTIIO-oQ.js} +22 -5
  402. package/dist/{permission-types-Dg39z9Kv.d.ts → vocabulary-CN8H_9UF.d.ts} +67 -2
  403. package/dist/vue/index.d.ts +9 -10
  404. package/dist/vue/index.js +8 -8
  405. package/dist/waiter-B986w1oK.d.ts +36 -0
  406. package/dist/waiter-BGUtGYoU.js +67 -0
  407. package/dist/watch--ovlPOc0.js +1 -0
  408. package/dist/{watch-zeucB7eF.js → watch-vea54PRw.js} +44 -5
  409. package/dist/webmcp/index.d.ts +2 -2
  410. package/dist/webmcp/index.js +3 -3
  411. package/dist/where-scope-C9vfEphl.js +306 -0
  412. package/dist/who-can-DWBAcaCQ.js +364 -0
  413. package/dist/wire-delegation-Cv3W2eaM.js +36 -0
  414. package/dist/wire-denial-C7PaVYEM.js +27 -0
  415. package/dist/workflow/index.d.ts +5 -0
  416. package/dist/workflow/index.js +223 -0
  417. package/dist/workflow-sdk/index.d.ts +56 -0
  418. package/dist/workflow-sdk/index.js +78 -0
  419. package/dist/{wrap-Cr93qqdP.d.ts → wrap-C5jC6sKI.d.ts} +2 -1
  420. package/dist/{wrap-DWsU_5Bd.js → wrap-gX61EtpB.js} +7 -6
  421. package/package.json +136 -37
  422. package/schemas/access-event-v1.json +118 -0
  423. package/schemas/approval-request-v1.json +34 -1
  424. package/schemas/approval-signature-v1.json +94 -0
  425. package/schemas/automation-event-v1.json +113 -0
  426. package/schemas/capability-v1.json +84 -0
  427. package/schemas/catalog-event-v1.json +87 -0
  428. package/schemas/catalog-v1.json +123 -12
  429. package/schemas/cli-commands-v1.json +164 -0
  430. package/schemas/cli-result-v1.json +96 -0
  431. package/schemas/cloud-api-v1.json +5407 -0
  432. package/schemas/connector-v1.json +408 -0
  433. package/schemas/credential-event-v1.json +81 -0
  434. package/schemas/credential-v1.json +134 -0
  435. package/schemas/decision-event-v1.json +288 -0
  436. package/schemas/delivery-event-v1.json +117 -0
  437. package/schemas/directory-event-v1.json +85 -0
  438. package/schemas/evidence-export-v1.json +54 -0
  439. package/schemas/membership-event-v1.json +93 -0
  440. package/schemas/policy-v1.json +68 -0
  441. package/schemas/pushed-policy-v1.json +236 -0
  442. package/schemas/run-v1.json +162 -0
  443. package/schemas/snapshot-v1.json +138 -0
  444. package/schemas/supabase-claims-v1.json +4 -4
  445. package/schemas/supabase-manifest-v1.json +5 -1
  446. package/schemas/support-session-v1.json +111 -0
  447. package/skills/permdock/SKILL.md +16 -12
  448. package/skills/permdock-agents/SKILL.md +40 -23
  449. package/skills/permdock-agents/references/operations-automations-chat.md +221 -0
  450. package/skills/permdock-agents/references/runtimes.md +22 -18
  451. package/skills/permdock-approvals/SKILL.md +29 -13
  452. package/skills/permdock-approvals/references/delivery-and-waiters.md +172 -0
  453. package/skills/permdock-approvals/references/stores-and-resume.md +21 -7
  454. package/skills/permdock-audit/SKILL.md +3 -3
  455. package/skills/permdock-credentials/SKILL.md +5 -5
  456. package/skills/permdock-credentials/references/tokens-keys-links.md +14 -10
  457. package/skills/permdock-data/SKILL.md +6 -6
  458. package/skills/permdock-data/references/queries-and-rls.md +10 -9
  459. package/skills/permdock-data/references/relationships.md +3 -3
  460. package/skills/permdock-tenancy/SKILL.md +20 -7
  461. package/skills/permdock-tenancy/references/contacts-and-support-sessions.md +122 -0
  462. package/skills/permdock-tenancy/references/ownership-and-custom-roles.md +6 -4
  463. package/skills/permdock-wire/SKILL.md +17 -11
  464. package/skills/permdock-wire/references/adapters.md +139 -51
  465. package/skills/permdock-wire/references/policy-options.md +5 -5
  466. package/skills/permdock-wire/references/presets-and-recipes.md +58 -0
  467. package/dist/approvals-DZL76lKW.js +0 -240
  468. package/dist/arazzo-CD8d0WLb.js +0 -54
  469. package/dist/catalog-6yWAX6Ps.js +0 -2
  470. package/dist/catalog-WHG4kBq7.js +0 -48
  471. package/dist/cloud-C7bSDgX4.js +0 -50
  472. package/dist/cloud-PeBN3IEn.js +0 -118
  473. package/dist/collect-Bw2Jdq1q.js +0 -2
  474. package/dist/collect-CQx4hX4N.js +0 -83
  475. package/dist/commands-Cpip4ULx.js +0 -97
  476. package/dist/config-DLt6BvV7.js +0 -36
  477. package/dist/diff-Cnghh_Ip.js +0 -48
  478. package/dist/doctor-CuVJvhV_.js +0 -53
  479. package/dist/duration-xK2jGFVc.js +0 -25
  480. package/dist/errors-CWfoNg9N.js +0 -47
  481. package/dist/errors-DRnGZHzF.js +0 -30
  482. package/dist/expiry-BoBJ8Tvc.js +0 -7
  483. package/dist/fields-fwfXN01n.js +0 -1016
  484. package/dist/headers-BZSDieNT.js +0 -6
  485. package/dist/headers-Cf-zWvsO.d.ts +0 -6
  486. package/dist/ids-DC4V4CFu.js +0 -18
  487. package/dist/index-DgM7w96K.d.ts +0 -6
  488. package/dist/index-Dz7didpC.d.ts +0 -201
  489. package/dist/index-UdVQgq48.d.ts +0 -550
  490. package/dist/load-B_shHrmd.js +0 -2
  491. package/dist/manifest-BngWKryL.js +0 -770
  492. package/dist/may-use-BOn_dR_w.js +0 -78
  493. package/dist/openapi-DcQ1Kg40.js +0 -164
  494. package/dist/ownership-BgnbOJFT.js +0 -851
  495. package/dist/permdock-L26udHSk.js +0 -3646
  496. package/dist/powersync-BFSbSElQ.js +0 -62
  497. package/dist/powersync-DCDgZgfZ.js +0 -2
  498. package/dist/rls-55DQTuf5.js +0 -250
  499. package/dist/run-DMcNW_8T.js +0 -174
  500. package/dist/server-ZYEHtNHS.js +0 -268
  501. package/dist/sink-BTtmfPnE.js +0 -141
  502. package/dist/sink-CPN4zLfs.d.ts +0 -104
  503. package/dist/skills-Dle4ZoLF.js +0 -56
  504. package/dist/snapshot-Dc9CHPME.js +0 -1078
  505. package/dist/src-Bb7no-hS.js +0 -639
  506. package/dist/subject-C6dLxqHU.js +0 -24
  507. package/dist/supabase-Dbqr141s.js +0 -83
  508. package/dist/supabase-hook-BULg7Ut_.js +0 -2
  509. package/dist/thenable-QSmvt-vZ.js +0 -65
  510. package/dist/types-C0dee0Qf.d.ts +0 -197
  511. package/dist/types-DvupZE0w.d.ts +0 -9
  512. package/dist/usage-4G6t643F.js +0 -42
  513. package/dist/usage-iFLJ0-rr.js +0 -2
  514. package/dist/vocabulary-hhEFLFoL.d.ts +0 -65
  515. package/dist/watch-C8TpsAl4.js +0 -2
@@ -0,0 +1,601 @@
1
+ import { t as compact } from "./compact-CAf557ZB.js";
2
+ import { n as freezeDeep } from "./freeze-CrU8nQeX.js";
3
+ import { a as hasConditionOp } from "./refs-K6eWUJ0H.js";
4
+ import { o as sameId } from "./expiry-D4_YKRKD.js";
5
+ import { a as getResource, c as listPermissions } from "./permission-registry-Br4jSNVi.js";
6
+ import { n as isThenable } from "./thenable-yD7SabqG.js";
7
+ import { u as isPrincipalRelation } from "./resource-relations-D_jw0BFx.js";
8
+ import { p as nowSeconds, s as instantAt } from "./time-DkWjdL98.js";
9
+ import { t as canonicalJson } from "./canonical-json-BC8_nMTw.js";
10
+ import { c as rootScope, d as scopeList, i as keepsPermission, m as tenantOf, o as resolveScope } from "./scopes-CUPSjo9q.js";
11
+ import { a as readOnlyActorRefuses, i as delegatedPermissions, r as coversRequirements } from "./delegation-j6-rc37o.js";
12
+ import { b as synthesiseRole, m as findRole, o as flattenGrantee, v as listRoles, x as treeXSchema, y as sourceRoleMeta } from "./grantee-hxrUsbpM.js";
13
+ import { c as nowSeconds$1, d as resolveActiveTenant, l as partitionsOf, p as scopeField, r as isMembershipExpired } from "./tenancy-DN2QAx9z.js";
14
+ import { a as levelCondition, o as levelNames, r as grantList, t as declaredRoleNames } from "./policy-DbM5YYtV.js";
15
+ import { t as byCodePoint } from "./compare-pfyVnBjE.js";
16
+ import { A as contactMayUse, S as tenantCustomRoles, T as emptyListeners, _ as isSharedCustomRole, a as expandRoleNames, b as resolveCustomRole, g as holdsGlobalCustomRole, h as holdsCustomRole, l as ceilingGrants, m as customRoleScope, n as requirementCondition, p as customRoleOf, t as evaluate, u as customGrantsFor, x as roleAllowKeys } from "./evaluate-CNClBvcj.js";
17
+ import { n as matchGrantee, t as combineWhere } from "./grantee-match-DbENBHLB.js";
18
+ import { t as buildSnapshot } from "./snapshot-B7DkYg6g.js";
19
+ //#region src/core/memberships.ts
20
+ /** Two memberships are the same row when everything but `roles` matches. */
21
+ function identity(membership) {
22
+ const within = Object.entries(membership.within ?? {}).toSorted(([a], [b]) => byCodePoint(a, b));
23
+ return JSON.stringify([
24
+ membership.scope ?? null,
25
+ membership.id ?? null,
26
+ within,
27
+ membership.on ?? null,
28
+ membership.tenant ?? null,
29
+ membership.team ?? null,
30
+ membership.via ?? null,
31
+ membership.expiresAt ?? null,
32
+ membership.grantedBy ?? null,
33
+ membership.reason ?? null,
34
+ membership.member?.group ?? null,
35
+ [...membership.eligible ?? []].toSorted(),
36
+ membership.managedBy ?? null,
37
+ [...membership.entitlements ?? []].toSorted(),
38
+ membership.keep === void 0 ? null : [...membership.keep].toSorted()
39
+ ]);
40
+ }
41
+ /**
42
+ * Merges memberships from several sources: entries naming the same instance
43
+ * with the same `via`, expiry, owner and seats become one entry with the union
44
+ * of their roles. Entries that differ in any of those stay separate, so a
45
+ * staff role and a contact role in one instance keep their own `via`.
46
+ */
47
+ function mergeMemberships(lists) {
48
+ const merged = /* @__PURE__ */ new Map();
49
+ for (const list of lists) for (const membership of list) {
50
+ const key = identity(membership);
51
+ const found = merged.get(key);
52
+ merged.set(key, found === void 0 ? membership : {
53
+ ...found,
54
+ roles: [.../* @__PURE__ */ new Set([...found.roles, ...membership.roles])]
55
+ });
56
+ }
57
+ return [...merged.values()];
58
+ }
59
+ function all(values) {
60
+ return values.some((value) => isThenable(value)) ? Promise.all(values) : values;
61
+ }
62
+ function then(value, next) {
63
+ return isThenable(value) ? Promise.resolve(value).then(next) : next(value);
64
+ }
65
+ /**
66
+ * One `MembershipSource` over several: memberships are merged and
67
+ * de-duplicated, `list` concatenates the sources that can list, and `version`
68
+ * is the highest version any source reports. A source that throws makes the
69
+ * whole lookup throw, which the subject resolver turns into no memberships.
70
+ */
71
+ function composeMemberships(sources) {
72
+ const listing = sources.filter((source) => source.list !== void 0);
73
+ const versioned = sources.filter((source) => source.version !== void 0);
74
+ return {
75
+ membershipsFor(principal, options) {
76
+ return then(all(sources.map((source) => source.membershipsFor(principal, options))), (lists) => mergeMemberships(lists));
77
+ },
78
+ ...listing.length === 0 ? {} : { list(query) {
79
+ return then(all(listing.map((source) => source.list?.(query) ?? [])), (lists) => {
80
+ const seen = /* @__PURE__ */ new Map();
81
+ for (const entry of lists.flat()) {
82
+ const key = `${entry.principal.id}\u0000${identity(entry.membership)}`;
83
+ const found = seen.get(key);
84
+ seen.set(key, found === void 0 ? entry : {
85
+ principal: entry.principal,
86
+ membership: {
87
+ ...found.membership,
88
+ roles: [.../* @__PURE__ */ new Set([...found.membership.roles, ...entry.membership.roles])]
89
+ }
90
+ });
91
+ }
92
+ return [...seen.values()];
93
+ });
94
+ } },
95
+ ...versioned.length === 0 ? {} : { version(principal) {
96
+ return then(all(versioned.map((source) => source.version?.(principal))), (versions) => {
97
+ const known = versions.filter((value) => typeof value === "number" && Number.isFinite(value));
98
+ return known.length === 0 ? void 0 : Math.max(...known);
99
+ });
100
+ } }
101
+ };
102
+ }
103
+ /** A single source, or several composed. */
104
+ function asMembershipSource(input) {
105
+ return Array.isArray(input) ? composeMemberships(input) : input;
106
+ }
107
+ /**
108
+ * Trust the memberships the verified token carries, and read `source` only
109
+ * when the token marks them truncated. With `version`, a token minted before
110
+ * the latest membership change is stale for the policy's `fresh` permissions,
111
+ * or with `onStale: 'reread'` has its memberships read from `source` instead.
112
+ */
113
+ function claimsFirst(source, options = {}) {
114
+ const inner = asMembershipSource(source);
115
+ const version = options.version ?? (inner.version === void 0 ? void 0 : (principal) => inner.version?.(principal));
116
+ return {
117
+ membershipsFor: (principal, query) => inner.membershipsFor(principal, query),
118
+ ...inner.list === void 0 ? {} : { list: (query) => inner.list?.(query) ?? [] },
119
+ ...version === void 0 ? {} : { version },
120
+ ...options.onStale === "reread" ? { onStale: "reread" } : {},
121
+ claimsFirst: true
122
+ };
123
+ }
124
+ /** Whether the identity provider owns `membership`: the application must not add, change or remove it. */
125
+ function isExternallyManaged(membership) {
126
+ return membership.managedBy === "idp";
127
+ }
128
+ /**
129
+ * How many principals hold `role` in one scope instance now, from the
130
+ * source's member list (`MembershipSource.list`): live memberships of exactly
131
+ * that scope and instance, each principal counted once. The `holders` a
132
+ * `decideRoleChange` with `min`, `max` or `transferOnly` needs. `undefined`
133
+ * when the source cannot list or the read fails, which that check denies.
134
+ */
135
+ async function countHolders(source, query) {
136
+ const composed = asMembershipSource(source);
137
+ if (composed.list === void 0) return;
138
+ const role = typeof query.role === "string" ? query.role : query.role.key;
139
+ try {
140
+ const entries = await composed.list({
141
+ scope: query.scope,
142
+ id: query.id
143
+ });
144
+ const now = nowSeconds();
145
+ const holders = /* @__PURE__ */ new Set();
146
+ for (const entry of entries) {
147
+ const membership = entry.membership;
148
+ if (membership.scope === query.scope && membership.id === query.id && membership.roles.includes(role) && (membership.expiresAt === void 0 || membership.expiresAt > now)) holders.add(entry.principal.id);
149
+ }
150
+ return holders.size;
151
+ } catch {
152
+ return;
153
+ }
154
+ }
155
+ //#endregion
156
+ //#region src/core/role-rank.ts
157
+ function bindingOf(policy, name) {
158
+ return policy.rolesByName.get(name);
159
+ }
160
+ function roleMeta(policy, name) {
161
+ return bindingOf(policy, name)?.meta ?? findRole(policy.vocabulary?.roles, name)?.meta;
162
+ }
163
+ /** A role with `for` is held only through a membership of one of those kinds. */
164
+ function mayHoldVia(policy, role, via) {
165
+ const kinds = bindingOf(policy, role)?.for;
166
+ return kinds === void 0 || via !== void 0 && kinds.includes(via);
167
+ }
168
+ function sameList(a, b) {
169
+ return a.length === b.length && a.every((item, index) => item === b[index]);
170
+ }
171
+ /**
172
+ * The identity provider may only hand out what the application could: a
173
+ * declared role with `assignable: false` (an owner, a platform role) never
174
+ * rides in on a `managedBy: 'idp'` membership. A name the policy does not
175
+ * declare stays, because only a tenant's custom role can give it meaning.
176
+ */
177
+ function mayHoldManaged(policy, role, membership) {
178
+ return !isExternallyManaged(membership) || bindingOf(policy, role)?.assignable !== false;
179
+ }
180
+ /**
181
+ * Drops every role a membership's kind may not hold (fail-closed: a missing
182
+ * `via` is no kind) and every non-assignable role on an identity-provider
183
+ * membership. Global roles have no kind, so a role with `for` held globally
184
+ * is dropped too.
185
+ */
186
+ function applyRoleKinds(policy, roles, memberships) {
187
+ const kinds = policy.roles.some((binding) => binding.for !== void 0);
188
+ if (!kinds && !memberships.some(isExternallyManaged)) return {
189
+ roles,
190
+ memberships
191
+ };
192
+ return {
193
+ roles: kinds ? roles?.filter((name) => mayHoldVia(policy, name, void 0)) ?? roles : roles,
194
+ memberships: memberships.map((membership) => {
195
+ const allowed = membership.roles.filter((name) => mayHoldVia(policy, name, membership.via) && mayHoldManaged(policy, name, membership));
196
+ return sameList(allowed, membership.roles) ? membership : freezeDeep({
197
+ ...membership,
198
+ roles: allowed
199
+ });
200
+ })
201
+ };
202
+ }
203
+ function usesAssigns(policy) {
204
+ return policy.roles.some((binding) => binding.assigns !== void 0);
205
+ }
206
+ /** Declared role names in declaration order: bindings first, then vocabulary-only leaves. */
207
+ function declarationOrder(policy) {
208
+ const names = policy.roles.map((binding) => binding.name);
209
+ const seen = new Set(names);
210
+ for (const leaf of listRoles(policy.vocabulary?.roles)) if (!seen.has(leaf.key)) {
211
+ names.push(leaf.key);
212
+ seen.add(leaf.key);
213
+ }
214
+ return names;
215
+ }
216
+ /**
217
+ * Each role's depth in the `assigns` graph: a role nobody else assigns is 0,
218
+ * a role another assigns sits one below its deepest assigner. Cycles stop
219
+ * after one pass per role.
220
+ */
221
+ function assignDepths(policy) {
222
+ const names = declarationOrder(policy);
223
+ const depth = new Map(names.map((name) => [name, 0]));
224
+ for (let pass = 0; pass < names.length; pass += 1) {
225
+ let changed = false;
226
+ for (const binding of policy.roles) {
227
+ const from = depth.get(binding.name) ?? 0;
228
+ for (const target of binding.assigns ?? []) if (target !== binding.name && (depth.get(target) ?? 0) < from + 1) {
229
+ depth.set(target, from + 1);
230
+ changed = true;
231
+ }
232
+ }
233
+ if (!changed) break;
234
+ }
235
+ return depth;
236
+ }
237
+ /**
238
+ * `names` ordered by rank: assigners before the roles they assign, then
239
+ * declaration order. Without an `assigns` graph the order is kept.
240
+ */
241
+ function rankRoles(policy, names) {
242
+ if (!usesAssigns(policy)) return names;
243
+ const order = declarationOrder(policy);
244
+ const depth = assignDepths(policy);
245
+ const index = (name) => {
246
+ const found = order.indexOf(name);
247
+ return found === -1 ? order.length : found;
248
+ };
249
+ return [...names].toSorted((a, b) => (depth.get(a) ?? Number.MAX_SAFE_INTEGER) - (depth.get(b) ?? Number.MAX_SAFE_INTEGER) || index(a) - index(b));
250
+ }
251
+ /** The distinct `meta.audience` values of `names`, in rank order. */
252
+ function audiencesOf(policy, names) {
253
+ const out = [];
254
+ for (const name of rankRoles(policy, names)) {
255
+ const audience = roleMeta(policy, name)?.audience;
256
+ if (typeof audience === "string" && !out.includes(audience)) out.push(audience);
257
+ }
258
+ return out;
259
+ }
260
+ /** Whether `membership` is the instance itself or one of its ancestors named in `within`. */
261
+ //#endregion
262
+ //#region src/core/held-roles.ts
263
+ /**
264
+ * Role names held in `tenant` on live memberships, global roles included, in
265
+ * rank order. With `scope`, only the roles of that scope's memberships (and
266
+ * instance `id`).
267
+ */
268
+ function heldRoleNames(policy, subject, tenant, only, now) {
269
+ if (subject.principal === null) return [];
270
+ const scopes = scopeList(policy.scopes);
271
+ const scope = only?.scope === void 0 ? void 0 : resolveScope(scopes, only.scope);
272
+ if (only?.scope !== void 0 && scope === void 0) return [];
273
+ const names = new Set(scope === void 0 ? subject.principal.roles ?? [] : []);
274
+ for (const membership of subject.principal.memberships ?? []) {
275
+ if (isMembershipExpired(membership, now) || membership.keep !== void 0) continue;
276
+ if (!(scope === void 0 ? tenantOf(membership, scopes) === tenant : membership.scope === scope && (only?.id === void 0 || sameId(membership.id, only.id)))) continue;
277
+ for (const role of membership.roles) names.add(role);
278
+ }
279
+ return rankRoles(policy, [...names]);
280
+ }
281
+ function roleLeaf(policy, name) {
282
+ const binding = policy.rolesByName.get(name);
283
+ return findRole(policy.vocabulary?.roles, name) ?? synthesiseRole(name, compact({
284
+ on: typeof binding?.on === "string" ? binding.on : void 0,
285
+ assignable: binding?.assignable,
286
+ meta: binding?.meta
287
+ }));
288
+ }
289
+ //#endregion
290
+ //#region src/core/snapshot-grants.ts
291
+ /** A grant on a relation with a `period` is decided on the server, where the clock is. */
292
+ function periodBound(policy, grant) {
293
+ const relations = policy.resources.get(grant.permission.resource)?.relations;
294
+ return flattenGrantee(grant.to).some((item) => {
295
+ if (item.kind !== "relation") return false;
296
+ const spec = relations?.[item.relation];
297
+ return isPrincipalRelation(spec) && spec.period !== void 0;
298
+ });
299
+ }
300
+ function includePrefixes(include) {
301
+ if (include === void 0) return;
302
+ return include.map((item) => {
303
+ if ("key" in item && typeof item.key === "string") return item.key;
304
+ const first = listPermissions(item)[0];
305
+ if (first === void 0) return "";
306
+ const parts = first.key.split(".");
307
+ parts.pop();
308
+ return parts.join(".");
309
+ });
310
+ }
311
+ /**
312
+ * The grant with its grantee's row condition. A graph relation needs the
313
+ * `RelationSource`, which snapshots and `where()` do not carry, so the grant
314
+ * becomes server-only (`portable: false`) there.
315
+ */
316
+ function graphAware(grant, where) {
317
+ const combined = combineWhere(grant.where, where);
318
+ const graph = hasConditionOp(combined, "related");
319
+ const inherits = flattenGrantee(grant.to).some((item) => item.kind === "inherit");
320
+ return freezeDeep(compact({
321
+ ...grant,
322
+ where: combined,
323
+ portable: graph ? false : grant.portable,
324
+ graph: graph && grant.portable && !inherits ? true : void 0
325
+ }));
326
+ }
327
+ /**
328
+ * `where()` keeps a grant that is server-only because it reads the graph:
329
+ * its `related` nodes compile to subqueries given relation mappings.
330
+ */
331
+ function whereGrant(grant) {
332
+ return grant.graph === true ? freezeDeep({
333
+ ...grant,
334
+ portable: true
335
+ }) : grant;
336
+ }
337
+ /**
338
+ * Every grant the subject may reach, once per membership that holds all of
339
+ * its scoped roles, so a client can check that membership's tenant, team or
340
+ * resource. A scoped role held only globally reaches nothing.
341
+ */
342
+ function collectSnapshotGrants(policy, subject, customRoles, now = nowSeconds$1(), customGrants = customGrantsFor(policy, customRoles), mode = "held") {
343
+ const skip = (grant, match) => mode === "held" ? !match.matched : match.matched || match.reason !== "not-entitled" || grant.effect !== "allow";
344
+ const scopes = scopeList(policy.scopes);
345
+ const declared = declaredRoleNames(policy);
346
+ const global = expandRoleNames(subject.principal?.roles ?? [], declared, customRoles, subject.principal?.tenant);
347
+ const held = (subject.principal?.memberships ?? []).map((membership) => ({
348
+ membership,
349
+ roles: new Set(expandRoleNames(membership.roles, declared, customRoles, tenantOf(membership, scopes)).roles)
350
+ }));
351
+ const holds = (entry, item) => entry.roles.has(item.role) && (typeof item.scope === "string" ? entry.membership.scope === item.scope : entry.membership.on !== void 0);
352
+ const requirementOf = (grant, resource) => grant.requires === void 0 || grant.effect !== "allow" ? void 0 : requirementCondition(policy, subject, grant.requires, resource, now, customRoles, customGrants);
353
+ const out = [];
354
+ for (const grant of grantList(policy)) {
355
+ if (!contactMayUse(policy, subject, grant)) continue;
356
+ if (mode === "held" && !coversRequirements(policy.permissions, grant.requires, subject.delegation)) continue;
357
+ const resource = getResource(policy.permissions, grant.permission.resource);
358
+ const match = matchGrantee(grant.to, subject, now, resource, scopes, policy.resources);
359
+ if (skip(grant, match)) continue;
360
+ const roleItems = flattenGrantee(grant.to).filter((item) => item.kind === "role");
361
+ if (roleItems.length > 0 && subject.principal === null) continue;
362
+ if (!roleItems.every((item) => item.scope !== "global" || global.roles.includes(item.role))) continue;
363
+ const merged = graphAware(grant, combineWhere(match.where, requirementOf(grant, resource)));
364
+ const scoped = roleItems.filter((item) => item.scope !== "global");
365
+ if (scoped.length === 0) {
366
+ out.push({ grant: merged });
367
+ continue;
368
+ }
369
+ for (const entry of held) if (keepsPermission(entry.membership, grant.permission.key) && scoped.every((item) => item.kind === "role" && holds(entry, item))) out.push({
370
+ grant: merged,
371
+ membership: entry.membership
372
+ });
373
+ }
374
+ for (const { grant, role } of customGrants) {
375
+ if (!contactMayUse(policy, subject, grant)) continue;
376
+ const globalHeld = holdsGlobalCustomRole(subject.principal?.roles, role);
377
+ const holders = held.filter((entry) => keepsPermission(entry.membership, grant.permission.key) && holdsCustomRole(entry.membership, role, scopes));
378
+ if (holders.length === 0 && !globalHeld) continue;
379
+ const resource = getResource(policy.permissions, grant.permission.resource);
380
+ const match = matchGrantee(grant.to, subject, now, resource, scopes, policy.resources);
381
+ if (skip(grant, match)) continue;
382
+ const merged = graphAware(grant, combineWhere(match.where, requirementOf(grant, resource)));
383
+ if (globalHeld) out.push({ grant: merged });
384
+ for (const entry of holders) out.push({
385
+ grant: merged,
386
+ membership: entry.membership
387
+ });
388
+ }
389
+ const fresh = policy.fresh ?? [];
390
+ if (mode === "held" && subject.stale === true && fresh.length > 0) return out.filter(({ grant }) => grant.effect === "deny" || !fresh.includes(grant.permission.key));
391
+ return out;
392
+ }
393
+ //#endregion
394
+ //#region src/core/assignable.ts
395
+ /**
396
+ * Declared roles a tenant admin may hand out or compose, before any
397
+ * intersection: `assignable` roles, plus every role some `assigns` lists.
398
+ */
399
+ function assignableCandidates(policy) {
400
+ const listed = new Set(policy.roles.flatMap((binding) => binding.assigns ?? []));
401
+ const names = [...listRoles(policy.vocabulary?.roles).filter((leaf) => leaf.assignable || listed.has(leaf.key)).map((leaf) => leaf.key), ...policy.roles.filter((binding) => binding.assignable || listed.has(binding.name)).map((binding) => binding.name)];
402
+ return rankRoles(policy, [...new Set(names)]).map((name) => roleLeaf(policy, name));
403
+ }
404
+ /**
405
+ * The levels a held allow of a permission covers: its own `level`, every
406
+ * level when it has no row condition, or the levels whose condition equals
407
+ * its condition.
408
+ */
409
+ function heldLevels(policy, grant, names) {
410
+ if (grant.level !== void 0) return [grant.level];
411
+ if (grant.where === void 0) return names;
412
+ const held = canonicalJson(grant.where);
413
+ return names.filter((name) => {
414
+ const condition = levelCondition(policy, grant.permission.resource, name);
415
+ return condition !== void 0 && canonicalJson(condition) === held;
416
+ });
417
+ }
418
+ /**
419
+ * What the subject may hand out in `tenant`: declared assignable roles and the
420
+ * tenant custom-role ceiling, narrowed by `allowed` (`CustomRoleSource.assignable`),
421
+ * then intersected with the permissions the subject holds there. Holding a
422
+ * role or a granted permission with `meta.manageRoles` lifts the intersection.
423
+ */
424
+ function assignableIn(policy, subject, customRoles, customGrants, tenant, allowed, now = nowSeconds$1(), global = false) {
425
+ const principal = subject.principal;
426
+ if (principal === null) return {
427
+ roles: [],
428
+ permissions: [],
429
+ levels: {},
430
+ manage: false,
431
+ inert: []
432
+ };
433
+ const scopes = scopeList(policy.scopes);
434
+ const scoped = tenant === void 0 ? subject : freezeDeep(compact({
435
+ ...subject,
436
+ principal: compact({
437
+ ...principal,
438
+ tenant: resolveActiveTenant(principal, tenant, scopes, now)
439
+ })
440
+ }));
441
+ const heldGrants = collectSnapshotGrants(policy, scoped, customRoles, now, customGrants).filter((item) => item.grant.effect === "allow" && (item.membership === void 0 || !global && tenantOf(item.membership, scopes) === tenant && !isMembershipExpired(item.membership, now))).map((item) => item.grant);
442
+ const heldKeys = new Set(heldGrants.map((grant) => grant.permission.key));
443
+ const heldNames = heldRoleNames(policy, subject, tenant, void 0, now);
444
+ const quiet = {
445
+ emit: false,
446
+ simulated: true,
447
+ skipAlternatives: true,
448
+ customRoles,
449
+ customGrants,
450
+ listeners: emptyListeners(),
451
+ sink: void 0,
452
+ limits: void 0,
453
+ limitCache: /* @__PURE__ */ new Map(),
454
+ team: void 0
455
+ };
456
+ const manage = heldNames.some((name) => roleMeta(policy, name)?.manageRoles === true) || listPermissions(policy.permissions).some((leaf) => leaf.meta.manageRoles === true && evaluate(policy, scoped, leaf, void 0, {
457
+ call: "simulate",
458
+ trusted: true,
459
+ now: instantAt(now)
460
+ }, quiet).outcome === "granted");
461
+ const narrowed = allowed === void 0 ? void 0 : new Set(allowed);
462
+ const candidates = assignableCandidates(policy).filter((leaf) => narrowed === void 0 || narrowed.has(leaf.key));
463
+ const held = new Set(heldNames);
464
+ const listed = usesAssigns(policy) ? new Set(heldNames.flatMap((name) => policy.rolesByName.get(name)?.assigns ?? [])) : void 0;
465
+ const roles = manage ? candidates : candidates.filter((leaf) => {
466
+ if (listed !== void 0) return listed.has(leaf.key);
467
+ if (held.has(leaf.key)) return true;
468
+ const keys = [...roleAllowKeys(policy, leaf.key)];
469
+ return keys.length > 0 && keys.every((key) => heldKeys.has(key));
470
+ });
471
+ const root = global ? "global" : rootScope(scopes);
472
+ const ceiling = new Set((root === void 0 ? [] : ceilingGrants(policy, root, allowed)).map((grant) => grant.permission.key));
473
+ const permissions = listPermissions(policy.permissions).filter((leaf) => ceiling.has(leaf.key) && (manage || heldKeys.has(leaf.key)));
474
+ const offeredLevels = (key, names) => {
475
+ if (manage) return names;
476
+ const reached = new Set(heldGrants.filter((grant) => grant.permission.key === key).flatMap((grant) => heldLevels(policy, grant, names)));
477
+ return names.filter((name) => reached.has(name));
478
+ };
479
+ const levels = {};
480
+ for (const leaf of permissions) {
481
+ const names = leaf.kind === "instance" ? levelNames(policy, leaf.resource) : [];
482
+ if (names.length > 0) levels[leaf.key] = offeredLevels(leaf.key, names);
483
+ }
484
+ const ceilingKeys = /* @__PURE__ */ new Map();
485
+ const mayHandOut = (scope, grant) => {
486
+ const key = grant.permission.key;
487
+ let keys = ceilingKeys.get(scope);
488
+ if (keys === void 0) {
489
+ keys = new Set(ceilingGrants(policy, scope, allowed).map((item) => item.permission.key));
490
+ ceilingKeys.set(scope, keys);
491
+ }
492
+ if (!keys.has(key) || !(manage || heldKeys.has(key))) return false;
493
+ const names = grant.permission.kind === "instance" ? levelNames(policy, grant.permission.resource) : [];
494
+ if (names.length === 0) return true;
495
+ const offered = offeredLevels(key, names);
496
+ return heldLevels(policy, grant, names).every((name) => offered.includes(name));
497
+ };
498
+ const custom = global || tenant === void 0 ? {
499
+ roles: [],
500
+ inert: []
501
+ } : assignableCustomRoles(policy, customRoles, tenant, manage ? void 0 : roles, mayHandOut);
502
+ return {
503
+ roles: [...roles, ...custom.roles],
504
+ permissions,
505
+ levels,
506
+ manage,
507
+ inert: custom.inert
508
+ };
509
+ }
510
+ /**
511
+ * The tenant's custom roles the subject may hand out: held at a scope it may
512
+ * assign declared roles at (any scope with `meta.manageRoles`), allowing at
513
+ * least one permission after the ceiling, and only permissions and levels it
514
+ * may hand out at that scope. A role that allows nothing is `inert`.
515
+ */
516
+ function assignableCustomRoles(policy, customRoles, tenant, declared, mayHandOut) {
517
+ const scopes = scopeList(policy.scopes);
518
+ const root = rootScope(scopes);
519
+ const assignsAt = declared === void 0 ? void 0 : new Set(declared.map((leaf) => leaf.on === void 0 ? root : resolveScope(scopes, leaf.on)));
520
+ const out = /* @__PURE__ */ new Map();
521
+ const inert = /* @__PURE__ */ new Set();
522
+ for (const role of tenantCustomRoles(policy, customRoles)) {
523
+ if (!customRoleOf(role, tenant) || out.has(role.name)) continue;
524
+ const at = customRoleScope(role, scopes);
525
+ if (at === void 0 || assignsAt !== void 0 && !assignsAt.has(at)) continue;
526
+ const { grants } = resolveCustomRole(policy, role);
527
+ if (!grants.some((grant) => grant.effect === "allow")) {
528
+ inert.add(role.name);
529
+ continue;
530
+ }
531
+ if (grants.every((grant) => grant.effect === "deny" || mayHandOut(at, grant))) out.set(role.name, synthesiseRole(role.name, compact({
532
+ on: at,
533
+ assignable: true,
534
+ meta: sourceRoleMeta(role.meta, treeXSchema(policy.vocabulary?.roles)),
535
+ shared: isSharedCustomRole(role) ? true : void 0
536
+ })));
537
+ }
538
+ return {
539
+ roles: [...out.values()].toSorted((a, b) => Number(a.shared !== true) - Number(b.shared !== true) || byCodePoint(a.key, b.key)),
540
+ inert: [...inert].filter((name) => !out.has(name)).toSorted()
541
+ };
542
+ }
543
+ //#endregion
544
+ //#region src/core/instance-snapshot.ts
545
+ /** The one path from a resolved subject to a `Snapshot`; pure apart from the default clock. */
546
+ function snapshotOf(policy, subject, options) {
547
+ const now = options.now ?? nowSeconds$1();
548
+ const customGrants = options.customGrants ?? customGrantsFor(policy, options.customRoles);
549
+ const roles = heldRoleNames(policy, subject, subject.principal?.tenant, void 0, now);
550
+ const audiences = audiencesOf(policy, roles);
551
+ const delegated = delegatedPermissions(policy.delegations, subject, new Set(roles), now);
552
+ return buildSnapshot(compact({
553
+ subject,
554
+ roles,
555
+ audiences: audiences.length === 0 ? void 0 : audiences,
556
+ notEntitled: collectSnapshotGrants(policy, subject, options.customRoles, now, customGrants, "not-entitled"),
557
+ grants: collectSnapshotGrants(policy, subject, options.customRoles, now, customGrants).filter((item) => delegated !== void 0 || item.grant.effect === "deny" || !readOnlyActorRefuses(subject.actor, item.grant.permission)).map((item) => periodBound(policy, item.grant) ? Object.assign({}, item, { grant: freezeDeep({
558
+ ...item.grant,
559
+ portable: false
560
+ }) }) : item),
561
+ include: includePrefixes(options.include),
562
+ tenants: options.tenants,
563
+ simulated: options.simulated,
564
+ now: Math.floor(now),
565
+ vocabulary: policy.vocabulary,
566
+ scopes: snapshotScopes(policy),
567
+ idOf: (name) => getResource(policy.permissions, name)?.id,
568
+ delegated,
569
+ assignable: (tenant) => {
570
+ const found = assignableIn(policy, subject, options.customRoles, customGrants, tenant, options.assignable?.get(tenant), now);
571
+ return compact({
572
+ tenant,
573
+ roles: found.roles.map((leaf) => leaf.key),
574
+ permissions: found.permissions,
575
+ levels: Object.keys(found.levels).length === 0 ? void 0 : found.levels
576
+ });
577
+ }
578
+ }));
579
+ }
580
+ /** The policy's scopes as snapshots and `permdock cloud push` carry them, with the resources each partitions. */
581
+ function snapshotScopes(policy) {
582
+ if (policy.scopes.length === 0) return;
583
+ const resources = [...policy.resources.values()];
584
+ return policy.scopes.map((scope) => {
585
+ const nodes = resources.filter((node) => partitionsOf(node, policy.scopes).includes(scope.name));
586
+ const partitioned = nodes.map((node) => node.name);
587
+ const fields = Object.fromEntries(nodes.flatMap((node) => {
588
+ const field = scopeField(node, scope.name, policy.scopes);
589
+ return field === void 0 || field === scope.key ? [] : [[node.name, field]];
590
+ }));
591
+ return compact({
592
+ name: scope.name,
593
+ key: scope.key ?? "",
594
+ within: scope.within,
595
+ resources: partitioned.length === 0 ? void 0 : partitioned,
596
+ fields: Object.keys(fields).length === 0 ? void 0 : fields
597
+ });
598
+ });
599
+ }
600
+ //#endregion
601
+ export { isExternallyManaged as _, whereGrant as a, applyRoleKinds as c, rankRoles as d, usesAssigns as f, countHolders as g, composeMemberships as h, collectSnapshotGrants as i, audiencesOf as l, claimsFirst as m, snapshotScopes as n, heldRoleNames as o, asMembershipSource as p, assignableIn as r, roleLeaf as s, snapshotOf as t, bindingOf as u };
@@ -0,0 +1,19 @@
1
+ //#region src/conditions/instant.ts
2
+ const ISO_INSTANT = /^(\d{4}-\d{2}-\d{2})(?:[T ](\d{2}:\d{2}(?::\d{2}(?:\.\d{1,9})?)?)(Z|[+-]\d{2}(?::?\d{2})?)?)?$/u;
3
+ /**
4
+ * Milliseconds since the epoch for an ISO 8601 date or date-time, or
5
+ * `undefined`. A date-time without a zone and a bare date are UTC, the same
6
+ * in memory, in the ORM compilers and in generated SQL.
7
+ */
8
+ function isoInstant(value) {
9
+ const match = ISO_INSTANT.exec(value);
10
+ if (match === null) return;
11
+ const [, day, time, zone] = match;
12
+ let offset = zone ?? (time === void 0 ? "" : "Z");
13
+ if (/^[+-]\d{2}$/u.test(offset)) offset = `${offset}:00`;
14
+ else if (/^[+-]\d{4}$/u.test(offset)) offset = `${offset.slice(0, 3)}:${offset.slice(3)}`;
15
+ const parsed = Date.parse(time === void 0 ? `${day}` : `${day}T${time}${offset}`);
16
+ return Number.isNaN(parsed) ? void 0 : parsed;
17
+ }
18
+ //#endregion
19
+ export { isoInstant as t };
@@ -0,0 +1,17 @@
1
+ //#region src/core/internals.ts
2
+ const INTERNALS = Symbol.for("permdock.internals");
3
+ /** Attaches `internals` to `instance` as a non-enumerable member; call before freezing. */
4
+ function attachInternals(instance, internals) {
5
+ Object.defineProperty(instance, INTERNALS, { value: internals });
6
+ }
7
+ /**
8
+ * The internals of a server instance, or `undefined` for an instance built
9
+ * from a snapshot or one that is not PermDock's. A feature function treats
10
+ * `undefined` as a check it cannot answer and denies with `unsupported`.
11
+ */
12
+ function internalsOf(permdock) {
13
+ const value = Reflect.get(permdock, INTERNALS);
14
+ return value === void 0 ? void 0 : value;
15
+ }
16
+ //#endregion
17
+ export { internalsOf as n, attachInternals as t };