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
package/README.md CHANGED
@@ -3,42 +3,32 @@
3
3
  **Typed permissions for TypeScript apps, APIs, databases and AI agents.**
4
4
 
5
5
  [![npm](https://img.shields.io/npm/v/permdock?label=permdock)](https://www.npmjs.com/package/permdock)
6
- [![license](https://img.shields.io/badge/license-MIT-blue.svg)](https://github.com/ScaleDockHQ/permdock/blob/main/LICENSE)
7
- [![CI](https://img.shields.io/github/actions/workflow/status/ScaleDockHQ/permdock/ci.yml?label=CI)](https://github.com/ScaleDockHQ/permdock/actions)
6
+ [![license](https://img.shields.io/badge/license-MIT-blue.svg)](https://github.com/ScaleDockHQ/PermDock/blob/main/LICENSE)
7
+ [![CI](https://img.shields.io/github/actions/workflow/status/ScaleDockHQ/PermDock/ci.yml?label=CI)](https://github.com/ScaleDockHQ/PermDock/actions)
8
8
  ![Node.js 24+](https://img.shields.io/badge/Node.js-24%2B-5fa04e.svg)
9
9
  ![TypeScript 7](https://img.shields.io/badge/TypeScript-7-3178c6.svg)
10
10
 
11
- Define permissions once as typed references over the Zod, Valibot or ArkType schemas you already have. Grant them to roles with portable conditions. Check them in React, React Native, Next.js, Hono, tRPC and MCP servers. Compile the same conditions to SQL `where` clauses and Postgres Row Level Security policies. Drive tool approvals in the Vercel AI SDK, the Claude Agent SDK, Eve and the OpenAI Agents SDK from the same decision.
11
+ Define permissions once as typed references over the Zod, Valibot or ArkType schemas you already have. Grant them to roles with portable conditions. Check them in React, Next.js, Hono, tRPC, MCP servers and agent runtimes, and compile the same conditions to SQL `where` clauses and Postgres Row Level Security.
12
12
 
13
- > **Pre-release.** The first published version is `0.1.0`. See the [roadmap](https://permdock.dev/docs/roadmap).
14
-
15
- [Docs](https://permdock.dev/docs) · [Quick start](https://permdock.dev/docs/getting-started/quick-start) · [Adapters](https://permdock.dev/docs/adapters) · [For AI agents](https://permdock.dev/docs/for-ai-agents) · [Source](https://github.com/ScaleDockHQ/permdock)
16
-
17
- ## Install
13
+ [Docs](https://permdock.com/docs) · [Quick start](https://permdock.com/docs/getting-started/quick-start) · [Adapters](https://permdock.com/docs/adapters) · [Existing apps](https://permdock.com/docs/getting-started/existing-apps) · [For AI agents](https://permdock.com/docs/for-ai-agents) · [Changelog](https://github.com/ScaleDockHQ/PermDock/blob/main/packages/permdock/CHANGELOG.md) · [Source](https://github.com/ScaleDockHQ/PermDock)
18
14
 
19
15
  ```bash
20
- pnpm add permdock # core, every adapter as a subpath export, the permdock CLI and permdock/testing
16
+ pnpm add permdock
21
17
  ```
22
18
 
23
- - One package. Core is `permdock`; every adapter is a subpath (`permdock/react`, `permdock/hono`, `permdock/next`, `permdock/ai-sdk`, …). The `permdock` binary (`collect`, `catalog`, `usage`, `openapi`, `rls`, `doctor`, `skills`) and the `permdock/testing` runners ship in the same package.
24
- - ESM only. Node.js 24 or later. Written in and tested with TypeScript 7; the public types are also checked under TypeScript 5.9 and 6.
25
- - Runtime entries depend on `@standard-schema/spec` only. The CLI's dependencies (`oxc-parser`, `citty`, `jiti`, `smol-toml`, `package-manager-detector`, `@clack/prompts`, `diff`) never reach them. Framework SDKs are optional peers, and structurally typed providers (`supabase`, `clerk`, `better-auth`, `convex`, `prisma`, `mcp`, `react-native`) declare no peer at all.
19
+ One package: core, every adapter as a subpath export, the `permdock` CLI and `permdock/testing`. ESM only, Node.js 24 or later, built with TypeScript 7 and type-checked under 5.9 and 6. Runtime entries depend on `@standard-schema/spec` only; framework SDKs are optional peers.
26
20
 
27
- ## Why PermDock
21
+ ## One definition, one decision
28
22
 
29
- Permission logic in a typical TypeScript app is spread across `if (user.role === 'admin')` checks in components, string keys like `'post:update'` in middleware, a hand-written client copy of the server rules, RLS policies nobody can diff against the app, and AI agents that call tools on a user's behalf with no way to say "ask first". PermDock replaces all of that with one definition and one decision object.
23
+ | Surface | What PermDock gives it |
24
+ | --------- | ---------------------------------------------------------------------------------------------- |
25
+ | UI | A JSON snapshot with conditions, `<Protected>` and `usePermission`, answered offline |
26
+ | HTTP, RPC | `protect` guards that answer a denial with RFC 9457 Problem Details |
27
+ | Database | `where()` for Drizzle, Prisma and Kysely; generated Postgres RLS with a parity check |
28
+ | Agents | Filtered tool lists, model-readable refusals, human approvals with a replay-safe token |
29
+ | CI | A committed catalog, `permdock diff` that fails on a breaking change, `permdock doctor` checks |
30
30
 
31
- - **Reference-based.** `permissions.post.update` is a typed, frozen object carrying `key`, `scope`, schema and metadata. Go-to-definition works, renames are safe, and the runtime definition is the catalog.
32
- - **Standard Schema native.** Resources are built from any [Standard Schema](https://standardschema.dev) validator; instance types are inferred; untrusted input is validated at trust boundaries only.
33
- - **Policy as data.** Roles are arrays of `allow` / `deny` grants with a portable condition AST. One condition evaluates in the browser, filters arrays, compiles to Drizzle / Prisma / Kysely `where`, and generates Postgres RLS.
34
- - **Multi-tenant roles.** A role is held globally, in a tenant, in a team or on one resource: `role('admin', grants, { on: 'tenant' })` replaces the `orgId` condition you used to repeat on every grant. Memberships come from your auth provider; PermDock stores nothing. Read [tenants, teams and scoped roles](https://permdock.dev/docs/concepts/tenancy).
35
- - **Decisions, not booleans.** `decide()` returns `granted`, `denied` or `approval-required` with the matched grant, denial reasons and permitted alternatives. Adapters turn that into RFC 9457 Problem Details, model-readable MCP refusals and AI SDK approval states.
36
- - **Snapshots that carry conditions.** The client answers ownership checks offline with no duplicated rules, and `<Protected>` never blocks a Next.js 16.3 instant navigation.
37
- - **Agent-native.** A two-principal subject (principal, actor, delegation), adapters for MCP, the AI SDK, the Claude Agent SDK, Eve, the OpenAI Agents SDK, WebMCP and A2A, an AuthZEN 1.0 decision endpoint, and bundled agent skills.
38
- - **Human approvals that resume safely.** `approval: 'human'` grants yield a third outcome with a replay-safe `token`. Pending approvals live in a pluggable `ApprovalStore`; approvers are authenticated and never the agent; plain HTTP resumes with a `PermDock-Approval` header.
39
- - **Secure by default.** Fail-closed, deny overrides allow, an unknown reference is a type error, prototype-safe, no eval, `service_role` never emitted, model-supplied subjects never trusted, an agent with no delegation denied, no one approving their own request, never a default tenant, data validated against the resource schema unless the caller marks a row it loaded `trusted: true`.
40
- - **Authentication stays upstream.** PermDock consumes verified material only: sessions, JWKS-verified JWTs (`permdock/jwt`, with `jose` as an optional peer), Supabase, Clerk and Better Auth claims, MCP `authInfo`. Token failures become RFC 6750 challenges, never thrown errors. Read [authentication](https://permdock.dev/docs/concepts/authentication).
41
- - **The Cloud is optional.** Every decision runs in-process. PermDock Cloud adds a decision log, access reviews, an approval inbox, a hosted AuthZEN endpoint and a SCIM relay, all behind interfaces this package ships with in-process defaults. Read [PermDock Cloud](https://permdock.dev/docs/adapters/cloud).
31
+ Every check returns one of three outcomes: `granted`, `denied` or `approval-required`. Anything unknown, invalid or thrown denies, and a deny overrides an allow.
42
32
 
43
33
  ## Quick start
44
34
 
@@ -71,9 +61,11 @@ export const roles = defineRoles({ member: {}, admin: { on: "tenant" } });
71
61
  permissions.post.update.key; // 'post.update'
72
62
  ```
73
63
 
64
+ `permissions.post.update` is a frozen object, not a string: go-to-definition works, a rename is a type error everywhere it is used, and the definition is the catalog.
65
+
74
66
  ### 2. Write the policy
75
67
 
76
- Server-only. Roles are data; conditions are portable.
68
+ Server-only. Roles are data; conditions are a portable JSON tree.
77
69
 
78
70
  ```ts
79
71
  // src/policy.ts
@@ -113,7 +105,7 @@ export const policy = definePolicy(
113
105
  );
114
106
  ```
115
107
 
116
- `subjectFromClerk`, `subjectFromBetterAuth`, `subjectFromSupabase` and `subjectFromJwt` produce `memberships` from the provider you already use.
108
+ `subjectFromClerk`, `subjectFromBetterAuth`, `subjectFromSupabase` and `subjectFromJwt` produce `memberships` from the provider you already use. PermDock stores no tenants, teams or memberships.
117
109
 
118
110
  ### 3. Decide
119
111
 
@@ -123,11 +115,14 @@ import { createPermDock } from "permdock";
123
115
  const permdock = await createPermDock(policy, user); // frozen, request-scoped, never throws
124
116
  permdock.can(permissions.post.update, post); // boolean
125
117
  permdock.decide(permissions.post.delete, post); // { outcome: 'granted' | 'denied' | 'approval-required', ... }
118
+ permdock.explain(permissions.post.delete, post); // the decision plus a trace naming the deny that won
126
119
  permdock.filter(permissions.post.read, posts); // Post[]
127
120
  permdock.where(permissions.post.read); // portable condition for Drizzle / Prisma / Kysely / SQL
128
121
  permdock.snapshot({ include: [permissions.post] }); // JSON for the client
129
122
  ```
130
123
 
124
+ ## Use it where the check happens
125
+
131
126
  ### React
132
127
 
133
128
  ```tsx
@@ -146,7 +141,7 @@ import { PermDockProvider, Protected, usePermission } from "permdock/react";
146
141
  const { allowed, status } = usePermission(permissions.post.update, post);
147
142
  ```
148
143
 
149
- The same hook names exist in React Native, Vue, Svelte and Solid. Read [building UI](https://permdock.dev/docs/concepts/ui).
144
+ The same hook names exist in React Native, Vue, Svelte and Solid. Read [building UI](https://permdock.com/docs/concepts/ui).
150
145
 
151
146
  ### Next.js 16.3
152
147
 
@@ -206,6 +201,8 @@ protectServer(server).registerTool(
206
201
 
207
202
  ### AI SDK
208
203
 
204
+ The Claude Agent SDK, Eve, the OpenAI Agents SDK, WebMCP and A2A have their own entries with the same tool map.
205
+
209
206
  ```ts
210
207
  import { createPermDock } from "permdock/ai-sdk";
211
208
 
@@ -225,36 +222,98 @@ const { toolApproval } = createPermDock(policy, {
225
222
  generateText({ model, tools, toolApproval }); // granted → approved, denied → denied, approval-required → user-approval
226
223
  ```
227
224
 
228
- ### RLS
225
+ ### Postgres RLS
229
226
 
230
227
  ```bash
231
228
  permdock rls generate --target drizzle --dialect supabase # roles × grants → policies
232
229
  permdock rls verify --db $DATABASE_URL # can() vs database parity
233
230
  ```
234
231
 
232
+ ## Agents and approvals
233
+
234
+ An agent acts for a user, so a subject has two principals: the user (`principal`) and the agent (`actor`). Policy `delegations` cap what an actor may do for a user, and an approval grant pauses the call until people other than the requester approve it.
235
+
236
+ ```ts
237
+ import { actor, allow, definePolicy } from "permdock";
238
+
239
+ const policy = definePolicy(permissions, {
240
+ roles: [member, finance],
241
+ delegations: [
242
+ {
243
+ from: roles.member,
244
+ to: actor("eve"),
245
+ permissions: [permissions.post.read, permissions.post.update],
246
+ validUntil: "2027-06-01T00:00:00Z",
247
+ },
248
+ ],
249
+ subject,
250
+ });
251
+
252
+ allow(permissions.payout.release, {
253
+ approval: {
254
+ by: roles.finance,
255
+ quorum: 2, // two distinct finance approvers
256
+ ttl: "30m",
257
+ escalation: { after: "10m", to: roles.cfo },
258
+ },
259
+ });
260
+ ```
261
+
262
+ Approvers are authenticated and are never the agent, no one approves their own request by default, and the resumed call carries a token bound to the permission and the data. Read [delegation](https://permdock.com/docs/security/delegation) and [approvals](https://permdock.com/docs/security/approvals).
263
+
264
+ ## Existing apps
265
+
266
+ PermDock adopts the permission keys, SQL helpers, tokens and stored custom roles an app already has, in steps that each leave the app working: generated helpers beside the hand-written SQL, `permdock rls migrate` to rewrite policies, and `renamed` aliases for keys you change later. `permdock doctor` reports what still uses an old key. Read [existing apps](https://permdock.com/docs/getting-started/existing-apps).
267
+
268
+ ## CLI
269
+
270
+ | Command | What it does |
271
+ | ------------------------ | ------------------------------------------------------------------------------------ |
272
+ | `permdock collect` | Scan the sources and write `permissions.catalog.json`; `--check` in CI |
273
+ | `permdock diff a b` | Compare two policies or catalogs; exit `1` on a breaking change; `--impact` |
274
+ | `permdock doctor` | Check wiring, imports, catalog freshness and security defaults; print a fix for each |
275
+ | `permdock usage` | Report unused, ungranted and role-less permissions |
276
+ | `permdock rls` | `generate`, `import`, `verify` and `migrate` Postgres RLS policies |
277
+ | `permdock supabase hook` | Generate the Supabase Custom Access Token Hook from your membership sources |
278
+ | `permdock openapi` | Emit `security` into an OpenAPI document or Overlay, or import one |
279
+ | `permdock skills` | Install the PermDock Agent Skills from `node_modules/permdock/skills` |
280
+
281
+ `catalog`, `arazzo check` and `cloud push` complete the list. Every command takes `--json`; under it, a failure prints RFC 9457 Problem Details. Read [CLI](https://permdock.com/docs/cli).
282
+
235
283
  ## Works with
236
284
 
237
285
  Any Standard Schema validator: Zod, Valibot, ArkType, Effect Schema. One import path per target:
238
286
 
239
- | Group | Entries |
240
- | ------------------ | ------------------------------------------------------------------------------------------------------------------------------------------------------- |
241
- | UI | `permdock/react` · `permdock/react-native` · `permdock/vue` · `permdock/svelte` · `permdock/solid` |
242
- | Full-stack | `permdock/next` |
243
- | HTTP | `permdock/server` · `permdock/hono` · `permdock/express` · `permdock/fastify` · `permdock/elysia` · `permdock/nest` · `permdock/node` |
244
- | Terminal | `permdock/terminal` for your own CLI (not the `permdock` binary) |
245
- | RPC | `permdock/trpc` · `permdock/orpc` |
246
- | Agents | `permdock/mcp` · `permdock/ai-sdk` · `permdock/claude-agent` · `permdock/eve` · `permdock/openai` · `permdock/webmcp` · `permdock/a2a` |
247
- | Decision plane | `permdock/authzen` · `permdock/approvals` · `permdock/cloud` · `permdock/scim` · `permdock/ssf` · `permdock/openapi` · `permdock/otel` · `permdock/pdp` |
248
- | Data | `permdock/drizzle` · `permdock/prisma` · `permdock/kysely` · `permdock rls` |
249
- | Auth and providers | `permdock/jwt` · `permdock/supabase` · `permdock/supabase/middleware` · `permdock/better-auth` · `permdock/clerk` · `permdock/convex` |
250
- | Build | `permdock/next/plugin` · `permdock/unplugin` |
251
- | Testing | `permdock/testing` |
252
-
253
- Nuxt, Astro, React Router, TanStack Start and Effect use these entries plus `permdock/unplugin`. The full matrix with example apps and related standards is on the [adapters page](https://permdock.dev/docs/adapters).
287
+ | Group | Entries |
288
+ | ------------------ | ------------------------------------------------------------------------------------------------------------------------------------------------------------------ |
289
+ | UI | `permdock/react` · `permdock/react-native` · `permdock/vue` · `permdock/svelte` · `permdock/solid` |
290
+ | Full-stack | `permdock/next` |
291
+ | HTTP | `permdock/server` · `permdock/hono` · `permdock/express` · `permdock/fastify` · `permdock/elysia` · `permdock/nest` · `permdock/node` |
292
+ | Terminal | `permdock/terminal` for your own CLI (not the `permdock` binary) |
293
+ | RPC | `permdock/trpc` · `permdock/orpc` |
294
+ | Agents | `permdock/mcp` · `permdock/ai-sdk` · `permdock/claude-agent` · `permdock/eve` · `permdock/openai` · `permdock/webmcp` · `permdock/a2a` |
295
+ | Decision plane | `permdock/authzen` · `permdock/approvals` · `permdock/cloud` · `permdock/scim` · `permdock/ssf` · `permdock/openapi` · `permdock/otel` · `permdock/pdp` |
296
+ | Data | `permdock/drizzle` · `permdock/prisma` · `permdock/kysely` · `permdock rls` · `permdock powersync` |
297
+ | Auth and providers | `permdock/jwt` · `permdock/supabase` · `permdock/supabase/middleware` · `permdock/better-supabase` · `permdock/better-auth` · `permdock/clerk` · `permdock/convex` |
298
+ | Build | `permdock/next/plugin` · `permdock/unplugin` |
299
+ | Testing | `permdock/testing` |
300
+
301
+ React Router, TanStack Start, SvelteKit and Nuxt loaders call `getSnapshot(request)` from `permdock/server` and send `snapshotHeaders(snapshot)`. Astro and Effect use these entries plus `permdock/unplugin`. The full matrix with example apps and related standards is on the [adapters page](https://permdock.com/docs/adapters).
302
+
303
+ ## Secure by default
304
+
305
+ - Fail-closed: an unknown, invalid or thrown check denies, and `can()` never throws.
306
+ - Deny overrides allow, an unknown reference is a type error, and evaluation is prototype-safe with no eval.
307
+ - `service_role` is never emitted, a model-supplied subject is never trusted, and an agent with no delegation is denied.
308
+ - No one approves their own request by default, there is never a default tenant, and data is validated against the resource schema unless the caller marks a row it loaded `trusted: true`.
309
+ - Authentication stays upstream: PermDock consumes verified sessions, JWKS-verified JWTs (`permdock/jwt`, with `jose` as an optional peer), provider claims and MCP `authInfo`. Core never verifies a token. User-editable fields never become claims: `subjectFromBetterAuth` copies `additionalFields` only through a `schema`. Read [authentication](https://permdock.com/docs/concepts/authentication).
310
+ - Every decision runs in-process. [PermDock Cloud](https://permdock.com/docs/adapters/cloud) adds a decision log, an approval inbox, a hosted AuthZEN endpoint and a SCIM relay, behind interfaces this package ships with in-process defaults.
311
+
312
+ Read the [threat model](https://permdock.com/docs/security/threat-model).
254
313
 
255
314
  ## Compared with
256
315
 
257
- Other TypeScript permission libraries (CASL, permix, Kilpi, `@zap-studio/permit`) return booleans from string keys and stop at the server or the UI. Hosted PDPs (Cerbos, Permit.io, OpenFGA, SpiceDB) put a network call on every check. PermDock is an embedded, typed library with one decision object across UI, API, SQL, RLS and agent approvals. Read the [comparison](https://permdock.dev/docs/comparison).
316
+ Other TypeScript permission libraries (CASL, permix, Kilpi, `@zap-studio/permit`) return booleans from string keys and stop at the server or the UI. Hosted PDPs (Cerbos, Permit.io, OpenFGA, SpiceDB) put a network call on every check. PermDock is an embedded, typed library with one decision object across UI, API, SQL, RLS and agent approvals. Read the [comparison](https://permdock.com/docs/comparison).
258
317
 
259
318
  ## For AI agents
260
319
 
@@ -263,8 +322,8 @@ npx skills add ScaleDockHQ/PermDock # the permdock, permdock-wire, permdock-au
263
322
  permdock skills # the same skills, offline, from node_modules/permdock/skills
264
323
  ```
265
324
 
266
- Claude Code users can add the plugin marketplace instead: `/plugin marketplace add ScaleDockHQ/permdock`. Every docs page is served as Markdown, plus `llms.txt` and `llms-full.txt`. Read [for AI agents](https://permdock.dev/docs/for-ai-agents).
325
+ Claude Code users can add the plugin marketplace instead: `/plugin marketplace add ScaleDockHQ/permdock`. Every docs page is served as Markdown, with `llms.txt`, `llms-full.txt` and a docs MCP server at `https://permdock.com/mcp`. Read [for AI agents](https://permdock.com/docs/for-ai-agents).
267
326
 
268
327
  ## License
269
328
 
270
- [MIT](https://github.com/ScaleDockHQ/permdock/blob/main/LICENSE) © 2026 ScaleDockHQ. Report vulnerabilities privately through [GitHub security advisories](https://github.com/ScaleDockHQ/permdock/security/advisories/new).
329
+ [MIT](https://github.com/ScaleDockHQ/PermDock/blob/main/LICENSE) © 2026 ScaleDockHQ. Report vulnerabilities privately through [GitHub security advisories](https://github.com/ScaleDockHQ/PermDock/security/advisories/new).
@@ -1,7 +1,8 @@
1
- import { $ as DecisionSink, C as Policy, at as LimitStore, ct as MembershipSource, ft as RelationSource, mr as Principal, or as AuthorizationDetail, 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";
4
- import { o as ProblemDetails } from "../errors-DbZ1YOnb.js";
1
+ import { C as Policy, Nr as Principal, Tr as AuthorizationDetail } from "../policy-CFZAr_Al.js";
2
+ import { f as Permission } from "../permissions-DttnqqxC.js";
3
+ import { f as ApprovalStore } from "../types-vKyAMtcX.js";
4
+ import { a as ProblemDetails } from "../errors-DAqevpNk.js";
5
+ import { t as InstanceOptions } from "../instance-options-BK_rNOSC.js";
5
6
  //#region src/a2a/types.d.ts
6
7
  type A2aAuth = {
7
8
  readonly clientId?: string;
@@ -138,28 +139,18 @@ type A2aTaskOutcome = {
138
139
  readonly ok: true;
139
140
  } | {
140
141
  readonly ok: false;
141
- readonly status: 401 | 403;
142
+ readonly status: 401 | 403 | 429 | 503;
142
143
  readonly state: "failed" | "input-required";
143
144
  readonly problem: ProblemDetails;
144
145
  readonly wwwAuthenticate?: string;
145
146
  };
146
- type A2aPermDockOptions<TUser = unknown> = {
147
+ type A2aPermDockOptions<TUser = unknown> = InstanceOptions & {
147
148
  readonly subject: (auth: A2aAuth) => TUser | Promise<TUser>;
148
149
  readonly card: A2aCardInfo;
149
150
  readonly securitySchemes: Readonly<Record<string, A2aSecurityScheme>>;
150
151
  readonly skills: Readonly<Record<string, A2aSkillConfig>>;
151
152
  readonly tenant?: string | ((auth: A2aAuth) => string | undefined | Promise<string | undefined>);
152
- readonly memberships?: MembershipSource | readonly MembershipSource[];
153
- /** The object graph for relation grants that walk a parent chain; without it they deny. */
154
- readonly relations?: RelationSource;
155
- readonly entitlements?: EntitlementSource;
156
- readonly customRoles?: RoleSource;
157
- /** Hosted grants, read once per instance; see `PolicySource`. */
158
- readonly policies?: PolicySource;
159
153
  readonly store?: ApprovalStore;
160
- readonly sink?: DecisionSink;
161
- readonly limits?: LimitStore;
162
- readonly snapshots?: SnapshotSource;
163
154
  };
164
155
  type A2aPermDock = {
165
156
  readonly agentCard: () => A2aAgentCard;
package/dist/a2a/index.js CHANGED
@@ -1,15 +1,14 @@
1
1
  import { t as compact } from "../compact-y6vfu2_f.js";
2
- import { n as PermDockDeniedError, t as PermDockApprovalRequiredError } from "../errors-Iy71s7Oj.js";
3
- import { l as canonicalJson } from "../snapshot-DE8dE_hz.js";
2
+ import { n as PermDockDeniedError, t as PermDockApprovalRequiredError } from "../errors-Cz5zn0mW.js";
3
+ import { t as canonicalJson } from "../canonical-json-DemiK4Vp.js";
4
4
  import { t as bytesToBase64Url } from "../sha256-BO0swRXL.js";
5
- import { t as createPermDock$1 } from "../permdock-yoZ7EjxX.js";
6
- import { t as mayUse } from "../may-use-CnFEjVEp.js";
7
- import { l as storedApprovalToken, s as resumeDecision } from "../helpers-DnSOrhB9.js";
8
- import { r as bearerChallenge } from "../problem-Cgp9-KZA.js";
5
+ import { i as scopesReaching, r as challengeScope } from "../permdock-CzqXjCpU.js";
6
+ import { n as resourceRef } from "../resource-ref-CaS9yVPi.js";
7
+ import { t as mayUse } from "../may-use-DndQ5tQ-.js";
8
+ import { d as wwwAuthenticate, n as bearerChallenge } from "../problem-B43ztKIm.js";
9
+ import { t as instanceOptions } from "../instance-options-Dhhcnm3y.js";
10
+ import { n as createAgentKernel } from "../kernel-GSQnMz3O.js";
9
11
  //#region src/a2a/create.ts
10
- function isRecord(value) {
11
- return value !== null && typeof value === "object" && !Array.isArray(value);
12
- }
13
12
  function firstScheme(options) {
14
13
  return Object.keys(options.securitySchemes)[0];
15
14
  }
@@ -88,24 +87,8 @@ function actorOf(auth) {
88
87
  kind: "oauth-client"
89
88
  } : void 0;
90
89
  }
91
- async function resolveTenant(tenant, auth) {
92
- if (tenant === void 0 || typeof tenant === "string") return tenant;
93
- try {
94
- return await tenant(auth);
95
- } catch {
96
- return;
97
- }
98
- }
99
- function hasScope(auth, scope) {
100
- return auth.scopes?.includes(scope) === true;
101
- }
102
- function resourceRef(permission, data) {
103
- if (!isRecord(data)) return { type: permission.resource };
104
- const id = data["id"];
105
- return typeof id === "string" || typeof id === "number" ? {
106
- type: permission.resource,
107
- id: String(id)
108
- } : { type: permission.resource };
90
+ function hasScope(auth, scopes) {
91
+ return scopes.some((scope) => auth.scopes?.includes(scope) === true);
109
92
  }
110
93
  const LOAD_FAILED = {
111
94
  outcome: "denied",
@@ -115,20 +98,29 @@ const LOAD_FAILED = {
115
98
  }],
116
99
  alternatives: []
117
100
  };
118
- function deniedOutcome(decision, permission, data, permdock) {
119
- return {
101
+ const NO_SUBJECT = {
102
+ principal: null,
103
+ context: {}
104
+ };
105
+ function taskStatus(status) {
106
+ return status === 401 || status === 429 || status === 503 ? status : 403;
107
+ }
108
+ function deniedOutcome(decision, permission, data, subject) {
109
+ const problem = new PermDockDeniedError({
110
+ decision,
111
+ permission: permission.key,
112
+ scope: permission.scope,
113
+ resource: resourceRef(permission, data),
114
+ subject: subject ?? NO_SUBJECT,
115
+ message: `${permission.key} denied.`
116
+ }).toProblemDetails();
117
+ return compact({
120
118
  ok: false,
121
- status: 403,
119
+ status: taskStatus(problem.status),
122
120
  state: "failed",
123
- problem: new PermDockDeniedError({
124
- decision,
125
- permission: permission.key,
126
- scope: permission.scope,
127
- resource: resourceRef(permission, data),
128
- subject: permdock.subject,
129
- message: `${permission.key} denied.`
130
- }).toProblemDetails()
131
- };
121
+ problem,
122
+ wwwAuthenticate: wwwAuthenticate(decision, permission, false)
123
+ });
132
124
  }
133
125
  function approvalOutcome(decision, permission, data) {
134
126
  return {
@@ -158,51 +150,44 @@ async function signCard(card, signPayload) {
158
150
  }]
159
151
  };
160
152
  }
161
- function missingScope(permission) {
153
+ function missingScope(permission, scope) {
162
154
  return {
163
155
  ok: false,
164
156
  status: 401,
165
157
  state: "failed",
166
158
  problem: {
167
- type: "https://permdock.dev/problems/unauthenticated",
159
+ type: "https://permdock.com/problems/unauthenticated",
168
160
  title: "Insufficient scope",
169
161
  status: 401,
170
- detail: `insufficient_scope: ${permission.scope}`,
162
+ detail: `insufficient_scope: ${scope}`,
171
163
  permission: permission.key,
172
- scope: permission.scope
164
+ scope
173
165
  },
174
166
  wwwAuthenticate: bearerChallenge({
175
167
  error: "insufficient_scope",
176
- scopes: [permission.scope]
168
+ scopes: [scope]
177
169
  })
178
170
  };
179
171
  }
180
172
  function createPermDock(policy, options) {
181
173
  for (const [id, config] of Object.entries(options.skills)) if (config.permission.kind === "instance" && config.data === void 0) throw new TypeError(`PermDock: A2A skill '${id}' checks ${config.permission.key} on a row and needs a data loader; the task body is never used as the row`);
182
- const instanceFor = async (auth) => {
183
- let user = null;
174
+ const kernel = createAgentKernel(policy, compact({
175
+ subject: options.subject,
176
+ actor: actorOf,
177
+ delegation: delegationOf,
178
+ tenant: options.tenant,
179
+ store: options.store,
180
+ adapter: "a2a",
181
+ ...instanceOptions(options)
182
+ }));
183
+ const agentCard = () => cardOf(options, publicSkills(options));
184
+ const extendedAgentCard = async (auth) => {
185
+ let permdock;
184
186
  try {
185
- user = await options.subject(auth);
187
+ permdock = await kernel.instance(auth);
186
188
  } catch {
187
- user = null;
189
+ return cardOf(options, []);
188
190
  }
189
- const tenant = await resolveTenant(options.tenant, auth);
190
- return createPermDock$1(policy, user, compact({
191
- tenant,
192
- actor: actorOf(auth),
193
- delegation: delegationOf(auth),
194
- memberships: options.memberships,
195
- relations: options.relations,
196
- entitlements: options.entitlements,
197
- customRoles: options.customRoles,
198
- policies: options.policies,
199
- sink: options.sink,
200
- limits: options.limits
201
- }));
202
- };
203
- const agentCard = () => cardOf(options, publicSkills(options));
204
- const extendedAgentCard = async (auth) => {
205
- const permdock = await instanceFor(auth);
206
191
  const scheme = firstScheme(options);
207
192
  const skills = [];
208
193
  for (const [id, config] of Object.entries(options.skills)) if (mayUse(permdock, config.permission)) skills.push(skillOf(id, config, scheme));
@@ -216,46 +201,22 @@ function createPermDock(policy, options) {
216
201
  status: 403,
217
202
  state: "failed",
218
203
  problem: {
219
- type: "https://permdock.dev/problems/denied",
204
+ type: "https://permdock.com/problems/denied",
220
205
  title: "Permission denied",
221
206
  status: 403,
222
207
  detail: "unknown skill"
223
208
  }
224
209
  };
225
- if (!hasScope(auth, config.permission.scope)) return missingScope(config.permission);
226
- const permdock = await instanceFor(auth);
227
- let data;
228
- if (config.data !== void 0) {
229
- try {
230
- data = await config.data(task);
231
- } catch {
232
- return deniedOutcome(LOAD_FAILED, config.permission, void 0, permdock);
233
- }
234
- if (config.permission.kind === "instance" && (data === null || data === void 0)) return deniedOutcome(LOAD_FAILED, config.permission, void 0, permdock);
235
- }
236
- let decision;
237
- try {
238
- const raw = permdock.decide(config.permission, data, compact({
239
- source: "adapter",
240
- adapter: "a2a",
241
- trusted: false,
242
- boundary: "tool-args"
243
- }));
244
- decision = await resumeDecision({
245
- decision: raw,
246
- permission: config.permission,
247
- subject: permdock.subject,
248
- store: options.store,
249
- resource: resourceRef(config.permission, data),
250
- adapter: "a2a",
251
- token: auth.extra?.approval ?? await storedApprovalToken(options.store, raw, false)
252
- });
253
- } catch {
254
- return deniedOutcome(LOAD_FAILED, config.permission, data, permdock);
255
- }
210
+ if (!hasScope(auth, scopesReaching(policy, config.permission))) return missingScope(config.permission, challengeScope(policy, config.permission));
211
+ const checked = await kernel.check(compact({
212
+ permission: config.permission,
213
+ data: config.data
214
+ }), task, auth, compact({ resumeToken: auth.extra?.approval }));
215
+ if (!checked.ok) return deniedOutcome(LOAD_FAILED, config.permission, void 0, checked.permdock?.subject);
216
+ const { decision, data, permdock } = checked;
256
217
  switch (decision.outcome) {
257
218
  case "granted": return { ok: true };
258
- case "denied": return deniedOutcome(decision, config.permission, data, permdock);
219
+ case "denied": return deniedOutcome(decision, config.permission, data, permdock.subject);
259
220
  case "approval-required": return approvalOutcome(decision, config.permission, data);
260
221
  default: return decision;
261
222
  }
@@ -0,0 +1,23 @@
1
+ import { n as isActor } from "./subject-C6dLxqHU.js";
2
+ //#region src/core/adapter-context.ts
3
+ /** Resolves an adapter `tenant` option against its framework context; a throw is no tenant. */
4
+ async function tenantScope(option, context) {
5
+ if (option === void 0 || typeof option === "string") return { tenant: option };
6
+ try {
7
+ return { tenant: await option(context) };
8
+ } catch {
9
+ return { tenant: void 0 };
10
+ }
11
+ }
12
+ /** Resolves an adapter `actor` option; anything but an `Actor`, or a throw, is no actor. */
13
+ async function actorFrom(option, context) {
14
+ if (option === void 0) return;
15
+ try {
16
+ const resolved = await option(context);
17
+ return isActor(resolved) ? resolved : void 0;
18
+ } catch {
19
+ return;
20
+ }
21
+ }
22
+ //#endregion
23
+ export { tenantScope as n, actorFrom as t };
@@ -1,31 +1,43 @@
1
- import { $ as DecisionSink, C as Policy, 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 { f as ApprovalStore } from "../types-B8w5PFtS.js";
4
- import { t as ToolMap } from "../types-CxquUByI.js";
1
+ import { C as Policy, Nr as Principal, kr as Delegation } from "../policy-CFZAr_Al.js";
2
+ import { f as Permission } from "../permissions-DttnqqxC.js";
3
+ import { f as ApprovalStore } from "../types-vKyAMtcX.js";
4
+ import { t as InstanceOptions } from "../instance-options-BK_rNOSC.js";
5
+ import { t as ToolMap } from "../types-Bvc4oWT6.js";
5
6
  //#region src/ai-sdk/create.d.ts
6
7
  type AiSdkContext = {
7
8
  readonly runtimeContext?: unknown;
8
9
  readonly permdockApproval?: string;
9
10
  readonly [key: string]: unknown;
10
11
  };
11
- type AiSdkPermDockOptions<TUser = unknown> = {
12
+ type AiSdkPermDockOptions<TUser = unknown> = InstanceOptions & {
12
13
  readonly subject: (context: AiSdkContext) => TUser | Promise<TUser>;
13
14
  readonly actor?: (context: AiSdkContext) => unknown;
14
15
  readonly delegation?: (context: AiSdkContext) => Delegation | undefined | Promise<Delegation | undefined>;
15
16
  readonly tenant?: string | ((context: AiSdkContext) => string | undefined | Promise<string | undefined>);
16
17
  readonly tools: ToolMap;
17
- readonly memberships?: MembershipSource | readonly MembershipSource[];
18
- /** The object graph for relation grants that walk a parent chain; without it they deny. */
19
- readonly relations?: RelationSource;
20
- readonly entitlements?: EntitlementSource;
21
- readonly customRoles?: RoleSource;
22
- /** Hosted grants, read once per instance; see `PolicySource`. */
23
- readonly policies?: PolicySource;
24
18
  readonly store?: ApprovalStore;
25
- readonly sink?: DecisionSink;
26
- readonly limits?: LimitStore;
27
- readonly snapshots?: SnapshotSource;
19
+ /**
20
+ * Tools the `tools` map does not bind to a permission. `'deny'` (default):
21
+ * the middleware hides them and `toolApproval` denies them. `'allow'`: they
22
+ * pass through both, to the application's own `toolApproval`.
23
+ */
24
+ readonly unmapped?: "deny" | "allow";
28
25
  };
26
+ /** What an AI SDK tool approval function may return; `undefined` is `not-applicable`. */
27
+ type ToolApprovalResult = ToolApprovalStatus | undefined | "not-applicable" | "denied" | "user-approval" | {
28
+ readonly type: "not-applicable";
29
+ } | {
30
+ readonly type: "approved";
31
+ readonly reason?: string;
32
+ } | {
33
+ readonly type: "denied";
34
+ readonly reason?: string;
35
+ } | {
36
+ readonly type: "user-approval";
37
+ readonly reason?: string;
38
+ };
39
+ /** An application's own tool approval function, in the AI SDK's generic form. */
40
+ type AppToolApproval = (call: ToolApprovalCall) => ToolApprovalResult | PromiseLike<ToolApprovalResult>;
29
41
  type ToolApprovalStatus = "approved" | {
30
42
  readonly type: "denied";
31
43
  readonly reason: string;
@@ -65,10 +77,19 @@ type LanguageModelMiddleware = {
65
77
  };
66
78
  type AiSdkPermDock = {
67
79
  readonly toolApproval: (call: ToolApprovalCall) => Promise<ToolApprovalStatus>;
80
+ /**
81
+ * PermDock's `toolApproval` followed by the application's own: `app` is
82
+ * asked only for a call PermDock grants (or an unmapped tool under
83
+ * `unmapped: 'allow'`), and its answer is returned as is, `undefined`
84
+ * included (not applicable, as the AI SDK reads it). An answer that is not
85
+ * a tool approval result denies. PermDock's denials and approval requests
86
+ * come first.
87
+ */
88
+ readonly composeToolApproval: (app: AppToolApproval) => (call: ToolApprovalCall) => Promise<ToolApprovalResult>;
68
89
  /** Hides tools the subject in `context` can never use, before the model sees them. */
69
90
  readonly capabilityMiddleware: (context: AiSdkContext) => LanguageModelMiddleware;
70
91
  readonly needsApproval: (permission: Permission) => (input: unknown, options?: NeedsApprovalOptions) => Promise<boolean>;
71
92
  };
72
93
  export declare function createPermDock<TUser, TPrincipal extends Principal = Principal>(policy: Policy<TUser, TPrincipal>, options: AiSdkPermDockOptions<TUser>): AiSdkPermDock;
73
94
  //#endregion
74
- export type { AiSdkContext, AiSdkPermDock, AiSdkPermDockOptions, LanguageModelMiddleware, NeedsApprovalOptions, ToolApprovalCall, ToolApprovalStatus };
95
+ export type { AiSdkContext, AiSdkPermDock, AiSdkPermDockOptions, AppToolApproval, LanguageModelMiddleware, NeedsApprovalOptions, ToolApprovalCall, ToolApprovalResult, ToolApprovalStatus };