openloops 0.1.8 → 0.1.10

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 (296) hide show
  1. package/dist/chunk-XRJFNASX.mjs +14 -0
  2. package/dist/common/clients/index.js +26 -0
  3. package/dist/common/clients/index.mjs +3 -0
  4. package/dist/common/clients/llm-client.js +159 -0
  5. package/dist/common/clients/llm-client.mjs +126 -0
  6. package/dist/common/clients/sentry-client.js +87 -0
  7. package/dist/common/clients/sentry-client.mjs +53 -0
  8. package/dist/common/clients/serper-client.js +74 -0
  9. package/dist/common/clients/serper-client.mjs +41 -0
  10. package/dist/common/core/base.app.js +57 -0
  11. package/dist/common/core/base.app.mjs +34 -0
  12. package/dist/common/core/base.entity.js +208 -0
  13. package/dist/common/core/base.entity.mjs +179 -0
  14. package/dist/common/core/base.use-case.js +30 -0
  15. package/dist/common/core/base.use-case.mjs +7 -0
  16. package/dist/common/core/index.js +1 -0
  17. package/dist/common/core/index.mjs +0 -0
  18. package/dist/common/core/utils/delete-empty-fields.js +66 -0
  19. package/dist/common/core/utils/delete-empty-fields.mjs +43 -0
  20. package/dist/common/core/utils/flatten-object.js +45 -0
  21. package/dist/common/core/utils/flatten-object.mjs +22 -0
  22. package/dist/common/core/utils/index.js +26 -0
  23. package/dist/common/core/utils/index.mjs +3 -0
  24. package/dist/common/core/utils/is-plain-object.js +32 -0
  25. package/dist/common/core/utils/is-plain-object.mjs +9 -0
  26. package/dist/common/decorators/admin-only/admin-only.js +52 -0
  27. package/dist/common/decorators/admin-only/admin-only.mjs +28 -0
  28. package/dist/common/decorators/admin-only/index.js +22 -0
  29. package/dist/common/decorators/admin-only/index.mjs +1 -0
  30. package/dist/common/decorators/index.js +26 -0
  31. package/dist/common/decorators/index.mjs +3 -0
  32. package/dist/common/decorators/mask-in-logs/index.js +22 -0
  33. package/dist/common/decorators/mask-in-logs/index.mjs +1 -0
  34. package/dist/common/decorators/mask-in-logs/mask-in-logs.js +53 -0
  35. package/dist/common/decorators/mask-in-logs/mask-in-logs.mjs +29 -0
  36. package/dist/common/decorators/owner-only/index.js +22 -0
  37. package/dist/common/decorators/owner-only/index.mjs +1 -0
  38. package/dist/common/decorators/owner-only/owner-only.js +52 -0
  39. package/dist/common/decorators/owner-only/owner-only.mjs +28 -0
  40. package/dist/common/error/http-error.js +37 -0
  41. package/dist/common/error/http-error.mjs +14 -0
  42. package/dist/common/error/index.js +24 -0
  43. package/dist/common/error/index.mjs +2 -0
  44. package/dist/common/error/reportError.js +51 -0
  45. package/dist/common/error/reportError.mjs +28 -0
  46. package/dist/common/helpers/extract-json-from-text.js +63 -0
  47. package/dist/common/helpers/extract-json-from-text.mjs +40 -0
  48. package/dist/common/helpers/index.js +24 -0
  49. package/dist/common/helpers/index.mjs +2 -0
  50. package/dist/common/helpers/sanitize-string.js +45 -0
  51. package/dist/common/helpers/sanitize-string.mjs +12 -0
  52. package/dist/common/logger/index.js +22 -0
  53. package/dist/common/logger/index.mjs +1 -0
  54. package/dist/common/logger/pino.js +70 -0
  55. package/dist/common/logger/pino.mjs +36 -0
  56. package/dist/common/repositories/index.js +24 -0
  57. package/dist/common/repositories/index.mjs +2 -0
  58. package/dist/common/repositories/mongo-db.client.js +79 -0
  59. package/dist/common/repositories/mongo-db.client.mjs +57 -0
  60. package/dist/common/repositories/mongo-db.repository.js +219 -0
  61. package/dist/common/repositories/mongo-db.repository.mjs +196 -0
  62. package/dist/common/utils/secret-manager.js +105 -0
  63. package/dist/common/utils/secret-manager.mjs +71 -0
  64. package/dist/index.js +22 -7
  65. package/dist/index.mjs +1 -7
  66. package/dist/services/agent/core/agent-loop.js +29 -0
  67. package/dist/services/agent/core/agent-loop.mjs +6 -0
  68. package/dist/services/agent/core/agent-state.js +102 -0
  69. package/dist/services/agent/core/agent-state.mjs +78 -0
  70. package/dist/services/agent/core/agent.js +351 -0
  71. package/dist/services/agent/core/agent.mjs +327 -0
  72. package/dist/services/agent/core/index.js +26 -0
  73. package/dist/services/agent/core/index.mjs +3 -0
  74. package/dist/services/agent/loops/index.js +24 -0
  75. package/dist/services/agent/loops/index.mjs +2 -0
  76. package/dist/services/agent/loops/plan-execute/index.js +22 -0
  77. package/dist/services/agent/loops/plan-execute/index.mjs +1 -0
  78. package/dist/services/agent/loops/plan-execute/plan-execute-loop.js +242 -0
  79. package/dist/services/agent/loops/plan-execute/plan-execute-loop.mjs +226 -0
  80. package/dist/services/agent/loops/shared/index.js +22 -0
  81. package/dist/services/agent/loops/shared/index.mjs +1 -0
  82. package/dist/services/agent/loops/shared/skills/action-planner.js +68 -0
  83. package/dist/services/agent/loops/shared/skills/action-planner.mjs +45 -0
  84. package/dist/services/agent/loops/shared/skills/confirmation-gate.js +53 -0
  85. package/dist/services/agent/loops/shared/skills/confirmation-gate.mjs +30 -0
  86. package/dist/services/agent/loops/shared/skills/fast-responder.js +70 -0
  87. package/dist/services/agent/loops/shared/skills/fast-responder.mjs +47 -0
  88. package/dist/services/agent/loops/shared/skills/final-responder.js +57 -0
  89. package/dist/services/agent/loops/shared/skills/final-responder.mjs +34 -0
  90. package/dist/services/agent/loops/shared/skills/index.js +32 -0
  91. package/dist/services/agent/loops/shared/skills/index.mjs +6 -0
  92. package/dist/services/agent/loops/shared/skills/state-observer.js +57 -0
  93. package/dist/services/agent/loops/shared/skills/state-observer.mjs +34 -0
  94. package/dist/services/agent/loops/shared/skills/strategy-engine.js +60 -0
  95. package/dist/services/agent/loops/shared/skills/strategy-engine.mjs +37 -0
  96. package/dist/services/agent/modules/chats/entities/agent-action.entity.js +151 -0
  97. package/dist/services/agent/modules/chats/entities/agent-action.entity.mjs +128 -0
  98. package/dist/services/agent/modules/chats/entities/agent-task.entity.js +231 -0
  99. package/dist/services/agent/modules/chats/entities/agent-task.entity.mjs +207 -0
  100. package/dist/services/agent/modules/chats/entities/chat-context.entity.js +70 -0
  101. package/dist/services/agent/modules/chats/entities/chat-context.entity.mjs +47 -0
  102. package/dist/services/agent/modules/chats/entities/chat-message.entity.js +58 -0
  103. package/dist/services/agent/modules/chats/entities/chat-message.entity.mjs +35 -0
  104. package/dist/services/agent/modules/chats/entities/chat-settings.entity.js +63 -0
  105. package/dist/services/agent/modules/chats/entities/chat-settings.entity.mjs +40 -0
  106. package/dist/services/agent/modules/chats/entities/chat.entity.js +163 -0
  107. package/dist/services/agent/modules/chats/entities/chat.entity.mjs +140 -0
  108. package/dist/services/agent/modules/chats/entities/index.js +22 -0
  109. package/dist/services/agent/modules/chats/entities/index.mjs +1 -0
  110. package/dist/services/agent/modules/chats/lambdas/create-chat/create-chat.use-case.js +56 -0
  111. package/dist/services/agent/modules/chats/lambdas/create-chat/create-chat.use-case.mjs +27 -0
  112. package/dist/services/agent/modules/chats/lambdas/create-chat/index.js +22 -0
  113. package/dist/services/agent/modules/chats/lambdas/create-chat/index.mjs +1 -0
  114. package/dist/services/agent/modules/chats/lambdas/delete-chat/delete-chat.use-case.js +61 -0
  115. package/dist/services/agent/modules/chats/lambdas/delete-chat/delete-chat.use-case.mjs +32 -0
  116. package/dist/services/agent/modules/chats/lambdas/delete-chat/index.js +22 -0
  117. package/dist/services/agent/modules/chats/lambdas/delete-chat/index.mjs +1 -0
  118. package/dist/services/agent/modules/chats/lambdas/get-chat-by-id/get-chat-by-id.use-case.js +52 -0
  119. package/dist/services/agent/modules/chats/lambdas/get-chat-by-id/get-chat-by-id.use-case.mjs +23 -0
  120. package/dist/services/agent/modules/chats/lambdas/get-chat-by-id/index.js +22 -0
  121. package/dist/services/agent/modules/chats/lambdas/get-chat-by-id/index.mjs +1 -0
  122. package/dist/services/agent/modules/chats/lambdas/interrupt-execution/index.js +22 -0
  123. package/dist/services/agent/modules/chats/lambdas/interrupt-execution/index.mjs +1 -0
  124. package/dist/services/agent/modules/chats/lambdas/interrupt-execution/interrupt-execution.use-case.js +64 -0
  125. package/dist/services/agent/modules/chats/lambdas/interrupt-execution/interrupt-execution.use-case.mjs +35 -0
  126. package/dist/services/agent/modules/chats/lambdas/list-chats-by-props/index.js +22 -0
  127. package/dist/services/agent/modules/chats/lambdas/list-chats-by-props/index.mjs +1 -0
  128. package/dist/services/agent/modules/chats/lambdas/list-chats-by-props/list-chats-by-props.use-case.js +52 -0
  129. package/dist/services/agent/modules/chats/lambdas/list-chats-by-props/list-chats-by-props.use-case.mjs +23 -0
  130. package/dist/services/agent/modules/chats/lambdas/list-chats-by-user/index.js +22 -0
  131. package/dist/services/agent/modules/chats/lambdas/list-chats-by-user/index.mjs +1 -0
  132. package/dist/services/agent/modules/chats/lambdas/list-chats-by-user/list-chats-by-user.use-case.js +59 -0
  133. package/dist/services/agent/modules/chats/lambdas/list-chats-by-user/list-chats-by-user.use-case.mjs +30 -0
  134. package/dist/services/agent/modules/chats/lambdas/update-chat/index.js +22 -0
  135. package/dist/services/agent/modules/chats/lambdas/update-chat/index.mjs +1 -0
  136. package/dist/services/agent/modules/chats/lambdas/update-chat/update-chat.use-case.js +64 -0
  137. package/dist/services/agent/modules/chats/lambdas/update-chat/update-chat.use-case.mjs +35 -0
  138. package/dist/services/agent/modules/chats/repositories/chat.repository.js +67 -0
  139. package/dist/services/agent/modules/chats/repositories/chat.repository.mjs +38 -0
  140. package/dist/services/agent/modules/chats/repositories/index.js +22 -0
  141. package/dist/services/agent/modules/chats/repositories/index.mjs +1 -0
  142. package/dist/services/agent/modules/llmcalls/entities/index.js +22 -0
  143. package/dist/services/agent/modules/llmcalls/entities/index.mjs +1 -0
  144. package/dist/services/agent/modules/llmcalls/entities/llmcall.entity.js +71 -0
  145. package/dist/services/agent/modules/llmcalls/entities/llmcall.entity.mjs +48 -0
  146. package/dist/services/agent/modules/llmcalls/lambdas/create-llmcall/create-llmcall.use-case.js +56 -0
  147. package/dist/services/agent/modules/llmcalls/lambdas/create-llmcall/create-llmcall.use-case.mjs +27 -0
  148. package/dist/services/agent/modules/llmcalls/lambdas/create-llmcall/index.js +22 -0
  149. package/dist/services/agent/modules/llmcalls/lambdas/create-llmcall/index.mjs +1 -0
  150. package/dist/services/agent/modules/llmcalls/lambdas/delete-llmcall/delete-llmcall.use-case.js +61 -0
  151. package/dist/services/agent/modules/llmcalls/lambdas/delete-llmcall/delete-llmcall.use-case.mjs +32 -0
  152. package/dist/services/agent/modules/llmcalls/lambdas/delete-llmcall/index.js +22 -0
  153. package/dist/services/agent/modules/llmcalls/lambdas/delete-llmcall/index.mjs +1 -0
  154. package/dist/services/agent/modules/llmcalls/lambdas/get-llm-usage/get-llm-usage.use-case.js +123 -0
  155. package/dist/services/agent/modules/llmcalls/lambdas/get-llm-usage/get-llm-usage.use-case.mjs +94 -0
  156. package/dist/services/agent/modules/llmcalls/lambdas/get-llm-usage/index.js +22 -0
  157. package/dist/services/agent/modules/llmcalls/lambdas/get-llm-usage/index.mjs +1 -0
  158. package/dist/services/agent/modules/llmcalls/lambdas/get-llmcall-by-id/get-llmcall-by-id.use-case.js +52 -0
  159. package/dist/services/agent/modules/llmcalls/lambdas/get-llmcall-by-id/get-llmcall-by-id.use-case.mjs +23 -0
  160. package/dist/services/agent/modules/llmcalls/lambdas/get-llmcall-by-id/index.js +22 -0
  161. package/dist/services/agent/modules/llmcalls/lambdas/get-llmcall-by-id/index.mjs +1 -0
  162. package/dist/services/agent/modules/llmcalls/lambdas/list-llmcalls-by-props/index.js +22 -0
  163. package/dist/services/agent/modules/llmcalls/lambdas/list-llmcalls-by-props/index.mjs +1 -0
  164. package/dist/services/agent/modules/llmcalls/lambdas/list-llmcalls-by-props/list-llmcalls-by-props.use-case.js +52 -0
  165. package/dist/services/agent/modules/llmcalls/lambdas/list-llmcalls-by-props/list-llmcalls-by-props.use-case.mjs +23 -0
  166. package/dist/services/agent/modules/llmcalls/lambdas/update-llmcall/index.js +22 -0
  167. package/dist/services/agent/modules/llmcalls/lambdas/update-llmcall/index.mjs +1 -0
  168. package/dist/services/agent/modules/llmcalls/lambdas/update-llmcall/update-llmcall.use-case.js +62 -0
  169. package/dist/services/agent/modules/llmcalls/lambdas/update-llmcall/update-llmcall.use-case.mjs +33 -0
  170. package/dist/services/agent/modules/llmcalls/repositories/index.js +22 -0
  171. package/dist/services/agent/modules/llmcalls/repositories/index.mjs +1 -0
  172. package/dist/services/agent/modules/llmcalls/repositories/llmcall.repository.js +67 -0
  173. package/dist/services/agent/modules/llmcalls/repositories/llmcall.repository.mjs +38 -0
  174. package/dist/services/agent/modules/mcp-servers/entities/index.js +22 -0
  175. package/dist/services/agent/modules/mcp-servers/entities/index.mjs +1 -0
  176. package/dist/services/agent/modules/mcp-servers/entities/mcpserver.entity.js +79 -0
  177. package/dist/services/agent/modules/mcp-servers/entities/mcpserver.entity.mjs +56 -0
  178. package/dist/services/agent/modules/mcp-servers/lambdas/create-mcpserver/create-mcpserver.use-case.js +56 -0
  179. package/dist/services/agent/modules/mcp-servers/lambdas/create-mcpserver/create-mcpserver.use-case.mjs +27 -0
  180. package/dist/services/agent/modules/mcp-servers/lambdas/create-mcpserver/index.js +22 -0
  181. package/dist/services/agent/modules/mcp-servers/lambdas/create-mcpserver/index.mjs +1 -0
  182. package/dist/services/agent/modules/mcp-servers/lambdas/delete-mcpserver/delete-mcpserver.use-case.js +61 -0
  183. package/dist/services/agent/modules/mcp-servers/lambdas/delete-mcpserver/delete-mcpserver.use-case.mjs +32 -0
  184. package/dist/services/agent/modules/mcp-servers/lambdas/delete-mcpserver/index.js +22 -0
  185. package/dist/services/agent/modules/mcp-servers/lambdas/delete-mcpserver/index.mjs +1 -0
  186. package/dist/services/agent/modules/mcp-servers/lambdas/get-mcpserver-by-id/get-mcpserver-by-id.use-case.js +52 -0
  187. package/dist/services/agent/modules/mcp-servers/lambdas/get-mcpserver-by-id/get-mcpserver-by-id.use-case.mjs +23 -0
  188. package/dist/services/agent/modules/mcp-servers/lambdas/get-mcpserver-by-id/index.js +22 -0
  189. package/dist/services/agent/modules/mcp-servers/lambdas/get-mcpserver-by-id/index.mjs +1 -0
  190. package/dist/services/agent/modules/mcp-servers/lambdas/list-mcpservers-by-user/index.js +22 -0
  191. package/dist/services/agent/modules/mcp-servers/lambdas/list-mcpservers-by-user/index.mjs +1 -0
  192. package/dist/services/agent/modules/mcp-servers/lambdas/list-mcpservers-by-user/list-mcpservers-by-user.use-case.js +59 -0
  193. package/dist/services/agent/modules/mcp-servers/lambdas/list-mcpservers-by-user/list-mcpservers-by-user.use-case.mjs +30 -0
  194. package/dist/services/agent/modules/mcp-servers/lambdas/update-mcpserver/index.js +22 -0
  195. package/dist/services/agent/modules/mcp-servers/lambdas/update-mcpserver/index.mjs +1 -0
  196. package/dist/services/agent/modules/mcp-servers/lambdas/update-mcpserver/update-mcpserver.use-case.js +61 -0
  197. package/dist/services/agent/modules/mcp-servers/lambdas/update-mcpserver/update-mcpserver.use-case.mjs +32 -0
  198. package/dist/services/agent/modules/mcp-servers/repositories/index.js +22 -0
  199. package/dist/services/agent/modules/mcp-servers/repositories/index.mjs +1 -0
  200. package/dist/services/agent/modules/mcp-servers/repositories/mcpserver.repository.js +67 -0
  201. package/dist/services/agent/modules/mcp-servers/repositories/mcpserver.repository.mjs +38 -0
  202. package/dist/services/agent/skills/index.js +24 -0
  203. package/dist/services/agent/skills/index.mjs +2 -0
  204. package/dist/services/agent/skills/shared/index.js +22 -0
  205. package/dist/services/agent/skills/shared/index.mjs +1 -0
  206. package/dist/services/agent/skills/shared/shared-rules.js +37 -0
  207. package/dist/services/agent/skills/shared/shared-rules.mjs +11 -0
  208. package/dist/services/agent/skills/skill-runner.js +121 -0
  209. package/dist/services/agent/skills/skill-runner.mjs +92 -0
  210. package/dist/services/agent/skills/skill.js +128 -0
  211. package/dist/services/agent/skills/skill.mjs +105 -0
  212. package/dist/services/agent/tools/core/call-ai/call-ai.skill.js +54 -0
  213. package/dist/services/agent/tools/core/call-ai/call-ai.skill.mjs +31 -0
  214. package/dist/services/agent/tools/core/call-ai/call-ai.tool.js +68 -0
  215. package/dist/services/agent/tools/core/call-ai/call-ai.tool.mjs +45 -0
  216. package/dist/services/agent/tools/core/call-ai/index.js +22 -0
  217. package/dist/services/agent/tools/core/call-ai/index.mjs +1 -0
  218. package/dist/services/agent/tools/core/index.js +24 -0
  219. package/dist/services/agent/tools/core/index.mjs +2 -0
  220. package/dist/services/agent/tools/core/web-search/index.js +22 -0
  221. package/dist/services/agent/tools/core/web-search/index.mjs +1 -0
  222. package/dist/services/agent/tools/core/web-search/web-search.tool.js +51 -0
  223. package/dist/services/agent/tools/core/web-search/web-search.tool.mjs +30 -0
  224. package/dist/services/agent/tools/index.js +24 -0
  225. package/dist/services/agent/tools/index.mjs +2 -0
  226. package/dist/services/agent/tools/tool.js +57 -0
  227. package/dist/services/agent/tools/tool.mjs +34 -0
  228. package/dist/services/agent/utils/rank-tools-by-keywords.js +65 -0
  229. package/dist/services/agent/utils/rank-tools-by-keywords.mjs +42 -0
  230. package/dist/services/app/core/app.js +60 -0
  231. package/dist/services/app/core/app.mjs +47 -0
  232. package/dist/services/app/core/current-session.js +124 -0
  233. package/dist/services/app/core/current-session.mjs +104 -0
  234. package/dist/services/app/core/current-user.js +84 -0
  235. package/dist/services/app/core/current-user.mjs +61 -0
  236. package/dist/services/app/core/index.js +26 -0
  237. package/dist/services/app/core/index.mjs +3 -0
  238. package/dist/services/app/modules/authentication/lambdas/login/index.js +22 -0
  239. package/dist/services/app/modules/authentication/lambdas/login/index.mjs +1 -0
  240. package/dist/services/app/modules/authentication/lambdas/login/login.use-case.js +89 -0
  241. package/dist/services/app/modules/authentication/lambdas/login/login.use-case.mjs +50 -0
  242. package/dist/services/app/modules/users/entities/index.js +22 -0
  243. package/dist/services/app/modules/users/entities/index.mjs +1 -0
  244. package/dist/services/app/modules/users/entities/user-acquisition.js +55 -0
  245. package/dist/services/app/modules/users/entities/user-acquisition.mjs +26 -0
  246. package/dist/services/app/modules/users/entities/user-country.js +44 -0
  247. package/dist/services/app/modules/users/entities/user-country.mjs +21 -0
  248. package/dist/services/app/modules/users/entities/user-currency.js +44 -0
  249. package/dist/services/app/modules/users/entities/user-currency.mjs +21 -0
  250. package/dist/services/app/modules/users/entities/user-email.value-object.js +43 -0
  251. package/dist/services/app/modules/users/entities/user-email.value-object.mjs +20 -0
  252. package/dist/services/app/modules/users/entities/user-language.js +44 -0
  253. package/dist/services/app/modules/users/entities/user-language.mjs +21 -0
  254. package/dist/services/app/modules/users/entities/user-marketing.js +53 -0
  255. package/dist/services/app/modules/users/entities/user-marketing.mjs +24 -0
  256. package/dist/services/app/modules/users/entities/user-notification-preferences.js +41 -0
  257. package/dist/services/app/modules/users/entities/user-notification-preferences.mjs +18 -0
  258. package/dist/services/app/modules/users/entities/user-password.value-object.js +69 -0
  259. package/dist/services/app/modules/users/entities/user-password.value-object.mjs +36 -0
  260. package/dist/services/app/modules/users/entities/user-permissions.js +59 -0
  261. package/dist/services/app/modules/users/entities/user-permissions.mjs +36 -0
  262. package/dist/services/app/modules/users/entities/user-preferences.js +69 -0
  263. package/dist/services/app/modules/users/entities/user-preferences.mjs +46 -0
  264. package/dist/services/app/modules/users/entities/user-report-preferences.js +56 -0
  265. package/dist/services/app/modules/users/entities/user-report-preferences.mjs +33 -0
  266. package/dist/services/app/modules/users/entities/user-report-schedule.js +41 -0
  267. package/dist/services/app/modules/users/entities/user-report-schedule.mjs +18 -0
  268. package/dist/services/app/modules/users/entities/user-timezone.js +44 -0
  269. package/dist/services/app/modules/users/entities/user-timezone.mjs +21 -0
  270. package/dist/services/app/modules/users/entities/user.entity.js +133 -0
  271. package/dist/services/app/modules/users/entities/user.entity.mjs +103 -0
  272. package/dist/services/app/modules/users/lambdas/create-user/create-user.use-case.js +58 -0
  273. package/dist/services/app/modules/users/lambdas/create-user/create-user.use-case.mjs +29 -0
  274. package/dist/services/app/modules/users/lambdas/create-user/index.js +22 -0
  275. package/dist/services/app/modules/users/lambdas/create-user/index.mjs +1 -0
  276. package/dist/services/app/modules/users/lambdas/delete-user/delete-user.use-case.js +61 -0
  277. package/dist/services/app/modules/users/lambdas/delete-user/delete-user.use-case.mjs +32 -0
  278. package/dist/services/app/modules/users/lambdas/delete-user/index.js +22 -0
  279. package/dist/services/app/modules/users/lambdas/delete-user/index.mjs +1 -0
  280. package/dist/services/app/modules/users/lambdas/get-user-by-id/get-user-by-id.use-case.js +52 -0
  281. package/dist/services/app/modules/users/lambdas/get-user-by-id/get-user-by-id.use-case.mjs +23 -0
  282. package/dist/services/app/modules/users/lambdas/get-user-by-id/index.js +22 -0
  283. package/dist/services/app/modules/users/lambdas/get-user-by-id/index.mjs +1 -0
  284. package/dist/services/app/modules/users/lambdas/list-users-by-props/index.js +22 -0
  285. package/dist/services/app/modules/users/lambdas/list-users-by-props/index.mjs +1 -0
  286. package/dist/services/app/modules/users/lambdas/list-users-by-props/list-users-by-props.use-case.js +52 -0
  287. package/dist/services/app/modules/users/lambdas/list-users-by-props/list-users-by-props.use-case.mjs +23 -0
  288. package/dist/services/app/modules/users/lambdas/update-user/index.js +22 -0
  289. package/dist/services/app/modules/users/lambdas/update-user/index.mjs +1 -0
  290. package/dist/services/app/modules/users/lambdas/update-user/update-user.use-case.js +62 -0
  291. package/dist/services/app/modules/users/lambdas/update-user/update-user.use-case.mjs +33 -0
  292. package/dist/services/app/modules/users/repositories/index.js +22 -0
  293. package/dist/services/app/modules/users/repositories/index.mjs +1 -0
  294. package/dist/services/app/modules/users/repositories/user.repository.js +83 -0
  295. package/dist/services/app/modules/users/repositories/user.repository.mjs +54 -0
  296. package/package.json +2 -2
@@ -0,0 +1,351 @@
1
+ "use strict";
2
+ var __defProp = Object.defineProperty;
3
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
4
+ var __getOwnPropNames = Object.getOwnPropertyNames;
5
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
6
+ var __export = (target, all) => {
7
+ for (var name in all)
8
+ __defProp(target, name, { get: all[name], enumerable: true });
9
+ };
10
+ var __copyProps = (to, from, except, desc) => {
11
+ if (from && typeof from === "object" || typeof from === "function") {
12
+ for (let key of __getOwnPropNames(from))
13
+ if (!__hasOwnProp.call(to, key) && key !== except)
14
+ __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
15
+ }
16
+ return to;
17
+ };
18
+ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
19
+ var agent_exports = {};
20
+ __export(agent_exports, {
21
+ AGENT_ERROR_CODES: () => AGENT_ERROR_CODES,
22
+ Agent: () => Agent
23
+ });
24
+ module.exports = __toCommonJS(agent_exports);
25
+ var import_reflect_metadata = require("reflect-metadata");
26
+ var import_tsyringe = require("tsyringe");
27
+ var import_logger = require("@common/logger");
28
+ var import_create_chat = require("@services/agent/modules/chats/lambdas/create-chat/");
29
+ var import_update_chat = require("@services/agent/modules/chats/lambdas/update-chat/");
30
+ var import_list_chats_by_user = require("@services/agent/modules/chats/lambdas/list-chats-by-user");
31
+ var import_list_mcpservers_by_user = require("@services/agent/modules/mcp-servers/lambdas/list-mcpservers-by-user");
32
+ var import_entities = require("@services/agent/modules/mcp-servers/entities");
33
+ var import_create_mcpserver = require("@services/agent/modules/mcp-servers/lambdas/create-mcpserver");
34
+ var import_repositories = require("@services/agent/modules/chats/repositories");
35
+ var import_get_llm_usage = require("@services/agent/modules/llmcalls/lambdas/get-llm-usage");
36
+ var import_chat = require("@services/agent/modules/chats/entities/chat.entity");
37
+ var import_tool = require("@services/agent/tools/tool");
38
+ var import_core2 = require("@services/agent/tools/core");
39
+ var import_rank_tools_by_keywords = require("@services/agent/utils/rank-tools-by-keywords");
40
+ var import_agent_state = require("./agent-state");
41
+ const AGENT_ERROR_CODES = {
42
+ NODE_NOT_FOUND: "AGENT_NODE_NOT_FOUND"
43
+ };
44
+ const MAX_ITERATIONS = 50;
45
+ class Agent {
46
+ updateChatUseCase = import_tsyringe.container.resolve(import_update_chat.UpdateChatUseCase);
47
+ chatRepository = import_tsyringe.container.resolve(import_repositories.ChatRepository);
48
+ logger = new import_logger.Logger();
49
+ _loop;
50
+ _tools;
51
+ _mcps = [];
52
+ _preHooks = [];
53
+ _postHooks = [];
54
+ currentChat;
55
+ currentUser;
56
+ currentSession;
57
+ currentMessage = "";
58
+ answerId = "";
59
+ stopLoop = false;
60
+ stopRequested = false;
61
+ pendingNextNode;
62
+ static async getChat(chatId) {
63
+ const chatRepository = import_tsyringe.container.resolve(import_repositories.ChatRepository);
64
+ return chatRepository.findById(chatId);
65
+ }
66
+ static async interruptExecution(chatId, currentUser) {
67
+ const updateChatUseCase = import_tsyringe.container.resolve(import_update_chat.UpdateChatUseCase);
68
+ const logger = new import_logger.Logger();
69
+ logger.debug("[AGENT] Interrupt execution triggered");
70
+ await updateChatUseCase.execute({
71
+ id: chatId,
72
+ payload: { state: { stopRequested: true } },
73
+ currentUser
74
+ });
75
+ }
76
+ static async createChatSession(currentUser, loop) {
77
+ if (!currentUser) throw new Error("[AGENT] CurrentUser is required to create a new chat");
78
+ const createChatUseCase = import_tsyringe.container.resolve(import_create_chat.CreateChatUseCase);
79
+ const newChat = import_chat.Chat.withDefaults(loop?.name);
80
+ const { data } = await createChatUseCase.execute({
81
+ payload: newChat.toJSON(),
82
+ currentUser
83
+ });
84
+ if (!data) throw new Error("[AGENT] There was an error creating the chat");
85
+ return import_chat.Chat.fromJSON(data);
86
+ }
87
+ static async listUserChats(options, currentUser) {
88
+ const listChatsByUserUseCase = import_tsyringe.container.resolve(import_list_chats_by_user.ListChatsByUserUseCase);
89
+ const { page, limit } = options || {};
90
+ const { data } = await listChatsByUserUseCase.execute({
91
+ options: { page, limit },
92
+ currentUser
93
+ });
94
+ return data;
95
+ }
96
+ static async getLLMUsage(filters, currentUser) {
97
+ const getLLMUsageUseCase = import_tsyringe.container.resolve(import_get_llm_usage.GetLLMUsageUseCase);
98
+ const { data } = await getLLMUsageUseCase.execute({ filters, currentUser });
99
+ return data;
100
+ }
101
+ static async listUserMcpServers(options, currentUser) {
102
+ const listMcpServersByUserUseCase = import_tsyringe.container.resolve(import_list_mcpservers_by_user.ListMcpServersByUserUseCase);
103
+ const { page, limit } = options || {};
104
+ const { data } = await listMcpServersByUserUseCase.execute({
105
+ options: { page, limit },
106
+ currentUser
107
+ });
108
+ return data;
109
+ }
110
+ static async createMcpServer(payload, currentUser) {
111
+ if (!currentUser) throw new Error("[AGENT] CurrentUser is required to create a new mcp server");
112
+ const createMcpServerUseCase = import_tsyringe.container.resolve(import_create_mcpserver.CreateMcpServerUseCase);
113
+ const { data } = await createMcpServerUseCase.execute({
114
+ payload,
115
+ currentUser
116
+ });
117
+ if (!data) throw new Error("[AGENT] There was an error creating the mcp server");
118
+ return data;
119
+ }
120
+ constructor(agentOptions) {
121
+ if (!agentOptions?.loop) throw new Error("[AGENT] An AgentLoop instance is required");
122
+ this._loop = agentOptions.loop;
123
+ this._tools = agentOptions.tools ?? [];
124
+ this.currentChat = import_chat.Chat.withDefaults(this._loop.name);
125
+ }
126
+ get tools() {
127
+ return this._tools;
128
+ }
129
+ get mcps() {
130
+ return this._mcps;
131
+ }
132
+ get notifyOnCompletion() {
133
+ return this.currentChat?.settings?.notifyOnCompletion;
134
+ }
135
+ get lastAssistantAnswer() {
136
+ return this.currentChat.lastAnswer;
137
+ }
138
+ async run(input, currentUser, currentSession) {
139
+ try {
140
+ const { chatId, message } = input || {};
141
+ this.logger.debug(input, "[AGENT] Agent started");
142
+ if (!message) throw new Error("[AGENT] Message is required");
143
+ if (!currentUser) throw new Error("[AGENT] CurrentUser is required");
144
+ this.stopLoop = false;
145
+ this.stopRequested = false;
146
+ this.pendingNextNode = void 0;
147
+ this.currentUser = currentUser;
148
+ this.currentSession = currentSession;
149
+ this.currentMessage = message;
150
+ this.answerId = new (require("mongodb")).ObjectId().toString();
151
+ await this.preRunner(chatId);
152
+ await this.runLoop();
153
+ await this.postRunner();
154
+ return { data: this.currentChat };
155
+ } catch (error) {
156
+ this.currentChat.state?.setStatus(import_agent_state.AgentStatus.FAILED);
157
+ this.currentChat.state?.setCurrentActivity("stopped");
158
+ await this.saveChat();
159
+ await this.disconnectMcpServers();
160
+ }
161
+ }
162
+ stopAgent() {
163
+ this.stopLoop = true;
164
+ }
165
+ addTool(tool) {
166
+ this._tools.push(tool);
167
+ }
168
+ addHook(type, fn) {
169
+ if (type === "pre_execution") this._preHooks.push(fn);
170
+ if (type === "post_execution") this._postHooks.push(fn);
171
+ }
172
+ async preRunner(chatId) {
173
+ let chatData;
174
+ if (chatId) {
175
+ chatData = await this.chatRepository?.findById(chatId);
176
+ }
177
+ if (!chatData) {
178
+ this.logger.debug("[AGENT] Not existing chat found");
179
+ if (!this.currentUser) throw new Error("[AGENT] CurrentUser params is required");
180
+ this.currentChat = await Agent.createChatSession(this.currentUser, this._loop);
181
+ } else {
182
+ this.logger.debug("[AGENT] Existing chat found");
183
+ this.currentChat = import_chat.Chat.fromJSON(chatData);
184
+ this.currentChat.state?.setStopRequested(false);
185
+ this.currentChat.switchLoop(this._loop.name);
186
+ }
187
+ this.currentChat.pushMessage({
188
+ role: "user",
189
+ content: this.currentMessage
190
+ });
191
+ this.currentChat.state?.setStatus(import_agent_state.AgentStatus.PROCESSING);
192
+ this.currentChat.state?.setCurrentActivity("Starting...");
193
+ await this.saveChat({ resetStop: true });
194
+ await this.loadMcpServers();
195
+ for (const hook of this._preHooks) {
196
+ await hook();
197
+ }
198
+ }
199
+ async postRunner() {
200
+ for (const hook of this._postHooks) {
201
+ await hook();
202
+ }
203
+ this.currentChat.state?.setCurrentActivity("stopped");
204
+ await this.saveChat();
205
+ await this.disconnectMcpServers();
206
+ }
207
+ async loadMcpServers() {
208
+ if (!this.currentUser) return;
209
+ const servers = await Agent.listUserMcpServers({}, this.currentUser);
210
+ for (const props of servers ?? []) {
211
+ const mcpServer = import_entities.McpServer.fromJSON(props);
212
+ try {
213
+ const mcpClient = await mcpServer.connect();
214
+ const { tools: mcpTools } = await mcpClient.listTools();
215
+ const tools = mcpTools.map((mcpTool) => import_tool.Tool.fromMcp(mcpTool, mcpClient, { namespace: mcpServer.name ?? "mcp" }));
216
+ this._tools.push(...tools);
217
+ this._mcps.push(mcpServer);
218
+ } catch (error) {
219
+ this.logger.error({ error, mcpServer: mcpServer.name }, "[AGENT] Failed to connect MCP server");
220
+ }
221
+ }
222
+ }
223
+ async disconnectMcpServers() {
224
+ for (const mcpServer of this._mcps) {
225
+ await mcpServer.disconnect().catch((error) => {
226
+ this.logger.error({ error, mcpServer: mcpServer.name }, "[AGENT] Failed to disconnect MCP server");
227
+ });
228
+ }
229
+ this._mcps = [];
230
+ }
231
+ async saveChat(props) {
232
+ if (this.currentChat?._id) {
233
+ this.logger.debug("[AGENT] Updating chat...");
234
+ if (!props?.resetStop) {
235
+ this.logger.debug("[Agent] Removing stopRequested");
236
+ delete this.currentChat.state?.stopRequested;
237
+ }
238
+ await this.updateChatUseCase?.execute({
239
+ id: this.currentChat?._id.toString(),
240
+ payload: this.currentChat.toJSON(),
241
+ currentUser: this.currentUser
242
+ }) ?? {};
243
+ }
244
+ }
245
+ async checkInterruptionRequest() {
246
+ const chatId = this.currentChat?._id?.toString();
247
+ const chatData = chatId && await this.chatRepository.findById(chatId, { state: 1 });
248
+ if (chatData && chatData.state?.stopRequested) this.stopRequested = true;
249
+ }
250
+ async runLoop() {
251
+ this.logger.info("[AGENT] Agent Loop started");
252
+ let iterations = 0;
253
+ while (!this.stopLoop && iterations < MAX_ITERATIONS) {
254
+ iterations++;
255
+ await this.checkInterruptionRequest();
256
+ if (this.stopRequested) {
257
+ this.stopLoop = true;
258
+ this.currentChat.state?.setStatus(import_agent_state.AgentStatus.IDLE);
259
+ this.resetNextNode();
260
+ this.currentChat.state?.setStopRequested(false);
261
+ break;
262
+ }
263
+ const activeTask = this.currentChat.activeTask;
264
+ const nodeName = activeTask?.nextNode ?? this.pendingNextNode ?? this.resolveNodeName(this._loop.initialNode);
265
+ const nodeFn = nodeName ? this._loop.nodes[nodeName] : void 0;
266
+ if (!nodeFn) {
267
+ this.logger.error({ nodeName, loop: this._loop.name }, "[AGENT] Node not found in current loop");
268
+ this.currentChat.state?.setStatus(import_agent_state.AgentStatus.FAILED);
269
+ this.currentChat.state?.setLastError({
270
+ code: AGENT_ERROR_CODES.NODE_NOT_FOUND,
271
+ message: `Node "${nodeName}" is not implemented by loop "${this._loop.name}"`,
272
+ isRetryable: false,
273
+ timestamp: /* @__PURE__ */ new Date()
274
+ });
275
+ this.currentChat.addTrace({ node: nodeName ?? "", reasoning: "Node not found" });
276
+ this.stopLoop = true;
277
+ break;
278
+ }
279
+ await nodeFn.call(this._loop, this.buildRunContext());
280
+ await this.saveChat();
281
+ if (!this.currentChat.state || this.currentChat.state?.status === import_agent_state.AgentStatus.IDLE || this.currentChat.state?.status === import_agent_state.AgentStatus.FAILED || this.currentChat.state?.status === import_agent_state.AgentStatus.AWAITING_USER_INPUT || this.currentChat.state?.status === import_agent_state.AgentStatus.AWAITING_USER_CONFIRMATION) {
282
+ this.stopLoop = true;
283
+ break;
284
+ }
285
+ }
286
+ this.logger.info("[AGENT] Agent Loop stopped");
287
+ }
288
+ resetNextNode() {
289
+ const resolved = this.resolveNodeName(this._loop.initialNode);
290
+ const active = this.currentChat.activeTask;
291
+ if (active) active.setNextNode(resolved);
292
+ else this.pendingNextNode = resolved;
293
+ }
294
+ resolveNodeName(node) {
295
+ if (typeof node !== "function") return node;
296
+ return Object.entries(this._loop.nodes).find(([, fn]) => fn === node)?.[0];
297
+ }
298
+ searchTools(keywords, opts) {
299
+ this.logger.debug({ opts }, "[AGENT] Searching tools");
300
+ const page = opts?.page ?? 1;
301
+ const limit = opts?.limit ?? 5;
302
+ const matchedTools = (0, import_rank_tools_by_keywords.rankToolsByKeywords)(keywords, this._tools);
303
+ if (matchedTools.length <= 5 && !matchedTools.some((t) => t.toolName === import_core2.webSearchTool.name)) {
304
+ matchedTools.push({ toolName: import_core2.webSearchTool.name, score: 0.1, matchedKeywords: [], tool: import_core2.webSearchTool });
305
+ }
306
+ if (matchedTools.length <= 5 && !matchedTools.some((t) => t.toolName === import_core2.callAiTool.name)) {
307
+ matchedTools.push({ toolName: import_core2.callAiTool.name, score: 0.1, matchedKeywords: [], tool: import_core2.callAiTool });
308
+ }
309
+ const startIndex = (page - 1) * limit;
310
+ return matchedTools.slice(startIndex, startIndex + limit);
311
+ }
312
+ buildRunContext() {
313
+ const sessionId = this.currentChat._id?.toString() ?? "";
314
+ return {
315
+ task: this.currentChat.activeTask,
316
+ chat: this.currentChat,
317
+ currentUser: this.currentUser,
318
+ currentSession: this.currentSession,
319
+ currentMessage: this.currentMessage,
320
+ answerId: this.answerId,
321
+ tools: this._tools,
322
+ searchTools: this.searchTools.bind(this),
323
+ baseParams: {
324
+ currentUser: this.currentUser,
325
+ sessionId,
326
+ answerId: this.answerId
327
+ },
328
+ skillParams: {
329
+ sessionId,
330
+ answerId: this.answerId,
331
+ userMessage: this.currentMessage,
332
+ currentUser: this.currentUser,
333
+ currentSession: this.currentSession,
334
+ chat: this.currentChat
335
+ },
336
+ reply: (content) => this.currentChat.pushMessage({ _id: this.answerId, role: "assistant", content }),
337
+ setNextNode: (node) => {
338
+ const resolved = this.resolveNodeName(node);
339
+ const active = this.currentChat.activeTask;
340
+ if (active) active.setNextNode(resolved);
341
+ else this.pendingNextNode = resolved;
342
+ },
343
+ logger: this.logger
344
+ };
345
+ }
346
+ }
347
+ // Annotate the CommonJS export names for ESM import in node:
348
+ 0 && (module.exports = {
349
+ AGENT_ERROR_CODES,
350
+ Agent
351
+ });
@@ -0,0 +1,327 @@
1
+ import "../../../chunk-XRJFNASX.mjs";
2
+ import "reflect-metadata";
3
+ import { container } from "tsyringe";
4
+ import { Logger } from "@common/logger";
5
+ import { CreateChatUseCase } from "@services/agent/modules/chats/lambdas/create-chat/";
6
+ import { UpdateChatUseCase } from "@services/agent/modules/chats/lambdas/update-chat/";
7
+ import { ListChatsByUserUseCase } from "@services/agent/modules/chats/lambdas/list-chats-by-user";
8
+ import { ListMcpServersByUserUseCase } from "@services/agent/modules/mcp-servers/lambdas/list-mcpservers-by-user";
9
+ import { McpServer } from "@services/agent/modules/mcp-servers/entities";
10
+ import { CreateMcpServerUseCase } from "@services/agent/modules/mcp-servers/lambdas/create-mcpserver";
11
+ import { ChatRepository } from "@services/agent/modules/chats/repositories";
12
+ import { GetLLMUsageUseCase } from "@services/agent/modules/llmcalls/lambdas/get-llm-usage";
13
+ import { Chat } from "@services/agent/modules/chats/entities/chat.entity";
14
+ import { Tool } from "@services/agent/tools/tool";
15
+ import { webSearchTool, callAiTool } from "@services/agent/tools/core";
16
+ import { rankToolsByKeywords } from "@services/agent/utils/rank-tools-by-keywords";
17
+ import { AgentStatus } from "./agent-state";
18
+ const AGENT_ERROR_CODES = {
19
+ NODE_NOT_FOUND: "AGENT_NODE_NOT_FOUND"
20
+ };
21
+ const MAX_ITERATIONS = 50;
22
+ class Agent {
23
+ updateChatUseCase = container.resolve(UpdateChatUseCase);
24
+ chatRepository = container.resolve(ChatRepository);
25
+ logger = new Logger();
26
+ _loop;
27
+ _tools;
28
+ _mcps = [];
29
+ _preHooks = [];
30
+ _postHooks = [];
31
+ currentChat;
32
+ currentUser;
33
+ currentSession;
34
+ currentMessage = "";
35
+ answerId = "";
36
+ stopLoop = false;
37
+ stopRequested = false;
38
+ pendingNextNode;
39
+ static async getChat(chatId) {
40
+ const chatRepository = container.resolve(ChatRepository);
41
+ return chatRepository.findById(chatId);
42
+ }
43
+ static async interruptExecution(chatId, currentUser) {
44
+ const updateChatUseCase = container.resolve(UpdateChatUseCase);
45
+ const logger = new Logger();
46
+ logger.debug("[AGENT] Interrupt execution triggered");
47
+ await updateChatUseCase.execute({
48
+ id: chatId,
49
+ payload: { state: { stopRequested: true } },
50
+ currentUser
51
+ });
52
+ }
53
+ static async createChatSession(currentUser, loop) {
54
+ if (!currentUser) throw new Error("[AGENT] CurrentUser is required to create a new chat");
55
+ const createChatUseCase = container.resolve(CreateChatUseCase);
56
+ const newChat = Chat.withDefaults(loop?.name);
57
+ const { data } = await createChatUseCase.execute({
58
+ payload: newChat.toJSON(),
59
+ currentUser
60
+ });
61
+ if (!data) throw new Error("[AGENT] There was an error creating the chat");
62
+ return Chat.fromJSON(data);
63
+ }
64
+ static async listUserChats(options, currentUser) {
65
+ const listChatsByUserUseCase = container.resolve(ListChatsByUserUseCase);
66
+ const { page, limit } = options || {};
67
+ const { data } = await listChatsByUserUseCase.execute({
68
+ options: { page, limit },
69
+ currentUser
70
+ });
71
+ return data;
72
+ }
73
+ static async getLLMUsage(filters, currentUser) {
74
+ const getLLMUsageUseCase = container.resolve(GetLLMUsageUseCase);
75
+ const { data } = await getLLMUsageUseCase.execute({ filters, currentUser });
76
+ return data;
77
+ }
78
+ static async listUserMcpServers(options, currentUser) {
79
+ const listMcpServersByUserUseCase = container.resolve(ListMcpServersByUserUseCase);
80
+ const { page, limit } = options || {};
81
+ const { data } = await listMcpServersByUserUseCase.execute({
82
+ options: { page, limit },
83
+ currentUser
84
+ });
85
+ return data;
86
+ }
87
+ static async createMcpServer(payload, currentUser) {
88
+ if (!currentUser) throw new Error("[AGENT] CurrentUser is required to create a new mcp server");
89
+ const createMcpServerUseCase = container.resolve(CreateMcpServerUseCase);
90
+ const { data } = await createMcpServerUseCase.execute({
91
+ payload,
92
+ currentUser
93
+ });
94
+ if (!data) throw new Error("[AGENT] There was an error creating the mcp server");
95
+ return data;
96
+ }
97
+ constructor(agentOptions) {
98
+ if (!agentOptions?.loop) throw new Error("[AGENT] An AgentLoop instance is required");
99
+ this._loop = agentOptions.loop;
100
+ this._tools = agentOptions.tools ?? [];
101
+ this.currentChat = Chat.withDefaults(this._loop.name);
102
+ }
103
+ get tools() {
104
+ return this._tools;
105
+ }
106
+ get mcps() {
107
+ return this._mcps;
108
+ }
109
+ get notifyOnCompletion() {
110
+ return this.currentChat?.settings?.notifyOnCompletion;
111
+ }
112
+ get lastAssistantAnswer() {
113
+ return this.currentChat.lastAnswer;
114
+ }
115
+ async run(input, currentUser, currentSession) {
116
+ try {
117
+ const { chatId, message } = input || {};
118
+ this.logger.debug(input, "[AGENT] Agent started");
119
+ if (!message) throw new Error("[AGENT] Message is required");
120
+ if (!currentUser) throw new Error("[AGENT] CurrentUser is required");
121
+ this.stopLoop = false;
122
+ this.stopRequested = false;
123
+ this.pendingNextNode = void 0;
124
+ this.currentUser = currentUser;
125
+ this.currentSession = currentSession;
126
+ this.currentMessage = message;
127
+ this.answerId = new (require("mongodb")).ObjectId().toString();
128
+ await this.preRunner(chatId);
129
+ await this.runLoop();
130
+ await this.postRunner();
131
+ return { data: this.currentChat };
132
+ } catch (error) {
133
+ this.currentChat.state?.setStatus(AgentStatus.FAILED);
134
+ this.currentChat.state?.setCurrentActivity("stopped");
135
+ await this.saveChat();
136
+ await this.disconnectMcpServers();
137
+ }
138
+ }
139
+ stopAgent() {
140
+ this.stopLoop = true;
141
+ }
142
+ addTool(tool) {
143
+ this._tools.push(tool);
144
+ }
145
+ addHook(type, fn) {
146
+ if (type === "pre_execution") this._preHooks.push(fn);
147
+ if (type === "post_execution") this._postHooks.push(fn);
148
+ }
149
+ async preRunner(chatId) {
150
+ let chatData;
151
+ if (chatId) {
152
+ chatData = await this.chatRepository?.findById(chatId);
153
+ }
154
+ if (!chatData) {
155
+ this.logger.debug("[AGENT] Not existing chat found");
156
+ if (!this.currentUser) throw new Error("[AGENT] CurrentUser params is required");
157
+ this.currentChat = await Agent.createChatSession(this.currentUser, this._loop);
158
+ } else {
159
+ this.logger.debug("[AGENT] Existing chat found");
160
+ this.currentChat = Chat.fromJSON(chatData);
161
+ this.currentChat.state?.setStopRequested(false);
162
+ this.currentChat.switchLoop(this._loop.name);
163
+ }
164
+ this.currentChat.pushMessage({
165
+ role: "user",
166
+ content: this.currentMessage
167
+ });
168
+ this.currentChat.state?.setStatus(AgentStatus.PROCESSING);
169
+ this.currentChat.state?.setCurrentActivity("Starting...");
170
+ await this.saveChat({ resetStop: true });
171
+ await this.loadMcpServers();
172
+ for (const hook of this._preHooks) {
173
+ await hook();
174
+ }
175
+ }
176
+ async postRunner() {
177
+ for (const hook of this._postHooks) {
178
+ await hook();
179
+ }
180
+ this.currentChat.state?.setCurrentActivity("stopped");
181
+ await this.saveChat();
182
+ await this.disconnectMcpServers();
183
+ }
184
+ async loadMcpServers() {
185
+ if (!this.currentUser) return;
186
+ const servers = await Agent.listUserMcpServers({}, this.currentUser);
187
+ for (const props of servers ?? []) {
188
+ const mcpServer = McpServer.fromJSON(props);
189
+ try {
190
+ const mcpClient = await mcpServer.connect();
191
+ const { tools: mcpTools } = await mcpClient.listTools();
192
+ const tools = mcpTools.map((mcpTool) => Tool.fromMcp(mcpTool, mcpClient, { namespace: mcpServer.name ?? "mcp" }));
193
+ this._tools.push(...tools);
194
+ this._mcps.push(mcpServer);
195
+ } catch (error) {
196
+ this.logger.error({ error, mcpServer: mcpServer.name }, "[AGENT] Failed to connect MCP server");
197
+ }
198
+ }
199
+ }
200
+ async disconnectMcpServers() {
201
+ for (const mcpServer of this._mcps) {
202
+ await mcpServer.disconnect().catch((error) => {
203
+ this.logger.error({ error, mcpServer: mcpServer.name }, "[AGENT] Failed to disconnect MCP server");
204
+ });
205
+ }
206
+ this._mcps = [];
207
+ }
208
+ async saveChat(props) {
209
+ if (this.currentChat?._id) {
210
+ this.logger.debug("[AGENT] Updating chat...");
211
+ if (!props?.resetStop) {
212
+ this.logger.debug("[Agent] Removing stopRequested");
213
+ delete this.currentChat.state?.stopRequested;
214
+ }
215
+ await this.updateChatUseCase?.execute({
216
+ id: this.currentChat?._id.toString(),
217
+ payload: this.currentChat.toJSON(),
218
+ currentUser: this.currentUser
219
+ }) ?? {};
220
+ }
221
+ }
222
+ async checkInterruptionRequest() {
223
+ const chatId = this.currentChat?._id?.toString();
224
+ const chatData = chatId && await this.chatRepository.findById(chatId, { state: 1 });
225
+ if (chatData && chatData.state?.stopRequested) this.stopRequested = true;
226
+ }
227
+ async runLoop() {
228
+ this.logger.info("[AGENT] Agent Loop started");
229
+ let iterations = 0;
230
+ while (!this.stopLoop && iterations < MAX_ITERATIONS) {
231
+ iterations++;
232
+ await this.checkInterruptionRequest();
233
+ if (this.stopRequested) {
234
+ this.stopLoop = true;
235
+ this.currentChat.state?.setStatus(AgentStatus.IDLE);
236
+ this.resetNextNode();
237
+ this.currentChat.state?.setStopRequested(false);
238
+ break;
239
+ }
240
+ const activeTask = this.currentChat.activeTask;
241
+ const nodeName = activeTask?.nextNode ?? this.pendingNextNode ?? this.resolveNodeName(this._loop.initialNode);
242
+ const nodeFn = nodeName ? this._loop.nodes[nodeName] : void 0;
243
+ if (!nodeFn) {
244
+ this.logger.error({ nodeName, loop: this._loop.name }, "[AGENT] Node not found in current loop");
245
+ this.currentChat.state?.setStatus(AgentStatus.FAILED);
246
+ this.currentChat.state?.setLastError({
247
+ code: AGENT_ERROR_CODES.NODE_NOT_FOUND,
248
+ message: `Node "${nodeName}" is not implemented by loop "${this._loop.name}"`,
249
+ isRetryable: false,
250
+ timestamp: /* @__PURE__ */ new Date()
251
+ });
252
+ this.currentChat.addTrace({ node: nodeName ?? "", reasoning: "Node not found" });
253
+ this.stopLoop = true;
254
+ break;
255
+ }
256
+ await nodeFn.call(this._loop, this.buildRunContext());
257
+ await this.saveChat();
258
+ if (!this.currentChat.state || this.currentChat.state?.status === AgentStatus.IDLE || this.currentChat.state?.status === AgentStatus.FAILED || this.currentChat.state?.status === AgentStatus.AWAITING_USER_INPUT || this.currentChat.state?.status === AgentStatus.AWAITING_USER_CONFIRMATION) {
259
+ this.stopLoop = true;
260
+ break;
261
+ }
262
+ }
263
+ this.logger.info("[AGENT] Agent Loop stopped");
264
+ }
265
+ resetNextNode() {
266
+ const resolved = this.resolveNodeName(this._loop.initialNode);
267
+ const active = this.currentChat.activeTask;
268
+ if (active) active.setNextNode(resolved);
269
+ else this.pendingNextNode = resolved;
270
+ }
271
+ resolveNodeName(node) {
272
+ if (typeof node !== "function") return node;
273
+ return Object.entries(this._loop.nodes).find(([, fn]) => fn === node)?.[0];
274
+ }
275
+ searchTools(keywords, opts) {
276
+ this.logger.debug({ opts }, "[AGENT] Searching tools");
277
+ const page = opts?.page ?? 1;
278
+ const limit = opts?.limit ?? 5;
279
+ const matchedTools = rankToolsByKeywords(keywords, this._tools);
280
+ if (matchedTools.length <= 5 && !matchedTools.some((t) => t.toolName === webSearchTool.name)) {
281
+ matchedTools.push({ toolName: webSearchTool.name, score: 0.1, matchedKeywords: [], tool: webSearchTool });
282
+ }
283
+ if (matchedTools.length <= 5 && !matchedTools.some((t) => t.toolName === callAiTool.name)) {
284
+ matchedTools.push({ toolName: callAiTool.name, score: 0.1, matchedKeywords: [], tool: callAiTool });
285
+ }
286
+ const startIndex = (page - 1) * limit;
287
+ return matchedTools.slice(startIndex, startIndex + limit);
288
+ }
289
+ buildRunContext() {
290
+ const sessionId = this.currentChat._id?.toString() ?? "";
291
+ return {
292
+ task: this.currentChat.activeTask,
293
+ chat: this.currentChat,
294
+ currentUser: this.currentUser,
295
+ currentSession: this.currentSession,
296
+ currentMessage: this.currentMessage,
297
+ answerId: this.answerId,
298
+ tools: this._tools,
299
+ searchTools: this.searchTools.bind(this),
300
+ baseParams: {
301
+ currentUser: this.currentUser,
302
+ sessionId,
303
+ answerId: this.answerId
304
+ },
305
+ skillParams: {
306
+ sessionId,
307
+ answerId: this.answerId,
308
+ userMessage: this.currentMessage,
309
+ currentUser: this.currentUser,
310
+ currentSession: this.currentSession,
311
+ chat: this.currentChat
312
+ },
313
+ reply: (content) => this.currentChat.pushMessage({ _id: this.answerId, role: "assistant", content }),
314
+ setNextNode: (node) => {
315
+ const resolved = this.resolveNodeName(node);
316
+ const active = this.currentChat.activeTask;
317
+ if (active) active.setNextNode(resolved);
318
+ else this.pendingNextNode = resolved;
319
+ },
320
+ logger: this.logger
321
+ };
322
+ }
323
+ }
324
+ export {
325
+ AGENT_ERROR_CODES,
326
+ Agent
327
+ };