permdock 0.4.0 → 0.6.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 (515) hide show
  1. package/README.md +37 -35
  2. package/dist/{schema-Bol6gqXA.js → 2020-C9VN-x8c.js} +5 -130
  3. package/dist/a2a/index.d.ts +6 -6
  4. package/dist/a2a/index.js +14 -17
  5. package/dist/{adapter-context-mlWsVGGg.js → adapter-context-CRhqyzCk.js} +1 -1
  6. package/dist/adoption-scan-DCYe60Pi.js +107 -0
  7. package/dist/agent/index.d.ts +3 -0
  8. package/dist/agent/index.js +1 -0
  9. package/dist/ai-sdk/index.d.ts +18 -35
  10. package/dist/ai-sdk/index.js +37 -23
  11. package/dist/{app-data-CV8pqqMi.js → app-data-MuyzVqX8.js} +2 -1
  12. package/dist/approval-header-CJACtHkv.js +23 -0
  13. package/dist/approval-prompt-Dg5LeAcT.js +62 -0
  14. package/dist/approval-prompt-DvSSPQJX.d.ts +57 -0
  15. package/dist/approvals/index.d.ts +5 -3
  16. package/dist/approvals/index.js +8 -5
  17. package/dist/approvals-p1PGoVjb.js +995 -0
  18. package/dist/arazzo-41WuzHou.js +36 -0
  19. package/dist/{arazzo-C4BcskbX.js → arazzo-CaUVBn7D.js} +20 -14
  20. package/dist/args-IIolxxKA.js +197 -0
  21. package/dist/astro/index.d.ts +43 -0
  22. package/dist/astro/index.js +27 -0
  23. package/dist/audience-DabClFLQ.js +55 -0
  24. package/dist/auth-DRLEizbL.js +178 -0
  25. package/dist/authzen/index.d.ts +26 -6
  26. package/dist/authzen/index.js +94 -79
  27. package/dist/automation-BNM3TtDo.d.ts +114 -0
  28. package/dist/automation-DVjOckjV.js +157 -0
  29. package/dist/better-auth/index.d.ts +8 -6
  30. package/dist/better-auth/index.js +9 -8
  31. package/dist/better-supabase/index.d.ts +357 -30
  32. package/dist/better-supabase/index.js +936 -194
  33. package/dist/{bind-kk-uyCwH.js → bind-CAvgUuKs.js} +14 -10
  34. package/dist/{bind-BzqG8SMb.d.ts → bind-DOyrv6zi.d.ts} +12 -10
  35. package/dist/body-CH5of8Ne.js +10 -0
  36. package/dist/body-text-QcXok_SI.js +52 -0
  37. package/dist/{build-instance-DIIV9DbC.js → build-instance-Bu_eDqYw.js} +4 -3
  38. package/dist/{canonical-json-CFKyFOke.js → canonical-json-BC8_nMTw.js} +5 -3
  39. package/dist/{capability-CksyCWDH.d.ts → capability-Drg-1YhL.d.ts} +44 -25
  40. package/dist/{capability-txATtKV4.js → capability-N1K9IpqS.js} +68 -42
  41. package/dist/casbin-Cr7RLtA3.js +30 -0
  42. package/dist/casbin-Dyu2gnUD.js +234 -0
  43. package/dist/casl-64gpT-8x.js +24 -0
  44. package/dist/casl-DjEDhTCP.js +299 -0
  45. package/dist/catalog/index.d.ts +74 -2
  46. package/dist/catalog/index.js +51 -2
  47. package/dist/catalog-BoWglDPI.js +1 -0
  48. package/dist/catalog-DZVbrF-z.js +52 -0
  49. package/dist/{catalog-tZUyOfOv.js → catalog-HD2gf5mY.js} +51 -6
  50. package/dist/{catalog-doc-DWtg0gGR.js → catalog-doc-Cdn7-0pQ.js} +45 -23
  51. package/dist/catalog-fingerprint-CCP0-yQS.js +153 -0
  52. package/dist/chat/index.d.ts +2 -0
  53. package/dist/chat/index.js +224 -0
  54. package/dist/chat-sdk/index.d.ts +87 -0
  55. package/dist/chat-sdk/index.js +197 -0
  56. package/dist/claims-map-7oQ3ue4X.js +13 -0
  57. package/dist/claims-map-Ca-QX8C6.d.ts +32 -0
  58. package/dist/claude-agent/index.d.ts +7 -14
  59. package/dist/claude-agent/index.js +24 -27
  60. package/dist/clerk/index.d.ts +9 -8
  61. package/dist/clerk/index.js +9 -14
  62. package/dist/cli/bin.js +36 -17
  63. package/dist/cli/index.d.ts +19 -5
  64. package/dist/cli/index.js +164 -4
  65. package/dist/cloud/index.d.ts +102 -63
  66. package/dist/cloud/index.js +239 -340
  67. package/dist/cloud-ytQ3uviA.js +87 -0
  68. package/dist/codemod-5mpSpnUY.js +37 -0
  69. package/dist/codemod-ua2hHy7w.js +2084 -0
  70. package/dist/collect-Ci6akVwH.js +55 -0
  71. package/dist/collect-D7eQDffE.js +1 -0
  72. package/dist/{collect-2SrB7lfk.js → collect-mLTY4nwb.js} +75 -11
  73. package/dist/command-L8EstFNm.js +6 -0
  74. package/dist/compile/index.d.ts +1 -1
  75. package/dist/compile/index.js +1 -2
  76. package/dist/{compile-CtTP7eur.d.ts → compile-1bsAezL0.d.ts} +5 -3
  77. package/dist/{compile-CcEu2ZQ1.js → compile-CMqMx_IN.js} +11 -8
  78. package/dist/completion-BTFrHZhX.js +143 -0
  79. package/dist/config-Bj2Ixq3d.js +26 -0
  80. package/dist/{config-BIjREpyE.js → config-bs_kZeYq.js} +12 -7
  81. package/dist/{config-report--Xb9APJS.js → config-report-DSpsLpCE.js} +15 -5
  82. package/dist/{connection-DUsczpB5.js → connection-DjhIJSs2.js} +6 -5
  83. package/dist/{context-DieZVJXu.js → context-B_u3_bDJ.js} +2 -2
  84. package/dist/convex/index.d.ts +11 -10
  85. package/dist/convex/index.js +6 -4
  86. package/dist/create-B30OMUOJ.d.ts +107 -0
  87. package/dist/create-CBMmFie-.d.ts +138 -0
  88. package/dist/create-CGm28gyI.js +130 -0
  89. package/dist/create-CQWIpUG-.js +403 -0
  90. package/dist/{create-BBO24vj6.js → create-DCF2SvoT.js} +31 -32
  91. package/dist/create-D_NmPOdH.d.ts +110 -0
  92. package/dist/{credential-kue0qpbm.js → credential-BcoiejpY.js} +152 -31
  93. package/dist/credentials-DPyHmYz5.js +74 -0
  94. package/dist/delegation-j6-rc37o.js +286 -0
  95. package/dist/delivery/index.d.ts +5 -0
  96. package/dist/delivery/index.js +5 -0
  97. package/dist/delivery-DCAgNyCn.js +499 -0
  98. package/dist/delivery-event-xX4obB8F.js +40 -0
  99. package/dist/{denied-text-DfRk15uw.d.ts → denied-text-CiFQNuMV.d.ts} +5 -5
  100. package/dist/{describe-C3ldA9os.d.ts → describe-B5qgDvEW.d.ts} +2 -2
  101. package/dist/{describe-Cgkp7eP0.js → describe-BybMRY7A.js} +6 -2
  102. package/dist/device-BARQ8eYG.js +193 -0
  103. package/dist/{diff-rpqoe7Ag.js → diff-3jbx6Rm4.js} +60 -54
  104. package/dist/diff-CmuSD3vc.js +37 -0
  105. package/dist/doctor-3ZqNHX_G.js +44 -0
  106. package/dist/{doctor-owlv6ddh.js → doctor-BdZw53-k.js} +245 -50
  107. package/dist/drizzle/index.d.ts +5 -3
  108. package/dist/drizzle/index.js +2 -2
  109. package/dist/elysia/index.d.ts +16 -13
  110. package/dist/elysia/index.js +13 -12
  111. package/dist/env-DJZrPjRi.js +8 -0
  112. package/dist/errors-BDUwg2qC.js +27 -0
  113. package/dist/{errors-drnfxYtm.js → errors-BKy0EfhN.js} +5 -9
  114. package/dist/errors-BWXBMaKK.d.ts +11 -0
  115. package/dist/errors-CWTY6uih.js +143 -0
  116. package/dist/{errors-OD_4c__H.d.ts → errors-DH5QEGXh.d.ts} +2 -2
  117. package/dist/evaluate-CNClBvcj.js +1785 -0
  118. package/dist/evaluations-C_1vdSZc.d.ts +32 -0
  119. package/dist/{evaluations-C9YJsv3H.js → evaluations-beAooV0n.js} +145 -34
  120. package/dist/eve/index.d.ts +12 -16
  121. package/dist/eve/index.js +22 -28
  122. package/dist/event-time-CsegxXxB.js +23 -0
  123. package/dist/expiry-D4_YKRKD.js +52 -0
  124. package/dist/express/index.d.ts +13 -10
  125. package/dist/express/index.js +12 -11
  126. package/dist/fastify/index.d.ts +25 -22
  127. package/dist/fastify/index.js +13 -12
  128. package/dist/fetch-adapter-DD_gfmrC.js +120 -0
  129. package/dist/fetch-adapter-Dw0MTS3D.d.ts +31 -0
  130. package/dist/fields-OYG_JR78.js +203 -0
  131. package/dist/files-C5ZI27eV.js +124 -0
  132. package/dist/{fixtures-h2eG2OZV.js → fixtures-B7XrLeY7.js} +8 -7
  133. package/dist/flags-C3DktBDY.js +86 -0
  134. package/dist/{from-snapshot-7REQZe0H.js → from-snapshot-CTCMsFZk.js} +55 -52
  135. package/dist/{grantee-conditions-MQs5NIuX.js → grantee-conditions-CcXf8hMM.js} +4 -3
  136. package/dist/{grantee-CXY-0C87.js → grantee-hxrUsbpM.js} +16 -6
  137. package/dist/{grantee-match-fxYp9Nmt.js → grantee-match-DbENBHLB.js} +5 -4
  138. package/dist/h3/index.d.ts +37 -0
  139. package/dist/h3/index.js +35 -0
  140. package/dist/headers-BIjfMaoC.js +8 -0
  141. package/dist/headers-CIbDTUTK.d.ts +7 -0
  142. package/dist/{helpers-C9YmyBIa.js → helpers-CBYVMjwh.js} +45 -38
  143. package/dist/hono/index.d.ts +12 -9
  144. package/dist/hono/index.js +13 -12
  145. package/dist/hosted-B46-5LYE.js +315 -0
  146. package/dist/hosted-BPk51-kX.d.ts +78 -0
  147. package/dist/{http-DPuDaChb.d.ts → http-B_LphE5Y.d.ts} +1 -2
  148. package/dist/http-DXJ37RDA.js +46 -0
  149. package/dist/{http-BEbdMZ05.js → http-ujKm0JXE.js} +1 -2
  150. package/dist/{import-UHk1N7vH.js → import-CNV7I2Dw.js} +25 -20
  151. package/dist/{import-BFIlhetD.js → import-wyqXUyjm.js} +190 -53
  152. package/dist/index-B8YjkEZ4.d.ts +210 -0
  153. package/dist/index-C-6Letxg.d.ts +431 -0
  154. package/dist/index-CaxrMD1A.d.ts +1 -0
  155. package/dist/{index-BwMe94Xq.d.ts → index-Ch8LpNDp.d.ts} +34 -16
  156. package/dist/index-Cp_ilKi1.d.ts +91 -0
  157. package/dist/index-CueFnxQc.d.ts +110 -0
  158. package/dist/index-DuWxc5dt.d.ts +909 -0
  159. package/dist/index.d.ts +19 -15
  160. package/dist/index.js +31 -21
  161. package/dist/init-DeMYsnYJ.js +96 -0
  162. package/dist/init-GG6Jh8HD.js +95 -0
  163. package/dist/{instance-options-plkrsAog.d.ts → instance-options-BsVpyGIk.d.ts} +2 -2
  164. package/dist/instance-snapshot-BOEhcqIF.js +601 -0
  165. package/dist/instant-BluqDvyS.js +19 -0
  166. package/dist/internals-Dk8A8fX3.js +17 -0
  167. package/dist/{json-schema-DBkdUuCO.js → json-schema-B-vAwlde.js} +45 -6
  168. package/dist/json-schema-CN_iLFH2.d.ts +40 -0
  169. package/dist/jwt/index.d.ts +18 -11
  170. package/dist/jwt/index.js +156 -135
  171. package/dist/{kernel-CB3LrIJM.js → kernel-D0NVb1cK.js} +52 -24
  172. package/dist/kysely/index.d.ts +5 -3
  173. package/dist/kysely/index.js +2 -2
  174. package/dist/load-BxEtwlBS.js +1 -0
  175. package/dist/{load-C3_oTHyO.js → load-DFS_ry0W.js} +22 -6
  176. package/dist/{load-jose-BL6LH4bL.js → load-jose-DZ4dnjri.js} +1 -4
  177. package/dist/login-Dfe5RlYk.js +68 -0
  178. package/dist/login-imhuwvn3.js +254 -0
  179. package/dist/manifest-C8IzW3Do.js +42 -0
  180. package/dist/manifest-dvL2XEe1.js +370 -0
  181. package/dist/manifest-json-CAGzls-C.js +9 -0
  182. package/dist/{manifest-uDS9y5de.d.ts → manifest-mx5ghSFM.d.ts} +9 -2
  183. package/dist/manifest-schema-C0kK_8V0.js +399 -0
  184. package/dist/{map-claims-AVlBaJoa.js → map-claims-D3oRmTk0.js} +13 -10
  185. package/dist/{map-error-BE27PYkE.js → map-error-Dr70oA_3.js} +3 -3
  186. package/dist/{markers-CiwAOZtO.js → markers-C6joDI3o.js} +2 -1
  187. package/dist/mcp/index.d.ts +22 -12
  188. package/dist/mcp/index.js +57 -39
  189. package/dist/{migrate-BwlB5-Wk.js → migrate-CIq4-E9F.js} +53 -14
  190. package/dist/nest/index.d.ts +12 -9
  191. package/dist/nest/index.js +15 -14
  192. package/dist/next/index.d.ts +18 -21
  193. package/dist/next/index.js +13 -11
  194. package/dist/next/plugin.d.ts +1 -1
  195. package/dist/next/plugin.js +2 -2
  196. package/dist/node/index.d.ts +10 -10
  197. package/dist/node/index.js +7 -9
  198. package/dist/{ocsf-uYFXGVw2.js → ocsf-BFp-PZZA.js} +22 -11
  199. package/dist/openai/index.d.ts +9 -16
  200. package/dist/openai/index.js +17 -24
  201. package/dist/openapi/index.d.ts +3 -3
  202. package/dist/openapi/index.js +1 -1
  203. package/dist/{openapi-DBzHQbov.js → openapi-B7HZ0f-r.js} +8 -8
  204. package/dist/openapi-C4dDTVEd.js +138 -0
  205. package/dist/{openapi-BJdBmYDG.js → openapi-DD1SV-5-.js} +10 -9
  206. package/dist/operation-findings-DgATDpvh.js +36 -0
  207. package/dist/operations-X0VM7F3m.d.ts +59 -0
  208. package/dist/orpc/index.d.ts +13 -10
  209. package/dist/orpc/index.js +20 -15
  210. package/dist/otel/index.d.ts +3 -2
  211. package/dist/otel/index.js +30 -7
  212. package/dist/output-1im__-08.js +88 -0
  213. package/dist/output-files-B3IZJksC.js +1 -0
  214. package/dist/{output-files-CgIsvdSa.js → output-files-DhRBBE4n.js} +24 -26
  215. package/dist/{permission-keys-B26jeyUv.js → ownership-DqaJNJPn.js} +1045 -153
  216. package/dist/{package-root-DtNnpmUd.js → package-root-Dk_ETdkp.js} +1 -1
  217. package/dist/{parse-CVFQHk6c.js → parse-Cxq0WxrA.js} +2 -2
  218. package/dist/{parse-local-manifest-DvYUR0QL.d.ts → parse-local-manifest-5ODwqu8b.d.ts} +1 -1
  219. package/dist/{parse-local-manifest-C-q02Pal.js → parse-local-manifest-CVSs6J9I.js} +1 -1
  220. package/dist/parse-request-D_tUXG6M.js +26 -0
  221. package/dist/paths-DXSHAMIa.js +42 -0
  222. package/dist/pdp/index.d.ts +7 -3
  223. package/dist/pdp/index.js +45 -26
  224. package/dist/{peer-BOr_kJE1.js → peer-C8swJ2GH.js} +23 -4
  225. package/dist/peer-CRvC7Hg1.js +1 -0
  226. package/dist/permdock-BrAscV28.js +868 -0
  227. package/dist/permdock-SV8ZINYT.d.ts +502 -0
  228. package/dist/{permission-registry-BsblpB-z.js → permission-registry-Br4jSNVi.js} +3 -3
  229. package/dist/permissions-B-wCP5ZC.js +30 -0
  230. package/dist/{permissions-CCJ6lmxB.js → permissions-BPxlwVhN.js} +4 -3
  231. package/dist/{permissions-COH-KRgT.d.ts → permissions-u_KHg-sN.d.ts} +1 -2
  232. package/dist/policies-DP2nqRoF.js +295 -0
  233. package/dist/{policy-ur0BBK_e.d.ts → policy-77FSAq_V.d.ts} +2 -2
  234. package/dist/{hosted-CBHgkzDl.js → policy-DbM5YYtV.js} +17 -273
  235. package/dist/policy-from-catalog-C2gMa2Dj.js +450 -0
  236. package/dist/policy-module-CTlwMvLI.js +89 -0
  237. package/dist/{policy-types-sp9P1iIV.d.ts → policy-types-n0uRTsW8.d.ts} +460 -632
  238. package/dist/postgrest-CEgRbefE.d.ts +100 -0
  239. package/dist/postgrest-DAjUkF9w.js +575 -0
  240. package/dist/{powersync-cZe4kzhL.js → powersync-BkWWCS1K.js} +23 -24
  241. package/dist/powersync-DISt6SUe.js +62 -0
  242. package/dist/powersync-MMJ2mI2q.js +1 -0
  243. package/dist/preset/index.d.ts +146 -0
  244. package/dist/preset/index.js +1 -0
  245. package/dist/preset-DZdU0tne.js +1768 -0
  246. package/dist/principal-source-pHneukrx.js +103 -0
  247. package/dist/prisma/index.d.ts +6 -3
  248. package/dist/prisma/index.js +2 -2
  249. package/dist/{problem-CnWraVhC.js → problem-CTviyH5L.js} +13 -23
  250. package/dist/{problem-details-rIIo8B2C.d.ts → problem-details-B45V5d2b.d.ts} +1 -1
  251. package/dist/{problem-details-DECUnXAn.js → problem-details-cn5X30gZ.js} +43 -40
  252. package/dist/problem-types-CJ2325SZ.js +5 -0
  253. package/dist/{prompt-CXYhLfsS.js → prompt-DfZLJLIn.js} +2 -2
  254. package/dist/{protected-BN7BUdY1.js → protected-BlF0F6wL.js} +21 -4
  255. package/dist/{protected-B3_P7xuw.d.ts → protected-RFGpakN9.d.ts} +16 -8
  256. package/dist/{provider-Bi-0HNL3.js → provider-B1al-AZz.js} +2 -2
  257. package/dist/{provider-kwHC9CZD.d.ts → provider-DILL9oPK.d.ts} +1 -1
  258. package/dist/{provider-store-Ctt-81Ni.js → provider-store-DM6DNcta.js} +2 -2
  259. package/dist/pull-CvpINcMK.js +1 -0
  260. package/dist/pull-jEwbf80J.js +256 -0
  261. package/dist/push-BD4f15co.js +116 -0
  262. package/dist/pushed-policy-CqtxkV4G.js +238 -0
  263. package/dist/pushed-policy-DCW91KQU.d.ts +57 -0
  264. package/dist/react/index.d.ts +8 -8
  265. package/dist/react/index.js +6 -6
  266. package/dist/react/provider-client.d.ts +1 -1
  267. package/dist/react/provider-client.js +1 -2
  268. package/dist/react-native/index.d.ts +24 -72
  269. package/dist/react-native/index.js +29 -25
  270. package/dist/{refs-f3imMjNW.js → refs-K6eWUJ0H.js} +1 -1
  271. package/dist/{relation-walk-BXnlLtg2.js → relation-walk-3OyDBF0S.js} +2 -2
  272. package/dist/{relations-CvmSpG67.js → relations-BnCWnJGI.js} +3 -3
  273. package/dist/renames-CGj7YwcQ.js +175 -0
  274. package/dist/{replay-COpmZUfx.d.ts → replay-Bkm-Ne4l.d.ts} +1 -1
  275. package/dist/{replay-BsOyTrdV.js → replay-Du1tJjG7.js} +2 -1
  276. package/dist/{request-context-BVM7aWNs.js → request-context-C81Pip9n.js} +3 -3
  277. package/dist/request-schema-CMreVuFM.js +148 -0
  278. package/dist/resend/index.d.ts +126 -0
  279. package/dist/resend/index.js +379 -0
  280. package/dist/{resource-relations-D1Un3pcz.js → resource-relations-D_jw0BFx.js} +1 -1
  281. package/dist/{retire-BFcxL6un.js → retire-CALjIQ7e.js} +2 -2
  282. package/dist/{revocations-Cy06JNx2.d.ts → revocations-R07lFBnX.d.ts} +2 -0
  283. package/dist/rls-BAqP4q66.js +336 -0
  284. package/dist/{rls-BEktUaqg.js → rls-DTvYd-lI.js} +288 -690
  285. package/dist/{role-builder-B4GbKM-i.js → role-builder-uWQZ4v84.js} +14 -207
  286. package/dist/{rpc-nYC3cR_u.js → rpc-VSl5ylaQ.js} +7 -7
  287. package/dist/run-CUKuz0A8.js +723 -0
  288. package/dist/run-DDwUaJDU.js +1 -0
  289. package/dist/run-ticket-DocwaTKn.d.ts +124 -0
  290. package/dist/run-ticket-sxFI6LAk.js +337 -0
  291. package/dist/{runtime-D_tMXnsq.js → runtime-D3VTAiCA.js} +1 -1
  292. package/dist/{saas-DtaA4JuW.js → saas-BCXRuXca.js} +16 -14
  293. package/dist/scan-qvOe0hS3.js +29 -0
  294. package/dist/{schema-DjQBcAP9.js → schema-B4v0Qrac.js} +102 -8
  295. package/dist/schema-yLuBWWsh.js +130 -0
  296. package/dist/scim/index.d.ts +2 -2
  297. package/dist/scim/index.js +1 -2
  298. package/dist/{scim-vFR1O5oG.js → scim-ClHtpyV3.js} +208 -76
  299. package/dist/{scopes-tvpa34ep.js → scopes-CUPSjo9q.js} +12 -7
  300. package/dist/server/index.d.ts +12 -143
  301. package/dist/server/index.js +12 -9
  302. package/dist/server-C3WXAHZj.js +453 -0
  303. package/dist/{server-types-DdqBwZN_.d.ts → server-types-CKQiCnON.d.ts} +51 -68
  304. package/dist/{sha256-BO0swRXL.js → sha256-D9ihqmvd.js} +8 -1
  305. package/dist/{shared-1uhI-e-b.js → shared-BAK8t4Uo.js} +20 -9
  306. package/dist/{shared-JhMeOsDF.js → shared-DvvFzYXe.js} +8 -9
  307. package/dist/signals-D3NcTKUS.js +32 -0
  308. package/dist/sink-4-eQIRWf.d.ts +225 -0
  309. package/dist/sink-BEZSlMS_.js +957 -0
  310. package/dist/{skills-BZdRQkxs.js → skills-B6lVdD_W.js} +13 -6
  311. package/dist/skills-CTYwkl44.js +51 -0
  312. package/dist/snapshot-B7DkYg6g.js +269 -0
  313. package/dist/{snapshot-cache-Cod40D-X.js → snapshot-cache-DZHQ0KF6.js} +11 -5
  314. package/dist/{snapshot-cache-J5T7t_vD.d.ts → snapshot-cache-PXI-vGpY.d.ts} +7 -5
  315. package/dist/solid/index.d.ts +11 -12
  316. package/dist/solid/index.js +7 -7
  317. package/dist/solid-start/index.d.ts +52 -0
  318. package/dist/solid-start/index.js +49 -0
  319. package/dist/{sources-Dljy06zL.d.ts → sources-Xc4zkszI.d.ts} +7 -13
  320. package/dist/{sources-B1-b-R0t.js → sources-vs5dGOsS.js} +125 -119
  321. package/dist/{sql-t8teWOfo.js → sql-B5T1IL83.js} +13 -1
  322. package/dist/src-Cu2m75uo.js +1860 -0
  323. package/dist/ssf/index.d.ts +4 -4
  324. package/dist/ssf/index.js +384 -47
  325. package/dist/standard-webhooks-DgFFD-Ga.js +228 -0
  326. package/dist/standard-webhooks-rbD7LS6h.d.ts +88 -0
  327. package/dist/storage-C2bWdvJH.js +132 -0
  328. package/dist/{store-ILkLUj_o.js → store-BDutJkDL.js} +40 -53
  329. package/dist/{store-options-CbUHDoSe.js → store-options-u0ycEe8s.js} +26 -21
  330. package/dist/{stores-Cxz_80g-.d.ts → stores-BUGNbJTt.d.ts} +7 -8
  331. package/dist/{stores-BHXdSbw9.js → stores-CGhM8BN_.js} +2 -2
  332. package/dist/{stream-Dwsg6WwE.d.ts → stream-CeCMJmBB.d.ts} +2 -2
  333. package/dist/{stream-BMui98KK.js → stream-CvdUS9V1.js} +9 -2
  334. package/dist/style-DiKWnAvn.js +1 -0
  335. package/dist/{style-CTm1AXDT.js → style-Uao76wO7.js} +3 -2
  336. package/dist/subject-BGoM5o8B.js +17 -0
  337. package/dist/supabase/index.d.ts +23 -106
  338. package/dist/supabase/index.js +5 -4
  339. package/dist/supabase/middleware.d.ts +7 -6
  340. package/dist/supabase/middleware.js +13 -11
  341. package/dist/supabase-By_frk3U.js +92 -0
  342. package/dist/{supabase-hook-Cva3ikXz.js → supabase-hook-BMoEhZir.js} +960 -64
  343. package/dist/supabase-hook-CCw5m35C.js +1 -0
  344. package/dist/{supabase-C1TWlnYt.js → supabase-x5JtR2tc.js} +99 -206
  345. package/dist/support-session-C6xJQYut.js +158 -0
  346. package/dist/svelte/Protected.svelte +4 -4
  347. package/dist/svelte/index.d.ts +7 -7
  348. package/dist/svelte/index.js +10 -10
  349. package/dist/svelte/runtime.d.ts +3 -3
  350. package/dist/svelte/runtime.js +3 -3
  351. package/dist/svelte/source.d.ts +7 -7
  352. package/dist/svelte/source.js +4 -4
  353. package/dist/sveltekit/index.d.ts +51 -0
  354. package/dist/sveltekit/index.js +27 -0
  355. package/dist/tanstack-start/index.d.ts +51 -0
  356. package/dist/tanstack-start/index.js +40 -0
  357. package/dist/target-Bw37TFNA.js +51 -0
  358. package/dist/{tenancy-DshjqY0n.js → tenancy-DN2QAx9z.js} +5 -5
  359. package/dist/terminal/index.d.ts +11 -9
  360. package/dist/terminal/index.js +23 -287
  361. package/dist/testing/index.d.ts +311 -38
  362. package/dist/testing/index.js +3475 -201
  363. package/dist/testing/saas/index.d.ts +9 -8
  364. package/dist/testing/saas/index.js +2 -2
  365. package/dist/testing/saas/permissions.d.ts +1 -1
  366. package/dist/testing/saas/permissions.js +1 -2
  367. package/dist/text-BMFRfBqc.js +8 -0
  368. package/dist/{text-diff-BdkkYSbi.js → text-diff-BQcUapOb.js} +1 -1
  369. package/dist/thenable-yD7SabqG.js +31 -0
  370. package/dist/time-DkWjdL98.js +71 -0
  371. package/dist/{token-Bx9qy30p.js → token-BLZcjQgt.js} +15 -6
  372. package/dist/{tool-refusal-CQ7OEia9.js → tool-refusal-CMLN5xhn.js} +2 -2
  373. package/dist/trpc/index.d.ts +12 -9
  374. package/dist/trpc/index.js +16 -14
  375. package/dist/types-8RnwUAvE.d.ts +107 -0
  376. package/dist/{store-9KO4BlkB.d.ts → types-B3_ooZgZ.d.ts} +100 -75
  377. package/dist/{types-Br9IXUBG.d.ts → types-BdtSDbBO.d.ts} +77 -17
  378. package/dist/types-BtHtcKMr.d.ts +157 -0
  379. package/dist/{types-CqrjB9o6.d.ts → types-BzzaHxt3.d.ts} +23 -11
  380. package/dist/types-C791HFu9.d.ts +332 -0
  381. package/dist/types-C863OQiR.d.ts +57 -0
  382. package/dist/{types-ByUo56un.d.ts → types-CVZSNocA.d.ts} +23 -22
  383. package/dist/{types-DHrmBJLH.d.ts → types-CX7AvRqP.d.ts} +7 -7
  384. package/dist/types-C_IiEs64.d.ts +65 -0
  385. package/dist/{types-7rJVLWe5.d.ts → types-Dfv0aTER.d.ts} +63 -11
  386. package/dist/types-DqzsnlSA.js +67 -0
  387. package/dist/{types-DpWfQdSh.d.ts → types-Druu9wLM.d.ts} +46 -11
  388. package/dist/{types-CIlTojhq.d.ts → types-_WhUP7ud.d.ts} +9 -6
  389. package/dist/{types-CUcFZfpU.d.ts → types-lUlG3TVd.d.ts} +2 -1
  390. package/dist/unplugin/index.d.ts +1 -1
  391. package/dist/unplugin/index.js +2 -2
  392. package/dist/usage-CRVl9V3t.js +32 -0
  393. package/dist/usage-CZpSQP6L.js +1 -0
  394. package/dist/{usage-CG9nOYZw.js → usage-SveTRTyr.js} +54 -11
  395. package/dist/{validation-error-BSSw0l_8.d.ts → validation-error-DHUrAkku.d.ts} +1 -1
  396. package/dist/{validity-dVrUEPJt.js → validity-CZ7-y0Cj.js} +32 -15
  397. package/dist/{verifier-DMr_Zmb_.js → verifier-DHuh-okk.js} +18 -7
  398. package/dist/{verify-BztUB3GX.js → verify-BaAKx7t6.js} +645 -50
  399. package/dist/{version-BEogC-rB.js → version-CEbQ5UeM.js} +4 -3
  400. package/dist/version-DXkYUISx.js +1 -0
  401. package/dist/{views-CJsrBS1f.js → views-DTIIO-oQ.js} +22 -5
  402. package/dist/{permission-types-Dg39z9Kv.d.ts → vocabulary-CN8H_9UF.d.ts} +67 -2
  403. package/dist/vue/index.d.ts +9 -10
  404. package/dist/vue/index.js +8 -8
  405. package/dist/waiter-B986w1oK.d.ts +36 -0
  406. package/dist/waiter-BGUtGYoU.js +67 -0
  407. package/dist/watch--ovlPOc0.js +1 -0
  408. package/dist/{watch-zeucB7eF.js → watch-vea54PRw.js} +44 -5
  409. package/dist/webmcp/index.d.ts +2 -2
  410. package/dist/webmcp/index.js +3 -3
  411. package/dist/where-scope-C9vfEphl.js +306 -0
  412. package/dist/who-can-DWBAcaCQ.js +364 -0
  413. package/dist/wire-delegation-Cv3W2eaM.js +36 -0
  414. package/dist/wire-denial-C7PaVYEM.js +27 -0
  415. package/dist/workflow/index.d.ts +5 -0
  416. package/dist/workflow/index.js +223 -0
  417. package/dist/workflow-sdk/index.d.ts +56 -0
  418. package/dist/workflow-sdk/index.js +78 -0
  419. package/dist/{wrap-Cr93qqdP.d.ts → wrap-C5jC6sKI.d.ts} +2 -1
  420. package/dist/{wrap-DWsU_5Bd.js → wrap-gX61EtpB.js} +7 -6
  421. package/package.json +136 -37
  422. package/schemas/access-event-v1.json +118 -0
  423. package/schemas/approval-request-v1.json +34 -1
  424. package/schemas/approval-signature-v1.json +94 -0
  425. package/schemas/automation-event-v1.json +113 -0
  426. package/schemas/capability-v1.json +84 -0
  427. package/schemas/catalog-event-v1.json +87 -0
  428. package/schemas/catalog-v1.json +123 -12
  429. package/schemas/cli-commands-v1.json +164 -0
  430. package/schemas/cli-result-v1.json +96 -0
  431. package/schemas/cloud-api-v1.json +5407 -0
  432. package/schemas/connector-v1.json +408 -0
  433. package/schemas/credential-event-v1.json +81 -0
  434. package/schemas/credential-v1.json +134 -0
  435. package/schemas/decision-event-v1.json +288 -0
  436. package/schemas/delivery-event-v1.json +117 -0
  437. package/schemas/directory-event-v1.json +85 -0
  438. package/schemas/evidence-export-v1.json +54 -0
  439. package/schemas/membership-event-v1.json +93 -0
  440. package/schemas/policy-v1.json +68 -0
  441. package/schemas/pushed-policy-v1.json +236 -0
  442. package/schemas/run-v1.json +162 -0
  443. package/schemas/snapshot-v1.json +138 -0
  444. package/schemas/supabase-claims-v1.json +4 -4
  445. package/schemas/supabase-manifest-v1.json +5 -1
  446. package/schemas/support-session-v1.json +111 -0
  447. package/skills/permdock/SKILL.md +16 -12
  448. package/skills/permdock-agents/SKILL.md +40 -23
  449. package/skills/permdock-agents/references/operations-automations-chat.md +221 -0
  450. package/skills/permdock-agents/references/runtimes.md +22 -18
  451. package/skills/permdock-approvals/SKILL.md +29 -13
  452. package/skills/permdock-approvals/references/delivery-and-waiters.md +172 -0
  453. package/skills/permdock-approvals/references/stores-and-resume.md +21 -7
  454. package/skills/permdock-audit/SKILL.md +3 -3
  455. package/skills/permdock-credentials/SKILL.md +5 -5
  456. package/skills/permdock-credentials/references/tokens-keys-links.md +14 -10
  457. package/skills/permdock-data/SKILL.md +6 -6
  458. package/skills/permdock-data/references/queries-and-rls.md +10 -9
  459. package/skills/permdock-data/references/relationships.md +3 -3
  460. package/skills/permdock-tenancy/SKILL.md +20 -7
  461. package/skills/permdock-tenancy/references/contacts-and-support-sessions.md +122 -0
  462. package/skills/permdock-tenancy/references/ownership-and-custom-roles.md +6 -4
  463. package/skills/permdock-wire/SKILL.md +17 -11
  464. package/skills/permdock-wire/references/adapters.md +139 -51
  465. package/skills/permdock-wire/references/policy-options.md +5 -5
  466. package/skills/permdock-wire/references/presets-and-recipes.md +58 -0
  467. package/dist/approvals-DZL76lKW.js +0 -240
  468. package/dist/arazzo-CD8d0WLb.js +0 -54
  469. package/dist/catalog-6yWAX6Ps.js +0 -2
  470. package/dist/catalog-WHG4kBq7.js +0 -48
  471. package/dist/cloud-C7bSDgX4.js +0 -50
  472. package/dist/cloud-PeBN3IEn.js +0 -118
  473. package/dist/collect-Bw2Jdq1q.js +0 -2
  474. package/dist/collect-CQx4hX4N.js +0 -83
  475. package/dist/commands-Cpip4ULx.js +0 -97
  476. package/dist/config-DLt6BvV7.js +0 -36
  477. package/dist/diff-Cnghh_Ip.js +0 -48
  478. package/dist/doctor-CuVJvhV_.js +0 -53
  479. package/dist/duration-xK2jGFVc.js +0 -25
  480. package/dist/errors-CWfoNg9N.js +0 -47
  481. package/dist/errors-DRnGZHzF.js +0 -30
  482. package/dist/expiry-BoBJ8Tvc.js +0 -7
  483. package/dist/fields-fwfXN01n.js +0 -1016
  484. package/dist/headers-BZSDieNT.js +0 -6
  485. package/dist/headers-Cf-zWvsO.d.ts +0 -6
  486. package/dist/ids-DC4V4CFu.js +0 -18
  487. package/dist/index-DgM7w96K.d.ts +0 -6
  488. package/dist/index-Dz7didpC.d.ts +0 -201
  489. package/dist/index-UdVQgq48.d.ts +0 -550
  490. package/dist/load-B_shHrmd.js +0 -2
  491. package/dist/manifest-BngWKryL.js +0 -770
  492. package/dist/may-use-BOn_dR_w.js +0 -78
  493. package/dist/openapi-DcQ1Kg40.js +0 -164
  494. package/dist/ownership-BgnbOJFT.js +0 -851
  495. package/dist/permdock-L26udHSk.js +0 -3646
  496. package/dist/powersync-BFSbSElQ.js +0 -62
  497. package/dist/powersync-DCDgZgfZ.js +0 -2
  498. package/dist/rls-55DQTuf5.js +0 -250
  499. package/dist/run-DMcNW_8T.js +0 -174
  500. package/dist/server-ZYEHtNHS.js +0 -268
  501. package/dist/sink-BTtmfPnE.js +0 -141
  502. package/dist/sink-CPN4zLfs.d.ts +0 -104
  503. package/dist/skills-Dle4ZoLF.js +0 -56
  504. package/dist/snapshot-Dc9CHPME.js +0 -1078
  505. package/dist/src-Bb7no-hS.js +0 -639
  506. package/dist/subject-C6dLxqHU.js +0 -24
  507. package/dist/supabase-Dbqr141s.js +0 -83
  508. package/dist/supabase-hook-BULg7Ut_.js +0 -2
  509. package/dist/thenable-QSmvt-vZ.js +0 -65
  510. package/dist/types-C0dee0Qf.d.ts +0 -197
  511. package/dist/types-DvupZE0w.d.ts +0 -9
  512. package/dist/usage-4G6t643F.js +0 -42
  513. package/dist/usage-iFLJ0-rr.js +0 -2
  514. package/dist/vocabulary-hhEFLFoL.d.ts +0 -65
  515. package/dist/watch-C8TpsAl4.js +0 -2
@@ -1,398 +1,297 @@
1
1
  import { r as isRecord, t as compact } from "../compact-CAf557ZB.js";
2
2
  import { n as freezeDeep } from "../freeze-CrU8nQeX.js";
3
- import { o as isForbiddenKey } from "../thenable-QSmvt-vZ.js";
4
- import { i as parsePolicyDocument } from "../hosted-CBHgkzDl.js";
5
- import { t as CLOUD_EVENT_TYPES } from "../sink-BTtmfPnE.js";
6
- import { r as isApprovalErrorCode, t as ApprovalError } from "../errors-DRnGZHzF.js";
7
- import { t as joseTokenVerifier } from "../verifier-DMr_Zmb_.js";
8
- import { t as timeoutSignal } from "../timeout-D51niuQP.js";
9
- //#region src/cloud/create.ts
10
- /** Milliseconds a PermDock Cloud request may take; a slower one fails like an unreachable Cloud. */
11
- const CLOUD_TIMEOUT_MS = 1e4;
12
- function readEnv(name) {
13
- const value = globalThis.process?.env?.[name];
14
- return typeof value === "string" ? value : "";
15
- }
16
- function firstNonEmpty(...values) {
17
- for (const value of values) if (value !== void 0 && value !== "") return value;
18
- return "";
19
- }
20
- function trimSlash(value) {
21
- return value.endsWith("/") ? value.slice(0, -1) : value;
22
- }
23
- function asApproval(value) {
24
- if (!isRecord(value) || value["v"] !== 1 || typeof value["token"] !== "string") return null;
25
- return value;
26
- }
27
- function isCompactJws$1(value) {
28
- return !value.startsWith("{") && value.split(".").length === 3;
3
+ import { o as statusProblem } from "../problem-details-cn5X30gZ.js";
4
+ import { r as CLOUD_EVENT_TYPES } from "../sink-BEZSlMS_.js";
5
+ import { i as parseCloudEventBatch, r as parseCloudEvent$1 } from "../catalog-fingerprint-CCP0-yQS.js";
6
+ import { c as problemResponse } from "../problem-CTviyH5L.js";
7
+ import { n as webhookVerifier } from "../standard-webhooks-DgFFD-Ga.js";
8
+ import { t as pollingApprovalWaiter } from "../waiter-BGUtGYoU.js";
9
+ import { i as isDeliveryTarget } from "../target-Bw37TFNA.js";
10
+ import { i as isCompactJws, n as cloudConnection, r as cloudEndpoints, t as cloud } from "../create-CQWIpUG-.js";
11
+ //#region src/cloud/delivery.ts
12
+ function failed(cause, retryable, reason) {
13
+ return {
14
+ status: "failed",
15
+ cause,
16
+ retryable,
17
+ reason
18
+ };
29
19
  }
30
- /** The refusal PermDock Cloud names in its body, else the one its status implies. */
31
- async function approvalErrorFrom(response) {
32
- let body;
33
- try {
34
- body = await response.json();
35
- } catch {
36
- return approvalErrorFromStatus(response.status);
20
+ async function fromResponse(response) {
21
+ const { status } = response;
22
+ if (status >= 200 && status < 300) {
23
+ let body;
24
+ try {
25
+ body = await response.json();
26
+ } catch {
27
+ body = void 0;
28
+ }
29
+ const id = isRecord(body) ? body["id"] : void 0;
30
+ return typeof id === "string" && id !== "" ? {
31
+ status: "sent",
32
+ providerId: id
33
+ } : { status: "sent" };
37
34
  }
38
- if (body === null || typeof body !== "object" || !("code" in body)) return approvalErrorFromStatus(response.status);
39
- const code = body.code;
40
- if (!isApprovalErrorCode(code)) return approvalErrorFromStatus(response.status);
41
- const detail = "detail" in body ? body.detail : void 0;
42
- return new ApprovalError(code, typeof detail === "string" && detail.length > 0 ? detail : code);
43
- }
44
- function approvalErrorFromStatus(status) {
45
- if (status === 409) return new ApprovalError("approval-not-pending", "approval is not pending");
46
- if (status === 410) return new ApprovalError("approval-expired", "approval has expired");
47
- return new ApprovalError("approval-not-found", "approval was not found");
35
+ const reason = `HTTP ${String(status)}`;
36
+ if (status === 429) return failed("rate-limited", true, reason);
37
+ if (status === 408 || status === 409 || status >= 500) return failed("unavailable", true, reason);
38
+ if (status === 401 || status === 403) return failed("unauthorized", false, reason);
39
+ if (status === 400 || status === 422) return failed("invalid-message", false, reason);
40
+ return failed("rejected", false, reason);
48
41
  }
49
42
  /**
50
- * The environment URL and JWK Set URL `cloud()` uses, resolved with the same
51
- * fallbacks (`PERMDOCK_CLOUD_URL`; `PERMDOCK_CLOUD_ENV`, `VERCEL_ENV`, `production`).
43
+ * A `DeliveryTransport` for `channel` that hands each checked recipient to
44
+ * PermDock Cloud, which sends it from its hosted email, chat or webhook
45
+ * sender and reports back through `com.permdock.delivery.*` events. The
46
+ * router has already decided the recipient: the Cloud receives the target
47
+ * and the permission that let it through, never a decision to make.
48
+ * `Idempotency-Key` is the delivery's idempotency key, so a retry repeats it.
52
49
  */
53
- function cloudEndpoints(options = {}) {
54
- const url = trimSlash(firstNonEmpty(options.url, readEnv("PERMDOCK_CLOUD_URL")));
55
- if (url === "") throw new Error("PermDock: cloud() requires url and key.");
56
- const environment = firstNonEmpty(options.environment, readEnv("PERMDOCK_CLOUD_ENV"), readEnv("VERCEL_ENV"), "production");
57
- const issuer = `${url}/v1/environments/${encodeURIComponent(environment)}`;
50
+ function cloudDeliveryTransport(channel, options = {}) {
51
+ const connection = cloudConnection(options);
58
52
  return Object.freeze({
59
- issuer,
60
- jwks: `${issuer}/.well-known/jwks.json`
61
- });
62
- }
63
- function cloud(options = {}) {
64
- const key = firstNonEmpty(options.key, readEnv("PERMDOCK_CLOUD_KEY"));
65
- if (key === "") throw new Error("PermDock: cloud() requires url and key.");
66
- const { issuer: root, jwks } = cloudEndpoints(options);
67
- const fetchFn = options.fetch ?? globalThis.fetch.bind(globalThis);
68
- const flushAt = options.flushAt ?? 32;
69
- const waitUntil = options.waitUntil;
70
- const headers = () => {
71
- const next = new Headers();
72
- next.set("authorization", `Bearer ${key}`);
73
- next.set("content-type", "application/json");
74
- return next;
75
- };
76
- const request = (path, init = {}, accept) => {
77
- const next = headers();
78
- if (accept !== void 0) next.set("accept", accept);
79
- return fetchFn(`${root}${path}`, {
80
- ...init,
81
- headers: next,
82
- signal: timeoutSignal(CLOUD_TIMEOUT_MS, init.signal)
83
- });
84
- };
85
- const approvals = {
86
- async create(record) {
87
- if (!(await request("/approvals", {
88
- method: "POST",
89
- body: JSON.stringify(record)
90
- })).ok) throw new Error("PermDock Cloud rejected the approval create");
91
- },
92
- async get(token) {
93
- try {
94
- const response = await request(`/approvals/${encodeURIComponent(token)}`);
95
- if (!response.ok) return null;
96
- return asApproval(await response.json());
97
- } catch {
98
- return null;
99
- }
100
- },
101
- async resolve(token, verdict) {
102
- const response = await request(`/approvals/${encodeURIComponent(token)}/resolve`, {
103
- method: "POST",
104
- body: JSON.stringify(verdict)
105
- });
106
- if (!response.ok) throw await approvalErrorFrom(response);
107
- const parsed = asApproval(await response.json());
108
- if (parsed === null) throw new ApprovalError("approval-not-found", "PermDock Cloud returned an unknown approval shape");
109
- return parsed;
110
- },
111
- async consume(token, now) {
53
+ channel,
54
+ name: "permdock-cloud",
55
+ async deliver(target, message, transportOptions) {
56
+ if (!isDeliveryTarget(target, channel)) return {
57
+ status: "failed",
58
+ cause: "invalid-recipient",
59
+ retryable: false
60
+ };
61
+ let body;
112
62
  try {
113
- const response = await request(`/approvals/${encodeURIComponent(token)}/consume`, {
114
- method: "POST",
115
- body: JSON.stringify(compact({ now: now === void 0 ? void 0 : now.toISOString() }))
63
+ body = JSON.stringify({
64
+ channel,
65
+ delivery: transportOptions.delivery,
66
+ target: compact({
67
+ address: target.address,
68
+ principal: target.principal,
69
+ provider: target.provider,
70
+ workspace: target.workspace,
71
+ trusted: target.trusted,
72
+ permission: target.decision.matched.permission
73
+ }),
74
+ message
116
75
  });
117
- if (!response.ok) return null;
118
- return asApproval(await response.json());
119
76
  } catch {
120
- return null;
77
+ return {
78
+ status: "failed",
79
+ cause: "invalid-message",
80
+ retryable: false
81
+ };
121
82
  }
122
- },
123
- async list(query) {
124
- const params = new URLSearchParams(compact({
125
- status: query.status,
126
- principalId: query.principalId,
127
- actorId: query.actorId,
128
- tenant: query.tenant,
129
- session: query.session,
130
- limit: query.limit === void 0 ? void 0 : String(query.limit),
131
- cursor: query.cursor
132
- }));
133
- const suffix = params.size === 0 ? "" : `?${params.toString()}`;
134
83
  try {
135
- const response = await request(`/approvals${suffix}`);
136
- if (!response.ok) return { items: [] };
137
- const body = await response.json();
138
- if (!isRecord(body) || !Array.isArray(body["items"])) return { items: [] };
139
- const items = body["items"].flatMap((item) => {
140
- const parsed = asApproval(item);
141
- return parsed === null ? [] : [parsed];
142
- });
143
- return typeof body["next"] === "string" && body["next"] !== "" ? {
144
- items,
145
- next: body["next"]
146
- } : { items };
84
+ return await fromResponse(await connection.request("/deliveries", {
85
+ method: "POST",
86
+ headers: { "idempotency-key": transportOptions.idempotencyKey },
87
+ body
88
+ }));
147
89
  } catch {
148
- return { items: [] };
90
+ return failed("unavailable", true, "request failed");
149
91
  }
150
- },
151
- async cancel(filter, meta) {
152
- const response = await request("/approvals/cancel", {
92
+ }
93
+ });
94
+ }
95
+ //#endregion
96
+ //#region src/cloud/signer.ts
97
+ const REGISTERED = /* @__PURE__ */ new Set([
98
+ "iss",
99
+ "aud",
100
+ "exp",
101
+ "iat",
102
+ "nbf",
103
+ "jti"
104
+ ]);
105
+ /**
106
+ * The Cloud's own outputs and access tokens; a client key that could mint
107
+ * them could forge them, or forge the approver behind `PermDock-Approver`.
108
+ */
109
+ const CLOUD_ISSUED = /* @__PURE__ */ new Set([
110
+ "vnd.permdock.policy+jwt",
111
+ "vnd.permdock.snapshot+jwt",
112
+ "vnd.permdock.evidence+jwt",
113
+ "at+jwt",
114
+ "secevent+jwt"
115
+ ]);
116
+ function headerTyp(token) {
117
+ const [encoded = ""] = token.split(".");
118
+ try {
119
+ const text = atob(encoded.replaceAll("-", "+").replaceAll("_", "/"));
120
+ const header = JSON.parse(text);
121
+ return isRecord(header) ? header["typ"] : void 0;
122
+ } catch {
123
+ return;
124
+ }
125
+ }
126
+ /**
127
+ * A `TokenSigner` backed by the environment's PermDock Cloud keys, typically
128
+ * KMS-held, for run tickets (`vnd.permdock.run+jwt`) and every other signed
129
+ * output an app issues. The Cloud signs only what the app sends: it sets
130
+ * `iss` to the environment URL and adds no claim. Policy documents,
131
+ * snapshots, evidence exports, Security Event Tokens and `at+jwt` access tokens are the Cloud's own
132
+ * outputs, so their `typ` values are refused here. Verify what it signs with
133
+ * `joseTokenVerifier({ jwks: cloudEndpoints().jwks })`.
134
+ */
135
+ function cloudSigner(options = {}) {
136
+ const connection = cloudConnection(options);
137
+ return Object.freeze({
138
+ async sign(payload, signOptions) {
139
+ if (CLOUD_ISSUED.has(signOptions.typ)) throw new Error(`PermDock: cloudSigner never signs ${signOptions.typ}; the Cloud issues its own.`);
140
+ const audience = signOptions.audience ?? options.audience;
141
+ if (audience === void 0 || audience.length === 0) throw new Error("PermDock: cloudSigner requires an audience.");
142
+ const claims = Object.fromEntries(Object.entries(payload).filter(([name]) => !REGISTERED.has(name)));
143
+ const response = await connection.request("/sign", {
153
144
  method: "POST",
154
145
  body: JSON.stringify(compact({
155
- filter,
156
- by: meta.by,
157
- note: meta.note
146
+ typ: signOptions.typ,
147
+ claims,
148
+ aud: audience,
149
+ exp: signOptions.expiresAt,
150
+ iat: signOptions.issuedAt,
151
+ jti: signOptions.jti
158
152
  }))
159
- });
160
- if (!response.ok) throw new Error("PermDock Cloud rejected the approval cancel");
161
- const body = await response.json();
162
- if (!isRecord(body) || typeof body["cancelled"] !== "number") throw new Error("PermDock Cloud returned an unknown cancel shape");
163
- return body["cancelled"];
153
+ }, "application/jwt");
154
+ if (!response.ok) throw new Error(`PermDock Cloud refused to sign: HTTP ${String(response.status)}`);
155
+ const token = (await response.text()).trim();
156
+ if (!isCompactJws(token) || headerTyp(token) !== signOptions.typ) throw new Error(`PermDock Cloud returned a token that is not a ${signOptions.typ} JWS`);
157
+ return token;
164
158
  },
165
- async expire(now) {
159
+ async jwks() {
166
160
  try {
167
- const response = await request("/approvals/expire", {
168
- method: "POST",
169
- body: JSON.stringify(compact({ now: now === void 0 ? void 0 : now.toISOString() }))
170
- });
171
- if (!response.ok) return 0;
172
- const body = await response.json();
173
- if (!isRecord(body) || typeof body["expired"] !== "number") return 0;
174
- return body["expired"];
161
+ const response = await connection.request("/.well-known/jwks.json", {}, "application/jwk-set+json");
162
+ const body = response.ok ? await response.json() : void 0;
163
+ return { keys: (isRecord(body) && Array.isArray(body["keys"]) ? body["keys"] : []).filter(isRecord) };
175
164
  } catch {
176
- return 0;
165
+ return { keys: [] };
177
166
  }
178
167
  }
179
- };
180
- const capacity = options.capacity ?? 1e4;
181
- const pending = [];
182
- const bound = () => {
183
- if (pending.length > capacity) pending.splice(0, pending.length - capacity);
184
- };
185
- const flush = async () => {
186
- if (pending.length === 0) return;
187
- const events = pending.splice(0);
188
- try {
189
- if (!(await request("/decisions", {
190
- method: "POST",
191
- body: JSON.stringify({ events })
192
- })).ok) pending.unshift(...events);
193
- } catch {
194
- pending.unshift(...events);
195
- }
196
- bound();
197
- };
198
- const sink = {
199
- write(events) {
200
- pending.push(...events);
201
- bound();
202
- if (pending.length >= flushAt) return flush();
203
- if (waitUntil !== void 0 && pending.length > 0) waitUntil(flush());
204
- },
205
- flush
206
- };
207
- const snapshots = { async get() {
208
- const response = await request("/snapshot", {}, "application/jwt");
209
- if (!response.ok) throw new Error("PermDock Cloud snapshot request failed");
210
- const text = (await response.text()).trim();
211
- if (!isCompactJws$1(text)) throw new Error("PermDock Cloud served an unsigned snapshot");
212
- return text;
213
- } };
214
- let document = null;
215
- return freezeDeep({
216
- approvals,
217
- sink,
218
- snapshots,
219
- policies: {
220
- current() {
221
- return document;
222
- },
223
- async refresh() {
224
- const verifier = options.verifier;
225
- if (verifier === void 0) return;
226
- let response;
227
- try {
228
- response = await request("/policy");
229
- } catch {
230
- return;
231
- }
232
- if (response.status === 404) {
233
- document = null;
234
- return;
235
- }
236
- if (!response.ok) return;
237
- const token = (await response.text()).trim();
238
- if (!isCompactJws$1(token)) return;
239
- const verified = await verifier.verify(token, {
240
- typ: "permdock-policy+jwt",
241
- issuer: root,
242
- audience: root
243
- });
244
- if (!verified.ok) return;
245
- let next;
246
- try {
247
- next = parsePolicyDocument(verified.claims["policy"]);
248
- } catch {
249
- return;
250
- }
251
- document = next;
252
- }
253
- },
254
- issuer: root,
255
- jwks
256
168
  });
257
169
  }
258
170
  //#endregion
259
171
  //#region src/cloud/webhook.ts
260
- const TYPES = new Set(Object.values(CLOUD_EVENT_TYPES));
261
- function hasUnsafeKey(value) {
262
- if (Array.isArray(value)) return value.some(hasUnsafeKey);
263
- if (!isRecord(value)) return false;
264
- return Object.keys(value).some((key) => isForbiddenKey(key) || hasUnsafeKey(value[key]));
265
- }
266
- const FINDING_CODES = /* @__PURE__ */ new Set([
267
- "permission-removed",
268
- "not-hostable",
269
- "grantee-removed",
270
- "approval-tightened"
271
- ]);
272
- function isFinding(value) {
273
- return isRecord(value) && FINDING_CODES.has(value["code"]) && typeof value["permission"] === "string" && (value["grant"] === void 0 || typeof value["grant"] === "string");
274
- }
275
- function validData(type, data) {
276
- switch (type) {
277
- case "dev.permdock.decision": return data["type"] === "decision" && typeof data["permission"] === "string";
278
- case "dev.permdock.approval": return data["type"] === "decision" && (data["phase"] === "requested" || data["phase"] === "resolved");
279
- case "dev.permdock.directory": return data["type"] === "directory" && typeof data["tenant"] === "string";
280
- case "dev.permdock.membership": return data["type"] === "membership" && isRecord(data["principal"]);
281
- case "dev.permdock.credential": return data["type"] === "credential" && isRecord(data["credential"]) && typeof data["credential"]["id"] === "string" && (data["credential"]["kind"] === "user" || data["credential"]["kind"] === "service") && isRecord(data["principal"]) && (data["operation"] === "created" || data["operation"] === "used" || data["operation"] === "rotated" || data["operation"] === "revoked");
282
- case "dev.permdock.catalog": return (data["kind"] === "publish" || data["kind"] === "drift") && typeof data["fingerprint"] === "string" && (data["previous"] === void 0 || typeof data["previous"] === "string") && (data["findings"] === void 0 || Array.isArray(data["findings"]) && data["findings"].every(isFinding));
283
- case "dev.permdock.access.started":
284
- case "dev.permdock.access.ended":
285
- case "dev.permdock.access.revoked": return data["type"] === "access" && typeof data["tenant"] === "string" && isRecord(data["principal"]) && typeof data["principal"]["id"] === "string";
286
- default: return type;
287
- }
288
- }
289
172
  /**
290
- * Validates one CloudEvent against the closed type list and its data shape;
291
- * returns `null` for anything else, never throws.
173
+ * Validates one CloudEvent against the closed type list, its `dataschema` and
174
+ * its data shape; returns `null` for anything else, never throws.
292
175
  */
293
176
  function parseCloudEvent(value) {
294
- if (!isRecord(value) || hasUnsafeKey(value) || value["specversion"] !== "1.0" || typeof value["type"] !== "string" || !TYPES.has(value["type"]) || typeof value["source"] !== "string" || typeof value["id"] !== "string" || typeof value["time"] !== "string" || value["subject"] !== void 0 && typeof value["subject"] !== "string" || !isRecord(value["data"]) || !validData(value["type"], value["data"])) return null;
295
- return freezeDeep(JSON.parse(JSON.stringify(value)));
177
+ return parseCloudEvent$1(value);
296
178
  }
297
179
  function verifierFor(options) {
298
180
  if (options.verifier !== void 0) return options.verifier;
299
- if (options.jwks === void 0) return;
181
+ if (options.replay === void 0 || options.jwks === void 0 && options.secret === void 0) return;
300
182
  try {
301
- return joseTokenVerifier({
302
- jwks: typeof options.jwks === "string" ? new URL(options.jwks) : options.jwks,
303
- algorithms: ["Ed25519", "ES256"]
304
- });
183
+ return webhookVerifier(compact({
184
+ jwks: options.jwks,
185
+ secret: options.secret,
186
+ replay: options.replay,
187
+ tolerance: options.tolerance,
188
+ now: options.now,
189
+ fetch: options.fetch
190
+ }));
305
191
  } catch {
306
192
  return;
307
193
  }
308
194
  }
309
- function isCompactJws(value) {
310
- return /^[\w-]+\.[\w-]+\.[\w-]+$/u.test(value);
195
+ function eventsOf(body) {
196
+ let parsed;
197
+ try {
198
+ parsed = JSON.parse(body);
199
+ } catch {
200
+ return null;
201
+ }
202
+ if (!Array.isArray(parsed)) {
203
+ const single = parseCloudEvent(parsed);
204
+ return single === null ? null : [single];
205
+ }
206
+ return parseCloudEventBatch(parsed);
311
207
  }
312
208
  /**
313
- * Verifies a PermDock Cloud webhook delivery: a compact JWS with
314
- * `typ: permdock-decisions+jwt` whose `events` claim holds CloudEvents.
315
- * There is no unsigned mode, and it never throws.
209
+ * Verifies a PermDock Cloud webhook delivery: Standard Webhooks headers over
210
+ * an `application/cloudevents-batch+json` body (or one
211
+ * `application/cloudevents+json` event). There is no unsigned mode, and it
212
+ * never throws.
316
213
  */
317
214
  async function verifyWebhook(request, options) {
318
- let body;
319
- try {
320
- body = (await request.text()).trim();
321
- } catch {
322
- return {
323
- ok: false,
324
- reason: "unsigned"
325
- };
326
- }
327
- if (!isCompactJws(body)) return {
328
- ok: false,
329
- reason: "unsigned"
330
- };
331
215
  const verifier = verifierFor(options);
332
216
  if (verifier === void 0) return {
333
217
  ok: false,
334
- reason: "invalid-token",
335
- cause: "jwks-unavailable"
218
+ cause: "keys-unavailable"
336
219
  };
337
- let verified;
338
- try {
339
- verified = await verifier.verify(body, {
340
- typ: "permdock-decisions+jwt",
341
- audience: options.audience
342
- });
343
- } catch {
344
- return {
345
- ok: false,
346
- reason: "invalid-token",
347
- cause: "malformed"
348
- };
349
- }
220
+ const verified = await verifier.verify(request);
350
221
  if (!verified.ok) return {
351
222
  ok: false,
352
- reason: "invalid-token",
353
223
  cause: verified.cause
354
224
  };
355
- const jti = verified.claims["jti"];
356
- const raw = verified.claims["events"];
357
- if (typeof jti !== "string" || !Array.isArray(raw)) return {
225
+ const events = eventsOf(verified.body);
226
+ if (events === null) return {
358
227
  ok: false,
359
- reason: "invalid-events"
228
+ cause: "invalid-events"
360
229
  };
361
- const events = [];
362
- for (const item of raw) {
363
- const parsed = parseCloudEvent(item);
364
- if (parsed === null) return {
365
- ok: false,
366
- reason: "invalid-events"
367
- };
368
- events.push(parsed);
369
- }
370
- if (options.replay !== void 0) {
371
- const key = `permdock-webhook:${jti}`;
372
- const expiresAt = typeof verified.claims.exp === "number" ? verified.claims.exp : void 0;
373
- try {
374
- if (options.replay.claim === void 0) {
375
- if (await options.replay.seen(key)) return {
376
- ok: false,
377
- reason: "replayed"
378
- };
379
- await options.replay.remember(key, expiresAt);
380
- } else if (!await options.replay.claim(key, expiresAt)) return {
381
- ok: false,
382
- reason: "replayed"
383
- };
384
- } catch {
385
- return {
386
- ok: false,
387
- reason: "replayed"
388
- };
389
- }
390
- }
391
230
  return freezeDeep({
392
231
  ok: true,
393
- id: jti,
232
+ id: verified.id,
233
+ timestamp: verified.timestamp,
394
234
  events
395
235
  });
396
236
  }
397
237
  //#endregion
398
- export { cloud, cloudEndpoints, parseCloudEvent, verifyWebhook };
238
+ //#region src/cloud/waiter.ts
239
+ /** Polling the store is the fallback for a webhook this process never receives. */
240
+ const FALLBACK_INTERVAL = 6e4;
241
+ const WAKING = /* @__PURE__ */ new Set([
242
+ CLOUD_EVENT_TYPES.approvalResolved,
243
+ CLOUD_EVENT_TYPES.approvalExpired,
244
+ CLOUD_EVENT_TYPES.approvalCancelled
245
+ ]);
246
+ /** The approval token of each event that ends a wait, in delivery order. */
247
+ function approvalTokensOf(events) {
248
+ return events.flatMap((event) => {
249
+ if (!WAKING.has(event.type)) return [];
250
+ const { data } = event;
251
+ return "token" in data && typeof data.token === "string" && data.token !== "" ? [data.token] : [];
252
+ });
253
+ }
254
+ function refusal(cause) {
255
+ switch (cause) {
256
+ case "keys-unavailable": return problemResponse(statusProblem(503, "the webhook signing keys are unavailable"));
257
+ case "invalid-events": return problemResponse(statusProblem(400, "the body is not a PermDock CloudEvents batch"));
258
+ case "missing-headers":
259
+ case "malformed":
260
+ case "timestamp-out-of-range": return problemResponse(statusProblem(400, `webhook verification failed: ${cause}`));
261
+ case "invalid-signature": return problemResponse(statusProblem(403, `webhook verification failed: ${cause}`));
262
+ case "replayed": return new Response(null, { status: 204 });
263
+ default: return cause;
264
+ }
265
+ }
266
+ /**
267
+ * An `ApprovalWaiter` that PermDock Cloud wakes. Mount `webhook` on the
268
+ * route the environment's webhook connector posts to: when an approval is
269
+ * resolved, expires or is cancelled, the parked run for its token wakes.
270
+ * Waking never approves anything. The run decides again with the token, and
271
+ * only the app's `decide` and its approval store can grant. Without
272
+ * `waiter`, waits poll `store` as a fallback for a webhook another process
273
+ * received.
274
+ */
275
+ function cloudApprovalWaiter(options) {
276
+ const inner = options.waiter ?? pollingApprovalWaiter({
277
+ store: options.store,
278
+ interval: options.interval ?? FALLBACK_INTERVAL
279
+ });
280
+ const wake = async (token) => {
281
+ try {
282
+ await inner.wake(token);
283
+ } catch {}
284
+ };
285
+ return Object.freeze({
286
+ wait: inner.wait.bind(inner),
287
+ wake,
288
+ async webhook(request) {
289
+ const verified = await verifyWebhook(request, options);
290
+ if (!verified.ok) return refusal(verified.cause);
291
+ await Promise.all(approvalTokensOf(verified.events).map(wake));
292
+ return new Response(null, { status: 204 });
293
+ }
294
+ });
295
+ }
296
+ //#endregion
297
+ export { approvalTokensOf, cloud, cloudApprovalWaiter, cloudDeliveryTransport, cloudEndpoints, cloudSigner, parseCloudEvent, verifyWebhook };