lightclawbot 1.1.2 → 1.2.0-beta.1

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 (397) hide show
  1. package/README.md +0 -1
  2. package/dist/index.js +38 -31
  3. package/dist/setup-entry.js +32 -0
  4. package/dist/src/channel.js +166 -253
  5. package/dist/src/channel.setup.js +16 -0
  6. package/dist/src/config.js +31 -124
  7. package/dist/src/dedup.js +0 -1
  8. package/dist/src/download-tool.js +0 -1
  9. package/dist/src/file-storage.js +2 -2
  10. package/dist/src/gateway.js +224 -178
  11. package/dist/src/history/cron-utils.js +0 -1
  12. package/dist/src/history/index.js +0 -1
  13. package/dist/src/history/message-parser.js +0 -1
  14. package/dist/src/history/session-reader.js +3 -1
  15. package/dist/src/history/session-store.js +0 -1
  16. package/dist/src/history/text-processing.js +0 -1
  17. package/dist/src/history/types.js +0 -1
  18. package/dist/src/inbound.js +165 -234
  19. package/dist/src/media.js +0 -1
  20. package/dist/src/messaging.js +65 -0
  21. package/dist/src/outbound.js +129 -45
  22. package/dist/src/runtime.js +9 -11
  23. package/dist/src/setup-core.js +27 -0
  24. package/dist/src/shared.js +141 -0
  25. package/dist/src/socket/handlers.js +72 -49
  26. package/dist/src/socket/index.js +0 -1
  27. package/dist/src/socket/native-socket.js +385 -0
  28. package/dist/src/socket/registry.js +0 -1
  29. package/dist/src/socket/reliable-emitter.js +188 -50
  30. package/dist/src/streaming/delta-tracker.js +140 -0
  31. package/dist/src/streaming/index.js +12 -0
  32. package/dist/src/streaming/stream-reply-sink.js +387 -0
  33. package/dist/src/streaming/types.js +4 -0
  34. package/dist/src/tools.js +13 -0
  35. package/dist/src/types.js +22 -2
  36. package/dist/src/upload-tool.js +0 -1
  37. package/dist/src/utils/account.js +73 -0
  38. package/dist/src/utils/common.js +48 -0
  39. package/dist/src/utils/index.js +2 -0
  40. package/node_modules/ws/index.js +22 -0
  41. package/node_modules/{engine.io-client/node_modules/ws → ws}/lib/constants.js +1 -0
  42. package/node_modules/{engine.io-client/node_modules/ws → ws}/lib/permessage-deflate.js +6 -6
  43. package/node_modules/{engine.io-client/node_modules/ws → ws}/lib/websocket-server.js +10 -6
  44. package/node_modules/{engine.io-client/node_modules/ws → ws}/lib/websocket.js +19 -14
  45. package/node_modules/{engine.io-client/node_modules/ws → ws}/package.json +4 -3
  46. package/node_modules/ws/wrapper.mjs +21 -0
  47. package/openclaw.plugin.json +0 -7
  48. package/package.json +8 -5
  49. package/dist/index.d.ts +0 -24
  50. package/dist/index.d.ts.map +0 -1
  51. package/dist/index.js.map +0 -1
  52. package/dist/public/data/scripts/manifest.json +0 -11
  53. package/dist/public/data/scripts/preflight.9af62b39.sh +0 -191
  54. package/dist/public/data/scripts/preflight.sh +0 -191
  55. package/dist/src/channel.d.ts +0 -11
  56. package/dist/src/channel.d.ts.map +0 -1
  57. package/dist/src/channel.js.map +0 -1
  58. package/dist/src/config.d.ts +0 -129
  59. package/dist/src/config.d.ts.map +0 -1
  60. package/dist/src/config.js.map +0 -1
  61. package/dist/src/dedup.d.ts +0 -12
  62. package/dist/src/dedup.d.ts.map +0 -1
  63. package/dist/src/dedup.js.map +0 -1
  64. package/dist/src/download-tool.d.ts +0 -32
  65. package/dist/src/download-tool.d.ts.map +0 -1
  66. package/dist/src/download-tool.js.map +0 -1
  67. package/dist/src/file-storage.d.ts +0 -74
  68. package/dist/src/file-storage.d.ts.map +0 -1
  69. package/dist/src/file-storage.js.map +0 -1
  70. package/dist/src/format-urls.d.ts +0 -26
  71. package/dist/src/format-urls.d.ts.map +0 -1
  72. package/dist/src/format-urls.js +0 -53
  73. package/dist/src/format-urls.js.map +0 -1
  74. package/dist/src/gateway.d.ts +0 -16
  75. package/dist/src/gateway.d.ts.map +0 -1
  76. package/dist/src/gateway.js.map +0 -1
  77. package/dist/src/history/cron-utils.d.ts +0 -76
  78. package/dist/src/history/cron-utils.d.ts.map +0 -1
  79. package/dist/src/history/cron-utils.js.map +0 -1
  80. package/dist/src/history/index.d.ts +0 -20
  81. package/dist/src/history/index.d.ts.map +0 -1
  82. package/dist/src/history/index.js.map +0 -1
  83. package/dist/src/history/message-parser.d.ts +0 -52
  84. package/dist/src/history/message-parser.d.ts.map +0 -1
  85. package/dist/src/history/message-parser.js.map +0 -1
  86. package/dist/src/history/session-reader.d.ts +0 -58
  87. package/dist/src/history/session-reader.d.ts.map +0 -1
  88. package/dist/src/history/session-reader.js.map +0 -1
  89. package/dist/src/history/session-store.d.ts +0 -42
  90. package/dist/src/history/session-store.d.ts.map +0 -1
  91. package/dist/src/history/session-store.js.map +0 -1
  92. package/dist/src/history/text-processing.d.ts +0 -41
  93. package/dist/src/history/text-processing.d.ts.map +0 -1
  94. package/dist/src/history/text-processing.js.map +0 -1
  95. package/dist/src/history/types.d.ts +0 -134
  96. package/dist/src/history/types.d.ts.map +0 -1
  97. package/dist/src/history/types.js.map +0 -1
  98. package/dist/src/inbound.d.ts +0 -18
  99. package/dist/src/inbound.d.ts.map +0 -1
  100. package/dist/src/inbound.js.map +0 -1
  101. package/dist/src/media.d.ts +0 -12
  102. package/dist/src/media.d.ts.map +0 -1
  103. package/dist/src/media.js.map +0 -1
  104. package/dist/src/outbound.d.ts +0 -28
  105. package/dist/src/outbound.d.ts.map +0 -1
  106. package/dist/src/outbound.js.map +0 -1
  107. package/dist/src/runtime.d.ts +0 -4
  108. package/dist/src/runtime.d.ts.map +0 -1
  109. package/dist/src/runtime.js.map +0 -1
  110. package/dist/src/socket/handlers.d.ts +0 -26
  111. package/dist/src/socket/handlers.d.ts.map +0 -1
  112. package/dist/src/socket/handlers.js.map +0 -1
  113. package/dist/src/socket/index.d.ts +0 -11
  114. package/dist/src/socket/index.d.ts.map +0 -1
  115. package/dist/src/socket/index.js.map +0 -1
  116. package/dist/src/socket/registry.d.ts +0 -59
  117. package/dist/src/socket/registry.d.ts.map +0 -1
  118. package/dist/src/socket/registry.js.map +0 -1
  119. package/dist/src/socket/reliable-emitter.d.ts +0 -79
  120. package/dist/src/socket/reliable-emitter.d.ts.map +0 -1
  121. package/dist/src/socket/reliable-emitter.js.map +0 -1
  122. package/dist/src/types.d.ts +0 -112
  123. package/dist/src/types.d.ts.map +0 -1
  124. package/dist/src/types.js.map +0 -1
  125. package/dist/src/upload-tool.d.ts +0 -27
  126. package/dist/src/upload-tool.d.ts.map +0 -1
  127. package/dist/src/upload-tool.js.map +0 -1
  128. package/node_modules/@socket.io/component-emitter/LICENSE +0 -24
  129. package/node_modules/@socket.io/component-emitter/Readme.md +0 -79
  130. package/node_modules/@socket.io/component-emitter/lib/cjs/index.d.ts +0 -179
  131. package/node_modules/@socket.io/component-emitter/lib/cjs/index.js +0 -176
  132. package/node_modules/@socket.io/component-emitter/lib/cjs/package.json +0 -4
  133. package/node_modules/@socket.io/component-emitter/lib/esm/index.d.ts +0 -179
  134. package/node_modules/@socket.io/component-emitter/lib/esm/index.js +0 -169
  135. package/node_modules/@socket.io/component-emitter/lib/esm/package.json +0 -4
  136. package/node_modules/@socket.io/component-emitter/package.json +0 -28
  137. package/node_modules/debug/LICENSE +0 -20
  138. package/node_modules/debug/README.md +0 -481
  139. package/node_modules/debug/package.json +0 -64
  140. package/node_modules/debug/src/browser.js +0 -272
  141. package/node_modules/debug/src/common.js +0 -292
  142. package/node_modules/debug/src/index.js +0 -10
  143. package/node_modules/debug/src/node.js +0 -263
  144. package/node_modules/engine.io-client/LICENSE +0 -22
  145. package/node_modules/engine.io-client/README.md +0 -331
  146. package/node_modules/engine.io-client/build/cjs/browser-entrypoint.d.ts +0 -3
  147. package/node_modules/engine.io-client/build/cjs/browser-entrypoint.js +0 -4
  148. package/node_modules/engine.io-client/build/cjs/contrib/has-cors.d.ts +0 -1
  149. package/node_modules/engine.io-client/build/cjs/contrib/has-cors.js +0 -14
  150. package/node_modules/engine.io-client/build/cjs/contrib/parseqs.d.ts +0 -15
  151. package/node_modules/engine.io-client/build/cjs/contrib/parseqs.js +0 -38
  152. package/node_modules/engine.io-client/build/cjs/contrib/parseuri.d.ts +0 -1
  153. package/node_modules/engine.io-client/build/cjs/contrib/parseuri.js +0 -67
  154. package/node_modules/engine.io-client/build/cjs/globals.d.ts +0 -4
  155. package/node_modules/engine.io-client/build/cjs/globals.js +0 -26
  156. package/node_modules/engine.io-client/build/cjs/globals.node.d.ts +0 -21
  157. package/node_modules/engine.io-client/build/cjs/globals.node.js +0 -97
  158. package/node_modules/engine.io-client/build/cjs/index.d.ts +0 -15
  159. package/node_modules/engine.io-client/build/cjs/index.js +0 -32
  160. package/node_modules/engine.io-client/build/cjs/package.json +0 -10
  161. package/node_modules/engine.io-client/build/cjs/socket.d.ts +0 -482
  162. package/node_modules/engine.io-client/build/cjs/socket.js +0 -765
  163. package/node_modules/engine.io-client/build/cjs/transport.d.ts +0 -106
  164. package/node_modules/engine.io-client/build/cjs/transport.js +0 -153
  165. package/node_modules/engine.io-client/build/cjs/transports/index.d.ts +0 -8
  166. package/node_modules/engine.io-client/build/cjs/transports/index.js +0 -11
  167. package/node_modules/engine.io-client/build/cjs/transports/polling-fetch.d.ts +0 -15
  168. package/node_modules/engine.io-client/build/cjs/transports/polling-fetch.js +0 -60
  169. package/node_modules/engine.io-client/build/cjs/transports/polling-xhr.d.ts +0 -108
  170. package/node_modules/engine.io-client/build/cjs/transports/polling-xhr.js +0 -285
  171. package/node_modules/engine.io-client/build/cjs/transports/polling-xhr.node.d.ts +0 -11
  172. package/node_modules/engine.io-client/build/cjs/transports/polling-xhr.node.js +0 -44
  173. package/node_modules/engine.io-client/build/cjs/transports/polling.d.ts +0 -52
  174. package/node_modules/engine.io-client/build/cjs/transports/polling.js +0 -165
  175. package/node_modules/engine.io-client/build/cjs/transports/websocket.d.ts +0 -36
  176. package/node_modules/engine.io-client/build/cjs/transports/websocket.js +0 -136
  177. package/node_modules/engine.io-client/build/cjs/transports/websocket.node.d.ts +0 -14
  178. package/node_modules/engine.io-client/build/cjs/transports/websocket.node.js +0 -68
  179. package/node_modules/engine.io-client/build/cjs/transports/webtransport.d.ts +0 -18
  180. package/node_modules/engine.io-client/build/cjs/transports/webtransport.js +0 -94
  181. package/node_modules/engine.io-client/build/cjs/util.d.ts +0 -7
  182. package/node_modules/engine.io-client/build/cjs/util.js +0 -65
  183. package/node_modules/engine.io-client/build/esm/browser-entrypoint.d.ts +0 -3
  184. package/node_modules/engine.io-client/build/esm/browser-entrypoint.js +0 -2
  185. package/node_modules/engine.io-client/build/esm/contrib/has-cors.d.ts +0 -1
  186. package/node_modules/engine.io-client/build/esm/contrib/has-cors.js +0 -11
  187. package/node_modules/engine.io-client/build/esm/contrib/parseqs.d.ts +0 -15
  188. package/node_modules/engine.io-client/build/esm/contrib/parseqs.js +0 -34
  189. package/node_modules/engine.io-client/build/esm/contrib/parseuri.d.ts +0 -1
  190. package/node_modules/engine.io-client/build/esm/contrib/parseuri.js +0 -64
  191. package/node_modules/engine.io-client/build/esm/globals.d.ts +0 -4
  192. package/node_modules/engine.io-client/build/esm/globals.js +0 -22
  193. package/node_modules/engine.io-client/build/esm/globals.node.d.ts +0 -21
  194. package/node_modules/engine.io-client/build/esm/globals.node.js +0 -91
  195. package/node_modules/engine.io-client/build/esm/index.d.ts +0 -15
  196. package/node_modules/engine.io-client/build/esm/index.js +0 -15
  197. package/node_modules/engine.io-client/build/esm/package.json +0 -10
  198. package/node_modules/engine.io-client/build/esm/socket.d.ts +0 -482
  199. package/node_modules/engine.io-client/build/esm/socket.js +0 -727
  200. package/node_modules/engine.io-client/build/esm/transport.d.ts +0 -106
  201. package/node_modules/engine.io-client/build/esm/transport.js +0 -142
  202. package/node_modules/engine.io-client/build/esm/transports/index.d.ts +0 -8
  203. package/node_modules/engine.io-client/build/esm/transports/index.js +0 -8
  204. package/node_modules/engine.io-client/build/esm/transports/polling-fetch.d.ts +0 -15
  205. package/node_modules/engine.io-client/build/esm/transports/polling-fetch.js +0 -56
  206. package/node_modules/engine.io-client/build/esm/transports/polling-xhr.d.ts +0 -108
  207. package/node_modules/engine.io-client/build/esm/transports/polling-xhr.js +0 -271
  208. package/node_modules/engine.io-client/build/esm/transports/polling-xhr.node.d.ts +0 -11
  209. package/node_modules/engine.io-client/build/esm/transports/polling-xhr.node.js +0 -17
  210. package/node_modules/engine.io-client/build/esm/transports/polling.d.ts +0 -52
  211. package/node_modules/engine.io-client/build/esm/transports/polling.js +0 -145
  212. package/node_modules/engine.io-client/build/esm/transports/websocket.d.ts +0 -36
  213. package/node_modules/engine.io-client/build/esm/transports/websocket.js +0 -125
  214. package/node_modules/engine.io-client/build/esm/transports/websocket.node.d.ts +0 -14
  215. package/node_modules/engine.io-client/build/esm/transports/websocket.node.js +0 -41
  216. package/node_modules/engine.io-client/build/esm/transports/webtransport.d.ts +0 -18
  217. package/node_modules/engine.io-client/build/esm/transports/webtransport.js +0 -80
  218. package/node_modules/engine.io-client/build/esm/util.d.ts +0 -7
  219. package/node_modules/engine.io-client/build/esm/util.js +0 -59
  220. package/node_modules/engine.io-client/build/esm-debug/browser-entrypoint.d.ts +0 -3
  221. package/node_modules/engine.io-client/build/esm-debug/browser-entrypoint.js +0 -2
  222. package/node_modules/engine.io-client/build/esm-debug/contrib/has-cors.d.ts +0 -1
  223. package/node_modules/engine.io-client/build/esm-debug/contrib/has-cors.js +0 -11
  224. package/node_modules/engine.io-client/build/esm-debug/contrib/parseqs.d.ts +0 -15
  225. package/node_modules/engine.io-client/build/esm-debug/contrib/parseqs.js +0 -34
  226. package/node_modules/engine.io-client/build/esm-debug/contrib/parseuri.d.ts +0 -1
  227. package/node_modules/engine.io-client/build/esm-debug/contrib/parseuri.js +0 -64
  228. package/node_modules/engine.io-client/build/esm-debug/globals.d.ts +0 -4
  229. package/node_modules/engine.io-client/build/esm-debug/globals.js +0 -22
  230. package/node_modules/engine.io-client/build/esm-debug/globals.node.d.ts +0 -21
  231. package/node_modules/engine.io-client/build/esm-debug/globals.node.js +0 -91
  232. package/node_modules/engine.io-client/build/esm-debug/index.d.ts +0 -15
  233. package/node_modules/engine.io-client/build/esm-debug/index.js +0 -15
  234. package/node_modules/engine.io-client/build/esm-debug/package.json +0 -10
  235. package/node_modules/engine.io-client/build/esm-debug/socket.d.ts +0 -482
  236. package/node_modules/engine.io-client/build/esm-debug/socket.js +0 -756
  237. package/node_modules/engine.io-client/build/esm-debug/transport.d.ts +0 -106
  238. package/node_modules/engine.io-client/build/esm-debug/transport.js +0 -145
  239. package/node_modules/engine.io-client/build/esm-debug/transports/index.d.ts +0 -8
  240. package/node_modules/engine.io-client/build/esm-debug/transports/index.js +0 -8
  241. package/node_modules/engine.io-client/build/esm-debug/transports/polling-fetch.d.ts +0 -15
  242. package/node_modules/engine.io-client/build/esm-debug/transports/polling-fetch.js +0 -56
  243. package/node_modules/engine.io-client/build/esm-debug/transports/polling-xhr.d.ts +0 -108
  244. package/node_modules/engine.io-client/build/esm-debug/transports/polling-xhr.js +0 -276
  245. package/node_modules/engine.io-client/build/esm-debug/transports/polling-xhr.node.d.ts +0 -11
  246. package/node_modules/engine.io-client/build/esm-debug/transports/polling-xhr.node.js +0 -17
  247. package/node_modules/engine.io-client/build/esm-debug/transports/polling.d.ts +0 -52
  248. package/node_modules/engine.io-client/build/esm-debug/transports/polling.js +0 -158
  249. package/node_modules/engine.io-client/build/esm-debug/transports/websocket.d.ts +0 -36
  250. package/node_modules/engine.io-client/build/esm-debug/transports/websocket.js +0 -128
  251. package/node_modules/engine.io-client/build/esm-debug/transports/websocket.node.d.ts +0 -14
  252. package/node_modules/engine.io-client/build/esm-debug/transports/websocket.node.js +0 -41
  253. package/node_modules/engine.io-client/build/esm-debug/transports/webtransport.d.ts +0 -18
  254. package/node_modules/engine.io-client/build/esm-debug/transports/webtransport.js +0 -87
  255. package/node_modules/engine.io-client/build/esm-debug/util.d.ts +0 -7
  256. package/node_modules/engine.io-client/build/esm-debug/util.js +0 -59
  257. package/node_modules/engine.io-client/dist/engine.io.esm.min.js +0 -7
  258. package/node_modules/engine.io-client/dist/engine.io.esm.min.js.map +0 -1
  259. package/node_modules/engine.io-client/dist/engine.io.js +0 -3064
  260. package/node_modules/engine.io-client/dist/engine.io.js.map +0 -1
  261. package/node_modules/engine.io-client/dist/engine.io.min.js +0 -7
  262. package/node_modules/engine.io-client/dist/engine.io.min.js.map +0 -1
  263. package/node_modules/engine.io-client/node_modules/ws/index.js +0 -13
  264. package/node_modules/engine.io-client/node_modules/ws/wrapper.mjs +0 -8
  265. package/node_modules/engine.io-client/package.json +0 -95
  266. package/node_modules/engine.io-parser/LICENSE +0 -22
  267. package/node_modules/engine.io-parser/Readme.md +0 -158
  268. package/node_modules/engine.io-parser/build/cjs/commons.d.ts +0 -14
  269. package/node_modules/engine.io-parser/build/cjs/commons.js +0 -19
  270. package/node_modules/engine.io-parser/build/cjs/contrib/base64-arraybuffer.d.ts +0 -2
  271. package/node_modules/engine.io-parser/build/cjs/contrib/base64-arraybuffer.js +0 -48
  272. package/node_modules/engine.io-parser/build/cjs/decodePacket.browser.d.ts +0 -2
  273. package/node_modules/engine.io-parser/build/cjs/decodePacket.browser.js +0 -66
  274. package/node_modules/engine.io-parser/build/cjs/decodePacket.d.ts +0 -2
  275. package/node_modules/engine.io-parser/build/cjs/decodePacket.js +0 -59
  276. package/node_modules/engine.io-parser/build/cjs/encodePacket.browser.d.ts +0 -4
  277. package/node_modules/engine.io-parser/build/cjs/encodePacket.browser.js +0 -72
  278. package/node_modules/engine.io-parser/build/cjs/encodePacket.d.ts +0 -3
  279. package/node_modules/engine.io-parser/build/cjs/encodePacket.js +0 -38
  280. package/node_modules/engine.io-parser/build/cjs/index.d.ts +0 -9
  281. package/node_modules/engine.io-parser/build/cjs/index.js +0 -164
  282. package/node_modules/engine.io-parser/build/cjs/package.json +0 -8
  283. package/node_modules/engine.io-parser/build/esm/commons.d.ts +0 -14
  284. package/node_modules/engine.io-parser/build/esm/commons.js +0 -14
  285. package/node_modules/engine.io-parser/build/esm/contrib/base64-arraybuffer.d.ts +0 -2
  286. package/node_modules/engine.io-parser/build/esm/contrib/base64-arraybuffer.js +0 -43
  287. package/node_modules/engine.io-parser/build/esm/decodePacket.browser.d.ts +0 -2
  288. package/node_modules/engine.io-parser/build/esm/decodePacket.browser.js +0 -62
  289. package/node_modules/engine.io-parser/build/esm/decodePacket.d.ts +0 -2
  290. package/node_modules/engine.io-parser/build/esm/decodePacket.js +0 -55
  291. package/node_modules/engine.io-parser/build/esm/encodePacket.browser.d.ts +0 -4
  292. package/node_modules/engine.io-parser/build/esm/encodePacket.browser.js +0 -68
  293. package/node_modules/engine.io-parser/build/esm/encodePacket.d.ts +0 -3
  294. package/node_modules/engine.io-parser/build/esm/encodePacket.js +0 -33
  295. package/node_modules/engine.io-parser/build/esm/index.d.ts +0 -9
  296. package/node_modules/engine.io-parser/build/esm/index.js +0 -156
  297. package/node_modules/engine.io-parser/build/esm/package.json +0 -8
  298. package/node_modules/engine.io-parser/package.json +0 -46
  299. package/node_modules/ms/index.js +0 -162
  300. package/node_modules/ms/license.md +0 -21
  301. package/node_modules/ms/package.json +0 -38
  302. package/node_modules/ms/readme.md +0 -59
  303. package/node_modules/socket.io-client/LICENSE +0 -21
  304. package/node_modules/socket.io-client/README.md +0 -29
  305. package/node_modules/socket.io-client/build/cjs/browser-entrypoint.d.ts +0 -2
  306. package/node_modules/socket.io-client/build/cjs/browser-entrypoint.js +0 -4
  307. package/node_modules/socket.io-client/build/cjs/contrib/backo2.d.ts +0 -12
  308. package/node_modules/socket.io-client/build/cjs/contrib/backo2.js +0 -69
  309. package/node_modules/socket.io-client/build/cjs/index.d.ts +0 -29
  310. package/node_modules/socket.io-client/build/cjs/index.js +0 -76
  311. package/node_modules/socket.io-client/build/cjs/manager.d.ts +0 -295
  312. package/node_modules/socket.io-client/build/cjs/manager.js +0 -416
  313. package/node_modules/socket.io-client/build/cjs/on.d.ts +0 -2
  314. package/node_modules/socket.io-client/build/cjs/on.js +0 -9
  315. package/node_modules/socket.io-client/build/cjs/socket.d.ts +0 -593
  316. package/node_modules/socket.io-client/build/cjs/socket.js +0 -909
  317. package/node_modules/socket.io-client/build/cjs/url.d.ts +0 -33
  318. package/node_modules/socket.io-client/build/cjs/url.js +0 -69
  319. package/node_modules/socket.io-client/build/esm/browser-entrypoint.d.ts +0 -2
  320. package/node_modules/socket.io-client/build/esm/browser-entrypoint.js +0 -2
  321. package/node_modules/socket.io-client/build/esm/contrib/backo2.d.ts +0 -12
  322. package/node_modules/socket.io-client/build/esm/contrib/backo2.js +0 -66
  323. package/node_modules/socket.io-client/build/esm/index.d.ts +0 -29
  324. package/node_modules/socket.io-client/build/esm/index.js +0 -58
  325. package/node_modules/socket.io-client/build/esm/manager.d.ts +0 -295
  326. package/node_modules/socket.io-client/build/esm/manager.js +0 -367
  327. package/node_modules/socket.io-client/build/esm/on.d.ts +0 -2
  328. package/node_modules/socket.io-client/build/esm/on.js +0 -6
  329. package/node_modules/socket.io-client/build/esm/package.json +0 -5
  330. package/node_modules/socket.io-client/build/esm/socket.d.ts +0 -593
  331. package/node_modules/socket.io-client/build/esm/socket.js +0 -880
  332. package/node_modules/socket.io-client/build/esm/url.d.ts +0 -33
  333. package/node_modules/socket.io-client/build/esm/url.js +0 -59
  334. package/node_modules/socket.io-client/build/esm-debug/browser-entrypoint.d.ts +0 -2
  335. package/node_modules/socket.io-client/build/esm-debug/browser-entrypoint.js +0 -2
  336. package/node_modules/socket.io-client/build/esm-debug/contrib/backo2.d.ts +0 -12
  337. package/node_modules/socket.io-client/build/esm-debug/contrib/backo2.js +0 -66
  338. package/node_modules/socket.io-client/build/esm-debug/index.d.ts +0 -29
  339. package/node_modules/socket.io-client/build/esm-debug/index.js +0 -62
  340. package/node_modules/socket.io-client/build/esm-debug/manager.d.ts +0 -295
  341. package/node_modules/socket.io-client/build/esm-debug/manager.js +0 -386
  342. package/node_modules/socket.io-client/build/esm-debug/on.d.ts +0 -2
  343. package/node_modules/socket.io-client/build/esm-debug/on.js +0 -6
  344. package/node_modules/socket.io-client/build/esm-debug/package.json +0 -5
  345. package/node_modules/socket.io-client/build/esm-debug/socket.d.ts +0 -593
  346. package/node_modules/socket.io-client/build/esm-debug/socket.js +0 -902
  347. package/node_modules/socket.io-client/build/esm-debug/url.d.ts +0 -33
  348. package/node_modules/socket.io-client/build/esm-debug/url.js +0 -63
  349. package/node_modules/socket.io-client/dist/socket.io.esm.min.js +0 -7
  350. package/node_modules/socket.io-client/dist/socket.io.esm.min.js.map +0 -1
  351. package/node_modules/socket.io-client/dist/socket.io.js +0 -4955
  352. package/node_modules/socket.io-client/dist/socket.io.js.map +0 -1
  353. package/node_modules/socket.io-client/dist/socket.io.min.js +0 -7
  354. package/node_modules/socket.io-client/dist/socket.io.min.js.map +0 -1
  355. package/node_modules/socket.io-client/dist/socket.io.msgpack.min.js +0 -7
  356. package/node_modules/socket.io-client/dist/socket.io.msgpack.min.js.map +0 -1
  357. package/node_modules/socket.io-client/package.json +0 -101
  358. package/node_modules/socket.io-parser/LICENSE +0 -20
  359. package/node_modules/socket.io-parser/Readme.md +0 -81
  360. package/node_modules/socket.io-parser/build/cjs/binary.d.ts +0 -20
  361. package/node_modules/socket.io-parser/build/cjs/binary.js +0 -87
  362. package/node_modules/socket.io-parser/build/cjs/index.d.ts +0 -101
  363. package/node_modules/socket.io-parser/build/cjs/index.js +0 -367
  364. package/node_modules/socket.io-parser/build/cjs/is-binary.d.ts +0 -7
  365. package/node_modules/socket.io-parser/build/cjs/is-binary.js +0 -54
  366. package/node_modules/socket.io-parser/build/cjs/package.json +0 -3
  367. package/node_modules/socket.io-parser/build/esm/binary.d.ts +0 -20
  368. package/node_modules/socket.io-parser/build/esm/binary.js +0 -83
  369. package/node_modules/socket.io-parser/build/esm/index.d.ts +0 -101
  370. package/node_modules/socket.io-parser/build/esm/index.js +0 -356
  371. package/node_modules/socket.io-parser/build/esm/is-binary.d.ts +0 -7
  372. package/node_modules/socket.io-parser/build/esm/is-binary.js +0 -50
  373. package/node_modules/socket.io-parser/build/esm/package.json +0 -3
  374. package/node_modules/socket.io-parser/build/esm-debug/binary.d.ts +0 -20
  375. package/node_modules/socket.io-parser/build/esm-debug/binary.js +0 -83
  376. package/node_modules/socket.io-parser/build/esm-debug/index.d.ts +0 -101
  377. package/node_modules/socket.io-parser/build/esm-debug/index.js +0 -361
  378. package/node_modules/socket.io-parser/build/esm-debug/is-binary.d.ts +0 -7
  379. package/node_modules/socket.io-parser/build/esm-debug/is-binary.js +0 -50
  380. package/node_modules/socket.io-parser/build/esm-debug/package.json +0 -3
  381. package/node_modules/socket.io-parser/package.json +0 -44
  382. package/node_modules/xmlhttprequest-ssl/LICENSE +0 -22
  383. package/node_modules/xmlhttprequest-ssl/README.md +0 -67
  384. package/node_modules/xmlhttprequest-ssl/lib/XMLHttpRequest.js +0 -689
  385. package/node_modules/xmlhttprequest-ssl/package.json +0 -40
  386. /package/node_modules/{engine.io-client/node_modules/ws → ws}/LICENSE +0 -0
  387. /package/node_modules/{engine.io-client/node_modules/ws → ws}/README.md +0 -0
  388. /package/node_modules/{engine.io-client/node_modules/ws → ws}/browser.js +0 -0
  389. /package/node_modules/{engine.io-client/node_modules/ws → ws}/lib/buffer-util.js +0 -0
  390. /package/node_modules/{engine.io-client/node_modules/ws → ws}/lib/event-target.js +0 -0
  391. /package/node_modules/{engine.io-client/node_modules/ws → ws}/lib/extension.js +0 -0
  392. /package/node_modules/{engine.io-client/node_modules/ws → ws}/lib/limiter.js +0 -0
  393. /package/node_modules/{engine.io-client/node_modules/ws → ws}/lib/receiver.js +0 -0
  394. /package/node_modules/{engine.io-client/node_modules/ws → ws}/lib/sender.js +0 -0
  395. /package/node_modules/{engine.io-client/node_modules/ws → ws}/lib/stream.js +0 -0
  396. /package/node_modules/{engine.io-client/node_modules/ws → ws}/lib/subprotocol.js +0 -0
  397. /package/node_modules/{engine.io-client/node_modules/ws → ws}/lib/validation.js +0 -0
@@ -1,32 +1,66 @@
1
1
  /**
2
- * LightClaw — 可靠发送器
2
+ * LightClaw — 可靠发送器(ReliableEmitter)
3
3
  *
4
- * 所有出站 socket.emit 都通过此模块,利用 Socket.IO 原生 ACK + timeout 机制:
5
- * socket.timeout(ms).emit(event, data, (err, ...args) => { ... })
6
- * 超时由 Socket.IO 原生处理,回调第一个参数为 Error(超时)或 null(成功)。
4
+ * 解决的核心问题:
5
+ * 普通的 socket.emit 是「发完即忘」,网络抖动时消息可能悄无声息地丢失。
6
+ * ReliableEmitter 在此基础上增加了「确认 + 重试」机制,确保消息最终送达。
7
7
  *
8
- * 未收到 ACK 则指数退避重试,断线期间暂停重试、重连后立即重发。
8
+ * 工作原理:
9
+ * 1. 发送时利用 NativeSocketClient 的 ACK + timeout 机制:
10
+ * socket.timeout(ms).emit(event, data, (err, ...args) => { ... })
11
+ * 超时由 NativeSocketClient 内部处理,回调第一个参数为 Error(超时)或 null(成功)。
12
+ * 2. 未收到 ACK(超时或出错)则按「指数退避 + 随机抖动」策略安排重试。
13
+ * 3. 断线期间暂停所有重试计时器(pause),重连后立即重发所有待确认消息(resume)。
14
+ * 4. 每条消息注入 idempotencyKey,服务端/前端据此去重,防止重试导致重复处理。
15
+ *
16
+ * 生命周期:
17
+ * new ReliableEmitter(getSocket, log)
18
+ * → emitWithAck(...) 发送消息
19
+ * → pause() 断线时调用
20
+ * → resume() 重连时调用
21
+ * → destroy() 销毁时调用(清理所有定时器)
22
+ *
23
+ * @format
9
24
  */
10
- import { EMIT_ACK_TIMEOUT, EMIT_MAX_RETRIES, EMIT_RETRY_BASE_DELAY, EMIT_RETRY_MAX_DELAY, EMIT_PENDING_MAX, } from "../config.js";
25
+ import { EMIT_ACK_TIMEOUT, EMIT_MAX_RETRIES, EMIT_RETRY_BASE_DELAY, EMIT_RETRY_MAX_DELAY, EMIT_PENDING_MAX, } from '../config.js';
11
26
  // ============================================================
12
- // ReliableEmitter
27
+ // ReliableEmitter 主类
13
28
  // ============================================================
14
29
  export class ReliableEmitter {
15
30
  getSocket;
16
31
  log;
32
+ /**
33
+ * 待确认消息队列。
34
+ * key = emitId(内部唯一标识),value = PendingMessage。
35
+ * 消息从入队到收到 ACK(或放弃)期间始终存在于此 Map 中。
36
+ */
17
37
  pending = new Map();
38
+ /**
39
+ * 是否处于暂停状态(断线中)。
40
+ * 暂停时:新消息入队但不发送;已有重试计时器全部清除。
41
+ * 恢复时:立即重发所有 pending 消息。
42
+ */
18
43
  paused = false;
44
+ /**
45
+ * 自增计数器,配合时间戳生成唯一的 emitId,防止高频调用时 ID 碰撞。
46
+ */
19
47
  idCounter = 0;
20
- // 统计
48
+ /** 运行时统计,通过 getStats() 对外暴露 */
21
49
  stats = {
22
50
  totalEmitted: 0,
23
51
  totalConfirmed: 0,
24
52
  totalRetries: 0,
25
53
  totalFailed: 0,
26
54
  };
27
- constructor(getSocket, log) {
55
+ /**
56
+ * 日志前缀。默认 `[ReliableEmitter]`;gateway 在创建实例时可注入
57
+ * 业务通道前缀(如 `[lightclawbot]`),使上游日志风格统一。
58
+ */
59
+ logPrefix;
60
+ constructor(getSocket, log, logPrefix = "[ReliableEmitter]") {
28
61
  this.getSocket = getSocket;
29
62
  this.log = log;
63
+ this.logPrefix = logPrefix;
30
64
  }
31
65
  // ----------------------------------------------------------
32
66
  // 公开 API
@@ -34,24 +68,35 @@ export class ReliableEmitter {
34
68
  /**
35
69
  * 可靠发送 — 带 ACK 确认 + 自动重试。
36
70
  *
37
- * 每次调用都是独立的发送请求,不会因相同 msgId 被合并。
38
- * msgId 仅用于日志追踪,内部使用自增 emitId 作为 pending key。
71
+ * 与普通 socket.emit 的区别:
72
+ * - 每次发送都等待服务端 ACK 回调,超时则自动重试
73
+ * - 断线期间消息不丢失,重连后自动补发
74
+ * - 消息体自动注入 idempotencyKey,防止重试导致重复处理
39
75
  *
40
- * @param event Socket.IO 事件名
41
- * @param data 消息体
42
- * @param msgId 业务层消息 ID(仅用于日志追踪,可选)
43
- * @returns true = server 已确认, false = 重试耗尽未确认
76
+ * 注意:每次调用都是独立的发送请求,不会因相同 msgId 被合并或去重。
77
+ * 内部使用自增 emitId 作为 pending Map 的 key、ACK 回路的 pendingKey 及 idempotencyKey。
78
+ * 业务层 msgId 保留在 data.msgId 中原样发送,同一条消息的所有重试保持相同,服务端用它识别消息身份。
79
+ *
80
+ * @param event WebSocket 事件名(如 "message:private")
81
+ * @param data 消息体对象,会被浅拷贝并注入 idempotencyKey
82
+ * @param msgId 业务层消息 ID,保留在 data.msgId 中不变,可选
83
+ * @returns Promise<boolean>:true = 服务端已确认,false = 重试耗尽或被淘汰
44
84
  */
45
85
  emitWithAck(event, data, msgId) {
46
86
  // 每次调用生成唯一的内部 ID,确保同一 msgId 的多次 emit 不会互相覆盖
47
87
  const emitId = this.generateEmitId();
48
88
  this.stats.totalEmitted++;
49
- // 队列满时淘汰最早的
89
+ // 队列满时淘汰最早的 pending 消息,防止内存无限增长
50
90
  this.evictIfNeeded();
51
91
  // 为消息体注入 idempotencyKey:
52
- // 使用 emitId 作为值,确保同一次 emit 的所有重试都携带相同的 key,
53
- // 前端据此去重,避免因 ACK 丢失重发导致用户收到重复消息。
92
+ // - 使用 emitId 作为值,每次 emitWithAck 调用唯一
93
+ // - 同一次 emit 的所有重试共用同一 emitId,服务端据此去重,避免 ACK 丢失重发导致重复处理
94
+ // - idempotencyKey 同时作为 ACK 回路的 pendingKey(NativeSocket 优先取 data.idempotencyKey)
95
+ // - 浅拷贝原始 data,不修改调用方传入的对象
96
+ // - data.msgId 保持业务层原值不变,同一条消息的所有重试相同,服务端用它识别消息身份
54
97
  const enrichedData = { ...data, idempotencyKey: emitId };
98
+ // 统一的发送日志(含最终 payload),业务层无需再打
99
+ this.log?.info(`${this.logPrefix} emit: ${JSON.stringify(enrichedData)}`);
55
100
  return new Promise((resolve) => {
56
101
  const entry = {
57
102
  id: emitId,
@@ -63,59 +108,87 @@ export class ReliableEmitter {
63
108
  retryTimer: null,
64
109
  resolve,
65
110
  };
111
+ // 入队:消息在收到 ACK 或放弃前始终保存在 pending Map 中
66
112
  this.pending.set(emitId, entry);
67
113
  if (this.paused) {
68
- // 断线中,先挂着,resume 时统一重发
69
- this.log?.info(`[ReliableEmitter] Queued while paused: emitId=${emitId}, msgId=${msgId}`);
114
+ // 断线中,等 resume 统一重发
115
+ this.log?.info(`${this.logPrefix} Queued while paused: emitId=${emitId}, msgId=${msgId}`);
70
116
  return;
71
117
  }
118
+ // 正常状态:立即尝试发送
72
119
  this.doEmit(entry);
73
120
  });
74
121
  }
75
122
  /**
76
- * 断线时调用 — 暂停所有重试计时器
123
+ * 断线时调用 — 暂停所有重试计时器。
124
+ *
125
+ * 调用后:
126
+ * - 所有已安排的重试定时器被清除(retryTimer = null)
127
+ * - 新的 emitWithAck 调用仍可入队,但不会立即发送
128
+ * - 重试次数计数器不增加(断线等待不算重试)
129
+ *
130
+ * 幂等:重复调用无副作用。
77
131
  */
78
132
  pause() {
79
133
  if (this.paused)
80
134
  return;
81
135
  this.paused = true;
136
+ // 清除所有待执行的重试定时器,避免断线期间无效的发送尝试
82
137
  for (const entry of this.pending.values()) {
83
138
  if (entry.retryTimer) {
84
139
  clearTimeout(entry.retryTimer);
85
140
  entry.retryTimer = null;
86
141
  }
87
142
  }
88
- this.log?.info(`[ReliableEmitter] Paused, ${this.pending.size} message(s) pending`);
143
+ this.log?.info(`${this.logPrefix} Paused, ${this.pending.size} message(s) pending`);
89
144
  }
90
145
  /**
91
- * 重连时调用 — 立即重发所有待确认消息
146
+ * 重连时调用 — 立即重发所有待确认消息。
147
+ *
148
+ * 调用后:
149
+ * - 解除暂停状态
150
+ * - 遍历 pending Map,对每条消息立即调用 doEmit
151
+ * - 断线期间新入队的消息也会在此时被发送
152
+ *
153
+ * 幂等:重复调用无副作用。
92
154
  */
93
155
  resume() {
94
156
  if (!this.paused)
95
157
  return;
96
158
  this.paused = false;
97
- this.log?.info(`[ReliableEmitter] Resumed, re-emitting ${this.pending.size} pending message(s)`);
159
+ this.log?.info(`${this.logPrefix} Resumed, re-emitting ${this.pending.size} pending message(s)`);
98
160
  for (const entry of this.pending.values()) {
99
161
  this.doEmit(entry);
100
162
  }
101
163
  }
102
164
  /**
103
- * 销毁 — 清除所有定时器,resolve 所有 pending 为 false
165
+ * 销毁 — 清除所有定时器,将所有 pending Promise resolve 为 false
166
+ *
167
+ * 在 gateway 断开连接、插件卸载时调用,防止内存泄漏和悬空定时器。
168
+ * 调用后此实例不应再被使用。
104
169
  */
105
170
  destroy() {
106
171
  for (const entry of this.pending.values()) {
172
+ // 清除重试定时器,防止 destroy 后仍有定时器触发
107
173
  if (entry.retryTimer)
108
174
  clearTimeout(entry.retryTimer);
175
+ // 将 Promise resolve 为 false,通知调用方消息未被确认
109
176
  entry.resolve(false);
110
177
  }
111
178
  this.pending.clear();
112
- this.log?.info(`[ReliableEmitter] Destroyed`);
179
+ this.log?.info(`${this.logPrefix} Destroyed`);
113
180
  }
114
- /** 当前待确认消息数 */
181
+ /**
182
+ * 当前待确认消息数(实时值)。
183
+ * 可用于监控队列积压情况,正常情况下应接近 0。
184
+ */
115
185
  get pendingCount() {
116
186
  return this.pending.size;
117
187
  }
118
- /** 获取统计信息 */
188
+ /**
189
+ * 获取运行时统计信息的快照(浅拷贝,不影响内部状态)。
190
+ * 可用于监控面板、调试日志等场景。
191
+ */
119
192
  getStats() {
120
193
  return { ...this.stats, currentPending: this.pending.size };
121
194
  }
@@ -123,95 +196,160 @@ export class ReliableEmitter {
123
196
  // 内部方法
124
197
  // ----------------------------------------------------------
125
198
  /**
126
- * 通过 socket.timeout(ms).emit(event, data, callback) 发送消息。
199
+ * 实际执行 socket.emit 的内部方法。
200
+ *
201
+ * 发送机制:
202
+ * socket.timeout(EMIT_ACK_TIMEOUT).emit(event, data, callback)
203
+ * - 超时由 NativeSocketClient 的 .timeout() 处理,无需手动 setTimeout
204
+ * - 回调签名为 (err: Error | null),err 非空表示超时或服务端返回错误
205
+ * - socket.emit 是异步的,不会抛同步异常,无需 try-catch
127
206
  *
128
- * - 超时由 Socket.IO 原生 .timeout() 处理,无需手动 setTimeout
129
- * - 回调签名为 (err: Error | null, ...args),err 非空说明超时或出错
130
- * - socket.emit 是异步的,不会抛同步异常,无需 try-catch
207
+ * 调用时机:
208
+ * - emitWithAck 首次发送(非暂停状态)
209
+ * - resume 重连后补发
210
+ * - scheduleRetry 定时器触发后重试
131
211
  */
132
212
  doEmit(entry) {
133
213
  const socket = this.getSocket();
134
214
  if (!socket?.connected) {
135
- // socket 不可用,等 resume 时重发(不计重试次数)
215
+ // socket 不可用(断线或尚未连接),不计重试次数,等 resume() 时重发
136
216
  return;
137
217
  }
138
- socket.timeout(EMIT_ACK_TIMEOUT).emit(entry.event, entry.data, (err) => {
139
- // 已被 destroy confirm
218
+ // 直接使用 entry.data 作为发送数据,字段职责说明:
219
+ // - data.msgId:业务层消息 ID,同一条消息所有重试相同,服务端 ACK 通过 relatedMsgId 原样回传
220
+ // - data.idempotencyKey:= emitId,每次 emitWithAck 调用唯一,仅用于服务端去重,不参与 ACK 匹配
221
+ // - ACK 回路:NativeSocket 以 data.msgId 为 pendingKey 注册,服务端 ACK relatedMsgId = msgId,两者一致,回路正常闭合
222
+ const sendData = entry.data;
223
+ socket
224
+ .timeout(EMIT_ACK_TIMEOUT)
225
+ .emit(entry.event, sendData, (err) => {
226
+ // 防御性检查:消息可能在等待 ACK 期间被 destroy() 或 confirm() 移除
140
227
  if (!this.pending.has(entry.id))
141
228
  return;
142
229
  if (err) {
143
- // 超时或服务端回传了错误
230
+ // ACK 超时或服务端返回错误,安排下一次重试
144
231
  this.log?.warn(`[ReliableEmitter] ACK error: emitId=${entry.id}, msgId=${entry.msgId}, err=${err.message}, retryCount=${entry.retryCount}`);
145
232
  this.scheduleRetry(entry);
146
233
  }
147
234
  else {
148
- this.log?.info(`[ReliableEmitter] ACK success: emitId=${entry.id}, msgId=${entry.msgId}, retryCount=${entry.retryCount}`);
149
- // 服务端已确认
235
+ // 服务端已确认收到,从 pending 队列移除
236
+ // this.log?.info(
237
+ // `[ReliableEmitter] ACK success: emitId=${entry.id}, msgId=${entry.msgId}, retryCount=${entry.retryCount}`,
238
+ // );
150
239
  this.confirm(entry.id);
151
240
  }
152
241
  });
153
242
  }
243
+ /**
244
+ * 确认消息已送达,从 pending 队列移除并 resolve Promise 为 true。
245
+ * 幂等:若消息已被移除(重复 ACK 或已 destroy),直接返回。
246
+ */
154
247
  confirm(id) {
155
248
  const entry = this.pending.get(id);
156
249
  if (!entry)
157
- return; // 已被 confirm 或 destroy
250
+ return; // 已被 confirm 或 destroy,幂等处理
251
+ // 清除可能存在的重试定时器(理论上 ACK 成功时不应有,但做防御性清理)
158
252
  if (entry.retryTimer) {
159
253
  clearTimeout(entry.retryTimer);
160
254
  entry.retryTimer = null;
161
255
  }
162
256
  this.pending.delete(id);
163
257
  this.stats.totalConfirmed++;
258
+ // 通知调用方:消息已被服务端确认
164
259
  entry.resolve(true);
165
260
  }
261
+ /**
262
+ * 安排下一次重试,使用指数退避 + 随机抖动策略。
263
+ *
264
+ * 重试流程:
265
+ * 1. 若当前处于暂停状态(断线),不安排重试,等 resume() 统一处理
266
+ * 2. 若重试次数已达上限(EMIT_MAX_RETRIES),放弃并 resolve false
267
+ * 3. 否则计算延迟时间,设置定时器,到期后调用 doEmit
268
+ */
166
269
  scheduleRetry(entry) {
167
- // 断线中不重试
270
+ // 断线中不安排重试,等 resume() 时由 doEmit 统一重发
168
271
  if (this.paused)
169
272
  return;
170
273
  if (entry.retryCount >= EMIT_MAX_RETRIES) {
171
- // 重试耗尽
274
+ // 重试次数耗尽,放弃该消息
172
275
  this.pending.delete(entry.id);
173
276
  this.stats.totalFailed++;
174
- this.log?.error(`[ReliableEmitter] Gave up after ${entry.retryCount} retries: emitId=${entry.id}, msgId=${entry.msgId}, ` +
277
+ this.log?.error(`${this.logPrefix} Gave up after ${entry.retryCount} retries: emitId=${entry.id}, msgId=${entry.msgId}, ` +
175
278
  `elapsed=${Date.now() - entry.createdAt}ms`);
279
+ // 通知调用方:消息最终未被确认
176
280
  entry.resolve(false);
177
281
  return;
178
282
  }
283
+ // 增加重试计数(先加后用,确保 getRetryDelay 收到正确的重试序号)
179
284
  entry.retryCount++;
180
285
  this.stats.totalRetries++;
181
286
  const delay = this.getRetryDelay(entry.retryCount);
182
- this.log?.info(`[ReliableEmitter] Retry #${entry.retryCount} in ${delay}ms: emitId=${entry.id}, msgId=${entry.msgId}`);
287
+ this.log?.info(`${this.logPrefix} Retry #${entry.retryCount} in ${delay}ms: emitId=${entry.id}, msgId=${entry.msgId}`);
183
288
  entry.retryTimer = setTimeout(() => {
184
289
  entry.retryTimer = null;
290
+ // 定时器触发时再次检查是否断线(重试等待期间可能发生断线)
185
291
  if (this.paused)
186
- return; // 重试期间断线了
292
+ return;
187
293
  this.doEmit(entry);
188
294
  }, delay);
189
295
  }
190
296
  /**
191
- * 指数退避 + 随机抖动
192
- * delay = min(base * 2^(retryCount-1) + jitter, maxDelay)
297
+ * 计算重试延迟时间(指数退避 + 随机抖动)。
298
+ *
299
+ * 公式:delay = min(base × 2^(retryCount-1) + jitter, maxDelay)
300
+ *
301
+ * 示例(base=1000ms, max=30000ms):
302
+ * 第 1 次重试:~1000ms + jitter
303
+ * 第 2 次重试:~2000ms + jitter
304
+ * 第 3 次重试:~4000ms + jitter
305
+ * 第 4 次重试:~8000ms + jitter
306
+ * 第 5 次重试:~16000ms + jitter(若超过 maxDelay 则取 maxDelay)
307
+ *
308
+ * 随机抖动(0~1000ms)的作用:
309
+ * 防止多个客户端在同一时刻同时重试,避免服务端瞬间收到大量重试请求(惊群效应)。
310
+ *
311
+ * @param retryCount - 当前重试序号(从 1 开始)
193
312
  */
194
313
  getRetryDelay(retryCount) {
195
314
  const base = EMIT_RETRY_BASE_DELAY * Math.pow(2, retryCount - 1);
196
315
  const jitter = Math.random() * 1000;
197
316
  return Math.min(base + jitter, EMIT_RETRY_MAX_DELAY);
198
317
  }
199
- /** 队列满时淘汰最早的 pending 消息 */
318
+ /**
319
+ * 队列容量保护:当 pending 消息数达到上限(EMIT_PENDING_MAX)时,
320
+ * 按 FIFO 顺序淘汰最早入队的消息,防止内存无限增长。
321
+ *
322
+ * 触发场景:网络长时间中断且消息持续入队时。
323
+ * Map 的迭代顺序与插入顺序一致,因此 values().next().value 即为最早的消息。
324
+ */
200
325
  evictIfNeeded() {
201
326
  while (this.pending.size >= EMIT_PENDING_MAX) {
327
+ // Map 按插入顺序迭代,第一个即为最早入队的消息
202
328
  const oldest = this.pending.values().next().value;
203
329
  if (!oldest)
204
330
  break;
331
+ // 清除重试定时器,防止被淘汰后仍触发重试
205
332
  if (oldest.retryTimer)
206
333
  clearTimeout(oldest.retryTimer);
207
334
  this.pending.delete(oldest.id);
208
335
  this.stats.totalFailed++;
209
- this.log?.warn(`[ReliableEmitter] Evicted oldest pending: emitId=${oldest.id}, msgId=${oldest.msgId}`);
336
+ this.log?.warn(`${this.logPrefix} Evicted oldest pending: emitId=${oldest.id}, msgId=${oldest.msgId}`);
210
337
  oldest.resolve(false);
211
338
  }
212
339
  }
340
+ /**
341
+ * 生成 emitId,同时用作 pending Map 的 key、ACK 回路的 pendingKey 及 idempotencyKey。
342
+ *
343
+ * 格式:`_re_<16位毫秒时间戳>_<12位自增序号>`,例:`_re_0001776656562000_000000000042`
344
+ *
345
+ * 设计约束:
346
+ * - 固定宽度十进制:保证字典序 == 生成顺序
347
+ * - 每次 emitWithAck 调用生成唯一 id,同一次 emit 的所有重试共用同一 id
348
+ * - 注入为 data.idempotencyKey,NativeSocket 优先取此字段作为 pendingKey
349
+ */
213
350
  generateEmitId() {
214
- return `_re_${Date.now().toString(36)}_${(this.idCounter++).toString(36)}`;
351
+ const ts = Date.now().toString().padStart(16, "0");
352
+ const seq = (this.idCounter++).toString().padStart(12, "0");
353
+ return `_re_${ts}_${seq}`;
215
354
  }
216
355
  }
217
- //# sourceMappingURL=reliable-emitter.js.map
@@ -0,0 +1,140 @@
1
+ /**
2
+ * LightClaw — 文本增量计算器 (DeltaTracker)
3
+ *
4
+ * 核心作用:
5
+ * AI 引擎的 `onPartialReply` 回调输出的文本格式不确定 —— 有的模型输出全量快照(snapshot),
6
+ * 有的输出纯增量(delta),甚至可能在同一次对话中混合使用。
7
+ * DeltaTracker 会自动检测模式,始终输出 **纯增量文本**,方便直接追加到流式推送中。
8
+ *
9
+ * 算法概述:
10
+ * 1. 维护 `{ latest, mode, lastEmitted, localSnapshot }` 状态
11
+ * 2. 新文本到达时,判断其与 `latest` 的关系:
12
+ * - 如果新文本以 latest 为前缀 → snapshot 模式,截取增量
13
+ * - 如果新文本与 latest 有较长公共前缀 → snapshot 模式(可能是局部重传)
14
+ * - 如果上述均不满足 → delta 模式,直接追加
15
+ * 3. 各种边界处理:重复文本、前缀回退、模式切换等
16
+ */
17
+ // ============================================================
18
+ // 公共工具
19
+ // ============================================================
20
+ /** 计算两个字符串的最长公共前缀长度 */
21
+ function longestCommonPrefixLength(a, b) {
22
+ const len = Math.min(a.length, b.length);
23
+ let i = 0;
24
+ while (i < len && a[i] === b[i]) {
25
+ i += 1;
26
+ }
27
+ return i;
28
+ }
29
+ // ============================================================
30
+ // 核心 API
31
+ // ============================================================
32
+ /**
33
+ * 创建一个新的增量追踪器状态。
34
+ */
35
+ export function createDeltaTrackerState() {
36
+ return {
37
+ latest: "",
38
+ mode: "unknown",
39
+ lastEmitted: "",
40
+ localSnapshot: undefined,
41
+ };
42
+ }
43
+ /**
44
+ * 将传入的文本(可能是快照或增量)转换为纯增量文本。
45
+ *
46
+ * @param state - 增量追踪器状态(会被就地修改)
47
+ * @param text - AI 引擎传入的文本
48
+ * @returns 需要追加发送的增量文本;如果无新增量则返回 `undefined`
49
+ */
50
+ export function toStreamDeltaText(state, text) {
51
+ if (typeof text !== "string" || text.length === 0)
52
+ return undefined;
53
+ const incoming = text;
54
+ const previous = state.latest;
55
+ const currentMode = state.mode ?? "unknown";
56
+ // ── 首次接收 ──
57
+ if (!previous) {
58
+ state.latest = incoming;
59
+ state.mode = "unknown";
60
+ state.lastEmitted = incoming;
61
+ state.localSnapshot = undefined;
62
+ return incoming;
63
+ }
64
+ // ── 完全相同 → 无增量 ──
65
+ if (incoming === previous) {
66
+ state.localSnapshot = undefined;
67
+ return undefined;
68
+ }
69
+ // ── 新文本以 previous 为前缀 → snapshot 模式 ──
70
+ if (incoming.startsWith(previous)) {
71
+ state.latest = incoming;
72
+ state.mode = "snapshot";
73
+ const delta = incoming.slice(previous.length);
74
+ state.localSnapshot = undefined;
75
+ if (delta.length > 0) {
76
+ state.lastEmitted = delta;
77
+ return delta;
78
+ }
79
+ return undefined;
80
+ }
81
+ // ── 部分公共前缀分析 ──
82
+ const commonLen = longestCommonPrefixLength(previous, incoming);
83
+ if (incoming.length - previous.length > 0 &&
84
+ commonLen > 0 &&
85
+ (currentMode === "snapshot" ||
86
+ commonLen >= Math.max(8, Math.floor(0.75 * previous.length)) ||
87
+ previous.length >= 64 ||
88
+ incoming.length >= 128 ||
89
+ incoming.length >= 2 * previous.length)) {
90
+ state.latest = incoming;
91
+ state.mode = "snapshot";
92
+ const delta = incoming.slice(commonLen);
93
+ state.localSnapshot = undefined;
94
+ if (delta.length > 0) {
95
+ state.lastEmitted = delta;
96
+ return delta;
97
+ }
98
+ return undefined;
99
+ }
100
+ // ── localSnapshot 追踪(delta 模式下的累计快照校验) ──
101
+ if (typeof state.localSnapshot === "string" && state.localSnapshot.length > 0) {
102
+ if (incoming === state.localSnapshot) {
103
+ return undefined;
104
+ }
105
+ if (incoming.startsWith(state.localSnapshot)) {
106
+ const delta = incoming.slice(state.localSnapshot.length);
107
+ state.latest = `${previous}${delta}`;
108
+ state.mode = "snapshot";
109
+ state.localSnapshot = incoming;
110
+ if (delta.length > 0) {
111
+ state.lastEmitted = delta;
112
+ return delta;
113
+ }
114
+ return undefined;
115
+ }
116
+ state.localSnapshot = undefined;
117
+ }
118
+ // ── 前缀回退(新文本是旧文本的前缀)→ 忽略 ──
119
+ if (previous.startsWith(incoming)) {
120
+ if (currentMode === "snapshot") {
121
+ state.latest = incoming;
122
+ }
123
+ state.localSnapshot = undefined;
124
+ return undefined;
125
+ }
126
+ // ── snapshot 模式下的重复增量检测 ──
127
+ if (currentMode === "snapshot" &&
128
+ typeof state.lastEmitted === "string" &&
129
+ incoming === state.lastEmitted &&
130
+ previous.endsWith(incoming)) {
131
+ state.localSnapshot = undefined;
132
+ return undefined;
133
+ }
134
+ // ── 兜底:视为 delta 模式,直接追加 ──
135
+ state.latest = `${previous}${incoming}`;
136
+ state.mode = "delta";
137
+ state.lastEmitted = incoming;
138
+ state.localSnapshot = incoming;
139
+ return incoming;
140
+ }
@@ -0,0 +1,12 @@
1
+ /**
2
+ * LightClaw — 流式输出模块
3
+ *
4
+ * 统一导出流式输出相关的类型、工具和分发器。
5
+ *
6
+ * 使用方式:
7
+ * import { createStreamReplyConfig } from "./streaming/index.js";
8
+ */
9
+ // 增量计算器
10
+ export { createDeltaTrackerState, toStreamDeltaText } from "./delta-tracker.js";
11
+ // 真流式回复配置(dispatcher + replyOptions,用于 dispatchReplyFromConfig)
12
+ export { createStreamReplyConfig } from "./stream-reply-sink.js";