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
|
@@ -1,13 +1,16 @@
|
|
|
1
1
|
import { t as compact } from "./compact-CAf557ZB.js";
|
|
2
2
|
import { n as freezeDeep } from "./freeze-CrU8nQeX.js";
|
|
3
3
|
import { r as approverLeaves } from "./approvers-CqPOLD-o.js";
|
|
4
|
-
import { t as describe } from "./describe-
|
|
5
|
-
import {
|
|
6
|
-
import {
|
|
7
|
-
import {
|
|
8
|
-
import {
|
|
9
|
-
import {
|
|
10
|
-
import {
|
|
4
|
+
import { t as describe } from "./describe-BybMRY7A.js";
|
|
5
|
+
import { i as getRegistry, n as findPermission } from "./permission-registry-Br4jSNVi.js";
|
|
6
|
+
import { t as assertAppData } from "./app-data-MuyzVqX8.js";
|
|
7
|
+
import { a as durationOf, i as dateAt, u as isoAt } from "./time-DkWjdL98.js";
|
|
8
|
+
import { r as relationReader, t as pendingRelations } from "./relations-BnCWnJGI.js";
|
|
9
|
+
import { n as resolveRelated } from "./relation-walk-3OyDBF0S.js";
|
|
10
|
+
import { n as toWireDelegation } from "./wire-delegation-Cv3W2eaM.js";
|
|
11
|
+
import { i as approverRelationKey, s as ApprovalError, t as APPROVAL_HEADER } from "./types-DqzsnlSA.js";
|
|
12
|
+
import { c as listAllApprovals, n as assertApprover } from "./store-BDutJkDL.js";
|
|
13
|
+
import { n as parseApprovalHeader } from "./approval-header-CJACtHkv.js";
|
|
11
14
|
//#region src/approvals/relations.ts
|
|
12
15
|
const DEFAULT_PARENT_DEPTH = 16;
|
|
13
16
|
/** Every approver a request names: `by`, each stage and its escalation, and `escalation.to`, inside `anyOf` groups too. */
|
|
@@ -71,7 +74,7 @@ async function approverRelations(request, subject, options) {
|
|
|
71
74
|
const registry = getRegistry(options.permissions);
|
|
72
75
|
const cache = /* @__PURE__ */ new Map();
|
|
73
76
|
const reader = relationReader(options.relations, cache, registry);
|
|
74
|
-
const now = (options.now
|
|
77
|
+
const now = dateAt(options.now).getTime() / 1e3;
|
|
75
78
|
const holds = async (item) => {
|
|
76
79
|
const start = await startOf(item, request.resource.type, id, reader, cache, registry);
|
|
77
80
|
if (start === void 0) return false;
|
|
@@ -133,7 +136,7 @@ function permissionMeta(permission) {
|
|
|
133
136
|
resource: permission.resource
|
|
134
137
|
};
|
|
135
138
|
}
|
|
136
|
-
function
|
|
139
|
+
function summarizeSubject(subject) {
|
|
137
140
|
const principal = subject.principal;
|
|
138
141
|
return compact({
|
|
139
142
|
principal: principal === null ? null : compact({
|
|
@@ -146,10 +149,10 @@ function summariseSubject(subject) {
|
|
|
146
149
|
kind: subject.actor.kind
|
|
147
150
|
},
|
|
148
151
|
session: subject.session,
|
|
149
|
-
delegation: subject.delegation === void 0 ? void 0 : compact({
|
|
152
|
+
delegation: toWireDelegation(subject.delegation === void 0 ? void 0 : compact({
|
|
150
153
|
scopes: subject.delegation.scopes,
|
|
151
154
|
authorizationDetails: subject.delegation.authorizationDetails
|
|
152
|
-
})
|
|
155
|
+
}))
|
|
153
156
|
});
|
|
154
157
|
}
|
|
155
158
|
/**
|
|
@@ -158,13 +161,14 @@ function summariseSubject(subject) {
|
|
|
158
161
|
* extends it.
|
|
159
162
|
*/
|
|
160
163
|
function approvalTtl(storeTtl, approval) {
|
|
161
|
-
if (storeTtl !== void 0 && (
|
|
162
|
-
const base = storeTtl ??
|
|
163
|
-
const grant = approval === void 0 || approval === "human" ? void 0 :
|
|
164
|
-
return grant === void 0 ? base : Math.min(base, grant
|
|
164
|
+
if (storeTtl !== void 0 && durationOf(storeTtl) === void 0) throw new RangeError(`PermDock: approval ttl must be a whole number of seconds above 0, got ${String(storeTtl)}`);
|
|
165
|
+
const base = storeTtl ?? 3600;
|
|
166
|
+
const grant = approval === void 0 || approval === "human" ? void 0 : durationOf(approval.ttl);
|
|
167
|
+
return grant === void 0 ? base : Math.min(base, grant);
|
|
165
168
|
}
|
|
166
169
|
async function requestApproval(store, decision, meta) {
|
|
167
|
-
|
|
170
|
+
if (meta.x !== void 0) assertAppData(meta.x, "x of an approval request");
|
|
171
|
+
const now = dateAt(meta.now);
|
|
168
172
|
const leaf = permissionMeta(meta.permission);
|
|
169
173
|
const approval = decision.grant.approval;
|
|
170
174
|
const approvers = approval === void 0 || approval === "human" ? void 0 : compact({
|
|
@@ -179,18 +183,20 @@ async function requestApproval(store, decision, meta) {
|
|
|
179
183
|
const ttl = approvalTtl(meta.ttl ?? store.ttl, approval);
|
|
180
184
|
const request = freezeDeep(compact({
|
|
181
185
|
v: 1,
|
|
186
|
+
id: globalThis.crypto.randomUUID(),
|
|
182
187
|
token: decision.token,
|
|
183
188
|
permission: leaf.key,
|
|
184
189
|
scope: leaf.scope,
|
|
185
190
|
resource: meta.resource ?? { type: leaf.resource },
|
|
186
|
-
subject:
|
|
191
|
+
subject: summarizeSubject(meta.subject),
|
|
187
192
|
membership: meta.membership,
|
|
188
193
|
approvers,
|
|
189
194
|
detail: meta.detail ?? describe(decision).detail,
|
|
190
195
|
adapter: meta.adapter,
|
|
191
196
|
createdAt: now.toISOString(),
|
|
192
|
-
expiresAt:
|
|
193
|
-
status: "pending"
|
|
197
|
+
expiresAt: isoAt(now.getTime() + ttl * 1e3),
|
|
198
|
+
status: "pending",
|
|
199
|
+
x: meta.x
|
|
194
200
|
}));
|
|
195
201
|
await store.create(request);
|
|
196
202
|
return request;
|
|
@@ -220,28 +226,29 @@ async function vouchApproval(store, token, verdict) {
|
|
|
220
226
|
vouched: verdict.rule
|
|
221
227
|
}));
|
|
222
228
|
}
|
|
223
|
-
async function inspectApproval(store, token,
|
|
224
|
-
|
|
229
|
+
async function inspectApproval(store, token, at) {
|
|
230
|
+
const now = dateAt(at).getTime();
|
|
231
|
+
await store.expire({ epochMilliseconds: now });
|
|
225
232
|
const request = await store.get(token);
|
|
226
233
|
if (request === null) return {
|
|
227
234
|
ok: false,
|
|
228
|
-
|
|
235
|
+
cause: "approval-not-found"
|
|
229
236
|
};
|
|
230
237
|
if (request.status === "pending") return {
|
|
231
238
|
ok: false,
|
|
232
|
-
|
|
239
|
+
cause: "approval-pending"
|
|
233
240
|
};
|
|
234
241
|
if (request.status === "rejected") return {
|
|
235
242
|
ok: false,
|
|
236
|
-
|
|
243
|
+
cause: "approval-rejected"
|
|
237
244
|
};
|
|
238
245
|
if (request.consumedAt !== void 0) return {
|
|
239
246
|
ok: false,
|
|
240
|
-
|
|
247
|
+
cause: "approval-consumed"
|
|
241
248
|
};
|
|
242
|
-
if (request.status === "expired" || Date.parse(request.expiresAt) <= now
|
|
249
|
+
if (request.status === "expired" || Date.parse(request.expiresAt) <= now) return {
|
|
243
250
|
ok: false,
|
|
244
|
-
|
|
251
|
+
cause: "approval-expired"
|
|
245
252
|
};
|
|
246
253
|
return {
|
|
247
254
|
ok: true,
|
|
@@ -249,17 +256,18 @@ async function inspectApproval(store, token, now = /* @__PURE__ */ new Date()) {
|
|
|
249
256
|
};
|
|
250
257
|
}
|
|
251
258
|
/** Inspects `token` and, when it is approved, consumes it so it resumes once. */
|
|
252
|
-
async function consumeApproval(store, token,
|
|
259
|
+
async function consumeApproval(store, token, at) {
|
|
260
|
+
const now = { epochMilliseconds: dateAt(at).getTime() };
|
|
253
261
|
const inspected = await inspectApproval(store, token, now);
|
|
254
262
|
if (!inspected.ok) return inspected;
|
|
255
263
|
if (typeof store.consume !== "function") return {
|
|
256
264
|
ok: false,
|
|
257
|
-
|
|
265
|
+
cause: "approval-not-found"
|
|
258
266
|
};
|
|
259
267
|
const consumed = await store.consume(token, now);
|
|
260
268
|
if (consumed === null) return {
|
|
261
269
|
ok: false,
|
|
262
|
-
|
|
270
|
+
cause: "approval-consumed"
|
|
263
271
|
};
|
|
264
272
|
return {
|
|
265
273
|
ok: true,
|
|
@@ -332,13 +340,13 @@ async function resumeDecision(input) {
|
|
|
332
340
|
inspected = await inspectApproval(store, token, input.now);
|
|
333
341
|
if (inspected.ok) {
|
|
334
342
|
const { request } = inspected;
|
|
335
|
-
if (request.permission !== input.permission.key || request.resource.id !== void 0 && request.resource.id !== input.resource.id) return approvalDenied("approval-mismatch");
|
|
343
|
+
if (request.permission !== input.permission.key || request.resource.id !== void 0 && request.resource.id !== input.resource.id || request.subject.principal?.id !== input.subject.principal?.id) return approvalDenied("approval-mismatch");
|
|
336
344
|
if (input.consume !== false) inspected = await consumeApproval(store, token, input.now);
|
|
337
345
|
}
|
|
338
346
|
} catch {
|
|
339
347
|
return approvalDenied("approval-not-found");
|
|
340
348
|
}
|
|
341
|
-
if (!inspected.ok) return approvalDenied(inspected.
|
|
349
|
+
if (!inspected.ok) return approvalDenied(inspected.cause);
|
|
342
350
|
const principal = input.subject.principal;
|
|
343
351
|
if (principal === null) return approvalDenied("approval-mismatch");
|
|
344
352
|
return {
|
|
@@ -383,16 +391,15 @@ async function cancelApprovals(store, filter, meta) {
|
|
|
383
391
|
}
|
|
384
392
|
}))).filter(Boolean).length;
|
|
385
393
|
}
|
|
394
|
+
/** The token of a `PermDock-Approval` field: one RFC 9651 sf-token Item with no parameters, else `undefined`. */
|
|
386
395
|
function readApprovalHeader(headers) {
|
|
387
|
-
|
|
388
|
-
if (value === null || value.trim() === "") return;
|
|
389
|
-
return value.trim();
|
|
396
|
+
return parseApprovalHeader(headers.get(APPROVAL_HEADER));
|
|
390
397
|
}
|
|
391
398
|
function resumeFromHeader(store, headers, now) {
|
|
392
399
|
const token = readApprovalHeader(headers);
|
|
393
400
|
if (token === void 0) return Promise.resolve({
|
|
394
401
|
ok: false,
|
|
395
|
-
|
|
402
|
+
cause: "approval-not-found"
|
|
396
403
|
});
|
|
397
404
|
return inspectApproval(store, token, now);
|
|
398
405
|
}
|
|
@@ -409,7 +416,7 @@ function resumeFromHeader(store, headers, now) {
|
|
|
409
416
|
*/
|
|
410
417
|
async function storedApprovalToken(store, decision, options = {}) {
|
|
411
418
|
if (store === void 0 || decision.outcome !== "approval-required") return;
|
|
412
|
-
const now = (options.now
|
|
419
|
+
const now = dateAt(options.now).getTime();
|
|
413
420
|
try {
|
|
414
421
|
const record = await store.get(decision.token);
|
|
415
422
|
if (record === null || record.status === "pending" && options.denyPending !== true || record.status === "expired" || Date.parse(record.expiresAt) <= now) return;
|
|
@@ -419,4 +426,4 @@ async function storedApprovalToken(store, decision, options = {}) {
|
|
|
419
426
|
}
|
|
420
427
|
}
|
|
421
428
|
//#endregion
|
|
422
|
-
export { requestApproval as a, resumeFromHeader as c, vouchApproval as d, approverPermissions as f, readApprovalHeader as i, storedApprovalToken as l, approverRelations as m, consumeApproval as n, resolveApproval as o, heldPermissions as p, inspectApproval as r, resumeDecision as s, cancelApprovals as t,
|
|
429
|
+
export { requestApproval as a, resumeFromHeader as c, vouchApproval as d, approverPermissions as f, readApprovalHeader as i, storedApprovalToken as l, approverRelations as m, consumeApproval as n, resolveApproval as o, heldPermissions as p, inspectApproval as r, resumeDecision as s, cancelApprovals as t, summarizeSubject as u };
|
package/dist/hono/index.d.ts
CHANGED
|
@@ -1,8 +1,9 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import {
|
|
3
|
-
import {
|
|
4
|
-
import {
|
|
5
|
-
import {
|
|
1
|
+
import { T as Policy, j as PolicyVocabulary, rr as Principal } from "../policy-types-n0uRTsW8.js";
|
|
2
|
+
import { w as Permission } from "../vocabulary-CN8H_9UF.js";
|
|
3
|
+
import { r as PermDock } from "../permdock-SV8ZINYT.js";
|
|
4
|
+
import { n as RevocationFeed } from "../revocations-R07lFBnX.js";
|
|
5
|
+
import { D as ConnectionOptions, T as Connection, f as InvalidSignatureError, i as OpenApiHooks, o as ProtectOptions, v as discoverViaSignatureAgent, x as webBotAuthVerifier } from "../server-types-CKQiCnON.js";
|
|
6
|
+
import { t as ServerAdapterOptions } from "../bind-DOyrv6zi.js";
|
|
6
7
|
import { Context, Hono, MiddlewareHandler } from "hono";
|
|
7
8
|
import { SSEMessage, SSEStreamingApi } from "hono/streaming";
|
|
8
9
|
import { WSEvents } from "hono/ws";
|
|
@@ -12,15 +13,17 @@ type HonoPermDockOptions<TUser = unknown> = ServerAdapterOptions<Context, TUser>
|
|
|
12
13
|
readonly revocations?: RevocationFeed;
|
|
13
14
|
};
|
|
14
15
|
/** The `Variables` both middlewares set; Hono merges them into the route's Env. */
|
|
15
|
-
type
|
|
16
|
+
type HonoPermDockEnv<TData = unknown, V extends PolicyVocabulary = PolicyVocabulary> = {
|
|
16
17
|
readonly Variables: {
|
|
17
18
|
readonly permdock: PermDock<V>;
|
|
18
19
|
readonly permdockData: TData;
|
|
19
20
|
};
|
|
20
21
|
};
|
|
21
22
|
type HonoPermDock<V extends PolicyVocabulary = PolicyVocabulary> = {
|
|
22
|
-
|
|
23
|
-
readonly
|
|
23
|
+
/** The `PermDock` for one request, for code the middleware does not run before. */
|
|
24
|
+
readonly getPermDock: (c: Context) => Promise<PermDock<V>>;
|
|
25
|
+
readonly middleware: () => MiddlewareHandler<HonoPermDockEnv<unknown, V>>;
|
|
26
|
+
readonly protect: <TData = unknown>(permission: Permission | null, data?: (c: Context) => TData | Promise<TData>, protectOptions?: ProtectOptions) => MiddlewareHandler<HonoPermDockEnv<NonNullable<TData>, V>>;
|
|
24
27
|
/** A long-lived connection for the request behind `c`. */
|
|
25
28
|
readonly connection: (c: Context, connectionOptions?: ConnectionOptions) => Promise<Connection>;
|
|
26
29
|
/** `upgradeWebSocket` events that close with `1008` when the connection aborts. */
|
|
@@ -45,4 +48,4 @@ type SseOptions<T> = {
|
|
|
45
48
|
};
|
|
46
49
|
export declare function createPermDock<TUser, TPrincipal extends Principal = Principal, V extends PolicyVocabulary = PolicyVocabulary>(policy: Policy<TUser, TPrincipal, V>, options: HonoPermDockOptions<TUser>): HonoPermDock<V>;
|
|
47
50
|
//#endregion
|
|
48
|
-
export { type HonoPermDock, type HonoPermDockOptions, InvalidSignatureError, type
|
|
51
|
+
export { type HonoPermDock, type HonoPermDockEnv, type HonoPermDockOptions, InvalidSignatureError, type SseOptions, discoverViaSignatureAgent, webBotAuthVerifier };
|
package/dist/hono/index.js
CHANGED
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
import { t as compact } from "../compact-CAf557ZB.js";
|
|
2
|
-
import { r as PermDockRevokedError } from "../errors-
|
|
3
|
-
import {
|
|
4
|
-
import { t as problemFromError } from "../map-error-
|
|
5
|
-
import { r as bindKernel } from "../bind-
|
|
6
|
-
import {
|
|
2
|
+
import { r as PermDockRevokedError } from "../errors-BKy0EfhN.js";
|
|
3
|
+
import { d as discoverViaSignatureAgent, m as webBotAuthVerifier, u as InvalidSignatureError } from "../evaluations-beAooV0n.js";
|
|
4
|
+
import { t as problemFromError } from "../map-error-Dr70oA_3.js";
|
|
5
|
+
import { r as bindKernel } from "../bind-CAvgUuKs.js";
|
|
6
|
+
import { a as onRevoked, n as closeReason, r as guardIterable, t as POLICY_VIOLATION } from "../stream-CvdUS9V1.js";
|
|
7
7
|
import { Hono } from "hono";
|
|
8
8
|
//#region src/hono/create.ts
|
|
9
9
|
function socket(connection, events) {
|
|
@@ -11,7 +11,7 @@ function socket(connection, events) {
|
|
|
11
11
|
...events,
|
|
12
12
|
onOpen: (evt, ws) => {
|
|
13
13
|
onRevoked(connection, (problem) => {
|
|
14
|
-
ws.close(POLICY_VIOLATION, problem
|
|
14
|
+
ws.close(POLICY_VIOLATION, closeReason(problem));
|
|
15
15
|
});
|
|
16
16
|
if (!connection.signal.aborted) events.onOpen?.(evt, ws);
|
|
17
17
|
},
|
|
@@ -61,16 +61,16 @@ function mapDownstream(c) {
|
|
|
61
61
|
}
|
|
62
62
|
}
|
|
63
63
|
function createPermDock(policy, options) {
|
|
64
|
-
const { kernel, bind, scopeOf, handlerScope, attach, guard: runGuard } = bindKernel(policy, options, "hono", (c) => c.req.raw);
|
|
65
|
-
const
|
|
64
|
+
const { kernel, bind, scopeOf, handlerScope, getPermDock, attach, guard: runGuard } = bindKernel(policy, options, "hono", (c) => c.req.raw);
|
|
65
|
+
const middleware = () => async (c, next) => {
|
|
66
66
|
const attached = await attach(c);
|
|
67
67
|
if (!attached.ok) return attached.response;
|
|
68
68
|
c.set("permdock", attached.permdock);
|
|
69
69
|
await next();
|
|
70
70
|
mapDownstream(c);
|
|
71
71
|
};
|
|
72
|
-
const protect = (permission,
|
|
73
|
-
const guard = await runGuard(permission,
|
|
72
|
+
const protect = (permission, data, protectOptions) => async (c, next) => {
|
|
73
|
+
const guard = await runGuard(permission, data, c, protectOptions);
|
|
74
74
|
if (!guard.ok) return guard.response;
|
|
75
75
|
c.set("permdock", guard.permdock);
|
|
76
76
|
c.set("permdockData", guard.data);
|
|
@@ -86,7 +86,8 @@ function createPermDock(policy, options) {
|
|
|
86
86
|
return app;
|
|
87
87
|
};
|
|
88
88
|
return {
|
|
89
|
-
|
|
89
|
+
getPermDock,
|
|
90
|
+
middleware,
|
|
90
91
|
protect,
|
|
91
92
|
connection,
|
|
92
93
|
socket,
|
|
@@ -96,4 +97,4 @@ function createPermDock(policy, options) {
|
|
|
96
97
|
};
|
|
97
98
|
}
|
|
98
99
|
//#endregion
|
|
99
|
-
export { InvalidSignatureError, createPermDock, discoverViaSignatureAgent,
|
|
100
|
+
export { InvalidSignatureError, createPermDock, discoverViaSignatureAgent, webBotAuthVerifier };
|
|
@@ -0,0 +1,315 @@
|
|
|
1
|
+
import { r as isRecord, t as compact } from "./compact-CAf557ZB.js";
|
|
2
|
+
import { n as freezeDeep } from "./freeze-CrU8nQeX.js";
|
|
3
|
+
import { n as isForbiddenKey, s as splitPath } from "./paths-DXSHAMIa.js";
|
|
4
|
+
import { a as deny, i as completeGrant, n as role, p as normalizeWhere, r as allow } from "./role-builder-uWQZ4v84.js";
|
|
5
|
+
import { a as getResource, n as findPermission } from "./permission-registry-Br4jSNVi.js";
|
|
6
|
+
import { d as isSelfParented } from "./resource-relations-D_jw0BFx.js";
|
|
7
|
+
import { a as durationOf, l as isRfc3339, m as rfc3339 } from "./time-DkWjdL98.js";
|
|
8
|
+
import { r as sha256Digest } from "./sha256-D9ihqmvd.js";
|
|
9
|
+
import { _ as listPlans, m as findRole, o as flattenGrantee } from "./grantee-hxrUsbpM.js";
|
|
10
|
+
import { i as indexPolicy, t as declaredRoleNames } from "./policy-DbM5YYtV.js";
|
|
11
|
+
//#region src/core/hosted.ts
|
|
12
|
+
function memoryPolicySource(document = null) {
|
|
13
|
+
const current = document === null ? null : parsePolicyDocument(document);
|
|
14
|
+
return Object.freeze({
|
|
15
|
+
current: () => current,
|
|
16
|
+
refresh: () => Promise.resolve()
|
|
17
|
+
});
|
|
18
|
+
}
|
|
19
|
+
function rejectUnsafe(value) {
|
|
20
|
+
if (value === null || typeof value !== "object") return;
|
|
21
|
+
if (Array.isArray(value)) {
|
|
22
|
+
for (const item of value) rejectUnsafe(item);
|
|
23
|
+
return;
|
|
24
|
+
}
|
|
25
|
+
for (const key of Object.keys(value)) {
|
|
26
|
+
if (isForbiddenKey(key)) throw new Error(`PermDock: unsafe policy document key '${key}'`);
|
|
27
|
+
rejectUnsafe(value[key]);
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
/** Validates the document envelope; per-grant checks happen at merge time. */
|
|
31
|
+
function parsePolicyDocument(json) {
|
|
32
|
+
const input = typeof json === "string" ? JSON.parse(json) : json;
|
|
33
|
+
if (!isRecord(input)) throw new TypeError("PermDock: policy document must be an object");
|
|
34
|
+
const copy = JSON.parse(JSON.stringify(input));
|
|
35
|
+
rejectUnsafe(copy);
|
|
36
|
+
if (copy["v"] !== 1) throw new Error(`PermDock: unsupported policy document version '${String(copy["v"])}'`);
|
|
37
|
+
if (typeof copy["id"] !== "string" || typeof copy["fingerprint"] !== "string" || typeof copy["catalog"] !== "string" || !isRfc3339(copy["issuedAt"]) || !Array.isArray(copy["grants"])) throw new TypeError("PermDock: malformed policy document");
|
|
38
|
+
return freezeDeep(copy);
|
|
39
|
+
}
|
|
40
|
+
/** The document verified `vnd.permdock.policy+jwt` claims carry: `policy`, with `jti` as `id` and `iat` as `issuedAt`. Throws like `parsePolicyDocument`. */
|
|
41
|
+
function policyDocumentFromClaims(claims) {
|
|
42
|
+
const claim = claims["policy"];
|
|
43
|
+
const jti = claims["jti"];
|
|
44
|
+
const iat = claims["iat"];
|
|
45
|
+
if (!isRecord(claim) || typeof jti !== "string" || typeof iat !== "number") throw new TypeError("PermDock: malformed policy document");
|
|
46
|
+
return parsePolicyDocument({
|
|
47
|
+
...claim,
|
|
48
|
+
id: jti,
|
|
49
|
+
issuedAt: rfc3339(iat)
|
|
50
|
+
});
|
|
51
|
+
}
|
|
52
|
+
const COMPARISONS = /* @__PURE__ */ new Set([
|
|
53
|
+
"eq",
|
|
54
|
+
"ne",
|
|
55
|
+
"gt",
|
|
56
|
+
"gte",
|
|
57
|
+
"lt",
|
|
58
|
+
"lte",
|
|
59
|
+
"contains"
|
|
60
|
+
]);
|
|
61
|
+
function safePath(path) {
|
|
62
|
+
if (typeof path !== "string" || path.length === 0) return false;
|
|
63
|
+
return splitPath(path).every((segment) => !isForbiddenKey(segment));
|
|
64
|
+
}
|
|
65
|
+
function portableValue(value) {
|
|
66
|
+
if (value === null || typeof value === "string" || typeof value === "boolean" || typeof value === "number" && Number.isFinite(value)) return true;
|
|
67
|
+
if (Array.isArray(value)) return value.every(portableValue);
|
|
68
|
+
if (!isRecord(value)) return false;
|
|
69
|
+
const keys = Object.keys(value);
|
|
70
|
+
if (keys.length !== 1) return false;
|
|
71
|
+
if (keys[0] === "ref") return safePath(value["ref"]);
|
|
72
|
+
return keys[0] === "date" && typeof value["date"] === "string";
|
|
73
|
+
}
|
|
74
|
+
/** True for the portable subset only: no `opaque`, no `sqlFunction`, no unknown op. */
|
|
75
|
+
function isPortableCondition(value) {
|
|
76
|
+
if (!isRecord(value) || typeof value["op"] !== "string") return false;
|
|
77
|
+
const op = value["op"];
|
|
78
|
+
if (COMPARISONS.has(op)) return safePath(value["field"]) && portableValue(value["value"]);
|
|
79
|
+
switch (op) {
|
|
80
|
+
case "in":
|
|
81
|
+
case "notIn": return safePath(value["field"]) && (Array.isArray(value["value"]) || isRecord(value["value"])) && portableValue(value["value"]);
|
|
82
|
+
case "isNull": return safePath(value["field"]) && typeof value["value"] === "boolean";
|
|
83
|
+
case "and":
|
|
84
|
+
case "or": return Array.isArray(value["conditions"]) && value["conditions"].every(isPortableCondition);
|
|
85
|
+
case "not": return isPortableCondition(value["condition"]);
|
|
86
|
+
case "memberOf": return (value["scope"] === "tenant" || value["scope"] === "team" || value["scope"] === "resource") && safePath(value["field"]) && Array.isArray(value["roles"]) && value["roles"].every((item) => typeof item === "string") && (value["resource"] === void 0 || typeof value["resource"] === "string") && (value["parents"] === void 0 || Array.isArray(value["parents"]) && value["parents"].every((parent) => safePath(parent) || isRecord(parent) && safePath(parent["field"]) && typeof parent["resource"] === "string"));
|
|
87
|
+
default: return false;
|
|
88
|
+
}
|
|
89
|
+
}
|
|
90
|
+
function approvalRank(approval) {
|
|
91
|
+
if (approval === void 0) return;
|
|
92
|
+
if (approval === "human") return {
|
|
93
|
+
distinct: true,
|
|
94
|
+
stale: false,
|
|
95
|
+
quorum: 1,
|
|
96
|
+
ttl: Number.POSITIVE_INFINITY,
|
|
97
|
+
escalates: false
|
|
98
|
+
};
|
|
99
|
+
return {
|
|
100
|
+
by: approval.stages === void 0 ? JSON.stringify(approval.by) : JSON.stringify([approval.mode, approval.stages]),
|
|
101
|
+
distinct: approval.distinct !== false,
|
|
102
|
+
stale: approval.staleOn === "resource-change",
|
|
103
|
+
quorum: approval.quorum ?? 1,
|
|
104
|
+
ttl: durationOf(approval.ttl) ?? Number.POSITIVE_INFINITY,
|
|
105
|
+
escalates: approval.escalation !== void 0
|
|
106
|
+
};
|
|
107
|
+
}
|
|
108
|
+
/** A hosted approval must meet every approval a code allow requires on the permission. */
|
|
109
|
+
function approvalAtLeast(hosted, code) {
|
|
110
|
+
const mine = approvalRank(hosted);
|
|
111
|
+
for (const required of code) {
|
|
112
|
+
const theirs = approvalRank(required);
|
|
113
|
+
if (theirs === void 0) continue;
|
|
114
|
+
if (mine === void 0) return false;
|
|
115
|
+
if (theirs.distinct && !mine.distinct) return false;
|
|
116
|
+
if (theirs.stale && !mine.stale) return false;
|
|
117
|
+
if (theirs.by !== void 0 && mine.by !== theirs.by) return false;
|
|
118
|
+
if (mine.quorum < theirs.quorum || mine.ttl > theirs.ttl) return false;
|
|
119
|
+
if (mine.escalates && !theirs.escalates) return false;
|
|
120
|
+
}
|
|
121
|
+
return true;
|
|
122
|
+
}
|
|
123
|
+
/** A grantee kind this build does not know is never declared, so the hosted grant is dropped. */
|
|
124
|
+
function undeclaredKind(_grantee) {
|
|
125
|
+
return false;
|
|
126
|
+
}
|
|
127
|
+
function declaredGrantee(policy, grantee, permissionResource) {
|
|
128
|
+
switch (grantee.kind) {
|
|
129
|
+
case "role": return declaredRoleNames(policy).has(grantee.role);
|
|
130
|
+
case "plan": return listPlans(policy.vocabulary.plans).some((leaf) => leaf.key === grantee.plan);
|
|
131
|
+
case "relation": return grantee.resource === permissionResource && getResource(policy.permissions, grantee.resource)?.relations[grantee.relation] !== void 0 && (grantee.through === void 0 || grantee.through === "parent" && isSelfParented(getResource(policy.permissions, grantee.resource))) && (grantee.depth === void 0 || grantee.through === "parent" && Number.isInteger(grantee.depth) && grantee.depth >= 0 && grantee.depth <= 32);
|
|
132
|
+
case "anyone":
|
|
133
|
+
case "authenticated":
|
|
134
|
+
case "actor":
|
|
135
|
+
case "assurance":
|
|
136
|
+
case "inherit": return false;
|
|
137
|
+
default: return undeclaredKind(grantee);
|
|
138
|
+
}
|
|
139
|
+
}
|
|
140
|
+
/** Approvers are declared roles, plans or relations, or any authenticated human. */
|
|
141
|
+
function approvalAcceptable(policy, approval, permissionResource) {
|
|
142
|
+
if (approval === void 0 || approval === "human") return true;
|
|
143
|
+
if (!isRecord(approval)) return false;
|
|
144
|
+
if (approval["mode"] !== void 0 || approval["stages"] !== void 0) return false;
|
|
145
|
+
if (approval["distinct"] !== void 0 && typeof approval["distinct"] !== "boolean") return false;
|
|
146
|
+
if (approval["staleOn"] !== void 0 && (approval["staleOn"] !== "resource-change" || getResource(policy.permissions, permissionResource)?.version === void 0)) return false;
|
|
147
|
+
if (approval["quorum"] !== void 0 && (!Number.isInteger(approval["quorum"]) || approval["quorum"] < 1)) return false;
|
|
148
|
+
if (approval["ttl"] !== void 0 && durationOf(approval["ttl"]) === void 0) return false;
|
|
149
|
+
const escalation = approval["escalation"];
|
|
150
|
+
if (escalation !== void 0 && (!isRecord(escalation) || durationOf(escalation["after"]) === void 0 || !granteesAcceptable(policy, escalation["to"], permissionResource))) return false;
|
|
151
|
+
if (approval["by"] === void 0) return true;
|
|
152
|
+
return granteesAcceptable(policy, approval["by"], permissionResource);
|
|
153
|
+
}
|
|
154
|
+
function granteesAcceptable(policy, raw, permissionResource) {
|
|
155
|
+
if (raw === void 0) return false;
|
|
156
|
+
const items = flattenGrantee(raw);
|
|
157
|
+
return items.length > 0 && items.every((item) => isRecord(item) && item.kind !== "relation" && (item.kind === "authenticated" || declaredGrantee(policy, item, permissionResource)));
|
|
158
|
+
}
|
|
159
|
+
function buildGrant(policy, document, raw) {
|
|
160
|
+
if (!isRecord(raw) || typeof raw["id"] !== "string" || typeof raw["permission"] !== "string" || raw["effect"] !== void 0 && raw["effect"] !== "allow" && raw["effect"] !== "deny" || raw["to"] === void 0) return {
|
|
161
|
+
ok: false,
|
|
162
|
+
reason: "invalid"
|
|
163
|
+
};
|
|
164
|
+
const permission = findPermission(policy.permissions, raw["permission"]);
|
|
165
|
+
if (permission === void 0) return {
|
|
166
|
+
ok: false,
|
|
167
|
+
reason: "unknown-permission"
|
|
168
|
+
};
|
|
169
|
+
if (!policy.hostable.includes(permission.key)) return {
|
|
170
|
+
ok: false,
|
|
171
|
+
reason: "not-hostable"
|
|
172
|
+
};
|
|
173
|
+
const to = flattenGrantee(raw["to"]);
|
|
174
|
+
if (to.length === 0 || !to.every((item) => isRecord(item) && declaredGrantee(policy, item, permission.resource))) return {
|
|
175
|
+
ok: false,
|
|
176
|
+
reason: "unknown-grantee"
|
|
177
|
+
};
|
|
178
|
+
for (const condition of [raw["where"], raw["check"]]) if (condition !== void 0 && !isPortableCondition(condition)) return {
|
|
179
|
+
ok: false,
|
|
180
|
+
reason: "non-portable"
|
|
181
|
+
};
|
|
182
|
+
if (!approvalAcceptable(policy, raw["approval"], permission.resource)) return {
|
|
183
|
+
ok: false,
|
|
184
|
+
reason: "invalid"
|
|
185
|
+
};
|
|
186
|
+
if (raw["fields"] !== void 0 && !(Array.isArray(raw["fields"]) && raw["fields"].every((field) => typeof field === "string"))) return {
|
|
187
|
+
ok: false,
|
|
188
|
+
reason: "invalid"
|
|
189
|
+
};
|
|
190
|
+
const effect = raw["effect"] ?? "allow";
|
|
191
|
+
const options = compact({
|
|
192
|
+
where: raw["where"] === void 0 ? void 0 : normalizeWhere(raw["where"]),
|
|
193
|
+
check: raw["check"] === void 0 ? void 0 : normalizeWhere(raw["check"]),
|
|
194
|
+
approval: raw["approval"],
|
|
195
|
+
fields: raw["fields"]
|
|
196
|
+
});
|
|
197
|
+
let built;
|
|
198
|
+
try {
|
|
199
|
+
const roleItem = to.length === 1 && to[0]?.kind === "role" ? to[0] : null;
|
|
200
|
+
if (roleItem === null) {
|
|
201
|
+
const partial = (effect === "allow" ? allow : deny)(permission, {
|
|
202
|
+
...options,
|
|
203
|
+
to
|
|
204
|
+
});
|
|
205
|
+
built = completeGrant(partial);
|
|
206
|
+
} else {
|
|
207
|
+
const binding = policy.rolesByName.get(roleItem.role);
|
|
208
|
+
const leaf = findRole(policy.vocabulary.roles, roleItem.role);
|
|
209
|
+
const [first] = role(leaf ?? roleItem.role, [(effect === "allow" ? allow : deny)(permission, options)], binding?.on === void 0 ? {} : { on: binding.on }).grants;
|
|
210
|
+
if (first === void 0) throw new TypeError("PermDock: role produced no grant");
|
|
211
|
+
built = first;
|
|
212
|
+
}
|
|
213
|
+
} catch {
|
|
214
|
+
return {
|
|
215
|
+
ok: false,
|
|
216
|
+
reason: "invalid"
|
|
217
|
+
};
|
|
218
|
+
}
|
|
219
|
+
if (effect === "allow") {
|
|
220
|
+
const codeApprovals = policy.grants.filter((grant) => grant.effect === "allow" && grant.hosted === void 0 && grant.permission.key === permission.key).map((grant) => grant.approval);
|
|
221
|
+
if (!approvalAtLeast(built.approval, codeApprovals)) return {
|
|
222
|
+
ok: false,
|
|
223
|
+
reason: "weaker-approval"
|
|
224
|
+
};
|
|
225
|
+
}
|
|
226
|
+
return {
|
|
227
|
+
ok: true,
|
|
228
|
+
grant: freezeDeep({
|
|
229
|
+
...built,
|
|
230
|
+
hosted: {
|
|
231
|
+
document: document.fingerprint,
|
|
232
|
+
grant: raw["id"]
|
|
233
|
+
}
|
|
234
|
+
})
|
|
235
|
+
};
|
|
236
|
+
}
|
|
237
|
+
/** The grants of `document` that `policy` drops, in document order; `permdock/catalog` turns them into drift findings. */
|
|
238
|
+
function hostedGrantDrops(policy, document) {
|
|
239
|
+
return document.grants.flatMap((raw) => {
|
|
240
|
+
const result = buildGrant(policy, document, raw);
|
|
241
|
+
if (result.ok) return [];
|
|
242
|
+
return [freezeDeep({
|
|
243
|
+
grant: isRecord(raw) && typeof raw.id === "string" ? raw.id : "",
|
|
244
|
+
permission: isRecord(raw) && typeof raw.permission === "string" ? raw.permission : "",
|
|
245
|
+
reason: result.reason
|
|
246
|
+
})];
|
|
247
|
+
});
|
|
248
|
+
}
|
|
249
|
+
/**
|
|
250
|
+
* The code policy plus the hosted grants that pass every rule. Hosted
|
|
251
|
+
* allows OR with code allows and any deny still wins, so a hosted grant can
|
|
252
|
+
* never override a code deny; one that fails a rule is dropped, not thrown.
|
|
253
|
+
*/
|
|
254
|
+
function mergeHostedGrants(policy, document) {
|
|
255
|
+
if (document === null || document.grants.length === 0) return {
|
|
256
|
+
policy,
|
|
257
|
+
dropped: []
|
|
258
|
+
};
|
|
259
|
+
const merged = [];
|
|
260
|
+
const dropped = [];
|
|
261
|
+
for (const raw of document.grants) {
|
|
262
|
+
const result = buildGrant(policy, document, raw);
|
|
263
|
+
if (result.ok) {
|
|
264
|
+
merged.push(result.grant);
|
|
265
|
+
continue;
|
|
266
|
+
}
|
|
267
|
+
dropped.push(freezeDeep({
|
|
268
|
+
kind: "hosted-grant-dropped",
|
|
269
|
+
document: document.fingerprint,
|
|
270
|
+
grant: isRecord(raw) && typeof raw.id === "string" ? raw.id : "",
|
|
271
|
+
reason: result.reason
|
|
272
|
+
}));
|
|
273
|
+
}
|
|
274
|
+
if (merged.length === 0) return {
|
|
275
|
+
policy,
|
|
276
|
+
dropped
|
|
277
|
+
};
|
|
278
|
+
const grants = [...policy.grants, ...merged];
|
|
279
|
+
return {
|
|
280
|
+
policy: freezeDeep({
|
|
281
|
+
...policy,
|
|
282
|
+
grants,
|
|
283
|
+
index: indexPolicy(policy.roles, grants, policy.vocabulary),
|
|
284
|
+
fingerprint: sha256Digest(`${policy.fingerprint}:${document.fingerprint}`)
|
|
285
|
+
}),
|
|
286
|
+
dropped
|
|
287
|
+
};
|
|
288
|
+
}
|
|
289
|
+
function hostedPolicies(source) {
|
|
290
|
+
return Object.freeze({
|
|
291
|
+
feature: "hosted-policies",
|
|
292
|
+
apply(policy) {
|
|
293
|
+
if (policy.hostable.length === 0) return {
|
|
294
|
+
policy,
|
|
295
|
+
errors: []
|
|
296
|
+
};
|
|
297
|
+
let document;
|
|
298
|
+
try {
|
|
299
|
+
document = source.current();
|
|
300
|
+
} catch (error) {
|
|
301
|
+
return {
|
|
302
|
+
policy,
|
|
303
|
+
errors: [error]
|
|
304
|
+
};
|
|
305
|
+
}
|
|
306
|
+
const merged = mergeHostedGrants(policy, document);
|
|
307
|
+
return {
|
|
308
|
+
policy: merged.policy,
|
|
309
|
+
errors: merged.dropped
|
|
310
|
+
};
|
|
311
|
+
}
|
|
312
|
+
});
|
|
313
|
+
}
|
|
314
|
+
//#endregion
|
|
315
|
+
export { mergeHostedGrants as a, memoryPolicySource as i, hostedPolicies as n, parsePolicyDocument as o, isPortableCondition as r, policyDocumentFromClaims as s, hostedGrantDrops as t };
|