permdock 0.6.0 → 0.8.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 +2 -3
- package/dist/{2020-C9VN-x8c.js → 2020-CJbO8Bvz.js} +1 -3
- package/dist/a2a/index.d.ts +7 -7
- package/dist/a2a/index.js +9 -9
- package/dist/action-result-CL-QCITA.d.ts +19 -0
- package/dist/{adapter-context-CRhqyzCk.js → adapter-context-CIQpQxbE.js} +8 -2
- package/dist/{adoption-scan-DCYe60Pi.js → adoption-scan-BLs67P1l.js} +5 -5
- package/dist/agent/index.d.ts +3 -3
- package/dist/agent/index.js +1 -1
- package/dist/ai-sdk/index.d.ts +31 -10
- package/dist/ai-sdk/index.js +22 -12
- package/dist/{app-data-MuyzVqX8.js → app-data-UNNm07jV.js} +10 -7
- package/dist/{approval-header-CJACtHkv.js → approval-header-8QV6MU4H.js} +6 -3
- package/dist/{approval-prompt-Dg5LeAcT.js → approval-prompt-B8hQY69x.js} +5 -6
- package/dist/{approval-prompt-DvSSPQJX.d.ts → approval-prompt-PYagyQUj.d.ts} +13 -11
- package/dist/approvals/index.d.ts +5 -5
- package/dist/approvals/index.js +7 -7
- package/dist/{approvals-p1PGoVjb.js → approvals-DnIBTuXE.js} +128 -78
- package/dist/{approvers-CqPOLD-o.js → approvers-B4r0N_Uz.js} +8 -2
- package/dist/{arazzo-41WuzHou.js → arazzo-3RhGfkAK.js} +2 -2
- package/dist/{arazzo-CaUVBn7D.js → arazzo-B5-ulWif.js} +6 -6
- package/dist/{args-IIolxxKA.js → args-0FrVs5EH.js} +125 -8
- package/dist/astro/index.d.ts +30 -12
- package/dist/astro/index.js +2 -2
- package/dist/{audience-DabClFLQ.js → audience-BAkBDMqn.js} +8 -8
- package/dist/{auth-DRLEizbL.js → auth--yPyZNgr.js} +21 -10
- package/dist/authzen/index.d.ts +171 -25
- package/dist/authzen/index.js +321 -149
- package/dist/{automation-BNM3TtDo.d.ts → automation-DqEoWHBc.d.ts} +42 -32
- package/dist/{automation-DVjOckjV.js → automation-x3KEUusw.js} +22 -21
- package/dist/base-url-BQbddZO5.js +9 -0
- package/dist/better-auth/index.d.ts +2 -2
- package/dist/better-auth/index.js +13 -7
- package/dist/better-supabase/index.d.ts +392 -220
- package/dist/better-supabase/index.js +293 -152
- package/dist/{bind-DOyrv6zi.d.ts → bind-Cp2hBHzP.d.ts} +27 -12
- package/dist/{bind-CAvgUuKs.js → bind-D_sZSVA3.js} +22 -10
- package/dist/{body-CH5of8Ne.js → body-CJQwYVa8.js} +3 -3
- package/dist/{body-text-QcXok_SI.js → body-text-DQhcmqdY.js} +8 -4
- package/dist/{boundary-BM8a_P6E.js → boundary-BV3O1eud.js} +8 -2
- package/dist/{boundary-BmHxVH1J.d.ts → boundary-C9ck-3uK.d.ts} +13 -4
- package/dist/{budget-NbEtbJC_.js → budget-BELja5A9.js} +6 -3
- package/dist/{budget-JqcRqyhK.d.ts → budget-hYsPz_yE.d.ts} +6 -3
- package/dist/{build-instance-Bu_eDqYw.js → build-instance-CNWaYJyr.js} +3 -3
- package/dist/{canonical-json-BC8_nMTw.js → canonical-json-DwilZ1iB.js} +6 -3
- package/dist/{capability-N1K9IpqS.js → capability-BqX94r07.js} +31 -25
- package/dist/{capability-Drg-1YhL.d.ts → capability-ChuiONQU.d.ts} +41 -29
- package/dist/{casbin-Dyu2gnUD.js → casbin-H0rKxBx2.js} +16 -8
- package/dist/{casbin-Cr7RLtA3.js → casbin-cbSbhT_k.js} +2 -2
- package/dist/{casl-64gpT-8x.js → casl-C4OINZHI.js} +2 -2
- package/dist/{casl-DjEDhTCP.js → casl-CHHoCldP.js} +19 -10
- package/dist/catalog/index.d.ts +104 -23
- package/dist/catalog/index.js +117 -8
- package/dist/{catalog-HD2gf5mY.js → catalog-BFpz2EmT.js} +57 -26
- package/dist/{catalog-DZVbrF-z.js → catalog-DCspHDc8.js} +3 -3
- package/dist/{catalog-doc-Cdn7-0pQ.js → catalog-doc-DjMKzJp9.js} +53 -16
- package/dist/{catalog-fingerprint-CCP0-yQS.js → catalog-fingerprint-e6aCWosn.js} +19 -15
- package/dist/catalog-mRQQQhNK.js +1 -0
- package/dist/catalog-operations-Dadrl7Z-.js +60 -0
- package/dist/{create-CQWIpUG-.js → challenge-DImNcR7B.js} +157 -39
- package/dist/chat/index.d.ts +1 -1
- package/dist/chat/index.js +13 -10
- package/dist/chat-sdk/index.d.ts +44 -26
- package/dist/chat-sdk/index.js +17 -17
- package/dist/checks-CGkP3Z7A.js +40 -0
- package/dist/{claims-map-7oQ3ue4X.js → claims-map-CKkoAAYF.js} +5 -2
- package/dist/{claims-map-Ca-QX8C6.d.ts → claims-map-D1Pb5oRq.d.ts} +8 -5
- package/dist/claude-agent/index.d.ts +6 -6
- package/dist/claude-agent/index.js +6 -3
- package/dist/clerk/index.d.ts +11 -7
- package/dist/clerk/index.js +6 -6
- package/dist/cli/bin.js +4 -4
- package/dist/cli/index.d.ts +82 -7
- package/dist/cli/index.js +6 -6
- package/dist/{clients-C7zLFuWT.d.ts → clients-C_NOET3z.d.ts} +5 -5
- package/dist/{clients-DjU5ABMy.js → clients-DYr3U86j.js} +3 -3
- package/dist/cloud/index.d.ts +186 -38
- package/dist/cloud/index.js +293 -31
- package/dist/{cloud-ytQ3uviA.js → cloud-BFlGMaak.js} +5 -6
- package/dist/{codemod-5mpSpnUY.js → codemod-DLQ9Zpo4.js} +3 -4
- package/dist/{codemod-ua2hHy7w.js → codemod-DWSN2erG.js} +523 -201
- package/dist/collect-B5BL3klN.js +1 -0
- package/dist/{collect-mLTY4nwb.js → collect-B7ZFAJU3.js} +36 -64
- package/dist/{collect-Ci6akVwH.js → collect-Bzv3le0A.js} +6 -6
- package/dist/{compare-pfyVnBjE.js → compare-DTfyUunF.js} +2 -2
- package/dist/compile/index.d.ts +2 -2
- package/dist/compile/index.js +1 -1
- package/dist/{compile-1bsAezL0.d.ts → compile-BFzysW3o.d.ts} +36 -12
- package/dist/{compile-CMqMx_IN.js → compile-EzEMB-7v.js} +77 -33
- package/dist/{completion-BTFrHZhX.js → completion-saoYiRFO.js} +17 -8
- package/dist/config-BwPBfN0t.js +108 -0
- package/dist/{config-Bj2Ixq3d.js → config-DBeXXmBF.js} +2 -2
- package/dist/{config-report-DSpsLpCE.js → config-report-BipSWA6V.js} +9 -6
- package/dist/config-shape-ykV0Vm2n.js +134 -0
- package/dist/{connection-DjhIJSs2.js → connection-B72dg5Q2.js} +23 -22
- package/dist/connector-schema-CYLQNMYq.js +434 -0
- package/dist/{context-B_u3_bDJ.js → context-BnIzxTNE.js} +4 -3
- package/dist/convex/index.d.ts +13 -7
- package/dist/convex/index.js +9 -6
- package/dist/core-H-mbhpZc.js +341 -0
- package/dist/core-hWIARPDz.d.ts +206 -0
- package/dist/{create-CBMmFie-.d.ts → create-BSNrVuxh.d.ts} +87 -34
- package/dist/{create-B30OMUOJ.d.ts → create-BVq1lNQE.d.ts} +49 -28
- package/dist/{create-D_NmPOdH.d.ts → create-CM1FciYG.d.ts} +37 -29
- package/dist/{create-CGm28gyI.js → create-Cq4Uox0f.js} +13 -9
- package/dist/{create-DCF2SvoT.js → create-_noSrY1T.js} +15 -21
- package/dist/{credential-BcoiejpY.js → credential-CyyyvCsL.js} +42 -39
- package/dist/{credentials-DPyHmYz5.js → credentials-CdDxp7jN.js} +6 -6
- package/dist/{deciding-columns-Sq12mEA6.js → deciding-columns-NB4wcyBf.js} +13 -2
- package/dist/{delegation-j6-rc37o.js → delegation-CDB6_keF.js} +31 -22
- package/dist/delivery/index.d.ts +5 -5
- package/dist/delivery/index.js +6 -5
- package/dist/{delivery-DCAgNyCn.js → delivery-BupfvJIV.js} +81 -20
- package/dist/{delivery-event-xX4obB8F.js → delivery-event-JioK5YbS.js} +6 -6
- package/dist/denied-text-CHNlVInN.d.ts +22 -0
- package/dist/{describe-BybMRY7A.js → describe-Bb4hGK5d.js} +6 -5
- package/dist/{describe-B5qgDvEW.d.ts → describe-ByS9LgHK.d.ts} +5 -5
- package/dist/{device-BARQ8eYG.js → device-BwbJNmb2.js} +11 -8
- package/dist/{diff-CmuSD3vc.js → diff-CN8IYhC_.js} +2 -2
- package/dist/{diff-3jbx6Rm4.js → diff-iZWV65nC.js} +23 -14
- package/dist/{digest-B3kc_PgQ.d.ts → digest-8Yx2CchM.d.ts} +3 -3
- package/dist/{doctor-BdZw53-k.js → doctor-CHD1M9R5.js} +485 -141
- package/dist/{doctor-3ZqNHX_G.js → doctor-D3wo-yuz.js} +4 -4
- package/dist/drizzle/index.d.ts +33 -19
- package/dist/drizzle/index.js +17 -9
- package/dist/elysia/index.d.ts +17 -11
- package/dist/elysia/index.js +5 -5
- package/dist/{errors-BKy0EfhN.js → errors-B6R_lg2a.js} +13 -4
- package/dist/{errors-BWXBMaKK.d.ts → errors-CHwoRRpB.d.ts} +4 -1
- package/dist/{errors-CWTY6uih.js → errors-Vpu6rKHl.js} +14 -10
- package/dist/{errors-DH5QEGXh.d.ts → errors-zi_4T-rx.d.ts} +22 -6
- package/dist/{evaluate-CNClBvcj.js → evaluate-Dd8Ta0Ie.js} +185 -80
- package/dist/{evaluations-beAooV0n.js → evaluations-IBceAeKT.js} +41 -20
- package/dist/{evaluations-C_1vdSZc.d.ts → evaluations-z8dQFDaN.d.ts} +12 -6
- package/dist/eve/index.d.ts +9 -6
- package/dist/eve/index.js +4 -4
- package/dist/{event-time-CsegxXxB.js → event-time-BGy48400.js} +8 -4
- package/dist/{expiry-D4_YKRKD.js → expiry-6XByK0dm.js} +8 -5
- package/dist/express/index.d.ts +9 -6
- package/dist/express/index.js +9 -6
- package/dist/fastify/index.d.ts +16 -10
- package/dist/fastify/index.js +8 -5
- package/dist/{fetch-adapter-Dw0MTS3D.d.ts → fetch-adapter-C1DCvpqV.d.ts} +9 -6
- package/dist/{fetch-adapter-DD_gfmrC.js → fetch-adapter-JL43jD3E.js} +14 -11
- package/dist/fields-D0vUI6dq.js +498 -0
- package/dist/{files-C5ZI27eV.js → files-B3AA05f1.js} +21 -5
- package/dist/{files-D_JIzUrP.js → files-BSjrtIHw.js} +11 -4
- package/dist/{fixtures-B7XrLeY7.js → fixtures-A1_sp_tR.js} +15 -6
- package/dist/{flags-C3DktBDY.js → flags-DXjoTVbS.js} +2 -2
- package/dist/{freeze-CrU8nQeX.js → freeze-jjan0lCv.js} +4 -1
- package/dist/{from-snapshot-CTCMsFZk.js → from-snapshot-DCakWRsr.js} +26 -16
- package/dist/gen-B5kvbAoZ.js +58 -0
- package/dist/gen-DWCYcMQM.js +827 -0
- package/dist/generate-CRVV5V7l.js +165 -0
- package/dist/generate-CezbCaTI.js +275 -0
- package/dist/{grantee-hxrUsbpM.js → grantee-Dke-9rd1.js} +4 -4
- package/dist/{grantee-conditions-CcXf8hMM.js → grantee-conditions-BrYPe-w0.js} +12 -12
- package/dist/{grantee-match-DbENBHLB.js → grantee-match-7RZZvoT_.js} +12 -6
- package/dist/{graph-sql-B-dsAT6j.d.ts → graph-sql-BwFC4Qjs.d.ts} +3 -3
- package/dist/h3/index.d.ts +10 -7
- package/dist/h3/index.js +3 -3
- package/dist/headers-B9jQxjtW.d.ts +10 -0
- package/dist/{helpers-CBYVMjwh.js → helpers-DJicaG6f.js} +40 -28
- package/dist/hono/index.d.ts +16 -10
- package/dist/hono/index.js +5 -5
- package/dist/{hosted-BPk51-kX.d.ts → hosted-Cmtxogd0.d.ts} +44 -20
- package/dist/{hosted-B46-5LYE.js → hosted-D0IzESu_.js} +68 -25
- package/dist/{http-ujKm0JXE.js → http-DH94eh6f.js} +4 -4
- package/dist/{http-BBoKefeS.js → http-DKLXrFGk.js} +13 -7
- package/dist/{http-DXJ37RDA.js → http-DOL33cO0.js} +11 -8
- package/dist/{import-wyqXUyjm.js → import-CST57XLp.js} +64 -51
- package/dist/{import-CNV7I2Dw.js → import-_YqhhwvX.js} +6 -6
- package/dist/{index-B8YjkEZ4.d.ts → index-B8s204GL.d.ts} +64 -52
- package/dist/{index-Ch8LpNDp.d.ts → index-BT5-1VsX.d.ts} +64 -25
- package/dist/{index-DuWxc5dt.d.ts → index-BW_0MZOS.d.ts} +388 -149
- package/dist/index-BhxEUY9J.d.ts +233 -0
- package/dist/index-Bv5iXPqU.d.ts +210 -0
- package/dist/{index-C-6Letxg.d.ts → index-_9UiQIkt.d.ts} +164 -77
- package/dist/index.d.ts +22 -21
- package/dist/index.js +35 -33
- package/dist/{init-GG6Jh8HD.js → init-Dz_PsHdv.js} +5 -5
- package/dist/{init-DeMYsnYJ.js → init-cE3A8aXq.js} +10 -10
- package/dist/{instance-options-BsVpyGIk.d.ts → instance-options-B0KXqTrJ.d.ts} +4 -4
- package/dist/{instance-snapshot-BOEhcqIF.js → instance-snapshot--JWiTrvO.js} +81 -56
- package/dist/{instant-BluqDvyS.js → instant-DK3Iz83e.js} +2 -2
- package/dist/{internals-Dk8A8fX3.js → internals-B3IgHrvo.js} +6 -3
- package/dist/{json-schema-B-vAwlde.js → json-schema-BPGa-RjQ.js} +9 -3
- package/dist/{json-schema-CN_iLFH2.d.ts → json-schema-BfXgnRNT.d.ts} +4 -4
- package/dist/jwt/index.d.ts +125 -17
- package/dist/jwt/index.js +157 -16
- package/dist/{kernel-D0NVb1cK.js → kernel-C-fYydV2.js} +151 -16
- package/dist/kysely/index.d.ts +49 -33
- package/dist/kysely/index.js +9 -7
- package/dist/{live-options-BaAFCIiu.js → live-options-BBIT68le.js} +2 -2
- package/dist/{load-DFS_ry0W.js → load-DjSU5KXO.js} +6 -6
- package/dist/load-Dm0pSYH3.js +1 -0
- package/dist/{login-Dfe5RlYk.js → login-D-8tMqzo.js} +4 -4
- package/dist/{login-imhuwvn3.js → login-DplQ0s84.js} +18 -15
- package/dist/{manifest-dvL2XEe1.js → manifest-Cgiq5oqc.js} +67 -37
- package/dist/{manifest-mx5ghSFM.d.ts → manifest-CzzWtnAb.d.ts} +144 -28
- package/dist/{manifest-schema-C0kK_8V0.js → manifest-schema-2r37XRhD.js} +80 -9
- package/dist/{manifest-C8IzW3Do.js → manifest-wg8WkkpD.js} +11 -7
- package/dist/{map-claims-D3oRmTk0.js → map-claims-BNWCJtmP.js} +27 -18
- package/dist/{map-error-Dr70oA_3.js → map-error-pasIGqMT.js} +7 -7
- package/dist/{markers-C6joDI3o.js → markers-BeHZ4x9Q.js} +20 -5
- package/dist/mcp/index.d.ts +154 -47
- package/dist/mcp/index.js +200 -41
- package/dist/{migrate-CIq4-E9F.js → migrate-B7oP_sQU.js} +102 -31
- package/dist/module-values-BJTBdo6y.js +107 -0
- package/dist/nest/index.d.ts +23 -13
- package/dist/nest/index.js +18 -11
- package/dist/next/client.d.ts +5 -2
- package/dist/next/client.js +1 -1
- package/dist/next/index.d.ts +72 -26
- package/dist/next/index.js +110 -6
- package/dist/next/plugin.d.ts +1 -1
- package/dist/next/plugin.js +4 -3
- package/dist/node/index.d.ts +5 -5
- package/dist/node/index.js +3 -3
- package/dist/{ocsf-BFp-PZZA.js → ocsf-TcjRBgIs.js} +15 -5
- package/dist/openai/index.d.ts +13 -7
- package/dist/openai/index.js +3 -3
- package/dist/openapi/index.d.ts +61 -30
- package/dist/openapi/index.js +2 -2
- package/dist/{openapi-B7HZ0f-r.js → openapi-BOsx0xn9.js} +34 -24
- package/dist/{openapi-C4dDTVEd.js → openapi-CBZUhA3l.js} +4 -5
- package/dist/{openapi-DD1SV-5-.js → openapi-VeHHU2l9.js} +23 -14
- package/dist/{operation-findings-DgATDpvh.js → operation-findings-CXtFzlKJ.js} +3 -3
- package/dist/{operations-X0VM7F3m.d.ts → operations-Ci_rT6Uo.d.ts} +10 -7
- package/dist/orpc/index.d.ts +68 -14
- package/dist/orpc/index.js +62 -13
- package/dist/otel/index.d.ts +7 -4
- package/dist/otel/index.js +8 -5
- package/dist/output-files-BHOIlrfD.js +1 -0
- package/dist/{output-files-DhRBBE4n.js → output-files-BIQ_9pIs.js} +29 -17
- package/dist/{output-1im__-08.js → output-tkju6U7R.js} +15 -7
- package/dist/ownership-B4L59T9u.js +1054 -0
- package/dist/parse-1_ZheTW5.js +151 -0
- package/dist/parse-local-manifest-BQhTlLQS.d.ts +10 -0
- package/dist/parse-local-manifest-DEiCF4ah.js +69 -0
- package/dist/{parse-request-D_tUXG6M.js → parse-request-CwCZpyjV.js} +7 -8
- package/dist/{paths-DXSHAMIa.js → paths-CUvURzHp.js} +4 -1
- package/dist/pdp/index.d.ts +9 -6
- package/dist/pdp/index.js +23 -12
- package/dist/{peer-CRvC7Hg1.js → peer-C9LvBCcb.js} +1 -1
- package/dist/peer-Q0fuZ6hx.js +982 -0
- package/dist/{permdock-SV8ZINYT.d.ts → permdock-B6Sf4T_S.d.ts} +270 -117
- package/dist/{permdock-BrAscV28.js → permdock-L-_I_3zP.js} +226 -74
- package/dist/{permission-registry-Br4jSNVi.js → permission-registry-B8tYxPIt.js} +24 -11
- package/dist/{vocabulary-CN8H_9UF.d.ts → permission-types-CAY-GU7e.d.ts} +130 -104
- package/dist/{permissions-u_KHg-sN.d.ts → permissions-Bx6UI8n1.d.ts} +6 -2
- package/dist/{permissions-B-wCP5ZC.js → permissions-CVXmRILq.js} +3 -3
- package/dist/{permissions-BPxlwVhN.js → permissions-mDcTWoBs.js} +8 -5
- package/dist/pg-DQTqRrou.js +60 -0
- package/dist/{pins-8ILTftC9.js → pins-nqarl3oE.js} +4 -1
- package/dist/pkce-CnmmYqUZ.js +21 -0
- package/dist/{policy-77FSAq_V.d.ts → policy-Ba4bDhaj.d.ts} +5 -5
- package/dist/{policy-DbM5YYtV.js → policy-CLQ8__GF.js} +49 -20
- package/dist/{policy-from-catalog-C2gMa2Dj.js → policy-from-catalog-CJgOm6aq.js} +28 -25
- package/dist/{policy-module-CTlwMvLI.js → policy-module-xym9fnSq.js} +12 -6
- package/dist/{policy-types-n0uRTsW8.d.ts → policy-types-CCiDRZBH.d.ts} +802 -334
- package/dist/postgres-store-DcyrPS-r.js +1028 -0
- package/dist/{postgrest-DAjUkF9w.js → postgrest-D4nuPXIQ.js} +88 -36
- package/dist/{postgrest-CEgRbefE.d.ts → postgrest-DicQyqm-.d.ts} +60 -30
- package/dist/powersync-DHNQX06W.js +1117 -0
- package/dist/{powersync-DISt6SUe.js → powersync-DXqGuq9A.js} +3 -3
- package/dist/powersync-Djf-zCpB.js +1 -0
- package/dist/preset/index.d.ts +38 -28
- package/dist/preset/index.js +1 -1
- package/dist/{preset-DZdU0tne.js → preset-BjLzeFpp.js} +58 -34
- package/dist/{principal-source-pHneukrx.js → principal-source-C6N60GtM.js} +10 -10
- package/dist/prisma/index.d.ts +69 -41
- package/dist/prisma/index.js +21 -17
- package/dist/{problem-CTviyH5L.js → problem-BVLHFK33.js} +41 -21
- package/dist/{problem-details-cn5X30gZ.js → problem-details-CLDgX1KV.js} +13 -4
- package/dist/{problem-types-CJ2325SZ.js → problem-types-DSsRfONQ.js} +4 -1
- package/dist/prompt-BYc6drYW.js +938 -0
- package/dist/protected-action-BE7N_Luo.d.ts +58 -0
- package/dist/protected-action-DUYqb-Ma.js +80 -0
- package/dist/{protected-BlF0F6wL.js → protected-action-QEA8arRB.js} +48 -14
- package/dist/{provider-B1al-AZz.js → provider-C55OGXJ7.js} +5 -4
- package/dist/{provider-DILL9oPK.d.ts → provider-DXfq5c2d.d.ts} +1 -1
- package/dist/{provider-store-DM6DNcta.js → provider-store-CaTv00tr.js} +13 -9
- package/dist/pull-B65ndFNZ.js +1 -0
- package/dist/{pull-jEwbf80J.js → pull-CwpGaQSi.js} +12 -11
- package/dist/{push-BD4f15co.js → push-DgssgzkK.js} +62 -16
- package/dist/{pushed-policy-DCW91KQU.d.ts → pushed-policy-D1Eoi6NM.d.ts} +12 -6
- package/dist/{pushed-policy-CqtxkV4G.js → pushed-policy-ITwYKvvH.js} +10 -7
- package/dist/react/index.d.ts +9 -8
- package/dist/react/index.js +7 -6
- package/dist/react/provider-client.d.ts +1 -1
- package/dist/react/provider-client.js +1 -1
- package/dist/react-native/index.d.ts +104 -51
- package/dist/react-native/index.js +394 -67
- package/dist/{refs-K6eWUJ0H.js → refs-C8BKxc_e.js} +17 -3
- package/dist/{relation-walk-3OyDBF0S.js → relation-walk-DK_gkgL7.js} +12 -9
- package/dist/{relations-BnCWnJGI.js → relations-BxvRvDHK.js} +3 -3
- package/dist/{replay-Du1tJjG7.js → replay-BU09ad4L.js} +1 -1
- package/dist/{replay-Bkm-Ne4l.d.ts → replay-DNftIb_R.d.ts} +1 -1
- package/dist/{request-context-C81Pip9n.js → request-context-C25ilqiJ.js} +8 -8
- package/dist/{request-schema-CMreVuFM.js → request-schema-DhX7UbfQ.js} +4 -1
- package/dist/resend/index.d.ts +34 -28
- package/dist/resend/index.js +29 -29
- package/dist/resolve-names-CF7xXLSG.js +201 -0
- package/dist/{resource-relations-D_jw0BFx.js → resource-relations-8-pCScBO.js} +18 -9
- package/dist/{retire-CALjIQ7e.js → retire-B2xffQgY.js} +15 -6
- package/dist/{revocations-R07lFBnX.d.ts → revocations-BaUXHM1N.d.ts} +6 -3
- package/dist/{rls-DTvYd-lI.js → rls-CNEH2_BG.js} +743 -624
- package/dist/{rls-BAqP4q66.js → rls-Ca8Jz9b5.js} +41 -10
- package/dist/{role-builder-uWQZ4v84.js → role-builder-BK2-T6oD.js} +41 -20
- package/dist/rolldown-runtime-C3I60J0A.js +4 -0
- package/dist/{row-conditions-h2HythXQ.js → row-conditions-BAGHOmVq.js} +4 -3
- package/dist/{rpc-VSl5ylaQ.js → rpc-fNqAIqQk.js} +8 -5
- package/dist/{run-CUKuz0A8.js → run-Bz26OTfO.js} +26 -23
- package/dist/run-D-JE8QWb.js +1 -0
- package/dist/{run-ticket-DocwaTKn.d.ts → run-ticket-DbWI9f99.d.ts} +33 -13
- package/dist/{run-ticket-sxFI6LAk.js → run-ticket-Dv7aF7Dk.js} +29 -8
- package/dist/{runtime-D3VTAiCA.js → runtime-BGnrOkVH.js} +5 -2
- package/dist/{saas-BCXRuXca.js → saas-iWnUdwCt.js} +42 -29
- package/dist/{scan-qvOe0hS3.js → scan-DCj1KQfn.js} +1 -1
- package/dist/{schema-B4v0Qrac.js → schema-BOJjqlWL.js} +3 -2
- package/dist/{schema-yLuBWWsh.js → schema-Dst9I9Gs.js} +9 -5
- package/dist/scim/index.d.ts +3 -2
- package/dist/scim/index.js +3 -1
- package/dist/scim-D8YupzX1.js +44 -0
- package/dist/{scim-ClHtpyV3.js → scim-jJBJ7g1Z.js} +35 -551
- package/dist/{scopes-CUPSjo9q.js → scopes-0Up_UA2t.js} +42 -24
- package/dist/server/index.d.ts +12 -12
- package/dist/server/index.js +13 -13
- package/dist/{server-C3WXAHZj.js → server-3cVlTLde.js} +31 -31
- package/dist/{server-types-CKQiCnON.d.ts → server-types-CIlpSA2G.d.ts} +81 -46
- package/dist/{sha256-D9ihqmvd.js → sha256-C-4WXKIu.js} +4 -3
- package/dist/{shared-BAK8t4Uo.js → shared-Afctg7B0.js} +100 -61
- package/dist/{shared-DvvFzYXe.js → shared-l0oGGetg.js} +9 -6
- package/dist/{signals-D3NcTKUS.js → signals-B1vHR3fN.js} +2 -2
- package/dist/{sink-BEZSlMS_.js → sink-D9_vh372.js} +32 -21
- package/dist/{sink-4-eQIRWf.d.ts → sink-Dvi7YZG_.d.ts} +44 -20
- package/dist/{skills-B6lVdD_W.js → skills-Bjj7BNEQ.js} +16 -12
- package/dist/{skills-CTYwkl44.js → skills-OuoMR49L.js} +3 -3
- package/dist/{snapshot-B7DkYg6g.js → snapshot-CXlzi69u.js} +21 -18
- package/dist/{snapshot-cache-PXI-vGpY.d.ts → snapshot-cache-BAXZ0KOp.d.ts} +21 -12
- package/dist/{snapshot-cache-DZHQ0KF6.js → snapshot-cache-Bx_4xC_6.js} +14 -11
- package/dist/solid/index.d.ts +55 -15
- package/dist/solid/index.js +46 -12
- package/dist/solid-start/index.d.ts +30 -12
- package/dist/solid-start/index.js +3 -3
- package/dist/sources-B1Os_YUu.d.ts +312 -0
- package/dist/{sources-vs5dGOsS.js → sources-CMAM-2A3.js} +156 -51
- package/dist/sources-qoIJQrJv.js +11 -0
- package/dist/{sql-B5T1IL83.js → sql-0WjxIp9g.js} +32 -7
- package/dist/sql-B80DFdpG.d.ts +10 -0
- package/dist/{src-Cu2m75uo.js → src-DZ0l9UAg.js} +305 -123
- package/dist/ssf/index.d.ts +4 -4
- package/dist/ssf/index.js +665 -224
- package/dist/{standard-webhooks-rbD7LS6h.d.ts → standard-webhooks-C-qX4mJW.d.ts} +7 -7
- package/dist/{standard-webhooks-DgFFD-Ga.js → standard-webhooks-D67a3nzk.js} +5 -5
- package/dist/{store-BDutJkDL.js → store-RNFvaJJv.js} +43 -29
- package/dist/{store-options-u0ycEe8s.js → store-options-Dil3lraY.js} +105 -15
- package/dist/stores-C0Kta5Ft.d.ts +59 -0
- package/dist/{stores-CGhM8BN_.js → stores-DxZWDXCs.js} +42 -5
- package/dist/{stream-CvdUS9V1.js → stream-CDvF0sJm.js} +5 -5
- package/dist/{stream-CeCMJmBB.d.ts → stream-ltuLdtTG.d.ts} +4 -3
- package/dist/{style-DiKWnAvn.js → style-DblOtSga.js} +1 -1
- package/dist/{style-Uao76wO7.js → style-Ds11Hmk4.js} +3 -1
- package/dist/{subject-settings-CkEwrw3W.js → subject-settings-8sH5HlII.js} +8 -4
- package/dist/{row-check-Dt35czLy.d.ts → subject-settings-vNW8qmUH.d.ts} +30 -18
- package/dist/supabase/index.d.ts +48 -37
- package/dist/supabase/index.js +6 -6
- package/dist/supabase/middleware.d.ts +19 -13
- package/dist/supabase/middleware.js +7 -7
- package/dist/{supabase-x5JtR2tc.js → supabase-BL1qJzzY.js} +82 -36
- package/dist/{supabase-By_frk3U.js → supabase-D39cuGPt.js} +3 -3
- package/dist/{supabase-hook-BMoEhZir.js → supabase-hook-B-yXnzUl.js} +1206 -286
- package/dist/supabase-hook-H-MtE9Wd.js +1 -0
- package/dist/supautils-BU-pAEpf.js +808 -0
- package/dist/{support-session-C6xJQYut.js → support-session-BsmPCbz8.js} +22 -22
- package/dist/svelte/PermissionBoundary.svelte +2 -6
- package/dist/svelte/Protected.svelte +2 -8
- package/dist/svelte/index.d.ts +9 -8
- package/dist/svelte/index.js +10 -9
- package/dist/svelte/runtime.d.ts +4 -4
- package/dist/svelte/runtime.js +4 -4
- package/dist/svelte/source.d.ts +9 -8
- package/dist/svelte/source.js +6 -5
- package/dist/sveltekit/index.d.ts +30 -12
- package/dist/sveltekit/index.js +2 -2
- package/dist/{ownership-DqaJNJPn.js → tables-DeMNEy6V.js} +1025 -1085
- package/dist/tanstack-start/index.d.ts +22 -10
- package/dist/tanstack-start/index.js +2 -2
- package/dist/{target-Bw37TFNA.js → target-qdEAnnhU.js} +6 -6
- package/dist/{tenancy-DN2QAx9z.js → tenancy-5d1zVBvK.js} +36 -21
- package/dist/terminal/index.d.ts +23 -14
- package/dist/terminal/index.js +17 -20
- package/dist/testing/core.d.ts +2 -0
- package/dist/testing/core.js +1 -0
- package/dist/testing/fixtures/index.d.ts +15 -0
- package/dist/testing/fixtures/index.js +831 -0
- package/dist/testing/index.d.ts +235 -285
- package/dist/testing/index.js +502 -927
- package/dist/testing/saas/index.d.ts +43 -27
- package/dist/testing/saas/index.js +2 -2
- package/dist/testing/saas/permissions.d.ts +1 -1
- package/dist/testing/saas/permissions.js +1 -1
- package/dist/text-diff-BtfSmdUo.js +444 -0
- package/dist/{thenable-yD7SabqG.js → thenable-BNSM1U2R.js} +12 -3
- package/dist/{time-DkWjdL98.js → time-nR1JesoH.js} +32 -8
- package/dist/{token-BLZcjQgt.js → token-DC9EQiet.js} +15 -13
- package/dist/{tool-refusal-CMLN5xhn.js → tool-refusal-Qpjs_W6M.js} +5 -2
- package/dist/trpc/index.d.ts +11 -8
- package/dist/trpc/index.js +15 -9
- package/dist/type-helpers-BIPIDa6a.d.ts +50 -0
- package/dist/{types-8RnwUAvE.d.ts → types-AMJ5qoU_.d.ts} +49 -30
- package/dist/{types-C_IiEs64.d.ts → types-B2mlGuhW.d.ts} +14 -11
- package/dist/{types-_WhUP7ud.d.ts → types-B4uqKDnp.d.ts} +25 -12
- package/dist/{types-CX7AvRqP.d.ts → types-BJk0BKRX.d.ts} +24 -14
- package/dist/types-B_d_g7T3.d.ts +262 -0
- package/dist/{types-BdtSDbBO.d.ts → types-B_tiYvk8.d.ts} +59 -32
- package/dist/{types-DqzsnlSA.js → types-CcUXciSj.js} +17 -5
- package/dist/{types-Dfv0aTER.d.ts → types-DC1Loeh3.d.ts} +449 -168
- package/dist/{types-lUlG3TVd.d.ts → types-DHKPcqzr.d.ts} +2 -2
- package/dist/{types-C791HFu9.d.ts → types-DjuMBNF9.d.ts} +68 -32
- package/dist/{types-C863OQiR.d.ts → types-HzqOtvsJ.d.ts} +23 -12
- package/dist/{types-Druu9wLM.d.ts → types-ZzRGoViD.d.ts} +77 -24
- package/dist/{types-BzzaHxt3.d.ts → types-ah9NlU6j.d.ts} +137 -48
- package/dist/{types-CVZSNocA.d.ts → types-djVzLlIV.d.ts} +31 -14
- package/dist/{types-BtHtcKMr.d.ts → types-yUuPR5Hy.d.ts} +47 -24
- package/dist/unplugin/index.d.ts +1 -1
- package/dist/unplugin/index.js +2 -2
- package/dist/usage-CYeXek0p.js +1 -0
- package/dist/{usage-SveTRTyr.js → usage-CxEzS4ey.js} +50 -26
- package/dist/{usage-CRVl9V3t.js → usage-ab0PdusX.js} +2 -2
- package/dist/{validation-error-ZfUHbKvf.js → validation-error-CYg2kJEw.js} +4 -1
- package/dist/{validation-error-DHUrAkku.d.ts → validation-error-YGg2mXyH.d.ts} +5 -2
- package/dist/{validity-CZ7-y0Cj.js → validity-Buc7w8E9.js} +13 -10
- package/dist/{verifier-DHuh-okk.js → verifier-DUV6pLqZ.js} +10 -4
- package/dist/{verify-BaAKx7t6.js → verify-DZeqoWu5.js} +417 -489
- package/dist/version-DMQ0dnN5.js +48 -0
- package/dist/version-DizhmD72.js +1 -0
- package/dist/{views-DTIIO-oQ.js → views-CD8wuL4Z.js} +19 -6
- package/dist/vocabulary-DEJ5j4mR.d.ts +70 -0
- package/dist/vue/index.d.ts +71 -21
- package/dist/vue/index.js +50 -13
- package/dist/{waiter-B986w1oK.d.ts → waiter-Bu9zAlE0.d.ts} +13 -10
- package/dist/{waiter-BGUtGYoU.js → waiter-aBLM63_f.js} +1 -1
- package/dist/{watch-vea54PRw.js → watch-Cx_WciLE.js} +8 -8
- package/dist/watch-DB42U1ib.js +1 -0
- package/dist/webmcp/index.d.ts +11 -11
- package/dist/webmcp/index.js +8 -5
- package/dist/{where-scope-C9vfEphl.js → where-scope-DlCdCM_8.js} +56 -30
- package/dist/{who-can-DWBAcaCQ.js → who-can-rI7dCR9Q.js} +23 -20
- package/dist/workflow/index.d.ts +3 -3
- package/dist/workflow/index.js +13 -13
- package/dist/workflow-sdk/index.d.ts +19 -13
- package/dist/workflow-sdk/index.js +6 -6
- package/dist/{wrap-gX61EtpB.js → wrap-B2wziJI_.js} +11 -5
- package/dist/{wrap-C5jC6sKI.d.ts → wrap-DlJE3gS_.d.ts} +8 -5
- package/package.json +25 -14
- package/schemas/catalog-v1.json +3 -0
- package/schemas/cli-result-v1.json +1 -0
- package/schemas/cloud-api-v1.json +152 -7
- package/schemas/connector-v1.json +8 -0
- package/schemas/supabase-claims-v1.json +5 -0
- package/schemas/supabase-manifest-v1.json +308 -75
- package/skills/permdock/SKILL.md +1 -0
- package/skills/permdock-agents/references/runtimes.md +3 -1
- package/skills/permdock-approvals/references/stores-and-resume.md +2 -1
- package/skills/permdock-credentials/references/tokens-keys-links.md +8 -6
- package/skills/permdock-data/references/queries-and-rls.md +6 -2
- package/skills/permdock-tenancy/SKILL.md +1 -1
- package/skills/permdock-tenancy/references/ownership-and-custom-roles.md +2 -1
- package/skills/permdock-wire/references/adapters.md +28 -22
- package/skills/permdock-wire/references/policy-options.md +1 -0
- package/dist/catalog-BoWglDPI.js +0 -1
- package/dist/collect-D7eQDffE.js +0 -1
- package/dist/config-bs_kZeYq.js +0 -162
- package/dist/denied-text-CiFQNuMV.d.ts +0 -19
- package/dist/fields-OYG_JR78.js +0 -203
- package/dist/generate-CNU1pIOo.js +0 -171
- package/dist/headers-BIjfMaoC.js +0 -8
- package/dist/headers-CIbDTUTK.d.ts +0 -7
- package/dist/index-Cp_ilKi1.d.ts +0 -91
- package/dist/index-CueFnxQc.d.ts +0 -110
- package/dist/load-BxEtwlBS.js +0 -1
- package/dist/output-files-B3IZJksC.js +0 -1
- package/dist/package-root-Dk_ETdkp.js +0 -31
- package/dist/parse-Cxq0WxrA.js +0 -53
- package/dist/parse-local-manifest-5ODwqu8b.d.ts +0 -10
- package/dist/parse-local-manifest-CVSs6J9I.js +0 -34
- package/dist/peer-C8swJ2GH.js +0 -50
- package/dist/policies-DP2nqRoF.js +0 -295
- package/dist/powersync-BkWWCS1K.js +0 -538
- package/dist/powersync-MMJ2mI2q.js +0 -1
- package/dist/problem-details-B45V5d2b.d.ts +0 -7
- package/dist/prompt-DfZLJLIn.js +0 -32
- package/dist/protected-RFGpakN9.d.ts +0 -38
- package/dist/pull-CvpINcMK.js +0 -1
- package/dist/run-DDwUaJDU.js +0 -1
- package/dist/sources-Xc4zkszI.d.ts +0 -190
- package/dist/stores-BUGNbJTt.d.ts +0 -30
- package/dist/supabase-hook-CCw5m35C.js +0 -1
- package/dist/supautils-B6HYL9eL.js +0 -91
- package/dist/text-diff-BQcUapOb.js +0 -15
- package/dist/types-B3_ooZgZ.d.ts +0 -172
- package/dist/usage-CZpSQP6L.js +0 -1
- package/dist/version-CEbQ5UeM.js +0 -18
- package/dist/version-DXkYUISx.js +0 -1
- package/dist/watch--ovlPOc0.js +0 -1
package/dist/cloud/index.d.ts
CHANGED
|
@@ -1,29 +1,169 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import { m as ApprovalStore } from "../types-
|
|
3
|
-
import { i as CatalogEventData, l as CloudEventType, r as CLOUD_EVENT_TYPES, s as CloudEvent } from "../sink-
|
|
4
|
-
import { c as DeliveryTransport } from "../types-
|
|
5
|
-
import { a as CloudConnectionOptions, c as CloudOptions, i as CloudClient, l as CloudSignerOptions, n as CloudCatalog, o as CloudEndpointOptions, r as CloudCatalogPush, s as CloudEndpoints, t as CloudApproverOptions } from "../types-
|
|
6
|
-
import { n as ApprovalWaiter } from "../waiter-
|
|
7
|
-
import { l as ReplayStore } from "../types-
|
|
8
|
-
import { f as WebhookVerifier, r as WebhookFailureCause$1, s as WebhookJwks } from "../standard-webhooks-
|
|
1
|
+
import { $t as CredentialEvent, Qt as AutomationEvent, Rt as Instant, Xt as AccessEvent, en as DecisionEvent, in as DirectoryEvent, nn as DeliveryEvent, on as MembershipEvent, tn as DeliveryChannel, ut as TokenSigner } from "../policy-types-CCiDRZBH.js";
|
|
2
|
+
import { m as ApprovalStore } from "../types-B_tiYvk8.js";
|
|
3
|
+
import { i as CatalogEventData, l as CloudEventType, r as CLOUD_EVENT_TYPES, s as CloudEvent } from "../sink-Dvi7YZG_.js";
|
|
4
|
+
import { c as DeliveryTransport } from "../types-yUuPR5Hy.js";
|
|
5
|
+
import { a as CloudConnectionOptions, c as CloudOptions, i as CloudClient, l as CloudSignerOptions, n as CloudCatalog, o as CloudEndpointOptions, r as CloudCatalogPush, s as CloudEndpoints, t as CloudApproverOptions } from "../types-AMJ5qoU_.js";
|
|
6
|
+
import { n as ApprovalWaiter } from "../waiter-Bu9zAlE0.js";
|
|
7
|
+
import { l as ReplayStore } from "../types-DjuMBNF9.js";
|
|
8
|
+
import { f as WebhookVerifier, r as WebhookFailureCause$1, s as WebhookJwks } from "../standard-webhooks-C-qX4mJW.js";
|
|
9
|
+
//#region src/cloud/base-url.d.ts
|
|
10
|
+
/**
|
|
11
|
+
* The one base URL of PermDock Cloud. The platform issuer is this URL; its
|
|
12
|
+
* OAuth routes, `/.well-known/oauth-authorization-server` and `/openapi.json`
|
|
13
|
+
* sit at the root, unversioned, and the data routes under `/v1`.
|
|
14
|
+
*/
|
|
15
|
+
export declare const CLOUD_BASE_URL = "https://permdock.com/api";
|
|
16
|
+
/** The scopes the platform issuer grants a person's login. */
|
|
17
|
+
type CloudScope = "projects:read" | "policy:read" | "catalog:write" | "evidence:read" | "approvals:read";
|
|
18
|
+
//#endregion
|
|
9
19
|
//#region src/cloud/request.d.ts
|
|
10
20
|
/**
|
|
11
|
-
* The environment URL and JWK Set URL `cloud()` uses
|
|
12
|
-
*
|
|
21
|
+
* The environment URL and JWK Set URL `cloud()` uses when the environment is
|
|
22
|
+
* configured: `environment`, else `PERMDOCK_CLOUD_ENV`. Throws when neither is
|
|
23
|
+
* set; `resolveCloudEndpoints` then asks the Cloud which environment the key
|
|
24
|
+
* belongs to.
|
|
13
25
|
*/
|
|
14
26
|
export declare function cloudEndpoints(options?: CloudEndpointOptions): CloudEndpoints;
|
|
27
|
+
/**
|
|
28
|
+
* The environment URL and JWK Set URL for a key: `cloudEndpoints(options)` when
|
|
29
|
+
* the environment is configured, else the environment `GET /v1/environment`
|
|
30
|
+
* names for `key` (`PERMDOCK_CLOUD_KEY`). Rejects when the Cloud does not
|
|
31
|
+
* answer or answers another issuer.
|
|
32
|
+
*/
|
|
33
|
+
export declare function resolveCloudEndpoints(options?: CloudConnectionOptions): Promise<CloudEndpoints>;
|
|
15
34
|
//#endregion
|
|
16
35
|
//#region src/cloud/create.d.ts
|
|
17
36
|
export declare function cloud(options?: CloudOptions): CloudClient;
|
|
18
37
|
//#endregion
|
|
38
|
+
//#region src/cloud/oauth.d.ts
|
|
39
|
+
type CloudOAuthOptions = {
|
|
40
|
+
/** The client id the dashboard issued, or one from `/oauth/register`. */
|
|
41
|
+
readonly clientId: string;
|
|
42
|
+
/**
|
|
43
|
+
* Registered with the client; the Cloud redirects here with `code` and
|
|
44
|
+
* `state`.
|
|
45
|
+
*/
|
|
46
|
+
readonly redirectUri: string;
|
|
47
|
+
/**
|
|
48
|
+
* A confidential client's secret, sent as `client_secret_basic` (RFC 6749
|
|
49
|
+
* section 2.3.1). Server-only.
|
|
50
|
+
*/
|
|
51
|
+
readonly clientSecret?: string;
|
|
52
|
+
/** The Cloud base URL and platform issuer; defaults to `CLOUD_BASE_URL`. */
|
|
53
|
+
readonly url?: string;
|
|
54
|
+
/** Requested on `authorizeUrl`; defaults to `projects:read` and `policy:read`. */
|
|
55
|
+
readonly scopes?: readonly CloudScope[];
|
|
56
|
+
readonly fetch?: typeof fetch;
|
|
57
|
+
/** The clock `expires_at` is computed from; defaults to the system clock. */
|
|
58
|
+
readonly now?: () => Instant;
|
|
59
|
+
};
|
|
60
|
+
/**
|
|
61
|
+
* A token response, with RFC 6749 field names; `expires_at` is seconds since
|
|
62
|
+
* the epoch.
|
|
63
|
+
*/
|
|
64
|
+
type CloudCredential = {
|
|
65
|
+
readonly access_token: string;
|
|
66
|
+
readonly token_type?: string;
|
|
67
|
+
readonly expires_at?: number;
|
|
68
|
+
readonly refresh_token?: string;
|
|
69
|
+
readonly scope?: string;
|
|
70
|
+
};
|
|
71
|
+
/**
|
|
72
|
+
* A started authorization. Keep `state` and `codeVerifier` server-side until
|
|
73
|
+
* the callback.
|
|
74
|
+
*/
|
|
75
|
+
type CloudAuthorization = {
|
|
76
|
+
/** Where to send the browser. */
|
|
77
|
+
readonly url: string;
|
|
78
|
+
readonly state: string;
|
|
79
|
+
readonly codeVerifier: string;
|
|
80
|
+
};
|
|
81
|
+
/**
|
|
82
|
+
* `GET /v1/projects` item. A project is one environment: `id` is the `{env}` of
|
|
83
|
+
* `/v1/environments/{env}`.
|
|
84
|
+
*/
|
|
85
|
+
type CloudProject = {
|
|
86
|
+
readonly id: string;
|
|
87
|
+
readonly name: string;
|
|
88
|
+
readonly environment: string;
|
|
89
|
+
readonly slug?: string;
|
|
90
|
+
readonly issuer?: string;
|
|
91
|
+
readonly catalog?: {
|
|
92
|
+
readonly version: number;
|
|
93
|
+
readonly fingerprint: string;
|
|
94
|
+
};
|
|
95
|
+
readonly updatedAt?: string;
|
|
96
|
+
};
|
|
97
|
+
type CloudProjectPage = {
|
|
98
|
+
readonly items: readonly CloudProject[];
|
|
99
|
+
/** Pass back as `cursor` for the next page. */
|
|
100
|
+
readonly next?: string;
|
|
101
|
+
};
|
|
102
|
+
type CloudOAuthClient = {
|
|
103
|
+
/** The platform issuer the client discovers its endpoints from. */
|
|
104
|
+
readonly issuer: string;
|
|
105
|
+
/** An authorization code request with PKCE `S256` and a fresh `state`. */
|
|
106
|
+
readonly authorizeUrl: (options?: {
|
|
107
|
+
readonly scopes?: readonly CloudScope[];
|
|
108
|
+
}) => Promise<CloudAuthorization>;
|
|
109
|
+
/**
|
|
110
|
+
* Redeems the callback URL. Throws `state-mismatch` unless it echoes
|
|
111
|
+
* `pending.state`, `issuer-mismatch` for an RFC 9207 `iss` of another server,
|
|
112
|
+
* and `authorization-denied` for an `error` or a missing `code`.
|
|
113
|
+
*/
|
|
114
|
+
readonly exchangeCode: (callback: string | URL, pending: Pick<CloudAuthorization, "state" | "codeVerifier">) => Promise<CloudCredential>;
|
|
115
|
+
readonly refresh: (refreshToken: string) => Promise<CloudCredential>;
|
|
116
|
+
/** `GET /v1/projects` with a login holding `projects:read`. */
|
|
117
|
+
readonly listProjects: (accessToken: string, options?: {
|
|
118
|
+
readonly cursor?: string;
|
|
119
|
+
}) => Promise<CloudProjectPage>;
|
|
120
|
+
};
|
|
121
|
+
/**
|
|
122
|
+
* An OAuth 2.0 client of the PermDock Cloud platform issuer, for an app that
|
|
123
|
+
* signs its users in to PermDock Cloud and reads their projects. Endpoints come
|
|
124
|
+
* from the issuer's RFC 8414 metadata; every call throws a `CloudAuthError`.
|
|
125
|
+
*/
|
|
126
|
+
export declare function cloudOAuth(options: CloudOAuthOptions): CloudOAuthClient;
|
|
127
|
+
//#endregion
|
|
128
|
+
//#region src/cloud/oauth-error.d.ts
|
|
129
|
+
type CloudAuthErrorCode = "discovery-failed" | "state-mismatch" | "issuer-mismatch" | "authorization-denied" | "token-refused" | "invalid-token" | "insufficient-scope" | "forbidden" | "rate-limited" | "unreachable" | "unexpected-response";
|
|
130
|
+
type CloudAuthErrorDetails = {
|
|
131
|
+
/** The HTTP status, when the Cloud answered. */
|
|
132
|
+
readonly status?: number;
|
|
133
|
+
/**
|
|
134
|
+
* The RFC 6749 or RFC 6750 `error` the Cloud sent (`invalid_grant`,
|
|
135
|
+
* `insufficient_scope`).
|
|
136
|
+
*/
|
|
137
|
+
readonly error?: string;
|
|
138
|
+
/** The scope an `insufficient_scope` challenge names. */
|
|
139
|
+
readonly scope?: string;
|
|
140
|
+
};
|
|
141
|
+
/**
|
|
142
|
+
* A failed `cloudOAuth` call. `code` tells a dead token (`invalid-token`) from
|
|
143
|
+
* a missing scope (`insufficient-scope`).
|
|
144
|
+
*/
|
|
145
|
+
export declare class CloudAuthError extends Error {
|
|
146
|
+
override readonly name: "CloudAuthError";
|
|
147
|
+
readonly code: CloudAuthErrorCode;
|
|
148
|
+
readonly status: number | undefined;
|
|
149
|
+
readonly error: string | undefined;
|
|
150
|
+
readonly scope: string | undefined;
|
|
151
|
+
constructor(code: CloudAuthErrorCode, message: string, details?: CloudAuthErrorDetails);
|
|
152
|
+
}
|
|
153
|
+
/**
|
|
154
|
+
* Matches by `name` and `code`, so an error from another copy of the module
|
|
155
|
+
* still maps.
|
|
156
|
+
*/
|
|
157
|
+
export declare function isCloudAuthError(value: unknown): value is CloudAuthError;
|
|
158
|
+
//#endregion
|
|
19
159
|
//#region src/cloud/delivery.d.ts
|
|
20
160
|
/**
|
|
21
161
|
* A `DeliveryTransport` for `channel` that hands each checked recipient to
|
|
22
|
-
* PermDock Cloud, which sends it from its hosted email, chat or webhook
|
|
23
|
-
*
|
|
24
|
-
*
|
|
25
|
-
*
|
|
26
|
-
*
|
|
162
|
+
* PermDock Cloud, which sends it from its hosted email, chat or webhook sender
|
|
163
|
+
* and reports back through `com.permdock.delivery.*` events. The router has
|
|
164
|
+
* already decided the recipient: the Cloud receives the target and the
|
|
165
|
+
* permission that let it through, never a decision to make. `Idempotency-Key`
|
|
166
|
+
* is the delivery's idempotency key, so a retry repeats it.
|
|
27
167
|
*/
|
|
28
168
|
export declare function cloudDeliveryTransport<C extends DeliveryChannel>(channel: C, options?: CloudConnectionOptions): DeliveryTransport<C>;
|
|
29
169
|
//#endregion
|
|
@@ -31,11 +171,11 @@ export declare function cloudDeliveryTransport<C extends DeliveryChannel>(channe
|
|
|
31
171
|
/**
|
|
32
172
|
* A `TokenSigner` backed by the environment's PermDock Cloud keys, typically
|
|
33
173
|
* KMS-held, for run tickets (`vnd.permdock.run+jwt`) and every other signed
|
|
34
|
-
* output an app issues. The Cloud signs only what the app sends: it sets
|
|
35
|
-
*
|
|
36
|
-
*
|
|
37
|
-
* outputs, so their `typ` values are refused here. Verify what it
|
|
38
|
-
* `joseTokenVerifier({ jwks: cloudEndpoints().jwks })`.
|
|
174
|
+
* output an app issues. The Cloud signs only what the app sends: it sets `iss`
|
|
175
|
+
* to the environment URL and adds no claim. Policy documents, snapshots,
|
|
176
|
+
* evidence exports, Security Event Tokens and `at+jwt` access tokens are the
|
|
177
|
+
* Cloud's own outputs, so their `typ` values are refused here. Verify what it
|
|
178
|
+
* signs with `joseTokenVerifier({ jwks: cloudEndpoints().jwks })`.
|
|
39
179
|
*/
|
|
40
180
|
export declare function cloudSigner(options?: CloudSignerOptions): TokenSigner;
|
|
41
181
|
//#endregion
|
|
@@ -49,8 +189,8 @@ type Types = typeof CLOUD_EVENT_TYPES;
|
|
|
49
189
|
type PermDockCloudEvent = Envelope<Types["decision"], DecisionEvent> | Envelope<Types["approvalRequested"] | Types["approvalResolved"] | Types["approvalExpired"] | Types["approvalCancelled"], DecisionEvent> | Envelope<Types["directoryCreated"] | Types["directoryReplaced"] | Types["directoryPatched"] | Types["directoryDeleted"], DirectoryEvent> | Envelope<Types["membershipAdded"] | Types["membershipRemoved"] | Types["membershipChanged"], MembershipEvent> | Envelope<Types["credentialCreated"] | Types["credentialUsed"] | Types["credentialRotated"] | Types["credentialRevoked"], CredentialEvent> | Envelope<Types["catalogPublished"] | Types["catalogDrifted"], CatalogEventData> | Envelope<Types["supportSessionStarted"] | Types["supportSessionEnded"], AccessEvent> | Envelope<Types["automationPublished"] | Types["automationChanged"] | Types["automationRevoked"] | Types["automationRun"], AutomationEvent> | Envelope<Types["deliverySent"] | Types["deliveryDelivered"] | Types["deliveryBounced"] | Types["deliveryComplained"] | Types["deliveryFailed"], DeliveryEvent>;
|
|
50
190
|
type WebhookOptions = {
|
|
51
191
|
/**
|
|
52
|
-
* A verifier to reuse across deliveries, so the JWKS is fetched once;
|
|
53
|
-
*
|
|
192
|
+
* A verifier to reuse across deliveries, so the JWKS is fetched once; built
|
|
193
|
+
* from `jwks`, `secret`, `replay`, `tolerance` and `now` when absent.
|
|
54
194
|
*/
|
|
55
195
|
readonly verifier?: WebhookVerifier;
|
|
56
196
|
/** `cloud().jwks`, a JWKS URL or an inline key set, for `v1a` signatures. */
|
|
@@ -64,7 +204,10 @@ type WebhookOptions = {
|
|
|
64
204
|
readonly now?: () => Instant;
|
|
65
205
|
readonly fetch?: typeof fetch;
|
|
66
206
|
};
|
|
67
|
-
/**
|
|
207
|
+
/**
|
|
208
|
+
* The Standard Webhooks verifier's cause, or `invalid-events` for a signed body
|
|
209
|
+
* that is not a CloudEvents batch.
|
|
210
|
+
*/
|
|
68
211
|
type WebhookFailureCause = WebhookFailureCause$1 | "invalid-events";
|
|
69
212
|
type VerifiedWebhook = {
|
|
70
213
|
readonly ok: true;
|
|
@@ -83,8 +226,8 @@ type VerifiedWebhook = {
|
|
|
83
226
|
*/
|
|
84
227
|
export declare function parseCloudEvent(value: unknown): PermDockCloudEvent | null;
|
|
85
228
|
/**
|
|
86
|
-
* Verifies a PermDock Cloud webhook delivery: Standard Webhooks headers over
|
|
87
|
-
*
|
|
229
|
+
* Verifies a PermDock Cloud webhook delivery: Standard Webhooks headers over an
|
|
230
|
+
* `application/cloudevents-batch+json` body (or one
|
|
88
231
|
* `application/cloudevents+json` event). There is no unsigned mode, and it
|
|
89
232
|
* never throws.
|
|
90
233
|
*/
|
|
@@ -92,13 +235,19 @@ export declare function verifyWebhook(request: Request, options: WebhookOptions)
|
|
|
92
235
|
//#endregion
|
|
93
236
|
//#region src/cloud/waiter.d.ts
|
|
94
237
|
type CloudApprovalWaiterOptions = WebhookOptions & ({
|
|
95
|
-
/**
|
|
238
|
+
/**
|
|
239
|
+
* Read when a wait starts and every `interval` after; typically
|
|
240
|
+
* `cloud().approvals`.
|
|
241
|
+
*/
|
|
96
242
|
readonly store: ApprovalStore;
|
|
97
243
|
/** Milliseconds between fallback reads of `store`. Defaults to 60000. */
|
|
98
244
|
readonly interval?: number;
|
|
99
245
|
readonly waiter?: undefined;
|
|
100
246
|
} | {
|
|
101
|
-
/**
|
|
247
|
+
/**
|
|
248
|
+
* A durable runner's waiter (`workflowSdkWaiter()`); `wait` and `wake`
|
|
249
|
+
* go to it.
|
|
250
|
+
*/
|
|
102
251
|
readonly waiter: ApprovalWaiter;
|
|
103
252
|
readonly store?: undefined;
|
|
104
253
|
readonly interval?: undefined;
|
|
@@ -107,23 +256,22 @@ type CloudApprovalWaiter = ApprovalWaiter & {
|
|
|
107
256
|
/**
|
|
108
257
|
* The endpoint for the environment's webhook connector. It verifies the
|
|
109
258
|
* Standard Webhooks signature and wakes the wait of every
|
|
110
|
-
* `com.permdock.approval.resolved`, `.expired` and `.cancelled` event in
|
|
111
|
-
*
|
|
112
|
-
*
|
|
259
|
+
* `com.permdock.approval.resolved`, `.expired` and `.cancelled` event in the
|
|
260
|
+
* batch. It answers `204` once handled or replayed, and Problem Details
|
|
261
|
+
* otherwise.
|
|
113
262
|
*/
|
|
114
263
|
readonly webhook: (request: Request) => Promise<Response>;
|
|
115
264
|
};
|
|
116
265
|
/** The approval token of each event that ends a wait, in delivery order. */
|
|
117
266
|
export declare function approvalTokensOf(events: readonly PermDockCloudEvent[]): readonly string[];
|
|
118
267
|
/**
|
|
119
|
-
* An `ApprovalWaiter` that PermDock Cloud wakes. Mount `webhook` on the
|
|
120
|
-
*
|
|
121
|
-
*
|
|
122
|
-
*
|
|
123
|
-
*
|
|
124
|
-
* `
|
|
125
|
-
* received.
|
|
268
|
+
* An `ApprovalWaiter` that PermDock Cloud wakes. Mount `webhook` on the route
|
|
269
|
+
* the environment's webhook connector posts to: when an approval is resolved,
|
|
270
|
+
* expires or is cancelled, the parked run for its token wakes. Waking never
|
|
271
|
+
* approves anything. The run decides again with the token, and only the app's
|
|
272
|
+
* `decide` and its approval store can grant. Without `waiter`, waits poll
|
|
273
|
+
* `store` as a fallback for a webhook another process received.
|
|
126
274
|
*/
|
|
127
275
|
export declare function cloudApprovalWaiter(options: CloudApprovalWaiterOptions): CloudApprovalWaiter;
|
|
128
276
|
//#endregion
|
|
129
|
-
export type { CloudApprovalWaiter, CloudApprovalWaiterOptions, CloudApproverOptions, CloudCatalog, CloudCatalogPush, CloudClient, CloudConnectionOptions, CloudEndpointOptions, CloudEndpoints, CloudOptions, CloudSignerOptions, PermDockCloudEvent, VerifiedWebhook, WebhookFailureCause, WebhookOptions };
|
|
277
|
+
export type { CloudApprovalWaiter, CloudApprovalWaiterOptions, CloudApproverOptions, CloudAuthErrorCode, CloudAuthErrorDetails, CloudAuthorization, CloudCatalog, CloudCatalogPush, CloudClient, CloudConnectionOptions, CloudCredential, CloudEndpointOptions, CloudEndpoints, CloudOAuthClient, CloudOAuthOptions, CloudOptions, CloudProject, CloudProjectPage, CloudScope, CloudSignerOptions, PermDockCloudEvent, VerifiedWebhook, WebhookFailureCause, WebhookOptions };
|
package/dist/cloud/index.js
CHANGED
|
@@ -1,13 +1,276 @@
|
|
|
1
1
|
import { r as isRecord, t as compact } from "../compact-CAf557ZB.js";
|
|
2
|
-
import { n as freezeDeep } from "../freeze-
|
|
3
|
-
import { o as statusProblem } from "../problem-details-
|
|
4
|
-
import {
|
|
5
|
-
import {
|
|
6
|
-
import {
|
|
7
|
-
import { n as
|
|
8
|
-
import {
|
|
9
|
-
import {
|
|
10
|
-
import {
|
|
2
|
+
import { n as freezeDeep } from "../freeze-jjan0lCv.js";
|
|
3
|
+
import { o as statusProblem } from "../problem-details-CLDgX1KV.js";
|
|
4
|
+
import { h as secondsAt } from "../time-nR1JesoH.js";
|
|
5
|
+
import { r as CLOUD_EVENT_TYPES } from "../sink-D9_vh372.js";
|
|
6
|
+
import { i as parseCloudEventBatch, r as parseCloudEvent$1 } from "../catalog-fingerprint-e6aCWosn.js";
|
|
7
|
+
import { n as readBodyText } from "../body-text-DQhcmqdY.js";
|
|
8
|
+
import { l as problemResponse } from "../problem-BVLHFK33.js";
|
|
9
|
+
import { t as timeoutSignal } from "../timeout-D51niuQP.js";
|
|
10
|
+
import { n as webhookVerifier } from "../standard-webhooks-D67a3nzk.js";
|
|
11
|
+
import { c as stringField, n as discoverAuthorizationServer, r as parseToken } from "../device-BwbJNmb2.js";
|
|
12
|
+
import { t as pollingApprovalWaiter } from "../waiter-aBLM63_f.js";
|
|
13
|
+
import { i as isDeliveryTarget } from "../target-qdEAnnhU.js";
|
|
14
|
+
import { t as CLOUD_BASE_URL } from "../base-url-BQbddZO5.js";
|
|
15
|
+
import { a as isCompactJws, i as cloudEndpoints, n as cloud, o as resolveCloudEndpoints, r as cloudConnection, t as bearerChallenge } from "../challenge-DImNcR7B.js";
|
|
16
|
+
import { n as randomToken, t as pkce } from "../pkce-CnmmYqUZ.js";
|
|
17
|
+
//#region src/cloud/oauth-error.ts
|
|
18
|
+
/**
|
|
19
|
+
* A failed `cloudOAuth` call. `code` tells a dead token (`invalid-token`) from
|
|
20
|
+
* a missing scope (`insufficient-scope`).
|
|
21
|
+
*/
|
|
22
|
+
var CloudAuthError = class extends Error {
|
|
23
|
+
name = "CloudAuthError";
|
|
24
|
+
code;
|
|
25
|
+
status;
|
|
26
|
+
error;
|
|
27
|
+
scope;
|
|
28
|
+
constructor(code, message, details = {}) {
|
|
29
|
+
super(message);
|
|
30
|
+
this.code = code;
|
|
31
|
+
this.status = details.status;
|
|
32
|
+
this.error = details.error;
|
|
33
|
+
this.scope = details.scope;
|
|
34
|
+
}
|
|
35
|
+
};
|
|
36
|
+
const CODES = /* @__PURE__ */ new Set([
|
|
37
|
+
"discovery-failed",
|
|
38
|
+
"state-mismatch",
|
|
39
|
+
"issuer-mismatch",
|
|
40
|
+
"authorization-denied",
|
|
41
|
+
"token-refused",
|
|
42
|
+
"invalid-token",
|
|
43
|
+
"insufficient-scope",
|
|
44
|
+
"forbidden",
|
|
45
|
+
"rate-limited",
|
|
46
|
+
"unreachable",
|
|
47
|
+
"unexpected-response"
|
|
48
|
+
]);
|
|
49
|
+
/**
|
|
50
|
+
* Matches by `name` and `code`, so an error from another copy of the module
|
|
51
|
+
* still maps.
|
|
52
|
+
*/
|
|
53
|
+
function isCloudAuthError(value) {
|
|
54
|
+
if (!(value instanceof Error) || value.name !== "CloudAuthError") return false;
|
|
55
|
+
const code = Reflect.get(value, "code");
|
|
56
|
+
return typeof code === "string" && CODES.has(code);
|
|
57
|
+
}
|
|
58
|
+
//#endregion
|
|
59
|
+
//#region src/cloud/oauth.ts
|
|
60
|
+
/**
|
|
61
|
+
* Milliseconds a Cloud OAuth or read request may take; a slower one fails with
|
|
62
|
+
* `unreachable`.
|
|
63
|
+
*/
|
|
64
|
+
const OAUTH_TIMEOUT_MS = 1e4;
|
|
65
|
+
const DEFAULT_SCOPES = ["projects:read", "policy:read"];
|
|
66
|
+
function trimSlash(value) {
|
|
67
|
+
return value.replace(/\/+$/u, "");
|
|
68
|
+
}
|
|
69
|
+
/**
|
|
70
|
+
* The form-urlencoding RFC 6749 section 2.3.1 applies to client_secret_basic
|
|
71
|
+
* credentials.
|
|
72
|
+
*/
|
|
73
|
+
function formEncode(value) {
|
|
74
|
+
return encodeURIComponent(value).replaceAll("%20", "+");
|
|
75
|
+
}
|
|
76
|
+
function isLoopback(hostname) {
|
|
77
|
+
return hostname === "localhost" || hostname === "127.0.0.1" || hostname === "[::1]";
|
|
78
|
+
}
|
|
79
|
+
/**
|
|
80
|
+
* An endpoint must be `https:`, except on a loopback issuer, which a local
|
|
81
|
+
* Cloud serves over plain HTTP.
|
|
82
|
+
*/
|
|
83
|
+
function secureEndpoint(value, issuer) {
|
|
84
|
+
try {
|
|
85
|
+
const url = new URL(value);
|
|
86
|
+
return url.protocol === "https:" || url.protocol === "http:" && isLoopback(new URL(issuer).hostname);
|
|
87
|
+
} catch {
|
|
88
|
+
return false;
|
|
89
|
+
}
|
|
90
|
+
}
|
|
91
|
+
async function readRecord(response) {
|
|
92
|
+
const text = await readBodyText(response);
|
|
93
|
+
if (!text.ok) return null;
|
|
94
|
+
try {
|
|
95
|
+
const body = JSON.parse(text.text);
|
|
96
|
+
return isRecord(body) ? body : null;
|
|
97
|
+
} catch {
|
|
98
|
+
return null;
|
|
99
|
+
}
|
|
100
|
+
}
|
|
101
|
+
function optionalString(value) {
|
|
102
|
+
return value === void 0 || typeof value === "string";
|
|
103
|
+
}
|
|
104
|
+
function parseProject(value) {
|
|
105
|
+
if (!isRecord(value) || typeof value["id"] !== "string" || value["id"] === "" || typeof value["name"] !== "string" || typeof value["environment"] !== "string" || value["environment"] === "" || !optionalString(value["slug"]) || !optionalString(value["issuer"]) || !optionalString(value["updatedAt"])) return null;
|
|
106
|
+
const catalog = value["catalog"];
|
|
107
|
+
if (catalog !== void 0 && (!isRecord(catalog) || !Number.isInteger(catalog["version"]) || typeof catalog["fingerprint"] !== "string")) return null;
|
|
108
|
+
return compact({
|
|
109
|
+
id: value["id"],
|
|
110
|
+
name: value["name"],
|
|
111
|
+
environment: value["environment"],
|
|
112
|
+
slug: value["slug"],
|
|
113
|
+
issuer: value["issuer"],
|
|
114
|
+
catalog: isRecord(catalog) && typeof catalog["version"] === "number" && typeof catalog["fingerprint"] === "string" ? {
|
|
115
|
+
version: catalog["version"],
|
|
116
|
+
fingerprint: catalog["fingerprint"]
|
|
117
|
+
} : void 0,
|
|
118
|
+
updatedAt: value["updatedAt"]
|
|
119
|
+
});
|
|
120
|
+
}
|
|
121
|
+
function refusal$1(response) {
|
|
122
|
+
const challenge = bearerChallenge(response.headers.get("www-authenticate"));
|
|
123
|
+
const error = challenge?.params["error"];
|
|
124
|
+
const status = response.status;
|
|
125
|
+
if (status === 401) return new CloudAuthError("invalid-token", "PermDock Cloud refused the access token; refresh it or sign in again", compact({
|
|
126
|
+
status,
|
|
127
|
+
error: error ?? "invalid_token"
|
|
128
|
+
}));
|
|
129
|
+
if (status === 403 && error === "insufficient_scope") {
|
|
130
|
+
const scope = challenge?.params["scope"];
|
|
131
|
+
return new CloudAuthError("insufficient-scope", `The access token lacks ${scope ?? "a required scope"}; sign in again with it`, compact({
|
|
132
|
+
status,
|
|
133
|
+
error,
|
|
134
|
+
scope
|
|
135
|
+
}));
|
|
136
|
+
}
|
|
137
|
+
if (status === 403) return new CloudAuthError("forbidden", "The access token may not read this resource", compact({
|
|
138
|
+
status,
|
|
139
|
+
error
|
|
140
|
+
}));
|
|
141
|
+
if (status === 429) return new CloudAuthError("rate-limited", `PermDock Cloud rate-limited the request; retry after ${response.headers.get("retry-after") ?? "a while"} seconds`, { status });
|
|
142
|
+
return new CloudAuthError("unexpected-response", `PermDock Cloud answered HTTP ${String(status)}`, { status });
|
|
143
|
+
}
|
|
144
|
+
/**
|
|
145
|
+
* An OAuth 2.0 client of the PermDock Cloud platform issuer, for an app that
|
|
146
|
+
* signs its users in to PermDock Cloud and reads their projects. Endpoints come
|
|
147
|
+
* from the issuer's RFC 8414 metadata; every call throws a `CloudAuthError`.
|
|
148
|
+
*/
|
|
149
|
+
function cloudOAuth(options) {
|
|
150
|
+
const issuer = trimSlash(options.url ?? "https://permdock.com/api");
|
|
151
|
+
const fetchFn = options.fetch ?? globalThis.fetch.bind(globalThis);
|
|
152
|
+
const scopes = options.scopes ?? DEFAULT_SCOPES;
|
|
153
|
+
let discovered;
|
|
154
|
+
const discover = async () => {
|
|
155
|
+
const body = await discoverAuthorizationServer(issuer, { fetch: fetchFn });
|
|
156
|
+
const authorization = body === null ? void 0 : stringField(body, "authorization_endpoint");
|
|
157
|
+
const token = body === null ? void 0 : stringField(body, "token_endpoint");
|
|
158
|
+
const methods = body?.["code_challenge_methods_supported"];
|
|
159
|
+
if (authorization === void 0 || token === void 0 || !secureEndpoint(authorization, issuer) || !secureEndpoint(token, issuer) || !Array.isArray(methods) || !methods.includes("S256")) throw new CloudAuthError("discovery-failed", `No usable RFC 8414 metadata for ${issuer}`);
|
|
160
|
+
return {
|
|
161
|
+
authorization,
|
|
162
|
+
token
|
|
163
|
+
};
|
|
164
|
+
};
|
|
165
|
+
const endpoints = () => {
|
|
166
|
+
discovered ??= discover().catch((error) => {
|
|
167
|
+
discovered = void 0;
|
|
168
|
+
throw error;
|
|
169
|
+
});
|
|
170
|
+
return discovered;
|
|
171
|
+
};
|
|
172
|
+
const send = async (url, init) => {
|
|
173
|
+
try {
|
|
174
|
+
return await fetchFn(url, {
|
|
175
|
+
...init,
|
|
176
|
+
signal: timeoutSignal(OAUTH_TIMEOUT_MS)
|
|
177
|
+
});
|
|
178
|
+
} catch {
|
|
179
|
+
throw new CloudAuthError("unreachable", `PermDock Cloud at ${issuer} did not answer`);
|
|
180
|
+
}
|
|
181
|
+
};
|
|
182
|
+
const token = async (fields) => {
|
|
183
|
+
const headers = new Headers({
|
|
184
|
+
"content-type": "application/x-www-form-urlencoded",
|
|
185
|
+
accept: "application/json"
|
|
186
|
+
});
|
|
187
|
+
const form = new URLSearchParams(fields);
|
|
188
|
+
if (options.clientSecret === void 0) form.set("client_id", options.clientId);
|
|
189
|
+
else headers.set("authorization", `Basic ${btoa(`${formEncode(options.clientId)}:${formEncode(options.clientSecret)}`)}`);
|
|
190
|
+
const response = await send((await endpoints()).token, {
|
|
191
|
+
method: "POST",
|
|
192
|
+
headers,
|
|
193
|
+
body: form
|
|
194
|
+
});
|
|
195
|
+
const body = await readRecord(response);
|
|
196
|
+
if (body === null) throw new CloudAuthError("unexpected-response", "PermDock Cloud answered the token request with a body that is not a JSON object", { status: response.status });
|
|
197
|
+
const parsed = parseToken(body, secondsAt(options.now?.()));
|
|
198
|
+
if (!parsed.ok || !response.ok) {
|
|
199
|
+
const error = parsed.ok ? void 0 : parsed.error;
|
|
200
|
+
throw new CloudAuthError("token-refused", `PermDock Cloud refused the token request${error === void 0 ? "" : `: ${error}`}`, compact({
|
|
201
|
+
status: response.status,
|
|
202
|
+
error
|
|
203
|
+
}));
|
|
204
|
+
}
|
|
205
|
+
return parsed.credential;
|
|
206
|
+
};
|
|
207
|
+
return Object.freeze({
|
|
208
|
+
issuer,
|
|
209
|
+
async authorizeUrl(request = {}) {
|
|
210
|
+
const { authorization } = await endpoints();
|
|
211
|
+
const { verifier, challenge } = await pkce();
|
|
212
|
+
const state = randomToken(16);
|
|
213
|
+
const url = new URL(authorization);
|
|
214
|
+
url.searchParams.set("response_type", "code");
|
|
215
|
+
url.searchParams.set("client_id", options.clientId);
|
|
216
|
+
url.searchParams.set("redirect_uri", options.redirectUri);
|
|
217
|
+
url.searchParams.set("scope", (request.scopes ?? scopes).join(" "));
|
|
218
|
+
url.searchParams.set("state", state);
|
|
219
|
+
url.searchParams.set("code_challenge", challenge);
|
|
220
|
+
url.searchParams.set("code_challenge_method", "S256");
|
|
221
|
+
return Object.freeze({
|
|
222
|
+
url: url.href,
|
|
223
|
+
state,
|
|
224
|
+
codeVerifier: verifier
|
|
225
|
+
});
|
|
226
|
+
},
|
|
227
|
+
async exchangeCode(callback, pending) {
|
|
228
|
+
let params;
|
|
229
|
+
try {
|
|
230
|
+
params = new URL(callback).searchParams;
|
|
231
|
+
} catch {
|
|
232
|
+
throw new CloudAuthError("authorization-denied", "The callback is not a URL");
|
|
233
|
+
}
|
|
234
|
+
if (pending.state === "" || params.get("state") !== pending.state) throw new CloudAuthError("state-mismatch", "The callback does not echo the state of the authorization");
|
|
235
|
+
const iss = params.get("iss");
|
|
236
|
+
if (iss !== null && trimSlash(iss) !== issuer) throw new CloudAuthError("issuer-mismatch", `The callback names the issuer ${iss}, not ${issuer}`);
|
|
237
|
+
const error = params.get("error");
|
|
238
|
+
const code = params.get("code");
|
|
239
|
+
if (error !== null || code === null || code === "") throw new CloudAuthError("authorization-denied", `The authorization was not granted${error === null ? "" : `: ${error}`}`, error === null ? {} : { error });
|
|
240
|
+
return await token({
|
|
241
|
+
grant_type: "authorization_code",
|
|
242
|
+
code,
|
|
243
|
+
redirect_uri: options.redirectUri,
|
|
244
|
+
code_verifier: pending.codeVerifier
|
|
245
|
+
});
|
|
246
|
+
},
|
|
247
|
+
refresh(refreshToken) {
|
|
248
|
+
return token({
|
|
249
|
+
grant_type: "refresh_token",
|
|
250
|
+
refresh_token: refreshToken
|
|
251
|
+
});
|
|
252
|
+
},
|
|
253
|
+
async listProjects(accessToken, request = {}) {
|
|
254
|
+
const url = new URL(`${issuer}/v1/projects`);
|
|
255
|
+
if (request.cursor !== void 0) url.searchParams.set("cursor", request.cursor);
|
|
256
|
+
const response = await send(url, { headers: {
|
|
257
|
+
authorization: `Bearer ${accessToken}`,
|
|
258
|
+
accept: "application/json"
|
|
259
|
+
} });
|
|
260
|
+
if (!response.ok) throw refusal$1(response);
|
|
261
|
+
const body = await readRecord(response);
|
|
262
|
+
const raw = body?.["items"];
|
|
263
|
+
const items = Array.isArray(raw) ? raw.map(parseProject) : null;
|
|
264
|
+
const next = body?.["next"];
|
|
265
|
+
if (items === null || items.includes(null) || !optionalString(next)) throw new CloudAuthError("unexpected-response", "PermDock Cloud sent a project list that does not match cloud-api-v1.json", { status: response.status });
|
|
266
|
+
return Object.freeze(compact({
|
|
267
|
+
items: Object.freeze(items.filter((item) => item !== null)),
|
|
268
|
+
next
|
|
269
|
+
}));
|
|
270
|
+
}
|
|
271
|
+
});
|
|
272
|
+
}
|
|
273
|
+
//#endregion
|
|
11
274
|
//#region src/cloud/delivery.ts
|
|
12
275
|
function failed(cause, retryable, reason) {
|
|
13
276
|
return {
|
|
@@ -41,11 +304,11 @@ async function fromResponse(response) {
|
|
|
41
304
|
}
|
|
42
305
|
/**
|
|
43
306
|
* A `DeliveryTransport` for `channel` that hands each checked recipient to
|
|
44
|
-
* PermDock Cloud, which sends it from its hosted email, chat or webhook
|
|
45
|
-
*
|
|
46
|
-
*
|
|
47
|
-
*
|
|
48
|
-
*
|
|
307
|
+
* PermDock Cloud, which sends it from its hosted email, chat or webhook sender
|
|
308
|
+
* and reports back through `com.permdock.delivery.*` events. The router has
|
|
309
|
+
* already decided the recipient: the Cloud receives the target and the
|
|
310
|
+
* permission that let it through, never a decision to make. `Idempotency-Key`
|
|
311
|
+
* is the delivery's idempotency key, so a retry repeats it.
|
|
49
312
|
*/
|
|
50
313
|
function cloudDeliveryTransport(channel, options = {}) {
|
|
51
314
|
const connection = cloudConnection(options);
|
|
@@ -103,8 +366,8 @@ const REGISTERED = /* @__PURE__ */ new Set([
|
|
|
103
366
|
"jti"
|
|
104
367
|
]);
|
|
105
368
|
/**
|
|
106
|
-
* The Cloud's own outputs and access tokens; a client key that could mint
|
|
107
|
-
*
|
|
369
|
+
* The Cloud's own outputs and access tokens; a client key that could mint them
|
|
370
|
+
* could forge them, or forge the approver behind `PermDock-Approver`.
|
|
108
371
|
*/
|
|
109
372
|
const CLOUD_ISSUED = /* @__PURE__ */ new Set([
|
|
110
373
|
"vnd.permdock.policy+jwt",
|
|
@@ -126,11 +389,11 @@ function headerTyp(token) {
|
|
|
126
389
|
/**
|
|
127
390
|
* A `TokenSigner` backed by the environment's PermDock Cloud keys, typically
|
|
128
391
|
* KMS-held, for run tickets (`vnd.permdock.run+jwt`) and every other signed
|
|
129
|
-
* output an app issues. The Cloud signs only what the app sends: it sets
|
|
130
|
-
*
|
|
131
|
-
*
|
|
132
|
-
* outputs, so their `typ` values are refused here. Verify what it
|
|
133
|
-
* `joseTokenVerifier({ jwks: cloudEndpoints().jwks })`.
|
|
392
|
+
* output an app issues. The Cloud signs only what the app sends: it sets `iss`
|
|
393
|
+
* to the environment URL and adds no claim. Policy documents, snapshots,
|
|
394
|
+
* evidence exports, Security Event Tokens and `at+jwt` access tokens are the
|
|
395
|
+
* Cloud's own outputs, so their `typ` values are refused here. Verify what it
|
|
396
|
+
* signs with `joseTokenVerifier({ jwks: cloudEndpoints().jwks })`.
|
|
134
397
|
*/
|
|
135
398
|
function cloudSigner(options = {}) {
|
|
136
399
|
const connection = cloudConnection(options);
|
|
@@ -206,8 +469,8 @@ function eventsOf(body) {
|
|
|
206
469
|
return parseCloudEventBatch(parsed);
|
|
207
470
|
}
|
|
208
471
|
/**
|
|
209
|
-
* Verifies a PermDock Cloud webhook delivery: Standard Webhooks headers over
|
|
210
|
-
*
|
|
472
|
+
* Verifies a PermDock Cloud webhook delivery: Standard Webhooks headers over an
|
|
473
|
+
* `application/cloudevents-batch+json` body (or one
|
|
211
474
|
* `application/cloudevents+json` event). There is no unsigned mode, and it
|
|
212
475
|
* never throws.
|
|
213
476
|
*/
|
|
@@ -264,13 +527,12 @@ function refusal(cause) {
|
|
|
264
527
|
}
|
|
265
528
|
}
|
|
266
529
|
/**
|
|
267
|
-
* An `ApprovalWaiter` that PermDock Cloud wakes. Mount `webhook` on the
|
|
268
|
-
*
|
|
269
|
-
*
|
|
270
|
-
*
|
|
271
|
-
*
|
|
272
|
-
* `
|
|
273
|
-
* received.
|
|
530
|
+
* An `ApprovalWaiter` that PermDock Cloud wakes. Mount `webhook` on the route
|
|
531
|
+
* the environment's webhook connector posts to: when an approval is resolved,
|
|
532
|
+
* expires or is cancelled, the parked run for its token wakes. Waking never
|
|
533
|
+
* approves anything. The run decides again with the token, and only the app's
|
|
534
|
+
* `decide` and its approval store can grant. Without `waiter`, waits poll
|
|
535
|
+
* `store` as a fallback for a webhook another process received.
|
|
274
536
|
*/
|
|
275
537
|
function cloudApprovalWaiter(options) {
|
|
276
538
|
const inner = options.waiter ?? pollingApprovalWaiter({
|
|
@@ -294,4 +556,4 @@ function cloudApprovalWaiter(options) {
|
|
|
294
556
|
});
|
|
295
557
|
}
|
|
296
558
|
//#endregion
|
|
297
|
-
export { approvalTokensOf, cloud, cloudApprovalWaiter, cloudDeliveryTransport, cloudEndpoints, cloudSigner, parseCloudEvent, verifyWebhook };
|
|
559
|
+
export { CLOUD_BASE_URL, CloudAuthError, approvalTokensOf, cloud, cloudApprovalWaiter, cloudDeliveryTransport, cloudEndpoints, cloudOAuth, cloudSigner, isCloudAuthError, parseCloudEvent, resolveCloudEndpoints, verifyWebhook };
|