lightclawbot 1.1.2 → 1.2.0-beta.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (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 +301 -257
  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 +226 -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 +183 -234
  19. package/dist/src/media.js +0 -1
  20. package/dist/src/messaging.js +65 -0
  21. package/dist/src/outbound.js +131 -45
  22. package/dist/src/runtime.js +29 -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 +23 -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,272 +1,316 @@
1
1
  /**
2
- * LightClaw — ChannelPlugin 主定义
2
+ * LightClaw — ChannelPlugin 主定义文件
3
3
  *
4
- * 这是 OpenClaw 框架的「注册契约」:
5
- * 声明插件 ID、能力、配置管理、出站适配、Gateway 生命周期等。
6
- * 框架通过这个对象了解你的插件能做什么、怎么启动、怎么发消息。
4
+ * 使用 OpenClaw SDK 标准的 createChatChannelPlugin 构建器创建聊天频道插件,
5
+ *
6
+ * 主要结构组成:
7
+ * base: 基础配置 - 来自 shared.ts 的 createLightclawPluginBase + 扩展字段
8
+ * messaging: 消息目标解析 - 处理消息发送目标的标准化和验证
9
+ * status: 状态管理 - 插件运行状态监控和状态面板构建
10
+ * gateway: Gateway 生命周期 - WebSocket 连接管理和账户生命周期
11
+ * outbound: 出站消息适配器 - 消息发送和媒体文件处理
12
+ *
13
+ * 该插件实现了与 AI 助手服务的 WebSocket 通信、消息收发、状态管理等核心功能。
7
14
  */
8
- import { applyAccountNameToChannelSection, deleteAccountFromConfigSection, setAccountEnabledInConfigSection, } from "openclaw/plugin-sdk/core";
9
- import { CHANNEL_KEY, DEFAULT_ACCOUNT_ID, TEXT_CHUNK_LIMIT, listAccountIds, resolveAccount, defaultAccountId, applyAccountConfig, } from "./config.js";
10
- import { sendText, sendMedia } from "./outbound.js";
11
- import { startGateway } from "./gateway.js";
12
- /** 文本分块:按 limit 长度拆分,优先在换行 / 空格处切割 */
13
- function chunkText(text, limit) {
14
- if (text.length <= limit)
15
- return [text];
16
- const chunks = [];
17
- let remaining = text;
18
- while (remaining.length > 0) {
19
- if (remaining.length <= limit) {
20
- chunks.push(remaining);
21
- break;
22
- }
23
- let splitAt = remaining.lastIndexOf("\n", limit);
24
- if (splitAt <= 0 || splitAt < limit * 0.5) {
25
- splitAt = remaining.lastIndexOf(" ", limit);
26
- }
27
- if (splitAt <= 0 || splitAt < limit * 0.5) {
28
- splitAt = limit;
29
- }
30
- chunks.push(remaining.slice(0, splitAt));
31
- remaining = remaining.slice(splitAt).trimStart();
32
- }
33
- return chunks;
34
- }
35
- // ============================================================
36
- // ChannelPlugin 定义
37
- // ============================================================
38
- export const myAssistantPlugin = {
39
- id: CHANNEL_KEY,
40
- // ---- 元信息 ----
41
- meta: {
42
- id: CHANNEL_KEY,
43
- label: "LightClawBot",
44
- selectionLabel: "LightClawBot",
45
- docsPath: "/docs/channels/lightclawbot",
46
- blurb: "Connect OpenClaw to your LightClawBot via WebSocket long-connection",
47
- order: 60,
48
- },
49
- // ---- 能力声明 ----
50
- capabilities: {
51
- chatTypes: ["direct"],
52
- media: true,
53
- reactions: false,
54
- threads: false,
55
- // true = deliver 回调会收到 kind="block" 的中间块,实现流式推送
56
- blockStreaming: true,
57
- },
58
- // ---- 配置管理(多账户) ----
59
- config: {
60
- listAccountIds: (cfg) => listAccountIds(cfg),
61
- resolveAccount: (cfg, accountId) => resolveAccount(cfg, accountId),
62
- defaultAccountId: (cfg) => defaultAccountId(cfg),
63
- setAccountEnabled: ({ cfg, accountId, enabled }) => setAccountEnabledInConfigSection({
64
- cfg,
65
- sectionKey: CHANNEL_KEY,
66
- accountId,
67
- enabled,
68
- allowTopLevel: true,
69
- }),
70
- deleteAccount: ({ cfg, accountId }) => deleteAccountFromConfigSection({
71
- cfg,
72
- sectionKey: CHANNEL_KEY,
73
- accountId,
74
- clearBaseFields: ["apiKeys", "apiBaseUrl", "name"],
75
- }),
76
- isConfigured: (account) => Boolean(account?.allApiKeys?.length),
77
- describeAccount: (account) => ({
78
- accountId: account?.accountId ?? DEFAULT_ACCOUNT_ID,
79
- name: account?.name,
80
- enabled: account?.enabled ?? false,
81
- configured: Boolean(account?.allApiKeys?.length),
82
- tokenSource: account?.secretSource,
15
+ import { createChatChannelPlugin } from 'openclaw/plugin-sdk/core';
16
+ // 导入工具函数和常量
17
+ import { chunkText, defaultAccountId } from './utils/index.js';
18
+ import { CHANNEL_KEY, DEFAULT_ACCOUNT_ID, TEXT_CHUNK_LIMIT } from './config.js';
19
+ // 导入功能模块
20
+ import { sendText, sendMedia } from './outbound.js'; // 出站消息发送
21
+ import { startGateway } from './gateway.js'; // WebSocket Gateway 启动
22
+ import { createLightclawPluginBase } from './shared.js'; // 基础插件配置
23
+ import { lightclawSetupAdapter } from './setup-core.js'; // Setup 适配器
24
+ import { normalizeTarget, looksLikeId } from './messaging.js'; // 消息目标处理
25
+ /**
26
+ * LightClaw 主插件实例
27
+ *
28
+ * 使用 createChatChannelPlugin 工厂函数创建类型安全的 ChannelPlugin 实例,
29
+ * 泛型参数 ResolvedAssistantAccount 指定了账户数据的类型结构。
30
+ *
31
+ * @type {ChannelPlugin<ResolvedAssistantAccount>}
32
+ */
33
+ export const lightclawPlugin = createChatChannelPlugin({
34
+ // ==================== 基础配置 ====================
35
+ base: {
36
+ // ---- 来自 shared.ts 的基础定义 ----
37
+ // 使用扩展运算符合并基础配置和 setup 适配器
38
+ ...createLightclawPluginBase({
39
+ setup: lightclawSetupAdapter, // Setup 阶段使用的适配器
83
40
  }),
84
- resolveAllowFrom: ({ cfg, accountId }) => {
85
- const account = resolveAccount(cfg, accountId);
86
- return account.allowFrom.map(String);
87
- },
88
- },
89
- // ---- Setup(命令行配置) ----
90
- setup: {
91
- resolveAccountId: ({ accountId }) => accountId?.trim().toLowerCase() || DEFAULT_ACCOUNT_ID,
92
- applyAccountName: ({ cfg, accountId, name }) => applyAccountNameToChannelSection({ cfg, channelKey: CHANNEL_KEY, accountId, name }),
93
- validateInput: ({ input }) => {
94
- if (!input.token && !input.useEnv) {
95
- return "Requires --token <apiKey> or --use-env (set LIGHTCLAW_API_KEY, LIGHTCLAW_API_BASE_URL)";
96
- }
97
- return null;
98
- },
99
- applyAccountConfig: ({ cfg, accountId, input }) => {
100
- return applyAccountConfig(cfg, accountId, {
101
- apiKey: input.token,
102
- apiBaseUrl: input.apiBaseUrl,
103
- name: input.name,
104
- });
105
- },
106
- },
107
- // ---- 消息目标解析 ----
108
- // 使用标准 user:/channel: 前缀,确保框架的 detectTargetKind 能正确识别 peer kind
109
- messaging: {
110
- normalizeTarget: (target) => {
111
- // 剥离通道名前缀 (lightclawbot:)
112
- const cleaned = target.replace(new RegExp(`^${CHANNEL_KEY}:`, "i"), "");
113
- if (!cleaned)
114
- return undefined;
115
- // dm:xxx → user:xxx (私聊)
116
- if (cleaned.startsWith("dm:")) {
117
- return `user:${cleaned.slice(3)}`;
118
- }
119
- // group:xxx → channel:xxx (群聊)
120
- if (cleaned.startsWith("group:")) {
121
- return `channel:${cleaned.slice(6)}`;
122
- }
123
- // 已经是标准格式 user:/channel:,原样返回
124
- if (/^(user|channel):/i.test(cleaned)) {
125
- return cleaned;
126
- }
127
- // 纯 ID,默认当作私聊
128
- return `user:${cleaned}`;
41
+ // ---- 消息目标解析配置 ----
42
+ messaging: {
43
+ /**
44
+ * 目标标准化函数
45
+ * 对原始目标字符串进行标准化处理:去除空格、统一格式、转换编码等
46
+ *
47
+ * @param {string} target - 原始目标字符串
48
+ * @returns {string} 标准化后的目标字符串
49
+ */
50
+ normalizeTarget: (target) => {
51
+ return normalizeTarget(target);
52
+ },
53
+ /** 目标解析器配置 */
54
+ targetResolver: {
55
+ /**
56
+ * ID 格式检测函数
57
+ * 判断一个原始字符串是否看起来像一个有效的 ID 格式
58
+ * 用于在完整解析前快速分流处理逻辑,提高性能
59
+ *
60
+ * @param {string} id - 待检测的字符串
61
+ * @param {string} [normalized] - 可选的标准化的字符串
62
+ * @returns {boolean} 是否看起来像 ID 格式
63
+ */
64
+ looksLikeId: (id, normalized) => {
65
+ return looksLikeId(id, normalized);
66
+ },
67
+ /**
68
+ * 目标格式提示文本
69
+ * 显示在 CLI 帮助信息中,指导用户正确的目标格式
70
+ */
71
+ hint: `user:<userId> or channel:<groupId>`,
72
+ },
129
73
  },
130
- targetResolver: {
131
- looksLikeId: (id, normalized) => {
132
- const value = (normalized ?? id).trim();
133
- if (!value)
134
- return false;
135
- // 标准前缀格式
136
- if (/^(user|channel):/i.test(value))
137
- return true;
138
- // lightclawbot 自有格式
139
- const cleaned = value.replace(new RegExp(`^${CHANNEL_KEY}:`, "i"), "");
140
- return /^(dm|group):\d+/.test(cleaned) || /^\d+$/.test(cleaned);
74
+ // ---- 状态面板配置 ----
75
+ status: {
76
+ /** 默认运行时状态配置 */
77
+ defaultRuntime: {
78
+ accountId: DEFAULT_ACCOUNT_ID, // 默认账户ID
79
+ running: false, // 运行状态:未运行
80
+ connected: false, // 连接状态:未连接
81
+ lastConnectedAt: null, // 最后连接时间:null
82
+ lastError: null, // 最后错误信息:null
141
83
  },
142
- hint: `user:<userId> or channel:<groupId>`,
84
+ /**
85
+ * 构建频道摘要信息
86
+ * 根据快照数据生成频道级别的状态摘要
87
+ *
88
+ * @param {Object} param0 - 参数对象
89
+ * @param {Object} param0.snapshot - 状态快照数据
90
+ * @returns {Object} 频道摘要信息
91
+ */
92
+ buildChannelSummary: ({ snapshot }) => ({
93
+ configured: snapshot.configured ?? false, // 是否已配置
94
+ running: snapshot.running ?? false, // 是否正在运行
95
+ connected: snapshot.connected ?? false, // 是否已连接
96
+ lastConnectedAt: snapshot.lastConnectedAt ?? null, // 最后连接时间
97
+ lastError: snapshot.lastError ?? null, // 最后错误信息
98
+ }),
99
+ /**
100
+ * 构建账户快照信息
101
+ * 根据账户、运行时和配置数据生成账户级别的状态快照
102
+ *
103
+ * @param {Object} param0 - 参数对象
104
+ * @param {ResolvedAssistantAccount} param0.account - 账户信息
105
+ * @param {Object} param0.runtime - 运行时状态
106
+ * @param {OpenClawConfig} param0.cfg - 配置信息
107
+ * @returns {Object} 账户快照信息
108
+ */
109
+ buildAccountSnapshot: ({ account, runtime, cfg }) => ({
110
+ accountId: account?.accountId ?? defaultAccountId(cfg), // 账户ID,优先使用账户的ID
111
+ name: account?.name, // 账户名称
112
+ enabled: account?.enabled ?? false, // 是否启用
113
+ configured: Boolean(account?.apiKey), // 是否已配置(有API密钥)
114
+ running: runtime?.running ?? false, // 是否正在运行
115
+ connected: runtime?.connected ?? false, // 是否已连接
116
+ lastConnectedAt: runtime?.lastConnectedAt ?? null, // 最后连接时间
117
+ lastError: runtime?.lastError ?? null, // 最后错误信息
118
+ }),
143
119
  },
144
- },
145
- // ---- 出站消息适配器 ----
146
- outbound: {
147
- deliveryMode: "direct",
148
- chunker: chunkText,
149
- chunkerMode: "markdown",
150
- textChunkLimit: TEXT_CHUNK_LIMIT,
151
- resolveTarget: ({ to, allowFrom, mode }) => {
152
- // 优先使用显式 to;implicit 模式下回退到 allowFrom 第一个非通配符条目
153
- const effectiveTo = to?.trim();
154
- if (effectiveTo) {
155
- return { ok: true, to: effectiveTo };
156
- }
157
- if (mode === "implicit" && allowFrom && allowFrom.length > 0) {
158
- const candidate = allowFrom.find((entry) => entry && entry !== "*");
159
- if (candidate) {
160
- return { ok: true, to: candidate };
120
+ // ---- Gateway 生命周期管理(核心功能) ----
121
+ gateway: {
122
+ /**
123
+ * 启动账户
124
+ * 建立 WebSocket 长连接到 AI 助手服务器
125
+ * OpenClaw 框架会在加载配置后为每个启用的账户调用此方法
126
+ *
127
+ * @async
128
+ * @param {Object} ctx - 上下文对象
129
+ * @param {ResolvedAssistantAccount} ctx.account - 账户信息
130
+ * @param {AbortSignal} ctx.abortSignal - 中止信号,用于取消操作
131
+ * @param {Object} ctx.log - 日志记录器
132
+ * @param {OpenClawConfig} ctx.cfg - 配置信息
133
+ * @param {Function} ctx.setStatus - 状态设置函数
134
+ * @param {Function} ctx.getStatus - 状态获取函数
135
+ */
136
+ startAccount: async (ctx) => {
137
+ const { account, abortSignal, log, cfg, accountId } = ctx;
138
+ // 记录启动日志
139
+ log?.info(`[${CHANNEL_KEY}:${accountId}] Starting gateway...`);
140
+ // 启动并维持一个 Socket.IO Gateway 实例
141
+ await startGateway({
142
+ account, // 账户信息
143
+ abortSignal, // 中止信号
144
+ cfg, // 配置信息
145
+ log, // 日志记录器
146
+ /**
147
+ * WebSocket 连接就绪回调
148
+ * 当 WebSocket 连接成功建立时调用
149
+ */
150
+ onReady: () => {
151
+ log?.info(`[${CHANNEL_KEY}:${accountId}] Gateway ready: WS connected`);
152
+ const now = Date.now();
153
+ // 更新运行时状态
154
+ ctx.setStatus({
155
+ ...ctx.getStatus(), // 保留现有状态
156
+ running: true, // 设置为运行中
157
+ connected: true, // 设置为已连接
158
+ lastConnectedAt: now, // 记录最后连接时间
159
+ // 连接建立时即设置 lastEventAt,作为 health-monitor stale-socket 检测的初始基准
160
+ lastEventAt: now, // 最后事件时间
161
+ });
162
+ },
163
+ /**
164
+ * WebSocket 连接断开回调
165
+ * 当 WebSocket 连接断开时调用
166
+ */
167
+ onDisconnect: () => {
168
+ log?.info(`[${CHANNEL_KEY}:${accountId}] Gateway ready: WS disconnect`);
169
+ // 更新连接状态为断开
170
+ ctx.setStatus({
171
+ ...ctx.getStatus(), // 保留现有状态
172
+ connected: false, // 设置为未连接
173
+ });
174
+ },
175
+ /**
176
+ * 错误回调
177
+ * 当发生错误时调用,记录错误信息但不中断重连逻辑
178
+ * 重连逻辑由 gateway 内部处理
179
+ *
180
+ * @param {Error} error - 错误对象
181
+ */
182
+ onError: (error) => {
183
+ log?.error(`[${CHANNEL_KEY}:${accountId}] Gateway error: ${error.message}`);
184
+ // 记录错误信息
185
+ ctx.setStatus({
186
+ ...ctx.getStatus(), // 保留现有状态
187
+ lastError: error.message, // 记录错误消息
188
+ });
189
+ },
190
+ /**
191
+ * 入站事件回调
192
+ * 每次收到消息时调用,用于:
193
+ * - 刷新 lastEventAt 和 lastInboundAt 时间戳
194
+ * - 通知框架 health-monitor 该连接仍处于活跃状态
195
+ * - 防止因长时间无活动而被判定为僵死连接
196
+ */
197
+ onEvent: () => {
198
+ log?.info(`[${CHANNEL_KEY}:${accountId}] Gateway Ready: WS message enter`);
199
+ // 更新事件时间戳
200
+ ctx.setStatus({
201
+ ...ctx.getStatus(), // 保留现有状态
202
+ lastEventAt: Date.now(), // 最后事件时间
203
+ lastInboundAt: Date.now(), // 最后入站消息时间
204
+ });
205
+ },
206
+ });
207
+ },
208
+ /**
209
+ * 登出账户
210
+ * 清除账户的凭证信息(如 API 密钥)
211
+ *
212
+ * @async
213
+ * @param {Object} param0 - 参数对象
214
+ * @param {string} param0.accountId - 账户ID
215
+ * @param {OpenClawConfig} param0.cfg - 配置信息
216
+ * @returns {Promise<{ok: boolean, cleared: boolean}>} 操作结果
217
+ */
218
+ logoutAccount: async ({ accountId, cfg }) => {
219
+ // 创建配置副本以避免修改原始配置
220
+ const nextCfg = { ...cfg };
221
+ // 获取当前 channel 的配置节
222
+ const section = nextCfg.channels?.[CHANNEL_KEY];
223
+ let cleared = false; // 清理标志
224
+ if (section) {
225
+ // 处理默认账户的 API 密钥
226
+ if (accountId === DEFAULT_ACCOUNT_ID && section.apiKeys) {
227
+ delete section.apiKeys; // 删除默认账户的 API 密钥
228
+ cleared = true; // 标记为已清理
229
+ }
230
+ // 处理特定账户的 API 密钥
231
+ const accounts = section.accounts;
232
+ if (accounts?.[accountId]?.apiKeys) {
233
+ delete accounts[accountId].apiKeys; // 删除指定账户的 API 密钥
234
+ cleared = true; // 标记为已清理
235
+ }
161
236
  }
162
- }
163
- return {
164
- ok: false,
165
- error: new Error(`No delivery target for ${CHANNEL_KEY}. Specify a target with --to or configure allowFrom.`),
166
- };
167
- },
168
- sendText: async ({ to, text, accountId, replyToId, cfg }) => {
169
- return sendText({ to, text, accountId, replyToId, cfg });
170
- },
171
- sendMedia: async ({ to, text, mediaUrl, accountId, replyToId, cfg }) => {
172
- return sendMedia({ to, text, mediaUrl, accountId, replyToId, cfg });
237
+ // 返回操作结果
238
+ return { ok: true, cleared };
239
+ },
173
240
  },
174
241
  },
175
- // ---- Gateway 生命周期(核心!) ----
176
- gateway: {
177
- /**
178
- * 启动账户:建立 WS 长连接到你的 AI 助手 Server
179
- * OpenClaw 会在加载配置后为每个 enabled 的账户调用此方法
180
- */
181
- startAccount: async (ctx) => {
182
- const { account, abortSignal, log, cfg } = ctx;
183
- log?.info(`[${CHANNEL_KEY}:${account.accountId}] Starting gateway...`);
184
- await startGateway({
185
- account,
186
- abortSignal,
187
- cfg,
188
- log,
189
- onReady: () => {
190
- log?.info(`[${CHANNEL_KEY}:${account.accountId}] Gateway ready, WS connected`);
191
- const now = Date.now();
192
- ctx.setStatus({
193
- ...ctx.getStatus(),
194
- running: true,
195
- connected: true,
196
- lastConnectedAt: now,
197
- // 连接建立时即设置 lastEventAt,作为 health-monitor stale-socket 检测的初始基准
198
- lastEventAt: now,
199
- });
200
- },
201
- onDisconnect: () => {
202
- ctx.setStatus({
203
- ...ctx.getStatus(),
204
- connected: false,
205
- });
206
- },
207
- onError: (error) => {
208
- log?.error(`[${CHANNEL_KEY}:${account.accountId}] Gateway error: ${error.message}`);
209
- ctx.setStatus({
210
- ...ctx.getStatus(),
211
- lastError: error.message,
212
- });
213
- },
214
- onEvent: () => {
215
- // 通知框架收到了入站事件,防止 health-monitor 因 lastEventAt 过期而误判 stale-socket
216
- ctx.setStatus({
217
- ...ctx.getStatus(),
218
- lastEventAt: Date.now(),
219
- lastInboundAt: Date.now(),
220
- });
221
- },
222
- });
223
- },
224
- /** 登出账户:清除凭证 */
225
- logoutAccount: async ({ accountId, cfg }) => {
226
- const nextCfg = { ...cfg };
227
- const section = nextCfg.channels?.[CHANNEL_KEY];
228
- let cleared = false;
229
- if (section) {
230
- if (accountId === DEFAULT_ACCOUNT_ID && section.apiKeys) {
231
- delete section.apiKeys;
232
- cleared = true;
242
+ // ==================== 出站消息适配器 ====================
243
+ outbound: {
244
+ // 基础出站配置
245
+ base: {
246
+ deliveryMode: 'direct', // 交付模式:直接交付
247
+ chunker: chunkText, // 文本分块处理器
248
+ chunkerMode: 'markdown', // 分块模式:Markdown
249
+ textChunkLimit: TEXT_CHUNK_LIMIT, // 文本分块限制大小
250
+ /**
251
+ * 目标解析函数
252
+ * 解析消息发送的目标地址
253
+ *
254
+ * @param {Object} param0 - 参数对象
255
+ * @param {string} param0.to - 显式指定的目标
256
+ * @param {string[]} param0.allowFrom - 允许的来源列表
257
+ * @param {string} param0.mode - 模式('direct' 'implicit')
258
+ * @returns {Object} 解析结果
259
+ */
260
+ resolveTarget: ({ to, allowFrom, mode }) => {
261
+ // 优先使用显式指定的目标地址
262
+ const effectiveTo = to?.trim();
263
+ if (effectiveTo) {
264
+ return { ok: true, to: effectiveTo };
233
265
  }
234
- const accounts = section.accounts;
235
- if (accounts?.[accountId]?.apiKeys) {
236
- delete accounts[accountId].apiKeys;
237
- cleared = true;
266
+ // implicit 模式下回退到 allowFrom 第一个非通配符条目
267
+ if (mode === 'implicit' && allowFrom && allowFrom.length > 0) {
268
+ const candidate = allowFrom.find((entry) => entry && entry !== '*');
269
+ if (candidate) {
270
+ return { ok: true, to: candidate };
271
+ }
238
272
  }
239
- }
240
- return { ok: true, cleared };
273
+ // 没有找到有效目标,返回错误
274
+ return {
275
+ ok: false,
276
+ error: new Error(`No delivery target for ${CHANNEL_KEY}. Specify a target with --to or configure allowFrom.`),
277
+ };
278
+ },
241
279
  },
242
- },
243
- // ---- 状态面板 ----
244
- status: {
245
- defaultRuntime: {
246
- accountId: DEFAULT_ACCOUNT_ID,
247
- running: false,
248
- connected: false,
249
- lastConnectedAt: null,
250
- lastError: null,
280
+ // 附加结果处理
281
+ attachedResults: {
282
+ channel: CHANNEL_KEY, // 频道标识
283
+ /**
284
+ * 发送文本消息
285
+ *
286
+ * @async
287
+ * @param {Object} param0 - 参数对象
288
+ * @param {string} param0.to - 目标地址
289
+ * @param {string} param0.text - 文本内容
290
+ * @param {string} param0.accountId - 账户ID
291
+ * @param {string} param0.replyToId - 回复消息ID
292
+ * @param {OpenClawConfig} param0.cfg - 配置信息
293
+ * @returns {Promise<any>} 发送结果
294
+ */
295
+ sendText: async ({ to, text, accountId, replyToId, cfg }) => {
296
+ return sendText({ to, text, accountId, replyToId, cfg });
297
+ },
298
+ /**
299
+ * 发送媒体消息
300
+ *
301
+ * @async
302
+ * @param {Object} param0 - 参数对象
303
+ * @param {string} param0.to - 目标地址
304
+ * @param {string} param0.text - 文本内容
305
+ * @param {string} param0.mediaUrl - 媒体文件URL
306
+ * @param {string} param0.accountId - 账户ID
307
+ * @param {string} param0.replyToId - 回复消息ID
308
+ * @param {OpenClawConfig} param0.cfg - 配置信息
309
+ * @returns {Promise<any>} 发送结果
310
+ */
311
+ sendMedia: async ({ to, text, mediaUrl, accountId, replyToId, cfg }) => {
312
+ return sendMedia({ to, text, mediaUrl, accountId, replyToId, cfg });
313
+ },
251
314
  },
252
- buildChannelSummary: ({ snapshot }) => ({
253
- configured: snapshot.configured ?? false,
254
- running: snapshot.running ?? false,
255
- connected: snapshot.connected ?? false,
256
- lastConnectedAt: snapshot.lastConnectedAt ?? null,
257
- lastError: snapshot.lastError ?? null,
258
- }),
259
- buildAccountSnapshot: ({ account, runtime, }) => ({
260
- accountId: account?.accountId ?? DEFAULT_ACCOUNT_ID,
261
- name: account?.name,
262
- enabled: account?.enabled ?? false,
263
- configured: Boolean(account?.allApiKeys?.length),
264
- tokenSource: account?.secretSource,
265
- running: runtime?.running ?? false,
266
- connected: runtime?.connected ?? false,
267
- lastConnectedAt: runtime?.lastConnectedAt ?? null,
268
- lastError: runtime?.lastError ?? null,
269
- }),
270
315
  },
271
- };
272
- //# sourceMappingURL=channel.js.map
316
+ });
@@ -0,0 +1,16 @@
1
+ /**
2
+ * LightClaw — Setup-only 轻量插件
3
+ *
4
+ * 参照 Discord 的 channel.setup.ts 模式:
5
+ * 仅包含 shared base 骨架(id, meta, config, setup),
6
+ * 不加载 gateway / inbound / outbound 等运行时重依赖。
7
+ *
8
+ * 用于插件未配置/未启用时的 setup 流程,避免拉起不必要的运行时。
9
+ */
10
+ import { createLightclawPluginBase } from "./shared.js";
11
+ import { lightclawSetupAdapter } from "./setup-core.js";
12
+ export const lightclawSetupPlugin = {
13
+ ...createLightclawPluginBase({
14
+ setup: lightclawSetupAdapter,
15
+ }),
16
+ };