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
package/README.md CHANGED
@@ -69,7 +69,6 @@ src/
69
69
  ├── download-tool.ts # AI 工具:下载/获取文件 URL
70
70
  ├── dedup.ts # 消息去重与防抖
71
71
  ├── media.ts # 媒体工具函数
72
- ├── format-urls.ts # 文件 URL 自动转 Markdown 链接
73
72
  ├── types.ts # 类型定义
74
73
  └── history/ # 历史消息读取
75
74
  ```
package/dist/index.js CHANGED
@@ -1,34 +1,41 @@
1
- import { emptyPluginConfigSchema } from "openclaw/plugin-sdk/core";
2
- import { myAssistantPlugin } from "./src/channel.js";
3
- import { setAssistantRuntime } from "./src/runtime.js";
4
- import { registerUploadTool } from "./src/upload-tool.js";
5
- // import { registerDownloadTool } from "./src/download-tool.js";
6
- const plugin = {
1
+ /**
2
+ * LightClaw 主入口文件
3
+ *
4
+ * 使用 OpenClaw SDK 标准的 defineChannelPluginEntry 工厂函数替代手动创建 plugin 对象,
5
+ * 遵循 Discord/Slack 等官方 channel 插件的标准 index.ts 模式。
6
+ *
7
+ * 该文件定义了 LightClawBot channel plugin 的入口配置,包括插件ID、名称、描述、
8
+ * 核心插件实现、运行时设置和工具注册等功能。
9
+ */
10
+ // 导入 OpenClaw SDK 的核心功能
11
+ import { defineChannelPluginEntry } from "openclaw/plugin-sdk/core";
12
+ // 导入本地模块
13
+ import { lightclawPlugin } from "./src/channel.js"; // 核心插件实现
14
+ import { setLightclawRuntime } from "./src/runtime.js"; // 运行时配置设置函数
15
+ import { registerLightclawTools } from "./src/tools.js"; // 工具注册函数
16
+ // 导出运行时设置函数,供外部使用
17
+ export { setLightclawRuntime } from "./src/runtime.js";
18
+ /**
19
+ * 创建并配置 LightClawBot channel plugin 入口
20
+ *
21
+ * 使用 defineChannelPluginEntry 工厂函数创建插件配置对象,
22
+ * 该函数返回一个类型安全的插件入口配置。
23
+ *
24
+ * @type {ReturnType<typeof defineChannelPluginEntry<ChannelPlugin>>}
25
+ */
26
+ const entry = defineChannelPluginEntry({
27
+ // 插件唯一标识符,用于在系统中识别该插件
7
28
  id: "lightclawbot",
29
+ // 插件显示名称,在UI中展示给用户
8
30
  name: "LightClawBot",
31
+ // 插件功能描述,说明插件的主要用途
9
32
  description: "Channel plugin for LightClawBot",
10
- configSchema: emptyPluginConfigSchema(),
11
- register(api) {
12
- setAssistantRuntime(api.runtime);
13
- api.registerChannel({ plugin: myAssistantPlugin });
14
- // 注册文件存储工具(飞书工厂函数模式:execute 时动态从 api.config 解析 apiKey)
15
- registerUploadTool(api);
16
- // registerDownloadTool(api);
17
- },
18
- };
19
- export default plugin;
20
- export { myAssistantPlugin } from "./src/channel.js";
21
- export { setAssistantRuntime, getAssistantRuntime } from "./src/runtime.js";
22
- export * from "./src/types.js";
23
- export * from "./src/config.js";
24
- export * from "./src/gateway.js";
25
- export * from "./src/dedup.js";
26
- export * from "./src/media.js";
27
- export * from "./src/inbound.js";
28
- export * from "./src/socket/index.js";
29
- export * from "./src/outbound.js";
30
- export * from "./src/history/index.js";
31
- export * from "./src/file-storage.js";
32
- export * from "./src/upload-tool.js";
33
- export * from "./src/download-tool.js";
34
- //# sourceMappingURL=index.js.map
33
+ // 核心插件实现,包含消息处理、事件响应等核心逻辑
34
+ plugin: lightclawPlugin,
35
+ // 运行时设置函数,用于配置插件运行时的环境和参数
36
+ setRuntime: setLightclawRuntime,
37
+ // 完整工具注册函数,用于向系统注册插件提供的所有工具和能力
38
+ registerFull: registerLightclawTools,
39
+ });
40
+ // 导出默认入口配置,供 OpenClaw SDK 加载和使用
41
+ export default entry;
@@ -0,0 +1,32 @@
1
+ /**
2
+ * LightClaw — Setup 入口文件
3
+ *
4
+ * 使用 OpenClaw SDK 提供的 defineSetupPluginEntry 工厂函数导出轻量级的 setup 插件配置。
5
+ *
6
+ * 该入口文件的主要作用是:
7
+ * - 当插件未配置或未启用时,OpenClaw 系统只会加载此轻量级入口
8
+ * - 避免拉起 ws 等运行时重依赖,减少系统启动开销
9
+ * - 提供插件的基本信息和配置能力,但不包含完整的运行时逻辑
10
+ *
11
+ * 这种设计模式有助于:
12
+ * - 降低系统启动时的内存占用
13
+ * - 提高插件加载性能
14
+ * - 支持按需加载插件功能
15
+ */
16
+ // 导入 OpenClaw SDK 的 setup 插件入口定义函数
17
+ import { defineSetupPluginEntry } from "openclaw/plugin-sdk/core";
18
+ // 导入本地的 setup 插件实现
19
+ import { lightclawSetupPlugin } from "./src/channel.setup.js";
20
+ // 导出 setup 插件实现,供外部模块使用或测试
21
+ export { lightclawSetupPlugin } from "./src/channel.setup.js";
22
+ /**
23
+ * 默认导出 setup 插件入口配置
24
+ *
25
+ * 使用 defineSetupPluginEntry 工厂函数创建并配置 setup 插件:
26
+ * - 包装 lightclawSetupPlugin 实例
27
+ * - 提供标准的插件入口接口
28
+ * - 确保插件符合 OpenClaw SDK 的规范要求
29
+ *
30
+ * @returns {ReturnType<typeof defineSetupPluginEntry>} 配置完成的 setup 插件入口
31
+ */
32
+ export default defineSetupPluginEntry(lightclawSetupPlugin);
@@ -1,272 +1,185 @@
1
1
  /**
2
2
  * LightClaw — ChannelPlugin 主定义
3
3
  *
4
- * 这是 OpenClaw 框架的「注册契约」:
5
- * 声明插件 ID、能力、配置管理、出站适配、Gateway 生命周期等。
6
- * 框架通过这个对象了解你的插件能做什么、怎么启动、怎么发消息。
4
+ * 使用 SDK 标准的 createChatChannelPlugin 构建器,
5
+ * 参照官方 Discord/Slack channel 实现。
6
+ *
7
+ * 结构:
8
+ * base: 来自 shared.ts 的 createLightclawPluginBase + 扩展字段
9
+ * security: DM 安全策略
10
+ * outbound: 出站消息适配器
7
11
  */
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
- }
12
+ import { createChatChannelPlugin } from 'openclaw/plugin-sdk/core';
13
+ import { chunkText, defaultAccountId } from './utils/index.js';
14
+ import { CHANNEL_KEY, DEFAULT_ACCOUNT_ID, TEXT_CHUNK_LIMIT } from './config.js';
15
+ import { sendText, sendMedia } from './outbound.js';
16
+ import { startGateway } from './gateway.js';
17
+ import { createLightclawPluginBase } from './shared.js';
18
+ import { lightclawSetupAdapter } from './setup-core.js';
19
+ import { normalizeTarget, looksLikeId } from './messaging.js';
35
20
  // ============================================================
36
- // ChannelPlugin 定义
21
+ // ChannelPlugin 定义(使用 createChatChannelPlugin)
37
22
  // ============================================================
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"],
23
+ export const lightclawPlugin = createChatChannelPlugin({
24
+ base: {
25
+ // ---- 来自 shared.ts 的基础定义 ----
26
+ ...createLightclawPluginBase({
27
+ setup: lightclawSetupAdapter,
75
28
  }),
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,
83
- }),
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
- });
29
+ // ---- 消息目标解析 ----
30
+ messaging: {
31
+ // 对原始目标字符串进行标准化处理,如去除空格、统一格式、转换编码等,返回标准化后的字符串
32
+ normalizeTarget: (target) => {
33
+ return normalizeTarget(target);
34
+ },
35
+ targetResolver: {
36
+ // 判断一个原始字符串是否看起来像一个 ID,用于在解析前快速分流处理逻辑
37
+ looksLikeId: (id, normalized) => {
38
+ return looksLikeId(id, normalized);
39
+ },
40
+ /** 目标格式提示文本,显示在 CLI 帮助信息中 */
41
+ hint: `user:<userId> or channel:<groupId>`,
42
+ },
105
43
  },
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}`;
44
+ // ---- 状态面板 ----
45
+ status: {
46
+ defaultRuntime: {
47
+ accountId: DEFAULT_ACCOUNT_ID,
48
+ running: false,
49
+ connected: false,
50
+ lastConnectedAt: null,
51
+ lastError: null,
52
+ },
53
+ buildChannelSummary: ({ snapshot }) => ({
54
+ configured: snapshot.configured ?? false,
55
+ running: snapshot.running ?? false,
56
+ connected: snapshot.connected ?? false,
57
+ lastConnectedAt: snapshot.lastConnectedAt ?? null,
58
+ lastError: snapshot.lastError ?? null,
59
+ }),
60
+ buildAccountSnapshot: ({ account, runtime, cfg }) => ({
61
+ accountId: account?.accountId ?? defaultAccountId(cfg),
62
+ name: account?.name,
63
+ enabled: account?.enabled ?? false,
64
+ configured: Boolean(account?.apiKey),
65
+ running: runtime?.running ?? false,
66
+ connected: runtime?.connected ?? false,
67
+ lastConnectedAt: runtime?.lastConnectedAt ?? null,
68
+ lastError: runtime?.lastError ?? null,
69
+ }),
129
70
  },
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);
71
+ // ---- Gateway 生命周期(核心!) ----
72
+ gateway: {
73
+ /**
74
+ * 启动账户:建立 WS 长连接到 AI 助手 Server
75
+ * OpenClaw 会在加载配置后为每个 enabled 的账户调用此方法
76
+ */
77
+ startAccount: async (ctx) => {
78
+ const { account, abortSignal, log, cfg } = ctx;
79
+ log?.info(`[${CHANNEL_KEY}:${account.accountId}] Starting gateway...`);
80
+ // 启动并维持一个 Socket.IO Gateway 实例
81
+ await startGateway({
82
+ account,
83
+ abortSignal,
84
+ cfg,
85
+ log,
86
+ /** WS 连接就绪回调 */
87
+ onReady: () => {
88
+ log?.info(`[${CHANNEL_KEY}:${account.accountId}] Gateway ready: WS connected`);
89
+ const now = Date.now();
90
+ ctx.setStatus({
91
+ ...ctx.getStatus(),
92
+ running: true,
93
+ connected: true,
94
+ lastConnectedAt: now,
95
+ // 连接建立时即设置 lastEventAt,作为 health-monitor stale-socket 检测的初始基准
96
+ lastEventAt: now,
97
+ });
98
+ },
99
+ /** WS 连接断开回调 */
100
+ onDisconnect: () => {
101
+ log?.info(`[${CHANNEL_KEY}:${account.accountId}] Gateway ready: WS disconnect`);
102
+ ctx.setStatus({
103
+ ...ctx.getStatus(),
104
+ connected: false,
105
+ });
106
+ },
107
+ /** 错误回调:记录错误信息,不中断重连逻辑(由 gateway 内部处理) */
108
+ onError: (error) => {
109
+ log?.error(`[${CHANNEL_KEY}:${account.accountId}] Gateway error: ${error.message}`);
110
+ ctx.setStatus({
111
+ ...ctx.getStatus(),
112
+ lastError: error.message,
113
+ });
114
+ },
115
+ /**
116
+ * 入站事件回调:每次收到消息时调用。
117
+ * 刷新 lastEventAt 和 lastInboundAt,
118
+ * 通知框架 health-monitor 该连接仍处于活跃状态。
119
+ */
120
+ onEvent: () => {
121
+ log?.info(`[${CHANNEL_KEY}:${account.accountId}] Gateway Ready: WS message enter`);
122
+ ctx.setStatus({
123
+ ...ctx.getStatus(),
124
+ lastEventAt: Date.now(),
125
+ lastInboundAt: Date.now(),
126
+ });
127
+ },
128
+ });
129
+ },
130
+ /** 登出账户:清除凭证 */
131
+ logoutAccount: async ({ accountId, cfg }) => {
132
+ const nextCfg = { ...cfg };
133
+ const section = nextCfg.channels?.[CHANNEL_KEY];
134
+ let cleared = false;
135
+ if (section) {
136
+ if (accountId === DEFAULT_ACCOUNT_ID && section.apiKeys) {
137
+ delete section.apiKeys;
138
+ cleared = true;
139
+ }
140
+ const accounts = section.accounts;
141
+ if (accounts?.[accountId]?.apiKeys) {
142
+ delete accounts[accountId].apiKeys;
143
+ cleared = true;
144
+ }
145
+ }
146
+ return { ok: true, cleared };
141
147
  },
142
- hint: `user:<userId> or channel:<groupId>`,
143
148
  },
144
149
  },
145
150
  // ---- 出站消息适配器 ----
146
151
  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 };
152
+ base: {
153
+ deliveryMode: 'direct',
154
+ chunker: chunkText,
155
+ chunkerMode: 'markdown',
156
+ textChunkLimit: TEXT_CHUNK_LIMIT,
157
+ resolveTarget: ({ to, allowFrom, mode }) => {
158
+ // 优先使用显式 to;implicit 模式下回退到 allowFrom 第一个非通配符条目
159
+ const effectiveTo = to?.trim();
160
+ if (effectiveTo) {
161
+ return { ok: true, to: effectiveTo };
161
162
  }
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 });
173
- },
174
- },
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;
163
+ if (mode === 'implicit' && allowFrom && allowFrom.length > 0) {
164
+ const candidate = allowFrom.find((entry) => entry && entry !== '*');
165
+ if (candidate) {
166
+ return { ok: true, to: candidate };
167
+ }
233
168
  }
234
- const accounts = section.accounts;
235
- if (accounts?.[accountId]?.apiKeys) {
236
- delete accounts[accountId].apiKeys;
237
- cleared = true;
238
- }
239
- }
240
- return { ok: true, cleared };
169
+ return {
170
+ ok: false,
171
+ error: new Error(`No delivery target for ${CHANNEL_KEY}. Specify a target with --to or configure allowFrom.`),
172
+ };
173
+ },
241
174
  },
242
- },
243
- // ---- 状态面板 ----
244
- status: {
245
- defaultRuntime: {
246
- accountId: DEFAULT_ACCOUNT_ID,
247
- running: false,
248
- connected: false,
249
- lastConnectedAt: null,
250
- lastError: null,
175
+ attachedResults: {
176
+ channel: CHANNEL_KEY,
177
+ sendText: async ({ to, text, accountId, replyToId, cfg }) => {
178
+ return sendText({ to, text, accountId, replyToId, cfg });
179
+ },
180
+ sendMedia: async ({ to, text, mediaUrl, accountId, replyToId, cfg }) => {
181
+ return sendMedia({ to, text, mediaUrl, accountId, replyToId, cfg });
182
+ },
251
183
  },
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
184
  },
271
- };
272
- //# sourceMappingURL=channel.js.map
185
+ });
@@ -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
+ };