permdock 0.6.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-DCYe60Pi.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-DvSSPQJX.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-p1PGoVjb.js → approvals-CMRfsbBh.js} +74 -48
  14. package/dist/{arazzo-41WuzHou.js → arazzo-ClrF3PVb.js} +2 -2
  15. package/dist/{arazzo-CaUVBn7D.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-DabClFLQ.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-BNM3TtDo.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-CAvgUuKs.js → bind-D1nO6fiC.js} +5 -5
  31. package/dist/{bind-DOyrv6zi.d.ts → bind-JDuvxjuW.d.ts} +7 -7
  32. package/dist/{build-instance-Bu_eDqYw.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-Drg-1YhL.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-DZVbrF-z.js → catalog-BaMQfQ6Y.js} +3 -3
  44. package/dist/{catalog-HD2gf5mY.js → catalog-D69WhFii.js} +43 -13
  45. package/dist/{catalog-doc-Cdn7-0pQ.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-CQWIpUG-.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-ytQ3uviA.js → cloud-CO8pYtwr.js} +5 -5
  62. package/dist/{codemod-ua2hHy7w.js → codemod-BP6n8N9L.js} +3 -3
  63. package/dist/{codemod-5mpSpnUY.js → codemod-i4N2BhDc.js} +3 -3
  64. package/dist/{collect-mLTY4nwb.js → collect-BaWeMjwV.js} +17 -8
  65. package/dist/{collect-Ci6akVwH.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-1bsAezL0.d.ts → compile-COM2VKuN.d.ts} +3 -3
  71. package/dist/{completion-BTFrHZhX.js → completion-BNdVf7X2.js} +3 -3
  72. package/dist/{config-bs_kZeYq.js → config-CoQHDrDi.js} +7 -3
  73. package/dist/{config-Bj2Ixq3d.js → config-DGZzMV1B.js} +2 -2
  74. package/dist/{config-report-DSpsLpCE.js → config-report-Cm7UITNA.js} +3 -3
  75. package/dist/connector-schema-_VCSsdtD.js +433 -0
  76. package/dist/{context-B_u3_bDJ.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-B30OMUOJ.d.ts → create-B2-CQqCI.d.ts} +5 -5
  82. package/dist/{create-CGm28gyI.js → create-Cb86Z8Im.js} +9 -8
  83. package/dist/{create-DCF2SvoT.js → create-DJrlhEp9.js} +5 -5
  84. package/dist/{create-D_NmPOdH.d.ts → create-QHuuPw3q.d.ts} +7 -7
  85. package/dist/{create-CBMmFie-.d.ts → create-UTnUVETj.d.ts} +30 -10
  86. package/dist/{credential-BcoiejpY.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-j6-rc37o.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-CiFQNuMV.d.ts → denied-text-D4qkEtFz.d.ts} +2 -2
  94. package/dist/{describe-BybMRY7A.js → describe-DZlnEtLy.js} +1 -0
  95. package/dist/{describe-B5qgDvEW.d.ts → describe-O0SwYIK8.d.ts} +2 -2
  96. package/dist/{diff-CmuSD3vc.js → diff-Btr1c1Ow.js} +2 -2
  97. package/dist/{diff-3jbx6Rm4.js → diff-DzT-xD13.js} +10 -10
  98. package/dist/{doctor-BdZw53-k.js → doctor-BU1szn63.js} +241 -49
  99. package/dist/{doctor-3ZqNHX_G.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-DH5QEGXh.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-CNClBvcj.js → evaluate-B_oqFbWC.js} +55 -12
  107. package/dist/{evaluations-C_1vdSZc.d.ts → evaluations-BCddEOfO.d.ts} +4 -4
  108. package/dist/{evaluations-beAooV0n.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-Dw0MTS3D.d.ts → fetch-adapter-CuhyYwC1.d.ts} +4 -4
  116. package/dist/{fetch-adapter-DD_gfmrC.js → fetch-adapter-De-u6vhJ.js} +3 -3
  117. package/dist/{fields-OYG_JR78.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-CTCMsFZk.js → from-snapshot-Bz469dIh.js} +17 -10
  122. package/dist/generate-3FNO5P5Q.js +159 -0
  123. package/dist/{grantee-hxrUsbpM.js → grantee-BrRANrpT.js} +1 -1
  124. package/dist/{grantee-conditions-CcXf8hMM.js → grantee-conditions-C6P1Tvol.js} +1 -1
  125. package/dist/{grantee-match-DbENBHLB.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-CBYVMjwh.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-BPk51-kX.d.ts → hosted-BmjzxQhp.d.ts} +14 -2
  132. package/dist/{hosted-B46-5LYE.js → hosted-XBgU6RGT.js} +34 -12
  133. package/dist/{http-DXJ37RDA.js → http-Ca3Sr5x1.js} +1 -1
  134. package/dist/{import-wyqXUyjm.js → import-Bz0GefWg.js} +5 -5
  135. package/dist/{import-CNV7I2Dw.js → import-DB2EG_iy.js} +3 -3
  136. package/dist/{index-C-6Letxg.d.ts → index-BE8y3moU.d.ts} +50 -8
  137. package/dist/{index-B8YjkEZ4.d.ts → index-BSfRl0hZ.d.ts} +6 -6
  138. package/dist/{index-DuWxc5dt.d.ts → index-BTkwrK7v.d.ts} +143 -14
  139. package/dist/index-CMiPH2Tv.d.ts +206 -0
  140. package/dist/{index-Ch8LpNDp.d.ts → index-DH9DUDEM.d.ts} +18 -3
  141. package/dist/{index-CueFnxQc.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-BsVpyGIk.d.ts → instance-options-CU0YQCLH.d.ts} +1 -1
  147. package/dist/{instance-snapshot-BOEhcqIF.js → instance-snapshot-CjcwnEiV.js} +16 -11
  148. package/dist/jwt/index.d.ts +83 -5
  149. package/dist/jwt/index.js +143 -5
  150. package/dist/{kernel-D0NVb1cK.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-dvL2XEe1.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-Dr70oA_3.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-CIq4-E9F.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-C4dDTVEd.js → openapi-DMocl1bh.js} +4 -4
  179. package/dist/{openapi-B7HZ0f-r.js → openapi-Ddb4628T.js} +2 -7
  180. package/dist/{openapi-DD1SV-5-.js → openapi-ztVaux6j.js} +8 -8
  181. package/dist/{operation-findings-DgATDpvh.js → operation-findings-kRcEp8lE.js} +1 -1
  182. package/dist/{operations-X0VM7F3m.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-1im__-08.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-DqaJNJPn.js → ownership-Z2LpxsGa.js} +443 -40
  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-5ODwqu8b.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-BrAscV28.js → permdock-BfWEeMqk.js} +177 -49
  199. package/dist/{permdock-SV8ZINYT.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-CN8H_9UF.d.ts → permission-types-DhNEmoRG.d.ts} +4 -64
  202. package/dist/{permissions-u_KHg-sN.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-BPxlwVhN.js → permissions-DArULThq.js} +4 -4
  205. package/dist/pkce-5h8NgMQJ.js +21 -0
  206. package/dist/{policies-DP2nqRoF.js → policies-B2lZIurj.js} +3 -3
  207. package/dist/{policy-77FSAq_V.d.ts → policy-B7dg_yzu.d.ts} +2 -2
  208. package/dist/{policy-DbM5YYtV.js → policy-DaJy4nK4.js} +17 -8
  209. package/dist/{policy-from-catalog-C2gMa2Dj.js → policy-from-catalog-DFWYkNdu.js} +9 -9
  210. package/dist/{policy-types-n0uRTsW8.d.ts → policy-types-B-F-qAZk.d.ts} +83 -4
  211. package/dist/postgres-store-BL9M_CA1.js +1001 -0
  212. package/dist/{postgrest-CEgRbefE.d.ts → postgrest-CYacM_u7.d.ts} +12 -1
  213. package/dist/{postgrest-DAjUkF9w.js → postgrest-r5faDIzD.js} +37 -4
  214. package/dist/{powersync-DISt6SUe.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-B45V5d2b.d.ts → problem-details-Tcfmj3bV.d.ts} +1 -1
  222. package/dist/prompt-DwtVemER.js +935 -0
  223. package/dist/{protected-RFGpakN9.d.ts → protected-BwZYL1X_.d.ts} +6 -5
  224. package/dist/{protected-BlF0F6wL.js → protected-DXE3cQYg.js} +2 -2
  225. package/dist/{provider-B1al-AZz.js → provider-BQsTYYy0.js} +2 -2
  226. package/dist/{provider-DILL9oPK.d.ts → provider-Csk-THAn.d.ts} +1 -1
  227. package/dist/{provider-store-DM6DNcta.js → provider-store-IgqQipCO.js} +2 -2
  228. package/dist/{pull-jEwbf80J.js → pull-CN5OLxrF.js} +7 -7
  229. package/dist/pull-Cty6Ovyu.js +1 -0
  230. package/dist/{push-BD4f15co.js → push-tVdG8dUL.js} +54 -14
  231. package/dist/{pushed-policy-DCW91KQU.d.ts → pushed-policy-BbcY9r_4.d.ts} +1 -1
  232. package/dist/{pushed-policy-CqtxkV4G.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 +209 -21
  239. package/dist/{refs-K6eWUJ0H.js → refs-CNJBiTFo.js} +15 -1
  240. package/dist/{replay-Bkm-Ne4l.d.ts → replay-DCDD_ZfL.d.ts} +1 -1
  241. package/dist/{request-context-C81Pip9n.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-BAqP4q66.js → rls-Ck_PocSp.js} +32 -8
  245. package/dist/{rls-DTvYd-lI.js → rls-CxBZb4rZ.js} +478 -534
  246. package/dist/{role-builder-uWQZ4v84.js → role-builder-C1VJzvcr.js} +3 -3
  247. package/dist/rolldown-runtime-C3I60J0A.js +4 -0
  248. package/dist/{rpc-VSl5ylaQ.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-DocwaTKn.d.ts → run-ticket-BpNi7BCi.d.ts} +8 -3
  252. package/dist/{run-CUKuz0A8.js → run-uLD2aWuO.js} +7 -7
  253. package/dist/{runtime-D3VTAiCA.js → runtime-Vif3_-zf.js} +1 -1
  254. package/dist/{saas-BCXRuXca.js → saas-Az_Kz-4D.js} +7 -7
  255. package/dist/{scan-qvOe0hS3.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-C3WXAHZj.js → server-Bnga6I50.js} +3 -3
  265. package/dist/{server-types-CKQiCnON.d.ts → server-types-C4gZUEZy.d.ts} +9 -9
  266. package/dist/{shared-DvvFzYXe.js → shared-C8LjUdVU.js} +1 -1
  267. package/dist/{shared-BAK8t4Uo.js → shared-fMKOv8hP.js} +44 -38
  268. package/dist/{sink-4-eQIRWf.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-B7DkYg6g.js → snapshot-CbGmYiJx.js} +4 -4
  272. package/dist/{snapshot-cache-DZHQ0KF6.js → snapshot-cache-DT2Kx1F8.js} +1 -1
  273. package/dist/{snapshot-cache-PXI-vGpY.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-Xc4zkszI.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-Cu2m75uo.js → src-DLFrtrrC.js} +140 -48
  284. package/dist/ssf/index.d.ts +4 -4
  285. package/dist/ssf/index.js +640 -211
  286. package/dist/{standard-webhooks-rbD7LS6h.d.ts → standard-webhooks-B_qRg0ws.d.ts} +2 -2
  287. package/dist/{store-BDutJkDL.js → store-DSP9oGvh.js} +15 -7
  288. package/dist/{store-options-u0ycEe8s.js → store-options-B_poyYvg.js} +6 -6
  289. package/dist/{stores-BUGNbJTt.d.ts → stores-BAZwSYZA.d.ts} +6 -5
  290. package/dist/{stores-CGhM8BN_.js → stores-BqEuHC05.js} +2 -2
  291. package/dist/{stream-CeCMJmBB.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-x5JtR2tc.js → supabase--0aJdLEd.js} +8 -6
  299. package/dist/{supabase-By_frk3U.js → supabase-Bqp7iIY2.js} +3 -3
  300. package/dist/supabase-hook-DJxC4PoP.js +1 -0
  301. package/dist/{supabase-hook-BMoEhZir.js → supabase-hook-Dg0SrQWR.js} +1060 -119
  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-Dfv0aTER.d.ts → types-BWZybqs9.d.ts} +110 -8
  333. package/dist/{types-Druu9wLM.d.ts → types-BXMYB7BY.d.ts} +2 -2
  334. package/dist/{types-BzzaHxt3.d.ts → types-BfVmNJO5.d.ts} +14 -3
  335. package/dist/{types-lUlG3TVd.d.ts → types-CIeZcG8v.d.ts} +2 -2
  336. package/dist/{types-B3_ooZgZ.d.ts → types-CKV71kKh.d.ts} +4 -4
  337. package/dist/{types-CX7AvRqP.d.ts → types-CQVEQawv.d.ts} +4 -4
  338. package/dist/{types-C863OQiR.d.ts → types-CeIscIKp.d.ts} +4 -4
  339. package/dist/{types-C_IiEs64.d.ts → types-CfiKC5aN.d.ts} +1 -1
  340. package/dist/{types-_WhUP7ud.d.ts → types-D3A19w4A.d.ts} +8 -4
  341. package/dist/{types-8RnwUAvE.d.ts → types-DBHftjgS.d.ts} +15 -8
  342. package/dist/{types-BdtSDbBO.d.ts → types-DC44-hqb.d.ts} +2 -2
  343. package/dist/{types-CVZSNocA.d.ts → types-DXmwu78Z.d.ts} +4 -4
  344. package/dist/{types-C791HFu9.d.ts → types-cTos-H7p.d.ts} +2 -2
  345. package/dist/{types-BtHtcKMr.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-SveTRTyr.js → usage-Bybmck7f.js} +7 -7
  349. package/dist/{usage-CRVl9V3t.js → usage-CDaLXCfL.js} +2 -2
  350. package/dist/usage-y-kBNdqs.js +1 -0
  351. package/dist/{validation-error-DHUrAkku.d.ts → validation-error-CQpoquwj.d.ts} +1 -1
  352. package/dist/{verify-BaAKx7t6.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-B986w1oK.d.ts → waiter-DwEyouan.d.ts} +2 -2
  358. package/dist/watch-Bd9mx3rd.js +1 -0
  359. package/dist/{watch-vea54PRw.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-C9vfEphl.js → where-scope-wq2coopv.js} +41 -21
  363. package/dist/{who-can-DWBAcaCQ.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-C5jC6sKI.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 +4 -1
  379. package/skills/permdock-tenancy/SKILL.md +1 -1
  380. package/skills/permdock-tenancy/references/ownership-and-custom-roles.md +1 -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-BoWglDPI.js +0 -1
  384. package/dist/collect-D7eQDffE.js +0 -1
  385. package/dist/index-Cp_ilKi1.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-BkWWCS1K.js +0 -538
  391. package/dist/powersync-MMJ2mI2q.js +0 -1
  392. package/dist/prompt-DfZLJLIn.js +0 -32
  393. package/dist/pull-CvpINcMK.js +0 -1
  394. package/dist/run-DDwUaJDU.js +0 -1
  395. package/dist/supabase-hook-CCw5m35C.js +0 -1
  396. package/dist/supautils-B6HYL9eL.js +0 -91
  397. package/dist/text-diff-BQcUapOb.js +0 -15
  398. package/dist/usage-CZpSQP6L.js +0 -1
  399. package/dist/watch--ovlPOc0.js +0 -1
@@ -0,0 +1,335 @@
1
+ import { A as memoryCustomRoleSource } from "./src-DLFrtrrC.js";
2
+ import { c as listPermissions } from "./permission-registry-DpPtSKNZ.js";
3
+ import { f as scopeList } from "./scopes-BHsc-wp-.js";
4
+ import { y as membershipsClaim } from "./evaluate-B_oqFbWC.js";
5
+ import { n as parseSnapshot } from "./snapshot-CbGmYiJx.js";
6
+ import { n as fromSnapshot } from "./from-snapshot-Bz469dIh.js";
7
+ import { t as getPermDock } from "./permdock-BfWEeMqk.js";
8
+ import { c as quoteSqlTable, n as defaultSqlCommand, o as quoteSqlIdent, t as SQL_IDENT } from "./sql-B96movIM.js";
9
+ import "./budget-NbEtbJC_.js";
10
+ //#region src/testing/policy-matrix.ts
11
+ function isOutcomeCell(value) {
12
+ return value === "granted" || value === "denied" || value === "approval-required" || value !== null && typeof value === "object" && ("denials" in value || "outcome" in value || "alternatives" in value || "obligations" in value || "deniedBy" in value);
13
+ }
14
+ function expectedOutcome(cell) {
15
+ return typeof cell === "string" ? cell : cell.outcome ?? "denied";
16
+ }
17
+ function same(left, right) {
18
+ return left.length === right.length && left.every((value, index) => value === right[index]);
19
+ }
20
+ function list(values) {
21
+ return `[${values.join(", ")}]`;
22
+ }
23
+ function decisionFailures(decision, cell) {
24
+ const expected = expectedOutcome(cell);
25
+ if (decision.outcome !== expected) return [`expected ${expected}, got ${decision.outcome}`];
26
+ if (typeof cell !== "object") return [];
27
+ const failures = [];
28
+ if (cell.denials !== void 0 && decision.outcome === "denied") {
29
+ for (const denial of cell.denials) if (!decision.denials.some((item) => item.reason === denial.reason && (denial.role === void 0 || item.role === denial.role))) failures.push(`no denial ${denial.reason}${denial.role === void 0 ? "" : ` for role ${String(denial.role)}`}; got ${list(decision.denials.map((item) => `${item.reason}${item.role === null ? "" : `@${item.role}`}`))}`);
30
+ }
31
+ if (cell.alternatives !== void 0 && decision.outcome === "denied") {
32
+ const actual = decision.alternatives.map((leaf) => leaf.key);
33
+ if (!same(actual, cell.alternatives)) failures.push(`alternatives: expected ${list(cell.alternatives)}, got ${list(actual)}`);
34
+ }
35
+ if (cell.obligations !== void 0 && decision.outcome === "granted") {
36
+ const actual = (decision.obligations ?? []).map((item) => item.kind);
37
+ if (!same(actual, cell.obligations)) failures.push(`obligations: expected ${list(cell.obligations)}, got ${list(actual)}`);
38
+ }
39
+ return failures;
40
+ }
41
+ /** `deniedBy`, against the trace of a fresh `explain` call for the same arguments. */
42
+ function deniedByFailures(instance, permission, data, cell) {
43
+ if (typeof cell !== "object" || cell.deniedBy === void 0) return [];
44
+ const explained = instance.explain(permission, data);
45
+ const winner = explained.trace.denies[0]?.name;
46
+ if (explained.outcome !== "denied" || winner !== cell.deniedBy) return [`deniedBy: expected ${cell.deniedBy}, explain answered ${explained.outcome}${winner === void 0 ? "" : ` by ${winner}`}`];
47
+ return [];
48
+ }
49
+ function snapshotFailures(instance, permission, data, cell) {
50
+ const outcome = expectedOutcome(cell);
51
+ if (outcome === "approval-required") return [];
52
+ return fromSnapshot(JSON.parse(JSON.stringify(instance.snapshot()))).can(permission, data) === (outcome === "granted") ? [] : ["snapshot client disagrees with the server"];
53
+ }
54
+ /** The cells `config.matrix` names, in matrix order, before any decision. */
55
+ function pendingCells(policy, config) {
56
+ const cells = [];
57
+ for (const permission of listPermissions(policy.permissions)) {
58
+ const spec = config.matrix[permission.key];
59
+ if (spec === void 0) continue;
60
+ if (!Object.values(spec).some((value) => !isOutcomeCell(value))) {
61
+ const data = permission.kind === "instance" ? Object.values(config.fixtures ?? {})[0] : void 0;
62
+ for (const [subject, cell] of Object.entries(spec)) cells.push({
63
+ name: `${permission.key} / ${subject}`,
64
+ permission,
65
+ subject,
66
+ data,
67
+ expected: cell
68
+ });
69
+ continue;
70
+ }
71
+ for (const [fixture, row] of Object.entries(spec)) {
72
+ if (isOutcomeCell(row)) continue;
73
+ for (const [subject, cell] of Object.entries(row)) cells.push({
74
+ name: `${permission.key} / ${fixture} / ${subject}`,
75
+ permission,
76
+ subject,
77
+ fixture,
78
+ data: config.fixtures?.[fixture],
79
+ expected: cell
80
+ });
81
+ }
82
+ }
83
+ return cells;
84
+ }
85
+ /** Where each cell sits, without deciding it: a test runner registers one test per cell. */
86
+ function policyMatrixLayout(policy, config) {
87
+ return pendingCells(policy, config).map((cell) => cell.fixture === void 0 ? {
88
+ name: cell.name,
89
+ permission: cell.permission.key,
90
+ subject: cell.subject
91
+ } : {
92
+ name: cell.name,
93
+ permission: cell.permission.key,
94
+ subject: cell.subject,
95
+ fixture: cell.fixture
96
+ });
97
+ }
98
+ /**
99
+ * Decides every cell of a policy matrix with no test runner: each cell lists
100
+ * its `failures`, and `missing` names the permissions an exhaustive matrix
101
+ * leaves out. `describePolicy` asserts the same report under Vitest.
102
+ */
103
+ async function policyMatrix(policy, config) {
104
+ const instances = /* @__PURE__ */ new Map();
105
+ for (const [name, user] of Object.entries(config.subjects)) instances.set(name, await getPermDock(policy, user, config.options));
106
+ const cells = [];
107
+ for (const pending of pendingCells(policy, config)) {
108
+ const instance = instances.get(pending.subject) ?? await getPermDock(policy, config.subjects[pending.subject], config.options);
109
+ const decision = instance.decide(pending.permission, pending.data);
110
+ const failures = [
111
+ ...decisionFailures(decision, pending.expected),
112
+ ...deniedByFailures(instance, pending.permission, pending.data, pending.expected),
113
+ ...config.snapshot === true ? snapshotFailures(instance, pending.permission, pending.data, pending.expected) : []
114
+ ];
115
+ cells.push({
116
+ name: pending.name,
117
+ permission: pending.permission.key,
118
+ subject: pending.subject,
119
+ ...pending.fixture === void 0 ? {} : { fixture: pending.fixture },
120
+ expected: pending.expected,
121
+ actual: decision.outcome,
122
+ decision,
123
+ failures
124
+ });
125
+ }
126
+ return {
127
+ cells,
128
+ missing: config.exhaustive === false ? [] : listPermissions(policy.permissions).map((permission) => permission.key).filter((key) => config.matrix[key] === void 0)
129
+ };
130
+ }
131
+ //#endregion
132
+ //#region src/testing/rls-parity.ts
133
+ function toSubject(input) {
134
+ return {
135
+ principal: {
136
+ id: input.id,
137
+ roles: input.roles ?? [],
138
+ ...input.tenant === void 0 ? {} : { tenant: input.tenant },
139
+ memberships: input.memberships ?? [],
140
+ ...input.claims === void 0 ? {} : { claims: input.claims }
141
+ },
142
+ context: {}
143
+ };
144
+ }
145
+ function rowId(row) {
146
+ return row["id"];
147
+ }
148
+ function setting(name, value) {
149
+ return {
150
+ sql: "select set_config($1, $2, true)",
151
+ values: [name, value]
152
+ };
153
+ }
154
+ /**
155
+ * The session state the generated helpers read: JWT claims for `supabase`,
156
+ * GUCs for `guc` (roles as a comma list, memberships as JSON).
157
+ */
158
+ function subjectSettings(dialect, subject, gucPrefix, tenantClaim, roleClaim, customRoles, scopes) {
159
+ const roles = subject.roles ?? [];
160
+ const memberships = membershipsClaim(subject.memberships ?? [], customRoles, scopes);
161
+ if (dialect === "supabase" || dialect === "neon") {
162
+ const claims = {
163
+ ...subject.claims,
164
+ sub: subject.id,
165
+ role: "authenticated",
166
+ [roleClaim]: roles.length === 1 ? roles[0] : roles,
167
+ [tenantClaim]: subject.tenant,
168
+ memberships
169
+ };
170
+ return [setting("request.jwt.claims", JSON.stringify(claims))];
171
+ }
172
+ const settings = [
173
+ ...Object.entries(subject.claims ?? {}).map(([name, value]) => {
174
+ if (!SQL_IDENT.test(name)) throw new Error(`PermDock: unsafe claim name '${name}'`);
175
+ return setting(`${gucPrefix}.${name}`, typeof value === "string" ? value : JSON.stringify(value));
176
+ }),
177
+ setting(`${gucPrefix}.user_id`, subject.id),
178
+ setting(`${gucPrefix}.${roleClaim}`, roles.join(",")),
179
+ setting(`${gucPrefix}.memberships`, JSON.stringify(memberships))
180
+ ];
181
+ return subject.tenant === void 0 ? settings : [...settings, setting(`${gucPrefix}.${tenantClaim}`, subject.tenant)];
182
+ }
183
+ /**
184
+ * The statement a case runs. With field views it reads back only the key, so
185
+ * a base table whose restricted columns are revoked does not reject it.
186
+ */
187
+ function statementSql(action, table, keyOnly) {
188
+ const quoted = quoteSqlTable(table);
189
+ const id = quoteSqlIdent("id");
190
+ const back = keyOnly ? id : "*";
191
+ const command = defaultSqlCommand(action) ?? "select";
192
+ switch (command) {
193
+ case "select": return `select ${back} from ${quoted} where ${id} = $1`;
194
+ case "update": return `update ${quoted} set ${id} = ${id} where ${id} = $1 returning ${back}`;
195
+ case "insert": return `insert into ${quoted} (${id}) values ($1) returning ${back}`;
196
+ case "delete": return `delete from ${quoted} where ${id} = $1 returning ${back}`;
197
+ default: return command;
198
+ }
199
+ }
200
+ function valued(row) {
201
+ if (row === null || typeof row !== "object") return [];
202
+ const record = row;
203
+ return Object.keys(record).filter((name) => record[name] !== null && record[name] !== void 0).toSorted();
204
+ }
205
+ function isRead(action) {
206
+ return action === "read" || action === "get" || action === "list";
207
+ }
208
+ async function viewColumns(query, table, key) {
209
+ const id = quoteSqlIdent("id");
210
+ await query("savepoint permdock_fields");
211
+ const view = await query(`select * from ${quoteSqlTable(`${table}_visible`)} where ${id} = $1`, [key]);
212
+ if (view.code === void 0) return valued(view.rows[0]);
213
+ await query("rollback to savepoint permdock_fields");
214
+ if (view.code !== "42P01") return view.code;
215
+ const base = await query(`select * from ${quoteSqlTable(table)} where ${id} = $1`, [key]);
216
+ return base.code ?? valued(base.rows[0]);
217
+ }
218
+ function dbOutcome(result) {
219
+ if (result.code === "42501") return "rejected";
220
+ return (result.rowCount ?? result.rows.length) > 0 ? "allowed" : "filtered";
221
+ }
222
+ async function testRlsParity(policy, options) {
223
+ const dialect = options.dialect ?? "guc";
224
+ const gucPrefix = options.gucPrefix ?? "app";
225
+ const tenantClaim = options.tenantClaim ?? "tenant_id";
226
+ const roleClaim = options.roleClaim ?? "user_role";
227
+ const role = options.role ?? "authenticated";
228
+ const customRoles = options.customRoles ?? [];
229
+ const scopes = scopeList(policy.scopes);
230
+ async function runCase(fixture) {
231
+ const permdock = await getPermDock(policy, toSubject(fixture.subject), { customRoles: memoryCustomRoleSource(customRoles) });
232
+ const granted = fixture.permission.kind === "collection" ? permdock.can(fixture.permission, fixture.row) : permdock.can(fixture.permission, fixture.row);
233
+ let fromClient;
234
+ if (options.snapshot === true) {
235
+ const snapshot = permdock.snapshot();
236
+ if (typeof snapshot !== "object" || snapshot instanceof Promise) throw new TypeError("PermDock: testRlsParity needs an unsigned snapshot");
237
+ fromClient = fromSnapshot(parseSnapshot(JSON.stringify(snapshot))).can(fixture.permission, fixture.row);
238
+ }
239
+ await options.query("begin");
240
+ try {
241
+ await options.query(`set local role ${quoteSqlIdent(role === "anon" && dialect === "neon" ? "anonymous" : role)}`);
242
+ for (const item of subjectSettings(dialect, fixture.subject, gucPrefix, tenantClaim, roleClaim, customRoles, scopes)) await options.query(item.sql, item.values);
243
+ const database = dbOutcome(await options.query(statementSql(fixture.permission.action, fixture.table, options.fieldViews === true), [rowId(fixture.row)]));
244
+ const agrees = granted ? database === "allowed" : database === "filtered" || database === "rejected";
245
+ let fields;
246
+ if (options.fieldViews === true && fixture.permission.kind === "instance" && isRead(fixture.permission.action)) {
247
+ const key = policy.resources.get(fixture.permission.resource)?.id ?? "id";
248
+ const kept = new Set(granted ? valued(permdock.pick(fixture.permission, fixture.row)) : []);
249
+ if (granted && fixture.row[key] !== null && fixture.row[key] !== void 0) kept.add(key);
250
+ fields = {
251
+ app: [...kept].toSorted(),
252
+ database: await viewColumns(options.query, fixture.table, rowId(fixture.row))
253
+ };
254
+ }
255
+ const fieldsOk = fields === void 0 || typeof fields.database !== "string" && fields.database.join("\0") === fields.app.join("\0");
256
+ const ok = agrees && fieldsOk && (fromClient === void 0 || fromClient === granted);
257
+ return {
258
+ name: fixture.name,
259
+ granted,
260
+ database,
261
+ ...fromClient === void 0 ? {} : { snapshot: fromClient },
262
+ ...fields === void 0 ? {} : { fields },
263
+ ok
264
+ };
265
+ } finally {
266
+ await options.query("rollback");
267
+ }
268
+ }
269
+ async function runAll(remaining, acc) {
270
+ const [head, ...tail] = remaining;
271
+ if (head === void 0) return acc;
272
+ return runAll(tail, [...acc, await runCase(head)]);
273
+ }
274
+ const results = await runAll(options.fixtures, []);
275
+ return {
276
+ ok: results.every((item) => item.ok),
277
+ results
278
+ };
279
+ }
280
+ //#endregion
281
+ //#region src/testing/orm-parity.ts
282
+ function sortedIds(values) {
283
+ return values.map(String).toSorted();
284
+ }
285
+ function subsetOf(small, large) {
286
+ return small.every((value) => large.includes(value));
287
+ }
288
+ /**
289
+ * ORM parity: for each scenario, the rows `permdock.filter()` keeps in memory
290
+ * must be exactly the rows the database returns for `toWhere(permdock.where())`.
291
+ * With a `relations` option, the graph is loaded for the rows first, so the
292
+ * in-memory side walks the same graph the database query does.
293
+ * A partial `where()` (a closure grant it cannot compile) may be refused or
294
+ * return fewer rows, never more.
295
+ */
296
+ async function testOrmParity(policy, scenarios, options) {
297
+ const idField = options.id ?? "id";
298
+ async function runCase(scenario) {
299
+ const permdock = await getPermDock(policy, scenario.user, scenario.options);
300
+ if (scenario.options?.relations !== void 0) await permdock.prefetchRelations(scenario.permission, scenario.rows);
301
+ const expected = sortedIds(permdock.filter(scenario.permission, scenario.rows).map((row) => row[idField]));
302
+ const where = permdock.where(scenario.permission);
303
+ try {
304
+ const actual = sortedIds(await options.run({
305
+ scenario,
306
+ where
307
+ }));
308
+ const ok = where.partial ? subsetOf(actual, expected) : actual.length === expected.length && subsetOf(actual, expected);
309
+ return {
310
+ name: scenario.name,
311
+ expected,
312
+ actual,
313
+ partial: where.partial,
314
+ ok
315
+ };
316
+ } catch (error) {
317
+ return {
318
+ name: scenario.name,
319
+ expected,
320
+ actual: [],
321
+ partial: where.partial,
322
+ error: error instanceof Error ? error.message : String(error),
323
+ ok: where.partial
324
+ };
325
+ }
326
+ }
327
+ const results = [];
328
+ for (const scenario of scenarios) results.push(await runCase(scenario));
329
+ return {
330
+ ok: results.every((item) => item.ok),
331
+ results
332
+ };
333
+ }
334
+ //#endregion
335
+ export { policyMatrixLayout as i, testRlsParity as n, policyMatrix as r, testOrmParity as t };
@@ -0,0 +1,179 @@
1
+ import { Ln as Decision, T as Policy, or as Membership, tr as CustomRole } from "./policy-types-B-F-qAZk.js";
2
+ import { u as Permission } from "./permission-types-DhNEmoRG.js";
3
+ import { o as PermDockOptions, u as WhereResult } from "./permdock-Dco6dyCK.js";
4
+ //#region src/testing/policy-matrix.d.ts
5
+ type MatrixOutcome = "granted" | "denied" | "approval-required";
6
+ type MatrixCell = MatrixOutcome | {
7
+ readonly outcome?: MatrixOutcome;
8
+ readonly denials?: readonly {
9
+ readonly role?: string | null;
10
+ readonly reason: string;
11
+ }[];
12
+ readonly alternatives?: readonly string[];
13
+ /** Obligation kinds a granted decision carries, in order; `[]` asserts none. */
14
+ readonly obligations?: readonly string[];
15
+ /** The `name` of the deny grant `explain` reports as the one that won. */
16
+ readonly deniedBy?: string;
17
+ };
18
+ type DescribePolicyConfig<TSubject> = {
19
+ readonly subjects: Record<string, TSubject>;
20
+ readonly fixtures?: Record<string, unknown>;
21
+ readonly matrix: Record<string, Record<string, MatrixCell | Record<string, MatrixCell>>>;
22
+ readonly exhaustive?: boolean;
23
+ readonly options?: PermDockOptions;
24
+ /**
25
+ * Also assert every granted or denied cell against `fromSnapshot(permdock.snapshot())`,
26
+ * the client a Server Component hands down. Closures cannot cross a snapshot and deny on the client.
27
+ */
28
+ readonly snapshot?: boolean;
29
+ };
30
+ /** One cell of the matrix, decided. */
31
+ type PolicyMatrixCell = {
32
+ /** `<permission> / <subject>`, or `<permission> / <fixture> / <subject>` for a nested row. */
33
+ readonly name: string;
34
+ readonly permission: string;
35
+ readonly subject: string;
36
+ readonly fixture?: string;
37
+ readonly expected: MatrixCell;
38
+ readonly actual: MatrixOutcome;
39
+ readonly decision: Decision;
40
+ /** Each way the decision differs from `expected`; empty when the cell holds. */
41
+ readonly failures: readonly string[];
42
+ };
43
+ type PolicyMatrixReport = {
44
+ readonly cells: readonly PolicyMatrixCell[];
45
+ /** Permission keys the matrix has no row for; empty with `exhaustive: false`. */
46
+ readonly missing: readonly string[];
47
+ };
48
+ /**
49
+ * Decides every cell of a policy matrix with no test runner: each cell lists
50
+ * its `failures`, and `missing` names the permissions an exhaustive matrix
51
+ * leaves out. `describePolicy` asserts the same report under Vitest.
52
+ */
53
+ declare function policyMatrix<TSubject>(policy: Policy, config: DescribePolicyConfig<TSubject>): Promise<PolicyMatrixReport>;
54
+ //#endregion
55
+ //#region src/testing/rls-parity.d.ts
56
+ type RlsDbOutcome = "allowed" | "filtered" | "rejected";
57
+ type RlsParitySubject = {
58
+ readonly id: string;
59
+ readonly roles?: readonly string[];
60
+ readonly tenant?: string;
61
+ readonly memberships?: readonly Membership[];
62
+ /**
63
+ * Extra token claims, read in memory as `principal.claims.*`. They join the
64
+ * JWT claims (`supabase`, `neon`); under `guc` each top-level claim is its
65
+ * own `<prefix>.<name>` setting, strings as is and anything else as JSON.
66
+ */
67
+ readonly claims?: Readonly<Record<string, unknown>>;
68
+ };
69
+ type RlsParityFixture = {
70
+ readonly name: string;
71
+ readonly subject: RlsParitySubject;
72
+ readonly permission: Permission;
73
+ readonly row: Readonly<Record<string, unknown>>;
74
+ readonly table: string;
75
+ };
76
+ type RlsQueryResult = {
77
+ readonly rows: readonly Record<string, unknown>[];
78
+ readonly rowCount?: number;
79
+ readonly code?: string;
80
+ };
81
+ type RlsQueryFn = (sql: string, values?: readonly unknown[]) => Promise<RlsQueryResult>;
82
+ type RlsParityOptions = {
83
+ readonly query: RlsQueryFn;
84
+ readonly fixtures: readonly RlsParityFixture[];
85
+ /**
86
+ * `supabase` and `neon` set `request.jwt.claims`; a test database stubs
87
+ * `auth.jwt()` / `auth.uid()` or `auth.session()` / `auth.user_id()` over it.
88
+ */
89
+ readonly dialect?: "supabase" | "neon" | "guc";
90
+ readonly gucPrefix?: string;
91
+ readonly tenantClaim?: string;
92
+ /** Claim (or `guc` setting) the RLS helpers read global roles from. Default `user_role`. */
93
+ readonly roleClaim?: string;
94
+ readonly role?: "authenticated" | "anon";
95
+ /**
96
+ * Tenant-defined roles the subjects' memberships may hold. `decide` resolves them through a
97
+ * `CustomRoleSource`; each membership's claim carries them as the compact `grants` map, which the
98
+ * helpers read in `jwt` mode. Seeding the `database`-mode tables is the caller's job.
99
+ */
100
+ readonly customRoles?: readonly CustomRole[];
101
+ /** Also decide each case from the subject's serialized snapshot (`fromSnapshot`); it must agree. */
102
+ readonly snapshot?: boolean;
103
+ /**
104
+ * With `rls generate --fields views`: for each instance read, the row of
105
+ * `<table>_visible` must hold exactly the columns `pick` keeps (plus the key,
106
+ * which always passes through). A table with no view is read directly.
107
+ */
108
+ readonly fieldViews?: boolean;
109
+ };
110
+ /** Columns with a value in the view's row and in `pick`'s result, sorted. */
111
+ type RlsFieldsOutcome = {
112
+ readonly app: readonly string[];
113
+ readonly database: readonly string[] | string;
114
+ };
115
+ type RlsParityCase = {
116
+ readonly name: string;
117
+ readonly granted: boolean;
118
+ readonly database: RlsDbOutcome;
119
+ /** The snapshot's decision, with `snapshot: true`. */
120
+ readonly snapshot?: boolean;
121
+ /** The field view check, with `fieldViews: true`; `database` is an error code when the read failed. */
122
+ readonly fields?: RlsFieldsOutcome;
123
+ readonly ok: boolean;
124
+ };
125
+ type RlsParityReport = {
126
+ readonly ok: boolean;
127
+ readonly results: readonly RlsParityCase[];
128
+ };
129
+ declare function testRlsParity<TUser>(policy: Policy<TUser>, options: RlsParityOptions): Promise<RlsParityReport>;
130
+ //#endregion
131
+ //#region src/testing/orm-parity.d.ts
132
+ type OrmParityScenario<TUser = unknown> = {
133
+ readonly name: string;
134
+ /** What the policy's `subject` mapper receives, as in `createPermDock(policy, user)`. */
135
+ readonly user: TUser;
136
+ /** The active tenant and role sources, as in `createPermDock(policy, user, options)`. */
137
+ readonly options?: PermDockOptions;
138
+ /** An instance permission; its `where()` filters the table. */
139
+ readonly permission: Permission<string, unknown, "instance">;
140
+ /** Every row of the table, exactly as the database holds them. */
141
+ readonly rows: readonly Readonly<Record<string, unknown>>[];
142
+ };
143
+ type OrmParityRunInput<TUser = unknown> = {
144
+ readonly scenario: OrmParityScenario<TUser>;
145
+ readonly where: WhereResult;
146
+ };
147
+ type OrmParityOptions<TUser = unknown> = {
148
+ /** Runs `toWhere(where)` against the database and returns the matching row ids. */
149
+ readonly run: (input: OrmParityRunInput<TUser>) => Promise<readonly unknown[]>;
150
+ /** The row id field; default `id`. */
151
+ readonly id?: string;
152
+ };
153
+ type OrmParityCase = {
154
+ readonly name: string;
155
+ readonly expected: readonly string[];
156
+ readonly actual: readonly string[];
157
+ /**
158
+ * `where()` left out a non-portable grant. `toWhere` refusing it is
159
+ * fail-closed and passes; rows it does return must be a subset.
160
+ */
161
+ readonly partial: boolean;
162
+ readonly error?: string;
163
+ readonly ok: boolean;
164
+ };
165
+ type OrmParityReport = {
166
+ readonly ok: boolean;
167
+ readonly results: readonly OrmParityCase[];
168
+ };
169
+ /**
170
+ * ORM parity: for each scenario, the rows `permdock.filter()` keeps in memory
171
+ * must be exactly the rows the database returns for `toWhere(permdock.where())`.
172
+ * With a `relations` option, the graph is loaded for the rows first, so the
173
+ * in-memory side walks the same graph the database query does.
174
+ * A partial `where()` (a closure grant it cannot compile) may be refused or
175
+ * return fewer rows, never more.
176
+ */
177
+ declare function testOrmParity<TUser>(policy: Policy<TUser>, scenarios: readonly OrmParityScenario<TUser>[], options: OrmParityOptions<TUser>): Promise<OrmParityReport>;
178
+ //#endregion
179
+ export { policyMatrix as S, DescribePolicyConfig as _, OrmParityScenario as a, PolicyMatrixCell as b, RlsFieldsOutcome as c, RlsParityOptions as d, RlsParityReport as f, testRlsParity as g, RlsQueryResult as h, OrmParityRunInput as i, RlsParityCase as l, RlsQueryFn as m, OrmParityOptions as n, testOrmParity as o, RlsParitySubject as p, OrmParityReport as r, RlsDbOutcome as s, OrmParityCase as t, RlsParityFixture as u, MatrixCell as v, PolicyMatrixReport as x, MatrixOutcome as y };
@@ -1,9 +1,9 @@
1
- import { Ln as DeniedDecision, Mn as ApprovalRequiredDecision, T as Policy, ar as Subject, j as PolicyVocabulary, rr as Principal, zn as GrantedDecision } from "./policy-types-n0uRTsW8.js";
2
- import { t as Operation } from "./operations-X0VM7F3m.js";
3
- import { i as PermDockOptions, p as PrincipalSource, r as PermDock } from "./permdock-SV8ZINYT.js";
4
- import { m as ApprovalStore, p as ApprovalStatus } from "./types-BdtSDbBO.js";
1
+ import { In as ApprovalRequiredDecision, T as Policy, Un as GrantedDecision, Vn as DeniedDecision, j as PolicyVocabulary, lr as Subject, sr as Principal } from "./policy-types-B-F-qAZk.js";
2
+ import { t as Operation } from "./operations-BNLes61x.js";
3
+ import { a as PermDock, h as PrincipalSource, o as PermDockOptions } from "./permdock-Dco6dyCK.js";
4
+ import { m as ApprovalStore, p as ApprovalStatus } from "./types-DC44-hqb.js";
5
5
  import { n as ApprovalErrorCode } from "./errors-BWXBMaKK.js";
6
- import { t as ApprovalPrompt } from "./approval-prompt-DvSSPQJX.js";
6
+ import { t as ApprovalPrompt } from "./approval-prompt-K0faOLFp.js";
7
7
  //#region src/chat/subject.d.ts
8
8
  /**
9
9
  * The platform user behind a chat message or action. Fill it only from an
@@ -1,10 +1,10 @@
1
1
  import { t as compact } from "./compact-CAf557ZB.js";
2
2
  import { n as freezeDeep } from "./freeze-CrU8nQeX.js";
3
- import { a as deniedFor } from "./where-scope-C9vfEphl.js";
4
- import { c as withApp } from "./permdock-BrAscV28.js";
5
- import { t as composeWraps } from "./wrap-gX61EtpB.js";
6
- import { r as instanceOptions } from "./build-instance-Bu_eDqYw.js";
7
- import { n as createAgentKernel } from "./kernel-D0NVb1cK.js";
3
+ import { o as deniedFor } from "./where-scope-wq2coopv.js";
4
+ import { l as withApp } from "./permdock-BfWEeMqk.js";
5
+ import { t as composeWraps } from "./wrap-CiSc_KCq.js";
6
+ import { r as instanceOptions } from "./build-instance-DxE7czo9.js";
7
+ import { n as createAgentKernel } from "./kernel-DVExUwkp.js";
8
8
  //#region src/agent/create.ts
9
9
  function modelRow(modelId) {
10
10
  return { id: modelId };
@@ -34,8 +34,8 @@ function decideModelOn(permdock, models, modelId, adapter) {
34
34
  return deniedFor(permission, "closure-error");
35
35
  }
36
36
  }
37
- /** Builds the agent contract and its kernel for an adapter named `adapter`. */
38
- function agentRuntime(policy, options, adapter) {
37
+ /** Builds the agent contract and its kernel for an adapter named `adapter`; `runtime.stepUp` sets `stepUp` on denied verdicts. */
38
+ function agentRuntime(policy, options, adapter, runtime = {}) {
39
39
  const kernel = createAgentKernel(policy, {
40
40
  ...compact({
41
41
  actor: options.actor,
@@ -44,7 +44,8 @@ function agentRuntime(policy, options, adapter) {
44
44
  store: options.store,
45
45
  context: options.context,
46
46
  wrap: composeWraps(options.otel, options.wrap),
47
- deniedText: options.deniedText
47
+ deniedText: options.deniedText,
48
+ stepUp: runtime.stepUp
48
49
  }),
49
50
  ...instanceOptions(options),
50
51
  subject: options.subject,
@@ -1,15 +1,15 @@
1
1
  import { t as compact } from "./compact-CAf557ZB.js";
2
2
  import { n as freezeDeep } from "./freeze-CrU8nQeX.js";
3
3
  import { n as problemDetails } from "./problem-details-cn5X30gZ.js";
4
- import { c as listPermissions } from "./permission-registry-Br4jSNVi.js";
4
+ import { c as listPermissions } from "./permission-registry-DpPtSKNZ.js";
5
5
  import { n as resourceRef } from "./resource-ref-CaS9yVPi.js";
6
- import { c as withApp, i as challengeScope } from "./permdock-BrAscV28.js";
6
+ import { i as challengeScope, l as withApp } from "./permdock-BfWEeMqk.js";
7
7
  import { r as hasCredentials } from "./http-BBoKefeS.js";
8
8
  import { i as decisionResponse, o as notFoundProblem, s as problemFromDecision, t as ANONYMOUS, u as unauthenticatedProblem } from "./problem-CTviyH5L.js";
9
- import { n as resolveOrNull } from "./build-instance-Bu_eDqYw.js";
10
- import { n as applyApprovalResume, o as evaluationsHandler, u as InvalidSignatureError } from "./evaluations-beAooV0n.js";
9
+ import { n as resolveOrNull } from "./build-instance-DxE7czo9.js";
10
+ import { l as InvalidSignatureError, n as applyApprovalResume, o as evaluationsHandler } from "./evaluations-DReoiVBw.js";
11
11
  import { n as tenantScope, t as actorFrom } from "./adapter-context-CRhqyzCk.js";
12
- import { n as requestContext, t as buildReportingInstance } from "./request-context-C81Pip9n.js";
12
+ import { n as requestContext, t as buildReportingInstance } from "./request-context-BykKLmyE.js";
13
13
  //#region src/server/kernel-problems.ts
14
14
  const NOT_DELEGATED = freezeDeep({
15
15
  outcome: "denied",
@@ -1,10 +1,10 @@
1
- import { Nn as Decision, Pn as Denial, Rt as Instant, T as Policy, dt as TokenVerifier, j as PolicyVocabulary, qt as AuthEvent, rr as Principal, ut as TokenSigner } from "./policy-types-n0uRTsW8.js";
2
- import { w as Permission } from "./vocabulary-CN8H_9UF.js";
3
- import { i as PermDockOptions, p as PrincipalSource, r as PermDock, t as DecideOptions } from "./permdock-SV8ZINYT.js";
4
- import { m as ApprovalStore } from "./types-BdtSDbBO.js";
5
- import { a as AutomationSource } from "./automation-BNM3TtDo.js";
6
- import { n as ApprovalWaiter } from "./waiter-B986w1oK.js";
7
- import { n as RunAutomation, r as RunBinding } from "./run-ticket-DocwaTKn.js";
1
+ import { Ln as Decision, Rn as Denial, Rt as Instant, T as Policy, Zt as AuthEvent, dt as TokenVerifier, j as PolicyVocabulary, sr as Principal, ut as TokenSigner } from "./policy-types-B-F-qAZk.js";
2
+ import { u as Permission } from "./permission-types-DhNEmoRG.js";
3
+ import { a as PermDock, h as PrincipalSource, n as DecideOptions, o as PermDockOptions } from "./permdock-Dco6dyCK.js";
4
+ import { m as ApprovalStore } from "./types-DC44-hqb.js";
5
+ import { a as AutomationSource } from "./automation-DOtAFWdy.js";
6
+ import { n as ApprovalWaiter } from "./waiter-DwEyouan.js";
7
+ import { i as RunBinding, r as RunAutomation } from "./run-ticket-BpNi7BCi.js";
8
8
  //#region src/workflow/create.d.ts
9
9
  type WorkflowPermDockOptions = PermDockOptions & {
10
10
  /** Signs the run tickets `start` mints. */
@@ -1,13 +1,31 @@
1
- import { $n as Delegation, Nn as Decision, T as Policy, ar as Subject, j as PolicyVocabulary, rr as Principal } from "./policy-types-n0uRTsW8.js";
2
- import { w as Permission } from "./vocabulary-CN8H_9UF.js";
3
- import { t as Operation } from "./operations-X0VM7F3m.js";
4
- import { r as PermDock } from "./permdock-SV8ZINYT.js";
5
- import { m as ApprovalStore } from "./types-BdtSDbBO.js";
6
- import { t as InstanceOptions } from "./instance-options-BsVpyGIk.js";
1
+ import { Ln as Decision, T as Policy, j as PolicyVocabulary, lr as Subject, rr as Delegation, sr as Principal } from "./policy-types-B-F-qAZk.js";
2
+ import { u as Permission } from "./permission-types-DhNEmoRG.js";
3
+ import { t as Operation } from "./operations-BNLes61x.js";
4
+ import { a as PermDock } from "./permdock-Dco6dyCK.js";
5
+ import { m as ApprovalStore } from "./types-DC44-hqb.js";
6
+ import { t as InstanceOptions } from "./instance-options-CU0YQCLH.js";
7
7
  import { t as RequestContext } from "./request-context-C2_1lchh.js";
8
- import { n as PermDockWrap } from "./wrap-C5jC6sKI.js";
9
- import { o as OtelWrap } from "./types-lUlG3TVd.js";
10
- import { t as DeniedText } from "./denied-text-CiFQNuMV.js";
8
+ import { n as PermDockWrap } from "./wrap-B6R0cMRL.js";
9
+ import { o as OtelWrap } from "./types-CIeZcG8v.js";
10
+ import { t as DeniedText } from "./denied-text-D4qkEtFz.js";
11
+ //#region src/agent/step-up.d.ts
12
+ /**
13
+ * What the user can do to lift a denial: authenticate again with the `acr`
14
+ * and `maxAge` the failing grants ask for, or activate a role they are
15
+ * eligible for. A hint for the user; the call is decided again afterwards.
16
+ */
17
+ type StepUp = {
18
+ readonly kind: "authentication";
19
+ readonly acrValues?: readonly string[];
20
+ readonly maxAge?: number;
21
+ } | {
22
+ readonly kind: "activation";
23
+ readonly role: string;
24
+ readonly scope: string;
25
+ readonly id: string;
26
+ readonly within?: Readonly<Record<string, string>>;
27
+ };
28
+ //#endregion
11
29
  //#region src/agent/types.d.ts
12
30
  /** The part of an operation a tool decision reads; an `OperationMap` entry is one. */
13
31
  type ToolBinding = Pick<Operation, "permission" | "data" | "results"> & Partial<Pick<Operation, "name" | "meta">>;
@@ -64,6 +82,8 @@ type ToolVerdict = {
64
82
  }> | null;
65
83
  readonly permission: Permission | undefined;
66
84
  readonly reason: string;
85
+ /** What the user can do to lift the denial; set only by an adapter with step-ups on (`permdock/ai-sdk` `stepUp`). */
86
+ readonly stepUp?: StepUp;
67
87
  } | {
68
88
  readonly outcome: "approval-required";
69
89
  readonly decision: Extract<Decision, {
@@ -135,4 +155,4 @@ type AgentPermDock<TContext, V extends PolicyVocabulary = PolicyVocabulary> = {
135
155
  */
136
156
  declare function createPermDock<TContext, TUser, TPrincipal extends Principal = Principal, V extends PolicyVocabulary = PolicyVocabulary>(policy: Policy<TUser, TPrincipal, V>, given: AgentPermDockOptions<TContext, TUser>): AgentPermDock<TContext, V>;
137
157
  //#endregion
138
- export { createPermDock as a, ModelMap as c, OperationVerdict as i, ToolBinding as l, AgentPermDockOptions as n, AgentAdapterOptions as o, GatewayOptions as r, DecideToolOptions as s, AgentPermDock as t, ToolMap as u };
158
+ export { createPermDock as a, ModelMap as c, StepUp as d, OperationVerdict as i, ToolBinding as l, AgentPermDockOptions as n, AgentAdapterOptions as o, GatewayOptions as r, DecideToolOptions as s, AgentPermDock as t, ToolMap as u };