permdock 0.4.0 → 0.6.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +37 -35
- package/dist/{schema-Bol6gqXA.js → 2020-C9VN-x8c.js} +5 -130
- package/dist/a2a/index.d.ts +6 -6
- package/dist/a2a/index.js +14 -17
- package/dist/{adapter-context-mlWsVGGg.js → adapter-context-CRhqyzCk.js} +1 -1
- package/dist/adoption-scan-DCYe60Pi.js +107 -0
- package/dist/agent/index.d.ts +3 -0
- package/dist/agent/index.js +1 -0
- package/dist/ai-sdk/index.d.ts +18 -35
- package/dist/ai-sdk/index.js +37 -23
- package/dist/{app-data-CV8pqqMi.js → app-data-MuyzVqX8.js} +2 -1
- package/dist/approval-header-CJACtHkv.js +23 -0
- package/dist/approval-prompt-Dg5LeAcT.js +62 -0
- package/dist/approval-prompt-DvSSPQJX.d.ts +57 -0
- package/dist/approvals/index.d.ts +5 -3
- package/dist/approvals/index.js +8 -5
- package/dist/approvals-p1PGoVjb.js +995 -0
- package/dist/arazzo-41WuzHou.js +36 -0
- package/dist/{arazzo-C4BcskbX.js → arazzo-CaUVBn7D.js} +20 -14
- package/dist/args-IIolxxKA.js +197 -0
- package/dist/astro/index.d.ts +43 -0
- package/dist/astro/index.js +27 -0
- package/dist/audience-DabClFLQ.js +55 -0
- package/dist/auth-DRLEizbL.js +178 -0
- package/dist/authzen/index.d.ts +26 -6
- package/dist/authzen/index.js +94 -79
- package/dist/automation-BNM3TtDo.d.ts +114 -0
- package/dist/automation-DVjOckjV.js +157 -0
- package/dist/better-auth/index.d.ts +8 -6
- package/dist/better-auth/index.js +9 -8
- package/dist/better-supabase/index.d.ts +357 -30
- package/dist/better-supabase/index.js +936 -194
- package/dist/{bind-kk-uyCwH.js → bind-CAvgUuKs.js} +14 -10
- package/dist/{bind-BzqG8SMb.d.ts → bind-DOyrv6zi.d.ts} +12 -10
- package/dist/body-CH5of8Ne.js +10 -0
- package/dist/body-text-QcXok_SI.js +52 -0
- package/dist/{build-instance-DIIV9DbC.js → build-instance-Bu_eDqYw.js} +4 -3
- package/dist/{canonical-json-CFKyFOke.js → canonical-json-BC8_nMTw.js} +5 -3
- package/dist/{capability-CksyCWDH.d.ts → capability-Drg-1YhL.d.ts} +44 -25
- package/dist/{capability-txATtKV4.js → capability-N1K9IpqS.js} +68 -42
- package/dist/casbin-Cr7RLtA3.js +30 -0
- package/dist/casbin-Dyu2gnUD.js +234 -0
- package/dist/casl-64gpT-8x.js +24 -0
- package/dist/casl-DjEDhTCP.js +299 -0
- package/dist/catalog/index.d.ts +74 -2
- package/dist/catalog/index.js +51 -2
- package/dist/catalog-BoWglDPI.js +1 -0
- package/dist/catalog-DZVbrF-z.js +52 -0
- package/dist/{catalog-tZUyOfOv.js → catalog-HD2gf5mY.js} +51 -6
- package/dist/{catalog-doc-DWtg0gGR.js → catalog-doc-Cdn7-0pQ.js} +45 -23
- package/dist/catalog-fingerprint-CCP0-yQS.js +153 -0
- package/dist/chat/index.d.ts +2 -0
- package/dist/chat/index.js +224 -0
- package/dist/chat-sdk/index.d.ts +87 -0
- package/dist/chat-sdk/index.js +197 -0
- package/dist/claims-map-7oQ3ue4X.js +13 -0
- package/dist/claims-map-Ca-QX8C6.d.ts +32 -0
- package/dist/claude-agent/index.d.ts +7 -14
- package/dist/claude-agent/index.js +24 -27
- package/dist/clerk/index.d.ts +9 -8
- package/dist/clerk/index.js +9 -14
- package/dist/cli/bin.js +36 -17
- package/dist/cli/index.d.ts +19 -5
- package/dist/cli/index.js +164 -4
- package/dist/cloud/index.d.ts +102 -63
- package/dist/cloud/index.js +239 -340
- package/dist/cloud-ytQ3uviA.js +87 -0
- package/dist/codemod-5mpSpnUY.js +37 -0
- package/dist/codemod-ua2hHy7w.js +2084 -0
- package/dist/collect-Ci6akVwH.js +55 -0
- package/dist/collect-D7eQDffE.js +1 -0
- package/dist/{collect-2SrB7lfk.js → collect-mLTY4nwb.js} +75 -11
- package/dist/command-L8EstFNm.js +6 -0
- package/dist/compile/index.d.ts +1 -1
- package/dist/compile/index.js +1 -2
- package/dist/{compile-CtTP7eur.d.ts → compile-1bsAezL0.d.ts} +5 -3
- package/dist/{compile-CcEu2ZQ1.js → compile-CMqMx_IN.js} +11 -8
- package/dist/completion-BTFrHZhX.js +143 -0
- package/dist/config-Bj2Ixq3d.js +26 -0
- package/dist/{config-BIjREpyE.js → config-bs_kZeYq.js} +12 -7
- package/dist/{config-report--Xb9APJS.js → config-report-DSpsLpCE.js} +15 -5
- package/dist/{connection-DUsczpB5.js → connection-DjhIJSs2.js} +6 -5
- package/dist/{context-DieZVJXu.js → context-B_u3_bDJ.js} +2 -2
- package/dist/convex/index.d.ts +11 -10
- package/dist/convex/index.js +6 -4
- package/dist/create-B30OMUOJ.d.ts +107 -0
- package/dist/create-CBMmFie-.d.ts +138 -0
- package/dist/create-CGm28gyI.js +130 -0
- package/dist/create-CQWIpUG-.js +403 -0
- package/dist/{create-BBO24vj6.js → create-DCF2SvoT.js} +31 -32
- package/dist/create-D_NmPOdH.d.ts +110 -0
- package/dist/{credential-kue0qpbm.js → credential-BcoiejpY.js} +152 -31
- package/dist/credentials-DPyHmYz5.js +74 -0
- package/dist/delegation-j6-rc37o.js +286 -0
- package/dist/delivery/index.d.ts +5 -0
- package/dist/delivery/index.js +5 -0
- package/dist/delivery-DCAgNyCn.js +499 -0
- package/dist/delivery-event-xX4obB8F.js +40 -0
- package/dist/{denied-text-DfRk15uw.d.ts → denied-text-CiFQNuMV.d.ts} +5 -5
- package/dist/{describe-C3ldA9os.d.ts → describe-B5qgDvEW.d.ts} +2 -2
- package/dist/{describe-Cgkp7eP0.js → describe-BybMRY7A.js} +6 -2
- package/dist/device-BARQ8eYG.js +193 -0
- package/dist/{diff-rpqoe7Ag.js → diff-3jbx6Rm4.js} +60 -54
- package/dist/diff-CmuSD3vc.js +37 -0
- package/dist/doctor-3ZqNHX_G.js +44 -0
- package/dist/{doctor-owlv6ddh.js → doctor-BdZw53-k.js} +245 -50
- package/dist/drizzle/index.d.ts +5 -3
- package/dist/drizzle/index.js +2 -2
- package/dist/elysia/index.d.ts +16 -13
- package/dist/elysia/index.js +13 -12
- package/dist/env-DJZrPjRi.js +8 -0
- package/dist/errors-BDUwg2qC.js +27 -0
- package/dist/{errors-drnfxYtm.js → errors-BKy0EfhN.js} +5 -9
- package/dist/errors-BWXBMaKK.d.ts +11 -0
- package/dist/errors-CWTY6uih.js +143 -0
- package/dist/{errors-OD_4c__H.d.ts → errors-DH5QEGXh.d.ts} +2 -2
- package/dist/evaluate-CNClBvcj.js +1785 -0
- package/dist/evaluations-C_1vdSZc.d.ts +32 -0
- package/dist/{evaluations-C9YJsv3H.js → evaluations-beAooV0n.js} +145 -34
- package/dist/eve/index.d.ts +12 -16
- package/dist/eve/index.js +22 -28
- package/dist/event-time-CsegxXxB.js +23 -0
- package/dist/expiry-D4_YKRKD.js +52 -0
- package/dist/express/index.d.ts +13 -10
- package/dist/express/index.js +12 -11
- package/dist/fastify/index.d.ts +25 -22
- package/dist/fastify/index.js +13 -12
- package/dist/fetch-adapter-DD_gfmrC.js +120 -0
- package/dist/fetch-adapter-Dw0MTS3D.d.ts +31 -0
- package/dist/fields-OYG_JR78.js +203 -0
- package/dist/files-C5ZI27eV.js +124 -0
- package/dist/{fixtures-h2eG2OZV.js → fixtures-B7XrLeY7.js} +8 -7
- package/dist/flags-C3DktBDY.js +86 -0
- package/dist/{from-snapshot-7REQZe0H.js → from-snapshot-CTCMsFZk.js} +55 -52
- package/dist/{grantee-conditions-MQs5NIuX.js → grantee-conditions-CcXf8hMM.js} +4 -3
- package/dist/{grantee-CXY-0C87.js → grantee-hxrUsbpM.js} +16 -6
- package/dist/{grantee-match-fxYp9Nmt.js → grantee-match-DbENBHLB.js} +5 -4
- package/dist/h3/index.d.ts +37 -0
- package/dist/h3/index.js +35 -0
- package/dist/headers-BIjfMaoC.js +8 -0
- package/dist/headers-CIbDTUTK.d.ts +7 -0
- package/dist/{helpers-C9YmyBIa.js → helpers-CBYVMjwh.js} +45 -38
- package/dist/hono/index.d.ts +12 -9
- package/dist/hono/index.js +13 -12
- package/dist/hosted-B46-5LYE.js +315 -0
- package/dist/hosted-BPk51-kX.d.ts +78 -0
- package/dist/{http-DPuDaChb.d.ts → http-B_LphE5Y.d.ts} +1 -2
- package/dist/http-DXJ37RDA.js +46 -0
- package/dist/{http-BEbdMZ05.js → http-ujKm0JXE.js} +1 -2
- package/dist/{import-UHk1N7vH.js → import-CNV7I2Dw.js} +25 -20
- package/dist/{import-BFIlhetD.js → import-wyqXUyjm.js} +190 -53
- package/dist/index-B8YjkEZ4.d.ts +210 -0
- package/dist/index-C-6Letxg.d.ts +431 -0
- package/dist/index-CaxrMD1A.d.ts +1 -0
- package/dist/{index-BwMe94Xq.d.ts → index-Ch8LpNDp.d.ts} +34 -16
- package/dist/index-Cp_ilKi1.d.ts +91 -0
- package/dist/index-CueFnxQc.d.ts +110 -0
- package/dist/index-DuWxc5dt.d.ts +909 -0
- package/dist/index.d.ts +19 -15
- package/dist/index.js +31 -21
- package/dist/init-DeMYsnYJ.js +96 -0
- package/dist/init-GG6Jh8HD.js +95 -0
- package/dist/{instance-options-plkrsAog.d.ts → instance-options-BsVpyGIk.d.ts} +2 -2
- package/dist/instance-snapshot-BOEhcqIF.js +601 -0
- package/dist/instant-BluqDvyS.js +19 -0
- package/dist/internals-Dk8A8fX3.js +17 -0
- package/dist/{json-schema-DBkdUuCO.js → json-schema-B-vAwlde.js} +45 -6
- package/dist/json-schema-CN_iLFH2.d.ts +40 -0
- package/dist/jwt/index.d.ts +18 -11
- package/dist/jwt/index.js +156 -135
- package/dist/{kernel-CB3LrIJM.js → kernel-D0NVb1cK.js} +52 -24
- package/dist/kysely/index.d.ts +5 -3
- package/dist/kysely/index.js +2 -2
- package/dist/load-BxEtwlBS.js +1 -0
- package/dist/{load-C3_oTHyO.js → load-DFS_ry0W.js} +22 -6
- package/dist/{load-jose-BL6LH4bL.js → load-jose-DZ4dnjri.js} +1 -4
- package/dist/login-Dfe5RlYk.js +68 -0
- package/dist/login-imhuwvn3.js +254 -0
- package/dist/manifest-C8IzW3Do.js +42 -0
- package/dist/manifest-dvL2XEe1.js +370 -0
- package/dist/manifest-json-CAGzls-C.js +9 -0
- package/dist/{manifest-uDS9y5de.d.ts → manifest-mx5ghSFM.d.ts} +9 -2
- package/dist/manifest-schema-C0kK_8V0.js +399 -0
- package/dist/{map-claims-AVlBaJoa.js → map-claims-D3oRmTk0.js} +13 -10
- package/dist/{map-error-BE27PYkE.js → map-error-Dr70oA_3.js} +3 -3
- package/dist/{markers-CiwAOZtO.js → markers-C6joDI3o.js} +2 -1
- package/dist/mcp/index.d.ts +22 -12
- package/dist/mcp/index.js +57 -39
- package/dist/{migrate-BwlB5-Wk.js → migrate-CIq4-E9F.js} +53 -14
- package/dist/nest/index.d.ts +12 -9
- package/dist/nest/index.js +15 -14
- package/dist/next/index.d.ts +18 -21
- package/dist/next/index.js +13 -11
- package/dist/next/plugin.d.ts +1 -1
- package/dist/next/plugin.js +2 -2
- package/dist/node/index.d.ts +10 -10
- package/dist/node/index.js +7 -9
- package/dist/{ocsf-uYFXGVw2.js → ocsf-BFp-PZZA.js} +22 -11
- package/dist/openai/index.d.ts +9 -16
- package/dist/openai/index.js +17 -24
- package/dist/openapi/index.d.ts +3 -3
- package/dist/openapi/index.js +1 -1
- package/dist/{openapi-DBzHQbov.js → openapi-B7HZ0f-r.js} +8 -8
- package/dist/openapi-C4dDTVEd.js +138 -0
- package/dist/{openapi-BJdBmYDG.js → openapi-DD1SV-5-.js} +10 -9
- package/dist/operation-findings-DgATDpvh.js +36 -0
- package/dist/operations-X0VM7F3m.d.ts +59 -0
- package/dist/orpc/index.d.ts +13 -10
- package/dist/orpc/index.js +20 -15
- package/dist/otel/index.d.ts +3 -2
- package/dist/otel/index.js +30 -7
- package/dist/output-1im__-08.js +88 -0
- package/dist/output-files-B3IZJksC.js +1 -0
- package/dist/{output-files-CgIsvdSa.js → output-files-DhRBBE4n.js} +24 -26
- package/dist/{permission-keys-B26jeyUv.js → ownership-DqaJNJPn.js} +1045 -153
- package/dist/{package-root-DtNnpmUd.js → package-root-Dk_ETdkp.js} +1 -1
- package/dist/{parse-CVFQHk6c.js → parse-Cxq0WxrA.js} +2 -2
- package/dist/{parse-local-manifest-DvYUR0QL.d.ts → parse-local-manifest-5ODwqu8b.d.ts} +1 -1
- package/dist/{parse-local-manifest-C-q02Pal.js → parse-local-manifest-CVSs6J9I.js} +1 -1
- package/dist/parse-request-D_tUXG6M.js +26 -0
- package/dist/paths-DXSHAMIa.js +42 -0
- package/dist/pdp/index.d.ts +7 -3
- package/dist/pdp/index.js +45 -26
- package/dist/{peer-BOr_kJE1.js → peer-C8swJ2GH.js} +23 -4
- package/dist/peer-CRvC7Hg1.js +1 -0
- package/dist/permdock-BrAscV28.js +868 -0
- package/dist/permdock-SV8ZINYT.d.ts +502 -0
- package/dist/{permission-registry-BsblpB-z.js → permission-registry-Br4jSNVi.js} +3 -3
- package/dist/permissions-B-wCP5ZC.js +30 -0
- package/dist/{permissions-CCJ6lmxB.js → permissions-BPxlwVhN.js} +4 -3
- package/dist/{permissions-COH-KRgT.d.ts → permissions-u_KHg-sN.d.ts} +1 -2
- package/dist/policies-DP2nqRoF.js +295 -0
- package/dist/{policy-ur0BBK_e.d.ts → policy-77FSAq_V.d.ts} +2 -2
- package/dist/{hosted-CBHgkzDl.js → policy-DbM5YYtV.js} +17 -273
- package/dist/policy-from-catalog-C2gMa2Dj.js +450 -0
- package/dist/policy-module-CTlwMvLI.js +89 -0
- package/dist/{policy-types-sp9P1iIV.d.ts → policy-types-n0uRTsW8.d.ts} +460 -632
- package/dist/postgrest-CEgRbefE.d.ts +100 -0
- package/dist/postgrest-DAjUkF9w.js +575 -0
- package/dist/{powersync-cZe4kzhL.js → powersync-BkWWCS1K.js} +23 -24
- package/dist/powersync-DISt6SUe.js +62 -0
- package/dist/powersync-MMJ2mI2q.js +1 -0
- package/dist/preset/index.d.ts +146 -0
- package/dist/preset/index.js +1 -0
- package/dist/preset-DZdU0tne.js +1768 -0
- package/dist/principal-source-pHneukrx.js +103 -0
- package/dist/prisma/index.d.ts +6 -3
- package/dist/prisma/index.js +2 -2
- package/dist/{problem-CnWraVhC.js → problem-CTviyH5L.js} +13 -23
- package/dist/{problem-details-rIIo8B2C.d.ts → problem-details-B45V5d2b.d.ts} +1 -1
- package/dist/{problem-details-DECUnXAn.js → problem-details-cn5X30gZ.js} +43 -40
- package/dist/problem-types-CJ2325SZ.js +5 -0
- package/dist/{prompt-CXYhLfsS.js → prompt-DfZLJLIn.js} +2 -2
- package/dist/{protected-BN7BUdY1.js → protected-BlF0F6wL.js} +21 -4
- package/dist/{protected-B3_P7xuw.d.ts → protected-RFGpakN9.d.ts} +16 -8
- package/dist/{provider-Bi-0HNL3.js → provider-B1al-AZz.js} +2 -2
- package/dist/{provider-kwHC9CZD.d.ts → provider-DILL9oPK.d.ts} +1 -1
- package/dist/{provider-store-Ctt-81Ni.js → provider-store-DM6DNcta.js} +2 -2
- package/dist/pull-CvpINcMK.js +1 -0
- package/dist/pull-jEwbf80J.js +256 -0
- package/dist/push-BD4f15co.js +116 -0
- package/dist/pushed-policy-CqtxkV4G.js +238 -0
- package/dist/pushed-policy-DCW91KQU.d.ts +57 -0
- package/dist/react/index.d.ts +8 -8
- package/dist/react/index.js +6 -6
- package/dist/react/provider-client.d.ts +1 -1
- package/dist/react/provider-client.js +1 -2
- package/dist/react-native/index.d.ts +24 -72
- package/dist/react-native/index.js +29 -25
- package/dist/{refs-f3imMjNW.js → refs-K6eWUJ0H.js} +1 -1
- package/dist/{relation-walk-BXnlLtg2.js → relation-walk-3OyDBF0S.js} +2 -2
- package/dist/{relations-CvmSpG67.js → relations-BnCWnJGI.js} +3 -3
- package/dist/renames-CGj7YwcQ.js +175 -0
- package/dist/{replay-COpmZUfx.d.ts → replay-Bkm-Ne4l.d.ts} +1 -1
- package/dist/{replay-BsOyTrdV.js → replay-Du1tJjG7.js} +2 -1
- package/dist/{request-context-BVM7aWNs.js → request-context-C81Pip9n.js} +3 -3
- package/dist/request-schema-CMreVuFM.js +148 -0
- package/dist/resend/index.d.ts +126 -0
- package/dist/resend/index.js +379 -0
- package/dist/{resource-relations-D1Un3pcz.js → resource-relations-D_jw0BFx.js} +1 -1
- package/dist/{retire-BFcxL6un.js → retire-CALjIQ7e.js} +2 -2
- package/dist/{revocations-Cy06JNx2.d.ts → revocations-R07lFBnX.d.ts} +2 -0
- package/dist/rls-BAqP4q66.js +336 -0
- package/dist/{rls-BEktUaqg.js → rls-DTvYd-lI.js} +288 -690
- package/dist/{role-builder-B4GbKM-i.js → role-builder-uWQZ4v84.js} +14 -207
- package/dist/{rpc-nYC3cR_u.js → rpc-VSl5ylaQ.js} +7 -7
- package/dist/run-CUKuz0A8.js +723 -0
- package/dist/run-DDwUaJDU.js +1 -0
- package/dist/run-ticket-DocwaTKn.d.ts +124 -0
- package/dist/run-ticket-sxFI6LAk.js +337 -0
- package/dist/{runtime-D_tMXnsq.js → runtime-D3VTAiCA.js} +1 -1
- package/dist/{saas-DtaA4JuW.js → saas-BCXRuXca.js} +16 -14
- package/dist/scan-qvOe0hS3.js +29 -0
- package/dist/{schema-DjQBcAP9.js → schema-B4v0Qrac.js} +102 -8
- package/dist/schema-yLuBWWsh.js +130 -0
- package/dist/scim/index.d.ts +2 -2
- package/dist/scim/index.js +1 -2
- package/dist/{scim-vFR1O5oG.js → scim-ClHtpyV3.js} +208 -76
- package/dist/{scopes-tvpa34ep.js → scopes-CUPSjo9q.js} +12 -7
- package/dist/server/index.d.ts +12 -143
- package/dist/server/index.js +12 -9
- package/dist/server-C3WXAHZj.js +453 -0
- package/dist/{server-types-DdqBwZN_.d.ts → server-types-CKQiCnON.d.ts} +51 -68
- package/dist/{sha256-BO0swRXL.js → sha256-D9ihqmvd.js} +8 -1
- package/dist/{shared-1uhI-e-b.js → shared-BAK8t4Uo.js} +20 -9
- package/dist/{shared-JhMeOsDF.js → shared-DvvFzYXe.js} +8 -9
- package/dist/signals-D3NcTKUS.js +32 -0
- package/dist/sink-4-eQIRWf.d.ts +225 -0
- package/dist/sink-BEZSlMS_.js +957 -0
- package/dist/{skills-BZdRQkxs.js → skills-B6lVdD_W.js} +13 -6
- package/dist/skills-CTYwkl44.js +51 -0
- package/dist/snapshot-B7DkYg6g.js +269 -0
- package/dist/{snapshot-cache-Cod40D-X.js → snapshot-cache-DZHQ0KF6.js} +11 -5
- package/dist/{snapshot-cache-J5T7t_vD.d.ts → snapshot-cache-PXI-vGpY.d.ts} +7 -5
- package/dist/solid/index.d.ts +11 -12
- package/dist/solid/index.js +7 -7
- package/dist/solid-start/index.d.ts +52 -0
- package/dist/solid-start/index.js +49 -0
- package/dist/{sources-Dljy06zL.d.ts → sources-Xc4zkszI.d.ts} +7 -13
- package/dist/{sources-B1-b-R0t.js → sources-vs5dGOsS.js} +125 -119
- package/dist/{sql-t8teWOfo.js → sql-B5T1IL83.js} +13 -1
- package/dist/src-Cu2m75uo.js +1860 -0
- package/dist/ssf/index.d.ts +4 -4
- package/dist/ssf/index.js +384 -47
- package/dist/standard-webhooks-DgFFD-Ga.js +228 -0
- package/dist/standard-webhooks-rbD7LS6h.d.ts +88 -0
- package/dist/storage-C2bWdvJH.js +132 -0
- package/dist/{store-ILkLUj_o.js → store-BDutJkDL.js} +40 -53
- package/dist/{store-options-CbUHDoSe.js → store-options-u0ycEe8s.js} +26 -21
- package/dist/{stores-Cxz_80g-.d.ts → stores-BUGNbJTt.d.ts} +7 -8
- package/dist/{stores-BHXdSbw9.js → stores-CGhM8BN_.js} +2 -2
- package/dist/{stream-Dwsg6WwE.d.ts → stream-CeCMJmBB.d.ts} +2 -2
- package/dist/{stream-BMui98KK.js → stream-CvdUS9V1.js} +9 -2
- package/dist/style-DiKWnAvn.js +1 -0
- package/dist/{style-CTm1AXDT.js → style-Uao76wO7.js} +3 -2
- package/dist/subject-BGoM5o8B.js +17 -0
- package/dist/supabase/index.d.ts +23 -106
- package/dist/supabase/index.js +5 -4
- package/dist/supabase/middleware.d.ts +7 -6
- package/dist/supabase/middleware.js +13 -11
- package/dist/supabase-By_frk3U.js +92 -0
- package/dist/{supabase-hook-Cva3ikXz.js → supabase-hook-BMoEhZir.js} +960 -64
- package/dist/supabase-hook-CCw5m35C.js +1 -0
- package/dist/{supabase-C1TWlnYt.js → supabase-x5JtR2tc.js} +99 -206
- package/dist/support-session-C6xJQYut.js +158 -0
- package/dist/svelte/Protected.svelte +4 -4
- package/dist/svelte/index.d.ts +7 -7
- package/dist/svelte/index.js +10 -10
- package/dist/svelte/runtime.d.ts +3 -3
- package/dist/svelte/runtime.js +3 -3
- package/dist/svelte/source.d.ts +7 -7
- package/dist/svelte/source.js +4 -4
- package/dist/sveltekit/index.d.ts +51 -0
- package/dist/sveltekit/index.js +27 -0
- package/dist/tanstack-start/index.d.ts +51 -0
- package/dist/tanstack-start/index.js +40 -0
- package/dist/target-Bw37TFNA.js +51 -0
- package/dist/{tenancy-DshjqY0n.js → tenancy-DN2QAx9z.js} +5 -5
- package/dist/terminal/index.d.ts +11 -9
- package/dist/terminal/index.js +23 -287
- package/dist/testing/index.d.ts +311 -38
- package/dist/testing/index.js +3475 -201
- package/dist/testing/saas/index.d.ts +9 -8
- package/dist/testing/saas/index.js +2 -2
- package/dist/testing/saas/permissions.d.ts +1 -1
- package/dist/testing/saas/permissions.js +1 -2
- package/dist/text-BMFRfBqc.js +8 -0
- package/dist/{text-diff-BdkkYSbi.js → text-diff-BQcUapOb.js} +1 -1
- package/dist/thenable-yD7SabqG.js +31 -0
- package/dist/time-DkWjdL98.js +71 -0
- package/dist/{token-Bx9qy30p.js → token-BLZcjQgt.js} +15 -6
- package/dist/{tool-refusal-CQ7OEia9.js → tool-refusal-CMLN5xhn.js} +2 -2
- package/dist/trpc/index.d.ts +12 -9
- package/dist/trpc/index.js +16 -14
- package/dist/types-8RnwUAvE.d.ts +107 -0
- package/dist/{store-9KO4BlkB.d.ts → types-B3_ooZgZ.d.ts} +100 -75
- package/dist/{types-Br9IXUBG.d.ts → types-BdtSDbBO.d.ts} +77 -17
- package/dist/types-BtHtcKMr.d.ts +157 -0
- package/dist/{types-CqrjB9o6.d.ts → types-BzzaHxt3.d.ts} +23 -11
- package/dist/types-C791HFu9.d.ts +332 -0
- package/dist/types-C863OQiR.d.ts +57 -0
- package/dist/{types-ByUo56un.d.ts → types-CVZSNocA.d.ts} +23 -22
- package/dist/{types-DHrmBJLH.d.ts → types-CX7AvRqP.d.ts} +7 -7
- package/dist/types-C_IiEs64.d.ts +65 -0
- package/dist/{types-7rJVLWe5.d.ts → types-Dfv0aTER.d.ts} +63 -11
- package/dist/types-DqzsnlSA.js +67 -0
- package/dist/{types-DpWfQdSh.d.ts → types-Druu9wLM.d.ts} +46 -11
- package/dist/{types-CIlTojhq.d.ts → types-_WhUP7ud.d.ts} +9 -6
- package/dist/{types-CUcFZfpU.d.ts → types-lUlG3TVd.d.ts} +2 -1
- package/dist/unplugin/index.d.ts +1 -1
- package/dist/unplugin/index.js +2 -2
- package/dist/usage-CRVl9V3t.js +32 -0
- package/dist/usage-CZpSQP6L.js +1 -0
- package/dist/{usage-CG9nOYZw.js → usage-SveTRTyr.js} +54 -11
- package/dist/{validation-error-BSSw0l_8.d.ts → validation-error-DHUrAkku.d.ts} +1 -1
- package/dist/{validity-dVrUEPJt.js → validity-CZ7-y0Cj.js} +32 -15
- package/dist/{verifier-DMr_Zmb_.js → verifier-DHuh-okk.js} +18 -7
- package/dist/{verify-BztUB3GX.js → verify-BaAKx7t6.js} +645 -50
- package/dist/{version-BEogC-rB.js → version-CEbQ5UeM.js} +4 -3
- package/dist/version-DXkYUISx.js +1 -0
- package/dist/{views-CJsrBS1f.js → views-DTIIO-oQ.js} +22 -5
- package/dist/{permission-types-Dg39z9Kv.d.ts → vocabulary-CN8H_9UF.d.ts} +67 -2
- package/dist/vue/index.d.ts +9 -10
- package/dist/vue/index.js +8 -8
- package/dist/waiter-B986w1oK.d.ts +36 -0
- package/dist/waiter-BGUtGYoU.js +67 -0
- package/dist/watch--ovlPOc0.js +1 -0
- package/dist/{watch-zeucB7eF.js → watch-vea54PRw.js} +44 -5
- package/dist/webmcp/index.d.ts +2 -2
- package/dist/webmcp/index.js +3 -3
- package/dist/where-scope-C9vfEphl.js +306 -0
- package/dist/who-can-DWBAcaCQ.js +364 -0
- package/dist/wire-delegation-Cv3W2eaM.js +36 -0
- package/dist/wire-denial-C7PaVYEM.js +27 -0
- package/dist/workflow/index.d.ts +5 -0
- package/dist/workflow/index.js +223 -0
- package/dist/workflow-sdk/index.d.ts +56 -0
- package/dist/workflow-sdk/index.js +78 -0
- package/dist/{wrap-Cr93qqdP.d.ts → wrap-C5jC6sKI.d.ts} +2 -1
- package/dist/{wrap-DWsU_5Bd.js → wrap-gX61EtpB.js} +7 -6
- package/package.json +136 -37
- package/schemas/access-event-v1.json +118 -0
- package/schemas/approval-request-v1.json +34 -1
- package/schemas/approval-signature-v1.json +94 -0
- package/schemas/automation-event-v1.json +113 -0
- package/schemas/capability-v1.json +84 -0
- package/schemas/catalog-event-v1.json +87 -0
- package/schemas/catalog-v1.json +123 -12
- package/schemas/cli-commands-v1.json +164 -0
- package/schemas/cli-result-v1.json +96 -0
- package/schemas/cloud-api-v1.json +5407 -0
- package/schemas/connector-v1.json +408 -0
- package/schemas/credential-event-v1.json +81 -0
- package/schemas/credential-v1.json +134 -0
- package/schemas/decision-event-v1.json +288 -0
- package/schemas/delivery-event-v1.json +117 -0
- package/schemas/directory-event-v1.json +85 -0
- package/schemas/evidence-export-v1.json +54 -0
- package/schemas/membership-event-v1.json +93 -0
- package/schemas/policy-v1.json +68 -0
- package/schemas/pushed-policy-v1.json +236 -0
- package/schemas/run-v1.json +162 -0
- package/schemas/snapshot-v1.json +138 -0
- package/schemas/supabase-claims-v1.json +4 -4
- package/schemas/supabase-manifest-v1.json +5 -1
- package/schemas/support-session-v1.json +111 -0
- package/skills/permdock/SKILL.md +16 -12
- package/skills/permdock-agents/SKILL.md +40 -23
- package/skills/permdock-agents/references/operations-automations-chat.md +221 -0
- package/skills/permdock-agents/references/runtimes.md +22 -18
- package/skills/permdock-approvals/SKILL.md +29 -13
- package/skills/permdock-approvals/references/delivery-and-waiters.md +172 -0
- package/skills/permdock-approvals/references/stores-and-resume.md +21 -7
- package/skills/permdock-audit/SKILL.md +3 -3
- package/skills/permdock-credentials/SKILL.md +5 -5
- package/skills/permdock-credentials/references/tokens-keys-links.md +14 -10
- package/skills/permdock-data/SKILL.md +6 -6
- package/skills/permdock-data/references/queries-and-rls.md +10 -9
- package/skills/permdock-data/references/relationships.md +3 -3
- package/skills/permdock-tenancy/SKILL.md +20 -7
- package/skills/permdock-tenancy/references/contacts-and-support-sessions.md +122 -0
- package/skills/permdock-tenancy/references/ownership-and-custom-roles.md +6 -4
- package/skills/permdock-wire/SKILL.md +17 -11
- package/skills/permdock-wire/references/adapters.md +139 -51
- package/skills/permdock-wire/references/policy-options.md +5 -5
- package/skills/permdock-wire/references/presets-and-recipes.md +58 -0
- package/dist/approvals-DZL76lKW.js +0 -240
- package/dist/arazzo-CD8d0WLb.js +0 -54
- package/dist/catalog-6yWAX6Ps.js +0 -2
- package/dist/catalog-WHG4kBq7.js +0 -48
- package/dist/cloud-C7bSDgX4.js +0 -50
- package/dist/cloud-PeBN3IEn.js +0 -118
- package/dist/collect-Bw2Jdq1q.js +0 -2
- package/dist/collect-CQx4hX4N.js +0 -83
- package/dist/commands-Cpip4ULx.js +0 -97
- package/dist/config-DLt6BvV7.js +0 -36
- package/dist/diff-Cnghh_Ip.js +0 -48
- package/dist/doctor-CuVJvhV_.js +0 -53
- package/dist/duration-xK2jGFVc.js +0 -25
- package/dist/errors-CWfoNg9N.js +0 -47
- package/dist/errors-DRnGZHzF.js +0 -30
- package/dist/expiry-BoBJ8Tvc.js +0 -7
- package/dist/fields-fwfXN01n.js +0 -1016
- package/dist/headers-BZSDieNT.js +0 -6
- package/dist/headers-Cf-zWvsO.d.ts +0 -6
- package/dist/ids-DC4V4CFu.js +0 -18
- package/dist/index-DgM7w96K.d.ts +0 -6
- package/dist/index-Dz7didpC.d.ts +0 -201
- package/dist/index-UdVQgq48.d.ts +0 -550
- package/dist/load-B_shHrmd.js +0 -2
- package/dist/manifest-BngWKryL.js +0 -770
- package/dist/may-use-BOn_dR_w.js +0 -78
- package/dist/openapi-DcQ1Kg40.js +0 -164
- package/dist/ownership-BgnbOJFT.js +0 -851
- package/dist/permdock-L26udHSk.js +0 -3646
- package/dist/powersync-BFSbSElQ.js +0 -62
- package/dist/powersync-DCDgZgfZ.js +0 -2
- package/dist/rls-55DQTuf5.js +0 -250
- package/dist/run-DMcNW_8T.js +0 -174
- package/dist/server-ZYEHtNHS.js +0 -268
- package/dist/sink-BTtmfPnE.js +0 -141
- package/dist/sink-CPN4zLfs.d.ts +0 -104
- package/dist/skills-Dle4ZoLF.js +0 -56
- package/dist/snapshot-Dc9CHPME.js +0 -1078
- package/dist/src-Bb7no-hS.js +0 -639
- package/dist/subject-C6dLxqHU.js +0 -24
- package/dist/supabase-Dbqr141s.js +0 -83
- package/dist/supabase-hook-BULg7Ut_.js +0 -2
- package/dist/thenable-QSmvt-vZ.js +0 -65
- package/dist/types-C0dee0Qf.d.ts +0 -197
- package/dist/types-DvupZE0w.d.ts +0 -9
- package/dist/usage-4G6t643F.js +0 -42
- package/dist/usage-iFLJ0-rr.js +0 -2
- package/dist/vocabulary-hhEFLFoL.d.ts +0 -65
- package/dist/watch-C8TpsAl4.js +0 -2
|
@@ -1,11 +1,20 @@
|
|
|
1
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 { n as
|
|
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-j6-rc37o.js";
|
|
11
|
+
import { o as flattenGrantee } from "./grantee-hxrUsbpM.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 };
|
|
@@ -0,0 +1,74 @@
|
|
|
1
|
+
import { n as CliError } from "./errors-CWTY6uih.js";
|
|
2
|
+
//#region src/cli/core/io.ts
|
|
3
|
+
const FRAMES = [
|
|
4
|
+
"⠋",
|
|
5
|
+
"⠙",
|
|
6
|
+
"⠹",
|
|
7
|
+
"⠸",
|
|
8
|
+
"⠼",
|
|
9
|
+
"⠴",
|
|
10
|
+
"⠦",
|
|
11
|
+
"⠧",
|
|
12
|
+
"⠇",
|
|
13
|
+
"⠏"
|
|
14
|
+
];
|
|
15
|
+
const FRAME_MS = 80;
|
|
16
|
+
/**
|
|
17
|
+
* A spinner on a terminal stderr; a plain line elsewhere, so logs and CI
|
|
18
|
+
* output stay readable. `done` replaces the spinner with a final line.
|
|
19
|
+
*/
|
|
20
|
+
function progressReporter(input) {
|
|
21
|
+
return (message) => {
|
|
22
|
+
if (!input.tty) {
|
|
23
|
+
input.write(`${message}\n`);
|
|
24
|
+
return { done: (final) => {
|
|
25
|
+
if (final !== void 0) input.write(`${final}\n`);
|
|
26
|
+
} };
|
|
27
|
+
}
|
|
28
|
+
let frame = 0;
|
|
29
|
+
const draw = () => {
|
|
30
|
+
input.write(`\r${input.style.paint("cyan", FRAMES[frame % FRAMES.length] ?? "")} ${message}`);
|
|
31
|
+
frame += 1;
|
|
32
|
+
};
|
|
33
|
+
draw();
|
|
34
|
+
const timer = setInterval(draw, FRAME_MS);
|
|
35
|
+
timer.unref();
|
|
36
|
+
return { done: (final) => {
|
|
37
|
+
clearInterval(timer);
|
|
38
|
+
input.write(`\r\u001B[2K${final === void 0 ? "" : `${input.style.okMark} ${final}\n`}`);
|
|
39
|
+
} };
|
|
40
|
+
};
|
|
41
|
+
}
|
|
42
|
+
/** The value of a `--*-stdin` secret: stdin up to the first newline, trimmed. */
|
|
43
|
+
async function readSecret(readStdin) {
|
|
44
|
+
if (readStdin === void 0) return;
|
|
45
|
+
const text = (await readStdin()).split(/\r?\n/u, 1)[0]?.trim() ?? "";
|
|
46
|
+
return text === "" ? void 0 : text;
|
|
47
|
+
}
|
|
48
|
+
//#endregion
|
|
49
|
+
//#region src/cli/core/credentials.ts
|
|
50
|
+
const URL_PASSWORD = /\b([a-z][a-z0-9+.-]*:\/\/[^\s:/@]+:)([^\s@/]+)@/giu;
|
|
51
|
+
/** `text` with every registered secret and every URL password masked. */
|
|
52
|
+
function redact(text, secrets) {
|
|
53
|
+
let out = text.replace(URL_PASSWORD, "$1***@");
|
|
54
|
+
for (const secret of secrets) if (secret.length >= 4) out = out.replaceAll(secret, "***");
|
|
55
|
+
return out;
|
|
56
|
+
}
|
|
57
|
+
/**
|
|
58
|
+
* The secret piped in for `--<flag>-stdin`, when it was passed, registered
|
|
59
|
+
* for redaction.
|
|
60
|
+
*/
|
|
61
|
+
async function secretInput(ctx, input) {
|
|
62
|
+
let value;
|
|
63
|
+
if (input.stdin) {
|
|
64
|
+
value = await readSecret(ctx.io.readStdin);
|
|
65
|
+
if (value === void 0) throw new CliError("usage", `${ctx.command}: --${input.flag}-stdin read nothing from stdin`, {
|
|
66
|
+
code: "missing_value",
|
|
67
|
+
extensions: { flag: `--${input.flag}-stdin` }
|
|
68
|
+
});
|
|
69
|
+
}
|
|
70
|
+
if (value !== void 0) ctx.addSecret(value);
|
|
71
|
+
return value;
|
|
72
|
+
}
|
|
73
|
+
//#endregion
|
|
74
|
+
export { secretInput as n, progressReporter as r, redact as t };
|
|
@@ -0,0 +1,286 @@
|
|
|
1
|
+
import { n as isReadonlyArray } from "./compact-CAf557ZB.js";
|
|
2
|
+
import { r as ownGet } from "./paths-DXSHAMIa.js";
|
|
3
|
+
import { c as isConditionRef, i as resolveConditionRef, s as isConditionDate, u as parentHop } from "./refs-K6eWUJ0H.js";
|
|
4
|
+
import { o as sameId, t as expiredAt } from "./expiry-D4_YKRKD.js";
|
|
5
|
+
import { g as formerScopes, m as annotationsFor, n as findPermission } from "./permission-registry-Br4jSNVi.js";
|
|
6
|
+
import { o as epochSeconds } from "./time-DkWjdL98.js";
|
|
7
|
+
import { d as scopeList, m as tenantOf, o as resolveScope, p as subjectMemberships } from "./scopes-CUPSjo9q.js";
|
|
8
|
+
import { t as isoInstant } from "./instant-BluqDvyS.js";
|
|
9
|
+
import { o as flattenGrantee } from "./grantee-hxrUsbpM.js";
|
|
10
|
+
import { t as isActive } from "./validity-CZ7-y0Cj.js";
|
|
11
|
+
import { n as matchGrantee } from "./grantee-match-DbENBHLB.js";
|
|
12
|
+
//#region src/conditions/evaluate.ts
|
|
13
|
+
function resolveRef(ref, subject) {
|
|
14
|
+
return resolveConditionRef(ref, subject);
|
|
15
|
+
}
|
|
16
|
+
function unwrap(value, subject) {
|
|
17
|
+
if (isConditionRef(value)) return resolveRef(value.ref, subject);
|
|
18
|
+
if (isConditionDate(value)) return new Date(isoInstant(value.date) ?? NaN);
|
|
19
|
+
if (isReadonlyArray(value)) return value.map((item) => unwrap(item, subject));
|
|
20
|
+
return value;
|
|
21
|
+
}
|
|
22
|
+
function instantOf(value) {
|
|
23
|
+
if (value instanceof Date) {
|
|
24
|
+
const time = value.getTime();
|
|
25
|
+
return Number.isNaN(time) ? void 0 : time;
|
|
26
|
+
}
|
|
27
|
+
if (typeof value === "number") return Number.isFinite(value) ? value : void 0;
|
|
28
|
+
if (typeof value === "string") return isoInstant(value);
|
|
29
|
+
}
|
|
30
|
+
function comparablePair(left, right) {
|
|
31
|
+
if (left instanceof Date || right instanceof Date) {
|
|
32
|
+
const a = instantOf(left);
|
|
33
|
+
const b = instantOf(right);
|
|
34
|
+
return a === void 0 || b === void 0 ? void 0 : [a, b];
|
|
35
|
+
}
|
|
36
|
+
const kind = typeof left;
|
|
37
|
+
if (kind === typeof right && (kind === "string" || kind === "number" || kind === "boolean")) return [left, right];
|
|
38
|
+
}
|
|
39
|
+
function compare(op, left, right) {
|
|
40
|
+
if (left === void 0 || left === null || right === void 0 || right === null) return false;
|
|
41
|
+
const comparable = comparablePair(left, right);
|
|
42
|
+
if (comparable === void 0) return false;
|
|
43
|
+
const [a, b] = comparable;
|
|
44
|
+
switch (op) {
|
|
45
|
+
case "eq": return a === b;
|
|
46
|
+
case "ne": return a !== b;
|
|
47
|
+
case "gt": return a > b;
|
|
48
|
+
case "gte": return a >= b;
|
|
49
|
+
case "lt": return a < b;
|
|
50
|
+
case "lte": return a <= b;
|
|
51
|
+
default: return op;
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
function contains(left, right) {
|
|
55
|
+
if (left === void 0 || left === null || right === void 0 || right === null) return false;
|
|
56
|
+
if (typeof left === "string" && typeof right === "string") return left.includes(right);
|
|
57
|
+
if (Array.isArray(left)) return left.includes(right);
|
|
58
|
+
return false;
|
|
59
|
+
}
|
|
60
|
+
function inList(left, right) {
|
|
61
|
+
if (left === void 0 || left === null || !Array.isArray(right)) return false;
|
|
62
|
+
return right.includes(left);
|
|
63
|
+
}
|
|
64
|
+
function matchesParentHop(data, parents, on) {
|
|
65
|
+
for (const parent of parents ?? []) {
|
|
66
|
+
const hop = parentHop(parent);
|
|
67
|
+
if (hop.resource !== void 0 && hop.resource !== on.resource) continue;
|
|
68
|
+
if (sameId(ownGet(data, hop.field), on.id)) return true;
|
|
69
|
+
}
|
|
70
|
+
return false;
|
|
71
|
+
}
|
|
72
|
+
function evaluateMemberOf(condition, data, subject, now, scopes) {
|
|
73
|
+
if (data === null || typeof data !== "object") return false;
|
|
74
|
+
const rowValue = ownGet(data, condition.field);
|
|
75
|
+
if (rowValue === void 0 || rowValue === null) return false;
|
|
76
|
+
const memberships = subjectMemberships(subject.principal?.memberships, scopes);
|
|
77
|
+
const wanted = new Set(condition.roles);
|
|
78
|
+
const active = subject.principal?.tenant === "" ? void 0 : subject.principal?.tenant;
|
|
79
|
+
const scope = condition.scope === "resource" ? void 0 : resolveScope(scopes, condition.scope);
|
|
80
|
+
if (condition.scope !== "resource" && scope === void 0) return false;
|
|
81
|
+
for (const membership of memberships) {
|
|
82
|
+
if (expiredAt(membership, now)) continue;
|
|
83
|
+
if (wanted.size > 0 && !membership.roles.some((role) => wanted.has(role))) continue;
|
|
84
|
+
if (scope !== void 0) {
|
|
85
|
+
if (membership.scope !== scope || !sameId(membership.id, rowValue)) continue;
|
|
86
|
+
const tenant = tenantOf(membership, scopes);
|
|
87
|
+
if (active !== void 0 && tenant !== void 0 && tenant !== active) continue;
|
|
88
|
+
return true;
|
|
89
|
+
}
|
|
90
|
+
if (membership.on === void 0) continue;
|
|
91
|
+
if (condition.resource !== void 0 && membership.on.resource !== condition.resource) {
|
|
92
|
+
if (matchesParentHop(data, condition.parents, membership.on)) return true;
|
|
93
|
+
continue;
|
|
94
|
+
}
|
|
95
|
+
if (sameId(membership.on.id, rowValue)) return true;
|
|
96
|
+
if (matchesParentHop(data, condition.parents, membership.on)) return true;
|
|
97
|
+
}
|
|
98
|
+
return false;
|
|
99
|
+
}
|
|
100
|
+
function evaluateCondition(condition, data, subject, now = epochSeconds(), scopes = scopeList(void 0), related, onOpaque) {
|
|
101
|
+
switch (condition.op) {
|
|
102
|
+
case "and": return condition.conditions.every((child) => evaluateCondition(child, data, subject, now, scopes, related, onOpaque));
|
|
103
|
+
case "or": return condition.conditions.some((child) => evaluateCondition(child, data, subject, now, scopes, related, onOpaque));
|
|
104
|
+
case "not": return !evaluateCondition(condition.condition, data, subject, now, scopes, related, onOpaque);
|
|
105
|
+
case "isNull": {
|
|
106
|
+
if (data === null || typeof data !== "object") return false;
|
|
107
|
+
const value = ownGet(data, condition.field);
|
|
108
|
+
const isNull = value === null || value === void 0;
|
|
109
|
+
return condition.value ? isNull : !isNull;
|
|
110
|
+
}
|
|
111
|
+
case "in":
|
|
112
|
+
case "notIn": {
|
|
113
|
+
if (data === null || typeof data !== "object") return false;
|
|
114
|
+
const left = ownGet(data, condition.field);
|
|
115
|
+
const matched = inList(left, unwrap(condition.value, subject));
|
|
116
|
+
return condition.op === "in" ? matched : !matched && left !== void 0 && left !== null;
|
|
117
|
+
}
|
|
118
|
+
case "contains":
|
|
119
|
+
if (data === null || typeof data !== "object") return false;
|
|
120
|
+
return contains(ownGet(data, condition.field), unwrap(condition.value, subject));
|
|
121
|
+
case "eq":
|
|
122
|
+
case "ne":
|
|
123
|
+
case "gt":
|
|
124
|
+
case "gte":
|
|
125
|
+
case "lt":
|
|
126
|
+
case "lte":
|
|
127
|
+
if (condition.field === "_" && condition.op === "eq") return condition.value === true;
|
|
128
|
+
if (data === null || typeof data !== "object") return false;
|
|
129
|
+
return compare(condition.op, ownGet(data, condition.field), unwrap(condition.value, subject));
|
|
130
|
+
case "memberOf": return evaluateMemberOf(condition, data, subject, now, scopes);
|
|
131
|
+
case "related": return related?.(condition, data) === true;
|
|
132
|
+
case "sqlFunction": return evaluateCondition(condition.twin, data, subject, now, scopes, related, onOpaque);
|
|
133
|
+
case "opaque":
|
|
134
|
+
onOpaque?.();
|
|
135
|
+
return false;
|
|
136
|
+
case "liveSession": return subject.liveSession === true;
|
|
137
|
+
default:
|
|
138
|
+
/* v8 ignore next */
|
|
139
|
+
return condition;
|
|
140
|
+
}
|
|
141
|
+
}
|
|
142
|
+
//#endregion
|
|
143
|
+
//#region src/core/row-pair.ts
|
|
144
|
+
function isRowPair(value) {
|
|
145
|
+
return value !== null && typeof value === "object" && "current" in value && "next" in value;
|
|
146
|
+
}
|
|
147
|
+
/**
|
|
148
|
+
* The row a `where` reads and the row a `check` reads. An instance check
|
|
149
|
+
* takes a `{ current, next }` pair or one row for both; a collection check
|
|
150
|
+
* has no current row, only the input it creates.
|
|
151
|
+
*/
|
|
152
|
+
function rowValues(permission, data) {
|
|
153
|
+
if (permission.kind === "collection") return {
|
|
154
|
+
current: void 0,
|
|
155
|
+
next: data
|
|
156
|
+
};
|
|
157
|
+
if (permission.kind === "instance" && isRowPair(data)) return {
|
|
158
|
+
current: data.current,
|
|
159
|
+
next: data.next
|
|
160
|
+
};
|
|
161
|
+
return {
|
|
162
|
+
current: data,
|
|
163
|
+
next: data
|
|
164
|
+
};
|
|
165
|
+
}
|
|
166
|
+
/** The row's id under `field` as a string, or `*` when the row has no string or number there. */
|
|
167
|
+
function rowIdOf(row, field = "id") {
|
|
168
|
+
if (row === null || typeof row !== "object" || !Object.hasOwn(row, field)) return "*";
|
|
169
|
+
const id = Reflect.get(row, field);
|
|
170
|
+
return typeof id === "string" || typeof id === "number" ? String(id) : "*";
|
|
171
|
+
}
|
|
172
|
+
//#endregion
|
|
173
|
+
//#region src/core/delegation.ts
|
|
174
|
+
/** The permission's scope and any scope it was renamed from: tokens issued before a rename keep working. */
|
|
175
|
+
function scopeNames(permission) {
|
|
176
|
+
return [permission.scope, ...formerScopes(permission)];
|
|
177
|
+
}
|
|
178
|
+
/**
|
|
179
|
+
* Whether a delegated caller may use a permission its principal holds, through
|
|
180
|
+
* OAuth `scopes`, RFC 9396 `authorizationDetails` or GNAP `access`.
|
|
181
|
+
* `undefined` means covered; otherwise the denial reason `decide` would add.
|
|
182
|
+
*/
|
|
183
|
+
function coveredByDelegation(permission, delegation, resourceId, hasActor = false) {
|
|
184
|
+
const unscoped = hasActor ? "no-delegation" : void 0;
|
|
185
|
+
if (delegation === void 0) return unscoped;
|
|
186
|
+
const hasScopes = delegation.scopes !== void 0;
|
|
187
|
+
const hasDetails = delegation.authorizationDetails !== void 0;
|
|
188
|
+
const hasAccess = delegation.access !== void 0;
|
|
189
|
+
if (!hasScopes && !hasDetails && !hasAccess) return unscoped;
|
|
190
|
+
const emptyScopes = hasScopes && (delegation.scopes?.length ?? 0) === 0;
|
|
191
|
+
const emptyAccess = hasAccess && (delegation.access?.length ?? 0) === 0;
|
|
192
|
+
if (emptyScopes && !hasDetails && !hasAccess) return "no-delegation";
|
|
193
|
+
if (emptyAccess && !hasScopes && !hasDetails) return "no-delegation";
|
|
194
|
+
if (emptyScopes && emptyAccess && !hasDetails) return "no-delegation";
|
|
195
|
+
const scopes = scopeNames(permission);
|
|
196
|
+
const scopeOk = delegation.scopes?.some((scope) => scopes.includes(scope)) ?? false;
|
|
197
|
+
const detailOk = delegation.authorizationDetails?.some((detail) => {
|
|
198
|
+
if (detail.type !== permission.resource) return false;
|
|
199
|
+
const identifier = detail["identifier"];
|
|
200
|
+
if (identifier !== void 0 && (typeof identifier !== "string" || identifier !== resourceId)) return false;
|
|
201
|
+
const actions = detail.actions;
|
|
202
|
+
if (actions === void 0) return true;
|
|
203
|
+
return Array.isArray(actions) && actions.includes(permission.action);
|
|
204
|
+
}) ?? false;
|
|
205
|
+
const accessOk = accessCovers(permission, delegation.access, resourceId);
|
|
206
|
+
if (scopeOk || detailOk || accessOk) return;
|
|
207
|
+
return "not-delegated";
|
|
208
|
+
}
|
|
209
|
+
/** A `readOnly` actor never uses a permission without `readOnlyHint`, delegated or not. */
|
|
210
|
+
function readOnlyActorRefuses(actor, permission) {
|
|
211
|
+
return actor?.readOnly === true && !annotationsFor(permission).readOnlyHint;
|
|
212
|
+
}
|
|
213
|
+
/**
|
|
214
|
+
* Whether an `agent` actor may call the tool `name`: its `tools` list names it.
|
|
215
|
+
* An agent without a `tools` list and any other actor kind are not restricted
|
|
216
|
+
* here; a `tools` value that is not a list of strings refuses every tool.
|
|
217
|
+
*/
|
|
218
|
+
function actorMayCallTool(actor, name) {
|
|
219
|
+
if (actor?.kind !== "agent" || !Object.hasOwn(actor, "tools")) return true;
|
|
220
|
+
const tools = actor["tools"];
|
|
221
|
+
return Array.isArray(tools) && tools.some((tool) => typeof tool === "string" && tool === name);
|
|
222
|
+
}
|
|
223
|
+
function coversRequirements(tree, requires, delegation, resourceId, hasActor = false) {
|
|
224
|
+
return (requires ?? []).every((key) => {
|
|
225
|
+
const leaf = findPermission(tree, key);
|
|
226
|
+
return leaf !== void 0 && coveredByDelegation(leaf, delegation, resourceId, hasActor) === void 0;
|
|
227
|
+
});
|
|
228
|
+
}
|
|
229
|
+
function requiresStandIn(grant) {
|
|
230
|
+
return (grant.requires ?? []).length > 0 && annotationsFor(grant.permission).readOnlyHint && !flattenGrantee(grant.to).some((item) => item.kind === "role");
|
|
231
|
+
}
|
|
232
|
+
function accessCovers(permission, access, resourceId) {
|
|
233
|
+
if (access === void 0) return false;
|
|
234
|
+
return access.some((entry) => {
|
|
235
|
+
if (typeof entry === "string") return scopeNames(permission).includes(entry);
|
|
236
|
+
if (entry === null || typeof entry !== "object") return false;
|
|
237
|
+
const type = entry["type"];
|
|
238
|
+
if (typeof type !== "string" || !typeMatches(type, permission.resource)) return false;
|
|
239
|
+
const actions = entry["actions"];
|
|
240
|
+
if (actions !== void 0 && (!Array.isArray(actions) || !actions.includes(permission.action))) return false;
|
|
241
|
+
const identifier = entry["identifier"];
|
|
242
|
+
if (identifier !== void 0 && (typeof identifier !== "string" || identifier !== resourceId)) return false;
|
|
243
|
+
return true;
|
|
244
|
+
});
|
|
245
|
+
}
|
|
246
|
+
function typeMatches(type, resource) {
|
|
247
|
+
if (type === resource) return true;
|
|
248
|
+
return type.endsWith(`/${resource}`);
|
|
249
|
+
}
|
|
250
|
+
/**
|
|
251
|
+
* Whether the subject's principal is a `from` of the delegation: every item
|
|
252
|
+
* matches, with roles checked against the roles the principal holds here
|
|
253
|
+
* (`matchGrantee` leaves role holding to the caller) and nothing that needs a
|
|
254
|
+
* row.
|
|
255
|
+
*/
|
|
256
|
+
function handsOver(delegation, subject, heldRoles, now) {
|
|
257
|
+
const items = flattenGrantee(delegation.from);
|
|
258
|
+
if (items.length === 0 || subject.principal === null) return false;
|
|
259
|
+
return items.every((item) => {
|
|
260
|
+
if (item.kind === "role") return heldRoles.has(item.role);
|
|
261
|
+
if (item.kind === "relation") return false;
|
|
262
|
+
const match = matchGrantee(item, subject, now, void 0);
|
|
263
|
+
return match.matched && match.where === void 0;
|
|
264
|
+
});
|
|
265
|
+
}
|
|
266
|
+
/**
|
|
267
|
+
* The permission keys the policy's delegations let `subject.actor` use for
|
|
268
|
+
* `subject.principal` right now: the union over every active delegation whose
|
|
269
|
+
* `to` matches the actor and whose `from` the principal holds. `undefined`
|
|
270
|
+
* when none applies, so the call falls back to the token delegation alone.
|
|
271
|
+
* An actor with `readOnly: true` gets only each delegation's read-only keys.
|
|
272
|
+
* Attenuation only: a key here still needs a matching allow and no deny.
|
|
273
|
+
*/
|
|
274
|
+
function delegatedPermissions(delegations, subject, heldRoles, now) {
|
|
275
|
+
const actor = subject.actor;
|
|
276
|
+
if (actor === void 0 || delegations === void 0) return;
|
|
277
|
+
let keys;
|
|
278
|
+
for (const delegation of delegations) {
|
|
279
|
+
if (delegation.to.kind !== actor.kind || delegation.to.id !== void 0 && delegation.to.id !== actor.id || delegation.to.client !== void 0 && delegation.to.client !== actor.client || !isActive(delegation.validity, now) || !handsOver(delegation, subject, heldRoles, now)) continue;
|
|
280
|
+
keys ??= /* @__PURE__ */ new Set();
|
|
281
|
+
for (const key of actor.readOnly === true ? delegation.readOnly : delegation.permissions) keys.add(key);
|
|
282
|
+
}
|
|
283
|
+
return keys;
|
|
284
|
+
}
|
|
285
|
+
//#endregion
|
|
286
|
+
export { readOnlyActorRefuses as a, rowIdOf as c, delegatedPermissions as i, rowValues as l, coveredByDelegation as n, requiresStandIn as o, coversRequirements as r, isRowPair as s, actorMayCallTool as t, evaluateCondition as u };
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
import { $t as DeliveryFailureCause, Zt as DeliveryChannel, tn as EmailCategory } from "../policy-types-n0uRTsW8.js";
|
|
2
|
+
import { i as approvalUrlFor, n as ApprovalUrl, r as approvalPrompt, t as ApprovalPrompt } from "../approval-prompt-DvSSPQJX.js";
|
|
3
|
+
import { _ as TransportOptions, a as DeliveryReport, c as DeliveryTransport, d as EmailTransport, f as EmailUnsubscribe, g as TransportMessages, h as TransportItem, i as DeliveryMessages, l as DeliveryTransports, m as Recipient, n as ChatTransport, o as DeliveryResult, p as OutgoingEmail, r as DeliverOptions, s as DeliveryTarget, t as ChatMessage, u as EmailMessage, v as WebhookMessage, y as WebhookTransport } from "../types-BtHtcKMr.js";
|
|
4
|
+
import { a as DeliveryPermDock, c as MemoryDelivery, d as memoryDeliveryTransport, f as Audience, g as subscribersFor, h as audience, i as isDeliveryTarget, l as MemoryDeliveryTransport, m as SubscriberEvent, n as webhookTransport, o as DeliveryPermDockOptions, p as AudienceOptions, r as isAddrSpec, s as createPermDock, t as WebhookTransportOptions, u as MemoryDeliveryTransportOptions } from "../index-CueFnxQc.js";
|
|
5
|
+
export { type ApprovalPrompt, type ApprovalUrl, type Audience, type AudienceOptions, type ChatMessage, type ChatTransport, type DeliverOptions, type DeliveryChannel, type DeliveryFailureCause, type DeliveryMessages, type DeliveryPermDock, type DeliveryPermDockOptions, type DeliveryReport, type DeliveryResult, type DeliveryTarget, type DeliveryTransport, type DeliveryTransports, type EmailCategory, type EmailMessage, type EmailTransport, type EmailUnsubscribe, type MemoryDelivery, type MemoryDeliveryTransport, type MemoryDeliveryTransportOptions, type OutgoingEmail, type Recipient, type SubscriberEvent, type TransportItem, type TransportMessages, type TransportOptions, type WebhookMessage, type WebhookTransport, type WebhookTransportOptions, approvalPrompt, approvalUrlFor, audience, createPermDock, isAddrSpec, isDeliveryTarget, memoryDeliveryTransport, subscribersFor, webhookTransport };
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
import { n as approvalUrlFor, t as approvalPrompt } from "../approval-prompt-Dg5LeAcT.js";
|
|
2
|
+
import { n as subscribersFor, t as audience } from "../audience-DabClFLQ.js";
|
|
3
|
+
import { i as isDeliveryTarget, n as isAddrSpec } from "../target-Bw37TFNA.js";
|
|
4
|
+
import { n as createPermDock, r as memoryDeliveryTransport, t as webhookTransport } from "../delivery-DCAgNyCn.js";
|
|
5
|
+
export { approvalPrompt, approvalUrlFor, audience, createPermDock, isAddrSpec, isDeliveryTarget, memoryDeliveryTransport, subscribersFor, webhookTransport };
|