@multiplayer-app/ai-agent-node 0.1.0-beta.8 → 0.1.0-beta.80

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 (338) hide show
  1. package/README.md +2 -2
  2. package/dist/cjs/config.cjs +88 -37
  3. package/dist/cjs/config.cjs.map +1 -1
  4. package/dist/cjs/config.d.ts +62 -23
  5. package/dist/cjs/config.d.ts.map +1 -1
  6. package/dist/cjs/helpers/AIHelper.cjs +134 -68
  7. package/dist/cjs/helpers/AIHelper.cjs.map +1 -1
  8. package/dist/cjs/helpers/AIHelper.d.ts +24 -16
  9. package/dist/cjs/helpers/AIHelper.d.ts.map +1 -1
  10. package/dist/cjs/helpers/AIHelper.test.cjs +22 -15
  11. package/dist/cjs/helpers/AIHelper.test.cjs.map +1 -1
  12. package/dist/cjs/helpers/ConfigHelper.cjs +15 -6
  13. package/dist/cjs/helpers/ConfigHelper.cjs.map +1 -1
  14. package/dist/cjs/helpers/ConfigHelper.d.ts.map +1 -1
  15. package/dist/cjs/helpers/FileHelper.cjs +131 -151
  16. package/dist/cjs/helpers/FileHelper.cjs.map +1 -1
  17. package/dist/cjs/helpers/FileHelper.d.ts +19 -25
  18. package/dist/cjs/helpers/FileHelper.d.ts.map +1 -1
  19. package/dist/cjs/helpers/index.cjs +0 -1
  20. package/dist/cjs/helpers/index.cjs.map +1 -1
  21. package/dist/cjs/helpers/index.d.ts +0 -1
  22. package/dist/cjs/helpers/index.d.ts.map +1 -1
  23. package/dist/cjs/index.cjs +125 -28
  24. package/dist/cjs/index.cjs.map +1 -1
  25. package/dist/cjs/index.d.ts +47 -11
  26. package/dist/cjs/index.d.ts.map +1 -1
  27. package/dist/cjs/libs/index.cjs +0 -1
  28. package/dist/cjs/libs/index.cjs.map +1 -1
  29. package/dist/cjs/libs/index.d.ts +0 -1
  30. package/dist/cjs/libs/index.d.ts.map +1 -1
  31. package/dist/cjs/libs/s3/index.cjs +3 -39
  32. package/dist/cjs/libs/s3/index.cjs.map +1 -1
  33. package/dist/cjs/libs/s3/index.d.ts +1 -2
  34. package/dist/cjs/libs/s3/index.d.ts.map +1 -1
  35. package/dist/cjs/libs/s3/s3.lib.cjs +173 -186
  36. package/dist/cjs/libs/s3/s3.lib.cjs.map +1 -1
  37. package/dist/cjs/libs/s3/s3.lib.d.ts +29 -22
  38. package/dist/cjs/libs/s3/s3.lib.d.ts.map +1 -1
  39. package/dist/cjs/processors/ActivityProcessor.cjs +53 -0
  40. package/dist/cjs/processors/ActivityProcessor.cjs.map +1 -0
  41. package/dist/cjs/processors/ActivityProcessor.d.ts +34 -0
  42. package/dist/cjs/processors/ActivityProcessor.d.ts.map +1 -0
  43. package/dist/cjs/processors/ActivityProcessor.test.cjs +139 -0
  44. package/dist/cjs/processors/ActivityProcessor.test.cjs.map +1 -0
  45. package/dist/cjs/processors/ActivityProcessor.test.d.ts +2 -0
  46. package/dist/cjs/processors/ActivityProcessor.test.d.ts.map +1 -0
  47. package/dist/cjs/processors/AgentProcessor.cjs +47 -0
  48. package/dist/cjs/processors/AgentProcessor.cjs.map +1 -0
  49. package/dist/cjs/processors/AgentProcessor.d.ts +25 -0
  50. package/dist/cjs/processors/AgentProcessor.d.ts.map +1 -0
  51. package/dist/cjs/processors/AgentProcessor.test.cjs +103 -0
  52. package/dist/cjs/processors/AgentProcessor.test.cjs.map +1 -0
  53. package/dist/cjs/processors/AgentProcessor.test.d.ts +2 -0
  54. package/dist/cjs/processors/AgentProcessor.test.d.ts.map +1 -0
  55. package/dist/cjs/processors/ChatProcessor.cjs +1029 -148
  56. package/dist/cjs/processors/ChatProcessor.cjs.map +1 -1
  57. package/dist/cjs/processors/ChatProcessor.d.ts +108 -12
  58. package/dist/cjs/processors/ChatProcessor.d.ts.map +1 -1
  59. package/dist/cjs/processors/ChatProcessor.test.cjs +803 -0
  60. package/dist/cjs/processors/ChatProcessor.test.cjs.map +1 -0
  61. package/dist/cjs/processors/ChatProcessor.test.d.ts +2 -0
  62. package/dist/cjs/processors/ChatProcessor.test.d.ts.map +1 -0
  63. package/dist/cjs/processors/index.cjs +2 -0
  64. package/dist/cjs/processors/index.cjs.map +1 -1
  65. package/dist/cjs/processors/index.d.ts +2 -0
  66. package/dist/cjs/processors/index.d.ts.map +1 -1
  67. package/dist/cjs/services/AIService.cjs +114 -68
  68. package/dist/cjs/services/AIService.cjs.map +1 -1
  69. package/dist/cjs/services/AIService.d.ts +34 -13
  70. package/dist/cjs/services/AIService.d.ts.map +1 -1
  71. package/dist/cjs/services/CredentialProvider.cjs +62 -0
  72. package/dist/cjs/services/CredentialProvider.cjs.map +1 -0
  73. package/dist/cjs/services/CredentialProvider.d.ts +20 -0
  74. package/dist/cjs/services/CredentialProvider.d.ts.map +1 -0
  75. package/dist/cjs/services/CredentialProvider.test.cjs +71 -0
  76. package/dist/cjs/services/CredentialProvider.test.cjs.map +1 -0
  77. package/dist/cjs/services/CredentialProvider.test.d.ts +2 -0
  78. package/dist/cjs/services/CredentialProvider.test.d.ts.map +1 -0
  79. package/dist/cjs/services/ExecutionContext.cjs +3 -0
  80. package/dist/cjs/services/ExecutionContext.cjs.map +1 -0
  81. package/dist/cjs/services/ExecutionContext.d.ts +4 -0
  82. package/dist/cjs/services/ExecutionContext.d.ts.map +1 -0
  83. package/dist/cjs/services/InternalEventsHandler.cjs +3 -3
  84. package/dist/cjs/services/InternalEventsHandler.cjs.map +1 -1
  85. package/dist/cjs/services/InternalEventsHandler.d.ts +3 -1
  86. package/dist/cjs/services/InternalEventsHandler.d.ts.map +1 -1
  87. package/dist/cjs/services/ModelAccessPolicy.cjs +24 -0
  88. package/dist/cjs/services/ModelAccessPolicy.cjs.map +1 -0
  89. package/dist/cjs/services/ModelAccessPolicy.d.ts +7 -0
  90. package/dist/cjs/services/ModelAccessPolicy.d.ts.map +1 -0
  91. package/dist/cjs/services/ModelFetcher.cjs +2 -8
  92. package/dist/cjs/services/ModelFetcher.cjs.map +1 -1
  93. package/dist/cjs/services/ModelFetcher.d.ts +2 -7
  94. package/dist/cjs/services/ModelFetcher.d.ts.map +1 -1
  95. package/dist/cjs/services/ProviderClientFactory.cjs +29 -0
  96. package/dist/cjs/services/ProviderClientFactory.cjs.map +1 -0
  97. package/dist/cjs/services/ProviderClientFactory.d.ts +9 -0
  98. package/dist/cjs/services/ProviderClientFactory.d.ts.map +1 -0
  99. package/dist/cjs/services/RedisService.cjs +20 -16
  100. package/dist/cjs/services/RedisService.cjs.map +1 -1
  101. package/dist/cjs/services/RedisService.d.ts +5 -2
  102. package/dist/cjs/services/RedisService.d.ts.map +1 -1
  103. package/dist/cjs/services/SocketService.cjs +8 -8
  104. package/dist/cjs/services/SocketService.cjs.map +1 -1
  105. package/dist/cjs/services/SocketService.d.ts +9 -6
  106. package/dist/cjs/services/SocketService.d.ts.map +1 -1
  107. package/dist/cjs/services/TenantCredentialResolver.cjs +136 -0
  108. package/dist/cjs/services/TenantCredentialResolver.cjs.map +1 -0
  109. package/dist/cjs/services/TenantCredentialResolver.d.ts +32 -0
  110. package/dist/cjs/services/TenantCredentialResolver.d.ts.map +1 -0
  111. package/dist/cjs/services/TenantCredentialResolver.test.cjs +113 -0
  112. package/dist/cjs/services/TenantCredentialResolver.test.cjs.map +1 -0
  113. package/dist/cjs/services/TenantCredentialResolver.test.d.ts +2 -0
  114. package/dist/cjs/services/TenantCredentialResolver.test.d.ts.map +1 -0
  115. package/dist/cjs/services/index.cjs +5 -1
  116. package/dist/cjs/services/index.cjs.map +1 -1
  117. package/dist/cjs/services/index.d.ts +5 -1
  118. package/dist/cjs/services/index.d.ts.map +1 -1
  119. package/dist/cjs/store/AgentStore.cjs +14 -4
  120. package/dist/cjs/store/AgentStore.cjs.map +1 -1
  121. package/dist/cjs/store/AgentStore.d.ts +3 -1
  122. package/dist/cjs/store/AgentStore.d.ts.map +1 -1
  123. package/dist/cjs/store/ConfigStore.cjs +14 -3
  124. package/dist/cjs/store/ConfigStore.cjs.map +1 -1
  125. package/dist/cjs/store/ConfigStore.d.ts +2 -0
  126. package/dist/cjs/store/ConfigStore.d.ts.map +1 -1
  127. package/dist/cjs/tools/generateChartTool.d.ts +2 -2
  128. package/dist/cjs/tools/proposeFormValuesTool.d.ts +2 -2
  129. package/dist/cjs/tsconfig.cjs.tsbuildinfo +1 -1
  130. package/dist/cjs/utils/utils.cjs +31 -0
  131. package/dist/cjs/utils/utils.cjs.map +1 -0
  132. package/dist/cjs/utils/utils.d.ts +5 -0
  133. package/dist/cjs/utils/utils.d.ts.map +1 -0
  134. package/dist/esm/config.d.ts +62 -23
  135. package/dist/esm/config.d.ts.map +1 -1
  136. package/dist/esm/config.js +88 -35
  137. package/dist/esm/config.js.map +1 -1
  138. package/dist/esm/helpers/AIHelper.d.ts +24 -16
  139. package/dist/esm/helpers/AIHelper.d.ts.map +1 -1
  140. package/dist/esm/helpers/AIHelper.js +141 -73
  141. package/dist/esm/helpers/AIHelper.js.map +1 -1
  142. package/dist/esm/helpers/AIHelper.test.js +22 -15
  143. package/dist/esm/helpers/AIHelper.test.js.map +1 -1
  144. package/dist/esm/helpers/ConfigHelper.d.ts.map +1 -1
  145. package/dist/esm/helpers/ConfigHelper.js +15 -6
  146. package/dist/esm/helpers/ConfigHelper.js.map +1 -1
  147. package/dist/esm/helpers/FileHelper.d.ts +19 -25
  148. package/dist/esm/helpers/FileHelper.d.ts.map +1 -1
  149. package/dist/esm/helpers/FileHelper.js +131 -146
  150. package/dist/esm/helpers/FileHelper.js.map +1 -1
  151. package/dist/esm/helpers/index.d.ts +0 -1
  152. package/dist/esm/helpers/index.d.ts.map +1 -1
  153. package/dist/esm/helpers/index.js +0 -1
  154. package/dist/esm/helpers/index.js.map +1 -1
  155. package/dist/esm/index.d.ts +47 -11
  156. package/dist/esm/index.d.ts.map +1 -1
  157. package/dist/esm/index.js +98 -11
  158. package/dist/esm/index.js.map +1 -1
  159. package/dist/esm/libs/index.d.ts +0 -1
  160. package/dist/esm/libs/index.d.ts.map +1 -1
  161. package/dist/esm/libs/index.js +0 -1
  162. package/dist/esm/libs/index.js.map +1 -1
  163. package/dist/esm/libs/s3/index.d.ts +1 -2
  164. package/dist/esm/libs/s3/index.d.ts.map +1 -1
  165. package/dist/esm/libs/s3/index.js +1 -2
  166. package/dist/esm/libs/s3/index.js.map +1 -1
  167. package/dist/esm/libs/s3/s3.lib.d.ts +29 -22
  168. package/dist/esm/libs/s3/s3.lib.d.ts.map +1 -1
  169. package/dist/esm/libs/s3/s3.lib.js +177 -172
  170. package/dist/esm/libs/s3/s3.lib.js.map +1 -1
  171. package/dist/esm/processors/ActivityProcessor.d.ts +34 -0
  172. package/dist/esm/processors/ActivityProcessor.d.ts.map +1 -0
  173. package/dist/esm/processors/ActivityProcessor.js +50 -0
  174. package/dist/esm/processors/ActivityProcessor.js.map +1 -0
  175. package/dist/esm/processors/ActivityProcessor.test.d.ts +2 -0
  176. package/dist/esm/processors/ActivityProcessor.test.d.ts.map +1 -0
  177. package/dist/esm/processors/ActivityProcessor.test.js +137 -0
  178. package/dist/esm/processors/ActivityProcessor.test.js.map +1 -0
  179. package/dist/esm/processors/AgentProcessor.d.ts +25 -0
  180. package/dist/esm/processors/AgentProcessor.d.ts.map +1 -0
  181. package/dist/esm/processors/AgentProcessor.js +44 -0
  182. package/dist/esm/processors/AgentProcessor.js.map +1 -0
  183. package/dist/esm/processors/AgentProcessor.test.d.ts +2 -0
  184. package/dist/esm/processors/AgentProcessor.test.d.ts.map +1 -0
  185. package/dist/esm/processors/AgentProcessor.test.js +101 -0
  186. package/dist/esm/processors/AgentProcessor.test.js.map +1 -0
  187. package/dist/esm/processors/ChatProcessor.d.ts +108 -12
  188. package/dist/esm/processors/ChatProcessor.d.ts.map +1 -1
  189. package/dist/esm/processors/ChatProcessor.js +1038 -150
  190. package/dist/esm/processors/ChatProcessor.js.map +1 -1
  191. package/dist/esm/processors/ChatProcessor.test.d.ts +2 -0
  192. package/dist/esm/processors/ChatProcessor.test.d.ts.map +1 -0
  193. package/dist/esm/processors/ChatProcessor.test.js +801 -0
  194. package/dist/esm/processors/ChatProcessor.test.js.map +1 -0
  195. package/dist/esm/processors/index.d.ts +2 -0
  196. package/dist/esm/processors/index.d.ts.map +1 -1
  197. package/dist/esm/processors/index.js +2 -0
  198. package/dist/esm/processors/index.js.map +1 -1
  199. package/dist/esm/services/AIService.d.ts +34 -13
  200. package/dist/esm/services/AIService.d.ts.map +1 -1
  201. package/dist/esm/services/AIService.js +118 -68
  202. package/dist/esm/services/AIService.js.map +1 -1
  203. package/dist/esm/services/CredentialProvider.d.ts +20 -0
  204. package/dist/esm/services/CredentialProvider.d.ts.map +1 -0
  205. package/dist/esm/services/CredentialProvider.js +60 -0
  206. package/dist/esm/services/CredentialProvider.js.map +1 -0
  207. package/dist/esm/services/CredentialProvider.test.d.ts +2 -0
  208. package/dist/esm/services/CredentialProvider.test.d.ts.map +1 -0
  209. package/dist/esm/services/CredentialProvider.test.js +69 -0
  210. package/dist/esm/services/CredentialProvider.test.js.map +1 -0
  211. package/dist/esm/services/ExecutionContext.d.ts +4 -0
  212. package/dist/esm/services/ExecutionContext.d.ts.map +1 -0
  213. package/dist/esm/services/ExecutionContext.js +2 -0
  214. package/dist/esm/services/ExecutionContext.js.map +1 -0
  215. package/dist/esm/services/InternalEventsHandler.d.ts +3 -1
  216. package/dist/esm/services/InternalEventsHandler.d.ts.map +1 -1
  217. package/dist/esm/services/InternalEventsHandler.js +4 -3
  218. package/dist/esm/services/InternalEventsHandler.js.map +1 -1
  219. package/dist/esm/services/ModelAccessPolicy.d.ts +7 -0
  220. package/dist/esm/services/ModelAccessPolicy.d.ts.map +1 -0
  221. package/dist/esm/services/ModelAccessPolicy.js +20 -0
  222. package/dist/esm/services/ModelAccessPolicy.js.map +1 -0
  223. package/dist/esm/services/ModelFetcher.d.ts +2 -7
  224. package/dist/esm/services/ModelFetcher.d.ts.map +1 -1
  225. package/dist/esm/services/ModelFetcher.js +2 -8
  226. package/dist/esm/services/ModelFetcher.js.map +1 -1
  227. package/dist/esm/services/ProviderClientFactory.d.ts +9 -0
  228. package/dist/esm/services/ProviderClientFactory.d.ts.map +1 -0
  229. package/dist/esm/services/ProviderClientFactory.js +25 -0
  230. package/dist/esm/services/ProviderClientFactory.js.map +1 -0
  231. package/dist/esm/services/RedisService.d.ts +5 -2
  232. package/dist/esm/services/RedisService.d.ts.map +1 -1
  233. package/dist/esm/services/RedisService.js +21 -14
  234. package/dist/esm/services/RedisService.js.map +1 -1
  235. package/dist/esm/services/SocketService.d.ts +9 -6
  236. package/dist/esm/services/SocketService.d.ts.map +1 -1
  237. package/dist/esm/services/SocketService.js +10 -6
  238. package/dist/esm/services/SocketService.js.map +1 -1
  239. package/dist/esm/services/TenantCredentialResolver.d.ts +32 -0
  240. package/dist/esm/services/TenantCredentialResolver.d.ts.map +1 -0
  241. package/dist/esm/services/TenantCredentialResolver.js +133 -0
  242. package/dist/esm/services/TenantCredentialResolver.js.map +1 -0
  243. package/dist/esm/services/TenantCredentialResolver.test.d.ts +2 -0
  244. package/dist/esm/services/TenantCredentialResolver.test.d.ts.map +1 -0
  245. package/dist/esm/services/TenantCredentialResolver.test.js +111 -0
  246. package/dist/esm/services/TenantCredentialResolver.test.js.map +1 -0
  247. package/dist/esm/services/index.d.ts +5 -1
  248. package/dist/esm/services/index.d.ts.map +1 -1
  249. package/dist/esm/services/index.js +5 -1
  250. package/dist/esm/services/index.js.map +1 -1
  251. package/dist/esm/store/AgentStore.d.ts +3 -1
  252. package/dist/esm/store/AgentStore.d.ts.map +1 -1
  253. package/dist/esm/store/AgentStore.js +15 -2
  254. package/dist/esm/store/AgentStore.js.map +1 -1
  255. package/dist/esm/store/ConfigStore.d.ts +2 -0
  256. package/dist/esm/store/ConfigStore.d.ts.map +1 -1
  257. package/dist/esm/store/ConfigStore.js +14 -3
  258. package/dist/esm/store/ConfigStore.js.map +1 -1
  259. package/dist/esm/tools/generateChartTool.d.ts +2 -2
  260. package/dist/esm/tools/proposeFormValuesTool.d.ts +2 -2
  261. package/dist/esm/tsconfig.esm.tsbuildinfo +1 -1
  262. package/dist/esm/utils/utils.d.ts +5 -0
  263. package/dist/esm/utils/utils.d.ts.map +1 -0
  264. package/dist/esm/utils/utils.js +26 -0
  265. package/dist/esm/utils/utils.js.map +1 -0
  266. package/package.json +7 -8
  267. package/dist/cjs/helpers/SetupHelper.cjs +0 -37
  268. package/dist/cjs/helpers/SetupHelper.cjs.map +0 -1
  269. package/dist/cjs/helpers/SetupHelper.d.ts +0 -5
  270. package/dist/cjs/helpers/SetupHelper.d.ts.map +0 -1
  271. package/dist/cjs/libs/kafka/config.cjs +0 -8
  272. package/dist/cjs/libs/kafka/config.cjs.map +0 -1
  273. package/dist/cjs/libs/kafka/config.d.ts +0 -5
  274. package/dist/cjs/libs/kafka/config.d.ts.map +0 -1
  275. package/dist/cjs/libs/kafka/consumer.cjs +0 -131
  276. package/dist/cjs/libs/kafka/consumer.cjs.map +0 -1
  277. package/dist/cjs/libs/kafka/consumer.d.ts +0 -16
  278. package/dist/cjs/libs/kafka/consumer.d.ts.map +0 -1
  279. package/dist/cjs/libs/kafka/index.cjs +0 -19
  280. package/dist/cjs/libs/kafka/index.cjs.map +0 -1
  281. package/dist/cjs/libs/kafka/index.d.ts +0 -3
  282. package/dist/cjs/libs/kafka/index.d.ts.map +0 -1
  283. package/dist/cjs/libs/kafka/kafka.cjs +0 -27
  284. package/dist/cjs/libs/kafka/kafka.cjs.map +0 -1
  285. package/dist/cjs/libs/kafka/kafka.d.ts +0 -3
  286. package/dist/cjs/libs/kafka/kafka.d.ts.map +0 -1
  287. package/dist/cjs/libs/kafka/producer.cjs +0 -48
  288. package/dist/cjs/libs/kafka/producer.cjs.map +0 -1
  289. package/dist/cjs/libs/kafka/producer.d.ts +0 -11
  290. package/dist/cjs/libs/kafka/producer.d.ts.map +0 -1
  291. package/dist/cjs/libs/logger/config.cjs +0 -8
  292. package/dist/cjs/libs/logger/config.cjs.map +0 -1
  293. package/dist/cjs/libs/logger/config.d.ts +0 -5
  294. package/dist/cjs/libs/logger/config.d.ts.map +0 -1
  295. package/dist/cjs/libs/s3/config.cjs +0 -10
  296. package/dist/cjs/libs/s3/config.cjs.map +0 -1
  297. package/dist/cjs/libs/s3/config.d.ts +0 -7
  298. package/dist/cjs/libs/s3/config.d.ts.map +0 -1
  299. package/dist/cjs/services/KafkaService.cjs +0 -122
  300. package/dist/cjs/services/KafkaService.cjs.map +0 -1
  301. package/dist/cjs/services/KafkaService.d.ts +0 -35
  302. package/dist/cjs/services/KafkaService.d.ts.map +0 -1
  303. package/dist/esm/helpers/SetupHelper.d.ts +0 -5
  304. package/dist/esm/helpers/SetupHelper.d.ts.map +0 -1
  305. package/dist/esm/helpers/SetupHelper.js +0 -32
  306. package/dist/esm/helpers/SetupHelper.js.map +0 -1
  307. package/dist/esm/libs/kafka/config.d.ts +0 -5
  308. package/dist/esm/libs/kafka/config.d.ts.map +0 -1
  309. package/dist/esm/libs/kafka/config.js +0 -5
  310. package/dist/esm/libs/kafka/config.js.map +0 -1
  311. package/dist/esm/libs/kafka/consumer.d.ts +0 -16
  312. package/dist/esm/libs/kafka/consumer.d.ts.map +0 -1
  313. package/dist/esm/libs/kafka/consumer.js +0 -125
  314. package/dist/esm/libs/kafka/consumer.js.map +0 -1
  315. package/dist/esm/libs/kafka/index.d.ts +0 -3
  316. package/dist/esm/libs/kafka/index.d.ts.map +0 -1
  317. package/dist/esm/libs/kafka/index.js +0 -3
  318. package/dist/esm/libs/kafka/index.js.map +0 -1
  319. package/dist/esm/libs/kafka/kafka.d.ts +0 -3
  320. package/dist/esm/libs/kafka/kafka.d.ts.map +0 -1
  321. package/dist/esm/libs/kafka/kafka.js +0 -24
  322. package/dist/esm/libs/kafka/kafka.js.map +0 -1
  323. package/dist/esm/libs/kafka/producer.d.ts +0 -11
  324. package/dist/esm/libs/kafka/producer.d.ts.map +0 -1
  325. package/dist/esm/libs/kafka/producer.js +0 -45
  326. package/dist/esm/libs/kafka/producer.js.map +0 -1
  327. package/dist/esm/libs/logger/config.d.ts +0 -5
  328. package/dist/esm/libs/logger/config.d.ts.map +0 -1
  329. package/dist/esm/libs/logger/config.js +0 -5
  330. package/dist/esm/libs/logger/config.js.map +0 -1
  331. package/dist/esm/libs/s3/config.d.ts +0 -7
  332. package/dist/esm/libs/s3/config.d.ts.map +0 -1
  333. package/dist/esm/libs/s3/config.js +0 -7
  334. package/dist/esm/libs/s3/config.js.map +0 -1
  335. package/dist/esm/services/KafkaService.d.ts +0 -35
  336. package/dist/esm/services/KafkaService.d.ts.map +0 -1
  337. package/dist/esm/services/KafkaService.js +0 -123
  338. package/dist/esm/services/KafkaService.js.map +0 -1
@@ -0,0 +1,801 @@
1
+ import { describe, it, expect, beforeEach, vi } from 'vitest';
2
+ import { ChatProcessor } from './ChatProcessor';
3
+ import { MessageRole, AgentStatus, ChatType, AgentToolCallStatus } from '@multiplayer-app/ai-agent-types';
4
+ import { ConfigStore } from '../store/ConfigStore';
5
+ import { ModelStore } from '../store/ModelStore';
6
+ import { ConfigProvider } from '../config';
7
+ import { S3Lib } from '../libs/s3';
8
+ import { z } from 'zod';
9
+ describe('ChatProcessor.streamMessage', () => {
10
+ let chatProcessor;
11
+ let mockChatRepository;
12
+ let mockMessageRepository;
13
+ let mockAgentConfigRepository;
14
+ let mockArtifactStore;
15
+ let mockAgentStore;
16
+ let mockSocketService;
17
+ let mockActivityRepository;
18
+ let configStore;
19
+ let capturedOptions;
20
+ const userId = 'test-user-id';
21
+ beforeEach(() => {
22
+ vi.clearAllMocks();
23
+ capturedOptions = undefined;
24
+ ModelStore.getInstance().setModels([
25
+ { id: 'openai/gpt-4o', provider: 'openai', label: 'GPT-4o' }
26
+ ]);
27
+ // Mock repositories
28
+ mockChatRepository = {
29
+ findById: vi.fn(),
30
+ find: vi.fn().mockResolvedValue([]),
31
+ create: vi.fn(),
32
+ update: vi.fn(),
33
+ delete: vi.fn(),
34
+ findWithMessages: vi.fn(),
35
+ };
36
+ mockMessageRepository = {
37
+ findByChatId: vi.fn().mockResolvedValue([]),
38
+ findByChatIdPaginated: vi.fn().mockResolvedValue({ messages: [], hasMore: false }),
39
+ findById: vi.fn(),
40
+ create: vi.fn(),
41
+ deleteByChatId: vi.fn(),
42
+ update: vi.fn().mockImplementation(async (id, updates) => ({
43
+ id,
44
+ chat: 'test-chat-id',
45
+ role: MessageRole.Assistant,
46
+ content: '',
47
+ createdAt: new Date().toISOString(),
48
+ ...updates
49
+ })),
50
+ };
51
+ mockAgentConfigRepository = {
52
+ findByUserIdAndAgentName: vi.fn().mockResolvedValue(null),
53
+ };
54
+ // Mock artifact store
55
+ mockArtifactStore = {
56
+ listArtifacts: vi.fn().mockReturnValue([]),
57
+ deleteArtifacts: vi.fn(),
58
+ };
59
+ // Mock agent store
60
+ mockAgentStore = {
61
+ registerAgentProcess: vi.fn().mockReturnValue({
62
+ signal: new AbortController().signal,
63
+ }),
64
+ shareAgentProcessEvent: vi.fn(),
65
+ addListener: vi.fn(),
66
+ removeListener: vi.fn(),
67
+ };
68
+ // Mock socket service
69
+ mockSocketService = {
70
+ emitMessageUpdate: vi.fn(),
71
+ emitChatUpdate: vi.fn(),
72
+ };
73
+ // Setup config store with agent config
74
+ configStore = ConfigStore.getInstance();
75
+ configStore.clear();
76
+ const agentConfig = {
77
+ name: 'test-agent',
78
+ description: 'Test agent for property verification',
79
+ defaultModel: 'openai/gpt-4o',
80
+ systemPrompt: 'You are a helpful assistant',
81
+ temperature: 0.8,
82
+ maxOutputTokens: 3000,
83
+ topP: 0.95,
84
+ topK: 50,
85
+ presencePenalty: 0.6,
86
+ frequencyPenalty: 0.4,
87
+ stopSequences: ['\n\n', '---', 'END'],
88
+ seed: 42,
89
+ tools: [],
90
+ toolChoice: 'auto',
91
+ };
92
+ // Use addAgent to bypass ConfigHelper conversion
93
+ configStore.addAgent(['test-context'], agentConfig);
94
+ const config = ConfigProvider.getInstance().getConfig();
95
+ const s3Lib = new S3Lib(config.s3);
96
+ mockActivityRepository = {
97
+ create: vi.fn().mockResolvedValue({
98
+ id: 'activity-1',
99
+ ownerId: 'test-chat-id',
100
+ groupId: 'test-chat-id',
101
+ name: 'Message processing',
102
+ tenants: { userId: 'test-user-id' },
103
+ sourceId: 'user-msg-1',
104
+ sourceType: 'AgentMessage',
105
+ metadata: {}
106
+ }),
107
+ update: vi.fn().mockResolvedValue({
108
+ id: 'activity-1',
109
+ ownerId: 'test-chat-id',
110
+ groupId: 'test-chat-id',
111
+ name: 'Message processing',
112
+ tenants: { userId: 'test-user-id' },
113
+ sourceId: 'user-msg-1',
114
+ sourceType: 'AgentMessage',
115
+ metadata: {}
116
+ }),
117
+ deleteByGroupId: vi.fn().mockResolvedValue(1),
118
+ getGroupedMetadataByParentId: vi.fn().mockResolvedValue({}),
119
+ updateMetadata: vi.fn().mockResolvedValue({
120
+ id: 'activity-1',
121
+ metadata: {}
122
+ }),
123
+ };
124
+ // Create ChatProcessor
125
+ chatProcessor = new ChatProcessor({
126
+ chatRepository: mockChatRepository,
127
+ messageRepository: mockMessageRepository,
128
+ agentConfigRepository: mockAgentConfigRepository,
129
+ artifactStore: mockArtifactStore,
130
+ s3Lib,
131
+ config,
132
+ socketService: mockSocketService,
133
+ agentStore: mockAgentStore,
134
+ activityRepository: mockActivityRepository
135
+ });
136
+ });
137
+ it('should delete chat, messages, activities, and artifacts', async () => {
138
+ mockChatRepository.delete.mockResolvedValue(true);
139
+ await chatProcessor.deleteChat('chat-1');
140
+ expect(mockChatRepository.delete).toHaveBeenCalledWith('chat-1');
141
+ expect(mockMessageRepository.deleteByChatId).toHaveBeenCalledWith('chat-1');
142
+ expect(mockActivityRepository.deleteByGroupId).toHaveBeenCalledWith('chat-1');
143
+ expect(mockArtifactStore.deleteArtifacts).toHaveBeenCalledWith('chat-1');
144
+ });
145
+ it('should throw when chat does not exist and skip cleanup', async () => {
146
+ mockChatRepository.delete.mockResolvedValue(false);
147
+ await expect(chatProcessor.deleteChat('missing-chat')).rejects.toThrow('Chat not found');
148
+ expect(mockMessageRepository.deleteByChatId).not.toHaveBeenCalled();
149
+ expect(mockActivityRepository.deleteByGroupId).not.toHaveBeenCalled();
150
+ expect(mockArtifactStore.deleteArtifacts).not.toHaveBeenCalled();
151
+ });
152
+ it('should cascade delete subagent descendants (single level)', async () => {
153
+ mockChatRepository.delete.mockResolvedValue(true);
154
+ mockChatRepository.find.mockImplementation(async (filter) => {
155
+ if (filter?.parentChatId === 'chat-1') {
156
+ return [
157
+ { id: 'sub-a', parentChatId: 'chat-1' },
158
+ { id: 'sub-b', parentChatId: 'chat-1' },
159
+ ];
160
+ }
161
+ return [];
162
+ });
163
+ await chatProcessor.deleteChat('chat-1');
164
+ expect(mockChatRepository.delete).toHaveBeenCalledWith('chat-1');
165
+ expect(mockChatRepository.delete).toHaveBeenCalledWith('sub-a');
166
+ expect(mockChatRepository.delete).toHaveBeenCalledWith('sub-b');
167
+ for (const id of ['chat-1', 'sub-a', 'sub-b']) {
168
+ expect(mockMessageRepository.deleteByChatId).toHaveBeenCalledWith(id);
169
+ expect(mockActivityRepository.deleteByGroupId).toHaveBeenCalledWith(id);
170
+ expect(mockArtifactStore.deleteArtifacts).toHaveBeenCalledWith(id);
171
+ }
172
+ });
173
+ it('should cascade delete nested subagent descendants', async () => {
174
+ mockChatRepository.delete.mockResolvedValue(true);
175
+ const tree = {
176
+ 'chat-1': [{ id: 'sub-a' }, { id: 'sub-b' }],
177
+ 'sub-a': [{ id: 'sub-a-1' }],
178
+ 'sub-a-1': [{ id: 'sub-a-1-x' }],
179
+ 'sub-b': [],
180
+ 'sub-a-1-x': [],
181
+ };
182
+ mockChatRepository.find.mockImplementation(async (filter) => tree[filter?.parentChatId ?? ''] ?? []);
183
+ await chatProcessor.deleteChat('chat-1');
184
+ const expectedIds = ['chat-1', 'sub-a', 'sub-b', 'sub-a-1', 'sub-a-1-x'];
185
+ for (const id of expectedIds) {
186
+ expect(mockChatRepository.delete).toHaveBeenCalledWith(id);
187
+ expect(mockMessageRepository.deleteByChatId).toHaveBeenCalledWith(id);
188
+ expect(mockActivityRepository.deleteByGroupId).toHaveBeenCalledWith(id);
189
+ expect(mockArtifactStore.deleteArtifacts).toHaveBeenCalledWith(id);
190
+ }
191
+ });
192
+ it('should pass all agent properties correctly to streamAssistantResponse', async () => {
193
+ const chat = {
194
+ id: 'test-chat-id',
195
+ tenants: { userId },
196
+ contextKey: 'test-context',
197
+ type: ChatType.Chat,
198
+ status: AgentStatus.Processing,
199
+ createdAt: new Date().toISOString(),
200
+ updatedAt: new Date().toISOString(),
201
+ };
202
+ const payload = {
203
+ chatId: chat.id,
204
+ content: 'Hello, test message',
205
+ contextKey: 'test-context',
206
+ };
207
+ // Mock chat repository
208
+ mockChatRepository.findById.mockResolvedValue(chat);
209
+ // Mock message creation
210
+ const userMessage = {
211
+ id: 'user-msg-1',
212
+ chat: chat.id,
213
+ role: MessageRole.User,
214
+ content: payload.content,
215
+ createdAt: new Date().toISOString(),
216
+ };
217
+ const assistantMessage = {
218
+ id: 'assistant-msg-1',
219
+ chat: chat.id,
220
+ role: MessageRole.Assistant,
221
+ content: '',
222
+ createdAt: new Date().toISOString(),
223
+ agentName: 'test-agent',
224
+ };
225
+ mockMessageRepository.create
226
+ .mockResolvedValueOnce(userMessage)
227
+ .mockResolvedValueOnce(assistantMessage);
228
+ // Mock stream to prevent actual API calls
229
+ const mockStream = {
230
+ fullStream: (async function* () {
231
+ yield { type: 'finish', finishReason: 'stop', text: 'Test response' };
232
+ })(),
233
+ };
234
+ // Capture options passed to streamAssistantResponse
235
+ const aiHelper = chatProcessor.aiHelper;
236
+ vi.spyOn(aiHelper, 'streamAssistantResponse').mockImplementation(async (messages, signal, options) => {
237
+ capturedOptions = options;
238
+ return mockStream;
239
+ });
240
+ // Call streamMessage
241
+ await chatProcessor.streamMessage(chat, payload);
242
+ // Verify options were captured
243
+ expect(capturedOptions).toBeDefined();
244
+ // Verify all agent properties are present in the options
245
+ if (capturedOptions) {
246
+ expect(capturedOptions).toHaveProperty('name', 'test-agent');
247
+ expect(capturedOptions).toHaveProperty('system', 'You are a helpful assistant');
248
+ expect(capturedOptions).toHaveProperty('temperature', 0.8);
249
+ expect(capturedOptions).toHaveProperty('maxOutputTokens', 3000);
250
+ expect(capturedOptions).toHaveProperty('topP', 0.95);
251
+ expect(capturedOptions).toHaveProperty('topK', 50);
252
+ expect(capturedOptions).toHaveProperty('presencePenalty', 0.6);
253
+ expect(capturedOptions).toHaveProperty('frequencyPenalty', 0.4);
254
+ expect(capturedOptions).toHaveProperty('stopSequences', ['\n\n', '---', 'END']);
255
+ expect(capturedOptions).toHaveProperty('seed', 42);
256
+ expect(capturedOptions).toHaveProperty('toolChoice', 'auto');
257
+ expect(capturedOptions).toHaveProperty('tools');
258
+ }
259
+ });
260
+ it('should handle optional agent properties when not provided', async () => {
261
+ configStore.clear();
262
+ const minimalAgentConfig = {
263
+ name: 'minimal-agent',
264
+ description: 'Minimal agent config',
265
+ systemPrompt: 'You are helpful',
266
+ tools: [],
267
+ };
268
+ configStore.addAgent(['test-context'], minimalAgentConfig);
269
+ const chat = {
270
+ id: 'test-chat-id-2',
271
+ tenants: { userId },
272
+ contextKey: 'test-context',
273
+ type: ChatType.Chat,
274
+ status: AgentStatus.Processing,
275
+ createdAt: new Date().toISOString(),
276
+ updatedAt: new Date().toISOString(),
277
+ };
278
+ const payload = {
279
+ chatId: chat.id,
280
+ content: 'Test',
281
+ contextKey: 'test-context',
282
+ };
283
+ mockChatRepository.findById.mockResolvedValue(chat);
284
+ const userMessage = {
285
+ id: 'user-msg-2',
286
+ chat: chat.id,
287
+ role: MessageRole.User,
288
+ content: payload.content,
289
+ createdAt: new Date().toISOString(),
290
+ };
291
+ const assistantMessage = {
292
+ id: 'assistant-msg-2',
293
+ chat: chat.id,
294
+ role: MessageRole.Assistant,
295
+ content: '',
296
+ createdAt: new Date().toISOString(),
297
+ agentName: 'minimal-agent',
298
+ };
299
+ mockMessageRepository.create
300
+ .mockResolvedValueOnce(userMessage)
301
+ .mockResolvedValueOnce(assistantMessage);
302
+ const mockStream = {
303
+ fullStream: (async function* () {
304
+ yield { type: 'finish', finishReason: 'stop', text: 'Response' };
305
+ })(),
306
+ };
307
+ const aiHelper = chatProcessor.aiHelper;
308
+ vi.spyOn(aiHelper, 'streamAssistantResponse').mockImplementation(async (messages, signal, options) => {
309
+ capturedOptions = options;
310
+ return mockStream;
311
+ });
312
+ await chatProcessor.streamMessage(chat, payload);
313
+ // Verify required properties are present
314
+ expect(capturedOptions).toBeDefined();
315
+ if (capturedOptions) {
316
+ expect(capturedOptions).toHaveProperty('name', 'minimal-agent');
317
+ expect(capturedOptions).toHaveProperty('system', 'You are helpful');
318
+ expect(capturedOptions).toHaveProperty('tools');
319
+ }
320
+ });
321
+ it('should pass stopWhen condition when provided', async () => {
322
+ configStore.clear();
323
+ const stopWhenFn = vi.fn(() => false);
324
+ const agentConfigWithStopWhen = {
325
+ name: 'agent-with-stopwhen',
326
+ description: 'Agent with stopWhen',
327
+ systemPrompt: 'You are helpful',
328
+ tools: [],
329
+ stopWhen: stopWhenFn,
330
+ };
331
+ configStore.addAgent(['test-context'], agentConfigWithStopWhen);
332
+ const chat = {
333
+ id: 'test-chat-id-3',
334
+ tenants: { userId },
335
+ contextKey: 'test-context',
336
+ type: ChatType.Chat,
337
+ status: AgentStatus.Processing,
338
+ createdAt: new Date().toISOString(),
339
+ updatedAt: new Date().toISOString(),
340
+ };
341
+ const payload = {
342
+ chatId: chat.id,
343
+ content: 'Test',
344
+ contextKey: 'test-context',
345
+ };
346
+ mockChatRepository.findById.mockResolvedValue(chat);
347
+ const userMessage = {
348
+ id: 'user-msg-3',
349
+ chat: chat.id,
350
+ role: MessageRole.User,
351
+ content: payload.content,
352
+ createdAt: new Date().toISOString(),
353
+ };
354
+ const assistantMessage = {
355
+ id: 'assistant-msg-3',
356
+ chat: chat.id,
357
+ role: MessageRole.Assistant,
358
+ content: '',
359
+ createdAt: new Date().toISOString(),
360
+ agentName: 'agent-with-stopwhen',
361
+ };
362
+ mockMessageRepository.create
363
+ .mockResolvedValueOnce(userMessage)
364
+ .mockResolvedValueOnce(assistantMessage);
365
+ const mockStream = {
366
+ fullStream: (async function* () {
367
+ yield { type: 'finish', finishReason: 'stop', text: 'Response' };
368
+ })(),
369
+ };
370
+ const aiHelper = chatProcessor.aiHelper;
371
+ vi.spyOn(aiHelper, 'streamAssistantResponse').mockImplementation(async (messages, signal, options) => {
372
+ capturedOptions = options;
373
+ return mockStream;
374
+ });
375
+ await chatProcessor.streamMessage(chat, payload);
376
+ // Verify stopWhen is passed
377
+ expect(capturedOptions).toBeDefined();
378
+ if (capturedOptions) {
379
+ expect(capturedOptions).toHaveProperty('stopWhen', stopWhenFn);
380
+ }
381
+ });
382
+ it('should merge only cost-related provider usage into stored activity metadata', async () => {
383
+ const chat = {
384
+ id: 'test-chat-id-usage',
385
+ tenants: { userId },
386
+ contextKey: 'test-context',
387
+ type: ChatType.Chat,
388
+ status: AgentStatus.Processing,
389
+ createdAt: new Date().toISOString(),
390
+ updatedAt: new Date().toISOString(),
391
+ };
392
+ await chatProcessor.storeStepActivity({
393
+ chat,
394
+ stepResult: {
395
+ finishReason: 'stop',
396
+ usage: {
397
+ inputTokens: 205,
398
+ outputTokens: 3,
399
+ totalTokens: 209,
400
+ inputTokenDetails: { cacheReadTokens: 0 },
401
+ },
402
+ response: {
403
+ timestamp: new Date().toISOString(),
404
+ modelId: 'openai/gpt-4o',
405
+ },
406
+ providerMetadata: {
407
+ openrouter: {
408
+ provider: 'OpenAI',
409
+ usage: {
410
+ promptTokens: 205,
411
+ promptTokensDetails: { cachedTokens: 0 },
412
+ completionTokens: 3,
413
+ totalTokens: 208,
414
+ cost: 0.0005425,
415
+ costDetails: {
416
+ upstreamInferenceCost: 0.0005425,
417
+ },
418
+ },
419
+ },
420
+ },
421
+ },
422
+ name: 'titleGeneration',
423
+ sourceId: chat.id,
424
+ sourceType: 'Chat',
425
+ });
426
+ expect(mockActivityRepository.create).toHaveBeenCalledTimes(1);
427
+ const [activityPayload] = mockActivityRepository.create.mock.calls[0];
428
+ expect(activityPayload.metadata.usage).toMatchObject({
429
+ inputTokens: 205,
430
+ outputTokens: 3,
431
+ totalTokens: 209,
432
+ inputTokenDetails: { cacheReadTokens: 0 },
433
+ cost: 0.0005425,
434
+ costDetails: { upstreamInferenceCost: 0.0005425 },
435
+ });
436
+ expect(activityPayload.metadata.usage.promptTokens).toBeUndefined();
437
+ expect(activityPayload.metadata.usage.completionTokens).toBeUndefined();
438
+ expect(activityPayload.metadata.usage.promptTokensDetails).toBeUndefined();
439
+ });
440
+ });
441
+ describe('ChatProcessor.getMessages', () => {
442
+ let chatProcessor;
443
+ let mockChatRepository;
444
+ let mockMessageRepository;
445
+ let mockAgentConfigRepository;
446
+ let mockActivityRepository;
447
+ beforeEach(() => {
448
+ vi.clearAllMocks();
449
+ mockChatRepository = { findById: vi.fn() };
450
+ mockMessageRepository = {
451
+ findByChatIdPaginated: vi.fn().mockResolvedValue({ messages: [], hasMore: false }),
452
+ };
453
+ mockAgentConfigRepository = {
454
+ findByUserIdAndAgentName: vi.fn().mockResolvedValue(null),
455
+ };
456
+ mockActivityRepository = {
457
+ create: vi.fn(),
458
+ update: vi.fn(),
459
+ deleteByGroupId: vi.fn(),
460
+ };
461
+ const config = ConfigProvider.getInstance().getConfig();
462
+ const s3Lib = new S3Lib(config.s3);
463
+ chatProcessor = new ChatProcessor({
464
+ chatRepository: mockChatRepository,
465
+ messageRepository: mockMessageRepository,
466
+ agentConfigRepository: mockAgentConfigRepository,
467
+ artifactStore: { listArtifacts: vi.fn().mockReturnValue([]), deleteArtifacts: vi.fn() },
468
+ s3Lib,
469
+ config,
470
+ socketService: { emitMessageUpdate: vi.fn(), emitChatUpdate: vi.fn() },
471
+ agentStore: {
472
+ registerAgentProcess: vi.fn().mockReturnValue({ signal: new AbortController().signal }),
473
+ shareAgentProcessEvent: vi.fn(),
474
+ addListener: vi.fn(),
475
+ removeListener: vi.fn(),
476
+ },
477
+ activityRepository: mockActivityRepository,
478
+ });
479
+ const aiHelper = chatProcessor.aiHelper;
480
+ vi.spyOn(aiHelper, 'getAgentOptions').mockResolvedValue({
481
+ name: 'test-agent',
482
+ tools: {
483
+ test_tool: {
484
+ inputSchema: z.object({
485
+ foo: z.any().optional(),
486
+ count: z.any().optional(),
487
+ x: z.any().optional(),
488
+ }),
489
+ },
490
+ },
491
+ });
492
+ });
493
+ it('returns messages page when chat exists', async () => {
494
+ const chatId = 'chat-1';
495
+ const messages = [
496
+ {
497
+ id: 'm1',
498
+ chat: chatId,
499
+ role: MessageRole.User,
500
+ content: 'Hi',
501
+ createdAt: new Date().toISOString(),
502
+ },
503
+ ];
504
+ mockChatRepository.findById.mockResolvedValue({ id: chatId });
505
+ mockMessageRepository.findByChatIdPaginated.mockResolvedValue({
506
+ messages,
507
+ hasMore: true,
508
+ });
509
+ const result = await chatProcessor.getMessages(chatId, { limit: 30 });
510
+ expect(result).toEqual({ messages, hasMore: true });
511
+ expect(mockMessageRepository.findByChatIdPaginated).toHaveBeenCalledWith(chatId, {
512
+ limit: 30,
513
+ before: undefined,
514
+ });
515
+ });
516
+ it('throws when chat not found', async () => {
517
+ mockChatRepository.findById.mockResolvedValue(null);
518
+ await expect(chatProcessor.getMessages('missing-chat')).rejects.toThrow('Chat not found');
519
+ expect(mockMessageRepository.findByChatIdPaginated).not.toHaveBeenCalled();
520
+ });
521
+ });
522
+ describe('ChatProcessor.updateToolCall', () => {
523
+ let chatProcessor;
524
+ let mockChatRepository;
525
+ let mockMessageRepository;
526
+ let mockAgentConfigRepository;
527
+ let mockActivityRepository;
528
+ let mockSocketService;
529
+ beforeEach(() => {
530
+ vi.clearAllMocks();
531
+ mockChatRepository = {
532
+ findById: vi.fn(),
533
+ update: vi.fn(),
534
+ };
535
+ mockMessageRepository = {
536
+ findById: vi.fn(),
537
+ updateToolCall: vi.fn(),
538
+ };
539
+ mockAgentConfigRepository = {
540
+ findByUserIdAndAgentName: vi.fn().mockResolvedValue(null),
541
+ };
542
+ mockActivityRepository = {
543
+ create: vi.fn(),
544
+ update: vi.fn(),
545
+ deleteByGroupId: vi.fn(),
546
+ };
547
+ mockSocketService = {
548
+ emitMessageUpdate: vi.fn(),
549
+ emitChatUpdate: vi.fn(),
550
+ };
551
+ const config = ConfigProvider.getInstance().getConfig();
552
+ const s3Lib = new S3Lib(config.s3);
553
+ chatProcessor = new ChatProcessor({
554
+ chatRepository: mockChatRepository,
555
+ messageRepository: mockMessageRepository,
556
+ agentConfigRepository: mockAgentConfigRepository,
557
+ artifactStore: { listArtifacts: vi.fn().mockReturnValue([]), deleteArtifacts: vi.fn() },
558
+ s3Lib,
559
+ config,
560
+ socketService: mockSocketService,
561
+ agentStore: {
562
+ registerAgentProcess: vi.fn().mockReturnValue({ signal: new AbortController().signal }),
563
+ shareAgentProcessEvent: vi.fn(),
564
+ addListener: vi.fn(),
565
+ removeListener: vi.fn(),
566
+ },
567
+ activityRepository: mockActivityRepository,
568
+ });
569
+ });
570
+ it('updates targeted tool call input and emits update', async () => {
571
+ const chatId = 'chat-1';
572
+ const messageId = 'message-1';
573
+ const toolCallId = 'tool-call-1';
574
+ const userId = 'user-1';
575
+ const updatedInput = { foo: 'bar', count: 1 };
576
+ const now = new Date().toISOString();
577
+ mockChatRepository.findById.mockResolvedValue({
578
+ id: chatId,
579
+ tenants: { userId },
580
+ });
581
+ mockMessageRepository.findById.mockResolvedValue({
582
+ id: messageId,
583
+ chat: chatId,
584
+ role: MessageRole.Assistant,
585
+ content: '',
586
+ createdAt: now,
587
+ toolCalls: [
588
+ {
589
+ id: toolCallId,
590
+ name: 'test_tool',
591
+ input: { foo: 'old' },
592
+ status: AgentToolCallStatus.Pending,
593
+ },
594
+ ],
595
+ });
596
+ mockMessageRepository.updateToolCall.mockResolvedValue({
597
+ id: messageId,
598
+ chat: chatId,
599
+ role: MessageRole.Assistant,
600
+ content: '',
601
+ createdAt: now,
602
+ toolCalls: [
603
+ {
604
+ id: toolCallId,
605
+ name: 'test_tool',
606
+ input: updatedInput,
607
+ status: AgentToolCallStatus.Pending,
608
+ },
609
+ ],
610
+ });
611
+ const aiHelper = chatProcessor.aiHelper;
612
+ vi.spyOn(aiHelper, 'getAgentOptions').mockResolvedValue({
613
+ name: 'test-agent',
614
+ tools: {
615
+ test_tool: {
616
+ inputSchema: z.object({
617
+ foo: z.any().optional(),
618
+ count: z.any().optional(),
619
+ }),
620
+ },
621
+ },
622
+ });
623
+ const result = await chatProcessor.updateToolCall({
624
+ chatId,
625
+ messageId,
626
+ toolCallId,
627
+ input: updatedInput,
628
+ excludeSocketId: 'socket-1',
629
+ });
630
+ expect(mockMessageRepository.updateToolCall).toHaveBeenCalledWith(messageId, toolCallId, {
631
+ input: updatedInput,
632
+ });
633
+ expect(mockChatRepository.update).toHaveBeenCalledWith(chatId, expect.objectContaining({ updatedAt: expect.any(String) }));
634
+ expect(mockSocketService.emitMessageUpdate).toHaveBeenCalledWith(userId, result, 'socket-1');
635
+ expect(result.toolCalls?.[0].input).toEqual(updatedInput);
636
+ });
637
+ it('updates targeted tool call output and status', async () => {
638
+ const chatId = 'chat-1';
639
+ const messageId = 'message-1';
640
+ const toolCallId = 'tool-call-1';
641
+ const userId = 'user-1';
642
+ const now = new Date().toISOString();
643
+ mockChatRepository.findById.mockResolvedValue({
644
+ id: chatId,
645
+ tenants: { userId },
646
+ });
647
+ mockMessageRepository.findById.mockResolvedValue({
648
+ id: messageId,
649
+ chat: chatId,
650
+ role: MessageRole.Assistant,
651
+ content: '',
652
+ createdAt: now,
653
+ toolCalls: [
654
+ {
655
+ id: toolCallId,
656
+ name: 'test_tool',
657
+ input: { foo: 'old' },
658
+ status: AgentToolCallStatus.Running,
659
+ },
660
+ ],
661
+ });
662
+ mockMessageRepository.updateToolCall.mockResolvedValue({
663
+ id: messageId,
664
+ chat: chatId,
665
+ role: MessageRole.Assistant,
666
+ content: '',
667
+ createdAt: now,
668
+ toolCalls: [
669
+ {
670
+ id: toolCallId,
671
+ name: 'test_tool',
672
+ input: { foo: 'old' },
673
+ output: { result: 'ok' },
674
+ status: AgentToolCallStatus.Succeeded,
675
+ },
676
+ ],
677
+ });
678
+ const result = await chatProcessor.updateToolCall({
679
+ chatId,
680
+ messageId,
681
+ toolCallId,
682
+ output: { result: 'ok' },
683
+ status: AgentToolCallStatus.Succeeded,
684
+ excludeSocketId: 'socket-1',
685
+ });
686
+ expect(mockMessageRepository.updateToolCall).toHaveBeenCalledWith(messageId, toolCallId, {
687
+ output: { result: 'ok' },
688
+ status: AgentToolCallStatus.Succeeded,
689
+ });
690
+ expect(mockChatRepository.update).toHaveBeenCalledWith(chatId, expect.objectContaining({ updatedAt: expect.any(String) }));
691
+ expect(mockSocketService.emitMessageUpdate).toHaveBeenCalledWith(userId, result, 'socket-1');
692
+ expect(result.toolCalls?.[0].status).toBe(AgentToolCallStatus.Succeeded);
693
+ expect(result.toolCalls?.[0].output).toEqual({ result: 'ok' });
694
+ });
695
+ it('throws when message is not in chat', async () => {
696
+ mockChatRepository.findById.mockResolvedValue({ id: 'chat-1', tenants: { userId: 'user-1' } });
697
+ mockMessageRepository.findById.mockResolvedValue({
698
+ id: 'message-1',
699
+ chat: 'other-chat',
700
+ role: MessageRole.Assistant,
701
+ content: '',
702
+ createdAt: new Date().toISOString(),
703
+ toolCalls: [],
704
+ });
705
+ await expect(chatProcessor.updateToolCall({
706
+ chatId: 'chat-1',
707
+ messageId: 'message-1',
708
+ toolCallId: 'tool-call-1',
709
+ input: { x: 1 },
710
+ })).rejects.toThrow('Message not found or does not belong to this chat');
711
+ expect(mockMessageRepository.updateToolCall).not.toHaveBeenCalled();
712
+ });
713
+ it('throws when chat does not belong to user', async () => {
714
+ mockChatRepository.findById.mockResolvedValue({ id: 'chat-1', tenants: { userId: 'owner-1' } });
715
+ await expect(chatProcessor.updateToolCall({
716
+ chatId: 'chat-1',
717
+ messageId: 'message-1',
718
+ toolCallId: 'tool-call-1',
719
+ userId: 'other-user',
720
+ input: { x: 1 },
721
+ })).rejects.toThrow('Chat does not belong to this user');
722
+ expect(mockMessageRepository.findById).not.toHaveBeenCalled();
723
+ expect(mockMessageRepository.updateToolCall).not.toHaveBeenCalled();
724
+ });
725
+ it('throws when tool call does not exist in message', async () => {
726
+ mockChatRepository.findById.mockResolvedValue({ id: 'chat-1', tenants: { userId: 'user-1' } });
727
+ mockMessageRepository.findById.mockResolvedValue({
728
+ id: 'message-1',
729
+ chat: 'chat-1',
730
+ role: MessageRole.Assistant,
731
+ content: '',
732
+ createdAt: new Date().toISOString(),
733
+ toolCalls: [
734
+ {
735
+ id: 'other-tool-call',
736
+ name: 'test_tool',
737
+ input: {},
738
+ status: AgentToolCallStatus.Pending,
739
+ },
740
+ ],
741
+ });
742
+ await expect(chatProcessor.updateToolCall({
743
+ chatId: 'chat-1',
744
+ messageId: 'message-1',
745
+ toolCallId: 'tool-call-1',
746
+ input: { x: 1 },
747
+ })).rejects.toThrow('Tool call not found in message');
748
+ expect(mockMessageRepository.updateToolCall).not.toHaveBeenCalled();
749
+ });
750
+ it('throws when no tool call fields are provided', async () => {
751
+ await expect(chatProcessor.updateToolCall({
752
+ chatId: 'chat-1',
753
+ messageId: 'message-1',
754
+ toolCallId: 'tool-call-1',
755
+ })).rejects.toThrow('At least one of input, output, or status must be provided');
756
+ });
757
+ it('throws when input does not match tool schema', async () => {
758
+ const chatId = 'chat-1';
759
+ const messageId = 'message-1';
760
+ const toolCallId = 'tool-call-1';
761
+ mockChatRepository.findById.mockResolvedValue({
762
+ id: chatId,
763
+ tenants: { userId: 'user-1' },
764
+ });
765
+ mockMessageRepository.findById.mockResolvedValue({
766
+ id: messageId,
767
+ chat: chatId,
768
+ role: MessageRole.Assistant,
769
+ content: '',
770
+ createdAt: new Date().toISOString(),
771
+ toolCalls: [
772
+ {
773
+ id: toolCallId,
774
+ name: 'test_tool',
775
+ input: {},
776
+ status: AgentToolCallStatus.Pending,
777
+ },
778
+ ],
779
+ agentName: 'test-agent',
780
+ });
781
+ const aiHelper = chatProcessor.aiHelper;
782
+ vi.spyOn(aiHelper, 'getAgentOptions').mockResolvedValue({
783
+ name: 'test-agent',
784
+ tools: {
785
+ test_tool: {
786
+ inputSchema: z.object({
787
+ x: z.number(),
788
+ }),
789
+ },
790
+ },
791
+ });
792
+ await expect(chatProcessor.updateToolCall({
793
+ chatId,
794
+ messageId,
795
+ toolCallId,
796
+ input: { x: 'invalid' },
797
+ })).rejects.toThrow('Invalid tool input for "test_tool"');
798
+ expect(mockMessageRepository.updateToolCall).not.toHaveBeenCalled();
799
+ });
800
+ });
801
+ //# sourceMappingURL=ChatProcessor.test.js.map