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
package/dist/authzen/index.js
CHANGED
|
@@ -1,46 +1,192 @@
|
|
|
1
|
-
import { t as compact } from "../compact-
|
|
2
|
-
import {
|
|
3
|
-
import {
|
|
4
|
-
import {
|
|
1
|
+
import { r as isRecord, t as compact } from "../compact-CAf557ZB.js";
|
|
2
|
+
import { r as ownGet } from "../paths-DXSHAMIa.js";
|
|
3
|
+
import { o as statusProblem } from "../problem-details-cn5X30gZ.js";
|
|
4
|
+
import { a as getResource, c as listPermissions } from "../permission-registry-Br4jSNVi.js";
|
|
5
|
+
import { t as fromWireDelegation } from "../wire-delegation-Cv3W2eaM.js";
|
|
5
6
|
import { n as resourceRef } from "../resource-ref-CaS9yVPi.js";
|
|
6
|
-
import { n as
|
|
7
|
-
import {
|
|
8
|
-
import {
|
|
9
|
-
import { t as
|
|
10
|
-
import { n as
|
|
11
|
-
import {
|
|
7
|
+
import { n as readBodyText } from "../body-text-QcXok_SI.js";
|
|
8
|
+
import { r as hasCredentials } from "../http-BBoKefeS.js";
|
|
9
|
+
import { a as methodNotAllowed, c as problemResponse, d as validationProblem, n as batchTooLarge, u as unauthenticatedProblem } from "../problem-CTviyH5L.js";
|
|
10
|
+
import { t as bodyTooLarge } from "../body-CH5of8Ne.js";
|
|
11
|
+
import { n as resolveOrNull, t as buildInstance } from "../build-instance-BMnAudHn.js";
|
|
12
|
+
import { _ as wireResourceId, a as evaluationReasons, c as unknownSemanticProblem, g as permissionLookup, h as itemResourceData, i as evaluateBatch, l as withRequestId, n as applyApprovalResume, r as authzenMetadata, s as evaluationsSemantic, t as EVALUATIONS_SEMANTICS } from "../evaluations-DZ2CbV5k.js";
|
|
13
|
+
//#region src/authzen/map.ts
|
|
14
|
+
const UNKNOWN = {
|
|
15
|
+
outcome: "denied",
|
|
16
|
+
denials: [{
|
|
17
|
+
role: null,
|
|
18
|
+
reason: "no-grant",
|
|
19
|
+
detail: "unknown-permission"
|
|
20
|
+
}],
|
|
21
|
+
alternatives: []
|
|
22
|
+
};
|
|
23
|
+
const UNAVAILABLE = {
|
|
24
|
+
outcome: "denied",
|
|
25
|
+
denials: [{
|
|
26
|
+
role: null,
|
|
27
|
+
reason: "no-grant",
|
|
28
|
+
detail: "resource-unavailable"
|
|
29
|
+
}],
|
|
30
|
+
alternatives: []
|
|
31
|
+
};
|
|
32
|
+
function actionNameOf(item) {
|
|
33
|
+
if (typeof item.action?.name === "string") return item.action.name;
|
|
34
|
+
if (!isRecord(item.action?.properties)) return;
|
|
35
|
+
const scope = item.action.properties["scope"];
|
|
36
|
+
return typeof scope === "string" ? scope : void 0;
|
|
37
|
+
}
|
|
38
|
+
function permissionOf(lookup, item) {
|
|
39
|
+
return lookup(actionNameOf(item), item.resource);
|
|
40
|
+
}
|
|
41
|
+
function resourceData(item) {
|
|
42
|
+
return itemResourceData(item.resource);
|
|
43
|
+
}
|
|
44
|
+
/** The row id an item names; `undefined` for none and for the collection sentinel `id: "*"`. */
|
|
45
|
+
function resourceIdOf(item) {
|
|
46
|
+
return wireResourceId(item.resource?.id);
|
|
47
|
+
}
|
|
48
|
+
function userFromEntity(entity) {
|
|
49
|
+
if (entity === void 0) return null;
|
|
50
|
+
const result = {};
|
|
51
|
+
if (typeof entity.id === "string" || typeof entity.id === "number") result["id"] = String(entity.id);
|
|
52
|
+
if (isRecord(entity.properties)) for (const [key, value] of Object.entries(entity.properties)) {
|
|
53
|
+
if (key === "actor" || key === "delegation") continue;
|
|
54
|
+
result[key] = value;
|
|
55
|
+
}
|
|
56
|
+
return Object.keys(result).length === 0 ? null : result;
|
|
57
|
+
}
|
|
58
|
+
function contextOrSubject(item, name) {
|
|
59
|
+
return (isRecord(item.context) ? item.context[name] : void 0) ?? (isRecord(item.subject?.properties) ? item.subject.properties[name] : void 0);
|
|
60
|
+
}
|
|
61
|
+
function actorOf(item) {
|
|
62
|
+
const raw = contextOrSubject(item, "actor");
|
|
63
|
+
if (!isRecord(raw) || typeof raw["id"] !== "string") return;
|
|
64
|
+
const kind = typeof raw["kind"] === "string" ? raw["kind"] : "oauth-client";
|
|
65
|
+
return {
|
|
66
|
+
id: raw["id"],
|
|
67
|
+
kind
|
|
68
|
+
};
|
|
69
|
+
}
|
|
70
|
+
function delegationOf(item) {
|
|
71
|
+
return fromWireDelegation(contextOrSubject(item, "delegation"));
|
|
72
|
+
}
|
|
73
|
+
function tenantOf(item) {
|
|
74
|
+
if (!isRecord(item.context) || typeof item.context["tenant"] !== "string") return;
|
|
75
|
+
return item.context["tenant"];
|
|
76
|
+
}
|
|
77
|
+
function permdockContext(decision) {
|
|
78
|
+
switch (decision.outcome) {
|
|
79
|
+
case "granted": return { outcome: "granted" };
|
|
80
|
+
case "denied": {
|
|
81
|
+
const unknown = decision.denials.some((denial) => denial.detail === "unknown-permission");
|
|
82
|
+
return compact({
|
|
83
|
+
outcome: "denied",
|
|
84
|
+
denials: decision.denials.map((denial) => ({
|
|
85
|
+
role: denial.role,
|
|
86
|
+
reason: denial.reason
|
|
87
|
+
})),
|
|
88
|
+
reason: unknown ? "unknown-permission" : void 0
|
|
89
|
+
});
|
|
90
|
+
}
|
|
91
|
+
case "approval-required": return {
|
|
92
|
+
outcome: "approval-required",
|
|
93
|
+
token: decision.token
|
|
94
|
+
};
|
|
95
|
+
default: return decision;
|
|
96
|
+
}
|
|
97
|
+
}
|
|
98
|
+
function evaluationRow(decision, permission) {
|
|
99
|
+
return {
|
|
100
|
+
decision: decision.outcome === "granted",
|
|
101
|
+
context: {
|
|
102
|
+
permdock: permdockContext(decision),
|
|
103
|
+
...evaluationReasons(decision, permission)
|
|
104
|
+
}
|
|
105
|
+
};
|
|
106
|
+
}
|
|
107
|
+
function pathnameOf(request) {
|
|
108
|
+
return new URL(request.url).pathname;
|
|
109
|
+
}
|
|
110
|
+
function endsWithPath(pathname, suffix) {
|
|
111
|
+
return pathname === suffix || pathname.endsWith(suffix);
|
|
112
|
+
}
|
|
113
|
+
/**
|
|
114
|
+
* One item of an `evaluations` batch with the request's top-level `subject`,
|
|
115
|
+
* `action`, `resource` and `context` filled in where the item omits them.
|
|
116
|
+
*/
|
|
117
|
+
function mergeEvaluationItem(shared, item) {
|
|
118
|
+
if (!isRecord(item)) return shared;
|
|
119
|
+
return compact({
|
|
120
|
+
subject: isRecord(item["subject"]) ? item["subject"] : shared.subject,
|
|
121
|
+
action: isRecord(item["action"]) ? item["action"] : shared.action,
|
|
122
|
+
resource: isRecord(item["resource"]) ? item["resource"] : shared.resource,
|
|
123
|
+
context: item["context"] ?? shared.context
|
|
124
|
+
});
|
|
125
|
+
}
|
|
126
|
+
function pageOf(body) {
|
|
127
|
+
const page = isRecord(body["page"]) ? body["page"] : {};
|
|
128
|
+
const raw = typeof page["token"] === "string" ? page["token"] : typeof page["next_token"] === "string" ? page["next_token"] : "0";
|
|
129
|
+
const parsed = Math.trunc(Number(raw));
|
|
130
|
+
const sizeRaw = page["limit"] ?? page["size"];
|
|
131
|
+
const size = typeof sizeRaw === "number" && sizeRaw > 0 ? Math.min(sizeRaw, 200) : 50;
|
|
132
|
+
return {
|
|
133
|
+
offset: Number.isFinite(parsed) && parsed > 0 ? parsed : 0,
|
|
134
|
+
size
|
|
135
|
+
};
|
|
136
|
+
}
|
|
137
|
+
function paged(items, offset, size) {
|
|
138
|
+
const slice = items.slice(offset, offset + size);
|
|
139
|
+
const next = offset + slice.length;
|
|
140
|
+
return {
|
|
141
|
+
results: slice,
|
|
142
|
+
page: {
|
|
143
|
+
next_token: next < items.length ? String(next) : "",
|
|
144
|
+
count: slice.length,
|
|
145
|
+
total: items.length
|
|
146
|
+
}
|
|
147
|
+
};
|
|
148
|
+
}
|
|
149
|
+
//#endregion
|
|
12
150
|
//#region src/authzen/create.ts
|
|
13
151
|
function notFound(detail) {
|
|
14
|
-
return problemResponse(
|
|
15
|
-
type: `${PROBLEM_BASE}/not-found`,
|
|
16
|
-
title: "Not found",
|
|
17
|
-
status: 404,
|
|
18
|
-
detail
|
|
19
|
-
});
|
|
152
|
+
return problemResponse(statusProblem(404, detail));
|
|
20
153
|
}
|
|
21
154
|
async function readJson(request) {
|
|
155
|
+
if (request.headers.get("content-type")?.split(";", 1)[0]?.trim().toLowerCase() !== "application/json") return validationProblem("AuthZEN requests must use Content-Type: application/json");
|
|
156
|
+
const read = await readBodyText(request);
|
|
157
|
+
if (!read.ok) return read.cause === "too-large" ? bodyTooLarge() : validationProblem("AuthZEN body was not valid JSON");
|
|
22
158
|
try {
|
|
23
|
-
return
|
|
159
|
+
return JSON.parse(read.text);
|
|
24
160
|
} catch {
|
|
25
161
|
return validationProblem("AuthZEN body was not valid JSON");
|
|
26
162
|
}
|
|
27
163
|
}
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
164
|
+
/**
|
|
165
|
+
* The 400 for a request missing a required entity or one of its required
|
|
166
|
+
* fields (AuthZEN 1.0 sections 5, 6.1 and 10.1.1), or `undefined`.
|
|
167
|
+
*/
|
|
168
|
+
function missingProblem(body, required) {
|
|
169
|
+
for (const name of ["subject", "resource"]) {
|
|
170
|
+
const needs = required[name];
|
|
171
|
+
if (needs === void 0) continue;
|
|
172
|
+
const entity = body[name];
|
|
173
|
+
if (!isRecord(entity) || typeof entity["type"] !== "string") return validationProblem(`${name}.type is required`);
|
|
174
|
+
if (needs === "type-id" && typeof entity["id"] !== "string") return validationProblem(`${name}.id is required`);
|
|
175
|
+
}
|
|
176
|
+
if (required.action === true) {
|
|
177
|
+
const action = body["action"];
|
|
178
|
+
if (!isRecord(action) || typeof action["name"] !== "string") return validationProblem("action.name is required");
|
|
179
|
+
}
|
|
38
180
|
}
|
|
181
|
+
const EVALUATION = {
|
|
182
|
+
subject: "type-id",
|
|
183
|
+
action: true,
|
|
184
|
+
resource: "type-id"
|
|
185
|
+
};
|
|
39
186
|
const WELL_KNOWN = "/.well-known/authzen-configuration";
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
return response;
|
|
187
|
+
/** The name an item's action gives, for the reasons of an unknown permission. */
|
|
188
|
+
function actionName(item) {
|
|
189
|
+
return typeof item.action?.name === "string" ? item.action.name : "unknown";
|
|
44
190
|
}
|
|
45
191
|
const createPermDock = (policy, options) => {
|
|
46
192
|
const maxEvaluations = options.maxEvaluations ?? 256;
|
|
@@ -56,24 +202,23 @@ const createPermDock = (policy, options) => {
|
|
|
56
202
|
};
|
|
57
203
|
const allowAnonymous = options.anonymous === true;
|
|
58
204
|
async function authenticate(request) {
|
|
59
|
-
|
|
60
|
-
try {
|
|
61
|
-
pep = await options.subject(request);
|
|
62
|
-
} catch {
|
|
63
|
-
pep = null;
|
|
64
|
-
}
|
|
205
|
+
const pep = await resolveOrNull(() => options.subject(request));
|
|
65
206
|
if ((pep === null || pep === void 0) && !allowAnonymous) return unauthenticatedProblem(hasCredentials(request));
|
|
66
207
|
return { pep: pep ?? null };
|
|
67
208
|
}
|
|
68
|
-
function instantiate(pep, item) {
|
|
209
|
+
async function instantiate(pep, item) {
|
|
69
210
|
const trusted = trusts(pep);
|
|
70
211
|
const user = (trusted ? userFromEntity(item.subject) : null) ?? pep;
|
|
71
|
-
return
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
212
|
+
return (await buildInstance({
|
|
213
|
+
policy,
|
|
214
|
+
user,
|
|
215
|
+
sources: options,
|
|
216
|
+
scope: {
|
|
217
|
+
actor: trusted ? actorOf(item) : void 0,
|
|
218
|
+
delegation: trusted ? delegationOf(item) : void 0,
|
|
219
|
+
tenant: tenantOf(item)
|
|
220
|
+
}
|
|
221
|
+
})).permdock;
|
|
77
222
|
}
|
|
78
223
|
async function resourceOf(item) {
|
|
79
224
|
const properties = item.resource?.properties;
|
|
@@ -83,7 +228,7 @@ const createPermDock = (policy, options) => {
|
|
|
83
228
|
};
|
|
84
229
|
const type = typeof item.resource?.type === "string" ? item.resource.type : void 0;
|
|
85
230
|
const id = resourceIdOf(item);
|
|
86
|
-
const load = type !== void 0 && options.resources !== void 0 ? options.resources[type]?.
|
|
231
|
+
const load = type !== void 0 && options.resources !== void 0 ? options.resources[type]?.data : void 0;
|
|
87
232
|
if (id !== void 0 && load !== void 0) try {
|
|
88
233
|
return {
|
|
89
234
|
data: await load(id),
|
|
@@ -106,22 +251,27 @@ const createPermDock = (policy, options) => {
|
|
|
106
251
|
const permdock = await instantiate(pep, item);
|
|
107
252
|
const decide = permdock.decide;
|
|
108
253
|
const decision = decide(permission, data, trusted ? {
|
|
109
|
-
|
|
254
|
+
call: "endpoint",
|
|
110
255
|
adapter: "authzen",
|
|
111
256
|
trusted: true
|
|
112
257
|
} : {
|
|
113
|
-
|
|
258
|
+
call: "endpoint",
|
|
114
259
|
adapter: "authzen",
|
|
115
260
|
trusted: false,
|
|
116
261
|
boundary: "decision-endpoint"
|
|
117
262
|
});
|
|
118
|
-
return applyApprovalResume(decision, permission, permdock, options.store, request, resourceRef(permission, data, item
|
|
263
|
+
return applyApprovalResume(decision, permission, permdock, options.store, request, resourceRef(permission, data, resourceIdOf(item)), "authzen");
|
|
264
|
+
}
|
|
265
|
+
async function rowOf(request, pep, item) {
|
|
266
|
+
return evaluationRow(await decideItem(request, pep, item), permissionOf(lookup, item)?.key ?? actionName(item));
|
|
119
267
|
}
|
|
120
268
|
async function evaluation(request, pep) {
|
|
121
269
|
const body = await readJson(request);
|
|
122
270
|
if (body instanceof Response) return body;
|
|
123
271
|
if (!isRecord(body)) return validationProblem("evaluation body must be an object");
|
|
124
|
-
|
|
272
|
+
const missing = missingProblem(body, EVALUATION);
|
|
273
|
+
if (missing !== void 0) return missing;
|
|
274
|
+
return Response.json(await rowOf(request, pep, body));
|
|
125
275
|
}
|
|
126
276
|
async function evaluations(request, pep) {
|
|
127
277
|
const body = await readJson(request);
|
|
@@ -129,31 +279,27 @@ const createPermDock = (policy, options) => {
|
|
|
129
279
|
if (!isRecord(body)) return validationProblem("evaluations body must be an object");
|
|
130
280
|
const items = body["evaluations"] ?? [];
|
|
131
281
|
if (!Array.isArray(items)) return validationProblem("evaluations must be an array");
|
|
132
|
-
if (items.length === 0) return Response.json(
|
|
282
|
+
if (items.length === 0) return missingProblem(body, EVALUATION) ?? Response.json(await rowOf(request, pep, body));
|
|
133
283
|
if (items.length > maxEvaluations) return batchTooLarge(maxEvaluations);
|
|
134
|
-
const semantic =
|
|
135
|
-
if (semantic === void 0) return
|
|
284
|
+
const semantic = evaluationsSemantic(body);
|
|
285
|
+
if (semantic === void 0) return unknownSemanticProblem();
|
|
136
286
|
const shared = compact({
|
|
137
287
|
subject: isRecord(body["subject"]) ? body["subject"] : void 0,
|
|
138
288
|
action: isRecord(body["action"]) ? body["action"] : void 0,
|
|
139
289
|
resource: isRecord(body["resource"]) ? body["resource"] : void 0,
|
|
140
290
|
context: body["context"]
|
|
141
291
|
});
|
|
142
|
-
|
|
143
|
-
if (semantic === "execute_all") return Response.json({ evaluations: await Promise.all(items.map(rowOf)) });
|
|
144
|
-
const stopOn = semantic === "permit_on_first_permit";
|
|
145
|
-
const rows = [];
|
|
146
|
-
for (const item of items) {
|
|
147
|
-
const row = await rowOf(item);
|
|
148
|
-
rows.push(row);
|
|
149
|
-
if (row.decision === stopOn) break;
|
|
150
|
-
}
|
|
151
|
-
return Response.json({ evaluations: rows });
|
|
292
|
+
return Response.json({ evaluations: await evaluateBatch(items, semantic, (item) => rowOf(request, pep, mergeEvaluationItem(shared, item))) });
|
|
152
293
|
}
|
|
153
294
|
async function searchAction(request, pep) {
|
|
154
295
|
const body = await readJson(request);
|
|
155
296
|
if (body instanceof Response) return body;
|
|
156
297
|
if (!isRecord(body)) return validationProblem("search/action body must be an object");
|
|
298
|
+
const missingAction = missingProblem(body, {
|
|
299
|
+
subject: "type-id",
|
|
300
|
+
resource: "type-id"
|
|
301
|
+
});
|
|
302
|
+
if (missingAction !== void 0) return missingAction;
|
|
157
303
|
const item = body;
|
|
158
304
|
const type = typeof item.resource?.type === "string" ? item.resource.type : void 0;
|
|
159
305
|
const leaves = listPermissions(policy.permissions).filter((leaf) => type === void 0 || leaf.resource === type);
|
|
@@ -184,6 +330,12 @@ const createPermDock = (policy, options) => {
|
|
|
184
330
|
const body = await readJson(request);
|
|
185
331
|
if (body instanceof Response) return body;
|
|
186
332
|
if (!isRecord(body)) return validationProblem("search/resource body must be an object");
|
|
333
|
+
const missingResource = missingProblem(body, {
|
|
334
|
+
subject: "type-id",
|
|
335
|
+
action: true,
|
|
336
|
+
resource: "type"
|
|
337
|
+
});
|
|
338
|
+
if (missingResource !== void 0) return missingResource;
|
|
187
339
|
const item = body;
|
|
188
340
|
const type = typeof item.resource?.type === "string" ? item.resource.type : void 0;
|
|
189
341
|
const permission = permissionOf(lookup, item);
|
|
@@ -209,6 +361,12 @@ const createPermDock = (policy, options) => {
|
|
|
209
361
|
const body = await readJson(request);
|
|
210
362
|
if (body instanceof Response) return body;
|
|
211
363
|
if (!isRecord(body)) return validationProblem("search/subject body must be an object");
|
|
364
|
+
const missingSubject = missingProblem(body, {
|
|
365
|
+
subject: "type",
|
|
366
|
+
action: true,
|
|
367
|
+
resource: "type-id"
|
|
368
|
+
});
|
|
369
|
+
if (missingSubject !== void 0) return missingSubject;
|
|
212
370
|
let records;
|
|
213
371
|
try {
|
|
214
372
|
records = await options.subjects.list();
|
|
@@ -243,15 +401,11 @@ const createPermDock = (policy, options) => {
|
|
|
243
401
|
}
|
|
244
402
|
function discovery(request, pathname) {
|
|
245
403
|
const pdp = `${new URL(request.url).origin}${pathname.slice(pathname.indexOf(WELL_KNOWN) + 34).replace(/\/+$/u, "")}`;
|
|
246
|
-
|
|
247
|
-
|
|
248
|
-
|
|
249
|
-
|
|
250
|
-
|
|
251
|
-
search_resource_endpoint: `${pdp}/access/v1/search/resource`
|
|
252
|
-
};
|
|
253
|
-
if (options.subjects?.list !== void 0) document["search_subject_endpoint"] = `${pdp}/access/v1/search/subject`;
|
|
254
|
-
return Response.json(document);
|
|
404
|
+
return Response.json(authzenMetadata(pdp, {
|
|
405
|
+
action: true,
|
|
406
|
+
resource: true,
|
|
407
|
+
subject: options.subjects?.list !== void 0
|
|
408
|
+
}));
|
|
255
409
|
}
|
|
256
410
|
async function route(request) {
|
|
257
411
|
const pathname = pathnameOf(request);
|
|
@@ -294,9 +448,8 @@ const createPermDock = (policy, options) => {
|
|
|
294
448
|
}
|
|
295
449
|
return notFound("unknown AuthZEN path");
|
|
296
450
|
}
|
|
297
|
-
|
|
298
|
-
|
|
299
|
-
} };
|
|
451
|
+
const handler = async (request) => withRequestId(request, await route(request));
|
|
452
|
+
return { permdockHandler: () => handler };
|
|
300
453
|
};
|
|
301
454
|
//#endregion
|
|
302
|
-
export { createPermDock };
|
|
455
|
+
export { EVALUATIONS_SEMANTICS, createPermDock, evaluateBatch, evaluationsSemantic, mergeEvaluationItem };
|
|
@@ -0,0 +1,114 @@
|
|
|
1
|
+
import { Lt as InstanceHandle, Pn as Denial, Rt as Instant } from "./policy-types-DzwivBgR.js";
|
|
2
|
+
import { w as Permission } from "./vocabulary-D6lPdb4Z.js";
|
|
3
|
+
import { t as Operation } from "./operations-CxybZErY.js";
|
|
4
|
+
//#region src/core/automation.d.ts
|
|
5
|
+
/**
|
|
6
|
+
* Who an automation runs as. `publisher`: the person who published it, with
|
|
7
|
+
* their rights as of each run. `service`: a `kind: 'service'` principal
|
|
8
|
+
* holding `roles` in `tenant`, capped at what the publisher could assign.
|
|
9
|
+
*/
|
|
10
|
+
type AutomationMode = "publisher" | "service";
|
|
11
|
+
/**
|
|
12
|
+
* Automation v1: a published, versioned run of operations. Every run acts
|
|
13
|
+
* as `principal` with live rights, narrowed to `permissions` (the
|
|
14
|
+
* operations' permissions) and to any policy delegation to
|
|
15
|
+
* `actor('automation')`. The event that triggers a run never grants.
|
|
16
|
+
*/
|
|
17
|
+
type Automation = {
|
|
18
|
+
readonly v: 1;
|
|
19
|
+
readonly id: string;
|
|
20
|
+
/** Changes on every edit; a run ticket for another version is refused. */
|
|
21
|
+
readonly version: number | string;
|
|
22
|
+
readonly mode: AutomationMode;
|
|
23
|
+
/** The principal each run acts as: the publisher, or the service principal. */
|
|
24
|
+
readonly principal: string;
|
|
25
|
+
readonly publishedBy: string;
|
|
26
|
+
/** RFC 3339. */
|
|
27
|
+
readonly publishedAt: string;
|
|
28
|
+
readonly tenant?: string;
|
|
29
|
+
/** Service mode only: the roles the service principal holds in `tenant`. */
|
|
30
|
+
readonly roles?: readonly string[];
|
|
31
|
+
/** The operation names the automation runs. */
|
|
32
|
+
readonly operations: readonly string[];
|
|
33
|
+
/** The delegation: the permission keys of `operations`. */
|
|
34
|
+
readonly permissions: readonly string[];
|
|
35
|
+
/** The permission key a caller needs to start a run; absent, only server code starts one. */
|
|
36
|
+
readonly run?: string;
|
|
37
|
+
readonly revoked?: boolean;
|
|
38
|
+
readonly name?: string;
|
|
39
|
+
};
|
|
40
|
+
/** The live record of each automation, read on every run. */
|
|
41
|
+
type AutomationSource = {
|
|
42
|
+
/** Names the implementation in errors and events. */
|
|
43
|
+
readonly name?: string;
|
|
44
|
+
/** The automation as of now, or `null` for an unknown one. A throw is no automation. */
|
|
45
|
+
automation(id: string, options?: {
|
|
46
|
+
readonly tenant?: string;
|
|
47
|
+
}): Automation | null | Promise<Automation | null>;
|
|
48
|
+
};
|
|
49
|
+
type OperationRef = Pick<Operation, "name" | "permission">;
|
|
50
|
+
type AutomationRequest = {
|
|
51
|
+
readonly id: string;
|
|
52
|
+
readonly version: number | string;
|
|
53
|
+
/** The operations the automation runs: entries of an `OperationMap`, or the map itself. */
|
|
54
|
+
readonly operations: readonly OperationRef[] | Readonly<Record<string, OperationRef>>;
|
|
55
|
+
/** Defaults to `'publisher'`. */
|
|
56
|
+
readonly mode?: AutomationMode;
|
|
57
|
+
/** Defaults to the publisher's active tenant; required for `service`. */
|
|
58
|
+
readonly tenant?: string;
|
|
59
|
+
/** Service mode: the service principal's id; defaults to `automation:<id>`. */
|
|
60
|
+
readonly principal?: string;
|
|
61
|
+
/** Service mode: the roles the service principal holds in `tenant`. */
|
|
62
|
+
readonly roles?: readonly string[];
|
|
63
|
+
/** The permission a caller needs to start a run. */
|
|
64
|
+
readonly run?: Permission;
|
|
65
|
+
readonly name?: string;
|
|
66
|
+
};
|
|
67
|
+
type AutomationDecision = {
|
|
68
|
+
readonly outcome: "granted";
|
|
69
|
+
readonly automation: Automation;
|
|
70
|
+
} | {
|
|
71
|
+
readonly outcome: "denied";
|
|
72
|
+
readonly denials: readonly Denial[];
|
|
73
|
+
};
|
|
74
|
+
type DecideAutomationOptions = {
|
|
75
|
+
/** The publication time; defaults to the clock. */
|
|
76
|
+
readonly now?: Instant;
|
|
77
|
+
};
|
|
78
|
+
/**
|
|
79
|
+
* Validates an untrusted automation record and returns a frozen copy with
|
|
80
|
+
* only the v1 fields, or `undefined`. A service automation needs `tenant`
|
|
81
|
+
* and `roles`; a publisher automation runs as `publishedBy` and has no
|
|
82
|
+
* `roles`.
|
|
83
|
+
*/
|
|
84
|
+
declare function parseAutomation(input: unknown): Automation | undefined;
|
|
85
|
+
type MemoryAutomationSource = {
|
|
86
|
+
automation(id: string, options?: {
|
|
87
|
+
readonly tenant?: string;
|
|
88
|
+
}): Automation | null;
|
|
89
|
+
/** Adds or replaces a record by id; an invalid record throws. */
|
|
90
|
+
put(automation: Automation): void;
|
|
91
|
+
};
|
|
92
|
+
/** An in-process `AutomationSource`; records are kept by id and checked with `parseAutomation`. */
|
|
93
|
+
declare function memoryAutomationSource(automations?: readonly Automation[]): MemoryAutomationSource;
|
|
94
|
+
/**
|
|
95
|
+
* Decides whether the subject of `permdock` may publish the automation in
|
|
96
|
+
* `request`, and returns the record to store. The publisher must be a
|
|
97
|
+
* signed-in user or service that is not a link, a feed, a contact, a
|
|
98
|
+
* credential or a run, and must be able to use every operation's permission
|
|
99
|
+
* now (`exceeds-creator`); each run re-checks their live rights. A
|
|
100
|
+
* `service` automation's tenant must be one the publisher is a member of,
|
|
101
|
+
* its roles among their `assignableRoles` there and its permissions within
|
|
102
|
+
* `assignablePermissions`. PermDock never stores the record; the
|
|
103
|
+
* application does, after a `granted` result.
|
|
104
|
+
*/
|
|
105
|
+
/**
|
|
106
|
+
* Decides whether the subject of `permdock` may publish the automation in
|
|
107
|
+
* `request` and returns the record to store: the publisher's own reach over
|
|
108
|
+
* every operation's permission and, for a `service` automation, their
|
|
109
|
+
* assignable ceiling. Each run re-checks the publisher live. An instance
|
|
110
|
+
* built from a snapshot denies with `unsupported`.
|
|
111
|
+
*/
|
|
112
|
+
declare function decideAutomation(permdock: InstanceHandle, request: AutomationRequest, options?: DecideAutomationOptions): Promise<AutomationDecision>;
|
|
113
|
+
//#endregion
|
|
114
|
+
export { AutomationSource as a, decideAutomation as c, AutomationRequest as i, memoryAutomationSource as l, AutomationDecision as n, DecideAutomationOptions as o, AutomationMode as r, MemoryAutomationSource as s, Automation as t, parseAutomation as u };
|
|
@@ -0,0 +1,157 @@
|
|
|
1
|
+
import { n as isReadonlyArray, t as compact } from "./compact-CAf557ZB.js";
|
|
2
|
+
import { n as freezeDeep } from "./freeze-CrU8nQeX.js";
|
|
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 { n as findPermission } from "./permission-registry-Br4jSNVi.js";
|
|
7
|
+
import { l as isRfc3339, m as rfc3339, p as nowSeconds } from "./time-DkWjdL98.js";
|
|
8
|
+
//#region src/core/automation.ts
|
|
9
|
+
const MAX_NAME = 256;
|
|
10
|
+
function isVersion(value) {
|
|
11
|
+
return typeof value === "number" && Number.isSafeInteger(value) && value >= 0 || isId(value);
|
|
12
|
+
}
|
|
13
|
+
/**
|
|
14
|
+
* Validates an untrusted automation record and returns a frozen copy with
|
|
15
|
+
* only the v1 fields, or `undefined`. A service automation needs `tenant`
|
|
16
|
+
* and `roles`; a publisher automation runs as `publishedBy` and has no
|
|
17
|
+
* `roles`.
|
|
18
|
+
*/
|
|
19
|
+
function parseAutomation(input) {
|
|
20
|
+
const value = ownRecord(input);
|
|
21
|
+
if (value === void 0 || value["v"] !== 1 || !isId(value["id"]) || !isVersion(value["version"]) || value["mode"] !== "publisher" && value["mode"] !== "service" || !isId(value["principal"]) || !isId(value["publishedBy"]) || !isRfc3339(value["publishedAt"])) return;
|
|
22
|
+
const operations = idList(value["operations"]);
|
|
23
|
+
const permissions = idList(value["permissions"]);
|
|
24
|
+
const roles = value["roles"] === void 0 ? void 0 : idList(value["roles"]);
|
|
25
|
+
const { tenant, run, revoked, name } = value;
|
|
26
|
+
if (operations === void 0 || permissions === void 0 || value["roles"] !== void 0 && roles === void 0 || tenant !== void 0 && !isId(tenant) || run !== void 0 && !isId(run) || revoked !== void 0 && typeof revoked !== "boolean" || name !== void 0 && (typeof name !== "string" || name.length > MAX_NAME)) return;
|
|
27
|
+
if (value["mode"] === "service") {
|
|
28
|
+
if (tenant === void 0 || roles === void 0) return;
|
|
29
|
+
} else if (roles !== void 0 || value["principal"] !== value["publishedBy"]) return;
|
|
30
|
+
return freezeDeep(compact({
|
|
31
|
+
v: 1,
|
|
32
|
+
id: value["id"],
|
|
33
|
+
version: value["version"],
|
|
34
|
+
mode: value["mode"],
|
|
35
|
+
principal: value["principal"],
|
|
36
|
+
publishedBy: value["publishedBy"],
|
|
37
|
+
publishedAt: value["publishedAt"],
|
|
38
|
+
tenant,
|
|
39
|
+
roles,
|
|
40
|
+
operations,
|
|
41
|
+
permissions,
|
|
42
|
+
run,
|
|
43
|
+
revoked: revoked === true ? true : void 0,
|
|
44
|
+
name
|
|
45
|
+
}));
|
|
46
|
+
}
|
|
47
|
+
/** An in-process `AutomationSource`; records are kept by id and checked with `parseAutomation`. */
|
|
48
|
+
function memoryAutomationSource(automations = []) {
|
|
49
|
+
const byId = /* @__PURE__ */ new Map();
|
|
50
|
+
const put = (automation) => {
|
|
51
|
+
const parsed = parseAutomation(automation);
|
|
52
|
+
if (parsed === void 0) throw new TypeError("PermDock: invalid automation record");
|
|
53
|
+
byId.set(parsed.id, parsed);
|
|
54
|
+
};
|
|
55
|
+
for (const automation of automations) put(automation);
|
|
56
|
+
return Object.freeze({
|
|
57
|
+
automation(id, options) {
|
|
58
|
+
const found = byId.get(id);
|
|
59
|
+
if (found === void 0 || options?.tenant !== void 0 && found.tenant !== void 0 && found.tenant !== options.tenant) return null;
|
|
60
|
+
return found;
|
|
61
|
+
},
|
|
62
|
+
put
|
|
63
|
+
});
|
|
64
|
+
}
|
|
65
|
+
function denied(reason, detail) {
|
|
66
|
+
return freezeDeep({
|
|
67
|
+
outcome: "denied",
|
|
68
|
+
denials: [compact({
|
|
69
|
+
role: null,
|
|
70
|
+
reason,
|
|
71
|
+
detail
|
|
72
|
+
})]
|
|
73
|
+
});
|
|
74
|
+
}
|
|
75
|
+
function operationList(operations) {
|
|
76
|
+
return isReadonlyArray(operations) ? operations : Object.values(operations);
|
|
77
|
+
}
|
|
78
|
+
/**
|
|
79
|
+
* Decides whether the subject of `permdock` may publish the automation in
|
|
80
|
+
* `request`, and returns the record to store. The publisher must be a
|
|
81
|
+
* signed-in user or service that is not a link, a feed, a contact, a
|
|
82
|
+
* credential or a run, and must be able to use every operation's permission
|
|
83
|
+
* now (`exceeds-creator`); each run re-checks their live rights. A
|
|
84
|
+
* `service` automation's tenant must be one the publisher is a member of,
|
|
85
|
+
* its roles among their `assignableRoles` there and its permissions within
|
|
86
|
+
* `assignablePermissions`. PermDock never stores the record; the
|
|
87
|
+
* application does, after a `granted` result.
|
|
88
|
+
*/
|
|
89
|
+
/**
|
|
90
|
+
* Decides whether the subject of `permdock` may publish the automation in
|
|
91
|
+
* `request` and returns the record to store: the publisher's own reach over
|
|
92
|
+
* every operation's permission and, for a `service` automation, their
|
|
93
|
+
* assignable ceiling. Each run re-checks the publisher live. An instance
|
|
94
|
+
* built from a snapshot denies with `unsupported`.
|
|
95
|
+
*/
|
|
96
|
+
function decideAutomation(permdock, request, options = {}) {
|
|
97
|
+
const internals = internalsOf(permdock);
|
|
98
|
+
if (internals === void 0) return Promise.resolve(freezeDeep({
|
|
99
|
+
outcome: "denied",
|
|
100
|
+
denials: [{
|
|
101
|
+
role: null,
|
|
102
|
+
reason: "unsupported"
|
|
103
|
+
}]
|
|
104
|
+
}));
|
|
105
|
+
return Promise.resolve().then(() => decideAutomationWith(internals.instance, request, options));
|
|
106
|
+
}
|
|
107
|
+
function decideAutomationWith(permdock, request, options) {
|
|
108
|
+
const publisher = permdock.subject.principal;
|
|
109
|
+
if (publisher === null) return denied("anonymous");
|
|
110
|
+
if (publisher.kind === "link" || publisher.kind === "feed" || publisher.kind === "contact") return denied("exceeds-creator", { creator: publisher.kind });
|
|
111
|
+
if ("credential" in publisher || "runTicket" in publisher) return denied("exceeds-creator", { creator: "credential" in publisher ? "credential" : "run" });
|
|
112
|
+
const mode = request.mode ?? "publisher";
|
|
113
|
+
const refs = operationList(request.operations);
|
|
114
|
+
if (!isId(request.id) || !isVersion(request.version) || refs.length === 0 || mode !== "publisher" && mode !== "service") return denied("validation");
|
|
115
|
+
const names = [];
|
|
116
|
+
const keys = [];
|
|
117
|
+
for (const ref of refs) {
|
|
118
|
+
const leaf = findPermission(permdock.permissions, ref.permission.key);
|
|
119
|
+
if (!isId(ref.name) || leaf === void 0 || names.includes(ref.name)) return denied("validation");
|
|
120
|
+
names.push(ref.name);
|
|
121
|
+
if (!keys.includes(leaf.key)) keys.push(leaf.key);
|
|
122
|
+
if (!permdock.mayUse(leaf)) return denied("exceeds-creator", { permission: leaf.key });
|
|
123
|
+
}
|
|
124
|
+
const run = request.run === void 0 ? void 0 : findPermission(permdock.permissions, request.run.key);
|
|
125
|
+
if (request.run !== void 0 && run === void 0) return denied("validation");
|
|
126
|
+
const tenant = request.tenant ?? publisher.tenant;
|
|
127
|
+
if (tenant !== void 0 && !permdock.tenants().includes(tenant)) return denied("exceeds-creator", { tenant });
|
|
128
|
+
if (mode === "service") {
|
|
129
|
+
if (tenant === void 0 || request.roles === void 0) return denied("validation");
|
|
130
|
+
const assignable = new Set(permdock.assignableRoles({ tenant }).map((role) => role.key));
|
|
131
|
+
for (const role of request.roles) if (!assignable.has(role)) return denied("exceeds-creator", { role });
|
|
132
|
+
const ceiling = new Set(permdock.assignablePermissions({ tenant }).map((leaf) => leaf.key));
|
|
133
|
+
for (const key of keys) if (!ceiling.has(key)) return denied("exceeds-creator", { permission: key });
|
|
134
|
+
}
|
|
135
|
+
const automation = parseAutomation(compact({
|
|
136
|
+
v: 1,
|
|
137
|
+
id: request.id,
|
|
138
|
+
version: request.version,
|
|
139
|
+
mode,
|
|
140
|
+
principal: mode === "service" ? request.principal ?? `automation:${request.id}` : publisher.id,
|
|
141
|
+
publishedBy: publisher.id,
|
|
142
|
+
publishedAt: rfc3339(nowSeconds(options.now)),
|
|
143
|
+
tenant,
|
|
144
|
+
roles: mode === "service" ? request.roles : void 0,
|
|
145
|
+
operations: names,
|
|
146
|
+
permissions: keys,
|
|
147
|
+
run: run?.key,
|
|
148
|
+
name: request.name
|
|
149
|
+
}));
|
|
150
|
+
if (automation === void 0) return denied("validation");
|
|
151
|
+
return freezeDeep({
|
|
152
|
+
outcome: "granted",
|
|
153
|
+
automation
|
|
154
|
+
});
|
|
155
|
+
}
|
|
156
|
+
//#endregion
|
|
157
|
+
export { memoryAutomationSource as n, parseAutomation as r, decideAutomation as t };
|