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,29 +1,29 @@
|
|
|
1
1
|
import { n as isReadonlyArray, r as isRecord, t as compact } from "./compact-CAf557ZB.js";
|
|
2
|
-
import { n as freezeDeep } from "./freeze-
|
|
3
|
-
import { n as isForbiddenKey, r as ownGet } from "./paths-
|
|
4
|
-
import { f as normalizeApproval, g as assertSqlFunctionName, h as assertSqlFunctionArg, m as assertPortableTwin, p as normalizeWhere, u as assertApprovalRelations } from "./role-builder-
|
|
5
|
-
import { n as PermDockDeniedError } from "./errors-
|
|
6
|
-
import { o as sameId } from "./expiry-
|
|
7
|
-
import { n as internalsOf } from "./internals-
|
|
8
|
-
import { c as listPermissions, i as getRegistry, n as findPermission, o as isPermission } from "./permission-registry-
|
|
9
|
-
import { n as isThenable$1 } from "./thenable-
|
|
10
|
-
import { c as isEdgeRelation, m as restrictedStops, o as groupEntries, s as isComputedRelation, u as isPrincipalRelation } from "./resource-relations-
|
|
11
|
-
import { a as durationOf, g as secondsOf, m as rfc3339, p as nowSeconds } from "./time-
|
|
12
|
-
import { d as
|
|
13
|
-
import { u as evaluateCondition } from "./delegation-
|
|
14
|
-
import { _ as listPlans, a as authenticated, m as findRole, o as flattenGrantee } from "./grantee-
|
|
15
|
-
import { m as tenantsOf, r as isMembershipExpired } from "./tenancy-
|
|
16
|
-
import {
|
|
17
|
-
import {
|
|
18
|
-
import { n as OPERATION_RISKS, r as isOperationRisk } from "./permissions-
|
|
19
|
-
import {
|
|
20
|
-
import {
|
|
21
|
-
import { n as relationId } from "./relations-
|
|
22
|
-
import {
|
|
23
|
-
import { n as LOCAL_CUSTOM_ROLE } from "./parse-local-manifest-
|
|
24
|
-
import {
|
|
25
|
-
import { i as memoryApprovalStore } from "./store-
|
|
26
|
-
import { n as wrapPermDock } from "./wrap-
|
|
2
|
+
import { n as freezeDeep } from "./freeze-jjan0lCv.js";
|
|
3
|
+
import { n as isForbiddenKey, r as ownGet } from "./paths-CUvURzHp.js";
|
|
4
|
+
import { f as normalizeApproval, g as assertSqlFunctionName, h as assertSqlFunctionArg, m as assertPortableTwin, p as normalizeWhere, u as assertApprovalRelations } from "./role-builder-BK2-T6oD.js";
|
|
5
|
+
import { n as PermDockDeniedError } from "./errors-B6R_lg2a.js";
|
|
6
|
+
import { o as sameId } from "./expiry-6XByK0dm.js";
|
|
7
|
+
import { n as internalsOf } from "./internals-B3IgHrvo.js";
|
|
8
|
+
import { c as listPermissions, i as getRegistry, n as findPermission, o as isPermission } from "./permission-registry-B8tYxPIt.js";
|
|
9
|
+
import { n as isThenable$1 } from "./thenable-BNSM1U2R.js";
|
|
10
|
+
import { c as isEdgeRelation, m as restrictedStops, o as groupEntries, s as isComputedRelation, u as isPrincipalRelation } from "./resource-relations-8-pCScBO.js";
|
|
11
|
+
import { a as durationOf, g as secondsOf, m as rfc3339, p as nowSeconds } from "./time-nR1JesoH.js";
|
|
12
|
+
import { a as normalizeMembership$1, d as scopeIdOf, f as scopeList, h as tenantOf, l as rootScope, o as normalizeMemberships$1, s as resolveScope$1, u as scopeChain } from "./scopes-0Up_UA2t.js";
|
|
13
|
+
import { u as evaluateCondition } from "./delegation-CDB6_keF.js";
|
|
14
|
+
import { _ as listPlans, a as authenticated, m as findRole, o as flattenGrantee } from "./grantee-Dke-9rd1.js";
|
|
15
|
+
import { m as tenantsOf, r as isMembershipExpired } from "./tenancy-5d1zVBvK.js";
|
|
16
|
+
import { c as levelNames, i as grantList, n as declaredRoleNames } from "./policy-CLQ8__GF.js";
|
|
17
|
+
import { o as isPortableCondition } from "./hosted-D0IzESu_.js";
|
|
18
|
+
import { n as OPERATION_RISKS, r as isOperationRisk } from "./permissions-CVXmRILq.js";
|
|
19
|
+
import { C as tenantCustomRoles, S as roleAllowKeys, f as customRoleId, l as ceilingGrants, m as customRoleScope, p as customRoleOf, x as resolveCustomRole } from "./evaluate-Dd8Ta0Ie.js";
|
|
20
|
+
import { a as heldLevels, f as bindingOf, h as usesAssigns, m as roleMeta, n as snapshotScopes, o as collectSnapshotGrants, p as rankRoles, r as assignableCandidates, t as snapshotOf } from "./instance-snapshot--JWiTrvO.js";
|
|
21
|
+
import { n as relationId } from "./relations-BxvRvDHK.js";
|
|
22
|
+
import { i as snapshotGrant, r as plainPermission, t as buildSnapshot } from "./snapshot-CXlzi69u.js";
|
|
23
|
+
import { n as LOCAL_CUSTOM_ROLE } from "./parse-local-manifest-DEiCF4ah.js";
|
|
24
|
+
import { c as APP, r as resolveSubject } from "./permdock-L-_I_3zP.js";
|
|
25
|
+
import { i as memoryApprovalStore } from "./store-RNFvaJJv.js";
|
|
26
|
+
import { n as wrapPermDock } from "./wrap-B2wziJI_.js";
|
|
27
27
|
//#region src/conditions/sql-function.ts
|
|
28
28
|
function sqlFunction(name, options) {
|
|
29
29
|
assertSqlFunctionName(name);
|
|
@@ -51,7 +51,10 @@ function memorySettingsSource(settings) {
|
|
|
51
51
|
return byTenant.get(tenant);
|
|
52
52
|
} });
|
|
53
53
|
}
|
|
54
|
-
/**
|
|
54
|
+
/**
|
|
55
|
+
* Memberships keyed by principal id; `tenant` is not a filter, as for a
|
|
56
|
+
* database source.
|
|
57
|
+
*/
|
|
55
58
|
function memoryMembershipSource(entries) {
|
|
56
59
|
const byPrincipal = new Map(Object.entries(entries));
|
|
57
60
|
return Object.freeze({
|
|
@@ -125,7 +128,10 @@ const OPERATION_EFFECTS = Object.freeze([
|
|
|
125
128
|
"spend",
|
|
126
129
|
"external"
|
|
127
130
|
]);
|
|
128
|
-
/**
|
|
131
|
+
/**
|
|
132
|
+
* MCP tool-name characters (MCP 2025-11-25, Tools: Tool names), so a name works
|
|
133
|
+
* as a tool name unchanged.
|
|
134
|
+
*/
|
|
129
135
|
const NAME = /^[A-Za-z0-9_.-]{1,128}$/u;
|
|
130
136
|
const META_KEYS = /* @__PURE__ */ new Set([
|
|
131
137
|
"risk",
|
|
@@ -199,7 +205,10 @@ function defineOperations(permissions, definitions) {
|
|
|
199
205
|
}
|
|
200
206
|
//#endregion
|
|
201
207
|
//#region src/core/approval-policies.ts
|
|
202
|
-
/**
|
|
208
|
+
/**
|
|
209
|
+
* The denial detail when an `ApprovalPolicySource` fails: every call an allow
|
|
210
|
+
* would grant denies with reason `approval`.
|
|
211
|
+
*/
|
|
203
212
|
/**
|
|
204
213
|
* The in-process `ApprovalPolicySource`, usable directly as the
|
|
205
214
|
* `approvalPolicies` option: it is the source and its feature at once.
|
|
@@ -284,9 +293,9 @@ function checkOne(policy, raw) {
|
|
|
284
293
|
}) };
|
|
285
294
|
}
|
|
286
295
|
/**
|
|
287
|
-
* Checks one entry against the policy the way `approvalPoliciesFor` loads
|
|
288
|
-
*
|
|
289
|
-
*
|
|
296
|
+
* Checks one entry against the policy the way `approvalPoliciesFor` loads it,
|
|
297
|
+
* for an application to refuse a bad entry when it is saved instead of finding
|
|
298
|
+
* every call denied. Never throws.
|
|
290
299
|
*/
|
|
291
300
|
function validateApprovalPolicy(policy, entry) {
|
|
292
301
|
try {
|
|
@@ -303,9 +312,9 @@ function validateApprovalPolicy(policy, entry) {
|
|
|
303
312
|
}
|
|
304
313
|
}
|
|
305
314
|
/**
|
|
306
|
-
* One raw entry checked against the policy: `null` when it names no
|
|
307
|
-
*
|
|
308
|
-
*
|
|
315
|
+
* One raw entry checked against the policy: `null` when it names no permission
|
|
316
|
+
* the policy declares (it applies to nothing), `undefined` when it does not
|
|
317
|
+
* load.
|
|
309
318
|
*/
|
|
310
319
|
function loadOne(policy, raw) {
|
|
311
320
|
const checked = checkOne(policy, raw);
|
|
@@ -322,7 +331,10 @@ function loadAll(policy, raw) {
|
|
|
322
331
|
}
|
|
323
332
|
return Object.freeze({ tighten: (code, input) => tightenApproval(code, out, input) });
|
|
324
333
|
}
|
|
325
|
-
/**
|
|
334
|
+
/**
|
|
335
|
+
* Reads the source once for `tenants`; a throw or an invalid entry loads as
|
|
336
|
+
* `"failed"`.
|
|
337
|
+
*/
|
|
326
338
|
function approvalPoliciesFor(policy, source, tenants, auth) {
|
|
327
339
|
const threw = () => {
|
|
328
340
|
auth.push({
|
|
@@ -361,7 +373,10 @@ function asStages(approval) {
|
|
|
361
373
|
quorum: approval.quorum
|
|
362
374
|
})];
|
|
363
375
|
}
|
|
364
|
-
/**
|
|
376
|
+
/**
|
|
377
|
+
* An entry's stages, each carrying the entry's escalation unless it has its
|
|
378
|
+
* own.
|
|
379
|
+
*/
|
|
365
380
|
function entryStages(approval) {
|
|
366
381
|
const stages = asStages(approval);
|
|
367
382
|
if (approval === "human" || approval.escalation === void 0) return stages;
|
|
@@ -378,10 +393,10 @@ function shorter(a, b) {
|
|
|
378
393
|
return (durationOf(b) ?? Infinity) < (durationOf(a) ?? Infinity) ? b : a;
|
|
379
394
|
}
|
|
380
395
|
/**
|
|
381
|
-
* `code` with every matching entry added as further stages: the result
|
|
382
|
-
*
|
|
383
|
-
*
|
|
384
|
-
*
|
|
396
|
+
* `code` with every matching entry added as further stages: the result needs
|
|
397
|
+
* all of them (`'sequential'` when any part is ordered), keeps the code's
|
|
398
|
+
* escalation, the shortest `ttl`, and `distinct` unless every part opts out.
|
|
399
|
+
* Without a matching entry, `code` unchanged.
|
|
385
400
|
*/
|
|
386
401
|
function tightenApproval(code, entries, input) {
|
|
387
402
|
const extra = entries.filter((entry) => (entry.permission === void 0 || entry.permission === input.permission) && metaMatches(entry, input.operation) && matches(entry, input.tenant, input.subject, input.current, input.next, input.now, input.scopes));
|
|
@@ -621,7 +636,10 @@ function applyQuota(store, input) {
|
|
|
621
636
|
}
|
|
622
637
|
//#endregion
|
|
623
638
|
//#region src/core/memory-relations.ts
|
|
624
|
-
/**
|
|
639
|
+
/**
|
|
640
|
+
* The holders one edge-table row names for `spec`: none when the row does not
|
|
641
|
+
* belong to it.
|
|
642
|
+
*/
|
|
625
643
|
function tableHolders(resourceName, spec, row, id) {
|
|
626
644
|
if (relationId(ownGet(row, spec.object ?? `${resourceName}_id`)) !== id) return [];
|
|
627
645
|
for (const [column, value] of Object.entries(spec.match ?? {})) if (ownGet(row, column) !== value) return [];
|
|
@@ -942,7 +960,10 @@ function permissionKeysOf(node) {
|
|
|
942
960
|
if (!Array.isArray(raw)) return [];
|
|
943
961
|
return raw.filter((item) => typeof item === "string");
|
|
944
962
|
}
|
|
945
|
-
/**
|
|
963
|
+
/**
|
|
964
|
+
* `$inputs.a.b` against the frame's inputs; anything else that is a runtime
|
|
965
|
+
* expression is unknown.
|
|
966
|
+
*/
|
|
946
967
|
function valueOf(value, inputs) {
|
|
947
968
|
if (typeof value !== "string" || !value.includes("$")) return {
|
|
948
969
|
known: true,
|
|
@@ -1142,10 +1163,9 @@ function combine(decisions) {
|
|
|
1142
1163
|
return decisions.find((item) => item.outcome === outcome) ?? denied("undocumented");
|
|
1143
1164
|
}
|
|
1144
1165
|
/**
|
|
1145
|
-
* Walks an Arazzo workflow against `permdock`: each step's operation is
|
|
1146
|
-
*
|
|
1147
|
-
*
|
|
1148
|
-
* snapshot too.
|
|
1166
|
+
* Walks an Arazzo workflow against `permdock`: each step's operation is decided
|
|
1167
|
+
* as `permdock.simulate` would, and a server instance emits one simulate event
|
|
1168
|
+
* for the whole plan. Works on an instance built from a snapshot too.
|
|
1149
1169
|
*/
|
|
1150
1170
|
function simulateArazzo(permdock, input) {
|
|
1151
1171
|
const tree = input.permissions ?? permdock.permissions;
|
|
@@ -1205,7 +1225,10 @@ function planArazzo(input, tree, decide) {
|
|
|
1205
1225
|
}
|
|
1206
1226
|
//#endregion
|
|
1207
1227
|
//#region src/core/local-manifest.ts
|
|
1208
|
-
/**
|
|
1228
|
+
/**
|
|
1229
|
+
* A relation grantee needs the relation graph, which a device does not hold:
|
|
1230
|
+
* the grant decides on the server only.
|
|
1231
|
+
*/
|
|
1209
1232
|
function localGrant(grant) {
|
|
1210
1233
|
const relational = flattenGrantee(grant.to).some((item) => item.kind === "relation");
|
|
1211
1234
|
return snapshotGrant(relational ? {
|
|
@@ -1213,6 +1236,21 @@ function localGrant(grant) {
|
|
|
1213
1236
|
portable: false
|
|
1214
1237
|
} : grant, void 0);
|
|
1215
1238
|
}
|
|
1239
|
+
/**
|
|
1240
|
+
* The levels a holder of `grants` may hand out, by permission key; only
|
|
1241
|
+
* permissions whose resource declares levels.
|
|
1242
|
+
*/
|
|
1243
|
+
function reachOf(policy, grants) {
|
|
1244
|
+
const out = /* @__PURE__ */ new Map();
|
|
1245
|
+
for (const grant of grants) {
|
|
1246
|
+
const { key, resource, kind } = grant.permission;
|
|
1247
|
+
const names = grant.effect === "allow" && kind === "instance" ? levelNames(policy, resource) : [];
|
|
1248
|
+
if (names.length === 0) continue;
|
|
1249
|
+
const held = /* @__PURE__ */ new Set([...out.get(key) ?? [], ...heldLevels(policy, grant, names)]);
|
|
1250
|
+
out.set(key, names.filter((name) => held.has(name)));
|
|
1251
|
+
}
|
|
1252
|
+
return Object.fromEntries(out);
|
|
1253
|
+
}
|
|
1216
1254
|
function customTable(policy, scope, roles) {
|
|
1217
1255
|
const keys = [...new Set(ceilingGrants(policy, scope).map((grant) => grant.permission.key))];
|
|
1218
1256
|
if (keys.length === 0) return;
|
|
@@ -1225,28 +1263,71 @@ function customTable(policy, scope, roles) {
|
|
|
1225
1263
|
tenant: LOCAL_CUSTOM_ROLE,
|
|
1226
1264
|
scope,
|
|
1227
1265
|
...body
|
|
1228
|
-
}).grants
|
|
1266
|
+
}).grants;
|
|
1229
1267
|
const permissions = {};
|
|
1230
1268
|
for (const key of keys) {
|
|
1231
1269
|
const leaf = findPermission(policy.permissions, key);
|
|
1232
1270
|
const names = leaf?.kind === "instance" ? levelNames(policy, leaf.resource) : [];
|
|
1271
|
+
const all = resolve({ grants: [{ permission: key }] });
|
|
1272
|
+
const leveled = names.map((level) => [level, resolve({ grants: [{
|
|
1273
|
+
permission: key,
|
|
1274
|
+
level
|
|
1275
|
+
}] })]);
|
|
1233
1276
|
permissions[key] = compact({
|
|
1234
|
-
all:
|
|
1235
|
-
levels: names.length === 0 ? void 0 : Object.fromEntries(
|
|
1236
|
-
|
|
1237
|
-
|
|
1238
|
-
}] })]))
|
|
1277
|
+
all: all.map(localGrant),
|
|
1278
|
+
levels: names.length === 0 ? void 0 : Object.fromEntries(leveled.map(([level, grants]) => [level, grants.map(localGrant)])),
|
|
1279
|
+
reach: names.length === 0 ? void 0 : reachOf(policy, all)[key] ?? [],
|
|
1280
|
+
levelReach: names.length === 0 ? void 0 : Object.fromEntries(leveled.map(([level, grants]) => [level, reachOf(policy, grants)[key] ?? []]))
|
|
1239
1281
|
});
|
|
1240
1282
|
}
|
|
1241
1283
|
const includes = {};
|
|
1284
|
+
const includeReach = {};
|
|
1242
1285
|
for (const role of roles) {
|
|
1243
1286
|
const grants = resolve({ includes: [role] });
|
|
1244
|
-
if (grants.length > 0)
|
|
1287
|
+
if (grants.length > 0) {
|
|
1288
|
+
includes[role] = grants.map(localGrant);
|
|
1289
|
+
const reach = reachOf(policy, grants);
|
|
1290
|
+
if (Object.keys(reach).length > 0) includeReach[role] = reach;
|
|
1291
|
+
}
|
|
1245
1292
|
}
|
|
1246
|
-
return {
|
|
1293
|
+
return compact({
|
|
1247
1294
|
permissions,
|
|
1248
|
-
includes
|
|
1249
|
-
|
|
1295
|
+
includes,
|
|
1296
|
+
includeReach: Object.keys(includeReach).length === 0 ? void 0 : includeReach
|
|
1297
|
+
});
|
|
1298
|
+
}
|
|
1299
|
+
/** The hand-out rules `buildLocalSnapshot` applies on the device. */
|
|
1300
|
+
function localAssignable(policy) {
|
|
1301
|
+
const scopes = scopeList(policy.scopes);
|
|
1302
|
+
const root = rootScope(scopes);
|
|
1303
|
+
const ceiling = new Set((root === void 0 ? [] : ceilingGrants(policy, root)).map((grant) => grant.permission.key));
|
|
1304
|
+
const leaves = listPermissions(policy.permissions);
|
|
1305
|
+
const levels = {};
|
|
1306
|
+
for (const leaf of leaves) {
|
|
1307
|
+
const names = leaf.kind === "instance" ? levelNames(policy, leaf.resource) : [];
|
|
1308
|
+
if (names.length > 0) levels[leaf.key] = names;
|
|
1309
|
+
}
|
|
1310
|
+
const grants = {};
|
|
1311
|
+
for (const [index, grant] of grantList(policy).entries()) {
|
|
1312
|
+
const reach = flattenGrantee(grant.to).some((item) => item.kind === "relation") ? levels[grant.permission.key] === void 0 ? void 0 : [] : reachOf(policy, [grant])[grant.permission.key];
|
|
1313
|
+
if (reach !== void 0) grants[String(index)] = reach;
|
|
1314
|
+
}
|
|
1315
|
+
const declared = [...declaredRoleNames(policy)].toSorted();
|
|
1316
|
+
return compact({
|
|
1317
|
+
roles: assignableCandidates(policy).map((leaf) => ({
|
|
1318
|
+
name: leaf.key,
|
|
1319
|
+
on: (leaf.on === void 0 ? root : resolveScope$1(scopes, leaf.on)) ?? "global",
|
|
1320
|
+
allows: [...roleAllowKeys(policy, leaf.key)].toSorted()
|
|
1321
|
+
})),
|
|
1322
|
+
manage: {
|
|
1323
|
+
roles: declared.filter((name) => roleMeta(policy, name)?.manageRoles === true),
|
|
1324
|
+
permissions: leaves.filter((leaf) => leaf.meta.manageRoles === true).map((leaf) => leaf.key)
|
|
1325
|
+
},
|
|
1326
|
+
assigns: usesAssigns(policy) ? Object.fromEntries(declared.map((name) => [name, policy.rolesByName.get(name)?.assigns ?? []])) : void 0,
|
|
1327
|
+
permissions: leaves.filter((leaf) => ceiling.has(leaf.key)).map(plainPermission),
|
|
1328
|
+
levels: Object.keys(levels).length === 0 ? void 0 : levels,
|
|
1329
|
+
grants: Object.keys(grants).length === 0 ? void 0 : grants
|
|
1330
|
+
});
|
|
1250
1331
|
}
|
|
1251
1332
|
/**
|
|
1252
1333
|
* What the policy grants, as JSON a device turns into snapshots from its own
|
|
@@ -1277,7 +1358,8 @@ function localSnapshotManifest(policy) {
|
|
|
1277
1358
|
roles,
|
|
1278
1359
|
rank: usesAssigns(policy) ? rankRoles(policy, roles) : void 0,
|
|
1279
1360
|
grants: grantList(policy).map(localGrant),
|
|
1280
|
-
custom
|
|
1361
|
+
custom,
|
|
1362
|
+
assignable: localAssignable(policy)
|
|
1281
1363
|
}));
|
|
1282
1364
|
}
|
|
1283
1365
|
//#endregion
|
|
@@ -1291,10 +1373,10 @@ function assertProduction(policy, options) {
|
|
|
1291
1373
|
if (options.limits === void 0 && grants.some((grant) => grant.limit !== void 0)) throw new Error("PermDock: profile 'prod' needs limits: a grant has a limit and every call would deny with limit-unavailable; pass limits: limits(store)");
|
|
1292
1374
|
}
|
|
1293
1375
|
/**
|
|
1294
|
-
* The in-process services `dev` fills in: one memory approval store that
|
|
1295
|
-
*
|
|
1296
|
-
*
|
|
1297
|
-
*
|
|
1376
|
+
* The in-process services `dev` fills in: one memory approval store that every
|
|
1377
|
+
* adapter of the app shares, and memory limits when a grant has a `limit`. They
|
|
1378
|
+
* live here, not in the adapters, so an adapter ships no store and an app
|
|
1379
|
+
* without `defineApp` ships neither.
|
|
1298
1380
|
*/
|
|
1299
1381
|
function devDefaults(policy, options) {
|
|
1300
1382
|
return {
|
|
@@ -1305,10 +1387,10 @@ function devDefaults(policy, options) {
|
|
|
1305
1387
|
};
|
|
1306
1388
|
}
|
|
1307
1389
|
/**
|
|
1308
|
-
* Binds the app's sources, features and services to `policy`. The result
|
|
1309
|
-
*
|
|
1310
|
-
*
|
|
1311
|
-
*
|
|
1390
|
+
* Binds the app's sources, features and services to `policy`. The result is a
|
|
1391
|
+
* policy: pass it wherever a policy goes (`createPermDock`, every adapter, the
|
|
1392
|
+
* CLI) and each picks up the app definition, with its own options taking
|
|
1393
|
+
* precedence. The profile defaults to `prod`.
|
|
1312
1394
|
*/
|
|
1313
1395
|
function defineApp(policy, options = {}) {
|
|
1314
1396
|
const profile = options.profile ?? "prod";
|
|
@@ -1356,12 +1438,12 @@ function legacyDecision(allowed, permission, subject) {
|
|
|
1356
1438
|
});
|
|
1357
1439
|
}
|
|
1358
1440
|
/**
|
|
1359
|
-
* Runs PermDock beside the application's existing checks while adopting
|
|
1360
|
-
*
|
|
1361
|
-
*
|
|
1362
|
-
*
|
|
1363
|
-
*
|
|
1364
|
-
*
|
|
1441
|
+
* Runs PermDock beside the application's existing checks while adopting it.
|
|
1442
|
+
* Each `can`, `decide`, `decideEach`, `filter` and `assert` asks both; the
|
|
1443
|
+
* legacy answer is returned unless the permission is in `enforce`, and every
|
|
1444
|
+
* disagreement reaches `onMismatch`. Promote permissions one by one as their
|
|
1445
|
+
* mismatches are resolved, then remove the wrap. Pass it as an adapter's `wrap`
|
|
1446
|
+
* option, or call it on a core instance.
|
|
1365
1447
|
*/
|
|
1366
1448
|
function shadowMode(options) {
|
|
1367
1449
|
const enforced = (permission) => options.enforce === "all" || (options.enforce ?? []).some((item) => item.key === permission.key);
|
|
@@ -1466,9 +1548,9 @@ function ofTenant(tenant, roles) {
|
|
|
1466
1548
|
return Array.isArray(roles) ? roles.filter((role) => role !== null && typeof role === "object" && Reflect.get(role, "tenant") === tenant) : [];
|
|
1467
1549
|
}
|
|
1468
1550
|
/**
|
|
1469
|
-
* A `CustomRoleSource` over a reader that returns every custom role of a
|
|
1470
|
-
* It keeps only the roles of the requested tenant. With `read: 'held'`
|
|
1471
|
-
* skips a tenant's read, and `globalRoles` and `sharedRoles`, when the
|
|
1551
|
+
* A `CustomRoleSource` over a reader that returns every custom role of a
|
|
1552
|
+
* tenant. It keeps only the roles of the requested tenant. With `read: 'held'`
|
|
1553
|
+
* it skips a tenant's read, and `globalRoles` and `sharedRoles`, when the
|
|
1472
1554
|
* subject holds only declared roles there.
|
|
1473
1555
|
*/
|
|
1474
1556
|
function customRoleSource(reader, options = {}) {
|
|
@@ -1497,10 +1579,10 @@ function withPlans(subject, plans) {
|
|
|
1497
1579
|
}));
|
|
1498
1580
|
}
|
|
1499
1581
|
/**
|
|
1500
|
-
* Builds the serializable access snapshot for a subject without a request,
|
|
1501
|
-
*
|
|
1502
|
-
*
|
|
1503
|
-
*
|
|
1582
|
+
* Builds the serializable access snapshot for a subject without a request, a
|
|
1583
|
+
* network call or a cache directive: call it inside the app's own `'use cache:
|
|
1584
|
+
* private'` function. Synchronous; the policy's `subject` and `context` mappers
|
|
1585
|
+
* must be synchronous too.
|
|
1504
1586
|
*/
|
|
1505
1587
|
function snapshotFor(policy, user, options = {}) {
|
|
1506
1588
|
const auth = [];
|
|
@@ -1599,22 +1681,52 @@ function writable(options) {
|
|
|
1599
1681
|
return finishPreset(WRITABLE_ACTIONS, WRITABLE_COLLECTION, options);
|
|
1600
1682
|
}
|
|
1601
1683
|
//#endregion
|
|
1684
|
+
//#region src/core/scope-helpers.ts
|
|
1685
|
+
/**
|
|
1686
|
+
* The canonical form PermDock evaluates one membership in, or `undefined` when
|
|
1687
|
+
* it is malformed and grants nothing. `scopes` is the policy's or the catalog's
|
|
1688
|
+
* scope list; absent or empty means the implicit `tenant` and `team` pair.
|
|
1689
|
+
*/
|
|
1690
|
+
function normalizeMembership(input, scopes) {
|
|
1691
|
+
return normalizeMembership$1(input, scopeList(scopes));
|
|
1692
|
+
}
|
|
1693
|
+
/**
|
|
1694
|
+
* Every well-formed membership of `input` in canonical form; malformed entries
|
|
1695
|
+
* are dropped.
|
|
1696
|
+
*/
|
|
1697
|
+
function normalizeMemberships(input, scopes) {
|
|
1698
|
+
return normalizeMemberships$1(input, scopeList(scopes));
|
|
1699
|
+
}
|
|
1700
|
+
/**
|
|
1701
|
+
* The declared scope `name` stands for: the name itself, or the scope the
|
|
1702
|
+
* `tenant` (first) or `team` (second) alias names. `undefined` otherwise.
|
|
1703
|
+
*/
|
|
1704
|
+
function resolveScope(scopes, name) {
|
|
1705
|
+
return resolveScope$1(scopeList(scopes), name);
|
|
1706
|
+
}
|
|
1707
|
+
//#endregion
|
|
1602
1708
|
//#region src/core/ownership.ts
|
|
1603
1709
|
function coversInstance(membership, scopes, scope, id, within) {
|
|
1604
1710
|
if (membership.scope === void 0 || membership.id === void 0) return false;
|
|
1605
1711
|
if (membership.scope === scope) return sameId(membership.id, id);
|
|
1606
1712
|
if (!scopeChain(scopes, scope).slice(1).includes(membership.scope)) return false;
|
|
1607
|
-
const wanted = within === void 0 ? void 0 : Object.entries(within).find(([key]) => resolveScope(scopes, key) === membership.scope)?.[1] ?? void 0;
|
|
1713
|
+
const wanted = within === void 0 ? void 0 : Object.entries(within).find(([key]) => resolveScope$1(scopes, key) === membership.scope)?.[1] ?? void 0;
|
|
1608
1714
|
return wanted !== void 0 && scopeIdOf(membership, membership.scope) === wanted;
|
|
1609
1715
|
}
|
|
1610
|
-
/**
|
|
1716
|
+
/**
|
|
1717
|
+
* Roles the principal holds at the instance, at an ancestor named in `within`,
|
|
1718
|
+
* or globally.
|
|
1719
|
+
*/
|
|
1611
1720
|
function rolesAtInstance(policy, principal, scopes, scope, id, within, now) {
|
|
1612
1721
|
const declared = declaredRoleNames(policy);
|
|
1613
1722
|
const names = new Set((principal.roles ?? []).filter((name) => declared.has(name)));
|
|
1614
1723
|
for (const membership of principal.memberships ?? []) if (!isMembershipExpired(membership, now) && coversInstance(membership, scopes, scope, id, within)) for (const name of membership.roles) names.add(name);
|
|
1615
1724
|
return rankRoles(policy, [...names]);
|
|
1616
1725
|
}
|
|
1617
|
-
/**
|
|
1726
|
+
/**
|
|
1727
|
+
* Whether the principal holds `role` on a live membership of exactly this
|
|
1728
|
+
* instance.
|
|
1729
|
+
*/
|
|
1618
1730
|
function holdsAt(principal, role, scope, id, now) {
|
|
1619
1731
|
return (principal.memberships ?? []).some((membership) => membership.scope === scope && sameId(membership.id, id) && !isMembershipExpired(membership, now) && membership.roles.includes(role));
|
|
1620
1732
|
}
|
|
@@ -1622,8 +1734,8 @@ function includedRoles(role) {
|
|
|
1622
1734
|
return isReadonlyArray(role.includes) ? role.includes.filter((name) => typeof name === "string") : [];
|
|
1623
1735
|
}
|
|
1624
1736
|
/**
|
|
1625
|
-
* The membership kinds a custom role may be held through: those every
|
|
1626
|
-
*
|
|
1737
|
+
* The membership kinds a custom role may be held through: those every included
|
|
1738
|
+
* declared role with `for` allows. `undefined` when none restricts.
|
|
1627
1739
|
*/
|
|
1628
1740
|
function customForKinds(policy, role) {
|
|
1629
1741
|
let kinds;
|
|
@@ -1639,12 +1751,13 @@ function conflictsWith(policy, role) {
|
|
|
1639
1751
|
return out;
|
|
1640
1752
|
}
|
|
1641
1753
|
/** What the change does to the instance's holder count. */
|
|
1642
|
-
function countRules(
|
|
1643
|
-
|
|
1644
|
-
|
|
1645
|
-
|
|
1754
|
+
function countRules(rules, holders, delta, deny) {
|
|
1755
|
+
const role = rules.key;
|
|
1756
|
+
if (delta === 0) return;
|
|
1757
|
+
const min = rules.min ?? 0;
|
|
1758
|
+
if (!(min > 0 || rules.max !== void 0 || rules.transferOnly === true)) return;
|
|
1646
1759
|
if (!(holders !== void 0 && Number.isInteger(holders) && holders >= 0)) {
|
|
1647
|
-
deny(delta < 0 && min > 0 ? "last-holder" : delta > 0 &&
|
|
1760
|
+
deny(delta < 0 && min > 0 ? "last-holder" : delta > 0 && rules.max !== void 0 ? "max-holders" : "transfer-only", {
|
|
1648
1761
|
role,
|
|
1649
1762
|
holders: null
|
|
1650
1763
|
});
|
|
@@ -1656,17 +1769,85 @@ function countRules(binding, role, holders, delta, deny) {
|
|
|
1656
1769
|
min,
|
|
1657
1770
|
holders
|
|
1658
1771
|
});
|
|
1659
|
-
if (delta > 0 &&
|
|
1772
|
+
if (delta > 0 && rules.max !== void 0 && after > rules.max) deny("max-holders", {
|
|
1660
1773
|
role,
|
|
1661
|
-
max:
|
|
1774
|
+
max: rules.max,
|
|
1662
1775
|
holders
|
|
1663
1776
|
});
|
|
1664
|
-
if (
|
|
1777
|
+
if (rules.transferOnly === true && holders > 0 && after > 0) deny("transfer-only", {
|
|
1665
1778
|
role,
|
|
1666
1779
|
holders
|
|
1667
1780
|
});
|
|
1668
1781
|
}
|
|
1669
1782
|
/**
|
|
1783
|
+
* The rules of a role change that need no subject: `assigns`, `for`,
|
|
1784
|
+
* `exclusiveWith`, `min`, `max` and `transferOnly`, from holder counts and the
|
|
1785
|
+
* target's roles alone. `decideRoleChange` runs the same function after its
|
|
1786
|
+
* actor, tenant and ceiling checks; a service that holds only the catalog calls
|
|
1787
|
+
* it with the `CatalogRole` entries.
|
|
1788
|
+
*/
|
|
1789
|
+
function checkRoleChange(role, input) {
|
|
1790
|
+
const name = role.key;
|
|
1791
|
+
const denials = [];
|
|
1792
|
+
const deny = (reason, detail) => {
|
|
1793
|
+
denials.push(compact({
|
|
1794
|
+
role: name,
|
|
1795
|
+
reason,
|
|
1796
|
+
detail
|
|
1797
|
+
}));
|
|
1798
|
+
};
|
|
1799
|
+
const kind = input.change?.kind;
|
|
1800
|
+
const target = input.change?.target;
|
|
1801
|
+
if (kind !== "assign" && kind !== "revoke" && kind !== "transfer" || target === null || typeof target !== "object") {
|
|
1802
|
+
deny("validation");
|
|
1803
|
+
return freezeDeep({
|
|
1804
|
+
ok: false,
|
|
1805
|
+
denials
|
|
1806
|
+
});
|
|
1807
|
+
}
|
|
1808
|
+
const roles = input.roles ?? [];
|
|
1809
|
+
const targetRoles = isReadonlyArray(target.roles) ? target.roles : [];
|
|
1810
|
+
const already = targetRoles.includes(name);
|
|
1811
|
+
let by = null;
|
|
1812
|
+
if (kind !== "transfer" && input.actorRoles !== void 0 && roles.some((rules) => rules.assigns !== void 0)) {
|
|
1813
|
+
const held = input.actorRoles;
|
|
1814
|
+
by = held.find((actorRole) => roles.find((rules) => rules.key === actorRole)?.assigns?.includes(name) === true) ?? null;
|
|
1815
|
+
if (by === null) deny("not-assignable-by", { held });
|
|
1816
|
+
}
|
|
1817
|
+
if (kind !== "revoke" && !already) {
|
|
1818
|
+
const kinds = role.for;
|
|
1819
|
+
if (kinds !== void 0 && (target.via === void 0 || !kinds.includes(target.via))) deny("not-allowed-for-membership", {
|
|
1820
|
+
via: target.via ?? null,
|
|
1821
|
+
for: kinds
|
|
1822
|
+
});
|
|
1823
|
+
const conflicts = new Set(role.exclusiveWith ?? []);
|
|
1824
|
+
for (const rules of roles) if (rules.exclusiveWith?.includes(name) === true) conflicts.add(rules.key);
|
|
1825
|
+
const clash = targetRoles.filter((held) => conflicts.has(held));
|
|
1826
|
+
if (clash.length > 0) deny("conflicting-role", { with: clash });
|
|
1827
|
+
}
|
|
1828
|
+
const delta = kind === "assign" ? already ? 0 : 1 : kind === "revoke" ? targetRoles.length > 0 && !already ? 0 : -1 : already ? -1 : 0;
|
|
1829
|
+
countRules(role, input.holders, delta, deny);
|
|
1830
|
+
return freezeDeep(denials.length === 0 ? {
|
|
1831
|
+
ok: true,
|
|
1832
|
+
by
|
|
1833
|
+
} : {
|
|
1834
|
+
ok: false,
|
|
1835
|
+
denials
|
|
1836
|
+
});
|
|
1837
|
+
}
|
|
1838
|
+
/** A declared binding's rules, by the name `checkRoleChange` reads. */
|
|
1839
|
+
function rulesOf(binding) {
|
|
1840
|
+
return compact({
|
|
1841
|
+
key: binding.name,
|
|
1842
|
+
min: binding.min,
|
|
1843
|
+
max: binding.max,
|
|
1844
|
+
transferOnly: binding.transferOnly,
|
|
1845
|
+
assigns: binding.assigns,
|
|
1846
|
+
for: binding.for,
|
|
1847
|
+
exclusiveWith: binding.exclusiveWith
|
|
1848
|
+
});
|
|
1849
|
+
}
|
|
1850
|
+
/**
|
|
1670
1851
|
* A live membership of the principal on the instance or on an instance under
|
|
1671
1852
|
* it: the one in-band fact that ties a nested instance to a tenant.
|
|
1672
1853
|
*/
|
|
@@ -1678,12 +1859,12 @@ function heldAnchor(principal, scopes, scope, id, now) {
|
|
|
1678
1859
|
* the instance's own principal; nothing in `change` can stand in for it.
|
|
1679
1860
|
*/
|
|
1680
1861
|
/**
|
|
1681
|
-
* Whether the subject of `permdock` may assign, revoke or transfer a role
|
|
1682
|
-
*
|
|
1683
|
-
* `
|
|
1684
|
-
*
|
|
1685
|
-
* instance's tenant comes from a live membership the subject holds on it,
|
|
1686
|
-
*
|
|
1862
|
+
* Whether the subject of `permdock` may assign, revoke or transfer a role in
|
|
1863
|
+
* one scope instance: `assigns`, the ceiling, `for`, `exclusiveWith`, `min`,
|
|
1864
|
+
* `max` and `transferOnly`. It never writes; the application does, and
|
|
1865
|
+
* generated RLS triggers re-check the holder counts at commit. A nested
|
|
1866
|
+
* instance's tenant comes from a live membership the subject holds on it, or
|
|
1867
|
+
* from `change.within` only with `{ trusted: true }`; otherwise
|
|
1687
1868
|
* `no-membership`. An instance built from a snapshot denies with
|
|
1688
1869
|
* `unsupported`.
|
|
1689
1870
|
*/
|
|
@@ -1745,10 +1926,10 @@ function decideRoleChangeWith(policy, principal, scopes, change, customRoles, au
|
|
|
1745
1926
|
deny("unknown-role");
|
|
1746
1927
|
return done(null);
|
|
1747
1928
|
}
|
|
1748
|
-
const scope = global ? "global" : resolveScope(scopes, change.scope);
|
|
1929
|
+
const scope = global ? "global" : resolveScope$1(scopes, change.scope);
|
|
1749
1930
|
const customAt = named.map((role) => customRoleScope(role, scopes));
|
|
1750
1931
|
const on = declared ? binding?.on ?? findRole(policy.vocabulary?.roles, name)?.on : customAt.includes(scope) ? scope : customAt[0];
|
|
1751
|
-
const heldAt = typeof on === "string" ? resolveScope(scopes, on) : global ? "global" : void 0;
|
|
1932
|
+
const heldAt = typeof on === "string" ? resolveScope$1(scopes, on) : global ? "global" : void 0;
|
|
1752
1933
|
if (scope === void 0 || heldAt === void 0 || heldAt !== scope) {
|
|
1753
1934
|
deny("scope", { expected: heldAt ?? null });
|
|
1754
1935
|
return done(null);
|
|
@@ -1758,7 +1939,7 @@ function decideRoleChangeWith(policy, principal, scopes, change, customRoles, au
|
|
|
1758
1939
|
let custom;
|
|
1759
1940
|
if (!global) {
|
|
1760
1941
|
const root = scopes[0]?.name;
|
|
1761
|
-
const supplied = change.within === void 0 ? void 0 : Object.entries(change.within).find(([key]) => resolveScope(scopes, key) === root)?.[1];
|
|
1942
|
+
const supplied = change.within === void 0 ? void 0 : Object.entries(change.within).find(([key]) => resolveScope$1(scopes, key) === root)?.[1];
|
|
1762
1943
|
if (scope === root) tenant = id;
|
|
1763
1944
|
else {
|
|
1764
1945
|
const anchor = heldAnchor(principal, scopes, scope, id, now);
|
|
@@ -1787,9 +1968,8 @@ function decideRoleChangeWith(policy, principal, scopes, change, customRoles, au
|
|
|
1787
1968
|
return done(null);
|
|
1788
1969
|
}
|
|
1789
1970
|
const self = target.id === principal.id;
|
|
1790
|
-
const targetRoles = isReadonlyArray(target.roles) ? target.roles : [];
|
|
1791
|
-
const already = targetRoles.includes(name);
|
|
1792
1971
|
let by = null;
|
|
1972
|
+
let actorRoles;
|
|
1793
1973
|
if (kind === "transfer") {
|
|
1794
1974
|
if (self) deny("self-demotion");
|
|
1795
1975
|
if (global ? (principal.roles ?? []).includes(name) : holdsAt(principal, name, scope, id, now)) by = name;
|
|
@@ -1799,24 +1979,26 @@ function decideRoleChangeWith(policy, principal, scopes, change, customRoles, au
|
|
|
1799
1979
|
const allowed = authority(tenant);
|
|
1800
1980
|
const revocable = kind === "revoke" && custom !== void 0 && allowed.inert?.has(name);
|
|
1801
1981
|
if (!allowed.assignable.has(name) && revocable !== true) deny("not-assignable-by");
|
|
1802
|
-
else if (custom === void 0 && usesAssigns(policy) && !allowed.manage)
|
|
1803
|
-
const held = global ? rankRoles(policy, (principal.roles ?? []).filter((role) => declaredRoleNames(policy).has(role))) : rolesAtInstance(policy, principal, scopes, scope, id, within, now);
|
|
1804
|
-
by = held.find((role) => bindingOf(policy, role)?.assigns?.includes(name) === true) ?? null;
|
|
1805
|
-
if (by === null) deny("not-assignable-by", { held });
|
|
1806
|
-
}
|
|
1982
|
+
else if (custom === void 0 && usesAssigns(policy) && !allowed.manage) actorRoles = global ? rankRoles(policy, (principal.roles ?? []).filter((role) => declaredRoleNames(policy).has(role))) : rolesAtInstance(policy, principal, scopes, scope, id, within, now);
|
|
1807
1983
|
}
|
|
1808
|
-
|
|
1809
|
-
|
|
1810
|
-
|
|
1811
|
-
|
|
1812
|
-
|
|
1813
|
-
|
|
1814
|
-
|
|
1815
|
-
|
|
1816
|
-
|
|
1817
|
-
|
|
1818
|
-
|
|
1819
|
-
|
|
1984
|
+
const conflicts = custom === void 0 ? conflictsWith(policy, name) : new Set(includedRoles(custom).flatMap((include) => Array.from(conflictsWith(policy, include))));
|
|
1985
|
+
const checked = checkRoleChange(compact({
|
|
1986
|
+
...binding === void 0 ? {} : rulesOf(binding),
|
|
1987
|
+
key: name,
|
|
1988
|
+
for: custom === void 0 ? binding?.for : customForKinds(policy, custom),
|
|
1989
|
+
exclusiveWith: [...conflicts],
|
|
1990
|
+
assigns: void 0
|
|
1991
|
+
}), compact({
|
|
1992
|
+
change: {
|
|
1993
|
+
kind,
|
|
1994
|
+
target
|
|
1995
|
+
},
|
|
1996
|
+
holders: change.holders,
|
|
1997
|
+
roles: actorRoles === void 0 ? void 0 : policy.roles.map(rulesOf),
|
|
1998
|
+
actorRoles
|
|
1999
|
+
}));
|
|
2000
|
+
if (checked.ok) by = actorRoles === void 0 ? by : checked.by;
|
|
2001
|
+
else denials.push(...checked.denials);
|
|
1820
2002
|
return done(by);
|
|
1821
2003
|
}
|
|
1822
2004
|
//#endregion
|
|
@@ -1839,8 +2021,8 @@ function field(value) {
|
|
|
1839
2021
|
return /[",\r\n]/u.test(text) ? `"${text.replaceAll("\"", "\"\"")}"` : text;
|
|
1840
2022
|
}
|
|
1841
2023
|
/**
|
|
1842
|
-
* One RFC 4180 row for a decision or approval event, without a line
|
|
1843
|
-
*
|
|
2024
|
+
* One RFC 4180 row for a decision or approval event, without a line terminator;
|
|
2025
|
+
* join rows with CRLF under a `CSV_COLUMNS` header.
|
|
1844
2026
|
*/
|
|
1845
2027
|
function toCsvRow(event) {
|
|
1846
2028
|
return [
|
|
@@ -1857,4 +2039,4 @@ function toCsvRow(event) {
|
|
|
1857
2039
|
].map(field).join(",");
|
|
1858
2040
|
}
|
|
1859
2041
|
//#endregion
|
|
1860
|
-
export {
|
|
2042
|
+
export { memoryCustomRoleSource as A, stripeEntitlementSource as C, validateApprovalPolicy as D, memoryApprovalPolicySource as E, sqlFunction as F, memoryMembershipSource as M, memorySettingsSource as N, defineOperations as O, memorySnapshotSource as P, memoryLimitStore as S, approvalPoliciesFor as T, arazzoFindings as _, normalizeMembership as a, memoryRelationSource as b, crud as c, snapshotFor as d, customRoleSource as f, localSnapshotManifest as g, defineApp as h, decideRoleChange as i, memoryEntitlementSource as j, isOperationEffect as k, readable as l, shadowMode as m, toCsvRow as n, normalizeMemberships as o, mayAccess as p, checkRoleChange as r, resolveScope as s, CSV_COLUMNS as t, writable as u, simulateArazzo as v, approvalPolicies as w, limits as x, signPolicyDocument as y };
|