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
@@ -1,8 +1,8 @@
1
1
  import { r as hasCredentials } from "../http-BBoKefeS.js";
2
- import { i as discoverViaSignatureAgent, r as InvalidSignatureError, s as verifyWebBotAuth } from "../evaluations-C9YJsv3H.js";
3
- import { t as problemFromError } from "../map-error-BE27PYkE.js";
4
- import { i as decorate, r as bindKernel } from "../bind-kk-uyCwH.js";
5
- import { i as toRequest, r as sendResponse } from "../http-BEbdMZ05.js";
2
+ import { d as discoverViaSignatureAgent, m as webBotAuthVerifier, u as InvalidSignatureError } from "../evaluations-DZ2CbV5k.js";
3
+ import { t as problemFromError } from "../map-error-TCAdw-eW.js";
4
+ import { i as decorate, r as bindKernel } from "../bind-CZzhx-Vj.js";
5
+ import { n as sendResponse, r as toRequest } from "../http-ujKm0JXE.js";
6
6
  import express from "express";
7
7
  //#region src/express/create.ts
8
8
  function run(work, next) {
@@ -33,16 +33,16 @@ const withPermDock = (fn) => (req, res, next) => {
33
33
  }, next);
34
34
  };
35
35
  function createPermDock(policy, options) {
36
- const { kernel, bind, rebind, scopeOf, handlerScope, guard: runGuard } = bindKernel(policy, options, "express", toRequest);
37
- const permdock = () => (req, res, next) => {
36
+ const { kernel, bind, rebind, scopeOf, handlerScope, getPermDock, guard: runGuard } = bindKernel(policy, options, "express", toRequest);
37
+ const middleware = () => (req, res, next) => {
38
38
  respond(req, res, next, async () => {
39
- decorate(req, await kernel.permdock(bind(req), await scopeOf(req)));
39
+ decorate(req, await kernel.getPermDock(bind(req), await scopeOf(req)));
40
40
  next();
41
41
  });
42
42
  };
43
- const protect = (permission, loadData, protectOptions) => (req, res, next) => {
43
+ const protect = (permission, data, protectOptions) => (req, res, next) => {
44
44
  respond(req, res, next, async () => {
45
- const guard = await runGuard(permission, loadData, req, protectOptions);
45
+ const guard = await runGuard(permission, data, req, protectOptions);
46
46
  if (!guard.ok) {
47
47
  await sendResponse(res, guard.response);
48
48
  return;
@@ -67,7 +67,8 @@ function createPermDock(policy, options) {
67
67
  return router;
68
68
  };
69
69
  return {
70
- permdock,
70
+ getPermDock,
71
+ middleware,
71
72
  protect,
72
73
  errorHandler,
73
74
  permdockHandler,
@@ -76,4 +77,4 @@ function createPermDock(policy, options) {
76
77
  };
77
78
  }
78
79
  //#endregion
79
- export { InvalidSignatureError, createPermDock, discoverViaSignatureAgent, sendResponse, toRequest, verifyWebBotAuth };
80
+ export { InvalidSignatureError, createPermDock, discoverViaSignatureAgent, sendResponse, toRequest, webBotAuthVerifier };
@@ -1,11 +1,22 @@
1
- import { E as Policy, Or as Principal, j as PolicyVocabulary, jt as PermDock } from "../policy-types-sp9P1iIV.js";
2
- import { d as Permission } from "../permission-types-Dg39z9Kv.js";
3
- import { C as verifyWebBotAuth, b as discoverViaSignatureAgent, i as OpenApiHooks, m as InvalidSignatureError, o as ProtectOptions } from "../server-types-DdqBwZN_.js";
4
- import { t as ServerAdapterOptions } from "../bind-BzqG8SMb.js";
1
+ import { T as Policy, j as PolicyVocabulary, rr as Principal } from "../policy-types-DzwivBgR.js";
2
+ import { w as Permission } from "../vocabulary-D6lPdb4Z.js";
3
+ import { r as PermDock } from "../permdock-D7eeLJER.js";
4
+ import { f as InvalidSignatureError, i as OpenApiHooks, o as ProtectOptions, v as discoverViaSignatureAgent, x as webBotAuthVerifier } from "../server-types-BLd4MnBX.js";
5
+ import { t as ServerAdapterOptions } from "../bind--9EFVYWF.js";
5
6
  import { FastifyPluginAsync, FastifyReply, FastifyRequest, FastifySchema, FastifyTypeProvider, FastifyTypeProviderDefault, RawRequestDefaultExpression, RawServerDefault, RouteGenericInterface } from "fastify";
7
+ //#region src/server/http.d.ts
8
+ /** A Fastify-style reply: `code`, `header` and `send`. */
9
+ type ReplyLike = {
10
+ code(status: number): unknown;
11
+ header(key: string, value: string): unknown;
12
+ send(body: string): unknown;
13
+ };
14
+ /** Writes `response` to a Fastify-style reply. */
15
+ declare function writeReply(reply: ReplyLike, response: Response): Promise<void>;
16
+ //#endregion
6
17
  //#region src/fastify/create.d.ts
7
18
  type FastifyPermDockOptions<TUser = unknown> = ServerAdapterOptions<FastifyRequest, TUser>;
8
- type PermDockRequest<Route extends RouteGenericInterface = RouteGenericInterface, V extends PolicyVocabulary = PolicyVocabulary> = FastifyRequest<Route> & {
19
+ type FastifyPermDockRequest<Route extends RouteGenericInterface = RouteGenericInterface, V extends PolicyVocabulary = PolicyVocabulary> = FastifyRequest<Route> & {
9
20
  permdock: PermDock<V>;
10
21
  permdockData?: unknown;
11
22
  };
@@ -13,31 +24,23 @@ type PermDockRequest<Route extends RouteGenericInterface = RouteGenericInterface
13
24
  type ProtectRequest<Route extends RouteGenericInterface = RouteGenericInterface, Schema extends FastifySchema = FastifySchema, Provider extends FastifyTypeProvider = FastifyTypeProviderDefault> = FastifyRequest<Route, RawServerDefault, RawRequestDefaultExpression, Schema, Provider>;
14
25
  /**
15
26
  * Generic over the route, schema and type provider so a `preHandler` slot
16
- * infers them: `loadData` sees the same typed `request.body` as the handler.
27
+ * infers them: `data` sees the same typed `request.body` as the handler.
17
28
  */
18
- type FastifyProtect = <Route extends RouteGenericInterface = RouteGenericInterface, Schema extends FastifySchema = FastifySchema, Provider extends FastifyTypeProvider = FastifyTypeProviderDefault>(permission: Permission | null, loadData?: (request: ProtectRequest<Route, Schema, Provider>) => unknown, protectOptions?: ProtectOptions) => (request: ProtectRequest<Route, Schema, Provider>, reply: FastifyReply) => Promise<void>;
29
+ type FastifyProtect = <Route extends RouteGenericInterface = RouteGenericInterface, Schema extends FastifySchema = FastifySchema, Provider extends FastifyTypeProvider = FastifyTypeProviderDefault>(permission: Permission | null, data?: (request: ProtectRequest<Route, Schema, Provider>) => unknown, protectOptions?: ProtectOptions) => (request: ProtectRequest<Route, Schema, Provider>, reply: FastifyReply) => Promise<void>;
19
30
  type FastifyPermDock<V extends PolicyVocabulary = PolicyVocabulary> = {
20
- readonly permdock: FastifyPluginAsync;
31
+ /** The `PermDock` for one request, for code the middleware does not run before. */
32
+ readonly getPermDock: (request: FastifyRequest) => Promise<PermDock<V>>;
33
+ readonly middleware: () => FastifyPluginAsync;
21
34
  readonly protect: FastifyProtect;
22
- readonly permdockHandler: FastifyPluginAsync;
23
- /** Types `request.permdock` for a route registered after `permdock` or `protect`. */
24
- readonly withPermDock: <Route extends RouteGenericInterface = RouteGenericInterface>(fn: (request: PermDockRequest<Route, V>, reply: FastifyReply) => unknown) => (request: FastifyRequest<Route>, reply: FastifyReply) => unknown;
35
+ readonly permdockHandler: () => FastifyPluginAsync;
36
+ /** Types `request.permdock` for a route registered after `middleware()` or `protect`. */
37
+ readonly withPermDock: <Route extends RouteGenericInterface = RouteGenericInterface>(fn: (request: FastifyPermDockRequest<Route, V>, reply: FastifyReply) => unknown) => (request: FastifyRequest<Route>, reply: FastifyReply) => unknown;
25
38
  readonly openapi: OpenApiHooks;
26
39
  };
27
40
  export declare function createPermDock<TUser, TPrincipal extends Principal = Principal, V extends PolicyVocabulary = PolicyVocabulary>(policy: Policy<TUser, TPrincipal, V>, options: FastifyPermDockOptions<TUser>): FastifyPermDock<V>;
28
41
  //#endregion
29
- //#region src/server/http.d.ts
30
- /** A Fastify-style reply: `code`, `header` and `send`. */
31
- type ReplyLike = {
32
- code(status: number): unknown;
33
- header(key: string, value: string): unknown;
34
- send(body: string): unknown;
35
- };
36
- /** Writes `response` to a Fastify-style reply. */
37
- declare function writeReply(reply: ReplyLike, response: Response): Promise<void>;
38
- //#endregion
39
42
  //#region src/fastify/http.d.ts
40
43
  export declare function toRequest(request: FastifyRequest): Request;
41
44
  export declare const sendReply: typeof writeReply;
42
45
  //#endregion
43
- export { type FastifyPermDock, type FastifyPermDockOptions, type FastifyProtect, InvalidSignatureError, type PermDockRequest, discoverViaSignatureAgent, verifyWebBotAuth };
46
+ export { type FastifyPermDock, type FastifyPermDockOptions, type FastifyPermDockRequest, type FastifyProtect, InvalidSignatureError, discoverViaSignatureAgent, webBotAuthVerifier };
@@ -1,7 +1,7 @@
1
1
  import { c as writeReply, i as headersFrom, n as firstHeader, r as hasCredentials, t as fetchRequest } from "../http-BBoKefeS.js";
2
- import { i as discoverViaSignatureAgent, r as InvalidSignatureError, s as verifyWebBotAuth } from "../evaluations-C9YJsv3H.js";
3
- import { t as problemFromError } from "../map-error-BE27PYkE.js";
4
- import { i as decorate, r as bindKernel } from "../bind-kk-uyCwH.js";
2
+ import { d as discoverViaSignatureAgent, m as webBotAuthVerifier, u as InvalidSignatureError } from "../evaluations-DZ2CbV5k.js";
3
+ import { t as problemFromError } from "../map-error-TCAdw-eW.js";
4
+ import { i as decorate, r as bindKernel } from "../bind-CZzhx-Vj.js";
5
5
  //#region src/fastify/http.ts
6
6
  function toRequest(request) {
7
7
  const host = firstHeader(request.headers.host) ?? "localhost";
@@ -21,13 +21,13 @@ function skipped(request) {
21
21
  return typeof config === "object" && config !== null && Reflect.get(config, "permdock") === false;
22
22
  }
23
23
  function createPermDock(policy, options) {
24
- const { kernel, bind, rebind, scopeOf, handlerScope, guard: runGuard } = bindKernel(policy, options, "fastify", toRequest);
25
- const permdock = breakEncapsulation((app) => {
24
+ const { kernel, bind, rebind, scopeOf, handlerScope, getPermDock, guard: runGuard } = bindKernel(policy, options, "fastify", toRequest);
25
+ const plugin = breakEncapsulation((app) => {
26
26
  app.decorateRequest("permdock", null);
27
27
  app.decorateRequest("permdockData", null);
28
28
  app.addHook("onRequest", async (request) => {
29
29
  if (skipped(request)) return;
30
- decorate(request, await kernel.permdock(bind(request), await scopeOf(request)));
30
+ decorate(request, await kernel.getPermDock(bind(request), await scopeOf(request)));
31
31
  });
32
32
  const previous = app.errorHandler;
33
33
  app.setErrorHandler(async function permdockErrors(err, request, reply) {
@@ -40,16 +40,16 @@ function createPermDock(policy, options) {
40
40
  });
41
41
  return Promise.resolve();
42
42
  });
43
- const protect = (permission, loadData, protectOptions) => async (request, reply) => {
43
+ const protect = (permission, data, protectOptions) => async (request, reply) => {
44
44
  const plain = request;
45
- const guard = await runGuard(permission, loadData === void 0 ? void 0 : () => loadData(request), plain, protectOptions);
45
+ const guard = await runGuard(permission, data === void 0 ? void 0 : () => data(request), plain, protectOptions);
46
46
  if (!guard.ok) {
47
47
  await sendReply(reply, guard.response);
48
48
  return;
49
49
  }
50
50
  decorate(plain, guard.permdock, guard.data);
51
51
  };
52
- const permdockHandler = (app) => {
52
+ const handler = (app) => {
53
53
  const { POST, GET } = kernel.permdockHandler(handlerScope);
54
54
  app.post("/", async (request, reply) => {
55
55
  await sendReply(reply, await POST(rebind(request)));
@@ -61,12 +61,13 @@ function createPermDock(policy, options) {
61
61
  };
62
62
  const withPermDock = (fn) => (request, reply) => fn(request, reply);
63
63
  return {
64
- permdock,
64
+ getPermDock,
65
+ middleware: () => plugin,
65
66
  protect,
66
- permdockHandler,
67
+ permdockHandler: () => handler,
67
68
  withPermDock,
68
69
  openapi: kernel.openapi
69
70
  };
70
71
  }
71
72
  //#endregion
72
- export { InvalidSignatureError, createPermDock, discoverViaSignatureAgent, sendReply, toRequest, verifyWebBotAuth };
73
+ export { InvalidSignatureError, createPermDock, discoverViaSignatureAgent, sendReply, toRequest, webBotAuthVerifier };
@@ -0,0 +1,120 @@
1
+ import { t as compact } from "./compact-CAf557ZB.js";
2
+ import { o as isPermission } from "./permission-registry-Br4jSNVi.js";
3
+ import { r as hasCredentials } from "./http-BBoKefeS.js";
4
+ import { a as methodNotAllowed } from "./problem-CTviyH5L.js";
5
+ import { t as problemFromError } from "./map-error-TCAdw-eW.js";
6
+ import { i as decorate, r as bindKernel } from "./bind-CZzhx-Vj.js";
7
+ //#region src/server/fetch-adapter.ts
8
+ /**
9
+ * `protect(target, data, options)(handler)` for a framework whose routes are
10
+ * plain handlers: a refusal is the response, a grant sets `permdock` and
11
+ * `permdockData` on the event's locals before `handler` runs.
12
+ */
13
+ function guardedRoute(adapter, route, target, data, protectOptions) {
14
+ return (handler) => async (event) => {
15
+ const context = route.context(event);
16
+ const guard = await adapter.guard(target, data === void 0 ? void 0 : () => data(event), context, protectOptions);
17
+ if (!guard.ok) return guard.response;
18
+ decorate(route.locals(event), guard.permdock, guard.data);
19
+ return adapter.mapErrors(context, () => handler(event));
20
+ };
21
+ }
22
+ /** `withPermDock(handler)`: the instance on the event's locals, built when no middleware set it. */
23
+ function instanceRoute(adapter, route) {
24
+ return (handler) => async (event) => {
25
+ const context = route.context(event);
26
+ const attached = await adapter.ensure(route.locals(event), context);
27
+ if (!attached.ok) return attached.response;
28
+ return adapter.mapErrors(context, () => handler(event));
29
+ };
30
+ }
31
+ const ALLOW = "GET, HEAD, POST";
32
+ /**
33
+ * The permission and row loader behind a `protect` target. For an operation,
34
+ * `input` reads its input from the request and the operation's `data` loads
35
+ * the row; an operation without `data` checks the permission with no row.
36
+ */
37
+ function protectTarget(target, input) {
38
+ if (target === null || isPermission(target)) return {
39
+ permission: target,
40
+ data: input
41
+ };
42
+ const load = target.data;
43
+ return {
44
+ permission: target.permission,
45
+ data: load === void 0 ? void 0 : async (context) => load(input === void 0 ? void 0 : await input(context))
46
+ };
47
+ }
48
+ function held(target) {
49
+ const value = Reflect.get(target, "permdock");
50
+ return value === void 0 || value === null ? void 0 : value;
51
+ }
52
+ /**
53
+ * The kernel of an adapter whose framework hands its handlers a Fetch
54
+ * `Request` inside its own context object (SvelteKit, Astro, h3, SolidStart,
55
+ * TanStack Start).
56
+ */
57
+ function fetchAdapter(policy, options, adapter, requestOf) {
58
+ const { kernel, bind, scopeOf, handlerScope, attach, guard } = bindKernel(policy, options, adapter, requestOf);
59
+ const getPermDock = async (context) => kernel.getPermDock(bind(context), await scopeOf(context));
60
+ const getSnapshot = async (context, query = {}) => {
61
+ return (await kernel.getPermDock(bind(context), query.tenant === void 0 ? await scopeOf(context) : { tenant: query.tenant })).snapshot(compact({
62
+ include: query.include,
63
+ tenants: query.tenants
64
+ }));
65
+ };
66
+ const ensure = async (target, context) => {
67
+ const existing = held(target);
68
+ if (existing !== void 0) return {
69
+ ok: true,
70
+ permdock: existing
71
+ };
72
+ const result = await attach(context);
73
+ if (result.ok) decorate(target, result.permdock);
74
+ return result;
75
+ };
76
+ const mapErrors = async (context, work) => {
77
+ try {
78
+ return await work();
79
+ } catch (error) {
80
+ const problem = problemFromError(error, { credentials: hasCredentials(requestOf(context)) });
81
+ if (problem === void 0) throw error;
82
+ return problem;
83
+ }
84
+ };
85
+ const handlers = () => {
86
+ const { GET, POST } = kernel.permdockHandler(handlerScope);
87
+ return {
88
+ GET: (context) => GET(bind(context)),
89
+ POST: (context) => POST(bind(context))
90
+ };
91
+ };
92
+ const handler = () => {
93
+ const { GET, POST } = handlers();
94
+ return (context) => {
95
+ switch (requestOf(context).method) {
96
+ case "GET":
97
+ case "HEAD": return GET(context);
98
+ case "POST": return POST(context);
99
+ default: return Promise.resolve(methodNotAllowed(ALLOW));
100
+ }
101
+ };
102
+ };
103
+ return {
104
+ kernel,
105
+ getPermDock,
106
+ getSnapshot,
107
+ attach,
108
+ guard: (target, data, context, protectOptions) => {
109
+ const resolved = protectTarget(target, data);
110
+ return guard(resolved.permission, resolved.data, context, protectOptions);
111
+ },
112
+ ensure,
113
+ connection: async (context, connectionOptions) => kernel.connection(bind(context), connectionOptions, await scopeOf(context)),
114
+ mapErrors,
115
+ handlers,
116
+ handler
117
+ };
118
+ }
119
+ //#endregion
120
+ export { guardedRoute as n, instanceRoute as r, fetchAdapter as t };
@@ -0,0 +1,31 @@
1
+ import { w as Permission } from "./vocabulary-D6lPdb4Z.js";
2
+ import { a as OperationInput, t as Operation } from "./operations-CxybZErY.js";
3
+ import { n as RevocationFeed } from "./revocations-R07lFBnX.js";
4
+ import { o as ProtectOptions } from "./server-types-BLd4MnBX.js";
5
+ import { t as ServerAdapterOptions } from "./bind--9EFVYWF.js";
6
+ //#region src/server/fetch-adapter.d.ts
7
+ /** What `protect` checks: a permission, an operation from `defineOperations`, or `null` for a route that needs only OAuth scopes. */
8
+ type ProtectTarget = Permission | Operation | null;
9
+ /** Reads a value from the framework context; may be async. */
10
+ type ContextReader<TContext, T> = (context: TContext) => T | Promise<T>;
11
+ /**
12
+ * `protect`'s overloads: a permission takes the row loader, an operation the
13
+ * reader of its input, which the operation's `data` turns into the row.
14
+ */
15
+ type FetchProtect<TContext, TResult> = {
16
+ <T = unknown>(permission: Permission | null, data?: ContextReader<TContext, T | null | undefined>, protectOptions?: ProtectOptions): TResult;
17
+ <TOperation extends Operation>(operation: TOperation, input?: ContextReader<TContext, OperationInput<TOperation>>, protectOptions?: ProtectOptions): TResult;
18
+ };
19
+ type FetchAdapterOptions<TContext, TUser = unknown> = ServerAdapterOptions<TContext, TUser> & {
20
+ /** Ends or revalidates open streams and sockets; never a decision input. */
21
+ readonly revocations?: RevocationFeed;
22
+ };
23
+ /** The decision endpoint, one handler per method. */
24
+ type PermDockHandlers<TContext> = {
25
+ /** The snapshot for `permdock/react` and the other client entries. */
26
+ readonly GET: (context: TContext) => Promise<Response>;
27
+ /** AuthZEN-shaped evaluations. */
28
+ readonly POST: (context: TContext) => Promise<Response>;
29
+ };
30
+ //#endregion
31
+ export { ProtectTarget as a, PermDockHandlers as i, FetchAdapterOptions as n, FetchProtect as r, ContextReader as t };
@@ -0,0 +1,203 @@
1
+ import { i as configError } from "./errors-CWTY6uih.js";
2
+ import { s as jsonSchemaOf } from "./catalog-doc-C9wjsfNY.js";
3
+ import { F as quoteQualified, N as quoteIdent, P as quoteLiteral, j as helperSchema, s as signedIn } from "./shared-CD11nBbC.js";
4
+ import { c as branchClauses, i as orSql, s as andSql, u as wrapSql } from "./policies-CO1oOymN.js";
5
+ //#region src/cli/rls/fields.ts
6
+ /** Names of the field-view objects. Part of the SQL contract. */
7
+ const FIELD_VIEWS = {
8
+ /** `<table>_visible`: the `security_invoker` view clients read. */
9
+ view: "_visible",
10
+ /** `<table>_visible_fields`: the owner-rights companion `--revoke-columns` adds. */
11
+ companion: "_visible_fields",
12
+ /** The companion's row-key column, joined to the base table's key. */
13
+ key: "permdock_key",
14
+ /** Marks the companion so doctor PD022 knows it reads as its owner on purpose. */
15
+ comment: "permdock:field-companion"
16
+ };
17
+ function covers(branch, column) {
18
+ return branch.fields === void 0 || branch.fields.includes(column);
19
+ }
20
+ /**
21
+ * A read grant that only shapes columns: a field-limited deny (it never
22
+ * denies the row) or an allow with an empty list (it grants nothing). With
23
+ * field views it leaves the row policy and lives in the view's masks.
24
+ */
25
+ function fieldOnly(branch) {
26
+ if (branch.command !== "select" || branch.fields === void 0) return false;
27
+ return branch.effect === "deny" || branch.fields.length === 0;
28
+ }
29
+ /** Branches the row policies keep when field views compile. */
30
+ function rowBranches(branches) {
31
+ return branches.filter((branch) => !fieldOnly(branch));
32
+ }
33
+ /**
34
+ * Whether the reader is signed in, for branches with no helper call: a grant
35
+ * to any signed-in user relies on `to authenticated` in its policy, which a
36
+ * view does not have.
37
+ */
38
+ function audience(ctx, branch) {
39
+ if (branch.access !== void 0 || branch.roles.length !== 1) return;
40
+ if (branch.roles[0] === "authenticated") return signedIn(ctx);
41
+ return branch.roles[0] === "anon" ? `not (${signedIn(ctx)})` : void 0;
42
+ }
43
+ function clause(ctx, branch) {
44
+ return andSql(audience(ctx, branch), branchClauses(branch).using) ?? "true";
45
+ }
46
+ /**
47
+ * `can(permission, row, { field })` in SQL: an allow that covers the column
48
+ * holds for the row and no covering deny does. Every access term is the
49
+ * uncorrelated helper call the row policy uses, so it runs once per statement.
50
+ */
51
+ function maskSql(ctx, allows, denies, column) {
52
+ const allowed = allows.filter((branch) => covers(branch, column)).map((branch) => clause(ctx, branch));
53
+ if (allowed.length === 0) return "false";
54
+ const denied = denies.filter((branch) => covers(branch, column)).map((branch) => clause(ctx, branch));
55
+ const allow = orSql(allowed);
56
+ if (denied.length === 0) return allow;
57
+ const deny = orSql(denied);
58
+ return allow === "true" ? `not ${wrapSql(deny)}` : `${wrapSql(allow)} and not ${wrapSql(deny)}`;
59
+ }
60
+ function schemaColumns(policy, resource) {
61
+ const node = policy.resources.get(resource);
62
+ const schema = node === void 0 ? null : jsonSchemaOf(node);
63
+ const properties = schema !== null && typeof schema === "object" ? schema.properties : void 0;
64
+ return properties !== null && typeof properties === "object" ? Object.keys(properties) : void 0;
65
+ }
66
+ function viewName(table, suffix) {
67
+ return `${table}${suffix}`;
68
+ }
69
+ /**
70
+ * `<helper schema>.<table>_visible_fields`: outside the Data API's schemas,
71
+ * so its owner rights reach clients only through the `_visible` join.
72
+ */
73
+ function companionName(ctx, table) {
74
+ const base = table.startsWith("public.") ? table.slice(7) : table.replaceAll(".", "_");
75
+ return `${helperSchema(ctx)}.${viewName(base, FIELD_VIEWS.companion)}`;
76
+ }
77
+ /**
78
+ * One view per table whose read grants limit fields. A column is restricted
79
+ * when some read allow lists fields without it or some read deny lists it;
80
+ * every other column, and the row key, passes through unchanged.
81
+ */
82
+ function fieldViews(policy, ctx, branches, options, warnings) {
83
+ const byTable = /* @__PURE__ */ new Map();
84
+ for (const branch of branches) {
85
+ if (branch.command !== "select" || branch.coverage === true) continue;
86
+ byTable.set(branch.table, [...byTable.get(branch.table) ?? [], branch]);
87
+ }
88
+ const views = [];
89
+ for (const [table, reads] of byTable) {
90
+ const allows = reads.filter((branch) => branch.effect === "allow" && branch.fields?.length !== 0);
91
+ const denies = reads.filter((branch) => branch.effect === "deny");
92
+ const limited = reads.some((branch) => branch.fields !== void 0);
93
+ const resource = reads.find((branch) => branch.resource !== void 0)?.resource;
94
+ if (!limited || allows.length === 0 || resource === void 0) continue;
95
+ const names = schemaColumns(policy, resource);
96
+ if (names === void 0) throw configError(`PermDock CLI: --fields views needs the ${resource} schema's JSON Schema (Standard JSON Schema) to list the columns of ${table}`);
97
+ const key = policy.resources.get(resource)?.id ?? "id";
98
+ const restricted = (column) => column !== key && (allows.some((branch) => branch.fields !== void 0 && !branch.fields.includes(column)) || denies.some((branch) => branch.fields?.includes(column) === true));
99
+ const columns = names.map((name) => {
100
+ quoteIdent(name);
101
+ return restricted(name) ? {
102
+ name,
103
+ mask: maskSql(ctx, allows, denies, name)
104
+ } : { name };
105
+ });
106
+ if (columns.every((column) => column.mask === void 0)) continue;
107
+ const view = viewName(table, FIELD_VIEWS.view);
108
+ if (allows.some((branch) => branch.fields !== void 0 && !branch.fields.includes(key))) warnings.push(`field view ${view}: the key ${key} passes through, although a read grant on ${resource} omits it`);
109
+ const hidden = columns.filter((column) => column.mask !== void 0).map((column) => column.name);
110
+ if (options.helpersOnly === true) warnings.push(`field view ${view}: ${table} still returns ${hidden.join(", ")} to direct reads; revoke select on those columns from client roles in your own grants, or read them through a function`);
111
+ else if (!options.revokeColumns) warnings.push(`field view ${view}: ${table} still returns ${hidden.join(", ")} to direct reads; add --revoke-columns so clients read through the view`);
112
+ views.push({
113
+ resource,
114
+ table,
115
+ view,
116
+ key,
117
+ columns,
118
+ roles: reads.some((branch) => branch.roles.includes("anon")) ? ["anon", "authenticated"] : ["authenticated"],
119
+ ...options.revokeColumns ? { companion: companionName(ctx, table) } : {}
120
+ });
121
+ }
122
+ return views;
123
+ }
124
+ /** Columns of `view`'s table that `anon` and `authenticated` keep on the base table with `--revoke-columns`. */
125
+ function readableColumns(view) {
126
+ return view.columns.filter((column) => column.mask === void 0).map((column) => column.name);
127
+ }
128
+ function restrictedColumns(view) {
129
+ return view.columns.filter((column) => column.mask !== void 0).map((column) => column.name);
130
+ }
131
+ function columnList(names) {
132
+ return names.map(quoteIdent).join(", ");
133
+ }
134
+ function selectList(lines) {
135
+ return lines.map((line) => ` ${line}`).join(",\n");
136
+ }
137
+ function grantView(name, roles) {
138
+ return [`revoke all on table ${quoteQualified(name)} from anon, authenticated, public;`, `grant select on table ${quoteQualified(name)} to ${roles.join(", ")};`].join("\n");
139
+ }
140
+ function inlineViewSql(view) {
141
+ const targets = view.columns.map((column) => column.mask === void 0 ? quoteIdent(column.name) : `case when ${column.mask} then ${quoteIdent(column.name)} end as ${quoteIdent(column.name)}`);
142
+ return `create or replace view ${quoteQualified(view.view)} with (security_invoker = true) as
143
+ select
144
+ ${selectList(targets)}
145
+ from ${quoteQualified(view.table)};`;
146
+ }
147
+ function companionSql(view, companion) {
148
+ const restricted = view.columns.filter((column) => column.mask !== void 0);
149
+ const targets = [`${quoteIdent(view.key)} as ${quoteIdent(FIELD_VIEWS.key)}`, ...restricted.map((column) => `case when ${column.mask} then ${quoteIdent(column.name)} end as ${quoteIdent(column.name)}`)];
150
+ const any = orSql(restricted.map((column) => column.mask ?? "false"));
151
+ const name = companion.slice(0, companion.indexOf("."));
152
+ const schema = quoteIdent(name);
153
+ return `${name === "public" ? "" : `create schema if not exists ${schema};
154
+ revoke all on schema ${schema} from public;
155
+ grant usage on schema ${schema} to ${view.roles.join(", ")};
156
+ `}create or replace view ${quoteQualified(companion)} with (security_barrier = true) as
157
+ select
158
+ ${selectList(targets)}
159
+ from ${quoteQualified(view.table)}
160
+ where ${any};
161
+ comment on view ${quoteQualified(companion)} is ${quoteLiteral(`${FIELD_VIEWS.comment} ${view.view}`)};`;
162
+ }
163
+ function joinedViewSql(view, companion) {
164
+ const targets = view.columns.map((column) => column.mask === void 0 ? `t.${quoteIdent(column.name)}` : `f.${quoteIdent(column.name)}`);
165
+ return `create or replace view ${quoteQualified(view.view)} with (security_invoker = true) as
166
+ select
167
+ ${selectList(targets)}
168
+ from ${quoteQualified(view.table)} t
169
+ left join ${quoteQualified(companion)} f on f.${quoteIdent(FIELD_VIEWS.key)} = t.${quoteIdent(view.key)};`;
170
+ }
171
+ /** `select` on only the unrestricted columns (and the key) of the base table, for `--revoke-columns`. */
172
+ function columnGrantSql(view, role) {
173
+ return `grant select (${columnList(readableColumns(view))}) on table ${quoteQualified(view.table)} to ${role};`;
174
+ }
175
+ function columnRevokeSql(view) {
176
+ return `revoke select (${columnList(restrictedColumns(view))}) on table ${quoteQualified(view.table)} from anon, authenticated;`;
177
+ }
178
+ /**
179
+ * The view SQL: the `security_invoker` view, and with `--revoke-columns` the
180
+ * owner-rights companion it joins for the restricted columns. The companion
181
+ * masks every column with the full field decision and keeps only rows where
182
+ * one is readable, so reading it directly shows nothing `pick` would not.
183
+ */
184
+ function fieldViewsSql(views) {
185
+ return views.map((view) => {
186
+ const head = `-- field view over ${view.table}: ${restrictedColumns(view).join(", ")} read as null unless a read grant covers the column for the row`;
187
+ if (view.companion === void 0) return [
188
+ head,
189
+ inlineViewSql(view),
190
+ grantView(view.view, view.roles)
191
+ ].join("\n");
192
+ return [
193
+ head,
194
+ `-- ${view.companion} reads ${view.table} as its owner; ${view.view} reads the rows as the caller and joins it`,
195
+ companionSql(view, view.companion),
196
+ grantView(view.companion, view.roles),
197
+ joinedViewSql(view, view.companion),
198
+ grantView(view.view, view.roles)
199
+ ].join("\n");
200
+ }).join("\n\n");
201
+ }
202
+ //#endregion
203
+ export { fieldViewsSql as a, fieldViews as i, columnGrantSql as n, rowBranches as o, columnRevokeSql as r, viewName as s, FIELD_VIEWS as t };
@@ -0,0 +1,124 @@
1
+ import { n as CliError } from "./errors-CWTY6uih.js";
2
+ import { existsSync, mkdirSync, readFileSync, realpathSync, renameSync, rmSync, writeFileSync } from "node:fs";
3
+ import { dirname, relative, resolve } from "node:path";
4
+ import { execFileSync } from "node:child_process";
5
+ //#region src/cli/core/files.ts
6
+ function outcomeOf(abs, text) {
7
+ if (!existsSync(abs)) return "created";
8
+ return readFileSync(abs, "utf8") === text ? "unchanged" : "updated";
9
+ }
10
+ /** What writing `files` would do, without writing. */
11
+ function planFiles(cwd, files) {
12
+ return files.map((file) => ({
13
+ path: file.path,
14
+ outcome: outcomeOf(resolve(cwd, file.path), file.text)
15
+ }));
16
+ }
17
+ /**
18
+ * Writes every created or updated file, all or nothing: each one is staged
19
+ * beside its target first, and a failed stage removes the others before
20
+ * anything is replaced. `dryRun` only plans.
21
+ */
22
+ function applyFiles(cwd, files, options = {}) {
23
+ const planned = planFiles(cwd, files);
24
+ if (options.dryRun === true) return planned;
25
+ const staged = [];
26
+ try {
27
+ for (const [index, file] of files.entries()) {
28
+ if (planned[index]?.outcome === "unchanged") continue;
29
+ const target = resolve(cwd, file.path);
30
+ const temp = `${target}.permdock-${String(process.pid)}.tmp`;
31
+ mkdirSync(dirname(target), { recursive: true });
32
+ writeFileSync(temp, file.text);
33
+ staged.push({
34
+ temp,
35
+ target
36
+ });
37
+ }
38
+ } catch (error) {
39
+ for (const { temp } of staged) rmSync(temp, { force: true });
40
+ throw new CliError("failed", `could not write ${describe(error)}; wrote nothing`, {
41
+ code: "write_failed",
42
+ cause: error
43
+ });
44
+ }
45
+ for (const { temp, target } of staged) renameSync(temp, target);
46
+ return planned;
47
+ }
48
+ function describe(error) {
49
+ return error instanceof Error ? error.message : String(error);
50
+ }
51
+ const VERBS = {
52
+ created: ["Created", "Would create"],
53
+ updated: ["Updated", "Would update"],
54
+ unchanged: ["Unchanged", "Unchanged"]
55
+ };
56
+ /** One line per file: `Created x`, or `Would create x` under `--dry-run`. */
57
+ function fileSummary(applied, dryRun) {
58
+ return applied.map((file) => `${VERBS[file.outcome][dryRun ? 1 : 0]} ${file.path}`).join("\n");
59
+ }
60
+ /**
61
+ * The files among `paths` with uncommitted changes in git. Outside a git
62
+ * work tree, or without git, nothing counts as dirty.
63
+ */
64
+ function dirtyFiles(cwd, paths) {
65
+ if (paths.length === 0) return [];
66
+ let status;
67
+ try {
68
+ status = execFileSync("git", [
69
+ "status",
70
+ "--porcelain",
71
+ "-z",
72
+ "--",
73
+ ...paths.map((path) => resolve(cwd, path))
74
+ ], {
75
+ cwd,
76
+ encoding: "utf8",
77
+ stdio: [
78
+ "ignore",
79
+ "pipe",
80
+ "ignore"
81
+ ]
82
+ });
83
+ } catch {
84
+ return [];
85
+ }
86
+ let root;
87
+ try {
88
+ root = execFileSync("git", ["rev-parse", "--show-toplevel"], {
89
+ cwd,
90
+ encoding: "utf8",
91
+ stdio: [
92
+ "ignore",
93
+ "pipe",
94
+ "ignore"
95
+ ]
96
+ }).trim();
97
+ } catch {
98
+ return [];
99
+ }
100
+ return status.split("\0").filter((entry) => entry.length > 3).map((entry) => relative(realpathSync(cwd), resolve(root, entry.slice(3))));
101
+ }
102
+ /**
103
+ * A rewrite of hand-written files stops when one of them has uncommitted
104
+ * changes, so `git diff` shows only what the command changed. `--force`
105
+ * rewrites anyway.
106
+ */
107
+ function refuseDirty(input) {
108
+ if (input.force) return;
109
+ const dirty = dirtyFiles(input.cwd, input.paths);
110
+ if (dirty.length === 0) return;
111
+ throw new CliError("action", `${input.command} rewrites files with uncommitted changes: ${dirty.join(", ")}. Commit or stash them first, so git diff shows only the rewrite.`, {
112
+ code: "dirty_worktree",
113
+ extensions: { files: dirty },
114
+ next: [{
115
+ when: "to see the changes first",
116
+ command: `permdock ${input.invocation} --dry-run`
117
+ }, {
118
+ when: "to rewrite anyway",
119
+ command: `permdock ${input.invocation} --force`
120
+ }]
121
+ });
122
+ }
123
+ //#endregion
124
+ export { fileSummary as n, refuseDirty as r, applyFiles as t };