@ainetwork/adk 0.2.8 → 0.2.9

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 (346) hide show
  1. package/dist/cjs/chunk-2P3ZBNVN.cjs +45 -0
  2. package/dist/cjs/chunk-2P3ZBNVN.cjs.map +1 -0
  3. package/dist/cjs/chunk-7ESFEJUT.cjs +28 -0
  4. package/dist/cjs/chunk-7ESFEJUT.cjs.map +1 -0
  5. package/dist/cjs/{chunk-W4PRBE6H.cjs → chunk-G3KWCMMQ.cjs} +32 -10
  6. package/dist/cjs/chunk-G3KWCMMQ.cjs.map +1 -0
  7. package/dist/cjs/{chunk-4PFJ7PDN.cjs → chunk-GRWMMQKZ.cjs} +6 -6
  8. package/dist/cjs/{chunk-4PFJ7PDN.cjs.map → chunk-GRWMMQKZ.cjs.map} +1 -1
  9. package/dist/cjs/{chunk-OAPMGKE2.cjs → chunk-MI5VAHHI.cjs} +13 -7
  10. package/dist/cjs/chunk-MI5VAHHI.cjs.map +1 -0
  11. package/dist/cjs/chunk-MT722JJC.cjs +1 -0
  12. package/dist/cjs/chunk-MT722JJC.cjs.map +1 -0
  13. package/dist/cjs/{chunk-IKPQ52KY.cjs → chunk-QZHI7LLI.cjs} +1 -1
  14. package/dist/cjs/chunk-QZHI7LLI.cjs.map +1 -0
  15. package/dist/cjs/chunk-S6BHSEXF.cjs +26 -0
  16. package/dist/cjs/chunk-S6BHSEXF.cjs.map +1 -0
  17. package/dist/cjs/{chunk-2GJKQSDQ.cjs → chunk-UJTLE7TA.cjs} +3 -3
  18. package/dist/cjs/{chunk-45H4WOKN.cjs.map → chunk-UJTLE7TA.cjs.map} +1 -1
  19. package/dist/cjs/{chunk-MADCWTBO.cjs → chunk-W224GBH7.cjs} +1 -1
  20. package/dist/cjs/{chunk-CD3RWOCR.cjs.map → chunk-W224GBH7.cjs.map} +1 -1
  21. package/dist/cjs/{chunk-AY3PG2UZ.cjs → chunk-WZF2QFLS.cjs} +13 -7
  22. package/dist/cjs/chunk-WZF2QFLS.cjs.map +1 -0
  23. package/dist/cjs/controllers/index.cjs +4 -4
  24. package/dist/cjs/controllers/intent.controller.cjs +7 -0
  25. package/dist/cjs/controllers/intent.controller.cjs.map +1 -0
  26. package/dist/cjs/index.cjs +28 -21
  27. package/dist/cjs/index.cjs.map +1 -1
  28. package/dist/cjs/modules/a2a/a2a.module.cjs +3 -3
  29. package/dist/cjs/modules/index.cjs +7 -7
  30. package/dist/cjs/modules/index.cjs.map +1 -1
  31. package/dist/cjs/routes/a2a.routes.cjs +5 -5
  32. package/dist/cjs/routes/api.routes.cjs +5 -5
  33. package/dist/cjs/routes/index.cjs +16 -16
  34. package/dist/cjs/routes/index.cjs.map +1 -1
  35. package/dist/cjs/routes/intent.routes.cjs +20 -0
  36. package/dist/cjs/routes/intent.routes.cjs.map +1 -0
  37. package/dist/cjs/routes/query.routes.cjs +8 -8
  38. package/dist/cjs/services/index.cjs +18 -8
  39. package/dist/cjs/services/index.cjs.map +1 -1
  40. package/dist/cjs/services/intents/fulfill-stream.service.cjs +3 -3
  41. package/dist/cjs/services/intents/fulfill.service.cjs +3 -3
  42. package/dist/cjs/services/query-stream.service.cjs +4 -4
  43. package/dist/cjs/services/query.service.cjs +4 -4
  44. package/dist/cjs/services/thread.service.cjs +7 -0
  45. package/dist/cjs/services/thread.service.cjs.map +1 -0
  46. package/dist/cjs/types/memory.cjs +2 -2
  47. package/dist/esm/{chunk-IRGR2OHS.js → chunk-6GA26MT4.js} +10 -4
  48. package/dist/esm/{chunk-IRGR2OHS.js.map → chunk-6GA26MT4.js.map} +1 -1
  49. package/dist/esm/chunk-F3QXERC7.js +28 -0
  50. package/dist/esm/chunk-F3QXERC7.js.map +1 -0
  51. package/dist/esm/{chunk-X6JNM3XR.js → chunk-GRN6CHNO.js} +1 -1
  52. package/dist/esm/{chunk-X6JNM3XR.js.map → chunk-GRN6CHNO.js.map} +1 -1
  53. package/dist/esm/{chunk-F3I4URTX.js → chunk-KLQLM5LJ.js} +4 -4
  54. package/dist/esm/{chunk-EYZ5Z7FG.js → chunk-LOFJBMHT.js} +1 -1
  55. package/dist/esm/chunk-LOFJBMHT.js.map +1 -0
  56. package/dist/esm/{chunk-SHQWRBWS.js → chunk-NWL3BMUH.js} +3 -7
  57. package/dist/esm/chunk-NWL3BMUH.js.map +1 -0
  58. package/dist/esm/{chunk-E2RV322Z.js → chunk-QCK645XC.js} +24 -2
  59. package/dist/esm/chunk-QCK645XC.js.map +1 -0
  60. package/dist/esm/{chunk-XTPDMHUI.js → chunk-TZMPHS6S.js} +10 -4
  61. package/dist/esm/{chunk-XTPDMHUI.js.map → chunk-TZMPHS6S.js.map} +1 -1
  62. package/dist/esm/chunk-U7REZSMO.js +1 -0
  63. package/dist/esm/chunk-U7REZSMO.js.map +1 -0
  64. package/dist/esm/{chunk-5T7E533R.js → chunk-WOW36XUD.js} +2 -2
  65. package/dist/esm/chunk-WZQVH4XY.js +45 -0
  66. package/dist/esm/chunk-WZQVH4XY.js.map +1 -0
  67. package/dist/esm/chunk-YUKPKFX5.js +26 -0
  68. package/dist/esm/chunk-YUKPKFX5.js.map +1 -0
  69. package/dist/esm/{chunk-6OHUQ6DV.js → chunk-ZOWTQAV5.js} +3 -3
  70. package/dist/esm/controllers/index.js +3 -3
  71. package/dist/esm/controllers/intent.controller.d.ts +19 -0
  72. package/dist/esm/controllers/intent.controller.js +7 -0
  73. package/dist/esm/controllers/intent.controller.js.map +1 -0
  74. package/dist/esm/index.js +20 -13
  75. package/dist/esm/index.js.map +1 -1
  76. package/dist/esm/modules/a2a/a2a.module.js +2 -2
  77. package/dist/esm/modules/index.js +8 -8
  78. package/dist/esm/routes/a2a.routes.js +5 -5
  79. package/dist/esm/routes/api.routes.js +4 -4
  80. package/dist/esm/routes/index.js +14 -14
  81. package/dist/esm/routes/intent.routes.d.ts +24 -0
  82. package/dist/esm/routes/intent.routes.js +20 -0
  83. package/dist/esm/routes/intent.routes.js.map +1 -0
  84. package/dist/esm/routes/query.routes.js +7 -7
  85. package/dist/esm/services/index.d.ts +3 -0
  86. package/dist/esm/services/index.js +17 -7
  87. package/dist/esm/services/intents/fulfill-stream.service.d.ts +2 -2
  88. package/dist/esm/services/intents/fulfill-stream.service.js +2 -2
  89. package/dist/esm/services/intents/fulfill.service.d.ts +2 -2
  90. package/dist/esm/services/intents/fulfill.service.js +2 -2
  91. package/dist/esm/services/query-stream.service.js +4 -4
  92. package/dist/esm/services/query.service.js +4 -4
  93. package/dist/esm/services/thread.service.d.ts +13 -0
  94. package/dist/esm/services/thread.service.js +7 -0
  95. package/dist/esm/services/thread.service.js.map +1 -0
  96. package/dist/esm/types/memory.d.ts +1 -0
  97. package/dist/esm/types/memory.js +1 -1
  98. package/package.json +1 -1
  99. package/dist/cjs/chunk-2GJKQSDQ.cjs.map +0 -1
  100. package/dist/cjs/chunk-2NKMH5DO.cjs +0 -43
  101. package/dist/cjs/chunk-2NKMH5DO.cjs.map +0 -1
  102. package/dist/cjs/chunk-2UK6RDHB.cjs +0 -337
  103. package/dist/cjs/chunk-2UK6RDHB.cjs.map +0 -1
  104. package/dist/cjs/chunk-3BPHCG6M.cjs +0 -30
  105. package/dist/cjs/chunk-3BPHCG6M.cjs.map +0 -1
  106. package/dist/cjs/chunk-3GPSKXKA.cjs +0 -43
  107. package/dist/cjs/chunk-3GPSKXKA.cjs.map +0 -1
  108. package/dist/cjs/chunk-3IB2WAKN.cjs +0 -37
  109. package/dist/cjs/chunk-3IB2WAKN.cjs.map +0 -1
  110. package/dist/cjs/chunk-3SYBDGMH.cjs +0 -37
  111. package/dist/cjs/chunk-3SYBDGMH.cjs.map +0 -1
  112. package/dist/cjs/chunk-45H4WOKN.cjs +0 -37
  113. package/dist/cjs/chunk-4TK4MTAR.cjs +0 -17
  114. package/dist/cjs/chunk-4TK4MTAR.cjs.map +0 -1
  115. package/dist/cjs/chunk-5ARBSKWU.cjs +0 -43
  116. package/dist/cjs/chunk-5ARBSKWU.cjs.map +0 -1
  117. package/dist/cjs/chunk-5WNANWIO.cjs +0 -43
  118. package/dist/cjs/chunk-5WNANWIO.cjs.map +0 -1
  119. package/dist/cjs/chunk-67EDI57F.cjs +0 -37
  120. package/dist/cjs/chunk-67EDI57F.cjs.map +0 -1
  121. package/dist/cjs/chunk-6S376RMW.cjs +0 -338
  122. package/dist/cjs/chunk-6S376RMW.cjs.map +0 -1
  123. package/dist/cjs/chunk-6UHPYXKS.cjs +0 -381
  124. package/dist/cjs/chunk-6UHPYXKS.cjs.map +0 -1
  125. package/dist/cjs/chunk-7HH3N36Q.cjs +0 -43
  126. package/dist/cjs/chunk-7HH3N36Q.cjs.map +0 -1
  127. package/dist/cjs/chunk-7J5DYKDJ.cjs +0 -376
  128. package/dist/cjs/chunk-7J5DYKDJ.cjs.map +0 -1
  129. package/dist/cjs/chunk-7Y3W3SIL.cjs +0 -37
  130. package/dist/cjs/chunk-7Y3W3SIL.cjs.map +0 -1
  131. package/dist/cjs/chunk-AEYHJEGM.cjs +0 -26
  132. package/dist/cjs/chunk-AEYHJEGM.cjs.map +0 -1
  133. package/dist/cjs/chunk-AIAIY7IU.cjs +0 -43
  134. package/dist/cjs/chunk-AIAIY7IU.cjs.map +0 -1
  135. package/dist/cjs/chunk-APGW3LWW.cjs +0 -43
  136. package/dist/cjs/chunk-APGW3LWW.cjs.map +0 -1
  137. package/dist/cjs/chunk-AWLDQTED.cjs +0 -257
  138. package/dist/cjs/chunk-AWLDQTED.cjs.map +0 -1
  139. package/dist/cjs/chunk-AXLG6NY4.cjs +0 -337
  140. package/dist/cjs/chunk-AXLG6NY4.cjs.map +0 -1
  141. package/dist/cjs/chunk-AY3PG2UZ.cjs.map +0 -1
  142. package/dist/cjs/chunk-B2XCYG4C.cjs +0 -43
  143. package/dist/cjs/chunk-B2XCYG4C.cjs.map +0 -1
  144. package/dist/cjs/chunk-BAPJ7AYM.cjs +0 -43
  145. package/dist/cjs/chunk-BAPJ7AYM.cjs.map +0 -1
  146. package/dist/cjs/chunk-BFWJLMUR.cjs +0 -43
  147. package/dist/cjs/chunk-BFWJLMUR.cjs.map +0 -1
  148. package/dist/cjs/chunk-BGEBE36B.cjs +0 -43
  149. package/dist/cjs/chunk-BGEBE36B.cjs.map +0 -1
  150. package/dist/cjs/chunk-BIDIP5MX.cjs +0 -37
  151. package/dist/cjs/chunk-BIDIP5MX.cjs.map +0 -1
  152. package/dist/cjs/chunk-BKU7EWEM.cjs +0 -37
  153. package/dist/cjs/chunk-BKU7EWEM.cjs.map +0 -1
  154. package/dist/cjs/chunk-C5V4X3ZH.cjs +0 -364
  155. package/dist/cjs/chunk-C5V4X3ZH.cjs.map +0 -1
  156. package/dist/cjs/chunk-C77OTZYZ.cjs +0 -43
  157. package/dist/cjs/chunk-C77OTZYZ.cjs.map +0 -1
  158. package/dist/cjs/chunk-C7SJ2X3X.cjs +0 -43
  159. package/dist/cjs/chunk-C7SJ2X3X.cjs.map +0 -1
  160. package/dist/cjs/chunk-CD3RWOCR.cjs +0 -18
  161. package/dist/cjs/chunk-CEUCTNAJ.cjs +0 -43
  162. package/dist/cjs/chunk-CEUCTNAJ.cjs.map +0 -1
  163. package/dist/cjs/chunk-CIV2QV4C.cjs +0 -43
  164. package/dist/cjs/chunk-CIV2QV4C.cjs.map +0 -1
  165. package/dist/cjs/chunk-CKE4RRTI.cjs +0 -378
  166. package/dist/cjs/chunk-CKE4RRTI.cjs.map +0 -1
  167. package/dist/cjs/chunk-EEND2E3Y.cjs +0 -37
  168. package/dist/cjs/chunk-EEND2E3Y.cjs.map +0 -1
  169. package/dist/cjs/chunk-ET7NGSCR.cjs +0 -382
  170. package/dist/cjs/chunk-ET7NGSCR.cjs.map +0 -1
  171. package/dist/cjs/chunk-EXKLB7FF.cjs +0 -18
  172. package/dist/cjs/chunk-EXKLB7FF.cjs.map +0 -1
  173. package/dist/cjs/chunk-F6LFBKIF.cjs +0 -43
  174. package/dist/cjs/chunk-F6LFBKIF.cjs.map +0 -1
  175. package/dist/cjs/chunk-FCIBDAL5.cjs +0 -364
  176. package/dist/cjs/chunk-FCIBDAL5.cjs.map +0 -1
  177. package/dist/cjs/chunk-FGBHPONX.cjs +0 -43
  178. package/dist/cjs/chunk-FGBHPONX.cjs.map +0 -1
  179. package/dist/cjs/chunk-FJ2S5TGS.cjs +0 -37
  180. package/dist/cjs/chunk-FJ2S5TGS.cjs.map +0 -1
  181. package/dist/cjs/chunk-FZEACIU2.cjs +0 -37
  182. package/dist/cjs/chunk-FZEACIU2.cjs.map +0 -1
  183. package/dist/cjs/chunk-GAXPKI2P.cjs +0 -364
  184. package/dist/cjs/chunk-GAXPKI2P.cjs.map +0 -1
  185. package/dist/cjs/chunk-GBQXIGWQ.cjs +0 -37
  186. package/dist/cjs/chunk-GBQXIGWQ.cjs.map +0 -1
  187. package/dist/cjs/chunk-GGP6URMG.cjs +0 -43
  188. package/dist/cjs/chunk-GGP6URMG.cjs.map +0 -1
  189. package/dist/cjs/chunk-GO2OLIWF.cjs +0 -359
  190. package/dist/cjs/chunk-GO2OLIWF.cjs.map +0 -1
  191. package/dist/cjs/chunk-GYIACLMZ.cjs +0 -376
  192. package/dist/cjs/chunk-GYIACLMZ.cjs.map +0 -1
  193. package/dist/cjs/chunk-GZE5BVB2.cjs +0 -361
  194. package/dist/cjs/chunk-GZE5BVB2.cjs.map +0 -1
  195. package/dist/cjs/chunk-HPCNM6XP.cjs +0 -25
  196. package/dist/cjs/chunk-HPCNM6XP.cjs.map +0 -1
  197. package/dist/cjs/chunk-HXRGFZL7.cjs +0 -360
  198. package/dist/cjs/chunk-HXRGFZL7.cjs.map +0 -1
  199. package/dist/cjs/chunk-IC5TWI4A.cjs +0 -37
  200. package/dist/cjs/chunk-IC5TWI4A.cjs.map +0 -1
  201. package/dist/cjs/chunk-ICTSMRXC.cjs +0 -360
  202. package/dist/cjs/chunk-ICTSMRXC.cjs.map +0 -1
  203. package/dist/cjs/chunk-IH4I2JTE.cjs +0 -348
  204. package/dist/cjs/chunk-IH4I2JTE.cjs.map +0 -1
  205. package/dist/cjs/chunk-IKPQ52KY.cjs.map +0 -1
  206. package/dist/cjs/chunk-J5WX6GPC.cjs +0 -43
  207. package/dist/cjs/chunk-J5WX6GPC.cjs.map +0 -1
  208. package/dist/cjs/chunk-J7GCQY3S.cjs +0 -18
  209. package/dist/cjs/chunk-J7GCQY3S.cjs.map +0 -1
  210. package/dist/cjs/chunk-JFLQREPM.cjs +0 -37
  211. package/dist/cjs/chunk-JFLQREPM.cjs.map +0 -1
  212. package/dist/cjs/chunk-JO6AZASU.cjs +0 -37
  213. package/dist/cjs/chunk-JO6AZASU.cjs.map +0 -1
  214. package/dist/cjs/chunk-JUPAGIP4.cjs +0 -43
  215. package/dist/cjs/chunk-JUPAGIP4.cjs.map +0 -1
  216. package/dist/cjs/chunk-JWIVQT6C.cjs +0 -37
  217. package/dist/cjs/chunk-JWIVQT6C.cjs.map +0 -1
  218. package/dist/cjs/chunk-JYHYAQQ2.cjs +0 -43
  219. package/dist/cjs/chunk-JYHYAQQ2.cjs.map +0 -1
  220. package/dist/cjs/chunk-K6HWDDNX.cjs +0 -367
  221. package/dist/cjs/chunk-K6HWDDNX.cjs.map +0 -1
  222. package/dist/cjs/chunk-K6J5XJRM.cjs +0 -382
  223. package/dist/cjs/chunk-K6J5XJRM.cjs.map +0 -1
  224. package/dist/cjs/chunk-KAF2EDPZ.cjs +0 -123
  225. package/dist/cjs/chunk-KAF2EDPZ.cjs.map +0 -1
  226. package/dist/cjs/chunk-KBWHLMA4.cjs +0 -26
  227. package/dist/cjs/chunk-KBWHLMA4.cjs.map +0 -1
  228. package/dist/cjs/chunk-KH25JPQS.cjs +0 -256
  229. package/dist/cjs/chunk-KH25JPQS.cjs.map +0 -1
  230. package/dist/cjs/chunk-KHAIZONV.cjs +0 -43
  231. package/dist/cjs/chunk-KHAIZONV.cjs.map +0 -1
  232. package/dist/cjs/chunk-KQ4MBNUW.cjs +0 -43
  233. package/dist/cjs/chunk-KQ4MBNUW.cjs.map +0 -1
  234. package/dist/cjs/chunk-L5ZICBT4.cjs +0 -37
  235. package/dist/cjs/chunk-L5ZICBT4.cjs.map +0 -1
  236. package/dist/cjs/chunk-MADCWTBO.cjs.map +0 -1
  237. package/dist/cjs/chunk-MV6L3NPY.cjs +0 -164
  238. package/dist/cjs/chunk-MV6L3NPY.cjs.map +0 -1
  239. package/dist/cjs/chunk-MXDXXOXE.cjs +0 -126
  240. package/dist/cjs/chunk-MXDXXOXE.cjs.map +0 -1
  241. package/dist/cjs/chunk-N6VAOFEP.cjs +0 -37
  242. package/dist/cjs/chunk-N6VAOFEP.cjs.map +0 -1
  243. package/dist/cjs/chunk-NWMGBXPZ.cjs +0 -37
  244. package/dist/cjs/chunk-NWMGBXPZ.cjs.map +0 -1
  245. package/dist/cjs/chunk-OAPMGKE2.cjs.map +0 -1
  246. package/dist/cjs/chunk-OCGEXAVI.cjs +0 -373
  247. package/dist/cjs/chunk-OCGEXAVI.cjs.map +0 -1
  248. package/dist/cjs/chunk-OOSRLRNL.cjs +0 -37
  249. package/dist/cjs/chunk-OOSRLRNL.cjs.map +0 -1
  250. package/dist/cjs/chunk-ORLXR6OZ.cjs +0 -257
  251. package/dist/cjs/chunk-ORLXR6OZ.cjs.map +0 -1
  252. package/dist/cjs/chunk-OZKAPLCE.cjs +0 -43
  253. package/dist/cjs/chunk-OZKAPLCE.cjs.map +0 -1
  254. package/dist/cjs/chunk-P42QPS2N.cjs +0 -43
  255. package/dist/cjs/chunk-P42QPS2N.cjs.map +0 -1
  256. package/dist/cjs/chunk-PHTT7NVZ.cjs +0 -37
  257. package/dist/cjs/chunk-PHTT7NVZ.cjs.map +0 -1
  258. package/dist/cjs/chunk-PNN5WGWA.cjs +0 -43
  259. package/dist/cjs/chunk-PNN5WGWA.cjs.map +0 -1
  260. package/dist/cjs/chunk-Q673YXOW.cjs +0 -37
  261. package/dist/cjs/chunk-Q673YXOW.cjs.map +0 -1
  262. package/dist/cjs/chunk-QCEMS4A3.cjs +0 -168
  263. package/dist/cjs/chunk-QCEMS4A3.cjs.map +0 -1
  264. package/dist/cjs/chunk-QV2CSL6T.cjs +0 -352
  265. package/dist/cjs/chunk-QV2CSL6T.cjs.map +0 -1
  266. package/dist/cjs/chunk-QW4T5RFB.cjs +0 -374
  267. package/dist/cjs/chunk-QW4T5RFB.cjs.map +0 -1
  268. package/dist/cjs/chunk-RA62RT7K.cjs +0 -43
  269. package/dist/cjs/chunk-RA62RT7K.cjs.map +0 -1
  270. package/dist/cjs/chunk-RXMGXWLH.cjs +0 -352
  271. package/dist/cjs/chunk-RXMGXWLH.cjs.map +0 -1
  272. package/dist/cjs/chunk-SEJO6F5X.cjs +0 -43
  273. package/dist/cjs/chunk-SEJO6F5X.cjs.map +0 -1
  274. package/dist/cjs/chunk-SMKJY53T.cjs +0 -367
  275. package/dist/cjs/chunk-SMKJY53T.cjs.map +0 -1
  276. package/dist/cjs/chunk-SUWC3YAJ.cjs +0 -359
  277. package/dist/cjs/chunk-SUWC3YAJ.cjs.map +0 -1
  278. package/dist/cjs/chunk-SZU5VCQL.cjs +0 -256
  279. package/dist/cjs/chunk-SZU5VCQL.cjs.map +0 -1
  280. package/dist/cjs/chunk-T2CE7W67.cjs +0 -43
  281. package/dist/cjs/chunk-T2CE7W67.cjs.map +0 -1
  282. package/dist/cjs/chunk-TBQF2VIX.cjs +0 -43
  283. package/dist/cjs/chunk-TBQF2VIX.cjs.map +0 -1
  284. package/dist/cjs/chunk-TK2MNTOI.cjs +0 -43
  285. package/dist/cjs/chunk-TK2MNTOI.cjs.map +0 -1
  286. package/dist/cjs/chunk-TOVEWQW2.cjs +0 -43
  287. package/dist/cjs/chunk-TOVEWQW2.cjs.map +0 -1
  288. package/dist/cjs/chunk-TS46OIE7.cjs +0 -252
  289. package/dist/cjs/chunk-TS46OIE7.cjs.map +0 -1
  290. package/dist/cjs/chunk-UDLSTQ4I.cjs +0 -21
  291. package/dist/cjs/chunk-UDLSTQ4I.cjs.map +0 -1
  292. package/dist/cjs/chunk-UFVWBUJM.cjs +0 -365
  293. package/dist/cjs/chunk-UFVWBUJM.cjs.map +0 -1
  294. package/dist/cjs/chunk-USDDAUYF.cjs +0 -364
  295. package/dist/cjs/chunk-USDDAUYF.cjs.map +0 -1
  296. package/dist/cjs/chunk-UUWWBHFR.cjs +0 -37
  297. package/dist/cjs/chunk-UUWWBHFR.cjs.map +0 -1
  298. package/dist/cjs/chunk-UVN2DE6N.cjs +0 -368
  299. package/dist/cjs/chunk-UVN2DE6N.cjs.map +0 -1
  300. package/dist/cjs/chunk-VVLC6T66.cjs +0 -37
  301. package/dist/cjs/chunk-VVLC6T66.cjs.map +0 -1
  302. package/dist/cjs/chunk-VZS6VPLE.cjs +0 -26
  303. package/dist/cjs/chunk-VZS6VPLE.cjs.map +0 -1
  304. package/dist/cjs/chunk-W4PRBE6H.cjs.map +0 -1
  305. package/dist/cjs/chunk-WDPCMSZM.cjs +0 -37
  306. package/dist/cjs/chunk-WDPCMSZM.cjs.map +0 -1
  307. package/dist/cjs/chunk-WGFYVOP5.cjs +0 -30
  308. package/dist/cjs/chunk-WGFYVOP5.cjs.map +0 -1
  309. package/dist/cjs/chunk-X276C2SQ.cjs +0 -37
  310. package/dist/cjs/chunk-X276C2SQ.cjs.map +0 -1
  311. package/dist/cjs/chunk-X3XEJQRF.cjs +0 -37
  312. package/dist/cjs/chunk-X3XEJQRF.cjs.map +0 -1
  313. package/dist/cjs/chunk-X5ARZJ77.cjs +0 -353
  314. package/dist/cjs/chunk-X5ARZJ77.cjs.map +0 -1
  315. package/dist/cjs/chunk-XIR7UR77.cjs +0 -37
  316. package/dist/cjs/chunk-XIR7UR77.cjs.map +0 -1
  317. package/dist/cjs/chunk-XIXM5VST.cjs +0 -37
  318. package/dist/cjs/chunk-XIXM5VST.cjs.map +0 -1
  319. package/dist/cjs/chunk-XIYB6QQC.cjs +0 -37
  320. package/dist/cjs/chunk-XIYB6QQC.cjs.map +0 -1
  321. package/dist/cjs/chunk-XM22DX5O.cjs +0 -43
  322. package/dist/cjs/chunk-XM22DX5O.cjs.map +0 -1
  323. package/dist/cjs/chunk-XVYFBQRE.cjs +0 -37
  324. package/dist/cjs/chunk-XVYFBQRE.cjs.map +0 -1
  325. package/dist/cjs/chunk-YORAOGFM.cjs +0 -37
  326. package/dist/cjs/chunk-YORAOGFM.cjs.map +0 -1
  327. package/dist/cjs/chunk-YUCTXIN5.cjs +0 -37
  328. package/dist/cjs/chunk-YUCTXIN5.cjs.map +0 -1
  329. package/dist/cjs/chunk-YUEKJCO7.cjs +0 -18
  330. package/dist/cjs/chunk-YUEKJCO7.cjs.map +0 -1
  331. package/dist/cjs/chunk-YVE4DLAT.cjs +0 -43
  332. package/dist/cjs/chunk-YVE4DLAT.cjs.map +0 -1
  333. package/dist/cjs/chunk-ZBD7JCDL.cjs +0 -381
  334. package/dist/cjs/chunk-ZBD7JCDL.cjs.map +0 -1
  335. package/dist/cjs/chunk-ZNMRAQT2.cjs +0 -164
  336. package/dist/cjs/chunk-ZNMRAQT2.cjs.map +0 -1
  337. package/dist/cjs/chunk-ZS3QMRHK.cjs +0 -165
  338. package/dist/cjs/chunk-ZS3QMRHK.cjs.map +0 -1
  339. package/dist/cjs/chunk-ZZ3SXOOC.cjs +0 -37
  340. package/dist/cjs/chunk-ZZ3SXOOC.cjs.map +0 -1
  341. package/dist/esm/chunk-E2RV322Z.js.map +0 -1
  342. package/dist/esm/chunk-EYZ5Z7FG.js.map +0 -1
  343. package/dist/esm/chunk-SHQWRBWS.js.map +0 -1
  344. /package/dist/esm/{chunk-F3I4URTX.js.map → chunk-KLQLM5LJ.js.map} +0 -0
  345. /package/dist/esm/{chunk-5T7E533R.js.map → chunk-WOW36XUD.js.map} +0 -0
  346. /package/dist/esm/{chunk-6OHUQ6DV.js.map → chunk-ZOWTQAV5.js.map} +0 -0
@@ -1,13 +1,13 @@
1
1
  "use strict";Object.defineProperty(exports, "__esModule", {value: true});
2
2
 
3
- var _chunkMXDXXOXEcjs = require('../chunk-MXDXXOXE.cjs');
4
- require('../chunk-W4PRBE6H.cjs');
3
+ var _chunkWZF2QFLScjs = require('../chunk-WZF2QFLS.cjs');
4
+ require('../chunk-G3KWCMMQ.cjs');
5
5
  require('../chunk-TYLHXACM.cjs');
6
6
  require('../chunk-QHQLU7BI.cjs');
7
7
  require('../chunk-L6RI7RO4.cjs');
8
- require('../chunk-CD3RWOCR.cjs');
8
+ require('../chunk-W224GBH7.cjs');
9
9
  require('../chunk-466ED5WN.cjs');
10
10
 
11
11
 
12
- exports.QueryStreamService = _chunkMXDXXOXEcjs.QueryStreamService;
12
+ exports.QueryStreamService = _chunkWZF2QFLScjs.QueryStreamService;
13
13
  //# sourceMappingURL=query-stream.service.cjs.map
@@ -1,13 +1,13 @@
1
1
  "use strict";Object.defineProperty(exports, "__esModule", {value: true});
2
2
 
3
- var _chunkKAF2EDPZcjs = require('../chunk-KAF2EDPZ.cjs');
4
- require('../chunk-IKPQ52KY.cjs');
3
+ var _chunkMI5VAHHIcjs = require('../chunk-MI5VAHHI.cjs');
4
+ require('../chunk-QZHI7LLI.cjs');
5
5
  require('../chunk-TYLHXACM.cjs');
6
6
  require('../chunk-QHQLU7BI.cjs');
7
7
  require('../chunk-L6RI7RO4.cjs');
8
- require('../chunk-CD3RWOCR.cjs');
8
+ require('../chunk-W224GBH7.cjs');
9
9
  require('../chunk-466ED5WN.cjs');
10
10
 
11
11
 
12
- exports.QueryService = _chunkKAF2EDPZcjs.QueryService;
12
+ exports.QueryService = _chunkMI5VAHHIcjs.QueryService;
13
13
  //# sourceMappingURL=query.service.cjs.map
@@ -0,0 +1,7 @@
1
+ "use strict";Object.defineProperty(exports, "__esModule", {value: true});
2
+
3
+ var _chunk2P3ZBNVNcjs = require('../chunk-2P3ZBNVN.cjs');
4
+
5
+
6
+ exports.ThreadService = _chunk2P3ZBNVNcjs.ThreadService;
7
+ //# sourceMappingURL=thread.service.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["/Users/shyun/comcom/ain-agent/ain-adk/dist/cjs/services/thread.service.cjs"],"names":[],"mappings":"AAAA;AACE;AACF,yDAA8B;AAC9B;AACE;AACF,wDAAC","file":"/Users/shyun/comcom/ain-agent/ain-adk/dist/cjs/services/thread.service.cjs"}
@@ -1,9 +1,9 @@
1
1
  "use strict";Object.defineProperty(exports, "__esModule", {value: true});
2
2
 
3
3
 
4
- var _chunkCD3RWOCRcjs = require('../chunk-CD3RWOCR.cjs');
4
+ var _chunkW224GBH7cjs = require('../chunk-W224GBH7.cjs');
5
5
 
6
6
 
7
7
 
8
- exports.MessageRole = _chunkCD3RWOCRcjs.MessageRole; exports.ThreadType = _chunkCD3RWOCRcjs.ThreadType;
8
+ exports.MessageRole = _chunkW224GBH7cjs.MessageRole; exports.ThreadType = _chunkW224GBH7cjs.ThreadType;
9
9
  //# sourceMappingURL=memory.cjs.map
@@ -1,6 +1,6 @@
1
1
  import {
2
2
  IntentFulfillService
3
- } from "./chunk-EYZ5Z7FG.js";
3
+ } from "./chunk-LOFJBMHT.js";
4
4
  import {
5
5
  IntentTriggerService
6
6
  } from "./chunk-OCONOO5Z.js";
@@ -100,15 +100,21 @@ var QueryService = class {
100
100
  thread = { ...metadata, messages: [] };
101
101
  loggers.intent.info(`Create new thread: ${threadId}`);
102
102
  }
103
+ const triggeredIntent = await this.intentTriggerService.intentTriggering(query, thread);
103
104
  await threadMemory?.addMessagesToThread(userId, threadId, [
104
105
  {
105
106
  messageId: randomUUID(),
106
107
  role: "USER" /* USER */,
107
108
  timestamp: Date.now(),
108
- content: { type: "text", parts: [query] }
109
+ content: { type: "text", parts: [query] },
110
+ metadata: {
111
+ intents: triggeredIntent.filter((intent) => !!intent.intent).map((intent) => ({
112
+ id: intent.intent?.id,
113
+ subquery: intent.subquery
114
+ }))
115
+ }
109
116
  }
110
117
  ]);
111
- const triggeredIntent = await this.intentTriggerService.intentTriggering(query, thread);
112
118
  const result = await this.intentFulfillService.intentFulfill(
113
119
  triggeredIntent,
114
120
  thread
@@ -120,4 +126,4 @@ var QueryService = class {
120
126
  export {
121
127
  QueryService
122
128
  };
123
- //# sourceMappingURL=chunk-IRGR2OHS.js.map
129
+ //# sourceMappingURL=chunk-6GA26MT4.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/services/query.service.ts"],"sourcesContent":["import { randomUUID } from \"node:crypto\";\nimport { StatusCodes } from \"http-status-codes\";\nimport type {\n\tA2AModule,\n\tMCPModule,\n\tMemoryModule,\n\tModelModule,\n} from \"@/modules/index.js\";\nimport { type AinAgentPrompts, AinHttpError } from \"@/types/agent.js\";\nimport {\n\tMessageRole,\n\ttype ThreadMetadata,\n\ttype ThreadObject,\n\ttype ThreadType,\n\ttype TriggeredIntent,\n} from \"@/types/memory.js\";\nimport { loggers } from \"@/utils/logger.js\";\nimport { IntentFulfillService } from \"./intents/fulfill.service\";\nimport { IntentTriggerService } from \"./intents/trigger.service\";\n\n/**\n * Service for processing user queries through the agent's AI pipeline.\n *\n * Orchestrates the query processing workflow including intent detection,\n * model inference, tool execution, and response generation. Manages\n * conversation context and coordinates between different modules.\n */\nexport class QueryService {\n\tprivate modelModule: ModelModule;\n\tprivate memoryModule?: MemoryModule;\n\tprivate intentTriggerService: IntentTriggerService;\n\tprivate intentFulfillService: IntentFulfillService;\n\n\tconstructor(\n\t\tmodelModule: ModelModule,\n\t\ta2aModule?: A2AModule,\n\t\tmcpModule?: MCPModule,\n\t\tmemoryModule?: MemoryModule,\n\t\tprompts?: AinAgentPrompts,\n\t) {\n\t\tthis.modelModule = modelModule;\n\t\tthis.memoryModule = memoryModule;\n\t\tthis.intentTriggerService = new IntentTriggerService(\n\t\t\tmodelModule,\n\t\t\tmemoryModule,\n\t\t);\n\t\tthis.intentFulfillService = new IntentFulfillService(\n\t\t\tmodelModule,\n\t\t\ta2aModule,\n\t\t\tmcpModule,\n\t\t\tmemoryModule,\n\t\t\tprompts,\n\t\t);\n\t}\n\n\t/**\n\t * Generates a title for the conversation based on the query.\n\t *\n\t * @param query - The user's input query\n\t * @returns Promise resolving to a generated title\n\t */\n\n\tprivate async generateTitle(query: string): Promise<string> {\n\t\tconst DEFAULT_TITLE = \"New Chat\";\n\t\ttry {\n\t\t\tconst modelInstance = this.modelModule.getModel();\n\t\t\tconst messages = modelInstance.generateMessages({\n\t\t\t\tquery,\n\t\t\t\tsystemPrompt: `You are a helpful assistant that generates titles for conversations.\n Please analyze the user's query and create a concise title that accurately reflects the conversation's core topic.\n The title must be no more than 5 words long.\n Respond with only the title. Do not include any punctuation or extra explanations.`,\n\t\t\t});\n\t\t\tconst response = await modelInstance.fetch(messages);\n\t\t\treturn response.content || DEFAULT_TITLE;\n\t\t} catch (error) {\n\t\t\tloggers.intent.error(\"Error generating title\", {\n\t\t\t\terror,\n\t\t\t\tquery,\n\t\t\t});\n\t\t\treturn DEFAULT_TITLE;\n\t\t}\n\t}\n\n\t/**\n\t * Main entry point for processing user queries.\n\t *\n\t * Handles the complete query lifecycle:\n\t * 1. Loads or creates thread from memory\n\t * 2. Detects intent from the query\n\t * 3. Fulfills the intent with AI response\n\t * 4. Updates conversation history\n\t *\n\t * @param threadMetadata - Metadata containing type, userId, and optional threadId\n\t * @param threadMetadata.type - The type of thread (e.g., chat, workflow)\n\t * @param threadMetadata.userId - The user's unique identifier\n\t * @param threadMetadata.threadId - Optional thread identifier\n\t * @param query - The user's input query\n\t * @returns Promise resolving to object with content property containing the response\n\t */\n\tpublic async handleQuery(\n\t\tthreadMetadata: {\n\t\t\ttype: ThreadType;\n\t\t\tuserId: string;\n\t\t\tthreadId?: string;\n\t\t},\n\t\tquery: string,\n\t\tisA2A?: boolean,\n\t) {\n\t\tconst { type, userId } = threadMetadata;\n\t\tconst threadMemory = this.memoryModule?.getThreadMemory();\n\n\t\t// 1. Load or create thread\n\t\tlet threadId = threadMetadata.threadId;\n\t\tlet thread: ThreadObject | undefined;\n\t\tif (threadId) {\n\t\t\tthread = await threadMemory?.getThread(userId, threadId);\n\t\t\tif (!thread && !isA2A) {\n\t\t\t\tthrow new AinHttpError(StatusCodes.NOT_FOUND, \"Thread not found\");\n\t\t\t}\n\t\t}\n\n\t\tthreadId ??= randomUUID();\n\t\tif (!thread) {\n\t\t\tconst title = await this.generateTitle(query);\n\t\t\tconst metadata: ThreadMetadata = (await threadMemory?.createThread(\n\t\t\t\ttype,\n\t\t\t\tuserId,\n\t\t\t\tthreadId,\n\t\t\t\ttitle,\n\t\t\t)) || { type, userId, threadId, title };\n\t\t\tthread = { ...metadata, messages: [] };\n\t\t\tloggers.intent.info(`Create new thread: ${threadId}`);\n\t\t}\n\n\t\t// only add for storage, not for inference\n\t\tawait threadMemory?.addMessagesToThread(userId, threadId, [\n\t\t\t{\n\t\t\t\tmessageId: randomUUID(),\n\t\t\t\trole: MessageRole.USER,\n\t\t\t\ttimestamp: Date.now(),\n\t\t\t\tcontent: { type: \"text\", parts: [query] },\n\t\t\t},\n\t\t]);\n\n\t\t// 2. intent triggering\n\t\tconst triggeredIntent: Array<TriggeredIntent> =\n\t\t\tawait this.intentTriggerService.intentTriggering(query, thread);\n\n\t\t// 3. intent fulfillment\n\t\tconst result = await this.intentFulfillService.intentFulfill(\n\t\t\ttriggeredIntent,\n\t\t\tthread,\n\t\t);\n\n\t\treturn { content: result };\n\t}\n}\n"],"mappings":";;;;;;;;;;;;;;AAAA,SAAS,kBAAkB;AAC3B,SAAS,mBAAmB;AA0BrB,IAAM,eAAN,MAAmB;AAAA,EACjB;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EAER,YACC,aACA,WACA,WACA,cACA,SACC;AACD,SAAK,cAAc;AACnB,SAAK,eAAe;AACpB,SAAK,uBAAuB,IAAI;AAAA,MAC/B;AAAA,MACA;AAAA,IACD;AACA,SAAK,uBAAuB,IAAI;AAAA,MAC/B;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACD;AAAA,EACD;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASA,MAAc,cAAc,OAAgC;AAC3D,UAAM,gBAAgB;AACtB,QAAI;AACH,YAAM,gBAAgB,KAAK,YAAY,SAAS;AAChD,YAAM,WAAW,cAAc,iBAAiB;AAAA,QAC/C;AAAA,QACA,cAAc;AAAA;AAAA;AAAA;AAAA,MAIf,CAAC;AACD,YAAM,WAAW,MAAM,cAAc,MAAM,QAAQ;AACnD,aAAO,SAAS,WAAW;AAAA,IAC5B,SAAS,OAAO;AACf,cAAQ,OAAO,MAAM,0BAA0B;AAAA,QAC9C;AAAA,QACA;AAAA,MACD,CAAC;AACD,aAAO;AAAA,IACR;AAAA,EACD;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAkBA,MAAa,YACZ,gBAKA,OACA,OACC;AACD,UAAM,EAAE,MAAM,OAAO,IAAI;AACzB,UAAM,eAAe,KAAK,cAAc,gBAAgB;AAGxD,QAAI,WAAW,eAAe;AAC9B,QAAI;AACJ,QAAI,UAAU;AACb,eAAS,MAAM,cAAc,UAAU,QAAQ,QAAQ;AACvD,UAAI,CAAC,UAAU,CAAC,OAAO;AACtB,cAAM,IAAI,aAAa,YAAY,WAAW,kBAAkB;AAAA,MACjE;AAAA,IACD;AAEA,iBAAa,WAAW;AACxB,QAAI,CAAC,QAAQ;AACZ,YAAM,QAAQ,MAAM,KAAK,cAAc,KAAK;AAC5C,YAAM,WAA4B,MAAM,cAAc;AAAA,QACrD;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,MACD,KAAM,EAAE,MAAM,QAAQ,UAAU,MAAM;AACtC,eAAS,EAAE,GAAG,UAAU,UAAU,CAAC,EAAE;AACrC,cAAQ,OAAO,KAAK,sBAAsB,QAAQ,EAAE;AAAA,IACrD;AAGA,UAAM,cAAc,oBAAoB,QAAQ,UAAU;AAAA,MACzD;AAAA,QACC,WAAW,WAAW;AAAA,QACtB;AAAA,QACA,WAAW,KAAK,IAAI;AAAA,QACpB,SAAS,EAAE,MAAM,QAAQ,OAAO,CAAC,KAAK,EAAE;AAAA,MACzC;AAAA,IACD,CAAC;AAGD,UAAM,kBACL,MAAM,KAAK,qBAAqB,iBAAiB,OAAO,MAAM;AAG/D,UAAM,SAAS,MAAM,KAAK,qBAAqB;AAAA,MAC9C;AAAA,MACA;AAAA,IACD;AAEA,WAAO,EAAE,SAAS,OAAO;AAAA,EAC1B;AACD;","names":[]}
1
+ {"version":3,"sources":["../../src/services/query.service.ts"],"sourcesContent":["import { randomUUID } from \"node:crypto\";\nimport { StatusCodes } from \"http-status-codes\";\nimport type {\n\tA2AModule,\n\tMCPModule,\n\tMemoryModule,\n\tModelModule,\n} from \"@/modules/index.js\";\nimport { type AinAgentPrompts, AinHttpError } from \"@/types/agent.js\";\nimport {\n\tMessageRole,\n\ttype ThreadMetadata,\n\ttype ThreadObject,\n\ttype ThreadType,\n\ttype TriggeredIntent,\n} from \"@/types/memory.js\";\nimport { loggers } from \"@/utils/logger.js\";\nimport { IntentFulfillService } from \"./intents/fulfill.service\";\nimport { IntentTriggerService } from \"./intents/trigger.service\";\n\n/**\n * Service for processing user queries through the agent's AI pipeline.\n *\n * Orchestrates the query processing workflow including intent detection,\n * model inference, tool execution, and response generation. Manages\n * conversation context and coordinates between different modules.\n */\nexport class QueryService {\n\tprivate modelModule: ModelModule;\n\tprivate memoryModule?: MemoryModule;\n\tprivate intentTriggerService: IntentTriggerService;\n\tprivate intentFulfillService: IntentFulfillService;\n\n\tconstructor(\n\t\tmodelModule: ModelModule,\n\t\ta2aModule?: A2AModule,\n\t\tmcpModule?: MCPModule,\n\t\tmemoryModule?: MemoryModule,\n\t\tprompts?: AinAgentPrompts,\n\t) {\n\t\tthis.modelModule = modelModule;\n\t\tthis.memoryModule = memoryModule;\n\t\tthis.intentTriggerService = new IntentTriggerService(\n\t\t\tmodelModule,\n\t\t\tmemoryModule,\n\t\t);\n\t\tthis.intentFulfillService = new IntentFulfillService(\n\t\t\tmodelModule,\n\t\t\ta2aModule,\n\t\t\tmcpModule,\n\t\t\tmemoryModule,\n\t\t\tprompts,\n\t\t);\n\t}\n\n\t/**\n\t * Generates a title for the conversation based on the query.\n\t *\n\t * @param query - The user's input query\n\t * @returns Promise resolving to a generated title\n\t */\n\n\tprivate async generateTitle(query: string): Promise<string> {\n\t\tconst DEFAULT_TITLE = \"New Chat\";\n\t\ttry {\n\t\t\tconst modelInstance = this.modelModule.getModel();\n\t\t\tconst messages = modelInstance.generateMessages({\n\t\t\t\tquery,\n\t\t\t\tsystemPrompt: `You are a helpful assistant that generates titles for conversations.\n Please analyze the user's query and create a concise title that accurately reflects the conversation's core topic.\n The title must be no more than 5 words long.\n Respond with only the title. Do not include any punctuation or extra explanations.`,\n\t\t\t});\n\t\t\tconst response = await modelInstance.fetch(messages);\n\t\t\treturn response.content || DEFAULT_TITLE;\n\t\t} catch (error) {\n\t\t\tloggers.intent.error(\"Error generating title\", {\n\t\t\t\terror,\n\t\t\t\tquery,\n\t\t\t});\n\t\t\treturn DEFAULT_TITLE;\n\t\t}\n\t}\n\n\t/**\n\t * Main entry point for processing user queries.\n\t *\n\t * Handles the complete query lifecycle:\n\t * 1. Loads or creates thread from memory\n\t * 2. Detects intent from the query\n\t * 3. Fulfills the intent with AI response\n\t * 4. Updates conversation history\n\t *\n\t * @param threadMetadata - Metadata containing type, userId, and optional threadId\n\t * @param threadMetadata.type - The type of thread (e.g., chat, workflow)\n\t * @param threadMetadata.userId - The user's unique identifier\n\t * @param threadMetadata.threadId - Optional thread identifier\n\t * @param query - The user's input query\n\t * @returns Promise resolving to object with content property containing the response\n\t */\n\tpublic async handleQuery(\n\t\tthreadMetadata: {\n\t\t\ttype: ThreadType;\n\t\t\tuserId: string;\n\t\t\tthreadId?: string;\n\t\t},\n\t\tquery: string,\n\t\tisA2A?: boolean,\n\t) {\n\t\tconst { type, userId } = threadMetadata;\n\t\tconst threadMemory = this.memoryModule?.getThreadMemory();\n\n\t\t// 1. Load or create thread\n\t\tlet threadId = threadMetadata.threadId;\n\t\tlet thread: ThreadObject | undefined;\n\t\tif (threadId) {\n\t\t\tthread = await threadMemory?.getThread(userId, threadId);\n\t\t\tif (!thread && !isA2A) {\n\t\t\t\tthrow new AinHttpError(StatusCodes.NOT_FOUND, \"Thread not found\");\n\t\t\t}\n\t\t}\n\n\t\tthreadId ??= randomUUID();\n\t\tif (!thread) {\n\t\t\tconst title = await this.generateTitle(query);\n\t\t\tconst metadata: ThreadMetadata = (await threadMemory?.createThread(\n\t\t\t\ttype,\n\t\t\t\tuserId,\n\t\t\t\tthreadId,\n\t\t\t\ttitle,\n\t\t\t)) || { type, userId, threadId, title };\n\t\t\tthread = { ...metadata, messages: [] };\n\t\t\tloggers.intent.info(`Create new thread: ${threadId}`);\n\t\t}\n\n\t\t// 2. intent triggering\n\t\tconst triggeredIntent: Array<TriggeredIntent> =\n\t\t\tawait this.intentTriggerService.intentTriggering(query, thread);\n\n\t\t// only add for storage, not for inference\n\t\tawait threadMemory?.addMessagesToThread(userId, threadId, [\n\t\t\t{\n\t\t\t\tmessageId: randomUUID(),\n\t\t\t\trole: MessageRole.USER,\n\t\t\t\ttimestamp: Date.now(),\n\t\t\t\tcontent: { type: \"text\", parts: [query] },\n\t\t\t\tmetadata: {\n\t\t\t\t\tintents: triggeredIntent\n\t\t\t\t\t\t.filter((intent) => !!intent.intent)\n\t\t\t\t\t\t.map((intent) => ({\n\t\t\t\t\t\t\tid: intent.intent?.id,\n\t\t\t\t\t\t\tsubquery: intent.subquery,\n\t\t\t\t\t\t})),\n\t\t\t\t},\n\t\t\t},\n\t\t]);\n\n\t\t// 3. intent fulfillment\n\t\tconst result = await this.intentFulfillService.intentFulfill(\n\t\t\ttriggeredIntent,\n\t\t\tthread,\n\t\t);\n\n\t\treturn { content: result };\n\t}\n}\n"],"mappings":";;;;;;;;;;;;;;AAAA,SAAS,kBAAkB;AAC3B,SAAS,mBAAmB;AA0BrB,IAAM,eAAN,MAAmB;AAAA,EACjB;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EAER,YACC,aACA,WACA,WACA,cACA,SACC;AACD,SAAK,cAAc;AACnB,SAAK,eAAe;AACpB,SAAK,uBAAuB,IAAI;AAAA,MAC/B;AAAA,MACA;AAAA,IACD;AACA,SAAK,uBAAuB,IAAI;AAAA,MAC/B;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACD;AAAA,EACD;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASA,MAAc,cAAc,OAAgC;AAC3D,UAAM,gBAAgB;AACtB,QAAI;AACH,YAAM,gBAAgB,KAAK,YAAY,SAAS;AAChD,YAAM,WAAW,cAAc,iBAAiB;AAAA,QAC/C;AAAA,QACA,cAAc;AAAA;AAAA;AAAA;AAAA,MAIf,CAAC;AACD,YAAM,WAAW,MAAM,cAAc,MAAM,QAAQ;AACnD,aAAO,SAAS,WAAW;AAAA,IAC5B,SAAS,OAAO;AACf,cAAQ,OAAO,MAAM,0BAA0B;AAAA,QAC9C;AAAA,QACA;AAAA,MACD,CAAC;AACD,aAAO;AAAA,IACR;AAAA,EACD;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAkBA,MAAa,YACZ,gBAKA,OACA,OACC;AACD,UAAM,EAAE,MAAM,OAAO,IAAI;AACzB,UAAM,eAAe,KAAK,cAAc,gBAAgB;AAGxD,QAAI,WAAW,eAAe;AAC9B,QAAI;AACJ,QAAI,UAAU;AACb,eAAS,MAAM,cAAc,UAAU,QAAQ,QAAQ;AACvD,UAAI,CAAC,UAAU,CAAC,OAAO;AACtB,cAAM,IAAI,aAAa,YAAY,WAAW,kBAAkB;AAAA,MACjE;AAAA,IACD;AAEA,iBAAa,WAAW;AACxB,QAAI,CAAC,QAAQ;AACZ,YAAM,QAAQ,MAAM,KAAK,cAAc,KAAK;AAC5C,YAAM,WAA4B,MAAM,cAAc;AAAA,QACrD;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,MACD,KAAM,EAAE,MAAM,QAAQ,UAAU,MAAM;AACtC,eAAS,EAAE,GAAG,UAAU,UAAU,CAAC,EAAE;AACrC,cAAQ,OAAO,KAAK,sBAAsB,QAAQ,EAAE;AAAA,IACrD;AAGA,UAAM,kBACL,MAAM,KAAK,qBAAqB,iBAAiB,OAAO,MAAM;AAG/D,UAAM,cAAc,oBAAoB,QAAQ,UAAU;AAAA,MACzD;AAAA,QACC,WAAW,WAAW;AAAA,QACtB;AAAA,QACA,WAAW,KAAK,IAAI;AAAA,QACpB,SAAS,EAAE,MAAM,QAAQ,OAAO,CAAC,KAAK,EAAE;AAAA,QACxC,UAAU;AAAA,UACT,SAAS,gBACP,OAAO,CAAC,WAAW,CAAC,CAAC,OAAO,MAAM,EAClC,IAAI,CAAC,YAAY;AAAA,YACjB,IAAI,OAAO,QAAQ;AAAA,YACnB,UAAU,OAAO;AAAA,UAClB,EAAE;AAAA,QACJ;AAAA,MACD;AAAA,IACD,CAAC;AAGD,UAAM,SAAS,MAAM,KAAK,qBAAqB;AAAA,MAC9C;AAAA,MACA;AAAA,IACD;AAEA,WAAO,EAAE,SAAS,OAAO;AAAA,EAC1B;AACD;","names":[]}
@@ -0,0 +1,28 @@
1
+ import {
2
+ ThreadService
3
+ } from "./chunk-WZQVH4XY.js";
4
+ import {
5
+ IntentController
6
+ } from "./chunk-YUKPKFX5.js";
7
+ import {
8
+ IntentTriggerService
9
+ } from "./chunk-OCONOO5Z.js";
10
+
11
+ // src/routes/intent.routes.ts
12
+ import { Router } from "express";
13
+ var createIntentRouter = (agent) => {
14
+ const router = Router();
15
+ const threadService = new ThreadService(agent.memoryModule);
16
+ const triggerService = new IntentTriggerService(
17
+ agent.modelModule,
18
+ agent.memoryModule
19
+ );
20
+ const intentController = new IntentController(threadService, triggerService);
21
+ router.post("/trigger", intentController.handleIntentTrigger);
22
+ return router;
23
+ };
24
+
25
+ export {
26
+ createIntentRouter
27
+ };
28
+ //# sourceMappingURL=chunk-F3QXERC7.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/routes/intent.routes.ts"],"sourcesContent":["import { Router } from \"express\";\nimport { IntentController } from \"@/controllers/intent.controller\";\nimport type { AINAgent } from \"@/index.js\";\nimport { IntentTriggerService } from \"@/services\";\nimport { ThreadService } from \"@/services/thread.service\";\n\nexport const createIntentRouter = (agent: AINAgent): Router => {\n\tconst router = Router();\n\n\tconst threadService = new ThreadService(agent.memoryModule);\n\tconst triggerService = new IntentTriggerService(\n\t\tagent.modelModule,\n\t\tagent.memoryModule,\n\t);\n\n\tconst intentController = new IntentController(threadService, triggerService);\n\n\trouter.post(\"/trigger\", intentController.handleIntentTrigger);\n\n\treturn router;\n};\n"],"mappings":";;;;;;;;;;;AAAA,SAAS,cAAc;AAMhB,IAAM,qBAAqB,CAAC,UAA4B;AAC9D,QAAM,SAAS,OAAO;AAEtB,QAAM,gBAAgB,IAAI,cAAc,MAAM,YAAY;AAC1D,QAAM,iBAAiB,IAAI;AAAA,IAC1B,MAAM;AAAA,IACN,MAAM;AAAA,EACP;AAEA,QAAM,mBAAmB,IAAI,iBAAiB,eAAe,cAAc;AAE3E,SAAO,KAAK,YAAY,iBAAiB,mBAAmB;AAE5D,SAAO;AACR;","names":[]}
@@ -15,4 +15,4 @@ export {
15
15
  MessageRole,
16
16
  ThreadType
17
17
  };
18
- //# sourceMappingURL=chunk-X6JNM3XR.js.map
18
+ //# sourceMappingURL=chunk-GRN6CHNO.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/types/memory.ts"],"sourcesContent":["/**\n * Roles for participants in a message.\n */\nexport enum MessageRole {\n\t/** User/human participant */\n\tUSER = \"USER\",\n\t/** System-generated messages or instructions */\n\tSYSTEM = \"SYSTEM\",\n\t/** AI model responses */\n\tMODEL = \"MODEL\",\n}\n\n/**\n * Content structure for message content.\n *\n * Supports multi-part content with different types (text, images, etc.).\n */\nexport type MessageContentObject = {\n\t/** Content type (e.g., \"text\", \"image\", \"tool_use\") */\n\ttype: string;\n\t/** Array of content parts, structure depends on content type */\n\tparts: any[];\n};\n\n/**\n * Represents a single message in a thread.\n *\n * @example\n * ```typescript\n * const message: MessageObject = {\n * role: MessageRole.USER,\n * content: {\n * type: \"text\",\n * parts: [\"Hello, how can you help me?\"]\n * },\n * timestamp: Date.now(),\n * metadata: { source: \"web-ui\" }\n * };\n * ```\n */\nexport type MessageObject = {\n\tmessageId: string;\n\t/** Role of the message sender */\n\trole: MessageRole;\n\t/** Message content with type and parts */\n\tcontent: MessageContentObject;\n\t/** Unix timestamp when the message was created */\n\ttimestamp: number;\n\t/** Optional metadata for additional context */\n\tmetadata?: { [key: string]: unknown };\n};\n\nexport enum ThreadType {\n\tWORKFLOW = \"WORKFLOW\",\n\tCHAT = \"CHAT\",\n}\n\nexport type ThreadMetadata = {\n\ttype: ThreadType;\n\ttitle: string;\n\tuserId: string;\n\tthreadId: string;\n};\n\n/**\n * Represents a conversation thread containing multiple messages.\n *\n * Messages are stored in a key-value structure where keys are unique message IDs\n * and values are the corresponding message objects.\n *\n * @example\n * ```typescript\n * const thread: ThreadObject = {\n * \t title: \"New conversation\",\n * messages: [\n * { messageId: <UUID_1>, role: MessageRole.USER, content: {...}, timestamp: 1234567890 },\n * { messageId: <UUID_2> ,role: MessageRole.MODEL, content: {...}, timestamp: 1234567891 }\n * ]\n * };\n * ```\n */\nexport type ThreadObject = {\n\tuserId: string;\n\tthreadId: string;\n\ttype: ThreadType;\n\ttitle: string;\n\tmessages: Array<MessageObject>;\n};\n\nexport interface Intent {\n\tid: string;\n\tname: string;\n\tdescription: string;\n\tprompt?: string;\n\ttriggeringSentences?: Array<string>;\n\ttags?: Array<string>;\n}\n\nexport type TriggeredIntent = {\n\tsubquery: string;\n\tintent?: Intent;\n\tactionPlan?: string;\n};\n"],"mappings":";AAGO,IAAK,cAAL,kBAAKA,iBAAL;AAEN,EAAAA,aAAA,UAAO;AAEP,EAAAA,aAAA,YAAS;AAET,EAAAA,aAAA,WAAQ;AANG,SAAAA;AAAA,GAAA;AAiDL,IAAK,aAAL,kBAAKC,gBAAL;AACN,EAAAA,YAAA,cAAW;AACX,EAAAA,YAAA,UAAO;AAFI,SAAAA;AAAA,GAAA;","names":["MessageRole","ThreadType"]}
1
+ {"version":3,"sources":["../../src/types/memory.ts"],"sourcesContent":["/**\n * Roles for participants in a message.\n */\nexport enum MessageRole {\n\t/** User/human participant */\n\tUSER = \"USER\",\n\t/** System-generated messages or instructions */\n\tSYSTEM = \"SYSTEM\",\n\t/** AI model responses */\n\tMODEL = \"MODEL\",\n}\n\n/**\n * Content structure for message content.\n *\n * Supports multi-part content with different types (text, images, etc.).\n */\nexport type MessageContentObject = {\n\t/** Content type (e.g., \"text\", \"image\", \"tool_use\") */\n\ttype: string;\n\t/** Array of content parts, structure depends on content type */\n\tparts: any[];\n};\n\n/**\n * Represents a single message in a thread.\n *\n * @example\n * ```typescript\n * const message: MessageObject = {\n * role: MessageRole.USER,\n * content: {\n * type: \"text\",\n * parts: [\"Hello, how can you help me?\"]\n * },\n * timestamp: Date.now(),\n * metadata: { source: \"web-ui\" }\n * };\n * ```\n */\nexport type MessageObject = {\n\tmessageId: string;\n\t/** Role of the message sender */\n\trole: MessageRole;\n\t/** Message content with type and parts */\n\tcontent: MessageContentObject;\n\t/** Unix timestamp when the message was created */\n\ttimestamp: number;\n\t/** Optional metadata for additional context */\n\tmetadata?: { [key: string]: unknown };\n};\n\nexport enum ThreadType {\n\tWORKFLOW = \"WORKFLOW\",\n\tCHAT = \"CHAT\",\n}\n\nexport type ThreadMetadata = {\n\ttype: ThreadType;\n\ttitle: string;\n\tuserId: string;\n\tthreadId: string;\n};\n\n/**\n * Represents a conversation thread containing multiple messages.\n *\n * Messages are stored in a key-value structure where keys are unique message IDs\n * and values are the corresponding message objects.\n *\n * @example\n * ```typescript\n * const thread: ThreadObject = {\n * \t title: \"New conversation\",\n * messages: [\n * { messageId: <UUID_1>, role: MessageRole.USER, content: {...}, timestamp: 1234567890 },\n * { messageId: <UUID_2> ,role: MessageRole.MODEL, content: {...}, timestamp: 1234567891 }\n * ]\n * };\n * ```\n */\nexport type ThreadObject = {\n\tuserId: string;\n\tthreadId: string;\n\ttype: ThreadType;\n\ttitle: string;\n\tmessages: Array<MessageObject>;\n};\n\nexport interface Intent {\n\tid: string;\n\tname: string;\n\tdescription: string;\n\tstatus: string;\n\tprompt?: string;\n\ttriggeringSentences?: Array<string>;\n\ttags?: Array<string>;\n}\n\nexport type TriggeredIntent = {\n\tsubquery: string;\n\tintent?: Intent;\n\tactionPlan?: string;\n};\n"],"mappings":";AAGO,IAAK,cAAL,kBAAKA,iBAAL;AAEN,EAAAA,aAAA,UAAO;AAEP,EAAAA,aAAA,YAAS;AAET,EAAAA,aAAA,WAAQ;AANG,SAAAA;AAAA,GAAA;AAiDL,IAAK,aAAL,kBAAKC,gBAAL;AACN,EAAAA,YAAA,cAAW;AACX,EAAAA,YAAA,UAAO;AAFI,SAAAA;AAAA,GAAA;","names":["MessageRole","ThreadType"]}
@@ -1,3 +1,6 @@
1
+ import {
2
+ createThreadApiRouter
3
+ } from "./chunk-UFWC7DRS.js";
1
4
  import {
2
5
  createAgentApiRouter
3
6
  } from "./chunk-275JHD5P.js";
@@ -7,9 +10,6 @@ import {
7
10
  import {
8
11
  createModelApiRouter
9
12
  } from "./chunk-AMRKK46V.js";
10
- import {
11
- createThreadApiRouter
12
- } from "./chunk-UFWC7DRS.js";
13
13
 
14
14
  // src/routes/api.routes.ts
15
15
  import { Router } from "express";
@@ -27,4 +27,4 @@ var createApiRouter = (agent) => {
27
27
  export {
28
28
  createApiRouter
29
29
  };
30
- //# sourceMappingURL=chunk-F3I4URTX.js.map
30
+ //# sourceMappingURL=chunk-KLQLM5LJ.js.map
@@ -153,4 +153,4 @@ ${intent?.prompt || ""}
153
153
  export {
154
154
  IntentFulfillService
155
155
  };
156
- //# sourceMappingURL=chunk-EYZ5Z7FG.js.map
156
+ //# sourceMappingURL=chunk-LOFJBMHT.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/services/intents/fulfill.service.ts"],"sourcesContent":["import { randomUUID } from \"node:crypto\";\nimport type {\n\tA2AModule,\n\tMCPModule,\n\tMemoryModule,\n\tModelModule,\n} from \"@/modules\";\nimport type { AinAgentPrompts } from \"@/types/agent\";\nimport { CONNECTOR_PROTOCOL_TYPE, type ConnectorTool } from \"@/types/connector\";\nimport {\n\ttype Intent,\n\ttype MessageObject,\n\tMessageRole,\n\ttype ThreadObject,\n\ttype TriggeredIntent,\n} from \"@/types/memory\";\nimport { loggers } from \"@/utils/logger\";\n\nexport class IntentFulfillService {\n\tprivate modelModule: ModelModule;\n\tprivate a2aModule?: A2AModule;\n\tprivate mcpModule?: MCPModule;\n\tprivate memoryModule?: MemoryModule;\n\tprivate prompts?: AinAgentPrompts;\n\n\tconstructor(\n\t\tmodelModule: ModelModule,\n\t\ta2aModule?: A2AModule,\n\t\tmcpModule?: MCPModule,\n\t\tmemoryModule?: MemoryModule,\n\t\tprompts?: AinAgentPrompts,\n\t) {\n\t\tthis.modelModule = modelModule;\n\t\tthis.a2aModule = a2aModule;\n\t\tthis.mcpModule = mcpModule;\n\t\tthis.memoryModule = memoryModule;\n\t\tthis.prompts = prompts;\n\t}\n\n\tprivate async addToThreadMessages(\n\t\tthread: ThreadObject,\n\t\tparams: { role: MessageRole; content: string; metadata?: any },\n\t) {\n\t\ttry {\n\t\t\tconst threadMemory = this.memoryModule?.getThreadMemory();\n\t\t\tconst { userId, threadId } = thread;\n\t\t\tconst newMessage: MessageObject = {\n\t\t\t\tmessageId: randomUUID(),\n\t\t\t\trole: params.role,\n\t\t\t\ttimestamp: Date.now(),\n\t\t\t\tcontent: { type: \"text\", parts: [params.content] },\n\t\t\t\tmetadata: params.metadata,\n\t\t\t};\n\t\t\tthread.messages.push(newMessage);\n\t\t\tawait threadMemory?.addMessagesToThread(userId, threadId, [newMessage]);\n\t\t} catch (error) {\n\t\t\tloggers.intentStream.error(\"Error adding message to thread\", error);\n\t\t}\n\t}\n\n\t/**\n\t * Fulfills the detected intent by generating a streaming response.\n\t *\n\t * Manages the complete inference loop including:\n\t * - Loading prompts and conversation history\n\t * - Collecting available tools from modules\n\t * - Executing model inference with tool support\n\t * - Processing tool calls iteratively until completion\n\t * - Streaming results as Server-Sent Events\n\t *\n\t * @param query - The user's input query\n\t * @param threadId - Thread identifier for context\n\t * @param thread - Previous conversation history\n\t * @param intent - Optional detected intent with custom prompt\n\t * @returns AsyncGenerator yielding StreamEvent objects\n\t */\n\tprivate async intentFulfilling(\n\t\tquery: string,\n\t\tthread: ThreadObject,\n\t\tintent?: Intent,\n\t): Promise<string> {\n\t\tconst systemPrompt = `\nToday is ${new Date().toLocaleDateString()}.\n\n${this.prompts?.agent || \"\"}\n\n${this.prompts?.system || \"\"}\n\n${intent?.prompt || \"\"}\n\t`.trim();\n\n\t\tconst modelInstance = this.modelModule.getModel();\n\t\tconst messages = modelInstance.generateMessages({\n\t\t\tquery,\n\t\t\tthread,\n\t\t\tsystemPrompt: systemPrompt.trim(),\n\t\t});\n\n\t\tconst tools: ConnectorTool[] = [];\n\t\tthis.mcpModule && tools.push(...this.mcpModule.getTools());\n\t\tthis.a2aModule && tools.push(...(await this.a2aModule.getTools()));\n\n\t\tconst functions = modelInstance.convertToolsToFunctions(tools);\n\t\tlet finalMessage = \"\";\n\n\t\twhile (true) {\n\t\t\tconst response = await modelInstance.fetchWithContextMessage(\n\t\t\t\tmessages,\n\t\t\t\tfunctions,\n\t\t\t);\n\n\t\t\tloggers.intentStream.info(\"messages\", { messages });\n\n\t\t\tconst { content, toolCalls } = response;\n\n\t\t\tif (toolCalls) {\n\t\t\t\tfor (const toolCall of toolCalls) {\n\t\t\t\t\tconst toolName = toolCall.name;\n\t\t\t\t\tconst selectedTool = tools.filter(\n\t\t\t\t\t\t(tool) => tool.toolName === toolName,\n\t\t\t\t\t)[0];\n\n\t\t\t\t\tlet toolResult = \"\";\n\t\t\t\t\tif (\n\t\t\t\t\t\tthis.mcpModule &&\n\t\t\t\t\t\tselectedTool.protocol === CONNECTOR_PROTOCOL_TYPE.MCP\n\t\t\t\t\t) {\n\t\t\t\t\t\tconst toolArgs = toolCall.arguments as\n\t\t\t\t\t\t\t| { [x: string]: unknown }\n\t\t\t\t\t\t\t| undefined;\n\t\t\t\t\t\tloggers.intent.debug(\"MCP tool call\", { toolName, toolArgs });\n\t\t\t\t\t\ttoolResult = await this.mcpModule.useTool(selectedTool, toolArgs);\n\t\t\t\t\t} else if (\n\t\t\t\t\t\tthis.a2aModule &&\n\t\t\t\t\t\tselectedTool.protocol === CONNECTOR_PROTOCOL_TYPE.A2A\n\t\t\t\t\t) {\n\t\t\t\t\t\ttoolResult = await this.a2aModule.useTool(\n\t\t\t\t\t\t\tselectedTool,\n\t\t\t\t\t\t\tquery,\n\t\t\t\t\t\t\tthread.threadId,\n\t\t\t\t\t\t);\n\t\t\t\t\t} else {\n\t\t\t\t\t\t// Unrecognized tool type. It cannot be happened...\n\t\t\t\t\t\tloggers.intent.warn(\n\t\t\t\t\t\t\t`Unrecognized tool type: ${selectedTool.protocol}`,\n\t\t\t\t\t\t);\n\t\t\t\t\t\tcontinue;\n\t\t\t\t\t}\n\n\t\t\t\t\tloggers.intent.debug(\"toolResult\", { toolResult });\n\n\t\t\t\t\tmodelInstance.appendMessages(messages, toolResult);\n\t\t\t\t}\n\t\t\t} else if (content) {\n\t\t\t\tfinalMessage = content;\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\n\t\treturn finalMessage;\n\t}\n\n\t/**\n\t * Detects the intent from context.\n\t *\n\t * @param intents - The user's input query\n\t * @param thread - The thread history\n\t * @returns The detected intent\n\t */\n\tpublic async intentFulfill(\n\t\tintents: Array<TriggeredIntent>,\n\t\tthread: ThreadObject,\n\t): Promise<string> {\n\t\tlet finalResponseText = \"\";\n\t\tfor (let i = 0; i < intents.length; i++) {\n\t\t\tconst { subquery, intent, actionPlan } = intents[i];\n\t\t\tloggers.intent.info(`Process query: ${subquery}, ${intent?.name}`);\n\t\t\tloggers.intent.info(`Action plan: ${actionPlan}`);\n\n\t\t\t// only use for inference, not stored in memory\n\t\t\tfinalResponseText !== \"\" &&\n\t\t\t\tthread.messages.push({\n\t\t\t\t\tmessageId: randomUUID(),\n\t\t\t\t\trole: MessageRole.MODEL,\n\t\t\t\t\ttimestamp: Date.now(),\n\t\t\t\t\tcontent: { type: \"text\", parts: [finalResponseText] },\n\t\t\t\t\tmetadata: { isThinking: true },\n\t\t\t\t});\n\t\t\tawait this.addToThreadMessages(thread, {\n\t\t\t\trole: MessageRole.MODEL,\n\t\t\t\tcontent: subquery,\n\t\t\t\tmetadata: {\n\t\t\t\t\tsubquery,\n\t\t\t\t\tisThinking: true,\n\t\t\t\t\tactionPlan: actionPlan,\n\t\t\t\t},\n\t\t\t});\n\n\t\t\tfinalResponseText = await this.intentFulfilling(subquery, thread, intent);\n\t\t}\n\n\t\tawait this.addToThreadMessages(thread, {\n\t\t\trole: MessageRole.MODEL,\n\t\t\tcontent: finalResponseText,\n\t\t});\n\n\t\treturn finalResponseText;\n\t}\n}\n"],"mappings":"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","names":[]}
@@ -34,10 +34,7 @@ var A2AModule = class {
34
34
  return connectors;
35
35
  }
36
36
  getOrCreateClient(connector) {
37
- if (!connector.client) {
38
- console.log(`Creating A2AClient for ${connector.name} with URL: ${connector.url}`);
39
- connector.client = new A2AClient(connector.url);
40
- }
37
+ connector.client ??= new A2AClient(connector.url);
41
38
  return connector.client;
42
39
  }
43
40
  /**
@@ -64,8 +61,7 @@ var A2AModule = class {
64
61
  description: card.description
65
62
  };
66
63
  tools.push(tool);
67
- } catch (error) {
68
- console.error(`Failed to get agent card for ${name}:`, error.message);
64
+ } catch (_error) {
69
65
  }
70
66
  }
71
67
  return tools;
@@ -165,4 +161,4 @@ ${finalText.join("\n")}`;
165
161
  export {
166
162
  A2AModule
167
163
  };
168
- //# sourceMappingURL=chunk-SHQWRBWS.js.map
164
+ //# sourceMappingURL=chunk-NWL3BMUH.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/modules/a2a/a2a.module.ts"],"sourcesContent":["import { randomUUID } from \"node:crypto\";\nimport type {\n\tAgentCard,\n\tMessage,\n\tMessageSendParams,\n\tTask,\n\tTaskStatusUpdateEvent,\n\tTextPart,\n} from \"@a2a-js/sdk\";\nimport { A2AClient } from \"@a2a-js/sdk/client\";\nimport {\n\tCONNECTOR_PROTOCOL_TYPE,\n\ttype ConnectorTool,\n} from \"@/types/connector.js\";\nimport { ThreadType } from \"@/types/memory.js\";\nimport { loggers } from \"@/utils/logger.js\";\nimport { A2AConnector } from \"./a2a.connector.js\";\n\n/**\n * Module for managing Agent-to-Agent (A2A) protocol connections.\n *\n * This module handles connections to other A2A-compatible agents, manages\n * conversation sessions, and provides an interface for inter-agent communication.\n * Supports multi-turn conversations with task and context tracking.\n */\nexport class A2AModule {\n\t/** Map of A2A server URLs to their corresponding tool instances */\n\tprivate a2aConnectors: Map<string, A2AConnector> = new Map();\n\t/** Map of session IDs to their A2A session state */\n\tprivate a2aTasks: Map<string, string> = new Map();\n\tprivate agentId: string = randomUUID(); /* FIXME */\n\n\t/**\n\t * Registers a new A2A peer server URL for connection.\n\t *\n\t * @param conns - Set of name, url pair\n\t */\n\tpublic async addA2AConnector(conns: {\n\t\t[name: string]: string;\n\t}): Promise<void> {\n\t\tfor (const [name, url] of Object.entries(conns)) {\n\t\t\tconst conn = new A2AConnector(name, url);\n\t\t\tthis.a2aConnectors.set(name, conn);\n\t\t}\n\t}\n\n\tpublic getA2AConnectors(): Array<{ name: string; url: string }> {\n\t\tconst connectors: Array<{ name: string; url: string }> = [];\n\t\tfor (const [name, connector] of this.a2aConnectors.entries()) {\n\t\t\tconnectors.push({ name, url: connector.url });\n\t\t}\n\t\treturn connectors;\n\t}\n\n\tprivate getOrCreateClient(connector: A2AConnector): A2AClient {\n\t\tconnector.client ??= new A2AClient(connector.url);\n\t\treturn connector.client;\n\t}\n\n\t/**\n\t * Retrieves tools from all registered A2A peer servers.\n\t *\n\t * Attempts to connect to each registered server, fetch their agent cards,\n\t * and create tool instances. Disables tools for unreachable servers.\n\t *\n\t * @returns Promise resolving to array of available A2A tools\n\t */\n\tpublic async getTools(): Promise<ConnectorTool[]> {\n\t\tconst tools: ConnectorTool[] = [];\n\t\tfor (const [name, conn] of this.a2aConnectors.entries()) {\n\t\t\tif (!conn.enabled) {\n\t\t\t\tcontinue; // skip disabled agent\n\t\t\t}\n\n\t\t\ttry {\n\t\t\t\tconst client = this.getOrCreateClient(conn);\n\t\t\t\tconst card: AgentCard = await client.getAgentCard();\n\t\t\t\t/* TODO: add each skill as tool? */\n\t\t\t\tconst tool: ConnectorTool = {\n\t\t\t\t\ttoolName: card.name.replaceAll(\" \", \"-\"),\n\t\t\t\t\tconnectorName: name,\n\t\t\t\t\tprotocol: CONNECTOR_PROTOCOL_TYPE.A2A,\n\t\t\t\t\tdescription: card.description,\n\t\t\t\t};\n\n\t\t\t\ttools.push(tool);\n\t\t\t} catch (_error: any) {\n\t\t\t\t// Agent not responded, just skip\n\t\t\t}\n\t\t}\n\t\treturn tools;\n\t}\n\n\t/**\n\t * Constructs a message payload for A2A communication.\n\t *\n\t * Includes session context (task ID and context ID) if available\n\t * for maintaining conversation continuity.\n\t *\n\t * @param query - The message content to send\n\t * @param threadId - The session identifier\n\t * @returns Formatted Message object for A2A protocol\n\t */\n\tpublic getMessagePayload(query: string, threadId: string): Message {\n\t\tconst messagePayload: Message = {\n\t\t\tmessageId: randomUUID(),\n\t\t\tkind: \"message\",\n\t\t\trole: \"user\", // FIXME: it could be 'agent'\n\t\t\tmetadata: {\n\t\t\t\tagentId: this.agentId,\n\t\t\t\ttype: ThreadType.CHAT,\n\t\t\t},\n\t\t\tparts: [\n\t\t\t\t{\n\t\t\t\t\tkind: \"text\",\n\t\t\t\t\ttext: query,\n\t\t\t\t},\n\t\t\t],\n\t\t\tcontextId: threadId,\n\t\t};\n\n\t\tif (this.a2aTasks.has(threadId)) {\n\t\t\tmessagePayload.taskId = this.a2aTasks.get(threadId);\n\t\t}\n\n\t\treturn messagePayload;\n\t}\n\n\t/**\n\t * Executes an A2A tool by sending a message to the remote agent.\n\t *\n\t * Handles streaming responses, maintains session state, and extracts\n\t * text content from various event types in the response stream.\n\t *\n\t * @param tool - The A2ATool instance to use\n\t * @param query - The message to send to the agent\n\t * @param threadId - The session identifier for context tracking\n\t * @returns Promise resolving to array of text responses from the agent\n\t */\n\tpublic async useTool(\n\t\ttool: ConnectorTool,\n\t\tquery: string,\n\t\tthreadId: string,\n\t): Promise<string> {\n\t\tconst finalText: string[] = [];\n\t\tconst connector = this.a2aConnectors.get(tool.connectorName);\n\t\tconst messagePayload = this.getMessagePayload(query, threadId);\n\t\tconst params: MessageSendParams = {\n\t\t\tmessage: messagePayload,\n\t\t};\n\n\t\ttry {\n\t\t\tconst client = this.getOrCreateClient(connector!);\n\t\t\tconst stream = client.sendMessageStream(params);\n\t\t\tfor await (const event of stream) {\n\t\t\t\tif (event.kind === \"status-update\") {\n\t\t\t\t\tconst typedEvent = event as TaskStatusUpdateEvent;\n\t\t\t\t\tif (\n\t\t\t\t\t\ttypedEvent.final &&\n\t\t\t\t\t\ttypedEvent.status.state !== \"input-required\"\n\t\t\t\t\t) {\n\t\t\t\t\t\tthis.a2aTasks.delete(threadId);\n\t\t\t\t\t}\n\t\t\t\t\t// TODO: handle 'file', 'data' parts\n\t\t\t\t\tconst texts = typedEvent.status.message?.parts\n\t\t\t\t\t\t.filter((part) => part.kind === \"text\")\n\t\t\t\t\t\t.map((part: TextPart) => part.text)\n\t\t\t\t\t\t.join(\"\\n\");\n\t\t\t\t\tif (texts) {\n\t\t\t\t\t\tfinalText.push(texts);\n\t\t\t\t\t}\n\t\t\t\t} else if (event.kind === \"message\") {\n\t\t\t\t\t// FIXME: handling text in 'message'?\n\t\t\t\t\tconst msg = event as Message;\n\t\t\t\t\tconst taskId = this.a2aTasks.get(threadId);\n\t\t\t\t\tif (msg.taskId && msg.taskId !== taskId) {\n\t\t\t\t\t\tthis.a2aTasks.set(threadId, msg.taskId);\n\t\t\t\t\t}\n\t\t\t\t} else if (event.kind === \"task\") {\n\t\t\t\t\t// establishing the Task ID\n\t\t\t\t\tconst task = event as Task;\n\t\t\t\t\tif (task.id !== this.a2aTasks.get(threadId)) {\n\t\t\t\t\t\tthis.a2aTasks.set(threadId, task.id);\n\t\t\t\t\t}\n\t\t\t\t} else {\n\t\t\t\t\tloggers.a2a.warn(\"Received unknown event structure from stream:\", {\n\t\t\t\t\t\tevent,\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t}\n\t\t} catch (error) {\n\t\t\tloggers.a2a.error(\"Error communicating with agent:\", { error });\n\t\t\tconst toolResult = `[Bot Called A2A Tool ${tool.toolName}]\\n${typeof error === \"string\" ? error : JSON.stringify(error, null, 2)}`;\n\t\t\treturn toolResult;\n\t\t}\n\n\t\treturn `[Bot Called A2A Tool ${tool.toolName}]\\n${finalText.join(\"\\n\")}`;\n\t}\n}\n"],"mappings":"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","names":[]}
@@ -51,6 +51,11 @@ var IntentFulfillStreamService = class {
51
51
  * @returns AsyncGenerator yielding StreamEvent objects
52
52
  */
53
53
  async *intentFulfilling(query, thread, intent) {
54
+ loggers.intentStream.info("Intent fulfillment started", {
55
+ threadId: thread.threadId,
56
+ query: query.substring(0, 100) + (query.length > 100 ? "..." : ""),
57
+ intentName: intent?.name
58
+ });
54
59
  const systemPrompt = `
55
60
  Today is ${(/* @__PURE__ */ new Date()).toLocaleDateString()}.
56
61
 
@@ -162,6 +167,11 @@ ${intent?.prompt || ""}
162
167
  break;
163
168
  }
164
169
  }
170
+ loggers.intentStream.info("Intent fulfillment completed", {
171
+ threadId: thread.threadId,
172
+ toolCallsExecuted: processList.length,
173
+ intentName: intent?.name
174
+ });
165
175
  }
166
176
  /**
167
177
  * Detects the intent from context.
@@ -171,6 +181,12 @@ ${intent?.prompt || ""}
171
181
  * @returns The detected intent
172
182
  */
173
183
  async *intentFulfillStream(intents, thread) {
184
+ const streamStartTime = Date.now();
185
+ loggers.intentStream.info("Stream session started", {
186
+ threadId: thread.threadId,
187
+ intentCount: intents.length,
188
+ startTime: new Date(streamStartTime).toISOString()
189
+ });
174
190
  let finalResponseText = "";
175
191
  for (let i = 0; i < intents.length; i++) {
176
192
  const { subquery, intent, actionPlan } = intents[i];
@@ -200,7 +216,6 @@ ${intent?.prompt || ""}
200
216
  finalResponseText = "";
201
217
  for await (const event of stream) {
202
218
  if (event.event === "text_chunk" && event.data.delta) {
203
- loggers.intentStream.debug("text_chunk", { event });
204
219
  finalResponseText += event.data.delta;
205
220
  }
206
221
  if (event.event === "text_chunk" && i !== intents.length - 1) {
@@ -213,10 +228,17 @@ ${intent?.prompt || ""}
213
228
  role: "MODEL" /* MODEL */,
214
229
  content: finalResponseText
215
230
  });
231
+ const streamEndTime = Date.now();
232
+ const streamDuration = streamEndTime - streamStartTime;
233
+ loggers.intentStream.info("Stream session completed", {
234
+ threadId: thread.threadId,
235
+ duration: `${streamDuration}ms`,
236
+ endTime: new Date(streamEndTime).toISOString()
237
+ });
216
238
  }
217
239
  };
218
240
 
219
241
  export {
220
242
  IntentFulfillStreamService
221
243
  };
222
- //# sourceMappingURL=chunk-E2RV322Z.js.map
244
+ //# sourceMappingURL=chunk-QCK645XC.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/services/intents/fulfill-stream.service.ts"],"sourcesContent":["import { randomUUID } from \"node:crypto\";\nimport type {\n\tA2AModule,\n\tMCPModule,\n\tMemoryModule,\n\tModelModule,\n} from \"@/modules\";\nimport type { AinAgentPrompts } from \"@/types/agent\";\nimport { CONNECTOR_PROTOCOL_TYPE, type ConnectorTool } from \"@/types/connector\";\nimport {\n\ttype Intent,\n\ttype MessageObject,\n\tMessageRole,\n\ttype ThreadObject,\n\ttype TriggeredIntent,\n} from \"@/types/memory\";\nimport type { StreamEvent } from \"@/types/stream\";\nimport { loggers } from \"@/utils/logger\";\n\nexport class IntentFulfillStreamService {\n\tprivate modelModule: ModelModule;\n\tprivate a2aModule?: A2AModule;\n\tprivate mcpModule?: MCPModule;\n\tprivate memoryModule?: MemoryModule;\n\tprivate prompts?: AinAgentPrompts;\n\n\tconstructor(\n\t\tmodelModule: ModelModule,\n\t\ta2aModule?: A2AModule,\n\t\tmcpModule?: MCPModule,\n\t\tmemoryModule?: MemoryModule,\n\t\tprompts?: AinAgentPrompts,\n\t) {\n\t\tthis.modelModule = modelModule;\n\t\tthis.a2aModule = a2aModule;\n\t\tthis.mcpModule = mcpModule;\n\t\tthis.memoryModule = memoryModule;\n\t\tthis.prompts = prompts;\n\t}\n\n\tprivate async addToThreadMessages(\n\t\tthread: ThreadObject,\n\t\tparams: {\n\t\t\trole: MessageRole;\n\t\t\tcontent: string;\n\t\t\tmetadata?: Record<string, unknown>;\n\t\t},\n\t) {\n\t\ttry {\n\t\t\tconst threadMemory = this.memoryModule?.getThreadMemory();\n\t\t\tconst { userId, threadId } = thread;\n\t\t\tconst newMessage: MessageObject = {\n\t\t\t\tmessageId: randomUUID(),\n\t\t\t\trole: params.role,\n\t\t\t\ttimestamp: Date.now(),\n\t\t\t\tcontent: { type: \"text\", parts: [params.content] },\n\t\t\t\tmetadata: params.metadata,\n\t\t\t};\n\t\t\tthread.messages.push(newMessage);\n\t\t\tawait threadMemory?.addMessagesToThread(userId, threadId, [newMessage]);\n\t\t} catch (error) {\n\t\t\tloggers.intentStream.error(\"Error adding message to thread\", error);\n\t\t}\n\t}\n\n\t/**\n\t * Fulfills the detected intent by generating a streaming response.\n\t *\n\t * Manages the complete inference loop including:\n\t * - Loading prompts and conversation history\n\t * - Collecting available tools from modules\n\t * - Executing model inference with tool support\n\t * - Processing tool calls iteratively until completion\n\t * - Streaming results as Server-Sent Events\n\t *\n\t * @param query - The user's input query\n\t * @param threadId - Thread identifier for context\n\t * @param thread - Previous conversation history\n\t * @param intent - Optional detected intent with custom prompt\n\t * @returns AsyncGenerator yielding StreamEvent objects\n\t */\n\tprivate async *intentFulfilling(\n\t\tquery: string,\n\t\tthread: ThreadObject,\n\t\tintent?: Intent,\n\t): AsyncGenerator<StreamEvent> {\n\t\tloggers.intentStream.info(\"Intent fulfillment started\", {\n\t\t\tthreadId: thread.threadId,\n\t\t\tquery: query.substring(0, 100) + (query.length > 100 ? \"...\" : \"\"),\n\t\t\tintentName: intent?.name,\n\t\t});\n\n\t\tconst systemPrompt = `\nToday is ${new Date().toLocaleDateString()}.\n\n${this.prompts?.agent || \"\"}\n\n${this.prompts?.system || \"\"}\n\n${intent?.prompt || \"\"}\n\t`.trim();\n\n\t\tconst modelInstance = this.modelModule.getModel();\n\t\tconst messages = modelInstance.generateMessages({\n\t\t\tquery,\n\t\t\tthread,\n\t\t\tsystemPrompt: systemPrompt.trim(),\n\t\t});\n\n\t\tconst tools: ConnectorTool[] = [];\n\t\tthis.mcpModule && tools.push(...this.mcpModule.getTools());\n\t\tthis.a2aModule && tools.push(...(await this.a2aModule.getTools()));\n\n\t\tconst functions = modelInstance.convertToolsToFunctions(tools);\n\n\t\tconst processList: string[] = [];\n\n\t\twhile (true) {\n\t\t\tconst responseStream = await modelInstance.fetchStreamWithContextMessage(\n\t\t\t\tmessages,\n\t\t\t\tfunctions,\n\t\t\t);\n\n\t\t\tconst assembledToolCalls: {\n\t\t\t\tid: string;\n\t\t\t\ttype: \"function\";\n\t\t\t\tfunction: { name: string; arguments: string };\n\t\t\t}[] = [];\n\n\t\t\tloggers.intentStream.info(\"messages\", { messages });\n\n\t\t\tfor await (const chunk of responseStream) {\n\t\t\t\tconst delta = chunk.delta;\n\t\t\t\tif (delta?.tool_calls) {\n\t\t\t\t\tfor (const { index, id, function: func } of delta.tool_calls) {\n\t\t\t\t\t\tassembledToolCalls[index] ??= {\n\t\t\t\t\t\t\tid: \"\",\n\t\t\t\t\t\t\ttype: \"function\",\n\t\t\t\t\t\t\tfunction: { name: \"\", arguments: \"\" },\n\t\t\t\t\t\t};\n\n\t\t\t\t\t\tif (id) assembledToolCalls[index].id = id;\n\t\t\t\t\t\tif (func?.name) assembledToolCalls[index].function.name = func.name;\n\t\t\t\t\t\tif (func?.arguments)\n\t\t\t\t\t\t\tassembledToolCalls[index].function.arguments += func.arguments;\n\t\t\t\t\t}\n\t\t\t\t} else if (chunk.delta?.content) {\n\t\t\t\t\tyield {\n\t\t\t\t\t\tevent: \"text_chunk\",\n\t\t\t\t\t\tdata: { delta: chunk.delta.content },\n\t\t\t\t\t};\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tloggers.intentStream.debug(\"assembledToolCalls\", {\n\t\t\t\tassembledToolCalls,\n\t\t\t});\n\n\t\t\tif (assembledToolCalls.length > 0) {\n\t\t\t\tfor (const toolCall of assembledToolCalls) {\n\t\t\t\t\tconst toolCallId = randomUUID();\n\t\t\t\t\tconst toolName = toolCall.function.name;\n\t\t\t\t\tconst selectedTool = tools.filter(\n\t\t\t\t\t\t(tool) => tool.toolName === toolName,\n\t\t\t\t\t)[0];\n\n\t\t\t\t\tlet toolResult = \"\";\n\t\t\t\t\tif (\n\t\t\t\t\t\tthis.mcpModule &&\n\t\t\t\t\t\tselectedTool.protocol === CONNECTOR_PROTOCOL_TYPE.MCP\n\t\t\t\t\t) {\n\t\t\t\t\t\tconst toolArgs = JSON.parse(toolCall.function.arguments) as\n\t\t\t\t\t\t\t| { [x: string]: unknown }\n\t\t\t\t\t\t\t| undefined;\n\t\t\t\t\t\tyield {\n\t\t\t\t\t\t\tevent: \"tool_start\",\n\t\t\t\t\t\t\tdata: {\n\t\t\t\t\t\t\t\ttoolCallId,\n\t\t\t\t\t\t\t\tprotocol: CONNECTOR_PROTOCOL_TYPE.MCP,\n\t\t\t\t\t\t\t\ttoolName,\n\t\t\t\t\t\t\t\ttoolArgs,\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t};\n\t\t\t\t\t\tloggers.intent.info(\"MCP tool call\", { toolName, toolArgs });\n\t\t\t\t\t\ttoolResult = await this.mcpModule.useTool(selectedTool, toolArgs);\n\t\t\t\t\t} else if (\n\t\t\t\t\t\tthis.a2aModule &&\n\t\t\t\t\t\tselectedTool.protocol === CONNECTOR_PROTOCOL_TYPE.A2A\n\t\t\t\t\t) {\n\t\t\t\t\t\tyield {\n\t\t\t\t\t\t\tevent: \"tool_start\",\n\t\t\t\t\t\t\tdata: {\n\t\t\t\t\t\t\t\ttoolCallId,\n\t\t\t\t\t\t\t\tprotocol: CONNECTOR_PROTOCOL_TYPE.A2A,\n\t\t\t\t\t\t\t\ttoolName,\n\t\t\t\t\t\t\t\ttoolArgs: null,\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t};\n\t\t\t\t\t\tloggers.intent.info(\"A2A tool call\", { toolName });\n\t\t\t\t\t\ttoolResult = await this.a2aModule.useTool(\n\t\t\t\t\t\t\tselectedTool,\n\t\t\t\t\t\t\tquery,\n\t\t\t\t\t\t\tthread.threadId,\n\t\t\t\t\t\t);\n\t\t\t\t\t} else {\n\t\t\t\t\t\t// Unrecognized tool type. It cannot be happened...\n\t\t\t\t\t\tloggers.intent.warn(\n\t\t\t\t\t\t\t`Unrecognized tool type: ${selectedTool.protocol}`,\n\t\t\t\t\t\t);\n\t\t\t\t\t\tcontinue;\n\t\t\t\t\t}\n\t\t\t\t\tyield {\n\t\t\t\t\t\tevent: \"tool_output\",\n\t\t\t\t\t\tdata: {\n\t\t\t\t\t\t\ttoolCallId,\n\t\t\t\t\t\t\tprotocol: selectedTool.protocol,\n\t\t\t\t\t\t\ttoolName,\n\t\t\t\t\t\t\tresult: toolResult,\n\t\t\t\t\t\t},\n\t\t\t\t\t};\n\t\t\t\t\tloggers.intent.debug(\"toolResult\", { toolResult });\n\n\t\t\t\t\tprocessList.push(toolResult);\n\t\t\t\t\tmodelInstance.appendMessages(messages, toolResult);\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\n\t\tloggers.intentStream.info(\"Intent fulfillment completed\", {\n\t\t\tthreadId: thread.threadId,\n\t\t\ttoolCallsExecuted: processList.length,\n\t\t\tintentName: intent?.name,\n\t\t});\n\t}\n\n\t/**\n\t * Detects the intent from context.\n\t *\n\t * @param intents - The user's input query\n\t * @param thread - The thread history\n\t * @returns The detected intent\n\t */\n\tpublic async *intentFulfillStream(\n\t\tintents: Array<TriggeredIntent>,\n\t\tthread: ThreadObject,\n\t): AsyncGenerator<StreamEvent> {\n\t\tconst streamStartTime = Date.now();\n\t\tloggers.intentStream.info(\"Stream session started\", {\n\t\t\tthreadId: thread.threadId,\n\t\t\tintentCount: intents.length,\n\t\t\tstartTime: new Date(streamStartTime).toISOString(),\n\t\t});\n\n\t\tlet finalResponseText = \"\";\n\n\t\tfor (let i = 0; i < intents.length; i++) {\n\t\t\tconst { subquery, intent, actionPlan } = intents[i];\n\t\t\tloggers.intent.info(`Process query: ${subquery}, ${intent?.name}`);\n\t\t\tloggers.intent.info(`Action plan: ${actionPlan}`);\n\n\t\t\t// only use for inference, not stored in memory\n\t\t\tfinalResponseText !== \"\" &&\n\t\t\t\tthread.messages.push({\n\t\t\t\t\tmessageId: randomUUID(),\n\t\t\t\t\trole: MessageRole.MODEL,\n\t\t\t\t\ttimestamp: Date.now(),\n\t\t\t\t\tcontent: { type: \"text\", parts: [finalResponseText] },\n\t\t\t\t\tmetadata: { isThinking: true },\n\t\t\t\t});\n\t\t\tawait this.addToThreadMessages(thread, {\n\t\t\t\trole: MessageRole.MODEL,\n\t\t\t\tcontent: subquery,\n\t\t\t\tmetadata: {\n\t\t\t\t\tsubquery,\n\t\t\t\t\tisThinking: true,\n\t\t\t\t\tactionPlan: actionPlan,\n\t\t\t\t},\n\t\t\t});\n\n\t\t\tyield {\n\t\t\t\tevent: \"intent_process\",\n\t\t\t\tdata: { subquery, actionPlan: actionPlan || \"\" },\n\t\t\t};\n\n\t\t\tconst stream = this.intentFulfilling(subquery, thread, intent);\n\n\t\t\tfinalResponseText = \"\";\n\t\t\tfor await (const event of stream) {\n\t\t\t\tif (event.event === \"text_chunk\" && event.data.delta) {\n\t\t\t\t\tfinalResponseText += event.data.delta;\n\t\t\t\t}\n\n\t\t\t\tif (event.event === \"text_chunk\" && i !== intents.length - 1) {\n\t\t\t\t\tcontinue; // skip intermediate text_chunk events\n\t\t\t\t}\n\t\t\t\tyield event;\n\t\t\t}\n\t\t}\n\n\t\tawait this.addToThreadMessages(thread, {\n\t\t\trole: MessageRole.MODEL,\n\t\t\tcontent: finalResponseText,\n\t\t});\n\n\t\tconst streamEndTime = Date.now();\n\t\tconst streamDuration = streamEndTime - streamStartTime;\n\n\t\tloggers.intentStream.info(\"Stream session completed\", {\n\t\t\tthreadId: thread.threadId,\n\t\t\tduration: `${streamDuration}ms`,\n\t\t\tendTime: new Date(streamEndTime).toISOString(),\n\t\t});\n\t}\n}\n"],"mappings":"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","names":[]}
@@ -1,6 +1,6 @@
1
1
  import {
2
2
  IntentFulfillStreamService
3
- } from "./chunk-E2RV322Z.js";
3
+ } from "./chunk-QCK645XC.js";
4
4
  import {
5
5
  IntentTriggerService
6
6
  } from "./chunk-OCONOO5Z.js";
@@ -101,15 +101,21 @@ var QueryStreamService = class {
101
101
  loggers.intent.info(`Create new thread: ${threadId}`);
102
102
  yield { event: "thread_id", data: { type, userId, threadId, title } };
103
103
  }
104
+ const triggeredIntent = await this.intentTriggerService.intentTriggering(query, thread);
104
105
  await threadMemory?.addMessagesToThread(userId, threadId, [
105
106
  {
106
107
  messageId: randomUUID(),
107
108
  role: "USER" /* USER */,
108
109
  timestamp: Date.now(),
109
- content: { type: "text", parts: [query] }
110
+ content: { type: "text", parts: [query] },
111
+ metadata: {
112
+ intents: triggeredIntent.filter((intent) => !!intent.intent).map((intent) => ({
113
+ id: intent.intent?.id,
114
+ subquery: intent.subquery
115
+ }))
116
+ }
110
117
  }
111
118
  ]);
112
- const triggeredIntent = await this.intentTriggerService.intentTriggering(query, thread);
113
119
  const stream = this.intentFulfillStreamService.intentFulfillStream(
114
120
  triggeredIntent,
115
121
  thread
@@ -123,4 +129,4 @@ var QueryStreamService = class {
123
129
  export {
124
130
  QueryStreamService
125
131
  };
126
- //# sourceMappingURL=chunk-XTPDMHUI.js.map
132
+ //# sourceMappingURL=chunk-TZMPHS6S.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/services/query-stream.service.ts"],"sourcesContent":["import { randomUUID } from \"node:crypto\";\nimport { StatusCodes } from \"http-status-codes\";\nimport type {\n\tA2AModule,\n\tMCPModule,\n\tMemoryModule,\n\tModelModule,\n} from \"@/modules/index.js\";\nimport { type AinAgentPrompts, AinHttpError } from \"@/types/agent.js\";\nimport {\n\tMessageRole,\n\ttype ThreadMetadata,\n\ttype ThreadObject,\n\ttype ThreadType,\n\ttype TriggeredIntent,\n} from \"@/types/memory.js\";\nimport type { StreamEvent } from \"@/types/stream\";\nimport { loggers } from \"@/utils/logger.js\";\nimport { IntentFulfillStreamService } from \"./intents/fulfill-stream.service\";\nimport { IntentTriggerService } from \"./intents/trigger.service\";\n\n/**\n * Service for processing user queries through the agent's AI pipeline.\n *\n * Orchestrates the query processing workflow including intent detection,\n * model inference, tool execution, and response generation. Manages\n * conversation context and coordinates between different modules.\n */\nexport class QueryStreamService {\n\tprivate modelModule: ModelModule;\n\tprivate memoryModule?: MemoryModule;\n\tprivate intentTriggerService: IntentTriggerService;\n\tprivate intentFulfillStreamService: IntentFulfillStreamService;\n\n\tconstructor(\n\t\tmodelModule: ModelModule,\n\t\ta2aModule?: A2AModule,\n\t\tmcpModule?: MCPModule,\n\t\tmemoryModule?: MemoryModule,\n\t\tprompts?: AinAgentPrompts,\n\t) {\n\t\tthis.modelModule = modelModule;\n\t\tthis.memoryModule = memoryModule;\n\t\tthis.intentTriggerService = new IntentTriggerService(\n\t\t\tmodelModule,\n\t\t\tmemoryModule,\n\t\t);\n\t\tthis.intentFulfillStreamService = new IntentFulfillStreamService(\n\t\t\tmodelModule,\n\t\t\ta2aModule,\n\t\t\tmcpModule,\n\t\t\tmemoryModule,\n\t\t\tprompts,\n\t\t);\n\t}\n\n\t/**\n\t * Generates a title for the conversation based on the query.\n\t *\n\t * @param query - The user's input query\n\t * @returns Promise resolving to a generated title\n\t */\n\n\tprivate async generateTitle(query: string): Promise<string> {\n\t\tconst DEFAULT_TITLE = \"New Chat\";\n\t\ttry {\n\t\t\tconst modelInstance = this.modelModule.getModel();\n\t\t\tconst messages = modelInstance.generateMessages({\n\t\t\t\tquery,\n\t\t\t\tsystemPrompt: `You are a helpful assistant that generates titles for conversations.\n Please analyze the user's query and create a concise title that accurately reflects the conversation's core topic.\n The title must be no more than 5 words long.\n Respond with only the title. Do not include any punctuation or extra explanations.`,\n\t\t\t});\n\t\t\tconst response = await modelInstance.fetch(messages);\n\t\t\treturn response.content || DEFAULT_TITLE;\n\t\t} catch (error) {\n\t\t\tloggers.intentStream.error(\"Error generating title\", {\n\t\t\t\terror,\n\t\t\t\tquery,\n\t\t\t});\n\t\t\treturn DEFAULT_TITLE;\n\t\t}\n\t}\n\n\t/**\n\t * Main entry point for processing streaming user queries.\n\t *\n\t * Handles the complete query lifecycle:\n\t * 1. Loads or creates thread from memory\n\t * 2. Detects intent from the query\n\t * 3. Fulfills the intent with streaming AI response\n\t * 4. Updates conversation history in real-time\n\t *\n\t * @param threadMetadata - Metadata containing type, userId, and optional threadId\n\t * @param threadMetadata.type - The type of thread (e.g., chat, workflow)\n\t * @param threadMetadata.userId - The user's unique identifier\n\t * @param threadMetadata.threadId - Optional thread identifier\n\t * @param query - The user's input query\n\t * @returns AsyncGenerator yielding StreamEvent objects for SSE\n\t */\n\tpublic async *handleQueryStream(\n\t\tthreadMetadata: {\n\t\t\ttype: ThreadType;\n\t\t\tuserId: string;\n\t\t\tthreadId?: string;\n\t\t},\n\t\tquery: string,\n\t\tisA2A?: boolean,\n\t): AsyncGenerator<StreamEvent> {\n\t\tconst { type, userId } = threadMetadata;\n\t\tconst threadMemory = this.memoryModule?.getThreadMemory();\n\n\t\t// 1. Load or create thread\n\t\tlet threadId = threadMetadata.threadId;\n\t\tlet thread: ThreadObject | undefined;\n\t\tif (threadId) {\n\t\t\tthread = await threadMemory?.getThread(userId, threadId);\n\t\t\tif (!thread && !isA2A) {\n\t\t\t\tthrow new AinHttpError(StatusCodes.NOT_FOUND, \"Thread not found\");\n\t\t\t}\n\t\t}\n\n\t\tthreadId ??= randomUUID();\n\t\tif (!thread) {\n\t\t\tconst title = await this.generateTitle(query);\n\t\t\tconst metadata: ThreadMetadata = (await threadMemory?.createThread(\n\t\t\t\ttype,\n\t\t\t\tuserId,\n\t\t\t\tthreadId,\n\t\t\t\ttitle,\n\t\t\t)) || { type, userId, threadId, title };\n\t\t\tthread = { ...metadata, messages: [] };\n\t\t\tloggers.intent.info(`Create new thread: ${threadId}`);\n\t\t\tyield { event: \"thread_id\", data: { type, userId, threadId, title } };\n\t\t}\n\n\t\t// only add for storage, not for inference\n\t\tawait threadMemory?.addMessagesToThread(userId, threadId, [\n\t\t\t{\n\t\t\t\tmessageId: randomUUID(),\n\t\t\t\trole: MessageRole.USER,\n\t\t\t\ttimestamp: Date.now(),\n\t\t\t\tcontent: { type: \"text\", parts: [query] },\n\t\t\t},\n\t\t]);\n\n\t\t// 2. intent triggering\n\t\tconst triggeredIntent: Array<TriggeredIntent> =\n\t\t\tawait this.intentTriggerService.intentTriggering(query, thread);\n\n\t\t// 3. intent fulfillment\n\t\tconst stream = this.intentFulfillStreamService.intentFulfillStream(\n\t\t\ttriggeredIntent,\n\t\t\tthread,\n\t\t);\n\n\t\tfor await (const event of stream) {\n\t\t\tyield event;\n\t\t}\n\t}\n}\n"],"mappings":";;;;;;;;;;;;;;AAAA,SAAS,kBAAkB;AAC3B,SAAS,mBAAmB;AA2BrB,IAAM,qBAAN,MAAyB;AAAA,EACvB;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EAER,YACC,aACA,WACA,WACA,cACA,SACC;AACD,SAAK,cAAc;AACnB,SAAK,eAAe;AACpB,SAAK,uBAAuB,IAAI;AAAA,MAC/B;AAAA,MACA;AAAA,IACD;AACA,SAAK,6BAA6B,IAAI;AAAA,MACrC;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACD;AAAA,EACD;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASA,MAAc,cAAc,OAAgC;AAC3D,UAAM,gBAAgB;AACtB,QAAI;AACH,YAAM,gBAAgB,KAAK,YAAY,SAAS;AAChD,YAAM,WAAW,cAAc,iBAAiB;AAAA,QAC/C;AAAA,QACA,cAAc;AAAA;AAAA;AAAA;AAAA,MAIf,CAAC;AACD,YAAM,WAAW,MAAM,cAAc,MAAM,QAAQ;AACnD,aAAO,SAAS,WAAW;AAAA,IAC5B,SAAS,OAAO;AACf,cAAQ,aAAa,MAAM,0BAA0B;AAAA,QACpD;AAAA,QACA;AAAA,MACD,CAAC;AACD,aAAO;AAAA,IACR;AAAA,EACD;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAkBA,OAAc,kBACb,gBAKA,OACA,OAC8B;AAC9B,UAAM,EAAE,MAAM,OAAO,IAAI;AACzB,UAAM,eAAe,KAAK,cAAc,gBAAgB;AAGxD,QAAI,WAAW,eAAe;AAC9B,QAAI;AACJ,QAAI,UAAU;AACb,eAAS,MAAM,cAAc,UAAU,QAAQ,QAAQ;AACvD,UAAI,CAAC,UAAU,CAAC,OAAO;AACtB,cAAM,IAAI,aAAa,YAAY,WAAW,kBAAkB;AAAA,MACjE;AAAA,IACD;AAEA,iBAAa,WAAW;AACxB,QAAI,CAAC,QAAQ;AACZ,YAAM,QAAQ,MAAM,KAAK,cAAc,KAAK;AAC5C,YAAM,WAA4B,MAAM,cAAc;AAAA,QACrD;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,MACD,KAAM,EAAE,MAAM,QAAQ,UAAU,MAAM;AACtC,eAAS,EAAE,GAAG,UAAU,UAAU,CAAC,EAAE;AACrC,cAAQ,OAAO,KAAK,sBAAsB,QAAQ,EAAE;AACpD,YAAM,EAAE,OAAO,aAAa,MAAM,EAAE,MAAM,QAAQ,UAAU,MAAM,EAAE;AAAA,IACrE;AAGA,UAAM,cAAc,oBAAoB,QAAQ,UAAU;AAAA,MACzD;AAAA,QACC,WAAW,WAAW;AAAA,QACtB;AAAA,QACA,WAAW,KAAK,IAAI;AAAA,QACpB,SAAS,EAAE,MAAM,QAAQ,OAAO,CAAC,KAAK,EAAE;AAAA,MACzC;AAAA,IACD,CAAC;AAGD,UAAM,kBACL,MAAM,KAAK,qBAAqB,iBAAiB,OAAO,MAAM;AAG/D,UAAM,SAAS,KAAK,2BAA2B;AAAA,MAC9C;AAAA,MACA;AAAA,IACD;AAEA,qBAAiB,SAAS,QAAQ;AACjC,YAAM;AAAA,IACP;AAAA,EACD;AACD;","names":[]}
1
+ {"version":3,"sources":["../../src/services/query-stream.service.ts"],"sourcesContent":["import { randomUUID } from \"node:crypto\";\nimport { StatusCodes } from \"http-status-codes\";\nimport type {\n\tA2AModule,\n\tMCPModule,\n\tMemoryModule,\n\tModelModule,\n} from \"@/modules/index.js\";\nimport { type AinAgentPrompts, AinHttpError } from \"@/types/agent.js\";\nimport {\n\tMessageRole,\n\ttype ThreadMetadata,\n\ttype ThreadObject,\n\ttype ThreadType,\n\ttype TriggeredIntent,\n} from \"@/types/memory.js\";\nimport type { StreamEvent } from \"@/types/stream\";\nimport { loggers } from \"@/utils/logger.js\";\nimport { IntentFulfillStreamService } from \"./intents/fulfill-stream.service\";\nimport { IntentTriggerService } from \"./intents/trigger.service\";\n\n/**\n * Service for processing user queries through the agent's AI pipeline.\n *\n * Orchestrates the query processing workflow including intent detection,\n * model inference, tool execution, and response generation. Manages\n * conversation context and coordinates between different modules.\n */\nexport class QueryStreamService {\n\tprivate modelModule: ModelModule;\n\tprivate memoryModule?: MemoryModule;\n\tprivate intentTriggerService: IntentTriggerService;\n\tprivate intentFulfillStreamService: IntentFulfillStreamService;\n\n\tconstructor(\n\t\tmodelModule: ModelModule,\n\t\ta2aModule?: A2AModule,\n\t\tmcpModule?: MCPModule,\n\t\tmemoryModule?: MemoryModule,\n\t\tprompts?: AinAgentPrompts,\n\t) {\n\t\tthis.modelModule = modelModule;\n\t\tthis.memoryModule = memoryModule;\n\t\tthis.intentTriggerService = new IntentTriggerService(\n\t\t\tmodelModule,\n\t\t\tmemoryModule,\n\t\t);\n\t\tthis.intentFulfillStreamService = new IntentFulfillStreamService(\n\t\t\tmodelModule,\n\t\t\ta2aModule,\n\t\t\tmcpModule,\n\t\t\tmemoryModule,\n\t\t\tprompts,\n\t\t);\n\t}\n\n\t/**\n\t * Generates a title for the conversation based on the query.\n\t *\n\t * @param query - The user's input query\n\t * @returns Promise resolving to a generated title\n\t */\n\n\tprivate async generateTitle(query: string): Promise<string> {\n\t\tconst DEFAULT_TITLE = \"New Chat\";\n\t\ttry {\n\t\t\tconst modelInstance = this.modelModule.getModel();\n\t\t\tconst messages = modelInstance.generateMessages({\n\t\t\t\tquery,\n\t\t\t\tsystemPrompt: `You are a helpful assistant that generates titles for conversations.\n Please analyze the user's query and create a concise title that accurately reflects the conversation's core topic.\n The title must be no more than 5 words long.\n Respond with only the title. Do not include any punctuation or extra explanations.`,\n\t\t\t});\n\t\t\tconst response = await modelInstance.fetch(messages);\n\t\t\treturn response.content || DEFAULT_TITLE;\n\t\t} catch (error) {\n\t\t\tloggers.intentStream.error(\"Error generating title\", {\n\t\t\t\terror,\n\t\t\t\tquery,\n\t\t\t});\n\t\t\treturn DEFAULT_TITLE;\n\t\t}\n\t}\n\n\t/**\n\t * Main entry point for processing streaming user queries.\n\t *\n\t * Handles the complete query lifecycle:\n\t * 1. Loads or creates thread from memory\n\t * 2. Detects intent from the query\n\t * 3. Fulfills the intent with streaming AI response\n\t * 4. Updates conversation history in real-time\n\t *\n\t * @param threadMetadata - Metadata containing type, userId, and optional threadId\n\t * @param threadMetadata.type - The type of thread (e.g., chat, workflow)\n\t * @param threadMetadata.userId - The user's unique identifier\n\t * @param threadMetadata.threadId - Optional thread identifier\n\t * @param query - The user's input query\n\t * @returns AsyncGenerator yielding StreamEvent objects for SSE\n\t */\n\tpublic async *handleQueryStream(\n\t\tthreadMetadata: {\n\t\t\ttype: ThreadType;\n\t\t\tuserId: string;\n\t\t\tthreadId?: string;\n\t\t},\n\t\tquery: string,\n\t\tisA2A?: boolean,\n\t): AsyncGenerator<StreamEvent> {\n\t\tconst { type, userId } = threadMetadata;\n\t\tconst threadMemory = this.memoryModule?.getThreadMemory();\n\n\t\t// 1. Load or create thread\n\t\tlet threadId = threadMetadata.threadId;\n\t\tlet thread: ThreadObject | undefined;\n\t\tif (threadId) {\n\t\t\tthread = await threadMemory?.getThread(userId, threadId);\n\t\t\tif (!thread && !isA2A) {\n\t\t\t\tthrow new AinHttpError(StatusCodes.NOT_FOUND, \"Thread not found\");\n\t\t\t}\n\t\t}\n\n\t\tthreadId ??= randomUUID();\n\t\tif (!thread) {\n\t\t\tconst title = await this.generateTitle(query);\n\t\t\tconst metadata: ThreadMetadata = (await threadMemory?.createThread(\n\t\t\t\ttype,\n\t\t\t\tuserId,\n\t\t\t\tthreadId,\n\t\t\t\ttitle,\n\t\t\t)) || { type, userId, threadId, title };\n\t\t\tthread = { ...metadata, messages: [] };\n\t\t\tloggers.intent.info(`Create new thread: ${threadId}`);\n\t\t\tyield { event: \"thread_id\", data: { type, userId, threadId, title } };\n\t\t}\n\n\t\t// 2. intent triggering\n\t\tconst triggeredIntent: Array<TriggeredIntent> =\n\t\t\tawait this.intentTriggerService.intentTriggering(query, thread);\n\n\t\t// only add for storage, not for inference\n\t\tawait threadMemory?.addMessagesToThread(userId, threadId, [\n\t\t\t{\n\t\t\t\tmessageId: randomUUID(),\n\t\t\t\trole: MessageRole.USER,\n\t\t\t\ttimestamp: Date.now(),\n\t\t\t\tcontent: { type: \"text\", parts: [query] },\n\t\t\t\tmetadata: {\n\t\t\t\t\tintents: triggeredIntent\n\t\t\t\t\t\t.filter((intent) => !!intent.intent)\n\t\t\t\t\t\t.map((intent) => ({\n\t\t\t\t\t\t\tid: intent.intent?.id,\n\t\t\t\t\t\t\tsubquery: intent.subquery,\n\t\t\t\t\t\t})),\n\t\t\t\t},\n\t\t\t},\n\t\t]);\n\n\t\t// 3. intent fulfillment\n\t\tconst stream = this.intentFulfillStreamService.intentFulfillStream(\n\t\t\ttriggeredIntent,\n\t\t\tthread,\n\t\t);\n\n\t\tfor await (const event of stream) {\n\t\t\tyield event;\n\t\t}\n\t}\n}\n"],"mappings":";;;;;;;;;;;;;;AAAA,SAAS,kBAAkB;AAC3B,SAAS,mBAAmB;AA2BrB,IAAM,qBAAN,MAAyB;AAAA,EACvB;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EAER,YACC,aACA,WACA,WACA,cACA,SACC;AACD,SAAK,cAAc;AACnB,SAAK,eAAe;AACpB,SAAK,uBAAuB,IAAI;AAAA,MAC/B;AAAA,MACA;AAAA,IACD;AACA,SAAK,6BAA6B,IAAI;AAAA,MACrC;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACD;AAAA,EACD;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASA,MAAc,cAAc,OAAgC;AAC3D,UAAM,gBAAgB;AACtB,QAAI;AACH,YAAM,gBAAgB,KAAK,YAAY,SAAS;AAChD,YAAM,WAAW,cAAc,iBAAiB;AAAA,QAC/C;AAAA,QACA,cAAc;AAAA;AAAA;AAAA;AAAA,MAIf,CAAC;AACD,YAAM,WAAW,MAAM,cAAc,MAAM,QAAQ;AACnD,aAAO,SAAS,WAAW;AAAA,IAC5B,SAAS,OAAO;AACf,cAAQ,aAAa,MAAM,0BAA0B;AAAA,QACpD;AAAA,QACA;AAAA,MACD,CAAC;AACD,aAAO;AAAA,IACR;AAAA,EACD;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAkBA,OAAc,kBACb,gBAKA,OACA,OAC8B;AAC9B,UAAM,EAAE,MAAM,OAAO,IAAI;AACzB,UAAM,eAAe,KAAK,cAAc,gBAAgB;AAGxD,QAAI,WAAW,eAAe;AAC9B,QAAI;AACJ,QAAI,UAAU;AACb,eAAS,MAAM,cAAc,UAAU,QAAQ,QAAQ;AACvD,UAAI,CAAC,UAAU,CAAC,OAAO;AACtB,cAAM,IAAI,aAAa,YAAY,WAAW,kBAAkB;AAAA,MACjE;AAAA,IACD;AAEA,iBAAa,WAAW;AACxB,QAAI,CAAC,QAAQ;AACZ,YAAM,QAAQ,MAAM,KAAK,cAAc,KAAK;AAC5C,YAAM,WAA4B,MAAM,cAAc;AAAA,QACrD;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,MACD,KAAM,EAAE,MAAM,QAAQ,UAAU,MAAM;AACtC,eAAS,EAAE,GAAG,UAAU,UAAU,CAAC,EAAE;AACrC,cAAQ,OAAO,KAAK,sBAAsB,QAAQ,EAAE;AACpD,YAAM,EAAE,OAAO,aAAa,MAAM,EAAE,MAAM,QAAQ,UAAU,MAAM,EAAE;AAAA,IACrE;AAGA,UAAM,kBACL,MAAM,KAAK,qBAAqB,iBAAiB,OAAO,MAAM;AAG/D,UAAM,cAAc,oBAAoB,QAAQ,UAAU;AAAA,MACzD;AAAA,QACC,WAAW,WAAW;AAAA,QACtB;AAAA,QACA,WAAW,KAAK,IAAI;AAAA,QACpB,SAAS,EAAE,MAAM,QAAQ,OAAO,CAAC,KAAK,EAAE;AAAA,QACxC,UAAU;AAAA,UACT,SAAS,gBACP,OAAO,CAAC,WAAW,CAAC,CAAC,OAAO,MAAM,EAClC,IAAI,CAAC,YAAY;AAAA,YACjB,IAAI,OAAO,QAAQ;AAAA,YACnB,UAAU,OAAO;AAAA,UAClB,EAAE;AAAA,QACJ;AAAA,MACD;AAAA,IACD,CAAC;AAGD,UAAM,SAAS,KAAK,2BAA2B;AAAA,MAC9C;AAAA,MACA;AAAA,IACD;AAEA,qBAAiB,SAAS,QAAQ;AACjC,YAAM;AAAA,IACP;AAAA,EACD;AACD;","names":[]}
@@ -0,0 +1 @@
1
+ //# sourceMappingURL=chunk-U7REZSMO.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":[],"sourcesContent":[],"mappings":"","names":[]}
@@ -3,7 +3,7 @@ import {
3
3
  } from "./chunk-DM6UZSRU.js";
4
4
  import {
5
5
  QueryStreamService
6
- } from "./chunk-XTPDMHUI.js";
6
+ } from "./chunk-TZMPHS6S.js";
7
7
  import {
8
8
  A2AController
9
9
  } from "./chunk-HAE333YO.js";
@@ -34,4 +34,4 @@ var createA2ARouter = (agent) => {
34
34
  export {
35
35
  createA2ARouter
36
36
  };
37
- //# sourceMappingURL=chunk-5T7E533R.js.map
37
+ //# sourceMappingURL=chunk-WOW36XUD.js.map
@@ -0,0 +1,45 @@
1
+ // src/services/thread.service.ts
2
+ var ThreadService = class {
3
+ memoryModule;
4
+ constructor(memoryModule) {
5
+ this.memoryModule = memoryModule;
6
+ }
7
+ async getThread(userId, threadId) {
8
+ const threadMemory = this.memoryModule?.getThreadMemory();
9
+ if (!this.memoryModule || !threadMemory) {
10
+ return;
11
+ }
12
+ return await threadMemory.getThread(userId, threadId);
13
+ }
14
+ async createThread(type, userId, threadId, title) {
15
+ const threadMemory = this.memoryModule?.getThreadMemory();
16
+ if (!this.memoryModule || !threadMemory) {
17
+ return {
18
+ type,
19
+ userId,
20
+ threadId,
21
+ title,
22
+ messages: []
23
+ };
24
+ }
25
+ const metadata = await threadMemory.createThread(
26
+ type,
27
+ userId,
28
+ threadId,
29
+ title
30
+ );
31
+ return { ...metadata, messages: [] };
32
+ }
33
+ async addMessagesToThread(userId, threadId, messages) {
34
+ const threadMemory = this.memoryModule?.getThreadMemory();
35
+ if (!this.memoryModule || !threadMemory) {
36
+ return;
37
+ }
38
+ await threadMemory.addMessagesToThread(userId, threadId, messages);
39
+ }
40
+ };
41
+
42
+ export {
43
+ ThreadService
44
+ };
45
+ //# sourceMappingURL=chunk-WZQVH4XY.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/services/thread.service.ts"],"sourcesContent":["import type { MemoryModule } from \"@/modules\";\nimport type {\n\tMessageObject,\n\tThreadMetadata,\n\tThreadObject,\n\tThreadType,\n} from \"@/types/memory\";\n\nexport class ThreadService {\n\tprivate memoryModule?: MemoryModule;\n\n\tconstructor(memoryModule?: MemoryModule) {\n\t\tthis.memoryModule = memoryModule;\n\t}\n\n\tpublic async getThread(\n\t\tuserId: string,\n\t\tthreadId: string,\n\t): Promise<ThreadObject | undefined> {\n\t\tconst threadMemory = this.memoryModule?.getThreadMemory();\n\t\tif (!this.memoryModule || !threadMemory) {\n\t\t\treturn;\n\t\t}\n\n\t\treturn await threadMemory.getThread(userId, threadId);\n\t}\n\n\tpublic async createThread(\n\t\ttype: ThreadType,\n\t\tuserId: string,\n\t\tthreadId: string,\n\t\ttitle: string,\n\t): Promise<ThreadObject> {\n\t\tconst threadMemory = this.memoryModule?.getThreadMemory();\n\t\tif (!this.memoryModule || !threadMemory) {\n\t\t\treturn {\n\t\t\t\ttype,\n\t\t\t\tuserId,\n\t\t\t\tthreadId,\n\t\t\t\ttitle,\n\t\t\t\tmessages: [],\n\t\t\t};\n\t\t}\n\n\t\tconst metadata: ThreadMetadata = await threadMemory.createThread(\n\t\t\ttype,\n\t\t\tuserId,\n\t\t\tthreadId,\n\t\t\ttitle,\n\t\t);\n\t\treturn { ...metadata, messages: [] };\n\t}\n\n\tpublic async addMessagesToThread(\n\t\tuserId: string,\n\t\tthreadId: string,\n\t\tmessages: Array<MessageObject>,\n\t): Promise<void> {\n\t\tconst threadMemory = this.memoryModule?.getThreadMemory();\n\t\tif (!this.memoryModule || !threadMemory) {\n\t\t\treturn;\n\t\t}\n\n\t\tawait threadMemory.addMessagesToThread(userId, threadId, messages);\n\t}\n}\n"],"mappings":";AAQO,IAAM,gBAAN,MAAoB;AAAA,EAClB;AAAA,EAER,YAAY,cAA6B;AACxC,SAAK,eAAe;AAAA,EACrB;AAAA,EAEA,MAAa,UACZ,QACA,UACoC;AACpC,UAAM,eAAe,KAAK,cAAc,gBAAgB;AACxD,QAAI,CAAC,KAAK,gBAAgB,CAAC,cAAc;AACxC;AAAA,IACD;AAEA,WAAO,MAAM,aAAa,UAAU,QAAQ,QAAQ;AAAA,EACrD;AAAA,EAEA,MAAa,aACZ,MACA,QACA,UACA,OACwB;AACxB,UAAM,eAAe,KAAK,cAAc,gBAAgB;AACxD,QAAI,CAAC,KAAK,gBAAgB,CAAC,cAAc;AACxC,aAAO;AAAA,QACN;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA,UAAU,CAAC;AAAA,MACZ;AAAA,IACD;AAEA,UAAM,WAA2B,MAAM,aAAa;AAAA,MACnD;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACD;AACA,WAAO,EAAE,GAAG,UAAU,UAAU,CAAC,EAAE;AAAA,EACpC;AAAA,EAEA,MAAa,oBACZ,QACA,UACA,UACgB;AAChB,UAAM,eAAe,KAAK,cAAc,gBAAgB;AACxD,QAAI,CAAC,KAAK,gBAAgB,CAAC,cAAc;AACxC;AAAA,IACD;AAEA,UAAM,aAAa,oBAAoB,QAAQ,UAAU,QAAQ;AAAA,EAClE;AACD;","names":[]}
@@ -0,0 +1,26 @@
1
+ // src/controllers/intent.controller.ts
2
+ import { StatusCodes } from "http-status-codes";
3
+ var IntentController = class {
4
+ threadService;
5
+ triggerService;
6
+ constructor(threadService, triggerService) {
7
+ this.threadService = threadService;
8
+ this.triggerService = triggerService;
9
+ }
10
+ handleIntentTrigger = async (req, res, next) => {
11
+ const { query, threadId } = req.body;
12
+ const userId = res.locals.userId;
13
+ try {
14
+ const thread = await this.threadService.getThread(userId, threadId);
15
+ const result = await this.triggerService.intentTriggering(query, thread);
16
+ res.status(StatusCodes.OK).json(result);
17
+ } catch (error) {
18
+ next(error);
19
+ }
20
+ };
21
+ };
22
+
23
+ export {
24
+ IntentController
25
+ };
26
+ //# sourceMappingURL=chunk-YUKPKFX5.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/controllers/intent.controller.ts"],"sourcesContent":["import type { NextFunction, Request, Response } from \"express\";\nimport { StatusCodes } from \"http-status-codes\";\nimport type { IntentTriggerService } from \"@/services\";\nimport type { ThreadService } from \"@/services/thread.service\";\n\nexport class IntentController {\n\tprivate threadService: ThreadService;\n\tprivate triggerService: IntentTriggerService;\n\n\tconstructor(\n\t\tthreadService: ThreadService,\n\t\ttriggerService: IntentTriggerService,\n\t) {\n\t\tthis.threadService = threadService;\n\t\tthis.triggerService = triggerService;\n\t}\n\n\tpublic handleIntentTrigger = async (\n\t\treq: Request,\n\t\tres: Response,\n\t\tnext: NextFunction,\n\t) => {\n\t\tconst { query, threadId } = req.body;\n\t\tconst userId = res.locals.userId;\n\n\t\ttry {\n\t\t\tconst thread = await this.threadService.getThread(userId, threadId);\n\t\t\tconst result = await this.triggerService.intentTriggering(query, thread);\n\n\t\t\tres.status(StatusCodes.OK).json(result);\n\t\t} catch (error) {\n\t\t\tnext(error);\n\t\t}\n\t};\n}\n"],"mappings":";AACA,SAAS,mBAAmB;AAIrB,IAAM,mBAAN,MAAuB;AAAA,EACrB;AAAA,EACA;AAAA,EAER,YACC,eACA,gBACC;AACD,SAAK,gBAAgB;AACrB,SAAK,iBAAiB;AAAA,EACvB;AAAA,EAEO,sBAAsB,OAC5B,KACA,KACA,SACI;AACJ,UAAM,EAAE,OAAO,SAAS,IAAI,IAAI;AAChC,UAAM,SAAS,IAAI,OAAO;AAE1B,QAAI;AACH,YAAM,SAAS,MAAM,KAAK,cAAc,UAAU,QAAQ,QAAQ;AAClE,YAAM,SAAS,MAAM,KAAK,eAAe,iBAAiB,OAAO,MAAM;AAEvE,UAAI,OAAO,YAAY,EAAE,EAAE,KAAK,MAAM;AAAA,IACvC,SAAS,OAAO;AACf,WAAK,KAAK;AAAA,IACX;AAAA,EACD;AACD;","names":[]}
@@ -1,12 +1,12 @@
1
1
  import {
2
2
  QueryService
3
- } from "./chunk-IRGR2OHS.js";
3
+ } from "./chunk-6GA26MT4.js";
4
4
  import {
5
5
  QueryController
6
6
  } from "./chunk-4C2TLCWI.js";
7
7
  import {
8
8
  QueryStreamService
9
- } from "./chunk-XTPDMHUI.js";
9
+ } from "./chunk-TZMPHS6S.js";
10
10
 
11
11
  // src/routes/query.routes.ts
12
12
  import { Router } from "express";
@@ -40,4 +40,4 @@ var createQueryRouter = (agent, allowStream = false) => {
40
40
  export {
41
41
  createQueryRouter
42
42
  };
43
- //# sourceMappingURL=chunk-6OHUQ6DV.js.map
43
+ //# sourceMappingURL=chunk-ZOWTQAV5.js.map