permdock 0.4.0 → 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 (514) 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-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 -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-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/arazzo-B6lebmiQ.js +36 -0
  19. package/dist/{arazzo-C4BcskbX.js → arazzo-BWhNF-k0.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-Dg8XsRaO.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-BMZPIVUM.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-BzqG8SMb.d.ts → bind--9EFVYWF.d.ts} +12 -10
  34. package/dist/{bind-kk-uyCwH.js → bind-CZzhx-Vj.js} +14 -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-BMnAudHn.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-BSslw1QV.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-tZUyOfOv.js → catalog-BECMPrwc.js} +51 -6
  48. package/dist/catalog-DjhMYYCq.js +1 -0
  49. package/dist/catalog-R_A__RsH.js +52 -0
  50. package/dist/{catalog-doc-DWtg0gGR.js → catalog-doc-C9wjsfNY.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-CIoHNevm.js +87 -0
  68. package/dist/codemod-Bmj9dWMH.js +37 -0
  69. package/dist/codemod-Cxvvc70T.js +2084 -0
  70. package/dist/{collect-2SrB7lfk.js → collect-CrZJJnEF.js} +75 -11
  71. package/dist/collect-DloHbDVa.js +55 -0
  72. package/dist/collect-FlXJlhus.js +1 -0
  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-CcEu2ZQ1.js → compile-CMqMx_IN.js} +11 -8
  77. package/dist/{compile-CtTP7eur.d.ts → compile-Ckm2HqBZ.d.ts} +5 -3
  78. package/dist/completion-BqhRBJD8.js +143 -0
  79. package/dist/config-B46rm9sc.js +26 -0
  80. package/dist/{config-BIjREpyE.js → config-bs_kZeYq.js} +12 -7
  81. package/dist/{config-report--Xb9APJS.js → config-report-DUgj62Ai.js} +15 -5
  82. package/dist/{connection-DUsczpB5.js → connection-DjhIJSs2.js} +6 -5
  83. package/dist/{context-DieZVJXu.js → context-bbFHR-0D.js} +2 -2
  84. package/dist/convex/index.d.ts +11 -10
  85. package/dist/convex/index.js +6 -4
  86. package/dist/create-0VZ7Pdiu.d.ts +107 -0
  87. package/dist/create-BDS7wc3y.d.ts +138 -0
  88. package/dist/create-BFfm17UA.d.ts +110 -0
  89. package/dist/create-BWRSXgOF.js +403 -0
  90. package/dist/create-C3b4B5eF.js +130 -0
  91. package/dist/{create-BBO24vj6.js → create-DnrmLnLW.js} +31 -32
  92. package/dist/{credential-kue0qpbm.js → credential-DM2um3ha.js} +152 -31
  93. package/dist/credentials-DPyHmYz5.js +74 -0
  94. package/dist/delegation-DaXVdDhM.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-D8jDHgsl.d.ts} +5 -5
  100. package/dist/{describe-C3ldA9os.d.ts → describe-BZUsixiL.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-CxZo9pTq.js +37 -0
  104. package/dist/{diff-rpqoe7Ag.js → diff-DCePiN6M.js} +60 -54
  105. package/dist/doctor-CxiwSfqH.js +44 -0
  106. package/dist/{doctor-owlv6ddh.js → doctor-DFjUxf2f.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-OD_4c__H.d.ts → errors-C2PXIv4c.d.ts} +2 -2
  116. package/dist/errors-CWTY6uih.js +143 -0
  117. package/dist/evaluate-_R8QkWaf.js +1732 -0
  118. package/dist/evaluations-16UqqQ6W.d.ts +32 -0
  119. package/dist/{evaluations-C9YJsv3H.js → evaluations-DZ2CbV5k.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-g0ypLkID.js +120 -0
  129. package/dist/fetch-adapter-qKJBuRqy.d.ts +31 -0
  130. package/dist/fields-D9tPVUUS.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-D2lZt4Dd.js} +55 -52
  135. package/dist/{grantee-CXY-0C87.js → grantee-Cn1HyUsI.js} +3 -3
  136. package/dist/{grantee-conditions-MQs5NIuX.js → grantee-conditions-CcXf8hMM.js} +4 -3
  137. package/dist/{grantee-match-fxYp9Nmt.js → grantee-match-DHArqY82.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-DTcZOzhF.js} +45 -38
  143. package/dist/hono/index.d.ts +12 -9
  144. package/dist/hono/index.js +13 -12
  145. package/dist/hosted-BZIAYvon.js +315 -0
  146. package/dist/hosted-DBDX0M-P.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-DMmOG27O.js} +190 -53
  152. package/dist/index-BcHcPyIo.d.ts +110 -0
  153. package/dist/index-CaxrMD1A.d.ts +1 -0
  154. package/dist/index-Chrs5fQ-.d.ts +210 -0
  155. package/dist/index-CxGUswIC.d.ts +431 -0
  156. package/dist/index-D8EovfsP.d.ts +91 -0
  157. package/dist/{index-UdVQgq48.d.ts → index-DOVf7RJv.d.ts} +431 -81
  158. package/dist/{index-BwMe94Xq.d.ts → index-SGdIQyzc.d.ts} +34 -16
  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-Omfd793B.d.ts} +2 -2
  164. package/dist/instance-snapshot-Cxq4ygFc.js +600 -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-5JatXyND.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-CtKR3GXL.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-TCAdw-eW.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-BShP7Vf4.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-BJdBmYDG.js → openapi-DTaEmTSW.js} +10 -9
  205. package/dist/openapi-ahr8rHu3.js +138 -0
  206. package/dist/operation-findings-DgATDpvh.js +36 -0
  207. package/dist/operations-CxybZErY.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-Dyw8fyPF.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-BatFgAA4.js} +1698 -869
  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-C-q02Pal.js → parse-local-manifest-CVSs6J9I.js} +1 -1
  219. package/dist/{parse-local-manifest-DvYUR0QL.d.ts → parse-local-manifest-DgqtruPn.d.ts} +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-B9JxkBwC.js +868 -0
  227. package/dist/permdock-D7eeLJER.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-CZKiUfFM.js} +4 -3
  231. package/dist/{permissions-COH-KRgT.d.ts → permissions-oEWfl-kl.d.ts} +1 -2
  232. package/dist/policies-CO1oOymN.js +295 -0
  233. package/dist/{policy-ur0BBK_e.d.ts → policy-Czo4n3Hs.d.ts} +2 -2
  234. package/dist/{hosted-CBHgkzDl.js → policy-DLZJ5gAp.js} +17 -273
  235. package/dist/policy-from-catalog-DzhEc3Y9.js +450 -0
  236. package/dist/policy-module-CTlwMvLI.js +89 -0
  237. package/dist/{policy-types-sp9P1iIV.d.ts → policy-types-DzwivBgR.d.ts} +434 -631
  238. package/dist/postgrest-CW0IqC-U.js +566 -0
  239. package/dist/postgrest-NUqZT-RB.d.ts +100 -0
  240. package/dist/powersync-BHfuehf3.js +62 -0
  241. package/dist/powersync-CbzkqL_M.js +1 -0
  242. package/dist/{powersync-cZe4kzhL.js → powersync-bYUDLOAO.js} +23 -24
  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-DXlt-vks.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-B3_P7xuw.d.ts → protected-DEPHc2xV.d.ts} +16 -8
  255. package/dist/{protected-BN7BUdY1.js → protected-DfjY5mLA.js} +21 -4
  256. package/dist/{provider-Bi-0HNL3.js → provider-CC-u3bYP.js} +2 -2
  257. package/dist/{provider-kwHC9CZD.d.ts → provider-DMVt6yYn.d.ts} +1 -1
  258. package/dist/{provider-store-Ctt-81Ni.js → provider-store-B5Yrkhzr.js} +2 -2
  259. package/dist/pull-BgIfno6w.js +256 -0
  260. package/dist/pull-ByOks_Tg.js +1 -0
  261. package/dist/push-CmFVBOeI.js +116 -0
  262. package/dist/pushed-policy-BImMTTIM.d.ts +57 -0
  263. package/dist/pushed-policy-DobP7AHI.js +238 -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 +24 -22
  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-D7iKcLFe.d.ts} +1 -1
  275. package/dist/{replay-BsOyTrdV.js → replay-Du1tJjG7.js} +2 -1
  276. package/dist/{request-context-BVM7aWNs.js → request-context-BTRTG7OT.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-BA8an5Ap.js +336 -0
  284. package/dist/{rls-BEktUaqg.js → rls-j6t43t7n.js} +287 -689
  285. package/dist/{role-builder-B4GbKM-i.js → role-builder-CXbis5-X.js} +14 -207
  286. package/dist/{rpc-nYC3cR_u.js → rpc-aPyNi6tA.js} +7 -7
  287. package/dist/run-CNsApDpd.js +1 -0
  288. package/dist/run-DOfMtc9V.js +723 -0
  289. package/dist/run-ticket-BjhTOi6u.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-FO-Q8oj0.js} +16 -14
  293. package/dist/scan-BOI5tJ-6.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-DqCT4CgZ.js +453 -0
  303. package/dist/{server-types-DdqBwZN_.d.ts → server-types-BLd4MnBX.d.ts} +51 -68
  304. package/dist/{sha256-BO0swRXL.js → sha256-D9ihqmvd.js} +8 -1
  305. package/dist/{shared-1uhI-e-b.js → shared-CD11nBbC.js} +18 -8
  306. package/dist/{shared-JhMeOsDF.js → shared-DvvFzYXe.js} +8 -9
  307. package/dist/signals-D3NcTKUS.js +32 -0
  308. package/dist/sink-BEZSlMS_.js +957 -0
  309. package/dist/sink-Bj_lDUDq.d.ts +225 -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-CXUWfsNy.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-DqK9eDmM.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-BV9j0DeZ.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-DLfUWFAI.js +1851 -0
  323. package/dist/ssf/index.d.ts +4 -4
  324. package/dist/ssf/index.js +384 -47
  325. package/dist/standard-webhooks-6lg8v_is.d.ts +88 -0
  326. package/dist/standard-webhooks-DgFFD-Ga.js +228 -0
  327. package/dist/storage-C2bWdvJH.js +132 -0
  328. package/dist/{store-ILkLUj_o.js → store-4u_hxjWa.js} +40 -53
  329. package/dist/{store-options-CbUHDoSe.js → store-options-BqEakYRa.js} +26 -21
  330. package/dist/{stores-BHXdSbw9.js → stores-BbsD4fAR.js} +2 -2
  331. package/dist/{stores-Cxz_80g-.d.ts → stores-ClZUgeoP.d.ts} +7 -8
  332. package/dist/{stream-Dwsg6WwE.d.ts → stream-7-xmnf3U.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-9pqI57pW.js +92 -0
  342. package/dist/{supabase-C1TWlnYt.js → supabase-Dxlp8A94.js} +98 -205
  343. package/dist/supabase-hook-CXcGpHqq.js +1 -0
  344. package/dist/{supabase-hook-Cva3ikXz.js → supabase-hook-DdDQhMlw.js} +951 -60
  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-7rJVLWe5.d.ts → types-5Ut_pbKy.d.ts} +61 -11
  376. package/dist/{store-9KO4BlkB.d.ts → types-BNORmDM8.d.ts} +100 -75
  377. package/dist/types-BjV-fqcA.d.ts +57 -0
  378. package/dist/{types-CUcFZfpU.d.ts → types-BqAKcRNW.d.ts} +2 -1
  379. package/dist/types-C8-KNsFf.d.ts +107 -0
  380. package/dist/{types-Br9IXUBG.d.ts → types-CCpc2Dcv.d.ts} +77 -17
  381. package/dist/{types-DpWfQdSh.d.ts → types-CZTnPFzM.d.ts} +46 -11
  382. package/dist/{types-CqrjB9o6.d.ts → types-CdlxsYQh.d.ts} +23 -11
  383. package/dist/{types-CIlTojhq.d.ts → types-ClZaWzfb.d.ts} +9 -6
  384. package/dist/types-DX0LaKTb.d.ts +157 -0
  385. package/dist/types-DiQjupG2.d.ts +332 -0
  386. package/dist/types-DqzsnlSA.js +67 -0
  387. package/dist/types-_sHy8BQf.d.ts +65 -0
  388. package/dist/{types-ByUo56un.d.ts → types-fbZ7JEXr.d.ts} +23 -22
  389. package/dist/{types-DHrmBJLH.d.ts → types-tIgIeIKJ.d.ts} +7 -7
  390. package/dist/unplugin/index.d.ts +1 -1
  391. package/dist/unplugin/index.js +2 -2
  392. package/dist/usage-CHOtwL19.js +1 -0
  393. package/dist/usage-DHtE8j4E.js +32 -0
  394. package/dist/{usage-CG9nOYZw.js → usage-T5mXq98v.js} +54 -11
  395. package/dist/{validation-error-BSSw0l_8.d.ts → validation-error-Bg5Tpluk.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-DbCL9bnB.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-D6lPdb4Z.d.ts} +65 -2
  403. package/dist/vue/index.d.ts +9 -10
  404. package/dist/vue/index.js +8 -8
  405. package/dist/waiter-BGUtGYoU.js +67 -0
  406. package/dist/waiter-CKy4MQSY.d.ts +36 -0
  407. package/dist/watch-Cb-NcaUw.js +1 -0
  408. package/dist/{watch-zeucB7eF.js → watch-CszoTJMq.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-Dv-WTP-w.js +306 -0
  412. package/dist/who-can-D0QoYbEb.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-Bd1Tejur.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 +9 -8
  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 +5 -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/load-B_shHrmd.js +0 -2
  490. package/dist/manifest-BngWKryL.js +0 -770
  491. package/dist/may-use-BOn_dR_w.js +0 -78
  492. package/dist/openapi-DcQ1Kg40.js +0 -164
  493. package/dist/ownership-BgnbOJFT.js +0 -851
  494. package/dist/permdock-L26udHSk.js +0 -3646
  495. package/dist/powersync-BFSbSElQ.js +0 -62
  496. package/dist/powersync-DCDgZgfZ.js +0 -2
  497. package/dist/rls-55DQTuf5.js +0 -250
  498. package/dist/run-DMcNW_8T.js +0 -174
  499. package/dist/server-ZYEHtNHS.js +0 -268
  500. package/dist/sink-BTtmfPnE.js +0 -141
  501. package/dist/sink-CPN4zLfs.d.ts +0 -104
  502. package/dist/skills-Dle4ZoLF.js +0 -56
  503. package/dist/snapshot-Dc9CHPME.js +0 -1078
  504. package/dist/src-Bb7no-hS.js +0 -639
  505. package/dist/subject-C6dLxqHU.js +0 -24
  506. package/dist/supabase-Dbqr141s.js +0 -83
  507. package/dist/supabase-hook-BULg7Ut_.js +0 -2
  508. package/dist/thenable-QSmvt-vZ.js +0 -65
  509. package/dist/types-C0dee0Qf.d.ts +0 -197
  510. package/dist/types-DvupZE0w.d.ts +0 -9
  511. package/dist/usage-4G6t643F.js +0 -42
  512. package/dist/usage-iFLJ0-rr.js +0 -2
  513. package/dist/vocabulary-hhEFLFoL.d.ts +0 -65
  514. package/dist/watch-C8TpsAl4.js +0 -2
@@ -0,0 +1,295 @@
1
+ import { a as sole } from "./compact-CAf557ZB.js";
2
+ import { i as configError, n as CliError } from "./errors-CWTY6uih.js";
3
+ import { i as requirePeer } from "./peer-C8swJ2GH.js";
4
+ import { M as qualified, _ as subjectClaimJsonSql } from "./shared-CD11nBbC.js";
5
+ //#region src/cli/pg.ts
6
+ const CONNECT_TIMEOUT_MS = 1e4;
7
+ const STATEMENT_TIMEOUT_MS = 6e4;
8
+ function loadPg(command, cwd) {
9
+ return requirePeer(() => import("pg"), "pg", command, cwd);
10
+ }
11
+ function options(db) {
12
+ return {
13
+ connectionString: db,
14
+ connectionTimeoutMillis: CONNECT_TIMEOUT_MS,
15
+ statement_timeout: STATEMENT_TIMEOUT_MS
16
+ };
17
+ }
18
+ function unreachable(command, cause) {
19
+ return new CliError("unavailable", `PermDock CLI: ${command.replace(/^permdock /u, "")} could not connect`, {
20
+ cause,
21
+ code: "database_unreachable"
22
+ });
23
+ }
24
+ /** The default `connect` of a command: one connection, failing with a message that names `command`. */
25
+ function pgConnector(command, cwd = process.cwd()) {
26
+ return (db) => connectPg(db, command, cwd);
27
+ }
28
+ /** One connection, for commands that run a transaction. */
29
+ async function connectPg(db, command, cwd) {
30
+ const client = new (await (loadPg(command, cwd))).Client(options(db));
31
+ try {
32
+ await client.connect();
33
+ } catch (cause) {
34
+ throw unreachable(command, cause);
35
+ }
36
+ return {
37
+ query: (sql, values) => client.query(sql, values),
38
+ end: () => client.end()
39
+ };
40
+ }
41
+ /** A small pool, for independent catalog reads that can run in parallel. */
42
+ async function connectPgPool(db, command, cwd = process.cwd()) {
43
+ const pool = new (await (loadPg(command, cwd))).Pool({
44
+ ...options(db),
45
+ max: 4
46
+ });
47
+ try {
48
+ (await pool.connect()).release();
49
+ } catch (cause) {
50
+ await pool.end();
51
+ throw unreachable(command, cause);
52
+ }
53
+ return {
54
+ query: (sql, values) => pool.query(sql, values),
55
+ end: () => pool.end()
56
+ };
57
+ }
58
+ //#endregion
59
+ //#region src/cli/sql/clauses.ts
60
+ /** True when `sql` is one parenthesised expression, so AND / OR need not wrap it again. */
61
+ function isWrapped(sql) {
62
+ if (!sql.startsWith("(") || !sql.endsWith(")")) return false;
63
+ let depth = 0;
64
+ let quoted = false;
65
+ for (let index = 0; index < sql.length; index += 1) {
66
+ const ch = sql[index];
67
+ if (ch === "'") quoted = !quoted;
68
+ else if (!quoted && ch === "(") depth += 1;
69
+ else if (!quoted && ch === ")") {
70
+ depth -= 1;
71
+ if (depth === 0 && index < sql.length - 1) return false;
72
+ }
73
+ }
74
+ return depth === 0;
75
+ }
76
+ function wrapSql(sql) {
77
+ return isWrapped(sql) ? sql : `(${sql})`;
78
+ }
79
+ /**
80
+ * The grant's `validFrom` / `validUntil` as a clock check: `from` inclusive,
81
+ * `until` exclusive, matching the in-process evaluator.
82
+ */
83
+ function validitySql(validity) {
84
+ if (validity === void 0) return;
85
+ return andSql(validity.from === void 0 ? void 0 : `now() >= to_timestamp(${validity.from})`, validity.until === void 0 ? void 0 : `now() < to_timestamp(${validity.until})`);
86
+ }
87
+ function andSql(...parts) {
88
+ const present = parts.filter((part) => part !== void 0 && part !== "true");
89
+ if (present.length === 0) return;
90
+ return present.length === 1 ? present[0] : present.map(wrapSql).join(" and ");
91
+ }
92
+ /** `USING` and `WITH CHECK` for a branch: its access check ANDed with its row conditions. */
93
+ function branchClauses(branch) {
94
+ const using = branch.command === "insert" ? void 0 : andSql(branch.access, branch.using) ?? "true";
95
+ const check = branch.command === "insert" || branch.command === "update" ? andSql(branch.access, branch.check) ?? "true" : void 0;
96
+ return {
97
+ ...using === void 0 ? {} : { using },
98
+ ...check === void 0 ? {} : { check }
99
+ };
100
+ }
101
+ //#endregion
102
+ //#region src/cli/rls/policies.ts
103
+ /** Each database role gets its own policy, so no role sees two permissive policies for one command. */
104
+ const AUDIENCES = ["authenticated", "anon"];
105
+ const DEFAULT_POLICY_NAME = "{table}_{op}";
106
+ const DEFAULT_PER_ROLE_NAME = "{role}_{permission}";
107
+ const PLACEHOLDER = /\{(table|op|role|permission)\}/gu;
108
+ function sanitize(name) {
109
+ return name.replaceAll(/[^A-Za-z0-9_]/g, "_");
110
+ }
111
+ function render(template, values) {
112
+ return sanitize(template.replaceAll(PLACEHOLDER, (_match, key) => values[key]));
113
+ }
114
+ /** Rejects a template that cannot name every policy of the chosen shape uniquely. */
115
+ function assertPolicyName(template, perRole) {
116
+ if (!perRole && /\{(role|permission)\}/u.test(template)) throw configError("PermDock CLI: --policy-name {role} and {permission} need --policy-per-role; a collapsed policy covers several roles");
117
+ if (!perRole && !(template.includes("{table}") && template.includes("{op}"))) throw configError("PermDock CLI: --policy-name needs {table} and {op} so each table and command gets its own policy");
118
+ }
119
+ function orSql(parts) {
120
+ const distinct = [...new Set(parts)];
121
+ if (distinct.includes("true")) return "true";
122
+ return sole(distinct) ?? distinct.map(wrapSql).join(" or ");
123
+ }
124
+ function negate(sql) {
125
+ return sql === void 0 ? void 0 : `(${sql}) is not true`;
126
+ }
127
+ function policyOf(name, branch, using, check) {
128
+ const deny = branch.effect === "deny";
129
+ const policy = {
130
+ name,
131
+ table: branch.table,
132
+ command: branch.command,
133
+ effect: branch.effect,
134
+ roles: branch.roles
135
+ };
136
+ const finalUsing = deny ? negate(using) : using;
137
+ const finalCheck = deny ? negate(check) : check;
138
+ if (finalUsing !== void 0) policy.using = finalUsing;
139
+ if (finalCheck !== void 0) policy.check = finalCheck;
140
+ return policy;
141
+ }
142
+ function uniqueName(names, name) {
143
+ const seen = names.get(name) ?? 0;
144
+ names.set(name, seen + 1);
145
+ return seen === 0 ? name : `${name}_${seen + 1}`;
146
+ }
147
+ function perRolePolicies(branches, template) {
148
+ const names = /* @__PURE__ */ new Map();
149
+ return branches.map((branch) => {
150
+ const clauses = branchClauses(branch);
151
+ const deny = branch.effect === "deny";
152
+ const base = render(template, {
153
+ table: branch.table,
154
+ op: branch.command,
155
+ role: branch.label,
156
+ permission: branch.permissionKey
157
+ });
158
+ const name = `${deny ? "deny_" : ""}${base}${branch.coverage === true ? "_select_coverage" : ""}`;
159
+ return policyOf(uniqueName(names, name), branch, clauses.using, clauses.check);
160
+ });
161
+ }
162
+ /**
163
+ * Branches of one grant-key group share their row condition, so the group
164
+ * becomes one OR branch whose access ORs the helper calls of each scope.
165
+ */
166
+ function mergeGroups(branches) {
167
+ const merged = [];
168
+ const byKey = /* @__PURE__ */ new Map();
169
+ for (const branch of branches) {
170
+ const id = branch.grantKey === void 0 ? void 0 : `${branch.table}\u0000${branch.command}\u0000${branch.grantKey}\u0000${branch.coverage === true}`;
171
+ const entry = id === void 0 ? void 0 : byKey.get(id);
172
+ if (entry === void 0) {
173
+ const created = {
174
+ branch,
175
+ accesses: branch.access === void 0 ? [] : [branch.access]
176
+ };
177
+ if (id !== void 0) byKey.set(id, created);
178
+ merged.push(created);
179
+ continue;
180
+ }
181
+ if (branch.access !== void 0 && !entry.accesses.includes(branch.access)) entry.accesses.push(branch.access);
182
+ }
183
+ return merged.map(({ branch, accesses }) => accesses.length <= 1 ? branch : withAccess(branch, orSql(accesses)));
184
+ }
185
+ function withAccess(branch, access) {
186
+ return {
187
+ ...branch,
188
+ access
189
+ };
190
+ }
191
+ function collapsedPolicies(branches, template) {
192
+ const groups = /* @__PURE__ */ new Map();
193
+ for (const branch of mergeGroups(branches)) {
194
+ const id = `${branch.table}\u0000${branch.command}\u0000${branch.effect}`;
195
+ groups.set(id, [...groups.get(id) ?? [], branch]);
196
+ }
197
+ const names = /* @__PURE__ */ new Map();
198
+ return [...groups.values()].flatMap((group) => AUDIENCES.flatMap((audience) => {
199
+ const members = group.filter((branch) => branch.roles.includes(audience));
200
+ const [first] = members;
201
+ if (first === void 0) return [];
202
+ const deny = first.effect === "deny";
203
+ const clauses = members.map(branchClauses);
204
+ const usings = clauses.flatMap((item) => item.using === void 0 ? [] : [item.using]);
205
+ const checks = clauses.flatMap((item) => item.check === void 0 ? [] : [item.check]);
206
+ const base = render(template, {
207
+ table: first.table,
208
+ op: first.command,
209
+ role: first.label,
210
+ permission: first.permissionKey
211
+ });
212
+ return [policyOf(uniqueName(names, `${deny ? "deny_" : ""}${base}${audience === "anon" ? "_anon" : ""}`), {
213
+ ...first,
214
+ roles: [audience]
215
+ }, usings.length === 0 ? void 0 : orSql(usings), checks.length === 0 ? void 0 : orSql(checks))];
216
+ }));
217
+ }
218
+ /**
219
+ * Assembles policies. The default is one PERMISSIVE policy per table,
220
+ * command and database role (Splinter `multiple_permissive_policies` stays
221
+ * quiet), with denies in one RESTRICTIVE policy per table, command and role.
222
+ */
223
+ function assemblePolicies(branches, shape) {
224
+ const template = shape.name ?? (shape.perRole ? DEFAULT_PER_ROLE_NAME : DEFAULT_POLICY_NAME);
225
+ assertPolicyName(template, shape.perRole);
226
+ return shape.perRole ? perRolePolicies(branches, template) : collapsedPolicies(branches, template);
227
+ }
228
+ const DEFAULT_READ_ONLY_ACTORS = ["support", "impersonation"];
229
+ const ACTOR_KIND = /^[a-z][a-z0-9_-]*$/u;
230
+ /** The actor kinds `rls.readOnlyActors` names, or `undefined` when it is off. */
231
+ function readOnlyActorKinds(setting) {
232
+ if (setting === void 0 || setting === false) return;
233
+ const kinds = setting === true ? DEFAULT_READ_ONLY_ACTORS : setting;
234
+ if (kinds.length === 0 || kinds.some((kind) => !ACTOR_KIND.test(kind))) throw configError("PermDock CLI: rls.readOnlyActors must be true or a non-empty list of actor kinds such as 'support'");
235
+ return [...new Set(kinds)];
236
+ }
237
+ /** `permdock_actor_may_write()`, for hand-written write policies. Names are part of the SQL contract. */
238
+ const ACTOR_MAY_WRITE = "permdock_actor_may_write";
239
+ /**
240
+ * True unless the token's `act` claim (`act`, as SQL `jsonb`) is a session
241
+ * of one of `kinds` that is not `read_only: false`, or an agent with
242
+ * `read_only: true` (agents default to writable, as better-supabase reads them).
243
+ */
244
+ function readOnlyActorPasses(act, kinds) {
245
+ const list = `array[${kinds.map((kind) => `'${kind}'`).join(", ")}]::text[]`;
246
+ const passes = `(not coalesce(${kinds.includes("support") ? `(${act} ->> 'kind') = any(${list}) or ((${act} ->> 'kind') is null and ${act} ? 'session_id')` : `(${act} ->> 'kind') = any(${list})`}, false) or coalesce((${act} ->> 'read_only') = 'false', false))`;
247
+ return kinds.includes("agent") ? passes : `${passes} and not coalesce((${act} ->> 'kind') = 'agent' and (${act} ->> 'read_only') = 'true', false)`;
248
+ }
249
+ /**
250
+ * `permdock_actor_may_write()`: {@link readOnlyActorPasses} as a function, so
251
+ * hand-written write policies apply the same read-only default.
252
+ */
253
+ function actorMayWriteSql(ctx, kinds) {
254
+ const fn = qualified(ctx, ACTOR_MAY_WRITE);
255
+ return `-- rls.readOnlyActors: false for a token whose act claim is a read-only ${kinds.join(" or ")} session; hand-written write policies call it
256
+ create or replace function ${fn}()
257
+ returns boolean
258
+ language sql
259
+ stable
260
+ set search_path = ''
261
+ as $$
262
+ select ${readOnlyActorPasses(subjectClaimJsonSql(ctx, "act"), kinds)}
263
+ $$;
264
+ revoke execute on function ${fn}() from public, anon;
265
+ grant execute on function ${fn}() to authenticated;
266
+ `;
267
+ }
268
+ /**
269
+ * One restrictive policy per table and write command the allow policies
270
+ * grant to `authenticated`: the write passes unless the token's `act` claim
271
+ * (`act`, as SQL `jsonb`) is a session of one of `kinds` that is not
272
+ * `read_only: false`. Reads are never touched.
273
+ */
274
+ function readOnlyActorPolicies(policies, act, kinds) {
275
+ const passes = readOnlyActorPasses(act, kinds);
276
+ const seen = /* @__PURE__ */ new Set();
277
+ const out = [];
278
+ for (const policy of policies) {
279
+ const key = `${policy.table}\u0000${policy.command}`;
280
+ if (policy.effect !== "allow" || policy.command === "select" || !policy.roles.includes("authenticated") || seen.has(key)) continue;
281
+ seen.add(key);
282
+ out.push({
283
+ name: sanitize(`${policy.table}_${policy.command}_read_only_actors`),
284
+ table: policy.table,
285
+ command: policy.command,
286
+ effect: "deny",
287
+ roles: ["authenticated"],
288
+ ...policy.command === "insert" ? {} : { using: passes },
289
+ ...policy.command === "delete" ? {} : { check: passes }
290
+ });
291
+ }
292
+ return out;
293
+ }
294
+ //#endregion
295
+ export { readOnlyActorKinds as a, branchClauses as c, connectPgPool as d, pgConnector as f, orSql as i, validitySql as l, actorMayWriteSql as n, readOnlyActorPolicies as o, assemblePolicies as r, andSql as s, ACTOR_MAY_WRITE as t, wrapSql as u };
@@ -1,5 +1,5 @@
1
- import { E as Policy, Or as Principal, kr as Subject } from "./policy-types-sp9P1iIV.js";
2
- import { c as saasPlans, l as saasRoles, s as saasPermissions } from "./permissions-COH-KRgT.js";
1
+ import { T as Policy, ir as Subject, rr as Principal } from "./policy-types-DzwivBgR.js";
2
+ import { c as saasPlans, l as saasRoles, s as saasPermissions } from "./permissions-oEWfl-kl.js";
3
3
  //#region src/testing/saas/policy.d.ts
4
4
  /** Daily API-key quota per subject; the bucket should be per tenant too. */
5
5
  declare const SAAS_API_KEY_LIMIT = 5;
@@ -1,17 +1,16 @@
1
- import { r as isRecord, t as compact } from "./compact-CAf557ZB.js";
1
+ import { t as compact } from "./compact-CAf557ZB.js";
2
2
  import { n as freezeDeep } from "./freeze-CrU8nQeX.js";
3
- import { o as isForbiddenKey, u as splitPath } from "./thenable-QSmvt-vZ.js";
4
- import { a as deny, c as withGrantSchema, d as assertApprovalRelations, f as assertApprovalVersions, i as completeGrant, m as normalizeWhere, n as role, o as flattenGrants, r as allow, s as flattenPermissions } from "./role-builder-B4GbKM-i.js";
5
- import { n as defineScopes, o as resolveScope } from "./scopes-tvpa34ep.js";
6
- import { t as parseDuration } from "./duration-xK2jGFVc.js";
7
- import { a as getResource, c as listPermissions, i as getRegistry, m as annotationsFor, n as findPermission, s as isRegistryTree } from "./permission-registry-BsblpB-z.js";
8
- import { d as isSelfParented, l as isFieldRelation } from "./resource-relations-D1Un3pcz.js";
9
- import { _ as listPlans, m as findRole, o as flattenGrantee, r as asGrantee, v as listRoles } from "./grantee-CXY-0C87.js";
10
- import { n as normalizeValidity } from "./validity-dVrUEPJt.js";
11
- import { t as canonicalJson } from "./canonical-json-CFKyFOke.js";
12
- import { a as relationStart, i as relationHops, n as isGraphRelation, t as inheritCondition } from "./grantee-conditions-MQs5NIuX.js";
13
- import { a as memberOfFields, p as scopeField, u as relatesTo } from "./tenancy-DshjqY0n.js";
14
- import { n as sha256, t as bytesToBase64Url } from "./sha256-BO0swRXL.js";
3
+ import { c as withGrantSchema, d as assertApprovalVersions, i as completeGrant, o as flattenGrants, p as normalizeWhere, s as flattenPermissions, u as assertApprovalRelations } from "./role-builder-CXbis5-X.js";
4
+ import { c as listPermissions, i as getRegistry, m as annotationsFor, n as findPermission, s as isRegistryTree } from "./permission-registry-Br4jSNVi.js";
5
+ import { d as isSelfParented, l as isFieldRelation } from "./resource-relations-D_jw0BFx.js";
6
+ import { t as canonicalJson } from "./canonical-json-BC8_nMTw.js";
7
+ import { r as sha256Digest } from "./sha256-D9ihqmvd.js";
8
+ import { n as defineScopes, o as resolveScope } from "./scopes-CUPSjo9q.js";
9
+ import { o as flattenGrantee, r as asGrantee, v as listRoles } from "./grantee-Cn1HyUsI.js";
10
+ import { n as normalizeValidity } from "./validity-CZ7-y0Cj.js";
11
+ import { a as relationStart, i as relationHops, n as isGraphRelation, t as inheritCondition } from "./grantee-conditions-CcXf8hMM.js";
12
+ import { a as memberOfFields, p as scopeField, u as relatesTo } from "./tenancy-DN2QAx9z.js";
13
+ import { t as byCodePoint } from "./compare-pfyVnBjE.js";
15
14
  //#region src/core/policy-assertions.ts
16
15
  function assertParentGraph(resources) {
17
16
  for (const node of resources.values()) {
@@ -179,7 +178,7 @@ function normalizeOAuthScopes(input, tree) {
179
178
  leaves.set(leaf.key, leaf);
180
179
  }
181
180
  if (leaves.size === 0) throw new Error(`PermDock: oauthScopes '${scope}' covers no permission`);
182
- const sorted = [...leaves.values()].toSorted((a, b) => a.key.localeCompare(b.key));
181
+ const sorted = [...leaves.values()].toSorted((a, b) => byCodePoint(a.key, b.key));
183
182
  return {
184
183
  scope,
185
184
  permissions: sorted.map((leaf) => leaf.key),
@@ -307,8 +306,8 @@ function mergeBindings(items) {
307
306
  function definePolicy(permissions, options) {
308
307
  const vocabulary = isVocabularyInput(permissions) ? permissions : { permissions };
309
308
  const tree = vocabulary.permissions;
310
- const mapper = options.principal ?? options.subject;
311
- if (mapper === void 0) throw new Error("PermDock: definePolicy requires principal or subject");
309
+ const mapper = options.subject;
310
+ if (typeof mapper !== "function") throw new TypeError("PermDock: definePolicy requires a subject function");
312
311
  const resources = getRegistry(tree);
313
312
  assertParentGraph(resources);
314
313
  const scopes = defineScopes(options.scopes);
@@ -336,7 +335,7 @@ function definePolicy(permissions, options) {
336
335
  const delegations = (options.delegations ?? []).map((item, index) => normalizeDelegation(item, index, tree));
337
336
  const levels = normalizeLevels(resources);
338
337
  const oauthScopes = normalizeOAuthScopes(options.oauthScopes, tree);
339
- const fingerprint = bytesToBase64Url(sha256(oauthScopes.length === 0 ? canonicalPolicy(grants, delegations, levels) : `${canonicalPolicy(grants, delegations, levels)}\noauthScopes:${canonicalJson(oauthScopes)}`));
338
+ const fingerprint = sha256Digest(oauthScopes.length === 0 ? canonicalPolicy(grants, delegations, levels) : `${canonicalPolicy(grants, delegations, levels)}\noauthScopes:${canonicalJson(oauthScopes)}`);
340
339
  const hostable = [...new Set((options.hostable ?? []).flatMap((item) => flattenPermissions(item).map((leaf) => leaf.key)))].toSorted();
341
340
  const fresh = [...new Set((options.fresh ?? []).flatMap((item) => flattenPermissions(item).map((leaf) => leaf.key)))].toSorted();
342
341
  return freezeDeep({
@@ -397,259 +396,4 @@ function separationConflicts(policy, memberships) {
397
396
  return conflicts;
398
397
  }
399
398
  //#endregion
400
- //#region src/core/hosted.ts
401
- function memoryPolicySource(document = null) {
402
- const current = document === null ? null : parsePolicyDocument(document);
403
- return Object.freeze({
404
- current: () => current,
405
- refresh: () => Promise.resolve()
406
- });
407
- }
408
- function rejectUnsafe(value) {
409
- if (value === null || typeof value !== "object") return;
410
- if (Array.isArray(value)) {
411
- for (const item of value) rejectUnsafe(item);
412
- return;
413
- }
414
- for (const key of Object.keys(value)) {
415
- if (isForbiddenKey(key)) throw new Error(`PermDock: unsafe policy document key '${key}'`);
416
- rejectUnsafe(value[key]);
417
- }
418
- }
419
- /** Validates the document envelope; per-grant checks happen at merge time. */
420
- function parsePolicyDocument(json) {
421
- const input = typeof json === "string" ? JSON.parse(json) : json;
422
- if (!isRecord(input)) throw new TypeError("PermDock: policy document must be an object");
423
- const copy = JSON.parse(JSON.stringify(input));
424
- rejectUnsafe(copy);
425
- if (copy["v"] !== 1) throw new Error(`PermDock: unsupported policy document version '${String(copy["v"])}'`);
426
- if (typeof copy["id"] !== "string" || typeof copy["fingerprint"] !== "string" || typeof copy["catalog"] !== "string" || typeof copy["issuedAt"] !== "number" || !Array.isArray(copy["grants"])) throw new TypeError("PermDock: malformed policy document");
427
- return freezeDeep(copy);
428
- }
429
- const COMPARISONS = /* @__PURE__ */ new Set([
430
- "eq",
431
- "ne",
432
- "gt",
433
- "gte",
434
- "lt",
435
- "lte",
436
- "contains"
437
- ]);
438
- function safePath(path) {
439
- if (typeof path !== "string" || path.length === 0) return false;
440
- return splitPath(path).every((segment) => !isForbiddenKey(segment));
441
- }
442
- function portableValue(value) {
443
- if (value === null || typeof value === "string" || typeof value === "boolean" || typeof value === "number" && Number.isFinite(value)) return true;
444
- if (Array.isArray(value)) return value.every(portableValue);
445
- if (!isRecord(value)) return false;
446
- const keys = Object.keys(value);
447
- if (keys.length !== 1) return false;
448
- if (keys[0] === "ref") return safePath(value["ref"]);
449
- return keys[0] === "date" && typeof value["date"] === "string";
450
- }
451
- /** True for the portable subset only: no `opaque`, no `sqlFunction`, no unknown op. */
452
- function isPortableCondition(value) {
453
- if (!isRecord(value) || typeof value["op"] !== "string") return false;
454
- const op = value["op"];
455
- if (COMPARISONS.has(op)) return safePath(value["field"]) && portableValue(value["value"]);
456
- switch (op) {
457
- case "in":
458
- case "notIn": return safePath(value["field"]) && (Array.isArray(value["value"]) || isRecord(value["value"])) && portableValue(value["value"]);
459
- case "isNull": return safePath(value["field"]) && typeof value["value"] === "boolean";
460
- case "and":
461
- case "or": return Array.isArray(value["conditions"]) && value["conditions"].every(isPortableCondition);
462
- case "not": return isPortableCondition(value["condition"]);
463
- case "memberOf": return (value["scope"] === "tenant" || value["scope"] === "team" || value["scope"] === "resource") && safePath(value["field"]) && Array.isArray(value["roles"]) && value["roles"].every((item) => typeof item === "string") && (value["resource"] === void 0 || typeof value["resource"] === "string") && (value["parents"] === void 0 || Array.isArray(value["parents"]) && value["parents"].every((parent) => safePath(parent) || isRecord(parent) && safePath(parent["field"]) && typeof parent["resource"] === "string"));
464
- default: return false;
465
- }
466
- }
467
- function approvalRank(approval) {
468
- if (approval === void 0) return;
469
- if (approval === "human") return {
470
- distinct: true,
471
- stale: false,
472
- quorum: 1,
473
- ttl: Number.POSITIVE_INFINITY,
474
- escalates: false
475
- };
476
- return {
477
- by: approval.stages === void 0 ? JSON.stringify(approval.by) : JSON.stringify([approval.mode, approval.stages]),
478
- distinct: approval.distinct !== false,
479
- stale: approval.staleOn === "resource-change",
480
- quorum: approval.quorum ?? 1,
481
- ttl: parseDuration(approval.ttl) ?? Number.POSITIVE_INFINITY,
482
- escalates: approval.escalation !== void 0
483
- };
484
- }
485
- /** A hosted approval must meet every approval a code allow requires on the permission. */
486
- function approvalAtLeast(hosted, code) {
487
- const mine = approvalRank(hosted);
488
- for (const required of code) {
489
- const theirs = approvalRank(required);
490
- if (theirs === void 0) continue;
491
- if (mine === void 0) return false;
492
- if (theirs.distinct && !mine.distinct) return false;
493
- if (theirs.stale && !mine.stale) return false;
494
- if (theirs.by !== void 0 && mine.by !== theirs.by) return false;
495
- if (mine.quorum < theirs.quorum || mine.ttl > theirs.ttl) return false;
496
- if (mine.escalates && !theirs.escalates) return false;
497
- }
498
- return true;
499
- }
500
- /** A grantee kind this build does not know is never declared, so the hosted grant is dropped. */
501
- function undeclaredKind(_grantee) {
502
- return false;
503
- }
504
- function declaredGrantee(policy, grantee, permissionResource) {
505
- switch (grantee.kind) {
506
- case "role": return declaredRoleNames(policy).has(grantee.role);
507
- case "plan": return listPlans(policy.vocabulary.plans).some((leaf) => leaf.key === grantee.plan);
508
- case "relation": return grantee.resource === permissionResource && getResource(policy.permissions, grantee.resource)?.relations[grantee.relation] !== void 0 && (grantee.through === void 0 || grantee.through === "parent" && isSelfParented(getResource(policy.permissions, grantee.resource))) && (grantee.depth === void 0 || grantee.through === "parent" && Number.isInteger(grantee.depth) && grantee.depth >= 0 && grantee.depth <= 32);
509
- case "anyone":
510
- case "authenticated":
511
- case "actor":
512
- case "assurance":
513
- case "inherit": return false;
514
- default: return undeclaredKind(grantee);
515
- }
516
- }
517
- /** Approvers are declared roles, plans or relations, or any authenticated human. */
518
- function approvalAcceptable(policy, approval, permissionResource) {
519
- if (approval === void 0 || approval === "human") return true;
520
- if (!isRecord(approval)) return false;
521
- if (approval["mode"] !== void 0 || approval["stages"] !== void 0) return false;
522
- if (approval["distinct"] !== void 0 && typeof approval["distinct"] !== "boolean") return false;
523
- if (approval["staleOn"] !== void 0 && (approval["staleOn"] !== "resource-change" || getResource(policy.permissions, permissionResource)?.version === void 0)) return false;
524
- if (approval["quorum"] !== void 0 && (!Number.isInteger(approval["quorum"]) || approval["quorum"] < 1)) return false;
525
- if (approval["ttl"] !== void 0 && (typeof approval["ttl"] !== "string" || parseDuration(approval["ttl"]) === void 0)) return false;
526
- const escalation = approval["escalation"];
527
- if (escalation !== void 0 && (!isRecord(escalation) || typeof escalation["after"] !== "string" || parseDuration(escalation["after"]) === void 0 || !granteesAcceptable(policy, escalation["to"], permissionResource))) return false;
528
- if (approval["by"] === void 0) return true;
529
- return granteesAcceptable(policy, approval["by"], permissionResource);
530
- }
531
- function granteesAcceptable(policy, raw, permissionResource) {
532
- if (raw === void 0) return false;
533
- const items = flattenGrantee(raw);
534
- return items.length > 0 && items.every((item) => isRecord(item) && item.kind !== "relation" && (item.kind === "authenticated" || declaredGrantee(policy, item, permissionResource)));
535
- }
536
- function buildGrant(policy, document, raw) {
537
- if (!isRecord(raw) || typeof raw["id"] !== "string" || typeof raw["permission"] !== "string" || raw["effect"] !== void 0 && raw["effect"] !== "allow" && raw["effect"] !== "deny" || raw["to"] === void 0) return {
538
- ok: false,
539
- reason: "invalid"
540
- };
541
- const permission = findPermission(policy.permissions, raw["permission"]);
542
- if (permission === void 0) return {
543
- ok: false,
544
- reason: "unknown-permission"
545
- };
546
- if (!policy.hostable.includes(permission.key)) return {
547
- ok: false,
548
- reason: "not-hostable"
549
- };
550
- const to = flattenGrantee(raw["to"]);
551
- if (to.length === 0 || !to.every((item) => isRecord(item) && declaredGrantee(policy, item, permission.resource))) return {
552
- ok: false,
553
- reason: "unknown-grantee"
554
- };
555
- for (const condition of [raw["where"], raw["check"]]) if (condition !== void 0 && !isPortableCondition(condition)) return {
556
- ok: false,
557
- reason: "non-portable"
558
- };
559
- if (!approvalAcceptable(policy, raw["approval"], permission.resource)) return {
560
- ok: false,
561
- reason: "invalid"
562
- };
563
- if (raw["fields"] !== void 0 && !(Array.isArray(raw["fields"]) && raw["fields"].every((field) => typeof field === "string"))) return {
564
- ok: false,
565
- reason: "invalid"
566
- };
567
- const effect = raw["effect"] ?? "allow";
568
- const options = compact({
569
- where: raw["where"] === void 0 ? void 0 : normalizeWhere(raw["where"]),
570
- check: raw["check"] === void 0 ? void 0 : normalizeWhere(raw["check"]),
571
- approval: raw["approval"],
572
- fields: raw["fields"]
573
- });
574
- let built;
575
- try {
576
- const roleItem = to.length === 1 && to[0]?.kind === "role" ? to[0] : null;
577
- if (roleItem === null) {
578
- const partial = (effect === "allow" ? allow : deny)(permission, {
579
- ...options,
580
- to
581
- });
582
- built = completeGrant(partial);
583
- } else {
584
- const binding = policy.rolesByName.get(roleItem.role);
585
- const leaf = findRole(policy.vocabulary.roles, roleItem.role);
586
- const [first] = role(leaf ?? roleItem.role, [(effect === "allow" ? allow : deny)(permission, options)], binding?.on === void 0 ? {} : { on: binding.on }).grants;
587
- if (first === void 0) throw new TypeError("PermDock: role produced no grant");
588
- built = first;
589
- }
590
- } catch {
591
- return {
592
- ok: false,
593
- reason: "invalid"
594
- };
595
- }
596
- if (effect === "allow") {
597
- const codeApprovals = policy.grants.filter((grant) => grant.effect === "allow" && grant.hosted === void 0 && grant.permission.key === permission.key).map((grant) => grant.approval);
598
- if (!approvalAtLeast(built.approval, codeApprovals)) return {
599
- ok: false,
600
- reason: "weaker-approval"
601
- };
602
- }
603
- return {
604
- ok: true,
605
- grant: freezeDeep({
606
- ...built,
607
- hosted: {
608
- document: document.fingerprint,
609
- grant: raw["id"]
610
- }
611
- })
612
- };
613
- }
614
- /**
615
- * The code policy plus the hosted grants that pass every rule. Hosted
616
- * allows OR with code allows and any deny still wins, so a hosted grant can
617
- * never override a code deny; one that fails a rule is dropped, not thrown.
618
- */
619
- function mergeHostedGrants(policy, document) {
620
- if (document === null || document.grants.length === 0) return {
621
- policy,
622
- dropped: []
623
- };
624
- const merged = [];
625
- const dropped = [];
626
- for (const raw of document.grants) {
627
- const result = buildGrant(policy, document, raw);
628
- if (result.ok) {
629
- merged.push(result.grant);
630
- continue;
631
- }
632
- dropped.push(freezeDeep({
633
- kind: "hosted-grant-dropped",
634
- document: document.fingerprint,
635
- grant: isRecord(raw) && typeof raw.id === "string" ? raw.id : "",
636
- reason: result.reason
637
- }));
638
- }
639
- if (merged.length === 0) return {
640
- policy,
641
- dropped
642
- };
643
- const grants = [...policy.grants, ...merged];
644
- return {
645
- policy: freezeDeep({
646
- ...policy,
647
- grants,
648
- index: indexPolicy(policy.roles, grants, policy.vocabulary),
649
- fingerprint: bytesToBase64Url(sha256(`${policy.fingerprint}:${document.fingerprint}`))
650
- }),
651
- dropped
652
- };
653
- }
654
- //#endregion
655
- export { declaredRoleNames as a, levelCondition as c, separationConflicts as d, policyX as f, parsePolicyDocument as i, levelNames as l, memoryPolicySource as n, definePolicy as o, mergeHostedGrants as r, grantList as s, isPortableCondition as t, policyLevels as u };
399
+ export { levelCondition as a, separationConflicts as c, indexPolicy as i, policyX as l, definePolicy as n, levelNames as o, grantList as r, policyLevels as s, declaredRoleNames as t, normalizeDelegation as u };