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,7 +1,12 @@
1
1
  import { n as isReadonlyArray, r as isRecord, t as compact } from "./compact-CAf557ZB.js";
2
2
  import { n as freezeDeep } from "./freeze-CrU8nQeX.js";
3
- import { n as sha256 } from "./sha256-BO0swRXL.js";
4
- import { a as memorySink, i as membershipEvent } from "./sink-BTtmfPnE.js";
3
+ import { i as readAppData } from "./app-data-MuyzVqX8.js";
4
+ import { d as isoNow } from "./time-DkWjdL98.js";
5
+ import { t as canonicalJson } from "./canonical-json-BC8_nMTw.js";
6
+ import { n as sha256, r as sha256Digest } from "./sha256-D9ihqmvd.js";
7
+ import { d as membershipEvent, f as memoryDecisionSink } from "./sink-BEZSlMS_.js";
8
+ import { n as readBodyText, t as MAX_BODY_BYTES } from "./body-text-QcXok_SI.js";
9
+ import { t as readClaim } from "./claims-map-7oQ3ue4X.js";
5
10
  //#region src/scim/auth.ts
6
11
  function hexToBytes(hex) {
7
12
  if (hex.length % 2 !== 0) return;
@@ -33,9 +38,12 @@ async function matchStaticToken(tenant, token, options) {
33
38
  }
34
39
  return timingSafeEqual(actual, expected);
35
40
  }
36
- function tenantClaim(claims) {
37
- if (typeof claims["tenant"] === "string" && claims["tenant"] !== "") return claims["tenant"];
38
- if (typeof claims["tid"] === "string" && claims["tid"] !== "") return claims["tid"];
41
+ /** The tenant a JWT names: `claims.tenant` when set, else `tenant`, then `tid`. */
42
+ function tenantClaim(claims, path) {
43
+ for (const candidate of path === void 0 ? ["tenant", "tid"] : [path]) {
44
+ const value = readClaim(claims, candidate);
45
+ if (typeof value === "string" && value !== "") return value;
46
+ }
39
47
  }
40
48
  async function authenticateScim(input) {
41
49
  const bearer = bearerToken(input.request);
@@ -58,7 +66,7 @@ async function authenticateScim(input) {
58
66
  ok: false,
59
67
  status: 401
60
68
  };
61
- if (tenantClaim(verified.claims) !== input.tenant) return {
69
+ if (tenantClaim(verified.claims, input.claims?.tenant) !== input.tenant) return {
62
70
  ok: false,
63
71
  status: 403
64
72
  };
@@ -84,7 +92,10 @@ const GROUP_SCHEMA = "urn:ietf:params:scim:schemas:core:2.0:Group";
84
92
  const LIST_SCHEMA = "urn:ietf:params:scim:api:messages:2.0:ListResponse";
85
93
  const ERROR_SCHEMA = "urn:ietf:params:scim:api:messages:2.0:Error";
86
94
  const PATCH_SCHEMA = "urn:ietf:params:scim:api:messages:2.0:PatchOp";
87
- const ROLES_EXTENSION = "urn:permdock:scim:schemas:extension:roles:1.0";
95
+ /** The RFC 7643 section 3.3 Group extension that carries PermDock roles. */
96
+ const ROLES_EXTENSION = "urn:ietf:params:scim:schemas:extension:permdock:2.0:Group";
97
+ /** The extension that carries the application's own data (`x`) on a User or a Group. */
98
+ const APP_DATA_EXTENSION = "urn:ietf:params:scim:schemas:extension:permdock:2.0:AppData";
88
99
  var DirectoryUniquenessError = class extends Error {
89
100
  name = "DirectoryUniquenessError";
90
101
  code = "uniqueness";
@@ -99,11 +110,16 @@ var DirectoryNotFoundError = class extends Error {
99
110
  super(message);
100
111
  }
101
112
  };
113
+ function isNamedError(error, name, code) {
114
+ return error instanceof Error && error.name === name && Reflect.get(error, "code") === code;
115
+ }
116
+ /** Matches by `name` and `code`, so an error from another copy of the module still maps. */
102
117
  function isDirectoryUniquenessError(error) {
103
- return error instanceof DirectoryUniquenessError;
118
+ return isNamedError(error, "DirectoryUniquenessError", "uniqueness");
104
119
  }
120
+ /** Matches by `name` and `code`, so an error from another copy of the module still maps. */
105
121
  function isDirectoryNotFoundError(error) {
106
- return error instanceof DirectoryNotFoundError;
122
+ return isNamedError(error, "DirectoryNotFoundError", "not-found");
107
123
  }
108
124
  //#endregion
109
125
  //#region src/scim/discovery.ts
@@ -123,7 +139,7 @@ function serviceProviderConfig() {
123
139
  },
124
140
  changePassword: { supported: false },
125
141
  sort: { supported: false },
126
- etag: { supported: false },
142
+ etag: { supported: true },
127
143
  pagination: {
128
144
  cursor: true,
129
145
  index: true
@@ -144,7 +160,10 @@ function resourceTypes() {
144
160
  name: "User",
145
161
  endpoint: "/Users",
146
162
  schema: USER_SCHEMA,
147
- schemaExtensions: []
163
+ schemaExtensions: [{
164
+ schema: APP_DATA_EXTENSION,
165
+ required: false
166
+ }]
148
167
  }, {
149
168
  schemas: ["urn:ietf:params:scim:schemas:core:2.0:ResourceType"],
150
169
  id: "Group",
@@ -154,6 +173,9 @@ function resourceTypes() {
154
173
  schemaExtensions: [{
155
174
  schema: ROLES_EXTENSION,
156
175
  required: false
176
+ }, {
177
+ schema: APP_DATA_EXTENSION,
178
+ required: false
157
179
  }]
158
180
  }];
159
181
  }
@@ -208,6 +230,12 @@ function schemas() {
208
230
  id: ROLES_EXTENSION,
209
231
  name: "PermDockRoles",
210
232
  attributes: [attribute("roles", "string", { multiValued: true })]
233
+ },
234
+ {
235
+ schemas: [SCHEMA_SCHEMA],
236
+ id: APP_DATA_EXTENSION,
237
+ name: "PermDockAppData",
238
+ attributes: [attribute("x", "complex")]
211
239
  }
212
240
  ];
213
241
  }
@@ -445,10 +473,21 @@ function filterSupported(filter) {
445
473
  }
446
474
  //#endregion
447
475
  //#region src/scim/body.ts
476
+ /** The parsed body; `undefined` for an empty or unreadable one. Invalid JSON throws a `SyntaxError`. */
448
477
  async function readJson(request) {
449
- const text = await request.text();
450
- if (text === "") return;
451
- return JSON.parse(text);
478
+ const read = await readBodyText(request);
479
+ if (!read.ok) return read.cause === "too-large" ? { tooLarge: true } : {
480
+ tooLarge: false,
481
+ body: void 0
482
+ };
483
+ if (read.text === "") return {
484
+ tooLarge: false,
485
+ body: void 0
486
+ };
487
+ return {
488
+ tooLarge: false,
489
+ body: JSON.parse(read.text)
490
+ };
452
491
  }
453
492
  function schemasOk(body, required) {
454
493
  const listed = body["schemas"];
@@ -460,6 +499,11 @@ function readRoles(body) {
460
499
  if (!isRecord(extension) || !Array.isArray(extension["roles"])) return;
461
500
  return extension["roles"].filter((item) => typeof item === "string");
462
501
  }
502
+ /** `x` from the `AppData` extension; a value that is not a plain JSON object is dropped. */
503
+ function readX(body) {
504
+ const extension = body[APP_DATA_EXTENSION];
505
+ return isRecord(extension) && extension["x"] !== void 0 ? readAppData(void 0, extension["x"]) : void 0;
506
+ }
463
507
  function userFromBody(body, id) {
464
508
  if (typeof body["userName"] !== "string" || body["userName"] === "") return;
465
509
  const emails = Array.isArray(body["emails"]) ? body["emails"].flatMap((item) => {
@@ -477,6 +521,7 @@ function userFromBody(body, id) {
477
521
  externalId: typeof body["externalId"] === "string" ? body["externalId"] : void 0,
478
522
  active,
479
523
  emails,
524
+ x: readX(body),
480
525
  meta: {
481
526
  created: "",
482
527
  lastModified: ""
@@ -495,6 +540,7 @@ function groupFromBody(body, id, fallbackRoles) {
495
540
  externalId: typeof body["externalId"] === "string" ? body["externalId"] : void 0,
496
541
  members,
497
542
  roles: readRoles(body) ?? fallbackRoles,
543
+ x: readX(body),
498
544
  meta: {
499
545
  created: "",
500
546
  lastModified: ""
@@ -547,7 +593,7 @@ function membershipEventsForGroup(input) {
547
593
  }
548
594
  async function emitDirectory(options, event, userIds, extra = [], known = []) {
549
595
  const kind = event.resource.type === "User" && event.active === false ? "session-revoked" : "changed";
550
- const sink = options.sink ?? memorySink();
596
+ const sink = options.sink ?? memoryDecisionSink();
551
597
  try {
552
598
  await sink.write([event, ...extra]);
553
599
  } catch {}
@@ -567,7 +613,7 @@ async function principalIds(options, tenant, userIds, known) {
567
613
  const hit = known.find((user) => user.id === id);
568
614
  if (hit !== void 0) return hit;
569
615
  try {
570
- return await options.store.getUser(tenant, id);
616
+ return await options.directory.getUser(tenant, id);
571
617
  } catch {
572
618
  return null;
573
619
  }
@@ -596,7 +642,7 @@ async function publish(options, kind, tenant, userIds, known) {
596
642
  function directoryEvent(input) {
597
643
  return compact({
598
644
  type: "directory",
599
- at: (/* @__PURE__ */ new Date()).toISOString(),
645
+ at: isoNow(),
600
646
  source: "scim",
601
647
  operation: input.operation,
602
648
  tenant: input.tenant,
@@ -626,7 +672,7 @@ function coerceActive(value) {
626
672
  }
627
673
  }
628
674
  function rolesPath(path) {
629
- return path === "roles" || path === `urn:permdock:scim:schemas:extension:roles:1.0:roles` || path === `urn:permdock:scim:schemas:extension:roles:1.0.roles`;
675
+ return path === "roles" || path === `urn:ietf:params:scim:schemas:extension:permdock:2.0:Group:roles` || path === `urn:ietf:params:scim:schemas:extension:permdock:2.0:Group.roles`;
630
676
  }
631
677
  function opName(value) {
632
678
  if (typeof value !== "string") return;
@@ -649,7 +695,7 @@ function normalizePatchOps(ops) {
649
695
  continue;
650
696
  }
651
697
  for (const [key, value] of Object.entries(raw["value"])) {
652
- if (key === "urn:permdock:scim:schemas:extension:roles:1.0" && isRecord(value)) {
698
+ if (key === "urn:ietf:params:scim:schemas:extension:permdock:2.0:Group" && isRecord(value)) {
653
699
  next.push({
654
700
  op,
655
701
  path: "roles",
@@ -736,25 +782,63 @@ function scimResponse(status, body, extra) {
736
782
  }
737
783
  });
738
784
  }
739
- function scimError(status, scimType, detail) {
740
- return scimResponse(status, {
785
+ /** RFC 7644 section 3.12: `scimType` is defined for `400` and `409` only, so other statuses omit it. */
786
+ function scimError(status, scimType, detail, extra) {
787
+ return scimResponse(status, compact({
741
788
  schemas: [ERROR_SCHEMA],
742
789
  status: String(status),
743
- scimType,
790
+ scimType: status === 400 || status === 409 ? scimType : void 0,
744
791
  detail
745
- });
792
+ }), extra);
746
793
  }
747
794
  function unauthorized() {
748
- return new Response(null, {
749
- status: 401,
750
- headers: { "www-authenticate": "Bearer" }
751
- });
795
+ return scimError(401, "", "authentication required", { "www-authenticate": "Bearer" });
752
796
  }
753
797
  function forbidden() {
754
- return new Response(null, {
755
- status: 403,
756
- headers: { "www-authenticate": "Bearer" }
757
- });
798
+ return scimError(403, "", "the credential may not provision this tenant", { "www-authenticate": "Bearer error=\"insufficient_scope\"" });
799
+ }
800
+ /**
801
+ * RFC 7644 section 3.14 `meta.version`: a weak entity tag over the
802
+ * resource as rendered, `meta.location` excluded so every URL agrees.
803
+ */
804
+ function withVersion(resource, meta) {
805
+ const { location: _location, ...stable } = meta;
806
+ const version = `W/"${sha256Digest(canonicalJson({
807
+ ...resource,
808
+ meta: stable
809
+ }))}"`;
810
+ return {
811
+ ...resource,
812
+ meta: {
813
+ ...meta,
814
+ version
815
+ }
816
+ };
817
+ }
818
+ /** The `meta.version` a rendered resource carries, for `ETag`. */
819
+ function versionOf(rendered) {
820
+ const meta = rendered["meta"];
821
+ return isRecord(meta) && typeof meta["version"] === "string" ? meta["version"] : "";
822
+ }
823
+ function entityTags(field) {
824
+ return field.split(",").map((tag) => tag.trim().replace(/^W\//u, "")).filter((tag) => tag !== "");
825
+ }
826
+ /** RFC 9110 section 13.1.1 `If-Match` against a weak `meta.version`: `true` when the request may proceed. */
827
+ function ifMatchHolds(request, version) {
828
+ const field = request.headers.get("if-match");
829
+ if (field === null) return true;
830
+ const tags = entityTags(field);
831
+ return tags.includes("*") || tags.includes(version.replace(/^W\//u, ""));
832
+ }
833
+ /** RFC 9110 section 13.1.2 `If-None-Match`: `true` when the client holds `version`. */
834
+ function ifNoneMatchHolds(request, version) {
835
+ const field = request.headers.get("if-none-match");
836
+ if (field === null) return false;
837
+ const tags = entityTags(field);
838
+ return tags.includes("*") || tags.includes(version.replace(/^W\//u, ""));
839
+ }
840
+ function preconditionFailed() {
841
+ return scimError(412, "", "the resource changed since meta.version");
758
842
  }
759
843
  function mapStoreError(error) {
760
844
  if (isDirectoryUniquenessError(error)) return scimError(409, "uniqueness", error.message);
@@ -771,37 +855,53 @@ function listBody(result, render) {
771
855
  Resources: result.Resources.map(render)
772
856
  });
773
857
  }
858
+ /** The `AppData` extension for `x`, and the schema URN it adds. */
859
+ function appData(x) {
860
+ return x === void 0 ? {
861
+ schemas: [],
862
+ body: {}
863
+ } : {
864
+ schemas: [APP_DATA_EXTENSION],
865
+ body: { [APP_DATA_EXTENSION]: { x } }
866
+ };
867
+ }
774
868
  function renderUser(user, location) {
775
- return compact({
776
- schemas: [USER_SCHEMA],
869
+ const data = appData(user.x);
870
+ return withVersion(compact({
871
+ schemas: [USER_SCHEMA, ...data.schemas],
777
872
  id: user.id,
778
873
  externalId: user.externalId,
779
874
  userName: user.userName,
780
875
  active: user.active,
781
876
  emails: user.emails,
782
- meta: {
783
- resourceType: "User",
784
- created: user.meta.created,
785
- lastModified: user.meta.lastModified,
786
- location
787
- }
877
+ ...data.body
878
+ }), {
879
+ resourceType: "User",
880
+ created: user.meta.created,
881
+ lastModified: user.meta.lastModified,
882
+ location
788
883
  });
789
884
  }
790
885
  function renderGroup(group, location) {
791
886
  const extension = group.roles === void 0 ? void 0 : { [ROLES_EXTENSION]: { roles: group.roles } };
792
- return compact({
793
- schemas: group.roles === void 0 ? [GROUP_SCHEMA] : [GROUP_SCHEMA, ROLES_EXTENSION],
887
+ const data = appData(group.x);
888
+ return withVersion(compact({
889
+ schemas: [
890
+ GROUP_SCHEMA,
891
+ ...group.roles === void 0 ? [] : [ROLES_EXTENSION],
892
+ ...data.schemas
893
+ ],
794
894
  id: group.id,
795
895
  externalId: group.externalId,
796
896
  displayName: group.displayName,
797
897
  members: group.members,
798
898
  ...extension,
799
- meta: {
800
- resourceType: "Group",
801
- created: group.meta.created,
802
- lastModified: group.meta.lastModified,
803
- location
804
- }
899
+ ...data.body
900
+ }), {
901
+ resourceType: "Group",
902
+ created: group.meta.created,
903
+ lastModified: group.meta.lastModified,
904
+ location
805
905
  });
806
906
  }
807
907
  //#endregion
@@ -879,6 +979,20 @@ function pageFrom(url) {
879
979
  }
880
980
  //#endregion
881
981
  //#region src/scim/handler.ts
982
+ /** One resource with its `meta.version` as the `ETag`. */
983
+ function resourceResponse(status, rendered, location) {
984
+ return scimResponse(status, rendered, compact({
985
+ ETag: versionOf(rendered),
986
+ location
987
+ }));
988
+ }
989
+ function renderedOf(request, resource) {
990
+ return "userName" in resource ? renderUser(resource, locationOf(request, "Users", resource.id)) : renderGroup(resource, locationOf(request, "Groups", resource.id));
991
+ }
992
+ /** `false` when `If-Match` names a version other than `current`'s; a missing resource passes to the store. */
993
+ function matches(request, current) {
994
+ return current === null || ifMatchHolds(request, versionOf(renderedOf(request, current)));
995
+ }
882
996
  function scimHandler(options) {
883
997
  if (options.token === void 0 && options.verifier === void 0) throw new Error("scimHandler requires token or verifier");
884
998
  if (options.verifier !== void 0 && options.audience === void 0) throw new Error("scimHandler requires audience with a verifier");
@@ -898,7 +1012,8 @@ function scimHandler(options) {
898
1012
  tenant,
899
1013
  audience: options.audience,
900
1014
  token: options.token,
901
- verifier: options.verifier
1015
+ verifier: options.verifier,
1016
+ claims: options.claims
902
1017
  }));
903
1018
  if (!auth.ok) return auth.status === 403 ? forbidden() : unauthorized();
904
1019
  try {
@@ -912,23 +1027,24 @@ function scimHandler(options) {
912
1027
  if (rawFilter !== null && rawFilter !== "" && filter === void 0) return scimError(400, "invalidFilter", "unsupported filter");
913
1028
  if (filter !== void 0 && !filterSupported(filter)) return scimError(400, "invalidFilter", "unsupported filter");
914
1029
  const page = pageFrom(url);
915
- if (route.kind === "Users") return scimResponse(200, listBody(await options.store.findUsers(tenant, filter, page), (user) => renderUser(user, locationOf(request, "Users", user.id))));
916
- return scimResponse(200, listBody(await options.store.findGroups(tenant, filter, page), (group) => renderGroup(group, locationOf(request, "Groups", group.id))));
1030
+ if (route.kind === "Users") return scimResponse(200, listBody(await options.directory.findUsers(tenant, filter, page), (user) => renderUser(user, locationOf(request, "Users", user.id))));
1031
+ return scimResponse(200, listBody(await options.directory.findGroups(tenant, filter, page), (group) => renderGroup(group, locationOf(request, "Groups", group.id))));
917
1032
  }
918
1033
  if (request.method === "GET" && route.id !== void 0) {
919
1034
  if (route.kind === "Users") {
920
- const user = await options.store.getUser(tenant, route.id);
1035
+ const user = await options.directory.getUser(tenant, route.id);
921
1036
  if (user === null) return scimError(404, "invalidValue", "resource not found");
922
- return scimResponse(200, renderUser(user, locationOf(request, "Users", user.id)));
1037
+ return readResponse(request, renderedOf(request, user));
923
1038
  }
924
- const group = await options.store.getGroup(tenant, route.id);
1039
+ const group = await options.directory.getGroup(tenant, route.id);
925
1040
  if (group === null) return scimError(404, "invalidValue", "resource not found");
926
- return scimResponse(200, renderGroup(group, locationOf(request, "Groups", group.id)));
1041
+ return readResponse(request, renderedOf(request, group));
927
1042
  }
928
1043
  if (request.method === "DELETE" && route.id !== void 0) {
929
1044
  if (route.kind === "Users") {
930
- const existing = await options.store.getUser(tenant, route.id);
931
- await options.store.deleteUser(tenant, route.id);
1045
+ const existing = await options.directory.getUser(tenant, route.id);
1046
+ if (!matches(request, existing)) return preconditionFailed();
1047
+ await options.directory.deleteUser(tenant, route.id);
932
1048
  await emitDirectory(options, directoryEvent({
933
1049
  operation: "delete",
934
1050
  tenant,
@@ -939,8 +1055,9 @@ function scimHandler(options) {
939
1055
  }), existing === null ? [] : [existing.id], [], existing === null ? [] : [existing]);
940
1056
  return new Response(null, { status: 204 });
941
1057
  }
942
- const existing = await options.store.getGroup(tenant, route.id);
943
- await options.store.deleteGroup(tenant, route.id);
1058
+ const existing = await options.directory.getGroup(tenant, route.id);
1059
+ if (!matches(request, existing)) return preconditionFailed();
1060
+ await options.directory.deleteGroup(tenant, route.id);
944
1061
  await emitDirectory(options, directoryEvent({
945
1062
  operation: "delete",
946
1063
  tenant,
@@ -956,14 +1073,16 @@ function scimHandler(options) {
956
1073
  }));
957
1074
  return new Response(null, { status: 204 });
958
1075
  }
959
- const body = await readJson(request);
1076
+ const read = await readJson(request);
1077
+ if (read.tooLarge) return scimError(413, "", `request body exceeds ${String(MAX_BODY_BYTES)} bytes`);
1078
+ const { body } = read;
960
1079
  if (!isRecord(body)) return scimError(400, "invalidSyntax", "malformed body");
961
1080
  if (request.method === "POST" && route.id === void 0) {
962
1081
  if (route.kind === "Users") {
963
1082
  if (!schemasOk(body, "urn:ietf:params:scim:schemas:core:2.0:User")) return scimError(400, "invalidSyntax", "unsupported schema");
964
1083
  const parsed = userFromBody(body, "");
965
1084
  if (parsed === void 0) return scimError(400, "invalidValue", "userName is required");
966
- const stored = await options.store.putUser(tenant, parsed);
1085
+ const stored = await options.directory.putUser(tenant, parsed);
967
1086
  const location = locationOf(request, "Users", stored.id);
968
1087
  await emitDirectory(options, directoryEvent({
969
1088
  operation: "create",
@@ -973,13 +1092,13 @@ function scimHandler(options) {
973
1092
  credential: auth.credential,
974
1093
  active: stored.active
975
1094
  }), [stored.id]);
976
- return scimResponse(201, renderUser(stored, location), { location });
1095
+ return resourceResponse(201, renderUser(stored, location), location);
977
1096
  }
978
1097
  if (!schemasOk(body, "urn:ietf:params:scim:schemas:core:2.0:Group")) return scimError(400, "invalidSyntax", "unsupported schema");
979
1098
  const parsed = groupFromBody(body, "", groupRolesFor(options.groupRoles, body["id"]));
980
1099
  if (parsed === void 0) return scimError(400, "invalidValue", "displayName is required");
981
1100
  reportUnknownRoles(parsed.roles, options);
982
- const stored = await options.store.putGroup(tenant, parsed);
1101
+ const stored = await options.directory.putGroup(tenant, parsed);
983
1102
  const location = locationOf(request, "Groups", stored.id);
984
1103
  await emitDirectory(options, directoryEvent({
985
1104
  operation: "create",
@@ -994,15 +1113,17 @@ function scimHandler(options) {
994
1113
  previous: null,
995
1114
  next: stored
996
1115
  }));
997
- return scimResponse(201, renderGroup(stored, location), { location });
1116
+ return resourceResponse(201, renderGroup(stored, location), location);
998
1117
  }
999
1118
  if (request.method === "PUT" && route.id !== void 0) {
1000
1119
  if (route.kind === "Users") {
1001
1120
  if (!schemasOk(body, "urn:ietf:params:scim:schemas:core:2.0:User")) return scimError(400, "invalidSyntax", "unsupported schema");
1002
- if (await options.store.getUser(tenant, route.id) === null) return scimError(404, "invalidValue", "resource not found");
1121
+ const existing = await options.directory.getUser(tenant, route.id);
1122
+ if (existing === null) return scimError(404, "invalidValue", "resource not found");
1123
+ if (!matches(request, existing)) return preconditionFailed();
1003
1124
  const parsed = userFromBody(body, route.id);
1004
1125
  if (parsed === void 0) return scimError(400, "invalidValue", "userName is required");
1005
- const stored = await options.store.putUser(tenant, parsed);
1126
+ const stored = await options.directory.putUser(tenant, parsed);
1006
1127
  const location = locationOf(request, "Users", stored.id);
1007
1128
  await emitDirectory(options, directoryEvent({
1008
1129
  operation: "replace",
@@ -1012,15 +1133,16 @@ function scimHandler(options) {
1012
1133
  credential: auth.credential,
1013
1134
  active: stored.active
1014
1135
  }), [stored.id]);
1015
- return scimResponse(200, renderUser(stored, location), { location });
1136
+ return resourceResponse(200, renderUser(stored, location), location);
1016
1137
  }
1017
1138
  if (!schemasOk(body, "urn:ietf:params:scim:schemas:core:2.0:Group")) return scimError(400, "invalidSyntax", "unsupported schema");
1018
- const existing = await options.store.getGroup(tenant, route.id);
1139
+ const existing = await options.directory.getGroup(tenant, route.id);
1019
1140
  if (existing === null) return scimError(404, "invalidValue", "resource not found");
1141
+ if (!matches(request, existing)) return preconditionFailed();
1020
1142
  const parsed = groupFromBody(body, route.id, groupRolesFor(options.groupRoles, route.id));
1021
1143
  if (parsed === void 0) return scimError(400, "invalidValue", "displayName is required");
1022
1144
  reportUnknownRoles(parsed.roles, options);
1023
- const stored = await options.store.putGroup(tenant, parsed);
1145
+ const stored = await options.directory.putGroup(tenant, parsed);
1024
1146
  const location = locationOf(request, "Groups", stored.id);
1025
1147
  await emitDirectory(options, directoryEvent({
1026
1148
  operation: "replace",
@@ -1035,7 +1157,7 @@ function scimHandler(options) {
1035
1157
  previous: existing,
1036
1158
  next: stored
1037
1159
  }));
1038
- return scimResponse(200, renderGroup(stored, location), { location });
1160
+ return resourceResponse(200, renderGroup(stored, location), location);
1039
1161
  }
1040
1162
  if (request.method === "PATCH" && route.id !== void 0) {
1041
1163
  const operations = readPatchOperations(body);
@@ -1043,7 +1165,8 @@ function scimHandler(options) {
1043
1165
  const normalized = normalizePatchOps(operations);
1044
1166
  if (normalized === void 0) return scimError(400, "invalidSyntax", "invalid patch");
1045
1167
  if (route.kind === "Users") {
1046
- const stored = await options.store.patchUser(tenant, route.id, normalized);
1168
+ if (!matches(request, await options.directory.getUser(tenant, route.id))) return preconditionFailed();
1169
+ const stored = await options.directory.patchUser(tenant, route.id, normalized);
1047
1170
  const location = locationOf(request, "Users", stored.id);
1048
1171
  await emitDirectory(options, directoryEvent({
1049
1172
  operation: "patch",
@@ -1053,10 +1176,11 @@ function scimHandler(options) {
1053
1176
  credential: auth.credential,
1054
1177
  active: stored.active
1055
1178
  }), [stored.id]);
1056
- return scimResponse(200, renderUser(stored, location), { location });
1179
+ return resourceResponse(200, renderUser(stored, location), location);
1057
1180
  }
1058
- const existing = await options.store.getGroup(tenant, route.id);
1059
- const stored = await options.store.patchGroup(tenant, route.id, normalized);
1181
+ const existing = await options.directory.getGroup(tenant, route.id);
1182
+ if (!matches(request, existing)) return preconditionFailed();
1183
+ const stored = await options.directory.patchGroup(tenant, route.id, normalized);
1060
1184
  reportUnknownRoles(stored.roles, options);
1061
1185
  const location = locationOf(request, "Groups", stored.id);
1062
1186
  await emitDirectory(options, directoryEvent({
@@ -1072,7 +1196,7 @@ function scimHandler(options) {
1072
1196
  previous: existing,
1073
1197
  next: stored
1074
1198
  }));
1075
- return scimResponse(200, renderGroup(stored, location), { location });
1199
+ return resourceResponse(200, renderGroup(stored, location), location);
1076
1200
  }
1077
1201
  return scimError(405, "invalidValue", "method not allowed");
1078
1202
  } catch (error) {
@@ -1081,6 +1205,14 @@ function scimHandler(options) {
1081
1205
  }
1082
1206
  };
1083
1207
  }
1208
+ function readResponse(request, rendered) {
1209
+ const version = versionOf(rendered);
1210
+ if (ifNoneMatchHolds(request, version)) return new Response(null, {
1211
+ status: 304,
1212
+ headers: { ETag: version }
1213
+ });
1214
+ return resourceResponse(200, rendered);
1215
+ }
1084
1216
  function discoveryResponse(request, route) {
1085
1217
  if (route.kind === "ServiceProviderConfig") return scimResponse(200, {
1086
1218
  ...serviceProviderConfig(),
@@ -1174,7 +1306,7 @@ function directoryMembershipSource(store, options = {}) {
1174
1306
  //#region src/scim/store.ts
1175
1307
  const DEFAULT_COUNT = 100;
1176
1308
  function now() {
1177
- return (/* @__PURE__ */ new Date()).toISOString();
1309
+ return isoNow();
1178
1310
  }
1179
1311
  function createdAt(at, ...candidates) {
1180
1312
  return candidates.find((value) => value !== void 0 && value !== "") ?? at;
@@ -1436,4 +1568,4 @@ function memoryDirectoryStore() {
1436
1568
  };
1437
1569
  }
1438
1570
  //#endregion
1439
- export { sha256Hex as S, PATCH_SCHEMA as _, normalizePatchOps as a, USER_SCHEMA as b, parseScimFilter as c, serviceProviderConfig as d, DirectoryNotFoundError as f, LIST_SCHEMA as g, GROUP_SCHEMA as h, tenantFromPath as i, resourceTypes as l, ERROR_SCHEMA as m, directoryMembershipSource as n, filterSupported as o, DirectoryUniquenessError as p, scimHandler as r, matchFilter as s, memoryDirectoryStore as t, schemas as u, ROLES_EXTENSION as v, authenticateScim as x, SCIM_CONTENT_TYPE as y };
1571
+ export { isDirectoryUniquenessError as C, isDirectoryNotFoundError as S, sha256Hex as T, LIST_SCHEMA as _, normalizePatchOps as a, SCIM_CONTENT_TYPE as b, parseScimFilter as c, serviceProviderConfig as d, APP_DATA_EXTENSION as f, GROUP_SCHEMA as g, ERROR_SCHEMA as h, tenantFromPath as i, resourceTypes as l, DirectoryUniquenessError as m, directoryMembershipSource as n, filterSupported as o, DirectoryNotFoundError as p, scimHandler as r, matchFilter as s, memoryDirectoryStore as t, schemas as u, PATCH_SCHEMA as v, authenticateScim as w, USER_SCHEMA as x, ROLES_EXTENSION as y };
@@ -1,8 +1,8 @@
1
1
  import { r as isRecord } from "./compact-CAf557ZB.js";
2
2
  import { t as freezeCopy } from "./freeze-CrU8nQeX.js";
3
- import { o as isForbiddenKey } from "./thenable-QSmvt-vZ.js";
4
- import { t as idText } from "./ids-DC4V4CFu.js";
5
- import { i as readAppData } from "./app-data-CV8pqqMi.js";
3
+ import { n as isForbiddenKey } from "./paths-DXSHAMIa.js";
4
+ import { i as idText, n as expirySeconds } from "./expiry-D4_YKRKD.js";
5
+ import { i as readAppData } from "./app-data-MuyzVqX8.js";
6
6
  //#region src/core/scopes.ts
7
7
  const RESERVED = /* @__PURE__ */ new Set(["global", "resource"]);
8
8
  const NAME = /^[a-z][a-z0-9_]*$/u;
@@ -97,7 +97,8 @@ function tenantOf(membership, scopes) {
97
97
  const root = rootScope(scopes);
98
98
  return root === void 0 ? void 0 : scopeIdOf(membership, root);
99
99
  }
100
- function isId(value) {
100
+ /** A non-empty string. Unlike `isId` in `./ids.ts` it has no length cap: membership fields come from the app, not the wire. */
101
+ function isNonEmptyString(value) {
101
102
  return typeof value === "string" && value !== "";
102
103
  }
103
104
  function roleList(value) {
@@ -122,7 +123,11 @@ function normalizeMembership(input, scopes) {
122
123
  if (x !== void 0) extra.x = freezeCopy(x);
123
124
  }
124
125
  if (typeof raw["via"] === "string") extra.via = raw["via"];
125
- if (typeof raw["expiresAt"] === "number") extra.expiresAt = raw["expiresAt"];
126
+ if (raw["expiresAt"] !== void 0 && raw["expiresAt"] !== null) {
127
+ const expiresAt = expirySeconds(raw["expiresAt"]);
128
+ if (expiresAt === void 0) return;
129
+ extra.expiresAt = expiresAt;
130
+ }
126
131
  if (typeof raw["grantedBy"] === "string" && raw["grantedBy"] !== "") extra.grantedBy = raw["grantedBy"];
127
132
  if (typeof raw["reason"] === "string" && raw["reason"] !== "") extra.reason = raw["reason"];
128
133
  const eligible = roleList(raw["eligible"]);
@@ -136,7 +141,7 @@ function normalizeMembership(input, scopes) {
136
141
  if (seats.length > 0) extra.entitlements = Object.freeze(seats);
137
142
  }
138
143
  if (raw["keep"] !== void 0) {
139
- if (!Array.isArray(raw["keep"]) || !raw["keep"].every((key) => typeof key === "string" && key !== "")) return;
144
+ if (!Array.isArray(raw["keep"]) || !raw["keep"].every(isNonEmptyString)) return;
140
145
  extra.keep = Object.freeze([...raw["keep"]]);
141
146
  }
142
147
  const named = raw["scope"] !== void 0 || raw["id"] !== void 0;
@@ -146,7 +151,7 @@ function normalizeMembership(input, scopes) {
146
151
  if (named || legacy || on === null || typeof on !== "object") return;
147
152
  const target = on;
148
153
  const targetId = idText(target["id"]);
149
- if (!isId(target["resource"]) || targetId === void 0) return;
154
+ if (!isNonEmptyString(target["resource"]) || targetId === void 0) return;
150
155
  return Object.freeze({
151
156
  on: Object.freeze({
152
157
  resource: target["resource"],