permdock 0.3.1 → 0.5.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/{openapi-schema--ARjyfQr.js → 2020-C9VN-x8c.js} +5 -132
- package/dist/a2a/index.d.ts +8 -6
- package/dist/a2a/index.js +21 -31
- package/dist/{adapter-context-mlWsVGGg.js → adapter-context-CRhqyzCk.js} +1 -1
- package/dist/adoption-scan-B4R5fnMU.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 -23
- package/dist/ai-sdk/index.js +38 -21
- package/dist/app-data-MuyzVqX8.js +60 -0
- package/dist/approval-header-CJACtHkv.js +23 -0
- package/dist/approval-prompt-Dg5LeAcT.js +62 -0
- package/dist/approval-prompt-Djo_PyZc.d.ts +57 -0
- package/dist/approvals/index.d.ts +5 -3
- package/dist/approvals/index.js +8 -5
- package/dist/approvals-DJ6Yd5z1.js +995 -0
- package/dist/{approvers-DT4AVyIg.js → approvers-CqPOLD-o.js} +1 -1
- package/dist/arazzo-B6lebmiQ.js +36 -0
- package/dist/{arazzo-BAgw9ap6.js → arazzo-BWhNF-k0.js} +24 -17
- 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-Dg8XsRaO.js +55 -0
- package/dist/auth-DRLEizbL.js +178 -0
- package/dist/authzen/index.d.ts +26 -6
- package/dist/authzen/index.js +228 -75
- package/dist/automation-BMZPIVUM.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 +11 -23
- package/dist/better-supabase/index.d.ts +438 -86
- package/dist/better-supabase/index.js +1027 -184
- package/dist/bind--9EFVYWF.d.ts +38 -0
- package/dist/{bind-CuzGytRf.js → bind-CZzhx-Vj.js} +22 -10
- package/dist/body-CH5of8Ne.js +10 -0
- package/dist/body-text-QcXok_SI.js +52 -0
- package/dist/build-instance-BMnAudHn.js +52 -0
- package/dist/{canonical-json-DemiK4Vp.js → canonical-json-BC8_nMTw.js} +6 -6
- package/dist/{capability-2kYTMWDv.d.ts → capability-BSslw1QV.d.ts} +44 -25
- package/dist/{capability-4qPdO9gk.js → capability-N1K9IpqS.js} +69 -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-BECMPrwc.js +100 -0
- package/dist/catalog-DjhMYYCq.js +1 -0
- package/dist/catalog-R_A__RsH.js +52 -0
- package/dist/{catalog-doc-DdGm82XT.js → catalog-doc-C9wjsfNY.js} +54 -25
- 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 +26 -30
- package/dist/clerk/index.d.ts +9 -8
- package/dist/clerk/index.js +15 -45
- package/dist/cli/bin.js +36 -17
- package/dist/cli/index.d.ts +20 -6
- package/dist/cli/index.js +164 -4
- package/dist/cloud/index.d.ts +102 -63
- package/dist/cloud/index.js +240 -347
- package/dist/cloud-CIoHNevm.js +87 -0
- package/dist/codemod-Bmj9dWMH.js +37 -0
- package/dist/codemod-Cxvvc70T.js +2084 -0
- package/dist/{collect-DSTE3ml9.js → collect-CrZJJnEF.js} +79 -17
- package/dist/collect-DloHbDVa.js +55 -0
- package/dist/collect-FlXJlhus.js +1 -0
- package/dist/command-L8EstFNm.js +6 -0
- package/dist/{compact-y6vfu2_f.js → compact-CAf557ZB.js} +11 -1
- package/dist/compile/index.d.ts +1 -1
- package/dist/compile/index.js +1 -2
- package/dist/{compile-Ba4blROR.js → compile-CMqMx_IN.js} +13 -9
- package/dist/{compile-BkRyBDBw.d.ts → compile-Ckm2HqBZ.d.ts} +5 -3
- package/dist/completion-BqhRBJD8.js +143 -0
- package/dist/config-B46rm9sc.js +26 -0
- package/dist/{config-BJiM-xAm.js → config-bs_kZeYq.js} +15 -10
- package/dist/{config-report-CdCgbRnV.js → config-report-DUgj62Ai.js} +17 -8
- package/dist/{connection-CU8MQxRi.js → connection-DjhIJSs2.js} +8 -6
- package/dist/constants-DcJABbLW.js +20 -0
- package/dist/{context-Bcy85rGi.js → context-bbFHR-0D.js} +16 -5
- package/dist/convex/index.d.ts +11 -10
- package/dist/convex/index.js +18 -18
- package/dist/create-0VZ7Pdiu.d.ts +107 -0
- package/dist/create-BDS7wc3y.d.ts +138 -0
- package/dist/create-BFfm17UA.d.ts +110 -0
- package/dist/create-BWRSXgOF.js +403 -0
- package/dist/create-C3b4B5eF.js +130 -0
- package/dist/create-DnrmLnLW.js +323 -0
- package/dist/{credential-8P81ff4u.js → credential-DM2um3ha.js} +153 -32
- package/dist/credentials-DPyHmYz5.js +74 -0
- package/dist/deciding-columns-Sq12mEA6.js +123 -0
- package/dist/delegation-DaXVdDhM.js +286 -0
- package/dist/delegation-input-FTxMK3ji.js +19 -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-D8jDHgsl.d.ts +19 -0
- package/dist/{describe-DMYiCjJV.d.ts → describe-BZUsixiL.d.ts} +11 -2
- package/dist/{describe-B_gVZEVi.js → describe-BybMRY7A.js} +10 -5
- package/dist/device-BARQ8eYG.js +193 -0
- package/dist/diff-CxZo9pTq.js +37 -0
- package/dist/{diff-2VaeChzX.js → diff-DCePiN6M.js} +61 -55
- package/dist/doctor-CxiwSfqH.js +44 -0
- package/dist/doctor-DFjUxf2f.js +2361 -0
- package/dist/drizzle/index.d.ts +5 -3
- package/dist/drizzle/index.js +6 -14
- package/dist/elysia/index.d.ts +16 -13
- package/dist/elysia/index.js +14 -13
- package/dist/env-DJZrPjRi.js +8 -0
- package/dist/errors-BDUwg2qC.js +27 -0
- package/dist/{errors-Cz5zn0mW.js → errors-BKy0EfhN.js} +6 -10
- package/dist/errors-BWXBMaKK.d.ts +11 -0
- package/dist/{errors-DPdqI50v.d.ts → errors-C2PXIv4c.d.ts} +2 -2
- package/dist/errors-CWTY6uih.js +143 -0
- package/dist/evaluate-_R8QkWaf.js +1732 -0
- package/dist/evaluations-16UqqQ6W.d.ts +32 -0
- package/dist/{evaluations-tz6D9A2G.js → evaluations-DZ2CbV5k.js} +181 -32
- package/dist/eve/index.d.ts +12 -16
- package/dist/eve/index.js +23 -29
- 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 +14 -12
- package/dist/fastify/index.d.ts +26 -13
- package/dist/fastify/index.js +17 -36
- package/dist/fetch-adapter-g0ypLkID.js +120 -0
- package/dist/fetch-adapter-qKJBuRqy.d.ts +31 -0
- package/dist/fields-D9tPVUUS.js +203 -0
- package/dist/files-C5ZI27eV.js +124 -0
- package/dist/{files-DWUN9PzI.js → files-D_JIzUrP.js} +12 -3
- package/dist/{fixtures-ht28Cplr.js → fixtures-B7XrLeY7.js} +12 -12
- package/dist/flags-C3DktBDY.js +86 -0
- package/dist/{from-snapshot-CTLijvdm.js → from-snapshot-D2lZt4Dd.js} +78 -65
- package/dist/{generate-CH7ThJ14.js → generate-CNU1pIOo.js} +1 -3
- package/dist/grantee-Cn1HyUsI.js +254 -0
- package/dist/grantee-conditions-CcXf8hMM.js +271 -0
- package/dist/grantee-match-DHArqY82.js +142 -0
- 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-H_KARDVC.js → helpers-DTcZOzhF.js} +47 -39
- package/dist/hono/index.d.ts +12 -9
- package/dist/hono/index.js +14 -13
- package/dist/{hosted-DJQw46hn.js → hosted-BZIAYvon.js} +64 -15
- package/dist/hosted-DBDX0M-P.d.ts +78 -0
- package/dist/{http-SO7qGttf.js → http-BBoKefeS.js} +35 -2
- package/dist/{http-DPuDaChb.d.ts → http-B_LphE5Y.d.ts} +1 -2
- package/dist/http-DXJ37RDA.js +46 -0
- package/dist/{http-BIhmLfCc.js → http-ujKm0JXE.js} +3 -26
- package/dist/{openapi-import-cmwetbzw.js → import-CNV7I2Dw.js} +30 -26
- package/dist/{rls-import-4lLW_pbb.js → import-DMmOG27O.js} +271 -128
- package/dist/index-BcHcPyIo.d.ts +110 -0
- package/dist/index-CaxrMD1A.d.ts +1 -0
- package/dist/index-Chrs5fQ-.d.ts +210 -0
- package/dist/index-CxGUswIC.d.ts +431 -0
- package/dist/index-D8EovfsP.d.ts +91 -0
- package/dist/index-DOVf7RJv.d.ts +900 -0
- package/dist/{index-C8z4RjQV.d.ts → index-SGdIQyzc.d.ts} +34 -16
- package/dist/index.d.ts +20 -14
- package/dist/index.js +33 -23
- package/dist/init-DeMYsnYJ.js +96 -0
- package/dist/init-GG6Jh8HD.js +95 -0
- package/dist/{instance-options-jARdwfPN.d.ts → instance-options-Omfd793B.d.ts} +2 -2
- package/dist/instance-snapshot-Cxq4ygFc.js +600 -0
- package/dist/instant-BluqDvyS.js +19 -0
- package/dist/internals-Dk8A8fX3.js +17 -0
- package/dist/{json-schema-BsAflUGW.js → json-schema-B-vAwlde.js} +46 -9
- package/dist/json-schema-CN_iLFH2.d.ts +40 -0
- package/dist/jwt/index.d.ts +18 -11
- package/dist/jwt/index.js +166 -145
- package/dist/{kernel-_RRHmnMY.js → kernel-5JatXyND.js} +120 -43
- package/dist/kysely/index.d.ts +5 -3
- package/dist/kysely/index.js +6 -14
- package/dist/{live-options-H2eG8dfJ.js → live-options-BaAFCIiu.js} +16 -3
- package/dist/load-BxEtwlBS.js +1 -0
- package/dist/{load-DhWEB9P1.js → load-DFS_ry0W.js} +31 -7
- 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-CtKR3GXL.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-Z4QZOiFF.js → map-claims-D3oRmTk0.js} +19 -25
- package/dist/{map-error-pgUWNNtG.js → map-error-TCAdw-eW.js} +5 -5
- package/dist/{markers-B0hYLvMD.js → markers-C6joDI3o.js} +8 -3
- package/dist/mcp/index.d.ts +36 -9
- package/dist/mcp/index.js +476 -448
- package/dist/{rls-migrate-CN4TlJTO.js → migrate-BShP7Vf4.js} +119 -20
- package/dist/nest/index.d.ts +12 -9
- package/dist/nest/index.js +20 -20
- package/dist/next/index.d.ts +40 -20
- package/dist/next/index.js +37 -39
- 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-BFp-PZZA.js +126 -0
- package/dist/openai/index.d.ts +9 -16
- package/dist/openai/index.js +18 -25
- package/dist/openapi/index.d.ts +3 -3
- package/dist/openapi/index.js +1 -1
- package/dist/{openapi-BqRBvAng.js → openapi-B7HZ0f-r.js} +9 -12
- package/dist/{openapi-CqqEbHsL.js → openapi-DTaEmTSW.js} +23 -26
- package/dist/openapi-ahr8rHu3.js +138 -0
- package/dist/operation-findings-DgATDpvh.js +36 -0
- package/dist/operations-CxybZErY.d.ts +59 -0
- package/dist/orpc/index.d.ts +13 -10
- package/dist/orpc/index.js +23 -20
- package/dist/otel/index.d.ts +3 -2
- package/dist/otel/index.js +53 -27
- package/dist/output-Dyw8fyPF.js +88 -0
- package/dist/output-files-B3IZJksC.js +1 -0
- package/dist/output-files-DhRBBE4n.js +138 -0
- package/dist/{rls-fields-CZOMlwHl.js → ownership-BatFgAA4.js} +2393 -2349
- package/dist/{package-root-zGkxO3oN.js → package-root-Dk_ETdkp.js} +4 -3
- package/dist/{parse-BuyjxhZV.js → parse-Cxq0WxrA.js} +3 -3
- package/dist/{parse-local-manifest-BrMozJCo.js → parse-local-manifest-CVSs6J9I.js} +2 -4
- package/dist/{parse-local-manifest-JLnaBH0S.d.ts → parse-local-manifest-DgqtruPn.d.ts} +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 +47 -29
- package/dist/{peer-BOr_kJE1.js → peer-C8swJ2GH.js} +23 -4
- package/dist/peer-CRvC7Hg1.js +1 -0
- package/dist/permdock-B9JxkBwC.js +868 -0
- package/dist/permdock-D7eeLJER.d.ts +502 -0
- package/dist/permission-registry-Br4jSNVi.js +385 -0
- package/dist/permissions-B-wCP5ZC.js +30 -0
- package/dist/{permissions-RJrovw98.js → permissions-CZKiUfFM.js} +4 -3
- package/dist/{permissions-CDgvKG5L.d.ts → permissions-oEWfl-kl.d.ts} +1 -2
- package/dist/policies-CO1oOymN.js +295 -0
- package/dist/{policy-D2W7uv19.d.ts → policy-Czo4n3Hs.d.ts} +2 -2
- package/dist/policy-DLZJ5gAp.js +399 -0
- package/dist/policy-from-catalog-DzhEc3Y9.js +450 -0
- package/dist/policy-module-CTlwMvLI.js +89 -0
- package/dist/{policy-IB6yxpC3.d.ts → policy-types-DzwivBgR.d.ts} +939 -1057
- package/dist/postgrest-CW0IqC-U.js +566 -0
- package/dist/postgrest-NUqZT-RB.d.ts +100 -0
- package/dist/powersync-BHfuehf3.js +62 -0
- package/dist/powersync-CbzkqL_M.js +1 -0
- package/dist/{powersync-Dv1_aWF7.js → powersync-bYUDLOAO.js} +30 -32
- 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 +6 -12
- package/dist/{problem-B43ztKIm.js → problem-CTviyH5L.js} +18 -27
- package/dist/{problem-details-DX075l9V.d.ts → problem-details-DXlt-vks.d.ts} +1 -1
- package/dist/{problem-details-_AMOYz-w.js → problem-details-cn5X30gZ.js} +45 -42
- package/dist/problem-types-CJ2325SZ.js +5 -0
- package/dist/{prompt-CXYhLfsS.js → prompt-DfZLJLIn.js} +2 -2
- package/dist/protected-DEPHc2xV.d.ts +38 -0
- package/dist/{protected-utU-SLuy.js → protected-DfjY5mLA.js} +37 -8
- package/dist/{provider-CSQd7m92.js → provider-CC-u3bYP.js} +23 -10
- package/dist/{provider-DZY281jO.d.ts → provider-DMVt6yYn.d.ts} +1 -1
- package/dist/{provider-store-Cfbvo4DE.js → provider-store-B5Yrkhzr.js} +6 -3
- package/dist/pull-BgIfno6w.js +256 -0
- package/dist/pull-ByOks_Tg.js +1 -0
- package/dist/push-CmFVBOeI.js +116 -0
- package/dist/pushed-policy-BImMTTIM.d.ts +57 -0
- package/dist/pushed-policy-DobP7AHI.js +238 -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 -63
- package/dist/react-native/index.js +45 -27
- package/dist/{refs-KYb4ntaz.js → refs-K6eWUJ0H.js} +1 -1
- package/dist/relation-walk-3OyDBF0S.js +186 -0
- package/dist/relations-BnCWnJGI.js +163 -0
- package/dist/renames-CGj7YwcQ.js +175 -0
- package/dist/{replay-CYyiLiwO.d.ts → replay-D7iKcLFe.d.ts} +1 -1
- package/dist/{replay-BsOyTrdV.js → replay-Du1tJjG7.js} +2 -1
- package/dist/request-context-BTRTG7OT.js +71 -0
- package/dist/request-context-C2_1lchh.d.ts +5 -0
- 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-D_jw0BFx.js +243 -0
- package/dist/retire-CALjIQ7e.js +240 -0
- package/dist/{revocations-Cy06JNx2.d.ts → revocations-R07lFBnX.d.ts} +2 -0
- package/dist/rls-BA8an5Ap.js +336 -0
- package/dist/{rls-DiinlRML.js → rls-j6t43t7n.js} +1066 -1068
- package/dist/role-builder-CXbis5-X.js +623 -0
- package/dist/{rpc-DL9Sqvb1.js → rpc-aPyNi6tA.js} +18 -8
- package/dist/run-CNsApDpd.js +1 -0
- package/dist/run-DOfMtc9V.js +723 -0
- package/dist/run-ticket-BjhTOi6u.d.ts +124 -0
- package/dist/run-ticket-sxFI6LAk.js +337 -0
- package/dist/{runtime-CB8gQFvS.js → runtime-D3VTAiCA.js} +1 -1
- package/dist/{saas-DhpJjnBA.js → saas-FO-Q8oj0.js} +18 -15
- package/dist/scan-BOI5tJ-6.js +29 -0
- package/dist/{schema-D3MnDMxa.js → schema-B4v0Qrac.js} +106 -10
- 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-BFGBBAqR.js → scim-ClHtpyV3.js} +213 -87
- package/dist/{scopes-CVdPrWN-.js → scopes-CUPSjo9q.js} +20 -7
- package/dist/server/index.d.ts +13 -134
- package/dist/server/index.js +13 -10
- package/dist/server-DqCT4CgZ.js +453 -0
- package/dist/{create-B1d519XK.d.ts → server-types-BLd4MnBX.d.ts} +89 -70
- package/dist/{sha256-BO0swRXL.js → sha256-D9ihqmvd.js} +8 -1
- package/dist/shared-CD11nBbC.js +304 -0
- package/dist/{shared-DRu8VFVM.js → shared-DvvFzYXe.js} +8 -9
- package/dist/signals-D3NcTKUS.js +32 -0
- package/dist/sink-BEZSlMS_.js +957 -0
- package/dist/sink-Bj_lDUDq.d.ts +225 -0
- package/dist/{skills-Biq5uup3.js → skills-B6lVdD_W.js} +16 -8
- package/dist/skills-CTYwkl44.js +51 -0
- package/dist/snapshot-CXUWfsNy.js +269 -0
- package/dist/{snapshot-cache-D6jLelln.js → snapshot-cache-DZHQ0KF6.js} +11 -5
- package/dist/{snapshot-cache-B-LxUahj.d.ts → snapshot-cache-DqK9eDmM.d.ts} +7 -5
- package/dist/solid/index.d.ts +24 -25
- package/dist/solid/index.js +41 -11
- package/dist/solid-start/index.d.ts +52 -0
- package/dist/solid-start/index.js +49 -0
- package/dist/{sources-BdOYLw9j.d.ts → sources-BV9j0DeZ.d.ts} +11 -13
- package/dist/{sources-4p0-4xQm.js → sources-vs5dGOsS.js} +147 -142
- package/dist/sql-B5T1IL83.js +55 -0
- package/dist/src-DLfUWFAI.js +1851 -0
- package/dist/ssf/index.d.ts +4 -4
- package/dist/ssf/index.js +440 -106
- package/dist/standard-webhooks-6lg8v_is.d.ts +88 -0
- package/dist/standard-webhooks-DgFFD-Ga.js +228 -0
- package/dist/storage-C2bWdvJH.js +132 -0
- package/dist/{store-DMAWwAJV.js → store-4u_hxjWa.js} +42 -55
- package/dist/{store-options-ByhZq1jV.js → store-options-BqEakYRa.js} +38 -24
- package/dist/{stores-BT2pSCub.js → stores-BbsD4fAR.js} +7 -3
- package/dist/stores-ClZUgeoP.d.ts +30 -0
- package/dist/{stream-D1RXubw2.d.ts → stream-7-xmnf3U.d.ts} +2 -2
- package/dist/{stream-DDpvynSB.js → stream-CvdUS9V1.js} +10 -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/{subject-settings-BwBmCdTR.js → subject-settings-CkEwrw3W.js} +23 -5
- package/dist/supabase/index.d.ts +23 -106
- package/dist/supabase/index.js +5 -4
- package/dist/supabase/middleware.d.ts +13 -6
- package/dist/supabase/middleware.js +16 -11
- package/dist/supabase-9pqI57pW.js +92 -0
- package/dist/{supabase-C0qESOa-.js → supabase-Dxlp8A94.js} +124 -247
- package/dist/supabase-hook-CXcGpHqq.js +1 -0
- package/dist/{supabase-hook-ntETYCQu.js → supabase-hook-DdDQhMlw.js} +1659 -819
- package/dist/{supautils-u8jXTGrt.js → supautils-B6HYL9eL.js} +2 -2
- package/dist/support-session-C6xJQYut.js +158 -0
- package/dist/svelte/Protected.svelte +11 -4
- package/dist/svelte/index.d.ts +7 -7
- package/dist/svelte/index.js +26 -12
- package/dist/svelte/runtime.d.ts +10 -3
- package/dist/svelte/runtime.js +4 -3
- package/dist/svelte/source.d.ts +7 -7
- package/dist/svelte/source.js +5 -5
- 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/{validity-uOp8UpYn.js → tenancy-DN2QAx9z.js} +6 -42
- package/dist/terminal/index.d.ts +11 -9
- package/dist/terminal/index.js +36 -316
- package/dist/testing/index.d.ts +391 -106
- package/dist/testing/index.js +4574 -1286
- 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-CIWxJOCh.js → token-BLZcjQgt.js} +15 -6
- package/dist/tool-refusal-CMLN5xhn.js +41 -0
- package/dist/trpc/index.d.ts +12 -9
- package/dist/trpc/index.js +18 -17
- package/dist/{types-DbjRN55U.d.ts → types-5Ut_pbKy.d.ts} +141 -13
- package/dist/types-BNORmDM8.d.ts +172 -0
- package/dist/types-BjV-fqcA.d.ts +57 -0
- package/dist/{types-QCuYJh4q.d.ts → types-BqAKcRNW.d.ts} +2 -1
- package/dist/types-C8-KNsFf.d.ts +107 -0
- package/dist/{types-aqOHTHcp.d.ts → types-CCpc2Dcv.d.ts} +77 -17
- package/dist/{types-Dnemwd77.d.ts → types-CZTnPFzM.d.ts} +50 -11
- package/dist/{types-C97IskBw.d.ts → types-CdlxsYQh.d.ts} +23 -11
- package/dist/{types-DxiCGmmd.d.ts → types-ClZaWzfb.d.ts} +9 -6
- package/dist/types-DX0LaKTb.d.ts +157 -0
- package/dist/types-DiQjupG2.d.ts +332 -0
- package/dist/types-DqzsnlSA.js +67 -0
- package/dist/types-_sHy8BQf.d.ts +65 -0
- package/dist/types-fbZ7JEXr.d.ts +89 -0
- package/dist/types-tIgIeIKJ.d.ts +66 -0
- package/dist/unplugin/index.d.ts +1 -1
- package/dist/unplugin/index.js +2 -2
- package/dist/usage-CHOtwL19.js +1 -0
- package/dist/usage-DHtE8j4E.js +32 -0
- package/dist/{usage-ItS7nLcl.js → usage-T5mXq98v.js} +56 -13
- package/dist/{validation-error-Ba264OaJ.d.ts → validation-error-Bg5Tpluk.d.ts} +1 -1
- package/dist/{validation-error-CnjZ4t92.js → validation-error-ZfUHbKvf.js} +1 -1
- package/dist/validity-CZ7-y0Cj.js +79 -0
- package/dist/{verifier-BxBo6I44.js → verifier-DHuh-okk.js} +68 -21
- package/dist/verify-DbCL9bnB.js +1770 -0
- package/dist/{version-BvacVTZR.js → version-CEbQ5UeM.js} +4 -3
- package/dist/version-DXkYUISx.js +1 -0
- package/dist/{views-Soe7bGSC.js → views-DTIIO-oQ.js} +41 -2
- package/dist/{permissions-DttnqqxC.d.ts → vocabulary-D6lPdb4Z.d.ts} +120 -29
- package/dist/vue/index.d.ts +25 -21
- package/dist/vue/index.js +25 -9
- package/dist/waiter-BGUtGYoU.js +67 -0
- package/dist/waiter-CKy4MQSY.d.ts +36 -0
- package/dist/watch-Cb-NcaUw.js +1 -0
- package/dist/{watch-DVBJ9cBq.js → watch-CszoTJMq.js} +47 -8
- package/dist/webmcp/index.d.ts +2 -2
- package/dist/webmcp/index.js +13 -37
- package/dist/where-scope-Dv-WTP-w.js +306 -0
- package/dist/who-can-D0QoYbEb.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-Bd1Tejur.d.ts +15 -0
- package/dist/wrap-gX61EtpB.js +27 -0
- package/package.json +140 -41
- 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 +129 -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 +19 -10
- package/skills/permdock-data/SKILL.md +6 -6
- package/skills/permdock-data/references/queries-and-rls.md +13 -8
- 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 +18 -12
- package/skills/permdock-wire/references/adapters.md +146 -50
- package/skills/permdock-wire/references/policy-options.md +15 -6
- package/skills/permdock-wire/references/presets-and-recipes.md +58 -0
- package/dist/approvals-DbYAuNkG.js +0 -224
- package/dist/arazzo-C9chp3ST.js +0 -54
- package/dist/bind-C_ob3LKa.d.ts +0 -25
- package/dist/catalog-CRW5Mx_B.js +0 -2
- package/dist/catalog-CYj-mX2O.js +0 -48
- package/dist/catalog-DWF5cYqB.js +0 -55
- package/dist/cloud-CfwZ39Rl.js +0 -50
- package/dist/cloud-DWLXO2af.js +0 -118
- package/dist/collect-CHB22Sx4.js +0 -83
- package/dist/collect-DSWOk19R.js +0 -2
- package/dist/commands-BeaGNj_o.js +0 -97
- package/dist/config-ir40y8m0.js +0 -36
- package/dist/create-CMwIl-w2.js +0 -253
- package/dist/delegation-D8pUEuce.js +0 -103
- package/dist/diff-C9RDjjhs.js +0 -48
- package/dist/doctor-Djh6JDEk.js +0 -53
- package/dist/doctor-DvH0IQff.js +0 -1194
- package/dist/doctor-collect-CjdO0wQX.js +0 -665
- package/dist/duration-xK2jGFVc.js +0 -25
- package/dist/errors-CWfoNg9N.js +0 -47
- package/dist/errors-DRnGZHzF.js +0 -30
- package/dist/evaluation-items-CfCCejQd.js +0 -40
- package/dist/expiry-BoBJ8Tvc.js +0 -7
- package/dist/fields-BMl1RxoX.js +0 -26
- package/dist/grantee-Cv5Sogfv.js +0 -602
- 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-0nNqHspG.d.ts +0 -6
- package/dist/index-BNc7Wer_.d.ts +0 -483
- package/dist/index-C7Tw7MaW.d.ts +0 -201
- package/dist/instance-options-Dhhcnm3y.js +0 -22
- package/dist/load-DwJUafYN.js +0 -2
- package/dist/manifest-iaoBXHKc.js +0 -783
- package/dist/map-AcxK9o_D.js +0 -147
- package/dist/may-use-DndQ5tQ-.js +0 -77
- package/dist/openapi-CQTsgKoB.js +0 -164
- package/dist/permdock-CbgvLnuo.js +0 -3479
- package/dist/permissions-DVoF6dMt.js +0 -662
- package/dist/policy-xyWg7QdR.js +0 -1122
- package/dist/powersync-CrBX8hY6.js +0 -2
- package/dist/powersync-DE19b9dT.js +0 -62
- package/dist/protected-BdnIEFkY.d.ts +0 -27
- package/dist/protected-xAr24FEC.d.ts +0 -40
- package/dist/relations-cjOL01hZ.js +0 -505
- package/dist/rls-P-BeBx0n.js +0 -238
- package/dist/rls-graph-CHwx0V8q.js +0 -435
- package/dist/rls-ownership-DcYlZ09B.js +0 -843
- package/dist/rls-shared-Cewd_-zI.js +0 -495
- package/dist/rls-verify-CMv9H3wV.js +0 -746
- package/dist/run-BWc9qqvE.js +0 -174
- package/dist/server-DlZ28Oz5.js +0 -268
- package/dist/sink-B1fZzIMf.d.ts +0 -104
- package/dist/sink-Bd9PSyfq.js +0 -141
- package/dist/skills-C5CbhhpG.js +0 -56
- package/dist/snapshot-Enxd0n-s.js +0 -975
- package/dist/sql-xdg5f4Fi.js +0 -27
- package/dist/src-BDwEZWrZ.js +0 -568
- package/dist/store-jOBYpiXC.d.ts +0 -36
- package/dist/stores-C0IMQrGI.d.ts +0 -52
- package/dist/subject-C6dLxqHU.js +0 -24
- package/dist/supabase-config-Bj3iDH2I.js +0 -472
- package/dist/supabase-hook-gd3s8bxB.js +0 -2
- package/dist/supabase-s4o9s1O1.js +0 -83
- package/dist/thenable-okc2xDsj.js +0 -10
- package/dist/types-BnIEz1sU.d.ts +0 -48
- package/dist/types-Bvc4oWT6.d.ts +0 -9
- package/dist/types-CKNSyIf_.d.ts +0 -52
- package/dist/types-Cq_H8N_X.d.ts +0 -197
- package/dist/usage-B0YuTQRO.js +0 -42
- package/dist/usage-DorAJiU_.js +0 -2
- package/dist/vocabulary-DA8a8zif.d.ts +0 -56
- package/dist/watch-BwxLTYMZ.js +0 -2
|
@@ -0,0 +1,323 @@
|
|
|
1
|
+
import { t as compact } from "./compact-CAf557ZB.js";
|
|
2
|
+
import { n as freezeDeep } from "./freeze-CrU8nQeX.js";
|
|
3
|
+
import { n as problemDetails } from "./problem-details-cn5X30gZ.js";
|
|
4
|
+
import { c as listPermissions } from "./permission-registry-Br4jSNVi.js";
|
|
5
|
+
import { n as resourceRef } from "./resource-ref-CaS9yVPi.js";
|
|
6
|
+
import { c as withApp, i as challengeScope } from "./permdock-B9JxkBwC.js";
|
|
7
|
+
import { r as hasCredentials } from "./http-BBoKefeS.js";
|
|
8
|
+
import { i as decisionResponse, o as notFoundProblem, s as problemFromDecision, t as ANONYMOUS, u as unauthenticatedProblem } from "./problem-CTviyH5L.js";
|
|
9
|
+
import { n as resolveOrNull } from "./build-instance-BMnAudHn.js";
|
|
10
|
+
import { n as applyApprovalResume, o as evaluationsHandler, u as InvalidSignatureError } from "./evaluations-DZ2CbV5k.js";
|
|
11
|
+
import { n as tenantScope, t as actorFrom } from "./adapter-context-CRhqyzCk.js";
|
|
12
|
+
import { n as requestContext, t as buildReportingInstance } from "./request-context-BTRTG7OT.js";
|
|
13
|
+
//#region src/server/kernel-problems.ts
|
|
14
|
+
const NOT_DELEGATED = freezeDeep({
|
|
15
|
+
outcome: "denied",
|
|
16
|
+
denials: [{
|
|
17
|
+
role: null,
|
|
18
|
+
reason: "not-delegated"
|
|
19
|
+
}],
|
|
20
|
+
alternatives: []
|
|
21
|
+
});
|
|
22
|
+
const LOAD_FAILED = freezeDeep({
|
|
23
|
+
outcome: "denied",
|
|
24
|
+
denials: [{
|
|
25
|
+
role: null,
|
|
26
|
+
reason: "validation"
|
|
27
|
+
}],
|
|
28
|
+
alternatives: []
|
|
29
|
+
});
|
|
30
|
+
/** The `403` for a loader that threw: the check fails closed, as on MCP. */
|
|
31
|
+
function loadFailedProblem(permission) {
|
|
32
|
+
const key = permission?.key ?? "the route";
|
|
33
|
+
return decisionResponse(problemDetails(compact({
|
|
34
|
+
decision: LOAD_FAILED,
|
|
35
|
+
detail: `${key} failed closed: the row could not be loaded`,
|
|
36
|
+
permission: permission?.key
|
|
37
|
+
})), LOAD_FAILED);
|
|
38
|
+
}
|
|
39
|
+
/** The `403` `insufficient_scope` for a token that holds none of a route's OAuth scopes. */
|
|
40
|
+
function scopeProblem(permission, subject, credentials, scope) {
|
|
41
|
+
return permission === null ? decisionResponse(problemDetails(compact({
|
|
42
|
+
decision: NOT_DELEGATED,
|
|
43
|
+
detail: `the token holds none of the OAuth scopes this route needs, such as ${String(scope)}`,
|
|
44
|
+
scope
|
|
45
|
+
})), NOT_DELEGATED, compact({
|
|
46
|
+
credentials,
|
|
47
|
+
scope
|
|
48
|
+
})) : problemFromDecision(NOT_DELEGATED, permission, subject, compact({
|
|
49
|
+
credentials,
|
|
50
|
+
scope
|
|
51
|
+
}));
|
|
52
|
+
}
|
|
53
|
+
function problemFor(decision, init, approval) {
|
|
54
|
+
if (init?.permission !== void 0) return problemFromDecision(decision, init.permission, void 0, compact({
|
|
55
|
+
instance: init.instance,
|
|
56
|
+
approval
|
|
57
|
+
}));
|
|
58
|
+
if (decision.outcome === "granted") return new Response(null, { status: 204 });
|
|
59
|
+
return decisionResponse(problemDetails(compact({
|
|
60
|
+
decision,
|
|
61
|
+
detail: decision.outcome,
|
|
62
|
+
instance: init?.instance
|
|
63
|
+
})), decision);
|
|
64
|
+
}
|
|
65
|
+
//#endregion
|
|
66
|
+
//#region src/server/route-guard.ts
|
|
67
|
+
function routeScopes(value) {
|
|
68
|
+
if (value === void 0) return;
|
|
69
|
+
const scopes = Array.isArray(value) ? value : [];
|
|
70
|
+
const names = scopes.filter((scope) => typeof scope === "string" && scope !== "");
|
|
71
|
+
if (names.length === 0 || names.length !== scopes.length) throw new TypeError("PermDock: oauthScopes must be a non-empty list of scope names");
|
|
72
|
+
return names;
|
|
73
|
+
}
|
|
74
|
+
async function refused(hook, fallback, decision, request, report) {
|
|
75
|
+
if (hook === void 0) return {
|
|
76
|
+
ok: false,
|
|
77
|
+
response: fallback,
|
|
78
|
+
decision
|
|
79
|
+
};
|
|
80
|
+
try {
|
|
81
|
+
const result = await hook({
|
|
82
|
+
decision,
|
|
83
|
+
problem: await fallback.clone().json(),
|
|
84
|
+
request
|
|
85
|
+
});
|
|
86
|
+
if (result === void 0) return {
|
|
87
|
+
ok: false,
|
|
88
|
+
response: fallback,
|
|
89
|
+
decision
|
|
90
|
+
};
|
|
91
|
+
const status = result.status;
|
|
92
|
+
if (typeof status !== "number" || status < 300) throw new TypeError(`PermDock: deniedResponse returned status ${String(status)}; a refusal keeps a status of 300 or more`);
|
|
93
|
+
return {
|
|
94
|
+
ok: false,
|
|
95
|
+
response: result instanceof Response ? result : new Response(JSON.stringify(result), {
|
|
96
|
+
status,
|
|
97
|
+
headers: fallback.headers
|
|
98
|
+
}),
|
|
99
|
+
decision
|
|
100
|
+
};
|
|
101
|
+
} catch (error) {
|
|
102
|
+
report(error);
|
|
103
|
+
return {
|
|
104
|
+
ok: false,
|
|
105
|
+
response: fallback,
|
|
106
|
+
decision
|
|
107
|
+
};
|
|
108
|
+
}
|
|
109
|
+
}
|
|
110
|
+
async function guardOn(deps, instance, remote, report, request, permission, load, protectOptions) {
|
|
111
|
+
const declared = routeScopes(protectOptions.oauthScopes ?? (request === void 0 ? void 0 : deps.options.operations?.oauthScopesForRequest(request.method, new URL(request.url).pathname)));
|
|
112
|
+
const credentials = request === void 0 ? false : hasCredentials(request);
|
|
113
|
+
if (permission === null) {
|
|
114
|
+
if (declared === void 0) throw new TypeError(request === void 0 ? "PermDock: protect(null) needs oauthScopes" : `PermDock: protect(null) needs oauthScopes, and no operation declares them for ${request.method} ${new URL(request.url).pathname}`);
|
|
115
|
+
if (instance.subject.principal === null) return refused(deps.options.deniedResponse, unauthenticatedProblem(credentials), ANONYMOUS, request, report);
|
|
116
|
+
}
|
|
117
|
+
const { actor, delegation } = instance.subject;
|
|
118
|
+
const held = permission === null && (actor !== void 0 || delegation !== void 0) ? delegation?.scopes ?? [] : delegation?.scopes;
|
|
119
|
+
if (declared !== void 0 && held !== void 0 && !declared.some((granted) => held.includes(granted))) return refused(deps.options.deniedResponse, scopeProblem(permission, instance.subject, credentials, declared[0]), NOT_DELEGATED, request, report);
|
|
120
|
+
let data;
|
|
121
|
+
if (load !== void 0) {
|
|
122
|
+
let loaded;
|
|
123
|
+
try {
|
|
124
|
+
loaded = await load();
|
|
125
|
+
} catch (error) {
|
|
126
|
+
report(error);
|
|
127
|
+
return refused(deps.options.deniedResponse, loadFailedProblem(permission), LOAD_FAILED, request, report);
|
|
128
|
+
}
|
|
129
|
+
if (loaded === null || loaded === void 0) return {
|
|
130
|
+
ok: false,
|
|
131
|
+
response: notFoundProblem()
|
|
132
|
+
};
|
|
133
|
+
data = loaded;
|
|
134
|
+
}
|
|
135
|
+
if (permission === null) return {
|
|
136
|
+
ok: true,
|
|
137
|
+
permdock: instance,
|
|
138
|
+
data
|
|
139
|
+
};
|
|
140
|
+
const decideOptions = compact({
|
|
141
|
+
call: "adapter",
|
|
142
|
+
adapter: deps.adapter,
|
|
143
|
+
field: protectOptions.field,
|
|
144
|
+
explain: protectOptions.explain,
|
|
145
|
+
...protectOptions.trusted === true ? { trusted: true } : {
|
|
146
|
+
trusted: false,
|
|
147
|
+
boundary: "http-body"
|
|
148
|
+
}
|
|
149
|
+
});
|
|
150
|
+
const raw = remote === void 0 ? instance.decide(permission, data, decideOptions) : await remote.decide(permission, data, decideOptions).catch(() => ({
|
|
151
|
+
outcome: "denied",
|
|
152
|
+
denials: [{
|
|
153
|
+
role: null,
|
|
154
|
+
reason: "pdp-unavailable"
|
|
155
|
+
}],
|
|
156
|
+
alternatives: []
|
|
157
|
+
}));
|
|
158
|
+
const decision = await applyApprovalResume(raw, permission, instance, deps.options.store, request, resourceRef(permission, data), deps.adapter);
|
|
159
|
+
if (decision.outcome === "granted") return {
|
|
160
|
+
ok: true,
|
|
161
|
+
permdock: instance,
|
|
162
|
+
decision,
|
|
163
|
+
data
|
|
164
|
+
};
|
|
165
|
+
return refused(deps.options.deniedResponse, problemFromDecision(decision, permission, instance.subject, compact({
|
|
166
|
+
approval: deps.options.approval,
|
|
167
|
+
credentials,
|
|
168
|
+
scope: declared?.[0] ?? challengeScope(deps.policy, permission),
|
|
169
|
+
disclosure: data === void 0 ? void 0 : deps.policy.resources.get(permission.resource)?.disclosure
|
|
170
|
+
})), decision, request, report);
|
|
171
|
+
}
|
|
172
|
+
//#endregion
|
|
173
|
+
//#region src/server/create.ts
|
|
174
|
+
async function resolveActor(request, options) {
|
|
175
|
+
return (options.webBotAuth === void 0 ? void 0 : await options.webBotAuth.verify(request)) ?? actorFrom(options.actor, request);
|
|
176
|
+
}
|
|
177
|
+
const NO_TENANT = "\0";
|
|
178
|
+
/**
|
|
179
|
+
* The Fetch factory behind every HTTP adapter. The subject and actor are
|
|
180
|
+
* resolved once per `Request`; one instance is cached per `(Request, tenant)`,
|
|
181
|
+
* so a global middleware and a later tenant-scoped `protect` never share a
|
|
182
|
+
* tenant.
|
|
183
|
+
*/
|
|
184
|
+
function createPermDock(policy, given) {
|
|
185
|
+
const options = withApp(policy, given);
|
|
186
|
+
const adapter = options.adapter ?? "server";
|
|
187
|
+
const subjects = /* @__PURE__ */ new WeakMap();
|
|
188
|
+
const instances = /* @__PURE__ */ new WeakMap();
|
|
189
|
+
const freshSubject = async (request) => {
|
|
190
|
+
const actor = await resolveActor(request, options);
|
|
191
|
+
const errors = [];
|
|
192
|
+
const context = await requestContext(options.context, request, errors);
|
|
193
|
+
return {
|
|
194
|
+
user: await resolveOrNull(() => options.subject(request)),
|
|
195
|
+
actor,
|
|
196
|
+
context,
|
|
197
|
+
errors
|
|
198
|
+
};
|
|
199
|
+
};
|
|
200
|
+
const resolveSubject = (request) => {
|
|
201
|
+
const hit = subjects.get(request);
|
|
202
|
+
if (hit !== void 0) return hit;
|
|
203
|
+
const resolved = freshSubject(request);
|
|
204
|
+
subjects.set(request, resolved);
|
|
205
|
+
return resolved;
|
|
206
|
+
};
|
|
207
|
+
const reporters = /* @__PURE__ */ new WeakMap();
|
|
208
|
+
const instanceFor = async ({ user, actor, context, errors }, tenant) => {
|
|
209
|
+
const built = await buildReportingInstance({
|
|
210
|
+
policy,
|
|
211
|
+
user,
|
|
212
|
+
sources: options,
|
|
213
|
+
scope: {
|
|
214
|
+
tenant,
|
|
215
|
+
actor,
|
|
216
|
+
context
|
|
217
|
+
},
|
|
218
|
+
errors,
|
|
219
|
+
wrap: (created) => options.wrap === void 0 ? created : options.wrap(created)
|
|
220
|
+
});
|
|
221
|
+
const remote = options.pdp === void 0 ? void 0 : await options.pdp(policy, user, built.options);
|
|
222
|
+
reporters.set(built.permdock, built.report);
|
|
223
|
+
return {
|
|
224
|
+
permdock: built.permdock,
|
|
225
|
+
remote,
|
|
226
|
+
report: built.report
|
|
227
|
+
};
|
|
228
|
+
};
|
|
229
|
+
const build = async (request, scope) => {
|
|
230
|
+
const { tenant } = scope ?? await tenantScope(options.tenant, request);
|
|
231
|
+
let byTenant = instances.get(request);
|
|
232
|
+
if (byTenant === void 0) {
|
|
233
|
+
byTenant = /* @__PURE__ */ new Map();
|
|
234
|
+
instances.set(request, byTenant);
|
|
235
|
+
}
|
|
236
|
+
const key = tenant ?? NO_TENANT;
|
|
237
|
+
const hit = byTenant.get(key);
|
|
238
|
+
if (hit !== void 0) return hit;
|
|
239
|
+
const built = (async () => instanceFor(await resolveSubject(request), tenant))();
|
|
240
|
+
byTenant.set(key, built);
|
|
241
|
+
return built;
|
|
242
|
+
};
|
|
243
|
+
const connection = async (request, connectionOptions = {}, scope) => {
|
|
244
|
+
const { tenant } = scope ?? await tenantScope(options.tenant, request);
|
|
245
|
+
const { openConnection } = await import("./connection-DjhIJSs2.js");
|
|
246
|
+
return openConnection({
|
|
247
|
+
open: async () => (await build(request, { tenant })).permdock,
|
|
248
|
+
rebuild: async () => (await instanceFor(await freshSubject(request), tenant)).permdock,
|
|
249
|
+
tenant,
|
|
250
|
+
...options.revocations === void 0 ? {} : { feed: options.revocations },
|
|
251
|
+
adapter,
|
|
252
|
+
options: connectionOptions
|
|
253
|
+
});
|
|
254
|
+
};
|
|
255
|
+
const getPermDock = async (request, scope) => (await build(request, scope)).permdock;
|
|
256
|
+
const getSnapshot = async (request, query = {}) => {
|
|
257
|
+
return (await getPermDock(request, query.tenant === void 0 ? void 0 : { tenant: query.tenant })).snapshot(compact({
|
|
258
|
+
include: query.include,
|
|
259
|
+
tenants: query.tenants
|
|
260
|
+
}));
|
|
261
|
+
};
|
|
262
|
+
const deps = {
|
|
263
|
+
policy,
|
|
264
|
+
options,
|
|
265
|
+
adapter
|
|
266
|
+
};
|
|
267
|
+
const protectRoute = (permission, data, protectOptions = {}) => {
|
|
268
|
+
if (permission === null && routeScopes(protectOptions.oauthScopes) === void 0 && options.operations === void 0) throw new TypeError("PermDock: protect(null) needs oauthScopes, in its options or an operations entry");
|
|
269
|
+
return async (request, scope) => {
|
|
270
|
+
let instance;
|
|
271
|
+
let remote;
|
|
272
|
+
let report;
|
|
273
|
+
try {
|
|
274
|
+
({permdock: instance, remote, report} = await build(request, scope));
|
|
275
|
+
} catch (error) {
|
|
276
|
+
if (error instanceof InvalidSignatureError) return {
|
|
277
|
+
ok: false,
|
|
278
|
+
response: error.response
|
|
279
|
+
};
|
|
280
|
+
throw error;
|
|
281
|
+
}
|
|
282
|
+
return guardOn(deps, instance, remote, report, request, permission, data === void 0 ? void 0 : () => data(request), protectOptions);
|
|
283
|
+
};
|
|
284
|
+
};
|
|
285
|
+
const protect = protectRoute;
|
|
286
|
+
const openapi = {
|
|
287
|
+
security: (permission) => ({
|
|
288
|
+
security: [{ oauth2: [permission.scope] }],
|
|
289
|
+
"x-permdock-permissions": [permission.key]
|
|
290
|
+
}),
|
|
291
|
+
securitySchemes: () => {
|
|
292
|
+
const scopes = {};
|
|
293
|
+
for (const leaf of listPermissions(policy.permissions)) scopes[leaf.scope] = leaf.meta.title ?? leaf.key;
|
|
294
|
+
return { oauth2: {
|
|
295
|
+
type: "oauth2",
|
|
296
|
+
flows: {},
|
|
297
|
+
scopes
|
|
298
|
+
} };
|
|
299
|
+
}
|
|
300
|
+
};
|
|
301
|
+
const permdockHandler = (scope) => evaluationsHandler(compact({
|
|
302
|
+
policy,
|
|
303
|
+
resolve: scope === void 0 ? getPermDock : async (request) => getPermDock(request, await scope(request)),
|
|
304
|
+
store: options.store,
|
|
305
|
+
adapter
|
|
306
|
+
}));
|
|
307
|
+
return {
|
|
308
|
+
getPermDock,
|
|
309
|
+
getSnapshot,
|
|
310
|
+
protect,
|
|
311
|
+
protectOn: (instance, permission, load, protectOptions = {}, request) => guardOn(deps, instance, void 0, reporters.get(instance) ?? (() => void 0), request, permission, load, protectOptions),
|
|
312
|
+
connection,
|
|
313
|
+
shareSubject: (from, to) => {
|
|
314
|
+
const resolved = subjects.get(from);
|
|
315
|
+
if (resolved !== void 0 && !subjects.has(to)) subjects.set(to, resolved);
|
|
316
|
+
},
|
|
317
|
+
problem: (decision, init) => problemFor(decision, init, options.approval),
|
|
318
|
+
openapi,
|
|
319
|
+
permdockHandler
|
|
320
|
+
};
|
|
321
|
+
}
|
|
322
|
+
//#endregion
|
|
323
|
+
export { createPermDock as t };
|
|
@@ -1,11 +1,20 @@
|
|
|
1
|
-
import { n as isReadonlyArray, t as compact } from "./compact-
|
|
1
|
+
import { n as isReadonlyArray, t as compact } from "./compact-CAf557ZB.js";
|
|
2
2
|
import { n as freezeDeep } from "./freeze-CrU8nQeX.js";
|
|
3
|
-
import {
|
|
4
|
-
import {
|
|
5
|
-
import {
|
|
6
|
-
import {
|
|
7
|
-
import {
|
|
3
|
+
import { a as ownRecord } from "./paths-DXSHAMIa.js";
|
|
4
|
+
import { a as isId, r as idList } from "./expiry-D4_YKRKD.js";
|
|
5
|
+
import { n as internalsOf } from "./internals-Dk8A8fX3.js";
|
|
6
|
+
import { c as listPermissions, h as formerKeys } from "./permission-registry-Br4jSNVi.js";
|
|
7
|
+
import { g as secondsOf, l as isRfc3339, m as rfc3339, p as nowSeconds } from "./time-DkWjdL98.js";
|
|
8
|
+
import { t as canonicalJson } from "./canonical-json-BC8_nMTw.js";
|
|
9
|
+
import { r as sha256Digest } from "./sha256-D9ihqmvd.js";
|
|
10
|
+
import { n as coveredByDelegation } from "./delegation-DaXVdDhM.js";
|
|
11
|
+
import { o as flattenGrantee } from "./grantee-Cn1HyUsI.js";
|
|
12
|
+
import { t as anonymousSubject } from "./subject-BGoM5o8B.js";
|
|
8
13
|
//#region src/core/credential.ts
|
|
14
|
+
/** A feed id: lowercase, so a mail system that lowercases a local part still matches. At most 16 characters, so `pdfeed_<id>_<secret>` fits an email local part. */
|
|
15
|
+
function isFeedId(value) {
|
|
16
|
+
return /^[a-z0-9-]{1,16}$/u.test(value);
|
|
17
|
+
}
|
|
9
18
|
const MAX_NAME = 256;
|
|
10
19
|
function policies(policy) {
|
|
11
20
|
return isReadonlyArray(policy) ? policy : [policy];
|
|
@@ -18,10 +27,14 @@ function policies(policy) {
|
|
|
18
27
|
function credentialPolicyViolation(credential, policy) {
|
|
19
28
|
const list = policies(policy);
|
|
20
29
|
for (const item of list) if (item.kinds !== void 0 && !item.kinds.includes(credential.kind)) return "kind";
|
|
21
|
-
if (credential.expiresAt === void 0)
|
|
30
|
+
if (credential.expiresAt === void 0) {
|
|
31
|
+
if (credential.kind === "feed") return;
|
|
32
|
+
return list.some((item) => item.allowNoExpiry === true) && list.every((item) => item.maxTtl === void 0) ? void 0 : "no-expiry";
|
|
33
|
+
}
|
|
34
|
+
const lifetime = (secondsOf(credential.expiresAt) ?? NaN) - (secondsOf(credential.createdAt) ?? NaN);
|
|
22
35
|
for (const item of list) {
|
|
23
36
|
const max = item.maxTtl;
|
|
24
|
-
if (max !== void 0 && (
|
|
37
|
+
if (max !== void 0 && (!Number.isSafeInteger(max) || max < 0 || !(lifetime <= max))) return "ttl";
|
|
25
38
|
}
|
|
26
39
|
}
|
|
27
40
|
function parsePermissions(value) {
|
|
@@ -39,9 +52,6 @@ function parsePermissions(value) {
|
|
|
39
52
|
}
|
|
40
53
|
return out;
|
|
41
54
|
}
|
|
42
|
-
function isTime(value) {
|
|
43
|
-
return typeof value === "number" && Number.isFinite(value);
|
|
44
|
-
}
|
|
45
55
|
/**
|
|
46
56
|
* Validates an untrusted credential record and returns a frozen copy with
|
|
47
57
|
* only the v1 fields, or `undefined`. Unknown fields are dropped; a wrong
|
|
@@ -51,19 +61,30 @@ function isTime(value) {
|
|
|
51
61
|
function parseCredential(input) {
|
|
52
62
|
const value = ownRecord(input);
|
|
53
63
|
if (value === void 0 || value["v"] !== 1 || !isId(value["id"])) return;
|
|
54
|
-
if (value["kind"] !== "user" && value["kind"] !== "service") return;
|
|
64
|
+
if (value["kind"] !== "user" && value["kind"] !== "service" && value["kind"] !== "feed") return;
|
|
55
65
|
if (!isId(value["principal"]) || !isId(value["createdBy"])) return;
|
|
56
66
|
const permissions = parsePermissions(value["permissions"]);
|
|
57
|
-
if (permissions === void 0 || !
|
|
58
|
-
if (value["expiresAt"] !== void 0 && !
|
|
67
|
+
if (permissions === void 0 || !isRfc3339(value["createdAt"])) return;
|
|
68
|
+
if (value["expiresAt"] !== void 0 && !isRfc3339(value["expiresAt"])) return;
|
|
59
69
|
if (value["name"] !== void 0 && (typeof value["name"] !== "string" || value["name"].length > MAX_NAME)) return;
|
|
60
70
|
let tenant;
|
|
61
71
|
let roles;
|
|
72
|
+
let on;
|
|
62
73
|
if (value["kind"] === "service") {
|
|
63
74
|
roles = idList(value["roles"]);
|
|
64
|
-
if (!isId(value["tenant"]) || roles === void 0) return;
|
|
75
|
+
if (!isId(value["tenant"]) || roles === void 0 || value["on"] !== void 0) return;
|
|
65
76
|
tenant = value["tenant"];
|
|
66
|
-
} else if (value["
|
|
77
|
+
} else if (value["kind"] === "feed") {
|
|
78
|
+
roles = idList(value["roles"]);
|
|
79
|
+
const target = ownRecord(value["on"]);
|
|
80
|
+
if (roles === void 0 || target === void 0 || !isId(target["resource"]) || !isId(target["id"]) || value["principal"] !== value["id"] || !isFeedId(value["id"])) return;
|
|
81
|
+
if (value["tenant"] !== void 0 && !isId(value["tenant"])) return;
|
|
82
|
+
tenant = typeof value["tenant"] === "string" ? value["tenant"] : void 0;
|
|
83
|
+
on = {
|
|
84
|
+
resource: target["resource"],
|
|
85
|
+
id: target["id"]
|
|
86
|
+
};
|
|
87
|
+
} else if (value["roles"] !== void 0 || value["on"] !== void 0 || value["tenant"] !== void 0 && !isId(value["tenant"])) return;
|
|
67
88
|
else tenant = value["tenant"];
|
|
68
89
|
return freezeDeep(compact({
|
|
69
90
|
v: 1,
|
|
@@ -72,6 +93,7 @@ function parseCredential(input) {
|
|
|
72
93
|
principal: value["principal"],
|
|
73
94
|
tenant,
|
|
74
95
|
roles,
|
|
96
|
+
on,
|
|
75
97
|
permissions,
|
|
76
98
|
createdBy: value["createdBy"],
|
|
77
99
|
createdAt: value["createdAt"],
|
|
@@ -120,7 +142,7 @@ function credentialDelegation(credential, permissions) {
|
|
|
120
142
|
* owner, passed live as `owner` (roles and memberships as of this request),
|
|
121
143
|
* with the credential's delegation: every check is the owner's rights
|
|
122
144
|
* intersected with the key's. One that names a `tenant` makes it the active
|
|
123
|
-
* tenant, and `
|
|
145
|
+
* tenant, and `getPermDock` then keeps only the owner's memberships
|
|
124
146
|
* inside it and no global role. A `service` credential is a `service`
|
|
125
147
|
* principal whose only membership is `roles` in `tenant`. An owner whose id
|
|
126
148
|
* is not the credential's `principal`, or who is not a user, is anonymous.
|
|
@@ -128,7 +150,20 @@ function credentialDelegation(credential, permissions) {
|
|
|
128
150
|
function credentialSubject(credential, options) {
|
|
129
151
|
const delegation = credentialDelegation(credential, options.permissions);
|
|
130
152
|
let principal;
|
|
131
|
-
if (credential.kind === "
|
|
153
|
+
if (credential.kind === "feed") {
|
|
154
|
+
if (credential.on === void 0 || credential.roles === void 0) return anonymousSubject();
|
|
155
|
+
const membership = compact({
|
|
156
|
+
on: credential.on,
|
|
157
|
+
roles: credential.roles,
|
|
158
|
+
via: "feed"
|
|
159
|
+
});
|
|
160
|
+
principal = compact({
|
|
161
|
+
id: credential.id,
|
|
162
|
+
kind: "feed",
|
|
163
|
+
memberships: [membership],
|
|
164
|
+
credential
|
|
165
|
+
});
|
|
166
|
+
} else if (credential.kind === "user") {
|
|
132
167
|
const owner = options.owner ?? {
|
|
133
168
|
id: credential.principal,
|
|
134
169
|
kind: "user"
|
|
@@ -158,11 +193,11 @@ function credentialSubject(credential, options) {
|
|
|
158
193
|
principal,
|
|
159
194
|
delegation,
|
|
160
195
|
context: {},
|
|
161
|
-
expiresAt: credential.expiresAt
|
|
196
|
+
expiresAt: secondsOf(credential.expiresAt)
|
|
162
197
|
}));
|
|
163
198
|
}
|
|
164
199
|
function credentialToken(credential) {
|
|
165
|
-
const payload =
|
|
200
|
+
const payload = canonicalJson({
|
|
166
201
|
t: "credential",
|
|
167
202
|
id: credential.id,
|
|
168
203
|
kind: credential.kind,
|
|
@@ -170,11 +205,12 @@ function credentialToken(credential) {
|
|
|
170
205
|
tenant: credential.tenant ?? null,
|
|
171
206
|
roles: credential.roles ?? null,
|
|
172
207
|
permissions: credential.permissions,
|
|
208
|
+
...credential.on === void 0 ? {} : { on: credential.on },
|
|
173
209
|
createdBy: credential.createdBy,
|
|
174
210
|
expiresAt: credential.expiresAt ?? null,
|
|
175
211
|
name: credential.name ?? null
|
|
176
212
|
});
|
|
177
|
-
return
|
|
213
|
+
return sha256Digest(payload);
|
|
178
214
|
}
|
|
179
215
|
function denied(reason, detail) {
|
|
180
216
|
return freezeDeep({
|
|
@@ -213,28 +249,90 @@ function refuse(reason, detail) {
|
|
|
213
249
|
decision: denied(reason, detail)
|
|
214
250
|
};
|
|
215
251
|
}
|
|
252
|
+
function oneResource(resource) {
|
|
253
|
+
const names = new Set(listPermissions(resource).map((leaf) => leaf.resource));
|
|
254
|
+
const [name] = names;
|
|
255
|
+
return names.size === 1 && name !== void 0 ? name : void 0;
|
|
256
|
+
}
|
|
257
|
+
function granteeOnResource(to, resource, role) {
|
|
258
|
+
for (const grant of flattenGrantee(to)) if (grant.kind === "role" && grant.role === role && typeof grant.scope === "object" && grant.scope.resource === resource) return true;
|
|
259
|
+
return false;
|
|
260
|
+
}
|
|
261
|
+
function roleDeclaredOn(permdock, resource, resourceName, roleName, id, row) {
|
|
262
|
+
const preview = permdock.simulate({
|
|
263
|
+
roles: [],
|
|
264
|
+
memberships: [{
|
|
265
|
+
on: {
|
|
266
|
+
resource: resourceName,
|
|
267
|
+
id
|
|
268
|
+
},
|
|
269
|
+
roles: [roleName]
|
|
270
|
+
}]
|
|
271
|
+
});
|
|
272
|
+
for (const leaf of listPermissions(resource)) {
|
|
273
|
+
if (leaf.resource !== resourceName) continue;
|
|
274
|
+
const decision = preview.explain(leaf, row, { trusted: true });
|
|
275
|
+
const seen = [
|
|
276
|
+
..."matched" in decision && decision.matched !== void 0 ? [decision.matched] : [],
|
|
277
|
+
...decision.trace?.allows ?? [],
|
|
278
|
+
...decision.trace?.denies ?? [],
|
|
279
|
+
..."denials" in decision ? decision.denials : []
|
|
280
|
+
];
|
|
281
|
+
for (const grant of seen) {
|
|
282
|
+
if (grant.role !== roleName) continue;
|
|
283
|
+
if (granteeOnResource(grant.to, resourceName, roleName)) return true;
|
|
284
|
+
}
|
|
285
|
+
}
|
|
286
|
+
return false;
|
|
287
|
+
}
|
|
288
|
+
function feedTarget(permdock, request, entries) {
|
|
289
|
+
const resource = oneResource(request.on.resource);
|
|
290
|
+
if (resource === void 0 || !isFeedId(request.id) || !isId(request.on.id) || request.row === void 0 || request.row === null || request.roles.length === 0) return refuse("validation");
|
|
291
|
+
for (const entry of entries) {
|
|
292
|
+
if (entry.leaf.resource !== resource) return refuse("exceeds-creator", { permission: entry.leaf.key });
|
|
293
|
+
if (entry.ids !== void 0 && (entry.ids.length !== 1 || entry.ids[0] !== request.on.id)) return refuse("exceeds-creator", { permission: entry.leaf.key });
|
|
294
|
+
if (permdock.decide(entry.leaf, request.row, { trusted: true }).outcome !== "granted") return refuse("exceeds-creator", { permission: entry.leaf.key });
|
|
295
|
+
}
|
|
296
|
+
for (const name of request.roles) if (!roleDeclaredOn(permdock, request.on.resource, resource, name, request.on.id, request.row)) return refuse("exceeds-creator", { role: name });
|
|
297
|
+
return {
|
|
298
|
+
ok: true,
|
|
299
|
+
resource
|
|
300
|
+
};
|
|
301
|
+
}
|
|
302
|
+
function feedOn(request, feed) {
|
|
303
|
+
if (request.kind !== "feed" || feed === void 0) return;
|
|
304
|
+
if (feed.ok && "resource" in feed) return {
|
|
305
|
+
resource: feed.resource,
|
|
306
|
+
id: request.on.id
|
|
307
|
+
};
|
|
308
|
+
}
|
|
216
309
|
function checkRequest(permdock, request, now) {
|
|
217
310
|
const creator = permdock.subject.principal;
|
|
218
311
|
if (creator === null) return refuse("anonymous");
|
|
219
|
-
if (creator.kind === "link" || "
|
|
312
|
+
if (creator.kind === "link" || creator.kind === "feed" || creator.kind === "contact") return refuse("exceeds-creator", { creator: creator.kind });
|
|
313
|
+
if ("credential" in creator) return refuse("exceeds-creator", { creator: "credential" });
|
|
220
314
|
const entries = permissionEntries(request, leafByKey(permdock.permissions));
|
|
221
|
-
|
|
315
|
+
const expires = request.expiresAt === void 0 ? void 0 : secondsOf(request.expiresAt);
|
|
316
|
+
if (entries === void 0 || !isId(request.id) || request.expiresAt !== void 0 && (expires === void 0 || expires <= now)) return refuse("validation");
|
|
317
|
+
const feed = request.kind === "feed" ? feedTarget(permdock, request, entries) : void 0;
|
|
318
|
+
if (feed !== void 0 && !feed.ok) return feed;
|
|
222
319
|
const subject = permdock.subject;
|
|
223
320
|
for (const entry of entries) for (const id of entry.ids ?? [void 0]) if (coveredByDelegation(entry.leaf, subject.delegation, id, subject.actor !== void 0) !== void 0) return refuse("exceeds-creator", { permission: entry.leaf.key });
|
|
224
321
|
const credential = parseCredential(compact({
|
|
225
322
|
v: 1,
|
|
226
323
|
id: request.id,
|
|
227
324
|
kind: request.kind,
|
|
228
|
-
principal: request.kind === "service" ? request.principal ?? request.id : creator.id,
|
|
229
|
-
tenant: request.tenant,
|
|
230
|
-
roles: request.kind === "service" ? request.roles : void 0,
|
|
325
|
+
principal: request.kind === "service" ? request.principal ?? request.id : request.kind === "feed" ? request.id : creator.id,
|
|
326
|
+
tenant: "tenant" in request ? request.tenant : void 0,
|
|
327
|
+
roles: request.kind === "service" || request.kind === "feed" ? request.roles : void 0,
|
|
328
|
+
on: feedOn(request, feed),
|
|
231
329
|
permissions: entries.map((entry) => compact({
|
|
232
330
|
permission: entry.leaf.key,
|
|
233
|
-
ids: entry.ids
|
|
331
|
+
ids: request.kind === "feed" ? [request.on.id] : entry.ids
|
|
234
332
|
})),
|
|
235
333
|
createdBy: creator.id,
|
|
236
|
-
createdAt: now,
|
|
237
|
-
expiresAt: request.expiresAt
|
|
334
|
+
createdAt: rfc3339(now),
|
|
335
|
+
expiresAt: request.expiresAt,
|
|
238
336
|
name: request.name
|
|
239
337
|
}));
|
|
240
338
|
if (credential === void 0) return refuse("validation");
|
|
@@ -275,8 +373,31 @@ function credentialTenant(credential, active) {
|
|
|
275
373
|
* its token. PermDock never stores the credential; the application does,
|
|
276
374
|
* after a `granted` result.
|
|
277
375
|
*/
|
|
278
|
-
|
|
279
|
-
|
|
376
|
+
/**
|
|
377
|
+
* Decides whether the subject of `permdock` may create the credential in
|
|
378
|
+
* `request`: the creator's own reach, the `credentials` policy of the key's
|
|
379
|
+
* tenant (the call's `settings`, else the instance's), and `approval`.
|
|
380
|
+
* PermDock never stores the credential; the application does, after a
|
|
381
|
+
* `granted` result. An instance built from a snapshot denies with
|
|
382
|
+
* `unsupported`.
|
|
383
|
+
*/
|
|
384
|
+
function decideCredential(permdock, request, options = {}) {
|
|
385
|
+
const internals = internalsOf(permdock);
|
|
386
|
+
if (internals === void 0) return Promise.resolve(freezeDeep({
|
|
387
|
+
outcome: "denied",
|
|
388
|
+
denials: [{
|
|
389
|
+
role: null,
|
|
390
|
+
reason: "unsupported"
|
|
391
|
+
}]
|
|
392
|
+
}));
|
|
393
|
+
const settings = options.settings ?? internals.env.settings;
|
|
394
|
+
return decideCredentialWith(internals.instance, request, settings === void 0 ? options : {
|
|
395
|
+
...options,
|
|
396
|
+
settings
|
|
397
|
+
});
|
|
398
|
+
}
|
|
399
|
+
async function decideCredentialWith(permdock, request, options) {
|
|
400
|
+
const checked = checkRequest(permdock, request, nowSeconds(options.now));
|
|
280
401
|
if (!checked.ok) return checked.decision;
|
|
281
402
|
const { credential } = checked;
|
|
282
403
|
const tenant = credentialTenant(credential, permdock.subject.principal?.tenant);
|
|
@@ -303,4 +424,4 @@ async function decideCredential(permdock, request, options = {}) {
|
|
|
303
424
|
});
|
|
304
425
|
}
|
|
305
426
|
//#endregion
|
|
306
|
-
export { decideCredential as a, credentialTenant as i, credentialPolicyViolation as n,
|
|
427
|
+
export { decideCredential as a, credentialTenant as i, credentialPolicyViolation as n, isFeedId as o, credentialSubject as r, parseCredential as s, credentialDelegation as t };
|