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.
Files changed (507) hide show
  1. package/README.md +2 -3
  2. package/dist/{2020-C9VN-x8c.js → 2020-CJbO8Bvz.js} +1 -3
  3. package/dist/a2a/index.d.ts +7 -7
  4. package/dist/a2a/index.js +9 -9
  5. package/dist/action-result-CL-QCITA.d.ts +19 -0
  6. package/dist/{adapter-context-CRhqyzCk.js → adapter-context-CIQpQxbE.js} +8 -2
  7. package/dist/{adoption-scan-DCYe60Pi.js → adoption-scan-BLs67P1l.js} +5 -5
  8. package/dist/agent/index.d.ts +3 -3
  9. package/dist/agent/index.js +1 -1
  10. package/dist/ai-sdk/index.d.ts +31 -10
  11. package/dist/ai-sdk/index.js +22 -12
  12. package/dist/{app-data-MuyzVqX8.js → app-data-UNNm07jV.js} +10 -7
  13. package/dist/{approval-header-CJACtHkv.js → approval-header-8QV6MU4H.js} +6 -3
  14. package/dist/{approval-prompt-Dg5LeAcT.js → approval-prompt-B8hQY69x.js} +5 -6
  15. package/dist/{approval-prompt-DvSSPQJX.d.ts → approval-prompt-PYagyQUj.d.ts} +13 -11
  16. package/dist/approvals/index.d.ts +5 -5
  17. package/dist/approvals/index.js +7 -7
  18. package/dist/{approvals-p1PGoVjb.js → approvals-DnIBTuXE.js} +128 -78
  19. package/dist/{approvers-CqPOLD-o.js → approvers-B4r0N_Uz.js} +8 -2
  20. package/dist/{arazzo-41WuzHou.js → arazzo-3RhGfkAK.js} +2 -2
  21. package/dist/{arazzo-CaUVBn7D.js → arazzo-B5-ulWif.js} +6 -6
  22. package/dist/{args-IIolxxKA.js → args-0FrVs5EH.js} +125 -8
  23. package/dist/astro/index.d.ts +30 -12
  24. package/dist/astro/index.js +2 -2
  25. package/dist/{audience-DabClFLQ.js → audience-BAkBDMqn.js} +8 -8
  26. package/dist/{auth-DRLEizbL.js → auth--yPyZNgr.js} +21 -10
  27. package/dist/authzen/index.d.ts +171 -25
  28. package/dist/authzen/index.js +321 -149
  29. package/dist/{automation-BNM3TtDo.d.ts → automation-DqEoWHBc.d.ts} +42 -32
  30. package/dist/{automation-DVjOckjV.js → automation-x3KEUusw.js} +22 -21
  31. package/dist/base-url-BQbddZO5.js +9 -0
  32. package/dist/better-auth/index.d.ts +2 -2
  33. package/dist/better-auth/index.js +13 -7
  34. package/dist/better-supabase/index.d.ts +392 -220
  35. package/dist/better-supabase/index.js +293 -152
  36. package/dist/{bind-DOyrv6zi.d.ts → bind-Cp2hBHzP.d.ts} +27 -12
  37. package/dist/{bind-CAvgUuKs.js → bind-D_sZSVA3.js} +22 -10
  38. package/dist/{body-CH5of8Ne.js → body-CJQwYVa8.js} +3 -3
  39. package/dist/{body-text-QcXok_SI.js → body-text-DQhcmqdY.js} +8 -4
  40. package/dist/{boundary-BM8a_P6E.js → boundary-BV3O1eud.js} +8 -2
  41. package/dist/{boundary-BmHxVH1J.d.ts → boundary-C9ck-3uK.d.ts} +13 -4
  42. package/dist/{budget-NbEtbJC_.js → budget-BELja5A9.js} +6 -3
  43. package/dist/{budget-JqcRqyhK.d.ts → budget-hYsPz_yE.d.ts} +6 -3
  44. package/dist/{build-instance-Bu_eDqYw.js → build-instance-CNWaYJyr.js} +3 -3
  45. package/dist/{canonical-json-BC8_nMTw.js → canonical-json-DwilZ1iB.js} +6 -3
  46. package/dist/{capability-N1K9IpqS.js → capability-BqX94r07.js} +31 -25
  47. package/dist/{capability-Drg-1YhL.d.ts → capability-ChuiONQU.d.ts} +41 -29
  48. package/dist/{casbin-Dyu2gnUD.js → casbin-H0rKxBx2.js} +16 -8
  49. package/dist/{casbin-Cr7RLtA3.js → casbin-cbSbhT_k.js} +2 -2
  50. package/dist/{casl-64gpT-8x.js → casl-C4OINZHI.js} +2 -2
  51. package/dist/{casl-DjEDhTCP.js → casl-CHHoCldP.js} +19 -10
  52. package/dist/catalog/index.d.ts +104 -23
  53. package/dist/catalog/index.js +117 -8
  54. package/dist/{catalog-HD2gf5mY.js → catalog-BFpz2EmT.js} +57 -26
  55. package/dist/{catalog-DZVbrF-z.js → catalog-DCspHDc8.js} +3 -3
  56. package/dist/{catalog-doc-Cdn7-0pQ.js → catalog-doc-DjMKzJp9.js} +53 -16
  57. package/dist/{catalog-fingerprint-CCP0-yQS.js → catalog-fingerprint-e6aCWosn.js} +19 -15
  58. package/dist/catalog-mRQQQhNK.js +1 -0
  59. package/dist/catalog-operations-Dadrl7Z-.js +60 -0
  60. package/dist/{create-CQWIpUG-.js → challenge-DImNcR7B.js} +157 -39
  61. package/dist/chat/index.d.ts +1 -1
  62. package/dist/chat/index.js +13 -10
  63. package/dist/chat-sdk/index.d.ts +44 -26
  64. package/dist/chat-sdk/index.js +17 -17
  65. package/dist/checks-CGkP3Z7A.js +40 -0
  66. package/dist/{claims-map-7oQ3ue4X.js → claims-map-CKkoAAYF.js} +5 -2
  67. package/dist/{claims-map-Ca-QX8C6.d.ts → claims-map-D1Pb5oRq.d.ts} +8 -5
  68. package/dist/claude-agent/index.d.ts +6 -6
  69. package/dist/claude-agent/index.js +6 -3
  70. package/dist/clerk/index.d.ts +11 -7
  71. package/dist/clerk/index.js +6 -6
  72. package/dist/cli/bin.js +4 -4
  73. package/dist/cli/index.d.ts +82 -7
  74. package/dist/cli/index.js +6 -6
  75. package/dist/{clients-C7zLFuWT.d.ts → clients-C_NOET3z.d.ts} +5 -5
  76. package/dist/{clients-DjU5ABMy.js → clients-DYr3U86j.js} +3 -3
  77. package/dist/cloud/index.d.ts +186 -38
  78. package/dist/cloud/index.js +293 -31
  79. package/dist/{cloud-ytQ3uviA.js → cloud-BFlGMaak.js} +5 -6
  80. package/dist/{codemod-5mpSpnUY.js → codemod-DLQ9Zpo4.js} +3 -4
  81. package/dist/{codemod-ua2hHy7w.js → codemod-DWSN2erG.js} +523 -201
  82. package/dist/collect-B5BL3klN.js +1 -0
  83. package/dist/{collect-mLTY4nwb.js → collect-B7ZFAJU3.js} +36 -64
  84. package/dist/{collect-Ci6akVwH.js → collect-Bzv3le0A.js} +6 -6
  85. package/dist/{compare-pfyVnBjE.js → compare-DTfyUunF.js} +2 -2
  86. package/dist/compile/index.d.ts +2 -2
  87. package/dist/compile/index.js +1 -1
  88. package/dist/{compile-1bsAezL0.d.ts → compile-BFzysW3o.d.ts} +36 -12
  89. package/dist/{compile-CMqMx_IN.js → compile-EzEMB-7v.js} +77 -33
  90. package/dist/{completion-BTFrHZhX.js → completion-saoYiRFO.js} +17 -8
  91. package/dist/config-BwPBfN0t.js +108 -0
  92. package/dist/{config-Bj2Ixq3d.js → config-DBeXXmBF.js} +2 -2
  93. package/dist/{config-report-DSpsLpCE.js → config-report-BipSWA6V.js} +9 -6
  94. package/dist/config-shape-ykV0Vm2n.js +134 -0
  95. package/dist/{connection-DjhIJSs2.js → connection-B72dg5Q2.js} +23 -22
  96. package/dist/connector-schema-CYLQNMYq.js +434 -0
  97. package/dist/{context-B_u3_bDJ.js → context-BnIzxTNE.js} +4 -3
  98. package/dist/convex/index.d.ts +13 -7
  99. package/dist/convex/index.js +9 -6
  100. package/dist/core-H-mbhpZc.js +341 -0
  101. package/dist/core-hWIARPDz.d.ts +206 -0
  102. package/dist/{create-CBMmFie-.d.ts → create-BSNrVuxh.d.ts} +87 -34
  103. package/dist/{create-B30OMUOJ.d.ts → create-BVq1lNQE.d.ts} +49 -28
  104. package/dist/{create-D_NmPOdH.d.ts → create-CM1FciYG.d.ts} +37 -29
  105. package/dist/{create-CGm28gyI.js → create-Cq4Uox0f.js} +13 -9
  106. package/dist/{create-DCF2SvoT.js → create-_noSrY1T.js} +15 -21
  107. package/dist/{credential-BcoiejpY.js → credential-CyyyvCsL.js} +42 -39
  108. package/dist/{credentials-DPyHmYz5.js → credentials-CdDxp7jN.js} +6 -6
  109. package/dist/{deciding-columns-Sq12mEA6.js → deciding-columns-NB4wcyBf.js} +13 -2
  110. package/dist/{delegation-j6-rc37o.js → delegation-CDB6_keF.js} +31 -22
  111. package/dist/delivery/index.d.ts +5 -5
  112. package/dist/delivery/index.js +6 -5
  113. package/dist/{delivery-DCAgNyCn.js → delivery-BupfvJIV.js} +81 -20
  114. package/dist/{delivery-event-xX4obB8F.js → delivery-event-JioK5YbS.js} +6 -6
  115. package/dist/denied-text-CHNlVInN.d.ts +22 -0
  116. package/dist/{describe-BybMRY7A.js → describe-Bb4hGK5d.js} +6 -5
  117. package/dist/{describe-B5qgDvEW.d.ts → describe-ByS9LgHK.d.ts} +5 -5
  118. package/dist/{device-BARQ8eYG.js → device-BwbJNmb2.js} +11 -8
  119. package/dist/{diff-CmuSD3vc.js → diff-CN8IYhC_.js} +2 -2
  120. package/dist/{diff-3jbx6Rm4.js → diff-iZWV65nC.js} +23 -14
  121. package/dist/{digest-B3kc_PgQ.d.ts → digest-8Yx2CchM.d.ts} +3 -3
  122. package/dist/{doctor-BdZw53-k.js → doctor-CHD1M9R5.js} +485 -141
  123. package/dist/{doctor-3ZqNHX_G.js → doctor-D3wo-yuz.js} +4 -4
  124. package/dist/drizzle/index.d.ts +33 -19
  125. package/dist/drizzle/index.js +17 -9
  126. package/dist/elysia/index.d.ts +17 -11
  127. package/dist/elysia/index.js +5 -5
  128. package/dist/{errors-BKy0EfhN.js → errors-B6R_lg2a.js} +13 -4
  129. package/dist/{errors-BWXBMaKK.d.ts → errors-CHwoRRpB.d.ts} +4 -1
  130. package/dist/{errors-CWTY6uih.js → errors-Vpu6rKHl.js} +14 -10
  131. package/dist/{errors-DH5QEGXh.d.ts → errors-zi_4T-rx.d.ts} +22 -6
  132. package/dist/{evaluate-CNClBvcj.js → evaluate-Dd8Ta0Ie.js} +185 -80
  133. package/dist/{evaluations-beAooV0n.js → evaluations-IBceAeKT.js} +41 -20
  134. package/dist/{evaluations-C_1vdSZc.d.ts → evaluations-z8dQFDaN.d.ts} +12 -6
  135. package/dist/eve/index.d.ts +9 -6
  136. package/dist/eve/index.js +4 -4
  137. package/dist/{event-time-CsegxXxB.js → event-time-BGy48400.js} +8 -4
  138. package/dist/{expiry-D4_YKRKD.js → expiry-6XByK0dm.js} +8 -5
  139. package/dist/express/index.d.ts +9 -6
  140. package/dist/express/index.js +9 -6
  141. package/dist/fastify/index.d.ts +16 -10
  142. package/dist/fastify/index.js +8 -5
  143. package/dist/{fetch-adapter-Dw0MTS3D.d.ts → fetch-adapter-C1DCvpqV.d.ts} +9 -6
  144. package/dist/{fetch-adapter-DD_gfmrC.js → fetch-adapter-JL43jD3E.js} +14 -11
  145. package/dist/fields-D0vUI6dq.js +498 -0
  146. package/dist/{files-C5ZI27eV.js → files-B3AA05f1.js} +21 -5
  147. package/dist/{files-D_JIzUrP.js → files-BSjrtIHw.js} +11 -4
  148. package/dist/{fixtures-B7XrLeY7.js → fixtures-A1_sp_tR.js} +15 -6
  149. package/dist/{flags-C3DktBDY.js → flags-DXjoTVbS.js} +2 -2
  150. package/dist/{freeze-CrU8nQeX.js → freeze-jjan0lCv.js} +4 -1
  151. package/dist/{from-snapshot-CTCMsFZk.js → from-snapshot-DCakWRsr.js} +26 -16
  152. package/dist/gen-B5kvbAoZ.js +58 -0
  153. package/dist/gen-DWCYcMQM.js +827 -0
  154. package/dist/generate-CRVV5V7l.js +165 -0
  155. package/dist/generate-CezbCaTI.js +275 -0
  156. package/dist/{grantee-hxrUsbpM.js → grantee-Dke-9rd1.js} +4 -4
  157. package/dist/{grantee-conditions-CcXf8hMM.js → grantee-conditions-BrYPe-w0.js} +12 -12
  158. package/dist/{grantee-match-DbENBHLB.js → grantee-match-7RZZvoT_.js} +12 -6
  159. package/dist/{graph-sql-B-dsAT6j.d.ts → graph-sql-BwFC4Qjs.d.ts} +3 -3
  160. package/dist/h3/index.d.ts +10 -7
  161. package/dist/h3/index.js +3 -3
  162. package/dist/headers-B9jQxjtW.d.ts +10 -0
  163. package/dist/{helpers-CBYVMjwh.js → helpers-DJicaG6f.js} +40 -28
  164. package/dist/hono/index.d.ts +16 -10
  165. package/dist/hono/index.js +5 -5
  166. package/dist/{hosted-BPk51-kX.d.ts → hosted-Cmtxogd0.d.ts} +44 -20
  167. package/dist/{hosted-B46-5LYE.js → hosted-D0IzESu_.js} +68 -25
  168. package/dist/{http-ujKm0JXE.js → http-DH94eh6f.js} +4 -4
  169. package/dist/{http-BBoKefeS.js → http-DKLXrFGk.js} +13 -7
  170. package/dist/{http-DXJ37RDA.js → http-DOL33cO0.js} +11 -8
  171. package/dist/{import-wyqXUyjm.js → import-CST57XLp.js} +64 -51
  172. package/dist/{import-CNV7I2Dw.js → import-_YqhhwvX.js} +6 -6
  173. package/dist/{index-B8YjkEZ4.d.ts → index-B8s204GL.d.ts} +64 -52
  174. package/dist/{index-Ch8LpNDp.d.ts → index-BT5-1VsX.d.ts} +64 -25
  175. package/dist/{index-DuWxc5dt.d.ts → index-BW_0MZOS.d.ts} +388 -149
  176. package/dist/index-BhxEUY9J.d.ts +233 -0
  177. package/dist/index-Bv5iXPqU.d.ts +210 -0
  178. package/dist/{index-C-6Letxg.d.ts → index-_9UiQIkt.d.ts} +164 -77
  179. package/dist/index.d.ts +22 -21
  180. package/dist/index.js +35 -33
  181. package/dist/{init-GG6Jh8HD.js → init-Dz_PsHdv.js} +5 -5
  182. package/dist/{init-DeMYsnYJ.js → init-cE3A8aXq.js} +10 -10
  183. package/dist/{instance-options-BsVpyGIk.d.ts → instance-options-B0KXqTrJ.d.ts} +4 -4
  184. package/dist/{instance-snapshot-BOEhcqIF.js → instance-snapshot--JWiTrvO.js} +81 -56
  185. package/dist/{instant-BluqDvyS.js → instant-DK3Iz83e.js} +2 -2
  186. package/dist/{internals-Dk8A8fX3.js → internals-B3IgHrvo.js} +6 -3
  187. package/dist/{json-schema-B-vAwlde.js → json-schema-BPGa-RjQ.js} +9 -3
  188. package/dist/{json-schema-CN_iLFH2.d.ts → json-schema-BfXgnRNT.d.ts} +4 -4
  189. package/dist/jwt/index.d.ts +125 -17
  190. package/dist/jwt/index.js +157 -16
  191. package/dist/{kernel-D0NVb1cK.js → kernel-C-fYydV2.js} +151 -16
  192. package/dist/kysely/index.d.ts +49 -33
  193. package/dist/kysely/index.js +9 -7
  194. package/dist/{live-options-BaAFCIiu.js → live-options-BBIT68le.js} +2 -2
  195. package/dist/{load-DFS_ry0W.js → load-DjSU5KXO.js} +6 -6
  196. package/dist/load-Dm0pSYH3.js +1 -0
  197. package/dist/{login-Dfe5RlYk.js → login-D-8tMqzo.js} +4 -4
  198. package/dist/{login-imhuwvn3.js → login-DplQ0s84.js} +18 -15
  199. package/dist/{manifest-dvL2XEe1.js → manifest-Cgiq5oqc.js} +67 -37
  200. package/dist/{manifest-mx5ghSFM.d.ts → manifest-CzzWtnAb.d.ts} +144 -28
  201. package/dist/{manifest-schema-C0kK_8V0.js → manifest-schema-2r37XRhD.js} +80 -9
  202. package/dist/{manifest-C8IzW3Do.js → manifest-wg8WkkpD.js} +11 -7
  203. package/dist/{map-claims-D3oRmTk0.js → map-claims-BNWCJtmP.js} +27 -18
  204. package/dist/{map-error-Dr70oA_3.js → map-error-pasIGqMT.js} +7 -7
  205. package/dist/{markers-C6joDI3o.js → markers-BeHZ4x9Q.js} +20 -5
  206. package/dist/mcp/index.d.ts +154 -47
  207. package/dist/mcp/index.js +200 -41
  208. package/dist/{migrate-CIq4-E9F.js → migrate-B7oP_sQU.js} +102 -31
  209. package/dist/module-values-BJTBdo6y.js +107 -0
  210. package/dist/nest/index.d.ts +23 -13
  211. package/dist/nest/index.js +18 -11
  212. package/dist/next/client.d.ts +5 -2
  213. package/dist/next/client.js +1 -1
  214. package/dist/next/index.d.ts +72 -26
  215. package/dist/next/index.js +110 -6
  216. package/dist/next/plugin.d.ts +1 -1
  217. package/dist/next/plugin.js +4 -3
  218. package/dist/node/index.d.ts +5 -5
  219. package/dist/node/index.js +3 -3
  220. package/dist/{ocsf-BFp-PZZA.js → ocsf-TcjRBgIs.js} +15 -5
  221. package/dist/openai/index.d.ts +13 -7
  222. package/dist/openai/index.js +3 -3
  223. package/dist/openapi/index.d.ts +61 -30
  224. package/dist/openapi/index.js +2 -2
  225. package/dist/{openapi-B7HZ0f-r.js → openapi-BOsx0xn9.js} +34 -24
  226. package/dist/{openapi-C4dDTVEd.js → openapi-CBZUhA3l.js} +4 -5
  227. package/dist/{openapi-DD1SV-5-.js → openapi-VeHHU2l9.js} +23 -14
  228. package/dist/{operation-findings-DgATDpvh.js → operation-findings-CXtFzlKJ.js} +3 -3
  229. package/dist/{operations-X0VM7F3m.d.ts → operations-Ci_rT6Uo.d.ts} +10 -7
  230. package/dist/orpc/index.d.ts +68 -14
  231. package/dist/orpc/index.js +62 -13
  232. package/dist/otel/index.d.ts +7 -4
  233. package/dist/otel/index.js +8 -5
  234. package/dist/output-files-BHOIlrfD.js +1 -0
  235. package/dist/{output-files-DhRBBE4n.js → output-files-BIQ_9pIs.js} +29 -17
  236. package/dist/{output-1im__-08.js → output-tkju6U7R.js} +15 -7
  237. package/dist/ownership-B4L59T9u.js +1054 -0
  238. package/dist/parse-1_ZheTW5.js +151 -0
  239. package/dist/parse-local-manifest-BQhTlLQS.d.ts +10 -0
  240. package/dist/parse-local-manifest-DEiCF4ah.js +69 -0
  241. package/dist/{parse-request-D_tUXG6M.js → parse-request-CwCZpyjV.js} +7 -8
  242. package/dist/{paths-DXSHAMIa.js → paths-CUvURzHp.js} +4 -1
  243. package/dist/pdp/index.d.ts +9 -6
  244. package/dist/pdp/index.js +23 -12
  245. package/dist/{peer-CRvC7Hg1.js → peer-C9LvBCcb.js} +1 -1
  246. package/dist/peer-Q0fuZ6hx.js +982 -0
  247. package/dist/{permdock-SV8ZINYT.d.ts → permdock-B6Sf4T_S.d.ts} +270 -117
  248. package/dist/{permdock-BrAscV28.js → permdock-L-_I_3zP.js} +226 -74
  249. package/dist/{permission-registry-Br4jSNVi.js → permission-registry-B8tYxPIt.js} +24 -11
  250. package/dist/{vocabulary-CN8H_9UF.d.ts → permission-types-CAY-GU7e.d.ts} +130 -104
  251. package/dist/{permissions-u_KHg-sN.d.ts → permissions-Bx6UI8n1.d.ts} +6 -2
  252. package/dist/{permissions-B-wCP5ZC.js → permissions-CVXmRILq.js} +3 -3
  253. package/dist/{permissions-BPxlwVhN.js → permissions-mDcTWoBs.js} +8 -5
  254. package/dist/pg-DQTqRrou.js +60 -0
  255. package/dist/{pins-8ILTftC9.js → pins-nqarl3oE.js} +4 -1
  256. package/dist/pkce-CnmmYqUZ.js +21 -0
  257. package/dist/{policy-77FSAq_V.d.ts → policy-Ba4bDhaj.d.ts} +5 -5
  258. package/dist/{policy-DbM5YYtV.js → policy-CLQ8__GF.js} +49 -20
  259. package/dist/{policy-from-catalog-C2gMa2Dj.js → policy-from-catalog-CJgOm6aq.js} +28 -25
  260. package/dist/{policy-module-CTlwMvLI.js → policy-module-xym9fnSq.js} +12 -6
  261. package/dist/{policy-types-n0uRTsW8.d.ts → policy-types-CCiDRZBH.d.ts} +802 -334
  262. package/dist/postgres-store-DcyrPS-r.js +1028 -0
  263. package/dist/{postgrest-DAjUkF9w.js → postgrest-D4nuPXIQ.js} +88 -36
  264. package/dist/{postgrest-CEgRbefE.d.ts → postgrest-DicQyqm-.d.ts} +60 -30
  265. package/dist/powersync-DHNQX06W.js +1117 -0
  266. package/dist/{powersync-DISt6SUe.js → powersync-DXqGuq9A.js} +3 -3
  267. package/dist/powersync-Djf-zCpB.js +1 -0
  268. package/dist/preset/index.d.ts +38 -28
  269. package/dist/preset/index.js +1 -1
  270. package/dist/{preset-DZdU0tne.js → preset-BjLzeFpp.js} +58 -34
  271. package/dist/{principal-source-pHneukrx.js → principal-source-C6N60GtM.js} +10 -10
  272. package/dist/prisma/index.d.ts +69 -41
  273. package/dist/prisma/index.js +21 -17
  274. package/dist/{problem-CTviyH5L.js → problem-BVLHFK33.js} +41 -21
  275. package/dist/{problem-details-cn5X30gZ.js → problem-details-CLDgX1KV.js} +13 -4
  276. package/dist/{problem-types-CJ2325SZ.js → problem-types-DSsRfONQ.js} +4 -1
  277. package/dist/prompt-BYc6drYW.js +938 -0
  278. package/dist/protected-action-BE7N_Luo.d.ts +58 -0
  279. package/dist/protected-action-DUYqb-Ma.js +80 -0
  280. package/dist/{protected-BlF0F6wL.js → protected-action-QEA8arRB.js} +48 -14
  281. package/dist/{provider-B1al-AZz.js → provider-C55OGXJ7.js} +5 -4
  282. package/dist/{provider-DILL9oPK.d.ts → provider-DXfq5c2d.d.ts} +1 -1
  283. package/dist/{provider-store-DM6DNcta.js → provider-store-CaTv00tr.js} +13 -9
  284. package/dist/pull-B65ndFNZ.js +1 -0
  285. package/dist/{pull-jEwbf80J.js → pull-CwpGaQSi.js} +12 -11
  286. package/dist/{push-BD4f15co.js → push-DgssgzkK.js} +62 -16
  287. package/dist/{pushed-policy-DCW91KQU.d.ts → pushed-policy-D1Eoi6NM.d.ts} +12 -6
  288. package/dist/{pushed-policy-CqtxkV4G.js → pushed-policy-ITwYKvvH.js} +10 -7
  289. package/dist/react/index.d.ts +9 -8
  290. package/dist/react/index.js +7 -6
  291. package/dist/react/provider-client.d.ts +1 -1
  292. package/dist/react/provider-client.js +1 -1
  293. package/dist/react-native/index.d.ts +104 -51
  294. package/dist/react-native/index.js +394 -67
  295. package/dist/{refs-K6eWUJ0H.js → refs-C8BKxc_e.js} +17 -3
  296. package/dist/{relation-walk-3OyDBF0S.js → relation-walk-DK_gkgL7.js} +12 -9
  297. package/dist/{relations-BnCWnJGI.js → relations-BxvRvDHK.js} +3 -3
  298. package/dist/{replay-Du1tJjG7.js → replay-BU09ad4L.js} +1 -1
  299. package/dist/{replay-Bkm-Ne4l.d.ts → replay-DNftIb_R.d.ts} +1 -1
  300. package/dist/{request-context-C81Pip9n.js → request-context-C25ilqiJ.js} +8 -8
  301. package/dist/{request-schema-CMreVuFM.js → request-schema-DhX7UbfQ.js} +4 -1
  302. package/dist/resend/index.d.ts +34 -28
  303. package/dist/resend/index.js +29 -29
  304. package/dist/resolve-names-CF7xXLSG.js +201 -0
  305. package/dist/{resource-relations-D_jw0BFx.js → resource-relations-8-pCScBO.js} +18 -9
  306. package/dist/{retire-CALjIQ7e.js → retire-B2xffQgY.js} +15 -6
  307. package/dist/{revocations-R07lFBnX.d.ts → revocations-BaUXHM1N.d.ts} +6 -3
  308. package/dist/{rls-DTvYd-lI.js → rls-CNEH2_BG.js} +743 -624
  309. package/dist/{rls-BAqP4q66.js → rls-Ca8Jz9b5.js} +41 -10
  310. package/dist/{role-builder-uWQZ4v84.js → role-builder-BK2-T6oD.js} +41 -20
  311. package/dist/rolldown-runtime-C3I60J0A.js +4 -0
  312. package/dist/{row-conditions-h2HythXQ.js → row-conditions-BAGHOmVq.js} +4 -3
  313. package/dist/{rpc-VSl5ylaQ.js → rpc-fNqAIqQk.js} +8 -5
  314. package/dist/{run-CUKuz0A8.js → run-Bz26OTfO.js} +26 -23
  315. package/dist/run-D-JE8QWb.js +1 -0
  316. package/dist/{run-ticket-DocwaTKn.d.ts → run-ticket-DbWI9f99.d.ts} +33 -13
  317. package/dist/{run-ticket-sxFI6LAk.js → run-ticket-Dv7aF7Dk.js} +29 -8
  318. package/dist/{runtime-D3VTAiCA.js → runtime-BGnrOkVH.js} +5 -2
  319. package/dist/{saas-BCXRuXca.js → saas-iWnUdwCt.js} +42 -29
  320. package/dist/{scan-qvOe0hS3.js → scan-DCj1KQfn.js} +1 -1
  321. package/dist/{schema-B4v0Qrac.js → schema-BOJjqlWL.js} +3 -2
  322. package/dist/{schema-yLuBWWsh.js → schema-Dst9I9Gs.js} +9 -5
  323. package/dist/scim/index.d.ts +3 -2
  324. package/dist/scim/index.js +3 -1
  325. package/dist/scim-D8YupzX1.js +44 -0
  326. package/dist/{scim-ClHtpyV3.js → scim-jJBJ7g1Z.js} +35 -551
  327. package/dist/{scopes-CUPSjo9q.js → scopes-0Up_UA2t.js} +42 -24
  328. package/dist/server/index.d.ts +12 -12
  329. package/dist/server/index.js +13 -13
  330. package/dist/{server-C3WXAHZj.js → server-3cVlTLde.js} +31 -31
  331. package/dist/{server-types-CKQiCnON.d.ts → server-types-CIlpSA2G.d.ts} +81 -46
  332. package/dist/{sha256-D9ihqmvd.js → sha256-C-4WXKIu.js} +4 -3
  333. package/dist/{shared-BAK8t4Uo.js → shared-Afctg7B0.js} +100 -61
  334. package/dist/{shared-DvvFzYXe.js → shared-l0oGGetg.js} +9 -6
  335. package/dist/{signals-D3NcTKUS.js → signals-B1vHR3fN.js} +2 -2
  336. package/dist/{sink-BEZSlMS_.js → sink-D9_vh372.js} +32 -21
  337. package/dist/{sink-4-eQIRWf.d.ts → sink-Dvi7YZG_.d.ts} +44 -20
  338. package/dist/{skills-B6lVdD_W.js → skills-Bjj7BNEQ.js} +16 -12
  339. package/dist/{skills-CTYwkl44.js → skills-OuoMR49L.js} +3 -3
  340. package/dist/{snapshot-B7DkYg6g.js → snapshot-CXlzi69u.js} +21 -18
  341. package/dist/{snapshot-cache-PXI-vGpY.d.ts → snapshot-cache-BAXZ0KOp.d.ts} +21 -12
  342. package/dist/{snapshot-cache-DZHQ0KF6.js → snapshot-cache-Bx_4xC_6.js} +14 -11
  343. package/dist/solid/index.d.ts +55 -15
  344. package/dist/solid/index.js +46 -12
  345. package/dist/solid-start/index.d.ts +30 -12
  346. package/dist/solid-start/index.js +3 -3
  347. package/dist/sources-B1Os_YUu.d.ts +312 -0
  348. package/dist/{sources-vs5dGOsS.js → sources-CMAM-2A3.js} +156 -51
  349. package/dist/sources-qoIJQrJv.js +11 -0
  350. package/dist/{sql-B5T1IL83.js → sql-0WjxIp9g.js} +32 -7
  351. package/dist/sql-B80DFdpG.d.ts +10 -0
  352. package/dist/{src-Cu2m75uo.js → src-DZ0l9UAg.js} +305 -123
  353. package/dist/ssf/index.d.ts +4 -4
  354. package/dist/ssf/index.js +665 -224
  355. package/dist/{standard-webhooks-rbD7LS6h.d.ts → standard-webhooks-C-qX4mJW.d.ts} +7 -7
  356. package/dist/{standard-webhooks-DgFFD-Ga.js → standard-webhooks-D67a3nzk.js} +5 -5
  357. package/dist/{store-BDutJkDL.js → store-RNFvaJJv.js} +43 -29
  358. package/dist/{store-options-u0ycEe8s.js → store-options-Dil3lraY.js} +105 -15
  359. package/dist/stores-C0Kta5Ft.d.ts +59 -0
  360. package/dist/{stores-CGhM8BN_.js → stores-DxZWDXCs.js} +42 -5
  361. package/dist/{stream-CvdUS9V1.js → stream-CDvF0sJm.js} +5 -5
  362. package/dist/{stream-CeCMJmBB.d.ts → stream-ltuLdtTG.d.ts} +4 -3
  363. package/dist/{style-DiKWnAvn.js → style-DblOtSga.js} +1 -1
  364. package/dist/{style-Uao76wO7.js → style-Ds11Hmk4.js} +3 -1
  365. package/dist/{subject-settings-CkEwrw3W.js → subject-settings-8sH5HlII.js} +8 -4
  366. package/dist/{row-check-Dt35czLy.d.ts → subject-settings-vNW8qmUH.d.ts} +30 -18
  367. package/dist/supabase/index.d.ts +48 -37
  368. package/dist/supabase/index.js +6 -6
  369. package/dist/supabase/middleware.d.ts +19 -13
  370. package/dist/supabase/middleware.js +7 -7
  371. package/dist/{supabase-x5JtR2tc.js → supabase-BL1qJzzY.js} +82 -36
  372. package/dist/{supabase-By_frk3U.js → supabase-D39cuGPt.js} +3 -3
  373. package/dist/{supabase-hook-BMoEhZir.js → supabase-hook-B-yXnzUl.js} +1206 -286
  374. package/dist/supabase-hook-H-MtE9Wd.js +1 -0
  375. package/dist/supautils-BU-pAEpf.js +808 -0
  376. package/dist/{support-session-C6xJQYut.js → support-session-BsmPCbz8.js} +22 -22
  377. package/dist/svelte/PermissionBoundary.svelte +2 -6
  378. package/dist/svelte/Protected.svelte +2 -8
  379. package/dist/svelte/index.d.ts +9 -8
  380. package/dist/svelte/index.js +10 -9
  381. package/dist/svelte/runtime.d.ts +4 -4
  382. package/dist/svelte/runtime.js +4 -4
  383. package/dist/svelte/source.d.ts +9 -8
  384. package/dist/svelte/source.js +6 -5
  385. package/dist/sveltekit/index.d.ts +30 -12
  386. package/dist/sveltekit/index.js +2 -2
  387. package/dist/{ownership-DqaJNJPn.js → tables-DeMNEy6V.js} +1025 -1085
  388. package/dist/tanstack-start/index.d.ts +22 -10
  389. package/dist/tanstack-start/index.js +2 -2
  390. package/dist/{target-Bw37TFNA.js → target-qdEAnnhU.js} +6 -6
  391. package/dist/{tenancy-DN2QAx9z.js → tenancy-5d1zVBvK.js} +36 -21
  392. package/dist/terminal/index.d.ts +23 -14
  393. package/dist/terminal/index.js +17 -20
  394. package/dist/testing/core.d.ts +2 -0
  395. package/dist/testing/core.js +1 -0
  396. package/dist/testing/fixtures/index.d.ts +15 -0
  397. package/dist/testing/fixtures/index.js +831 -0
  398. package/dist/testing/index.d.ts +235 -285
  399. package/dist/testing/index.js +502 -927
  400. package/dist/testing/saas/index.d.ts +43 -27
  401. package/dist/testing/saas/index.js +2 -2
  402. package/dist/testing/saas/permissions.d.ts +1 -1
  403. package/dist/testing/saas/permissions.js +1 -1
  404. package/dist/text-diff-BtfSmdUo.js +444 -0
  405. package/dist/{thenable-yD7SabqG.js → thenable-BNSM1U2R.js} +12 -3
  406. package/dist/{time-DkWjdL98.js → time-nR1JesoH.js} +32 -8
  407. package/dist/{token-BLZcjQgt.js → token-DC9EQiet.js} +15 -13
  408. package/dist/{tool-refusal-CMLN5xhn.js → tool-refusal-Qpjs_W6M.js} +5 -2
  409. package/dist/trpc/index.d.ts +11 -8
  410. package/dist/trpc/index.js +15 -9
  411. package/dist/type-helpers-BIPIDa6a.d.ts +50 -0
  412. package/dist/{types-8RnwUAvE.d.ts → types-AMJ5qoU_.d.ts} +49 -30
  413. package/dist/{types-C_IiEs64.d.ts → types-B2mlGuhW.d.ts} +14 -11
  414. package/dist/{types-_WhUP7ud.d.ts → types-B4uqKDnp.d.ts} +25 -12
  415. package/dist/{types-CX7AvRqP.d.ts → types-BJk0BKRX.d.ts} +24 -14
  416. package/dist/types-B_d_g7T3.d.ts +262 -0
  417. package/dist/{types-BdtSDbBO.d.ts → types-B_tiYvk8.d.ts} +59 -32
  418. package/dist/{types-DqzsnlSA.js → types-CcUXciSj.js} +17 -5
  419. package/dist/{types-Dfv0aTER.d.ts → types-DC1Loeh3.d.ts} +449 -168
  420. package/dist/{types-lUlG3TVd.d.ts → types-DHKPcqzr.d.ts} +2 -2
  421. package/dist/{types-C791HFu9.d.ts → types-DjuMBNF9.d.ts} +68 -32
  422. package/dist/{types-C863OQiR.d.ts → types-HzqOtvsJ.d.ts} +23 -12
  423. package/dist/{types-Druu9wLM.d.ts → types-ZzRGoViD.d.ts} +77 -24
  424. package/dist/{types-BzzaHxt3.d.ts → types-ah9NlU6j.d.ts} +137 -48
  425. package/dist/{types-CVZSNocA.d.ts → types-djVzLlIV.d.ts} +31 -14
  426. package/dist/{types-BtHtcKMr.d.ts → types-yUuPR5Hy.d.ts} +47 -24
  427. package/dist/unplugin/index.d.ts +1 -1
  428. package/dist/unplugin/index.js +2 -2
  429. package/dist/usage-CYeXek0p.js +1 -0
  430. package/dist/{usage-SveTRTyr.js → usage-CxEzS4ey.js} +50 -26
  431. package/dist/{usage-CRVl9V3t.js → usage-ab0PdusX.js} +2 -2
  432. package/dist/{validation-error-ZfUHbKvf.js → validation-error-CYg2kJEw.js} +4 -1
  433. package/dist/{validation-error-DHUrAkku.d.ts → validation-error-YGg2mXyH.d.ts} +5 -2
  434. package/dist/{validity-CZ7-y0Cj.js → validity-Buc7w8E9.js} +13 -10
  435. package/dist/{verifier-DHuh-okk.js → verifier-DUV6pLqZ.js} +10 -4
  436. package/dist/{verify-BaAKx7t6.js → verify-DZeqoWu5.js} +417 -489
  437. package/dist/version-DMQ0dnN5.js +48 -0
  438. package/dist/version-DizhmD72.js +1 -0
  439. package/dist/{views-DTIIO-oQ.js → views-CD8wuL4Z.js} +19 -6
  440. package/dist/vocabulary-DEJ5j4mR.d.ts +70 -0
  441. package/dist/vue/index.d.ts +71 -21
  442. package/dist/vue/index.js +50 -13
  443. package/dist/{waiter-B986w1oK.d.ts → waiter-Bu9zAlE0.d.ts} +13 -10
  444. package/dist/{waiter-BGUtGYoU.js → waiter-aBLM63_f.js} +1 -1
  445. package/dist/{watch-vea54PRw.js → watch-Cx_WciLE.js} +8 -8
  446. package/dist/watch-DB42U1ib.js +1 -0
  447. package/dist/webmcp/index.d.ts +11 -11
  448. package/dist/webmcp/index.js +8 -5
  449. package/dist/{where-scope-C9vfEphl.js → where-scope-DlCdCM_8.js} +56 -30
  450. package/dist/{who-can-DWBAcaCQ.js → who-can-rI7dCR9Q.js} +23 -20
  451. package/dist/workflow/index.d.ts +3 -3
  452. package/dist/workflow/index.js +13 -13
  453. package/dist/workflow-sdk/index.d.ts +19 -13
  454. package/dist/workflow-sdk/index.js +6 -6
  455. package/dist/{wrap-gX61EtpB.js → wrap-B2wziJI_.js} +11 -5
  456. package/dist/{wrap-C5jC6sKI.d.ts → wrap-DlJE3gS_.d.ts} +8 -5
  457. package/package.json +25 -14
  458. package/schemas/catalog-v1.json +3 -0
  459. package/schemas/cli-result-v1.json +1 -0
  460. package/schemas/cloud-api-v1.json +152 -7
  461. package/schemas/connector-v1.json +8 -0
  462. package/schemas/supabase-claims-v1.json +5 -0
  463. package/schemas/supabase-manifest-v1.json +308 -75
  464. package/skills/permdock/SKILL.md +1 -0
  465. package/skills/permdock-agents/references/runtimes.md +3 -1
  466. package/skills/permdock-approvals/references/stores-and-resume.md +2 -1
  467. package/skills/permdock-credentials/references/tokens-keys-links.md +8 -6
  468. package/skills/permdock-data/references/queries-and-rls.md +6 -2
  469. package/skills/permdock-tenancy/SKILL.md +1 -1
  470. package/skills/permdock-tenancy/references/ownership-and-custom-roles.md +2 -1
  471. package/skills/permdock-wire/references/adapters.md +28 -22
  472. package/skills/permdock-wire/references/policy-options.md +1 -0
  473. package/dist/catalog-BoWglDPI.js +0 -1
  474. package/dist/collect-D7eQDffE.js +0 -1
  475. package/dist/config-bs_kZeYq.js +0 -162
  476. package/dist/denied-text-CiFQNuMV.d.ts +0 -19
  477. package/dist/fields-OYG_JR78.js +0 -203
  478. package/dist/generate-CNU1pIOo.js +0 -171
  479. package/dist/headers-BIjfMaoC.js +0 -8
  480. package/dist/headers-CIbDTUTK.d.ts +0 -7
  481. package/dist/index-Cp_ilKi1.d.ts +0 -91
  482. package/dist/index-CueFnxQc.d.ts +0 -110
  483. package/dist/load-BxEtwlBS.js +0 -1
  484. package/dist/output-files-B3IZJksC.js +0 -1
  485. package/dist/package-root-Dk_ETdkp.js +0 -31
  486. package/dist/parse-Cxq0WxrA.js +0 -53
  487. package/dist/parse-local-manifest-5ODwqu8b.d.ts +0 -10
  488. package/dist/parse-local-manifest-CVSs6J9I.js +0 -34
  489. package/dist/peer-C8swJ2GH.js +0 -50
  490. package/dist/policies-DP2nqRoF.js +0 -295
  491. package/dist/powersync-BkWWCS1K.js +0 -538
  492. package/dist/powersync-MMJ2mI2q.js +0 -1
  493. package/dist/problem-details-B45V5d2b.d.ts +0 -7
  494. package/dist/prompt-DfZLJLIn.js +0 -32
  495. package/dist/protected-RFGpakN9.d.ts +0 -38
  496. package/dist/pull-CvpINcMK.js +0 -1
  497. package/dist/run-DDwUaJDU.js +0 -1
  498. package/dist/sources-Xc4zkszI.d.ts +0 -190
  499. package/dist/stores-BUGNbJTt.d.ts +0 -30
  500. package/dist/supabase-hook-CCw5m35C.js +0 -1
  501. package/dist/supautils-B6HYL9eL.js +0 -91
  502. package/dist/text-diff-BQcUapOb.js +0 -15
  503. package/dist/types-B3_ooZgZ.d.ts +0 -172
  504. package/dist/usage-CZpSQP6L.js +0 -1
  505. package/dist/version-CEbQ5UeM.js +0 -18
  506. package/dist/version-DXkYUISx.js +0 -1
  507. 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-CrU8nQeX.js";
3
- import { i as stepUpOf } from "../problem-details-cn5X30gZ.js";
4
- import { t as describe } from "../describe-BybMRY7A.js";
5
- import { m as annotationsFor } from "../permission-registry-Br4jSNVi.js";
6
- import { t as actorMayCallTool } from "../delegation-j6-rc37o.js";
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 { a as hasScope, c as withApp, i as challengeScope, o as scopesReaching } from "../permdock-BrAscV28.js";
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-gX61EtpB.js";
11
- import { l as protectedResourceMetadataUrl, r as bearerChallenge } from "../problem-CTviyH5L.js";
12
- import { t as clientNameOf } from "../clients-DjU5ABMy.js";
13
- import { n as mapClaimsToSubject } from "../map-claims-D3oRmTk0.js";
14
- import { r as instanceOptions } from "../build-instance-Bu_eDqYw.js";
15
- import { n as createAgentKernel, r as refusalText } from "../kernel-D0NVb1cK.js";
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-CMLN5xhn.js";
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
- /** `_meta` key on `tools/call`, `resources/read` and `prompts/get` carrying an approval token. */
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
- /** The first protocol revision whose list results define `ttlMs` and `cacheScope`. */
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
- * 2025-era request has none and gets no cache fields.
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
- /** The MRTR URL elicitation that sends the user to `options.approval.at`, when the client accepts one. */
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
- /** A step-up denial: the RFC 9470 challenge, and a URL elicitation to `stepUpAt` when the client accepts one. */
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
- /** The refusal a token earns before any decision: none, the wrong resource, or a missing scope. */
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
- /** The completion re-check of a long-running tool: the call must still be allowed, or approved with the same token. */
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 the subject may use.
332
- * With `tools`, a guarded key is also a tool name an `agent` actor's `tools` list must name.
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
- /** With `enforce: 'procedure'` the handler runs undecided: the procedure it calls decides. */
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 permission = requirePermission("resource", name, config);
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 wrap = (callback) => guard(checks, permission, load, callback, (params) => params.slice(0, -1), throwRefusal, { capabilities });
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: challengeFor(scopeChallenge, scopesReaching(checks.policy, permission), challengeScope(checks.policy, permission))
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") resources.set(uriOrTemplate, permission);
540
- else templates.push({
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
- /** `kind`, or the default when absent; `undefined` for a kind that is not a non-empty string. */
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
- * as an actor of kind `actorKind` (`mcp-client` by default), the granted
565
- * scopes as the delegation. Never verifies and never throws; anything
566
- * unusable, including an `actorKind` that is not a non-empty string, is
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
- export { APPROVAL_META_KEY, createPermDock, subjectFromMcp };
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-DkWjdL98.js";
3
- import { a as describeError } from "./errors-CWTY6uih.js";
4
- import { o as sqlFiles } from "./files-D_JIzUrP.js";
5
- import { r as escapeSqlIdent, s as quoteSqlLiteral } from "./sql-B5T1IL83.js";
6
- import "./sources-vs5dGOsS.js";
7
- import { a as RETIRE_MARKER } from "./markers-C6joDI3o.js";
8
- import { r as refuseDirty, t as applyFiles } from "./files-C5ZI27eV.js";
9
- import { f as writeOutputFiles, n as dataMigrationFile } from "./output-files-DhRBBE4n.js";
10
- import { r as HELPERS } from "./shared-BAK8t4Uo.js";
11
- import { o as sqlStatements } from "./deciding-columns-Sq12mEA6.js";
12
- import { i as retireSql, r as retirePlan } from "./retire-CALjIQ7e.js";
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
- /** The PermDock key for a legacy one: `keys` first, then `renamed`, then the longest matching prefix. */
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") return skip("not-a-column", "the id is an expression, not a plain column; rewrite it by hand");
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
- /** `selected`: the call is already a `select` target, so `permdock_has` needs no wrapping subquery. */
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
- /** Rewrites the configured helper calls in one file's policies; everything else is reported. */
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)) skipped.push({
336
- file,
337
- line: lineOf(text, (bodyStart === -1 ? statementStart : bodyStart) + (match.index ?? 0)),
338
- call: match[1] ?? "",
339
- reason: "function-body",
340
- detail: "the call is inside a function body, which runs with its own privileges; rewrite it by hand"
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
- /** `permdock rls migrate`: a dry run unless `write`; exits 1 while a key is unknown. */
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 {