gemi 0.110.0 → 0.112.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 (264) hide show
  1. package/dist/ai/Agent.d.ts +65 -1
  2. package/dist/ai/Agent.d.ts.map +1 -1
  3. package/dist/ai/AgentController.d.ts +48 -0
  4. package/dist/ai/AgentController.d.ts.map +1 -1
  5. package/dist/ai/client/index.d.ts +1 -1
  6. package/dist/ai/client/index.d.ts.map +1 -1
  7. package/dist/ai/contextCompaction.d.ts +247 -0
  8. package/dist/ai/contextCompaction.d.ts.map +1 -0
  9. package/dist/ai/contextWindow.d.ts +18 -0
  10. package/dist/ai/contextWindow.d.ts.map +1 -1
  11. package/dist/ai/index.d.ts +5 -1
  12. package/dist/ai/index.d.ts.map +1 -1
  13. package/dist/ai/index.js +93 -14
  14. package/dist/ai/index.js.map +16 -10
  15. package/dist/ai/jobs/AgentJob.d.ts +259 -0
  16. package/dist/ai/jobs/AgentJob.d.ts.map +1 -0
  17. package/dist/ai/jobs/AgentJobDeadlineSweep.d.ts +18 -0
  18. package/dist/ai/jobs/AgentJobDeadlineSweep.d.ts.map +1 -0
  19. package/dist/ai/jobs/AgentJobStore.d.ts +141 -0
  20. package/dist/ai/jobs/AgentJobStore.d.ts.map +1 -0
  21. package/dist/ai/jobs/DatabaseAgentJobStore.d.ts +82 -0
  22. package/dist/ai/jobs/DatabaseAgentJobStore.d.ts.map +1 -0
  23. package/dist/ai/jobs/contextBlock.d.ts +31 -0
  24. package/dist/ai/jobs/contextBlock.d.ts.map +1 -0
  25. package/dist/ai/jobs/index.d.ts +6 -0
  26. package/dist/ai/jobs/index.d.ts.map +1 -0
  27. package/dist/ai/jobs/overlay.d.ts +49 -0
  28. package/dist/ai/jobs/overlay.d.ts.map +1 -0
  29. package/dist/ai/providers/request.d.ts.map +1 -1
  30. package/dist/ai/store/Attachments.d.ts +6 -0
  31. package/dist/ai/store/Attachments.d.ts.map +1 -1
  32. package/dist/ai/store/MemoryAgentStore.d.ts +3 -0
  33. package/dist/ai/store/MemoryAgentStore.d.ts.map +1 -1
  34. package/dist/ai/types.d.ts +28 -0
  35. package/dist/ai/types.d.ts.map +1 -1
  36. package/dist/app/index.js +1 -1
  37. package/dist/bin/gemi.js +13 -2
  38. package/dist/bin/gemi.js.map +4 -4
  39. package/dist/bun/plugin.js +1 -1
  40. package/dist/bun/preload.js +1 -1
  41. package/dist/{chunk-30xjcyzh.js → chunk-0z2h35d7.js} +2 -2
  42. package/dist/{chunk-30xjcyzh.js.map → chunk-0z2h35d7.js.map} +1 -1
  43. package/dist/{chunk-358sdcx9.js → chunk-15a1mrdv.js} +2 -2
  44. package/dist/{chunk-358sdcx9.js.map → chunk-15a1mrdv.js.map} +1 -1
  45. package/dist/{chunk-hf7a51s3.js → chunk-18c3y8m3.js} +2 -2
  46. package/dist/{chunk-hf7a51s3.js.map → chunk-18c3y8m3.js.map} +1 -1
  47. package/dist/{chunk-tq85n8zh.js → chunk-1pvkw2pq.js} +2 -2
  48. package/dist/{chunk-tq85n8zh.js.map → chunk-1pvkw2pq.js.map} +1 -1
  49. package/dist/{chunk-8afxrmdc.js → chunk-2taa0brj.js} +2 -2
  50. package/dist/{chunk-8afxrmdc.js.map → chunk-2taa0brj.js.map} +1 -1
  51. package/dist/{chunk-5cygrbxv.js → chunk-30yg31sz.js} +2 -2
  52. package/dist/{chunk-5cygrbxv.js.map → chunk-30yg31sz.js.map} +1 -1
  53. package/dist/{chunk-3y8q8x11.js → chunk-3z9vhjd7.js} +2 -2
  54. package/dist/{chunk-3y8q8x11.js.map → chunk-3z9vhjd7.js.map} +1 -1
  55. package/dist/chunk-4sb1484x.js +46 -0
  56. package/dist/{chunk-h3864a8z.js.map → chunk-4sb1484x.js.map} +13 -4
  57. package/dist/{chunk-0sjh5v1n.js → chunk-53bek7sp.js} +1 -1
  58. package/dist/{chunk-xkc7ftnq.js → chunk-57edag57.js} +3 -3
  59. package/dist/{chunk-xkc7ftnq.js.map → chunk-57edag57.js.map} +1 -1
  60. package/dist/{chunk-ddr4qvvt.js → chunk-5az0mq4p.js} +3 -3
  61. package/dist/{chunk-ddr4qvvt.js.map → chunk-5az0mq4p.js.map} +1 -1
  62. package/dist/{chunk-nsvktvp4.js → chunk-5waxjsvv.js} +2 -2
  63. package/dist/{chunk-nsvktvp4.js.map → chunk-5waxjsvv.js.map} +1 -1
  64. package/dist/{chunk-rfcygmf5.js → chunk-6w79zajj.js} +3 -3
  65. package/dist/{chunk-rfcygmf5.js.map → chunk-6w79zajj.js.map} +1 -1
  66. package/dist/{chunk-gb37722w.js → chunk-75ptmewf.js} +3 -3
  67. package/dist/{chunk-gb37722w.js.map → chunk-75ptmewf.js.map} +1 -1
  68. package/dist/{chunk-pyj7cd9t.js → chunk-851k0b26.js} +2 -2
  69. package/dist/{chunk-pyj7cd9t.js.map → chunk-851k0b26.js.map} +1 -1
  70. package/dist/{chunk-m6ystvtk.js → chunk-8reepafh.js} +2 -2
  71. package/dist/{chunk-m6ystvtk.js.map → chunk-8reepafh.js.map} +1 -1
  72. package/dist/{chunk-nvv9wej6.js → chunk-9hr0bcfy.js} +3 -3
  73. package/dist/{chunk-nvv9wej6.js.map → chunk-9hr0bcfy.js.map} +1 -1
  74. package/dist/{chunk-yqavgpwd.js → chunk-a9q2cr4w.js} +2 -2
  75. package/dist/{chunk-yqavgpwd.js.map → chunk-a9q2cr4w.js.map} +1 -1
  76. package/dist/{chunk-cy5qp6mz.js → chunk-amvy4r59.js} +2 -2
  77. package/dist/{chunk-cy5qp6mz.js.map → chunk-amvy4r59.js.map} +1 -1
  78. package/dist/{chunk-twnn7r66.js → chunk-b1mk12xg.js} +2 -2
  79. package/dist/{chunk-twnn7r66.js.map → chunk-b1mk12xg.js.map} +1 -1
  80. package/dist/{chunk-a6453d9s.js → chunk-b7cqwcbm.js} +2 -2
  81. package/dist/{chunk-a6453d9s.js.map → chunk-b7cqwcbm.js.map} +1 -1
  82. package/dist/{chunk-nncz308h.js → chunk-b7qjp7r1.js} +2 -2
  83. package/dist/{chunk-nncz308h.js.map → chunk-b7qjp7r1.js.map} +1 -1
  84. package/dist/chunk-beks65me.js +19 -0
  85. package/dist/{chunk-mb7q7s0a.js.map → chunk-beks65me.js.map} +3 -4
  86. package/dist/chunk-bf1ets45.js +5 -0
  87. package/dist/{chunk-11fsn5mr.js.map → chunk-bf1ets45.js.map} +4 -3
  88. package/dist/{chunk-9rchedr4.js → chunk-bhw7k8vp.js} +2 -2
  89. package/dist/{chunk-9rchedr4.js.map → chunk-bhw7k8vp.js.map} +1 -1
  90. package/dist/{chunk-k1vw22t2.js → chunk-ck0v2kzw.js} +2 -2
  91. package/dist/{chunk-k1vw22t2.js.map → chunk-ck0v2kzw.js.map} +1 -1
  92. package/dist/{chunk-e1n8zs3h.js → chunk-cptzbdn6.js} +2 -2
  93. package/dist/{chunk-e1n8zs3h.js.map → chunk-cptzbdn6.js.map} +1 -1
  94. package/dist/{chunk-6vr7f5fq.js → chunk-csbc1fxa.js} +3 -3
  95. package/dist/{chunk-6vr7f5fq.js.map → chunk-csbc1fxa.js.map} +1 -1
  96. package/dist/{chunk-kf71mjxa.js → chunk-d0trs736.js} +3 -3
  97. package/dist/{chunk-kf71mjxa.js.map → chunk-d0trs736.js.map} +1 -1
  98. package/dist/{chunk-zhs1r1z0.js → chunk-d8ekyng4.js} +3 -3
  99. package/dist/{chunk-zhs1r1z0.js.map → chunk-d8ekyng4.js.map} +1 -1
  100. package/dist/chunk-d9an2nra.js +5 -0
  101. package/dist/{chunk-hn67spz6.js.map → chunk-d9an2nra.js.map} +1 -1
  102. package/dist/{chunk-0d9qsmx2.js → chunk-dan79jab.js} +2 -2
  103. package/dist/{chunk-0d9qsmx2.js.map → chunk-dan79jab.js.map} +1 -1
  104. package/dist/{chunk-1yx2e0bh.js → chunk-ddad3902.js} +2 -2
  105. package/dist/{chunk-1yx2e0bh.js.map → chunk-ddad3902.js.map} +1 -1
  106. package/dist/{chunk-3cg7y62b.js → chunk-dm59ze55.js} +2 -2
  107. package/dist/{chunk-3cg7y62b.js.map → chunk-dm59ze55.js.map} +1 -1
  108. package/dist/{chunk-wvsv1jgg.js → chunk-dx7wpz5b.js} +2 -2
  109. package/dist/{chunk-wvsv1jgg.js.map → chunk-dx7wpz5b.js.map} +1 -1
  110. package/dist/{chunk-q9s7kwgt.js → chunk-eazqda9z.js} +3 -3
  111. package/dist/{chunk-q9s7kwgt.js.map → chunk-eazqda9z.js.map} +1 -1
  112. package/dist/{chunk-td8tha3j.js → chunk-es487acc.js} +1 -1
  113. package/dist/{chunk-9s851qz8.js → chunk-et3vhkbf.js} +2 -2
  114. package/dist/{chunk-9s851qz8.js.map → chunk-et3vhkbf.js.map} +1 -1
  115. package/dist/{chunk-qd2v93y4.js → chunk-f1y8eggf.js} +2 -2
  116. package/dist/{chunk-qd2v93y4.js.map → chunk-f1y8eggf.js.map} +1 -1
  117. package/dist/{chunk-1pem26zc.js → chunk-ga7c7tq0.js} +3 -3
  118. package/dist/{chunk-1pem26zc.js.map → chunk-ga7c7tq0.js.map} +1 -1
  119. package/dist/{chunk-c098fzvk.js → chunk-gcs9ydjv.js} +2 -2
  120. package/dist/{chunk-c098fzvk.js.map → chunk-gcs9ydjv.js.map} +1 -1
  121. package/dist/{chunk-bn5yn731.js → chunk-hfyxvdjj.js} +2 -2
  122. package/dist/{chunk-bn5yn731.js.map → chunk-hfyxvdjj.js.map} +1 -1
  123. package/dist/chunk-j0sncgxc.js +14 -0
  124. package/dist/{chunk-mn5xw79b.js.map → chunk-j0sncgxc.js.map} +6 -5
  125. package/dist/{chunk-p7r2w4qw.js → chunk-j9jqxv1d.js} +3 -3
  126. package/dist/{chunk-p7r2w4qw.js.map → chunk-j9jqxv1d.js.map} +1 -1
  127. package/dist/{chunk-jbrwt3cs.js → chunk-jdtn0zk2.js} +4 -4
  128. package/dist/{chunk-jbrwt3cs.js.map → chunk-jdtn0zk2.js.map} +1 -1
  129. package/dist/{chunk-s6jjy4y9.js → chunk-jn59bsww.js} +2 -2
  130. package/dist/{chunk-s6jjy4y9.js.map → chunk-jn59bsww.js.map} +1 -1
  131. package/dist/{chunk-he7z7y9j.js → chunk-kk502yk2.js} +2 -2
  132. package/dist/{chunk-he7z7y9j.js.map → chunk-kk502yk2.js.map} +1 -1
  133. package/dist/{chunk-wsttx9rg.js → chunk-mrdarm2q.js} +2 -2
  134. package/dist/{chunk-wsttx9rg.js.map → chunk-mrdarm2q.js.map} +1 -1
  135. package/dist/chunk-mvtgx1mr.js +4 -0
  136. package/dist/{chunk-x78jrs4y.js.map → chunk-mvtgx1mr.js.map} +2 -2
  137. package/dist/{chunk-et4pv1b1.js → chunk-mx9y9mtx.js} +1 -1
  138. package/dist/chunk-nv7mv51r.js +6 -0
  139. package/dist/{chunk-61f4m5px.js.map → chunk-nv7mv51r.js.map} +2 -2
  140. package/dist/{chunk-cttmy1jp.js → chunk-p2fhtf5r.js} +3 -3
  141. package/dist/{chunk-cttmy1jp.js.map → chunk-p2fhtf5r.js.map} +1 -1
  142. package/dist/{chunk-w7jsh3xd.js → chunk-qtbf3w6w.js} +2 -2
  143. package/dist/{chunk-w7jsh3xd.js.map → chunk-qtbf3w6w.js.map} +1 -1
  144. package/dist/chunk-qx87cdfg.js +5 -0
  145. package/dist/chunk-qx87cdfg.js.map +10 -0
  146. package/dist/{chunk-1kr25rcg.js → chunk-qyp652jz.js} +3 -3
  147. package/dist/{chunk-1kr25rcg.js.map → chunk-qyp652jz.js.map} +1 -1
  148. package/dist/{chunk-8b2tw2yp.js → chunk-rend2sbk.js} +1 -1
  149. package/dist/chunk-rx2shb3t.js +25 -0
  150. package/dist/chunk-rx2shb3t.js.map +19 -0
  151. package/dist/{chunk-mwqg079k.js → chunk-ryzcfxq7.js} +2 -2
  152. package/dist/{chunk-mwqg079k.js.map → chunk-ryzcfxq7.js.map} +1 -1
  153. package/dist/{chunk-7tx5y712.js → chunk-s9rfgxj5.js} +2 -2
  154. package/dist/{chunk-7tx5y712.js.map → chunk-s9rfgxj5.js.map} +1 -1
  155. package/dist/{chunk-1c1d0e60.js → chunk-scbvv2e4.js} +3 -3
  156. package/dist/{chunk-1c1d0e60.js.map → chunk-scbvv2e4.js.map} +1 -1
  157. package/dist/chunk-sj8jp4p9.js +24 -0
  158. package/dist/{chunk-k9wgtrc5.js.map → chunk-sj8jp4p9.js.map} +2 -2
  159. package/dist/{chunk-pwmgqq7z.js → chunk-teny6xkw.js} +2 -2
  160. package/dist/{chunk-pwmgqq7z.js.map → chunk-teny6xkw.js.map} +1 -1
  161. package/dist/{chunk-09ypnhjv.js → chunk-tmrmwthr.js} +2 -2
  162. package/dist/{chunk-09ypnhjv.js.map → chunk-tmrmwthr.js.map} +1 -1
  163. package/dist/{chunk-h4sw6nt3.js → chunk-vgdcz7tk.js} +3 -3
  164. package/dist/{chunk-h4sw6nt3.js.map → chunk-vgdcz7tk.js.map} +1 -1
  165. package/dist/{chunk-xk930yaw.js → chunk-wexs11yy.js} +2 -2
  166. package/dist/{chunk-xk930yaw.js.map → chunk-wexs11yy.js.map} +1 -1
  167. package/dist/{chunk-k1xt2tw7.js → chunk-xs4c2nvz.js} +2 -2
  168. package/dist/{chunk-k1xt2tw7.js.map → chunk-xs4c2nvz.js.map} +1 -1
  169. package/dist/{chunk-1va15sfq.js → chunk-xv74rhay.js} +2 -2
  170. package/dist/{chunk-1va15sfq.js.map → chunk-xv74rhay.js.map} +1 -1
  171. package/dist/{chunk-sq2wkynk.js → chunk-yv1psptb.js} +2 -2
  172. package/dist/{chunk-sq2wkynk.js.map → chunk-yv1psptb.js.map} +1 -1
  173. package/dist/{chunk-tk5q8hkv.js → chunk-zfter1x0.js} +4 -4
  174. package/dist/{chunk-tk5q8hkv.js.map → chunk-zfter1x0.js.map} +1 -1
  175. package/dist/client/index.d.ts +2 -0
  176. package/dist/client/index.d.ts.map +1 -1
  177. package/dist/client/index.js +214 -1
  178. package/dist/client/index.js.map +1 -1
  179. package/dist/client/useSubscription.d.ts +70 -0
  180. package/dist/client/useSubscription.d.ts.map +1 -0
  181. package/dist/config/index.js +1 -1
  182. package/dist/console/run.js +2 -2
  183. package/dist/console/run.js.map +2 -2
  184. package/dist/container/index.js +2 -2
  185. package/dist/container/index.js.map +1 -1
  186. package/dist/database/index.js +2 -2
  187. package/dist/database/index.js.map +1 -1
  188. package/dist/email/index.js +2 -2
  189. package/dist/email/index.js.map +1 -1
  190. package/dist/facades/ChangeFeed.d.ts +42 -0
  191. package/dist/facades/ChangeFeed.d.ts.map +1 -0
  192. package/dist/facades/index.d.ts +1 -0
  193. package/dist/facades/index.d.ts.map +1 -1
  194. package/dist/facades/index.js +2 -2
  195. package/dist/facades/index.js.map +1 -1
  196. package/dist/foundation/index.js +2 -2
  197. package/dist/foundation/index.js.map +1 -1
  198. package/dist/http/ResourcePolicy.d.ts +141 -0
  199. package/dist/http/ResourcePolicy.d.ts.map +1 -0
  200. package/dist/http/errors.d.ts +13 -0
  201. package/dist/http/errors.d.ts.map +1 -1
  202. package/dist/http/index.d.ts +2 -1
  203. package/dist/http/index.d.ts.map +1 -1
  204. package/dist/http/index.js +2 -2
  205. package/dist/http/index.js.map +1 -1
  206. package/dist/i18n/dictionaryRuntime.js +2 -2
  207. package/dist/i18n/dictionaryRuntime.js.map +1 -1
  208. package/dist/i18n/index.js +2 -2
  209. package/dist/i18n/index.js.map +2 -2
  210. package/dist/kernel/index.js +3 -3
  211. package/dist/kernel/index.js.map +3 -3
  212. package/dist/kernel/providers.d.ts.map +1 -1
  213. package/dist/orm/index.js +2 -2
  214. package/dist/orm/index.js.map +1 -1
  215. package/dist/server/index.js +2 -2
  216. package/dist/server/index.js.map +1 -1
  217. package/dist/services/change-feed/ChangeFeedDriver.d.ts +94 -0
  218. package/dist/services/change-feed/ChangeFeedDriver.d.ts.map +1 -0
  219. package/dist/services/change-feed/ChangeFeedManager.d.ts +166 -0
  220. package/dist/services/change-feed/ChangeFeedManager.d.ts.map +1 -0
  221. package/dist/services/change-feed/ChangeFeedServiceProvider.d.ts +11 -0
  222. package/dist/services/change-feed/ChangeFeedServiceProvider.d.ts.map +1 -0
  223. package/dist/services/change-feed/DatabaseChangeFeedDriver.d.ts +84 -0
  224. package/dist/services/change-feed/DatabaseChangeFeedDriver.d.ts.map +1 -0
  225. package/dist/services/change-feed/MemoryChangeFeedDriver.d.ts +26 -0
  226. package/dist/services/change-feed/MemoryChangeFeedDriver.d.ts.map +1 -0
  227. package/dist/services/change-feed/changeFeedDriverContract.d.ts +8 -0
  228. package/dist/services/change-feed/changeFeedDriverContract.d.ts.map +1 -0
  229. package/dist/services/change-feed/config.d.ts +42 -0
  230. package/dist/services/change-feed/config.d.ts.map +1 -0
  231. package/dist/services/change-feed/cursor.d.ts +17 -0
  232. package/dist/services/change-feed/cursor.d.ts.map +1 -0
  233. package/dist/services/change-feed/postgresListen.d.ts +30 -0
  234. package/dist/services/change-feed/postgresListen.d.ts.map +1 -0
  235. package/dist/services/change-feed/stream.d.ts +16 -0
  236. package/dist/services/change-feed/stream.d.ts.map +1 -0
  237. package/dist/services/change-feed/wire.d.ts +20 -0
  238. package/dist/services/change-feed/wire.d.ts.map +1 -0
  239. package/dist/services/index.d.ts +9 -0
  240. package/dist/services/index.d.ts.map +1 -1
  241. package/dist/services/index.js +3 -3
  242. package/dist/services/index.js.map +2 -2
  243. package/dist/services/queue/work.js +2 -2
  244. package/dist/services/queue/work.js.map +1 -1
  245. package/dist/services/router/ViewRouteDispatcher.d.ts +16 -0
  246. package/dist/services/router/ViewRouteDispatcher.d.ts.map +1 -1
  247. package/dist/stats/route-table.js +1 -1
  248. package/dist/support/index.js +2 -2
  249. package/dist/support/index.js.map +1 -1
  250. package/dist/vitest/index.js +1 -1
  251. package/package.json +6 -2
  252. package/skills/gemi-react-best-practices/rules/controller-authorize-every-tenant-read.md +16 -1
  253. package/dist/chunk-11fsn5mr.js +0 -5
  254. package/dist/chunk-61f4m5px.js +0 -6
  255. package/dist/chunk-h3864a8z.js +0 -17
  256. package/dist/chunk-hn67spz6.js +0 -5
  257. package/dist/chunk-k9wgtrc5.js +0 -24
  258. package/dist/chunk-mb7q7s0a.js +0 -19
  259. package/dist/chunk-mn5xw79b.js +0 -9
  260. package/dist/chunk-x78jrs4y.js +0 -4
  261. /package/dist/{chunk-0sjh5v1n.js.map → chunk-53bek7sp.js.map} +0 -0
  262. /package/dist/{chunk-td8tha3j.js.map → chunk-es487acc.js.map} +0 -0
  263. /package/dist/{chunk-et4pv1b1.js.map → chunk-mx9y9mtx.js.map} +0 -0
  264. /package/dist/{chunk-8b2tw2yp.js.map → chunk-rend2sbk.js.map} +0 -0
@@ -954,6 +954,219 @@ function useMutate() {
954
954
  };
955
955
  }
956
956
  //#endregion
957
+ //#region client/useSubscription.ts
958
+ var MIN_RETRY_MS = 1e3;
959
+ var MAX_RETRY_MS = 3e4;
960
+ /** The server answered in a way retrying will not change (401, 403, 404). */
961
+ var FatalStatus = class extends Error {
962
+ status;
963
+ constructor(status) {
964
+ super(`The subscription was refused with ${status}.`);
965
+ this.status = status;
966
+ }
967
+ };
968
+ /**
969
+ * Follows a route that answers with `ChangeFeed.stream`, as long as the
970
+ * component is mounted: each change reaches `onChange`, in order, exactly
971
+ * once, across dropped connections and hidden tabs.
972
+ *
973
+ * ```tsx
974
+ * const { status } = useSubscription(
975
+ * "/sites/:siteId/changes",
976
+ * { params: { siteId } },
977
+ * { cursor: site.cursor, onChange: ({ data }) => apply(data), onReset: () => reload() },
978
+ * );
979
+ * ```
980
+ *
981
+ * It reconnects after a drop with backoff (1 s doubling to 30 s, or the
982
+ * server's `Retry-After`), resuming with `Last-Event-ID` from the last event
983
+ * it saw. A `4xx` other than `408` and `429` stops it, with status `closed`.
984
+ * The callbacks may change between renders without reconnecting.
985
+ */
986
+ function useSubscription(url, options = {}, config = {}) {
987
+ const params = {
988
+ ...useParams(),
989
+ ...options.params
990
+ };
991
+ const search = new URLSearchParams(Object.entries(options.search ?? {}).filter(([, value]) => value !== null && value !== void 0).map(([key, value]) => [key, String(value)]));
992
+ search.sort();
993
+ const endpoint = `/api${[applyParams$1(String(url), params), search.toString()].filter(Boolean).join("?")}`;
994
+ const enabled = config.enabled !== false;
995
+ const pauseWhenHidden = config.pauseWhenHidden !== false;
996
+ const callbacks = useRef(config);
997
+ useEffect(() => {
998
+ callbacks.current = config;
999
+ });
1000
+ const cursor = useRef(config.cursor ?? null);
1001
+ const [state, setState] = useState({
1002
+ status: enabled ? "connecting" : "closed",
1003
+ cursor: cursor.current,
1004
+ error: null
1005
+ });
1006
+ useEffect(() => {
1007
+ cursor.current = config.cursor ?? null;
1008
+ }, [endpoint, config.cursor]);
1009
+ useEffect(() => {
1010
+ if (!enabled) {
1011
+ setState((s) => ({
1012
+ ...s,
1013
+ status: "closed"
1014
+ }));
1015
+ return;
1016
+ }
1017
+ let stopped = false;
1018
+ let request = null;
1019
+ let resume = null;
1020
+ let retryMs = MIN_RETRY_MS;
1021
+ const hidden = () => pauseWhenHidden && typeof document !== "undefined" && document.visibilityState === "hidden";
1022
+ const onVisibilityChange = () => {
1023
+ if (hidden()) request?.abort();
1024
+ else resume?.();
1025
+ };
1026
+ if (typeof document !== "undefined") document.addEventListener("visibilitychange", onVisibilityChange);
1027
+ const wait = (ms) => new Promise((resolve) => {
1028
+ const timer = setTimeout(done, ms);
1029
+ function done() {
1030
+ clearTimeout(timer);
1031
+ resume = null;
1032
+ resolve();
1033
+ }
1034
+ resume = done;
1035
+ });
1036
+ (async () => {
1037
+ while (!stopped) {
1038
+ if (hidden()) {
1039
+ setState((s) => ({
1040
+ ...s,
1041
+ status: "paused"
1042
+ }));
1043
+ await new Promise((resolve) => resume = resolve);
1044
+ resume = null;
1045
+ continue;
1046
+ }
1047
+ setState((s) => ({
1048
+ ...s,
1049
+ status: "connecting"
1050
+ }));
1051
+ const controller = request = new AbortController();
1052
+ let delay = retryMs;
1053
+ try {
1054
+ const headers = { Accept: "text/event-stream" };
1055
+ if (cursor.current) headers["Last-Event-ID"] = cursor.current;
1056
+ const response = await fetch(endpoint, {
1057
+ headers,
1058
+ signal: controller.signal
1059
+ });
1060
+ if (!response.ok || !response.body) {
1061
+ const status = response.status;
1062
+ if (status >= 400 && status < 500 && status !== 408 && status !== 429) throw new FatalStatus(status);
1063
+ const retryAfter = Number(response.headers.get("Retry-After"));
1064
+ if (Number.isFinite(retryAfter) && retryAfter > 0) delay = retryAfter * 1e3;
1065
+ throw new Error(`The subscription answered ${status}.`);
1066
+ }
1067
+ for await (const { id, message } of readEvents(response.body)) {
1068
+ if (stopped) return;
1069
+ if (id !== void 0) cursor.current = id;
1070
+ if (message.type === "ready") {
1071
+ retryMs = MIN_RETRY_MS;
1072
+ delay = MIN_RETRY_MS;
1073
+ setState({
1074
+ status: "open",
1075
+ cursor: cursor.current,
1076
+ error: null
1077
+ });
1078
+ } else {
1079
+ setState((s) => ({
1080
+ ...s,
1081
+ cursor: cursor.current
1082
+ }));
1083
+ if (message.type === "change") callbacks.current.onChange?.(message);
1084
+ else if (message.type === "reset") callbacks.current.onReset?.(message);
1085
+ }
1086
+ }
1087
+ } catch (error) {
1088
+ if (stopped) return;
1089
+ if (error instanceof FatalStatus) {
1090
+ setState((s) => ({
1091
+ ...s,
1092
+ status: "closed",
1093
+ error
1094
+ }));
1095
+ return;
1096
+ }
1097
+ if (controller.signal.aborted) continue;
1098
+ setState((s) => ({
1099
+ ...s,
1100
+ error
1101
+ }));
1102
+ }
1103
+ if (stopped || controller.signal.aborted) continue;
1104
+ setState((s) => ({
1105
+ ...s,
1106
+ status: "connecting"
1107
+ }));
1108
+ await wait(delay);
1109
+ retryMs = Math.min(retryMs * 2, MAX_RETRY_MS);
1110
+ }
1111
+ })();
1112
+ return () => {
1113
+ stopped = true;
1114
+ request?.abort();
1115
+ resume?.();
1116
+ if (typeof document !== "undefined") document.removeEventListener("visibilitychange", onVisibilityChange);
1117
+ };
1118
+ }, [
1119
+ endpoint,
1120
+ enabled,
1121
+ pauseWhenHidden,
1122
+ config.cursor
1123
+ ]);
1124
+ return state;
1125
+ }
1126
+ /**
1127
+ * The events of an SSE body: `id` and the JSON `data`. Comments (keepalives)
1128
+ * and events without data are skipped; an event whose data is not JSON is
1129
+ * dropped rather than ending the stream.
1130
+ */
1131
+ async function* readEvents(body) {
1132
+ const reader = body.getReader();
1133
+ const decoder = new TextDecoder();
1134
+ let buffer = "";
1135
+ try {
1136
+ for (;;) {
1137
+ const { done, value } = await reader.read();
1138
+ if (done) return;
1139
+ buffer = (buffer + decoder.decode(value, { stream: true })).replace(/\r\n?/g, "\n");
1140
+ let boundary = buffer.indexOf("\n\n");
1141
+ while (boundary !== -1) {
1142
+ const block = buffer.slice(0, boundary);
1143
+ buffer = buffer.slice(boundary + 2);
1144
+ boundary = buffer.indexOf("\n\n");
1145
+ let id;
1146
+ const data = [];
1147
+ for (const line of block.split("\n")) {
1148
+ if (line === "" || line.startsWith(":")) continue;
1149
+ const colon = line.indexOf(":");
1150
+ const field = colon === -1 ? line : line.slice(0, colon);
1151
+ let text = colon === -1 ? "" : line.slice(colon + 1);
1152
+ if (text.startsWith(" ")) text = text.slice(1);
1153
+ if (field === "id") id = text;
1154
+ else if (field === "data") data.push(text);
1155
+ }
1156
+ if (data.length === 0) continue;
1157
+ try {
1158
+ yield {
1159
+ id,
1160
+ message: JSON.parse(data.join("\n"))
1161
+ };
1162
+ } catch {}
1163
+ }
1164
+ }
1165
+ } finally {
1166
+ await reader.cancel().catch(() => {});
1167
+ }
1168
+ }
1169
+ //#endregion
957
1170
  //#region client/Mutation.tsx
958
1171
  var MutationContext = createContext({
959
1172
  isPending: false,
@@ -2767,6 +2980,6 @@ function island(loader, options = {}) {
2767
2980
  return Island;
2768
2981
  }
2769
2982
  //#endregion
2770
- export { CHUNK_RELOAD_MARKER, Form, FormError, FormFieldContainer, Head, Image, Link, OpenGraphImage, QueryError, QueryManagerProvider, Redirect, ValidationErrors, create, createRoot, defineDictionary, init, isAuthenticationError, isChunkLoadError, isCsrfError, isFormError, isHttpError, isNetworkError, isNotFoundError, isPermissionError, isRateLimitError, isRetryableQueryError, isServerError, isValidationError, island, mutationErrorKind, recoverFromChunkLoadError, useAppIdMissmatch, useBreadcrumbs, useDelete, useDictionary, useDomain, useEmailCode, useFeature, useFeatures, useForgotPassword, useFormData, useFormStatus, useFormatter, useInfiniteQuery, useIntendedUrl, useIsNavigationPending, useLocale, useLocation, useMutate, useMutation, useMutationStatus, useNavigate, useNavigationProgress, useParams, usePatch, usePost, usePrefetch, usePut, useQuery, useResetPassword, useRoute, useRouteTransition, useSearchParams, useSignIn, useSignOut, useSignUp, useTheme, useTranslator, useUpload, useUser };
2983
+ export { CHUNK_RELOAD_MARKER, Form, FormError, FormFieldContainer, Head, Image, Link, OpenGraphImage, QueryError, QueryManagerProvider, Redirect, ValidationErrors, create, createRoot, defineDictionary, init, isAuthenticationError, isChunkLoadError, isCsrfError, isFormError, isHttpError, isNetworkError, isNotFoundError, isPermissionError, isRateLimitError, isRetryableQueryError, isServerError, isValidationError, island, mutationErrorKind, recoverFromChunkLoadError, useAppIdMissmatch, useBreadcrumbs, useDelete, useDictionary, useDomain, useEmailCode, useFeature, useFeatures, useForgotPassword, useFormData, useFormStatus, useFormatter, useInfiniteQuery, useIntendedUrl, useIsNavigationPending, useLocale, useLocation, useMutate, useMutation, useMutationStatus, useNavigate, useNavigationProgress, useParams, usePatch, usePost, usePrefetch, usePut, useQuery, useResetPassword, useRoute, useRouteTransition, useSearchParams, useSignIn, useSignOut, useSignUp, useSubscription, useTheme, useTranslator, useUpload, useUser };
2771
2984
 
2772
2985
  //# sourceMappingURL=index.js.map