permdock 0.3.1 → 0.5.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 (552) hide show
  1. package/README.md +37 -35
  2. package/dist/{openapi-schema--ARjyfQr.js → 2020-C9VN-x8c.js} +5 -132
  3. package/dist/a2a/index.d.ts +8 -6
  4. package/dist/a2a/index.js +21 -31
  5. package/dist/{adapter-context-mlWsVGGg.js → adapter-context-CRhqyzCk.js} +1 -1
  6. package/dist/adoption-scan-B4R5fnMU.js +107 -0
  7. package/dist/agent/index.d.ts +3 -0
  8. package/dist/agent/index.js +1 -0
  9. package/dist/ai-sdk/index.d.ts +18 -23
  10. package/dist/ai-sdk/index.js +38 -21
  11. package/dist/app-data-MuyzVqX8.js +60 -0
  12. package/dist/approval-header-CJACtHkv.js +23 -0
  13. package/dist/approval-prompt-Dg5LeAcT.js +62 -0
  14. package/dist/approval-prompt-Djo_PyZc.d.ts +57 -0
  15. package/dist/approvals/index.d.ts +5 -3
  16. package/dist/approvals/index.js +8 -5
  17. package/dist/approvals-DJ6Yd5z1.js +995 -0
  18. package/dist/{approvers-DT4AVyIg.js → approvers-CqPOLD-o.js} +1 -1
  19. package/dist/arazzo-B6lebmiQ.js +36 -0
  20. package/dist/{arazzo-BAgw9ap6.js → arazzo-BWhNF-k0.js} +24 -17
  21. package/dist/args-IIolxxKA.js +197 -0
  22. package/dist/astro/index.d.ts +43 -0
  23. package/dist/astro/index.js +27 -0
  24. package/dist/audience-Dg8XsRaO.js +55 -0
  25. package/dist/auth-DRLEizbL.js +178 -0
  26. package/dist/authzen/index.d.ts +26 -6
  27. package/dist/authzen/index.js +228 -75
  28. package/dist/automation-BMZPIVUM.d.ts +114 -0
  29. package/dist/automation-DVjOckjV.js +157 -0
  30. package/dist/better-auth/index.d.ts +8 -6
  31. package/dist/better-auth/index.js +11 -23
  32. package/dist/better-supabase/index.d.ts +438 -86
  33. package/dist/better-supabase/index.js +1027 -184
  34. package/dist/bind--9EFVYWF.d.ts +38 -0
  35. package/dist/{bind-CuzGytRf.js → bind-CZzhx-Vj.js} +22 -10
  36. package/dist/body-CH5of8Ne.js +10 -0
  37. package/dist/body-text-QcXok_SI.js +52 -0
  38. package/dist/build-instance-BMnAudHn.js +52 -0
  39. package/dist/{canonical-json-DemiK4Vp.js → canonical-json-BC8_nMTw.js} +6 -6
  40. package/dist/{capability-2kYTMWDv.d.ts → capability-BSslw1QV.d.ts} +44 -25
  41. package/dist/{capability-4qPdO9gk.js → capability-N1K9IpqS.js} +69 -42
  42. package/dist/casbin-Cr7RLtA3.js +30 -0
  43. package/dist/casbin-Dyu2gnUD.js +234 -0
  44. package/dist/casl-64gpT-8x.js +24 -0
  45. package/dist/casl-DjEDhTCP.js +299 -0
  46. package/dist/catalog/index.d.ts +74 -2
  47. package/dist/catalog/index.js +51 -2
  48. package/dist/catalog-BECMPrwc.js +100 -0
  49. package/dist/catalog-DjhMYYCq.js +1 -0
  50. package/dist/catalog-R_A__RsH.js +52 -0
  51. package/dist/{catalog-doc-DdGm82XT.js → catalog-doc-C9wjsfNY.js} +54 -25
  52. package/dist/catalog-fingerprint-CCP0-yQS.js +153 -0
  53. package/dist/chat/index.d.ts +2 -0
  54. package/dist/chat/index.js +224 -0
  55. package/dist/chat-sdk/index.d.ts +87 -0
  56. package/dist/chat-sdk/index.js +197 -0
  57. package/dist/claims-map-7oQ3ue4X.js +13 -0
  58. package/dist/claims-map-Ca-QX8C6.d.ts +32 -0
  59. package/dist/claude-agent/index.d.ts +7 -14
  60. package/dist/claude-agent/index.js +26 -30
  61. package/dist/clerk/index.d.ts +9 -8
  62. package/dist/clerk/index.js +15 -45
  63. package/dist/cli/bin.js +36 -17
  64. package/dist/cli/index.d.ts +20 -6
  65. package/dist/cli/index.js +164 -4
  66. package/dist/cloud/index.d.ts +102 -63
  67. package/dist/cloud/index.js +240 -347
  68. package/dist/cloud-CIoHNevm.js +87 -0
  69. package/dist/codemod-Bmj9dWMH.js +37 -0
  70. package/dist/codemod-Cxvvc70T.js +2084 -0
  71. package/dist/{collect-DSTE3ml9.js → collect-CrZJJnEF.js} +79 -17
  72. package/dist/collect-DloHbDVa.js +55 -0
  73. package/dist/collect-FlXJlhus.js +1 -0
  74. package/dist/command-L8EstFNm.js +6 -0
  75. package/dist/{compact-y6vfu2_f.js → compact-CAf557ZB.js} +11 -1
  76. package/dist/compile/index.d.ts +1 -1
  77. package/dist/compile/index.js +1 -2
  78. package/dist/{compile-Ba4blROR.js → compile-CMqMx_IN.js} +13 -9
  79. package/dist/{compile-BkRyBDBw.d.ts → compile-Ckm2HqBZ.d.ts} +5 -3
  80. package/dist/completion-BqhRBJD8.js +143 -0
  81. package/dist/config-B46rm9sc.js +26 -0
  82. package/dist/{config-BJiM-xAm.js → config-bs_kZeYq.js} +15 -10
  83. package/dist/{config-report-CdCgbRnV.js → config-report-DUgj62Ai.js} +17 -8
  84. package/dist/{connection-CU8MQxRi.js → connection-DjhIJSs2.js} +8 -6
  85. package/dist/constants-DcJABbLW.js +20 -0
  86. package/dist/{context-Bcy85rGi.js → context-bbFHR-0D.js} +16 -5
  87. package/dist/convex/index.d.ts +11 -10
  88. package/dist/convex/index.js +18 -18
  89. package/dist/create-0VZ7Pdiu.d.ts +107 -0
  90. package/dist/create-BDS7wc3y.d.ts +138 -0
  91. package/dist/create-BFfm17UA.d.ts +110 -0
  92. package/dist/create-BWRSXgOF.js +403 -0
  93. package/dist/create-C3b4B5eF.js +130 -0
  94. package/dist/create-DnrmLnLW.js +323 -0
  95. package/dist/{credential-8P81ff4u.js → credential-DM2um3ha.js} +153 -32
  96. package/dist/credentials-DPyHmYz5.js +74 -0
  97. package/dist/deciding-columns-Sq12mEA6.js +123 -0
  98. package/dist/delegation-DaXVdDhM.js +286 -0
  99. package/dist/delegation-input-FTxMK3ji.js +19 -0
  100. package/dist/delivery/index.d.ts +5 -0
  101. package/dist/delivery/index.js +5 -0
  102. package/dist/delivery-DCAgNyCn.js +499 -0
  103. package/dist/delivery-event-xX4obB8F.js +40 -0
  104. package/dist/denied-text-D8jDHgsl.d.ts +19 -0
  105. package/dist/{describe-DMYiCjJV.d.ts → describe-BZUsixiL.d.ts} +11 -2
  106. package/dist/{describe-B_gVZEVi.js → describe-BybMRY7A.js} +10 -5
  107. package/dist/device-BARQ8eYG.js +193 -0
  108. package/dist/diff-CxZo9pTq.js +37 -0
  109. package/dist/{diff-2VaeChzX.js → diff-DCePiN6M.js} +61 -55
  110. package/dist/doctor-CxiwSfqH.js +44 -0
  111. package/dist/doctor-DFjUxf2f.js +2361 -0
  112. package/dist/drizzle/index.d.ts +5 -3
  113. package/dist/drizzle/index.js +6 -14
  114. package/dist/elysia/index.d.ts +16 -13
  115. package/dist/elysia/index.js +14 -13
  116. package/dist/env-DJZrPjRi.js +8 -0
  117. package/dist/errors-BDUwg2qC.js +27 -0
  118. package/dist/{errors-Cz5zn0mW.js → errors-BKy0EfhN.js} +6 -10
  119. package/dist/errors-BWXBMaKK.d.ts +11 -0
  120. package/dist/{errors-DPdqI50v.d.ts → errors-C2PXIv4c.d.ts} +2 -2
  121. package/dist/errors-CWTY6uih.js +143 -0
  122. package/dist/evaluate-_R8QkWaf.js +1732 -0
  123. package/dist/evaluations-16UqqQ6W.d.ts +32 -0
  124. package/dist/{evaluations-tz6D9A2G.js → evaluations-DZ2CbV5k.js} +181 -32
  125. package/dist/eve/index.d.ts +12 -16
  126. package/dist/eve/index.js +23 -29
  127. package/dist/event-time-CsegxXxB.js +23 -0
  128. package/dist/expiry-D4_YKRKD.js +52 -0
  129. package/dist/express/index.d.ts +13 -10
  130. package/dist/express/index.js +14 -12
  131. package/dist/fastify/index.d.ts +26 -13
  132. package/dist/fastify/index.js +17 -36
  133. package/dist/fetch-adapter-g0ypLkID.js +120 -0
  134. package/dist/fetch-adapter-qKJBuRqy.d.ts +31 -0
  135. package/dist/fields-D9tPVUUS.js +203 -0
  136. package/dist/files-C5ZI27eV.js +124 -0
  137. package/dist/{files-DWUN9PzI.js → files-D_JIzUrP.js} +12 -3
  138. package/dist/{fixtures-ht28Cplr.js → fixtures-B7XrLeY7.js} +12 -12
  139. package/dist/flags-C3DktBDY.js +86 -0
  140. package/dist/{from-snapshot-CTLijvdm.js → from-snapshot-D2lZt4Dd.js} +78 -65
  141. package/dist/{generate-CH7ThJ14.js → generate-CNU1pIOo.js} +1 -3
  142. package/dist/grantee-Cn1HyUsI.js +254 -0
  143. package/dist/grantee-conditions-CcXf8hMM.js +271 -0
  144. package/dist/grantee-match-DHArqY82.js +142 -0
  145. package/dist/h3/index.d.ts +37 -0
  146. package/dist/h3/index.js +35 -0
  147. package/dist/headers-BIjfMaoC.js +8 -0
  148. package/dist/headers-CIbDTUTK.d.ts +7 -0
  149. package/dist/{helpers-H_KARDVC.js → helpers-DTcZOzhF.js} +47 -39
  150. package/dist/hono/index.d.ts +12 -9
  151. package/dist/hono/index.js +14 -13
  152. package/dist/{hosted-DJQw46hn.js → hosted-BZIAYvon.js} +64 -15
  153. package/dist/hosted-DBDX0M-P.d.ts +78 -0
  154. package/dist/{http-SO7qGttf.js → http-BBoKefeS.js} +35 -2
  155. package/dist/{http-DPuDaChb.d.ts → http-B_LphE5Y.d.ts} +1 -2
  156. package/dist/http-DXJ37RDA.js +46 -0
  157. package/dist/{http-BIhmLfCc.js → http-ujKm0JXE.js} +3 -26
  158. package/dist/{openapi-import-cmwetbzw.js → import-CNV7I2Dw.js} +30 -26
  159. package/dist/{rls-import-4lLW_pbb.js → import-DMmOG27O.js} +271 -128
  160. package/dist/index-BcHcPyIo.d.ts +110 -0
  161. package/dist/index-CaxrMD1A.d.ts +1 -0
  162. package/dist/index-Chrs5fQ-.d.ts +210 -0
  163. package/dist/index-CxGUswIC.d.ts +431 -0
  164. package/dist/index-D8EovfsP.d.ts +91 -0
  165. package/dist/index-DOVf7RJv.d.ts +900 -0
  166. package/dist/{index-C8z4RjQV.d.ts → index-SGdIQyzc.d.ts} +34 -16
  167. package/dist/index.d.ts +20 -14
  168. package/dist/index.js +33 -23
  169. package/dist/init-DeMYsnYJ.js +96 -0
  170. package/dist/init-GG6Jh8HD.js +95 -0
  171. package/dist/{instance-options-jARdwfPN.d.ts → instance-options-Omfd793B.d.ts} +2 -2
  172. package/dist/instance-snapshot-Cxq4ygFc.js +600 -0
  173. package/dist/instant-BluqDvyS.js +19 -0
  174. package/dist/internals-Dk8A8fX3.js +17 -0
  175. package/dist/{json-schema-BsAflUGW.js → json-schema-B-vAwlde.js} +46 -9
  176. package/dist/json-schema-CN_iLFH2.d.ts +40 -0
  177. package/dist/jwt/index.d.ts +18 -11
  178. package/dist/jwt/index.js +166 -145
  179. package/dist/{kernel-_RRHmnMY.js → kernel-5JatXyND.js} +120 -43
  180. package/dist/kysely/index.d.ts +5 -3
  181. package/dist/kysely/index.js +6 -14
  182. package/dist/{live-options-H2eG8dfJ.js → live-options-BaAFCIiu.js} +16 -3
  183. package/dist/load-BxEtwlBS.js +1 -0
  184. package/dist/{load-DhWEB9P1.js → load-DFS_ry0W.js} +31 -7
  185. package/dist/{load-jose-BL6LH4bL.js → load-jose-DZ4dnjri.js} +1 -4
  186. package/dist/login-Dfe5RlYk.js +68 -0
  187. package/dist/login-imhuwvn3.js +254 -0
  188. package/dist/manifest-C8IzW3Do.js +42 -0
  189. package/dist/manifest-CtKR3GXL.js +370 -0
  190. package/dist/manifest-json-CAGzls-C.js +9 -0
  191. package/dist/{manifest-uDS9y5de.d.ts → manifest-mx5ghSFM.d.ts} +9 -2
  192. package/dist/manifest-schema-C0kK_8V0.js +399 -0
  193. package/dist/{map-claims-Z4QZOiFF.js → map-claims-D3oRmTk0.js} +19 -25
  194. package/dist/{map-error-pgUWNNtG.js → map-error-TCAdw-eW.js} +5 -5
  195. package/dist/{markers-B0hYLvMD.js → markers-C6joDI3o.js} +8 -3
  196. package/dist/mcp/index.d.ts +36 -9
  197. package/dist/mcp/index.js +476 -448
  198. package/dist/{rls-migrate-CN4TlJTO.js → migrate-BShP7Vf4.js} +119 -20
  199. package/dist/nest/index.d.ts +12 -9
  200. package/dist/nest/index.js +20 -20
  201. package/dist/next/index.d.ts +40 -20
  202. package/dist/next/index.js +37 -39
  203. package/dist/next/plugin.d.ts +1 -1
  204. package/dist/next/plugin.js +2 -2
  205. package/dist/node/index.d.ts +10 -10
  206. package/dist/node/index.js +7 -9
  207. package/dist/ocsf-BFp-PZZA.js +126 -0
  208. package/dist/openai/index.d.ts +9 -16
  209. package/dist/openai/index.js +18 -25
  210. package/dist/openapi/index.d.ts +3 -3
  211. package/dist/openapi/index.js +1 -1
  212. package/dist/{openapi-BqRBvAng.js → openapi-B7HZ0f-r.js} +9 -12
  213. package/dist/{openapi-CqqEbHsL.js → openapi-DTaEmTSW.js} +23 -26
  214. package/dist/openapi-ahr8rHu3.js +138 -0
  215. package/dist/operation-findings-DgATDpvh.js +36 -0
  216. package/dist/operations-CxybZErY.d.ts +59 -0
  217. package/dist/orpc/index.d.ts +13 -10
  218. package/dist/orpc/index.js +23 -20
  219. package/dist/otel/index.d.ts +3 -2
  220. package/dist/otel/index.js +53 -27
  221. package/dist/output-Dyw8fyPF.js +88 -0
  222. package/dist/output-files-B3IZJksC.js +1 -0
  223. package/dist/output-files-DhRBBE4n.js +138 -0
  224. package/dist/{rls-fields-CZOMlwHl.js → ownership-BatFgAA4.js} +2393 -2349
  225. package/dist/{package-root-zGkxO3oN.js → package-root-Dk_ETdkp.js} +4 -3
  226. package/dist/{parse-BuyjxhZV.js → parse-Cxq0WxrA.js} +3 -3
  227. package/dist/{parse-local-manifest-BrMozJCo.js → parse-local-manifest-CVSs6J9I.js} +2 -4
  228. package/dist/{parse-local-manifest-JLnaBH0S.d.ts → parse-local-manifest-DgqtruPn.d.ts} +1 -1
  229. package/dist/parse-request-D_tUXG6M.js +26 -0
  230. package/dist/paths-DXSHAMIa.js +42 -0
  231. package/dist/pdp/index.d.ts +7 -3
  232. package/dist/pdp/index.js +47 -29
  233. package/dist/{peer-BOr_kJE1.js → peer-C8swJ2GH.js} +23 -4
  234. package/dist/peer-CRvC7Hg1.js +1 -0
  235. package/dist/permdock-B9JxkBwC.js +868 -0
  236. package/dist/permdock-D7eeLJER.d.ts +502 -0
  237. package/dist/permission-registry-Br4jSNVi.js +385 -0
  238. package/dist/permissions-B-wCP5ZC.js +30 -0
  239. package/dist/{permissions-RJrovw98.js → permissions-CZKiUfFM.js} +4 -3
  240. package/dist/{permissions-CDgvKG5L.d.ts → permissions-oEWfl-kl.d.ts} +1 -2
  241. package/dist/policies-CO1oOymN.js +295 -0
  242. package/dist/{policy-D2W7uv19.d.ts → policy-Czo4n3Hs.d.ts} +2 -2
  243. package/dist/policy-DLZJ5gAp.js +399 -0
  244. package/dist/policy-from-catalog-DzhEc3Y9.js +450 -0
  245. package/dist/policy-module-CTlwMvLI.js +89 -0
  246. package/dist/{policy-IB6yxpC3.d.ts → policy-types-DzwivBgR.d.ts} +939 -1057
  247. package/dist/postgrest-CW0IqC-U.js +566 -0
  248. package/dist/postgrest-NUqZT-RB.d.ts +100 -0
  249. package/dist/powersync-BHfuehf3.js +62 -0
  250. package/dist/powersync-CbzkqL_M.js +1 -0
  251. package/dist/{powersync-Dv1_aWF7.js → powersync-bYUDLOAO.js} +30 -32
  252. package/dist/preset/index.d.ts +146 -0
  253. package/dist/preset/index.js +1 -0
  254. package/dist/preset-DZdU0tne.js +1768 -0
  255. package/dist/principal-source-pHneukrx.js +103 -0
  256. package/dist/prisma/index.d.ts +6 -3
  257. package/dist/prisma/index.js +6 -12
  258. package/dist/{problem-B43ztKIm.js → problem-CTviyH5L.js} +18 -27
  259. package/dist/{problem-details-DX075l9V.d.ts → problem-details-DXlt-vks.d.ts} +1 -1
  260. package/dist/{problem-details-_AMOYz-w.js → problem-details-cn5X30gZ.js} +45 -42
  261. package/dist/problem-types-CJ2325SZ.js +5 -0
  262. package/dist/{prompt-CXYhLfsS.js → prompt-DfZLJLIn.js} +2 -2
  263. package/dist/protected-DEPHc2xV.d.ts +38 -0
  264. package/dist/{protected-utU-SLuy.js → protected-DfjY5mLA.js} +37 -8
  265. package/dist/{provider-CSQd7m92.js → provider-CC-u3bYP.js} +23 -10
  266. package/dist/{provider-DZY281jO.d.ts → provider-DMVt6yYn.d.ts} +1 -1
  267. package/dist/{provider-store-Cfbvo4DE.js → provider-store-B5Yrkhzr.js} +6 -3
  268. package/dist/pull-BgIfno6w.js +256 -0
  269. package/dist/pull-ByOks_Tg.js +1 -0
  270. package/dist/push-CmFVBOeI.js +116 -0
  271. package/dist/pushed-policy-BImMTTIM.d.ts +57 -0
  272. package/dist/pushed-policy-DobP7AHI.js +238 -0
  273. package/dist/react/index.d.ts +8 -8
  274. package/dist/react/index.js +6 -6
  275. package/dist/react/provider-client.d.ts +1 -1
  276. package/dist/react/provider-client.js +1 -2
  277. package/dist/react-native/index.d.ts +24 -63
  278. package/dist/react-native/index.js +45 -27
  279. package/dist/{refs-KYb4ntaz.js → refs-K6eWUJ0H.js} +1 -1
  280. package/dist/relation-walk-3OyDBF0S.js +186 -0
  281. package/dist/relations-BnCWnJGI.js +163 -0
  282. package/dist/renames-CGj7YwcQ.js +175 -0
  283. package/dist/{replay-CYyiLiwO.d.ts → replay-D7iKcLFe.d.ts} +1 -1
  284. package/dist/{replay-BsOyTrdV.js → replay-Du1tJjG7.js} +2 -1
  285. package/dist/request-context-BTRTG7OT.js +71 -0
  286. package/dist/request-context-C2_1lchh.d.ts +5 -0
  287. package/dist/request-schema-CMreVuFM.js +148 -0
  288. package/dist/resend/index.d.ts +126 -0
  289. package/dist/resend/index.js +379 -0
  290. package/dist/resource-relations-D_jw0BFx.js +243 -0
  291. package/dist/retire-CALjIQ7e.js +240 -0
  292. package/dist/{revocations-Cy06JNx2.d.ts → revocations-R07lFBnX.d.ts} +2 -0
  293. package/dist/rls-BA8an5Ap.js +336 -0
  294. package/dist/{rls-DiinlRML.js → rls-j6t43t7n.js} +1066 -1068
  295. package/dist/role-builder-CXbis5-X.js +623 -0
  296. package/dist/{rpc-DL9Sqvb1.js → rpc-aPyNi6tA.js} +18 -8
  297. package/dist/run-CNsApDpd.js +1 -0
  298. package/dist/run-DOfMtc9V.js +723 -0
  299. package/dist/run-ticket-BjhTOi6u.d.ts +124 -0
  300. package/dist/run-ticket-sxFI6LAk.js +337 -0
  301. package/dist/{runtime-CB8gQFvS.js → runtime-D3VTAiCA.js} +1 -1
  302. package/dist/{saas-DhpJjnBA.js → saas-FO-Q8oj0.js} +18 -15
  303. package/dist/scan-BOI5tJ-6.js +29 -0
  304. package/dist/{schema-D3MnDMxa.js → schema-B4v0Qrac.js} +106 -10
  305. package/dist/schema-yLuBWWsh.js +130 -0
  306. package/dist/scim/index.d.ts +2 -2
  307. package/dist/scim/index.js +1 -2
  308. package/dist/{scim-BFGBBAqR.js → scim-ClHtpyV3.js} +213 -87
  309. package/dist/{scopes-CVdPrWN-.js → scopes-CUPSjo9q.js} +20 -7
  310. package/dist/server/index.d.ts +13 -134
  311. package/dist/server/index.js +13 -10
  312. package/dist/server-DqCT4CgZ.js +453 -0
  313. package/dist/{create-B1d519XK.d.ts → server-types-BLd4MnBX.d.ts} +89 -70
  314. package/dist/{sha256-BO0swRXL.js → sha256-D9ihqmvd.js} +8 -1
  315. package/dist/shared-CD11nBbC.js +304 -0
  316. package/dist/{shared-DRu8VFVM.js → shared-DvvFzYXe.js} +8 -9
  317. package/dist/signals-D3NcTKUS.js +32 -0
  318. package/dist/sink-BEZSlMS_.js +957 -0
  319. package/dist/sink-Bj_lDUDq.d.ts +225 -0
  320. package/dist/{skills-Biq5uup3.js → skills-B6lVdD_W.js} +16 -8
  321. package/dist/skills-CTYwkl44.js +51 -0
  322. package/dist/snapshot-CXUWfsNy.js +269 -0
  323. package/dist/{snapshot-cache-D6jLelln.js → snapshot-cache-DZHQ0KF6.js} +11 -5
  324. package/dist/{snapshot-cache-B-LxUahj.d.ts → snapshot-cache-DqK9eDmM.d.ts} +7 -5
  325. package/dist/solid/index.d.ts +24 -25
  326. package/dist/solid/index.js +41 -11
  327. package/dist/solid-start/index.d.ts +52 -0
  328. package/dist/solid-start/index.js +49 -0
  329. package/dist/{sources-BdOYLw9j.d.ts → sources-BV9j0DeZ.d.ts} +11 -13
  330. package/dist/{sources-4p0-4xQm.js → sources-vs5dGOsS.js} +147 -142
  331. package/dist/sql-B5T1IL83.js +55 -0
  332. package/dist/src-DLfUWFAI.js +1851 -0
  333. package/dist/ssf/index.d.ts +4 -4
  334. package/dist/ssf/index.js +440 -106
  335. package/dist/standard-webhooks-6lg8v_is.d.ts +88 -0
  336. package/dist/standard-webhooks-DgFFD-Ga.js +228 -0
  337. package/dist/storage-C2bWdvJH.js +132 -0
  338. package/dist/{store-DMAWwAJV.js → store-4u_hxjWa.js} +42 -55
  339. package/dist/{store-options-ByhZq1jV.js → store-options-BqEakYRa.js} +38 -24
  340. package/dist/{stores-BT2pSCub.js → stores-BbsD4fAR.js} +7 -3
  341. package/dist/stores-ClZUgeoP.d.ts +30 -0
  342. package/dist/{stream-D1RXubw2.d.ts → stream-7-xmnf3U.d.ts} +2 -2
  343. package/dist/{stream-DDpvynSB.js → stream-CvdUS9V1.js} +10 -2
  344. package/dist/style-DiKWnAvn.js +1 -0
  345. package/dist/{style-CTm1AXDT.js → style-Uao76wO7.js} +3 -2
  346. package/dist/subject-BGoM5o8B.js +17 -0
  347. package/dist/{subject-settings-BwBmCdTR.js → subject-settings-CkEwrw3W.js} +23 -5
  348. package/dist/supabase/index.d.ts +23 -106
  349. package/dist/supabase/index.js +5 -4
  350. package/dist/supabase/middleware.d.ts +13 -6
  351. package/dist/supabase/middleware.js +16 -11
  352. package/dist/supabase-9pqI57pW.js +92 -0
  353. package/dist/{supabase-C0qESOa-.js → supabase-Dxlp8A94.js} +124 -247
  354. package/dist/supabase-hook-CXcGpHqq.js +1 -0
  355. package/dist/{supabase-hook-ntETYCQu.js → supabase-hook-DdDQhMlw.js} +1659 -819
  356. package/dist/{supautils-u8jXTGrt.js → supautils-B6HYL9eL.js} +2 -2
  357. package/dist/support-session-C6xJQYut.js +158 -0
  358. package/dist/svelte/Protected.svelte +11 -4
  359. package/dist/svelte/index.d.ts +7 -7
  360. package/dist/svelte/index.js +26 -12
  361. package/dist/svelte/runtime.d.ts +10 -3
  362. package/dist/svelte/runtime.js +4 -3
  363. package/dist/svelte/source.d.ts +7 -7
  364. package/dist/svelte/source.js +5 -5
  365. package/dist/sveltekit/index.d.ts +51 -0
  366. package/dist/sveltekit/index.js +27 -0
  367. package/dist/tanstack-start/index.d.ts +51 -0
  368. package/dist/tanstack-start/index.js +40 -0
  369. package/dist/target-Bw37TFNA.js +51 -0
  370. package/dist/{validity-uOp8UpYn.js → tenancy-DN2QAx9z.js} +6 -42
  371. package/dist/terminal/index.d.ts +11 -9
  372. package/dist/terminal/index.js +36 -316
  373. package/dist/testing/index.d.ts +391 -106
  374. package/dist/testing/index.js +4574 -1286
  375. package/dist/testing/saas/index.d.ts +9 -8
  376. package/dist/testing/saas/index.js +2 -2
  377. package/dist/testing/saas/permissions.d.ts +1 -1
  378. package/dist/testing/saas/permissions.js +1 -2
  379. package/dist/text-BMFRfBqc.js +8 -0
  380. package/dist/{text-diff-BdkkYSbi.js → text-diff-BQcUapOb.js} +1 -1
  381. package/dist/thenable-yD7SabqG.js +31 -0
  382. package/dist/time-DkWjdL98.js +71 -0
  383. package/dist/{token-CIWxJOCh.js → token-BLZcjQgt.js} +15 -6
  384. package/dist/tool-refusal-CMLN5xhn.js +41 -0
  385. package/dist/trpc/index.d.ts +12 -9
  386. package/dist/trpc/index.js +18 -17
  387. package/dist/{types-DbjRN55U.d.ts → types-5Ut_pbKy.d.ts} +141 -13
  388. package/dist/types-BNORmDM8.d.ts +172 -0
  389. package/dist/types-BjV-fqcA.d.ts +57 -0
  390. package/dist/{types-QCuYJh4q.d.ts → types-BqAKcRNW.d.ts} +2 -1
  391. package/dist/types-C8-KNsFf.d.ts +107 -0
  392. package/dist/{types-aqOHTHcp.d.ts → types-CCpc2Dcv.d.ts} +77 -17
  393. package/dist/{types-Dnemwd77.d.ts → types-CZTnPFzM.d.ts} +50 -11
  394. package/dist/{types-C97IskBw.d.ts → types-CdlxsYQh.d.ts} +23 -11
  395. package/dist/{types-DxiCGmmd.d.ts → types-ClZaWzfb.d.ts} +9 -6
  396. package/dist/types-DX0LaKTb.d.ts +157 -0
  397. package/dist/types-DiQjupG2.d.ts +332 -0
  398. package/dist/types-DqzsnlSA.js +67 -0
  399. package/dist/types-_sHy8BQf.d.ts +65 -0
  400. package/dist/types-fbZ7JEXr.d.ts +89 -0
  401. package/dist/types-tIgIeIKJ.d.ts +66 -0
  402. package/dist/unplugin/index.d.ts +1 -1
  403. package/dist/unplugin/index.js +2 -2
  404. package/dist/usage-CHOtwL19.js +1 -0
  405. package/dist/usage-DHtE8j4E.js +32 -0
  406. package/dist/{usage-ItS7nLcl.js → usage-T5mXq98v.js} +56 -13
  407. package/dist/{validation-error-Ba264OaJ.d.ts → validation-error-Bg5Tpluk.d.ts} +1 -1
  408. package/dist/{validation-error-CnjZ4t92.js → validation-error-ZfUHbKvf.js} +1 -1
  409. package/dist/validity-CZ7-y0Cj.js +79 -0
  410. package/dist/{verifier-BxBo6I44.js → verifier-DHuh-okk.js} +68 -21
  411. package/dist/verify-DbCL9bnB.js +1770 -0
  412. package/dist/{version-BvacVTZR.js → version-CEbQ5UeM.js} +4 -3
  413. package/dist/version-DXkYUISx.js +1 -0
  414. package/dist/{views-Soe7bGSC.js → views-DTIIO-oQ.js} +41 -2
  415. package/dist/{permissions-DttnqqxC.d.ts → vocabulary-D6lPdb4Z.d.ts} +120 -29
  416. package/dist/vue/index.d.ts +25 -21
  417. package/dist/vue/index.js +25 -9
  418. package/dist/waiter-BGUtGYoU.js +67 -0
  419. package/dist/waiter-CKy4MQSY.d.ts +36 -0
  420. package/dist/watch-Cb-NcaUw.js +1 -0
  421. package/dist/{watch-DVBJ9cBq.js → watch-CszoTJMq.js} +47 -8
  422. package/dist/webmcp/index.d.ts +2 -2
  423. package/dist/webmcp/index.js +13 -37
  424. package/dist/where-scope-Dv-WTP-w.js +306 -0
  425. package/dist/who-can-D0QoYbEb.js +364 -0
  426. package/dist/wire-delegation-Cv3W2eaM.js +36 -0
  427. package/dist/wire-denial-C7PaVYEM.js +27 -0
  428. package/dist/workflow/index.d.ts +5 -0
  429. package/dist/workflow/index.js +223 -0
  430. package/dist/workflow-sdk/index.d.ts +56 -0
  431. package/dist/workflow-sdk/index.js +78 -0
  432. package/dist/wrap-Bd1Tejur.d.ts +15 -0
  433. package/dist/wrap-gX61EtpB.js +27 -0
  434. package/package.json +140 -41
  435. package/schemas/access-event-v1.json +118 -0
  436. package/schemas/approval-request-v1.json +34 -1
  437. package/schemas/approval-signature-v1.json +94 -0
  438. package/schemas/automation-event-v1.json +113 -0
  439. package/schemas/capability-v1.json +84 -0
  440. package/schemas/catalog-event-v1.json +87 -0
  441. package/schemas/catalog-v1.json +129 -12
  442. package/schemas/cli-commands-v1.json +164 -0
  443. package/schemas/cli-result-v1.json +96 -0
  444. package/schemas/cloud-api-v1.json +5407 -0
  445. package/schemas/connector-v1.json +408 -0
  446. package/schemas/credential-event-v1.json +81 -0
  447. package/schemas/credential-v1.json +134 -0
  448. package/schemas/decision-event-v1.json +288 -0
  449. package/schemas/delivery-event-v1.json +117 -0
  450. package/schemas/directory-event-v1.json +85 -0
  451. package/schemas/evidence-export-v1.json +54 -0
  452. package/schemas/membership-event-v1.json +93 -0
  453. package/schemas/policy-v1.json +68 -0
  454. package/schemas/pushed-policy-v1.json +236 -0
  455. package/schemas/run-v1.json +162 -0
  456. package/schemas/snapshot-v1.json +138 -0
  457. package/schemas/supabase-claims-v1.json +4 -4
  458. package/schemas/supabase-manifest-v1.json +5 -1
  459. package/schemas/support-session-v1.json +111 -0
  460. package/skills/permdock/SKILL.md +16 -12
  461. package/skills/permdock-agents/SKILL.md +40 -23
  462. package/skills/permdock-agents/references/operations-automations-chat.md +221 -0
  463. package/skills/permdock-agents/references/runtimes.md +22 -18
  464. package/skills/permdock-approvals/SKILL.md +29 -13
  465. package/skills/permdock-approvals/references/delivery-and-waiters.md +172 -0
  466. package/skills/permdock-approvals/references/stores-and-resume.md +21 -7
  467. package/skills/permdock-audit/SKILL.md +3 -3
  468. package/skills/permdock-credentials/SKILL.md +5 -5
  469. package/skills/permdock-credentials/references/tokens-keys-links.md +19 -10
  470. package/skills/permdock-data/SKILL.md +6 -6
  471. package/skills/permdock-data/references/queries-and-rls.md +13 -8
  472. package/skills/permdock-data/references/relationships.md +3 -3
  473. package/skills/permdock-tenancy/SKILL.md +20 -7
  474. package/skills/permdock-tenancy/references/contacts-and-support-sessions.md +122 -0
  475. package/skills/permdock-tenancy/references/ownership-and-custom-roles.md +6 -4
  476. package/skills/permdock-wire/SKILL.md +18 -12
  477. package/skills/permdock-wire/references/adapters.md +146 -50
  478. package/skills/permdock-wire/references/policy-options.md +15 -6
  479. package/skills/permdock-wire/references/presets-and-recipes.md +58 -0
  480. package/dist/approvals-DbYAuNkG.js +0 -224
  481. package/dist/arazzo-C9chp3ST.js +0 -54
  482. package/dist/bind-C_ob3LKa.d.ts +0 -25
  483. package/dist/catalog-CRW5Mx_B.js +0 -2
  484. package/dist/catalog-CYj-mX2O.js +0 -48
  485. package/dist/catalog-DWF5cYqB.js +0 -55
  486. package/dist/cloud-CfwZ39Rl.js +0 -50
  487. package/dist/cloud-DWLXO2af.js +0 -118
  488. package/dist/collect-CHB22Sx4.js +0 -83
  489. package/dist/collect-DSWOk19R.js +0 -2
  490. package/dist/commands-BeaGNj_o.js +0 -97
  491. package/dist/config-ir40y8m0.js +0 -36
  492. package/dist/create-CMwIl-w2.js +0 -253
  493. package/dist/delegation-D8pUEuce.js +0 -103
  494. package/dist/diff-C9RDjjhs.js +0 -48
  495. package/dist/doctor-Djh6JDEk.js +0 -53
  496. package/dist/doctor-DvH0IQff.js +0 -1194
  497. package/dist/doctor-collect-CjdO0wQX.js +0 -665
  498. package/dist/duration-xK2jGFVc.js +0 -25
  499. package/dist/errors-CWfoNg9N.js +0 -47
  500. package/dist/errors-DRnGZHzF.js +0 -30
  501. package/dist/evaluation-items-CfCCejQd.js +0 -40
  502. package/dist/expiry-BoBJ8Tvc.js +0 -7
  503. package/dist/fields-BMl1RxoX.js +0 -26
  504. package/dist/grantee-Cv5Sogfv.js +0 -602
  505. package/dist/headers-BZSDieNT.js +0 -6
  506. package/dist/headers-Cf-zWvsO.d.ts +0 -6
  507. package/dist/ids-DC4V4CFu.js +0 -18
  508. package/dist/index-0nNqHspG.d.ts +0 -6
  509. package/dist/index-BNc7Wer_.d.ts +0 -483
  510. package/dist/index-C7Tw7MaW.d.ts +0 -201
  511. package/dist/instance-options-Dhhcnm3y.js +0 -22
  512. package/dist/load-DwJUafYN.js +0 -2
  513. package/dist/manifest-iaoBXHKc.js +0 -783
  514. package/dist/map-AcxK9o_D.js +0 -147
  515. package/dist/may-use-DndQ5tQ-.js +0 -77
  516. package/dist/openapi-CQTsgKoB.js +0 -164
  517. package/dist/permdock-CbgvLnuo.js +0 -3479
  518. package/dist/permissions-DVoF6dMt.js +0 -662
  519. package/dist/policy-xyWg7QdR.js +0 -1122
  520. package/dist/powersync-CrBX8hY6.js +0 -2
  521. package/dist/powersync-DE19b9dT.js +0 -62
  522. package/dist/protected-BdnIEFkY.d.ts +0 -27
  523. package/dist/protected-xAr24FEC.d.ts +0 -40
  524. package/dist/relations-cjOL01hZ.js +0 -505
  525. package/dist/rls-P-BeBx0n.js +0 -238
  526. package/dist/rls-graph-CHwx0V8q.js +0 -435
  527. package/dist/rls-ownership-DcYlZ09B.js +0 -843
  528. package/dist/rls-shared-Cewd_-zI.js +0 -495
  529. package/dist/rls-verify-CMv9H3wV.js +0 -746
  530. package/dist/run-BWc9qqvE.js +0 -174
  531. package/dist/server-DlZ28Oz5.js +0 -268
  532. package/dist/sink-B1fZzIMf.d.ts +0 -104
  533. package/dist/sink-Bd9PSyfq.js +0 -141
  534. package/dist/skills-C5CbhhpG.js +0 -56
  535. package/dist/snapshot-Enxd0n-s.js +0 -975
  536. package/dist/sql-xdg5f4Fi.js +0 -27
  537. package/dist/src-BDwEZWrZ.js +0 -568
  538. package/dist/store-jOBYpiXC.d.ts +0 -36
  539. package/dist/stores-C0IMQrGI.d.ts +0 -52
  540. package/dist/subject-C6dLxqHU.js +0 -24
  541. package/dist/supabase-config-Bj3iDH2I.js +0 -472
  542. package/dist/supabase-hook-gd3s8bxB.js +0 -2
  543. package/dist/supabase-s4o9s1O1.js +0 -83
  544. package/dist/thenable-okc2xDsj.js +0 -10
  545. package/dist/types-BnIEz1sU.d.ts +0 -48
  546. package/dist/types-Bvc4oWT6.d.ts +0 -9
  547. package/dist/types-CKNSyIf_.d.ts +0 -52
  548. package/dist/types-Cq_H8N_X.d.ts +0 -197
  549. package/dist/usage-B0YuTQRO.js +0 -42
  550. package/dist/usage-DorAJiU_.js +0 -2
  551. package/dist/vocabulary-DA8a8zif.d.ts +0 -56
  552. package/dist/watch-BwxLTYMZ.js +0 -2
@@ -0,0 +1,92 @@
1
+ import { t as defineLeaf } from "./command-L8EstFNm.js";
2
+ import { c as given, n as dbUrl, o as fileOut, r as dbUrlFlags, t as checkFlag } from "./flags-C3DktBDY.js";
3
+ //#region src/cli/commands/supabase.ts
4
+ const hookGenerate = defineLeaf({
5
+ flags: {
6
+ out: {
7
+ type: "string",
8
+ description: "File to write",
9
+ valueHint: "file"
10
+ },
11
+ ...checkFlag,
12
+ ...dbUrlFlags,
13
+ "active-from": {
14
+ type: "string",
15
+ description: "Where the hook reads the active tenant",
16
+ valueHint: "source"
17
+ },
18
+ budget: {
19
+ type: "string",
20
+ description: "Byte budget for the memberships claim",
21
+ valueHint: "bytes"
22
+ },
23
+ schema: {
24
+ type: "string",
25
+ description: "Schema for the hook function",
26
+ valueHint: "name"
27
+ },
28
+ schemas: {
29
+ type: "enum",
30
+ options: [
31
+ "pg-delta",
32
+ "migra",
33
+ "migrations"
34
+ ],
35
+ description: "Schema workflow (default supabase.schemas, else pg-delta)"
36
+ },
37
+ "grants-out": {
38
+ type: "string",
39
+ description: "migra: file for the privileges supabase db diff drops",
40
+ valueHint: "file"
41
+ }
42
+ },
43
+ async run(ctx, { flags }) {
44
+ const out = fileOut("supabase hook generate", flags.out);
45
+ const db = await dbUrl(ctx, flags);
46
+ const activeFrom = given(flags["active-from"]);
47
+ const budget = given(flags.budget);
48
+ const schema = given(flags.schema);
49
+ const grantsOut = given(flags["grants-out"]);
50
+ const { runSupabase } = await import("./supabase-hook-CXcGpHqq.js");
51
+ return runSupabase({
52
+ cwd: ctx.cwd,
53
+ config: ctx.config,
54
+ rest: ["hook", "generate"],
55
+ check: flags.check,
56
+ json: ctx.json,
57
+ io: ctx.io,
58
+ ...out === void 0 ? {} : { out },
59
+ ...db === void 0 ? {} : { db },
60
+ ...activeFrom === void 0 ? {} : { activeFrom },
61
+ ...budget === void 0 ? {} : { budget },
62
+ ...schema === void 0 ? {} : { schema },
63
+ ...grantsOut === void 0 ? {} : { grantsOut },
64
+ ...flags.schemas === void 0 ? {} : { schemas: flags.schemas }
65
+ });
66
+ }
67
+ });
68
+ const inspect = defineLeaf({
69
+ flags: {
70
+ out: {
71
+ type: "string",
72
+ description: "File to write; a bare --out writes permdock.manifest.json",
73
+ valueHint: "file"
74
+ },
75
+ ...checkFlag
76
+ },
77
+ async run(ctx, { flags }) {
78
+ const out = flags.out === "" ? true : flags.out === "-" ? void 0 : flags.out;
79
+ const { runSupabase } = await import("./supabase-hook-CXcGpHqq.js");
80
+ return runSupabase({
81
+ cwd: ctx.cwd,
82
+ config: ctx.config,
83
+ rest: ["inspect"],
84
+ check: flags.check,
85
+ json: ctx.json,
86
+ io: ctx.io,
87
+ ...out === void 0 ? {} : { out }
88
+ });
89
+ }
90
+ });
91
+ //#endregion
92
+ export { hookGenerate, inspect };
@@ -1,13 +1,14 @@
1
- import { t as compact } from "./compact-y6vfu2_f.js";
2
- import { t as canonicalJson } from "./canonical-json-DemiK4Vp.js";
3
- import { o as parseCapability } from "./capability-4qPdO9gk.js";
4
- import { t as ApprovalError } from "./errors-DRnGZHzF.js";
5
- import { a as decodeApprovalCursor, i as approvalPageSize, o as encodeApprovalCursor, t as applyApprovalVerdict } from "./store-DMAWwAJV.js";
6
- import { t as loadJose } from "./load-jose-BL6LH4bL.js";
1
+ import { r as isRecord, t as compact } from "./compact-CAf557ZB.js";
2
+ import { d as isoNow, i as dateAt, p as nowSeconds, u as isoAt } from "./time-DkWjdL98.js";
3
+ import { t as canonicalJson } from "./canonical-json-BC8_nMTw.js";
4
+ import { s as ApprovalError } from "./types-DqzsnlSA.js";
5
+ import { a as approvalPageSize, o as decodeApprovalCursor, s as encodeApprovalCursor, t as applyApprovalVerdict } from "./store-4u_hxjWa.js";
6
+ import { a as parseCapability } from "./capability-N1K9IpqS.js";
7
+ import { t as loadJose } from "./load-jose-DZ4dnjri.js";
7
8
  import "./budget-NbEtbJC_.js";
8
- import { a as quoteSqlTable, i as quoteSqlLiteral, r as quoteSqlIdent } from "./sql-xdg5f4Fi.js";
9
- import { c as hookApiNames, d as keptKeys, l as roleColumn } from "./sources-4p0-4xQm.js";
10
- import { i as readMemberships } from "./manifest-iaoBXHKc.js";
9
+ import { a as quoteQualifiedTable, c as quoteSqlTable, i as qualifySqlTable, o as quoteSqlIdent, s as quoteSqlLiteral, u as sqlTextArray } from "./sql-B5T1IL83.js";
10
+ import { d as keptKeys, l as roleColumn } from "./sources-vs5dGOsS.js";
11
+ import { t as callRpc } from "./postgrest-CW0IqC-U.js";
11
12
  //#region src/supabase/capability.ts
12
13
  const DEFAULT_TTL = 300;
13
14
  const MAX_TTL = 3600;
@@ -29,15 +30,19 @@ async function exchangeCapability(subject, options) {
29
30
  if (principal === null || principal.kind !== "link") return;
30
31
  const capability = parseCapability(principal["capability"]);
31
32
  if (capability?.holder !== "link" || capability.id !== principal.id) return;
32
- const now = Math.floor(options.now ?? Date.now() / 1e3);
33
+ const now = nowSeconds(options.now);
33
34
  const ttl = Math.min(Math.max(1, options.ttl ?? DEFAULT_TTL), MAX_TTL);
34
35
  const exp = Math.min(now + ttl, Math.floor(capability.expiresAt));
35
36
  if (exp <= now) return;
37
+ const { id: _id, expiresAt: _expiresAt, cnf: _cnf, ...claim } = capability;
36
38
  const jose = await loadJose();
37
39
  const key = isSecret(options.key) ? new TextEncoder().encode(options.key.secret) : await jose.importJWK(options.key, alg);
38
40
  const jwt = new jose.SignJWT({
39
41
  role: "anon",
40
- capability
42
+ capability: {
43
+ ...claim,
44
+ expires_at: exp
45
+ }
41
46
  }).setProtectedHeader(secret ? {
42
47
  alg: "HS256",
43
48
  typ: "JWT"
@@ -63,9 +68,6 @@ const KNOWN = /* @__PURE__ */ new Set([
63
68
  "act",
64
69
  "app_metadata"
65
70
  ]);
66
- function isRecord$2(value) {
67
- return value !== null && typeof value === "object" && !Array.isArray(value);
68
- }
69
71
  function own(record, key) {
70
72
  return Object.hasOwn(record, key) ? record[key] : void 0;
71
73
  }
@@ -84,7 +86,7 @@ function optional(record, key, path, issues, check, expected) {
84
86
  }
85
87
  const isString = (value) => typeof value === "string";
86
88
  function checkMembership(item, path, issues) {
87
- if (!isRecord$2(item)) {
89
+ if (!isRecord(item)) {
88
90
  issue(issues, path, "Expected a membership object");
89
91
  return;
90
92
  }
@@ -96,17 +98,17 @@ function checkMembership(item, path, issues) {
96
98
  "tenant",
97
99
  "team",
98
100
  "via",
99
- "grantedBy",
101
+ "granted_by",
100
102
  "reason"
101
103
  ]) optional(item, key, path, issues, isString, "a string");
102
- optional(item, "within", path, issues, (value) => isRecord$2(value) && Object.values(value).every((id) => typeof id === "string"), "an object of string ids");
103
- optional(item, "on", path, issues, (value) => isRecord$2(value) && typeof own(value, "resource") === "string" && typeof own(value, "id") === "string", "an object with string resource and id");
104
- optional(item, "expiresAt", path, issues, (value) => typeof value === "number" && Number.isFinite(value), "a number of seconds since the epoch");
105
- optional(item, "member", path, issues, (value) => isRecord$2(value) && typeof own(value, "group") === "string" && own(value, "group") !== "", "an object with a non-empty string group");
106
- optional(item, "managedBy", path, issues, (value) => value === "idp", "'idp'");
104
+ optional(item, "within", path, issues, (value) => isRecord(value) && Object.values(value).every((id) => typeof id === "string"), "an object of string ids");
105
+ optional(item, "on", path, issues, (value) => isRecord(value) && typeof own(value, "resource") === "string" && typeof own(value, "id") === "string", "an object with string resource and id");
106
+ optional(item, "expires_at", path, issues, (value) => typeof value === "number" && Number.isFinite(value), "a number of seconds since the epoch");
107
+ optional(item, "member", path, issues, (value) => isRecord(value) && typeof own(value, "group") === "string" && own(value, "group") !== "", "an object with a non-empty string group");
108
+ optional(item, "managed_by", path, issues, (value) => value === "idp", "'idp'");
107
109
  optional(item, "entitlements", path, issues, isStrings, "an array of strings");
108
110
  optional(item, "keep", path, issues, isStrings, "an array of strings");
109
- optional(item, "grants", path, issues, isRecord$2, "an object");
111
+ optional(item, "grants", path, issues, isRecord, "an object");
110
112
  if (!(own(item, "scope") !== void 0 && own(item, "id") !== void 0 || own(item, "tenant") !== void 0 || own(item, "team") !== void 0 || own(item, "on") !== void 0)) issue(issues, path, "Expected scope and id, tenant, team or on");
111
113
  }
112
114
  function checkPermDockClaims(record, tenantClaim, path, issues) {
@@ -123,17 +125,23 @@ function checkPermDockClaims(record, tenantClaim, path, issues) {
123
125
  }
124
126
  optional(record, "memberships_truncated", path, issues, (value) => typeof value === "boolean", "a boolean");
125
127
  optional(record, tenantClaim, path, issues, isString, "a string");
126
- optional(record, "attrs", path, issues, isRecord$2, "an object");
128
+ optional(record, "attrs", path, issues, isRecord, "an object");
127
129
  optional(record, "authz_ver", path, issues, (value) => Number.isInteger(value), "an integer");
128
130
  }
129
- /** The outer level's `kind`: none, `support` with a `session_id`, or `impersonation`. */
131
+ /** The outer level's `kind`: none, `support` with a `session_id`, `impersonation`, or `agent` with optional `tools` and `read_only` and no `session_id`. */
130
132
  function checkActKind(level, path, issues) {
131
133
  const marked = own(level, "kind");
132
134
  const kind = marked === void 0 && own(level, "session_id") !== void 0 ? "support" : marked;
133
135
  optional(level, "reason", path, issues, isString, "a string");
134
136
  if (kind === void 0 || kind === "impersonation") return;
137
+ if (kind === "agent") {
138
+ if (own(level, "session_id") !== void 0) issue(issues, [...path, "session_id"], "Expected no session_id on an agent level");
139
+ optional(level, "tools", path, issues, (value) => isStrings(value) && value.every((tool) => tool !== ""), "an array of non-empty strings");
140
+ optional(level, "read_only", path, issues, (value) => typeof value === "boolean", "a boolean");
141
+ return;
142
+ }
135
143
  if (kind !== "support") {
136
- issue(issues, [...path, "kind"], "Expected 'support' or 'impersonation'");
144
+ issue(issues, [...path, "kind"], "Expected 'support', 'impersonation' or 'agent'");
137
145
  return;
138
146
  }
139
147
  const session = own(level, "session_id");
@@ -144,7 +152,7 @@ function checkAct(value, issues) {
144
152
  let current = value;
145
153
  const path = ["act"];
146
154
  while (current !== void 0) {
147
- if (!isRecord$2(current)) {
155
+ if (!isRecord(current)) {
148
156
  issue(issues, path, "Expected an object");
149
157
  return;
150
158
  }
@@ -157,7 +165,7 @@ function checkAct(value, issues) {
157
165
  }
158
166
  function checkClaims(value, tenantClaim) {
159
167
  const issues = [];
160
- if (!isRecord$2(value)) {
168
+ if (!isRecord(value)) {
161
169
  issue(issues, [], "Expected a claims object");
162
170
  return issues;
163
171
  }
@@ -168,7 +176,7 @@ function checkClaims(value, tenantClaim) {
168
176
  if (act !== void 0) checkAct(act, issues);
169
177
  const meta = own(value, "app_metadata");
170
178
  if (meta !== void 0) {
171
- if (isRecord$2(meta)) checkPermDockClaims(meta, tenantClaim, ["app_metadata"], issues);
179
+ if (isRecord(meta)) checkPermDockClaims(meta, tenantClaim, ["app_metadata"], issues);
172
180
  else issue(issues, ["app_metadata"], "Expected an object");
173
181
  }
174
182
  return issues;
@@ -178,8 +186,8 @@ function merge(base, app) {
178
186
  if (issues.length > 0) return { issues };
179
187
  const baseValue = base.value;
180
188
  const appValue = app.value;
181
- if (!isRecord$2(appValue)) return { issues: [{ message: "Expected the extension to output an object" }] };
182
- return { value: isRecord$2(baseValue) ? {
189
+ if (!isRecord(appValue)) return { issues: [{ message: "Expected the extension to output an object" }] };
190
+ return { value: isRecord(baseValue) ? {
183
191
  ...baseValue,
184
192
  ...appValue
185
193
  } : appValue };
@@ -192,9 +200,9 @@ function schemaOf(validate) {
192
200
  validate
193
201
  }),
194
202
  extend(app) {
195
- if (!isRecord$2(app) && typeof app !== "function") throw new TypeError("PermDock: supabaseClaims().extend needs a Standard Schema");
203
+ if (!isRecord(app) && typeof app !== "function") throw new TypeError("PermDock: supabaseClaims().extend needs a Standard Schema");
196
204
  const props = Reflect.get(app, "~standard");
197
- if (!isRecord$2(props) || typeof props["validate"] !== "function") throw new TypeError("PermDock: supabaseClaims().extend needs a Standard Schema");
205
+ if (!isRecord(props) || typeof props["validate"] !== "function") throw new TypeError("PermDock: supabaseClaims().extend needs a Standard Schema");
198
206
  const run = app["~standard"].validate.bind(app["~standard"]);
199
207
  return schemaOf((value) => {
200
208
  const base = validate(value);
@@ -225,194 +233,7 @@ function supabaseClaims(options = {}) {
225
233
  });
226
234
  }
227
235
  //#endregion
228
- //#region src/supabase/postgrest.ts
229
- function callRpc(client, schema, fn, args) {
230
- return client.schema(schema).rpc(fn, args);
231
- }
232
- function isRecord$1(value) {
233
- return value !== null && typeof value === "object" && !Array.isArray(value);
234
- }
235
- function strings(value) {
236
- return Array.isArray(value) ? value.filter((item) => typeof item === "string") : [];
237
- }
238
- function grantOf(value) {
239
- if (!isRecord$1(value) || typeof value["permission"] !== "string") return;
240
- return compact({
241
- permission: value["permission"],
242
- effect: value["effect"] === "deny" ? "deny" : "allow",
243
- level: typeof value["level"] === "string" ? value["level"] : void 0
244
- });
245
- }
246
- function customRoleOf(value) {
247
- if (!isRecord$1(value) || typeof value["name"] !== "string") return;
248
- const grants = Array.isArray(value["grants"]) ? value["grants"].flatMap((item) => {
249
- const grant = grantOf(item);
250
- return grant === void 0 ? [] : [grant];
251
- }) : [];
252
- const includes = strings(value["includes"]);
253
- const body = {
254
- name: value["name"],
255
- grants,
256
- ...includes.length === 0 ? {} : { includes }
257
- };
258
- if (value["scope"] === "global") return value["tenant"] === void 0 ? {
259
- ...body,
260
- scope: "global"
261
- } : void 0;
262
- if (typeof value["tenant"] !== "string") return;
263
- return compact({
264
- ...body,
265
- tenant: value["tenant"],
266
- scope: typeof value["scope"] === "string" ? value["scope"] : void 0,
267
- id: typeof value["id"] === "string" ? value["id"] : void 0
268
- });
269
- }
270
- function readMemberEntries(value) {
271
- if (!Array.isArray(value)) return [];
272
- return value.flatMap((item) => {
273
- if (!isRecord$1(item) || !isRecord$1(item["principal"])) return [];
274
- const id = item["principal"]["id"];
275
- const [membership] = readMemberships([item["membership"]]).memberships;
276
- return typeof id === "string" && id !== "" && membership !== void 0 ? [{
277
- principal: { id },
278
- membership
279
- }] : [];
280
- });
281
- }
282
- function versionOf(value) {
283
- const version = typeof value === "string" ? Number(value) : value;
284
- return typeof version === "number" && Number.isFinite(version) ? version : void 0;
285
- }
286
- /** Reads `subject_for`'s JSON; anything it cannot read is left out, and a malformed record is no record. */
287
- function readSubjectRecord(value) {
288
- if (!isRecord$1(value) || typeof value["id"] !== "string") return;
289
- if (value["active"] !== true) return {
290
- id: value["id"],
291
- active: false,
292
- roles: [],
293
- memberships: [],
294
- customRoles: []
295
- };
296
- const version = value["authzVersion"];
297
- return compact({
298
- id: value["id"],
299
- active: true,
300
- roles: strings(value["roles"]),
301
- memberships: readMemberships(value["memberships"]).memberships,
302
- customRoles: Array.isArray(value["customRoles"]) ? value["customRoles"].flatMap((item) => {
303
- const role = customRoleOf(item);
304
- return role === void 0 ? [] : [role];
305
- }) : [],
306
- authzVersion: typeof version === "number" && Number.isFinite(version) ? version : void 0
307
- });
308
- }
309
- /**
310
- * Membership, custom-role and subject sources over the `subject_for(p_user)`,
311
- * `authz_version_for(p_user)` and `members_of(p_scope, p_id)` functions
312
- * `permdock supabase hook generate` writes, for a backend that reaches
313
- * Postgres only through PostgREST. `memberships.version` reads only the
314
- * version, so `claimsFirst` with `onStale: 'reread'` reads the full subject
315
- * only for a stale token; when the version function is missing it falls back
316
- * to `subject_for`. With `policy`, a token that claims a custom role has its
317
- * subject read in one `subject_for` call instead, and custom roles are read
318
- * only for a subject that holds one. Each user and each instance is read once per
319
- * `postgrestSources` call, so create it per request or per job.
320
- */
321
- function postgrestSources(client, options = {}) {
322
- const api = options.api;
323
- const names = api === void 0 ? void 0 : hookApiNames(api.prefix);
324
- const schema = options.schema ?? (api === void 0 ? "permdock" : api.schema ?? "public");
325
- const fn = options.fn ?? names?.subjectFor ?? "subject_for";
326
- const membersFn = options.membersFn ?? names?.membersOf ?? "members_of";
327
- const versionFn = options.versionFn ?? names?.authzVersionFor ?? "authz_version_for";
328
- const declared = options.policy === void 0 ? void 0 : options.policy.index.declaredRoles;
329
- const onlyDeclared = (held) => declared !== void 0 && held?.every((name) => declared.has(name)) === true;
330
- const loaded = /* @__PURE__ */ new Map();
331
- const versions = /* @__PURE__ */ new Map();
332
- const listed = /* @__PURE__ */ new Map();
333
- const list = (query) => {
334
- const key = JSON.stringify([query.scope, query.id]);
335
- const cached = listed.get(key);
336
- if (cached !== void 0) return cached.then((entries) => [...entries]);
337
- const pending = Promise.resolve(callRpc(client, schema, membersFn, {
338
- p_scope: query.scope,
339
- p_id: query.id
340
- })).then((result) => {
341
- if (result.error !== null) throw new Error(`PermDock: ${schema}.${membersFn} failed: ${result.error.message}`);
342
- return readMemberEntries(result.data);
343
- });
344
- listed.set(key, pending);
345
- return pending.then((entries) => [...entries]);
346
- };
347
- const record = (userId) => {
348
- const cached = loaded.get(userId);
349
- if (cached !== void 0) return cached;
350
- const pending = Promise.resolve(callRpc(client, schema, fn, { p_user: userId })).then((result) => {
351
- if (result.error !== null) throw new Error(`PermDock: ${schema}.${fn} failed: ${result.error.message}`);
352
- return readSubjectRecord(result.data);
353
- });
354
- loaded.set(userId, pending);
355
- return pending;
356
- };
357
- const version = (userId) => {
358
- const read = loaded.get(userId);
359
- if (read !== void 0) return read.then((found) => found?.authzVersion);
360
- const cached = versions.get(userId);
361
- if (cached !== void 0) return cached;
362
- const pending = Promise.resolve(callRpc(client, schema, versionFn, { p_user: userId })).then((result) => result.error === null ? versionOf(result.data) : record(userId).then((found) => found?.authzVersion));
363
- versions.set(userId, pending);
364
- return pending;
365
- };
366
- const live = async (userId) => {
367
- const found = await record(userId);
368
- return found?.active === true ? found : void 0;
369
- };
370
- return {
371
- memberships: {
372
- async membershipsFor(principal) {
373
- return [...(await live(principal.id))?.memberships ?? []];
374
- },
375
- version(principal) {
376
- return declared !== void 0 && !onlyDeclared([...principal.roles ?? [], ...(principal.memberships ?? []).flatMap((membership) => membership.roles)]) ? record(principal.id).then((found) => found?.authzVersion) : version(principal.id);
377
- },
378
- list
379
- },
380
- customRoles(principal) {
381
- return {
382
- async rolesFor(tenant, context) {
383
- if (onlyDeclared(context?.held)) return [];
384
- return ((await live(principal.id))?.customRoles ?? []).filter((role) => role.tenant === tenant);
385
- },
386
- async globalRoles(context) {
387
- if (onlyDeclared(context?.held)) return [];
388
- return ((await live(principal.id))?.customRoles ?? []).filter((role) => role.scope === "global");
389
- }
390
- };
391
- },
392
- async subject(userId) {
393
- const found = await live(userId);
394
- if (found === void 0) return {
395
- principal: null,
396
- context: {}
397
- };
398
- return {
399
- principal: compact({
400
- id: found.id,
401
- roles: found.roles,
402
- memberships: found.memberships,
403
- authzVersion: found.authzVersion
404
- }),
405
- context: {}
406
- };
407
- },
408
- record
409
- };
410
- }
411
- //#endregion
412
236
  //#region src/supabase/approval-store.ts
413
- function isRecord(value) {
414
- return value !== null && typeof value === "object" && !Array.isArray(value);
415
- }
416
237
  /** A stored body as the request it is; the store wrote it from an `ApprovalRequest`. */
417
238
  function requestOf(value) {
418
239
  if (!isRecord(value) || value["v"] !== 1 || typeof value["token"] !== "string") return null;
@@ -465,10 +286,10 @@ function supabaseApprovalStore(client, options = {}) {
465
286
  if (written === null) throw new ApprovalError("approval-not-pending", "approval is not pending");
466
287
  return written;
467
288
  },
468
- async consume(token, now = /* @__PURE__ */ new Date()) {
289
+ async consume(token, now) {
469
290
  return requestOf(await call("permdock_approval_consume", {
470
291
  p_token: token,
471
- p_now: now.toISOString()
292
+ p_now: dateAt(now).toISOString()
472
293
  }));
473
294
  },
474
295
  async list(query) {
@@ -492,8 +313,8 @@ function supabaseApprovalStore(client, options = {}) {
492
313
  next: encodeApprovalCursor(last)
493
314
  } : { items };
494
315
  },
495
- async expire(now = /* @__PURE__ */ new Date()) {
496
- const count = await call("permdock_approval_expire", { p_now: now.toISOString() });
316
+ async expire(now) {
317
+ const count = await call("permdock_approval_expire", { p_now: dateAt(now).toISOString() });
497
318
  return typeof count === "number" ? count : 0;
498
319
  },
499
320
  async cancel(filter, meta) {
@@ -501,13 +322,76 @@ function supabaseApprovalStore(client, options = {}) {
501
322
  p_filter: filterOf(filter),
502
323
  p_by: meta.by,
503
324
  p_note: meta.note ?? null,
504
- p_now: (/* @__PURE__ */ new Date()).toISOString()
325
+ p_now: isoNow()
505
326
  });
506
327
  return typeof count === "number" ? count : 0;
507
328
  }
508
329
  };
509
330
  }
510
331
  //#endregion
332
+ //#region src/supabase/approval-delegations.ts
333
+ function rowsOf(result) {
334
+ return Array.isArray(result) ? result : result.rows;
335
+ }
336
+ function instant(value) {
337
+ if (value instanceof Date) return Number.isNaN(value.getTime()) ? void 0 : value.toISOString();
338
+ if (typeof value !== "string") return;
339
+ const ms = Date.parse(value);
340
+ return Number.isNaN(ms) ? void 0 : isoAt(ms);
341
+ }
342
+ function list(value) {
343
+ if (value === null || value === void 0) return;
344
+ if (!Array.isArray(value)) return false;
345
+ const items = [];
346
+ for (const item of value) {
347
+ if (typeof item !== "string") return false;
348
+ items.push(item);
349
+ }
350
+ return items;
351
+ }
352
+ function delegationOf(row) {
353
+ const { id, delegator, delegate, tenant } = row;
354
+ const from = instant(row["from"]);
355
+ const until = instant(row["until"]);
356
+ const permissions = list(row["permissions"]);
357
+ const resources = list(row["resources"]);
358
+ if (typeof id !== "string" || typeof delegator !== "string" || typeof delegate !== "string" || tenant !== null && typeof tenant !== "string" || from === void 0 || until === void 0 || permissions === false || resources === false) return;
359
+ return {
360
+ id,
361
+ delegator,
362
+ delegate,
363
+ ...typeof tenant === "string" ? { tenant } : {},
364
+ ...permissions === void 0 ? {} : { permissions },
365
+ ...resources === void 0 ? {} : { resources },
366
+ from,
367
+ until
368
+ };
369
+ }
370
+ /**
371
+ * Approval delegations (out-of-office covers) from the table
372
+ * `rls.approvals.delegations` generates, so `approvalsHandler` and
373
+ * `permdock_is_approver` read the same rows. A cover without a tenant
374
+ * applies everywhere; a malformed row is skipped.
375
+ */
376
+ function tableApprovalDelegationSource(options) {
377
+ const table = quoteQualifiedTable(options.table ?? "permdock.approval_delegations");
378
+ return {
379
+ name: "table",
380
+ async delegationsFor(query) {
381
+ const values = [query.delegate, query.at];
382
+ let tenant = "d.tenant is null";
383
+ if (query.tenant !== void 0) {
384
+ values.push(query.tenant);
385
+ tenant = "(d.tenant is null or d.tenant = $3)";
386
+ }
387
+ return rowsOf(await options.query(`select d.id::text as id, d.delegator::text as delegator, d.delegate::text as delegate, d.tenant::text as tenant, d.permissions, d.resources, d."from", d."until" from ${table} d where d.delegate::text = $1 and d."from" <= $2::timestamptz and $2::timestamptz < d."until" and ${tenant} order by d.id`, values)).flatMap((row) => {
388
+ const entry = delegationOf(row);
389
+ return entry === void 0 ? [] : [entry];
390
+ });
391
+ }
392
+ };
393
+ }
394
+ //#endregion
511
395
  //#region src/supabase/rls.ts
512
396
  function isTable(value) {
513
397
  return value !== null && typeof value === "object" && "table" in value && typeof value.table === "string";
@@ -527,30 +411,23 @@ function supabaseRls(options = {}) {
527
411
  });
528
412
  }
529
413
  const ident = (name) => quoteSqlIdent(name);
530
- const table = (name) => quoteSqlTable(name);
531
414
  const literal = quoteSqlLiteral;
532
- function qualifiedTable(name) {
533
- return table(name.includes(".") ? name : `public.${name}`);
534
- }
535
415
  /** The memberships table's role key over alias `m`, joined to its roles table when it holds a reference. */
536
416
  function tenantRole(memberships) {
537
- return roleColumn(memberships.role, memberships.table.includes(".") ? memberships.table : `public.${memberships.table}`, "m", {
417
+ return roleColumn(memberships.role, qualifySqlTable(memberships.table), "m", {
538
418
  label: "authorizeSql tenant.role",
539
419
  indent: " "
540
420
  });
541
421
  }
542
- function textArray(values) {
543
- return values.length === 0 ? `'{}'::text[]` : `array[${values.map(literal).join(", ")}]::text[]`;
544
- }
545
422
  function activeRow(row, id, text = false) {
546
423
  const parts = [`s.${ident(row.id)}${text ? "::text" : ""} = ${id}`];
547
424
  if (row.disabledAt !== void 0) parts.push(`s.${ident(row.disabledAt)} is null`);
548
425
  if (row.status !== void 0) {
549
426
  if (row.active === void 0 || row.active.length === 0) throw new TypeError("PermDock: a suspension status column needs its active values");
550
- parts.push(`s.${ident(row.status)}::text = any(${textArray(row.active)})`);
427
+ parts.push(`s.${ident(row.status)}::text = any(${sqlTextArray(row.active)})`);
551
428
  }
552
429
  if (row.disabledAt === void 0 && row.status === void 0) throw new TypeError("PermDock: a suspension table needs disabledAt or status");
553
- return `exists (select 1 from ${qualifiedTable(row.table)} s where ${parts.join(" and ")})`;
430
+ return `exists (select 1 from ${quoteQualifiedTable(row.table)} s where ${parts.join(" and ")})`;
554
431
  }
555
432
  /**
556
433
  * Early `return false` for a suspended user, or a tenant request for a
@@ -565,7 +442,7 @@ function suspendedGuards(suspension, scope, uid) {
565
442
  const tenant = suspension?.scopes?.[scope];
566
443
  if (tenant !== void 0) {
567
444
  const keep = keptKeys(tenant);
568
- const kept = keep.length === 0 ? "" : ` and not (requested_permission::text = any(${textArray(keep)}))`;
445
+ const kept = keep.length === 0 ? "" : ` and not (requested_permission::text = any(${sqlTextArray(keep)}))`;
569
446
  lines.push(` if requested_tenant is not null and not ${activeRow(tenant, "requested_tenant", true)}${kept} then
570
447
  return false; -- suspended ${scope}
571
448
  end if;`);
@@ -594,7 +471,7 @@ function disabledLine(memberships, suspension) {
594
471
  if (memberships.disabledAt === void 0) return "";
595
472
  const column = `m.${ident(memberships.disabledAt)}`;
596
473
  const keep = keptKeys(suspension?.memberships);
597
- return keep.length === 0 ? `\n and ${column} is null` : `\n and (${column} is null or requested_permission::text = any(${textArray(keep)}))`;
474
+ return keep.length === 0 ? `\n and ${column} is null` : `\n and (${column} is null or requested_permission::text = any(${sqlTextArray(keep)}))`;
598
475
  }
599
476
  function claimKept(suspension) {
600
477
  return keptKeys(suspension?.memberships).length === 0 ? "" : `\n and case coalesce(jsonb_typeof(m -> 'keep'), 'null') when 'null' then true when 'array' then m -> 'keep' @> jsonb_build_array(requested_permission::text) else false end`;
@@ -605,10 +482,10 @@ function customDatabaseBranch(q, scope, memberships, declared, levels, suspensio
605
482
  const rows = (source, value, extra) => `array(select c.${value} from ${q(source)} c where ${match}${extra})`;
606
483
  return ` or exists (
607
484
  select 1
608
- from ${qualifiedTable(memberships.table)} m${role.join}
485
+ from ${quoteQualifiedTable(memberships.table)} m${role.join}
609
486
  where m.${ident(memberships.user)} = v_member_user
610
487
  and m.${ident(memberships.tenant)} = v_member_tenant
611
- and not (${role.sql} = any(${textArray(declared)}))${memberships.expiresAt === void 0 ? "" : `\n and (m.${ident(memberships.expiresAt)} is null or m.${ident(memberships.expiresAt)} > now())`}${disabledLine(memberships, suspension)}
488
+ and not (${role.sql} = any(${sqlTextArray(declared)}))${memberships.expiresAt === void 0 ? "" : `\n and (m.${ident(memberships.expiresAt)} is null or m.${ident(memberships.expiresAt)} > now())`}${disabledLine(memberships, suspension)}
612
489
  and ${customHolds(q, scope, rows("custom_role_permissions", levels ? "permission || coalesce('@' || c.level, '')" : "permission", " and c.effect = 'allow'"), rows("custom_role_permissions", "permission", " and c.effect = 'deny'"), rows("custom_role_includes", "include_role", ""))}
613
490
  )`;
614
491
  }
@@ -638,7 +515,7 @@ function databaseBody(q, scope, memberships, custom, suspension) {
638
515
  const role = tenantRole(memberships);
639
516
  const held = (effect) => `exists (
640
517
  select 1
641
- from ${qualifiedTable(memberships.table)} m${role.join}
518
+ from ${quoteQualifiedTable(memberships.table)} m${role.join}
642
519
  join ${q("role_permissions")} rp on rp.role = ${role.sql}
643
520
  where m.${ident(memberships.user)} = v_member_user
644
521
  and m.${ident(tenantColumn)} = v_member_tenant
@@ -661,8 +538,8 @@ function databaseBody(q, scope, memberships, custom, suspension) {
661
538
  }
662
539
  return `declare
663
540
  uid uuid := (select auth.uid());${memberships !== void 0 && tenantColumn !== void 0 ? `
664
- v_member_user ${qualifiedTable(memberships.table)}.${ident(memberships.user)}%type;
665
- v_member_tenant ${qualifiedTable(memberships.table)}.${ident(tenantColumn)}%type;` : ""}
541
+ v_member_user ${quoteQualifiedTable(memberships.table)}.${ident(memberships.user)}%type;
542
+ v_member_tenant ${quoteQualifiedTable(memberships.table)}.${ident(tenantColumn)}%type;` : ""}
666
543
  begin
667
544
  if uid is null then
668
545
  return false;
@@ -672,9 +549,9 @@ ${tenantBranch}
672
549
  and not ${global("deny")};
673
550
  end;`;
674
551
  }
675
- /** A claim membership whose `expiresAt` (epoch seconds) has passed no longer holds its roles. */
676
- const CLAIM_UNEXPIRED = `case jsonb_typeof(m -> 'expiresAt')
677
- when 'number' then (m ->> 'expiresAt')::numeric > extract(epoch from now())
552
+ /** A claim membership whose `expires_at` (epoch seconds) has passed no longer holds its roles. */
553
+ const CLAIM_UNEXPIRED = `case jsonb_typeof(m -> 'expires_at')
554
+ when 'number' then (m ->> 'expires_at')::numeric > extract(epoch from now())
678
555
  else true
679
556
  end`;
680
557
  function jwtBody(q, scope, custom, suspension) {
@@ -695,7 +572,7 @@ function jwtBody(q, scope, custom, suspension) {
695
572
  and m ->> 'id' = requested_tenant
696
573
  and ${CLAIM_UNEXPIRED}${claimKept(suspension)}
697
574
  and jsonb_typeof(cg.g) = 'array'
698
- and not (r.role = any(${textArray(custom.declared)}))
575
+ and not (r.role = any(${sqlTextArray(custom.declared)}))
699
576
  and ${customHolds(q, scope, claimEntries("left(e, 1) not in ('-', '@')", "e"), claimEntries("left(e, 1) = '-'", "substr(e, 2)"), claimEntries("left(e, 1) = '@'", "substr(e, 2)"))}
700
577
  )`;
701
578
  const held = (effect) => `exists (
@@ -750,7 +627,7 @@ end;`;
750
627
  */
751
628
  function authorizeSql(options = {}) {
752
629
  const schema = options.schema ?? "permdock";
753
- const q = (name) => table(`${schema}.${name}`);
630
+ const q = (name) => quoteSqlTable(`${schema}.${name}`);
754
631
  const memberships = typeof options.tenant === "object" ? options.tenant : void 0;
755
632
  const scope = options.scope ?? "tenant";
756
633
  if (!/^[a-z][a-z0-9_]*$/u.test(scope)) throw new TypeError(`PermDock: unsafe scope name '${scope}'`);
@@ -773,4 +650,4 @@ grant execute on function ${signature} to authenticated;
773
650
  `;
774
651
  }
775
652
  //#endregion
776
- export { readSubjectRecord as a, postgrestSources as i, supabaseRls as n, supabaseClaims as o, supabaseApprovalStore as r, exchangeCapability as s, authorizeSql as t };
653
+ export { supabaseClaims as a, supabaseApprovalStore as i, supabaseRls as n, exchangeCapability as o, tableApprovalDelegationSource as r, authorizeSql as t };
@@ -0,0 +1 @@
1
+ export { i as runSupabase } from "./supabase-hook-DdDQhMlw.js";