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
|
@@ -0,0 +1,88 @@
|
|
|
1
|
+
import { Rt as Instant, tr as JsonWebKeyLike } from "./policy-types-DzwivBgR.js";
|
|
2
|
+
import { l as ReplayStore } from "./types-DiQjupG2.js";
|
|
3
|
+
//#region src/server/standard-webhooks.d.ts
|
|
4
|
+
/** The three Standard Webhooks headers a delivery carries. */
|
|
5
|
+
type WebhookHeaders = {
|
|
6
|
+
readonly "webhook-id": string;
|
|
7
|
+
readonly "webhook-timestamp": string;
|
|
8
|
+
readonly "webhook-signature": string;
|
|
9
|
+
};
|
|
10
|
+
/** An OKP JWK; only `kty: "OKP"` with `crv: "Ed25519"` signs or verifies `v1a`. */
|
|
11
|
+
type WebhookJwk = JsonWebKeyLike & {
|
|
12
|
+
readonly kid?: string;
|
|
13
|
+
readonly crv?: string;
|
|
14
|
+
readonly x?: string;
|
|
15
|
+
readonly d?: string;
|
|
16
|
+
};
|
|
17
|
+
/** A Standard Webhooks signature version: `v1` HMAC-SHA256 or `v1a` Ed25519. */
|
|
18
|
+
type WebhookAlgorithm = "v1" | "v1a";
|
|
19
|
+
type WebhookSigningKey = {
|
|
20
|
+
readonly alg: "v1";
|
|
21
|
+
readonly secret: string;
|
|
22
|
+
} | {
|
|
23
|
+
readonly alg: "v1a";
|
|
24
|
+
readonly privateKey: WebhookJwk;
|
|
25
|
+
};
|
|
26
|
+
type WebhookSignerOptions = {
|
|
27
|
+
/** Every key signs each delivery, so a receiver can rotate between them. */
|
|
28
|
+
readonly keys: readonly WebhookSigningKey[];
|
|
29
|
+
};
|
|
30
|
+
type WebhookMessage = {
|
|
31
|
+
/** A unique message id, kept across retries of the same message. */
|
|
32
|
+
readonly id: string;
|
|
33
|
+
readonly body: string;
|
|
34
|
+
readonly now?: Instant;
|
|
35
|
+
};
|
|
36
|
+
type WebhookSigner = {
|
|
37
|
+
sign(message: WebhookMessage): Promise<WebhookHeaders>;
|
|
38
|
+
};
|
|
39
|
+
/** An Ed25519 public JWK set for `v1a`, or the URL that serves one. */
|
|
40
|
+
type WebhookJwks = {
|
|
41
|
+
readonly keys: readonly WebhookJwk[];
|
|
42
|
+
} | URL | string;
|
|
43
|
+
type WebhookVerifierOptions = {
|
|
44
|
+
/** `v1` secrets in `whsec_` form; more than one during a rotation. */
|
|
45
|
+
readonly secret?: string | readonly string[];
|
|
46
|
+
/** `v1a` public keys. */
|
|
47
|
+
readonly jwks?: WebhookJwks;
|
|
48
|
+
/** Records each `webhook-id` so a replayed delivery fails. */
|
|
49
|
+
readonly replay: ReplayStore;
|
|
50
|
+
/** Seconds a timestamp may differ from the clock. Defaults to 300. */
|
|
51
|
+
readonly tolerance?: number;
|
|
52
|
+
readonly now?: () => Instant;
|
|
53
|
+
/** Fetches a `jwks` URL. Defaults to the global `fetch`. */
|
|
54
|
+
readonly fetch?: typeof fetch;
|
|
55
|
+
};
|
|
56
|
+
type WebhookFailureCause = "missing-headers" | "malformed" | "timestamp-out-of-range" | "invalid-signature" | "keys-unavailable" | "replayed";
|
|
57
|
+
type WebhookInput = Request | {
|
|
58
|
+
readonly headers: Headers | Readonly<Record<string, string | undefined>>;
|
|
59
|
+
readonly body: string;
|
|
60
|
+
};
|
|
61
|
+
type VerifiedWebhookMessage = {
|
|
62
|
+
readonly ok: true;
|
|
63
|
+
readonly id: string;
|
|
64
|
+
/** The `webhook-timestamp` as an RFC 3339 instant. */
|
|
65
|
+
readonly timestamp: string;
|
|
66
|
+
readonly body: string;
|
|
67
|
+
} | {
|
|
68
|
+
readonly ok: false;
|
|
69
|
+
readonly cause: WebhookFailureCause;
|
|
70
|
+
};
|
|
71
|
+
type WebhookVerifier = {
|
|
72
|
+
/** Never throws; claims the `webhook-id` only after a signature verifies. */
|
|
73
|
+
verify(input: WebhookInput): Promise<VerifiedWebhookMessage>;
|
|
74
|
+
};
|
|
75
|
+
/**
|
|
76
|
+
* Signs Standard Webhooks deliveries: `v1` HMAC-SHA256 with a `whsec_`
|
|
77
|
+
* secret, `v1a` Ed25519 with a private JWK. Throws on an invalid key or id,
|
|
78
|
+
* because both come from the sender's own configuration.
|
|
79
|
+
*/
|
|
80
|
+
declare function webhookSigner(options: WebhookSignerOptions): WebhookSigner;
|
|
81
|
+
/**
|
|
82
|
+
* Verifies Standard Webhooks deliveries signed `v1` with one of `secret` or
|
|
83
|
+
* `v1a` with a key from `jwks`, within `tolerance` seconds, and records each
|
|
84
|
+
* `webhook-id` in `replay`. Throws only on an invalid `secret`.
|
|
85
|
+
*/
|
|
86
|
+
declare function webhookVerifier(options: WebhookVerifierOptions): WebhookVerifier;
|
|
87
|
+
//#endregion
|
|
88
|
+
export { WebhookInput as a, WebhookMessage as c, WebhookSigningKey as d, WebhookVerifier as f, webhookVerifier as h, WebhookHeaders as i, WebhookSigner as l, webhookSigner as m, WebhookAlgorithm as n, WebhookJwk as o, WebhookVerifierOptions as p, WebhookFailureCause as r, WebhookJwks as s, VerifiedWebhookMessage as t, WebhookSignerOptions as u };
|
|
@@ -0,0 +1,228 @@
|
|
|
1
|
+
import { m as rfc3339, p as nowSeconds } from "./time-DkWjdL98.js";
|
|
2
|
+
import { n as readBodyText } from "./body-text-QcXok_SI.js";
|
|
3
|
+
//#region src/server/standard-webhooks.ts
|
|
4
|
+
const DEFAULT_TOLERANCE = 300;
|
|
5
|
+
const JWKS_TTL_SECONDS = 300;
|
|
6
|
+
const encoder = /* @__PURE__ */ new TextEncoder();
|
|
7
|
+
function decodeBase64(value) {
|
|
8
|
+
if (!/^[A-Za-z0-9+/]*={0,2}$/u.test(value) || value.length % 4 !== 0) return;
|
|
9
|
+
try {
|
|
10
|
+
const binary = atob(value);
|
|
11
|
+
const bytes = new Uint8Array(binary.length);
|
|
12
|
+
for (let index = 0; index < binary.length; index += 1) bytes[index] = binary.codePointAt(index) ?? 0;
|
|
13
|
+
return bytes;
|
|
14
|
+
} catch {
|
|
15
|
+
return;
|
|
16
|
+
}
|
|
17
|
+
}
|
|
18
|
+
function encodeBase64(bytes) {
|
|
19
|
+
let binary = "";
|
|
20
|
+
for (const byte of new Uint8Array(bytes)) binary += String.fromCodePoint(byte);
|
|
21
|
+
return btoa(binary);
|
|
22
|
+
}
|
|
23
|
+
function secretBytes(secret) {
|
|
24
|
+
const bytes = decodeBase64(secret.startsWith("whsec_") ? secret.slice(6) : secret);
|
|
25
|
+
if (bytes === void 0 || bytes.length < 24 || bytes.length > 64) throw new TypeError("PermDock: a v1 webhook secret is whsec_ followed by 24 to 64 bytes in base64");
|
|
26
|
+
return bytes;
|
|
27
|
+
}
|
|
28
|
+
function hmacKey(secret, usage) {
|
|
29
|
+
return crypto.subtle.importKey("raw", secretBytes(secret), {
|
|
30
|
+
name: "HMAC",
|
|
31
|
+
hash: "SHA-256"
|
|
32
|
+
}, false, [usage]);
|
|
33
|
+
}
|
|
34
|
+
function isEd25519(jwk) {
|
|
35
|
+
return jwk.kty === "OKP" && jwk.crv === "Ed25519" && typeof jwk.x === "string";
|
|
36
|
+
}
|
|
37
|
+
function signedContent(id, timestamp, body) {
|
|
38
|
+
return encoder.encode(`${id}.${timestamp}.${body}`);
|
|
39
|
+
}
|
|
40
|
+
function validId(id) {
|
|
41
|
+
return id.length > 0 && id.length <= 256 && !/\s/u.test(id);
|
|
42
|
+
}
|
|
43
|
+
/**
|
|
44
|
+
* Signs Standard Webhooks deliveries: `v1` HMAC-SHA256 with a `whsec_`
|
|
45
|
+
* secret, `v1a` Ed25519 with a private JWK. Throws on an invalid key or id,
|
|
46
|
+
* because both come from the sender's own configuration.
|
|
47
|
+
*/
|
|
48
|
+
function webhookSigner(options) {
|
|
49
|
+
if (options.keys.length === 0) throw new TypeError("PermDock: webhookSigner() needs at least one key");
|
|
50
|
+
const keys = options.keys.map(async (key) => {
|
|
51
|
+
switch (key.alg) {
|
|
52
|
+
case "v1": return {
|
|
53
|
+
alg: key.alg,
|
|
54
|
+
key: await hmacKey(key.secret, "sign")
|
|
55
|
+
};
|
|
56
|
+
case "v1a":
|
|
57
|
+
if (!isEd25519(key.privateKey) || typeof key.privateKey.d !== "string") throw new TypeError("PermDock: a v1a webhook key is an Ed25519 private JWK");
|
|
58
|
+
return {
|
|
59
|
+
alg: key.alg,
|
|
60
|
+
key: await importEd25519(key.privateKey, "sign")
|
|
61
|
+
};
|
|
62
|
+
default: return key;
|
|
63
|
+
}
|
|
64
|
+
});
|
|
65
|
+
for (const pending of keys) pending.catch(() => void 0);
|
|
66
|
+
return { async sign(message) {
|
|
67
|
+
if (!validId(message.id)) throw new TypeError("PermDock: a webhook id is 1 to 256 characters without whitespace");
|
|
68
|
+
const timestamp = String(nowSeconds(message.now));
|
|
69
|
+
const content = signedContent(message.id, timestamp, message.body);
|
|
70
|
+
const signatures = await Promise.all(keys.map(async (pending) => {
|
|
71
|
+
const { alg, key } = await pending;
|
|
72
|
+
return `${alg},${encodeBase64(await crypto.subtle.sign(alg === "v1" ? "HMAC" : "Ed25519", key, content))}`;
|
|
73
|
+
}));
|
|
74
|
+
return {
|
|
75
|
+
"webhook-id": message.id,
|
|
76
|
+
"webhook-timestamp": timestamp,
|
|
77
|
+
"webhook-signature": signatures.join(" ")
|
|
78
|
+
};
|
|
79
|
+
} };
|
|
80
|
+
}
|
|
81
|
+
function header(input, name) {
|
|
82
|
+
const headers = input.headers;
|
|
83
|
+
if (headers instanceof Headers) return headers.get(name) ?? void 0;
|
|
84
|
+
return Object.hasOwn(headers, name) ? headers[name] : void 0;
|
|
85
|
+
}
|
|
86
|
+
async function bodyOf(input) {
|
|
87
|
+
if (input instanceof Request) {
|
|
88
|
+
const read = await readBodyText(input);
|
|
89
|
+
return read.ok ? read.text : void 0;
|
|
90
|
+
}
|
|
91
|
+
return input.body;
|
|
92
|
+
}
|
|
93
|
+
function parseSignatures(value) {
|
|
94
|
+
const parsed = [];
|
|
95
|
+
for (const entry of value.split(" ")) {
|
|
96
|
+
const comma = entry.indexOf(",");
|
|
97
|
+
const alg = entry.slice(0, comma);
|
|
98
|
+
if (comma <= 0 || alg !== "v1" && alg !== "v1a") continue;
|
|
99
|
+
const bytes = decodeBase64(entry.slice(comma + 1));
|
|
100
|
+
if (bytes?.length === (alg === "v1" ? 32 : 64)) parsed.push({
|
|
101
|
+
alg,
|
|
102
|
+
bytes
|
|
103
|
+
});
|
|
104
|
+
}
|
|
105
|
+
return parsed;
|
|
106
|
+
}
|
|
107
|
+
function importEd25519(jwk, usage) {
|
|
108
|
+
const material = usage === "sign" ? {
|
|
109
|
+
kty: "OKP",
|
|
110
|
+
crv: "Ed25519",
|
|
111
|
+
x: jwk.x,
|
|
112
|
+
d: jwk.d
|
|
113
|
+
} : {
|
|
114
|
+
kty: "OKP",
|
|
115
|
+
crv: "Ed25519",
|
|
116
|
+
x: jwk.x
|
|
117
|
+
};
|
|
118
|
+
return crypto.subtle.importKey("jwk", material, "Ed25519", false, [usage]);
|
|
119
|
+
}
|
|
120
|
+
async function publicKeys(jwks) {
|
|
121
|
+
return (await Promise.all(jwks.keys.filter(isEd25519).map((jwk) => importEd25519(jwk, "verify").catch(() => void 0)))).filter((key) => key !== void 0);
|
|
122
|
+
}
|
|
123
|
+
async function anyVerifies(algorithm, keys, signatures, content) {
|
|
124
|
+
return (await Promise.all(keys.flatMap((key) => signatures.map((signature) => crypto.subtle.verify(algorithm, key, signature.bytes, content))))).includes(true);
|
|
125
|
+
}
|
|
126
|
+
function isJwks(value) {
|
|
127
|
+
return typeof value === "object" && value !== null && "keys" in value && Array.isArray(value.keys);
|
|
128
|
+
}
|
|
129
|
+
/**
|
|
130
|
+
* Verifies Standard Webhooks deliveries signed `v1` with one of `secret` or
|
|
131
|
+
* `v1a` with a key from `jwks`, within `tolerance` seconds, and records each
|
|
132
|
+
* `webhook-id` in `replay`. Throws only on an invalid `secret`.
|
|
133
|
+
*/
|
|
134
|
+
function webhookVerifier(options) {
|
|
135
|
+
const secrets = options.secret === void 0 ? [] : typeof options.secret === "string" ? [options.secret] : options.secret;
|
|
136
|
+
for (const secret of secrets) secretBytes(secret);
|
|
137
|
+
const hmacKeys = Promise.all(secrets.map((secret) => hmacKey(secret, "verify")));
|
|
138
|
+
const tolerance = options.tolerance ?? DEFAULT_TOLERANCE;
|
|
139
|
+
const jwks = options.jwks;
|
|
140
|
+
let cached;
|
|
141
|
+
async function ed25519Keys(now) {
|
|
142
|
+
if (jwks === void 0) return [];
|
|
143
|
+
if (isJwks(jwks)) {
|
|
144
|
+
cached ??= {
|
|
145
|
+
keys: await publicKeys(jwks),
|
|
146
|
+
until: Number.POSITIVE_INFINITY
|
|
147
|
+
};
|
|
148
|
+
return cached.keys;
|
|
149
|
+
}
|
|
150
|
+
if (cached !== void 0 && cached.until > now) return cached.keys;
|
|
151
|
+
try {
|
|
152
|
+
const response = await (options.fetch ?? fetch)(String(jwks), { headers: { accept: "application/jwk-set+json, application/json" } });
|
|
153
|
+
const parsed = response.ok ? await response.json() : void 0;
|
|
154
|
+
if (!isJwks(parsed)) return;
|
|
155
|
+
cached = {
|
|
156
|
+
keys: await publicKeys(parsed),
|
|
157
|
+
until: now + JWKS_TTL_SECONDS
|
|
158
|
+
};
|
|
159
|
+
return cached.keys;
|
|
160
|
+
} catch {
|
|
161
|
+
return;
|
|
162
|
+
}
|
|
163
|
+
}
|
|
164
|
+
async function signatureValid(signatures, content, now) {
|
|
165
|
+
const v1 = signatures.filter((signature) => signature.alg === "v1");
|
|
166
|
+
const v1a = signatures.filter((signature) => signature.alg === "v1a");
|
|
167
|
+
if (v1.length > 0 && await anyVerifies("HMAC", await hmacKeys, v1, content)) return;
|
|
168
|
+
if (v1a.length === 0) return "invalid-signature";
|
|
169
|
+
const keys = await ed25519Keys(now);
|
|
170
|
+
if (keys === void 0) return "keys-unavailable";
|
|
171
|
+
if (await anyVerifies("Ed25519", keys, v1a, content)) return;
|
|
172
|
+
return "invalid-signature";
|
|
173
|
+
}
|
|
174
|
+
async function claim(id, expiresAt) {
|
|
175
|
+
const key = `webhook:${id}`;
|
|
176
|
+
try {
|
|
177
|
+
if (options.replay.claim !== void 0) return await options.replay.claim(key, expiresAt);
|
|
178
|
+
if (await options.replay.seen(key)) return false;
|
|
179
|
+
await options.replay.remember(key, expiresAt);
|
|
180
|
+
return true;
|
|
181
|
+
} catch {
|
|
182
|
+
return false;
|
|
183
|
+
}
|
|
184
|
+
}
|
|
185
|
+
return { async verify(input) {
|
|
186
|
+
const id = header(input, "webhook-id");
|
|
187
|
+
const timestamp = header(input, "webhook-timestamp");
|
|
188
|
+
const signature = header(input, "webhook-signature");
|
|
189
|
+
if (id === void 0 || timestamp === void 0 || signature === void 0) return {
|
|
190
|
+
ok: false,
|
|
191
|
+
cause: "missing-headers"
|
|
192
|
+
};
|
|
193
|
+
const body = await bodyOf(input);
|
|
194
|
+
const signatures = parseSignatures(signature);
|
|
195
|
+
if (body === void 0 || !validId(id) || !/^\d{1,12}$/u.test(timestamp) || signatures.length === 0) return {
|
|
196
|
+
ok: false,
|
|
197
|
+
cause: "malformed"
|
|
198
|
+
};
|
|
199
|
+
const now = nowSeconds(options.now?.());
|
|
200
|
+
const sent = Number(timestamp);
|
|
201
|
+
if (Math.abs(now - sent) > tolerance) return {
|
|
202
|
+
ok: false,
|
|
203
|
+
cause: "timestamp-out-of-range"
|
|
204
|
+
};
|
|
205
|
+
let failure;
|
|
206
|
+
try {
|
|
207
|
+
failure = await signatureValid(signatures, signedContent(id, timestamp, body), now);
|
|
208
|
+
} catch {
|
|
209
|
+
failure = "invalid-signature";
|
|
210
|
+
}
|
|
211
|
+
if (failure !== void 0) return {
|
|
212
|
+
ok: false,
|
|
213
|
+
cause: failure
|
|
214
|
+
};
|
|
215
|
+
if (!await claim(id, sent + tolerance)) return {
|
|
216
|
+
ok: false,
|
|
217
|
+
cause: "replayed"
|
|
218
|
+
};
|
|
219
|
+
return {
|
|
220
|
+
ok: true,
|
|
221
|
+
id,
|
|
222
|
+
timestamp: rfc3339(sent),
|
|
223
|
+
body
|
|
224
|
+
};
|
|
225
|
+
} };
|
|
226
|
+
}
|
|
227
|
+
//#endregion
|
|
228
|
+
export { webhookVerifier as n, webhookSigner as t };
|
|
@@ -0,0 +1,132 @@
|
|
|
1
|
+
import { r as isRecord, t as compact } from "./compact-CAf557ZB.js";
|
|
2
|
+
import { mkdirSync, readFileSync, statSync, unlinkSync, writeFileSync } from "node:fs";
|
|
3
|
+
import path from "node:path";
|
|
4
|
+
import { homedir } from "node:os";
|
|
5
|
+
//#region src/terminal/storage.ts
|
|
6
|
+
const FILE_MODE = 384;
|
|
7
|
+
const DIR_MODE = 448;
|
|
8
|
+
const GROUP_OR_WORLD = 63;
|
|
9
|
+
function credentialsPath(service, runtime) {
|
|
10
|
+
if (runtime.configDir !== void 0) return path.join(runtime.configDir, "credentials.json");
|
|
11
|
+
const home = runtime.homedir ?? homedir;
|
|
12
|
+
const env = runtime.env ?? process.env;
|
|
13
|
+
if ((runtime.platform ?? process.platform) === "win32") {
|
|
14
|
+
const appData = env["APPDATA"] ?? path.join(home(), "AppData", "Roaming");
|
|
15
|
+
return path.join(appData, service, "credentials.json");
|
|
16
|
+
}
|
|
17
|
+
const xdg = env["XDG_CONFIG_HOME"] ?? path.join(home(), ".config");
|
|
18
|
+
return path.join(xdg, service, "credentials.json");
|
|
19
|
+
}
|
|
20
|
+
function parseCredential(value) {
|
|
21
|
+
if (!isRecord(value) || typeof value["access_token"] !== "string") return null;
|
|
22
|
+
return compact({
|
|
23
|
+
access_token: value["access_token"],
|
|
24
|
+
refresh_token: typeof value["refresh_token"] === "string" ? value["refresh_token"] : void 0,
|
|
25
|
+
expires_at: typeof value["expires_at"] === "number" ? value["expires_at"] : void 0,
|
|
26
|
+
token_type: typeof value["token_type"] === "string" ? value["token_type"] : void 0,
|
|
27
|
+
scope: typeof value["scope"] === "string" ? value["scope"] : void 0
|
|
28
|
+
});
|
|
29
|
+
}
|
|
30
|
+
function keyringEntry(storage, profile) {
|
|
31
|
+
if (storage.keyring === void 0) return null;
|
|
32
|
+
try {
|
|
33
|
+
return new storage.keyring(storage.service, profile);
|
|
34
|
+
} catch {
|
|
35
|
+
return null;
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
function readKeyring(storage, profile) {
|
|
39
|
+
const entry = keyringEntry(storage, profile);
|
|
40
|
+
if (entry === null) return null;
|
|
41
|
+
try {
|
|
42
|
+
const raw = entry.getPassword();
|
|
43
|
+
return typeof raw === "string" ? parseCredential(JSON.parse(raw)) : null;
|
|
44
|
+
} catch {
|
|
45
|
+
return null;
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
function readCredentials(storage, profile, runtime) {
|
|
49
|
+
return readKeyring(storage, profile) ?? readFile(storage.service, profile, runtime);
|
|
50
|
+
}
|
|
51
|
+
function readFile(service, profile, runtime) {
|
|
52
|
+
const file = credentialsPath(service, runtime);
|
|
53
|
+
let raw;
|
|
54
|
+
try {
|
|
55
|
+
const stat = statSync(file);
|
|
56
|
+
if ((runtime.platform ?? process.platform) !== "win32" && (stat.mode & GROUP_OR_WORLD) !== 0) return null;
|
|
57
|
+
raw = readFileSync(file, "utf8");
|
|
58
|
+
} catch {
|
|
59
|
+
return null;
|
|
60
|
+
}
|
|
61
|
+
try {
|
|
62
|
+
const parsed = JSON.parse(raw);
|
|
63
|
+
if (!isRecord(parsed) || !isRecord(parsed["profiles"])) return null;
|
|
64
|
+
return parseCredential(parsed["profiles"][profile]);
|
|
65
|
+
} catch {
|
|
66
|
+
return null;
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
/**
|
|
70
|
+
* The OS keychain when `storage.keyring` is set and works; otherwise the
|
|
71
|
+
* mode-0600 file. Answers the store it wrote.
|
|
72
|
+
*/
|
|
73
|
+
function writeCredentials(storage, profile, credential, runtime) {
|
|
74
|
+
const entry = keyringEntry(storage, profile);
|
|
75
|
+
if (entry !== null) try {
|
|
76
|
+
entry.setPassword(JSON.stringify(credential));
|
|
77
|
+
deleteFile(storage.service, profile, runtime);
|
|
78
|
+
return "keychain";
|
|
79
|
+
} catch {}
|
|
80
|
+
writeFile(storage.service, profile, credential, runtime);
|
|
81
|
+
return "file";
|
|
82
|
+
}
|
|
83
|
+
function writeFile(service, profile, credential, runtime) {
|
|
84
|
+
const file = credentialsPath(service, runtime);
|
|
85
|
+
mkdirSync(path.dirname(file), {
|
|
86
|
+
recursive: true,
|
|
87
|
+
mode: DIR_MODE
|
|
88
|
+
});
|
|
89
|
+
let profiles = {};
|
|
90
|
+
try {
|
|
91
|
+
const existing = JSON.parse(readFileSync(file, "utf8"));
|
|
92
|
+
if (isRecord(existing) && isRecord(existing["profiles"])) profiles = existing["profiles"];
|
|
93
|
+
} catch {
|
|
94
|
+
profiles = {};
|
|
95
|
+
}
|
|
96
|
+
profiles[profile] = credential;
|
|
97
|
+
writeFileSync(file, `${JSON.stringify({ profiles }, null, 2)}\n`, {
|
|
98
|
+
encoding: "utf8",
|
|
99
|
+
mode: FILE_MODE
|
|
100
|
+
});
|
|
101
|
+
}
|
|
102
|
+
function deleteCredentials(storage, profile, runtime) {
|
|
103
|
+
const entry = keyringEntry(storage, profile);
|
|
104
|
+
if (entry !== null) try {
|
|
105
|
+
entry.deletePassword();
|
|
106
|
+
} catch {}
|
|
107
|
+
deleteFile(storage.service, profile, runtime);
|
|
108
|
+
}
|
|
109
|
+
function deleteFile(service, profile, runtime) {
|
|
110
|
+
const file = credentialsPath(service, runtime);
|
|
111
|
+
let parsed;
|
|
112
|
+
try {
|
|
113
|
+
parsed = JSON.parse(readFileSync(file, "utf8"));
|
|
114
|
+
} catch {
|
|
115
|
+
return;
|
|
116
|
+
}
|
|
117
|
+
if (!isRecord(parsed) || !isRecord(parsed["profiles"])) return;
|
|
118
|
+
const profiles = {};
|
|
119
|
+
for (const key of Object.keys(parsed["profiles"])) if (key !== profile) profiles[key] = parsed["profiles"][key];
|
|
120
|
+
if (Object.keys(profiles).length === 0) {
|
|
121
|
+
try {
|
|
122
|
+
unlinkSync(file);
|
|
123
|
+
} catch {}
|
|
124
|
+
return;
|
|
125
|
+
}
|
|
126
|
+
writeFileSync(file, `${JSON.stringify({ profiles }, null, 2)}\n`, {
|
|
127
|
+
encoding: "utf8",
|
|
128
|
+
mode: FILE_MODE
|
|
129
|
+
});
|
|
130
|
+
}
|
|
131
|
+
//#endregion
|
|
132
|
+
export { writeCredentials as i, deleteCredentials as n, readCredentials as r, credentialsPath as t };
|
|
@@ -1,46 +1,10 @@
|
|
|
1
|
-
import { t as compact } from "./compact-
|
|
1
|
+
import { t as compact } from "./compact-CAf557ZB.js";
|
|
2
2
|
import { n as freezeDeep } from "./freeze-CrU8nQeX.js";
|
|
3
|
-
import { i as flattenApprovers } from "./approvers-
|
|
4
|
-
import {
|
|
5
|
-
import {
|
|
6
|
-
import {
|
|
7
|
-
import {
|
|
8
|
-
//#region src/approvals/types.ts
|
|
9
|
-
const APPROVAL_HEADER = "PermDock-Approval";
|
|
10
|
-
const DEFAULT_APPROVAL_TTL_MS = 36e5;
|
|
11
|
-
/** The approvals a request needs in total: `approvers.quorum` (or 1), or the sum of its stages' quorums. */
|
|
12
|
-
function approvalQuorum(request) {
|
|
13
|
-
const stages = request.approvers?.stages;
|
|
14
|
-
if (stages !== void 0) return stages.reduce((sum, stage) => sum + (stage.quorum ?? 1), 0);
|
|
15
|
-
return request.approvers?.quorum ?? 1;
|
|
16
|
-
}
|
|
17
|
-
/**
|
|
18
|
-
* The instant from which `approvers.escalation.to` may approve, in epoch
|
|
19
|
-
* milliseconds, or `undefined` when the request has no escalation or its
|
|
20
|
-
* `after` does not parse (then nobody escalates: fail-closed).
|
|
21
|
-
*/
|
|
22
|
-
function escalationOpenAt(request) {
|
|
23
|
-
const after = request.approvers?.escalation?.after;
|
|
24
|
-
const seconds = parseDuration(after);
|
|
25
|
-
if (seconds === void 0) return;
|
|
26
|
-
return Date.parse(request.createdAt) + seconds * 1e3;
|
|
27
|
-
}
|
|
28
|
-
/** The instant from which a stage's own `escalation.to` may approve it, in epoch milliseconds; `undefined` when it has none or `after` does not parse. */
|
|
29
|
-
function stageEscalationOpenAt(request, stage) {
|
|
30
|
-
const seconds = parseDuration(stage.escalation?.after);
|
|
31
|
-
if (seconds === void 0) return;
|
|
32
|
-
return Date.parse(request.createdAt) + seconds * 1e3;
|
|
33
|
-
}
|
|
34
|
-
/** The key a verdict's `relations` lists a relation approver under. */
|
|
35
|
-
function approverRelationKey(item) {
|
|
36
|
-
return JSON.stringify([
|
|
37
|
-
item.resource,
|
|
38
|
-
item.relation,
|
|
39
|
-
item.through ?? null,
|
|
40
|
-
item.depth ?? null
|
|
41
|
-
]);
|
|
42
|
-
}
|
|
43
|
-
//#endregion
|
|
3
|
+
import { i as flattenApprovers } from "./approvers-CqPOLD-o.js";
|
|
4
|
+
import { a as durationOf, i as dateAt } from "./time-DkWjdL98.js";
|
|
5
|
+
import { s as rootMembershipId } from "./scopes-CUPSjo9q.js";
|
|
6
|
+
import { n as matchGrantee } from "./grantee-match-DHArqY82.js";
|
|
7
|
+
import { a as escalationOpenAt, i as approverRelationKey, o as stageEscalationOpenAt, r as approvalQuorum, s as ApprovalError } from "./types-DqzsnlSA.js";
|
|
44
8
|
//#region src/approvals/page.ts
|
|
45
9
|
const DEFAULT_PAGE_SIZE = 50;
|
|
46
10
|
const MAX_PAGE_SIZE = 200;
|
|
@@ -187,12 +151,14 @@ function matchesFilter(request, filter) {
|
|
|
187
151
|
function assertSeparateApprover(request, by, requireDistinctApprover) {
|
|
188
152
|
const principal = by.principal;
|
|
189
153
|
if (principal === null) throw new ApprovalError("approver-unauthenticated", "approver must be authenticated");
|
|
154
|
+
if (principal.kind === "link" || principal.kind === "feed" || principal.kind === "contact") throw new ApprovalError("approver-not-eligible", "a link, a feed or a contact cannot approve");
|
|
155
|
+
if (by.actor?.kind === "support") throw new ApprovalError("approver-not-eligible", "a support session cannot approve");
|
|
190
156
|
if (request.subject.actor !== void 0 && principal.id === request.subject.actor.id) throw new ApprovalError("approver-is-actor", "approver is the actor of this request");
|
|
191
157
|
if ((requireDistinctApprover || request.approvers?.distinct !== false) && request.subject.principal !== null && principal.id === request.subject.principal.id) throw new ApprovalError("approver-is-principal", "approver is the principal of this request");
|
|
192
158
|
return principal;
|
|
193
159
|
}
|
|
194
160
|
function assertNotRepeated(request, id) {
|
|
195
|
-
if ((request.approvals ?? []).some((item) => item.by === id)) throw new ApprovalError("approver-repeated", "approver has already approved this request");
|
|
161
|
+
if ((request.approvals ?? []).some((item) => item.by === id || item.onBehalfOf === id)) throw new ApprovalError("approver-repeated", "approver has already approved this request");
|
|
196
162
|
}
|
|
197
163
|
function vouchedRule(verdict) {
|
|
198
164
|
return typeof verdict.vouched === "string" && verdict.vouched !== "" ? verdict.vouched : void 0;
|
|
@@ -207,7 +173,8 @@ function vouchedRule(verdict) {
|
|
|
207
173
|
* two stages. `relations` are the relation approvers `by` holds on the
|
|
208
174
|
* request's resource (see `ApprovalVerdict.relations`).
|
|
209
175
|
*/
|
|
210
|
-
function assertApprover(request, by, requireDistinctApprover,
|
|
176
|
+
function assertApprover(request, by, requireDistinctApprover, at, relations = [], permissions = []) {
|
|
177
|
+
const now = dateAt(at);
|
|
211
178
|
const principal = assertSeparateApprover(request, by, requireDistinctApprover);
|
|
212
179
|
const tenant = request.subject.principal?.tenant;
|
|
213
180
|
if (tenant !== void 0 && !belongsToTenant(by, tenant)) throw new ApprovalError("approver-not-eligible", "approver does not belong to the request tenant");
|
|
@@ -251,13 +218,24 @@ function isSystemSubject(by) {
|
|
|
251
218
|
* should write the result only when the stored row is still pending with the
|
|
252
219
|
* same number of approvals, so two approvers racing both count.
|
|
253
220
|
*/
|
|
254
|
-
function applyApprovalVerdict(request, verdict,
|
|
221
|
+
function applyApprovalVerdict(request, verdict, at) {
|
|
222
|
+
const now = dateAt(at);
|
|
255
223
|
const principal = verdict.by.principal;
|
|
256
224
|
if (principal === null) throw new ApprovalError("approver-unauthenticated", "approver must be authenticated");
|
|
257
225
|
if (request.status !== "pending") throw new ApprovalError("approval-not-pending", "approval is not pending");
|
|
258
226
|
if (Date.parse(request.expiresAt) <= now.getTime()) throw new ApprovalError("approval-expired", "approval has expired");
|
|
259
227
|
const vouched = vouchedRule(verdict);
|
|
260
|
-
const
|
|
228
|
+
const behalf = vouched === void 0 ? verdict.onBehalfOf : void 0;
|
|
229
|
+
let stage;
|
|
230
|
+
if (verdict.status === "rejected" && isSystemSubject(verdict.by) || vouched !== void 0) stage = void 0;
|
|
231
|
+
else if (behalf === void 0) stage = assertApprover(request, verdict.by, false, { epochMilliseconds: now.getTime() }, verdict.relations, verdict.permissions);
|
|
232
|
+
else {
|
|
233
|
+
const delegate = assertSeparateApprover(request, verdict.by, false);
|
|
234
|
+
const tenant = request.subject.principal?.tenant;
|
|
235
|
+
if (tenant !== void 0 && !belongsToTenant(verdict.by, tenant)) throw new ApprovalError("approver-not-eligible", "approver does not belong to the request tenant");
|
|
236
|
+
assertNotRepeated(request, delegate.id);
|
|
237
|
+
stage = assertApprover(request, behalf.subject, false, { epochMilliseconds: now.getTime() }, behalf.relations ?? [], behalf.permissions ?? []);
|
|
238
|
+
}
|
|
261
239
|
if (vouched !== void 0) assertNotRepeated(request, assertSeparateApprover(request, verdict.by, false).id);
|
|
262
240
|
if (verdict.status === "rejected") return freezeDeep(compact({
|
|
263
241
|
...request,
|
|
@@ -271,7 +249,9 @@ function applyApprovalVerdict(request, verdict, now = /* @__PURE__ */ new Date()
|
|
|
271
249
|
by: principal.id,
|
|
272
250
|
at: now.toISOString(),
|
|
273
251
|
stage,
|
|
274
|
-
vouched
|
|
252
|
+
vouched,
|
|
253
|
+
onBehalfOf: behalf === void 0 ? void 0 : behalf.subject.principal?.id,
|
|
254
|
+
delegation: behalf?.delegation
|
|
275
255
|
})];
|
|
276
256
|
if (vouched === void 0 && !isComplete(request, approvals)) return freezeDeep(compact({
|
|
277
257
|
...request,
|
|
@@ -302,26 +282,32 @@ function isStale(request, now) {
|
|
|
302
282
|
return request.status === "expired" || Date.parse(request.expiresAt) <= now.getTime();
|
|
303
283
|
}
|
|
304
284
|
function memoryApprovalStore(options = {}) {
|
|
305
|
-
|
|
285
|
+
if (options.ttl !== void 0 && durationOf(options.ttl) === void 0) throw new RangeError(`PermDock: memoryApprovalStore ttl must be a whole number of seconds above 0, got ${String(options.ttl)}`);
|
|
286
|
+
const ttl = options.ttl ?? 3600;
|
|
306
287
|
const records = /* @__PURE__ */ new Map();
|
|
288
|
+
const clock = (at) => dateAt(at ?? options.now?.());
|
|
307
289
|
return {
|
|
308
290
|
ttl,
|
|
309
291
|
create(request) {
|
|
310
292
|
const current = records.get(request.token);
|
|
311
|
-
if (current !== void 0 && !isStale(current,
|
|
293
|
+
if (current !== void 0 && !isStale(current, clock())) return;
|
|
312
294
|
records.set(request.token, freezeDeep(request));
|
|
313
295
|
},
|
|
314
296
|
get(token) {
|
|
315
297
|
return records.get(token) ?? null;
|
|
316
298
|
},
|
|
299
|
+
getById(id) {
|
|
300
|
+
return records.values().find((request) => request.id === id) ?? null;
|
|
301
|
+
},
|
|
317
302
|
resolve(token, verdict) {
|
|
318
303
|
const current = records.get(token);
|
|
319
304
|
if (current === void 0) throw new ApprovalError("approval-not-found", "approval was not found");
|
|
320
|
-
const next = applyApprovalVerdict(current, verdict
|
|
305
|
+
const next = applyApprovalVerdict(current, verdict);
|
|
321
306
|
records.set(token, next);
|
|
322
307
|
return next;
|
|
323
308
|
},
|
|
324
|
-
consume(token,
|
|
309
|
+
consume(token, at) {
|
|
310
|
+
const now = clock(at);
|
|
325
311
|
const current = records.get(token);
|
|
326
312
|
if (current?.status !== "approved" || current.consumedAt !== void 0 || Date.parse(current.expiresAt) <= now.getTime()) return null;
|
|
327
313
|
const next = freezeDeep({
|
|
@@ -336,12 +322,13 @@ function memoryApprovalStore(options = {}) {
|
|
|
336
322
|
for (const request of records.values()) if (matchesFilter(request, query)) matching.push(request);
|
|
337
323
|
return pageApprovals(matching, query);
|
|
338
324
|
},
|
|
339
|
-
expire(
|
|
325
|
+
expire(at) {
|
|
326
|
+
const now = clock(at);
|
|
340
327
|
let count = 0;
|
|
341
328
|
const instant = now.getTime();
|
|
342
329
|
for (const [token, request] of records) {
|
|
343
330
|
const deadline = Date.parse(request.expiresAt);
|
|
344
|
-
if (request.status !== "pending" && deadline + ttl <= instant) {
|
|
331
|
+
if (request.status !== "pending" && deadline + ttl * 1e3 <= instant) {
|
|
345
332
|
records.delete(token);
|
|
346
333
|
continue;
|
|
347
334
|
}
|
|
@@ -356,7 +343,7 @@ function memoryApprovalStore(options = {}) {
|
|
|
356
343
|
return count;
|
|
357
344
|
},
|
|
358
345
|
cancel(filter, meta) {
|
|
359
|
-
const now =
|
|
346
|
+
const now = clock();
|
|
360
347
|
let count = 0;
|
|
361
348
|
for (const [token, request] of records) {
|
|
362
349
|
if (request.status !== "pending" || !matchesFilter(request, filter)) continue;
|
|
@@ -368,4 +355,4 @@ function memoryApprovalStore(options = {}) {
|
|
|
368
355
|
};
|
|
369
356
|
}
|
|
370
357
|
//#endregion
|
|
371
|
-
export {
|
|
358
|
+
export { approvalPageSize as a, listAllApprovals as c, memoryApprovalStore as i, pageApprovals as l, assertApprover as n, decodeApprovalCursor as o, matchesApprovers as r, encodeApprovalCursor as s, applyApprovalVerdict as t };
|