lightclawbot 1.0.0 → 1.0.2

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 (371) hide show
  1. package/README.md +1 -0
  2. package/dist/index.d.ts +24 -0
  3. package/dist/index.d.ts.map +1 -0
  4. package/dist/index.js +34 -0
  5. package/dist/index.js.map +1 -0
  6. package/dist/src/channel.d.ts +11 -0
  7. package/dist/src/channel.d.ts.map +1 -0
  8. package/dist/src/channel.js +255 -0
  9. package/dist/src/channel.js.map +1 -0
  10. package/dist/src/config.d.ts +86 -0
  11. package/dist/src/config.d.ts.map +1 -0
  12. package/dist/src/config.js +188 -0
  13. package/dist/src/config.js.map +1 -0
  14. package/dist/src/dedup.d.ts +7 -0
  15. package/dist/src/dedup.d.ts.map +1 -0
  16. package/dist/src/dedup.js +51 -0
  17. package/dist/src/dedup.js.map +1 -0
  18. package/dist/src/download-tool.d.ts +32 -0
  19. package/dist/src/download-tool.d.ts.map +1 -0
  20. package/dist/src/download-tool.js +147 -0
  21. package/dist/src/download-tool.js.map +1 -0
  22. package/dist/src/file-storage.d.ts +74 -0
  23. package/dist/src/file-storage.d.ts.map +1 -0
  24. package/dist/src/file-storage.js +161 -0
  25. package/dist/src/file-storage.js.map +1 -0
  26. package/dist/src/gateway.d.ts +16 -0
  27. package/dist/src/gateway.d.ts.map +1 -0
  28. package/dist/src/gateway.js +252 -0
  29. package/dist/src/gateway.js.map +1 -0
  30. package/dist/src/history/cron-utils.d.ts +76 -0
  31. package/dist/src/history/cron-utils.d.ts.map +1 -0
  32. package/dist/src/history/cron-utils.js +291 -0
  33. package/dist/src/history/cron-utils.js.map +1 -0
  34. package/dist/src/history/index.d.ts +20 -0
  35. package/dist/src/history/index.d.ts.map +1 -0
  36. package/dist/src/history/index.js +24 -0
  37. package/dist/src/history/index.js.map +1 -0
  38. package/dist/src/history/message-parser.d.ts +52 -0
  39. package/dist/src/history/message-parser.d.ts.map +1 -0
  40. package/dist/src/history/message-parser.js +243 -0
  41. package/dist/src/history/message-parser.js.map +1 -0
  42. package/dist/src/history/session-reader.d.ts +58 -0
  43. package/dist/src/history/session-reader.d.ts.map +1 -0
  44. package/dist/src/history/session-reader.js +287 -0
  45. package/dist/src/history/session-reader.js.map +1 -0
  46. package/dist/src/history/session-store.d.ts +38 -0
  47. package/dist/src/history/session-store.d.ts.map +1 -0
  48. package/dist/src/history/session-store.js +131 -0
  49. package/dist/src/history/session-store.js.map +1 -0
  50. package/dist/src/history/text-processing.d.ts +41 -0
  51. package/dist/src/history/text-processing.d.ts.map +1 -0
  52. package/dist/src/history/text-processing.js +130 -0
  53. package/dist/src/history/text-processing.js.map +1 -0
  54. package/dist/src/history/types.d.ts +134 -0
  55. package/dist/src/history/types.d.ts.map +1 -0
  56. package/dist/src/history/types.js +7 -0
  57. package/dist/src/history/types.js.map +1 -0
  58. package/dist/src/inbound.d.ts +18 -0
  59. package/dist/src/inbound.d.ts.map +1 -0
  60. package/dist/src/inbound.js +332 -0
  61. package/dist/src/inbound.js.map +1 -0
  62. package/dist/src/media.d.ts +12 -0
  63. package/dist/src/media.d.ts.map +1 -0
  64. package/dist/src/media.js +87 -0
  65. package/dist/src/media.js.map +1 -0
  66. package/dist/src/outbound.d.ts +28 -0
  67. package/dist/src/outbound.d.ts.map +1 -0
  68. package/dist/src/outbound.js +172 -0
  69. package/dist/src/outbound.js.map +1 -0
  70. package/dist/src/runtime.d.ts +4 -0
  71. package/dist/src/runtime.d.ts.map +1 -0
  72. package/dist/src/runtime.js +11 -0
  73. package/dist/src/runtime.js.map +1 -0
  74. package/dist/src/session-history.d.ts +88 -0
  75. package/dist/src/session-history.d.ts.map +1 -0
  76. package/dist/src/session-history.js +598 -0
  77. package/dist/src/session-history.js.map +1 -0
  78. package/dist/src/socket-handlers.d.ts +21 -0
  79. package/dist/src/socket-handlers.d.ts.map +1 -0
  80. package/dist/src/socket-handlers.js +121 -0
  81. package/dist/src/socket-handlers.js.map +1 -0
  82. package/dist/src/socket-registry.d.ts +53 -0
  83. package/dist/src/socket-registry.d.ts.map +1 -0
  84. package/dist/src/socket-registry.js +111 -0
  85. package/dist/src/socket-registry.js.map +1 -0
  86. package/dist/src/types.d.ts +102 -0
  87. package/dist/src/types.d.ts.map +1 -0
  88. package/dist/src/types.js +10 -0
  89. package/dist/src/types.js.map +1 -0
  90. package/dist/src/upload-tool.d.ts +27 -0
  91. package/dist/src/upload-tool.d.ts.map +1 -0
  92. package/dist/src/upload-tool.js +148 -0
  93. package/dist/src/upload-tool.js.map +1 -0
  94. package/node_modules/@socket.io/component-emitter/LICENSE +24 -0
  95. package/node_modules/@socket.io/component-emitter/Readme.md +79 -0
  96. package/node_modules/@socket.io/component-emitter/lib/cjs/index.d.ts +179 -0
  97. package/node_modules/@socket.io/component-emitter/lib/cjs/index.js +176 -0
  98. package/node_modules/@socket.io/component-emitter/lib/cjs/package.json +4 -0
  99. package/node_modules/@socket.io/component-emitter/lib/esm/index.d.ts +179 -0
  100. package/node_modules/@socket.io/component-emitter/lib/esm/index.js +169 -0
  101. package/node_modules/@socket.io/component-emitter/lib/esm/package.json +4 -0
  102. package/node_modules/@socket.io/component-emitter/package.json +28 -0
  103. package/node_modules/debug/LICENSE +20 -0
  104. package/node_modules/debug/README.md +481 -0
  105. package/node_modules/debug/package.json +64 -0
  106. package/node_modules/debug/src/browser.js +272 -0
  107. package/node_modules/debug/src/common.js +292 -0
  108. package/node_modules/debug/src/index.js +10 -0
  109. package/node_modules/debug/src/node.js +263 -0
  110. package/node_modules/engine.io-client/LICENSE +22 -0
  111. package/node_modules/engine.io-client/README.md +331 -0
  112. package/node_modules/engine.io-client/build/cjs/browser-entrypoint.d.ts +3 -0
  113. package/node_modules/engine.io-client/build/cjs/browser-entrypoint.js +4 -0
  114. package/node_modules/engine.io-client/build/cjs/contrib/has-cors.d.ts +1 -0
  115. package/node_modules/engine.io-client/build/cjs/contrib/has-cors.js +14 -0
  116. package/node_modules/engine.io-client/build/cjs/contrib/parseqs.d.ts +15 -0
  117. package/node_modules/engine.io-client/build/cjs/contrib/parseqs.js +38 -0
  118. package/node_modules/engine.io-client/build/cjs/contrib/parseuri.d.ts +1 -0
  119. package/node_modules/engine.io-client/build/cjs/contrib/parseuri.js +67 -0
  120. package/node_modules/engine.io-client/build/cjs/globals.d.ts +4 -0
  121. package/node_modules/engine.io-client/build/cjs/globals.js +26 -0
  122. package/node_modules/engine.io-client/build/cjs/globals.node.d.ts +21 -0
  123. package/node_modules/engine.io-client/build/cjs/globals.node.js +97 -0
  124. package/node_modules/engine.io-client/build/cjs/index.d.ts +15 -0
  125. package/node_modules/engine.io-client/build/cjs/index.js +32 -0
  126. package/node_modules/engine.io-client/build/cjs/package.json +10 -0
  127. package/node_modules/engine.io-client/build/cjs/socket.d.ts +482 -0
  128. package/node_modules/engine.io-client/build/cjs/socket.js +765 -0
  129. package/node_modules/engine.io-client/build/cjs/transport.d.ts +106 -0
  130. package/node_modules/engine.io-client/build/cjs/transport.js +153 -0
  131. package/node_modules/engine.io-client/build/cjs/transports/index.d.ts +8 -0
  132. package/node_modules/engine.io-client/build/cjs/transports/index.js +11 -0
  133. package/node_modules/engine.io-client/build/cjs/transports/polling-fetch.d.ts +15 -0
  134. package/node_modules/engine.io-client/build/cjs/transports/polling-fetch.js +60 -0
  135. package/node_modules/engine.io-client/build/cjs/transports/polling-xhr.d.ts +108 -0
  136. package/node_modules/engine.io-client/build/cjs/transports/polling-xhr.js +285 -0
  137. package/node_modules/engine.io-client/build/cjs/transports/polling-xhr.node.d.ts +11 -0
  138. package/node_modules/engine.io-client/build/cjs/transports/polling-xhr.node.js +44 -0
  139. package/node_modules/engine.io-client/build/cjs/transports/polling.d.ts +52 -0
  140. package/node_modules/engine.io-client/build/cjs/transports/polling.js +165 -0
  141. package/node_modules/engine.io-client/build/cjs/transports/websocket.d.ts +36 -0
  142. package/node_modules/engine.io-client/build/cjs/transports/websocket.js +136 -0
  143. package/node_modules/engine.io-client/build/cjs/transports/websocket.node.d.ts +14 -0
  144. package/node_modules/engine.io-client/build/cjs/transports/websocket.node.js +68 -0
  145. package/node_modules/engine.io-client/build/cjs/transports/webtransport.d.ts +18 -0
  146. package/node_modules/engine.io-client/build/cjs/transports/webtransport.js +94 -0
  147. package/node_modules/engine.io-client/build/cjs/util.d.ts +7 -0
  148. package/node_modules/engine.io-client/build/cjs/util.js +65 -0
  149. package/node_modules/engine.io-client/build/esm/browser-entrypoint.d.ts +3 -0
  150. package/node_modules/engine.io-client/build/esm/browser-entrypoint.js +2 -0
  151. package/node_modules/engine.io-client/build/esm/contrib/has-cors.d.ts +1 -0
  152. package/node_modules/engine.io-client/build/esm/contrib/has-cors.js +11 -0
  153. package/node_modules/engine.io-client/build/esm/contrib/parseqs.d.ts +15 -0
  154. package/node_modules/engine.io-client/build/esm/contrib/parseqs.js +34 -0
  155. package/node_modules/engine.io-client/build/esm/contrib/parseuri.d.ts +1 -0
  156. package/node_modules/engine.io-client/build/esm/contrib/parseuri.js +64 -0
  157. package/node_modules/engine.io-client/build/esm/globals.d.ts +4 -0
  158. package/node_modules/engine.io-client/build/esm/globals.js +22 -0
  159. package/node_modules/engine.io-client/build/esm/globals.node.d.ts +21 -0
  160. package/node_modules/engine.io-client/build/esm/globals.node.js +91 -0
  161. package/node_modules/engine.io-client/build/esm/index.d.ts +15 -0
  162. package/node_modules/engine.io-client/build/esm/index.js +15 -0
  163. package/node_modules/engine.io-client/build/esm/package.json +10 -0
  164. package/node_modules/engine.io-client/build/esm/socket.d.ts +482 -0
  165. package/node_modules/engine.io-client/build/esm/socket.js +727 -0
  166. package/node_modules/engine.io-client/build/esm/transport.d.ts +106 -0
  167. package/node_modules/engine.io-client/build/esm/transport.js +142 -0
  168. package/node_modules/engine.io-client/build/esm/transports/index.d.ts +8 -0
  169. package/node_modules/engine.io-client/build/esm/transports/index.js +8 -0
  170. package/node_modules/engine.io-client/build/esm/transports/polling-fetch.d.ts +15 -0
  171. package/node_modules/engine.io-client/build/esm/transports/polling-fetch.js +56 -0
  172. package/node_modules/engine.io-client/build/esm/transports/polling-xhr.d.ts +108 -0
  173. package/node_modules/engine.io-client/build/esm/transports/polling-xhr.js +271 -0
  174. package/node_modules/engine.io-client/build/esm/transports/polling-xhr.node.d.ts +11 -0
  175. package/node_modules/engine.io-client/build/esm/transports/polling-xhr.node.js +17 -0
  176. package/node_modules/engine.io-client/build/esm/transports/polling.d.ts +52 -0
  177. package/node_modules/engine.io-client/build/esm/transports/polling.js +145 -0
  178. package/node_modules/engine.io-client/build/esm/transports/websocket.d.ts +36 -0
  179. package/node_modules/engine.io-client/build/esm/transports/websocket.js +125 -0
  180. package/node_modules/engine.io-client/build/esm/transports/websocket.node.d.ts +14 -0
  181. package/node_modules/engine.io-client/build/esm/transports/websocket.node.js +41 -0
  182. package/node_modules/engine.io-client/build/esm/transports/webtransport.d.ts +18 -0
  183. package/node_modules/engine.io-client/build/esm/transports/webtransport.js +80 -0
  184. package/node_modules/engine.io-client/build/esm/util.d.ts +7 -0
  185. package/node_modules/engine.io-client/build/esm/util.js +59 -0
  186. package/node_modules/engine.io-client/build/esm-debug/browser-entrypoint.d.ts +3 -0
  187. package/node_modules/engine.io-client/build/esm-debug/browser-entrypoint.js +2 -0
  188. package/node_modules/engine.io-client/build/esm-debug/contrib/has-cors.d.ts +1 -0
  189. package/node_modules/engine.io-client/build/esm-debug/contrib/has-cors.js +11 -0
  190. package/node_modules/engine.io-client/build/esm-debug/contrib/parseqs.d.ts +15 -0
  191. package/node_modules/engine.io-client/build/esm-debug/contrib/parseqs.js +34 -0
  192. package/node_modules/engine.io-client/build/esm-debug/contrib/parseuri.d.ts +1 -0
  193. package/node_modules/engine.io-client/build/esm-debug/contrib/parseuri.js +64 -0
  194. package/node_modules/engine.io-client/build/esm-debug/globals.d.ts +4 -0
  195. package/node_modules/engine.io-client/build/esm-debug/globals.js +22 -0
  196. package/node_modules/engine.io-client/build/esm-debug/globals.node.d.ts +21 -0
  197. package/node_modules/engine.io-client/build/esm-debug/globals.node.js +91 -0
  198. package/node_modules/engine.io-client/build/esm-debug/index.d.ts +15 -0
  199. package/node_modules/engine.io-client/build/esm-debug/index.js +15 -0
  200. package/node_modules/engine.io-client/build/esm-debug/package.json +10 -0
  201. package/node_modules/engine.io-client/build/esm-debug/socket.d.ts +482 -0
  202. package/node_modules/engine.io-client/build/esm-debug/socket.js +756 -0
  203. package/node_modules/engine.io-client/build/esm-debug/transport.d.ts +106 -0
  204. package/node_modules/engine.io-client/build/esm-debug/transport.js +145 -0
  205. package/node_modules/engine.io-client/build/esm-debug/transports/index.d.ts +8 -0
  206. package/node_modules/engine.io-client/build/esm-debug/transports/index.js +8 -0
  207. package/node_modules/engine.io-client/build/esm-debug/transports/polling-fetch.d.ts +15 -0
  208. package/node_modules/engine.io-client/build/esm-debug/transports/polling-fetch.js +56 -0
  209. package/node_modules/engine.io-client/build/esm-debug/transports/polling-xhr.d.ts +108 -0
  210. package/node_modules/engine.io-client/build/esm-debug/transports/polling-xhr.js +276 -0
  211. package/node_modules/engine.io-client/build/esm-debug/transports/polling-xhr.node.d.ts +11 -0
  212. package/node_modules/engine.io-client/build/esm-debug/transports/polling-xhr.node.js +17 -0
  213. package/node_modules/engine.io-client/build/esm-debug/transports/polling.d.ts +52 -0
  214. package/node_modules/engine.io-client/build/esm-debug/transports/polling.js +158 -0
  215. package/node_modules/engine.io-client/build/esm-debug/transports/websocket.d.ts +36 -0
  216. package/node_modules/engine.io-client/build/esm-debug/transports/websocket.js +128 -0
  217. package/node_modules/engine.io-client/build/esm-debug/transports/websocket.node.d.ts +14 -0
  218. package/node_modules/engine.io-client/build/esm-debug/transports/websocket.node.js +41 -0
  219. package/node_modules/engine.io-client/build/esm-debug/transports/webtransport.d.ts +18 -0
  220. package/node_modules/engine.io-client/build/esm-debug/transports/webtransport.js +87 -0
  221. package/node_modules/engine.io-client/build/esm-debug/util.d.ts +7 -0
  222. package/node_modules/engine.io-client/build/esm-debug/util.js +59 -0
  223. package/node_modules/engine.io-client/dist/engine.io.esm.min.js +7 -0
  224. package/node_modules/engine.io-client/dist/engine.io.esm.min.js.map +1 -0
  225. package/node_modules/engine.io-client/dist/engine.io.js +3064 -0
  226. package/node_modules/engine.io-client/dist/engine.io.js.map +1 -0
  227. package/node_modules/engine.io-client/dist/engine.io.min.js +7 -0
  228. package/node_modules/engine.io-client/dist/engine.io.min.js.map +1 -0
  229. package/node_modules/engine.io-client/node_modules/ws/LICENSE +20 -0
  230. package/node_modules/engine.io-client/node_modules/ws/README.md +548 -0
  231. package/node_modules/engine.io-client/node_modules/ws/browser.js +8 -0
  232. package/node_modules/engine.io-client/node_modules/ws/index.js +13 -0
  233. package/node_modules/engine.io-client/node_modules/ws/lib/buffer-util.js +131 -0
  234. package/node_modules/engine.io-client/node_modules/ws/lib/constants.js +18 -0
  235. package/node_modules/engine.io-client/node_modules/ws/lib/event-target.js +292 -0
  236. package/node_modules/engine.io-client/node_modules/ws/lib/extension.js +203 -0
  237. package/node_modules/engine.io-client/node_modules/ws/lib/limiter.js +55 -0
  238. package/node_modules/engine.io-client/node_modules/ws/lib/permessage-deflate.js +528 -0
  239. package/node_modules/engine.io-client/node_modules/ws/lib/receiver.js +706 -0
  240. package/node_modules/engine.io-client/node_modules/ws/lib/sender.js +602 -0
  241. package/node_modules/engine.io-client/node_modules/ws/lib/stream.js +161 -0
  242. package/node_modules/engine.io-client/node_modules/ws/lib/subprotocol.js +62 -0
  243. package/node_modules/engine.io-client/node_modules/ws/lib/validation.js +152 -0
  244. package/node_modules/engine.io-client/node_modules/ws/lib/websocket-server.js +550 -0
  245. package/node_modules/engine.io-client/node_modules/ws/lib/websocket.js +1388 -0
  246. package/node_modules/engine.io-client/node_modules/ws/package.json +69 -0
  247. package/node_modules/engine.io-client/node_modules/ws/wrapper.mjs +8 -0
  248. package/node_modules/engine.io-client/package.json +95 -0
  249. package/node_modules/engine.io-parser/LICENSE +22 -0
  250. package/node_modules/engine.io-parser/Readme.md +158 -0
  251. package/node_modules/engine.io-parser/build/cjs/commons.d.ts +14 -0
  252. package/node_modules/engine.io-parser/build/cjs/commons.js +19 -0
  253. package/node_modules/engine.io-parser/build/cjs/contrib/base64-arraybuffer.d.ts +2 -0
  254. package/node_modules/engine.io-parser/build/cjs/contrib/base64-arraybuffer.js +48 -0
  255. package/node_modules/engine.io-parser/build/cjs/decodePacket.browser.d.ts +2 -0
  256. package/node_modules/engine.io-parser/build/cjs/decodePacket.browser.js +66 -0
  257. package/node_modules/engine.io-parser/build/cjs/decodePacket.d.ts +2 -0
  258. package/node_modules/engine.io-parser/build/cjs/decodePacket.js +59 -0
  259. package/node_modules/engine.io-parser/build/cjs/encodePacket.browser.d.ts +4 -0
  260. package/node_modules/engine.io-parser/build/cjs/encodePacket.browser.js +72 -0
  261. package/node_modules/engine.io-parser/build/cjs/encodePacket.d.ts +3 -0
  262. package/node_modules/engine.io-parser/build/cjs/encodePacket.js +38 -0
  263. package/node_modules/engine.io-parser/build/cjs/index.d.ts +9 -0
  264. package/node_modules/engine.io-parser/build/cjs/index.js +164 -0
  265. package/node_modules/engine.io-parser/build/cjs/package.json +8 -0
  266. package/node_modules/engine.io-parser/build/esm/commons.d.ts +14 -0
  267. package/node_modules/engine.io-parser/build/esm/commons.js +14 -0
  268. package/node_modules/engine.io-parser/build/esm/contrib/base64-arraybuffer.d.ts +2 -0
  269. package/node_modules/engine.io-parser/build/esm/contrib/base64-arraybuffer.js +43 -0
  270. package/node_modules/engine.io-parser/build/esm/decodePacket.browser.d.ts +2 -0
  271. package/node_modules/engine.io-parser/build/esm/decodePacket.browser.js +62 -0
  272. package/node_modules/engine.io-parser/build/esm/decodePacket.d.ts +2 -0
  273. package/node_modules/engine.io-parser/build/esm/decodePacket.js +55 -0
  274. package/node_modules/engine.io-parser/build/esm/encodePacket.browser.d.ts +4 -0
  275. package/node_modules/engine.io-parser/build/esm/encodePacket.browser.js +68 -0
  276. package/node_modules/engine.io-parser/build/esm/encodePacket.d.ts +3 -0
  277. package/node_modules/engine.io-parser/build/esm/encodePacket.js +33 -0
  278. package/node_modules/engine.io-parser/build/esm/index.d.ts +9 -0
  279. package/node_modules/engine.io-parser/build/esm/index.js +156 -0
  280. package/node_modules/engine.io-parser/build/esm/package.json +8 -0
  281. package/node_modules/engine.io-parser/package.json +46 -0
  282. package/node_modules/ms/index.js +162 -0
  283. package/node_modules/ms/license.md +21 -0
  284. package/node_modules/ms/package.json +38 -0
  285. package/node_modules/ms/readme.md +59 -0
  286. package/node_modules/socket.io-client/LICENSE +21 -0
  287. package/node_modules/socket.io-client/README.md +29 -0
  288. package/node_modules/socket.io-client/build/cjs/browser-entrypoint.d.ts +2 -0
  289. package/node_modules/socket.io-client/build/cjs/browser-entrypoint.js +4 -0
  290. package/node_modules/socket.io-client/build/cjs/contrib/backo2.d.ts +12 -0
  291. package/node_modules/socket.io-client/build/cjs/contrib/backo2.js +69 -0
  292. package/node_modules/socket.io-client/build/cjs/index.d.ts +29 -0
  293. package/node_modules/socket.io-client/build/cjs/index.js +76 -0
  294. package/node_modules/socket.io-client/build/cjs/manager.d.ts +295 -0
  295. package/node_modules/socket.io-client/build/cjs/manager.js +416 -0
  296. package/node_modules/socket.io-client/build/cjs/on.d.ts +2 -0
  297. package/node_modules/socket.io-client/build/cjs/on.js +9 -0
  298. package/node_modules/socket.io-client/build/cjs/socket.d.ts +593 -0
  299. package/node_modules/socket.io-client/build/cjs/socket.js +909 -0
  300. package/node_modules/socket.io-client/build/cjs/url.d.ts +33 -0
  301. package/node_modules/socket.io-client/build/cjs/url.js +69 -0
  302. package/node_modules/socket.io-client/build/esm/browser-entrypoint.d.ts +2 -0
  303. package/node_modules/socket.io-client/build/esm/browser-entrypoint.js +2 -0
  304. package/node_modules/socket.io-client/build/esm/contrib/backo2.d.ts +12 -0
  305. package/node_modules/socket.io-client/build/esm/contrib/backo2.js +66 -0
  306. package/node_modules/socket.io-client/build/esm/index.d.ts +29 -0
  307. package/node_modules/socket.io-client/build/esm/index.js +58 -0
  308. package/node_modules/socket.io-client/build/esm/manager.d.ts +295 -0
  309. package/node_modules/socket.io-client/build/esm/manager.js +367 -0
  310. package/node_modules/socket.io-client/build/esm/on.d.ts +2 -0
  311. package/node_modules/socket.io-client/build/esm/on.js +6 -0
  312. package/node_modules/socket.io-client/build/esm/package.json +5 -0
  313. package/node_modules/socket.io-client/build/esm/socket.d.ts +593 -0
  314. package/node_modules/socket.io-client/build/esm/socket.js +880 -0
  315. package/node_modules/socket.io-client/build/esm/url.d.ts +33 -0
  316. package/node_modules/socket.io-client/build/esm/url.js +59 -0
  317. package/node_modules/socket.io-client/build/esm-debug/browser-entrypoint.d.ts +2 -0
  318. package/node_modules/socket.io-client/build/esm-debug/browser-entrypoint.js +2 -0
  319. package/node_modules/socket.io-client/build/esm-debug/contrib/backo2.d.ts +12 -0
  320. package/node_modules/socket.io-client/build/esm-debug/contrib/backo2.js +66 -0
  321. package/node_modules/socket.io-client/build/esm-debug/index.d.ts +29 -0
  322. package/node_modules/socket.io-client/build/esm-debug/index.js +62 -0
  323. package/node_modules/socket.io-client/build/esm-debug/manager.d.ts +295 -0
  324. package/node_modules/socket.io-client/build/esm-debug/manager.js +386 -0
  325. package/node_modules/socket.io-client/build/esm-debug/on.d.ts +2 -0
  326. package/node_modules/socket.io-client/build/esm-debug/on.js +6 -0
  327. package/node_modules/socket.io-client/build/esm-debug/package.json +5 -0
  328. package/node_modules/socket.io-client/build/esm-debug/socket.d.ts +593 -0
  329. package/node_modules/socket.io-client/build/esm-debug/socket.js +902 -0
  330. package/node_modules/socket.io-client/build/esm-debug/url.d.ts +33 -0
  331. package/node_modules/socket.io-client/build/esm-debug/url.js +63 -0
  332. package/node_modules/socket.io-client/dist/socket.io.esm.min.js +7 -0
  333. package/node_modules/socket.io-client/dist/socket.io.esm.min.js.map +1 -0
  334. package/node_modules/socket.io-client/dist/socket.io.js +4955 -0
  335. package/node_modules/socket.io-client/dist/socket.io.js.map +1 -0
  336. package/node_modules/socket.io-client/dist/socket.io.min.js +7 -0
  337. package/node_modules/socket.io-client/dist/socket.io.min.js.map +1 -0
  338. package/node_modules/socket.io-client/dist/socket.io.msgpack.min.js +7 -0
  339. package/node_modules/socket.io-client/dist/socket.io.msgpack.min.js.map +1 -0
  340. package/node_modules/socket.io-client/package.json +101 -0
  341. package/node_modules/socket.io-parser/LICENSE +20 -0
  342. package/node_modules/socket.io-parser/Readme.md +81 -0
  343. package/node_modules/socket.io-parser/build/cjs/binary.d.ts +20 -0
  344. package/node_modules/socket.io-parser/build/cjs/binary.js +87 -0
  345. package/node_modules/socket.io-parser/build/cjs/index.d.ts +91 -0
  346. package/node_modules/socket.io-parser/build/cjs/index.js +359 -0
  347. package/node_modules/socket.io-parser/build/cjs/is-binary.d.ts +7 -0
  348. package/node_modules/socket.io-parser/build/cjs/is-binary.js +54 -0
  349. package/node_modules/socket.io-parser/build/cjs/package.json +3 -0
  350. package/node_modules/socket.io-parser/build/esm/binary.d.ts +20 -0
  351. package/node_modules/socket.io-parser/build/esm/binary.js +83 -0
  352. package/node_modules/socket.io-parser/build/esm/index.d.ts +91 -0
  353. package/node_modules/socket.io-parser/build/esm/index.js +348 -0
  354. package/node_modules/socket.io-parser/build/esm/is-binary.d.ts +7 -0
  355. package/node_modules/socket.io-parser/build/esm/is-binary.js +50 -0
  356. package/node_modules/socket.io-parser/build/esm/package.json +3 -0
  357. package/node_modules/socket.io-parser/build/esm-debug/binary.d.ts +20 -0
  358. package/node_modules/socket.io-parser/build/esm-debug/binary.js +83 -0
  359. package/node_modules/socket.io-parser/build/esm-debug/index.d.ts +91 -0
  360. package/node_modules/socket.io-parser/build/esm-debug/index.js +353 -0
  361. package/node_modules/socket.io-parser/build/esm-debug/is-binary.d.ts +7 -0
  362. package/node_modules/socket.io-parser/build/esm-debug/is-binary.js +50 -0
  363. package/node_modules/socket.io-parser/build/esm-debug/package.json +3 -0
  364. package/node_modules/socket.io-parser/package.json +44 -0
  365. package/node_modules/xmlhttprequest-ssl/LICENSE +22 -0
  366. package/node_modules/xmlhttprequest-ssl/README.md +67 -0
  367. package/node_modules/xmlhttprequest-ssl/lib/XMLHttpRequest.js +689 -0
  368. package/node_modules/xmlhttprequest-ssl/package.json +40 -0
  369. package/openclaw.plugin.json +17 -0
  370. package/package.json +43 -23
  371. package/skills/lightclaw-cron/SKILL.md +381 -0
@@ -0,0 +1,134 @@
1
+ /**
2
+ * LightClaw — History Module Types
3
+ *
4
+ * 集中定义历史消息相关的类型,供 history/ 模块内部和外部统一使用。
5
+ */
6
+ /** 文件附件信息(从消息文本中提取) */
7
+ export interface FileAttachmentInfo {
8
+ /** 原始文件名 */
9
+ name: string;
10
+ /** MIME 类型 */
11
+ mimeType?: string;
12
+ /** 文件大小描述(如 "3.0KB") */
13
+ size?: string;
14
+ /** 文件路径或 URI */
15
+ uri?: string;
16
+ }
17
+ /** Cron 来源信息(标记消息来自哪个 cron 任务) */
18
+ export interface CronInfo {
19
+ /** cron job ID */
20
+ jobId: string;
21
+ /** 任务名称(如 "每2分钟喝水提醒") */
22
+ name?: string;
23
+ /** 本次运行的 session ID */
24
+ runSessionId?: string;
25
+ }
26
+ /** 标准化后返回给前端的历史消息 */
27
+ export interface HistoryMessage {
28
+ role: "user" | "assistant" | "system" | "tool";
29
+ content: string;
30
+ timestamp?: number;
31
+ /** 消息中包含的工具调用(可选) */
32
+ toolCalls?: Array<{
33
+ name: string;
34
+ args?: string;
35
+ }>;
36
+ /** 消息中包含的工具结果(可选) */
37
+ toolResult?: {
38
+ toolCallId?: string;
39
+ name?: string;
40
+ output?: string;
41
+ };
42
+ /** AI 的思考过程(可选) */
43
+ thinking?: string;
44
+ /** 消息中包含的文件附件(可选) */
45
+ files?: FileAttachmentInfo[];
46
+ /** 压缩标记 */
47
+ isCompaction?: boolean;
48
+ /** 如果是 cron 消息,标识来源信息 */
49
+ cronInfo?: CronInfo;
50
+ }
51
+ /** sessions.json 中每个条目的结构 */
52
+ export interface SessionStoreEntry {
53
+ sessionId: string;
54
+ sessionFile?: string;
55
+ updatedAt?: number;
56
+ label?: string;
57
+ displayName?: string;
58
+ channel?: string;
59
+ chatType?: string;
60
+ }
61
+ /** 会话类型 */
62
+ export type SessionType = "direct" | "cron-base" | "cron-run";
63
+ /** Cron 会话信息 */
64
+ export interface CronSessionInfo {
65
+ /** session key (e.g. "agent:main:cron:xxx:run:yyy") */
66
+ sessionKey: string;
67
+ /** session ID (即 JSONL 文件名前缀) */
68
+ sessionId: string;
69
+ /** cron job ID */
70
+ cronJobId: string;
71
+ /** 任务名称 (从 label 提取,如 "每2分钟喝水提醒") */
72
+ cronName?: string;
73
+ /** 最后更新时间 */
74
+ updatedAt?: number;
75
+ }
76
+ /** 列出 session 时的条目类型(含 cron 类型标识) */
77
+ export interface SessionListEntry {
78
+ sessionKey: string;
79
+ sessionId: string;
80
+ updatedAt?: number;
81
+ label?: string;
82
+ displayName?: string;
83
+ channel?: string;
84
+ /** 会话类型 */
85
+ sessionType: SessionType;
86
+ /** cron job ID (仅 cron 类型) */
87
+ cronJobId?: string;
88
+ }
89
+ export interface ReadHistoryOptions {
90
+ /** 最大返回条数,默认 200 */
91
+ limit?: number;
92
+ /** Agent ID,默认 "main" */
93
+ agentId?: string;
94
+ /** 只返回 user/assistant 消息(过滤 system/tool),默认 false */
95
+ chatOnly?: boolean;
96
+ }
97
+ export interface ReadHistoryWithCronOptions extends ReadHistoryOptions {
98
+ /** 是否包含 cron 消息,默认 true */
99
+ includeCron?: boolean;
100
+ /** 只包含指定 cron job ID 的消息 */
101
+ cronJobIds?: string[];
102
+ }
103
+ export interface ReadHistoryTailOptions extends ReadHistoryOptions {
104
+ /** 从末尾读取的最大字节数,默认 1MB */
105
+ maxBytes?: number;
106
+ }
107
+ /** 原始 JSONL 行中 message.content 可能的结构 */
108
+ export type ContentEntry = {
109
+ type?: string;
110
+ text?: string;
111
+ thinking?: string;
112
+ thinkingSignature?: string;
113
+ name?: string;
114
+ id?: string;
115
+ toolCallId?: string;
116
+ tool_call_id?: string;
117
+ toolName?: string;
118
+ tool_name?: string;
119
+ input?: unknown;
120
+ arguments?: unknown;
121
+ args?: unknown;
122
+ output?: unknown;
123
+ result?: unknown;
124
+ content?: unknown;
125
+ tool_use_id?: string;
126
+ data?: string;
127
+ uri?: string;
128
+ mimeType?: string;
129
+ mime_type?: string;
130
+ fileName?: string;
131
+ file_name?: string;
132
+ filename?: string;
133
+ };
134
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/history/types.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,7 @@
1
+ /**
2
+ * LightClaw — History Module Types
3
+ *
4
+ * 集中定义历史消息相关的类型,供 history/ 模块内部和外部统一使用。
5
+ */
6
+ export {};
7
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../../src/history/types.ts"],"names":[],"mappings":"AAAA;;;;GAIG"}
@@ -0,0 +1,18 @@
1
+ /**
2
+ * LightClaw — 入站消息处理
3
+ *
4
+ * 接收用户消息 → 文件处理 → 路由 → AI 分发 → 回复
5
+ */
6
+ import type { GatewayContext, QueuedMessage, PrivateMessageData, FileAttachment } from "./types.js";
7
+ /** emit / sendReply / sendFiles 等 socket 操作的抽象接口 */
8
+ export interface SocketEmitter {
9
+ emit: (data: PrivateMessageData) => boolean;
10
+ sendReply: (targetId: string, text: string, replyToMsgId?: string) => boolean;
11
+ sendFiles: (targetId: string, text: string, files: FileAttachment[], replyToMsgId?: string) => boolean;
12
+ botClientId: string;
13
+ }
14
+ /**
15
+ * 创建入站消息处理器
16
+ */
17
+ export declare function createInboundHandler(account: GatewayContext["account"], emitter: SocketEmitter, log?: GatewayContext["log"]): (msg: QueuedMessage) => Promise<void>;
18
+ //# sourceMappingURL=inbound.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"inbound.d.ts","sourceRoot":"","sources":["../../src/inbound.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,KAAK,EACV,cAAc,EACd,aAAa,EACb,kBAAkB,EAClB,cAAc,EACf,MAAM,YAAY,CAAC;AAQpB,oDAAoD;AACpD,MAAM,WAAW,aAAa;IAC5B,IAAI,EAAE,CAAC,IAAI,EAAE,kBAAkB,KAAK,OAAO,CAAC;IAC5C,SAAS,EAAE,CAAC,QAAQ,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,YAAY,CAAC,EAAE,MAAM,KAAK,OAAO,CAAC;IAC9E,SAAS,EAAE,CAAC,QAAQ,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,cAAc,EAAE,EAAE,YAAY,CAAC,EAAE,MAAM,KAAK,OAAO,CAAC;IACvG,WAAW,EAAE,MAAM,CAAC;CACrB;AAED;;GAEG;AACH,wBAAgB,oBAAoB,CAClC,OAAO,EAAE,cAAc,CAAC,SAAS,CAAC,EAClC,OAAO,EAAE,aAAa,EACtB,GAAG,CAAC,EAAE,cAAc,CAAC,KAAK,CAAC,IAEb,KAAK,aAAa,KAAG,OAAO,CAAC,IAAI,CAAC,CAyUjD"}
@@ -0,0 +1,332 @@
1
+ /**
2
+ * LightClaw — 入站消息处理
3
+ *
4
+ * 接收用户消息 → 文件处理 → 路由 → AI 分发 → 回复
5
+ */
6
+ import { getAssistantRuntime } from "./runtime.js";
7
+ import { CHANNEL_KEY, REPLY_TIMEOUT, MEDIA_MAX_BYTES } from "./config.js";
8
+ import { createReplyPrefixOptions } from "openclaw/plugin-sdk";
9
+ import { generateMsgId } from "./dedup.js";
10
+ import { parseDataUrl, formatFileSize, mediaUrlsToFiles } from "./media.js";
11
+ import { uploadFileToCos, downloadFileFromCos, getFileDownloadUrl } from "./file-storage.js";
12
+ /**
13
+ * 创建入站消息处理器
14
+ */
15
+ export function createInboundHandler(account, emitter, log) {
16
+ return async (msg) => {
17
+ const pluginRuntime = getAssistantRuntime();
18
+ const currentCfg = pluginRuntime.config.loadConfig();
19
+ // 1. 确定地址和会话 Key
20
+ const fromAddress = `${CHANNEL_KEY}:dm:${msg.senderId}`;
21
+ // 2. 路由解析
22
+ const route = pluginRuntime.channel.routing.resolveAgentRoute({
23
+ cfg: currentCfg,
24
+ channel: CHANNEL_KEY,
25
+ accountId: account.accountId,
26
+ peer: { kind: "direct", id: msg.senderId },
27
+ });
28
+ // 3. 权限检查
29
+ const commandAuthorized = checkAuth(account.allowFrom, account.dmPolicy, msg.senderId);
30
+ // 4. 处理文件附件(files[] → 本地存储)
31
+ const localMediaPaths = [];
32
+ const localMediaTypes = [];
33
+ // 每个文件对应的公网可访问 URL(COS 地址),用于 session 历史持久化
34
+ const publicMediaUrls = [];
35
+ const ctxAttachments = [];
36
+ let attachmentDescription = "";
37
+ for (const file of msg.files) {
38
+ try {
39
+ let buffer;
40
+ let mimeType;
41
+ // 记录文件的 COS 公网 URL,优先用于 session 存储
42
+ let cosPublicUrl;
43
+ const parsed = file.bytes ? parseDataUrl(file.bytes) : null;
44
+ if (parsed) {
45
+ // data URL 格式:直接解析
46
+ buffer = parsed.buffer;
47
+ mimeType = parsed.mimeType;
48
+ }
49
+ else if (file.uri) {
50
+ // 远程 URI(COS 地址),下载获取内容
51
+ log?.info(`[${CHANNEL_KEY}] File has URI, downloading from COS: ${file.uri}`);
52
+ const downloaded = await downloadFileFromCos(file.uri, { apiKey: account.apiKey });
53
+ buffer = downloaded.buffer;
54
+ mimeType = downloaded.contentType || file.mimeType;
55
+ // 保留原始 COS 公网 URL,用于 session 历史中持久化引用
56
+ cosPublicUrl = file.uri.startsWith("http")
57
+ ? file.uri
58
+ : getFileDownloadUrl(file.uri);
59
+ }
60
+ else {
61
+ log?.warn(`[${CHANNEL_KEY}] File has no bytes or uri: ${file.name}, skipping`);
62
+ continue;
63
+ }
64
+ const saved = await pluginRuntime.channel.media.saveMediaBuffer(buffer, mimeType, "inbound", MEDIA_MAX_BYTES, file.name);
65
+ const savedMime = saved.contentType || mimeType;
66
+ localMediaPaths.push(saved.path);
67
+ localMediaTypes.push(savedMime);
68
+ // 如果文件来自 COS,使用公网 URL;否则尝试上传到 COS 获取公网 URL
69
+ if (cosPublicUrl) {
70
+ publicMediaUrls.push(cosPublicUrl);
71
+ }
72
+ else {
73
+ // data URL 来源的文件:上传到 COS 以获取公网 URL
74
+ try {
75
+ const uploadResult = await uploadFileToCos(saved.path, { apiKey: account.apiKey });
76
+ publicMediaUrls.push(uploadResult.url || `file://${saved.path}`);
77
+ log?.info(`[${CHANNEL_KEY}] Uploaded inbound file to COS: ${saved.path} → ${uploadResult.url}`);
78
+ }
79
+ catch (uploadErr) {
80
+ log?.warn(`[${CHANNEL_KEY}] Failed to upload inbound file to COS, falling back to local path: ${uploadErr}`);
81
+ publicMediaUrls.push(`file://${saved.path}`);
82
+ }
83
+ }
84
+ // Attachments 中使用公网 URL,确保 session 历史中的地址可被前端访问
85
+ const attachmentUrl = publicMediaUrls[publicMediaUrls.length - 1];
86
+ ctxAttachments.push({
87
+ name: file.name,
88
+ mimeType: savedMime,
89
+ url: attachmentUrl,
90
+ });
91
+ attachmentDescription += `\n用户发送了文件: ${file.name} (${formatFileSize(saved.size)})`;
92
+ log?.info(`[${CHANNEL_KEY}] File saved: ${saved.path} (${savedMime}, ${formatFileSize(saved.size)}), publicUrl: ${attachmentUrl}`);
93
+ }
94
+ catch (err) {
95
+ log?.error(`[${CHANNEL_KEY}] File processing failed for ${file.name}: ${err}`);
96
+ }
97
+ }
98
+ // 5. 构建消息体
99
+ const userText = msg.text + attachmentDescription;
100
+ const agentBody = account.systemPrompt
101
+ ? `${account.systemPrompt}\n\n${userText}`
102
+ : userText;
103
+ // 6. 构建入站上下文
104
+ // MediaPaths 保持本地路径(AI 模型 vision 需要从本地读取文件内容)
105
+ // MediaUrls 使用公网 COS URL(session 历史持久化,前端可直接访问)
106
+ const mediaFields = {};
107
+ if (localMediaPaths.length > 0) {
108
+ mediaFields.MediaPaths = localMediaPaths;
109
+ mediaFields.MediaPath = localMediaPaths[0];
110
+ mediaFields.MediaTypes = localMediaTypes;
111
+ mediaFields.MediaType = localMediaTypes[0];
112
+ mediaFields.MediaUrls = publicMediaUrls;
113
+ mediaFields.MediaUrl = publicMediaUrls[0];
114
+ }
115
+ const ctxPayload = pluginRuntime.channel.reply.finalizeInboundContext({
116
+ Body: userText,
117
+ BodyForAgent: agentBody,
118
+ RawBody: msg.text,
119
+ CommandBody: msg.text,
120
+ From: fromAddress,
121
+ To: `${CHANNEL_KEY}:${account.accountId}`,
122
+ Channel: CHANNEL_KEY,
123
+ ChatType: "direct",
124
+ SessionKey: route?.sessionKey ?? fromAddress,
125
+ AccountId: route?.accountId ?? account.accountId,
126
+ SenderId: msg.senderId,
127
+ SenderName: msg.senderId,
128
+ Provider: CHANNEL_KEY,
129
+ Surface: CHANNEL_KEY,
130
+ MessageSid: msg.messageId,
131
+ Timestamp: msg.timestamp,
132
+ OriginatingChannel: CHANNEL_KEY,
133
+ OriginatingTo: fromAddress,
134
+ CommandAuthorized: commandAuthorized,
135
+ OwnerAllowFrom: commandAuthorized ? [msg.senderId, fromAddress] : undefined,
136
+ AgentId: route?.agentId,
137
+ Attachments: ctxAttachments.length > 0 ? ctxAttachments : undefined,
138
+ ...mediaFields,
139
+ });
140
+ log?.info(`[${CHANNEL_KEY}] Inbound context: ${JSON.stringify(ctxPayload)}`);
141
+ const targetId = msg.senderId;
142
+ log?.info(`[${CHANNEL_KEY}] Processing: from=${msg.senderId} text="${(msg.text || "(仅文件)").slice(0, 60)}" files=${msg.files.length}`);
143
+ // 6.5 更新 session 的 last route,使 cron 定时任务能找到 lightclawbot 的投递目标
144
+ const storePath = pluginRuntime.channel.session.resolveStorePath(route.agentId);
145
+ const deliveryCtx = {
146
+ channel: CHANNEL_KEY,
147
+ to: fromAddress,
148
+ accountId: route.accountId ?? account.accountId,
149
+ };
150
+ // 写入 per-channel-peer session
151
+ if (route?.sessionKey) {
152
+ pluginRuntime.channel.session.updateLastRoute({
153
+ storePath,
154
+ sessionKey: route.sessionKey,
155
+ deliveryContext: deliveryCtx,
156
+ }).catch((err) => {
157
+ log?.error(`[${CHANNEL_KEY}] Failed to update last route (session): ${err}`);
158
+ });
159
+ }
160
+ // 写入 main session(兜底)
161
+ if (route?.mainSessionKey && route.mainSessionKey !== route.sessionKey) {
162
+ pluginRuntime.channel.session.updateLastRoute({
163
+ storePath,
164
+ sessionKey: route.mainSessionKey,
165
+ deliveryContext: deliveryCtx,
166
+ }).catch((err) => {
167
+ log?.error(`[${CHANNEL_KEY}] Failed to update last route (main): ${err}`);
168
+ });
169
+ }
170
+ // 7. 创建 replyPrefixOptions
171
+ const { onModelSelected, ...prefixOptions } = createReplyPrefixOptions({
172
+ cfg: currentCfg,
173
+ agentId: route.agentId,
174
+ channel: CHANNEL_KEY,
175
+ accountId: account.accountId,
176
+ });
177
+ // 8. 分发给 AI 引擎
178
+ let hasResponse = false;
179
+ let idleSent = false;
180
+ let timeoutId = null;
181
+ const timeoutPromise = new Promise((_, reject) => {
182
+ timeoutId = setTimeout(() => {
183
+ if (!hasResponse)
184
+ reject(new Error("AI reply timeout"));
185
+ }, REPLY_TIMEOUT);
186
+ });
187
+ // 同一条消息的流式回复(typing_start / stream_chunk / typing_stop)共用同一个 msgId
188
+ const replyMsgId = generateMsgId();
189
+ const dispatchPromise = pluginRuntime.channel.reply.dispatchReplyWithBufferedBlockDispatcher({
190
+ ctx: ctxPayload,
191
+ cfg: currentCfg,
192
+ dispatcherOptions: {
193
+ ...prefixOptions,
194
+ deliver: async (payload, info) => {
195
+ hasResponse = true;
196
+ log?.info(`[${CHANNEL_KEY}] Deliver: ${JSON.stringify(payload)}。info: ${JSON.stringify(info)}`);
197
+ if (timeoutId) {
198
+ clearTimeout(timeoutId);
199
+ timeoutId = null;
200
+ }
201
+ const replyText = payload.text ?? payload.body ?? "";
202
+ const mediaList = payload.mediaUrls?.length
203
+ ? payload.mediaUrls
204
+ : payload.mediaUrl ? [payload.mediaUrl] : [];
205
+ // 流式中间块
206
+ if (info.kind === "block") {
207
+ if (replyText.trim()) {
208
+ emitter.emit({
209
+ msgId: replyMsgId,
210
+ from: emitter.botClientId,
211
+ to: targetId,
212
+ content: replyText,
213
+ timestamp: Date.now(),
214
+ replyToMsgId: msg.messageId,
215
+ kind: "stream_chunk",
216
+ });
217
+ }
218
+ return;
219
+ }
220
+ if (!replyText && !mediaList.length)
221
+ return;
222
+ // 发送媒体文件 — 同时上传到 COS 获取公网 URL
223
+ if (mediaList.length > 0) {
224
+ const files = await mediaUrlsToFiles(mediaList, log);
225
+ // 尝试将文件上传到 COS 获取公网链接
226
+ const publicUrls = [];
227
+ const storageConfig = {
228
+ apiKey: account.apiKey,
229
+ };
230
+ for (const mediaUrl of mediaList) {
231
+ try {
232
+ // 本地文件路径(file:// 或绝对路径)
233
+ const localPath = mediaUrl.startsWith("file://")
234
+ ? mediaUrl.slice(7)
235
+ : mediaUrl;
236
+ if (localPath.startsWith("/") || localPath.match(/^[A-Za-z]:\\/)) {
237
+ const { existsSync } = await import("node:fs");
238
+ if (existsSync(localPath)) {
239
+ const result = await uploadFileToCos(localPath, storageConfig);
240
+ publicUrls.push(result.url || '');
241
+ log?.info(`[${CHANNEL_KEY}] Uploaded to COS: ${localPath} → ${result.url}`);
242
+ }
243
+ }
244
+ }
245
+ catch (uploadErr) {
246
+ log?.warn(`[${CHANNEL_KEY}] COS upload failed for ${mediaUrl}: ${uploadErr}`);
247
+ }
248
+ }
249
+ // 将公网 URL 追加到回复文本中
250
+ let enrichedText = replyText;
251
+ if (publicUrls.length > 0) {
252
+ const urlSection = publicUrls
253
+ .map((url, i) => `📎 文件下载链接${publicUrls.length > 1 ? ` (${i + 1})` : ""}: ${url}`)
254
+ .join("\n");
255
+ enrichedText = enrichedText
256
+ ? `${enrichedText}\n\n${urlSection}`
257
+ : urlSection;
258
+ }
259
+ if (files.length > 0) {
260
+ emitter.sendFiles(targetId, enrichedText, files, msg.messageId);
261
+ return;
262
+ }
263
+ // 文件无法直接发送,但有公网 URL,用文本方式发送链接
264
+ if (enrichedText.trim()) {
265
+ emitter.sendReply(targetId, enrichedText, msg.messageId);
266
+ return;
267
+ }
268
+ }
269
+ // 发送文本回复
270
+ if (replyText.trim()) {
271
+ emitter.sendReply(targetId, replyText, msg.messageId);
272
+ }
273
+ },
274
+ onReplyStart: () => {
275
+ emitter.emit({
276
+ msgId: replyMsgId,
277
+ from: emitter.botClientId,
278
+ to: targetId,
279
+ content: "",
280
+ timestamp: Date.now(),
281
+ kind: "typing_start",
282
+ });
283
+ },
284
+ onIdle: () => {
285
+ if (idleSent)
286
+ return;
287
+ idleSent = true;
288
+ emitter.emit({
289
+ msgId: replyMsgId,
290
+ from: emitter.botClientId,
291
+ to: targetId,
292
+ content: "",
293
+ timestamp: Date.now(),
294
+ replyToMsgId: msg.messageId,
295
+ kind: "typing_stop",
296
+ });
297
+ },
298
+ onError: (err, info) => {
299
+ log?.error(`[${CHANNEL_KEY}] ${info.kind} reply failed: ${String(err)}`);
300
+ },
301
+ },
302
+ replyOptions: { onModelSelected, disableBlockStreaming: false },
303
+ });
304
+ try {
305
+ await Promise.race([dispatchPromise, timeoutPromise]);
306
+ }
307
+ catch (err) {
308
+ const errMsg = err instanceof Error ? err.message : String(err);
309
+ log?.error(`[${CHANNEL_KEY}] Dispatch error: ${errMsg}`);
310
+ emitter.sendReply(targetId, `抱歉,处理您的消息时出现了问题: ${errMsg}`, msg.messageId);
311
+ }
312
+ finally {
313
+ if (timeoutId) {
314
+ clearTimeout(timeoutId);
315
+ timeoutId = null;
316
+ }
317
+ }
318
+ };
319
+ }
320
+ // ============================================================
321
+ // 权限检查
322
+ // ============================================================
323
+ function checkAuth(allowFrom, dmPolicy, senderId) {
324
+ if (dmPolicy === "disabled")
325
+ return false;
326
+ if (dmPolicy === "open")
327
+ return true;
328
+ if (!allowFrom || allowFrom.length === 0)
329
+ return false;
330
+ return allowFrom.includes("*") || allowFrom.some((id) => id.toLowerCase() === senderId.toLowerCase());
331
+ }
332
+ //# sourceMappingURL=inbound.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"inbound.js","sourceRoot":"","sources":["../../src/inbound.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,12 @@
1
+ /**
2
+ * LightClaw — 媒体文件处理工具
3
+ */
4
+ import type { FileAttachment, GatewayContext } from "./types.js";
5
+ export declare function parseDataUrl(dataUrl: string): {
6
+ buffer: Buffer;
7
+ mimeType: string;
8
+ } | null;
9
+ export declare function formatFileSize(bytes: number): string;
10
+ export declare function guessMimeByExt(ext: string): string;
11
+ export declare function mediaUrlsToFiles(urls: string[], log?: GatewayContext["log"]): Promise<FileAttachment[]>;
12
+ //# sourceMappingURL=media.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"media.d.ts","sourceRoot":"","sources":["../../src/media.ts"],"names":[],"mappings":"AAAA;;GAEG;AAGH,OAAO,KAAK,EAAE,cAAc,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AAMjE,wBAAgB,YAAY,CAAC,OAAO,EAAE,MAAM,GAAG;IAAE,MAAM,EAAE,MAAM,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAA;CAAE,GAAG,IAAI,CAIzF;AAMD,wBAAgB,cAAc,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAKpD;AAMD,wBAAgB,cAAc,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CASlD;AAMD,wBAAsB,gBAAgB,CACpC,IAAI,EAAE,MAAM,EAAE,EACd,GAAG,CAAC,EAAE,cAAc,CAAC,KAAK,CAAC,GAC1B,OAAO,CAAC,cAAc,EAAE,CAAC,CAyC3B"}
@@ -0,0 +1,87 @@
1
+ /**
2
+ * LightClaw — 媒体文件处理工具
3
+ */
4
+ import * as path from "node:path";
5
+ // ============================================================
6
+ // 解析 data URL → Buffer
7
+ // ============================================================
8
+ export function parseDataUrl(dataUrl) {
9
+ const match = dataUrl.match(/^data:([^;]+);base64,(.+)$/);
10
+ if (!match)
11
+ return null;
12
+ return { mimeType: match[1], buffer: Buffer.from(match[2], "base64") };
13
+ }
14
+ // ============================================================
15
+ // 格式化文件大小
16
+ // ============================================================
17
+ export function formatFileSize(bytes) {
18
+ if (bytes < 1024)
19
+ return `${bytes}B`;
20
+ if (bytes < 1024 * 1024)
21
+ return `${(bytes / 1024).toFixed(1)}KB`;
22
+ if (bytes < 1024 * 1024 * 1024)
23
+ return `${(bytes / (1024 * 1024)).toFixed(1)}MB`;
24
+ return `${(bytes / (1024 * 1024 * 1024)).toFixed(1)}GB`;
25
+ }
26
+ // ============================================================
27
+ // MIME 类型猜测
28
+ // ============================================================
29
+ export function guessMimeByExt(ext) {
30
+ const map = {
31
+ ".png": "image/png", ".jpg": "image/jpeg", ".jpeg": "image/jpeg",
32
+ ".gif": "image/gif", ".webp": "image/webp", ".svg": "image/svg+xml",
33
+ ".mp3": "audio/mpeg", ".wav": "audio/wav", ".ogg": "audio/ogg",
34
+ ".mp4": "video/mp4", ".webm": "video/webm",
35
+ ".pdf": "application/pdf", ".txt": "text/plain",
36
+ };
37
+ return map[ext] || "application/octet-stream";
38
+ }
39
+ // ============================================================
40
+ // 将 AI 引擎返回的 mediaUrl 列表转为 files[] 格式
41
+ // ============================================================
42
+ export async function mediaUrlsToFiles(urls, log) {
43
+ const files = [];
44
+ const { readFileSync, existsSync } = await import("node:fs");
45
+ for (const url of urls) {
46
+ try {
47
+ let buffer;
48
+ let mimeType;
49
+ let name;
50
+ if (url.startsWith("data:")) {
51
+ const parsed = parseDataUrl(url);
52
+ if (!parsed)
53
+ continue;
54
+ buffer = parsed.buffer;
55
+ mimeType = parsed.mimeType;
56
+ name = "file";
57
+ }
58
+ else if (url.startsWith("http://") || url.startsWith("https://")) {
59
+ const resp = await fetch(url);
60
+ if (!resp.ok)
61
+ continue;
62
+ buffer = Buffer.from(await resp.arrayBuffer());
63
+ mimeType = resp.headers.get("content-type") || "application/octet-stream";
64
+ name = url.split("/").pop()?.split("?")[0] || "file";
65
+ }
66
+ else if (existsSync(url)) {
67
+ buffer = readFileSync(url);
68
+ const ext = path.extname(url).toLowerCase();
69
+ mimeType = guessMimeByExt(ext);
70
+ name = path.basename(url);
71
+ }
72
+ else {
73
+ continue;
74
+ }
75
+ files.push({
76
+ name,
77
+ mimeType,
78
+ bytes: `data:${mimeType};base64,${buffer.toString("base64")}`,
79
+ });
80
+ }
81
+ catch (err) {
82
+ log?.warn?.(`[mediaUrlsToFiles] Failed to convert ${url}: ${err}`);
83
+ }
84
+ }
85
+ return files;
86
+ }
87
+ //# sourceMappingURL=media.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"media.js","sourceRoot":"","sources":["../../src/media.ts"],"names":[],"mappings":"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"}