crewly 1.2.4 → 1.2.7
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/LICENSE +1 -1
- package/config/constants.ts +4 -2
- package/config/roles/auditor/prompt.md +84 -0
- package/config/roles/orchestrator/prompt.md +62 -7
- package/config/runtime_scripts/runtime-config.json +5 -5
- package/config/skills/orchestrator/cancel-all-schedules/execute.sh +24 -0
- package/config/skills/orchestrator/cancel-all-schedules/instructions.md +23 -0
- package/config/skills/orchestrator/cancel-all-schedules/skill.json +17 -0
- package/config/skills/orchestrator/list-schedules/execute.sh +19 -0
- package/config/skills/orchestrator/list-schedules/instructions.md +24 -0
- package/config/skills/orchestrator/list-schedules/skill.json +12 -0
- package/dist/backend/backend/src/constants.d.ts +77 -13
- package/dist/backend/backend/src/constants.d.ts.map +1 -1
- package/dist/backend/backend/src/constants.js +78 -16
- package/dist/backend/backend/src/constants.js.map +1 -1
- package/dist/backend/backend/src/controllers/auditor/auditor.controller.d.ts +37 -0
- package/dist/backend/backend/src/controllers/auditor/auditor.controller.d.ts.map +1 -0
- package/dist/backend/backend/src/controllers/auditor/auditor.controller.js +64 -0
- package/dist/backend/backend/src/controllers/auditor/auditor.controller.js.map +1 -0
- package/dist/backend/backend/src/controllers/auditor/auditor.routes.d.ts +15 -0
- package/dist/backend/backend/src/controllers/auditor/auditor.routes.d.ts.map +1 -0
- package/dist/backend/backend/src/controllers/auditor/auditor.routes.js +23 -0
- package/dist/backend/backend/src/controllers/auditor/auditor.routes.js.map +1 -0
- package/dist/backend/backend/src/controllers/cloud/admin/admin-auth.middleware.d.ts +23 -0
- package/dist/backend/backend/src/controllers/cloud/admin/admin-auth.middleware.d.ts.map +1 -0
- package/dist/backend/backend/src/controllers/cloud/admin/admin-auth.middleware.js +42 -0
- package/dist/backend/backend/src/controllers/cloud/admin/admin-auth.middleware.js.map +1 -0
- package/dist/backend/backend/src/controllers/cloud/admin/admin.controller.d.ts +56 -0
- package/dist/backend/backend/src/controllers/cloud/admin/admin.controller.d.ts.map +1 -0
- package/dist/backend/backend/src/controllers/cloud/admin/admin.controller.js +173 -0
- package/dist/backend/backend/src/controllers/cloud/admin/admin.controller.js.map +1 -0
- package/dist/backend/backend/src/controllers/cloud/admin/admin.routes.d.ts +22 -0
- package/dist/backend/backend/src/controllers/cloud/admin/admin.routes.d.ts.map +1 -0
- package/dist/backend/backend/src/controllers/cloud/admin/admin.routes.js +33 -0
- package/dist/backend/backend/src/controllers/cloud/admin/admin.routes.js.map +1 -0
- package/dist/backend/backend/src/controllers/cloud/admin/index.d.ts +7 -0
- package/dist/backend/backend/src/controllers/cloud/admin/index.d.ts.map +1 -0
- package/dist/backend/backend/src/controllers/cloud/admin/index.js +7 -0
- package/dist/backend/backend/src/controllers/cloud/admin/index.js.map +1 -0
- package/dist/backend/backend/src/controllers/cloud/auth/auth.routes.d.ts +1 -1
- package/dist/backend/backend/src/controllers/cloud/auth/auth.routes.js +5 -5
- package/dist/backend/backend/src/controllers/cloud/auth/auth.routes.js.map +1 -1
- package/dist/backend/backend/src/controllers/cloud/cloud.routes.d.ts.map +1 -1
- package/dist/backend/backend/src/controllers/cloud/cloud.routes.js +0 -3
- package/dist/backend/backend/src/controllers/cloud/cloud.routes.js.map +1 -1
- package/dist/backend/backend/src/controllers/cloud/index.d.ts +0 -5
- package/dist/backend/backend/src/controllers/cloud/index.d.ts.map +1 -1
- package/dist/backend/backend/src/controllers/cloud/index.js +0 -5
- package/dist/backend/backend/src/controllers/cloud/index.js.map +1 -1
- package/dist/backend/backend/src/controllers/cloud/relay.controller.d.ts +6 -45
- package/dist/backend/backend/src/controllers/cloud/relay.controller.d.ts.map +1 -1
- package/dist/backend/backend/src/controllers/cloud/relay.controller.js +6 -165
- package/dist/backend/backend/src/controllers/cloud/relay.controller.js.map +1 -1
- package/dist/backend/backend/src/controllers/cloud/relay.routes.d.ts +5 -9
- package/dist/backend/backend/src/controllers/cloud/relay.routes.d.ts.map +1 -1
- package/dist/backend/backend/src/controllers/cloud/relay.routes.js +11 -21
- package/dist/backend/backend/src/controllers/cloud/relay.routes.js.map +1 -1
- package/dist/backend/backend/src/controllers/cloud/tasks/index.d.ts +5 -2
- package/dist/backend/backend/src/controllers/cloud/tasks/index.d.ts.map +1 -1
- package/dist/backend/backend/src/controllers/cloud/tasks/index.js +5 -2
- package/dist/backend/backend/src/controllers/cloud/tasks/index.js.map +1 -1
- package/dist/backend/backend/src/controllers/marketplace/template-marketplace.routes.d.ts +6 -2
- package/dist/backend/backend/src/controllers/marketplace/template-marketplace.routes.d.ts.map +1 -1
- package/dist/backend/backend/src/controllers/marketplace/template-marketplace.routes.js +12 -8
- package/dist/backend/backend/src/controllers/marketplace/template-marketplace.routes.js.map +1 -1
- package/dist/backend/backend/src/controllers/messaging/messenger.routes.d.ts +7 -0
- package/dist/backend/backend/src/controllers/messaging/messenger.routes.d.ts.map +1 -1
- package/dist/backend/backend/src/controllers/messaging/messenger.routes.js +64 -3
- package/dist/backend/backend/src/controllers/messaging/messenger.routes.js.map +1 -1
- package/dist/backend/backend/src/controllers/monitoring/terminal.controller.d.ts.map +1 -1
- package/dist/backend/backend/src/controllers/monitoring/terminal.controller.js +32 -4
- package/dist/backend/backend/src/controllers/monitoring/terminal.controller.js.map +1 -1
- package/dist/backend/backend/src/controllers/payment/payment.controller.d.ts +16 -5
- package/dist/backend/backend/src/controllers/payment/payment.controller.d.ts.map +1 -1
- package/dist/backend/backend/src/controllers/payment/payment.controller.js +6 -6
- package/dist/backend/backend/src/controllers/payment/payment.controller.js.map +1 -1
- package/dist/backend/backend/src/controllers/payment/payment.routes.d.ts +6 -2
- package/dist/backend/backend/src/controllers/payment/payment.routes.d.ts.map +1 -1
- package/dist/backend/backend/src/controllers/payment/payment.routes.js +22 -8
- package/dist/backend/backend/src/controllers/payment/payment.routes.js.map +1 -1
- package/dist/backend/backend/src/controllers/payment/payment.types.d.ts +1 -1
- package/dist/backend/backend/src/controllers/payment/payment.types.d.ts.map +1 -1
- package/dist/backend/backend/src/controllers/payment/payment.types.js +1 -1
- package/dist/backend/backend/src/controllers/payment/payment.types.js.map +1 -1
- package/dist/backend/backend/src/controllers/request-types.d.ts +2 -2
- package/dist/backend/backend/src/controllers/request-types.d.ts.map +1 -1
- package/dist/backend/backend/src/controllers/system/scheduler.controller.d.ts +19 -0
- package/dist/backend/backend/src/controllers/system/scheduler.controller.d.ts.map +1 -1
- package/dist/backend/backend/src/controllers/system/scheduler.controller.js +51 -0
- package/dist/backend/backend/src/controllers/system/scheduler.controller.js.map +1 -1
- package/dist/backend/backend/src/controllers/team/team.controller.d.ts.map +1 -1
- package/dist/backend/backend/src/controllers/team/team.controller.js +13 -5
- package/dist/backend/backend/src/controllers/team/team.controller.js.map +1 -1
- package/dist/backend/backend/src/controllers/template/template.controller.d.ts.map +1 -1
- package/dist/backend/backend/src/controllers/template/template.controller.js +2 -2
- package/dist/backend/backend/src/controllers/template/template.controller.js.map +1 -1
- package/dist/backend/backend/src/index.d.ts.map +1 -1
- package/dist/backend/backend/src/index.js +33 -30
- package/dist/backend/backend/src/index.js.map +1 -1
- package/dist/backend/backend/src/routes/api.routes.d.ts.map +1 -1
- package/dist/backend/backend/src/routes/api.routes.js +4 -12
- package/dist/backend/backend/src/routes/api.routes.js.map +1 -1
- package/dist/backend/backend/src/routes/modules/log-rotation.routes.d.ts +8 -0
- package/dist/backend/backend/src/routes/modules/log-rotation.routes.d.ts.map +1 -0
- package/dist/backend/backend/src/routes/modules/log-rotation.routes.js +62 -0
- package/dist/backend/backend/src/routes/modules/log-rotation.routes.js.map +1 -0
- package/dist/backend/backend/src/routes/modules/scheduler.routes.d.ts.map +1 -1
- package/dist/backend/backend/src/routes/modules/scheduler.routes.js +2 -0
- package/dist/backend/backend/src/routes/modules/scheduler.routes.js.map +1 -1
- package/dist/backend/backend/src/scripts/run-log-rotation.d.ts +3 -0
- package/dist/backend/backend/src/scripts/run-log-rotation.d.ts.map +1 -0
- package/dist/backend/backend/src/scripts/run-log-rotation.js +31 -0
- package/dist/backend/backend/src/scripts/run-log-rotation.js.map +1 -0
- package/dist/backend/backend/src/services/agent/agent-registration.service.d.ts +10 -0
- package/dist/backend/backend/src/services/agent/agent-registration.service.d.ts.map +1 -1
- package/dist/backend/backend/src/services/agent/agent-registration.service.js +85 -1
- package/dist/backend/backend/src/services/agent/agent-registration.service.js.map +1 -1
- package/dist/backend/backend/src/services/agent/auditor-scheduler.service.d.ts +150 -0
- package/dist/backend/backend/src/services/agent/auditor-scheduler.service.d.ts.map +1 -0
- package/dist/backend/backend/src/services/agent/auditor-scheduler.service.js +307 -0
- package/dist/backend/backend/src/services/agent/auditor-scheduler.service.js.map +1 -0
- package/dist/backend/backend/src/services/agent/crewly-agent/agent-runner.service.d.ts +105 -0
- package/dist/backend/backend/src/services/agent/crewly-agent/agent-runner.service.d.ts.map +1 -0
- package/dist/backend/backend/src/services/agent/crewly-agent/agent-runner.service.js +199 -0
- package/dist/backend/backend/src/services/agent/crewly-agent/agent-runner.service.js.map +1 -0
- package/dist/backend/backend/src/services/agent/crewly-agent/api-client.d.ts +68 -0
- package/dist/backend/backend/src/services/agent/crewly-agent/api-client.d.ts.map +1 -0
- package/dist/backend/backend/src/services/agent/crewly-agent/api-client.js +131 -0
- package/dist/backend/backend/src/services/agent/crewly-agent/api-client.js.map +1 -0
- package/dist/backend/backend/src/services/agent/crewly-agent/auditor-tools.d.ts +29 -0
- package/dist/backend/backend/src/services/agent/crewly-agent/auditor-tools.d.ts.map +1 -0
- package/dist/backend/backend/src/services/agent/crewly-agent/auditor-tools.js +229 -0
- package/dist/backend/backend/src/services/agent/crewly-agent/auditor-tools.js.map +1 -0
- package/dist/backend/backend/src/services/agent/crewly-agent/crewly-agent-runtime.service.d.ts +127 -0
- package/dist/backend/backend/src/services/agent/crewly-agent/crewly-agent-runtime.service.d.ts.map +1 -0
- package/dist/backend/backend/src/services/agent/crewly-agent/crewly-agent-runtime.service.js +242 -0
- package/dist/backend/backend/src/services/agent/crewly-agent/crewly-agent-runtime.service.js.map +1 -0
- package/dist/backend/backend/src/services/agent/crewly-agent/in-process-log-buffer.d.ts +95 -0
- package/dist/backend/backend/src/services/agent/crewly-agent/in-process-log-buffer.d.ts.map +1 -0
- package/dist/backend/backend/src/services/agent/crewly-agent/in-process-log-buffer.js +130 -0
- package/dist/backend/backend/src/services/agent/crewly-agent/in-process-log-buffer.js.map +1 -0
- package/dist/backend/backend/src/services/agent/crewly-agent/index.d.ts +14 -0
- package/dist/backend/backend/src/services/agent/crewly-agent/index.d.ts.map +1 -0
- package/dist/backend/backend/src/services/agent/crewly-agent/index.js +14 -0
- package/dist/backend/backend/src/services/agent/crewly-agent/index.js.map +1 -0
- package/dist/backend/backend/src/services/agent/crewly-agent/model-manager.d.ts +57 -0
- package/dist/backend/backend/src/services/agent/crewly-agent/model-manager.d.ts.map +1 -0
- package/dist/backend/backend/src/services/agent/crewly-agent/model-manager.js +93 -0
- package/dist/backend/backend/src/services/agent/crewly-agent/model-manager.js.map +1 -0
- package/dist/backend/backend/src/services/agent/crewly-agent/smoke-test.d.ts +13 -0
- package/dist/backend/backend/src/services/agent/crewly-agent/smoke-test.d.ts.map +1 -0
- package/dist/backend/backend/src/services/agent/crewly-agent/smoke-test.js +91 -0
- package/dist/backend/backend/src/services/agent/crewly-agent/smoke-test.js.map +1 -0
- package/dist/backend/backend/src/services/agent/crewly-agent/tool-registry.d.ts +29 -0
- package/dist/backend/backend/src/services/agent/crewly-agent/tool-registry.d.ts.map +1 -0
- package/dist/backend/backend/src/services/agent/crewly-agent/tool-registry.js +519 -0
- package/dist/backend/backend/src/services/agent/crewly-agent/tool-registry.js.map +1 -0
- package/dist/backend/backend/src/services/agent/crewly-agent/types.d.ts +159 -0
- package/dist/backend/backend/src/services/agent/crewly-agent/types.d.ts.map +1 -0
- package/dist/backend/backend/src/services/agent/crewly-agent/types.js +63 -0
- package/dist/backend/backend/src/services/agent/crewly-agent/types.js.map +1 -0
- package/dist/backend/backend/src/services/agent/runtime-exit-monitor.service.d.ts +56 -1
- package/dist/backend/backend/src/services/agent/runtime-exit-monitor.service.d.ts.map +1 -1
- package/dist/backend/backend/src/services/agent/runtime-exit-monitor.service.js +273 -215
- package/dist/backend/backend/src/services/agent/runtime-exit-monitor.service.js.map +1 -1
- package/dist/backend/backend/src/services/agent/runtime-service.factory.js +8 -8
- package/dist/backend/backend/src/services/agent/runtime-service.factory.js.map +1 -1
- package/dist/backend/backend/src/services/chat/chat.service.d.ts +7 -1
- package/dist/backend/backend/src/services/chat/chat.service.d.ts.map +1 -1
- package/dist/backend/backend/src/services/chat/chat.service.js +14 -5
- package/dist/backend/backend/src/services/chat/chat.service.js.map +1 -1
- package/dist/backend/backend/src/services/cloud/admin-seed.service.d.ts +18 -0
- package/dist/backend/backend/src/services/cloud/admin-seed.service.d.ts.map +1 -0
- package/dist/backend/backend/src/services/cloud/admin-seed.service.js +50 -0
- package/dist/backend/backend/src/services/cloud/admin-seed.service.js.map +1 -0
- package/dist/backend/backend/src/services/cloud/cloud-features.d.ts +19 -0
- package/dist/backend/backend/src/services/cloud/cloud-features.d.ts.map +1 -0
- package/dist/backend/backend/src/services/cloud/cloud-features.js +23 -0
- package/dist/backend/backend/src/services/cloud/cloud-features.js.map +1 -0
- package/dist/backend/backend/src/services/cloud/cloud-task-processor.service.d.ts +3 -3
- package/dist/backend/backend/src/services/cloud/cloud-task-processor.service.d.ts.map +1 -1
- package/dist/backend/backend/src/services/cloud/cloud-task-processor.service.js +10 -6
- package/dist/backend/backend/src/services/cloud/cloud-task-processor.service.js.map +1 -1
- package/dist/backend/backend/src/services/cloud/mongodb.service.d.ts +45 -0
- package/dist/backend/backend/src/services/cloud/mongodb.service.d.ts.map +1 -0
- package/dist/backend/backend/src/services/cloud/mongodb.service.js +76 -0
- package/dist/backend/backend/src/services/cloud/mongodb.service.js.map +1 -0
- package/dist/backend/backend/src/services/cloud/relay-server.service.d.ts +0 -2
- package/dist/backend/backend/src/services/cloud/relay-server.service.d.ts.map +1 -1
- package/dist/backend/backend/src/services/cloud/relay-server.service.js +7 -36
- package/dist/backend/backend/src/services/cloud/relay-server.service.js.map +1 -1
- package/dist/backend/backend/src/services/continuation/continuation.service.d.ts.map +1 -1
- package/dist/backend/backend/src/services/continuation/continuation.service.js +5 -10
- package/dist/backend/backend/src/services/continuation/continuation.service.js.map +1 -1
- package/dist/backend/backend/src/services/event-bus/event-bus.service.d.ts +10 -2
- package/dist/backend/backend/src/services/event-bus/event-bus.service.d.ts.map +1 -1
- package/dist/backend/backend/src/services/event-bus/event-bus.service.js +47 -12
- package/dist/backend/backend/src/services/event-bus/event-bus.service.js.map +1 -1
- package/dist/backend/backend/src/services/mcp-server.js +1 -1
- package/dist/backend/backend/src/services/mcp-server.js.map +1 -1
- package/dist/backend/backend/src/services/messaging/adapters/google-chat-messenger.adapter.d.ts +95 -22
- package/dist/backend/backend/src/services/messaging/adapters/google-chat-messenger.adapter.d.ts.map +1 -1
- package/dist/backend/backend/src/services/messaging/adapters/google-chat-messenger.adapter.js +284 -60
- package/dist/backend/backend/src/services/messaging/adapters/google-chat-messenger.adapter.js.map +1 -1
- package/dist/backend/backend/src/services/messaging/message-queue.service.d.ts.map +1 -1
- package/dist/backend/backend/src/services/messaging/message-queue.service.js +2 -1
- package/dist/backend/backend/src/services/messaging/message-queue.service.js.map +1 -1
- package/dist/backend/backend/src/services/messaging/queue-processor.service.d.ts.map +1 -1
- package/dist/backend/backend/src/services/messaging/queue-processor.service.js +22 -4
- package/dist/backend/backend/src/services/messaging/queue-processor.service.js.map +1 -1
- package/dist/backend/backend/src/services/messaging/response-router.service.d.ts +8 -0
- package/dist/backend/backend/src/services/messaging/response-router.service.d.ts.map +1 -1
- package/dist/backend/backend/src/services/messaging/response-router.service.js +42 -0
- package/dist/backend/backend/src/services/messaging/response-router.service.js.map +1 -1
- package/dist/backend/backend/src/services/orchestrator/orchestrator-restart.service.d.ts.map +1 -1
- package/dist/backend/backend/src/services/orchestrator/orchestrator-restart.service.js +6 -0
- package/dist/backend/backend/src/services/orchestrator/orchestrator-restart.service.js.map +1 -1
- package/dist/backend/backend/src/services/payment/stripe.service.d.ts +4 -43
- package/dist/backend/backend/src/services/payment/stripe.service.d.ts.map +1 -1
- package/dist/backend/backend/src/services/payment/stripe.service.js +56 -180
- package/dist/backend/backend/src/services/payment/stripe.service.js.map +1 -1
- package/dist/backend/backend/src/services/session/index.d.ts +2 -0
- package/dist/backend/backend/src/services/session/index.d.ts.map +1 -1
- package/dist/backend/backend/src/services/session/index.js +2 -0
- package/dist/backend/backend/src/services/session/index.js.map +1 -1
- package/dist/backend/backend/src/services/session/log-rotation.service.d.ts +163 -0
- package/dist/backend/backend/src/services/session/log-rotation.service.d.ts.map +1 -0
- package/dist/backend/backend/src/services/session/log-rotation.service.js +362 -0
- package/dist/backend/backend/src/services/session/log-rotation.service.js.map +1 -0
- package/dist/backend/backend/src/services/settings/settings.service.js +1 -1
- package/dist/backend/backend/src/services/settings/settings.service.js.map +1 -1
- package/dist/backend/backend/src/services/slack/slack-orchestrator-bridge.d.ts +11 -0
- package/dist/backend/backend/src/services/slack/slack-orchestrator-bridge.d.ts.map +1 -1
- package/dist/backend/backend/src/services/slack/slack-orchestrator-bridge.js +83 -1
- package/dist/backend/backend/src/services/slack/slack-orchestrator-bridge.js.map +1 -1
- package/dist/backend/backend/src/services/template/template.service.d.ts +9 -44
- package/dist/backend/backend/src/services/template/template.service.d.ts.map +1 -1
- package/dist/backend/backend/src/services/template/template.service.js +7 -80
- package/dist/backend/backend/src/services/template/template.service.js.map +1 -1
- package/dist/backend/backend/src/services/workflow/scheduler.service.d.ts +35 -0
- package/dist/backend/backend/src/services/workflow/scheduler.service.d.ts.map +1 -1
- package/dist/backend/backend/src/services/workflow/scheduler.service.js +133 -0
- package/dist/backend/backend/src/services/workflow/scheduler.service.js.map +1 -1
- package/dist/backend/backend/src/types/chat.types.d.ts +1 -1
- package/dist/backend/backend/src/types/chat.types.d.ts.map +1 -1
- package/dist/backend/backend/src/types/chat.types.js +21 -17
- package/dist/backend/backend/src/types/chat.types.js.map +1 -1
- package/dist/backend/backend/src/types/event-bus.types.d.ts +31 -0
- package/dist/backend/backend/src/types/event-bus.types.d.ts.map +1 -1
- package/dist/backend/backend/src/types/event-bus.types.js +50 -0
- package/dist/backend/backend/src/types/event-bus.types.js.map +1 -1
- package/dist/backend/backend/src/types/index.d.ts +1 -1
- package/dist/backend/backend/src/types/index.d.ts.map +1 -1
- package/dist/backend/backend/src/types/messaging.types.d.ts +4 -0
- package/dist/backend/backend/src/types/messaging.types.d.ts.map +1 -1
- package/dist/backend/backend/src/types/messaging.types.js.map +1 -1
- package/dist/backend/backend/src/types/settings.types.d.ts +1 -1
- package/dist/backend/backend/src/types/settings.types.d.ts.map +1 -1
- package/dist/backend/backend/src/types/settings.types.js +4 -4
- package/dist/backend/backend/src/types/settings.types.js.map +1 -1
- package/dist/backend/backend/src/types/team-template.types.d.ts +2 -2
- package/dist/backend/backend/src/types/team-template.types.d.ts.map +1 -1
- package/dist/backend/backend/src/types/team-template.types.js +1 -1
- package/dist/backend/backend/src/types/team-template.types.js.map +1 -1
- package/dist/backend/backend/src/websocket/terminal.gateway.d.ts +4 -4
- package/dist/backend/backend/src/websocket/terminal.gateway.d.ts.map +1 -1
- package/dist/backend/backend/src/websocket/terminal.gateway.js +9 -6
- package/dist/backend/backend/src/websocket/terminal.gateway.js.map +1 -1
- package/dist/backend/config/constants.d.ts +4 -2
- package/dist/backend/config/constants.d.ts.map +1 -1
- package/dist/backend/config/constants.js +4 -2
- package/dist/backend/config/constants.js.map +1 -1
- package/dist/cli/backend/src/constants.d.ts +77 -13
- package/dist/cli/backend/src/constants.d.ts.map +1 -1
- package/dist/cli/backend/src/constants.js +78 -16
- package/dist/cli/backend/src/constants.js.map +1 -1
- package/dist/cli/backend/src/services/mcp-server.js +1 -1
- package/dist/cli/backend/src/services/mcp-server.js.map +1 -1
- package/dist/cli/backend/src/types/chat.types.d.ts +1 -1
- package/dist/cli/backend/src/types/chat.types.d.ts.map +1 -1
- package/dist/cli/backend/src/types/chat.types.js +21 -17
- package/dist/cli/backend/src/types/chat.types.js.map +1 -1
- package/dist/cli/backend/src/types/index.d.ts +1 -1
- package/dist/cli/backend/src/types/index.d.ts.map +1 -1
- package/dist/cli/backend/src/types/settings.types.d.ts +1 -1
- package/dist/cli/backend/src/types/settings.types.d.ts.map +1 -1
- package/dist/cli/backend/src/types/settings.types.js +4 -4
- package/dist/cli/backend/src/types/settings.types.js.map +1 -1
- package/dist/cli/config/constants.d.ts +4 -2
- package/dist/cli/config/constants.d.ts.map +1 -1
- package/dist/cli/config/constants.js +4 -2
- package/dist/cli/config/constants.js.map +1 -1
- package/frontend/dist/assets/index-5cf8820f.js +4919 -0
- package/frontend/dist/assets/index-dee3a3a9.css +33 -0
- package/frontend/dist/index.html +2 -2
- package/package.json +15 -9
- package/frontend/dist/assets/index-510ab719.css +0 -33
- package/frontend/dist/assets/index-935cd846.js +0 -4961
|
@@ -0,0 +1,307 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Auditor Scheduler Service
|
|
3
|
+
*
|
|
4
|
+
* Manages the lifecycle and triggering of the Crewly Auditor agent.
|
|
5
|
+
* The auditor runs in always-active mode — initialized at server start
|
|
6
|
+
* and kept alive until the service stops.
|
|
7
|
+
*
|
|
8
|
+
* Three trigger layers:
|
|
9
|
+
* L1 — Periodic: setInterval every AUDIT_INTERVAL_MS (30 min)
|
|
10
|
+
* L2 — Event-driven: EventBus events (agent:inactive, task:failed) with debounce
|
|
11
|
+
* L3 — API: POST /api/auditor/trigger manual trigger
|
|
12
|
+
*
|
|
13
|
+
* Additionally supports direct Slack conversation via handleUserMessage().
|
|
14
|
+
*
|
|
15
|
+
* @module services/agent/auditor-scheduler
|
|
16
|
+
*/
|
|
17
|
+
import { LoggerService } from '../core/logger.service.js';
|
|
18
|
+
import { AUDITOR_SCHEDULER_CONSTANTS } from '../../constants.js';
|
|
19
|
+
/**
|
|
20
|
+
* Scheduler service that orchestrates Auditor agent lifecycle.
|
|
21
|
+
*
|
|
22
|
+
* Always-active mode: the auditor runtime is initialized at start()
|
|
23
|
+
* and remains alive until stop(). Audit runs do NOT shut down the runtime.
|
|
24
|
+
*
|
|
25
|
+
* Singleton — use AuditorSchedulerService.getInstance().
|
|
26
|
+
*
|
|
27
|
+
* @example
|
|
28
|
+
* ```typescript
|
|
29
|
+
* const scheduler = AuditorSchedulerService.getInstance();
|
|
30
|
+
* scheduler.setAuditorRuntime(runtime);
|
|
31
|
+
* scheduler.setEventBusService(eventBus);
|
|
32
|
+
* scheduler.start();
|
|
33
|
+
* ```
|
|
34
|
+
*/
|
|
35
|
+
export class AuditorSchedulerService {
|
|
36
|
+
static instance = null;
|
|
37
|
+
logger;
|
|
38
|
+
status = 'stopped';
|
|
39
|
+
// Dependencies
|
|
40
|
+
auditorRuntime = null;
|
|
41
|
+
eventBusService = null;
|
|
42
|
+
// L1: Periodic timer
|
|
43
|
+
periodicTimer = null;
|
|
44
|
+
// L2: Event-driven debounce
|
|
45
|
+
eventDebounceTimer = null;
|
|
46
|
+
eventListenerBound = false;
|
|
47
|
+
// Lifecycle: timeout protection
|
|
48
|
+
auditTimeoutTimer = null;
|
|
49
|
+
lastAuditStart = 0;
|
|
50
|
+
auditCount = 0;
|
|
51
|
+
constructor() {
|
|
52
|
+
this.logger = LoggerService.getInstance().createComponentLogger('AuditorScheduler');
|
|
53
|
+
}
|
|
54
|
+
/**
|
|
55
|
+
* Get the singleton instance.
|
|
56
|
+
*
|
|
57
|
+
* @returns AuditorSchedulerService instance
|
|
58
|
+
*/
|
|
59
|
+
static getInstance() {
|
|
60
|
+
if (!AuditorSchedulerService.instance) {
|
|
61
|
+
AuditorSchedulerService.instance = new AuditorSchedulerService();
|
|
62
|
+
}
|
|
63
|
+
return AuditorSchedulerService.instance;
|
|
64
|
+
}
|
|
65
|
+
/**
|
|
66
|
+
* Reset the singleton (for testing).
|
|
67
|
+
*/
|
|
68
|
+
static resetInstance() {
|
|
69
|
+
if (AuditorSchedulerService.instance) {
|
|
70
|
+
AuditorSchedulerService.instance.stop();
|
|
71
|
+
}
|
|
72
|
+
AuditorSchedulerService.instance = null;
|
|
73
|
+
}
|
|
74
|
+
/**
|
|
75
|
+
* Set the Auditor runtime service for lifecycle management.
|
|
76
|
+
*
|
|
77
|
+
* @param runtime - The CrewlyAgentRuntimeService configured for the auditor
|
|
78
|
+
*/
|
|
79
|
+
setAuditorRuntime(runtime) {
|
|
80
|
+
this.auditorRuntime = runtime;
|
|
81
|
+
}
|
|
82
|
+
/**
|
|
83
|
+
* Set the EventBusService for L2 event-driven triggers.
|
|
84
|
+
*
|
|
85
|
+
* @param eventBus - The EventBusService instance
|
|
86
|
+
*/
|
|
87
|
+
setEventBusService(eventBus) {
|
|
88
|
+
this.eventBusService = eventBus;
|
|
89
|
+
}
|
|
90
|
+
/**
|
|
91
|
+
* Start all trigger layers and initialize the auditor runtime.
|
|
92
|
+
* The auditor is initialized immediately (always-active mode).
|
|
93
|
+
* L1: periodic interval. L2: EventBus listener.
|
|
94
|
+
*/
|
|
95
|
+
start() {
|
|
96
|
+
if (this.status !== 'stopped') {
|
|
97
|
+
this.logger.warn('AuditorScheduler already started');
|
|
98
|
+
return;
|
|
99
|
+
}
|
|
100
|
+
this.status = 'idle';
|
|
101
|
+
this.logger.info('AuditorScheduler starting (always-active mode)');
|
|
102
|
+
// Initialize auditor runtime immediately (always-active)
|
|
103
|
+
void this.initializeAuditorRuntime();
|
|
104
|
+
// L1: Periodic trigger
|
|
105
|
+
this.periodicTimer = setInterval(() => {
|
|
106
|
+
void this.trigger('periodic');
|
|
107
|
+
}, AUDITOR_SCHEDULER_CONSTANTS.AUDIT_INTERVAL_MS);
|
|
108
|
+
// L2: EventBus listener
|
|
109
|
+
this.bindEventBusListener();
|
|
110
|
+
this.logger.info('AuditorScheduler started', {
|
|
111
|
+
intervalMs: AUDITOR_SCHEDULER_CONSTANTS.AUDIT_INTERVAL_MS,
|
|
112
|
+
debounceMs: AUDITOR_SCHEDULER_CONSTANTS.EVENT_DEBOUNCE_MS,
|
|
113
|
+
timeoutMs: AUDITOR_SCHEDULER_CONSTANTS.AUDIT_TIMEOUT_MS,
|
|
114
|
+
});
|
|
115
|
+
}
|
|
116
|
+
/**
|
|
117
|
+
* Stop all trigger layers, clean up timers, and shut down the runtime.
|
|
118
|
+
* Only called when the entire service is shutting down.
|
|
119
|
+
*/
|
|
120
|
+
stop() {
|
|
121
|
+
if (this.periodicTimer) {
|
|
122
|
+
clearInterval(this.periodicTimer);
|
|
123
|
+
this.periodicTimer = null;
|
|
124
|
+
}
|
|
125
|
+
if (this.eventDebounceTimer) {
|
|
126
|
+
clearTimeout(this.eventDebounceTimer);
|
|
127
|
+
this.eventDebounceTimer = null;
|
|
128
|
+
}
|
|
129
|
+
if (this.auditTimeoutTimer) {
|
|
130
|
+
clearTimeout(this.auditTimeoutTimer);
|
|
131
|
+
this.auditTimeoutTimer = null;
|
|
132
|
+
}
|
|
133
|
+
// Shutdown runtime only on full service stop
|
|
134
|
+
if (this.auditorRuntime?.isReady()) {
|
|
135
|
+
this.auditorRuntime.shutdown();
|
|
136
|
+
}
|
|
137
|
+
this.eventListenerBound = false;
|
|
138
|
+
this.status = 'stopped';
|
|
139
|
+
this.logger.info('AuditorScheduler stopped');
|
|
140
|
+
}
|
|
141
|
+
/**
|
|
142
|
+
* Trigger an audit run.
|
|
143
|
+
*
|
|
144
|
+
* Checks if an audit is already running, ensures the auditor is ready,
|
|
145
|
+
* sends the audit command, and keeps the runtime alive after completion.
|
|
146
|
+
*
|
|
147
|
+
* @param source - What triggered this audit ('periodic', 'event', 'api')
|
|
148
|
+
* @returns Result indicating whether the audit was triggered
|
|
149
|
+
*/
|
|
150
|
+
async trigger(source) {
|
|
151
|
+
const timestamp = new Date().toISOString();
|
|
152
|
+
// Guard: already running
|
|
153
|
+
if (this.status === 'running_audit') {
|
|
154
|
+
this.logger.debug('Audit already running, skipping trigger', { source });
|
|
155
|
+
return { triggered: false, reason: 'Audit already in progress', source, timestamp };
|
|
156
|
+
}
|
|
157
|
+
// Guard: stopped
|
|
158
|
+
if (this.status === 'stopped') {
|
|
159
|
+
return { triggered: false, reason: 'Scheduler is stopped', source, timestamp };
|
|
160
|
+
}
|
|
161
|
+
// Guard: no runtime
|
|
162
|
+
if (!this.auditorRuntime) {
|
|
163
|
+
this.logger.warn('No auditor runtime configured');
|
|
164
|
+
return { triggered: false, reason: 'No auditor runtime configured', source, timestamp };
|
|
165
|
+
}
|
|
166
|
+
this.logger.info('Triggering audit', { source });
|
|
167
|
+
this.status = 'running_audit';
|
|
168
|
+
this.lastAuditStart = Date.now();
|
|
169
|
+
this.auditCount++;
|
|
170
|
+
try {
|
|
171
|
+
// Ensure auditor is ready (should already be from start(), defensive check)
|
|
172
|
+
if (!this.auditorRuntime.isReady()) {
|
|
173
|
+
await this.initializeAuditorRuntime();
|
|
174
|
+
}
|
|
175
|
+
// Send audit command
|
|
176
|
+
const auditCommand = AUDITOR_SCHEDULER_CONSTANTS.AUDIT_COMMAND;
|
|
177
|
+
this.logger.info('Sending audit command', { command: auditCommand.substring(0, 80) });
|
|
178
|
+
const result = await this.auditorRuntime.handleMessage(auditCommand);
|
|
179
|
+
this.logger.info('Audit completed', {
|
|
180
|
+
source,
|
|
181
|
+
steps: result.steps,
|
|
182
|
+
toolCalls: result.toolCalls.length,
|
|
183
|
+
duration: Date.now() - this.lastAuditStart,
|
|
184
|
+
});
|
|
185
|
+
// Stay idle — do NOT shutdown (always-active mode)
|
|
186
|
+
this.status = 'idle';
|
|
187
|
+
return { triggered: true, source, timestamp };
|
|
188
|
+
}
|
|
189
|
+
catch (error) {
|
|
190
|
+
const errMsg = error instanceof Error ? error.message : String(error);
|
|
191
|
+
this.logger.error('Audit failed', { source, error: errMsg });
|
|
192
|
+
// Stay idle — do NOT shutdown on error (always-active mode)
|
|
193
|
+
this.status = 'idle';
|
|
194
|
+
return { triggered: false, reason: `Audit error: ${errMsg}`, source, timestamp };
|
|
195
|
+
}
|
|
196
|
+
finally {
|
|
197
|
+
if (this.auditTimeoutTimer) {
|
|
198
|
+
clearTimeout(this.auditTimeoutTimer);
|
|
199
|
+
this.auditTimeoutTimer = null;
|
|
200
|
+
}
|
|
201
|
+
}
|
|
202
|
+
}
|
|
203
|
+
/**
|
|
204
|
+
* Handle a user message routed from Slack.
|
|
205
|
+
*
|
|
206
|
+
* Passes the message to the auditor runtime with Slack context
|
|
207
|
+
* so the auditor can reply directly via the reply_slack tool.
|
|
208
|
+
*
|
|
209
|
+
* @param message - User message text (auditor prefix already stripped)
|
|
210
|
+
* @param slackContext - Slack channel and thread identifiers
|
|
211
|
+
* @returns Result indicating whether the message was handled
|
|
212
|
+
*/
|
|
213
|
+
async handleUserMessage(message, slackContext) {
|
|
214
|
+
const timestamp = new Date().toISOString();
|
|
215
|
+
if (!this.auditorRuntime) {
|
|
216
|
+
return { triggered: false, reason: 'No auditor runtime configured', source: 'api', timestamp };
|
|
217
|
+
}
|
|
218
|
+
// Ensure runtime is ready (always-active should have it ready)
|
|
219
|
+
if (!this.auditorRuntime.isReady()) {
|
|
220
|
+
await this.initializeAuditorRuntime();
|
|
221
|
+
}
|
|
222
|
+
if (!this.auditorRuntime.isReady()) {
|
|
223
|
+
return { triggered: false, reason: 'Failed to initialize auditor runtime', source: 'api', timestamp };
|
|
224
|
+
}
|
|
225
|
+
// Prefix message with Slack context so auditor can use reply_slack
|
|
226
|
+
const slackPrefix = `[SLACK_CONTEXT:channelId=${slackContext.channelId},threadTs=${slackContext.threadTs}]\n`;
|
|
227
|
+
try {
|
|
228
|
+
this.logger.info('Handling user message via auditor', {
|
|
229
|
+
messageLength: message.length,
|
|
230
|
+
channelId: slackContext.channelId,
|
|
231
|
+
});
|
|
232
|
+
await this.auditorRuntime.handleMessage(slackPrefix + message);
|
|
233
|
+
return { triggered: true, source: 'api', timestamp };
|
|
234
|
+
}
|
|
235
|
+
catch (error) {
|
|
236
|
+
const errMsg = error instanceof Error ? error.message : String(error);
|
|
237
|
+
this.logger.error('Auditor user message failed', { error: errMsg });
|
|
238
|
+
return { triggered: false, reason: `Auditor error: ${errMsg}`, source: 'api', timestamp };
|
|
239
|
+
}
|
|
240
|
+
}
|
|
241
|
+
/**
|
|
242
|
+
* Get the current scheduler status and statistics.
|
|
243
|
+
*
|
|
244
|
+
* @returns Status object
|
|
245
|
+
*/
|
|
246
|
+
getStatus() {
|
|
247
|
+
return {
|
|
248
|
+
status: this.status,
|
|
249
|
+
auditCount: this.auditCount,
|
|
250
|
+
lastAuditStart: this.lastAuditStart
|
|
251
|
+
? new Date(this.lastAuditStart).toISOString()
|
|
252
|
+
: null,
|
|
253
|
+
periodicEnabled: this.periodicTimer !== null,
|
|
254
|
+
eventListenerBound: this.eventListenerBound,
|
|
255
|
+
runtimeReady: this.auditorRuntime?.isReady() ?? false,
|
|
256
|
+
};
|
|
257
|
+
}
|
|
258
|
+
// ===== Private helpers =====
|
|
259
|
+
/**
|
|
260
|
+
* Initialize the auditor runtime with the auditor role prompt.
|
|
261
|
+
* Called at start() and as defensive fallback in trigger()/handleUserMessage().
|
|
262
|
+
*/
|
|
263
|
+
async initializeAuditorRuntime() {
|
|
264
|
+
if (!this.auditorRuntime)
|
|
265
|
+
return;
|
|
266
|
+
try {
|
|
267
|
+
if (!this.auditorRuntime.isReady()) {
|
|
268
|
+
await this.auditorRuntime.initializeInProcess(AUDITOR_SCHEDULER_CONSTANTS.AUDITOR_SESSION_NAME, undefined, 'auditor');
|
|
269
|
+
this.logger.info('Auditor runtime initialized (always-active mode)');
|
|
270
|
+
}
|
|
271
|
+
}
|
|
272
|
+
catch (error) {
|
|
273
|
+
this.logger.error('Failed to initialize auditor runtime', {
|
|
274
|
+
error: error instanceof Error ? error.message : String(error),
|
|
275
|
+
});
|
|
276
|
+
}
|
|
277
|
+
}
|
|
278
|
+
/**
|
|
279
|
+
* Bind the EventBus listener for L2 event-driven triggers.
|
|
280
|
+
* Listens for agent:inactive and task:failed events with debounce.
|
|
281
|
+
*/
|
|
282
|
+
bindEventBusListener() {
|
|
283
|
+
if (!this.eventBusService || this.eventListenerBound) {
|
|
284
|
+
return;
|
|
285
|
+
}
|
|
286
|
+
const triggerEvents = AUDITOR_SCHEDULER_CONSTANTS.TRIGGER_EVENT_TYPES;
|
|
287
|
+
this.eventBusService.on('event_delivered', (payload) => {
|
|
288
|
+
if (!triggerEvents.includes(payload.eventType)) {
|
|
289
|
+
return;
|
|
290
|
+
}
|
|
291
|
+
this.logger.debug('Audit-triggering event received, debouncing', {
|
|
292
|
+
eventType: payload.eventType,
|
|
293
|
+
});
|
|
294
|
+
// Debounce: reset timer on each qualifying event
|
|
295
|
+
if (this.eventDebounceTimer) {
|
|
296
|
+
clearTimeout(this.eventDebounceTimer);
|
|
297
|
+
}
|
|
298
|
+
this.eventDebounceTimer = setTimeout(() => {
|
|
299
|
+
this.eventDebounceTimer = null;
|
|
300
|
+
void this.trigger('event');
|
|
301
|
+
}, AUDITOR_SCHEDULER_CONSTANTS.EVENT_DEBOUNCE_MS);
|
|
302
|
+
});
|
|
303
|
+
this.eventListenerBound = true;
|
|
304
|
+
this.logger.debug('EventBus listener bound', { triggerEvents });
|
|
305
|
+
}
|
|
306
|
+
}
|
|
307
|
+
//# sourceMappingURL=auditor-scheduler.service.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"auditor-scheduler.service.js","sourceRoot":"","sources":["../../../../../../backend/src/services/agent/auditor-scheduler.service.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,105 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Crewly Agent Runner Service
|
|
3
|
+
*
|
|
4
|
+
* Core reasoning loop for the Crewly Agent runtime. Wraps Vercel AI SDK's
|
|
5
|
+
* generateText with conversation history management, context compaction,
|
|
6
|
+
* and structured result tracking.
|
|
7
|
+
*
|
|
8
|
+
* @module services/agent/crewly-agent/agent-runner.service
|
|
9
|
+
*/
|
|
10
|
+
import { ModelManager } from './model-manager.js';
|
|
11
|
+
import { CrewlyApiClient } from './api-client.js';
|
|
12
|
+
import { type CrewlyAgentConfig, type ConversationState, type AgentRunResult } from './types.js';
|
|
13
|
+
/**
|
|
14
|
+
* Core agent runner that manages the AI SDK generateText loop.
|
|
15
|
+
*
|
|
16
|
+
* Responsibilities:
|
|
17
|
+
* - Maintains conversation history (messages array)
|
|
18
|
+
* - Calls generateText with tools and maxSteps for agentic behavior
|
|
19
|
+
* - Tracks token usage across invocations
|
|
20
|
+
* - Triggers context compaction when history grows too large
|
|
21
|
+
* - Serializes concurrent message handling
|
|
22
|
+
*
|
|
23
|
+
* @example
|
|
24
|
+
* ```typescript
|
|
25
|
+
* const runner = new AgentRunnerService(config);
|
|
26
|
+
* await runner.initialize();
|
|
27
|
+
* const result = await runner.run('Check all team statuses');
|
|
28
|
+
* ```
|
|
29
|
+
*/
|
|
30
|
+
/** Function type for generateText — used for dependency injection in tests */
|
|
31
|
+
type GenerateTextFn = (opts: Record<string, unknown>) => Promise<Record<string, unknown>>;
|
|
32
|
+
export declare class AgentRunnerService {
|
|
33
|
+
private config;
|
|
34
|
+
private modelManager;
|
|
35
|
+
private apiClient;
|
|
36
|
+
private model;
|
|
37
|
+
private state;
|
|
38
|
+
private processing;
|
|
39
|
+
private messageQueue;
|
|
40
|
+
/** @internal Override for testing — replaces the AI SDK generateText call */
|
|
41
|
+
_generateTextFn: GenerateTextFn | null;
|
|
42
|
+
/**
|
|
43
|
+
* Create a new AgentRunnerService.
|
|
44
|
+
*
|
|
45
|
+
* @param config - Agent configuration
|
|
46
|
+
* @param modelManager - Optional model manager instance (for testing)
|
|
47
|
+
* @param apiClient - Optional API client instance (for testing)
|
|
48
|
+
*/
|
|
49
|
+
constructor(config: CrewlyAgentConfig, modelManager?: ModelManager, apiClient?: CrewlyApiClient);
|
|
50
|
+
/**
|
|
51
|
+
* Initialize the agent runner by loading the model.
|
|
52
|
+
* Must be called before run().
|
|
53
|
+
*
|
|
54
|
+
* @throws Error if the model cannot be loaded
|
|
55
|
+
*/
|
|
56
|
+
initialize(): Promise<void>;
|
|
57
|
+
/**
|
|
58
|
+
* Run the agent with a new user message.
|
|
59
|
+
*
|
|
60
|
+
* Messages are queued and processed serially to prevent concurrent
|
|
61
|
+
* generateText calls which would corrupt conversation state.
|
|
62
|
+
*
|
|
63
|
+
* @param message - User/system message to process
|
|
64
|
+
* @returns Result of the agent run including text, tool calls, and usage
|
|
65
|
+
*/
|
|
66
|
+
run(message: string): Promise<AgentRunResult>;
|
|
67
|
+
/**
|
|
68
|
+
* Get current conversation state (for inspection/debugging).
|
|
69
|
+
*
|
|
70
|
+
* @returns Current conversation state
|
|
71
|
+
*/
|
|
72
|
+
getState(): ConversationState;
|
|
73
|
+
/**
|
|
74
|
+
* Get the number of messages in the conversation history.
|
|
75
|
+
*
|
|
76
|
+
* @returns Message count
|
|
77
|
+
*/
|
|
78
|
+
getHistoryLength(): number;
|
|
79
|
+
/**
|
|
80
|
+
* Check if the agent runner has been initialized.
|
|
81
|
+
*
|
|
82
|
+
* @returns True if initialize() has been called successfully
|
|
83
|
+
*/
|
|
84
|
+
isInitialized(): boolean;
|
|
85
|
+
/**
|
|
86
|
+
* Process queued messages serially.
|
|
87
|
+
*/
|
|
88
|
+
private processQueue;
|
|
89
|
+
/**
|
|
90
|
+
* Execute a single generateText run with the current conversation context.
|
|
91
|
+
*
|
|
92
|
+
* @param message - New message to add to the conversation
|
|
93
|
+
* @returns Agent run result
|
|
94
|
+
*/
|
|
95
|
+
private executeRun;
|
|
96
|
+
/**
|
|
97
|
+
* Compact conversation history by summarizing older messages.
|
|
98
|
+
*
|
|
99
|
+
* Keeps the most recent messages and replaces older ones with a summary.
|
|
100
|
+
* Uses the same model with a summarization prompt.
|
|
101
|
+
*/
|
|
102
|
+
private compactHistory;
|
|
103
|
+
}
|
|
104
|
+
export {};
|
|
105
|
+
//# sourceMappingURL=agent-runner.service.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"agent-runner.service.d.ts","sourceRoot":"","sources":["../../../../../../../backend/src/services/agent/crewly-agent/agent-runner.service.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAGH,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAClD,OAAO,EAAE,eAAe,EAAE,MAAM,iBAAiB,CAAC;AAElD,OAAO,EACL,KAAK,iBAAiB,EACtB,KAAK,iBAAiB,EACtB,KAAK,cAAc,EAGpB,MAAM,YAAY,CAAC;AAEpB;;;;;;;;;;;;;;;;GAgBG;AACH,8EAA8E;AAC9E,KAAK,cAAc,GAAG,CAAC,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,KAAK,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC;AAE1F,qBAAa,kBAAkB;IAC7B,OAAO,CAAC,MAAM,CAAoB;IAClC,OAAO,CAAC,YAAY,CAAe;IACnC,OAAO,CAAC,SAAS,CAAkB;IACnC,OAAO,CAAC,KAAK,CAA8B;IAC3C,OAAO,CAAC,KAAK,CAAoB;IACjC,OAAO,CAAC,UAAU,CAAS;IAC3B,OAAO,CAAC,YAAY,CAA6G;IACjI,6EAA6E;IAC7E,eAAe,EAAE,cAAc,GAAG,IAAI,CAAQ;IAE9C;;;;;;OAMG;gBAED,MAAM,EAAE,iBAAiB,EACzB,YAAY,CAAC,EAAE,YAAY,EAC3B,SAAS,CAAC,EAAE,eAAe;IAiB7B;;;;;OAKG;IACG,UAAU,IAAI,OAAO,CAAC,IAAI,CAAC;IAIjC;;;;;;;;OAQG;IACG,GAAG,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,cAAc,CAAC;IASnD;;;;OAIG;IACH,QAAQ,IAAI,iBAAiB;IAI7B;;;;OAIG;IACH,gBAAgB,IAAI,MAAM;IAI1B;;;;OAIG;IACH,aAAa,IAAI,OAAO;IAIxB;;OAEG;YACW,YAAY;IAc1B;;;;;OAKG;YACW,UAAU;IAmExB;;;;;OAKG;YACW,cAAc;CAuB7B"}
|
|
@@ -0,0 +1,199 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Crewly Agent Runner Service
|
|
3
|
+
*
|
|
4
|
+
* Core reasoning loop for the Crewly Agent runtime. Wraps Vercel AI SDK's
|
|
5
|
+
* generateText with conversation history management, context compaction,
|
|
6
|
+
* and structured result tracking.
|
|
7
|
+
*
|
|
8
|
+
* @module services/agent/crewly-agent/agent-runner.service
|
|
9
|
+
*/
|
|
10
|
+
import { generateText, stepCountIs } from 'ai';
|
|
11
|
+
import { ModelManager } from './model-manager.js';
|
|
12
|
+
import { CrewlyApiClient } from './api-client.js';
|
|
13
|
+
import { createTools } from './tool-registry.js';
|
|
14
|
+
export class AgentRunnerService {
|
|
15
|
+
config;
|
|
16
|
+
modelManager;
|
|
17
|
+
apiClient;
|
|
18
|
+
model = null;
|
|
19
|
+
state;
|
|
20
|
+
processing = false;
|
|
21
|
+
messageQueue = [];
|
|
22
|
+
/** @internal Override for testing — replaces the AI SDK generateText call */
|
|
23
|
+
_generateTextFn = null;
|
|
24
|
+
/**
|
|
25
|
+
* Create a new AgentRunnerService.
|
|
26
|
+
*
|
|
27
|
+
* @param config - Agent configuration
|
|
28
|
+
* @param modelManager - Optional model manager instance (for testing)
|
|
29
|
+
* @param apiClient - Optional API client instance (for testing)
|
|
30
|
+
*/
|
|
31
|
+
constructor(config, modelManager, apiClient) {
|
|
32
|
+
this.config = config;
|
|
33
|
+
this.modelManager = modelManager || new ModelManager();
|
|
34
|
+
this.apiClient = apiClient || new CrewlyApiClient(config.apiBaseUrl, config.sessionName);
|
|
35
|
+
this.state = {
|
|
36
|
+
messages: [],
|
|
37
|
+
systemPrompt: config.systemPrompt,
|
|
38
|
+
totalTokens: { input: 0, output: 0 },
|
|
39
|
+
createdAt: new Date(),
|
|
40
|
+
lastActivityAt: new Date(),
|
|
41
|
+
};
|
|
42
|
+
}
|
|
43
|
+
/**
|
|
44
|
+
* Initialize the agent runner by loading the model.
|
|
45
|
+
* Must be called before run().
|
|
46
|
+
*
|
|
47
|
+
* @throws Error if the model cannot be loaded
|
|
48
|
+
*/
|
|
49
|
+
async initialize() {
|
|
50
|
+
this.model = await this.modelManager.getModel(this.config.model);
|
|
51
|
+
}
|
|
52
|
+
/**
|
|
53
|
+
* Run the agent with a new user message.
|
|
54
|
+
*
|
|
55
|
+
* Messages are queued and processed serially to prevent concurrent
|
|
56
|
+
* generateText calls which would corrupt conversation state.
|
|
57
|
+
*
|
|
58
|
+
* @param message - User/system message to process
|
|
59
|
+
* @returns Result of the agent run including text, tool calls, and usage
|
|
60
|
+
*/
|
|
61
|
+
async run(message) {
|
|
62
|
+
return new Promise((resolve, reject) => {
|
|
63
|
+
this.messageQueue.push({ message, resolve, reject });
|
|
64
|
+
if (!this.processing) {
|
|
65
|
+
this.processQueue();
|
|
66
|
+
}
|
|
67
|
+
});
|
|
68
|
+
}
|
|
69
|
+
/**
|
|
70
|
+
* Get current conversation state (for inspection/debugging).
|
|
71
|
+
*
|
|
72
|
+
* @returns Current conversation state
|
|
73
|
+
*/
|
|
74
|
+
getState() {
|
|
75
|
+
return { ...this.state };
|
|
76
|
+
}
|
|
77
|
+
/**
|
|
78
|
+
* Get the number of messages in the conversation history.
|
|
79
|
+
*
|
|
80
|
+
* @returns Message count
|
|
81
|
+
*/
|
|
82
|
+
getHistoryLength() {
|
|
83
|
+
return this.state.messages.length;
|
|
84
|
+
}
|
|
85
|
+
/**
|
|
86
|
+
* Check if the agent runner has been initialized.
|
|
87
|
+
*
|
|
88
|
+
* @returns True if initialize() has been called successfully
|
|
89
|
+
*/
|
|
90
|
+
isInitialized() {
|
|
91
|
+
return this.model !== null;
|
|
92
|
+
}
|
|
93
|
+
/**
|
|
94
|
+
* Process queued messages serially.
|
|
95
|
+
*/
|
|
96
|
+
async processQueue() {
|
|
97
|
+
this.processing = true;
|
|
98
|
+
while (this.messageQueue.length > 0) {
|
|
99
|
+
const item = this.messageQueue.shift();
|
|
100
|
+
try {
|
|
101
|
+
const result = await this.executeRun(item.message);
|
|
102
|
+
item.resolve(result);
|
|
103
|
+
}
|
|
104
|
+
catch (error) {
|
|
105
|
+
item.reject(error instanceof Error ? error : new Error(String(error)));
|
|
106
|
+
}
|
|
107
|
+
}
|
|
108
|
+
this.processing = false;
|
|
109
|
+
}
|
|
110
|
+
/**
|
|
111
|
+
* Execute a single generateText run with the current conversation context.
|
|
112
|
+
*
|
|
113
|
+
* @param message - New message to add to the conversation
|
|
114
|
+
* @returns Agent run result
|
|
115
|
+
*/
|
|
116
|
+
async executeRun(message) {
|
|
117
|
+
if (!this.model) {
|
|
118
|
+
throw new Error('AgentRunner not initialized. Call initialize() first.');
|
|
119
|
+
}
|
|
120
|
+
// Check if compaction is needed before adding new message
|
|
121
|
+
if (this.state.messages.length >= this.config.maxHistoryMessages) {
|
|
122
|
+
await this.compactHistory();
|
|
123
|
+
}
|
|
124
|
+
// Add user message to history
|
|
125
|
+
this.state.messages.push({ role: 'user', content: message });
|
|
126
|
+
this.state.lastActivityAt = new Date();
|
|
127
|
+
// Build tools
|
|
128
|
+
const tools = createTools(this.apiClient, this.config.sessionName);
|
|
129
|
+
// Execute generateText with agentic loop
|
|
130
|
+
const generateFn = this._generateTextFn || generateText;
|
|
131
|
+
const result = await generateFn({
|
|
132
|
+
model: this.model,
|
|
133
|
+
system: this.state.systemPrompt,
|
|
134
|
+
messages: this.state.messages,
|
|
135
|
+
tools,
|
|
136
|
+
stopWhen: stepCountIs(this.config.maxSteps),
|
|
137
|
+
temperature: this.config.model.temperature,
|
|
138
|
+
maxOutputTokens: this.config.model.maxTokens,
|
|
139
|
+
});
|
|
140
|
+
// Track tool calls across all steps
|
|
141
|
+
const toolCalls = [];
|
|
142
|
+
for (const step of result.steps) {
|
|
143
|
+
if (step.toolCalls) {
|
|
144
|
+
for (const tc of step.toolCalls) {
|
|
145
|
+
toolCalls.push({
|
|
146
|
+
toolName: tc.toolName,
|
|
147
|
+
args: tc.input ?? {},
|
|
148
|
+
result: step.toolResults?.find((tr) => tr.toolCallId === tc.toolCallId)?.output,
|
|
149
|
+
});
|
|
150
|
+
}
|
|
151
|
+
}
|
|
152
|
+
}
|
|
153
|
+
// Add assistant response to history
|
|
154
|
+
if (result.text) {
|
|
155
|
+
this.state.messages.push({ role: 'assistant', content: result.text });
|
|
156
|
+
}
|
|
157
|
+
// Update token tracking
|
|
158
|
+
const usage = {
|
|
159
|
+
input: result.usage?.inputTokens ?? 0,
|
|
160
|
+
output: result.usage?.outputTokens ?? 0,
|
|
161
|
+
};
|
|
162
|
+
this.state.totalTokens.input += usage.input;
|
|
163
|
+
this.state.totalTokens.output += usage.output;
|
|
164
|
+
return {
|
|
165
|
+
text: result.text,
|
|
166
|
+
steps: result.steps.length,
|
|
167
|
+
usage,
|
|
168
|
+
toolCalls,
|
|
169
|
+
finishReason: result.finishReason,
|
|
170
|
+
};
|
|
171
|
+
}
|
|
172
|
+
/**
|
|
173
|
+
* Compact conversation history by summarizing older messages.
|
|
174
|
+
*
|
|
175
|
+
* Keeps the most recent messages and replaces older ones with a summary.
|
|
176
|
+
* Uses the same model with a summarization prompt.
|
|
177
|
+
*/
|
|
178
|
+
async compactHistory() {
|
|
179
|
+
if (!this.model || this.state.messages.length < 10)
|
|
180
|
+
return;
|
|
181
|
+
const keepRecent = 10;
|
|
182
|
+
const oldMessages = this.state.messages.slice(0, -keepRecent);
|
|
183
|
+
const recentMessages = this.state.messages.slice(-keepRecent);
|
|
184
|
+
// Build a simple summary of old messages
|
|
185
|
+
const summaryParts = [];
|
|
186
|
+
for (const msg of oldMessages) {
|
|
187
|
+
const content = typeof msg.content === 'string'
|
|
188
|
+
? msg.content.substring(0, 200)
|
|
189
|
+
: JSON.stringify(msg.content).substring(0, 200);
|
|
190
|
+
summaryParts.push(`[${msg.role}]: ${content}`);
|
|
191
|
+
}
|
|
192
|
+
const summaryText = `Previous conversation summary (${oldMessages.length} messages compressed):\n${summaryParts.join('\n')}`;
|
|
193
|
+
this.state.messages = [
|
|
194
|
+
{ role: 'assistant', content: summaryText },
|
|
195
|
+
...recentMessages,
|
|
196
|
+
];
|
|
197
|
+
}
|
|
198
|
+
}
|
|
199
|
+
//# sourceMappingURL=agent-runner.service.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"agent-runner.service.js","sourceRoot":"","sources":["../../../../../../../backend/src/services/agent/crewly-agent/agent-runner.service.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,EAAE,YAAY,EAAE,WAAW,EAAyC,MAAM,IAAI,CAAC;AACtF,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAClD,OAAO,EAAE,eAAe,EAAE,MAAM,iBAAiB,CAAC;AAClD,OAAO,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AA6BjD,MAAM,OAAO,kBAAkB;IACrB,MAAM,CAAoB;IAC1B,YAAY,CAAe;IAC3B,SAAS,CAAkB;IAC3B,KAAK,GAAyB,IAAI,CAAC;IACnC,KAAK,CAAoB;IACzB,UAAU,GAAG,KAAK,CAAC;IACnB,YAAY,GAA0G,EAAE,CAAC;IACjI,6EAA6E;IAC7E,eAAe,GAA0B,IAAI,CAAC;IAE9C;;;;;;OAMG;IACH,YACE,MAAyB,EACzB,YAA2B,EAC3B,SAA2B;QAE3B,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC;QACrB,IAAI,CAAC,YAAY,GAAG,YAAY,IAAI,IAAI,YAAY,EAAE,CAAC;QACvD,IAAI,CAAC,SAAS,GAAG,SAAS,IAAI,IAAI,eAAe,CAC/C,MAAM,CAAC,UAAU,EACjB,MAAM,CAAC,WAAW,CACnB,CAAC;QACF,IAAI,CAAC,KAAK,GAAG;YACX,QAAQ,EAAE,EAAE;YACZ,YAAY,EAAE,MAAM,CAAC,YAAY;YACjC,WAAW,EAAE,EAAE,KAAK,EAAE,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE;YACpC,SAAS,EAAE,IAAI,IAAI,EAAE;YACrB,cAAc,EAAE,IAAI,IAAI,EAAE;SAC3B,CAAC;IACJ,CAAC;IAED;;;;;OAKG;IACH,KAAK,CAAC,UAAU;QACd,IAAI,CAAC,KAAK,GAAG,MAAM,IAAI,CAAC,YAAY,CAAC,QAAQ,CAAC,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;IACnE,CAAC;IAED;;;;;;;;OAQG;IACH,KAAK,CAAC,GAAG,CAAC,OAAe;QACvB,OAAO,IAAI,OAAO,CAAiB,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;YACrD,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,EAAE,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,CAAC,CAAC;YACrD,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,CAAC;gBACrB,IAAI,CAAC,YAAY,EAAE,CAAC;YACtB,CAAC;QACH,CAAC,CAAC,CAAC;IACL,CAAC;IAED;;;;OAIG;IACH,QAAQ;QACN,OAAO,EAAE,GAAG,IAAI,CAAC,KAAK,EAAE,CAAC;IAC3B,CAAC;IAED;;;;OAIG;IACH,gBAAgB;QACd,OAAO,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,MAAM,CAAC;IACpC,CAAC;IAED;;;;OAIG;IACH,aAAa;QACX,OAAO,IAAI,CAAC,KAAK,KAAK,IAAI,CAAC;IAC7B,CAAC;IAED;;OAEG;IACK,KAAK,CAAC,YAAY;QACxB,IAAI,CAAC,UAAU,GAAG,IAAI,CAAC;QACvB,OAAO,IAAI,CAAC,YAAY,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACpC,MAAM,IAAI,GAAG,IAAI,CAAC,YAAY,CAAC,KAAK,EAAG,CAAC;YACxC,IAAI,CAAC;gBACH,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;gBACnD,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;YACvB,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBACf,IAAI,CAAC,MAAM,CAAC,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,KAAK,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;YACzE,CAAC;QACH,CAAC;QACD,IAAI,CAAC,UAAU,GAAG,KAAK,CAAC;IAC1B,CAAC;IAED;;;;;OAKG;IACK,KAAK,CAAC,UAAU,CAAC,OAAe;QACtC,IAAI,CAAC,IAAI,CAAC,KAAK,EAAE,CAAC;YAChB,MAAM,IAAI,KAAK,CAAC,uDAAuD,CAAC,CAAC;QAC3E,CAAC;QAED,0DAA0D;QAC1D,IAAI,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,MAAM,IAAI,IAAI,CAAC,MAAM,CAAC,kBAAkB,EAAE,CAAC;YACjE,MAAM,IAAI,CAAC,cAAc,EAAE,CAAC;QAC9B,CAAC;QAED,8BAA8B;QAC9B,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,EAAE,CAAC,CAAC;QAC7D,IAAI,CAAC,KAAK,CAAC,cAAc,GAAG,IAAI,IAAI,EAAE,CAAC;QAEvC,cAAc;QACd,MAAM,KAAK,GAAG,WAAW,CAAC,IAAI,CAAC,SAAS,EAAE,IAAI,CAAC,MAAM,CAAC,WAAW,CAAC,CAAC;QAEnE,yCAAyC;QACzC,MAAM,UAAU,GAAG,IAAI,CAAC,eAAe,IAAK,YAAyB,CAAC;QACtE,MAAM,MAAM,GAAG,MAAM,UAAU,CAAC;YAC9B,KAAK,EAAE,IAAI,CAAC,KAAK;YACjB,MAAM,EAAE,IAAI,CAAC,KAAK,CAAC,YAAY;YAC/B,QAAQ,EAAE,IAAI,CAAC,KAAK,CAAC,QAAQ;YAC7B,KAAK;YACL,QAAQ,EAAE,WAAW,CAAC,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC;YAC3C,WAAW,EAAE,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,WAAW;YAC1C,eAAe,EAAE,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,SAAS;SAC7C,CAAC,CAAC;QAEH,oCAAoC;QACpC,MAAM,SAAS,GAAqB,EAAE,CAAC;QACvC,KAAK,MAAM,IAAI,IAAI,MAAM,CAAC,KAAK,EAAE,CAAC;YAChC,IAAI,IAAI,CAAC,SAAS,EAAE,CAAC;gBACnB,KAAK,MAAM,EAAE,IAAI,IAAI,CAAC,SAAS,EAAE,CAAC;oBAChC,SAAS,CAAC,IAAI,CAAC;wBACb,QAAQ,EAAE,EAAE,CAAC,QAAQ;wBACrB,IAAI,EAAG,EAA8B,CAAC,KAAgC,IAAI,EAAE;wBAC5E,MAAM,EAAE,IAAI,CAAC,WAAW,EAAE,IAAI,CAC5B,CAAC,EAA0B,EAAE,EAAE,CAAC,EAAE,CAAC,UAAU,KAAK,EAAE,CAAC,UAAU,CAChE,EAAE,MAAM;qBACV,CAAC,CAAC;gBACL,CAAC;YACH,CAAC;QACH,CAAC;QAED,oCAAoC;QACpC,IAAI,MAAM,CAAC,IAAI,EAAE,CAAC;YAChB,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,WAAW,EAAE,OAAO,EAAE,MAAM,CAAC,IAAI,EAAE,CAAC,CAAC;QACxE,CAAC;QAED,wBAAwB;QACxB,MAAM,KAAK,GAAG;YACZ,KAAK,EAAE,MAAM,CAAC,KAAK,EAAE,WAAW,IAAI,CAAC;YACrC,MAAM,EAAE,MAAM,CAAC,KAAK,EAAE,YAAY,IAAI,CAAC;SACxC,CAAC;QACF,IAAI,CAAC,KAAK,CAAC,WAAW,CAAC,KAAK,IAAI,KAAK,CAAC,KAAK,CAAC;QAC5C,IAAI,CAAC,KAAK,CAAC,WAAW,CAAC,MAAM,IAAI,KAAK,CAAC,MAAM,CAAC;QAE9C,OAAO;YACL,IAAI,EAAE,MAAM,CAAC,IAAI;YACjB,KAAK,EAAE,MAAM,CAAC,KAAK,CAAC,MAAM;YAC1B,KAAK;YACL,SAAS;YACT,YAAY,EAAE,MAAM,CAAC,YAAY;SAClC,CAAC;IACJ,CAAC;IAED;;;;;OAKG;IACK,KAAK,CAAC,cAAc;QAC1B,IAAI,CAAC,IAAI,CAAC,KAAK,IAAI,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,MAAM,GAAG,EAAE;YAAE,OAAO;QAE3D,MAAM,UAAU,GAAG,EAAE,CAAC;QACtB,MAAM,WAAW,GAAG,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,UAAU,CAAC,CAAC;QAC9D,MAAM,cAAc,GAAG,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,UAAU,CAAC,CAAC;QAE9D,yCAAyC;QACzC,MAAM,YAAY,GAAa,EAAE,CAAC;QAClC,KAAK,MAAM,GAAG,IAAI,WAAW,EAAE,CAAC;YAC9B,MAAM,OAAO,GAAG,OAAO,GAAG,CAAC,OAAO,KAAK,QAAQ;gBAC7C,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC,EAAE,GAAG,CAAC;gBAC/B,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,SAAS,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC;YAClD,YAAY,CAAC,IAAI,CAAC,IAAI,GAAG,CAAC,IAAI,MAAM,OAAO,EAAE,CAAC,CAAC;QACjD,CAAC;QAED,MAAM,WAAW,GAAG,kCAAkC,WAAW,CAAC,MAAM,2BAA2B,YAAY,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;QAE7H,IAAI,CAAC,KAAK,CAAC,QAAQ,GAAG;YACpB,EAAE,IAAI,EAAE,WAAW,EAAE,OAAO,EAAE,WAAW,EAAE;YAC3C,GAAG,cAAc;SAClB,CAAC;IACJ,CAAC;CACF"}
|