permdock 0.1.0 → 0.3.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 (350) hide show
  1. package/README.md +106 -47
  2. package/dist/a2a/index.d.ts +7 -16
  3. package/dist/a2a/index.js +59 -98
  4. package/dist/adapter-context-mlWsVGGg.js +23 -0
  5. package/dist/ai-sdk/index.d.ts +37 -16
  6. package/dist/ai-sdk/index.js +30 -13
  7. package/dist/approvals/index.d.ts +3 -3
  8. package/dist/approvals/index.js +5 -4
  9. package/dist/{approvals-DaxY-Bdg.js → approvals-DbYAuNkG.js} +17 -11
  10. package/dist/approvers-DT4AVyIg.js +52 -0
  11. package/dist/{arazzo-CTeVuXr5.js → arazzo-BAgw9ap6.js} +2 -2
  12. package/dist/{arazzo-aoTkqYsJ.js → arazzo-CKwwqFWz.js} +2 -2
  13. package/dist/authzen/index.d.ts +4 -13
  14. package/dist/authzen/index.js +16 -50
  15. package/dist/better-auth/index.d.ts +20 -3
  16. package/dist/better-auth/index.js +27 -7
  17. package/dist/better-supabase/index.d.ts +223 -0
  18. package/dist/better-supabase/index.js +648 -0
  19. package/dist/bind-C_ob3LKa.d.ts +25 -0
  20. package/dist/bind-CuzGytRf.js +97 -0
  21. package/dist/boundary-BM8a_P6E.js +13 -0
  22. package/dist/boundary-BmHxVH1J.d.ts +15 -0
  23. package/dist/canonical-json-DemiK4Vp.js +26 -0
  24. package/dist/{capability-BDG_nkxt.d.ts → capability-2kYTMWDv.d.ts} +2 -2
  25. package/dist/{capability-B68OFnZx.js → capability-4qPdO9gk.js} +7 -5
  26. package/dist/catalog/index.d.ts +1 -1
  27. package/dist/catalog/index.js +1 -1
  28. package/dist/catalog-CRW5Mx_B.js +2 -0
  29. package/dist/{catalog-H-vFGwWK.js → catalog-DWF5cYqB.js} +4 -4
  30. package/dist/{catalog-B0E6bggc.js → catalog-dFZdWCGN.js} +2 -2
  31. package/dist/{catalog-doc-BSo_Q_-6.js → catalog-doc-DdGm82XT.js} +20 -32
  32. package/dist/claude-agent/index.d.ts +5 -14
  33. package/dist/claude-agent/index.js +4 -10
  34. package/dist/clerk/index.d.ts +12 -3
  35. package/dist/clerk/index.js +26 -5
  36. package/dist/cli/bin.js +1 -1
  37. package/dist/cli/index.d.ts +3 -3
  38. package/dist/cli/index.js +2 -2
  39. package/dist/clients-C7zLFuWT.d.ts +12 -0
  40. package/dist/clients-DjU5ABMy.js +23 -0
  41. package/dist/cloud/index.d.ts +4 -5
  42. package/dist/cloud/index.js +20 -6
  43. package/dist/{cloud-BNQTrmrr.js → cloud-CB_ELYuX.js} +2 -2
  44. package/dist/{cloud-Cuxr6Czw.js → cloud-DWLXO2af.js} +7 -6
  45. package/dist/collect-DClJsheJ.js +83 -0
  46. package/dist/{collect-O-tOtbnk.js → collect-DSTE3ml9.js} +194 -42
  47. package/dist/collect-DSWOk19R.js +2 -0
  48. package/dist/{commands-BMh_Etm2.js → commands-DSxCqG9A.js} +16 -12
  49. package/dist/compile/index.d.ts +3 -0
  50. package/dist/compile/index.js +2 -0
  51. package/dist/{compile-D22iwvuV.js → compile-Ba4blROR.js} +85 -30
  52. package/dist/compile-BkRyBDBw.d.ts +94 -0
  53. package/dist/config-BJiM-xAm.js +157 -0
  54. package/dist/config-Dnszbv-6.js +36 -0
  55. package/dist/config-report-DMvWKUxL.js +44 -0
  56. package/dist/{connection-JvqwHODC.js → connection-CU8MQxRi.js} +1 -1
  57. package/dist/{context-CKEAabd7.js → context-Bcy85rGi.js} +36 -27
  58. package/dist/convex/index.d.ts +9 -4
  59. package/dist/convex/index.js +14 -4
  60. package/dist/create-B1d519XK.d.ts +245 -0
  61. package/dist/create-CMwIl-w2.js +253 -0
  62. package/dist/{credential-B_rkUNlY.js → credential-8P81ff4u.js} +26 -46
  63. package/dist/delegation-D8pUEuce.js +103 -0
  64. package/dist/{describe-Bt1YD5uS.js → describe-B_gVZEVi.js} +10 -15
  65. package/dist/{describe-DernyItf.d.ts → describe-DMYiCjJV.d.ts} +9 -10
  66. package/dist/{diff-x5Il8LVa.js → diff-2VaeChzX.js} +44 -11
  67. package/dist/{diff-BUzf5Poi.js → diff-DBIhz_f2.js} +2 -2
  68. package/dist/{doctor-Bqo6FwUa.js → doctor-BwCAMLx_.js} +2 -2
  69. package/dist/doctor-collect-CHk6XWOA.js +665 -0
  70. package/dist/doctor-igIiM_Hl.js +1194 -0
  71. package/dist/drizzle/index.d.ts +4 -3
  72. package/dist/drizzle/index.js +3 -3
  73. package/dist/elysia/index.d.ts +6 -28
  74. package/dist/elysia/index.js +16 -60
  75. package/dist/{errors-DSMnAVNa.js → errors-CWfoNg9N.js} +8 -4
  76. package/dist/{errors-Iy71s7Oj.js → errors-Cz5zn0mW.js} +17 -71
  77. package/dist/{errors-DbZ1YOnb.d.ts → errors-DPdqI50v.d.ts} +8 -21
  78. package/dist/{errors-m3u9TmDu.js → errors-DRnGZHzF.js} +4 -1
  79. package/dist/evaluation-items-CfCCejQd.js +40 -0
  80. package/dist/{evaluations-DsAU9ppl.js → evaluations-tz6D9A2G.js} +28 -46
  81. package/dist/eve/index.d.ts +6 -15
  82. package/dist/eve/index.js +7 -12
  83. package/dist/expiry-BoBJ8Tvc.js +7 -0
  84. package/dist/express/index.d.ts +6 -29
  85. package/dist/express/index.js +28 -58
  86. package/dist/fastify/index.d.ts +6 -29
  87. package/dist/fastify/index.js +16 -65
  88. package/dist/fields-BMl1RxoX.js +26 -0
  89. package/dist/{files-B_wAGYmt.js → files-DWUN9PzI.js} +5 -1
  90. package/dist/{fixtures-Cvaw0gDG.js → fixtures-ht28Cplr.js} +5 -2
  91. package/dist/{freeze-y1_jQL4v.js → freeze-CrU8nQeX.js} +31 -2
  92. package/dist/{from-snapshot-BMGnhmgv.js → from-snapshot-CTLijvdm.js} +66 -48
  93. package/dist/{grantee-Bv04_Vzf.js → grantee-Cv5Sogfv.js} +88 -7
  94. package/dist/graph-sql-B-dsAT6j.d.ts +29 -0
  95. package/dist/{headers-B5RRv3Xm.js → headers-BZSDieNT.js} +1 -1
  96. package/dist/{headers-C8SHQccD.d.ts → headers-Cf-zWvsO.d.ts} +1 -1
  97. package/dist/helpers-H_KARDVC.js +421 -0
  98. package/dist/hono/index.d.ts +6 -28
  99. package/dist/hono/index.js +11 -43
  100. package/dist/{hosted-BwKQ1BTA.js → hosted-DJQw46hn.js} +6 -5
  101. package/dist/{http-GgVApX1k.js → http-BIhmLfCc.js} +4 -20
  102. package/dist/http-SO7qGttf.js +44 -0
  103. package/dist/ids-DC4V4CFu.js +18 -0
  104. package/dist/index-0nNqHspG.d.ts +6 -0
  105. package/dist/{index-xIxJLwOQ.d.ts → index-BNc7Wer_.d.ts} +75 -7
  106. package/dist/{index-CltcQ4Bf.d.ts → index-C7Tw7MaW.d.ts} +68 -5
  107. package/dist/{index-LF_hS-yn.d.ts → index-C8z4RjQV.d.ts} +1 -1
  108. package/dist/index.d.ts +14 -9
  109. package/dist/index.js +22 -17
  110. package/dist/instance-options-Dhhcnm3y.js +22 -0
  111. package/dist/instance-options-jARdwfPN.d.ts +11 -0
  112. package/dist/{parse-DPfIvFMU.js → json-schema-BsAflUGW.js} +28 -57
  113. package/dist/jwt/index.d.ts +10 -6
  114. package/dist/jwt/index.js +32 -13
  115. package/dist/kernel-_RRHmnMY.js +208 -0
  116. package/dist/kysely/index.d.ts +4 -3
  117. package/dist/kysely/index.js +3 -3
  118. package/dist/live-options-H2eG8dfJ.js +60 -0
  119. package/dist/{load-BZ24CpZP.js → load-DhWEB9P1.js} +16 -10
  120. package/dist/load-DwJUafYN.js +2 -0
  121. package/dist/manifest-iaoBXHKc.js +783 -0
  122. package/dist/manifest-uDS9y5de.d.ts +206 -0
  123. package/dist/{map-DowSO96j.js → map-AcxK9o_D.js} +4 -15
  124. package/dist/{map-claims-B_6I1Rn-.js → map-claims-Z4QZOiFF.js} +13 -4
  125. package/dist/map-error-pgUWNNtG.js +23 -0
  126. package/dist/may-use-DndQ5tQ-.js +77 -0
  127. package/dist/mcp/index.d.ts +54 -22
  128. package/dist/mcp/index.js +218 -178
  129. package/dist/nest/index.d.ts +26 -31
  130. package/dist/nest/index.js +75 -84
  131. package/dist/next/client.d.ts +7 -8
  132. package/dist/next/client.js +11 -9
  133. package/dist/next/index.d.ts +30 -47
  134. package/dist/next/index.js +45 -60
  135. package/dist/next/plugin.d.ts +1 -1
  136. package/dist/next/plugin.js +32 -1
  137. package/dist/node/index.d.ts +9 -28
  138. package/dist/node/index.js +11 -43
  139. package/dist/openai/index.d.ts +6 -15
  140. package/dist/openai/index.js +7 -20
  141. package/dist/openapi/index.d.ts +87 -4
  142. package/dist/openapi/index.js +3 -3
  143. package/dist/{openapi-DcqM8nU7.js → openapi-BqRBvAng.js} +237 -5
  144. package/dist/{openapi-DWD0Uc_4.js → openapi-CqqEbHsL.js} +5 -5
  145. package/dist/{openapi-import-BWRUNNeW.js → openapi-import-cmwetbzw.js} +1 -1
  146. package/dist/{openapi-CwePaF7C.js → openapi-l0xYHkcv.js} +3 -3
  147. package/dist/{openapi-schema-D8j_T9tO.js → openapi-schema--ARjyfQr.js} +2 -2
  148. package/dist/orpc/index.d.ts +15 -28
  149. package/dist/orpc/index.js +74 -117
  150. package/dist/otel/index.d.ts +2 -2
  151. package/dist/parse-BuyjxhZV.js +53 -0
  152. package/dist/parse-local-manifest-BrMozJCo.js +36 -0
  153. package/dist/parse-local-manifest-JLnaBH0S.d.ts +10 -0
  154. package/dist/pdp/index.d.ts +2 -2
  155. package/dist/pdp/index.js +14 -127
  156. package/dist/{permdock-yoZ7EjxX.js → permdock-CbgvLnuo.js} +672 -149
  157. package/dist/{permissions-B8vCg_bI.d.ts → permissions-CDgvKG5L.d.ts} +2 -2
  158. package/dist/{permissions-DC7GROPA.js → permissions-DVoF6dMt.js} +77 -15
  159. package/dist/{permissions-B4apnahQ.d.ts → permissions-DttnqqxC.d.ts} +34 -5
  160. package/dist/{permissions-CofRqesP.js → permissions-RJrovw98.js} +3 -3
  161. package/dist/{pins-CqE1jZuF.js → pins-8ILTftC9.js} +2 -2
  162. package/dist/{policy-Cq2fB8Q5.d.ts → policy-D2W7uv19.d.ts} +2 -2
  163. package/dist/{policy-CInmNGkM.d.ts → policy-IB6yxpC3.d.ts} +351 -42
  164. package/dist/{policy-ANp36PnI.js → policy-xyWg7QdR.js} +173 -22
  165. package/dist/powersync-BylawD_U.js +540 -0
  166. package/dist/powersync-DliZK_-y.js +62 -0
  167. package/dist/powersync-e_AZrKbg.js +2 -0
  168. package/dist/prisma/index.d.ts +3 -2
  169. package/dist/prisma/index.js +45 -20
  170. package/dist/{problem-Cgp9-KZA.js → problem-B43ztKIm.js} +74 -109
  171. package/dist/problem-details-DX075l9V.d.ts +7 -0
  172. package/dist/problem-details-_AMOYz-w.js +144 -0
  173. package/dist/{protected-BuPAycJT.d.ts → protected-BdnIEFkY.d.ts} +5 -4
  174. package/dist/protected-utU-SLuy.js +100 -0
  175. package/dist/protected-xAr24FEC.d.ts +40 -0
  176. package/dist/provider-CSQd7m92.js +52 -0
  177. package/dist/{provider-wTAUda2v.d.ts → provider-DZY281jO.d.ts} +1 -1
  178. package/dist/provider-store-Cfbvo4DE.js +43 -0
  179. package/dist/react/index.d.ts +7 -5
  180. package/dist/react/index.js +5 -4
  181. package/dist/react/provider-client.d.ts +1 -1
  182. package/dist/react/provider-client.js +1 -1
  183. package/dist/react-native/index.d.ts +166 -10
  184. package/dist/react-native/index.js +607 -85
  185. package/dist/{refs-ChLSxbST.js → refs-KYb4ntaz.js} +4 -3
  186. package/dist/{relations-r4soIFZB.js → relations-cjOL01hZ.js} +110 -31
  187. package/dist/replay-BsOyTrdV.js +28 -0
  188. package/dist/replay-CYyiLiwO.d.ts +5 -0
  189. package/dist/resource-ref-CaS9yVPi.js +20 -0
  190. package/dist/revocations-Bhr0aMIC.js +27 -0
  191. package/dist/{rls-BOFU3chG.js → rls-B4ur8nKQ.js} +8 -3
  192. package/dist/rls-DQtdgTHB.js +2521 -0
  193. package/dist/rls-fields-74oZPXWL.js +3582 -0
  194. package/dist/{rls-graph-DxQ39PJj.js → rls-graph-CHwx0V8q.js} +100 -36
  195. package/dist/{rls-import-CXV6LBlS.js → rls-import-BTFVk3jH.js} +7 -6
  196. package/dist/{rls-migrate-DrFPbf8p.js → rls-migrate-CN4TlJTO.js} +6 -5
  197. package/dist/rls-ownership-RuFqaqGz.js +843 -0
  198. package/dist/rls-shared-Cewd_-zI.js +495 -0
  199. package/dist/rls-verify-CVQTHTh5.js +746 -0
  200. package/dist/{row-check-BajTgQZ-.d.ts → row-check-Dt35czLy.d.ts} +12 -15
  201. package/dist/row-conditions-h2HythXQ.js +27 -0
  202. package/dist/rpc-DL9Sqvb1.js +89 -0
  203. package/dist/{run-CJ6UvS3a.js → run-DKDbM4Du.js} +31 -12
  204. package/dist/runtime-CB8gQFvS.js +11 -0
  205. package/dist/{saas-BRrZzJkM.js → saas-DhpJjnBA.js} +17 -7
  206. package/dist/{schema-P8yoma__.js → schema-D3MnDMxa.js} +8 -4
  207. package/dist/scim/index.d.ts +1 -1
  208. package/dist/scim/index.js +1 -1
  209. package/dist/{scim-9NFa0XVZ.js → scim-BFGBBAqR.js} +1 -1
  210. package/dist/{scopes-cKVp_WTw.js → scopes-CVdPrWN-.js} +35 -8
  211. package/dist/server/index.d.ts +22 -11
  212. package/dist/server/index.js +11 -8
  213. package/dist/{credentials-BgRX3WEg.js → server-DlZ28Oz5.js} +1 -1
  214. package/dist/shared-DRu8VFVM.js +123 -0
  215. package/dist/{sink-Cfr9-7YC.d.ts → sink-B1fZzIMf.d.ts} +1 -1
  216. package/dist/skills-Biq5uup3.js +192 -0
  217. package/dist/{skills-C_lpV4Jx.js → skills-Bx-U0irG.js} +10 -4
  218. package/dist/{snapshot-DE8dE_hz.js → snapshot-Enxd0n-s.js} +138 -214
  219. package/dist/snapshot-cache-B-LxUahj.d.ts +45 -0
  220. package/dist/snapshot-cache-D6jLelln.js +44 -0
  221. package/dist/solid/index.d.ts +39 -9
  222. package/dist/solid/index.js +76 -85
  223. package/dist/sources-4p0-4xQm.js +545 -0
  224. package/dist/sources-BdOYLw9j.d.ts +192 -0
  225. package/dist/{sql-Bll1d7y0.js → sql-xdg5f4Fi.js} +6 -1
  226. package/dist/{src-CTNT-PBW.js → src-BDwEZWrZ.js} +149 -11
  227. package/dist/ssf/index.d.ts +3 -2
  228. package/dist/ssf/index.js +3 -29
  229. package/dist/store-DMAWwAJV.js +371 -0
  230. package/dist/{store-Bq90395i.d.ts → store-jOBYpiXC.d.ts} +13 -4
  231. package/dist/store-options-ByhZq1jV.js +716 -0
  232. package/dist/{stores-CkG2HrSg.js → stores-BT2pSCub.js} +10 -63
  233. package/dist/{stores-CvOnu_2T.d.ts → stores-C0IMQrGI.d.ts} +20 -9
  234. package/dist/{stream-BhMfZOwr.d.ts → stream-D1RXubw2.d.ts} +2 -2
  235. package/dist/{stream-Q_xlB6Ko.js → stream-DDpvynSB.js} +16 -2
  236. package/dist/subject-settings-BwBmCdTR.js +128 -0
  237. package/dist/supabase/index.d.ts +133 -6
  238. package/dist/supabase/index.js +4 -3
  239. package/dist/supabase/middleware.d.ts +32 -27
  240. package/dist/supabase/middleware.js +56 -22
  241. package/dist/{supabase-D8UlBA7Z.js → supabase-Boqb9a_Y.js} +3 -3
  242. package/dist/{supabase-DTxGtYdi.js → supabase-C0qESOa-.js} +347 -367
  243. package/dist/supabase-config-BpPXt3x1.js +472 -0
  244. package/dist/supabase-hook-6sYLXg_u.js +2 -0
  245. package/dist/{supabase-hook-D_OqGb_V.js → supabase-hook-CSLQ4zJ3.js} +1037 -705
  246. package/dist/supautils-Cn4R4cJ4.js +91 -0
  247. package/dist/svelte/PermissionBoundary.svelte +37 -0
  248. package/dist/svelte/Protected.svelte +8 -2
  249. package/dist/svelte/index.d.ts +9 -6
  250. package/dist/svelte/index.js +61 -7
  251. package/dist/svelte/runtime.d.ts +4 -3
  252. package/dist/svelte/runtime.js +4 -3
  253. package/dist/svelte/source.d.ts +9 -6
  254. package/dist/svelte/source.js +7 -4
  255. package/dist/terminal/index.d.ts +6 -14
  256. package/dist/terminal/index.js +44 -32
  257. package/dist/testing/index.d.ts +105 -16
  258. package/dist/testing/index.js +504 -40
  259. package/dist/testing/saas/index.d.ts +4 -4
  260. package/dist/testing/saas/index.js +2 -2
  261. package/dist/testing/saas/permissions.d.ts +1 -1
  262. package/dist/testing/saas/permissions.js +1 -1
  263. package/dist/token-CIWxJOCh.js +50 -0
  264. package/dist/trpc/index.d.ts +7 -26
  265. package/dist/trpc/index.js +17 -100
  266. package/dist/types-BnIEz1sU.d.ts +48 -0
  267. package/dist/{types-CxquUByI.d.ts → types-Bvc4oWT6.d.ts} +1 -1
  268. package/dist/{sources-DOpW5Ila.d.ts → types-C97IskBw.d.ts} +86 -127
  269. package/dist/types-CKNSyIf_.d.ts +52 -0
  270. package/dist/types-Cq_H8N_X.d.ts +197 -0
  271. package/dist/{types-D6Z6-rKJ.d.ts → types-DbjRN55U.d.ts} +273 -22
  272. package/dist/{types-BBK-exvJ.d.ts → types-Dnemwd77.d.ts} +7 -1
  273. package/dist/{types-BvBk1wgn.d.ts → types-DxiCGmmd.d.ts} +5 -3
  274. package/dist/{types-B9dmiiab.d.ts → types-QCuYJh4q.d.ts} +1 -1
  275. package/dist/{types-B8w5PFtS.d.ts → types-aqOHTHcp.d.ts} +17 -1
  276. package/dist/unplugin/index.d.ts +1 -1
  277. package/dist/unplugin/index.js +10 -9
  278. package/dist/usage-DorAJiU_.js +2 -0
  279. package/dist/{usage-1ozMubLY.js → usage-GTixvDDU.js} +2 -2
  280. package/dist/{usage-CUnK6Ou9.js → usage-ItS7nLcl.js} +225 -62
  281. package/dist/validation-error-Ba264OaJ.d.ts +26 -0
  282. package/dist/validation-error-CnjZ4t92.js +33 -0
  283. package/dist/{validity-D0uRmJKJ.js → validity-uOp8UpYn.js} +57 -36
  284. package/dist/{verifier-B90agnhl.js → verifier-BxBo6I44.js} +10 -5
  285. package/dist/version-BvacVTZR.js +17 -0
  286. package/dist/views-Soe7bGSC.js +95 -0
  287. package/dist/{vocabulary-Dk0fs-Jk.d.ts → vocabulary-DA8a8zif.d.ts} +1 -1
  288. package/dist/vue/index.d.ts +35 -13
  289. package/dist/vue/index.js +86 -93
  290. package/dist/watch-BwxLTYMZ.js +2 -0
  291. package/dist/watch-DVBJ9cBq.js +128 -0
  292. package/dist/webmcp/index.d.ts +2 -2
  293. package/dist/webmcp/index.js +7 -13
  294. package/package.json +62 -36
  295. package/schemas/approval-request-v1.json +175 -0
  296. package/schemas/catalog-v1.json +29 -1
  297. package/schemas/supabase-claims-v1.json +6 -1
  298. package/schemas/supabase-manifest-v1.json +150 -6
  299. package/skills/permdock/SKILL.md +7 -7
  300. package/skills/permdock-agents/SKILL.md +5 -5
  301. package/skills/permdock-agents/references/runtimes.md +12 -10
  302. package/skills/permdock-approvals/SKILL.md +4 -4
  303. package/skills/permdock-approvals/references/stores-and-resume.md +15 -4
  304. package/skills/permdock-audit/SKILL.md +3 -3
  305. package/skills/permdock-credentials/SKILL.md +4 -4
  306. package/skills/permdock-credentials/references/tokens-keys-links.md +7 -2
  307. package/skills/permdock-data/SKILL.md +4 -4
  308. package/skills/permdock-data/references/queries-and-rls.md +14 -6
  309. package/skills/permdock-data/references/relationships.md +5 -3
  310. package/skills/permdock-tenancy/SKILL.md +9 -6
  311. package/skills/permdock-tenancy/references/ownership-and-custom-roles.md +14 -8
  312. package/skills/permdock-wire/SKILL.md +4 -4
  313. package/skills/permdock-wire/references/adapters.md +42 -30
  314. package/skills/permdock-wire/references/policy-options.md +5 -3
  315. package/dist/approvers-aH0PJkmf.js +0 -20
  316. package/dist/catalog-idsHc0vo.js +0 -2
  317. package/dist/collect-B7_TIfmg.js +0 -49
  318. package/dist/collect-fRPAQIWb.js +0 -2
  319. package/dist/compile-CQbvyIBr.d.ts +0 -30
  320. package/dist/config-BPYmjTOp.js +0 -26
  321. package/dist/context-gtAwAILx.js +0 -6
  322. package/dist/create-BKF3dgFk.d.ts +0 -162
  323. package/dist/create-CSkhDU9T.js +0 -222
  324. package/dist/doctor-BGle8Gqi.js +0 -1314
  325. package/dist/helpers-DnSOrhB9.js +0 -682
  326. package/dist/index-fG6NSXlc.d.ts +0 -9
  327. package/dist/kernel-YOGCWNLf.js +0 -211
  328. package/dist/load-QOOm1z70.js +0 -2
  329. package/dist/manifest-DDQbC6K0.d.ts +0 -118
  330. package/dist/map-error-RJ3ZsUyA.js +0 -16
  331. package/dist/may-use-CnFEjVEp.js +0 -37
  332. package/dist/pg-4GJWDUxG.js +0 -953
  333. package/dist/plugin-4gr7IxFJ.js +0 -65
  334. package/dist/protected-B4K3BKoX.js +0 -138
  335. package/dist/protected-wY7nXhY9.d.ts +0 -23
  336. package/dist/provider-_wx46HpB.js +0 -48
  337. package/dist/rls-CJVja9Ww.js +0 -2119
  338. package/dist/rls-helpers-BxRuif0l.js +0 -1346
  339. package/dist/runtime-DP9ttFh1.js +0 -27
  340. package/dist/skills-Dx3QLnMY.js +0 -110
  341. package/dist/source-DoBBYJi2.js +0 -6
  342. package/dist/sources-DVHM3Mwq.js +0 -284
  343. package/dist/store-C6hFW6ta.js +0 -508
  344. package/dist/subject-settings-xt7V845g.js +0 -82
  345. package/dist/supabase-hook-DW-xP4hU.js +0 -2
  346. package/dist/types-DbWdEfcm.d.ts +0 -87
  347. package/dist/types-bva3i4Gf.d.ts +0 -98
  348. package/dist/types-i4BAOvdb.d.ts +0 -97
  349. package/dist/usage-PyEor6GA.js +0 -2
  350. package/dist/version-CnSh33Fj.js +0 -16
@@ -0,0 +1,716 @@
1
+ import { t as compact } from "./compact-y6vfu2_f.js";
2
+ import { c as rowIdOf, n as parseSnapshot } from "./snapshot-Enxd0n-s.js";
3
+ import { u as nowSeconds } from "./validity-uOp8UpYn.js";
4
+ import { n as payloadDigest } from "./token-CIWxJOCh.js";
5
+ import { n as fromSnapshot, t as emptySnapshot } from "./from-snapshot-CTLijvdm.js";
6
+ import { t as timeoutSignal } from "./timeout-D51niuQP.js";
7
+ //#region src/client/approvals.ts
8
+ /** Ceiling for the approval poll backoff after a failed status request. */
9
+ const APPROVAL_BACKOFF_CAP_MS = 6e4;
10
+ /** Consecutive failed status requests after which a token is no longer polled. */
11
+ const APPROVAL_MAX_FAILURES = 5;
12
+ const TERMINAL = /* @__PURE__ */ new Set([
13
+ "approved",
14
+ "rejected",
15
+ "expired"
16
+ ]);
17
+ function createApprovals(options) {
18
+ const { interval } = options;
19
+ const approvals = /* @__PURE__ */ new Map();
20
+ const polls = /* @__PURE__ */ new Map();
21
+ const watched = /* @__PURE__ */ new Set();
22
+ const failures = /* @__PURE__ */ new Map();
23
+ let epoch = 0;
24
+ const stop = () => {
25
+ for (const timer of polls.values()) clearTimeout(timer);
26
+ polls.clear();
27
+ };
28
+ const poll = async (href) => {
29
+ try {
30
+ const response = await options.request(href);
31
+ if (response.status === 404) return "expired";
32
+ if (response.status >= 400 && response.status < 500) return "refused";
33
+ if (!response.ok) return;
34
+ const body = await response.json();
35
+ return body.status === "pending" || body.status === "approved" || body.status === "rejected" || body.status === "expired" ? body.status : void 0;
36
+ } catch {
37
+ return;
38
+ }
39
+ };
40
+ const schedule = (token) => {
41
+ if (options.disposed() || options.server || options.approvals === void 0 || polls.has(token) || !options.listening()) return;
42
+ const started = epoch;
43
+ const href = `${options.approvals.replace(/\/+$/u, "")}/${encodeURIComponent(token)}`;
44
+ const failed = failures.get(token) ?? 0;
45
+ const delay = Math.min(interval * 2 ** failed, Math.max(interval, APPROVAL_BACKOFF_CAP_MS));
46
+ polls.set(token, setTimeout(() => {
47
+ poll(href).then((answer) => {
48
+ if (started !== epoch || options.disposed()) return;
49
+ polls.delete(token);
50
+ const next = answer === "refused" ? void 0 : answer;
51
+ if (next !== void 0 && approvals.get(token) !== next) {
52
+ approvals.set(token, next);
53
+ options.emit();
54
+ }
55
+ const count = answer === void 0 ? (failures.get(token) ?? 0) + 1 : 0;
56
+ if (count === 0) failures.delete(token);
57
+ else failures.set(token, count);
58
+ if (answer === "refused" || count >= APPROVAL_MAX_FAILURES || TERMINAL.has(approvals.get(token) ?? "required")) {
59
+ watched.delete(token);
60
+ failures.delete(token);
61
+ } else schedule(token);
62
+ });
63
+ }, delay));
64
+ };
65
+ return {
66
+ state(decision) {
67
+ if (decision.outcome !== "approval-required") return "not-needed";
68
+ const current = approvals.get(decision.token) ?? "required";
69
+ if (TERMINAL.has(current)) watched.delete(decision.token);
70
+ else {
71
+ watched.add(decision.token);
72
+ schedule(decision.token);
73
+ }
74
+ return current;
75
+ },
76
+ async request(decision, note) {
77
+ if (decision.outcome !== "approval-required" || options.simulated()) return;
78
+ const href = options.approvals ?? options.endpoint;
79
+ if (href === void 0) return;
80
+ if ((await options.request(href, {
81
+ permission: decision.grant.permission,
82
+ token: decision.token,
83
+ note
84
+ })).ok && !TERMINAL.has(approvals.get(decision.token) ?? "required")) {
85
+ approvals.set(decision.token, "pending");
86
+ options.emit();
87
+ }
88
+ },
89
+ forget() {
90
+ epoch += 1;
91
+ stop();
92
+ approvals.clear();
93
+ watched.clear();
94
+ failures.clear();
95
+ },
96
+ stop,
97
+ resume() {
98
+ for (const token of watched) schedule(token);
99
+ }
100
+ };
101
+ }
102
+ //#endregion
103
+ //#region src/client/batch.ts
104
+ const SERVER_ONLY = {
105
+ outcome: "denied",
106
+ denials: [{
107
+ role: null,
108
+ reason: "opaque-condition"
109
+ }],
110
+ alternatives: []
111
+ };
112
+ /** The client has no endpoint to ask (`endpoint: false`, or none given). */
113
+ const NO_ENDPOINT = {
114
+ outcome: "denied",
115
+ denials: [{
116
+ role: null,
117
+ reason: "server-only"
118
+ }],
119
+ alternatives: []
120
+ };
121
+ /** The row's id under the snapshot's id field, or `undefined` for a row without one. */
122
+ function rowId(snapshot, permission, data) {
123
+ const id = rowIdOf(data, snapshot.ids?.[permission.resource]);
124
+ return id === "*" ? void 0 : id;
125
+ }
126
+ function cacheKey(snapshot, permission, data) {
127
+ if (data === void 0) return `${permission.key}:*`;
128
+ return `${permission.key}:${rowId(snapshot, permission, data) ?? `#${payloadDigest(data)}`}`;
129
+ }
130
+ /** Collects the checks the snapshot cannot answer and posts them as one AuthZEN batch per microtask. */
131
+ function createBatch(options) {
132
+ const { answers, endpoint } = options;
133
+ let queued = [];
134
+ let flushScheduled = false;
135
+ const flush = async () => {
136
+ const batch = queued;
137
+ queued = [];
138
+ if (batch.length === 0 || endpoint === void 0) return;
139
+ const started = options.generation();
140
+ const snapshot = options.snapshot();
141
+ if (snapshot.simulated === true) {
142
+ for (const item of batch) answers.set(item.key, {
143
+ decision: SERVER_ONLY,
144
+ status: "server-only"
145
+ });
146
+ options.emit();
147
+ return;
148
+ }
149
+ const { principal } = options.instance().subject;
150
+ try {
151
+ const response = await options.request(endpoint, { evaluations: batch.map((item) => ({
152
+ subject: {
153
+ type: principal?.kind ?? "user",
154
+ id: principal?.id ?? ""
155
+ },
156
+ action: { name: item.permission.action },
157
+ resource: {
158
+ type: item.permission.resource,
159
+ id: rowId(snapshot, item.permission, item.data),
160
+ properties: item.data
161
+ }
162
+ })) });
163
+ if (!response.ok) throw new Error("evaluations failed");
164
+ const body = await response.json();
165
+ if (started !== options.generation()) return;
166
+ for (const [index, item] of batch.entries()) {
167
+ const decision = (body.evaluations?.[index])?.context?.permdock ?? SERVER_ONLY;
168
+ answers.set(item.key, {
169
+ decision,
170
+ status: "ready"
171
+ });
172
+ }
173
+ } catch {
174
+ if (started !== options.generation()) return;
175
+ for (const item of batch) answers.set(item.key, {
176
+ decision: SERVER_ONLY,
177
+ status: "server-only"
178
+ });
179
+ }
180
+ options.emit();
181
+ };
182
+ const scheduleFlush = () => {
183
+ if (flushScheduled || endpoint === void 0) return;
184
+ flushScheduled = true;
185
+ queueMicrotask(() => {
186
+ flushScheduled = false;
187
+ flush();
188
+ });
189
+ };
190
+ return {
191
+ enqueue(key, permission, data) {
192
+ if (answers.has(key)) return;
193
+ if (endpoint === void 0) {
194
+ answers.set(key, {
195
+ decision: NO_ENDPOINT,
196
+ status: "server-only"
197
+ });
198
+ options.onServerOnly?.(permission);
199
+ options.emitSoon();
200
+ return;
201
+ }
202
+ answers.set(key, {
203
+ decision: SERVER_ONLY,
204
+ status: "pending"
205
+ });
206
+ queued.push({
207
+ permission,
208
+ data,
209
+ key
210
+ });
211
+ options.emitSoon();
212
+ scheduleFlush();
213
+ },
214
+ clear() {
215
+ queued = [];
216
+ }
217
+ };
218
+ }
219
+ //#endregion
220
+ //#region src/client/request.ts
221
+ /** Milliseconds a decision, refresh or approval request may take; a slower one is an error like a failed request. */
222
+ const STORE_TIMEOUT_MS = 1e4;
223
+ function storeRequest(fetchImpl, headers) {
224
+ return (url, body) => fetchImpl(url, {
225
+ method: body === void 0 ? "GET" : "POST",
226
+ credentials: "include",
227
+ signal: timeoutSignal(STORE_TIMEOUT_MS),
228
+ headers: body === void 0 ? {
229
+ accept: "application/json",
230
+ ...headers()
231
+ } : {
232
+ accept: "application/json",
233
+ "content-type": "application/json",
234
+ ...headers()
235
+ },
236
+ ...body === void 0 ? {} : { body: JSON.stringify(body) }
237
+ });
238
+ }
239
+ //#endregion
240
+ //#region src/client/source.ts
241
+ /** A compact JWS: three non-empty dot-separated parts. */
242
+ function isJws(value) {
243
+ const parts = value.split(".");
244
+ return parts.length === 3 && parts.every((part) => part.length > 0);
245
+ }
246
+ function isPromiseLike(value) {
247
+ return typeof value === "object" && value !== null && "then" in value && typeof value.then === "function";
248
+ }
249
+ //#endregion
250
+ //#region src/client/store.ts
251
+ function withTenant(source, tenant) {
252
+ if (tenant === void 0) return source;
253
+ const hashAt = source.indexOf("#");
254
+ const hash = hashAt === -1 ? "" : source.slice(hashAt);
255
+ const rest = hashAt === -1 ? source : source.slice(0, hashAt);
256
+ const queryAt = rest.indexOf("?");
257
+ const path = queryAt === -1 ? rest : rest.slice(0, queryAt);
258
+ const params = new URLSearchParams(queryAt === -1 ? "" : rest.slice(queryAt + 1));
259
+ params.set("tenant", tenant);
260
+ return `${path}?${params.toString()}${hash}`;
261
+ }
262
+ function refKey(ref) {
263
+ if ("key" in ref && typeof ref.key === "string") return ref.key;
264
+ return "";
265
+ }
266
+ const CURRENT = Symbol.for("permdock.current");
267
+ const STORE = Symbol("permdock.store");
268
+ const VALIDATION = {
269
+ outcome: "denied",
270
+ denials: [{
271
+ role: null,
272
+ reason: "validation"
273
+ }],
274
+ alternatives: []
275
+ };
276
+ function report(error) {
277
+ const reporter = globalThis.reportError;
278
+ if (typeof reporter === "function") {
279
+ reporter(error);
280
+ return;
281
+ }
282
+ console.error(error);
283
+ }
284
+ /** The store that emitted `permdock`; a fresh `permdock` follows every change. */
285
+ function storeOf(permdock) {
286
+ return permdock[STORE];
287
+ }
288
+ function needsEndpoint(decision) {
289
+ return decision.outcome === "denied" && decision.denials.some((denial) => denial.reason === "opaque-condition");
290
+ }
291
+ function createClientStore(options) {
292
+ const fetchImpl = options.fetch ?? globalThis.fetch.bind(globalThis);
293
+ const server = options.server ?? globalThis.window === void 0;
294
+ const listeners = /* @__PURE__ */ new Set();
295
+ const answers = /* @__PURE__ */ new Map();
296
+ let emitScheduled = false;
297
+ let snapshot = emptySnapshot();
298
+ let tenant = options.tenant;
299
+ let base = "server-only";
300
+ let instance = fromSnapshot(snapshot, compact({ tenant }));
301
+ let cached;
302
+ let verifying = false;
303
+ let refreshing = 0;
304
+ let awaiting = options.awaiting === true;
305
+ let following = awaiting ? 1 : 0;
306
+ let tracked;
307
+ let refreshSeq = 0;
308
+ let silent = false;
309
+ let adopted;
310
+ let generation = 0;
311
+ let disposed = false;
312
+ let staleNext = options.stale === true;
313
+ let rawJws;
314
+ const request = storeRequest(fetchImpl, () => typeof options.headers === "function" ? options.headers() : options.headers);
315
+ const emit = () => {
316
+ cached = wrap(instance);
317
+ if (silent) return;
318
+ for (const listener of listeners) try {
319
+ listener();
320
+ } catch (error) {
321
+ report(error);
322
+ }
323
+ };
324
+ const emitSoon = () => {
325
+ if (emitScheduled) return;
326
+ emitScheduled = true;
327
+ queueMicrotask(() => {
328
+ emitScheduled = false;
329
+ emit();
330
+ });
331
+ };
332
+ const batch = createBatch({
333
+ endpoint: options.endpoint,
334
+ request,
335
+ answers,
336
+ onServerOnly: options.onServerOnly,
337
+ generation: () => generation,
338
+ snapshot: () => snapshot,
339
+ instance: () => instance,
340
+ emit,
341
+ emitSoon
342
+ });
343
+ const approvals = createApprovals({
344
+ approvals: options.approvals,
345
+ endpoint: options.endpoint,
346
+ interval: options.approvalInterval ?? 2e3,
347
+ server,
348
+ request,
349
+ emit,
350
+ disposed: () => disposed,
351
+ listening: () => listeners.size > 0,
352
+ simulated: () => snapshot.simulated === true
353
+ });
354
+ const reset = () => {
355
+ generation += 1;
356
+ answers.clear();
357
+ decided.clear();
358
+ batch.clear();
359
+ };
360
+ const hydrate = (next) => {
361
+ reset();
362
+ if ((snapshot.subject.principal?.id ?? null) !== (next.subject.principal?.id ?? null)) approvals.forget();
363
+ snapshot = next;
364
+ instance = fromSnapshot(snapshot, compact({ tenant }));
365
+ base = "ready";
366
+ if (staleNext && next.subject.principal !== null) {
367
+ staleNext = false;
368
+ base = "stale";
369
+ }
370
+ const raw = rawJws;
371
+ rawJws = void 0;
372
+ if (!disposed) options.onSnapshot?.(next, tenant, raw);
373
+ emit();
374
+ };
375
+ const storeStatus = () => {
376
+ if (verifying || refreshing > 0 || following > 0) return "pending";
377
+ if (base === "server-only") return "server-only";
378
+ if (base === "stale" || isStale()) return "stale";
379
+ for (const entry of answers.values()) if (entry.status === "pending") return "pending";
380
+ return "ready";
381
+ };
382
+ const isStale = () => {
383
+ const maxAge = snapshot.issuedAt > 0 ? options.maxAge : void 0;
384
+ if (snapshot.expiresAt === void 0 && maxAge === void 0) return false;
385
+ const now = nowSeconds();
386
+ if (snapshot.expiresAt !== void 0 && snapshot.expiresAt <= now) return true;
387
+ return maxAge !== void 0 && now - snapshot.issuedAt > maxAge;
388
+ };
389
+ const serverOnly = () => {
390
+ hydrate(emptySnapshot());
391
+ base = "server-only";
392
+ emit();
393
+ };
394
+ const applyParsed = (value) => {
395
+ try {
396
+ hydrate(parseSnapshot(value));
397
+ } catch {
398
+ serverOnly();
399
+ }
400
+ };
401
+ const verifyJws = async (raw) => {
402
+ if (options.verifier === void 0) return;
403
+ try {
404
+ const verified = await options.verifier.verify(raw, { typ: "permdock-snapshot+jwt" });
405
+ return verified.ok ? verified.claims["snapshot"] : void 0;
406
+ } catch {
407
+ return;
408
+ }
409
+ };
410
+ const bootJws = async (raw) => {
411
+ if (options.verifier === void 0) {
412
+ serverOnly();
413
+ return;
414
+ }
415
+ const started = generation;
416
+ verifying = true;
417
+ emit();
418
+ const claim = await verifyJws(raw);
419
+ verifying = false;
420
+ if (started !== generation) {
421
+ emit();
422
+ return;
423
+ }
424
+ if (claim === void 0) {
425
+ serverOnly();
426
+ return;
427
+ }
428
+ rawJws = raw;
429
+ applyParsed(claim);
430
+ };
431
+ const decided = /* @__PURE__ */ new Map();
432
+ let decidedClear = false;
433
+ const evaluate = (permission, data) => {
434
+ try {
435
+ return instance.decide(permission, data);
436
+ } catch {
437
+ return VALIDATION;
438
+ }
439
+ };
440
+ const decideLocal = (permission, data) => {
441
+ if (options.passCache !== true) return evaluate(permission, data);
442
+ let byKey = decided.get(data);
443
+ const hit = byKey?.get(permission.key);
444
+ if (hit !== void 0) return hit;
445
+ const decision = evaluate(permission, data);
446
+ if (byKey === void 0) {
447
+ byKey = /* @__PURE__ */ new Map();
448
+ decided.set(data, byKey);
449
+ }
450
+ byKey.set(permission.key, decision);
451
+ if (!decidedClear) {
452
+ decidedClear = true;
453
+ queueMicrotask(() => {
454
+ decidedClear = false;
455
+ decided.clear();
456
+ });
457
+ }
458
+ return decision;
459
+ };
460
+ const permissionState = (permission, data) => {
461
+ const decision = decideLocal(permission, data);
462
+ if (decision === VALIDATION) return {
463
+ allowed: false,
464
+ status: "ready",
465
+ decision
466
+ };
467
+ if (needsEndpoint(decision)) {
468
+ let rowKey;
469
+ try {
470
+ rowKey = cacheKey(snapshot, permission, data);
471
+ } catch {
472
+ return {
473
+ allowed: false,
474
+ status: "ready",
475
+ decision: VALIDATION
476
+ };
477
+ }
478
+ const key = `${tenant ?? ""}|${rowKey}`;
479
+ const hit = answers.get(key);
480
+ if (hit !== void 0) return {
481
+ allowed: hit.decision.outcome === "granted",
482
+ status: hit.status,
483
+ decision: hit.decision
484
+ };
485
+ if (server && options.endpoint !== void 0) return {
486
+ allowed: false,
487
+ status: "pending",
488
+ decision: SERVER_ONLY
489
+ };
490
+ batch.enqueue(key, permission, data);
491
+ const next = answers.get(key);
492
+ if (next !== void 0) return {
493
+ allowed: false,
494
+ status: next.status,
495
+ decision: next.decision
496
+ };
497
+ return {
498
+ allowed: false,
499
+ status: "server-only",
500
+ decision: NO_ENDPOINT
501
+ };
502
+ }
503
+ return {
504
+ allowed: decision.outcome === "granted",
505
+ status: verifying || following > 0 ? "pending" : base === "stale" || isStale() ? "stale" : "ready",
506
+ decision
507
+ };
508
+ };
509
+ const subscribe = (listener) => {
510
+ listeners.add(listener);
511
+ if (listeners.size === 1) approvals.resume();
512
+ return () => {
513
+ listeners.delete(listener);
514
+ if (listeners.size === 0) approvals.stop();
515
+ };
516
+ };
517
+ const wrap = (permdock) => {
518
+ const client = {
519
+ ...permdock,
520
+ status(permission, data) {
521
+ if (permission === void 0) return storeStatus();
522
+ return permissionState(permission, data).status;
523
+ },
524
+ invalidate(ref) {
525
+ const prefix = refKey(ref);
526
+ for (const key of answers.keys()) {
527
+ const unscoped = key.slice(key.indexOf("|") + 1);
528
+ if (prefix === "" || unscoped === prefix || unscoped.startsWith(`${prefix}:`) || unscoped.startsWith(`${prefix}.`)) answers.delete(key);
529
+ }
530
+ base = "stale";
531
+ emit();
532
+ },
533
+ async refresh(query) {
534
+ const requested = query?.tenant;
535
+ const source = options.snapshotUrl ?? options.endpoint;
536
+ if (requested !== void 0 && (snapshot.tenants.includes(requested) || source === void 0)) {
537
+ const wasStale = base === "stale";
538
+ tenant = requested;
539
+ hydrate(snapshot);
540
+ if (wasStale) {
541
+ base = "stale";
542
+ emit();
543
+ }
544
+ return;
545
+ }
546
+ if (source === void 0 || disposed) return;
547
+ const started = generation;
548
+ refreshSeq += 1;
549
+ const seq = refreshSeq;
550
+ refreshing += 1;
551
+ emit();
552
+ let body;
553
+ let ok = false;
554
+ try {
555
+ const response = await request(withTenant(source, requested));
556
+ if (response.ok) {
557
+ body = await response.json();
558
+ ok = true;
559
+ }
560
+ } catch {
561
+ ok = false;
562
+ }
563
+ let signed;
564
+ if (ok && typeof body === "string" && isJws(body)) {
565
+ signed = body;
566
+ body = await verifyJws(body);
567
+ ok = body !== void 0;
568
+ }
569
+ refreshing -= 1;
570
+ if (started !== generation || seq !== refreshSeq) {
571
+ emit();
572
+ return;
573
+ }
574
+ let next;
575
+ try {
576
+ next = ok ? parseSnapshot(body) : void 0;
577
+ } catch {
578
+ next = void 0;
579
+ }
580
+ if (next === void 0) {
581
+ base = "stale";
582
+ emit();
583
+ return;
584
+ }
585
+ if (requested !== void 0) tenant = requested;
586
+ staleNext = false;
587
+ rawJws = signed;
588
+ hydrate(next);
589
+ },
590
+ clear() {
591
+ reset();
592
+ tenant = options.tenant;
593
+ snapshot = emptySnapshot();
594
+ instance = fromSnapshot(snapshot, compact({ tenant }));
595
+ base = "server-only";
596
+ approvals.forget();
597
+ if (!disposed) options.onClear?.();
598
+ emit();
599
+ },
600
+ subscribe
601
+ };
602
+ Object.defineProperty(client, CURRENT, { value: () => cached });
603
+ Object.defineProperty(client, STORE, { value: store });
604
+ return client;
605
+ };
606
+ const dispatch = (value) => {
607
+ if (typeof value === "string" && isJws(value)) bootJws(value);
608
+ else applyParsed(value);
609
+ };
610
+ const land = (next) => {
611
+ if (next === void 0) serverOnly();
612
+ else dispatch(next);
613
+ };
614
+ const follow = (value) => {
615
+ const started = generation;
616
+ following += 1;
617
+ emit();
618
+ const settle = (next) => {
619
+ following -= 1;
620
+ if (started !== generation) {
621
+ emit();
622
+ return;
623
+ }
624
+ land(next);
625
+ };
626
+ Promise.resolve(value).then(settle, () => {
627
+ settle(void 0);
628
+ });
629
+ };
630
+ const store = {
631
+ get() {
632
+ return cached;
633
+ },
634
+ subscribe,
635
+ permissionState,
636
+ approvalState: approvals.state,
637
+ replace(value) {
638
+ staleNext = false;
639
+ dispatch(value);
640
+ },
641
+ follow,
642
+ track(value) {
643
+ if (tracked === value) return;
644
+ tracked = value;
645
+ if (awaiting) {
646
+ awaiting = false;
647
+ following -= 1;
648
+ }
649
+ const thenable = value;
650
+ if (thenable.status === "fulfilled") land(thenable.value);
651
+ else if (thenable.status === "rejected") serverOnly();
652
+ else follow(value);
653
+ },
654
+ adopt(value, source) {
655
+ if (adopted === source) return;
656
+ adopted = source;
657
+ reset();
658
+ silent = true;
659
+ try {
660
+ dispatch(value);
661
+ } finally {
662
+ silent = false;
663
+ }
664
+ queueMicrotask(emit);
665
+ },
666
+ snapshot() {
667
+ return snapshot;
668
+ },
669
+ tenant() {
670
+ return tenant;
671
+ },
672
+ dispose() {
673
+ disposed = true;
674
+ generation += 1;
675
+ batch.clear();
676
+ approvals.forget();
677
+ listeners.clear();
678
+ },
679
+ requestApproval: approvals.request
680
+ };
681
+ dispatch(options.snapshot);
682
+ return store;
683
+ }
684
+ //#endregion
685
+ //#region src/client/store-options.ts
686
+ /** One hint per store: the first check `endpoint: false` turns into a `server-only` denial. */
687
+ function hintOnce() {
688
+ let shown = false;
689
+ return (permission) => {
690
+ if (shown) return;
691
+ shown = true;
692
+ console.info(`PermDock: ${permission.key} needs the server (a closure, graph relation or period grant) and endpoint is false, so it is denied with reason server-only; check it on the server instead`);
693
+ };
694
+ }
695
+ function adapterStore(options, snapshot, native) {
696
+ return createClientStore(compact({
697
+ snapshot,
698
+ endpoint: options.endpoint === false ? void 0 : options.endpoint,
699
+ onServerOnly: options.endpoint === false ? hintOnce() : void 0,
700
+ snapshotUrl: options.snapshotUrl,
701
+ approvals: options.approvals,
702
+ tenant: options.tenant,
703
+ fetch: options.fetch,
704
+ headers: options.headers,
705
+ maxAge: options.maxAge,
706
+ verifier: options.verifier,
707
+ awaiting: options.awaiting,
708
+ passCache: options.passCache,
709
+ server: native?.server,
710
+ stale: native?.stale,
711
+ onSnapshot: native?.onSnapshot,
712
+ onClear: native?.onClear
713
+ }));
714
+ }
715
+ //#endregion
716
+ export { isPromiseLike as i, storeOf as n, isJws as r, adapterStore as t };