permdock 0.4.0 → 0.6.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +37 -35
- package/dist/{schema-Bol6gqXA.js → 2020-C9VN-x8c.js} +5 -130
- package/dist/a2a/index.d.ts +6 -6
- package/dist/a2a/index.js +14 -17
- package/dist/{adapter-context-mlWsVGGg.js → adapter-context-CRhqyzCk.js} +1 -1
- package/dist/adoption-scan-DCYe60Pi.js +107 -0
- package/dist/agent/index.d.ts +3 -0
- package/dist/agent/index.js +1 -0
- package/dist/ai-sdk/index.d.ts +18 -35
- package/dist/ai-sdk/index.js +37 -23
- package/dist/{app-data-CV8pqqMi.js → app-data-MuyzVqX8.js} +2 -1
- package/dist/approval-header-CJACtHkv.js +23 -0
- package/dist/approval-prompt-Dg5LeAcT.js +62 -0
- package/dist/approval-prompt-DvSSPQJX.d.ts +57 -0
- package/dist/approvals/index.d.ts +5 -3
- package/dist/approvals/index.js +8 -5
- package/dist/approvals-p1PGoVjb.js +995 -0
- package/dist/arazzo-41WuzHou.js +36 -0
- package/dist/{arazzo-C4BcskbX.js → arazzo-CaUVBn7D.js} +20 -14
- package/dist/args-IIolxxKA.js +197 -0
- package/dist/astro/index.d.ts +43 -0
- package/dist/astro/index.js +27 -0
- package/dist/audience-DabClFLQ.js +55 -0
- package/dist/auth-DRLEizbL.js +178 -0
- package/dist/authzen/index.d.ts +26 -6
- package/dist/authzen/index.js +94 -79
- package/dist/automation-BNM3TtDo.d.ts +114 -0
- package/dist/automation-DVjOckjV.js +157 -0
- package/dist/better-auth/index.d.ts +8 -6
- package/dist/better-auth/index.js +9 -8
- package/dist/better-supabase/index.d.ts +357 -30
- package/dist/better-supabase/index.js +936 -194
- package/dist/{bind-kk-uyCwH.js → bind-CAvgUuKs.js} +14 -10
- package/dist/{bind-BzqG8SMb.d.ts → bind-DOyrv6zi.d.ts} +12 -10
- package/dist/body-CH5of8Ne.js +10 -0
- package/dist/body-text-QcXok_SI.js +52 -0
- package/dist/{build-instance-DIIV9DbC.js → build-instance-Bu_eDqYw.js} +4 -3
- package/dist/{canonical-json-CFKyFOke.js → canonical-json-BC8_nMTw.js} +5 -3
- package/dist/{capability-CksyCWDH.d.ts → capability-Drg-1YhL.d.ts} +44 -25
- package/dist/{capability-txATtKV4.js → capability-N1K9IpqS.js} +68 -42
- package/dist/casbin-Cr7RLtA3.js +30 -0
- package/dist/casbin-Dyu2gnUD.js +234 -0
- package/dist/casl-64gpT-8x.js +24 -0
- package/dist/casl-DjEDhTCP.js +299 -0
- package/dist/catalog/index.d.ts +74 -2
- package/dist/catalog/index.js +51 -2
- package/dist/catalog-BoWglDPI.js +1 -0
- package/dist/catalog-DZVbrF-z.js +52 -0
- package/dist/{catalog-tZUyOfOv.js → catalog-HD2gf5mY.js} +51 -6
- package/dist/{catalog-doc-DWtg0gGR.js → catalog-doc-Cdn7-0pQ.js} +45 -23
- package/dist/catalog-fingerprint-CCP0-yQS.js +153 -0
- package/dist/chat/index.d.ts +2 -0
- package/dist/chat/index.js +224 -0
- package/dist/chat-sdk/index.d.ts +87 -0
- package/dist/chat-sdk/index.js +197 -0
- package/dist/claims-map-7oQ3ue4X.js +13 -0
- package/dist/claims-map-Ca-QX8C6.d.ts +32 -0
- package/dist/claude-agent/index.d.ts +7 -14
- package/dist/claude-agent/index.js +24 -27
- package/dist/clerk/index.d.ts +9 -8
- package/dist/clerk/index.js +9 -14
- package/dist/cli/bin.js +36 -17
- package/dist/cli/index.d.ts +19 -5
- package/dist/cli/index.js +164 -4
- package/dist/cloud/index.d.ts +102 -63
- package/dist/cloud/index.js +239 -340
- package/dist/cloud-ytQ3uviA.js +87 -0
- package/dist/codemod-5mpSpnUY.js +37 -0
- package/dist/codemod-ua2hHy7w.js +2084 -0
- package/dist/collect-Ci6akVwH.js +55 -0
- package/dist/collect-D7eQDffE.js +1 -0
- package/dist/{collect-2SrB7lfk.js → collect-mLTY4nwb.js} +75 -11
- package/dist/command-L8EstFNm.js +6 -0
- package/dist/compile/index.d.ts +1 -1
- package/dist/compile/index.js +1 -2
- package/dist/{compile-CtTP7eur.d.ts → compile-1bsAezL0.d.ts} +5 -3
- package/dist/{compile-CcEu2ZQ1.js → compile-CMqMx_IN.js} +11 -8
- package/dist/completion-BTFrHZhX.js +143 -0
- package/dist/config-Bj2Ixq3d.js +26 -0
- package/dist/{config-BIjREpyE.js → config-bs_kZeYq.js} +12 -7
- package/dist/{config-report--Xb9APJS.js → config-report-DSpsLpCE.js} +15 -5
- package/dist/{connection-DUsczpB5.js → connection-DjhIJSs2.js} +6 -5
- package/dist/{context-DieZVJXu.js → context-B_u3_bDJ.js} +2 -2
- package/dist/convex/index.d.ts +11 -10
- package/dist/convex/index.js +6 -4
- package/dist/create-B30OMUOJ.d.ts +107 -0
- package/dist/create-CBMmFie-.d.ts +138 -0
- package/dist/create-CGm28gyI.js +130 -0
- package/dist/create-CQWIpUG-.js +403 -0
- package/dist/{create-BBO24vj6.js → create-DCF2SvoT.js} +31 -32
- package/dist/create-D_NmPOdH.d.ts +110 -0
- package/dist/{credential-kue0qpbm.js → credential-BcoiejpY.js} +152 -31
- package/dist/credentials-DPyHmYz5.js +74 -0
- package/dist/delegation-j6-rc37o.js +286 -0
- package/dist/delivery/index.d.ts +5 -0
- package/dist/delivery/index.js +5 -0
- package/dist/delivery-DCAgNyCn.js +499 -0
- package/dist/delivery-event-xX4obB8F.js +40 -0
- package/dist/{denied-text-DfRk15uw.d.ts → denied-text-CiFQNuMV.d.ts} +5 -5
- package/dist/{describe-C3ldA9os.d.ts → describe-B5qgDvEW.d.ts} +2 -2
- package/dist/{describe-Cgkp7eP0.js → describe-BybMRY7A.js} +6 -2
- package/dist/device-BARQ8eYG.js +193 -0
- package/dist/{diff-rpqoe7Ag.js → diff-3jbx6Rm4.js} +60 -54
- package/dist/diff-CmuSD3vc.js +37 -0
- package/dist/doctor-3ZqNHX_G.js +44 -0
- package/dist/{doctor-owlv6ddh.js → doctor-BdZw53-k.js} +245 -50
- package/dist/drizzle/index.d.ts +5 -3
- package/dist/drizzle/index.js +2 -2
- package/dist/elysia/index.d.ts +16 -13
- package/dist/elysia/index.js +13 -12
- package/dist/env-DJZrPjRi.js +8 -0
- package/dist/errors-BDUwg2qC.js +27 -0
- package/dist/{errors-drnfxYtm.js → errors-BKy0EfhN.js} +5 -9
- package/dist/errors-BWXBMaKK.d.ts +11 -0
- package/dist/errors-CWTY6uih.js +143 -0
- package/dist/{errors-OD_4c__H.d.ts → errors-DH5QEGXh.d.ts} +2 -2
- package/dist/evaluate-CNClBvcj.js +1785 -0
- package/dist/evaluations-C_1vdSZc.d.ts +32 -0
- package/dist/{evaluations-C9YJsv3H.js → evaluations-beAooV0n.js} +145 -34
- package/dist/eve/index.d.ts +12 -16
- package/dist/eve/index.js +22 -28
- package/dist/event-time-CsegxXxB.js +23 -0
- package/dist/expiry-D4_YKRKD.js +52 -0
- package/dist/express/index.d.ts +13 -10
- package/dist/express/index.js +12 -11
- package/dist/fastify/index.d.ts +25 -22
- package/dist/fastify/index.js +13 -12
- package/dist/fetch-adapter-DD_gfmrC.js +120 -0
- package/dist/fetch-adapter-Dw0MTS3D.d.ts +31 -0
- package/dist/fields-OYG_JR78.js +203 -0
- package/dist/files-C5ZI27eV.js +124 -0
- package/dist/{fixtures-h2eG2OZV.js → fixtures-B7XrLeY7.js} +8 -7
- package/dist/flags-C3DktBDY.js +86 -0
- package/dist/{from-snapshot-7REQZe0H.js → from-snapshot-CTCMsFZk.js} +55 -52
- package/dist/{grantee-conditions-MQs5NIuX.js → grantee-conditions-CcXf8hMM.js} +4 -3
- package/dist/{grantee-CXY-0C87.js → grantee-hxrUsbpM.js} +16 -6
- package/dist/{grantee-match-fxYp9Nmt.js → grantee-match-DbENBHLB.js} +5 -4
- package/dist/h3/index.d.ts +37 -0
- package/dist/h3/index.js +35 -0
- package/dist/headers-BIjfMaoC.js +8 -0
- package/dist/headers-CIbDTUTK.d.ts +7 -0
- package/dist/{helpers-C9YmyBIa.js → helpers-CBYVMjwh.js} +45 -38
- package/dist/hono/index.d.ts +12 -9
- package/dist/hono/index.js +13 -12
- package/dist/hosted-B46-5LYE.js +315 -0
- package/dist/hosted-BPk51-kX.d.ts +78 -0
- package/dist/{http-DPuDaChb.d.ts → http-B_LphE5Y.d.ts} +1 -2
- package/dist/http-DXJ37RDA.js +46 -0
- package/dist/{http-BEbdMZ05.js → http-ujKm0JXE.js} +1 -2
- package/dist/{import-UHk1N7vH.js → import-CNV7I2Dw.js} +25 -20
- package/dist/{import-BFIlhetD.js → import-wyqXUyjm.js} +190 -53
- package/dist/index-B8YjkEZ4.d.ts +210 -0
- package/dist/index-C-6Letxg.d.ts +431 -0
- package/dist/index-CaxrMD1A.d.ts +1 -0
- package/dist/{index-BwMe94Xq.d.ts → index-Ch8LpNDp.d.ts} +34 -16
- package/dist/index-Cp_ilKi1.d.ts +91 -0
- package/dist/index-CueFnxQc.d.ts +110 -0
- package/dist/index-DuWxc5dt.d.ts +909 -0
- package/dist/index.d.ts +19 -15
- package/dist/index.js +31 -21
- package/dist/init-DeMYsnYJ.js +96 -0
- package/dist/init-GG6Jh8HD.js +95 -0
- package/dist/{instance-options-plkrsAog.d.ts → instance-options-BsVpyGIk.d.ts} +2 -2
- package/dist/instance-snapshot-BOEhcqIF.js +601 -0
- package/dist/instant-BluqDvyS.js +19 -0
- package/dist/internals-Dk8A8fX3.js +17 -0
- package/dist/{json-schema-DBkdUuCO.js → json-schema-B-vAwlde.js} +45 -6
- package/dist/json-schema-CN_iLFH2.d.ts +40 -0
- package/dist/jwt/index.d.ts +18 -11
- package/dist/jwt/index.js +156 -135
- package/dist/{kernel-CB3LrIJM.js → kernel-D0NVb1cK.js} +52 -24
- package/dist/kysely/index.d.ts +5 -3
- package/dist/kysely/index.js +2 -2
- package/dist/load-BxEtwlBS.js +1 -0
- package/dist/{load-C3_oTHyO.js → load-DFS_ry0W.js} +22 -6
- package/dist/{load-jose-BL6LH4bL.js → load-jose-DZ4dnjri.js} +1 -4
- package/dist/login-Dfe5RlYk.js +68 -0
- package/dist/login-imhuwvn3.js +254 -0
- package/dist/manifest-C8IzW3Do.js +42 -0
- package/dist/manifest-dvL2XEe1.js +370 -0
- package/dist/manifest-json-CAGzls-C.js +9 -0
- package/dist/{manifest-uDS9y5de.d.ts → manifest-mx5ghSFM.d.ts} +9 -2
- package/dist/manifest-schema-C0kK_8V0.js +399 -0
- package/dist/{map-claims-AVlBaJoa.js → map-claims-D3oRmTk0.js} +13 -10
- package/dist/{map-error-BE27PYkE.js → map-error-Dr70oA_3.js} +3 -3
- package/dist/{markers-CiwAOZtO.js → markers-C6joDI3o.js} +2 -1
- package/dist/mcp/index.d.ts +22 -12
- package/dist/mcp/index.js +57 -39
- package/dist/{migrate-BwlB5-Wk.js → migrate-CIq4-E9F.js} +53 -14
- package/dist/nest/index.d.ts +12 -9
- package/dist/nest/index.js +15 -14
- package/dist/next/index.d.ts +18 -21
- package/dist/next/index.js +13 -11
- package/dist/next/plugin.d.ts +1 -1
- package/dist/next/plugin.js +2 -2
- package/dist/node/index.d.ts +10 -10
- package/dist/node/index.js +7 -9
- package/dist/{ocsf-uYFXGVw2.js → ocsf-BFp-PZZA.js} +22 -11
- package/dist/openai/index.d.ts +9 -16
- package/dist/openai/index.js +17 -24
- package/dist/openapi/index.d.ts +3 -3
- package/dist/openapi/index.js +1 -1
- package/dist/{openapi-DBzHQbov.js → openapi-B7HZ0f-r.js} +8 -8
- package/dist/openapi-C4dDTVEd.js +138 -0
- package/dist/{openapi-BJdBmYDG.js → openapi-DD1SV-5-.js} +10 -9
- package/dist/operation-findings-DgATDpvh.js +36 -0
- package/dist/operations-X0VM7F3m.d.ts +59 -0
- package/dist/orpc/index.d.ts +13 -10
- package/dist/orpc/index.js +20 -15
- package/dist/otel/index.d.ts +3 -2
- package/dist/otel/index.js +30 -7
- package/dist/output-1im__-08.js +88 -0
- package/dist/output-files-B3IZJksC.js +1 -0
- package/dist/{output-files-CgIsvdSa.js → output-files-DhRBBE4n.js} +24 -26
- package/dist/{permission-keys-B26jeyUv.js → ownership-DqaJNJPn.js} +1045 -153
- package/dist/{package-root-DtNnpmUd.js → package-root-Dk_ETdkp.js} +1 -1
- package/dist/{parse-CVFQHk6c.js → parse-Cxq0WxrA.js} +2 -2
- package/dist/{parse-local-manifest-DvYUR0QL.d.ts → parse-local-manifest-5ODwqu8b.d.ts} +1 -1
- package/dist/{parse-local-manifest-C-q02Pal.js → parse-local-manifest-CVSs6J9I.js} +1 -1
- package/dist/parse-request-D_tUXG6M.js +26 -0
- package/dist/paths-DXSHAMIa.js +42 -0
- package/dist/pdp/index.d.ts +7 -3
- package/dist/pdp/index.js +45 -26
- package/dist/{peer-BOr_kJE1.js → peer-C8swJ2GH.js} +23 -4
- package/dist/peer-CRvC7Hg1.js +1 -0
- package/dist/permdock-BrAscV28.js +868 -0
- package/dist/permdock-SV8ZINYT.d.ts +502 -0
- package/dist/{permission-registry-BsblpB-z.js → permission-registry-Br4jSNVi.js} +3 -3
- package/dist/permissions-B-wCP5ZC.js +30 -0
- package/dist/{permissions-CCJ6lmxB.js → permissions-BPxlwVhN.js} +4 -3
- package/dist/{permissions-COH-KRgT.d.ts → permissions-u_KHg-sN.d.ts} +1 -2
- package/dist/policies-DP2nqRoF.js +295 -0
- package/dist/{policy-ur0BBK_e.d.ts → policy-77FSAq_V.d.ts} +2 -2
- package/dist/{hosted-CBHgkzDl.js → policy-DbM5YYtV.js} +17 -273
- package/dist/policy-from-catalog-C2gMa2Dj.js +450 -0
- package/dist/policy-module-CTlwMvLI.js +89 -0
- package/dist/{policy-types-sp9P1iIV.d.ts → policy-types-n0uRTsW8.d.ts} +460 -632
- package/dist/postgrest-CEgRbefE.d.ts +100 -0
- package/dist/postgrest-DAjUkF9w.js +575 -0
- package/dist/{powersync-cZe4kzhL.js → powersync-BkWWCS1K.js} +23 -24
- package/dist/powersync-DISt6SUe.js +62 -0
- package/dist/powersync-MMJ2mI2q.js +1 -0
- package/dist/preset/index.d.ts +146 -0
- package/dist/preset/index.js +1 -0
- package/dist/preset-DZdU0tne.js +1768 -0
- package/dist/principal-source-pHneukrx.js +103 -0
- package/dist/prisma/index.d.ts +6 -3
- package/dist/prisma/index.js +2 -2
- package/dist/{problem-CnWraVhC.js → problem-CTviyH5L.js} +13 -23
- package/dist/{problem-details-rIIo8B2C.d.ts → problem-details-B45V5d2b.d.ts} +1 -1
- package/dist/{problem-details-DECUnXAn.js → problem-details-cn5X30gZ.js} +43 -40
- package/dist/problem-types-CJ2325SZ.js +5 -0
- package/dist/{prompt-CXYhLfsS.js → prompt-DfZLJLIn.js} +2 -2
- package/dist/{protected-BN7BUdY1.js → protected-BlF0F6wL.js} +21 -4
- package/dist/{protected-B3_P7xuw.d.ts → protected-RFGpakN9.d.ts} +16 -8
- package/dist/{provider-Bi-0HNL3.js → provider-B1al-AZz.js} +2 -2
- package/dist/{provider-kwHC9CZD.d.ts → provider-DILL9oPK.d.ts} +1 -1
- package/dist/{provider-store-Ctt-81Ni.js → provider-store-DM6DNcta.js} +2 -2
- package/dist/pull-CvpINcMK.js +1 -0
- package/dist/pull-jEwbf80J.js +256 -0
- package/dist/push-BD4f15co.js +116 -0
- package/dist/pushed-policy-CqtxkV4G.js +238 -0
- package/dist/pushed-policy-DCW91KQU.d.ts +57 -0
- package/dist/react/index.d.ts +8 -8
- package/dist/react/index.js +6 -6
- package/dist/react/provider-client.d.ts +1 -1
- package/dist/react/provider-client.js +1 -2
- package/dist/react-native/index.d.ts +24 -72
- package/dist/react-native/index.js +29 -25
- package/dist/{refs-f3imMjNW.js → refs-K6eWUJ0H.js} +1 -1
- package/dist/{relation-walk-BXnlLtg2.js → relation-walk-3OyDBF0S.js} +2 -2
- package/dist/{relations-CvmSpG67.js → relations-BnCWnJGI.js} +3 -3
- package/dist/renames-CGj7YwcQ.js +175 -0
- package/dist/{replay-COpmZUfx.d.ts → replay-Bkm-Ne4l.d.ts} +1 -1
- package/dist/{replay-BsOyTrdV.js → replay-Du1tJjG7.js} +2 -1
- package/dist/{request-context-BVM7aWNs.js → request-context-C81Pip9n.js} +3 -3
- package/dist/request-schema-CMreVuFM.js +148 -0
- package/dist/resend/index.d.ts +126 -0
- package/dist/resend/index.js +379 -0
- package/dist/{resource-relations-D1Un3pcz.js → resource-relations-D_jw0BFx.js} +1 -1
- package/dist/{retire-BFcxL6un.js → retire-CALjIQ7e.js} +2 -2
- package/dist/{revocations-Cy06JNx2.d.ts → revocations-R07lFBnX.d.ts} +2 -0
- package/dist/rls-BAqP4q66.js +336 -0
- package/dist/{rls-BEktUaqg.js → rls-DTvYd-lI.js} +288 -690
- package/dist/{role-builder-B4GbKM-i.js → role-builder-uWQZ4v84.js} +14 -207
- package/dist/{rpc-nYC3cR_u.js → rpc-VSl5ylaQ.js} +7 -7
- package/dist/run-CUKuz0A8.js +723 -0
- package/dist/run-DDwUaJDU.js +1 -0
- package/dist/run-ticket-DocwaTKn.d.ts +124 -0
- package/dist/run-ticket-sxFI6LAk.js +337 -0
- package/dist/{runtime-D_tMXnsq.js → runtime-D3VTAiCA.js} +1 -1
- package/dist/{saas-DtaA4JuW.js → saas-BCXRuXca.js} +16 -14
- package/dist/scan-qvOe0hS3.js +29 -0
- package/dist/{schema-DjQBcAP9.js → schema-B4v0Qrac.js} +102 -8
- package/dist/schema-yLuBWWsh.js +130 -0
- package/dist/scim/index.d.ts +2 -2
- package/dist/scim/index.js +1 -2
- package/dist/{scim-vFR1O5oG.js → scim-ClHtpyV3.js} +208 -76
- package/dist/{scopes-tvpa34ep.js → scopes-CUPSjo9q.js} +12 -7
- package/dist/server/index.d.ts +12 -143
- package/dist/server/index.js +12 -9
- package/dist/server-C3WXAHZj.js +453 -0
- package/dist/{server-types-DdqBwZN_.d.ts → server-types-CKQiCnON.d.ts} +51 -68
- package/dist/{sha256-BO0swRXL.js → sha256-D9ihqmvd.js} +8 -1
- package/dist/{shared-1uhI-e-b.js → shared-BAK8t4Uo.js} +20 -9
- package/dist/{shared-JhMeOsDF.js → shared-DvvFzYXe.js} +8 -9
- package/dist/signals-D3NcTKUS.js +32 -0
- package/dist/sink-4-eQIRWf.d.ts +225 -0
- package/dist/sink-BEZSlMS_.js +957 -0
- package/dist/{skills-BZdRQkxs.js → skills-B6lVdD_W.js} +13 -6
- package/dist/skills-CTYwkl44.js +51 -0
- package/dist/snapshot-B7DkYg6g.js +269 -0
- package/dist/{snapshot-cache-Cod40D-X.js → snapshot-cache-DZHQ0KF6.js} +11 -5
- package/dist/{snapshot-cache-J5T7t_vD.d.ts → snapshot-cache-PXI-vGpY.d.ts} +7 -5
- package/dist/solid/index.d.ts +11 -12
- package/dist/solid/index.js +7 -7
- package/dist/solid-start/index.d.ts +52 -0
- package/dist/solid-start/index.js +49 -0
- package/dist/{sources-Dljy06zL.d.ts → sources-Xc4zkszI.d.ts} +7 -13
- package/dist/{sources-B1-b-R0t.js → sources-vs5dGOsS.js} +125 -119
- package/dist/{sql-t8teWOfo.js → sql-B5T1IL83.js} +13 -1
- package/dist/src-Cu2m75uo.js +1860 -0
- package/dist/ssf/index.d.ts +4 -4
- package/dist/ssf/index.js +384 -47
- package/dist/standard-webhooks-DgFFD-Ga.js +228 -0
- package/dist/standard-webhooks-rbD7LS6h.d.ts +88 -0
- package/dist/storage-C2bWdvJH.js +132 -0
- package/dist/{store-ILkLUj_o.js → store-BDutJkDL.js} +40 -53
- package/dist/{store-options-CbUHDoSe.js → store-options-u0ycEe8s.js} +26 -21
- package/dist/{stores-Cxz_80g-.d.ts → stores-BUGNbJTt.d.ts} +7 -8
- package/dist/{stores-BHXdSbw9.js → stores-CGhM8BN_.js} +2 -2
- package/dist/{stream-Dwsg6WwE.d.ts → stream-CeCMJmBB.d.ts} +2 -2
- package/dist/{stream-BMui98KK.js → stream-CvdUS9V1.js} +9 -2
- package/dist/style-DiKWnAvn.js +1 -0
- package/dist/{style-CTm1AXDT.js → style-Uao76wO7.js} +3 -2
- package/dist/subject-BGoM5o8B.js +17 -0
- package/dist/supabase/index.d.ts +23 -106
- package/dist/supabase/index.js +5 -4
- package/dist/supabase/middleware.d.ts +7 -6
- package/dist/supabase/middleware.js +13 -11
- package/dist/supabase-By_frk3U.js +92 -0
- package/dist/{supabase-hook-Cva3ikXz.js → supabase-hook-BMoEhZir.js} +960 -64
- package/dist/supabase-hook-CCw5m35C.js +1 -0
- package/dist/{supabase-C1TWlnYt.js → supabase-x5JtR2tc.js} +99 -206
- package/dist/support-session-C6xJQYut.js +158 -0
- package/dist/svelte/Protected.svelte +4 -4
- package/dist/svelte/index.d.ts +7 -7
- package/dist/svelte/index.js +10 -10
- package/dist/svelte/runtime.d.ts +3 -3
- package/dist/svelte/runtime.js +3 -3
- package/dist/svelte/source.d.ts +7 -7
- package/dist/svelte/source.js +4 -4
- package/dist/sveltekit/index.d.ts +51 -0
- package/dist/sveltekit/index.js +27 -0
- package/dist/tanstack-start/index.d.ts +51 -0
- package/dist/tanstack-start/index.js +40 -0
- package/dist/target-Bw37TFNA.js +51 -0
- package/dist/{tenancy-DshjqY0n.js → tenancy-DN2QAx9z.js} +5 -5
- package/dist/terminal/index.d.ts +11 -9
- package/dist/terminal/index.js +23 -287
- package/dist/testing/index.d.ts +311 -38
- package/dist/testing/index.js +3475 -201
- package/dist/testing/saas/index.d.ts +9 -8
- package/dist/testing/saas/index.js +2 -2
- package/dist/testing/saas/permissions.d.ts +1 -1
- package/dist/testing/saas/permissions.js +1 -2
- package/dist/text-BMFRfBqc.js +8 -0
- package/dist/{text-diff-BdkkYSbi.js → text-diff-BQcUapOb.js} +1 -1
- package/dist/thenable-yD7SabqG.js +31 -0
- package/dist/time-DkWjdL98.js +71 -0
- package/dist/{token-Bx9qy30p.js → token-BLZcjQgt.js} +15 -6
- package/dist/{tool-refusal-CQ7OEia9.js → tool-refusal-CMLN5xhn.js} +2 -2
- package/dist/trpc/index.d.ts +12 -9
- package/dist/trpc/index.js +16 -14
- package/dist/types-8RnwUAvE.d.ts +107 -0
- package/dist/{store-9KO4BlkB.d.ts → types-B3_ooZgZ.d.ts} +100 -75
- package/dist/{types-Br9IXUBG.d.ts → types-BdtSDbBO.d.ts} +77 -17
- package/dist/types-BtHtcKMr.d.ts +157 -0
- package/dist/{types-CqrjB9o6.d.ts → types-BzzaHxt3.d.ts} +23 -11
- package/dist/types-C791HFu9.d.ts +332 -0
- package/dist/types-C863OQiR.d.ts +57 -0
- package/dist/{types-ByUo56un.d.ts → types-CVZSNocA.d.ts} +23 -22
- package/dist/{types-DHrmBJLH.d.ts → types-CX7AvRqP.d.ts} +7 -7
- package/dist/types-C_IiEs64.d.ts +65 -0
- package/dist/{types-7rJVLWe5.d.ts → types-Dfv0aTER.d.ts} +63 -11
- package/dist/types-DqzsnlSA.js +67 -0
- package/dist/{types-DpWfQdSh.d.ts → types-Druu9wLM.d.ts} +46 -11
- package/dist/{types-CIlTojhq.d.ts → types-_WhUP7ud.d.ts} +9 -6
- package/dist/{types-CUcFZfpU.d.ts → types-lUlG3TVd.d.ts} +2 -1
- package/dist/unplugin/index.d.ts +1 -1
- package/dist/unplugin/index.js +2 -2
- package/dist/usage-CRVl9V3t.js +32 -0
- package/dist/usage-CZpSQP6L.js +1 -0
- package/dist/{usage-CG9nOYZw.js → usage-SveTRTyr.js} +54 -11
- package/dist/{validation-error-BSSw0l_8.d.ts → validation-error-DHUrAkku.d.ts} +1 -1
- package/dist/{validity-dVrUEPJt.js → validity-CZ7-y0Cj.js} +32 -15
- package/dist/{verifier-DMr_Zmb_.js → verifier-DHuh-okk.js} +18 -7
- package/dist/{verify-BztUB3GX.js → verify-BaAKx7t6.js} +645 -50
- package/dist/{version-BEogC-rB.js → version-CEbQ5UeM.js} +4 -3
- package/dist/version-DXkYUISx.js +1 -0
- package/dist/{views-CJsrBS1f.js → views-DTIIO-oQ.js} +22 -5
- package/dist/{permission-types-Dg39z9Kv.d.ts → vocabulary-CN8H_9UF.d.ts} +67 -2
- package/dist/vue/index.d.ts +9 -10
- package/dist/vue/index.js +8 -8
- package/dist/waiter-B986w1oK.d.ts +36 -0
- package/dist/waiter-BGUtGYoU.js +67 -0
- package/dist/watch--ovlPOc0.js +1 -0
- package/dist/{watch-zeucB7eF.js → watch-vea54PRw.js} +44 -5
- package/dist/webmcp/index.d.ts +2 -2
- package/dist/webmcp/index.js +3 -3
- package/dist/where-scope-C9vfEphl.js +306 -0
- package/dist/who-can-DWBAcaCQ.js +364 -0
- package/dist/wire-delegation-Cv3W2eaM.js +36 -0
- package/dist/wire-denial-C7PaVYEM.js +27 -0
- package/dist/workflow/index.d.ts +5 -0
- package/dist/workflow/index.js +223 -0
- package/dist/workflow-sdk/index.d.ts +56 -0
- package/dist/workflow-sdk/index.js +78 -0
- package/dist/{wrap-Cr93qqdP.d.ts → wrap-C5jC6sKI.d.ts} +2 -1
- package/dist/{wrap-DWsU_5Bd.js → wrap-gX61EtpB.js} +7 -6
- package/package.json +136 -37
- package/schemas/access-event-v1.json +118 -0
- package/schemas/approval-request-v1.json +34 -1
- package/schemas/approval-signature-v1.json +94 -0
- package/schemas/automation-event-v1.json +113 -0
- package/schemas/capability-v1.json +84 -0
- package/schemas/catalog-event-v1.json +87 -0
- package/schemas/catalog-v1.json +123 -12
- package/schemas/cli-commands-v1.json +164 -0
- package/schemas/cli-result-v1.json +96 -0
- package/schemas/cloud-api-v1.json +5407 -0
- package/schemas/connector-v1.json +408 -0
- package/schemas/credential-event-v1.json +81 -0
- package/schemas/credential-v1.json +134 -0
- package/schemas/decision-event-v1.json +288 -0
- package/schemas/delivery-event-v1.json +117 -0
- package/schemas/directory-event-v1.json +85 -0
- package/schemas/evidence-export-v1.json +54 -0
- package/schemas/membership-event-v1.json +93 -0
- package/schemas/policy-v1.json +68 -0
- package/schemas/pushed-policy-v1.json +236 -0
- package/schemas/run-v1.json +162 -0
- package/schemas/snapshot-v1.json +138 -0
- package/schemas/supabase-claims-v1.json +4 -4
- package/schemas/supabase-manifest-v1.json +5 -1
- package/schemas/support-session-v1.json +111 -0
- package/skills/permdock/SKILL.md +16 -12
- package/skills/permdock-agents/SKILL.md +40 -23
- package/skills/permdock-agents/references/operations-automations-chat.md +221 -0
- package/skills/permdock-agents/references/runtimes.md +22 -18
- package/skills/permdock-approvals/SKILL.md +29 -13
- package/skills/permdock-approvals/references/delivery-and-waiters.md +172 -0
- package/skills/permdock-approvals/references/stores-and-resume.md +21 -7
- package/skills/permdock-audit/SKILL.md +3 -3
- package/skills/permdock-credentials/SKILL.md +5 -5
- package/skills/permdock-credentials/references/tokens-keys-links.md +14 -10
- package/skills/permdock-data/SKILL.md +6 -6
- package/skills/permdock-data/references/queries-and-rls.md +10 -9
- package/skills/permdock-data/references/relationships.md +3 -3
- package/skills/permdock-tenancy/SKILL.md +20 -7
- package/skills/permdock-tenancy/references/contacts-and-support-sessions.md +122 -0
- package/skills/permdock-tenancy/references/ownership-and-custom-roles.md +6 -4
- package/skills/permdock-wire/SKILL.md +17 -11
- package/skills/permdock-wire/references/adapters.md +139 -51
- package/skills/permdock-wire/references/policy-options.md +5 -5
- package/skills/permdock-wire/references/presets-and-recipes.md +58 -0
- package/dist/approvals-DZL76lKW.js +0 -240
- package/dist/arazzo-CD8d0WLb.js +0 -54
- package/dist/catalog-6yWAX6Ps.js +0 -2
- package/dist/catalog-WHG4kBq7.js +0 -48
- package/dist/cloud-C7bSDgX4.js +0 -50
- package/dist/cloud-PeBN3IEn.js +0 -118
- package/dist/collect-Bw2Jdq1q.js +0 -2
- package/dist/collect-CQx4hX4N.js +0 -83
- package/dist/commands-Cpip4ULx.js +0 -97
- package/dist/config-DLt6BvV7.js +0 -36
- package/dist/diff-Cnghh_Ip.js +0 -48
- package/dist/doctor-CuVJvhV_.js +0 -53
- package/dist/duration-xK2jGFVc.js +0 -25
- package/dist/errors-CWfoNg9N.js +0 -47
- package/dist/errors-DRnGZHzF.js +0 -30
- package/dist/expiry-BoBJ8Tvc.js +0 -7
- package/dist/fields-fwfXN01n.js +0 -1016
- package/dist/headers-BZSDieNT.js +0 -6
- package/dist/headers-Cf-zWvsO.d.ts +0 -6
- package/dist/ids-DC4V4CFu.js +0 -18
- package/dist/index-DgM7w96K.d.ts +0 -6
- package/dist/index-Dz7didpC.d.ts +0 -201
- package/dist/index-UdVQgq48.d.ts +0 -550
- package/dist/load-B_shHrmd.js +0 -2
- package/dist/manifest-BngWKryL.js +0 -770
- package/dist/may-use-BOn_dR_w.js +0 -78
- package/dist/openapi-DcQ1Kg40.js +0 -164
- package/dist/ownership-BgnbOJFT.js +0 -851
- package/dist/permdock-L26udHSk.js +0 -3646
- package/dist/powersync-BFSbSElQ.js +0 -62
- package/dist/powersync-DCDgZgfZ.js +0 -2
- package/dist/rls-55DQTuf5.js +0 -250
- package/dist/run-DMcNW_8T.js +0 -174
- package/dist/server-ZYEHtNHS.js +0 -268
- package/dist/sink-BTtmfPnE.js +0 -141
- package/dist/sink-CPN4zLfs.d.ts +0 -104
- package/dist/skills-Dle4ZoLF.js +0 -56
- package/dist/snapshot-Dc9CHPME.js +0 -1078
- package/dist/src-Bb7no-hS.js +0 -639
- package/dist/subject-C6dLxqHU.js +0 -24
- package/dist/supabase-Dbqr141s.js +0 -83
- package/dist/supabase-hook-BULg7Ut_.js +0 -2
- package/dist/thenable-QSmvt-vZ.js +0 -65
- package/dist/types-C0dee0Qf.d.ts +0 -197
- package/dist/types-DvupZE0w.d.ts +0 -9
- package/dist/usage-4G6t643F.js +0 -42
- package/dist/usage-iFLJ0-rr.js +0 -2
- package/dist/vocabulary-hhEFLFoL.d.ts +0 -65
- package/dist/watch-C8TpsAl4.js +0 -2
|
@@ -0,0 +1,403 @@
|
|
|
1
|
+
import { r as isRecord, t as compact } from "./compact-CAf557ZB.js";
|
|
2
|
+
import { n as freezeDeep } from "./freeze-CrU8nQeX.js";
|
|
3
|
+
import { i as dateAt, p as nowSeconds } from "./time-DkWjdL98.js";
|
|
4
|
+
import { s as policyDocumentFromClaims } from "./hosted-B46-5LYE.js";
|
|
5
|
+
import { l as isApprovalErrorCode, s as ApprovalError, t as APPROVAL_HEADER } from "./types-DqzsnlSA.js";
|
|
6
|
+
import { h as toCloudEvent, l as isAbsoluteUri } from "./sink-BEZSlMS_.js";
|
|
7
|
+
import { n as parseCatalogEventData, t as catalogFingerprint } from "./catalog-fingerprint-CCP0-yQS.js";
|
|
8
|
+
import { t as parseApprovalRequest } from "./parse-request-D_tUXG6M.js";
|
|
9
|
+
import { t as timeoutSignal } from "./timeout-D51niuQP.js";
|
|
10
|
+
//#region src/cloud/approver.ts
|
|
11
|
+
const APPROVER_HEADER = "PermDock-Approver";
|
|
12
|
+
/** The RFC 9396 `authorization_details` type that binds an approver token to one verdict. */
|
|
13
|
+
const APPROVAL_DETAIL_TYPE = "permdock_approval";
|
|
14
|
+
/** Seconds an approver token lives: it proves one resolve call, and the Cloud refuses a replayed `jti`. */
|
|
15
|
+
const APPROVER_TTL = 60;
|
|
16
|
+
async function facts(read, request, verdict, fallback) {
|
|
17
|
+
if (read === void 0) return fallback ?? [];
|
|
18
|
+
try {
|
|
19
|
+
return (await read(request, verdict.by)).filter((item) => typeof item === "string");
|
|
20
|
+
} catch {
|
|
21
|
+
return [];
|
|
22
|
+
}
|
|
23
|
+
}
|
|
24
|
+
function unauthenticated(detail) {
|
|
25
|
+
return new ApprovalError("approver-unauthenticated", detail);
|
|
26
|
+
}
|
|
27
|
+
/** A rejection only denies, so the Cloud takes a `system` one without an approver token. */
|
|
28
|
+
function isSystemRejection(verdict) {
|
|
29
|
+
return verdict.status === "rejected" && verdict.by.actor?.kind === "system";
|
|
30
|
+
}
|
|
31
|
+
/**
|
|
32
|
+
* The `PermDock-Approver` header for `verdict`: an RFC 9068 `at+jwt` whose
|
|
33
|
+
* `sub` is the approver, signed by `options.signer` for `<issuer>/approvals`,
|
|
34
|
+
* with a fresh `jti` and one `permdock_approval` authorization detail naming
|
|
35
|
+
* the request id, the verdict status, `vouched`, and the approver's
|
|
36
|
+
* `permissions` and `relations`. With the `roles`, `memberships` and `tenant`
|
|
37
|
+
* claims they are the only facts the Cloud checks a request's `approvers`
|
|
38
|
+
* against in bring-your-own mode. `target` runs only after the
|
|
39
|
+
* approver checks pass. Throws an `ApprovalError` before any resolve when the
|
|
40
|
+
* approver cannot be proven: no signer, no principal, an actor, a failed
|
|
41
|
+
* lookup or a signer failure.
|
|
42
|
+
*/
|
|
43
|
+
async function approverHeaders(verdict, options, issuer, target) {
|
|
44
|
+
if (isSystemRejection(verdict)) return {};
|
|
45
|
+
if (verdict.by.actor !== void 0) throw new ApprovalError("approver-not-eligible", "PermDock Cloud: a person approves; a verdict with an actor has no approver token");
|
|
46
|
+
const principal = verdict.by.principal;
|
|
47
|
+
if (principal === null || principal.id === "") throw unauthenticated("PermDock Cloud: the approver has no principal id");
|
|
48
|
+
if (options === void 0) throw unauthenticated("PermDock Cloud: cloud() needs approver.signer to prove who resolves an approval");
|
|
49
|
+
const { request, etag } = await target();
|
|
50
|
+
const permissions = await facts(options.permissions, request, verdict, verdict.permissions);
|
|
51
|
+
const relations = await facts(options.relations, request, verdict, verdict.relations);
|
|
52
|
+
const issuedAt = nowSeconds();
|
|
53
|
+
try {
|
|
54
|
+
const token = await options.signer.sign({
|
|
55
|
+
sub: principal.id,
|
|
56
|
+
roles: principal.roles,
|
|
57
|
+
...principal.memberships === void 0 ? {} : { memberships: principal.memberships },
|
|
58
|
+
...principal.tenant === void 0 ? {} : { tenant: principal.tenant },
|
|
59
|
+
authorization_details: [{
|
|
60
|
+
type: APPROVAL_DETAIL_TYPE,
|
|
61
|
+
id: request.id,
|
|
62
|
+
status: verdict.status,
|
|
63
|
+
permissions,
|
|
64
|
+
relations,
|
|
65
|
+
...etag === void 0 ? {} : { etag },
|
|
66
|
+
...verdict.vouched === void 0 ? {} : { vouched: verdict.vouched }
|
|
67
|
+
}]
|
|
68
|
+
}, {
|
|
69
|
+
typ: "at+jwt",
|
|
70
|
+
audience: options.audience ?? `${issuer}/approvals`,
|
|
71
|
+
issuedAt,
|
|
72
|
+
expiresAt: issuedAt + APPROVER_TTL,
|
|
73
|
+
jti: globalThis.crypto.randomUUID()
|
|
74
|
+
});
|
|
75
|
+
return { [APPROVER_HEADER]: token };
|
|
76
|
+
} catch {
|
|
77
|
+
throw unauthenticated("PermDock Cloud: the approver signer failed");
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
//#endregion
|
|
81
|
+
//#region src/cloud/request.ts
|
|
82
|
+
/** Milliseconds a PermDock Cloud request may take; a slower one fails like an unreachable Cloud. */
|
|
83
|
+
const CLOUD_TIMEOUT_MS = 1e4;
|
|
84
|
+
function readEnv(name) {
|
|
85
|
+
const value = globalThis.process?.env?.[name];
|
|
86
|
+
return typeof value === "string" ? value : "";
|
|
87
|
+
}
|
|
88
|
+
function firstNonEmpty(...values) {
|
|
89
|
+
for (const value of values) if (value !== void 0 && value !== "") return value;
|
|
90
|
+
return "";
|
|
91
|
+
}
|
|
92
|
+
function trimSlash(value) {
|
|
93
|
+
return value.endsWith("/") ? value.slice(0, -1) : value;
|
|
94
|
+
}
|
|
95
|
+
/**
|
|
96
|
+
* The environment URL and JWK Set URL `cloud()` uses, resolved with the same
|
|
97
|
+
* fallbacks (`PERMDOCK_CLOUD_URL`; `PERMDOCK_CLOUD_ENV`, `VERCEL_ENV`, `production`).
|
|
98
|
+
*/
|
|
99
|
+
function cloudEndpoints(options = {}) {
|
|
100
|
+
const url = trimSlash(firstNonEmpty(options.url, readEnv("PERMDOCK_CLOUD_URL")));
|
|
101
|
+
if (url === "") throw new Error("PermDock: cloud() requires url and key.");
|
|
102
|
+
const environment = firstNonEmpty(options.environment, readEnv("PERMDOCK_CLOUD_ENV"), readEnv("VERCEL_ENV"), "production");
|
|
103
|
+
const issuer = `${url}/v1/environments/${encodeURIComponent(environment)}`;
|
|
104
|
+
return Object.freeze({
|
|
105
|
+
issuer,
|
|
106
|
+
jwks: `${issuer}/.well-known/jwks.json`
|
|
107
|
+
});
|
|
108
|
+
}
|
|
109
|
+
/** The authenticated connection every `permdock/cloud` client shares. Throws without a URL or key. */
|
|
110
|
+
function cloudConnection(options) {
|
|
111
|
+
const key = firstNonEmpty(options.key, readEnv("PERMDOCK_CLOUD_KEY"));
|
|
112
|
+
if (key === "") throw new Error("PermDock: cloud() requires url and key.");
|
|
113
|
+
const endpoints = cloudEndpoints(options);
|
|
114
|
+
const fetchFn = options.fetch ?? globalThis.fetch.bind(globalThis);
|
|
115
|
+
const request = (path, init = {}, accept, contentType) => {
|
|
116
|
+
const headers = new Headers();
|
|
117
|
+
headers.set("authorization", `Bearer ${key}`);
|
|
118
|
+
headers.set("content-type", "application/json");
|
|
119
|
+
for (const [name, value] of new Headers(init.headers)) headers.set(name, value);
|
|
120
|
+
if (accept !== void 0) headers.set("accept", accept);
|
|
121
|
+
if (contentType !== void 0) headers.set("content-type", contentType);
|
|
122
|
+
return fetchFn(`${endpoints.issuer}${path}`, {
|
|
123
|
+
...init,
|
|
124
|
+
headers,
|
|
125
|
+
signal: timeoutSignal(CLOUD_TIMEOUT_MS, init.signal)
|
|
126
|
+
});
|
|
127
|
+
};
|
|
128
|
+
return Object.freeze({
|
|
129
|
+
...endpoints,
|
|
130
|
+
request
|
|
131
|
+
});
|
|
132
|
+
}
|
|
133
|
+
/** `true` for a compact JWS: three dot-separated parts, not JSON. */
|
|
134
|
+
function isCompactJws(value) {
|
|
135
|
+
return !value.startsWith("{") && value.split(".").length === 3;
|
|
136
|
+
}
|
|
137
|
+
//#endregion
|
|
138
|
+
//#region src/cloud/create.ts
|
|
139
|
+
/** Carries the `at+jwt` that names the subject of `GET /snapshot`. */
|
|
140
|
+
const SUBJECT_HEADER = "PermDock-Subject";
|
|
141
|
+
function catalogPushOf(value) {
|
|
142
|
+
if (!isRecord(value) || !Number.isSafeInteger(value["version"]) || typeof value["fingerprint"] !== "string") return null;
|
|
143
|
+
const version = Number(value["version"]);
|
|
144
|
+
const fingerprint = value["fingerprint"];
|
|
145
|
+
if (value["unchanged"] === true) return {
|
|
146
|
+
version,
|
|
147
|
+
fingerprint,
|
|
148
|
+
unchanged: true
|
|
149
|
+
};
|
|
150
|
+
const data = parseCatalogEventData({
|
|
151
|
+
kind: "drift",
|
|
152
|
+
fingerprint,
|
|
153
|
+
findings: value["findings"]
|
|
154
|
+
});
|
|
155
|
+
return data?.findings === void 0 ? null : {
|
|
156
|
+
version,
|
|
157
|
+
fingerprint,
|
|
158
|
+
findings: data.findings
|
|
159
|
+
};
|
|
160
|
+
}
|
|
161
|
+
function asApproval(value) {
|
|
162
|
+
if (!isRecord(value) || value["v"] !== 1 || typeof value["token"] !== "string") return null;
|
|
163
|
+
return value;
|
|
164
|
+
}
|
|
165
|
+
/** The refusal PermDock Cloud names in its body, else the one its status implies. */
|
|
166
|
+
async function approvalErrorFrom(response) {
|
|
167
|
+
let body;
|
|
168
|
+
try {
|
|
169
|
+
body = await response.json();
|
|
170
|
+
} catch {
|
|
171
|
+
return approvalErrorFromStatus(response.status);
|
|
172
|
+
}
|
|
173
|
+
if (body === null || typeof body !== "object" || !("code" in body)) return approvalErrorFromStatus(response.status);
|
|
174
|
+
const code = body.code;
|
|
175
|
+
if (!isApprovalErrorCode(code)) return approvalErrorFromStatus(response.status);
|
|
176
|
+
const detail = "detail" in body ? body.detail : void 0;
|
|
177
|
+
return new ApprovalError(code, typeof detail === "string" && detail.length > 0 ? detail : code);
|
|
178
|
+
}
|
|
179
|
+
function approvalErrorFromStatus(status) {
|
|
180
|
+
if (status === 409) return new ApprovalError("approval-not-pending", "approval is not pending");
|
|
181
|
+
if (status === 410) return new ApprovalError("approval-expired", "approval has expired");
|
|
182
|
+
return new ApprovalError("approval-not-found", "approval was not found");
|
|
183
|
+
}
|
|
184
|
+
function cloud(options = {}) {
|
|
185
|
+
const { issuer: root, jwks, request } = cloudConnection(options);
|
|
186
|
+
const flushAt = options.flushAt ?? 32;
|
|
187
|
+
const waitUntil = options.waitUntil;
|
|
188
|
+
const approvals = {
|
|
189
|
+
async create(record) {
|
|
190
|
+
if (!(await request("/approvals", {
|
|
191
|
+
method: "POST",
|
|
192
|
+
body: JSON.stringify(record)
|
|
193
|
+
})).ok) throw new Error("PermDock Cloud rejected the approval create");
|
|
194
|
+
},
|
|
195
|
+
async get(token) {
|
|
196
|
+
try {
|
|
197
|
+
const response = await request("/approvals/by-token", { headers: { [APPROVAL_HEADER]: token } });
|
|
198
|
+
if (!response.ok) return null;
|
|
199
|
+
return asApproval(await response.json());
|
|
200
|
+
} catch {
|
|
201
|
+
return null;
|
|
202
|
+
}
|
|
203
|
+
},
|
|
204
|
+
async getById(id) {
|
|
205
|
+
try {
|
|
206
|
+
const response = await request(`/approvals/${encodeURIComponent(id)}`);
|
|
207
|
+
if (!response.ok) return null;
|
|
208
|
+
return asApproval(await response.json());
|
|
209
|
+
} catch {
|
|
210
|
+
return null;
|
|
211
|
+
}
|
|
212
|
+
},
|
|
213
|
+
async resolve(token, verdict) {
|
|
214
|
+
const approver = await approverHeaders(verdict, options.approver, root, async () => {
|
|
215
|
+
const response = await request("/approvals/by-token", { headers: { [APPROVAL_HEADER]: token } });
|
|
216
|
+
if (!response.ok) throw await approvalErrorFrom(response);
|
|
217
|
+
const found = parseApprovalRequest(await response.json());
|
|
218
|
+
if (found === null) throw new ApprovalError("approval-not-found", "PermDock Cloud returned an unknown approval shape");
|
|
219
|
+
const etag = response.headers.get("etag");
|
|
220
|
+
return etag === null ? { request: found } : {
|
|
221
|
+
request: found,
|
|
222
|
+
etag
|
|
223
|
+
};
|
|
224
|
+
});
|
|
225
|
+
const response = await request("/approvals/by-token/resolve", {
|
|
226
|
+
method: "POST",
|
|
227
|
+
headers: {
|
|
228
|
+
[APPROVAL_HEADER]: token,
|
|
229
|
+
...approver
|
|
230
|
+
},
|
|
231
|
+
body: JSON.stringify(verdict)
|
|
232
|
+
});
|
|
233
|
+
if (!response.ok) throw await approvalErrorFrom(response);
|
|
234
|
+
const parsed = asApproval(await response.json());
|
|
235
|
+
if (parsed === null) throw new ApprovalError("approval-not-found", "PermDock Cloud returned an unknown approval shape");
|
|
236
|
+
return parsed;
|
|
237
|
+
},
|
|
238
|
+
async consume(token, now) {
|
|
239
|
+
try {
|
|
240
|
+
const response = await request("/approvals/by-token/consume", {
|
|
241
|
+
method: "POST",
|
|
242
|
+
headers: { [APPROVAL_HEADER]: token },
|
|
243
|
+
body: JSON.stringify(compact({ now: now === void 0 ? void 0 : dateAt(now).toISOString() }))
|
|
244
|
+
});
|
|
245
|
+
if (!response.ok) return null;
|
|
246
|
+
return asApproval(await response.json());
|
|
247
|
+
} catch {
|
|
248
|
+
return null;
|
|
249
|
+
}
|
|
250
|
+
},
|
|
251
|
+
async list(query) {
|
|
252
|
+
const params = new URLSearchParams(compact({
|
|
253
|
+
status: query.status,
|
|
254
|
+
principalId: query.principalId,
|
|
255
|
+
actorId: query.actorId,
|
|
256
|
+
tenant: query.tenant,
|
|
257
|
+
session: query.session,
|
|
258
|
+
limit: query.limit === void 0 ? void 0 : String(query.limit),
|
|
259
|
+
cursor: query.cursor
|
|
260
|
+
}));
|
|
261
|
+
const suffix = params.size === 0 ? "" : `?${params.toString()}`;
|
|
262
|
+
try {
|
|
263
|
+
const response = await request(`/approvals${suffix}`);
|
|
264
|
+
if (!response.ok) return { items: [] };
|
|
265
|
+
const body = await response.json();
|
|
266
|
+
if (!isRecord(body) || !Array.isArray(body["items"])) return { items: [] };
|
|
267
|
+
const items = body["items"].flatMap((item) => {
|
|
268
|
+
const parsed = asApproval(item);
|
|
269
|
+
return parsed === null ? [] : [parsed];
|
|
270
|
+
});
|
|
271
|
+
return typeof body["next"] === "string" && body["next"] !== "" ? {
|
|
272
|
+
items,
|
|
273
|
+
next: body["next"]
|
|
274
|
+
} : { items };
|
|
275
|
+
} catch {
|
|
276
|
+
return { items: [] };
|
|
277
|
+
}
|
|
278
|
+
},
|
|
279
|
+
async cancel(filter, meta) {
|
|
280
|
+
const response = await request("/approvals/cancel", {
|
|
281
|
+
method: "POST",
|
|
282
|
+
body: JSON.stringify(compact({
|
|
283
|
+
filter,
|
|
284
|
+
by: meta.by,
|
|
285
|
+
note: meta.note
|
|
286
|
+
}))
|
|
287
|
+
});
|
|
288
|
+
if (!response.ok) throw new Error("PermDock Cloud rejected the approval cancel");
|
|
289
|
+
const body = await response.json();
|
|
290
|
+
if (!isRecord(body) || typeof body["cancelled"] !== "number") throw new Error("PermDock Cloud returned an unknown cancel shape");
|
|
291
|
+
return body["cancelled"];
|
|
292
|
+
},
|
|
293
|
+
async expire(now) {
|
|
294
|
+
try {
|
|
295
|
+
const response = await request("/approvals/expire", {
|
|
296
|
+
method: "POST",
|
|
297
|
+
body: JSON.stringify(compact({ now: now === void 0 ? void 0 : dateAt(now).toISOString() }))
|
|
298
|
+
});
|
|
299
|
+
if (!response.ok) return 0;
|
|
300
|
+
const body = await response.json();
|
|
301
|
+
if (!isRecord(body) || typeof body["expired"] !== "number") return 0;
|
|
302
|
+
return body["expired"];
|
|
303
|
+
} catch {
|
|
304
|
+
return 0;
|
|
305
|
+
}
|
|
306
|
+
}
|
|
307
|
+
};
|
|
308
|
+
const capacity = options.capacity ?? 1e4;
|
|
309
|
+
const source = options.source ?? root;
|
|
310
|
+
if (!isAbsoluteUri(source)) throw new TypeError("PermDock: cloud() source is an absolute URI");
|
|
311
|
+
const pending = [];
|
|
312
|
+
const bound = () => {
|
|
313
|
+
if (pending.length > capacity) pending.splice(0, pending.length - capacity);
|
|
314
|
+
};
|
|
315
|
+
const flush = async () => {
|
|
316
|
+
if (pending.length === 0) return;
|
|
317
|
+
const events = pending.splice(0);
|
|
318
|
+
try {
|
|
319
|
+
if (!(await request("/decisions", {
|
|
320
|
+
method: "POST",
|
|
321
|
+
body: JSON.stringify(events.map((event) => toCloudEvent(event, { source })))
|
|
322
|
+
}, void 0, "application/cloudevents-batch+json")).ok) pending.unshift(...events);
|
|
323
|
+
} catch {
|
|
324
|
+
pending.unshift(...events);
|
|
325
|
+
}
|
|
326
|
+
bound();
|
|
327
|
+
};
|
|
328
|
+
const sink = {
|
|
329
|
+
write(events) {
|
|
330
|
+
pending.push(...events);
|
|
331
|
+
bound();
|
|
332
|
+
if (pending.length >= flushAt) return flush();
|
|
333
|
+
if (waitUntil !== void 0 && pending.length > 0) waitUntil(flush());
|
|
334
|
+
},
|
|
335
|
+
flush
|
|
336
|
+
};
|
|
337
|
+
const snapshotsFor = (subject) => ({ async get() {
|
|
338
|
+
const response = await request("/snapshot", { headers: { [SUBJECT_HEADER]: subject } }, "application/jwt");
|
|
339
|
+
if (!response.ok) throw new Error("PermDock Cloud snapshot request failed");
|
|
340
|
+
const text = (await response.text()).trim();
|
|
341
|
+
if (!isCompactJws(text)) throw new Error("PermDock Cloud served an unsigned snapshot");
|
|
342
|
+
return text;
|
|
343
|
+
} });
|
|
344
|
+
let document = null;
|
|
345
|
+
return freezeDeep({
|
|
346
|
+
approvals,
|
|
347
|
+
sink,
|
|
348
|
+
snapshotsFor,
|
|
349
|
+
policies: {
|
|
350
|
+
current() {
|
|
351
|
+
return document;
|
|
352
|
+
},
|
|
353
|
+
async refresh() {
|
|
354
|
+
const verifier = options.verifier;
|
|
355
|
+
if (verifier === void 0) return;
|
|
356
|
+
let response;
|
|
357
|
+
try {
|
|
358
|
+
response = await request("/policy");
|
|
359
|
+
} catch {
|
|
360
|
+
return;
|
|
361
|
+
}
|
|
362
|
+
if (response.status === 404) {
|
|
363
|
+
document = null;
|
|
364
|
+
return;
|
|
365
|
+
}
|
|
366
|
+
if (!response.ok) return;
|
|
367
|
+
const token = (await response.text()).trim();
|
|
368
|
+
if (!isCompactJws(token)) return;
|
|
369
|
+
const verified = await verifier.verify(token, {
|
|
370
|
+
typ: "vnd.permdock.policy+jwt",
|
|
371
|
+
issuer: root,
|
|
372
|
+
audience: root
|
|
373
|
+
});
|
|
374
|
+
if (!verified.ok) return;
|
|
375
|
+
let next;
|
|
376
|
+
try {
|
|
377
|
+
next = policyDocumentFromClaims(verified.claims);
|
|
378
|
+
} catch {
|
|
379
|
+
return;
|
|
380
|
+
}
|
|
381
|
+
document = next;
|
|
382
|
+
}
|
|
383
|
+
},
|
|
384
|
+
catalog: { async push(value) {
|
|
385
|
+
const fingerprint = catalogFingerprint(value);
|
|
386
|
+
const response = await request("/catalog", {
|
|
387
|
+
method: "POST",
|
|
388
|
+
body: JSON.stringify({
|
|
389
|
+
fingerprint,
|
|
390
|
+
catalog: value
|
|
391
|
+
})
|
|
392
|
+
});
|
|
393
|
+
if (!response.ok) throw new Error(`PermDock Cloud rejected the catalog: HTTP ${String(response.status)}`);
|
|
394
|
+
const parsed = catalogPushOf(await response.json());
|
|
395
|
+
if (parsed === null) throw new Error("PermDock Cloud answered the catalog push in an unknown shape");
|
|
396
|
+
return parsed;
|
|
397
|
+
} },
|
|
398
|
+
issuer: root,
|
|
399
|
+
jwks
|
|
400
|
+
});
|
|
401
|
+
}
|
|
402
|
+
//#endregion
|
|
403
|
+
export { approverHeaders as a, isCompactJws as i, cloudConnection as n, cloudEndpoints as r, cloud as t };
|
|
@@ -1,15 +1,15 @@
|
|
|
1
1
|
import { t as compact } from "./compact-CAf557ZB.js";
|
|
2
2
|
import { n as freezeDeep } from "./freeze-CrU8nQeX.js";
|
|
3
|
-
import { n as problemDetails } from "./problem-details-
|
|
4
|
-
import { c as listPermissions } from "./permission-registry-
|
|
5
|
-
import { r as challengeScope } from "./permdock-L26udHSk.js";
|
|
3
|
+
import { n as problemDetails } from "./problem-details-cn5X30gZ.js";
|
|
4
|
+
import { c as listPermissions } from "./permission-registry-Br4jSNVi.js";
|
|
6
5
|
import { n as resourceRef } from "./resource-ref-CaS9yVPi.js";
|
|
6
|
+
import { c as withApp, i as challengeScope } from "./permdock-BrAscV28.js";
|
|
7
7
|
import { r as hasCredentials } from "./http-BBoKefeS.js";
|
|
8
|
-
import { i as decisionResponse, o as notFoundProblem, s as problemFromDecision, t as ANONYMOUS, u as unauthenticatedProblem } from "./problem-
|
|
9
|
-
import { n as resolveOrNull } from "./build-instance-
|
|
10
|
-
import { n as
|
|
11
|
-
import { n as tenantScope, t as actorFrom } from "./adapter-context-
|
|
12
|
-
import { n as requestContext, t as buildReportingInstance } from "./request-context-
|
|
8
|
+
import { i as decisionResponse, o as notFoundProblem, s as problemFromDecision, t as ANONYMOUS, u as unauthenticatedProblem } from "./problem-CTviyH5L.js";
|
|
9
|
+
import { n as resolveOrNull } from "./build-instance-Bu_eDqYw.js";
|
|
10
|
+
import { n as applyApprovalResume, o as evaluationsHandler, u as InvalidSignatureError } from "./evaluations-beAooV0n.js";
|
|
11
|
+
import { n as tenantScope, t as actorFrom } from "./adapter-context-CRhqyzCk.js";
|
|
12
|
+
import { n as requestContext, t as buildReportingInstance } from "./request-context-C81Pip9n.js";
|
|
13
13
|
//#region src/server/kernel-problems.ts
|
|
14
14
|
const NOT_DELEGATED = freezeDeep({
|
|
15
15
|
outcome: "denied",
|
|
@@ -89,7 +89,7 @@ async function refused(hook, fallback, decision, request, report) {
|
|
|
89
89
|
decision
|
|
90
90
|
};
|
|
91
91
|
const status = result.status;
|
|
92
|
-
if (typeof status !== "number" || status < 300) throw new TypeError(`PermDock:
|
|
92
|
+
if (typeof status !== "number" || status < 300) throw new TypeError(`PermDock: deniedResponse returned status ${String(status)}; a refusal keeps a status of 300 or more`);
|
|
93
93
|
return {
|
|
94
94
|
ok: false,
|
|
95
95
|
response: result instanceof Response ? result : new Response(JSON.stringify(result), {
|
|
@@ -112,11 +112,11 @@ async function guardOn(deps, instance, remote, report, request, permission, load
|
|
|
112
112
|
const credentials = request === void 0 ? false : hasCredentials(request);
|
|
113
113
|
if (permission === null) {
|
|
114
114
|
if (declared === void 0) throw new TypeError(request === void 0 ? "PermDock: protect(null) needs oauthScopes" : `PermDock: protect(null) needs oauthScopes, and no operation declares them for ${request.method} ${new URL(request.url).pathname}`);
|
|
115
|
-
if (instance.subject.principal === null) return refused(deps.options.
|
|
115
|
+
if (instance.subject.principal === null) return refused(deps.options.deniedResponse, unauthenticatedProblem(credentials), ANONYMOUS, request, report);
|
|
116
116
|
}
|
|
117
117
|
const { actor, delegation } = instance.subject;
|
|
118
118
|
const held = permission === null && (actor !== void 0 || delegation !== void 0) ? delegation?.scopes ?? [] : delegation?.scopes;
|
|
119
|
-
if (declared !== void 0 && held !== void 0 && !declared.some((granted) => held.includes(granted))) return refused(deps.options.
|
|
119
|
+
if (declared !== void 0 && held !== void 0 && !declared.some((granted) => held.includes(granted))) return refused(deps.options.deniedResponse, scopeProblem(permission, instance.subject, credentials, declared[0]), NOT_DELEGATED, request, report);
|
|
120
120
|
let data;
|
|
121
121
|
if (load !== void 0) {
|
|
122
122
|
let loaded;
|
|
@@ -124,7 +124,7 @@ async function guardOn(deps, instance, remote, report, request, permission, load
|
|
|
124
124
|
loaded = await load();
|
|
125
125
|
} catch (error) {
|
|
126
126
|
report(error);
|
|
127
|
-
return refused(deps.options.
|
|
127
|
+
return refused(deps.options.deniedResponse, loadFailedProblem(permission), LOAD_FAILED, request, report);
|
|
128
128
|
}
|
|
129
129
|
if (loaded === null || loaded === void 0) return {
|
|
130
130
|
ok: false,
|
|
@@ -138,7 +138,7 @@ async function guardOn(deps, instance, remote, report, request, permission, load
|
|
|
138
138
|
data
|
|
139
139
|
};
|
|
140
140
|
const decideOptions = compact({
|
|
141
|
-
|
|
141
|
+
call: "adapter",
|
|
142
142
|
adapter: deps.adapter,
|
|
143
143
|
field: protectOptions.field,
|
|
144
144
|
explain: protectOptions.explain,
|
|
@@ -162,7 +162,7 @@ async function guardOn(deps, instance, remote, report, request, permission, load
|
|
|
162
162
|
decision,
|
|
163
163
|
data
|
|
164
164
|
};
|
|
165
|
-
return refused(deps.options.
|
|
165
|
+
return refused(deps.options.deniedResponse, problemFromDecision(decision, permission, instance.subject, compact({
|
|
166
166
|
approval: deps.options.approval,
|
|
167
167
|
credentials,
|
|
168
168
|
scope: declared?.[0] ?? challengeScope(deps.policy, permission),
|
|
@@ -172,18 +172,17 @@ async function guardOn(deps, instance, remote, report, request, permission, load
|
|
|
172
172
|
//#endregion
|
|
173
173
|
//#region src/server/create.ts
|
|
174
174
|
async function resolveActor(request, options) {
|
|
175
|
-
return (options.webBotAuth === void 0 ? void 0 : await options.webBotAuth(request)) ?? actorFrom(options.actor, request);
|
|
175
|
+
return (options.webBotAuth === void 0 ? void 0 : await options.webBotAuth.verify(request)) ?? actorFrom(options.actor, request);
|
|
176
176
|
}
|
|
177
177
|
const NO_TENANT = "\0";
|
|
178
|
-
function createPermDock(policy, options) {
|
|
179
|
-
return createServerKernel(policy, options);
|
|
180
|
-
}
|
|
181
178
|
/**
|
|
182
|
-
* The
|
|
183
|
-
* once per `Request`; one instance is cached per `(Request, tenant)`,
|
|
184
|
-
* global middleware and a later tenant-scoped `protect` never share a
|
|
179
|
+
* The Fetch factory behind every HTTP adapter. The subject and actor are
|
|
180
|
+
* resolved once per `Request`; one instance is cached per `(Request, tenant)`,
|
|
181
|
+
* so a global middleware and a later tenant-scoped `protect` never share a
|
|
182
|
+
* tenant.
|
|
185
183
|
*/
|
|
186
|
-
function
|
|
184
|
+
function createPermDock(policy, given) {
|
|
185
|
+
const options = withApp(policy, given);
|
|
187
186
|
const adapter = options.adapter ?? "server";
|
|
188
187
|
const subjects = /* @__PURE__ */ new WeakMap();
|
|
189
188
|
const instances = /* @__PURE__ */ new WeakMap();
|
|
@@ -217,7 +216,7 @@ function createServerKernel(policy, options) {
|
|
|
217
216
|
context
|
|
218
217
|
},
|
|
219
218
|
errors,
|
|
220
|
-
wrap: options.wrap
|
|
219
|
+
wrap: (created) => options.wrap === void 0 ? created : options.wrap(created)
|
|
221
220
|
});
|
|
222
221
|
const remote = options.pdp === void 0 ? void 0 : await options.pdp(policy, user, built.options);
|
|
223
222
|
reporters.set(built.permdock, built.report);
|
|
@@ -243,7 +242,7 @@ function createServerKernel(policy, options) {
|
|
|
243
242
|
};
|
|
244
243
|
const connection = async (request, connectionOptions = {}, scope) => {
|
|
245
244
|
const { tenant } = scope ?? await tenantScope(options.tenant, request);
|
|
246
|
-
const { openConnection } = await import("./connection-
|
|
245
|
+
const { openConnection } = await import("./connection-DjhIJSs2.js");
|
|
247
246
|
return openConnection({
|
|
248
247
|
open: async () => (await build(request, { tenant })).permdock,
|
|
249
248
|
rebuild: async () => (await instanceFor(await freshSubject(request), tenant)).permdock,
|
|
@@ -253,9 +252,9 @@ function createServerKernel(policy, options) {
|
|
|
253
252
|
options: connectionOptions
|
|
254
253
|
});
|
|
255
254
|
};
|
|
256
|
-
const
|
|
255
|
+
const getPermDock = async (request, scope) => (await build(request, scope)).permdock;
|
|
257
256
|
const getSnapshot = async (request, query = {}) => {
|
|
258
|
-
return (await
|
|
257
|
+
return (await getPermDock(request, query.tenant === void 0 ? void 0 : { tenant: query.tenant })).snapshot(compact({
|
|
259
258
|
include: query.include,
|
|
260
259
|
tenants: query.tenants
|
|
261
260
|
}));
|
|
@@ -265,7 +264,7 @@ function createServerKernel(policy, options) {
|
|
|
265
264
|
options,
|
|
266
265
|
adapter
|
|
267
266
|
};
|
|
268
|
-
const protectRoute = (permission,
|
|
267
|
+
const protectRoute = (permission, data, protectOptions = {}) => {
|
|
269
268
|
if (permission === null && routeScopes(protectOptions.oauthScopes) === void 0 && options.operations === void 0) throw new TypeError("PermDock: protect(null) needs oauthScopes, in its options or an operations entry");
|
|
270
269
|
return async (request, scope) => {
|
|
271
270
|
let instance;
|
|
@@ -280,7 +279,7 @@ function createServerKernel(policy, options) {
|
|
|
280
279
|
};
|
|
281
280
|
throw error;
|
|
282
281
|
}
|
|
283
|
-
return guardOn(deps, instance, remote, report, request, permission,
|
|
282
|
+
return guardOn(deps, instance, remote, report, request, permission, data === void 0 ? void 0 : () => data(request), protectOptions);
|
|
284
283
|
};
|
|
285
284
|
};
|
|
286
285
|
const protect = protectRoute;
|
|
@@ -299,14 +298,14 @@ function createServerKernel(policy, options) {
|
|
|
299
298
|
} };
|
|
300
299
|
}
|
|
301
300
|
};
|
|
302
|
-
const permdockHandler = (scope) =>
|
|
301
|
+
const permdockHandler = (scope) => evaluationsHandler(compact({
|
|
303
302
|
policy,
|
|
304
|
-
resolve: scope === void 0 ?
|
|
303
|
+
resolve: scope === void 0 ? getPermDock : async (request) => getPermDock(request, await scope(request)),
|
|
305
304
|
store: options.store,
|
|
306
305
|
adapter
|
|
307
306
|
}));
|
|
308
307
|
return {
|
|
309
|
-
|
|
308
|
+
getPermDock,
|
|
310
309
|
getSnapshot,
|
|
311
310
|
protect,
|
|
312
311
|
protectOn: (instance, permission, load, protectOptions = {}, request) => guardOn(deps, instance, void 0, reporters.get(instance) ?? (() => void 0), request, permission, load, protectOptions),
|
|
@@ -321,4 +320,4 @@ function createServerKernel(policy, options) {
|
|
|
321
320
|
};
|
|
322
321
|
}
|
|
323
322
|
//#endregion
|
|
324
|
-
export {
|
|
323
|
+
export { createPermDock as t };
|
|
@@ -0,0 +1,110 @@
|
|
|
1
|
+
import { Nn as Decision, Pn as Denial, Rt as Instant, T as Policy, dt as TokenVerifier, j as PolicyVocabulary, qt as AuthEvent, rr as Principal, ut as TokenSigner } from "./policy-types-n0uRTsW8.js";
|
|
2
|
+
import { w as Permission } from "./vocabulary-CN8H_9UF.js";
|
|
3
|
+
import { i as PermDockOptions, p as PrincipalSource, r as PermDock, t as DecideOptions } from "./permdock-SV8ZINYT.js";
|
|
4
|
+
import { m as ApprovalStore } from "./types-BdtSDbBO.js";
|
|
5
|
+
import { a as AutomationSource } from "./automation-BNM3TtDo.js";
|
|
6
|
+
import { n as ApprovalWaiter } from "./waiter-B986w1oK.js";
|
|
7
|
+
import { n as RunAutomation, r as RunBinding } from "./run-ticket-DocwaTKn.js";
|
|
8
|
+
//#region src/workflow/create.d.ts
|
|
9
|
+
type WorkflowPermDockOptions = PermDockOptions & {
|
|
10
|
+
/** Signs the run tickets `start` mints. */
|
|
11
|
+
readonly signer: TokenSigner;
|
|
12
|
+
/** Verifies run tickets in `getPermDock`. */
|
|
13
|
+
readonly verifier: TokenVerifier;
|
|
14
|
+
/** Loads the principal a run acts as, live, on every `getPermDock`. */
|
|
15
|
+
readonly principals: PrincipalSource;
|
|
16
|
+
/** The live automation records, read by `start` and on every `getPermDock`. */
|
|
17
|
+
readonly automations: AutomationSource;
|
|
18
|
+
/** Where `awaitApproval` opens and resumes requests; the same option name as every other adapter. */
|
|
19
|
+
readonly store?: ApprovalStore;
|
|
20
|
+
/** Suspends `awaitApproval` until a request is decided. */
|
|
21
|
+
readonly waiter?: ApprovalWaiter;
|
|
22
|
+
readonly audience?: string | readonly string[];
|
|
23
|
+
readonly issuer?: string;
|
|
24
|
+
/** Run ticket lifetime in seconds. Defaults to 86400; a run past it denies. */
|
|
25
|
+
readonly expiresIn?: number;
|
|
26
|
+
readonly onAuth?: (event: AuthEvent) => void;
|
|
27
|
+
};
|
|
28
|
+
type AutomationOptions = {
|
|
29
|
+
/** The tenant the automation is read for. */
|
|
30
|
+
readonly tenant?: string;
|
|
31
|
+
/**
|
|
32
|
+
* The caller starting the run. It needs only the automation's `run`
|
|
33
|
+
* permission and lends the run nothing. Absent: server code starts the run,
|
|
34
|
+
* which an automation without `run` requires.
|
|
35
|
+
*/
|
|
36
|
+
readonly caller?: PermDock;
|
|
37
|
+
/** The row `run` is decided on, when it is an instance permission. */
|
|
38
|
+
readonly row?: unknown;
|
|
39
|
+
/** The event that started the run, as JSON. Kept in `subject.context.trigger`; never a grant. */
|
|
40
|
+
readonly trigger?: Readonly<Record<string, unknown>>;
|
|
41
|
+
/** The run id (`jti`); a fresh UUID when absent. */
|
|
42
|
+
readonly id?: string;
|
|
43
|
+
readonly binding?: RunBinding;
|
|
44
|
+
readonly now?: Instant;
|
|
45
|
+
};
|
|
46
|
+
type StartAutomationResult = {
|
|
47
|
+
readonly outcome: "started";
|
|
48
|
+
readonly ticket: string;
|
|
49
|
+
readonly run: {
|
|
50
|
+
readonly id: string;
|
|
51
|
+
readonly automation: RunAutomation;
|
|
52
|
+
};
|
|
53
|
+
} | {
|
|
54
|
+
readonly outcome: "denied";
|
|
55
|
+
readonly denials: readonly Denial[];
|
|
56
|
+
};
|
|
57
|
+
type AwaitApprovalOptions = DecideOptions & {
|
|
58
|
+
/** The resource the approval request names; defaults to the permission's resource and the row's `id`. */
|
|
59
|
+
readonly resource?: {
|
|
60
|
+
readonly type: string;
|
|
61
|
+
readonly id?: string;
|
|
62
|
+
};
|
|
63
|
+
/** Seconds the request stays open; the store's `ttl` when absent. */
|
|
64
|
+
readonly ttl?: number;
|
|
65
|
+
readonly signal?: AbortSignal;
|
|
66
|
+
};
|
|
67
|
+
type WorkflowPermDock<V extends PolicyVocabulary = PolicyVocabulary> = {
|
|
68
|
+
/**
|
|
69
|
+
* Starts a run of the automation `id` and returns its run ticket. Denied
|
|
70
|
+
* when the automation is unknown or revoked (`validation`) or when the
|
|
71
|
+
* caller is not granted its `run` permission.
|
|
72
|
+
*/
|
|
73
|
+
readonly start: (id: string, options?: AutomationOptions) => Promise<StartAutomationResult>;
|
|
74
|
+
/**
|
|
75
|
+
* The PermDock of a run, rebuilt from its ticket: the principal loaded
|
|
76
|
+
* live, narrowed to the automation's permissions and to any policy
|
|
77
|
+
* delegation to `actor('automation')`. A changed, revoked or unknown
|
|
78
|
+
* automation, or a publisher who is gone, gives an anonymous instance
|
|
79
|
+
* that denies everything.
|
|
80
|
+
*/
|
|
81
|
+
readonly getPermDock: (ticket: string) => Promise<PermDock<V>>;
|
|
82
|
+
/**
|
|
83
|
+
* Decides `permission`; on `approval-required` opens a request, waits on
|
|
84
|
+
* the `waiter`, then rebuilds the run from its ticket and decides again
|
|
85
|
+
* with the token. The second decision reads the publisher's rights as of
|
|
86
|
+
* then, so a demotion while waiting denies.
|
|
87
|
+
*/
|
|
88
|
+
readonly awaitApproval: (ticket: string, permission: Permission, data?: unknown, options?: AwaitApprovalOptions) => Promise<Decision>;
|
|
89
|
+
/**
|
|
90
|
+
* The first half of `awaitApproval`, for runners that wait outside the
|
|
91
|
+
* call: decides, and on `approval-required` opens the request and returns
|
|
92
|
+
* the decision with its token.
|
|
93
|
+
*/
|
|
94
|
+
readonly openApproval: (ticket: string, permission: Permission, data?: unknown, options?: AwaitApprovalOptions) => Promise<Decision>;
|
|
95
|
+
/**
|
|
96
|
+
* The second half: rebuilds the run from its ticket and decides again with
|
|
97
|
+
* the approval `token`. A request still pending denies with reason
|
|
98
|
+
* `approval`.
|
|
99
|
+
*/
|
|
100
|
+
readonly resumeApproval: (ticket: string, permission: Permission, token: string, data?: unknown, options?: AwaitApprovalOptions) => Promise<Decision>;
|
|
101
|
+
};
|
|
102
|
+
/**
|
|
103
|
+
* Creates the PermDock for durable runs of published automations. A run
|
|
104
|
+
* acts as the automation's principal with that principal's rights at each
|
|
105
|
+
* step, narrowed to the automation's operations; the trigger is recorded
|
|
106
|
+
* and never grants.
|
|
107
|
+
*/
|
|
108
|
+
declare function createPermDock<TUser, TPrincipal extends Principal = Principal, V extends PolicyVocabulary = PolicyVocabulary>(policy: Policy<TUser, TPrincipal, V>, given: WorkflowPermDockOptions): WorkflowPermDock<V>;
|
|
109
|
+
//#endregion
|
|
110
|
+
export { WorkflowPermDockOptions as a, WorkflowPermDock as i, AwaitApprovalOptions as n, createPermDock as o, StartAutomationResult as r, AutomationOptions as t };
|