permdock 0.7.0 → 0.9.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 +1 -3
- package/dist/a2a/index.d.ts +7 -7
- package/dist/a2a/index.js +8 -8
- package/dist/action-result-BcudBQOF.d.ts +19 -0
- package/dist/{adapter-context-CRhqyzCk.js → adapter-context-CIQpQxbE.js} +8 -2
- package/dist/{adoption-scan-D-feE7BE.js → adoption-scan-Ch07MdxN.js} +5 -5
- package/dist/agent/index.d.ts +2 -2
- package/dist/agent/index.js +1 -1
- package/dist/ai-sdk/index.d.ts +19 -13
- package/dist/ai-sdk/index.js +6 -6
- 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-K0faOLFp.d.ts → approval-prompt-3BqWczTt.d.ts} +13 -11
- package/dist/{approval-prompt-Dg5LeAcT.js → approval-prompt-B8hQY69x.js} +5 -6
- package/dist/approvals/index.d.ts +4 -4
- package/dist/approvals/index.js +6 -6
- package/dist/{approvals-CMRfsbBh.js → approvals-DnIBTuXE.js} +66 -42
- package/dist/{approvers-CqPOLD-o.js → approvers-B4r0N_Uz.js} +8 -2
- package/dist/{arazzo-ClrF3PVb.js → arazzo-BpS7LnV0.js} +2 -2
- package/dist/{arazzo-rdeJ8n1J.js → arazzo-CmQaGPkM.js} +6 -6
- package/dist/{args-CC3OwyHW.js → args-0FrVs5EH.js} +14 -7
- package/dist/astro/index.d.ts +30 -12
- package/dist/astro/index.js +2 -2
- package/dist/{audience-BrMs8c4o.js → audience-DTjR8xet.js} +8 -8
- package/dist/{auth-CscUX8Sy.js → auth--yPyZNgr.js} +19 -7
- package/dist/authzen/index.d.ts +34 -28
- package/dist/authzen/index.js +23 -20
- package/dist/{automation-DOtAFWdy.d.ts → automation-C6Jg75xq.d.ts} +42 -32
- package/dist/{automation-ySsxp_Yp.js → automation-x3KEUusw.js} +22 -21
- package/dist/better-auth/index.d.ts +2 -2
- package/dist/better-auth/index.js +13 -7
- package/dist/better-supabase/index.d.ts +357 -227
- package/dist/better-supabase/index.js +219 -140
- package/dist/{bind-D1nO6fiC.js → bind-BNQA9JK9.js} +26 -10
- package/dist/{bind-JDuvxjuW.d.ts → bind-YYjvfpB9.d.ts} +32 -12
- 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-DxE7czo9.js → build-instance-BWXqwQYU.js} +3 -3
- package/dist/{capability-L7NnfhiE.js → capability-BqX94r07.js} +31 -25
- package/dist/{capability-D4UC9TTW.d.ts → capability-Di9tiUvi.d.ts} +41 -29
- package/dist/{casbin-BHijLuHY.js → casbin-B7_yS-oo.js} +2 -2
- package/dist/{casbin-BW9pS47J.js → casbin-bHyIxTNQ.js} +16 -8
- package/dist/{casl-CmJlgziS.js → casl-C4OINZHI.js} +2 -2
- package/dist/{casl-UbI8v-Wq.js → casl-CHHoCldP.js} +19 -10
- package/dist/catalog/index.d.ts +51 -30
- package/dist/catalog/index.js +18 -15
- package/dist/{catalog-D69WhFii.js → catalog-CGlSwU6j.js} +20 -19
- package/dist/catalog-D3oS2GH3.js +1 -0
- package/dist/{catalog-BaMQfQ6Y.js → catalog-amPDr0JQ.js} +3 -3
- package/dist/{catalog-doc-CV9s6B1S.js → catalog-doc-DjMKzJp9.js} +28 -14
- package/dist/{catalog-fingerprint-C144oW4M.js → catalog-fingerprint-e6aCWosn.js} +18 -14
- package/dist/catalog-operations-DeHTrJSV.js +60 -0
- package/dist/{challenge-nGWma08S.js → challenge-DImNcR7B.js} +48 -27
- 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-BC_0mPIq.js → checks-CGkP3Z7A.js} +4 -1
- 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 +84 -52
- package/dist/cloud/index.js +53 -39
- package/dist/{cloud-CO8pYtwr.js → cloud-3kWfjnYy.js} +4 -5
- package/dist/{codemod-BP6n8N9L.js → codemod-Bv5i-Mzo.js} +523 -201
- package/dist/{codemod-i4N2BhDc.js → codemod-D9Aiii1r.js} +3 -4
- package/dist/{collect-DNm3oKOk.js → collect-B80GYEot.js} +4 -5
- package/dist/collect-D-eroIfV.js +1 -0
- package/dist/{collect-BaWeMjwV.js → collect-WCl8cJQV.js} +26 -63
- 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-COM2VKuN.d.ts → compile-BEklRUYo.d.ts} +36 -12
- package/dist/{compile-BAEO5bOk.js → compile-EzEMB-7v.js} +77 -33
- package/dist/{completion-BNdVf7X2.js → completion-_bc0OUQ-.js} +17 -8
- package/dist/config-BwPBfN0t.js +108 -0
- package/dist/{config-DGZzMV1B.js → config-D5XrLWpk.js} +2 -2
- package/dist/{config-report-Cm7UITNA.js → config-report-BmWIskD7.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-_VCSsdtD.js → connector-schema-CYLQNMYq.js} +3 -2
- package/dist/{context--uM9V3Ui.js → context-BnIzxTNE.js} +4 -3
- package/dist/convex/index.d.ts +13 -7
- package/dist/convex/index.js +9 -6
- package/dist/{core-CQkE8Esr.d.ts → core-CFepFiDP.d.ts} +49 -22
- package/dist/{core-B5-w6Kw9.js → core-DzVINFbU.js} +26 -20
- package/dist/{create-Cb86Z8Im.js → create-6EwRQlig.js} +10 -7
- package/dist/{create-DJrlhEp9.js → create-BLPKnJKa.js} +35 -25
- package/dist/{create-UTnUVETj.d.ts → create-BPUopdfL.d.ts} +70 -37
- package/dist/{create-QHuuPw3q.d.ts → create-BamXmeob.d.ts} +37 -29
- package/dist/{create-B2-CQqCI.d.ts → create-DBvUsgzK.d.ts} +49 -28
- package/dist/{credential-CIM7wHwA.js → credential-CyyyvCsL.js} +41 -38
- package/dist/{credentials-BpuTwd7a.js → credentials-CdDxp7jN.js} +6 -6
- package/dist/{deciding-columns-DRo2QM6E.js → deciding-columns-NB4wcyBf.js} +2 -2
- package/dist/{delegation-C5rOdTp5.js → delegation-CDB6_keF.js} +31 -22
- package/dist/delivery/index.d.ts +4 -4
- package/dist/delivery/index.js +5 -5
- package/dist/{delivery-rwOKLWRm.js → delivery-BupfvJIV.js} +34 -22
- package/dist/{delivery-event-xX4obB8F.js → delivery-event-JioK5YbS.js} +6 -6
- package/dist/denied-text-DHldhVUv.d.ts +22 -0
- package/dist/{describe-DZlnEtLy.js → describe-Bb4hGK5d.js} +5 -5
- package/dist/{describe-O0SwYIK8.d.ts → describe-BbFPBSms.d.ts} +5 -5
- package/dist/{device-BARQ8eYG.js → device-BwbJNmb2.js} +11 -8
- package/dist/{diff-Btr1c1Ow.js → diff-BwR1JdP2.js} +2 -2
- package/dist/{diff-DzT-xD13.js → diff-CQegtBAo.js} +22 -13
- package/dist/{digest-B3kc_PgQ.d.ts → digest-8Yx2CchM.d.ts} +3 -3
- package/dist/{doctor-BU1szn63.js → doctor-ClRVAtXQ.js} +287 -135
- package/dist/{doctor-BoK_y0KO.js → doctor-LPMYjSqO.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-B_Qg9D3e.d.ts → errors-BIM4MFsJ.d.ts} +22 -6
- package/dist/{errors-BWXBMaKK.d.ts → errors-CHwoRRpB.d.ts} +4 -1
- package/dist/{errors-DpP_U6Bf.js → errors-Vpu6rKHl.js} +13 -10
- package/dist/{evaluate-B_oqFbWC.js → evaluate-BAmf_AQd.js} +153 -82
- package/dist/{evaluations-BCddEOfO.d.ts → evaluations-DOWuBpWv.d.ts} +11 -5
- package/dist/{evaluations-DReoiVBw.js → evaluations-IBceAeKT.js} +40 -19
- 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-CuhyYwC1.d.ts → fetch-adapter-BIbBAtPZ.d.ts} +9 -6
- package/dist/{fetch-adapter-De-u6vhJ.js → fetch-adapter-dPTgJVHd.js} +14 -11
- package/dist/fields-D0vUI6dq.js +498 -0
- package/dist/{files-acUbNwWt.js → files-B3AA05f1.js} +8 -5
- package/dist/{files-D_JIzUrP.js → files-BSjrtIHw.js} +11 -4
- package/dist/{fixtures-BTMW6zgU.js → fixtures-A1_sp_tR.js} +15 -6
- package/dist/{flags-aaeRAdiD.js → flags-DXjoTVbS.js} +2 -2
- package/dist/{freeze-CrU8nQeX.js → freeze-jjan0lCv.js} +4 -1
- package/dist/{from-snapshot-Bz469dIh.js → from-snapshot-DCakWRsr.js} +18 -15
- package/dist/gen-BFfzZSLH.js +58 -0
- package/dist/gen-BtfFWGbz.js +827 -0
- package/dist/{generate-3FNO5P5Q.js → generate-CRVV5V7l.js} +14 -8
- package/dist/generate-CezbCaTI.js +275 -0
- package/dist/{grantee-BrRANrpT.js → grantee-Dke-9rd1.js} +4 -4
- package/dist/{grantee-conditions-C6P1Tvol.js → grantee-conditions-BrYPe-w0.js} +12 -12
- package/dist/{grantee-match-0RtHWQDx.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-DY3vXuGs.js → helpers-DJicaG6f.js} +40 -28
- package/dist/hono/index.d.ts +16 -10
- package/dist/hono/index.js +5 -5
- package/dist/{hosted-XBgU6RGT.js → hosted-D0IzESu_.js} +42 -21
- package/dist/{hosted-BmjzxQhp.d.ts → hosted-DVxlLZMe.d.ts} +33 -21
- package/dist/{http-ujKm0JXE.js → http-DH94eh6f.js} +4 -4
- package/dist/{http-BBoKefeS.js → http-DKLXrFGk.js} +13 -7
- package/dist/{http-Ca3Sr5x1.js → http-DOL33cO0.js} +11 -8
- package/dist/{import-DB2EG_iy.js → import-ACkOrv6g.js} +6 -6
- package/dist/{import-Bz0GefWg.js → import-CST57XLp.js} +64 -51
- package/dist/{index-CMiPH2Tv.d.ts → index-BinlXeU-.d.ts} +64 -37
- package/dist/{index-BSfRl0hZ.d.ts → index-CV-7DWeD.d.ts} +64 -52
- package/dist/{index-BE8y3moU.d.ts → index-DJwEgYzA.d.ts} +127 -82
- package/dist/{index-DH9DUDEM.d.ts → index-Dj2qF9VC.d.ts} +54 -30
- package/dist/{index-BTkwrK7v.d.ts → index-vYjMrXyK.d.ts} +336 -173
- package/dist/{index-DLwcuCN_.d.ts → index-ymept53A.d.ts} +51 -30
- package/dist/index.d.ts +22 -22
- package/dist/index.js +34 -34
- package/dist/{init-B-4t1NzC.js → init-BjuFDYT1.js} +10 -10
- package/dist/{init-5TXNji88.js → init-txYTuW9u.js} +5 -5
- package/dist/{instance-options-CU0YQCLH.d.ts → instance-options-CoHn-0e8.d.ts} +4 -4
- package/dist/{instance-snapshot-CjcwnEiV.js → instance-snapshot-DuWf1cT3.js} +86 -61
- 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 +57 -27
- package/dist/jwt/index.js +24 -21
- package/dist/{kernel-DVExUwkp.js → kernel-qv4cr9w8.js} +32 -23
- 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-DxroEzH1.js → load-DjSU5KXO.js} +6 -6
- package/dist/load-Dm0pSYH3.js +1 -0
- package/dist/{login-ClSJh5t5.js → login-CfImTJGb.js} +4 -4
- package/dist/{login-WC9HPJpU.js → login-CgfCTO3F.js} +16 -9
- package/dist/{manifest-Dv6q4i5s.js → manifest-B2QPh19C.js} +49 -38
- package/dist/{manifest-BVhExYhw.d.ts → manifest-CzzWtnAb.d.ts} +126 -31
- package/dist/{manifest-schema-Cv492Qev.js → manifest-schema-2r37XRhD.js} +44 -3
- package/dist/{manifest-B79YuF2T.js → manifest-wg8WkkpD.js} +6 -6
- package/dist/{map-claims-etGIS_Dv.js → map-claims-C-nv08_n.js} +16 -9
- package/dist/{map-error-BQGyDm_M.js → map-error-pasIGqMT.js} +7 -7
- package/dist/{markers-C6joDI3o.js → markers-BeHZ4x9Q.js} +20 -5
- package/dist/mcp/index.d.ts +114 -61
- package/dist/mcp/index.js +70 -40
- package/dist/{migrate-Dodel0IJ.js → migrate-B7oP_sQU.js} +35 -17
- 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 +79 -26
- package/dist/next/index.js +121 -10
- 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 +51 -30
- package/dist/openapi/index.js +2 -2
- package/dist/{openapi-ztVaux6j.js → openapi-BGeuunWC.js} +23 -14
- package/dist/{openapi-DMocl1bh.js → openapi-BIpw3Mb7.js} +4 -5
- package/dist/{openapi-Ddb4628T.js → openapi-BOsx0xn9.js} +33 -18
- package/dist/{operation-findings-kRcEp8lE.js → operation-findings-CXtFzlKJ.js} +3 -3
- package/dist/{operations-BNLes61x.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-DgSDLrta.js → output-DV5dwOTs.js} +9 -5
- package/dist/output-files-BHOIlrfD.js +1 -0
- package/dist/{output-files-CCMdcFWb.js → output-files-BIQ_9pIs.js} +29 -17
- package/dist/ownership-DA5YdYTm.js +1059 -0
- package/dist/{parse-Ddhz2xf4.js → parse-1_ZheTW5.js} +16 -13
- package/dist/parse-local-manifest-CCmbhnxP.d.ts +10 -0
- package/dist/{parse-local-manifest-T1Q8X3A2.js → parse-local-manifest-DEiCF4ah.js} +19 -7
- 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 +20 -13
- package/dist/{peer-DOzzMfZL.js → peer-C9LvBCcb.js} +1 -1
- package/dist/{peer-12Q5I_RH.js → peer-Q0fuZ6hx.js} +9 -3
- package/dist/{permdock-BfWEeMqk.js → permdock-BvjivVb9.js} +200 -140
- package/dist/{permdock-Dco6dyCK.d.ts → permdock-CprAPN3w.d.ts} +260 -129
- package/dist/{permission-registry-DpPtSKNZ.js → permission-registry-B8tYxPIt.js} +23 -10
- package/dist/{permission-types-DhNEmoRG.d.ts → permission-types-CAY-GU7e.d.ts} +127 -41
- package/dist/{permissions-CoqCOfJ3.d.ts → permissions-Bx6UI8n1.d.ts} +6 -3
- package/dist/{permissions-CyH2MV_B.js → permissions-CVXmRILq.js} +3 -3
- package/dist/{permissions-DArULThq.js → permissions-CYcHj_w7.js} +8 -5
- package/dist/pg-DQTqRrou.js +60 -0
- package/dist/{pins-8ILTftC9.js → pins-nqarl3oE.js} +4 -1
- package/dist/{pkce-5h8NgMQJ.js → pkce-CnmmYqUZ.js} +1 -1
- package/dist/{policy-B7dg_yzu.d.ts → policy-BycVKnXv.d.ts} +5 -5
- package/dist/{policy-DaJy4nK4.js → policy-CLQ8__GF.js} +43 -23
- package/dist/{policy-from-catalog-DFWYkNdu.js → policy-from-catalog-CU3An8uP.js} +28 -25
- package/dist/{policy-module-CTlwMvLI.js → policy-module-xym9fnSq.js} +12 -6
- package/dist/{policy-types-B-F-qAZk.d.ts → policy-types-DGIO_gxq.d.ts} +782 -357
- package/dist/{postgres-store-BL9M_CA1.js → postgres-store-DcyrPS-r.js} +43 -16
- package/dist/{postgrest-r5faDIzD.js → postgrest-5Dr3W64L.js} +84 -86
- package/dist/{postgrest-CYacM_u7.d.ts → postgrest-D5nUGm-c.d.ts} +55 -35
- package/dist/powersync-B701tvhE.js +1 -0
- package/dist/{powersync-13odBwiM.js → powersync-Bg8u-JcR.js} +3 -3
- package/dist/{powersync-53ryOZip.js → powersync-CJrT1DSc.js} +127 -69
- package/dist/preset/index.d.ts +38 -28
- package/dist/preset/index.js +1 -1
- package/dist/{preset-CHTbd-DQ.js → preset-BjLzeFpp.js} +56 -32
- 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-DwtVemER.js → prompt-BYc6drYW.js} +4 -1
- package/dist/protected-action-D8x73IGm.d.ts +58 -0
- package/dist/protected-action-DUYqb-Ma.js +80 -0
- package/dist/{protected-DXE3cQYg.js → protected-action-QEA8arRB.js} +48 -14
- package/dist/{provider-BQsTYYy0.js → provider-C55OGXJ7.js} +5 -4
- package/dist/{provider-Csk-THAn.d.ts → provider-DfLeek9O.d.ts} +1 -1
- package/dist/{provider-store-IgqQipCO.js → provider-store-CaTv00tr.js} +13 -9
- package/dist/{pull-CN5OLxrF.js → pull-2nJr0qg_.js} +12 -11
- package/dist/pull-C3EEGzSw.js +1 -0
- package/dist/{push-tVdG8dUL.js → push-Bn-lMEmI.js} +19 -13
- package/dist/{pushed-policy-CmYeSQqq.js → pushed-policy-CDuOL2de.js} +10 -7
- package/dist/{pushed-policy-BbcY9r_4.d.ts → pushed-policy-CryQheKq.d.ts} +12 -6
- 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 +94 -55
- package/dist/react-native/index.js +200 -61
- package/dist/{refs-CNJBiTFo.js → refs-C8BKxc_e.js} +2 -2
- 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-DCDD_ZfL.d.ts → replay-Bs9Df2fQ.d.ts} +1 -1
- package/dist/{request-context-BykKLmyE.js → request-context-Duzdf0cd.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-ConCSj1y.js +201 -0
- package/dist/{resource-relations-D_jw0BFx.js → resource-relations-8-pCScBO.js} +18 -9
- package/dist/{retire-Wj6dkyDE.js → retire-B2xffQgY.js} +15 -6
- package/dist/{revocations-R07lFBnX.d.ts → revocations-BaUXHM1N.d.ts} +6 -3
- package/dist/{rls-Ck_PocSp.js → rls-Ba9wN0SP.js} +13 -6
- package/dist/{rls-CxBZb4rZ.js → rls-Cx0dtsB7.js} +310 -128
- package/dist/{role-builder-C1VJzvcr.js → role-builder-BK2-T6oD.js} +41 -20
- package/dist/{row-conditions-h2HythXQ.js → row-conditions-BAGHOmVq.js} +4 -3
- package/dist/{rpc-Bk1bE-ch.js → rpc-vHIwyXCp.js} +8 -5
- package/dist/run-Ck22anC2.js +1 -0
- package/dist/{run-uLD2aWuO.js → run-PbRlXTfh.js} +26 -23
- package/dist/{run-ticket-BpNi7BCi.d.ts → run-ticket-B2o2Kxz8.d.ts} +29 -14
- package/dist/{run-ticket-B5d_63Ma.js → run-ticket-Dv7aF7Dk.js} +9 -9
- package/dist/{runtime-Vif3_-zf.js → runtime-BGnrOkVH.js} +5 -2
- package/dist/{saas-Az_Kz-4D.js → saas-DK4V-3Is.js} +42 -29
- package/dist/{scan-DSljDE1Y.js → scan-CRTj6fke.js} +1 -1
- package/dist/{schema-B4v0Qrac.js → schema-BOJjqlWL.js} +3 -2
- package/dist/{schema-gIcCx7zM.js → schema-BTsE1WRT.js} +8 -4
- package/dist/scim/index.d.ts +2 -2
- package/dist/scim/index.js +2 -2
- package/dist/{scim-C7JYhySg.js → scim-D8YupzX1.js} +2 -2
- package/dist/{scim-YNieBO1U.js → scim-jJBJ7g1Z.js} +33 -15
- package/dist/{scopes-BHsc-wp-.js → scopes-0Up_UA2t.js} +41 -23
- package/dist/server/index.d.ts +11 -11
- package/dist/server/index.js +12 -12
- package/dist/{server-Bnga6I50.js → server-3cVlTLde.js} +31 -31
- package/dist/{server-types-C4gZUEZy.d.ts → server-types-CyRN0-Cd.d.ts} +88 -46
- package/dist/{sha256-D9ihqmvd.js → sha256-C-4WXKIu.js} +4 -3
- package/dist/{shared-fMKOv8hP.js → shared-Afctg7B0.js} +65 -32
- package/dist/{shared-C8LjUdVU.js → shared-l0oGGetg.js} +9 -6
- package/dist/{signals-D3NcTKUS.js → signals-B1vHR3fN.js} +2 -2
- package/dist/{sink-Cp_Eot9W.d.ts → sink-B5zoUW_O.d.ts} +44 -20
- package/dist/{sink-BEZSlMS_.js → sink-D9_vh372.js} +32 -21
- package/dist/{skills-g_3BS9NC.js → skills-C9uKfSF5.js} +3 -3
- package/dist/{skills-Dcjw9_1C.js → skills-CQQcuGBi.js} +12 -8
- package/dist/{snapshot-CbGmYiJx.js → snapshot-CXlzi69u.js} +21 -18
- package/dist/{snapshot-cache-Pahd3IYJ.d.ts → snapshot-cache-BjAWkchD.d.ts} +21 -12
- package/dist/{snapshot-cache-DT2Kx1F8.js → snapshot-cache-Bx_4xC_6.js} +14 -11
- package/dist/solid/index.d.ts +55 -16
- 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-B-zYB4GS.js → sources-CMAM-2A3.js} +46 -27
- package/dist/{sources-DEEuGb8S.d.ts → sources-CWG32C0G.d.ts} +126 -53
- package/dist/{sql-B96movIM.js → sql-0WjxIp9g.js} +28 -7
- package/dist/{sql-CDEPCA0g.d.ts → sql-B80DFdpG.d.ts} +2 -2
- package/dist/{src-DLFrtrrC.js → src-C_pi2Rnh.js} +292 -101
- package/dist/ssf/index.d.ts +3 -3
- package/dist/ssf/index.js +47 -35
- package/dist/{standard-webhooks-DgFFD-Ga.js → standard-webhooks-D67a3nzk.js} +5 -5
- package/dist/{standard-webhooks-B_qRg0ws.d.ts → standard-webhooks-DOYEuOLx.d.ts} +7 -7
- package/dist/{store-DSP9oGvh.js → store-RNFvaJJv.js} +32 -26
- package/dist/{store-options-B_poyYvg.js → store-options-Dil3lraY.js} +105 -15
- package/dist/stores-DZJvxFIZ.d.ts +59 -0
- package/dist/{stores-BqEuHC05.js → stores-DxZWDXCs.js} +42 -5
- package/dist/{stream-2Vwhl7Er.d.ts → stream-9y9qw51m.d.ts} +4 -3
- package/dist/{stream-CvdUS9V1.js → stream-CDvF0sJm.js} +5 -5
- package/dist/{style-Ds1gNm77.js → style-DblOtSga.js} +1 -1
- package/dist/{style-Cqo7-73x.js → style-Ds11Hmk4.js} +2 -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 -38
- package/dist/supabase/index.js +5 -5
- package/dist/supabase/middleware.d.ts +19 -13
- package/dist/supabase/middleware.js +7 -7
- package/dist/{supabase--0aJdLEd.js → supabase-DnMMg5Fn.js} +79 -35
- package/dist/{supabase-Bqp7iIY2.js → supabase-SBs3MYUE.js} +3 -3
- package/dist/supabase-hook-C0FyEACZ.js +1 -0
- package/dist/{supabase-hook-Dg0SrQWR.js → supabase-hook-CrgU06WH.js} +175 -196
- package/dist/{supautils-MESd81bF.js → supautils-ByezN3b8.js} +385 -219
- package/dist/{support-session-Cna49-3f.js → support-session-BsmPCbz8.js} +21 -21
- 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-Z2LpxsGa.js → tables-BqrxBCir.js} +641 -1104
- 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-CmeBQ6Nv.js → tenancy-5d1zVBvK.js} +25 -19
- package/dist/terminal/index.d.ts +23 -14
- package/dist/terminal/index.js +17 -20
- package/dist/testing/core.d.ts +1 -1
- package/dist/testing/core.js +1 -1
- package/dist/testing/fixtures/index.d.ts +8 -5
- package/dist/testing/fixtures/index.js +78 -17
- package/dist/testing/index.d.ts +225 -141
- package/dist/testing/index.js +352 -234
- 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-DhITNCnD.js → text-diff-BtfSmdUo.js} +2 -2
- package/dist/{thenable-yD7SabqG.js → thenable-BNSM1U2R.js} +12 -3
- package/dist/{time-DkWjdL98.js → time-nR1JesoH.js} +32 -8
- package/dist/{token-2qYDvXz2.js → token-DC9EQiet.js} +14 -12
- package/dist/{tool-refusal-reAhIzdl.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-c7Xo_2Cu.d.ts +50 -0
- package/dist/{types-CfiKC5aN.d.ts → types-B2efzoSX.d.ts} +14 -11
- package/dist/{types-CIeZcG8v.d.ts → types-B6ExllNo.d.ts} +2 -2
- package/dist/{types-DBHftjgS.d.ts → types-BB-zWDcR.d.ts} +45 -33
- package/dist/{types-BfVmNJO5.d.ts → types-BMVDHvI0.d.ts} +128 -50
- package/dist/{types-DXmwu78Z.d.ts → types-CEinc15V.d.ts} +31 -14
- package/dist/{types-g7Oy6Zg4.d.ts → types-CN0LsqbK.d.ts} +47 -24
- package/dist/{types-CeIscIKp.d.ts → types-CWBsAwqn.d.ts} +23 -12
- package/dist/{types-DqzsnlSA.js → types-CcUXciSj.js} +17 -5
- package/dist/{types-BWZybqs9.d.ts → types-CzOeVvcC.d.ts} +384 -203
- package/dist/{types-DC44-hqb.d.ts → types-DLvhVm1r.d.ts} +59 -32
- package/dist/{types-D3A19w4A.d.ts → types-DlelvQk4.d.ts} +22 -13
- package/dist/{types-cTos-H7p.d.ts → types-DsHGPtkR.d.ts} +68 -32
- package/dist/{types-BXMYB7BY.d.ts → types-ZzRGoViD.d.ts} +77 -24
- package/dist/{types-CQVEQawv.d.ts → types-rCRV4Ge-.d.ts} +24 -14
- package/dist/types-tQB2CEnY.d.ts +262 -0
- package/dist/unplugin/index.d.ts +1 -1
- package/dist/unplugin/index.js +2 -2
- package/dist/usage-0hjZPIRX.js +1 -0
- package/dist/{usage-Bybmck7f.js → usage-B9EtHWLa.js} +50 -26
- package/dist/{usage-CDaLXCfL.js → usage-CBzgwfIs.js} +2 -2
- package/dist/{validation-error-ZfUHbKvf.js → validation-error-CYg2kJEw.js} +4 -1
- package/dist/{validation-error-CQpoquwj.d.ts → validation-error-uvp-kyfO.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-pe8rL_Qw.js → verify-DlUcTDBz.js} +148 -487
- package/dist/version-DMQ0dnN5.js +48 -0
- package/dist/version-DizhmD72.js +1 -0
- package/dist/{views-BB8E9dTP.js → views-CD8wuL4Z.js} +19 -6
- package/dist/{vocabulary-Bg3eeT2H.d.ts → vocabulary-DEJ5j4mR.d.ts} +7 -4
- package/dist/vue/index.d.ts +71 -22
- package/dist/vue/index.js +50 -13
- package/dist/{waiter-DwEyouan.d.ts → waiter-CqUKX6CY.d.ts} +13 -10
- package/dist/{waiter-BGUtGYoU.js → waiter-aBLM63_f.js} +1 -1
- package/dist/{watch-C-4VmFlL.js → watch-BFDKqmUa.js} +8 -8
- package/dist/watch-ClLuO2TL.js +1 -0
- package/dist/webmcp/index.d.ts +11 -11
- package/dist/webmcp/index.js +8 -5
- package/dist/{where-scope-wq2coopv.js → where-scope-DlCdCM_8.js} +24 -18
- package/dist/{who-can-BwNsI_Js.js → who-can-BoDJm0Nc.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-CiSc_KCq.js → wrap-B2wziJI_.js} +4 -4
- package/dist/{wrap-B6R0cMRL.d.ts → wrap-DxXB54Wu.d.ts} +8 -5
- package/package.json +8 -8
- package/schemas/catalog-v1.json +3 -0
- package/schemas/supabase-manifest-v1.json +33 -1
- package/skills/permdock-credentials/references/tokens-keys-links.md +8 -6
- package/skills/permdock-data/references/queries-and-rls.md +2 -1
- package/skills/permdock-tenancy/references/ownership-and-custom-roles.md +2 -2
- package/skills/permdock-wire/references/adapters.md +16 -23
- package/dist/catalog-BCCjSAdH.js +0 -1
- package/dist/collect-k_Dulxr5.js +0 -1
- package/dist/config-CoQHDrDi.js +0 -166
- package/dist/denied-text-D4qkEtFz.d.ts +0 -19
- package/dist/fields-ClcQLrVc.js +0 -238
- package/dist/generate-CNU1pIOo.js +0 -171
- package/dist/headers-BIjfMaoC.js +0 -8
- package/dist/headers-CIbDTUTK.d.ts +0 -7
- package/dist/load-DrMHXzgN.js +0 -1
- package/dist/output-files-DPAY7-GX.js +0 -1
- package/dist/package-root-Dk_ETdkp.js +0 -31
- package/dist/parse-local-manifest-e4mdwAKd.d.ts +0 -10
- package/dist/policies-B2lZIurj.js +0 -295
- package/dist/powersync-CExtTLyA.js +0 -1
- package/dist/problem-details-Tcfmj3bV.d.ts +0 -7
- package/dist/protected-BwZYL1X_.d.ts +0 -39
- package/dist/pull-Cty6Ovyu.js +0 -1
- package/dist/run-Bz7DXGEv.js +0 -1
- package/dist/stores-BAZwSYZA.d.ts +0 -31
- package/dist/supabase-hook-DJxC4PoP.js +0 -1
- package/dist/types-CKV71kKh.d.ts +0 -172
- package/dist/usage-y-kBNdqs.js +0 -1
- package/dist/version-CEbQ5UeM.js +0 -18
- package/dist/version-DXkYUISx.js +0 -1
- package/dist/watch-Bd9mx3rd.js +0 -1
|
@@ -1,32 +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-
|
|
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
9
|
import { t as canonicalJson } from "../canonical-json-DwilZ1iB.js";
|
|
10
|
-
import { r as sha256Digest } from "../sha256-
|
|
11
|
-
import { t as decideSupportSession } from "../support-session-
|
|
12
|
-
import { f as scopeList } from "../scopes-
|
|
13
|
-
import { o as flattenGrantee } from "../grantee-
|
|
14
|
-
import { a as delegatedScopeMap, s as scopesReaching, t as getPermDock } from "../permdock-
|
|
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-BvjivVb9.js";
|
|
15
15
|
import { t as anonymousSubject } from "../subject-BGoM5o8B.js";
|
|
16
|
-
import { i as linkPolicyViolation, n as capabilityOf, r as capabilitySubject } from "../capability-
|
|
17
|
-
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";
|
|
18
18
|
import { t as AccessReviewError } from "../errors-BDUwg2qC.js";
|
|
19
|
-
import { t as policyRowConditionKeys } from "../row-conditions-
|
|
20
|
-
import { n as subscribersFor } from "../audience-
|
|
21
|
-
import { l as sqlIdent, s as quoteSqlLiteral } from "../sql-
|
|
22
|
-
import "../sources-
|
|
23
|
-
import { c as subjectFromSupabaseSession, t as callRpc } from "../postgrest-
|
|
24
|
-
import { n as parseSupabaseManifest, t as hasTokenHook } from "../manifest-
|
|
25
|
-
import { t as parseCatalog } from "../parse-
|
|
19
|
+
import { t as policyRowConditionKeys } from "../row-conditions-BAGHOmVq.js";
|
|
20
|
+
import { n as subscribersFor } from "../audience-DTjR8xet.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-5Dr3W64L.js";
|
|
24
|
+
import { n as parseSupabaseManifest, t as hasTokenHook } from "../manifest-wg8WkkpD.js";
|
|
25
|
+
import { t as parseCatalog } from "../parse-1_ZheTW5.js";
|
|
26
26
|
import { AsyncResult, dbError } from "better-supabase";
|
|
27
27
|
//#region src/better-supabase/access-reviews.ts
|
|
28
28
|
const NOT_MEMBER = "ORGANIZATION_NOT_MEMBER";
|
|
29
|
-
/**
|
|
29
|
+
/**
|
|
30
|
+
* The `hint` better-supabase's block functions raise their code in, or the
|
|
31
|
+
* SQLSTATE.
|
|
32
|
+
*/
|
|
30
33
|
function errorCode(error) {
|
|
31
34
|
if ("hint" in error && typeof error.hint === "string" && error.hint !== "") return error.hint;
|
|
32
35
|
return "code" in error && typeof error.code === "string" ? error.code : void 0;
|
|
@@ -39,8 +42,8 @@ var RpcFailure = class extends Error {
|
|
|
39
42
|
}
|
|
40
43
|
};
|
|
41
44
|
/**
|
|
42
|
-
* Whether a member holding `role` at `scope` holds `key` through it. A role
|
|
43
|
-
*
|
|
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.
|
|
44
47
|
*/
|
|
45
48
|
function roleGrants(policy, role, scope, key) {
|
|
46
49
|
if (!policy.index.declaredRoles.has(role)) return true;
|
|
@@ -60,14 +63,13 @@ function invitationsOf(data) {
|
|
|
60
63
|
}
|
|
61
64
|
/**
|
|
62
65
|
* Applies the revoked items of an access review to better-supabase's
|
|
63
|
-
* organizations and invitations blocks, then marks each one applied. A
|
|
64
|
-
*
|
|
65
|
-
*
|
|
66
|
-
*
|
|
67
|
-
*
|
|
68
|
-
*
|
|
69
|
-
*
|
|
70
|
-
* 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.
|
|
71
73
|
*/
|
|
72
74
|
function accessReviewApplier(options) {
|
|
73
75
|
const schema = options.schema ?? "better_supabase";
|
|
@@ -154,7 +156,10 @@ function accessReviewApplier(options) {
|
|
|
154
156
|
//#region src/better-supabase/api-keys.ts
|
|
155
157
|
const EPOCH = "1970-01-01T00:00:00.000Z";
|
|
156
158
|
const rfc3339Of = (instant) => isoAt(instant.epochMilliseconds);
|
|
157
|
-
/**
|
|
159
|
+
/**
|
|
160
|
+
* When a key stops verifying: its expiry, or the end of a rotated key's grace
|
|
161
|
+
* period.
|
|
162
|
+
*/
|
|
158
163
|
function endOf(key) {
|
|
159
164
|
const { expiresAt, revokedAt } = key;
|
|
160
165
|
if (revokedAt === void 0) return expiresAt;
|
|
@@ -166,9 +171,9 @@ function manifestServiceRoles(manifest) {
|
|
|
166
171
|
return manifest === void 0 ? void 0 : parseSupabaseManifest(manifest).rls.apiKeys?.serviceRoles;
|
|
167
172
|
}
|
|
168
173
|
/**
|
|
169
|
-
* A personal key as a `user` credential acting as its user, a tenant key as
|
|
170
|
-
*
|
|
171
|
-
*
|
|
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.
|
|
172
177
|
*/
|
|
173
178
|
function keyCredential(key, roles, allPermissions) {
|
|
174
179
|
const scopes = key.scopes.includes("*") ? allPermissions?.map((permission) => permission.key) : key.scopes;
|
|
@@ -199,18 +204,18 @@ function keyCredential(key, roles, allPermissions) {
|
|
|
199
204
|
}) ?? null;
|
|
200
205
|
}
|
|
201
206
|
/**
|
|
202
|
-
* better-supabase's API keys as a `CredentialVerifier`, for
|
|
203
|
-
*
|
|
204
|
-
*
|
|
205
|
-
*
|
|
206
|
-
*
|
|
207
|
-
*
|
|
208
|
-
*
|
|
209
|
-
*
|
|
210
|
-
*
|
|
211
|
-
*
|
|
212
|
-
*
|
|
213
|
-
*
|
|
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.
|
|
214
219
|
*/
|
|
215
220
|
function apiKeyVerifier(options) {
|
|
216
221
|
const fallback = manifestServiceRoles(options.manifest);
|
|
@@ -238,10 +243,10 @@ function apiKeyVerifier(options) {
|
|
|
238
243
|
} });
|
|
239
244
|
}
|
|
240
245
|
/**
|
|
241
|
-
* The `claim` and `tenantClaim` options of better-supabase's
|
|
242
|
-
*
|
|
243
|
-
*
|
|
244
|
-
*
|
|
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`.
|
|
245
250
|
*/
|
|
246
251
|
function apiKeyClaimOptions(manifest) {
|
|
247
252
|
const rls = parseSupabaseManifest(manifest).rls;
|
|
@@ -300,8 +305,8 @@ function apiKeySubject(session, options) {
|
|
|
300
305
|
/**
|
|
301
306
|
* `subjectFromSupabaseSession` for better-supabase's `AuthSession`, reading
|
|
302
307
|
* `memberships` for the memberships and the entitlements module's `features`
|
|
303
|
-
* claim for `principal.plans` (`plans` names another claim). With `apiKeys`,
|
|
304
|
-
*
|
|
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
|
|
305
310
|
* acts as its user within the key's scopes, a tenant key as a `service`
|
|
306
311
|
* principal holding `serviceRoles`. Without `apiKeys`, and for `anon`,
|
|
307
312
|
* `service` and `invalid` sessions, the subject is anonymous.
|
|
@@ -330,10 +335,10 @@ function permissionFor(events, type) {
|
|
|
330
335
|
}
|
|
331
336
|
/**
|
|
332
337
|
* The per-subscriber check for better-supabase's webhooks-out, outbox and
|
|
333
|
-
* realtime fan-out: the subscribers whose `principal` `decideFor` grants
|
|
334
|
-
*
|
|
335
|
-
*
|
|
336
|
-
*
|
|
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.
|
|
337
342
|
*/
|
|
338
343
|
function subscriberPolicy(options) {
|
|
339
344
|
return async (event, subscribers) => {
|
|
@@ -365,8 +370,8 @@ function subscriberPolicy(options) {
|
|
|
365
370
|
//#endregion
|
|
366
371
|
//#region src/better-supabase/support.ts
|
|
367
372
|
/**
|
|
368
|
-
* Bound to the admin, target, tenant, reason and mode, so the same start
|
|
369
|
-
*
|
|
373
|
+
* Bound to the admin, target, tenant, reason and mode, so the same start gets
|
|
374
|
+
* the same approval token each time.
|
|
370
375
|
*/
|
|
371
376
|
function requestId(input) {
|
|
372
377
|
return sha256Digest(canonicalJson({
|
|
@@ -383,8 +388,8 @@ function requestId(input) {
|
|
|
383
388
|
* verified claims become a PermDock subject, and the start is decided with
|
|
384
389
|
* `permdock.decideSupportSession` in the requested tenant. `true` only for
|
|
385
390
|
* `granted`: an `approval-required` start passes once `approved` returns a
|
|
386
|
-
* distinct approver for its token. `readOnly: false` needs `writable`. A
|
|
387
|
-
*
|
|
391
|
+
* distinct approver for its token. `readOnly: false` needs `writable`. A throw
|
|
392
|
+
* is `false`.
|
|
388
393
|
*/
|
|
389
394
|
function supportPolicy(options) {
|
|
390
395
|
return async (input) => {
|
|
@@ -439,12 +444,18 @@ function supportPolicy(options) {
|
|
|
439
444
|
//#region src/better-supabase/hooks.ts
|
|
440
445
|
/** better-supabase's claim that caps a context to the permission keys it lists. */
|
|
441
446
|
const PERMISSION_CAP_CLAIM = "bs_permission_cap";
|
|
442
|
-
/**
|
|
447
|
+
/**
|
|
448
|
+
* Whether `permdock` is granted `key` with no row; an unknown key and
|
|
449
|
+
* `approval-required` are `false`.
|
|
450
|
+
*/
|
|
443
451
|
function grants$1(permdock, key) {
|
|
444
452
|
const permission = findPermission(permdock.permissions, key);
|
|
445
453
|
return permission !== void 0 && permdock.decide(permission, void 0).outcome === "granted";
|
|
446
454
|
}
|
|
447
|
-
/**
|
|
455
|
+
/**
|
|
456
|
+
* A list matches when every entry does, `anyOf` when one does; other leaves
|
|
457
|
+
* match nobody, as in SQL.
|
|
458
|
+
*/
|
|
448
459
|
function matches(approvers, userId, permdock) {
|
|
449
460
|
const items = flattenApprovers(approvers);
|
|
450
461
|
return items.length > 0 && items.every((item) => {
|
|
@@ -465,15 +476,15 @@ function matches(approvers, userId, permdock) {
|
|
|
465
476
|
});
|
|
466
477
|
}
|
|
467
478
|
/**
|
|
468
|
-
* better-supabase's `AuthorizationHooks` (`createServer(betterSupabase,
|
|
469
|
-
*
|
|
470
|
-
*
|
|
471
|
-
*
|
|
472
|
-
*
|
|
473
|
-
* `
|
|
474
|
-
*
|
|
475
|
-
*
|
|
476
|
-
*
|
|
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`.
|
|
477
488
|
*/
|
|
478
489
|
function authorizationHooks(options) {
|
|
479
490
|
const { policy } = options;
|
|
@@ -594,16 +605,19 @@ function authorizationHooks(options) {
|
|
|
594
605
|
//#region src/better-supabase/approvers.ts
|
|
595
606
|
/** `rls.approvals`' approver check, executable by `authenticated`. */
|
|
596
607
|
const IS_APPROVER = "permdock_is_approver";
|
|
597
|
-
/**
|
|
608
|
+
/**
|
|
609
|
+
* The resource a cover's `resources` names for a request kind: `job` for
|
|
610
|
+
* `job.update`, else the kind.
|
|
611
|
+
*/
|
|
598
612
|
function resourceOf(kind) {
|
|
599
613
|
const dot = kind.indexOf(".");
|
|
600
614
|
return dot <= 0 ? kind : kind.slice(0, dot);
|
|
601
615
|
}
|
|
602
616
|
/**
|
|
603
617
|
* better-supabase's `isApprover` template: one `case` over `{kind}` whose
|
|
604
|
-
* branches call `permdock_is_approver` with the kind's approvers as JSON.
|
|
605
|
-
*
|
|
606
|
-
*
|
|
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.
|
|
607
621
|
*/
|
|
608
622
|
function isApproverTemplate(input) {
|
|
609
623
|
const problems = [];
|
|
@@ -728,6 +742,14 @@ const listedName = (entry) => entry.listedAs ?? entry.helper;
|
|
|
728
742
|
* functions; better-supabase fills it for the tenant scope only.
|
|
729
743
|
*/
|
|
730
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;
|
|
731
753
|
const ACTOR_MAY_WRITE = "permdock_actor_may_write";
|
|
732
754
|
const OPTIONAL = [
|
|
733
755
|
"idsWithFor",
|
|
@@ -740,8 +762,8 @@ const OPTIONAL = [
|
|
|
740
762
|
];
|
|
741
763
|
/**
|
|
742
764
|
* Postgres aliases of the id types better-supabase reads (`uuid`, `text`,
|
|
743
|
-
* `bigint`, `integer`), matching its `moduleIdType` from
|
|
744
|
-
*
|
|
765
|
+
* `bigint`, `integer`), matching its `moduleIdType` from `better-supabase/sql`,
|
|
766
|
+
* which this runtime entry does not import.
|
|
745
767
|
*/
|
|
746
768
|
const ID_TYPES = {
|
|
747
769
|
uuid: "uuid",
|
|
@@ -765,7 +787,10 @@ function tenantScopeOf(manifest, explicit) {
|
|
|
765
787
|
}
|
|
766
788
|
const roots = manifest.rls.scopes.filter((scope) => scope.within === void 0);
|
|
767
789
|
const [root] = roots;
|
|
768
|
-
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
|
+
}
|
|
769
794
|
return root.name;
|
|
770
795
|
}
|
|
771
796
|
function covers(membership, scope) {
|
|
@@ -856,9 +881,9 @@ function grantsCommandOf(schemas) {
|
|
|
856
881
|
}
|
|
857
882
|
/**
|
|
858
883
|
* better-supabase's `permitted` template. An instance of a scope (`{resource}`
|
|
859
|
-
* names the scope) is checked against that scope's ids; any other resource
|
|
860
|
-
*
|
|
861
|
-
*
|
|
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.
|
|
862
887
|
*/
|
|
863
888
|
function permittedTemplate(schema, scopes, tenantScope, catalog) {
|
|
864
889
|
const idsOf = (scope) => `select ids::text from ${schema}.${sqlIdent(`permitted_${scope}_ids_by_permission`)}({permission}) as ids`;
|
|
@@ -884,9 +909,9 @@ const EFFECTS = {
|
|
|
884
909
|
};
|
|
885
910
|
/**
|
|
886
911
|
* The catalog's `defineOperations` entries as better-supabase operations. A
|
|
887
|
-
* name with a `.` is used as written (`workflow.node.http`); any other is
|
|
888
|
-
*
|
|
889
|
-
* `
|
|
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`.
|
|
890
915
|
*/
|
|
891
916
|
function operationsOf(catalog) {
|
|
892
917
|
const operations = {};
|
|
@@ -906,22 +931,26 @@ function operationsOf(catalog) {
|
|
|
906
931
|
}
|
|
907
932
|
return operations;
|
|
908
933
|
}
|
|
909
|
-
/**
|
|
934
|
+
/**
|
|
935
|
+
* better-supabase's `delegation.scopes`, the same map `rls.tokenScopes`
|
|
936
|
+
* compiles.
|
|
937
|
+
*/
|
|
910
938
|
function delegatedScopes(catalog) {
|
|
911
939
|
return delegatedScopeMap(catalog?.permissions ?? [], catalog?.oauthScopes);
|
|
912
940
|
}
|
|
913
941
|
/**
|
|
914
942
|
* better-supabase's `authorization` config value, built from PermDock's
|
|
915
943
|
* manifest and catalog: the scopes, the `rls generate` helpers as SQL
|
|
916
|
-
* templates, the membership tables, suspension rows, the token hook and
|
|
917
|
-
*
|
|
918
|
-
*
|
|
919
|
-
*
|
|
920
|
-
* `approvers` and `permdock_is_approver`, and otherwise `canApprove` only
|
|
921
|
-
*
|
|
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
|
|
922
950
|
* `actorMayWrite` (`permdock_actor_may_write()`) are set when the manifest
|
|
923
|
-
* lists their helper
|
|
924
|
-
*
|
|
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.
|
|
925
954
|
*/
|
|
926
955
|
function authorizationProvider(options) {
|
|
927
956
|
const manifest = parseSupabaseManifest(options.manifest);
|
|
@@ -1007,6 +1036,17 @@ function authorizationProvider(options) {
|
|
|
1007
1036
|
role: "postgres"
|
|
1008
1037
|
});
|
|
1009
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
|
+
}
|
|
1010
1050
|
let actorMayWrite;
|
|
1011
1051
|
if (helpers.has(ACTOR_MAY_WRITE)) {
|
|
1012
1052
|
const fn = `${schema}.${sqlIdent(ACTOR_MAY_WRITE)}`;
|
|
@@ -1022,6 +1062,7 @@ function authorizationProvider(options) {
|
|
|
1022
1062
|
idsWith: `${schema}.${TEMPLATES.idsWith.sql}`,
|
|
1023
1063
|
isPlatform: `${schema}.${TEMPLATES.isPlatform.sql}`,
|
|
1024
1064
|
...holdersOf === void 0 ? {} : { holdersOf },
|
|
1065
|
+
...teamIdsOf === void 0 ? {} : { teamIdsOf },
|
|
1025
1066
|
...actorMayWrite === void 0 ? {} : { actorMayWrite },
|
|
1026
1067
|
...isApprover === void 0 ? {} : { isApprover },
|
|
1027
1068
|
...permitted === void 0 ? {} : { permitted }
|
|
@@ -1093,7 +1134,10 @@ function decideWith(permdock, request) {
|
|
|
1093
1134
|
if (!isPermission(action)) return denied("Unknown permission.");
|
|
1094
1135
|
return outcomeOf(permdock.decide(action, request.resource.properties), action.key);
|
|
1095
1136
|
}
|
|
1096
|
-
/**
|
|
1137
|
+
/**
|
|
1138
|
+
* The verified claims better-supabase passes in `subject.properties.claims`,
|
|
1139
|
+
* for a user or a delegated agent.
|
|
1140
|
+
*/
|
|
1097
1141
|
function claimsOf(request) {
|
|
1098
1142
|
const { subject } = request;
|
|
1099
1143
|
if (subject.type !== "user" && subject.type !== "agent") return void 0;
|
|
@@ -1102,11 +1146,11 @@ function claimsOf(request) {
|
|
|
1102
1146
|
}
|
|
1103
1147
|
/**
|
|
1104
1148
|
* better-supabase's `authorizer` for PermDock: every resource, action, route
|
|
1105
|
-
* guard and MCP tool that declares a `permission` is decided with `decide`.
|
|
1106
|
-
*
|
|
1107
|
-
*
|
|
1108
|
-
*
|
|
1109
|
-
*
|
|
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.
|
|
1110
1154
|
*/
|
|
1111
1155
|
function authorizer(options) {
|
|
1112
1156
|
const { operations } = options;
|
|
@@ -1163,7 +1207,10 @@ function authorizer(options) {
|
|
|
1163
1207
|
}
|
|
1164
1208
|
//#endregion
|
|
1165
1209
|
//#region src/better-supabase/policies.ts
|
|
1166
|
-
/**
|
|
1210
|
+
/**
|
|
1211
|
+
* PermDock splits a key with row conditions into `key#1`, `key#2`, ... in the
|
|
1212
|
+
* policies it generates.
|
|
1213
|
+
*/
|
|
1167
1214
|
const SPLIT_KEY = /#\d+$/u;
|
|
1168
1215
|
function checkedKey(where, permission, facts, scope) {
|
|
1169
1216
|
const key = permission.key;
|
|
@@ -1215,11 +1262,10 @@ function target(options) {
|
|
|
1215
1262
|
};
|
|
1216
1263
|
}
|
|
1217
1264
|
/**
|
|
1218
|
-
* A better-supabase bucket `policy` that checks PermDock permissions with
|
|
1219
|
-
*
|
|
1220
|
-
*
|
|
1221
|
-
*
|
|
1222
|
-
* `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.
|
|
1223
1269
|
*/
|
|
1224
1270
|
function bucketPolicy(access, options) {
|
|
1225
1271
|
const { facts, sql } = target(options);
|
|
@@ -1253,10 +1299,10 @@ function topicPolicy(access, options) {
|
|
|
1253
1299
|
/**
|
|
1254
1300
|
* `provider` with every `getToken`, `startAuthorization`,
|
|
1255
1301
|
* `completeAuthorization` and `revoke` decided by PermDock first, on the
|
|
1256
|
-
* `CredentialRef` as the row. Anything but `granted` is a `forbidden`
|
|
1257
|
-
*
|
|
1258
|
-
*
|
|
1259
|
-
*
|
|
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.
|
|
1260
1306
|
*/
|
|
1261
1307
|
function credentialGuard(provider, options) {
|
|
1262
1308
|
const allowed = async (permission, ref) => {
|
|
@@ -1290,10 +1336,10 @@ const refused = (reason) => ({
|
|
|
1290
1336
|
});
|
|
1291
1337
|
/**
|
|
1292
1338
|
* The `authorize` and `visible` hooks of better-supabase's `createMcp`, for
|
|
1293
|
-
* tools whose `meta` is a PermDock permission. A tool without a permission
|
|
1294
|
-
*
|
|
1295
|
-
* approval-required call is refused, because `createMcp`
|
|
1296
|
-
*
|
|
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.
|
|
1297
1343
|
*/
|
|
1298
1344
|
function toolPolicy(options) {
|
|
1299
1345
|
return Object.freeze({
|
|
@@ -1332,9 +1378,9 @@ function isLiveRow(row, userId) {
|
|
|
1332
1378
|
}
|
|
1333
1379
|
/**
|
|
1334
1380
|
* The principal `userId` is in the better-supabase organizations block: one
|
|
1335
|
-
* membership per organization, keyed on `organization_id`, holding the role
|
|
1336
|
-
*
|
|
1337
|
-
*
|
|
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.
|
|
1338
1384
|
*/
|
|
1339
1385
|
function principalFromMemberships(userId, rows, options = {}) {
|
|
1340
1386
|
const scope = options.scope ?? "tenant";
|
|
@@ -1364,8 +1410,8 @@ function principalFromMemberships(userId, rows, options = {}) {
|
|
|
1364
1410
|
/**
|
|
1365
1411
|
* A `PrincipalSource` over better-supabase: `principal(id)` maps the claims
|
|
1366
1412
|
* `claims` loads with `subjectFromBetterSupabase`, and `principalByIdentity`
|
|
1367
|
-
* follows `identities` to a user or a contact. Claims for another user, a
|
|
1368
|
-
*
|
|
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`.
|
|
1369
1415
|
*/
|
|
1370
1416
|
function principalSource(options) {
|
|
1371
1417
|
const principal = async (id, lookup = {}) => {
|
|
@@ -1437,20 +1483,48 @@ const MAX_TTL = 3600;
|
|
|
1437
1483
|
function ownEntry(record, key) {
|
|
1438
1484
|
return Object.hasOwn(record, key) ? record[key] : void 0;
|
|
1439
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
|
+
}
|
|
1440
1514
|
function isRow(value) {
|
|
1441
1515
|
if (typeof value !== "object" || value === null) return false;
|
|
1442
1516
|
const row = Object.fromEntries(Object.entries(value));
|
|
1443
1517
|
const expiresAt = row["expiresAt"];
|
|
1444
|
-
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));
|
|
1445
1519
|
}
|
|
1446
1520
|
/**
|
|
1447
|
-
* Resolves a better-supabase share-link token into the `link` subject it
|
|
1448
|
-
*
|
|
1449
|
-
*
|
|
1450
|
-
*
|
|
1451
|
-
*
|
|
1452
|
-
*
|
|
1453
|
-
*
|
|
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.
|
|
1454
1528
|
*/
|
|
1455
1529
|
async function subjectFromShareLink(token, options) {
|
|
1456
1530
|
if (token === void 0 || token === null || token.length === 0) return anonymousSubject();
|
|
@@ -1464,17 +1538,19 @@ async function subjectFromShareLink(token, options) {
|
|
|
1464
1538
|
return anonymousSubject();
|
|
1465
1539
|
};
|
|
1466
1540
|
let row;
|
|
1541
|
+
let subject;
|
|
1467
1542
|
try {
|
|
1468
1543
|
const resolved = await options.shareLinks.resolve(token);
|
|
1469
1544
|
if (!resolved.ok) return deny("source-threw", "resolve-failed");
|
|
1470
1545
|
if (resolved.data === null) return deny("invalid-token", "share-link-unknown");
|
|
1471
|
-
|
|
1472
|
-
|
|
1546
|
+
const parsed = parseRow(resolved.data);
|
|
1547
|
+
if (parsed === void 0) return deny("schema", "share-link-malformed");
|
|
1548
|
+
({row, subject} = parsed);
|
|
1473
1549
|
} catch {
|
|
1474
1550
|
return deny("source-threw");
|
|
1475
1551
|
}
|
|
1476
1552
|
if (row.versionId !== void 0) return deny("invalid-token", "share-link-pinned");
|
|
1477
|
-
const target = ownEntry(options.links,
|
|
1553
|
+
const target = ownEntry(options.links, subject.type);
|
|
1478
1554
|
if (target === void 0) return deny("invalid-token", "subject-type-unknown");
|
|
1479
1555
|
const roles = idList(ownEntry(target.roles, row.role));
|
|
1480
1556
|
if (roles === void 0 || roles.length === 0) return deny("unknown-role");
|
|
@@ -1489,7 +1565,7 @@ async function subjectFromShareLink(token, options) {
|
|
|
1489
1565
|
id: row.id,
|
|
1490
1566
|
on: {
|
|
1491
1567
|
resource: target.resource,
|
|
1492
|
-
id:
|
|
1568
|
+
id: subject.id
|
|
1493
1569
|
},
|
|
1494
1570
|
roles,
|
|
1495
1571
|
expiresAt
|
|
@@ -1507,7 +1583,10 @@ async function subjectFromShareLink(token, options) {
|
|
|
1507
1583
|
}
|
|
1508
1584
|
//#endregion
|
|
1509
1585
|
//#region src/better-supabase/workflow.ts
|
|
1510
|
-
/**
|
|
1586
|
+
/**
|
|
1587
|
+
* Whether `permdock` is granted the permission `key` (a catalog key or scope)
|
|
1588
|
+
* with no row.
|
|
1589
|
+
*/
|
|
1511
1590
|
function grants(permdock, key) {
|
|
1512
1591
|
try {
|
|
1513
1592
|
const permission = findPermission(permdock.permissions, key);
|
|
@@ -1518,9 +1597,9 @@ function grants(permdock, key) {
|
|
|
1518
1597
|
}
|
|
1519
1598
|
/**
|
|
1520
1599
|
* The `can` option of better-supabase's `authorizeHook`, for the caller's
|
|
1521
|
-
* `permdock`: `true` only when the caller is a member of the hook's tenant
|
|
1522
|
-
*
|
|
1523
|
-
*
|
|
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`.
|
|
1524
1603
|
*/
|
|
1525
1604
|
function hookCan(permdock) {
|
|
1526
1605
|
return (tenant, key) => {
|
|
@@ -1532,10 +1611,10 @@ function hookCan(permdock) {
|
|
|
1532
1611
|
};
|
|
1533
1612
|
}
|
|
1534
1613
|
/**
|
|
1535
|
-
* The `can` option of better-supabase's `protectWebHandler`: `undefined`
|
|
1536
|
-
*
|
|
1537
|
-
*
|
|
1538
|
-
*
|
|
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).
|
|
1539
1618
|
*/
|
|
1540
1619
|
function handlerCan(source) {
|
|
1541
1620
|
return async (request, key) => {
|