lightclawbot 1.0.0 → 1.0.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 (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 +51 -0
  39. package/dist/src/history/message-parser.d.ts.map +1 -0
  40. package/dist/src/history/message-parser.js +248 -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,252 @@
1
+ /**
2
+ * LightClaw — Socket.IO Gateway
3
+ *
4
+ * 连接编排层:
5
+ * 1. 管理 Socket.IO 连接生命周期(连接/断开/重连/防重入)
6
+ * 2. 维护消息队列,串行处理入站消息
7
+ * 3. 提供 socket emit 抽象供子模块使用
8
+ *
9
+ * 消息处理逻辑 → inbound.ts
10
+ * 事件监听绑定 → socket-handlers.ts
11
+ * 去重/节流/ID → dedup.ts
12
+ * 媒体文件处理 → media.ts
13
+ */
14
+ import { io } from "socket.io-client";
15
+ import { CHANNEL_KEY, WS_URL, API_BASE_URL, SOCKET_PATH, SOCKET_RECONNECTION_DELAY, SOCKET_RECONNECTION_DELAY_MAX, SOCKET_RECONNECTION_ATTEMPTS, API_PATH_USER_CURRENT, EVENT_MESSAGE_PRIVATE, MESSAGE_QUEUE_SIZE, MESSAGE_QUEUE_WARN_THRESHOLD, QUEUE_POLL_INTERVAL, HEALTH_HEARTBEAT_INTERVAL, buildAuthHeaders, } from "./config.js";
16
+ import { generateMsgId } from "./dedup.js";
17
+ import { createInboundHandler } from "./inbound.js";
18
+ import { bindSocketHandlers } from "./socket-handlers.js";
19
+ import { registerSocket, unregisterSocket, flushPendingMessages } from "./socket-registry.js";
20
+ // ============================================================
21
+ // Gateway 实例追踪(防止同一 accountId 创建多个连接)
22
+ // ============================================================
23
+ /** accountId → cleanup function */
24
+ const activeGateways = new Map();
25
+ async function deriveBotClientId(apiKey) {
26
+ const url = `${API_BASE_URL}${API_PATH_USER_CURRENT}`;
27
+ const resp = await fetch(url, {
28
+ method: "GET",
29
+ headers: buildAuthHeaders(apiKey),
30
+ });
31
+ if (!resp.ok) {
32
+ const body = await resp.text().catch(() => "");
33
+ throw new Error(`Failed to fetch botId: HTTP ${resp.status} ${resp.statusText}${body ? ` — ${body}` : ""}`);
34
+ }
35
+ const result = (await resp.json());
36
+ if (result.code !== 0) {
37
+ throw new Error(`Failed to fetch botId: code=${result.code}, message=${result.message ?? "unknown"}`);
38
+ }
39
+ const extra = result.data?.client?.extra;
40
+ if (!extra) {
41
+ throw new Error("Invalid response: missing data.client.extra");
42
+ }
43
+ let parsed;
44
+ try {
45
+ parsed = JSON.parse(extra);
46
+ }
47
+ catch {
48
+ throw new Error(`Invalid response: data.client.extra is not valid JSON: ${extra}`);
49
+ }
50
+ if (!parsed.botId) {
51
+ throw new Error(`Invalid response: missing botId in data.client.extra: ${extra}`);
52
+ }
53
+ return parsed.botId;
54
+ }
55
+ // ============================================================
56
+ // 核心:启动 Gateway
57
+ // ============================================================
58
+ export async function startGateway(ctx) {
59
+ const { account, abortSignal, onReady, onDisconnect, onEvent, log } = ctx;
60
+ if (!account.apiKey) {
61
+ throw new Error(`[${CHANNEL_KEY}] Missing apiKey in config`);
62
+ }
63
+ // 防重入:如果同一 accountId 已有活跃 gateway,先销毁
64
+ const existingCleanup = activeGateways.get(account.accountId);
65
+ if (existingCleanup) {
66
+ log?.warn(`[${CHANNEL_KEY}] Destroying existing gateway for account ${account.accountId} before creating new one`);
67
+ existingCleanup();
68
+ }
69
+ // 通过 HTTP 接口获取 Bot 身份
70
+ log?.info(`[${CHANNEL_KEY}] Fetching bot clientId...`);
71
+ const botClientId = await deriveBotClientId(account.apiKey);
72
+ log?.info(`[${CHANNEL_KEY}] Bot clientId: ${botClientId}`);
73
+ let isAborted = false;
74
+ let currentSocket = null;
75
+ let healthHeartbeatTimer = null;
76
+ // ---- Socket.IO 发送抽象 ----
77
+ const emit = (data) => {
78
+ if (!currentSocket?.connected)
79
+ return false;
80
+ log?.info(`[${CHANNEL_KEY}] emit: ${JSON.stringify(data)}`);
81
+ try {
82
+ currentSocket.emit(EVENT_MESSAGE_PRIVATE, data);
83
+ return true;
84
+ }
85
+ catch (err) {
86
+ log?.error(`[${CHANNEL_KEY}] emit error: ${err}`);
87
+ return false;
88
+ }
89
+ };
90
+ const sendReply = (targetId, text, replyToMsgId) => {
91
+ log?.info(`[${CHANNEL_KEY}] sendReply: ${text} to ${targetId} (replyTo: ${replyToMsgId || "none"})`);
92
+ return emit({
93
+ msgId: generateMsgId(),
94
+ from: botClientId,
95
+ to: targetId,
96
+ content: text,
97
+ timestamp: Date.now(),
98
+ replyToMsgId,
99
+ });
100
+ };
101
+ const sendFiles = (targetId, text, files, replyToMsgId) => {
102
+ return emit({
103
+ msgId: generateMsgId(),
104
+ from: botClientId,
105
+ to: targetId,
106
+ content: text,
107
+ timestamp: Date.now(),
108
+ files,
109
+ replyToMsgId,
110
+ });
111
+ };
112
+ const emitter = { emit, sendReply, sendFiles, botClientId };
113
+ // ---- 入站消息处理器 ----
114
+ const handleInboundMessage = createInboundHandler(account, emitter, log);
115
+ // ---- 消息队列 ----
116
+ const messageQueue = [];
117
+ let messageProcessorRunning = false;
118
+ let queueNotify = null;
119
+ const enqueueMessage = (msg) => {
120
+ if (messageQueue.length >= MESSAGE_QUEUE_SIZE) {
121
+ const dropped = messageQueue.shift();
122
+ log?.error(`[${CHANNEL_KEY}] Queue full, dropped message from ${dropped?.senderId}`);
123
+ }
124
+ if (messageQueue.length >= MESSAGE_QUEUE_WARN_THRESHOLD) {
125
+ log?.warn(`[${CHANNEL_KEY}] Queue size: ${messageQueue.length}/${MESSAGE_QUEUE_SIZE}`);
126
+ }
127
+ messageQueue.push(msg);
128
+ // 唤醒处理器
129
+ queueNotify?.();
130
+ };
131
+ /** 等待队列中有新消息,或超时后返回 */
132
+ const waitForMessage = () => {
133
+ if (messageQueue.length > 0)
134
+ return Promise.resolve();
135
+ return new Promise((resolve) => {
136
+ const timer = setTimeout(() => { queueNotify = null; resolve(); }, QUEUE_POLL_INTERVAL);
137
+ queueNotify = () => { clearTimeout(timer); queueNotify = null; resolve(); };
138
+ });
139
+ };
140
+ const startMessageProcessor = () => {
141
+ if (messageProcessorRunning)
142
+ return;
143
+ messageProcessorRunning = true;
144
+ const loop = async () => {
145
+ while (!isAborted) {
146
+ await waitForMessage();
147
+ while (messageQueue.length > 0 && !isAborted) {
148
+ const msg = messageQueue.shift();
149
+ try {
150
+ await handleInboundMessage(msg);
151
+ }
152
+ catch (err) {
153
+ log?.error(`[${CHANNEL_KEY}] Message handler error: ${err}`);
154
+ }
155
+ }
156
+ }
157
+ messageProcessorRunning = false;
158
+ };
159
+ loop().catch((err) => {
160
+ log?.error(`[${CHANNEL_KEY}] Message processor crashed: ${err}`);
161
+ messageProcessorRunning = false;
162
+ });
163
+ };
164
+ // ---- 生命周期 ----
165
+ const cleanup = () => {
166
+ isAborted = true;
167
+ if (healthHeartbeatTimer) {
168
+ clearInterval(healthHeartbeatTimer);
169
+ healthHeartbeatTimer = null;
170
+ }
171
+ unregisterSocket(account.accountId);
172
+ activeGateways.delete(account.accountId);
173
+ if (currentSocket) {
174
+ currentSocket.removeAllListeners();
175
+ currentSocket.disconnect();
176
+ currentSocket = null;
177
+ }
178
+ log?.info(`[${CHANNEL_KEY}] Gateway cleaned up`);
179
+ };
180
+ activeGateways.set(account.accountId, cleanup);
181
+ // ---- Socket.IO 连接 ----
182
+ log?.info(`[${CHANNEL_KEY}] Connecting to ${WS_URL}...`);
183
+ const socket = io(WS_URL, {
184
+ auth: buildAuthHeaders(account.apiKey),
185
+ path: SOCKET_PATH,
186
+ forceNew: true,
187
+ reconnection: true,
188
+ reconnectionAttempts: SOCKET_RECONNECTION_ATTEMPTS,
189
+ reconnectionDelay: SOCKET_RECONNECTION_DELAY,
190
+ reconnectionDelayMax: SOCKET_RECONNECTION_DELAY_MAX,
191
+ transports: ['websocket']
192
+ });
193
+ currentSocket = socket;
194
+ socket.on("connect", () => {
195
+ log?.info(`[${CHANNEL_KEY}] Connected (id=${socket.id}, botClientId=${botClientId})`);
196
+ registerSocket(account.accountId, socket, botClientId);
197
+ startMessageProcessor();
198
+ // 重连后 flush 断线期间缓冲的 outbound 消息
199
+ const { sent, failed } = flushPendingMessages(account.accountId, log);
200
+ if (sent > 0 || failed > 0) {
201
+ log?.info(`[${CHANNEL_KEY}] Flushed buffered outbound messages: sent=${sent}, failed=${failed}`);
202
+ }
203
+ // 启动 health-monitor 心跳:定期刷新 lastEventAt,防止空闲期被误判 stale-socket
204
+ if (healthHeartbeatTimer)
205
+ clearInterval(healthHeartbeatTimer);
206
+ healthHeartbeatTimer = setInterval(() => {
207
+ if (currentSocket?.connected) {
208
+ onEvent?.();
209
+ log?.debug?.(`[${CHANNEL_KEY}] Health heartbeat sent`);
210
+ }
211
+ }, HEALTH_HEARTBEAT_INTERVAL);
212
+ onReady?.();
213
+ });
214
+ // 绑定业务事件处理器
215
+ bindSocketHandlers(socket, {
216
+ account,
217
+ botClientId,
218
+ log,
219
+ enqueueMessage,
220
+ onEvent,
221
+ });
222
+ socket.on("connect_error", (err) => {
223
+ log?.error(`[${CHANNEL_KEY}] connect_error: ${err.message}`);
224
+ });
225
+ socket.on("disconnect", (reason) => {
226
+ log?.info(`[${CHANNEL_KEY}] Disconnected: ${reason}`);
227
+ // 断线时停止心跳,避免在未连接状态下假装活跃
228
+ if (healthHeartbeatTimer) {
229
+ clearInterval(healthHeartbeatTimer);
230
+ healthHeartbeatTimer = null;
231
+ }
232
+ // 注意:断线时不调用 unregisterSocket,保留 entry 以便 outbound 消息可以缓冲。
233
+ // 仅在 cleanup(gateway 彻底销毁)时才 unregisterSocket。
234
+ onDisconnect?.();
235
+ if (reason === "io server disconnect") {
236
+ // 服务端主动断开,需要手动重连
237
+ log?.warn(`[${CHANNEL_KEY}] Server forced disconnect, attempting manual reconnect...`);
238
+ socket.connect();
239
+ }
240
+ });
241
+ // ---- 保持 Promise 挂起直到 abort ----
242
+ // 框架认为 startAccount 返回的 Promise resolve = gateway 已退出,会触发 auto-restart。
243
+ // 因此必须让 Promise 一直挂起,直到 abortSignal 触发才 resolve。
244
+ return new Promise((resolve) => {
245
+ abortSignal.addEventListener("abort", () => {
246
+ cleanup();
247
+ log?.info(`[${CHANNEL_KEY}] Gateway aborted`);
248
+ resolve();
249
+ });
250
+ });
251
+ }
252
+ //# sourceMappingURL=gateway.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"gateway.js","sourceRoot":"","sources":["../../src/gateway.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,76 @@
1
+ /**
2
+ * LightClaw — Cron Utilities
3
+ *
4
+ * 封装 OpenClaw cron(定时任务)相关的工具函数:
5
+ * - Session Key 解析与判断
6
+ * - Cron session 列表查询
7
+ * - 从主会话 JSONL 中提取关联的 cron job ID
8
+ * - Cron 消息内容清理(提取有效 payload)
9
+ */
10
+ import type { CronSessionInfo, SessionType } from "./types.js";
11
+ /** 判断 session key 是否为 cron 相关 */
12
+ export declare function isCronSessionKey(key: string): boolean;
13
+ /** 判断 session key 是否为 cron run(单次运行) */
14
+ export declare function isCronRunKey(key: string): boolean;
15
+ /** 判断 session key 是否为 cron base(cron 任务定义) */
16
+ export declare function isCronBaseKey(key: string): boolean;
17
+ /** 从 cron session key 中提取 job ID */
18
+ export declare function extractCronJobId(key: string): string | null;
19
+ /** 从 cron run key 中提取 run ID */
20
+ export declare function extractCronRunId(key: string): string | null;
21
+ /**
22
+ * 判断 session key 的会话类型
23
+ */
24
+ export declare function classifySessionKey(key: string): SessionType;
25
+ /**
26
+ * 从 sessions.json 中列出所有 cron run session
27
+ *
28
+ * @param agentId - Agent ID,默认 "main"
29
+ * @returns 按更新时间降序排列的 cron session 列表
30
+ */
31
+ export declare function listCronSessions(agentId?: string): CronSessionInfo[];
32
+ /**
33
+ * 按 cron job ID 分组获取 cron sessions
34
+ *
35
+ * @returns Map<cronJobId, CronSessionInfo[]>,每组按时间正序
36
+ */
37
+ export declare function groupCronSessionsByJob(agentId?: string): Map<string, CronSessionInfo[]>;
38
+ export declare function extractCronInfoFromText(text: string): {
39
+ jobId: string;
40
+ name: string;
41
+ } | null;
42
+ /**
43
+ * 清理 cron run 的 user 消息,提取 cron 任务的实际 payload。
44
+ *
45
+ * 原始格式:
46
+ * Skills store policy (operator configured):
47
+ * ...
48
+ * [cron:jobId 任务名] <actual payload>
49
+ * Current time: ...
50
+ * Return your summary as plain text; ...
51
+ *
52
+ * 提取为:
53
+ * [每2分钟喝水提醒] <actual payload>
54
+ */
55
+ export declare function cleanCronUserMessage(text: string): string;
56
+ /**
57
+ * 扫描主会话的 JSONL transcript 文件,提取所有通过 cron 工具创建的 job ID。
58
+ *
59
+ * 关联逻辑:
60
+ * 1. 读取主会话的 .jsonl 文件
61
+ * 2. 找到 type=message、role=toolResult、toolName=cron 的行
62
+ * 3. 从 toolResult 的 content 中解析出 cron job 的 id 字段
63
+ * 4. 返回去重后的 cron job ID 列表
64
+ *
65
+ * 这建立了主会话和 cron sessions 之间的**显式关联关系**:
66
+ * 主会话 JSONL → cron tool results → cron job IDs → sessions.json 中的 cron run keys
67
+ */
68
+ export declare function extractCronJobIdsFromTranscript(sessionKey: string, agentId?: string): string[];
69
+ /**
70
+ * 根据 cron job ID 列表,从 sessions.json 中找到所有关联的 cron run sessions
71
+ *
72
+ * 这是新的关联机制的核心——不再遍历所有 cron sessions,
73
+ * 而是只查找与主会话**显式关联**的 cron job 的运行记录。
74
+ */
75
+ export declare function findCronSessionsByJobIds(cronJobIds: string[], agentId?: string): CronSessionInfo[];
76
+ //# sourceMappingURL=cron-utils.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cron-utils.d.ts","sourceRoot":"","sources":["../../../src/history/cron-utils.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAIH,OAAO,KAAK,EAAE,eAAe,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAkB/D,iCAAiC;AACjC,wBAAgB,gBAAgB,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAErD;AAED,wCAAwC;AACxC,wBAAgB,YAAY,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAEjD;AAED,8CAA8C;AAC9C,wBAAgB,aAAa,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAElD;AAED,oCAAoC;AACpC,wBAAgB,gBAAgB,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAI3D;AAED,gCAAgC;AAChC,wBAAgB,gBAAgB,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAE3D;AAED;;GAEG;AACH,wBAAgB,kBAAkB,CAAC,GAAG,EAAE,MAAM,GAAG,WAAW,CAI3D;AAMD;;;;;GAKG;AACH,wBAAgB,gBAAgB,CAAC,OAAO,CAAC,EAAE,MAAM,GAAG,eAAe,EAAE,CAgBpE;AAED;;;;GAIG;AACH,wBAAgB,sBAAsB,CAAC,OAAO,CAAC,EAAE,MAAM,GAAG,GAAG,CAAC,MAAM,EAAE,eAAe,EAAE,CAAC,CAgBvF;AAaD,wBAAgB,uBAAuB,CAAC,IAAI,EAAE,MAAM,GAAG;IAAE,KAAK,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,GAAG,IAAI,CAG5F;AAED;;;;;;;;;;;;GAYG;AACH,wBAAgB,oBAAoB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAmBzD;AAgBD;;;;;;;;;;;GAWG;AACH,wBAAgB,+BAA+B,CAC7C,UAAU,EAAE,MAAM,EAClB,OAAO,CAAC,EAAE,MAAM,GACf,MAAM,EAAE,CAgDV;AAiDD;;;;;GAKG;AACH,wBAAgB,wBAAwB,CACtC,UAAU,EAAE,MAAM,EAAE,EACpB,OAAO,CAAC,EAAE,MAAM,GACf,eAAe,EAAE,CAuBnB"}
@@ -0,0 +1,291 @@
1
+ /**
2
+ * LightClaw — Cron Utilities
3
+ *
4
+ * 封装 OpenClaw cron(定时任务)相关的工具函数:
5
+ * - Session Key 解析与判断
6
+ * - Cron session 列表查询
7
+ * - 从主会话 JSONL 中提取关联的 cron job ID
8
+ * - Cron 消息内容清理(提取有效 payload)
9
+ */
10
+ import fs from "node:fs";
11
+ import { loadSessionStore, resolveTranscriptPath } from "./session-store.js";
12
+ import { stripResidualMetadata } from "./text-processing.js";
13
+ // ============================================================
14
+ // Session Key 正则
15
+ // ============================================================
16
+ /** Cron 基础 key: agent:<agentId>:cron:<cronJobId> */
17
+ const CRON_BASE_KEY_RE = /^agent:[^:]+:cron:([0-9a-f-]+)$/;
18
+ /** Cron 运行 key: agent:<agentId>:cron:<cronJobId>:run:<runId> */
19
+ const CRON_RUN_KEY_RE = /^agent:[^:]+:cron:([0-9a-f-]+):run:([0-9a-f-]+)$/;
20
+ // ============================================================
21
+ // Session Key 解析
22
+ // ============================================================
23
+ /** 判断 session key 是否为 cron 相关 */
24
+ export function isCronSessionKey(key) {
25
+ return CRON_BASE_KEY_RE.test(key) || CRON_RUN_KEY_RE.test(key);
26
+ }
27
+ /** 判断 session key 是否为 cron run(单次运行) */
28
+ export function isCronRunKey(key) {
29
+ return CRON_RUN_KEY_RE.test(key);
30
+ }
31
+ /** 判断 session key 是否为 cron base(cron 任务定义) */
32
+ export function isCronBaseKey(key) {
33
+ return CRON_BASE_KEY_RE.test(key);
34
+ }
35
+ /** 从 cron session key 中提取 job ID */
36
+ export function extractCronJobId(key) {
37
+ return key.match(CRON_BASE_KEY_RE)?.[1]
38
+ ?? key.match(CRON_RUN_KEY_RE)?.[1]
39
+ ?? null;
40
+ }
41
+ /** 从 cron run key 中提取 run ID */
42
+ export function extractCronRunId(key) {
43
+ return key.match(CRON_RUN_KEY_RE)?.[2] ?? null;
44
+ }
45
+ /**
46
+ * 判断 session key 的会话类型
47
+ */
48
+ export function classifySessionKey(key) {
49
+ if (CRON_RUN_KEY_RE.test(key))
50
+ return "cron-run";
51
+ if (CRON_BASE_KEY_RE.test(key))
52
+ return "cron-base";
53
+ return "direct";
54
+ }
55
+ // ============================================================
56
+ // Cron Session 列表
57
+ // ============================================================
58
+ /**
59
+ * 从 sessions.json 中列出所有 cron run session
60
+ *
61
+ * @param agentId - Agent ID,默认 "main"
62
+ * @returns 按更新时间降序排列的 cron session 列表
63
+ */
64
+ export function listCronSessions(agentId) {
65
+ const store = loadSessionStore(agentId);
66
+ return Object.entries(store)
67
+ .filter(([key]) => CRON_RUN_KEY_RE.test(key))
68
+ .map(([key, entry]) => {
69
+ const cronJobId = extractCronJobId(key) ?? "";
70
+ const cronName = entry.label?.replace(/^Cron:\s*/, "");
71
+ return {
72
+ sessionKey: key,
73
+ sessionId: entry.sessionId,
74
+ cronJobId,
75
+ cronName,
76
+ updatedAt: entry.updatedAt,
77
+ };
78
+ })
79
+ .sort((a, b) => (b.updatedAt ?? 0) - (a.updatedAt ?? 0));
80
+ }
81
+ /**
82
+ * 按 cron job ID 分组获取 cron sessions
83
+ *
84
+ * @returns Map<cronJobId, CronSessionInfo[]>,每组按时间正序
85
+ */
86
+ export function groupCronSessionsByJob(agentId) {
87
+ const sessions = listCronSessions(agentId);
88
+ const groups = new Map();
89
+ for (const session of sessions) {
90
+ const list = groups.get(session.cronJobId) ?? [];
91
+ list.push(session);
92
+ groups.set(session.cronJobId, list);
93
+ }
94
+ // 每组内按时间正序
95
+ for (const [, list] of groups) {
96
+ list.sort((a, b) => (a.updatedAt ?? 0) - (b.updatedAt ?? 0));
97
+ }
98
+ return groups;
99
+ }
100
+ // ============================================================
101
+ // Cron 消息内容清理
102
+ // ============================================================
103
+ /**
104
+ * 从 cron 消息文本中提取 cron 标识信息
105
+ *
106
+ * 匹配格式:[cron:<jobId> <name>] ...
107
+ */
108
+ const CRON_MSG_PREFIX_RE = /\[cron:([0-9a-f-]+)\s+([^\]]+)\]/;
109
+ export function extractCronInfoFromText(text) {
110
+ const m = text.match(CRON_MSG_PREFIX_RE);
111
+ return m ? { jobId: m[1], name: m[2] } : null;
112
+ }
113
+ /**
114
+ * 清理 cron run 的 user 消息,提取 cron 任务的实际 payload。
115
+ *
116
+ * 原始格式:
117
+ * Skills store policy (operator configured):
118
+ * ...
119
+ * [cron:jobId 任务名] <actual payload>
120
+ * Current time: ...
121
+ * Return your summary as plain text; ...
122
+ *
123
+ * 提取为:
124
+ * [每2分钟喝水提醒] <actual payload>
125
+ */
126
+ export function cleanCronUserMessage(text) {
127
+ if (!text)
128
+ return text;
129
+ // 提取 [cron:xxx name] 后面的内容
130
+ const cronPrefixMatch = text.match(/\[cron:[0-9a-f-]+\s+([^\]]+)\]\s*([\s\S]*)/);
131
+ if (!cronPrefixMatch)
132
+ return stripResidualMetadata(text);
133
+ const cronName = cronPrefixMatch[1];
134
+ let payload = cronPrefixMatch[2];
135
+ // 移除尾部的系统指令
136
+ payload = payload
137
+ .replace(/Current time:.*$/m, "")
138
+ .replace(/Return your summary as plain text[\s\S]*/m, "")
139
+ .trim();
140
+ return `[${cronName}] ${payload}`;
141
+ }
142
+ // ============================================================
143
+ // 从主会话 JSONL 中提取关联的 Cron Job IDs
144
+ // ============================================================
145
+ /**
146
+ * 从 toolResult 的 content 文本中提取 cron job id
147
+ *
148
+ * cron 工具返回的结果格式如:
149
+ * { "id": "3d16ddcb-...", "name": "喝水提醒", ... }
150
+ *
151
+ * 需要匹配 toolName 为 "cron" 的 toolResult,并从 content 中解析 JSON 提取 id。
152
+ */
153
+ const UUID_RE = /[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}/i;
154
+ /**
155
+ * 扫描主会话的 JSONL transcript 文件,提取所有通过 cron 工具创建的 job ID。
156
+ *
157
+ * 关联逻辑:
158
+ * 1. 读取主会话的 .jsonl 文件
159
+ * 2. 找到 type=message、role=toolResult、toolName=cron 的行
160
+ * 3. 从 toolResult 的 content 中解析出 cron job 的 id 字段
161
+ * 4. 返回去重后的 cron job ID 列表
162
+ *
163
+ * 这建立了主会话和 cron sessions 之间的**显式关联关系**:
164
+ * 主会话 JSONL → cron tool results → cron job IDs → sessions.json 中的 cron run keys
165
+ */
166
+ export function extractCronJobIdsFromTranscript(sessionKey, agentId) {
167
+ const filePath = resolveTranscriptPath(sessionKey, agentId);
168
+ if (!filePath)
169
+ return [];
170
+ let raw;
171
+ try {
172
+ raw = fs.readFileSync(filePath, "utf-8");
173
+ }
174
+ catch {
175
+ return [];
176
+ }
177
+ const jobIds = new Set();
178
+ const lines = raw.split(/\r?\n/).filter((l) => l.trim());
179
+ for (const line of lines) {
180
+ try {
181
+ const parsed = JSON.parse(line);
182
+ if (parsed?.type !== "message")
183
+ continue;
184
+ const msg = parsed?.message;
185
+ if (!msg)
186
+ continue;
187
+ // 方式1:从 toolResult (role=toolResult, toolName=cron) 中提取
188
+ const role = msg.role?.toLowerCase();
189
+ if (role === "toolresult" || role === "tool_result" || role === "tool") {
190
+ const toolName = msg.toolName ?? msg.tool_name ?? msg.name ?? "";
191
+ if (toolName === "cron") {
192
+ const id = _extractCronIdFromToolResult(msg.content);
193
+ if (id)
194
+ jobIds.add(id);
195
+ }
196
+ }
197
+ // 方式2:从 assistant 消息的 toolCall 返回中提取
198
+ // (有些 JSONL 格式会将 toolResult 内联在 assistant content 中)
199
+ if (role === "assistant" && Array.isArray(msg.content)) {
200
+ for (const entry of msg.content) {
201
+ if (entry?.type === "toolCall" && entry.name === "cron") {
202
+ // toolCall 本身不含结果,结果在后续的 toolResult 行中
203
+ continue;
204
+ }
205
+ }
206
+ }
207
+ }
208
+ catch {
209
+ // 跳过格式错误的行
210
+ }
211
+ }
212
+ return [...jobIds];
213
+ }
214
+ /**
215
+ * 从 cron toolResult 的 content 中解析出 job id
216
+ */
217
+ function _extractCronIdFromToolResult(content) {
218
+ // content 可能是 string 或 array
219
+ const text = _extractToolResultText(content);
220
+ if (!text)
221
+ return null;
222
+ try {
223
+ // 尝试直接 JSON.parse 整个文本
224
+ const obj = JSON.parse(text);
225
+ // cron add 返回有 id 字段
226
+ if (obj?.id && UUID_RE.test(obj.id))
227
+ return obj.id;
228
+ // cron list 返回的 jobs 数组中也有 id
229
+ if (Array.isArray(obj?.jobs)) {
230
+ for (const job of obj.jobs) {
231
+ if (job?.id && UUID_RE.test(job.id))
232
+ return job.id;
233
+ }
234
+ }
235
+ }
236
+ catch {
237
+ // JSON 解析失败,尝试正则提取 "id": "uuid" 模式
238
+ const idMatch = text.match(/"id"\s*:\s*"([0-9a-f-]{36})"/i);
239
+ if (idMatch)
240
+ return idMatch[1];
241
+ }
242
+ return null;
243
+ }
244
+ /**
245
+ * 从 toolResult content 字段提取纯文本
246
+ */
247
+ function _extractToolResultText(content) {
248
+ if (typeof content === "string")
249
+ return content;
250
+ if (!Array.isArray(content))
251
+ return null;
252
+ for (const entry of content) {
253
+ if (entry && typeof entry === "object" && typeof entry.text === "string") {
254
+ return entry.text;
255
+ }
256
+ }
257
+ return null;
258
+ }
259
+ // ============================================================
260
+ // 基于 Job IDs 查找 Cron Sessions
261
+ // ============================================================
262
+ /**
263
+ * 根据 cron job ID 列表,从 sessions.json 中找到所有关联的 cron run sessions
264
+ *
265
+ * 这是新的关联机制的核心——不再遍历所有 cron sessions,
266
+ * 而是只查找与主会话**显式关联**的 cron job 的运行记录。
267
+ */
268
+ export function findCronSessionsByJobIds(cronJobIds, agentId) {
269
+ if (cronJobIds.length === 0)
270
+ return [];
271
+ const jobIdSet = new Set(cronJobIds);
272
+ const store = loadSessionStore(agentId);
273
+ return Object.entries(store)
274
+ .filter(([key]) => {
275
+ const jobId = extractCronJobId(key);
276
+ return jobId !== null && jobIdSet.has(jobId) && CRON_RUN_KEY_RE.test(key);
277
+ })
278
+ .map(([key, entry]) => {
279
+ const cronJobId = extractCronJobId(key) ?? "";
280
+ const cronName = entry.label?.replace(/^Cron:\s*/, "");
281
+ return {
282
+ sessionKey: key,
283
+ sessionId: entry.sessionId,
284
+ cronJobId,
285
+ cronName,
286
+ updatedAt: entry.updatedAt,
287
+ };
288
+ })
289
+ .sort((a, b) => (a.updatedAt ?? 0) - (b.updatedAt ?? 0)); // 时间正序
290
+ }
291
+ //# sourceMappingURL=cron-utils.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cron-utils.js","sourceRoot":"","sources":["../../../src/history/cron-utils.ts"],"names":[],"mappings":"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"}