permdock 0.1.0 → 0.3.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 (350) hide show
  1. package/README.md +106 -47
  2. package/dist/a2a/index.d.ts +7 -16
  3. package/dist/a2a/index.js +59 -98
  4. package/dist/adapter-context-mlWsVGGg.js +23 -0
  5. package/dist/ai-sdk/index.d.ts +37 -16
  6. package/dist/ai-sdk/index.js +30 -13
  7. package/dist/approvals/index.d.ts +3 -3
  8. package/dist/approvals/index.js +5 -4
  9. package/dist/{approvals-DaxY-Bdg.js → approvals-DbYAuNkG.js} +17 -11
  10. package/dist/approvers-DT4AVyIg.js +52 -0
  11. package/dist/{arazzo-CTeVuXr5.js → arazzo-BAgw9ap6.js} +2 -2
  12. package/dist/{arazzo-aoTkqYsJ.js → arazzo-CKwwqFWz.js} +2 -2
  13. package/dist/authzen/index.d.ts +4 -13
  14. package/dist/authzen/index.js +16 -50
  15. package/dist/better-auth/index.d.ts +20 -3
  16. package/dist/better-auth/index.js +27 -7
  17. package/dist/better-supabase/index.d.ts +223 -0
  18. package/dist/better-supabase/index.js +648 -0
  19. package/dist/bind-C_ob3LKa.d.ts +25 -0
  20. package/dist/bind-CuzGytRf.js +97 -0
  21. package/dist/boundary-BM8a_P6E.js +13 -0
  22. package/dist/boundary-BmHxVH1J.d.ts +15 -0
  23. package/dist/canonical-json-DemiK4Vp.js +26 -0
  24. package/dist/{capability-BDG_nkxt.d.ts → capability-2kYTMWDv.d.ts} +2 -2
  25. package/dist/{capability-B68OFnZx.js → capability-4qPdO9gk.js} +7 -5
  26. package/dist/catalog/index.d.ts +1 -1
  27. package/dist/catalog/index.js +1 -1
  28. package/dist/catalog-CRW5Mx_B.js +2 -0
  29. package/dist/{catalog-H-vFGwWK.js → catalog-DWF5cYqB.js} +4 -4
  30. package/dist/{catalog-B0E6bggc.js → catalog-dFZdWCGN.js} +2 -2
  31. package/dist/{catalog-doc-BSo_Q_-6.js → catalog-doc-DdGm82XT.js} +20 -32
  32. package/dist/claude-agent/index.d.ts +5 -14
  33. package/dist/claude-agent/index.js +4 -10
  34. package/dist/clerk/index.d.ts +12 -3
  35. package/dist/clerk/index.js +26 -5
  36. package/dist/cli/bin.js +1 -1
  37. package/dist/cli/index.d.ts +3 -3
  38. package/dist/cli/index.js +2 -2
  39. package/dist/clients-C7zLFuWT.d.ts +12 -0
  40. package/dist/clients-DjU5ABMy.js +23 -0
  41. package/dist/cloud/index.d.ts +4 -5
  42. package/dist/cloud/index.js +20 -6
  43. package/dist/{cloud-BNQTrmrr.js → cloud-CB_ELYuX.js} +2 -2
  44. package/dist/{cloud-Cuxr6Czw.js → cloud-DWLXO2af.js} +7 -6
  45. package/dist/collect-DClJsheJ.js +83 -0
  46. package/dist/{collect-O-tOtbnk.js → collect-DSTE3ml9.js} +194 -42
  47. package/dist/collect-DSWOk19R.js +2 -0
  48. package/dist/{commands-BMh_Etm2.js → commands-DSxCqG9A.js} +16 -12
  49. package/dist/compile/index.d.ts +3 -0
  50. package/dist/compile/index.js +2 -0
  51. package/dist/{compile-D22iwvuV.js → compile-Ba4blROR.js} +85 -30
  52. package/dist/compile-BkRyBDBw.d.ts +94 -0
  53. package/dist/config-BJiM-xAm.js +157 -0
  54. package/dist/config-Dnszbv-6.js +36 -0
  55. package/dist/config-report-DMvWKUxL.js +44 -0
  56. package/dist/{connection-JvqwHODC.js → connection-CU8MQxRi.js} +1 -1
  57. package/dist/{context-CKEAabd7.js → context-Bcy85rGi.js} +36 -27
  58. package/dist/convex/index.d.ts +9 -4
  59. package/dist/convex/index.js +14 -4
  60. package/dist/create-B1d519XK.d.ts +245 -0
  61. package/dist/create-CMwIl-w2.js +253 -0
  62. package/dist/{credential-B_rkUNlY.js → credential-8P81ff4u.js} +26 -46
  63. package/dist/delegation-D8pUEuce.js +103 -0
  64. package/dist/{describe-Bt1YD5uS.js → describe-B_gVZEVi.js} +10 -15
  65. package/dist/{describe-DernyItf.d.ts → describe-DMYiCjJV.d.ts} +9 -10
  66. package/dist/{diff-x5Il8LVa.js → diff-2VaeChzX.js} +44 -11
  67. package/dist/{diff-BUzf5Poi.js → diff-DBIhz_f2.js} +2 -2
  68. package/dist/{doctor-Bqo6FwUa.js → doctor-BwCAMLx_.js} +2 -2
  69. package/dist/doctor-collect-CHk6XWOA.js +665 -0
  70. package/dist/doctor-igIiM_Hl.js +1194 -0
  71. package/dist/drizzle/index.d.ts +4 -3
  72. package/dist/drizzle/index.js +3 -3
  73. package/dist/elysia/index.d.ts +6 -28
  74. package/dist/elysia/index.js +16 -60
  75. package/dist/{errors-DSMnAVNa.js → errors-CWfoNg9N.js} +8 -4
  76. package/dist/{errors-Iy71s7Oj.js → errors-Cz5zn0mW.js} +17 -71
  77. package/dist/{errors-DbZ1YOnb.d.ts → errors-DPdqI50v.d.ts} +8 -21
  78. package/dist/{errors-m3u9TmDu.js → errors-DRnGZHzF.js} +4 -1
  79. package/dist/evaluation-items-CfCCejQd.js +40 -0
  80. package/dist/{evaluations-DsAU9ppl.js → evaluations-tz6D9A2G.js} +28 -46
  81. package/dist/eve/index.d.ts +6 -15
  82. package/dist/eve/index.js +7 -12
  83. package/dist/expiry-BoBJ8Tvc.js +7 -0
  84. package/dist/express/index.d.ts +6 -29
  85. package/dist/express/index.js +28 -58
  86. package/dist/fastify/index.d.ts +6 -29
  87. package/dist/fastify/index.js +16 -65
  88. package/dist/fields-BMl1RxoX.js +26 -0
  89. package/dist/{files-B_wAGYmt.js → files-DWUN9PzI.js} +5 -1
  90. package/dist/{fixtures-Cvaw0gDG.js → fixtures-ht28Cplr.js} +5 -2
  91. package/dist/{freeze-y1_jQL4v.js → freeze-CrU8nQeX.js} +31 -2
  92. package/dist/{from-snapshot-BMGnhmgv.js → from-snapshot-CTLijvdm.js} +66 -48
  93. package/dist/{grantee-Bv04_Vzf.js → grantee-Cv5Sogfv.js} +88 -7
  94. package/dist/graph-sql-B-dsAT6j.d.ts +29 -0
  95. package/dist/{headers-B5RRv3Xm.js → headers-BZSDieNT.js} +1 -1
  96. package/dist/{headers-C8SHQccD.d.ts → headers-Cf-zWvsO.d.ts} +1 -1
  97. package/dist/helpers-H_KARDVC.js +421 -0
  98. package/dist/hono/index.d.ts +6 -28
  99. package/dist/hono/index.js +11 -43
  100. package/dist/{hosted-BwKQ1BTA.js → hosted-DJQw46hn.js} +6 -5
  101. package/dist/{http-GgVApX1k.js → http-BIhmLfCc.js} +4 -20
  102. package/dist/http-SO7qGttf.js +44 -0
  103. package/dist/ids-DC4V4CFu.js +18 -0
  104. package/dist/index-0nNqHspG.d.ts +6 -0
  105. package/dist/{index-xIxJLwOQ.d.ts → index-BNc7Wer_.d.ts} +75 -7
  106. package/dist/{index-CltcQ4Bf.d.ts → index-C7Tw7MaW.d.ts} +68 -5
  107. package/dist/{index-LF_hS-yn.d.ts → index-C8z4RjQV.d.ts} +1 -1
  108. package/dist/index.d.ts +14 -9
  109. package/dist/index.js +22 -17
  110. package/dist/instance-options-Dhhcnm3y.js +22 -0
  111. package/dist/instance-options-jARdwfPN.d.ts +11 -0
  112. package/dist/{parse-DPfIvFMU.js → json-schema-BsAflUGW.js} +28 -57
  113. package/dist/jwt/index.d.ts +10 -6
  114. package/dist/jwt/index.js +32 -13
  115. package/dist/kernel-_RRHmnMY.js +208 -0
  116. package/dist/kysely/index.d.ts +4 -3
  117. package/dist/kysely/index.js +3 -3
  118. package/dist/live-options-H2eG8dfJ.js +60 -0
  119. package/dist/{load-BZ24CpZP.js → load-DhWEB9P1.js} +16 -10
  120. package/dist/load-DwJUafYN.js +2 -0
  121. package/dist/manifest-iaoBXHKc.js +783 -0
  122. package/dist/manifest-uDS9y5de.d.ts +206 -0
  123. package/dist/{map-DowSO96j.js → map-AcxK9o_D.js} +4 -15
  124. package/dist/{map-claims-B_6I1Rn-.js → map-claims-Z4QZOiFF.js} +13 -4
  125. package/dist/map-error-pgUWNNtG.js +23 -0
  126. package/dist/may-use-DndQ5tQ-.js +77 -0
  127. package/dist/mcp/index.d.ts +54 -22
  128. package/dist/mcp/index.js +218 -178
  129. package/dist/nest/index.d.ts +26 -31
  130. package/dist/nest/index.js +75 -84
  131. package/dist/next/client.d.ts +7 -8
  132. package/dist/next/client.js +11 -9
  133. package/dist/next/index.d.ts +30 -47
  134. package/dist/next/index.js +45 -60
  135. package/dist/next/plugin.d.ts +1 -1
  136. package/dist/next/plugin.js +32 -1
  137. package/dist/node/index.d.ts +9 -28
  138. package/dist/node/index.js +11 -43
  139. package/dist/openai/index.d.ts +6 -15
  140. package/dist/openai/index.js +7 -20
  141. package/dist/openapi/index.d.ts +87 -4
  142. package/dist/openapi/index.js +3 -3
  143. package/dist/{openapi-DcqM8nU7.js → openapi-BqRBvAng.js} +237 -5
  144. package/dist/{openapi-DWD0Uc_4.js → openapi-CqqEbHsL.js} +5 -5
  145. package/dist/{openapi-import-BWRUNNeW.js → openapi-import-cmwetbzw.js} +1 -1
  146. package/dist/{openapi-CwePaF7C.js → openapi-l0xYHkcv.js} +3 -3
  147. package/dist/{openapi-schema-D8j_T9tO.js → openapi-schema--ARjyfQr.js} +2 -2
  148. package/dist/orpc/index.d.ts +15 -28
  149. package/dist/orpc/index.js +74 -117
  150. package/dist/otel/index.d.ts +2 -2
  151. package/dist/parse-BuyjxhZV.js +53 -0
  152. package/dist/parse-local-manifest-BrMozJCo.js +36 -0
  153. package/dist/parse-local-manifest-JLnaBH0S.d.ts +10 -0
  154. package/dist/pdp/index.d.ts +2 -2
  155. package/dist/pdp/index.js +14 -127
  156. package/dist/{permdock-yoZ7EjxX.js → permdock-CbgvLnuo.js} +672 -149
  157. package/dist/{permissions-B8vCg_bI.d.ts → permissions-CDgvKG5L.d.ts} +2 -2
  158. package/dist/{permissions-DC7GROPA.js → permissions-DVoF6dMt.js} +77 -15
  159. package/dist/{permissions-B4apnahQ.d.ts → permissions-DttnqqxC.d.ts} +34 -5
  160. package/dist/{permissions-CofRqesP.js → permissions-RJrovw98.js} +3 -3
  161. package/dist/{pins-CqE1jZuF.js → pins-8ILTftC9.js} +2 -2
  162. package/dist/{policy-Cq2fB8Q5.d.ts → policy-D2W7uv19.d.ts} +2 -2
  163. package/dist/{policy-CInmNGkM.d.ts → policy-IB6yxpC3.d.ts} +351 -42
  164. package/dist/{policy-ANp36PnI.js → policy-xyWg7QdR.js} +173 -22
  165. package/dist/powersync-BylawD_U.js +540 -0
  166. package/dist/powersync-DliZK_-y.js +62 -0
  167. package/dist/powersync-e_AZrKbg.js +2 -0
  168. package/dist/prisma/index.d.ts +3 -2
  169. package/dist/prisma/index.js +45 -20
  170. package/dist/{problem-Cgp9-KZA.js → problem-B43ztKIm.js} +74 -109
  171. package/dist/problem-details-DX075l9V.d.ts +7 -0
  172. package/dist/problem-details-_AMOYz-w.js +144 -0
  173. package/dist/{protected-BuPAycJT.d.ts → protected-BdnIEFkY.d.ts} +5 -4
  174. package/dist/protected-utU-SLuy.js +100 -0
  175. package/dist/protected-xAr24FEC.d.ts +40 -0
  176. package/dist/provider-CSQd7m92.js +52 -0
  177. package/dist/{provider-wTAUda2v.d.ts → provider-DZY281jO.d.ts} +1 -1
  178. package/dist/provider-store-Cfbvo4DE.js +43 -0
  179. package/dist/react/index.d.ts +7 -5
  180. package/dist/react/index.js +5 -4
  181. package/dist/react/provider-client.d.ts +1 -1
  182. package/dist/react/provider-client.js +1 -1
  183. package/dist/react-native/index.d.ts +166 -10
  184. package/dist/react-native/index.js +607 -85
  185. package/dist/{refs-ChLSxbST.js → refs-KYb4ntaz.js} +4 -3
  186. package/dist/{relations-r4soIFZB.js → relations-cjOL01hZ.js} +110 -31
  187. package/dist/replay-BsOyTrdV.js +28 -0
  188. package/dist/replay-CYyiLiwO.d.ts +5 -0
  189. package/dist/resource-ref-CaS9yVPi.js +20 -0
  190. package/dist/revocations-Bhr0aMIC.js +27 -0
  191. package/dist/{rls-BOFU3chG.js → rls-B4ur8nKQ.js} +8 -3
  192. package/dist/rls-DQtdgTHB.js +2521 -0
  193. package/dist/rls-fields-74oZPXWL.js +3582 -0
  194. package/dist/{rls-graph-DxQ39PJj.js → rls-graph-CHwx0V8q.js} +100 -36
  195. package/dist/{rls-import-CXV6LBlS.js → rls-import-BTFVk3jH.js} +7 -6
  196. package/dist/{rls-migrate-DrFPbf8p.js → rls-migrate-CN4TlJTO.js} +6 -5
  197. package/dist/rls-ownership-RuFqaqGz.js +843 -0
  198. package/dist/rls-shared-Cewd_-zI.js +495 -0
  199. package/dist/rls-verify-CVQTHTh5.js +746 -0
  200. package/dist/{row-check-BajTgQZ-.d.ts → row-check-Dt35czLy.d.ts} +12 -15
  201. package/dist/row-conditions-h2HythXQ.js +27 -0
  202. package/dist/rpc-DL9Sqvb1.js +89 -0
  203. package/dist/{run-CJ6UvS3a.js → run-DKDbM4Du.js} +31 -12
  204. package/dist/runtime-CB8gQFvS.js +11 -0
  205. package/dist/{saas-BRrZzJkM.js → saas-DhpJjnBA.js} +17 -7
  206. package/dist/{schema-P8yoma__.js → schema-D3MnDMxa.js} +8 -4
  207. package/dist/scim/index.d.ts +1 -1
  208. package/dist/scim/index.js +1 -1
  209. package/dist/{scim-9NFa0XVZ.js → scim-BFGBBAqR.js} +1 -1
  210. package/dist/{scopes-cKVp_WTw.js → scopes-CVdPrWN-.js} +35 -8
  211. package/dist/server/index.d.ts +22 -11
  212. package/dist/server/index.js +11 -8
  213. package/dist/{credentials-BgRX3WEg.js → server-DlZ28Oz5.js} +1 -1
  214. package/dist/shared-DRu8VFVM.js +123 -0
  215. package/dist/{sink-Cfr9-7YC.d.ts → sink-B1fZzIMf.d.ts} +1 -1
  216. package/dist/skills-Biq5uup3.js +192 -0
  217. package/dist/{skills-C_lpV4Jx.js → skills-Bx-U0irG.js} +10 -4
  218. package/dist/{snapshot-DE8dE_hz.js → snapshot-Enxd0n-s.js} +138 -214
  219. package/dist/snapshot-cache-B-LxUahj.d.ts +45 -0
  220. package/dist/snapshot-cache-D6jLelln.js +44 -0
  221. package/dist/solid/index.d.ts +39 -9
  222. package/dist/solid/index.js +76 -85
  223. package/dist/sources-4p0-4xQm.js +545 -0
  224. package/dist/sources-BdOYLw9j.d.ts +192 -0
  225. package/dist/{sql-Bll1d7y0.js → sql-xdg5f4Fi.js} +6 -1
  226. package/dist/{src-CTNT-PBW.js → src-BDwEZWrZ.js} +149 -11
  227. package/dist/ssf/index.d.ts +3 -2
  228. package/dist/ssf/index.js +3 -29
  229. package/dist/store-DMAWwAJV.js +371 -0
  230. package/dist/{store-Bq90395i.d.ts → store-jOBYpiXC.d.ts} +13 -4
  231. package/dist/store-options-ByhZq1jV.js +716 -0
  232. package/dist/{stores-CkG2HrSg.js → stores-BT2pSCub.js} +10 -63
  233. package/dist/{stores-CvOnu_2T.d.ts → stores-C0IMQrGI.d.ts} +20 -9
  234. package/dist/{stream-BhMfZOwr.d.ts → stream-D1RXubw2.d.ts} +2 -2
  235. package/dist/{stream-Q_xlB6Ko.js → stream-DDpvynSB.js} +16 -2
  236. package/dist/subject-settings-BwBmCdTR.js +128 -0
  237. package/dist/supabase/index.d.ts +133 -6
  238. package/dist/supabase/index.js +4 -3
  239. package/dist/supabase/middleware.d.ts +32 -27
  240. package/dist/supabase/middleware.js +56 -22
  241. package/dist/{supabase-D8UlBA7Z.js → supabase-Boqb9a_Y.js} +3 -3
  242. package/dist/{supabase-DTxGtYdi.js → supabase-C0qESOa-.js} +347 -367
  243. package/dist/supabase-config-BpPXt3x1.js +472 -0
  244. package/dist/supabase-hook-6sYLXg_u.js +2 -0
  245. package/dist/{supabase-hook-D_OqGb_V.js → supabase-hook-CSLQ4zJ3.js} +1037 -705
  246. package/dist/supautils-Cn4R4cJ4.js +91 -0
  247. package/dist/svelte/PermissionBoundary.svelte +37 -0
  248. package/dist/svelte/Protected.svelte +8 -2
  249. package/dist/svelte/index.d.ts +9 -6
  250. package/dist/svelte/index.js +61 -7
  251. package/dist/svelte/runtime.d.ts +4 -3
  252. package/dist/svelte/runtime.js +4 -3
  253. package/dist/svelte/source.d.ts +9 -6
  254. package/dist/svelte/source.js +7 -4
  255. package/dist/terminal/index.d.ts +6 -14
  256. package/dist/terminal/index.js +44 -32
  257. package/dist/testing/index.d.ts +105 -16
  258. package/dist/testing/index.js +504 -40
  259. package/dist/testing/saas/index.d.ts +4 -4
  260. package/dist/testing/saas/index.js +2 -2
  261. package/dist/testing/saas/permissions.d.ts +1 -1
  262. package/dist/testing/saas/permissions.js +1 -1
  263. package/dist/token-CIWxJOCh.js +50 -0
  264. package/dist/trpc/index.d.ts +7 -26
  265. package/dist/trpc/index.js +17 -100
  266. package/dist/types-BnIEz1sU.d.ts +48 -0
  267. package/dist/{types-CxquUByI.d.ts → types-Bvc4oWT6.d.ts} +1 -1
  268. package/dist/{sources-DOpW5Ila.d.ts → types-C97IskBw.d.ts} +86 -127
  269. package/dist/types-CKNSyIf_.d.ts +52 -0
  270. package/dist/types-Cq_H8N_X.d.ts +197 -0
  271. package/dist/{types-D6Z6-rKJ.d.ts → types-DbjRN55U.d.ts} +273 -22
  272. package/dist/{types-BBK-exvJ.d.ts → types-Dnemwd77.d.ts} +7 -1
  273. package/dist/{types-BvBk1wgn.d.ts → types-DxiCGmmd.d.ts} +5 -3
  274. package/dist/{types-B9dmiiab.d.ts → types-QCuYJh4q.d.ts} +1 -1
  275. package/dist/{types-B8w5PFtS.d.ts → types-aqOHTHcp.d.ts} +17 -1
  276. package/dist/unplugin/index.d.ts +1 -1
  277. package/dist/unplugin/index.js +10 -9
  278. package/dist/usage-DorAJiU_.js +2 -0
  279. package/dist/{usage-1ozMubLY.js → usage-GTixvDDU.js} +2 -2
  280. package/dist/{usage-CUnK6Ou9.js → usage-ItS7nLcl.js} +225 -62
  281. package/dist/validation-error-Ba264OaJ.d.ts +26 -0
  282. package/dist/validation-error-CnjZ4t92.js +33 -0
  283. package/dist/{validity-D0uRmJKJ.js → validity-uOp8UpYn.js} +57 -36
  284. package/dist/{verifier-B90agnhl.js → verifier-BxBo6I44.js} +10 -5
  285. package/dist/version-BvacVTZR.js +17 -0
  286. package/dist/views-Soe7bGSC.js +95 -0
  287. package/dist/{vocabulary-Dk0fs-Jk.d.ts → vocabulary-DA8a8zif.d.ts} +1 -1
  288. package/dist/vue/index.d.ts +35 -13
  289. package/dist/vue/index.js +86 -93
  290. package/dist/watch-BwxLTYMZ.js +2 -0
  291. package/dist/watch-DVBJ9cBq.js +128 -0
  292. package/dist/webmcp/index.d.ts +2 -2
  293. package/dist/webmcp/index.js +7 -13
  294. package/package.json +62 -36
  295. package/schemas/approval-request-v1.json +175 -0
  296. package/schemas/catalog-v1.json +29 -1
  297. package/schemas/supabase-claims-v1.json +6 -1
  298. package/schemas/supabase-manifest-v1.json +150 -6
  299. package/skills/permdock/SKILL.md +7 -7
  300. package/skills/permdock-agents/SKILL.md +5 -5
  301. package/skills/permdock-agents/references/runtimes.md +12 -10
  302. package/skills/permdock-approvals/SKILL.md +4 -4
  303. package/skills/permdock-approvals/references/stores-and-resume.md +15 -4
  304. package/skills/permdock-audit/SKILL.md +3 -3
  305. package/skills/permdock-credentials/SKILL.md +4 -4
  306. package/skills/permdock-credentials/references/tokens-keys-links.md +7 -2
  307. package/skills/permdock-data/SKILL.md +4 -4
  308. package/skills/permdock-data/references/queries-and-rls.md +14 -6
  309. package/skills/permdock-data/references/relationships.md +5 -3
  310. package/skills/permdock-tenancy/SKILL.md +9 -6
  311. package/skills/permdock-tenancy/references/ownership-and-custom-roles.md +14 -8
  312. package/skills/permdock-wire/SKILL.md +4 -4
  313. package/skills/permdock-wire/references/adapters.md +42 -30
  314. package/skills/permdock-wire/references/policy-options.md +5 -3
  315. package/dist/approvers-aH0PJkmf.js +0 -20
  316. package/dist/catalog-idsHc0vo.js +0 -2
  317. package/dist/collect-B7_TIfmg.js +0 -49
  318. package/dist/collect-fRPAQIWb.js +0 -2
  319. package/dist/compile-CQbvyIBr.d.ts +0 -30
  320. package/dist/config-BPYmjTOp.js +0 -26
  321. package/dist/context-gtAwAILx.js +0 -6
  322. package/dist/create-BKF3dgFk.d.ts +0 -162
  323. package/dist/create-CSkhDU9T.js +0 -222
  324. package/dist/doctor-BGle8Gqi.js +0 -1314
  325. package/dist/helpers-DnSOrhB9.js +0 -682
  326. package/dist/index-fG6NSXlc.d.ts +0 -9
  327. package/dist/kernel-YOGCWNLf.js +0 -211
  328. package/dist/load-QOOm1z70.js +0 -2
  329. package/dist/manifest-DDQbC6K0.d.ts +0 -118
  330. package/dist/map-error-RJ3ZsUyA.js +0 -16
  331. package/dist/may-use-CnFEjVEp.js +0 -37
  332. package/dist/pg-4GJWDUxG.js +0 -953
  333. package/dist/plugin-4gr7IxFJ.js +0 -65
  334. package/dist/protected-B4K3BKoX.js +0 -138
  335. package/dist/protected-wY7nXhY9.d.ts +0 -23
  336. package/dist/provider-_wx46HpB.js +0 -48
  337. package/dist/rls-CJVja9Ww.js +0 -2119
  338. package/dist/rls-helpers-BxRuif0l.js +0 -1346
  339. package/dist/runtime-DP9ttFh1.js +0 -27
  340. package/dist/skills-Dx3QLnMY.js +0 -110
  341. package/dist/source-DoBBYJi2.js +0 -6
  342. package/dist/sources-DVHM3Mwq.js +0 -284
  343. package/dist/store-C6hFW6ta.js +0 -508
  344. package/dist/subject-settings-xt7V845g.js +0 -82
  345. package/dist/supabase-hook-DW-xP4hU.js +0 -2
  346. package/dist/types-DbWdEfcm.d.ts +0 -87
  347. package/dist/types-bva3i4Gf.d.ts +0 -98
  348. package/dist/types-i4BAOvdb.d.ts +0 -97
  349. package/dist/usage-PyEor6GA.js +0 -2
  350. package/dist/version-CnSh33Fj.js +0 -16
@@ -1,8 +1,9 @@
1
1
  import { n as isReadonlyArray, r as sole, t as compact } from "./compact-y6vfu2_f.js";
2
- import { d as isFieldRelation, h as isSelfParented, p as isPrincipalRelation, r as expandRelation, u as isEdgeRelation, x as assertSafeKey } from "./permissions-DC7GROPA.js";
3
- import { c as isConditionRef, i as resolveConditionRef, s as isConditionDate, u as parentHop } from "./refs-ChLSxbST.js";
4
- import { a as resolveScope, c as scopeChain, d as subjectMemberships, f as tenantOf, s as rootScope, u as scopeList } from "./scopes-cKVp_WTw.js";
5
- import { i as PermDockValidationError } from "./errors-Iy71s7Oj.js";
2
+ import { S as restrictedFor, d as isEdgeRelation, f as isFieldRelation, g as isSelfParented, l as groupEntries, m as isPrincipalRelation, r as expandRelation, w as assertSafeKey } from "./permissions-DVoF6dMt.js";
3
+ import { c as isConditionRef, i as resolveConditionRef, s as isConditionDate, u as parentHop } from "./refs-KYb4ntaz.js";
4
+ import { n as PermDockValidationError } from "./validation-error-CnjZ4t92.js";
5
+ import { t as expiredAt } from "./expiry-BoBJ8Tvc.js";
6
+ import { c as rootScope, d as scopeList, l as scopeChain, m as tenantOf, o as resolveScope, p as subjectMemberships } from "./scopes-CVdPrWN-.js";
6
7
  //#region src/conditions/graph-sql.ts
7
8
  /** A Postgres identifier, schema-qualified names split on `.`. */
8
9
  function quoteSqlName(name) {
@@ -48,25 +49,38 @@ function groupHolders(build, resource, relation) {
48
49
  /** Who a row of the edge names, when it is not a group of the edge's own resource. */
49
50
  function edgeHolderFilter(build, node, spec, alias) {
50
51
  const holder = col(alias, spec.subject ?? "user_id");
51
- const subject = `${holder}::text`;
52
52
  const groups = spec.groups;
53
53
  if (groups === void 0) return [text(`${holder} = `), { subject: true }];
54
- const kind = col(alias, groups.column);
55
- const direct = groups.direct === void 0 ? [text(`(${kind} is null`)] : [text(`(${kind} is null or ${kind} = `), { value: groups.direct }];
56
- const parts = [
54
+ const kind = groups.column === void 0 ? void 0 : col(alias, groups.column);
55
+ const direct = kind === void 0 ? [
56
+ text(`(${holder} = `),
57
+ { subject: true },
58
+ text(")")
59
+ ] : [
57
60
  text("(("),
58
- ...direct,
61
+ ...groups.direct === void 0 ? [text(`${kind} is null`)] : [text(`${kind} is null or ${kind} = `), { value: groups.direct }],
59
62
  text(`) and ${holder} = `),
60
63
  { subject: true },
61
64
  text(")")
62
65
  ];
63
- for (const [resource, relation] of Object.entries(groups.resources)) {
64
- if (resource === node.name) continue;
65
- parts.push(text(` or (${kind} = `), { value: resource }, text(` and ${subject} in (`), ...groupHolders(build, resource, relation), text("))"));
66
+ const parts = [text("("), ...direct];
67
+ for (const group of groupEntries(spec)) {
68
+ if (group.resource === node.name) continue;
69
+ const id = `${col(alias, group.subject)}::text in (`;
70
+ parts.push(...kind === void 0 ? [text(` or (${id}`)] : [
71
+ text(` or (${kind} = `),
72
+ { value: group.resource },
73
+ text(` and ${id}`)
74
+ ], ...groupHolders(build, group.resource, group.relation), text("))"));
66
75
  }
67
76
  parts.push(text(")"));
68
77
  return parts;
69
78
  }
79
+ /** The nested-group step of an edge whose groups include its own resource: the row names a group of `node`. */
80
+ function selfGroupWhere(spec, node, subject, alias) {
81
+ const column = spec.groups?.column;
82
+ return column === void 0 ? [text(`${subject} is not null`)] : [text(`${col(alias, column)} = `), { value: node.name }];
83
+ }
70
84
  /**
71
85
  * One concrete relation's arm: `select <id>::text as id ...` for every
72
86
  * instance of `node` the subject holds `relation` on, through groups too.
@@ -82,14 +96,16 @@ function relationArm(build, node, relation) {
82
96
  ...edgeHolderFilter(build, node, spec, e),
83
97
  ...edgeRowFilter(spec, e)
84
98
  ];
85
- if (spec.groups?.resources[node.name] === void 0 || spec.groups === void 0) return base;
99
+ const self = groupEntries(spec).find((group) => group.resource === node.name);
100
+ if (self === void 0) return base;
86
101
  const g = nextAlias(build, "g");
87
102
  const n = nextAlias(build, "e");
103
+ const subject = col(n, self.subject);
88
104
  return [
89
105
  text(`select ${g}.id from (with recursive ${g}(id, level) as (select b.id, 0 from (`),
90
106
  ...base,
91
- text(`) b union select ${col(n, object)}::text, ${g}.level + 1 from ${edge} ${n} join ${g} on ${col(n, spec.subject ?? "user_id")}::text = ${g}.id where ${col(n, spec.groups.column)} = `),
92
- { value: node.name },
107
+ text(`) b union select ${col(n, object)}::text, ${g}.level + 1 from ${edge} ${n} join ${g} on ${subject}::text = ${g}.id where `),
108
+ ...selfGroupWhere(spec, node, subject, n),
93
109
  text(` and ${g}.level < ${String(16)}`),
94
110
  ...edgeRowFilter(spec, n),
95
111
  text(`) select ${g}.id from ${g}) ${g}`)
@@ -132,6 +148,11 @@ function relationArmSql(resource, relation, options) {
132
148
  return relationArm(build, nodeOf(build, resource), relation);
133
149
  }
134
150
  function heldIds(build, condition) {
151
+ if (condition.permission !== void 0) {
152
+ const permitted = build.options.permitted;
153
+ if (permitted === void 0) throw new Error(`PermDock: inherit(${condition.permission}) has no query form outside generated RLS`);
154
+ return permitted(condition.resource, condition.permission);
155
+ }
135
156
  if (condition.ids === void 0) return groupHolders(build, condition.resource, condition.relation);
136
157
  if (condition.ids.length === 0) return [text("select null::text as id where false")];
137
158
  const parts = [text("select v.id from (values ")];
@@ -160,7 +181,8 @@ function reached(build, condition) {
160
181
  }
161
182
  const d = nextAlias(build, "d");
162
183
  const t = nextAlias(build, "t");
163
- const restricted = node.restricted === void 0 ? "" : ` and ${col(t, node.restricted)} is not true`;
184
+ const stop = restrictedFor(node, "parent");
185
+ const restricted = stop === void 0 ? "" : ` and ${col(t, stop)} is not true`;
164
186
  return [
165
187
  text(`select ${d}.id from (with recursive ${d}(id, level) as (select h.id, 0 from (`),
166
188
  ...held,
@@ -201,6 +223,38 @@ function relatedTargetsSql(condition, options) {
201
223
  alias: 0
202
224
  }, condition);
203
225
  }
226
+ function closedRows(build, above) {
227
+ const custom = build.options.restrictedRows?.(above.resource);
228
+ if (custom !== void 0) return custom;
229
+ const table = tableOf(build, nodeOf(build, above.resource).name);
230
+ const span = above.depth - 1;
231
+ const { closure, closureDepths } = build.options;
232
+ const cap = closureDepths?.[above.resource];
233
+ if (closure !== void 0 && (closureDepths === void 0 || cap !== void 0 && cap >= span)) {
234
+ const c = nextAlias(build, "c");
235
+ const a = nextAlias(build, "a");
236
+ const q = nextAlias(build, "q");
237
+ return [
238
+ text(`select ${c}.descendant as id from ${quoteSqlName(closure)} ${c} join ${table} ${a} on ${col(a, above.id)}::text = ${c}.ancestor where ${c}.resource = `),
239
+ { value: above.resource },
240
+ text(` and ${c}.depth <= ${String(span)} and (${col(a, above.field)} is true or (${c}.depth = ${String(span)} and exists (select 1 from ${table} ${q} where ${col(q, above.id)} = ${col(a, above.parent)})))`)
241
+ ];
242
+ }
243
+ const d = nextAlias(build, "d");
244
+ const r = nextAlias(build, "r");
245
+ const t = nextAlias(build, "t");
246
+ const u = nextAlias(build, "t");
247
+ const v = nextAlias(build, "t");
248
+ const w = nextAlias(build, "t");
249
+ const q = nextAlias(build, "q");
250
+ return [text(`select ${d}.id from (with recursive ${d}(id, level) as (select ${col(t, above.id)}::text, 0 from ${table} ${t} where ${col(t, above.field)} is true union select ${col(u, above.id)}::text, ${d}.level + 1 from ${table} ${u} join ${d} on ${col(u, above.parent)}::text = ${d}.id where ${d}.level < ${String(span)}) select ${d}.id from ${d}) ${d} union select ${col(w, above.id)}::text from ${table} ${w} where ${col(w, above.id)}::text not in (select ${r}.id from (with recursive ${r}(id, level) as (select ${col(v, above.id)}::text, 0 from ${table} ${v} where ${col(v, above.parent)} is null or not exists (select 1 from ${table} ${q} where ${col(q, above.id)} = ${col(v, above.parent)}) union select ${col(t, above.id)}::text, ${r}.level + 1 from ${table} ${t} join ${r} on ${col(t, above.parent)}::text = ${r}.id where ${r}.level < ${String(span)}) select ${r}.id from ${r}) ${r})`)];
251
+ }
252
+ function restrictedRowsSql(above, options) {
253
+ return closedRows({
254
+ options,
255
+ alias: 0
256
+ }, above);
257
+ }
204
258
  /** Whether the row's restricted column keeps it out of `condition` whatever the graph says. */
205
259
  function relatedRowGuard(condition) {
206
260
  const hopped = condition.hops !== void 0 && condition.hops.length > 0;
@@ -212,22 +266,25 @@ function relatedRowGuard(condition) {
212
266
  * is not restricted.
213
267
  */
214
268
  function relatedSql(condition, options) {
269
+ const build = {
270
+ options,
271
+ alias: 0
272
+ };
215
273
  const parts = [
216
274
  text("coalesce("),
217
275
  { column: condition.field },
218
276
  text("::text in ("),
219
- ...relatedTargetsSql(condition, options),
277
+ ...targets(build, condition),
220
278
  text("), false)")
221
279
  ];
222
280
  const guard = relatedRowGuard(condition);
223
- if (guard === void 0) return parts;
224
- return [
225
- text("("),
226
- ...parts,
227
- text(" and "),
228
- { column: guard },
229
- text(" is not true)")
230
- ];
281
+ const above = condition.restrictedAncestors;
282
+ if (guard === void 0 && above === void 0) return parts;
283
+ const out = [text("("), ...parts];
284
+ if (guard !== void 0) out.push(text(" and "), { column: guard }, text(" is not true"));
285
+ if (above !== void 0) out.push(text(" and ("), { column: above.parent }, text(" is null or "), { column: above.parent }, text("::text not in ("), ...closedRows(build, above), text("))"));
286
+ out.push(text(")"));
287
+ return out;
231
288
  }
232
289
  /**
233
290
  * Renders parts to one SQL string: `placeholder(n)` names the n-th bound
@@ -266,9 +323,6 @@ function scopeColumn(table, scopes, name) {
266
323
  }
267
324
  const NEVER = { kind: "never" };
268
325
  const ALWAYS = { kind: "always" };
269
- function isExpired(membership, now) {
270
- return membership.expiresAt !== void 0 && membership.expiresAt <= now;
271
- }
272
326
  function isScalar(value) {
273
327
  return typeof value === "string" || typeof value === "number" || typeof value === "boolean" || value instanceof Date;
274
328
  }
@@ -363,7 +417,7 @@ function matchingMemberships(condition, subject, now, scopes) {
363
417
  const memberships = subjectMemberships(subject?.principal?.memberships, scopes);
364
418
  const wanted = new Set(condition.roles);
365
419
  return memberships.filter((membership) => {
366
- if (isExpired(membership, now)) return false;
420
+ if (expiredAt(membership, now)) return false;
367
421
  if (wanted.size === 0) return true;
368
422
  return membership.roles.some((role) => wanted.has(role));
369
423
  });
@@ -521,6 +575,7 @@ function compileNode(condition, options) {
521
575
  case "sqlFunction": return compileNode(condition.twin, options);
522
576
  case "memberOf": return compileMemberOf(condition, options);
523
577
  case "related": return compileRelated(condition, options);
578
+ case "liveSession": return options.subject?.liveSession === true ? ALWAYS : NEVER;
524
579
  case "eq":
525
580
  case "ne":
526
581
  case "gt":
@@ -555,4 +610,4 @@ function compileWhere(input, options = {}) {
555
610
  }));
556
611
  }
557
612
  //#endregion
558
- export { relatedRowGuard as a, relationArmSql as c, scopeMembershipTable as i, renderGraphSql as l, escapeLike as n, relatedSql as o, scopeColumn as r, relatedTargetsSql as s, compileWhere as t };
613
+ export { relatedRowGuard as a, relationArmSql as c, scopeMembershipTable as i, renderGraphSql as l, escapeLike as n, relatedSql as o, scopeColumn as r, relatedTargetsSql as s, compileWhere as t, restrictedRowsSql as u };
@@ -0,0 +1,94 @@
1
+ import { Ir as Condition, Pr as Subject, br as Scope, mn as WhereResult } from "./policy-IB6yxpC3.js";
2
+ import { y as ResourceNode } from "./permissions-DttnqqxC.js";
3
+ import { r as RelationsMapping, t as GraphSql } from "./graph-sql-B-dsAT6j.js";
4
+ //#region src/conditions/compile.d.ts
5
+ type MembershipTable = {
6
+ readonly table: string;
7
+ readonly user: string;
8
+ readonly role: string;
9
+ /** Per scope name, the column holding that scope's id (the row's own scope and its ancestors). */
10
+ readonly columns?: Readonly<Record<string, string>>;
11
+ /** Column of the first scope's id; shorthand for `columns[<first scope>]`. */
12
+ readonly tenant?: string;
13
+ /** Column of the second scope's id; shorthand for `columns[<second scope>]`. */
14
+ readonly team?: string;
15
+ readonly id?: string;
16
+ /** Column naming the membership's resource, when one table holds several kinds. */
17
+ readonly resource?: string;
18
+ /** Column holding the membership kind (`Membership.via`); roles with `for` need it. */
19
+ readonly via?: string;
20
+ /** Unix seconds, like `Membership.expiresAt`; `null` never expires. */
21
+ readonly expiresAt?: string;
22
+ };
23
+ type MembershipsMapping = {
24
+ /** The membership table of each named scope. */
25
+ readonly scopes?: Readonly<Record<string, MembershipTable>>;
26
+ /** The first scope's table; shorthand for `scopes[<first scope>]`. */
27
+ readonly tenant?: MembershipTable;
28
+ /** The second scope's table; shorthand for `scopes[<second scope>]`. */
29
+ readonly team?: MembershipTable;
30
+ readonly resource?: Readonly<Record<string, MembershipTable>>;
31
+ };
32
+ type CompileWhereOptions = {
33
+ readonly subject?: Subject;
34
+ readonly memberships?: MembershipsMapping;
35
+ readonly now?: number;
36
+ /** The policy's scopes; `where()` results carry them. Defaults to the implicit `tenant` / `team` pair. */
37
+ readonly scopes?: readonly Scope[];
38
+ /** Where the relation graph lives; without it a `related` node is refused. */
39
+ readonly relations?: RelationsMapping;
40
+ /** The policy's resource graph; `where()` results carry it. */
41
+ readonly resources?: ReadonlyMap<string, ResourceNode>;
42
+ };
43
+ type CompiledCompare = {
44
+ readonly kind: "compare";
45
+ readonly op: "eq" | "ne" | "gt" | "gte" | "lt" | "lte" | "contains" | "in" | "notIn";
46
+ readonly field: string;
47
+ readonly value: unknown;
48
+ };
49
+ type CompiledExists = {
50
+ readonly kind: "exists";
51
+ readonly table: string;
52
+ readonly user: string;
53
+ readonly userValue: string;
54
+ readonly role: string;
55
+ /** Empty means any role. */
56
+ readonly roles: readonly string[];
57
+ readonly rowColumn: string;
58
+ readonly rowField: string;
59
+ readonly expiresAt?: string;
60
+ /** Unix seconds the `expiresAt` column is compared against. */
61
+ readonly now: number;
62
+ /** A membership row matches when this column is `null` or equals `tenantValue`. */
63
+ readonly tenantColumn?: string;
64
+ readonly tenantValue?: string;
65
+ readonly resourceColumn?: string;
66
+ readonly resourceValue?: string;
67
+ };
68
+ type CompiledWhere = {
69
+ readonly kind: "never";
70
+ } | {
71
+ readonly kind: "always";
72
+ } | CompiledCompare | {
73
+ readonly kind: "isNull";
74
+ readonly field: string;
75
+ readonly negated: boolean;
76
+ } | {
77
+ readonly kind: "and" | "or";
78
+ readonly items: readonly CompiledWhere[];
79
+ } | {
80
+ readonly kind: "not";
81
+ readonly item: CompiledWhere;
82
+ } | CompiledExists | CompiledSql;
83
+ /** A Postgres boolean over the row that is never NULL: a `related` node's subquery. */
84
+ type CompiledSql = {
85
+ readonly kind: "sql";
86
+ readonly parts: GraphSql;
87
+ /** What a `{ subject: true }` part binds. */
88
+ readonly subject: string;
89
+ };
90
+ /** A `contains` pattern for `LIKE`: `%`, `_` and the escape itself match literally. */
91
+ declare function escapeLike(value: string): string;
92
+ declare function compileWhere(input: Condition | WhereResult, options?: CompileWhereOptions): CompiledWhere;
93
+ //#endregion
94
+ export { CompiledWhere as a, compileWhere as c, CompiledSql as i, escapeLike as l, CompiledCompare as n, MembershipTable as o, CompiledExists as r, MembershipsMapping as s, CompileWhereOptions as t };
@@ -0,0 +1,157 @@
1
+ import { t as CliError } from "./errors-CWfoNg9N.js";
2
+ import { existsSync } from "node:fs";
3
+ import { relative, resolve } from "node:path";
4
+ //#region src/cli/config-schema.ts
5
+ const SECTIONS = {
6
+ collect: {
7
+ srcPath: true,
8
+ out: true,
9
+ barrel: true
10
+ },
11
+ catalog: { out: true },
12
+ openapi: { doc: true },
13
+ rls: {
14
+ tables: true,
15
+ dialect: true,
16
+ memberships: true,
17
+ membershipSources: true,
18
+ suspension: true,
19
+ functions: true,
20
+ inlineFunctions: true,
21
+ force: true,
22
+ fixtures: true,
23
+ tenantClaim: true,
24
+ tenantType: true,
25
+ teamType: true,
26
+ scopeTypes: true,
27
+ roleClaim: true,
28
+ gucPrefix: true,
29
+ out: true,
30
+ drizzle: true,
31
+ prisma: true,
32
+ schema: true,
33
+ authorize: true,
34
+ policyPerRole: true,
35
+ customRoles: true,
36
+ capabilities: true,
37
+ anonymousSignIns: true,
38
+ fields: true,
39
+ revokeColumns: true,
40
+ policyName: true,
41
+ rbac: true,
42
+ roles: true,
43
+ actions: true,
44
+ helpersOnly: true,
45
+ rowHelpers: true,
46
+ treeValues: true,
47
+ trustedReaders: true,
48
+ migrate: true,
49
+ shims: true,
50
+ tenants: true,
51
+ customRoleWrites: true,
52
+ anonExecute: true,
53
+ assignments: true,
54
+ approvals: true,
55
+ jsonSchema: true,
56
+ ownershipTriggers: true,
57
+ readOnlyActors: true,
58
+ apiKeys: true,
59
+ realtime: true,
60
+ storage: true
61
+ },
62
+ supabase: { hook: true },
63
+ powersync: {
64
+ out: true,
65
+ resources: true,
66
+ action: true,
67
+ manifest: true
68
+ },
69
+ doctor: {
70
+ sensitiveActions: true,
71
+ memberships: true,
72
+ credentials: true,
73
+ clientEntries: true,
74
+ migrations: true,
75
+ claims: true,
76
+ srcPath: true
77
+ }
78
+ };
79
+ const TOP_LEVEL = /* @__PURE__ */ new Set([
80
+ "permissions",
81
+ "policy",
82
+ ...Object.keys(SECTIONS)
83
+ ]);
84
+ function isRecord(value) {
85
+ return value !== null && typeof value === "object" && !Array.isArray(value);
86
+ }
87
+ function isSection(key) {
88
+ return Object.hasOwn(SECTIONS, key);
89
+ }
90
+ /**
91
+ * Checks the shape a command relies on before it reads the config: module
92
+ * paths are strings and each section is an object. A key PermDock does not
93
+ * read is a warning, so a config written for a newer version still loads.
94
+ */
95
+ function parseConfig(value, file) {
96
+ if (value === void 0) return {
97
+ config: {},
98
+ warnings: []
99
+ };
100
+ if (!isRecord(value)) throw new CliError("usage", `PermDock CLI: ${file} must export a config object as default (use defineConfig)`);
101
+ const warnings = [];
102
+ const unknown = (path, known) => `${file}: unknown key ${path}; PermDock reads ${[...known].join(", ")}`;
103
+ for (const [key, entry] of Object.entries(value)) {
104
+ if (key === "permissions" || key === "policy") {
105
+ if (entry !== void 0 && typeof entry !== "string") throw new CliError("usage", `PermDock CLI: ${file}: ${key} must be a module path string`);
106
+ continue;
107
+ }
108
+ if (!isSection(key)) {
109
+ warnings.push(unknown(key, TOP_LEVEL));
110
+ continue;
111
+ }
112
+ if (entry === void 0) continue;
113
+ if (!isRecord(entry)) throw new CliError("usage", `PermDock CLI: ${file}: ${key} must be an object`);
114
+ const known = SECTIONS[key];
115
+ for (const child of Object.keys(entry)) if (!Object.hasOwn(known, child)) warnings.push(unknown(`${key}.${child}`, Object.keys(known)));
116
+ }
117
+ return {
118
+ config: value,
119
+ warnings
120
+ };
121
+ }
122
+ //#endregion
123
+ //#region src/cli/config.ts
124
+ const CONFIG_FILES = [
125
+ "permdock.config.ts",
126
+ "permdock.config.mts",
127
+ "permdock.config.js",
128
+ "permdock.config.mjs"
129
+ ];
130
+ function defineConfig(config) {
131
+ return config;
132
+ }
133
+ function isConfigFile(name) {
134
+ return CONFIG_FILES.some((file) => file === name);
135
+ }
136
+ async function readConfig(cwd, fromFlag, options) {
137
+ const path = fromFlag ? resolve(cwd, fromFlag) : CONFIG_FILES.map((name) => resolve(cwd, name)).find((file) => existsSync(file));
138
+ if (path === void 0) return {
139
+ config: {},
140
+ warnings: [],
141
+ file: void 0
142
+ };
143
+ if (!existsSync(path)) throw new Error(`PermDock CLI: config file not found: ${path}`);
144
+ const { loadModule, pickNamed } = await import("./load-DwJUafYN.js");
145
+ return {
146
+ ...parseConfig(pickNamed(await loadModule(path, options), ["default"]), relative(cwd, path).replaceAll("\\", "/")),
147
+ file: path
148
+ };
149
+ }
150
+ async function loadConfig(cwd, fromFlag, options) {
151
+ return (await readConfig(cwd, fromFlag, options)).config;
152
+ }
153
+ function resolveCwd(cwd, fallback) {
154
+ return cwd === void 0 ? fallback : resolve(fallback, cwd);
155
+ }
156
+ //#endregion
157
+ export { resolveCwd as a, readConfig as i, isConfigFile as n, loadConfig as r, defineConfig as t };
@@ -0,0 +1,36 @@
1
+ import { i as globalArgs, t as COMMAND_DESCRIPTIONS } from "./commands-DSxCqG9A.js";
2
+ import { defineCommand } from "citty";
3
+ //#region src/cli/commands/config.ts
4
+ function config(ctx) {
5
+ return defineCommand({
6
+ meta: {
7
+ name: "config",
8
+ description: COMMAND_DESCRIPTIONS.config
9
+ },
10
+ args: {
11
+ ...globalArgs,
12
+ print: {
13
+ type: "boolean",
14
+ description: "Print the effective config as JSON: the file, as written, and each default"
15
+ },
16
+ strict: {
17
+ type: "boolean",
18
+ description: "Exit 1 on warnings"
19
+ }
20
+ },
21
+ async run({ args: parsed }) {
22
+ const { runConfig } = await import("./config-report-DMvWKUxL.js");
23
+ ctx.report(runConfig({
24
+ cwd: ctx.cwd,
25
+ config: ctx.config,
26
+ file: ctx.configPath,
27
+ warnings: ctx.configWarnings,
28
+ print: parsed.print === true,
29
+ json: ctx.json,
30
+ strict: parsed.strict === true
31
+ }));
32
+ }
33
+ });
34
+ }
35
+ //#endregion
36
+ export { config };
@@ -0,0 +1,44 @@
1
+ import { n as CONFIG_REPORT_SCHEMA } from "./version-BvacVTZR.js";
2
+ import { t as catalogPath } from "./catalog-path-CnI0XTFK.js";
3
+ import { i as rel, t as defaultSrcPath } from "./files-DWUN9PzI.js";
4
+ import { n as guessPermissions, t as barrelFile } from "./collect-DSTE3ml9.js";
5
+ import "./sources-4p0-4xQm.js";
6
+ import { r as MIGRATION_DIRS } from "./supabase-config-BpPXt3x1.js";
7
+ import { t as DEFAULT_SENSITIVE_ACTIONS } from "./doctor-collect-CHk6XWOA.js";
8
+ //#region src/cli/config-report.ts
9
+ function configReport(input) {
10
+ const { cwd, config } = input;
11
+ const srcPath = config.collect?.srcPath ?? defaultSrcPath();
12
+ const barrel = config.collect?.barrel;
13
+ return {
14
+ $schema: CONFIG_REPORT_SCHEMA,
15
+ file: input.file === void 0 ? null : rel(cwd, input.file),
16
+ config,
17
+ resolved: {
18
+ permissions: config.permissions ?? guessPermissions(cwd, srcPath) ?? null,
19
+ policy: config.policy ?? null,
20
+ srcPath,
21
+ catalog: rel(cwd, catalogPath(config, cwd)),
22
+ barrel: barrel === void 0 || barrel === false ? false : barrelFile(barrel),
23
+ migrations: config.doctor?.migrations ?? MIGRATION_DIRS,
24
+ sensitiveActions: config.doctor?.sensitiveActions ?? DEFAULT_SENSITIVE_ACTIONS,
25
+ rlsSchema: config.rls?.schema ?? config.rls?.rbac?.schema ?? "permdock"
26
+ },
27
+ warnings: input.warnings
28
+ };
29
+ }
30
+ /** `permdock config`: the config's warnings, or with `--print` or `--json` the effective config. */
31
+ function runConfig(input) {
32
+ const report = configReport(input);
33
+ const code = input.strict && report.warnings.length > 0 ? 1 : 0;
34
+ if (input.print || input.json) return {
35
+ code,
36
+ output: `${JSON.stringify(report, null, 2)}\n`
37
+ };
38
+ return {
39
+ code,
40
+ output: `${[report.file === null ? "no permdock.config file; every option takes its default" : `${report.file}: ${report.warnings.length === 0 ? "ok" : `${String(report.warnings.length)} warning${report.warnings.length === 1 ? "" : "s"}`}`, ...report.warnings.map((warning) => ` warn ${warning}`)].join("\n")}\n`
41
+ };
42
+ }
43
+ //#endregion
44
+ export { runConfig };
@@ -1,5 +1,5 @@
1
1
  import { t as compact } from "./compact-y6vfu2_f.js";
2
- import { r as PermDockRevokedError } from "./errors-Iy71s7Oj.js";
2
+ import { r as PermDockRevokedError } from "./errors-Cz5zn0mW.js";
3
3
  //#region src/server/connection.ts
4
4
  /** `setTimeout` stores delays in a signed 32-bit integer. */
5
5
  const MAX_DELAY = 2147483647;
@@ -1,7 +1,6 @@
1
1
  import { t as compact } from "./compact-y6vfu2_f.js";
2
- import { t as emptySnapshot } from "./from-snapshot-BMGnhmgv.js";
3
- import { t as createClientStore } from "./store-C6hFW6ta.js";
4
- import { t as isPromiseLike } from "./source-DoBBYJi2.js";
2
+ import { i as isPromiseLike } from "./store-options-ByhZq1jV.js";
3
+ import { n as switchTenant, t as providerStore } from "./provider-store-Cfbvo4DE.js";
5
4
  import { getContext, onDestroy, setContext } from "svelte";
6
5
  import { toStore } from "svelte/store";
7
6
  //#region src/svelte/context.ts
@@ -21,46 +20,56 @@ function connectSvelteStore(options) {
21
20
  const source = options.snapshot;
22
21
  const promised = isPromiseLike(source);
23
22
  const reactive = promised ? void 0 : reactiveSource(source);
24
- let initial = emptySnapshot();
23
+ let initial;
25
24
  if (reactive !== void 0) reactive.subscribe((value) => {
26
25
  initial = value;
27
26
  })();
28
27
  else if (!promised) initial = source;
29
- const store = createClientStore(compact({
30
- snapshot: initial,
28
+ const tenant = options.tenant;
29
+ const headers = options.headers;
30
+ const store = providerStore(compact({
31
31
  endpoint: options.endpoint,
32
+ snapshotUrl: options.snapshotUrl,
32
33
  approvals: options.approvals,
33
- tenant: options.tenant,
34
+ tenant: typeof tenant === "function" ? tenant() : tenant,
35
+ maxAge: options.maxAge
36
+ }), () => ({
37
+ headers: typeof headers === "function" ? headers() : headers,
34
38
  fetch: options.fetch,
35
- headers: options.headers,
36
- maxAge: options.maxAge,
37
39
  verifier: options.verifier
38
- }));
39
- if (promised) {
40
- store.follow(source);
41
- return {
42
- store,
43
- stop: () => void 0
44
- };
45
- }
46
- if (reactive === void 0) return {
47
- store,
48
- stop: () => void 0
49
- };
50
- let current = initial;
51
- return {
52
- store,
53
- stop: reactive.subscribe((value) => {
40
+ }), promised ? source : initial);
41
+ const stops = [];
42
+ if (reactive !== void 0) {
43
+ let current = initial;
44
+ stops.push(reactive.subscribe((value) => {
54
45
  if (value !== current) {
55
46
  current = value;
56
47
  store.replace(value);
57
48
  }
58
- })
49
+ }));
50
+ }
51
+ if (typeof tenant === "function") {
52
+ let active = tenant();
53
+ stops.push(toStore(tenant).subscribe((next) => {
54
+ if (next !== void 0 && next !== active) {
55
+ active = next;
56
+ switchTenant(store, next);
57
+ }
58
+ }));
59
+ }
60
+ return {
61
+ store,
62
+ stop: () => {
63
+ for (const stop of stops) stop();
64
+ }
59
65
  };
60
66
  }
61
67
  function providePermDock(options) {
62
68
  const { store, stop } = connectSvelteStore(options);
63
- onDestroy(stop);
69
+ onDestroy(() => {
70
+ stop();
71
+ store.dispose();
72
+ });
64
73
  setContext(permDockKey, store);
65
74
  return store;
66
75
  }
@@ -1,6 +1,7 @@
1
- import { C as Policy, E as PolicyVocabulary, Zt as PermDock, mr as Principal } from "../policy-CInmNGkM.js";
2
- import { d as Permission } from "../permissions-B4apnahQ.js";
3
- import { o as ProblemDetails, r as PermDockDeniedError } from "../errors-DbZ1YOnb.js";
1
+ import { C as Policy, D as PolicyVocabulary, Nr as Principal, ln as PermDock } from "../policy-IB6yxpC3.js";
2
+ import { f as Permission } from "../permissions-DttnqqxC.js";
3
+ import { a as ProblemDetails, r as PermDockDeniedError } from "../errors-DPdqI50v.js";
4
+ import { t as InstanceOptions } from "../instance-options-jARdwfPN.js";
4
5
  //#region src/convex/types.d.ts
5
6
  type ConvexCtxLike = {
6
7
  readonly auth?: {
@@ -16,8 +17,12 @@ type ConvexQueryBuilder = (definition: {
16
17
  readonly args: Record<string, never>;
17
18
  readonly handler: (ctx: ConvexCtxLike, args: Record<string, never>) => unknown;
18
19
  }) => unknown;
19
- type ConvexPermDockOptions<TCtx, TUser = unknown> = {
20
+ type ConvexPermDockOptions<TCtx, TUser = unknown> = InstanceOptions & {
20
21
  readonly subject: ConvexSubject<TCtx, TUser>;
22
+ /** The active tenant: a fixed id or a function of the Convex context; a throw is no tenant. */
23
+ readonly tenant?: string | ((ctx: TCtx) => string | undefined | Promise<string | undefined>);
24
+ /** The agent or service acting for the subject; anything but an `Actor` is ignored. */
25
+ readonly actor?: (ctx: TCtx) => unknown;
21
26
  readonly query?: ConvexQueryBuilder;
22
27
  };
23
28
  type ConvexHandler<TCtx, TArgs, TResult, V extends PolicyVocabulary = PolicyVocabulary> = (ctx: ConvexPermDockCtx<TCtx, V>, args: TArgs) => TResult | Promise<TResult>;