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.
- package/dist/chunk-XRJFNASX.mjs +14 -0
- package/dist/common/clients/index.js +26 -0
- package/dist/common/clients/index.mjs +3 -0
- package/dist/common/clients/llm-client.js +159 -0
- package/dist/common/clients/llm-client.mjs +126 -0
- package/dist/common/clients/sentry-client.js +87 -0
- package/dist/common/clients/sentry-client.mjs +53 -0
- package/dist/common/clients/serper-client.js +74 -0
- package/dist/common/clients/serper-client.mjs +41 -0
- package/dist/common/core/base.app.js +57 -0
- package/dist/common/core/base.app.mjs +34 -0
- package/dist/common/core/base.entity.js +208 -0
- package/dist/common/core/base.entity.mjs +179 -0
- package/dist/common/core/base.use-case.js +30 -0
- package/dist/common/core/base.use-case.mjs +7 -0
- package/dist/common/core/index.js +1 -0
- package/dist/common/core/index.mjs +0 -0
- package/dist/common/core/utils/delete-empty-fields.js +66 -0
- package/dist/common/core/utils/delete-empty-fields.mjs +43 -0
- package/dist/common/core/utils/flatten-object.js +45 -0
- package/dist/common/core/utils/flatten-object.mjs +22 -0
- package/dist/common/core/utils/index.js +26 -0
- package/dist/common/core/utils/index.mjs +3 -0
- package/dist/common/core/utils/is-plain-object.js +32 -0
- package/dist/common/core/utils/is-plain-object.mjs +9 -0
- package/dist/common/decorators/admin-only/admin-only.js +52 -0
- package/dist/common/decorators/admin-only/admin-only.mjs +28 -0
- package/dist/common/decorators/admin-only/index.js +22 -0
- package/dist/common/decorators/admin-only/index.mjs +1 -0
- package/dist/common/decorators/index.js +26 -0
- package/dist/common/decorators/index.mjs +3 -0
- package/dist/common/decorators/mask-in-logs/index.js +22 -0
- package/dist/common/decorators/mask-in-logs/index.mjs +1 -0
- package/dist/common/decorators/mask-in-logs/mask-in-logs.js +53 -0
- package/dist/common/decorators/mask-in-logs/mask-in-logs.mjs +29 -0
- package/dist/common/decorators/owner-only/index.js +22 -0
- package/dist/common/decorators/owner-only/index.mjs +1 -0
- package/dist/common/decorators/owner-only/owner-only.js +52 -0
- package/dist/common/decorators/owner-only/owner-only.mjs +28 -0
- package/dist/common/error/http-error.js +37 -0
- package/dist/common/error/http-error.mjs +14 -0
- package/dist/common/error/index.js +24 -0
- package/dist/common/error/index.mjs +2 -0
- package/dist/common/error/reportError.js +51 -0
- package/dist/common/error/reportError.mjs +28 -0
- package/dist/common/helpers/extract-json-from-text.js +63 -0
- package/dist/common/helpers/extract-json-from-text.mjs +40 -0
- package/dist/common/helpers/index.js +24 -0
- package/dist/common/helpers/index.mjs +2 -0
- package/dist/common/helpers/sanitize-string.js +45 -0
- package/dist/common/helpers/sanitize-string.mjs +12 -0
- package/dist/common/logger/index.js +22 -0
- package/dist/common/logger/index.mjs +1 -0
- package/dist/common/logger/pino.js +70 -0
- package/dist/common/logger/pino.mjs +36 -0
- package/dist/common/repositories/index.js +24 -0
- package/dist/common/repositories/index.mjs +2 -0
- package/dist/common/repositories/mongo-db.client.js +79 -0
- package/dist/common/repositories/mongo-db.client.mjs +57 -0
- package/dist/common/repositories/mongo-db.repository.js +219 -0
- package/dist/common/repositories/mongo-db.repository.mjs +196 -0
- package/dist/common/utils/secret-manager.js +105 -0
- package/dist/common/utils/secret-manager.mjs +71 -0
- package/dist/index.js +22 -7
- package/dist/index.mjs +1 -7
- package/dist/services/agent/core/agent-loop.js +29 -0
- package/dist/services/agent/core/agent-loop.mjs +6 -0
- package/dist/services/agent/core/agent-state.js +102 -0
- package/dist/services/agent/core/agent-state.mjs +78 -0
- package/dist/services/agent/core/agent.js +351 -0
- package/dist/services/agent/core/agent.mjs +327 -0
- package/dist/services/agent/core/index.js +26 -0
- package/dist/services/agent/core/index.mjs +3 -0
- package/dist/services/agent/loops/index.js +24 -0
- package/dist/services/agent/loops/index.mjs +2 -0
- package/dist/services/agent/loops/plan-execute/index.js +22 -0
- package/dist/services/agent/loops/plan-execute/index.mjs +1 -0
- package/dist/services/agent/loops/plan-execute/plan-execute-loop.js +242 -0
- package/dist/services/agent/loops/plan-execute/plan-execute-loop.mjs +226 -0
- package/dist/services/agent/loops/shared/index.js +22 -0
- package/dist/services/agent/loops/shared/index.mjs +1 -0
- package/dist/services/agent/loops/shared/skills/action-planner.js +68 -0
- package/dist/services/agent/loops/shared/skills/action-planner.mjs +45 -0
- package/dist/services/agent/loops/shared/skills/confirmation-gate.js +53 -0
- package/dist/services/agent/loops/shared/skills/confirmation-gate.mjs +30 -0
- package/dist/services/agent/loops/shared/skills/fast-responder.js +70 -0
- package/dist/services/agent/loops/shared/skills/fast-responder.mjs +47 -0
- package/dist/services/agent/loops/shared/skills/final-responder.js +57 -0
- package/dist/services/agent/loops/shared/skills/final-responder.mjs +34 -0
- package/dist/services/agent/loops/shared/skills/index.js +32 -0
- package/dist/services/agent/loops/shared/skills/index.mjs +6 -0
- package/dist/services/agent/loops/shared/skills/state-observer.js +57 -0
- package/dist/services/agent/loops/shared/skills/state-observer.mjs +34 -0
- package/dist/services/agent/loops/shared/skills/strategy-engine.js +60 -0
- package/dist/services/agent/loops/shared/skills/strategy-engine.mjs +37 -0
- package/dist/services/agent/modules/chats/entities/agent-action.entity.js +151 -0
- package/dist/services/agent/modules/chats/entities/agent-action.entity.mjs +128 -0
- package/dist/services/agent/modules/chats/entities/agent-task.entity.js +231 -0
- package/dist/services/agent/modules/chats/entities/agent-task.entity.mjs +207 -0
- package/dist/services/agent/modules/chats/entities/chat-context.entity.js +70 -0
- package/dist/services/agent/modules/chats/entities/chat-context.entity.mjs +47 -0
- package/dist/services/agent/modules/chats/entities/chat-message.entity.js +58 -0
- package/dist/services/agent/modules/chats/entities/chat-message.entity.mjs +35 -0
- package/dist/services/agent/modules/chats/entities/chat-settings.entity.js +63 -0
- package/dist/services/agent/modules/chats/entities/chat-settings.entity.mjs +40 -0
- package/dist/services/agent/modules/chats/entities/chat.entity.js +163 -0
- package/dist/services/agent/modules/chats/entities/chat.entity.mjs +140 -0
- package/dist/services/agent/modules/chats/entities/index.js +22 -0
- package/dist/services/agent/modules/chats/entities/index.mjs +1 -0
- package/dist/services/agent/modules/chats/lambdas/create-chat/create-chat.use-case.js +56 -0
- package/dist/services/agent/modules/chats/lambdas/create-chat/create-chat.use-case.mjs +27 -0
- package/dist/services/agent/modules/chats/lambdas/create-chat/index.js +22 -0
- package/dist/services/agent/modules/chats/lambdas/create-chat/index.mjs +1 -0
- package/dist/services/agent/modules/chats/lambdas/delete-chat/delete-chat.use-case.js +61 -0
- package/dist/services/agent/modules/chats/lambdas/delete-chat/delete-chat.use-case.mjs +32 -0
- package/dist/services/agent/modules/chats/lambdas/delete-chat/index.js +22 -0
- package/dist/services/agent/modules/chats/lambdas/delete-chat/index.mjs +1 -0
- package/dist/services/agent/modules/chats/lambdas/get-chat-by-id/get-chat-by-id.use-case.js +52 -0
- package/dist/services/agent/modules/chats/lambdas/get-chat-by-id/get-chat-by-id.use-case.mjs +23 -0
- package/dist/services/agent/modules/chats/lambdas/get-chat-by-id/index.js +22 -0
- package/dist/services/agent/modules/chats/lambdas/get-chat-by-id/index.mjs +1 -0
- package/dist/services/agent/modules/chats/lambdas/interrupt-execution/index.js +22 -0
- package/dist/services/agent/modules/chats/lambdas/interrupt-execution/index.mjs +1 -0
- package/dist/services/agent/modules/chats/lambdas/interrupt-execution/interrupt-execution.use-case.js +64 -0
- package/dist/services/agent/modules/chats/lambdas/interrupt-execution/interrupt-execution.use-case.mjs +35 -0
- package/dist/services/agent/modules/chats/lambdas/list-chats-by-props/index.js +22 -0
- package/dist/services/agent/modules/chats/lambdas/list-chats-by-props/index.mjs +1 -0
- package/dist/services/agent/modules/chats/lambdas/list-chats-by-props/list-chats-by-props.use-case.js +52 -0
- package/dist/services/agent/modules/chats/lambdas/list-chats-by-props/list-chats-by-props.use-case.mjs +23 -0
- package/dist/services/agent/modules/chats/lambdas/list-chats-by-user/index.js +22 -0
- package/dist/services/agent/modules/chats/lambdas/list-chats-by-user/index.mjs +1 -0
- package/dist/services/agent/modules/chats/lambdas/list-chats-by-user/list-chats-by-user.use-case.js +59 -0
- package/dist/services/agent/modules/chats/lambdas/list-chats-by-user/list-chats-by-user.use-case.mjs +30 -0
- package/dist/services/agent/modules/chats/lambdas/update-chat/index.js +22 -0
- package/dist/services/agent/modules/chats/lambdas/update-chat/index.mjs +1 -0
- package/dist/services/agent/modules/chats/lambdas/update-chat/update-chat.use-case.js +64 -0
- package/dist/services/agent/modules/chats/lambdas/update-chat/update-chat.use-case.mjs +35 -0
- package/dist/services/agent/modules/chats/repositories/chat.repository.js +67 -0
- package/dist/services/agent/modules/chats/repositories/chat.repository.mjs +38 -0
- package/dist/services/agent/modules/chats/repositories/index.js +22 -0
- package/dist/services/agent/modules/chats/repositories/index.mjs +1 -0
- package/dist/services/agent/modules/llmcalls/entities/index.js +22 -0
- package/dist/services/agent/modules/llmcalls/entities/index.mjs +1 -0
- package/dist/services/agent/modules/llmcalls/entities/llmcall.entity.js +71 -0
- package/dist/services/agent/modules/llmcalls/entities/llmcall.entity.mjs +48 -0
- package/dist/services/agent/modules/llmcalls/lambdas/create-llmcall/create-llmcall.use-case.js +56 -0
- package/dist/services/agent/modules/llmcalls/lambdas/create-llmcall/create-llmcall.use-case.mjs +27 -0
- package/dist/services/agent/modules/llmcalls/lambdas/create-llmcall/index.js +22 -0
- package/dist/services/agent/modules/llmcalls/lambdas/create-llmcall/index.mjs +1 -0
- package/dist/services/agent/modules/llmcalls/lambdas/delete-llmcall/delete-llmcall.use-case.js +61 -0
- package/dist/services/agent/modules/llmcalls/lambdas/delete-llmcall/delete-llmcall.use-case.mjs +32 -0
- package/dist/services/agent/modules/llmcalls/lambdas/delete-llmcall/index.js +22 -0
- package/dist/services/agent/modules/llmcalls/lambdas/delete-llmcall/index.mjs +1 -0
- package/dist/services/agent/modules/llmcalls/lambdas/get-llm-usage/get-llm-usage.use-case.js +123 -0
- package/dist/services/agent/modules/llmcalls/lambdas/get-llm-usage/get-llm-usage.use-case.mjs +94 -0
- package/dist/services/agent/modules/llmcalls/lambdas/get-llm-usage/index.js +22 -0
- package/dist/services/agent/modules/llmcalls/lambdas/get-llm-usage/index.mjs +1 -0
- package/dist/services/agent/modules/llmcalls/lambdas/get-llmcall-by-id/get-llmcall-by-id.use-case.js +52 -0
- package/dist/services/agent/modules/llmcalls/lambdas/get-llmcall-by-id/get-llmcall-by-id.use-case.mjs +23 -0
- package/dist/services/agent/modules/llmcalls/lambdas/get-llmcall-by-id/index.js +22 -0
- package/dist/services/agent/modules/llmcalls/lambdas/get-llmcall-by-id/index.mjs +1 -0
- package/dist/services/agent/modules/llmcalls/lambdas/list-llmcalls-by-props/index.js +22 -0
- package/dist/services/agent/modules/llmcalls/lambdas/list-llmcalls-by-props/index.mjs +1 -0
- package/dist/services/agent/modules/llmcalls/lambdas/list-llmcalls-by-props/list-llmcalls-by-props.use-case.js +52 -0
- package/dist/services/agent/modules/llmcalls/lambdas/list-llmcalls-by-props/list-llmcalls-by-props.use-case.mjs +23 -0
- package/dist/services/agent/modules/llmcalls/lambdas/update-llmcall/index.js +22 -0
- package/dist/services/agent/modules/llmcalls/lambdas/update-llmcall/index.mjs +1 -0
- package/dist/services/agent/modules/llmcalls/lambdas/update-llmcall/update-llmcall.use-case.js +62 -0
- package/dist/services/agent/modules/llmcalls/lambdas/update-llmcall/update-llmcall.use-case.mjs +33 -0
- package/dist/services/agent/modules/llmcalls/repositories/index.js +22 -0
- package/dist/services/agent/modules/llmcalls/repositories/index.mjs +1 -0
- package/dist/services/agent/modules/llmcalls/repositories/llmcall.repository.js +67 -0
- package/dist/services/agent/modules/llmcalls/repositories/llmcall.repository.mjs +38 -0
- package/dist/services/agent/modules/mcp-servers/entities/index.js +22 -0
- package/dist/services/agent/modules/mcp-servers/entities/index.mjs +1 -0
- package/dist/services/agent/modules/mcp-servers/entities/mcpserver.entity.js +79 -0
- package/dist/services/agent/modules/mcp-servers/entities/mcpserver.entity.mjs +56 -0
- package/dist/services/agent/modules/mcp-servers/lambdas/create-mcpserver/create-mcpserver.use-case.js +56 -0
- package/dist/services/agent/modules/mcp-servers/lambdas/create-mcpserver/create-mcpserver.use-case.mjs +27 -0
- package/dist/services/agent/modules/mcp-servers/lambdas/create-mcpserver/index.js +22 -0
- package/dist/services/agent/modules/mcp-servers/lambdas/create-mcpserver/index.mjs +1 -0
- package/dist/services/agent/modules/mcp-servers/lambdas/delete-mcpserver/delete-mcpserver.use-case.js +61 -0
- package/dist/services/agent/modules/mcp-servers/lambdas/delete-mcpserver/delete-mcpserver.use-case.mjs +32 -0
- package/dist/services/agent/modules/mcp-servers/lambdas/delete-mcpserver/index.js +22 -0
- package/dist/services/agent/modules/mcp-servers/lambdas/delete-mcpserver/index.mjs +1 -0
- package/dist/services/agent/modules/mcp-servers/lambdas/get-mcpserver-by-id/get-mcpserver-by-id.use-case.js +52 -0
- package/dist/services/agent/modules/mcp-servers/lambdas/get-mcpserver-by-id/get-mcpserver-by-id.use-case.mjs +23 -0
- package/dist/services/agent/modules/mcp-servers/lambdas/get-mcpserver-by-id/index.js +22 -0
- package/dist/services/agent/modules/mcp-servers/lambdas/get-mcpserver-by-id/index.mjs +1 -0
- package/dist/services/agent/modules/mcp-servers/lambdas/list-mcpservers-by-user/index.js +22 -0
- package/dist/services/agent/modules/mcp-servers/lambdas/list-mcpservers-by-user/index.mjs +1 -0
- package/dist/services/agent/modules/mcp-servers/lambdas/list-mcpservers-by-user/list-mcpservers-by-user.use-case.js +59 -0
- package/dist/services/agent/modules/mcp-servers/lambdas/list-mcpservers-by-user/list-mcpservers-by-user.use-case.mjs +30 -0
- package/dist/services/agent/modules/mcp-servers/lambdas/update-mcpserver/index.js +22 -0
- package/dist/services/agent/modules/mcp-servers/lambdas/update-mcpserver/index.mjs +1 -0
- package/dist/services/agent/modules/mcp-servers/lambdas/update-mcpserver/update-mcpserver.use-case.js +61 -0
- package/dist/services/agent/modules/mcp-servers/lambdas/update-mcpserver/update-mcpserver.use-case.mjs +32 -0
- package/dist/services/agent/modules/mcp-servers/repositories/index.js +22 -0
- package/dist/services/agent/modules/mcp-servers/repositories/index.mjs +1 -0
- package/dist/services/agent/modules/mcp-servers/repositories/mcpserver.repository.js +67 -0
- package/dist/services/agent/modules/mcp-servers/repositories/mcpserver.repository.mjs +38 -0
- package/dist/services/agent/skills/index.js +24 -0
- package/dist/services/agent/skills/index.mjs +2 -0
- package/dist/services/agent/skills/shared/index.js +22 -0
- package/dist/services/agent/skills/shared/index.mjs +1 -0
- package/dist/services/agent/skills/shared/shared-rules.js +37 -0
- package/dist/services/agent/skills/shared/shared-rules.mjs +11 -0
- package/dist/services/agent/skills/skill-runner.js +121 -0
- package/dist/services/agent/skills/skill-runner.mjs +92 -0
- package/dist/services/agent/skills/skill.js +128 -0
- package/dist/services/agent/skills/skill.mjs +105 -0
- package/dist/services/agent/tools/core/call-ai/call-ai.skill.js +54 -0
- package/dist/services/agent/tools/core/call-ai/call-ai.skill.mjs +31 -0
- package/dist/services/agent/tools/core/call-ai/call-ai.tool.js +68 -0
- package/dist/services/agent/tools/core/call-ai/call-ai.tool.mjs +45 -0
- package/dist/services/agent/tools/core/call-ai/index.js +22 -0
- package/dist/services/agent/tools/core/call-ai/index.mjs +1 -0
- package/dist/services/agent/tools/core/index.js +24 -0
- package/dist/services/agent/tools/core/index.mjs +2 -0
- package/dist/services/agent/tools/core/web-search/index.js +22 -0
- package/dist/services/agent/tools/core/web-search/index.mjs +1 -0
- package/dist/services/agent/tools/core/web-search/web-search.tool.js +51 -0
- package/dist/services/agent/tools/core/web-search/web-search.tool.mjs +30 -0
- package/dist/services/agent/tools/index.js +24 -0
- package/dist/services/agent/tools/index.mjs +2 -0
- package/dist/services/agent/tools/tool.js +57 -0
- package/dist/services/agent/tools/tool.mjs +34 -0
- package/dist/services/agent/utils/rank-tools-by-keywords.js +65 -0
- package/dist/services/agent/utils/rank-tools-by-keywords.mjs +42 -0
- package/dist/services/app/core/app.js +60 -0
- package/dist/services/app/core/app.mjs +47 -0
- package/dist/services/app/core/current-session.js +124 -0
- package/dist/services/app/core/current-session.mjs +104 -0
- package/dist/services/app/core/current-user.js +84 -0
- package/dist/services/app/core/current-user.mjs +61 -0
- package/dist/services/app/core/index.js +26 -0
- package/dist/services/app/core/index.mjs +3 -0
- package/dist/services/app/modules/authentication/lambdas/login/index.js +22 -0
- package/dist/services/app/modules/authentication/lambdas/login/index.mjs +1 -0
- package/dist/services/app/modules/authentication/lambdas/login/login.use-case.js +89 -0
- package/dist/services/app/modules/authentication/lambdas/login/login.use-case.mjs +50 -0
- package/dist/services/app/modules/users/entities/index.js +22 -0
- package/dist/services/app/modules/users/entities/index.mjs +1 -0
- package/dist/services/app/modules/users/entities/user-acquisition.js +55 -0
- package/dist/services/app/modules/users/entities/user-acquisition.mjs +26 -0
- package/dist/services/app/modules/users/entities/user-country.js +44 -0
- package/dist/services/app/modules/users/entities/user-country.mjs +21 -0
- package/dist/services/app/modules/users/entities/user-currency.js +44 -0
- package/dist/services/app/modules/users/entities/user-currency.mjs +21 -0
- package/dist/services/app/modules/users/entities/user-email.value-object.js +43 -0
- package/dist/services/app/modules/users/entities/user-email.value-object.mjs +20 -0
- package/dist/services/app/modules/users/entities/user-language.js +44 -0
- package/dist/services/app/modules/users/entities/user-language.mjs +21 -0
- package/dist/services/app/modules/users/entities/user-marketing.js +53 -0
- package/dist/services/app/modules/users/entities/user-marketing.mjs +24 -0
- package/dist/services/app/modules/users/entities/user-notification-preferences.js +41 -0
- package/dist/services/app/modules/users/entities/user-notification-preferences.mjs +18 -0
- package/dist/services/app/modules/users/entities/user-password.value-object.js +69 -0
- package/dist/services/app/modules/users/entities/user-password.value-object.mjs +36 -0
- package/dist/services/app/modules/users/entities/user-permissions.js +59 -0
- package/dist/services/app/modules/users/entities/user-permissions.mjs +36 -0
- package/dist/services/app/modules/users/entities/user-preferences.js +69 -0
- package/dist/services/app/modules/users/entities/user-preferences.mjs +46 -0
- package/dist/services/app/modules/users/entities/user-report-preferences.js +56 -0
- package/dist/services/app/modules/users/entities/user-report-preferences.mjs +33 -0
- package/dist/services/app/modules/users/entities/user-report-schedule.js +41 -0
- package/dist/services/app/modules/users/entities/user-report-schedule.mjs +18 -0
- package/dist/services/app/modules/users/entities/user-timezone.js +44 -0
- package/dist/services/app/modules/users/entities/user-timezone.mjs +21 -0
- package/dist/services/app/modules/users/entities/user.entity.js +133 -0
- package/dist/services/app/modules/users/entities/user.entity.mjs +103 -0
- package/dist/services/app/modules/users/lambdas/create-user/create-user.use-case.js +58 -0
- package/dist/services/app/modules/users/lambdas/create-user/create-user.use-case.mjs +29 -0
- package/dist/services/app/modules/users/lambdas/create-user/index.js +22 -0
- package/dist/services/app/modules/users/lambdas/create-user/index.mjs +1 -0
- package/dist/services/app/modules/users/lambdas/delete-user/delete-user.use-case.js +61 -0
- package/dist/services/app/modules/users/lambdas/delete-user/delete-user.use-case.mjs +32 -0
- package/dist/services/app/modules/users/lambdas/delete-user/index.js +22 -0
- package/dist/services/app/modules/users/lambdas/delete-user/index.mjs +1 -0
- package/dist/services/app/modules/users/lambdas/get-user-by-id/get-user-by-id.use-case.js +52 -0
- package/dist/services/app/modules/users/lambdas/get-user-by-id/get-user-by-id.use-case.mjs +23 -0
- package/dist/services/app/modules/users/lambdas/get-user-by-id/index.js +22 -0
- package/dist/services/app/modules/users/lambdas/get-user-by-id/index.mjs +1 -0
- package/dist/services/app/modules/users/lambdas/list-users-by-props/index.js +22 -0
- package/dist/services/app/modules/users/lambdas/list-users-by-props/index.mjs +1 -0
- package/dist/services/app/modules/users/lambdas/list-users-by-props/list-users-by-props.use-case.js +52 -0
- package/dist/services/app/modules/users/lambdas/list-users-by-props/list-users-by-props.use-case.mjs +23 -0
- package/dist/services/app/modules/users/lambdas/update-user/index.js +22 -0
- package/dist/services/app/modules/users/lambdas/update-user/index.mjs +1 -0
- package/dist/services/app/modules/users/lambdas/update-user/update-user.use-case.js +62 -0
- package/dist/services/app/modules/users/lambdas/update-user/update-user.use-case.mjs +33 -0
- package/dist/services/app/modules/users/repositories/index.js +22 -0
- package/dist/services/app/modules/users/repositories/index.mjs +1 -0
- package/dist/services/app/modules/users/repositories/user.repository.js +83 -0
- package/dist/services/app/modules/users/repositories/user.repository.mjs +54 -0
- 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
|
+
};
|