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,97 @@
1
+ import { t as compact } from "./compact-y6vfu2_f.js";
2
+ import { o as invalidSignatureResponse } from "./evaluations-tz6D9A2G.js";
3
+ import { t as instanceOptions } from "./instance-options-Dhhcnm3y.js";
4
+ import { n as tenantScope } from "./adapter-context-mlWsVGGg.js";
5
+ import { n as createServerKernel } from "./create-CPhDL6qx.js";
6
+ //#region src/server/bind.ts
7
+ /** The server kernel with the subject and actor callbacks reading the context `contextOf` maps a `Request` to. */
8
+ function adapterKernel(policy, options, adapter, contextOf) {
9
+ return createServerKernel(policy, compact({
10
+ subject: (request) => {
11
+ const context = contextOf(request);
12
+ return context === void 0 ? null : options.subject(context);
13
+ },
14
+ actor: options.actor === void 0 ? void 0 : (request) => {
15
+ const context = contextOf(request);
16
+ return context === void 0 ? void 0 : options.actor?.(context);
17
+ },
18
+ ...instanceOptions(options),
19
+ store: options.store,
20
+ pdp: options.pdp,
21
+ webBotAuth: options.webBotAuth,
22
+ revocations: options.revocations,
23
+ adapter,
24
+ wrap: options.otel
25
+ }));
26
+ }
27
+ /**
28
+ * The kernel of a framework adapter, with the subject, actor and tenant
29
+ * callbacks reading the framework context each `Request` was built from.
30
+ */
31
+ function bindKernel(policy, options, adapter, toRequest) {
32
+ const contexts = /* @__PURE__ */ new WeakMap();
33
+ const bound = /* @__PURE__ */ new WeakMap();
34
+ const kernel = adapterKernel(policy, options, adapter, (request) => contexts.get(request));
35
+ const bind = (context) => {
36
+ const hit = bound.get(context);
37
+ if (hit !== void 0) return hit;
38
+ const request = toRequest(context);
39
+ bound.set(context, request);
40
+ contexts.set(request, context);
41
+ return request;
42
+ };
43
+ const rebind = (context) => {
44
+ const request = toRequest(context);
45
+ contexts.set(request, context);
46
+ const previous = bound.get(context);
47
+ if (previous !== void 0) kernel.shareSubject(previous, request);
48
+ return request;
49
+ };
50
+ const scopeOf = (context) => tenantScope(options.tenant, context);
51
+ const handlerScope = (request) => {
52
+ const context = contexts.get(request);
53
+ return context === void 0 ? Promise.resolve({ tenant: void 0 }) : scopeOf(context);
54
+ };
55
+ const attach = (context) => attached(async () => kernel.permdock(bind(context), await scopeOf(context)));
56
+ return {
57
+ kernel,
58
+ bind,
59
+ rebind,
60
+ scopeOf,
61
+ handlerScope,
62
+ attach
63
+ };
64
+ }
65
+ /** The instance `build` resolves; an invalid Web Bot Auth signature is its `401` response. */
66
+ async function attached(build) {
67
+ try {
68
+ return {
69
+ ok: true,
70
+ permdock: await build()
71
+ };
72
+ } catch (error) {
73
+ const response = invalidSignatureResponse(error);
74
+ if (response === void 0) throw error;
75
+ return {
76
+ ok: false,
77
+ response
78
+ };
79
+ }
80
+ }
81
+ /** Sets `permdock`, and `permdockData` when a loader returned a row, on a framework request or context. */
82
+ function decorate(target, instance, data) {
83
+ Object.assign(target, data === void 0 ? { permdock: instance } : {
84
+ permdock: instance,
85
+ permdockData: data
86
+ });
87
+ }
88
+ /** One connection per socket: every handler of `socket` gets the promise the first one opened. */
89
+ function socketConnection(sockets, socket, open) {
90
+ const hit = sockets.get(socket);
91
+ if (hit !== void 0) return hit;
92
+ const opened = open();
93
+ sockets.set(socket, opened);
94
+ return opened;
95
+ }
96
+ //#endregion
97
+ export { socketConnection as a, decorate as i, attached as n, bindKernel as r, adapterKernel as t };
@@ -0,0 +1,13 @@
1
+ import { r as parsePermDockDigest } from "./digest-BI-6aa6d.js";
2
+ //#region src/client/boundary.ts
3
+ /** The digest of a PermDock error (`PermDockDeniedError`, `PermDockApprovalRequiredError`); `null` for any other error. */
4
+ function boundaryDigest(error) {
5
+ if (error === null || typeof error !== "object" || !("digest" in error)) return null;
6
+ return parsePermDockDigest(error.digest);
7
+ }
8
+ /** What a boundary renders for `digest`: `approval` for an approval request when given, otherwise `denied`. */
9
+ function boundaryFallback(digest, fallbacks) {
10
+ return digest.outcome === "approval-required" ? fallbacks.approval ?? fallbacks.denied : fallbacks.denied;
11
+ }
12
+ //#endregion
13
+ export { boundaryFallback as n, boundaryDigest as t };
@@ -0,0 +1,15 @@
1
+ import { t as PermDockDigest } from "./digest-B3kc_PgQ.js";
2
+ //#region src/client/boundary.d.ts
3
+ type PermissionBoundaryState = PermDockDigest & {
4
+ /** Renders the boundary's children again, e.g. after an approval or a role change. */
5
+ readonly retry: () => void;
6
+ };
7
+ /** The digest of a PermDock error (`PermDockDeniedError`, `PermDockApprovalRequiredError`); `null` for any other error. */
8
+ declare function boundaryDigest(error: unknown): PermDockDigest | null;
9
+ /** What a boundary renders for `digest`: `approval` for an approval request when given, otherwise `denied`. */
10
+ declare function boundaryFallback<T>(digest: PermDockDigest, fallbacks: {
11
+ readonly denied?: T | undefined;
12
+ readonly approval?: T | undefined;
13
+ }): T | undefined;
14
+ //#endregion
15
+ export { boundaryDigest as n, boundaryFallback as r, PermissionBoundaryState as t };
@@ -0,0 +1,26 @@
1
+ //#region src/core/canonical-json.ts
2
+ function isRecord(value) {
3
+ return value !== null && typeof value === "object" && !Array.isArray(value);
4
+ }
5
+ /**
6
+ * JSON with sorted keys and `undefined` members dropped, so equal values hash
7
+ * equally. Dates become ISO strings, bigints `"<n>n"`, and a repeated object
8
+ * on the current path `"[Circular]"`, so any validated row serialises.
9
+ */
10
+ function canonicalJson(value, path = /* @__PURE__ */ new Set()) {
11
+ if (typeof value === "bigint") return JSON.stringify(`${value}n`);
12
+ if (value instanceof Date) return JSON.stringify(Number.isNaN(value.getTime()) ? null : value.toISOString());
13
+ if (value !== null && typeof value === "object") {
14
+ if (path.has(value)) return "\"[Circular]\"";
15
+ path.add(value);
16
+ try {
17
+ if (Array.isArray(value)) return `[${value.map((item) => canonicalJson(item === void 0 ? null : item, path)).join(",")}]`;
18
+ if (isRecord(value)) return `{${Object.keys(value).toSorted().filter((key) => value[key] !== void 0).map((key) => `${JSON.stringify(key)}:${canonicalJson(value[key], path)}`).join(",")}}`;
19
+ } finally {
20
+ path.delete(value);
21
+ }
22
+ }
23
+ return JSON.stringify(value) ?? "null";
24
+ }
25
+ //#endregion
26
+ export { canonicalJson as t };
@@ -1,6 +1,8 @@
1
1
  import { t as compact } from "./compact-y6vfu2_f.js";
2
- import { n as freezeDeep } from "./freeze-y1_jQL4v.js";
3
- import { S as isForbiddenKey, g as listPermissions } from "./permissions-DC7GROPA.js";
2
+ import { n as freezeDeep } from "./freeze-CrU8nQeX.js";
3
+ import { T as isForbiddenKey, _ as listPermissions } from "./permissions-DVoF6dMt.js";
4
+ import { t as expiredAt } from "./expiry-BoBJ8Tvc.js";
5
+ import { n as sameId } from "./ids-DC4V4CFu.js";
4
6
  import { t as anonymousSubject } from "./subject-C6dLxqHU.js";
5
7
  //#region src/core/capability.ts
6
8
  function redeemerKind(redeemer) {
@@ -126,9 +128,9 @@ function signCapability(input, signer, options = {}) {
126
128
  }));
127
129
  }
128
130
  function holdsScope(membership, scope, id, now) {
129
- if (membership.expiresAt !== void 0 && membership.expiresAt <= now) return false;
130
- if (membership.scope === scope && membership.id === id) return true;
131
- return scope === "tenant" && membership.tenant === id || scope === "team" && membership.team === id;
131
+ if (expiredAt(membership, now)) return false;
132
+ if (membership.scope === scope && sameId(membership.id, id)) return true;
133
+ return scope === "tenant" && sameId(membership.tenant, id) || scope === "team" && sameId(membership.team, id);
132
134
  }
133
135
  /** Whether `viewer`, the request's own verified subject, may redeem a capability. */
134
136
  function redeemerAllows(redeemer, viewer, now = Date.now() / 1e3) {
@@ -1,5 +1,5 @@
1
- import { Tt as TokenSigner, hr as Subject, mr as Principal } from "./policy-CInmNGkM.js";
2
- import { d as Permission, p as PermissionTree } from "./permissions-B4apnahQ.js";
1
+ import { Nr as Principal, Pr as Subject, Pt as TokenSigner } from "./policy-CFZAr_Al.js";
2
+ import { f as Permission, m as PermissionTree } from "./permissions-DttnqqxC.js";
3
3
  //#region src/core/capability.d.ts
4
4
  /**
5
5
  * Who may redeem a capability: anyone holding it, any signed-in principal,
@@ -1,4 +1,4 @@
1
- import { a as CatalogDocument, c as CatalogResource, d as CatalogSupportAccess, f as CatalogUsage, i as CatalogDelegation, l as CatalogRole, n as CatalogApproval, o as CatalogGrant, p as CatalogValidity, r as CatalogBreakGlass, s as CatalogPermission, t as CatalogActivation, u as CatalogScope } from "../types-BBK-exvJ.js";
1
+ import { a as CatalogDocument, c as CatalogResource, d as CatalogSupportAccess, f as CatalogUsage, i as CatalogDelegation, l as CatalogRole, n as CatalogApproval, o as CatalogGrant, p as CatalogValidity, r as CatalogBreakGlass, s as CatalogPermission, t as CatalogActivation, u as CatalogScope } from "../types-Dnemwd77.js";
2
2
  //#region src/catalog/parse.d.ts
3
3
  /**
4
4
  * Reads a `permissions.catalog.json` document (parsed, or the JSON text) and
@@ -1,2 +1,2 @@
1
- import { n as rowConditionKeys, t as parseCatalog } from "../parse-DPfIvFMU.js";
1
+ import { n as rowConditionKeys, t as parseCatalog } from "../parse-BuyjxhZV.js";
2
2
  export { parseCatalog, rowConditionKeys };
@@ -0,0 +1,2 @@
1
+ import { t as runCatalog } from "./catalog-z8q6bi_r.js";
2
+ export { runCatalog };
@@ -1,27 +1,28 @@
1
- import { a as formerKeys, c as getResource, g as listPermissions } from "./permissions-DC7GROPA.js";
2
- import { t as catalogFingerprint } from "./src-CTNT-PBW.js";
3
- import { b as findRole } from "./grantee-Bv04_Vzf.js";
4
- import { l as canonicalJson } from "./snapshot-DE8dE_hz.js";
1
+ import { _ as listPermissions, a as formerKeys, c as getResource } from "./permissions-DVoF6dMt.js";
2
+ import { t as catalogFingerprint } from "./src-CSbUiozF.js";
3
+ import { S as findRole } from "./grantee-Cv5Sogfv.js";
4
+ import { t as canonicalJson } from "./canonical-json-DemiK4Vp.js";
5
5
  import { t as byCodePoint } from "./compare-pfyVnBjE.js";
6
- import { t as catalogSchema } from "./schema-P8yoma__.js";
7
- import { o as generatorBanner, t as CATALOG_SCHEMA } from "./version-CnSh33Fj.js";
6
+ import { t as catalogSchema } from "./schema-D3MnDMxa.js";
7
+ import { s as generatorBanner, t as CATALOG_SCHEMA } from "./version-BvacVTZR.js";
8
8
  //#region src/cli/catalog-doc.ts
9
9
  const ROW_GRANTEES = /* @__PURE__ */ new Set([
10
10
  "relation",
11
11
  "plan",
12
12
  "actor",
13
- "assurance"
13
+ "assurance",
14
+ "inherit"
14
15
  ]);
15
16
  /**
16
17
  * Whether a grant depends on more than the role and the scope: a row or body
17
18
  * condition, a closure, a field list, a purpose, a break-glass override, a
18
- * validity window, or a relation, plan, actor or assurance grantee. The SQL helpers
19
+ * validity window, a `requires`, or a relation, plan, actor or assurance grantee. The SQL helpers
19
20
  * (`permdock_has`, `permitted_<scope>_ids`) check only role and scope, so a
20
21
  * policy that calls them for such a permission would widen access.
21
22
  */
22
23
  function grantHasRowConditions(grant) {
23
24
  const grantees = Array.isArray(grant.to) ? grant.to : [grant.to];
24
- return grant.where !== void 0 || grant.check !== void 0 || grant.closure !== void 0 || !grant.portable || grant.fields !== void 0 || grant.purpose !== void 0 || grant.breakGlass !== void 0 || grant.validity !== void 0 || grantees.some((grantee) => ROW_GRANTEES.has(grantee.kind));
25
+ return grant.where !== void 0 || grant.check !== void 0 || grant.closure !== void 0 || !grant.portable || grant.fields !== void 0 || grant.purpose !== void 0 || grant.breakGlass !== void 0 || grant.validity !== void 0 || grant.requires !== void 0 || grantees.some((grantee) => ROW_GRANTEES.has(grantee.kind));
25
26
  }
26
27
  /** Per permission key, whether any code grant for it has row conditions. */
27
28
  function policyRowConditionKeys(policy) {
@@ -29,6 +30,11 @@ function policyRowConditionKeys(policy) {
29
30
  for (const grant of [...policy.grants, ...policy.roles.flatMap((binding) => binding.grants)]) if (grant.hosted === void 0 && grantHasRowConditions(grant)) keys.add(grant.permission.key);
30
31
  return keys;
31
32
  }
33
+ function leafLevels(tree, leaf) {
34
+ if (leaf.kind !== "instance") return;
35
+ const names = Object.keys({ ...getResource(tree, leaf.resource)?.levels });
36
+ return names.length === 0 ? void 0 : names;
37
+ }
32
38
  /** With `policy`, permissions carry `hostable` and a known `rowConditions` (without, it is `true`), and roles carry `on`, `assignable` and their ownership rules. */
33
39
  function buildCatalog(tree, scan, generatedAt, policy) {
34
40
  const hostable = new Set(policy?.hostable ?? []);
@@ -43,14 +49,16 @@ function buildCatalog(tree, scan, generatedAt, policy) {
43
49
  schema: node === void 0 ? null : jsonSchemaOf(node),
44
50
  relations: node?.relations,
45
51
  version: node?.version,
46
- restricted: node?.restricted
52
+ restricted: node?.restricted,
53
+ restrictedStops: node?.restrictedStops
47
54
  } : {
48
55
  id: node?.id ?? "id",
49
56
  schema: node === void 0 ? null : jsonSchemaOf(node),
50
57
  definedIn,
51
58
  relations: node?.relations,
52
59
  version: node?.version,
53
- restricted: node?.restricted
60
+ restricted: node?.restricted,
61
+ restrictedStops: node?.restrictedStops
54
62
  });
55
63
  }
56
64
  const approvals = codeApprovals(policy);
@@ -66,6 +74,7 @@ function buildCatalog(tree, scan, generatedAt, policy) {
66
74
  meta: metaRecord(leaf.meta),
67
75
  usages: scan.usages[leaf.key] ?? [],
68
76
  renamedFrom: formerKeys(leaf).length === 0 ? void 0 : formerKeys(leaf),
77
+ levels: leafLevels(tree, leaf),
69
78
  hostable: hostable.has(leaf.key) ? true : void 0,
70
79
  rowConditions: rowConditions?.has(leaf.key) ?? true,
71
80
  approvals: approvals.get(leaf.key),
@@ -131,6 +140,7 @@ function catalogGrant(grant) {
131
140
  validity: grant.validity,
132
141
  name: grant.name,
133
142
  purpose: grant.purpose,
143
+ requires: grant.requires?.length === 1 ? grant.requires[0] : grant.requires,
134
144
  limit,
135
145
  portable: grant.portable ? void 0 : false
136
146
  })
@@ -252,7 +262,8 @@ function compactResource(resource) {
252
262
  definedIn: resource.definedIn,
253
263
  relations,
254
264
  version: resource.version,
255
- restricted: resource.restricted
265
+ restricted: resource.restricted,
266
+ restrictedStops: resource.restrictedStops
256
267
  })
257
268
  };
258
269
  }
@@ -1,4 +1,4 @@
1
- import { a as listArg, i as globalArgs, s as stringArg, t as COMMAND_DESCRIPTIONS } from "./commands-BMh_Etm2.js";
1
+ import { a as listArg, i as globalArgs, s as stringArg, t as COMMAND_DESCRIPTIONS } from "./commands-DWOrSQic.js";
2
2
  import { defineCommand } from "citty";
3
3
  //#region src/cli/commands/catalog.ts
4
4
  function catalog(ctx) {
@@ -31,7 +31,7 @@ function catalog(ctx) {
31
31
  }
32
32
  },
33
33
  async run({ args: parsed, rawArgs }) {
34
- const result = await (await import("./catalog-idsHc0vo.js")).runCatalog({
34
+ const result = await (await import("./catalog-BjZSovXQ.js")).runCatalog({
35
35
  cwd: ctx.cwd,
36
36
  config: ctx.config,
37
37
  format: parsed.format,
@@ -1,7 +1,7 @@
1
- import { a as formatCatalogMarkdown, i as formatCatalogJson, r as catalogSchemaDocument, t as buildCatalog } from "./catalog-doc-BSo_Q_-6.js";
2
- import { n as listSourceFiles, t as defaultSrcPath } from "./files-B_wAGYmt.js";
3
- import { a as loadModule, i as loadConfiguredPolicy, o as pickNamed, r as leavesOf, t as asPermissionTree } from "./load-BZ24CpZP.js";
4
- import { n as scanSources, t as runCollect } from "./collect-O-tOtbnk.js";
1
+ import { a as formatCatalogMarkdown, i as formatCatalogJson, r as catalogSchemaDocument, t as buildCatalog } from "./catalog-doc-Dsc9y7sd.js";
2
+ import { r as listSourceFiles, t as defaultSrcPath } from "./files-DWUN9PzI.js";
3
+ import { a as loadModule, i as loadConfiguredPolicy, o as pickNamed, r as leavesOf, t as asPermissionTree } from "./load-DhWEB9P1.js";
4
+ import { i as scanSources, r as runCollect } from "./collect-DDDv_ESs.js";
5
5
  import { existsSync } from "node:fs";
6
6
  import { resolve } from "node:path";
7
7
  //#region src/cli/catalog.ts
@@ -1,6 +1,7 @@
1
- import { $ as DecisionSink, C as Policy, E as PolicyVocabulary, Zt as PermDock, at as LimitStore, ct as MembershipSource, ft as RelationSource, mr as Principal, pt as RoleSource, sn as PolicySource, tt as EntitlementSource, ur as Delegation, xt as SnapshotSource } from "../policy-CInmNGkM.js";
2
- import { f as ApprovalStore } from "../types-B8w5PFtS.js";
3
- import { t as ToolMap } from "../types-CxquUByI.js";
1
+ import { C as Policy, D as PolicyVocabulary, Nr as Principal, kr as Delegation, ln as PermDock } from "../policy-CFZAr_Al.js";
2
+ import { f as ApprovalStore } from "../types-vKyAMtcX.js";
3
+ import { t as InstanceOptions } from "../instance-options-BK_rNOSC.js";
4
+ import { t as ToolMap } from "../types-Bvc4oWT6.js";
4
5
  //#region src/claude-agent/create.d.ts
5
6
  /** Structural `McpServerProvenance` from `@anthropic-ai/claude-agent-sdk`. */
6
7
  type ClaudeMcpServer = {
@@ -18,7 +19,7 @@ type ClaudeAgentContext = {
18
19
  readonly sessionId?: string;
19
20
  readonly agentId?: string;
20
21
  };
21
- type ClaudeAgentPermDockOptions<TUser = unknown> = {
22
+ type ClaudeAgentPermDockOptions<TUser = unknown> = InstanceOptions & {
22
23
  readonly subject: (context: ClaudeAgentContext) => TUser | Promise<TUser>;
23
24
  readonly actor?: (context: ClaudeAgentContext) => unknown;
24
25
  readonly delegation?: (context: ClaudeAgentContext) => Delegation | undefined | Promise<Delegation | undefined>;
@@ -26,17 +27,7 @@ type ClaudeAgentPermDockOptions<TUser = unknown> = {
26
27
  readonly tools: ToolMap;
27
28
  /** MCP server sources whose `mcp__*` tools may be decided; default `['sdk']`. */
28
29
  readonly mcpSources?: readonly string[];
29
- readonly memberships?: MembershipSource | readonly MembershipSource[];
30
- /** The object graph for relation grants that walk a parent chain; without it they deny. */
31
- readonly relations?: RelationSource;
32
- readonly entitlements?: EntitlementSource;
33
- readonly customRoles?: RoleSource;
34
- /** Hosted grants, read once per instance; see `PolicySource`. */
35
- readonly policies?: PolicySource;
36
30
  readonly store?: ApprovalStore;
37
- readonly sink?: DecisionSink;
38
- readonly limits?: LimitStore;
39
- readonly snapshots?: SnapshotSource;
40
31
  };
41
32
  type PermissionResult = {
42
33
  readonly behavior: "allow";
@@ -1,5 +1,6 @@
1
1
  import { t as compact } from "../compact-y6vfu2_f.js";
2
- import { n as createAgentKernel } from "../kernel-YOGCWNLf.js";
2
+ import { t as instanceOptions } from "../instance-options-Dhhcnm3y.js";
3
+ import { n as createAgentKernel } from "../kernel-GSQnMz3O.js";
3
4
  //#region src/claude-agent/create.ts
4
5
  const MCP_PREFIX = "mcp__";
5
6
  function asInput(input) {
@@ -34,16 +35,9 @@ function createPermDock(policy, options) {
34
35
  actor: options.actor,
35
36
  delegation: options.delegation,
36
37
  tenant: options.tenant,
37
- memberships: options.memberships,
38
- relations: options.relations,
39
- entitlements: options.entitlements,
40
- customRoles: options.customRoles,
41
- policies: options.policies,
42
- store: options.store,
43
- sink: options.sink,
44
- limits: options.limits,
45
- snapshots: options.snapshots
38
+ store: options.store
46
39
  }),
40
+ ...instanceOptions(options),
47
41
  subject: options.subject,
48
42
  tools: options.tools,
49
43
  adapter: "claude-agent"
@@ -1,5 +1,6 @@
1
- import { hr as Subject, mr as Principal, pt as RoleSource } from "../policy-CInmNGkM.js";
2
- import { d as Permission } from "../permissions-B4apnahQ.js";
1
+ import { Nr as Principal, Pr as Subject, xt as RoleSource } from "../policy-CFZAr_Al.js";
2
+ import { f as Permission } from "../permissions-DttnqqxC.js";
3
+ import { s as RemotePdpCache } from "../types-BVyImy5I.js";
3
4
  import { StandardSchemaV1 } from "@standard-schema/spec";
4
5
  //#region src/clerk/types.d.ts
5
6
  type ClerkPrincipal = Principal & {
@@ -49,8 +50,16 @@ type ClerkAuthObject = {
49
50
  readonly sessionClaims?: Readonly<Record<string, unknown>> | null;
50
51
  readonly has?: (...args: never[]) => unknown;
51
52
  };
53
+ type ClerkSubjectResolverOptions = ClerkSubjectOptions & {
54
+ readonly cache?: RemotePdpCache;
55
+ };
52
56
  //#endregion
53
57
  //#region src/clerk/subject.d.ts
54
58
  export declare function subjectFromClerk(authObject: unknown, options?: ClerkSubjectOptions): Promise<Subject<ClerkPrincipal>>;
59
+ /**
60
+ * A resolver that keeps each user's `memberships: 'all'` list for
61
+ * `cache.ttl` (at most 30 seconds), so a removed membership grants until then.
62
+ */
63
+ export declare function createClerkSubjectResolver(options?: ClerkSubjectResolverOptions): (authObject: unknown) => Promise<Subject<ClerkPrincipal>>;
55
64
  //#endregion
56
- export type { ClerkAuthObject, ClerkBackend, ClerkGlobalRoles, ClerkMembershipListItem, ClerkPrincipal, ClerkSubjectOptions };
65
+ export type { ClerkAuthObject, ClerkBackend, ClerkGlobalRoles, ClerkMembershipListItem, ClerkPrincipal, ClerkSubjectOptions, ClerkSubjectResolverOptions };
@@ -1,7 +1,8 @@
1
1
  import { t as compact } from "../compact-y6vfu2_f.js";
2
- import { n as freezeDeep } from "../freeze-y1_jQL4v.js";
2
+ import { n as freezeDeep } from "../freeze-CrU8nQeX.js";
3
3
  import { t as ignoreRejection } from "../thenable-okc2xDsj.js";
4
4
  import { t as anonymousSubject } from "../subject-C6dLxqHU.js";
5
+ import { c as ttlMs, s as ttlCache } from "../shared-DRu8VFVM.js";
5
6
  //#region src/clerk/subject.ts
6
7
  function isRecord(value) {
7
8
  return value !== null && typeof value === "object" && !Array.isArray(value);
@@ -197,6 +198,7 @@ function membershipRow(item, userId) {
197
198
  roles
198
199
  });
199
200
  }
201
+ /** The memberships Clerk lists for `userId`, or `undefined` when a page fails. */
200
202
  async function extraMemberships(backend, userId) {
201
203
  const list = backend?.users?.getOrganizationMembershipList;
202
204
  if (list === void 0) return [];
@@ -219,10 +221,29 @@ async function extraMemberships(backend, userId) {
219
221
  }
220
222
  return out;
221
223
  } catch {
222
- return [];
224
+ return;
223
225
  }
224
226
  }
225
- async function subjectFromClerk(authObject, options = {}) {
227
+ function subjectFromClerk(authObject, options = {}) {
228
+ return fromClerk(authObject, options, extraMemberships);
229
+ }
230
+ /**
231
+ * A resolver that keeps each user's `memberships: 'all'` list for
232
+ * `cache.ttl` (at most 30 seconds), so a removed membership grants until then.
233
+ */
234
+ function createClerkSubjectResolver(options = {}) {
235
+ const { cache, ...rest } = options;
236
+ const lists = ttlCache(ttlMs(cache));
237
+ const load = async (backend, userId) => {
238
+ const hit = lists.get(userId);
239
+ if (hit !== void 0) return hit;
240
+ const loaded = await extraMemberships(backend, userId);
241
+ if (loaded !== void 0) lists.set(userId, loaded);
242
+ return loaded;
243
+ };
244
+ return (authObject) => fromClerk(authObject, rest, load);
245
+ }
246
+ async function fromClerk(authObject, options, loadMemberships) {
226
247
  try {
227
248
  const trustedObject = isAuthObject(authObject);
228
249
  const trustedPayload = isVerifiedPayload(authObject);
@@ -244,7 +265,7 @@ async function subjectFromClerk(authObject, options = {}) {
244
265
  roles: membershipRoles,
245
266
  entitlements: plans.org.length === 0 ? void 0 : plans.org
246
267
  })] : [];
247
- const loaded = options.memberships === "all" ? await extraMemberships(options.backend, mapped.id) : [];
268
+ const loaded = options.memberships === "all" ? await loadMemberships(options.backend, mapped.id) ?? [] : [];
248
269
  const seen = new Set(sessionMembership.map((item) => item.tenant));
249
270
  const memberships = [...sessionMembership, ...loaded.filter((item) => {
250
271
  if (seen.has(item.tenant)) return false;
@@ -277,4 +298,4 @@ async function subjectFromClerk(authObject, options = {}) {
277
298
  }
278
299
  }
279
300
  //#endregion
280
- export { subjectFromClerk };
301
+ export { createClerkSubjectResolver, subjectFromClerk };
package/dist/cli/bin.js CHANGED
@@ -1,5 +1,5 @@
1
1
  #!/usr/bin/env node
2
- import { t as run } from "../run-CJ6UvS3a.js";
2
+ import { t as run } from "../run-YXCJDNYk.js";
3
3
  import { n as streamHasColors } from "../style-CTm1AXDT.js";
4
4
  //#region src/cli/bin.ts
5
5
  const result = await run(process.argv.slice(2), {
@@ -1,5 +1,5 @@
1
- import { a as CatalogDocument, c as CatalogResource, d as CatalogSupportAccess, f as CatalogUsage, l as CatalogRole, n as CatalogApproval, r as CatalogBreakGlass, s as CatalogPermission, t as CatalogActivation, u as CatalogScope } from "../types-BBK-exvJ.js";
2
- import { c as RlsDialect, d as RlsMemberships, f as RlsSuspension, i as PermDockConfig, l as RlsFunctionMapping, m as RunResult, n as CliIo, o as RlsActiveRow, p as RlsTarget, r as CollectConfig, s as RlsConfig, t as CatalogConfig, u as RlsMembershipTable } from "../types-D6Z6-rKJ.js";
1
+ import { a as CatalogDocument, c as CatalogResource, d as CatalogSupportAccess, f as CatalogUsage, l as CatalogRole, n as CatalogApproval, r as CatalogBreakGlass, s as CatalogPermission, t as CatalogActivation, u as CatalogScope } from "../types-Dnemwd77.js";
2
+ import { _ as RunResult, c as RlsConfig, d as RlsMembershipTable, f as RlsMemberships, g as RlsTarget, h as RlsSuspension, i as PermDockConfig, l as RlsDialect, m as RlsSuspendedScope, n as CliIo, o as RlsActiveRow, p as RlsSuspendedMembership, r as CollectConfig, s as RlsApiKeys, t as CatalogConfig, u as RlsFunctionMapping } from "../types-BPxgszlT.js";
3
3
  //#region src/cli/catalog-path.d.ts
4
4
  /**
5
5
  * The absolute path `permdock collect` writes the catalog to: `collect.out`,
@@ -43,4 +43,4 @@ export declare function run(argv: readonly string[], options?: {
43
43
  readonly io?: CliIo;
44
44
  }): Promise<RunResult>;
45
45
  //#endregion
46
- export type { CatalogActivation, CatalogApproval, CatalogBreakGlass, CatalogConfig, CatalogDocument, CatalogPermission, CatalogResource, CatalogRole, CatalogScope, CatalogSupportAccess, CatalogUsage, CollectConfig, PermDockConfig, RlsActiveRow, RlsConfig, RlsDialect, RlsFunctionMapping, RlsMembershipTable, RlsMemberships, RlsSuspension, RlsTarget, RunResult, SupabaseGrantsMarker, SupabaseHookMarker };
46
+ export type { CatalogActivation, CatalogApproval, CatalogBreakGlass, CatalogConfig, CatalogDocument, CatalogPermission, CatalogResource, CatalogRole, CatalogScope, CatalogSupportAccess, CatalogUsage, CollectConfig, PermDockConfig, RlsActiveRow, RlsApiKeys, RlsConfig, RlsDialect, RlsFunctionMapping, RlsMembershipTable, RlsMemberships, RlsSuspendedMembership, RlsSuspendedScope, RlsSuspension, RlsTarget, RunResult, SupabaseGrantsMarker, SupabaseHookMarker };
package/dist/cli/index.js CHANGED
@@ -1,5 +1,5 @@
1
1
  import { t as catalogPath } from "../catalog-path-CnI0XTFK.js";
2
- import { t as defineConfig } from "../config-BPYmjTOp.js";
2
+ import { t as defineConfig } from "../config-BJiM-xAm.js";
3
3
  import { o as parseGrantsMarker, s as parseHookMarker } from "../markers-B0hYLvMD.js";
4
- import { t as run } from "../run-CJ6UvS3a.js";
4
+ import { t as run } from "../run-YXCJDNYk.js";
5
5
  export { catalogPath, defineConfig, parseGrantsMarker, parseHookMarker, run };
@@ -0,0 +1,12 @@
1
+ //#region src/core/clients.d.ts
2
+ /**
3
+ * Stable names for OAuth clients whose ids differ per environment or are
4
+ * assigned at dynamic registration. A record maps each name to the client
5
+ * id (or ids) it stands for; an unset id (an environment variable that is
6
+ * not defined) names nothing. A function maps a verified client id to a
7
+ * name, or `undefined`. Policy delegations name the client (`to: { kind,
8
+ * client }`), never its id.
9
+ */
10
+ type ClientNames = Readonly<Record<string, string | readonly string[] | undefined>> | ((clientId: string) => string | undefined);
11
+ //#endregion
12
+ export { ClientNames as t };
@@ -0,0 +1,23 @@
1
+ //#region src/core/clients.ts
2
+ /**
3
+ * The name `clients` gives `clientId`, or `undefined`: unknown ids, an id
4
+ * two names claim, a function that throws or returns anything but a
5
+ * non-empty string. Never throws.
6
+ */
7
+ function clientNameOf(clients, clientId) {
8
+ if (clients === void 0 || clientId === "") return;
9
+ try {
10
+ if (typeof clients === "function") {
11
+ const name = clients(clientId);
12
+ return typeof name === "string" && name !== "" ? name : void 0;
13
+ }
14
+ const names = Object.entries(clients).flatMap(([name, ids]) => {
15
+ return name !== "" && (typeof ids === "string" ? [ids] : Array.isArray(ids) ? ids : []).includes(clientId) ? [name] : [];
16
+ });
17
+ return names.length === 1 ? names[0] : void 0;
18
+ } catch {
19
+ return;
20
+ }
21
+ }
22
+ //#endregion
23
+ export { clientNameOf as t };
@@ -1,8 +1,7 @@
1
- import { $ as DecisionSink, Et as TokenVerifier, Y as CredentialEvent, Z as DecisionEvent, et as DirectoryEvent, q as AccessEvent, sn as PolicySource, st as MembershipEvent, wt as TokenFailureCause, xt as SnapshotSource } from "../policy-CInmNGkM.js";
2
- import { f as ApprovalStore } from "../types-B8w5PFtS.js";
3
- import { n as CatalogEventData, o as CloudEventType } from "../sink-Cfr9-7YC.js";
4
- import { a as JsonWebKeySet } from "../types-bva3i4Gf.js";
5
- import { a as ReplayStore } from "../types-i4BAOvdb.js";
1
+ import { $ as AccessEvent, At as SnapshotSource, Ft as TokenVerifier, Nt as TokenFailureCause, at as DecisionSink, bn as PolicySource, ht as MembershipEvent, ot as DirectoryEvent, rt as DecisionEvent, tt as CredentialEvent } from "../policy-CFZAr_Al.js";
2
+ import { f as ApprovalStore } from "../types-vKyAMtcX.js";
3
+ import { n as CatalogEventData, o as CloudEventType } from "../sink-Gs6TTVa-.js";
4
+ import { a as JsonWebKeySet, g as ReplayStore } from "../types-9AWO9EGt.js";
6
5
  //#region src/cloud/types.d.ts
7
6
  type CloudEndpointOptions = {
8
7
  readonly url?: string;
@@ -1,10 +1,10 @@
1
1
  import { t as compact } from "../compact-y6vfu2_f.js";
2
- import { n as freezeDeep } from "../freeze-y1_jQL4v.js";
3
- import { S as isForbiddenKey } from "../permissions-DC7GROPA.js";
4
- import { i as parsePolicyDocument } from "../hosted-BwKQ1BTA.js";
2
+ import { n as freezeDeep } from "../freeze-CrU8nQeX.js";
3
+ import { T as isForbiddenKey } from "../permissions-DVoF6dMt.js";
4
+ import { i as parsePolicyDocument } from "../hosted-DJQw46hn.js";
5
5
  import { t as CLOUD_EVENT_TYPES } from "../sink-Bd9PSyfq.js";
6
- import { t as ApprovalError } from "../errors-m3u9TmDu.js";
7
- import { t as joseTokenVerifier } from "../verifier-B90agnhl.js";
6
+ import { r as isApprovalErrorCode, t as ApprovalError } from "../errors-DRnGZHzF.js";
7
+ import { t as joseTokenVerifier } from "../verifier-BxBo6I44.js";
8
8
  import { t as timeoutSignal } from "../timeout-D51niuQP.js";
9
9
  //#region src/cloud/create.ts
10
10
  /** Milliseconds a PermDock Cloud request may take; a slower one fails like an unreachable Cloud. */
@@ -30,6 +30,20 @@ function asApproval(value) {
30
30
  function isCompactJws$1(value) {
31
31
  return !value.startsWith("{") && value.split(".").length === 3;
32
32
  }
33
+ /** The refusal PermDock Cloud names in its body, else the one its status implies. */
34
+ async function approvalErrorFrom(response) {
35
+ let body;
36
+ try {
37
+ body = await response.json();
38
+ } catch {
39
+ return approvalErrorFromStatus(response.status);
40
+ }
41
+ if (body === null || typeof body !== "object" || !("code" in body)) return approvalErrorFromStatus(response.status);
42
+ const code = body.code;
43
+ if (!isApprovalErrorCode(code)) return approvalErrorFromStatus(response.status);
44
+ const detail = "detail" in body ? body.detail : void 0;
45
+ return new ApprovalError(code, typeof detail === "string" && detail.length > 0 ? detail : code);
46
+ }
33
47
  function approvalErrorFromStatus(status) {
34
48
  if (status === 409) return new ApprovalError("approval-not-pending", "approval is not pending");
35
49
  if (status === 410) return new ApprovalError("approval-expired", "approval has expired");
@@ -92,7 +106,7 @@ function cloud(options = {}) {
92
106
  method: "POST",
93
107
  body: JSON.stringify(verdict)
94
108
  });
95
- if (!response.ok) throw approvalErrorFromStatus(response.status);
109
+ if (!response.ok) throw await approvalErrorFrom(response);
96
110
  const parsed = asApproval(await response.json());
97
111
  if (parsed === null) throw new ApprovalError("approval-not-found", "PermDock Cloud returned an unknown approval shape");
98
112
  return parsed;
@@ -1,4 +1,4 @@
1
- import { i as globalArgs, s as stringArg, t as COMMAND_DESCRIPTIONS } from "./commands-BMh_Etm2.js";
1
+ import { i as globalArgs, s as stringArg, t as COMMAND_DESCRIPTIONS } from "./commands-DWOrSQic.js";
2
2
  import { defineCommand } from "citty";
3
3
  //#region src/cli/commands/cloud.ts
4
4
  function cloud(ctx) {
@@ -30,7 +30,7 @@ function cloud(ctx) {
30
30
  }
31
31
  },
32
32
  async run({ args: parsed }) {
33
- const result = await (await import("./cloud-Cuxr6Czw.js")).runCloud({
33
+ const result = await (await import("./cloud-Bo3e9Ak3.js")).runCloud({
34
34
  cwd: ctx.cwd,
35
35
  config: ctx.config,
36
36
  rest: parsed._,