permdock 0.5.0 → 0.7.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 (399) hide show
  1. package/README.md +1 -0
  2. package/dist/{2020-C9VN-x8c.js → 2020-CJbO8Bvz.js} +1 -3
  3. package/dist/a2a/index.d.ts +5 -5
  4. package/dist/a2a/index.js +4 -4
  5. package/dist/{adoption-scan-B4R5fnMU.js → adoption-scan-D-feE7BE.js} +1 -1
  6. package/dist/agent/index.d.ts +3 -3
  7. package/dist/agent/index.js +1 -1
  8. package/dist/ai-sdk/index.d.ts +21 -6
  9. package/dist/ai-sdk/index.js +19 -9
  10. package/dist/{approval-prompt-Djo_PyZc.d.ts → approval-prompt-K0faOLFp.d.ts} +2 -2
  11. package/dist/approvals/index.d.ts +4 -4
  12. package/dist/approvals/index.js +4 -4
  13. package/dist/{approvals-DJ6Yd5z1.js → approvals-CMRfsbBh.js} +74 -48
  14. package/dist/{arazzo-B6lebmiQ.js → arazzo-ClrF3PVb.js} +2 -2
  15. package/dist/{arazzo-BWhNF-k0.js → arazzo-rdeJ8n1J.js} +4 -4
  16. package/dist/{args-IIolxxKA.js → args-CC3OwyHW.js} +112 -2
  17. package/dist/astro/index.d.ts +6 -6
  18. package/dist/astro/index.js +2 -2
  19. package/dist/{audience-Dg8XsRaO.js → audience-BrMs8c4o.js} +1 -1
  20. package/dist/{auth-DRLEizbL.js → auth-CscUX8Sy.js} +3 -4
  21. package/dist/authzen/index.d.ts +162 -22
  22. package/dist/authzen/index.js +315 -146
  23. package/dist/{automation-BMZPIVUM.d.ts → automation-DOtAFWdy.d.ts} +3 -3
  24. package/dist/{automation-DVjOckjV.js → automation-ySsxp_Yp.js} +1 -1
  25. package/dist/base-url-BQbddZO5.js +9 -0
  26. package/dist/better-auth/index.d.ts +2 -2
  27. package/dist/better-auth/index.js +2 -2
  28. package/dist/better-supabase/index.d.ts +50 -8
  29. package/dist/better-supabase/index.js +94 -32
  30. package/dist/{bind-CZzhx-Vj.js → bind-D1nO6fiC.js} +5 -5
  31. package/dist/{bind--9EFVYWF.d.ts → bind-JDuvxjuW.d.ts} +7 -7
  32. package/dist/{build-instance-BMnAudHn.js → build-instance-DxE7czo9.js} +1 -1
  33. package/dist/{canonical-json-BC8_nMTw.js → canonical-json-DwilZ1iB.js} +6 -3
  34. package/dist/{capability-BSslw1QV.d.ts → capability-D4UC9TTW.d.ts} +2 -2
  35. package/dist/{capability-N1K9IpqS.js → capability-L7NnfhiE.js} +1 -1
  36. package/dist/{casbin-Cr7RLtA3.js → casbin-BHijLuHY.js} +2 -2
  37. package/dist/{casbin-Dyu2gnUD.js → casbin-BW9pS47J.js} +1 -1
  38. package/dist/{casl-64gpT-8x.js → casl-CmJlgziS.js} +2 -2
  39. package/dist/{casl-DjEDhTCP.js → casl-UbI8v-Wq.js} +1 -1
  40. package/dist/catalog/index.d.ts +70 -10
  41. package/dist/catalog/index.js +112 -6
  42. package/dist/catalog-BCCjSAdH.js +1 -0
  43. package/dist/{catalog-R_A__RsH.js → catalog-BaMQfQ6Y.js} +3 -3
  44. package/dist/{catalog-BECMPrwc.js → catalog-D69WhFii.js} +43 -13
  45. package/dist/{catalog-doc-C9wjsfNY.js → catalog-doc-CV9s6B1S.js} +28 -5
  46. package/dist/{catalog-fingerprint-CCP0-yQS.js → catalog-fingerprint-C144oW4M.js} +1 -1
  47. package/dist/{create-BWRSXgOF.js → challenge-nGWma08S.js} +122 -25
  48. package/dist/chat/index.d.ts +1 -1
  49. package/dist/chat/index.js +2 -2
  50. package/dist/chat-sdk/index.d.ts +3 -3
  51. package/dist/checks-BC_0mPIq.js +37 -0
  52. package/dist/claude-agent/index.d.ts +3 -3
  53. package/dist/claude-agent/index.js +2 -2
  54. package/dist/clerk/index.d.ts +3 -3
  55. package/dist/clerk/index.js +1 -1
  56. package/dist/cli/bin.js +2 -2
  57. package/dist/cli/index.d.ts +3 -3
  58. package/dist/cli/index.js +3 -3
  59. package/dist/cloud/index.d.ts +127 -11
  60. package/dist/cloud/index.js +251 -3
  61. package/dist/{cloud-CIoHNevm.js → cloud-CO8pYtwr.js} +5 -5
  62. package/dist/{codemod-Cxvvc70T.js → codemod-BP6n8N9L.js} +3 -3
  63. package/dist/{codemod-Bmj9dWMH.js → codemod-i4N2BhDc.js} +3 -3
  64. package/dist/{collect-CrZJJnEF.js → collect-BaWeMjwV.js} +17 -8
  65. package/dist/{collect-DloHbDVa.js → collect-DNm3oKOk.js} +6 -5
  66. package/dist/collect-k_Dulxr5.js +1 -0
  67. package/dist/compile/index.d.ts +1 -1
  68. package/dist/compile/index.js +1 -1
  69. package/dist/{compile-CMqMx_IN.js → compile-BAEO5bOk.js} +2 -2
  70. package/dist/{compile-Ckm2HqBZ.d.ts → compile-COM2VKuN.d.ts} +3 -3
  71. package/dist/{completion-BqhRBJD8.js → completion-BNdVf7X2.js} +3 -3
  72. package/dist/{config-bs_kZeYq.js → config-CoQHDrDi.js} +7 -3
  73. package/dist/{config-B46rm9sc.js → config-DGZzMV1B.js} +2 -2
  74. package/dist/{config-report-DUgj62Ai.js → config-report-Cm7UITNA.js} +3 -3
  75. package/dist/connector-schema-_VCSsdtD.js +433 -0
  76. package/dist/{context-bbFHR-0D.js → context--uM9V3Ui.js} +2 -2
  77. package/dist/convex/index.d.ts +5 -5
  78. package/dist/convex/index.js +2 -2
  79. package/dist/core-B5-w6Kw9.js +335 -0
  80. package/dist/core-CQkE8Esr.d.ts +179 -0
  81. package/dist/{create-0VZ7Pdiu.d.ts → create-B2-CQqCI.d.ts} +5 -5
  82. package/dist/{create-C3b4B5eF.js → create-Cb86Z8Im.js} +9 -8
  83. package/dist/{create-DnrmLnLW.js → create-DJrlhEp9.js} +5 -5
  84. package/dist/{create-BFfm17UA.d.ts → create-QHuuPw3q.d.ts} +7 -7
  85. package/dist/{create-BDS7wc3y.d.ts → create-UTnUVETj.d.ts} +30 -10
  86. package/dist/{credential-DM2um3ha.js → credential-CIM7wHwA.js} +4 -4
  87. package/dist/{credentials-DPyHmYz5.js → credentials-BpuTwd7a.js} +1 -1
  88. package/dist/{deciding-columns-Sq12mEA6.js → deciding-columns-DRo2QM6E.js} +13 -2
  89. package/dist/{delegation-DaXVdDhM.js → delegation-C5rOdTp5.js} +5 -5
  90. package/dist/delivery/index.d.ts +5 -5
  91. package/dist/delivery/index.js +4 -3
  92. package/dist/{delivery-DCAgNyCn.js → delivery-rwOKLWRm.js} +51 -2
  93. package/dist/{denied-text-D8jDHgsl.d.ts → denied-text-D4qkEtFz.d.ts} +2 -2
  94. package/dist/{describe-BybMRY7A.js → describe-DZlnEtLy.js} +1 -0
  95. package/dist/{describe-BZUsixiL.d.ts → describe-O0SwYIK8.d.ts} +2 -2
  96. package/dist/{diff-CxZo9pTq.js → diff-Btr1c1Ow.js} +2 -2
  97. package/dist/{diff-DCePiN6M.js → diff-DzT-xD13.js} +10 -10
  98. package/dist/{doctor-DFjUxf2f.js → doctor-BU1szn63.js} +241 -49
  99. package/dist/{doctor-CxiwSfqH.js → doctor-BoK_y0KO.js} +4 -4
  100. package/dist/drizzle/index.d.ts +3 -3
  101. package/dist/drizzle/index.js +1 -1
  102. package/dist/elysia/index.d.ts +5 -5
  103. package/dist/elysia/index.js +3 -3
  104. package/dist/{errors-C2PXIv4c.d.ts → errors-B_Qg9D3e.d.ts} +2 -2
  105. package/dist/{errors-CWTY6uih.js → errors-DpP_U6Bf.js} +1 -0
  106. package/dist/{evaluate-_R8QkWaf.js → evaluate-B_oqFbWC.js} +130 -34
  107. package/dist/{evaluations-16UqqQ6W.d.ts → evaluations-BCddEOfO.d.ts} +4 -4
  108. package/dist/{evaluations-DZ2CbV5k.js → evaluations-DReoiVBw.js} +4 -4
  109. package/dist/eve/index.d.ts +5 -5
  110. package/dist/eve/index.js +3 -3
  111. package/dist/express/index.d.ts +5 -5
  112. package/dist/express/index.js +3 -3
  113. package/dist/fastify/index.d.ts +5 -5
  114. package/dist/fastify/index.js +3 -3
  115. package/dist/{fetch-adapter-qKJBuRqy.d.ts → fetch-adapter-CuhyYwC1.d.ts} +4 -4
  116. package/dist/{fetch-adapter-g0ypLkID.js → fetch-adapter-De-u6vhJ.js} +3 -3
  117. package/dist/{fields-D9tPVUUS.js → fields-ClcQLrVc.js} +48 -13
  118. package/dist/{files-C5ZI27eV.js → files-acUbNwWt.js} +15 -2
  119. package/dist/{fixtures-B7XrLeY7.js → fixtures-BTMW6zgU.js} +2 -2
  120. package/dist/{flags-C3DktBDY.js → flags-aaeRAdiD.js} +2 -2
  121. package/dist/{from-snapshot-D2lZt4Dd.js → from-snapshot-Bz469dIh.js} +17 -10
  122. package/dist/generate-3FNO5P5Q.js +159 -0
  123. package/dist/{grantee-Cn1HyUsI.js → grantee-BrRANrpT.js} +14 -4
  124. package/dist/{grantee-conditions-CcXf8hMM.js → grantee-conditions-C6P1Tvol.js} +1 -1
  125. package/dist/{grantee-match-DHArqY82.js → grantee-match-0RtHWQDx.js} +3 -3
  126. package/dist/h3/index.d.ts +4 -4
  127. package/dist/h3/index.js +3 -3
  128. package/dist/{helpers-DTcZOzhF.js → helpers-DY3vXuGs.js} +3 -3
  129. package/dist/hono/index.d.ts +5 -5
  130. package/dist/hono/index.js +3 -3
  131. package/dist/{hosted-DBDX0M-P.d.ts → hosted-BmjzxQhp.d.ts} +14 -2
  132. package/dist/{hosted-BZIAYvon.js → hosted-XBgU6RGT.js} +34 -12
  133. package/dist/{http-DXJ37RDA.js → http-Ca3Sr5x1.js} +1 -1
  134. package/dist/{import-DMmOG27O.js → import-Bz0GefWg.js} +5 -5
  135. package/dist/{import-CNV7I2Dw.js → import-DB2EG_iy.js} +3 -3
  136. package/dist/{index-CxGUswIC.d.ts → index-BE8y3moU.d.ts} +50 -8
  137. package/dist/{index-Chrs5fQ-.d.ts → index-BSfRl0hZ.d.ts} +6 -6
  138. package/dist/{index-DOVf7RJv.d.ts → index-BTkwrK7v.d.ts} +155 -17
  139. package/dist/index-CMiPH2Tv.d.ts +206 -0
  140. package/dist/{index-SGdIQyzc.d.ts → index-DH9DUDEM.d.ts} +18 -3
  141. package/dist/{index-BcHcPyIo.d.ts → index-DLwcuCN_.d.ts} +86 -7
  142. package/dist/index.d.ts +18 -17
  143. package/dist/index.js +27 -25
  144. package/dist/{init-GG6Jh8HD.js → init-5TXNji88.js} +5 -5
  145. package/dist/{init-DeMYsnYJ.js → init-B-4t1NzC.js} +4 -4
  146. package/dist/{instance-options-Omfd793B.d.ts → instance-options-CU0YQCLH.d.ts} +1 -1
  147. package/dist/{instance-snapshot-Cxq4ygFc.js → instance-snapshot-CjcwnEiV.js} +20 -14
  148. package/dist/jwt/index.d.ts +83 -5
  149. package/dist/jwt/index.js +143 -5
  150. package/dist/{kernel-5JatXyND.js → kernel-DVExUwkp.js} +138 -12
  151. package/dist/kysely/index.d.ts +3 -3
  152. package/dist/kysely/index.js +1 -1
  153. package/dist/load-DrMHXzgN.js +1 -0
  154. package/dist/{load-DFS_ry0W.js → load-DxroEzH1.js} +2 -2
  155. package/dist/{login-Dfe5RlYk.js → login-ClSJh5t5.js} +4 -4
  156. package/dist/{login-imhuwvn3.js → login-WC9HPJpU.js} +6 -10
  157. package/dist/{manifest-C8IzW3Do.js → manifest-B79YuF2T.js} +6 -2
  158. package/dist/{manifest-mx5ghSFM.d.ts → manifest-BVhExYhw.d.ts} +23 -2
  159. package/dist/{manifest-CtKR3GXL.js → manifest-Dv6q4i5s.js} +54 -35
  160. package/dist/{manifest-schema-C0kK_8V0.js → manifest-schema-Cv492Qev.js} +37 -7
  161. package/dist/{map-claims-D3oRmTk0.js → map-claims-etGIS_Dv.js} +14 -11
  162. package/dist/{map-error-TCAdw-eW.js → map-error-BQGyDm_M.js} +1 -1
  163. package/dist/mcp/index.d.ts +64 -10
  164. package/dist/mcp/index.js +151 -22
  165. package/dist/{migrate-BShP7Vf4.js → migrate-Dodel0IJ.js} +77 -24
  166. package/dist/nest/index.d.ts +5 -5
  167. package/dist/nest/index.js +3 -3
  168. package/dist/next/index.d.ts +9 -9
  169. package/dist/next/index.js +5 -5
  170. package/dist/next/plugin.d.ts +1 -1
  171. package/dist/next/plugin.js +2 -2
  172. package/dist/node/index.d.ts +5 -5
  173. package/dist/node/index.js +2 -2
  174. package/dist/openai/index.d.ts +5 -5
  175. package/dist/openai/index.js +3 -3
  176. package/dist/openapi/index.d.ts +14 -4
  177. package/dist/openapi/index.js +1 -1
  178. package/dist/{openapi-ahr8rHu3.js → openapi-DMocl1bh.js} +4 -4
  179. package/dist/{openapi-B7HZ0f-r.js → openapi-Ddb4628T.js} +2 -7
  180. package/dist/{openapi-DTaEmTSW.js → openapi-ztVaux6j.js} +8 -8
  181. package/dist/{operation-findings-DgATDpvh.js → operation-findings-kRcEp8lE.js} +1 -1
  182. package/dist/{operations-CxybZErY.d.ts → operations-BNLes61x.d.ts} +1 -1
  183. package/dist/orpc/index.d.ts +6 -6
  184. package/dist/orpc/index.js +4 -4
  185. package/dist/otel/index.d.ts +3 -3
  186. package/dist/otel/index.js +1 -1
  187. package/dist/{output-Dyw8fyPF.js → output-DgSDLrta.js} +7 -3
  188. package/dist/{output-files-DhRBBE4n.js → output-files-CCMdcFWb.js} +2 -2
  189. package/dist/output-files-DPAY7-GX.js +1 -0
  190. package/dist/{ownership-BatFgAA4.js → ownership-Z2LpxsGa.js} +1349 -883
  191. package/dist/parse-Ddhz2xf4.js +148 -0
  192. package/dist/{parse-local-manifest-CVSs6J9I.js → parse-local-manifest-T1Q8X3A2.js} +24 -1
  193. package/dist/{parse-local-manifest-DgqtruPn.d.ts → parse-local-manifest-e4mdwAKd.d.ts} +1 -1
  194. package/dist/pdp/index.d.ts +3 -3
  195. package/dist/pdp/index.js +7 -3
  196. package/dist/peer-12Q5I_RH.js +976 -0
  197. package/dist/{peer-CRvC7Hg1.js → peer-DOzzMfZL.js} +1 -1
  198. package/dist/{permdock-B9JxkBwC.js → permdock-BfWEeMqk.js} +177 -49
  199. package/dist/{permdock-D7eeLJER.d.ts → permdock-Dco6dyCK.d.ts} +34 -5
  200. package/dist/{permission-registry-Br4jSNVi.js → permission-registry-DpPtSKNZ.js} +1 -1
  201. package/dist/{vocabulary-D6lPdb4Z.d.ts → permission-types-DhNEmoRG.d.ts} +4 -62
  202. package/dist/{permissions-oEWfl-kl.d.ts → permissions-CoqCOfJ3.d.ts} +2 -1
  203. package/dist/{permissions-B-wCP5ZC.js → permissions-CyH2MV_B.js} +1 -1
  204. package/dist/{permissions-CZKiUfFM.js → permissions-DArULThq.js} +4 -4
  205. package/dist/pkce-5h8NgMQJ.js +21 -0
  206. package/dist/{policies-CO1oOymN.js → policies-B2lZIurj.js} +3 -3
  207. package/dist/{policy-Czo4n3Hs.d.ts → policy-B7dg_yzu.d.ts} +2 -2
  208. package/dist/{policy-DLZJ5gAp.js → policy-DaJy4nK4.js} +17 -8
  209. package/dist/{policy-from-catalog-DzhEc3Y9.js → policy-from-catalog-DFWYkNdu.js} +9 -9
  210. package/dist/{policy-types-DzwivBgR.d.ts → policy-types-B-F-qAZk.d.ts} +109 -5
  211. package/dist/postgres-store-BL9M_CA1.js +1001 -0
  212. package/dist/{postgrest-NUqZT-RB.d.ts → postgrest-CYacM_u7.d.ts} +12 -1
  213. package/dist/{postgrest-CW0IqC-U.js → postgrest-r5faDIzD.js} +47 -5
  214. package/dist/{powersync-BHfuehf3.js → powersync-13odBwiM.js} +3 -3
  215. package/dist/powersync-53ryOZip.js +1059 -0
  216. package/dist/powersync-CExtTLyA.js +1 -0
  217. package/dist/preset/index.js +1 -1
  218. package/dist/{preset-DZdU0tne.js → preset-CHTbd-DQ.js} +2 -2
  219. package/dist/prisma/index.d.ts +2 -2
  220. package/dist/prisma/index.js +1 -1
  221. package/dist/{problem-details-DXlt-vks.d.ts → problem-details-Tcfmj3bV.d.ts} +1 -1
  222. package/dist/prompt-DwtVemER.js +935 -0
  223. package/dist/{protected-DEPHc2xV.d.ts → protected-BwZYL1X_.d.ts} +6 -5
  224. package/dist/{protected-DfjY5mLA.js → protected-DXE3cQYg.js} +2 -2
  225. package/dist/{provider-CC-u3bYP.js → provider-BQsTYYy0.js} +2 -2
  226. package/dist/{provider-DMVt6yYn.d.ts → provider-Csk-THAn.d.ts} +1 -1
  227. package/dist/{provider-store-B5Yrkhzr.js → provider-store-IgqQipCO.js} +2 -2
  228. package/dist/{pull-BgIfno6w.js → pull-CN5OLxrF.js} +7 -7
  229. package/dist/pull-Cty6Ovyu.js +1 -0
  230. package/dist/{push-CmFVBOeI.js → push-tVdG8dUL.js} +54 -14
  231. package/dist/{pushed-policy-BImMTTIM.d.ts → pushed-policy-BbcY9r_4.d.ts} +1 -1
  232. package/dist/{pushed-policy-DobP7AHI.js → pushed-policy-CmYeSQqq.js} +1 -1
  233. package/dist/react/index.d.ts +6 -6
  234. package/dist/react/index.js +3 -3
  235. package/dist/react/provider-client.d.ts +1 -1
  236. package/dist/react/provider-client.js +1 -1
  237. package/dist/react-native/index.d.ts +25 -11
  238. package/dist/react-native/index.js +214 -24
  239. package/dist/{refs-K6eWUJ0H.js → refs-CNJBiTFo.js} +15 -1
  240. package/dist/{replay-D7iKcLFe.d.ts → replay-DCDD_ZfL.d.ts} +1 -1
  241. package/dist/{request-context-BTRTG7OT.js → request-context-BykKLmyE.js} +2 -2
  242. package/dist/resend/index.d.ts +4 -4
  243. package/dist/{retire-CALjIQ7e.js → retire-Wj6dkyDE.js} +2 -2
  244. package/dist/{rls-BA8an5Ap.js → rls-Ck_PocSp.js} +32 -8
  245. package/dist/{rls-j6t43t7n.js → rls-CxBZb4rZ.js} +478 -534
  246. package/dist/{role-builder-CXbis5-X.js → role-builder-C1VJzvcr.js} +3 -3
  247. package/dist/rolldown-runtime-C3I60J0A.js +4 -0
  248. package/dist/{rpc-aPyNi6tA.js → rpc-Bk1bE-ch.js} +1 -1
  249. package/dist/run-Bz7DXGEv.js +1 -0
  250. package/dist/{run-ticket-sxFI6LAk.js → run-ticket-B5d_63Ma.js} +22 -1
  251. package/dist/{run-ticket-BjhTOi6u.d.ts → run-ticket-BpNi7BCi.d.ts} +8 -3
  252. package/dist/{run-DOfMtc9V.js → run-uLD2aWuO.js} +7 -7
  253. package/dist/{runtime-D3VTAiCA.js → runtime-Vif3_-zf.js} +1 -1
  254. package/dist/{saas-FO-Q8oj0.js → saas-Az_Kz-4D.js} +7 -7
  255. package/dist/{scan-BOI5tJ-6.js → scan-DSljDE1Y.js} +1 -1
  256. package/dist/{schema-yLuBWWsh.js → schema-gIcCx7zM.js} +1 -1
  257. package/dist/scim/index.d.ts +3 -2
  258. package/dist/scim/index.js +3 -1
  259. package/dist/scim-C7JYhySg.js +44 -0
  260. package/dist/{scim-ClHtpyV3.js → scim-YNieBO1U.js} +3 -537
  261. package/dist/{scopes-CUPSjo9q.js → scopes-BHsc-wp-.js} +1 -1
  262. package/dist/server/index.d.ts +11 -11
  263. package/dist/server/index.js +7 -7
  264. package/dist/{server-DqCT4CgZ.js → server-Bnga6I50.js} +3 -3
  265. package/dist/{server-types-BLd4MnBX.d.ts → server-types-C4gZUEZy.d.ts} +9 -9
  266. package/dist/{shared-DvvFzYXe.js → shared-C8LjUdVU.js} +1 -1
  267. package/dist/{shared-CD11nBbC.js → shared-fMKOv8hP.js} +46 -39
  268. package/dist/{sink-Bj_lDUDq.d.ts → sink-Cp_Eot9W.d.ts} +4 -4
  269. package/dist/{skills-B6lVdD_W.js → skills-Dcjw9_1C.js} +5 -5
  270. package/dist/{skills-CTYwkl44.js → skills-g_3BS9NC.js} +3 -3
  271. package/dist/{snapshot-CXUWfsNy.js → snapshot-CbGmYiJx.js} +4 -4
  272. package/dist/{snapshot-cache-DZHQ0KF6.js → snapshot-cache-DT2Kx1F8.js} +1 -1
  273. package/dist/{snapshot-cache-DqK9eDmM.d.ts → snapshot-cache-Pahd3IYJ.d.ts} +1 -1
  274. package/dist/solid/index.d.ts +6 -5
  275. package/dist/solid/index.js +4 -4
  276. package/dist/solid-start/index.d.ts +6 -6
  277. package/dist/solid-start/index.js +3 -3
  278. package/dist/{sources-vs5dGOsS.js → sources-B-zYB4GS.js} +111 -25
  279. package/dist/{sources-BV9j0DeZ.d.ts → sources-DEEuGb8S.d.ts} +63 -14
  280. package/dist/sources-qoIJQrJv.js +11 -0
  281. package/dist/{sql-B5T1IL83.js → sql-B96movIM.js} +5 -1
  282. package/dist/sql-CDEPCA0g.d.ts +10 -0
  283. package/dist/{src-DLfUWFAI.js → src-DLFrtrrC.js} +154 -53
  284. package/dist/ssf/index.d.ts +4 -4
  285. package/dist/ssf/index.js +640 -211
  286. package/dist/{standard-webhooks-6lg8v_is.d.ts → standard-webhooks-B_qRg0ws.d.ts} +2 -2
  287. package/dist/{store-4u_hxjWa.js → store-DSP9oGvh.js} +15 -7
  288. package/dist/{store-options-BqEakYRa.js → store-options-B_poyYvg.js} +6 -6
  289. package/dist/{stores-ClZUgeoP.d.ts → stores-BAZwSYZA.d.ts} +6 -5
  290. package/dist/{stores-BbsD4fAR.js → stores-BqEuHC05.js} +2 -2
  291. package/dist/{stream-7-xmnf3U.d.ts → stream-2Vwhl7Er.d.ts} +2 -2
  292. package/dist/{style-Uao76wO7.js → style-Cqo7-73x.js} +1 -0
  293. package/dist/{style-DiKWnAvn.js → style-Ds1gNm77.js} +1 -1
  294. package/dist/supabase/index.d.ts +8 -7
  295. package/dist/supabase/index.js +5 -5
  296. package/dist/supabase/middleware.d.ts +6 -6
  297. package/dist/supabase/middleware.js +6 -6
  298. package/dist/{supabase-Dxlp8A94.js → supabase--0aJdLEd.js} +9 -7
  299. package/dist/{supabase-9pqI57pW.js → supabase-Bqp7iIY2.js} +3 -3
  300. package/dist/supabase-hook-DJxC4PoP.js +1 -0
  301. package/dist/{supabase-hook-DdDQhMlw.js → supabase-hook-Dg0SrQWR.js} +1069 -123
  302. package/dist/supautils-MESd81bF.js +689 -0
  303. package/dist/{support-session-C6xJQYut.js → support-session-Cna49-3f.js} +2 -2
  304. package/dist/svelte/index.d.ts +5 -5
  305. package/dist/svelte/index.js +5 -5
  306. package/dist/svelte/runtime.d.ts +3 -3
  307. package/dist/svelte/runtime.js +3 -3
  308. package/dist/svelte/source.d.ts +5 -5
  309. package/dist/svelte/source.js +2 -2
  310. package/dist/sveltekit/index.d.ts +6 -6
  311. package/dist/sveltekit/index.js +2 -2
  312. package/dist/tanstack-start/index.d.ts +6 -6
  313. package/dist/tanstack-start/index.js +2 -2
  314. package/dist/{tenancy-DN2QAx9z.js → tenancy-CmeBQ6Nv.js} +12 -3
  315. package/dist/terminal/index.d.ts +6 -6
  316. package/dist/terminal/index.js +3 -3
  317. package/dist/testing/core.d.ts +2 -0
  318. package/dist/testing/core.js +1 -0
  319. package/dist/testing/fixtures/index.d.ts +12 -0
  320. package/dist/testing/fixtures/index.js +770 -0
  321. package/dist/testing/index.d.ts +41 -174
  322. package/dist/testing/index.js +241 -731
  323. package/dist/testing/saas/index.d.ts +5 -5
  324. package/dist/testing/saas/index.js +2 -2
  325. package/dist/testing/saas/permissions.d.ts +1 -1
  326. package/dist/testing/saas/permissions.js +1 -1
  327. package/dist/text-diff-DhITNCnD.js +444 -0
  328. package/dist/{token-BLZcjQgt.js → token-2qYDvXz2.js} +1 -1
  329. package/dist/{tool-refusal-CMLN5xhn.js → tool-refusal-reAhIzdl.js} +1 -1
  330. package/dist/trpc/index.d.ts +6 -6
  331. package/dist/trpc/index.js +3 -3
  332. package/dist/{types-5Ut_pbKy.d.ts → types-BWZybqs9.d.ts} +112 -8
  333. package/dist/{types-CZTnPFzM.d.ts → types-BXMYB7BY.d.ts} +2 -2
  334. package/dist/{types-CdlxsYQh.d.ts → types-BfVmNJO5.d.ts} +14 -3
  335. package/dist/{types-BqAKcRNW.d.ts → types-CIeZcG8v.d.ts} +2 -2
  336. package/dist/{types-BNORmDM8.d.ts → types-CKV71kKh.d.ts} +4 -4
  337. package/dist/{types-tIgIeIKJ.d.ts → types-CQVEQawv.d.ts} +4 -4
  338. package/dist/{types-BjV-fqcA.d.ts → types-CeIscIKp.d.ts} +4 -4
  339. package/dist/{types-_sHy8BQf.d.ts → types-CfiKC5aN.d.ts} +1 -1
  340. package/dist/{types-ClZaWzfb.d.ts → types-D3A19w4A.d.ts} +8 -4
  341. package/dist/{types-C8-KNsFf.d.ts → types-DBHftjgS.d.ts} +15 -8
  342. package/dist/{types-CCpc2Dcv.d.ts → types-DC44-hqb.d.ts} +2 -2
  343. package/dist/{types-fbZ7JEXr.d.ts → types-DXmwu78Z.d.ts} +4 -4
  344. package/dist/{types-DiQjupG2.d.ts → types-cTos-H7p.d.ts} +2 -2
  345. package/dist/{types-DX0LaKTb.d.ts → types-g7Oy6Zg4.d.ts} +3 -3
  346. package/dist/unplugin/index.d.ts +1 -1
  347. package/dist/unplugin/index.js +2 -2
  348. package/dist/{usage-T5mXq98v.js → usage-Bybmck7f.js} +7 -7
  349. package/dist/{usage-DHtE8j4E.js → usage-CDaLXCfL.js} +2 -2
  350. package/dist/usage-y-kBNdqs.js +1 -0
  351. package/dist/{validation-error-Bg5Tpluk.d.ts → validation-error-CQpoquwj.d.ts} +1 -1
  352. package/dist/{verify-DbCL9bnB.js → verify-pe8rL_Qw.js} +350 -83
  353. package/dist/{views-DTIIO-oQ.js → views-BB8E9dTP.js} +1 -1
  354. package/dist/vocabulary-Bg3eeT2H.d.ts +67 -0
  355. package/dist/vue/index.d.ts +6 -5
  356. package/dist/vue/index.js +4 -4
  357. package/dist/{waiter-CKy4MQSY.d.ts → waiter-DwEyouan.d.ts} +2 -2
  358. package/dist/watch-Bd9mx3rd.js +1 -0
  359. package/dist/{watch-CszoTJMq.js → watch-C-4VmFlL.js} +3 -3
  360. package/dist/webmcp/index.d.ts +2 -2
  361. package/dist/webmcp/index.js +2 -2
  362. package/dist/{where-scope-Dv-WTP-w.js → where-scope-wq2coopv.js} +41 -21
  363. package/dist/{who-can-D0QoYbEb.js → who-can-BwNsI_Js.js} +6 -6
  364. package/dist/workflow/index.d.ts +3 -3
  365. package/dist/workflow/index.js +5 -5
  366. package/dist/workflow-sdk/index.d.ts +5 -5
  367. package/dist/{wrap-Bd1Tejur.d.ts → wrap-B6R0cMRL.d.ts} +2 -2
  368. package/dist/{wrap-gX61EtpB.js → wrap-CiSc_KCq.js} +8 -2
  369. package/package.json +22 -11
  370. package/schemas/cli-result-v1.json +1 -0
  371. package/schemas/cloud-api-v1.json +152 -7
  372. package/schemas/connector-v1.json +8 -0
  373. package/schemas/supabase-claims-v1.json +5 -0
  374. package/schemas/supabase-manifest-v1.json +276 -75
  375. package/skills/permdock/SKILL.md +1 -0
  376. package/skills/permdock-agents/references/runtimes.md +3 -1
  377. package/skills/permdock-approvals/references/stores-and-resume.md +2 -1
  378. package/skills/permdock-data/references/queries-and-rls.md +5 -2
  379. package/skills/permdock-tenancy/SKILL.md +1 -1
  380. package/skills/permdock-tenancy/references/ownership-and-custom-roles.md +2 -0
  381. package/skills/permdock-wire/references/adapters.md +14 -0
  382. package/skills/permdock-wire/references/policy-options.md +1 -0
  383. package/dist/catalog-DjhMYYCq.js +0 -1
  384. package/dist/collect-FlXJlhus.js +0 -1
  385. package/dist/index-D8EovfsP.d.ts +0 -91
  386. package/dist/load-BxEtwlBS.js +0 -1
  387. package/dist/output-files-B3IZJksC.js +0 -1
  388. package/dist/parse-Cxq0WxrA.js +0 -53
  389. package/dist/peer-C8swJ2GH.js +0 -50
  390. package/dist/powersync-CbzkqL_M.js +0 -1
  391. package/dist/powersync-bYUDLOAO.js +0 -538
  392. package/dist/prompt-DfZLJLIn.js +0 -32
  393. package/dist/pull-ByOks_Tg.js +0 -1
  394. package/dist/run-CNsApDpd.js +0 -1
  395. package/dist/supabase-hook-CXcGpHqq.js +0 -1
  396. package/dist/supautils-B6HYL9eL.js +0 -91
  397. package/dist/text-diff-BQcUapOb.js +0 -15
  398. package/dist/usage-CHOtwL19.js +0 -1
  399. package/dist/watch-Cb-NcaUw.js +0 -1
@@ -1,41 +1,43 @@
1
- import { a as hasConditionOp } from "./refs-K6eWUJ0H.js";
2
- import { c as listPermissions, h as formerKeys } from "./permission-registry-Br4jSNVi.js";
1
+ import { o as hasConditionOp } from "./refs-CNJBiTFo.js";
2
+ import { c as listPermissions, h as formerKeys } from "./permission-registry-DpPtSKNZ.js";
3
3
  import { u as isPrincipalRelation } from "./resource-relations-D_jw0BFx.js";
4
- import { t as canonicalJson } from "./canonical-json-BC8_nMTw.js";
5
- import { a as normalizeMemberships, d as scopeList, o as resolveScope } from "./scopes-CUPSjo9q.js";
6
- import { o as flattenGrantee } from "./grantee-Cn1HyUsI.js";
7
- import { c as separationConflicts } from "./policy-DLZJ5gAp.js";
8
- import { x as validateCustomRole } from "./evaluate-_R8QkWaf.js";
9
- import { s as parseCredential } from "./credential-DM2um3ha.js";
10
- import { a as describeError } from "./errors-CWTY6uih.js";
4
+ import { t as canonicalJson } from "./canonical-json-DwilZ1iB.js";
5
+ import { f as scopeList, o as normalizeMemberships, s as resolveScope } from "./scopes-BHsc-wp-.js";
6
+ import { o as flattenGrantee } from "./grantee-BrRANrpT.js";
7
+ import { l as separationConflicts } from "./policy-DaJy4nK4.js";
8
+ import { T as validateCustomRole } from "./evaluate-B_oqFbWC.js";
9
+ import { s as parseCredential } from "./credential-CIM7wHwA.js";
10
+ import { a as describeError } from "./errors-DpP_U6Bf.js";
11
11
  import { t as policyRowConditionKeys } from "./row-conditions-h2HythXQ.js";
12
12
  import { a as rel, n as doctorSrcPath, o as sqlFiles, r as listSourceFiles } from "./files-D_JIzUrP.js";
13
13
  import { i as DOCTOR_REPORT_SCHEMA } from "./version-CEbQ5UeM.js";
14
- import { r as catalogOAuthScopes, s as jsonSchemaOf } from "./catalog-doc-C9wjsfNY.js";
15
- import { a as loadModule, i as loadConfiguredPolicy, n as asPolicy, s as pickNamed } from "./load-DFS_ry0W.js";
16
- import { r as runCollect } from "./collect-CrZJJnEF.js";
14
+ import { c as jsonSchemaOf, i as catalogOAuthScopes } from "./catalog-doc-CV9s6B1S.js";
15
+ import { a as loadModule, i as loadConfiguredPolicy, n as asPolicy, s as pickNamed } from "./load-DxroEzH1.js";
16
+ import { r as runCollect } from "./collect-BaWeMjwV.js";
17
17
  import { t as catalogPath } from "./catalog-path-CnI0XTFK.js";
18
+ import { i as qualifySqlTable, s as quoteSqlLiteral } from "./sql-B96movIM.js";
19
+ import { i as scopeMembershipTable } from "./compile-BAEO5bOk.js";
18
20
  import { n as supabaseTenantClaim } from "./budget-NbEtbJC_.js";
19
- import { s as quoteSqlLiteral } from "./sql-B5T1IL83.js";
20
- import { d as keptKeys, r as PERMDOCK_SCHEMA } from "./sources-vs5dGOsS.js";
21
- import { t as parseCatalog } from "./parse-Cxq0WxrA.js";
21
+ import { d as keptKeys, r as PERMDOCK_SCHEMA } from "./sources-B-zYB4GS.js";
22
+ import { t as parseCatalog } from "./parse-Ddhz2xf4.js";
22
23
  import "./markers-C6joDI3o.js";
23
- import { t as didYouMean } from "./args-IIolxxKA.js";
24
- import { t as DOCS_BASE } from "./manifest-CtKR3GXL.js";
25
- import { t as createStyle } from "./style-Uao76wO7.js";
26
- import { r as findingOf } from "./output-Dyw8fyPF.js";
27
- import { i as runSkillsInstall } from "./skills-B6lVdD_W.js";
24
+ import { t as didYouMean } from "./args-CC3OwyHW.js";
25
+ import { t as DOCS_BASE } from "./manifest-Dv6q4i5s.js";
26
+ import { t as createStyle } from "./style-Cqo7-73x.js";
27
+ import { r as findingOf } from "./output-DgSDLrta.js";
28
+ import { i as runSkillsInstall } from "./skills-Dcjw9_1C.js";
28
29
  import { n as MIGRATION_DIRS, t as DEFAULT_SENSITIVE_ACTIONS } from "./constants-DcJABbLW.js";
29
- import { l as partPath } from "./output-files-DhRBBE4n.js";
30
- import { _ as pd045, a as supabaseHookManifest, f as pd039, g as attrsPlan, m as resolveSchemas, n as hookOut, v as readSupabaseConfig, y as supabaseConfig } from "./supabase-hook-DdDQhMlw.js";
31
- import { i as group, n as membershipColumns, o as sqlStatements, r as tableKey } from "./deciding-columns-Sq12mEA6.js";
32
- import { I as graphSqlName, M as contextRefs, S as byKey, a as guardedTables, t as ownershipRules } from "./ownership-BatFgAA4.js";
33
- import { a as pd010, c as pd014, d as pd038, f as pd041, i as pd008, l as pd015, n as pd001, o as pd011, p as pd057, r as pd007, s as pd013, t as runUsage, u as pd036 } from "./usage-T5mXq98v.js";
34
- import { d as rowConditionMessage, f as commandFor, i as graphPlan, m as tableFor, p as compileGrants, s as ROW_CONDITION_FIX, u as helperTablePolicies } from "./verify-DbCL9bnB.js";
35
- import { t as FIELD_VIEWS } from "./fields-D9tPVUUS.js";
36
- import { r as staleFiles, t as powersyncFiles } from "./powersync-bYUDLOAO.js";
37
- import { n as legacyHelperNames, r as retirePlan, t as legacyHelperCalls } from "./retire-CALjIQ7e.js";
38
- import { t as supautilsRejections } from "./supautils-B6HYL9eL.js";
30
+ import { l as partPath } from "./output-files-CCMdcFWb.js";
31
+ import { _ as readSupabaseConfig, a as supabaseHookManifest, d as resolveSchemas, g as pd074, h as pd045, l as pd039, m as attrsPlan, n as hookOut, v as supabaseConfig } from "./supabase-hook-Dg0SrQWR.js";
32
+ import { D as byKey, U as graphSqlName, o as guardedTables, r as unsatisfiedKinds, t as ownershipRules, z as contextRefs } from "./ownership-Z2LpxsGa.js";
33
+ import { t as membershipSourcesOf } from "./sources-qoIJQrJv.js";
34
+ import { i as group, n as membershipColumns, o as sqlStatements, r as tableKey } from "./deciding-columns-DRo2QM6E.js";
35
+ import { a as pd010, c as pd014, d as pd038, f as pd041, i as pd008, l as pd015, n as pd001, o as pd011, p as pd057, r as pd007, s as pd013, t as runUsage, u as pd036 } from "./usage-Bybmck7f.js";
36
+ import { _ as helperTablePolicies, b as compileGrants, d as tableNames, i as graphPlan, m as ROW_CONDITION_FIX, u as tableNameOf, v as rowConditionMessage, x as tableFor, y as commandFor } from "./verify-pe8rL_Qw.js";
37
+ import { t as FIELD_VIEWS } from "./fields-ClcQLrVc.js";
38
+ import { a as streamOf, i as scopeSourcesOf, r as staleFiles, t as powersyncFiles } from "./powersync-53ryOZip.js";
39
+ import { a as generateOptions, c as buildContext, n as inheritTargets, o as isRefusal, t as supautilsRejections } from "./supautils-MESd81bF.js";
40
+ import { n as legacyHelperNames, r as retirePlan, t as legacyHelperCalls } from "./retire-Wj6dkyDE.js";
39
41
  import { existsSync, readFileSync, readdirSync, statSync } from "node:fs";
40
42
  import { basename, dirname, join, resolve } from "node:path";
41
43
  import { createRequire } from "node:module";
@@ -831,11 +833,26 @@ async function pd035(input) {
831
833
  }
832
834
  //#endregion
833
835
  //#region src/cli/doctor/powersync.ts
836
+ /** Why each membership source of a scope the streams read through sources has no stream form, once per source. */
837
+ function sourceGaps(policy, config) {
838
+ const scopes = scopeList(policy.scopes);
839
+ const sources = membershipSourcesOf(config);
840
+ const gaps = /* @__PURE__ */ new Set();
841
+ for (const scope of scopes) {
842
+ if (scopeMembershipTable(config.rls?.memberships, scopes, scope.name) !== void 0) continue;
843
+ for (const source of scopeSourcesOf(sources, scope.name)) {
844
+ const stream = streamOf(source);
845
+ if (typeof stream === "string") gaps.add(stream);
846
+ }
847
+ }
848
+ return [...gaps];
849
+ }
834
850
  /**
835
851
  * PD058: `sync-config.yaml` or the `powersync.manifest` file is not what the
836
852
  * policy compiles to, so PowerSync syncs rows, or the device builds
837
853
  * snapshots, by an older policy. A policy that does not compile is a finding
838
- * too.
854
+ * too, and so is each membership source of a synced scope with no stream
855
+ * form: its members sync none of the rows it grants.
839
856
  */
840
857
  async function pd058(input) {
841
858
  const { cwd, config } = input;
@@ -853,12 +870,18 @@ async function pd058(input) {
853
870
  fix: "fix the powersync and rls config, then run permdock powersync generate"
854
871
  }];
855
872
  }
856
- return staleFiles(cwd, compiled.files).map((file) => ({
873
+ const gaps = sourceGaps(policy, config).map((gap) => ({
874
+ code: "PD058",
875
+ severity: "warning",
876
+ message: gap,
877
+ fix: "build the source with tableMembershipSource or junctionMembershipSource, without expiresAt or disabledAt, or serve its members from the server"
878
+ }));
879
+ return [...staleFiles(cwd, compiled.files).map((file) => ({
857
880
  code: "PD058",
858
881
  severity: "warning",
859
882
  message: file.missing ? `${file.path} is missing, so ${file.path === config.powersync?.manifest ? "the device builds no local snapshot" : "PowerSync syncs no stream the policy compiles to"}` : `${file.path} is not what the policy compiles to, so ${file.path === config.powersync?.manifest ? "the device builds snapshots" : "PowerSync syncs rows"} by an older policy`,
860
883
  fix: "run permdock powersync generate and deploy the files"
861
- }));
884
+ })), ...gaps];
862
885
  }
863
886
  //#endregion
864
887
  //#region src/cli/doctor/project.ts
@@ -1229,8 +1252,8 @@ async function pd030(input) {
1229
1252
  for (const resource of resources) {
1230
1253
  const columns = limitedColumns(policy, resource, rls.actions);
1231
1254
  if (columns.length === 0) continue;
1232
- const table = tableFor(resource, rls.tables);
1233
- if (rls.fields !== "views") {
1255
+ const table = tableFor(resource, tableNames(rls.tables));
1256
+ if (rls.fields === void 0) {
1234
1257
  findings.push({
1235
1258
  code: "PD030",
1236
1259
  severity: "warning",
@@ -1336,6 +1359,32 @@ async function pd034(input) {
1336
1359
  }));
1337
1360
  }
1338
1361
  /**
1362
+ * PD076: `rls.actions` entries set to `'none'` that change nothing: a verb
1363
+ * that is not one of the six default verbs and does not read as a write
1364
+ * compiles to no policy anyway, and a verb no permission uses compiles to
1365
+ * nothing at all. A write-sounding `none` stays, because it silences PD071.
1366
+ */
1367
+ async function pd076(input) {
1368
+ const actions = input.config.rls?.actions;
1369
+ if (actions === void 0 || input.config.policy === void 0) return [];
1370
+ const policy = await policyOf(input);
1371
+ if (policy === void 0) return [];
1372
+ const used = new Set(listPermissions(policy.vocabulary.permissions).map((leaf) => leaf.action));
1373
+ const unused = Object.keys(actions).filter((verb) => !used.has(verb)).toSorted();
1374
+ const noop = Object.entries(actions).filter(([verb, command]) => command === "none" && used.has(verb) && commandFor(verb) === void 0 && !suggestsWrite(verb)).map(([verb]) => verb).toSorted();
1375
+ return [...noop.length === 0 ? [] : [{
1376
+ code: "PD076",
1377
+ severity: "info",
1378
+ message: `rls.actions sets ${noop.join(", ")} to 'none', which is already what ${noop.length === 1 ? "that verb compiles" : "those verbs compile"} to`,
1379
+ fix: `delete these entries: ${noop.join(", ")}`
1380
+ }], ...unused.length === 0 ? [] : [{
1381
+ code: "PD076",
1382
+ severity: "info",
1383
+ message: `rls.actions maps ${unused.join(", ")}, which no permission uses`,
1384
+ fix: `delete these entries, or fix the verb's spelling: ${unused.join(", ")}`
1385
+ }]];
1386
+ }
1387
+ /**
1339
1388
  * Storage and Realtime policies written outside PermDock that call the SQL helpers for a permission whose grants
1340
1389
  * carry row conditions: the helpers check only role and scope.
1341
1390
  */
@@ -1399,20 +1448,94 @@ async function pd071(input) {
1399
1448
  fix: `map it on purpose in rls.actions: ${verb}: "insert", "update", "delete" or "none"`
1400
1449
  }));
1401
1450
  }
1451
+ /**
1452
+ * PD072: a membership source reads role keys through the table of custom
1453
+ * roles (`rls.customRoleWrites.roles`), which tenants write.
1454
+ */
1455
+ function pd072(input) {
1456
+ const roles = input.config.rls?.customRoleWrites?.roles;
1457
+ if (roles?.tenant === void 0) return [];
1458
+ const target = qualifySqlTable(roles.table);
1459
+ return membershipSourcesOf(input.config).filter((source) => source.sql.throughs.some((through) => through.table === target)).map((source) => ({
1460
+ code: "PD072",
1461
+ severity: "warning",
1462
+ message: `the ${source.sql.table} membership source reads role keys through ${target}, whose tenant rows tenants write: a tenant row named like a declared role must not grant it`,
1463
+ fix: `keep the permdock_custom_role_name_guard trigger on ${target} (rls generate emits it with customRoleWrites.roles) and generate with this config, so helpers read a tenant row named like a declared role as no role`
1464
+ }));
1465
+ }
1466
+ /** PD073: a role's `for` lists kinds no membership source of its scope can hold. */
1467
+ async function pd073(input) {
1468
+ const rls = input.config.rls;
1469
+ if (rls === void 0 || input.config.policy === void 0) return [];
1470
+ const policy = await policyOf(input);
1471
+ if (policy === void 0) return [];
1472
+ const scopes = scopeList(policy.scopes);
1473
+ const ownership = ownershipRules(policy, scopes);
1474
+ const sources = membershipSourcesOf(input.config);
1475
+ const ctx = {
1476
+ dialect: "supabase",
1477
+ scopes,
1478
+ tenantClaim: "tenant_id",
1479
+ gucPrefix: "app",
1480
+ ...rls.memberships === void 0 ? {} : { memberships: rls.memberships },
1481
+ ...sources === void 0 ? {} : { memberSources: sources },
1482
+ ...ownership === void 0 ? {} : { ownership }
1483
+ };
1484
+ return unsatisfiedKinds(ctx, policy).map((item) => ({
1485
+ code: "PD073",
1486
+ severity: "error",
1487
+ message: `role ${item.role} is for ${item.for.join(", ")}, but its membership sources hold ${item.sources.join(", ")}: no membership can hold it`,
1488
+ fix: `set via on one of those sources to ${item.for.join(" or ")}, or change for on role ${item.role}`
1489
+ }));
1490
+ }
1491
+ /**
1492
+ * PD075: two resources that `rls.tables` maps to one table, each with its own
1493
+ * keys and helpers for the same rows. `doctor.sharedTables` lists tables split
1494
+ * on purpose (two resources over disjoint rows).
1495
+ */
1496
+ async function pd075(input) {
1497
+ const rls = input.config.rls;
1498
+ if (rls === void 0 || input.config.policy === void 0) return [];
1499
+ const policy = await policyOf(input);
1500
+ if (policy === void 0) return [];
1501
+ const allowed = new Set((input.config.doctor?.sharedTables ?? []).map(qualifySqlTable));
1502
+ const byTable = /* @__PURE__ */ new Map();
1503
+ for (const leaf of listPermissions(policy.vocabulary.permissions)) {
1504
+ const table = qualifySqlTable(tableNameOf(rls.tables?.[leaf.resource], leaf.resource));
1505
+ byTable.set(table, (byTable.get(table) ?? /* @__PURE__ */ new Set()).add(leaf.resource));
1506
+ }
1507
+ return [...byTable.entries()].filter(([table, resources]) => resources.size > 1 && !allowed.has(table)).toSorted(byKey).map(([table, resources]) => {
1508
+ return {
1509
+ code: "PD075",
1510
+ severity: "warning",
1511
+ message: `rls.tables maps ${[...resources].toSorted().join(" and ")} to ${table}, so the same rows carry two sets of keys and helpers`,
1512
+ fix: `merge them into one resource (https://permdock.com/docs/guides/merge-resources), or list ${table} in doctor.sharedTables when the resources cover disjoint rows`
1513
+ };
1514
+ });
1515
+ }
1402
1516
  //#endregion
1403
1517
  //#region src/cli/doctor/seeds.ts
1404
1518
  const SEED_INSERT = /^insert\s+into\s+((?:"[^"]+"|\w+)(?:\.(?:"[^"]+"|\w+))?)\s*\(\s*role\s*,\s*permission\s*,\s*grant_key\s*,\s*scope\s*,\s*effect\s*\)\s*values\s*([\s\S]*?)\s*on\s+conflict\b/iu;
1405
1519
  const SEED_CLEAR = /^delete\s+from\s+((?:"[^"]+"|\w+)(?:\.(?:"[^"]+"|\w+))?)\s*$/iu;
1406
1520
  const LITERAL = String.raw`'((?:[^']|'')*)'`;
1407
1521
  const SEED_ROW = new RegExp(String.raw`\(\s*${LITERAL}\s*,\s*${LITERAL}\s*,\s*${LITERAL}\s*,\s*${LITERAL}\s*,\s*${LITERAL}\s*\)`, "gu");
1522
+ const SEED_VIEW = /^create\s+(?:or\s+replace\s+)?view\s+((?:"[^"]+"|\w+)(?:\.(?:"[^"]+"|\w+))?)\s*\([^)]*\)\s*with\s*\([^)]*\)\s*as\s+([\s\S]*)$/iu;
1523
+ const SEED_FUNCTION = /^create\s+(?:or\s+replace\s+)?function\s+(?:"[^"]+"|\w+)\.(?:"seed"|seed)\s*\(\s*\)[\s\S]*?\$(\w*)\$([\s\S]*)\$\1\$/iu;
1408
1524
  function rowKey(values) {
1409
1525
  return values.join(" ");
1410
1526
  }
1527
+ /** The statements of a file, with the body of `<schema>.seed()` (`rls.seeds: 'function'`) in place of its `create function`. */
1528
+ function seedStatements(sql) {
1529
+ return sqlStatements(sql).flatMap((statement) => {
1530
+ const fn = SEED_FUNCTION.exec(statement.text);
1531
+ return fn === null ? [statement] : sqlStatements(group(fn, 2));
1532
+ });
1533
+ }
1411
1534
  /** The rows of the last statement that seeds or clears `table`, in migration order. */
1412
1535
  function lastSeed(files, cwd, config, table) {
1413
1536
  let seeded;
1414
- for (const file of sqlFiles(cwd, config.doctor?.migrations ?? MIGRATION_DIRS)) for (const { text } of sqlStatements(files.read(file))) {
1415
- const insert = SEED_INSERT.exec(text);
1537
+ for (const file of sqlFiles(cwd, config.doctor?.migrations ?? MIGRATION_DIRS)) for (const { text } of seedStatements(files.read(file))) {
1538
+ const insert = SEED_INSERT.exec(text) ?? SEED_VIEW.exec(text);
1416
1539
  if (insert !== null && tableKey(group(insert, 1)) === table) {
1417
1540
  const rows = /* @__PURE__ */ new Set();
1418
1541
  for (const row of group(insert, 2).matchAll(SEED_ROW)) rows.add(rowKey(row.slice(1, 6).map((value) => value.replaceAll("''", "'"))));
@@ -1447,18 +1570,26 @@ async function pd054(input) {
1447
1570
  if (seeded === void 0) return [];
1448
1571
  const policy = await policyOf(input);
1449
1572
  if (policy === void 0) return [];
1450
- const ctx = {
1573
+ const generate = {
1574
+ cwd,
1575
+ config,
1576
+ target: "sql",
1451
1577
  dialect: rls?.dialect ?? "supabase",
1452
- scopes: scopeList(policy.scopes),
1453
- tenantClaim: rls?.tenantClaim ?? "tenant_id",
1454
- gucPrefix: rls?.gucPrefix ?? "app",
1455
- ...rls?.actions === void 0 ? {} : { actions: rls.actions },
1456
- schema,
1457
- ...rls?.fields === "views" ? { fields: "views" } : {}
1578
+ rbac: false,
1579
+ check: false,
1580
+ skipClosures: true,
1581
+ inlineFunctions: false,
1582
+ io: {
1583
+ stdout: () => void 0,
1584
+ stderr: () => void 0
1585
+ }
1458
1586
  };
1459
1587
  let expected;
1460
1588
  try {
1461
- expected = new Set(compileGrants(policy, ctx, rls?.tables, [], true).rolePermissions.map((row) => rowKey([
1589
+ const options = generateOptions(generate);
1590
+ const built = isRefusal(options) ? options : buildContext(generate, policy, options);
1591
+ if (isRefusal(built)) return [];
1592
+ expected = new Set(compileGrants(policy, built.ctx, tableNames(rls?.tables), [], true, rls?.rowHelpers !== void 0 || inheritTargets(policy).length > 0).rolePermissions.map((row) => rowKey([
1462
1593
  row.role,
1463
1594
  row.permission,
1464
1595
  row.grantKey,
@@ -1582,25 +1713,51 @@ function revokedExecute(statements) {
1582
1713
  }
1583
1714
  return revoked;
1584
1715
  }
1716
+ /** `supabase.hook.claims` and `hook.before` functions, by key, with the argument type the hook calls them with. */
1717
+ function hookClaimFunctions(config) {
1718
+ const hook = config.supabase?.hook;
1719
+ const before = hook?.before;
1720
+ const functions = /* @__PURE__ */ new Map();
1721
+ for (const fn of Object.values(hook?.claims ?? {})) if (typeof fn === "string") functions.set(tableKey(fn), "uuid");
1722
+ for (const fn of typeof before === "string" ? [before] : before ?? []) if (typeof fn === "string") functions.set(tableKey(fn), "jsonb");
1723
+ return functions;
1724
+ }
1585
1725
  /**
1586
1726
  * PD049: a `security definer` function `public` (every role) or, in Supabase's
1587
1727
  * `public` schema, `anon` may still execute: Postgres grants `execute` to
1588
1728
  * `public` on create, and Supabase's default privileges grant it to `anon`.
1729
+ * A hook claim function returns any user's claims, so `authenticated` must
1730
+ * not execute it either, definer or not.
1589
1731
  */
1590
1732
  function pd049(cwd, config, files = nodeFiles) {
1591
1733
  if (!isSupabase(files, cwd, config)) return [];
1592
1734
  const statements = migrationStatements(files, cwd, config);
1593
1735
  const revoked = revokedExecute(statements);
1736
+ const hookFunctions = hookClaimFunctions(config);
1594
1737
  const findings = [];
1595
1738
  for (const fn of createdFunctions(statements)) {
1596
- if (!/\bsecurity\s+definer\b/iu.test(fn.head) || /\breturns\s+(?:event_)?trigger\b/iu.test(fn.head)) continue;
1739
+ const hookArgument = hookFunctions.get(fn.key);
1740
+ if (hookArgument === void 0 && (!/\bsecurity\s+definer\b/iu.test(fn.head) || /\breturns\s+(?:event_)?trigger\b/iu.test(fn.head))) continue;
1597
1741
  const schema = schemaOf(fn.key);
1598
1742
  const from = /* @__PURE__ */ new Set([
1599
1743
  ...revoked.get(fn.key) ?? [],
1600
1744
  ...revoked.get(`${schema}.*`) ?? [],
1601
1745
  ...revoked.get("*.*") ?? []
1602
1746
  ]);
1603
- const missing = ["public", ...schema === "public" ? ["anon"] : []].filter((role) => !from.has(role));
1747
+ const missing = (hookArgument === void 0 ? ["public", ...schema === "public" ? ["anon"] : []] : [
1748
+ "public",
1749
+ "anon",
1750
+ "authenticated"
1751
+ ]).filter((role) => !from.has(role));
1752
+ if (missing.length > 0 && hookArgument !== void 0) {
1753
+ findings.push({
1754
+ code: "PD049",
1755
+ severity: "warning",
1756
+ message: `${fn.file}:${String(fn.line)} hook claim function ${fn.key} returns any user's claims and can be executed by ${missing.join(" and ")}`,
1757
+ fix: `regenerate the hook (permdock rls generate), which revokes it, or add revoke all on function ${fn.key}(${hookArgument}) from public, anon, authenticated;`
1758
+ });
1759
+ continue;
1760
+ }
1604
1761
  if (missing.length > 0) findings.push({
1605
1762
  code: "PD049",
1606
1763
  severity: "warning",
@@ -2078,6 +2235,26 @@ const DOCTOR_CHECKS = [
2078
2235
  groups: ["rls"],
2079
2236
  run: pd071
2080
2237
  },
2238
+ {
2239
+ code: "PD072",
2240
+ groups: ["rls"],
2241
+ run: pd072
2242
+ },
2243
+ {
2244
+ code: "PD073",
2245
+ groups: ["rls", "ownership"],
2246
+ run: pd073
2247
+ },
2248
+ {
2249
+ code: "PD075",
2250
+ groups: ["rls"],
2251
+ run: pd075
2252
+ },
2253
+ {
2254
+ code: "PD076",
2255
+ groups: ["rls"],
2256
+ run: pd076
2257
+ },
2081
2258
  {
2082
2259
  code: "PD028",
2083
2260
  groups: ["attrs", "supabase"],
@@ -2181,6 +2358,12 @@ const DOCTOR_CHECKS = [
2181
2358
  groups: ["supabase"],
2182
2359
  run: (project) => pd045(project.cwd)
2183
2360
  },
2361
+ {
2362
+ code: "PD074",
2363
+ groups: ["supabase", "helpers"],
2364
+ when: (config) => config.supabase?.hook !== void 0,
2365
+ run: (project) => pd074(project.cwd, project.config)
2366
+ },
2184
2367
  ...[
2185
2368
  ["PD046", pd046],
2186
2369
  ["PD047", pd047],
@@ -2333,15 +2516,24 @@ function formatDoctor(report, color) {
2333
2516
  for (const change of report.fixed) lines.push(` ${style.okMark} fixed ${change}`);
2334
2517
  if (report.fixed.length > 0) lines.push("");
2335
2518
  for (const finding of report.findings) {
2336
- const mark = finding.severity === "error" ? style.errorMark : style.warnMark;
2519
+ const mark = markOf(finding.severity, style);
2337
2520
  lines.push(` ${mark} ${style.paint("bold", finding.code)} ${finding.message}`);
2338
2521
  lines.push(` ${style.paint("dim", `fix: ${finding.fix}`)}`);
2339
2522
  }
2340
2523
  if (report.findings.length === 0) lines.push(" no findings");
2341
2524
  lines.push("");
2342
- lines.push(` ${String(report.errors)} error${report.errors === 1 ? "" : "s"}, ${String(report.warnings)} warning${report.warnings === 1 ? "" : "s"}`);
2525
+ const notes = report.findings.filter((finding) => finding.severity === "info").length;
2526
+ lines.push(` ${String(report.errors)} error${report.errors === 1 ? "" : "s"}, ${String(report.warnings)} warning${report.warnings === 1 ? "" : "s"}${notes === 0 ? "" : `, ${String(notes)} note${notes === 1 ? "" : "s"}`}`);
2343
2527
  return `${lines.join("\n")}\n`;
2344
2528
  }
2529
+ function markOf(severity, style) {
2530
+ switch (severity) {
2531
+ case "error": return style.errorMark;
2532
+ case "warning": return style.warnMark;
2533
+ case "info": return style.infoMark;
2534
+ default: return severity;
2535
+ }
2536
+ }
2345
2537
  async function supabaseSetup(input) {
2346
2538
  const policy = await input.policy();
2347
2539
  if (policy === void 0) return [];
@@ -1,6 +1,6 @@
1
1
  import { t as defineLeaf } from "./command-L8EstFNm.js";
2
- import { a as failOnFlag } from "./flags-C3DktBDY.js";
3
- import { n as ask, t as CANCELLED } from "./prompt-DfZLJLIn.js";
2
+ import { a as failOnFlag } from "./flags-aaeRAdiD.js";
3
+ import { n as ask, t as CANCELLED } from "./prompt-DwtVemER.js";
4
4
  //#region src/cli/commands/doctor.ts
5
5
  const doctor = defineLeaf({
6
6
  flags: {
@@ -10,7 +10,7 @@ const doctor = defineLeaf({
10
10
  description: "Check codes or groups to run",
11
11
  valueHint: "code",
12
12
  async complete() {
13
- const { DOCTOR_CHECKS } = await import("./doctor-DFjUxf2f.js");
13
+ const { DOCTOR_CHECKS } = await import("./doctor-BU1szn63.js");
14
14
  return [.../* @__PURE__ */ new Set([...DOCTOR_CHECKS.map(({ code }) => code), ...DOCTOR_CHECKS.flatMap(({ groups }) => groups)])];
15
15
  }
16
16
  },
@@ -27,7 +27,7 @@ const doctor = defineLeaf({
27
27
  if (answer === void 0) return CANCELLED;
28
28
  fix = answer;
29
29
  }
30
- return (await import("./doctor-DFjUxf2f.js")).runDoctor({
30
+ return (await import("./doctor-BU1szn63.js")).runDoctor({
31
31
  cwd: ctx.cwd,
32
32
  config: ctx.config,
33
33
  only: flags.only,
@@ -1,7 +1,7 @@
1
- import { Rt as Instant, ir as Subject, lr as Condition } from "../policy-types-DzwivBgR.js";
2
- import { c as WhereResult } from "../permdock-D7eeLJER.js";
1
+ import { Rt as Instant, lr as Subject, mr as Condition } from "../policy-types-B-F-qAZk.js";
2
+ import { u as WhereResult } from "../permdock-Dco6dyCK.js";
3
3
  import { r as RelationsMapping } from "../graph-sql-B-dsAT6j.js";
4
- import { s as MembershipsMapping } from "../compile-Ckm2HqBZ.js";
4
+ import { s as MembershipsMapping } from "../compile-COM2VKuN.js";
5
5
  import { n as WithSubjectOptions, t as RowCheck } from "../row-check-Dt35czLy.js";
6
6
  import { SQL, Table } from "drizzle-orm";
7
7
  //#region src/drizzle/types.d.ts
@@ -1,6 +1,6 @@
1
1
  import { t as compact } from "../compact-CAf557ZB.js";
2
2
  import { t as assertSafeKey } from "../paths-DXSHAMIa.js";
3
- import { n as escapeLike, t as compileWhere } from "../compile-CMqMx_IN.js";
3
+ import { n as escapeLike, t as compileWhere } from "../compile-BAEO5bOk.js";
4
4
  import { a as rowCheckFrom, i as templateOf, r as subjectStatements, s as loadPeer, t as statementTemplate } from "../subject-settings-CkEwrw3W.js";
5
5
  //#region src/drizzle/to-where.ts
6
6
  function loadOperators(injected) {
@@ -1,9 +1,9 @@
1
- import { T as Policy, j as PolicyVocabulary, rr as Principal } from "../policy-types-DzwivBgR.js";
2
- import { w as Permission } from "../vocabulary-D6lPdb4Z.js";
3
- import { r as PermDock } from "../permdock-D7eeLJER.js";
1
+ import { T as Policy, j as PolicyVocabulary, sr as Principal } from "../policy-types-B-F-qAZk.js";
2
+ import { u as Permission } from "../permission-types-DhNEmoRG.js";
3
+ import { a as PermDock } from "../permdock-Dco6dyCK.js";
4
4
  import { n as RevocationFeed } from "../revocations-R07lFBnX.js";
5
- import { D as ConnectionOptions, T as Connection, f as InvalidSignatureError, i as OpenApiHooks, o as ProtectOptions, v as discoverViaSignatureAgent, x as webBotAuthVerifier } from "../server-types-BLd4MnBX.js";
6
- import { t as ServerAdapterOptions } from "../bind--9EFVYWF.js";
5
+ import { D as ConnectionOptions, T as Connection, f as InvalidSignatureError, i as OpenApiHooks, o as ProtectOptions, v as discoverViaSignatureAgent, x as webBotAuthVerifier } from "../server-types-C4gZUEZy.js";
6
+ import { t as ServerAdapterOptions } from "../bind-JDuvxjuW.js";
7
7
  import { Elysia } from "elysia";
8
8
  //#region src/elysia/create.d.ts
9
9
  type ElysiaRequestContext = {
@@ -1,7 +1,7 @@
1
1
  import { a as parsedBody, r as hasCredentials } from "../http-BBoKefeS.js";
2
- import { d as discoverViaSignatureAgent, m as webBotAuthVerifier, u as InvalidSignatureError } from "../evaluations-DZ2CbV5k.js";
3
- import { t as problemFromError } from "../map-error-TCAdw-eW.js";
4
- import { a as socketConnection, i as decorate, r as bindKernel } from "../bind-CZzhx-Vj.js";
2
+ import { l as InvalidSignatureError, p as webBotAuthVerifier, u as discoverViaSignatureAgent } from "../evaluations-DReoiVBw.js";
3
+ import { t as problemFromError } from "../map-error-BQGyDm_M.js";
4
+ import { a as socketConnection, i as decorate, r as bindKernel } from "../bind-D1nO6fiC.js";
5
5
  import { a as onRevoked, n as closeReason, t as POLICY_VIOLATION } from "../stream-CvdUS9V1.js";
6
6
  import { Elysia } from "elysia";
7
7
  //#region src/elysia/create.ts
@@ -1,5 +1,5 @@
1
- import { Nn as Decision, an as WireDenial, ir as Subject } from "./policy-types-DzwivBgR.js";
2
- import { t as Disclosure } from "./problem-details-DXlt-vks.js";
1
+ import { Ln as Decision, ln as WireDenial, lr as Subject } from "./policy-types-B-F-qAZk.js";
2
+ import { t as Disclosure } from "./problem-details-Tcfmj3bV.js";
3
3
  import { StandardSchemaV1 } from "@standard-schema/spec";
4
4
  //#region src/core/errors.d.ts
5
5
  /** Where and how a human approves; carries no secret. */
@@ -18,6 +18,7 @@ const CODES = {
18
18
  dirty_worktree: ["Uncommitted changes", 3],
19
19
  write_failed: ["Write failed", 1],
20
20
  check_failed: ["Out of date", 1],
21
+ catalog_invalid: ["Invalid catalog", 1],
21
22
  input_required: ["Input required", 3],
22
23
  consent_required: ["Consent required", 3],
23
24
  cancelled: ["Cancelled", 130],