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,287 @@
1
+ /**
2
+ * LightClaw — Session Reader
3
+ *
4
+ * 核心的历史消息读取逻辑,包含:
5
+ * - readSessionHistory() — 读取单个 session 的历史消息
6
+ * - readSessionHistoryTail() — 从文件末尾高效读取(大文件优化)
7
+ * - readCronHistory() — 读取指定 cron job 的全部运行历史
8
+ * - readSessionHistoryWithCron() — 【方案C核心】主会话 + cron 消息按时间线混合
9
+ * - listSessions() — 列出所有 session(含 cron 类型标识)
10
+ */
11
+ import fs from "node:fs";
12
+ import { resolveTranscriptPath } from "./session-store.js";
13
+ import { isSystemInjectedUserMessage, normalizeMessage } from "./message-parser.js";
14
+ import { listCronSessions, classifySessionKey, extractCronJobId, extractCronJobIdsFromTranscript, findCronSessionsByJobIds, } from "./cron-utils.js";
15
+ import { loadSessionStore } from "./session-store.js";
16
+ // ============================================================
17
+ // 核心读取:单个 Session
18
+ // ============================================================
19
+ /**
20
+ * 读取指定 sessionKey 的历史对话消息
21
+ *
22
+ * @param sessionKey - 会话标识(与 gateway.ts 中 route.sessionKey 一致)
23
+ * @param opts - 选项
24
+ * @returns 历史消息数组(按时间正序),如果找不到 session 返回空数组
25
+ */
26
+ export function readSessionHistory(sessionKey, opts) {
27
+ const limit = opts?.limit ?? 200;
28
+ const chatOnly = opts?.chatOnly ?? false;
29
+ const filePath = resolveTranscriptPath(sessionKey, opts?.agentId);
30
+ if (!filePath)
31
+ return [];
32
+ try {
33
+ const raw = fs.readFileSync(filePath, "utf-8");
34
+ return parseTranscriptLines(raw, { limit, chatOnly });
35
+ }
36
+ catch {
37
+ return [];
38
+ }
39
+ }
40
+ /**
41
+ * 读取指定 sessionKey 的历史消息(从文件末尾读取,大文件性能更好)
42
+ *
43
+ * 对于大文件(>maxBytes),不读取整个文件,而是从末尾读取指定字节数。
44
+ */
45
+ export function readSessionHistoryTail(sessionKey, opts) {
46
+ const limit = opts?.limit ?? 200;
47
+ const chatOnly = opts?.chatOnly ?? false;
48
+ const maxBytes = opts?.maxBytes ?? 1_048_576; // 默认 1MB
49
+ const filePath = resolveTranscriptPath(sessionKey, opts?.agentId);
50
+ if (!filePath)
51
+ return [];
52
+ let fd = null;
53
+ try {
54
+ fd = fs.openSync(filePath, "r");
55
+ const stat = fs.fstatSync(fd);
56
+ const size = stat.size;
57
+ if (size === 0)
58
+ return [];
59
+ // 小文件直接全量读取
60
+ if (size <= maxBytes) {
61
+ fs.closeSync(fd);
62
+ fd = null;
63
+ return readSessionHistory(sessionKey, opts);
64
+ }
65
+ // 大文件从末尾读取
66
+ const readStart = Math.max(0, size - maxBytes);
67
+ const readLen = Math.min(size, maxBytes);
68
+ const buf = Buffer.alloc(readLen);
69
+ fs.readSync(fd, buf, 0, readLen, readStart);
70
+ const chunk = buf.toString("utf-8");
71
+ const lines = chunk.split(/\r?\n/).filter((l) => l.trim());
72
+ // 跳过第一行(可能是不完整的行)
73
+ if (readStart > 0 && lines.length > 0) {
74
+ lines.shift();
75
+ }
76
+ return parseLines(lines, { limit, chatOnly });
77
+ }
78
+ catch {
79
+ return [];
80
+ }
81
+ finally {
82
+ if (fd !== null) {
83
+ try {
84
+ fs.closeSync(fd);
85
+ }
86
+ catch { /* ignore */ }
87
+ }
88
+ }
89
+ }
90
+ // ============================================================
91
+ // Cron 历史读取
92
+ // ============================================================
93
+ /**
94
+ * 读取指定 cron job 的所有运行历史(跨多个 run session)
95
+ *
96
+ * @param cronJobId - cron job UUID
97
+ * @param opts - 选项
98
+ * @returns 按时间正序排列的所有运行消息(仅 user + assistant)
99
+ */
100
+ export function readCronHistory(cronJobId, opts) {
101
+ const limit = opts?.limit ?? 200;
102
+ const cronSessions = listCronSessions(opts?.agentId)
103
+ .filter((s) => s.cronJobId === cronJobId)
104
+ .sort((a, b) => (a.updatedAt ?? 0) - (b.updatedAt ?? 0)); // 时间正序
105
+ const allMessages = [];
106
+ for (const cs of cronSessions) {
107
+ const messages = readSessionHistory(cs.sessionKey, {
108
+ ...opts,
109
+ limit: limit - allMessages.length,
110
+ chatOnly: true,
111
+ });
112
+ for (const msg of messages) {
113
+ // cron run 的 user 消息是系统自动生成的 prompt 模板,不是用户真实输入,跳过
114
+ if (msg.role === "user")
115
+ continue;
116
+ msg.cronInfo = {
117
+ jobId: cs.cronJobId,
118
+ name: cs.cronName,
119
+ runSessionId: cs.sessionId,
120
+ };
121
+ allMessages.push(msg);
122
+ }
123
+ if (allMessages.length >= limit)
124
+ break;
125
+ }
126
+ return allMessages.slice(-limit);
127
+ }
128
+ // ============================================================
129
+ // 核心:混合读取(基于显式关联)
130
+ // ============================================================
131
+ /**
132
+ * 读取主会话历史 + 关联的 cron 消息,按时间线合并
133
+ *
134
+ * 关联机制(精确关联,非遍历全量):
135
+ * 1. 读取主会话 JSONL → 解析消息 + 同时扫描 cron 工具调用结果
136
+ * 2. 从 cron toolResult 中提取 cron job IDs(显式关联)
137
+ * 3. 用这些 job IDs 到 sessions.json 中精确匹配 cron run sessions
138
+ * 4. 读取关联的 cron run sessions 的消息
139
+ * 5. 按时间窗口过滤 + 合并排序
140
+ *
141
+ * 相比旧方案(遍历所有 cron sessions + 时间窗口近似匹配),
142
+ * 新方案通过主会话中的 cron 工具调用记录建立了**显式关联关系**。
143
+ *
144
+ * @param sessionKey - 主会话标识
145
+ * @param opts - 选项(可控制是否包含 cron、筛选特定 cron job)
146
+ * @returns 按时间正序排列的合并消息
147
+ */
148
+ export function readSessionHistoryWithCron(sessionKey, opts) {
149
+ const limit = opts?.limit ?? 200;
150
+ const includeCron = opts?.includeCron ?? true;
151
+ // 1. 读取主会话消息
152
+ const mainMessages = readSessionHistory(sessionKey, opts);
153
+ if (!includeCron)
154
+ return mainMessages;
155
+ // 2. 从主会话 JSONL 中提取关联的 cron job IDs
156
+ // 这是关键——通过扫描主会话中 cron 工具调用的返回结果,
157
+ // 获取用户在这个会话中创建的所有 cron job 的 ID
158
+ const cronJobIds = opts?.cronJobIds ?? extractCronJobIdsFromTranscript(sessionKey, opts?.agentId);
159
+ if (cronJobIds.length === 0)
160
+ return mainMessages;
161
+ // 3. 用 cron job IDs 精确查找关联的 cron run sessions
162
+ // 不再遍历所有 cron sessions,只查找与主会话显式关联的
163
+ const cronSessions = findCronSessionsByJobIds(cronJobIds, opts?.agentId);
164
+ if (cronSessions.length === 0)
165
+ return mainMessages;
166
+ // 4. 确定时间窗口——只取主会话时间范围内的 cron 消息
167
+ const mainTimestamps = mainMessages
168
+ .map((m) => m.timestamp)
169
+ .filter((t) => t !== undefined);
170
+ const timeWindowStart = mainTimestamps.length > 0
171
+ ? Math.min(...mainTimestamps) - 60_000 // 往前延1分钟
172
+ : 0;
173
+ // 5. 读取 cron 消息(按时间窗口过滤)
174
+ const cronMessages = [];
175
+ const relevantSessions = cronSessions.filter((cs) => !cs.updatedAt || cs.updatedAt >= timeWindowStart);
176
+ for (const cs of relevantSessions) {
177
+ const msgs = readSessionHistory(cs.sessionKey, {
178
+ ...opts,
179
+ chatOnly: true,
180
+ limit: 50, // 每个 cron run 最多取 50 条
181
+ });
182
+ for (const msg of msgs) {
183
+ // 时间窗口过滤
184
+ if (msg.timestamp && msg.timestamp < timeWindowStart)
185
+ continue;
186
+ // cron run 的 user 消息是系统自动生成的 prompt 模板,不是用户真实输入,跳过
187
+ if (msg.role === "user")
188
+ continue;
189
+ msg.cronInfo = {
190
+ jobId: cs.cronJobId,
191
+ name: cs.cronName,
192
+ runSessionId: cs.sessionId,
193
+ };
194
+ cronMessages.push(msg);
195
+ }
196
+ }
197
+ if (cronMessages.length === 0)
198
+ return mainMessages;
199
+ // 6. 按时间合并
200
+ const merged = [...mainMessages, ...cronMessages]
201
+ .sort((a, b) => (a.timestamp ?? 0) - (b.timestamp ?? 0));
202
+ return merged.length > limit ? merged.slice(-limit) : merged;
203
+ }
204
+ // ============================================================
205
+ // Session 列表
206
+ // ============================================================
207
+ /**
208
+ * 列出所有已知的 session(从 sessions.json 索引读取)
209
+ *
210
+ * 增强:每个条目标识会话类型(direct / cron-base / cron-run)
211
+ */
212
+ export function listSessions(agentId) {
213
+ const store = loadSessionStore(agentId);
214
+ return Object.entries(store)
215
+ .filter(([, entry]) => entry && entry.sessionId)
216
+ .map(([key, entry]) => ({
217
+ sessionKey: key,
218
+ sessionId: entry.sessionId,
219
+ updatedAt: entry.updatedAt,
220
+ label: entry.label,
221
+ displayName: entry.displayName,
222
+ channel: entry.channel,
223
+ sessionType: classifySessionKey(key),
224
+ cronJobId: extractCronJobId(key) ?? undefined,
225
+ }))
226
+ .sort((a, b) => (b.updatedAt ?? 0) - (a.updatedAt ?? 0));
227
+ }
228
+ // ============================================================
229
+ // 内部工具函数
230
+ // ============================================================
231
+ /**
232
+ * 解析完整 transcript 文件内容
233
+ */
234
+ function parseTranscriptLines(raw, opts) {
235
+ const lines = raw.split(/\r?\n/).filter((l) => l.trim());
236
+ return parseLines(lines, opts);
237
+ }
238
+ /**
239
+ * 解析 JSONL 行数组为 HistoryMessage[]
240
+ */
241
+ function parseLines(lines, opts) {
242
+ const { limit, chatOnly } = opts;
243
+ const messages = [];
244
+ for (const line of lines) {
245
+ try {
246
+ const parsed = JSON.parse(line);
247
+ const lineType = parsed?.type;
248
+ // 非消息行:显式跳过已知的元数据行类型
249
+ if (lineType === "session" || lineType === "model_change"
250
+ || lineType === "thinking_level_change" || lineType === "custom") {
251
+ continue;
252
+ }
253
+ // compaction 标记
254
+ if (lineType === "compaction") {
255
+ if (!chatOnly) {
256
+ const ts = typeof parsed.timestamp === "string" ? Date.parse(parsed.timestamp) : undefined;
257
+ messages.push({
258
+ role: "system",
259
+ content: "── Context compacted ──",
260
+ timestamp: ts && Number.isFinite(ts) ? ts : Date.now(),
261
+ isCompaction: true,
262
+ });
263
+ }
264
+ continue;
265
+ }
266
+ // 标准消息行
267
+ const msg = parsed?.message;
268
+ if (!msg || typeof msg !== "object")
269
+ continue;
270
+ // 过滤传输层伪装为 user 的系统注入消息
271
+ if (isSystemInjectedUserMessage(msg))
272
+ continue;
273
+ const normalized = normalizeMessage(msg);
274
+ if (!normalized)
275
+ continue;
276
+ if (chatOnly && normalized.role !== "user" && normalized.role !== "assistant")
277
+ continue;
278
+ messages.push(normalized);
279
+ }
280
+ catch {
281
+ // 跳过格式错误的行
282
+ }
283
+ }
284
+ // 只返回最后 limit 条
285
+ return messages.length > limit ? messages.slice(-limit) : messages;
286
+ }
287
+ //# sourceMappingURL=session-reader.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"session-reader.js","sourceRoot":"","sources":["../../../src/history/session-reader.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,OAAO,EAAE,MAAM,SAAS,CAAC;AASzB,OAAO,EAAE,qBAAqB,EAAE,MAAM,oBAAoB,CAAC;AAC3D,OAAO,EAAE,2BAA2B,EAAE,gBAAgB,EAAE,MAAM,qBAAqB,CAAC;AACpF,OAAO,EACL,gBAAgB,EAChB,kBAAkB,EAClB,gBAAgB,EAChB,+BAA+B,EAC/B,wBAAwB,GACzB,MAAM,iBAAiB,CAAC;AACzB,OAAO,EAAE,gBAAgB,EAAE,MAAM,oBAAoB,CAAC;AAEtD,+DAA+D;AAC/D,kBAAkB;AAClB,+DAA+D;AAE/D;;;;;;GAMG;AACH,MAAM,UAAU,kBAAkB,CAAC,UAAkB,EAAE,IAAyB;IAC9E,MAAM,KAAK,GAAG,IAAI,EAAE,KAAK,IAAI,GAAG,CAAC;IACjC,MAAM,QAAQ,GAAG,IAAI,EAAE,QAAQ,IAAI,KAAK,CAAC;IAEzC,MAAM,QAAQ,GAAG,qBAAqB,CAAC,UAAU,EAAE,IAAI,EAAE,OAAO,CAAC,CAAC;IAClE,IAAI,CAAC,QAAQ;QAAE,OAAO,EAAE,CAAC;IAEzB,IAAI,CAAC;QACH,MAAM,GAAG,GAAG,EAAE,CAAC,YAAY,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;QAC/C,OAAO,oBAAoB,CAAC,GAAG,EAAE,EAAE,KAAK,EAAE,QAAQ,EAAE,CAAC,CAAC;IACxD,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,EAAE,CAAC;IACZ,CAAC;AACH,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,sBAAsB,CACpC,UAAkB,EAClB,IAA6B;IAE7B,MAAM,KAAK,GAAG,IAAI,EAAE,KAAK,IAAI,GAAG,CAAC;IACjC,MAAM,QAAQ,GAAG,IAAI,EAAE,QAAQ,IAAI,KAAK,CAAC;IACzC,MAAM,QAAQ,GAAG,IAAI,EAAE,QAAQ,IAAI,SAAS,CAAC,CAAC,SAAS;IAEvD,MAAM,QAAQ,GAAG,qBAAqB,CAAC,UAAU,EAAE,IAAI,EAAE,OAAO,CAAC,CAAC;IAClE,IAAI,CAAC,QAAQ;QAAE,OAAO,EAAE,CAAC;IAEzB,IAAI,EAAE,GAAkB,IAAI,CAAC;IAC7B,IAAI,CAAC;QACH,EAAE,GAAG,EAAE,CAAC,QAAQ,CAAC,QAAQ,EAAE,GAAG,CAAC,CAAC;QAChC,MAAM,IAAI,GAAG,EAAE,CAAC,SAAS,CAAC,EAAE,CAAC,CAAC;QAC9B,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC;QAEvB,IAAI,IAAI,KAAK,CAAC;YAAE,OAAO,EAAE,CAAC;QAE1B,YAAY;QACZ,IAAI,IAAI,IAAI,QAAQ,EAAE,CAAC;YACrB,EAAE,CAAC,SAAS,CAAC,EAAE,CAAC,CAAC;YACjB,EAAE,GAAG,IAAI,CAAC;YACV,OAAO,kBAAkB,CAAC,UAAU,EAAE,IAAI,CAAC,CAAC;QAC9C,CAAC;QAED,WAAW;QACX,MAAM,SAAS,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,GAAG,QAAQ,CAAC,CAAC;QAC/C,MAAM,OAAO,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAC;QACzC,MAAM,GAAG,GAAG,MAAM,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;QAClC,EAAE,CAAC,QAAQ,CAAC,EAAE,EAAE,GAAG,EAAE,CAAC,EAAE,OAAO,EAAE,SAAS,CAAC,CAAC;QAE5C,MAAM,KAAK,GAAG,GAAG,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC;QACpC,MAAM,KAAK,GAAG,KAAK,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC;QAE3D,kBAAkB;QAClB,IAAI,SAAS,GAAG,CAAC,IAAI,KAAK,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACtC,KAAK,CAAC,KAAK,EAAE,CAAC;QAChB,CAAC;QAED,OAAO,UAAU,CAAC,KAAK,EAAE,EAAE,KAAK,EAAE,QAAQ,EAAE,CAAC,CAAC;IAChD,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,EAAE,CAAC;IACZ,CAAC;YAAS,CAAC;QACT,IAAI,EAAE,KAAK,IAAI,EAAE,CAAC;YAChB,IAAI,CAAC;gBAAC,EAAE,CAAC,SAAS,CAAC,EAAE,CAAC,CAAC;YAAC,CAAC;YAAC,MAAM,CAAC,CAAC,YAAY,CAAC,CAAC;QAClD,CAAC;IACH,CAAC;AACH,CAAC;AAED,+DAA+D;AAC/D,YAAY;AACZ,+DAA+D;AAE/D;;;;;;GAMG;AACH,MAAM,UAAU,eAAe,CAC7B,SAAiB,EACjB,IAAyB;IAEzB,MAAM,KAAK,GAAG,IAAI,EAAE,KAAK,IAAI,GAAG,CAAC;IACjC,MAAM,YAAY,GAAG,gBAAgB,CAAC,IAAI,EAAE,OAAO,CAAC;SACjD,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,SAAS,KAAK,SAAS,CAAC;SACxC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,SAAS,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,SAAS,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO;IAEnE,MAAM,WAAW,GAAqB,EAAE,CAAC;IACzC,KAAK,MAAM,EAAE,IAAI,YAAY,EAAE,CAAC;QAC9B,MAAM,QAAQ,GAAG,kBAAkB,CAAC,EAAE,CAAC,UAAU,EAAE;YACjD,GAAG,IAAI;YACP,KAAK,EAAE,KAAK,GAAG,WAAW,CAAC,MAAM;YACjC,QAAQ,EAAE,IAAI;SACf,CAAC,CAAC;QACH,KAAK,MAAM,GAAG,IAAI,QAAQ,EAAE,CAAC;YAC3B,mDAAmD;YACnD,IAAI,GAAG,CAAC,IAAI,KAAK,MAAM;gBAAE,SAAS;YAElC,GAAG,CAAC,QAAQ,GAAG;gBACb,KAAK,EAAE,EAAE,CAAC,SAAS;gBACnB,IAAI,EAAE,EAAE,CAAC,QAAQ;gBACjB,YAAY,EAAE,EAAE,CAAC,SAAS;aAC3B,CAAC;YACF,WAAW,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QACxB,CAAC;QACD,IAAI,WAAW,CAAC,MAAM,IAAI,KAAK;YAAE,MAAM;IACzC,CAAC;IAED,OAAO,WAAW,CAAC,KAAK,CAAC,CAAC,KAAK,CAAC,CAAC;AACnC,CAAC;AAED,+DAA+D;AAC/D,kBAAkB;AAClB,+DAA+D;AAE/D;;;;;;;;;;;;;;;;GAgBG;AACH,MAAM,UAAU,0BAA0B,CACxC,UAAkB,EAClB,IAAiC;IAEjC,MAAM,KAAK,GAAG,IAAI,EAAE,KAAK,IAAI,GAAG,CAAC;IACjC,MAAM,WAAW,GAAG,IAAI,EAAE,WAAW,IAAI,IAAI,CAAC;IAE9C,aAAa;IACb,MAAM,YAAY,GAAG,kBAAkB,CAAC,UAAU,EAAE,IAAI,CAAC,CAAC;IAE1D,IAAI,CAAC,WAAW;QAAE,OAAO,YAAY,CAAC;IAEtC,oCAAoC;IACpC,oCAAoC;IACpC,mCAAmC;IACnC,MAAM,UAAU,GAAG,IAAI,EAAE,UAAU,IAAI,+BAA+B,CAAC,UAAU,EAAE,IAAI,EAAE,OAAO,CAAC,CAAC;IAElG,IAAI,UAAU,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,YAAY,CAAC;IAEjD,8CAA8C;IAC9C,uCAAuC;IACvC,MAAM,YAAY,GAAG,wBAAwB,CAAC,UAAU,EAAE,IAAI,EAAE,OAAO,CAAC,CAAC;IAEzE,IAAI,YAAY,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,YAAY,CAAC;IAEnD,iCAAiC;IACjC,MAAM,cAAc,GAAG,YAAY;SAChC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC;SACvB,MAAM,CAAC,CAAC,CAAC,EAAe,EAAE,CAAC,CAAC,KAAK,SAAS,CAAC,CAAC;IAC/C,MAAM,eAAe,GAAG,cAAc,CAAC,MAAM,GAAG,CAAC;QAC/C,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,cAAc,CAAC,GAAG,MAAM,CAAC,SAAS;QAChD,CAAC,CAAC,CAAC,CAAC;IAEN,yBAAyB;IACzB,MAAM,YAAY,GAAqB,EAAE,CAAC;IAC1C,MAAM,gBAAgB,GAAG,YAAY,CAAC,MAAM,CAC1C,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC,EAAE,CAAC,SAAS,IAAI,EAAE,CAAC,SAAS,IAAI,eAAe,CACzD,CAAC;IAEF,KAAK,MAAM,EAAE,IAAI,gBAAgB,EAAE,CAAC;QAClC,MAAM,IAAI,GAAG,kBAAkB,CAAC,EAAE,CAAC,UAAU,EAAE;YAC7C,GAAG,IAAI;YACP,QAAQ,EAAE,IAAI;YACd,KAAK,EAAE,EAAE,EAAE,uBAAuB;SACnC,CAAC,CAAC;QACH,KAAK,MAAM,GAAG,IAAI,IAAI,EAAE,CAAC;YACvB,SAAS;YACT,IAAI,GAAG,CAAC,SAAS,IAAI,GAAG,CAAC,SAAS,GAAG,eAAe;gBAAE,SAAS;YAE/D,mDAAmD;YACnD,IAAI,GAAG,CAAC,IAAI,KAAK,MAAM;gBAAE,SAAS;YAElC,GAAG,CAAC,QAAQ,GAAG;gBACb,KAAK,EAAE,EAAE,CAAC,SAAS;gBACnB,IAAI,EAAE,EAAE,CAAC,QAAQ;gBACjB,YAAY,EAAE,EAAE,CAAC,SAAS;aAC3B,CAAC;YACF,YAAY,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QACzB,CAAC;IACH,CAAC;IAED,IAAI,YAAY,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,YAAY,CAAC;IAEnD,WAAW;IACX,MAAM,MAAM,GAAG,CAAC,GAAG,YAAY,EAAE,GAAG,YAAY,CAAC;SAC9C,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,SAAS,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,SAAS,IAAI,CAAC,CAAC,CAAC,CAAC;IAE3D,OAAO,MAAM,CAAC,MAAM,GAAG,KAAK,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC;AAC/D,CAAC;AAED,+DAA+D;AAC/D,aAAa;AACb,+DAA+D;AAE/D;;;;GAIG;AACH,MAAM,UAAU,YAAY,CAAC,OAAgB;IAC3C,MAAM,KAAK,GAAG,gBAAgB,CAAC,OAAO,CAAC,CAAC;IACxC,OAAO,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC;SACzB,MAAM,CAAC,CAAC,CAAC,EAAE,KAAK,CAAC,EAAE,EAAE,CAAC,KAAK,IAAI,KAAK,CAAC,SAAS,CAAC;SAC/C,GAAG,CAAC,CAAC,CAAC,GAAG,EAAE,KAAK,CAAC,EAAE,EAAE,CAAC,CAAC;QACtB,UAAU,EAAE,GAAG;QACf,SAAS,EAAE,KAAK,CAAC,SAAS;QAC1B,SAAS,EAAE,KAAK,CAAC,SAAS;QAC1B,KAAK,EAAE,KAAK,CAAC,KAAK;QAClB,WAAW,EAAE,KAAK,CAAC,WAAW;QAC9B,OAAO,EAAE,KAAK,CAAC,OAAO;QACtB,WAAW,EAAE,kBAAkB,CAAC,GAAG,CAAC;QACpC,SAAS,EAAE,gBAAgB,CAAC,GAAG,CAAC,IAAI,SAAS;KAC9C,CAAC,CAAC;SACF,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,SAAS,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,SAAS,IAAI,CAAC,CAAC,CAAC,CAAC;AAC7D,CAAC;AAED,+DAA+D;AAC/D,SAAS;AACT,+DAA+D;AAE/D;;GAEG;AACH,SAAS,oBAAoB,CAC3B,GAAW,EACX,IAA0C;IAE1C,MAAM,KAAK,GAAG,GAAG,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC;IACzD,OAAO,UAAU,CAAC,KAAK,EAAE,IAAI,CAAC,CAAC;AACjC,CAAC;AAED;;GAEG;AACH,SAAS,UAAU,CACjB,KAAe,EACf,IAA0C;IAE1C,MAAM,EAAE,KAAK,EAAE,QAAQ,EAAE,GAAG,IAAI,CAAC;IACjC,MAAM,QAAQ,GAAqB,EAAE,CAAC;IAEtC,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;QACzB,IAAI,CAAC;YACH,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;YAChC,MAAM,QAAQ,GAAG,MAAM,EAAE,IAAI,CAAC;YAE9B,qBAAqB;YACrB,IAAI,QAAQ,KAAK,SAAS,IAAI,QAAQ,KAAK,cAAc;mBACpD,QAAQ,KAAK,uBAAuB,IAAI,QAAQ,KAAK,QAAQ,EAAE,CAAC;gBACnE,SAAS;YACX,CAAC;YAED,gBAAgB;YAChB,IAAI,QAAQ,KAAK,YAAY,EAAE,CAAC;gBAC9B,IAAI,CAAC,QAAQ,EAAE,CAAC;oBACd,MAAM,EAAE,GAAG,OAAO,MAAM,CAAC,SAAS,KAAK,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;oBAC3F,QAAQ,CAAC,IAAI,CAAC;wBACZ,IAAI,EAAE,QAAQ;wBACd,OAAO,EAAE,yBAAyB;wBAClC,SAAS,EAAE,EAAE,IAAI,MAAM,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,EAAE;wBACtD,YAAY,EAAE,IAAI;qBACnB,CAAC,CAAC;gBACL,CAAC;gBACD,SAAS;YACX,CAAC;YAED,QAAQ;YACR,MAAM,GAAG,GAAG,MAAM,EAAE,OAAO,CAAC;YAC5B,IAAI,CAAC,GAAG,IAAI,OAAO,GAAG,KAAK,QAAQ;gBAAE,SAAS;YAE9C,wBAAwB;YACxB,IAAI,2BAA2B,CAAC,GAA8B,CAAC;gBAAE,SAAS;YAE1E,MAAM,UAAU,GAAG,gBAAgB,CAAC,GAA8B,CAAC,CAAC;YACpE,IAAI,CAAC,UAAU;gBAAE,SAAS;YAE1B,IAAI,QAAQ,IAAI,UAAU,CAAC,IAAI,KAAK,MAAM,IAAI,UAAU,CAAC,IAAI,KAAK,WAAW;gBAAE,SAAS;YAExF,QAAQ,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;QAC5B,CAAC;QAAC,MAAM,CAAC;YACP,WAAW;QACb,CAAC;IACH,CAAC;IAED,gBAAgB;IAChB,OAAO,QAAQ,CAAC,MAAM,GAAG,KAAK,CAAC,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC;AACrE,CAAC"}
@@ -0,0 +1,38 @@
1
+ /**
2
+ * LightClaw — Session Store
3
+ *
4
+ * 封装 OpenClaw sessions.json 索引的读取和路径解析逻辑。
5
+ * 所有 session 文件的定位都通过此模块完成。
6
+ *
7
+ * 路径解析策略(多层回退):
8
+ * 1. entry.sessionFile(精确路径 / 相对路径)
9
+ * 2. OPENCLAW_HOME/agents/<agentId>/sessions/<sessionId>.jsonl(标准目录)
10
+ * 3. sessions.json 同级目录下的 <sessionId>.jsonl(离线分析场景,
11
+ * 如把远程服务器的 session 文件下载到本地)
12
+ */
13
+ import type { SessionStoreEntry } from "./types.js";
14
+ /** 获取 OpenClaw 数据目录 */
15
+ export declare function resolveOpenClawHome(): string;
16
+ /**
17
+ * 解析 agentId 对应的 sessions 目录
18
+ * 默认 agentId 为 "main"(与 OpenClaw DEFAULT_AGENT_ID 一致)
19
+ */
20
+ export declare function resolveSessionsDir(agentId?: string): string;
21
+ /**
22
+ * 加载 sessions.json 索引,获取 sessionKey → sessionEntry 映射
23
+ */
24
+ export declare function loadSessionStore(agentId?: string): Record<string, SessionStoreEntry>;
25
+ /**
26
+ * 获取 sessions.json 所在目录(用于第3层路径回退)
27
+ */
28
+ export declare function getStoreDir(): string | null;
29
+ /**
30
+ * 根据 sessionKey 找到对应的 .jsonl transcript 文件路径
31
+ *
32
+ * 路径解析优先级:
33
+ * 1. entry.sessionFile — 绝对路径 / 相对于 sessionsDir 的路径
34
+ * 2. sessionsDir/<sessionId>.jsonl — 标准 OPENCLAW_HOME 目录
35
+ * 3. storeDir/<sessionId>.jsonl — sessions.json 同级目录(离线分析场景)
36
+ */
37
+ export declare function resolveTranscriptPath(sessionKey: string, agentId?: string): string | null;
38
+ //# sourceMappingURL=session-store.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"session-store.d.ts","sourceRoot":"","sources":["../../../src/history/session-store.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAMH,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,YAAY,CAAC;AASpD,uBAAuB;AACvB,wBAAgB,mBAAmB,IAAI,MAAM,CAE5C;AAED;;;GAGG;AACH,wBAAgB,kBAAkB,CAAC,OAAO,CAAC,EAAE,MAAM,GAAG,MAAM,CAI3D;AAcD;;GAEG;AACH,wBAAgB,gBAAgB,CAAC,OAAO,CAAC,EAAE,MAAM,GAAG,MAAM,CAAC,MAAM,EAAE,iBAAiB,CAAC,CAgBpF;AAiBD;;GAEG;AACH,wBAAgB,WAAW,IAAI,MAAM,GAAG,IAAI,CAE3C;AAMD;;;;;;;GAOG;AACH,wBAAgB,qBAAqB,CAAC,UAAU,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAoCzF"}
@@ -0,0 +1,131 @@
1
+ /**
2
+ * LightClaw — Session Store
3
+ *
4
+ * 封装 OpenClaw sessions.json 索引的读取和路径解析逻辑。
5
+ * 所有 session 文件的定位都通过此模块完成。
6
+ *
7
+ * 路径解析策略(多层回退):
8
+ * 1. entry.sessionFile(精确路径 / 相对路径)
9
+ * 2. OPENCLAW_HOME/agents/<agentId>/sessions/<sessionId>.jsonl(标准目录)
10
+ * 3. sessions.json 同级目录下的 <sessionId>.jsonl(离线分析场景,
11
+ * 如把远程服务器的 session 文件下载到本地)
12
+ */
13
+ import fs from "node:fs";
14
+ import os from "node:os";
15
+ import path from "node:path";
16
+ // 获取当前文件的目录
17
+ // const currentDir = path.dirname(import.meta.url);
18
+ // ============================================================
19
+ // 路径解析
20
+ // ============================================================
21
+ /** 获取 OpenClaw 数据目录 */
22
+ export function resolveOpenClawHome() {
23
+ return process.env.OPENCLAW_HOME || path.join(os.homedir(), ".openclaw");
24
+ }
25
+ /**
26
+ * 解析 agentId 对应的 sessions 目录
27
+ * 默认 agentId 为 "main"(与 OpenClaw DEFAULT_AGENT_ID 一致)
28
+ */
29
+ export function resolveSessionsDir(agentId) {
30
+ const home = resolveOpenClawHome();
31
+ const id = agentId?.trim() || "main";
32
+ return path.join(home, "agents", id, "sessions");
33
+ }
34
+ // ============================================================
35
+ // Session Store 加载
36
+ // ============================================================
37
+ /**
38
+ * sessions.json 的实际磁盘路径(加载成功后缓存)
39
+ *
40
+ * 用于第3层回退:当标准目录下找不到 .jsonl 文件时,
41
+ * 尝试在 sessions.json 所在目录查找(离线 / 下载到本地场景)。
42
+ */
43
+ let _lastStoreFilePath = null;
44
+ /**
45
+ * 加载 sessions.json 索引,获取 sessionKey → sessionEntry 映射
46
+ */
47
+ export function loadSessionStore(agentId) {
48
+ const storePath = path.join(resolveSessionsDir(agentId), "sessions.json");
49
+ // const storePath = path.join(currentDir, "../../sessions/sessions.json").replace("file:", "");
50
+ const loaded = _tryLoadStore(storePath);
51
+ if (loaded)
52
+ return loaded;
53
+ // 标准路径失败 → 尝试从 OPENCLAW_HOME 根下直接查找 sessions.json
54
+ // (兼容平铺结构)
55
+ const home = resolveOpenClawHome();
56
+ const rootStorePath = path.join(home, "sessions", "sessions.json");
57
+ if (rootStorePath !== storePath) {
58
+ const rootLoaded = _tryLoadStore(rootStorePath);
59
+ if (rootLoaded)
60
+ return rootLoaded;
61
+ }
62
+ return {};
63
+ }
64
+ function _tryLoadStore(storePath) {
65
+ try {
66
+ const raw = fs.readFileSync(storePath, "utf-8");
67
+ if (!raw.trim())
68
+ return null;
69
+ const parsed = JSON.parse(raw);
70
+ if (parsed && typeof parsed === "object" && !Array.isArray(parsed)) {
71
+ _lastStoreFilePath = storePath;
72
+ return parsed;
73
+ }
74
+ }
75
+ catch {
76
+ // 文件不存在或解析失败
77
+ }
78
+ return null;
79
+ }
80
+ /**
81
+ * 获取 sessions.json 所在目录(用于第3层路径回退)
82
+ */
83
+ export function getStoreDir() {
84
+ return _lastStoreFilePath ? path.dirname(_lastStoreFilePath) : null;
85
+ }
86
+ // ============================================================
87
+ // Transcript 文件路径解析
88
+ // ============================================================
89
+ /**
90
+ * 根据 sessionKey 找到对应的 .jsonl transcript 文件路径
91
+ *
92
+ * 路径解析优先级:
93
+ * 1. entry.sessionFile — 绝对路径 / 相对于 sessionsDir 的路径
94
+ * 2. sessionsDir/<sessionId>.jsonl — 标准 OPENCLAW_HOME 目录
95
+ * 3. storeDir/<sessionId>.jsonl — sessions.json 同级目录(离线分析场景)
96
+ */
97
+ export function resolveTranscriptPath(sessionKey, agentId) {
98
+ const store = loadSessionStore(agentId);
99
+ const normalizedKey = sessionKey.trim().toLowerCase();
100
+ // 尝试精确匹配和 case-insensitive 匹配
101
+ const entry = store[sessionKey]
102
+ ?? store[normalizedKey]
103
+ ?? Object.entries(store).find(([k]) => k.toLowerCase() === normalizedKey)?.[1];
104
+ if (!entry?.sessionId)
105
+ return null;
106
+ const sessionsDir = resolveSessionsDir(agentId);
107
+ const jsonlFileName = `${entry.sessionId}.jsonl`;
108
+ // 第1层:使用 entry.sessionFile(精确路径)
109
+ if (entry.sessionFile) {
110
+ const sessionFilePath = path.isAbsolute(entry.sessionFile)
111
+ ? entry.sessionFile
112
+ : path.join(sessionsDir, entry.sessionFile);
113
+ if (fs.existsSync(sessionFilePath))
114
+ return sessionFilePath;
115
+ // sessionFile 是远程服务器的绝对路径,在本地不存在 → 继续回退
116
+ }
117
+ // 第2层:标准目录 <sessionsDir>/<sessionId>.jsonl
118
+ const defaultPath = path.join(sessionsDir, jsonlFileName);
119
+ if (fs.existsSync(defaultPath))
120
+ return defaultPath;
121
+ // 第3层:sessions.json 同级目录下查找
122
+ // 适用场景:用户将远程 session 文件下载到本地平铺目录
123
+ const storeDir = getStoreDir();
124
+ if (storeDir && storeDir !== sessionsDir) {
125
+ const siblingPath = path.join(storeDir, jsonlFileName);
126
+ if (fs.existsSync(siblingPath))
127
+ return siblingPath;
128
+ }
129
+ return null;
130
+ }
131
+ //# sourceMappingURL=session-store.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"session-store.js","sourceRoot":"","sources":["../../../src/history/session-store.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,41 @@
1
+ /**
2
+ * LightClaw — Text Processing
3
+ *
4
+ * 封装传输层元数据剥离和文件附件信息提取逻辑。
5
+ * 用于将 OpenClaw 注入的传输层前缀/后缀从用户消息中清除,
6
+ * 以及从原始消息文本中提取文件附件信息。
7
+ */
8
+ import type { FileAttachmentInfo } from "./types.js";
9
+ /**
10
+ * 剥离 OpenClaw 传输层注入到用户消息中的元数据前缀,提取用户真正的输入。
11
+ *
12
+ * 采用 **双层策略** 以通用应对不断变化的注入格式:
13
+ *
14
+ * **第一层 — 锚点截断(优先):**
15
+ * OpenClaw 注入的元数据遵循固定尾部结构:最后一个 `Xxx (untrusted metadata):` 块
16
+ * 之后即为用户真正输入。找到该锚点并截断,天然兼容前方任意 operator 前缀。
17
+ *
18
+ * **第二层 — 逐条正则剥离(后备):**
19
+ * 当消息中不含 `(untrusted metadata)` 锚点时(如纯系统消息),回退到模式匹配。
20
+ */
21
+ export declare function stripTransportMetadata(text: string): string;
22
+ /**
23
+ * 剥离残留的传输层元数据片段。
24
+ *
25
+ * 用于:
26
+ * 1. 锚点截断后的残余清理
27
+ * 2. 不含 untrusted metadata 的消息的后备剥离
28
+ */
29
+ export declare function stripResidualMetadata(text: string): string;
30
+ /**
31
+ * 从用户消息文本中提取文件附件信息。
32
+ *
33
+ * 匹配 "用户发送了文件: xxx.png (3.0KB)" 格式。
34
+ * 以及 [media attached: .../name---uuid.ext (mime/type) | file://...] 格式。
35
+ */
36
+ export declare function extractFileAttachments(text: string): FileAttachmentInfo[];
37
+ /**
38
+ * 文件去重(按文件名)
39
+ */
40
+ export declare function deduplicateFiles(files: FileAttachmentInfo[]): FileAttachmentInfo[];
41
+ //# sourceMappingURL=text-processing.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"text-processing.d.ts","sourceRoot":"","sources":["../../../src/history/text-processing.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,YAAY,CAAC;AAMrD;;;;;;;;;;;GAWG;AACH,wBAAgB,sBAAsB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAsB3D;AAED;;;;;;GAMG;AACH,wBAAgB,qBAAqB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAuC1D;AAMD;;;;;GAKG;AACH,wBAAgB,sBAAsB,CAAC,IAAI,EAAE,MAAM,GAAG,kBAAkB,EAAE,CA2BzE;AAED;;GAEG;AACH,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,kBAAkB,EAAE,GAAG,kBAAkB,EAAE,CAalF"}
@@ -0,0 +1,130 @@
1
+ /**
2
+ * LightClaw — Text Processing
3
+ *
4
+ * 封装传输层元数据剥离和文件附件信息提取逻辑。
5
+ * 用于将 OpenClaw 注入的传输层前缀/后缀从用户消息中清除,
6
+ * 以及从原始消息文本中提取文件附件信息。
7
+ */
8
+ // ============================================================
9
+ // 传输元数据剥离
10
+ // ============================================================
11
+ /**
12
+ * 剥离 OpenClaw 传输层注入到用户消息中的元数据前缀,提取用户真正的输入。
13
+ *
14
+ * 采用 **双层策略** 以通用应对不断变化的注入格式:
15
+ *
16
+ * **第一层 — 锚点截断(优先):**
17
+ * OpenClaw 注入的元数据遵循固定尾部结构:最后一个 `Xxx (untrusted metadata):` 块
18
+ * 之后即为用户真正输入。找到该锚点并截断,天然兼容前方任意 operator 前缀。
19
+ *
20
+ * **第二层 — 逐条正则剥离(后备):**
21
+ * 当消息中不含 `(untrusted metadata)` 锚点时(如纯系统消息),回退到模式匹配。
22
+ */
23
+ export function stripTransportMetadata(text) {
24
+ if (!text)
25
+ return text;
26
+ // ── 第一层:锚点截断 ──
27
+ const hasUntrustedMeta = text.includes("(untrusted metadata)");
28
+ if (hasUntrustedMeta) {
29
+ const metaBlockRe = /\w[\w ]*\(untrusted metadata\):\s*```json\s*\{[^}]*\}\s*```/gs;
30
+ let lastEnd = -1;
31
+ let m;
32
+ while ((m = metaBlockRe.exec(text)) !== null) {
33
+ lastEnd = m.index + m[0].length;
34
+ }
35
+ if (lastEnd > 0 && lastEnd < text.length) {
36
+ const userPart = text.slice(lastEnd).replace(/^\s+/, "");
37
+ if (userPart) {
38
+ return stripResidualMetadata(userPart);
39
+ }
40
+ }
41
+ }
42
+ // ── 第二层(后备):逐条正则剥离 ──
43
+ return stripResidualMetadata(text);
44
+ }
45
+ /**
46
+ * 剥离残留的传输层元数据片段。
47
+ *
48
+ * 用于:
49
+ * 1. 锚点截断后的残余清理
50
+ * 2. 不含 untrusted metadata 的消息的后备剥离
51
+ */
52
+ export function stripResidualMetadata(text) {
53
+ if (!text)
54
+ return text;
55
+ let result = text;
56
+ // 移除 [media attached: ...] 行
57
+ result = result.replace(/^\[media attached:.*?\]\s*$/gm, "");
58
+ // 移除 "To send an image back, ..." 指令块
59
+ result = result.replace(/^To send an image back,.*?(?:Keep caption in the text body\.)\s*/gms, "");
60
+ // 移除 Xxx (untrusted metadata): ```json ... ``` 块
61
+ result = result.replace(/^\w[\w ]*\(untrusted metadata\):\s*```json\s*\{[^}]*\}\s*```\s*/gms, "");
62
+ // 移除 Xxx (operator configured): 后跟编号列表的块
63
+ result = result.replace(/^\w[\w ]*\(operator configured\):[\s\S]*?(?=\n\n(?![ \t]*\d+\.)|\n*$)/gm, "");
64
+ // 移除 HEARTBEAT_OK 行
65
+ result = result.replace(/^HEARTBEAT_OK\s*$/gm, "");
66
+ // 移除 System: [...] 异步任务完成回调通知行
67
+ result = result.replace(/^System:\s*\[.*?\].*$/gm, "");
68
+ // 移除内联 <file ...>...</file> 标签及其内容
69
+ result = result.replace(/<file\b[^>]*>.*?<\/file>/gs, "");
70
+ // 移除 "用户发送了文件: filename (size)" 描述文本
71
+ result = result.replace(/用户发送了文件:\s*.+?\s*\([^)]+\)\s*/g, "");
72
+ return result.trim();
73
+ }
74
+ // ============================================================
75
+ // 文件附件提取
76
+ // ============================================================
77
+ /**
78
+ * 从用户消息文本中提取文件附件信息。
79
+ *
80
+ * 匹配 "用户发送了文件: xxx.png (3.0KB)" 格式。
81
+ * 以及 [media attached: .../name---uuid.ext (mime/type) | file://...] 格式。
82
+ */
83
+ export function extractFileAttachments(text) {
84
+ const files = [];
85
+ // 从 "用户发送了文件: filename (size)" 提取
86
+ const userFileRe = /用户发送了文件:\s*(.+?)\s*\(([^)]+)\)/g;
87
+ let match;
88
+ while ((match = userFileRe.exec(text)) !== null) {
89
+ files.push({ name: match[1], size: match[2] });
90
+ }
91
+ // 从 [media attached: ...] 提取 MIME 和 URI
92
+ const mediaRe = /\[media attached:\s*\S+\s*\(([^)]+)\)\s*\|\s*(\S+)\s*\]/g;
93
+ let mediaIdx = 0;
94
+ while ((match = mediaRe.exec(text)) !== null) {
95
+ const mimeType = match[1];
96
+ const uri = match[2];
97
+ if (mediaIdx < files.length) {
98
+ files[mediaIdx].mimeType = mimeType;
99
+ files[mediaIdx].uri = uri;
100
+ }
101
+ else {
102
+ const uriFileName = uri.split("/").pop()?.replace(/---[0-9a-f-]+\./, ".") || "file";
103
+ files.push({ name: uriFileName, mimeType, uri });
104
+ }
105
+ mediaIdx++;
106
+ }
107
+ return files;
108
+ }
109
+ /**
110
+ * 文件去重(按文件名)
111
+ */
112
+ export function deduplicateFiles(files) {
113
+ const seen = new Map();
114
+ for (const f of files) {
115
+ const existing = seen.get(f.name);
116
+ if (existing) {
117
+ if (!existing.mimeType && f.mimeType)
118
+ existing.mimeType = f.mimeType;
119
+ if (!existing.size && f.size)
120
+ existing.size = f.size;
121
+ if (!existing.uri && f.uri)
122
+ existing.uri = f.uri;
123
+ }
124
+ else {
125
+ seen.set(f.name, { ...f });
126
+ }
127
+ }
128
+ return [...seen.values()];
129
+ }
130
+ //# sourceMappingURL=text-processing.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"text-processing.js","sourceRoot":"","sources":["../../../src/history/text-processing.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAIH,+DAA+D;AAC/D,UAAU;AACV,+DAA+D;AAE/D;;;;;;;;;;;GAWG;AACH,MAAM,UAAU,sBAAsB,CAAC,IAAY;IACjD,IAAI,CAAC,IAAI;QAAE,OAAO,IAAI,CAAC;IAEvB,iBAAiB;IACjB,MAAM,gBAAgB,GAAG,IAAI,CAAC,QAAQ,CAAC,sBAAsB,CAAC,CAAC;IAC/D,IAAI,gBAAgB,EAAE,CAAC;QACrB,MAAM,WAAW,GAAG,+DAA+D,CAAC;QACpF,IAAI,OAAO,GAAG,CAAC,CAAC,CAAC;QACjB,IAAI,CAAyB,CAAC;QAC9B,OAAO,CAAC,CAAC,GAAG,WAAW,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,KAAK,IAAI,EAAE,CAAC;YAC7C,OAAO,GAAG,CAAC,CAAC,KAAK,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC;QAClC,CAAC;QACD,IAAI,OAAO,GAAG,CAAC,IAAI,OAAO,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC;YACzC,MAAM,QAAQ,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC;YACzD,IAAI,QAAQ,EAAE,CAAC;gBACb,OAAO,qBAAqB,CAAC,QAAQ,CAAC,CAAC;YACzC,CAAC;QACH,CAAC;IACH,CAAC;IAED,uBAAuB;IACvB,OAAO,qBAAqB,CAAC,IAAI,CAAC,CAAC;AACrC,CAAC;AAED;;;;;;GAMG;AACH,MAAM,UAAU,qBAAqB,CAAC,IAAY;IAChD,IAAI,CAAC,IAAI;QAAE,OAAO,IAAI,CAAC;IAEvB,IAAI,MAAM,GAAG,IAAI,CAAC;IAElB,6BAA6B;IAC7B,MAAM,GAAG,MAAM,CAAC,OAAO,CAAC,+BAA+B,EAAE,EAAE,CAAC,CAAC;IAE7D,sCAAsC;IACtC,MAAM,GAAG,MAAM,CAAC,OAAO,CACrB,qEAAqE,EACrE,EAAE,CACH,CAAC;IAEF,iDAAiD;IACjD,MAAM,GAAG,MAAM,CAAC,OAAO,CACrB,oEAAoE,EACpE,EAAE,CACH,CAAC;IAEF,yCAAyC;IACzC,MAAM,GAAG,MAAM,CAAC,OAAO,CACrB,yEAAyE,EACzE,EAAE,CACH,CAAC;IAEF,oBAAoB;IACpB,MAAM,GAAG,MAAM,CAAC,OAAO,CAAC,qBAAqB,EAAE,EAAE,CAAC,CAAC;IAEnD,+BAA+B;IAC/B,MAAM,GAAG,MAAM,CAAC,OAAO,CAAC,yBAAyB,EAAE,EAAE,CAAC,CAAC;IAEvD,mCAAmC;IACnC,MAAM,GAAG,MAAM,CAAC,OAAO,CAAC,4BAA4B,EAAE,EAAE,CAAC,CAAC;IAE1D,qCAAqC;IACrC,MAAM,GAAG,MAAM,CAAC,OAAO,CAAC,gCAAgC,EAAE,EAAE,CAAC,CAAC;IAE9D,OAAO,MAAM,CAAC,IAAI,EAAE,CAAC;AACvB,CAAC;AAED,+DAA+D;AAC/D,SAAS;AACT,+DAA+D;AAE/D;;;;;GAKG;AACH,MAAM,UAAU,sBAAsB,CAAC,IAAY;IACjD,MAAM,KAAK,GAAyB,EAAE,CAAC;IAEvC,kCAAkC;IAClC,MAAM,UAAU,GAAG,iCAAiC,CAAC;IACrD,IAAI,KAA6B,CAAC;IAClC,OAAO,CAAC,KAAK,GAAG,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,KAAK,IAAI,EAAE,CAAC;QAChD,KAAK,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,KAAK,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;IACjD,CAAC;IAED,wCAAwC;IACxC,MAAM,OAAO,GAAG,0DAA0D,CAAC;IAC3E,IAAI,QAAQ,GAAG,CAAC,CAAC;IACjB,OAAO,CAAC,KAAK,GAAG,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,KAAK,IAAI,EAAE,CAAC;QAC7C,MAAM,QAAQ,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC;QAC1B,MAAM,GAAG,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC;QACrB,IAAI,QAAQ,GAAG,KAAK,CAAC,MAAM,EAAE,CAAC;YAC5B,KAAK,CAAC,QAAQ,CAAC,CAAC,QAAQ,GAAG,QAAQ,CAAC;YACpC,KAAK,CAAC,QAAQ,CAAC,CAAC,GAAG,GAAG,GAAG,CAAC;QAC5B,CAAC;aAAM,CAAC;YACN,MAAM,WAAW,GAAG,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,OAAO,CAAC,iBAAiB,EAAE,GAAG,CAAC,IAAI,MAAM,CAAC;YACpF,KAAK,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,WAAW,EAAE,QAAQ,EAAE,GAAG,EAAE,CAAC,CAAC;QACnD,CAAC;QACD,QAAQ,EAAE,CAAC;IACb,CAAC;IAED,OAAO,KAAK,CAAC;AACf,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,gBAAgB,CAAC,KAA2B;IAC1D,MAAM,IAAI,GAAG,IAAI,GAAG,EAA8B,CAAC;IACnD,KAAK,MAAM,CAAC,IAAI,KAAK,EAAE,CAAC;QACtB,MAAM,QAAQ,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;QAClC,IAAI,QAAQ,EAAE,CAAC;YACb,IAAI,CAAC,QAAQ,CAAC,QAAQ,IAAI,CAAC,CAAC,QAAQ;gBAAE,QAAQ,CAAC,QAAQ,GAAG,CAAC,CAAC,QAAQ,CAAC;YACrE,IAAI,CAAC,QAAQ,CAAC,IAAI,IAAI,CAAC,CAAC,IAAI;gBAAE,QAAQ,CAAC,IAAI,GAAG,CAAC,CAAC,IAAI,CAAC;YACrD,IAAI,CAAC,QAAQ,CAAC,GAAG,IAAI,CAAC,CAAC,GAAG;gBAAE,QAAQ,CAAC,GAAG,GAAG,CAAC,CAAC,GAAG,CAAC;QACnD,CAAC;aAAM,CAAC;YACN,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,EAAE,EAAE,GAAG,CAAC,EAAE,CAAC,CAAC;QAC7B,CAAC;IACH,CAAC;IACD,OAAO,CAAC,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC,CAAC;AAC5B,CAAC"}