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,144 +1,155 @@
1
1
  /**
2
- * LightClaw — Socket.IO Gateway
2
+ * LightClaw — WebSocket Gateway
3
3
  *
4
4
  * 连接编排层:
5
5
  * 1. 管理 Socket.IO 连接生命周期(连接/断开/重连/防重入)
6
- * 2. 维护消息队列,串行处理入站消息
6
+ * 2. 分发入站消息(fire-and-forget),并发/abort 由 openclaw 自己处理
7
7
  * 3. 提供 socket emit 抽象供子模块使用
8
8
  *
9
- * 消息处理逻辑 → inbound.ts
10
- * 事件监听绑定 socket-handlers.ts
11
- * 去重/节流/ID dedup.ts
12
- * 媒体文件处理 media.ts
9
+ * 子模块分工:
10
+ * 消息处理逻辑inbound.ts
11
+ * 事件监听绑定socket-handlers.ts
12
+ * 去重/节流/IDdedup.ts
13
+ * 媒体文件处理 → media.ts
13
14
  */
14
- import { io } from "socket.io-client";
15
- import { CHANNEL_KEY, WS_URL, API_BASE_URL, SOCKET_PATH, SOCKET_RECONNECTION_DELAY, SOCKET_RECONNECTION_DELAY_MAX, SOCKET_RECONNECTION_ATTEMPTS, API_PATH_USER_CURRENT, EVENT_MESSAGE_PRIVATE, MESSAGE_QUEUE_SIZE, MESSAGE_QUEUE_WARN_THRESHOLD, QUEUE_POLL_INTERVAL, HEALTH_HEARTBEAT_INTERVAL, buildAuthHeaders, buildMultiAuthHeaders, setApiKeyMap, } from "./config.js";
16
- import { generateMsgId } from "./dedup.js";
17
- import { createInboundHandler } from "./inbound.js";
18
- import { bindSocketHandlers, registerSocket, unregisterSocket, flushPendingMessages } from "./socket/index.js";
19
- import { ReliableEmitter } from "./socket/reliable-emitter.js";
20
- import { formatCosUrls } from "./format-urls.js";
15
+ import { NativeSocketClient } from './socket/native-socket.js';
16
+ import { CHANNEL_KEY, WS_URL, API_BASE_URL, SOCKET_PATH, API_PATH_USER_CURRENT, EVENT_MESSAGE_PRIVATE, HEALTH_HEARTBEAT_INTERVAL, setApiKeyMap, } from './config.js';
17
+ import { generateMsgId } from './dedup.js';
18
+ import { createInboundHandler } from './inbound.js';
19
+ import { bindSocketHandlers, registerSocket, unregisterSocket, flushPendingMessages } from './socket/index.js';
20
+ import { ReliableEmitter } from './socket/reliable-emitter.js';
21
+ import { buildAuthHeaders } from './utils/index.js';
21
22
  // ============================================================
22
23
  // Gateway 实例追踪(防止同一 accountId 创建多个连接)
23
24
  // ============================================================
24
- /** accountId → cleanup function */
25
+ /**
26
+ * 全局 Gateway 实例注册表。
27
+ * key = accountId
28
+ * value = cleanup 函数(销毁 socket、定时器、可靠发送器等所有资源)
29
+ *
30
+ * 在 startGateway 入口处检查此 Map,若已存在则先销毁旧实例,
31
+ * 避免同一账号同时持有多个 WebSocket 连接。
32
+ */
25
33
  const activeGateways = new Map();
26
34
  /**
27
- * 对每个 apiKey 调 /user/current,一次性获取 botClientId 和 uin→apiKey 映射。
35
+ * 通过 /user/current 接口解析 botClientId
28
36
  *
29
- * 所有 key 共享同一个 botId(来自 data.client.extra),
30
- * 但每个 key 对应不同的 uin(= data.id)。
37
+ * 新配置格式下,accountId 即为 uin,apiKey uin 一一对应,
38
+ * 无需并发请求多个 key,只需用当前账户的 apiKey 请求一次即可获取 botClientId。
31
39
  *
32
- * 映射表大小 = apiKeys 数量(静态、固定),不会随消息增多而增长。
40
+ * @param apiKey - 当前账户的 apiKey
41
+ * @param log - 可选的日志对象
42
+ * @returns - Bot 的 clientId
43
+ * @throws - 若无法解析出 botClientId,则抛出错误
33
44
  */
34
- async function resolveApiKeyIdentities(allApiKeys, log) {
45
+ async function resolveBotClientId(apiKey, log) {
35
46
  const url = `${API_BASE_URL}${API_PATH_USER_CURRENT}`;
36
- const apiKeyMap = new Map();
37
- let botClientId = "";
38
- // 并发请求所有 key
39
- const results = await Promise.allSettled(allApiKeys.map(async (key) => {
40
- const resp = await fetch(url, {
41
- method: "GET",
42
- headers: buildAuthHeaders(key),
43
- });
44
- if (!resp.ok) {
45
- const body = await resp.text().catch(() => "");
46
- throw new Error(`HTTP ${resp.status} ${resp.statusText}${body ? ` — ${body}` : ""}`);
47
- }
48
- const result = (await resp.json());
49
- if (result.code !== 0) {
50
- throw new Error(`code=${result.code}, message=${result.message ?? "unknown"}`);
51
- }
52
- return { key, result };
53
- }));
54
- // 按原始顺序处理结果
55
- for (let i = 0; i < results.length; i++) {
56
- const key = allApiKeys[i];
57
- const settled = results[i];
58
- if (settled.status === "rejected") {
59
- log?.warn(`[${CHANNEL_KEY}] Failed to resolve uin for apiKey ***${key.slice(-4)}: ${settled.reason}`);
60
- continue;
61
- }
62
- const { result } = settled.value;
63
- // 提取 uin
64
- const uin = result.data?.id;
65
- if (!uin) {
66
- log?.warn(`[${CHANNEL_KEY}] Missing data.id for apiKey ***${key.slice(-4)}`);
67
- continue;
68
- }
69
- // 提取 botId(只需从第一个成功的 key 中获取一次)
70
- if (!botClientId) {
71
- const extra = result.data?.client?.extra;
72
- if (!extra) {
73
- log?.warn(`[${CHANNEL_KEY}] Missing data.client.extra for apiKey ***${key.slice(-4)}`);
74
- continue;
75
- }
76
- let parsed;
77
- try {
78
- parsed = JSON.parse(extra);
79
- }
80
- catch {
81
- log?.warn(`[${CHANNEL_KEY}] data.client.extra is not valid JSON for apiKey ***${key.slice(-4)}: ${extra}`);
82
- continue;
83
- }
84
- if (!parsed.botId) {
85
- log?.warn(`[${CHANNEL_KEY}] Missing botId in data.client.extra for apiKey ***${key.slice(-4)}: ${extra}`);
86
- continue;
87
- }
88
- botClientId = parsed.botId;
89
- }
90
- // uin 和 botClientId 都成功获取后,才加入映射
91
- apiKeyMap.set(uin, key);
92
- log?.info(`[${CHANNEL_KEY}] Mapped uin=${uin} → apiKey=***${key.slice(-4)}`);
47
+ const resp = await fetch(url, {
48
+ method: 'POST',
49
+ headers: buildAuthHeaders(apiKey),
50
+ });
51
+ if (!resp.ok) {
52
+ const body = await resp.text().catch(() => '');
53
+ throw new Error(`[${CHANNEL_KEY}] ${API_PATH_USER_CURRENT} HTTP ${resp.status} ${resp.statusText}${body ? ` — ${body}` : ''}`);
54
+ }
55
+ const result = (await resp.json());
56
+ if (result.code !== 0) {
57
+ throw new Error(`[${CHANNEL_KEY}] ${API_PATH_USER_CURRENT} code=${result.code}, message=${result.message ?? 'unknown'}`);
58
+ }
59
+ const extra = result.data?.client?.extra;
60
+ if (!extra) {
61
+ throw new Error(`[${CHANNEL_KEY}] Missing data.client.extra in ${API_PATH_USER_CURRENT} response`);
62
+ }
63
+ let parsed;
64
+ try {
65
+ parsed = JSON.parse(extra);
93
66
  }
94
- if (!botClientId) {
95
- throw new Error(`[${CHANNEL_KEY}] Failed to resolve botClientId from any apiKey`);
67
+ catch {
68
+ throw new Error(`[${CHANNEL_KEY}] data.client.extra is not valid JSON: ${extra}`);
96
69
  }
97
- return { botClientId, apiKeyMap };
70
+ if (!parsed.botId) {
71
+ throw new Error(`[${CHANNEL_KEY}] Missing botId in data.client.extra: ${extra}`);
72
+ }
73
+ log?.info(`[${CHANNEL_KEY}] Resolved botClientId: ${parsed.botId}`);
74
+ return {
75
+ botClientId: parsed.botId,
76
+ ticket: result?.data?.ticket || '',
77
+ };
98
78
  }
99
79
  // ============================================================
100
80
  // 核心:启动 Gateway
101
81
  // ============================================================
82
+ /**
83
+ * 启动并维持一个 WebSocket Gateway 实例。
84
+ *
85
+ * 整体流程:
86
+ * 1. 防重入检查:若同一 accountId 已有活跃 gateway,先销毁旧实例
87
+ * 2. 调用 /user/current 解析 botClientId 和 uin→apiKey 映射
88
+ * 3. 创建 ReliableEmitter(可靠发送器)和 SocketEmitter 抽象
89
+ * 4. 创建入站消息处理器和串行消息队列
90
+ * 5. 建立 WebSocket 连接,绑定生命周期事件和业务事件
91
+ * 6. 返回一个永不 resolve 的 Promise,直到 abortSignal 触发才退出
92
+ * (框架约定:Promise resolve = gateway 已退出,会触发 auto-restart)
93
+ *
94
+ * @param ctx - Gateway 上下文,包含账户配置、abort 信号和生命周期回调
95
+ */
102
96
  export async function startGateway(ctx) {
103
97
  const { account, abortSignal, onReady, onDisconnect, onEvent, log } = ctx;
104
- if (!account.allApiKeys.length) {
105
- throw new Error(`[${CHANNEL_KEY}] Missing apiKeys in config`);
98
+ // 判断是否存在有效的apikey
99
+ if (!account.apiKey) {
100
+ log?.error(`[${CHANNEL_KEY}:${account.accountId}] apiKey is not exist`);
101
+ throw new Error(`[${CHANNEL_KEY}] Missing apiKey in config`);
106
102
  }
107
- // 防重入:如果同一 accountId 已有活跃 gateway,先销毁
103
+ // 判断 accountId 在缓存中是否存在,避免同一账号同时持有多个 WebSocket 连接
104
+ // 防重入:如果同一 accountId 已有活跃 gateway,先销毁旧实例再创建新实例
108
105
  const existingCleanup = activeGateways.get(account.accountId);
109
106
  if (existingCleanup) {
110
- log?.warn(`[${CHANNEL_KEY}] Destroying existing gateway for account ${account.accountId} before creating new one`);
107
+ log?.warn(`[${CHANNEL_KEY}:${account.accountId}] Destroying existing gateway for account ${account.accountId} before creating new one`);
111
108
  existingCleanup();
112
109
  }
113
- // 通过 HTTP 接口获取 Bot 身份 & uin→apiKey 映射(一次性完成)
114
- const { allApiKeys } = account;
115
- log?.info(`[${CHANNEL_KEY}] Resolving identities for ${allApiKeys.length} apiKey(s)...`);
116
- const { botClientId, apiKeyMap } = await resolveApiKeyIdentities(allApiKeys, log);
117
- log?.info(`[${CHANNEL_KEY}] Bot clientId: ${botClientId}, apiKey map: ${apiKeyMap.size} entries`);
110
+ // 通过 HTTP 接口获取 Bot clientId(botClientId)
111
+ // 新配置格式:accountId 即为 uin,apiKey uin 一一对应,直接构建映射表
112
+ log?.info(`[${CHANNEL_KEY}: ${account.accountId}] Resolving botClientId for account ${account.accountId}...`);
113
+ const { botClientId, ticket } = await resolveBotClientId(account.apiKey, log);
114
+ // 构建 uin→apiKey 映射表(新格式下每个 account 只有一条记录)
115
+ const apiKeyMap = new Map([[account.accountId, account.apiKey]]);
116
+ log?.info(`[${CHANNEL_KEY}] Bot clientId: ${botClientId}, uin=${account.accountId} → apiKey=***${account.apiKey.slice(-4)}`);
117
+ // 将映射表写入全局 config 模块,供 inbound 处理时按 uin 查找对应 apiKey
118
118
  setApiKeyMap(apiKeyMap, account.apiKey);
119
+ /** Gateway 是否已被 abort(用于终止消息处理循环) */
119
120
  let isAborted = false;
121
+ /** 当前活跃的 WebSocket 实例(断线时为 null) */
120
122
  let currentSocket = null;
123
+ /** health-monitor 心跳定时器(连接时启动,断线时清除) */
121
124
  let healthHeartbeatTimer = null;
122
125
  // ---- 可靠发送器(所有出站 emit 都通过此实例) ----
126
+ // ReliableEmitter 负责:断线时缓冲消息、重连后 flush、ACK 超时重试
123
127
  const reliableEmitter = new ReliableEmitter(() => currentSocket, log);
124
- // ---- Socket.IO 发送抽象 ----
128
+ // ---- WebSocket 发送抽象 ----
129
+ /**
130
+ * 底层 emit:将 PrivateMessageData 通过 ReliableEmitter 发送给客户端。
131
+ * - 统一对 content 字段执行 formatCosUrls(将内部 COS 路径转换为公网 URL)
132
+ * - 所有消息都走可靠发送队列,入队即视为"发送成功",实际 ACK 由 ReliableEmitter 保证
133
+ */
125
134
  const emit = (data) => {
126
- // 统一拦截:所有出站消息的 content 都过一遍 formatCosUrls
127
- const outgoing = data.content
128
- ? { ...data, content: formatCosUrls(data.content) }
129
- : data;
130
- log?.info(`[${CHANNEL_KEY}] emit: ${JSON.stringify(outgoing)}`);
131
- // 所有消息都走可靠发送(入队即视为"发送成功")
132
- reliableEmitter.emitWithAck(EVENT_MESSAGE_PRIVATE, outgoing, outgoing.msgId)
133
- .then(ok => {
134
- if (!ok) {
135
- log?.error(`[${CHANNEL_KEY}] Message delivery failed after retries: msgId=${outgoing.msgId}`);
136
- }
135
+ // 完整发送日志由 ReliableEmitter 打印(含 idempotencyKey)
136
+ reliableEmitter.emitWithAck(EVENT_MESSAGE_PRIVATE, data, data.msgId).then((ok) => {
137
+ if (!ok)
138
+ log?.error(`[${CHANNEL_KEY}] Message delivery failed after retries: msgId=${data.msgId}`);
137
139
  });
138
140
  return true;
139
141
  };
140
- const sendReply = (targetId, text, replyToMsgId) => {
141
- log?.info(`[${CHANNEL_KEY}] sendReply: ${text} to ${targetId} (replyTo: ${replyToMsgId || "none"})`);
142
+ /**
143
+ * 发送文本回复消息。
144
+ * 自动生成 msgId 和 timestamp,封装为 PrivateMessageData 后调用 emit。
145
+ *
146
+ * @param targetId - 接收方用户 ID
147
+ * @param text - 回复文本内容
148
+ * @param replyToMsgId - 可选,回复对应的原始消息 ID(用于前端展示引用关系)
149
+ * @param agentId - 可选,目标 Agent ID
150
+ */
151
+ const sendReply = (targetId, text, replyToMsgId, agentId) => {
152
+ log?.info(`[${CHANNEL_KEY}] sendReply: ${text} to ${targetId} (replyTo: ${replyToMsgId || 'none'})`);
142
153
  return emit({
143
154
  msgId: generateMsgId(),
144
155
  from: botClientId,
@@ -146,9 +157,20 @@ export async function startGateway(ctx) {
146
157
  content: text,
147
158
  timestamp: Date.now(),
148
159
  replyToMsgId,
160
+ agentId,
149
161
  });
150
162
  };
151
- const sendFiles = (targetId, text, files, replyToMsgId) => {
163
+ /**
164
+ * 发送带文件附件的消息。
165
+ * 自动生成 msgId 和 timestamp,封装为 PrivateMessageData 后调用 emit。
166
+ *
167
+ * @param targetId - 接收方用户 ID
168
+ * @param text - 消息文本(可为空字符串)
169
+ * @param files - 文件附件列表({name, mimeType, bytes} 格式)
170
+ * @param replyToMsgId - 可选,回复对应的原始消息 ID
171
+ * @param agentId - 可选,目标 Agent ID
172
+ */
173
+ const sendFiles = (targetId, text, files, replyToMsgId, agentId) => {
152
174
  return emit({
153
175
  msgId: generateMsgId(),
154
176
  from: botClientId,
@@ -157,61 +179,55 @@ export async function startGateway(ctx) {
157
179
  timestamp: Date.now(),
158
180
  files,
159
181
  replyToMsgId,
182
+ agentId,
160
183
  });
161
184
  };
185
+ /** SocketEmitter 抽象:将 emit / sendReply / sendFiles 和 botClientId 打包传给 inbound 处理器 */
162
186
  const emitter = { emit, sendReply, sendFiles, botClientId };
163
187
  // ---- 入站消息处理器 ----
188
+ // createInboundHandler 返回一个异步函数,负责处理单条用户消息(文件处理、路由、AI 分发、回复)
164
189
  const handleInboundMessage = createInboundHandler(account, emitter, log);
165
- // ---- 消息队列 ----
166
- const messageQueue = [];
167
- let messageProcessorRunning = false;
168
- let queueNotify = null;
169
- const enqueueMessage = (msg) => {
170
- if (messageQueue.length >= MESSAGE_QUEUE_SIZE) {
171
- const dropped = messageQueue.shift();
172
- log?.error(`[${CHANNEL_KEY}] Queue full, dropped message from ${dropped?.senderId}`);
173
- }
174
- if (messageQueue.length >= MESSAGE_QUEUE_WARN_THRESHOLD) {
175
- log?.warn(`[${CHANNEL_KEY}] Queue size: ${messageQueue.length}/${MESSAGE_QUEUE_SIZE}`);
176
- }
177
- messageQueue.push(msg);
178
- // 唤醒处理器
179
- queueNotify?.();
180
- };
181
- /** 等待队列中有新消息,或超时后返回 */
182
- const waitForMessage = () => {
183
- if (messageQueue.length > 0)
184
- return Promise.resolve();
185
- return new Promise((resolve) => {
186
- const timer = setTimeout(() => { queueNotify = null; resolve(); }, QUEUE_POLL_INTERVAL);
187
- queueNotify = () => { clearTimeout(timer); queueNotify = null; resolve(); };
188
- });
189
- };
190
- const startMessageProcessor = () => {
191
- if (messageProcessorRunning)
190
+ // ---- 消息处理(fire-and-forget) ----
191
+ // 不做串行队列:并发/abort openclaw 的 session 写锁 + followup queue 负责。
192
+ // 这里仅兜底 inbound 自身未捕获的异常。
193
+ const handleMessage = (msg) => {
194
+ if (isAborted)
192
195
  return;
193
- messageProcessorRunning = true;
194
- const loop = async () => {
195
- while (!isAborted) {
196
- await waitForMessage();
197
- while (messageQueue.length > 0 && !isAborted) {
198
- const msg = messageQueue.shift();
199
- try {
200
- await handleInboundMessage(msg);
201
- }
202
- catch (err) {
203
- log?.error(`[${CHANNEL_KEY}] Message handler error: ${err}`);
204
- }
196
+ void (async () => {
197
+ try {
198
+ await handleInboundMessage(msg);
199
+ }
200
+ catch (err) {
201
+ log?.error(`[${CHANNEL_KEY}] Message handler error: ${err}`);
202
+ try {
203
+ emitter.sendReply(msg.senderId, "消息处理异常,请稍后重试。", msg.messageId);
204
+ emitter.emit({
205
+ msgId: generateMsgId(),
206
+ from: emitter.botClientId,
207
+ to: msg.senderId,
208
+ content: "",
209
+ timestamp: Date.now(),
210
+ kind: "typing_stop",
211
+ replyToMsgId: msg.messageId,
212
+ agentId: msg.agentId,
213
+ });
214
+ }
215
+ catch (notifyErr) {
216
+ log?.error(`[${CHANNEL_KEY}] Failed to notify user about handler error: ${notifyErr}`);
205
217
  }
206
218
  }
207
- messageProcessorRunning = false;
208
- };
209
- loop().catch((err) => {
210
- log?.error(`[${CHANNEL_KEY}] Message processor crashed: ${err}`);
211
- messageProcessorRunning = false;
212
- });
219
+ })();
213
220
  };
214
221
  // ---- 生命周期 ----
222
+ /**
223
+ * 销毁当前 Gateway 实例,释放所有资源:
224
+ * - 设置 isAborted 标志,终止消息处理循环
225
+ * - 销毁 ReliableEmitter(清空发送队列、取消重试)
226
+ * - 清除 health-monitor 心跳定时器
227
+ * - 从 socket 注册表中注销(unregisterSocket)
228
+ * - 从 activeGateways 中移除自身
229
+ * - 断开并销毁 WebSocket 连接
230
+ */
215
231
  const cleanup = () => {
216
232
  isAborted = true;
217
233
  reliableEmitter.destroy();
@@ -228,32 +244,46 @@ export async function startGateway(ctx) {
228
244
  }
229
245
  log?.info(`[${CHANNEL_KEY}] Gateway cleaned up`);
230
246
  };
247
+ // 将 cleanup 注册到全局 Map,供防重入检查和外部销毁使用
231
248
  activeGateways.set(account.accountId, cleanup);
232
- // ---- Socket.IO 连接 ----
233
- const validApiKeys = [...apiKeyMap.values()];
234
- log?.info(`[${CHANNEL_KEY}] Connecting to ${WS_URL}`);
235
- const socket = io(WS_URL, {
236
- auth: buildMultiAuthHeaders(validApiKeys),
237
- path: SOCKET_PATH,
238
- forceNew: true,
239
- reconnection: true,
240
- reconnectionAttempts: SOCKET_RECONNECTION_ATTEMPTS,
241
- reconnectionDelay: SOCKET_RECONNECTION_DELAY,
242
- reconnectionDelayMax: SOCKET_RECONNECTION_DELAY_MAX,
243
- transports: ['websocket']
249
+ // ---- WebSocket 连接 ----
250
+ // 采用 ticket 作为 query 参数进行认证,不再使用 header 方式
251
+ // 为兼容已有的 path 选项,仍通过 options.path 传入 /claw-socket
252
+ const ticketQuery = ticket ? `?ticket=${encodeURIComponent(ticket)}` : '';
253
+ log?.info(`[${CHANNEL_KEY}] Connecting to ${WS_URL}${SOCKET_PATH}${ticketQuery}`);
254
+ // 使用原生 WebSocket 封装层建立连接
255
+ const socket = new NativeSocketClient(WS_URL, {
256
+ // 认证:ticket 作为 URL query 参数,替代 Authorization header
257
+ path: `${SOCKET_PATH}${ticketQuery}&enableMultiLogin=false`,
258
+ // 注入日志对象,便于 NativeSocketClient 内部打印连接/重连/错误等诊断信息
259
+ log,
260
+ logPrefix: `[${CHANNEL_KEY}:${account.accountId}:NativeSocket]`,
244
261
  });
245
262
  currentSocket = socket;
246
- socket.on("connect", () => {
247
- log?.info(`[${CHANNEL_KEY}] Connected (id=${socket.id}, botClientId=${botClientId})`);
263
+ /**
264
+ * 连接成功事件处理。
265
+ * 触发时机:首次连接成功 或 断线重连成功。
266
+ * 职责:
267
+ * 1. 注册 socket 到全局注册表(供 outbound 模块查找)
268
+ * 2. 恢复 ReliableEmitter 的发送能力(resume)
269
+ * 3. 启动消息处理循环(首次连接时启动,重连时幂等)
270
+ * 4. Flush 断线期间缓冲的 outbound 消息
271
+ * 5. 启动 health-monitor 心跳定时器
272
+ * 6. 通知框架 gateway 已就绪(onReady)
273
+ */
274
+ socket.on('connect', () => {
275
+ log?.info(`[${CHANNEL_KEY}] Connected (accountId=${account.accountId}, id=${socket.id}, botClientId=${botClientId})`);
276
+ // 注册到全局 socket 注册表,供 outbound.ts 查找 socket 实例
248
277
  registerSocket(account.accountId, socket, botClientId, reliableEmitter);
278
+ // 恢复可靠发送器(断线时已 pause,重连后需要 resume 才能继续发送)
249
279
  reliableEmitter.resume();
250
- startMessageProcessor();
251
- // 重连后 flush 断线期间缓冲的 outbound 消息
280
+ // 重连后 flush 断线期间缓冲的 outbound 消息(主动发送场景)
252
281
  const { sent, failed } = flushPendingMessages(account.accountId, log);
253
282
  if (sent > 0 || failed > 0) {
254
283
  log?.info(`[${CHANNEL_KEY}] Flushed buffered outbound messages: sent=${sent}, failed=${failed}`);
255
284
  }
256
- // 启动 health-monitor 心跳:定期刷新 lastEventAt,防止空闲期被误判 stale-socket
285
+ // 启动 health-monitor 心跳:定期刷新 lastEventAt,防止空闲期被框架误判销毁
286
+ // 重连时先清除旧定时器,再重新创建
257
287
  if (healthHeartbeatTimer)
258
288
  clearInterval(healthHeartbeatTimer);
259
289
  healthHeartbeatTimer = setInterval(() => {
@@ -264,44 +294,60 @@ export async function startGateway(ctx) {
264
294
  }, HEALTH_HEARTBEAT_INTERVAL);
265
295
  onReady?.();
266
296
  });
267
- // 绑定业务事件处理器
297
+ // 绑定业务事件处理器(message:private 等),委托给 socket-handlers.ts
268
298
  bindSocketHandlers(socket, {
269
299
  account,
270
300
  botClientId,
271
301
  log,
272
- enqueueMessage,
302
+ handleMessage,
273
303
  onEvent,
274
304
  reliableEmitter,
275
305
  });
276
- socket.on("connect_error", (err) => {
277
- log?.error(`[${CHANNEL_KEY}] connect_error: ${err.message}`);
306
+ /**
307
+ * 连接错误事件处理。
308
+ * 触发时机:WebSocket 握手或认证失败时。
309
+ * 注意:NativeSocketClient 会自动重试,此处仅记录日志。
310
+ */
311
+ socket.on('connect_error', (err) => {
312
+ const message = err instanceof Error ? err.message : String(err);
313
+ log?.error(`[${CHANNEL_KEY}] connect_error: ${message}`);
278
314
  });
279
- socket.on("disconnect", (reason) => {
315
+ /**
316
+ * 断线事件处理。
317
+ * 触发时机:网络中断、服务端主动断开、客户端主动断开等。
318
+ * 职责:
319
+ * 1. 暂停 ReliableEmitter(断线期间消息进入缓冲队列)
320
+ * 2. 清除 health-monitor 心跳定时器(避免在未连接状态下假装活跃)
321
+ * 3. 通知框架 gateway 已断线(onDisconnect)
322
+ * 4. 若是服务端主动断开(io server disconnect),手动触发重连
323
+ *
324
+ * 注意:断线时不调用 unregisterSocket,保留 entry 以便 outbound 消息可以缓冲。
325
+ * 仅在 cleanup(gateway 彻底销毁)时才 unregisterSocket。
326
+ */
327
+ socket.on('disconnect', (reason) => {
280
328
  log?.info(`[${CHANNEL_KEY}] Disconnected: ${reason}`);
329
+ // 暂停可靠发送器,断线期间的消息将进入内存缓冲队列
281
330
  reliableEmitter.pause();
282
331
  // 断线时停止心跳,避免在未连接状态下假装活跃
283
332
  if (healthHeartbeatTimer) {
284
333
  clearInterval(healthHeartbeatTimer);
285
334
  healthHeartbeatTimer = null;
286
335
  }
287
- // 注意:断线时不调用 unregisterSocket,保留 entry 以便 outbound 消息可以缓冲。
288
- // 仅在 cleanup(gateway 彻底销毁)时才 unregisterSocket。
289
336
  onDisconnect?.();
290
- if (reason === "io server disconnect") {
291
- // 服务端主动断开,需要手动重连
337
+ if (reason === 'io server disconnect') {
338
+ // 服务端主动断开(如 token 过期、服务重启),需要手动触发重连
292
339
  log?.warn(`[${CHANNEL_KEY}] Server forced disconnect, attempting manual reconnect...`);
293
340
  socket.connect();
294
341
  }
295
342
  });
296
343
  // ---- 保持 Promise 挂起直到 abort ----
297
- // 框架认为 startAccount 返回的 Promise resolve = gateway 已退出,会触发 auto-restart。
298
- // 因此必须让 Promise 一直挂起,直到 abortSignal 触发才 resolve。
344
+ // 框架约定:startAccount 返回的 Promise resolve = gateway 已退出,会触发 auto-restart。
345
+ // 因此必须让 Promise 一直挂起,直到 abortSignal 触发(框架主动停止账号)才 resolve。
299
346
  return new Promise((resolve) => {
300
- abortSignal.addEventListener("abort", () => {
347
+ abortSignal.addEventListener('abort', () => {
301
348
  cleanup();
302
349
  log?.info(`[${CHANNEL_KEY}] Gateway aborted`);
303
350
  resolve();
304
351
  });
305
352
  });
306
353
  }
307
- //# sourceMappingURL=gateway.js.map
@@ -288,4 +288,3 @@ export function findCronSessionsByJobIds(cronJobIds, agentId) {
288
288
  })
289
289
  .sort((a, b) => (a.updatedAt ?? 0) - (b.updatedAt ?? 0)); // 时间正序
290
290
  }
291
- //# sourceMappingURL=cron-utils.js.map
@@ -21,4 +21,3 @@ export { isSystemInjectedUserMessage, extractText, extractRawText, extractThinki
21
21
  export { isCronSessionKey, isCronRunKey, isCronBaseKey, extractCronJobId, extractCronRunId, classifySessionKey, listCronSessions, groupCronSessionsByJob, extractCronInfoFromText, cleanCronUserMessage, extractCronJobIdsFromTranscript, findCronSessionsByJobIds, } from "./cron-utils.js";
22
22
  // ── Session Reader (核心 API) ──
23
23
  export { readSessionHistory, readSessionHistoryTail, readCronHistory, readSessionHistoryWithCron, listSessions, } from "./session-reader.js";
24
- //# sourceMappingURL=index.js.map
@@ -240,4 +240,3 @@ export function normalizeMessage(msg) {
240
240
  ...(files && files.length > 0 && { files }),
241
241
  };
242
242
  }
243
- //# sourceMappingURL=message-parser.js.map
@@ -267,6 +267,9 @@ function parseLines(lines, opts) {
267
267
  const msg = parsed?.message;
268
268
  if (!msg || typeof msg !== "object")
269
269
  continue;
270
+ // 过滤 openclaw delivery-mirror 消息(镜像投递,非真实消息)
271
+ if (msg.model === "delivery-mirror")
272
+ continue;
270
273
  // 过滤传输层伪装为 user 的系统注入消息
271
274
  if (isSystemInjectedUserMessage(msg))
272
275
  continue;
@@ -284,4 +287,3 @@ function parseLines(lines, opts) {
284
287
  // 只返回最后 limit 条
285
288
  return messages.length > limit ? messages.slice(-limit) : messages;
286
289
  }
287
- //# sourceMappingURL=session-reader.js.map
@@ -169,4 +169,3 @@ function _findArchivedTranscript(dir, jsonlFileName) {
169
169
  }
170
170
  return null;
171
171
  }
172
- //# sourceMappingURL=session-store.js.map
@@ -130,4 +130,3 @@ export function deduplicateFiles(files) {
130
130
  }
131
131
  return [...seen.values()];
132
132
  }
133
- //# sourceMappingURL=text-processing.js.map
@@ -4,4 +4,3 @@
4
4
  * 集中定义历史消息相关的类型,供 history/ 模块内部和外部统一使用。
5
5
  */
6
6
  export {};
7
- //# sourceMappingURL=types.js.map