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,306 @@
1
+ import { a as sole, r as isRecord, t as compact } from "./compact-CAf557ZB.js";
2
+ import { n as freezeDeep } from "./freeze-CrU8nQeX.js";
3
+ import { t as loadPrincipal } from "./principal-source-pHneukrx.js";
4
+ import { g as secondsOf, m as rfc3339 } from "./time-DkWjdL98.js";
5
+ import { d as scopeList, l as scopeChain, m as tenantOf, o as resolveScope, r as findScope, t as activeFor, u as scopeIdOf } from "./scopes-CUPSjo9q.js";
6
+ import { a as readOnlyActorRefuses, n as coveredByDelegation } from "./delegation-j6-rc37o.js";
7
+ import { r as readWireValidity, t as isActive } from "./validity-CZ7-y0Cj.js";
8
+ import { o as resourceRoleCondition } from "./grantee-conditions-CcXf8hMM.js";
9
+ import { c as nowSeconds, n as inTeam, o as membershipField, r as isMembershipExpired } from "./tenancy-DN2QAx9z.js";
10
+ import { i as bindConditionRefs, n as parseSnapshot } from "./snapshot-B7DkYg6g.js";
11
+ //#region src/core/snapshot-sign.ts
12
+ /**
13
+ * Signs `snapshot` as a `vnd.permdock.snapshot+jwt`. `issuedAt` and
14
+ * `expiresAt` become `iat` and `exp` and leave the `snapshot` claim, so the
15
+ * registered claims are the only times a verifier reads.
16
+ */
17
+ function signSnapshot(snapshot, signer, options = {}) {
18
+ const { issuedAt, expiresAt, ...claim } = snapshot;
19
+ const payload = { snapshot: claim };
20
+ if (snapshot.subject.principal !== null) payload["sub"] = snapshot.subject.principal.id;
21
+ const iat = secondsOf(issuedAt);
22
+ return signer.sign(payload, compact({
23
+ typ: "vnd.permdock.snapshot+jwt",
24
+ audience: options.audience,
25
+ issuedAt: iat === void 0 || iat <= 0 ? void 0 : iat,
26
+ expiresAt: secondsOf(expiresAt)
27
+ }));
28
+ }
29
+ /**
30
+ * The `snapshot` claim of verified claims with `issuedAt` and `expiresAt`
31
+ * taken from `iat` and `exp`; `undefined` when the claim is not an object.
32
+ */
33
+ function snapshotClaim(claims) {
34
+ const claim = claims["snapshot"];
35
+ if (!isRecord(claim)) return;
36
+ const { issuedAt: _issuedAt, expiresAt: _expiresAt, ...rest } = claim;
37
+ return compact({
38
+ ...rest,
39
+ issuedAt: rfc3339(typeof claims.iat === "number" ? claims.iat : 0),
40
+ expiresAt: typeof claims.exp === "number" ? rfc3339(claims.exp) : void 0
41
+ });
42
+ }
43
+ /**
44
+ * The snapshot a verified `vnd.permdock.snapshot+jwt` carries, parsed as
45
+ * `parseSnapshot` parses it, with `issuedAt` and `expiresAt` from `iat` and
46
+ * `exp`. `null` when the claim is missing or not a valid snapshot.
47
+ */
48
+ function snapshotFromClaims(claims) {
49
+ const claim = snapshotClaim(claims);
50
+ if (claim === void 0) return null;
51
+ try {
52
+ return parseSnapshot(claim);
53
+ } catch {
54
+ return null;
55
+ }
56
+ }
57
+ //#endregion
58
+ //#region src/core/decide-for.ts
59
+ function deniedFor(permission, reason) {
60
+ return freezeDeep({
61
+ outcome: "denied",
62
+ permission: permission.key,
63
+ denials: [{
64
+ role: null,
65
+ reason
66
+ }],
67
+ alternatives: []
68
+ });
69
+ }
70
+ /** Rows are checked like `decide`; `call: 'can'` keeps every limit unconsumed. */
71
+ const PEEK = Object.freeze({ call: "can" });
72
+ /**
73
+ * What `permission` on `row` decides for the principal `principalId` in the
74
+ * caller's active tenant. Never throws, never consumes a limit, and grants
75
+ * the caller nothing: the target is a separate instance with its own caches.
76
+ */
77
+ async function decideForTarget(caller, principals, create, principalId, permission, row) {
78
+ if (caller.principal === null) return deniedFor(permission, "anonymous");
79
+ const tenant = caller.principal.tenant;
80
+ try {
81
+ const principal = await loadPrincipal(principals, principalId, tenant);
82
+ if (principal === null) return deniedFor(permission, "anonymous");
83
+ const target = await create(principal, tenant);
84
+ if (tenant !== void 0 && target.subject.principal?.tenant !== tenant && (principal.kind !== "contact" || target.tenants().length > 0)) return deniedFor(permission, "tenant-mismatch");
85
+ if (row !== void 0) await target.prefetchRelations(permission, [row]);
86
+ return target.decide(permission, row, PEEK);
87
+ } catch {
88
+ return deniedFor(permission, "anonymous");
89
+ }
90
+ }
91
+ //#endregion
92
+ //#region src/core/may-use.ts
93
+ function delegationMayCover(permission, delegation, hasActor) {
94
+ return [void 0, ...[...delegation?.access ?? [], ...delegation?.authorizationDetails ?? []].flatMap((entry) => typeof entry === "object" && entry !== null && typeof entry["identifier"] === "string" ? [entry["identifier"]] : [])].some((id) => coveredByDelegation(permission, delegation, id, hasActor) === void 0);
95
+ }
96
+ function blocksEveryRow(grant) {
97
+ return grant.effect === "deny" && grant.where === void 0 && grant.check === void 0 && grant.portable !== false && grant.fields === void 0 && (grant.scope === void 0 || grant.scope === "tenant");
98
+ }
99
+ /**
100
+ * Whether `permission` could be granted to this instance's subject for some
101
+ * row: the grants its snapshot carries for the active tenant, minus an
102
+ * unconditional deny, within its delegation. A listing hint for tools and
103
+ * skills, never a decision; the call itself is decided in full.
104
+ */
105
+ function mayUse(permdock, permission) {
106
+ try {
107
+ const snapshot = permdock.snapshot();
108
+ if (!("grants" in snapshot)) return false;
109
+ const ceiling = snapshot.delegated;
110
+ if (ceiling !== void 0 && !ceiling.includes(permission.key) || readOnlyActorRefuses(permdock.subject.actor, permission)) return false;
111
+ if (!delegationMayCover(permission, permdock.subject.delegation, permdock.subject.actor !== void 0 && ceiling === void 0)) return false;
112
+ const tenant = permdock.subject.principal?.tenant;
113
+ const scopes = scopeList(snapshot.scopes);
114
+ const grants = snapshot.grants.filter((grant) => {
115
+ if (grant.permission !== permission.key) return false;
116
+ const owner = grant.membership === void 0 ? void 0 : tenantOf(grant.membership, scopes);
117
+ return owner === void 0 || owner === tenant;
118
+ });
119
+ if (grants.some(blocksEveryRow)) return false;
120
+ return grants.some((grant) => grant.effect === "allow");
121
+ } catch {
122
+ return false;
123
+ }
124
+ }
125
+ function isConditioned(grant) {
126
+ return grant.where !== void 0 || grant.check !== void 0 || grant.validity !== void 0 || grant.portable === false;
127
+ }
128
+ /**
129
+ * The instances of `scope` in which the subject holds `permission`, from its
130
+ * live memberships of exactly that scope, within its delegation: by default
131
+ * those with an allow that carries no row condition (`where`, `check`, a
132
+ * validity window or a non-portable test; a `fields` limit is not a row
133
+ * condition), minus the instances any deny of the permission reaches. The
134
+ * in-process mirror of the SQL `permitted_<scope>_ids_by_permission`. With
135
+ * `conditioned: true` it also lists the instances where a conditioned allow
136
+ * applies, minus only unconditional denies, as
137
+ * `permitted_<scope>_ids_by_permission(p_permission, true)` does. A listing,
138
+ * never a decision: a row's own check still runs `can`.
139
+ */
140
+ function permittedIds(permdock, permission, scope, options = {}) {
141
+ try {
142
+ const snapshot = permdock.snapshot({ tenants: "all" });
143
+ if (!("grants" in snapshot)) return [];
144
+ const scopes = scopeList(snapshot.scopes);
145
+ const name = resolveScope(scopes, scope);
146
+ const ceiling = snapshot.delegated;
147
+ if (name === void 0 || ceiling !== void 0 && !ceiling.includes(permission.key) || readOnlyActorRefuses(permdock.subject.actor, permission) || !delegationMayCover(permission, permdock.subject.delegation, permdock.subject.actor !== void 0 && ceiling === void 0)) return [];
148
+ const conditioned = options.conditioned === true;
149
+ const now = nowSeconds();
150
+ const allowed = /* @__PURE__ */ new Set();
151
+ const denied = /* @__PURE__ */ new Set();
152
+ for (const grant of snapshot.grants) {
153
+ const membership = grant.membership;
154
+ if (grant.permission !== permission.key || grant.scope !== name || membership?.scope !== name || membership.id === void 0 || isMembershipExpired(membership, now) || options.within !== void 0 && tenantOf(membership, scopes) !== options.within) continue;
155
+ if (grant.effect === "deny") {
156
+ if (!conditioned || !isConditioned(grant)) denied.add(membership.id);
157
+ } else if ((conditioned || !isConditioned(grant)) && isActive(readWireValidity(grant.validity), now)) allowed.add(membership.id);
158
+ }
159
+ return [...allowed].filter((id) => !denied.has(id)).toSorted();
160
+ } catch {
161
+ return [];
162
+ }
163
+ }
164
+ //#endregion
165
+ //#region src/core/where-scope.ts
166
+ const ALWAYS = freezeDeep({
167
+ op: "eq",
168
+ field: "_",
169
+ value: true
170
+ });
171
+ function eq(field, value) {
172
+ return value === void 0 ? {
173
+ op: "or",
174
+ conditions: []
175
+ } : {
176
+ op: "eq",
177
+ field,
178
+ value
179
+ };
180
+ }
181
+ /** One equality per partitioning scope key on the membership's chain, outermost first. */
182
+ function namedFilters(membership, scope) {
183
+ if (findScope(scope.scopes, membership.scope ?? "") === void 0 || !inTeam(membership, scope.scopes, scope.team) || !activeFor(membership, scope.scopes, scope.tenant) || membership.scope === void 0) return null;
184
+ const filters = [];
185
+ for (const name of scopeChain(scope.scopes, membership.scope).toReversed()) {
186
+ const key = scope.fieldOf?.(name) ?? findScope(scope.scopes, name)?.key;
187
+ if (key !== void 0 && scope.partitioned(name, key)) filters.push(eq(key, scopeIdOf(membership, name)));
188
+ }
189
+ return filters;
190
+ }
191
+ /**
192
+ * The row filters a grant's membership implies, or `null` when the grant
193
+ * reaches no row in this scope (another tenant, no active tenant, expired).
194
+ */
195
+ function scopeFilters(grant, scope) {
196
+ if (grant.scope === void 0) return [];
197
+ const membership = grant.membership;
198
+ if (membership === void 0 || isMembershipExpired(membership, scope.now)) return null;
199
+ if (typeof grant.scope === "string") return membership.scope === grant.scope ? namedFilters(membership, scope) : null;
200
+ const on = membership.on;
201
+ if (on === void 0) return null;
202
+ if (scope.resources === void 0) return on.resource === grant.scope.resource && on.resource === scope.resource ? [eq("id", on.id)] : null;
203
+ const roleResource = scope.resources.get(grant.scope.resource);
204
+ if (on.resource !== grant.scope.resource && membershipField(roleResource, on.resource, scope.resources) === void 0) return null;
205
+ const walked = scope.graph === true ? resourceRoleCondition(scope.resources.get(scope.resource), on.resource, [on.id], scope.resources) : void 0;
206
+ if (walked !== void 0) return [walked];
207
+ const field = membershipField(scope.resources.get(scope.resource), on.resource, scope.resources);
208
+ return field === void 0 ? null : [eq(field, on.id)];
209
+ }
210
+ function all(conditions) {
211
+ if (conditions.length === 0) return ALWAYS;
212
+ return sole(conditions) ?? {
213
+ op: "and",
214
+ conditions: [...conditions]
215
+ };
216
+ }
217
+ function scopedCondition(grant, scope) {
218
+ const filters = scopeFilters(grant, scope);
219
+ if (filters === null) return null;
220
+ const parts = grant.where === void 0 ? filters : [...filters, grant.where];
221
+ return parts.length === 0 ? "always" : all(parts);
222
+ }
223
+ /** Whether an unconditional `deny` removes every row `allow` could reach. */
224
+ function covers(deny, allow, scopes) {
225
+ if (deny.where !== void 0) return false;
226
+ const denied = deny.membership;
227
+ if (deny.scope === void 0 || denied === void 0) return deny.scope === void 0;
228
+ const allowed = allow.membership;
229
+ if (allowed === void 0) return false;
230
+ if (typeof deny.scope === "object") return typeof allow.scope === "object" && denied.on?.resource === allowed.on?.resource && denied.on?.id === allowed.on?.id;
231
+ if (typeof allow.scope !== "string" || allowed.scope === void 0) return false;
232
+ const chain = scopeChain(scopes, deny.scope);
233
+ return scopeChain(scopes, allowed.scope).includes(deny.scope) && chain.every((name) => scopeIdOf(allowed, name) === scopeIdOf(denied, name));
234
+ }
235
+ /**
236
+ * The portable filter for one permission's grants: allows OR together, each
237
+ * narrowed to its membership's tenant, team or resource; any applicable
238
+ * portable deny is subtracted, and an unconditional one empties the result.
239
+ */
240
+ function collect(grants, scope) {
241
+ const none = {
242
+ op: "or",
243
+ conditions: []
244
+ };
245
+ const partial = grants.some((grant) => grant.portable === false);
246
+ const denies = [];
247
+ for (const grant of grants) {
248
+ if (grant.effect !== "deny" || grant.portable === false || !isActive(readWireValidity(grant.validity, "deny"), scope.now)) continue;
249
+ const condition = scopedCondition(grant, scope);
250
+ if (condition === "always") return {
251
+ condition: none,
252
+ partial
253
+ };
254
+ if (condition !== null) denies.push({
255
+ grant,
256
+ condition
257
+ });
258
+ }
259
+ const parts = [];
260
+ for (const grant of grants) {
261
+ if (grant.effect !== "allow" || grant.portable === false || !isActive(readWireValidity(grant.validity), scope.now)) continue;
262
+ const condition = scopedCondition(grant, scope);
263
+ if (condition === null || denies.some((deny) => covers(deny.grant, grant, scope.scopes))) continue;
264
+ parts.push(all([...condition === "always" ? [] : [condition], ...denies.map((deny) => ({
265
+ op: "not",
266
+ condition: deny.condition
267
+ }))]));
268
+ }
269
+ if (parts.length === 0) return {
270
+ condition: none,
271
+ partial
272
+ };
273
+ return {
274
+ condition: sole(parts) ?? {
275
+ op: "or",
276
+ conditions: parts
277
+ },
278
+ partial
279
+ };
280
+ }
281
+ /**
282
+ * `collect`, with every subject ref bound to `scope.subject` and the subject
283
+ * attached (not enumerable) for `memberOf`, which needs its memberships.
284
+ */
285
+ function whereFromGrants(grants, scope) {
286
+ const { condition, partial } = collect(grants, scope);
287
+ const result = {
288
+ condition: bindConditionRefs(condition, scope.subject),
289
+ partial
290
+ };
291
+ Object.defineProperty(result, "subject", {
292
+ value: scope.subject,
293
+ enumerable: false
294
+ });
295
+ Object.defineProperty(result, "scopes", {
296
+ value: scope.scopes,
297
+ enumerable: false
298
+ });
299
+ if (scope.resources !== void 0) Object.defineProperty(result, "resources", {
300
+ value: scope.resources,
301
+ enumerable: false
302
+ });
303
+ return freezeDeep(result);
304
+ }
305
+ //#endregion
306
+ export { deniedFor as a, snapshotFromClaims as c, decideForTarget as i, mayUse as n, signSnapshot as o, permittedIds as r, snapshotClaim as s, whereFromGrants as t };
@@ -0,0 +1,364 @@
1
+ import { t as compact } from "./compact-CAf557ZB.js";
2
+ import { n as freezeDeep } from "./freeze-CrU8nQeX.js";
3
+ import { r as ownGet } from "./paths-DXSHAMIa.js";
4
+ import { n as internalsOf } from "./internals-Dk8A8fX3.js";
5
+ import { a as getResource } from "./permission-registry-Br4jSNVi.js";
6
+ import { a as expandRelation, c as isEdgeRelation, l as isFieldRelation, u as isPrincipalRelation } from "./resource-relations-D_jw0BFx.js";
7
+ import { s as instantAt } from "./time-DkWjdL98.js";
8
+ import { a as normalizeMemberships, c as rootScope, d as scopeList, o as resolveScope } from "./scopes-CUPSjo9q.js";
9
+ import { o as flattenGrantee } from "./grantee-hxrUsbpM.js";
10
+ import { r as relationCondition } from "./grantee-conditions-CcXf8hMM.js";
11
+ import { c as nowSeconds, p as scopeField } from "./tenancy-DN2QAx9z.js";
12
+ import { t as byCodePoint } from "./compare-pfyVnBjE.js";
13
+ import { T as emptyListeners, t as evaluate } from "./evaluate-CNClBvcj.js";
14
+ import { n as relationId, t as pendingRelations } from "./relations-BnCWnJGI.js";
15
+ import { t as relationWalk } from "./relation-walk-3OyDBF0S.js";
16
+ //#region src/core/who-can.ts
17
+ const MAX_ROUNDS = 48;
18
+ async function settle(cache) {
19
+ for (let round = 0; round < MAX_ROUNDS; round += 1) {
20
+ const pending = pendingRelations(cache);
21
+ if (pending.length === 0) return;
22
+ await Promise.all(pending);
23
+ }
24
+ }
25
+ /** The holders on each instance a graph relation reads, or `undefined` when the graph cannot say. */
26
+ async function walkHolders(condition, row, reader, cache) {
27
+ let walk = relationWalk(condition, row, reader);
28
+ if (walk === "relation-unavailable") {
29
+ await settle(cache);
30
+ walk = relationWalk(condition, row, reader);
31
+ }
32
+ if (walk === void 0) return [];
33
+ if (walk === "relation-depth" || walk === "relation-unavailable") return;
34
+ const { ids } = walk;
35
+ const read = () => ids.map((id) => reader.holders({
36
+ resource: condition.resource,
37
+ id,
38
+ relation: condition.relation
39
+ }));
40
+ let answers = read();
41
+ if (answers.includes("pending")) {
42
+ await settle(cache);
43
+ answers = read();
44
+ }
45
+ const out = [];
46
+ for (const [index, answer] of answers.entries()) {
47
+ const id = ids[index];
48
+ if (answer === "pending" || answer === "failed" || id === void 0) return;
49
+ out.push({
50
+ id,
51
+ holders: answer
52
+ });
53
+ }
54
+ return out;
55
+ }
56
+ async function discoverRole(item, allow, ctx) {
57
+ if (typeof item.scope !== "string" || item.scope === "global") {
58
+ ctx.incomplete();
59
+ return;
60
+ }
61
+ const key = scopeField(ctx.resource, item.scope, ctx.scopes);
62
+ const id = key === void 0 ? void 0 : relationId(ownGet(ctx.row, key));
63
+ if (id === void 0) return;
64
+ const members = await ctx.list(item.scope, id);
65
+ if (members === null) {
66
+ ctx.incomplete();
67
+ return;
68
+ }
69
+ for (const member of members.filter((entry) => entry.membership.roles.includes(item.role))) ctx.add(member.id, allow ? {
70
+ kind: "role",
71
+ role: item.role,
72
+ membership: member.membership
73
+ } : void 0, member.membership);
74
+ }
75
+ function holderVia(holder, at, share, group) {
76
+ if (!share) return {
77
+ kind: "relation",
78
+ ...at
79
+ };
80
+ return compact({
81
+ kind: "share",
82
+ ...at,
83
+ expiresAt: holder.expiresAt,
84
+ group
85
+ });
86
+ }
87
+ /**
88
+ * Principals holding `group`'s relation, through at most `budget` more groups
89
+ * of its resource; `undefined` when a read failed. `memo` keeps each group's
90
+ * members per budget across one discovery, so a group shared by many paths is
91
+ * read once; a result cut short by a cycle is path-specific and not kept.
92
+ */
93
+ async function groupMembers(group, ctx, budget, seen, memo) {
94
+ const key = JSON.stringify([
95
+ group.resource,
96
+ group.id,
97
+ group.relation
98
+ ]);
99
+ const memoKey = `${budget}:${key}`;
100
+ const known = memo.get(memoKey);
101
+ if (known !== void 0) return {
102
+ members: known,
103
+ cut: false
104
+ };
105
+ let holders = ctx.reader.holders(group);
106
+ if (holders === "pending") {
107
+ await settle(ctx.cache);
108
+ holders = ctx.reader.holders(group);
109
+ }
110
+ if (holders === "pending" || holders === "failed") return;
111
+ const path = new Set(seen).add(key);
112
+ const out = /* @__PURE__ */ new Set();
113
+ let cut = false;
114
+ for (const holder of holders) {
115
+ if ("principal" in holder) {
116
+ out.add(holder.principal.id);
117
+ continue;
118
+ }
119
+ const nested = JSON.stringify([
120
+ holder.group.resource,
121
+ holder.group.id,
122
+ holder.group.relation
123
+ ]);
124
+ const same = holder.group.resource === group.resource;
125
+ if (path.has(nested)) {
126
+ cut = true;
127
+ continue;
128
+ }
129
+ if (same && budget <= 0) continue;
130
+ const walk = await groupMembers(holder.group, ctx, same ? budget - 1 : 16, path, memo);
131
+ if (walk === void 0) return;
132
+ cut ||= walk.cut;
133
+ for (const member of walk.members) out.add(member);
134
+ }
135
+ const members = [...out];
136
+ if (!cut) memo.set(memoKey, members);
137
+ return {
138
+ members,
139
+ cut
140
+ };
141
+ }
142
+ async function discoverGraph(condition, allow, ctx) {
143
+ const nodes = await walkHolders(condition, ctx.row, ctx.reader, ctx.cache);
144
+ if (nodes === void 0) {
145
+ ctx.incomplete();
146
+ return;
147
+ }
148
+ const node = ctx.policy.resources.get(condition.resource);
149
+ const memo = /* @__PURE__ */ new Map();
150
+ for (const entry of nodes) for (const holder of entry.holders) {
151
+ const at = {
152
+ resource: condition.resource,
153
+ relation: holder.relation,
154
+ id: entry.id
155
+ };
156
+ const share = isEdgeRelation(node?.relations[holder.relation]);
157
+ if ("principal" in holder) {
158
+ ctx.add(holder.principal.id, allow ? holderVia(holder, at, share) : void 0);
159
+ continue;
160
+ }
161
+ const walk = await groupMembers(holder.group, ctx, holder.group.resource === condition.resource ? 15 : 16, /* @__PURE__ */ new Set(), memo);
162
+ if (walk === void 0) {
163
+ ctx.incomplete();
164
+ continue;
165
+ }
166
+ for (const member of walk.members) ctx.add(member, allow ? holderVia(holder, at, share, holder.group) : void 0);
167
+ }
168
+ }
169
+ async function discoverRelation(item, allow, ctx, expanded = false) {
170
+ const condition = relationCondition(item, ctx.resource, ctx.scopes, { resources: ctx.policy.resources });
171
+ if (condition?.op === "related") {
172
+ await discoverGraph(condition, allow, ctx);
173
+ return;
174
+ }
175
+ const spec = ctx.resource?.relations[item.relation];
176
+ if (spec?.includes !== void 0 && !expanded) {
177
+ for (const name of expandRelation(ctx.resource, item.relation)) await discoverRelation({
178
+ ...item,
179
+ relation: name
180
+ }, allow, ctx, true);
181
+ return;
182
+ }
183
+ const via = allow ? {
184
+ kind: "relation",
185
+ resource: ctx.permission.resource,
186
+ relation: item.relation,
187
+ id: relationId(ownGet(ctx.row, ctx.resource?.id ?? "id")) ?? ""
188
+ } : void 0;
189
+ if (isFieldRelation(spec) && spec.memberOf !== void 0) {
190
+ const scope = resolveScope(ctx.scopes, spec.memberOf);
191
+ const id = relationId(ownGet(ctx.row, spec.field));
192
+ const members = scope === void 0 || id === void 0 ? [] : await ctx.list(scope, id);
193
+ if (members === null) {
194
+ ctx.incomplete();
195
+ return;
196
+ }
197
+ for (const member of members) ctx.add(member.id, via, member.membership);
198
+ return;
199
+ }
200
+ const column = isFieldRelation(spec) ? spec.field : isPrincipalRelation(spec) ? spec.principal : void 0;
201
+ const holder = column === void 0 ? void 0 : relationId(ownGet(ctx.row, column));
202
+ if (holder !== void 0) ctx.add(holder, via);
203
+ }
204
+ function discover(grant, item, ctx) {
205
+ const allow = grant.effect === "allow";
206
+ switch (item.kind) {
207
+ case "role": return discoverRole(item, allow, ctx);
208
+ case "relation": return discoverRelation(item, allow, ctx);
209
+ case "anyone":
210
+ case "authenticated":
211
+ case "plan":
212
+ case "actor":
213
+ case "assurance":
214
+ case "inherit":
215
+ ctx.incomplete();
216
+ return Promise.resolve();
217
+ default: return unknownKind(item, ctx);
218
+ }
219
+ }
220
+ /** Holders of a grantee kind this build does not know cannot be listed. */
221
+ function unknownKind(_item, ctx) {
222
+ ctx.incomplete();
223
+ return Promise.resolve();
224
+ }
225
+ function memberLister(source, scopes) {
226
+ const listed = /* @__PURE__ */ new Map();
227
+ const load = async (scope, id) => {
228
+ if (source?.list === void 0) return null;
229
+ try {
230
+ return (await source.list({
231
+ scope,
232
+ id
233
+ })).flatMap((entry) => typeof entry.principal?.id === "string" ? normalizeMemberships([entry.membership], scopes).map((membership) => ({
234
+ id: entry.principal.id,
235
+ membership
236
+ })) : []);
237
+ } catch {
238
+ return null;
239
+ }
240
+ };
241
+ return (scope, id) => {
242
+ const key = JSON.stringify([scope, id]);
243
+ const known = listed.get(key) ?? load(scope, id);
244
+ listed.set(key, known);
245
+ return known;
246
+ };
247
+ }
248
+ /**
249
+ * Who holds `permission` on `resource` for the instance's policy and how
250
+ * (role, relation or share), from `MembershipSource.list` and
251
+ * `RelationSource.related`. It lists and never grants; `complete: false`
252
+ * means some holders could not be listed. An instance built from a
253
+ * snapshot answers an empty, incomplete list.
254
+ */
255
+ function whoCan(permdock, permission, resource) {
256
+ const internals = internalsOf(permdock);
257
+ if (internals === void 0) return Promise.resolve(freezeDeep({
258
+ permission: permission.key,
259
+ holders: [],
260
+ complete: false
261
+ }));
262
+ return whoCanWith({
263
+ policy: internals.policy,
264
+ permission,
265
+ row: resource,
266
+ memberships: internals.env.memberships,
267
+ reader: internals.relations,
268
+ cache: internals.relationCache,
269
+ customGrants: internals.customGrants,
270
+ team: internals.team
271
+ });
272
+ }
273
+ async function whoCanWith(input) {
274
+ const { policy, permission, row } = input;
275
+ if (permission.kind !== "instance" || row === null || typeof row !== "object") return freezeDeep({
276
+ permission: permission.key,
277
+ holders: [],
278
+ complete: false
279
+ });
280
+ const scopes = scopeList(policy.scopes);
281
+ let complete = !input.customGrants.some((item) => item.grant.permission.key === permission.key);
282
+ const found = /* @__PURE__ */ new Map();
283
+ const ctx = {
284
+ policy,
285
+ scopes,
286
+ resource: getResource(policy.permissions, permission.resource),
287
+ permission,
288
+ row,
289
+ reader: input.reader,
290
+ cache: input.cache,
291
+ list: memberLister(input.memberships, scopes),
292
+ add(id, via, membership) {
293
+ const entry = found.get(id) ?? {
294
+ memberships: [],
295
+ via: []
296
+ };
297
+ found.set(id, entry);
298
+ if (via !== void 0) entry.via.push(via);
299
+ if (membership !== void 0) entry.memberships.push(membership);
300
+ },
301
+ incomplete() {
302
+ complete = false;
303
+ }
304
+ };
305
+ await Promise.all((policy.index.grantsByKey.get(permission.key) ?? []).flatMap((grant) => flattenGrantee(grant.to).map((item) => discover(grant, item, ctx))));
306
+ const root = rootScope(scopes);
307
+ const tenantKey = root === void 0 ? void 0 : scopeField(getResource(policy.permissions, permission.resource), root, scopes);
308
+ const tenant = tenantKey === void 0 ? void 0 : relationId(ownGet(row, tenantKey));
309
+ const env = {
310
+ emit: false,
311
+ simulated: true,
312
+ skipAlternatives: true,
313
+ customRoles: [],
314
+ customGrants: [],
315
+ listeners: emptyListeners(),
316
+ sink: void 0,
317
+ limits: void 0,
318
+ limitCache: /* @__PURE__ */ new Map(),
319
+ team: input.team,
320
+ relations: input.reader
321
+ };
322
+ const now = nowSeconds();
323
+ const ordered = [...found.entries()].toSorted(([a], [b]) => byCodePoint(a, b));
324
+ const decideAll = () => ordered.map(([id, entry]) => {
325
+ const subject = freezeDeep({
326
+ principal: {
327
+ id,
328
+ roles: [],
329
+ memberships: entry.memberships,
330
+ ...tenant === void 0 ? {} : { tenant }
331
+ },
332
+ context: {}
333
+ });
334
+ return evaluate(policy, subject, permission, row, {
335
+ call: "simulate",
336
+ trusted: true,
337
+ now: instantAt(now)
338
+ }, env);
339
+ });
340
+ let decisions = decideAll();
341
+ if (pendingRelations(input.cache).length > 0) {
342
+ await settle(input.cache);
343
+ decisions = decideAll();
344
+ }
345
+ const holders = [];
346
+ for (const [index, [id, entry]] of ordered.entries()) {
347
+ const decision = decisions[index];
348
+ if (decision === void 0 || decision.outcome === "denied") {
349
+ if (decision?.outcome === "denied" && decision.denials.some((denial) => denial.reason === "relation-unavailable" || denial.reason === "relation-depth")) complete = false;
350
+ continue;
351
+ }
352
+ holders.push({
353
+ principal: { id },
354
+ via: entry.via
355
+ });
356
+ }
357
+ return freezeDeep({
358
+ permission: permission.key,
359
+ holders,
360
+ complete
361
+ });
362
+ }
363
+ //#endregion
364
+ export { whoCan as t };