permdock 0.5.0 → 0.7.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 (399) hide show
  1. package/README.md +1 -0
  2. package/dist/{2020-C9VN-x8c.js → 2020-CJbO8Bvz.js} +1 -3
  3. package/dist/a2a/index.d.ts +5 -5
  4. package/dist/a2a/index.js +4 -4
  5. package/dist/{adoption-scan-B4R5fnMU.js → adoption-scan-D-feE7BE.js} +1 -1
  6. package/dist/agent/index.d.ts +3 -3
  7. package/dist/agent/index.js +1 -1
  8. package/dist/ai-sdk/index.d.ts +21 -6
  9. package/dist/ai-sdk/index.js +19 -9
  10. package/dist/{approval-prompt-Djo_PyZc.d.ts → approval-prompt-K0faOLFp.d.ts} +2 -2
  11. package/dist/approvals/index.d.ts +4 -4
  12. package/dist/approvals/index.js +4 -4
  13. package/dist/{approvals-DJ6Yd5z1.js → approvals-CMRfsbBh.js} +74 -48
  14. package/dist/{arazzo-B6lebmiQ.js → arazzo-ClrF3PVb.js} +2 -2
  15. package/dist/{arazzo-BWhNF-k0.js → arazzo-rdeJ8n1J.js} +4 -4
  16. package/dist/{args-IIolxxKA.js → args-CC3OwyHW.js} +112 -2
  17. package/dist/astro/index.d.ts +6 -6
  18. package/dist/astro/index.js +2 -2
  19. package/dist/{audience-Dg8XsRaO.js → audience-BrMs8c4o.js} +1 -1
  20. package/dist/{auth-DRLEizbL.js → auth-CscUX8Sy.js} +3 -4
  21. package/dist/authzen/index.d.ts +162 -22
  22. package/dist/authzen/index.js +315 -146
  23. package/dist/{automation-BMZPIVUM.d.ts → automation-DOtAFWdy.d.ts} +3 -3
  24. package/dist/{automation-DVjOckjV.js → automation-ySsxp_Yp.js} +1 -1
  25. package/dist/base-url-BQbddZO5.js +9 -0
  26. package/dist/better-auth/index.d.ts +2 -2
  27. package/dist/better-auth/index.js +2 -2
  28. package/dist/better-supabase/index.d.ts +50 -8
  29. package/dist/better-supabase/index.js +94 -32
  30. package/dist/{bind-CZzhx-Vj.js → bind-D1nO6fiC.js} +5 -5
  31. package/dist/{bind--9EFVYWF.d.ts → bind-JDuvxjuW.d.ts} +7 -7
  32. package/dist/{build-instance-BMnAudHn.js → build-instance-DxE7czo9.js} +1 -1
  33. package/dist/{canonical-json-BC8_nMTw.js → canonical-json-DwilZ1iB.js} +6 -3
  34. package/dist/{capability-BSslw1QV.d.ts → capability-D4UC9TTW.d.ts} +2 -2
  35. package/dist/{capability-N1K9IpqS.js → capability-L7NnfhiE.js} +1 -1
  36. package/dist/{casbin-Cr7RLtA3.js → casbin-BHijLuHY.js} +2 -2
  37. package/dist/{casbin-Dyu2gnUD.js → casbin-BW9pS47J.js} +1 -1
  38. package/dist/{casl-64gpT-8x.js → casl-CmJlgziS.js} +2 -2
  39. package/dist/{casl-DjEDhTCP.js → casl-UbI8v-Wq.js} +1 -1
  40. package/dist/catalog/index.d.ts +70 -10
  41. package/dist/catalog/index.js +112 -6
  42. package/dist/catalog-BCCjSAdH.js +1 -0
  43. package/dist/{catalog-R_A__RsH.js → catalog-BaMQfQ6Y.js} +3 -3
  44. package/dist/{catalog-BECMPrwc.js → catalog-D69WhFii.js} +43 -13
  45. package/dist/{catalog-doc-C9wjsfNY.js → catalog-doc-CV9s6B1S.js} +28 -5
  46. package/dist/{catalog-fingerprint-CCP0-yQS.js → catalog-fingerprint-C144oW4M.js} +1 -1
  47. package/dist/{create-BWRSXgOF.js → challenge-nGWma08S.js} +122 -25
  48. package/dist/chat/index.d.ts +1 -1
  49. package/dist/chat/index.js +2 -2
  50. package/dist/chat-sdk/index.d.ts +3 -3
  51. package/dist/checks-BC_0mPIq.js +37 -0
  52. package/dist/claude-agent/index.d.ts +3 -3
  53. package/dist/claude-agent/index.js +2 -2
  54. package/dist/clerk/index.d.ts +3 -3
  55. package/dist/clerk/index.js +1 -1
  56. package/dist/cli/bin.js +2 -2
  57. package/dist/cli/index.d.ts +3 -3
  58. package/dist/cli/index.js +3 -3
  59. package/dist/cloud/index.d.ts +127 -11
  60. package/dist/cloud/index.js +251 -3
  61. package/dist/{cloud-CIoHNevm.js → cloud-CO8pYtwr.js} +5 -5
  62. package/dist/{codemod-Cxvvc70T.js → codemod-BP6n8N9L.js} +3 -3
  63. package/dist/{codemod-Bmj9dWMH.js → codemod-i4N2BhDc.js} +3 -3
  64. package/dist/{collect-CrZJJnEF.js → collect-BaWeMjwV.js} +17 -8
  65. package/dist/{collect-DloHbDVa.js → collect-DNm3oKOk.js} +6 -5
  66. package/dist/collect-k_Dulxr5.js +1 -0
  67. package/dist/compile/index.d.ts +1 -1
  68. package/dist/compile/index.js +1 -1
  69. package/dist/{compile-CMqMx_IN.js → compile-BAEO5bOk.js} +2 -2
  70. package/dist/{compile-Ckm2HqBZ.d.ts → compile-COM2VKuN.d.ts} +3 -3
  71. package/dist/{completion-BqhRBJD8.js → completion-BNdVf7X2.js} +3 -3
  72. package/dist/{config-bs_kZeYq.js → config-CoQHDrDi.js} +7 -3
  73. package/dist/{config-B46rm9sc.js → config-DGZzMV1B.js} +2 -2
  74. package/dist/{config-report-DUgj62Ai.js → config-report-Cm7UITNA.js} +3 -3
  75. package/dist/connector-schema-_VCSsdtD.js +433 -0
  76. package/dist/{context-bbFHR-0D.js → context--uM9V3Ui.js} +2 -2
  77. package/dist/convex/index.d.ts +5 -5
  78. package/dist/convex/index.js +2 -2
  79. package/dist/core-B5-w6Kw9.js +335 -0
  80. package/dist/core-CQkE8Esr.d.ts +179 -0
  81. package/dist/{create-0VZ7Pdiu.d.ts → create-B2-CQqCI.d.ts} +5 -5
  82. package/dist/{create-C3b4B5eF.js → create-Cb86Z8Im.js} +9 -8
  83. package/dist/{create-DnrmLnLW.js → create-DJrlhEp9.js} +5 -5
  84. package/dist/{create-BFfm17UA.d.ts → create-QHuuPw3q.d.ts} +7 -7
  85. package/dist/{create-BDS7wc3y.d.ts → create-UTnUVETj.d.ts} +30 -10
  86. package/dist/{credential-DM2um3ha.js → credential-CIM7wHwA.js} +4 -4
  87. package/dist/{credentials-DPyHmYz5.js → credentials-BpuTwd7a.js} +1 -1
  88. package/dist/{deciding-columns-Sq12mEA6.js → deciding-columns-DRo2QM6E.js} +13 -2
  89. package/dist/{delegation-DaXVdDhM.js → delegation-C5rOdTp5.js} +5 -5
  90. package/dist/delivery/index.d.ts +5 -5
  91. package/dist/delivery/index.js +4 -3
  92. package/dist/{delivery-DCAgNyCn.js → delivery-rwOKLWRm.js} +51 -2
  93. package/dist/{denied-text-D8jDHgsl.d.ts → denied-text-D4qkEtFz.d.ts} +2 -2
  94. package/dist/{describe-BybMRY7A.js → describe-DZlnEtLy.js} +1 -0
  95. package/dist/{describe-BZUsixiL.d.ts → describe-O0SwYIK8.d.ts} +2 -2
  96. package/dist/{diff-CxZo9pTq.js → diff-Btr1c1Ow.js} +2 -2
  97. package/dist/{diff-DCePiN6M.js → diff-DzT-xD13.js} +10 -10
  98. package/dist/{doctor-DFjUxf2f.js → doctor-BU1szn63.js} +241 -49
  99. package/dist/{doctor-CxiwSfqH.js → doctor-BoK_y0KO.js} +4 -4
  100. package/dist/drizzle/index.d.ts +3 -3
  101. package/dist/drizzle/index.js +1 -1
  102. package/dist/elysia/index.d.ts +5 -5
  103. package/dist/elysia/index.js +3 -3
  104. package/dist/{errors-C2PXIv4c.d.ts → errors-B_Qg9D3e.d.ts} +2 -2
  105. package/dist/{errors-CWTY6uih.js → errors-DpP_U6Bf.js} +1 -0
  106. package/dist/{evaluate-_R8QkWaf.js → evaluate-B_oqFbWC.js} +130 -34
  107. package/dist/{evaluations-16UqqQ6W.d.ts → evaluations-BCddEOfO.d.ts} +4 -4
  108. package/dist/{evaluations-DZ2CbV5k.js → evaluations-DReoiVBw.js} +4 -4
  109. package/dist/eve/index.d.ts +5 -5
  110. package/dist/eve/index.js +3 -3
  111. package/dist/express/index.d.ts +5 -5
  112. package/dist/express/index.js +3 -3
  113. package/dist/fastify/index.d.ts +5 -5
  114. package/dist/fastify/index.js +3 -3
  115. package/dist/{fetch-adapter-qKJBuRqy.d.ts → fetch-adapter-CuhyYwC1.d.ts} +4 -4
  116. package/dist/{fetch-adapter-g0ypLkID.js → fetch-adapter-De-u6vhJ.js} +3 -3
  117. package/dist/{fields-D9tPVUUS.js → fields-ClcQLrVc.js} +48 -13
  118. package/dist/{files-C5ZI27eV.js → files-acUbNwWt.js} +15 -2
  119. package/dist/{fixtures-B7XrLeY7.js → fixtures-BTMW6zgU.js} +2 -2
  120. package/dist/{flags-C3DktBDY.js → flags-aaeRAdiD.js} +2 -2
  121. package/dist/{from-snapshot-D2lZt4Dd.js → from-snapshot-Bz469dIh.js} +17 -10
  122. package/dist/generate-3FNO5P5Q.js +159 -0
  123. package/dist/{grantee-Cn1HyUsI.js → grantee-BrRANrpT.js} +14 -4
  124. package/dist/{grantee-conditions-CcXf8hMM.js → grantee-conditions-C6P1Tvol.js} +1 -1
  125. package/dist/{grantee-match-DHArqY82.js → grantee-match-0RtHWQDx.js} +3 -3
  126. package/dist/h3/index.d.ts +4 -4
  127. package/dist/h3/index.js +3 -3
  128. package/dist/{helpers-DTcZOzhF.js → helpers-DY3vXuGs.js} +3 -3
  129. package/dist/hono/index.d.ts +5 -5
  130. package/dist/hono/index.js +3 -3
  131. package/dist/{hosted-DBDX0M-P.d.ts → hosted-BmjzxQhp.d.ts} +14 -2
  132. package/dist/{hosted-BZIAYvon.js → hosted-XBgU6RGT.js} +34 -12
  133. package/dist/{http-DXJ37RDA.js → http-Ca3Sr5x1.js} +1 -1
  134. package/dist/{import-DMmOG27O.js → import-Bz0GefWg.js} +5 -5
  135. package/dist/{import-CNV7I2Dw.js → import-DB2EG_iy.js} +3 -3
  136. package/dist/{index-CxGUswIC.d.ts → index-BE8y3moU.d.ts} +50 -8
  137. package/dist/{index-Chrs5fQ-.d.ts → index-BSfRl0hZ.d.ts} +6 -6
  138. package/dist/{index-DOVf7RJv.d.ts → index-BTkwrK7v.d.ts} +155 -17
  139. package/dist/index-CMiPH2Tv.d.ts +206 -0
  140. package/dist/{index-SGdIQyzc.d.ts → index-DH9DUDEM.d.ts} +18 -3
  141. package/dist/{index-BcHcPyIo.d.ts → index-DLwcuCN_.d.ts} +86 -7
  142. package/dist/index.d.ts +18 -17
  143. package/dist/index.js +27 -25
  144. package/dist/{init-GG6Jh8HD.js → init-5TXNji88.js} +5 -5
  145. package/dist/{init-DeMYsnYJ.js → init-B-4t1NzC.js} +4 -4
  146. package/dist/{instance-options-Omfd793B.d.ts → instance-options-CU0YQCLH.d.ts} +1 -1
  147. package/dist/{instance-snapshot-Cxq4ygFc.js → instance-snapshot-CjcwnEiV.js} +20 -14
  148. package/dist/jwt/index.d.ts +83 -5
  149. package/dist/jwt/index.js +143 -5
  150. package/dist/{kernel-5JatXyND.js → kernel-DVExUwkp.js} +138 -12
  151. package/dist/kysely/index.d.ts +3 -3
  152. package/dist/kysely/index.js +1 -1
  153. package/dist/load-DrMHXzgN.js +1 -0
  154. package/dist/{load-DFS_ry0W.js → load-DxroEzH1.js} +2 -2
  155. package/dist/{login-Dfe5RlYk.js → login-ClSJh5t5.js} +4 -4
  156. package/dist/{login-imhuwvn3.js → login-WC9HPJpU.js} +6 -10
  157. package/dist/{manifest-C8IzW3Do.js → manifest-B79YuF2T.js} +6 -2
  158. package/dist/{manifest-mx5ghSFM.d.ts → manifest-BVhExYhw.d.ts} +23 -2
  159. package/dist/{manifest-CtKR3GXL.js → manifest-Dv6q4i5s.js} +54 -35
  160. package/dist/{manifest-schema-C0kK_8V0.js → manifest-schema-Cv492Qev.js} +37 -7
  161. package/dist/{map-claims-D3oRmTk0.js → map-claims-etGIS_Dv.js} +14 -11
  162. package/dist/{map-error-TCAdw-eW.js → map-error-BQGyDm_M.js} +1 -1
  163. package/dist/mcp/index.d.ts +64 -10
  164. package/dist/mcp/index.js +151 -22
  165. package/dist/{migrate-BShP7Vf4.js → migrate-Dodel0IJ.js} +77 -24
  166. package/dist/nest/index.d.ts +5 -5
  167. package/dist/nest/index.js +3 -3
  168. package/dist/next/index.d.ts +9 -9
  169. package/dist/next/index.js +5 -5
  170. package/dist/next/plugin.d.ts +1 -1
  171. package/dist/next/plugin.js +2 -2
  172. package/dist/node/index.d.ts +5 -5
  173. package/dist/node/index.js +2 -2
  174. package/dist/openai/index.d.ts +5 -5
  175. package/dist/openai/index.js +3 -3
  176. package/dist/openapi/index.d.ts +14 -4
  177. package/dist/openapi/index.js +1 -1
  178. package/dist/{openapi-ahr8rHu3.js → openapi-DMocl1bh.js} +4 -4
  179. package/dist/{openapi-B7HZ0f-r.js → openapi-Ddb4628T.js} +2 -7
  180. package/dist/{openapi-DTaEmTSW.js → openapi-ztVaux6j.js} +8 -8
  181. package/dist/{operation-findings-DgATDpvh.js → operation-findings-kRcEp8lE.js} +1 -1
  182. package/dist/{operations-CxybZErY.d.ts → operations-BNLes61x.d.ts} +1 -1
  183. package/dist/orpc/index.d.ts +6 -6
  184. package/dist/orpc/index.js +4 -4
  185. package/dist/otel/index.d.ts +3 -3
  186. package/dist/otel/index.js +1 -1
  187. package/dist/{output-Dyw8fyPF.js → output-DgSDLrta.js} +7 -3
  188. package/dist/{output-files-DhRBBE4n.js → output-files-CCMdcFWb.js} +2 -2
  189. package/dist/output-files-DPAY7-GX.js +1 -0
  190. package/dist/{ownership-BatFgAA4.js → ownership-Z2LpxsGa.js} +1349 -883
  191. package/dist/parse-Ddhz2xf4.js +148 -0
  192. package/dist/{parse-local-manifest-CVSs6J9I.js → parse-local-manifest-T1Q8X3A2.js} +24 -1
  193. package/dist/{parse-local-manifest-DgqtruPn.d.ts → parse-local-manifest-e4mdwAKd.d.ts} +1 -1
  194. package/dist/pdp/index.d.ts +3 -3
  195. package/dist/pdp/index.js +7 -3
  196. package/dist/peer-12Q5I_RH.js +976 -0
  197. package/dist/{peer-CRvC7Hg1.js → peer-DOzzMfZL.js} +1 -1
  198. package/dist/{permdock-B9JxkBwC.js → permdock-BfWEeMqk.js} +177 -49
  199. package/dist/{permdock-D7eeLJER.d.ts → permdock-Dco6dyCK.d.ts} +34 -5
  200. package/dist/{permission-registry-Br4jSNVi.js → permission-registry-DpPtSKNZ.js} +1 -1
  201. package/dist/{vocabulary-D6lPdb4Z.d.ts → permission-types-DhNEmoRG.d.ts} +4 -62
  202. package/dist/{permissions-oEWfl-kl.d.ts → permissions-CoqCOfJ3.d.ts} +2 -1
  203. package/dist/{permissions-B-wCP5ZC.js → permissions-CyH2MV_B.js} +1 -1
  204. package/dist/{permissions-CZKiUfFM.js → permissions-DArULThq.js} +4 -4
  205. package/dist/pkce-5h8NgMQJ.js +21 -0
  206. package/dist/{policies-CO1oOymN.js → policies-B2lZIurj.js} +3 -3
  207. package/dist/{policy-Czo4n3Hs.d.ts → policy-B7dg_yzu.d.ts} +2 -2
  208. package/dist/{policy-DLZJ5gAp.js → policy-DaJy4nK4.js} +17 -8
  209. package/dist/{policy-from-catalog-DzhEc3Y9.js → policy-from-catalog-DFWYkNdu.js} +9 -9
  210. package/dist/{policy-types-DzwivBgR.d.ts → policy-types-B-F-qAZk.d.ts} +109 -5
  211. package/dist/postgres-store-BL9M_CA1.js +1001 -0
  212. package/dist/{postgrest-NUqZT-RB.d.ts → postgrest-CYacM_u7.d.ts} +12 -1
  213. package/dist/{postgrest-CW0IqC-U.js → postgrest-r5faDIzD.js} +47 -5
  214. package/dist/{powersync-BHfuehf3.js → powersync-13odBwiM.js} +3 -3
  215. package/dist/powersync-53ryOZip.js +1059 -0
  216. package/dist/powersync-CExtTLyA.js +1 -0
  217. package/dist/preset/index.js +1 -1
  218. package/dist/{preset-DZdU0tne.js → preset-CHTbd-DQ.js} +2 -2
  219. package/dist/prisma/index.d.ts +2 -2
  220. package/dist/prisma/index.js +1 -1
  221. package/dist/{problem-details-DXlt-vks.d.ts → problem-details-Tcfmj3bV.d.ts} +1 -1
  222. package/dist/prompt-DwtVemER.js +935 -0
  223. package/dist/{protected-DEPHc2xV.d.ts → protected-BwZYL1X_.d.ts} +6 -5
  224. package/dist/{protected-DfjY5mLA.js → protected-DXE3cQYg.js} +2 -2
  225. package/dist/{provider-CC-u3bYP.js → provider-BQsTYYy0.js} +2 -2
  226. package/dist/{provider-DMVt6yYn.d.ts → provider-Csk-THAn.d.ts} +1 -1
  227. package/dist/{provider-store-B5Yrkhzr.js → provider-store-IgqQipCO.js} +2 -2
  228. package/dist/{pull-BgIfno6w.js → pull-CN5OLxrF.js} +7 -7
  229. package/dist/pull-Cty6Ovyu.js +1 -0
  230. package/dist/{push-CmFVBOeI.js → push-tVdG8dUL.js} +54 -14
  231. package/dist/{pushed-policy-BImMTTIM.d.ts → pushed-policy-BbcY9r_4.d.ts} +1 -1
  232. package/dist/{pushed-policy-DobP7AHI.js → pushed-policy-CmYeSQqq.js} +1 -1
  233. package/dist/react/index.d.ts +6 -6
  234. package/dist/react/index.js +3 -3
  235. package/dist/react/provider-client.d.ts +1 -1
  236. package/dist/react/provider-client.js +1 -1
  237. package/dist/react-native/index.d.ts +25 -11
  238. package/dist/react-native/index.js +214 -24
  239. package/dist/{refs-K6eWUJ0H.js → refs-CNJBiTFo.js} +15 -1
  240. package/dist/{replay-D7iKcLFe.d.ts → replay-DCDD_ZfL.d.ts} +1 -1
  241. package/dist/{request-context-BTRTG7OT.js → request-context-BykKLmyE.js} +2 -2
  242. package/dist/resend/index.d.ts +4 -4
  243. package/dist/{retire-CALjIQ7e.js → retire-Wj6dkyDE.js} +2 -2
  244. package/dist/{rls-BA8an5Ap.js → rls-Ck_PocSp.js} +32 -8
  245. package/dist/{rls-j6t43t7n.js → rls-CxBZb4rZ.js} +478 -534
  246. package/dist/{role-builder-CXbis5-X.js → role-builder-C1VJzvcr.js} +3 -3
  247. package/dist/rolldown-runtime-C3I60J0A.js +4 -0
  248. package/dist/{rpc-aPyNi6tA.js → rpc-Bk1bE-ch.js} +1 -1
  249. package/dist/run-Bz7DXGEv.js +1 -0
  250. package/dist/{run-ticket-sxFI6LAk.js → run-ticket-B5d_63Ma.js} +22 -1
  251. package/dist/{run-ticket-BjhTOi6u.d.ts → run-ticket-BpNi7BCi.d.ts} +8 -3
  252. package/dist/{run-DOfMtc9V.js → run-uLD2aWuO.js} +7 -7
  253. package/dist/{runtime-D3VTAiCA.js → runtime-Vif3_-zf.js} +1 -1
  254. package/dist/{saas-FO-Q8oj0.js → saas-Az_Kz-4D.js} +7 -7
  255. package/dist/{scan-BOI5tJ-6.js → scan-DSljDE1Y.js} +1 -1
  256. package/dist/{schema-yLuBWWsh.js → schema-gIcCx7zM.js} +1 -1
  257. package/dist/scim/index.d.ts +3 -2
  258. package/dist/scim/index.js +3 -1
  259. package/dist/scim-C7JYhySg.js +44 -0
  260. package/dist/{scim-ClHtpyV3.js → scim-YNieBO1U.js} +3 -537
  261. package/dist/{scopes-CUPSjo9q.js → scopes-BHsc-wp-.js} +1 -1
  262. package/dist/server/index.d.ts +11 -11
  263. package/dist/server/index.js +7 -7
  264. package/dist/{server-DqCT4CgZ.js → server-Bnga6I50.js} +3 -3
  265. package/dist/{server-types-BLd4MnBX.d.ts → server-types-C4gZUEZy.d.ts} +9 -9
  266. package/dist/{shared-DvvFzYXe.js → shared-C8LjUdVU.js} +1 -1
  267. package/dist/{shared-CD11nBbC.js → shared-fMKOv8hP.js} +46 -39
  268. package/dist/{sink-Bj_lDUDq.d.ts → sink-Cp_Eot9W.d.ts} +4 -4
  269. package/dist/{skills-B6lVdD_W.js → skills-Dcjw9_1C.js} +5 -5
  270. package/dist/{skills-CTYwkl44.js → skills-g_3BS9NC.js} +3 -3
  271. package/dist/{snapshot-CXUWfsNy.js → snapshot-CbGmYiJx.js} +4 -4
  272. package/dist/{snapshot-cache-DZHQ0KF6.js → snapshot-cache-DT2Kx1F8.js} +1 -1
  273. package/dist/{snapshot-cache-DqK9eDmM.d.ts → snapshot-cache-Pahd3IYJ.d.ts} +1 -1
  274. package/dist/solid/index.d.ts +6 -5
  275. package/dist/solid/index.js +4 -4
  276. package/dist/solid-start/index.d.ts +6 -6
  277. package/dist/solid-start/index.js +3 -3
  278. package/dist/{sources-vs5dGOsS.js → sources-B-zYB4GS.js} +111 -25
  279. package/dist/{sources-BV9j0DeZ.d.ts → sources-DEEuGb8S.d.ts} +63 -14
  280. package/dist/sources-qoIJQrJv.js +11 -0
  281. package/dist/{sql-B5T1IL83.js → sql-B96movIM.js} +5 -1
  282. package/dist/sql-CDEPCA0g.d.ts +10 -0
  283. package/dist/{src-DLfUWFAI.js → src-DLFrtrrC.js} +154 -53
  284. package/dist/ssf/index.d.ts +4 -4
  285. package/dist/ssf/index.js +640 -211
  286. package/dist/{standard-webhooks-6lg8v_is.d.ts → standard-webhooks-B_qRg0ws.d.ts} +2 -2
  287. package/dist/{store-4u_hxjWa.js → store-DSP9oGvh.js} +15 -7
  288. package/dist/{store-options-BqEakYRa.js → store-options-B_poyYvg.js} +6 -6
  289. package/dist/{stores-ClZUgeoP.d.ts → stores-BAZwSYZA.d.ts} +6 -5
  290. package/dist/{stores-BbsD4fAR.js → stores-BqEuHC05.js} +2 -2
  291. package/dist/{stream-7-xmnf3U.d.ts → stream-2Vwhl7Er.d.ts} +2 -2
  292. package/dist/{style-Uao76wO7.js → style-Cqo7-73x.js} +1 -0
  293. package/dist/{style-DiKWnAvn.js → style-Ds1gNm77.js} +1 -1
  294. package/dist/supabase/index.d.ts +8 -7
  295. package/dist/supabase/index.js +5 -5
  296. package/dist/supabase/middleware.d.ts +6 -6
  297. package/dist/supabase/middleware.js +6 -6
  298. package/dist/{supabase-Dxlp8A94.js → supabase--0aJdLEd.js} +9 -7
  299. package/dist/{supabase-9pqI57pW.js → supabase-Bqp7iIY2.js} +3 -3
  300. package/dist/supabase-hook-DJxC4PoP.js +1 -0
  301. package/dist/{supabase-hook-DdDQhMlw.js → supabase-hook-Dg0SrQWR.js} +1069 -123
  302. package/dist/supautils-MESd81bF.js +689 -0
  303. package/dist/{support-session-C6xJQYut.js → support-session-Cna49-3f.js} +2 -2
  304. package/dist/svelte/index.d.ts +5 -5
  305. package/dist/svelte/index.js +5 -5
  306. package/dist/svelte/runtime.d.ts +3 -3
  307. package/dist/svelte/runtime.js +3 -3
  308. package/dist/svelte/source.d.ts +5 -5
  309. package/dist/svelte/source.js +2 -2
  310. package/dist/sveltekit/index.d.ts +6 -6
  311. package/dist/sveltekit/index.js +2 -2
  312. package/dist/tanstack-start/index.d.ts +6 -6
  313. package/dist/tanstack-start/index.js +2 -2
  314. package/dist/{tenancy-DN2QAx9z.js → tenancy-CmeBQ6Nv.js} +12 -3
  315. package/dist/terminal/index.d.ts +6 -6
  316. package/dist/terminal/index.js +3 -3
  317. package/dist/testing/core.d.ts +2 -0
  318. package/dist/testing/core.js +1 -0
  319. package/dist/testing/fixtures/index.d.ts +12 -0
  320. package/dist/testing/fixtures/index.js +770 -0
  321. package/dist/testing/index.d.ts +41 -174
  322. package/dist/testing/index.js +241 -731
  323. package/dist/testing/saas/index.d.ts +5 -5
  324. package/dist/testing/saas/index.js +2 -2
  325. package/dist/testing/saas/permissions.d.ts +1 -1
  326. package/dist/testing/saas/permissions.js +1 -1
  327. package/dist/text-diff-DhITNCnD.js +444 -0
  328. package/dist/{token-BLZcjQgt.js → token-2qYDvXz2.js} +1 -1
  329. package/dist/{tool-refusal-CMLN5xhn.js → tool-refusal-reAhIzdl.js} +1 -1
  330. package/dist/trpc/index.d.ts +6 -6
  331. package/dist/trpc/index.js +3 -3
  332. package/dist/{types-5Ut_pbKy.d.ts → types-BWZybqs9.d.ts} +112 -8
  333. package/dist/{types-CZTnPFzM.d.ts → types-BXMYB7BY.d.ts} +2 -2
  334. package/dist/{types-CdlxsYQh.d.ts → types-BfVmNJO5.d.ts} +14 -3
  335. package/dist/{types-BqAKcRNW.d.ts → types-CIeZcG8v.d.ts} +2 -2
  336. package/dist/{types-BNORmDM8.d.ts → types-CKV71kKh.d.ts} +4 -4
  337. package/dist/{types-tIgIeIKJ.d.ts → types-CQVEQawv.d.ts} +4 -4
  338. package/dist/{types-BjV-fqcA.d.ts → types-CeIscIKp.d.ts} +4 -4
  339. package/dist/{types-_sHy8BQf.d.ts → types-CfiKC5aN.d.ts} +1 -1
  340. package/dist/{types-ClZaWzfb.d.ts → types-D3A19w4A.d.ts} +8 -4
  341. package/dist/{types-C8-KNsFf.d.ts → types-DBHftjgS.d.ts} +15 -8
  342. package/dist/{types-CCpc2Dcv.d.ts → types-DC44-hqb.d.ts} +2 -2
  343. package/dist/{types-fbZ7JEXr.d.ts → types-DXmwu78Z.d.ts} +4 -4
  344. package/dist/{types-DiQjupG2.d.ts → types-cTos-H7p.d.ts} +2 -2
  345. package/dist/{types-DX0LaKTb.d.ts → types-g7Oy6Zg4.d.ts} +3 -3
  346. package/dist/unplugin/index.d.ts +1 -1
  347. package/dist/unplugin/index.js +2 -2
  348. package/dist/{usage-T5mXq98v.js → usage-Bybmck7f.js} +7 -7
  349. package/dist/{usage-DHtE8j4E.js → usage-CDaLXCfL.js} +2 -2
  350. package/dist/usage-y-kBNdqs.js +1 -0
  351. package/dist/{validation-error-Bg5Tpluk.d.ts → validation-error-CQpoquwj.d.ts} +1 -1
  352. package/dist/{verify-DbCL9bnB.js → verify-pe8rL_Qw.js} +350 -83
  353. package/dist/{views-DTIIO-oQ.js → views-BB8E9dTP.js} +1 -1
  354. package/dist/vocabulary-Bg3eeT2H.d.ts +67 -0
  355. package/dist/vue/index.d.ts +6 -5
  356. package/dist/vue/index.js +4 -4
  357. package/dist/{waiter-CKy4MQSY.d.ts → waiter-DwEyouan.d.ts} +2 -2
  358. package/dist/watch-Bd9mx3rd.js +1 -0
  359. package/dist/{watch-CszoTJMq.js → watch-C-4VmFlL.js} +3 -3
  360. package/dist/webmcp/index.d.ts +2 -2
  361. package/dist/webmcp/index.js +2 -2
  362. package/dist/{where-scope-Dv-WTP-w.js → where-scope-wq2coopv.js} +41 -21
  363. package/dist/{who-can-D0QoYbEb.js → who-can-BwNsI_Js.js} +6 -6
  364. package/dist/workflow/index.d.ts +3 -3
  365. package/dist/workflow/index.js +5 -5
  366. package/dist/workflow-sdk/index.d.ts +5 -5
  367. package/dist/{wrap-Bd1Tejur.d.ts → wrap-B6R0cMRL.d.ts} +2 -2
  368. package/dist/{wrap-gX61EtpB.js → wrap-CiSc_KCq.js} +8 -2
  369. package/package.json +22 -11
  370. package/schemas/cli-result-v1.json +1 -0
  371. package/schemas/cloud-api-v1.json +152 -7
  372. package/schemas/connector-v1.json +8 -0
  373. package/schemas/supabase-claims-v1.json +5 -0
  374. package/schemas/supabase-manifest-v1.json +276 -75
  375. package/skills/permdock/SKILL.md +1 -0
  376. package/skills/permdock-agents/references/runtimes.md +3 -1
  377. package/skills/permdock-approvals/references/stores-and-resume.md +2 -1
  378. package/skills/permdock-data/references/queries-and-rls.md +5 -2
  379. package/skills/permdock-tenancy/SKILL.md +1 -1
  380. package/skills/permdock-tenancy/references/ownership-and-custom-roles.md +2 -0
  381. package/skills/permdock-wire/references/adapters.md +14 -0
  382. package/skills/permdock-wire/references/policy-options.md +1 -0
  383. package/dist/catalog-DjhMYYCq.js +0 -1
  384. package/dist/collect-FlXJlhus.js +0 -1
  385. package/dist/index-D8EovfsP.d.ts +0 -91
  386. package/dist/load-BxEtwlBS.js +0 -1
  387. package/dist/output-files-B3IZJksC.js +0 -1
  388. package/dist/parse-Cxq0WxrA.js +0 -53
  389. package/dist/peer-C8swJ2GH.js +0 -50
  390. package/dist/powersync-CbzkqL_M.js +0 -1
  391. package/dist/powersync-bYUDLOAO.js +0 -538
  392. package/dist/prompt-DfZLJLIn.js +0 -32
  393. package/dist/pull-ByOks_Tg.js +0 -1
  394. package/dist/run-CNsApDpd.js +0 -1
  395. package/dist/supabase-hook-CXcGpHqq.js +0 -1
  396. package/dist/supautils-B6HYL9eL.js +0 -91
  397. package/dist/text-diff-BQcUapOb.js +0 -15
  398. package/dist/usage-CHOtwL19.js +0 -1
  399. package/dist/watch-Cb-NcaUw.js +0 -1
@@ -1,29 +1,29 @@
1
1
  import { a as sole, n as isReadonlyArray, t as compact } from "./compact-CAf557ZB.js";
2
2
  import { n as freezeDeep } from "./freeze-CrU8nQeX.js";
3
3
  import { n as isForbiddenKey } from "./paths-DXSHAMIa.js";
4
- import { n as role, t as normalizeAssurance } from "./role-builder-CXbis5-X.js";
4
+ import { n as role, t as normalizeAssurance } from "./role-builder-C1VJzvcr.js";
5
5
  import { n as PermDockValidationError } from "./validation-error-ZfUHbKvf.js";
6
6
  import { t as wireDenials } from "./wire-denial-C7PaVYEM.js";
7
7
  import { o as sameId } from "./expiry-D4_YKRKD.js";
8
8
  import { n as internalsOf } from "./internals-Dk8A8fX3.js";
9
- import { a as getResource, c as listPermissions, h as formerKeys, m as annotationsFor, n as findPermission } from "./permission-registry-Br4jSNVi.js";
9
+ import { a as getResource, c as listPermissions, h as formerKeys, m as annotationsFor, n as findPermission } from "./permission-registry-DpPtSKNZ.js";
10
10
  import { n as isThenable, t as ignoreRejection } from "./thenable-yD7SabqG.js";
11
11
  import { i as readAppData } from "./app-data-MuyzVqX8.js";
12
12
  import { a as durationOf, d as isoNow, o as epochSeconds, r as assertDuration, s as instantAt, t as INVALID_NOW } from "./time-DkWjdL98.js";
13
- import { t as canonicalJson } from "./canonical-json-BC8_nMTw.js";
14
- import { a as normalizeMemberships, d as scopeList, f as subjectForPermission, i as keepsPermission, m as tenantOf, o as resolveScope, s as rootMembershipId } from "./scopes-CUPSjo9q.js";
15
- import { a as readOnlyActorRefuses, c as rowIdOf, i as delegatedPermissions, l as rowValues, n as coveredByDelegation, o as requiresStandIn, r as coversRequirements, s as isRowPair, u as evaluateCondition } from "./delegation-DaXVdDhM.js";
16
- import { a as authenticated, g as isRole, i as assurance, m as findRole, o as flattenGrantee, r as asGrantee } from "./grantee-Cn1HyUsI.js";
13
+ import { t as canonicalJson } from "./canonical-json-DwilZ1iB.js";
14
+ import { c as rootMembershipId, f as scopeList, h as tenantOf, i as keepsPermission, o as normalizeMemberships, p as subjectForPermission, s as resolveScope } from "./scopes-BHsc-wp-.js";
15
+ import { a as readOnlyActorRefuses, c as rowIdOf, i as delegatedPermissions, l as rowValues, n as coveredByDelegation, o as requiresStandIn, r as coversRequirements, s as isRowPair, u as evaluateCondition } from "./delegation-C5rOdTp5.js";
16
+ import { a as authenticated, g as isRole, i as assurance, m as findRole, o as flattenGrantee, r as asGrantee } from "./grantee-BrRANrpT.js";
17
17
  import { a as grantCoversField, i as wireValidity, t as isActive } from "./validity-CZ7-y0Cj.js";
18
- import { o as resourceRoleCondition } from "./grantee-conditions-CcXf8hMM.js";
19
- import { c as nowSeconds, i as matchScopedMembership, l as partitionsOf, n as inTeam, p as scopeField, r as isMembershipExpired } from "./tenancy-DN2QAx9z.js";
20
- import { a as levelCondition, r as grantList, t as declaredRoleNames } from "./policy-DLZJ5gAp.js";
18
+ import { o as resourceRoleCondition } from "./grantee-conditions-C6P1Tvol.js";
19
+ import { c as nowSeconds, i as matchScopedMembership, l as partitionsOf, n as inTeam, p as scopeField, r as isMembershipExpired } from "./tenancy-CmeBQ6Nv.js";
20
+ import { o as levelCondition, r as grantList, t as declaredRoleNames } from "./policy-DaJy4nK4.js";
21
21
  import { t as requiresApproval } from "./approval-required-TzNB9oQA.js";
22
- import { i as versionOf, r as tokenPayload, t as decisionToken } from "./token-BLZcjQgt.js";
22
+ import { i as versionOf, r as tokenPayload, t as decisionToken } from "./token-2qYDvXz2.js";
23
23
  import { n as resolveRelated } from "./relation-walk-3OyDBF0S.js";
24
24
  import { t as eventInstant } from "./event-time-CsegxXxB.js";
25
25
  import { n as toWireDelegation } from "./wire-delegation-Cv3W2eaM.js";
26
- import { n as matchGrantee, t as combineWhere } from "./grantee-match-DHArqY82.js";
26
+ import { n as matchGrantee, t as combineWhere } from "./grantee-match-0RtHWQDx.js";
27
27
  import { t as resourceIdOf } from "./resource-ref-CaS9yVPi.js";
28
28
  //#region src/core/approval-state.ts
29
29
  /** The denial detail when an `ApprovalPolicySource` threw or returned an invalid entry. */
@@ -715,7 +715,7 @@ function leveled(grant, level, condition) {
715
715
  * the policy does not declare it; such a role resolves to nothing.
716
716
  */
717
717
  function customRoleScope(role, scopes) {
718
- if (role.scope === "global") return "global";
718
+ if (role.scope === "global") return role.shared === true ? void 0 : "global";
719
719
  if (role.scope !== void 0) return resolveScope(scopes, role.scope);
720
720
  return resolveScope(scopes, role.team === void 0 ? "tenant" : "team");
721
721
  }
@@ -727,6 +727,10 @@ function customRoleId(role) {
727
727
  function isGlobalCustomRole(role) {
728
728
  return role.scope === "global";
729
729
  }
730
+ /** A shared custom role: defined once for every tenant, held on memberships of its scope in any tenant. */
731
+ function isSharedCustomRole(role) {
732
+ return role.shared === true;
733
+ }
730
734
  function isCeilingScope(scope) {
731
735
  return typeof scope === "string";
732
736
  }
@@ -929,7 +933,16 @@ function resolveCustomRole(policy, role) {
929
933
  renamed
930
934
  });
931
935
  }
932
- function validateCustomRole(policy, role) {
936
+ function validateCustomRole(policy, role, options = {}) {
937
+ if (!isSharedCustomRole(role) && !isGlobalCustomRole(role) && (options.shared ?? []).some((item) => wellFormed(item) && isSharedCustomRole(item) && item.name === role.name)) return freezeDeep({
938
+ ok: false,
939
+ permissions: [],
940
+ dropped: [{
941
+ role: role.name,
942
+ reason: "name-taken"
943
+ }],
944
+ renamed: []
945
+ });
933
946
  const resolved = resolveCustomRole(policy, role);
934
947
  const permissions = [...new Set(resolved.grants.filter((grant) => grant.effect === "allow").map((grant) => grant.permission.key))].toSorted();
935
948
  return freezeDeep({
@@ -939,17 +952,70 @@ function validateCustomRole(policy, role) {
939
952
  renamed: resolved.renamed
940
953
  });
941
954
  }
955
+ /**
956
+ * Checks one stored allow entry, `<permission>[@<level>]`, the way
957
+ * `permdock_custom_role_entry_problem` does in SQL. `scope` defaults to the
958
+ * first scope; its ceiling is the allows of that scope's assignable roles.
959
+ */
960
+ function parseCustomRoleEntry(policy, entry, options = {}) {
961
+ const at = entry.indexOf("@");
962
+ const raw = at === -1 ? entry : entry.slice(0, at);
963
+ const level = at === -1 ? void 0 : entry.slice(at + 1);
964
+ const checked = validateCustomRole(policy, {
965
+ name: "entry",
966
+ tenant: "entry",
967
+ ...options.scope === void 0 ? {} : { scope: options.scope },
968
+ grants: [{
969
+ permission: raw,
970
+ ...level === void 0 ? {} : { level }
971
+ }]
972
+ });
973
+ const dropped = checked.dropped[0];
974
+ if (dropped !== void 0) return {
975
+ ok: false,
976
+ cause: dropped.reason === "unknown-level" || dropped.reason === "outside-ceiling" ? dropped.reason : "unknown-permission"
977
+ };
978
+ return {
979
+ ok: true,
980
+ permission: checked.renamed[0]?.to ?? raw,
981
+ ...level === void 0 ? {} : { level }
982
+ };
983
+ }
942
984
  function wellFormed(role) {
943
985
  if (role === null || typeof role !== "object" || typeof role.name !== "string") return false;
986
+ if (role.shared !== void 0) return role.shared === true && role.tenant === void 0 && role.team === void 0 && role.id === void 0 && (role.scope === void 0 || typeof role.scope === "string" && role.scope !== "global");
944
987
  if (role.scope === "global") return role.tenant === void 0 && role.team === void 0 && role.id === void 0;
945
988
  return typeof role.tenant === "string" && (role.team === void 0 || typeof role.team === "string") && (role.scope === void 0 || typeof role.scope === "string") && (role.id === void 0 || typeof role.id === "string");
946
989
  }
990
+ /**
991
+ * The well-formed roles, without a tenant role that a shared role of the same
992
+ * name shadows: the shared role is the one every tenant sees.
993
+ */
994
+ function effectiveCustomRoles(roles) {
995
+ const formed = roles.filter(wellFormed);
996
+ const shared = new Set(formed.filter(isSharedCustomRole).map((role) => role.name));
997
+ return shared.size === 0 ? formed : formed.filter((role) => isSharedCustomRole(role) || isGlobalCustomRole(role) || !shared.has(role.name));
998
+ }
999
+ /** The grants of `roles` that name a level their resource does not declare. */
1000
+ function unknownLevelsFor(policy, roles) {
1001
+ const declared = declaredRoleNames(policy);
1002
+ const out = [];
1003
+ for (const role of effectiveCustomRoles(roles)) {
1004
+ if (declared.has(role.name)) continue;
1005
+ for (const entry of resolveCustomRole(policy, role).dropped) if ("permission" in entry && entry.reason === "unknown-level") out.push({
1006
+ role: role.name,
1007
+ permission: entry.permission,
1008
+ level: entry.level ?? ""
1009
+ });
1010
+ }
1011
+ return out;
1012
+ }
947
1013
  /** Every custom role's resolved grants, once per instance. Malformed roles resolve to nothing. */
948
1014
  function customGrantsFor(policy, roles) {
949
1015
  const declared = declaredRoleNames(policy);
950
1016
  const out = [];
951
- for (const role of roles) {
952
- if (!wellFormed(role) || declared.has(role.name)) continue;
1017
+ for (const role of effectiveCustomRoles(roles)) {
1018
+ if (declared.has(role.name)) continue;
953
1019
  for (const grant of resolveCustomRole(policy, role).grants) out.push({
954
1020
  grant,
955
1021
  role
@@ -957,25 +1023,37 @@ function customGrantsFor(policy, roles) {
957
1023
  }
958
1024
  return out;
959
1025
  }
960
- /** The well-formed tenant (not platform) custom roles; a declared role name is never one. */
1026
+ /**
1027
+ * The well-formed custom roles held on memberships: tenant and shared, not
1028
+ * platform. A declared role name is never one, and a shared role shadows a
1029
+ * tenant role of the same name.
1030
+ */
961
1031
  function tenantCustomRoles(policy, roles) {
962
1032
  const declared = declaredRoleNames(policy);
963
- return roles.filter((role) => wellFormed(role) && !isGlobalCustomRole(role) && !declared.has(role.name));
1033
+ return effectiveCustomRoles(roles).filter((role) => !isGlobalCustomRole(role) && !declared.has(role.name));
964
1034
  }
965
- /** A membership at the role's scope, inside its tenant (and instance, when pinned), naming it. */
1035
+ /** Whether a custom role held on memberships belongs to `tenant`: its own, or shared by every tenant. */
1036
+ function customRoleOf(role, tenant) {
1037
+ return isSharedCustomRole(role) || sameId(role.tenant, tenant);
1038
+ }
1039
+ /**
1040
+ * A membership at the role's scope, inside its tenant (and instance, when
1041
+ * pinned), naming it. A shared role is held at its scope in any tenant.
1042
+ */
966
1043
  function holdsCustomRole(membership, role, scopes) {
967
- if (isGlobalCustomRole(role)) return false;
1044
+ if (isGlobalCustomRole(role) || !wellFormed(role)) return false;
968
1045
  const scope = customRoleScope(role, scopes);
969
1046
  const id = customRoleId(role);
970
- return scope !== void 0 && membership.scope === scope && sameId(tenantOf(membership, scopes), role.tenant) && (id === void 0 || sameId(membership.id, id)) && membership.roles.includes(role.name);
1047
+ const tenant = tenantOf(membership, scopes);
1048
+ return scope !== void 0 && membership.scope === scope && (isSharedCustomRole(role) ? tenant !== void 0 : sameId(tenant, role.tenant)) && (id === void 0 || sameId(membership.id, id)) && membership.roles.includes(role.name);
971
1049
  }
972
1050
  /** Whether `principal.roles` names the platform custom role. */
973
1051
  function holdsGlobalCustomRole(roles, role) {
974
1052
  return isGlobalCustomRole(role) && (roles ?? []).includes(role.name);
975
1053
  }
976
- /** A tenant's custom role inside that tenant, or a platform custom role anywhere. */
1054
+ /** A tenant's custom role inside that tenant, a shared role in any tenant, or a platform custom role anywhere. */
977
1055
  function isCustomRoleName(name, roles, tenant) {
978
- return roles.some((item) => wellFormed(item) && item.name === name && (isGlobalCustomRole(item) || tenant !== void 0 && sameId(item.tenant, tenant)));
1056
+ return effectiveCustomRoles(roles).some((item) => item.name === name && (isGlobalCustomRole(item) || tenant !== void 0 && customRoleOf(item, tenant)));
979
1057
  }
980
1058
  /**
981
1059
  * The compact JWT form of custom roles for the `memberships[].grants` claim
@@ -1010,8 +1088,9 @@ function customRoleClaim(roles, policy) {
1010
1088
  */
1011
1089
  function membershipsClaim(memberships, customRoles, scopes) {
1012
1090
  const claim = [];
1091
+ const effective = effectiveCustomRoles(customRoles);
1013
1092
  for (const membership of normalizeMemberships(memberships, scopes)) {
1014
- const held = customRoles.filter((role) => wellFormed(role) && holdsCustomRole(membership, role, scopes));
1093
+ const held = effective.filter((role) => holdsCustomRole(membership, role, scopes));
1015
1094
  claim.push(held.length === 0 ? membership : Object.assign({}, membership, { grants: customRoleClaim(held) }));
1016
1095
  }
1017
1096
  return claim;
@@ -1030,6 +1109,12 @@ function isGlobalRole(value) {
1030
1109
  function onlyGlobal(roles) {
1031
1110
  return Array.isArray(roles) ? roles.filter(isGlobalRole) : [];
1032
1111
  }
1112
+ function isSharedRole(value) {
1113
+ return value !== null && typeof value === "object" && Reflect.get(value, "shared") === true;
1114
+ }
1115
+ function onlyShared(roles) {
1116
+ return Array.isArray(roles) ? roles.filter(isSharedRole) : [];
1117
+ }
1033
1118
  /** The `customRoles` option as a source: a factory is called with the resolved subject, and a throw reads none. */
1034
1119
  function roleSourceFor(option, subject, auth) {
1035
1120
  if (typeof option !== "function") return option;
@@ -1056,16 +1141,27 @@ function customRolesFor(source, tenants, auth, globalHeld, heldIn) {
1056
1141
  });
1057
1142
  loaded.push([]);
1058
1143
  }
1059
- if (globalHeld !== void 0 && source.globalRoles !== void 0) try {
1060
- const roles = source.globalRoles({ held: globalHeld });
1061
- loaded.push(isThenable(roles) ? roles.then(onlyGlobal) : onlyGlobal(roles));
1062
- } catch {
1063
- auth.push({
1064
- reason: "source-threw",
1065
- source: "customRoles",
1066
- ...sourceName(source)
1067
- });
1068
- loaded.push([]);
1144
+ const once = (read, keep) => {
1145
+ try {
1146
+ const roles = read();
1147
+ loaded.push(isThenable(roles) ? roles.then(keep) : keep(roles));
1148
+ } catch {
1149
+ auth.push({
1150
+ reason: "source-threw",
1151
+ source: "customRoles",
1152
+ ...sourceName(source)
1153
+ });
1154
+ loaded.push([]);
1155
+ }
1156
+ };
1157
+ if (globalHeld !== void 0 && source.globalRoles !== void 0) {
1158
+ const read = source.globalRoles.bind(source);
1159
+ once(() => read({ held: globalHeld }), onlyGlobal);
1160
+ }
1161
+ if (tenants.length > 0 && source.sharedRoles !== void 0) {
1162
+ const read = source.sharedRoles.bind(source);
1163
+ const held = [...new Set(tenants.flatMap((tenant) => heldIn(tenant)))];
1164
+ once(() => read({ held }), onlyShared);
1069
1165
  }
1070
1166
  if (loaded.some((item) => isThenable(item))) return Promise.all(loaded.map((item) => Promise.resolve(item).catch(() => {
1071
1167
  auth.push({
@@ -1729,4 +1825,4 @@ function evaluate(policy, given, permission, data, options, env) {
1729
1825
  return allowedDecision(state, chosen.allow, chosen.approval, chosen.quota);
1730
1826
  }
1731
1827
  //#endregion
1732
- export { isContact as A, emptyListeners as C, supportAccess as D, breakGlass as E, contactMayUse as O, emitSafe as S, activate as T, membershipsClaim as _, expandRoleNames as a, tenantCustomRoles as b, andWhere as c, customRoleClaim as d, customRoleId as f, leveled as g, holdsGlobalCustomRole as h, customRolesFor as i, APPROVAL_POLICY_UNAVAILABLE as j, contactMemberships as k, ceilingGrants as l, holdsCustomRole as m, requirementCondition as n, roleSourceFor as o, customRoleScope as p, assignableNamesFor as r, sourceName as s, evaluate as t, customGrantsFor as u, resolveCustomRole as v, finish as w, validateCustomRole as x, roleAllowKeys as y };
1828
+ export { breakGlass as A, tenantCustomRoles as C, emptyListeners as D, emitSafe as E, APPROVAL_POLICY_UNAVAILABLE as F, contactMayUse as M, contactMemberships as N, finish as O, isContact as P, roleAllowKeys as S, validateCustomRole as T, isSharedCustomRole as _, expandRoleNames as a, parseCustomRoleEntry as b, andWhere as c, customRoleClaim as d, customRoleId as f, holdsGlobalCustomRole as g, holdsCustomRole as h, customRolesFor as i, supportAccess as j, activate as k, ceilingGrants as l, customRoleScope as m, requirementCondition as n, roleSourceFor as o, customRoleOf as p, assignableNamesFor as r, sourceName as s, evaluate as t, customGrantsFor as u, leveled as v, unknownLevelsFor as w, resolveCustomRole as x, membershipsClaim as y };
@@ -1,6 +1,6 @@
1
- import { T as Policy } from "./policy-types-DzwivBgR.js";
2
- import { r as PermDock } from "./permdock-D7eeLJER.js";
3
- import { m as ApprovalStore } from "./types-CCpc2Dcv.js";
1
+ import { T as Policy } from "./policy-types-B-F-qAZk.js";
2
+ import { a as PermDock } from "./permdock-Dco6dyCK.js";
3
+ import { m as ApprovalStore } from "./types-DC44-hqb.js";
4
4
  //#region src/server/evaluations.d.ts
5
5
  /** AuthZEN 1.0 section 7.1.2.1 `options.evaluations_semantic` values. */
6
6
  declare const EVALUATIONS_SEMANTICS: readonly ["execute_all", "deny_on_first_deny", "permit_on_first_permit"];
@@ -13,7 +13,7 @@ declare function evaluationsSemantic(body: Readonly<Record<string, unknown>>): E
13
13
  */
14
14
  declare function evaluateBatch<T extends {
15
15
  readonly decision: boolean;
16
- }>(items: readonly unknown[], semantic: EvaluationsSemantic, rowOf: (item: unknown) => Promise<T>): Promise<T[]>;
16
+ }, I = unknown>(items: readonly I[], semantic: EvaluationsSemantic, rowOf: (item: I) => Promise<T>): Promise<T[]>;
17
17
  declare function evaluationsHandler(options: {
18
18
  readonly policy: Policy;
19
19
  readonly resolve?: (request: Request) => Promise<PermDock>;
@@ -1,12 +1,12 @@
1
1
  import { r as isRecord, t as compact } from "./compact-CAf557ZB.js";
2
2
  import { t as PROBLEM_BASE } from "./validation-error-ZfUHbKvf.js";
3
3
  import { t as wireDenials } from "./wire-denial-C7PaVYEM.js";
4
- import { c as listPermissions, g as formerScopes, h as formerKeys } from "./permission-registry-Br4jSNVi.js";
4
+ import { c as listPermissions, g as formerScopes, h as formerKeys } from "./permission-registry-DpPtSKNZ.js";
5
5
  import { h as secondsAt } from "./time-DkWjdL98.js";
6
6
  import { n as resourceRef } from "./resource-ref-CaS9yVPi.js";
7
7
  import { n as readBodyText } from "./body-text-QcXok_SI.js";
8
8
  import { c as problemResponse, d as validationProblem, n as batchTooLarge } from "./problem-CTviyH5L.js";
9
- import { i as readApprovalHeader, s as resumeDecision } from "./helpers-DTcZOzhF.js";
9
+ import { i as readApprovalHeader, s as resumeDecision } from "./helpers-DY3vXuGs.js";
10
10
  import { t as bodyTooLarge } from "./body-CH5of8Ne.js";
11
11
  import { t as timeoutSignal } from "./timeout-D51niuQP.js";
12
12
  //#region src/core/decision.ts
@@ -420,7 +420,7 @@ function unknownSemanticProblem() {
420
420
  * order, stopping after the first deny or permit.
421
421
  */
422
422
  async function evaluateBatch(items, semantic, rowOf) {
423
- if (semantic === "execute_all") return Promise.all(items.map(rowOf));
423
+ if (semantic === "execute_all") return Promise.all(items.map((item) => rowOf(item)));
424
424
  const stopOn = semantic === "permit_on_first_permit";
425
425
  const rows = [];
426
426
  for (const item of items) {
@@ -607,4 +607,4 @@ function evaluationsHandler(options) {
607
607
  };
608
608
  }
609
609
  //#endregion
610
- export { wireResourceId as _, evaluationReasons as a, unknownSemanticProblem as c, discoverViaSignatureAgent as d, invalidSignatureProblem as f, permissionLookup as g, itemResourceData as h, evaluateBatch as i, withRequestId as l, webBotAuthVerifier as m, applyApprovalResume as n, evaluationsHandler as o, invalidSignatureResponse as p, authzenMetadata as r, evaluationsSemantic as s, EVALUATIONS_SEMANTICS as t, InvalidSignatureError as u, NO_GRANT as v };
610
+ export { NO_GRANT as _, evaluationReasons as a, withRequestId as c, invalidSignatureProblem as d, invalidSignatureResponse as f, wireResourceId as g, permissionLookup as h, evaluateBatch as i, InvalidSignatureError as l, itemResourceData as m, applyApprovalResume as n, evaluationsHandler as o, webBotAuthVerifier as p, authzenMetadata as r, evaluationsSemantic as s, EVALUATIONS_SEMANTICS as t, discoverViaSignatureAgent as u };
@@ -1,8 +1,8 @@
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 { u as ApprovalRequest } from "../types-CCpc2Dcv.js";
5
- import { o as AgentAdapterOptions, t as AgentPermDock } from "../create-BDS7wc3y.js";
1
+ import { T as Policy, j as PolicyVocabulary, sr as Principal } from "../policy-types-B-F-qAZk.js";
2
+ import { u as Permission } from "../permission-types-DhNEmoRG.js";
3
+ import { a as PermDock } from "../permdock-Dco6dyCK.js";
4
+ import { u as ApprovalRequest } from "../types-DC44-hqb.js";
5
+ import { o as AgentAdapterOptions, t as AgentPermDock } from "../create-UTnUVETj.js";
6
6
  //#region src/eve/create.d.ts
7
7
  /** Structural `SessionAuthContext` from `eve`. */
8
8
  type EvePrincipal = {
package/dist/eve/index.js CHANGED
@@ -1,8 +1,8 @@
1
1
  import { t as compact } from "../compact-CAf557ZB.js";
2
- import { c as withApp } from "../permdock-B9JxkBwC.js";
2
+ import { l as withApp } from "../permdock-BfWEeMqk.js";
3
3
  import { c as isApprovalError } from "../types-DqzsnlSA.js";
4
- import { o as resolveApproval } from "../helpers-DTcZOzhF.js";
5
- import { t as agentRuntime } from "../create-C3b4B5eF.js";
4
+ import { o as resolveApproval } from "../helpers-DY3vXuGs.js";
5
+ import { t as agentRuntime } from "../create-Cb86Z8Im.js";
6
6
  import { t as boundedMap } from "../lru-8q4WZjBV.js";
7
7
  //#region src/eve/create.ts
8
8
  const TOKENS_PER_PROCESS = 1e3;
@@ -1,8 +1,8 @@
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";
1
+ import { T as Policy, j as PolicyVocabulary, sr as Principal } from "../policy-types-B-F-qAZk.js";
2
+ import { u as Permission } from "../permission-types-DhNEmoRG.js";
3
+ import { a as PermDock } from "../permdock-Dco6dyCK.js";
4
+ import { f as InvalidSignatureError, i as OpenApiHooks, o as ProtectOptions, v as discoverViaSignatureAgent, x as webBotAuthVerifier } from "../server-types-C4gZUEZy.js";
5
+ import { t as ServerAdapterOptions } from "../bind-JDuvxjuW.js";
6
6
  import { i as toRequest, r as sendResponse } from "../http-B_LphE5Y.js";
7
7
  import { ErrorRequestHandler, Request, RequestHandler, Response, Router } from "express";
8
8
  //#region src/express/create.d.ts
@@ -1,7 +1,7 @@
1
1
  import { r as hasCredentials } from "../http-BBoKefeS.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";
2
+ import { l as InvalidSignatureError, p as webBotAuthVerifier, u as discoverViaSignatureAgent } from "../evaluations-DReoiVBw.js";
3
+ import { t as problemFromError } from "../map-error-BQGyDm_M.js";
4
+ import { i as decorate, r as bindKernel } from "../bind-D1nO6fiC.js";
5
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
@@ -1,8 +1,8 @@
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";
1
+ import { T as Policy, j as PolicyVocabulary, sr as Principal } from "../policy-types-B-F-qAZk.js";
2
+ import { u as Permission } from "../permission-types-DhNEmoRG.js";
3
+ import { a as PermDock } from "../permdock-Dco6dyCK.js";
4
+ import { f as InvalidSignatureError, i as OpenApiHooks, o as ProtectOptions, v as discoverViaSignatureAgent, x as webBotAuthVerifier } from "../server-types-C4gZUEZy.js";
5
+ import { t as ServerAdapterOptions } from "../bind-JDuvxjuW.js";
6
6
  import { FastifyPluginAsync, FastifyReply, FastifyRequest, FastifySchema, FastifyTypeProvider, FastifyTypeProviderDefault, RawRequestDefaultExpression, RawServerDefault, RouteGenericInterface } from "fastify";
7
7
  //#region src/server/http.d.ts
8
8
  /** A Fastify-style reply: `code`, `header` and `send`. */
@@ -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 { 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";
2
+ import { l as InvalidSignatureError, p as webBotAuthVerifier, u as discoverViaSignatureAgent } from "../evaluations-DReoiVBw.js";
3
+ import { t as problemFromError } from "../map-error-BQGyDm_M.js";
4
+ import { i as decorate, r as bindKernel } from "../bind-D1nO6fiC.js";
5
5
  //#region src/fastify/http.ts
6
6
  function toRequest(request) {
7
7
  const host = firstHeader(request.headers.host) ?? "localhost";
@@ -1,8 +1,8 @@
1
- import { w as Permission } from "./vocabulary-D6lPdb4Z.js";
2
- import { a as OperationInput, t as Operation } from "./operations-CxybZErY.js";
1
+ import { u as Permission } from "./permission-types-DhNEmoRG.js";
2
+ import { a as OperationInput, t as Operation } from "./operations-BNLes61x.js";
3
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";
4
+ import { o as ProtectOptions } from "./server-types-C4gZUEZy.js";
5
+ import { t as ServerAdapterOptions } from "./bind-JDuvxjuW.js";
6
6
  //#region src/server/fetch-adapter.d.ts
7
7
  /** What `protect` checks: a permission, an operation from `defineOperations`, or `null` for a route that needs only OAuth scopes. */
8
8
  type ProtectTarget = Permission | Operation | null;
@@ -1,9 +1,9 @@
1
1
  import { t as compact } from "./compact-CAf557ZB.js";
2
- import { o as isPermission } from "./permission-registry-Br4jSNVi.js";
2
+ import { o as isPermission } from "./permission-registry-DpPtSKNZ.js";
3
3
  import { r as hasCredentials } from "./http-BBoKefeS.js";
4
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";
5
+ import { t as problemFromError } from "./map-error-BQGyDm_M.js";
6
+ import { i as decorate, r as bindKernel } from "./bind-D1nO6fiC.js";
7
7
  //#region src/server/fetch-adapter.ts
8
8
  /**
9
9
  * `protect(target, data, options)(handler)` for a framework whose routes are
@@ -1,7 +1,7 @@
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";
1
+ import { i as configError } from "./errors-DpP_U6Bf.js";
2
+ import { c as jsonSchemaOf } from "./catalog-doc-CV9s6B1S.js";
3
+ import { A as quoteQualified, E as helperSchema, O as quoteIdent, k as quoteLiteral, s as signedIn } from "./shared-fMKOv8hP.js";
4
+ import { c as branchClauses, i as orSql, s as andSql, u as wrapSql } from "./policies-B2lZIurj.js";
5
5
  //#region src/cli/rls/fields.ts
6
6
  /** Names of the field-view objects. Part of the SQL contract. */
7
7
  const FIELD_VIEWS = {
@@ -12,7 +12,9 @@ const FIELD_VIEWS = {
12
12
  /** The companion's row-key column, joined to the base table's key. */
13
13
  key: "permdock_key",
14
14
  /** Marks the companion so doctor PD022 knows it reads as its owner on purpose. */
15
- comment: "permdock:field-companion"
15
+ comment: "permdock:field-companion",
16
+ /** `<table>_mask(p_row)`: the row-masking function `fields: 'mask'` adds. */
17
+ mask: "_mask"
16
18
  };
17
19
  function covers(branch, column) {
18
20
  return branch.fields === void 0 || branch.fields.includes(column);
@@ -67,12 +69,13 @@ function viewName(table, suffix) {
67
69
  return `${table}${suffix}`;
68
70
  }
69
71
  /**
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
+ * `<helper schema>.<table><suffix>`: outside the Data API's schemas, so the
73
+ * companion's owner rights reach clients only through the `_visible` join and
74
+ * the mask function is neither an RPC nor a computed field.
72
75
  */
73
- function companionName(ctx, table) {
76
+ function helperObjectName(ctx, table, suffix) {
74
77
  const base = table.startsWith("public.") ? table.slice(7) : table.replaceAll(".", "_");
75
- return `${helperSchema(ctx)}.${viewName(base, FIELD_VIEWS.companion)}`;
78
+ return `${helperSchema(ctx)}.${viewName(base, suffix)}`;
76
79
  }
77
80
  /**
78
81
  * One view per table whose read grants limit fields. A column is restricted
@@ -93,7 +96,7 @@ function fieldViews(policy, ctx, branches, options, warnings) {
93
96
  const resource = reads.find((branch) => branch.resource !== void 0)?.resource;
94
97
  if (!limited || allows.length === 0 || resource === void 0) continue;
95
98
  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}`);
99
+ if (names === void 0) throw configError(`PermDock CLI: --fields ${options.mask === true ? "mask" : "views"} needs the ${resource} schema's JSON Schema (Standard JSON Schema) to list the columns of ${table}`);
97
100
  const key = policy.resources.get(resource)?.id ?? "id";
98
101
  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
102
  const columns = names.map((name) => {
@@ -116,7 +119,8 @@ function fieldViews(policy, ctx, branches, options, warnings) {
116
119
  key,
117
120
  columns,
118
121
  roles: reads.some((branch) => branch.roles.includes("anon")) ? ["anon", "authenticated"] : ["authenticated"],
119
- ...options.revokeColumns ? { companion: companionName(ctx, table) } : {}
122
+ ...options.revokeColumns ? { companion: helperObjectName(ctx, table, FIELD_VIEWS.companion) } : {},
123
+ ...options.mask === true ? { maskFunction: helperObjectName(ctx, table, FIELD_VIEWS.mask) } : {}
120
124
  });
121
125
  }
122
126
  return views;
@@ -176,6 +180,34 @@ function columnRevokeSql(view) {
176
180
  return `revoke select (${columnList(restrictedColumns(view))}) on table ${quoteQualified(view.table)} from anon, authenticated;`;
177
181
  }
178
182
  /**
183
+ * `<table>_mask(p_row)`: the row with each restricted column the caller may
184
+ * not read set to null, by the same masks as the view. It reads only the row
185
+ * it is given, so its caller decides which rows; `security invoker`, because
186
+ * it needs nothing beyond the helpers the masks call. The body names the
187
+ * parameter `$1`, since a column called `p_row` would shadow the name.
188
+ */
189
+ function maskFunctionSql(view, fn) {
190
+ const table = quoteQualified(view.table);
191
+ const name = quoteQualified(fn);
192
+ const nulls = view.columns.flatMap((column) => column.mask === void 0 ? [] : [`case when ${column.mask} then '{}'::jsonb else pg_catalog.jsonb_build_object(${quoteLiteral(column.name)}, null) end`]);
193
+ return `-- ${fn}: a row of ${view.table} with ${restrictedColumns(view).join(", ")} null unless a read grant covers the column for the row, for SQL that reads ${view.table} without ${view.view}
194
+ create or replace function ${name}(p_row ${table})
195
+ returns ${table}
196
+ language sql
197
+ stable
198
+ security invoker
199
+ set search_path = ''
200
+ as $$
201
+ select pg_catalog.jsonb_populate_record(
202
+ $1,
203
+ ${nulls.join("\n || ")}
204
+ )
205
+ from (select ($1).*) r
206
+ $$;
207
+ revoke all on function ${name}(${table}) from public, anon, authenticated;
208
+ grant execute on function ${name}(${table}) to ${view.roles.join(", ")};`;
209
+ }
210
+ /**
179
211
  * The view SQL: the `security_invoker` view, and with `--revoke-columns` the
180
212
  * owner-rights companion it joins for the restricted columns. The companion
181
213
  * masks every column with the full field decision and keeps only rows where
@@ -184,10 +216,12 @@ function columnRevokeSql(view) {
184
216
  function fieldViewsSql(views) {
185
217
  return views.map((view) => {
186
218
  const head = `-- field view over ${view.table}: ${restrictedColumns(view).join(", ")} read as null unless a read grant covers the column for the row`;
219
+ const mask = view.maskFunction === void 0 ? [] : [maskFunctionSql(view, view.maskFunction)];
187
220
  if (view.companion === void 0) return [
188
221
  head,
189
222
  inlineViewSql(view),
190
- grantView(view.view, view.roles)
223
+ grantView(view.view, view.roles),
224
+ ...mask
191
225
  ].join("\n");
192
226
  return [
193
227
  head,
@@ -195,7 +229,8 @@ function fieldViewsSql(views) {
195
229
  companionSql(view, view.companion),
196
230
  grantView(view.companion, view.roles),
197
231
  joinedViewSql(view, view.companion),
198
- grantView(view.view, view.roles)
232
+ grantView(view.view, view.roles),
233
+ ...mask
199
234
  ].join("\n");
200
235
  }).join("\n\n");
201
236
  }
@@ -1,10 +1,19 @@
1
- import { n as CliError } from "./errors-CWTY6uih.js";
2
- import { existsSync, mkdirSync, readFileSync, realpathSync, renameSync, rmSync, writeFileSync } from "node:fs";
1
+ import { n as CliError } from "./errors-DpP_U6Bf.js";
2
+ import { existsSync, mkdirSync, readFileSync, realpathSync, renameSync, rmSync, statSync, writeFileSync } from "node:fs";
3
3
  import { dirname, relative, resolve } from "node:path";
4
4
  import { execFileSync } from "node:child_process";
5
5
  //#region src/cli/core/files.ts
6
+ /** `/dev/null` and its kin: a rename over a device is refused, so it is written in place. */
7
+ function isCharacterDevice(abs) {
8
+ try {
9
+ return statSync(abs).isCharacterDevice();
10
+ } catch {
11
+ return false;
12
+ }
13
+ }
6
14
  function outcomeOf(abs, text) {
7
15
  if (!existsSync(abs)) return "created";
16
+ if (isCharacterDevice(abs)) return "updated";
8
17
  return readFileSync(abs, "utf8") === text ? "unchanged" : "updated";
9
18
  }
10
19
  /** What writing `files` would do, without writing. */
@@ -27,6 +36,10 @@ function applyFiles(cwd, files, options = {}) {
27
36
  for (const [index, file] of files.entries()) {
28
37
  if (planned[index]?.outcome === "unchanged") continue;
29
38
  const target = resolve(cwd, file.path);
39
+ if (isCharacterDevice(target)) {
40
+ writeFileSync(target, file.text);
41
+ continue;
42
+ }
30
43
  const temp = `${target}.permdock-${String(process.pid)}.tmp`;
31
44
  mkdirSync(dirname(target), { recursive: true });
32
45
  writeFileSync(temp, file.text);
@@ -1,7 +1,7 @@
1
1
  import { r as isRecord } from "./compact-CAf557ZB.js";
2
- import { i as configError } from "./errors-CWTY6uih.js";
2
+ import { i as configError } from "./errors-DpP_U6Bf.js";
3
3
  import { i as readJsonFile } from "./files-D_JIzUrP.js";
4
- import { a as loadModule, s as pickNamed } from "./load-DFS_ry0W.js";
4
+ import { a as loadModule, s as pickNamed } from "./load-DxroEzH1.js";
5
5
  import { existsSync } from "node:fs";
6
6
  import { resolve } from "node:path";
7
7
  //#region src/cli/fixtures.ts
@@ -1,5 +1,5 @@
1
- import { n as CliError } from "./errors-CWTY6uih.js";
2
- import { n as secretInput } from "./credentials-DPyHmYz5.js";
1
+ import { n as CliError } from "./errors-DpP_U6Bf.js";
2
+ import { n as secretInput } from "./credentials-BpuTwd7a.js";
3
3
  //#region src/cli/core/flags.ts
4
4
  /** The flag vocabulary shared with better-supabase: one spelling per meaning. */
5
5
  const dbUrlFlags = { "db-url-stdin": {