permdock 0.1.0 → 0.2.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 (349) 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-cmvX2jDe.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 +206 -0
  18. package/dist/better-supabase/index.js +620 -0
  19. package/dist/bind-CVy3Espv.d.ts +25 -0
  20. package/dist/bind-VnYn2HKq.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-B68OFnZx.js → capability-4qPdO9gk.js} +7 -5
  25. package/dist/{capability-BDG_nkxt.d.ts → capability-Dq43tT1u.d.ts} +2 -2
  26. package/dist/catalog/index.d.ts +1 -1
  27. package/dist/catalog/index.js +1 -1
  28. package/dist/catalog-BjZSovXQ.js +2 -0
  29. package/dist/{catalog-doc-BSo_Q_-6.js → catalog-doc-Dsc9y7sd.js} +23 -12
  30. package/dist/{catalog-B0E6bggc.js → catalog-h2tlKFkq.js} +2 -2
  31. package/dist/{catalog-H-vFGwWK.js → catalog-z8q6bi_r.js} +4 -4
  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-BGhHS-lY.js} +2 -2
  44. package/dist/{cloud-Cuxr6Czw.js → cloud-Bo3e9Ak3.js} +7 -6
  45. package/dist/{collect-O-tOtbnk.js → collect-DDDv_ESs.js} +194 -42
  46. package/dist/collect-DLlujdHC.js +83 -0
  47. package/dist/collect-rG2IQ3t0.js +2 -0
  48. package/dist/{commands-BMh_Etm2.js → commands-DWOrSQic.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-CNnl6uIt.d.ts +94 -0
  53. package/dist/config-BJiM-xAm.js +157 -0
  54. package/dist/config-Bn00Z3ks.js +36 -0
  55. package/dist/config-report-Dw_JcUqT.js +44 -0
  56. package/dist/{connection-JvqwHODC.js → connection-CU8MQxRi.js} +1 -1
  57. package/dist/{context-CKEAabd7.js → context-Ttp0ekMT.js} +36 -27
  58. package/dist/convex/index.d.ts +9 -4
  59. package/dist/convex/index.js +14 -4
  60. package/dist/create-BWyx3jua.d.ts +245 -0
  61. package/dist/create-CPhDL6qx.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-PdoqESvg.d.ts} +9 -10
  66. package/dist/{diff-x5Il8LVa.js → diff-B8Tunc3o.js} +44 -11
  67. package/dist/{diff-BUzf5Poi.js → diff-CzqLxZ77.js} +2 -2
  68. package/dist/doctor-WpvG6p4k.js +1194 -0
  69. package/dist/doctor-collect-ByfYlNv1.js +664 -0
  70. package/dist/{doctor-Bqo6FwUa.js → doctor-rOr-4ZfS.js} +2 -2
  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-DAqevpNk.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-C3sHpZNS.js} +65 -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-LF_hS-yn.d.ts → index-A0YNL8jZ.d.ts} +1 -1
  105. package/dist/index-CtE07CBF.d.ts +6 -0
  106. package/dist/{index-xIxJLwOQ.d.ts → index-D3vbkoSI.d.ts} +75 -7
  107. package/dist/{index-CltcQ4Bf.d.ts → index-D6_cSa1z.d.ts} +68 -5
  108. package/dist/index.d.ts +14 -9
  109. package/dist/index.js +22 -17
  110. package/dist/instance-options-BK_rNOSC.d.ts +11 -0
  111. package/dist/instance-options-Dhhcnm3y.js +22 -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-GSQnMz3O.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-CwePaF7C.js → openapi-Bbg4wGVL.js} +3 -3
  144. package/dist/{openapi-DcqM8nU7.js → openapi-BqRBvAng.js} +237 -5
  145. package/dist/{openapi-DWD0Uc_4.js → openapi-CqqEbHsL.js} +5 -5
  146. package/dist/{openapi-import-BWRUNNeW.js → openapi-import-cmwetbzw.js} +1 -1
  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-BkGQNzAh.d.ts +10 -0
  153. package/dist/parse-local-manifest-BrMozJCo.js +36 -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-CzqXjCpU.js} +641 -126
  157. package/dist/{permissions-B8vCg_bI.d.ts → permissions-CDgvKG5L.d.ts} +2 -2
  158. package/dist/{permissions-CofRqesP.js → permissions-CpZrivYv.js} +3 -3
  159. package/dist/{permissions-DC7GROPA.js → permissions-DVoF6dMt.js} +77 -15
  160. package/dist/{permissions-B4apnahQ.d.ts → permissions-DttnqqxC.d.ts} +34 -5
  161. package/dist/{pins-CqE1jZuF.js → pins-8ILTftC9.js} +2 -2
  162. package/dist/{policy-CInmNGkM.d.ts → policy-CFZAr_Al.d.ts} +330 -37
  163. package/dist/{policy-Cq2fB8Q5.d.ts → policy-D8UFyERw.d.ts} +2 -2
  164. package/dist/{policy-ANp36PnI.js → policy-xyWg7QdR.js} +173 -22
  165. package/dist/powersync-A8x_Yyvh.js +2 -0
  166. package/dist/powersync-C7kLglqX.js +540 -0
  167. package/dist/powersync-yW1UUFzp.js +62 -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-CkL50EEf.d.ts +7 -0
  172. package/dist/problem-details-_AMOYz-w.js +144 -0
  173. package/dist/{protected-BuPAycJT.d.ts → protected-CNsMzrVd.d.ts} +5 -4
  174. package/dist/protected-Cs6kTaHo.js +100 -0
  175. package/dist/protected-bZs6rbT1.d.ts +40 -0
  176. package/dist/{provider-wTAUda2v.d.ts → provider-Cjr62YMV.d.ts} +1 -1
  177. package/dist/provider-DLzpb2Xz.js +52 -0
  178. package/dist/provider-store-DNyC1y48.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-sqBGMnNs.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-BMNydpHk.js +2521 -0
  192. package/dist/{rls-BOFU3chG.js → rls-CEvs64Kj.js} +8 -3
  193. package/dist/rls-fields-BMasREhR.js +3502 -0
  194. package/dist/{rls-graph-DxQ39PJj.js → rls-graph-pc9fuXYm.js} +100 -36
  195. package/dist/{rls-import-CXV6LBlS.js → rls-import-D8F7j35Q.js} +7 -6
  196. package/dist/{rls-migrate-DrFPbf8p.js → rls-migrate-7wikfrVI.js} +6 -5
  197. package/dist/rls-ownership-B5Lkq62W.js +843 -0
  198. package/dist/rls-shared-aOQ4hGTO.js +493 -0
  199. package/dist/rls-verify-D8B7dOTh.js +745 -0
  200. package/dist/{row-check-BajTgQZ-.d.ts → row-check-Dt35czLy.d.ts} +12 -15
  201. package/dist/rpc-DOK54_CS.js +89 -0
  202. package/dist/{run-CJ6UvS3a.js → run-YXCJDNYk.js} +31 -12
  203. package/dist/runtime-CB8gQFvS.js +11 -0
  204. package/dist/{saas-BRrZzJkM.js → saas-Bj_FFkjN.js} +17 -7
  205. package/dist/{schema-P8yoma__.js → schema-D3MnDMxa.js} +8 -4
  206. package/dist/scim/index.d.ts +1 -1
  207. package/dist/scim/index.js +1 -1
  208. package/dist/{scim-9NFa0XVZ.js → scim-BFGBBAqR.js} +1 -1
  209. package/dist/{scopes-cKVp_WTw.js → scopes-CVdPrWN-.js} +35 -8
  210. package/dist/server/index.d.ts +22 -11
  211. package/dist/server/index.js +11 -8
  212. package/dist/{credentials-BgRX3WEg.js → server-DlZ28Oz5.js} +1 -1
  213. package/dist/shared-DRu8VFVM.js +123 -0
  214. package/dist/{sink-Cfr9-7YC.d.ts → sink-Gs6TTVa-.d.ts} +1 -1
  215. package/dist/skills-Biq5uup3.js +192 -0
  216. package/dist/{skills-C_lpV4Jx.js → skills-JaymNCdK.js} +10 -4
  217. package/dist/{snapshot-DE8dE_hz.js → snapshot-Enxd0n-s.js} +138 -214
  218. package/dist/snapshot-cache-D6jLelln.js +44 -0
  219. package/dist/snapshot-cache-DwQH8ufx.d.ts +45 -0
  220. package/dist/solid/index.d.ts +39 -9
  221. package/dist/solid/index.js +76 -85
  222. package/dist/sources-B0UvrJ21.js +534 -0
  223. package/dist/sources-BcJgw0lt.d.ts +192 -0
  224. package/dist/{sql-Bll1d7y0.js → sql-xdg5f4Fi.js} +6 -1
  225. package/dist/{src-CTNT-PBW.js → src-CSbUiozF.js} +149 -11
  226. package/dist/ssf/index.d.ts +3 -2
  227. package/dist/ssf/index.js +3 -29
  228. package/dist/store-DMAWwAJV.js +371 -0
  229. package/dist/{store-Bq90395i.d.ts → store-D_pjn91-.d.ts} +13 -4
  230. package/dist/store-options-yO0V6gRn.js +716 -0
  231. package/dist/{stores-CkG2HrSg.js → stores-4_sqiOA1.js} +10 -63
  232. package/dist/{stores-CvOnu_2T.d.ts → stores-DVR5NHLE.d.ts} +20 -9
  233. package/dist/{stream-Q_xlB6Ko.js → stream-DDpvynSB.js} +16 -2
  234. package/dist/{stream-BhMfZOwr.d.ts → stream-DlvG2hs-.d.ts} +2 -2
  235. package/dist/subject-settings-BwBmCdTR.js +128 -0
  236. package/dist/supabase/index.d.ts +122 -6
  237. package/dist/supabase/index.js +4 -3
  238. package/dist/supabase/middleware.d.ts +32 -27
  239. package/dist/supabase/middleware.js +56 -22
  240. package/dist/{supabase-D8UlBA7Z.js → supabase-CwafwxxF.js} +3 -3
  241. package/dist/{supabase-DTxGtYdi.js → supabase-DTBaC20O.js} +345 -367
  242. package/dist/supabase-config-Bs44dare.js +472 -0
  243. package/dist/{supabase-hook-D_OqGb_V.js → supabase-hook-BuxLQLpU.js} +994 -708
  244. package/dist/supabase-hook-D5qVd_D8.js +2 -0
  245. package/dist/supautils-DYZnzRWV.js +91 -0
  246. package/dist/svelte/PermissionBoundary.svelte +37 -0
  247. package/dist/svelte/Protected.svelte +8 -2
  248. package/dist/svelte/index.d.ts +9 -6
  249. package/dist/svelte/index.js +61 -7
  250. package/dist/svelte/runtime.d.ts +4 -3
  251. package/dist/svelte/runtime.js +4 -3
  252. package/dist/svelte/source.d.ts +9 -6
  253. package/dist/svelte/source.js +7 -4
  254. package/dist/terminal/index.d.ts +6 -14
  255. package/dist/terminal/index.js +44 -32
  256. package/dist/testing/index.d.ts +105 -16
  257. package/dist/testing/index.js +504 -40
  258. package/dist/testing/saas/index.d.ts +4 -4
  259. package/dist/testing/saas/index.js +2 -2
  260. package/dist/testing/saas/permissions.d.ts +1 -1
  261. package/dist/testing/saas/permissions.js +1 -1
  262. package/dist/token-CIWxJOCh.js +50 -0
  263. package/dist/trpc/index.d.ts +7 -26
  264. package/dist/trpc/index.js +17 -100
  265. package/dist/types-9AWO9EGt.d.ts +197 -0
  266. package/dist/{types-D6Z6-rKJ.d.ts → types-BPxgszlT.d.ts} +260 -22
  267. package/dist/{types-BvBk1wgn.d.ts → types-BVyImy5I.d.ts} +5 -3
  268. package/dist/{types-CxquUByI.d.ts → types-Bvc4oWT6.d.ts} +1 -1
  269. package/dist/types-C3s9xVJG.d.ts +48 -0
  270. package/dist/{types-BBK-exvJ.d.ts → types-Dnemwd77.d.ts} +7 -1
  271. package/dist/types-kxznc7cn.d.ts +52 -0
  272. package/dist/{types-B8w5PFtS.d.ts → types-vKyAMtcX.d.ts} +17 -1
  273. package/dist/{types-B9dmiiab.d.ts → types-vNSDF7Dq.d.ts} +1 -1
  274. package/dist/{sources-DOpW5Ila.d.ts → types-yF5LmQVD.d.ts} +86 -127
  275. package/dist/unplugin/index.d.ts +1 -1
  276. package/dist/unplugin/index.js +10 -9
  277. package/dist/{usage-1ozMubLY.js → usage-D07N9QJ3.js} +2 -2
  278. package/dist/usage-D82l1CwK.js +2 -0
  279. package/dist/{usage-CUnK6Ou9.js → usage-DG1oeCca.js} +225 -62
  280. package/dist/validation-error-CnjZ4t92.js +33 -0
  281. package/dist/validation-error-CtF23SrC.d.ts +26 -0
  282. package/dist/{validity-D0uRmJKJ.js → validity-uOp8UpYn.js} +57 -36
  283. package/dist/{verifier-B90agnhl.js → verifier-BxBo6I44.js} +10 -5
  284. package/dist/version-BvacVTZR.js +17 -0
  285. package/dist/views-Soe7bGSC.js +95 -0
  286. package/dist/{vocabulary-Dk0fs-Jk.d.ts → vocabulary-DA8a8zif.d.ts} +1 -1
  287. package/dist/vue/index.d.ts +35 -13
  288. package/dist/vue/index.js +86 -93
  289. package/dist/watch-Etoa_Mvr.js +2 -0
  290. package/dist/watch-UihESpsJ.js +128 -0
  291. package/dist/webmcp/index.d.ts +2 -2
  292. package/dist/webmcp/index.js +7 -13
  293. package/package.json +62 -36
  294. package/schemas/approval-request-v1.json +175 -0
  295. package/schemas/catalog-v1.json +29 -1
  296. package/schemas/supabase-claims-v1.json +6 -1
  297. package/schemas/supabase-manifest-v1.json +150 -6
  298. package/skills/permdock/SKILL.md +7 -7
  299. package/skills/permdock-agents/SKILL.md +5 -5
  300. package/skills/permdock-agents/references/runtimes.md +12 -10
  301. package/skills/permdock-approvals/SKILL.md +4 -4
  302. package/skills/permdock-approvals/references/stores-and-resume.md +15 -4
  303. package/skills/permdock-audit/SKILL.md +3 -3
  304. package/skills/permdock-credentials/SKILL.md +4 -4
  305. package/skills/permdock-credentials/references/tokens-keys-links.md +7 -2
  306. package/skills/permdock-data/SKILL.md +4 -4
  307. package/skills/permdock-data/references/queries-and-rls.md +14 -6
  308. package/skills/permdock-data/references/relationships.md +5 -3
  309. package/skills/permdock-tenancy/SKILL.md +9 -6
  310. package/skills/permdock-tenancy/references/ownership-and-custom-roles.md +14 -8
  311. package/skills/permdock-wire/SKILL.md +4 -4
  312. package/skills/permdock-wire/references/adapters.md +42 -30
  313. package/skills/permdock-wire/references/policy-options.md +5 -3
  314. package/dist/approvers-aH0PJkmf.js +0 -20
  315. package/dist/catalog-idsHc0vo.js +0 -2
  316. package/dist/collect-B7_TIfmg.js +0 -49
  317. package/dist/collect-fRPAQIWb.js +0 -2
  318. package/dist/compile-CQbvyIBr.d.ts +0 -30
  319. package/dist/config-BPYmjTOp.js +0 -26
  320. package/dist/context-gtAwAILx.js +0 -6
  321. package/dist/create-BKF3dgFk.d.ts +0 -162
  322. package/dist/create-CSkhDU9T.js +0 -222
  323. package/dist/doctor-BGle8Gqi.js +0 -1314
  324. package/dist/helpers-DnSOrhB9.js +0 -682
  325. package/dist/index-fG6NSXlc.d.ts +0 -9
  326. package/dist/kernel-YOGCWNLf.js +0 -211
  327. package/dist/load-QOOm1z70.js +0 -2
  328. package/dist/manifest-DDQbC6K0.d.ts +0 -118
  329. package/dist/map-error-RJ3ZsUyA.js +0 -16
  330. package/dist/may-use-CnFEjVEp.js +0 -37
  331. package/dist/pg-4GJWDUxG.js +0 -953
  332. package/dist/plugin-4gr7IxFJ.js +0 -65
  333. package/dist/protected-B4K3BKoX.js +0 -138
  334. package/dist/protected-wY7nXhY9.d.ts +0 -23
  335. package/dist/provider-_wx46HpB.js +0 -48
  336. package/dist/rls-CJVja9Ww.js +0 -2119
  337. package/dist/rls-helpers-BxRuif0l.js +0 -1346
  338. package/dist/runtime-DP9ttFh1.js +0 -27
  339. package/dist/skills-Dx3QLnMY.js +0 -110
  340. package/dist/source-DoBBYJi2.js +0 -6
  341. package/dist/sources-DVHM3Mwq.js +0 -284
  342. package/dist/store-C6hFW6ta.js +0 -508
  343. package/dist/subject-settings-xt7V845g.js +0 -82
  344. package/dist/supabase-hook-DW-xP4hU.js +0 -2
  345. package/dist/types-DbWdEfcm.d.ts +0 -87
  346. package/dist/types-bva3i4Gf.d.ts +0 -98
  347. package/dist/types-i4BAOvdb.d.ts +0 -97
  348. package/dist/usage-PyEor6GA.js +0 -2
  349. package/dist/version-CnSh33Fj.js +0 -16
@@ -0,0 +1,783 @@
1
+ import { t as compact } from "./compact-y6vfu2_f.js";
2
+ import { n as freezeDeep } from "./freeze-CrU8nQeX.js";
3
+ import { n as PermDockValidationError } from "./validation-error-CnjZ4t92.js";
4
+ import { t as ignoreRejection } from "./thenable-okc2xDsj.js";
5
+ import { t as anonymousSubject } from "./subject-C6dLxqHU.js";
6
+ import { t as clientNameOf } from "./clients-DjU5ABMy.js";
7
+ import "./budget-NbEtbJC_.js";
8
+ import { n as copyJson, t as checkSchema } from "./json-schema-BsAflUGW.js";
9
+ //#region src/supabase/subject.ts
10
+ const REGISTERED = /* @__PURE__ */ new Set([
11
+ "sub",
12
+ "role",
13
+ "iss",
14
+ "aud",
15
+ "exp",
16
+ "iat",
17
+ "nbf",
18
+ "aal",
19
+ "amr",
20
+ "acr",
21
+ "session_id",
22
+ "email",
23
+ "phone",
24
+ "is_anonymous",
25
+ "app_metadata",
26
+ "user_metadata",
27
+ "act",
28
+ "client_id",
29
+ "scope"
30
+ ]);
31
+ function isRecord(value) {
32
+ return value !== null && typeof value === "object" && !Array.isArray(value);
33
+ }
34
+ /** Top-level first, then `app_metadata`. `null` counts as absent: the RBAC hook writes `null` for a user with no role row. */
35
+ function readClaim(claims, name) {
36
+ const top = Object.hasOwn(claims, name) ? claims[name] : void 0;
37
+ if (top !== void 0 && top !== null) return top;
38
+ const meta = claims["app_metadata"];
39
+ if (isRecord(meta) && Object.hasOwn(meta, name)) return meta[name] ?? void 0;
40
+ }
41
+ function asRoles(value, declared) {
42
+ const raw = typeof value === "string" ? value === "" ? [] : [value] : Array.isArray(value) ? value.filter((item) => typeof item === "string") : [];
43
+ if (declared === void 0) return raw;
44
+ const allowed = new Set(declared);
45
+ return raw.filter((role) => allowed.has(role));
46
+ }
47
+ /** Reads the `memberships` claim; an entry it cannot read is dropped and its index reported. */
48
+ function readMemberships(value) {
49
+ if (!Array.isArray(value)) return {
50
+ memberships: [],
51
+ dropped: []
52
+ };
53
+ const out = [];
54
+ const dropped = [];
55
+ for (const [index, item] of value.entries()) {
56
+ const membership = asMembership(item);
57
+ if (membership === void 0) dropped.push(index);
58
+ else out.push(membership);
59
+ }
60
+ return {
61
+ memberships: out,
62
+ dropped
63
+ };
64
+ }
65
+ function asMembership(item) {
66
+ if (!isRecord(item) || !Array.isArray(item["roles"])) return;
67
+ const roles = item["roles"].filter((role) => typeof role === "string");
68
+ if (roles.length === 0) return;
69
+ const scope = typeof item["scope"] === "string" ? item["scope"] : void 0;
70
+ const id = typeof item["id"] === "string" ? item["id"] : void 0;
71
+ const within = isRecord(item["within"]) ? Object.fromEntries(Object.entries(item["within"]).filter((entry) => typeof entry[1] === "string")) : void 0;
72
+ const tenant = typeof item["tenant"] === "string" ? item["tenant"] : void 0;
73
+ const team = typeof item["team"] === "string" ? item["team"] : void 0;
74
+ const onRecord = isRecord(item["on"]) ? item["on"] : void 0;
75
+ const on = onRecord !== void 0 && typeof onRecord["resource"] === "string" && typeof onRecord["id"] === "string" ? {
76
+ resource: onRecord["resource"],
77
+ id: onRecord["id"]
78
+ } : void 0;
79
+ if ((scope === void 0 || id === void 0) && tenant === void 0 && team === void 0 && on === void 0) return;
80
+ const keep = item["keep"];
81
+ if (keep !== void 0 && (!Array.isArray(keep) || !keep.every((key) => typeof key === "string" && key !== ""))) return;
82
+ return compact({
83
+ roles,
84
+ scope,
85
+ id,
86
+ within,
87
+ tenant,
88
+ team,
89
+ on,
90
+ via: typeof item["via"] === "string" ? item["via"] : void 0,
91
+ expiresAt: typeof item["expiresAt"] === "number" ? item["expiresAt"] : void 0,
92
+ grantedBy: typeof item["grantedBy"] === "string" ? item["grantedBy"] : void 0,
93
+ reason: typeof item["reason"] === "string" ? item["reason"] : void 0,
94
+ member: memberOf(item["member"]),
95
+ managedBy: item["managedBy"] === "idp" ? "idp" : void 0,
96
+ entitlements: Array.isArray(item["entitlements"]) ? item["entitlements"].filter((seat) => typeof seat === "string") : void 0,
97
+ keep: keep === void 0 ? void 0 : asStrings(keep)
98
+ });
99
+ }
100
+ function memberOf(value) {
101
+ if (value === null || typeof value !== "object" || !Object.hasOwn(value, "group")) return;
102
+ const group = value.group;
103
+ return typeof group === "string" && group !== "" ? { group } : void 0;
104
+ }
105
+ function asStrings(value) {
106
+ return Array.isArray(value) ? value.filter((item) => typeof item === "string") : [];
107
+ }
108
+ /** `claims[plans][tenant]`: only the active tenant's entry, never another tenant's. */
109
+ function plansFor(claims, name, tenant) {
110
+ if (name === void 0 || tenant === void 0) return [];
111
+ const byTenant = readClaim(claims, name);
112
+ if (!isRecord(byTenant) || !Object.hasOwn(byTenant, tenant)) return [];
113
+ return asStrings(byTenant[tenant]);
114
+ }
115
+ const INVALID_CHAIN = Object.freeze({
116
+ ok: false,
117
+ reason: "invalid-chain"
118
+ });
119
+ const NO_ACTOR = Object.freeze({ ok: true });
120
+ /** Own entries of one `act` level, with the nested `act` copied the same way. */
121
+ function copyAct(level) {
122
+ const entries = Object.entries(level).map(([key, value]) => [key, key === "act" && isRecord(value) ? copyAct(value) : value]);
123
+ return Object.fromEntries(entries);
124
+ }
125
+ /**
126
+ * The outer `act` level by its `kind`, the marker a support tool writes: none is an OAuth client
127
+ * or agent chain, `support` a support session (with `session_id`), `impersonation` an admin acting
128
+ * as the user. Any other `kind`, or a support level without `session_id`, is invalid.
129
+ */
130
+ function actingParty(outer, id) {
131
+ const marked = Object.hasOwn(outer, "kind") ? outer["kind"] : void 0;
132
+ const kind = marked === void 0 && Object.hasOwn(outer, "session_id") ? "support" : marked;
133
+ const chain = copyAct(outer);
134
+ const reason = typeof outer["reason"] === "string" ? outer["reason"] : void 0;
135
+ switch (kind) {
136
+ case void 0: return freezeDeep({
137
+ ok: true,
138
+ actor: {
139
+ id,
140
+ kind: "oauth-client",
141
+ chain
142
+ }
143
+ });
144
+ case "support": {
145
+ const session = outer["session_id"];
146
+ const readOnly = Object.hasOwn(outer, "read_only") ? outer["read_only"] : true;
147
+ if (typeof session !== "string" || session === "" || typeof readOnly !== "boolean") return INVALID_CHAIN;
148
+ return freezeDeep({
149
+ ok: true,
150
+ actor: compact({
151
+ id,
152
+ kind: "support",
153
+ sessionId: session,
154
+ readOnly,
155
+ reason,
156
+ chain
157
+ })
158
+ });
159
+ }
160
+ case "impersonation": return freezeDeep({
161
+ ok: true,
162
+ actor: compact({
163
+ id,
164
+ kind: "impersonation",
165
+ reason,
166
+ chain
167
+ })
168
+ });
169
+ default: return INVALID_CHAIN;
170
+ }
171
+ }
172
+ function readActor(claims) {
173
+ if (Object.hasOwn(claims, "act") && claims["act"] !== void 0) {
174
+ let current = claims["act"];
175
+ while (current !== void 0) {
176
+ const level = isRecord(current) ? current["sub"] : void 0;
177
+ if (!isRecord(current) || typeof level !== "string" || level === "") return INVALID_CHAIN;
178
+ current = Object.hasOwn(current, "act") ? current["act"] : void 0;
179
+ }
180
+ const outer = claims["act"];
181
+ const sub = isRecord(outer) ? outer["sub"] : void 0;
182
+ if (!isRecord(outer) || typeof sub !== "string") return INVALID_CHAIN;
183
+ return actingParty(outer, sub);
184
+ }
185
+ const client = Object.hasOwn(claims, "client_id") ? claims["client_id"] : void 0;
186
+ if (typeof client === "string" && client !== "") return freezeDeep({
187
+ ok: true,
188
+ actor: {
189
+ id: client,
190
+ kind: "oauth-client"
191
+ }
192
+ });
193
+ return NO_ACTOR;
194
+ }
195
+ /**
196
+ * Who acts for the user: the outermost `sub` of an RFC 8693 `act` chain (the current
197
+ * actor; nested levels are prior actors, kept on `chain` for audit), else the
198
+ * OAuth `client_id` of a third-party app. The outer level's `kind` names the actor:
199
+ * none is `oauth-client`, `support` a support session, `impersonation` an admin acting as the
200
+ * user. Reads only `act` and `client_id`; the caller applies the role rule first (`anon` and
201
+ * `service_role` are anonymous and carry no actor). An `act` that is not a chain of objects each
202
+ * with a non-empty `sub`, that names another `kind`, or a support level without `session_id`,
203
+ * is `{ ok: false }` and must deny.
204
+ */
205
+ function actorOf(claims) {
206
+ try {
207
+ return isRecord(claims) ? readActor(claims) : NO_ACTOR;
208
+ } catch {
209
+ return INVALID_CHAIN;
210
+ }
211
+ }
212
+ const IDENTITY_SCOPES = /* @__PURE__ */ new Set([
213
+ "openid",
214
+ "profile",
215
+ "email",
216
+ "address",
217
+ "phone",
218
+ "offline_access"
219
+ ]);
220
+ /**
221
+ * The OAuth `scope` claim (a space-separated string or a list) as `scopes`,
222
+ * without the OpenID Connect identity scopes; `undefined` when none is left.
223
+ */
224
+ function delegationOf(claims) {
225
+ try {
226
+ if (!isRecord(claims) || !Object.hasOwn(claims, "scope")) return;
227
+ const scope = claims["scope"];
228
+ const scopes = (typeof scope === "string" ? scope.split(/\s+/u).filter(Boolean) : asStrings(scope)).filter((name) => !IDENTITY_SCOPES.has(name));
229
+ return scopes.length > 0 ? freezeDeep({ scopes }) : void 0;
230
+ } catch {
231
+ return;
232
+ }
233
+ }
234
+ function subjectDelegation(claims, chain) {
235
+ const delegation = compact({
236
+ scopes: delegationOf(claims)?.scopes,
237
+ chain
238
+ });
239
+ return Object.keys(delegation).length === 0 ? void 0 : delegation;
240
+ }
241
+ function emit(options, reason, cause) {
242
+ try {
243
+ options.onAuth?.({
244
+ reason,
245
+ cause,
246
+ source: "supabase"
247
+ });
248
+ } catch {}
249
+ }
250
+ function validateClaims(extra, schema) {
251
+ const result = schema["~standard"].validate(extra);
252
+ if (result instanceof Promise) {
253
+ ignoreRejection(result);
254
+ return;
255
+ }
256
+ if ("issues" in result && result.issues !== void 0) return;
257
+ const value = result.value;
258
+ return isRecord(value) ? value : void 0;
259
+ }
260
+ function extraClaims(claims) {
261
+ const extra = {};
262
+ const meta = claims["app_metadata"];
263
+ if (isRecord(meta)) for (const [key, value] of Object.entries(meta)) extra[key] = value;
264
+ for (const [key, value] of Object.entries(claims)) {
265
+ if (REGISTERED.has(key) || key === "user_metadata") continue;
266
+ extra[key] = value;
267
+ }
268
+ return extra;
269
+ }
270
+ function mapClaims(claims, options) {
271
+ const role = claims["role"];
272
+ if (role === "anon" || role === "service_role") return anonymousSubject();
273
+ const id = claims["sub"];
274
+ if (typeof id !== "string" || id === "") return anonymousSubject();
275
+ const act = readActor(claims);
276
+ if (!act.ok) {
277
+ emit(options, "invalid-token", act.reason);
278
+ return anonymousSubject();
279
+ }
280
+ if (options.anonymousSignIns === "deny" && claims["is_anonymous"] === true) return anonymousSubject();
281
+ const actor = act.actor === void 0 ? void 0 : act.actor.kind === "support" ? {
282
+ id: act.actor.id,
283
+ kind: act.actor.kind,
284
+ sessionId: act.actor.sessionId,
285
+ readOnly: act.actor.readOnly
286
+ } : compact({
287
+ id: act.actor.id,
288
+ kind: act.actor.kind,
289
+ client: act.actor.kind === "oauth-client" ? clientNameOf(options.clients, act.actor.id) : void 0
290
+ });
291
+ const roleClaim = options.roles ?? "user_role";
292
+ const tenantClaim = options.tenant ?? "tenant_id";
293
+ const membershipsClaim = options.memberships ?? "memberships";
294
+ let extra = extraClaims(claims);
295
+ if (options.schema !== void 0) extra = validateClaims(extra, options.schema) ?? {};
296
+ const include = new Set(options.include ?? []);
297
+ const tenantValue = readClaim(claims, tenantClaim);
298
+ const version = readClaim(claims, "authz_ver");
299
+ const tenant = typeof tenantValue === "string" ? tenantValue : void 0;
300
+ const { memberships, dropped } = readMemberships(readClaim(claims, membershipsClaim));
301
+ if (dropped.length > 0) emit(options, "schema", "membership-dropped");
302
+ const plans = plansFor(claims, options.plans, tenant);
303
+ const principal = compact({
304
+ id,
305
+ kind: "user",
306
+ roles: asRoles(readClaim(claims, roleClaim), options.declared),
307
+ tenant,
308
+ plans: plans.length > 0 ? plans : void 0,
309
+ memberships,
310
+ membershipsTruncated: readClaim(claims, "memberships_truncated") === true ? true : void 0,
311
+ authzVersion: typeof version === "number" && Number.isInteger(version) ? version : void 0,
312
+ issuer: typeof claims["iss"] === "string" ? claims["iss"] : void 0,
313
+ assurance: typeof claims["aal"] === "string" ? { acr: claims["aal"] } : void 0,
314
+ claims: Object.keys(extra).length === 0 ? void 0 : extra,
315
+ email: include.has("email") && typeof claims["email"] === "string" ? claims["email"] : void 0,
316
+ phone: include.has("phone") && typeof claims["phone"] === "string" ? claims["phone"] : void 0,
317
+ is_anonymous: include.has("is_anonymous") && typeof claims["is_anonymous"] === "boolean" ? claims["is_anonymous"] : void 0
318
+ });
319
+ const session = typeof claims["session_id"] === "string" ? claims["session_id"] : void 0;
320
+ const expiresAt = typeof claims["exp"] === "number" ? claims["exp"] : void 0;
321
+ return freezeDeep(compact({
322
+ principal,
323
+ actor,
324
+ delegation: act.actor?.kind === "oauth-client" ? subjectDelegation(claims, act.actor.chain) : void 0,
325
+ context: {},
326
+ session,
327
+ expiresAt,
328
+ liveSession: options.liveSession === true && session !== void 0 ? true : void 0
329
+ }));
330
+ }
331
+ function subjectFromSupabase(claims, options = {}) {
332
+ try {
333
+ if (!isRecord(claims)) return anonymousSubject();
334
+ const rest = {};
335
+ for (const [key, value] of Object.entries(claims)) {
336
+ if (key === "user_metadata") continue;
337
+ rest[key] = value;
338
+ }
339
+ return mapClaims(rest, options);
340
+ } catch {
341
+ return anonymousSubject();
342
+ }
343
+ }
344
+ /**
345
+ * A verified session object (`{ kind, claims }`) in, `Subject` out.
346
+ * Only `kind: 'user'` sessions map; `anon`, `service`, `invalid` and anything else are anonymous.
347
+ */
348
+ function subjectFromSupabaseSession(session, options = {}) {
349
+ try {
350
+ if (session === null || session === void 0 || session.kind !== "user") return anonymousSubject();
351
+ return subjectFromSupabase(session.claims, options);
352
+ } catch {
353
+ return anonymousSubject();
354
+ }
355
+ }
356
+ //#endregion
357
+ //#region src/supabase/manifest-schema.ts
358
+ /** `schemas/supabase-manifest-v1.json`, which `parseSupabaseManifest` checks against; a test keeps the two equal. */
359
+ const supabaseManifestSchema = freezeDeep({
360
+ $schema: "https://json-schema.org/draft/2020-12/schema",
361
+ $id: "https://permdock.com/schemas/supabase-manifest-v1.json",
362
+ title: "PermDock Supabase hook manifest v1",
363
+ description: "What `permdock supabase inspect --json` prints and `--out` writes: the generated hook, the SQL helpers, the claims, the membership sources and the columns that decide them. Fields are only added within v1.",
364
+ type: "object",
365
+ required: [
366
+ "$schema",
367
+ "version",
368
+ "hook",
369
+ "helpers",
370
+ "tenantClaim",
371
+ "budget",
372
+ "claims",
373
+ "authzVersion",
374
+ "memberships",
375
+ "rls",
376
+ "decidingColumns",
377
+ "markers"
378
+ ],
379
+ properties: {
380
+ $schema: { const: "https://permdock.com/schemas/supabase-manifest-v1.json" },
381
+ version: { const: 1 },
382
+ hook: {
383
+ type: "object",
384
+ required: [
385
+ "schema",
386
+ "function",
387
+ "out"
388
+ ],
389
+ properties: {
390
+ schema: { $ref: "#/$defs/identifier" },
391
+ function: { const: "custom_access_token_hook" },
392
+ out: { type: "string" },
393
+ before: {
394
+ type: "array",
395
+ items: {
396
+ type: "string",
397
+ pattern: "^[A-Za-z_][A-Za-z0-9_]*\\.[A-Za-z_][A-Za-z0-9_]*$"
398
+ }
399
+ }
400
+ }
401
+ },
402
+ helpers: {
403
+ type: "object",
404
+ required: ["schema", "functions"],
405
+ properties: {
406
+ schema: { $ref: "#/$defs/identifier" },
407
+ functions: {
408
+ type: "array",
409
+ items: { $ref: "#/$defs/helperName" }
410
+ }
411
+ }
412
+ },
413
+ tenantClaim: { $ref: "#/$defs/identifier" },
414
+ budget: {
415
+ type: "object",
416
+ required: ["bytes", "measure"],
417
+ properties: {
418
+ bytes: {
419
+ type: "integer",
420
+ minimum: 1
421
+ },
422
+ measure: { type: "string" }
423
+ }
424
+ },
425
+ claims: {
426
+ type: "array",
427
+ items: {
428
+ type: "object",
429
+ required: [
430
+ "name",
431
+ "source",
432
+ "budget"
433
+ ],
434
+ properties: {
435
+ name: { $ref: "#/$defs/identifier" },
436
+ source: {
437
+ type: "string",
438
+ pattern: "^(permdock|[A-Za-z_][A-Za-z0-9_]*\\.[A-Za-z_][A-Za-z0-9_]*)$"
439
+ },
440
+ budget: { type: "boolean" }
441
+ }
442
+ }
443
+ },
444
+ authzVersion: { type: "boolean" },
445
+ authzVersionBump: {
446
+ type: "object",
447
+ required: [
448
+ "schema",
449
+ "function",
450
+ "args"
451
+ ],
452
+ properties: {
453
+ schema: { $ref: "#/$defs/identifier" },
454
+ function: { const: "permdock_bump_authz_version_for" },
455
+ args: { const: "p_users uuid[]" }
456
+ }
457
+ },
458
+ memberships: {
459
+ type: "array",
460
+ items: { $ref: "#/$defs/membership" }
461
+ },
462
+ rls: {
463
+ type: "object",
464
+ required: [
465
+ "schema",
466
+ "mode",
467
+ "tenantClaim",
468
+ "scopes",
469
+ "helpers",
470
+ "memberships"
471
+ ],
472
+ properties: {
473
+ schema: { $ref: "#/$defs/identifier" },
474
+ mode: { enum: ["jwt", "database"] },
475
+ tenantClaim: { $ref: "#/$defs/identifier" },
476
+ scopes: {
477
+ type: "array",
478
+ items: {
479
+ type: "object",
480
+ required: ["name", "type"],
481
+ properties: {
482
+ name: {
483
+ type: "string",
484
+ pattern: "^[a-z][a-z0-9_]*$"
485
+ },
486
+ type: { type: "string" },
487
+ within: {
488
+ type: "string",
489
+ pattern: "^[a-z][a-z0-9_]*$"
490
+ }
491
+ }
492
+ }
493
+ },
494
+ helpers: {
495
+ type: "array",
496
+ items: {
497
+ type: "object",
498
+ required: [
499
+ "name",
500
+ "args",
501
+ "returns",
502
+ "execute"
503
+ ],
504
+ properties: {
505
+ name: { $ref: "#/$defs/helperName" },
506
+ args: { type: "string" },
507
+ returns: { type: "string" },
508
+ execute: {
509
+ type: "array",
510
+ items: { enum: [
511
+ "anon",
512
+ "authenticated",
513
+ "supabase_auth_admin"
514
+ ] }
515
+ }
516
+ }
517
+ }
518
+ },
519
+ memberships: {
520
+ type: "array",
521
+ items: { $ref: "#/$defs/membership" }
522
+ },
523
+ customRoles: { type: "boolean" },
524
+ roles: {
525
+ type: "object",
526
+ required: [
527
+ "table",
528
+ "user",
529
+ "role"
530
+ ],
531
+ additionalProperties: false,
532
+ properties: {
533
+ table: { type: "string" },
534
+ user: { $ref: "#/$defs/column" },
535
+ role: { oneOf: [{ $ref: "#/$defs/role" }, {
536
+ type: "array",
537
+ minItems: 2,
538
+ items: { $ref: "#/$defs/role" }
539
+ }] }
540
+ }
541
+ },
542
+ suspension: {
543
+ type: "object",
544
+ additionalProperties: false,
545
+ properties: {
546
+ users: { $ref: "#/$defs/activeRow" },
547
+ scopes: {
548
+ type: "object",
549
+ additionalProperties: { $ref: "#/$defs/activeRow" }
550
+ },
551
+ memberships: {
552
+ type: "object",
553
+ required: ["keep"],
554
+ additionalProperties: false,
555
+ properties: { keep: {
556
+ description: "The permission keys a membership whose disabledAt column is set still holds.",
557
+ type: "array",
558
+ items: { type: "string" }
559
+ } }
560
+ }
561
+ }
562
+ },
563
+ assignments: {
564
+ type: "object",
565
+ required: ["tables"],
566
+ additionalProperties: false,
567
+ properties: { tables: {
568
+ type: "array",
569
+ items: { type: "string" }
570
+ } }
571
+ },
572
+ apiKeys: {
573
+ type: "object",
574
+ required: [
575
+ "claim",
576
+ "scopes",
577
+ "tenant",
578
+ "roles",
579
+ "serviceRoles"
580
+ ],
581
+ additionalProperties: false,
582
+ properties: {
583
+ claim: { type: "string" },
584
+ scopes: { type: "string" },
585
+ tenant: { type: "string" },
586
+ roles: { type: "string" },
587
+ serviceRoles: {
588
+ type: "array",
589
+ items: { type: "string" }
590
+ }
591
+ }
592
+ }
593
+ }
594
+ },
595
+ decidingColumns: {
596
+ type: "array",
597
+ items: {
598
+ type: "string",
599
+ pattern: "^[A-Za-z_][A-Za-z0-9_]*\\.[A-Za-z_][A-Za-z0-9_]*\\.[A-Za-z_][A-Za-z0-9_]*$"
600
+ }
601
+ },
602
+ markers: {
603
+ type: "object",
604
+ required: ["hook", "grants"],
605
+ properties: {
606
+ hook: { const: "v1" },
607
+ grants: { const: "v1" }
608
+ }
609
+ },
610
+ requires: {
611
+ description: "The supabase/sdk capability-matrix feature ids the hook, the helpers and subjectFromSupabase depend on, as of the matrix release tag.",
612
+ type: "object",
613
+ required: ["matrix", "capabilities"],
614
+ additionalProperties: false,
615
+ properties: {
616
+ matrix: {
617
+ type: "string",
618
+ pattern: "^capability-matrix-v1\\.[0-9]+\\.[0-9]+$"
619
+ },
620
+ capabilities: {
621
+ type: "array",
622
+ uniqueItems: true,
623
+ items: {
624
+ type: "string",
625
+ pattern: "^[a-z][a-z0-9_]*\\.[a-z0-9_]+\\.[a-z0-9_]+$"
626
+ }
627
+ }
628
+ }
629
+ }
630
+ },
631
+ $defs: {
632
+ membership: {
633
+ type: "object",
634
+ required: [
635
+ "table",
636
+ "user",
637
+ "scope",
638
+ "id",
639
+ "role",
640
+ "columns"
641
+ ],
642
+ properties: {
643
+ table: {
644
+ type: "string",
645
+ pattern: "^[A-Za-z_][A-Za-z0-9_]*\\.[A-Za-z_][A-Za-z0-9_]*$"
646
+ },
647
+ user: { $ref: "#/$defs/user" },
648
+ scope: { $ref: "#/$defs/value" },
649
+ id: { $ref: "#/$defs/column" },
650
+ role: { oneOf: [{ $ref: "#/$defs/role" }, {
651
+ type: "array",
652
+ minItems: 2,
653
+ items: { $ref: "#/$defs/role" }
654
+ }] },
655
+ within: { oneOf: [{ $ref: "#/$defs/column" }, {
656
+ type: "object",
657
+ required: ["columns"],
658
+ additionalProperties: false,
659
+ properties: { columns: {
660
+ type: "object",
661
+ additionalProperties: { $ref: "#/$defs/identifier" }
662
+ } }
663
+ }] },
664
+ via: { $ref: "#/$defs/value" },
665
+ expiresAt: { $ref: "#/$defs/column" },
666
+ disabledAt: { $ref: "#/$defs/column" },
667
+ columns: {
668
+ type: "array",
669
+ items: { $ref: "#/$defs/identifier" }
670
+ }
671
+ }
672
+ },
673
+ identifier: {
674
+ type: "string",
675
+ pattern: "^[A-Za-z_][A-Za-z0-9_]*$"
676
+ },
677
+ activeRow: {
678
+ type: "object",
679
+ required: ["table", "id"],
680
+ additionalProperties: false,
681
+ properties: {
682
+ table: { type: "string" },
683
+ id: { $ref: "#/$defs/identifier" },
684
+ disabledAt: { $ref: "#/$defs/identifier" },
685
+ status: { $ref: "#/$defs/identifier" },
686
+ active: {
687
+ type: "array",
688
+ items: { type: "string" }
689
+ },
690
+ keep: {
691
+ description: "A scope only: the permission keys members of a suspended instance still hold.",
692
+ type: "array",
693
+ items: { type: "string" }
694
+ }
695
+ }
696
+ },
697
+ helperName: {
698
+ type: "string",
699
+ pattern: "^(permdock_has(_for)?|permitted_[a-z][a-z0-9_]*_(ids|permission_keys)(_for)?|member_[a-z][a-z0-9_]*_ids(_for)?|permdock_can_assign(_any|_custom_role)?(_for)?|permdock_api_key_allows|permdock_user_id)$"
700
+ },
701
+ column: {
702
+ type: "object",
703
+ required: ["column"],
704
+ additionalProperties: false,
705
+ properties: { column: { $ref: "#/$defs/identifier" } }
706
+ },
707
+ role: { oneOf: [{ $ref: "#/$defs/value" }, { $ref: "#/$defs/through" }] },
708
+ user: { oneOf: [{ $ref: "#/$defs/column" }, { $ref: "#/$defs/through" }] },
709
+ through: {
710
+ type: "object",
711
+ required: ["column", "through"],
712
+ additionalProperties: false,
713
+ properties: {
714
+ column: { $ref: "#/$defs/identifier" },
715
+ through: {
716
+ type: "object",
717
+ required: [
718
+ "table",
719
+ "id",
720
+ "column"
721
+ ],
722
+ additionalProperties: false,
723
+ properties: {
724
+ table: {
725
+ type: "string",
726
+ pattern: "^[A-Za-z_][A-Za-z0-9_]*\\.[A-Za-z_][A-Za-z0-9_]*$"
727
+ },
728
+ id: { $ref: "#/$defs/identifier" },
729
+ column: { $ref: "#/$defs/identifier" }
730
+ }
731
+ }
732
+ }
733
+ },
734
+ value: { oneOf: [{ $ref: "#/$defs/column" }, {
735
+ type: "object",
736
+ required: ["value"],
737
+ additionalProperties: false,
738
+ properties: { value: { oneOf: [{ type: "string" }, {
739
+ type: "array",
740
+ items: { type: "string" }
741
+ }] } }
742
+ }] }
743
+ }
744
+ });
745
+ //#endregion
746
+ //#region src/supabase/manifest.ts
747
+ /**
748
+ * Reads a `permdock.manifest.json` document (parsed, or the JSON text) and
749
+ * validates it against `schemas/supabase-manifest-v1.json`. Returns a
750
+ * deep-frozen copy built from own keys; throws `PermDockValidationError`
751
+ * with every issue, so a manifest of another major is refused.
752
+ */
753
+ function parseSupabaseManifest(json) {
754
+ const issues = [];
755
+ let input = json;
756
+ if (typeof json === "string") try {
757
+ input = JSON.parse(json);
758
+ } catch (error) {
759
+ invalidManifest([{
760
+ message: `Expected JSON text: ${error instanceof Error ? error.message : String(error)}`,
761
+ path: []
762
+ }]);
763
+ }
764
+ const copy = copyJson(input, [], issues, /* @__PURE__ */ new Set());
765
+ if (issues.length === 0) checkSchema(supabaseManifestSchema, copy, [], issues);
766
+ if (issues.length > 0) invalidManifest(issues);
767
+ return freezeDeep(copy);
768
+ }
769
+ function invalidManifest(issues) {
770
+ const [first] = issues;
771
+ const where = first?.path === void 0 || first.path.length === 0 ? "" : ` at ${first.path.map(String).join(".")}`;
772
+ const more = issues.length > 1 ? ` (and ${String(issues.length - 1)} more)` : "";
773
+ throw new PermDockValidationError({
774
+ code: "invalid-data",
775
+ permission: "",
776
+ resource: "",
777
+ boundary: "supabase-manifest",
778
+ issues,
779
+ message: `PermDock: invalid Supabase manifest${where}: ${first?.message ?? "unknown"}${more}`
780
+ });
781
+ }
782
+ //#endregion
783
+ export { subjectFromSupabase as a, readMemberships as i, actorOf as n, subjectFromSupabaseSession as o, delegationOf as r, parseSupabaseManifest as t };