permdock 0.3.0 → 0.4.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 (323) hide show
  1. package/dist/a2a/index.d.ts +7 -5
  2. package/dist/a2a/index.js +14 -21
  3. package/dist/ai-sdk/index.d.ts +18 -6
  4. package/dist/ai-sdk/index.js +8 -5
  5. package/dist/app-data-CV8pqqMi.js +59 -0
  6. package/dist/approvals/index.d.ts +2 -2
  7. package/dist/approvals/index.js +3 -3
  8. package/dist/{approvals-DbYAuNkG.js → approvals-DZL76lKW.js} +35 -19
  9. package/dist/{approvers-DT4AVyIg.js → approvers-CqPOLD-o.js} +1 -1
  10. package/dist/{arazzo-BAgw9ap6.js → arazzo-C4BcskbX.js} +6 -5
  11. package/dist/{arazzo-CKwwqFWz.js → arazzo-CD8d0WLb.js} +2 -2
  12. package/dist/authzen/index.d.ts +3 -3
  13. package/dist/authzen/index.js +161 -23
  14. package/dist/better-auth/index.d.ts +2 -2
  15. package/dist/better-auth/index.js +6 -19
  16. package/dist/better-supabase/index.d.ts +112 -87
  17. package/dist/better-supabase/index.js +257 -156
  18. package/dist/{bind-C_ob3LKa.d.ts → bind-BzqG8SMb.d.ts} +16 -5
  19. package/dist/{bind-CuzGytRf.js → bind-kk-uyCwH.js} +14 -6
  20. package/dist/build-instance-DIIV9DbC.js +51 -0
  21. package/dist/{canonical-json-DemiK4Vp.js → canonical-json-CFKyFOke.js} +1 -3
  22. package/dist/{capability-2kYTMWDv.d.ts → capability-CksyCWDH.d.ts} +2 -2
  23. package/dist/{capability-4qPdO9gk.js → capability-txATtKV4.js} +3 -2
  24. package/dist/catalog/index.d.ts +1 -1
  25. package/dist/catalog/index.js +1 -1
  26. package/dist/catalog-6yWAX6Ps.js +2 -0
  27. package/dist/{catalog-dFZdWCGN.js → catalog-WHG4kBq7.js} +2 -2
  28. package/dist/{catalog-doc-DdGm82XT.js → catalog-doc-DWtg0gGR.js} +17 -10
  29. package/dist/{catalog-DWF5cYqB.js → catalog-tZUyOfOv.js} +4 -4
  30. package/dist/claude-agent/index.d.ts +4 -4
  31. package/dist/claude-agent/index.js +4 -5
  32. package/dist/clerk/index.d.ts +3 -3
  33. package/dist/clerk/index.js +8 -33
  34. package/dist/cli/bin.js +1 -1
  35. package/dist/cli/index.d.ts +3 -3
  36. package/dist/cli/index.js +3 -3
  37. package/dist/cloud/index.d.ts +4 -4
  38. package/dist/cloud/index.js +9 -15
  39. package/dist/{cloud-CB_ELYuX.js → cloud-C7bSDgX4.js} +2 -2
  40. package/dist/{cloud-DWLXO2af.js → cloud-PeBN3IEn.js} +5 -5
  41. package/dist/{collect-DSTE3ml9.js → collect-2SrB7lfk.js} +6 -8
  42. package/dist/collect-Bw2Jdq1q.js +2 -0
  43. package/dist/{collect-DClJsheJ.js → collect-CQx4hX4N.js} +3 -3
  44. package/dist/{commands-DSxCqG9A.js → commands-Cpip4ULx.js} +13 -13
  45. package/dist/{compact-y6vfu2_f.js → compact-CAf557ZB.js} +11 -1
  46. package/dist/compile/index.d.ts +1 -1
  47. package/dist/compile/index.js +1 -1
  48. package/dist/{compile-Ba4blROR.js → compile-CcEu2ZQ1.js} +6 -5
  49. package/dist/{compile-BkRyBDBw.d.ts → compile-CtTP7eur.d.ts} +2 -2
  50. package/dist/{config-BJiM-xAm.js → config-BIjREpyE.js} +4 -4
  51. package/dist/{config-Dnszbv-6.js → config-DLt6BvV7.js} +2 -2
  52. package/dist/{config-report-DMvWKUxL.js → config-report--Xb9APJS.js} +5 -6
  53. package/dist/{connection-CU8MQxRi.js → connection-DUsczpB5.js} +3 -2
  54. package/dist/constants-DcJABbLW.js +20 -0
  55. package/dist/{context-Bcy85rGi.js → context-DieZVJXu.js} +16 -5
  56. package/dist/convex/index.d.ts +4 -4
  57. package/dist/convex/index.js +14 -16
  58. package/dist/create-BBO24vj6.js +324 -0
  59. package/dist/{credential-8P81ff4u.js → credential-kue0qpbm.js} +4 -4
  60. package/dist/deciding-columns-Sq12mEA6.js +123 -0
  61. package/dist/delegation-input-FTxMK3ji.js +19 -0
  62. package/dist/denied-text-DfRk15uw.d.ts +19 -0
  63. package/dist/{describe-DMYiCjJV.d.ts → describe-C3ldA9os.d.ts} +11 -2
  64. package/dist/{describe-B_gVZEVi.js → describe-Cgkp7eP0.js} +5 -4
  65. package/dist/{diff-DBIhz_f2.js → diff-Cnghh_Ip.js} +2 -2
  66. package/dist/{diff-2VaeChzX.js → diff-rpqoe7Ag.js} +9 -9
  67. package/dist/{doctor-BwCAMLx_.js → doctor-CuVJvhV_.js} +2 -2
  68. package/dist/doctor-owlv6ddh.js +2166 -0
  69. package/dist/drizzle/index.d.ts +2 -2
  70. package/dist/drizzle/index.js +6 -14
  71. package/dist/elysia/index.d.ts +4 -4
  72. package/dist/elysia/index.js +7 -7
  73. package/dist/{errors-DPdqI50v.d.ts → errors-OD_4c__H.d.ts} +2 -2
  74. package/dist/{errors-Cz5zn0mW.js → errors-drnfxYtm.js} +3 -3
  75. package/dist/{evaluations-tz6D9A2G.js → evaluations-C9YJsv3H.js} +45 -7
  76. package/dist/eve/index.d.ts +5 -5
  77. package/dist/eve/index.js +5 -5
  78. package/dist/express/index.d.ts +4 -4
  79. package/dist/express/index.js +8 -7
  80. package/dist/fastify/index.d.ts +15 -5
  81. package/dist/fastify/index.js +9 -29
  82. package/dist/fields-fwfXN01n.js +1016 -0
  83. package/dist/{files-DWUN9PzI.js → files-D_JIzUrP.js} +12 -3
  84. package/dist/{fixtures-ht28Cplr.js → fixtures-h2eG2OZV.js} +5 -6
  85. package/dist/{from-snapshot-CTLijvdm.js → from-snapshot-7REQZe0H.js} +32 -22
  86. package/dist/{generate-CH7ThJ14.js → generate-CNU1pIOo.js} +1 -3
  87. package/dist/grantee-CXY-0C87.js +254 -0
  88. package/dist/grantee-conditions-MQs5NIuX.js +270 -0
  89. package/dist/grantee-match-fxYp9Nmt.js +141 -0
  90. package/dist/{helpers-H_KARDVC.js → helpers-C9YmyBIa.js} +7 -6
  91. package/dist/hono/index.d.ts +4 -4
  92. package/dist/hono/index.js +8 -8
  93. package/dist/hosted-CBHgkzDl.js +655 -0
  94. package/dist/{http-SO7qGttf.js → http-BBoKefeS.js} +35 -2
  95. package/dist/{http-BIhmLfCc.js → http-BEbdMZ05.js} +2 -24
  96. package/dist/{rls-import-BTFVk3jH.js → import-BFIlhetD.js} +86 -80
  97. package/dist/{openapi-import-cmwetbzw.js → import-UHk1N7vH.js} +6 -7
  98. package/dist/{index-C8z4RjQV.d.ts → index-BwMe94Xq.d.ts} +1 -1
  99. package/dist/{index-0nNqHspG.d.ts → index-DgM7w96K.d.ts} +2 -2
  100. package/dist/{index-C7Tw7MaW.d.ts → index-Dz7didpC.d.ts} +3 -3
  101. package/dist/{index-BNc7Wer_.d.ts → index-UdVQgq48.d.ts} +105 -38
  102. package/dist/index.d.ts +15 -13
  103. package/dist/index.js +22 -22
  104. package/dist/{instance-options-jARdwfPN.d.ts → instance-options-plkrsAog.d.ts} +1 -1
  105. package/dist/{json-schema-BsAflUGW.js → json-schema-DBkdUuCO.js} +1 -3
  106. package/dist/jwt/index.d.ts +4 -4
  107. package/dist/jwt/index.js +13 -13
  108. package/dist/{kernel-_RRHmnMY.js → kernel-CB3LrIJM.js} +81 -32
  109. package/dist/kysely/index.d.ts +2 -2
  110. package/dist/kysely/index.js +6 -14
  111. package/dist/{live-options-H2eG8dfJ.js → live-options-BaAFCIiu.js} +16 -3
  112. package/dist/load-B_shHrmd.js +2 -0
  113. package/dist/{load-DhWEB9P1.js → load-C3_oTHyO.js} +11 -3
  114. package/dist/{manifest-iaoBXHKc.js → manifest-BngWKryL.js} +5 -18
  115. package/dist/{map-claims-Z4QZOiFF.js → map-claims-AVlBaJoa.js} +7 -16
  116. package/dist/{map-error-pgUWNNtG.js → map-error-BE27PYkE.js} +5 -5
  117. package/dist/{markers-B0hYLvMD.js → markers-CiwAOZtO.js} +6 -2
  118. package/dist/{may-use-DndQ5tQ-.js → may-use-BOn_dR_w.js} +4 -3
  119. package/dist/mcp/index.d.ts +26 -9
  120. package/dist/mcp/index.js +456 -446
  121. package/dist/{rls-migrate-CN4TlJTO.js → migrate-BwlB5-Wk.js} +75 -15
  122. package/dist/nest/index.d.ts +4 -4
  123. package/dist/nest/index.js +11 -12
  124. package/dist/next/index.d.ts +31 -8
  125. package/dist/next/index.js +29 -33
  126. package/dist/next/plugin.d.ts +1 -1
  127. package/dist/next/plugin.js +1 -1
  128. package/dist/node/index.d.ts +4 -4
  129. package/dist/node/index.js +4 -4
  130. package/dist/ocsf-uYFXGVw2.js +115 -0
  131. package/dist/openai/index.d.ts +5 -5
  132. package/dist/openai/index.js +4 -4
  133. package/dist/openapi/index.d.ts +3 -3
  134. package/dist/openapi/index.js +1 -1
  135. package/dist/{openapi-CqqEbHsL.js → openapi-BJdBmYDG.js} +19 -23
  136. package/dist/{openapi-BqRBvAng.js → openapi-DBzHQbov.js} +2 -5
  137. package/dist/{openapi-l0xYHkcv.js → openapi-DcQ1Kg40.js} +3 -3
  138. package/dist/orpc/index.d.ts +5 -5
  139. package/dist/orpc/index.js +9 -11
  140. package/dist/otel/index.d.ts +2 -2
  141. package/dist/otel/index.js +26 -23
  142. package/dist/output-files-CgIsvdSa.js +140 -0
  143. package/dist/{rls-ownership-RuFqaqGz.js → ownership-BgnbOJFT.js} +387 -379
  144. package/dist/{package-root-zGkxO3oN.js → package-root-DtNnpmUd.js} +3 -2
  145. package/dist/{parse-BuyjxhZV.js → parse-CVFQHk6c.js} +3 -3
  146. package/dist/{parse-local-manifest-BrMozJCo.js → parse-local-manifest-C-q02Pal.js} +2 -4
  147. package/dist/{parse-local-manifest-JLnaBH0S.d.ts → parse-local-manifest-DvYUR0QL.d.ts} +1 -1
  148. package/dist/pdp/index.d.ts +2 -2
  149. package/dist/pdp/index.js +8 -9
  150. package/dist/{permdock-CbgvLnuo.js → permdock-L26udHSk.js} +1387 -1220
  151. package/dist/{rls-fields-74oZPXWL.js → permission-keys-B26jeyUv.js} +1289 -2066
  152. package/dist/permission-registry-BsblpB-z.js +385 -0
  153. package/dist/{permissions-DttnqqxC.d.ts → permission-types-Dg39z9Kv.d.ts} +59 -31
  154. package/dist/{permissions-RJrovw98.js → permissions-CCJ6lmxB.js} +3 -3
  155. package/dist/{permissions-CDgvKG5L.d.ts → permissions-COH-KRgT.d.ts} +2 -2
  156. package/dist/{policy-IB6yxpC3.d.ts → policy-types-sp9P1iIV.d.ts} +661 -582
  157. package/dist/{policy-D2W7uv19.d.ts → policy-ur0BBK_e.d.ts} +2 -2
  158. package/dist/{powersync-DliZK_-y.js → powersync-BFSbSElQ.js} +2 -2
  159. package/dist/powersync-DCDgZgfZ.js +2 -0
  160. package/dist/{powersync-BylawD_U.js → powersync-cZe4kzhL.js} +26 -27
  161. package/dist/prisma/index.d.ts +1 -1
  162. package/dist/prisma/index.js +6 -12
  163. package/dist/{problem-B43ztKIm.js → problem-CnWraVhC.js} +8 -7
  164. package/dist/{problem-details-_AMOYz-w.js → problem-details-DECUnXAn.js} +2 -2
  165. package/dist/{problem-details-DX075l9V.d.ts → problem-details-rIIo8B2C.d.ts} +1 -1
  166. package/dist/{protected-BdnIEFkY.d.ts → protected-B3_P7xuw.d.ts} +9 -6
  167. package/dist/{protected-utU-SLuy.js → protected-BN7BUdY1.js} +20 -8
  168. package/dist/{provider-CSQd7m92.js → provider-Bi-0HNL3.js} +23 -10
  169. package/dist/{provider-DZY281jO.d.ts → provider-kwHC9CZD.d.ts} +1 -1
  170. package/dist/{provider-store-Cfbvo4DE.js → provider-store-Ctt-81Ni.js} +6 -3
  171. package/dist/react/index.d.ts +7 -7
  172. package/dist/react/index.js +5 -5
  173. package/dist/react/provider-client.d.ts +1 -1
  174. package/dist/react/provider-client.js +1 -1
  175. package/dist/react-native/index.d.ts +20 -11
  176. package/dist/react-native/index.js +33 -17
  177. package/dist/{refs-KYb4ntaz.js → refs-f3imMjNW.js} +1 -1
  178. package/dist/relation-walk-BXnlLtg2.js +186 -0
  179. package/dist/relations-CvmSpG67.js +163 -0
  180. package/dist/{replay-CYyiLiwO.d.ts → replay-COpmZUfx.d.ts} +1 -1
  181. package/dist/request-context-BVM7aWNs.js +71 -0
  182. package/dist/request-context-C2_1lchh.d.ts +5 -0
  183. package/dist/resource-relations-D1Un3pcz.js +243 -0
  184. package/dist/retire-BFcxL6un.js +240 -0
  185. package/dist/{rls-B4ur8nKQ.js → rls-55DQTuf5.js} +14 -2
  186. package/dist/{rls-DQtdgTHB.js → rls-BEktUaqg.js} +884 -484
  187. package/dist/{policy-xyWg7QdR.js → role-builder-B4GbKM-i.js} +235 -541
  188. package/dist/{rpc-DL9Sqvb1.js → rpc-nYC3cR_u.js} +15 -5
  189. package/dist/{run-DKDbM4Du.js → run-DMcNW_8T.js} +3 -3
  190. package/dist/{runtime-CB8gQFvS.js → runtime-D_tMXnsq.js} +1 -1
  191. package/dist/{saas-DhpJjnBA.js → saas-DtaA4JuW.js} +9 -8
  192. package/dist/{openapi-schema--ARjyfQr.js → schema-Bol6gqXA.js} +3 -5
  193. package/dist/{schema-D3MnDMxa.js → schema-DjQBcAP9.js} +4 -2
  194. package/dist/scim/index.d.ts +1 -1
  195. package/dist/scim/index.js +1 -1
  196. package/dist/{scim-BFGBBAqR.js → scim-vFR1O5oG.js} +6 -12
  197. package/dist/{scopes-CVdPrWN-.js → scopes-tvpa34ep.js} +10 -2
  198. package/dist/server/index.d.ts +18 -8
  199. package/dist/server/index.js +8 -8
  200. package/dist/{server-DlZ28Oz5.js → server-ZYEHtNHS.js} +4 -4
  201. package/dist/{create-B1d519XK.d.ts → server-types-DdqBwZN_.d.ts} +69 -33
  202. package/dist/shared-1uhI-e-b.js +294 -0
  203. package/dist/{shared-DRu8VFVM.js → shared-JhMeOsDF.js} +1 -1
  204. package/dist/{sink-Bd9PSyfq.js → sink-BTtmfPnE.js} +1 -1
  205. package/dist/{sink-B1fZzIMf.d.ts → sink-CPN4zLfs.d.ts} +1 -1
  206. package/dist/{skills-Biq5uup3.js → skills-BZdRQkxs.js} +4 -3
  207. package/dist/{skills-Bx-U0irG.js → skills-Dle4ZoLF.js} +2 -2
  208. package/dist/{snapshot-Enxd0n-s.js → snapshot-Dc9CHPME.js} +116 -13
  209. package/dist/{snapshot-cache-D6jLelln.js → snapshot-cache-Cod40D-X.js} +1 -1
  210. package/dist/{snapshot-cache-B-LxUahj.d.ts → snapshot-cache-J5T7t_vD.d.ts} +1 -1
  211. package/dist/solid/index.d.ts +22 -22
  212. package/dist/solid/index.js +40 -10
  213. package/dist/{sources-4p0-4xQm.js → sources-B1-b-R0t.js} +25 -26
  214. package/dist/{sources-BdOYLw9j.d.ts → sources-Dljy06zL.d.ts} +6 -2
  215. package/dist/{sql-xdg5f4Fi.js → sql-t8teWOfo.js} +19 -3
  216. package/dist/{src-BDwEZWrZ.js → src-Bb7no-hS.js} +194 -123
  217. package/dist/ssf/index.d.ts +3 -3
  218. package/dist/ssf/index.js +58 -61
  219. package/dist/store-9KO4BlkB.d.ts +147 -0
  220. package/dist/{store-DMAWwAJV.js → store-ILkLUj_o.js} +4 -4
  221. package/dist/{store-options-ByhZq1jV.js → store-options-CbUHDoSe.js} +16 -7
  222. package/dist/{stores-BT2pSCub.js → stores-BHXdSbw9.js} +7 -3
  223. package/dist/stores-Cxz_80g-.d.ts +31 -0
  224. package/dist/{stream-DDpvynSB.js → stream-BMui98KK.js} +2 -1
  225. package/dist/{stream-D1RXubw2.d.ts → stream-Dwsg6WwE.d.ts} +2 -2
  226. package/dist/{subject-settings-BwBmCdTR.js → subject-settings-CkEwrw3W.js} +23 -5
  227. package/dist/supabase/index.d.ts +4 -4
  228. package/dist/supabase/index.js +3 -3
  229. package/dist/supabase/middleware.d.ts +11 -5
  230. package/dist/supabase/middleware.js +10 -7
  231. package/dist/{supabase-C0qESOa-.js → supabase-C1TWlnYt.js} +36 -52
  232. package/dist/{supabase-Boqb9a_Y.js → supabase-Dbqr141s.js} +2 -2
  233. package/dist/supabase-hook-BULg7Ut_.js +2 -0
  234. package/dist/{supabase-hook-CSLQ4zJ3.js → supabase-hook-Cva3ikXz.js} +731 -782
  235. package/dist/{supautils-Cn4R4cJ4.js → supautils-B6HYL9eL.js} +2 -2
  236. package/dist/svelte/Protected.svelte +9 -2
  237. package/dist/svelte/index.d.ts +6 -6
  238. package/dist/svelte/index.js +25 -11
  239. package/dist/svelte/runtime.d.ts +10 -3
  240. package/dist/svelte/runtime.js +4 -3
  241. package/dist/svelte/source.d.ts +6 -6
  242. package/dist/svelte/source.js +4 -4
  243. package/dist/{validity-uOp8UpYn.js → tenancy-DshjqY0n.js} +3 -39
  244. package/dist/terminal/index.d.ts +5 -5
  245. package/dist/terminal/index.js +18 -34
  246. package/dist/testing/index.d.ts +89 -77
  247. package/dist/testing/index.js +1276 -1262
  248. package/dist/testing/saas/index.d.ts +4 -4
  249. package/dist/testing/saas/index.js +2 -2
  250. package/dist/testing/saas/permissions.d.ts +1 -1
  251. package/dist/testing/saas/permissions.js +1 -1
  252. package/dist/thenable-QSmvt-vZ.js +65 -0
  253. package/dist/{token-CIWxJOCh.js → token-Bx9qy30p.js} +1 -1
  254. package/dist/tool-refusal-CQ7OEia9.js +41 -0
  255. package/dist/trpc/index.d.ts +5 -5
  256. package/dist/trpc/index.js +7 -8
  257. package/dist/{types-DbjRN55U.d.ts → types-7rJVLWe5.d.ts} +82 -4
  258. package/dist/{types-aqOHTHcp.d.ts → types-Br9IXUBG.d.ts} +1 -1
  259. package/dist/types-ByUo56un.d.ts +88 -0
  260. package/dist/{types-Cq_H8N_X.d.ts → types-C0dee0Qf.d.ts} +2 -2
  261. package/dist/{types-DxiCGmmd.d.ts → types-CIlTojhq.d.ts} +2 -2
  262. package/dist/{types-QCuYJh4q.d.ts → types-CUcFZfpU.d.ts} +1 -1
  263. package/dist/{types-C97IskBw.d.ts → types-CqrjB9o6.d.ts} +1 -1
  264. package/dist/{types-BnIEz1sU.d.ts → types-DHrmBJLH.d.ts} +24 -6
  265. package/dist/{types-Dnemwd77.d.ts → types-DpWfQdSh.d.ts} +5 -1
  266. package/dist/{types-Bvc4oWT6.d.ts → types-DvupZE0w.d.ts} +1 -1
  267. package/dist/unplugin/index.d.ts +1 -1
  268. package/dist/unplugin/index.js +1 -1
  269. package/dist/{usage-GTixvDDU.js → usage-4G6t643F.js} +2 -2
  270. package/dist/{usage-ItS7nLcl.js → usage-CG9nOYZw.js} +7 -7
  271. package/dist/usage-iFLJ0-rr.js +2 -0
  272. package/dist/{validation-error-Ba264OaJ.d.ts → validation-error-BSSw0l_8.d.ts} +1 -1
  273. package/dist/{validation-error-CnjZ4t92.js → validation-error-ZfUHbKvf.js} +1 -1
  274. package/dist/validity-dVrUEPJt.js +62 -0
  275. package/dist/{verifier-BxBo6I44.js → verifier-DMr_Zmb_.js} +51 -15
  276. package/dist/{rls-verify-CVQTHTh5.js → verify-BztUB3GX.js} +668 -239
  277. package/dist/{version-BvacVTZR.js → version-BEogC-rB.js} +1 -1
  278. package/dist/{views-Soe7bGSC.js → views-CJsrBS1f.js} +23 -1
  279. package/dist/{vocabulary-DA8a8zif.d.ts → vocabulary-hhEFLFoL.d.ts} +15 -6
  280. package/dist/vue/index.d.ts +24 -19
  281. package/dist/vue/index.js +24 -8
  282. package/dist/watch-C8TpsAl4.js +2 -0
  283. package/dist/{watch-DVBJ9cBq.js → watch-zeucB7eF.js} +6 -6
  284. package/dist/webmcp/index.d.ts +2 -2
  285. package/dist/webmcp/index.js +13 -37
  286. package/dist/wrap-Cr93qqdP.d.ts +14 -0
  287. package/dist/wrap-DWsU_5Bd.js +26 -0
  288. package/package.json +8 -8
  289. package/schemas/catalog-v1.json +6 -0
  290. package/skills/permdock-credentials/SKILL.md +1 -1
  291. package/skills/permdock-credentials/references/tokens-keys-links.md +7 -2
  292. package/skills/permdock-data/references/queries-and-rls.md +4 -0
  293. package/skills/permdock-tenancy/references/ownership-and-custom-roles.md +1 -0
  294. package/skills/permdock-wire/SKILL.md +2 -2
  295. package/skills/permdock-wire/references/adapters.md +9 -1
  296. package/skills/permdock-wire/references/policy-options.md +10 -1
  297. package/dist/catalog-CRW5Mx_B.js +0 -2
  298. package/dist/collect-DSWOk19R.js +0 -2
  299. package/dist/create-CMwIl-w2.js +0 -253
  300. package/dist/delegation-D8pUEuce.js +0 -103
  301. package/dist/doctor-collect-CHk6XWOA.js +0 -665
  302. package/dist/doctor-igIiM_Hl.js +0 -1194
  303. package/dist/evaluation-items-CfCCejQd.js +0 -40
  304. package/dist/fields-BMl1RxoX.js +0 -26
  305. package/dist/grantee-Cv5Sogfv.js +0 -602
  306. package/dist/hosted-DJQw46hn.js +0 -266
  307. package/dist/instance-options-Dhhcnm3y.js +0 -22
  308. package/dist/load-DwJUafYN.js +0 -2
  309. package/dist/map-AcxK9o_D.js +0 -147
  310. package/dist/permissions-DVoF6dMt.js +0 -662
  311. package/dist/powersync-e_AZrKbg.js +0 -2
  312. package/dist/protected-xAr24FEC.d.ts +0 -40
  313. package/dist/relations-cjOL01hZ.js +0 -505
  314. package/dist/rls-graph-CHwx0V8q.js +0 -435
  315. package/dist/rls-shared-Cewd_-zI.js +0 -495
  316. package/dist/store-jOBYpiXC.d.ts +0 -36
  317. package/dist/stores-C0IMQrGI.d.ts +0 -52
  318. package/dist/supabase-config-BpPXt3x1.js +0 -472
  319. package/dist/supabase-hook-6sYLXg_u.js +0 -2
  320. package/dist/thenable-okc2xDsj.js +0 -10
  321. package/dist/types-CKNSyIf_.d.ts +0 -52
  322. package/dist/usage-DorAJiU_.js +0 -2
  323. package/dist/watch-BwxLTYMZ.js +0 -2
@@ -1,14 +1,16 @@
1
+ import { r as isRecord } from "../compact-CAf557ZB.js";
1
2
  import { n as freezeDeep } from "../freeze-CrU8nQeX.js";
2
- import { _ as listPermissions, p as isPermission } from "../permissions-DVoF6dMt.js";
3
- import { d as scopeList } from "../scopes-CVdPrWN-.js";
3
+ import { d as scopeList } from "../scopes-tvpa34ep.js";
4
+ import { c as listPermissions, o as isPermission } from "../permission-registry-BsblpB-z.js";
5
+ import { t as createPermDock } from "../permdock-L26udHSk.js";
4
6
  import { t as anonymousSubject } from "../subject-C6dLxqHU.js";
5
- import { t as mayUse } from "../may-use-DndQ5tQ-.js";
6
- import { o as parseCredential, r as credentialSubject } from "../credential-8P81ff4u.js";
7
+ import { t as mayUse } from "../may-use-BOn_dR_w.js";
8
+ import { o as parseCredential, r as credentialSubject } from "../credential-kue0qpbm.js";
7
9
  import { t as policyRowConditionKeys } from "../row-conditions-h2HythXQ.js";
8
- import { i as quoteSqlLiteral, o as sqlIdent } from "../sql-xdg5f4Fi.js";
9
- import "../sources-4p0-4xQm.js";
10
- import { o as subjectFromSupabaseSession, t as parseSupabaseManifest } from "../manifest-iaoBXHKc.js";
11
- import { t as parseCatalog } from "../parse-BuyjxhZV.js";
10
+ import { c as sqlIdent, o as quoteSqlLiteral } from "../sql-t8teWOfo.js";
11
+ import "../sources-B1-b-R0t.js";
12
+ import { o as subjectFromSupabaseSession, t as parseSupabaseManifest } from "../manifest-BngWKryL.js";
13
+ import { t as parseCatalog } from "../parse-CVFQHk6c.js";
12
14
  import { AsyncResult, dbError } from "better-supabase";
13
15
  //#region src/better-supabase/provider.ts
14
16
  /**
@@ -314,93 +316,6 @@ function authorizationProvider(options) {
314
316
  });
315
317
  }
316
318
  //#endregion
317
- //#region src/better-supabase/policies.ts
318
- /** PermDock splits a key with row conditions into `key#1`, `key#2`, ... in the policies it generates. */
319
- const SPLIT_KEY = /#\d+$/u;
320
- function checkedKey(where, permission, facts, scope) {
321
- const key = permission.key;
322
- if (SPLIT_KEY.test(key)) throw new TypeError(`PermDock: ${where} "${key}" is one part of a permission split by row condition. Use the policies \`permdock rls generate\` writes for it.`);
323
- const entry = facts(key);
324
- if (!entry.known) throw new TypeError(`PermDock: ${where} "${key}" is not in permissions.catalog.json. Run \`permdock catalog\`.`);
325
- if (entry.rowConditions) throw new TypeError(`PermDock: ${where} "${key}" has row conditions (rowConditions: true), which the SQL helpers don't check, so the policy would grant every object in the scope. Use the policies \`permdock rls generate\` writes for it.`);
326
- const grantScope = scope === "platform" ? "global" : scope;
327
- const scopes = entry.grantScopes;
328
- if (scopes.length > 0 && !scopes.includes(grantScope)) throw new TypeError(`PermDock: ${where} "${key}" is granted at ${[...new Set(scopes)].join(", ")}, not at ${grantScope}. Check it at one of those scopes.`);
329
- return key;
330
- }
331
- function target(options) {
332
- const policy = options.policy;
333
- let names;
334
- let schemaName;
335
- let facts;
336
- if (policy === void 0) {
337
- const manifest = parseSupabaseManifest(options.manifest);
338
- const catalog = parseCatalog(options.catalog);
339
- names = manifest.rls.scopes.map((scope) => scope.name);
340
- schemaName = manifest.rls.schema;
341
- facts = (key) => {
342
- const entry = catalog.permissions.find((candidate) => candidate.key === key);
343
- return {
344
- known: entry !== void 0,
345
- rowConditions: entry?.rowConditions === true,
346
- grantScopes: (catalog.grants ?? []).flatMap((grant) => grant.permission === key && typeof grant.scope === "string" ? [grant.scope] : [])
347
- };
348
- };
349
- } else {
350
- names = scopeList(policy.scopes).map((scope) => scope.name);
351
- schemaName = options.schema ?? "permdock";
352
- const conditioned = policyRowConditionKeys(policy);
353
- facts = (key) => ({
354
- known: true,
355
- rowConditions: conditioned.has(key),
356
- grantScopes: policy.grants.flatMap((grant) => grant.hosted === void 0 && grant.permission.key === key && typeof grant.scope === "string" ? [grant.scope] : [])
357
- });
358
- }
359
- if (options.scope !== "platform" && !names.includes(options.scope)) throw new TypeError(`PermDock: scope "${options.scope}" is not in the ${policy === void 0 ? "manifest's rls.scopes" : "policy's scopes"} (${names.join(", ")}) and is not "platform".`);
360
- const schema = sqlIdent(schemaName);
361
- return {
362
- facts,
363
- sql: {
364
- idsWith: `${schema}.permitted_{scope}_ids_by_permission({permission})`,
365
- isPlatform: `${schema}.permdock_has_permission({permission})`
366
- }
367
- };
368
- }
369
- /**
370
- * A better-supabase bucket `policy` that checks PermDock permissions with
371
- * the `rls generate` helpers at `scope`. The helpers check role and scope
372
- * only, so a permission with row conditions (`rowConditions: true` in the
373
- * catalog, or a conditioned grant in `policy`), or one not granted at
374
- * `scope`, throws.
375
- */
376
- function bucketPolicy(access, options) {
377
- const { facts, sql } = target(options);
378
- const key = (name, permission) => checkedKey(`bucket access.${name}`, permission, facts, options.scope);
379
- return freezeDeep({
380
- access: {
381
- read: key("read", access.read),
382
- ...access.list ? { list: key("list", access.list) } : {},
383
- write: key("write", access.write),
384
- ...access.delete ? { delete: key("delete", access.delete) } : {}
385
- },
386
- scope: options.scope,
387
- ...options.segment === void 0 ? {} : { segment: options.segment },
388
- sql
389
- });
390
- }
391
- /** As {@link bucketPolicy}, for a better-supabase Realtime topic. */
392
- function topicPolicy(access, options) {
393
- const { facts, sql } = target(options);
394
- const key = (name, permission) => checkedKey(`topic ${name}`, permission, facts, options.scope);
395
- return freezeDeep({
396
- receive: key("receive", access.receive),
397
- ...access.send ? { send: key("send", access.send) } : {},
398
- scope: options.scope,
399
- ...options.segment === void 0 ? {} : { segment: options.segment },
400
- sql
401
- });
402
- }
403
- //#endregion
404
319
  //#region src/better-supabase/api-keys.ts
405
320
  const seconds = (instant) => Math.floor(instant.epochMilliseconds / 1e3);
406
321
  /** When a key stops verifying: its expiry, or the end of a rotated key's grace period. */
@@ -508,6 +423,252 @@ function apiKeyClaimOptions(manifest) {
508
423
  });
509
424
  }
510
425
  //#endregion
426
+ //#region src/better-supabase/subject.ts
427
+ /** `session` with the short codes in `claim` turned back into feature keys. */
428
+ function decodedFeatures(session, claim, keys) {
429
+ const claims = session?.claims;
430
+ if (session === null || session === void 0 || !isRecord(claims)) return session;
431
+ const coded = claims[claim];
432
+ if (!isRecord(coded)) return session;
433
+ const byCode = new Map(Object.entries(keys).map(([key, code]) => [code, key]));
434
+ const decoded = Object.fromEntries(Object.entries(coded).map(([tenant, codes]) => [tenant, Array.isArray(codes) ? codes.flatMap((code) => {
435
+ const key = typeof code === "string" ? byCode.get(code) : void 0;
436
+ return key === void 0 ? [] : [key];
437
+ }) : codes]));
438
+ return {
439
+ ...session,
440
+ claims: {
441
+ ...claims,
442
+ [claim]: decoded
443
+ }
444
+ };
445
+ }
446
+ function isApiKeySession(session) {
447
+ if (typeof session !== "object" || session === null) return false;
448
+ const record = Object.fromEntries(Object.entries(session));
449
+ return record["kind"] === "apiKey" && typeof record["keyId"] === "string" && typeof record["name"] === "string" && Array.isArray(record["scopes"]) && record["scopes"].every((scope) => typeof scope === "string");
450
+ }
451
+ function apiKeySubject(session, options) {
452
+ const roles = typeof options.serviceRoles === "function" ? options.serviceRoles(session) : options.serviceRoles ?? manifestServiceRoles(options.manifest);
453
+ const credential = keyCredential({
454
+ id: session.keyId,
455
+ name: session.name,
456
+ scopes: session.scopes,
457
+ ...session.organizationId === void 0 ? {} : { organizationId: session.organizationId },
458
+ ...session.userId === void 0 ? {} : { userId: session.userId },
459
+ ...session.createdBy === void 0 ? {} : { createdBy: session.createdBy },
460
+ ...session.createdAt === void 0 ? {} : { createdAt: session.createdAt }
461
+ }, roles, listPermissions(options.permissions));
462
+ return credential === null ? anonymousSubject() : credentialSubject(credential, { permissions: options.permissions });
463
+ }
464
+ /**
465
+ * `subjectFromSupabaseSession` for better-supabase's `AuthSession`, reading
466
+ * `memberships` for the memberships and the entitlements module's `features`
467
+ * claim for `principal.plans` (`plans` names another claim). With `apiKeys`,
468
+ * a verified `apiKey` session is the key's credential subject: a personal key
469
+ * acts as its user within the key's scopes, a tenant key as a `service`
470
+ * principal holding `serviceRoles`. Without `apiKeys`, and for `anon`,
471
+ * `service` and `invalid` sessions, the subject is anonymous.
472
+ */
473
+ function subjectFromBetterSupabase(session, options = {}) {
474
+ const { apiKeys, plans = "features", ...rest } = options;
475
+ if (isApiKeySession(session)) return apiKeys === void 0 ? anonymousSubject() : apiKeySubject(session, apiKeys);
476
+ const claim = typeof plans === "string" ? plans : plans.claim ?? "features";
477
+ const keys = typeof plans === "string" ? void 0 : plans.keys;
478
+ return subjectFromSupabaseSession(keys === void 0 ? session : decodedFeatures(session, claim, keys), {
479
+ memberships: "memberships",
480
+ ...rest,
481
+ plans: claim
482
+ });
483
+ }
484
+ //#endregion
485
+ //#region src/better-supabase/authorizer.ts
486
+ const OPERATIONS = /* @__PURE__ */ new Set([
487
+ "list",
488
+ "get",
489
+ "create",
490
+ "update",
491
+ "delete"
492
+ ]);
493
+ const denied = (reason) => ({
494
+ outcome: "denied",
495
+ reason
496
+ });
497
+ function outcomeOf(decision, key) {
498
+ switch (decision.outcome) {
499
+ case "granted": return { outcome: "granted" };
500
+ case "approval-required": return {
501
+ outcome: "approval-required",
502
+ approval: { id: decision.token }
503
+ };
504
+ case "denied": {
505
+ const why = decision.denials[0]?.reason;
506
+ return denied(why === void 0 ? `PermDock denied ${key}.` : `PermDock denied ${key}: ${why}.`);
507
+ }
508
+ default: return decision;
509
+ }
510
+ }
511
+ function decideWith(permdock, request) {
512
+ const { action } = request;
513
+ if (!isPermission(action)) return denied("Unknown permission.");
514
+ return outcomeOf(permdock.decide(action, request.resource.properties), action.key);
515
+ }
516
+ /** The verified claims better-supabase passes in `subject.properties.claims`, for a user or a delegated agent. */
517
+ function claimsOf(request) {
518
+ const { subject } = request;
519
+ if (subject.type !== "user" && subject.type !== "agent") return void 0;
520
+ const claims = subject.properties?.["claims"];
521
+ return isRecord(claims) ? claims : void 0;
522
+ }
523
+ /**
524
+ * better-supabase's `authorizer` for PermDock: every resource, action, route
525
+ * guard and MCP tool that declares a `permission` is decided with `decide`.
526
+ * The subject is mapped from the verified claims with
527
+ * `subjectFromBetterSupabase`; the request's `context.tenant` selects the
528
+ * active tenant only among the memberships the claims hold. A caller without
529
+ * claims is anonymous, and a throw denies.
530
+ */
531
+ function authorizer(options) {
532
+ const { operations } = options;
533
+ const instanceFor = async (claims, tenant) => {
534
+ const session = claims === void 0 ? null : {
535
+ kind: "user",
536
+ claims
537
+ };
538
+ const base = await createPermDock(options.policy, subjectFromBetterSupabase(session, options.subject), options.options);
539
+ return typeof tenant === "string" ? base.tenant(tenant) : base;
540
+ };
541
+ return Object.freeze({
542
+ apiVersion: 1,
543
+ name: "PermDock",
544
+ key(ref) {
545
+ if (!isPermission(ref)) throw new TypeError("Not a PermDock permission");
546
+ return ref.key;
547
+ },
548
+ ...operations === void 0 ? {} : { forOperation(table, operation) {
549
+ if (!OPERATIONS.has(operation) || !Object.hasOwn(operations, table)) return void 0;
550
+ return operations[table]?.[operation];
551
+ } },
552
+ async evaluate(request) {
553
+ try {
554
+ return decideWith(await instanceFor(claimsOf(request), request.context["tenant"]), request);
555
+ } catch {
556
+ return denied("The permission check failed.");
557
+ }
558
+ },
559
+ evaluations(requests) {
560
+ const cache = /* @__PURE__ */ new Map();
561
+ const shared = (claims, tenant) => {
562
+ let byTenant = cache.get(claims);
563
+ if (byTenant === void 0) {
564
+ byTenant = /* @__PURE__ */ new Map();
565
+ cache.set(claims, byTenant);
566
+ }
567
+ let instance = byTenant.get(tenant);
568
+ if (instance === void 0) {
569
+ instance = instanceFor(claims, tenant);
570
+ byTenant.set(tenant, instance);
571
+ }
572
+ return instance;
573
+ };
574
+ return Promise.all(requests.map(async (request) => {
575
+ try {
576
+ return decideWith(await shared(claimsOf(request), request.context["tenant"]), request);
577
+ } catch {
578
+ return denied("The permission check failed.");
579
+ }
580
+ }));
581
+ }
582
+ });
583
+ }
584
+ //#endregion
585
+ //#region src/better-supabase/policies.ts
586
+ /** PermDock splits a key with row conditions into `key#1`, `key#2`, ... in the policies it generates. */
587
+ const SPLIT_KEY = /#\d+$/u;
588
+ function checkedKey(where, permission, facts, scope) {
589
+ const key = permission.key;
590
+ if (SPLIT_KEY.test(key)) throw new TypeError(`PermDock: ${where} "${key}" is one part of a permission split by row condition. Use the policies \`permdock rls generate\` writes for it.`);
591
+ const entry = facts(key);
592
+ if (!entry.known) throw new TypeError(`PermDock: ${where} "${key}" is not in permissions.catalog.json. Run \`permdock catalog\`.`);
593
+ if (entry.rowConditions) throw new TypeError(`PermDock: ${where} "${key}" has row conditions (rowConditions: true), which the SQL helpers don't check, so the policy would grant every object in the scope. Use the policies \`permdock rls generate\` writes for it.`);
594
+ const grantScope = scope === "platform" ? "global" : scope;
595
+ const scopes = entry.grantScopes;
596
+ if (scopes.length > 0 && !scopes.includes(grantScope)) throw new TypeError(`PermDock: ${where} "${key}" is granted at ${[...new Set(scopes)].join(", ")}, not at ${grantScope}. Check it at one of those scopes.`);
597
+ return key;
598
+ }
599
+ function target(options) {
600
+ const policy = options.policy;
601
+ let names;
602
+ let schemaName;
603
+ let facts;
604
+ if (policy === void 0) {
605
+ const manifest = parseSupabaseManifest(options.manifest);
606
+ const catalog = parseCatalog(options.catalog);
607
+ names = manifest.rls.scopes.map((scope) => scope.name);
608
+ schemaName = manifest.rls.schema;
609
+ facts = (key) => {
610
+ const entry = catalog.permissions.find((candidate) => candidate.key === key);
611
+ return {
612
+ known: entry !== void 0,
613
+ rowConditions: entry?.rowConditions === true,
614
+ grantScopes: (catalog.grants ?? []).flatMap((grant) => grant.permission === key && typeof grant.scope === "string" ? [grant.scope] : [])
615
+ };
616
+ };
617
+ } else {
618
+ names = scopeList(policy.scopes).map((scope) => scope.name);
619
+ schemaName = options.schema ?? "permdock";
620
+ const conditioned = policyRowConditionKeys(policy);
621
+ facts = (key) => ({
622
+ known: true,
623
+ rowConditions: conditioned.has(key),
624
+ grantScopes: policy.grants.flatMap((grant) => grant.hosted === void 0 && grant.permission.key === key && typeof grant.scope === "string" ? [grant.scope] : [])
625
+ });
626
+ }
627
+ if (options.scope !== "platform" && !names.includes(options.scope)) throw new TypeError(`PermDock: scope "${options.scope}" is not in the ${policy === void 0 ? "manifest's rls.scopes" : "policy's scopes"} (${names.join(", ")}) and is not "platform".`);
628
+ const schema = sqlIdent(schemaName);
629
+ return {
630
+ facts,
631
+ sql: {
632
+ idsWith: `${schema}.permitted_{scope}_ids_by_permission({permission})`,
633
+ isPlatform: `${schema}.permdock_has_permission({permission})`
634
+ }
635
+ };
636
+ }
637
+ /**
638
+ * A better-supabase bucket `policy` that checks PermDock permissions with
639
+ * the `rls generate` helpers at `scope`. The helpers check role and scope
640
+ * only, so a permission with row conditions (`rowConditions: true` in the
641
+ * catalog, or a conditioned grant in `policy`), or one not granted at
642
+ * `scope`, throws.
643
+ */
644
+ function bucketPolicy(access, options) {
645
+ const { facts, sql } = target(options);
646
+ const key = (name, permission) => checkedKey(`bucket access.${name}`, permission, facts, options.scope);
647
+ return freezeDeep({
648
+ access: {
649
+ read: key("read", access.read),
650
+ ...access.list ? { list: key("list", access.list) } : {},
651
+ write: key("write", access.write),
652
+ ...access.delete ? { delete: key("delete", access.delete) } : {}
653
+ },
654
+ scope: options.scope,
655
+ ...options.segment === void 0 ? {} : { segment: options.segment },
656
+ sql
657
+ });
658
+ }
659
+ /** As {@link bucketPolicy}, for a better-supabase Realtime topic. */
660
+ function topicPolicy(access, options) {
661
+ const { facts, sql } = target(options);
662
+ const key = (name, permission) => checkedKey(`topic ${name}`, permission, facts, options.scope);
663
+ return freezeDeep({
664
+ receive: key("receive", access.receive),
665
+ ...access.send ? { send: key("send", access.send) } : {},
666
+ scope: options.scope,
667
+ ...options.segment === void 0 ? {} : { segment: options.segment },
668
+ sql
669
+ });
670
+ }
671
+ //#endregion
511
672
  //#region src/better-supabase/credentials.ts
512
673
  /**
513
674
  * `provider` with every `getToken`, `startAuthorization`,
@@ -585,64 +746,4 @@ function toolPolicy(options) {
585
746
  });
586
747
  }
587
748
  //#endregion
588
- //#region src/better-supabase/subject.ts
589
- const isRecord = (value) => typeof value === "object" && value !== null && !Array.isArray(value);
590
- /** `session` with the short codes in `claim` turned back into feature keys. */
591
- function decodedFeatures(session, claim, keys) {
592
- const claims = session?.claims;
593
- if (session === null || session === void 0 || !isRecord(claims)) return session;
594
- const coded = claims[claim];
595
- if (!isRecord(coded)) return session;
596
- const byCode = new Map(Object.entries(keys).map(([key, code]) => [code, key]));
597
- const decoded = Object.fromEntries(Object.entries(coded).map(([tenant, codes]) => [tenant, Array.isArray(codes) ? codes.flatMap((code) => {
598
- const key = typeof code === "string" ? byCode.get(code) : void 0;
599
- return key === void 0 ? [] : [key];
600
- }) : codes]));
601
- return {
602
- ...session,
603
- claims: {
604
- ...claims,
605
- [claim]: decoded
606
- }
607
- };
608
- }
609
- function isApiKeySession(session) {
610
- if (typeof session !== "object" || session === null) return false;
611
- const record = Object.fromEntries(Object.entries(session));
612
- return record["kind"] === "apiKey" && typeof record["keyId"] === "string" && typeof record["name"] === "string" && Array.isArray(record["scopes"]) && record["scopes"].every((scope) => typeof scope === "string");
613
- }
614
- function apiKeySubject(session, options) {
615
- const roles = typeof options.serviceRoles === "function" ? options.serviceRoles(session) : options.serviceRoles ?? manifestServiceRoles(options.manifest);
616
- const credential = keyCredential({
617
- id: session.keyId,
618
- name: session.name,
619
- scopes: session.scopes,
620
- ...session.organizationId === void 0 ? {} : { organizationId: session.organizationId },
621
- ...session.userId === void 0 ? {} : { userId: session.userId },
622
- ...session.createdBy === void 0 ? {} : { createdBy: session.createdBy },
623
- ...session.createdAt === void 0 ? {} : { createdAt: session.createdAt }
624
- }, roles, listPermissions(options.permissions));
625
- return credential === null ? anonymousSubject() : credentialSubject(credential, { permissions: options.permissions });
626
- }
627
- /**
628
- * `subjectFromSupabaseSession` for better-supabase's `AuthSession`, reading
629
- * `memberships` for the memberships and the entitlements module's `features`
630
- * claim for `principal.plans` (`plans` names another claim). With `apiKeys`,
631
- * a verified `apiKey` session is the key's credential subject: a personal key
632
- * acts as its user within the key's scopes, a tenant key as a `service`
633
- * principal holding `serviceRoles`. Without `apiKeys`, and for `anon`,
634
- * `service` and `invalid` sessions, the subject is anonymous.
635
- */
636
- function subjectFromBetterSupabase(session, options = {}) {
637
- const { apiKeys, plans = "features", ...rest } = options;
638
- if (isApiKeySession(session)) return apiKeys === void 0 ? anonymousSubject() : apiKeySubject(session, apiKeys);
639
- const claim = typeof plans === "string" ? plans : plans.claim ?? "features";
640
- const keys = typeof plans === "string" ? void 0 : plans.keys;
641
- return subjectFromSupabaseSession(keys === void 0 ? session : decodedFeatures(session, claim, keys), {
642
- memberships: "memberships",
643
- ...rest,
644
- plans: claim
645
- });
646
- }
647
- //#endregion
648
- export { apiKeyClaimOptions, apiKeyVerifier, authorizationProvider, bucketPolicy, credentialGuard, subjectFromBetterSupabase, toolPolicy, topicPolicy };
749
+ export { apiKeyClaimOptions, apiKeyVerifier, authorizationProvider, authorizer, bucketPolicy, credentialGuard, subjectFromBetterSupabase, toolPolicy, topicPolicy };
@@ -1,8 +1,10 @@
1
- import { f as ApprovalStore } from "./types-aqOHTHcp.js";
2
- import { t as InstanceOptions } from "./instance-options-jARdwfPN.js";
3
- import { r as PdpFactory } from "./types-DxiCGmmd.js";
4
- import { o as OtelWrap } from "./types-QCuYJh4q.js";
5
- import { T as TenantOption, b as WebBotAuthVerifier } from "./create-B1d519XK.js";
1
+ import { f as ApprovalStore } from "./types-Br9IXUBG.js";
2
+ import { t as InstanceOptions } from "./instance-options-plkrsAog.js";
3
+ import { t as RequestContext } from "./request-context-C2_1lchh.js";
4
+ import { n as PermDockWrap } from "./wrap-Cr93qqdP.js";
5
+ import { r as PdpFactory } from "./types-CIlTojhq.js";
6
+ import { T as TenantOption, n as OnDenied, y as WebBotAuthVerifier } from "./server-types-DdqBwZN_.js";
7
+ import { o as OtelWrap } from "./types-CUcFZfpU.js";
6
8
  //#region src/server/bind.d.ts
7
9
  /** The options of every framework adapter; `TContext` is what its callbacks receive. */
8
10
  type ServerAdapterOptions<TContext, TUser = unknown> = InstanceOptions & ServerAdapterServices & {
@@ -10,6 +12,11 @@ type ServerAdapterOptions<TContext, TUser = unknown> = InstanceOptions & ServerA
10
12
  /** The agent or service acting for the subject; anything but an `Actor` is ignored. */
11
13
  readonly actor?: (context: TContext) => unknown;
12
14
  readonly tenant?: TenantOption<TContext>;
15
+ /**
16
+ * Request values merged into `subject.context`, under `policy.context`.
17
+ * Only values the server derived belong here, never client input.
18
+ */
19
+ readonly context?: (context: TContext) => RequestContext | undefined | Promise<RequestContext | undefined>;
13
20
  };
14
21
  /** The services an adapter hands to its kernel unchanged. */
15
22
  type ServerAdapterServices = {
@@ -20,6 +27,10 @@ type ServerAdapterServices = {
20
27
  readonly otel?: OtelWrap;
21
28
  /** `(request) => verifyWebBotAuth(request, options)`; a verified bot becomes the actor. */
22
29
  readonly webBotAuth?: WebBotAuthVerifier;
30
+ /** Wraps each instance after `otel`; build it with `wrapPermDock` to cover derived instances. */
31
+ readonly wrap?: PermDockWrap;
32
+ /** Replaces the response of a refused guard; it can never turn a refusal into a grant. */
33
+ readonly onDenied?: OnDenied;
23
34
  };
24
35
  //#endregion
25
36
  export { ServerAdapterServices as n, ServerAdapterOptions as t };
@@ -1,8 +1,9 @@
1
- import { t as compact } from "./compact-y6vfu2_f.js";
2
- import { o as invalidSignatureResponse } from "./evaluations-tz6D9A2G.js";
3
- import { t as instanceOptions } from "./instance-options-Dhhcnm3y.js";
1
+ import { t as compact } from "./compact-CAf557ZB.js";
2
+ import { t as composeWraps } from "./wrap-DWsU_5Bd.js";
3
+ import { r as instanceOptions } from "./build-instance-DIIV9DbC.js";
4
+ import { o as invalidSignatureResponse } from "./evaluations-C9YJsv3H.js";
4
5
  import { n as tenantScope } from "./adapter-context-mlWsVGGg.js";
5
- import { n as createServerKernel } from "./create-CMwIl-w2.js";
6
+ import { n as createServerKernel } from "./create-BBO24vj6.js";
6
7
  //#region src/server/bind.ts
7
8
  /** The server kernel with the subject and actor callbacks reading the context `contextOf` maps a `Request` to. */
8
9
  function adapterKernel(policy, options, adapter, contextOf) {
@@ -15,13 +16,18 @@ function adapterKernel(policy, options, adapter, contextOf) {
15
16
  const context = contextOf(request);
16
17
  return context === void 0 ? void 0 : options.actor?.(context);
17
18
  },
19
+ context: options.context === void 0 ? void 0 : (request) => {
20
+ const context = contextOf(request);
21
+ return context === void 0 ? void 0 : options.context?.(context);
22
+ },
18
23
  ...instanceOptions(options),
19
24
  store: options.store,
20
25
  pdp: options.pdp,
21
26
  webBotAuth: options.webBotAuth,
22
27
  revocations: options.revocations,
23
28
  adapter,
24
- wrap: options.otel
29
+ wrap: composeWraps(options.otel, options.wrap),
30
+ onDenied: options.onDenied
25
31
  }));
26
32
  }
27
33
  /**
@@ -53,13 +59,15 @@ function bindKernel(policy, options, adapter, toRequest) {
53
59
  return context === void 0 ? Promise.resolve({ tenant: void 0 }) : scopeOf(context);
54
60
  };
55
61
  const attach = (context) => attached(async () => kernel.permdock(bind(context), await scopeOf(context)));
62
+ const guard = async (permission, loadData, context, protectOptions) => kernel.protect(permission, loadData === void 0 ? void 0 : () => loadData(context), protectOptions)(bind(context), await scopeOf(context));
56
63
  return {
57
64
  kernel,
58
65
  bind,
59
66
  rebind,
60
67
  scopeOf,
61
68
  handlerScope,
62
- attach
69
+ attach,
70
+ guard
63
71
  };
64
72
  }
65
73
  /** The instance `build` resolves; an invalid Web Bot Auth signature is its `401` response. */
@@ -0,0 +1,51 @@
1
+ import { t as compact } from "./compact-CAf557ZB.js";
2
+ import { t as createPermDock } from "./permdock-L26udHSk.js";
3
+ //#region src/core/instance-options.ts
4
+ const INSTANCE_KEYS = {
5
+ memberships: true,
6
+ relations: true,
7
+ entitlements: true,
8
+ customRoles: true,
9
+ policies: true,
10
+ approvalPolicies: true,
11
+ sink: true,
12
+ limits: true
13
+ };
14
+ /** The `InstanceOptions` set on `options`, without the adapter's own keys. */
15
+ function instanceOptions(options) {
16
+ const picked = {};
17
+ for (const key of Object.keys(INSTANCE_KEYS)) {
18
+ const name = key;
19
+ if (options[name] !== void 0) picked[name] = options[name];
20
+ }
21
+ return picked;
22
+ }
23
+ //#endregion
24
+ //#region src/core/build-instance.ts
25
+ /**
26
+ * `resolve()`, or `null` when it throws: a subject or delegation that cannot
27
+ * be resolved is absent. `rethrow` sees the error first, so a framework's
28
+ * control-flow throws (Next.js `redirect`, `notFound`) pass through.
29
+ */
30
+ async function resolveOrNull(resolve, rethrow) {
31
+ try {
32
+ return await resolve();
33
+ } catch (error) {
34
+ rethrow?.(error);
35
+ return null;
36
+ }
37
+ }
38
+ /** The one path every server adapter creates a request's instance through. */
39
+ async function buildInstance(input) {
40
+ const options = compact({
41
+ ...instanceOptions(input.sources),
42
+ ...input.scope
43
+ });
44
+ const created = await createPermDock(input.policy, input.user, options);
45
+ return {
46
+ permdock: input.wrap === void 0 ? created : input.wrap(created),
47
+ options
48
+ };
49
+ }
50
+ //#endregion
51
+ export { resolveOrNull as n, instanceOptions as r, buildInstance as t };
@@ -1,7 +1,5 @@
1
+ import { r as isRecord } from "./compact-CAf557ZB.js";
1
2
  //#region src/core/canonical-json.ts
2
- function isRecord(value) {
3
- return value !== null && typeof value === "object" && !Array.isArray(value);
4
- }
5
3
  /**
6
4
  * JSON with sorted keys and `undefined` members dropped, so equal values hash
7
5
  * equally. Dates become ISO strings, bigints `"<n>n"`, and a repeated object
@@ -1,5 +1,5 @@
1
- import { Nr as Principal, Pr as Subject, Pt as TokenSigner } from "./policy-IB6yxpC3.js";
2
- import { f as Permission, m as PermissionTree } from "./permissions-DttnqqxC.js";
1
+ import { Or as Principal, kr as Subject, lt as TokenSigner } from "./policy-types-sp9P1iIV.js";
2
+ import { d as Permission, p as PermissionTree } from "./permission-types-Dg39z9Kv.js";
3
3
  //#region src/core/capability.d.ts
4
4
  /**
5
5
  * Who may redeem a capability: anyone holding it, any signed-in principal,
@@ -1,8 +1,9 @@
1
- import { t as compact } from "./compact-y6vfu2_f.js";
1
+ import { t as compact } from "./compact-CAf557ZB.js";
2
2
  import { n as freezeDeep } from "./freeze-CrU8nQeX.js";
3
- import { T as isForbiddenKey, _ as listPermissions } from "./permissions-DVoF6dMt.js";
3
+ import { o as isForbiddenKey } from "./thenable-QSmvt-vZ.js";
4
4
  import { t as expiredAt } from "./expiry-BoBJ8Tvc.js";
5
5
  import { n as sameId } from "./ids-DC4V4CFu.js";
6
+ import { c as listPermissions } from "./permission-registry-BsblpB-z.js";
6
7
  import { t as anonymousSubject } from "./subject-C6dLxqHU.js";
7
8
  //#region src/core/capability.ts
8
9
  function redeemerKind(redeemer) {
@@ -1,4 +1,4 @@
1
- import { a as CatalogDocument, c as CatalogResource, d as CatalogSupportAccess, f as CatalogUsage, i as CatalogDelegation, l as CatalogRole, n as CatalogApproval, o as CatalogGrant, p as CatalogValidity, r as CatalogBreakGlass, s as CatalogPermission, t as CatalogActivation, u as CatalogScope } from "../types-Dnemwd77.js";
1
+ import { a as CatalogDocument, c as CatalogResource, d as CatalogSupportAccess, f as CatalogUsage, i as CatalogDelegation, l as CatalogRole, n as CatalogApproval, o as CatalogGrant, p as CatalogValidity, r as CatalogBreakGlass, s as CatalogPermission, t as CatalogActivation, u as CatalogScope } from "../types-DpWfQdSh.js";
2
2
  //#region src/catalog/parse.d.ts
3
3
  /**
4
4
  * Reads a `permissions.catalog.json` document (parsed, or the JSON text) and
@@ -1,2 +1,2 @@
1
- import { n as rowConditionKeys, t as parseCatalog } from "../parse-BuyjxhZV.js";
1
+ import { n as rowConditionKeys, t as parseCatalog } from "../parse-CVFQHk6c.js";
2
2
  export { parseCatalog, rowConditionKeys };
@@ -0,0 +1,2 @@
1
+ import { t as runCatalog } from "./catalog-tZUyOfOv.js";
2
+ export { runCatalog };
@@ -1,4 +1,4 @@
1
- import { a as listArg, i as globalArgs, s as stringArg, t as COMMAND_DESCRIPTIONS } from "./commands-DSxCqG9A.js";
1
+ import { a as listArg, i as globalArgs, s as stringArg, t as COMMAND_DESCRIPTIONS } from "./commands-Cpip4ULx.js";
2
2
  import { defineCommand } from "citty";
3
3
  //#region src/cli/commands/catalog.ts
4
4
  function catalog(ctx) {
@@ -31,7 +31,7 @@ function catalog(ctx) {
31
31
  }
32
32
  },
33
33
  async run({ args: parsed, rawArgs }) {
34
- const result = await (await import("./catalog-CRW5Mx_B.js")).runCatalog({
34
+ const result = await (await import("./catalog-6yWAX6Ps.js")).runCatalog({
35
35
  cwd: ctx.cwd,
36
36
  config: ctx.config,
37
37
  format: parsed.format,