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
@@ -1,10 +1,14 @@
1
- import { C as Policy, Cr as Actor, D as PolicyVocabulary, Nr as Principal, Pr as Subject, Tt as Snapshot, Yn as Decision, jr as JsonWebKeyLike, ln as PermDock, pn as SnapshotOptions } from "./policy-IB6yxpC3.js";
2
- import { f as Permission } from "./permissions-DttnqqxC.js";
3
- import { f as ApprovalStore } from "./types-aqOHTHcp.js";
4
- import { t as ApprovalHint } from "./errors-DPdqI50v.js";
5
- import { t as InstanceOptions } from "./instance-options-jARdwfPN.js";
6
- import { r as PdpFactory } from "./types-DxiCGmmd.js";
7
- import { n as RevocationFeed } from "./revocations-Cy06JNx2.js";
1
+ import { Nn as Decision, Rt as Instant, Vt as Snapshot, ir as Subject, j as PolicyVocabulary, qn as Actor, tr as JsonWebKeyLike } from "./policy-types-DzwivBgR.js";
2
+ import { w as Permission } from "./vocabulary-D6lPdb4Z.js";
3
+ import { r as PermDock, s as SnapshotOptions } from "./permdock-D7eeLJER.js";
4
+ import { m as ApprovalStore } from "./types-CCpc2Dcv.js";
5
+ import { a as ProblemDetails, t as ApprovalHint } from "./errors-C2PXIv4c.js";
6
+ import { t as InstanceOptions } from "./instance-options-Omfd793B.js";
7
+ import { t as RequestContext } from "./request-context-C2_1lchh.js";
8
+ import { n as PermDockWrap } from "./wrap-Bd1Tejur.js";
9
+ import { n as RevocationFeed } from "./revocations-R07lFBnX.js";
10
+ import { r as PdpFactory } from "./types-ClZaWzfb.js";
11
+ import { i as evaluationsHandler } from "./evaluations-16UqqQ6W.js";
8
12
  //#region src/server/connection.d.ts
9
13
  type ConnectionData<T> = T | (() => T | null | undefined | Promise<T | null | undefined>);
10
14
  type ConnectionOptions<T = unknown> = {
@@ -12,7 +16,7 @@ type ConnectionOptions<T = unknown> = {
12
16
  readonly permission?: Permission;
13
17
  /** The row for `permission`, or a loader re-run on every revalidation. */
14
18
  readonly data?: ConnectionData<T>;
15
- /** Milliseconds between periodic revalidations; off by default. */
19
+ /** Seconds between periodic revalidations; off by default. */
16
20
  readonly revalidate?: number;
17
21
  };
18
22
  type Connection = {
@@ -28,6 +32,11 @@ type Connection = {
28
32
  readonly trusted?: boolean;
29
33
  }) => Decision;
30
34
  readonly filter: <T>(permission: Permission<string, T, "instance">, items: readonly T[]) => T[];
35
+ /**
36
+ * Resolves once every revalidation queued so far has finished, so a message
37
+ * checked after a revocation event is checked against the rebuilt instance.
38
+ */
39
+ readonly settled: () => Promise<void>;
31
40
  /** Stops timers and the feed subscription. Call it when the transport closes. */
32
41
  readonly close: () => void;
33
42
  };
@@ -62,14 +71,18 @@ type WebBotAuthOptions = {
62
71
  readonly keys: WebBotAuthKeys | WebBotAuthKeyLookup;
63
72
  readonly required?: boolean;
64
73
  readonly maxAge?: number;
65
- /** Unix seconds; defaults to the system clock. */
66
- readonly now?: () => number;
74
+ /** The clock; defaults to the system clock. */
75
+ readonly now?: () => Instant;
67
76
  };
68
77
  /**
69
- * An adapter's `webBotAuth` option: `(request) => verifyWebBotAuth(request, options)`,
78
+ * An adapter's `webBotAuth` option: `webBotAuthVerifier(options)`,
70
79
  * so an app without it does not bundle RFC 9421 verification.
71
80
  */
72
- type WebBotAuthVerifier = (request: Request) => Promise<Actor | undefined>;
81
+ type WebBotAuthVerifier = {
82
+ readonly name?: string;
83
+ /** The verified signer as an actor, `undefined` for an unsigned request; throws `InvalidSignatureError` for a bad signature. */
84
+ verify(request: Request): Promise<Actor | undefined>;
85
+ };
73
86
  type DiscoverViaSignatureAgentOptions = {
74
87
  readonly allow: readonly string[];
75
88
  readonly fetch?: typeof fetch;
@@ -82,37 +95,26 @@ declare class InvalidSignatureError extends Error {
82
95
  declare function invalidSignatureResponse(error: unknown): Response | undefined;
83
96
  declare function invalidSignatureProblem(detail: string): Response;
84
97
  declare function discoverViaSignatureAgent(options: DiscoverViaSignatureAgentOptions): WebBotAuthKeys;
85
- declare function verifyWebBotAuth(request: Request, options: WebBotAuthOptions | undefined): Promise<Actor | undefined>;
86
- //#endregion
87
- //#region src/server/evaluations.d.ts
88
- declare function createEvaluationsHandler(options: {
89
- readonly policy: Policy;
90
- readonly resolve?: (request: Request) => Promise<PermDock>;
91
- readonly getPermDock?: (query?: {
92
- readonly tenant?: string;
93
- }) => Promise<PermDock>;
94
- readonly store?: ApprovalStore;
95
- readonly adapter?: string;
96
- /** The most evaluations one POST may carry; a larger batch is a 413 before any instance is resolved. */
97
- readonly maxEvaluations?: number;
98
- }): {
99
- readonly POST: (request: Request) => Promise<Response>;
100
- readonly GET: (request: Request) => Promise<Response>;
101
- };
98
+ /**
99
+ * Verifies Web Bot Auth requests: an RFC 9421 signature tagged `web-bot-auth`
100
+ * that covers `@authority`, and `signature-agent` when the request sends
101
+ * `Signature-Agent` (draft-meunier-webbotauth-httpsig-protocol).
102
+ */
103
+ declare function webBotAuthVerifier(options?: WebBotAuthOptions): WebBotAuthVerifier;
102
104
  //#endregion
103
- //#region src/server/create.d.ts
105
+ //#region src/server/server-types.d.ts
104
106
  type ServerPermDockOptions<TUser = unknown> = InstanceOptions & {
105
107
  /** The user, or a full `Subject` (core then skips `policy.subject`); `null` is anonymous. */
106
108
  readonly subject: (request: Request) => TUser | Subject | null | Promise<TUser | Subject | null>;
107
109
  readonly actor?: (request: Request) => unknown;
108
- /** `(request) => verifyWebBotAuth(request, options)`; a verified bot becomes the actor. */
110
+ /** `webBotAuthVerifier(options)`; a verified bot becomes the actor. */
109
111
  readonly webBotAuth?: WebBotAuthVerifier;
110
112
  readonly tenant?: string | ((request: Request) => string | undefined | Promise<string | undefined>);
111
113
  readonly store?: ApprovalStore;
112
114
  /** Ends or revalidates open connections; never a decision input. */
113
115
  readonly revocations?: RevocationFeed;
114
116
  /**
115
- * `createPermDock` from `permdock/pdp`: `protect` then decides delegated
117
+ * `getPermDock` from `permdock/pdp`: `protect` then decides delegated
116
118
  * permissions through the remote PDP. The instance handlers receive stays
117
119
  * synchronous and keeps denying delegated permissions (`pdp-unavailable`).
118
120
  */
@@ -120,7 +122,33 @@ type ServerPermDockOptions<TUser = unknown> = InstanceOptions & {
120
122
  /** Added as `approval` to every `approval-required` problem. */
121
123
  readonly approval?: ApprovalHint;
122
124
  readonly operations?: OperationScopes;
125
+ /**
126
+ * Replaces the response of a refused guard. A status below 300, or a
127
+ * throw, keeps the default response and reports through `on('error')`.
128
+ */
129
+ readonly deniedResponse?: DeniedResponse;
130
+ /**
131
+ * Request values merged into `subject.context`, under `policy.context`.
132
+ * Only values the server derived belong here, never client input. A throw
133
+ * or a value that is not a JSON object adds nothing and reports through
134
+ * `on('error')`.
135
+ */
136
+ readonly context?: (request: Request) => RequestContext | undefined | Promise<RequestContext | undefined>;
137
+ /** Wraps each instance the factory builds; build it with `wrapPermDock` to cover derived instances. */
138
+ readonly wrap?: PermDockWrap;
139
+ /** The `adapter` label on decision events, revocations and approvals. Defaults to `server`. */
140
+ readonly adapter?: string;
123
141
  };
142
+ /** What `deniedResponse` receives: the refusal and the default Problem Details for it. */
143
+ type DeniedResponseEvent = {
144
+ readonly decision: Exclude<Decision, {
145
+ readonly outcome: "granted";
146
+ }>;
147
+ readonly problem: ProblemDetails;
148
+ readonly request: Request | undefined;
149
+ };
150
+ /** Returns Problem Details with extra members, a `Response`, or nothing for the default. */
151
+ type DeniedResponse = (event: DeniedResponseEvent) => ProblemDetails | Response | undefined | Promise<ProblemDetails | Response | undefined>;
124
152
  type OperationScopes = {
125
153
  oauthScopesForRequest(method: string, path: string): readonly string[] | undefined;
126
154
  };
@@ -134,6 +162,10 @@ type Guard<T = unknown, V extends PolicyVocabulary = PolicyVocabulary> = {
134
162
  } | {
135
163
  readonly ok: false;
136
164
  readonly response: Response;
165
+ /** The refusal behind `response`; absent for a missing row or a bad signature. */
166
+ readonly decision?: Exclude<Decision, {
167
+ readonly outcome: "granted";
168
+ }>;
137
169
  };
138
170
  /**
139
171
  * What `protect(null, …)` resolves to: the route declares OAuth scopes and no
@@ -147,17 +179,21 @@ type ScopeGuard<T = unknown, V extends PolicyVocabulary = PolicyVocabulary> = {
147
179
  } | {
148
180
  readonly ok: false;
149
181
  readonly response: Response;
182
+ /** The refusal behind `response`; absent for a missing row or a bad signature. */
183
+ readonly decision?: Exclude<Decision, {
184
+ readonly outcome: "granted";
185
+ }>;
150
186
  };
151
187
  type Loader<T> = (request: Request) => T | null | undefined | Promise<T | null | undefined>;
152
188
  /**
153
- * `protect(permission, loadData?, options?)`, or `protect(null, loadData?,
189
+ * `protect(permission, data?, options?)`, or `protect(null, data?,
154
190
  * { oauthScopes })` for a route that needs a signed-in principal and, from a
155
191
  * delegated token, one of the OAuth scopes it declares, but no permission.
156
192
  */
157
193
  type Protect<V extends PolicyVocabulary = PolicyVocabulary, TArgs extends unknown[] = []> = {
158
- <T = unknown>(permission: Permission, loadData?: Loader<T>, protectOptions?: ProtectOptions): (request: Request, ...args: TArgs) => Promise<Guard<T, V>>;
159
- <T = unknown>(permission: null, loadData?: Loader<T>, protectOptions?: ProtectOptions): (request: Request, ...args: TArgs) => Promise<ScopeGuard<T, V>>;
160
- <T = unknown>(permission: Permission | null, loadData?: Loader<T>, protectOptions?: ProtectOptions): (request: Request, ...args: TArgs) => Promise<Guard<T, V> | ScopeGuard<T, V>>;
194
+ <T = unknown>(permission: Permission, data?: Loader<T>, protectOptions?: ProtectOptions): (request: Request, ...args: TArgs) => Promise<Guard<T, V>>;
195
+ <T = unknown>(permission: null, data?: Loader<T>, protectOptions?: ProtectOptions): (request: Request, ...args: TArgs) => Promise<ScopeGuard<T, V>>;
196
+ <T = unknown>(permission: Permission | null, data?: Loader<T>, protectOptions?: ProtectOptions): (request: Request, ...args: TArgs) => Promise<Guard<T, V> | ScopeGuard<T, V>>;
161
197
  };
162
198
  type OpenApiHooks = {
163
199
  readonly security: (permission: Permission) => {
@@ -168,7 +204,7 @@ type OpenApiHooks = {
168
204
  };
169
205
  type ProtectOptions = {
170
206
  /**
171
- * `true` when `loadData` returns a row the server loaded itself, to skip
207
+ * `true` when `data` returns a row the server loaded itself, to skip
172
208
  * schema validation. Anything else is validated against the resource
173
209
  * schema before the check.
174
210
  */
@@ -179,26 +215,24 @@ type ProtectOptions = {
179
215
  * for the request. Required, here or there, for `protect(null)`.
180
216
  */
181
217
  readonly oauthScopes?: readonly string[];
218
+ /** The field being read or written; only grants whose `fields` cover it match. */
219
+ readonly field?: string;
220
+ /** Adds the evaluation `trace` to the guard's decision. */
221
+ readonly explain?: boolean;
182
222
  };
183
- type ServerKernelOptions<TUser, V extends PolicyVocabulary = PolicyVocabulary> = ServerPermDockOptions<TUser> & {
184
- /** Wraps each instance the kernel builds, as `withOtel` does. */
185
- readonly wrap?: (permdock: PermDock<V>) => PermDock<V>;
186
- /** The `adapter` label on decision events, revocations and approvals. Defaults to `server`. */
187
- readonly adapter?: string;
188
- };
189
- /**
190
- * What an HTTP adapter builds on: `ServerPermDock` plus an explicit
191
- * `TenantScope` on every call, so the adapter resolves the tenant from its
192
- * own framework context.
193
- */
194
223
  type SnapshotQuery = {
195
224
  /** The active tenant; defaults to the `tenant` option resolved from the request. */
196
225
  readonly tenant?: string;
197
226
  readonly include?: SnapshotOptions["include"];
198
227
  readonly tenants?: "all";
199
228
  };
200
- type ServerKernel<V extends PolicyVocabulary = PolicyVocabulary> = {
201
- readonly permdock: (request: Request, scope?: TenantScope) => Promise<PermDock<V>>;
229
+ /**
230
+ * What `createPermDock` from `permdock/server` returns. Every member takes an
231
+ * optional `TenantScope`, so an adapter resolves the tenant from its own
232
+ * framework context.
233
+ */
234
+ type ServerPermDock<V extends PolicyVocabulary = PolicyVocabulary> = {
235
+ readonly getPermDock: (request: Request, scope?: TenantScope) => Promise<PermDock<V>>;
202
236
  /**
203
237
  * The JSON snapshot for a loader (React Router, TanStack Start, SvelteKit, Nuxt), built from the
204
238
  * request's cached subject. Send it with `snapshotHeaders(snapshot)`.
@@ -208,8 +242,10 @@ type ServerKernel<V extends PolicyVocabulary = PolicyVocabulary> = {
208
242
  /**
209
243
  * `protect` against an instance the adapter already holds, such as a gateway
210
244
  * connection's: the same OAuth scope check, loader, decision and approval resume.
245
+ * A method, so a `ServerPermDock<V>` stays assignable to `ServerPermDock`.
211
246
  */
212
- readonly protectOn: <T = unknown>(instance: PermDock<V>, permission: Permission | null, load?: () => T | null | undefined | Promise<T | null | undefined>, protectOptions?: ProtectOptions, request?: Request) => Promise<Guard<T, V> | ScopeGuard<T, V>>;
247
+ protectOn<T = unknown>(instance: PermDock<V>, permission: Permission | null, data?: () => T | null | undefined | Promise<T | null | undefined>, protectOptions?: ProtectOptions, request?: Request): Promise<Guard<T, V> | ScopeGuard<T, V>>;
248
+ /** A long-lived connection for a stream or socket opened by `request`. */
213
249
  readonly connection: <T = unknown>(request: Request, options?: ConnectionOptions<T>, scope?: TenantScope) => Promise<Connection>;
214
250
  /**
215
251
  * Lets `to`, a second `Request` an adapter built for the same incoming
@@ -217,29 +253,12 @@ type ServerKernel<V extends PolicyVocabulary = PolicyVocabulary> = {
217
253
  * actor already resolved for `from`.
218
254
  */
219
255
  readonly shareSubject: (from: Request, to: Request) => void;
220
- readonly problem: ServerPermDock<V>["problem"];
221
- readonly openapi: OpenApiHooks;
222
- readonly permdockHandler: (scope?: (request: Request) => TenantScope | Promise<TenantScope>) => ReturnType<typeof createEvaluationsHandler>;
223
- };
224
- type ServerPermDock<V extends PolicyVocabulary = PolicyVocabulary> = {
225
- readonly permdock: (request: Request) => Promise<PermDock<V>>;
226
- readonly getSnapshot: ServerKernel<V>["getSnapshot"];
227
- readonly protect: Protect<V>;
228
- /** A long-lived connection for a stream or socket opened by `request`. */
229
- readonly connection: <T = unknown>(request: Request, options?: ConnectionOptions<T>) => Promise<Connection>;
230
256
  readonly problem: (decision: Decision, init?: {
231
257
  readonly permission?: Permission;
232
258
  readonly instance?: string;
233
259
  }) => Response;
234
260
  readonly openapi: OpenApiHooks;
235
- readonly permdockHandler: () => ReturnType<typeof createEvaluationsHandler>;
261
+ readonly permdockHandler: (scope?: (request: Request) => TenantScope | Promise<TenantScope>) => ReturnType<typeof evaluationsHandler>;
236
262
  };
237
- declare function createPermDock<TUser, TPrincipal extends Principal = Principal, V extends PolicyVocabulary = PolicyVocabulary>(policy: Policy<TUser, TPrincipal, V>, options: ServerPermDockOptions<TUser>): ServerPermDock<V>;
238
- /**
239
- * The kernel behind every HTTP adapter. The subject and actor are resolved
240
- * once per `Request`; one instance is cached per `(Request, tenant)`, so a
241
- * global middleware and a later tenant-scoped `protect` never share a tenant.
242
- */
243
- declare function createServerKernel<TUser, TPrincipal extends Principal = Principal, V extends PolicyVocabulary = PolicyVocabulary>(policy: Policy<TUser, TPrincipal, V>, options: ServerKernelOptions<TUser, V>): ServerKernel<V>;
244
263
  //#endregion
245
- export { ConnectionOptions as A, invalidSignatureResponse as C, tenantScope as D, TenantScope as E, Connection as O, invalidSignatureProblem as S, TenantOption as T, WebBotAuthKeyLookup as _, ScopeGuard as a, WebBotAuthVerifier as b, ServerPermDock as c, createPermDock as d, createServerKernel as f, WebBotAuthJwk as g, InvalidSignatureError as h, ProtectOptions as i, ConnectionData as k, ServerPermDockOptions as l, DiscoverViaSignatureAgentOptions as m, OpenApiHooks as n, ServerKernel as o, createEvaluationsHandler as p, OperationScopes as r, ServerKernelOptions as s, Guard as t, SnapshotQuery as u, WebBotAuthKeys as v, verifyWebBotAuth as w, discoverViaSignatureAgent as x, WebBotAuthOptions as y };
264
+ export { TenantScope as C, ConnectionOptions as D, ConnectionData as E, TenantOption as S, Connection as T, WebBotAuthVerifier as _, OperationScopes as a, invalidSignatureResponse as b, ServerPermDock as c, DiscoverViaSignatureAgentOptions as d, InvalidSignatureError as f, WebBotAuthOptions as g, WebBotAuthKeys as h, OpenApiHooks as i, ServerPermDockOptions as l, WebBotAuthKeyLookup as m, DeniedResponseEvent as n, ProtectOptions as o, WebBotAuthJwk as p, Guard as r, ScopeGuard as s, DeniedResponse as t, SnapshotQuery as u, discoverViaSignatureAgent as v, tenantScope as w, webBotAuthVerifier as x, invalidSignatureProblem as y };
@@ -141,10 +141,17 @@ function sha256(message) {
141
141
  outView.setInt32(28, h7, false);
142
142
  return out;
143
143
  }
144
+ /**
145
+ * The one digest notation: `sha-256:` plus the unpadded base64url SHA-256
146
+ * of `text`. An RFC 9651 sf-token, so it fits a structured header as is.
147
+ */
148
+ function sha256Digest(text) {
149
+ return `sha-256:${bytesToBase64Url(sha256(text))}`;
150
+ }
144
151
  function bytesToBase64Url(bytes) {
145
152
  let binary = "";
146
153
  for (const byte of bytes) binary += String.fromCodePoint(byte);
147
154
  return btoa(binary).replaceAll("+", "-").replaceAll("/", "_").replaceAll("=", "");
148
155
  }
149
156
  //#endregion
150
- export { sha256 as n, bytesToBase64Url as t };
157
+ export { sha256 as n, sha256Digest as r, bytesToBase64Url as t };
@@ -0,0 +1,304 @@
1
+ import { r as isRecord } from "./compact-CAf557ZB.js";
2
+ import { n as isForbiddenKey } from "./paths-DXSHAMIa.js";
3
+ import { t as byCodePoint } from "./compare-pfyVnBjE.js";
4
+ import { i as configError } from "./errors-CWTY6uih.js";
5
+ import { a as quoteQualifiedTable, c as quoteSqlTable, o as quoteSqlIdent, s as quoteSqlLiteral, t as SQL_IDENT } from "./sql-B5T1IL83.js";
6
+ import "./sources-vs5dGOsS.js";
7
+ //#region src/cli/sql/quote.ts
8
+ function quoteIdent(name) {
9
+ return quoteSqlIdent(name, CLI);
10
+ }
11
+ function quoteTable(name) {
12
+ return quoteSqlTable(name, CLI);
13
+ }
14
+ /** A table name with `public.` added when it names no schema, quoted. */
15
+ function quoteQualified(name) {
16
+ return quoteQualifiedTable(name, CLI);
17
+ }
18
+ function helperSchema(ctx) {
19
+ return ctx.schema ?? "permdock";
20
+ }
21
+ function qualified(ctx, name) {
22
+ return `${quoteIdent(helperSchema(ctx))}.${name}`;
23
+ }
24
+ function quoteLiteral(value) {
25
+ return quoteSqlLiteral(value);
26
+ }
27
+ const CLI = "PermDock CLI";
28
+ function declaredArray(values) {
29
+ return values.length === 0 ? `'{}'::text[]` : `array[${values.map(quoteLiteral).join(", ")}]::text[]`;
30
+ }
31
+ /**
32
+ * A text array as a Postgres literal (`'{admin,owner}'`). An element that
33
+ * holds a delimiter, a brace, a quote, a backslash, whitespace, or that
34
+ * reads as `NULL`, is double-quoted and escaped, so one element can never
35
+ * split into several.
36
+ */
37
+ function textArrayLiteral(values) {
38
+ return quoteLiteral(`{${values.map((value) => value === "" || /[\s,{}"\\]/u.test(value) || /^null$/iu.test(value) ? `"${value.replaceAll("\\", "\\\\").replaceAll("\"", "\\\"")}"` : value).join(",")}}`);
39
+ }
40
+ //#endregion
41
+ //#region src/cli/sql/columns.ts
42
+ /** The Postgres type a JSON Schema property compares as; `undefined` for text or an unknown shape. */
43
+ function columnTypeOf(property) {
44
+ if (!isRecord(property)) return;
45
+ const variants = [property["anyOf"], property["oneOf"]].find(Array.isArray);
46
+ if (variants !== void 0) {
47
+ const present = variants.filter((item) => !(isRecord(item) && item["type"] === "null"));
48
+ return present.length === 1 ? columnTypeOf(present[0]) : void 0;
49
+ }
50
+ const types = (Array.isArray(property["type"]) ? property["type"] : [property["type"]]).filter((item) => item !== "null");
51
+ if (types.length !== 1) return;
52
+ switch (types[0]) {
53
+ case "integer":
54
+ case "number": return "numeric";
55
+ case "boolean": return "boolean";
56
+ case "string": switch (property["format"]) {
57
+ case "date-time": return "timestamptz";
58
+ case "date": return "date";
59
+ case "uuid": return "uuid";
60
+ default: return;
61
+ }
62
+ default: return;
63
+ }
64
+ }
65
+ /**
66
+ * Column types from a resource's JSON Schema (`~standard.jsonSchema`): numbers
67
+ * compare as `numeric`, booleans as `boolean`, and `date-time`, `date` and
68
+ * `uuid` strings as `timestamptz`, `date` and `uuid`. Other columns are left
69
+ * out and compare as text.
70
+ */
71
+ function columnTypesOf(schema) {
72
+ const properties = isRecord(schema) ? schema["properties"] : void 0;
73
+ if (!isRecord(properties)) return {};
74
+ const types = {};
75
+ for (const [name, property] of Object.entries(properties)) {
76
+ const type = isForbiddenKey(name) ? void 0 : columnTypeOf(property);
77
+ if (type !== void 0) types[name] = type;
78
+ }
79
+ return types;
80
+ }
81
+ /**
82
+ * Array columns from a resource's JSON Schema, each with the type its items
83
+ * compare as (`text` when `columnTypesOf` would leave the item out).
84
+ */
85
+ function arrayColumnsOf(schema) {
86
+ const properties = isRecord(schema) ? schema["properties"] : void 0;
87
+ if (!isRecord(properties)) return {};
88
+ const arrays = {};
89
+ for (const [name, property] of Object.entries(properties)) {
90
+ if (isForbiddenKey(name) || !isRecord(property)) continue;
91
+ const types = (Array.isArray(property["type"]) ? property["type"] : [property["type"]]).filter((item) => item !== "null");
92
+ if (types.length === 1 && types[0] === "array") arrays[name] = columnTypeOf(property["items"]) ?? "text";
93
+ }
94
+ return arrays;
95
+ }
96
+ const SQL_TYPE = /^[A-Za-z_][A-Za-z0-9_]*( [A-Za-z_][A-Za-z0-9_]*)*(\[\])?$/u;
97
+ function sqlType(name) {
98
+ if (!SQL_TYPE.test(name)) throw configError(`PermDock CLI: unsafe SQL type '${name}'`);
99
+ return name;
100
+ }
101
+ function tenantTypeOf(ctx) {
102
+ return sqlType(ctx.tenantType ?? "uuid");
103
+ }
104
+ function teamTypeOf(ctx) {
105
+ return sqlType(ctx.teamType ?? ctx.tenantType ?? "uuid");
106
+ }
107
+ /** Postgres type of scope `name`'s id: `scopeTypes`, then the tenant / team type by position. */
108
+ function scopeTypeOf(ctx, name) {
109
+ const declared = ctx.scopeTypes?.[name];
110
+ if (declared !== void 0) return sqlType(declared);
111
+ return name === ctx.scopes[1]?.name ? teamTypeOf(ctx) : tenantTypeOf(ctx);
112
+ }
113
+ //#endregion
114
+ //#region src/cli/sql/context.ts
115
+ const CLAIM = SQL_IDENT;
116
+ function parseMembershipsFlag(raw) {
117
+ if (raw === void 0 || raw === "") return;
118
+ const colon = raw.indexOf(":");
119
+ const table = colon === -1 ? raw : raw.slice(0, colon);
120
+ const cols = (colon === -1 ? "" : raw.slice(colon + 1)).split(",").map((item) => item.trim()).filter((item) => item !== "");
121
+ return { tenant: {
122
+ table,
123
+ tenant: cols[0] ?? "tenant_id",
124
+ user: cols[1] ?? "user_id",
125
+ role: cols[2] ?? "role",
126
+ ...cols[3] === void 0 ? {} : { expiresAt: cols[3] }
127
+ } };
128
+ }
129
+ //#endregion
130
+ //#region src/cli/sql/subject.ts
131
+ /**
132
+ * A role with `for` counts only on a membership of one of those kinds:
133
+ * `case role when 'admin' then via = any(...) ... else true end`. A missing
134
+ * kind (`viaExpr` null) holds none of them. A constant kind folds into the
135
+ * roles it excludes, or no filter. `undefined` when nothing is filtered.
136
+ */
137
+ function kindFilterSql(ctx, roleExpr, viaExpr) {
138
+ const kinds = Object.entries(ctx.ownership?.kinds ?? {}).toSorted(([a], [b]) => byCodePoint(a, b));
139
+ if (kinds.length === 0) return;
140
+ if (typeof viaExpr !== "string") {
141
+ const excluded = kinds.filter(([, allowed]) => !viaAllowed(viaExpr.value, allowed)).map(([role]) => role);
142
+ return excluded.length === 0 ? void 0 : `not (${roleExpr} = any(array[${excluded.map(quoteLiteral).join(", ")}]::text[]))`;
143
+ }
144
+ return `case ${roleExpr} ${kinds.map(([role, allowed]) => `when ${quoteLiteral(role)} then coalesce(${viaExpr}, '') = any(array[${allowed.map(quoteLiteral).join(", ")}]::text[])`).join(" ")} else true end`;
145
+ }
146
+ /** The kind check for one known role; `undefined` when it has no `for` or a constant kind it allows. */
147
+ function roleKindSql(ctx, role, viaExpr) {
148
+ const allowed = ctx.ownership?.kinds[role];
149
+ if (allowed === void 0) return;
150
+ if (typeof viaExpr !== "string") return viaAllowed(viaExpr.value, allowed) ? void 0 : "false";
151
+ return `coalesce(${viaExpr}, '') = any(array[${allowed.map(quoteLiteral).join(", ")}]::text[])`;
152
+ }
153
+ /** Roles with `for` held globally (no membership, so no kind) grant nothing. */
154
+ function globalKindFilterSql(ctx, roleExpr) {
155
+ const roles = Object.keys(ctx.ownership?.kinds ?? {}).toSorted();
156
+ return roles.length === 0 ? void 0 : `not (${roleExpr} = any(array[${roles.map(quoteLiteral).join(", ")}]::text[]))`;
157
+ }
158
+ function keyTenantSql(ctx, tenant) {
159
+ const keys = ctx.apiKeys;
160
+ if (keys === void 0) return;
161
+ const named = `nullif(${subjectClaimJsonSql(ctx, keys.claim)} ->> ${quoteLiteral(keys.tenant)}, '')`;
162
+ return tenant === void 0 ? `${named} is null` : `(${named} is null or (${tenant})::text = ${named})`;
163
+ }
164
+ /** The active-tenant claim cast to the tenant column's type, so the comparison uses the column's index. */
165
+ function tenantClaimSql(ctx) {
166
+ return `${subjectClaimSql(ctx, ctx.tenantClaim)}::${tenantTypeOf(ctx)}`;
167
+ }
168
+ const USER_ID_HELPER = "permdock_user_id";
169
+ function userIdHelperSql(ctx) {
170
+ return qualified(ctx, USER_ID_HELPER);
171
+ }
172
+ const SESSION_LIVE_HELPER = "permdock_session_live";
173
+ /** `{ subject: { session: { live: true } } }` in a policy; only Supabase has `auth.sessions`. */
174
+ function liveSessionSql(ctx) {
175
+ if (ctx.dialect !== "supabase") throw configError(`PermDock CLI: { subject: { session: { live: true } } } reads auth.sessions, which only the supabase dialect has (got ${ctx.dialect})`);
176
+ return `(select ${qualified(ctx, SESSION_LIVE_HELPER)}())`;
177
+ }
178
+ /**
179
+ * `permdock_session_live()`: the token's `session_id` names a session of its
180
+ * user that is still in `auth.sessions`, so a signed-out or revoked session
181
+ * stops passing before the token's `exp`. A token without one, such as a
182
+ * service key's, is never live.
183
+ */
184
+ function sessionLiveHelperSql(ctx) {
185
+ const name = qualified(ctx, SESSION_LIVE_HELPER);
186
+ return `create or replace function ${name}()
187
+ returns boolean
188
+ language plpgsql
189
+ stable
190
+ security definer
191
+ set search_path = ''
192
+ as $$
193
+ declare
194
+ v_session uuid;
195
+ begin
196
+ begin
197
+ v_session := nullif((select auth.jwt()) ->> 'session_id', '')::uuid;
198
+ exception when invalid_text_representation then
199
+ return false;
200
+ end;
201
+ if v_session is null then
202
+ return false;
203
+ end if;
204
+ return exists (
205
+ select 1
206
+ from auth.sessions s
207
+ where s.id = v_session
208
+ and s.user_id::text = ${subjectIdSql(ctx)}::text
209
+ and (s.not_after is null or s.not_after > now())
210
+ );
211
+ end;
212
+ $$;
213
+ revoke execute on function ${name}() from public, anon;
214
+ grant execute on function ${name}() to authenticated;
215
+ `;
216
+ }
217
+ function subjectIdSql(ctx) {
218
+ if (ctx.subjectId !== void 0) return ctx.subjectId;
219
+ switch (ctx.dialect) {
220
+ case "supabase": return `(select ${userIdHelperSql(ctx)}())`;
221
+ case "neon": return "(select auth.user_id())";
222
+ case "guc": return `(select current_setting(${quoteLiteral(`${ctx.gucPrefix}.user_id`)}, true))`;
223
+ default: return ctx.dialect;
224
+ }
225
+ }
226
+ function subjectClaimSql(ctx, claim) {
227
+ if (!CLAIM.test(claim)) throw configError(`PermDock CLI: unsafe claim name '${claim}'`);
228
+ switch (ctx.dialect) {
229
+ case "supabase": return `((select auth.jwt()) ->> ${quoteLiteral(claim)})`;
230
+ case "neon": return `((select auth.session()) ->> ${quoteLiteral(claim)})`;
231
+ case "guc": return `(select current_setting(${quoteLiteral(`${ctx.gucPrefix}.${claim}`)}, true))`;
232
+ default: return ctx.dialect;
233
+ }
234
+ }
235
+ /** A claim as `jsonb`; the `guc` dialect stores JSON text in `<prefix>.<claim>`. */
236
+ function subjectClaimJsonSql(ctx, claim) {
237
+ if (!CLAIM.test(claim)) throw configError(`PermDock CLI: unsafe claim name '${claim}'`);
238
+ switch (ctx.dialect) {
239
+ case "supabase": return `((select auth.jwt()) -> ${quoteLiteral(claim)})`;
240
+ case "neon": return `((select auth.session()) -> ${quoteLiteral(claim)})`;
241
+ case "guc": return `nullif((select current_setting(${quoteLiteral(`${ctx.gucPrefix}.${claim}`)}, true)), '')::jsonb`;
242
+ default: return ctx.dialect;
243
+ }
244
+ }
245
+ function viaAllowed(value, allowed) {
246
+ return allowed.includes(value ?? "");
247
+ }
248
+ /** The membership kind of a row `m` of `table`: its column as text, or its constant (`null` without one). */
249
+ function memberVia(table) {
250
+ const via = table.via;
251
+ if (via === void 0) return { value: null };
252
+ return typeof via === "string" ? `m.${quoteIdent(via)}::text` : { value: via.value };
253
+ }
254
+ //#endregion
255
+ //#region src/cli/sql/shared.ts
256
+ /** `rls.customRoles` turns custom roles on as `true` or as an object. */
257
+ function customRolesOn(rls) {
258
+ const custom = rls?.customRoles;
259
+ return custom === true || typeof custom === "object" && custom !== null;
260
+ }
261
+ /**
262
+ * The per-statement helpers every generated policy calls: `permdock_has` for
263
+ * global roles and one `permitted_<scope>_ids` per scope
264
+ * (`permittedIdsHelper`). Names are part of the SQL contract.
265
+ */
266
+ const HELPERS = {
267
+ has: "permdock_has",
268
+ hasFor: "permdock_has_for"
269
+ };
270
+ /** Objects `--custom-roles` adds next to the helpers. Names are part of the SQL contract. */
271
+ const CUSTOM_ROLES = {
272
+ permissions: "custom_role_permissions",
273
+ includes: "custom_role_includes",
274
+ ceiling: "permdock_ceiling",
275
+ keys: "permdock_custom_keys",
276
+ beyond: "permdock_custom_role_beyond",
277
+ guard: "permdock_custom_role_guard",
278
+ beyondFor: "permdock_custom_role_beyond_for",
279
+ guardFor: "permdock_custom_role_guard_for",
280
+ shape: "permdock_custom_role_shape",
281
+ entries: "permdock_custom_role_entries",
282
+ replace: "permdock_replace_custom_role_grants",
283
+ rename: "permdock_rename_custom_role_grants",
284
+ remove: "permdock_delete_custom_role_grants",
285
+ trustedReplace: "permdock_trusted_replace_custom_role_grants",
286
+ trustedRename: "permdock_trusted_rename_custom_role_grants",
287
+ trustedRemove: "permdock_trusted_delete_custom_role_grants",
288
+ cascade: "permdock_cascade_custom_role"
289
+ };
290
+ /** The function `rls.roles` adds. The name is part of the SQL contract. */
291
+ const GLOBAL_ROLES = { replace: "permdock_replace_global_roles" };
292
+ /** `user` is the SQL for the user id: the dialect's (the default) or the `p_user` parameter of a `_for` helper. */
293
+ function signedIn(ctx, user = subjectIdSql(ctx)) {
294
+ return `coalesce(${user}::text, '') <> ''`;
295
+ }
296
+ function rootName(ctx) {
297
+ return ctx.scopes[0]?.name ?? "tenant";
298
+ }
299
+ /** The stored allow as `permissions` hands it to `permdock_custom_keys`: `key`, or `key@level` with levels. */
300
+ function allowEntry(ctx) {
301
+ return ctx.customRoles?.levels === true ? "permission || coalesce('@' || c.level, '')" : "permission";
302
+ }
303
+ //#endregion
304
+ export { declaredArray as A, parseMembershipsFlag as C, sqlType as D, scopeTypeOf as E, quoteQualified as F, quoteTable as I, textArrayLiteral as L, qualified as M, quoteIdent as N, tenantTypeOf as O, quoteLiteral as P, CLAIM as S, columnTypesOf as T, subjectClaimJsonSql as _, customRolesOn as a, tenantClaimSql as b, SESSION_LIVE_HELPER as c, keyTenantSql as d, kindFilterSql as f, sessionLiveHelperSql as g, roleKindSql as h, allowEntry as i, helperSchema as j, CLI as k, USER_ID_HELPER as l, memberVia as m, GLOBAL_ROLES as n, rootName as o, liveSessionSql as p, HELPERS as r, signedIn as s, CUSTOM_ROLES as t, globalKindFilterSql as u, subjectClaimSql as v, arrayColumnsOf as w, userIdHelperSql as x, subjectIdSql as y };
@@ -1,13 +1,12 @@
1
- import { t as decisionToken } from "./token-CIWxJOCh.js";
1
+ import { a as durationOf, f as nowMillis } from "./time-DkWjdL98.js";
2
+ import { t as decisionToken } from "./token-BLZcjQgt.js";
2
3
  //#region src/pdp/shared.ts
3
- const MAX_CACHE_TTL_MS = 3e4;
4
+ const MAX_CACHE_TTL = 30;
4
5
  const CACHE_MAX = 1e3;
5
- /** Milliseconds, clamped to `[0, 30s]`; anything unparseable disables the cache. */
6
+ /** Milliseconds from `ttl` seconds, clamped to 30 s; a `ttl` that is not a whole number of seconds above 0 disables the cache. */
6
7
  function ttlMs(cache) {
7
- if (cache === void 0) return 0;
8
- const raw = typeof cache.ttl === "number" ? cache.ttl : cache.ttl.endsWith("ms") ? Number(cache.ttl.slice(0, -2)) : Number(cache.ttl.slice(0, -1)) * 1e3;
9
- if (!Number.isFinite(raw) || raw <= 0) return 0;
10
- return Math.min(raw, MAX_CACHE_TTL_MS);
8
+ const ttl = durationOf(cache?.ttl);
9
+ return ttl === void 0 ? 0 : Math.min(ttl, MAX_CACHE_TTL) * 1e3;
11
10
  }
12
11
  function denied(reason) {
13
12
  return {
@@ -68,13 +67,13 @@ function ttlCache(ttl) {
68
67
  get(key) {
69
68
  if (ttl <= 0) return;
70
69
  const hit = entries.get(key);
71
- if (hit !== void 0 && Date.now() - hit.at < ttl) return hit.value;
70
+ if (hit !== void 0 && nowMillis() - hit.at < ttl) return hit.value;
72
71
  entries.delete(key);
73
72
  },
74
73
  set(key, value) {
75
74
  if (ttl <= 0) return;
76
75
  entries.set(key, {
77
- at: Date.now(),
76
+ at: nowMillis(),
78
77
  value
79
78
  });
80
79
  if (entries.size > CACHE_MAX) {