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,4 +1,4 @@
1
- import { b as ResourceRelation } from "./permissions-B4apnahQ.js";
1
+ import { S as ResourceRelation } from "./permissions-DttnqqxC.js";
2
2
  //#region src/catalog/types.d.ts
3
3
  type CatalogUsage = {
4
4
  readonly file: string;
@@ -15,6 +15,8 @@ type CatalogPermission = {
15
15
  readonly usages: readonly CatalogUsage[];
16
16
  /** Keys the permission was renamed from (`definePermissions` `renamed`), sorted; absent when none. */
17
17
  readonly renamedFrom?: readonly string[];
18
+ /** Level names a custom role may pick for the permission (`resource(…, { levels })`); absent when none. */
19
+ readonly levels?: readonly string[];
18
20
  /** Present only when the policy lists the permission in `hostable`. */
19
21
  readonly hostable?: true;
20
22
  /**
@@ -61,6 +63,7 @@ type CatalogResource = {
61
63
  readonly version?: string;
62
64
  /** The boolean column that keeps ancestor grants out of a row. */
63
65
  readonly restricted?: string;
66
+ readonly restrictedStops?: readonly string[];
64
67
  };
65
68
  type CatalogRole = {
66
69
  readonly key: string;
@@ -134,6 +137,8 @@ type CatalogGrant = {
134
137
  readonly validity?: CatalogValidity;
135
138
  readonly name?: string;
136
139
  readonly purpose?: readonly string[];
140
+ /** The permission key the subject must also hold through a role on the row's scope instance (`requires`). */
141
+ readonly requires?: string | readonly string[];
137
142
  readonly limit?: {
138
143
  readonly count: number;
139
144
  readonly per: string;
@@ -169,6 +174,7 @@ type CatalogDelegation = {
169
174
  readonly to: {
170
175
  readonly kind: string;
171
176
  readonly id?: string;
177
+ readonly client?: string;
172
178
  };
173
179
  readonly permissions: readonly string[];
174
180
  readonly validity?: CatalogValidity;
@@ -1,5 +1,5 @@
1
- import { C as Policy, Cn as ArazzoPlan, E as PolicyVocabulary, In as ExplainedDecision, Mn as Decision, Qt as PermDockOptions, Xt as DecideOptions, Zt as PermDock, en as SimulateOptions, hr as Subject, mr as Principal, pr as Membership, tn as WhereResult, wn as ArazzoSimulateInput } from "./policy-CInmNGkM.js";
2
- import { d as Permission, p as PermissionTree } from "./permissions-B4apnahQ.js";
1
+ import { $n as ExplainedDecision, C as Policy, D as PolicyVocabulary, In as ArazzoPlan, Ln as ArazzoSimulateInput, Mr as Membership, Nr as Principal, Pr as Subject, Yn as Decision, cn as DeriveOptions, fn as SimulateOptions, ln as PermDock, mn as WhereResult, sn as DecideOptions, un as PermDockOptions } from "./policy-IB6yxpC3.js";
2
+ import { f as Permission, m as PermissionTree } from "./permissions-DttnqqxC.js";
3
3
  //#region src/pdp/types.d.ts
4
4
  type RemotePdpAuth = {
5
5
  readonly bearer: string | (() => string | Promise<string>);
@@ -84,7 +84,9 @@ type SpiceDbOptions = {
84
84
  readonly cache?: RemotePdpCache;
85
85
  readonly fetch?: typeof fetch;
86
86
  };
87
- type PdpPermDock<V extends PolicyVocabulary = PolicyVocabulary> = Omit<PermDock<V>, "can" | "decide" | "assert" | "explain" | "filter" | "where" | "simulate" | "tenant" | "team"> & {
87
+ type PdpPermDock<V extends PolicyVocabulary = PolicyVocabulary> = Omit<PermDock<V>, "can" | "decide" | "assert" | "explain" | "filter" | "where" | "simulate" | "tenant" | "team" | "derive"> & {
88
+ /** `permdock.derive` with the same providers: the result asks the PDP too. */
89
+ readonly derive: (options: DeriveOptions) => PdpPermDock<V> | Promise<PdpPermDock<V>>;
88
90
  /**
89
91
  * For a delegated permission whose provider lists ids, an `in` over them
90
92
  * (AND the local condition when local grants exist); otherwise the local
@@ -1,4 +1,4 @@
1
- import { E as PolicyVocabulary, Z as DecisionEvent, Zt as PermDock } from "./policy-CInmNGkM.js";
1
+ import { D as PolicyVocabulary, ln as PermDock, rt as DecisionEvent } from "./policy-IB6yxpC3.js";
2
2
  //#region src/otel/types.d.ts
3
3
  declare const GENAI_SEMCONV_PIN = "1.37.0";
4
4
  declare const GEN_AI_TOOL_NAME = "gen_ai.tool.name";
@@ -1,4 +1,4 @@
1
- import { U as Approver, hr as Subject, o as ApprovalStage, pr as Membership, qn as RelationGrantee, r as ApprovalMode } from "./policy-CInmNGkM.js";
1
+ import { G as Approver, Mr as Membership, Pr as Subject, dr as RelationGrantee, o as ApprovalStage, r as ApprovalMode } from "./policy-IB6yxpC3.js";
2
2
  //#region src/approvals/types.d.ts
3
3
  type ApprovalStatus = "pending" | "approved" | "rejected" | "expired";
4
4
  type ApprovalApprovers = {
@@ -24,6 +24,7 @@ type ApprovalSignature = {
24
24
  readonly by: string;
25
25
  readonly at: string;
26
26
  readonly stage?: number;
27
+ readonly vouched?: string;
27
28
  };
28
29
  type ApprovalSubjectSummary = {
29
30
  readonly principal: {
@@ -63,6 +64,7 @@ type ApprovalRequest = {
63
64
  readonly resolvedAt?: string;
64
65
  /** The approver whose verdict resolved the request (the last of `approvals` on a quorum), or `system:<by>` for a cancellation. */
65
66
  readonly resolvedBy?: string;
67
+ readonly vouched?: string;
66
68
  readonly note?: string;
67
69
  readonly consumedAt?: string;
68
70
  };
@@ -77,6 +79,14 @@ type ApprovalVerdict = {
77
79
  * none, so relation approvers match nobody.
78
80
  */
79
81
  readonly relations?: readonly string[];
82
+ /**
83
+ * The `holder(permission)` approvers (by permission key) that `by` holds
84
+ * in the request's tenant, as `approverPermissions` read them from the
85
+ * approver's own instance. Server-side input, never from the request body.
86
+ * Absent means none, so permission approvers match nobody.
87
+ */
88
+ readonly permissions?: readonly string[];
89
+ readonly vouched?: string;
80
90
  };
81
91
  type ApprovalListFilter = {
82
92
  readonly status?: ApprovalStatus;
@@ -104,6 +114,12 @@ type ApprovalCancelMeta = {
104
114
  readonly note?: string;
105
115
  };
106
116
  type ApprovalStore = {
117
+ /**
118
+ * How long a request opened against this store stays open, in
119
+ * milliseconds, when the caller sets no `ttl`; absent means
120
+ * `DEFAULT_APPROVAL_TTL_MS`. A grant's `approval.ttl` still caps it.
121
+ */
122
+ readonly ttl?: number;
107
123
  create(request: ApprovalRequest): Promise<void> | void;
108
124
  get(token: string): Promise<ApprovalRequest | null> | ApprovalRequest | null;
109
125
  resolve(token: string, verdict: ApprovalVerdict): Promise<ApprovalRequest> | ApprovalRequest;
@@ -1,4 +1,4 @@
1
- import { a as PermDockPluginOptions } from "../types-D6Z6-rKJ.js";
1
+ import { a as PermDockPluginOptions } from "../types-DbjRN55U.js";
2
2
  import { createUnplugin } from "unplugin";
3
3
  //#region src/unplugin/index.d.ts
4
4
  type CreateUnplugin = typeof createUnplugin<PermDockPluginOptions | undefined>;
@@ -1,4 +1,4 @@
1
- import { n as runPluginCollect } from "../plugin-4gr7IxFJ.js";
1
+ import { n as createCollectScheduler, r as report } from "../watch-DVBJ9cBq.js";
2
2
  import { t as peerHint } from "../peer-BOr_kJE1.js";
3
3
  import { createRequire } from "node:module";
4
4
  //#region src/unplugin/index.ts
@@ -9,19 +9,20 @@ function loadCreateUnplugin() {
9
9
  throw new Error(peerHint("unplugin", "permdock/unplugin"));
10
10
  }
11
11
  }
12
- function report(message) {
13
- if (message !== void 0) process.stderr.write(`permdock: ${message}\n`);
14
- }
15
12
  function collectPlugin(options) {
13
+ const schedulers = /* @__PURE__ */ new Map();
14
+ function schedulerFor(cwd) {
15
+ const scheduler = schedulers.get(cwd) ?? createCollectScheduler(cwd, options);
16
+ schedulers.set(cwd, scheduler);
17
+ return scheduler;
18
+ }
16
19
  return {
17
20
  name: "permdock-collect",
18
21
  async buildStart() {
19
- report(await runPluginCollect(process.cwd(), options, options?.check === true));
22
+ report(await schedulerFor(process.cwd()).run(options?.check === true));
20
23
  },
21
- watchChange() {
22
- runPluginCollect(process.cwd(), options, false).then(report, (error) => {
23
- report(error instanceof Error ? error.message : String(error));
24
- });
24
+ watchChange(id) {
25
+ schedulerFor(process.cwd()).changed(id);
25
26
  }
26
27
  };
27
28
  }
@@ -0,0 +1,2 @@
1
+ import { t as runUsage } from "./usage-ItS7nLcl.js";
2
+ export { runUsage };
@@ -1,4 +1,4 @@
1
- import { a as listArg, i as globalArgs, t as COMMAND_DESCRIPTIONS } from "./commands-BMh_Etm2.js";
1
+ import { a as listArg, i as globalArgs, t as COMMAND_DESCRIPTIONS } from "./commands-DSxCqG9A.js";
2
2
  import { defineCommand } from "citty";
3
3
  //#region src/cli/commands/usage.ts
4
4
  function usage(ctx) {
@@ -24,7 +24,7 @@ function usage(ctx) {
24
24
  }
25
25
  },
26
26
  async run({ args: parsed, rawArgs }) {
27
- const result = await (await import("./usage-PyEor6GA.js")).runUsage({
27
+ const result = await (await import("./usage-DorAJiU_.js")).runUsage({
28
28
  cwd: ctx.cwd,
29
29
  config: ctx.config,
30
30
  ignore: listArg(rawArgs, "ignore"),
@@ -1,40 +1,77 @@
1
- import { c as getResource } from "./permissions-DC7GROPA.js";
2
- import { i as USAGE_REPORT_SCHEMA } from "./version-CnSh33Fj.js";
3
- import { o as jsonSchemaOf } from "./catalog-doc-BSo_Q_-6.js";
4
- import { n as listSourceFiles, r as rel } from "./files-B_wAGYmt.js";
5
- import { a as loadModule, n as asPolicy, o as pickNamed } from "./load-BZ24CpZP.js";
6
- import { t as runCollect } from "./collect-O-tOtbnk.js";
7
- import { a as usageResult } from "./errors-DSMnAVNa.js";
8
- import { existsSync, readFileSync } from "node:fs";
9
- import { resolve } from "node:path";
10
- import { parseSync } from "oxc-parser";
1
+ import { c as getResource } from "./permissions-DVoF6dMt.js";
2
+ import { o as usageResult } from "./errors-CWfoNg9N.js";
3
+ import { a as USAGE_REPORT_SCHEMA } from "./version-BvacVTZR.js";
4
+ import { o as jsonSchemaOf } from "./catalog-doc-DdGm82XT.js";
5
+ import { i as rel, r as listSourceFiles } from "./files-DWUN9PzI.js";
6
+ import { a as loadModule, n as asPolicy, o as pickNamed } from "./load-DhWEB9P1.js";
7
+ import { r as runCollect } from "./collect-DSTE3ml9.js";
8
+ import { existsSync, readFileSync, realpathSync } from "node:fs";
9
+ import { dirname, resolve } from "node:path";
10
+ import { fileURLToPath, pathToFileURL } from "node:url";
11
+ import { createJiti } from "jiti";
12
+ import { Visitor, parseSync } from "oxc-parser";
13
+ import { isBuiltin } from "node:module";
11
14
  //#region src/cli/doctor-source.ts
15
+ /** Entries a client file must not import; `tests/cli/doctor-entries.test.ts` keeps it in step with `exports`. */
12
16
  const SERVER_SPECIFIERS = [
13
- "permdock/server",
14
- "permdock/next",
15
- "permdock/hono",
16
- "permdock/mcp",
17
+ "permdock/a2a",
18
+ "permdock/ai-sdk",
17
19
  "permdock/approvals",
18
- "permdock/jwt",
19
- "permdock/supabase",
20
- "permdock/ssf",
20
+ "permdock/authzen",
21
21
  "permdock/better-auth",
22
+ "permdock/better-supabase",
23
+ "permdock/claude-agent",
22
24
  "permdock/clerk",
25
+ "permdock/cloud",
23
26
  "permdock/convex",
24
- "permdock/pdp",
25
- "permdock/ai-sdk",
26
- "permdock/claude-agent",
27
+ "permdock/drizzle",
28
+ "permdock/elysia",
27
29
  "permdock/eve",
28
- "permdock/openai"
29
- ];
30
- const ADAPTER_SPECIFIERS = [
30
+ "permdock/express",
31
+ "permdock/fastify",
31
32
  "permdock/hono",
32
- "permdock/next",
33
+ "permdock/jwt",
34
+ "permdock/kysely",
33
35
  "permdock/mcp",
36
+ "permdock/nest",
37
+ "permdock/next",
38
+ "permdock/node",
39
+ "permdock/openai",
40
+ "permdock/openapi",
41
+ "permdock/orpc",
42
+ "permdock/otel",
43
+ "permdock/pdp",
44
+ "permdock/prisma",
45
+ "permdock/scim",
46
+ "permdock/server",
47
+ "permdock/ssf",
48
+ "permdock/supabase",
49
+ "permdock/supabase/middleware",
50
+ "permdock/terminal",
51
+ "permdock/trpc"
52
+ ];
53
+ /** Entries that feed request, tool or model data into a check. */
54
+ const ADAPTER_SPECIFIERS = [
55
+ "permdock/a2a",
34
56
  "permdock/ai-sdk",
57
+ "permdock/authzen",
35
58
  "permdock/claude-agent",
59
+ "permdock/elysia",
60
+ "permdock/eve",
36
61
  "permdock/express",
37
- "permdock/fastify"
62
+ "permdock/fastify",
63
+ "permdock/hono",
64
+ "permdock/mcp",
65
+ "permdock/nest",
66
+ "permdock/next",
67
+ "permdock/node",
68
+ "permdock/openai",
69
+ "permdock/orpc",
70
+ "permdock/server",
71
+ "permdock/supabase/middleware",
72
+ "permdock/terminal",
73
+ "permdock/trpc",
74
+ "permdock/webmcp"
38
75
  ];
39
76
  const UNTRUSTED_CLAIMS = [
40
77
  "user_metadata",
@@ -43,7 +80,6 @@ const UNTRUSTED_CLAIMS = [
43
80
  "clientMetadata",
44
81
  "preferred_username"
45
82
  ];
46
- const JWKS_OPTION = /(?<!\b(?:const|let|var)\s+)\bjwks\s*:/u;
47
83
  function withoutComments(source) {
48
84
  const { comments } = parseSync(source.file, source.text);
49
85
  let text = source.text;
@@ -53,10 +89,62 @@ function withoutComments(source) {
53
89
  function isClientSource(source, clientEntries) {
54
90
  return clientEntries.has(source.file) || source.text.includes("'use client'") || source.text.includes("\"use client\"") || source.file.includes(".client.");
55
91
  }
56
- function pd001(sources, clientEntries = /* @__PURE__ */ new Set()) {
92
+ /** Specifiers a module loads at runtime: value imports, re-exports and literal dynamic imports. */
93
+ function runtimeSpecifiers(source) {
94
+ const { module } = parseSync(source.file, source.text);
95
+ const out = /* @__PURE__ */ new Set();
96
+ for (const item of module.staticImports) if (item.entries.length === 0 || item.entries.some((entry) => !entry.isType)) out.add(item.moduleRequest.value);
97
+ for (const item of module.staticExports) for (const entry of item.entries) if (entry.moduleRequest !== null && !entry.isType) out.add(entry.moduleRequest.value);
98
+ for (const item of module.dynamicImports) {
99
+ const literal = /^\s*(['"`])([^'"`$]+)\1\s*$/u.exec(source.text.slice(item.moduleRequest.start, item.moduleRequest.end));
100
+ if (literal?.[2] !== void 0) out.add(literal[2]);
101
+ }
102
+ return [...out];
103
+ }
104
+ function realFile(path) {
105
+ try {
106
+ return realpathSync(path);
107
+ } catch {
108
+ return path;
109
+ }
110
+ }
111
+ /**
112
+ * A resolver for imports of `file`, the way the bundler resolves them:
113
+ * relative paths with or without an extension, the `paths` of the nearest
114
+ * `tsconfig.json`, and package names through `node_modules` and each
115
+ * package's `exports`. An unresolvable specifier gives `undefined`.
116
+ */
117
+ function resolverFor(file) {
118
+ const jiti = createJiti(file, { tsconfigPaths: dirname(file) });
119
+ const parentURL = pathToFileURL(file);
120
+ return (specifier) => {
121
+ if (specifier === "" || isBuiltin(specifier)) return;
122
+ try {
123
+ const url = jiti.esmResolve(specifier, {
124
+ parentURL,
125
+ try: true
126
+ });
127
+ const path = url?.startsWith("file:") === true ? fileURLToPath(url) : void 0;
128
+ return path !== void 0 && existsSync(path) ? realFile(path) : void 0;
129
+ } catch {
130
+ return;
131
+ }
132
+ };
133
+ }
134
+ function pd001(sources, clientEntries = /* @__PURE__ */ new Set(), policy) {
57
135
  const findings = [];
136
+ const policyFile = policy === void 0 ? void 0 : realFile(resolve(policy.cwd, policy.path));
58
137
  for (const source of sources) {
59
138
  if (!isClientSource(source, clientEntries)) continue;
139
+ if (policy !== void 0 && policyFile !== void 0) {
140
+ const resolveImport = resolverFor(resolve(policy.cwd, source.file));
141
+ for (const specifier of runtimeSpecifiers(source)) if (specifier !== "permdock" && !specifier.startsWith("permdock/") && resolveImport(specifier) === policyFile) findings.push({
142
+ code: "PD001",
143
+ severity: "error",
144
+ message: `${source.file} imports the policy module through ${specifier}`,
145
+ fix: "decide on the server and pass a snapshot to the client ('permdock/react'); never import the policy into a client entry"
146
+ });
147
+ }
60
148
  for (const spec of SERVER_SPECIFIERS) if (source.text.includes(`'${spec}'`) || source.text.includes(`"${spec}"`)) findings.push({
61
149
  code: "PD001",
62
150
  severity: "error",
@@ -137,29 +225,92 @@ function pd013(sources) {
137
225
  }
138
226
  return findings;
139
227
  }
228
+ function unwrapped(node) {
229
+ let current = node ?? void 0;
230
+ while (current?.type === "TSAsExpression" || current?.type === "TSSatisfiesExpression" || current?.type === "ParenthesizedExpression") current = current.expression;
231
+ return current;
232
+ }
233
+ function propertyName(property) {
234
+ if (property.computed) return;
235
+ const key = property.key;
236
+ if (key.type === "Identifier") return key.name;
237
+ return key.type === "Literal" && typeof key.value === "string" ? key.value : void 0;
238
+ }
239
+ function stringValue(node) {
240
+ const value = unwrapped(node);
241
+ if (value?.type === "Literal") return typeof value.value === "string" ? value.value : void 0;
242
+ return value?.type === "TemplateLiteral" ? value.quasis[0]?.value.cooked ?? void 0 : void 0;
243
+ }
244
+ function isPermDockSpecifier(value) {
245
+ return value === "permdock" || value.startsWith("permdock/");
246
+ }
247
+ function permdockOptionObjects(source) {
248
+ const { program } = parseSync(source.file, source.text);
249
+ const functions = /* @__PURE__ */ new Set();
250
+ const namespaces = /* @__PURE__ */ new Set();
251
+ const constants = /* @__PURE__ */ new Map();
252
+ const calls = [];
253
+ new Visitor({
254
+ ImportDeclaration(node) {
255
+ if (node.importKind === "type" || !isPermDockSpecifier(node.source.value)) return;
256
+ for (const specifier of node.specifiers) if (specifier.type === "ImportNamespaceSpecifier") namespaces.add(specifier.local.name);
257
+ else if (specifier.type === "ImportDefaultSpecifier" || specifier.importKind !== "type") functions.add(specifier.local.name);
258
+ },
259
+ VariableDeclarator(node) {
260
+ const init = unwrapped(node.init);
261
+ if (node.id.type === "Identifier" && init?.type === "ObjectExpression") constants.set(node.id.name, init);
262
+ },
263
+ CallExpression(node) {
264
+ calls.push(node);
265
+ }
266
+ }).visit(program);
267
+ const objects = [];
268
+ const collect = (node) => {
269
+ const value = unwrapped(node);
270
+ const target = value?.type === "Identifier" ? constants.get(value.name) : value;
271
+ if (target?.type !== "ObjectExpression" || objects.includes(target)) return;
272
+ objects.push(target);
273
+ for (const property of target.properties) if (property.type === "Property") collect(property.value);
274
+ };
275
+ for (const call of calls) {
276
+ const callee = call.callee;
277
+ if (callee.type === "Identifier" && functions.has(callee.name) || callee.type === "MemberExpression" && callee.object.type === "Identifier" && namespaces.has(callee.object.name)) for (const argument of call.arguments) collect(argument);
278
+ }
279
+ return objects;
280
+ }
140
281
  function pd014(sources) {
141
282
  const findings = [];
142
283
  for (const source of sources) {
143
- const text = withoutComments(source);
144
- if (/discovery:\s*['"]http:/u.test(text)) findings.push({
145
- code: "PD014",
146
- severity: "error",
147
- message: `${source.file} uses a plain-HTTP discovery URL`,
148
- fix: "use an https: issuer"
149
- });
150
- const setsJwks = JWKS_OPTION.test(text);
151
- if (/discovery\s*:/u.test(text) && setsJwks) findings.push({
152
- code: "PD014",
153
- severity: "error",
154
- message: `${source.file} sets discovery together with jwks or issuer`,
155
- fix: "use discovery alone, or jwks plus issuer"
156
- });
157
- if (setsJwks && !/\bissuer\s*[:,}]/u.test(text) && !/discovery\s*:/u.test(text)) findings.push({
158
- code: "PD014",
159
- severity: "error",
160
- message: `${source.file} sets jwks without issuer`,
161
- fix: "set issuer with jwks, or switch to discovery"
162
- });
284
+ if (!source.text.includes("permdock")) continue;
285
+ for (const object of permdockOptionObjects(source)) {
286
+ const keys = /* @__PURE__ */ new Map();
287
+ for (const property of object.properties) {
288
+ if (property.type !== "Property") continue;
289
+ const name = propertyName(property);
290
+ if (name !== void 0) keys.set(name, property.value);
291
+ }
292
+ const discovery = keys.get("discovery");
293
+ const setsDiscovery = keys.has("discovery");
294
+ const setsJwks = keys.has("jwks");
295
+ if (stringValue(discovery)?.startsWith("http:") === true) findings.push({
296
+ code: "PD014",
297
+ severity: "error",
298
+ message: `${source.file} uses a plain-HTTP discovery URL`,
299
+ fix: "use an https: issuer"
300
+ });
301
+ if (setsDiscovery && (setsJwks || keys.has("issuer"))) findings.push({
302
+ code: "PD014",
303
+ severity: "error",
304
+ message: `${source.file} sets discovery together with jwks or issuer`,
305
+ fix: "use discovery alone, or jwks plus issuer"
306
+ });
307
+ if (setsJwks && !setsDiscovery && !keys.has("issuer")) findings.push({
308
+ code: "PD014",
309
+ severity: "error",
310
+ message: `${source.file} sets jwks without issuer`,
311
+ fix: "set issuer with jwks, or switch to discovery"
312
+ });
313
+ }
163
314
  }
164
315
  return findings;
165
316
  }
@@ -288,7 +439,7 @@ function pd036(sources) {
288
439
  for (const match of source.text.matchAll(PROTECT_CALL)) {
289
440
  const open = match.index + match[0].length - 1;
290
441
  const args = callArguments(source.text, open);
291
- if (args?.length !== 1) continue;
442
+ if (args?.length !== 1 || args[0]?.trim() === "null") continue;
292
443
  const route = idRouteOf(source, match.index);
293
444
  if (route === void 0) continue;
294
445
  const line = source.text.slice(0, match.index).split("\n").length;
@@ -305,14 +456,14 @@ function pd036(sources) {
305
456
  //#endregion
306
457
  //#region src/cli/usage.ts
307
458
  async function runUsage(input) {
308
- const collected = await runCollect({
459
+ const collected = input.collected === void 0 ? await runCollect({
309
460
  cwd: input.cwd,
310
461
  config: input.config,
311
462
  collect: input.config.collect ?? {},
312
463
  check: true,
313
464
  now: input.now,
314
465
  io: input.io
315
- });
466
+ }) : await input.collected();
316
467
  if (collected.document === void 0 || collected.scan === void 0) return {
317
468
  code: 2,
318
469
  output: collected.message
@@ -322,17 +473,8 @@ async function runUsage(input) {
322
473
  code: 2,
323
474
  output: "usage: set policy in permdock.config.ts"
324
475
  };
325
- const policyAbs = resolve(input.cwd, policyRel);
326
- if (!existsSync(policyAbs)) return {
327
- code: 2,
328
- output: `PermDock CLI: policy module not found: ${policyRel}`
329
- };
330
- let policy;
331
- try {
332
- policy = asPolicy(pickNamed(await loadModule(policyAbs), ["policy"]));
333
- } catch (error) {
334
- return usageResult(error);
335
- }
476
+ const policy = await usagePolicy(input.cwd, policyRel, input.policy);
477
+ if (!("roles" in policy)) return policy;
336
478
  const granted = /* @__PURE__ */ new Set();
337
479
  const mergedRoles = /* @__PURE__ */ new Set();
338
480
  for (const role of policy.roles) {
@@ -395,6 +537,22 @@ async function runUsage(input) {
395
537
  output: input.json ? `${JSON.stringify(report, null, 2)}\n` : formatUsage(report)
396
538
  };
397
539
  }
540
+ async function usagePolicy(cwd, policyRel, loaded) {
541
+ if (loaded !== void 0) return await loaded() ?? {
542
+ code: 2,
543
+ output: `PermDock CLI: policy module failed to load: ${policyRel}`
544
+ };
545
+ const policyAbs = resolve(cwd, policyRel);
546
+ if (!existsSync(policyAbs)) return {
547
+ code: 2,
548
+ output: `PermDock CLI: policy module not found: ${policyRel}`
549
+ };
550
+ try {
551
+ return asPolicy(pickNamed(await loadModule(policyAbs), ["policy"]));
552
+ } catch (error) {
553
+ return usageResult(error);
554
+ }
555
+ }
398
556
  const CLIENT_CALLS = /* @__PURE__ */ new Set([
399
557
  "usePermission",
400
558
  "can",
@@ -462,8 +620,13 @@ function conditionFields(condition, out) {
462
620
  case "related":
463
621
  add(condition.field);
464
622
  if (condition.restricted !== void 0) add(condition.restricted);
623
+ if (condition.restrictedAncestors !== void 0) {
624
+ add(condition.restrictedAncestors.id);
625
+ add(condition.restrictedAncestors.parent);
626
+ }
465
627
  break;
466
- case "opaque": break;
628
+ case "opaque":
629
+ case "liveSession": break;
467
630
  default: throw new Error(`unknown condition ${String(condition)}`);
468
631
  }
469
632
  }
@@ -0,0 +1,26 @@
1
+ import { a as ProblemDetails } from "./errors-DPdqI50v.js";
2
+ import { StandardSchemaV1 } from "@standard-schema/spec";
3
+ //#region src/core/validation-error.d.ts
4
+ /** The base of every Problem Details `type` URI; defined here so a validation error does not pull in the Problem Details builders. */
5
+ declare const PROBLEM_BASE = "https://permdock.com/problems";
6
+ declare class PermDockValidationError extends Error {
7
+ override readonly name: "PermDockValidationError";
8
+ readonly code: "invalid-data" | "async-schema" | "no-schema" | "non-portable-condition";
9
+ readonly permission: string;
10
+ readonly resource: string;
11
+ readonly issues: readonly StandardSchemaV1.Issue[];
12
+ readonly boundary: string;
13
+ constructor(input: {
14
+ readonly code: "invalid-data" | "async-schema" | "no-schema" | "non-portable-condition";
15
+ readonly permission: string;
16
+ readonly resource: string;
17
+ readonly issues?: readonly StandardSchemaV1.Issue[];
18
+ readonly boundary: string;
19
+ readonly message: string;
20
+ });
21
+ toProblemDetails(options?: {
22
+ readonly instance?: string;
23
+ }): ProblemDetails;
24
+ }
25
+ //#endregion
26
+ export { PermDockValidationError as n, PROBLEM_BASE as t };
@@ -0,0 +1,33 @@
1
+ import { t as compact } from "./compact-y6vfu2_f.js";
2
+ //#region src/core/validation-error.ts
3
+ /** The base of every Problem Details `type` URI; defined here so a validation error does not pull in the Problem Details builders. */
4
+ const PROBLEM_BASE = "https://permdock.com/problems";
5
+ var PermDockValidationError = class extends Error {
6
+ name = "PermDockValidationError";
7
+ code;
8
+ permission;
9
+ resource;
10
+ issues;
11
+ boundary;
12
+ constructor(input) {
13
+ super(input.message);
14
+ this.code = input.code;
15
+ this.permission = input.permission;
16
+ this.resource = input.resource;
17
+ this.issues = input.issues ?? [];
18
+ this.boundary = input.boundary;
19
+ }
20
+ toProblemDetails(options) {
21
+ return compact({
22
+ type: `${PROBLEM_BASE}/validation`,
23
+ title: "Invalid resource data",
24
+ status: 400,
25
+ detail: this.message,
26
+ instance: options?.instance,
27
+ permission: this.permission,
28
+ issues: this.issues
29
+ });
30
+ }
31
+ };
32
+ //#endregion
33
+ export { PermDockValidationError as n, PROBLEM_BASE as t };