permdock 0.4.0 → 0.5.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +37 -35
- package/dist/{schema-Bol6gqXA.js → 2020-C9VN-x8c.js} +5 -130
- package/dist/a2a/index.d.ts +6 -6
- package/dist/a2a/index.js +14 -17
- package/dist/{adapter-context-mlWsVGGg.js → adapter-context-CRhqyzCk.js} +1 -1
- package/dist/adoption-scan-B4R5fnMU.js +107 -0
- package/dist/agent/index.d.ts +3 -0
- package/dist/agent/index.js +1 -0
- package/dist/ai-sdk/index.d.ts +18 -35
- package/dist/ai-sdk/index.js +37 -23
- package/dist/{app-data-CV8pqqMi.js → app-data-MuyzVqX8.js} +2 -1
- package/dist/approval-header-CJACtHkv.js +23 -0
- package/dist/approval-prompt-Dg5LeAcT.js +62 -0
- package/dist/approval-prompt-Djo_PyZc.d.ts +57 -0
- package/dist/approvals/index.d.ts +5 -3
- package/dist/approvals/index.js +8 -5
- package/dist/approvals-DJ6Yd5z1.js +995 -0
- package/dist/arazzo-B6lebmiQ.js +36 -0
- package/dist/{arazzo-C4BcskbX.js → arazzo-BWhNF-k0.js} +20 -14
- package/dist/args-IIolxxKA.js +197 -0
- package/dist/astro/index.d.ts +43 -0
- package/dist/astro/index.js +27 -0
- package/dist/audience-Dg8XsRaO.js +55 -0
- package/dist/auth-DRLEizbL.js +178 -0
- package/dist/authzen/index.d.ts +26 -6
- package/dist/authzen/index.js +94 -79
- package/dist/automation-BMZPIVUM.d.ts +114 -0
- package/dist/automation-DVjOckjV.js +157 -0
- package/dist/better-auth/index.d.ts +8 -6
- package/dist/better-auth/index.js +9 -8
- package/dist/better-supabase/index.d.ts +357 -30
- package/dist/better-supabase/index.js +936 -194
- package/dist/{bind-BzqG8SMb.d.ts → bind--9EFVYWF.d.ts} +12 -10
- package/dist/{bind-kk-uyCwH.js → bind-CZzhx-Vj.js} +14 -10
- package/dist/body-CH5of8Ne.js +10 -0
- package/dist/body-text-QcXok_SI.js +52 -0
- package/dist/{build-instance-DIIV9DbC.js → build-instance-BMnAudHn.js} +4 -3
- package/dist/{canonical-json-CFKyFOke.js → canonical-json-BC8_nMTw.js} +5 -3
- package/dist/{capability-CksyCWDH.d.ts → capability-BSslw1QV.d.ts} +44 -25
- package/dist/{capability-txATtKV4.js → capability-N1K9IpqS.js} +68 -42
- package/dist/casbin-Cr7RLtA3.js +30 -0
- package/dist/casbin-Dyu2gnUD.js +234 -0
- package/dist/casl-64gpT-8x.js +24 -0
- package/dist/casl-DjEDhTCP.js +299 -0
- package/dist/catalog/index.d.ts +74 -2
- package/dist/catalog/index.js +51 -2
- package/dist/{catalog-tZUyOfOv.js → catalog-BECMPrwc.js} +51 -6
- package/dist/catalog-DjhMYYCq.js +1 -0
- package/dist/catalog-R_A__RsH.js +52 -0
- package/dist/{catalog-doc-DWtg0gGR.js → catalog-doc-C9wjsfNY.js} +45 -23
- package/dist/catalog-fingerprint-CCP0-yQS.js +153 -0
- package/dist/chat/index.d.ts +2 -0
- package/dist/chat/index.js +224 -0
- package/dist/chat-sdk/index.d.ts +87 -0
- package/dist/chat-sdk/index.js +197 -0
- package/dist/claims-map-7oQ3ue4X.js +13 -0
- package/dist/claims-map-Ca-QX8C6.d.ts +32 -0
- package/dist/claude-agent/index.d.ts +7 -14
- package/dist/claude-agent/index.js +24 -27
- package/dist/clerk/index.d.ts +9 -8
- package/dist/clerk/index.js +9 -14
- package/dist/cli/bin.js +36 -17
- package/dist/cli/index.d.ts +19 -5
- package/dist/cli/index.js +164 -4
- package/dist/cloud/index.d.ts +102 -63
- package/dist/cloud/index.js +239 -340
- package/dist/cloud-CIoHNevm.js +87 -0
- package/dist/codemod-Bmj9dWMH.js +37 -0
- package/dist/codemod-Cxvvc70T.js +2084 -0
- package/dist/{collect-2SrB7lfk.js → collect-CrZJJnEF.js} +75 -11
- package/dist/collect-DloHbDVa.js +55 -0
- package/dist/collect-FlXJlhus.js +1 -0
- package/dist/command-L8EstFNm.js +6 -0
- package/dist/compile/index.d.ts +1 -1
- package/dist/compile/index.js +1 -2
- package/dist/{compile-CcEu2ZQ1.js → compile-CMqMx_IN.js} +11 -8
- package/dist/{compile-CtTP7eur.d.ts → compile-Ckm2HqBZ.d.ts} +5 -3
- package/dist/completion-BqhRBJD8.js +143 -0
- package/dist/config-B46rm9sc.js +26 -0
- package/dist/{config-BIjREpyE.js → config-bs_kZeYq.js} +12 -7
- package/dist/{config-report--Xb9APJS.js → config-report-DUgj62Ai.js} +15 -5
- package/dist/{connection-DUsczpB5.js → connection-DjhIJSs2.js} +6 -5
- package/dist/{context-DieZVJXu.js → context-bbFHR-0D.js} +2 -2
- package/dist/convex/index.d.ts +11 -10
- package/dist/convex/index.js +6 -4
- package/dist/create-0VZ7Pdiu.d.ts +107 -0
- package/dist/create-BDS7wc3y.d.ts +138 -0
- package/dist/create-BFfm17UA.d.ts +110 -0
- package/dist/create-BWRSXgOF.js +403 -0
- package/dist/create-C3b4B5eF.js +130 -0
- package/dist/{create-BBO24vj6.js → create-DnrmLnLW.js} +31 -32
- package/dist/{credential-kue0qpbm.js → credential-DM2um3ha.js} +152 -31
- package/dist/credentials-DPyHmYz5.js +74 -0
- package/dist/delegation-DaXVdDhM.js +286 -0
- package/dist/delivery/index.d.ts +5 -0
- package/dist/delivery/index.js +5 -0
- package/dist/delivery-DCAgNyCn.js +499 -0
- package/dist/delivery-event-xX4obB8F.js +40 -0
- package/dist/{denied-text-DfRk15uw.d.ts → denied-text-D8jDHgsl.d.ts} +5 -5
- package/dist/{describe-C3ldA9os.d.ts → describe-BZUsixiL.d.ts} +2 -2
- package/dist/{describe-Cgkp7eP0.js → describe-BybMRY7A.js} +6 -2
- package/dist/device-BARQ8eYG.js +193 -0
- package/dist/diff-CxZo9pTq.js +37 -0
- package/dist/{diff-rpqoe7Ag.js → diff-DCePiN6M.js} +60 -54
- package/dist/doctor-CxiwSfqH.js +44 -0
- package/dist/{doctor-owlv6ddh.js → doctor-DFjUxf2f.js} +245 -50
- package/dist/drizzle/index.d.ts +5 -3
- package/dist/drizzle/index.js +2 -2
- package/dist/elysia/index.d.ts +16 -13
- package/dist/elysia/index.js +13 -12
- package/dist/env-DJZrPjRi.js +8 -0
- package/dist/errors-BDUwg2qC.js +27 -0
- package/dist/{errors-drnfxYtm.js → errors-BKy0EfhN.js} +5 -9
- package/dist/errors-BWXBMaKK.d.ts +11 -0
- package/dist/{errors-OD_4c__H.d.ts → errors-C2PXIv4c.d.ts} +2 -2
- package/dist/errors-CWTY6uih.js +143 -0
- package/dist/evaluate-_R8QkWaf.js +1732 -0
- package/dist/evaluations-16UqqQ6W.d.ts +32 -0
- package/dist/{evaluations-C9YJsv3H.js → evaluations-DZ2CbV5k.js} +145 -34
- package/dist/eve/index.d.ts +12 -16
- package/dist/eve/index.js +22 -28
- package/dist/event-time-CsegxXxB.js +23 -0
- package/dist/expiry-D4_YKRKD.js +52 -0
- package/dist/express/index.d.ts +13 -10
- package/dist/express/index.js +12 -11
- package/dist/fastify/index.d.ts +25 -22
- package/dist/fastify/index.js +13 -12
- package/dist/fetch-adapter-g0ypLkID.js +120 -0
- package/dist/fetch-adapter-qKJBuRqy.d.ts +31 -0
- package/dist/fields-D9tPVUUS.js +203 -0
- package/dist/files-C5ZI27eV.js +124 -0
- package/dist/{fixtures-h2eG2OZV.js → fixtures-B7XrLeY7.js} +8 -7
- package/dist/flags-C3DktBDY.js +86 -0
- package/dist/{from-snapshot-7REQZe0H.js → from-snapshot-D2lZt4Dd.js} +55 -52
- package/dist/{grantee-CXY-0C87.js → grantee-Cn1HyUsI.js} +3 -3
- package/dist/{grantee-conditions-MQs5NIuX.js → grantee-conditions-CcXf8hMM.js} +4 -3
- package/dist/{grantee-match-fxYp9Nmt.js → grantee-match-DHArqY82.js} +5 -4
- package/dist/h3/index.d.ts +37 -0
- package/dist/h3/index.js +35 -0
- package/dist/headers-BIjfMaoC.js +8 -0
- package/dist/headers-CIbDTUTK.d.ts +7 -0
- package/dist/{helpers-C9YmyBIa.js → helpers-DTcZOzhF.js} +45 -38
- package/dist/hono/index.d.ts +12 -9
- package/dist/hono/index.js +13 -12
- package/dist/hosted-BZIAYvon.js +315 -0
- package/dist/hosted-DBDX0M-P.d.ts +78 -0
- package/dist/{http-DPuDaChb.d.ts → http-B_LphE5Y.d.ts} +1 -2
- package/dist/http-DXJ37RDA.js +46 -0
- package/dist/{http-BEbdMZ05.js → http-ujKm0JXE.js} +1 -2
- package/dist/{import-UHk1N7vH.js → import-CNV7I2Dw.js} +25 -20
- package/dist/{import-BFIlhetD.js → import-DMmOG27O.js} +190 -53
- package/dist/index-BcHcPyIo.d.ts +110 -0
- package/dist/index-CaxrMD1A.d.ts +1 -0
- package/dist/index-Chrs5fQ-.d.ts +210 -0
- package/dist/index-CxGUswIC.d.ts +431 -0
- package/dist/index-D8EovfsP.d.ts +91 -0
- package/dist/{index-UdVQgq48.d.ts → index-DOVf7RJv.d.ts} +431 -81
- package/dist/{index-BwMe94Xq.d.ts → index-SGdIQyzc.d.ts} +34 -16
- package/dist/index.d.ts +19 -15
- package/dist/index.js +31 -21
- package/dist/init-DeMYsnYJ.js +96 -0
- package/dist/init-GG6Jh8HD.js +95 -0
- package/dist/{instance-options-plkrsAog.d.ts → instance-options-Omfd793B.d.ts} +2 -2
- package/dist/instance-snapshot-Cxq4ygFc.js +600 -0
- package/dist/instant-BluqDvyS.js +19 -0
- package/dist/internals-Dk8A8fX3.js +17 -0
- package/dist/{json-schema-DBkdUuCO.js → json-schema-B-vAwlde.js} +45 -6
- package/dist/json-schema-CN_iLFH2.d.ts +40 -0
- package/dist/jwt/index.d.ts +18 -11
- package/dist/jwt/index.js +156 -135
- package/dist/{kernel-CB3LrIJM.js → kernel-5JatXyND.js} +52 -24
- package/dist/kysely/index.d.ts +5 -3
- package/dist/kysely/index.js +2 -2
- package/dist/load-BxEtwlBS.js +1 -0
- package/dist/{load-C3_oTHyO.js → load-DFS_ry0W.js} +22 -6
- package/dist/{load-jose-BL6LH4bL.js → load-jose-DZ4dnjri.js} +1 -4
- package/dist/login-Dfe5RlYk.js +68 -0
- package/dist/login-imhuwvn3.js +254 -0
- package/dist/manifest-C8IzW3Do.js +42 -0
- package/dist/manifest-CtKR3GXL.js +370 -0
- package/dist/manifest-json-CAGzls-C.js +9 -0
- package/dist/{manifest-uDS9y5de.d.ts → manifest-mx5ghSFM.d.ts} +9 -2
- package/dist/manifest-schema-C0kK_8V0.js +399 -0
- package/dist/{map-claims-AVlBaJoa.js → map-claims-D3oRmTk0.js} +13 -10
- package/dist/{map-error-BE27PYkE.js → map-error-TCAdw-eW.js} +3 -3
- package/dist/{markers-CiwAOZtO.js → markers-C6joDI3o.js} +2 -1
- package/dist/mcp/index.d.ts +22 -12
- package/dist/mcp/index.js +57 -39
- package/dist/{migrate-BwlB5-Wk.js → migrate-BShP7Vf4.js} +53 -14
- package/dist/nest/index.d.ts +12 -9
- package/dist/nest/index.js +15 -14
- package/dist/next/index.d.ts +18 -21
- package/dist/next/index.js +13 -11
- package/dist/next/plugin.d.ts +1 -1
- package/dist/next/plugin.js +2 -2
- package/dist/node/index.d.ts +10 -10
- package/dist/node/index.js +7 -9
- package/dist/{ocsf-uYFXGVw2.js → ocsf-BFp-PZZA.js} +22 -11
- package/dist/openai/index.d.ts +9 -16
- package/dist/openai/index.js +17 -24
- package/dist/openapi/index.d.ts +3 -3
- package/dist/openapi/index.js +1 -1
- package/dist/{openapi-DBzHQbov.js → openapi-B7HZ0f-r.js} +8 -8
- package/dist/{openapi-BJdBmYDG.js → openapi-DTaEmTSW.js} +10 -9
- package/dist/openapi-ahr8rHu3.js +138 -0
- package/dist/operation-findings-DgATDpvh.js +36 -0
- package/dist/operations-CxybZErY.d.ts +59 -0
- package/dist/orpc/index.d.ts +13 -10
- package/dist/orpc/index.js +20 -15
- package/dist/otel/index.d.ts +3 -2
- package/dist/otel/index.js +30 -7
- package/dist/output-Dyw8fyPF.js +88 -0
- package/dist/output-files-B3IZJksC.js +1 -0
- package/dist/{output-files-CgIsvdSa.js → output-files-DhRBBE4n.js} +24 -26
- package/dist/{permission-keys-B26jeyUv.js → ownership-BatFgAA4.js} +1698 -869
- package/dist/{package-root-DtNnpmUd.js → package-root-Dk_ETdkp.js} +1 -1
- package/dist/{parse-CVFQHk6c.js → parse-Cxq0WxrA.js} +2 -2
- package/dist/{parse-local-manifest-C-q02Pal.js → parse-local-manifest-CVSs6J9I.js} +1 -1
- package/dist/{parse-local-manifest-DvYUR0QL.d.ts → parse-local-manifest-DgqtruPn.d.ts} +1 -1
- package/dist/parse-request-D_tUXG6M.js +26 -0
- package/dist/paths-DXSHAMIa.js +42 -0
- package/dist/pdp/index.d.ts +7 -3
- package/dist/pdp/index.js +45 -26
- package/dist/{peer-BOr_kJE1.js → peer-C8swJ2GH.js} +23 -4
- package/dist/peer-CRvC7Hg1.js +1 -0
- package/dist/permdock-B9JxkBwC.js +868 -0
- package/dist/permdock-D7eeLJER.d.ts +502 -0
- package/dist/{permission-registry-BsblpB-z.js → permission-registry-Br4jSNVi.js} +3 -3
- package/dist/permissions-B-wCP5ZC.js +30 -0
- package/dist/{permissions-CCJ6lmxB.js → permissions-CZKiUfFM.js} +4 -3
- package/dist/{permissions-COH-KRgT.d.ts → permissions-oEWfl-kl.d.ts} +1 -2
- package/dist/policies-CO1oOymN.js +295 -0
- package/dist/{policy-ur0BBK_e.d.ts → policy-Czo4n3Hs.d.ts} +2 -2
- package/dist/{hosted-CBHgkzDl.js → policy-DLZJ5gAp.js} +17 -273
- package/dist/policy-from-catalog-DzhEc3Y9.js +450 -0
- package/dist/policy-module-CTlwMvLI.js +89 -0
- package/dist/{policy-types-sp9P1iIV.d.ts → policy-types-DzwivBgR.d.ts} +434 -631
- package/dist/postgrest-CW0IqC-U.js +566 -0
- package/dist/postgrest-NUqZT-RB.d.ts +100 -0
- package/dist/powersync-BHfuehf3.js +62 -0
- package/dist/powersync-CbzkqL_M.js +1 -0
- package/dist/{powersync-cZe4kzhL.js → powersync-bYUDLOAO.js} +23 -24
- package/dist/preset/index.d.ts +146 -0
- package/dist/preset/index.js +1 -0
- package/dist/preset-DZdU0tne.js +1768 -0
- package/dist/principal-source-pHneukrx.js +103 -0
- package/dist/prisma/index.d.ts +6 -3
- package/dist/prisma/index.js +2 -2
- package/dist/{problem-CnWraVhC.js → problem-CTviyH5L.js} +13 -23
- package/dist/{problem-details-rIIo8B2C.d.ts → problem-details-DXlt-vks.d.ts} +1 -1
- package/dist/{problem-details-DECUnXAn.js → problem-details-cn5X30gZ.js} +43 -40
- package/dist/problem-types-CJ2325SZ.js +5 -0
- package/dist/{prompt-CXYhLfsS.js → prompt-DfZLJLIn.js} +2 -2
- package/dist/{protected-B3_P7xuw.d.ts → protected-DEPHc2xV.d.ts} +16 -8
- package/dist/{protected-BN7BUdY1.js → protected-DfjY5mLA.js} +21 -4
- package/dist/{provider-Bi-0HNL3.js → provider-CC-u3bYP.js} +2 -2
- package/dist/{provider-kwHC9CZD.d.ts → provider-DMVt6yYn.d.ts} +1 -1
- package/dist/{provider-store-Ctt-81Ni.js → provider-store-B5Yrkhzr.js} +2 -2
- package/dist/pull-BgIfno6w.js +256 -0
- package/dist/pull-ByOks_Tg.js +1 -0
- package/dist/push-CmFVBOeI.js +116 -0
- package/dist/pushed-policy-BImMTTIM.d.ts +57 -0
- package/dist/pushed-policy-DobP7AHI.js +238 -0
- package/dist/react/index.d.ts +8 -8
- package/dist/react/index.js +6 -6
- package/dist/react/provider-client.d.ts +1 -1
- package/dist/react/provider-client.js +1 -2
- package/dist/react-native/index.d.ts +24 -72
- package/dist/react-native/index.js +24 -22
- package/dist/{refs-f3imMjNW.js → refs-K6eWUJ0H.js} +1 -1
- package/dist/{relation-walk-BXnlLtg2.js → relation-walk-3OyDBF0S.js} +2 -2
- package/dist/{relations-CvmSpG67.js → relations-BnCWnJGI.js} +3 -3
- package/dist/renames-CGj7YwcQ.js +175 -0
- package/dist/{replay-COpmZUfx.d.ts → replay-D7iKcLFe.d.ts} +1 -1
- package/dist/{replay-BsOyTrdV.js → replay-Du1tJjG7.js} +2 -1
- package/dist/{request-context-BVM7aWNs.js → request-context-BTRTG7OT.js} +3 -3
- package/dist/request-schema-CMreVuFM.js +148 -0
- package/dist/resend/index.d.ts +126 -0
- package/dist/resend/index.js +379 -0
- package/dist/{resource-relations-D1Un3pcz.js → resource-relations-D_jw0BFx.js} +1 -1
- package/dist/{retire-BFcxL6un.js → retire-CALjIQ7e.js} +2 -2
- package/dist/{revocations-Cy06JNx2.d.ts → revocations-R07lFBnX.d.ts} +2 -0
- package/dist/rls-BA8an5Ap.js +336 -0
- package/dist/{rls-BEktUaqg.js → rls-j6t43t7n.js} +287 -689
- package/dist/{role-builder-B4GbKM-i.js → role-builder-CXbis5-X.js} +14 -207
- package/dist/{rpc-nYC3cR_u.js → rpc-aPyNi6tA.js} +7 -7
- package/dist/run-CNsApDpd.js +1 -0
- package/dist/run-DOfMtc9V.js +723 -0
- package/dist/run-ticket-BjhTOi6u.d.ts +124 -0
- package/dist/run-ticket-sxFI6LAk.js +337 -0
- package/dist/{runtime-D_tMXnsq.js → runtime-D3VTAiCA.js} +1 -1
- package/dist/{saas-DtaA4JuW.js → saas-FO-Q8oj0.js} +16 -14
- package/dist/scan-BOI5tJ-6.js +29 -0
- package/dist/{schema-DjQBcAP9.js → schema-B4v0Qrac.js} +102 -8
- package/dist/schema-yLuBWWsh.js +130 -0
- package/dist/scim/index.d.ts +2 -2
- package/dist/scim/index.js +1 -2
- package/dist/{scim-vFR1O5oG.js → scim-ClHtpyV3.js} +208 -76
- package/dist/{scopes-tvpa34ep.js → scopes-CUPSjo9q.js} +12 -7
- package/dist/server/index.d.ts +12 -143
- package/dist/server/index.js +12 -9
- package/dist/server-DqCT4CgZ.js +453 -0
- package/dist/{server-types-DdqBwZN_.d.ts → server-types-BLd4MnBX.d.ts} +51 -68
- package/dist/{sha256-BO0swRXL.js → sha256-D9ihqmvd.js} +8 -1
- package/dist/{shared-1uhI-e-b.js → shared-CD11nBbC.js} +18 -8
- package/dist/{shared-JhMeOsDF.js → shared-DvvFzYXe.js} +8 -9
- package/dist/signals-D3NcTKUS.js +32 -0
- package/dist/sink-BEZSlMS_.js +957 -0
- package/dist/sink-Bj_lDUDq.d.ts +225 -0
- package/dist/{skills-BZdRQkxs.js → skills-B6lVdD_W.js} +13 -6
- package/dist/skills-CTYwkl44.js +51 -0
- package/dist/snapshot-CXUWfsNy.js +269 -0
- package/dist/{snapshot-cache-Cod40D-X.js → snapshot-cache-DZHQ0KF6.js} +11 -5
- package/dist/{snapshot-cache-J5T7t_vD.d.ts → snapshot-cache-DqK9eDmM.d.ts} +7 -5
- package/dist/solid/index.d.ts +11 -12
- package/dist/solid/index.js +7 -7
- package/dist/solid-start/index.d.ts +52 -0
- package/dist/solid-start/index.js +49 -0
- package/dist/{sources-Dljy06zL.d.ts → sources-BV9j0DeZ.d.ts} +7 -13
- package/dist/{sources-B1-b-R0t.js → sources-vs5dGOsS.js} +125 -119
- package/dist/{sql-t8teWOfo.js → sql-B5T1IL83.js} +13 -1
- package/dist/src-DLfUWFAI.js +1851 -0
- package/dist/ssf/index.d.ts +4 -4
- package/dist/ssf/index.js +384 -47
- package/dist/standard-webhooks-6lg8v_is.d.ts +88 -0
- package/dist/standard-webhooks-DgFFD-Ga.js +228 -0
- package/dist/storage-C2bWdvJH.js +132 -0
- package/dist/{store-ILkLUj_o.js → store-4u_hxjWa.js} +40 -53
- package/dist/{store-options-CbUHDoSe.js → store-options-BqEakYRa.js} +26 -21
- package/dist/{stores-BHXdSbw9.js → stores-BbsD4fAR.js} +2 -2
- package/dist/{stores-Cxz_80g-.d.ts → stores-ClZUgeoP.d.ts} +7 -8
- package/dist/{stream-Dwsg6WwE.d.ts → stream-7-xmnf3U.d.ts} +2 -2
- package/dist/{stream-BMui98KK.js → stream-CvdUS9V1.js} +9 -2
- package/dist/style-DiKWnAvn.js +1 -0
- package/dist/{style-CTm1AXDT.js → style-Uao76wO7.js} +3 -2
- package/dist/subject-BGoM5o8B.js +17 -0
- package/dist/supabase/index.d.ts +23 -106
- package/dist/supabase/index.js +5 -4
- package/dist/supabase/middleware.d.ts +7 -6
- package/dist/supabase/middleware.js +13 -11
- package/dist/supabase-9pqI57pW.js +92 -0
- package/dist/{supabase-C1TWlnYt.js → supabase-Dxlp8A94.js} +98 -205
- package/dist/supabase-hook-CXcGpHqq.js +1 -0
- package/dist/{supabase-hook-Cva3ikXz.js → supabase-hook-DdDQhMlw.js} +951 -60
- package/dist/support-session-C6xJQYut.js +158 -0
- package/dist/svelte/Protected.svelte +4 -4
- package/dist/svelte/index.d.ts +7 -7
- package/dist/svelte/index.js +10 -10
- package/dist/svelte/runtime.d.ts +3 -3
- package/dist/svelte/runtime.js +3 -3
- package/dist/svelte/source.d.ts +7 -7
- package/dist/svelte/source.js +4 -4
- package/dist/sveltekit/index.d.ts +51 -0
- package/dist/sveltekit/index.js +27 -0
- package/dist/tanstack-start/index.d.ts +51 -0
- package/dist/tanstack-start/index.js +40 -0
- package/dist/target-Bw37TFNA.js +51 -0
- package/dist/{tenancy-DshjqY0n.js → tenancy-DN2QAx9z.js} +5 -5
- package/dist/terminal/index.d.ts +11 -9
- package/dist/terminal/index.js +23 -287
- package/dist/testing/index.d.ts +311 -38
- package/dist/testing/index.js +3475 -201
- package/dist/testing/saas/index.d.ts +9 -8
- package/dist/testing/saas/index.js +2 -2
- package/dist/testing/saas/permissions.d.ts +1 -1
- package/dist/testing/saas/permissions.js +1 -2
- package/dist/text-BMFRfBqc.js +8 -0
- package/dist/{text-diff-BdkkYSbi.js → text-diff-BQcUapOb.js} +1 -1
- package/dist/thenable-yD7SabqG.js +31 -0
- package/dist/time-DkWjdL98.js +71 -0
- package/dist/{token-Bx9qy30p.js → token-BLZcjQgt.js} +15 -6
- package/dist/{tool-refusal-CQ7OEia9.js → tool-refusal-CMLN5xhn.js} +2 -2
- package/dist/trpc/index.d.ts +12 -9
- package/dist/trpc/index.js +16 -14
- package/dist/{types-7rJVLWe5.d.ts → types-5Ut_pbKy.d.ts} +61 -11
- package/dist/{store-9KO4BlkB.d.ts → types-BNORmDM8.d.ts} +100 -75
- package/dist/types-BjV-fqcA.d.ts +57 -0
- package/dist/{types-CUcFZfpU.d.ts → types-BqAKcRNW.d.ts} +2 -1
- package/dist/types-C8-KNsFf.d.ts +107 -0
- package/dist/{types-Br9IXUBG.d.ts → types-CCpc2Dcv.d.ts} +77 -17
- package/dist/{types-DpWfQdSh.d.ts → types-CZTnPFzM.d.ts} +46 -11
- package/dist/{types-CqrjB9o6.d.ts → types-CdlxsYQh.d.ts} +23 -11
- package/dist/{types-CIlTojhq.d.ts → types-ClZaWzfb.d.ts} +9 -6
- package/dist/types-DX0LaKTb.d.ts +157 -0
- package/dist/types-DiQjupG2.d.ts +332 -0
- package/dist/types-DqzsnlSA.js +67 -0
- package/dist/types-_sHy8BQf.d.ts +65 -0
- package/dist/{types-ByUo56un.d.ts → types-fbZ7JEXr.d.ts} +23 -22
- package/dist/{types-DHrmBJLH.d.ts → types-tIgIeIKJ.d.ts} +7 -7
- package/dist/unplugin/index.d.ts +1 -1
- package/dist/unplugin/index.js +2 -2
- package/dist/usage-CHOtwL19.js +1 -0
- package/dist/usage-DHtE8j4E.js +32 -0
- package/dist/{usage-CG9nOYZw.js → usage-T5mXq98v.js} +54 -11
- package/dist/{validation-error-BSSw0l_8.d.ts → validation-error-Bg5Tpluk.d.ts} +1 -1
- package/dist/{validity-dVrUEPJt.js → validity-CZ7-y0Cj.js} +32 -15
- package/dist/{verifier-DMr_Zmb_.js → verifier-DHuh-okk.js} +18 -7
- package/dist/{verify-BztUB3GX.js → verify-DbCL9bnB.js} +645 -50
- package/dist/{version-BEogC-rB.js → version-CEbQ5UeM.js} +4 -3
- package/dist/version-DXkYUISx.js +1 -0
- package/dist/{views-CJsrBS1f.js → views-DTIIO-oQ.js} +22 -5
- package/dist/{permission-types-Dg39z9Kv.d.ts → vocabulary-D6lPdb4Z.d.ts} +65 -2
- package/dist/vue/index.d.ts +9 -10
- package/dist/vue/index.js +8 -8
- package/dist/waiter-BGUtGYoU.js +67 -0
- package/dist/waiter-CKy4MQSY.d.ts +36 -0
- package/dist/watch-Cb-NcaUw.js +1 -0
- package/dist/{watch-zeucB7eF.js → watch-CszoTJMq.js} +44 -5
- package/dist/webmcp/index.d.ts +2 -2
- package/dist/webmcp/index.js +3 -3
- package/dist/where-scope-Dv-WTP-w.js +306 -0
- package/dist/who-can-D0QoYbEb.js +364 -0
- package/dist/wire-delegation-Cv3W2eaM.js +36 -0
- package/dist/wire-denial-C7PaVYEM.js +27 -0
- package/dist/workflow/index.d.ts +5 -0
- package/dist/workflow/index.js +223 -0
- package/dist/workflow-sdk/index.d.ts +56 -0
- package/dist/workflow-sdk/index.js +78 -0
- package/dist/{wrap-Cr93qqdP.d.ts → wrap-Bd1Tejur.d.ts} +2 -1
- package/dist/{wrap-DWsU_5Bd.js → wrap-gX61EtpB.js} +7 -6
- package/package.json +136 -37
- package/schemas/access-event-v1.json +118 -0
- package/schemas/approval-request-v1.json +34 -1
- package/schemas/approval-signature-v1.json +94 -0
- package/schemas/automation-event-v1.json +113 -0
- package/schemas/capability-v1.json +84 -0
- package/schemas/catalog-event-v1.json +87 -0
- package/schemas/catalog-v1.json +123 -12
- package/schemas/cli-commands-v1.json +164 -0
- package/schemas/cli-result-v1.json +96 -0
- package/schemas/cloud-api-v1.json +5407 -0
- package/schemas/connector-v1.json +408 -0
- package/schemas/credential-event-v1.json +81 -0
- package/schemas/credential-v1.json +134 -0
- package/schemas/decision-event-v1.json +288 -0
- package/schemas/delivery-event-v1.json +117 -0
- package/schemas/directory-event-v1.json +85 -0
- package/schemas/evidence-export-v1.json +54 -0
- package/schemas/membership-event-v1.json +93 -0
- package/schemas/policy-v1.json +68 -0
- package/schemas/pushed-policy-v1.json +236 -0
- package/schemas/run-v1.json +162 -0
- package/schemas/snapshot-v1.json +138 -0
- package/schemas/supabase-claims-v1.json +4 -4
- package/schemas/supabase-manifest-v1.json +5 -1
- package/schemas/support-session-v1.json +111 -0
- package/skills/permdock/SKILL.md +16 -12
- package/skills/permdock-agents/SKILL.md +40 -23
- package/skills/permdock-agents/references/operations-automations-chat.md +221 -0
- package/skills/permdock-agents/references/runtimes.md +22 -18
- package/skills/permdock-approvals/SKILL.md +29 -13
- package/skills/permdock-approvals/references/delivery-and-waiters.md +172 -0
- package/skills/permdock-approvals/references/stores-and-resume.md +21 -7
- package/skills/permdock-audit/SKILL.md +3 -3
- package/skills/permdock-credentials/SKILL.md +5 -5
- package/skills/permdock-credentials/references/tokens-keys-links.md +14 -10
- package/skills/permdock-data/SKILL.md +6 -6
- package/skills/permdock-data/references/queries-and-rls.md +9 -8
- package/skills/permdock-data/references/relationships.md +3 -3
- package/skills/permdock-tenancy/SKILL.md +20 -7
- package/skills/permdock-tenancy/references/contacts-and-support-sessions.md +122 -0
- package/skills/permdock-tenancy/references/ownership-and-custom-roles.md +5 -4
- package/skills/permdock-wire/SKILL.md +17 -11
- package/skills/permdock-wire/references/adapters.md +139 -51
- package/skills/permdock-wire/references/policy-options.md +5 -5
- package/skills/permdock-wire/references/presets-and-recipes.md +58 -0
- package/dist/approvals-DZL76lKW.js +0 -240
- package/dist/arazzo-CD8d0WLb.js +0 -54
- package/dist/catalog-6yWAX6Ps.js +0 -2
- package/dist/catalog-WHG4kBq7.js +0 -48
- package/dist/cloud-C7bSDgX4.js +0 -50
- package/dist/cloud-PeBN3IEn.js +0 -118
- package/dist/collect-Bw2Jdq1q.js +0 -2
- package/dist/collect-CQx4hX4N.js +0 -83
- package/dist/commands-Cpip4ULx.js +0 -97
- package/dist/config-DLt6BvV7.js +0 -36
- package/dist/diff-Cnghh_Ip.js +0 -48
- package/dist/doctor-CuVJvhV_.js +0 -53
- package/dist/duration-xK2jGFVc.js +0 -25
- package/dist/errors-CWfoNg9N.js +0 -47
- package/dist/errors-DRnGZHzF.js +0 -30
- package/dist/expiry-BoBJ8Tvc.js +0 -7
- package/dist/fields-fwfXN01n.js +0 -1016
- package/dist/headers-BZSDieNT.js +0 -6
- package/dist/headers-Cf-zWvsO.d.ts +0 -6
- package/dist/ids-DC4V4CFu.js +0 -18
- package/dist/index-DgM7w96K.d.ts +0 -6
- package/dist/index-Dz7didpC.d.ts +0 -201
- package/dist/load-B_shHrmd.js +0 -2
- package/dist/manifest-BngWKryL.js +0 -770
- package/dist/may-use-BOn_dR_w.js +0 -78
- package/dist/openapi-DcQ1Kg40.js +0 -164
- package/dist/ownership-BgnbOJFT.js +0 -851
- package/dist/permdock-L26udHSk.js +0 -3646
- package/dist/powersync-BFSbSElQ.js +0 -62
- package/dist/powersync-DCDgZgfZ.js +0 -2
- package/dist/rls-55DQTuf5.js +0 -250
- package/dist/run-DMcNW_8T.js +0 -174
- package/dist/server-ZYEHtNHS.js +0 -268
- package/dist/sink-BTtmfPnE.js +0 -141
- package/dist/sink-CPN4zLfs.d.ts +0 -104
- package/dist/skills-Dle4ZoLF.js +0 -56
- package/dist/snapshot-Dc9CHPME.js +0 -1078
- package/dist/src-Bb7no-hS.js +0 -639
- package/dist/subject-C6dLxqHU.js +0 -24
- package/dist/supabase-Dbqr141s.js +0 -83
- package/dist/supabase-hook-BULg7Ut_.js +0 -2
- package/dist/thenable-QSmvt-vZ.js +0 -65
- package/dist/types-C0dee0Qf.d.ts +0 -197
- package/dist/types-DvupZE0w.d.ts +0 -9
- package/dist/usage-4G6t643F.js +0 -42
- package/dist/usage-iFLJ0-rr.js +0 -2
- package/dist/vocabulary-hhEFLFoL.d.ts +0 -65
- package/dist/watch-C8TpsAl4.js +0 -2
|
@@ -0,0 +1,148 @@
|
|
|
1
|
+
//#region src/approvals/request-schema.ts
|
|
2
|
+
/** An RFC 3339 instant as `Temporal.Instant` prints it; pg_jsonschema asserts no `format`. */
|
|
3
|
+
const INSTANT = String.raw`^\d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}(\.\d+)?(Z|[+-]\d{2}:\d{2})$`;
|
|
4
|
+
const STRINGS = {
|
|
5
|
+
type: "array",
|
|
6
|
+
items: { type: "string" }
|
|
7
|
+
};
|
|
8
|
+
/**
|
|
9
|
+
* `schemas/approval-request-v1.json`: the `ApprovalRequest` an approval store
|
|
10
|
+
* holds. Self-contained (`$defs`, no remote `$ref`) so `rls.jsonSchema` can
|
|
11
|
+
* inline it into a pg_jsonschema check constraint.
|
|
12
|
+
*/
|
|
13
|
+
const APPROVAL_REQUEST_SCHEMA = {
|
|
14
|
+
$schema: "https://json-schema.org/draft/2020-12/schema",
|
|
15
|
+
$id: "https://permdock.com/schemas/approval-request-v1.json",
|
|
16
|
+
title: "PermDock approval request",
|
|
17
|
+
description: "An ApprovalRequest as an ApprovalStore holds it, wire format v1. Unknown properties are allowed so a v1 minor release can add one.",
|
|
18
|
+
type: "object",
|
|
19
|
+
required: [
|
|
20
|
+
"v",
|
|
21
|
+
"id",
|
|
22
|
+
"token",
|
|
23
|
+
"permission",
|
|
24
|
+
"scope",
|
|
25
|
+
"resource",
|
|
26
|
+
"subject",
|
|
27
|
+
"detail",
|
|
28
|
+
"createdAt",
|
|
29
|
+
"expiresAt",
|
|
30
|
+
"status"
|
|
31
|
+
],
|
|
32
|
+
properties: {
|
|
33
|
+
v: { const: 1 },
|
|
34
|
+
id: {
|
|
35
|
+
type: "string",
|
|
36
|
+
minLength: 1
|
|
37
|
+
},
|
|
38
|
+
token: {
|
|
39
|
+
type: "string",
|
|
40
|
+
minLength: 1
|
|
41
|
+
},
|
|
42
|
+
permission: {
|
|
43
|
+
type: "string",
|
|
44
|
+
minLength: 1
|
|
45
|
+
},
|
|
46
|
+
scope: { type: "string" },
|
|
47
|
+
resource: {
|
|
48
|
+
type: "object",
|
|
49
|
+
required: ["type"],
|
|
50
|
+
properties: {
|
|
51
|
+
type: { type: "string" },
|
|
52
|
+
id: { type: "string" }
|
|
53
|
+
}
|
|
54
|
+
},
|
|
55
|
+
subject: { $ref: "#/$defs/subject" },
|
|
56
|
+
membership: {
|
|
57
|
+
type: "object",
|
|
58
|
+
required: ["roles"],
|
|
59
|
+
properties: { roles: STRINGS }
|
|
60
|
+
},
|
|
61
|
+
approvers: { type: "object" },
|
|
62
|
+
detail: { type: "string" },
|
|
63
|
+
adapter: { type: "string" },
|
|
64
|
+
createdAt: { $ref: "#/$defs/instant" },
|
|
65
|
+
expiresAt: { $ref: "#/$defs/instant" },
|
|
66
|
+
status: { enum: [
|
|
67
|
+
"pending",
|
|
68
|
+
"approved",
|
|
69
|
+
"rejected",
|
|
70
|
+
"expired"
|
|
71
|
+
] },
|
|
72
|
+
approvals: {
|
|
73
|
+
type: "array",
|
|
74
|
+
items: { $ref: "#/$defs/signature" }
|
|
75
|
+
},
|
|
76
|
+
resolvedAt: { $ref: "#/$defs/instant" },
|
|
77
|
+
resolvedBy: { type: "string" },
|
|
78
|
+
vouched: { type: "string" },
|
|
79
|
+
note: { type: "string" },
|
|
80
|
+
consumedAt: { $ref: "#/$defs/instant" },
|
|
81
|
+
x: {
|
|
82
|
+
type: "object",
|
|
83
|
+
description: "The application's own data, set when the request opens: plain JSON, never read by a decision."
|
|
84
|
+
}
|
|
85
|
+
},
|
|
86
|
+
$defs: {
|
|
87
|
+
instant: {
|
|
88
|
+
type: "string",
|
|
89
|
+
format: "date-time",
|
|
90
|
+
pattern: INSTANT
|
|
91
|
+
},
|
|
92
|
+
subject: {
|
|
93
|
+
type: "object",
|
|
94
|
+
required: ["principal"],
|
|
95
|
+
properties: {
|
|
96
|
+
principal: { anyOf: [{ type: "null" }, {
|
|
97
|
+
type: "object",
|
|
98
|
+
required: ["id", "roles"],
|
|
99
|
+
properties: {
|
|
100
|
+
id: { type: "string" },
|
|
101
|
+
roles: STRINGS,
|
|
102
|
+
tenant: { type: "string" }
|
|
103
|
+
}
|
|
104
|
+
}] },
|
|
105
|
+
actor: {
|
|
106
|
+
type: "object",
|
|
107
|
+
required: ["id", "kind"],
|
|
108
|
+
properties: {
|
|
109
|
+
id: { type: "string" },
|
|
110
|
+
kind: { type: "string" }
|
|
111
|
+
}
|
|
112
|
+
},
|
|
113
|
+
session: { type: "string" },
|
|
114
|
+
delegation: {
|
|
115
|
+
type: "object",
|
|
116
|
+
properties: {
|
|
117
|
+
scope: { type: "string" },
|
|
118
|
+
authorization_details: {
|
|
119
|
+
type: "array",
|
|
120
|
+
items: {
|
|
121
|
+
type: "object",
|
|
122
|
+
required: ["type"],
|
|
123
|
+
properties: { type: { type: "string" } }
|
|
124
|
+
}
|
|
125
|
+
}
|
|
126
|
+
}
|
|
127
|
+
}
|
|
128
|
+
}
|
|
129
|
+
},
|
|
130
|
+
signature: {
|
|
131
|
+
type: "object",
|
|
132
|
+
required: ["by", "at"],
|
|
133
|
+
properties: {
|
|
134
|
+
by: { type: "string" },
|
|
135
|
+
at: { $ref: "#/$defs/instant" },
|
|
136
|
+
stage: {
|
|
137
|
+
type: "integer",
|
|
138
|
+
minimum: 0
|
|
139
|
+
},
|
|
140
|
+
vouched: { type: "string" },
|
|
141
|
+
onBehalfOf: { type: "string" },
|
|
142
|
+
delegation: { type: "string" }
|
|
143
|
+
}
|
|
144
|
+
}
|
|
145
|
+
}
|
|
146
|
+
};
|
|
147
|
+
//#endregion
|
|
148
|
+
export { APPROVAL_REQUEST_SCHEMA as t };
|
|
@@ -0,0 +1,126 @@
|
|
|
1
|
+
import { q as DecisionSink } from "../policy-types-DzwivBgR.js";
|
|
2
|
+
import { n as ApprovalUrl, t as ApprovalPrompt } from "../approval-prompt-Djo_PyZc.js";
|
|
3
|
+
import { d as EmailTransport, o as DeliveryResult, u as EmailMessage } from "../types-DX0LaKTb.js";
|
|
4
|
+
import { l as ReplayStore } from "../types-DiQjupG2.js";
|
|
5
|
+
//#region src/resend/approval-email.d.ts
|
|
6
|
+
type ApprovalEmailOptions = {
|
|
7
|
+
/** The app's approval page: a base the request id is appended to, or a function of the prompt. Must be https. */
|
|
8
|
+
readonly approvalUrl: ApprovalUrl;
|
|
9
|
+
/** The product name in the footer line. */
|
|
10
|
+
readonly product?: string;
|
|
11
|
+
};
|
|
12
|
+
/**
|
|
13
|
+
* The default approval prompt email: an `approval`-category message whose
|
|
14
|
+
* one link opens the app's approval page for the request. It carries no
|
|
15
|
+
* approve or reject link; the signed-in approver decides on that page.
|
|
16
|
+
* Throws a `TypeError` for an approval page that is not https. Replace it
|
|
17
|
+
* with a React Email template by building the same `EmailMessage`.
|
|
18
|
+
*/
|
|
19
|
+
export declare function approvalEmail(prompt: ApprovalPrompt, options: ApprovalEmailOptions): EmailMessage;
|
|
20
|
+
//#endregion
|
|
21
|
+
//#region src/resend/transport.d.ts
|
|
22
|
+
/** One email as `resend.emails.send` and `resend.batch.send` take it. */
|
|
23
|
+
type ResendEmailPayload = {
|
|
24
|
+
readonly from: string;
|
|
25
|
+
readonly to: string[];
|
|
26
|
+
readonly subject: string;
|
|
27
|
+
readonly text: string;
|
|
28
|
+
readonly html?: string;
|
|
29
|
+
readonly replyTo?: string;
|
|
30
|
+
readonly headers?: Record<string, string>;
|
|
31
|
+
readonly tags?: {
|
|
32
|
+
readonly name: string;
|
|
33
|
+
readonly value: string;
|
|
34
|
+
}[];
|
|
35
|
+
};
|
|
36
|
+
type ResendError = {
|
|
37
|
+
readonly name: string;
|
|
38
|
+
readonly message: string;
|
|
39
|
+
readonly statusCode: number | null;
|
|
40
|
+
};
|
|
41
|
+
type ResendResult<T> = {
|
|
42
|
+
readonly data: T;
|
|
43
|
+
readonly error: null;
|
|
44
|
+
} | {
|
|
45
|
+
readonly data: null;
|
|
46
|
+
readonly error: ResendError;
|
|
47
|
+
};
|
|
48
|
+
/** The part of a `Resend` client the transport calls; a `new Resend(key)` fits. */
|
|
49
|
+
type ResendClient = {
|
|
50
|
+
readonly emails: {
|
|
51
|
+
send(payload: ResendEmailPayload, options?: {
|
|
52
|
+
readonly idempotencyKey?: string;
|
|
53
|
+
}): Promise<ResendResult<{
|
|
54
|
+
readonly id: string;
|
|
55
|
+
}>>;
|
|
56
|
+
};
|
|
57
|
+
readonly batch?: {
|
|
58
|
+
send(payloads: ResendEmailPayload[], options?: {
|
|
59
|
+
readonly idempotencyKey?: string;
|
|
60
|
+
}): Promise<ResendResult<{
|
|
61
|
+
readonly data: readonly {
|
|
62
|
+
readonly id: string;
|
|
63
|
+
}[];
|
|
64
|
+
}>>;
|
|
65
|
+
};
|
|
66
|
+
};
|
|
67
|
+
type ResendTransportOptions = {
|
|
68
|
+
/** The `from` of an email whose message and router set none. */
|
|
69
|
+
readonly from?: string;
|
|
70
|
+
/** The `replyTo` of an email whose message sets none. */
|
|
71
|
+
readonly replyTo?: string;
|
|
72
|
+
/** Tags added to every email; names and values are ASCII letters, digits, `_` and `-`. */
|
|
73
|
+
readonly tags?: Readonly<Record<string, string>>;
|
|
74
|
+
};
|
|
75
|
+
/**
|
|
76
|
+
* The failure a Resend error name means. Rate limits, quotas and server
|
|
77
|
+
* errors are retryable with the same idempotency key; a key, sender or
|
|
78
|
+
* validation error is final. An unknown name is retryable only for a 5xx or
|
|
79
|
+
* a missing status.
|
|
80
|
+
*/
|
|
81
|
+
export declare function resendFailure(error: ResendError): DeliveryResult;
|
|
82
|
+
/**
|
|
83
|
+
* Sends the email channel of `permdock/delivery` through Resend. The
|
|
84
|
+
* idempotency key is Resend's `idempotencyKey`. The delivery id, key and
|
|
85
|
+
* category travel as tags, so `resendWebhook` can join provider events to
|
|
86
|
+
* the delivery. Two or more recipients go out through `batch.send`, up to
|
|
87
|
+
* 100 per call. Throws a `TypeError` for a tag outside Resend's charset.
|
|
88
|
+
*/
|
|
89
|
+
export declare function resendTransport(resend: ResendClient, options?: ResendTransportOptions): EmailTransport;
|
|
90
|
+
//#endregion
|
|
91
|
+
//#region src/resend/webhook.d.ts
|
|
92
|
+
/** The part of a `Resend` client the webhook calls; a `new Resend(key)` fits. */
|
|
93
|
+
type ResendWebhookClient = {
|
|
94
|
+
readonly webhooks: {
|
|
95
|
+
verify(input: {
|
|
96
|
+
readonly payload: string;
|
|
97
|
+
readonly headers: {
|
|
98
|
+
readonly id: string;
|
|
99
|
+
readonly timestamp: string;
|
|
100
|
+
readonly signature: string;
|
|
101
|
+
};
|
|
102
|
+
readonly webhookSecret: string;
|
|
103
|
+
}): unknown;
|
|
104
|
+
};
|
|
105
|
+
};
|
|
106
|
+
type ResendWebhookOptions = {
|
|
107
|
+
readonly resend: ResendWebhookClient;
|
|
108
|
+
/** The endpoint's signing secret, `whsec_…`. */
|
|
109
|
+
readonly secret: string;
|
|
110
|
+
readonly sink: DecisionSink;
|
|
111
|
+
/** Claims each message id, so a redelivered message writes no second event. */
|
|
112
|
+
readonly replay: ReplayStore;
|
|
113
|
+
/** The event `source`; defaults to `permdock`. */
|
|
114
|
+
readonly source?: string;
|
|
115
|
+
};
|
|
116
|
+
/**
|
|
117
|
+
* A fetch handler for Resend webhooks. It verifies the Standard Webhooks
|
|
118
|
+
* signature through `resend.webhooks.verify` (the `svix-*` and `webhook-*`
|
|
119
|
+
* header names both work), claims the message id, and writes one delivery
|
|
120
|
+
* event for `email.delivered`, `email.bounced`, `email.complained`,
|
|
121
|
+
* `email.failed` and `email.suppressed`. A bad signature is a `401`; a sink
|
|
122
|
+
* failure releases the claim and answers `503`, so Resend retries.
|
|
123
|
+
*/
|
|
124
|
+
export declare function resendWebhook(options: ResendWebhookOptions): (request: Request) => Promise<Response>;
|
|
125
|
+
//#endregion
|
|
126
|
+
export type { ApprovalEmailOptions, ResendClient, ResendEmailPayload, ResendError, ResendResult, ResendTransportOptions, ResendWebhookClient, ResendWebhookOptions };
|
|
@@ -0,0 +1,379 @@
|
|
|
1
|
+
import { t as compact } from "../compact-CAf557ZB.js";
|
|
2
|
+
import { a as ownRecord } from "../paths-DXSHAMIa.js";
|
|
3
|
+
import { o as statusProblem } from "../problem-details-cn5X30gZ.js";
|
|
4
|
+
import { l as isRfc3339, p as nowSeconds } from "../time-DkWjdL98.js";
|
|
5
|
+
import { n as sha256, t as bytesToBase64Url } from "../sha256-D9ihqmvd.js";
|
|
6
|
+
import { t as deliveryEvent } from "../delivery-event-xX4obB8F.js";
|
|
7
|
+
import { n as readBodyText } from "../body-text-QcXok_SI.js";
|
|
8
|
+
import { a as methodNotAllowed, c as problemResponse } from "../problem-CTviyH5L.js";
|
|
9
|
+
import { t as bodyTooLarge } from "../body-CH5of8Ne.js";
|
|
10
|
+
import { n as approvalUrlFor } from "../approval-prompt-Dg5LeAcT.js";
|
|
11
|
+
import { i as isDeliveryTarget } from "../target-Bw37TFNA.js";
|
|
12
|
+
//#region src/resend/approval-email.ts
|
|
13
|
+
const HTML_ESCAPES = {
|
|
14
|
+
"&": "&",
|
|
15
|
+
"<": "<",
|
|
16
|
+
">": ">",
|
|
17
|
+
"\"": """,
|
|
18
|
+
"'": "'"
|
|
19
|
+
};
|
|
20
|
+
function escapeHtml(value) {
|
|
21
|
+
return value.replaceAll(/[&<>"']/gu, (char) => HTML_ESCAPES[char] ?? char);
|
|
22
|
+
}
|
|
23
|
+
function oneLine(value) {
|
|
24
|
+
return value.replaceAll(/\s+/gu, " ").trim();
|
|
25
|
+
}
|
|
26
|
+
function requesterLine(prompt) {
|
|
27
|
+
const principal = prompt.requester.principal?.id ?? "an anonymous caller";
|
|
28
|
+
const actor = prompt.requester.actor;
|
|
29
|
+
return actor === void 0 ? `Requested by ${principal}` : `Requested by ${principal} through ${actor.kind} ${actor.id}`;
|
|
30
|
+
}
|
|
31
|
+
/**
|
|
32
|
+
* The default approval prompt email: an `approval`-category message whose
|
|
33
|
+
* one link opens the app's approval page for the request. It carries no
|
|
34
|
+
* approve or reject link; the signed-in approver decides on that page.
|
|
35
|
+
* Throws a `TypeError` for an approval page that is not https. Replace it
|
|
36
|
+
* with a React Email template by building the same `EmailMessage`.
|
|
37
|
+
*/
|
|
38
|
+
function approvalEmail(prompt, options) {
|
|
39
|
+
const url = approvalUrlFor(prompt, options.approvalUrl);
|
|
40
|
+
const title = oneLine(prompt.operation?.title ?? prompt.detail);
|
|
41
|
+
const resource = prompt.resource.id === void 0 ? prompt.resource.type : `${prompt.resource.type} ${prompt.resource.id}`;
|
|
42
|
+
const lines = [
|
|
43
|
+
prompt.detail,
|
|
44
|
+
"",
|
|
45
|
+
`${requesterLine(prompt)}.`,
|
|
46
|
+
`Permission: ${prompt.permission} on ${resource}`,
|
|
47
|
+
...prompt.operation?.risk === void 0 ? [] : [`Risk: ${prompt.operation.risk}`],
|
|
48
|
+
`Expires ${prompt.expiresAt}`,
|
|
49
|
+
"",
|
|
50
|
+
`Review the request: ${url}`,
|
|
51
|
+
"",
|
|
52
|
+
`This link opens the approval page. Nothing is approved until you decide there${options.product === void 0 ? "" : ` in ${options.product}`}.`
|
|
53
|
+
];
|
|
54
|
+
const facts = lines.slice(2, lines.indexOf("", 2)).map((line) => `<li>${escapeHtml(line)}</li>`).join("");
|
|
55
|
+
const html = [
|
|
56
|
+
`<p>${escapeHtml(prompt.detail)}</p>`,
|
|
57
|
+
`<ul>${facts}</ul>`,
|
|
58
|
+
`<p><a href="${escapeHtml(url)}">Review the request</a></p>`,
|
|
59
|
+
`<p>${escapeHtml(lines.at(-1) ?? "")}</p>`
|
|
60
|
+
].join("\n");
|
|
61
|
+
return Object.freeze({
|
|
62
|
+
subject: `Approval needed: ${title}`,
|
|
63
|
+
text: lines.join("\n"),
|
|
64
|
+
html,
|
|
65
|
+
category: "approval"
|
|
66
|
+
});
|
|
67
|
+
}
|
|
68
|
+
//#endregion
|
|
69
|
+
//#region src/resend/transport.ts
|
|
70
|
+
/** Resend's tag charset, at most 256 characters. */
|
|
71
|
+
const TAG = /^[A-Za-z0-9_-]{1,256}$/u;
|
|
72
|
+
const DELIVERY_TAG = "permdock_delivery";
|
|
73
|
+
const KEY_TAG = "permdock_key";
|
|
74
|
+
const CATEGORY_TAG = "permdock_category";
|
|
75
|
+
const RESERVED_TAGS = /* @__PURE__ */ new Set([
|
|
76
|
+
DELIVERY_TAG,
|
|
77
|
+
KEY_TAG,
|
|
78
|
+
CATEGORY_TAG
|
|
79
|
+
]);
|
|
80
|
+
const RETRYABLE = {
|
|
81
|
+
rate_limit_exceeded: "rate-limited",
|
|
82
|
+
daily_quota_exceeded: "quota-exceeded",
|
|
83
|
+
monthly_quota_exceeded: "quota-exceeded",
|
|
84
|
+
concurrent_idempotent_requests: "unavailable",
|
|
85
|
+
internal_server_error: "unavailable",
|
|
86
|
+
application_error: "unavailable"
|
|
87
|
+
};
|
|
88
|
+
const FINAL = {
|
|
89
|
+
invalid_api_key: "unauthorized",
|
|
90
|
+
missing_api_key: "unauthorized",
|
|
91
|
+
restricted_api_key: "unauthorized",
|
|
92
|
+
invalid_access: "unauthorized",
|
|
93
|
+
invalid_from_address: "invalid-message",
|
|
94
|
+
invalid_attachment: "invalid-message",
|
|
95
|
+
validation_error: "rejected"
|
|
96
|
+
};
|
|
97
|
+
/**
|
|
98
|
+
* The failure a Resend error name means. Rate limits, quotas and server
|
|
99
|
+
* errors are retryable with the same idempotency key; a key, sender or
|
|
100
|
+
* validation error is final. An unknown name is retryable only for a 5xx or
|
|
101
|
+
* a missing status.
|
|
102
|
+
*/
|
|
103
|
+
function resendFailure(error) {
|
|
104
|
+
const name = error.name;
|
|
105
|
+
const retryable = Object.hasOwn(RETRYABLE, name) ? RETRYABLE[name] : void 0;
|
|
106
|
+
if (retryable !== void 0) return {
|
|
107
|
+
status: "failed",
|
|
108
|
+
cause: retryable,
|
|
109
|
+
retryable: true,
|
|
110
|
+
reason: name
|
|
111
|
+
};
|
|
112
|
+
const final = Object.hasOwn(FINAL, name) ? FINAL[name] : void 0;
|
|
113
|
+
if (final !== void 0) return {
|
|
114
|
+
status: "failed",
|
|
115
|
+
cause: final,
|
|
116
|
+
retryable: false,
|
|
117
|
+
reason: name
|
|
118
|
+
};
|
|
119
|
+
const status = error.statusCode;
|
|
120
|
+
return status === null || status >= 500 ? {
|
|
121
|
+
status: "failed",
|
|
122
|
+
cause: "unavailable",
|
|
123
|
+
retryable: true,
|
|
124
|
+
reason: name
|
|
125
|
+
} : {
|
|
126
|
+
status: "failed",
|
|
127
|
+
cause: "rejected",
|
|
128
|
+
retryable: false,
|
|
129
|
+
reason: name
|
|
130
|
+
};
|
|
131
|
+
}
|
|
132
|
+
const UNAVAILABLE = Object.freeze({
|
|
133
|
+
status: "failed",
|
|
134
|
+
cause: "unavailable",
|
|
135
|
+
retryable: true,
|
|
136
|
+
reason: "request failed"
|
|
137
|
+
});
|
|
138
|
+
function checkTags(tags) {
|
|
139
|
+
return Object.entries(tags).map(([name, value]) => {
|
|
140
|
+
if (!TAG.test(name) || !TAG.test(value) || RESERVED_TAGS.has(name)) throw new TypeError(`PermDock: Resend tag ${JSON.stringify(name)} is reserved or outside [A-Za-z0-9_-]`);
|
|
141
|
+
return {
|
|
142
|
+
name,
|
|
143
|
+
value
|
|
144
|
+
};
|
|
145
|
+
});
|
|
146
|
+
}
|
|
147
|
+
const REFUSED = Object.freeze({
|
|
148
|
+
status: "failed",
|
|
149
|
+
cause: "invalid-recipient",
|
|
150
|
+
retryable: false
|
|
151
|
+
});
|
|
152
|
+
async function sendBatch(resend, items, payloadOf) {
|
|
153
|
+
const results = items.map(() => REFUSED);
|
|
154
|
+
const valid = items.flatMap((item, index) => isDeliveryTarget(item.target, "email") ? [index] : []);
|
|
155
|
+
if (valid.length === 0 || resend.batch === void 0) return results;
|
|
156
|
+
const key = `pdb_${bytesToBase64Url(sha256(JSON.stringify(valid.map((index) => items[index]?.options.idempotencyKey))))}`;
|
|
157
|
+
let answer;
|
|
158
|
+
try {
|
|
159
|
+
answer = await resend.batch.send(valid.flatMap((index) => {
|
|
160
|
+
const item = items[index];
|
|
161
|
+
return item === void 0 ? [] : [payloadOf(item.target, item.message, item.options)];
|
|
162
|
+
}), { idempotencyKey: key });
|
|
163
|
+
} catch {
|
|
164
|
+
answer = void 0;
|
|
165
|
+
}
|
|
166
|
+
for (const [offset, index] of valid.entries()) {
|
|
167
|
+
if (answer === void 0) {
|
|
168
|
+
results[index] = UNAVAILABLE;
|
|
169
|
+
continue;
|
|
170
|
+
}
|
|
171
|
+
if (answer.error !== null) {
|
|
172
|
+
results[index] = resendFailure(answer.error);
|
|
173
|
+
continue;
|
|
174
|
+
}
|
|
175
|
+
const id = answer.data.data[offset]?.id;
|
|
176
|
+
results[index] = id === void 0 ? UNAVAILABLE : {
|
|
177
|
+
status: "sent",
|
|
178
|
+
providerId: id
|
|
179
|
+
};
|
|
180
|
+
}
|
|
181
|
+
return results;
|
|
182
|
+
}
|
|
183
|
+
/**
|
|
184
|
+
* Sends the email channel of `permdock/delivery` through Resend. The
|
|
185
|
+
* idempotency key is Resend's `idempotencyKey`. The delivery id, key and
|
|
186
|
+
* category travel as tags, so `resendWebhook` can join provider events to
|
|
187
|
+
* the delivery. Two or more recipients go out through `batch.send`, up to
|
|
188
|
+
* 100 per call. Throws a `TypeError` for a tag outside Resend's charset.
|
|
189
|
+
*/
|
|
190
|
+
function resendTransport(resend, options = {}) {
|
|
191
|
+
const tags = checkTags(options.tags ?? {});
|
|
192
|
+
const payloadOf = (target, email, transportOptions) => compact({
|
|
193
|
+
from: email.from,
|
|
194
|
+
to: [target.address],
|
|
195
|
+
replyTo: email.replyTo ?? options.replyTo,
|
|
196
|
+
subject: email.subject,
|
|
197
|
+
text: email.text,
|
|
198
|
+
html: email.html,
|
|
199
|
+
headers: { ...email.headers },
|
|
200
|
+
tags: [
|
|
201
|
+
...tags,
|
|
202
|
+
...TAG.test(transportOptions.delivery) ? [{
|
|
203
|
+
name: DELIVERY_TAG,
|
|
204
|
+
value: transportOptions.delivery
|
|
205
|
+
}] : [],
|
|
206
|
+
{
|
|
207
|
+
name: KEY_TAG,
|
|
208
|
+
value: transportOptions.idempotencyKey
|
|
209
|
+
},
|
|
210
|
+
{
|
|
211
|
+
name: CATEGORY_TAG,
|
|
212
|
+
value: email.category
|
|
213
|
+
}
|
|
214
|
+
]
|
|
215
|
+
});
|
|
216
|
+
return Object.freeze(compact({
|
|
217
|
+
channel: "email",
|
|
218
|
+
name: "resend",
|
|
219
|
+
from: options.from,
|
|
220
|
+
batchSize: 100,
|
|
221
|
+
async deliver(target, email, transportOptions) {
|
|
222
|
+
if (!isDeliveryTarget(target, "email")) return REFUSED;
|
|
223
|
+
try {
|
|
224
|
+
const { data, error } = await resend.emails.send(payloadOf(target, email, transportOptions), { idempotencyKey: transportOptions.idempotencyKey });
|
|
225
|
+
if (error !== null) return resendFailure(error);
|
|
226
|
+
return {
|
|
227
|
+
status: "sent",
|
|
228
|
+
providerId: data.id
|
|
229
|
+
};
|
|
230
|
+
} catch {
|
|
231
|
+
return UNAVAILABLE;
|
|
232
|
+
}
|
|
233
|
+
},
|
|
234
|
+
deliverBatch: resend.batch === void 0 ? void 0 : (items) => sendBatch(resend, items, payloadOf)
|
|
235
|
+
}));
|
|
236
|
+
}
|
|
237
|
+
//#endregion
|
|
238
|
+
//#region src/resend/webhook.ts
|
|
239
|
+
/** Resend allows 5 minutes of clock skew either way; a claim outlives both. */
|
|
240
|
+
const CLAIM_SECONDS = 600;
|
|
241
|
+
const MAX_BODY = 1e6;
|
|
242
|
+
const CATEGORIES = /* @__PURE__ */ new Set([
|
|
243
|
+
"transactional",
|
|
244
|
+
"notification",
|
|
245
|
+
"security",
|
|
246
|
+
"approval"
|
|
247
|
+
]);
|
|
248
|
+
function header(request, name) {
|
|
249
|
+
return request.headers.get(`svix-${name}`) ?? request.headers.get(`webhook-${name}`);
|
|
250
|
+
}
|
|
251
|
+
function text(value) {
|
|
252
|
+
return typeof value === "string" && value !== "" ? value : void 0;
|
|
253
|
+
}
|
|
254
|
+
function joined(...parts) {
|
|
255
|
+
const found = parts.map(text).filter((part) => part !== void 0);
|
|
256
|
+
return found.length === 0 ? void 0 : found.join(": ");
|
|
257
|
+
}
|
|
258
|
+
function outcomeOf(type, data) {
|
|
259
|
+
switch (type) {
|
|
260
|
+
case "email.delivered": return { operation: "delivered" };
|
|
261
|
+
case "email.complained": return { operation: "complained" };
|
|
262
|
+
case "email.bounced": {
|
|
263
|
+
const bounce = ownRecord(data["bounce"]);
|
|
264
|
+
return compact({
|
|
265
|
+
operation: "bounced",
|
|
266
|
+
reason: joined(bounce?.["type"], bounce?.["message"])
|
|
267
|
+
});
|
|
268
|
+
}
|
|
269
|
+
case "email.failed": return compact({
|
|
270
|
+
operation: "failed",
|
|
271
|
+
cause: "rejected",
|
|
272
|
+
retryable: false,
|
|
273
|
+
reason: text(ownRecord(data["failed"])?.["reason"])
|
|
274
|
+
});
|
|
275
|
+
case "email.suppressed": {
|
|
276
|
+
const suppressed = ownRecord(data["suppressed"]);
|
|
277
|
+
return compact({
|
|
278
|
+
operation: "failed",
|
|
279
|
+
cause: "suppressed",
|
|
280
|
+
retryable: false,
|
|
281
|
+
reason: joined(suppressed?.["type"], suppressed?.["message"])
|
|
282
|
+
});
|
|
283
|
+
}
|
|
284
|
+
default: return;
|
|
285
|
+
}
|
|
286
|
+
}
|
|
287
|
+
/**
|
|
288
|
+
* The delivery event a verified Resend payload stands for, or `null` for
|
|
289
|
+
* one that is not about a PermDock delivery: opens and clicks (tracking,
|
|
290
|
+
* not delivery), sends, contact and domain events, and mail without the
|
|
291
|
+
* `permdock_delivery` and `permdock_key` tags.
|
|
292
|
+
*/
|
|
293
|
+
function eventOf(payload, source) {
|
|
294
|
+
const record = ownRecord(payload);
|
|
295
|
+
const data = ownRecord(record?.["data"]);
|
|
296
|
+
if (record === void 0 || data === void 0) return null;
|
|
297
|
+
const outcome = outcomeOf(record["type"], data);
|
|
298
|
+
const tags = ownRecord(data["tags"]);
|
|
299
|
+
const id = text(tags?.[DELIVERY_TAG]);
|
|
300
|
+
const key = text(tags?.[KEY_TAG]);
|
|
301
|
+
if (outcome === void 0 || id === void 0 || key === void 0) return null;
|
|
302
|
+
const category = tags?.[CATEGORY_TAG];
|
|
303
|
+
const at = record["created_at"];
|
|
304
|
+
return deliveryEvent(compact({
|
|
305
|
+
at: isRfc3339(at) ? at : void 0,
|
|
306
|
+
source,
|
|
307
|
+
channel: "email",
|
|
308
|
+
delivery: {
|
|
309
|
+
id,
|
|
310
|
+
key
|
|
311
|
+
},
|
|
312
|
+
category: typeof category === "string" && CATEGORIES.has(category) ? category : void 0,
|
|
313
|
+
provider: compact({
|
|
314
|
+
name: "resend",
|
|
315
|
+
id: text(data["email_id"])
|
|
316
|
+
}),
|
|
317
|
+
...outcome
|
|
318
|
+
}));
|
|
319
|
+
}
|
|
320
|
+
function unsigned() {
|
|
321
|
+
return problemResponse(statusProblem(400, "webhook signature headers are missing"));
|
|
322
|
+
}
|
|
323
|
+
function unverified() {
|
|
324
|
+
return problemResponse(statusProblem(403, "webhook signature did not verify"));
|
|
325
|
+
}
|
|
326
|
+
async function claim(replay, key) {
|
|
327
|
+
const expiresAt = nowSeconds() + CLAIM_SECONDS;
|
|
328
|
+
if (replay.claim !== void 0) return replay.claim(key, expiresAt);
|
|
329
|
+
if (await replay.seen(key)) return false;
|
|
330
|
+
await replay.remember(key, expiresAt);
|
|
331
|
+
return true;
|
|
332
|
+
}
|
|
333
|
+
/**
|
|
334
|
+
* A fetch handler for Resend webhooks. It verifies the Standard Webhooks
|
|
335
|
+
* signature through `resend.webhooks.verify` (the `svix-*` and `webhook-*`
|
|
336
|
+
* header names both work), claims the message id, and writes one delivery
|
|
337
|
+
* event for `email.delivered`, `email.bounced`, `email.complained`,
|
|
338
|
+
* `email.failed` and `email.suppressed`. A bad signature is a `401`; a sink
|
|
339
|
+
* failure releases the claim and answers `503`, so Resend retries.
|
|
340
|
+
*/
|
|
341
|
+
function resendWebhook(options) {
|
|
342
|
+
const source = options.source ?? "permdock";
|
|
343
|
+
return async (request) => {
|
|
344
|
+
if (request.method !== "POST") return methodNotAllowed("POST");
|
|
345
|
+
const id = header(request, "id");
|
|
346
|
+
const timestamp = header(request, "timestamp");
|
|
347
|
+
const signature = header(request, "signature");
|
|
348
|
+
if (id === null || timestamp === null || signature === null) return unsigned();
|
|
349
|
+
const read = await readBodyText(request, MAX_BODY);
|
|
350
|
+
if (!read.ok) return read.cause === "too-large" ? bodyTooLarge(MAX_BODY) : problemResponse(statusProblem(400, "webhook body was unreadable"));
|
|
351
|
+
const body = read.text;
|
|
352
|
+
let payload;
|
|
353
|
+
try {
|
|
354
|
+
payload = options.resend.webhooks.verify({
|
|
355
|
+
payload: body,
|
|
356
|
+
headers: {
|
|
357
|
+
id,
|
|
358
|
+
timestamp,
|
|
359
|
+
signature
|
|
360
|
+
},
|
|
361
|
+
webhookSecret: options.secret
|
|
362
|
+
});
|
|
363
|
+
} catch {
|
|
364
|
+
return unverified();
|
|
365
|
+
}
|
|
366
|
+
const replayKey = `resend:${id}`;
|
|
367
|
+
if (!await claim(options.replay, replayKey)) return new Response(null, { status: 200 });
|
|
368
|
+
const event = eventOf(payload, source);
|
|
369
|
+
if (event !== null) try {
|
|
370
|
+
await options.sink.write([event]);
|
|
371
|
+
} catch {
|
|
372
|
+
await options.replay.release?.(replayKey);
|
|
373
|
+
return problemResponse(statusProblem(503, "the event sink is unavailable"));
|
|
374
|
+
}
|
|
375
|
+
return new Response(null, { status: 200 });
|
|
376
|
+
};
|
|
377
|
+
}
|
|
378
|
+
//#endregion
|
|
379
|
+
export { approvalEmail, resendFailure, resendTransport, resendWebhook };
|
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import { a as RETIRE_MARKER } from "./markers-
|
|
1
|
+
import { r as escapeSqlIdent } from "./sql-B5T1IL83.js";
|
|
2
|
+
import { a as RETIRE_MARKER } from "./markers-C6joDI3o.js";
|
|
3
3
|
import { r as tableKey } from "./deciding-columns-Sq12mEA6.js";
|
|
4
4
|
//#region src/cli/rls/retire.ts
|
|
5
5
|
const IDENT = String.raw`(?:"[^"]+"|[A-Za-z_][\w$]*)`;
|
|
@@ -12,6 +12,8 @@ type RevocationListener = (event: RevocationEvent) => void;
|
|
|
12
12
|
* revalidate a connection, never grant; a lost event falls back to expiry.
|
|
13
13
|
*/
|
|
14
14
|
type RevocationFeed = {
|
|
15
|
+
/** Names the implementation in errors and events. */
|
|
16
|
+
readonly name?: string;
|
|
15
17
|
subscribe(listener: RevocationListener): () => void;
|
|
16
18
|
revoke(event: RevocationEvent): void | Promise<void>;
|
|
17
19
|
};
|