permdock 0.6.0 → 0.8.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +2 -3
- package/dist/{2020-C9VN-x8c.js → 2020-CJbO8Bvz.js} +1 -3
- package/dist/a2a/index.d.ts +7 -7
- package/dist/a2a/index.js +9 -9
- package/dist/action-result-CL-QCITA.d.ts +19 -0
- package/dist/{adapter-context-CRhqyzCk.js → adapter-context-CIQpQxbE.js} +8 -2
- package/dist/{adoption-scan-DCYe60Pi.js → adoption-scan-BLs67P1l.js} +5 -5
- package/dist/agent/index.d.ts +3 -3
- package/dist/agent/index.js +1 -1
- package/dist/ai-sdk/index.d.ts +31 -10
- package/dist/ai-sdk/index.js +22 -12
- package/dist/{app-data-MuyzVqX8.js → app-data-UNNm07jV.js} +10 -7
- package/dist/{approval-header-CJACtHkv.js → approval-header-8QV6MU4H.js} +6 -3
- package/dist/{approval-prompt-Dg5LeAcT.js → approval-prompt-B8hQY69x.js} +5 -6
- package/dist/{approval-prompt-DvSSPQJX.d.ts → approval-prompt-PYagyQUj.d.ts} +13 -11
- package/dist/approvals/index.d.ts +5 -5
- package/dist/approvals/index.js +7 -7
- package/dist/{approvals-p1PGoVjb.js → approvals-DnIBTuXE.js} +128 -78
- package/dist/{approvers-CqPOLD-o.js → approvers-B4r0N_Uz.js} +8 -2
- package/dist/{arazzo-41WuzHou.js → arazzo-3RhGfkAK.js} +2 -2
- package/dist/{arazzo-CaUVBn7D.js → arazzo-B5-ulWif.js} +6 -6
- package/dist/{args-IIolxxKA.js → args-0FrVs5EH.js} +125 -8
- package/dist/astro/index.d.ts +30 -12
- package/dist/astro/index.js +2 -2
- package/dist/{audience-DabClFLQ.js → audience-BAkBDMqn.js} +8 -8
- package/dist/{auth-DRLEizbL.js → auth--yPyZNgr.js} +21 -10
- package/dist/authzen/index.d.ts +171 -25
- package/dist/authzen/index.js +321 -149
- package/dist/{automation-BNM3TtDo.d.ts → automation-DqEoWHBc.d.ts} +42 -32
- package/dist/{automation-DVjOckjV.js → automation-x3KEUusw.js} +22 -21
- package/dist/base-url-BQbddZO5.js +9 -0
- package/dist/better-auth/index.d.ts +2 -2
- package/dist/better-auth/index.js +13 -7
- package/dist/better-supabase/index.d.ts +392 -220
- package/dist/better-supabase/index.js +293 -152
- package/dist/{bind-DOyrv6zi.d.ts → bind-Cp2hBHzP.d.ts} +27 -12
- package/dist/{bind-CAvgUuKs.js → bind-D_sZSVA3.js} +22 -10
- package/dist/{body-CH5of8Ne.js → body-CJQwYVa8.js} +3 -3
- package/dist/{body-text-QcXok_SI.js → body-text-DQhcmqdY.js} +8 -4
- package/dist/{boundary-BM8a_P6E.js → boundary-BV3O1eud.js} +8 -2
- package/dist/{boundary-BmHxVH1J.d.ts → boundary-C9ck-3uK.d.ts} +13 -4
- package/dist/{budget-NbEtbJC_.js → budget-BELja5A9.js} +6 -3
- package/dist/{budget-JqcRqyhK.d.ts → budget-hYsPz_yE.d.ts} +6 -3
- package/dist/{build-instance-Bu_eDqYw.js → build-instance-CNWaYJyr.js} +3 -3
- package/dist/{canonical-json-BC8_nMTw.js → canonical-json-DwilZ1iB.js} +6 -3
- package/dist/{capability-N1K9IpqS.js → capability-BqX94r07.js} +31 -25
- package/dist/{capability-Drg-1YhL.d.ts → capability-ChuiONQU.d.ts} +41 -29
- package/dist/{casbin-Dyu2gnUD.js → casbin-H0rKxBx2.js} +16 -8
- package/dist/{casbin-Cr7RLtA3.js → casbin-cbSbhT_k.js} +2 -2
- package/dist/{casl-64gpT-8x.js → casl-C4OINZHI.js} +2 -2
- package/dist/{casl-DjEDhTCP.js → casl-CHHoCldP.js} +19 -10
- package/dist/catalog/index.d.ts +104 -23
- package/dist/catalog/index.js +117 -8
- package/dist/{catalog-HD2gf5mY.js → catalog-BFpz2EmT.js} +57 -26
- package/dist/{catalog-DZVbrF-z.js → catalog-DCspHDc8.js} +3 -3
- package/dist/{catalog-doc-Cdn7-0pQ.js → catalog-doc-DjMKzJp9.js} +53 -16
- package/dist/{catalog-fingerprint-CCP0-yQS.js → catalog-fingerprint-e6aCWosn.js} +19 -15
- package/dist/catalog-mRQQQhNK.js +1 -0
- package/dist/catalog-operations-Dadrl7Z-.js +60 -0
- package/dist/{create-CQWIpUG-.js → challenge-DImNcR7B.js} +157 -39
- package/dist/chat/index.d.ts +1 -1
- package/dist/chat/index.js +13 -10
- package/dist/chat-sdk/index.d.ts +44 -26
- package/dist/chat-sdk/index.js +17 -17
- package/dist/checks-CGkP3Z7A.js +40 -0
- package/dist/{claims-map-7oQ3ue4X.js → claims-map-CKkoAAYF.js} +5 -2
- package/dist/{claims-map-Ca-QX8C6.d.ts → claims-map-D1Pb5oRq.d.ts} +8 -5
- package/dist/claude-agent/index.d.ts +6 -6
- package/dist/claude-agent/index.js +6 -3
- package/dist/clerk/index.d.ts +11 -7
- package/dist/clerk/index.js +6 -6
- package/dist/cli/bin.js +4 -4
- package/dist/cli/index.d.ts +82 -7
- package/dist/cli/index.js +6 -6
- package/dist/{clients-C7zLFuWT.d.ts → clients-C_NOET3z.d.ts} +5 -5
- package/dist/{clients-DjU5ABMy.js → clients-DYr3U86j.js} +3 -3
- package/dist/cloud/index.d.ts +186 -38
- package/dist/cloud/index.js +293 -31
- package/dist/{cloud-ytQ3uviA.js → cloud-BFlGMaak.js} +5 -6
- package/dist/{codemod-5mpSpnUY.js → codemod-DLQ9Zpo4.js} +3 -4
- package/dist/{codemod-ua2hHy7w.js → codemod-DWSN2erG.js} +523 -201
- package/dist/collect-B5BL3klN.js +1 -0
- package/dist/{collect-mLTY4nwb.js → collect-B7ZFAJU3.js} +36 -64
- package/dist/{collect-Ci6akVwH.js → collect-Bzv3le0A.js} +6 -6
- package/dist/{compare-pfyVnBjE.js → compare-DTfyUunF.js} +2 -2
- package/dist/compile/index.d.ts +2 -2
- package/dist/compile/index.js +1 -1
- package/dist/{compile-1bsAezL0.d.ts → compile-BFzysW3o.d.ts} +36 -12
- package/dist/{compile-CMqMx_IN.js → compile-EzEMB-7v.js} +77 -33
- package/dist/{completion-BTFrHZhX.js → completion-saoYiRFO.js} +17 -8
- package/dist/config-BwPBfN0t.js +108 -0
- package/dist/{config-Bj2Ixq3d.js → config-DBeXXmBF.js} +2 -2
- package/dist/{config-report-DSpsLpCE.js → config-report-BipSWA6V.js} +9 -6
- package/dist/config-shape-ykV0Vm2n.js +134 -0
- package/dist/{connection-DjhIJSs2.js → connection-B72dg5Q2.js} +23 -22
- package/dist/connector-schema-CYLQNMYq.js +434 -0
- package/dist/{context-B_u3_bDJ.js → context-BnIzxTNE.js} +4 -3
- package/dist/convex/index.d.ts +13 -7
- package/dist/convex/index.js +9 -6
- package/dist/core-H-mbhpZc.js +341 -0
- package/dist/core-hWIARPDz.d.ts +206 -0
- package/dist/{create-CBMmFie-.d.ts → create-BSNrVuxh.d.ts} +87 -34
- package/dist/{create-B30OMUOJ.d.ts → create-BVq1lNQE.d.ts} +49 -28
- package/dist/{create-D_NmPOdH.d.ts → create-CM1FciYG.d.ts} +37 -29
- package/dist/{create-CGm28gyI.js → create-Cq4Uox0f.js} +13 -9
- package/dist/{create-DCF2SvoT.js → create-_noSrY1T.js} +15 -21
- package/dist/{credential-BcoiejpY.js → credential-CyyyvCsL.js} +42 -39
- package/dist/{credentials-DPyHmYz5.js → credentials-CdDxp7jN.js} +6 -6
- package/dist/{deciding-columns-Sq12mEA6.js → deciding-columns-NB4wcyBf.js} +13 -2
- package/dist/{delegation-j6-rc37o.js → delegation-CDB6_keF.js} +31 -22
- package/dist/delivery/index.d.ts +5 -5
- package/dist/delivery/index.js +6 -5
- package/dist/{delivery-DCAgNyCn.js → delivery-BupfvJIV.js} +81 -20
- package/dist/{delivery-event-xX4obB8F.js → delivery-event-JioK5YbS.js} +6 -6
- package/dist/denied-text-CHNlVInN.d.ts +22 -0
- package/dist/{describe-BybMRY7A.js → describe-Bb4hGK5d.js} +6 -5
- package/dist/{describe-B5qgDvEW.d.ts → describe-ByS9LgHK.d.ts} +5 -5
- package/dist/{device-BARQ8eYG.js → device-BwbJNmb2.js} +11 -8
- package/dist/{diff-CmuSD3vc.js → diff-CN8IYhC_.js} +2 -2
- package/dist/{diff-3jbx6Rm4.js → diff-iZWV65nC.js} +23 -14
- package/dist/{digest-B3kc_PgQ.d.ts → digest-8Yx2CchM.d.ts} +3 -3
- package/dist/{doctor-BdZw53-k.js → doctor-CHD1M9R5.js} +485 -141
- package/dist/{doctor-3ZqNHX_G.js → doctor-D3wo-yuz.js} +4 -4
- package/dist/drizzle/index.d.ts +33 -19
- package/dist/drizzle/index.js +17 -9
- package/dist/elysia/index.d.ts +17 -11
- package/dist/elysia/index.js +5 -5
- package/dist/{errors-BKy0EfhN.js → errors-B6R_lg2a.js} +13 -4
- package/dist/{errors-BWXBMaKK.d.ts → errors-CHwoRRpB.d.ts} +4 -1
- package/dist/{errors-CWTY6uih.js → errors-Vpu6rKHl.js} +14 -10
- package/dist/{errors-DH5QEGXh.d.ts → errors-zi_4T-rx.d.ts} +22 -6
- package/dist/{evaluate-CNClBvcj.js → evaluate-Dd8Ta0Ie.js} +185 -80
- package/dist/{evaluations-beAooV0n.js → evaluations-IBceAeKT.js} +41 -20
- package/dist/{evaluations-C_1vdSZc.d.ts → evaluations-z8dQFDaN.d.ts} +12 -6
- package/dist/eve/index.d.ts +9 -6
- package/dist/eve/index.js +4 -4
- package/dist/{event-time-CsegxXxB.js → event-time-BGy48400.js} +8 -4
- package/dist/{expiry-D4_YKRKD.js → expiry-6XByK0dm.js} +8 -5
- package/dist/express/index.d.ts +9 -6
- package/dist/express/index.js +9 -6
- package/dist/fastify/index.d.ts +16 -10
- package/dist/fastify/index.js +8 -5
- package/dist/{fetch-adapter-Dw0MTS3D.d.ts → fetch-adapter-C1DCvpqV.d.ts} +9 -6
- package/dist/{fetch-adapter-DD_gfmrC.js → fetch-adapter-JL43jD3E.js} +14 -11
- package/dist/fields-D0vUI6dq.js +498 -0
- package/dist/{files-C5ZI27eV.js → files-B3AA05f1.js} +21 -5
- package/dist/{files-D_JIzUrP.js → files-BSjrtIHw.js} +11 -4
- package/dist/{fixtures-B7XrLeY7.js → fixtures-A1_sp_tR.js} +15 -6
- package/dist/{flags-C3DktBDY.js → flags-DXjoTVbS.js} +2 -2
- package/dist/{freeze-CrU8nQeX.js → freeze-jjan0lCv.js} +4 -1
- package/dist/{from-snapshot-CTCMsFZk.js → from-snapshot-DCakWRsr.js} +26 -16
- package/dist/gen-B5kvbAoZ.js +58 -0
- package/dist/gen-DWCYcMQM.js +827 -0
- package/dist/generate-CRVV5V7l.js +165 -0
- package/dist/generate-CezbCaTI.js +275 -0
- package/dist/{grantee-hxrUsbpM.js → grantee-Dke-9rd1.js} +4 -4
- package/dist/{grantee-conditions-CcXf8hMM.js → grantee-conditions-BrYPe-w0.js} +12 -12
- package/dist/{grantee-match-DbENBHLB.js → grantee-match-7RZZvoT_.js} +12 -6
- package/dist/{graph-sql-B-dsAT6j.d.ts → graph-sql-BwFC4Qjs.d.ts} +3 -3
- package/dist/h3/index.d.ts +10 -7
- package/dist/h3/index.js +3 -3
- package/dist/headers-B9jQxjtW.d.ts +10 -0
- package/dist/{helpers-CBYVMjwh.js → helpers-DJicaG6f.js} +40 -28
- package/dist/hono/index.d.ts +16 -10
- package/dist/hono/index.js +5 -5
- package/dist/{hosted-BPk51-kX.d.ts → hosted-Cmtxogd0.d.ts} +44 -20
- package/dist/{hosted-B46-5LYE.js → hosted-D0IzESu_.js} +68 -25
- package/dist/{http-ujKm0JXE.js → http-DH94eh6f.js} +4 -4
- package/dist/{http-BBoKefeS.js → http-DKLXrFGk.js} +13 -7
- package/dist/{http-DXJ37RDA.js → http-DOL33cO0.js} +11 -8
- package/dist/{import-wyqXUyjm.js → import-CST57XLp.js} +64 -51
- package/dist/{import-CNV7I2Dw.js → import-_YqhhwvX.js} +6 -6
- package/dist/{index-B8YjkEZ4.d.ts → index-B8s204GL.d.ts} +64 -52
- package/dist/{index-Ch8LpNDp.d.ts → index-BT5-1VsX.d.ts} +64 -25
- package/dist/{index-DuWxc5dt.d.ts → index-BW_0MZOS.d.ts} +388 -149
- package/dist/index-BhxEUY9J.d.ts +233 -0
- package/dist/index-Bv5iXPqU.d.ts +210 -0
- package/dist/{index-C-6Letxg.d.ts → index-_9UiQIkt.d.ts} +164 -77
- package/dist/index.d.ts +22 -21
- package/dist/index.js +35 -33
- package/dist/{init-GG6Jh8HD.js → init-Dz_PsHdv.js} +5 -5
- package/dist/{init-DeMYsnYJ.js → init-cE3A8aXq.js} +10 -10
- package/dist/{instance-options-BsVpyGIk.d.ts → instance-options-B0KXqTrJ.d.ts} +4 -4
- package/dist/{instance-snapshot-BOEhcqIF.js → instance-snapshot--JWiTrvO.js} +81 -56
- package/dist/{instant-BluqDvyS.js → instant-DK3Iz83e.js} +2 -2
- package/dist/{internals-Dk8A8fX3.js → internals-B3IgHrvo.js} +6 -3
- package/dist/{json-schema-B-vAwlde.js → json-schema-BPGa-RjQ.js} +9 -3
- package/dist/{json-schema-CN_iLFH2.d.ts → json-schema-BfXgnRNT.d.ts} +4 -4
- package/dist/jwt/index.d.ts +125 -17
- package/dist/jwt/index.js +157 -16
- package/dist/{kernel-D0NVb1cK.js → kernel-C-fYydV2.js} +151 -16
- package/dist/kysely/index.d.ts +49 -33
- package/dist/kysely/index.js +9 -7
- package/dist/{live-options-BaAFCIiu.js → live-options-BBIT68le.js} +2 -2
- package/dist/{load-DFS_ry0W.js → load-DjSU5KXO.js} +6 -6
- package/dist/load-Dm0pSYH3.js +1 -0
- package/dist/{login-Dfe5RlYk.js → login-D-8tMqzo.js} +4 -4
- package/dist/{login-imhuwvn3.js → login-DplQ0s84.js} +18 -15
- package/dist/{manifest-dvL2XEe1.js → manifest-Cgiq5oqc.js} +67 -37
- package/dist/{manifest-mx5ghSFM.d.ts → manifest-CzzWtnAb.d.ts} +144 -28
- package/dist/{manifest-schema-C0kK_8V0.js → manifest-schema-2r37XRhD.js} +80 -9
- package/dist/{manifest-C8IzW3Do.js → manifest-wg8WkkpD.js} +11 -7
- package/dist/{map-claims-D3oRmTk0.js → map-claims-BNWCJtmP.js} +27 -18
- package/dist/{map-error-Dr70oA_3.js → map-error-pasIGqMT.js} +7 -7
- package/dist/{markers-C6joDI3o.js → markers-BeHZ4x9Q.js} +20 -5
- package/dist/mcp/index.d.ts +154 -47
- package/dist/mcp/index.js +200 -41
- package/dist/{migrate-CIq4-E9F.js → migrate-B7oP_sQU.js} +102 -31
- package/dist/module-values-BJTBdo6y.js +107 -0
- package/dist/nest/index.d.ts +23 -13
- package/dist/nest/index.js +18 -11
- package/dist/next/client.d.ts +5 -2
- package/dist/next/client.js +1 -1
- package/dist/next/index.d.ts +72 -26
- package/dist/next/index.js +110 -6
- package/dist/next/plugin.d.ts +1 -1
- package/dist/next/plugin.js +4 -3
- package/dist/node/index.d.ts +5 -5
- package/dist/node/index.js +3 -3
- package/dist/{ocsf-BFp-PZZA.js → ocsf-TcjRBgIs.js} +15 -5
- package/dist/openai/index.d.ts +13 -7
- package/dist/openai/index.js +3 -3
- package/dist/openapi/index.d.ts +61 -30
- package/dist/openapi/index.js +2 -2
- package/dist/{openapi-B7HZ0f-r.js → openapi-BOsx0xn9.js} +34 -24
- package/dist/{openapi-C4dDTVEd.js → openapi-CBZUhA3l.js} +4 -5
- package/dist/{openapi-DD1SV-5-.js → openapi-VeHHU2l9.js} +23 -14
- package/dist/{operation-findings-DgATDpvh.js → operation-findings-CXtFzlKJ.js} +3 -3
- package/dist/{operations-X0VM7F3m.d.ts → operations-Ci_rT6Uo.d.ts} +10 -7
- package/dist/orpc/index.d.ts +68 -14
- package/dist/orpc/index.js +62 -13
- package/dist/otel/index.d.ts +7 -4
- package/dist/otel/index.js +8 -5
- package/dist/output-files-BHOIlrfD.js +1 -0
- package/dist/{output-files-DhRBBE4n.js → output-files-BIQ_9pIs.js} +29 -17
- package/dist/{output-1im__-08.js → output-tkju6U7R.js} +15 -7
- package/dist/ownership-B4L59T9u.js +1054 -0
- package/dist/parse-1_ZheTW5.js +151 -0
- package/dist/parse-local-manifest-BQhTlLQS.d.ts +10 -0
- package/dist/parse-local-manifest-DEiCF4ah.js +69 -0
- package/dist/{parse-request-D_tUXG6M.js → parse-request-CwCZpyjV.js} +7 -8
- package/dist/{paths-DXSHAMIa.js → paths-CUvURzHp.js} +4 -1
- package/dist/pdp/index.d.ts +9 -6
- package/dist/pdp/index.js +23 -12
- package/dist/{peer-CRvC7Hg1.js → peer-C9LvBCcb.js} +1 -1
- package/dist/peer-Q0fuZ6hx.js +982 -0
- package/dist/{permdock-SV8ZINYT.d.ts → permdock-B6Sf4T_S.d.ts} +270 -117
- package/dist/{permdock-BrAscV28.js → permdock-L-_I_3zP.js} +226 -74
- package/dist/{permission-registry-Br4jSNVi.js → permission-registry-B8tYxPIt.js} +24 -11
- package/dist/{vocabulary-CN8H_9UF.d.ts → permission-types-CAY-GU7e.d.ts} +130 -104
- package/dist/{permissions-u_KHg-sN.d.ts → permissions-Bx6UI8n1.d.ts} +6 -2
- package/dist/{permissions-B-wCP5ZC.js → permissions-CVXmRILq.js} +3 -3
- package/dist/{permissions-BPxlwVhN.js → permissions-mDcTWoBs.js} +8 -5
- package/dist/pg-DQTqRrou.js +60 -0
- package/dist/{pins-8ILTftC9.js → pins-nqarl3oE.js} +4 -1
- package/dist/pkce-CnmmYqUZ.js +21 -0
- package/dist/{policy-77FSAq_V.d.ts → policy-Ba4bDhaj.d.ts} +5 -5
- package/dist/{policy-DbM5YYtV.js → policy-CLQ8__GF.js} +49 -20
- package/dist/{policy-from-catalog-C2gMa2Dj.js → policy-from-catalog-CJgOm6aq.js} +28 -25
- package/dist/{policy-module-CTlwMvLI.js → policy-module-xym9fnSq.js} +12 -6
- package/dist/{policy-types-n0uRTsW8.d.ts → policy-types-CCiDRZBH.d.ts} +802 -334
- package/dist/postgres-store-DcyrPS-r.js +1028 -0
- package/dist/{postgrest-DAjUkF9w.js → postgrest-D4nuPXIQ.js} +88 -36
- package/dist/{postgrest-CEgRbefE.d.ts → postgrest-DicQyqm-.d.ts} +60 -30
- package/dist/powersync-DHNQX06W.js +1117 -0
- package/dist/{powersync-DISt6SUe.js → powersync-DXqGuq9A.js} +3 -3
- package/dist/powersync-Djf-zCpB.js +1 -0
- package/dist/preset/index.d.ts +38 -28
- package/dist/preset/index.js +1 -1
- package/dist/{preset-DZdU0tne.js → preset-BjLzeFpp.js} +58 -34
- package/dist/{principal-source-pHneukrx.js → principal-source-C6N60GtM.js} +10 -10
- package/dist/prisma/index.d.ts +69 -41
- package/dist/prisma/index.js +21 -17
- package/dist/{problem-CTviyH5L.js → problem-BVLHFK33.js} +41 -21
- package/dist/{problem-details-cn5X30gZ.js → problem-details-CLDgX1KV.js} +13 -4
- package/dist/{problem-types-CJ2325SZ.js → problem-types-DSsRfONQ.js} +4 -1
- package/dist/prompt-BYc6drYW.js +938 -0
- package/dist/protected-action-BE7N_Luo.d.ts +58 -0
- package/dist/protected-action-DUYqb-Ma.js +80 -0
- package/dist/{protected-BlF0F6wL.js → protected-action-QEA8arRB.js} +48 -14
- package/dist/{provider-B1al-AZz.js → provider-C55OGXJ7.js} +5 -4
- package/dist/{provider-DILL9oPK.d.ts → provider-DXfq5c2d.d.ts} +1 -1
- package/dist/{provider-store-DM6DNcta.js → provider-store-CaTv00tr.js} +13 -9
- package/dist/pull-B65ndFNZ.js +1 -0
- package/dist/{pull-jEwbf80J.js → pull-CwpGaQSi.js} +12 -11
- package/dist/{push-BD4f15co.js → push-DgssgzkK.js} +62 -16
- package/dist/{pushed-policy-DCW91KQU.d.ts → pushed-policy-D1Eoi6NM.d.ts} +12 -6
- package/dist/{pushed-policy-CqtxkV4G.js → pushed-policy-ITwYKvvH.js} +10 -7
- package/dist/react/index.d.ts +9 -8
- package/dist/react/index.js +7 -6
- package/dist/react/provider-client.d.ts +1 -1
- package/dist/react/provider-client.js +1 -1
- package/dist/react-native/index.d.ts +104 -51
- package/dist/react-native/index.js +394 -67
- package/dist/{refs-K6eWUJ0H.js → refs-C8BKxc_e.js} +17 -3
- package/dist/{relation-walk-3OyDBF0S.js → relation-walk-DK_gkgL7.js} +12 -9
- package/dist/{relations-BnCWnJGI.js → relations-BxvRvDHK.js} +3 -3
- package/dist/{replay-Du1tJjG7.js → replay-BU09ad4L.js} +1 -1
- package/dist/{replay-Bkm-Ne4l.d.ts → replay-DNftIb_R.d.ts} +1 -1
- package/dist/{request-context-C81Pip9n.js → request-context-C25ilqiJ.js} +8 -8
- package/dist/{request-schema-CMreVuFM.js → request-schema-DhX7UbfQ.js} +4 -1
- package/dist/resend/index.d.ts +34 -28
- package/dist/resend/index.js +29 -29
- package/dist/resolve-names-CF7xXLSG.js +201 -0
- package/dist/{resource-relations-D_jw0BFx.js → resource-relations-8-pCScBO.js} +18 -9
- package/dist/{retire-CALjIQ7e.js → retire-B2xffQgY.js} +15 -6
- package/dist/{revocations-R07lFBnX.d.ts → revocations-BaUXHM1N.d.ts} +6 -3
- package/dist/{rls-DTvYd-lI.js → rls-CNEH2_BG.js} +743 -624
- package/dist/{rls-BAqP4q66.js → rls-Ca8Jz9b5.js} +41 -10
- package/dist/{role-builder-uWQZ4v84.js → role-builder-BK2-T6oD.js} +41 -20
- package/dist/rolldown-runtime-C3I60J0A.js +4 -0
- package/dist/{row-conditions-h2HythXQ.js → row-conditions-BAGHOmVq.js} +4 -3
- package/dist/{rpc-VSl5ylaQ.js → rpc-fNqAIqQk.js} +8 -5
- package/dist/{run-CUKuz0A8.js → run-Bz26OTfO.js} +26 -23
- package/dist/run-D-JE8QWb.js +1 -0
- package/dist/{run-ticket-DocwaTKn.d.ts → run-ticket-DbWI9f99.d.ts} +33 -13
- package/dist/{run-ticket-sxFI6LAk.js → run-ticket-Dv7aF7Dk.js} +29 -8
- package/dist/{runtime-D3VTAiCA.js → runtime-BGnrOkVH.js} +5 -2
- package/dist/{saas-BCXRuXca.js → saas-iWnUdwCt.js} +42 -29
- package/dist/{scan-qvOe0hS3.js → scan-DCj1KQfn.js} +1 -1
- package/dist/{schema-B4v0Qrac.js → schema-BOJjqlWL.js} +3 -2
- package/dist/{schema-yLuBWWsh.js → schema-Dst9I9Gs.js} +9 -5
- package/dist/scim/index.d.ts +3 -2
- package/dist/scim/index.js +3 -1
- package/dist/scim-D8YupzX1.js +44 -0
- package/dist/{scim-ClHtpyV3.js → scim-jJBJ7g1Z.js} +35 -551
- package/dist/{scopes-CUPSjo9q.js → scopes-0Up_UA2t.js} +42 -24
- package/dist/server/index.d.ts +12 -12
- package/dist/server/index.js +13 -13
- package/dist/{server-C3WXAHZj.js → server-3cVlTLde.js} +31 -31
- package/dist/{server-types-CKQiCnON.d.ts → server-types-CIlpSA2G.d.ts} +81 -46
- package/dist/{sha256-D9ihqmvd.js → sha256-C-4WXKIu.js} +4 -3
- package/dist/{shared-BAK8t4Uo.js → shared-Afctg7B0.js} +100 -61
- package/dist/{shared-DvvFzYXe.js → shared-l0oGGetg.js} +9 -6
- package/dist/{signals-D3NcTKUS.js → signals-B1vHR3fN.js} +2 -2
- package/dist/{sink-BEZSlMS_.js → sink-D9_vh372.js} +32 -21
- package/dist/{sink-4-eQIRWf.d.ts → sink-Dvi7YZG_.d.ts} +44 -20
- package/dist/{skills-B6lVdD_W.js → skills-Bjj7BNEQ.js} +16 -12
- package/dist/{skills-CTYwkl44.js → skills-OuoMR49L.js} +3 -3
- package/dist/{snapshot-B7DkYg6g.js → snapshot-CXlzi69u.js} +21 -18
- package/dist/{snapshot-cache-PXI-vGpY.d.ts → snapshot-cache-BAXZ0KOp.d.ts} +21 -12
- package/dist/{snapshot-cache-DZHQ0KF6.js → snapshot-cache-Bx_4xC_6.js} +14 -11
- package/dist/solid/index.d.ts +55 -15
- package/dist/solid/index.js +46 -12
- package/dist/solid-start/index.d.ts +30 -12
- package/dist/solid-start/index.js +3 -3
- package/dist/sources-B1Os_YUu.d.ts +312 -0
- package/dist/{sources-vs5dGOsS.js → sources-CMAM-2A3.js} +156 -51
- package/dist/sources-qoIJQrJv.js +11 -0
- package/dist/{sql-B5T1IL83.js → sql-0WjxIp9g.js} +32 -7
- package/dist/sql-B80DFdpG.d.ts +10 -0
- package/dist/{src-Cu2m75uo.js → src-DZ0l9UAg.js} +305 -123
- package/dist/ssf/index.d.ts +4 -4
- package/dist/ssf/index.js +665 -224
- package/dist/{standard-webhooks-rbD7LS6h.d.ts → standard-webhooks-C-qX4mJW.d.ts} +7 -7
- package/dist/{standard-webhooks-DgFFD-Ga.js → standard-webhooks-D67a3nzk.js} +5 -5
- package/dist/{store-BDutJkDL.js → store-RNFvaJJv.js} +43 -29
- package/dist/{store-options-u0ycEe8s.js → store-options-Dil3lraY.js} +105 -15
- package/dist/stores-C0Kta5Ft.d.ts +59 -0
- package/dist/{stores-CGhM8BN_.js → stores-DxZWDXCs.js} +42 -5
- package/dist/{stream-CvdUS9V1.js → stream-CDvF0sJm.js} +5 -5
- package/dist/{stream-CeCMJmBB.d.ts → stream-ltuLdtTG.d.ts} +4 -3
- package/dist/{style-DiKWnAvn.js → style-DblOtSga.js} +1 -1
- package/dist/{style-Uao76wO7.js → style-Ds11Hmk4.js} +3 -1
- package/dist/{subject-settings-CkEwrw3W.js → subject-settings-8sH5HlII.js} +8 -4
- package/dist/{row-check-Dt35czLy.d.ts → subject-settings-vNW8qmUH.d.ts} +30 -18
- package/dist/supabase/index.d.ts +48 -37
- package/dist/supabase/index.js +6 -6
- package/dist/supabase/middleware.d.ts +19 -13
- package/dist/supabase/middleware.js +7 -7
- package/dist/{supabase-x5JtR2tc.js → supabase-BL1qJzzY.js} +82 -36
- package/dist/{supabase-By_frk3U.js → supabase-D39cuGPt.js} +3 -3
- package/dist/{supabase-hook-BMoEhZir.js → supabase-hook-B-yXnzUl.js} +1206 -286
- package/dist/supabase-hook-H-MtE9Wd.js +1 -0
- package/dist/supautils-BU-pAEpf.js +808 -0
- package/dist/{support-session-C6xJQYut.js → support-session-BsmPCbz8.js} +22 -22
- package/dist/svelte/PermissionBoundary.svelte +2 -6
- package/dist/svelte/Protected.svelte +2 -8
- package/dist/svelte/index.d.ts +9 -8
- package/dist/svelte/index.js +10 -9
- package/dist/svelte/runtime.d.ts +4 -4
- package/dist/svelte/runtime.js +4 -4
- package/dist/svelte/source.d.ts +9 -8
- package/dist/svelte/source.js +6 -5
- package/dist/sveltekit/index.d.ts +30 -12
- package/dist/sveltekit/index.js +2 -2
- package/dist/{ownership-DqaJNJPn.js → tables-DeMNEy6V.js} +1025 -1085
- package/dist/tanstack-start/index.d.ts +22 -10
- package/dist/tanstack-start/index.js +2 -2
- package/dist/{target-Bw37TFNA.js → target-qdEAnnhU.js} +6 -6
- package/dist/{tenancy-DN2QAx9z.js → tenancy-5d1zVBvK.js} +36 -21
- package/dist/terminal/index.d.ts +23 -14
- package/dist/terminal/index.js +17 -20
- package/dist/testing/core.d.ts +2 -0
- package/dist/testing/core.js +1 -0
- package/dist/testing/fixtures/index.d.ts +15 -0
- package/dist/testing/fixtures/index.js +831 -0
- package/dist/testing/index.d.ts +235 -285
- package/dist/testing/index.js +502 -927
- package/dist/testing/saas/index.d.ts +43 -27
- package/dist/testing/saas/index.js +2 -2
- package/dist/testing/saas/permissions.d.ts +1 -1
- package/dist/testing/saas/permissions.js +1 -1
- package/dist/text-diff-BtfSmdUo.js +444 -0
- package/dist/{thenable-yD7SabqG.js → thenable-BNSM1U2R.js} +12 -3
- package/dist/{time-DkWjdL98.js → time-nR1JesoH.js} +32 -8
- package/dist/{token-BLZcjQgt.js → token-DC9EQiet.js} +15 -13
- package/dist/{tool-refusal-CMLN5xhn.js → tool-refusal-Qpjs_W6M.js} +5 -2
- package/dist/trpc/index.d.ts +11 -8
- package/dist/trpc/index.js +15 -9
- package/dist/type-helpers-BIPIDa6a.d.ts +50 -0
- package/dist/{types-8RnwUAvE.d.ts → types-AMJ5qoU_.d.ts} +49 -30
- package/dist/{types-C_IiEs64.d.ts → types-B2mlGuhW.d.ts} +14 -11
- package/dist/{types-_WhUP7ud.d.ts → types-B4uqKDnp.d.ts} +25 -12
- package/dist/{types-CX7AvRqP.d.ts → types-BJk0BKRX.d.ts} +24 -14
- package/dist/types-B_d_g7T3.d.ts +262 -0
- package/dist/{types-BdtSDbBO.d.ts → types-B_tiYvk8.d.ts} +59 -32
- package/dist/{types-DqzsnlSA.js → types-CcUXciSj.js} +17 -5
- package/dist/{types-Dfv0aTER.d.ts → types-DC1Loeh3.d.ts} +449 -168
- package/dist/{types-lUlG3TVd.d.ts → types-DHKPcqzr.d.ts} +2 -2
- package/dist/{types-C791HFu9.d.ts → types-DjuMBNF9.d.ts} +68 -32
- package/dist/{types-C863OQiR.d.ts → types-HzqOtvsJ.d.ts} +23 -12
- package/dist/{types-Druu9wLM.d.ts → types-ZzRGoViD.d.ts} +77 -24
- package/dist/{types-BzzaHxt3.d.ts → types-ah9NlU6j.d.ts} +137 -48
- package/dist/{types-CVZSNocA.d.ts → types-djVzLlIV.d.ts} +31 -14
- package/dist/{types-BtHtcKMr.d.ts → types-yUuPR5Hy.d.ts} +47 -24
- package/dist/unplugin/index.d.ts +1 -1
- package/dist/unplugin/index.js +2 -2
- package/dist/usage-CYeXek0p.js +1 -0
- package/dist/{usage-SveTRTyr.js → usage-CxEzS4ey.js} +50 -26
- package/dist/{usage-CRVl9V3t.js → usage-ab0PdusX.js} +2 -2
- package/dist/{validation-error-ZfUHbKvf.js → validation-error-CYg2kJEw.js} +4 -1
- package/dist/{validation-error-DHUrAkku.d.ts → validation-error-YGg2mXyH.d.ts} +5 -2
- package/dist/{validity-CZ7-y0Cj.js → validity-Buc7w8E9.js} +13 -10
- package/dist/{verifier-DHuh-okk.js → verifier-DUV6pLqZ.js} +10 -4
- package/dist/{verify-BaAKx7t6.js → verify-DZeqoWu5.js} +417 -489
- package/dist/version-DMQ0dnN5.js +48 -0
- package/dist/version-DizhmD72.js +1 -0
- package/dist/{views-DTIIO-oQ.js → views-CD8wuL4Z.js} +19 -6
- package/dist/vocabulary-DEJ5j4mR.d.ts +70 -0
- package/dist/vue/index.d.ts +71 -21
- package/dist/vue/index.js +50 -13
- package/dist/{waiter-B986w1oK.d.ts → waiter-Bu9zAlE0.d.ts} +13 -10
- package/dist/{waiter-BGUtGYoU.js → waiter-aBLM63_f.js} +1 -1
- package/dist/{watch-vea54PRw.js → watch-Cx_WciLE.js} +8 -8
- package/dist/watch-DB42U1ib.js +1 -0
- package/dist/webmcp/index.d.ts +11 -11
- package/dist/webmcp/index.js +8 -5
- package/dist/{where-scope-C9vfEphl.js → where-scope-DlCdCM_8.js} +56 -30
- package/dist/{who-can-DWBAcaCQ.js → who-can-rI7dCR9Q.js} +23 -20
- package/dist/workflow/index.d.ts +3 -3
- package/dist/workflow/index.js +13 -13
- package/dist/workflow-sdk/index.d.ts +19 -13
- package/dist/workflow-sdk/index.js +6 -6
- package/dist/{wrap-gX61EtpB.js → wrap-B2wziJI_.js} +11 -5
- package/dist/{wrap-C5jC6sKI.d.ts → wrap-DlJE3gS_.d.ts} +8 -5
- package/package.json +25 -14
- package/schemas/catalog-v1.json +3 -0
- package/schemas/cli-result-v1.json +1 -0
- package/schemas/cloud-api-v1.json +152 -7
- package/schemas/connector-v1.json +8 -0
- package/schemas/supabase-claims-v1.json +5 -0
- package/schemas/supabase-manifest-v1.json +308 -75
- package/skills/permdock/SKILL.md +1 -0
- package/skills/permdock-agents/references/runtimes.md +3 -1
- package/skills/permdock-approvals/references/stores-and-resume.md +2 -1
- package/skills/permdock-credentials/references/tokens-keys-links.md +8 -6
- package/skills/permdock-data/references/queries-and-rls.md +6 -2
- package/skills/permdock-tenancy/SKILL.md +1 -1
- package/skills/permdock-tenancy/references/ownership-and-custom-roles.md +2 -1
- package/skills/permdock-wire/references/adapters.md +28 -22
- package/skills/permdock-wire/references/policy-options.md +1 -0
- package/dist/catalog-BoWglDPI.js +0 -1
- package/dist/collect-D7eQDffE.js +0 -1
- package/dist/config-bs_kZeYq.js +0 -162
- package/dist/denied-text-CiFQNuMV.d.ts +0 -19
- package/dist/fields-OYG_JR78.js +0 -203
- package/dist/generate-CNU1pIOo.js +0 -171
- package/dist/headers-BIjfMaoC.js +0 -8
- package/dist/headers-CIbDTUTK.d.ts +0 -7
- package/dist/index-Cp_ilKi1.d.ts +0 -91
- package/dist/index-CueFnxQc.d.ts +0 -110
- package/dist/load-BxEtwlBS.js +0 -1
- package/dist/output-files-B3IZJksC.js +0 -1
- package/dist/package-root-Dk_ETdkp.js +0 -31
- package/dist/parse-Cxq0WxrA.js +0 -53
- package/dist/parse-local-manifest-5ODwqu8b.d.ts +0 -10
- package/dist/parse-local-manifest-CVSs6J9I.js +0 -34
- package/dist/peer-C8swJ2GH.js +0 -50
- package/dist/policies-DP2nqRoF.js +0 -295
- package/dist/powersync-BkWWCS1K.js +0 -538
- package/dist/powersync-MMJ2mI2q.js +0 -1
- package/dist/problem-details-B45V5d2b.d.ts +0 -7
- package/dist/prompt-DfZLJLIn.js +0 -32
- package/dist/protected-RFGpakN9.d.ts +0 -38
- package/dist/pull-CvpINcMK.js +0 -1
- package/dist/run-DDwUaJDU.js +0 -1
- package/dist/sources-Xc4zkszI.d.ts +0 -190
- package/dist/stores-BUGNbJTt.d.ts +0 -30
- package/dist/supabase-hook-CCw5m35C.js +0 -1
- package/dist/supautils-B6HYL9eL.js +0 -91
- package/dist/text-diff-BQcUapOb.js +0 -15
- package/dist/types-B3_ooZgZ.d.ts +0 -172
- package/dist/usage-CZpSQP6L.js +0 -1
- package/dist/version-CEbQ5UeM.js +0 -18
- package/dist/version-DXkYUISx.js +0 -1
- package/dist/watch--ovlPOc0.js +0 -1
package/dist/testing/index.d.ts
CHANGED
|
@@ -1,179 +1,34 @@
|
|
|
1
|
-
import { J as EntitlementSource, K as DecisionProvider, Q as LimitStore, T as Policy, U as CredentialVerifier,
|
|
2
|
-
import {
|
|
3
|
-
import {
|
|
4
|
-
import {
|
|
5
|
-
import {
|
|
6
|
-
import {
|
|
7
|
-
import { a as
|
|
8
|
-
import {
|
|
9
|
-
import { c as
|
|
10
|
-
import {
|
|
11
|
-
import {
|
|
12
|
-
import {
|
|
13
|
-
import {
|
|
14
|
-
import {
|
|
15
|
-
import {
|
|
16
|
-
import {
|
|
17
|
-
import { t as
|
|
18
|
-
import {
|
|
19
|
-
import {
|
|
20
|
-
import {
|
|
21
|
-
import {
|
|
22
|
-
import {
|
|
23
|
-
import {
|
|
1
|
+
import { Gt as Snapshot, J as EntitlementSource, K as DecisionProvider, Q as LimitStore, T as Policy, U as CredentialVerifier, W as CustomRoleSource, at as SettingsSource, dt as TokenVerifier, et as MembershipSource, it as RelationSource, lr as Subject, mt as WhereCompiler, or as Membership, ot as SnapshotSource, q as DecisionSink, sr as Principal, st as SubjectResolver, tn as DeliveryChannel, ut as TokenSigner } from "../policy-types-CCiDRZBH.js";
|
|
2
|
+
import { g as ResourceInit, l as InferPermissionTree, u as Permission } from "../permission-types-CAY-GU7e.js";
|
|
3
|
+
import { r as Role } from "../vocabulary-DEJ5j4mR.js";
|
|
4
|
+
import { st as LegacyCheck } from "../index-BW_0MZOS.js";
|
|
5
|
+
import { D as ApprovalPolicySource, _ as PrincipalSource, a as PermDock, b as Limits, h as PrincipalIdentity } from "../permdock-B6Sf4T_S.js";
|
|
6
|
+
import { s as PolicySource } from "../hosted-Cmtxogd0.js";
|
|
7
|
+
import { a as ApprovalDelegationSource, m as ApprovalStore } from "../types-B_tiYvk8.js";
|
|
8
|
+
import { a as ProblemDetails } from "../errors-zi_4T-rx.js";
|
|
9
|
+
import { c as ModelMap, t as AgentPermDock, u as ToolMap } from "../create-BSNrVuxh.js";
|
|
10
|
+
import { c as AccessReviewStore } from "../types-B2mlGuhW.js";
|
|
11
|
+
import { R as IdempotencyStore } from "../index-_9UiQIkt.js";
|
|
12
|
+
import { n as RevocationFeed } from "../revocations-BaUXHM1N.js";
|
|
13
|
+
import { s as SupportSessionSource } from "../index-B8s204GL.js";
|
|
14
|
+
import { a as AutomationSource, t as Automation } from "../automation-DqEoWHBc.js";
|
|
15
|
+
import { c as DeliveryTransport, g as TransportMessages } from "../types-yUuPR5Hy.js";
|
|
16
|
+
import { r as SupabaseHookManifest } from "../manifest-CzzWtnAb.js";
|
|
17
|
+
import { t as supabaseMembershipsBudget } from "../budget-hYsPz_yE.js";
|
|
18
|
+
import { t as CloudApproverOptions } from "../types-AMJ5qoU_.js";
|
|
19
|
+
import { n as ApprovalWaiter } from "../waiter-Bu9zAlE0.js";
|
|
20
|
+
import { g as SetQueue, l as ReplayStore } from "../types-DjuMBNF9.js";
|
|
21
|
+
import { r as SnapshotStorage } from "../types-HzqOtvsJ.js";
|
|
22
|
+
import { x as DirectoryStore } from "../index-BT5-1VsX.js";
|
|
23
|
+
import { S as SsfStreamStore } from "../index-BhxEUY9J.js";
|
|
24
|
+
import { S as policyMatrix, _ as DescribePolicyConfig, a as OrmParityScenario, b as PolicyMatrixCell, c as RlsFieldsOutcome, d as RlsParityOptions, f as RlsParityReport, g as testRlsParity, h as RlsQueryResult, i as OrmParityRunInput, l as RlsParityCase, m as RlsQueryFn, n as OrmParityOptions, o as testOrmParity, p as RlsParitySubject, r as OrmParityReport, s as RlsDbOutcome, t as OrmParityCase, u as RlsParityFixture, v as MatrixCell, x as PolicyMatrixReport, y as MatrixOutcome } from "../core-hWIARPDz.js";
|
|
25
|
+
import { a as SaasProject } from "../permissions-Bx6UI8n1.js";
|
|
26
|
+
import { n as saasPolicy } from "../policy-Ba4bDhaj.js";
|
|
24
27
|
import { expectTypeOf } from "vitest";
|
|
25
28
|
//#region src/testing/describe-policy.d.ts
|
|
26
|
-
|
|
27
|
-
type MatrixCell = MatrixOutcome | {
|
|
28
|
-
readonly outcome?: MatrixOutcome;
|
|
29
|
-
readonly denials?: readonly {
|
|
30
|
-
readonly role?: string | null;
|
|
31
|
-
readonly reason: string;
|
|
32
|
-
}[];
|
|
33
|
-
readonly alternatives?: readonly string[];
|
|
34
|
-
/** Obligation kinds a granted decision carries, in order; `[]` asserts none. */
|
|
35
|
-
readonly obligations?: readonly string[];
|
|
36
|
-
/** The `name` of the deny grant `explain` reports as the one that won. */
|
|
37
|
-
readonly deniedBy?: string;
|
|
38
|
-
};
|
|
39
|
-
type DescribePolicyConfig<TSubject> = {
|
|
40
|
-
readonly subjects: Record<string, TSubject>;
|
|
41
|
-
readonly fixtures?: Record<string, unknown>;
|
|
42
|
-
readonly matrix: Record<string, Record<string, MatrixCell | Record<string, MatrixCell>>>;
|
|
43
|
-
readonly exhaustive?: boolean;
|
|
44
|
-
readonly options?: PermDockOptions;
|
|
45
|
-
/**
|
|
46
|
-
* Also assert every granted or denied cell against `fromSnapshot(permdock.snapshot())`,
|
|
47
|
-
* the client a Server Component hands down. Closures cannot cross a snapshot and deny on the client.
|
|
48
|
-
*/
|
|
49
|
-
readonly snapshot?: boolean;
|
|
50
|
-
};
|
|
29
|
+
/** `policyMatrix` under Vitest: one test per cell, plus the exhaustive check. */
|
|
51
30
|
export declare function describePolicy<TSubject>(policy: Policy, config: DescribePolicyConfig<TSubject>): void;
|
|
52
31
|
//#endregion
|
|
53
|
-
//#region src/testing/rls-parity.d.ts
|
|
54
|
-
type RlsDbOutcome = "allowed" | "filtered" | "rejected";
|
|
55
|
-
type RlsParitySubject = {
|
|
56
|
-
readonly id: string;
|
|
57
|
-
readonly roles?: readonly string[];
|
|
58
|
-
readonly tenant?: string;
|
|
59
|
-
readonly memberships?: readonly Membership[];
|
|
60
|
-
/**
|
|
61
|
-
* Extra token claims, read in memory as `principal.claims.*`. They join the
|
|
62
|
-
* JWT claims (`supabase`, `neon`); under `guc` each top-level claim is its
|
|
63
|
-
* own `<prefix>.<name>` setting, strings as is and anything else as JSON.
|
|
64
|
-
*/
|
|
65
|
-
readonly claims?: Readonly<Record<string, unknown>>;
|
|
66
|
-
};
|
|
67
|
-
type RlsParityFixture = {
|
|
68
|
-
readonly name: string;
|
|
69
|
-
readonly subject: RlsParitySubject;
|
|
70
|
-
readonly permission: Permission;
|
|
71
|
-
readonly row: Readonly<Record<string, unknown>>;
|
|
72
|
-
readonly table: string;
|
|
73
|
-
};
|
|
74
|
-
type RlsQueryResult = {
|
|
75
|
-
readonly rows: readonly Record<string, unknown>[];
|
|
76
|
-
readonly rowCount?: number;
|
|
77
|
-
readonly code?: string;
|
|
78
|
-
};
|
|
79
|
-
type RlsQueryFn = (sql: string, values?: readonly unknown[]) => Promise<RlsQueryResult>;
|
|
80
|
-
type RlsParityOptions = {
|
|
81
|
-
readonly query: RlsQueryFn;
|
|
82
|
-
readonly fixtures: readonly RlsParityFixture[];
|
|
83
|
-
/**
|
|
84
|
-
* `supabase` and `neon` set `request.jwt.claims`; a test database stubs
|
|
85
|
-
* `auth.jwt()` / `auth.uid()` or `auth.session()` / `auth.user_id()` over it.
|
|
86
|
-
*/
|
|
87
|
-
readonly dialect?: "supabase" | "neon" | "guc";
|
|
88
|
-
readonly gucPrefix?: string;
|
|
89
|
-
readonly tenantClaim?: string;
|
|
90
|
-
/** Claim (or `guc` setting) the RLS helpers read global roles from. Default `user_role`. */
|
|
91
|
-
readonly roleClaim?: string;
|
|
92
|
-
readonly role?: "authenticated" | "anon";
|
|
93
|
-
/**
|
|
94
|
-
* Tenant-defined roles the subjects' memberships may hold. `decide` resolves them through a
|
|
95
|
-
* `CustomRoleSource`; each membership's claim carries them as the compact `grants` map, which the
|
|
96
|
-
* helpers read in `jwt` mode. Seeding the `database`-mode tables is the caller's job.
|
|
97
|
-
*/
|
|
98
|
-
readonly customRoles?: readonly CustomRole[];
|
|
99
|
-
/** Also decide each case from the subject's serialized snapshot (`fromSnapshot`); it must agree. */
|
|
100
|
-
readonly snapshot?: boolean;
|
|
101
|
-
/**
|
|
102
|
-
* With `rls generate --fields views`: for each instance read, the row of
|
|
103
|
-
* `<table>_visible` must hold exactly the columns `pick` keeps (plus the key,
|
|
104
|
-
* which always passes through). A table with no view is read directly.
|
|
105
|
-
*/
|
|
106
|
-
readonly fieldViews?: boolean;
|
|
107
|
-
};
|
|
108
|
-
/** Columns with a value in the view's row and in `pick`'s result, sorted. */
|
|
109
|
-
type RlsFieldsOutcome = {
|
|
110
|
-
readonly app: readonly string[];
|
|
111
|
-
readonly database: readonly string[] | string;
|
|
112
|
-
};
|
|
113
|
-
type RlsParityCase = {
|
|
114
|
-
readonly name: string;
|
|
115
|
-
readonly granted: boolean;
|
|
116
|
-
readonly database: RlsDbOutcome;
|
|
117
|
-
/** The snapshot's decision, with `snapshot: true`. */
|
|
118
|
-
readonly snapshot?: boolean;
|
|
119
|
-
/** The field view check, with `fieldViews: true`; `database` is an error code when the read failed. */
|
|
120
|
-
readonly fields?: RlsFieldsOutcome;
|
|
121
|
-
readonly ok: boolean;
|
|
122
|
-
};
|
|
123
|
-
type RlsParityReport = {
|
|
124
|
-
readonly ok: boolean;
|
|
125
|
-
readonly results: readonly RlsParityCase[];
|
|
126
|
-
};
|
|
127
|
-
export declare function testRlsParity<TUser>(policy: Policy<TUser>, options: RlsParityOptions): Promise<RlsParityReport>;
|
|
128
|
-
//#endregion
|
|
129
|
-
//#region src/testing/orm-parity.d.ts
|
|
130
|
-
type OrmParityScenario<TUser = unknown> = {
|
|
131
|
-
readonly name: string;
|
|
132
|
-
/** What the policy's `subject` mapper receives, as in `createPermDock(policy, user)`. */
|
|
133
|
-
readonly user: TUser;
|
|
134
|
-
/** The active tenant and role sources, as in `createPermDock(policy, user, options)`. */
|
|
135
|
-
readonly options?: PermDockOptions;
|
|
136
|
-
/** An instance permission; its `where()` filters the table. */
|
|
137
|
-
readonly permission: Permission<string, unknown, "instance">;
|
|
138
|
-
/** Every row of the table, exactly as the database holds them. */
|
|
139
|
-
readonly rows: readonly Readonly<Record<string, unknown>>[];
|
|
140
|
-
};
|
|
141
|
-
type OrmParityRunInput<TUser = unknown> = {
|
|
142
|
-
readonly scenario: OrmParityScenario<TUser>;
|
|
143
|
-
readonly where: WhereResult;
|
|
144
|
-
};
|
|
145
|
-
type OrmParityOptions<TUser = unknown> = {
|
|
146
|
-
/** Runs `toWhere(where)` against the database and returns the matching row ids. */
|
|
147
|
-
readonly run: (input: OrmParityRunInput<TUser>) => Promise<readonly unknown[]>;
|
|
148
|
-
/** The row id field; default `id`. */
|
|
149
|
-
readonly id?: string;
|
|
150
|
-
};
|
|
151
|
-
type OrmParityCase = {
|
|
152
|
-
readonly name: string;
|
|
153
|
-
readonly expected: readonly string[];
|
|
154
|
-
readonly actual: readonly string[];
|
|
155
|
-
/**
|
|
156
|
-
* `where()` left out a non-portable grant. `toWhere` refusing it is
|
|
157
|
-
* fail-closed and passes; rows it does return must be a subset.
|
|
158
|
-
*/
|
|
159
|
-
readonly partial: boolean;
|
|
160
|
-
readonly error?: string;
|
|
161
|
-
readonly ok: boolean;
|
|
162
|
-
};
|
|
163
|
-
type OrmParityReport = {
|
|
164
|
-
readonly ok: boolean;
|
|
165
|
-
readonly results: readonly OrmParityCase[];
|
|
166
|
-
};
|
|
167
|
-
/**
|
|
168
|
-
* ORM parity: for each scenario, the rows `permdock.filter()` keeps in memory
|
|
169
|
-
* must be exactly the rows the database returns for `toWhere(permdock.where())`.
|
|
170
|
-
* With a `relations` option, the graph is loaded for the rows first, so the
|
|
171
|
-
* in-memory side walks the same graph the database query does.
|
|
172
|
-
* A partial `where()` (a closure grant it cannot compile) may be refused or
|
|
173
|
-
* return fewer rows, never more.
|
|
174
|
-
*/
|
|
175
|
-
export declare function testOrmParity<TUser>(policy: Policy<TUser>, scenarios: readonly OrmParityScenario<TUser>[], options: OrmParityOptions<TUser>): Promise<OrmParityReport>;
|
|
176
|
-
//#endregion
|
|
177
32
|
//#region src/testing/client-parity.d.ts
|
|
178
33
|
type ClientParityCase = {
|
|
179
34
|
readonly name: string;
|
|
@@ -183,8 +38,8 @@ type ClientParityCase = {
|
|
|
183
38
|
readonly permission: Permission;
|
|
184
39
|
readonly row?: unknown;
|
|
185
40
|
/**
|
|
186
|
-
* `true` when the client may deny what the server grants, because the
|
|
187
|
-
*
|
|
41
|
+
* `true` when the client may deny what the server grants, because the outcome
|
|
42
|
+
* depends on a closure, a quota or an approval the snapshot omits.
|
|
188
43
|
*/
|
|
189
44
|
readonly stricter?: boolean;
|
|
190
45
|
};
|
|
@@ -192,8 +47,8 @@ type ClientParityOptions = {
|
|
|
192
47
|
readonly customRoles?: CustomRoleSource;
|
|
193
48
|
};
|
|
194
49
|
/**
|
|
195
|
-
* Asserts that `fromSnapshot(permdock.snapshot())` never grants what the
|
|
196
|
-
*
|
|
50
|
+
* Asserts that `fromSnapshot(permdock.snapshot())` never grants what the server
|
|
51
|
+
* denies, and matches it exactly unless a case is marked `stricter`.
|
|
197
52
|
*/
|
|
198
53
|
export declare function testClientParity(policy: Policy, cases: readonly ClientParityCase[], options?: ClientParityOptions): void;
|
|
199
54
|
//#endregion
|
|
@@ -211,9 +66,9 @@ type LegacyParityCase = {
|
|
|
211
66
|
readonly expect?: boolean;
|
|
212
67
|
};
|
|
213
68
|
/**
|
|
214
|
-
* Asserts that the policy answers each case as the application's legacy
|
|
215
|
-
*
|
|
216
|
-
*
|
|
69
|
+
* Asserts that the policy answers each case as the application's legacy check
|
|
70
|
+
* does, or as the case's `expect` says where the difference is intended. Run it
|
|
71
|
+
* before enforcing a permission with `shadowMode`.
|
|
217
72
|
*/
|
|
218
73
|
export declare function testLegacyParity(policy: Policy, legacy: LegacyCheck, cases: readonly LegacyParityCase[]): void;
|
|
219
74
|
//#endregion
|
|
@@ -221,17 +76,20 @@ export declare function testLegacyParity(policy: Policy, legacy: LegacyCheck, ca
|
|
|
221
76
|
type ClientStoreStatus = "ready" | "pending" | "stale" | "server-only";
|
|
222
77
|
/** The client surface every UI adapter hands to components. */
|
|
223
78
|
type ClientStorePermDock = PermDock & {
|
|
224
|
-
status(permission?: Permission, data?: unknown)
|
|
225
|
-
refresh(query?: {
|
|
79
|
+
status: (permission?: Permission, data?: unknown) => ClientStoreStatus;
|
|
80
|
+
refresh: (query?: {
|
|
226
81
|
readonly tenant?: string;
|
|
227
|
-
})
|
|
228
|
-
clear()
|
|
229
|
-
subscribe(listener: () => void)
|
|
82
|
+
}) => Promise<void>;
|
|
83
|
+
clear: () => void;
|
|
84
|
+
subscribe: (listener: () => void) => () => void;
|
|
230
85
|
};
|
|
231
86
|
type ClientStoreHandle = {
|
|
232
|
-
get()
|
|
233
|
-
/**
|
|
234
|
-
|
|
87
|
+
get: () => ClientStorePermDock;
|
|
88
|
+
/**
|
|
89
|
+
* Hydrate from a server-pushed snapshot (a Server Action result, a socket
|
|
90
|
+
* message).
|
|
91
|
+
*/
|
|
92
|
+
replace: (value: unknown) => void;
|
|
235
93
|
};
|
|
236
94
|
type ClientStoreFactoryOptions = {
|
|
237
95
|
readonly snapshot: Snapshot | string;
|
|
@@ -244,9 +102,9 @@ type ClientStoreFactoryOptions = {
|
|
|
244
102
|
type ClientStoreFactory = (options: ClientStoreFactoryOptions) => ClientStoreHandle;
|
|
245
103
|
/**
|
|
246
104
|
* Race and cache scenarios for a client snapshot store: tenant switches,
|
|
247
|
-
* `replace` and `refresh`, logout and a second user during a refresh, stale
|
|
248
|
-
*
|
|
249
|
-
*
|
|
105
|
+
* `replace` and `refresh`, logout and a second user during a refresh, stale and
|
|
106
|
+
* signed snapshots, and endpoint answers cached per tenant. Runs against the
|
|
107
|
+
* saas domain; `createStore` wraps the store an adapter ships.
|
|
250
108
|
*/
|
|
251
109
|
export declare function testClientStore(name: string, createStore: ClientStoreFactory): void;
|
|
252
110
|
//#endregion
|
|
@@ -260,6 +118,18 @@ export declare function snapshotFixture(policy: Policy, subject: unknown, option
|
|
|
260
118
|
readonly simulated?: boolean;
|
|
261
119
|
}): Promise<Snapshot>;
|
|
262
120
|
//#endregion
|
|
121
|
+
//#region src/testing/seed-rows.d.ts
|
|
122
|
+
/** Rows per table; tables are inserted in key order, so list parents first. */
|
|
123
|
+
type SeedRows = Readonly<Record<string, readonly Readonly<Record<string, unknown>>[]>>;
|
|
124
|
+
/**
|
|
125
|
+
* Inserts `factories.*` rows through the `query` function `testRlsParity`
|
|
126
|
+
* takes, one parameterised `insert` per row with the row's own keys as quoted
|
|
127
|
+
* column names. `undefined` fields are left to the column default. Run it as
|
|
128
|
+
* the table owner, before RLS applies. Resolves to the number of rows
|
|
129
|
+
* inserted.
|
|
130
|
+
*/
|
|
131
|
+
export declare function seedRows(query: RlsQueryFn, rows: SeedRows): Promise<number>;
|
|
132
|
+
//#endregion
|
|
263
133
|
//#region src/testing/http-adapter/domain.d.ts
|
|
264
134
|
/**
|
|
265
135
|
* What a mount wires into its framework. Every value is server-side: the
|
|
@@ -269,9 +139,9 @@ export declare function snapshotFixture(policy: Policy, subject: unknown, option
|
|
|
269
139
|
type HttpScenarioDomain = {
|
|
270
140
|
readonly policy: typeof saasPolicy;
|
|
271
141
|
/**
|
|
272
|
-
* The verified principal for an `Authorization` header, with the plans of
|
|
273
|
-
*
|
|
274
|
-
*
|
|
142
|
+
* The verified principal for an `Authorization` header, with the plans of the
|
|
143
|
+
* org in the first segment of `path`. The path, not a route param, so the
|
|
144
|
+
* answer is the same in a global middleware that runs before routing.
|
|
275
145
|
*/
|
|
276
146
|
readonly subject: (authorization: string | null | undefined, path: string) => Promise<Principal | null>;
|
|
277
147
|
/** `subject` as a full `Subject` whose `expiresAt` is the token's `exp`. */
|
|
@@ -348,26 +218,30 @@ type HttpMounted = {
|
|
|
348
218
|
*
|
|
349
219
|
* - `GET /:org/projects/:id`: `protect(project.read, row)`, 200 with the row
|
|
350
220
|
* - `PATCH /:org/projects/:id`: `protect(project.update, row)`, 200
|
|
351
|
-
* - `POST /:org/projects`: `protect(project.create, body, { trusted: false })`,
|
|
221
|
+
* - `POST /:org/projects`: `protect(project.create, body, { trusted: false })`,
|
|
222
|
+
* 201 with the body
|
|
352
223
|
* - `DELETE /:org/projects/:id`: `protect(project.read, row)`, then the handler
|
|
353
224
|
* calls `permdock.assert(project.delete, row)`; 204
|
|
354
225
|
* - `POST /:org/projects/:id/files`: `protect(project.update, row)`, then the
|
|
355
|
-
* framework's own multipart parser reads field `file`; 201 `{ name, size
|
|
226
|
+
* framework's own multipart parser reads field `file`; 201 `{ name, size
|
|
227
|
+
* }`
|
|
356
228
|
* - `GET /:org/analytics`: `protect(analytics.read)`, 200
|
|
357
229
|
* - `POST /:org/api-keys`: `protect(apiKey.create)`, 201
|
|
358
230
|
* - `POST /:org/api-keys/revoke-all`: `protect(apiKey.revokeAll)`, 204
|
|
359
|
-
* - `GET /:org/admin/members`: in a sub-app, router or group;
|
|
360
|
-
*
|
|
231
|
+
* - `GET /:org/admin/members`: in a sub-app, router or group;
|
|
232
|
+
* `protect(member.list)`, 200
|
|
233
|
+
* - `POST /:org/permdock/access/v1/evaluations`: the adapter's decision
|
|
234
|
+
* endpoint
|
|
361
235
|
*
|
|
362
236
|
* A global `permdock()` middleware runs before every route.
|
|
363
237
|
*
|
|
364
238
|
* With `streams: true` it also serves `GET /:org/projects/:id/events`:
|
|
365
|
-
* `protect(project.read, row)` with the subject from `domain.session`,
|
|
366
|
-
*
|
|
367
|
-
*
|
|
368
|
-
* `
|
|
369
|
-
*
|
|
370
|
-
*
|
|
239
|
+
* `protect(project.read, row)` with the subject from `domain.session`, then a
|
|
240
|
+
* connection opened for `project.read` on the row with `revocations:
|
|
241
|
+
* domain.revocations`, streaming `domain.ticks(org)` as `text/event-stream`
|
|
242
|
+
* `data:` frames of JSON rows, dropping rows the subscriber cannot
|
|
243
|
+
* `project.update`, and ending with an `event: permdock` frame carrying the
|
|
244
|
+
* Problem Details when the connection aborts.
|
|
371
245
|
*/
|
|
372
246
|
readonly fetch?: (request: Request) => Promise<Response>;
|
|
373
247
|
/** RPC adapters map a call to a procedure and its error to an HTTP status. */
|
|
@@ -378,7 +252,10 @@ type HttpScenarioName = "tenant" | "roles" | "custom-roles" | "plans" | "expired
|
|
|
378
252
|
type HttpAdapterOptions = {
|
|
379
253
|
readonly name: string;
|
|
380
254
|
readonly mount: (domain: HttpScenarioDomain) => HttpMounted | Promise<HttpMounted>;
|
|
381
|
-
/**
|
|
255
|
+
/**
|
|
256
|
+
* Scenarios the transport cannot express (multipart over RPC), each with a
|
|
257
|
+
* reason.
|
|
258
|
+
*/
|
|
382
259
|
readonly skip?: Readonly<Partial<Record<HttpScenarioName, string>>>;
|
|
383
260
|
/** The mount serves the events stream; the `stream-*` scenarios run only then. */
|
|
384
261
|
readonly streams?: boolean;
|
|
@@ -399,9 +276,9 @@ export declare const AGENT_THROWING_USER = "throws";
|
|
|
399
276
|
export declare const AGENT_THROWING_ROW = "throws";
|
|
400
277
|
type AgentToolName = "project_read" | "api_keys_revoke_all";
|
|
401
278
|
/**
|
|
402
|
-
* What a mount wires into its adapter. The subject and the tenant come from
|
|
403
|
-
*
|
|
404
|
-
*
|
|
279
|
+
* What a mount wires into its adapter. The subject and the tenant come from the
|
|
280
|
+
* server-side context the mount builds for each call, never from the tool
|
|
281
|
+
* arguments.
|
|
405
282
|
*/
|
|
406
283
|
type AgentScenarioDomain = {
|
|
407
284
|
readonly policy: typeof saasPolicy;
|
|
@@ -411,9 +288,8 @@ type AgentScenarioDomain = {
|
|
|
411
288
|
*/
|
|
412
289
|
readonly subject: (user: string | null, org: string) => Principal | null;
|
|
413
290
|
/**
|
|
414
|
-
* `project_read` loads the row named by `args.id`: `null` for an unknown
|
|
415
|
-
*
|
|
416
|
-
* approval.
|
|
291
|
+
* `project_read` loads the row named by `args.id`: `null` for an unknown id,
|
|
292
|
+
* a throw for `AGENT_THROWING_ROW`. `api_keys_revoke_all` needs approval.
|
|
417
293
|
*/
|
|
418
294
|
readonly tools: ToolMap & { readonly [K in AgentToolName]: ToolMap[K]; };
|
|
419
295
|
readonly customRoles: CustomRoleSource;
|
|
@@ -448,7 +324,10 @@ type AgentAdapterOptions = {
|
|
|
448
324
|
export declare function testAgentAdapter(options: AgentAdapterOptions): void;
|
|
449
325
|
//#endregion
|
|
450
326
|
//#region src/testing/agent-runtime.d.ts
|
|
451
|
-
/**
|
|
327
|
+
/**
|
|
328
|
+
* The server-side context of one call; the subject and tenant come from here,
|
|
329
|
+
* never from arguments.
|
|
330
|
+
*/
|
|
452
331
|
type AgentRuntimeContext = {
|
|
453
332
|
/** `null` for a call with no authenticated user. */
|
|
454
333
|
readonly user: string | null;
|
|
@@ -459,7 +338,10 @@ type AgentRuntimeModel = "standard" | "frontier";
|
|
|
459
338
|
/** What a mount wires into its `AgentPermDock`. */
|
|
460
339
|
type AgentRuntimeDomain = {
|
|
461
340
|
readonly policy: typeof saasPolicy;
|
|
462
|
-
/**
|
|
341
|
+
/**
|
|
342
|
+
* The principal for `user` with the plans of `org`, or `null`. Throws for
|
|
343
|
+
* `AGENT_THROWING_USER`.
|
|
344
|
+
*/
|
|
463
345
|
readonly subject: (user: string | null, org: string) => Principal | null;
|
|
464
346
|
/**
|
|
465
347
|
* `project_read` loads the row named by `args.id`; `project_search` has a
|
|
@@ -560,16 +442,25 @@ type TodoUser = {
|
|
|
560
442
|
readonly identity: string;
|
|
561
443
|
readonly roles: readonly ("admin" | "editor" | "viewer" | "evil_genius")[];
|
|
562
444
|
};
|
|
563
|
-
/**
|
|
445
|
+
/**
|
|
446
|
+
* The AuthZEN interop Todo directory: each user is addressable by email or by
|
|
447
|
+
* identity.
|
|
448
|
+
*/
|
|
564
449
|
export declare const authzenTodoUsers: readonly TodoUser[];
|
|
565
450
|
type AuthzenTodoDefinition = {
|
|
566
451
|
readonly user: ResourceInit<unknown, readonly ["can_read_user"], readonly []>;
|
|
567
452
|
readonly todo: ResourceInit<unknown, readonly ["can_read_todos", "can_create_todo", "can_update_todo", "can_delete_todo"], readonly []>;
|
|
568
453
|
};
|
|
569
454
|
export declare const authzenTodoPermissions: InferPermissionTree<AuthzenTodoDefinition>;
|
|
570
|
-
/**
|
|
455
|
+
/**
|
|
456
|
+
* The interop Todo rules: viewers read, editors write their own, admins delete
|
|
457
|
+
* and evil geniuses update anything.
|
|
458
|
+
*/
|
|
571
459
|
export declare const authzenTodoPolicy: Policy;
|
|
572
|
-
/**
|
|
460
|
+
/**
|
|
461
|
+
* Rows for `resources.todo.list` and records for `subjects.list` in the Todo
|
|
462
|
+
* domain.
|
|
463
|
+
*/
|
|
573
464
|
export declare const authzenTodoData: {
|
|
574
465
|
readonly todos: readonly {
|
|
575
466
|
readonly id: string;
|
|
@@ -580,23 +471,34 @@ export declare const authzenTodoData: {
|
|
|
580
471
|
}[];
|
|
581
472
|
};
|
|
582
473
|
/**
|
|
583
|
-
* PermDock's vectors over the interop Todo domain, in the interop layout:
|
|
584
|
-
*
|
|
585
|
-
*
|
|
474
|
+
* PermDock's vectors over the interop Todo domain, in the interop layout: every
|
|
475
|
+
* user against every action on their own and on Rick's todo, one batch per
|
|
476
|
+
* user, and the three searches.
|
|
586
477
|
*/
|
|
587
478
|
export declare function authzenTodoVectors(): AuthzenVectors;
|
|
588
479
|
//#endregion
|
|
589
480
|
//#region src/testing/cloud-api/platform-checks.d.ts
|
|
590
481
|
type TestCloudPlatformOptions = {
|
|
591
|
-
/**
|
|
482
|
+
/**
|
|
483
|
+
* A `PERMDOCK_CLOUD_TOKEN` for `project`: read-only, pinned to one
|
|
484
|
+
* environment.
|
|
485
|
+
*/
|
|
592
486
|
readonly token: string;
|
|
593
487
|
/** The project the token reads; defaults to the environment. */
|
|
594
488
|
readonly project?: string;
|
|
595
|
-
/**
|
|
489
|
+
/**
|
|
490
|
+
* A project with no `cloud push` yet and a login token that reads it; the
|
|
491
|
+
* `policy-not-published` check is skipped without it.
|
|
492
|
+
*/
|
|
596
493
|
readonly unpublished?: {
|
|
597
494
|
readonly project: string;
|
|
598
495
|
readonly token: string;
|
|
599
496
|
};
|
|
497
|
+
/**
|
|
498
|
+
* A login token with `projects:read` and without `policy:read`; the
|
|
499
|
+
* `insufficient_scope` check is skipped without it.
|
|
500
|
+
*/
|
|
501
|
+
readonly projectsOnly?: string;
|
|
600
502
|
/** Registers a test MCP client with RFC 7591; skipped unless true. */
|
|
601
503
|
readonly registration?: boolean;
|
|
602
504
|
};
|
|
@@ -613,13 +515,22 @@ type CloudApiKeys = {
|
|
|
613
515
|
type TestCloudApiOptions = {
|
|
614
516
|
readonly environment?: string;
|
|
615
517
|
readonly fetch?: typeof globalThis.fetch;
|
|
616
|
-
/**
|
|
518
|
+
/**
|
|
519
|
+
* Signs the `PermDock-Approver` tokens; its issuer is a trusted issuer for
|
|
520
|
+
* `approver`.
|
|
521
|
+
*/
|
|
617
522
|
readonly approver: CloudApproverOptions;
|
|
618
|
-
/**
|
|
523
|
+
/**
|
|
524
|
+
* A fresh `PermDock-Subject` token per call; the snapshot checks are skipped
|
|
525
|
+
* without it.
|
|
526
|
+
*/
|
|
619
527
|
readonly subject?: () => string | Promise<string>;
|
|
620
528
|
/** Verifies the environment's policy documents for `testPolicySource`. */
|
|
621
529
|
readonly verifier?: TokenVerifier;
|
|
622
|
-
/**
|
|
530
|
+
/**
|
|
531
|
+
* AuthZEN vectors for the hosted ADS, with the caller's credentials as
|
|
532
|
+
* `headers`.
|
|
533
|
+
*/
|
|
623
534
|
readonly authzen?: {
|
|
624
535
|
readonly vectors: AuthzenVectors;
|
|
625
536
|
readonly headers?: Readonly<Record<string, string>>;
|
|
@@ -631,25 +542,33 @@ type TestCloudApiOptions = {
|
|
|
631
542
|
* Runs the conformance runners and the HTTP contract checks against one
|
|
632
543
|
* PermDock Cloud environment, and validates every response body against
|
|
633
544
|
* `cloud-api-v1.json`. Point it at a test environment: it creates approvals,
|
|
634
|
-
* sends decision events and deliveries to `.invalid` addresses, and pushes
|
|
635
|
-
*
|
|
545
|
+
* sends decision events and deliveries to `.invalid` addresses, and pushes the
|
|
546
|
+
* catalog the environment already holds.
|
|
636
547
|
*/
|
|
637
548
|
export declare function testCloudApi(baseUrl: string, keys: CloudApiKeys, options: TestCloudApiOptions): void;
|
|
638
549
|
//#endregion
|
|
639
550
|
//#region src/testing/conformance/approvals.d.ts
|
|
640
551
|
type ApprovalStoreOptions = {
|
|
641
552
|
/**
|
|
642
|
-
* Opens a second
|
|
643
|
-
* would
|
|
644
|
-
* case is then skipped).
|
|
553
|
+
* Opens a second client over the same backing storage, as a restarted process
|
|
554
|
+
* would: for a hosted store, `() => cloud(...).approvals`. Omit it for stores
|
|
555
|
+
* that do not persist (the resume-after-restart case is then skipped).
|
|
645
556
|
*/
|
|
646
557
|
readonly reopen?: () => ApprovalStore | Promise<ApprovalStore>;
|
|
558
|
+
readonly capabilities?: {
|
|
559
|
+
/**
|
|
560
|
+
* Marks the record for `token` expired, or moves its `expiresAt` into the
|
|
561
|
+
* past, in the backing storage. Without it the replace-on-expiry case is
|
|
562
|
+
* skipped.
|
|
563
|
+
*/
|
|
564
|
+
readonly expire?: (token: string) => Promise<void> | void;
|
|
565
|
+
};
|
|
647
566
|
};
|
|
648
567
|
export declare function testApprovalStore(store: ApprovalStore, options?: ApprovalStoreOptions): void;
|
|
649
568
|
/**
|
|
650
569
|
* Checks an `ApprovalPolicySource`: entries are plain JSON, belong to the
|
|
651
|
-
* queried tenant or to none, and every entry loads against `policy` (an
|
|
652
|
-
*
|
|
570
|
+
* queried tenant or to none, and every entry loads against `policy` (an entry
|
|
571
|
+
* that does not would deny every call).
|
|
653
572
|
*/
|
|
654
573
|
export declare function testApprovalPolicySource(source: ApprovalPolicySource, options: {
|
|
655
574
|
readonly policy: Policy;
|
|
@@ -672,19 +591,19 @@ export declare function testApprovalDelegationSource(source: ApprovalDelegationS
|
|
|
672
591
|
readonly at?: string;
|
|
673
592
|
}): void;
|
|
674
593
|
/**
|
|
675
|
-
* Checks an `IdempotencyStore`: a stored response comes back as written
|
|
676
|
-
*
|
|
677
|
-
*
|
|
594
|
+
* Checks an `IdempotencyStore`: a stored response comes back as written until
|
|
595
|
+
* it expires, keys never share an entry, and a later `set` replaces an earlier
|
|
596
|
+
* one.
|
|
678
597
|
*/
|
|
679
598
|
export declare function testIdempotencyStore(store: IdempotencyStore): void;
|
|
680
599
|
//#endregion
|
|
681
600
|
//#region src/testing/conformance/where.d.ts
|
|
682
601
|
type WhereRow = Readonly<Record<string, unknown>>;
|
|
683
602
|
/**
|
|
684
|
-
* `matches` answers whether the compiled output selects `row`, for example
|
|
685
|
-
*
|
|
686
|
-
*
|
|
687
|
-
*
|
|
603
|
+
* `matches` answers whether the compiled output selects `row`, for example by
|
|
604
|
+
* running it against a table holding only that row. With it, every case must
|
|
605
|
+
* select the rows the in-memory evaluator keeps, including rows whose fields
|
|
606
|
+
* are NULL.
|
|
688
607
|
*/
|
|
689
608
|
export declare function testWhereCompiler<TTarget>(compiler: WhereCompiler<TTarget>, options: {
|
|
690
609
|
readonly target: TTarget;
|
|
@@ -695,6 +614,7 @@ export declare function testWhereCompiler<TTarget>(compiler: WhereCompiler<TTarg
|
|
|
695
614
|
//#region src/testing/conformance/credentials.d.ts
|
|
696
615
|
export declare function testReplayStore(store: ReplayStore): void;
|
|
697
616
|
export declare function testSetQueue(queue: SetQueue): void;
|
|
617
|
+
export declare function testSsfStreamStore(store: SsfStreamStore): void;
|
|
698
618
|
export declare function testRevocationFeed(feed: RevocationFeed): void;
|
|
699
619
|
export declare function testTokenVerifier(verifier: TokenVerifier, options?: {
|
|
700
620
|
readonly audience?: string;
|
|
@@ -702,8 +622,8 @@ export declare function testTokenVerifier(verifier: TokenVerifier, options?: {
|
|
|
702
622
|
}): void;
|
|
703
623
|
/**
|
|
704
624
|
* `key` is a live key the verifier knows, or a function issuing one (called
|
|
705
|
-
* once). `revoke`, when given, revokes it; the runner then expects the key
|
|
706
|
-
*
|
|
625
|
+
* once). `revoke`, when given, revokes it; the runner then expects the key to
|
|
626
|
+
* stop verifying.
|
|
707
627
|
*/
|
|
708
628
|
export declare function testCredentialVerifier(verifier: CredentialVerifier, options: {
|
|
709
629
|
readonly key: string | (() => string | Promise<string>);
|
|
@@ -761,14 +681,17 @@ export declare function testRelationSource(source: RelationSource, options: {
|
|
|
761
681
|
/**
|
|
762
682
|
* Checks a `PrincipalSource`: `principal` answers each listed id with the
|
|
763
683
|
* expected principal or `null`, never another id; `principalByIdentity`
|
|
764
|
-
* resolves each listed identity to the expected principal id or `null`, and
|
|
765
|
-
*
|
|
684
|
+
* resolves each listed identity to the expected principal id or `null`, and an
|
|
685
|
+
* email matches trimmed and in any case.
|
|
766
686
|
*/
|
|
767
687
|
export declare function testPrincipalSource(source: PrincipalSource, options: {
|
|
768
688
|
readonly principals: readonly {
|
|
769
689
|
readonly id: string;
|
|
770
690
|
readonly tenant?: string;
|
|
771
|
-
/**
|
|
691
|
+
/**
|
|
692
|
+
* The principal `principal(id)` returns, or `null` for none; omit to
|
|
693
|
+
* check only the shape.
|
|
694
|
+
*/
|
|
772
695
|
readonly expect?: Principal | null;
|
|
773
696
|
}[];
|
|
774
697
|
readonly identities?: readonly {
|
|
@@ -780,41 +703,50 @@ export declare function testPrincipalSource(source: PrincipalSource, options: {
|
|
|
780
703
|
//#endregion
|
|
781
704
|
//#region src/testing/conformance/automations.d.ts
|
|
782
705
|
/**
|
|
783
|
-
* Checks an `AutomationSource`: `automation(id)` answers each listed id
|
|
784
|
-
*
|
|
785
|
-
*
|
|
786
|
-
*
|
|
706
|
+
* Checks an `AutomationSource`: `automation(id)` answers each listed id with a
|
|
707
|
+
* valid Automation v1 record of that id or `null`, never another id; a record
|
|
708
|
+
* held to one tenant is `null` when asked for another; an empty or unknown id
|
|
709
|
+
* is `null`.
|
|
787
710
|
*/
|
|
788
711
|
export declare function testAutomationSource(source: AutomationSource, options: {
|
|
789
712
|
readonly automations: readonly {
|
|
790
713
|
readonly id: string;
|
|
791
714
|
readonly tenant?: string;
|
|
792
|
-
/**
|
|
715
|
+
/**
|
|
716
|
+
* The record `automation(id)` returns, or `null` for none; omit to check
|
|
717
|
+
* only the shape.
|
|
718
|
+
*/
|
|
793
719
|
readonly expect?: Automation | null;
|
|
794
720
|
}[];
|
|
795
721
|
}): void;
|
|
796
722
|
/**
|
|
797
|
-
* Checks a `SupportSessionSource`: `session(id)` answers each listed id
|
|
798
|
-
*
|
|
799
|
-
*
|
|
723
|
+
* Checks a `SupportSessionSource`: `session(id)` answers each listed id with a
|
|
724
|
+
* record of that id or `null`, never another id; `ended` is a boolean when
|
|
725
|
+
* present; an empty or unknown id is `null`.
|
|
800
726
|
*/
|
|
801
727
|
export declare function testSupportSessionSource(source: SupportSessionSource, options: {
|
|
802
728
|
readonly sessions: readonly {
|
|
803
729
|
readonly id: string;
|
|
804
|
-
/**
|
|
730
|
+
/**
|
|
731
|
+
* `true` for an ended session, `false` for a live one, `null` for an
|
|
732
|
+
* unknown one.
|
|
733
|
+
*/
|
|
805
734
|
readonly ended?: boolean | null;
|
|
806
735
|
}[];
|
|
807
736
|
}): void;
|
|
808
737
|
/**
|
|
809
|
-
* Checks an `ApprovalWaiter`: a wait ends when its token is woken and not
|
|
810
|
-
*
|
|
811
|
-
*
|
|
812
|
-
* Pass `expiry: false` or `abort: false` for a waiter whose runner
|
|
813
|
-
* timer or no cancellation, `pending` when the waiter reads a store,
|
|
814
|
-
* `parked` when a wait parks asynchronously.
|
|
738
|
+
* Checks an `ApprovalWaiter`: a wait ends when its token is woken and not when
|
|
739
|
+
* another token is; waking a token nobody waits on resolves; a wait whose
|
|
740
|
+
* `expiresAt` has passed ends; an aborted `signal` rejects the wait with its
|
|
741
|
+
* reason. Pass `expiry: false` or `abort: false` for a waiter whose runner
|
|
742
|
+
* offers no timer or no cancellation, `pending` when the waiter reads a store,
|
|
743
|
+
* and `parked` when a wait parks asynchronously.
|
|
815
744
|
*/
|
|
816
745
|
export declare function testApprovalWaiter(waiter: ApprovalWaiter, options?: {
|
|
817
|
-
/**
|
|
746
|
+
/**
|
|
747
|
+
* Opens a pending approval request and returns its token; a fixed token per
|
|
748
|
+
* label when absent.
|
|
749
|
+
*/
|
|
818
750
|
readonly pending?: (label: string) => string | Promise<string>;
|
|
819
751
|
/** Resolves once `wait(token)` has parked; one macrotask when absent. */
|
|
820
752
|
readonly parked?: (token: string) => Promise<void>;
|
|
@@ -825,18 +757,24 @@ export declare function testApprovalWaiter(waiter: ApprovalWaiter, options?: {
|
|
|
825
757
|
}): void;
|
|
826
758
|
//#endregion
|
|
827
759
|
//#region src/testing/delivery-transport.d.ts
|
|
828
|
-
/**
|
|
760
|
+
/**
|
|
761
|
+
* How a provider fails on its next call: a retryable error, a final error, or a
|
|
762
|
+
* throw from its client.
|
|
763
|
+
*/
|
|
829
764
|
type DeliveryFailureKind = "retryable" | "final" | "throw";
|
|
830
765
|
type DeliveryTransportHarness<C extends DeliveryChannel> = {
|
|
831
766
|
readonly transport: DeliveryTransport<C>;
|
|
832
|
-
/**
|
|
833
|
-
|
|
767
|
+
/**
|
|
768
|
+
* What the provider accepted, one entry per delivery, with the idempotency
|
|
769
|
+
* key it received.
|
|
770
|
+
*/
|
|
771
|
+
received: () => readonly {
|
|
834
772
|
readonly idempotencyKey: string;
|
|
835
773
|
}[] | Promise<readonly {
|
|
836
774
|
readonly idempotencyKey: string;
|
|
837
775
|
}[]>;
|
|
838
776
|
/** Makes the provider's next call fail this way. */
|
|
839
|
-
fail(kind: DeliveryFailureKind)
|
|
777
|
+
fail: (kind: DeliveryFailureKind) => void;
|
|
840
778
|
};
|
|
841
779
|
type DeliveryTransportOptions<C extends DeliveryChannel> = {
|
|
842
780
|
readonly channel: C;
|
|
@@ -844,13 +782,13 @@ type DeliveryTransportOptions<C extends DeliveryChannel> = {
|
|
|
844
782
|
readonly address: string;
|
|
845
783
|
readonly message: TransportMessages[C];
|
|
846
784
|
/** A fresh harness per test. */
|
|
847
|
-
create()
|
|
785
|
+
create: () => DeliveryTransportHarness<C>;
|
|
848
786
|
};
|
|
849
787
|
/**
|
|
850
788
|
* Conformance for a `DeliveryTransport`: it sends a checked target with its
|
|
851
|
-
* idempotency key, keeps the key on a retry, refuses a target without a
|
|
852
|
-
*
|
|
853
|
-
*
|
|
789
|
+
* idempotency key, keeps the key on a retry, refuses a target without a granted
|
|
790
|
+
* decision before calling the provider, and maps provider errors to retryable
|
|
791
|
+
* or final failures without rejecting.
|
|
854
792
|
*/
|
|
855
793
|
export declare function testDeliveryTransport<C extends DeliveryChannel>(name: string, options: DeliveryTransportOptions<C>): void;
|
|
856
794
|
//#endregion
|
|
@@ -864,9 +802,15 @@ export declare function testMembershipSource(source: MembershipSource, options:
|
|
|
864
802
|
readonly kind?: string;
|
|
865
803
|
}[];
|
|
866
804
|
readonly expect?: Record<string, readonly Membership[]>;
|
|
867
|
-
/**
|
|
805
|
+
/**
|
|
806
|
+
* With the policy, every membership must name one of its scopes and carry
|
|
807
|
+
* its parent ids.
|
|
808
|
+
*/
|
|
868
809
|
readonly policy?: Policy;
|
|
869
|
-
/**
|
|
810
|
+
/**
|
|
811
|
+
* Passed to every `membershipsFor`; a source keyed by tenant answers
|
|
812
|
+
* nothing without one.
|
|
813
|
+
*/
|
|
870
814
|
readonly tenant?: string;
|
|
871
815
|
}): void;
|
|
872
816
|
export declare function testEntitlementSource(source: EntitlementSource, options: {
|
|
@@ -923,16 +867,18 @@ export declare const jwtFixtureTokens: {
|
|
|
923
867
|
//#endregion
|
|
924
868
|
//#region src/testing/supabase-fixtures.d.ts
|
|
925
869
|
/**
|
|
926
|
-
* Claim sets in the shape the Supabase custom access token hook produces (the
|
|
927
|
-
* `user_role` claim, optionally mirrored into `app_metadata`, plus
|
|
928
|
-
* multi-org apps). `tenantPlans` has scoped
|
|
929
|
-
* `
|
|
930
|
-
*
|
|
931
|
-
*
|
|
932
|
-
* `
|
|
933
|
-
*
|
|
934
|
-
* `
|
|
935
|
-
* `
|
|
870
|
+
* Claim sets in the shape the Supabase custom access token hook produces (the
|
|
871
|
+
* RBAC guide's `user_role` claim, optionally mirrored into `app_metadata`, plus
|
|
872
|
+
* a `memberships` array for multi-org apps). `tenantPlans` has scoped
|
|
873
|
+
* memberships, `tenant_id` and per-tenant plans in `features`, read with
|
|
874
|
+
* `claims: { plans: 'features' }`. `full` sets every field of the claim
|
|
875
|
+
* contract plus a `hook.claims` extra claim; `portalContact`, `oauthClient` and
|
|
876
|
+
* `actChain` cover a customer contact, a Supabase OAuth server token and an RFC
|
|
877
|
+
* 8693 chain. `supportSession`, `supportSessionReadOnly` and `impersonation`
|
|
878
|
+
* are the `act.kind` tokens of a support tool; `anonymousSignIn` is a
|
|
879
|
+
* `signInAnonymously()` token read with `anonymousSignIns: 'deny'`. Every
|
|
880
|
+
* fixture passes `supabaseClaims()` and `schemas/supabase-claims-v1.json`.
|
|
881
|
+
* Plain data: no Supabase types.
|
|
936
882
|
*/
|
|
937
883
|
type SupabaseClaimFixture = {
|
|
938
884
|
readonly claims: Readonly<Record<string, unknown>>;
|
|
@@ -975,7 +921,10 @@ type SupabaseClaimFixture = {
|
|
|
975
921
|
readonly sessionId: string;
|
|
976
922
|
readonly readOnly: boolean;
|
|
977
923
|
};
|
|
978
|
-
/**
|
|
924
|
+
/**
|
|
925
|
+
* `subject.delegation`: the `scope` claim and the `act` chain of an
|
|
926
|
+
* `oauth-client` actor.
|
|
927
|
+
*/
|
|
979
928
|
readonly delegation?: {
|
|
980
929
|
readonly scopes?: readonly string[];
|
|
981
930
|
readonly chain?: Readonly<Record<string, unknown>>;
|
|
@@ -988,7 +937,8 @@ export declare const supabaseClaimFixtures: Readonly<Record<SupabaseClaimFixture
|
|
|
988
937
|
* `supabaseClaimFixtures` as a `supabase/sdk` conformance vector file
|
|
989
938
|
* (`schema/conformance.schema.json`): each case's `input` is a verified
|
|
990
939
|
* `getClaims()` payload and the `subjectFromSupabase` options, `expected` the
|
|
991
|
-
* subject fields it maps to. `JSON.stringify` it for a port in another
|
|
940
|
+
* subject fields it maps to. `JSON.stringify` it for a port in another
|
|
941
|
+
* language.
|
|
992
942
|
*/
|
|
993
943
|
type SupabaseClaimVectors = {
|
|
994
944
|
readonly feature: "auth.session.get_claims";
|
|
@@ -1005,15 +955,15 @@ export declare const supabaseClaimVectors: SupabaseClaimVectors;
|
|
|
1005
955
|
/**
|
|
1006
956
|
* The `permdock supabase inspect --json` manifest for a policy with one
|
|
1007
957
|
* `tenant` scope, the default `supabase.hook` and a `features` claim from
|
|
1008
|
-
* `public.feature_claims`. A package that reads the manifest tests its
|
|
1009
|
-
*
|
|
958
|
+
* `public.feature_claims`. A package that reads the manifest tests its parser
|
|
959
|
+
* against this value.
|
|
1010
960
|
*/
|
|
1011
961
|
export declare const supabaseHookManifestFixture: SupabaseHookManifest;
|
|
1012
962
|
//#endregion
|
|
1013
963
|
//#region src/core/problem-types.d.ts
|
|
1014
964
|
/**
|
|
1015
|
-
* The Problem Details types PermDock defines (RFC 9457 section 4). Every
|
|
1016
|
-
*
|
|
965
|
+
* The Problem Details types PermDock defines (RFC 9457 section 4). Every other
|
|
966
|
+
* status answers with `about:blank` and its RFC 9110 reason phrase.
|
|
1017
967
|
*/
|
|
1018
968
|
declare const PROBLEM_TYPES: readonly ["denied", "approval-required", "validation", "step-up-required", "not-entitled", "rate-limited", "limit-unavailable", "invalid-signature", "approver-not-eligible"];
|
|
1019
969
|
type ProblemType = (typeof PROBLEM_TYPES)[number];
|
|
@@ -1027,4 +977,4 @@ type ProblemType = (typeof PROBLEM_TYPES)[number];
|
|
|
1027
977
|
*/
|
|
1028
978
|
export declare const PROBLEM_EXAMPLES: Readonly<Record<ProblemType, ProblemDetails>>;
|
|
1029
979
|
//#endregion
|
|
1030
|
-
export { type AgentAdapterOptions, type AgentCall, type AgentMounted, type AgentOutcome, type AgentRuntimeContext, type AgentRuntimeDomain, type AgentRuntimeModel, type AgentRuntimeMounted, type AgentRuntimeOperation, type AgentRuntimeOptions, type AgentRuntimeScenarioName, type AgentScenarioDomain, type AgentScenarioName, type AgentToolName, type ApprovalStoreOptions, type AuthzenEvaluationVector, type AuthzenEvaluationsVector, type AuthzenSearchVector, type AuthzenVectors, type ClientParityCase, type ClientParityOptions, type ClientStoreFactory, type ClientStoreFactoryOptions, type ClientStoreHandle, type ClientStorePermDock, type ClientStoreStatus, type CloudApiKeys, type DecisionProviderRunnerOptions, type DeliveryFailureKind, type DeliveryTransportHarness, type DeliveryTransportOptions, type DescribePolicyConfig, type HttpAdapterOptions, type HttpCall, type HttpMounted, type HttpOp, type HttpResult, type HttpScenarioDomain, type HttpScenarioName, type LegacyParityCase, type MatrixCell, type MatrixOutcome, type OrmParityCase, type OrmParityOptions, type OrmParityReport, type OrmParityRunInput, type OrmParityScenario, type RlsDbOutcome, type RlsFieldsOutcome, type RlsParityCase, type RlsParityFixture, type RlsParityOptions, type RlsParityReport, type RlsParitySubject, type RlsQueryFn, type RlsQueryResult, type SupabaseClaimFixture, type SupabaseClaimFixtureName, type SupabaseClaimVectors, type TestAuthzenOptions, type TestCloudApiOptions, type TestCloudPlatformOptions, expectTypeOf, supabaseMembershipsBudget };
|
|
980
|
+
export { type AgentAdapterOptions, type AgentCall, type AgentMounted, type AgentOutcome, type AgentRuntimeContext, type AgentRuntimeDomain, type AgentRuntimeModel, type AgentRuntimeMounted, type AgentRuntimeOperation, type AgentRuntimeOptions, type AgentRuntimeScenarioName, type AgentScenarioDomain, type AgentScenarioName, type AgentToolName, type ApprovalStoreOptions, type AuthzenEvaluationVector, type AuthzenEvaluationsVector, type AuthzenSearchVector, type AuthzenVectors, type ClientParityCase, type ClientParityOptions, type ClientStoreFactory, type ClientStoreFactoryOptions, type ClientStoreHandle, type ClientStorePermDock, type ClientStoreStatus, type CloudApiKeys, type DecisionProviderRunnerOptions, type DeliveryFailureKind, type DeliveryTransportHarness, type DeliveryTransportOptions, type DescribePolicyConfig, type HttpAdapterOptions, type HttpCall, type HttpMounted, type HttpOp, type HttpResult, type HttpScenarioDomain, type HttpScenarioName, type LegacyParityCase, type MatrixCell, type MatrixOutcome, type OrmParityCase, type OrmParityOptions, type OrmParityReport, type OrmParityRunInput, type OrmParityScenario, type PolicyMatrixCell, type PolicyMatrixReport, type RlsDbOutcome, type RlsFieldsOutcome, type RlsParityCase, type RlsParityFixture, type RlsParityOptions, type RlsParityReport, type RlsParitySubject, type RlsQueryFn, type RlsQueryResult, type SeedRows, type SupabaseClaimFixture, type SupabaseClaimFixtureName, type SupabaseClaimVectors, type TestAuthzenOptions, type TestCloudApiOptions, type TestCloudPlatformOptions, expectTypeOf, policyMatrix, supabaseMembershipsBudget, testOrmParity, testRlsParity };
|