permdock 0.4.0 → 0.5.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +37 -35
- package/dist/{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-B4R5fnMU.js +107 -0
- package/dist/agent/index.d.ts +3 -0
- package/dist/agent/index.js +1 -0
- package/dist/ai-sdk/index.d.ts +18 -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-Djo_PyZc.d.ts +57 -0
- package/dist/approvals/index.d.ts +5 -3
- package/dist/approvals/index.js +8 -5
- package/dist/approvals-DJ6Yd5z1.js +995 -0
- package/dist/arazzo-B6lebmiQ.js +36 -0
- package/dist/{arazzo-C4BcskbX.js → arazzo-BWhNF-k0.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-Dg8XsRaO.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-BMZPIVUM.d.ts +114 -0
- package/dist/automation-DVjOckjV.js +157 -0
- package/dist/better-auth/index.d.ts +8 -6
- package/dist/better-auth/index.js +9 -8
- package/dist/better-supabase/index.d.ts +357 -30
- package/dist/better-supabase/index.js +936 -194
- package/dist/{bind-BzqG8SMb.d.ts → bind--9EFVYWF.d.ts} +12 -10
- package/dist/{bind-kk-uyCwH.js → bind-CZzhx-Vj.js} +14 -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-BMnAudHn.js} +4 -3
- package/dist/{canonical-json-CFKyFOke.js → canonical-json-BC8_nMTw.js} +5 -3
- package/dist/{capability-CksyCWDH.d.ts → capability-BSslw1QV.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-tZUyOfOv.js → catalog-BECMPrwc.js} +51 -6
- package/dist/catalog-DjhMYYCq.js +1 -0
- package/dist/catalog-R_A__RsH.js +52 -0
- package/dist/{catalog-doc-DWtg0gGR.js → catalog-doc-C9wjsfNY.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-CIoHNevm.js +87 -0
- package/dist/codemod-Bmj9dWMH.js +37 -0
- package/dist/codemod-Cxvvc70T.js +2084 -0
- package/dist/{collect-2SrB7lfk.js → collect-CrZJJnEF.js} +75 -11
- package/dist/collect-DloHbDVa.js +55 -0
- package/dist/collect-FlXJlhus.js +1 -0
- 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-CcEu2ZQ1.js → compile-CMqMx_IN.js} +11 -8
- package/dist/{compile-CtTP7eur.d.ts → compile-Ckm2HqBZ.d.ts} +5 -3
- package/dist/completion-BqhRBJD8.js +143 -0
- package/dist/config-B46rm9sc.js +26 -0
- package/dist/{config-BIjREpyE.js → config-bs_kZeYq.js} +12 -7
- package/dist/{config-report--Xb9APJS.js → config-report-DUgj62Ai.js} +15 -5
- package/dist/{connection-DUsczpB5.js → connection-DjhIJSs2.js} +6 -5
- package/dist/{context-DieZVJXu.js → context-bbFHR-0D.js} +2 -2
- package/dist/convex/index.d.ts +11 -10
- package/dist/convex/index.js +6 -4
- package/dist/create-0VZ7Pdiu.d.ts +107 -0
- package/dist/create-BDS7wc3y.d.ts +138 -0
- package/dist/create-BFfm17UA.d.ts +110 -0
- package/dist/create-BWRSXgOF.js +403 -0
- package/dist/create-C3b4B5eF.js +130 -0
- package/dist/{create-BBO24vj6.js → create-DnrmLnLW.js} +31 -32
- package/dist/{credential-kue0qpbm.js → credential-DM2um3ha.js} +152 -31
- package/dist/credentials-DPyHmYz5.js +74 -0
- package/dist/delegation-DaXVdDhM.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-D8jDHgsl.d.ts} +5 -5
- package/dist/{describe-C3ldA9os.d.ts → describe-BZUsixiL.d.ts} +2 -2
- package/dist/{describe-Cgkp7eP0.js → describe-BybMRY7A.js} +6 -2
- package/dist/device-BARQ8eYG.js +193 -0
- package/dist/diff-CxZo9pTq.js +37 -0
- package/dist/{diff-rpqoe7Ag.js → diff-DCePiN6M.js} +60 -54
- package/dist/doctor-CxiwSfqH.js +44 -0
- package/dist/{doctor-owlv6ddh.js → doctor-DFjUxf2f.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-OD_4c__H.d.ts → errors-C2PXIv4c.d.ts} +2 -2
- package/dist/errors-CWTY6uih.js +143 -0
- package/dist/evaluate-_R8QkWaf.js +1732 -0
- package/dist/evaluations-16UqqQ6W.d.ts +32 -0
- package/dist/{evaluations-C9YJsv3H.js → evaluations-DZ2CbV5k.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-g0ypLkID.js +120 -0
- package/dist/fetch-adapter-qKJBuRqy.d.ts +31 -0
- package/dist/fields-D9tPVUUS.js +203 -0
- package/dist/files-C5ZI27eV.js +124 -0
- package/dist/{fixtures-h2eG2OZV.js → fixtures-B7XrLeY7.js} +8 -7
- package/dist/flags-C3DktBDY.js +86 -0
- package/dist/{from-snapshot-7REQZe0H.js → from-snapshot-D2lZt4Dd.js} +55 -52
- package/dist/{grantee-CXY-0C87.js → grantee-Cn1HyUsI.js} +3 -3
- package/dist/{grantee-conditions-MQs5NIuX.js → grantee-conditions-CcXf8hMM.js} +4 -3
- package/dist/{grantee-match-fxYp9Nmt.js → grantee-match-DHArqY82.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-DTcZOzhF.js} +45 -38
- package/dist/hono/index.d.ts +12 -9
- package/dist/hono/index.js +13 -12
- package/dist/hosted-BZIAYvon.js +315 -0
- package/dist/hosted-DBDX0M-P.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-DMmOG27O.js} +190 -53
- package/dist/index-BcHcPyIo.d.ts +110 -0
- package/dist/index-CaxrMD1A.d.ts +1 -0
- package/dist/index-Chrs5fQ-.d.ts +210 -0
- package/dist/index-CxGUswIC.d.ts +431 -0
- package/dist/index-D8EovfsP.d.ts +91 -0
- package/dist/{index-UdVQgq48.d.ts → index-DOVf7RJv.d.ts} +431 -81
- package/dist/{index-BwMe94Xq.d.ts → index-SGdIQyzc.d.ts} +34 -16
- 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-Omfd793B.d.ts} +2 -2
- package/dist/instance-snapshot-Cxq4ygFc.js +600 -0
- package/dist/instant-BluqDvyS.js +19 -0
- package/dist/internals-Dk8A8fX3.js +17 -0
- package/dist/{json-schema-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-5JatXyND.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-CtKR3GXL.js +370 -0
- package/dist/manifest-json-CAGzls-C.js +9 -0
- package/dist/{manifest-uDS9y5de.d.ts → manifest-mx5ghSFM.d.ts} +9 -2
- package/dist/manifest-schema-C0kK_8V0.js +399 -0
- package/dist/{map-claims-AVlBaJoa.js → map-claims-D3oRmTk0.js} +13 -10
- package/dist/{map-error-BE27PYkE.js → map-error-TCAdw-eW.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-BShP7Vf4.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-BJdBmYDG.js → openapi-DTaEmTSW.js} +10 -9
- package/dist/openapi-ahr8rHu3.js +138 -0
- package/dist/operation-findings-DgATDpvh.js +36 -0
- package/dist/operations-CxybZErY.d.ts +59 -0
- package/dist/orpc/index.d.ts +13 -10
- package/dist/orpc/index.js +20 -15
- package/dist/otel/index.d.ts +3 -2
- package/dist/otel/index.js +30 -7
- package/dist/output-Dyw8fyPF.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-BatFgAA4.js} +1698 -869
- 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-C-q02Pal.js → parse-local-manifest-CVSs6J9I.js} +1 -1
- package/dist/{parse-local-manifest-DvYUR0QL.d.ts → parse-local-manifest-DgqtruPn.d.ts} +1 -1
- package/dist/parse-request-D_tUXG6M.js +26 -0
- package/dist/paths-DXSHAMIa.js +42 -0
- package/dist/pdp/index.d.ts +7 -3
- package/dist/pdp/index.js +45 -26
- package/dist/{peer-BOr_kJE1.js → peer-C8swJ2GH.js} +23 -4
- package/dist/peer-CRvC7Hg1.js +1 -0
- package/dist/permdock-B9JxkBwC.js +868 -0
- package/dist/permdock-D7eeLJER.d.ts +502 -0
- package/dist/{permission-registry-BsblpB-z.js → permission-registry-Br4jSNVi.js} +3 -3
- package/dist/permissions-B-wCP5ZC.js +30 -0
- package/dist/{permissions-CCJ6lmxB.js → permissions-CZKiUfFM.js} +4 -3
- package/dist/{permissions-COH-KRgT.d.ts → permissions-oEWfl-kl.d.ts} +1 -2
- package/dist/policies-CO1oOymN.js +295 -0
- package/dist/{policy-ur0BBK_e.d.ts → policy-Czo4n3Hs.d.ts} +2 -2
- package/dist/{hosted-CBHgkzDl.js → policy-DLZJ5gAp.js} +17 -273
- package/dist/policy-from-catalog-DzhEc3Y9.js +450 -0
- package/dist/policy-module-CTlwMvLI.js +89 -0
- package/dist/{policy-types-sp9P1iIV.d.ts → policy-types-DzwivBgR.d.ts} +434 -631
- package/dist/postgrest-CW0IqC-U.js +566 -0
- package/dist/postgrest-NUqZT-RB.d.ts +100 -0
- package/dist/powersync-BHfuehf3.js +62 -0
- package/dist/powersync-CbzkqL_M.js +1 -0
- package/dist/{powersync-cZe4kzhL.js → powersync-bYUDLOAO.js} +23 -24
- 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-DXlt-vks.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-B3_P7xuw.d.ts → protected-DEPHc2xV.d.ts} +16 -8
- package/dist/{protected-BN7BUdY1.js → protected-DfjY5mLA.js} +21 -4
- package/dist/{provider-Bi-0HNL3.js → provider-CC-u3bYP.js} +2 -2
- package/dist/{provider-kwHC9CZD.d.ts → provider-DMVt6yYn.d.ts} +1 -1
- package/dist/{provider-store-Ctt-81Ni.js → provider-store-B5Yrkhzr.js} +2 -2
- package/dist/pull-BgIfno6w.js +256 -0
- package/dist/pull-ByOks_Tg.js +1 -0
- package/dist/push-CmFVBOeI.js +116 -0
- package/dist/pushed-policy-BImMTTIM.d.ts +57 -0
- package/dist/pushed-policy-DobP7AHI.js +238 -0
- package/dist/react/index.d.ts +8 -8
- package/dist/react/index.js +6 -6
- package/dist/react/provider-client.d.ts +1 -1
- package/dist/react/provider-client.js +1 -2
- package/dist/react-native/index.d.ts +24 -72
- package/dist/react-native/index.js +24 -22
- 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-D7iKcLFe.d.ts} +1 -1
- package/dist/{replay-BsOyTrdV.js → replay-Du1tJjG7.js} +2 -1
- package/dist/{request-context-BVM7aWNs.js → request-context-BTRTG7OT.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-BA8an5Ap.js +336 -0
- package/dist/{rls-BEktUaqg.js → rls-j6t43t7n.js} +287 -689
- package/dist/{role-builder-B4GbKM-i.js → role-builder-CXbis5-X.js} +14 -207
- package/dist/{rpc-nYC3cR_u.js → rpc-aPyNi6tA.js} +7 -7
- package/dist/run-CNsApDpd.js +1 -0
- package/dist/run-DOfMtc9V.js +723 -0
- package/dist/run-ticket-BjhTOi6u.d.ts +124 -0
- package/dist/run-ticket-sxFI6LAk.js +337 -0
- package/dist/{runtime-D_tMXnsq.js → runtime-D3VTAiCA.js} +1 -1
- package/dist/{saas-DtaA4JuW.js → saas-FO-Q8oj0.js} +16 -14
- package/dist/scan-BOI5tJ-6.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-DqCT4CgZ.js +453 -0
- package/dist/{server-types-DdqBwZN_.d.ts → server-types-BLd4MnBX.d.ts} +51 -68
- package/dist/{sha256-BO0swRXL.js → sha256-D9ihqmvd.js} +8 -1
- package/dist/{shared-1uhI-e-b.js → shared-CD11nBbC.js} +18 -8
- package/dist/{shared-JhMeOsDF.js → shared-DvvFzYXe.js} +8 -9
- package/dist/signals-D3NcTKUS.js +32 -0
- package/dist/sink-BEZSlMS_.js +957 -0
- package/dist/sink-Bj_lDUDq.d.ts +225 -0
- package/dist/{skills-BZdRQkxs.js → skills-B6lVdD_W.js} +13 -6
- package/dist/skills-CTYwkl44.js +51 -0
- package/dist/snapshot-CXUWfsNy.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-DqK9eDmM.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-BV9j0DeZ.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-DLfUWFAI.js +1851 -0
- package/dist/ssf/index.d.ts +4 -4
- package/dist/ssf/index.js +384 -47
- package/dist/standard-webhooks-6lg8v_is.d.ts +88 -0
- package/dist/standard-webhooks-DgFFD-Ga.js +228 -0
- package/dist/storage-C2bWdvJH.js +132 -0
- package/dist/{store-ILkLUj_o.js → store-4u_hxjWa.js} +40 -53
- package/dist/{store-options-CbUHDoSe.js → store-options-BqEakYRa.js} +26 -21
- package/dist/{stores-BHXdSbw9.js → stores-BbsD4fAR.js} +2 -2
- package/dist/{stores-Cxz_80g-.d.ts → stores-ClZUgeoP.d.ts} +7 -8
- package/dist/{stream-Dwsg6WwE.d.ts → stream-7-xmnf3U.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-9pqI57pW.js +92 -0
- package/dist/{supabase-C1TWlnYt.js → supabase-Dxlp8A94.js} +98 -205
- package/dist/supabase-hook-CXcGpHqq.js +1 -0
- package/dist/{supabase-hook-Cva3ikXz.js → supabase-hook-DdDQhMlw.js} +951 -60
- 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-7rJVLWe5.d.ts → types-5Ut_pbKy.d.ts} +61 -11
- package/dist/{store-9KO4BlkB.d.ts → types-BNORmDM8.d.ts} +100 -75
- package/dist/types-BjV-fqcA.d.ts +57 -0
- package/dist/{types-CUcFZfpU.d.ts → types-BqAKcRNW.d.ts} +2 -1
- package/dist/types-C8-KNsFf.d.ts +107 -0
- package/dist/{types-Br9IXUBG.d.ts → types-CCpc2Dcv.d.ts} +77 -17
- package/dist/{types-DpWfQdSh.d.ts → types-CZTnPFzM.d.ts} +46 -11
- package/dist/{types-CqrjB9o6.d.ts → types-CdlxsYQh.d.ts} +23 -11
- package/dist/{types-CIlTojhq.d.ts → types-ClZaWzfb.d.ts} +9 -6
- package/dist/types-DX0LaKTb.d.ts +157 -0
- package/dist/types-DiQjupG2.d.ts +332 -0
- package/dist/types-DqzsnlSA.js +67 -0
- package/dist/types-_sHy8BQf.d.ts +65 -0
- package/dist/{types-ByUo56un.d.ts → types-fbZ7JEXr.d.ts} +23 -22
- package/dist/{types-DHrmBJLH.d.ts → types-tIgIeIKJ.d.ts} +7 -7
- package/dist/unplugin/index.d.ts +1 -1
- package/dist/unplugin/index.js +2 -2
- package/dist/usage-CHOtwL19.js +1 -0
- package/dist/usage-DHtE8j4E.js +32 -0
- package/dist/{usage-CG9nOYZw.js → usage-T5mXq98v.js} +54 -11
- package/dist/{validation-error-BSSw0l_8.d.ts → validation-error-Bg5Tpluk.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-DbCL9bnB.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-D6lPdb4Z.d.ts} +65 -2
- package/dist/vue/index.d.ts +9 -10
- package/dist/vue/index.js +8 -8
- package/dist/waiter-BGUtGYoU.js +67 -0
- package/dist/waiter-CKy4MQSY.d.ts +36 -0
- package/dist/watch-Cb-NcaUw.js +1 -0
- package/dist/{watch-zeucB7eF.js → watch-CszoTJMq.js} +44 -5
- package/dist/webmcp/index.d.ts +2 -2
- package/dist/webmcp/index.js +3 -3
- package/dist/where-scope-Dv-WTP-w.js +306 -0
- package/dist/who-can-D0QoYbEb.js +364 -0
- package/dist/wire-delegation-Cv3W2eaM.js +36 -0
- package/dist/wire-denial-C7PaVYEM.js +27 -0
- package/dist/workflow/index.d.ts +5 -0
- package/dist/workflow/index.js +223 -0
- package/dist/workflow-sdk/index.d.ts +56 -0
- package/dist/workflow-sdk/index.js +78 -0
- package/dist/{wrap-Cr93qqdP.d.ts → wrap-Bd1Tejur.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 +9 -8
- package/skills/permdock-data/references/relationships.md +3 -3
- package/skills/permdock-tenancy/SKILL.md +20 -7
- package/skills/permdock-tenancy/references/contacts-and-support-sessions.md +122 -0
- package/skills/permdock-tenancy/references/ownership-and-custom-roles.md +5 -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/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
package/dist/cloud/index.js
CHANGED
|
@@ -1,398 +1,297 @@
|
|
|
1
1
|
import { r as isRecord, t as compact } from "../compact-CAf557ZB.js";
|
|
2
2
|
import { n as freezeDeep } from "../freeze-CrU8nQeX.js";
|
|
3
|
-
import { o as
|
|
4
|
-
import {
|
|
5
|
-
import {
|
|
6
|
-
import {
|
|
7
|
-
import {
|
|
8
|
-
import { t as
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
function
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
}
|
|
20
|
-
function trimSlash(value) {
|
|
21
|
-
return value.endsWith("/") ? value.slice(0, -1) : value;
|
|
22
|
-
}
|
|
23
|
-
function asApproval(value) {
|
|
24
|
-
if (!isRecord(value) || value["v"] !== 1 || typeof value["token"] !== "string") return null;
|
|
25
|
-
return value;
|
|
26
|
-
}
|
|
27
|
-
function isCompactJws$1(value) {
|
|
28
|
-
return !value.startsWith("{") && value.split(".").length === 3;
|
|
3
|
+
import { o as statusProblem } from "../problem-details-cn5X30gZ.js";
|
|
4
|
+
import { r as CLOUD_EVENT_TYPES } from "../sink-BEZSlMS_.js";
|
|
5
|
+
import { i as parseCloudEventBatch, r as parseCloudEvent$1 } from "../catalog-fingerprint-CCP0-yQS.js";
|
|
6
|
+
import { c as problemResponse } from "../problem-CTviyH5L.js";
|
|
7
|
+
import { n as webhookVerifier } from "../standard-webhooks-DgFFD-Ga.js";
|
|
8
|
+
import { t as pollingApprovalWaiter } from "../waiter-BGUtGYoU.js";
|
|
9
|
+
import { i as isDeliveryTarget } from "../target-Bw37TFNA.js";
|
|
10
|
+
import { i as isCompactJws, n as cloudConnection, r as cloudEndpoints, t as cloud } from "../create-BWRSXgOF.js";
|
|
11
|
+
//#region src/cloud/delivery.ts
|
|
12
|
+
function failed(cause, retryable, reason) {
|
|
13
|
+
return {
|
|
14
|
+
status: "failed",
|
|
15
|
+
cause,
|
|
16
|
+
retryable,
|
|
17
|
+
reason
|
|
18
|
+
};
|
|
29
19
|
}
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
20
|
+
async function fromResponse(response) {
|
|
21
|
+
const { status } = response;
|
|
22
|
+
if (status >= 200 && status < 300) {
|
|
23
|
+
let body;
|
|
24
|
+
try {
|
|
25
|
+
body = await response.json();
|
|
26
|
+
} catch {
|
|
27
|
+
body = void 0;
|
|
28
|
+
}
|
|
29
|
+
const id = isRecord(body) ? body["id"] : void 0;
|
|
30
|
+
return typeof id === "string" && id !== "" ? {
|
|
31
|
+
status: "sent",
|
|
32
|
+
providerId: id
|
|
33
|
+
} : { status: "sent" };
|
|
37
34
|
}
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
if (
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
function approvalErrorFromStatus(status) {
|
|
45
|
-
if (status === 409) return new ApprovalError("approval-not-pending", "approval is not pending");
|
|
46
|
-
if (status === 410) return new ApprovalError("approval-expired", "approval has expired");
|
|
47
|
-
return new ApprovalError("approval-not-found", "approval was not found");
|
|
35
|
+
const reason = `HTTP ${String(status)}`;
|
|
36
|
+
if (status === 429) return failed("rate-limited", true, reason);
|
|
37
|
+
if (status === 408 || status === 409 || status >= 500) return failed("unavailable", true, reason);
|
|
38
|
+
if (status === 401 || status === 403) return failed("unauthorized", false, reason);
|
|
39
|
+
if (status === 400 || status === 422) return failed("invalid-message", false, reason);
|
|
40
|
+
return failed("rejected", false, reason);
|
|
48
41
|
}
|
|
49
42
|
/**
|
|
50
|
-
*
|
|
51
|
-
*
|
|
43
|
+
* A `DeliveryTransport` for `channel` that hands each checked recipient to
|
|
44
|
+
* PermDock Cloud, which sends it from its hosted email, chat or webhook
|
|
45
|
+
* sender and reports back through `com.permdock.delivery.*` events. The
|
|
46
|
+
* router has already decided the recipient: the Cloud receives the target
|
|
47
|
+
* and the permission that let it through, never a decision to make.
|
|
48
|
+
* `Idempotency-Key` is the delivery's idempotency key, so a retry repeats it.
|
|
52
49
|
*/
|
|
53
|
-
function
|
|
54
|
-
const
|
|
55
|
-
if (url === "") throw new Error("PermDock: cloud() requires url and key.");
|
|
56
|
-
const environment = firstNonEmpty(options.environment, readEnv("PERMDOCK_CLOUD_ENV"), readEnv("VERCEL_ENV"), "production");
|
|
57
|
-
const issuer = `${url}/v1/environments/${encodeURIComponent(environment)}`;
|
|
50
|
+
function cloudDeliveryTransport(channel, options = {}) {
|
|
51
|
+
const connection = cloudConnection(options);
|
|
58
52
|
return Object.freeze({
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
const flushAt = options.flushAt ?? 32;
|
|
69
|
-
const waitUntil = options.waitUntil;
|
|
70
|
-
const headers = () => {
|
|
71
|
-
const next = new Headers();
|
|
72
|
-
next.set("authorization", `Bearer ${key}`);
|
|
73
|
-
next.set("content-type", "application/json");
|
|
74
|
-
return next;
|
|
75
|
-
};
|
|
76
|
-
const request = (path, init = {}, accept) => {
|
|
77
|
-
const next = headers();
|
|
78
|
-
if (accept !== void 0) next.set("accept", accept);
|
|
79
|
-
return fetchFn(`${root}${path}`, {
|
|
80
|
-
...init,
|
|
81
|
-
headers: next,
|
|
82
|
-
signal: timeoutSignal(CLOUD_TIMEOUT_MS, init.signal)
|
|
83
|
-
});
|
|
84
|
-
};
|
|
85
|
-
const approvals = {
|
|
86
|
-
async create(record) {
|
|
87
|
-
if (!(await request("/approvals", {
|
|
88
|
-
method: "POST",
|
|
89
|
-
body: JSON.stringify(record)
|
|
90
|
-
})).ok) throw new Error("PermDock Cloud rejected the approval create");
|
|
91
|
-
},
|
|
92
|
-
async get(token) {
|
|
93
|
-
try {
|
|
94
|
-
const response = await request(`/approvals/${encodeURIComponent(token)}`);
|
|
95
|
-
if (!response.ok) return null;
|
|
96
|
-
return asApproval(await response.json());
|
|
97
|
-
} catch {
|
|
98
|
-
return null;
|
|
99
|
-
}
|
|
100
|
-
},
|
|
101
|
-
async resolve(token, verdict) {
|
|
102
|
-
const response = await request(`/approvals/${encodeURIComponent(token)}/resolve`, {
|
|
103
|
-
method: "POST",
|
|
104
|
-
body: JSON.stringify(verdict)
|
|
105
|
-
});
|
|
106
|
-
if (!response.ok) throw await approvalErrorFrom(response);
|
|
107
|
-
const parsed = asApproval(await response.json());
|
|
108
|
-
if (parsed === null) throw new ApprovalError("approval-not-found", "PermDock Cloud returned an unknown approval shape");
|
|
109
|
-
return parsed;
|
|
110
|
-
},
|
|
111
|
-
async consume(token, now) {
|
|
53
|
+
channel,
|
|
54
|
+
name: "permdock-cloud",
|
|
55
|
+
async deliver(target, message, transportOptions) {
|
|
56
|
+
if (!isDeliveryTarget(target, channel)) return {
|
|
57
|
+
status: "failed",
|
|
58
|
+
cause: "invalid-recipient",
|
|
59
|
+
retryable: false
|
|
60
|
+
};
|
|
61
|
+
let body;
|
|
112
62
|
try {
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
63
|
+
body = JSON.stringify({
|
|
64
|
+
channel,
|
|
65
|
+
delivery: transportOptions.delivery,
|
|
66
|
+
target: compact({
|
|
67
|
+
address: target.address,
|
|
68
|
+
principal: target.principal,
|
|
69
|
+
provider: target.provider,
|
|
70
|
+
workspace: target.workspace,
|
|
71
|
+
trusted: target.trusted,
|
|
72
|
+
permission: target.decision.matched.permission
|
|
73
|
+
}),
|
|
74
|
+
message
|
|
116
75
|
});
|
|
117
|
-
if (!response.ok) return null;
|
|
118
|
-
return asApproval(await response.json());
|
|
119
76
|
} catch {
|
|
120
|
-
return
|
|
77
|
+
return {
|
|
78
|
+
status: "failed",
|
|
79
|
+
cause: "invalid-message",
|
|
80
|
+
retryable: false
|
|
81
|
+
};
|
|
121
82
|
}
|
|
122
|
-
},
|
|
123
|
-
async list(query) {
|
|
124
|
-
const params = new URLSearchParams(compact({
|
|
125
|
-
status: query.status,
|
|
126
|
-
principalId: query.principalId,
|
|
127
|
-
actorId: query.actorId,
|
|
128
|
-
tenant: query.tenant,
|
|
129
|
-
session: query.session,
|
|
130
|
-
limit: query.limit === void 0 ? void 0 : String(query.limit),
|
|
131
|
-
cursor: query.cursor
|
|
132
|
-
}));
|
|
133
|
-
const suffix = params.size === 0 ? "" : `?${params.toString()}`;
|
|
134
83
|
try {
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
const parsed = asApproval(item);
|
|
141
|
-
return parsed === null ? [] : [parsed];
|
|
142
|
-
});
|
|
143
|
-
return typeof body["next"] === "string" && body["next"] !== "" ? {
|
|
144
|
-
items,
|
|
145
|
-
next: body["next"]
|
|
146
|
-
} : { items };
|
|
84
|
+
return await fromResponse(await connection.request("/deliveries", {
|
|
85
|
+
method: "POST",
|
|
86
|
+
headers: { "idempotency-key": transportOptions.idempotencyKey },
|
|
87
|
+
body
|
|
88
|
+
}));
|
|
147
89
|
} catch {
|
|
148
|
-
return
|
|
90
|
+
return failed("unavailable", true, "request failed");
|
|
149
91
|
}
|
|
150
|
-
}
|
|
151
|
-
|
|
152
|
-
|
|
92
|
+
}
|
|
93
|
+
});
|
|
94
|
+
}
|
|
95
|
+
//#endregion
|
|
96
|
+
//#region src/cloud/signer.ts
|
|
97
|
+
const REGISTERED = /* @__PURE__ */ new Set([
|
|
98
|
+
"iss",
|
|
99
|
+
"aud",
|
|
100
|
+
"exp",
|
|
101
|
+
"iat",
|
|
102
|
+
"nbf",
|
|
103
|
+
"jti"
|
|
104
|
+
]);
|
|
105
|
+
/**
|
|
106
|
+
* The Cloud's own outputs and access tokens; a client key that could mint
|
|
107
|
+
* them could forge them, or forge the approver behind `PermDock-Approver`.
|
|
108
|
+
*/
|
|
109
|
+
const CLOUD_ISSUED = /* @__PURE__ */ new Set([
|
|
110
|
+
"vnd.permdock.policy+jwt",
|
|
111
|
+
"vnd.permdock.snapshot+jwt",
|
|
112
|
+
"vnd.permdock.evidence+jwt",
|
|
113
|
+
"at+jwt",
|
|
114
|
+
"secevent+jwt"
|
|
115
|
+
]);
|
|
116
|
+
function headerTyp(token) {
|
|
117
|
+
const [encoded = ""] = token.split(".");
|
|
118
|
+
try {
|
|
119
|
+
const text = atob(encoded.replaceAll("-", "+").replaceAll("_", "/"));
|
|
120
|
+
const header = JSON.parse(text);
|
|
121
|
+
return isRecord(header) ? header["typ"] : void 0;
|
|
122
|
+
} catch {
|
|
123
|
+
return;
|
|
124
|
+
}
|
|
125
|
+
}
|
|
126
|
+
/**
|
|
127
|
+
* A `TokenSigner` backed by the environment's PermDock Cloud keys, typically
|
|
128
|
+
* KMS-held, for run tickets (`vnd.permdock.run+jwt`) and every other signed
|
|
129
|
+
* output an app issues. The Cloud signs only what the app sends: it sets
|
|
130
|
+
* `iss` to the environment URL and adds no claim. Policy documents,
|
|
131
|
+
* snapshots, evidence exports, Security Event Tokens and `at+jwt` access tokens are the Cloud's own
|
|
132
|
+
* outputs, so their `typ` values are refused here. Verify what it signs with
|
|
133
|
+
* `joseTokenVerifier({ jwks: cloudEndpoints().jwks })`.
|
|
134
|
+
*/
|
|
135
|
+
function cloudSigner(options = {}) {
|
|
136
|
+
const connection = cloudConnection(options);
|
|
137
|
+
return Object.freeze({
|
|
138
|
+
async sign(payload, signOptions) {
|
|
139
|
+
if (CLOUD_ISSUED.has(signOptions.typ)) throw new Error(`PermDock: cloudSigner never signs ${signOptions.typ}; the Cloud issues its own.`);
|
|
140
|
+
const audience = signOptions.audience ?? options.audience;
|
|
141
|
+
if (audience === void 0 || audience.length === 0) throw new Error("PermDock: cloudSigner requires an audience.");
|
|
142
|
+
const claims = Object.fromEntries(Object.entries(payload).filter(([name]) => !REGISTERED.has(name)));
|
|
143
|
+
const response = await connection.request("/sign", {
|
|
153
144
|
method: "POST",
|
|
154
145
|
body: JSON.stringify(compact({
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
146
|
+
typ: signOptions.typ,
|
|
147
|
+
claims,
|
|
148
|
+
aud: audience,
|
|
149
|
+
exp: signOptions.expiresAt,
|
|
150
|
+
iat: signOptions.issuedAt,
|
|
151
|
+
jti: signOptions.jti
|
|
158
152
|
}))
|
|
159
|
-
});
|
|
160
|
-
if (!response.ok) throw new Error(
|
|
161
|
-
const
|
|
162
|
-
if (!
|
|
163
|
-
return
|
|
153
|
+
}, "application/jwt");
|
|
154
|
+
if (!response.ok) throw new Error(`PermDock Cloud refused to sign: HTTP ${String(response.status)}`);
|
|
155
|
+
const token = (await response.text()).trim();
|
|
156
|
+
if (!isCompactJws(token) || headerTyp(token) !== signOptions.typ) throw new Error(`PermDock Cloud returned a token that is not a ${signOptions.typ} JWS`);
|
|
157
|
+
return token;
|
|
164
158
|
},
|
|
165
|
-
async
|
|
159
|
+
async jwks() {
|
|
166
160
|
try {
|
|
167
|
-
const response = await request("/
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
});
|
|
171
|
-
if (!response.ok) return 0;
|
|
172
|
-
const body = await response.json();
|
|
173
|
-
if (!isRecord(body) || typeof body["expired"] !== "number") return 0;
|
|
174
|
-
return body["expired"];
|
|
161
|
+
const response = await connection.request("/.well-known/jwks.json", {}, "application/jwk-set+json");
|
|
162
|
+
const body = response.ok ? await response.json() : void 0;
|
|
163
|
+
return { keys: (isRecord(body) && Array.isArray(body["keys"]) ? body["keys"] : []).filter(isRecord) };
|
|
175
164
|
} catch {
|
|
176
|
-
return
|
|
165
|
+
return { keys: [] };
|
|
177
166
|
}
|
|
178
167
|
}
|
|
179
|
-
};
|
|
180
|
-
const capacity = options.capacity ?? 1e4;
|
|
181
|
-
const pending = [];
|
|
182
|
-
const bound = () => {
|
|
183
|
-
if (pending.length > capacity) pending.splice(0, pending.length - capacity);
|
|
184
|
-
};
|
|
185
|
-
const flush = async () => {
|
|
186
|
-
if (pending.length === 0) return;
|
|
187
|
-
const events = pending.splice(0);
|
|
188
|
-
try {
|
|
189
|
-
if (!(await request("/decisions", {
|
|
190
|
-
method: "POST",
|
|
191
|
-
body: JSON.stringify({ events })
|
|
192
|
-
})).ok) pending.unshift(...events);
|
|
193
|
-
} catch {
|
|
194
|
-
pending.unshift(...events);
|
|
195
|
-
}
|
|
196
|
-
bound();
|
|
197
|
-
};
|
|
198
|
-
const sink = {
|
|
199
|
-
write(events) {
|
|
200
|
-
pending.push(...events);
|
|
201
|
-
bound();
|
|
202
|
-
if (pending.length >= flushAt) return flush();
|
|
203
|
-
if (waitUntil !== void 0 && pending.length > 0) waitUntil(flush());
|
|
204
|
-
},
|
|
205
|
-
flush
|
|
206
|
-
};
|
|
207
|
-
const snapshots = { async get() {
|
|
208
|
-
const response = await request("/snapshot", {}, "application/jwt");
|
|
209
|
-
if (!response.ok) throw new Error("PermDock Cloud snapshot request failed");
|
|
210
|
-
const text = (await response.text()).trim();
|
|
211
|
-
if (!isCompactJws$1(text)) throw new Error("PermDock Cloud served an unsigned snapshot");
|
|
212
|
-
return text;
|
|
213
|
-
} };
|
|
214
|
-
let document = null;
|
|
215
|
-
return freezeDeep({
|
|
216
|
-
approvals,
|
|
217
|
-
sink,
|
|
218
|
-
snapshots,
|
|
219
|
-
policies: {
|
|
220
|
-
current() {
|
|
221
|
-
return document;
|
|
222
|
-
},
|
|
223
|
-
async refresh() {
|
|
224
|
-
const verifier = options.verifier;
|
|
225
|
-
if (verifier === void 0) return;
|
|
226
|
-
let response;
|
|
227
|
-
try {
|
|
228
|
-
response = await request("/policy");
|
|
229
|
-
} catch {
|
|
230
|
-
return;
|
|
231
|
-
}
|
|
232
|
-
if (response.status === 404) {
|
|
233
|
-
document = null;
|
|
234
|
-
return;
|
|
235
|
-
}
|
|
236
|
-
if (!response.ok) return;
|
|
237
|
-
const token = (await response.text()).trim();
|
|
238
|
-
if (!isCompactJws$1(token)) return;
|
|
239
|
-
const verified = await verifier.verify(token, {
|
|
240
|
-
typ: "permdock-policy+jwt",
|
|
241
|
-
issuer: root,
|
|
242
|
-
audience: root
|
|
243
|
-
});
|
|
244
|
-
if (!verified.ok) return;
|
|
245
|
-
let next;
|
|
246
|
-
try {
|
|
247
|
-
next = parsePolicyDocument(verified.claims["policy"]);
|
|
248
|
-
} catch {
|
|
249
|
-
return;
|
|
250
|
-
}
|
|
251
|
-
document = next;
|
|
252
|
-
}
|
|
253
|
-
},
|
|
254
|
-
issuer: root,
|
|
255
|
-
jwks
|
|
256
168
|
});
|
|
257
169
|
}
|
|
258
170
|
//#endregion
|
|
259
171
|
//#region src/cloud/webhook.ts
|
|
260
|
-
const TYPES = new Set(Object.values(CLOUD_EVENT_TYPES));
|
|
261
|
-
function hasUnsafeKey(value) {
|
|
262
|
-
if (Array.isArray(value)) return value.some(hasUnsafeKey);
|
|
263
|
-
if (!isRecord(value)) return false;
|
|
264
|
-
return Object.keys(value).some((key) => isForbiddenKey(key) || hasUnsafeKey(value[key]));
|
|
265
|
-
}
|
|
266
|
-
const FINDING_CODES = /* @__PURE__ */ new Set([
|
|
267
|
-
"permission-removed",
|
|
268
|
-
"not-hostable",
|
|
269
|
-
"grantee-removed",
|
|
270
|
-
"approval-tightened"
|
|
271
|
-
]);
|
|
272
|
-
function isFinding(value) {
|
|
273
|
-
return isRecord(value) && FINDING_CODES.has(value["code"]) && typeof value["permission"] === "string" && (value["grant"] === void 0 || typeof value["grant"] === "string");
|
|
274
|
-
}
|
|
275
|
-
function validData(type, data) {
|
|
276
|
-
switch (type) {
|
|
277
|
-
case "dev.permdock.decision": return data["type"] === "decision" && typeof data["permission"] === "string";
|
|
278
|
-
case "dev.permdock.approval": return data["type"] === "decision" && (data["phase"] === "requested" || data["phase"] === "resolved");
|
|
279
|
-
case "dev.permdock.directory": return data["type"] === "directory" && typeof data["tenant"] === "string";
|
|
280
|
-
case "dev.permdock.membership": return data["type"] === "membership" && isRecord(data["principal"]);
|
|
281
|
-
case "dev.permdock.credential": return data["type"] === "credential" && isRecord(data["credential"]) && typeof data["credential"]["id"] === "string" && (data["credential"]["kind"] === "user" || data["credential"]["kind"] === "service") && isRecord(data["principal"]) && (data["operation"] === "created" || data["operation"] === "used" || data["operation"] === "rotated" || data["operation"] === "revoked");
|
|
282
|
-
case "dev.permdock.catalog": return (data["kind"] === "publish" || data["kind"] === "drift") && typeof data["fingerprint"] === "string" && (data["previous"] === void 0 || typeof data["previous"] === "string") && (data["findings"] === void 0 || Array.isArray(data["findings"]) && data["findings"].every(isFinding));
|
|
283
|
-
case "dev.permdock.access.started":
|
|
284
|
-
case "dev.permdock.access.ended":
|
|
285
|
-
case "dev.permdock.access.revoked": return data["type"] === "access" && typeof data["tenant"] === "string" && isRecord(data["principal"]) && typeof data["principal"]["id"] === "string";
|
|
286
|
-
default: return type;
|
|
287
|
-
}
|
|
288
|
-
}
|
|
289
172
|
/**
|
|
290
|
-
* Validates one CloudEvent against the closed type list
|
|
291
|
-
* returns `null` for anything else, never throws.
|
|
173
|
+
* Validates one CloudEvent against the closed type list, its `dataschema` and
|
|
174
|
+
* its data shape; returns `null` for anything else, never throws.
|
|
292
175
|
*/
|
|
293
176
|
function parseCloudEvent(value) {
|
|
294
|
-
|
|
295
|
-
return freezeDeep(JSON.parse(JSON.stringify(value)));
|
|
177
|
+
return parseCloudEvent$1(value);
|
|
296
178
|
}
|
|
297
179
|
function verifierFor(options) {
|
|
298
180
|
if (options.verifier !== void 0) return options.verifier;
|
|
299
|
-
if (options.jwks === void 0) return;
|
|
181
|
+
if (options.replay === void 0 || options.jwks === void 0 && options.secret === void 0) return;
|
|
300
182
|
try {
|
|
301
|
-
return
|
|
302
|
-
jwks:
|
|
303
|
-
|
|
304
|
-
|
|
183
|
+
return webhookVerifier(compact({
|
|
184
|
+
jwks: options.jwks,
|
|
185
|
+
secret: options.secret,
|
|
186
|
+
replay: options.replay,
|
|
187
|
+
tolerance: options.tolerance,
|
|
188
|
+
now: options.now,
|
|
189
|
+
fetch: options.fetch
|
|
190
|
+
}));
|
|
305
191
|
} catch {
|
|
306
192
|
return;
|
|
307
193
|
}
|
|
308
194
|
}
|
|
309
|
-
function
|
|
310
|
-
|
|
195
|
+
function eventsOf(body) {
|
|
196
|
+
let parsed;
|
|
197
|
+
try {
|
|
198
|
+
parsed = JSON.parse(body);
|
|
199
|
+
} catch {
|
|
200
|
+
return null;
|
|
201
|
+
}
|
|
202
|
+
if (!Array.isArray(parsed)) {
|
|
203
|
+
const single = parseCloudEvent(parsed);
|
|
204
|
+
return single === null ? null : [single];
|
|
205
|
+
}
|
|
206
|
+
return parseCloudEventBatch(parsed);
|
|
311
207
|
}
|
|
312
208
|
/**
|
|
313
|
-
* Verifies a PermDock Cloud webhook delivery:
|
|
314
|
-
* `
|
|
315
|
-
* There is no unsigned mode, and it
|
|
209
|
+
* Verifies a PermDock Cloud webhook delivery: Standard Webhooks headers over
|
|
210
|
+
* an `application/cloudevents-batch+json` body (or one
|
|
211
|
+
* `application/cloudevents+json` event). There is no unsigned mode, and it
|
|
212
|
+
* never throws.
|
|
316
213
|
*/
|
|
317
214
|
async function verifyWebhook(request, options) {
|
|
318
|
-
let body;
|
|
319
|
-
try {
|
|
320
|
-
body = (await request.text()).trim();
|
|
321
|
-
} catch {
|
|
322
|
-
return {
|
|
323
|
-
ok: false,
|
|
324
|
-
reason: "unsigned"
|
|
325
|
-
};
|
|
326
|
-
}
|
|
327
|
-
if (!isCompactJws(body)) return {
|
|
328
|
-
ok: false,
|
|
329
|
-
reason: "unsigned"
|
|
330
|
-
};
|
|
331
215
|
const verifier = verifierFor(options);
|
|
332
216
|
if (verifier === void 0) return {
|
|
333
217
|
ok: false,
|
|
334
|
-
|
|
335
|
-
cause: "jwks-unavailable"
|
|
218
|
+
cause: "keys-unavailable"
|
|
336
219
|
};
|
|
337
|
-
|
|
338
|
-
try {
|
|
339
|
-
verified = await verifier.verify(body, {
|
|
340
|
-
typ: "permdock-decisions+jwt",
|
|
341
|
-
audience: options.audience
|
|
342
|
-
});
|
|
343
|
-
} catch {
|
|
344
|
-
return {
|
|
345
|
-
ok: false,
|
|
346
|
-
reason: "invalid-token",
|
|
347
|
-
cause: "malformed"
|
|
348
|
-
};
|
|
349
|
-
}
|
|
220
|
+
const verified = await verifier.verify(request);
|
|
350
221
|
if (!verified.ok) return {
|
|
351
222
|
ok: false,
|
|
352
|
-
reason: "invalid-token",
|
|
353
223
|
cause: verified.cause
|
|
354
224
|
};
|
|
355
|
-
const
|
|
356
|
-
|
|
357
|
-
if (typeof jti !== "string" || !Array.isArray(raw)) return {
|
|
225
|
+
const events = eventsOf(verified.body);
|
|
226
|
+
if (events === null) return {
|
|
358
227
|
ok: false,
|
|
359
|
-
|
|
228
|
+
cause: "invalid-events"
|
|
360
229
|
};
|
|
361
|
-
const events = [];
|
|
362
|
-
for (const item of raw) {
|
|
363
|
-
const parsed = parseCloudEvent(item);
|
|
364
|
-
if (parsed === null) return {
|
|
365
|
-
ok: false,
|
|
366
|
-
reason: "invalid-events"
|
|
367
|
-
};
|
|
368
|
-
events.push(parsed);
|
|
369
|
-
}
|
|
370
|
-
if (options.replay !== void 0) {
|
|
371
|
-
const key = `permdock-webhook:${jti}`;
|
|
372
|
-
const expiresAt = typeof verified.claims.exp === "number" ? verified.claims.exp : void 0;
|
|
373
|
-
try {
|
|
374
|
-
if (options.replay.claim === void 0) {
|
|
375
|
-
if (await options.replay.seen(key)) return {
|
|
376
|
-
ok: false,
|
|
377
|
-
reason: "replayed"
|
|
378
|
-
};
|
|
379
|
-
await options.replay.remember(key, expiresAt);
|
|
380
|
-
} else if (!await options.replay.claim(key, expiresAt)) return {
|
|
381
|
-
ok: false,
|
|
382
|
-
reason: "replayed"
|
|
383
|
-
};
|
|
384
|
-
} catch {
|
|
385
|
-
return {
|
|
386
|
-
ok: false,
|
|
387
|
-
reason: "replayed"
|
|
388
|
-
};
|
|
389
|
-
}
|
|
390
|
-
}
|
|
391
230
|
return freezeDeep({
|
|
392
231
|
ok: true,
|
|
393
|
-
id:
|
|
232
|
+
id: verified.id,
|
|
233
|
+
timestamp: verified.timestamp,
|
|
394
234
|
events
|
|
395
235
|
});
|
|
396
236
|
}
|
|
397
237
|
//#endregion
|
|
398
|
-
|
|
238
|
+
//#region src/cloud/waiter.ts
|
|
239
|
+
/** Polling the store is the fallback for a webhook this process never receives. */
|
|
240
|
+
const FALLBACK_INTERVAL = 6e4;
|
|
241
|
+
const WAKING = /* @__PURE__ */ new Set([
|
|
242
|
+
CLOUD_EVENT_TYPES.approvalResolved,
|
|
243
|
+
CLOUD_EVENT_TYPES.approvalExpired,
|
|
244
|
+
CLOUD_EVENT_TYPES.approvalCancelled
|
|
245
|
+
]);
|
|
246
|
+
/** The approval token of each event that ends a wait, in delivery order. */
|
|
247
|
+
function approvalTokensOf(events) {
|
|
248
|
+
return events.flatMap((event) => {
|
|
249
|
+
if (!WAKING.has(event.type)) return [];
|
|
250
|
+
const { data } = event;
|
|
251
|
+
return "token" in data && typeof data.token === "string" && data.token !== "" ? [data.token] : [];
|
|
252
|
+
});
|
|
253
|
+
}
|
|
254
|
+
function refusal(cause) {
|
|
255
|
+
switch (cause) {
|
|
256
|
+
case "keys-unavailable": return problemResponse(statusProblem(503, "the webhook signing keys are unavailable"));
|
|
257
|
+
case "invalid-events": return problemResponse(statusProblem(400, "the body is not a PermDock CloudEvents batch"));
|
|
258
|
+
case "missing-headers":
|
|
259
|
+
case "malformed":
|
|
260
|
+
case "timestamp-out-of-range": return problemResponse(statusProblem(400, `webhook verification failed: ${cause}`));
|
|
261
|
+
case "invalid-signature": return problemResponse(statusProblem(403, `webhook verification failed: ${cause}`));
|
|
262
|
+
case "replayed": return new Response(null, { status: 204 });
|
|
263
|
+
default: return cause;
|
|
264
|
+
}
|
|
265
|
+
}
|
|
266
|
+
/**
|
|
267
|
+
* An `ApprovalWaiter` that PermDock Cloud wakes. Mount `webhook` on the
|
|
268
|
+
* route the environment's webhook connector posts to: when an approval is
|
|
269
|
+
* resolved, expires or is cancelled, the parked run for its token wakes.
|
|
270
|
+
* Waking never approves anything. The run decides again with the token, and
|
|
271
|
+
* only the app's `decide` and its approval store can grant. Without
|
|
272
|
+
* `waiter`, waits poll `store` as a fallback for a webhook another process
|
|
273
|
+
* received.
|
|
274
|
+
*/
|
|
275
|
+
function cloudApprovalWaiter(options) {
|
|
276
|
+
const inner = options.waiter ?? pollingApprovalWaiter({
|
|
277
|
+
store: options.store,
|
|
278
|
+
interval: options.interval ?? FALLBACK_INTERVAL
|
|
279
|
+
});
|
|
280
|
+
const wake = async (token) => {
|
|
281
|
+
try {
|
|
282
|
+
await inner.wake(token);
|
|
283
|
+
} catch {}
|
|
284
|
+
};
|
|
285
|
+
return Object.freeze({
|
|
286
|
+
wait: inner.wait.bind(inner),
|
|
287
|
+
wake,
|
|
288
|
+
async webhook(request) {
|
|
289
|
+
const verified = await verifyWebhook(request, options);
|
|
290
|
+
if (!verified.ok) return refusal(verified.cause);
|
|
291
|
+
await Promise.all(approvalTokensOf(verified.events).map(wake));
|
|
292
|
+
return new Response(null, { status: 204 });
|
|
293
|
+
}
|
|
294
|
+
});
|
|
295
|
+
}
|
|
296
|
+
//#endregion
|
|
297
|
+
export { approvalTokensOf, cloud, cloudApprovalWaiter, cloudDeliveryTransport, cloudEndpoints, cloudSigner, parseCloudEvent, verifyWebhook };
|