permdock 0.3.1 → 0.5.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 (552) hide show
  1. package/README.md +37 -35
  2. package/dist/{openapi-schema--ARjyfQr.js → 2020-C9VN-x8c.js} +5 -132
  3. package/dist/a2a/index.d.ts +8 -6
  4. package/dist/a2a/index.js +21 -31
  5. package/dist/{adapter-context-mlWsVGGg.js → adapter-context-CRhqyzCk.js} +1 -1
  6. package/dist/adoption-scan-B4R5fnMU.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 -23
  10. package/dist/ai-sdk/index.js +38 -21
  11. package/dist/app-data-MuyzVqX8.js +60 -0
  12. package/dist/approval-header-CJACtHkv.js +23 -0
  13. package/dist/approval-prompt-Dg5LeAcT.js +62 -0
  14. package/dist/approval-prompt-Djo_PyZc.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-DJ6Yd5z1.js +995 -0
  18. package/dist/{approvers-DT4AVyIg.js → approvers-CqPOLD-o.js} +1 -1
  19. package/dist/arazzo-B6lebmiQ.js +36 -0
  20. package/dist/{arazzo-BAgw9ap6.js → arazzo-BWhNF-k0.js} +24 -17
  21. package/dist/args-IIolxxKA.js +197 -0
  22. package/dist/astro/index.d.ts +43 -0
  23. package/dist/astro/index.js +27 -0
  24. package/dist/audience-Dg8XsRaO.js +55 -0
  25. package/dist/auth-DRLEizbL.js +178 -0
  26. package/dist/authzen/index.d.ts +26 -6
  27. package/dist/authzen/index.js +228 -75
  28. package/dist/automation-BMZPIVUM.d.ts +114 -0
  29. package/dist/automation-DVjOckjV.js +157 -0
  30. package/dist/better-auth/index.d.ts +8 -6
  31. package/dist/better-auth/index.js +11 -23
  32. package/dist/better-supabase/index.d.ts +438 -86
  33. package/dist/better-supabase/index.js +1027 -184
  34. package/dist/bind--9EFVYWF.d.ts +38 -0
  35. package/dist/{bind-CuzGytRf.js → bind-CZzhx-Vj.js} +22 -10
  36. package/dist/body-CH5of8Ne.js +10 -0
  37. package/dist/body-text-QcXok_SI.js +52 -0
  38. package/dist/build-instance-BMnAudHn.js +52 -0
  39. package/dist/{canonical-json-DemiK4Vp.js → canonical-json-BC8_nMTw.js} +6 -6
  40. package/dist/{capability-2kYTMWDv.d.ts → capability-BSslw1QV.d.ts} +44 -25
  41. package/dist/{capability-4qPdO9gk.js → capability-N1K9IpqS.js} +69 -42
  42. package/dist/casbin-Cr7RLtA3.js +30 -0
  43. package/dist/casbin-Dyu2gnUD.js +234 -0
  44. package/dist/casl-64gpT-8x.js +24 -0
  45. package/dist/casl-DjEDhTCP.js +299 -0
  46. package/dist/catalog/index.d.ts +74 -2
  47. package/dist/catalog/index.js +51 -2
  48. package/dist/catalog-BECMPrwc.js +100 -0
  49. package/dist/catalog-DjhMYYCq.js +1 -0
  50. package/dist/catalog-R_A__RsH.js +52 -0
  51. package/dist/{catalog-doc-DdGm82XT.js → catalog-doc-C9wjsfNY.js} +54 -25
  52. package/dist/catalog-fingerprint-CCP0-yQS.js +153 -0
  53. package/dist/chat/index.d.ts +2 -0
  54. package/dist/chat/index.js +224 -0
  55. package/dist/chat-sdk/index.d.ts +87 -0
  56. package/dist/chat-sdk/index.js +197 -0
  57. package/dist/claims-map-7oQ3ue4X.js +13 -0
  58. package/dist/claims-map-Ca-QX8C6.d.ts +32 -0
  59. package/dist/claude-agent/index.d.ts +7 -14
  60. package/dist/claude-agent/index.js +26 -30
  61. package/dist/clerk/index.d.ts +9 -8
  62. package/dist/clerk/index.js +15 -45
  63. package/dist/cli/bin.js +36 -17
  64. package/dist/cli/index.d.ts +20 -6
  65. package/dist/cli/index.js +164 -4
  66. package/dist/cloud/index.d.ts +102 -63
  67. package/dist/cloud/index.js +240 -347
  68. package/dist/cloud-CIoHNevm.js +87 -0
  69. package/dist/codemod-Bmj9dWMH.js +37 -0
  70. package/dist/codemod-Cxvvc70T.js +2084 -0
  71. package/dist/{collect-DSTE3ml9.js → collect-CrZJJnEF.js} +79 -17
  72. package/dist/collect-DloHbDVa.js +55 -0
  73. package/dist/collect-FlXJlhus.js +1 -0
  74. package/dist/command-L8EstFNm.js +6 -0
  75. package/dist/{compact-y6vfu2_f.js → compact-CAf557ZB.js} +11 -1
  76. package/dist/compile/index.d.ts +1 -1
  77. package/dist/compile/index.js +1 -2
  78. package/dist/{compile-Ba4blROR.js → compile-CMqMx_IN.js} +13 -9
  79. package/dist/{compile-BkRyBDBw.d.ts → compile-Ckm2HqBZ.d.ts} +5 -3
  80. package/dist/completion-BqhRBJD8.js +143 -0
  81. package/dist/config-B46rm9sc.js +26 -0
  82. package/dist/{config-BJiM-xAm.js → config-bs_kZeYq.js} +15 -10
  83. package/dist/{config-report-CdCgbRnV.js → config-report-DUgj62Ai.js} +17 -8
  84. package/dist/{connection-CU8MQxRi.js → connection-DjhIJSs2.js} +8 -6
  85. package/dist/constants-DcJABbLW.js +20 -0
  86. package/dist/{context-Bcy85rGi.js → context-bbFHR-0D.js} +16 -5
  87. package/dist/convex/index.d.ts +11 -10
  88. package/dist/convex/index.js +18 -18
  89. package/dist/create-0VZ7Pdiu.d.ts +107 -0
  90. package/dist/create-BDS7wc3y.d.ts +138 -0
  91. package/dist/create-BFfm17UA.d.ts +110 -0
  92. package/dist/create-BWRSXgOF.js +403 -0
  93. package/dist/create-C3b4B5eF.js +130 -0
  94. package/dist/create-DnrmLnLW.js +323 -0
  95. package/dist/{credential-8P81ff4u.js → credential-DM2um3ha.js} +153 -32
  96. package/dist/credentials-DPyHmYz5.js +74 -0
  97. package/dist/deciding-columns-Sq12mEA6.js +123 -0
  98. package/dist/delegation-DaXVdDhM.js +286 -0
  99. package/dist/delegation-input-FTxMK3ji.js +19 -0
  100. package/dist/delivery/index.d.ts +5 -0
  101. package/dist/delivery/index.js +5 -0
  102. package/dist/delivery-DCAgNyCn.js +499 -0
  103. package/dist/delivery-event-xX4obB8F.js +40 -0
  104. package/dist/denied-text-D8jDHgsl.d.ts +19 -0
  105. package/dist/{describe-DMYiCjJV.d.ts → describe-BZUsixiL.d.ts} +11 -2
  106. package/dist/{describe-B_gVZEVi.js → describe-BybMRY7A.js} +10 -5
  107. package/dist/device-BARQ8eYG.js +193 -0
  108. package/dist/diff-CxZo9pTq.js +37 -0
  109. package/dist/{diff-2VaeChzX.js → diff-DCePiN6M.js} +61 -55
  110. package/dist/doctor-CxiwSfqH.js +44 -0
  111. package/dist/doctor-DFjUxf2f.js +2361 -0
  112. package/dist/drizzle/index.d.ts +5 -3
  113. package/dist/drizzle/index.js +6 -14
  114. package/dist/elysia/index.d.ts +16 -13
  115. package/dist/elysia/index.js +14 -13
  116. package/dist/env-DJZrPjRi.js +8 -0
  117. package/dist/errors-BDUwg2qC.js +27 -0
  118. package/dist/{errors-Cz5zn0mW.js → errors-BKy0EfhN.js} +6 -10
  119. package/dist/errors-BWXBMaKK.d.ts +11 -0
  120. package/dist/{errors-DPdqI50v.d.ts → errors-C2PXIv4c.d.ts} +2 -2
  121. package/dist/errors-CWTY6uih.js +143 -0
  122. package/dist/evaluate-_R8QkWaf.js +1732 -0
  123. package/dist/evaluations-16UqqQ6W.d.ts +32 -0
  124. package/dist/{evaluations-tz6D9A2G.js → evaluations-DZ2CbV5k.js} +181 -32
  125. package/dist/eve/index.d.ts +12 -16
  126. package/dist/eve/index.js +23 -29
  127. package/dist/event-time-CsegxXxB.js +23 -0
  128. package/dist/expiry-D4_YKRKD.js +52 -0
  129. package/dist/express/index.d.ts +13 -10
  130. package/dist/express/index.js +14 -12
  131. package/dist/fastify/index.d.ts +26 -13
  132. package/dist/fastify/index.js +17 -36
  133. package/dist/fetch-adapter-g0ypLkID.js +120 -0
  134. package/dist/fetch-adapter-qKJBuRqy.d.ts +31 -0
  135. package/dist/fields-D9tPVUUS.js +203 -0
  136. package/dist/files-C5ZI27eV.js +124 -0
  137. package/dist/{files-DWUN9PzI.js → files-D_JIzUrP.js} +12 -3
  138. package/dist/{fixtures-ht28Cplr.js → fixtures-B7XrLeY7.js} +12 -12
  139. package/dist/flags-C3DktBDY.js +86 -0
  140. package/dist/{from-snapshot-CTLijvdm.js → from-snapshot-D2lZt4Dd.js} +78 -65
  141. package/dist/{generate-CH7ThJ14.js → generate-CNU1pIOo.js} +1 -3
  142. package/dist/grantee-Cn1HyUsI.js +254 -0
  143. package/dist/grantee-conditions-CcXf8hMM.js +271 -0
  144. package/dist/grantee-match-DHArqY82.js +142 -0
  145. package/dist/h3/index.d.ts +37 -0
  146. package/dist/h3/index.js +35 -0
  147. package/dist/headers-BIjfMaoC.js +8 -0
  148. package/dist/headers-CIbDTUTK.d.ts +7 -0
  149. package/dist/{helpers-H_KARDVC.js → helpers-DTcZOzhF.js} +47 -39
  150. package/dist/hono/index.d.ts +12 -9
  151. package/dist/hono/index.js +14 -13
  152. package/dist/{hosted-DJQw46hn.js → hosted-BZIAYvon.js} +64 -15
  153. package/dist/hosted-DBDX0M-P.d.ts +78 -0
  154. package/dist/{http-SO7qGttf.js → http-BBoKefeS.js} +35 -2
  155. package/dist/{http-DPuDaChb.d.ts → http-B_LphE5Y.d.ts} +1 -2
  156. package/dist/http-DXJ37RDA.js +46 -0
  157. package/dist/{http-BIhmLfCc.js → http-ujKm0JXE.js} +3 -26
  158. package/dist/{openapi-import-cmwetbzw.js → import-CNV7I2Dw.js} +30 -26
  159. package/dist/{rls-import-4lLW_pbb.js → import-DMmOG27O.js} +271 -128
  160. package/dist/index-BcHcPyIo.d.ts +110 -0
  161. package/dist/index-CaxrMD1A.d.ts +1 -0
  162. package/dist/index-Chrs5fQ-.d.ts +210 -0
  163. package/dist/index-CxGUswIC.d.ts +431 -0
  164. package/dist/index-D8EovfsP.d.ts +91 -0
  165. package/dist/index-DOVf7RJv.d.ts +900 -0
  166. package/dist/{index-C8z4RjQV.d.ts → index-SGdIQyzc.d.ts} +34 -16
  167. package/dist/index.d.ts +20 -14
  168. package/dist/index.js +33 -23
  169. package/dist/init-DeMYsnYJ.js +96 -0
  170. package/dist/init-GG6Jh8HD.js +95 -0
  171. package/dist/{instance-options-jARdwfPN.d.ts → instance-options-Omfd793B.d.ts} +2 -2
  172. package/dist/instance-snapshot-Cxq4ygFc.js +600 -0
  173. package/dist/instant-BluqDvyS.js +19 -0
  174. package/dist/internals-Dk8A8fX3.js +17 -0
  175. package/dist/{json-schema-BsAflUGW.js → json-schema-B-vAwlde.js} +46 -9
  176. package/dist/json-schema-CN_iLFH2.d.ts +40 -0
  177. package/dist/jwt/index.d.ts +18 -11
  178. package/dist/jwt/index.js +166 -145
  179. package/dist/{kernel-_RRHmnMY.js → kernel-5JatXyND.js} +120 -43
  180. package/dist/kysely/index.d.ts +5 -3
  181. package/dist/kysely/index.js +6 -14
  182. package/dist/{live-options-H2eG8dfJ.js → live-options-BaAFCIiu.js} +16 -3
  183. package/dist/load-BxEtwlBS.js +1 -0
  184. package/dist/{load-DhWEB9P1.js → load-DFS_ry0W.js} +31 -7
  185. package/dist/{load-jose-BL6LH4bL.js → load-jose-DZ4dnjri.js} +1 -4
  186. package/dist/login-Dfe5RlYk.js +68 -0
  187. package/dist/login-imhuwvn3.js +254 -0
  188. package/dist/manifest-C8IzW3Do.js +42 -0
  189. package/dist/manifest-CtKR3GXL.js +370 -0
  190. package/dist/manifest-json-CAGzls-C.js +9 -0
  191. package/dist/{manifest-uDS9y5de.d.ts → manifest-mx5ghSFM.d.ts} +9 -2
  192. package/dist/manifest-schema-C0kK_8V0.js +399 -0
  193. package/dist/{map-claims-Z4QZOiFF.js → map-claims-D3oRmTk0.js} +19 -25
  194. package/dist/{map-error-pgUWNNtG.js → map-error-TCAdw-eW.js} +5 -5
  195. package/dist/{markers-B0hYLvMD.js → markers-C6joDI3o.js} +8 -3
  196. package/dist/mcp/index.d.ts +36 -9
  197. package/dist/mcp/index.js +476 -448
  198. package/dist/{rls-migrate-CN4TlJTO.js → migrate-BShP7Vf4.js} +119 -20
  199. package/dist/nest/index.d.ts +12 -9
  200. package/dist/nest/index.js +20 -20
  201. package/dist/next/index.d.ts +40 -20
  202. package/dist/next/index.js +37 -39
  203. package/dist/next/plugin.d.ts +1 -1
  204. package/dist/next/plugin.js +2 -2
  205. package/dist/node/index.d.ts +10 -10
  206. package/dist/node/index.js +7 -9
  207. package/dist/ocsf-BFp-PZZA.js +126 -0
  208. package/dist/openai/index.d.ts +9 -16
  209. package/dist/openai/index.js +18 -25
  210. package/dist/openapi/index.d.ts +3 -3
  211. package/dist/openapi/index.js +1 -1
  212. package/dist/{openapi-BqRBvAng.js → openapi-B7HZ0f-r.js} +9 -12
  213. package/dist/{openapi-CqqEbHsL.js → openapi-DTaEmTSW.js} +23 -26
  214. package/dist/openapi-ahr8rHu3.js +138 -0
  215. package/dist/operation-findings-DgATDpvh.js +36 -0
  216. package/dist/operations-CxybZErY.d.ts +59 -0
  217. package/dist/orpc/index.d.ts +13 -10
  218. package/dist/orpc/index.js +23 -20
  219. package/dist/otel/index.d.ts +3 -2
  220. package/dist/otel/index.js +53 -27
  221. package/dist/output-Dyw8fyPF.js +88 -0
  222. package/dist/output-files-B3IZJksC.js +1 -0
  223. package/dist/output-files-DhRBBE4n.js +138 -0
  224. package/dist/{rls-fields-CZOMlwHl.js → ownership-BatFgAA4.js} +2393 -2349
  225. package/dist/{package-root-zGkxO3oN.js → package-root-Dk_ETdkp.js} +4 -3
  226. package/dist/{parse-BuyjxhZV.js → parse-Cxq0WxrA.js} +3 -3
  227. package/dist/{parse-local-manifest-BrMozJCo.js → parse-local-manifest-CVSs6J9I.js} +2 -4
  228. package/dist/{parse-local-manifest-JLnaBH0S.d.ts → parse-local-manifest-DgqtruPn.d.ts} +1 -1
  229. package/dist/parse-request-D_tUXG6M.js +26 -0
  230. package/dist/paths-DXSHAMIa.js +42 -0
  231. package/dist/pdp/index.d.ts +7 -3
  232. package/dist/pdp/index.js +47 -29
  233. package/dist/{peer-BOr_kJE1.js → peer-C8swJ2GH.js} +23 -4
  234. package/dist/peer-CRvC7Hg1.js +1 -0
  235. package/dist/permdock-B9JxkBwC.js +868 -0
  236. package/dist/permdock-D7eeLJER.d.ts +502 -0
  237. package/dist/permission-registry-Br4jSNVi.js +385 -0
  238. package/dist/permissions-B-wCP5ZC.js +30 -0
  239. package/dist/{permissions-RJrovw98.js → permissions-CZKiUfFM.js} +4 -3
  240. package/dist/{permissions-CDgvKG5L.d.ts → permissions-oEWfl-kl.d.ts} +1 -2
  241. package/dist/policies-CO1oOymN.js +295 -0
  242. package/dist/{policy-D2W7uv19.d.ts → policy-Czo4n3Hs.d.ts} +2 -2
  243. package/dist/policy-DLZJ5gAp.js +399 -0
  244. package/dist/policy-from-catalog-DzhEc3Y9.js +450 -0
  245. package/dist/policy-module-CTlwMvLI.js +89 -0
  246. package/dist/{policy-IB6yxpC3.d.ts → policy-types-DzwivBgR.d.ts} +939 -1057
  247. package/dist/postgrest-CW0IqC-U.js +566 -0
  248. package/dist/postgrest-NUqZT-RB.d.ts +100 -0
  249. package/dist/powersync-BHfuehf3.js +62 -0
  250. package/dist/powersync-CbzkqL_M.js +1 -0
  251. package/dist/{powersync-Dv1_aWF7.js → powersync-bYUDLOAO.js} +30 -32
  252. package/dist/preset/index.d.ts +146 -0
  253. package/dist/preset/index.js +1 -0
  254. package/dist/preset-DZdU0tne.js +1768 -0
  255. package/dist/principal-source-pHneukrx.js +103 -0
  256. package/dist/prisma/index.d.ts +6 -3
  257. package/dist/prisma/index.js +6 -12
  258. package/dist/{problem-B43ztKIm.js → problem-CTviyH5L.js} +18 -27
  259. package/dist/{problem-details-DX075l9V.d.ts → problem-details-DXlt-vks.d.ts} +1 -1
  260. package/dist/{problem-details-_AMOYz-w.js → problem-details-cn5X30gZ.js} +45 -42
  261. package/dist/problem-types-CJ2325SZ.js +5 -0
  262. package/dist/{prompt-CXYhLfsS.js → prompt-DfZLJLIn.js} +2 -2
  263. package/dist/protected-DEPHc2xV.d.ts +38 -0
  264. package/dist/{protected-utU-SLuy.js → protected-DfjY5mLA.js} +37 -8
  265. package/dist/{provider-CSQd7m92.js → provider-CC-u3bYP.js} +23 -10
  266. package/dist/{provider-DZY281jO.d.ts → provider-DMVt6yYn.d.ts} +1 -1
  267. package/dist/{provider-store-Cfbvo4DE.js → provider-store-B5Yrkhzr.js} +6 -3
  268. package/dist/pull-BgIfno6w.js +256 -0
  269. package/dist/pull-ByOks_Tg.js +1 -0
  270. package/dist/push-CmFVBOeI.js +116 -0
  271. package/dist/pushed-policy-BImMTTIM.d.ts +57 -0
  272. package/dist/pushed-policy-DobP7AHI.js +238 -0
  273. package/dist/react/index.d.ts +8 -8
  274. package/dist/react/index.js +6 -6
  275. package/dist/react/provider-client.d.ts +1 -1
  276. package/dist/react/provider-client.js +1 -2
  277. package/dist/react-native/index.d.ts +24 -63
  278. package/dist/react-native/index.js +45 -27
  279. package/dist/{refs-KYb4ntaz.js → refs-K6eWUJ0H.js} +1 -1
  280. package/dist/relation-walk-3OyDBF0S.js +186 -0
  281. package/dist/relations-BnCWnJGI.js +163 -0
  282. package/dist/renames-CGj7YwcQ.js +175 -0
  283. package/dist/{replay-CYyiLiwO.d.ts → replay-D7iKcLFe.d.ts} +1 -1
  284. package/dist/{replay-BsOyTrdV.js → replay-Du1tJjG7.js} +2 -1
  285. package/dist/request-context-BTRTG7OT.js +71 -0
  286. package/dist/request-context-C2_1lchh.d.ts +5 -0
  287. package/dist/request-schema-CMreVuFM.js +148 -0
  288. package/dist/resend/index.d.ts +126 -0
  289. package/dist/resend/index.js +379 -0
  290. package/dist/resource-relations-D_jw0BFx.js +243 -0
  291. package/dist/retire-CALjIQ7e.js +240 -0
  292. package/dist/{revocations-Cy06JNx2.d.ts → revocations-R07lFBnX.d.ts} +2 -0
  293. package/dist/rls-BA8an5Ap.js +336 -0
  294. package/dist/{rls-DiinlRML.js → rls-j6t43t7n.js} +1066 -1068
  295. package/dist/role-builder-CXbis5-X.js +623 -0
  296. package/dist/{rpc-DL9Sqvb1.js → rpc-aPyNi6tA.js} +18 -8
  297. package/dist/run-CNsApDpd.js +1 -0
  298. package/dist/run-DOfMtc9V.js +723 -0
  299. package/dist/run-ticket-BjhTOi6u.d.ts +124 -0
  300. package/dist/run-ticket-sxFI6LAk.js +337 -0
  301. package/dist/{runtime-CB8gQFvS.js → runtime-D3VTAiCA.js} +1 -1
  302. package/dist/{saas-DhpJjnBA.js → saas-FO-Q8oj0.js} +18 -15
  303. package/dist/scan-BOI5tJ-6.js +29 -0
  304. package/dist/{schema-D3MnDMxa.js → schema-B4v0Qrac.js} +106 -10
  305. package/dist/schema-yLuBWWsh.js +130 -0
  306. package/dist/scim/index.d.ts +2 -2
  307. package/dist/scim/index.js +1 -2
  308. package/dist/{scim-BFGBBAqR.js → scim-ClHtpyV3.js} +213 -87
  309. package/dist/{scopes-CVdPrWN-.js → scopes-CUPSjo9q.js} +20 -7
  310. package/dist/server/index.d.ts +13 -134
  311. package/dist/server/index.js +13 -10
  312. package/dist/server-DqCT4CgZ.js +453 -0
  313. package/dist/{create-B1d519XK.d.ts → server-types-BLd4MnBX.d.ts} +89 -70
  314. package/dist/{sha256-BO0swRXL.js → sha256-D9ihqmvd.js} +8 -1
  315. package/dist/shared-CD11nBbC.js +304 -0
  316. package/dist/{shared-DRu8VFVM.js → shared-DvvFzYXe.js} +8 -9
  317. package/dist/signals-D3NcTKUS.js +32 -0
  318. package/dist/sink-BEZSlMS_.js +957 -0
  319. package/dist/sink-Bj_lDUDq.d.ts +225 -0
  320. package/dist/{skills-Biq5uup3.js → skills-B6lVdD_W.js} +16 -8
  321. package/dist/skills-CTYwkl44.js +51 -0
  322. package/dist/snapshot-CXUWfsNy.js +269 -0
  323. package/dist/{snapshot-cache-D6jLelln.js → snapshot-cache-DZHQ0KF6.js} +11 -5
  324. package/dist/{snapshot-cache-B-LxUahj.d.ts → snapshot-cache-DqK9eDmM.d.ts} +7 -5
  325. package/dist/solid/index.d.ts +24 -25
  326. package/dist/solid/index.js +41 -11
  327. package/dist/solid-start/index.d.ts +52 -0
  328. package/dist/solid-start/index.js +49 -0
  329. package/dist/{sources-BdOYLw9j.d.ts → sources-BV9j0DeZ.d.ts} +11 -13
  330. package/dist/{sources-4p0-4xQm.js → sources-vs5dGOsS.js} +147 -142
  331. package/dist/sql-B5T1IL83.js +55 -0
  332. package/dist/src-DLfUWFAI.js +1851 -0
  333. package/dist/ssf/index.d.ts +4 -4
  334. package/dist/ssf/index.js +440 -106
  335. package/dist/standard-webhooks-6lg8v_is.d.ts +88 -0
  336. package/dist/standard-webhooks-DgFFD-Ga.js +228 -0
  337. package/dist/storage-C2bWdvJH.js +132 -0
  338. package/dist/{store-DMAWwAJV.js → store-4u_hxjWa.js} +42 -55
  339. package/dist/{store-options-ByhZq1jV.js → store-options-BqEakYRa.js} +38 -24
  340. package/dist/{stores-BT2pSCub.js → stores-BbsD4fAR.js} +7 -3
  341. package/dist/stores-ClZUgeoP.d.ts +30 -0
  342. package/dist/{stream-D1RXubw2.d.ts → stream-7-xmnf3U.d.ts} +2 -2
  343. package/dist/{stream-DDpvynSB.js → stream-CvdUS9V1.js} +10 -2
  344. package/dist/style-DiKWnAvn.js +1 -0
  345. package/dist/{style-CTm1AXDT.js → style-Uao76wO7.js} +3 -2
  346. package/dist/subject-BGoM5o8B.js +17 -0
  347. package/dist/{subject-settings-BwBmCdTR.js → subject-settings-CkEwrw3W.js} +23 -5
  348. package/dist/supabase/index.d.ts +23 -106
  349. package/dist/supabase/index.js +5 -4
  350. package/dist/supabase/middleware.d.ts +13 -6
  351. package/dist/supabase/middleware.js +16 -11
  352. package/dist/supabase-9pqI57pW.js +92 -0
  353. package/dist/{supabase-C0qESOa-.js → supabase-Dxlp8A94.js} +124 -247
  354. package/dist/supabase-hook-CXcGpHqq.js +1 -0
  355. package/dist/{supabase-hook-ntETYCQu.js → supabase-hook-DdDQhMlw.js} +1659 -819
  356. package/dist/{supautils-u8jXTGrt.js → supautils-B6HYL9eL.js} +2 -2
  357. package/dist/support-session-C6xJQYut.js +158 -0
  358. package/dist/svelte/Protected.svelte +11 -4
  359. package/dist/svelte/index.d.ts +7 -7
  360. package/dist/svelte/index.js +26 -12
  361. package/dist/svelte/runtime.d.ts +10 -3
  362. package/dist/svelte/runtime.js +4 -3
  363. package/dist/svelte/source.d.ts +7 -7
  364. package/dist/svelte/source.js +5 -5
  365. package/dist/sveltekit/index.d.ts +51 -0
  366. package/dist/sveltekit/index.js +27 -0
  367. package/dist/tanstack-start/index.d.ts +51 -0
  368. package/dist/tanstack-start/index.js +40 -0
  369. package/dist/target-Bw37TFNA.js +51 -0
  370. package/dist/{validity-uOp8UpYn.js → tenancy-DN2QAx9z.js} +6 -42
  371. package/dist/terminal/index.d.ts +11 -9
  372. package/dist/terminal/index.js +36 -316
  373. package/dist/testing/index.d.ts +391 -106
  374. package/dist/testing/index.js +4574 -1286
  375. package/dist/testing/saas/index.d.ts +9 -8
  376. package/dist/testing/saas/index.js +2 -2
  377. package/dist/testing/saas/permissions.d.ts +1 -1
  378. package/dist/testing/saas/permissions.js +1 -2
  379. package/dist/text-BMFRfBqc.js +8 -0
  380. package/dist/{text-diff-BdkkYSbi.js → text-diff-BQcUapOb.js} +1 -1
  381. package/dist/thenable-yD7SabqG.js +31 -0
  382. package/dist/time-DkWjdL98.js +71 -0
  383. package/dist/{token-CIWxJOCh.js → token-BLZcjQgt.js} +15 -6
  384. package/dist/tool-refusal-CMLN5xhn.js +41 -0
  385. package/dist/trpc/index.d.ts +12 -9
  386. package/dist/trpc/index.js +18 -17
  387. package/dist/{types-DbjRN55U.d.ts → types-5Ut_pbKy.d.ts} +141 -13
  388. package/dist/types-BNORmDM8.d.ts +172 -0
  389. package/dist/types-BjV-fqcA.d.ts +57 -0
  390. package/dist/{types-QCuYJh4q.d.ts → types-BqAKcRNW.d.ts} +2 -1
  391. package/dist/types-C8-KNsFf.d.ts +107 -0
  392. package/dist/{types-aqOHTHcp.d.ts → types-CCpc2Dcv.d.ts} +77 -17
  393. package/dist/{types-Dnemwd77.d.ts → types-CZTnPFzM.d.ts} +50 -11
  394. package/dist/{types-C97IskBw.d.ts → types-CdlxsYQh.d.ts} +23 -11
  395. package/dist/{types-DxiCGmmd.d.ts → types-ClZaWzfb.d.ts} +9 -6
  396. package/dist/types-DX0LaKTb.d.ts +157 -0
  397. package/dist/types-DiQjupG2.d.ts +332 -0
  398. package/dist/types-DqzsnlSA.js +67 -0
  399. package/dist/types-_sHy8BQf.d.ts +65 -0
  400. package/dist/types-fbZ7JEXr.d.ts +89 -0
  401. package/dist/types-tIgIeIKJ.d.ts +66 -0
  402. package/dist/unplugin/index.d.ts +1 -1
  403. package/dist/unplugin/index.js +2 -2
  404. package/dist/usage-CHOtwL19.js +1 -0
  405. package/dist/usage-DHtE8j4E.js +32 -0
  406. package/dist/{usage-ItS7nLcl.js → usage-T5mXq98v.js} +56 -13
  407. package/dist/{validation-error-Ba264OaJ.d.ts → validation-error-Bg5Tpluk.d.ts} +1 -1
  408. package/dist/{validation-error-CnjZ4t92.js → validation-error-ZfUHbKvf.js} +1 -1
  409. package/dist/validity-CZ7-y0Cj.js +79 -0
  410. package/dist/{verifier-BxBo6I44.js → verifier-DHuh-okk.js} +68 -21
  411. package/dist/verify-DbCL9bnB.js +1770 -0
  412. package/dist/{version-BvacVTZR.js → version-CEbQ5UeM.js} +4 -3
  413. package/dist/version-DXkYUISx.js +1 -0
  414. package/dist/{views-Soe7bGSC.js → views-DTIIO-oQ.js} +41 -2
  415. package/dist/{permissions-DttnqqxC.d.ts → vocabulary-D6lPdb4Z.d.ts} +120 -29
  416. package/dist/vue/index.d.ts +25 -21
  417. package/dist/vue/index.js +25 -9
  418. package/dist/waiter-BGUtGYoU.js +67 -0
  419. package/dist/waiter-CKy4MQSY.d.ts +36 -0
  420. package/dist/watch-Cb-NcaUw.js +1 -0
  421. package/dist/{watch-DVBJ9cBq.js → watch-CszoTJMq.js} +47 -8
  422. package/dist/webmcp/index.d.ts +2 -2
  423. package/dist/webmcp/index.js +13 -37
  424. package/dist/where-scope-Dv-WTP-w.js +306 -0
  425. package/dist/who-can-D0QoYbEb.js +364 -0
  426. package/dist/wire-delegation-Cv3W2eaM.js +36 -0
  427. package/dist/wire-denial-C7PaVYEM.js +27 -0
  428. package/dist/workflow/index.d.ts +5 -0
  429. package/dist/workflow/index.js +223 -0
  430. package/dist/workflow-sdk/index.d.ts +56 -0
  431. package/dist/workflow-sdk/index.js +78 -0
  432. package/dist/wrap-Bd1Tejur.d.ts +15 -0
  433. package/dist/wrap-gX61EtpB.js +27 -0
  434. package/package.json +140 -41
  435. package/schemas/access-event-v1.json +118 -0
  436. package/schemas/approval-request-v1.json +34 -1
  437. package/schemas/approval-signature-v1.json +94 -0
  438. package/schemas/automation-event-v1.json +113 -0
  439. package/schemas/capability-v1.json +84 -0
  440. package/schemas/catalog-event-v1.json +87 -0
  441. package/schemas/catalog-v1.json +129 -12
  442. package/schemas/cli-commands-v1.json +164 -0
  443. package/schemas/cli-result-v1.json +96 -0
  444. package/schemas/cloud-api-v1.json +5407 -0
  445. package/schemas/connector-v1.json +408 -0
  446. package/schemas/credential-event-v1.json +81 -0
  447. package/schemas/credential-v1.json +134 -0
  448. package/schemas/decision-event-v1.json +288 -0
  449. package/schemas/delivery-event-v1.json +117 -0
  450. package/schemas/directory-event-v1.json +85 -0
  451. package/schemas/evidence-export-v1.json +54 -0
  452. package/schemas/membership-event-v1.json +93 -0
  453. package/schemas/policy-v1.json +68 -0
  454. package/schemas/pushed-policy-v1.json +236 -0
  455. package/schemas/run-v1.json +162 -0
  456. package/schemas/snapshot-v1.json +138 -0
  457. package/schemas/supabase-claims-v1.json +4 -4
  458. package/schemas/supabase-manifest-v1.json +5 -1
  459. package/schemas/support-session-v1.json +111 -0
  460. package/skills/permdock/SKILL.md +16 -12
  461. package/skills/permdock-agents/SKILL.md +40 -23
  462. package/skills/permdock-agents/references/operations-automations-chat.md +221 -0
  463. package/skills/permdock-agents/references/runtimes.md +22 -18
  464. package/skills/permdock-approvals/SKILL.md +29 -13
  465. package/skills/permdock-approvals/references/delivery-and-waiters.md +172 -0
  466. package/skills/permdock-approvals/references/stores-and-resume.md +21 -7
  467. package/skills/permdock-audit/SKILL.md +3 -3
  468. package/skills/permdock-credentials/SKILL.md +5 -5
  469. package/skills/permdock-credentials/references/tokens-keys-links.md +19 -10
  470. package/skills/permdock-data/SKILL.md +6 -6
  471. package/skills/permdock-data/references/queries-and-rls.md +13 -8
  472. package/skills/permdock-data/references/relationships.md +3 -3
  473. package/skills/permdock-tenancy/SKILL.md +20 -7
  474. package/skills/permdock-tenancy/references/contacts-and-support-sessions.md +122 -0
  475. package/skills/permdock-tenancy/references/ownership-and-custom-roles.md +6 -4
  476. package/skills/permdock-wire/SKILL.md +18 -12
  477. package/skills/permdock-wire/references/adapters.md +146 -50
  478. package/skills/permdock-wire/references/policy-options.md +15 -6
  479. package/skills/permdock-wire/references/presets-and-recipes.md +58 -0
  480. package/dist/approvals-DbYAuNkG.js +0 -224
  481. package/dist/arazzo-C9chp3ST.js +0 -54
  482. package/dist/bind-C_ob3LKa.d.ts +0 -25
  483. package/dist/catalog-CRW5Mx_B.js +0 -2
  484. package/dist/catalog-CYj-mX2O.js +0 -48
  485. package/dist/catalog-DWF5cYqB.js +0 -55
  486. package/dist/cloud-CfwZ39Rl.js +0 -50
  487. package/dist/cloud-DWLXO2af.js +0 -118
  488. package/dist/collect-CHB22Sx4.js +0 -83
  489. package/dist/collect-DSWOk19R.js +0 -2
  490. package/dist/commands-BeaGNj_o.js +0 -97
  491. package/dist/config-ir40y8m0.js +0 -36
  492. package/dist/create-CMwIl-w2.js +0 -253
  493. package/dist/delegation-D8pUEuce.js +0 -103
  494. package/dist/diff-C9RDjjhs.js +0 -48
  495. package/dist/doctor-Djh6JDEk.js +0 -53
  496. package/dist/doctor-DvH0IQff.js +0 -1194
  497. package/dist/doctor-collect-CjdO0wQX.js +0 -665
  498. package/dist/duration-xK2jGFVc.js +0 -25
  499. package/dist/errors-CWfoNg9N.js +0 -47
  500. package/dist/errors-DRnGZHzF.js +0 -30
  501. package/dist/evaluation-items-CfCCejQd.js +0 -40
  502. package/dist/expiry-BoBJ8Tvc.js +0 -7
  503. package/dist/fields-BMl1RxoX.js +0 -26
  504. package/dist/grantee-Cv5Sogfv.js +0 -602
  505. package/dist/headers-BZSDieNT.js +0 -6
  506. package/dist/headers-Cf-zWvsO.d.ts +0 -6
  507. package/dist/ids-DC4V4CFu.js +0 -18
  508. package/dist/index-0nNqHspG.d.ts +0 -6
  509. package/dist/index-BNc7Wer_.d.ts +0 -483
  510. package/dist/index-C7Tw7MaW.d.ts +0 -201
  511. package/dist/instance-options-Dhhcnm3y.js +0 -22
  512. package/dist/load-DwJUafYN.js +0 -2
  513. package/dist/manifest-iaoBXHKc.js +0 -783
  514. package/dist/map-AcxK9o_D.js +0 -147
  515. package/dist/may-use-DndQ5tQ-.js +0 -77
  516. package/dist/openapi-CQTsgKoB.js +0 -164
  517. package/dist/permdock-CbgvLnuo.js +0 -3479
  518. package/dist/permissions-DVoF6dMt.js +0 -662
  519. package/dist/policy-xyWg7QdR.js +0 -1122
  520. package/dist/powersync-CrBX8hY6.js +0 -2
  521. package/dist/powersync-DE19b9dT.js +0 -62
  522. package/dist/protected-BdnIEFkY.d.ts +0 -27
  523. package/dist/protected-xAr24FEC.d.ts +0 -40
  524. package/dist/relations-cjOL01hZ.js +0 -505
  525. package/dist/rls-P-BeBx0n.js +0 -238
  526. package/dist/rls-graph-CHwx0V8q.js +0 -435
  527. package/dist/rls-ownership-DcYlZ09B.js +0 -843
  528. package/dist/rls-shared-Cewd_-zI.js +0 -495
  529. package/dist/rls-verify-CMv9H3wV.js +0 -746
  530. package/dist/run-BWc9qqvE.js +0 -174
  531. package/dist/server-DlZ28Oz5.js +0 -268
  532. package/dist/sink-B1fZzIMf.d.ts +0 -104
  533. package/dist/sink-Bd9PSyfq.js +0 -141
  534. package/dist/skills-C5CbhhpG.js +0 -56
  535. package/dist/snapshot-Enxd0n-s.js +0 -975
  536. package/dist/sql-xdg5f4Fi.js +0 -27
  537. package/dist/src-BDwEZWrZ.js +0 -568
  538. package/dist/store-jOBYpiXC.d.ts +0 -36
  539. package/dist/stores-C0IMQrGI.d.ts +0 -52
  540. package/dist/subject-C6dLxqHU.js +0 -24
  541. package/dist/supabase-config-Bj3iDH2I.js +0 -472
  542. package/dist/supabase-hook-gd3s8bxB.js +0 -2
  543. package/dist/supabase-s4o9s1O1.js +0 -83
  544. package/dist/thenable-okc2xDsj.js +0 -10
  545. package/dist/types-BnIEz1sU.d.ts +0 -48
  546. package/dist/types-Bvc4oWT6.d.ts +0 -9
  547. package/dist/types-CKNSyIf_.d.ts +0 -52
  548. package/dist/types-Cq_H8N_X.d.ts +0 -197
  549. package/dist/usage-B0YuTQRO.js +0 -42
  550. package/dist/usage-DorAJiU_.js +0 -2
  551. package/dist/vocabulary-DA8a8zif.d.ts +0 -56
  552. package/dist/watch-BwxLTYMZ.js +0 -2
@@ -1,404 +1,297 @@
1
- import { t as compact } from "../compact-y6vfu2_f.js";
1
+ import { r as isRecord, t as compact } from "../compact-CAf557ZB.js";
2
2
  import { n as freezeDeep } from "../freeze-CrU8nQeX.js";
3
- import { T as isForbiddenKey } from "../permissions-DVoF6dMt.js";
4
- import { i as parsePolicyDocument } from "../hosted-DJQw46hn.js";
5
- import { t as CLOUD_EVENT_TYPES } from "../sink-Bd9PSyfq.js";
6
- import { r as isApprovalErrorCode, t as ApprovalError } from "../errors-DRnGZHzF.js";
7
- import { t as joseTokenVerifier } from "../verifier-BxBo6I44.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 isRecord$1(value) {
24
- return value !== null && typeof value === "object" && !Array.isArray(value);
25
- }
26
- function asApproval(value) {
27
- if (!isRecord$1(value) || value["v"] !== 1 || typeof value["token"] !== "string") return null;
28
- return value;
29
- }
30
- function isCompactJws$1(value) {
31
- 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-BWRSXgOF.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
+ };
32
19
  }
33
- /** The refusal PermDock Cloud names in its body, else the one its status implies. */
34
- async function approvalErrorFrom(response) {
35
- let body;
36
- try {
37
- body = await response.json();
38
- } catch {
39
- 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" };
40
34
  }
41
- if (body === null || typeof body !== "object" || !("code" in body)) return approvalErrorFromStatus(response.status);
42
- const code = body.code;
43
- if (!isApprovalErrorCode(code)) return approvalErrorFromStatus(response.status);
44
- const detail = "detail" in body ? body.detail : void 0;
45
- return new ApprovalError(code, typeof detail === "string" && detail.length > 0 ? detail : code);
46
- }
47
- function approvalErrorFromStatus(status) {
48
- if (status === 409) return new ApprovalError("approval-not-pending", "approval is not pending");
49
- if (status === 410) return new ApprovalError("approval-expired", "approval has expired");
50
- 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);
51
41
  }
52
42
  /**
53
- * The environment URL and JWK Set URL `cloud()` uses, resolved with the same
54
- * 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.
55
49
  */
56
- function cloudEndpoints(options = {}) {
57
- const url = trimSlash(firstNonEmpty(options.url, readEnv("PERMDOCK_CLOUD_URL")));
58
- if (url === "") throw new Error("PermDock: cloud() requires url and key.");
59
- const environment = firstNonEmpty(options.environment, readEnv("PERMDOCK_CLOUD_ENV"), readEnv("VERCEL_ENV"), "production");
60
- const issuer = `${url}/v1/environments/${encodeURIComponent(environment)}`;
50
+ function cloudDeliveryTransport(channel, options = {}) {
51
+ const connection = cloudConnection(options);
61
52
  return Object.freeze({
62
- issuer,
63
- jwks: `${issuer}/.well-known/jwks.json`
64
- });
65
- }
66
- function cloud(options = {}) {
67
- const key = firstNonEmpty(options.key, readEnv("PERMDOCK_CLOUD_KEY"));
68
- if (key === "") throw new Error("PermDock: cloud() requires url and key.");
69
- const { issuer: root, jwks } = cloudEndpoints(options);
70
- const fetchFn = options.fetch ?? globalThis.fetch.bind(globalThis);
71
- const flushAt = options.flushAt ?? 32;
72
- const waitUntil = options.waitUntil;
73
- const headers = () => {
74
- const next = new Headers();
75
- next.set("authorization", `Bearer ${key}`);
76
- next.set("content-type", "application/json");
77
- return next;
78
- };
79
- const request = (path, init = {}, accept) => {
80
- const next = headers();
81
- if (accept !== void 0) next.set("accept", accept);
82
- return fetchFn(`${root}${path}`, {
83
- ...init,
84
- headers: next,
85
- signal: timeoutSignal(CLOUD_TIMEOUT_MS, init.signal)
86
- });
87
- };
88
- const approvals = {
89
- async create(record) {
90
- if (!(await request("/approvals", {
91
- method: "POST",
92
- body: JSON.stringify(record)
93
- })).ok) throw new Error("PermDock Cloud rejected the approval create");
94
- },
95
- async get(token) {
96
- try {
97
- const response = await request(`/approvals/${encodeURIComponent(token)}`);
98
- if (!response.ok) return null;
99
- return asApproval(await response.json());
100
- } catch {
101
- return null;
102
- }
103
- },
104
- async resolve(token, verdict) {
105
- const response = await request(`/approvals/${encodeURIComponent(token)}/resolve`, {
106
- method: "POST",
107
- body: JSON.stringify(verdict)
108
- });
109
- if (!response.ok) throw await approvalErrorFrom(response);
110
- const parsed = asApproval(await response.json());
111
- if (parsed === null) throw new ApprovalError("approval-not-found", "PermDock Cloud returned an unknown approval shape");
112
- return parsed;
113
- },
114
- 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;
115
62
  try {
116
- const response = await request(`/approvals/${encodeURIComponent(token)}/consume`, {
117
- method: "POST",
118
- 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
119
75
  });
120
- if (!response.ok) return null;
121
- return asApproval(await response.json());
122
76
  } catch {
123
- return null;
77
+ return {
78
+ status: "failed",
79
+ cause: "invalid-message",
80
+ retryable: false
81
+ };
124
82
  }
125
- },
126
- async list(query) {
127
- const params = new URLSearchParams(compact({
128
- status: query.status,
129
- principalId: query.principalId,
130
- actorId: query.actorId,
131
- tenant: query.tenant,
132
- session: query.session,
133
- limit: query.limit === void 0 ? void 0 : String(query.limit),
134
- cursor: query.cursor
135
- }));
136
- const suffix = params.size === 0 ? "" : `?${params.toString()}`;
137
83
  try {
138
- const response = await request(`/approvals${suffix}`);
139
- if (!response.ok) return { items: [] };
140
- const body = await response.json();
141
- if (!isRecord$1(body) || !Array.isArray(body["items"])) return { items: [] };
142
- const items = body["items"].flatMap((item) => {
143
- const parsed = asApproval(item);
144
- return parsed === null ? [] : [parsed];
145
- });
146
- return typeof body["next"] === "string" && body["next"] !== "" ? {
147
- items,
148
- next: body["next"]
149
- } : { items };
84
+ return await fromResponse(await connection.request("/deliveries", {
85
+ method: "POST",
86
+ headers: { "idempotency-key": transportOptions.idempotencyKey },
87
+ body
88
+ }));
150
89
  } catch {
151
- return { items: [] };
90
+ return failed("unavailable", true, "request failed");
152
91
  }
153
- },
154
- async cancel(filter, meta) {
155
- 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", {
156
144
  method: "POST",
157
145
  body: JSON.stringify(compact({
158
- filter,
159
- by: meta.by,
160
- note: meta.note
146
+ typ: signOptions.typ,
147
+ claims,
148
+ aud: audience,
149
+ exp: signOptions.expiresAt,
150
+ iat: signOptions.issuedAt,
151
+ jti: signOptions.jti
161
152
  }))
162
- });
163
- if (!response.ok) throw new Error("PermDock Cloud rejected the approval cancel");
164
- const body = await response.json();
165
- if (!isRecord$1(body) || typeof body["cancelled"] !== "number") throw new Error("PermDock Cloud returned an unknown cancel shape");
166
- 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;
167
158
  },
168
- async expire(now) {
159
+ async jwks() {
169
160
  try {
170
- const response = await request("/approvals/expire", {
171
- method: "POST",
172
- body: JSON.stringify(compact({ now: now === void 0 ? void 0 : now.toISOString() }))
173
- });
174
- if (!response.ok) return 0;
175
- const body = await response.json();
176
- if (!isRecord$1(body) || typeof body["expired"] !== "number") return 0;
177
- 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) };
178
164
  } catch {
179
- return 0;
165
+ return { keys: [] };
180
166
  }
181
167
  }
182
- };
183
- const capacity = options.capacity ?? 1e4;
184
- const pending = [];
185
- const bound = () => {
186
- if (pending.length > capacity) pending.splice(0, pending.length - capacity);
187
- };
188
- const flush = async () => {
189
- if (pending.length === 0) return;
190
- const events = pending.splice(0);
191
- try {
192
- if (!(await request("/decisions", {
193
- method: "POST",
194
- body: JSON.stringify({ events })
195
- })).ok) pending.unshift(...events);
196
- } catch {
197
- pending.unshift(...events);
198
- }
199
- bound();
200
- };
201
- const sink = {
202
- write(events) {
203
- pending.push(...events);
204
- bound();
205
- if (pending.length >= flushAt) return flush();
206
- if (waitUntil !== void 0 && pending.length > 0) waitUntil(flush());
207
- },
208
- flush
209
- };
210
- const snapshots = { async get() {
211
- const response = await request("/snapshot", {}, "application/jwt");
212
- if (!response.ok) throw new Error("PermDock Cloud snapshot request failed");
213
- const text = (await response.text()).trim();
214
- if (!isCompactJws$1(text)) throw new Error("PermDock Cloud served an unsigned snapshot");
215
- return text;
216
- } };
217
- let document = null;
218
- return freezeDeep({
219
- approvals,
220
- sink,
221
- snapshots,
222
- policies: {
223
- current() {
224
- return document;
225
- },
226
- async refresh() {
227
- const verifier = options.verifier;
228
- if (verifier === void 0) return;
229
- let response;
230
- try {
231
- response = await request("/policy");
232
- } catch {
233
- return;
234
- }
235
- if (response.status === 404) {
236
- document = null;
237
- return;
238
- }
239
- if (!response.ok) return;
240
- const token = (await response.text()).trim();
241
- if (!isCompactJws$1(token)) return;
242
- const verified = await verifier.verify(token, {
243
- typ: "permdock-policy+jwt",
244
- issuer: root,
245
- audience: root
246
- });
247
- if (!verified.ok) return;
248
- let next;
249
- try {
250
- next = parsePolicyDocument(verified.claims["policy"]);
251
- } catch {
252
- return;
253
- }
254
- document = next;
255
- }
256
- },
257
- issuer: root,
258
- jwks
259
168
  });
260
169
  }
261
170
  //#endregion
262
171
  //#region src/cloud/webhook.ts
263
- const TYPES = new Set(Object.values(CLOUD_EVENT_TYPES));
264
- function isRecord(value) {
265
- return value !== null && typeof value === "object" && !Array.isArray(value);
266
- }
267
- function hasUnsafeKey(value) {
268
- if (Array.isArray(value)) return value.some(hasUnsafeKey);
269
- if (!isRecord(value)) return false;
270
- return Object.keys(value).some((key) => isForbiddenKey(key) || hasUnsafeKey(value[key]));
271
- }
272
- const FINDING_CODES = /* @__PURE__ */ new Set([
273
- "permission-removed",
274
- "not-hostable",
275
- "grantee-removed",
276
- "approval-tightened"
277
- ]);
278
- function isFinding(value) {
279
- return isRecord(value) && FINDING_CODES.has(value["code"]) && typeof value["permission"] === "string" && (value["grant"] === void 0 || typeof value["grant"] === "string");
280
- }
281
- function validData(type, data) {
282
- switch (type) {
283
- case "dev.permdock.decision": return data["type"] === "decision" && typeof data["permission"] === "string";
284
- case "dev.permdock.approval": return data["type"] === "decision" && (data["phase"] === "requested" || data["phase"] === "resolved");
285
- case "dev.permdock.directory": return data["type"] === "directory" && typeof data["tenant"] === "string";
286
- case "dev.permdock.membership": return data["type"] === "membership" && isRecord(data["principal"]);
287
- 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");
288
- 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));
289
- case "dev.permdock.access.started":
290
- case "dev.permdock.access.ended":
291
- case "dev.permdock.access.revoked": return data["type"] === "access" && typeof data["tenant"] === "string" && isRecord(data["principal"]) && typeof data["principal"]["id"] === "string";
292
- default: return type;
293
- }
294
- }
295
172
  /**
296
- * Validates one CloudEvent against the closed type list and its data shape;
297
- * 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.
298
175
  */
299
176
  function parseCloudEvent(value) {
300
- 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;
301
- return freezeDeep(JSON.parse(JSON.stringify(value)));
177
+ return parseCloudEvent$1(value);
302
178
  }
303
179
  function verifierFor(options) {
304
180
  if (options.verifier !== void 0) return options.verifier;
305
- if (options.jwks === void 0) return;
181
+ if (options.replay === void 0 || options.jwks === void 0 && options.secret === void 0) return;
306
182
  try {
307
- return joseTokenVerifier({
308
- jwks: typeof options.jwks === "string" ? new URL(options.jwks) : options.jwks,
309
- algorithms: ["Ed25519", "ES256"]
310
- });
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
+ }));
311
191
  } catch {
312
192
  return;
313
193
  }
314
194
  }
315
- function isCompactJws(value) {
316
- 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);
317
207
  }
318
208
  /**
319
- * Verifies a PermDock Cloud webhook delivery: a compact JWS with
320
- * `typ: permdock-decisions+jwt` whose `events` claim holds CloudEvents.
321
- * 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.
322
213
  */
323
214
  async function verifyWebhook(request, options) {
324
- let body;
325
- try {
326
- body = (await request.text()).trim();
327
- } catch {
328
- return {
329
- ok: false,
330
- reason: "unsigned"
331
- };
332
- }
333
- if (!isCompactJws(body)) return {
334
- ok: false,
335
- reason: "unsigned"
336
- };
337
215
  const verifier = verifierFor(options);
338
216
  if (verifier === void 0) return {
339
217
  ok: false,
340
- reason: "invalid-token",
341
- cause: "jwks-unavailable"
218
+ cause: "keys-unavailable"
342
219
  };
343
- let verified;
344
- try {
345
- verified = await verifier.verify(body, {
346
- typ: "permdock-decisions+jwt",
347
- audience: options.audience
348
- });
349
- } catch {
350
- return {
351
- ok: false,
352
- reason: "invalid-token",
353
- cause: "malformed"
354
- };
355
- }
220
+ const verified = await verifier.verify(request);
356
221
  if (!verified.ok) return {
357
222
  ok: false,
358
- reason: "invalid-token",
359
223
  cause: verified.cause
360
224
  };
361
- const jti = verified.claims["jti"];
362
- const raw = verified.claims["events"];
363
- if (typeof jti !== "string" || !Array.isArray(raw)) return {
225
+ const events = eventsOf(verified.body);
226
+ if (events === null) return {
364
227
  ok: false,
365
- reason: "invalid-events"
228
+ cause: "invalid-events"
366
229
  };
367
- const events = [];
368
- for (const item of raw) {
369
- const parsed = parseCloudEvent(item);
370
- if (parsed === null) return {
371
- ok: false,
372
- reason: "invalid-events"
373
- };
374
- events.push(parsed);
375
- }
376
- if (options.replay !== void 0) {
377
- const key = `permdock-webhook:${jti}`;
378
- const expiresAt = typeof verified.claims.exp === "number" ? verified.claims.exp : void 0;
379
- try {
380
- if (options.replay.claim === void 0) {
381
- if (await options.replay.seen(key)) return {
382
- ok: false,
383
- reason: "replayed"
384
- };
385
- await options.replay.remember(key, expiresAt);
386
- } else if (!await options.replay.claim(key, expiresAt)) return {
387
- ok: false,
388
- reason: "replayed"
389
- };
390
- } catch {
391
- return {
392
- ok: false,
393
- reason: "replayed"
394
- };
395
- }
396
- }
397
230
  return freezeDeep({
398
231
  ok: true,
399
- id: jti,
232
+ id: verified.id,
233
+ timestamp: verified.timestamp,
400
234
  events
401
235
  });
402
236
  }
403
237
  //#endregion
404
- 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 };