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/mcp/index.js
CHANGED
|
@@ -1,27 +1,33 @@
|
|
|
1
1
|
import { r as isRecord, t as compact } from "../compact-CAf557ZB.js";
|
|
2
|
-
import { n as freezeDeep } from "../freeze-
|
|
3
|
-
import { i as stepUpOf } from "../problem-details-
|
|
4
|
-
import {
|
|
5
|
-
import { m as annotationsFor } from "../permission-registry-
|
|
6
|
-
import { t as actorMayCallTool } from "../delegation-
|
|
2
|
+
import { n as freezeDeep } from "../freeze-jjan0lCv.js";
|
|
3
|
+
import { i as stepUpOf, o as statusProblem } from "../problem-details-CLDgX1KV.js";
|
|
4
|
+
import { n as describe } from "../describe-Bb4hGK5d.js";
|
|
5
|
+
import { m as annotationsFor } from "../permission-registry-B8tYxPIt.js";
|
|
6
|
+
import { t as actorMayCallTool } from "../delegation-CDB6_keF.js";
|
|
7
7
|
import { n as resourceRef } from "../resource-ref-CaS9yVPi.js";
|
|
8
|
-
import {
|
|
8
|
+
import { i as challengeScope, l as withApp, o as hasScope, s as scopesReaching } from "../permdock-L-_I_3zP.js";
|
|
9
9
|
import { t as anonymousSubject } from "../subject-BGoM5o8B.js";
|
|
10
|
-
import { t as composeWraps } from "../wrap-
|
|
11
|
-
import { l as
|
|
12
|
-
import { t as clientNameOf } from "../clients-
|
|
13
|
-
import {
|
|
14
|
-
import { r as instanceOptions } from "../build-instance-
|
|
15
|
-
import {
|
|
10
|
+
import { t as composeWraps } from "../wrap-B2wziJI_.js";
|
|
11
|
+
import { l as problemResponse, o as methodNotAllowed, r as bearerChallenge, u as protectedResourceMetadataUrl } from "../problem-BVLHFK33.js";
|
|
12
|
+
import { t as clientNameOf } from "../clients-DYr3U86j.js";
|
|
13
|
+
import { r as mapClaimsToSubject } from "../map-claims-BNWCJtmP.js";
|
|
14
|
+
import { r as instanceOptions } from "../build-instance-CNWaYJyr.js";
|
|
15
|
+
import { i as refusalText, n as createAgentKernel } from "../kernel-C-fYydV2.js";
|
|
16
16
|
import { t as boundedMap } from "../lru-8q4WZjBV.js";
|
|
17
17
|
import { t as delegationFrom } from "../delegation-input-FTxMK3ji.js";
|
|
18
|
-
import { n as deniedToolRefusal, r as toolErrorResult, t as approvalToolRefusal } from "../tool-refusal-
|
|
18
|
+
import { n as deniedToolRefusal, r as toolErrorResult, t as approvalToolRefusal } from "../tool-refusal-Qpjs_W6M.js";
|
|
19
19
|
//#region src/mcp/mcp-auth.ts
|
|
20
|
-
/**
|
|
20
|
+
/**
|
|
21
|
+
* `_meta` key on `tools/call`, `resources/read` and `prompts/get` carrying an
|
|
22
|
+
* approval token.
|
|
23
|
+
*/
|
|
21
24
|
const APPROVAL_META_KEY = "dev.permdock/approval";
|
|
22
25
|
const CLIENT_CAPABILITIES = "io.modelcontextprotocol/clientCapabilities";
|
|
23
26
|
const PROTOCOL_VERSION = "io.modelcontextprotocol/protocolVersion";
|
|
24
|
-
/**
|
|
27
|
+
/**
|
|
28
|
+
* The first protocol revision whose list results define `ttlMs` and
|
|
29
|
+
* `cacheScope`.
|
|
30
|
+
*/
|
|
25
31
|
const CACHEABLE_LISTS_SINCE = "2026-07-28";
|
|
26
32
|
function contextOf(value) {
|
|
27
33
|
return isRecord(value) ? value : {};
|
|
@@ -54,8 +60,8 @@ function sameResource(expected, actual) {
|
|
|
54
60
|
}
|
|
55
61
|
/**
|
|
56
62
|
* Whether the request was sent under a revision that defines `cacheScope` on
|
|
57
|
-
* list results. Only those requests carry the per-request envelope; a
|
|
58
|
-
*
|
|
63
|
+
* list results. Only those requests carry the per-request envelope; a 2025-era
|
|
64
|
+
* request has none and gets no cache fields.
|
|
59
65
|
*/
|
|
60
66
|
function definesCacheScope(context) {
|
|
61
67
|
const version = context.mcpReq?.envelope?.[PROTOCOL_VERSION];
|
|
@@ -165,7 +171,10 @@ function throwRefusal(refusal) {
|
|
|
165
171
|
if (refusal.inputRequired !== void 0) return refusal.inputRequired;
|
|
166
172
|
throw new Error(refusal.text);
|
|
167
173
|
}
|
|
168
|
-
/**
|
|
174
|
+
/**
|
|
175
|
+
* The MRTR URL elicitation that sends the user to `options.approval.at`, when
|
|
176
|
+
* the client accepts one.
|
|
177
|
+
*/
|
|
169
178
|
async function approvalInput(options, decision, handlerContext, context, capabilities) {
|
|
170
179
|
const at = options.approval?.at;
|
|
171
180
|
if (at === void 0 || !acceptsUrlElicitation(context, capabilities)) return;
|
|
@@ -174,7 +183,10 @@ async function approvalInput(options, decision, handlerContext, context, capabil
|
|
|
174
183
|
const requestState = options.requestState === void 0 ? decision.token : await options.requestState.mint(decision.token, handlerContext);
|
|
175
184
|
return urlElicitation("approval", options.approval?.hint ?? describe(decision).detail, url, requestState);
|
|
176
185
|
}
|
|
177
|
-
/**
|
|
186
|
+
/**
|
|
187
|
+
* A step-up denial: the RFC 9470 challenge, and a URL elicitation to `stepUpAt`
|
|
188
|
+
* when the client accepts one.
|
|
189
|
+
*/
|
|
178
190
|
function stepUpRefusal(stepUpAt, decision, permission, data, context, capabilities) {
|
|
179
191
|
const base = deniedRefusal(decision, permission, data);
|
|
180
192
|
const { acrValues, maxAge } = stepUpOf(decision);
|
|
@@ -215,7 +227,10 @@ function forThisServer(checks, authInfo) {
|
|
|
215
227
|
function reachable(checks, authInfo, reach) {
|
|
216
228
|
return authInfo === void 0 ? checks.options.requireAuthInfo !== true : forThisServer(checks, authInfo) && hasScope(authInfo.scopes, reach.scopes);
|
|
217
229
|
}
|
|
218
|
-
/**
|
|
230
|
+
/**
|
|
231
|
+
* The refusal a token earns before any decision: none, the wrong resource, or a
|
|
232
|
+
* missing scope.
|
|
233
|
+
*/
|
|
219
234
|
function credentialRefusal(checks, permission, reach, authInfo) {
|
|
220
235
|
if (authInfo === void 0) return checks.options.requireAuthInfo === true ? plainRefusal(permission, "Denied: no verified credentials.", { error: "invalid_token" }) : void 0;
|
|
221
236
|
if (!forThisServer(checks, authInfo)) return plainRefusal(permission, "Denied: the token was not issued for this server.", { error: "invalid_token" });
|
|
@@ -233,7 +248,10 @@ function credentialRefusal(checks, permission, reach, authInfo) {
|
|
|
233
248
|
}))
|
|
234
249
|
}));
|
|
235
250
|
}
|
|
236
|
-
/**
|
|
251
|
+
/**
|
|
252
|
+
* The completion re-check of a long-running tool: the call must still be
|
|
253
|
+
* allowed, or approved with the same token.
|
|
254
|
+
*/
|
|
237
255
|
async function recheck(checks, binding, args, call, permission, approved, tool) {
|
|
238
256
|
const rechecked = await checks.kernel.check(binding, args, call, compact({
|
|
239
257
|
simulate: true,
|
|
@@ -328,8 +346,9 @@ async function checkCall(checks, permission, reach, args, load, context, handler
|
|
|
328
346
|
};
|
|
329
347
|
}
|
|
330
348
|
/**
|
|
331
|
-
* The keys a list shows: unguarded ones, and guarded ones the token reaches and
|
|
332
|
-
* With `tools`, a guarded key is also a tool name an
|
|
349
|
+
* The keys a list shows: unguarded ones, and guarded ones the token reaches and
|
|
350
|
+
* the subject may use. With `tools`, a guarded key is also a tool name an
|
|
351
|
+
* `agent` actor's `tools` list must name.
|
|
333
352
|
*/
|
|
334
353
|
async function visible(checks, context, permissionOf, keys, declaredOf = () => void 0, tools = false) {
|
|
335
354
|
const authInfo = context.http?.authInfo;
|
|
@@ -383,6 +402,13 @@ function requirePermission(kind, name, config) {
|
|
|
383
402
|
if (!isRecord(permission) || typeof permission["key"] !== "string") throw new TypeError(`permdock/mcp: ${kind} ${name} has no permission; every guarded registration needs one.`);
|
|
384
403
|
return permission;
|
|
385
404
|
}
|
|
405
|
+
const UI_SCHEME = "ui://";
|
|
406
|
+
/** The MCP Apps view a tool links through `_meta.ui.resourceUri`. */
|
|
407
|
+
function uiResourceUri(meta) {
|
|
408
|
+
const ui = isRecord(meta) ? meta["ui"] : void 0;
|
|
409
|
+
const uri = isRecord(ui) ? ui["resourceUri"] : void 0;
|
|
410
|
+
return typeof uri === "string" && uri.startsWith(UI_SCHEME) ? uri : void 0;
|
|
411
|
+
}
|
|
386
412
|
function guardUpdates(registered, wrap, rename, currentName) {
|
|
387
413
|
const update = registered.update.bind(registered);
|
|
388
414
|
registered.update = (updates) => {
|
|
@@ -400,21 +426,23 @@ function protectServer(checks, server, enforcement) {
|
|
|
400
426
|
const toolScopes = /* @__PURE__ */ new Map();
|
|
401
427
|
const prompts = /* @__PURE__ */ new Map();
|
|
402
428
|
const resources = /* @__PURE__ */ new Map();
|
|
429
|
+
const views = /* @__PURE__ */ new Set();
|
|
430
|
+
const uiLinks = /* @__PURE__ */ new Map();
|
|
403
431
|
const templates = [];
|
|
404
432
|
const lastListed = boundedMap(SESSIONS_PER_SERVER);
|
|
405
433
|
const toolPermission = (name) => tools.get(name);
|
|
406
434
|
const toolDeclared = (name) => toolScopes.get(name);
|
|
407
435
|
const promptPermission = (name) => prompts.get(name);
|
|
408
436
|
const resourcePermission = (uri) => {
|
|
409
|
-
const direct = resources.get(uri);
|
|
437
|
+
const direct = resources.get(uri) ?? uiLinks.get(uri)?.permission;
|
|
410
438
|
if (direct !== void 0) return direct;
|
|
411
439
|
return templates.find((entry) => entry.template.uriTemplate.match(uri) !== null)?.permission;
|
|
412
440
|
};
|
|
413
441
|
const templatePermission = (uriTemplate) => templates.find((entry) => entry.template.uriTemplate.toString() === uriTemplate)?.permission;
|
|
414
|
-
const listFilter = (field, keyOf, permissionOf, remember) => async (result, rawContext) => {
|
|
442
|
+
const listFilter = (field, keyOf, permissionOf, remember, hidden = () => false) => async (result, rawContext) => {
|
|
415
443
|
if (!isRecord(result) || !Array.isArray(result[field])) return result;
|
|
416
444
|
const context = contextOf(rawContext);
|
|
417
|
-
const entries = result[field];
|
|
445
|
+
const entries = result[field].filter((entry) => !hidden(keyOf(entry)));
|
|
418
446
|
const shown = await visible(checks, context, permissionOf, entries.map(keyOf), remember ? toolDeclared : void 0, remember);
|
|
419
447
|
const kept = entries.filter((entry) => shown.has(keyOf(entry)));
|
|
420
448
|
if (remember) lastListed.set(sessionKey(context), [...shown].toSorted().join(","));
|
|
@@ -430,7 +458,7 @@ function protectServer(checks, server, enforcement) {
|
|
|
430
458
|
const filters = {
|
|
431
459
|
"tools/list": listFilter("tools", (entry) => entry.name, toolPermission, true),
|
|
432
460
|
"prompts/list": listFilter("prompts", (entry) => entry.name, promptPermission, false),
|
|
433
|
-
"resources/list": listFilter("resources", (entry) => entry.uri, resourcePermission, false),
|
|
461
|
+
"resources/list": listFilter("resources", (entry) => entry.uri, resourcePermission, false, (uri) => views.has(uri) && resourcePermission(uri) === void 0),
|
|
434
462
|
"resources/templates/list": listFilter("resourceTemplates", (entry) => entry.uriTemplate, templatePermission, false)
|
|
435
463
|
};
|
|
436
464
|
const inner = server.server;
|
|
@@ -476,7 +504,10 @@ function protectServer(checks, server, enforcement) {
|
|
|
476
504
|
for (const field of ["data", "longRunning"]) if (config[field] !== void 0) throw new TypeError(`permdock/mcp: tool ${name} sets ${field}, but with enforce: 'procedure' its procedure decides.`);
|
|
477
505
|
return requirePermission("tool", name, { permission: enforcement.permissionFor(name) });
|
|
478
506
|
};
|
|
479
|
-
/**
|
|
507
|
+
/**
|
|
508
|
+
* With `enforce: 'procedure'` the handler runs undecided: the procedure it
|
|
509
|
+
* calls decides.
|
|
510
|
+
*/
|
|
480
511
|
const wrapTool = (tool, permission, reach, load, handler, longRunning) => enforcement === void 0 ? guardTool(tool, permission, reach, load, handler, longRunning) : async (...params) => {
|
|
481
512
|
const result = await handler(...params);
|
|
482
513
|
await announce(contextOf(params.at(-1)));
|
|
@@ -484,6 +515,9 @@ function protectServer(checks, server, enforcement) {
|
|
|
484
515
|
};
|
|
485
516
|
const registerTool = (name, config, handler) => {
|
|
486
517
|
const permission = toolPermissionOf(name, config);
|
|
518
|
+
const view = uiResourceUri(config["_meta"]);
|
|
519
|
+
const linked = view === void 0 ? void 0 : uiLinks.get(view);
|
|
520
|
+
if (view !== void 0 && linked !== void 0 && linked.permission.key !== permission.key) throw new TypeError(`permdock/mcp: tools ${linked.tool} and ${name} link ${view} under different permissions; give the resource its own permission.`);
|
|
487
521
|
const { permission: _permission, data, scopeChallenge, longRunning: rawLongRunning, oauthScopes: rawScopes, ...passthrough } = config;
|
|
488
522
|
const load = data;
|
|
489
523
|
const longRunning = rawLongRunning === true;
|
|
@@ -501,6 +535,10 @@ function protectServer(checks, server, enforcement) {
|
|
|
501
535
|
}, wrapTool(tool, permission, reach, load, handler, longRunning));
|
|
502
536
|
tools.set(name, permission);
|
|
503
537
|
if (declared !== void 0) toolScopes.set(name, declared);
|
|
538
|
+
if (view !== void 0 && linked === void 0) uiLinks.set(view, {
|
|
539
|
+
tool: name,
|
|
540
|
+
permission
|
|
541
|
+
});
|
|
504
542
|
guardUpdates(registered, (callback) => wrapTool(tool, permission, reach, load, callback, longRunning), (from, to) => {
|
|
505
543
|
tools.delete(from);
|
|
506
544
|
toolScopes.delete(from);
|
|
@@ -528,18 +566,33 @@ function protectServer(checks, server, enforcement) {
|
|
|
528
566
|
};
|
|
529
567
|
const originalResource = server.registerResource.bind(server);
|
|
530
568
|
const registerResource = (name, uriOrTemplate, config, read) => {
|
|
531
|
-
const
|
|
569
|
+
const own = config["permission"] === void 0 && typeof uriOrTemplate === "string" && uriOrTemplate.startsWith(UI_SCHEME) ? void 0 : requirePermission("resource", name, config);
|
|
570
|
+
/**
|
|
571
|
+
* A `ui://` view without its own permission takes the one of the tool
|
|
572
|
+
* linking it; unlinked, it denies.
|
|
573
|
+
*/
|
|
574
|
+
const permissionNow = () => own ?? (typeof uriOrTemplate === "string" ? uiLinks.get(uriOrTemplate)?.permission : void 0);
|
|
532
575
|
const { permission: _permission, data, scopeChallenge, ...passthrough } = config;
|
|
533
576
|
const load = data;
|
|
534
|
-
const
|
|
577
|
+
const ownChallenge = scopeChallenge;
|
|
578
|
+
const wrap = (callback) => (...params) => {
|
|
579
|
+
const permission = permissionNow();
|
|
580
|
+
if (permission === void 0) return Promise.reject(/* @__PURE__ */ new Error(`Denied: resource ${name} is linked to no guarded tool.`));
|
|
581
|
+
return guard(checks, permission, load, callback, (args) => args.slice(0, -1), throwRefusal, { capabilities })(...params);
|
|
582
|
+
};
|
|
535
583
|
const registered = originalResource(name, uriOrTemplate, {
|
|
536
584
|
...passthrough,
|
|
537
|
-
scopeChallenge:
|
|
585
|
+
scopeChallenge: (context) => {
|
|
586
|
+
const permission = permissionNow();
|
|
587
|
+
return permission === void 0 ? ownChallenge?.(context) : challengeFor(ownChallenge, scopesReaching(checks.policy, permission), challengeScope(checks.policy, permission))(context);
|
|
588
|
+
}
|
|
538
589
|
}, wrap(read));
|
|
539
|
-
if (typeof uriOrTemplate === "string")
|
|
540
|
-
|
|
590
|
+
if (typeof uriOrTemplate === "string") {
|
|
591
|
+
if (own === void 0) views.add(uriOrTemplate);
|
|
592
|
+
else resources.set(uriOrTemplate, own);
|
|
593
|
+
} else if (own !== void 0) templates.push({
|
|
541
594
|
template: uriOrTemplate,
|
|
542
|
-
permission
|
|
595
|
+
permission: own
|
|
543
596
|
});
|
|
544
597
|
guardUpdates(registered, wrap);
|
|
545
598
|
return registered;
|
|
@@ -553,18 +606,20 @@ function protectServer(checks, server, enforcement) {
|
|
|
553
606
|
//#endregion
|
|
554
607
|
//#region src/mcp/subject.ts
|
|
555
608
|
const DEFAULT_MCP_ACTOR_KIND = "mcp-client";
|
|
556
|
-
/**
|
|
609
|
+
/**
|
|
610
|
+
* `kind`, or the default when absent; `undefined` for a kind that is not a
|
|
611
|
+
* non-empty string.
|
|
612
|
+
*/
|
|
557
613
|
function mcpActorKind(kind) {
|
|
558
614
|
if (kind === void 0) return DEFAULT_MCP_ACTOR_KIND;
|
|
559
615
|
return typeof kind === "string" && kind !== "" ? kind : void 0;
|
|
560
616
|
}
|
|
561
617
|
/**
|
|
562
618
|
* Maps the `AuthInfo` the MCP SDK's bearer verification produced to a
|
|
563
|
-
* `Subject`: the principal from the verified claims in `extra`, the client
|
|
564
|
-
*
|
|
565
|
-
*
|
|
566
|
-
*
|
|
567
|
-
* the anonymous subject.
|
|
619
|
+
* `Subject`: the principal from the verified claims in `extra`, the client as
|
|
620
|
+
* an actor of kind `actorKind` (`mcp-client` by default), the granted scopes as
|
|
621
|
+
* the delegation. Never verifies and never throws; anything unusable, including
|
|
622
|
+
* an `actorKind` that is not a non-empty string, is the anonymous subject.
|
|
568
623
|
*/
|
|
569
624
|
function subjectFromMcp(authInfo, options = {}) {
|
|
570
625
|
try {
|
|
@@ -628,4 +683,108 @@ function createPermDock(policy, given) {
|
|
|
628
683
|
return { protectServer: ((server, enforcement) => protectServer(checks, server, enforcement)) };
|
|
629
684
|
}
|
|
630
685
|
//#endregion
|
|
631
|
-
|
|
686
|
+
//#region src/mcp/resource-guard.ts
|
|
687
|
+
/**
|
|
688
|
+
* The `error_description` of every `invalid_token` challenge (RFC 6750 section
|
|
689
|
+
* 3.1).
|
|
690
|
+
*/
|
|
691
|
+
const INVALID_TOKEN = "The access token is invalid";
|
|
692
|
+
const BEARER = /^Bearer +([\w~+/.-]+=*)$/iu;
|
|
693
|
+
function tokenScopes(claims) {
|
|
694
|
+
const { scope, scp } = claims;
|
|
695
|
+
if (typeof scope === "string") return scope.split(" ").filter((name) => name !== "");
|
|
696
|
+
return Array.isArray(scp) ? scp.filter((name) => typeof name === "string") : [];
|
|
697
|
+
}
|
|
698
|
+
function refuse(status, challenge, detail) {
|
|
699
|
+
return {
|
|
700
|
+
ok: false,
|
|
701
|
+
response: problemResponse(statusProblem(status, detail), void 0, void 0, { "WWW-Authenticate": challenge })
|
|
702
|
+
};
|
|
703
|
+
}
|
|
704
|
+
/**
|
|
705
|
+
* The resource-server check in front of an MCP endpoint (MCP authorization, RFC
|
|
706
|
+
* 6750, RFC 9728): reads the bearer token from `Authorization`, verifies it for
|
|
707
|
+
* `resource`, refuses a revoked one and checks `scopes`. It answers the
|
|
708
|
+
* `McpAuthInfo` the SDK's handlers read, or the `401` or `403` response with a
|
|
709
|
+
* `WWW-Authenticate` challenge naming the metadata URL. A token in the query
|
|
710
|
+
* string is never read. Never throws.
|
|
711
|
+
*/
|
|
712
|
+
function mcpResourceGuard(options) {
|
|
713
|
+
const resource = new URL(String(options.resource));
|
|
714
|
+
const resourceMetadata = options.resourceMetadataUrl ?? protectedResourceMetadataUrl(resource);
|
|
715
|
+
const required = options.scopes ?? [];
|
|
716
|
+
const invalid = () => refuse(401, bearerChallenge({
|
|
717
|
+
error: "invalid_token",
|
|
718
|
+
description: INVALID_TOKEN,
|
|
719
|
+
resourceMetadata
|
|
720
|
+
}), "invalid access token");
|
|
721
|
+
return async (request) => {
|
|
722
|
+
const header = request.headers.get("authorization");
|
|
723
|
+
if (header === null || header.trim() === "") return refuse(401, `Bearer resource_metadata="${resourceMetadata}"`, "access token required");
|
|
724
|
+
const token = BEARER.exec(header.trim())?.[1];
|
|
725
|
+
if (token === void 0) return invalid();
|
|
726
|
+
let claims;
|
|
727
|
+
try {
|
|
728
|
+
const verified = await options.verifier.verify(token, compact({
|
|
729
|
+
audience: resource.href,
|
|
730
|
+
issuer: options.issuer
|
|
731
|
+
}));
|
|
732
|
+
if (!verified.ok) return invalid();
|
|
733
|
+
claims = verified.claims;
|
|
734
|
+
if (options.revoked !== void 0 && await options.revoked(claims)) return invalid();
|
|
735
|
+
} catch {
|
|
736
|
+
return invalid();
|
|
737
|
+
}
|
|
738
|
+
const scopes = tokenScopes(claims);
|
|
739
|
+
if (required.some((scope) => !scopes.includes(scope))) return refuse(403, bearerChallenge({
|
|
740
|
+
error: "insufficient_scope",
|
|
741
|
+
scopes: required,
|
|
742
|
+
resourceMetadata
|
|
743
|
+
}), "insufficient scope");
|
|
744
|
+
const clientId = claims["client_id"] ?? claims["azp"];
|
|
745
|
+
return {
|
|
746
|
+
ok: true,
|
|
747
|
+
authInfo: compact({
|
|
748
|
+
token,
|
|
749
|
+
clientId: typeof clientId === "string" ? clientId : void 0,
|
|
750
|
+
scopes,
|
|
751
|
+
expiresAt: claims.exp,
|
|
752
|
+
resource,
|
|
753
|
+
resourceMetadataUrl: resourceMetadata,
|
|
754
|
+
extra: { claims }
|
|
755
|
+
})
|
|
756
|
+
};
|
|
757
|
+
};
|
|
758
|
+
}
|
|
759
|
+
/**
|
|
760
|
+
* The RFC 9728 Protected Resource Metadata document as a Fetch handler, for
|
|
761
|
+
* `/.well-known/oauth-protected-resource<path>`. `bearer_methods_supported` is
|
|
762
|
+
* `header`, the only method `mcpResourceGuard` reads. Any origin may read it.
|
|
763
|
+
*/
|
|
764
|
+
function protectedResourceMetadata(options) {
|
|
765
|
+
const body = JSON.stringify(compact({
|
|
766
|
+
resource: new URL(String(options.resource)).href,
|
|
767
|
+
authorization_servers: options.authorizationServers,
|
|
768
|
+
scopes_supported: options.scopesSupported,
|
|
769
|
+
bearer_methods_supported: ["header"],
|
|
770
|
+
resource_name: options.resourceName,
|
|
771
|
+
resource_documentation: options.resourceDocumentation
|
|
772
|
+
}));
|
|
773
|
+
return (request) => {
|
|
774
|
+
if (request.method === "OPTIONS") return new Response(null, {
|
|
775
|
+
status: 204,
|
|
776
|
+
headers: {
|
|
777
|
+
"access-control-allow-origin": "*",
|
|
778
|
+
"access-control-allow-methods": "GET, OPTIONS"
|
|
779
|
+
}
|
|
780
|
+
});
|
|
781
|
+
if (request.method !== "GET" && request.method !== "HEAD") return methodNotAllowed("GET, HEAD, OPTIONS");
|
|
782
|
+
return new Response(request.method === "HEAD" ? null : body, { headers: {
|
|
783
|
+
"content-type": "application/json",
|
|
784
|
+
"access-control-allow-origin": "*",
|
|
785
|
+
"cache-control": "public, max-age=3600"
|
|
786
|
+
} });
|
|
787
|
+
};
|
|
788
|
+
}
|
|
789
|
+
//#endregion
|
|
790
|
+
export { APPROVAL_META_KEY, createPermDock, mcpResourceGuard, protectedResourceMetadata, subjectFromMcp };
|
|
@@ -1,15 +1,15 @@
|
|
|
1
1
|
import { r as isRecord } from "./compact-CAf557ZB.js";
|
|
2
|
-
import { i as dateAt } from "./time-
|
|
3
|
-
import { a as describeError } from "./errors-
|
|
4
|
-
import { o as sqlFiles } from "./files-
|
|
5
|
-
import { r as escapeSqlIdent, s as quoteSqlLiteral } from "./sql-
|
|
6
|
-
import "./sources-
|
|
7
|
-
import { a as RETIRE_MARKER } from "./markers-
|
|
8
|
-
import {
|
|
9
|
-
import { f as writeOutputFiles, n as dataMigrationFile } from "./output-files-
|
|
10
|
-
import { r as HELPERS } from "./shared-
|
|
11
|
-
import { o as sqlStatements } from "./deciding-columns-
|
|
12
|
-
import { i as retireSql, r as retirePlan } from "./retire-
|
|
2
|
+
import { i as dateAt } from "./time-nR1JesoH.js";
|
|
3
|
+
import { a as describeError } from "./errors-Vpu6rKHl.js";
|
|
4
|
+
import { o as sqlFiles } from "./files-BSjrtIHw.js";
|
|
5
|
+
import { r as escapeSqlIdent, s as quoteSqlLiteral } from "./sql-0WjxIp9g.js";
|
|
6
|
+
import "./sources-CMAM-2A3.js";
|
|
7
|
+
import { a as RETIRE_MARKER } from "./markers-BeHZ4x9Q.js";
|
|
8
|
+
import { i as refuseDirty, t as applyFiles } from "./files-B3AA05f1.js";
|
|
9
|
+
import { f as writeOutputFiles, n as dataMigrationFile } from "./output-files-BIQ_9pIs.js";
|
|
10
|
+
import { r as HELPERS } from "./shared-Afctg7B0.js";
|
|
11
|
+
import { o as sqlStatements } from "./deciding-columns-NB4wcyBf.js";
|
|
12
|
+
import { i as retireSql, r as retirePlan } from "./retire-B2xffQgY.js";
|
|
13
13
|
import { existsSync, readFileSync } from "node:fs";
|
|
14
14
|
import { relative, resolve } from "node:path";
|
|
15
15
|
import { parse } from "pgsql-parser";
|
|
@@ -84,6 +84,32 @@ function callEnd(text, start) {
|
|
|
84
84
|
}
|
|
85
85
|
return -1;
|
|
86
86
|
}
|
|
87
|
+
/**
|
|
88
|
+
* The top-level arguments of the call at `start`, as written; `end` is past its
|
|
89
|
+
* closing paren.
|
|
90
|
+
*/
|
|
91
|
+
function argTexts(text, start, end) {
|
|
92
|
+
const open = text.indexOf("(", start);
|
|
93
|
+
const args = [];
|
|
94
|
+
let from = open + 1;
|
|
95
|
+
let depth = 0;
|
|
96
|
+
for (let index = open; index < end; index += 1) {
|
|
97
|
+
const char = text[index];
|
|
98
|
+
if (char === "'" || char === "\"") {
|
|
99
|
+
index = Math.max(text.indexOf(char, index + 1), index);
|
|
100
|
+
continue;
|
|
101
|
+
}
|
|
102
|
+
if (char === "(" || char === "[") depth += 1;
|
|
103
|
+
else if (char === ")" || char === "]") {
|
|
104
|
+
depth -= 1;
|
|
105
|
+
if (depth === 0) args.push(text.slice(from, index));
|
|
106
|
+
} else if (char === "," && depth === 1) {
|
|
107
|
+
args.push(text.slice(from, index));
|
|
108
|
+
from = index + 1;
|
|
109
|
+
}
|
|
110
|
+
}
|
|
111
|
+
return args.map((arg) => arg.trim());
|
|
112
|
+
}
|
|
87
113
|
const IDENTIFIER = String.raw`(?:"(?:[^"]|"")+"|[A-Za-z_][\w$]*)`;
|
|
88
114
|
const COLUMN = new RegExp(String.raw`${IDENTIFIER}(?:\s*\.\s*${IDENTIFIER})*`, "uy");
|
|
89
115
|
function columnText(text, start) {
|
|
@@ -106,7 +132,10 @@ function isNullConst(node) {
|
|
|
106
132
|
return child(child(node, "A_Const"), "isnull") === true;
|
|
107
133
|
}
|
|
108
134
|
const literal = quoteSqlLiteral;
|
|
109
|
-
/**
|
|
135
|
+
/**
|
|
136
|
+
* The PermDock key for a legacy one: `keys` first, then `renamed`, then the
|
|
137
|
+
* longest matching prefix.
|
|
138
|
+
*/
|
|
110
139
|
function mapKey(config, key, renamed = {}) {
|
|
111
140
|
const exact = config.keys?.[key];
|
|
112
141
|
if (exact !== void 0) return exact;
|
|
@@ -125,6 +154,8 @@ var Rewriter = class {
|
|
|
125
154
|
#target;
|
|
126
155
|
#text;
|
|
127
156
|
#at;
|
|
157
|
+
/** The written arguments of the call being rewritten. */
|
|
158
|
+
#args = [];
|
|
128
159
|
constructor(config, target, text) {
|
|
129
160
|
this.#config = config;
|
|
130
161
|
this.#target = target;
|
|
@@ -146,9 +177,12 @@ var Rewriter = class {
|
|
|
146
177
|
if (this.#target.granted.get(scope)?.has(key) !== true) return skip("not-granted-on-scope", [...this.#target.granted.values()].some((keys) => keys.has(key)) ? `no role grants ${key} on ${scope}, so the helper would always deny` : `${key} has no unconditional allow row in role_permissions: a conditional, time-bounded or deny-mixed grant splits its grant key, so the helper would always deny`);
|
|
147
178
|
return { to: literal(key) };
|
|
148
179
|
}
|
|
149
|
-
#column(arg) {
|
|
180
|
+
#column(arg, index) {
|
|
150
181
|
const location = child(child(arg, "ColumnRef"), "location");
|
|
151
|
-
if (typeof location !== "number")
|
|
182
|
+
if (typeof location !== "number") {
|
|
183
|
+
const written = this.#args[index];
|
|
184
|
+
return written === void 0 || written === "" ? skip("not-a-column", "the id is an expression whose text could not be read; rewrite it by hand") : { to: `(${written})` };
|
|
185
|
+
}
|
|
152
186
|
const text = columnText(this.#text, this.#at(location));
|
|
153
187
|
return text === void 0 ? skip("not-a-column", "the id could not be read as a column") : { to: text };
|
|
154
188
|
}
|
|
@@ -158,8 +192,8 @@ var Rewriter = class {
|
|
|
158
192
|
const key = this.#key(keyArg, scope);
|
|
159
193
|
return "to" in key ? { to: `${helper}(${key.to})` } : key;
|
|
160
194
|
}
|
|
161
|
-
#row(scope, idArg, keyArg) {
|
|
162
|
-
const column = this.#column(idArg);
|
|
195
|
+
#row(scope, idArg, keyArg, idIndex) {
|
|
196
|
+
const column = this.#column(idArg, idIndex);
|
|
163
197
|
if (!("to" in column)) return column;
|
|
164
198
|
const ids = this.#ids(scope, keyArg);
|
|
165
199
|
return "to" in ids ? { to: `(${column.to} in (select ${ids.to}))` } : ids;
|
|
@@ -175,7 +209,7 @@ var Rewriter = class {
|
|
|
175
209
|
#membership(scope, idArg) {
|
|
176
210
|
const helper = this.#helper(`member_${scope}_ids`);
|
|
177
211
|
if (helper === void 0) return skip("missing-helper", `rls generate writes no member_${scope}_ids: ${scope} has no membership source`);
|
|
178
|
-
const column = this.#column(idArg);
|
|
212
|
+
const column = this.#column(idArg, 0);
|
|
179
213
|
return "to" in column ? { to: `(${column.to} in (select ${helper}()))` } : column;
|
|
180
214
|
}
|
|
181
215
|
#role(scope, idArg, roleArgs) {
|
|
@@ -190,7 +224,7 @@ var Rewriter = class {
|
|
|
190
224
|
if (!this.#target.roles.has(declared)) return skip("unknown-role", `${value} maps to ${declared}, which no role grants; add it to rls.roleValues or declare the role`);
|
|
191
225
|
mapped.push(declared);
|
|
192
226
|
}
|
|
193
|
-
const column = this.#column(idArg);
|
|
227
|
+
const column = this.#column(idArg, 0);
|
|
194
228
|
return "to" in column ? { to: `(${column.to} in (select ${helper}(array[${mapped.map(literal).join(", ")}])))` } : column;
|
|
195
229
|
}
|
|
196
230
|
#scoped(args, selected) {
|
|
@@ -198,14 +232,18 @@ var Rewriter = class {
|
|
|
198
232
|
const named = stringConst(scopeArg);
|
|
199
233
|
if (named === void 0) return skip("unknown-scope", "the scope is not a string literal; rewrite it by hand");
|
|
200
234
|
if (this.#config.globalScopes?.includes(named) === true || isNullConst(idArg)) return this.#global(keyArg, selected);
|
|
201
|
-
return this.#row(this.#config.scopes?.[named] ?? named, idArg, keyArg);
|
|
235
|
+
return this.#row(this.#config.scopes?.[named] ?? named, idArg, keyArg, 1);
|
|
202
236
|
}
|
|
203
|
-
/**
|
|
237
|
+
/**
|
|
238
|
+
* `selected`: the call is already a `select` target, so `permdock_has` needs
|
|
239
|
+
* no wrapping subquery.
|
|
240
|
+
*/
|
|
204
241
|
rewrite(call, selected) {
|
|
205
242
|
const { helper, args } = call;
|
|
243
|
+
this.#args = argTexts(this.#text, call.start, call.end);
|
|
206
244
|
switch (helper.form) {
|
|
207
245
|
case "ids": return this.#ids(helper.scope, args[0]);
|
|
208
|
-
case "row": return this.#row(helper.scope, args[0], args[1]);
|
|
246
|
+
case "row": return this.#row(helper.scope, args[0], args[1], 0);
|
|
209
247
|
case "membership": return this.#membership(helper.scope, args[0]);
|
|
210
248
|
case "role": return this.#role(helper.scope, args[0], args.slice(1));
|
|
211
249
|
case "scoped": return this.#scoped(args, selected);
|
|
@@ -246,7 +284,31 @@ function bodyStrings(statement) {
|
|
|
246
284
|
}
|
|
247
285
|
return found;
|
|
248
286
|
}
|
|
249
|
-
/**
|
|
287
|
+
/**
|
|
288
|
+
* What `call`, written inside a function body, becomes: the rewrite that its
|
|
289
|
+
* place keeps from being applied.
|
|
290
|
+
*/
|
|
291
|
+
async function suggest(call, config, target) {
|
|
292
|
+
const sql = `select ${call}`;
|
|
293
|
+
let tree;
|
|
294
|
+
try {
|
|
295
|
+
tree = await parse(sql);
|
|
296
|
+
} catch {
|
|
297
|
+
return;
|
|
298
|
+
}
|
|
299
|
+
const target0 = list(child(child(child(list(child(tree, "stmts"))[0], "stmt"), "SelectStmt"), "targetList"))[0];
|
|
300
|
+
const node = child(child(child(target0, "ResTarget"), "val"), "FuncCall");
|
|
301
|
+
if (!isRecord(node)) return;
|
|
302
|
+
const rewriter = new Rewriter(config, target, sql);
|
|
303
|
+
const found = rewriter.call(node);
|
|
304
|
+
if (found === void 0 || found.end === -1) return;
|
|
305
|
+
const outcome = rewriter.rewrite(found, true);
|
|
306
|
+
return "to" in outcome ? outcome.to : void 0;
|
|
307
|
+
}
|
|
308
|
+
/**
|
|
309
|
+
* Rewrites the configured helper calls in one file's policies; everything else
|
|
310
|
+
* is reported.
|
|
311
|
+
*/
|
|
250
312
|
async function migrateSql(file, text, config, target) {
|
|
251
313
|
const rewrites = [];
|
|
252
314
|
const skipped = [];
|
|
@@ -332,13 +394,19 @@ async function migrateSql(file, text, config, target) {
|
|
|
332
394
|
if (kind !== void 0 && BODY_STATEMENTS.has(kind)) {
|
|
333
395
|
for (const body of bodyStrings(child(statement, kind))) {
|
|
334
396
|
const bodyStart = text.indexOf(body, statementStart);
|
|
335
|
-
for (const match of body.matchAll(called))
|
|
336
|
-
|
|
337
|
-
|
|
338
|
-
|
|
339
|
-
|
|
340
|
-
|
|
341
|
-
|
|
397
|
+
for (const match of body.matchAll(called)) {
|
|
398
|
+
const matchAt = match.index ?? 0;
|
|
399
|
+
const end = callEnd(body, matchAt);
|
|
400
|
+
const suggestion = end === -1 ? void 0 : await suggest(body.slice(matchAt, end), config, target);
|
|
401
|
+
skipped.push({
|
|
402
|
+
file,
|
|
403
|
+
line: lineOf(text, (bodyStart === -1 ? statementStart : bodyStart) + matchAt),
|
|
404
|
+
call: match[1] ?? "",
|
|
405
|
+
reason: "function-body",
|
|
406
|
+
detail: "the call is inside a function body, which runs with its own privileges; rewrite it by hand",
|
|
407
|
+
...suggestion === void 0 ? {} : { suggestion }
|
|
408
|
+
});
|
|
409
|
+
}
|
|
342
410
|
}
|
|
343
411
|
continue;
|
|
344
412
|
}
|
|
@@ -359,13 +427,16 @@ function describeRetire(plan) {
|
|
|
359
427
|
});
|
|
360
428
|
}
|
|
361
429
|
function describe(report, write) {
|
|
362
|
-
const lines = [...report.rewrites.map((item) => `${item.file}:${String(item.line)} ${item.from} -> ${item.to}`), ...report.skipped.map((item) => `skipped ${item.file}:${String(item.line)} ${item.call}: ${item.detail}`)];
|
|
430
|
+
const lines = [...report.rewrites.map((item) => `${item.file}:${String(item.line)} ${item.from} -> ${item.to}`), ...report.skipped.map((item) => `skipped ${item.file}:${String(item.line)} ${item.call}: ${item.detail}${item.suggestion === void 0 ? "" : `; use ${item.suggestion}`}`)];
|
|
363
431
|
const files = new Set(report.rewrites.map((item) => item.file)).size;
|
|
364
432
|
const unknown = report.skipped.filter((item) => item.reason === "unknown-key").length;
|
|
365
433
|
lines.push(`rls migrate: ${write ? "rewrote" : "would rewrite"} ${String(report.rewrites.length)} call(s) in ${String(files)} file(s), skipped ${String(report.skipped.length)}${unknown === 0 ? "" : `, ${String(unknown)} with an unknown key`}${write ? "" : "; drop --dry-run to apply them"}`);
|
|
366
434
|
return lines.join("\n");
|
|
367
435
|
}
|
|
368
|
-
/**
|
|
436
|
+
/**
|
|
437
|
+
* `permdock rls migrate`: a dry run unless `write`; exits 1 while a key is
|
|
438
|
+
* unknown.
|
|
439
|
+
*/
|
|
369
440
|
async function runRlsMigrate(input) {
|
|
370
441
|
const root = resolve(input.cwd, input.sql);
|
|
371
442
|
if (!existsSync(root)) return {
|