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
|
@@ -1,33 +1,35 @@
|
|
|
1
1
|
import { r as isRecord, t as compact } from "../compact-CAf557ZB.js";
|
|
2
|
-
import { n as freezeDeep } from "../freeze-
|
|
3
|
-
import { l as asApprover } from "../role-builder-
|
|
4
|
-
import { a as holder, i as flattenApprovers, r as approverLeaves } from "../approvers-
|
|
5
|
-
import { t as loadPrincipal } from "../principal-source-
|
|
6
|
-
import { a as isId, r as idList } from "../expiry-
|
|
7
|
-
import { c as listPermissions, n as findPermission, o as isPermission } from "../permission-registry-
|
|
8
|
-
import { i as dateAt, m as rfc3339, p as nowSeconds, u as isoAt } from "../time-
|
|
9
|
-
import { t as canonicalJson } from "../canonical-json-
|
|
10
|
-
import { r as sha256Digest } from "../sha256-
|
|
11
|
-
import { t as decideSupportSession } from "../support-session-
|
|
12
|
-
import {
|
|
13
|
-
import { o as flattenGrantee } from "../grantee-
|
|
14
|
-
import { t as
|
|
15
|
-
import { o as scopesReaching, t as getPermDock } from "../permdock-BrAscV28.js";
|
|
2
|
+
import { n as freezeDeep } from "../freeze-jjan0lCv.js";
|
|
3
|
+
import { l as asApprover } from "../role-builder-BK2-T6oD.js";
|
|
4
|
+
import { a as holder, i as flattenApprovers, r as approverLeaves } from "../approvers-B4r0N_Uz.js";
|
|
5
|
+
import { t as loadPrincipal } from "../principal-source-C6N60GtM.js";
|
|
6
|
+
import { a as isId, r as idList } from "../expiry-6XByK0dm.js";
|
|
7
|
+
import { c as listPermissions, n as findPermission, o as isPermission } from "../permission-registry-B8tYxPIt.js";
|
|
8
|
+
import { i as dateAt, m as rfc3339, p as nowSeconds, u as isoAt } from "../time-nR1JesoH.js";
|
|
9
|
+
import { t as canonicalJson } from "../canonical-json-DwilZ1iB.js";
|
|
10
|
+
import { r as sha256Digest } from "../sha256-C-4WXKIu.js";
|
|
11
|
+
import { t as decideSupportSession } from "../support-session-BsmPCbz8.js";
|
|
12
|
+
import { f as scopeList } from "../scopes-0Up_UA2t.js";
|
|
13
|
+
import { o as flattenGrantee } from "../grantee-Dke-9rd1.js";
|
|
14
|
+
import { a as delegatedScopeMap, s as scopesReaching, t as getPermDock } from "../permdock-L-_I_3zP.js";
|
|
16
15
|
import { t as anonymousSubject } from "../subject-BGoM5o8B.js";
|
|
17
|
-
import { i as linkPolicyViolation, n as capabilityOf, r as capabilitySubject } from "../capability-
|
|
18
|
-
import { r as credentialSubject, s as parseCredential } from "../credential-
|
|
16
|
+
import { i as linkPolicyViolation, n as capabilityOf, r as capabilitySubject } from "../capability-BqX94r07.js";
|
|
17
|
+
import { r as credentialSubject, s as parseCredential } from "../credential-CyyyvCsL.js";
|
|
19
18
|
import { t as AccessReviewError } from "../errors-BDUwg2qC.js";
|
|
20
|
-
import { t as policyRowConditionKeys } from "../row-conditions-
|
|
21
|
-
import { n as subscribersFor } from "../audience-
|
|
22
|
-
import { l as sqlIdent, s as quoteSqlLiteral } from "../sql-
|
|
23
|
-
import "../sources-
|
|
24
|
-
import { c as subjectFromSupabaseSession, t as callRpc } from "../postgrest-
|
|
25
|
-
import {
|
|
26
|
-
import { t as parseCatalog } from "../parse-
|
|
19
|
+
import { t as policyRowConditionKeys } from "../row-conditions-BAGHOmVq.js";
|
|
20
|
+
import { n as subscribersFor } from "../audience-BAkBDMqn.js";
|
|
21
|
+
import { l as sqlIdent, s as quoteSqlLiteral } from "../sql-0WjxIp9g.js";
|
|
22
|
+
import "../sources-CMAM-2A3.js";
|
|
23
|
+
import { c as subjectFromSupabaseSession, t as callRpc } from "../postgrest-D4nuPXIQ.js";
|
|
24
|
+
import { n as parseSupabaseManifest, t as hasTokenHook } from "../manifest-wg8WkkpD.js";
|
|
25
|
+
import { t as parseCatalog } from "../parse-1_ZheTW5.js";
|
|
27
26
|
import { AsyncResult, dbError } from "better-supabase";
|
|
28
27
|
//#region src/better-supabase/access-reviews.ts
|
|
29
28
|
const NOT_MEMBER = "ORGANIZATION_NOT_MEMBER";
|
|
30
|
-
/**
|
|
29
|
+
/**
|
|
30
|
+
* The `hint` better-supabase's block functions raise their code in, or the
|
|
31
|
+
* SQLSTATE.
|
|
32
|
+
*/
|
|
31
33
|
function errorCode(error) {
|
|
32
34
|
if ("hint" in error && typeof error.hint === "string" && error.hint !== "") return error.hint;
|
|
33
35
|
return "code" in error && typeof error.code === "string" ? error.code : void 0;
|
|
@@ -40,8 +42,8 @@ var RpcFailure = class extends Error {
|
|
|
40
42
|
}
|
|
41
43
|
};
|
|
42
44
|
/**
|
|
43
|
-
* Whether a member holding `role` at `scope` holds `key` through it. A role
|
|
44
|
-
*
|
|
45
|
+
* Whether a member holding `role` at `scope` holds `key` through it. A role the
|
|
46
|
+
* policy does not declare, such as a custom role, counts as holding it.
|
|
45
47
|
*/
|
|
46
48
|
function roleGrants(policy, role, scope, key) {
|
|
47
49
|
if (!policy.index.declaredRoles.has(role)) return true;
|
|
@@ -61,14 +63,13 @@ function invitationsOf(data) {
|
|
|
61
63
|
}
|
|
62
64
|
/**
|
|
63
65
|
* Applies the revoked items of an access review to better-supabase's
|
|
64
|
-
* organizations and invitations blocks, then marks each one applied. A
|
|
65
|
-
*
|
|
66
|
-
*
|
|
67
|
-
*
|
|
68
|
-
*
|
|
69
|
-
*
|
|
70
|
-
*
|
|
71
|
-
* unknown review.
|
|
66
|
+
* organizations and invitations blocks, then marks each one applied. A revoked
|
|
67
|
+
* member moves to the `demoteTo` role when the policy says that role lacks the
|
|
68
|
+
* permission, and is removed otherwise. With `email`, the tenant's open
|
|
69
|
+
* invitations to the member whose role grants the permission are revoked too. A
|
|
70
|
+
* member who is no longer in the organization counts as applied. Any other
|
|
71
|
+
* error leaves the item unapplied in `failed`, and one item's failure never
|
|
72
|
+
* stops the others. Throws `review-not-found` for an unknown review.
|
|
72
73
|
*/
|
|
73
74
|
function accessReviewApplier(options) {
|
|
74
75
|
const schema = options.schema ?? "better_supabase";
|
|
@@ -155,7 +156,10 @@ function accessReviewApplier(options) {
|
|
|
155
156
|
//#region src/better-supabase/api-keys.ts
|
|
156
157
|
const EPOCH = "1970-01-01T00:00:00.000Z";
|
|
157
158
|
const rfc3339Of = (instant) => isoAt(instant.epochMilliseconds);
|
|
158
|
-
/**
|
|
159
|
+
/**
|
|
160
|
+
* When a key stops verifying: its expiry, or the end of a rotated key's grace
|
|
161
|
+
* period.
|
|
162
|
+
*/
|
|
159
163
|
function endOf(key) {
|
|
160
164
|
const { expiresAt, revokedAt } = key;
|
|
161
165
|
if (revokedAt === void 0) return expiresAt;
|
|
@@ -167,9 +171,9 @@ function manifestServiceRoles(manifest) {
|
|
|
167
171
|
return manifest === void 0 ? void 0 : parseSupabaseManifest(manifest).rls.apiKeys?.serviceRoles;
|
|
168
172
|
}
|
|
169
173
|
/**
|
|
170
|
-
* A personal key as a `user` credential acting as its user, a tenant key as
|
|
171
|
-
*
|
|
172
|
-
*
|
|
174
|
+
* A personal key as a `user` credential acting as its user, a tenant key as a
|
|
175
|
+
* `service` credential holding `roles` in its tenant; `null` when `*` has no
|
|
176
|
+
* expansion, a tenant key has no roles, or the record is invalid.
|
|
173
177
|
*/
|
|
174
178
|
function keyCredential(key, roles, allPermissions) {
|
|
175
179
|
const scopes = key.scopes.includes("*") ? allPermissions?.map((permission) => permission.key) : key.scopes;
|
|
@@ -200,18 +204,18 @@ function keyCredential(key, roles, allPermissions) {
|
|
|
200
204
|
}) ?? null;
|
|
201
205
|
}
|
|
202
206
|
/**
|
|
203
|
-
* better-supabase's API keys as a `CredentialVerifier`, for
|
|
204
|
-
*
|
|
205
|
-
*
|
|
206
|
-
*
|
|
207
|
-
*
|
|
208
|
-
*
|
|
209
|
-
*
|
|
210
|
-
*
|
|
211
|
-
*
|
|
212
|
-
*
|
|
213
|
-
*
|
|
214
|
-
*
|
|
207
|
+
* better-supabase's API keys as a `CredentialVerifier`, for `subjectFromApiKey`
|
|
208
|
+
* from `permdock/server`, which reads PermDock's `pdk_<id>_<secret>` format:
|
|
209
|
+
* create the keys with `prefix: "pdk"`. The credential id is the key's
|
|
210
|
+
* `publicId`, the id in the token. A personal key is a `user` credential acting
|
|
211
|
+
* as its user (inside its tenant when the key is limited to one), a tenant key
|
|
212
|
+
* a `service` credential holding `serviceRoles` in its tenant, and the key's
|
|
213
|
+
* scopes are the credential's permissions. better-supabase records the use when
|
|
214
|
+
* it verifies, so there is no `touch`. A rotated key in its grace period
|
|
215
|
+
* verifies, and its credential expires when the grace period ends. An invalid,
|
|
216
|
+
* revoked, expired or rate-limited key, and a failed lookup, are `null`.
|
|
217
|
+
* `permdock/server` exports a different `apiKeyVerifier`, over the
|
|
218
|
+
* application's own key records.
|
|
215
219
|
*/
|
|
216
220
|
function apiKeyVerifier(options) {
|
|
217
221
|
const fallback = manifestServiceRoles(options.manifest);
|
|
@@ -239,10 +243,10 @@ function apiKeyVerifier(options) {
|
|
|
239
243
|
} });
|
|
240
244
|
}
|
|
241
245
|
/**
|
|
242
|
-
* The `claim` and `tenantClaim` options of better-supabase's
|
|
243
|
-
*
|
|
244
|
-
*
|
|
245
|
-
*
|
|
246
|
+
* The `claim` and `tenantClaim` options of better-supabase's `apiKeyClaims()`,
|
|
247
|
+
* from the manifest's `rls.apiKeys`, so a key's token carries the scopes
|
|
248
|
+
* ceiling, tenant and roles the `rls generate` helpers read. Throws when the
|
|
249
|
+
* manifest has no `rls.apiKeys`.
|
|
246
250
|
*/
|
|
247
251
|
function apiKeyClaimOptions(manifest) {
|
|
248
252
|
const rls = parseSupabaseManifest(manifest).rls;
|
|
@@ -301,8 +305,8 @@ function apiKeySubject(session, options) {
|
|
|
301
305
|
/**
|
|
302
306
|
* `subjectFromSupabaseSession` for better-supabase's `AuthSession`, reading
|
|
303
307
|
* `memberships` for the memberships and the entitlements module's `features`
|
|
304
|
-
* claim for `principal.plans` (`plans` names another claim). With `apiKeys`,
|
|
305
|
-
*
|
|
308
|
+
* claim for `principal.plans` (`plans` names another claim). With `apiKeys`, a
|
|
309
|
+
* verified `apiKey` session is the key's credential subject: a personal key
|
|
306
310
|
* acts as its user within the key's scopes, a tenant key as a `service`
|
|
307
311
|
* principal holding `serviceRoles`. Without `apiKeys`, and for `anon`,
|
|
308
312
|
* `service` and `invalid` sessions, the subject is anonymous.
|
|
@@ -331,10 +335,10 @@ function permissionFor(events, type) {
|
|
|
331
335
|
}
|
|
332
336
|
/**
|
|
333
337
|
* The per-subscriber check for better-supabase's webhooks-out, outbox and
|
|
334
|
-
* realtime fan-out: the subscribers whose `principal` `decideFor` grants
|
|
335
|
-
*
|
|
336
|
-
*
|
|
337
|
-
*
|
|
338
|
+
* realtime fan-out: the subscribers whose `principal` `decideFor` grants the
|
|
339
|
+
* event type's permission on its row, in the event's tenant, as the sender. An
|
|
340
|
+
* unmapped type, an event without a tenant or sender, a sender outside the
|
|
341
|
+
* tenant and a throw reach no one.
|
|
338
342
|
*/
|
|
339
343
|
function subscriberPolicy(options) {
|
|
340
344
|
return async (event, subscribers) => {
|
|
@@ -366,8 +370,8 @@ function subscriberPolicy(options) {
|
|
|
366
370
|
//#endregion
|
|
367
371
|
//#region src/better-supabase/support.ts
|
|
368
372
|
/**
|
|
369
|
-
* Bound to the admin, target, tenant, reason and mode, so the same start
|
|
370
|
-
*
|
|
373
|
+
* Bound to the admin, target, tenant, reason and mode, so the same start gets
|
|
374
|
+
* the same approval token each time.
|
|
371
375
|
*/
|
|
372
376
|
function requestId(input) {
|
|
373
377
|
return sha256Digest(canonicalJson({
|
|
@@ -384,8 +388,8 @@ function requestId(input) {
|
|
|
384
388
|
* verified claims become a PermDock subject, and the start is decided with
|
|
385
389
|
* `permdock.decideSupportSession` in the requested tenant. `true` only for
|
|
386
390
|
* `granted`: an `approval-required` start passes once `approved` returns a
|
|
387
|
-
* distinct approver for its token. `readOnly: false` needs `writable`. A
|
|
388
|
-
*
|
|
391
|
+
* distinct approver for its token. `readOnly: false` needs `writable`. A throw
|
|
392
|
+
* is `false`.
|
|
389
393
|
*/
|
|
390
394
|
function supportPolicy(options) {
|
|
391
395
|
return async (input) => {
|
|
@@ -440,12 +444,18 @@ function supportPolicy(options) {
|
|
|
440
444
|
//#region src/better-supabase/hooks.ts
|
|
441
445
|
/** better-supabase's claim that caps a context to the permission keys it lists. */
|
|
442
446
|
const PERMISSION_CAP_CLAIM = "bs_permission_cap";
|
|
443
|
-
/**
|
|
447
|
+
/**
|
|
448
|
+
* Whether `permdock` is granted `key` with no row; an unknown key and
|
|
449
|
+
* `approval-required` are `false`.
|
|
450
|
+
*/
|
|
444
451
|
function grants$1(permdock, key) {
|
|
445
452
|
const permission = findPermission(permdock.permissions, key);
|
|
446
453
|
return permission !== void 0 && permdock.decide(permission, void 0).outcome === "granted";
|
|
447
454
|
}
|
|
448
|
-
/**
|
|
455
|
+
/**
|
|
456
|
+
* A list matches when every entry does, `anyOf` when one does; other leaves
|
|
457
|
+
* match nobody, as in SQL.
|
|
458
|
+
*/
|
|
449
459
|
function matches(approvers, userId, permdock) {
|
|
450
460
|
const items = flattenApprovers(approvers);
|
|
451
461
|
return items.length > 0 && items.every((item) => {
|
|
@@ -466,15 +476,15 @@ function matches(approvers, userId, permdock) {
|
|
|
466
476
|
});
|
|
467
477
|
}
|
|
468
478
|
/**
|
|
469
|
-
* better-supabase's `AuthorizationHooks` (`createServer(betterSupabase,
|
|
470
|
-
*
|
|
471
|
-
*
|
|
472
|
-
*
|
|
473
|
-
*
|
|
474
|
-
* `
|
|
475
|
-
*
|
|
476
|
-
*
|
|
477
|
-
*
|
|
479
|
+
* better-supabase's `AuthorizationHooks` (`createServer(betterSupabase, {
|
|
480
|
+
* authorization })`), decided by `policy`. Every hook builds the principal's
|
|
481
|
+
* instance from the claims `claims` loads now, never from the request, and
|
|
482
|
+
* fails closed: a throw, an unknown key and `approval-required` refuse.
|
|
483
|
+
* `automation` and `delegation` are always set; `identities`, `delivery`,
|
|
484
|
+
* `approverOf`, `support` and `tickets` only with the options they read.
|
|
485
|
+
* `delegation.permissions` maps each scope to the keys whose `.scope` it is,
|
|
486
|
+
* was renamed from, or that a policy `oauthScopes` entry covers, and reads no
|
|
487
|
+
* `authorization_details`.
|
|
478
488
|
*/
|
|
479
489
|
function authorizationHooks(options) {
|
|
480
490
|
const { policy } = options;
|
|
@@ -595,16 +605,19 @@ function authorizationHooks(options) {
|
|
|
595
605
|
//#region src/better-supabase/approvers.ts
|
|
596
606
|
/** `rls.approvals`' approver check, executable by `authenticated`. */
|
|
597
607
|
const IS_APPROVER = "permdock_is_approver";
|
|
598
|
-
/**
|
|
608
|
+
/**
|
|
609
|
+
* The resource a cover's `resources` names for a request kind: `job` for
|
|
610
|
+
* `job.update`, else the kind.
|
|
611
|
+
*/
|
|
599
612
|
function resourceOf(kind) {
|
|
600
613
|
const dot = kind.indexOf(".");
|
|
601
614
|
return dot <= 0 ? kind : kind.slice(0, dot);
|
|
602
615
|
}
|
|
603
616
|
/**
|
|
604
617
|
* better-supabase's `isApprover` template: one `case` over `{kind}` whose
|
|
605
|
-
* branches call `permdock_is_approver` with the kind's approvers as JSON.
|
|
606
|
-
*
|
|
607
|
-
*
|
|
618
|
+
* branches call `permdock_is_approver` with the kind's approvers as JSON. A
|
|
619
|
+
* kind with no branch is `false`. Only `user`, `holder` and `anyOf` approvers
|
|
620
|
+
* match in SQL; other leaves are reported and match nobody.
|
|
608
621
|
*/
|
|
609
622
|
function isApproverTemplate(input) {
|
|
610
623
|
const problems = [];
|
|
@@ -729,6 +742,14 @@ const listedName = (entry) => entry.listedAs ?? entry.helper;
|
|
|
729
742
|
* functions; better-supabase fills it for the tenant scope only.
|
|
730
743
|
*/
|
|
731
744
|
const HOLDERS_OF = "permitted_{scope}_users";
|
|
745
|
+
/**
|
|
746
|
+
* better-supabase calls `teamIdsOf` from RLS policies as `authenticated`, so it
|
|
747
|
+
* fills from the caller-bound `member_<scope>_ids_of`, never from the `_for`
|
|
748
|
+
* form only `supabase_auth_admin` may execute.
|
|
749
|
+
*/
|
|
750
|
+
const TEAM_IDS_OF = "member_{scope}_ids_of";
|
|
751
|
+
/** The scope names better-supabase reads as its teams (doctor BS417). */
|
|
752
|
+
const TEAM_SCOPE = /^teams?$/u;
|
|
732
753
|
const ACTOR_MAY_WRITE = "permdock_actor_may_write";
|
|
733
754
|
const OPTIONAL = [
|
|
734
755
|
"idsWithFor",
|
|
@@ -741,8 +762,8 @@ const OPTIONAL = [
|
|
|
741
762
|
];
|
|
742
763
|
/**
|
|
743
764
|
* Postgres aliases of the id types better-supabase reads (`uuid`, `text`,
|
|
744
|
-
* `bigint`, `integer`), matching its `moduleIdType` from
|
|
745
|
-
*
|
|
765
|
+
* `bigint`, `integer`), matching its `moduleIdType` from `better-supabase/sql`,
|
|
766
|
+
* which this runtime entry does not import.
|
|
746
767
|
*/
|
|
747
768
|
const ID_TYPES = {
|
|
748
769
|
uuid: "uuid",
|
|
@@ -766,7 +787,10 @@ function tenantScopeOf(manifest, explicit) {
|
|
|
766
787
|
}
|
|
767
788
|
const roots = manifest.rls.scopes.filter((scope) => scope.within === void 0);
|
|
768
789
|
const [root] = roots;
|
|
769
|
-
if (root === void 0 || roots.length > 1)
|
|
790
|
+
if (root === void 0 || roots.length > 1) {
|
|
791
|
+
const listed = roots.map((scope) => scope.name).join(", ");
|
|
792
|
+
throw new TypeError(`PermDock: the manifest has ${roots.length} root scopes (${listed === "" ? "none" : listed}), so it can't tell which scope tenants are. Pass { scope } with one of ${names.join(", ")}.`);
|
|
793
|
+
}
|
|
770
794
|
return root.name;
|
|
771
795
|
}
|
|
772
796
|
function covers(membership, scope) {
|
|
@@ -857,9 +881,9 @@ function grantsCommandOf(schemas) {
|
|
|
857
881
|
}
|
|
858
882
|
/**
|
|
859
883
|
* better-supabase's `permitted` template. An instance of a scope (`{resource}`
|
|
860
|
-
* names the scope) is checked against that scope's ids; any other resource
|
|
861
|
-
*
|
|
862
|
-
*
|
|
884
|
+
* names the scope) is checked against that scope's ids; any other resource at
|
|
885
|
+
* the tenant, and with a catalog only for a key without row conditions. Without
|
|
886
|
+
* a catalog better-supabase refuses every key anyway.
|
|
863
887
|
*/
|
|
864
888
|
function permittedTemplate(schema, scopes, tenantScope, catalog) {
|
|
865
889
|
const idsOf = (scope) => `select ids::text from ${schema}.${sqlIdent(`permitted_${scope}_ids_by_permission`)}({permission}) as ids`;
|
|
@@ -885,9 +909,9 @@ const EFFECTS = {
|
|
|
885
909
|
};
|
|
886
910
|
/**
|
|
887
911
|
* The catalog's `defineOperations` entries as better-supabase operations. A
|
|
888
|
-
* name with a `.` is used as written (`workflow.node.http`); any other is
|
|
889
|
-
*
|
|
890
|
-
* `
|
|
912
|
+
* name with a `.` is used as written (`workflow.node.http`); any other is the
|
|
913
|
+
* tool `ai.tool.<name>` and `mcp.tool.<name>`. `critical` risk is `high`, and
|
|
914
|
+
* `send` and `spend` effects are `external`.
|
|
891
915
|
*/
|
|
892
916
|
function operationsOf(catalog) {
|
|
893
917
|
const operations = {};
|
|
@@ -908,33 +932,25 @@ function operationsOf(catalog) {
|
|
|
908
932
|
return operations;
|
|
909
933
|
}
|
|
910
934
|
/**
|
|
911
|
-
* better-supabase's `delegation.scopes
|
|
912
|
-
*
|
|
913
|
-
* it reaches, sorted by code point. A key the catalog does not list is
|
|
914
|
-
* dropped, so a stale `oauthScopes` entry grants nothing.
|
|
935
|
+
* better-supabase's `delegation.scopes`, the same map `rls.tokenScopes`
|
|
936
|
+
* compiles.
|
|
915
937
|
*/
|
|
916
938
|
function delegatedScopes(catalog) {
|
|
917
|
-
|
|
918
|
-
const known = /* @__PURE__ */ new Set();
|
|
919
|
-
for (const permission of catalog?.permissions ?? []) {
|
|
920
|
-
known.add(permission.key);
|
|
921
|
-
(delegated[permission.scope] ??= /* @__PURE__ */ new Set()).add(permission.key);
|
|
922
|
-
}
|
|
923
|
-
for (const entry of catalog?.oauthScopes ?? []) for (const key of entry.permissions) if (known.has(key)) (delegated[entry.scope] ??= /* @__PURE__ */ new Set()).add(key);
|
|
924
|
-
return Object.fromEntries(Object.keys(delegated).toSorted(byCodePoint).map((scope) => [scope, [...delegated[scope] ?? []].toSorted(byCodePoint)]));
|
|
939
|
+
return delegatedScopeMap(catalog?.permissions ?? [], catalog?.oauthScopes);
|
|
925
940
|
}
|
|
926
941
|
/**
|
|
927
942
|
* better-supabase's `authorization` config value, built from PermDock's
|
|
928
943
|
* manifest and catalog: the scopes, the `rls generate` helpers as SQL
|
|
929
|
-
* templates, the membership tables, suspension rows, the token hook and
|
|
930
|
-
*
|
|
931
|
-
*
|
|
932
|
-
*
|
|
933
|
-
* `approvers` and `permdock_is_approver`, and otherwise `canApprove` only
|
|
934
|
-
*
|
|
944
|
+
* templates, the membership tables, suspension rows, the token hook and every
|
|
945
|
+
* catalog key with `sqlComplete` set from its `rowConditions`. A `_for`
|
|
946
|
+
* template and `permissionsFor` are set only when the manifest lists their
|
|
947
|
+
* helper, which `rls.mode: 'database'` writes; `isApprover` only with
|
|
948
|
+
* `approvers` and `permdock_is_approver`, and otherwise `canApprove` only with
|
|
949
|
+
* `approver`. `holdersOf` (`permitted_<tenant scope>_users`) and
|
|
935
950
|
* `actorMayWrite` (`permdock_actor_may_write()`) are set when the manifest
|
|
936
|
-
* lists their helper
|
|
937
|
-
*
|
|
951
|
+
* lists their helper, and so is `teamIdsOf` (`member_<scope>_ids_of({user})`)
|
|
952
|
+
* for a scope named `team` or `teams`. Throws when the manifest or catalog is
|
|
953
|
+
* invalid, or when the tenant scope is ambiguous.
|
|
938
954
|
*/
|
|
939
955
|
function authorizationProvider(options) {
|
|
940
956
|
const manifest = parseSupabaseManifest(options.manifest);
|
|
@@ -1020,6 +1036,17 @@ function authorizationProvider(options) {
|
|
|
1020
1036
|
role: "postgres"
|
|
1021
1037
|
});
|
|
1022
1038
|
}
|
|
1039
|
+
let teamIdsOf;
|
|
1040
|
+
const teamHelper = scopeNames.filter((scope) => TEAM_SCOPE.test(scope)).map((scope) => helpers.get(TEAM_IDS_OF.replace("{scope}", scope))).find((helper) => helper !== void 0);
|
|
1041
|
+
if (teamHelper !== void 0) {
|
|
1042
|
+
const fn = `${schema}.${sqlIdent(teamHelper.name)}`;
|
|
1043
|
+
teamIdsOf = `${fn}({user})`;
|
|
1044
|
+
requires.push({
|
|
1045
|
+
function: fn,
|
|
1046
|
+
args: argTypes(teamHelper.args),
|
|
1047
|
+
role: "authenticated"
|
|
1048
|
+
});
|
|
1049
|
+
}
|
|
1023
1050
|
let actorMayWrite;
|
|
1024
1051
|
if (helpers.has(ACTOR_MAY_WRITE)) {
|
|
1025
1052
|
const fn = `${schema}.${sqlIdent(ACTOR_MAY_WRITE)}`;
|
|
@@ -1035,6 +1062,7 @@ function authorizationProvider(options) {
|
|
|
1035
1062
|
idsWith: `${schema}.${TEMPLATES.idsWith.sql}`,
|
|
1036
1063
|
isPlatform: `${schema}.${TEMPLATES.isPlatform.sql}`,
|
|
1037
1064
|
...holdersOf === void 0 ? {} : { holdersOf },
|
|
1065
|
+
...teamIdsOf === void 0 ? {} : { teamIdsOf },
|
|
1038
1066
|
...actorMayWrite === void 0 ? {} : { actorMayWrite },
|
|
1039
1067
|
...isApprover === void 0 ? {} : { isApprover },
|
|
1040
1068
|
...permitted === void 0 ? {} : { permitted }
|
|
@@ -1070,7 +1098,7 @@ function authorizationProvider(options) {
|
|
|
1070
1098
|
...Object.keys(operations).length > 0 ? { operations } : {},
|
|
1071
1099
|
...Object.keys(delegated).length > 0 ? { delegation: { scopes: delegated } } : {},
|
|
1072
1100
|
decidingColumns: manifest.decidingColumns,
|
|
1073
|
-
tokenHook: tokenHookOf(manifest),
|
|
1101
|
+
...hasTokenHook(manifest) ? { tokenHook: tokenHookOf(manifest) } : {},
|
|
1074
1102
|
...problems.length > 0 ? { problems } : {}
|
|
1075
1103
|
});
|
|
1076
1104
|
}
|
|
@@ -1106,7 +1134,10 @@ function decideWith(permdock, request) {
|
|
|
1106
1134
|
if (!isPermission(action)) return denied("Unknown permission.");
|
|
1107
1135
|
return outcomeOf(permdock.decide(action, request.resource.properties), action.key);
|
|
1108
1136
|
}
|
|
1109
|
-
/**
|
|
1137
|
+
/**
|
|
1138
|
+
* The verified claims better-supabase passes in `subject.properties.claims`,
|
|
1139
|
+
* for a user or a delegated agent.
|
|
1140
|
+
*/
|
|
1110
1141
|
function claimsOf(request) {
|
|
1111
1142
|
const { subject } = request;
|
|
1112
1143
|
if (subject.type !== "user" && subject.type !== "agent") return void 0;
|
|
@@ -1115,11 +1146,11 @@ function claimsOf(request) {
|
|
|
1115
1146
|
}
|
|
1116
1147
|
/**
|
|
1117
1148
|
* better-supabase's `authorizer` for PermDock: every resource, action, route
|
|
1118
|
-
* guard and MCP tool that declares a `permission` is decided with `decide`.
|
|
1119
|
-
*
|
|
1120
|
-
*
|
|
1121
|
-
*
|
|
1122
|
-
*
|
|
1149
|
+
* guard and MCP tool that declares a `permission` is decided with `decide`. The
|
|
1150
|
+
* subject is mapped from the verified claims with `subjectFromBetterSupabase`;
|
|
1151
|
+
* the request's `context.tenant` selects the active tenant only among the
|
|
1152
|
+
* memberships the claims hold. A caller without claims is anonymous, and a
|
|
1153
|
+
* throw denies.
|
|
1123
1154
|
*/
|
|
1124
1155
|
function authorizer(options) {
|
|
1125
1156
|
const { operations } = options;
|
|
@@ -1176,7 +1207,10 @@ function authorizer(options) {
|
|
|
1176
1207
|
}
|
|
1177
1208
|
//#endregion
|
|
1178
1209
|
//#region src/better-supabase/policies.ts
|
|
1179
|
-
/**
|
|
1210
|
+
/**
|
|
1211
|
+
* PermDock splits a key with row conditions into `key#1`, `key#2`, ... in the
|
|
1212
|
+
* policies it generates.
|
|
1213
|
+
*/
|
|
1180
1214
|
const SPLIT_KEY = /#\d+$/u;
|
|
1181
1215
|
function checkedKey(where, permission, facts, scope) {
|
|
1182
1216
|
const key = permission.key;
|
|
@@ -1228,11 +1262,10 @@ function target(options) {
|
|
|
1228
1262
|
};
|
|
1229
1263
|
}
|
|
1230
1264
|
/**
|
|
1231
|
-
* A better-supabase bucket `policy` that checks PermDock permissions with
|
|
1232
|
-
*
|
|
1233
|
-
*
|
|
1234
|
-
*
|
|
1235
|
-
* `scope`, throws.
|
|
1265
|
+
* A better-supabase bucket `policy` that checks PermDock permissions with the
|
|
1266
|
+
* `rls generate` helpers at `scope`. The helpers check role and scope only, so
|
|
1267
|
+
* a permission with row conditions (`rowConditions: true` in the catalog, or a
|
|
1268
|
+
* conditioned grant in `policy`), or one not granted at `scope`, throws.
|
|
1236
1269
|
*/
|
|
1237
1270
|
function bucketPolicy(access, options) {
|
|
1238
1271
|
const { facts, sql } = target(options);
|
|
@@ -1266,10 +1299,10 @@ function topicPolicy(access, options) {
|
|
|
1266
1299
|
/**
|
|
1267
1300
|
* `provider` with every `getToken`, `startAuthorization`,
|
|
1268
1301
|
* `completeAuthorization` and `revoke` decided by PermDock first, on the
|
|
1269
|
-
* `CredentialRef` as the row. Anything but `granted` is a `forbidden`
|
|
1270
|
-
*
|
|
1271
|
-
*
|
|
1272
|
-
*
|
|
1302
|
+
* `CredentialRef` as the row. Anything but `granted` is a `forbidden` error
|
|
1303
|
+
* with hint `PERMDOCK_DENIED`, and a failed check is one too. `capabilities`
|
|
1304
|
+
* and `verifyInbound` (a third party's request, with no user) pass through.
|
|
1305
|
+
* Build it per request, with that request's PermDock.
|
|
1273
1306
|
*/
|
|
1274
1307
|
function credentialGuard(provider, options) {
|
|
1275
1308
|
const allowed = async (permission, ref) => {
|
|
@@ -1303,10 +1336,10 @@ const refused = (reason) => ({
|
|
|
1303
1336
|
});
|
|
1304
1337
|
/**
|
|
1305
1338
|
* The `authorize` and `visible` hooks of better-supabase's `createMcp`, for
|
|
1306
|
-
* tools whose `meta` is a PermDock permission. A tool without a permission
|
|
1307
|
-
*
|
|
1308
|
-
* approval-required call is refused, because `createMcp`
|
|
1309
|
-
*
|
|
1339
|
+
* tools whose `meta` is a PermDock permission. A tool without a permission is
|
|
1340
|
+
* hidden and refused. `authorize` grants only a `granted` decision: an
|
|
1341
|
+
* approval-required call is refused, because `createMcp` has no approval flow.
|
|
1342
|
+
* A throw anywhere refuses.
|
|
1310
1343
|
*/
|
|
1311
1344
|
function toolPolicy(options) {
|
|
1312
1345
|
return Object.freeze({
|
|
@@ -1339,12 +1372,46 @@ function toolPolicy(options) {
|
|
|
1339
1372
|
});
|
|
1340
1373
|
}
|
|
1341
1374
|
//#endregion
|
|
1375
|
+
//#region src/better-supabase/memberships.ts
|
|
1376
|
+
function isLiveRow(row, userId) {
|
|
1377
|
+
return isRecord(row) && row["user_id"] === userId && typeof row["organization_id"] === "string" && row["organization_id"] !== "" && typeof row["role"] === "string" && row["role"] !== "" && (row["disabled_at"] === void 0 || row["disabled_at"] === null);
|
|
1378
|
+
}
|
|
1379
|
+
/**
|
|
1380
|
+
* The principal `userId` is in the better-supabase organizations block: one
|
|
1381
|
+
* membership per organization, keyed on `organization_id`, holding the role of
|
|
1382
|
+
* each of the user's rows. Rows of another user, disabled rows and malformed
|
|
1383
|
+
* rows are dropped, so a user with none holds no membership.
|
|
1384
|
+
*/
|
|
1385
|
+
function principalFromMemberships(userId, rows, options = {}) {
|
|
1386
|
+
const scope = options.scope ?? "tenant";
|
|
1387
|
+
const roles = /* @__PURE__ */ new Map();
|
|
1388
|
+
for (const row of rows) {
|
|
1389
|
+
if (!isLiveRow(row, userId)) continue;
|
|
1390
|
+
const held = roles.get(row.organization_id) ?? [];
|
|
1391
|
+
if (!held.includes(row.role)) held.push(row.role);
|
|
1392
|
+
roles.set(row.organization_id, held);
|
|
1393
|
+
}
|
|
1394
|
+
const memberships = [...roles].map(([id, names]) => ({
|
|
1395
|
+
scope,
|
|
1396
|
+
id,
|
|
1397
|
+
roles: names
|
|
1398
|
+
}));
|
|
1399
|
+
return freezeDeep(options.tenant === void 0 ? {
|
|
1400
|
+
id: userId,
|
|
1401
|
+
memberships
|
|
1402
|
+
} : {
|
|
1403
|
+
id: userId,
|
|
1404
|
+
memberships,
|
|
1405
|
+
tenant: options.tenant
|
|
1406
|
+
});
|
|
1407
|
+
}
|
|
1408
|
+
//#endregion
|
|
1342
1409
|
//#region src/better-supabase/principals.ts
|
|
1343
1410
|
/**
|
|
1344
1411
|
* A `PrincipalSource` over better-supabase: `principal(id)` maps the claims
|
|
1345
1412
|
* `claims` loads with `subjectFromBetterSupabase`, and `principalByIdentity`
|
|
1346
|
-
* follows `identities` to a user or a contact. Claims for another user, a
|
|
1347
|
-
*
|
|
1413
|
+
* follows `identities` to a user or a contact. Claims for another user, a link
|
|
1414
|
+
* to a non-contact principal and a missing link are `null`.
|
|
1348
1415
|
*/
|
|
1349
1416
|
function principalSource(options) {
|
|
1350
1417
|
const principal = async (id, lookup = {}) => {
|
|
@@ -1369,26 +1436,95 @@ function principalSource(options) {
|
|
|
1369
1436
|
});
|
|
1370
1437
|
}
|
|
1371
1438
|
//#endregion
|
|
1439
|
+
//#region src/better-supabase/role-order.ts
|
|
1440
|
+
/**
|
|
1441
|
+
* The catalog's role keys highest first, for better-supabase's
|
|
1442
|
+
* `blocks.sso.options.roleOrder`: a role that `assigns` another comes before
|
|
1443
|
+
* it, and roles the `assigns` lists do not order keep catalog order. Roles that
|
|
1444
|
+
* assign each other stay together in catalog order, at the first one's place.
|
|
1445
|
+
*/
|
|
1446
|
+
function roleOrderFromCatalog(catalog, options = {}) {
|
|
1447
|
+
const roles = (catalog.roles ?? []).filter((role) => role.key !== options.owner && (options.scope === void 0 || role.on === options.scope));
|
|
1448
|
+
const keys = roles.map((role) => role.key);
|
|
1449
|
+
const assigns = new Map(roles.map((role) => [role.key, (role.assigns ?? []).filter((target) => target !== role.key && keys.includes(target))]));
|
|
1450
|
+
const reach = new Map(keys.map((key) => [key, reachable(key, assigns)]));
|
|
1451
|
+
const group = new Map(keys.map((key) => [key, keys.find((other) => other === key || reach.get(key)?.has(other) === true && reach.get(other)?.has(key) === true) ?? key]));
|
|
1452
|
+
const remaining = new Set(keys);
|
|
1453
|
+
const order = [];
|
|
1454
|
+
while (remaining.size > 0) {
|
|
1455
|
+
const ready = [...remaining].find((key) => {
|
|
1456
|
+
const own = group.get(key);
|
|
1457
|
+
return [...remaining].every((by) => group.get(by) === own || ![...remaining].some((target) => group.get(target) === own && (assigns.get(by) ?? []).includes(target)));
|
|
1458
|
+
});
|
|
1459
|
+
const own = group.get(ready ?? [...remaining][0] ?? "");
|
|
1460
|
+
for (const key of keys) if (remaining.has(key) && group.get(key) === own) {
|
|
1461
|
+
order.push(key);
|
|
1462
|
+
remaining.delete(key);
|
|
1463
|
+
}
|
|
1464
|
+
}
|
|
1465
|
+
return Object.freeze(order);
|
|
1466
|
+
}
|
|
1467
|
+
function reachable(from, assigns) {
|
|
1468
|
+
const seen = /* @__PURE__ */ new Set();
|
|
1469
|
+
const stack = [...assigns.get(from) ?? []];
|
|
1470
|
+
while (stack.length > 0) {
|
|
1471
|
+
const key = stack.pop();
|
|
1472
|
+
if (key !== void 0 && !seen.has(key)) {
|
|
1473
|
+
seen.add(key);
|
|
1474
|
+
stack.push(...assigns.get(key) ?? []);
|
|
1475
|
+
}
|
|
1476
|
+
}
|
|
1477
|
+
return seen;
|
|
1478
|
+
}
|
|
1479
|
+
//#endregion
|
|
1372
1480
|
//#region src/better-supabase/share-links.ts
|
|
1373
1481
|
const DEFAULT_TTL = 300;
|
|
1374
1482
|
const MAX_TTL = 3600;
|
|
1375
1483
|
function ownEntry(record, key) {
|
|
1376
1484
|
return Object.hasOwn(record, key) ? record[key] : void 0;
|
|
1377
1485
|
}
|
|
1486
|
+
function rowSubject(row) {
|
|
1487
|
+
if (!Object.hasOwn(row, "subject")) {
|
|
1488
|
+
const type = row["subjectType"];
|
|
1489
|
+
const id = row["subjectId"];
|
|
1490
|
+
return isId(type) && isId(id) ? {
|
|
1491
|
+
type,
|
|
1492
|
+
id
|
|
1493
|
+
} : void 0;
|
|
1494
|
+
}
|
|
1495
|
+
const subject = row["subject"];
|
|
1496
|
+
if (typeof subject !== "object" || subject === null) return void 0;
|
|
1497
|
+
const ref = Object.fromEntries(Object.entries(subject));
|
|
1498
|
+
const type = ref["type"];
|
|
1499
|
+
const id = ref["id"];
|
|
1500
|
+
return isId(type) && isId(id) ? {
|
|
1501
|
+
type,
|
|
1502
|
+
id
|
|
1503
|
+
} : void 0;
|
|
1504
|
+
}
|
|
1505
|
+
/** The row and its subject, or `undefined` for a malformed row. */
|
|
1506
|
+
function parseRow(value) {
|
|
1507
|
+
if (!isRow(value)) return void 0;
|
|
1508
|
+
const subject = rowSubject(Object.fromEntries(Object.entries(value)));
|
|
1509
|
+
return subject === void 0 ? void 0 : {
|
|
1510
|
+
row: value,
|
|
1511
|
+
subject
|
|
1512
|
+
};
|
|
1513
|
+
}
|
|
1378
1514
|
function isRow(value) {
|
|
1379
1515
|
if (typeof value !== "object" || value === null) return false;
|
|
1380
1516
|
const row = Object.fromEntries(Object.entries(value));
|
|
1381
1517
|
const expiresAt = row["expiresAt"];
|
|
1382
|
-
return isId(row["id"]) && isId(row["organizationId"]) &&
|
|
1518
|
+
return isId(row["id"]) && isId(row["organizationId"]) && rowSubject(row) !== void 0 && typeof row["role"] === "string" && (row["versionId"] === void 0 || typeof row["versionId"] === "string") && (expiresAt === void 0 || typeof expiresAt === "object" && expiresAt !== null && "epochMilliseconds" in expiresAt && typeof expiresAt.epochMilliseconds === "number" && Number.isFinite(expiresAt.epochMilliseconds));
|
|
1383
1519
|
}
|
|
1384
1520
|
/**
|
|
1385
|
-
* Resolves a better-supabase share-link token into the `link` subject it
|
|
1386
|
-
*
|
|
1387
|
-
*
|
|
1388
|
-
*
|
|
1389
|
-
*
|
|
1390
|
-
*
|
|
1391
|
-
*
|
|
1521
|
+
* Resolves a better-supabase share-link token into the `link` subject it acts
|
|
1522
|
+
* as, for `exchangeCapability` and `--capabilities` RLS. The row is read on
|
|
1523
|
+
* every call, so a revoked or expired link stops resolving at once. An unknown
|
|
1524
|
+
* token, subject type or role, a malformed row, a broken link policy, a
|
|
1525
|
+
* `resolve` error and a throw are the anonymous subject. So is a link pinned to
|
|
1526
|
+
* a version: a capability grants the subject's current rows, so a pinned link
|
|
1527
|
+
* reads through `versions.getShared(token)` instead.
|
|
1392
1528
|
*/
|
|
1393
1529
|
async function subjectFromShareLink(token, options) {
|
|
1394
1530
|
if (token === void 0 || token === null || token.length === 0) return anonymousSubject();
|
|
@@ -1402,17 +1538,19 @@ async function subjectFromShareLink(token, options) {
|
|
|
1402
1538
|
return anonymousSubject();
|
|
1403
1539
|
};
|
|
1404
1540
|
let row;
|
|
1541
|
+
let subject;
|
|
1405
1542
|
try {
|
|
1406
1543
|
const resolved = await options.shareLinks.resolve(token);
|
|
1407
1544
|
if (!resolved.ok) return deny("source-threw", "resolve-failed");
|
|
1408
1545
|
if (resolved.data === null) return deny("invalid-token", "share-link-unknown");
|
|
1409
|
-
|
|
1410
|
-
|
|
1546
|
+
const parsed = parseRow(resolved.data);
|
|
1547
|
+
if (parsed === void 0) return deny("schema", "share-link-malformed");
|
|
1548
|
+
({row, subject} = parsed);
|
|
1411
1549
|
} catch {
|
|
1412
1550
|
return deny("source-threw");
|
|
1413
1551
|
}
|
|
1414
1552
|
if (row.versionId !== void 0) return deny("invalid-token", "share-link-pinned");
|
|
1415
|
-
const target = ownEntry(options.links,
|
|
1553
|
+
const target = ownEntry(options.links, subject.type);
|
|
1416
1554
|
if (target === void 0) return deny("invalid-token", "subject-type-unknown");
|
|
1417
1555
|
const roles = idList(ownEntry(target.roles, row.role));
|
|
1418
1556
|
if (roles === void 0 || roles.length === 0) return deny("unknown-role");
|
|
@@ -1427,7 +1565,7 @@ async function subjectFromShareLink(token, options) {
|
|
|
1427
1565
|
id: row.id,
|
|
1428
1566
|
on: {
|
|
1429
1567
|
resource: target.resource,
|
|
1430
|
-
id:
|
|
1568
|
+
id: subject.id
|
|
1431
1569
|
},
|
|
1432
1570
|
roles,
|
|
1433
1571
|
expiresAt
|
|
@@ -1445,7 +1583,10 @@ async function subjectFromShareLink(token, options) {
|
|
|
1445
1583
|
}
|
|
1446
1584
|
//#endregion
|
|
1447
1585
|
//#region src/better-supabase/workflow.ts
|
|
1448
|
-
/**
|
|
1586
|
+
/**
|
|
1587
|
+
* Whether `permdock` is granted the permission `key` (a catalog key or scope)
|
|
1588
|
+
* with no row.
|
|
1589
|
+
*/
|
|
1449
1590
|
function grants(permdock, key) {
|
|
1450
1591
|
try {
|
|
1451
1592
|
const permission = findPermission(permdock.permissions, key);
|
|
@@ -1456,9 +1597,9 @@ function grants(permdock, key) {
|
|
|
1456
1597
|
}
|
|
1457
1598
|
/**
|
|
1458
1599
|
* The `can` option of better-supabase's `authorizeHook`, for the caller's
|
|
1459
|
-
* `permdock`: `true` only when the caller is a member of the hook's tenant
|
|
1460
|
-
*
|
|
1461
|
-
*
|
|
1600
|
+
* `permdock`: `true` only when the caller is a member of the hook's tenant and
|
|
1601
|
+
* `decide` grants the permission its `hookMetadata` names there. An unknown
|
|
1602
|
+
* key, `approval-required` and a throw are `false`.
|
|
1462
1603
|
*/
|
|
1463
1604
|
function hookCan(permdock) {
|
|
1464
1605
|
return (tenant, key) => {
|
|
@@ -1470,10 +1611,10 @@ function hookCan(permdock) {
|
|
|
1470
1611
|
};
|
|
1471
1612
|
}
|
|
1472
1613
|
/**
|
|
1473
|
-
* The `can` option of better-supabase's `protectWebHandler`: `undefined`
|
|
1474
|
-
*
|
|
1475
|
-
*
|
|
1476
|
-
*
|
|
1614
|
+
* The `can` option of better-supabase's `protectWebHandler`: `undefined` (401)
|
|
1615
|
+
* when the request has no signed-in principal or `getPermDock` throws,
|
|
1616
|
+
* otherwise whether `decide` grants the permission in the request's active
|
|
1617
|
+
* tenant. An unknown key and `approval-required` are `false` (403).
|
|
1477
1618
|
*/
|
|
1478
1619
|
function handlerCan(source) {
|
|
1479
1620
|
return async (request, key) => {
|
|
@@ -1488,4 +1629,4 @@ function handlerCan(source) {
|
|
|
1488
1629
|
};
|
|
1489
1630
|
}
|
|
1490
1631
|
//#endregion
|
|
1491
|
-
export { accessReviewApplier, apiKeyClaimOptions, apiKeyVerifier, authorizationHooks, authorizationProvider, authorizer, bucketPolicy, credentialGuard, handlerCan, hookCan, principalSource, subjectFromBetterSupabase, subjectFromShareLink, subscriberPolicy, supportPolicy, toolPolicy, topicPolicy };
|
|
1632
|
+
export { accessReviewApplier, apiKeyClaimOptions, apiKeyVerifier, authorizationHooks, authorizationProvider, authorizer, bucketPolicy, credentialGuard, handlerCan, hookCan, principalFromMemberships, principalSource, roleOrderFromCatalog, subjectFromBetterSupabase, subjectFromShareLink, subscriberPolicy, supportPolicy, toolPolicy, topicPolicy };
|