permdock 0.3.1 → 0.5.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +37 -35
- package/dist/{openapi-schema--ARjyfQr.js → 2020-C9VN-x8c.js} +5 -132
- package/dist/a2a/index.d.ts +8 -6
- package/dist/a2a/index.js +21 -31
- package/dist/{adapter-context-mlWsVGGg.js → adapter-context-CRhqyzCk.js} +1 -1
- package/dist/adoption-scan-B4R5fnMU.js +107 -0
- package/dist/agent/index.d.ts +3 -0
- package/dist/agent/index.js +1 -0
- package/dist/ai-sdk/index.d.ts +18 -23
- package/dist/ai-sdk/index.js +38 -21
- package/dist/app-data-MuyzVqX8.js +60 -0
- package/dist/approval-header-CJACtHkv.js +23 -0
- package/dist/approval-prompt-Dg5LeAcT.js +62 -0
- package/dist/approval-prompt-Djo_PyZc.d.ts +57 -0
- package/dist/approvals/index.d.ts +5 -3
- package/dist/approvals/index.js +8 -5
- package/dist/approvals-DJ6Yd5z1.js +995 -0
- package/dist/{approvers-DT4AVyIg.js → approvers-CqPOLD-o.js} +1 -1
- package/dist/arazzo-B6lebmiQ.js +36 -0
- package/dist/{arazzo-BAgw9ap6.js → arazzo-BWhNF-k0.js} +24 -17
- package/dist/args-IIolxxKA.js +197 -0
- package/dist/astro/index.d.ts +43 -0
- package/dist/astro/index.js +27 -0
- package/dist/audience-Dg8XsRaO.js +55 -0
- package/dist/auth-DRLEizbL.js +178 -0
- package/dist/authzen/index.d.ts +26 -6
- package/dist/authzen/index.js +228 -75
- package/dist/automation-BMZPIVUM.d.ts +114 -0
- package/dist/automation-DVjOckjV.js +157 -0
- package/dist/better-auth/index.d.ts +8 -6
- package/dist/better-auth/index.js +11 -23
- package/dist/better-supabase/index.d.ts +438 -86
- package/dist/better-supabase/index.js +1027 -184
- package/dist/bind--9EFVYWF.d.ts +38 -0
- package/dist/{bind-CuzGytRf.js → bind-CZzhx-Vj.js} +22 -10
- package/dist/body-CH5of8Ne.js +10 -0
- package/dist/body-text-QcXok_SI.js +52 -0
- package/dist/build-instance-BMnAudHn.js +52 -0
- package/dist/{canonical-json-DemiK4Vp.js → canonical-json-BC8_nMTw.js} +6 -6
- package/dist/{capability-2kYTMWDv.d.ts → capability-BSslw1QV.d.ts} +44 -25
- package/dist/{capability-4qPdO9gk.js → capability-N1K9IpqS.js} +69 -42
- package/dist/casbin-Cr7RLtA3.js +30 -0
- package/dist/casbin-Dyu2gnUD.js +234 -0
- package/dist/casl-64gpT-8x.js +24 -0
- package/dist/casl-DjEDhTCP.js +299 -0
- package/dist/catalog/index.d.ts +74 -2
- package/dist/catalog/index.js +51 -2
- package/dist/catalog-BECMPrwc.js +100 -0
- package/dist/catalog-DjhMYYCq.js +1 -0
- package/dist/catalog-R_A__RsH.js +52 -0
- package/dist/{catalog-doc-DdGm82XT.js → catalog-doc-C9wjsfNY.js} +54 -25
- package/dist/catalog-fingerprint-CCP0-yQS.js +153 -0
- package/dist/chat/index.d.ts +2 -0
- package/dist/chat/index.js +224 -0
- package/dist/chat-sdk/index.d.ts +87 -0
- package/dist/chat-sdk/index.js +197 -0
- package/dist/claims-map-7oQ3ue4X.js +13 -0
- package/dist/claims-map-Ca-QX8C6.d.ts +32 -0
- package/dist/claude-agent/index.d.ts +7 -14
- package/dist/claude-agent/index.js +26 -30
- package/dist/clerk/index.d.ts +9 -8
- package/dist/clerk/index.js +15 -45
- package/dist/cli/bin.js +36 -17
- package/dist/cli/index.d.ts +20 -6
- package/dist/cli/index.js +164 -4
- package/dist/cloud/index.d.ts +102 -63
- package/dist/cloud/index.js +240 -347
- package/dist/cloud-CIoHNevm.js +87 -0
- package/dist/codemod-Bmj9dWMH.js +37 -0
- package/dist/codemod-Cxvvc70T.js +2084 -0
- package/dist/{collect-DSTE3ml9.js → collect-CrZJJnEF.js} +79 -17
- package/dist/collect-DloHbDVa.js +55 -0
- package/dist/collect-FlXJlhus.js +1 -0
- package/dist/command-L8EstFNm.js +6 -0
- package/dist/{compact-y6vfu2_f.js → compact-CAf557ZB.js} +11 -1
- package/dist/compile/index.d.ts +1 -1
- package/dist/compile/index.js +1 -2
- package/dist/{compile-Ba4blROR.js → compile-CMqMx_IN.js} +13 -9
- package/dist/{compile-BkRyBDBw.d.ts → compile-Ckm2HqBZ.d.ts} +5 -3
- package/dist/completion-BqhRBJD8.js +143 -0
- package/dist/config-B46rm9sc.js +26 -0
- package/dist/{config-BJiM-xAm.js → config-bs_kZeYq.js} +15 -10
- package/dist/{config-report-CdCgbRnV.js → config-report-DUgj62Ai.js} +17 -8
- package/dist/{connection-CU8MQxRi.js → connection-DjhIJSs2.js} +8 -6
- package/dist/constants-DcJABbLW.js +20 -0
- package/dist/{context-Bcy85rGi.js → context-bbFHR-0D.js} +16 -5
- package/dist/convex/index.d.ts +11 -10
- package/dist/convex/index.js +18 -18
- package/dist/create-0VZ7Pdiu.d.ts +107 -0
- package/dist/create-BDS7wc3y.d.ts +138 -0
- package/dist/create-BFfm17UA.d.ts +110 -0
- package/dist/create-BWRSXgOF.js +403 -0
- package/dist/create-C3b4B5eF.js +130 -0
- package/dist/create-DnrmLnLW.js +323 -0
- package/dist/{credential-8P81ff4u.js → credential-DM2um3ha.js} +153 -32
- package/dist/credentials-DPyHmYz5.js +74 -0
- package/dist/deciding-columns-Sq12mEA6.js +123 -0
- package/dist/delegation-DaXVdDhM.js +286 -0
- package/dist/delegation-input-FTxMK3ji.js +19 -0
- package/dist/delivery/index.d.ts +5 -0
- package/dist/delivery/index.js +5 -0
- package/dist/delivery-DCAgNyCn.js +499 -0
- package/dist/delivery-event-xX4obB8F.js +40 -0
- package/dist/denied-text-D8jDHgsl.d.ts +19 -0
- package/dist/{describe-DMYiCjJV.d.ts → describe-BZUsixiL.d.ts} +11 -2
- package/dist/{describe-B_gVZEVi.js → describe-BybMRY7A.js} +10 -5
- package/dist/device-BARQ8eYG.js +193 -0
- package/dist/diff-CxZo9pTq.js +37 -0
- package/dist/{diff-2VaeChzX.js → diff-DCePiN6M.js} +61 -55
- package/dist/doctor-CxiwSfqH.js +44 -0
- package/dist/doctor-DFjUxf2f.js +2361 -0
- package/dist/drizzle/index.d.ts +5 -3
- package/dist/drizzle/index.js +6 -14
- package/dist/elysia/index.d.ts +16 -13
- package/dist/elysia/index.js +14 -13
- package/dist/env-DJZrPjRi.js +8 -0
- package/dist/errors-BDUwg2qC.js +27 -0
- package/dist/{errors-Cz5zn0mW.js → errors-BKy0EfhN.js} +6 -10
- package/dist/errors-BWXBMaKK.d.ts +11 -0
- package/dist/{errors-DPdqI50v.d.ts → errors-C2PXIv4c.d.ts} +2 -2
- package/dist/errors-CWTY6uih.js +143 -0
- package/dist/evaluate-_R8QkWaf.js +1732 -0
- package/dist/evaluations-16UqqQ6W.d.ts +32 -0
- package/dist/{evaluations-tz6D9A2G.js → evaluations-DZ2CbV5k.js} +181 -32
- package/dist/eve/index.d.ts +12 -16
- package/dist/eve/index.js +23 -29
- package/dist/event-time-CsegxXxB.js +23 -0
- package/dist/expiry-D4_YKRKD.js +52 -0
- package/dist/express/index.d.ts +13 -10
- package/dist/express/index.js +14 -12
- package/dist/fastify/index.d.ts +26 -13
- package/dist/fastify/index.js +17 -36
- package/dist/fetch-adapter-g0ypLkID.js +120 -0
- package/dist/fetch-adapter-qKJBuRqy.d.ts +31 -0
- package/dist/fields-D9tPVUUS.js +203 -0
- package/dist/files-C5ZI27eV.js +124 -0
- package/dist/{files-DWUN9PzI.js → files-D_JIzUrP.js} +12 -3
- package/dist/{fixtures-ht28Cplr.js → fixtures-B7XrLeY7.js} +12 -12
- package/dist/flags-C3DktBDY.js +86 -0
- package/dist/{from-snapshot-CTLijvdm.js → from-snapshot-D2lZt4Dd.js} +78 -65
- package/dist/{generate-CH7ThJ14.js → generate-CNU1pIOo.js} +1 -3
- package/dist/grantee-Cn1HyUsI.js +254 -0
- package/dist/grantee-conditions-CcXf8hMM.js +271 -0
- package/dist/grantee-match-DHArqY82.js +142 -0
- package/dist/h3/index.d.ts +37 -0
- package/dist/h3/index.js +35 -0
- package/dist/headers-BIjfMaoC.js +8 -0
- package/dist/headers-CIbDTUTK.d.ts +7 -0
- package/dist/{helpers-H_KARDVC.js → helpers-DTcZOzhF.js} +47 -39
- package/dist/hono/index.d.ts +12 -9
- package/dist/hono/index.js +14 -13
- package/dist/{hosted-DJQw46hn.js → hosted-BZIAYvon.js} +64 -15
- package/dist/hosted-DBDX0M-P.d.ts +78 -0
- package/dist/{http-SO7qGttf.js → http-BBoKefeS.js} +35 -2
- package/dist/{http-DPuDaChb.d.ts → http-B_LphE5Y.d.ts} +1 -2
- package/dist/http-DXJ37RDA.js +46 -0
- package/dist/{http-BIhmLfCc.js → http-ujKm0JXE.js} +3 -26
- package/dist/{openapi-import-cmwetbzw.js → import-CNV7I2Dw.js} +30 -26
- package/dist/{rls-import-4lLW_pbb.js → import-DMmOG27O.js} +271 -128
- package/dist/index-BcHcPyIo.d.ts +110 -0
- package/dist/index-CaxrMD1A.d.ts +1 -0
- package/dist/index-Chrs5fQ-.d.ts +210 -0
- package/dist/index-CxGUswIC.d.ts +431 -0
- package/dist/index-D8EovfsP.d.ts +91 -0
- package/dist/index-DOVf7RJv.d.ts +900 -0
- package/dist/{index-C8z4RjQV.d.ts → index-SGdIQyzc.d.ts} +34 -16
- package/dist/index.d.ts +20 -14
- package/dist/index.js +33 -23
- package/dist/init-DeMYsnYJ.js +96 -0
- package/dist/init-GG6Jh8HD.js +95 -0
- package/dist/{instance-options-jARdwfPN.d.ts → instance-options-Omfd793B.d.ts} +2 -2
- package/dist/instance-snapshot-Cxq4ygFc.js +600 -0
- package/dist/instant-BluqDvyS.js +19 -0
- package/dist/internals-Dk8A8fX3.js +17 -0
- package/dist/{json-schema-BsAflUGW.js → json-schema-B-vAwlde.js} +46 -9
- package/dist/json-schema-CN_iLFH2.d.ts +40 -0
- package/dist/jwt/index.d.ts +18 -11
- package/dist/jwt/index.js +166 -145
- package/dist/{kernel-_RRHmnMY.js → kernel-5JatXyND.js} +120 -43
- package/dist/kysely/index.d.ts +5 -3
- package/dist/kysely/index.js +6 -14
- package/dist/{live-options-H2eG8dfJ.js → live-options-BaAFCIiu.js} +16 -3
- package/dist/load-BxEtwlBS.js +1 -0
- package/dist/{load-DhWEB9P1.js → load-DFS_ry0W.js} +31 -7
- package/dist/{load-jose-BL6LH4bL.js → load-jose-DZ4dnjri.js} +1 -4
- package/dist/login-Dfe5RlYk.js +68 -0
- package/dist/login-imhuwvn3.js +254 -0
- package/dist/manifest-C8IzW3Do.js +42 -0
- package/dist/manifest-CtKR3GXL.js +370 -0
- package/dist/manifest-json-CAGzls-C.js +9 -0
- package/dist/{manifest-uDS9y5de.d.ts → manifest-mx5ghSFM.d.ts} +9 -2
- package/dist/manifest-schema-C0kK_8V0.js +399 -0
- package/dist/{map-claims-Z4QZOiFF.js → map-claims-D3oRmTk0.js} +19 -25
- package/dist/{map-error-pgUWNNtG.js → map-error-TCAdw-eW.js} +5 -5
- package/dist/{markers-B0hYLvMD.js → markers-C6joDI3o.js} +8 -3
- package/dist/mcp/index.d.ts +36 -9
- package/dist/mcp/index.js +476 -448
- package/dist/{rls-migrate-CN4TlJTO.js → migrate-BShP7Vf4.js} +119 -20
- package/dist/nest/index.d.ts +12 -9
- package/dist/nest/index.js +20 -20
- package/dist/next/index.d.ts +40 -20
- package/dist/next/index.js +37 -39
- package/dist/next/plugin.d.ts +1 -1
- package/dist/next/plugin.js +2 -2
- package/dist/node/index.d.ts +10 -10
- package/dist/node/index.js +7 -9
- package/dist/ocsf-BFp-PZZA.js +126 -0
- package/dist/openai/index.d.ts +9 -16
- package/dist/openai/index.js +18 -25
- package/dist/openapi/index.d.ts +3 -3
- package/dist/openapi/index.js +1 -1
- package/dist/{openapi-BqRBvAng.js → openapi-B7HZ0f-r.js} +9 -12
- package/dist/{openapi-CqqEbHsL.js → openapi-DTaEmTSW.js} +23 -26
- package/dist/openapi-ahr8rHu3.js +138 -0
- package/dist/operation-findings-DgATDpvh.js +36 -0
- package/dist/operations-CxybZErY.d.ts +59 -0
- package/dist/orpc/index.d.ts +13 -10
- package/dist/orpc/index.js +23 -20
- package/dist/otel/index.d.ts +3 -2
- package/dist/otel/index.js +53 -27
- package/dist/output-Dyw8fyPF.js +88 -0
- package/dist/output-files-B3IZJksC.js +1 -0
- package/dist/output-files-DhRBBE4n.js +138 -0
- package/dist/{rls-fields-CZOMlwHl.js → ownership-BatFgAA4.js} +2393 -2349
- package/dist/{package-root-zGkxO3oN.js → package-root-Dk_ETdkp.js} +4 -3
- package/dist/{parse-BuyjxhZV.js → parse-Cxq0WxrA.js} +3 -3
- package/dist/{parse-local-manifest-BrMozJCo.js → parse-local-manifest-CVSs6J9I.js} +2 -4
- package/dist/{parse-local-manifest-JLnaBH0S.d.ts → parse-local-manifest-DgqtruPn.d.ts} +1 -1
- package/dist/parse-request-D_tUXG6M.js +26 -0
- package/dist/paths-DXSHAMIa.js +42 -0
- package/dist/pdp/index.d.ts +7 -3
- package/dist/pdp/index.js +47 -29
- package/dist/{peer-BOr_kJE1.js → peer-C8swJ2GH.js} +23 -4
- package/dist/peer-CRvC7Hg1.js +1 -0
- package/dist/permdock-B9JxkBwC.js +868 -0
- package/dist/permdock-D7eeLJER.d.ts +502 -0
- package/dist/permission-registry-Br4jSNVi.js +385 -0
- package/dist/permissions-B-wCP5ZC.js +30 -0
- package/dist/{permissions-RJrovw98.js → permissions-CZKiUfFM.js} +4 -3
- package/dist/{permissions-CDgvKG5L.d.ts → permissions-oEWfl-kl.d.ts} +1 -2
- package/dist/policies-CO1oOymN.js +295 -0
- package/dist/{policy-D2W7uv19.d.ts → policy-Czo4n3Hs.d.ts} +2 -2
- package/dist/policy-DLZJ5gAp.js +399 -0
- package/dist/policy-from-catalog-DzhEc3Y9.js +450 -0
- package/dist/policy-module-CTlwMvLI.js +89 -0
- package/dist/{policy-IB6yxpC3.d.ts → policy-types-DzwivBgR.d.ts} +939 -1057
- package/dist/postgrest-CW0IqC-U.js +566 -0
- package/dist/postgrest-NUqZT-RB.d.ts +100 -0
- package/dist/powersync-BHfuehf3.js +62 -0
- package/dist/powersync-CbzkqL_M.js +1 -0
- package/dist/{powersync-Dv1_aWF7.js → powersync-bYUDLOAO.js} +30 -32
- package/dist/preset/index.d.ts +146 -0
- package/dist/preset/index.js +1 -0
- package/dist/preset-DZdU0tne.js +1768 -0
- package/dist/principal-source-pHneukrx.js +103 -0
- package/dist/prisma/index.d.ts +6 -3
- package/dist/prisma/index.js +6 -12
- package/dist/{problem-B43ztKIm.js → problem-CTviyH5L.js} +18 -27
- package/dist/{problem-details-DX075l9V.d.ts → problem-details-DXlt-vks.d.ts} +1 -1
- package/dist/{problem-details-_AMOYz-w.js → problem-details-cn5X30gZ.js} +45 -42
- package/dist/problem-types-CJ2325SZ.js +5 -0
- package/dist/{prompt-CXYhLfsS.js → prompt-DfZLJLIn.js} +2 -2
- package/dist/protected-DEPHc2xV.d.ts +38 -0
- package/dist/{protected-utU-SLuy.js → protected-DfjY5mLA.js} +37 -8
- package/dist/{provider-CSQd7m92.js → provider-CC-u3bYP.js} +23 -10
- package/dist/{provider-DZY281jO.d.ts → provider-DMVt6yYn.d.ts} +1 -1
- package/dist/{provider-store-Cfbvo4DE.js → provider-store-B5Yrkhzr.js} +6 -3
- package/dist/pull-BgIfno6w.js +256 -0
- package/dist/pull-ByOks_Tg.js +1 -0
- package/dist/push-CmFVBOeI.js +116 -0
- package/dist/pushed-policy-BImMTTIM.d.ts +57 -0
- package/dist/pushed-policy-DobP7AHI.js +238 -0
- package/dist/react/index.d.ts +8 -8
- package/dist/react/index.js +6 -6
- package/dist/react/provider-client.d.ts +1 -1
- package/dist/react/provider-client.js +1 -2
- package/dist/react-native/index.d.ts +24 -63
- package/dist/react-native/index.js +45 -27
- package/dist/{refs-KYb4ntaz.js → refs-K6eWUJ0H.js} +1 -1
- package/dist/relation-walk-3OyDBF0S.js +186 -0
- package/dist/relations-BnCWnJGI.js +163 -0
- package/dist/renames-CGj7YwcQ.js +175 -0
- package/dist/{replay-CYyiLiwO.d.ts → replay-D7iKcLFe.d.ts} +1 -1
- package/dist/{replay-BsOyTrdV.js → replay-Du1tJjG7.js} +2 -1
- package/dist/request-context-BTRTG7OT.js +71 -0
- package/dist/request-context-C2_1lchh.d.ts +5 -0
- package/dist/request-schema-CMreVuFM.js +148 -0
- package/dist/resend/index.d.ts +126 -0
- package/dist/resend/index.js +379 -0
- package/dist/resource-relations-D_jw0BFx.js +243 -0
- package/dist/retire-CALjIQ7e.js +240 -0
- package/dist/{revocations-Cy06JNx2.d.ts → revocations-R07lFBnX.d.ts} +2 -0
- package/dist/rls-BA8an5Ap.js +336 -0
- package/dist/{rls-DiinlRML.js → rls-j6t43t7n.js} +1066 -1068
- package/dist/role-builder-CXbis5-X.js +623 -0
- package/dist/{rpc-DL9Sqvb1.js → rpc-aPyNi6tA.js} +18 -8
- package/dist/run-CNsApDpd.js +1 -0
- package/dist/run-DOfMtc9V.js +723 -0
- package/dist/run-ticket-BjhTOi6u.d.ts +124 -0
- package/dist/run-ticket-sxFI6LAk.js +337 -0
- package/dist/{runtime-CB8gQFvS.js → runtime-D3VTAiCA.js} +1 -1
- package/dist/{saas-DhpJjnBA.js → saas-FO-Q8oj0.js} +18 -15
- package/dist/scan-BOI5tJ-6.js +29 -0
- package/dist/{schema-D3MnDMxa.js → schema-B4v0Qrac.js} +106 -10
- package/dist/schema-yLuBWWsh.js +130 -0
- package/dist/scim/index.d.ts +2 -2
- package/dist/scim/index.js +1 -2
- package/dist/{scim-BFGBBAqR.js → scim-ClHtpyV3.js} +213 -87
- package/dist/{scopes-CVdPrWN-.js → scopes-CUPSjo9q.js} +20 -7
- package/dist/server/index.d.ts +13 -134
- package/dist/server/index.js +13 -10
- package/dist/server-DqCT4CgZ.js +453 -0
- package/dist/{create-B1d519XK.d.ts → server-types-BLd4MnBX.d.ts} +89 -70
- package/dist/{sha256-BO0swRXL.js → sha256-D9ihqmvd.js} +8 -1
- package/dist/shared-CD11nBbC.js +304 -0
- package/dist/{shared-DRu8VFVM.js → shared-DvvFzYXe.js} +8 -9
- package/dist/signals-D3NcTKUS.js +32 -0
- package/dist/sink-BEZSlMS_.js +957 -0
- package/dist/sink-Bj_lDUDq.d.ts +225 -0
- package/dist/{skills-Biq5uup3.js → skills-B6lVdD_W.js} +16 -8
- package/dist/skills-CTYwkl44.js +51 -0
- package/dist/snapshot-CXUWfsNy.js +269 -0
- package/dist/{snapshot-cache-D6jLelln.js → snapshot-cache-DZHQ0KF6.js} +11 -5
- package/dist/{snapshot-cache-B-LxUahj.d.ts → snapshot-cache-DqK9eDmM.d.ts} +7 -5
- package/dist/solid/index.d.ts +24 -25
- package/dist/solid/index.js +41 -11
- package/dist/solid-start/index.d.ts +52 -0
- package/dist/solid-start/index.js +49 -0
- package/dist/{sources-BdOYLw9j.d.ts → sources-BV9j0DeZ.d.ts} +11 -13
- package/dist/{sources-4p0-4xQm.js → sources-vs5dGOsS.js} +147 -142
- package/dist/sql-B5T1IL83.js +55 -0
- package/dist/src-DLfUWFAI.js +1851 -0
- package/dist/ssf/index.d.ts +4 -4
- package/dist/ssf/index.js +440 -106
- package/dist/standard-webhooks-6lg8v_is.d.ts +88 -0
- package/dist/standard-webhooks-DgFFD-Ga.js +228 -0
- package/dist/storage-C2bWdvJH.js +132 -0
- package/dist/{store-DMAWwAJV.js → store-4u_hxjWa.js} +42 -55
- package/dist/{store-options-ByhZq1jV.js → store-options-BqEakYRa.js} +38 -24
- package/dist/{stores-BT2pSCub.js → stores-BbsD4fAR.js} +7 -3
- package/dist/stores-ClZUgeoP.d.ts +30 -0
- package/dist/{stream-D1RXubw2.d.ts → stream-7-xmnf3U.d.ts} +2 -2
- package/dist/{stream-DDpvynSB.js → stream-CvdUS9V1.js} +10 -2
- package/dist/style-DiKWnAvn.js +1 -0
- package/dist/{style-CTm1AXDT.js → style-Uao76wO7.js} +3 -2
- package/dist/subject-BGoM5o8B.js +17 -0
- package/dist/{subject-settings-BwBmCdTR.js → subject-settings-CkEwrw3W.js} +23 -5
- package/dist/supabase/index.d.ts +23 -106
- package/dist/supabase/index.js +5 -4
- package/dist/supabase/middleware.d.ts +13 -6
- package/dist/supabase/middleware.js +16 -11
- package/dist/supabase-9pqI57pW.js +92 -0
- package/dist/{supabase-C0qESOa-.js → supabase-Dxlp8A94.js} +124 -247
- package/dist/supabase-hook-CXcGpHqq.js +1 -0
- package/dist/{supabase-hook-ntETYCQu.js → supabase-hook-DdDQhMlw.js} +1659 -819
- package/dist/{supautils-u8jXTGrt.js → supautils-B6HYL9eL.js} +2 -2
- package/dist/support-session-C6xJQYut.js +158 -0
- package/dist/svelte/Protected.svelte +11 -4
- package/dist/svelte/index.d.ts +7 -7
- package/dist/svelte/index.js +26 -12
- package/dist/svelte/runtime.d.ts +10 -3
- package/dist/svelte/runtime.js +4 -3
- package/dist/svelte/source.d.ts +7 -7
- package/dist/svelte/source.js +5 -5
- package/dist/sveltekit/index.d.ts +51 -0
- package/dist/sveltekit/index.js +27 -0
- package/dist/tanstack-start/index.d.ts +51 -0
- package/dist/tanstack-start/index.js +40 -0
- package/dist/target-Bw37TFNA.js +51 -0
- package/dist/{validity-uOp8UpYn.js → tenancy-DN2QAx9z.js} +6 -42
- package/dist/terminal/index.d.ts +11 -9
- package/dist/terminal/index.js +36 -316
- package/dist/testing/index.d.ts +391 -106
- package/dist/testing/index.js +4574 -1286
- package/dist/testing/saas/index.d.ts +9 -8
- package/dist/testing/saas/index.js +2 -2
- package/dist/testing/saas/permissions.d.ts +1 -1
- package/dist/testing/saas/permissions.js +1 -2
- package/dist/text-BMFRfBqc.js +8 -0
- package/dist/{text-diff-BdkkYSbi.js → text-diff-BQcUapOb.js} +1 -1
- package/dist/thenable-yD7SabqG.js +31 -0
- package/dist/time-DkWjdL98.js +71 -0
- package/dist/{token-CIWxJOCh.js → token-BLZcjQgt.js} +15 -6
- package/dist/tool-refusal-CMLN5xhn.js +41 -0
- package/dist/trpc/index.d.ts +12 -9
- package/dist/trpc/index.js +18 -17
- package/dist/{types-DbjRN55U.d.ts → types-5Ut_pbKy.d.ts} +141 -13
- package/dist/types-BNORmDM8.d.ts +172 -0
- package/dist/types-BjV-fqcA.d.ts +57 -0
- package/dist/{types-QCuYJh4q.d.ts → types-BqAKcRNW.d.ts} +2 -1
- package/dist/types-C8-KNsFf.d.ts +107 -0
- package/dist/{types-aqOHTHcp.d.ts → types-CCpc2Dcv.d.ts} +77 -17
- package/dist/{types-Dnemwd77.d.ts → types-CZTnPFzM.d.ts} +50 -11
- package/dist/{types-C97IskBw.d.ts → types-CdlxsYQh.d.ts} +23 -11
- package/dist/{types-DxiCGmmd.d.ts → types-ClZaWzfb.d.ts} +9 -6
- package/dist/types-DX0LaKTb.d.ts +157 -0
- package/dist/types-DiQjupG2.d.ts +332 -0
- package/dist/types-DqzsnlSA.js +67 -0
- package/dist/types-_sHy8BQf.d.ts +65 -0
- package/dist/types-fbZ7JEXr.d.ts +89 -0
- package/dist/types-tIgIeIKJ.d.ts +66 -0
- package/dist/unplugin/index.d.ts +1 -1
- package/dist/unplugin/index.js +2 -2
- package/dist/usage-CHOtwL19.js +1 -0
- package/dist/usage-DHtE8j4E.js +32 -0
- package/dist/{usage-ItS7nLcl.js → usage-T5mXq98v.js} +56 -13
- package/dist/{validation-error-Ba264OaJ.d.ts → validation-error-Bg5Tpluk.d.ts} +1 -1
- package/dist/{validation-error-CnjZ4t92.js → validation-error-ZfUHbKvf.js} +1 -1
- package/dist/validity-CZ7-y0Cj.js +79 -0
- package/dist/{verifier-BxBo6I44.js → verifier-DHuh-okk.js} +68 -21
- package/dist/verify-DbCL9bnB.js +1770 -0
- package/dist/{version-BvacVTZR.js → version-CEbQ5UeM.js} +4 -3
- package/dist/version-DXkYUISx.js +1 -0
- package/dist/{views-Soe7bGSC.js → views-DTIIO-oQ.js} +41 -2
- package/dist/{permissions-DttnqqxC.d.ts → vocabulary-D6lPdb4Z.d.ts} +120 -29
- package/dist/vue/index.d.ts +25 -21
- package/dist/vue/index.js +25 -9
- package/dist/waiter-BGUtGYoU.js +67 -0
- package/dist/waiter-CKy4MQSY.d.ts +36 -0
- package/dist/watch-Cb-NcaUw.js +1 -0
- package/dist/{watch-DVBJ9cBq.js → watch-CszoTJMq.js} +47 -8
- package/dist/webmcp/index.d.ts +2 -2
- package/dist/webmcp/index.js +13 -37
- package/dist/where-scope-Dv-WTP-w.js +306 -0
- package/dist/who-can-D0QoYbEb.js +364 -0
- package/dist/wire-delegation-Cv3W2eaM.js +36 -0
- package/dist/wire-denial-C7PaVYEM.js +27 -0
- package/dist/workflow/index.d.ts +5 -0
- package/dist/workflow/index.js +223 -0
- package/dist/workflow-sdk/index.d.ts +56 -0
- package/dist/workflow-sdk/index.js +78 -0
- package/dist/wrap-Bd1Tejur.d.ts +15 -0
- package/dist/wrap-gX61EtpB.js +27 -0
- package/package.json +140 -41
- package/schemas/access-event-v1.json +118 -0
- package/schemas/approval-request-v1.json +34 -1
- package/schemas/approval-signature-v1.json +94 -0
- package/schemas/automation-event-v1.json +113 -0
- package/schemas/capability-v1.json +84 -0
- package/schemas/catalog-event-v1.json +87 -0
- package/schemas/catalog-v1.json +129 -12
- package/schemas/cli-commands-v1.json +164 -0
- package/schemas/cli-result-v1.json +96 -0
- package/schemas/cloud-api-v1.json +5407 -0
- package/schemas/connector-v1.json +408 -0
- package/schemas/credential-event-v1.json +81 -0
- package/schemas/credential-v1.json +134 -0
- package/schemas/decision-event-v1.json +288 -0
- package/schemas/delivery-event-v1.json +117 -0
- package/schemas/directory-event-v1.json +85 -0
- package/schemas/evidence-export-v1.json +54 -0
- package/schemas/membership-event-v1.json +93 -0
- package/schemas/policy-v1.json +68 -0
- package/schemas/pushed-policy-v1.json +236 -0
- package/schemas/run-v1.json +162 -0
- package/schemas/snapshot-v1.json +138 -0
- package/schemas/supabase-claims-v1.json +4 -4
- package/schemas/supabase-manifest-v1.json +5 -1
- package/schemas/support-session-v1.json +111 -0
- package/skills/permdock/SKILL.md +16 -12
- package/skills/permdock-agents/SKILL.md +40 -23
- package/skills/permdock-agents/references/operations-automations-chat.md +221 -0
- package/skills/permdock-agents/references/runtimes.md +22 -18
- package/skills/permdock-approvals/SKILL.md +29 -13
- package/skills/permdock-approvals/references/delivery-and-waiters.md +172 -0
- package/skills/permdock-approvals/references/stores-and-resume.md +21 -7
- package/skills/permdock-audit/SKILL.md +3 -3
- package/skills/permdock-credentials/SKILL.md +5 -5
- package/skills/permdock-credentials/references/tokens-keys-links.md +19 -10
- package/skills/permdock-data/SKILL.md +6 -6
- package/skills/permdock-data/references/queries-and-rls.md +13 -8
- package/skills/permdock-data/references/relationships.md +3 -3
- package/skills/permdock-tenancy/SKILL.md +20 -7
- package/skills/permdock-tenancy/references/contacts-and-support-sessions.md +122 -0
- package/skills/permdock-tenancy/references/ownership-and-custom-roles.md +6 -4
- package/skills/permdock-wire/SKILL.md +18 -12
- package/skills/permdock-wire/references/adapters.md +146 -50
- package/skills/permdock-wire/references/policy-options.md +15 -6
- package/skills/permdock-wire/references/presets-and-recipes.md +58 -0
- package/dist/approvals-DbYAuNkG.js +0 -224
- package/dist/arazzo-C9chp3ST.js +0 -54
- package/dist/bind-C_ob3LKa.d.ts +0 -25
- package/dist/catalog-CRW5Mx_B.js +0 -2
- package/dist/catalog-CYj-mX2O.js +0 -48
- package/dist/catalog-DWF5cYqB.js +0 -55
- package/dist/cloud-CfwZ39Rl.js +0 -50
- package/dist/cloud-DWLXO2af.js +0 -118
- package/dist/collect-CHB22Sx4.js +0 -83
- package/dist/collect-DSWOk19R.js +0 -2
- package/dist/commands-BeaGNj_o.js +0 -97
- package/dist/config-ir40y8m0.js +0 -36
- package/dist/create-CMwIl-w2.js +0 -253
- package/dist/delegation-D8pUEuce.js +0 -103
- package/dist/diff-C9RDjjhs.js +0 -48
- package/dist/doctor-Djh6JDEk.js +0 -53
- package/dist/doctor-DvH0IQff.js +0 -1194
- package/dist/doctor-collect-CjdO0wQX.js +0 -665
- package/dist/duration-xK2jGFVc.js +0 -25
- package/dist/errors-CWfoNg9N.js +0 -47
- package/dist/errors-DRnGZHzF.js +0 -30
- package/dist/evaluation-items-CfCCejQd.js +0 -40
- package/dist/expiry-BoBJ8Tvc.js +0 -7
- package/dist/fields-BMl1RxoX.js +0 -26
- package/dist/grantee-Cv5Sogfv.js +0 -602
- package/dist/headers-BZSDieNT.js +0 -6
- package/dist/headers-Cf-zWvsO.d.ts +0 -6
- package/dist/ids-DC4V4CFu.js +0 -18
- package/dist/index-0nNqHspG.d.ts +0 -6
- package/dist/index-BNc7Wer_.d.ts +0 -483
- package/dist/index-C7Tw7MaW.d.ts +0 -201
- package/dist/instance-options-Dhhcnm3y.js +0 -22
- package/dist/load-DwJUafYN.js +0 -2
- package/dist/manifest-iaoBXHKc.js +0 -783
- package/dist/map-AcxK9o_D.js +0 -147
- package/dist/may-use-DndQ5tQ-.js +0 -77
- package/dist/openapi-CQTsgKoB.js +0 -164
- package/dist/permdock-CbgvLnuo.js +0 -3479
- package/dist/permissions-DVoF6dMt.js +0 -662
- package/dist/policy-xyWg7QdR.js +0 -1122
- package/dist/powersync-CrBX8hY6.js +0 -2
- package/dist/powersync-DE19b9dT.js +0 -62
- package/dist/protected-BdnIEFkY.d.ts +0 -27
- package/dist/protected-xAr24FEC.d.ts +0 -40
- package/dist/relations-cjOL01hZ.js +0 -505
- package/dist/rls-P-BeBx0n.js +0 -238
- package/dist/rls-graph-CHwx0V8q.js +0 -435
- package/dist/rls-ownership-DcYlZ09B.js +0 -843
- package/dist/rls-shared-Cewd_-zI.js +0 -495
- package/dist/rls-verify-CMv9H3wV.js +0 -746
- package/dist/run-BWc9qqvE.js +0 -174
- package/dist/server-DlZ28Oz5.js +0 -268
- package/dist/sink-B1fZzIMf.d.ts +0 -104
- package/dist/sink-Bd9PSyfq.js +0 -141
- package/dist/skills-C5CbhhpG.js +0 -56
- package/dist/snapshot-Enxd0n-s.js +0 -975
- package/dist/sql-xdg5f4Fi.js +0 -27
- package/dist/src-BDwEZWrZ.js +0 -568
- package/dist/store-jOBYpiXC.d.ts +0 -36
- package/dist/stores-C0IMQrGI.d.ts +0 -52
- package/dist/subject-C6dLxqHU.js +0 -24
- package/dist/supabase-config-Bj3iDH2I.js +0 -472
- package/dist/supabase-hook-gd3s8bxB.js +0 -2
- package/dist/supabase-s4o9s1O1.js +0 -83
- package/dist/thenable-okc2xDsj.js +0 -10
- package/dist/types-BnIEz1sU.d.ts +0 -48
- package/dist/types-Bvc4oWT6.d.ts +0 -9
- package/dist/types-CKNSyIf_.d.ts +0 -52
- package/dist/types-Cq_H8N_X.d.ts +0 -197
- package/dist/usage-B0YuTQRO.js +0 -42
- package/dist/usage-DorAJiU_.js +0 -2
- package/dist/vocabulary-DA8a8zif.d.ts +0 -56
- package/dist/watch-BwxLTYMZ.js +0 -2
package/dist/cloud/index.js
CHANGED
|
@@ -1,404 +1,297 @@
|
|
|
1
|
-
import { t as compact } from "../compact-
|
|
1
|
+
import { r as isRecord, t as compact } from "../compact-CAf557ZB.js";
|
|
2
2
|
import { n as freezeDeep } from "../freeze-CrU8nQeX.js";
|
|
3
|
-
import {
|
|
4
|
-
import {
|
|
5
|
-
import {
|
|
6
|
-
import {
|
|
7
|
-
import {
|
|
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 isRecord$1(value) {
|
|
24
|
-
return value !== null && typeof value === "object" && !Array.isArray(value);
|
|
25
|
-
}
|
|
26
|
-
function asApproval(value) {
|
|
27
|
-
if (!isRecord$1(value) || value["v"] !== 1 || typeof value["token"] !== "string") return null;
|
|
28
|
-
return value;
|
|
29
|
-
}
|
|
30
|
-
function isCompactJws$1(value) {
|
|
31
|
-
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
|
+
};
|
|
32
19
|
}
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
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" };
|
|
40
34
|
}
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
if (
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
function approvalErrorFromStatus(status) {
|
|
48
|
-
if (status === 409) return new ApprovalError("approval-not-pending", "approval is not pending");
|
|
49
|
-
if (status === 410) return new ApprovalError("approval-expired", "approval has expired");
|
|
50
|
-
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);
|
|
51
41
|
}
|
|
52
42
|
/**
|
|
53
|
-
*
|
|
54
|
-
*
|
|
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.
|
|
55
49
|
*/
|
|
56
|
-
function
|
|
57
|
-
const
|
|
58
|
-
if (url === "") throw new Error("PermDock: cloud() requires url and key.");
|
|
59
|
-
const environment = firstNonEmpty(options.environment, readEnv("PERMDOCK_CLOUD_ENV"), readEnv("VERCEL_ENV"), "production");
|
|
60
|
-
const issuer = `${url}/v1/environments/${encodeURIComponent(environment)}`;
|
|
50
|
+
function cloudDeliveryTransport(channel, options = {}) {
|
|
51
|
+
const connection = cloudConnection(options);
|
|
61
52
|
return Object.freeze({
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
const flushAt = options.flushAt ?? 32;
|
|
72
|
-
const waitUntil = options.waitUntil;
|
|
73
|
-
const headers = () => {
|
|
74
|
-
const next = new Headers();
|
|
75
|
-
next.set("authorization", `Bearer ${key}`);
|
|
76
|
-
next.set("content-type", "application/json");
|
|
77
|
-
return next;
|
|
78
|
-
};
|
|
79
|
-
const request = (path, init = {}, accept) => {
|
|
80
|
-
const next = headers();
|
|
81
|
-
if (accept !== void 0) next.set("accept", accept);
|
|
82
|
-
return fetchFn(`${root}${path}`, {
|
|
83
|
-
...init,
|
|
84
|
-
headers: next,
|
|
85
|
-
signal: timeoutSignal(CLOUD_TIMEOUT_MS, init.signal)
|
|
86
|
-
});
|
|
87
|
-
};
|
|
88
|
-
const approvals = {
|
|
89
|
-
async create(record) {
|
|
90
|
-
if (!(await request("/approvals", {
|
|
91
|
-
method: "POST",
|
|
92
|
-
body: JSON.stringify(record)
|
|
93
|
-
})).ok) throw new Error("PermDock Cloud rejected the approval create");
|
|
94
|
-
},
|
|
95
|
-
async get(token) {
|
|
96
|
-
try {
|
|
97
|
-
const response = await request(`/approvals/${encodeURIComponent(token)}`);
|
|
98
|
-
if (!response.ok) return null;
|
|
99
|
-
return asApproval(await response.json());
|
|
100
|
-
} catch {
|
|
101
|
-
return null;
|
|
102
|
-
}
|
|
103
|
-
},
|
|
104
|
-
async resolve(token, verdict) {
|
|
105
|
-
const response = await request(`/approvals/${encodeURIComponent(token)}/resolve`, {
|
|
106
|
-
method: "POST",
|
|
107
|
-
body: JSON.stringify(verdict)
|
|
108
|
-
});
|
|
109
|
-
if (!response.ok) throw await approvalErrorFrom(response);
|
|
110
|
-
const parsed = asApproval(await response.json());
|
|
111
|
-
if (parsed === null) throw new ApprovalError("approval-not-found", "PermDock Cloud returned an unknown approval shape");
|
|
112
|
-
return parsed;
|
|
113
|
-
},
|
|
114
|
-
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;
|
|
115
62
|
try {
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
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
|
|
119
75
|
});
|
|
120
|
-
if (!response.ok) return null;
|
|
121
|
-
return asApproval(await response.json());
|
|
122
76
|
} catch {
|
|
123
|
-
return
|
|
77
|
+
return {
|
|
78
|
+
status: "failed",
|
|
79
|
+
cause: "invalid-message",
|
|
80
|
+
retryable: false
|
|
81
|
+
};
|
|
124
82
|
}
|
|
125
|
-
},
|
|
126
|
-
async list(query) {
|
|
127
|
-
const params = new URLSearchParams(compact({
|
|
128
|
-
status: query.status,
|
|
129
|
-
principalId: query.principalId,
|
|
130
|
-
actorId: query.actorId,
|
|
131
|
-
tenant: query.tenant,
|
|
132
|
-
session: query.session,
|
|
133
|
-
limit: query.limit === void 0 ? void 0 : String(query.limit),
|
|
134
|
-
cursor: query.cursor
|
|
135
|
-
}));
|
|
136
|
-
const suffix = params.size === 0 ? "" : `?${params.toString()}`;
|
|
137
83
|
try {
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
const parsed = asApproval(item);
|
|
144
|
-
return parsed === null ? [] : [parsed];
|
|
145
|
-
});
|
|
146
|
-
return typeof body["next"] === "string" && body["next"] !== "" ? {
|
|
147
|
-
items,
|
|
148
|
-
next: body["next"]
|
|
149
|
-
} : { items };
|
|
84
|
+
return await fromResponse(await connection.request("/deliveries", {
|
|
85
|
+
method: "POST",
|
|
86
|
+
headers: { "idempotency-key": transportOptions.idempotencyKey },
|
|
87
|
+
body
|
|
88
|
+
}));
|
|
150
89
|
} catch {
|
|
151
|
-
return
|
|
90
|
+
return failed("unavailable", true, "request failed");
|
|
152
91
|
}
|
|
153
|
-
}
|
|
154
|
-
|
|
155
|
-
|
|
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", {
|
|
156
144
|
method: "POST",
|
|
157
145
|
body: JSON.stringify(compact({
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
146
|
+
typ: signOptions.typ,
|
|
147
|
+
claims,
|
|
148
|
+
aud: audience,
|
|
149
|
+
exp: signOptions.expiresAt,
|
|
150
|
+
iat: signOptions.issuedAt,
|
|
151
|
+
jti: signOptions.jti
|
|
161
152
|
}))
|
|
162
|
-
});
|
|
163
|
-
if (!response.ok) throw new Error(
|
|
164
|
-
const
|
|
165
|
-
if (!
|
|
166
|
-
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;
|
|
167
158
|
},
|
|
168
|
-
async
|
|
159
|
+
async jwks() {
|
|
169
160
|
try {
|
|
170
|
-
const response = await request("/
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
});
|
|
174
|
-
if (!response.ok) return 0;
|
|
175
|
-
const body = await response.json();
|
|
176
|
-
if (!isRecord$1(body) || typeof body["expired"] !== "number") return 0;
|
|
177
|
-
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) };
|
|
178
164
|
} catch {
|
|
179
|
-
return
|
|
165
|
+
return { keys: [] };
|
|
180
166
|
}
|
|
181
167
|
}
|
|
182
|
-
};
|
|
183
|
-
const capacity = options.capacity ?? 1e4;
|
|
184
|
-
const pending = [];
|
|
185
|
-
const bound = () => {
|
|
186
|
-
if (pending.length > capacity) pending.splice(0, pending.length - capacity);
|
|
187
|
-
};
|
|
188
|
-
const flush = async () => {
|
|
189
|
-
if (pending.length === 0) return;
|
|
190
|
-
const events = pending.splice(0);
|
|
191
|
-
try {
|
|
192
|
-
if (!(await request("/decisions", {
|
|
193
|
-
method: "POST",
|
|
194
|
-
body: JSON.stringify({ events })
|
|
195
|
-
})).ok) pending.unshift(...events);
|
|
196
|
-
} catch {
|
|
197
|
-
pending.unshift(...events);
|
|
198
|
-
}
|
|
199
|
-
bound();
|
|
200
|
-
};
|
|
201
|
-
const sink = {
|
|
202
|
-
write(events) {
|
|
203
|
-
pending.push(...events);
|
|
204
|
-
bound();
|
|
205
|
-
if (pending.length >= flushAt) return flush();
|
|
206
|
-
if (waitUntil !== void 0 && pending.length > 0) waitUntil(flush());
|
|
207
|
-
},
|
|
208
|
-
flush
|
|
209
|
-
};
|
|
210
|
-
const snapshots = { async get() {
|
|
211
|
-
const response = await request("/snapshot", {}, "application/jwt");
|
|
212
|
-
if (!response.ok) throw new Error("PermDock Cloud snapshot request failed");
|
|
213
|
-
const text = (await response.text()).trim();
|
|
214
|
-
if (!isCompactJws$1(text)) throw new Error("PermDock Cloud served an unsigned snapshot");
|
|
215
|
-
return text;
|
|
216
|
-
} };
|
|
217
|
-
let document = null;
|
|
218
|
-
return freezeDeep({
|
|
219
|
-
approvals,
|
|
220
|
-
sink,
|
|
221
|
-
snapshots,
|
|
222
|
-
policies: {
|
|
223
|
-
current() {
|
|
224
|
-
return document;
|
|
225
|
-
},
|
|
226
|
-
async refresh() {
|
|
227
|
-
const verifier = options.verifier;
|
|
228
|
-
if (verifier === void 0) return;
|
|
229
|
-
let response;
|
|
230
|
-
try {
|
|
231
|
-
response = await request("/policy");
|
|
232
|
-
} catch {
|
|
233
|
-
return;
|
|
234
|
-
}
|
|
235
|
-
if (response.status === 404) {
|
|
236
|
-
document = null;
|
|
237
|
-
return;
|
|
238
|
-
}
|
|
239
|
-
if (!response.ok) return;
|
|
240
|
-
const token = (await response.text()).trim();
|
|
241
|
-
if (!isCompactJws$1(token)) return;
|
|
242
|
-
const verified = await verifier.verify(token, {
|
|
243
|
-
typ: "permdock-policy+jwt",
|
|
244
|
-
issuer: root,
|
|
245
|
-
audience: root
|
|
246
|
-
});
|
|
247
|
-
if (!verified.ok) return;
|
|
248
|
-
let next;
|
|
249
|
-
try {
|
|
250
|
-
next = parsePolicyDocument(verified.claims["policy"]);
|
|
251
|
-
} catch {
|
|
252
|
-
return;
|
|
253
|
-
}
|
|
254
|
-
document = next;
|
|
255
|
-
}
|
|
256
|
-
},
|
|
257
|
-
issuer: root,
|
|
258
|
-
jwks
|
|
259
168
|
});
|
|
260
169
|
}
|
|
261
170
|
//#endregion
|
|
262
171
|
//#region src/cloud/webhook.ts
|
|
263
|
-
const TYPES = new Set(Object.values(CLOUD_EVENT_TYPES));
|
|
264
|
-
function isRecord(value) {
|
|
265
|
-
return value !== null && typeof value === "object" && !Array.isArray(value);
|
|
266
|
-
}
|
|
267
|
-
function hasUnsafeKey(value) {
|
|
268
|
-
if (Array.isArray(value)) return value.some(hasUnsafeKey);
|
|
269
|
-
if (!isRecord(value)) return false;
|
|
270
|
-
return Object.keys(value).some((key) => isForbiddenKey(key) || hasUnsafeKey(value[key]));
|
|
271
|
-
}
|
|
272
|
-
const FINDING_CODES = /* @__PURE__ */ new Set([
|
|
273
|
-
"permission-removed",
|
|
274
|
-
"not-hostable",
|
|
275
|
-
"grantee-removed",
|
|
276
|
-
"approval-tightened"
|
|
277
|
-
]);
|
|
278
|
-
function isFinding(value) {
|
|
279
|
-
return isRecord(value) && FINDING_CODES.has(value["code"]) && typeof value["permission"] === "string" && (value["grant"] === void 0 || typeof value["grant"] === "string");
|
|
280
|
-
}
|
|
281
|
-
function validData(type, data) {
|
|
282
|
-
switch (type) {
|
|
283
|
-
case "dev.permdock.decision": return data["type"] === "decision" && typeof data["permission"] === "string";
|
|
284
|
-
case "dev.permdock.approval": return data["type"] === "decision" && (data["phase"] === "requested" || data["phase"] === "resolved");
|
|
285
|
-
case "dev.permdock.directory": return data["type"] === "directory" && typeof data["tenant"] === "string";
|
|
286
|
-
case "dev.permdock.membership": return data["type"] === "membership" && isRecord(data["principal"]);
|
|
287
|
-
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");
|
|
288
|
-
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));
|
|
289
|
-
case "dev.permdock.access.started":
|
|
290
|
-
case "dev.permdock.access.ended":
|
|
291
|
-
case "dev.permdock.access.revoked": return data["type"] === "access" && typeof data["tenant"] === "string" && isRecord(data["principal"]) && typeof data["principal"]["id"] === "string";
|
|
292
|
-
default: return type;
|
|
293
|
-
}
|
|
294
|
-
}
|
|
295
172
|
/**
|
|
296
|
-
* Validates one CloudEvent against the closed type list
|
|
297
|
-
* 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.
|
|
298
175
|
*/
|
|
299
176
|
function parseCloudEvent(value) {
|
|
300
|
-
|
|
301
|
-
return freezeDeep(JSON.parse(JSON.stringify(value)));
|
|
177
|
+
return parseCloudEvent$1(value);
|
|
302
178
|
}
|
|
303
179
|
function verifierFor(options) {
|
|
304
180
|
if (options.verifier !== void 0) return options.verifier;
|
|
305
|
-
if (options.jwks === void 0) return;
|
|
181
|
+
if (options.replay === void 0 || options.jwks === void 0 && options.secret === void 0) return;
|
|
306
182
|
try {
|
|
307
|
-
return
|
|
308
|
-
jwks:
|
|
309
|
-
|
|
310
|
-
|
|
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
|
+
}));
|
|
311
191
|
} catch {
|
|
312
192
|
return;
|
|
313
193
|
}
|
|
314
194
|
}
|
|
315
|
-
function
|
|
316
|
-
|
|
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);
|
|
317
207
|
}
|
|
318
208
|
/**
|
|
319
|
-
* Verifies a PermDock Cloud webhook delivery:
|
|
320
|
-
* `
|
|
321
|
-
* 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.
|
|
322
213
|
*/
|
|
323
214
|
async function verifyWebhook(request, options) {
|
|
324
|
-
let body;
|
|
325
|
-
try {
|
|
326
|
-
body = (await request.text()).trim();
|
|
327
|
-
} catch {
|
|
328
|
-
return {
|
|
329
|
-
ok: false,
|
|
330
|
-
reason: "unsigned"
|
|
331
|
-
};
|
|
332
|
-
}
|
|
333
|
-
if (!isCompactJws(body)) return {
|
|
334
|
-
ok: false,
|
|
335
|
-
reason: "unsigned"
|
|
336
|
-
};
|
|
337
215
|
const verifier = verifierFor(options);
|
|
338
216
|
if (verifier === void 0) return {
|
|
339
217
|
ok: false,
|
|
340
|
-
|
|
341
|
-
cause: "jwks-unavailable"
|
|
218
|
+
cause: "keys-unavailable"
|
|
342
219
|
};
|
|
343
|
-
|
|
344
|
-
try {
|
|
345
|
-
verified = await verifier.verify(body, {
|
|
346
|
-
typ: "permdock-decisions+jwt",
|
|
347
|
-
audience: options.audience
|
|
348
|
-
});
|
|
349
|
-
} catch {
|
|
350
|
-
return {
|
|
351
|
-
ok: false,
|
|
352
|
-
reason: "invalid-token",
|
|
353
|
-
cause: "malformed"
|
|
354
|
-
};
|
|
355
|
-
}
|
|
220
|
+
const verified = await verifier.verify(request);
|
|
356
221
|
if (!verified.ok) return {
|
|
357
222
|
ok: false,
|
|
358
|
-
reason: "invalid-token",
|
|
359
223
|
cause: verified.cause
|
|
360
224
|
};
|
|
361
|
-
const
|
|
362
|
-
|
|
363
|
-
if (typeof jti !== "string" || !Array.isArray(raw)) return {
|
|
225
|
+
const events = eventsOf(verified.body);
|
|
226
|
+
if (events === null) return {
|
|
364
227
|
ok: false,
|
|
365
|
-
|
|
228
|
+
cause: "invalid-events"
|
|
366
229
|
};
|
|
367
|
-
const events = [];
|
|
368
|
-
for (const item of raw) {
|
|
369
|
-
const parsed = parseCloudEvent(item);
|
|
370
|
-
if (parsed === null) return {
|
|
371
|
-
ok: false,
|
|
372
|
-
reason: "invalid-events"
|
|
373
|
-
};
|
|
374
|
-
events.push(parsed);
|
|
375
|
-
}
|
|
376
|
-
if (options.replay !== void 0) {
|
|
377
|
-
const key = `permdock-webhook:${jti}`;
|
|
378
|
-
const expiresAt = typeof verified.claims.exp === "number" ? verified.claims.exp : void 0;
|
|
379
|
-
try {
|
|
380
|
-
if (options.replay.claim === void 0) {
|
|
381
|
-
if (await options.replay.seen(key)) return {
|
|
382
|
-
ok: false,
|
|
383
|
-
reason: "replayed"
|
|
384
|
-
};
|
|
385
|
-
await options.replay.remember(key, expiresAt);
|
|
386
|
-
} else if (!await options.replay.claim(key, expiresAt)) return {
|
|
387
|
-
ok: false,
|
|
388
|
-
reason: "replayed"
|
|
389
|
-
};
|
|
390
|
-
} catch {
|
|
391
|
-
return {
|
|
392
|
-
ok: false,
|
|
393
|
-
reason: "replayed"
|
|
394
|
-
};
|
|
395
|
-
}
|
|
396
|
-
}
|
|
397
230
|
return freezeDeep({
|
|
398
231
|
ok: true,
|
|
399
|
-
id:
|
|
232
|
+
id: verified.id,
|
|
233
|
+
timestamp: verified.timestamp,
|
|
400
234
|
events
|
|
401
235
|
});
|
|
402
236
|
}
|
|
403
237
|
//#endregion
|
|
404
|
-
|
|
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 };
|