permdock 0.1.0 → 0.3.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (350) hide show
  1. package/README.md +106 -47
  2. package/dist/a2a/index.d.ts +7 -16
  3. package/dist/a2a/index.js +59 -98
  4. package/dist/adapter-context-mlWsVGGg.js +23 -0
  5. package/dist/ai-sdk/index.d.ts +37 -16
  6. package/dist/ai-sdk/index.js +30 -13
  7. package/dist/approvals/index.d.ts +3 -3
  8. package/dist/approvals/index.js +5 -4
  9. package/dist/{approvals-DaxY-Bdg.js → approvals-DbYAuNkG.js} +17 -11
  10. package/dist/approvers-DT4AVyIg.js +52 -0
  11. package/dist/{arazzo-CTeVuXr5.js → arazzo-BAgw9ap6.js} +2 -2
  12. package/dist/{arazzo-aoTkqYsJ.js → arazzo-CKwwqFWz.js} +2 -2
  13. package/dist/authzen/index.d.ts +4 -13
  14. package/dist/authzen/index.js +16 -50
  15. package/dist/better-auth/index.d.ts +20 -3
  16. package/dist/better-auth/index.js +27 -7
  17. package/dist/better-supabase/index.d.ts +223 -0
  18. package/dist/better-supabase/index.js +648 -0
  19. package/dist/bind-C_ob3LKa.d.ts +25 -0
  20. package/dist/bind-CuzGytRf.js +97 -0
  21. package/dist/boundary-BM8a_P6E.js +13 -0
  22. package/dist/boundary-BmHxVH1J.d.ts +15 -0
  23. package/dist/canonical-json-DemiK4Vp.js +26 -0
  24. package/dist/{capability-BDG_nkxt.d.ts → capability-2kYTMWDv.d.ts} +2 -2
  25. package/dist/{capability-B68OFnZx.js → capability-4qPdO9gk.js} +7 -5
  26. package/dist/catalog/index.d.ts +1 -1
  27. package/dist/catalog/index.js +1 -1
  28. package/dist/catalog-CRW5Mx_B.js +2 -0
  29. package/dist/{catalog-H-vFGwWK.js → catalog-DWF5cYqB.js} +4 -4
  30. package/dist/{catalog-B0E6bggc.js → catalog-dFZdWCGN.js} +2 -2
  31. package/dist/{catalog-doc-BSo_Q_-6.js → catalog-doc-DdGm82XT.js} +20 -32
  32. package/dist/claude-agent/index.d.ts +5 -14
  33. package/dist/claude-agent/index.js +4 -10
  34. package/dist/clerk/index.d.ts +12 -3
  35. package/dist/clerk/index.js +26 -5
  36. package/dist/cli/bin.js +1 -1
  37. package/dist/cli/index.d.ts +3 -3
  38. package/dist/cli/index.js +2 -2
  39. package/dist/clients-C7zLFuWT.d.ts +12 -0
  40. package/dist/clients-DjU5ABMy.js +23 -0
  41. package/dist/cloud/index.d.ts +4 -5
  42. package/dist/cloud/index.js +20 -6
  43. package/dist/{cloud-BNQTrmrr.js → cloud-CB_ELYuX.js} +2 -2
  44. package/dist/{cloud-Cuxr6Czw.js → cloud-DWLXO2af.js} +7 -6
  45. package/dist/collect-DClJsheJ.js +83 -0
  46. package/dist/{collect-O-tOtbnk.js → collect-DSTE3ml9.js} +194 -42
  47. package/dist/collect-DSWOk19R.js +2 -0
  48. package/dist/{commands-BMh_Etm2.js → commands-DSxCqG9A.js} +16 -12
  49. package/dist/compile/index.d.ts +3 -0
  50. package/dist/compile/index.js +2 -0
  51. package/dist/{compile-D22iwvuV.js → compile-Ba4blROR.js} +85 -30
  52. package/dist/compile-BkRyBDBw.d.ts +94 -0
  53. package/dist/config-BJiM-xAm.js +157 -0
  54. package/dist/config-Dnszbv-6.js +36 -0
  55. package/dist/config-report-DMvWKUxL.js +44 -0
  56. package/dist/{connection-JvqwHODC.js → connection-CU8MQxRi.js} +1 -1
  57. package/dist/{context-CKEAabd7.js → context-Bcy85rGi.js} +36 -27
  58. package/dist/convex/index.d.ts +9 -4
  59. package/dist/convex/index.js +14 -4
  60. package/dist/create-B1d519XK.d.ts +245 -0
  61. package/dist/create-CMwIl-w2.js +253 -0
  62. package/dist/{credential-B_rkUNlY.js → credential-8P81ff4u.js} +26 -46
  63. package/dist/delegation-D8pUEuce.js +103 -0
  64. package/dist/{describe-Bt1YD5uS.js → describe-B_gVZEVi.js} +10 -15
  65. package/dist/{describe-DernyItf.d.ts → describe-DMYiCjJV.d.ts} +9 -10
  66. package/dist/{diff-x5Il8LVa.js → diff-2VaeChzX.js} +44 -11
  67. package/dist/{diff-BUzf5Poi.js → diff-DBIhz_f2.js} +2 -2
  68. package/dist/{doctor-Bqo6FwUa.js → doctor-BwCAMLx_.js} +2 -2
  69. package/dist/doctor-collect-CHk6XWOA.js +665 -0
  70. package/dist/doctor-igIiM_Hl.js +1194 -0
  71. package/dist/drizzle/index.d.ts +4 -3
  72. package/dist/drizzle/index.js +3 -3
  73. package/dist/elysia/index.d.ts +6 -28
  74. package/dist/elysia/index.js +16 -60
  75. package/dist/{errors-DSMnAVNa.js → errors-CWfoNg9N.js} +8 -4
  76. package/dist/{errors-Iy71s7Oj.js → errors-Cz5zn0mW.js} +17 -71
  77. package/dist/{errors-DbZ1YOnb.d.ts → errors-DPdqI50v.d.ts} +8 -21
  78. package/dist/{errors-m3u9TmDu.js → errors-DRnGZHzF.js} +4 -1
  79. package/dist/evaluation-items-CfCCejQd.js +40 -0
  80. package/dist/{evaluations-DsAU9ppl.js → evaluations-tz6D9A2G.js} +28 -46
  81. package/dist/eve/index.d.ts +6 -15
  82. package/dist/eve/index.js +7 -12
  83. package/dist/expiry-BoBJ8Tvc.js +7 -0
  84. package/dist/express/index.d.ts +6 -29
  85. package/dist/express/index.js +28 -58
  86. package/dist/fastify/index.d.ts +6 -29
  87. package/dist/fastify/index.js +16 -65
  88. package/dist/fields-BMl1RxoX.js +26 -0
  89. package/dist/{files-B_wAGYmt.js → files-DWUN9PzI.js} +5 -1
  90. package/dist/{fixtures-Cvaw0gDG.js → fixtures-ht28Cplr.js} +5 -2
  91. package/dist/{freeze-y1_jQL4v.js → freeze-CrU8nQeX.js} +31 -2
  92. package/dist/{from-snapshot-BMGnhmgv.js → from-snapshot-CTLijvdm.js} +66 -48
  93. package/dist/{grantee-Bv04_Vzf.js → grantee-Cv5Sogfv.js} +88 -7
  94. package/dist/graph-sql-B-dsAT6j.d.ts +29 -0
  95. package/dist/{headers-B5RRv3Xm.js → headers-BZSDieNT.js} +1 -1
  96. package/dist/{headers-C8SHQccD.d.ts → headers-Cf-zWvsO.d.ts} +1 -1
  97. package/dist/helpers-H_KARDVC.js +421 -0
  98. package/dist/hono/index.d.ts +6 -28
  99. package/dist/hono/index.js +11 -43
  100. package/dist/{hosted-BwKQ1BTA.js → hosted-DJQw46hn.js} +6 -5
  101. package/dist/{http-GgVApX1k.js → http-BIhmLfCc.js} +4 -20
  102. package/dist/http-SO7qGttf.js +44 -0
  103. package/dist/ids-DC4V4CFu.js +18 -0
  104. package/dist/index-0nNqHspG.d.ts +6 -0
  105. package/dist/{index-xIxJLwOQ.d.ts → index-BNc7Wer_.d.ts} +75 -7
  106. package/dist/{index-CltcQ4Bf.d.ts → index-C7Tw7MaW.d.ts} +68 -5
  107. package/dist/{index-LF_hS-yn.d.ts → index-C8z4RjQV.d.ts} +1 -1
  108. package/dist/index.d.ts +14 -9
  109. package/dist/index.js +22 -17
  110. package/dist/instance-options-Dhhcnm3y.js +22 -0
  111. package/dist/instance-options-jARdwfPN.d.ts +11 -0
  112. package/dist/{parse-DPfIvFMU.js → json-schema-BsAflUGW.js} +28 -57
  113. package/dist/jwt/index.d.ts +10 -6
  114. package/dist/jwt/index.js +32 -13
  115. package/dist/kernel-_RRHmnMY.js +208 -0
  116. package/dist/kysely/index.d.ts +4 -3
  117. package/dist/kysely/index.js +3 -3
  118. package/dist/live-options-H2eG8dfJ.js +60 -0
  119. package/dist/{load-BZ24CpZP.js → load-DhWEB9P1.js} +16 -10
  120. package/dist/load-DwJUafYN.js +2 -0
  121. package/dist/manifest-iaoBXHKc.js +783 -0
  122. package/dist/manifest-uDS9y5de.d.ts +206 -0
  123. package/dist/{map-DowSO96j.js → map-AcxK9o_D.js} +4 -15
  124. package/dist/{map-claims-B_6I1Rn-.js → map-claims-Z4QZOiFF.js} +13 -4
  125. package/dist/map-error-pgUWNNtG.js +23 -0
  126. package/dist/may-use-DndQ5tQ-.js +77 -0
  127. package/dist/mcp/index.d.ts +54 -22
  128. package/dist/mcp/index.js +218 -178
  129. package/dist/nest/index.d.ts +26 -31
  130. package/dist/nest/index.js +75 -84
  131. package/dist/next/client.d.ts +7 -8
  132. package/dist/next/client.js +11 -9
  133. package/dist/next/index.d.ts +30 -47
  134. package/dist/next/index.js +45 -60
  135. package/dist/next/plugin.d.ts +1 -1
  136. package/dist/next/plugin.js +32 -1
  137. package/dist/node/index.d.ts +9 -28
  138. package/dist/node/index.js +11 -43
  139. package/dist/openai/index.d.ts +6 -15
  140. package/dist/openai/index.js +7 -20
  141. package/dist/openapi/index.d.ts +87 -4
  142. package/dist/openapi/index.js +3 -3
  143. package/dist/{openapi-DcqM8nU7.js → openapi-BqRBvAng.js} +237 -5
  144. package/dist/{openapi-DWD0Uc_4.js → openapi-CqqEbHsL.js} +5 -5
  145. package/dist/{openapi-import-BWRUNNeW.js → openapi-import-cmwetbzw.js} +1 -1
  146. package/dist/{openapi-CwePaF7C.js → openapi-l0xYHkcv.js} +3 -3
  147. package/dist/{openapi-schema-D8j_T9tO.js → openapi-schema--ARjyfQr.js} +2 -2
  148. package/dist/orpc/index.d.ts +15 -28
  149. package/dist/orpc/index.js +74 -117
  150. package/dist/otel/index.d.ts +2 -2
  151. package/dist/parse-BuyjxhZV.js +53 -0
  152. package/dist/parse-local-manifest-BrMozJCo.js +36 -0
  153. package/dist/parse-local-manifest-JLnaBH0S.d.ts +10 -0
  154. package/dist/pdp/index.d.ts +2 -2
  155. package/dist/pdp/index.js +14 -127
  156. package/dist/{permdock-yoZ7EjxX.js → permdock-CbgvLnuo.js} +672 -149
  157. package/dist/{permissions-B8vCg_bI.d.ts → permissions-CDgvKG5L.d.ts} +2 -2
  158. package/dist/{permissions-DC7GROPA.js → permissions-DVoF6dMt.js} +77 -15
  159. package/dist/{permissions-B4apnahQ.d.ts → permissions-DttnqqxC.d.ts} +34 -5
  160. package/dist/{permissions-CofRqesP.js → permissions-RJrovw98.js} +3 -3
  161. package/dist/{pins-CqE1jZuF.js → pins-8ILTftC9.js} +2 -2
  162. package/dist/{policy-Cq2fB8Q5.d.ts → policy-D2W7uv19.d.ts} +2 -2
  163. package/dist/{policy-CInmNGkM.d.ts → policy-IB6yxpC3.d.ts} +351 -42
  164. package/dist/{policy-ANp36PnI.js → policy-xyWg7QdR.js} +173 -22
  165. package/dist/powersync-BylawD_U.js +540 -0
  166. package/dist/powersync-DliZK_-y.js +62 -0
  167. package/dist/powersync-e_AZrKbg.js +2 -0
  168. package/dist/prisma/index.d.ts +3 -2
  169. package/dist/prisma/index.js +45 -20
  170. package/dist/{problem-Cgp9-KZA.js → problem-B43ztKIm.js} +74 -109
  171. package/dist/problem-details-DX075l9V.d.ts +7 -0
  172. package/dist/problem-details-_AMOYz-w.js +144 -0
  173. package/dist/{protected-BuPAycJT.d.ts → protected-BdnIEFkY.d.ts} +5 -4
  174. package/dist/protected-utU-SLuy.js +100 -0
  175. package/dist/protected-xAr24FEC.d.ts +40 -0
  176. package/dist/provider-CSQd7m92.js +52 -0
  177. package/dist/{provider-wTAUda2v.d.ts → provider-DZY281jO.d.ts} +1 -1
  178. package/dist/provider-store-Cfbvo4DE.js +43 -0
  179. package/dist/react/index.d.ts +7 -5
  180. package/dist/react/index.js +5 -4
  181. package/dist/react/provider-client.d.ts +1 -1
  182. package/dist/react/provider-client.js +1 -1
  183. package/dist/react-native/index.d.ts +166 -10
  184. package/dist/react-native/index.js +607 -85
  185. package/dist/{refs-ChLSxbST.js → refs-KYb4ntaz.js} +4 -3
  186. package/dist/{relations-r4soIFZB.js → relations-cjOL01hZ.js} +110 -31
  187. package/dist/replay-BsOyTrdV.js +28 -0
  188. package/dist/replay-CYyiLiwO.d.ts +5 -0
  189. package/dist/resource-ref-CaS9yVPi.js +20 -0
  190. package/dist/revocations-Bhr0aMIC.js +27 -0
  191. package/dist/{rls-BOFU3chG.js → rls-B4ur8nKQ.js} +8 -3
  192. package/dist/rls-DQtdgTHB.js +2521 -0
  193. package/dist/rls-fields-74oZPXWL.js +3582 -0
  194. package/dist/{rls-graph-DxQ39PJj.js → rls-graph-CHwx0V8q.js} +100 -36
  195. package/dist/{rls-import-CXV6LBlS.js → rls-import-BTFVk3jH.js} +7 -6
  196. package/dist/{rls-migrate-DrFPbf8p.js → rls-migrate-CN4TlJTO.js} +6 -5
  197. package/dist/rls-ownership-RuFqaqGz.js +843 -0
  198. package/dist/rls-shared-Cewd_-zI.js +495 -0
  199. package/dist/rls-verify-CVQTHTh5.js +746 -0
  200. package/dist/{row-check-BajTgQZ-.d.ts → row-check-Dt35czLy.d.ts} +12 -15
  201. package/dist/row-conditions-h2HythXQ.js +27 -0
  202. package/dist/rpc-DL9Sqvb1.js +89 -0
  203. package/dist/{run-CJ6UvS3a.js → run-DKDbM4Du.js} +31 -12
  204. package/dist/runtime-CB8gQFvS.js +11 -0
  205. package/dist/{saas-BRrZzJkM.js → saas-DhpJjnBA.js} +17 -7
  206. package/dist/{schema-P8yoma__.js → schema-D3MnDMxa.js} +8 -4
  207. package/dist/scim/index.d.ts +1 -1
  208. package/dist/scim/index.js +1 -1
  209. package/dist/{scim-9NFa0XVZ.js → scim-BFGBBAqR.js} +1 -1
  210. package/dist/{scopes-cKVp_WTw.js → scopes-CVdPrWN-.js} +35 -8
  211. package/dist/server/index.d.ts +22 -11
  212. package/dist/server/index.js +11 -8
  213. package/dist/{credentials-BgRX3WEg.js → server-DlZ28Oz5.js} +1 -1
  214. package/dist/shared-DRu8VFVM.js +123 -0
  215. package/dist/{sink-Cfr9-7YC.d.ts → sink-B1fZzIMf.d.ts} +1 -1
  216. package/dist/skills-Biq5uup3.js +192 -0
  217. package/dist/{skills-C_lpV4Jx.js → skills-Bx-U0irG.js} +10 -4
  218. package/dist/{snapshot-DE8dE_hz.js → snapshot-Enxd0n-s.js} +138 -214
  219. package/dist/snapshot-cache-B-LxUahj.d.ts +45 -0
  220. package/dist/snapshot-cache-D6jLelln.js +44 -0
  221. package/dist/solid/index.d.ts +39 -9
  222. package/dist/solid/index.js +76 -85
  223. package/dist/sources-4p0-4xQm.js +545 -0
  224. package/dist/sources-BdOYLw9j.d.ts +192 -0
  225. package/dist/{sql-Bll1d7y0.js → sql-xdg5f4Fi.js} +6 -1
  226. package/dist/{src-CTNT-PBW.js → src-BDwEZWrZ.js} +149 -11
  227. package/dist/ssf/index.d.ts +3 -2
  228. package/dist/ssf/index.js +3 -29
  229. package/dist/store-DMAWwAJV.js +371 -0
  230. package/dist/{store-Bq90395i.d.ts → store-jOBYpiXC.d.ts} +13 -4
  231. package/dist/store-options-ByhZq1jV.js +716 -0
  232. package/dist/{stores-CkG2HrSg.js → stores-BT2pSCub.js} +10 -63
  233. package/dist/{stores-CvOnu_2T.d.ts → stores-C0IMQrGI.d.ts} +20 -9
  234. package/dist/{stream-BhMfZOwr.d.ts → stream-D1RXubw2.d.ts} +2 -2
  235. package/dist/{stream-Q_xlB6Ko.js → stream-DDpvynSB.js} +16 -2
  236. package/dist/subject-settings-BwBmCdTR.js +128 -0
  237. package/dist/supabase/index.d.ts +133 -6
  238. package/dist/supabase/index.js +4 -3
  239. package/dist/supabase/middleware.d.ts +32 -27
  240. package/dist/supabase/middleware.js +56 -22
  241. package/dist/{supabase-D8UlBA7Z.js → supabase-Boqb9a_Y.js} +3 -3
  242. package/dist/{supabase-DTxGtYdi.js → supabase-C0qESOa-.js} +347 -367
  243. package/dist/supabase-config-BpPXt3x1.js +472 -0
  244. package/dist/supabase-hook-6sYLXg_u.js +2 -0
  245. package/dist/{supabase-hook-D_OqGb_V.js → supabase-hook-CSLQ4zJ3.js} +1037 -705
  246. package/dist/supautils-Cn4R4cJ4.js +91 -0
  247. package/dist/svelte/PermissionBoundary.svelte +37 -0
  248. package/dist/svelte/Protected.svelte +8 -2
  249. package/dist/svelte/index.d.ts +9 -6
  250. package/dist/svelte/index.js +61 -7
  251. package/dist/svelte/runtime.d.ts +4 -3
  252. package/dist/svelte/runtime.js +4 -3
  253. package/dist/svelte/source.d.ts +9 -6
  254. package/dist/svelte/source.js +7 -4
  255. package/dist/terminal/index.d.ts +6 -14
  256. package/dist/terminal/index.js +44 -32
  257. package/dist/testing/index.d.ts +105 -16
  258. package/dist/testing/index.js +504 -40
  259. package/dist/testing/saas/index.d.ts +4 -4
  260. package/dist/testing/saas/index.js +2 -2
  261. package/dist/testing/saas/permissions.d.ts +1 -1
  262. package/dist/testing/saas/permissions.js +1 -1
  263. package/dist/token-CIWxJOCh.js +50 -0
  264. package/dist/trpc/index.d.ts +7 -26
  265. package/dist/trpc/index.js +17 -100
  266. package/dist/types-BnIEz1sU.d.ts +48 -0
  267. package/dist/{types-CxquUByI.d.ts → types-Bvc4oWT6.d.ts} +1 -1
  268. package/dist/{sources-DOpW5Ila.d.ts → types-C97IskBw.d.ts} +86 -127
  269. package/dist/types-CKNSyIf_.d.ts +52 -0
  270. package/dist/types-Cq_H8N_X.d.ts +197 -0
  271. package/dist/{types-D6Z6-rKJ.d.ts → types-DbjRN55U.d.ts} +273 -22
  272. package/dist/{types-BBK-exvJ.d.ts → types-Dnemwd77.d.ts} +7 -1
  273. package/dist/{types-BvBk1wgn.d.ts → types-DxiCGmmd.d.ts} +5 -3
  274. package/dist/{types-B9dmiiab.d.ts → types-QCuYJh4q.d.ts} +1 -1
  275. package/dist/{types-B8w5PFtS.d.ts → types-aqOHTHcp.d.ts} +17 -1
  276. package/dist/unplugin/index.d.ts +1 -1
  277. package/dist/unplugin/index.js +10 -9
  278. package/dist/usage-DorAJiU_.js +2 -0
  279. package/dist/{usage-1ozMubLY.js → usage-GTixvDDU.js} +2 -2
  280. package/dist/{usage-CUnK6Ou9.js → usage-ItS7nLcl.js} +225 -62
  281. package/dist/validation-error-Ba264OaJ.d.ts +26 -0
  282. package/dist/validation-error-CnjZ4t92.js +33 -0
  283. package/dist/{validity-D0uRmJKJ.js → validity-uOp8UpYn.js} +57 -36
  284. package/dist/{verifier-B90agnhl.js → verifier-BxBo6I44.js} +10 -5
  285. package/dist/version-BvacVTZR.js +17 -0
  286. package/dist/views-Soe7bGSC.js +95 -0
  287. package/dist/{vocabulary-Dk0fs-Jk.d.ts → vocabulary-DA8a8zif.d.ts} +1 -1
  288. package/dist/vue/index.d.ts +35 -13
  289. package/dist/vue/index.js +86 -93
  290. package/dist/watch-BwxLTYMZ.js +2 -0
  291. package/dist/watch-DVBJ9cBq.js +128 -0
  292. package/dist/webmcp/index.d.ts +2 -2
  293. package/dist/webmcp/index.js +7 -13
  294. package/package.json +62 -36
  295. package/schemas/approval-request-v1.json +175 -0
  296. package/schemas/catalog-v1.json +29 -1
  297. package/schemas/supabase-claims-v1.json +6 -1
  298. package/schemas/supabase-manifest-v1.json +150 -6
  299. package/skills/permdock/SKILL.md +7 -7
  300. package/skills/permdock-agents/SKILL.md +5 -5
  301. package/skills/permdock-agents/references/runtimes.md +12 -10
  302. package/skills/permdock-approvals/SKILL.md +4 -4
  303. package/skills/permdock-approvals/references/stores-and-resume.md +15 -4
  304. package/skills/permdock-audit/SKILL.md +3 -3
  305. package/skills/permdock-credentials/SKILL.md +4 -4
  306. package/skills/permdock-credentials/references/tokens-keys-links.md +7 -2
  307. package/skills/permdock-data/SKILL.md +4 -4
  308. package/skills/permdock-data/references/queries-and-rls.md +14 -6
  309. package/skills/permdock-data/references/relationships.md +5 -3
  310. package/skills/permdock-tenancy/SKILL.md +9 -6
  311. package/skills/permdock-tenancy/references/ownership-and-custom-roles.md +14 -8
  312. package/skills/permdock-wire/SKILL.md +4 -4
  313. package/skills/permdock-wire/references/adapters.md +42 -30
  314. package/skills/permdock-wire/references/policy-options.md +5 -3
  315. package/dist/approvers-aH0PJkmf.js +0 -20
  316. package/dist/catalog-idsHc0vo.js +0 -2
  317. package/dist/collect-B7_TIfmg.js +0 -49
  318. package/dist/collect-fRPAQIWb.js +0 -2
  319. package/dist/compile-CQbvyIBr.d.ts +0 -30
  320. package/dist/config-BPYmjTOp.js +0 -26
  321. package/dist/context-gtAwAILx.js +0 -6
  322. package/dist/create-BKF3dgFk.d.ts +0 -162
  323. package/dist/create-CSkhDU9T.js +0 -222
  324. package/dist/doctor-BGle8Gqi.js +0 -1314
  325. package/dist/helpers-DnSOrhB9.js +0 -682
  326. package/dist/index-fG6NSXlc.d.ts +0 -9
  327. package/dist/kernel-YOGCWNLf.js +0 -211
  328. package/dist/load-QOOm1z70.js +0 -2
  329. package/dist/manifest-DDQbC6K0.d.ts +0 -118
  330. package/dist/map-error-RJ3ZsUyA.js +0 -16
  331. package/dist/may-use-CnFEjVEp.js +0 -37
  332. package/dist/pg-4GJWDUxG.js +0 -953
  333. package/dist/plugin-4gr7IxFJ.js +0 -65
  334. package/dist/protected-B4K3BKoX.js +0 -138
  335. package/dist/protected-wY7nXhY9.d.ts +0 -23
  336. package/dist/provider-_wx46HpB.js +0 -48
  337. package/dist/rls-CJVja9Ww.js +0 -2119
  338. package/dist/rls-helpers-BxRuif0l.js +0 -1346
  339. package/dist/runtime-DP9ttFh1.js +0 -27
  340. package/dist/skills-Dx3QLnMY.js +0 -110
  341. package/dist/source-DoBBYJi2.js +0 -6
  342. package/dist/sources-DVHM3Mwq.js +0 -284
  343. package/dist/store-C6hFW6ta.js +0 -508
  344. package/dist/subject-settings-xt7V845g.js +0 -82
  345. package/dist/supabase-hook-DW-xP4hU.js +0 -2
  346. package/dist/types-DbWdEfcm.d.ts +0 -87
  347. package/dist/types-bva3i4Gf.d.ts +0 -98
  348. package/dist/types-i4BAOvdb.d.ts +0 -97
  349. package/dist/usage-PyEor6GA.js +0 -2
  350. package/dist/version-CnSh33Fj.js +0 -16
@@ -1,6 +1,7 @@
1
- import { _r as Condition, hr as Subject, tn as WhereResult } from "../policy-CInmNGkM.js";
2
- import { n as WithSubjectOptions, r as RelationsMapping, t as RowCheck } from "../row-check-BajTgQZ-.js";
3
- import { t as MembershipsMapping } from "../compile-CQbvyIBr.js";
1
+ import { Ir as Condition, Pr as Subject, mn as WhereResult } from "../policy-IB6yxpC3.js";
2
+ import { r as RelationsMapping } from "../graph-sql-B-dsAT6j.js";
3
+ import { s as MembershipsMapping } from "../compile-BkRyBDBw.js";
4
+ import { n as WithSubjectOptions, t as RowCheck } from "../row-check-Dt35czLy.js";
4
5
  import { SQL, Table } from "drizzle-orm";
5
6
  //#region src/drizzle/types.d.ts
6
7
  /** A column of the Drizzle table `T` or an `SQL` expression; anything for a structural stand-in. */
@@ -1,7 +1,7 @@
1
1
  import { t as compact } from "../compact-y6vfu2_f.js";
2
- import { x as assertSafeKey } from "../permissions-DC7GROPA.js";
3
- import { n as escapeLike, t as compileWhere } from "../compile-D22iwvuV.js";
4
- import { i as rowCheckFrom, r as subjectStatements, t as statementTemplate } from "../subject-settings-xt7V845g.js";
2
+ import { w as assertSafeKey } from "../permissions-DVoF6dMt.js";
3
+ import { n as escapeLike, t as compileWhere } from "../compile-Ba4blROR.js";
4
+ import { i as rowCheckFrom, r as subjectStatements, t as statementTemplate } from "../subject-settings-BwBmCdTR.js";
5
5
  //#region src/drizzle/to-where.ts
6
6
  function loadOperators(injected) {
7
7
  if (injected !== void 0) return injected;
@@ -1,10 +1,8 @@
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, xt as SnapshotSource } from "../policy-CInmNGkM.js";
2
- import { d as Permission } from "../permissions-B4apnahQ.js";
3
- import { f as ApprovalStore } from "../types-B8w5PFtS.js";
1
+ import { C as Policy, D as PolicyVocabulary, Nr as Principal, ln as PermDock } from "../policy-IB6yxpC3.js";
2
+ import { f as Permission } from "../permissions-DttnqqxC.js";
4
3
  import { n as RevocationFeed } from "../revocations-Cy06JNx2.js";
5
- import { o as OtelWrap } from "../types-B9dmiiab.js";
6
- import { r as PdpFactory } from "../types-BvBk1wgn.js";
7
- import { S as ConnectionOptions, b as Connection, g as discoverViaSignatureAgent, h as WebBotAuthVerifier, n as OpenApiHooks, o as TenantOption, r as ProtectOptions, u as InvalidSignatureError, y as verifyWebBotAuth } from "../create-BKF3dgFk.js";
4
+ import { A as ConnectionOptions, O as Connection, h as InvalidSignatureError, i as ProtectOptions, n as OpenApiHooks, w as verifyWebBotAuth, x as discoverViaSignatureAgent } from "../create-B1d519XK.js";
5
+ import { t as ServerAdapterOptions } from "../bind-C_ob3LKa.js";
8
6
  import { Elysia } from "elysia";
9
7
  //#region src/elysia/create.d.ts
10
8
  type ElysiaCtx = {
@@ -12,27 +10,7 @@ type ElysiaCtx = {
12
10
  readonly body?: unknown;
13
11
  readonly params?: Readonly<Record<string, string | undefined>>;
14
12
  };
15
- type ElysiaPermDockOptions<TUser = unknown> = {
16
- readonly subject: (ctx: ElysiaCtx) => TUser | Promise<TUser>;
17
- readonly tenant?: TenantOption<ElysiaCtx>;
18
- readonly memberships?: MembershipSource | readonly MembershipSource[];
19
- /** The object graph for relation grants that walk a parent chain; without it they deny. */
20
- readonly relations?: RelationSource;
21
- readonly entitlements?: EntitlementSource;
22
- readonly customRoles?: RoleSource;
23
- /** Hosted grants, read once per instance; see `PolicySource`. */
24
- readonly policies?: PolicySource;
25
- readonly store?: ApprovalStore;
26
- readonly sink?: DecisionSink;
27
- readonly limits?: LimitStore;
28
- /** `createPermDock` from `permdock/pdp`; `protect` then decides delegated permissions remotely. */
29
- readonly pdp?: PdpFactory;
30
- /** Accepted for adapter parity; not read by this adapter. */
31
- readonly snapshots?: SnapshotSource;
32
- /** `(permdock) => withOtel(permdock, options)` from `permdock/otel`. */
33
- readonly otel?: OtelWrap;
34
- /** `(request) => verifyWebBotAuth(request, options)`; a verified bot becomes the actor. */
35
- readonly webBotAuth?: WebBotAuthVerifier;
13
+ type ElysiaPermDockOptions<TUser = unknown> = ServerAdapterOptions<ElysiaCtx, TUser> & {
36
14
  /** Ends or revalidates open sockets. */
37
15
  readonly revocations?: RevocationFeed;
38
16
  };
@@ -45,7 +23,7 @@ type ElysiaContext<V extends PolicyVocabulary = PolicyVocabulary> = ElysiaCtx &
45
23
  permdock: PermDock<V>;
46
24
  permdockData?: unknown;
47
25
  };
48
- type ElysiaProtect = (permission: Permission, loadData?: (ctx: ElysiaCtx) => unknown, protectOptions?: ProtectOptions) => (ctx: ElysiaCtx) => Promise<Response | undefined>;
26
+ type ElysiaProtect = (permission: Permission | null, loadData?: (ctx: ElysiaCtx) => unknown, protectOptions?: ProtectOptions) => (ctx: ElysiaCtx) => Promise<Response | undefined>;
49
27
  /** The `permdock()` plugin: its global derive types `permdock` in every later handler. */
50
28
  type ElysiaPermDockPlugin<V extends PolicyVocabulary = PolicyVocabulary> = Elysia<"", {
51
29
  decorator: Record<never, never>;
@@ -1,47 +1,13 @@
1
- import { t as compact } from "../compact-y6vfu2_f.js";
2
- import { i as discoverViaSignatureAgent, r as InvalidSignatureError, s as verifyWebBotAuth } from "../evaluations-DsAU9ppl.js";
3
- import { r as tenantScope, t as createKernel } from "../create-CSkhDU9T.js";
4
- import { t as problemFromError } from "../map-error-RJ3ZsUyA.js";
5
- import { i as onRevoked, t as POLICY_VIOLATION } from "../stream-Q_xlB6Ko.js";
1
+ import { i as parsedBody, n as hasCredentials } from "../http-SO7qGttf.js";
2
+ import { i as discoverViaSignatureAgent, r as InvalidSignatureError, s as verifyWebBotAuth } from "../evaluations-tz6D9A2G.js";
3
+ import { t as problemFromError } from "../map-error-pgUWNNtG.js";
4
+ import { a as socketConnection, i as decorate, r as bindKernel } from "../bind-CuzGytRf.js";
5
+ import { i as onRevoked, t as POLICY_VIOLATION } from "../stream-DDpvynSB.js";
6
6
  import { Elysia } from "elysia";
7
7
  //#region src/elysia/create.ts
8
8
  function createPermDock(policy, options) {
9
- const contexts = /* @__PURE__ */ new WeakMap();
10
- const bound = /* @__PURE__ */ new WeakMap();
11
9
  const seed = globalThis.crypto.randomUUID();
12
- const kernel = createKernel(policy, compact({
13
- subject: (request) => {
14
- const ctx = contexts.get(request);
15
- return ctx === void 0 ? null : options.subject(ctx);
16
- },
17
- memberships: options.memberships,
18
- relations: options.relations,
19
- entitlements: options.entitlements,
20
- customRoles: options.customRoles,
21
- policies: options.policies,
22
- store: options.store,
23
- sink: options.sink,
24
- limits: options.limits,
25
- pdp: options.pdp,
26
- webBotAuth: options.webBotAuth,
27
- revocations: options.revocations,
28
- adapter: "elysia",
29
- wrap: options.otel
30
- }));
31
- const bind = (ctx) => {
32
- const hit = bound.get(ctx);
33
- if (hit !== void 0) return hit;
34
- const next = toRequest(ctx);
35
- bound.set(ctx, next);
36
- contexts.set(next, ctx);
37
- return next;
38
- };
39
- const scopeOf = (ctx) => tenantScope(options.tenant, ctx);
40
- const decorate = (ctx, instance, data) => {
41
- const scoped = ctx;
42
- scoped.permdock = instance;
43
- if (data !== void 0) scoped.permdockData = data;
44
- };
10
+ const { kernel, bind, scopeOf, handlerScope } = bindKernel(policy, options, "elysia", toRequest);
45
11
  const permdock = () => new Elysia({
46
12
  name: "permdock",
47
13
  seed
@@ -49,31 +15,22 @@ function createPermDock(policy, options) {
49
15
  const instance = await kernel.permdock(bind(ctx), await scopeOf(ctx));
50
16
  decorate(ctx, instance);
51
17
  return { permdock: instance };
52
- }).onError({ as: "global" }, ({ error }) => problemFromError(error));
18
+ }).onError({ as: "global" }, ({ error, request }) => problemFromError(error, { credentials: hasCredentials(request) }));
53
19
  const protect = (permission, loadData, protectOptions) => async (ctx) => {
54
20
  const guard = await kernel.protect(permission, loadData === void 0 ? void 0 : () => loadData(ctx), protectOptions)(bind(ctx), await scopeOf(ctx));
55
21
  if (!guard.ok) return guard.response;
56
22
  decorate(ctx, guard.permdock, guard.data);
57
23
  };
58
24
  const sockets = /* @__PURE__ */ new WeakMap();
59
- const connection = (ws, connectionOptions) => {
60
- const hit = sockets.get(ws.data);
61
- if (hit !== void 0) return hit;
62
- const opened = (async () => {
63
- const conn = await kernel.connection(bind(ws.data), connectionOptions, await scopeOf(ws.data));
64
- onRevoked(conn, (problem) => {
65
- ws.close(POLICY_VIOLATION, problem.type);
66
- });
67
- return conn;
68
- })();
69
- sockets.set(ws.data, opened);
70
- return opened;
71
- };
72
- const permdockHandler = () => {
73
- const { POST, GET } = kernel.permdockHandler((request) => {
74
- const ctx = contexts.get(request);
75
- return ctx === void 0 ? { tenant: void 0 } : scopeOf(ctx);
25
+ const connection = (ws, connectionOptions) => socketConnection(sockets, ws.data, async () => {
26
+ const conn = await kernel.connection(bind(ws.data), connectionOptions, await scopeOf(ws.data));
27
+ onRevoked(conn, (problem) => {
28
+ ws.close(POLICY_VIOLATION, problem.type);
76
29
  });
30
+ return conn;
31
+ });
32
+ const permdockHandler = () => {
33
+ const { POST, GET } = kernel.permdockHandler(handlerScope);
77
34
  return new Elysia({
78
35
  name: "permdock-handler",
79
36
  seed
@@ -91,8 +48,7 @@ function toRequest(ctx) {
91
48
  const method = ctx.request.method;
92
49
  if (method === "GET" || method === "HEAD" || ctx.body === void 0) return ctx.request;
93
50
  const headers = new Headers(ctx.request.headers);
94
- const body = typeof ctx.body === "string" ? ctx.body : JSON.stringify(ctx.body);
95
- if (!headers.has("content-type")) headers.set("content-type", "application/json");
51
+ const body = parsedBody(ctx.body, headers) ?? null;
96
52
  return new Request(ctx.request.url, {
97
53
  method,
98
54
  headers,
@@ -10,8 +10,12 @@ var CliError = class extends Error {
10
10
  };
11
11
  const TITLES = {
12
12
  usage: "Usage or configuration error",
13
- unavailable: "A database or service the command needs did not answer"
13
+ unavailable: "A database or service the command needs did not answer",
14
+ failed: "The check the command ran found a problem"
14
15
  };
16
+ function describeError(error) {
17
+ return error instanceof Error ? error.message : String(error);
18
+ }
15
19
  /** An unclassified error is a usage error: a module that throws while loading is the project's to fix. */
16
20
  function cliErrorKind(error) {
17
21
  return error instanceof CliError ? error.kind : "usage";
@@ -21,7 +25,7 @@ function exitCodeOf(kind) {
21
25
  }
22
26
  function cliProblem(kind, message, command) {
23
27
  return {
24
- type: `https://permdock.dev/problems/cli-${kind}`,
28
+ type: `https://permdock.com/problems/cli-${kind}`,
25
29
  title: TITLES[kind],
26
30
  detail: stripVTControlCharacters(message),
27
31
  ...command === void 0 ? {} : { command },
@@ -36,8 +40,8 @@ function usageResult(error) {
36
40
  if (error instanceof CliError) throw error;
37
41
  return {
38
42
  code: 2,
39
- output: error instanceof Error ? error.message : String(error)
43
+ output: describeError(error)
40
44
  };
41
45
  }
42
46
  //#endregion
43
- export { usageResult as a, exitCodeOf as i, cliErrorKind as n, cliProblem as r, CliError as t };
47
+ export { exitCodeOf as a, describeError as i, cliErrorKind as n, usageResult as o, cliProblem as r, CliError as t };
@@ -1,32 +1,8 @@
1
1
  import { t as compact } from "./compact-y6vfu2_f.js";
2
+ import { t as PROBLEM_BASE } from "./validation-error-CnjZ4t92.js";
3
+ import { a as wireDenials, n as problemDetails } from "./problem-details-_AMOYz-w.js";
2
4
  import { n as deniedDigest, t as approvalDigest } from "./digest-BI-6aa6d.js";
3
- //#region src/core/wire-denial.ts
4
- const IN_PROCESS = /* @__PURE__ */ new Set(["closure-error", "validation"]);
5
- function jsonDetail(value) {
6
- if (value === void 0 || value === null || value instanceof Error) return;
7
- if (typeof value === "string" || typeof value === "boolean") return value;
8
- if (typeof value === "number") return Number.isFinite(value) ? value : void 0;
9
- if (typeof value !== "object") return;
10
- try {
11
- return JSON.parse(JSON.stringify(value));
12
- } catch {
13
- return;
14
- }
15
- }
16
- function wireDenial(denial) {
17
- return compact({
18
- role: denial.role,
19
- reason: denial.reason,
20
- to: denial.to,
21
- detail: IN_PROCESS.has(denial.reason) ? void 0 : jsonDetail(denial.detail)
22
- });
23
- }
24
- function wireDenials(denials) {
25
- return denials.map(wireDenial);
26
- }
27
- //#endregion
28
5
  //#region src/core/errors.ts
29
- const PROBLEM_BASE = "https://permdock.dev/problems";
30
6
  var PermDockDeniedError = class extends Error {
31
7
  name = "PermDockDeniedError";
32
8
  decision;
@@ -34,6 +10,8 @@ var PermDockDeniedError = class extends Error {
34
10
  scope;
35
11
  resource;
36
12
  subject;
13
+ /** The resource's `disclosure` when the denied check carried a row; `'hide'` answers as `404`. */
14
+ disclosure;
37
15
  /** `PERMDOCK_DENIED;<permission>`; survives the Server Component boundary (`parsePermDockDigest`). */
38
16
  digest;
39
17
  constructor(input) {
@@ -43,21 +21,20 @@ var PermDockDeniedError = class extends Error {
43
21
  this.scope = input.scope;
44
22
  this.resource = input.resource;
45
23
  this.subject = input.subject;
24
+ if (input.disclosure !== void 0) this.disclosure = input.disclosure;
46
25
  this.digest = deniedDigest(input.permission);
47
26
  }
27
+ /** The same status matrix as `protect`: `401`, `404`, `429`, `503` or `403`. */
48
28
  toProblemDetails(options) {
49
- return compact({
50
- type: `${PROBLEM_BASE}/denied`,
51
- title: "Permission denied",
52
- status: 403,
29
+ return problemDetails(compact({
30
+ decision: this.decision,
53
31
  detail: this.message,
54
32
  instance: options?.instance,
55
33
  permission: this.permission,
56
34
  scope: this.scope,
57
35
  resource: this.resource,
58
- denials: wireDenials(this.decision.denials),
59
- alternatives: this.decision.alternatives.map((leaf) => leaf.key)
60
- });
36
+ disclosure: options?.disclosure ?? this.disclosure
37
+ }));
61
38
  }
62
39
  };
63
40
  var PermDockApprovalRequiredError = class extends Error {
@@ -81,45 +58,14 @@ var PermDockApprovalRequiredError = class extends Error {
81
58
  this.digest = approvalDigest(input.permission, input.decision.token);
82
59
  }
83
60
  toProblemDetails(options) {
84
- return compact({
85
- type: `${PROBLEM_BASE}/approval-required`,
86
- title: "Approval required",
87
- status: 403,
61
+ return problemDetails(compact({
62
+ decision: this.decision,
88
63
  detail: this.message,
89
64
  instance: options?.instance,
90
65
  permission: this.permission,
91
66
  scope: this.scope,
92
- resource: this.resource,
93
- reason: this.reason,
94
- token: this.token
95
- });
96
- }
97
- };
98
- var PermDockValidationError = class extends Error {
99
- name = "PermDockValidationError";
100
- code;
101
- permission;
102
- resource;
103
- issues;
104
- boundary;
105
- constructor(input) {
106
- super(input.message);
107
- this.code = input.code;
108
- this.permission = input.permission;
109
- this.resource = input.resource;
110
- this.issues = input.issues ?? [];
111
- this.boundary = input.boundary;
112
- }
113
- toProblemDetails(options) {
114
- return compact({
115
- type: `${PROBLEM_BASE}/validation`,
116
- title: "Invalid resource data",
117
- status: 400,
118
- detail: this.message,
119
- instance: options?.instance,
120
- permission: this.permission,
121
- issues: this.issues
122
- });
67
+ resource: this.resource
68
+ }));
123
69
  }
124
70
  };
125
71
  /** The `name` of the deny grant a `deny` denial carries in `detail`, if any. */
@@ -127,13 +73,13 @@ function denyName(detail) {
127
73
  if (detail === null || typeof detail !== "object" || !("name" in detail)) return;
128
74
  return typeof detail.name === "string" ? detail.name : void 0;
129
75
  }
130
- function deniedMessage(permission, subjectId, denials, alternatives) {
76
+ function deniedMessage(permission, subjectId, denials, alternatives, named = true) {
131
77
  const clauses = denials.map((denial) => {
132
78
  const name = denial.reason === "deny" ? denyName(denial.detail) : void 0;
133
79
  return name === void 0 ? `${denial.role ?? "none"} (${denial.reason})` : `${denial.role ?? "none"} (${denial.reason} '${name}')`;
134
80
  }).join(", ");
135
81
  const alt = alternatives.length === 0 ? "" : ` Alternatives: ${alternatives.join(", ")}.`;
136
- return `${permission} denied for subject ${subjectId ?? "anonymous"}: ${clauses}.${alt}`;
82
+ return `${permission} denied${named ? ` for subject ${subjectId ?? "anonymous"}` : ""}: ${clauses}.${alt}`;
137
83
  }
138
84
  function approvalMessage(permission, reason, token) {
139
85
  return `${permission} requires human approval (${reason}). Token: ${token}.`;
@@ -174,4 +120,4 @@ var PermDockRevokedError = class extends Error {
174
120
  }
175
121
  };
176
122
  //#endregion
177
- export { approvalMessage as a, PermDockValidationError as i, PermDockDeniedError as n, deniedMessage as o, PermDockRevokedError as r, wireDenials as s, PermDockApprovalRequiredError as t };
123
+ export { deniedMessage as a, approvalMessage as i, PermDockDeniedError as n, PermDockRevokedError as r, PermDockApprovalRequiredError as t };
@@ -1,4 +1,5 @@
1
- import { Mn as Decision, Pt as WireDenial, hr as Subject } from "./policy-CInmNGkM.js";
1
+ import { Gt as WireDenial, Pr as Subject, Yn as Decision } from "./policy-IB6yxpC3.js";
2
+ import { t as Disclosure } from "./problem-details-DX075l9V.js";
2
3
  import { StandardSchemaV1 } from "@standard-schema/spec";
3
4
  //#region src/core/errors.d.ts
4
5
  /** Where and how a human approves; carries no secret. */
@@ -42,6 +43,8 @@ declare class PermDockDeniedError extends Error {
42
43
  readonly id?: string;
43
44
  };
44
45
  readonly subject: Subject;
46
+ /** The resource's `disclosure` when the denied check carried a row; `'hide'` answers as `404`. */
47
+ readonly disclosure?: Disclosure;
45
48
  /** `PERMDOCK_DENIED;<permission>`; survives the Server Component boundary (`parsePermDockDigest`). */
46
49
  readonly digest: string;
47
50
  constructor(input: {
@@ -56,9 +59,12 @@ declare class PermDockDeniedError extends Error {
56
59
  };
57
60
  readonly subject: Subject;
58
61
  readonly message: string;
62
+ readonly disclosure?: Disclosure;
59
63
  });
64
+ /** The same status matrix as `protect`: `401`, `404`, `429`, `503` or `403`. */
60
65
  toProblemDetails(options?: {
61
66
  readonly instance?: string;
67
+ readonly disclosure?: Disclosure;
62
68
  }): ProblemDetails;
63
69
  }
64
70
  declare class PermDockApprovalRequiredError extends Error {
@@ -92,25 +98,6 @@ declare class PermDockApprovalRequiredError extends Error {
92
98
  readonly instance?: string;
93
99
  }): ProblemDetails;
94
100
  }
95
- declare class PermDockValidationError extends Error {
96
- override readonly name: "PermDockValidationError";
97
- readonly code: "invalid-data" | "async-schema" | "no-schema" | "non-portable-condition";
98
- readonly permission: string;
99
- readonly resource: string;
100
- readonly issues: readonly StandardSchemaV1.Issue[];
101
- readonly boundary: string;
102
- constructor(input: {
103
- readonly code: "invalid-data" | "async-schema" | "no-schema" | "non-portable-condition";
104
- readonly permission: string;
105
- readonly resource: string;
106
- readonly issues?: readonly StandardSchemaV1.Issue[];
107
- readonly boundary: string;
108
- readonly message: string;
109
- });
110
- toProblemDetails(options?: {
111
- readonly instance?: string;
112
- }): ProblemDetails;
113
- }
114
101
  type RevokedCode = "session-revoked" | "expired" | "denied" | "subject-changed";
115
102
  /**
116
103
  * The `reason` of a long-lived connection's aborted `signal`. `denied` carries
@@ -135,4 +122,4 @@ declare class PermDockRevokedError extends Error {
135
122
  }): ProblemDetails;
136
123
  }
137
124
  //#endregion
138
- export { PermDockValidationError as a, PermDockRevokedError as i, PermDockApprovalRequiredError as n, ProblemDetails as o, PermDockDeniedError as r, RevokedCode as s, ApprovalHint as t };
125
+ export { ProblemDetails as a, PermDockRevokedError as i, PermDockApprovalRequiredError as n, RevokedCode as o, PermDockDeniedError as r, ApprovalHint as t };
@@ -17,6 +17,9 @@ const CODES = /* @__PURE__ */ new Set([
17
17
  "approver-not-eligible",
18
18
  "approver-repeated"
19
19
  ]);
20
+ function isApprovalErrorCode(value) {
21
+ return typeof value === "string" && CODES.has(value);
22
+ }
20
23
  /** Matches by `name` and `code`, so an error from another copy of the module still maps. */
21
24
  function isApprovalError(value) {
22
25
  if (!(value instanceof Error) || value.name !== "ApprovalError") return false;
@@ -24,4 +27,4 @@ function isApprovalError(value) {
24
27
  return typeof code === "string" && CODES.has(code);
25
28
  }
26
29
  //#endregion
27
- export { isApprovalError as n, ApprovalError as t };
30
+ export { isApprovalError as n, isApprovalErrorCode as r, ApprovalError as t };
@@ -0,0 +1,40 @@
1
+ import { _ as listPermissions, a as formerKeys, o as formerScopes } from "./permissions-DVoF6dMt.js";
2
+ //#region src/server/evaluation-items.ts
3
+ function firstWins(map, name, leaf) {
4
+ if (!map.has(name)) map.set(name, leaf);
5
+ }
6
+ /**
7
+ * Indexes `tree` once. The lookup tries `action` as a permission key or
8
+ * scope, then `<resource.type>.<action>`, then the leaf with that resource
9
+ * and action; current names win over former ones and earlier leaves over
10
+ * later ones. Anything else is `undefined`, which the caller denies.
11
+ */
12
+ function permissionLookup(tree) {
13
+ const current = /* @__PURE__ */ new Map();
14
+ const former = /* @__PURE__ */ new Map();
15
+ const byPair = /* @__PURE__ */ new Map();
16
+ for (const leaf of listPermissions(tree)) {
17
+ firstWins(current, leaf.key, leaf);
18
+ firstWins(current, leaf.scope, leaf);
19
+ for (const name of [...formerKeys(leaf), ...formerScopes(leaf)]) firstWins(former, name, leaf);
20
+ firstWins(byPair, `${leaf.resource}\u0000${leaf.action}`, leaf);
21
+ }
22
+ const named = (name) => current.get(name) ?? former.get(name);
23
+ return (action, resource) => {
24
+ if (action === void 0) return;
25
+ const byKey = named(action);
26
+ if (byKey !== void 0) return byKey;
27
+ const type = typeof resource?.type === "string" ? resource.type : void 0;
28
+ if (type === void 0) return;
29
+ return named(`${type}.${action}`) ?? byPair.get(`${type}\u0000${action}`);
30
+ };
31
+ }
32
+ /** The row an item's resource describes: its `properties`, else `{ id }`. */
33
+ function itemResourceData(resource) {
34
+ const properties = resource?.properties;
35
+ if (properties !== null && typeof properties === "object") return properties;
36
+ const id = resource?.id;
37
+ if (typeof id === "string" || typeof id === "number") return { id: String(id) };
38
+ }
39
+ //#endregion
40
+ export { permissionLookup as n, itemResourceData as t };
@@ -1,9 +1,22 @@
1
1
  import { t as compact } from "./compact-y6vfu2_f.js";
2
- import { g as listPermissions, i as findPermission } from "./permissions-DC7GROPA.js";
3
- import { s as wireDenials } from "./errors-Iy71s7Oj.js";
4
- import { i as readApprovalHeader, s as resumeDecision } from "./helpers-DnSOrhB9.js";
2
+ import { t as PROBLEM_BASE } from "./validation-error-CnjZ4t92.js";
3
+ import { a as wireDenials } from "./problem-details-_AMOYz-w.js";
4
+ import { n as resourceRef } from "./resource-ref-CaS9yVPi.js";
5
+ import { s as problemResponse, t as batchTooLarge, u as validationProblem } from "./problem-B43ztKIm.js";
6
+ import { i as readApprovalHeader, s as resumeDecision } from "./helpers-H_KARDVC.js";
5
7
  import { t as timeoutSignal } from "./timeout-D51niuQP.js";
6
- import { l as validationProblem, n as batchTooLarge, o as problemResponse, t as PROBLEM_BASE } from "./problem-Cgp9-KZA.js";
8
+ import { n as permissionLookup, t as itemResourceData } from "./evaluation-items-CfCCejQd.js";
9
+ //#region src/core/decision.ts
10
+ /** The denial for a check that failed or named no declared permission. */
11
+ const NO_GRANT = Object.freeze({
12
+ outcome: "denied",
13
+ denials: Object.freeze([Object.freeze({
14
+ role: null,
15
+ reason: "no-grant"
16
+ })]),
17
+ alternatives: Object.freeze([])
18
+ });
19
+ //#endregion
7
20
  //#region src/server/web-bot-auth.ts
8
21
  /** Milliseconds a key directory fetch may take before the signature counts as unverifiable. */
9
22
  const DIRECTORY_TIMEOUT_MS = 5e3;
@@ -316,39 +329,8 @@ function decodeSfBytes(value) {
316
329
  }
317
330
  //#endregion
318
331
  //#region src/server/evaluations.ts
319
- const DENIED = {
320
- outcome: "denied",
321
- denials: [{
322
- role: null,
323
- reason: "no-grant"
324
- }],
325
- alternatives: []
326
- };
327
- function permissionOf(tree, item) {
328
- const action = typeof item.action?.name === "string" ? item.action.name : void 0;
329
- if (action === void 0) return;
330
- const byKey = findPermission(tree, action);
331
- if (byKey !== void 0) return byKey;
332
- const resource = typeof item.resource?.type === "string" ? item.resource.type : void 0;
333
- if (resource === void 0) return;
334
- const dotted = findPermission(tree, `${resource}.${action}`);
335
- if (dotted !== void 0) return dotted;
336
- return listPermissions(tree).find((leaf) => leaf.resource === resource && leaf.action === action);
337
- }
338
- function resourceData(item) {
339
- const properties = item.resource?.properties;
340
- if (properties !== null && typeof properties === "object") return properties;
341
- const id = item.resource?.id;
342
- if (typeof id === "string" || typeof id === "number") return { id: String(id) };
343
- }
344
- function resourceRef(permission, item, data) {
345
- const fromRow = data !== null && typeof data === "object" && "id" in data ? data.id : void 0;
346
- const fromWire = item.resource?.id;
347
- const id = typeof fromRow === "string" || typeof fromRow === "number" ? String(fromRow) : typeof fromWire === "string" || typeof fromWire === "number" ? String(fromWire) : void 0;
348
- return compact({
349
- type: permission.resource,
350
- id
351
- });
332
+ function permissionOf(lookup, item) {
333
+ return lookup(typeof item.action?.name === "string" ? item.action.name : void 0, item.resource);
352
334
  }
353
335
  function evaluationRow(decision) {
354
336
  switch (decision.outcome) {
@@ -387,13 +369,13 @@ function applyApprovalResume(decision, permission, permdock, store, request, res
387
369
  store,
388
370
  resource,
389
371
  adapter,
390
- token: readApprovalHeader(request.headers)
372
+ token: request === void 0 ? void 0 : readApprovalHeader(request.headers)
391
373
  });
392
374
  }
393
- function evaluateOne(policy, permdock, item, store, header, adapter) {
394
- const permission = permissionOf(policy.permissions, item);
395
- if (permission === void 0) return Promise.resolve(DENIED);
396
- const data = resourceData(item);
375
+ function evaluateOne(lookup, permdock, item, store, header, adapter) {
376
+ const permission = permissionOf(lookup, item);
377
+ if (permission === void 0) return Promise.resolve(NO_GRANT);
378
+ const data = itemResourceData(item.resource);
397
379
  const decide = permdock.decide;
398
380
  const decision = decide(permission, data, compact({
399
381
  source: "endpoint",
@@ -406,7 +388,7 @@ function evaluateOne(policy, permdock, item, store, header, adapter) {
406
388
  permission,
407
389
  subject: permdock.subject,
408
390
  store,
409
- resource: resourceRef(permission, item, data),
391
+ resource: resourceRef(permission, data, item.resource?.id),
410
392
  adapter,
411
393
  token: header,
412
394
  consume: false
@@ -422,6 +404,7 @@ async function resolvePermdock(options, request, tenant) {
422
404
  }
423
405
  function createEvaluationsHandler(options) {
424
406
  const adapter = options.adapter ?? "server";
407
+ const lookup = permissionLookup(options.policy.permissions);
425
408
  const maxEvaluations = options.maxEvaluations ?? 256;
426
409
  const POST = async (request) => {
427
410
  let body;
@@ -444,8 +427,7 @@ function createEvaluationsHandler(options) {
444
427
  throw error;
445
428
  }
446
429
  const rows = await Promise.all(evaluations.map(async (item) => {
447
- const entry = item !== null && typeof item === "object" ? item : {};
448
- return evaluationRow(await evaluateOne(options.policy, permdock, entry, options.store, header, adapter));
430
+ return evaluationRow(await evaluateOne(lookup, permdock, item !== null && typeof item === "object" ? item : {}, options.store, header, adapter));
449
431
  }));
450
432
  return Response.json({ evaluations: rows });
451
433
  };
@@ -476,4 +458,4 @@ function createEvaluationsHandler(options) {
476
458
  };
477
459
  }
478
460
  //#endregion
479
- export { invalidSignatureProblem as a, discoverViaSignatureAgent as i, createEvaluationsHandler as n, invalidSignatureResponse as o, InvalidSignatureError as r, verifyWebBotAuth as s, applyApprovalResume as t };
461
+ export { invalidSignatureProblem as a, NO_GRANT as c, discoverViaSignatureAgent as i, createEvaluationsHandler as n, invalidSignatureResponse as o, InvalidSignatureError as r, verifyWebBotAuth as s, applyApprovalResume as t };
@@ -1,7 +1,8 @@
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 { d as Permission } from "../permissions-B4apnahQ.js";
3
- import { c as ApprovalRequest, f as ApprovalStore } from "../types-B8w5PFtS.js";
4
- 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-IB6yxpC3.js";
2
+ import { f as Permission } from "../permissions-DttnqqxC.js";
3
+ import { c as ApprovalRequest, f as ApprovalStore } from "../types-aqOHTHcp.js";
4
+ import { t as InstanceOptions } from "../instance-options-jARdwfPN.js";
5
+ import { t as ToolMap } from "../types-Bvc4oWT6.js";
5
6
  //#region src/eve/create.d.ts
6
7
  /** Structural `SessionAuthContext` from `eve`. */
7
8
  type EvePrincipal = {
@@ -48,24 +49,14 @@ type EveContext = Pick<EveApprovalContext, "session" | "callId">;
48
49
  type EveApprovers = {
49
50
  readonly roles: readonly string[];
50
51
  } | ((responder: EvePrincipal, request: ApprovalRequest) => boolean);
51
- type EvePermDockOptions<TUser = unknown> = {
52
+ type EvePermDockOptions<TUser = unknown> = InstanceOptions & {
52
53
  readonly subject?: (context: EveContext) => TUser | Promise<TUser>;
53
54
  readonly actor?: (context: EveContext) => unknown;
54
55
  readonly delegation?: (context: EveContext) => Delegation | undefined | Promise<Delegation | undefined>;
55
56
  readonly tenant?: string | ((context: EveContext) => string | undefined | Promise<string | undefined>);
56
57
  readonly tools: ToolMap;
57
58
  readonly approvers?: EveApprovers;
58
- readonly memberships?: MembershipSource | readonly MembershipSource[];
59
- /** The object graph for relation grants that walk a parent chain; without it they deny. */
60
- readonly relations?: RelationSource;
61
- readonly entitlements?: EntitlementSource;
62
- readonly customRoles?: RoleSource;
63
- /** Hosted grants, read once per instance; see `PolicySource`. */
64
- readonly policies?: PolicySource;
65
59
  readonly store?: ApprovalStore;
66
- readonly sink?: DecisionSink;
67
- readonly limits?: LimitStore;
68
- readonly snapshots?: SnapshotSource;
69
60
  };
70
61
  type EveRequestResult = "not-applicable" | "user-approval" | {
71
62
  readonly type: "denied";