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.
- package/README.md +37 -35
- package/dist/{schema-Bol6gqXA.js → 2020-C9VN-x8c.js} +5 -130
- package/dist/a2a/index.d.ts +6 -6
- package/dist/a2a/index.js +14 -17
- package/dist/{adapter-context-mlWsVGGg.js → adapter-context-CRhqyzCk.js} +1 -1
- package/dist/adoption-scan-DCYe60Pi.js +107 -0
- package/dist/agent/index.d.ts +3 -0
- package/dist/agent/index.js +1 -0
- package/dist/ai-sdk/index.d.ts +18 -35
- package/dist/ai-sdk/index.js +37 -23
- package/dist/{app-data-CV8pqqMi.js → app-data-MuyzVqX8.js} +2 -1
- package/dist/approval-header-CJACtHkv.js +23 -0
- package/dist/approval-prompt-Dg5LeAcT.js +62 -0
- package/dist/approval-prompt-DvSSPQJX.d.ts +57 -0
- package/dist/approvals/index.d.ts +5 -3
- package/dist/approvals/index.js +8 -5
- package/dist/approvals-p1PGoVjb.js +995 -0
- package/dist/arazzo-41WuzHou.js +36 -0
- package/dist/{arazzo-C4BcskbX.js → arazzo-CaUVBn7D.js} +20 -14
- package/dist/args-IIolxxKA.js +197 -0
- package/dist/astro/index.d.ts +43 -0
- package/dist/astro/index.js +27 -0
- package/dist/audience-DabClFLQ.js +55 -0
- package/dist/auth-DRLEizbL.js +178 -0
- package/dist/authzen/index.d.ts +26 -6
- package/dist/authzen/index.js +94 -79
- package/dist/automation-BNM3TtDo.d.ts +114 -0
- package/dist/automation-DVjOckjV.js +157 -0
- package/dist/better-auth/index.d.ts +8 -6
- package/dist/better-auth/index.js +9 -8
- package/dist/better-supabase/index.d.ts +357 -30
- package/dist/better-supabase/index.js +936 -194
- package/dist/{bind-kk-uyCwH.js → bind-CAvgUuKs.js} +14 -10
- package/dist/{bind-BzqG8SMb.d.ts → bind-DOyrv6zi.d.ts} +12 -10
- package/dist/body-CH5of8Ne.js +10 -0
- package/dist/body-text-QcXok_SI.js +52 -0
- package/dist/{build-instance-DIIV9DbC.js → build-instance-Bu_eDqYw.js} +4 -3
- package/dist/{canonical-json-CFKyFOke.js → canonical-json-BC8_nMTw.js} +5 -3
- package/dist/{capability-CksyCWDH.d.ts → capability-Drg-1YhL.d.ts} +44 -25
- package/dist/{capability-txATtKV4.js → capability-N1K9IpqS.js} +68 -42
- package/dist/casbin-Cr7RLtA3.js +30 -0
- package/dist/casbin-Dyu2gnUD.js +234 -0
- package/dist/casl-64gpT-8x.js +24 -0
- package/dist/casl-DjEDhTCP.js +299 -0
- package/dist/catalog/index.d.ts +74 -2
- package/dist/catalog/index.js +51 -2
- package/dist/catalog-BoWglDPI.js +1 -0
- package/dist/catalog-DZVbrF-z.js +52 -0
- package/dist/{catalog-tZUyOfOv.js → catalog-HD2gf5mY.js} +51 -6
- package/dist/{catalog-doc-DWtg0gGR.js → catalog-doc-Cdn7-0pQ.js} +45 -23
- package/dist/catalog-fingerprint-CCP0-yQS.js +153 -0
- package/dist/chat/index.d.ts +2 -0
- package/dist/chat/index.js +224 -0
- package/dist/chat-sdk/index.d.ts +87 -0
- package/dist/chat-sdk/index.js +197 -0
- package/dist/claims-map-7oQ3ue4X.js +13 -0
- package/dist/claims-map-Ca-QX8C6.d.ts +32 -0
- package/dist/claude-agent/index.d.ts +7 -14
- package/dist/claude-agent/index.js +24 -27
- package/dist/clerk/index.d.ts +9 -8
- package/dist/clerk/index.js +9 -14
- package/dist/cli/bin.js +36 -17
- package/dist/cli/index.d.ts +19 -5
- package/dist/cli/index.js +164 -4
- package/dist/cloud/index.d.ts +102 -63
- package/dist/cloud/index.js +239 -340
- package/dist/cloud-ytQ3uviA.js +87 -0
- package/dist/codemod-5mpSpnUY.js +37 -0
- package/dist/codemod-ua2hHy7w.js +2084 -0
- package/dist/collect-Ci6akVwH.js +55 -0
- package/dist/collect-D7eQDffE.js +1 -0
- package/dist/{collect-2SrB7lfk.js → collect-mLTY4nwb.js} +75 -11
- package/dist/command-L8EstFNm.js +6 -0
- package/dist/compile/index.d.ts +1 -1
- package/dist/compile/index.js +1 -2
- package/dist/{compile-CtTP7eur.d.ts → compile-1bsAezL0.d.ts} +5 -3
- package/dist/{compile-CcEu2ZQ1.js → compile-CMqMx_IN.js} +11 -8
- package/dist/completion-BTFrHZhX.js +143 -0
- package/dist/config-Bj2Ixq3d.js +26 -0
- package/dist/{config-BIjREpyE.js → config-bs_kZeYq.js} +12 -7
- package/dist/{config-report--Xb9APJS.js → config-report-DSpsLpCE.js} +15 -5
- package/dist/{connection-DUsczpB5.js → connection-DjhIJSs2.js} +6 -5
- package/dist/{context-DieZVJXu.js → context-B_u3_bDJ.js} +2 -2
- package/dist/convex/index.d.ts +11 -10
- package/dist/convex/index.js +6 -4
- package/dist/create-B30OMUOJ.d.ts +107 -0
- package/dist/create-CBMmFie-.d.ts +138 -0
- package/dist/create-CGm28gyI.js +130 -0
- package/dist/create-CQWIpUG-.js +403 -0
- package/dist/{create-BBO24vj6.js → create-DCF2SvoT.js} +31 -32
- package/dist/create-D_NmPOdH.d.ts +110 -0
- package/dist/{credential-kue0qpbm.js → credential-BcoiejpY.js} +152 -31
- package/dist/credentials-DPyHmYz5.js +74 -0
- package/dist/delegation-j6-rc37o.js +286 -0
- package/dist/delivery/index.d.ts +5 -0
- package/dist/delivery/index.js +5 -0
- package/dist/delivery-DCAgNyCn.js +499 -0
- package/dist/delivery-event-xX4obB8F.js +40 -0
- package/dist/{denied-text-DfRk15uw.d.ts → denied-text-CiFQNuMV.d.ts} +5 -5
- package/dist/{describe-C3ldA9os.d.ts → describe-B5qgDvEW.d.ts} +2 -2
- package/dist/{describe-Cgkp7eP0.js → describe-BybMRY7A.js} +6 -2
- package/dist/device-BARQ8eYG.js +193 -0
- package/dist/{diff-rpqoe7Ag.js → diff-3jbx6Rm4.js} +60 -54
- package/dist/diff-CmuSD3vc.js +37 -0
- package/dist/doctor-3ZqNHX_G.js +44 -0
- package/dist/{doctor-owlv6ddh.js → doctor-BdZw53-k.js} +245 -50
- package/dist/drizzle/index.d.ts +5 -3
- package/dist/drizzle/index.js +2 -2
- package/dist/elysia/index.d.ts +16 -13
- package/dist/elysia/index.js +13 -12
- package/dist/env-DJZrPjRi.js +8 -0
- package/dist/errors-BDUwg2qC.js +27 -0
- package/dist/{errors-drnfxYtm.js → errors-BKy0EfhN.js} +5 -9
- package/dist/errors-BWXBMaKK.d.ts +11 -0
- package/dist/errors-CWTY6uih.js +143 -0
- package/dist/{errors-OD_4c__H.d.ts → errors-DH5QEGXh.d.ts} +2 -2
- package/dist/evaluate-CNClBvcj.js +1785 -0
- package/dist/evaluations-C_1vdSZc.d.ts +32 -0
- package/dist/{evaluations-C9YJsv3H.js → evaluations-beAooV0n.js} +145 -34
- package/dist/eve/index.d.ts +12 -16
- package/dist/eve/index.js +22 -28
- package/dist/event-time-CsegxXxB.js +23 -0
- package/dist/expiry-D4_YKRKD.js +52 -0
- package/dist/express/index.d.ts +13 -10
- package/dist/express/index.js +12 -11
- package/dist/fastify/index.d.ts +25 -22
- package/dist/fastify/index.js +13 -12
- package/dist/fetch-adapter-DD_gfmrC.js +120 -0
- package/dist/fetch-adapter-Dw0MTS3D.d.ts +31 -0
- package/dist/fields-OYG_JR78.js +203 -0
- package/dist/files-C5ZI27eV.js +124 -0
- package/dist/{fixtures-h2eG2OZV.js → fixtures-B7XrLeY7.js} +8 -7
- package/dist/flags-C3DktBDY.js +86 -0
- package/dist/{from-snapshot-7REQZe0H.js → from-snapshot-CTCMsFZk.js} +55 -52
- package/dist/{grantee-conditions-MQs5NIuX.js → grantee-conditions-CcXf8hMM.js} +4 -3
- package/dist/{grantee-CXY-0C87.js → grantee-hxrUsbpM.js} +16 -6
- package/dist/{grantee-match-fxYp9Nmt.js → grantee-match-DbENBHLB.js} +5 -4
- package/dist/h3/index.d.ts +37 -0
- package/dist/h3/index.js +35 -0
- package/dist/headers-BIjfMaoC.js +8 -0
- package/dist/headers-CIbDTUTK.d.ts +7 -0
- package/dist/{helpers-C9YmyBIa.js → helpers-CBYVMjwh.js} +45 -38
- package/dist/hono/index.d.ts +12 -9
- package/dist/hono/index.js +13 -12
- package/dist/hosted-B46-5LYE.js +315 -0
- package/dist/hosted-BPk51-kX.d.ts +78 -0
- package/dist/{http-DPuDaChb.d.ts → http-B_LphE5Y.d.ts} +1 -2
- package/dist/http-DXJ37RDA.js +46 -0
- package/dist/{http-BEbdMZ05.js → http-ujKm0JXE.js} +1 -2
- package/dist/{import-UHk1N7vH.js → import-CNV7I2Dw.js} +25 -20
- package/dist/{import-BFIlhetD.js → import-wyqXUyjm.js} +190 -53
- package/dist/index-B8YjkEZ4.d.ts +210 -0
- package/dist/index-C-6Letxg.d.ts +431 -0
- package/dist/index-CaxrMD1A.d.ts +1 -0
- package/dist/{index-BwMe94Xq.d.ts → index-Ch8LpNDp.d.ts} +34 -16
- package/dist/index-Cp_ilKi1.d.ts +91 -0
- package/dist/index-CueFnxQc.d.ts +110 -0
- package/dist/index-DuWxc5dt.d.ts +909 -0
- package/dist/index.d.ts +19 -15
- package/dist/index.js +31 -21
- package/dist/init-DeMYsnYJ.js +96 -0
- package/dist/init-GG6Jh8HD.js +95 -0
- package/dist/{instance-options-plkrsAog.d.ts → instance-options-BsVpyGIk.d.ts} +2 -2
- package/dist/instance-snapshot-BOEhcqIF.js +601 -0
- package/dist/instant-BluqDvyS.js +19 -0
- package/dist/internals-Dk8A8fX3.js +17 -0
- package/dist/{json-schema-DBkdUuCO.js → json-schema-B-vAwlde.js} +45 -6
- package/dist/json-schema-CN_iLFH2.d.ts +40 -0
- package/dist/jwt/index.d.ts +18 -11
- package/dist/jwt/index.js +156 -135
- package/dist/{kernel-CB3LrIJM.js → kernel-D0NVb1cK.js} +52 -24
- package/dist/kysely/index.d.ts +5 -3
- package/dist/kysely/index.js +2 -2
- package/dist/load-BxEtwlBS.js +1 -0
- package/dist/{load-C3_oTHyO.js → load-DFS_ry0W.js} +22 -6
- package/dist/{load-jose-BL6LH4bL.js → load-jose-DZ4dnjri.js} +1 -4
- package/dist/login-Dfe5RlYk.js +68 -0
- package/dist/login-imhuwvn3.js +254 -0
- package/dist/manifest-C8IzW3Do.js +42 -0
- package/dist/manifest-dvL2XEe1.js +370 -0
- package/dist/manifest-json-CAGzls-C.js +9 -0
- package/dist/{manifest-uDS9y5de.d.ts → manifest-mx5ghSFM.d.ts} +9 -2
- package/dist/manifest-schema-C0kK_8V0.js +399 -0
- package/dist/{map-claims-AVlBaJoa.js → map-claims-D3oRmTk0.js} +13 -10
- package/dist/{map-error-BE27PYkE.js → map-error-Dr70oA_3.js} +3 -3
- package/dist/{markers-CiwAOZtO.js → markers-C6joDI3o.js} +2 -1
- package/dist/mcp/index.d.ts +22 -12
- package/dist/mcp/index.js +57 -39
- package/dist/{migrate-BwlB5-Wk.js → migrate-CIq4-E9F.js} +53 -14
- package/dist/nest/index.d.ts +12 -9
- package/dist/nest/index.js +15 -14
- package/dist/next/index.d.ts +18 -21
- package/dist/next/index.js +13 -11
- package/dist/next/plugin.d.ts +1 -1
- package/dist/next/plugin.js +2 -2
- package/dist/node/index.d.ts +10 -10
- package/dist/node/index.js +7 -9
- package/dist/{ocsf-uYFXGVw2.js → ocsf-BFp-PZZA.js} +22 -11
- package/dist/openai/index.d.ts +9 -16
- package/dist/openai/index.js +17 -24
- package/dist/openapi/index.d.ts +3 -3
- package/dist/openapi/index.js +1 -1
- package/dist/{openapi-DBzHQbov.js → openapi-B7HZ0f-r.js} +8 -8
- package/dist/openapi-C4dDTVEd.js +138 -0
- package/dist/{openapi-BJdBmYDG.js → openapi-DD1SV-5-.js} +10 -9
- package/dist/operation-findings-DgATDpvh.js +36 -0
- package/dist/operations-X0VM7F3m.d.ts +59 -0
- package/dist/orpc/index.d.ts +13 -10
- package/dist/orpc/index.js +20 -15
- package/dist/otel/index.d.ts +3 -2
- package/dist/otel/index.js +30 -7
- package/dist/output-1im__-08.js +88 -0
- package/dist/output-files-B3IZJksC.js +1 -0
- package/dist/{output-files-CgIsvdSa.js → output-files-DhRBBE4n.js} +24 -26
- package/dist/{permission-keys-B26jeyUv.js → ownership-DqaJNJPn.js} +1045 -153
- package/dist/{package-root-DtNnpmUd.js → package-root-Dk_ETdkp.js} +1 -1
- package/dist/{parse-CVFQHk6c.js → parse-Cxq0WxrA.js} +2 -2
- package/dist/{parse-local-manifest-DvYUR0QL.d.ts → parse-local-manifest-5ODwqu8b.d.ts} +1 -1
- package/dist/{parse-local-manifest-C-q02Pal.js → parse-local-manifest-CVSs6J9I.js} +1 -1
- package/dist/parse-request-D_tUXG6M.js +26 -0
- package/dist/paths-DXSHAMIa.js +42 -0
- package/dist/pdp/index.d.ts +7 -3
- package/dist/pdp/index.js +45 -26
- package/dist/{peer-BOr_kJE1.js → peer-C8swJ2GH.js} +23 -4
- package/dist/peer-CRvC7Hg1.js +1 -0
- package/dist/permdock-BrAscV28.js +868 -0
- package/dist/permdock-SV8ZINYT.d.ts +502 -0
- package/dist/{permission-registry-BsblpB-z.js → permission-registry-Br4jSNVi.js} +3 -3
- package/dist/permissions-B-wCP5ZC.js +30 -0
- package/dist/{permissions-CCJ6lmxB.js → permissions-BPxlwVhN.js} +4 -3
- package/dist/{permissions-COH-KRgT.d.ts → permissions-u_KHg-sN.d.ts} +1 -2
- package/dist/policies-DP2nqRoF.js +295 -0
- package/dist/{policy-ur0BBK_e.d.ts → policy-77FSAq_V.d.ts} +2 -2
- package/dist/{hosted-CBHgkzDl.js → policy-DbM5YYtV.js} +17 -273
- package/dist/policy-from-catalog-C2gMa2Dj.js +450 -0
- package/dist/policy-module-CTlwMvLI.js +89 -0
- package/dist/{policy-types-sp9P1iIV.d.ts → policy-types-n0uRTsW8.d.ts} +460 -632
- package/dist/postgrest-CEgRbefE.d.ts +100 -0
- package/dist/postgrest-DAjUkF9w.js +575 -0
- package/dist/{powersync-cZe4kzhL.js → powersync-BkWWCS1K.js} +23 -24
- package/dist/powersync-DISt6SUe.js +62 -0
- package/dist/powersync-MMJ2mI2q.js +1 -0
- package/dist/preset/index.d.ts +146 -0
- package/dist/preset/index.js +1 -0
- package/dist/preset-DZdU0tne.js +1768 -0
- package/dist/principal-source-pHneukrx.js +103 -0
- package/dist/prisma/index.d.ts +6 -3
- package/dist/prisma/index.js +2 -2
- package/dist/{problem-CnWraVhC.js → problem-CTviyH5L.js} +13 -23
- package/dist/{problem-details-rIIo8B2C.d.ts → problem-details-B45V5d2b.d.ts} +1 -1
- package/dist/{problem-details-DECUnXAn.js → problem-details-cn5X30gZ.js} +43 -40
- package/dist/problem-types-CJ2325SZ.js +5 -0
- package/dist/{prompt-CXYhLfsS.js → prompt-DfZLJLIn.js} +2 -2
- package/dist/{protected-BN7BUdY1.js → protected-BlF0F6wL.js} +21 -4
- package/dist/{protected-B3_P7xuw.d.ts → protected-RFGpakN9.d.ts} +16 -8
- package/dist/{provider-Bi-0HNL3.js → provider-B1al-AZz.js} +2 -2
- package/dist/{provider-kwHC9CZD.d.ts → provider-DILL9oPK.d.ts} +1 -1
- package/dist/{provider-store-Ctt-81Ni.js → provider-store-DM6DNcta.js} +2 -2
- package/dist/pull-CvpINcMK.js +1 -0
- package/dist/pull-jEwbf80J.js +256 -0
- package/dist/push-BD4f15co.js +116 -0
- package/dist/pushed-policy-CqtxkV4G.js +238 -0
- package/dist/pushed-policy-DCW91KQU.d.ts +57 -0
- package/dist/react/index.d.ts +8 -8
- package/dist/react/index.js +6 -6
- package/dist/react/provider-client.d.ts +1 -1
- package/dist/react/provider-client.js +1 -2
- package/dist/react-native/index.d.ts +24 -72
- package/dist/react-native/index.js +29 -25
- package/dist/{refs-f3imMjNW.js → refs-K6eWUJ0H.js} +1 -1
- package/dist/{relation-walk-BXnlLtg2.js → relation-walk-3OyDBF0S.js} +2 -2
- package/dist/{relations-CvmSpG67.js → relations-BnCWnJGI.js} +3 -3
- package/dist/renames-CGj7YwcQ.js +175 -0
- package/dist/{replay-COpmZUfx.d.ts → replay-Bkm-Ne4l.d.ts} +1 -1
- package/dist/{replay-BsOyTrdV.js → replay-Du1tJjG7.js} +2 -1
- package/dist/{request-context-BVM7aWNs.js → request-context-C81Pip9n.js} +3 -3
- package/dist/request-schema-CMreVuFM.js +148 -0
- package/dist/resend/index.d.ts +126 -0
- package/dist/resend/index.js +379 -0
- package/dist/{resource-relations-D1Un3pcz.js → resource-relations-D_jw0BFx.js} +1 -1
- package/dist/{retire-BFcxL6un.js → retire-CALjIQ7e.js} +2 -2
- package/dist/{revocations-Cy06JNx2.d.ts → revocations-R07lFBnX.d.ts} +2 -0
- package/dist/rls-BAqP4q66.js +336 -0
- package/dist/{rls-BEktUaqg.js → rls-DTvYd-lI.js} +288 -690
- package/dist/{role-builder-B4GbKM-i.js → role-builder-uWQZ4v84.js} +14 -207
- package/dist/{rpc-nYC3cR_u.js → rpc-VSl5ylaQ.js} +7 -7
- package/dist/run-CUKuz0A8.js +723 -0
- package/dist/run-DDwUaJDU.js +1 -0
- package/dist/run-ticket-DocwaTKn.d.ts +124 -0
- package/dist/run-ticket-sxFI6LAk.js +337 -0
- package/dist/{runtime-D_tMXnsq.js → runtime-D3VTAiCA.js} +1 -1
- package/dist/{saas-DtaA4JuW.js → saas-BCXRuXca.js} +16 -14
- package/dist/scan-qvOe0hS3.js +29 -0
- package/dist/{schema-DjQBcAP9.js → schema-B4v0Qrac.js} +102 -8
- package/dist/schema-yLuBWWsh.js +130 -0
- package/dist/scim/index.d.ts +2 -2
- package/dist/scim/index.js +1 -2
- package/dist/{scim-vFR1O5oG.js → scim-ClHtpyV3.js} +208 -76
- package/dist/{scopes-tvpa34ep.js → scopes-CUPSjo9q.js} +12 -7
- package/dist/server/index.d.ts +12 -143
- package/dist/server/index.js +12 -9
- package/dist/server-C3WXAHZj.js +453 -0
- package/dist/{server-types-DdqBwZN_.d.ts → server-types-CKQiCnON.d.ts} +51 -68
- package/dist/{sha256-BO0swRXL.js → sha256-D9ihqmvd.js} +8 -1
- package/dist/{shared-1uhI-e-b.js → shared-BAK8t4Uo.js} +20 -9
- package/dist/{shared-JhMeOsDF.js → shared-DvvFzYXe.js} +8 -9
- package/dist/signals-D3NcTKUS.js +32 -0
- package/dist/sink-4-eQIRWf.d.ts +225 -0
- package/dist/sink-BEZSlMS_.js +957 -0
- package/dist/{skills-BZdRQkxs.js → skills-B6lVdD_W.js} +13 -6
- package/dist/skills-CTYwkl44.js +51 -0
- package/dist/snapshot-B7DkYg6g.js +269 -0
- package/dist/{snapshot-cache-Cod40D-X.js → snapshot-cache-DZHQ0KF6.js} +11 -5
- package/dist/{snapshot-cache-J5T7t_vD.d.ts → snapshot-cache-PXI-vGpY.d.ts} +7 -5
- package/dist/solid/index.d.ts +11 -12
- package/dist/solid/index.js +7 -7
- package/dist/solid-start/index.d.ts +52 -0
- package/dist/solid-start/index.js +49 -0
- package/dist/{sources-Dljy06zL.d.ts → sources-Xc4zkszI.d.ts} +7 -13
- package/dist/{sources-B1-b-R0t.js → sources-vs5dGOsS.js} +125 -119
- package/dist/{sql-t8teWOfo.js → sql-B5T1IL83.js} +13 -1
- package/dist/src-Cu2m75uo.js +1860 -0
- package/dist/ssf/index.d.ts +4 -4
- package/dist/ssf/index.js +384 -47
- package/dist/standard-webhooks-DgFFD-Ga.js +228 -0
- package/dist/standard-webhooks-rbD7LS6h.d.ts +88 -0
- package/dist/storage-C2bWdvJH.js +132 -0
- package/dist/{store-ILkLUj_o.js → store-BDutJkDL.js} +40 -53
- package/dist/{store-options-CbUHDoSe.js → store-options-u0ycEe8s.js} +26 -21
- package/dist/{stores-Cxz_80g-.d.ts → stores-BUGNbJTt.d.ts} +7 -8
- package/dist/{stores-BHXdSbw9.js → stores-CGhM8BN_.js} +2 -2
- package/dist/{stream-Dwsg6WwE.d.ts → stream-CeCMJmBB.d.ts} +2 -2
- package/dist/{stream-BMui98KK.js → stream-CvdUS9V1.js} +9 -2
- package/dist/style-DiKWnAvn.js +1 -0
- package/dist/{style-CTm1AXDT.js → style-Uao76wO7.js} +3 -2
- package/dist/subject-BGoM5o8B.js +17 -0
- package/dist/supabase/index.d.ts +23 -106
- package/dist/supabase/index.js +5 -4
- package/dist/supabase/middleware.d.ts +7 -6
- package/dist/supabase/middleware.js +13 -11
- package/dist/supabase-By_frk3U.js +92 -0
- package/dist/{supabase-hook-Cva3ikXz.js → supabase-hook-BMoEhZir.js} +960 -64
- package/dist/supabase-hook-CCw5m35C.js +1 -0
- package/dist/{supabase-C1TWlnYt.js → supabase-x5JtR2tc.js} +99 -206
- package/dist/support-session-C6xJQYut.js +158 -0
- package/dist/svelte/Protected.svelte +4 -4
- package/dist/svelte/index.d.ts +7 -7
- package/dist/svelte/index.js +10 -10
- package/dist/svelte/runtime.d.ts +3 -3
- package/dist/svelte/runtime.js +3 -3
- package/dist/svelte/source.d.ts +7 -7
- package/dist/svelte/source.js +4 -4
- package/dist/sveltekit/index.d.ts +51 -0
- package/dist/sveltekit/index.js +27 -0
- package/dist/tanstack-start/index.d.ts +51 -0
- package/dist/tanstack-start/index.js +40 -0
- package/dist/target-Bw37TFNA.js +51 -0
- package/dist/{tenancy-DshjqY0n.js → tenancy-DN2QAx9z.js} +5 -5
- package/dist/terminal/index.d.ts +11 -9
- package/dist/terminal/index.js +23 -287
- package/dist/testing/index.d.ts +311 -38
- package/dist/testing/index.js +3475 -201
- package/dist/testing/saas/index.d.ts +9 -8
- package/dist/testing/saas/index.js +2 -2
- package/dist/testing/saas/permissions.d.ts +1 -1
- package/dist/testing/saas/permissions.js +1 -2
- package/dist/text-BMFRfBqc.js +8 -0
- package/dist/{text-diff-BdkkYSbi.js → text-diff-BQcUapOb.js} +1 -1
- package/dist/thenable-yD7SabqG.js +31 -0
- package/dist/time-DkWjdL98.js +71 -0
- package/dist/{token-Bx9qy30p.js → token-BLZcjQgt.js} +15 -6
- package/dist/{tool-refusal-CQ7OEia9.js → tool-refusal-CMLN5xhn.js} +2 -2
- package/dist/trpc/index.d.ts +12 -9
- package/dist/trpc/index.js +16 -14
- package/dist/types-8RnwUAvE.d.ts +107 -0
- package/dist/{store-9KO4BlkB.d.ts → types-B3_ooZgZ.d.ts} +100 -75
- package/dist/{types-Br9IXUBG.d.ts → types-BdtSDbBO.d.ts} +77 -17
- package/dist/types-BtHtcKMr.d.ts +157 -0
- package/dist/{types-CqrjB9o6.d.ts → types-BzzaHxt3.d.ts} +23 -11
- package/dist/types-C791HFu9.d.ts +332 -0
- package/dist/types-C863OQiR.d.ts +57 -0
- package/dist/{types-ByUo56un.d.ts → types-CVZSNocA.d.ts} +23 -22
- package/dist/{types-DHrmBJLH.d.ts → types-CX7AvRqP.d.ts} +7 -7
- package/dist/types-C_IiEs64.d.ts +65 -0
- package/dist/{types-7rJVLWe5.d.ts → types-Dfv0aTER.d.ts} +63 -11
- package/dist/types-DqzsnlSA.js +67 -0
- package/dist/{types-DpWfQdSh.d.ts → types-Druu9wLM.d.ts} +46 -11
- package/dist/{types-CIlTojhq.d.ts → types-_WhUP7ud.d.ts} +9 -6
- package/dist/{types-CUcFZfpU.d.ts → types-lUlG3TVd.d.ts} +2 -1
- package/dist/unplugin/index.d.ts +1 -1
- package/dist/unplugin/index.js +2 -2
- package/dist/usage-CRVl9V3t.js +32 -0
- package/dist/usage-CZpSQP6L.js +1 -0
- package/dist/{usage-CG9nOYZw.js → usage-SveTRTyr.js} +54 -11
- package/dist/{validation-error-BSSw0l_8.d.ts → validation-error-DHUrAkku.d.ts} +1 -1
- package/dist/{validity-dVrUEPJt.js → validity-CZ7-y0Cj.js} +32 -15
- package/dist/{verifier-DMr_Zmb_.js → verifier-DHuh-okk.js} +18 -7
- package/dist/{verify-BztUB3GX.js → verify-BaAKx7t6.js} +645 -50
- package/dist/{version-BEogC-rB.js → version-CEbQ5UeM.js} +4 -3
- package/dist/version-DXkYUISx.js +1 -0
- package/dist/{views-CJsrBS1f.js → views-DTIIO-oQ.js} +22 -5
- package/dist/{permission-types-Dg39z9Kv.d.ts → vocabulary-CN8H_9UF.d.ts} +67 -2
- package/dist/vue/index.d.ts +9 -10
- package/dist/vue/index.js +8 -8
- package/dist/waiter-B986w1oK.d.ts +36 -0
- package/dist/waiter-BGUtGYoU.js +67 -0
- package/dist/watch--ovlPOc0.js +1 -0
- package/dist/{watch-zeucB7eF.js → watch-vea54PRw.js} +44 -5
- package/dist/webmcp/index.d.ts +2 -2
- package/dist/webmcp/index.js +3 -3
- package/dist/where-scope-C9vfEphl.js +306 -0
- package/dist/who-can-DWBAcaCQ.js +364 -0
- package/dist/wire-delegation-Cv3W2eaM.js +36 -0
- package/dist/wire-denial-C7PaVYEM.js +27 -0
- package/dist/workflow/index.d.ts +5 -0
- package/dist/workflow/index.js +223 -0
- package/dist/workflow-sdk/index.d.ts +56 -0
- package/dist/workflow-sdk/index.js +78 -0
- package/dist/{wrap-Cr93qqdP.d.ts → wrap-C5jC6sKI.d.ts} +2 -1
- package/dist/{wrap-DWsU_5Bd.js → wrap-gX61EtpB.js} +7 -6
- package/package.json +136 -37
- package/schemas/access-event-v1.json +118 -0
- package/schemas/approval-request-v1.json +34 -1
- package/schemas/approval-signature-v1.json +94 -0
- package/schemas/automation-event-v1.json +113 -0
- package/schemas/capability-v1.json +84 -0
- package/schemas/catalog-event-v1.json +87 -0
- package/schemas/catalog-v1.json +123 -12
- package/schemas/cli-commands-v1.json +164 -0
- package/schemas/cli-result-v1.json +96 -0
- package/schemas/cloud-api-v1.json +5407 -0
- package/schemas/connector-v1.json +408 -0
- package/schemas/credential-event-v1.json +81 -0
- package/schemas/credential-v1.json +134 -0
- package/schemas/decision-event-v1.json +288 -0
- package/schemas/delivery-event-v1.json +117 -0
- package/schemas/directory-event-v1.json +85 -0
- package/schemas/evidence-export-v1.json +54 -0
- package/schemas/membership-event-v1.json +93 -0
- package/schemas/policy-v1.json +68 -0
- package/schemas/pushed-policy-v1.json +236 -0
- package/schemas/run-v1.json +162 -0
- package/schemas/snapshot-v1.json +138 -0
- package/schemas/supabase-claims-v1.json +4 -4
- package/schemas/supabase-manifest-v1.json +5 -1
- package/schemas/support-session-v1.json +111 -0
- package/skills/permdock/SKILL.md +16 -12
- package/skills/permdock-agents/SKILL.md +40 -23
- package/skills/permdock-agents/references/operations-automations-chat.md +221 -0
- package/skills/permdock-agents/references/runtimes.md +22 -18
- package/skills/permdock-approvals/SKILL.md +29 -13
- package/skills/permdock-approvals/references/delivery-and-waiters.md +172 -0
- package/skills/permdock-approvals/references/stores-and-resume.md +21 -7
- package/skills/permdock-audit/SKILL.md +3 -3
- package/skills/permdock-credentials/SKILL.md +5 -5
- package/skills/permdock-credentials/references/tokens-keys-links.md +14 -10
- package/skills/permdock-data/SKILL.md +6 -6
- package/skills/permdock-data/references/queries-and-rls.md +10 -9
- package/skills/permdock-data/references/relationships.md +3 -3
- package/skills/permdock-tenancy/SKILL.md +20 -7
- package/skills/permdock-tenancy/references/contacts-and-support-sessions.md +122 -0
- package/skills/permdock-tenancy/references/ownership-and-custom-roles.md +6 -4
- package/skills/permdock-wire/SKILL.md +17 -11
- package/skills/permdock-wire/references/adapters.md +139 -51
- package/skills/permdock-wire/references/policy-options.md +5 -5
- package/skills/permdock-wire/references/presets-and-recipes.md +58 -0
- package/dist/approvals-DZL76lKW.js +0 -240
- package/dist/arazzo-CD8d0WLb.js +0 -54
- package/dist/catalog-6yWAX6Ps.js +0 -2
- package/dist/catalog-WHG4kBq7.js +0 -48
- package/dist/cloud-C7bSDgX4.js +0 -50
- package/dist/cloud-PeBN3IEn.js +0 -118
- package/dist/collect-Bw2Jdq1q.js +0 -2
- package/dist/collect-CQx4hX4N.js +0 -83
- package/dist/commands-Cpip4ULx.js +0 -97
- package/dist/config-DLt6BvV7.js +0 -36
- package/dist/diff-Cnghh_Ip.js +0 -48
- package/dist/doctor-CuVJvhV_.js +0 -53
- package/dist/duration-xK2jGFVc.js +0 -25
- package/dist/errors-CWfoNg9N.js +0 -47
- package/dist/errors-DRnGZHzF.js +0 -30
- package/dist/expiry-BoBJ8Tvc.js +0 -7
- package/dist/fields-fwfXN01n.js +0 -1016
- package/dist/headers-BZSDieNT.js +0 -6
- package/dist/headers-Cf-zWvsO.d.ts +0 -6
- package/dist/ids-DC4V4CFu.js +0 -18
- package/dist/index-DgM7w96K.d.ts +0 -6
- package/dist/index-Dz7didpC.d.ts +0 -201
- package/dist/index-UdVQgq48.d.ts +0 -550
- package/dist/load-B_shHrmd.js +0 -2
- package/dist/manifest-BngWKryL.js +0 -770
- package/dist/may-use-BOn_dR_w.js +0 -78
- package/dist/openapi-DcQ1Kg40.js +0 -164
- package/dist/ownership-BgnbOJFT.js +0 -851
- package/dist/permdock-L26udHSk.js +0 -3646
- package/dist/powersync-BFSbSElQ.js +0 -62
- package/dist/powersync-DCDgZgfZ.js +0 -2
- package/dist/rls-55DQTuf5.js +0 -250
- package/dist/run-DMcNW_8T.js +0 -174
- package/dist/server-ZYEHtNHS.js +0 -268
- package/dist/sink-BTtmfPnE.js +0 -141
- package/dist/sink-CPN4zLfs.d.ts +0 -104
- package/dist/skills-Dle4ZoLF.js +0 -56
- package/dist/snapshot-Dc9CHPME.js +0 -1078
- package/dist/src-Bb7no-hS.js +0 -639
- package/dist/subject-C6dLxqHU.js +0 -24
- package/dist/supabase-Dbqr141s.js +0 -83
- package/dist/supabase-hook-BULg7Ut_.js +0 -2
- package/dist/thenable-QSmvt-vZ.js +0 -65
- package/dist/types-C0dee0Qf.d.ts +0 -197
- package/dist/types-DvupZE0w.d.ts +0 -9
- package/dist/usage-4G6t643F.js +0 -42
- package/dist/usage-iFLJ0-rr.js +0 -2
- package/dist/vocabulary-hhEFLFoL.d.ts +0 -65
- 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 };
|