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,7 +1,12 @@
1
- import { n as isReadonlyArray, t as compact } from "./compact-y6vfu2_f.js";
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-Bd9PSyfq.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,13 +473,21 @@ function filterSupported(filter) {
445
473
  }
446
474
  //#endregion
447
475
  //#region src/scim/body.ts
448
- function isRecord$1(value) {
449
- return value !== null && typeof value === "object" && !Array.isArray(value);
450
- }
476
+ /** The parsed body; `undefined` for an empty or unreadable one. Invalid JSON throws a `SyntaxError`. */
451
477
  async function readJson(request) {
452
- const text = await request.text();
453
- if (text === "") return;
454
- 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
+ };
455
491
  }
456
492
  function schemasOk(body, required) {
457
493
  const listed = body["schemas"];
@@ -460,13 +496,18 @@ function schemasOk(body, required) {
460
496
  }
461
497
  function readRoles(body) {
462
498
  const extension = body[ROLES_EXTENSION];
463
- if (!isRecord$1(extension) || !Array.isArray(extension["roles"])) return;
499
+ if (!isRecord(extension) || !Array.isArray(extension["roles"])) return;
464
500
  return extension["roles"].filter((item) => typeof item === "string");
465
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
+ }
466
507
  function userFromBody(body, id) {
467
508
  if (typeof body["userName"] !== "string" || body["userName"] === "") return;
468
509
  const emails = Array.isArray(body["emails"]) ? body["emails"].flatMap((item) => {
469
- if (!isRecord$1(item) || typeof item["value"] !== "string") return [];
510
+ if (!isRecord(item) || typeof item["value"] !== "string") return [];
470
511
  return [compact({
471
512
  value: item["value"],
472
513
  primary: typeof item["primary"] === "boolean" ? item["primary"] : void 0,
@@ -480,6 +521,7 @@ function userFromBody(body, id) {
480
521
  externalId: typeof body["externalId"] === "string" ? body["externalId"] : void 0,
481
522
  active,
482
523
  emails,
524
+ x: readX(body),
483
525
  meta: {
484
526
  created: "",
485
527
  lastModified: ""
@@ -489,7 +531,7 @@ function userFromBody(body, id) {
489
531
  function groupFromBody(body, id, fallbackRoles) {
490
532
  if (typeof body["displayName"] !== "string" || body["displayName"] === "") return;
491
533
  const members = Array.isArray(body["members"]) ? body["members"].flatMap((item) => {
492
- if (!isRecord$1(item) || typeof item["value"] !== "string") return [];
534
+ if (!isRecord(item) || typeof item["value"] !== "string") return [];
493
535
  return [{ value: item["value"] }];
494
536
  }) : [];
495
537
  return compact({
@@ -498,6 +540,7 @@ function groupFromBody(body, id, fallbackRoles) {
498
540
  externalId: typeof body["externalId"] === "string" ? body["externalId"] : void 0,
499
541
  members,
500
542
  roles: readRoles(body) ?? fallbackRoles,
543
+ x: readX(body),
501
544
  meta: {
502
545
  created: "",
503
546
  lastModified: ""
@@ -550,7 +593,7 @@ function membershipEventsForGroup(input) {
550
593
  }
551
594
  async function emitDirectory(options, event, userIds, extra = [], known = []) {
552
595
  const kind = event.resource.type === "User" && event.active === false ? "session-revoked" : "changed";
553
- const sink = options.sink ?? memorySink();
596
+ const sink = options.sink ?? memoryDecisionSink();
554
597
  try {
555
598
  await sink.write([event, ...extra]);
556
599
  } catch {}
@@ -570,7 +613,7 @@ async function principalIds(options, tenant, userIds, known) {
570
613
  const hit = known.find((user) => user.id === id);
571
614
  if (hit !== void 0) return hit;
572
615
  try {
573
- return await options.store.getUser(tenant, id);
616
+ return await options.directory.getUser(tenant, id);
574
617
  } catch {
575
618
  return null;
576
619
  }
@@ -599,7 +642,7 @@ async function publish(options, kind, tenant, userIds, known) {
599
642
  function directoryEvent(input) {
600
643
  return compact({
601
644
  type: "directory",
602
- at: (/* @__PURE__ */ new Date()).toISOString(),
645
+ at: isoNow(),
603
646
  source: "scim",
604
647
  operation: input.operation,
605
648
  tenant: input.tenant,
@@ -620,9 +663,6 @@ function groupRolesFor(groupRoles, id) {
620
663
  //#endregion
621
664
  //#region src/scim/patch.ts
622
665
  const FILTER_PATH = /^(?<attribute>[A-Za-z0-9._]+)\[(?<field>[A-Za-z0-9._]+)\s+eq\s+"(?<value>[^"]+)"\](?<rest>\.[A-Za-z0-9._]+)?$/u;
623
- function isRecord(value) {
624
- return value !== null && typeof value === "object" && !Array.isArray(value);
625
- }
626
666
  function coerceActive(value) {
627
667
  if (typeof value === "boolean") return value;
628
668
  if (typeof value === "string") {
@@ -632,7 +672,7 @@ function coerceActive(value) {
632
672
  }
633
673
  }
634
674
  function rolesPath(path) {
635
- 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`;
636
676
  }
637
677
  function opName(value) {
638
678
  if (typeof value !== "string") return;
@@ -655,7 +695,7 @@ function normalizePatchOps(ops) {
655
695
  continue;
656
696
  }
657
697
  for (const [key, value] of Object.entries(raw["value"])) {
658
- 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)) {
659
699
  next.push({
660
700
  op,
661
701
  path: "roles",
@@ -742,25 +782,63 @@ function scimResponse(status, body, extra) {
742
782
  }
743
783
  });
744
784
  }
745
- function scimError(status, scimType, detail) {
746
- 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({
747
788
  schemas: [ERROR_SCHEMA],
748
789
  status: String(status),
749
- scimType,
790
+ scimType: status === 400 || status === 409 ? scimType : void 0,
750
791
  detail
751
- });
792
+ }), extra);
752
793
  }
753
794
  function unauthorized() {
754
- return new Response(null, {
755
- status: 401,
756
- headers: { "www-authenticate": "Bearer" }
757
- });
795
+ return scimError(401, "", "authentication required", { "www-authenticate": "Bearer" });
758
796
  }
759
797
  function forbidden() {
760
- return new Response(null, {
761
- status: 403,
762
- headers: { "www-authenticate": "Bearer" }
763
- });
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");
764
842
  }
765
843
  function mapStoreError(error) {
766
844
  if (isDirectoryUniquenessError(error)) return scimError(409, "uniqueness", error.message);
@@ -777,37 +855,53 @@ function listBody(result, render) {
777
855
  Resources: result.Resources.map(render)
778
856
  });
779
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
+ }
780
868
  function renderUser(user, location) {
781
- return compact({
782
- schemas: [USER_SCHEMA],
869
+ const data = appData(user.x);
870
+ return withVersion(compact({
871
+ schemas: [USER_SCHEMA, ...data.schemas],
783
872
  id: user.id,
784
873
  externalId: user.externalId,
785
874
  userName: user.userName,
786
875
  active: user.active,
787
876
  emails: user.emails,
788
- meta: {
789
- resourceType: "User",
790
- created: user.meta.created,
791
- lastModified: user.meta.lastModified,
792
- location
793
- }
877
+ ...data.body
878
+ }), {
879
+ resourceType: "User",
880
+ created: user.meta.created,
881
+ lastModified: user.meta.lastModified,
882
+ location
794
883
  });
795
884
  }
796
885
  function renderGroup(group, location) {
797
886
  const extension = group.roles === void 0 ? void 0 : { [ROLES_EXTENSION]: { roles: group.roles } };
798
- return compact({
799
- 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
+ ],
800
894
  id: group.id,
801
895
  externalId: group.externalId,
802
896
  displayName: group.displayName,
803
897
  members: group.members,
804
898
  ...extension,
805
- meta: {
806
- resourceType: "Group",
807
- created: group.meta.created,
808
- lastModified: group.meta.lastModified,
809
- location
810
- }
899
+ ...data.body
900
+ }), {
901
+ resourceType: "Group",
902
+ created: group.meta.created,
903
+ lastModified: group.meta.lastModified,
904
+ location
811
905
  });
812
906
  }
813
907
  //#endregion
@@ -885,6 +979,20 @@ function pageFrom(url) {
885
979
  }
886
980
  //#endregion
887
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
+ }
888
996
  function scimHandler(options) {
889
997
  if (options.token === void 0 && options.verifier === void 0) throw new Error("scimHandler requires token or verifier");
890
998
  if (options.verifier !== void 0 && options.audience === void 0) throw new Error("scimHandler requires audience with a verifier");
@@ -904,7 +1012,8 @@ function scimHandler(options) {
904
1012
  tenant,
905
1013
  audience: options.audience,
906
1014
  token: options.token,
907
- verifier: options.verifier
1015
+ verifier: options.verifier,
1016
+ claims: options.claims
908
1017
  }));
909
1018
  if (!auth.ok) return auth.status === 403 ? forbidden() : unauthorized();
910
1019
  try {
@@ -918,23 +1027,24 @@ function scimHandler(options) {
918
1027
  if (rawFilter !== null && rawFilter !== "" && filter === void 0) return scimError(400, "invalidFilter", "unsupported filter");
919
1028
  if (filter !== void 0 && !filterSupported(filter)) return scimError(400, "invalidFilter", "unsupported filter");
920
1029
  const page = pageFrom(url);
921
- if (route.kind === "Users") return scimResponse(200, listBody(await options.store.findUsers(tenant, filter, page), (user) => renderUser(user, locationOf(request, "Users", user.id))));
922
- 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))));
923
1032
  }
924
1033
  if (request.method === "GET" && route.id !== void 0) {
925
1034
  if (route.kind === "Users") {
926
- const user = await options.store.getUser(tenant, route.id);
1035
+ const user = await options.directory.getUser(tenant, route.id);
927
1036
  if (user === null) return scimError(404, "invalidValue", "resource not found");
928
- return scimResponse(200, renderUser(user, locationOf(request, "Users", user.id)));
1037
+ return readResponse(request, renderedOf(request, user));
929
1038
  }
930
- const group = await options.store.getGroup(tenant, route.id);
1039
+ const group = await options.directory.getGroup(tenant, route.id);
931
1040
  if (group === null) return scimError(404, "invalidValue", "resource not found");
932
- return scimResponse(200, renderGroup(group, locationOf(request, "Groups", group.id)));
1041
+ return readResponse(request, renderedOf(request, group));
933
1042
  }
934
1043
  if (request.method === "DELETE" && route.id !== void 0) {
935
1044
  if (route.kind === "Users") {
936
- const existing = await options.store.getUser(tenant, route.id);
937
- 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);
938
1048
  await emitDirectory(options, directoryEvent({
939
1049
  operation: "delete",
940
1050
  tenant,
@@ -945,8 +1055,9 @@ function scimHandler(options) {
945
1055
  }), existing === null ? [] : [existing.id], [], existing === null ? [] : [existing]);
946
1056
  return new Response(null, { status: 204 });
947
1057
  }
948
- const existing = await options.store.getGroup(tenant, route.id);
949
- 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);
950
1061
  await emitDirectory(options, directoryEvent({
951
1062
  operation: "delete",
952
1063
  tenant,
@@ -962,14 +1073,16 @@ function scimHandler(options) {
962
1073
  }));
963
1074
  return new Response(null, { status: 204 });
964
1075
  }
965
- const body = await readJson(request);
966
- if (!isRecord$1(body)) return scimError(400, "invalidSyntax", "malformed body");
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;
1079
+ if (!isRecord(body)) return scimError(400, "invalidSyntax", "malformed body");
967
1080
  if (request.method === "POST" && route.id === void 0) {
968
1081
  if (route.kind === "Users") {
969
1082
  if (!schemasOk(body, "urn:ietf:params:scim:schemas:core:2.0:User")) return scimError(400, "invalidSyntax", "unsupported schema");
970
1083
  const parsed = userFromBody(body, "");
971
1084
  if (parsed === void 0) return scimError(400, "invalidValue", "userName is required");
972
- const stored = await options.store.putUser(tenant, parsed);
1085
+ const stored = await options.directory.putUser(tenant, parsed);
973
1086
  const location = locationOf(request, "Users", stored.id);
974
1087
  await emitDirectory(options, directoryEvent({
975
1088
  operation: "create",
@@ -979,13 +1092,13 @@ function scimHandler(options) {
979
1092
  credential: auth.credential,
980
1093
  active: stored.active
981
1094
  }), [stored.id]);
982
- return scimResponse(201, renderUser(stored, location), { location });
1095
+ return resourceResponse(201, renderUser(stored, location), location);
983
1096
  }
984
1097
  if (!schemasOk(body, "urn:ietf:params:scim:schemas:core:2.0:Group")) return scimError(400, "invalidSyntax", "unsupported schema");
985
1098
  const parsed = groupFromBody(body, "", groupRolesFor(options.groupRoles, body["id"]));
986
1099
  if (parsed === void 0) return scimError(400, "invalidValue", "displayName is required");
987
1100
  reportUnknownRoles(parsed.roles, options);
988
- const stored = await options.store.putGroup(tenant, parsed);
1101
+ const stored = await options.directory.putGroup(tenant, parsed);
989
1102
  const location = locationOf(request, "Groups", stored.id);
990
1103
  await emitDirectory(options, directoryEvent({
991
1104
  operation: "create",
@@ -1000,15 +1113,17 @@ function scimHandler(options) {
1000
1113
  previous: null,
1001
1114
  next: stored
1002
1115
  }));
1003
- return scimResponse(201, renderGroup(stored, location), { location });
1116
+ return resourceResponse(201, renderGroup(stored, location), location);
1004
1117
  }
1005
1118
  if (request.method === "PUT" && route.id !== void 0) {
1006
1119
  if (route.kind === "Users") {
1007
1120
  if (!schemasOk(body, "urn:ietf:params:scim:schemas:core:2.0:User")) return scimError(400, "invalidSyntax", "unsupported schema");
1008
- 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();
1009
1124
  const parsed = userFromBody(body, route.id);
1010
1125
  if (parsed === void 0) return scimError(400, "invalidValue", "userName is required");
1011
- const stored = await options.store.putUser(tenant, parsed);
1126
+ const stored = await options.directory.putUser(tenant, parsed);
1012
1127
  const location = locationOf(request, "Users", stored.id);
1013
1128
  await emitDirectory(options, directoryEvent({
1014
1129
  operation: "replace",
@@ -1018,15 +1133,16 @@ function scimHandler(options) {
1018
1133
  credential: auth.credential,
1019
1134
  active: stored.active
1020
1135
  }), [stored.id]);
1021
- return scimResponse(200, renderUser(stored, location), { location });
1136
+ return resourceResponse(200, renderUser(stored, location), location);
1022
1137
  }
1023
1138
  if (!schemasOk(body, "urn:ietf:params:scim:schemas:core:2.0:Group")) return scimError(400, "invalidSyntax", "unsupported schema");
1024
- const existing = await options.store.getGroup(tenant, route.id);
1139
+ const existing = await options.directory.getGroup(tenant, route.id);
1025
1140
  if (existing === null) return scimError(404, "invalidValue", "resource not found");
1141
+ if (!matches(request, existing)) return preconditionFailed();
1026
1142
  const parsed = groupFromBody(body, route.id, groupRolesFor(options.groupRoles, route.id));
1027
1143
  if (parsed === void 0) return scimError(400, "invalidValue", "displayName is required");
1028
1144
  reportUnknownRoles(parsed.roles, options);
1029
- const stored = await options.store.putGroup(tenant, parsed);
1145
+ const stored = await options.directory.putGroup(tenant, parsed);
1030
1146
  const location = locationOf(request, "Groups", stored.id);
1031
1147
  await emitDirectory(options, directoryEvent({
1032
1148
  operation: "replace",
@@ -1041,7 +1157,7 @@ function scimHandler(options) {
1041
1157
  previous: existing,
1042
1158
  next: stored
1043
1159
  }));
1044
- return scimResponse(200, renderGroup(stored, location), { location });
1160
+ return resourceResponse(200, renderGroup(stored, location), location);
1045
1161
  }
1046
1162
  if (request.method === "PATCH" && route.id !== void 0) {
1047
1163
  const operations = readPatchOperations(body);
@@ -1049,7 +1165,8 @@ function scimHandler(options) {
1049
1165
  const normalized = normalizePatchOps(operations);
1050
1166
  if (normalized === void 0) return scimError(400, "invalidSyntax", "invalid patch");
1051
1167
  if (route.kind === "Users") {
1052
- 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);
1053
1170
  const location = locationOf(request, "Users", stored.id);
1054
1171
  await emitDirectory(options, directoryEvent({
1055
1172
  operation: "patch",
@@ -1059,10 +1176,11 @@ function scimHandler(options) {
1059
1176
  credential: auth.credential,
1060
1177
  active: stored.active
1061
1178
  }), [stored.id]);
1062
- return scimResponse(200, renderUser(stored, location), { location });
1179
+ return resourceResponse(200, renderUser(stored, location), location);
1063
1180
  }
1064
- const existing = await options.store.getGroup(tenant, route.id);
1065
- 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);
1066
1184
  reportUnknownRoles(stored.roles, options);
1067
1185
  const location = locationOf(request, "Groups", stored.id);
1068
1186
  await emitDirectory(options, directoryEvent({
@@ -1078,7 +1196,7 @@ function scimHandler(options) {
1078
1196
  previous: existing,
1079
1197
  next: stored
1080
1198
  }));
1081
- return scimResponse(200, renderGroup(stored, location), { location });
1199
+ return resourceResponse(200, renderGroup(stored, location), location);
1082
1200
  }
1083
1201
  return scimError(405, "invalidValue", "method not allowed");
1084
1202
  } catch (error) {
@@ -1087,6 +1205,14 @@ function scimHandler(options) {
1087
1205
  }
1088
1206
  };
1089
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
+ }
1090
1216
  function discoveryResponse(request, route) {
1091
1217
  if (route.kind === "ServiceProviderConfig") return scimResponse(200, {
1092
1218
  ...serviceProviderConfig(),
@@ -1180,7 +1306,7 @@ function directoryMembershipSource(store, options = {}) {
1180
1306
  //#region src/scim/store.ts
1181
1307
  const DEFAULT_COUNT = 100;
1182
1308
  function now() {
1183
- return (/* @__PURE__ */ new Date()).toISOString();
1309
+ return isoNow();
1184
1310
  }
1185
1311
  function createdAt(at, ...candidates) {
1186
1312
  return candidates.find((value) => value !== void 0 && value !== "") ?? at;
@@ -1442,4 +1568,4 @@ function memoryDirectoryStore() {
1442
1568
  };
1443
1569
  }
1444
1570
  //#endregion
1445
- 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 };