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
@@ -1,22 +1,9 @@
1
- //#region src/conditions/graph-sql.d.ts
2
- /** Where the graph lives in the database, as the `toWhere` compilers take it. */
3
- type RelationsMapping = {
4
- /** The table of each resource the graph reads; default the resource name. */
5
- readonly tables?: Readonly<Record<string, string>>;
6
- /**
7
- * A closure table (`resource`, `ancestor`, `descendant`, `depth`) such as
8
- * the one `permdock rls` keeps. Without it, parent walks are a bounded
9
- * recursive query over the resource's own table.
10
- */
11
- readonly closure?: string;
12
- };
13
- //#endregion
14
1
  //#region src/conditions/subject-settings.d.ts
15
2
  type WithSubjectOptions = {
16
3
  /** Which settings the generated policies read; match `rls.dialect`. Default `supabase`. */
17
4
  readonly dialect?: "supabase" | "guc" | "neon";
18
5
  /**
19
- * `set local role` before the settings: `authenticated` with a principal, `anon` without.
6
+ * The local `role` setting before the claims: `authenticated` with a principal, `anon` without.
20
7
  * `false` keeps the connection's role, for a login role that RLS already applies to.
21
8
  */
22
9
  readonly role?: "authenticated" | "anon" | false;
@@ -29,6 +16,16 @@ type WithSubjectOptions = {
29
16
  * helpers. `sub`, `role` and the tenant claim always come from the subject.
30
17
  */
31
18
  readonly claims?: Readonly<Record<string, unknown>>;
19
+ /**
20
+ * Field names of the API-key claim written for a principal that acts through a credential
21
+ * (`rls.apiKeys`). Default `{ claim: 'api_key', scopes: 'scopes', tenant: 'tenant', roles: 'roles' }`.
22
+ */
23
+ readonly apiKeys?: {
24
+ readonly claim?: string;
25
+ readonly scopes?: string;
26
+ readonly tenant?: string;
27
+ readonly roles?: string;
28
+ };
32
29
  };
33
30
  //#endregion
34
31
  //#region src/conditions/row-check.d.ts
@@ -40,4 +37,4 @@ type RowCheck = {
40
37
  readonly granted: boolean;
41
38
  };
42
39
  //#endregion
43
- export { WithSubjectOptions as n, RelationsMapping as r, RowCheck as t };
40
+ export { WithSubjectOptions as n, RowCheck as t };
@@ -0,0 +1,89 @@
1
+ import { t as compact } from "./compact-y6vfu2_f.js";
2
+ import { o as requestFromContext } from "./http-SO7qGttf.js";
3
+ import { n as tenantScope } from "./adapter-context-mlWsVGGg.js";
4
+ import { t as adapterKernel } from "./bind-VnYn2HKq.js";
5
+ import { n as guardIterable } from "./stream-DDpvynSB.js";
6
+ //#region src/server/rpc.ts
7
+ /** The tRPC and oRPC error code for a Problem Details status. */
8
+ function rpcCode(status) {
9
+ switch (status) {
10
+ case 400: return "BAD_REQUEST";
11
+ case 401: return "UNAUTHORIZED";
12
+ case 404: return "NOT_FOUND";
13
+ case 429: return "TOO_MANY_REQUESTS";
14
+ case 503: return "SERVICE_UNAVAILABLE";
15
+ default: return "FORBIDDEN";
16
+ }
17
+ }
18
+ /**
19
+ * The Problem Details body of a PermDock response, or `{ status }` when it has
20
+ * none. An RPC error carries only this body; the response headers are dropped.
21
+ */
22
+ async function problemBody(response) {
23
+ try {
24
+ return await response.json();
25
+ } catch {
26
+ return { status: response.status };
27
+ }
28
+ }
29
+ /**
30
+ * The kernel of an RPC adapter. `contextOf` reads the procedure context from
31
+ * its opts; `path` names the fallback `Request` for a context without one.
32
+ */
33
+ function bindRpcKernel(policy, options, adapter, contextOf, path) {
34
+ const optsByRequest = /* @__PURE__ */ new WeakMap();
35
+ const requestByCtx = /* @__PURE__ */ new WeakMap();
36
+ const kernel = adapterKernel(policy, options, adapter, (request) => optsByRequest.get(request));
37
+ const requestOf = (ctx) => {
38
+ if (options.request !== void 0) try {
39
+ return options.request(ctx) ?? void 0;
40
+ } catch {
41
+ return;
42
+ }
43
+ return requestFromContext(ctx);
44
+ };
45
+ const bind = (opts) => {
46
+ const ctx = contextOf(opts);
47
+ const key = ctx;
48
+ const hit = requestByCtx.get(key);
49
+ if (hit !== void 0) return hit;
50
+ const request = requestOf(ctx) ?? new Request(`http://localhost/${adapter}/${path(opts)}`, { method: "POST" });
51
+ requestByCtx.set(key, request);
52
+ if (!optsByRequest.has(request)) optsByRequest.set(request, opts);
53
+ return request;
54
+ };
55
+ const scopeOf = (opts) => tenantScope(options.tenant, opts);
56
+ const connection = async (opts, connectionOptions) => kernel.connection(bind(opts), connectionOptions, await scopeOf(opts));
57
+ const evaluations = kernel.permdockHandler((request) => {
58
+ const opts = optsByRequest.get(request);
59
+ return opts === void 0 ? { tenant: void 0 } : scopeOf(opts);
60
+ });
61
+ const evaluate = (request, opts) => {
62
+ bind(opts);
63
+ return request.method === "GET" ? evaluations.GET(request) : evaluations.POST(request);
64
+ };
65
+ return {
66
+ kernel,
67
+ bind,
68
+ attach: (ctx, request) => {
69
+ requestByCtx.set(ctx, request);
70
+ },
71
+ scopeOf,
72
+ connection,
73
+ evaluate
74
+ };
75
+ }
76
+ /** Wraps a streamed result so revocation ends it and items the subscriber cannot read drop. */
77
+ async function guardStream(source, open, permission, loadData, protectOptions, guard) {
78
+ const conn = await open(permission === null ? {} : compact({
79
+ permission,
80
+ data: loadData
81
+ }));
82
+ return guardIterable(source, conn, compact({
83
+ items: protectOptions?.items,
84
+ unwrap: guard.unwrap,
85
+ onRevoked: guard.onRevoked
86
+ }));
87
+ }
88
+ //#endregion
89
+ export { rpcCode as i, guardStream as n, problemBody as r, bindRpcKernel as t };
@@ -1,11 +1,16 @@
1
- import { a as cliVersion } from "./version-CnSh33Fj.js";
2
- import { n as loadConfig, r as resolveCwd } from "./config-BPYmjTOp.js";
3
- import { i as globalArgs, n as commands, o as resolveArgs, r as isCommand, s as stringArg, t as COMMAND_DESCRIPTIONS } from "./commands-BMh_Etm2.js";
4
- import { i as exitCodeOf, n as cliErrorKind, r as cliProblem } from "./errors-DSMnAVNa.js";
5
- import { defineCommand, parseArgs, renderUsage, runCommand } from "citty";
1
+ import { a as exitCodeOf, i as describeError, n as cliErrorKind, r as cliProblem } from "./errors-CWfoNg9N.js";
2
+ import { o as cliVersion } from "./version-BvacVTZR.js";
3
+ import { a as resolveCwd, i as readConfig } from "./config-BJiM-xAm.js";
4
+ import { i as globalArgs, n as commands, o as resolveArgs, r as isCommand, s as stringArg, t as COMMAND_DESCRIPTIONS } from "./commands-DWOrSQic.js";
6
5
  import { stripVTControlCharacters } from "node:util";
6
+ import { defineCommand, parseArgs, renderUsage, runCommand } from "citty";
7
7
  //#region src/cli/run.ts
8
8
  const NAMES = Object.keys(commands).filter(isCommand);
9
+ const NO_CONFIG = {
10
+ config: {},
11
+ warnings: [],
12
+ file: void 0
13
+ };
9
14
  async function run(argv, options) {
10
15
  const stdoutChunks = [];
11
16
  const stderrChunks = [];
@@ -41,9 +46,13 @@ async function run(argv, options) {
41
46
  const first = globals._[0];
42
47
  const name = first === "help" ? globals._[1] : first;
43
48
  let result;
44
- const contextFor = (cwd, config) => ({
49
+ const configFile = stringArg(globals.config);
50
+ const contextFor = (cwd, loaded = NO_CONFIG) => ({
45
51
  cwd,
46
- config,
52
+ config: loaded.config,
53
+ ...configFile === void 0 ? {} : { configFile },
54
+ ...loaded.file === void 0 ? {} : { configPath: loaded.file },
55
+ configWarnings: loaded.warnings,
47
56
  io,
48
57
  now: io.now?.() ?? /* @__PURE__ */ new Date(),
49
58
  json,
@@ -66,7 +75,7 @@ async function run(argv, options) {
66
75
  }
67
76
  if (askedHelp || first === "help" || name === void 0) {
68
77
  const root = rootCommand();
69
- const usage = name === void 0 ? await renderUsage(root) : await renderUsage(await load(name, contextFor(options?.cwd ?? process.cwd(), {})), root);
78
+ const usage = name === void 0 ? await renderUsage(root) : await renderUsage(await load(name, contextFor(options?.cwd ?? process.cwd())), root);
70
79
  if (name === void 0 && !askedHelp && first !== "help") {
71
80
  writeErr(plain(usage));
72
81
  return done(2);
@@ -75,14 +84,15 @@ async function run(argv, options) {
75
84
  return done(0);
76
85
  }
77
86
  const cwd = resolveCwd(stringArg(globals.cwd), options?.cwd ?? process.cwd());
78
- let config;
87
+ let loaded;
79
88
  try {
80
- config = await loadConfig(cwd, stringArg(globals.config));
89
+ loaded = await readConfig(cwd, configFile);
81
90
  } catch (error) {
82
- return fail(cliErrorKind(error), error instanceof Error ? error.message : String(error));
91
+ return fail(cliErrorKind(error), describeError(error));
83
92
  }
93
+ if (name !== "config") for (const warning of loaded.warnings) writeErr(`permdock: warning: ${warning}`);
84
94
  try {
85
- const command = await load(name, contextFor(cwd, config));
95
+ const command = await load(name, contextFor(cwd, loaded));
86
96
  const rawArgs = withoutCommand(argv, name);
87
97
  await runCommand(command, { rawArgs: normaliseValues(rawArgs, await resolveArgs(command)) });
88
98
  } catch (error) {
@@ -91,6 +101,7 @@ async function run(argv, options) {
91
101
  return fail(cliErrorKind(error), error.message, name);
92
102
  }
93
103
  if (result === void 0) return done(0);
104
+ if (json && result.code !== 0 && !isJson(result.output)) return fail(result.code === 2 ? "usage" : "failed", result.output, name);
94
105
  writeOut(result.output);
95
106
  return done(result.code);
96
107
  }
@@ -118,6 +129,14 @@ function rootCommand() {
118
129
  async function load(name, ctx) {
119
130
  return (await commands[name]())(ctx);
120
131
  }
132
+ function isJson(text) {
133
+ try {
134
+ JSON.parse(text);
135
+ return true;
136
+ } catch {
137
+ return false;
138
+ }
139
+ }
121
140
  function lined(text) {
122
141
  return text.endsWith("\n") ? text : `${text}\n`;
123
142
  }
@@ -0,0 +1,11 @@
1
+ import { a as protectedView, s as scopedTenant } from "./views-Soe7bGSC.js";
2
+ //#region src/svelte/protected.ts
3
+ /** The instance for `tenant`, built once per store change rather than once per check. */
4
+ function scopedFor(store, tenant, _generation) {
5
+ return scopedTenant(store.get(), tenant);
6
+ }
7
+ function viewFor(store, reference, data, scoped, _generation) {
8
+ return protectedView(store.permissionState(reference, data), store.get(), reference, data, scoped);
9
+ }
10
+ //#endregion
11
+ export { viewFor as n, scopedFor as t };
@@ -1,10 +1,10 @@
1
- import { r as principal } from "./refs-ChLSxbST.js";
2
- import { a as definePolicy, d as role, m as memoryLimitStore, o as deny, t as allow } from "./policy-ANp36PnI.js";
3
- import { m as memoryRoleSource } from "./src-CTNT-PBW.js";
4
- import { d as relation, n as anyone } from "./grantee-Bv04_Vzf.js";
5
- import { t as memoryRelations } from "./relations-r4soIFZB.js";
6
- import { i as quoteSqlLiteral } from "./sql-Bll1d7y0.js";
7
- import { a as saasPlans, i as saasPermissions, o as saasRoles } from "./permissions-CofRqesP.js";
1
+ import { r as principal } from "./refs-KYb4ntaz.js";
2
+ import { _ as memoryLimitStore, a as definePolicy, m as role, o as deny, t as allow } from "./policy-xyWg7QdR.js";
3
+ import { _ as memoryRoleSource } from "./src-CSbUiozF.js";
4
+ import { n as anyone, p as relation } from "./grantee-Cv5Sogfv.js";
5
+ import { t as memoryRelations } from "./relations-cjOL01hZ.js";
6
+ import { i as quoteSqlLiteral } from "./sql-xdg5f4Fi.js";
7
+ import { a as saasPlans, i as saasPermissions, o as saasRoles } from "./permissions-CpZrivYv.js";
8
8
  //#region src/testing/saas/policy.ts
9
9
  function isSubject(user) {
10
10
  return user !== null && "context" in user && "principal" in user;
@@ -979,6 +979,16 @@ const saasScenarios = Object.freeze([
979
979
  expected: { outcome: "granted" },
980
980
  clientOutcome: "denied"
981
981
  },
982
+ {
983
+ name: "team lead does not pass a tenant-level doc check without a row",
984
+ user: "gina",
985
+ tenant: "acme",
986
+ permission: saasPermissions.doc.update,
987
+ expected: {
988
+ outcome: "denied",
989
+ reason: "scope"
990
+ }
991
+ },
982
992
  {
983
993
  name: "team lead cannot update a locked doc",
984
994
  user: "gina",
@@ -1,4 +1,4 @@
1
- import { n as freezeDeep } from "./freeze-y1_jQL4v.js";
1
+ import { n as freezeDeep } from "./freeze-CrU8nQeX.js";
2
2
  //#region src/catalog/schema.ts
3
3
  const name = {
4
4
  type: "string",
@@ -58,7 +58,7 @@ const approval = { oneOf: [{ const: "human" }, {
58
58
  /** `schemas/catalog-v1.json`; a test keeps the two equal. */
59
59
  const catalogSchema = freezeDeep({
60
60
  $schema: "https://json-schema.org/draft/2020-12/schema",
61
- $id: "https://permdock.dev/schemas/catalog-v1.json",
61
+ $id: "https://permdock.com/schemas/catalog-v1.json",
62
62
  type: "object",
63
63
  required: [
64
64
  "$schema",
@@ -85,7 +85,8 @@ const catalogSchema = freezeDeep({
85
85
  definedIn: { type: "string" },
86
86
  relations: { type: "object" },
87
87
  version: { type: "string" },
88
- restricted: { type: "string" }
88
+ restricted: { type: "string" },
89
+ restrictedStops: strings
89
90
  }
90
91
  }
91
92
  },
@@ -198,6 +199,7 @@ const catalogSchema = freezeDeep({
198
199
  }
199
200
  },
200
201
  renamedFrom: strings,
202
+ levels: strings,
201
203
  hostable: { const: true },
202
204
  rowConditions: { type: "boolean" },
203
205
  approvals: {
@@ -250,6 +252,7 @@ const catalogSchema = freezeDeep({
250
252
  validity,
251
253
  name: { type: "string" },
252
254
  purpose: strings,
255
+ requires: { oneOf: [{ type: "string" }, strings] },
253
256
  limit: {
254
257
  type: "object",
255
258
  required: ["count", "per"],
@@ -282,7 +285,8 @@ const catalogSchema = freezeDeep({
282
285
  required: ["kind"],
283
286
  properties: {
284
287
  kind: { type: "string" },
285
- id: { type: "string" }
288
+ id: { type: "string" },
289
+ client: { type: "string" }
286
290
  }
287
291
  },
288
292
  permissions: strings,
@@ -1,2 +1,2 @@
1
- import { A as ScimPageResult, C as LIST_SCHEMA, D as ScimFilter, E as SCIM_CONTENT_TYPE, M as ScimTokenOptions, N as USER_SCHEMA, O as ScimHandlerOptions, S as GROUP_SCHEMA, T as ROLES_EXTENSION, _ as DirectoryNotFoundError, a as scimHandler, b as DirectoryUser, c as parseScimFilter, d as serviceProviderConfig, f as authenticateScim, g as DirectoryMembershipSourceOptions, h as DirectoryGroup, i as tenantFromPath, j as ScimPatchOp, k as ScimPage, l as resourceTypes, m as DirectoryChange, n as directoryMembershipSource, o as filterSupported, p as sha256Hex, r as normalizePatchOps, s as matchFilter, t as memoryDirectoryStore, u as schemas, v as DirectoryStore, w as PATCH_SCHEMA, x as ERROR_SCHEMA, y as DirectoryUniquenessError } from "../index-LF_hS-yn.js";
1
+ import { A as ScimPageResult, C as LIST_SCHEMA, D as ScimFilter, E as SCIM_CONTENT_TYPE, M as ScimTokenOptions, N as USER_SCHEMA, O as ScimHandlerOptions, S as GROUP_SCHEMA, T as ROLES_EXTENSION, _ as DirectoryNotFoundError, a as scimHandler, b as DirectoryUser, c as parseScimFilter, d as serviceProviderConfig, f as authenticateScim, g as DirectoryMembershipSourceOptions, h as DirectoryGroup, i as tenantFromPath, j as ScimPatchOp, k as ScimPage, l as resourceTypes, m as DirectoryChange, n as directoryMembershipSource, o as filterSupported, p as sha256Hex, r as normalizePatchOps, s as matchFilter, t as memoryDirectoryStore, u as schemas, v as DirectoryStore, w as PATCH_SCHEMA, x as ERROR_SCHEMA, y as DirectoryUniquenessError } from "../index-A0YNL8jZ.js";
2
2
  export { type DirectoryChange, type DirectoryGroup, type DirectoryMembershipSourceOptions, DirectoryNotFoundError, type DirectoryStore, DirectoryUniquenessError, type DirectoryUser, ERROR_SCHEMA, GROUP_SCHEMA, LIST_SCHEMA, PATCH_SCHEMA, ROLES_EXTENSION, SCIM_CONTENT_TYPE, type ScimFilter, type ScimHandlerOptions, type ScimPage, type ScimPageResult, type ScimPatchOp, type ScimTokenOptions, USER_SCHEMA, authenticateScim, directoryMembershipSource, filterSupported, matchFilter, memoryDirectoryStore, normalizePatchOps, parseScimFilter, resourceTypes, schemas, scimHandler, serviceProviderConfig, sha256Hex, tenantFromPath };
@@ -1,2 +1,2 @@
1
- import { S as sha256Hex, _ as PATCH_SCHEMA, a as normalizePatchOps, b as USER_SCHEMA, c as parseScimFilter, d as serviceProviderConfig, f as DirectoryNotFoundError, g as LIST_SCHEMA, h as GROUP_SCHEMA, i as tenantFromPath, l as resourceTypes, m as ERROR_SCHEMA, n as directoryMembershipSource, o as filterSupported, p as DirectoryUniquenessError, r as scimHandler, s as matchFilter, t as memoryDirectoryStore, u as schemas, v as ROLES_EXTENSION, x as authenticateScim, y as SCIM_CONTENT_TYPE } from "../scim-9NFa0XVZ.js";
1
+ import { S as sha256Hex, _ as PATCH_SCHEMA, a as normalizePatchOps, b as USER_SCHEMA, c as parseScimFilter, d as serviceProviderConfig, f as DirectoryNotFoundError, g as LIST_SCHEMA, h as GROUP_SCHEMA, i as tenantFromPath, l as resourceTypes, m as ERROR_SCHEMA, n as directoryMembershipSource, o as filterSupported, p as DirectoryUniquenessError, r as scimHandler, s as matchFilter, t as memoryDirectoryStore, u as schemas, v as ROLES_EXTENSION, x as authenticateScim, y as SCIM_CONTENT_TYPE } from "../scim-BFGBBAqR.js";
2
2
  export { DirectoryNotFoundError, DirectoryUniquenessError, ERROR_SCHEMA, GROUP_SCHEMA, LIST_SCHEMA, PATCH_SCHEMA, ROLES_EXTENSION, SCIM_CONTENT_TYPE, USER_SCHEMA, authenticateScim, directoryMembershipSource, filterSupported, matchFilter, memoryDirectoryStore, normalizePatchOps, parseScimFilter, resourceTypes, schemas, scimHandler, serviceProviderConfig, sha256Hex, tenantFromPath };
@@ -1,5 +1,5 @@
1
1
  import { n as isReadonlyArray, 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 { n as sha256 } from "./sha256-BO0swRXL.js";
4
4
  import { a as memorySink, i as membershipEvent } from "./sink-Bd9PSyfq.js";
5
5
  //#region src/scim/auth.ts
@@ -1,4 +1,5 @@
1
- import { S as isForbiddenKey } from "./permissions-DC7GROPA.js";
1
+ import { T as isForbiddenKey } from "./permissions-DVoF6dMt.js";
2
+ import { t as idText } from "./ids-DC4V4CFu.js";
2
3
  //#region src/core/scopes.ts
3
4
  const RESERVED = /* @__PURE__ */ new Set(["global", "resource"]);
4
5
  const NAME = /^[a-z][a-z0-9_]*$/u;
@@ -126,17 +127,22 @@ function normalizeMembership(input, scopes) {
126
127
  const seats = raw["entitlements"].filter((item) => typeof item === "string" && item !== "");
127
128
  if (seats.length > 0) extra.entitlements = Object.freeze(seats);
128
129
  }
130
+ if (raw["keep"] !== void 0) {
131
+ if (!Array.isArray(raw["keep"]) || !raw["keep"].every((key) => typeof key === "string" && key !== "")) return;
132
+ extra.keep = Object.freeze([...raw["keep"]]);
133
+ }
129
134
  const named = raw["scope"] !== void 0 || raw["id"] !== void 0;
130
135
  const legacy = raw["tenant"] !== void 0 || raw["team"] !== void 0;
131
136
  const on = raw["on"];
132
137
  if (on !== void 0) {
133
138
  if (named || legacy || on === null || typeof on !== "object") return;
134
139
  const target = on;
135
- if (!isId(target["resource"]) || !isId(target["id"])) return;
140
+ const targetId = idText(target["id"]);
141
+ if (!isId(target["resource"]) || targetId === void 0) return;
136
142
  return Object.freeze({
137
143
  on: Object.freeze({
138
144
  resource: target["resource"],
139
- id: target["id"]
145
+ id: targetId
140
146
  }),
141
147
  roles: Object.freeze([...roles]),
142
148
  ...extra
@@ -163,19 +169,20 @@ function normalizeMembership(input, scopes) {
163
169
  scope = resolveScope(scopes, "tenant");
164
170
  id = raw["tenant"];
165
171
  }
166
- if (scope === void 0 || !isId(id)) return;
172
+ const text = idText(id);
173
+ if (scope === void 0 || text === void 0) return;
167
174
  const ancestors = scopeChain(scopes, scope).slice(1);
168
175
  const resolved = {};
169
176
  for (const key of Object.keys(within)) {
170
177
  if (isForbiddenKey(key)) return;
171
178
  const name = resolveScope(scopes, key);
172
- const value = within[key];
173
- if (name !== void 0 && ancestors.includes(name) && isId(value)) resolved[name] = value;
179
+ const value = idText(within[key]);
180
+ if (name !== void 0 && ancestors.includes(name) && value !== void 0) resolved[name] = value;
174
181
  }
175
182
  if (ancestors.some((name) => resolved[name] === void 0)) return;
176
183
  return Object.freeze({
177
184
  scope,
178
- id,
185
+ id: text,
179
186
  ...ancestors.length === 0 ? {} : { within: Object.freeze(resolved) },
180
187
  roles: Object.freeze([...roles]),
181
188
  ...extra
@@ -208,5 +215,25 @@ function activeFor(membership, scopes, active) {
208
215
  if (root === void 0 || membership.scope === void 0 || !scopeChain(scopes, membership.scope).includes(root)) return true;
209
216
  return active !== void 0 && scopeIdOf(membership, root) === active;
210
217
  }
218
+ /** Whether `membership` counts for `key`: always, unless a suspension limits it to `keep`. */
219
+ function keepsPermission(membership, key) {
220
+ return membership.keep === void 0 || membership.keep.includes(key);
221
+ }
222
+ /**
223
+ * The subject as it stands for one permission: memberships a suspension
224
+ * limits to other permissions are left out. The same object when none is.
225
+ */
226
+ function subjectForPermission(subject, key) {
227
+ const principal = subject.principal;
228
+ const memberships = principal?.memberships;
229
+ if (principal === null || memberships === void 0 || memberships.every((membership) => keepsPermission(membership, key))) return subject;
230
+ return {
231
+ ...subject,
232
+ principal: {
233
+ ...principal,
234
+ memberships: memberships.filter((membership) => keepsPermission(membership, key))
235
+ }
236
+ };
237
+ }
211
238
  //#endregion
212
- export { resolveScope as a, scopeChain as c, subjectMemberships as d, tenantOf as f, normalizeMemberships as i, scopeIdOf as l, defineScopes as n, rootMembershipId as o, findScope as r, rootScope as s, activeFor as t, scopeList as u };
239
+ export { normalizeMemberships as a, rootScope as c, scopeList as d, subjectForPermission as f, keepsPermission as i, scopeChain as l, tenantOf as m, defineScopes as n, resolveScope as o, subjectMemberships as p, findScope as r, rootMembershipId as s, activeFor as t, scopeIdOf as u };
@@ -1,8 +1,11 @@
1
- import { $ as DecisionSink, Ft as Credential, Ht as CredentialPrincipal, J as AuthEvent, Mn as Decision, St as SubjectResolver, X as CredentialVerifier, hr as Subject, mr as Principal, mt as SettingsSource } from "../policy-CInmNGkM.js";
2
- import { d as Permission, p as PermissionTree } from "../permissions-B4apnahQ.js";
3
- import { a as PermDockValidationError, i as PermDockRevokedError, n as PermDockApprovalRequiredError, o as ProblemDetails, r as PermDockDeniedError, t as ApprovalHint } from "../errors-DbZ1YOnb.js";
1
+ import { $t as CredentialPrincipal, Ct as SettingsSource, Kt as Credential, Nr as Principal, Pr as Subject, Yn as Decision, at as DecisionSink, et as AuthEvent, jt as SubjectResolver, nt as CredentialVerifier } from "../policy-CFZAr_Al.js";
2
+ import { f as Permission, m as PermissionTree } from "../permissions-DttnqqxC.js";
3
+ import { n as PermDockValidationError, t as PROBLEM_BASE } from "../validation-error-CtF23SrC.js";
4
+ import { t as Disclosure } from "../problem-details-CkL50EEf.js";
5
+ import { a as ProblemDetails, i as PermDockRevokedError, n as PermDockApprovalRequiredError, r as PermDockDeniedError, t as ApprovalHint } from "../errors-DAqevpNk.js";
4
6
  import { i as memoryRevocationFeed, n as RevocationFeed, t as RevocationEvent } from "../revocations-Cy06JNx2.js";
5
- import { S as ConnectionOptions, _ as invalidSignatureProblem, a as ServerPermDockOptions, b as Connection, c as createEvaluationsHandler, d as WebBotAuthJwk, f as WebBotAuthKeyLookup, g as discoverViaSignatureAgent, h as WebBotAuthVerifier, i as ServerPermDock, l as DiscoverViaSignatureAgentOptions, m as WebBotAuthOptions, n as OpenApiHooks, p as WebBotAuthKeys, r as ProtectOptions, s as createPermDock, t as Guard, u as InvalidSignatureError, v as invalidSignatureResponse, x as ConnectionData, y as verifyWebBotAuth } from "../create-BKF3dgFk.js";
7
+ import { A as ConnectionOptions, C as invalidSignatureResponse, D as tenantScope, E as TenantScope, O as Connection, S as invalidSignatureProblem, T as TenantOption, _ as WebBotAuthKeyLookup, a as ScopeGuard, b as WebBotAuthVerifier, c as ServerPermDock, d as createPermDock, f as createServerKernel, g as WebBotAuthJwk, h as InvalidSignatureError, i as ProtectOptions, k as ConnectionData, l as ServerPermDockOptions, m as DiscoverViaSignatureAgentOptions, n as OpenApiHooks, o as ServerKernel, p as createEvaluationsHandler, r as OperationScopes, s as ServerKernelOptions, t as Guard, u as SnapshotQuery, v as WebBotAuthKeys, w as verifyWebBotAuth, x as discoverViaSignatureAgent, y as WebBotAuthOptions } from "../create-BWyx3jua.js";
8
+ import { a as snapshotHeaders, i as cacheLifeFor, n as SnapshotHeaders, o as snapshotTag, r as SnapshotHeadersOptions, t as CacheLifeForOptions } from "../snapshot-cache-DwQH8ufx.js";
6
9
  //#region src/server/credentials.d.ts
7
10
  /** `on('auth')` causes for an API key that resolves to the anonymous subject. */
8
11
  type ApiKeyFailureCause = "malformed" | "unknown-credential" | "invalid-claims" | "expired" | "credential-policy" | "credential-revoked" | "owner-unavailable";
@@ -100,24 +103,32 @@ type ApiKeySubjectOptions = {
100
103
  export declare function subjectFromApiKey(options: ApiKeySubjectOptions): SubjectResolver<string | undefined | null, CredentialPrincipal>;
101
104
  //#endregion
102
105
  //#region src/server/map-error.d.ts
106
+ type ProblemFromErrorOptions = {
107
+ readonly instance?: string;
108
+ /** Whether the request carried credentials, which picks the `401` challenge. */
109
+ readonly credentials?: boolean;
110
+ };
103
111
  /**
104
- * Turns a thrown PermDock error into its Problem Details response. Returns
105
- * `undefined` for anything else so the framework's own error path takes over.
112
+ * Turns a thrown PermDock error into its Problem Details response, with the
113
+ * status, `WWW-Authenticate` and rate-limit fields `protect` sends for the
114
+ * same decision. Returns `undefined` for anything else so the framework's own
115
+ * error path takes over.
106
116
  */
107
- export declare function problemFromError(error: unknown): Response | undefined;
117
+ export declare function problemFromError(error: unknown, options?: ProblemFromErrorOptions): Response | undefined;
108
118
  //#endregion
109
119
  //#region src/server/problem.d.ts
110
- export declare const PROBLEM_BASE = "https://permdock.dev/problems";
111
120
  export declare function wwwAuthenticate(decision: Decision, permission: Permission | undefined, credentials?: boolean): string | undefined;
112
121
  export declare function problemResponse(details: ProblemDetails, permission?: Permission, decision?: Decision, extra?: Readonly<Record<string, string>>, credentials?: boolean): Response;
113
122
  export declare function validationProblem(detail: string): Response;
114
- export declare function problemFromDecision(decision: Decision, permission: Permission, subject: Subject, options?: {
123
+ export declare function problemFromDecision(decision: Decision, permission: Permission, subject: Subject | undefined, options?: {
115
124
  readonly instance?: string;
116
125
  readonly approval?: ApprovalHint;
117
126
  /** `'hide'` on a loaded row: a denial answers as `404` `/not-found`. */
118
- readonly disclosure?: "hide" | "reveal";
127
+ readonly disclosure?: Disclosure;
119
128
  /** Whether the request carried credentials, which picks the `401` challenge. */
120
129
  readonly credentials?: boolean;
130
+ /** The scope an `insufficient_scope` challenge names; the permission's own scope when absent. */
131
+ readonly scope?: string;
121
132
  }): Response;
122
133
  //#endregion
123
- export { type ApiKeyFailureCause, type ApiKeyParts, type ApiKeySubjectOptions, type ApprovalHint, type Connection, type ConnectionData, type ConnectionOptions, type DiscoverViaSignatureAgentOptions, type Guard, InvalidSignatureError, type MemoryCredentials, type OpenApiHooks, PermDockApprovalRequiredError, PermDockDeniedError, PermDockRevokedError, PermDockValidationError, type ProtectOptions, type RevocationEvent, type RevocationFeed, type ServerPermDock, type ServerPermDockOptions, type StoredCredential, type WebBotAuthJwk, type WebBotAuthKeyLookup, type WebBotAuthKeys, type WebBotAuthOptions, type WebBotAuthVerifier, createEvaluationsHandler, createPermDock, discoverViaSignatureAgent, invalidSignatureProblem, invalidSignatureResponse, memoryRevocationFeed, verifyWebBotAuth };
134
+ export { type ApiKeyFailureCause, type ApiKeyParts, type ApiKeySubjectOptions, type ApprovalHint, type CacheLifeForOptions, type Connection, type ConnectionData, type ConnectionOptions, type DiscoverViaSignatureAgentOptions, type Guard, InvalidSignatureError, type MemoryCredentials, type OpenApiHooks, type OperationScopes, PROBLEM_BASE, PermDockApprovalRequiredError, PermDockDeniedError, PermDockRevokedError, PermDockValidationError, type ProblemFromErrorOptions, type ProtectOptions, type RevocationEvent, type RevocationFeed, type ScopeGuard, type ServerKernel, type ServerKernelOptions, type ServerPermDock, type ServerPermDockOptions, type SnapshotHeaders, type SnapshotHeadersOptions, type SnapshotQuery, type StoredCredential, type TenantOption, type TenantScope, type WebBotAuthJwk, type WebBotAuthKeyLookup, type WebBotAuthKeys, type WebBotAuthOptions, type WebBotAuthVerifier, cacheLifeFor, createEvaluationsHandler, createPermDock, createServerKernel, discoverViaSignatureAgent, invalidSignatureProblem, invalidSignatureResponse, memoryRevocationFeed, snapshotHeaders, snapshotTag, tenantScope, verifyWebBotAuth };
@@ -1,8 +1,11 @@
1
- import { i as PermDockValidationError, n as PermDockDeniedError, r as PermDockRevokedError, t as PermDockApprovalRequiredError } from "../errors-Iy71s7Oj.js";
2
- import { s as memoryRevocationFeed } from "../credential-B_rkUNlY.js";
3
- import { a as problemFromDecision, l as validationProblem, o as problemResponse, t as PROBLEM_BASE, u as wwwAuthenticate } from "../problem-Cgp9-KZA.js";
4
- import { a as invalidSignatureProblem, i as discoverViaSignatureAgent, n as createEvaluationsHandler, o as invalidSignatureResponse, r as InvalidSignatureError, s as verifyWebBotAuth } from "../evaluations-DsAU9ppl.js";
5
- import { n as createPermDock } from "../create-CSkhDU9T.js";
6
- import { a as parseApiKey, i as memoryCredentials, n as generateApiKey, o as subjectFromApiKey, r as hashApiKey, t as apiKeyVerifier } from "../credentials-BgRX3WEg.js";
7
- import { t as problemFromError } from "../map-error-RJ3ZsUyA.js";
8
- export { InvalidSignatureError, PROBLEM_BASE, PermDockApprovalRequiredError, PermDockDeniedError, PermDockRevokedError, PermDockValidationError, apiKeyVerifier, createEvaluationsHandler, createPermDock, discoverViaSignatureAgent, generateApiKey, hashApiKey, invalidSignatureProblem, invalidSignatureResponse, memoryCredentials, memoryRevocationFeed, parseApiKey, problemFromDecision, problemFromError, problemResponse, subjectFromApiKey, validationProblem, verifyWebBotAuth, wwwAuthenticate };
1
+ import { n as PermDockValidationError, t as PROBLEM_BASE } from "../validation-error-CnjZ4t92.js";
2
+ import { n as PermDockDeniedError, r as PermDockRevokedError, t as PermDockApprovalRequiredError } from "../errors-Cz5zn0mW.js";
3
+ import { t as memoryRevocationFeed } from "../revocations-Bhr0aMIC.js";
4
+ import { d as wwwAuthenticate, o as problemFromDecision, s as problemResponse, u as validationProblem } from "../problem-B43ztKIm.js";
5
+ import { n as snapshotHeaders, r as snapshotTag, t as cacheLifeFor } from "../snapshot-cache-D6jLelln.js";
6
+ import { a as invalidSignatureProblem, i as discoverViaSignatureAgent, n as createEvaluationsHandler, o as invalidSignatureResponse, r as InvalidSignatureError, s as verifyWebBotAuth } from "../evaluations-tz6D9A2G.js";
7
+ import { n as tenantScope } from "../adapter-context-mlWsVGGg.js";
8
+ import { n as createServerKernel, t as createPermDock } from "../create-CPhDL6qx.js";
9
+ import { a as parseApiKey, i as memoryCredentials, n as generateApiKey, o as subjectFromApiKey, r as hashApiKey, t as apiKeyVerifier } from "../server-DlZ28Oz5.js";
10
+ import { t as problemFromError } from "../map-error-pgUWNNtG.js";
11
+ export { InvalidSignatureError, PROBLEM_BASE, PermDockApprovalRequiredError, PermDockDeniedError, PermDockRevokedError, PermDockValidationError, apiKeyVerifier, cacheLifeFor, createEvaluationsHandler, createPermDock, createServerKernel, discoverViaSignatureAgent, generateApiKey, hashApiKey, invalidSignatureProblem, invalidSignatureResponse, memoryCredentials, memoryRevocationFeed, parseApiKey, problemFromDecision, problemFromError, problemResponse, snapshotHeaders, snapshotTag, subjectFromApiKey, tenantScope, validationProblem, verifyWebBotAuth, wwwAuthenticate };
@@ -1,9 +1,9 @@
1
1
  import { t as compact } from "./compact-y6vfu2_f.js";
2
- import { i as credentialTenant, n as credentialPolicyViolation, o as parseCredential, r as credentialSubject } from "./credential-B_rkUNlY.js";
3
2
  import { t as bytesToBase64Url } from "./sha256-BO0swRXL.js";
4
3
  import { n as isThenable } from "./thenable-okc2xDsj.js";
5
4
  import { t as anonymousSubject } from "./subject-C6dLxqHU.js";
6
5
  import { r as credentialEvent } from "./sink-Bd9PSyfq.js";
6
+ import { i as credentialTenant, n as credentialPolicyViolation, o as parseCredential, r as credentialSubject } from "./credential-8P81ff4u.js";
7
7
  //#region src/server/credentials.ts
8
8
  const PREFIX = "pdk_";
9
9
  const ID = /^[\w-]{1,128}$/u;