@multiplayer-app/ai-agent-node 0.1.0-beta.4 → 0.1.0-beta.40

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 (283) hide show
  1. package/dist/cjs/config.cjs +88 -38
  2. package/dist/cjs/config.cjs.map +1 -1
  3. package/dist/cjs/config.d.ts +56 -23
  4. package/dist/cjs/config.d.ts.map +1 -1
  5. package/dist/cjs/helpers/AIHelper.cjs +154 -98
  6. package/dist/cjs/helpers/AIHelper.cjs.map +1 -1
  7. package/dist/cjs/helpers/AIHelper.d.ts +20 -13
  8. package/dist/cjs/helpers/AIHelper.d.ts.map +1 -1
  9. package/dist/cjs/helpers/AIHelper.test.cjs +22 -15
  10. package/dist/cjs/helpers/AIHelper.test.cjs.map +1 -1
  11. package/dist/cjs/helpers/ConfigHelper.cjs +15 -7
  12. package/dist/cjs/helpers/ConfigHelper.cjs.map +1 -1
  13. package/dist/cjs/helpers/ConfigHelper.d.ts.map +1 -1
  14. package/dist/cjs/helpers/ContextLimiter.cjs +2 -3
  15. package/dist/cjs/helpers/ContextLimiter.cjs.map +1 -1
  16. package/dist/cjs/helpers/FileHelper.cjs +132 -154
  17. package/dist/cjs/helpers/FileHelper.cjs.map +1 -1
  18. package/dist/cjs/helpers/FileHelper.d.ts +19 -25
  19. package/dist/cjs/helpers/FileHelper.d.ts.map +1 -1
  20. package/dist/cjs/helpers/index.cjs +4 -5
  21. package/dist/cjs/helpers/index.cjs.map +1 -1
  22. package/dist/cjs/helpers/index.d.ts +4 -5
  23. package/dist/cjs/helpers/index.d.ts.map +1 -1
  24. package/dist/cjs/index.cjs +111 -31
  25. package/dist/cjs/index.cjs.map +1 -1
  26. package/dist/cjs/index.d.ts +39 -13
  27. package/dist/cjs/index.d.ts.map +1 -1
  28. package/dist/cjs/libs/index.cjs +2 -3
  29. package/dist/cjs/libs/index.cjs.map +1 -1
  30. package/dist/cjs/libs/index.d.ts +2 -3
  31. package/dist/cjs/libs/index.d.ts.map +1 -1
  32. package/dist/cjs/libs/logger/index.cjs +5 -5
  33. package/dist/cjs/libs/logger/index.cjs.map +1 -1
  34. package/dist/cjs/libs/logger/index.d.ts +2 -2
  35. package/dist/cjs/libs/logger/index.d.ts.map +1 -1
  36. package/dist/cjs/libs/logger/kafkajs-logger-creator.cjs +2 -2
  37. package/dist/cjs/libs/logger/kafkajs-logger-creator.cjs.map +1 -1
  38. package/dist/cjs/libs/s3/index.cjs +3 -39
  39. package/dist/cjs/libs/s3/index.cjs.map +1 -1
  40. package/dist/cjs/libs/s3/index.d.ts +1 -2
  41. package/dist/cjs/libs/s3/index.d.ts.map +1 -1
  42. package/dist/cjs/libs/s3/s3.lib.cjs +174 -191
  43. package/dist/cjs/libs/s3/s3.lib.cjs.map +1 -1
  44. package/dist/cjs/libs/s3/s3.lib.d.ts +29 -22
  45. package/dist/cjs/libs/s3/s3.lib.d.ts.map +1 -1
  46. package/dist/cjs/processors/ChatProcessor.cjs +138 -162
  47. package/dist/cjs/processors/ChatProcessor.cjs.map +1 -1
  48. package/dist/cjs/processors/ChatProcessor.d.ts +36 -10
  49. package/dist/cjs/processors/ChatProcessor.d.ts.map +1 -1
  50. package/dist/cjs/processors/ChatProcessor.test.cjs +333 -0
  51. package/dist/cjs/processors/ChatProcessor.test.cjs.map +1 -0
  52. package/dist/cjs/processors/ChatProcessor.test.d.ts +2 -0
  53. package/dist/cjs/processors/ChatProcessor.test.d.ts.map +1 -0
  54. package/dist/cjs/processors/ModelsProcessor.cjs +2 -2
  55. package/dist/cjs/processors/ModelsProcessor.cjs.map +1 -1
  56. package/dist/cjs/processors/index.cjs +2 -2
  57. package/dist/cjs/processors/index.cjs.map +1 -1
  58. package/dist/cjs/processors/index.d.ts +2 -2
  59. package/dist/cjs/processors/index.d.ts.map +1 -1
  60. package/dist/cjs/services/AIService.cjs +44 -30
  61. package/dist/cjs/services/AIService.cjs.map +1 -1
  62. package/dist/cjs/services/AIService.d.ts +13 -4
  63. package/dist/cjs/services/AIService.d.ts.map +1 -1
  64. package/dist/cjs/services/InternalEventsHandler.cjs +5 -5
  65. package/dist/cjs/services/InternalEventsHandler.cjs.map +1 -1
  66. package/dist/cjs/services/InternalEventsHandler.d.ts +3 -1
  67. package/dist/cjs/services/InternalEventsHandler.d.ts.map +1 -1
  68. package/dist/cjs/services/ModelFetcher.cjs +9 -15
  69. package/dist/cjs/services/ModelFetcher.cjs.map +1 -1
  70. package/dist/cjs/services/ModelFetcher.d.ts +2 -7
  71. package/dist/cjs/services/ModelFetcher.d.ts.map +1 -1
  72. package/dist/cjs/services/RedisService.cjs +35 -32
  73. package/dist/cjs/services/RedisService.cjs.map +1 -1
  74. package/dist/cjs/services/RedisService.d.ts +5 -2
  75. package/dist/cjs/services/RedisService.d.ts.map +1 -1
  76. package/dist/cjs/services/SocketService.cjs +19 -20
  77. package/dist/cjs/services/SocketService.cjs.map +1 -1
  78. package/dist/cjs/services/SocketService.d.ts +9 -6
  79. package/dist/cjs/services/SocketService.d.ts.map +1 -1
  80. package/dist/cjs/services/index.cjs +5 -6
  81. package/dist/cjs/services/index.cjs.map +1 -1
  82. package/dist/cjs/services/index.d.ts +5 -6
  83. package/dist/cjs/services/index.d.ts.map +1 -1
  84. package/dist/cjs/store/AgentStore.cjs +4 -5
  85. package/dist/cjs/store/AgentStore.cjs.map +1 -1
  86. package/dist/cjs/store/AgentStore.d.ts +2 -1
  87. package/dist/cjs/store/AgentStore.d.ts.map +1 -1
  88. package/dist/cjs/store/ArtifactStore.cjs +2 -4
  89. package/dist/cjs/store/ArtifactStore.cjs.map +1 -1
  90. package/dist/cjs/store/ConfigStore.cjs +8 -11
  91. package/dist/cjs/store/ConfigStore.cjs.map +1 -1
  92. package/dist/cjs/store/ConfigStore.d.ts.map +1 -1
  93. package/dist/cjs/store/ConfigStore.test.cjs +2 -2
  94. package/dist/cjs/store/ConfigStore.test.cjs.map +1 -1
  95. package/dist/cjs/store/ModelStore.cjs +4 -4
  96. package/dist/cjs/store/ModelStore.cjs.map +1 -1
  97. package/dist/cjs/store/ModelStore.test.cjs +17 -17
  98. package/dist/cjs/store/ModelStore.test.cjs.map +1 -1
  99. package/dist/cjs/store/index.cjs +4 -4
  100. package/dist/cjs/store/index.cjs.map +1 -1
  101. package/dist/cjs/store/index.d.ts +4 -4
  102. package/dist/cjs/store/index.d.ts.map +1 -1
  103. package/dist/cjs/tools/proposeFormValuesTool.d.ts +2 -2
  104. package/dist/cjs/tsconfig.cjs.tsbuildinfo +1 -0
  105. package/dist/esm/config.d.ts +56 -23
  106. package/dist/esm/config.d.ts.map +1 -1
  107. package/dist/esm/config.js +88 -36
  108. package/dist/esm/config.js.map +1 -1
  109. package/dist/esm/helpers/AIHelper.d.ts +20 -13
  110. package/dist/esm/helpers/AIHelper.d.ts.map +1 -1
  111. package/dist/esm/helpers/AIHelper.js +153 -95
  112. package/dist/esm/helpers/AIHelper.js.map +1 -1
  113. package/dist/esm/helpers/AIHelper.test.js +21 -14
  114. package/dist/esm/helpers/AIHelper.test.js.map +1 -1
  115. package/dist/esm/helpers/ConfigHelper.d.ts.map +1 -1
  116. package/dist/esm/helpers/ConfigHelper.js +13 -5
  117. package/dist/esm/helpers/ConfigHelper.js.map +1 -1
  118. package/dist/esm/helpers/ContextLimiter.js +2 -3
  119. package/dist/esm/helpers/ContextLimiter.js.map +1 -1
  120. package/dist/esm/helpers/FileHelper.d.ts +19 -25
  121. package/dist/esm/helpers/FileHelper.d.ts.map +1 -1
  122. package/dist/esm/helpers/FileHelper.js +132 -149
  123. package/dist/esm/helpers/FileHelper.js.map +1 -1
  124. package/dist/esm/helpers/index.d.ts +4 -5
  125. package/dist/esm/helpers/index.d.ts.map +1 -1
  126. package/dist/esm/helpers/index.js +4 -5
  127. package/dist/esm/helpers/index.js.map +1 -1
  128. package/dist/esm/index.d.ts +39 -13
  129. package/dist/esm/index.d.ts.map +1 -1
  130. package/dist/esm/index.js +79 -12
  131. package/dist/esm/index.js.map +1 -1
  132. package/dist/esm/libs/index.d.ts +2 -3
  133. package/dist/esm/libs/index.d.ts.map +1 -1
  134. package/dist/esm/libs/index.js +2 -3
  135. package/dist/esm/libs/index.js.map +1 -1
  136. package/dist/esm/libs/logger/index.d.ts +2 -2
  137. package/dist/esm/libs/logger/index.d.ts.map +1 -1
  138. package/dist/esm/libs/logger/index.js +2 -2
  139. package/dist/esm/libs/logger/index.js.map +1 -1
  140. package/dist/esm/libs/logger/kafkajs-logger-creator.js +1 -1
  141. package/dist/esm/libs/logger/kafkajs-logger-creator.js.map +1 -1
  142. package/dist/esm/libs/s3/index.d.ts +1 -2
  143. package/dist/esm/libs/s3/index.d.ts.map +1 -1
  144. package/dist/esm/libs/s3/index.js +1 -2
  145. package/dist/esm/libs/s3/index.js.map +1 -1
  146. package/dist/esm/libs/s3/s3.lib.d.ts +29 -22
  147. package/dist/esm/libs/s3/s3.lib.d.ts.map +1 -1
  148. package/dist/esm/libs/s3/s3.lib.js +178 -177
  149. package/dist/esm/libs/s3/s3.lib.js.map +1 -1
  150. package/dist/esm/processors/ChatProcessor.d.ts +36 -10
  151. package/dist/esm/processors/ChatProcessor.d.ts.map +1 -1
  152. package/dist/esm/processors/ChatProcessor.js +134 -151
  153. package/dist/esm/processors/ChatProcessor.js.map +1 -1
  154. package/dist/esm/processors/ChatProcessor.test.d.ts +2 -0
  155. package/dist/esm/processors/ChatProcessor.test.d.ts.map +1 -0
  156. package/dist/esm/processors/ChatProcessor.test.js +331 -0
  157. package/dist/esm/processors/ChatProcessor.test.js.map +1 -0
  158. package/dist/esm/processors/ModelsProcessor.js +1 -1
  159. package/dist/esm/processors/ModelsProcessor.js.map +1 -1
  160. package/dist/esm/processors/index.d.ts +2 -2
  161. package/dist/esm/processors/index.d.ts.map +1 -1
  162. package/dist/esm/processors/index.js +2 -2
  163. package/dist/esm/processors/index.js.map +1 -1
  164. package/dist/esm/services/AIService.d.ts +13 -4
  165. package/dist/esm/services/AIService.d.ts.map +1 -1
  166. package/dist/esm/services/AIService.js +47 -31
  167. package/dist/esm/services/AIService.js.map +1 -1
  168. package/dist/esm/services/InternalEventsHandler.d.ts +3 -1
  169. package/dist/esm/services/InternalEventsHandler.d.ts.map +1 -1
  170. package/dist/esm/services/InternalEventsHandler.js +10 -8
  171. package/dist/esm/services/InternalEventsHandler.js.map +1 -1
  172. package/dist/esm/services/ModelFetcher.d.ts +2 -7
  173. package/dist/esm/services/ModelFetcher.d.ts.map +1 -1
  174. package/dist/esm/services/ModelFetcher.js +4 -9
  175. package/dist/esm/services/ModelFetcher.js.map +1 -1
  176. package/dist/esm/services/RedisService.d.ts +5 -2
  177. package/dist/esm/services/RedisService.d.ts.map +1 -1
  178. package/dist/esm/services/RedisService.js +25 -21
  179. package/dist/esm/services/RedisService.js.map +1 -1
  180. package/dist/esm/services/SocketService.d.ts +9 -6
  181. package/dist/esm/services/SocketService.d.ts.map +1 -1
  182. package/dist/esm/services/SocketService.js +15 -13
  183. package/dist/esm/services/SocketService.js.map +1 -1
  184. package/dist/esm/services/index.d.ts +5 -6
  185. package/dist/esm/services/index.d.ts.map +1 -1
  186. package/dist/esm/services/index.js +5 -6
  187. package/dist/esm/services/index.js.map +1 -1
  188. package/dist/esm/store/AgentStore.d.ts +2 -1
  189. package/dist/esm/store/AgentStore.d.ts.map +1 -1
  190. package/dist/esm/store/AgentStore.js +5 -5
  191. package/dist/esm/store/AgentStore.js.map +1 -1
  192. package/dist/esm/store/ArtifactStore.js +3 -7
  193. package/dist/esm/store/ArtifactStore.js.map +1 -1
  194. package/dist/esm/store/ConfigStore.d.ts.map +1 -1
  195. package/dist/esm/store/ConfigStore.js +16 -19
  196. package/dist/esm/store/ConfigStore.js.map +1 -1
  197. package/dist/esm/store/ConfigStore.test.js +1 -1
  198. package/dist/esm/store/ConfigStore.test.js.map +1 -1
  199. package/dist/esm/store/ModelStore.js +6 -6
  200. package/dist/esm/store/ModelStore.js.map +1 -1
  201. package/dist/esm/store/ModelStore.test.js +12 -12
  202. package/dist/esm/store/ModelStore.test.js.map +1 -1
  203. package/dist/esm/store/index.d.ts +4 -4
  204. package/dist/esm/store/index.d.ts.map +1 -1
  205. package/dist/esm/store/index.js +4 -4
  206. package/dist/esm/store/index.js.map +1 -1
  207. package/dist/esm/tools/proposeFormValuesTool.d.ts +2 -2
  208. package/dist/esm/tsconfig.esm.tsbuildinfo +1 -0
  209. package/package.json +15 -15
  210. package/dist/cjs/helpers/SetupHelper.cjs +0 -37
  211. package/dist/cjs/helpers/SetupHelper.cjs.map +0 -1
  212. package/dist/cjs/helpers/SetupHelper.d.ts +0 -5
  213. package/dist/cjs/helpers/SetupHelper.d.ts.map +0 -1
  214. package/dist/cjs/libs/kafka/config.cjs +0 -8
  215. package/dist/cjs/libs/kafka/config.cjs.map +0 -1
  216. package/dist/cjs/libs/kafka/config.d.ts +0 -5
  217. package/dist/cjs/libs/kafka/config.d.ts.map +0 -1
  218. package/dist/cjs/libs/kafka/consumer.cjs +0 -133
  219. package/dist/cjs/libs/kafka/consumer.cjs.map +0 -1
  220. package/dist/cjs/libs/kafka/consumer.d.ts +0 -16
  221. package/dist/cjs/libs/kafka/consumer.d.ts.map +0 -1
  222. package/dist/cjs/libs/kafka/index.cjs +0 -19
  223. package/dist/cjs/libs/kafka/index.cjs.map +0 -1
  224. package/dist/cjs/libs/kafka/index.d.ts +0 -3
  225. package/dist/cjs/libs/kafka/index.d.ts.map +0 -1
  226. package/dist/cjs/libs/kafka/kafka.cjs +0 -27
  227. package/dist/cjs/libs/kafka/kafka.cjs.map +0 -1
  228. package/dist/cjs/libs/kafka/kafka.d.ts +0 -3
  229. package/dist/cjs/libs/kafka/kafka.d.ts.map +0 -1
  230. package/dist/cjs/libs/kafka/producer.cjs +0 -48
  231. package/dist/cjs/libs/kafka/producer.cjs.map +0 -1
  232. package/dist/cjs/libs/kafka/producer.d.ts +0 -11
  233. package/dist/cjs/libs/kafka/producer.d.ts.map +0 -1
  234. package/dist/cjs/libs/logger/config.cjs +0 -9
  235. package/dist/cjs/libs/logger/config.cjs.map +0 -1
  236. package/dist/cjs/libs/logger/config.d.ts +0 -5
  237. package/dist/cjs/libs/logger/config.d.ts.map +0 -1
  238. package/dist/cjs/libs/s3/config.cjs +0 -10
  239. package/dist/cjs/libs/s3/config.cjs.map +0 -1
  240. package/dist/cjs/libs/s3/config.d.ts +0 -7
  241. package/dist/cjs/libs/s3/config.d.ts.map +0 -1
  242. package/dist/cjs/services/KafkaService.cjs +0 -123
  243. package/dist/cjs/services/KafkaService.cjs.map +0 -1
  244. package/dist/cjs/services/KafkaService.d.ts +0 -35
  245. package/dist/cjs/services/KafkaService.d.ts.map +0 -1
  246. package/dist/esm/helpers/SetupHelper.d.ts +0 -5
  247. package/dist/esm/helpers/SetupHelper.d.ts.map +0 -1
  248. package/dist/esm/helpers/SetupHelper.js +0 -32
  249. package/dist/esm/helpers/SetupHelper.js.map +0 -1
  250. package/dist/esm/libs/kafka/config.d.ts +0 -5
  251. package/dist/esm/libs/kafka/config.d.ts.map +0 -1
  252. package/dist/esm/libs/kafka/config.js +0 -5
  253. package/dist/esm/libs/kafka/config.js.map +0 -1
  254. package/dist/esm/libs/kafka/consumer.d.ts +0 -16
  255. package/dist/esm/libs/kafka/consumer.d.ts.map +0 -1
  256. package/dist/esm/libs/kafka/consumer.js +0 -126
  257. package/dist/esm/libs/kafka/consumer.js.map +0 -1
  258. package/dist/esm/libs/kafka/index.d.ts +0 -3
  259. package/dist/esm/libs/kafka/index.d.ts.map +0 -1
  260. package/dist/esm/libs/kafka/index.js +0 -3
  261. package/dist/esm/libs/kafka/index.js.map +0 -1
  262. package/dist/esm/libs/kafka/kafka.d.ts +0 -3
  263. package/dist/esm/libs/kafka/kafka.d.ts.map +0 -1
  264. package/dist/esm/libs/kafka/kafka.js +0 -24
  265. package/dist/esm/libs/kafka/kafka.js.map +0 -1
  266. package/dist/esm/libs/kafka/producer.d.ts +0 -11
  267. package/dist/esm/libs/kafka/producer.d.ts.map +0 -1
  268. package/dist/esm/libs/kafka/producer.js +0 -44
  269. package/dist/esm/libs/kafka/producer.js.map +0 -1
  270. package/dist/esm/libs/logger/config.d.ts +0 -5
  271. package/dist/esm/libs/logger/config.d.ts.map +0 -1
  272. package/dist/esm/libs/logger/config.js +0 -6
  273. package/dist/esm/libs/logger/config.js.map +0 -1
  274. package/dist/esm/libs/s3/config.d.ts +0 -7
  275. package/dist/esm/libs/s3/config.d.ts.map +0 -1
  276. package/dist/esm/libs/s3/config.js +0 -7
  277. package/dist/esm/libs/s3/config.js.map +0 -1
  278. package/dist/esm/services/KafkaService.d.ts +0 -35
  279. package/dist/esm/services/KafkaService.d.ts.map +0 -1
  280. package/dist/esm/services/KafkaService.js +0 -120
  281. package/dist/esm/services/KafkaService.js.map +0 -1
  282. package/dist/tsconfig.cjs.tsbuildinfo +0 -1
  283. package/dist/tsconfig.esm.tsbuildinfo +0 -1
@@ -2,56 +2,81 @@
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.ChatProcessor = void 0;
4
4
  const ai_agent_types_1 = require("@multiplayer-app/ai-agent-types");
5
- const index_js_1 = require("../services/index.js");
6
- const index_js_2 = require("../services/index.js");
7
- const index_js_3 = require("../helpers/index.js");
8
- const index_js_4 = require("../store/index.js");
9
- const index_js_5 = require("../helpers/index.js");
10
- const config_js_1 = require("../config.js");
5
+ const helpers_1 = require("../helpers/index.cjs");
6
+ const store_1 = require("../store/index.cjs");
7
+ const helpers_2 = require("../helpers/index.cjs");
11
8
  const stream_1 = require("stream");
12
- const util_1 = require("util");
13
- const index_js_6 = require("../libs/logger/index.js");
14
- const pipelineAsync = (0, util_1.promisify)(stream_1.pipeline);
9
+ const logger_1 = require("../libs/logger/index.cjs");
15
10
  class ChatProcessor {
16
- constructor(chatRepository, messageRepository, artifactStore) {
17
- this.chatRepository = chatRepository;
18
- this.messageRepository = messageRepository;
19
- this.artifactStore = artifactStore;
11
+ constructor(params) {
12
+ this.chatRepository = params.chatRepository;
13
+ this.messageRepository = params.messageRepository;
14
+ this.artifactStore = params.artifactStore;
15
+ this.config = params.config;
16
+ this.socketService = params.socketService;
17
+ this.agentStore = params.agentStore;
18
+ const fileHelper = new helpers_1.FileHelper(params.s3Lib, this.config);
19
+ this.aiHelper = new helpers_1.AIHelper(fileHelper, this.config);
20
20
  }
21
21
  getTemporaryTitle(contextKey) {
22
22
  return `${contextKey} session ${new Date().toISOString()}`;
23
23
  }
24
+ isTemporaryTitle(title) {
25
+ // Matches pattern: "{contextKey} session {ISO_DATE_STRING}"
26
+ // Example: "default session 2026-01-23T10:30:45.123Z"
27
+ // toISOString() always includes milliseconds, so we require them
28
+ const pattern = /^.+ session \d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}\.\d{3}Z$/;
29
+ return pattern.test(title);
30
+ }
24
31
  async listChats(params) {
25
- var _a, _b;
26
32
  // Build filter object from params
27
33
  const filter = {};
28
- if (params === null || params === void 0 ? void 0 : params.userId) {
34
+ if (params?.userId) {
29
35
  filter.userId = params.userId;
30
36
  }
31
- if (params === null || params === void 0 ? void 0 : params.contextKey) {
37
+ if (params?.contextKey) {
32
38
  filter.contextKey = params.contextKey;
33
39
  }
34
- // Build query options for sort and limit with defaults
40
+ // Build query options for sort and limit with defaults.
35
41
  const options = {
36
42
  sort: {
37
- field: (_a = params === null || params === void 0 ? void 0 : params.sortField) !== null && _a !== void 0 ? _a : 'updatedAt',
38
- order: (_b = params === null || params === void 0 ? void 0 : params.sortOrder) !== null && _b !== void 0 ? _b : ai_agent_types_1.SortOrder.Desc
43
+ field: params?.sortField ?? 'updatedAt',
44
+ order: params?.sortOrder ?? ai_agent_types_1.SortOrder.Desc
39
45
  },
40
- limit: params === null || params === void 0 ? void 0 : params.limit
46
+ skip: params?.skip,
47
+ limit: params?.limit
48
+ };
49
+ const [total, data] = await Promise.all([
50
+ this.chatRepository.count(filter),
51
+ this.chatRepository.find(filter, options)
52
+ ]);
53
+ return {
54
+ cursor: {
55
+ ...(params?.skip != null ? { skip: params.skip } : {}),
56
+ ...(params?.limit != null ? { limit: params.limit } : {}),
57
+ total
58
+ },
59
+ data
41
60
  };
42
- // Use aggregation to fetch chats with related messages
43
- return this.chatRepository.findWithMessages(filter, options);
44
61
  }
45
62
  async getChat(chatId) {
46
63
  const chat = await this.chatRepository.findById(chatId);
47
64
  if (!chat) {
48
65
  throw new Error('Chat not found');
49
66
  }
50
- const messages = await this.messageRepository.findByChatId(chatId);
51
- return {
52
- ...chat,
53
- messages
54
- };
67
+ return chat;
68
+ }
69
+ /**
70
+ * Get messages for a chat with optional cursor pagination.
71
+ * When limit is omitted, returns all messages (backward compatible).
72
+ * Messages are returned in chronological order (oldest → newest).
73
+ */
74
+ async getMessages(chatId, options) {
75
+ const chat = await this.chatRepository.findById(chatId);
76
+ if (!chat) {
77
+ throw new Error('Chat not found');
78
+ }
79
+ return this.messageRepository.findByChatIdPaginated(chatId, options);
55
80
  }
56
81
  async deleteChat(chatId) {
57
82
  const deleted = await this.chatRepository.delete(chatId);
@@ -61,8 +86,7 @@ class ChatProcessor {
61
86
  this.artifactStore.deleteArtifacts(chatId);
62
87
  }
63
88
  async upsertAndGetChat(payload, excludeSocketId) {
64
- var _a;
65
- const targetUserId = (_a = payload.userId) !== null && _a !== void 0 ? _a : 'guest';
89
+ const targetUserId = payload.userId ?? 'guest';
66
90
  let chat = null;
67
91
  if (payload.chatId) {
68
92
  chat = await this.chatRepository.findById(payload.chatId);
@@ -94,7 +118,7 @@ class ChatProcessor {
94
118
  if (!content) {
95
119
  return this.getTemporaryTitle(payload.contextKey);
96
120
  }
97
- return index_js_3.AIHelper.generateTitleForMessage(payload.contextKey, [{
121
+ return this.aiHelper.generateTitleForMessage(payload.contextKey, [{
98
122
  role: ai_agent_types_1.MessageRole.User,
99
123
  content: content
100
124
  }]);
@@ -105,18 +129,17 @@ class ChatProcessor {
105
129
  role,
106
130
  content: messageData.content,
107
131
  agentName: messageData.agentName,
108
- attachments: attachments !== null && attachments !== void 0 ? attachments : [],
132
+ attachments: attachments ?? [],
109
133
  reasoning: "",
110
134
  toolCalls: []
111
135
  });
112
136
  if (chat.userId) {
113
- index_js_1.socketService.emitMessageUpdate(chat.userId, message, excludeSocketId);
137
+ this.socketService.emitMessageUpdate(chat.userId, message, excludeSocketId);
114
138
  }
115
139
  return message;
116
140
  }
117
141
  async createChat(payload, excludeSocketId) {
118
- var _a;
119
- const targetUserId = (_a = payload.userId) !== null && _a !== void 0 ? _a : 'guest';
142
+ const targetUserId = payload.userId ?? 'guest';
120
143
  const contextKey = 'contextKey' in payload ? payload.contextKey : 'default';
121
144
  const metadata = 'metadata' in payload ? payload.metadata : {};
122
145
  const chat = await this.chatRepository.create({
@@ -128,12 +151,7 @@ class ChatProcessor {
128
151
  metadata,
129
152
  ...(payload.model ? { model: payload.model } : {})
130
153
  });
131
- await index_js_2.kafkaService.sendChatTitleGenerationEvent(chat.id);
132
- const initialChatResponse = {
133
- ...chat,
134
- messages: []
135
- };
136
- index_js_1.socketService.emitChatUpdate(targetUserId, initialChatResponse, excludeSocketId);
154
+ this.socketService.emitChatUpdate(targetUserId, chat, excludeSocketId);
137
155
  return chat;
138
156
  }
139
157
  /**
@@ -141,23 +159,22 @@ class ChatProcessor {
141
159
  * This updates the message containing the tool call and optionally appends a System message.
142
160
  */
143
161
  async recordToolCallAction(params) {
144
- var _a, _b, _c, _d;
145
162
  const chat = await this.chatRepository.findById(params.chatId);
146
163
  if (!chat) {
147
164
  throw new Error('Chat not found');
148
165
  }
149
166
  const messages = await this.messageRepository.findByChatId(params.chatId);
150
- const message = messages.find((m) => { var _a; return ((_a = m.toolCalls) !== null && _a !== void 0 ? _a : []).some((c) => c.id === params.toolCallId); });
167
+ const message = messages.find((m) => (m.toolCalls ?? []).some((c) => c.id === params.toolCallId));
151
168
  if (!message) {
152
169
  throw new Error('Tool call not found');
153
170
  }
154
- const toolCalls = (_a = message.toolCalls) !== null && _a !== void 0 ? _a : [];
171
+ const toolCalls = message.toolCalls ?? [];
155
172
  const target = toolCalls.find((c) => c.id === params.toolCallId);
156
173
  if (!target) {
157
174
  throw new Error('Tool call not found');
158
175
  }
159
176
  const now = new Date().toISOString();
160
- const output = ((_b = target.output) !== null && _b !== void 0 ? _b : {});
177
+ const output = (target.output ?? {});
161
178
  const mp = (output['_mp'] && typeof output['_mp'] === 'object' && !Array.isArray(output['_mp']))
162
179
  ? output['_mp']
163
180
  : {};
@@ -167,14 +184,14 @@ class ChatProcessor {
167
184
  lastAction: {
168
185
  action: params.action,
169
186
  at: now,
170
- data: (_c = params.data) !== null && _c !== void 0 ? _c : {},
187
+ data: params.data ?? {},
171
188
  },
172
189
  actions: [
173
190
  ...actions,
174
191
  {
175
192
  action: params.action,
176
193
  at: now,
177
- data: (_d = params.data) !== null && _d !== void 0 ? _d : {},
194
+ data: params.data ?? {},
178
195
  }
179
196
  ]
180
197
  };
@@ -189,7 +206,7 @@ class ChatProcessor {
189
206
  await this.messageRepository.update(message.id, { toolCalls });
190
207
  // Bump chat updatedAt so listChats ordering reflects the action.
191
208
  await this.chatRepository.update(chat.id, { updatedAt: now });
192
- index_js_1.socketService.emitMessageUpdate(chat.userId, updatedMessage, params.excludeSocketId);
209
+ this.socketService.emitMessageUpdate(chat.userId, updatedMessage, params.excludeSocketId);
193
210
  if (params.systemMessage) {
194
211
  //todo discuss support for system messages
195
212
  //await this.createMessage(chat, MessageRole.System, params.systemMessage, undefined, params.excludeSocketId);
@@ -197,26 +214,25 @@ class ChatProcessor {
197
214
  return { ok: true };
198
215
  }
199
216
  async streamMessageStep(params) {
200
- var _a, _b, _c, _d, _e, _f, _g, _h, _j, _k, _l;
201
217
  const { chat, assistantMessage, existingMessages, signal, excludeSocketId, agentOptions } = params;
202
218
  if (signal.aborted) {
203
219
  return;
204
220
  }
205
- const result = await index_js_3.AIHelper.streamAssistantResponse(existingMessages, signal, agentOptions);
221
+ const result = await this.aiHelper.streamAssistantResponse(existingMessages, signal, agentOptions);
206
222
  try {
207
223
  for await (const chunk of result.fullStream) {
208
224
  if (chunk.type === 'error') {
209
- await index_js_4.agentStore.shareAgentProcessEvent(chat.id, { type: index_js_4.AgentProcessEventType.Error, data: chunk.error });
225
+ await this.agentStore.shareAgentProcessEvent(chat.id, { type: store_1.AgentProcessEventType.Error, data: chunk.error });
210
226
  assistantMessage.content = chunk.error.message || 'Sorry, I cannot process you request due to the error';
211
227
  await this.messageRepository.update(assistantMessage.id, assistantMessage);
212
228
  await this.chatRepository.update(chat.id, { status: ai_agent_types_1.AgentStatus.Error });
213
229
  continue;
214
230
  }
215
231
  if (chunk.type === 'abort') {
216
- await index_js_4.agentStore.shareAgentProcessEvent(chat.id, { type: index_js_4.AgentProcessEventType.Aborted, data: undefined });
232
+ await this.agentStore.shareAgentProcessEvent(chat.id, { type: store_1.AgentProcessEventType.Aborted, data: undefined });
217
233
  await this.chatRepository.update(chat.id, { status: ai_agent_types_1.AgentStatus.Aborted });
218
234
  await this.messageRepository.update(assistantMessage.id, assistantMessage);
219
- index_js_1.socketService.emitMessageUpdate(chat.userId, assistantMessage, excludeSocketId);
235
+ this.socketService.emitMessageUpdate(chat.userId, assistantMessage, excludeSocketId);
220
236
  continue;
221
237
  }
222
238
  if (chunk.type === 'finish') {
@@ -229,41 +245,27 @@ class ChatProcessor {
229
245
  }
230
246
  if (chunk.totalUsage && typeof chunk.totalUsage === 'object') {
231
247
  const totalUsage = chunk.totalUsage;
232
- assistantMessage.tokens = (_a = totalUsage.totalTokens) !== null && _a !== void 0 ? _a : (((_b = totalUsage.promptTokens) !== null && _b !== void 0 ? _b : 0) + ((_c = totalUsage.completionTokens) !== null && _c !== void 0 ? _c : 0));
248
+ assistantMessage.tokens = totalUsage.totalTokens ??
249
+ ((totalUsage.promptTokens ?? 0) + (totalUsage.completionTokens ?? 0));
233
250
  }
234
251
  await this.messageRepository.update(assistantMessage.id, { ...assistantMessage });
235
252
  if (chunk.finishReason === 'stop') {
236
- if ((_d = assistantMessage.toolCalls) === null || _d === void 0 ? void 0 : _d.some(toolCall => toolCall.requiresConfirmation && toolCall.approvalId && !toolCall.output)) {
237
- await this.chatRepository.update(chat.id, { status: ai_agent_types_1.AgentStatus.WaitingForUserAction });
238
- }
239
- else if (!assistantMessage.content && ((_e = assistantMessage.toolCalls) === null || _e === void 0 ? void 0 : _e.length) && assistantMessage.toolCalls[((_f = assistantMessage.toolCalls) === null || _f === void 0 ? void 0 : _f.length) - 1].output) {
240
- // handle tool-calls stop, openrouter provider does not return valid type
241
- await index_js_4.agentStore.shareAgentProcessEvent(chat.id, { type: index_js_4.AgentProcessEventType.Update, data: assistantMessage });
242
- await this.streamMessageStep(params);
243
- continue;
244
- }
245
- else {
246
- await this.chatRepository.update(chat.id, { status: ai_agent_types_1.AgentStatus.Finished });
253
+ await this.chatRepository.update(chat.id, { status: ai_agent_types_1.AgentStatus.Finished });
254
+ if (chat.title && this.isTemporaryTitle(chat.title)) {
255
+ const title = await this.aiHelper.generateTitleForMessage(chat.contextKey, existingMessages);
256
+ await this.chatRepository.update(chat.id, { title });
257
+ this.socketService.emitChatUpdate(chat.userId, { ...chat, title });
247
258
  }
248
- await index_js_4.agentStore.shareAgentProcessEvent(chat.id, { type: index_js_4.AgentProcessEventType.Finished, data: assistantMessage });
249
- continue;
250
259
  }
251
260
  if (chunk.finishReason === 'tool-calls') {
252
- if ((_g = assistantMessage.toolCalls) === null || _g === void 0 ? void 0 : _g.some(toolCall => toolCall.requiresConfirmation && toolCall.approvalId && !toolCall.output)) {
261
+ if (assistantMessage.toolCalls?.some(toolCall => toolCall.requiresConfirmation && toolCall.approvalId && !toolCall.output)) {
253
262
  await this.chatRepository.update(chat.id, { status: ai_agent_types_1.AgentStatus.WaitingForUserAction });
254
- await index_js_4.agentStore.shareAgentProcessEvent(chat.id, { type: index_js_4.AgentProcessEventType.Finished, data: assistantMessage });
255
- }
256
- else {
257
- await index_js_4.agentStore.shareAgentProcessEvent(chat.id, {
258
- type: index_js_4.AgentProcessEventType.Update,
259
- data: assistantMessage
260
- });
261
- await this.streamMessageStep(params);
263
+ await this.agentStore.shareAgentProcessEvent(chat.id, { type: store_1.AgentProcessEventType.Finished, data: assistantMessage });
264
+ continue;
262
265
  }
263
- continue;
264
266
  }
265
267
  //todo: Handle other finish reasons // length, content, error, other, undefined
266
- await index_js_4.agentStore.shareAgentProcessEvent(chat.id, { type: index_js_4.AgentProcessEventType.Finished, data: assistantMessage });
268
+ await this.agentStore.shareAgentProcessEvent(chat.id, { type: store_1.AgentProcessEventType.Finished, data: assistantMessage });
267
269
  continue;
268
270
  }
269
271
  if (chunk.type === 'text-delta') {
@@ -272,8 +274,8 @@ class ChatProcessor {
272
274
  ...assistantMessage,
273
275
  content: assistantMessage.content
274
276
  };
275
- index_js_1.socketService.emitMessageUpdate(chat.userId, updatedMessage, excludeSocketId);
276
- await index_js_4.agentStore.shareAgentProcessEvent(chat.id, { type: index_js_4.AgentProcessEventType.Update, data: updatedMessage });
277
+ this.socketService.emitMessageUpdate(chat.userId, updatedMessage, excludeSocketId);
278
+ await this.agentStore.shareAgentProcessEvent(chat.id, { type: store_1.AgentProcessEventType.Update, data: updatedMessage });
277
279
  await this.messageRepository.update(assistantMessage.id, { content: assistantMessage.content });
278
280
  continue;
279
281
  }
@@ -288,8 +290,8 @@ class ChatProcessor {
288
290
  });
289
291
  continue;
290
292
  }
291
- if (chunk.type === 'tool-call') { //Todo possible place to handle user-approval
292
- const toolCall = (_h = assistantMessage.toolCalls) === null || _h === void 0 ? void 0 : _h.find(toolCall => toolCall.id === chunk.toolCallId);
293
+ if (chunk.type === 'tool-call') {
294
+ const toolCall = assistantMessage.toolCalls?.find(toolCall => toolCall.id === chunk.toolCallId);
293
295
  if (toolCall) {
294
296
  toolCall.status = ai_agent_types_1.AgentToolCallStatus.Running;
295
297
  toolCall.input = chunk.input;
@@ -297,15 +299,15 @@ class ChatProcessor {
297
299
  continue;
298
300
  }
299
301
  if (chunk.type === 'tool-error') {
300
- const toolCall = (_j = assistantMessage.toolCalls) === null || _j === void 0 ? void 0 : _j.find(toolCall => toolCall.id === chunk.toolCallId);
302
+ const toolCall = assistantMessage.toolCalls?.find(toolCall => toolCall.id === chunk.toolCallId);
301
303
  if (toolCall) {
302
304
  toolCall.status = ai_agent_types_1.AgentToolCallStatus.Failed;
303
- toolCall.error = JSON.stringify(chunk.error);
305
+ toolCall.error = chunk.error.message || JSON.stringify(chunk.error);
304
306
  }
305
307
  continue;
306
308
  }
307
309
  if (chunk.type === 'tool-approval-request') {
308
- const toolCall = (_k = assistantMessage.toolCalls) === null || _k === void 0 ? void 0 : _k.find(toolCall => toolCall.id === chunk.toolCall.toolCallId);
310
+ const toolCall = assistantMessage.toolCalls?.find(toolCall => toolCall.id === chunk.toolCall.toolCallId);
309
311
  if (toolCall) {
310
312
  toolCall.requiresConfirmation = true;
311
313
  toolCall.approvalId = chunk.approvalId;
@@ -313,7 +315,7 @@ class ChatProcessor {
313
315
  continue;
314
316
  }
315
317
  if (chunk.type === 'tool-result') {
316
- const toolCall = (_l = assistantMessage.toolCalls) === null || _l === void 0 ? void 0 : _l.find(toolCall => toolCall.id === chunk.toolCallId);
318
+ const toolCall = assistantMessage.toolCalls?.find(toolCall => toolCall.id === chunk.toolCallId);
317
319
  if (toolCall) {
318
320
  if (chunk.output.requiresApproval) {
319
321
  toolCall.requiresConfirmation = true;
@@ -328,9 +330,9 @@ class ChatProcessor {
328
330
  if (!assistantMessage.reasoning)
329
331
  assistantMessage.reasoning = '';
330
332
  assistantMessage.reasoning += chunk.text;
331
- index_js_1.socketService.emitMessageUpdate(chat.userId, assistantMessage, excludeSocketId);
333
+ this.socketService.emitMessageUpdate(chat.userId, assistantMessage, excludeSocketId);
332
334
  await this.messageRepository.update(assistantMessage.id, { reasoning: assistantMessage.reasoning });
333
- await index_js_4.agentStore.shareAgentProcessEvent(chat.id, { type: index_js_4.AgentProcessEventType.Update, data: assistantMessage });
335
+ await this.agentStore.shareAgentProcessEvent(chat.id, { type: store_1.AgentProcessEventType.Update, data: assistantMessage });
334
336
  continue;
335
337
  }
336
338
  }
@@ -339,7 +341,7 @@ class ChatProcessor {
339
341
  if (streamError instanceof Error && streamError.name === 'AbortError') {
340
342
  return;
341
343
  }
342
- await index_js_4.agentStore.shareAgentProcessEvent(chat.id, { type: index_js_4.AgentProcessEventType.Error, data: streamError });
344
+ await this.agentStore.shareAgentProcessEvent(chat.id, { type: store_1.AgentProcessEventType.Error, data: streamError });
343
345
  throw streamError;
344
346
  }
345
347
  }
@@ -347,16 +349,15 @@ class ChatProcessor {
347
349
  return 'approvalId' in payload;
348
350
  }
349
351
  async processApprovalPayload(chat, payload) {
350
- var _a, _b, _c;
351
352
  const assistantMessage = await this.messageRepository.findById(payload.messageId);
352
353
  if (!assistantMessage || assistantMessage.chat !== chat.id) {
353
354
  throw new Error(`Assistant message with id ${payload.messageId} not found`);
354
355
  }
355
- const agentOptions = await index_js_3.AIHelper.getAgentOptions({
356
+ const agentOptions = await this.aiHelper.getAgentOptions({
356
357
  agentName: assistantMessage.agentName,
357
358
  context: payload.context
358
359
  });
359
- const toolCall = (_a = assistantMessage.toolCalls) === null || _a === void 0 ? void 0 : _a.find(tc => tc.approvalId === payload.approvalId);
360
+ const toolCall = assistantMessage.toolCalls?.find(tc => tc.approvalId === payload.approvalId);
360
361
  if (!toolCall) {
361
362
  // continue, tool is not found
362
363
  return {
@@ -374,14 +375,14 @@ class ChatProcessor {
374
375
  toolCall.status = ai_agent_types_1.AgentToolCallStatus.Failed;
375
376
  }
376
377
  else {
377
- const executeFunction = (_c = (_b = agentOptions.tools) === null || _b === void 0 ? void 0 : _b[toolCall.name]) === null || _c === void 0 ? void 0 : _c.execute;
378
+ const executeFunction = agentOptions.tools?.[toolCall.name]?.execute;
378
379
  if (executeFunction) {
379
380
  try {
380
381
  toolCall.output = await executeFunction(toolCall.input, { toolCallId: toolCall.id, messages: [] });
381
382
  toolCall.status = ai_agent_types_1.AgentToolCallStatus.Succeeded;
382
383
  }
383
384
  catch (error) {
384
- index_js_6.logger.error(error);
385
+ logger_1.logger.error(error);
385
386
  toolCall.status = ai_agent_types_1.AgentToolCallStatus.Failed;
386
387
  toolCall.output = {
387
388
  type: 'execution-denied',
@@ -405,15 +406,15 @@ class ChatProcessor {
405
406
  }
406
407
  async processNewUserMessage(chat, payload, prevMessages, excludeSocketId) {
407
408
  const userMessage = await this.createMessage(chat, ai_agent_types_1.MessageRole.User, { content: payload.content, agentName: undefined }, payload.attachments);
408
- await index_js_4.agentStore.shareAgentProcessEvent(chat.id, { type: index_js_4.AgentProcessEventType.Update, data: userMessage });
409
- const agentOptions = await index_js_3.AIHelper.getAgentOptions({
409
+ await this.agentStore.shareAgentProcessEvent(chat.id, { type: store_1.AgentProcessEventType.Update, data: userMessage });
410
+ const agentOptions = await this.aiHelper.getAgentOptions({
410
411
  contextKey: chat.contextKey,
411
- messages: await index_js_3.AIHelper.convertMessages([...prevMessages, userMessage], true),
412
+ messages: [...prevMessages, userMessage],
412
413
  context: payload.context,
413
414
  agentName: undefined,
414
415
  modelId: chat.model,
415
416
  });
416
- const assistantMessage = await this.createMessage(chat, ai_agent_types_1.MessageRole.Assistant, { content: ' ', agentName: agentOptions.name }, undefined, excludeSocketId);
417
+ const assistantMessage = await this.createMessage(chat, ai_agent_types_1.MessageRole.Assistant, { content: '', agentName: agentOptions.name }, undefined, excludeSocketId);
417
418
  assistantMessage.content = '';
418
419
  return {
419
420
  userMessage,
@@ -423,14 +424,14 @@ class ChatProcessor {
423
424
  }
424
425
  async streamMessage(chat, payload, excludeSocketId, onAgentStart) {
425
426
  try {
426
- const abortController = index_js_4.agentStore.registerAgentProcess(chat.id);
427
- onAgentStart === null || onAgentStart === void 0 ? void 0 : onAgentStart();
427
+ const abortController = this.agentStore.registerAgentProcess(chat.id);
428
+ onAgentStart?.();
428
429
  let assistantMessage;
429
430
  let agentOptions;
430
431
  const existingMessages = await this.messageRepository.findByChatId(chat.id);
431
432
  // Limit context to prevent exceeding token limits
432
- const limitedMessages = index_js_5.ContextLimiter.limitContext(existingMessages, {
433
- maxMessages: config_js_1.config.ai.maxContextMessages,
433
+ const limitedMessages = helpers_2.ContextLimiter.limitContext(existingMessages, {
434
+ maxMessages: this.config.ai.maxContextMessages,
434
435
  keepFirstUserMessage: true,
435
436
  keepSystemMessages: true,
436
437
  });
@@ -470,32 +471,32 @@ class ChatProcessor {
470
471
  }
471
472
  eventToChunk(event) {
472
473
  switch (event.type) {
473
- case index_js_4.AgentProcessEventType.Update:
474
+ case store_1.AgentProcessEventType.Update:
474
475
  return {
475
476
  type: ai_agent_types_1.StreamChunkType.Message,
476
477
  message: event.data
477
478
  };
478
- case index_js_4.AgentProcessEventType.Error:
479
+ case store_1.AgentProcessEventType.Error:
479
480
  return {
480
481
  type: ai_agent_types_1.StreamChunkType.Error,
481
482
  error: event.data.message || 'Unknown error occurred'
482
483
  };
483
- case index_js_4.AgentProcessEventType.Finished:
484
+ case store_1.AgentProcessEventType.Finished:
484
485
  return {
485
486
  type: ai_agent_types_1.StreamChunkType.Message,
486
487
  message: event.data
487
488
  };
488
- case index_js_4.AgentProcessEventType.Aborted:
489
+ case store_1.AgentProcessEventType.Aborted:
489
490
  // Aborted events don't produce chunks, they just signal stream end
490
491
  return null;
491
- case index_js_4.AgentProcessEventType.Stop:
492
+ case store_1.AgentProcessEventType.Stop:
492
493
  // Stop events don't produce chunks
493
494
  return null;
494
495
  default:
495
496
  return null;
496
497
  }
497
498
  }
498
- getMessageStream(chatId) {
499
+ getMessageStream(chatId, signal) {
499
500
  const stream = new stream_1.PassThrough();
500
501
  let ended = false;
501
502
  const endStream = (error) => {
@@ -503,7 +504,7 @@ class ChatProcessor {
503
504
  return;
504
505
  ended = true;
505
506
  if (error) {
506
- index_js_6.logger.error({ error }, 'Message stream error');
507
+ logger_1.logger.error({ error }, 'Message stream error');
507
508
  }
508
509
  if (!stream.destroyed && !stream.writableEnded) {
509
510
  try {
@@ -511,28 +512,29 @@ class ChatProcessor {
511
512
  stream.end();
512
513
  }
513
514
  catch (e) {
514
- index_js_6.logger.error({ e }, 'Failed to end SSE stream');
515
+ logger_1.logger.error({ e }, 'Failed to end SSE stream');
515
516
  }
516
517
  }
517
518
  };
518
519
  const pushChunk = (chunk) => {
519
- if (ended || stream.destroyed || stream.writableEnded)
520
+ if (ended || stream.destroyed || stream.writableEnded || signal?.aborted)
520
521
  return;
521
522
  stream.write(`data: ${JSON.stringify(chunk)}\n\n`);
522
523
  };
523
524
  const listener = (event) => {
524
- if (ended)
525
+ if (signal?.aborted) {
526
+ endStream();
525
527
  return;
528
+ }
526
529
  try {
527
530
  const chunk = this.eventToChunk(event);
528
531
  if (chunk) {
529
532
  pushChunk(chunk);
530
533
  }
531
- if (event.type === index_js_4.AgentProcessEventType.Finished ||
532
- event.type === index_js_4.AgentProcessEventType.Error ||
533
- event.type === index_js_4.AgentProcessEventType.Aborted) {
534
+ if (event.type === store_1.AgentProcessEventType.Finished ||
535
+ event.type === store_1.AgentProcessEventType.Error ||
536
+ event.type === store_1.AgentProcessEventType.Aborted) {
534
537
  endStream();
535
- index_js_4.agentStore.removeListener(chatId, listener);
536
538
  }
537
539
  }
538
540
  catch (err) {
@@ -541,21 +543,18 @@ class ChatProcessor {
541
543
  error: err instanceof Error ? err.message : 'Unknown error occurred',
542
544
  });
543
545
  endStream(err);
544
- index_js_4.agentStore.removeListener(chatId, listener);
545
546
  }
546
547
  };
547
- // Cleanup on consumer side closing
548
548
  const closeHandler = () => {
549
- index_js_4.agentStore.removeListener(chatId, listener);
549
+ this.agentStore.removeListener(chatId, listener);
550
550
  };
551
551
  const errorHandler = (err) => {
552
- index_js_6.logger.error({ err }, 'Readable stream error');
553
- index_js_4.agentStore.removeListener(chatId, listener);
552
+ signal?.removeEventListener('abort', endStream);
554
553
  endStream(err);
555
554
  };
556
555
  stream.on('close', closeHandler);
557
556
  stream.on('error', errorHandler);
558
- const listenerAttached = index_js_4.agentStore.addListener(chatId, listener);
557
+ const listenerAttached = this.agentStore.addListener(chatId, listener);
559
558
  if (!listenerAttached) {
560
559
  // Remove stream listeners if listener attachment failed to prevent memory leak
561
560
  stream.removeListener('close', closeHandler);
@@ -564,51 +563,28 @@ class ChatProcessor {
564
563
  }
565
564
  return stream;
566
565
  }
567
- async createMessageStream(payload, excludeSocketId) {
566
+ async createMessageStream(payload, excludeSocketId, signal) {
568
567
  const stream = new stream_1.PassThrough();
569
- (async () => {
570
- try {
571
- const chat = await this.upsertAndGetChat(payload, excludeSocketId);
572
- // Send chat metadata first
573
- if (!('chatId' in payload) && !('messageId' in payload) && chat) {
574
- stream.write(`data: ${JSON.stringify({
575
- type: ai_agent_types_1.StreamChunkType.Chat,
576
- chatId: chat.id,
577
- chat,
578
- })}\n\n`);
579
- }
580
- await this.streamMessage(chat, payload, excludeSocketId, async () => {
581
- if (stream.destroyed || stream.writableEnded) {
582
- return;
583
- }
584
- const messageStream = this.getMessageStream(chat.id);
585
- // If client disconnects, destroy inner stream
586
- stream.on('close', () => {
587
- if (!messageStream.destroyed) {
588
- messageStream.destroy();
589
- }
590
- });
591
- await pipelineAsync(messageStream, stream);
592
- });
593
- }
594
- catch (error) {
595
- index_js_6.logger.error({ error }, 'createMessageStream failed');
596
- if (!stream.destroyed && !stream.writableEnded) {
597
- stream.write(`data: ${JSON.stringify({
598
- type: ai_agent_types_1.StreamChunkType.Error,
599
- error: error instanceof Error ? error.message : 'Unknown error occurred',
600
- })}\n\n`);
601
- stream.write('data: [DONE]\n\n');
602
- stream.end();
603
- }
604
- }
605
- })().catch((err) => {
606
- index_js_6.logger.error({ err }, 'Unhandled stream task error');
607
- if (!stream.destroyed)
608
- stream.destroy(err);
568
+ this.runMessageStream(stream, payload, excludeSocketId, signal)
569
+ .catch(err => {
570
+ logger_1.logger.error({ err }, 'Stream task failed');
609
571
  });
610
572
  return stream;
611
573
  }
574
+ async runMessageStream(stream, payload, excludeSocketId, signal) {
575
+ const chat = await this.upsertAndGetChat(payload, excludeSocketId);
576
+ if (!('chatId' in payload) && !('messageId' in payload) && chat) {
577
+ stream.write(`data: ${JSON.stringify({
578
+ type: ai_agent_types_1.StreamChunkType.Chat,
579
+ chatId: chat.id,
580
+ chat,
581
+ })}\n\n`);
582
+ }
583
+ await this.streamMessage(chat, payload, excludeSocketId, () => {
584
+ const messageStream = this.getMessageStream(chat.id, signal);
585
+ messageStream.pipe(stream);
586
+ });
587
+ }
612
588
  }
613
589
  exports.ChatProcessor = ChatProcessor;
614
590
  //# sourceMappingURL=ChatProcessor.js.map