permdock 0.4.0 → 0.5.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +37 -35
- package/dist/{schema-Bol6gqXA.js → 2020-C9VN-x8c.js} +5 -130
- package/dist/a2a/index.d.ts +6 -6
- package/dist/a2a/index.js +14 -17
- package/dist/{adapter-context-mlWsVGGg.js → adapter-context-CRhqyzCk.js} +1 -1
- package/dist/adoption-scan-B4R5fnMU.js +107 -0
- package/dist/agent/index.d.ts +3 -0
- package/dist/agent/index.js +1 -0
- package/dist/ai-sdk/index.d.ts +18 -35
- package/dist/ai-sdk/index.js +37 -23
- package/dist/{app-data-CV8pqqMi.js → app-data-MuyzVqX8.js} +2 -1
- package/dist/approval-header-CJACtHkv.js +23 -0
- package/dist/approval-prompt-Dg5LeAcT.js +62 -0
- package/dist/approval-prompt-Djo_PyZc.d.ts +57 -0
- package/dist/approvals/index.d.ts +5 -3
- package/dist/approvals/index.js +8 -5
- package/dist/approvals-DJ6Yd5z1.js +995 -0
- package/dist/arazzo-B6lebmiQ.js +36 -0
- package/dist/{arazzo-C4BcskbX.js → arazzo-BWhNF-k0.js} +20 -14
- package/dist/args-IIolxxKA.js +197 -0
- package/dist/astro/index.d.ts +43 -0
- package/dist/astro/index.js +27 -0
- package/dist/audience-Dg8XsRaO.js +55 -0
- package/dist/auth-DRLEizbL.js +178 -0
- package/dist/authzen/index.d.ts +26 -6
- package/dist/authzen/index.js +94 -79
- package/dist/automation-BMZPIVUM.d.ts +114 -0
- package/dist/automation-DVjOckjV.js +157 -0
- package/dist/better-auth/index.d.ts +8 -6
- package/dist/better-auth/index.js +9 -8
- package/dist/better-supabase/index.d.ts +357 -30
- package/dist/better-supabase/index.js +936 -194
- package/dist/{bind-BzqG8SMb.d.ts → bind--9EFVYWF.d.ts} +12 -10
- package/dist/{bind-kk-uyCwH.js → bind-CZzhx-Vj.js} +14 -10
- package/dist/body-CH5of8Ne.js +10 -0
- package/dist/body-text-QcXok_SI.js +52 -0
- package/dist/{build-instance-DIIV9DbC.js → build-instance-BMnAudHn.js} +4 -3
- package/dist/{canonical-json-CFKyFOke.js → canonical-json-BC8_nMTw.js} +5 -3
- package/dist/{capability-CksyCWDH.d.ts → capability-BSslw1QV.d.ts} +44 -25
- package/dist/{capability-txATtKV4.js → capability-N1K9IpqS.js} +68 -42
- package/dist/casbin-Cr7RLtA3.js +30 -0
- package/dist/casbin-Dyu2gnUD.js +234 -0
- package/dist/casl-64gpT-8x.js +24 -0
- package/dist/casl-DjEDhTCP.js +299 -0
- package/dist/catalog/index.d.ts +74 -2
- package/dist/catalog/index.js +51 -2
- package/dist/{catalog-tZUyOfOv.js → catalog-BECMPrwc.js} +51 -6
- package/dist/catalog-DjhMYYCq.js +1 -0
- package/dist/catalog-R_A__RsH.js +52 -0
- package/dist/{catalog-doc-DWtg0gGR.js → catalog-doc-C9wjsfNY.js} +45 -23
- package/dist/catalog-fingerprint-CCP0-yQS.js +153 -0
- package/dist/chat/index.d.ts +2 -0
- package/dist/chat/index.js +224 -0
- package/dist/chat-sdk/index.d.ts +87 -0
- package/dist/chat-sdk/index.js +197 -0
- package/dist/claims-map-7oQ3ue4X.js +13 -0
- package/dist/claims-map-Ca-QX8C6.d.ts +32 -0
- package/dist/claude-agent/index.d.ts +7 -14
- package/dist/claude-agent/index.js +24 -27
- package/dist/clerk/index.d.ts +9 -8
- package/dist/clerk/index.js +9 -14
- package/dist/cli/bin.js +36 -17
- package/dist/cli/index.d.ts +19 -5
- package/dist/cli/index.js +164 -4
- package/dist/cloud/index.d.ts +102 -63
- package/dist/cloud/index.js +239 -340
- package/dist/cloud-CIoHNevm.js +87 -0
- package/dist/codemod-Bmj9dWMH.js +37 -0
- package/dist/codemod-Cxvvc70T.js +2084 -0
- package/dist/{collect-2SrB7lfk.js → collect-CrZJJnEF.js} +75 -11
- package/dist/collect-DloHbDVa.js +55 -0
- package/dist/collect-FlXJlhus.js +1 -0
- package/dist/command-L8EstFNm.js +6 -0
- package/dist/compile/index.d.ts +1 -1
- package/dist/compile/index.js +1 -2
- package/dist/{compile-CcEu2ZQ1.js → compile-CMqMx_IN.js} +11 -8
- package/dist/{compile-CtTP7eur.d.ts → compile-Ckm2HqBZ.d.ts} +5 -3
- package/dist/completion-BqhRBJD8.js +143 -0
- package/dist/config-B46rm9sc.js +26 -0
- package/dist/{config-BIjREpyE.js → config-bs_kZeYq.js} +12 -7
- package/dist/{config-report--Xb9APJS.js → config-report-DUgj62Ai.js} +15 -5
- package/dist/{connection-DUsczpB5.js → connection-DjhIJSs2.js} +6 -5
- package/dist/{context-DieZVJXu.js → context-bbFHR-0D.js} +2 -2
- package/dist/convex/index.d.ts +11 -10
- package/dist/convex/index.js +6 -4
- package/dist/create-0VZ7Pdiu.d.ts +107 -0
- package/dist/create-BDS7wc3y.d.ts +138 -0
- package/dist/create-BFfm17UA.d.ts +110 -0
- package/dist/create-BWRSXgOF.js +403 -0
- package/dist/create-C3b4B5eF.js +130 -0
- package/dist/{create-BBO24vj6.js → create-DnrmLnLW.js} +31 -32
- package/dist/{credential-kue0qpbm.js → credential-DM2um3ha.js} +152 -31
- package/dist/credentials-DPyHmYz5.js +74 -0
- package/dist/delegation-DaXVdDhM.js +286 -0
- package/dist/delivery/index.d.ts +5 -0
- package/dist/delivery/index.js +5 -0
- package/dist/delivery-DCAgNyCn.js +499 -0
- package/dist/delivery-event-xX4obB8F.js +40 -0
- package/dist/{denied-text-DfRk15uw.d.ts → denied-text-D8jDHgsl.d.ts} +5 -5
- package/dist/{describe-C3ldA9os.d.ts → describe-BZUsixiL.d.ts} +2 -2
- package/dist/{describe-Cgkp7eP0.js → describe-BybMRY7A.js} +6 -2
- package/dist/device-BARQ8eYG.js +193 -0
- package/dist/diff-CxZo9pTq.js +37 -0
- package/dist/{diff-rpqoe7Ag.js → diff-DCePiN6M.js} +60 -54
- package/dist/doctor-CxiwSfqH.js +44 -0
- package/dist/{doctor-owlv6ddh.js → doctor-DFjUxf2f.js} +245 -50
- package/dist/drizzle/index.d.ts +5 -3
- package/dist/drizzle/index.js +2 -2
- package/dist/elysia/index.d.ts +16 -13
- package/dist/elysia/index.js +13 -12
- package/dist/env-DJZrPjRi.js +8 -0
- package/dist/errors-BDUwg2qC.js +27 -0
- package/dist/{errors-drnfxYtm.js → errors-BKy0EfhN.js} +5 -9
- package/dist/errors-BWXBMaKK.d.ts +11 -0
- package/dist/{errors-OD_4c__H.d.ts → errors-C2PXIv4c.d.ts} +2 -2
- package/dist/errors-CWTY6uih.js +143 -0
- package/dist/evaluate-_R8QkWaf.js +1732 -0
- package/dist/evaluations-16UqqQ6W.d.ts +32 -0
- package/dist/{evaluations-C9YJsv3H.js → evaluations-DZ2CbV5k.js} +145 -34
- package/dist/eve/index.d.ts +12 -16
- package/dist/eve/index.js +22 -28
- package/dist/event-time-CsegxXxB.js +23 -0
- package/dist/expiry-D4_YKRKD.js +52 -0
- package/dist/express/index.d.ts +13 -10
- package/dist/express/index.js +12 -11
- package/dist/fastify/index.d.ts +25 -22
- package/dist/fastify/index.js +13 -12
- package/dist/fetch-adapter-g0ypLkID.js +120 -0
- package/dist/fetch-adapter-qKJBuRqy.d.ts +31 -0
- package/dist/fields-D9tPVUUS.js +203 -0
- package/dist/files-C5ZI27eV.js +124 -0
- package/dist/{fixtures-h2eG2OZV.js → fixtures-B7XrLeY7.js} +8 -7
- package/dist/flags-C3DktBDY.js +86 -0
- package/dist/{from-snapshot-7REQZe0H.js → from-snapshot-D2lZt4Dd.js} +55 -52
- package/dist/{grantee-CXY-0C87.js → grantee-Cn1HyUsI.js} +3 -3
- package/dist/{grantee-conditions-MQs5NIuX.js → grantee-conditions-CcXf8hMM.js} +4 -3
- package/dist/{grantee-match-fxYp9Nmt.js → grantee-match-DHArqY82.js} +5 -4
- package/dist/h3/index.d.ts +37 -0
- package/dist/h3/index.js +35 -0
- package/dist/headers-BIjfMaoC.js +8 -0
- package/dist/headers-CIbDTUTK.d.ts +7 -0
- package/dist/{helpers-C9YmyBIa.js → helpers-DTcZOzhF.js} +45 -38
- package/dist/hono/index.d.ts +12 -9
- package/dist/hono/index.js +13 -12
- package/dist/hosted-BZIAYvon.js +315 -0
- package/dist/hosted-DBDX0M-P.d.ts +78 -0
- package/dist/{http-DPuDaChb.d.ts → http-B_LphE5Y.d.ts} +1 -2
- package/dist/http-DXJ37RDA.js +46 -0
- package/dist/{http-BEbdMZ05.js → http-ujKm0JXE.js} +1 -2
- package/dist/{import-UHk1N7vH.js → import-CNV7I2Dw.js} +25 -20
- package/dist/{import-BFIlhetD.js → import-DMmOG27O.js} +190 -53
- package/dist/index-BcHcPyIo.d.ts +110 -0
- package/dist/index-CaxrMD1A.d.ts +1 -0
- package/dist/index-Chrs5fQ-.d.ts +210 -0
- package/dist/index-CxGUswIC.d.ts +431 -0
- package/dist/index-D8EovfsP.d.ts +91 -0
- package/dist/{index-UdVQgq48.d.ts → index-DOVf7RJv.d.ts} +431 -81
- package/dist/{index-BwMe94Xq.d.ts → index-SGdIQyzc.d.ts} +34 -16
- package/dist/index.d.ts +19 -15
- package/dist/index.js +31 -21
- package/dist/init-DeMYsnYJ.js +96 -0
- package/dist/init-GG6Jh8HD.js +95 -0
- package/dist/{instance-options-plkrsAog.d.ts → instance-options-Omfd793B.d.ts} +2 -2
- package/dist/instance-snapshot-Cxq4ygFc.js +600 -0
- package/dist/instant-BluqDvyS.js +19 -0
- package/dist/internals-Dk8A8fX3.js +17 -0
- package/dist/{json-schema-DBkdUuCO.js → json-schema-B-vAwlde.js} +45 -6
- package/dist/json-schema-CN_iLFH2.d.ts +40 -0
- package/dist/jwt/index.d.ts +18 -11
- package/dist/jwt/index.js +156 -135
- package/dist/{kernel-CB3LrIJM.js → kernel-5JatXyND.js} +52 -24
- package/dist/kysely/index.d.ts +5 -3
- package/dist/kysely/index.js +2 -2
- package/dist/load-BxEtwlBS.js +1 -0
- package/dist/{load-C3_oTHyO.js → load-DFS_ry0W.js} +22 -6
- package/dist/{load-jose-BL6LH4bL.js → load-jose-DZ4dnjri.js} +1 -4
- package/dist/login-Dfe5RlYk.js +68 -0
- package/dist/login-imhuwvn3.js +254 -0
- package/dist/manifest-C8IzW3Do.js +42 -0
- package/dist/manifest-CtKR3GXL.js +370 -0
- package/dist/manifest-json-CAGzls-C.js +9 -0
- package/dist/{manifest-uDS9y5de.d.ts → manifest-mx5ghSFM.d.ts} +9 -2
- package/dist/manifest-schema-C0kK_8V0.js +399 -0
- package/dist/{map-claims-AVlBaJoa.js → map-claims-D3oRmTk0.js} +13 -10
- package/dist/{map-error-BE27PYkE.js → map-error-TCAdw-eW.js} +3 -3
- package/dist/{markers-CiwAOZtO.js → markers-C6joDI3o.js} +2 -1
- package/dist/mcp/index.d.ts +22 -12
- package/dist/mcp/index.js +57 -39
- package/dist/{migrate-BwlB5-Wk.js → migrate-BShP7Vf4.js} +53 -14
- package/dist/nest/index.d.ts +12 -9
- package/dist/nest/index.js +15 -14
- package/dist/next/index.d.ts +18 -21
- package/dist/next/index.js +13 -11
- package/dist/next/plugin.d.ts +1 -1
- package/dist/next/plugin.js +2 -2
- package/dist/node/index.d.ts +10 -10
- package/dist/node/index.js +7 -9
- package/dist/{ocsf-uYFXGVw2.js → ocsf-BFp-PZZA.js} +22 -11
- package/dist/openai/index.d.ts +9 -16
- package/dist/openai/index.js +17 -24
- package/dist/openapi/index.d.ts +3 -3
- package/dist/openapi/index.js +1 -1
- package/dist/{openapi-DBzHQbov.js → openapi-B7HZ0f-r.js} +8 -8
- package/dist/{openapi-BJdBmYDG.js → openapi-DTaEmTSW.js} +10 -9
- package/dist/openapi-ahr8rHu3.js +138 -0
- package/dist/operation-findings-DgATDpvh.js +36 -0
- package/dist/operations-CxybZErY.d.ts +59 -0
- package/dist/orpc/index.d.ts +13 -10
- package/dist/orpc/index.js +20 -15
- package/dist/otel/index.d.ts +3 -2
- package/dist/otel/index.js +30 -7
- package/dist/output-Dyw8fyPF.js +88 -0
- package/dist/output-files-B3IZJksC.js +1 -0
- package/dist/{output-files-CgIsvdSa.js → output-files-DhRBBE4n.js} +24 -26
- package/dist/{permission-keys-B26jeyUv.js → ownership-BatFgAA4.js} +1698 -869
- package/dist/{package-root-DtNnpmUd.js → package-root-Dk_ETdkp.js} +1 -1
- package/dist/{parse-CVFQHk6c.js → parse-Cxq0WxrA.js} +2 -2
- package/dist/{parse-local-manifest-C-q02Pal.js → parse-local-manifest-CVSs6J9I.js} +1 -1
- package/dist/{parse-local-manifest-DvYUR0QL.d.ts → parse-local-manifest-DgqtruPn.d.ts} +1 -1
- package/dist/parse-request-D_tUXG6M.js +26 -0
- package/dist/paths-DXSHAMIa.js +42 -0
- package/dist/pdp/index.d.ts +7 -3
- package/dist/pdp/index.js +45 -26
- package/dist/{peer-BOr_kJE1.js → peer-C8swJ2GH.js} +23 -4
- package/dist/peer-CRvC7Hg1.js +1 -0
- package/dist/permdock-B9JxkBwC.js +868 -0
- package/dist/permdock-D7eeLJER.d.ts +502 -0
- package/dist/{permission-registry-BsblpB-z.js → permission-registry-Br4jSNVi.js} +3 -3
- package/dist/permissions-B-wCP5ZC.js +30 -0
- package/dist/{permissions-CCJ6lmxB.js → permissions-CZKiUfFM.js} +4 -3
- package/dist/{permissions-COH-KRgT.d.ts → permissions-oEWfl-kl.d.ts} +1 -2
- package/dist/policies-CO1oOymN.js +295 -0
- package/dist/{policy-ur0BBK_e.d.ts → policy-Czo4n3Hs.d.ts} +2 -2
- package/dist/{hosted-CBHgkzDl.js → policy-DLZJ5gAp.js} +17 -273
- package/dist/policy-from-catalog-DzhEc3Y9.js +450 -0
- package/dist/policy-module-CTlwMvLI.js +89 -0
- package/dist/{policy-types-sp9P1iIV.d.ts → policy-types-DzwivBgR.d.ts} +434 -631
- package/dist/postgrest-CW0IqC-U.js +566 -0
- package/dist/postgrest-NUqZT-RB.d.ts +100 -0
- package/dist/powersync-BHfuehf3.js +62 -0
- package/dist/powersync-CbzkqL_M.js +1 -0
- package/dist/{powersync-cZe4kzhL.js → powersync-bYUDLOAO.js} +23 -24
- package/dist/preset/index.d.ts +146 -0
- package/dist/preset/index.js +1 -0
- package/dist/preset-DZdU0tne.js +1768 -0
- package/dist/principal-source-pHneukrx.js +103 -0
- package/dist/prisma/index.d.ts +6 -3
- package/dist/prisma/index.js +2 -2
- package/dist/{problem-CnWraVhC.js → problem-CTviyH5L.js} +13 -23
- package/dist/{problem-details-rIIo8B2C.d.ts → problem-details-DXlt-vks.d.ts} +1 -1
- package/dist/{problem-details-DECUnXAn.js → problem-details-cn5X30gZ.js} +43 -40
- package/dist/problem-types-CJ2325SZ.js +5 -0
- package/dist/{prompt-CXYhLfsS.js → prompt-DfZLJLIn.js} +2 -2
- package/dist/{protected-B3_P7xuw.d.ts → protected-DEPHc2xV.d.ts} +16 -8
- package/dist/{protected-BN7BUdY1.js → protected-DfjY5mLA.js} +21 -4
- package/dist/{provider-Bi-0HNL3.js → provider-CC-u3bYP.js} +2 -2
- package/dist/{provider-kwHC9CZD.d.ts → provider-DMVt6yYn.d.ts} +1 -1
- package/dist/{provider-store-Ctt-81Ni.js → provider-store-B5Yrkhzr.js} +2 -2
- package/dist/pull-BgIfno6w.js +256 -0
- package/dist/pull-ByOks_Tg.js +1 -0
- package/dist/push-CmFVBOeI.js +116 -0
- package/dist/pushed-policy-BImMTTIM.d.ts +57 -0
- package/dist/pushed-policy-DobP7AHI.js +238 -0
- package/dist/react/index.d.ts +8 -8
- package/dist/react/index.js +6 -6
- package/dist/react/provider-client.d.ts +1 -1
- package/dist/react/provider-client.js +1 -2
- package/dist/react-native/index.d.ts +24 -72
- package/dist/react-native/index.js +24 -22
- package/dist/{refs-f3imMjNW.js → refs-K6eWUJ0H.js} +1 -1
- package/dist/{relation-walk-BXnlLtg2.js → relation-walk-3OyDBF0S.js} +2 -2
- package/dist/{relations-CvmSpG67.js → relations-BnCWnJGI.js} +3 -3
- package/dist/renames-CGj7YwcQ.js +175 -0
- package/dist/{replay-COpmZUfx.d.ts → replay-D7iKcLFe.d.ts} +1 -1
- package/dist/{replay-BsOyTrdV.js → replay-Du1tJjG7.js} +2 -1
- package/dist/{request-context-BVM7aWNs.js → request-context-BTRTG7OT.js} +3 -3
- package/dist/request-schema-CMreVuFM.js +148 -0
- package/dist/resend/index.d.ts +126 -0
- package/dist/resend/index.js +379 -0
- package/dist/{resource-relations-D1Un3pcz.js → resource-relations-D_jw0BFx.js} +1 -1
- package/dist/{retire-BFcxL6un.js → retire-CALjIQ7e.js} +2 -2
- package/dist/{revocations-Cy06JNx2.d.ts → revocations-R07lFBnX.d.ts} +2 -0
- package/dist/rls-BA8an5Ap.js +336 -0
- package/dist/{rls-BEktUaqg.js → rls-j6t43t7n.js} +287 -689
- package/dist/{role-builder-B4GbKM-i.js → role-builder-CXbis5-X.js} +14 -207
- package/dist/{rpc-nYC3cR_u.js → rpc-aPyNi6tA.js} +7 -7
- package/dist/run-CNsApDpd.js +1 -0
- package/dist/run-DOfMtc9V.js +723 -0
- package/dist/run-ticket-BjhTOi6u.d.ts +124 -0
- package/dist/run-ticket-sxFI6LAk.js +337 -0
- package/dist/{runtime-D_tMXnsq.js → runtime-D3VTAiCA.js} +1 -1
- package/dist/{saas-DtaA4JuW.js → saas-FO-Q8oj0.js} +16 -14
- package/dist/scan-BOI5tJ-6.js +29 -0
- package/dist/{schema-DjQBcAP9.js → schema-B4v0Qrac.js} +102 -8
- package/dist/schema-yLuBWWsh.js +130 -0
- package/dist/scim/index.d.ts +2 -2
- package/dist/scim/index.js +1 -2
- package/dist/{scim-vFR1O5oG.js → scim-ClHtpyV3.js} +208 -76
- package/dist/{scopes-tvpa34ep.js → scopes-CUPSjo9q.js} +12 -7
- package/dist/server/index.d.ts +12 -143
- package/dist/server/index.js +12 -9
- package/dist/server-DqCT4CgZ.js +453 -0
- package/dist/{server-types-DdqBwZN_.d.ts → server-types-BLd4MnBX.d.ts} +51 -68
- package/dist/{sha256-BO0swRXL.js → sha256-D9ihqmvd.js} +8 -1
- package/dist/{shared-1uhI-e-b.js → shared-CD11nBbC.js} +18 -8
- package/dist/{shared-JhMeOsDF.js → shared-DvvFzYXe.js} +8 -9
- package/dist/signals-D3NcTKUS.js +32 -0
- package/dist/sink-BEZSlMS_.js +957 -0
- package/dist/sink-Bj_lDUDq.d.ts +225 -0
- package/dist/{skills-BZdRQkxs.js → skills-B6lVdD_W.js} +13 -6
- package/dist/skills-CTYwkl44.js +51 -0
- package/dist/snapshot-CXUWfsNy.js +269 -0
- package/dist/{snapshot-cache-Cod40D-X.js → snapshot-cache-DZHQ0KF6.js} +11 -5
- package/dist/{snapshot-cache-J5T7t_vD.d.ts → snapshot-cache-DqK9eDmM.d.ts} +7 -5
- package/dist/solid/index.d.ts +11 -12
- package/dist/solid/index.js +7 -7
- package/dist/solid-start/index.d.ts +52 -0
- package/dist/solid-start/index.js +49 -0
- package/dist/{sources-Dljy06zL.d.ts → sources-BV9j0DeZ.d.ts} +7 -13
- package/dist/{sources-B1-b-R0t.js → sources-vs5dGOsS.js} +125 -119
- package/dist/{sql-t8teWOfo.js → sql-B5T1IL83.js} +13 -1
- package/dist/src-DLfUWFAI.js +1851 -0
- package/dist/ssf/index.d.ts +4 -4
- package/dist/ssf/index.js +384 -47
- package/dist/standard-webhooks-6lg8v_is.d.ts +88 -0
- package/dist/standard-webhooks-DgFFD-Ga.js +228 -0
- package/dist/storage-C2bWdvJH.js +132 -0
- package/dist/{store-ILkLUj_o.js → store-4u_hxjWa.js} +40 -53
- package/dist/{store-options-CbUHDoSe.js → store-options-BqEakYRa.js} +26 -21
- package/dist/{stores-BHXdSbw9.js → stores-BbsD4fAR.js} +2 -2
- package/dist/{stores-Cxz_80g-.d.ts → stores-ClZUgeoP.d.ts} +7 -8
- package/dist/{stream-Dwsg6WwE.d.ts → stream-7-xmnf3U.d.ts} +2 -2
- package/dist/{stream-BMui98KK.js → stream-CvdUS9V1.js} +9 -2
- package/dist/style-DiKWnAvn.js +1 -0
- package/dist/{style-CTm1AXDT.js → style-Uao76wO7.js} +3 -2
- package/dist/subject-BGoM5o8B.js +17 -0
- package/dist/supabase/index.d.ts +23 -106
- package/dist/supabase/index.js +5 -4
- package/dist/supabase/middleware.d.ts +7 -6
- package/dist/supabase/middleware.js +13 -11
- package/dist/supabase-9pqI57pW.js +92 -0
- package/dist/{supabase-C1TWlnYt.js → supabase-Dxlp8A94.js} +98 -205
- package/dist/supabase-hook-CXcGpHqq.js +1 -0
- package/dist/{supabase-hook-Cva3ikXz.js → supabase-hook-DdDQhMlw.js} +951 -60
- package/dist/support-session-C6xJQYut.js +158 -0
- package/dist/svelte/Protected.svelte +4 -4
- package/dist/svelte/index.d.ts +7 -7
- package/dist/svelte/index.js +10 -10
- package/dist/svelte/runtime.d.ts +3 -3
- package/dist/svelte/runtime.js +3 -3
- package/dist/svelte/source.d.ts +7 -7
- package/dist/svelte/source.js +4 -4
- package/dist/sveltekit/index.d.ts +51 -0
- package/dist/sveltekit/index.js +27 -0
- package/dist/tanstack-start/index.d.ts +51 -0
- package/dist/tanstack-start/index.js +40 -0
- package/dist/target-Bw37TFNA.js +51 -0
- package/dist/{tenancy-DshjqY0n.js → tenancy-DN2QAx9z.js} +5 -5
- package/dist/terminal/index.d.ts +11 -9
- package/dist/terminal/index.js +23 -287
- package/dist/testing/index.d.ts +311 -38
- package/dist/testing/index.js +3475 -201
- package/dist/testing/saas/index.d.ts +9 -8
- package/dist/testing/saas/index.js +2 -2
- package/dist/testing/saas/permissions.d.ts +1 -1
- package/dist/testing/saas/permissions.js +1 -2
- package/dist/text-BMFRfBqc.js +8 -0
- package/dist/{text-diff-BdkkYSbi.js → text-diff-BQcUapOb.js} +1 -1
- package/dist/thenable-yD7SabqG.js +31 -0
- package/dist/time-DkWjdL98.js +71 -0
- package/dist/{token-Bx9qy30p.js → token-BLZcjQgt.js} +15 -6
- package/dist/{tool-refusal-CQ7OEia9.js → tool-refusal-CMLN5xhn.js} +2 -2
- package/dist/trpc/index.d.ts +12 -9
- package/dist/trpc/index.js +16 -14
- package/dist/{types-7rJVLWe5.d.ts → types-5Ut_pbKy.d.ts} +61 -11
- package/dist/{store-9KO4BlkB.d.ts → types-BNORmDM8.d.ts} +100 -75
- package/dist/types-BjV-fqcA.d.ts +57 -0
- package/dist/{types-CUcFZfpU.d.ts → types-BqAKcRNW.d.ts} +2 -1
- package/dist/types-C8-KNsFf.d.ts +107 -0
- package/dist/{types-Br9IXUBG.d.ts → types-CCpc2Dcv.d.ts} +77 -17
- package/dist/{types-DpWfQdSh.d.ts → types-CZTnPFzM.d.ts} +46 -11
- package/dist/{types-CqrjB9o6.d.ts → types-CdlxsYQh.d.ts} +23 -11
- package/dist/{types-CIlTojhq.d.ts → types-ClZaWzfb.d.ts} +9 -6
- package/dist/types-DX0LaKTb.d.ts +157 -0
- package/dist/types-DiQjupG2.d.ts +332 -0
- package/dist/types-DqzsnlSA.js +67 -0
- package/dist/types-_sHy8BQf.d.ts +65 -0
- package/dist/{types-ByUo56un.d.ts → types-fbZ7JEXr.d.ts} +23 -22
- package/dist/{types-DHrmBJLH.d.ts → types-tIgIeIKJ.d.ts} +7 -7
- package/dist/unplugin/index.d.ts +1 -1
- package/dist/unplugin/index.js +2 -2
- package/dist/usage-CHOtwL19.js +1 -0
- package/dist/usage-DHtE8j4E.js +32 -0
- package/dist/{usage-CG9nOYZw.js → usage-T5mXq98v.js} +54 -11
- package/dist/{validation-error-BSSw0l_8.d.ts → validation-error-Bg5Tpluk.d.ts} +1 -1
- package/dist/{validity-dVrUEPJt.js → validity-CZ7-y0Cj.js} +32 -15
- package/dist/{verifier-DMr_Zmb_.js → verifier-DHuh-okk.js} +18 -7
- package/dist/{verify-BztUB3GX.js → verify-DbCL9bnB.js} +645 -50
- package/dist/{version-BEogC-rB.js → version-CEbQ5UeM.js} +4 -3
- package/dist/version-DXkYUISx.js +1 -0
- package/dist/{views-CJsrBS1f.js → views-DTIIO-oQ.js} +22 -5
- package/dist/{permission-types-Dg39z9Kv.d.ts → vocabulary-D6lPdb4Z.d.ts} +65 -2
- package/dist/vue/index.d.ts +9 -10
- package/dist/vue/index.js +8 -8
- package/dist/waiter-BGUtGYoU.js +67 -0
- package/dist/waiter-CKy4MQSY.d.ts +36 -0
- package/dist/watch-Cb-NcaUw.js +1 -0
- package/dist/{watch-zeucB7eF.js → watch-CszoTJMq.js} +44 -5
- package/dist/webmcp/index.d.ts +2 -2
- package/dist/webmcp/index.js +3 -3
- package/dist/where-scope-Dv-WTP-w.js +306 -0
- package/dist/who-can-D0QoYbEb.js +364 -0
- package/dist/wire-delegation-Cv3W2eaM.js +36 -0
- package/dist/wire-denial-C7PaVYEM.js +27 -0
- package/dist/workflow/index.d.ts +5 -0
- package/dist/workflow/index.js +223 -0
- package/dist/workflow-sdk/index.d.ts +56 -0
- package/dist/workflow-sdk/index.js +78 -0
- package/dist/{wrap-Cr93qqdP.d.ts → wrap-Bd1Tejur.d.ts} +2 -1
- package/dist/{wrap-DWsU_5Bd.js → wrap-gX61EtpB.js} +7 -6
- package/package.json +136 -37
- package/schemas/access-event-v1.json +118 -0
- package/schemas/approval-request-v1.json +34 -1
- package/schemas/approval-signature-v1.json +94 -0
- package/schemas/automation-event-v1.json +113 -0
- package/schemas/capability-v1.json +84 -0
- package/schemas/catalog-event-v1.json +87 -0
- package/schemas/catalog-v1.json +123 -12
- package/schemas/cli-commands-v1.json +164 -0
- package/schemas/cli-result-v1.json +96 -0
- package/schemas/cloud-api-v1.json +5407 -0
- package/schemas/connector-v1.json +408 -0
- package/schemas/credential-event-v1.json +81 -0
- package/schemas/credential-v1.json +134 -0
- package/schemas/decision-event-v1.json +288 -0
- package/schemas/delivery-event-v1.json +117 -0
- package/schemas/directory-event-v1.json +85 -0
- package/schemas/evidence-export-v1.json +54 -0
- package/schemas/membership-event-v1.json +93 -0
- package/schemas/policy-v1.json +68 -0
- package/schemas/pushed-policy-v1.json +236 -0
- package/schemas/run-v1.json +162 -0
- package/schemas/snapshot-v1.json +138 -0
- package/schemas/supabase-claims-v1.json +4 -4
- package/schemas/supabase-manifest-v1.json +5 -1
- package/schemas/support-session-v1.json +111 -0
- package/skills/permdock/SKILL.md +16 -12
- package/skills/permdock-agents/SKILL.md +40 -23
- package/skills/permdock-agents/references/operations-automations-chat.md +221 -0
- package/skills/permdock-agents/references/runtimes.md +22 -18
- package/skills/permdock-approvals/SKILL.md +29 -13
- package/skills/permdock-approvals/references/delivery-and-waiters.md +172 -0
- package/skills/permdock-approvals/references/stores-and-resume.md +21 -7
- package/skills/permdock-audit/SKILL.md +3 -3
- package/skills/permdock-credentials/SKILL.md +5 -5
- package/skills/permdock-credentials/references/tokens-keys-links.md +14 -10
- package/skills/permdock-data/SKILL.md +6 -6
- package/skills/permdock-data/references/queries-and-rls.md +9 -8
- package/skills/permdock-data/references/relationships.md +3 -3
- package/skills/permdock-tenancy/SKILL.md +20 -7
- package/skills/permdock-tenancy/references/contacts-and-support-sessions.md +122 -0
- package/skills/permdock-tenancy/references/ownership-and-custom-roles.md +5 -4
- package/skills/permdock-wire/SKILL.md +17 -11
- package/skills/permdock-wire/references/adapters.md +139 -51
- package/skills/permdock-wire/references/policy-options.md +5 -5
- package/skills/permdock-wire/references/presets-and-recipes.md +58 -0
- package/dist/approvals-DZL76lKW.js +0 -240
- package/dist/arazzo-CD8d0WLb.js +0 -54
- package/dist/catalog-6yWAX6Ps.js +0 -2
- package/dist/catalog-WHG4kBq7.js +0 -48
- package/dist/cloud-C7bSDgX4.js +0 -50
- package/dist/cloud-PeBN3IEn.js +0 -118
- package/dist/collect-Bw2Jdq1q.js +0 -2
- package/dist/collect-CQx4hX4N.js +0 -83
- package/dist/commands-Cpip4ULx.js +0 -97
- package/dist/config-DLt6BvV7.js +0 -36
- package/dist/diff-Cnghh_Ip.js +0 -48
- package/dist/doctor-CuVJvhV_.js +0 -53
- package/dist/duration-xK2jGFVc.js +0 -25
- package/dist/errors-CWfoNg9N.js +0 -47
- package/dist/errors-DRnGZHzF.js +0 -30
- package/dist/expiry-BoBJ8Tvc.js +0 -7
- package/dist/fields-fwfXN01n.js +0 -1016
- package/dist/headers-BZSDieNT.js +0 -6
- package/dist/headers-Cf-zWvsO.d.ts +0 -6
- package/dist/ids-DC4V4CFu.js +0 -18
- package/dist/index-DgM7w96K.d.ts +0 -6
- package/dist/index-Dz7didpC.d.ts +0 -201
- package/dist/load-B_shHrmd.js +0 -2
- package/dist/manifest-BngWKryL.js +0 -770
- package/dist/may-use-BOn_dR_w.js +0 -78
- package/dist/openapi-DcQ1Kg40.js +0 -164
- package/dist/ownership-BgnbOJFT.js +0 -851
- package/dist/permdock-L26udHSk.js +0 -3646
- package/dist/powersync-BFSbSElQ.js +0 -62
- package/dist/powersync-DCDgZgfZ.js +0 -2
- package/dist/rls-55DQTuf5.js +0 -250
- package/dist/run-DMcNW_8T.js +0 -174
- package/dist/server-ZYEHtNHS.js +0 -268
- package/dist/sink-BTtmfPnE.js +0 -141
- package/dist/sink-CPN4zLfs.d.ts +0 -104
- package/dist/skills-Dle4ZoLF.js +0 -56
- package/dist/snapshot-Dc9CHPME.js +0 -1078
- package/dist/src-Bb7no-hS.js +0 -639
- package/dist/subject-C6dLxqHU.js +0 -24
- package/dist/supabase-Dbqr141s.js +0 -83
- package/dist/supabase-hook-BULg7Ut_.js +0 -2
- package/dist/thenable-QSmvt-vZ.js +0 -65
- package/dist/types-C0dee0Qf.d.ts +0 -197
- package/dist/types-DvupZE0w.d.ts +0 -9
- package/dist/usage-4G6t643F.js +0 -42
- package/dist/usage-iFLJ0-rr.js +0 -2
- package/dist/vocabulary-hhEFLFoL.d.ts +0 -65
- package/dist/watch-C8TpsAl4.js +0 -2
package/dist/server/index.d.ts
CHANGED
|
@@ -1,144 +1,13 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import {
|
|
3
|
-
import { n as PermDockValidationError, t as PROBLEM_BASE } from "../validation-error-BSSw0l_8.js";
|
|
4
|
-
import { t as Disclosure } from "../problem-details-rIIo8B2C.js";
|
|
5
|
-
import { a as ProblemDetails, i as PermDockRevokedError, n as PermDockApprovalRequiredError, r as PermDockDeniedError, t as ApprovalHint } from "../errors-OD_4c__H.js";
|
|
1
|
+
import { n as PermDockValidationError, t as PROBLEM_BASE } from "../validation-error-Bg5Tpluk.js";
|
|
2
|
+
import { i as PermDockRevokedError, n as PermDockApprovalRequiredError, r as PermDockDeniedError, t as ApprovalHint } from "../errors-C2PXIv4c.js";
|
|
6
3
|
import { t as RequestContext } from "../request-context-C2_1lchh.js";
|
|
7
|
-
import { i as memoryRevocationFeed, n as RevocationFeed, t as RevocationEvent } from "../revocations-
|
|
8
|
-
import {
|
|
9
|
-
import {
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
export declare function createServerKernel<TUser, TPrincipal extends Principal = Principal, V extends PolicyVocabulary = PolicyVocabulary>(policy: Policy<TUser, TPrincipal, V>, options: ServerKernelOptions<TUser, V>): ServerKernel<V>;
|
|
18
|
-
//#endregion
|
|
19
|
-
//#region src/server/credentials.d.ts
|
|
20
|
-
/** `on('auth')` causes for an API key that resolves to the anonymous subject. */
|
|
21
|
-
type ApiKeyFailureCause = "malformed" | "unknown-credential" | "invalid-claims" | "expired" | "credential-policy" | "credential-revoked" | "owner-unavailable";
|
|
22
|
-
/** An opaque key split at its last `_`: `pdk_<id>_<secret><checksum>`. */
|
|
23
|
-
type ApiKeyParts = {
|
|
24
|
-
readonly id: string;
|
|
25
|
-
readonly secret: string;
|
|
26
|
-
};
|
|
27
|
-
/** What an application stores per key: the credential and the key's hash, never the key. */
|
|
28
|
-
type StoredCredential = {
|
|
29
|
-
readonly credential: Credential;
|
|
30
|
-
readonly hash: string;
|
|
31
|
-
};
|
|
32
|
-
/**
|
|
33
|
-
* Splits `pdk_<id>_<secret><checksum>`: `id` is 1 to 128 of `A-Z a-z 0-9 _ -`,
|
|
34
|
-
* the secret 43 base62 characters and the checksum the 6 base62 characters of
|
|
35
|
-
* the CRC-32 of everything before it. Anything else, including a checksum
|
|
36
|
-
* that does not match, is `undefined`.
|
|
37
|
-
*/
|
|
38
|
-
export declare function parseApiKey(key: unknown): ApiKeyParts | undefined;
|
|
39
|
-
/**
|
|
40
|
-
* A fresh `pdk_<id>_<secret><checksum>`: a 43-character base62 secret (about
|
|
41
|
-
* 256 bits) and a 6-character CRC-32 checksum, so a secret scanner can tell a
|
|
42
|
-
* real key from a lookalike without calling the issuer.
|
|
43
|
-
*/
|
|
44
|
-
export declare function generateApiKey(id: string): string;
|
|
45
|
-
/** base64url SHA-256 of the whole key, the value to store and compare. */
|
|
46
|
-
export declare function hashApiKey(key: string): Promise<string>;
|
|
47
|
-
/**
|
|
48
|
-
* A `CredentialVerifier` over the application's own table: `find` looks a
|
|
49
|
-
* key up by the id in it, and the key's hash is compared in constant time.
|
|
50
|
-
* A record that is not a valid v1 credential, or whose id is not the key's,
|
|
51
|
-
* verifies to `null`. A throwing `find` propagates, so the resolver denies
|
|
52
|
-
* with `source-threw`.
|
|
53
|
-
*/
|
|
54
|
-
export declare function apiKeyVerifier(options: {
|
|
55
|
-
readonly find: (id: string) => StoredCredential | null | undefined | Promise<StoredCredential | null | undefined>;
|
|
56
|
-
/** Passed through as the verifier's `touch`, for a `lastUsedAt` column. */
|
|
57
|
-
readonly touch?: CredentialVerifier["touch"];
|
|
58
|
-
}): CredentialVerifier;
|
|
59
|
-
type MemoryCredentials = CredentialVerifier & {
|
|
60
|
-
/** Stores `credential` and returns its key; the key is never stored. */
|
|
61
|
-
issue(credential: Credential): Promise<string>;
|
|
62
|
-
/** A new secret for the same id; the old key stops verifying at once. */
|
|
63
|
-
rotate(id: string): Promise<string | undefined>;
|
|
64
|
-
/** `true` when a credential was removed. */
|
|
65
|
-
revoke(id: string): boolean;
|
|
66
|
-
list(): readonly Credential[];
|
|
67
|
-
/** When `touch` last recorded a use of `id`, in Unix seconds. */
|
|
68
|
-
lastUsedAt(id: string): number | undefined;
|
|
69
|
-
};
|
|
70
|
-
/**
|
|
71
|
-
* In-process credentials for tests and single-replica apps. `issue`, `rotate`
|
|
72
|
-
* and `revoke` write `credential` events to `sink` when one is given.
|
|
73
|
-
*/
|
|
74
|
-
export declare function memoryCredentials(options?: {
|
|
75
|
-
readonly sink?: DecisionSink;
|
|
76
|
-
readonly source?: string;
|
|
77
|
-
}): MemoryCredentials;
|
|
78
|
-
type ApiKeySubjectOptions = {
|
|
79
|
-
readonly verifier: CredentialVerifier;
|
|
80
|
-
/** The definitions, to turn the credential's permission keys into its delegation. */
|
|
81
|
-
readonly permissions: PermissionTree;
|
|
82
|
-
/**
|
|
83
|
-
* The live owner of a user-bound key: roles and memberships as of this
|
|
84
|
-
* request. `null` (a deleted or suspended user) is anonymous. Without it
|
|
85
|
-
* the owner is `{ id, kind: 'user' }` and its rights come from the
|
|
86
|
-
* `memberships` source passed to `createPermDock`.
|
|
87
|
-
*/
|
|
88
|
-
readonly owner?: (id: string) => Principal | null | undefined | Promise<Principal | null | undefined>;
|
|
89
|
-
/** `true` when the application revoked the credential id; a throw denies. */
|
|
90
|
-
readonly revoked?: (id: string) => boolean | Promise<boolean>;
|
|
91
|
-
/**
|
|
92
|
-
* The tenant `credentials` policy, checked on every use so a tightened
|
|
93
|
-
* policy reaches existing keys: a service key's own tenant, a user key's
|
|
94
|
-
* the `tenant` the resolver is called with. A throw denies.
|
|
95
|
-
*/
|
|
96
|
-
readonly settings?: SettingsSource;
|
|
97
|
-
/** Receives a `credential` event with operation `used` for sampled uses. */
|
|
98
|
-
readonly sink?: DecisionSink;
|
|
99
|
-
/** Fraction of uses reported to `sink`, in `(0, 1]`; defaults to 1. */
|
|
100
|
-
readonly sample?: number;
|
|
101
|
-
/** The `source` of `used` events; defaults to `permdock`. */
|
|
102
|
-
readonly source?: string;
|
|
103
|
-
readonly onAuth?: (event: AuthEvent) => void;
|
|
104
|
-
readonly requestId?: string;
|
|
105
|
-
};
|
|
106
|
-
/**
|
|
107
|
-
* A `SubjectResolver` for opaque API keys (`pdk_<id>_<secret>`): each call
|
|
108
|
-
* resolves a key into the subject its credential acts as. Every failure (a
|
|
109
|
-
* malformed or unknown key, a record that is not a valid credential, expiry,
|
|
110
|
-
* a tenant policy the key breaks, a revoked id, a missing owner, a throwing
|
|
111
|
-
* verifier or callback) is the anonymous subject, never a throw.
|
|
112
|
-
*/
|
|
113
|
-
export declare function subjectFromApiKey(options: ApiKeySubjectOptions): SubjectResolver<string | undefined | null, CredentialPrincipal>;
|
|
114
|
-
//#endregion
|
|
115
|
-
//#region src/server/map-error.d.ts
|
|
116
|
-
type ProblemFromErrorOptions = {
|
|
117
|
-
readonly instance?: string;
|
|
118
|
-
/** Whether the request carried credentials, which picks the `401` challenge. */
|
|
119
|
-
readonly credentials?: boolean;
|
|
120
|
-
};
|
|
121
|
-
/**
|
|
122
|
-
* Turns a thrown PermDock error into its Problem Details response, with the
|
|
123
|
-
* status, `WWW-Authenticate` and rate-limit fields `protect` sends for the
|
|
124
|
-
* same decision. Returns `undefined` for anything else so the framework's own
|
|
125
|
-
* error path takes over.
|
|
126
|
-
*/
|
|
127
|
-
export declare function problemFromError(error: unknown, options?: ProblemFromErrorOptions): Response | undefined;
|
|
128
|
-
//#endregion
|
|
129
|
-
//#region src/server/problem.d.ts
|
|
130
|
-
export declare function wwwAuthenticate(decision: Decision, permission: Permission | undefined, credentials?: boolean): string | undefined;
|
|
131
|
-
export declare function problemResponse(details: ProblemDetails, permission?: Permission, decision?: Decision, extra?: Readonly<Record<string, string>>, credentials?: boolean): Response;
|
|
132
|
-
export declare function validationProblem(detail: string): Response;
|
|
133
|
-
export declare function problemFromDecision(decision: Decision, permission: Permission, subject: Subject | undefined, options?: {
|
|
134
|
-
readonly instance?: string;
|
|
135
|
-
readonly approval?: ApprovalHint;
|
|
136
|
-
/** `'hide'` on a loaded row: a denial answers as `404` `/not-found`. */
|
|
137
|
-
readonly disclosure?: Disclosure;
|
|
138
|
-
/** Whether the request carried credentials, which picks the `401` challenge. */
|
|
139
|
-
readonly credentials?: boolean;
|
|
140
|
-
/** The scope an `insufficient_scope` challenge names; the permission's own scope when absent. */
|
|
141
|
-
readonly scope?: string;
|
|
142
|
-
}): Response;
|
|
143
|
-
//#endregion
|
|
144
|
-
export { type ApiKeyFailureCause, type ApiKeyParts, type ApiKeySubjectOptions, type ApprovalHint, type CacheLifeForOptions, type Connection, type ConnectionData, type ConnectionOptions, type DiscoverViaSignatureAgentOptions, type Guard, InvalidSignatureError, type MemoryCredentials, type OnDenied, type OnDeniedEvent, type OpenApiHooks, type OperationScopes, PROBLEM_BASE, PermDockApprovalRequiredError, PermDockDeniedError, PermDockRevokedError, PermDockValidationError, type ProblemFromErrorOptions, type ProtectOptions, type RequestContext, type RevocationEvent, type RevocationFeed, type ScopeGuard, type ServerKernel, type ServerKernelOptions, type ServerPermDock, type ServerPermDockOptions, type SnapshotHeaders, type SnapshotHeadersOptions, type SnapshotQuery, type StoredCredential, type TenantOption, type TenantScope, type WebBotAuthJwk, type WebBotAuthKeyLookup, type WebBotAuthKeys, type WebBotAuthOptions, type WebBotAuthVerifier, cacheLifeFor, createEvaluationsHandler, discoverViaSignatureAgent, invalidSignatureProblem, invalidSignatureResponse, memoryRevocationFeed, snapshotHeaders, snapshotTag, tenantScope, verifyWebBotAuth };
|
|
4
|
+
import { i as memoryRevocationFeed, n as RevocationFeed, t as RevocationEvent } from "../revocations-R07lFBnX.js";
|
|
5
|
+
import { C as TenantScope, D as ConnectionOptions, E as ConnectionData, S as TenantOption, T as Connection, _ as WebBotAuthVerifier, a as OperationScopes, b as invalidSignatureResponse, c as ServerPermDock, d as DiscoverViaSignatureAgentOptions, f as InvalidSignatureError, g as WebBotAuthOptions, h as WebBotAuthKeys, i as OpenApiHooks, l as ServerPermDockOptions, m as WebBotAuthKeyLookup, n as DeniedResponseEvent, o as ProtectOptions, p as WebBotAuthJwk, r as Guard, s as ScopeGuard, t as DeniedResponse, u as SnapshotQuery, v as discoverViaSignatureAgent, w as tenantScope, x as webBotAuthVerifier, y as invalidSignatureProblem } from "../server-types-BLd4MnBX.js";
|
|
6
|
+
import { i as evaluationsHandler } from "../evaluations-16UqqQ6W.js";
|
|
7
|
+
import { C as subjectFromApiKey, E as createPermDock, S as parseFeedKey, T as problemFromError, _ as generateApiKey, a as SupportSessionContext, b as memoryCredentialStore, c as SupportSessionSubjectOptions, d as ApiKeyFailureCause, f as ApiKeyParts, g as apiKeyVerifier, h as StoredCredential, i as wwwAuthenticate, l as signSupportSession, m as MemoryCredentialStore, n as problemResponse, o as SupportSessionFailureCause, p as ApiKeySubjectOptions, r as validationProblem, s as SupportSessionSource, t as problemFromDecision, u as subjectFromSupportSession, v as generateFeedKey, w as ProblemFromErrorOptions, x as parseApiKey, y as hashApiKey } from "../index-Chrs5fQ-.js";
|
|
8
|
+
import { l as ReplayStore } from "../types-DiQjupG2.js";
|
|
9
|
+
import { a as WebhookInput, c as WebhookMessage, d as WebhookSigningKey, f as WebhookVerifier, h as webhookVerifier, i as WebhookHeaders, l as WebhookSigner, m as webhookSigner, n as WebhookAlgorithm, o as WebhookJwk, p as WebhookVerifierOptions, r as WebhookFailureCause, s as WebhookJwks, t as VerifiedWebhookMessage, u as WebhookSignerOptions } from "../standard-webhooks-6lg8v_is.js";
|
|
10
|
+
import { t as memoryReplayStore } from "../replay-D7iKcLFe.js";
|
|
11
|
+
import { a as snapshotHeaders, i as cacheLifeFor, n as SnapshotHeaders, o as snapshotTag, r as SnapshotHeadersOptions, t as CacheLifeForOptions } from "../snapshot-cache-DqK9eDmM.js";
|
|
12
|
+
import { a as RunKind, c as RunTicketAutomations, d as RunTicketOptions, f as RunTicketSubjectOptions, h as subjectFromRunTicket, i as RunContext, l as RunTicketFailureCause, m as signRunTicket, n as RunAutomation, o as RunPrincipal, p as parseRunTicket, r as RunBinding, s as RunTicket, t as RunActClaim, u as RunTicketInput } from "../run-ticket-BjhTOi6u.js";
|
|
13
|
+
export { type ApiKeyFailureCause, type ApiKeyParts, type ApiKeySubjectOptions, type ApprovalHint, type CacheLifeForOptions, type Connection, type ConnectionData, type ConnectionOptions, type DeniedResponse, type DeniedResponseEvent, type DiscoverViaSignatureAgentOptions, type Guard, InvalidSignatureError, type MemoryCredentialStore, type OpenApiHooks, type OperationScopes, PROBLEM_BASE, PermDockApprovalRequiredError, PermDockDeniedError, PermDockRevokedError, PermDockValidationError, type ProblemFromErrorOptions, type ProtectOptions, type ReplayStore, type RequestContext, type RevocationEvent, type RevocationFeed, type RunActClaim, type RunAutomation, type RunBinding, type RunContext, type RunKind, type RunPrincipal, type RunTicket, type RunTicketAutomations, type RunTicketFailureCause, type RunTicketInput, type RunTicketOptions, type RunTicketSubjectOptions, type ScopeGuard, type ServerPermDock, type ServerPermDockOptions, type SnapshotHeaders, type SnapshotHeadersOptions, type SnapshotQuery, type StoredCredential, type SupportSessionContext, type SupportSessionFailureCause, type SupportSessionSource, type SupportSessionSubjectOptions, type TenantOption, type TenantScope, type VerifiedWebhookMessage, type WebBotAuthJwk, type WebBotAuthKeyLookup, type WebBotAuthKeys, type WebBotAuthOptions, type WebBotAuthVerifier, type WebhookAlgorithm, type WebhookFailureCause, type WebhookHeaders, type WebhookInput, type WebhookJwk, type WebhookJwks, type WebhookMessage, type WebhookSigner, type WebhookSignerOptions, type WebhookSigningKey, type WebhookVerifier, type WebhookVerifierOptions, apiKeyVerifier, cacheLifeFor, createPermDock, discoverViaSignatureAgent, evaluationsHandler, generateApiKey, generateFeedKey, hashApiKey, invalidSignatureProblem, invalidSignatureResponse, memoryCredentialStore, memoryReplayStore, memoryRevocationFeed, parseApiKey, parseFeedKey, parseRunTicket, problemFromDecision, problemFromError, problemResponse, signRunTicket, signSupportSession, snapshotHeaders, snapshotTag, subjectFromApiKey, subjectFromRunTicket, subjectFromSupportSession, tenantScope, validationProblem, webBotAuthVerifier, webhookSigner, webhookVerifier, wwwAuthenticate };
|
package/dist/server/index.js
CHANGED
|
@@ -1,11 +1,14 @@
|
|
|
1
1
|
import { n as PermDockValidationError, t as PROBLEM_BASE } from "../validation-error-ZfUHbKvf.js";
|
|
2
|
-
import { n as PermDockDeniedError, r as PermDockRevokedError, t as PermDockApprovalRequiredError } from "../errors-
|
|
2
|
+
import { n as PermDockDeniedError, r as PermDockRevokedError, t as PermDockApprovalRequiredError } from "../errors-BKy0EfhN.js";
|
|
3
3
|
import { t as memoryRevocationFeed } from "../revocations-Bhr0aMIC.js";
|
|
4
|
-
import { c as problemResponse, d as validationProblem, f as wwwAuthenticate, s as problemFromDecision } from "../problem-
|
|
5
|
-
import {
|
|
6
|
-
import {
|
|
7
|
-
import {
|
|
8
|
-
import { n as
|
|
9
|
-
import {
|
|
10
|
-
import { t as
|
|
11
|
-
|
|
4
|
+
import { c as problemResponse, d as validationProblem, f as wwwAuthenticate, s as problemFromDecision } from "../problem-CTviyH5L.js";
|
|
5
|
+
import { t as memoryReplayStore } from "../replay-Du1tJjG7.js";
|
|
6
|
+
import { n as snapshotHeaders, r as snapshotTag, t as cacheLifeFor } from "../snapshot-cache-DZHQ0KF6.js";
|
|
7
|
+
import { d as discoverViaSignatureAgent, f as invalidSignatureProblem, m as webBotAuthVerifier, o as evaluationsHandler, p as invalidSignatureResponse, u as InvalidSignatureError } from "../evaluations-DZ2CbV5k.js";
|
|
8
|
+
import { n as tenantScope } from "../adapter-context-CRhqyzCk.js";
|
|
9
|
+
import { t as createPermDock } from "../create-DnrmLnLW.js";
|
|
10
|
+
import { a as generateFeedKey, c as parseApiKey, i as generateApiKey, l as parseFeedKey, n as subjectFromSupportSession, o as hashApiKey, r as apiKeyVerifier, s as memoryCredentialStore, t as signSupportSession, u as subjectFromApiKey } from "../server-DqCT4CgZ.js";
|
|
11
|
+
import { n as signRunTicket, r as subjectFromRunTicket, t as parseRunTicket } from "../run-ticket-sxFI6LAk.js";
|
|
12
|
+
import { t as problemFromError } from "../map-error-TCAdw-eW.js";
|
|
13
|
+
import { n as webhookVerifier, t as webhookSigner } from "../standard-webhooks-DgFFD-Ga.js";
|
|
14
|
+
export { InvalidSignatureError, PROBLEM_BASE, PermDockApprovalRequiredError, PermDockDeniedError, PermDockRevokedError, PermDockValidationError, apiKeyVerifier, cacheLifeFor, createPermDock, discoverViaSignatureAgent, evaluationsHandler, generateApiKey, generateFeedKey, hashApiKey, invalidSignatureProblem, invalidSignatureResponse, memoryCredentialStore, memoryReplayStore, memoryRevocationFeed, parseApiKey, parseFeedKey, parseRunTicket, problemFromDecision, problemFromError, problemResponse, signRunTicket, signSupportSession, snapshotHeaders, snapshotTag, subjectFromApiKey, subjectFromRunTicket, subjectFromSupportSession, tenantScope, validationProblem, webBotAuthVerifier, webhookSigner, webhookVerifier, wwwAuthenticate };
|
|
@@ -0,0 +1,453 @@
|
|
|
1
|
+
import { t as compact } from "./compact-CAf557ZB.js";
|
|
2
|
+
import { a as ownRecord } from "./paths-DXSHAMIa.js";
|
|
3
|
+
import { m as annotationsFor, n as findPermission } from "./permission-registry-Br4jSNVi.js";
|
|
4
|
+
import { n as isThenable } from "./thenable-yD7SabqG.js";
|
|
5
|
+
import { f as nowMillis, g as secondsOf, m as rfc3339, o as epochSeconds, u as isoAt } from "./time-DkWjdL98.js";
|
|
6
|
+
import { t as bytesToBase64Url } from "./sha256-D9ihqmvd.js";
|
|
7
|
+
import { n as parseSupportSession } from "./support-session-C6xJQYut.js";
|
|
8
|
+
import { t as anonymousSubject } from "./subject-BGoM5o8B.js";
|
|
9
|
+
import { c as credentialEvent } from "./sink-BEZSlMS_.js";
|
|
10
|
+
import { i as credentialTenant, n as credentialPolicyViolation, o as isFeedId, r as credentialSubject, s as parseCredential } from "./credential-DM2um3ha.js";
|
|
11
|
+
//#region src/server/credentials.ts
|
|
12
|
+
const PREFIX = "pdk_";
|
|
13
|
+
const ID = /^[\w-]{1,128}$/u;
|
|
14
|
+
const TAIL = /^[A-Za-z\d]{49}$/u;
|
|
15
|
+
const ALPHABET = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789";
|
|
16
|
+
const SECRET_LENGTH = 43;
|
|
17
|
+
const CHECKSUM_LENGTH = 6;
|
|
18
|
+
const MAX_KEY = 182;
|
|
19
|
+
const CRC_TABLE = (() => {
|
|
20
|
+
const table = /* @__PURE__ */ new Uint32Array(256);
|
|
21
|
+
for (let index = 0; index < 256; index += 1) {
|
|
22
|
+
let value = index;
|
|
23
|
+
for (let bit = 0; bit < 8; bit += 1) value = value & 1 ? 3988292384 ^ value >>> 1 : value >>> 1;
|
|
24
|
+
table[index] = value >>> 0;
|
|
25
|
+
}
|
|
26
|
+
return table;
|
|
27
|
+
})();
|
|
28
|
+
/** CRC-32 (IEEE 802.3) of the key's ASCII bytes, as 6 characters of `alphabet`. */
|
|
29
|
+
function checksum(text, alphabet) {
|
|
30
|
+
let crc = 4294967295;
|
|
31
|
+
for (let index = 0; index < text.length; index += 1) crc = (CRC_TABLE[(crc ^ (text.codePointAt(index) ?? 0)) & 255] ?? 0) ^ crc >>> 8;
|
|
32
|
+
let value = (crc ^ 4294967295) >>> 0;
|
|
33
|
+
let out = "";
|
|
34
|
+
const base = alphabet.length;
|
|
35
|
+
for (let index = 0; index < CHECKSUM_LENGTH; index += 1) {
|
|
36
|
+
out = (alphabet[value % base] ?? "") + out;
|
|
37
|
+
value = Math.floor(value / base);
|
|
38
|
+
}
|
|
39
|
+
return out;
|
|
40
|
+
}
|
|
41
|
+
/**
|
|
42
|
+
* Splits `pdk_<id>_<secret><checksum>`: `id` is 1 to 128 of `A-Z a-z 0-9 _ -`,
|
|
43
|
+
* the secret 43 base62 characters and the checksum the 6 base62 characters of
|
|
44
|
+
* the CRC-32 of everything before it. Anything else, including a checksum
|
|
45
|
+
* that does not match, is `undefined`.
|
|
46
|
+
*/
|
|
47
|
+
function parseApiKey(key) {
|
|
48
|
+
if (typeof key !== "string" || key.length > MAX_KEY || !key.startsWith(PREFIX)) return;
|
|
49
|
+
const body = key.slice(4);
|
|
50
|
+
const cut = body.lastIndexOf("_");
|
|
51
|
+
if (cut <= 0) return;
|
|
52
|
+
const id = body.slice(0, cut);
|
|
53
|
+
const tail = body.slice(cut + 1);
|
|
54
|
+
if (!ID.test(id) || !TAIL.test(tail)) return;
|
|
55
|
+
const secret = tail.slice(0, SECRET_LENGTH);
|
|
56
|
+
return tail.slice(SECRET_LENGTH) === checksum(`${PREFIX}${id}_${secret}`, ALPHABET) ? {
|
|
57
|
+
id,
|
|
58
|
+
secret
|
|
59
|
+
} : void 0;
|
|
60
|
+
}
|
|
61
|
+
const FEED_PREFIX = "pdfeed_";
|
|
62
|
+
const FEED_ALPHABET = "abcdefghijklmnopqrstuvwxyz234567";
|
|
63
|
+
const FEED_SECRET_LENGTH = 26;
|
|
64
|
+
const FEED_TAIL = /* @__PURE__ */ new RegExp(`^[a-z2-7]{${String(32)}}$`, "u");
|
|
65
|
+
/**
|
|
66
|
+
* Splits `pdfeed_<id>_<secret><checksum>`. `id` is `isFeedId`, the secret is
|
|
67
|
+
* 26 lowercase base32 characters and the checksum is 6 more. A checksum that
|
|
68
|
+
* does not match is `undefined`.
|
|
69
|
+
*/
|
|
70
|
+
function parseFeedKey(key) {
|
|
71
|
+
if (typeof key !== "string" || key.length > 56 || !key.startsWith(FEED_PREFIX)) return;
|
|
72
|
+
const body = key.slice(7);
|
|
73
|
+
const cut = body.lastIndexOf("_");
|
|
74
|
+
if (cut <= 0) return;
|
|
75
|
+
const id = body.slice(0, cut);
|
|
76
|
+
const tail = body.slice(cut + 1);
|
|
77
|
+
if (!isFeedId(id) || !FEED_TAIL.test(tail)) return;
|
|
78
|
+
const secret = tail.slice(0, FEED_SECRET_LENGTH);
|
|
79
|
+
return tail.slice(FEED_SECRET_LENGTH) === checksum(`${FEED_PREFIX}${id}_${secret}`, FEED_ALPHABET) ? {
|
|
80
|
+
id,
|
|
81
|
+
secret
|
|
82
|
+
} : void 0;
|
|
83
|
+
}
|
|
84
|
+
/**
|
|
85
|
+
* A fresh `pdfeed_<id>_<secret><checksum>`: 26 lowercase base32 characters
|
|
86
|
+
* (130 bits) and a 6-character CRC-32 checksum. The whole key is lowercase.
|
|
87
|
+
*/
|
|
88
|
+
function generateFeedKey(id) {
|
|
89
|
+
if (!isFeedId(id)) throw new TypeError("PermDock: a feed id is 1 to 16 of a-z, 0-9 and -");
|
|
90
|
+
let secret = "";
|
|
91
|
+
const bytes = /* @__PURE__ */ new Uint8Array(64);
|
|
92
|
+
while (secret.length < FEED_SECRET_LENGTH) {
|
|
93
|
+
globalThis.crypto.getRandomValues(bytes);
|
|
94
|
+
for (const byte of bytes) if (secret.length < FEED_SECRET_LENGTH) secret += FEED_ALPHABET[byte % 32];
|
|
95
|
+
}
|
|
96
|
+
const key = `${FEED_PREFIX}${id}_${secret}`;
|
|
97
|
+
return `${key}${checksum(key, FEED_ALPHABET)}`;
|
|
98
|
+
}
|
|
99
|
+
/**
|
|
100
|
+
* A fresh `pdk_<id>_<secret><checksum>`: a 43-character base62 secret (about
|
|
101
|
+
* 256 bits) and a 6-character CRC-32 checksum, so a secret scanner can tell a
|
|
102
|
+
* real key from a lookalike without calling the issuer.
|
|
103
|
+
*/
|
|
104
|
+
function generateApiKey(id) {
|
|
105
|
+
if (!ID.test(id)) throw new TypeError("PermDock: an API key id is 1 to 128 of A-Z, a-z, 0-9, _ and -");
|
|
106
|
+
let secret = "";
|
|
107
|
+
const bytes = /* @__PURE__ */ new Uint8Array(64);
|
|
108
|
+
while (secret.length < SECRET_LENGTH) {
|
|
109
|
+
globalThis.crypto.getRandomValues(bytes);
|
|
110
|
+
for (const byte of bytes) if (byte < 248 && secret.length < SECRET_LENGTH) secret += ALPHABET[byte % 62];
|
|
111
|
+
}
|
|
112
|
+
const key = `${PREFIX}${id}_${secret}`;
|
|
113
|
+
return `${key}${checksum(key, ALPHABET)}`;
|
|
114
|
+
}
|
|
115
|
+
/** base64url SHA-256 of the whole key, the value to store and compare. */
|
|
116
|
+
async function hashApiKey(key) {
|
|
117
|
+
const digest = await globalThis.crypto.subtle.digest("SHA-256", new TextEncoder().encode(key));
|
|
118
|
+
return bytesToBase64Url(new Uint8Array(digest));
|
|
119
|
+
}
|
|
120
|
+
function sameHash(left, right) {
|
|
121
|
+
if (left.length !== right.length) return false;
|
|
122
|
+
let difference = 0;
|
|
123
|
+
for (let index = 0; index < left.length; index += 1) difference |= (left.codePointAt(index) ?? 0) ^ (right.codePointAt(index) ?? 0);
|
|
124
|
+
return difference === 0;
|
|
125
|
+
}
|
|
126
|
+
/**
|
|
127
|
+
* A `CredentialVerifier` over the application's own table: `find` looks a
|
|
128
|
+
* key up by the id in it, and the key's hash is compared in constant time.
|
|
129
|
+
* A record that is not a valid v1 credential, or whose id is not the key's,
|
|
130
|
+
* verifies to `null`. A throwing `find` propagates, so the resolver denies
|
|
131
|
+
* with `source-threw`.
|
|
132
|
+
*/
|
|
133
|
+
function apiKeyVerifier(options) {
|
|
134
|
+
return Object.freeze({
|
|
135
|
+
...options.touch === void 0 ? {} : { touch: options.touch },
|
|
136
|
+
async verify(secret) {
|
|
137
|
+
const parts = secret.startsWith(FEED_PREFIX) ? parseFeedKey(secret) : parseApiKey(secret);
|
|
138
|
+
if (parts === void 0) return null;
|
|
139
|
+
const stored = await options.find(parts.id);
|
|
140
|
+
if (stored === null || stored === void 0) return null;
|
|
141
|
+
const credential = parseCredential(stored.credential);
|
|
142
|
+
if (credential === void 0 || credential.id !== parts.id || typeof stored.hash !== "string" || !sameHash(await hashApiKey(secret), stored.hash)) return null;
|
|
143
|
+
return credential;
|
|
144
|
+
}
|
|
145
|
+
});
|
|
146
|
+
}
|
|
147
|
+
function write(sink, event) {
|
|
148
|
+
try {
|
|
149
|
+
const written = sink.write(event);
|
|
150
|
+
if (isThenable(written)) Promise.resolve(written).catch(() => void 0);
|
|
151
|
+
} catch {}
|
|
152
|
+
}
|
|
153
|
+
/**
|
|
154
|
+
* In-process credentials for tests and single-replica apps. `issue`, `rotate`
|
|
155
|
+
* and `revoke` write `credential` events to `sink` when one is given.
|
|
156
|
+
*/
|
|
157
|
+
function memoryCredentialStore(options = {}) {
|
|
158
|
+
const records = /* @__PURE__ */ new Map();
|
|
159
|
+
const used = /* @__PURE__ */ new Map();
|
|
160
|
+
const verifier = apiKeyVerifier({ find: (id) => records.get(id) });
|
|
161
|
+
const emit = (operation, credential) => {
|
|
162
|
+
if (options.sink !== void 0) write(options.sink, [credentialEvent(compact({
|
|
163
|
+
operation,
|
|
164
|
+
credential,
|
|
165
|
+
source: options.source
|
|
166
|
+
}))]);
|
|
167
|
+
};
|
|
168
|
+
const store = async (credential) => {
|
|
169
|
+
const key = credential.kind === "feed" ? generateFeedKey(credential.id) : generateApiKey(credential.id);
|
|
170
|
+
records.set(credential.id, {
|
|
171
|
+
credential,
|
|
172
|
+
hash: await hashApiKey(key)
|
|
173
|
+
});
|
|
174
|
+
return key;
|
|
175
|
+
};
|
|
176
|
+
return Object.freeze({
|
|
177
|
+
verify: (secret) => verifier.verify(secret),
|
|
178
|
+
touch(id, at) {
|
|
179
|
+
if (records.has(id)) used.set(id, isoAt(at.epochMilliseconds));
|
|
180
|
+
},
|
|
181
|
+
lastUsedAt(id) {
|
|
182
|
+
return used.get(id);
|
|
183
|
+
},
|
|
184
|
+
async issue(input) {
|
|
185
|
+
const credential = parseCredential(input);
|
|
186
|
+
if (credential === void 0) throw new TypeError("PermDock: not a valid v1 credential");
|
|
187
|
+
if (records.has(credential.id)) throw new Error(`PermDock: credential '${credential.id}' exists`);
|
|
188
|
+
const key = await store(credential);
|
|
189
|
+
emit("created", credential);
|
|
190
|
+
return key;
|
|
191
|
+
},
|
|
192
|
+
async rotate(id) {
|
|
193
|
+
const current = records.get(id);
|
|
194
|
+
if (current === void 0) return;
|
|
195
|
+
const key = await store(current.credential);
|
|
196
|
+
emit("rotated", current.credential);
|
|
197
|
+
return key;
|
|
198
|
+
},
|
|
199
|
+
revoke(id) {
|
|
200
|
+
const current = records.get(id);
|
|
201
|
+
if (current === void 0) return false;
|
|
202
|
+
records.delete(id);
|
|
203
|
+
used.delete(id);
|
|
204
|
+
emit("revoked", current.credential);
|
|
205
|
+
return true;
|
|
206
|
+
},
|
|
207
|
+
list() {
|
|
208
|
+
return [...records.values()].map((record) => record.credential);
|
|
209
|
+
}
|
|
210
|
+
});
|
|
211
|
+
}
|
|
212
|
+
function isPrincipalRecord(value) {
|
|
213
|
+
return value !== null && typeof value === "object" && !Array.isArray(value) && Object.hasOwn(value, "id") && "id" in value && typeof value.id === "string";
|
|
214
|
+
}
|
|
215
|
+
async function checkStores(options, credential, active) {
|
|
216
|
+
try {
|
|
217
|
+
const tenant = credentialTenant(credential, active);
|
|
218
|
+
const policy = options.settings === void 0 || tenant === void 0 ? void 0 : (await options.settings.settingsFor(tenant))?.credentials;
|
|
219
|
+
if (policy !== void 0 && credentialPolicyViolation(credential, policy) !== void 0) return {
|
|
220
|
+
ok: false,
|
|
221
|
+
cause: "credential-policy"
|
|
222
|
+
};
|
|
223
|
+
if (options.revoked !== void 0 && await options.revoked(credential.id)) return {
|
|
224
|
+
ok: false,
|
|
225
|
+
cause: "credential-revoked"
|
|
226
|
+
};
|
|
227
|
+
if (credential.kind !== "user" || options.principals === void 0) return { ok: true };
|
|
228
|
+
const owner = await options.principals.principal(credential.principal, tenant === void 0 ? {} : { tenant });
|
|
229
|
+
if (!isPrincipalRecord(owner)) return {
|
|
230
|
+
ok: false,
|
|
231
|
+
cause: "owner-unavailable"
|
|
232
|
+
};
|
|
233
|
+
return {
|
|
234
|
+
ok: true,
|
|
235
|
+
owner
|
|
236
|
+
};
|
|
237
|
+
} catch {
|
|
238
|
+
return { ok: false };
|
|
239
|
+
}
|
|
240
|
+
}
|
|
241
|
+
function touch(verifier, id) {
|
|
242
|
+
if (verifier.touch === void 0) return;
|
|
243
|
+
try {
|
|
244
|
+
const touched = verifier.touch(id, { epochMilliseconds: nowMillis() });
|
|
245
|
+
if (isThenable(touched)) Promise.resolve(touched).catch(() => void 0);
|
|
246
|
+
} catch {}
|
|
247
|
+
}
|
|
248
|
+
function sampled(sample) {
|
|
249
|
+
if (sample === 1) return true;
|
|
250
|
+
const draw = /* @__PURE__ */ new Uint32Array(1);
|
|
251
|
+
globalThis.crypto.getRandomValues(draw);
|
|
252
|
+
return (draw[0] ?? 0) / 4294967296 < sample;
|
|
253
|
+
}
|
|
254
|
+
function reportUse(options, credential) {
|
|
255
|
+
const sample = options.sample ?? 1;
|
|
256
|
+
if (options.sink === void 0 || !Number.isFinite(sample) || sample <= 0 || sample > 1 || !sampled(sample)) return;
|
|
257
|
+
write(options.sink, [credentialEvent(compact({
|
|
258
|
+
operation: "used",
|
|
259
|
+
credential,
|
|
260
|
+
source: options.source,
|
|
261
|
+
sample
|
|
262
|
+
}))]);
|
|
263
|
+
}
|
|
264
|
+
function anonymous() {
|
|
265
|
+
return anonymousSubject();
|
|
266
|
+
}
|
|
267
|
+
/**
|
|
268
|
+
* Resolves an opaque API key (`pdk_<id>_<secret>`) into the subject its
|
|
269
|
+
* credential acts as. Every failure (a malformed or unknown key, a record
|
|
270
|
+
* that is not a valid credential, expiry, a tenant policy the key breaks, a
|
|
271
|
+
* revoked id, a missing owner, a throwing verifier, source or callback) is
|
|
272
|
+
* the anonymous subject, never a throw.
|
|
273
|
+
*/
|
|
274
|
+
async function subjectFromApiKey(key, options) {
|
|
275
|
+
const tenant = options.tenant;
|
|
276
|
+
if (typeof key !== "string" || key.length === 0) return anonymous();
|
|
277
|
+
const deny = (cause, reason = "invalid-token") => {
|
|
278
|
+
try {
|
|
279
|
+
options.onAuth?.(compact({
|
|
280
|
+
reason,
|
|
281
|
+
cause,
|
|
282
|
+
source: "api-key",
|
|
283
|
+
requestId: options.requestId
|
|
284
|
+
}));
|
|
285
|
+
} catch {}
|
|
286
|
+
return anonymous();
|
|
287
|
+
};
|
|
288
|
+
const feedKey = key.startsWith(FEED_PREFIX);
|
|
289
|
+
const parts = feedKey ? parseFeedKey(key) : parseApiKey(key);
|
|
290
|
+
if (parts === void 0) return deny("malformed");
|
|
291
|
+
let verified;
|
|
292
|
+
try {
|
|
293
|
+
verified = await options.verifier.verify(key);
|
|
294
|
+
} catch {
|
|
295
|
+
return deny(void 0, "source-threw");
|
|
296
|
+
}
|
|
297
|
+
if (verified === null || verified === void 0) return deny("unknown-credential");
|
|
298
|
+
const credential = parseCredential(verified);
|
|
299
|
+
if (credential === void 0 || credential.id !== parts.id || feedKey !== (credential.kind === "feed") || options.kinds !== void 0 && !options.kinds.includes(credential.kind)) return deny("invalid-claims");
|
|
300
|
+
if (credential.expiresAt !== void 0 && Date.parse(credential.expiresAt) <= nowMillis()) return deny("expired");
|
|
301
|
+
const checked = await checkStores(options, credential, tenant);
|
|
302
|
+
if (!checked.ok) return checked.cause === void 0 ? deny(void 0, "source-threw") : deny(checked.cause);
|
|
303
|
+
const subject = credentialSubject(credential, compact({
|
|
304
|
+
permissions: options.permissions,
|
|
305
|
+
owner: checked.owner
|
|
306
|
+
}));
|
|
307
|
+
if (subject.principal === null) return deny("owner-unavailable");
|
|
308
|
+
reportUse(options, credential);
|
|
309
|
+
touch(options.verifier, credential.id);
|
|
310
|
+
return subject;
|
|
311
|
+
}
|
|
312
|
+
//#endregion
|
|
313
|
+
//#region src/server/support-session.ts
|
|
314
|
+
const SUPPORT_SESSION_TYP = "vnd.permdock.support-session+jwt";
|
|
315
|
+
/**
|
|
316
|
+
* Signs a granted `SupportSession` as a `vnd.permdock.support-session+jwt`
|
|
317
|
+
* (`sub` the viewed principal, `act` the support actor, `jti` the session
|
|
318
|
+
* id) that expires with the session. Throws a `TypeError` for a record
|
|
319
|
+
* `parseSupportSession` refuses.
|
|
320
|
+
*/
|
|
321
|
+
function signSupportSession(session, signer, options = {}) {
|
|
322
|
+
const parsed = parseSupportSession(session);
|
|
323
|
+
if (parsed === void 0) throw new TypeError("PermDock: invalid support session");
|
|
324
|
+
return signer.sign(compact({
|
|
325
|
+
v: 1,
|
|
326
|
+
sub: parsed.principal,
|
|
327
|
+
act: {
|
|
328
|
+
sub: parsed.actor,
|
|
329
|
+
kind: "support"
|
|
330
|
+
},
|
|
331
|
+
tenant: parsed.tenant,
|
|
332
|
+
reason: parsed.reason,
|
|
333
|
+
permissions: parsed.permissions,
|
|
334
|
+
approved_by: parsed.approvedBy,
|
|
335
|
+
reference: parsed.reference
|
|
336
|
+
}), compact({
|
|
337
|
+
typ: SUPPORT_SESSION_TYP,
|
|
338
|
+
audience: options.audience,
|
|
339
|
+
expiresAt: secondsOf(parsed.expiresAt),
|
|
340
|
+
issuedAt: secondsOf(parsed.startedAt),
|
|
341
|
+
jti: parsed.id
|
|
342
|
+
}));
|
|
343
|
+
}
|
|
344
|
+
function sessionOf(claims) {
|
|
345
|
+
const record = ownRecord(claims);
|
|
346
|
+
const act = ownRecord(record?.["act"]);
|
|
347
|
+
const { iat, exp } = record ?? {};
|
|
348
|
+
if (record === void 0 || act === void 0 || act["kind"] !== "support" || act["act"] !== void 0 || typeof iat !== "number" || typeof exp !== "number" || !Number.isSafeInteger(iat) || !Number.isSafeInteger(exp)) return;
|
|
349
|
+
return parseSupportSession({
|
|
350
|
+
v: record["v"],
|
|
351
|
+
id: record["jti"],
|
|
352
|
+
principal: record["sub"],
|
|
353
|
+
actor: act["sub"],
|
|
354
|
+
tenant: record["tenant"],
|
|
355
|
+
reason: record["reason"],
|
|
356
|
+
permissions: record["permissions"],
|
|
357
|
+
startedAt: rfc3339(iat),
|
|
358
|
+
expiresAt: rfc3339(exp),
|
|
359
|
+
approvedBy: record["approved_by"],
|
|
360
|
+
reference: record["reference"]
|
|
361
|
+
});
|
|
362
|
+
}
|
|
363
|
+
async function load(principals, id, tenant) {
|
|
364
|
+
try {
|
|
365
|
+
const loaded = await principals.principal(id, { tenant });
|
|
366
|
+
const record = ownRecord(loaded);
|
|
367
|
+
if (record === void 0 || record["id"] !== id) return;
|
|
368
|
+
return loaded;
|
|
369
|
+
} catch {
|
|
370
|
+
return;
|
|
371
|
+
}
|
|
372
|
+
}
|
|
373
|
+
async function ended(sessions, id) {
|
|
374
|
+
if (sessions === void 0) return false;
|
|
375
|
+
try {
|
|
376
|
+
const live = ownRecord(await sessions.session(id));
|
|
377
|
+
return live === void 0 || live["id"] !== id || live["ended"] === true;
|
|
378
|
+
} catch {
|
|
379
|
+
return true;
|
|
380
|
+
}
|
|
381
|
+
}
|
|
382
|
+
/**
|
|
383
|
+
* Resolves a `vnd.permdock.support-session+jwt` into the subject each
|
|
384
|
+
* request of the session acts as: the viewed principal loaded live, a
|
|
385
|
+
* `support` actor, the session's permissions as the delegation and
|
|
386
|
+
* `context.supportSession`. The actor must still exist. Every failure is the
|
|
387
|
+
* anonymous subject, never a throw.
|
|
388
|
+
*/
|
|
389
|
+
async function subjectFromSupportSession(token, options) {
|
|
390
|
+
if (typeof token !== "string" || token.length === 0) return anonymousSubject();
|
|
391
|
+
const deny = (cause) => {
|
|
392
|
+
try {
|
|
393
|
+
options.onAuth?.(compact({
|
|
394
|
+
reason: "invalid-token",
|
|
395
|
+
cause,
|
|
396
|
+
source: "support-session",
|
|
397
|
+
typ: SUPPORT_SESSION_TYP,
|
|
398
|
+
issuer: options.issuer,
|
|
399
|
+
requestId: options.requestId
|
|
400
|
+
}));
|
|
401
|
+
} catch {}
|
|
402
|
+
return anonymousSubject();
|
|
403
|
+
};
|
|
404
|
+
let session;
|
|
405
|
+
try {
|
|
406
|
+
const verified = await options.verifier.verify(token, compact({
|
|
407
|
+
typ: SUPPORT_SESSION_TYP,
|
|
408
|
+
audience: options.audience,
|
|
409
|
+
issuer: options.issuer,
|
|
410
|
+
clockTolerance: options.clockTolerance
|
|
411
|
+
}));
|
|
412
|
+
if (!verified.ok) return deny(verified.cause);
|
|
413
|
+
if (verified.header.typ?.toLowerCase().replace(/^application\//u, "") !== SUPPORT_SESSION_TYP) return deny("wrong-token-type");
|
|
414
|
+
session = sessionOf(verified.claims);
|
|
415
|
+
} catch {
|
|
416
|
+
return deny("malformed");
|
|
417
|
+
}
|
|
418
|
+
if (session === void 0) return deny("invalid-claims");
|
|
419
|
+
if ((secondsOf(session.expiresAt) ?? 0) <= epochSeconds()) return deny("expired");
|
|
420
|
+
if (await ended(options.sessions, session.id)) return deny("session-ended");
|
|
421
|
+
if (await load(options.principals, session.actor, session.tenant) === void 0) return deny("actor-unavailable");
|
|
422
|
+
const principal = await load(options.principals, session.principal, session.tenant);
|
|
423
|
+
if (principal === void 0) return deny("principal-unavailable");
|
|
424
|
+
const scopes = [];
|
|
425
|
+
let readOnly = true;
|
|
426
|
+
for (const key of session.permissions) {
|
|
427
|
+
const leaf = findPermission(options.permissions, key);
|
|
428
|
+
if (leaf === void 0) return deny("invalid-claims");
|
|
429
|
+
scopes.push(leaf.scope);
|
|
430
|
+
readOnly &&= annotationsFor(leaf).readOnlyHint;
|
|
431
|
+
}
|
|
432
|
+
return Object.freeze(compact({
|
|
433
|
+
principal: Object.freeze({
|
|
434
|
+
...principal,
|
|
435
|
+
tenant: session.tenant
|
|
436
|
+
}),
|
|
437
|
+
actor: Object.freeze(compact({
|
|
438
|
+
id: session.actor,
|
|
439
|
+
kind: "support",
|
|
440
|
+
readOnly: readOnly || void 0
|
|
441
|
+
})),
|
|
442
|
+
delegation: Object.freeze({ scopes }),
|
|
443
|
+
context: Object.freeze({ supportSession: Object.freeze(compact({
|
|
444
|
+
id: session.id,
|
|
445
|
+
reason: session.reason,
|
|
446
|
+
approvedBy: session.approvedBy,
|
|
447
|
+
reference: session.reference
|
|
448
|
+
})) }),
|
|
449
|
+
expiresAt: secondsOf(session.expiresAt)
|
|
450
|
+
}));
|
|
451
|
+
}
|
|
452
|
+
//#endregion
|
|
453
|
+
export { generateFeedKey as a, parseApiKey as c, generateApiKey as i, parseFeedKey as l, subjectFromSupportSession as n, hashApiKey as o, apiKeyVerifier as r, memoryCredentialStore as s, signSupportSession as t, subjectFromApiKey as u };
|