httpcat-cli 0.3.0 → 0.3.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 (322) hide show
  1. package/.github/workflows/ci.yml +3 -0
  2. package/.github/workflows/rc-publish.yml +6 -0
  3. package/.github/workflows/release.yml +102 -0
  4. package/.github/workflows/sync-version.yml +31 -2
  5. package/README.md +1408 -109
  6. package/additions.txt +3 -0
  7. package/bun.lock +260 -25
  8. package/dist/agent/autonomous-trader.d.ts.map +1 -0
  9. package/dist/agent/autonomous-trader.js +362 -0
  10. package/dist/agent/autonomous-trader.js.map +1 -0
  11. package/dist/agent/ax-agent.d.ts.map +1 -1
  12. package/dist/agent/ax-agent.js +356 -18
  13. package/dist/agent/ax-agent.js.map +1 -1
  14. package/dist/agent/event-client.d.ts.map +1 -0
  15. package/dist/agent/event-client.js +82 -0
  16. package/dist/agent/event-client.js.map +1 -0
  17. package/dist/agent/log-stream.d.ts.map +1 -0
  18. package/dist/agent/log-stream.js +95 -0
  19. package/dist/agent/log-stream.js.map +1 -0
  20. package/dist/agent/memory/conversation-session.d.ts.map +1 -0
  21. package/dist/agent/memory/conversation-session.js +232 -0
  22. package/dist/agent/memory/conversation-session.js.map +1 -0
  23. package/dist/agent/memory/conversation-store.d.ts.map +1 -0
  24. package/dist/agent/memory/conversation-store.js +214 -0
  25. package/dist/agent/memory/conversation-store.js.map +1 -0
  26. package/dist/agent/memory/database-schema.d.ts.map +1 -0
  27. package/dist/agent/memory/database-schema.js +355 -0
  28. package/dist/agent/memory/database-schema.js.map +1 -0
  29. package/dist/agent/memory/decision-tracker.d.ts.map +1 -0
  30. package/dist/agent/memory/decision-tracker.js +274 -0
  31. package/dist/agent/memory/decision-tracker.js.map +1 -0
  32. package/dist/agent/memory/memory-manager.d.ts.map +1 -0
  33. package/dist/agent/memory/memory-manager.js +187 -0
  34. package/dist/agent/memory/memory-manager.js.map +1 -0
  35. package/dist/agent/memory/types.d.ts.map +1 -0
  36. package/dist/agent/memory/types.js +5 -0
  37. package/dist/agent/memory/types.js.map +1 -0
  38. package/dist/agent/message-formatter.d.ts.map +1 -0
  39. package/dist/agent/message-formatter.js +76 -0
  40. package/dist/agent/message-formatter.js.map +1 -0
  41. package/dist/agent/position-db.d.ts.map +1 -0
  42. package/dist/agent/position-db.js +154 -0
  43. package/dist/agent/position-db.js.map +1 -0
  44. package/dist/agent/simple-chat-ui-static.d.ts.map +1 -0
  45. package/dist/agent/simple-chat-ui-static.js +129 -0
  46. package/dist/agent/simple-chat-ui-static.js.map +1 -0
  47. package/dist/agent/simple-chat-ui.d.ts.map +1 -0
  48. package/dist/agent/simple-chat-ui.js +90 -0
  49. package/dist/agent/simple-chat-ui.js.map +1 -0
  50. package/dist/agent/tools.d.ts.map +1 -1
  51. package/dist/agent/tools.js +297 -4
  52. package/dist/agent/tools.js.map +1 -1
  53. package/dist/agent/ui.d.ts.map +1 -0
  54. package/dist/agent/ui.js +84 -0
  55. package/dist/agent/ui.js.map +1 -0
  56. package/dist/agent/unified-runtime.d.ts.map +1 -0
  57. package/dist/agent/unified-runtime.js +397 -0
  58. package/dist/agent/unified-runtime.js.map +1 -0
  59. package/dist/client.d.ts.map +1 -1
  60. package/dist/client.js +272 -21
  61. package/dist/client.js.map +1 -1
  62. package/dist/commands/account.d.ts.map +1 -1
  63. package/dist/commands/account.js +187 -33
  64. package/dist/commands/account.js.map +1 -1
  65. package/dist/commands/agent.d.ts.map +1 -0
  66. package/dist/commands/agent.js +125 -0
  67. package/dist/commands/agent.js.map +1 -0
  68. package/dist/commands/approve.d.ts.map +1 -0
  69. package/dist/commands/approve.js +505 -0
  70. package/dist/commands/approve.js.map +1 -0
  71. package/dist/commands/automation.d.ts.map +1 -0
  72. package/dist/commands/automation.js +346 -0
  73. package/dist/commands/automation.js.map +1 -0
  74. package/dist/commands/balances.d.ts.map +1 -1
  75. package/dist/commands/balances.js +226 -73
  76. package/dist/commands/balances.js.map +1 -1
  77. package/dist/commands/buy.d.ts.map +1 -1
  78. package/dist/commands/buy.js +149 -146
  79. package/dist/commands/buy.js.map +1 -1
  80. package/dist/commands/call.d.ts.map +1 -0
  81. package/dist/commands/call.js +51 -0
  82. package/dist/commands/call.js.map +1 -0
  83. package/dist/commands/cex.d.ts.map +1 -0
  84. package/dist/commands/cex.js +958 -0
  85. package/dist/commands/cex.js.map +1 -0
  86. package/dist/commands/chat.d.ts.map +1 -1
  87. package/dist/commands/chat.js +169 -411
  88. package/dist/commands/chat.js.map +1 -1
  89. package/dist/commands/claim.d.ts.map +1 -1
  90. package/dist/commands/claim.js +313 -29
  91. package/dist/commands/claim.js.map +1 -1
  92. package/dist/commands/create.d.ts.map +1 -1
  93. package/dist/commands/create.js +151 -43
  94. package/dist/commands/create.js.map +1 -1
  95. package/dist/commands/gasless-swap.d.ts.map +1 -0
  96. package/dist/commands/gasless-swap.js +232 -0
  97. package/dist/commands/gasless-swap.js.map +1 -0
  98. package/dist/commands/health.d.ts.map +1 -1
  99. package/dist/commands/health.js +63 -7
  100. package/dist/commands/health.js.map +1 -1
  101. package/dist/commands/info.d.ts.map +1 -1
  102. package/dist/commands/info.js +131 -47
  103. package/dist/commands/info.js.map +1 -1
  104. package/dist/commands/launchpad.d.ts.map +1 -0
  105. package/dist/commands/launchpad.js +708 -0
  106. package/dist/commands/launchpad.js.map +1 -0
  107. package/dist/commands/list.d.ts.map +1 -1
  108. package/dist/commands/list.js +57 -23
  109. package/dist/commands/list.js.map +1 -1
  110. package/dist/commands/market.d.ts.map +1 -0
  111. package/dist/commands/market.js +960 -0
  112. package/dist/commands/market.js.map +1 -0
  113. package/dist/commands/mcp-install.d.ts.map +1 -0
  114. package/dist/commands/mcp-install.js +387 -0
  115. package/dist/commands/mcp-install.js.map +1 -0
  116. package/dist/commands/opps.d.ts.map +1 -0
  117. package/dist/commands/opps.js +409 -0
  118. package/dist/commands/opps.js.map +1 -0
  119. package/dist/commands/perps.d.ts.map +1 -0
  120. package/dist/commands/perps.js +248 -0
  121. package/dist/commands/perps.js.map +1 -0
  122. package/dist/commands/portfolio.d.ts.map +1 -0
  123. package/dist/commands/portfolio.js +679 -0
  124. package/dist/commands/portfolio.js.map +1 -0
  125. package/dist/commands/positions.d.ts.map +1 -1
  126. package/dist/commands/positions.js +76 -47
  127. package/dist/commands/positions.js.map +1 -1
  128. package/dist/commands/predict.d.ts.map +1 -0
  129. package/dist/commands/predict.js +280 -0
  130. package/dist/commands/predict.js.map +1 -0
  131. package/dist/commands/predictions.d.ts.map +1 -0
  132. package/dist/commands/predictions.js +486 -0
  133. package/dist/commands/predictions.js.map +1 -0
  134. package/dist/commands/risk.d.ts.map +1 -0
  135. package/dist/commands/risk.js +225 -0
  136. package/dist/commands/risk.js.map +1 -0
  137. package/dist/commands/security.d.ts.map +1 -0
  138. package/dist/commands/security.js +244 -0
  139. package/dist/commands/security.js.map +1 -0
  140. package/dist/commands/sell.d.ts.map +1 -1
  141. package/dist/commands/sell.js +67 -34
  142. package/dist/commands/sell.js.map +1 -1
  143. package/dist/commands/send.d.ts.map +1 -0
  144. package/dist/commands/send.js +733 -0
  145. package/dist/commands/send.js.map +1 -0
  146. package/dist/commands/sign.d.ts.map +1 -0
  147. package/dist/commands/sign.js +1048 -0
  148. package/dist/commands/sign.js.map +1 -0
  149. package/dist/commands/swap.d.ts.map +1 -0
  150. package/dist/commands/swap.js +744 -0
  151. package/dist/commands/swap.js.map +1 -0
  152. package/dist/commands/system.d.ts.map +1 -0
  153. package/dist/commands/system.js +417 -0
  154. package/dist/commands/system.js.map +1 -0
  155. package/dist/commands/tools/index.d.ts.map +1 -0
  156. package/dist/commands/tools/index.js +2040 -0
  157. package/dist/commands/tools/index.js.map +1 -0
  158. package/dist/commands/trade.d.ts.map +1 -0
  159. package/dist/commands/trade.js +237 -0
  160. package/dist/commands/trade.js.map +1 -0
  161. package/dist/commands/transactions.d.ts.map +1 -1
  162. package/dist/commands/transactions.js +29 -17
  163. package/dist/commands/transactions.js.map +1 -1
  164. package/dist/commands/update.d.ts.map +1 -0
  165. package/dist/commands/update.js +429 -0
  166. package/dist/commands/update.js.map +1 -0
  167. package/dist/config.d.ts.map +1 -1
  168. package/dist/config.js +351 -40
  169. package/dist/config.js.map +1 -1
  170. package/dist/index.js +4524 -924
  171. package/dist/index.js.map +1 -1
  172. package/dist/interactive/art.d.ts.map +1 -1
  173. package/dist/interactive/art.js +33 -1
  174. package/dist/interactive/art.js.map +1 -1
  175. package/dist/interactive/shell.d.ts.map +1 -1
  176. package/dist/interactive/shell.js +467 -2652
  177. package/dist/interactive/shell.js.map +1 -1
  178. package/dist/mcp/context.d.ts.map +1 -0
  179. package/dist/mcp/context.js +211 -0
  180. package/dist/mcp/context.js.map +1 -0
  181. package/dist/mcp/onboarding.d.ts.map +1 -0
  182. package/dist/mcp/onboarding.js +266 -0
  183. package/dist/mcp/onboarding.js.map +1 -0
  184. package/dist/mcp/resources.d.ts.map +1 -0
  185. package/dist/mcp/resources.js +222 -0
  186. package/dist/mcp/resources.js.map +1 -0
  187. package/dist/mcp/server.d.ts.map +1 -1
  188. package/dist/mcp/server.js +51 -1
  189. package/dist/mcp/server.js.map +1 -1
  190. package/dist/mcp/tools.d.ts.map +1 -1
  191. package/dist/mcp/tools.js +4119 -169
  192. package/dist/mcp/tools.js.map +1 -1
  193. package/dist/mcp/types.d.ts.map +1 -1
  194. package/dist/types/agent-info.d.ts.map +1 -0
  195. package/dist/types/agent-info.js +11 -0
  196. package/dist/types/agent-info.js.map +1 -0
  197. package/dist/ui/components/ScrollableList.d.ts.map +1 -0
  198. package/dist/ui/components/ScrollableList.js +72 -0
  199. package/dist/ui/components/ScrollableList.js.map +1 -0
  200. package/dist/ui/components/ThemeProvider.d.ts.map +1 -0
  201. package/dist/ui/components/ThemeProvider.js +87 -0
  202. package/dist/ui/components/ThemeProvider.js.map +1 -0
  203. package/dist/ui/components/ThemedBox.d.ts.map +1 -0
  204. package/dist/ui/components/ThemedBox.js +24 -0
  205. package/dist/ui/components/ThemedBox.js.map +1 -0
  206. package/dist/ui/components/agent/ChatHeader.d.ts.map +1 -0
  207. package/dist/ui/components/agent/ChatHeader.js +39 -0
  208. package/dist/ui/components/agent/ChatHeader.js.map +1 -0
  209. package/dist/ui/components/agent/Header.d.ts.map +1 -0
  210. package/dist/ui/components/agent/Header.js +14 -0
  211. package/dist/ui/components/agent/Header.js.map +1 -0
  212. package/dist/ui/components/agent/Input.d.ts.map +1 -0
  213. package/dist/ui/components/agent/Input.js +23 -0
  214. package/dist/ui/components/agent/Input.js.map +1 -0
  215. package/dist/ui/components/agent/Output.d.ts.map +1 -0
  216. package/dist/ui/components/agent/Output.js +23 -0
  217. package/dist/ui/components/agent/Output.js.map +1 -0
  218. package/dist/ui/components/chat/TokenChatUI.d.ts.map +1 -0
  219. package/dist/ui/components/chat/TokenChatUI.js +133 -0
  220. package/dist/ui/components/chat/TokenChatUI.js.map +1 -0
  221. package/dist/ui/components/shell/ShellHeader.d.ts.map +1 -0
  222. package/dist/ui/components/shell/ShellHeader.js +31 -0
  223. package/dist/ui/components/shell/ShellHeader.js.map +1 -0
  224. package/dist/ui/components/shell/ShellInput.d.ts.map +1 -0
  225. package/dist/ui/components/shell/ShellInput.js +151 -0
  226. package/dist/ui/components/shell/ShellInput.js.map +1 -0
  227. package/dist/ui/components/shell/ShellOutput.d.ts.map +1 -0
  228. package/dist/ui/components/shell/ShellOutput.js +8 -0
  229. package/dist/ui/components/shell/ShellOutput.js.map +1 -0
  230. package/dist/ui/hooks/useChatWebSocket.d.ts.map +1 -0
  231. package/dist/ui/hooks/useChatWebSocket.js +76 -0
  232. package/dist/ui/hooks/useChatWebSocket.js.map +1 -0
  233. package/dist/ui/hooks/useCommandHistory.d.ts.map +1 -0
  234. package/dist/ui/hooks/useCommandHistory.js +70 -0
  235. package/dist/ui/hooks/useCommandHistory.js.map +1 -0
  236. package/dist/ui/hooks/useDebounce.d.ts.map +1 -0
  237. package/dist/ui/hooks/useDebounce.js +17 -0
  238. package/dist/ui/hooks/useDebounce.js.map +1 -0
  239. package/dist/ui/hooks/useLogStream.d.ts.map +1 -0
  240. package/dist/ui/hooks/useLogStream.js +20 -0
  241. package/dist/ui/hooks/useLogStream.js.map +1 -0
  242. package/dist/ui/hooks/useVirtualScroll.d.ts.map +1 -0
  243. package/dist/ui/hooks/useVirtualScroll.js +70 -0
  244. package/dist/ui/hooks/useVirtualScroll.js.map +1 -0
  245. package/dist/utils/admin.d.ts.map +1 -0
  246. package/dist/utils/admin.js +144 -0
  247. package/dist/utils/admin.js.map +1 -0
  248. package/dist/utils/autoSetup.d.ts.map +1 -0
  249. package/dist/utils/autoSetup.js +252 -0
  250. package/dist/utils/autoSetup.js.map +1 -0
  251. package/dist/utils/build-constants.d.ts.map +1 -0
  252. package/dist/utils/build-constants.js +10 -0
  253. package/dist/utils/build-constants.js.map +1 -0
  254. package/dist/utils/constants.d.ts.map +1 -1
  255. package/dist/utils/errors.d.ts.map +1 -1
  256. package/dist/utils/errors.js +10 -1
  257. package/dist/utils/errors.js.map +1 -1
  258. package/dist/utils/formatting.d.ts.map +1 -1
  259. package/dist/utils/formatting.js +46 -9
  260. package/dist/utils/formatting.js.map +1 -1
  261. package/dist/utils/llm-cli-config.d.ts.map +1 -0
  262. package/dist/utils/llm-cli-config.js +963 -0
  263. package/dist/utils/llm-cli-config.js.map +1 -0
  264. package/dist/utils/llm-cli-detector.d.ts.map +1 -0
  265. package/dist/utils/llm-cli-detector.js +202 -0
  266. package/dist/utils/llm-cli-detector.js.map +1 -0
  267. package/dist/utils/loading.d.ts.map +1 -1
  268. package/dist/utils/loading.js +25 -3
  269. package/dist/utils/loading.js.map +1 -1
  270. package/dist/utils/maintenance.d.ts.map +1 -0
  271. package/dist/utils/maintenance.js +17 -0
  272. package/dist/utils/maintenance.js.map +1 -0
  273. package/dist/utils/mcp-config.d.ts.map +1 -0
  274. package/dist/utils/mcp-config.js +77 -0
  275. package/dist/utils/mcp-config.js.map +1 -0
  276. package/dist/utils/privateKeyPrompt.d.ts.map +1 -1
  277. package/dist/utils/privateKeyPrompt.js +308 -129
  278. package/dist/utils/privateKeyPrompt.js.map +1 -1
  279. package/dist/utils/process-cleanup.d.ts.map +1 -0
  280. package/dist/utils/process-cleanup.js +136 -0
  281. package/dist/utils/process-cleanup.js.map +1 -0
  282. package/dist/utils/retry.d.ts.map +1 -0
  283. package/dist/utils/retry.js +56 -0
  284. package/dist/utils/retry.js.map +1 -0
  285. package/dist/utils/rpc-helpers.d.ts.map +1 -0
  286. package/dist/utils/rpc-helpers.js +70 -0
  287. package/dist/utils/rpc-helpers.js.map +1 -0
  288. package/dist/utils/rpc-transport.d.ts.map +1 -0
  289. package/dist/utils/rpc-transport.js +87 -0
  290. package/dist/utils/rpc-transport.js.map +1 -0
  291. package/dist/utils/shell-setup.d.ts.map +1 -0
  292. package/dist/utils/shell-setup.js +531 -0
  293. package/dist/utils/shell-setup.js.map +1 -0
  294. package/dist/utils/status.d.ts.map +1 -1
  295. package/dist/utils/status.js +34 -5
  296. package/dist/utils/status.js.map +1 -1
  297. package/dist/utils/token-resolver.d.ts.map +1 -1
  298. package/dist/utils/token-resolver.js +51 -8
  299. package/dist/utils/token-resolver.js.map +1 -1
  300. package/dist/utils/x402-caller.d.ts.map +1 -0
  301. package/dist/utils/x402-caller.js +17 -0
  302. package/dist/utils/x402-caller.js.map +1 -0
  303. package/docs/README.md +28 -0
  304. package/docs/agent/README.md +18 -0
  305. package/docs/api/README.md +41 -0
  306. package/docs/cli/README.md +42 -0
  307. package/docs/guides/README.md +26 -0
  308. package/docs/implementation/README.md +18 -0
  309. package/docs/planning/README.md +19 -0
  310. package/docs/testing/README.md +15 -0
  311. package/docs/ux/README.md +16 -0
  312. package/issues.txt +2 -0
  313. package/package.json +24 -9
  314. package/scripts/cat-spin.sh +417 -0
  315. package/scripts/deprecate-rc-versions.js +58 -0
  316. package/scripts/inject-build-constants.js +43 -0
  317. package/scripts/monitor-foobar.js +117 -0
  318. package/swap.logs +61 -0
  319. package/swapping.txt +108 -0
  320. package/test.txt +12 -0
  321. package/tests/fixtures/test-data.json +16 -0
  322. package/Screenshot 2025-12-21 at 8.56.02/342/200/257PM.png +0 -0
@@ -0,0 +1,95 @@
1
+ /**
2
+ * LogStream - Shared message logging system for unified agent runtime
3
+ * Handles message history and subscriptions for both autonomous and chat modes
4
+ */
5
+ export class LogStream {
6
+ listeners = new Set();
7
+ messageHistory = [];
8
+ maxHistory = 1000; // Keep last 1000 messages
9
+ /**
10
+ * Add a message to the stream
11
+ */
12
+ log(content, type = 'agent', metadata) {
13
+ const message = {
14
+ timestamp: new Date(),
15
+ type,
16
+ content,
17
+ metadata,
18
+ };
19
+ // Add to history
20
+ this.messageHistory.push(message);
21
+ // Trim history if too long
22
+ if (this.messageHistory.length > this.maxHistory) {
23
+ this.messageHistory = this.messageHistory.slice(-this.maxHistory);
24
+ }
25
+ // Notify all listeners
26
+ this.listeners.forEach((listener) => {
27
+ try {
28
+ listener(message);
29
+ }
30
+ catch (error) {
31
+ // Don't let listener errors break the stream
32
+ console.error('Error in log stream listener:', error);
33
+ }
34
+ });
35
+ }
36
+ /**
37
+ * Subscribe to new messages
38
+ * Returns an unsubscribe function
39
+ */
40
+ subscribe(callback) {
41
+ this.listeners.add(callback);
42
+ // Return unsubscribe function
43
+ return () => {
44
+ this.listeners.delete(callback);
45
+ };
46
+ }
47
+ /**
48
+ * Get message history
49
+ */
50
+ getHistory(limit) {
51
+ if (limit) {
52
+ return this.messageHistory.slice(-limit);
53
+ }
54
+ return [...this.messageHistory];
55
+ }
56
+ /**
57
+ * Clear message history
58
+ */
59
+ clear() {
60
+ this.messageHistory = [];
61
+ }
62
+ /**
63
+ * Get the number of messages in history
64
+ */
65
+ getMessageCount() {
66
+ return this.messageHistory.length;
67
+ }
68
+ /**
69
+ * Remove the last message from the stream
70
+ * Used for removing temporary messages like "thinking..."
71
+ */
72
+ removeLast() {
73
+ if (this.messageHistory.length > 0) {
74
+ const removed = this.messageHistory.pop();
75
+ // Notify listeners about the removal (send a special removal message)
76
+ if (removed) {
77
+ const removalMessage = {
78
+ timestamp: new Date(),
79
+ type: 'system',
80
+ content: '',
81
+ metadata: { action: 'remove-last', removed },
82
+ };
83
+ this.listeners.forEach((listener) => {
84
+ try {
85
+ listener(removalMessage);
86
+ }
87
+ catch (error) {
88
+ console.error('Error in log stream listener:', error);
89
+ }
90
+ });
91
+ }
92
+ }
93
+ }
94
+ }
95
+ //# sourceMappingURL=log-stream.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"log-stream.js","sourceRoot":"","sources":["../../src/agent/log-stream.ts"],"names":[],"mappings":"AAAA;;;GAGG;AASH,MAAM,OAAO,SAAS;IACZ,SAAS,GAAuC,IAAI,GAAG,EAAE,CAAC;IAC1D,cAAc,GAAiB,EAAE,CAAC;IAClC,UAAU,GAAW,IAAI,CAAC,CAAC,0BAA0B;IAE7D;;OAEG;IACH,GAAG,CAAC,OAAe,EAAE,OAA2B,OAAO,EAAE,QAAc;QACrE,MAAM,OAAO,GAAe;YAC1B,SAAS,EAAE,IAAI,IAAI,EAAE;YACrB,IAAI;YACJ,OAAO;YACP,QAAQ;SACT,CAAC;QAEF,iBAAiB;QACjB,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;QAElC,2BAA2B;QAC3B,IAAI,IAAI,CAAC,cAAc,CAAC,MAAM,GAAG,IAAI,CAAC,UAAU,EAAE,CAAC;YACjD,IAAI,CAAC,cAAc,GAAG,IAAI,CAAC,cAAc,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;QACpE,CAAC;QAED,uBAAuB;QACvB,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC,QAAQ,EAAE,EAAE;YAClC,IAAI,CAAC;gBACH,QAAQ,CAAC,OAAO,CAAC,CAAC;YACpB,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBACf,6CAA6C;gBAC7C,OAAO,CAAC,KAAK,CAAC,+BAA+B,EAAE,KAAK,CAAC,CAAC;YACxD,CAAC;QACH,CAAC,CAAC,CAAC;IACL,CAAC;IAED;;;OAGG;IACH,SAAS,CAAC,QAAuC;QAC/C,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;QAE7B,8BAA8B;QAC9B,OAAO,GAAG,EAAE;YACV,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;QAClC,CAAC,CAAC;IACJ,CAAC;IAED;;OAEG;IACH,UAAU,CAAC,KAAc;QACvB,IAAI,KAAK,EAAE,CAAC;YACV,OAAO,IAAI,CAAC,cAAc,CAAC,KAAK,CAAC,CAAC,KAAK,CAAC,CAAC;QAC3C,CAAC;QACD,OAAO,CAAC,GAAG,IAAI,CAAC,cAAc,CAAC,CAAC;IAClC,CAAC;IAED;;OAEG;IACH,KAAK;QACH,IAAI,CAAC,cAAc,GAAG,EAAE,CAAC;IAC3B,CAAC;IAED;;OAEG;IACH,eAAe;QACb,OAAO,IAAI,CAAC,cAAc,CAAC,MAAM,CAAC;IACpC,CAAC;IAED;;;OAGG;IACH,UAAU;QACR,IAAI,IAAI,CAAC,cAAc,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACnC,MAAM,OAAO,GAAG,IAAI,CAAC,cAAc,CAAC,GAAG,EAAE,CAAC;YAE1C,sEAAsE;YACtE,IAAI,OAAO,EAAE,CAAC;gBACZ,MAAM,cAAc,GAAe;oBACjC,SAAS,EAAE,IAAI,IAAI,EAAE;oBACrB,IAAI,EAAE,QAAQ;oBACd,OAAO,EAAE,EAAE;oBACX,QAAQ,EAAE,EAAE,MAAM,EAAE,aAAa,EAAE,OAAO,EAAE;iBAC7C,CAAC;gBAEF,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC,QAAQ,EAAE,EAAE;oBAClC,IAAI,CAAC;wBACH,QAAQ,CAAC,cAAc,CAAC,CAAC;oBAC3B,CAAC;oBAAC,OAAO,KAAK,EAAE,CAAC;wBACf,OAAO,CAAC,KAAK,CAAC,+BAA+B,EAAE,KAAK,CAAC,CAAC;oBACxD,CAAC;gBACH,CAAC,CAAC,CAAC;YACL,CAAC;QACH,CAAC;IACH,CAAC;CACF"}
@@ -0,0 +1 @@
1
+ {"version":3,"file":"conversation-session.d.ts","sourceRoot":"","sources":["../../../src/agent/memory/conversation-session.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAAK,QAAQ,MAAM,gBAAgB,CAAC;AAE3C,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAG/C,MAAM,WAAW,kBAAkB;IACjC,eAAe,EAAE,MAAM,CAAC;IACxB,UAAU,EAAE,MAAM,CAAC;IACnB,UAAU,EAAE,MAAM,CAAC;IACnB,eAAe,EAAE,MAAM,CAAC;IACxB,aAAa,EAAE,MAAM,CAAC;IACtB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,qBAAa,0BAA0B;IAGzB,OAAO,CAAC,EAAE;IAFtB,OAAO,CAAC,iBAAiB,CAAoB;gBAEzB,EAAE,EAAE,QAAQ,CAAC,QAAQ;IAKzC;;OAEG;IACH,OAAO,CAAC,yBAAyB;IAiBjC;;;;OAIG;IACH,iBAAiB,CACf,SAAS,EAAE,MAAM,EACjB,gBAAgB,GAAE,OAAc,GAC/B,MAAM;IAyBT;;OAEG;IACH,oBAAoB,CAAC,cAAc,EAAE,MAAM,GAAG,IAAI;IASlD;;OAEG;IACH,cAAc,CAAC,cAAc,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,IAAI;IAQ3D;;OAEG;IACH,iBAAiB,CAAC,cAAc,EAAE,MAAM,GAAG,IAAI;IAyB/C;;OAEG;IACH,WAAW,CAAC,SAAS,EAAE,MAAM,EAAE,eAAe,GAAE,OAAe,GAAG,kBAAkB,EAAE;IAQtF;;OAEG;IACH,SAAS,CAAC,cAAc,EAAE,MAAM,GAAG,kBAAkB,GAAG,IAAI;IAM5D;;OAEG;IACH,aAAa,CAAC,cAAc,EAAE,MAAM,GAAG,IAAI;IAM3C;;OAEG;IACH,YAAY,CAAC,cAAc,EAAE,MAAM,GAAG,IAAI;IAO1C;;OAEG;IACH,sBAAsB,CAAC,cAAc,EAAE,MAAM,GAAG,YAAY,EAAE;IAI9D;;OAEG;IACH,cAAc,CAAC,cAAc,EAAE,MAAM,GAAG;QACtC,YAAY,EAAE,MAAM,CAAC;QACrB,YAAY,EAAE,MAAM,CAAC;QACrB,aAAa,EAAE,MAAM,CAAC;QACtB,QAAQ,EAAE,MAAM,CAAC;KAClB;IA6BD;;OAEG;IACH,aAAa,CAAC,SAAS,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,KAAK,CAAC;QACvD,MAAM,EAAE,kBAAkB,CAAC;QAC3B,UAAU,EAAE,MAAM,CAAC;KACpB,CAAC;IA0BF;;OAEG;IACH,gBAAgB,CAAC,SAAS,EAAE,MAAM,GAAG,kBAAkB,GAAG,IAAI;IAS9D;;OAEG;IACH,eAAe,CAAC,SAAS,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,MAAM,GAAG,MAAM;IAU1D,OAAO,CAAC,iBAAiB;CAkB1B"}
@@ -0,0 +1,232 @@
1
+ /**
2
+ * Conversation Session Manager
3
+ * Manages persistent conversation threads that can be resumed
4
+ */
5
+ import { ConversationStore } from "./conversation-store.js";
6
+ import { randomUUID } from "crypto";
7
+ export class ConversationSessionManager {
8
+ db;
9
+ conversationStore;
10
+ constructor(db) {
11
+ this.db = db;
12
+ this.conversationStore = new ConversationStore(db);
13
+ this.initializeSessionTracking();
14
+ }
15
+ /**
16
+ * Initialize session tracking table
17
+ */
18
+ initializeSessionTracking() {
19
+ this.db.exec(`
20
+ CREATE TABLE IF NOT EXISTS conversation_threads (
21
+ conversation_id TEXT PRIMARY KEY,
22
+ session_id TEXT NOT NULL,
23
+ started_at TEXT DEFAULT CURRENT_TIMESTAMP,
24
+ last_message_at TEXT DEFAULT CURRENT_TIMESTAMP,
25
+ message_count INTEGER DEFAULT 0,
26
+ title TEXT,
27
+ archived BOOLEAN DEFAULT 0
28
+ )
29
+ `);
30
+ this.db.exec(`CREATE INDEX IF NOT EXISTS idx_threads_session ON conversation_threads(session_id)`);
31
+ this.db.exec(`CREATE INDEX IF NOT EXISTS idx_threads_archived ON conversation_threads(archived)`);
32
+ }
33
+ /**
34
+ * Get or create active conversation thread for a session
35
+ * If resumeLastThread is true, returns the most recent active thread
36
+ * Otherwise creates a new thread
37
+ */
38
+ getOrCreateThread(sessionId, resumeLastThread = true) {
39
+ if (resumeLastThread) {
40
+ // Get the most recent active (non-archived) thread
41
+ const existingThread = this.db.prepare(`
42
+ SELECT conversation_id FROM conversation_threads
43
+ WHERE session_id = ? AND archived = 0
44
+ ORDER BY last_message_at DESC
45
+ LIMIT 1
46
+ `).get(sessionId);
47
+ if (existingThread) {
48
+ return existingThread.conversation_id;
49
+ }
50
+ }
51
+ // Create new thread
52
+ const conversationId = randomUUID();
53
+ this.db.prepare(`
54
+ INSERT INTO conversation_threads (conversation_id, session_id)
55
+ VALUES (?, ?)
56
+ `).run(conversationId, sessionId);
57
+ return conversationId;
58
+ }
59
+ /**
60
+ * Update thread metadata when a new message is added
61
+ */
62
+ updateThreadActivity(conversationId) {
63
+ this.db.prepare(`
64
+ UPDATE conversation_threads
65
+ SET last_message_at = CURRENT_TIMESTAMP,
66
+ message_count = message_count + 1
67
+ WHERE conversation_id = ?
68
+ `).run(conversationId);
69
+ }
70
+ /**
71
+ * Set a title for a conversation thread (auto-generated from first message or user-set)
72
+ */
73
+ setThreadTitle(conversationId, title) {
74
+ this.db.prepare(`
75
+ UPDATE conversation_threads
76
+ SET title = ?
77
+ WHERE conversation_id = ?
78
+ `).run(title, conversationId);
79
+ }
80
+ /**
81
+ * Generate a title from the first user message (if not already set)
82
+ */
83
+ autoGenerateTitle(conversationId) {
84
+ // Check if title already exists
85
+ const thread = this.db.prepare(`
86
+ SELECT title FROM conversation_threads WHERE conversation_id = ?
87
+ `).get(conversationId);
88
+ if (thread?.title) {
89
+ return; // Already has a title
90
+ }
91
+ // Get first user message
92
+ const firstMessage = this.db.prepare(`
93
+ SELECT message FROM conversations
94
+ WHERE conversation_id = ? AND role = 'user'
95
+ ORDER BY timestamp ASC
96
+ LIMIT 1
97
+ `).get(conversationId);
98
+ if (firstMessage) {
99
+ // Create title from first 50 chars of first message
100
+ const title = firstMessage.message.substring(0, 50) + (firstMessage.message.length > 50 ? "..." : "");
101
+ this.setThreadTitle(conversationId, title);
102
+ }
103
+ }
104
+ /**
105
+ * Get all conversation threads for a session
106
+ */
107
+ listThreads(sessionId, includeArchived = false) {
108
+ const query = includeArchived
109
+ ? `SELECT * FROM conversation_threads WHERE session_id = ? ORDER BY last_message_at DESC`
110
+ : `SELECT * FROM conversation_threads WHERE session_id = ? AND archived = 0 ORDER BY last_message_at DESC`;
111
+ return this.db.prepare(query).all(sessionId);
112
+ }
113
+ /**
114
+ * Get a specific thread by ID
115
+ */
116
+ getThread(conversationId) {
117
+ return this.db.prepare(`
118
+ SELECT * FROM conversation_threads WHERE conversation_id = ?
119
+ `).get(conversationId) || null;
120
+ }
121
+ /**
122
+ * Archive a conversation thread
123
+ */
124
+ archiveThread(conversationId) {
125
+ this.db.prepare(`
126
+ UPDATE conversation_threads SET archived = 1 WHERE conversation_id = ?
127
+ `).run(conversationId);
128
+ }
129
+ /**
130
+ * Delete a conversation thread and all its messages
131
+ */
132
+ deleteThread(conversationId) {
133
+ // Delete messages
134
+ this.db.prepare(`DELETE FROM conversations WHERE conversation_id = ?`).run(conversationId);
135
+ // Delete thread record
136
+ this.db.prepare(`DELETE FROM conversation_threads WHERE conversation_id = ?`).run(conversationId);
137
+ }
138
+ /**
139
+ * Load full conversation thread for resumption
140
+ */
141
+ loadConversationThread(conversationId) {
142
+ return this.conversationStore.getConversationThread(conversationId);
143
+ }
144
+ /**
145
+ * Get conversation statistics for a thread
146
+ */
147
+ getThreadStats(conversationId) {
148
+ const stats = this.db.prepare(`
149
+ SELECT
150
+ COUNT(*) as total,
151
+ SUM(CASE WHEN role = 'user' THEN 1 ELSE 0 END) as user_count,
152
+ SUM(CASE WHEN role = 'agent' THEN 1 ELSE 0 END) as agent_count,
153
+ MIN(timestamp) as first_message,
154
+ MAX(timestamp) as last_message
155
+ FROM conversations
156
+ WHERE conversation_id = ?
157
+ `).get(conversationId);
158
+ // Calculate duration
159
+ const duration = this.calculateDuration(stats.first_message, stats.last_message);
160
+ return {
161
+ messageCount: stats.total,
162
+ userMessages: stats.user_count,
163
+ agentMessages: stats.agent_count,
164
+ duration,
165
+ };
166
+ }
167
+ /**
168
+ * Search across all conversation threads
169
+ */
170
+ searchThreads(sessionId, keyword) {
171
+ const results = this.db.prepare(`
172
+ SELECT
173
+ ct.*,
174
+ COUNT(c.id) as match_count
175
+ FROM conversation_threads ct
176
+ JOIN conversations c ON c.conversation_id = ct.conversation_id
177
+ WHERE ct.session_id = ?
178
+ AND c.message LIKE ?
179
+ GROUP BY ct.conversation_id
180
+ ORDER BY ct.last_message_at DESC
181
+ `).all(sessionId, `%${keyword}%`);
182
+ return results.map(r => ({
183
+ thread: {
184
+ conversation_id: r.conversation_id,
185
+ session_id: r.session_id,
186
+ started_at: r.started_at,
187
+ last_message_at: r.last_message_at,
188
+ message_count: r.message_count,
189
+ title: r.title,
190
+ },
191
+ matchCount: r.match_count,
192
+ }));
193
+ }
194
+ /**
195
+ * Get the current active thread for a session (most recent non-archived)
196
+ */
197
+ getCurrentThread(sessionId) {
198
+ return this.db.prepare(`
199
+ SELECT * FROM conversation_threads
200
+ WHERE session_id = ? AND archived = 0
201
+ ORDER BY last_message_at DESC
202
+ LIMIT 1
203
+ `).get(sessionId) || null;
204
+ }
205
+ /**
206
+ * Create a new conversation thread
207
+ */
208
+ createNewThread(sessionId, title) {
209
+ const conversationId = randomUUID();
210
+ this.db.prepare(`
211
+ INSERT INTO conversation_threads (conversation_id, session_id, title)
212
+ VALUES (?, ?, ?)
213
+ `).run(conversationId, sessionId, title || null);
214
+ return conversationId;
215
+ }
216
+ calculateDuration(start, end) {
217
+ const startTime = new Date(start).getTime();
218
+ const endTime = new Date(end).getTime();
219
+ const diffMs = endTime - startTime;
220
+ const diffMins = Math.floor(diffMs / 60000);
221
+ if (diffMins < 60) {
222
+ return `${diffMins}m`;
223
+ }
224
+ const diffHours = Math.floor(diffMins / 60);
225
+ if (diffHours < 24) {
226
+ return `${diffHours}h ${diffMins % 60}m`;
227
+ }
228
+ const diffDays = Math.floor(diffHours / 24);
229
+ return `${diffDays}d ${diffHours % 24}h`;
230
+ }
231
+ }
232
+ //# sourceMappingURL=conversation-session.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"conversation-session.js","sourceRoot":"","sources":["../../../src/agent/memory/conversation-session.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1 @@
1
+ {"version":3,"file":"conversation-store.d.ts","sourceRoot":"","sources":["../../../src/agent/memory/conversation-store.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,QAAQ,MAAM,gBAAgB,CAAC;AAC3C,OAAO,EACL,KAAK,YAAY,EACjB,KAAK,iBAAiB,EACtB,KAAK,gBAAgB,EACrB,KAAK,WAAW,EAChB,KAAK,eAAe,EACrB,MAAM,YAAY,CAAC;AAGpB,qBAAa,iBAAiB;IAChB,OAAO,CAAC,EAAE;gBAAF,EAAE,EAAE,QAAQ,CAAC,QAAQ;IAEzC;;OAEG;IACH,iBAAiB,CAAC,KAAK,EAAE,iBAAiB,GAAG,YAAY;IA8BzD;;OAEG;IACH,yBAAyB,CACvB,SAAS,EAAE,MAAM,EACjB,KAAK,GAAE,MAAW,EAClB,MAAM,GAAE,MAAU,GACjB,eAAe,CAAC,YAAY,CAAC;IAyBhC;;OAEG;IACH,qBAAqB,CAAC,cAAc,EAAE,MAAM,GAAG,YAAY,EAAE;IAU7D;;OAEG;IACH,sBAAsB,CAAC,SAAS,EAAE,MAAM,EAAE,KAAK,GAAE,MAAW,GAAG,YAAY,EAAE;IAW7E;;OAEG;IACH,mBAAmB,CACjB,SAAS,EAAE,MAAM,EACjB,OAAO,EAAE,MAAM,EACf,KAAK,GAAE,MAAW,GACjB,YAAY,EAAE;IAWjB;;OAEG;IACH,qBAAqB,CACnB,SAAS,EAAE,MAAM,EACjB,OAAO,EAAE,MAAM,EACf,KAAK,GAAE,MAAW,GACjB,YAAY,EAAE;IAWjB;;OAEG;IACH,sBAAsB,CACpB,SAAS,EAAE,MAAM,EACjB,WAAW,EAAE,WAAW,EACxB,KAAK,GAAE,MAAW,GACjB,YAAY,EAAE;IAWjB;;OAEG;IACH,2BAA2B,CACzB,SAAS,EAAE,MAAM,EACjB,SAAS,EAAE,MAAM,EACjB,OAAO,EAAE,MAAM,GACd,YAAY,EAAE;IAYjB;;OAEG;IACH,iBAAiB,CAAC,SAAS,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,YAAY;IAUjF;;OAEG;IACH,iBAAiB,CAAC,SAAS,EAAE,MAAM,EAAE,KAAK,GAAE,MAAW,GAAG,YAAY,EAAE;IAWxE;;OAEG;IACH,yBAAyB,CAAC,SAAS,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,GAAG,MAAM;IAYxE;;OAEG;IACH,oBAAoB,CAAC,SAAS,EAAE,MAAM,GAAG;QACvC,KAAK,EAAE,MAAM,CAAC;QACd,MAAM,EAAE,MAAM,CAAC,gBAAgB,EAAE,MAAM,CAAC,CAAC;QACzC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;QAC/B,aAAa,EAAE,MAAM,GAAG,IAAI,CAAC;QAC7B,aAAa,EAAE,MAAM,GAAG,IAAI,CAAC;KAC9B;CAuDF"}
@@ -0,0 +1,214 @@
1
+ /**
2
+ * Conversation storage and retrieval for agent memory system
3
+ */
4
+ import { randomUUID } from "crypto";
5
+ export class ConversationStore {
6
+ db;
7
+ constructor(db) {
8
+ this.db = db;
9
+ }
10
+ /**
11
+ * Store a conversation message
12
+ */
13
+ storeConversation(input) {
14
+ const conversationId = input.conversation_id || randomUUID();
15
+ const metadata = input.metadata ? JSON.stringify(input.metadata) : null;
16
+ const stmt = this.db.prepare(`
17
+ INSERT INTO conversations (
18
+ session_id, conversation_id, role, message, context_type,
19
+ related_token_id, related_trade_id, metadata
20
+ ) VALUES (?, ?, ?, ?, ?, ?, ?, ?)
21
+ `);
22
+ const result = stmt.run(input.session_id, conversationId, input.role, input.message, input.context_type || null, input.related_token_id || null, input.related_trade_id || null, metadata);
23
+ // Retrieve the inserted conversation
24
+ const selectStmt = this.db.prepare(`
25
+ SELECT * FROM conversations WHERE id = ?
26
+ `);
27
+ return selectStmt.get(result.lastInsertRowid);
28
+ }
29
+ /**
30
+ * Get conversations by session ID with pagination
31
+ */
32
+ getConversationsBySession(sessionId, limit = 50, offset = 0) {
33
+ const stmt = this.db.prepare(`
34
+ SELECT * FROM conversations
35
+ WHERE session_id = ?
36
+ ORDER BY timestamp DESC
37
+ LIMIT ? OFFSET ?
38
+ `);
39
+ const countStmt = this.db.prepare(`
40
+ SELECT COUNT(*) as count FROM conversations WHERE session_id = ?
41
+ `);
42
+ const items = stmt.all(sessionId, limit, offset);
43
+ const countResult = countStmt.get(sessionId);
44
+ const total = countResult.count;
45
+ return {
46
+ items,
47
+ total,
48
+ page: Math.floor(offset / limit) + 1,
49
+ limit,
50
+ hasMore: offset + limit < total,
51
+ };
52
+ }
53
+ /**
54
+ * Get a specific conversation thread
55
+ */
56
+ getConversationThread(conversationId) {
57
+ const stmt = this.db.prepare(`
58
+ SELECT * FROM conversations
59
+ WHERE conversation_id = ?
60
+ ORDER BY timestamp ASC
61
+ `);
62
+ return stmt.all(conversationId);
63
+ }
64
+ /**
65
+ * Get recent conversations (last N messages)
66
+ */
67
+ getRecentConversations(sessionId, limit = 10) {
68
+ const stmt = this.db.prepare(`
69
+ SELECT * FROM conversations
70
+ WHERE session_id = ?
71
+ ORDER BY timestamp DESC
72
+ LIMIT ?
73
+ `);
74
+ return stmt.all(sessionId, limit).reverse();
75
+ }
76
+ /**
77
+ * Search conversations by keyword
78
+ */
79
+ searchConversations(sessionId, keyword, limit = 20) {
80
+ const stmt = this.db.prepare(`
81
+ SELECT * FROM conversations
82
+ WHERE session_id = ? AND message LIKE ?
83
+ ORDER BY timestamp DESC
84
+ LIMIT ?
85
+ `);
86
+ return stmt.all(sessionId, `%${keyword}%`, limit);
87
+ }
88
+ /**
89
+ * Get conversations related to a specific token
90
+ */
91
+ getTokenConversations(sessionId, tokenId, limit = 20) {
92
+ const stmt = this.db.prepare(`
93
+ SELECT * FROM conversations
94
+ WHERE session_id = ? AND related_token_id = ?
95
+ ORDER BY timestamp DESC
96
+ LIMIT ?
97
+ `);
98
+ return stmt.all(sessionId, tokenId, limit);
99
+ }
100
+ /**
101
+ * Get conversations by context type
102
+ */
103
+ getConversationsByType(sessionId, contextType, limit = 20) {
104
+ const stmt = this.db.prepare(`
105
+ SELECT * FROM conversations
106
+ WHERE session_id = ? AND context_type = ?
107
+ ORDER BY timestamp DESC
108
+ LIMIT ?
109
+ `);
110
+ return stmt.all(sessionId, contextType, limit);
111
+ }
112
+ /**
113
+ * Get conversations in a date range
114
+ */
115
+ getConversationsByDateRange(sessionId, startDate, endDate) {
116
+ const stmt = this.db.prepare(`
117
+ SELECT * FROM conversations
118
+ WHERE session_id = ?
119
+ AND timestamp >= ?
120
+ AND timestamp <= ?
121
+ ORDER BY timestamp DESC
122
+ `);
123
+ return stmt.all(sessionId, startDate, endDate);
124
+ }
125
+ /**
126
+ * Store a daily summary
127
+ */
128
+ storeDailySummary(sessionId, date, summary) {
129
+ return this.storeConversation({
130
+ session_id: sessionId,
131
+ role: "system",
132
+ message: summary,
133
+ context_type: "daily_summary",
134
+ metadata: { date },
135
+ });
136
+ }
137
+ /**
138
+ * Get daily summaries
139
+ */
140
+ getDailySummaries(sessionId, limit = 30) {
141
+ const stmt = this.db.prepare(`
142
+ SELECT * FROM conversations
143
+ WHERE session_id = ? AND context_type = 'daily_summary'
144
+ ORDER BY timestamp DESC
145
+ LIMIT ?
146
+ `);
147
+ return stmt.all(sessionId, limit);
148
+ }
149
+ /**
150
+ * Delete conversations older than a certain date
151
+ */
152
+ deleteConversationsBefore(sessionId, beforeDate) {
153
+ // Don't delete daily summaries
154
+ const stmt = this.db.prepare(`
155
+ DELETE FROM conversations
156
+ WHERE session_id = ?
157
+ AND timestamp < ?
158
+ AND context_type != 'daily_summary'
159
+ `);
160
+ return stmt.run(sessionId, beforeDate).changes;
161
+ }
162
+ /**
163
+ * Get conversation statistics
164
+ */
165
+ getConversationStats(sessionId) {
166
+ // Total count
167
+ const totalResult = this.db
168
+ .prepare(`SELECT COUNT(*) as count FROM conversations WHERE session_id = ?`)
169
+ .get(sessionId);
170
+ // By role
171
+ const byRoleResult = this.db.prepare(`
172
+ SELECT role, COUNT(*) as count
173
+ FROM conversations
174
+ WHERE session_id = ?
175
+ GROUP BY role
176
+ `).all(sessionId);
177
+ const byRole = {};
178
+ for (const { role, count } of byRoleResult) {
179
+ byRole[role] = count;
180
+ }
181
+ // By type
182
+ const byTypeResult = this.db.prepare(`
183
+ SELECT context_type, COUNT(*) as count
184
+ FROM conversations
185
+ WHERE session_id = ? AND context_type IS NOT NULL
186
+ GROUP BY context_type
187
+ `).all(sessionId);
188
+ const byType = {};
189
+ for (const { context_type, count } of byTypeResult) {
190
+ byType[context_type] = count;
191
+ }
192
+ // Oldest and newest
193
+ const oldestResult = this.db.prepare(`
194
+ SELECT timestamp FROM conversations
195
+ WHERE session_id = ?
196
+ ORDER BY timestamp ASC
197
+ LIMIT 1
198
+ `).get(sessionId);
199
+ const newestResult = this.db.prepare(`
200
+ SELECT timestamp FROM conversations
201
+ WHERE session_id = ?
202
+ ORDER BY timestamp DESC
203
+ LIMIT 1
204
+ `).get(sessionId);
205
+ return {
206
+ total: totalResult.count,
207
+ byRole: byRole,
208
+ byType,
209
+ oldestMessage: oldestResult?.timestamp || null,
210
+ newestMessage: newestResult?.timestamp || null,
211
+ };
212
+ }
213
+ }
214
+ //# sourceMappingURL=conversation-store.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"conversation-store.js","sourceRoot":"","sources":["../../../src/agent/memory/conversation-store.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1 @@
1
+ {"version":3,"file":"database-schema.d.ts","sourceRoot":"","sources":["../../../src/agent/memory/database-schema.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,QAAQ,MAAM,gBAAgB,CAAC;AAE3C,eAAO,MAAM,cAAc,IAAI,CAAC;AAEhC;;GAEG;AACH,wBAAgB,sBAAsB,CAAC,EAAE,EAAE,QAAQ,CAAC,QAAQ,GAAG,IAAI,CA8OlE;AAED;;GAEG;AACH,wBAAgB,qBAAqB,CAAC,EAAE,EAAE,QAAQ,CAAC,QAAQ,GAAG,IAAI,CAiDjE;AAED;;GAEG;AACH,wBAAgB,aAAa,CAAC,EAAE,EAAE,QAAQ,CAAC,QAAQ,GAAG,IAAI,CA6BzD;AAED;;GAEG;AACH,wBAAgB,cAAc,CAAC,EAAE,EAAE,QAAQ,CAAC,QAAQ,EAAE,SAAS,EAAE,MAAM,EAAE,UAAU,GAAE,MAAW,GAAG,IAAI,CA4BtG;AAED;;GAEG;AACH,wBAAgB,gBAAgB,CAAC,EAAE,EAAE,QAAQ,CAAC,QAAQ,EAAE,SAAS,EAAE,MAAM,GAAG,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CA6BjG"}