crewly 1.0.0
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 +21 -0
- package/README.md +96 -0
- package/config/auto-assign/default-config.yaml +74 -0
- package/config/constants.d.ts.map +1 -0
- package/config/constants.test.ts +469 -0
- package/config/constants.ts +827 -0
- package/config/continuation/prompts/continue-work.md +60 -0
- package/config/continuation/prompts/max-iterations.md +41 -0
- package/config/continuation/prompts/quality-gates-failed.md +37 -0
- package/config/continuation/prompts/retry-error.md +59 -0
- package/config/continuation/prompts/task-assignment.md +60 -0
- package/config/index.d.ts.map +1 -0
- package/config/index.ts +87 -0
- package/config/orchestrator_tasks/prompts/assign-task-orchestrator-prompt-template.md +70 -0
- package/config/orchestrator_tasks/prompts/checkin-orchestrator-prompt-template.md +138 -0
- package/config/orchestrator_tasks/prompts/orchestrator-prompt.md +68 -0
- package/config/orchestrator_tasks/prompts/project-start-orchestrator-prompt-template.md +104 -0
- package/config/quality-gates/default-gates.test.ts +246 -0
- package/config/quality-gates/default-gates.ts +191 -0
- package/config/quality-gates/index.ts +21 -0
- package/config/roles/_common/memory-instructions.md +56 -0
- package/config/roles/architect/prompt.md +87 -0
- package/config/roles/architect/role.json +13 -0
- package/config/roles/backend-developer/prompt.md +86 -0
- package/config/roles/backend-developer/role.json +13 -0
- package/config/roles/designer/prompt.md +86 -0
- package/config/roles/designer/role.json +13 -0
- package/config/roles/developer/prompt.md +94 -0
- package/config/roles/developer/role.json +13 -0
- package/config/roles/frontend-developer/prompt.md +86 -0
- package/config/roles/frontend-developer/role.json +13 -0
- package/config/roles/fullstack-dev/prompt.md +86 -0
- package/config/roles/fullstack-dev/role.json +13 -0
- package/config/roles/generalist/prompt.md +87 -0
- package/config/roles/generalist/role.json +13 -0
- package/config/roles/orchestrator/prompt.md +865 -0
- package/config/roles/orchestrator/role.json +13 -0
- package/config/roles/product-manager/prompt.md +86 -0
- package/config/roles/product-manager/role.json +13 -0
- package/config/roles/qa/prompt.md +86 -0
- package/config/roles/qa/role.json +13 -0
- package/config/roles/qa-engineer/prompt.md +86 -0
- package/config/roles/qa-engineer/role.json +13 -0
- package/config/roles/sales/prompt.md +86 -0
- package/config/roles/sales/role.json +13 -0
- package/config/roles/support/prompt.md +86 -0
- package/config/roles/support/role.json +13 -0
- package/config/roles/tpm/prompt.md +87 -0
- package/config/roles/tpm/role.json +13 -0
- package/config/runtime_scripts/initialize_claude.sh +14 -0
- package/config/runtime_scripts/initialize_codex.sh +14 -0
- package/config/runtime_scripts/runtime-config.json +26 -0
- package/config/skills/_common/lib.sh +64 -0
- package/config/skills/agent/_common/lib.sh +4 -0
- package/config/skills/agent/accept-task/execute.sh +21 -0
- package/config/skills/agent/accept-task/instructions.md +20 -0
- package/config/skills/agent/accept-task/skill.json +20 -0
- package/config/skills/agent/block-task/execute.sh +26 -0
- package/config/skills/agent/block-task/instructions.md +22 -0
- package/config/skills/agent/block-task/skill.json +20 -0
- package/config/skills/agent/check-quality-gates/execute.sh +20 -0
- package/config/skills/agent/check-quality-gates/instructions.md +23 -0
- package/config/skills/agent/check-quality-gates/skill.json +20 -0
- package/config/skills/agent/complete-task/execute.sh +26 -0
- package/config/skills/agent/complete-task/instructions.md +22 -0
- package/config/skills/agent/complete-task/skill.json +20 -0
- package/config/skills/agent/get-my-context/execute.sh +23 -0
- package/config/skills/agent/get-my-context/instructions.md +21 -0
- package/config/skills/agent/get-my-context/skill.json +20 -0
- package/config/skills/agent/get-sops/execute.sh +24 -0
- package/config/skills/agent/get-sops/instructions.md +21 -0
- package/config/skills/agent/get-sops/skill.json +20 -0
- package/config/skills/agent/get-team-status/execute.sh +8 -0
- package/config/skills/agent/get-team-status/instructions.md +17 -0
- package/config/skills/agent/get-team-status/skill.json +20 -0
- package/config/skills/agent/manage-knowledge/execute.sh +60 -0
- package/config/skills/agent/manage-knowledge/instructions.md +46 -0
- package/config/skills/agent/nano-banana-image/.env +2 -0
- package/config/skills/agent/nano-banana-image/.env.example +6 -0
- package/config/skills/agent/nano-banana-image/generate.sh +73 -0
- package/config/skills/agent/nano-banana-image/instructions.md +50 -0
- package/config/skills/agent/nano-banana-image/skill.json +39 -0
- package/config/skills/agent/query-knowledge/execute.sh +30 -0
- package/config/skills/agent/query-knowledge/instructions.md +47 -0
- package/config/skills/agent/query-knowledge/skill.json +20 -0
- package/config/skills/agent/read-task/execute.sh +15 -0
- package/config/skills/agent/read-task/instructions.md +19 -0
- package/config/skills/agent/read-task/skill.json +20 -0
- package/config/skills/agent/recall/execute.sh +24 -0
- package/config/skills/agent/recall/instructions.md +23 -0
- package/config/skills/agent/recall/skill.json +20 -0
- package/config/skills/agent/record-learning/execute.sh +29 -0
- package/config/skills/agent/record-learning/instructions.md +24 -0
- package/config/skills/agent/record-learning/skill.json +20 -0
- package/config/skills/agent/register-self/execute.sh +28 -0
- package/config/skills/agent/register-self/instructions.md +18 -0
- package/config/skills/agent/register-self/skill.json +20 -0
- package/config/skills/agent/remember/execute.sh +29 -0
- package/config/skills/agent/remember/instructions.md +24 -0
- package/config/skills/agent/remember/skill.json +20 -0
- package/config/skills/agent/report-progress/execute.sh +28 -0
- package/config/skills/agent/report-progress/instructions.md +25 -0
- package/config/skills/agent/report-progress/skill.json +20 -0
- package/config/skills/agent/report-status/execute.sh +35 -0
- package/config/skills/agent/report-status/instructions.md +36 -0
- package/config/skills/agent/report-status/skill.json +20 -0
- package/config/skills/agent/send-chat-response/execute.sh +26 -0
- package/config/skills/agent/send-chat-response/instructions.md +22 -0
- package/config/skills/agent/send-chat-response/skill.json +20 -0
- package/config/skills/agent/send-message/execute.sh +17 -0
- package/config/skills/agent/send-message/instructions.md +20 -0
- package/config/skills/agent/send-message/skill.json +20 -0
- package/config/skills/agent/send-pdf-to-slack/execute.sh +182 -0
- package/config/skills/agent/send-pdf-to-slack/instructions.md +49 -0
- package/config/skills/agent/send-pdf-to-slack/skill.json +20 -0
- package/config/skills/chrome-browser/instructions.md +42 -0
- package/config/skills/chrome-browser/skill.json +39 -0
- package/config/skills/nano-banana-image/.env +2 -0
- package/config/skills/nano-banana-image/.env.example +6 -0
- package/config/skills/nano-banana-image/generate.sh +73 -0
- package/config/skills/nano-banana-image/instructions.md +50 -0
- package/config/skills/nano-banana-image/skill.json +39 -0
- package/config/skills/orchestrator/_common/lib.sh +4 -0
- package/config/skills/orchestrator/assign-task/execute.sh +11 -0
- package/config/skills/orchestrator/assign-task/instructions.md +17 -0
- package/config/skills/orchestrator/assign-task/skill.json +20 -0
- package/config/skills/orchestrator/assign-team-to-project/execute.sh +14 -0
- package/config/skills/orchestrator/assign-team-to-project/instructions.md +20 -0
- package/config/skills/orchestrator/assign-team-to-project/skill.json +20 -0
- package/config/skills/orchestrator/broadcast/execute.sh +35 -0
- package/config/skills/orchestrator/broadcast/instructions.md +19 -0
- package/config/skills/orchestrator/broadcast/skill.json +20 -0
- package/config/skills/orchestrator/cancel-schedule/execute.sh +13 -0
- package/config/skills/orchestrator/cancel-schedule/instructions.md +19 -0
- package/config/skills/orchestrator/cancel-schedule/skill.json +20 -0
- package/config/skills/orchestrator/complete-task/execute.sh +10 -0
- package/config/skills/orchestrator/complete-task/instructions.md +17 -0
- package/config/skills/orchestrator/complete-task/skill.json +20 -0
- package/config/skills/orchestrator/create-project/execute.sh +14 -0
- package/config/skills/orchestrator/create-project/instructions.md +21 -0
- package/config/skills/orchestrator/create-project/skill.json +20 -0
- package/config/skills/orchestrator/create-team/execute.sh +14 -0
- package/config/skills/orchestrator/create-team/instructions.md +21 -0
- package/config/skills/orchestrator/create-team/skill.json +20 -0
- package/config/skills/orchestrator/delegate-task/execute.sh +37 -0
- package/config/skills/orchestrator/delegate-task/instructions.md +23 -0
- package/config/skills/orchestrator/delegate-task/skill.json +20 -0
- package/config/skills/orchestrator/get-agent-logs/execute.sh +14 -0
- package/config/skills/orchestrator/get-agent-logs/instructions.md +20 -0
- package/config/skills/orchestrator/get-agent-logs/skill.json +20 -0
- package/config/skills/orchestrator/get-agent-status/execute.sh +22 -0
- package/config/skills/orchestrator/get-agent-status/instructions.md +19 -0
- package/config/skills/orchestrator/get-agent-status/skill.json +20 -0
- package/config/skills/orchestrator/get-project-overview/execute.sh +7 -0
- package/config/skills/orchestrator/get-project-overview/instructions.md +17 -0
- package/config/skills/orchestrator/get-project-overview/skill.json +20 -0
- package/config/skills/orchestrator/get-tasks/execute.sh +27 -0
- package/config/skills/orchestrator/get-tasks/instructions.md +17 -0
- package/config/skills/orchestrator/get-tasks/skill.json +20 -0
- package/config/skills/orchestrator/get-team-status/execute.sh +7 -0
- package/config/skills/orchestrator/get-team-status/instructions.md +17 -0
- package/config/skills/orchestrator/get-team-status/skill.json +20 -0
- package/config/skills/orchestrator/heartbeat/execute.sh +37 -0
- package/config/skills/orchestrator/heartbeat/instructions.md +24 -0
- package/config/skills/orchestrator/heartbeat/skill.json +20 -0
- package/config/skills/orchestrator/list-subscriptions/execute.sh +7 -0
- package/config/skills/orchestrator/list-subscriptions/instructions.md +17 -0
- package/config/skills/orchestrator/list-subscriptions/skill.json +20 -0
- package/config/skills/orchestrator/query-knowledge/execute.sh +30 -0
- package/config/skills/orchestrator/query-knowledge/instructions.md +47 -0
- package/config/skills/orchestrator/query-knowledge/skill.json +20 -0
- package/config/skills/orchestrator/recall/execute.sh +13 -0
- package/config/skills/orchestrator/recall/instructions.md +23 -0
- package/config/skills/orchestrator/recall/skill.json +20 -0
- package/config/skills/orchestrator/record-failure/execute.sh +13 -0
- package/config/skills/orchestrator/record-failure/instructions.md +22 -0
- package/config/skills/orchestrator/record-failure/skill.json +20 -0
- package/config/skills/orchestrator/record-learning/execute.sh +13 -0
- package/config/skills/orchestrator/record-learning/instructions.md +23 -0
- package/config/skills/orchestrator/record-learning/skill.json +20 -0
- package/config/skills/orchestrator/record-success/execute.sh +13 -0
- package/config/skills/orchestrator/record-success/instructions.md +22 -0
- package/config/skills/orchestrator/record-success/skill.json +20 -0
- package/config/skills/orchestrator/register-self/execute.sh +24 -0
- package/config/skills/orchestrator/register-self/instructions.md +21 -0
- package/config/skills/orchestrator/register-self/skill.json +20 -0
- package/config/skills/orchestrator/remember/execute.sh +15 -0
- package/config/skills/orchestrator/remember/instructions.md +24 -0
- package/config/skills/orchestrator/remember/skill.json +20 -0
- package/config/skills/orchestrator/reply-slack/execute.sh +174 -0
- package/config/skills/orchestrator/reply-slack/instructions.md +52 -0
- package/config/skills/orchestrator/reply-slack/skill.json +20 -0
- package/config/skills/orchestrator/restart-crewly/execute.sh +7 -0
- package/config/skills/orchestrator/restart-crewly/instructions.md +23 -0
- package/config/skills/orchestrator/restart-crewly/skill.json +20 -0
- package/config/skills/orchestrator/resume-session/execute.sh +22 -0
- package/config/skills/orchestrator/resume-session/instructions.md +31 -0
- package/config/skills/orchestrator/resume-session/skill.json +20 -0
- package/config/skills/orchestrator/schedule-check/execute.sh +35 -0
- package/config/skills/orchestrator/schedule-check/instructions.md +35 -0
- package/config/skills/orchestrator/schedule-check/skill.json +20 -0
- package/config/skills/orchestrator/send-key/execute.sh +17 -0
- package/config/skills/orchestrator/send-message/execute.sh +17 -0
- package/config/skills/orchestrator/send-message/instructions.md +20 -0
- package/config/skills/orchestrator/send-message/skill.json +20 -0
- package/config/skills/orchestrator/send-pdf-to-slack/execute.sh +182 -0
- package/config/skills/orchestrator/send-pdf-to-slack/instructions.md +49 -0
- package/config/skills/orchestrator/send-pdf-to-slack/skill.json +20 -0
- package/config/skills/orchestrator/set-goal/execute.sh +13 -0
- package/config/skills/orchestrator/set-goal/instructions.md +21 -0
- package/config/skills/orchestrator/set-goal/skill.json +20 -0
- package/config/skills/orchestrator/start-agent/execute.sh +15 -0
- package/config/skills/orchestrator/start-agent/instructions.md +20 -0
- package/config/skills/orchestrator/start-agent/skill.json +20 -0
- package/config/skills/orchestrator/start-team/execute.sh +14 -0
- package/config/skills/orchestrator/start-team/instructions.md +20 -0
- package/config/skills/orchestrator/start-team/skill.json +20 -0
- package/config/skills/orchestrator/stop-agent/execute.sh +15 -0
- package/config/skills/orchestrator/stop-agent/instructions.md +20 -0
- package/config/skills/orchestrator/stop-agent/skill.json +20 -0
- package/config/skills/orchestrator/stop-team/execute.sh +13 -0
- package/config/skills/orchestrator/stop-team/instructions.md +19 -0
- package/config/skills/orchestrator/stop-team/skill.json +20 -0
- package/config/skills/orchestrator/subscribe-event/execute.sh +19 -0
- package/config/skills/orchestrator/subscribe-event/instructions.md +21 -0
- package/config/skills/orchestrator/subscribe-event/skill.json +20 -0
- package/config/skills/orchestrator/terminate-agent/execute.sh +13 -0
- package/config/skills/orchestrator/terminate-agent/instructions.md +19 -0
- package/config/skills/orchestrator/terminate-agent/skill.json +20 -0
- package/config/skills/orchestrator/unsubscribe-event/execute.sh +13 -0
- package/config/skills/orchestrator/unsubscribe-event/instructions.md +19 -0
- package/config/skills/orchestrator/unsubscribe-event/skill.json +20 -0
- package/config/skills/orchestrator/update-focus/execute.sh +13 -0
- package/config/skills/orchestrator/update-focus/instructions.md +21 -0
- package/config/skills/orchestrator/update-focus/skill.json +20 -0
- package/config/skills/playwright-chrome-browser/instructions.md +95 -0
- package/config/skills/playwright-chrome-browser/skill.json +44 -0
- package/config/sops/common/blocker-handling.md +55 -0
- package/config/sops/common/communication-protocol.md +52 -0
- package/config/sops/developer/coding-standards.md +54 -0
- package/config/sops/developer/git-workflow.md +58 -0
- package/config/sops/developer/testing-requirements.md +62 -0
- package/config/sops/pm/progress-tracking.md +57 -0
- package/config/sops/pm/task-decomposition.md +59 -0
- package/config/sops/qa/testing-procedures.md +60 -0
- package/config/task_assignment/prompts/target-agent-assignment-prompt.md +119 -0
- package/config/task_starters/build_e2e_test_plan_prompt.json +51 -0
- package/config/task_starters/build_spec_prompt.json +79 -0
- package/config/task_starters/build_tasks_prompt.json +55 -0
- package/config/task_starters/prompts/build_spec_step1_project_requirements.md +120 -0
- package/config/task_starters/prompts/build_spec_step2_technical_design.md +147 -0
- package/config/task_starters/prompts/build_spec_step3_integration_testing.md +196 -0
- package/config/task_starters/prompts/build_tasks_step1_milestone_structure.md +274 -0
- package/config/task_starters/prompts/e2e_test_plan_step1_build_tests.md +391 -0
- package/config/task_starters/prompts/e2e_test_plan_step2_run_tests.md +240 -0
- package/dist/backend/backend/src/constants.d.ts +669 -0
- package/dist/backend/backend/src/constants.d.ts.map +1 -0
- package/dist/backend/backend/src/constants.js +482 -0
- package/dist/backend/backend/src/constants.js.map +1 -0
- package/dist/backend/backend/src/controllers/api.controller.d.ts +115 -0
- package/dist/backend/backend/src/controllers/api.controller.d.ts.map +1 -0
- package/dist/backend/backend/src/controllers/api.controller.js +427 -0
- package/dist/backend/backend/src/controllers/api.controller.js.map +1 -0
- package/dist/backend/backend/src/controllers/chat/chat.controller.d.ts +160 -0
- package/dist/backend/backend/src/controllers/chat/chat.controller.d.ts.map +1 -0
- package/dist/backend/backend/src/controllers/chat/chat.controller.js +555 -0
- package/dist/backend/backend/src/controllers/chat/chat.controller.js.map +1 -0
- package/dist/backend/backend/src/controllers/chat/chat.routes.d.ts +18 -0
- package/dist/backend/backend/src/controllers/chat/chat.routes.d.ts.map +1 -0
- package/dist/backend/backend/src/controllers/chat/chat.routes.js +39 -0
- package/dist/backend/backend/src/controllers/chat/chat.routes.js.map +1 -0
- package/dist/backend/backend/src/controllers/chat/index.d.ts +10 -0
- package/dist/backend/backend/src/controllers/chat/index.d.ts.map +1 -0
- package/dist/backend/backend/src/controllers/chat/index.js +10 -0
- package/dist/backend/backend/src/controllers/chat/index.js.map +1 -0
- package/dist/backend/backend/src/controllers/event-bus/event-bus.controller.d.ts +54 -0
- package/dist/backend/backend/src/controllers/event-bus/event-bus.controller.d.ts.map +1 -0
- package/dist/backend/backend/src/controllers/event-bus/event-bus.controller.js +123 -0
- package/dist/backend/backend/src/controllers/event-bus/event-bus.controller.js.map +1 -0
- package/dist/backend/backend/src/controllers/event-bus/event-bus.routes.d.ts +15 -0
- package/dist/backend/backend/src/controllers/event-bus/event-bus.routes.d.ts.map +1 -0
- package/dist/backend/backend/src/controllers/event-bus/event-bus.routes.js +27 -0
- package/dist/backend/backend/src/controllers/event-bus/event-bus.routes.js.map +1 -0
- package/dist/backend/backend/src/controllers/index.d.ts +10 -0
- package/dist/backend/backend/src/controllers/index.d.ts.map +1 -0
- package/dist/backend/backend/src/controllers/index.js +37 -0
- package/dist/backend/backend/src/controllers/index.js.map +1 -0
- package/dist/backend/backend/src/controllers/knowledge/index.d.ts +7 -0
- package/dist/backend/backend/src/controllers/knowledge/index.d.ts.map +1 -0
- package/dist/backend/backend/src/controllers/knowledge/index.js +7 -0
- package/dist/backend/backend/src/controllers/knowledge/index.js.map +1 -0
- package/dist/backend/backend/src/controllers/knowledge/knowledge.controller.d.ts +71 -0
- package/dist/backend/backend/src/controllers/knowledge/knowledge.controller.d.ts.map +1 -0
- package/dist/backend/backend/src/controllers/knowledge/knowledge.controller.js +237 -0
- package/dist/backend/backend/src/controllers/knowledge/knowledge.controller.js.map +1 -0
- package/dist/backend/backend/src/controllers/knowledge/knowledge.routes.d.ts +24 -0
- package/dist/backend/backend/src/controllers/knowledge/knowledge.routes.d.ts.map +1 -0
- package/dist/backend/backend/src/controllers/knowledge/knowledge.routes.js +34 -0
- package/dist/backend/backend/src/controllers/knowledge/knowledge.routes.js.map +1 -0
- package/dist/backend/backend/src/controllers/marketplace/index.d.ts +11 -0
- package/dist/backend/backend/src/controllers/marketplace/index.d.ts.map +1 -0
- package/dist/backend/backend/src/controllers/marketplace/index.js +11 -0
- package/dist/backend/backend/src/controllers/marketplace/index.js.map +1 -0
- package/dist/backend/backend/src/controllers/marketplace/marketplace.controller.d.ts +135 -0
- package/dist/backend/backend/src/controllers/marketplace/marketplace.controller.d.ts.map +1 -0
- package/dist/backend/backend/src/controllers/marketplace/marketplace.controller.js +228 -0
- package/dist/backend/backend/src/controllers/marketplace/marketplace.controller.js.map +1 -0
- package/dist/backend/backend/src/controllers/marketplace/marketplace.routes.d.ts +30 -0
- package/dist/backend/backend/src/controllers/marketplace/marketplace.routes.d.ts.map +1 -0
- package/dist/backend/backend/src/controllers/marketplace/marketplace.routes.js +44 -0
- package/dist/backend/backend/src/controllers/marketplace/marketplace.routes.js.map +1 -0
- package/dist/backend/backend/src/controllers/memory/index.d.ts +11 -0
- package/dist/backend/backend/src/controllers/memory/index.d.ts.map +1 -0
- package/dist/backend/backend/src/controllers/memory/index.js +11 -0
- package/dist/backend/backend/src/controllers/memory/index.js.map +1 -0
- package/dist/backend/backend/src/controllers/memory/memory.controller.d.ts +183 -0
- package/dist/backend/backend/src/controllers/memory/memory.controller.d.ts.map +1 -0
- package/dist/backend/backend/src/controllers/memory/memory.controller.js +505 -0
- package/dist/backend/backend/src/controllers/memory/memory.controller.js.map +1 -0
- package/dist/backend/backend/src/controllers/memory/memory.routes.d.ts +30 -0
- package/dist/backend/backend/src/controllers/memory/memory.routes.d.ts.map +1 -0
- package/dist/backend/backend/src/controllers/memory/memory.routes.js +46 -0
- package/dist/backend/backend/src/controllers/memory/memory.routes.js.map +1 -0
- package/dist/backend/backend/src/controllers/messaging/delivery-logs.controller.d.ts +5 -0
- package/dist/backend/backend/src/controllers/messaging/delivery-logs.controller.d.ts.map +1 -0
- package/dist/backend/backend/src/controllers/messaging/delivery-logs.controller.js +21 -0
- package/dist/backend/backend/src/controllers/messaging/delivery-logs.controller.js.map +1 -0
- package/dist/backend/backend/src/controllers/messaging/messaging.controller.d.ts +72 -0
- package/dist/backend/backend/src/controllers/messaging/messaging.controller.d.ts.map +1 -0
- package/dist/backend/backend/src/controllers/messaging/messaging.controller.js +164 -0
- package/dist/backend/backend/src/controllers/messaging/messaging.controller.js.map +1 -0
- package/dist/backend/backend/src/controllers/messaging/messaging.routes.d.ts +15 -0
- package/dist/backend/backend/src/controllers/messaging/messaging.routes.d.ts.map +1 -0
- package/dist/backend/backend/src/controllers/messaging/messaging.routes.js +31 -0
- package/dist/backend/backend/src/controllers/messaging/messaging.routes.js.map +1 -0
- package/dist/backend/backend/src/controllers/messaging/scheduled-messages.controller.d.ts +10 -0
- package/dist/backend/backend/src/controllers/messaging/scheduled-messages.controller.d.ts.map +1 -0
- package/dist/backend/backend/src/controllers/messaging/scheduled-messages.controller.js +223 -0
- package/dist/backend/backend/src/controllers/messaging/scheduled-messages.controller.js.map +1 -0
- package/dist/backend/backend/src/controllers/monitoring/file-watcher.controller.d.ts +121 -0
- package/dist/backend/backend/src/controllers/monitoring/file-watcher.controller.d.ts.map +1 -0
- package/dist/backend/backend/src/controllers/monitoring/file-watcher.controller.js +392 -0
- package/dist/backend/backend/src/controllers/monitoring/file-watcher.controller.js.map +1 -0
- package/dist/backend/backend/src/controllers/monitoring/monitoring.routes.d.ts +9 -0
- package/dist/backend/backend/src/controllers/monitoring/monitoring.routes.d.ts.map +1 -0
- package/dist/backend/backend/src/controllers/monitoring/monitoring.routes.js +15 -0
- package/dist/backend/backend/src/controllers/monitoring/monitoring.routes.js.map +1 -0
- package/dist/backend/backend/src/controllers/monitoring/terminal.controller.d.ts +117 -0
- package/dist/backend/backend/src/controllers/monitoring/terminal.controller.d.ts.map +1 -0
- package/dist/backend/backend/src/controllers/monitoring/terminal.controller.js +705 -0
- package/dist/backend/backend/src/controllers/monitoring/terminal.controller.js.map +1 -0
- package/dist/backend/backend/src/controllers/orchestrator/orchestrator.controller.d.ts +22 -0
- package/dist/backend/backend/src/controllers/orchestrator/orchestrator.controller.d.ts.map +1 -0
- package/dist/backend/backend/src/controllers/orchestrator/orchestrator.controller.js +465 -0
- package/dist/backend/backend/src/controllers/orchestrator/orchestrator.controller.js.map +1 -0
- package/dist/backend/backend/src/controllers/orchestrator/orchestrator.routes.d.ts +9 -0
- package/dist/backend/backend/src/controllers/orchestrator/orchestrator.routes.d.ts.map +1 -0
- package/dist/backend/backend/src/controllers/orchestrator/orchestrator.routes.js +26 -0
- package/dist/backend/backend/src/controllers/orchestrator/orchestrator.routes.js.map +1 -0
- package/dist/backend/backend/src/controllers/project/git.controller.d.ts +10 -0
- package/dist/backend/backend/src/controllers/project/git.controller.d.ts.map +1 -0
- package/dist/backend/backend/src/controllers/project/git.controller.js +160 -0
- package/dist/backend/backend/src/controllers/project/git.controller.js.map +1 -0
- package/dist/backend/backend/src/controllers/project/project.controller.d.ts +41 -0
- package/dist/backend/backend/src/controllers/project/project.controller.d.ts.map +1 -0
- package/dist/backend/backend/src/controllers/project/project.controller.js +1126 -0
- package/dist/backend/backend/src/controllers/project/project.controller.js.map +1 -0
- package/dist/backend/backend/src/controllers/project/project.routes.d.ts +19 -0
- package/dist/backend/backend/src/controllers/project/project.routes.d.ts.map +1 -0
- package/dist/backend/backend/src/controllers/project/project.routes.js +141 -0
- package/dist/backend/backend/src/controllers/project/project.routes.js.map +1 -0
- package/dist/backend/backend/src/controllers/quality-gate/quality-gate.controller.d.ts +32 -0
- package/dist/backend/backend/src/controllers/quality-gate/quality-gate.controller.d.ts.map +1 -0
- package/dist/backend/backend/src/controllers/quality-gate/quality-gate.controller.js +57 -0
- package/dist/backend/backend/src/controllers/quality-gate/quality-gate.controller.js.map +1 -0
- package/dist/backend/backend/src/controllers/request-types.d.ts +225 -0
- package/dist/backend/backend/src/controllers/request-types.d.ts.map +1 -0
- package/dist/backend/backend/src/controllers/request-types.js +8 -0
- package/dist/backend/backend/src/controllers/request-types.js.map +1 -0
- package/dist/backend/backend/src/controllers/self-improvement/index.d.ts +9 -0
- package/dist/backend/backend/src/controllers/self-improvement/index.d.ts.map +1 -0
- package/dist/backend/backend/src/controllers/self-improvement/index.js +9 -0
- package/dist/backend/backend/src/controllers/self-improvement/index.js.map +1 -0
- package/dist/backend/backend/src/controllers/self-improvement/self-improvement.controller.d.ts +11 -0
- package/dist/backend/backend/src/controllers/self-improvement/self-improvement.controller.d.ts.map +1 -0
- package/dist/backend/backend/src/controllers/self-improvement/self-improvement.controller.js +166 -0
- package/dist/backend/backend/src/controllers/self-improvement/self-improvement.controller.js.map +1 -0
- package/dist/backend/backend/src/controllers/session/session.controller.d.ts +80 -0
- package/dist/backend/backend/src/controllers/session/session.controller.d.ts.map +1 -0
- package/dist/backend/backend/src/controllers/session/session.controller.js +275 -0
- package/dist/backend/backend/src/controllers/session/session.controller.js.map +1 -0
- package/dist/backend/backend/src/controllers/session/session.routes.d.ts +19 -0
- package/dist/backend/backend/src/controllers/session/session.routes.d.ts.map +1 -0
- package/dist/backend/backend/src/controllers/session/session.routes.js +33 -0
- package/dist/backend/backend/src/controllers/session/session.routes.js.map +1 -0
- package/dist/backend/backend/src/controllers/settings/index.d.ts +18 -0
- package/dist/backend/backend/src/controllers/settings/index.d.ts.map +1 -0
- package/dist/backend/backend/src/controllers/settings/index.js +27 -0
- package/dist/backend/backend/src/controllers/settings/index.js.map +1 -0
- package/dist/backend/backend/src/controllers/settings/role.controller.d.ts +10 -0
- package/dist/backend/backend/src/controllers/settings/role.controller.d.ts.map +1 -0
- package/dist/backend/backend/src/controllers/settings/role.controller.js +365 -0
- package/dist/backend/backend/src/controllers/settings/role.controller.js.map +1 -0
- package/dist/backend/backend/src/controllers/settings/settings.controller.d.ts +10 -0
- package/dist/backend/backend/src/controllers/settings/settings.controller.d.ts.map +1 -0
- package/dist/backend/backend/src/controllers/settings/settings.controller.js +176 -0
- package/dist/backend/backend/src/controllers/settings/settings.controller.js.map +1 -0
- package/dist/backend/backend/src/controllers/skill/index.d.ts +17 -0
- package/dist/backend/backend/src/controllers/skill/index.d.ts.map +1 -0
- package/dist/backend/backend/src/controllers/skill/index.js +18 -0
- package/dist/backend/backend/src/controllers/skill/index.js.map +1 -0
- package/dist/backend/backend/src/controllers/skill/skill.controller.d.ts +10 -0
- package/dist/backend/backend/src/controllers/skill/skill.controller.d.ts.map +1 -0
- package/dist/backend/backend/src/controllers/skill/skill.controller.js +423 -0
- package/dist/backend/backend/src/controllers/skill/skill.controller.js.map +1 -0
- package/dist/backend/backend/src/controllers/slack/index.d.ts +17 -0
- package/dist/backend/backend/src/controllers/slack/index.d.ts.map +1 -0
- package/dist/backend/backend/src/controllers/slack/index.js +18 -0
- package/dist/backend/backend/src/controllers/slack/index.js.map +1 -0
- package/dist/backend/backend/src/controllers/slack/slack-thread.controller.d.ts +22 -0
- package/dist/backend/backend/src/controllers/slack/slack-thread.controller.d.ts.map +1 -0
- package/dist/backend/backend/src/controllers/slack/slack-thread.controller.js +59 -0
- package/dist/backend/backend/src/controllers/slack/slack-thread.controller.js.map +1 -0
- package/dist/backend/backend/src/controllers/slack/slack-thread.routes.d.ts +15 -0
- package/dist/backend/backend/src/controllers/slack/slack-thread.routes.d.ts.map +1 -0
- package/dist/backend/backend/src/controllers/slack/slack-thread.routes.js +21 -0
- package/dist/backend/backend/src/controllers/slack/slack-thread.routes.js.map +1 -0
- package/dist/backend/backend/src/controllers/slack/slack.controller.d.ts +11 -0
- package/dist/backend/backend/src/controllers/slack/slack.controller.d.ts.map +1 -0
- package/dist/backend/backend/src/controllers/slack/slack.controller.js +416 -0
- package/dist/backend/backend/src/controllers/slack/slack.controller.js.map +1 -0
- package/dist/backend/backend/src/controllers/system/config.controller.d.ts +4 -0
- package/dist/backend/backend/src/controllers/system/config.controller.d.ts.map +1 -0
- package/dist/backend/backend/src/controllers/system/config.controller.js +48 -0
- package/dist/backend/backend/src/controllers/system/config.controller.js.map +1 -0
- package/dist/backend/backend/src/controllers/system/errors.controller.d.ts +8 -0
- package/dist/backend/backend/src/controllers/system/errors.controller.d.ts.map +1 -0
- package/dist/backend/backend/src/controllers/system/errors.controller.js +99 -0
- package/dist/backend/backend/src/controllers/system/errors.controller.js.map +1 -0
- package/dist/backend/backend/src/controllers/system/scheduler.controller.d.ts +13 -0
- package/dist/backend/backend/src/controllers/system/scheduler.controller.d.ts.map +1 -0
- package/dist/backend/backend/src/controllers/system/scheduler.controller.js +63 -0
- package/dist/backend/backend/src/controllers/system/scheduler.controller.js.map +1 -0
- package/dist/backend/backend/src/controllers/system/system.controller.d.ts +67 -0
- package/dist/backend/backend/src/controllers/system/system.controller.d.ts.map +1 -0
- package/dist/backend/backend/src/controllers/system/system.controller.js +390 -0
- package/dist/backend/backend/src/controllers/system/system.controller.js.map +1 -0
- package/dist/backend/backend/src/controllers/system/system.routes.d.ts +9 -0
- package/dist/backend/backend/src/controllers/system/system.routes.d.ts.map +1 -0
- package/dist/backend/backend/src/controllers/system/system.routes.js +16 -0
- package/dist/backend/backend/src/controllers/system/system.routes.js.map +1 -0
- package/dist/backend/backend/src/controllers/task-management/assignments.controller.d.ts +5 -0
- package/dist/backend/backend/src/controllers/task-management/assignments.controller.d.ts.map +1 -0
- package/dist/backend/backend/src/controllers/task-management/assignments.controller.js +56 -0
- package/dist/backend/backend/src/controllers/task-management/assignments.controller.js.map +1 -0
- package/dist/backend/backend/src/controllers/task-management/in-progress-tasks.controller.d.ts +10 -0
- package/dist/backend/backend/src/controllers/task-management/in-progress-tasks.controller.d.ts.map +1 -0
- package/dist/backend/backend/src/controllers/task-management/in-progress-tasks.controller.js +43 -0
- package/dist/backend/backend/src/controllers/task-management/in-progress-tasks.controller.js.map +1 -0
- package/dist/backend/backend/src/controllers/task-management/task-management.controller.d.ts +95 -0
- package/dist/backend/backend/src/controllers/task-management/task-management.controller.d.ts.map +1 -0
- package/dist/backend/backend/src/controllers/task-management/task-management.controller.js +1034 -0
- package/dist/backend/backend/src/controllers/task-management/task-management.controller.js.map +1 -0
- package/dist/backend/backend/src/controllers/task-management/tasks.controller.d.ts +8 -0
- package/dist/backend/backend/src/controllers/task-management/tasks.controller.d.ts.map +1 -0
- package/dist/backend/backend/src/controllers/task-management/tasks.controller.js +117 -0
- package/dist/backend/backend/src/controllers/task-management/tasks.controller.js.map +1 -0
- package/dist/backend/backend/src/controllers/task-management/tickets.controller.d.ts +13 -0
- package/dist/backend/backend/src/controllers/task-management/tickets.controller.d.ts.map +1 -0
- package/dist/backend/backend/src/controllers/task-management/tickets.controller.js +212 -0
- package/dist/backend/backend/src/controllers/task-management/tickets.controller.js.map +1 -0
- package/dist/backend/backend/src/controllers/team/team.controller.d.ts +35 -0
- package/dist/backend/backend/src/controllers/team/team.controller.d.ts.map +1 -0
- package/dist/backend/backend/src/controllers/team/team.controller.js +1629 -0
- package/dist/backend/backend/src/controllers/team/team.controller.js.map +1 -0
- package/dist/backend/backend/src/controllers/team/team.routes.d.ts +9 -0
- package/dist/backend/backend/src/controllers/team/team.routes.d.ts.map +1 -0
- package/dist/backend/backend/src/controllers/team/team.routes.js +41 -0
- package/dist/backend/backend/src/controllers/team/team.routes.js.map +1 -0
- package/dist/backend/backend/src/controllers/teams-backup/teams-backup.controller.d.ts +32 -0
- package/dist/backend/backend/src/controllers/teams-backup/teams-backup.controller.d.ts.map +1 -0
- package/dist/backend/backend/src/controllers/teams-backup/teams-backup.controller.js +99 -0
- package/dist/backend/backend/src/controllers/teams-backup/teams-backup.controller.js.map +1 -0
- package/dist/backend/backend/src/controllers/teams-backup/teams-backup.routes.d.ts +15 -0
- package/dist/backend/backend/src/controllers/teams-backup/teams-backup.routes.d.ts.map +1 -0
- package/dist/backend/backend/src/controllers/teams-backup/teams-backup.routes.js +23 -0
- package/dist/backend/backend/src/controllers/teams-backup/teams-backup.routes.js.map +1 -0
- package/dist/backend/backend/src/controllers/types.d.ts +18 -0
- package/dist/backend/backend/src/controllers/types.d.ts.map +1 -0
- package/dist/backend/backend/src/controllers/types.js +2 -0
- package/dist/backend/backend/src/controllers/types.js.map +1 -0
- package/dist/backend/backend/src/controllers/utils/file-utils.d.ts +3 -0
- package/dist/backend/backend/src/controllers/utils/file-utils.d.ts.map +1 -0
- package/dist/backend/backend/src/controllers/utils/file-utils.js +98 -0
- package/dist/backend/backend/src/controllers/utils/file-utils.js.map +1 -0
- package/dist/backend/backend/src/index.d.ts +60 -0
- package/dist/backend/backend/src/index.d.ts.map +1 -0
- package/dist/backend/backend/src/index.js +872 -0
- package/dist/backend/backend/src/index.js.map +1 -0
- package/dist/backend/backend/src/middleware/agent-heartbeat.middleware.d.ts +22 -0
- package/dist/backend/backend/src/middleware/agent-heartbeat.middleware.d.ts.map +1 -0
- package/dist/backend/backend/src/middleware/agent-heartbeat.middleware.js +36 -0
- package/dist/backend/backend/src/middleware/agent-heartbeat.middleware.js.map +1 -0
- package/dist/backend/backend/src/models/Project.d.ts +18 -0
- package/dist/backend/backend/src/models/Project.d.ts.map +1 -0
- package/dist/backend/backend/src/models/Project.js +70 -0
- package/dist/backend/backend/src/models/Project.js.map +1 -0
- package/dist/backend/backend/src/models/ScheduledMessage.d.ts +27 -0
- package/dist/backend/backend/src/models/ScheduledMessage.d.ts.map +1 -0
- package/dist/backend/backend/src/models/ScheduledMessage.js +50 -0
- package/dist/backend/backend/src/models/ScheduledMessage.js.map +1 -0
- package/dist/backend/backend/src/models/Team.d.ts +20 -0
- package/dist/backend/backend/src/models/Team.d.ts.map +1 -0
- package/dist/backend/backend/src/models/Team.js +120 -0
- package/dist/backend/backend/src/models/Team.js.map +1 -0
- package/dist/backend/backend/src/models/Ticket.d.ts +24 -0
- package/dist/backend/backend/src/models/Ticket.d.ts.map +1 -0
- package/dist/backend/backend/src/models/Ticket.js +102 -0
- package/dist/backend/backend/src/models/Ticket.js.map +1 -0
- package/dist/backend/backend/src/models/index.d.ts +5 -0
- package/dist/backend/backend/src/models/index.d.ts.map +1 -0
- package/dist/backend/backend/src/models/index.js +5 -0
- package/dist/backend/backend/src/models/index.js.map +1 -0
- package/dist/backend/backend/src/routes/api.routes.d.ts +9 -0
- package/dist/backend/backend/src/routes/api.routes.d.ts.map +1 -0
- package/dist/backend/backend/src/routes/api.routes.js +81 -0
- package/dist/backend/backend/src/routes/api.routes.js.map +1 -0
- package/dist/backend/backend/src/routes/factory.routes.d.ts +19 -0
- package/dist/backend/backend/src/routes/factory.routes.d.ts.map +1 -0
- package/dist/backend/backend/src/routes/factory.routes.js +103 -0
- package/dist/backend/backend/src/routes/factory.routes.js.map +1 -0
- package/dist/backend/backend/src/routes/modules/assignments.routes.d.ts +4 -0
- package/dist/backend/backend/src/routes/modules/assignments.routes.d.ts.map +1 -0
- package/dist/backend/backend/src/routes/modules/assignments.routes.js +7 -0
- package/dist/backend/backend/src/routes/modules/assignments.routes.js.map +1 -0
- package/dist/backend/backend/src/routes/modules/config.routes.d.ts +4 -0
- package/dist/backend/backend/src/routes/modules/config.routes.d.ts.map +1 -0
- package/dist/backend/backend/src/routes/modules/config.routes.js +6 -0
- package/dist/backend/backend/src/routes/modules/config.routes.js.map +1 -0
- package/dist/backend/backend/src/routes/modules/delivery-logs.routes.d.ts +4 -0
- package/dist/backend/backend/src/routes/modules/delivery-logs.routes.d.ts.map +1 -0
- package/dist/backend/backend/src/routes/modules/delivery-logs.routes.js +7 -0
- package/dist/backend/backend/src/routes/modules/delivery-logs.routes.js.map +1 -0
- package/dist/backend/backend/src/routes/modules/errors.routes.d.ts +4 -0
- package/dist/backend/backend/src/routes/modules/errors.routes.d.ts.map +1 -0
- package/dist/backend/backend/src/routes/modules/errors.routes.js +10 -0
- package/dist/backend/backend/src/routes/modules/errors.routes.js.map +1 -0
- package/dist/backend/backend/src/routes/modules/quality-gate.routes.d.ts +20 -0
- package/dist/backend/backend/src/routes/modules/quality-gate.routes.d.ts.map +1 -0
- package/dist/backend/backend/src/routes/modules/quality-gate.routes.js +25 -0
- package/dist/backend/backend/src/routes/modules/quality-gate.routes.js.map +1 -0
- package/dist/backend/backend/src/routes/modules/scheduled-messages.routes.d.ts +4 -0
- package/dist/backend/backend/src/routes/modules/scheduled-messages.routes.d.ts.map +1 -0
- package/dist/backend/backend/src/routes/modules/scheduled-messages.routes.js +12 -0
- package/dist/backend/backend/src/routes/modules/scheduled-messages.routes.js.map +1 -0
- package/dist/backend/backend/src/routes/modules/scheduler.routes.d.ts +4 -0
- package/dist/backend/backend/src/routes/modules/scheduler.routes.d.ts.map +1 -0
- package/dist/backend/backend/src/routes/modules/scheduler.routes.js +9 -0
- package/dist/backend/backend/src/routes/modules/scheduler.routes.js.map +1 -0
- package/dist/backend/backend/src/routes/modules/system.routes.d.ts +4 -0
- package/dist/backend/backend/src/routes/modules/system.routes.d.ts.map +1 -0
- package/dist/backend/backend/src/routes/modules/system.routes.js +24 -0
- package/dist/backend/backend/src/routes/modules/system.routes.js.map +1 -0
- package/dist/backend/backend/src/routes/modules/task-management.routes.d.ts +4 -0
- package/dist/backend/backend/src/routes/modules/task-management.routes.d.ts.map +1 -0
- package/dist/backend/backend/src/routes/modules/task-management.routes.js +25 -0
- package/dist/backend/backend/src/routes/modules/task-management.routes.js.map +1 -0
- package/dist/backend/backend/src/routes/modules/terminal.routes.d.ts +29 -0
- package/dist/backend/backend/src/routes/modules/terminal.routes.d.ts.map +1 -0
- package/dist/backend/backend/src/routes/modules/terminal.routes.js +49 -0
- package/dist/backend/backend/src/routes/modules/terminal.routes.js.map +1 -0
- package/dist/backend/backend/src/services/agent/agent-heartbeat.service.d.ts +240 -0
- package/dist/backend/backend/src/services/agent/agent-heartbeat.service.d.ts.map +1 -0
- package/dist/backend/backend/src/services/agent/agent-heartbeat.service.js +524 -0
- package/dist/backend/backend/src/services/agent/agent-heartbeat.service.js.map +1 -0
- package/dist/backend/backend/src/services/agent/agent-registration.service.d.ts +398 -0
- package/dist/backend/backend/src/services/agent/agent-registration.service.d.ts.map +1 -0
- package/dist/backend/backend/src/services/agent/agent-registration.service.js +2863 -0
- package/dist/backend/backend/src/services/agent/agent-registration.service.js.map +1 -0
- package/dist/backend/backend/src/services/agent/agent-suspend.service.d.ts +118 -0
- package/dist/backend/backend/src/services/agent/agent-suspend.service.d.ts.map +1 -0
- package/dist/backend/backend/src/services/agent/agent-suspend.service.js +304 -0
- package/dist/backend/backend/src/services/agent/agent-suspend.service.js.map +1 -0
- package/dist/backend/backend/src/services/agent/claude-runtime.service.d.ts +71 -0
- package/dist/backend/backend/src/services/agent/claude-runtime.service.d.ts.map +1 -0
- package/dist/backend/backend/src/services/agent/claude-runtime.service.js +220 -0
- package/dist/backend/backend/src/services/agent/claude-runtime.service.js.map +1 -0
- package/dist/backend/backend/src/services/agent/codex-runtime.service.d.ts +43 -0
- package/dist/backend/backend/src/services/agent/codex-runtime.service.d.ts.map +1 -0
- package/dist/backend/backend/src/services/agent/codex-runtime.service.js +118 -0
- package/dist/backend/backend/src/services/agent/codex-runtime.service.js.map +1 -0
- package/dist/backend/backend/src/services/agent/disk-cleanup.service.d.ts +79 -0
- package/dist/backend/backend/src/services/agent/disk-cleanup.service.d.ts.map +1 -0
- package/dist/backend/backend/src/services/agent/disk-cleanup.service.js +137 -0
- package/dist/backend/backend/src/services/agent/disk-cleanup.service.js.map +1 -0
- package/dist/backend/backend/src/services/agent/file-watcher.service.d.ts +87 -0
- package/dist/backend/backend/src/services/agent/file-watcher.service.d.ts.map +1 -0
- package/dist/backend/backend/src/services/agent/file-watcher.service.js +312 -0
- package/dist/backend/backend/src/services/agent/file-watcher.service.js.map +1 -0
- package/dist/backend/backend/src/services/agent/gemini-runtime.service.d.ts +83 -0
- package/dist/backend/backend/src/services/agent/gemini-runtime.service.d.ts.map +1 -0
- package/dist/backend/backend/src/services/agent/gemini-runtime.service.js +300 -0
- package/dist/backend/backend/src/services/agent/gemini-runtime.service.js.map +1 -0
- package/dist/backend/backend/src/services/agent/git-integration.service.d.ts +131 -0
- package/dist/backend/backend/src/services/agent/git-integration.service.d.ts.map +1 -0
- package/dist/backend/backend/src/services/agent/git-integration.service.js +368 -0
- package/dist/backend/backend/src/services/agent/git-integration.service.js.map +1 -0
- package/dist/backend/backend/src/services/agent/idle-detection.service.d.ts +54 -0
- package/dist/backend/backend/src/services/agent/idle-detection.service.d.ts.map +1 -0
- package/dist/backend/backend/src/services/agent/idle-detection.service.js +156 -0
- package/dist/backend/backend/src/services/agent/idle-detection.service.js.map +1 -0
- package/dist/backend/backend/src/services/agent/pty-activity-tracker.service.d.ts +77 -0
- package/dist/backend/backend/src/services/agent/pty-activity-tracker.service.d.ts.map +1 -0
- package/dist/backend/backend/src/services/agent/pty-activity-tracker.service.js +104 -0
- package/dist/backend/backend/src/services/agent/pty-activity-tracker.service.js.map +1 -0
- package/dist/backend/backend/src/services/agent/runtime-agent.service.abstract.d.ts +114 -0
- package/dist/backend/backend/src/services/agent/runtime-agent.service.abstract.d.ts.map +1 -0
- package/dist/backend/backend/src/services/agent/runtime-agent.service.abstract.js +437 -0
- package/dist/backend/backend/src/services/agent/runtime-agent.service.abstract.js.map +1 -0
- package/dist/backend/backend/src/services/agent/runtime-exit-monitor.service.d.ts +81 -0
- package/dist/backend/backend/src/services/agent/runtime-exit-monitor.service.d.ts.map +1 -0
- package/dist/backend/backend/src/services/agent/runtime-exit-monitor.service.js +284 -0
- package/dist/backend/backend/src/services/agent/runtime-exit-monitor.service.js.map +1 -0
- package/dist/backend/backend/src/services/agent/runtime-service.factory.d.ts +71 -0
- package/dist/backend/backend/src/services/agent/runtime-service.factory.d.ts.map +1 -0
- package/dist/backend/backend/src/services/agent/runtime-service.factory.js +165 -0
- package/dist/backend/backend/src/services/agent/runtime-service.factory.js.map +1 -0
- package/dist/backend/backend/src/services/agent/tmux-command.service.d.ts +163 -0
- package/dist/backend/backend/src/services/agent/tmux-command.service.d.ts.map +1 -0
- package/dist/backend/backend/src/services/agent/tmux-command.service.js +962 -0
- package/dist/backend/backend/src/services/agent/tmux-command.service.js.map +1 -0
- package/dist/backend/backend/src/services/agent/tmux.service.d.ts +189 -0
- package/dist/backend/backend/src/services/agent/tmux.service.d.ts.map +1 -0
- package/dist/backend/backend/src/services/agent/tmux.service.js +673 -0
- package/dist/backend/backend/src/services/agent/tmux.service.js.map +1 -0
- package/dist/backend/backend/src/services/ai/context-loader.service.d.ts +40 -0
- package/dist/backend/backend/src/services/ai/context-loader.service.d.ts.map +1 -0
- package/dist/backend/backend/src/services/ai/context-loader.service.js +311 -0
- package/dist/backend/backend/src/services/ai/context-loader.service.js.map +1 -0
- package/dist/backend/backend/src/services/ai/prompt-builder.service.d.ts +183 -0
- package/dist/backend/backend/src/services/ai/prompt-builder.service.d.ts.map +1 -0
- package/dist/backend/backend/src/services/ai/prompt-builder.service.js +591 -0
- package/dist/backend/backend/src/services/ai/prompt-builder.service.js.map +1 -0
- package/dist/backend/backend/src/services/ai/prompt-template.service.d.ts +51 -0
- package/dist/backend/backend/src/services/ai/prompt-template.service.d.ts.map +1 -0
- package/dist/backend/backend/src/services/ai/prompt-template.service.js +99 -0
- package/dist/backend/backend/src/services/ai/prompt-template.service.js.map +1 -0
- package/dist/backend/backend/src/services/autonomous/auto-assign.service.d.ts +429 -0
- package/dist/backend/backend/src/services/autonomous/auto-assign.service.d.ts.map +1 -0
- package/dist/backend/backend/src/services/autonomous/auto-assign.service.js +852 -0
- package/dist/backend/backend/src/services/autonomous/auto-assign.service.js.map +1 -0
- package/dist/backend/backend/src/services/autonomous/budget.service.d.ts +319 -0
- package/dist/backend/backend/src/services/autonomous/budget.service.d.ts.map +1 -0
- package/dist/backend/backend/src/services/autonomous/budget.service.js +594 -0
- package/dist/backend/backend/src/services/autonomous/budget.service.js.map +1 -0
- package/dist/backend/backend/src/services/autonomous/index.d.ts +11 -0
- package/dist/backend/backend/src/services/autonomous/index.d.ts.map +1 -0
- package/dist/backend/backend/src/services/autonomous/index.js +11 -0
- package/dist/backend/backend/src/services/autonomous/index.js.map +1 -0
- package/dist/backend/backend/src/services/chat/chat.service.d.ts +358 -0
- package/dist/backend/backend/src/services/chat/chat.service.d.ts.map +1 -0
- package/dist/backend/backend/src/services/chat/chat.service.js +727 -0
- package/dist/backend/backend/src/services/chat/chat.service.js.map +1 -0
- package/dist/backend/backend/src/services/chat/index.d.ts +10 -0
- package/dist/backend/backend/src/services/chat/index.d.ts.map +1 -0
- package/dist/backend/backend/src/services/chat/index.js +10 -0
- package/dist/backend/backend/src/services/chat/index.js.map +1 -0
- package/dist/backend/backend/src/services/continuation/continuation-events.service.d.ts +152 -0
- package/dist/backend/backend/src/services/continuation/continuation-events.service.d.ts.map +1 -0
- package/dist/backend/backend/src/services/continuation/continuation-events.service.js +293 -0
- package/dist/backend/backend/src/services/continuation/continuation-events.service.js.map +1 -0
- package/dist/backend/backend/src/services/continuation/continuation.service.d.ts +278 -0
- package/dist/backend/backend/src/services/continuation/continuation.service.d.ts.map +1 -0
- package/dist/backend/backend/src/services/continuation/continuation.service.js +616 -0
- package/dist/backend/backend/src/services/continuation/continuation.service.js.map +1 -0
- package/dist/backend/backend/src/services/continuation/index.d.ts +14 -0
- package/dist/backend/backend/src/services/continuation/index.d.ts.map +1 -0
- package/dist/backend/backend/src/services/continuation/index.js +15 -0
- package/dist/backend/backend/src/services/continuation/index.js.map +1 -0
- package/dist/backend/backend/src/services/continuation/output-analyzer.service.d.ts +199 -0
- package/dist/backend/backend/src/services/continuation/output-analyzer.service.d.ts.map +1 -0
- package/dist/backend/backend/src/services/continuation/output-analyzer.service.js +390 -0
- package/dist/backend/backend/src/services/continuation/output-analyzer.service.js.map +1 -0
- package/dist/backend/backend/src/services/continuation/patterns/completion-patterns.d.ts +44 -0
- package/dist/backend/backend/src/services/continuation/patterns/completion-patterns.d.ts.map +1 -0
- package/dist/backend/backend/src/services/continuation/patterns/completion-patterns.js +82 -0
- package/dist/backend/backend/src/services/continuation/patterns/completion-patterns.js.map +1 -0
- package/dist/backend/backend/src/services/continuation/patterns/error-patterns.d.ts +37 -0
- package/dist/backend/backend/src/services/continuation/patterns/error-patterns.d.ts.map +1 -0
- package/dist/backend/backend/src/services/continuation/patterns/error-patterns.js +105 -0
- package/dist/backend/backend/src/services/continuation/patterns/error-patterns.js.map +1 -0
- package/dist/backend/backend/src/services/continuation/patterns/idle-patterns.d.ts +29 -0
- package/dist/backend/backend/src/services/continuation/patterns/idle-patterns.d.ts.map +1 -0
- package/dist/backend/backend/src/services/continuation/patterns/idle-patterns.js +49 -0
- package/dist/backend/backend/src/services/continuation/patterns/idle-patterns.js.map +1 -0
- package/dist/backend/backend/src/services/continuation/patterns/index.d.ts +12 -0
- package/dist/backend/backend/src/services/continuation/patterns/index.d.ts.map +1 -0
- package/dist/backend/backend/src/services/continuation/patterns/index.js +12 -0
- package/dist/backend/backend/src/services/continuation/patterns/index.js.map +1 -0
- package/dist/backend/backend/src/services/continuation/patterns/waiting-patterns.d.ts +34 -0
- package/dist/backend/backend/src/services/continuation/patterns/waiting-patterns.d.ts.map +1 -0
- package/dist/backend/backend/src/services/continuation/patterns/waiting-patterns.js +64 -0
- package/dist/backend/backend/src/services/continuation/patterns/waiting-patterns.js.map +1 -0
- package/dist/backend/backend/src/services/continuation/template-loader.service.d.ts +196 -0
- package/dist/backend/backend/src/services/continuation/template-loader.service.d.ts.map +1 -0
- package/dist/backend/backend/src/services/continuation/template-loader.service.js +323 -0
- package/dist/backend/backend/src/services/continuation/template-loader.service.js.map +1 -0
- package/dist/backend/backend/src/services/core/config.service.d.ts +85 -0
- package/dist/backend/backend/src/services/core/config.service.d.ts.map +1 -0
- package/dist/backend/backend/src/services/core/config.service.js +226 -0
- package/dist/backend/backend/src/services/core/config.service.js.map +1 -0
- package/dist/backend/backend/src/services/core/error-tracking.service.d.ts +98 -0
- package/dist/backend/backend/src/services/core/error-tracking.service.d.ts.map +1 -0
- package/dist/backend/backend/src/services/core/error-tracking.service.js +291 -0
- package/dist/backend/backend/src/services/core/error-tracking.service.js.map +1 -0
- package/dist/backend/backend/src/services/core/logger.service.d.ts +70 -0
- package/dist/backend/backend/src/services/core/logger.service.d.ts.map +1 -0
- package/dist/backend/backend/src/services/core/logger.service.js +350 -0
- package/dist/backend/backend/src/services/core/logger.service.js.map +1 -0
- package/dist/backend/backend/src/services/core/storage.service.d.ts +261 -0
- package/dist/backend/backend/src/services/core/storage.service.d.ts.map +1 -0
- package/dist/backend/backend/src/services/core/storage.service.js +1390 -0
- package/dist/backend/backend/src/services/core/storage.service.js.map +1 -0
- package/dist/backend/backend/src/services/core/teams-backup.service.d.ts +92 -0
- package/dist/backend/backend/src/services/core/teams-backup.service.d.ts.map +1 -0
- package/dist/backend/backend/src/services/core/teams-backup.service.js +120 -0
- package/dist/backend/backend/src/services/core/teams-backup.service.js.map +1 -0
- package/dist/backend/backend/src/services/event-bus/event-bus.service.d.ts +144 -0
- package/dist/backend/backend/src/services/event-bus/event-bus.service.d.ts.map +1 -0
- package/dist/backend/backend/src/services/event-bus/event-bus.service.js +337 -0
- package/dist/backend/backend/src/services/event-bus/event-bus.service.js.map +1 -0
- package/dist/backend/backend/src/services/event-bus/index.d.ts +7 -0
- package/dist/backend/backend/src/services/event-bus/index.d.ts.map +1 -0
- package/dist/backend/backend/src/services/event-bus/index.js +7 -0
- package/dist/backend/backend/src/services/event-bus/index.js.map +1 -0
- package/dist/backend/backend/src/services/factory/factory-sse.service.d.ts +163 -0
- package/dist/backend/backend/src/services/factory/factory-sse.service.d.ts.map +1 -0
- package/dist/backend/backend/src/services/factory/factory-sse.service.js +274 -0
- package/dist/backend/backend/src/services/factory/factory-sse.service.js.map +1 -0
- package/dist/backend/backend/src/services/factory.service.d.ts +157 -0
- package/dist/backend/backend/src/services/factory.service.d.ts.map +1 -0
- package/dist/backend/backend/src/services/factory.service.js +545 -0
- package/dist/backend/backend/src/services/factory.service.js.map +1 -0
- package/dist/backend/backend/src/services/index.d.ts +37 -0
- package/dist/backend/backend/src/services/index.d.ts.map +1 -0
- package/dist/backend/backend/src/services/index.js +50 -0
- package/dist/backend/backend/src/services/index.js.map +1 -0
- package/dist/backend/backend/src/services/knowledge/index.d.ts +7 -0
- package/dist/backend/backend/src/services/knowledge/index.d.ts.map +1 -0
- package/dist/backend/backend/src/services/knowledge/index.js +7 -0
- package/dist/backend/backend/src/services/knowledge/index.js.map +1 -0
- package/dist/backend/backend/src/services/knowledge/knowledge-search.service.d.ts +125 -0
- package/dist/backend/backend/src/services/knowledge/knowledge-search.service.d.ts.map +1 -0
- package/dist/backend/backend/src/services/knowledge/knowledge-search.service.js +247 -0
- package/dist/backend/backend/src/services/knowledge/knowledge-search.service.js.map +1 -0
- package/dist/backend/backend/src/services/knowledge/knowledge.service.d.ts +153 -0
- package/dist/backend/backend/src/services/knowledge/knowledge.service.d.ts.map +1 -0
- package/dist/backend/backend/src/services/knowledge/knowledge.service.js +409 -0
- package/dist/backend/backend/src/services/knowledge/knowledge.service.js.map +1 -0
- package/dist/backend/backend/src/services/marketplace/index.d.ts +11 -0
- package/dist/backend/backend/src/services/marketplace/index.d.ts.map +1 -0
- package/dist/backend/backend/src/services/marketplace/index.js +13 -0
- package/dist/backend/backend/src/services/marketplace/index.js.map +1 -0
- package/dist/backend/backend/src/services/marketplace/marketplace-installer.service.d.ts +47 -0
- package/dist/backend/backend/src/services/marketplace/marketplace-installer.service.d.ts.map +1 -0
- package/dist/backend/backend/src/services/marketplace/marketplace-installer.service.js +127 -0
- package/dist/backend/backend/src/services/marketplace/marketplace-installer.service.js.map +1 -0
- package/dist/backend/backend/src/services/marketplace/marketplace.service.d.ts +101 -0
- package/dist/backend/backend/src/services/marketplace/marketplace.service.d.ts.map +1 -0
- package/dist/backend/backend/src/services/marketplace/marketplace.service.js +207 -0
- package/dist/backend/backend/src/services/marketplace/marketplace.service.js.map +1 -0
- package/dist/backend/backend/src/services/memory/agent-memory.service.d.ts +259 -0
- package/dist/backend/backend/src/services/memory/agent-memory.service.d.ts.map +1 -0
- package/dist/backend/backend/src/services/memory/agent-memory.service.js +539 -0
- package/dist/backend/backend/src/services/memory/agent-memory.service.js.map +1 -0
- package/dist/backend/backend/src/services/memory/daily-log.service.d.ts +159 -0
- package/dist/backend/backend/src/services/memory/daily-log.service.d.ts.map +1 -0
- package/dist/backend/backend/src/services/memory/daily-log.service.js +272 -0
- package/dist/backend/backend/src/services/memory/daily-log.service.js.map +1 -0
- package/dist/backend/backend/src/services/memory/goal-tracking.service.d.ts +239 -0
- package/dist/backend/backend/src/services/memory/goal-tracking.service.d.ts.map +1 -0
- package/dist/backend/backend/src/services/memory/goal-tracking.service.js +353 -0
- package/dist/backend/backend/src/services/memory/goal-tracking.service.js.map +1 -0
- package/dist/backend/backend/src/services/memory/index.d.ts +16 -0
- package/dist/backend/backend/src/services/memory/index.d.ts.map +1 -0
- package/dist/backend/backend/src/services/memory/index.js +15 -0
- package/dist/backend/backend/src/services/memory/index.js.map +1 -0
- package/dist/backend/backend/src/services/memory/learning-accumulation.service.d.ts +228 -0
- package/dist/backend/backend/src/services/memory/learning-accumulation.service.d.ts.map +1 -0
- package/dist/backend/backend/src/services/memory/learning-accumulation.service.js +336 -0
- package/dist/backend/backend/src/services/memory/learning-accumulation.service.js.map +1 -0
- package/dist/backend/backend/src/services/memory/memory.service.d.ts +306 -0
- package/dist/backend/backend/src/services/memory/memory.service.d.ts.map +1 -0
- package/dist/backend/backend/src/services/memory/memory.service.js +517 -0
- package/dist/backend/backend/src/services/memory/memory.service.js.map +1 -0
- package/dist/backend/backend/src/services/memory/project-memory.service.d.ts +252 -0
- package/dist/backend/backend/src/services/memory/project-memory.service.d.ts.map +1 -0
- package/dist/backend/backend/src/services/memory/project-memory.service.js +600 -0
- package/dist/backend/backend/src/services/memory/project-memory.service.js.map +1 -0
- package/dist/backend/backend/src/services/memory/session-memory.service.d.ts +197 -0
- package/dist/backend/backend/src/services/memory/session-memory.service.d.ts.map +1 -0
- package/dist/backend/backend/src/services/memory/session-memory.service.js +369 -0
- package/dist/backend/backend/src/services/memory/session-memory.service.js.map +1 -0
- package/dist/backend/backend/src/services/messaging/index.d.ts +9 -0
- package/dist/backend/backend/src/services/messaging/index.d.ts.map +1 -0
- package/dist/backend/backend/src/services/messaging/index.js +9 -0
- package/dist/backend/backend/src/services/messaging/index.js.map +1 -0
- package/dist/backend/backend/src/services/messaging/message-queue.service.d.ts +198 -0
- package/dist/backend/backend/src/services/messaging/message-queue.service.d.ts.map +1 -0
- package/dist/backend/backend/src/services/messaging/message-queue.service.js +445 -0
- package/dist/backend/backend/src/services/messaging/message-queue.service.js.map +1 -0
- package/dist/backend/backend/src/services/messaging/queue-processor.service.d.ts +90 -0
- package/dist/backend/backend/src/services/messaging/queue-processor.service.d.ts.map +1 -0
- package/dist/backend/backend/src/services/messaging/queue-processor.service.js +324 -0
- package/dist/backend/backend/src/services/messaging/queue-processor.service.js.map +1 -0
- package/dist/backend/backend/src/services/messaging/response-router.service.d.ts +56 -0
- package/dist/backend/backend/src/services/messaging/response-router.service.d.ts.map +1 -0
- package/dist/backend/backend/src/services/messaging/response-router.service.js +134 -0
- package/dist/backend/backend/src/services/messaging/response-router.service.js.map +1 -0
- package/dist/backend/backend/src/services/messaging/sub-agent-message-queue.service.d.ts +84 -0
- package/dist/backend/backend/src/services/messaging/sub-agent-message-queue.service.d.ts.map +1 -0
- package/dist/backend/backend/src/services/messaging/sub-agent-message-queue.service.js +136 -0
- package/dist/backend/backend/src/services/messaging/sub-agent-message-queue.service.js.map +1 -0
- package/dist/backend/backend/src/services/monitoring/activity-monitor.service.d.ts +113 -0
- package/dist/backend/backend/src/services/monitoring/activity-monitor.service.d.ts.map +1 -0
- package/dist/backend/backend/src/services/monitoring/activity-monitor.service.js +473 -0
- package/dist/backend/backend/src/services/monitoring/activity-monitor.service.js.map +1 -0
- package/dist/backend/backend/src/services/monitoring/monitoring.service.d.ts +129 -0
- package/dist/backend/backend/src/services/monitoring/monitoring.service.d.ts.map +1 -0
- package/dist/backend/backend/src/services/monitoring/monitoring.service.js +469 -0
- package/dist/backend/backend/src/services/monitoring/monitoring.service.js.map +1 -0
- package/dist/backend/backend/src/services/monitoring/system-resource-alert.service.d.ts +48 -0
- package/dist/backend/backend/src/services/monitoring/system-resource-alert.service.d.ts.map +1 -0
- package/dist/backend/backend/src/services/monitoring/system-resource-alert.service.js +151 -0
- package/dist/backend/backend/src/services/monitoring/system-resource-alert.service.js.map +1 -0
- package/dist/backend/backend/src/services/monitoring/task-assignment-monitor.service.d.ts +71 -0
- package/dist/backend/backend/src/services/monitoring/task-assignment-monitor.service.d.ts.map +1 -0
- package/dist/backend/backend/src/services/monitoring/task-assignment-monitor.service.js +304 -0
- package/dist/backend/backend/src/services/monitoring/task-assignment-monitor.service.js.map +1 -0
- package/dist/backend/backend/src/services/monitoring/team-activity-websocket.service.d.ts +100 -0
- package/dist/backend/backend/src/services/monitoring/team-activity-websocket.service.d.ts.map +1 -0
- package/dist/backend/backend/src/services/monitoring/team-activity-websocket.service.js +285 -0
- package/dist/backend/backend/src/services/monitoring/team-activity-websocket.service.js.map +1 -0
- package/dist/backend/backend/src/services/monitoring/teams-json-watcher.service.d.ts +107 -0
- package/dist/backend/backend/src/services/monitoring/teams-json-watcher.service.d.ts.map +1 -0
- package/dist/backend/backend/src/services/monitoring/teams-json-watcher.service.js +568 -0
- package/dist/backend/backend/src/services/monitoring/teams-json-watcher.service.js.map +1 -0
- package/dist/backend/backend/src/services/orchestrator/improvement-marker.service.d.ts +231 -0
- package/dist/backend/backend/src/services/orchestrator/improvement-marker.service.d.ts.map +1 -0
- package/dist/backend/backend/src/services/orchestrator/improvement-marker.service.js +344 -0
- package/dist/backend/backend/src/services/orchestrator/improvement-marker.service.js.map +1 -0
- package/dist/backend/backend/src/services/orchestrator/improvement-startup.service.d.ts +156 -0
- package/dist/backend/backend/src/services/orchestrator/improvement-startup.service.d.ts.map +1 -0
- package/dist/backend/backend/src/services/orchestrator/improvement-startup.service.js +481 -0
- package/dist/backend/backend/src/services/orchestrator/improvement-startup.service.js.map +1 -0
- package/dist/backend/backend/src/services/orchestrator/index.d.ts +15 -0
- package/dist/backend/backend/src/services/orchestrator/index.d.ts.map +1 -0
- package/dist/backend/backend/src/services/orchestrator/index.js +15 -0
- package/dist/backend/backend/src/services/orchestrator/index.js.map +1 -0
- package/dist/backend/backend/src/services/orchestrator/orchestrator-restart.service.d.ts +112 -0
- package/dist/backend/backend/src/services/orchestrator/orchestrator-restart.service.d.ts.map +1 -0
- package/dist/backend/backend/src/services/orchestrator/orchestrator-restart.service.js +244 -0
- package/dist/backend/backend/src/services/orchestrator/orchestrator-restart.service.js.map +1 -0
- package/dist/backend/backend/src/services/orchestrator/orchestrator-status.service.d.ts +61 -0
- package/dist/backend/backend/src/services/orchestrator/orchestrator-status.service.d.ts.map +1 -0
- package/dist/backend/backend/src/services/orchestrator/orchestrator-status.service.js +156 -0
- package/dist/backend/backend/src/services/orchestrator/orchestrator-status.service.js.map +1 -0
- package/dist/backend/backend/src/services/orchestrator/safe-restart.service.d.ts +191 -0
- package/dist/backend/backend/src/services/orchestrator/safe-restart.service.d.ts.map +1 -0
- package/dist/backend/backend/src/services/orchestrator/safe-restart.service.js +393 -0
- package/dist/backend/backend/src/services/orchestrator/safe-restart.service.js.map +1 -0
- package/dist/backend/backend/src/services/orchestrator/self-improvement.service.d.ts +200 -0
- package/dist/backend/backend/src/services/orchestrator/self-improvement.service.d.ts.map +1 -0
- package/dist/backend/backend/src/services/orchestrator/self-improvement.service.js +394 -0
- package/dist/backend/backend/src/services/orchestrator/self-improvement.service.js.map +1 -0
- package/dist/backend/backend/src/services/orchestrator/state-persistence.service.d.ts +226 -0
- package/dist/backend/backend/src/services/orchestrator/state-persistence.service.d.ts.map +1 -0
- package/dist/backend/backend/src/services/orchestrator/state-persistence.service.js +504 -0
- package/dist/backend/backend/src/services/orchestrator/state-persistence.service.js.map +1 -0
- package/dist/backend/backend/src/services/project/active-projects.service.d.ts +39 -0
- package/dist/backend/backend/src/services/project/active-projects.service.d.ts.map +1 -0
- package/dist/backend/backend/src/services/project/active-projects.service.js +295 -0
- package/dist/backend/backend/src/services/project/active-projects.service.js.map +1 -0
- package/dist/backend/backend/src/services/project/task-folder.service.d.ts +48 -0
- package/dist/backend/backend/src/services/project/task-folder.service.d.ts.map +1 -0
- package/dist/backend/backend/src/services/project/task-folder.service.js +193 -0
- package/dist/backend/backend/src/services/project/task-folder.service.js.map +1 -0
- package/dist/backend/backend/src/services/project/task-tracking.service.d.ts +47 -0
- package/dist/backend/backend/src/services/project/task-tracking.service.d.ts.map +1 -0
- package/dist/backend/backend/src/services/project/task-tracking.service.js +330 -0
- package/dist/backend/backend/src/services/project/task-tracking.service.js.map +1 -0
- package/dist/backend/backend/src/services/project/task.service.d.ts +31 -0
- package/dist/backend/backend/src/services/project/task.service.d.ts.map +1 -0
- package/dist/backend/backend/src/services/project/task.service.js +193 -0
- package/dist/backend/backend/src/services/project/task.service.js.map +1 -0
- package/dist/backend/backend/src/services/project/ticket-editor.service.d.ts +129 -0
- package/dist/backend/backend/src/services/project/ticket-editor.service.d.ts.map +1 -0
- package/dist/backend/backend/src/services/project/ticket-editor.service.js +405 -0
- package/dist/backend/backend/src/services/project/ticket-editor.service.js.map +1 -0
- package/dist/backend/backend/src/services/prompt/index.d.ts +7 -0
- package/dist/backend/backend/src/services/prompt/index.d.ts.map +1 -0
- package/dist/backend/backend/src/services/prompt/index.js +7 -0
- package/dist/backend/backend/src/services/prompt/index.js.map +1 -0
- package/dist/backend/backend/src/services/prompt/prompt-generator.service.d.ts +106 -0
- package/dist/backend/backend/src/services/prompt/prompt-generator.service.d.ts.map +1 -0
- package/dist/backend/backend/src/services/prompt/prompt-generator.service.js +287 -0
- package/dist/backend/backend/src/services/prompt/prompt-generator.service.js.map +1 -0
- package/dist/backend/backend/src/services/quality/index.d.ts +10 -0
- package/dist/backend/backend/src/services/quality/index.d.ts.map +1 -0
- package/dist/backend/backend/src/services/quality/index.js +10 -0
- package/dist/backend/backend/src/services/quality/index.js.map +1 -0
- package/dist/backend/backend/src/services/quality/quality-gate.service.d.ts +223 -0
- package/dist/backend/backend/src/services/quality/quality-gate.service.d.ts.map +1 -0
- package/dist/backend/backend/src/services/quality/quality-gate.service.js +388 -0
- package/dist/backend/backend/src/services/quality/quality-gate.service.js.map +1 -0
- package/dist/backend/backend/src/services/session/index.d.ts +43 -0
- package/dist/backend/backend/src/services/session/index.d.ts.map +1 -0
- package/dist/backend/backend/src/services/session/index.js +46 -0
- package/dist/backend/backend/src/services/session/index.js.map +1 -0
- package/dist/backend/backend/src/services/session/pty/index.d.ts +11 -0
- package/dist/backend/backend/src/services/session/pty/index.d.ts.map +1 -0
- package/dist/backend/backend/src/services/session/pty/index.js +11 -0
- package/dist/backend/backend/src/services/session/pty/index.js.map +1 -0
- package/dist/backend/backend/src/services/session/pty/pty-session-backend.d.ts +258 -0
- package/dist/backend/backend/src/services/session/pty/pty-session-backend.d.ts.map +1 -0
- package/dist/backend/backend/src/services/session/pty/pty-session-backend.js +435 -0
- package/dist/backend/backend/src/services/session/pty/pty-session-backend.js.map +1 -0
- package/dist/backend/backend/src/services/session/pty/pty-session.d.ts +196 -0
- package/dist/backend/backend/src/services/session/pty/pty-session.d.ts.map +1 -0
- package/dist/backend/backend/src/services/session/pty/pty-session.js +393 -0
- package/dist/backend/backend/src/services/session/pty/pty-session.js.map +1 -0
- package/dist/backend/backend/src/services/session/pty/pty-terminal-buffer.d.ts +241 -0
- package/dist/backend/backend/src/services/session/pty/pty-terminal-buffer.d.ts.map +1 -0
- package/dist/backend/backend/src/services/session/pty/pty-terminal-buffer.js +351 -0
- package/dist/backend/backend/src/services/session/pty/pty-terminal-buffer.js.map +1 -0
- package/dist/backend/backend/src/services/session/session-backend.factory.d.ts +127 -0
- package/dist/backend/backend/src/services/session/session-backend.factory.d.ts.map +1 -0
- package/dist/backend/backend/src/services/session/session-backend.factory.js +226 -0
- package/dist/backend/backend/src/services/session/session-backend.factory.js.map +1 -0
- package/dist/backend/backend/src/services/session/session-backend.interface.d.ts +358 -0
- package/dist/backend/backend/src/services/session/session-backend.interface.d.ts.map +1 -0
- package/dist/backend/backend/src/services/session/session-backend.interface.js +19 -0
- package/dist/backend/backend/src/services/session/session-backend.interface.js.map +1 -0
- package/dist/backend/backend/src/services/session/session-command-helper.d.ts +327 -0
- package/dist/backend/backend/src/services/session/session-command-helper.d.ts.map +1 -0
- package/dist/backend/backend/src/services/session/session-command-helper.js +687 -0
- package/dist/backend/backend/src/services/session/session-command-helper.js.map +1 -0
- package/dist/backend/backend/src/services/session/session-state-persistence.d.ts +228 -0
- package/dist/backend/backend/src/services/session/session-state-persistence.d.ts.map +1 -0
- package/dist/backend/backend/src/services/session/session-state-persistence.js +394 -0
- package/dist/backend/backend/src/services/session/session-state-persistence.js.map +1 -0
- package/dist/backend/backend/src/services/settings/index.d.ts +10 -0
- package/dist/backend/backend/src/services/settings/index.d.ts.map +1 -0
- package/dist/backend/backend/src/services/settings/index.js +12 -0
- package/dist/backend/backend/src/services/settings/index.js.map +1 -0
- package/dist/backend/backend/src/services/settings/role.service.d.ts +276 -0
- package/dist/backend/backend/src/services/settings/role.service.d.ts.map +1 -0
- package/dist/backend/backend/src/services/settings/role.service.js +726 -0
- package/dist/backend/backend/src/services/settings/role.service.js.map +1 -0
- package/dist/backend/backend/src/services/settings/settings.service.d.ts +160 -0
- package/dist/backend/backend/src/services/settings/settings.service.d.ts.map +1 -0
- package/dist/backend/backend/src/services/settings/settings.service.js +294 -0
- package/dist/backend/backend/src/services/settings/settings.service.js.map +1 -0
- package/dist/backend/backend/src/services/skill/index.d.ts +10 -0
- package/dist/backend/backend/src/services/skill/index.d.ts.map +1 -0
- package/dist/backend/backend/src/services/skill/index.js +10 -0
- package/dist/backend/backend/src/services/skill/index.js.map +1 -0
- package/dist/backend/backend/src/services/skill/skill-catalog.service.d.ts +236 -0
- package/dist/backend/backend/src/services/skill/skill-catalog.service.d.ts.map +1 -0
- package/dist/backend/backend/src/services/skill/skill-catalog.service.js +550 -0
- package/dist/backend/backend/src/services/skill/skill-catalog.service.js.map +1 -0
- package/dist/backend/backend/src/services/skill/skill-executor.service.d.ts +135 -0
- package/dist/backend/backend/src/services/skill/skill-executor.service.d.ts.map +1 -0
- package/dist/backend/backend/src/services/skill/skill-executor.service.js +493 -0
- package/dist/backend/backend/src/services/skill/skill-executor.service.js.map +1 -0
- package/dist/backend/backend/src/services/skill/skill.service.d.ts +241 -0
- package/dist/backend/backend/src/services/skill/skill.service.d.ts.map +1 -0
- package/dist/backend/backend/src/services/skill/skill.service.js +542 -0
- package/dist/backend/backend/src/services/skill/skill.service.js.map +1 -0
- package/dist/backend/backend/src/services/slack/index.d.ts +13 -0
- package/dist/backend/backend/src/services/slack/index.d.ts.map +1 -0
- package/dist/backend/backend/src/services/slack/index.js +13 -0
- package/dist/backend/backend/src/services/slack/index.js.map +1 -0
- package/dist/backend/backend/src/services/slack/notify-reconciliation.service.d.ts +63 -0
- package/dist/backend/backend/src/services/slack/notify-reconciliation.service.d.ts.map +1 -0
- package/dist/backend/backend/src/services/slack/notify-reconciliation.service.js +182 -0
- package/dist/backend/backend/src/services/slack/notify-reconciliation.service.js.map +1 -0
- package/dist/backend/backend/src/services/slack/slack-image.service.d.ts +113 -0
- package/dist/backend/backend/src/services/slack/slack-image.service.d.ts.map +1 -0
- package/dist/backend/backend/src/services/slack/slack-image.service.js +329 -0
- package/dist/backend/backend/src/services/slack/slack-image.service.js.map +1 -0
- package/dist/backend/backend/src/services/slack/slack-initializer.d.ts +71 -0
- package/dist/backend/backend/src/services/slack/slack-initializer.d.ts.map +1 -0
- package/dist/backend/backend/src/services/slack/slack-initializer.js +106 -0
- package/dist/backend/backend/src/services/slack/slack-initializer.js.map +1 -0
- package/dist/backend/backend/src/services/slack/slack-orchestrator-bridge.d.ts +302 -0
- package/dist/backend/backend/src/services/slack/slack-orchestrator-bridge.d.ts.map +1 -0
- package/dist/backend/backend/src/services/slack/slack-orchestrator-bridge.js +806 -0
- package/dist/backend/backend/src/services/slack/slack-orchestrator-bridge.js.map +1 -0
- package/dist/backend/backend/src/services/slack/slack-thread-store.service.d.ts +147 -0
- package/dist/backend/backend/src/services/slack/slack-thread-store.service.d.ts.map +1 -0
- package/dist/backend/backend/src/services/slack/slack-thread-store.service.js +258 -0
- package/dist/backend/backend/src/services/slack/slack-thread-store.service.js.map +1 -0
- package/dist/backend/backend/src/services/slack/slack.service.d.ts +219 -0
- package/dist/backend/backend/src/services/slack/slack.service.d.ts.map +1 -0
- package/dist/backend/backend/src/services/slack/slack.service.js +551 -0
- package/dist/backend/backend/src/services/slack/slack.service.js.map +1 -0
- package/dist/backend/backend/src/services/sop/index.d.ts +9 -0
- package/dist/backend/backend/src/services/sop/index.d.ts.map +1 -0
- package/dist/backend/backend/src/services/sop/index.js +9 -0
- package/dist/backend/backend/src/services/sop/index.js.map +1 -0
- package/dist/backend/backend/src/services/sop/sop.service.d.ts +286 -0
- package/dist/backend/backend/src/services/sop/sop.service.d.ts.map +1 -0
- package/dist/backend/backend/src/services/sop/sop.service.js +583 -0
- package/dist/backend/backend/src/services/sop/sop.service.js.map +1 -0
- package/dist/backend/backend/src/services/system/version-check.service.d.ts +112 -0
- package/dist/backend/backend/src/services/system/version-check.service.d.ts.map +1 -0
- package/dist/backend/backend/src/services/system/version-check.service.js +195 -0
- package/dist/backend/backend/src/services/system/version-check.service.js.map +1 -0
- package/dist/backend/backend/src/services/workflow/message-scheduler.service.d.ts +99 -0
- package/dist/backend/backend/src/services/workflow/message-scheduler.service.d.ts.map +1 -0
- package/dist/backend/backend/src/services/workflow/message-scheduler.service.js +408 -0
- package/dist/backend/backend/src/services/workflow/message-scheduler.service.js.map +1 -0
- package/dist/backend/backend/src/services/workflow/scheduler.service.d.ts +300 -0
- package/dist/backend/backend/src/services/workflow/scheduler.service.d.ts.map +1 -0
- package/dist/backend/backend/src/services/workflow/scheduler.service.js +924 -0
- package/dist/backend/backend/src/services/workflow/scheduler.service.js.map +1 -0
- package/dist/backend/backend/src/types/auto-assign.types.d.ts +271 -0
- package/dist/backend/backend/src/types/auto-assign.types.d.ts.map +1 -0
- package/dist/backend/backend/src/types/auto-assign.types.js +136 -0
- package/dist/backend/backend/src/types/auto-assign.types.js.map +1 -0
- package/dist/backend/backend/src/types/budget.types.d.ts +217 -0
- package/dist/backend/backend/src/types/budget.types.d.ts.map +1 -0
- package/dist/backend/backend/src/types/budget.types.js +82 -0
- package/dist/backend/backend/src/types/budget.types.js.map +1 -0
- package/dist/backend/backend/src/types/chat.types.d.ts +550 -0
- package/dist/backend/backend/src/types/chat.types.d.ts.map +1 -0
- package/dist/backend/backend/src/types/chat.types.js +743 -0
- package/dist/backend/backend/src/types/chat.types.js.map +1 -0
- package/dist/backend/backend/src/types/continuation.types.d.ts +237 -0
- package/dist/backend/backend/src/types/continuation.types.d.ts.map +1 -0
- package/dist/backend/backend/src/types/continuation.types.js +10 -0
- package/dist/backend/backend/src/types/continuation.types.js.map +1 -0
- package/dist/backend/backend/src/types/event-bus.types.d.ts +112 -0
- package/dist/backend/backend/src/types/event-bus.types.d.ts.map +1 -0
- package/dist/backend/backend/src/types/event-bus.types.js +82 -0
- package/dist/backend/backend/src/types/event-bus.types.js.map +1 -0
- package/dist/backend/backend/src/types/index.d.ts +161 -0
- package/dist/backend/backend/src/types/index.d.ts.map +1 -0
- package/dist/backend/backend/src/types/index.js +23 -0
- package/dist/backend/backend/src/types/index.js.map +1 -0
- package/dist/backend/backend/src/types/knowledge.types.d.ts +195 -0
- package/dist/backend/backend/src/types/knowledge.types.d.ts.map +1 -0
- package/dist/backend/backend/src/types/knowledge.types.js +38 -0
- package/dist/backend/backend/src/types/knowledge.types.js.map +1 -0
- package/dist/backend/backend/src/types/marketplace.types.d.ts +68 -0
- package/dist/backend/backend/src/types/marketplace.types.d.ts.map +1 -0
- package/dist/backend/backend/src/types/marketplace.types.js +6 -0
- package/dist/backend/backend/src/types/marketplace.types.js.map +1 -0
- package/dist/backend/backend/src/types/memory.types.d.ts +587 -0
- package/dist/backend/backend/src/types/memory.types.d.ts.map +1 -0
- package/dist/backend/backend/src/types/memory.types.js +47 -0
- package/dist/backend/backend/src/types/memory.types.js.map +1 -0
- package/dist/backend/backend/src/types/messaging.types.d.ts +216 -0
- package/dist/backend/backend/src/types/messaging.types.d.ts.map +1 -0
- package/dist/backend/backend/src/types/messaging.types.js +224 -0
- package/dist/backend/backend/src/types/messaging.types.js.map +1 -0
- package/dist/backend/backend/src/types/orchestrator-state.types.d.ts +482 -0
- package/dist/backend/backend/src/types/orchestrator-state.types.d.ts.map +1 -0
- package/dist/backend/backend/src/types/orchestrator-state.types.js +83 -0
- package/dist/backend/backend/src/types/orchestrator-state.types.js.map +1 -0
- package/dist/backend/backend/src/types/quality-gate.types.d.ts +171 -0
- package/dist/backend/backend/src/types/quality-gate.types.d.ts.map +1 -0
- package/dist/backend/backend/src/types/quality-gate.types.js +42 -0
- package/dist/backend/backend/src/types/quality-gate.types.js.map +1 -0
- package/dist/backend/backend/src/types/role.types.d.ts +260 -0
- package/dist/backend/backend/src/types/role.types.d.ts.map +1 -0
- package/dist/backend/backend/src/types/role.types.js +238 -0
- package/dist/backend/backend/src/types/role.types.js.map +1 -0
- package/dist/backend/backend/src/types/scheduler.types.d.ts +237 -0
- package/dist/backend/backend/src/types/scheduler.types.d.ts.map +1 -0
- package/dist/backend/backend/src/types/scheduler.types.js +32 -0
- package/dist/backend/backend/src/types/scheduler.types.js.map +1 -0
- package/dist/backend/backend/src/types/settings.types.d.ts +178 -0
- package/dist/backend/backend/src/types/settings.types.d.ts.map +1 -0
- package/dist/backend/backend/src/types/settings.types.js +206 -0
- package/dist/backend/backend/src/types/settings.types.js.map +1 -0
- package/dist/backend/backend/src/types/skill.types.d.ts +515 -0
- package/dist/backend/backend/src/types/skill.types.d.ts.map +1 -0
- package/dist/backend/backend/src/types/skill.types.js +481 -0
- package/dist/backend/backend/src/types/skill.types.js.map +1 -0
- package/dist/backend/backend/src/types/slack.types.d.ts +329 -0
- package/dist/backend/backend/src/types/slack.types.d.ts.map +1 -0
- package/dist/backend/backend/src/types/slack.types.js +66 -0
- package/dist/backend/backend/src/types/slack.types.js.map +1 -0
- package/dist/backend/backend/src/types/sop.types.d.ts +224 -0
- package/dist/backend/backend/src/types/sop.types.d.ts.map +1 -0
- package/dist/backend/backend/src/types/sop.types.js +85 -0
- package/dist/backend/backend/src/types/sop.types.js.map +1 -0
- package/dist/backend/backend/src/types/task-tracking.types.d.ts +91 -0
- package/dist/backend/backend/src/types/task-tracking.types.d.ts.map +1 -0
- package/dist/backend/backend/src/types/task-tracking.types.js +5 -0
- package/dist/backend/backend/src/types/task-tracking.types.js.map +1 -0
- package/dist/backend/backend/src/utils/async.utils.d.ts +68 -0
- package/dist/backend/backend/src/utils/async.utils.d.ts.map +1 -0
- package/dist/backend/backend/src/utils/async.utils.js +80 -0
- package/dist/backend/backend/src/utils/async.utils.js.map +1 -0
- package/dist/backend/backend/src/utils/defaultPrompts.d.ts +5 -0
- package/dist/backend/backend/src/utils/defaultPrompts.d.ts.map +1 -0
- package/dist/backend/backend/src/utils/defaultPrompts.js +285 -0
- package/dist/backend/backend/src/utils/defaultPrompts.js.map +1 -0
- package/dist/backend/backend/src/utils/file-io.utils.d.ts +102 -0
- package/dist/backend/backend/src/utils/file-io.utils.d.ts.map +1 -0
- package/dist/backend/backend/src/utils/file-io.utils.js +214 -0
- package/dist/backend/backend/src/utils/file-io.utils.js.map +1 -0
- package/dist/backend/backend/src/utils/package-root.d.ts +15 -0
- package/dist/backend/backend/src/utils/package-root.d.ts.map +1 -0
- package/dist/backend/backend/src/utils/package-root.js +38 -0
- package/dist/backend/backend/src/utils/package-root.js.map +1 -0
- package/dist/backend/backend/src/utils/process-recovery.d.ts +81 -0
- package/dist/backend/backend/src/utils/process-recovery.d.ts.map +1 -0
- package/dist/backend/backend/src/utils/process-recovery.js +283 -0
- package/dist/backend/backend/src/utils/process-recovery.js.map +1 -0
- package/dist/backend/backend/src/utils/prompt-resolver.d.ts +79 -0
- package/dist/backend/backend/src/utils/prompt-resolver.d.ts.map +1 -0
- package/dist/backend/backend/src/utils/prompt-resolver.js +132 -0
- package/dist/backend/backend/src/utils/prompt-resolver.js.map +1 -0
- package/dist/backend/backend/src/utils/resource-monitor.d.ts +177 -0
- package/dist/backend/backend/src/utils/resource-monitor.d.ts.map +1 -0
- package/dist/backend/backend/src/utils/resource-monitor.js +404 -0
- package/dist/backend/backend/src/utils/resource-monitor.js.map +1 -0
- package/dist/backend/backend/src/utils/security.d.ts +194 -0
- package/dist/backend/backend/src/utils/security.d.ts.map +1 -0
- package/dist/backend/backend/src/utils/security.js +533 -0
- package/dist/backend/backend/src/utils/security.js.map +1 -0
- package/dist/backend/backend/src/utils/terminal-output.utils.d.ts +54 -0
- package/dist/backend/backend/src/utils/terminal-output.utils.d.ts.map +1 -0
- package/dist/backend/backend/src/utils/terminal-output.utils.js +97 -0
- package/dist/backend/backend/src/utils/terminal-output.utils.js.map +1 -0
- package/dist/backend/backend/src/websocket/chat.gateway.d.ts +127 -0
- package/dist/backend/backend/src/websocket/chat.gateway.d.ts.map +1 -0
- package/dist/backend/backend/src/websocket/chat.gateway.js +306 -0
- package/dist/backend/backend/src/websocket/chat.gateway.js.map +1 -0
- package/dist/backend/backend/src/websocket/file-watcher.gateway.d.ts +54 -0
- package/dist/backend/backend/src/websocket/file-watcher.gateway.d.ts.map +1 -0
- package/dist/backend/backend/src/websocket/file-watcher.gateway.js +202 -0
- package/dist/backend/backend/src/websocket/file-watcher.gateway.js.map +1 -0
- package/dist/backend/backend/src/websocket/terminal.gateway.d.ts +310 -0
- package/dist/backend/backend/src/websocket/terminal.gateway.d.ts.map +1 -0
- package/dist/backend/backend/src/websocket/terminal.gateway.js +980 -0
- package/dist/backend/backend/src/websocket/terminal.gateway.js.map +1 -0
- package/dist/backend/config/constants.d.ts +722 -0
- package/dist/backend/config/constants.d.ts.map +1 -0
- package/dist/backend/config/constants.js +752 -0
- package/dist/backend/config/constants.js.map +1 -0
- package/dist/backend/config/index.d.ts +344 -0
- package/dist/backend/config/index.d.ts.map +1 -0
- package/dist/backend/config/index.js +42 -0
- package/dist/backend/config/index.js.map +1 -0
- package/dist/backend/config/quality-gates/default-gates.d.ts +71 -0
- package/dist/backend/config/quality-gates/default-gates.d.ts.map +1 -0
- package/dist/backend/config/quality-gates/default-gates.js +168 -0
- package/dist/backend/config/quality-gates/default-gates.js.map +1 -0
- package/dist/cli/cli/src/commands/logs.d.ts +7 -0
- package/dist/cli/cli/src/commands/logs.d.ts.map +1 -0
- package/dist/cli/cli/src/commands/logs.js +198 -0
- package/dist/cli/cli/src/commands/logs.js.map +1 -0
- package/dist/cli/cli/src/commands/start.d.ts +8 -0
- package/dist/cli/cli/src/commands/start.d.ts.map +1 -0
- package/dist/cli/cli/src/commands/start.js +254 -0
- package/dist/cli/cli/src/commands/start.js.map +1 -0
- package/dist/cli/cli/src/commands/status.d.ts +6 -0
- package/dist/cli/cli/src/commands/status.d.ts.map +1 -0
- package/dist/cli/cli/src/commands/status.js +130 -0
- package/dist/cli/cli/src/commands/status.js.map +1 -0
- package/dist/cli/cli/src/commands/stop.d.ts +6 -0
- package/dist/cli/cli/src/commands/stop.d.ts.map +1 -0
- package/dist/cli/cli/src/commands/stop.js +140 -0
- package/dist/cli/cli/src/commands/stop.js.map +1 -0
- package/dist/cli/cli/src/commands/upgrade.d.ts +26 -0
- package/dist/cli/cli/src/commands/upgrade.d.ts.map +1 -0
- package/dist/cli/cli/src/commands/upgrade.js +54 -0
- package/dist/cli/cli/src/commands/upgrade.js.map +1 -0
- package/dist/cli/cli/src/constants.d.ts +106 -0
- package/dist/cli/cli/src/constants.d.ts.map +1 -0
- package/dist/cli/cli/src/constants.js +88 -0
- package/dist/cli/cli/src/constants.js.map +1 -0
- package/dist/cli/cli/src/index.d.ts +3 -0
- package/dist/cli/cli/src/index.d.ts.map +1 -0
- package/dist/cli/cli/src/index.js +60 -0
- package/dist/cli/cli/src/index.js.map +1 -0
- package/dist/cli/cli/src/utils/version-check.d.ts +66 -0
- package/dist/cli/cli/src/utils/version-check.d.ts.map +1 -0
- package/dist/cli/cli/src/utils/version-check.js +192 -0
- package/dist/cli/cli/src/utils/version-check.js.map +1 -0
- package/dist/cli/config/constants.d.ts +722 -0
- package/dist/cli/config/constants.d.ts.map +1 -0
- package/dist/cli/config/constants.js +752 -0
- package/dist/cli/config/constants.js.map +1 -0
- package/dist/cli/config/index.d.ts +344 -0
- package/dist/cli/config/index.d.ts.map +1 -0
- package/dist/cli/config/index.js +42 -0
- package/dist/cli/config/index.js.map +1 -0
- package/frontend/dist/assets/index-5ddf71c8.css +33 -0
- package/frontend/dist/assets/index-77b6a2a0.js +4919 -0
- package/frontend/dist/index.html +19 -0
- package/frontend/dist/logo/crewly-icon.svg +118 -0
- package/package.json +121 -0
|
@@ -0,0 +1,1629 @@
|
|
|
1
|
+
import { v4 as uuidv4 } from 'uuid';
|
|
2
|
+
import { ORCHESTRATOR_SESSION_NAME, ORCHESTRATOR_ROLE, RUNTIME_TYPES } from '../../constants.js';
|
|
3
|
+
import { CREWLY_CONSTANTS } from '../../constants.js';
|
|
4
|
+
import { updateAgentHeartbeat } from '../../services/agent/agent-heartbeat.service.js';
|
|
5
|
+
import { getSessionBackendSync, getSessionStatePersistence } from '../../services/session/index.js';
|
|
6
|
+
import { getTerminalGateway } from '../../websocket/terminal.gateway.js';
|
|
7
|
+
import { MemoryService } from '../../services/memory/memory.service.js';
|
|
8
|
+
import { SubAgentMessageQueue } from '../../services/messaging/sub-agent-message-queue.service.js';
|
|
9
|
+
import { SUB_AGENT_QUEUE_CONSTANTS } from '../../constants.js';
|
|
10
|
+
/**
|
|
11
|
+
* Module-level EventBusService instance, injected at startup.
|
|
12
|
+
* Used to auto-subscribe the orchestrator to agent lifecycle events.
|
|
13
|
+
*/
|
|
14
|
+
let eventBusService = null;
|
|
15
|
+
/**
|
|
16
|
+
* Set the EventBusService instance for auto-subscribing the orchestrator.
|
|
17
|
+
* Called during server initialization in index.ts.
|
|
18
|
+
*
|
|
19
|
+
* @param service - The EventBusService instance
|
|
20
|
+
*/
|
|
21
|
+
export function setTeamControllerEventBusService(service) {
|
|
22
|
+
eventBusService = service;
|
|
23
|
+
}
|
|
24
|
+
/**
|
|
25
|
+
* Build the virtual orchestrator Team object.
|
|
26
|
+
*
|
|
27
|
+
* The orchestrator is not stored in teams.json but surfaced as a virtual team
|
|
28
|
+
* in the API. This helper eliminates the 3x duplication of the construction.
|
|
29
|
+
*
|
|
30
|
+
* @param actualAgentStatus - Resolved agent status (from session existence check)
|
|
31
|
+
* @param orchestratorStatus - Persisted orchestrator status from storage
|
|
32
|
+
* @param overrides - Optional field overrides (e.g. projectIds for updates)
|
|
33
|
+
* @returns A Team object representing the orchestrator
|
|
34
|
+
*/
|
|
35
|
+
function buildOrchestratorTeam(actualAgentStatus, orchestratorStatus, overrides) {
|
|
36
|
+
const now = new Date().toISOString();
|
|
37
|
+
return {
|
|
38
|
+
id: 'orchestrator',
|
|
39
|
+
name: 'Orchestrator Team',
|
|
40
|
+
description: 'System orchestrator for project management',
|
|
41
|
+
members: [
|
|
42
|
+
{
|
|
43
|
+
id: 'orchestrator-member',
|
|
44
|
+
name: 'Agentmux Orchestrator',
|
|
45
|
+
sessionName: CREWLY_CONSTANTS.SESSIONS.ORCHESTRATOR_NAME,
|
|
46
|
+
role: 'orchestrator',
|
|
47
|
+
systemPrompt: 'You are the Crewly Orchestrator responsible for coordinating teams and managing project workflows.',
|
|
48
|
+
agentStatus: actualAgentStatus,
|
|
49
|
+
workingStatus: (orchestratorStatus?.workingStatus || CREWLY_CONSTANTS.WORKING_STATUSES.IDLE),
|
|
50
|
+
runtimeType: (orchestratorStatus?.runtimeType || 'claude-code'),
|
|
51
|
+
createdAt: orchestratorStatus?.createdAt || now,
|
|
52
|
+
updatedAt: orchestratorStatus?.updatedAt || now
|
|
53
|
+
}
|
|
54
|
+
],
|
|
55
|
+
projectIds: [],
|
|
56
|
+
createdAt: orchestratorStatus?.createdAt || now,
|
|
57
|
+
updatedAt: orchestratorStatus?.updatedAt || now,
|
|
58
|
+
...overrides,
|
|
59
|
+
};
|
|
60
|
+
}
|
|
61
|
+
/**
|
|
62
|
+
* Resolve the display agent status based on stored state and live session presence.
|
|
63
|
+
*
|
|
64
|
+
* When a PTY session is alive but the agent hasn't registered yet, we keep
|
|
65
|
+
* the "started"/"starting" states instead of incorrectly elevating to "active".
|
|
66
|
+
* Conversely, if the session has disappeared we immediately report "inactive"
|
|
67
|
+
* regardless of the stored status to avoid stale UI.
|
|
68
|
+
*/
|
|
69
|
+
function resolveAgentStatus(storedStatus, sessionExists) {
|
|
70
|
+
if (!sessionExists) {
|
|
71
|
+
return CREWLY_CONSTANTS.AGENT_STATUSES.INACTIVE;
|
|
72
|
+
}
|
|
73
|
+
if (!storedStatus || storedStatus === CREWLY_CONSTANTS.AGENT_STATUSES.INACTIVE) {
|
|
74
|
+
return CREWLY_CONSTANTS.AGENT_STATUSES.STARTED;
|
|
75
|
+
}
|
|
76
|
+
return storedStatus;
|
|
77
|
+
}
|
|
78
|
+
/**
|
|
79
|
+
* Core logic for starting a single team member
|
|
80
|
+
* @param context - API context with services
|
|
81
|
+
* @param team - The team containing the member
|
|
82
|
+
* @param member - The team member to start
|
|
83
|
+
* @param projectPath - Optional project path for the session
|
|
84
|
+
* @returns Result of the start operation
|
|
85
|
+
*/
|
|
86
|
+
async function _startTeamMemberCore(context, team, member, projectPath) {
|
|
87
|
+
try {
|
|
88
|
+
// Check if member already has an active session
|
|
89
|
+
if (member.sessionName) {
|
|
90
|
+
const sessions = await context.tmuxService.listSessions();
|
|
91
|
+
const hasActiveSession = sessions.some(s => s.sessionName === member.sessionName);
|
|
92
|
+
if (hasActiveSession) {
|
|
93
|
+
// Handle synchronization issue: session exists but status might be inactive
|
|
94
|
+
if (member.agentStatus === CREWLY_CONSTANTS.AGENT_STATUSES.INACTIVE) {
|
|
95
|
+
try {
|
|
96
|
+
// Try to check if the agent in the session is responsive
|
|
97
|
+
const captureResult = await Promise.race([
|
|
98
|
+
context.tmuxService.capturePane(member.sessionName, 5),
|
|
99
|
+
new Promise((_, reject) => setTimeout(() => reject(new Error('Agent check timeout')), 1000))
|
|
100
|
+
]);
|
|
101
|
+
// If we can capture output, the session is likely active
|
|
102
|
+
if (captureResult && captureResult.length > 0) {
|
|
103
|
+
// Load fresh team data to avoid race conditions
|
|
104
|
+
const currentTeams = await context.storageService.getTeams();
|
|
105
|
+
const currentTeam = currentTeams.find(t => t.id === team.id);
|
|
106
|
+
const currentMember = currentTeam?.members.find(m => m.id === member.id);
|
|
107
|
+
if (currentTeam && currentMember) {
|
|
108
|
+
// Update status to active to sync with session state
|
|
109
|
+
currentMember.agentStatus = CREWLY_CONSTANTS.AGENT_STATUSES.ACTIVE;
|
|
110
|
+
currentMember.workingStatus = currentMember.workingStatus || 'working';
|
|
111
|
+
currentMember.updatedAt = new Date().toISOString();
|
|
112
|
+
await context.storageService.saveTeam(currentTeam);
|
|
113
|
+
}
|
|
114
|
+
return {
|
|
115
|
+
success: true,
|
|
116
|
+
memberName: member.name,
|
|
117
|
+
memberId: member.id,
|
|
118
|
+
sessionName: member.sessionName,
|
|
119
|
+
status: 'synchronized'
|
|
120
|
+
};
|
|
121
|
+
}
|
|
122
|
+
else {
|
|
123
|
+
// Session exists but appears zombie - kill it and proceed with new creation
|
|
124
|
+
console.warn(`Cleaning up zombie session: ${member.sessionName}`);
|
|
125
|
+
await context.tmuxService.killSession(member.sessionName).catch(() => {
|
|
126
|
+
// Ignore errors if session doesn't exist
|
|
127
|
+
});
|
|
128
|
+
// Clear the session name and allow new session creation (but don't save yet)
|
|
129
|
+
member.sessionName = '';
|
|
130
|
+
member.updatedAt = new Date().toISOString();
|
|
131
|
+
}
|
|
132
|
+
}
|
|
133
|
+
catch (error) {
|
|
134
|
+
// If we can't check the session, assume it's zombie and clean it up
|
|
135
|
+
console.warn(`Error checking session ${member.sessionName}, treating as zombie:`, error);
|
|
136
|
+
await context.tmuxService.killSession(member.sessionName).catch(() => {
|
|
137
|
+
// Ignore errors if session doesn't exist
|
|
138
|
+
});
|
|
139
|
+
// Clear the session name and allow new session creation (but don't save yet)
|
|
140
|
+
member.sessionName = '';
|
|
141
|
+
member.updatedAt = new Date().toISOString();
|
|
142
|
+
}
|
|
143
|
+
}
|
|
144
|
+
else {
|
|
145
|
+
// Session exists and agent status is active/activating - this is normal conflict
|
|
146
|
+
return {
|
|
147
|
+
success: false,
|
|
148
|
+
memberName: member.name,
|
|
149
|
+
memberId: member.id,
|
|
150
|
+
sessionName: member.sessionName,
|
|
151
|
+
status: 'already_active',
|
|
152
|
+
error: 'Team member already has an active session'
|
|
153
|
+
};
|
|
154
|
+
}
|
|
155
|
+
}
|
|
156
|
+
}
|
|
157
|
+
// Only prevent processing if member has BOTH active status AND an existing session
|
|
158
|
+
// This allows newly 'activating' members (set by API endpoints) to proceed with session creation
|
|
159
|
+
if (member.agentStatus === CREWLY_CONSTANTS.AGENT_STATUSES.ACTIVE && member.sessionName) {
|
|
160
|
+
// Double-check that the session actually exists
|
|
161
|
+
const sessions = await context.tmuxService.listSessions();
|
|
162
|
+
const hasActiveSession = sessions.some(s => s.sessionName === member.sessionName);
|
|
163
|
+
if (hasActiveSession) {
|
|
164
|
+
return {
|
|
165
|
+
success: false,
|
|
166
|
+
memberName: member.name,
|
|
167
|
+
memberId: member.id,
|
|
168
|
+
sessionName: member.sessionName,
|
|
169
|
+
status: member.agentStatus,
|
|
170
|
+
error: `Team member is already active with session ${member.sessionName}`
|
|
171
|
+
};
|
|
172
|
+
}
|
|
173
|
+
else {
|
|
174
|
+
// Session doesn't exist, clear sessionName and allow new creation (but don't save yet)
|
|
175
|
+
member.sessionName = '';
|
|
176
|
+
member.updatedAt = new Date().toISOString();
|
|
177
|
+
}
|
|
178
|
+
}
|
|
179
|
+
// Generate session name
|
|
180
|
+
const teamSlug = team.name.toLowerCase().replace(/\s+/g, '-');
|
|
181
|
+
const memberSlug = member.name.toLowerCase().replace(/\s+/g, '-');
|
|
182
|
+
const memberIdSlug = member.id.substring(0, 8);
|
|
183
|
+
const sessionName = `${teamSlug}-${memberSlug}-${memberIdSlug}`;
|
|
184
|
+
// Load fresh team data before making any changes to avoid race conditions with MCP registration
|
|
185
|
+
const currentTeams = await context.storageService.getTeams();
|
|
186
|
+
const currentTeam = currentTeams.find(t => t.id === team.id);
|
|
187
|
+
const currentMember = currentTeam?.members.find(m => m.id === member.id);
|
|
188
|
+
if (!currentTeam || !currentMember) {
|
|
189
|
+
return {
|
|
190
|
+
success: false,
|
|
191
|
+
memberName: member.name,
|
|
192
|
+
memberId: member.id,
|
|
193
|
+
sessionName: null,
|
|
194
|
+
status: 'failed',
|
|
195
|
+
error: 'Team or member not found during session creation'
|
|
196
|
+
};
|
|
197
|
+
}
|
|
198
|
+
// Set sessionName in team member BEFORE creating session to avoid race condition
|
|
199
|
+
// Use fresh team data to preserve any concurrent agentStatus updates
|
|
200
|
+
currentMember.sessionName = sessionName;
|
|
201
|
+
currentMember.workingStatus = currentMember.workingStatus || CREWLY_CONSTANTS.WORKING_STATUSES.IDLE;
|
|
202
|
+
currentMember.updatedAt = new Date().toISOString();
|
|
203
|
+
await context.storageService.saveTeam(currentTeam);
|
|
204
|
+
// Use the unified agent registration service for team member creation with retry logic
|
|
205
|
+
// This helps handle race conditions in tmux session creation
|
|
206
|
+
const MAX_CREATION_RETRIES = 3;
|
|
207
|
+
let createResult = { success: false };
|
|
208
|
+
let lastError;
|
|
209
|
+
for (let attempt = 1; attempt <= MAX_CREATION_RETRIES; attempt++) {
|
|
210
|
+
createResult = await context.agentRegistrationService.createAgentSession({
|
|
211
|
+
sessionName,
|
|
212
|
+
role: currentMember.role,
|
|
213
|
+
projectPath: projectPath,
|
|
214
|
+
memberId: currentMember.id,
|
|
215
|
+
teamId: team.id,
|
|
216
|
+
});
|
|
217
|
+
if (createResult.success) {
|
|
218
|
+
break;
|
|
219
|
+
}
|
|
220
|
+
lastError = createResult.error;
|
|
221
|
+
// If this isn't the last attempt, wait before retrying with exponential backoff
|
|
222
|
+
if (attempt < MAX_CREATION_RETRIES) {
|
|
223
|
+
const retryDelay = 1000 * attempt; // 1s, 2s exponential backoff
|
|
224
|
+
await new Promise(resolve => setTimeout(resolve, retryDelay));
|
|
225
|
+
}
|
|
226
|
+
}
|
|
227
|
+
if (createResult.success) {
|
|
228
|
+
// Initialize memory for this team member so remember/recall MCP tools work
|
|
229
|
+
try {
|
|
230
|
+
const memoryService = MemoryService.getInstance();
|
|
231
|
+
await memoryService.initializeForSession(sessionName, currentMember.role, projectPath || process.cwd());
|
|
232
|
+
}
|
|
233
|
+
catch (memError) {
|
|
234
|
+
console.warn(`[TeamController] Failed to initialize memory for ${sessionName}:`, memError);
|
|
235
|
+
}
|
|
236
|
+
// CRITICAL: Load fresh data again after session creation to preserve MCP registration updates
|
|
237
|
+
const finalTeams = await context.storageService.getTeams();
|
|
238
|
+
const finalTeam = finalTeams.find(t => t.id === team.id);
|
|
239
|
+
const finalMember = finalTeam?.members.find(m => m.id === member.id);
|
|
240
|
+
if (finalTeam && finalMember) {
|
|
241
|
+
// Only update sessionName if needed, preserve all other fields including agentStatus
|
|
242
|
+
const needsSessionUpdate = finalMember.sessionName !== (createResult.sessionName || sessionName);
|
|
243
|
+
if (needsSessionUpdate) {
|
|
244
|
+
finalMember.sessionName = createResult.sessionName || sessionName;
|
|
245
|
+
finalMember.updatedAt = new Date().toISOString();
|
|
246
|
+
await context.storageService.saveTeam(finalTeam);
|
|
247
|
+
}
|
|
248
|
+
return {
|
|
249
|
+
success: true,
|
|
250
|
+
memberName: finalMember.name,
|
|
251
|
+
memberId: finalMember.id,
|
|
252
|
+
sessionName: createResult.sessionName || sessionName,
|
|
253
|
+
status: finalMember.agentStatus
|
|
254
|
+
};
|
|
255
|
+
}
|
|
256
|
+
else {
|
|
257
|
+
console.error(`Team or member not found after session creation: teamId=${team.id}, memberId=${member.id}`);
|
|
258
|
+
return {
|
|
259
|
+
success: false,
|
|
260
|
+
memberName: member.name,
|
|
261
|
+
memberId: member.id,
|
|
262
|
+
sessionName: null,
|
|
263
|
+
status: 'failed',
|
|
264
|
+
error: 'Team or member not found after session creation'
|
|
265
|
+
};
|
|
266
|
+
}
|
|
267
|
+
}
|
|
268
|
+
else {
|
|
269
|
+
// Load fresh data before updating failure status
|
|
270
|
+
const failureTeams = await context.storageService.getTeams();
|
|
271
|
+
const failureTeam = failureTeams.find(t => t.id === team.id);
|
|
272
|
+
const failureMember = failureTeam?.members.find(m => m.id === member.id);
|
|
273
|
+
if (failureTeam && failureMember) {
|
|
274
|
+
// Reset to inactive if session creation failed
|
|
275
|
+
failureMember.agentStatus = CREWLY_CONSTANTS.AGENT_STATUSES.INACTIVE;
|
|
276
|
+
failureMember.sessionName = '';
|
|
277
|
+
failureMember.updatedAt = new Date().toISOString();
|
|
278
|
+
await context.storageService.saveTeam(failureTeam);
|
|
279
|
+
}
|
|
280
|
+
console.error(`All ${MAX_CREATION_RETRIES} session creation attempts failed for ${member.name}: ${lastError}`);
|
|
281
|
+
return {
|
|
282
|
+
success: false,
|
|
283
|
+
memberName: member.name,
|
|
284
|
+
memberId: member.id,
|
|
285
|
+
sessionName: null,
|
|
286
|
+
status: 'failed',
|
|
287
|
+
error: lastError || createResult?.error || `Failed to create team member session after ${MAX_CREATION_RETRIES} attempts`
|
|
288
|
+
};
|
|
289
|
+
}
|
|
290
|
+
}
|
|
291
|
+
catch (error) {
|
|
292
|
+
// Load fresh data before updating error status
|
|
293
|
+
const errorTeams = await context.storageService.getTeams();
|
|
294
|
+
const errorTeam = errorTeams.find(t => t.id === team.id);
|
|
295
|
+
const errorMember = errorTeam?.members.find(m => m.id === member.id);
|
|
296
|
+
if (errorTeam && errorMember) {
|
|
297
|
+
// Reset to inactive if session creation failed
|
|
298
|
+
errorMember.agentStatus = CREWLY_CONSTANTS.AGENT_STATUSES.INACTIVE;
|
|
299
|
+
errorMember.sessionName = '';
|
|
300
|
+
errorMember.updatedAt = new Date().toISOString();
|
|
301
|
+
await context.storageService.saveTeam(errorTeam);
|
|
302
|
+
}
|
|
303
|
+
console.error('Error starting team member:', error);
|
|
304
|
+
return {
|
|
305
|
+
success: false,
|
|
306
|
+
memberName: member.name,
|
|
307
|
+
memberId: member.id,
|
|
308
|
+
sessionName: null,
|
|
309
|
+
status: 'failed',
|
|
310
|
+
error: error instanceof Error ? error.message : 'Unknown error'
|
|
311
|
+
};
|
|
312
|
+
}
|
|
313
|
+
}
|
|
314
|
+
/**
|
|
315
|
+
* Core logic for stopping a single team member
|
|
316
|
+
* @param context - API context with services
|
|
317
|
+
* @param team - The team containing the member
|
|
318
|
+
* @param member - The team member to stop
|
|
319
|
+
* @returns Result of the stop operation
|
|
320
|
+
*/
|
|
321
|
+
async function _stopTeamMemberCore(context, team, member) {
|
|
322
|
+
try {
|
|
323
|
+
// Use the unified agent registration service for team member termination
|
|
324
|
+
if (member.sessionName) {
|
|
325
|
+
const stopResult = await context.agentRegistrationService.terminateAgentSession(member.sessionName, member.role);
|
|
326
|
+
if (!stopResult.success) {
|
|
327
|
+
console.error('Failed to terminate team member session:', stopResult.error);
|
|
328
|
+
return {
|
|
329
|
+
success: false,
|
|
330
|
+
memberName: member.name,
|
|
331
|
+
memberId: member.id,
|
|
332
|
+
sessionName: member.sessionName,
|
|
333
|
+
status: 'failed',
|
|
334
|
+
error: stopResult.error || 'Failed to stop team member session'
|
|
335
|
+
};
|
|
336
|
+
}
|
|
337
|
+
}
|
|
338
|
+
// Update team member status
|
|
339
|
+
const oldSessionName = member.sessionName;
|
|
340
|
+
const mutableMember = member;
|
|
341
|
+
mutableMember.sessionName = '';
|
|
342
|
+
mutableMember.agentStatus = CREWLY_CONSTANTS.AGENT_STATUSES.INACTIVE;
|
|
343
|
+
mutableMember.workingStatus = CREWLY_CONSTANTS.WORKING_STATUSES.IDLE;
|
|
344
|
+
mutableMember.updatedAt = new Date().toISOString();
|
|
345
|
+
await context.storageService.saveTeam(team);
|
|
346
|
+
return {
|
|
347
|
+
success: true,
|
|
348
|
+
memberName: member.name,
|
|
349
|
+
memberId: member.id,
|
|
350
|
+
sessionName: oldSessionName,
|
|
351
|
+
status: CREWLY_CONSTANTS.AGENT_STATUSES.INACTIVE
|
|
352
|
+
};
|
|
353
|
+
}
|
|
354
|
+
catch (error) {
|
|
355
|
+
console.error('Error stopping team member:', error);
|
|
356
|
+
return {
|
|
357
|
+
success: false,
|
|
358
|
+
memberName: member.name,
|
|
359
|
+
memberId: member.id,
|
|
360
|
+
sessionName: member.sessionName || null,
|
|
361
|
+
status: 'failed',
|
|
362
|
+
error: error instanceof Error ? error.message : 'Unknown error'
|
|
363
|
+
};
|
|
364
|
+
}
|
|
365
|
+
}
|
|
366
|
+
/**
|
|
367
|
+
* Creates (or refreshes) orchestrator subscriptions to agent lifecycle events.
|
|
368
|
+
*
|
|
369
|
+
* Clears any existing subscriptions for the orchestrator session first to avoid
|
|
370
|
+
* duplicates on re-registration, then subscribes to all agent status change events
|
|
371
|
+
* with the maximum TTL (24 hours). Re-created each time the orchestrator registers.
|
|
372
|
+
*/
|
|
373
|
+
function ensureOrchestratorSubscriptions() {
|
|
374
|
+
if (!eventBusService)
|
|
375
|
+
return;
|
|
376
|
+
// Clear any existing orchestrator subscriptions to avoid duplicates on re-registration
|
|
377
|
+
const existing = eventBusService.listSubscriptions(ORCHESTRATOR_SESSION_NAME);
|
|
378
|
+
for (const sub of existing) {
|
|
379
|
+
eventBusService.unsubscribe(sub.id);
|
|
380
|
+
}
|
|
381
|
+
// Subscribe to all agent lifecycle events with max TTL
|
|
382
|
+
eventBusService.subscribe({
|
|
383
|
+
eventType: ['agent:status_changed', 'agent:idle', 'agent:busy', 'agent:active', 'agent:inactive'],
|
|
384
|
+
filter: {},
|
|
385
|
+
subscriberSession: ORCHESTRATOR_SESSION_NAME,
|
|
386
|
+
oneShot: false,
|
|
387
|
+
ttlMinutes: 1440,
|
|
388
|
+
});
|
|
389
|
+
}
|
|
390
|
+
export async function createTeam(req, res) {
|
|
391
|
+
try {
|
|
392
|
+
const { name, description, members, projectPath, currentProject, projectIds } = req.body;
|
|
393
|
+
if (!name || !members || !Array.isArray(members) || members.length === 0) {
|
|
394
|
+
res.status(400).json({
|
|
395
|
+
success: false,
|
|
396
|
+
error: 'Missing required fields: name and members array'
|
|
397
|
+
});
|
|
398
|
+
return;
|
|
399
|
+
}
|
|
400
|
+
for (const member of members) {
|
|
401
|
+
if (!member.name || !member.role || !member.systemPrompt) {
|
|
402
|
+
res.status(400).json({
|
|
403
|
+
success: false,
|
|
404
|
+
error: 'All team members must have name, role, and systemPrompt'
|
|
405
|
+
});
|
|
406
|
+
return;
|
|
407
|
+
}
|
|
408
|
+
}
|
|
409
|
+
const existingTeams = await this.storageService.getTeams();
|
|
410
|
+
if (existingTeams.find(t => t.name === name)) {
|
|
411
|
+
res.status(409).json({
|
|
412
|
+
success: false,
|
|
413
|
+
error: `Team with name "${name}" already exists`
|
|
414
|
+
});
|
|
415
|
+
return;
|
|
416
|
+
}
|
|
417
|
+
const teamId = uuidv4();
|
|
418
|
+
const teamMembers = [];
|
|
419
|
+
for (let i = 0; i < members.length; i++) {
|
|
420
|
+
const member = members[i];
|
|
421
|
+
const memberId = uuidv4();
|
|
422
|
+
const teamMember = {
|
|
423
|
+
id: memberId,
|
|
424
|
+
name: member.name,
|
|
425
|
+
sessionName: '',
|
|
426
|
+
role: member.role,
|
|
427
|
+
avatar: member.avatar,
|
|
428
|
+
systemPrompt: member.systemPrompt,
|
|
429
|
+
agentStatus: CREWLY_CONSTANTS.AGENT_STATUSES.INACTIVE,
|
|
430
|
+
workingStatus: CREWLY_CONSTANTS.WORKING_STATUSES.IDLE,
|
|
431
|
+
runtimeType: member.runtimeType || RUNTIME_TYPES.CLAUDE_CODE,
|
|
432
|
+
skillOverrides: member.skillOverrides || [],
|
|
433
|
+
excludedRoleSkills: member.excludedRoleSkills || [],
|
|
434
|
+
createdAt: new Date().toISOString(),
|
|
435
|
+
updatedAt: new Date().toISOString()
|
|
436
|
+
};
|
|
437
|
+
teamMembers.push(teamMember);
|
|
438
|
+
}
|
|
439
|
+
const team = {
|
|
440
|
+
id: teamId,
|
|
441
|
+
name,
|
|
442
|
+
description: description || '',
|
|
443
|
+
members: teamMembers,
|
|
444
|
+
projectIds: projectIds || (currentProject ? [currentProject] : []),
|
|
445
|
+
createdAt: new Date().toISOString(),
|
|
446
|
+
updatedAt: new Date().toISOString()
|
|
447
|
+
};
|
|
448
|
+
await this.storageService.saveTeam(team);
|
|
449
|
+
for (const member of teamMembers) {
|
|
450
|
+
if (member.role === 'tpm') {
|
|
451
|
+
// TPM uses file-based workflow (no duplicate messages)
|
|
452
|
+
}
|
|
453
|
+
else {
|
|
454
|
+
this.schedulerService.scheduleDefaultCheckins(member.sessionName);
|
|
455
|
+
}
|
|
456
|
+
}
|
|
457
|
+
res.status(201).json({
|
|
458
|
+
success: true,
|
|
459
|
+
data: team,
|
|
460
|
+
message: 'Team created and sessions started successfully'
|
|
461
|
+
});
|
|
462
|
+
}
|
|
463
|
+
catch (error) {
|
|
464
|
+
console.error('Error creating team:', error);
|
|
465
|
+
res.status(500).json({
|
|
466
|
+
success: false,
|
|
467
|
+
error: error instanceof Error ? error.message : 'Failed to create team'
|
|
468
|
+
});
|
|
469
|
+
}
|
|
470
|
+
}
|
|
471
|
+
export async function getTeams(req, res) {
|
|
472
|
+
try {
|
|
473
|
+
const teams = await this.storageService.getTeams();
|
|
474
|
+
const orchestratorStatus = await this.storageService.getOrchestratorStatus();
|
|
475
|
+
// Check actual PTY session existence for accurate status
|
|
476
|
+
const backend = getSessionBackendSync();
|
|
477
|
+
const orchestratorSessionExists = backend?.sessionExists(CREWLY_CONSTANTS.SESSIONS.ORCHESTRATOR_NAME) || false;
|
|
478
|
+
const actualOrchestratorStatus = resolveAgentStatus(orchestratorStatus?.agentStatus, orchestratorSessionExists);
|
|
479
|
+
const orchestratorTeam = buildOrchestratorTeam(actualOrchestratorStatus, orchestratorStatus);
|
|
480
|
+
// Also update status for team members based on actual session existence
|
|
481
|
+
const teamsWithActualStatus = teams.map(team => ({
|
|
482
|
+
...team,
|
|
483
|
+
members: team.members.map(member => {
|
|
484
|
+
const memberSessionExists = backend?.sessionExists(member.sessionName) || false;
|
|
485
|
+
const resolvedStatus = resolveAgentStatus(member.agentStatus, memberSessionExists);
|
|
486
|
+
return {
|
|
487
|
+
...member,
|
|
488
|
+
agentStatus: resolvedStatus,
|
|
489
|
+
};
|
|
490
|
+
})
|
|
491
|
+
}));
|
|
492
|
+
const allTeams = [orchestratorTeam, ...teamsWithActualStatus];
|
|
493
|
+
res.json({
|
|
494
|
+
success: true,
|
|
495
|
+
data: allTeams,
|
|
496
|
+
orchestrator: {
|
|
497
|
+
...orchestratorStatus,
|
|
498
|
+
agentStatus: actualOrchestratorStatus
|
|
499
|
+
}
|
|
500
|
+
});
|
|
501
|
+
}
|
|
502
|
+
catch (error) {
|
|
503
|
+
console.error('Error getting teams:', error);
|
|
504
|
+
res.status(500).json({
|
|
505
|
+
success: false,
|
|
506
|
+
error: 'Failed to retrieve teams'
|
|
507
|
+
});
|
|
508
|
+
}
|
|
509
|
+
}
|
|
510
|
+
export async function getTeam(req, res) {
|
|
511
|
+
try {
|
|
512
|
+
const { id } = req.params;
|
|
513
|
+
if (id === 'orchestrator') {
|
|
514
|
+
const orchestratorStatus = await this.storageService.getOrchestratorStatus();
|
|
515
|
+
// Check actual PTY session existence for accurate status
|
|
516
|
+
const backend = getSessionBackendSync();
|
|
517
|
+
const orchestratorSessionExists = backend?.sessionExists(CREWLY_CONSTANTS.SESSIONS.ORCHESTRATOR_NAME) || false;
|
|
518
|
+
const actualOrchestratorStatus = resolveAgentStatus(orchestratorStatus?.agentStatus, orchestratorSessionExists);
|
|
519
|
+
const orchestratorTeam = buildOrchestratorTeam(actualOrchestratorStatus, orchestratorStatus);
|
|
520
|
+
res.json({ success: true, data: orchestratorTeam });
|
|
521
|
+
return;
|
|
522
|
+
}
|
|
523
|
+
const teams = await this.storageService.getTeams();
|
|
524
|
+
const team = teams.find(t => t.id === id);
|
|
525
|
+
if (!team) {
|
|
526
|
+
res.status(404).json({ success: false, error: 'Team not found' });
|
|
527
|
+
return;
|
|
528
|
+
}
|
|
529
|
+
// Verify actual session existence for each member to avoid stale status
|
|
530
|
+
const backend = getSessionBackendSync();
|
|
531
|
+
if (backend) {
|
|
532
|
+
for (const member of team.members) {
|
|
533
|
+
if (member.sessionName) {
|
|
534
|
+
const sessionExists = backend.sessionExists(member.sessionName);
|
|
535
|
+
const resolvedStatus = resolveAgentStatus(member.agentStatus, sessionExists);
|
|
536
|
+
member.agentStatus = resolvedStatus;
|
|
537
|
+
if (!sessionExists) {
|
|
538
|
+
member.sessionName = '';
|
|
539
|
+
}
|
|
540
|
+
}
|
|
541
|
+
}
|
|
542
|
+
}
|
|
543
|
+
res.json({ success: true, data: team });
|
|
544
|
+
}
|
|
545
|
+
catch (error) {
|
|
546
|
+
console.error('Error getting team:', error);
|
|
547
|
+
res.status(500).json({ success: false, error: 'Failed to retrieve team' });
|
|
548
|
+
}
|
|
549
|
+
}
|
|
550
|
+
export async function startTeam(req, res) {
|
|
551
|
+
try {
|
|
552
|
+
const { id } = req.params;
|
|
553
|
+
const { projectId } = req.body;
|
|
554
|
+
if (id === ORCHESTRATOR_ROLE) {
|
|
555
|
+
res.status(400).json({
|
|
556
|
+
success: false,
|
|
557
|
+
error: 'Orchestrator is managed at system level. Use /orchestrator/setup endpoint instead.'
|
|
558
|
+
});
|
|
559
|
+
return;
|
|
560
|
+
}
|
|
561
|
+
const teams = await this.storageService.getTeams();
|
|
562
|
+
const team = teams.find(t => t.id === id);
|
|
563
|
+
if (!team) {
|
|
564
|
+
res.status(404).json({ success: false, error: 'Team not found' });
|
|
565
|
+
return;
|
|
566
|
+
}
|
|
567
|
+
const projects = await this.storageService.getProjects();
|
|
568
|
+
let targetProjectId = projectId || team.projectIds[0];
|
|
569
|
+
if (!targetProjectId) {
|
|
570
|
+
res.status(400).json({ success: false, error: 'No project specified. Please select a project to assign this team to.' });
|
|
571
|
+
return;
|
|
572
|
+
}
|
|
573
|
+
const assignedProject = projects.find(p => p.id === targetProjectId);
|
|
574
|
+
if (!assignedProject) {
|
|
575
|
+
res.status(400).json({ success: false, error: 'Selected project not found. Please check project selection.' });
|
|
576
|
+
return;
|
|
577
|
+
}
|
|
578
|
+
// Update team's projectIds to persist the project assignment
|
|
579
|
+
if (!team.projectIds.includes(targetProjectId)) {
|
|
580
|
+
team.projectIds.push(targetProjectId);
|
|
581
|
+
}
|
|
582
|
+
team.updatedAt = new Date().toISOString();
|
|
583
|
+
await this.storageService.saveTeam(team);
|
|
584
|
+
let sessionsCreated = 0;
|
|
585
|
+
let sessionsAlreadyRunning = 0;
|
|
586
|
+
const results = [];
|
|
587
|
+
// PHASE 2: Immediately set ALL members to 'starting' for instant UI feedback
|
|
588
|
+
for (const member of team.members) {
|
|
589
|
+
const mutableMember = member;
|
|
590
|
+
mutableMember.agentStatus = CREWLY_CONSTANTS.AGENT_STATUSES.STARTING;
|
|
591
|
+
mutableMember.updatedAt = new Date().toISOString();
|
|
592
|
+
}
|
|
593
|
+
await this.storageService.saveTeam(team);
|
|
594
|
+
// Start each team member using the internal helper function
|
|
595
|
+
for (const member of team.members) {
|
|
596
|
+
const result = await _startTeamMemberCore(this, team, member, assignedProject.path);
|
|
597
|
+
// Convert internal result to the expected format for the response
|
|
598
|
+
const resultForResponse = {
|
|
599
|
+
memberName: result.memberName,
|
|
600
|
+
sessionName: result.sessionName,
|
|
601
|
+
status: result.status === 'synchronized' ? 'already_running' : result.status,
|
|
602
|
+
success: result.success,
|
|
603
|
+
memberId: result.memberId
|
|
604
|
+
};
|
|
605
|
+
if (result.error) {
|
|
606
|
+
resultForResponse.error = result.error;
|
|
607
|
+
}
|
|
608
|
+
// Count sessions for response
|
|
609
|
+
if (result.success) {
|
|
610
|
+
if (result.status === 'synchronized' || result.status === 'already_active') {
|
|
611
|
+
sessionsAlreadyRunning++;
|
|
612
|
+
}
|
|
613
|
+
else if (result.status !== 'failed') {
|
|
614
|
+
sessionsCreated++;
|
|
615
|
+
}
|
|
616
|
+
}
|
|
617
|
+
results.push(resultForResponse);
|
|
618
|
+
}
|
|
619
|
+
// Note: Individual member sessions save their own status updates during registration
|
|
620
|
+
// No need to save the team object here as it would overwrite the updated agentStatus
|
|
621
|
+
// from MCP registration with stale data
|
|
622
|
+
const responseMessage = `Team started. Created ${sessionsCreated} new sessions, ${sessionsAlreadyRunning} already running. Sessions are working in project: ${assignedProject.name}`;
|
|
623
|
+
res.json({
|
|
624
|
+
success: true,
|
|
625
|
+
message: responseMessage,
|
|
626
|
+
data: { sessionsCreated, sessionsAlreadyRunning, projectName: assignedProject.name, projectPath: assignedProject.path, results }
|
|
627
|
+
});
|
|
628
|
+
}
|
|
629
|
+
catch (error) {
|
|
630
|
+
console.error('Error starting team:', error);
|
|
631
|
+
res.status(500).json({ success: false, error: 'Failed to start team' });
|
|
632
|
+
}
|
|
633
|
+
}
|
|
634
|
+
export async function stopTeam(req, res) {
|
|
635
|
+
try {
|
|
636
|
+
const { id } = req.params;
|
|
637
|
+
if (id === 'orchestrator') {
|
|
638
|
+
res.json({ success: true, message: 'Orchestrator session cannot be stopped as it manages the system', data: { sessionsStopped: 0, sessionsNotFound: 0, results: [] } });
|
|
639
|
+
return;
|
|
640
|
+
}
|
|
641
|
+
const teams = await this.storageService.getTeams();
|
|
642
|
+
const team = teams.find(t => t.id === id);
|
|
643
|
+
if (!team) {
|
|
644
|
+
res.status(404).json({ success: false, error: 'Team not found' });
|
|
645
|
+
return;
|
|
646
|
+
}
|
|
647
|
+
let sessionsStopped = 0;
|
|
648
|
+
let sessionsNotFound = 0;
|
|
649
|
+
const results = [];
|
|
650
|
+
// Stop each team member using the internal helper function
|
|
651
|
+
for (const member of team.members) {
|
|
652
|
+
if (!member.sessionName) {
|
|
653
|
+
// Handle members with no active session
|
|
654
|
+
results.push({ memberName: member.name, memberId: member.id, sessionName: null, status: 'no_session', success: true });
|
|
655
|
+
continue;
|
|
656
|
+
}
|
|
657
|
+
const result = await _stopTeamMemberCore(this, team, member);
|
|
658
|
+
// Convert internal result to the expected format for the response
|
|
659
|
+
const resultForResponse = {
|
|
660
|
+
memberName: result.memberName,
|
|
661
|
+
memberId: result.memberId,
|
|
662
|
+
sessionName: result.sessionName,
|
|
663
|
+
status: result.success ? 'stopped' : (result.status === 'failed' ? 'failed' : 'not_found'),
|
|
664
|
+
success: result.success,
|
|
665
|
+
};
|
|
666
|
+
if (result.error) {
|
|
667
|
+
resultForResponse.error = result.error;
|
|
668
|
+
}
|
|
669
|
+
// Count sessions for response
|
|
670
|
+
if (result.success) {
|
|
671
|
+
sessionsStopped++;
|
|
672
|
+
}
|
|
673
|
+
else if (result.status === 'not_found' || (result.error && result.error.includes('not found'))) {
|
|
674
|
+
sessionsNotFound++;
|
|
675
|
+
resultForResponse.status = 'not_found';
|
|
676
|
+
}
|
|
677
|
+
results.push(resultForResponse);
|
|
678
|
+
}
|
|
679
|
+
// Update team timestamp after all members have been processed
|
|
680
|
+
team.updatedAt = new Date().toISOString();
|
|
681
|
+
await this.storageService.saveTeam(team);
|
|
682
|
+
if (this.messageSchedulerService) {
|
|
683
|
+
try {
|
|
684
|
+
const scheduledMessages = await this.storageService.getScheduledMessages();
|
|
685
|
+
const teamMessages = scheduledMessages.filter(msg => msg.targetTeam === team.id);
|
|
686
|
+
for (const message of teamMessages) {
|
|
687
|
+
const mutableMessage = { ...message, isActive: false };
|
|
688
|
+
await this.storageService.saveScheduledMessage(mutableMessage);
|
|
689
|
+
this.messageSchedulerService.cancelMessage(message.id);
|
|
690
|
+
}
|
|
691
|
+
}
|
|
692
|
+
catch (error) {
|
|
693
|
+
console.error('Error cancelling team scheduled messages:', error);
|
|
694
|
+
}
|
|
695
|
+
}
|
|
696
|
+
res.json({ success: true, message: `Team stopped. Stopped ${sessionsStopped} sessions, ${sessionsNotFound} were already stopped.`, data: { sessionsStopped, sessionsNotFound, results } });
|
|
697
|
+
}
|
|
698
|
+
catch (error) {
|
|
699
|
+
console.error('Error stopping team:', error);
|
|
700
|
+
res.status(500).json({ success: false, error: 'Failed to stop team' });
|
|
701
|
+
}
|
|
702
|
+
}
|
|
703
|
+
export async function getTeamWorkload(req, res) {
|
|
704
|
+
try {
|
|
705
|
+
const { id } = req.params;
|
|
706
|
+
const teams = await this.storageService.getTeams();
|
|
707
|
+
const team = teams.find(t => t.id === id);
|
|
708
|
+
if (!team) {
|
|
709
|
+
res.status(404).json({ success: false, error: 'Team not found' });
|
|
710
|
+
return;
|
|
711
|
+
}
|
|
712
|
+
const projects = await this.storageService.getProjects();
|
|
713
|
+
let assignedTickets = 0;
|
|
714
|
+
let completedTickets = 0;
|
|
715
|
+
for (const project of projects) {
|
|
716
|
+
const tickets = await this.storageService.getTickets(project.path, { assignedTo: id });
|
|
717
|
+
assignedTickets += tickets.length;
|
|
718
|
+
completedTickets += tickets.filter((t) => t.status === 'done').length;
|
|
719
|
+
}
|
|
720
|
+
res.json({ success: true, data: { teamId: id, teamName: team.name, assignedTickets, completedTickets, workloadPercentage: assignedTickets > 0 ? Math.round((completedTickets / assignedTickets) * 100) : 0 } });
|
|
721
|
+
}
|
|
722
|
+
catch (error) {
|
|
723
|
+
console.error('Error getting team workload:', error);
|
|
724
|
+
res.status(500).json({ success: false, error: 'Failed to retrieve team workload' });
|
|
725
|
+
}
|
|
726
|
+
}
|
|
727
|
+
export async function deleteTeam(req, res) {
|
|
728
|
+
try {
|
|
729
|
+
const { id } = req.params;
|
|
730
|
+
if (id === 'orchestrator') {
|
|
731
|
+
res.status(400).json({ success: false, error: 'Cannot delete the Orchestrator Team' });
|
|
732
|
+
return;
|
|
733
|
+
}
|
|
734
|
+
const teams = await this.storageService.getTeams();
|
|
735
|
+
const team = teams.find(t => t.id === id);
|
|
736
|
+
if (!team) {
|
|
737
|
+
res.status(404).json({ success: false, error: 'Team not found' });
|
|
738
|
+
return;
|
|
739
|
+
}
|
|
740
|
+
try {
|
|
741
|
+
const orchestratorSession = CREWLY_CONSTANTS.SESSIONS.ORCHESTRATOR_NAME;
|
|
742
|
+
const sessionExists = await this.tmuxService.sessionExists(orchestratorSession);
|
|
743
|
+
if (sessionExists) {
|
|
744
|
+
const sessionNames = team.members?.map(m => m.sessionName).filter(Boolean) || [];
|
|
745
|
+
const orchestratorPrompt = `## Team Deletion Notification\n\nTeam **"${team.name}"** (ID: ${id}) is being deleted.\n\n### Sessions to be terminated:\n${sessionNames.length > 0 ? sessionNames.map(name => `- ${name}`).join('\n') : '- No active sessions'}\n\n### Team Details:\n- **Team Name**: ${team.name}\n- **Members**: ${team.members?.length || 0}\n- **Current Projects**: ${team.projectIds?.length ? team.projectIds.join(', ') : 'None'}\n\nThe orchestrator should be aware that these team members are no longer available for task delegation.\n\n---\n*Team deletion initiated by user request.*`;
|
|
746
|
+
await this.tmuxService.sendMessage(orchestratorSession, orchestratorPrompt);
|
|
747
|
+
}
|
|
748
|
+
}
|
|
749
|
+
catch (notificationError) {
|
|
750
|
+
console.warn('Failed to notify orchestrator about team deletion:', notificationError);
|
|
751
|
+
}
|
|
752
|
+
if (team.members && team.members.length > 0) {
|
|
753
|
+
for (const member of team.members) {
|
|
754
|
+
if (member.sessionName) {
|
|
755
|
+
try {
|
|
756
|
+
await this.tmuxService.killSession(member.sessionName);
|
|
757
|
+
this.schedulerService.cancelAllChecksForSession(member.sessionName);
|
|
758
|
+
}
|
|
759
|
+
catch (error) {
|
|
760
|
+
console.warn(`Failed to kill session for member ${member.name}:`, error);
|
|
761
|
+
}
|
|
762
|
+
}
|
|
763
|
+
}
|
|
764
|
+
}
|
|
765
|
+
await this.storageService.deleteTeam(id);
|
|
766
|
+
res.json({ success: true, message: 'Team terminated successfully' });
|
|
767
|
+
}
|
|
768
|
+
catch (error) {
|
|
769
|
+
console.error('Error deleting team:', error);
|
|
770
|
+
res.status(500).json({ success: false, error: 'Failed to terminate team' });
|
|
771
|
+
}
|
|
772
|
+
}
|
|
773
|
+
export async function getTeamMemberSession(req, res) {
|
|
774
|
+
try {
|
|
775
|
+
const { teamId, memberId } = req.params;
|
|
776
|
+
const { lines = 50 } = req.query;
|
|
777
|
+
const teams = await this.storageService.getTeams();
|
|
778
|
+
const team = teams.find(t => t.id === teamId);
|
|
779
|
+
if (!team) {
|
|
780
|
+
res.status(404).json({ success: false, error: 'Team not found' });
|
|
781
|
+
return;
|
|
782
|
+
}
|
|
783
|
+
const member = team.members?.find(m => m.id === memberId);
|
|
784
|
+
if (!member) {
|
|
785
|
+
res.status(404).json({ success: false, error: 'Team member not found' });
|
|
786
|
+
return;
|
|
787
|
+
}
|
|
788
|
+
if (!member.sessionName) {
|
|
789
|
+
res.status(400).json({ success: false, error: 'No active session for this team member' });
|
|
790
|
+
return;
|
|
791
|
+
}
|
|
792
|
+
const output = await this.tmuxService.capturePane(member.sessionName, Number(lines));
|
|
793
|
+
res.json({ success: true, data: { memberId: member.id, memberName: member.name, sessionName: member.sessionName, output, timestamp: new Date().toISOString() } });
|
|
794
|
+
}
|
|
795
|
+
catch (error) {
|
|
796
|
+
console.error('Error getting team member session:', error);
|
|
797
|
+
res.status(500).json({ success: false, error: 'Failed to get team member session' });
|
|
798
|
+
}
|
|
799
|
+
}
|
|
800
|
+
export async function addTeamMember(req, res) {
|
|
801
|
+
try {
|
|
802
|
+
const { id } = req.params;
|
|
803
|
+
const { name, role, avatar } = req.body;
|
|
804
|
+
if (!name || !role) {
|
|
805
|
+
res.status(400).json({ success: false, error: 'Name and role are required' });
|
|
806
|
+
return;
|
|
807
|
+
}
|
|
808
|
+
const teams = await this.storageService.getTeams();
|
|
809
|
+
const team = teams.find(t => t.id === id);
|
|
810
|
+
if (!team) {
|
|
811
|
+
res.status(404).json({ success: false, error: 'Team not found' });
|
|
812
|
+
return;
|
|
813
|
+
}
|
|
814
|
+
const newMember = {
|
|
815
|
+
id: `member-${Date.now()}-${Math.random().toString(36).substr(2, 9)}`,
|
|
816
|
+
name: String(name).trim(),
|
|
817
|
+
sessionName: '',
|
|
818
|
+
role: role,
|
|
819
|
+
avatar: avatar,
|
|
820
|
+
systemPrompt: `You are ${name}, a ${role} on the ${team.name} team.`,
|
|
821
|
+
agentStatus: CREWLY_CONSTANTS.AGENT_STATUSES.INACTIVE,
|
|
822
|
+
workingStatus: CREWLY_CONSTANTS.WORKING_STATUSES.IDLE,
|
|
823
|
+
runtimeType: RUNTIME_TYPES.CLAUDE_CODE,
|
|
824
|
+
createdAt: new Date().toISOString(),
|
|
825
|
+
updatedAt: new Date().toISOString()
|
|
826
|
+
};
|
|
827
|
+
team.members.push(newMember);
|
|
828
|
+
team.updatedAt = new Date().toISOString();
|
|
829
|
+
await this.storageService.saveTeam(team);
|
|
830
|
+
res.json({ success: true, data: newMember, message: 'Team member added successfully' });
|
|
831
|
+
}
|
|
832
|
+
catch (error) {
|
|
833
|
+
console.error('Error adding team member:', error);
|
|
834
|
+
res.status(500).json({ success: false, error: 'Failed to add team member' });
|
|
835
|
+
}
|
|
836
|
+
}
|
|
837
|
+
export async function updateTeamMember(req, res) {
|
|
838
|
+
try {
|
|
839
|
+
const { teamId, memberId } = req.params;
|
|
840
|
+
const updates = req.body;
|
|
841
|
+
const teams = await this.storageService.getTeams();
|
|
842
|
+
const team = teams.find(t => t.id === teamId);
|
|
843
|
+
if (!team) {
|
|
844
|
+
res.status(404).json({ success: false, error: 'Team not found' });
|
|
845
|
+
return;
|
|
846
|
+
}
|
|
847
|
+
const memberIndex = team.members.findIndex(m => m.id === memberId);
|
|
848
|
+
if (memberIndex === -1) {
|
|
849
|
+
res.status(404).json({ success: false, error: 'Team member not found' });
|
|
850
|
+
return;
|
|
851
|
+
}
|
|
852
|
+
const updatedMember = { ...team.members[memberIndex], ...updates, updatedAt: new Date().toISOString() };
|
|
853
|
+
team.members[memberIndex] = updatedMember;
|
|
854
|
+
team.updatedAt = new Date().toISOString();
|
|
855
|
+
await this.storageService.saveTeam(team);
|
|
856
|
+
res.json({ success: true, data: updatedMember, message: 'Team member updated successfully' });
|
|
857
|
+
}
|
|
858
|
+
catch (error) {
|
|
859
|
+
console.error('Error updating team member:', error);
|
|
860
|
+
res.status(500).json({ success: false, error: 'Failed to update team member' });
|
|
861
|
+
}
|
|
862
|
+
}
|
|
863
|
+
export async function deleteTeamMember(req, res) {
|
|
864
|
+
try {
|
|
865
|
+
const { teamId, memberId } = req.params;
|
|
866
|
+
const teams = await this.storageService.getTeams();
|
|
867
|
+
const team = teams.find(t => t.id === teamId);
|
|
868
|
+
if (!team) {
|
|
869
|
+
res.status(404).json({ success: false, error: 'Team not found' });
|
|
870
|
+
return;
|
|
871
|
+
}
|
|
872
|
+
const memberIndex = team.members.findIndex(m => m.id === memberId);
|
|
873
|
+
if (memberIndex === -1) {
|
|
874
|
+
res.status(404).json({ success: false, error: 'Team member not found' });
|
|
875
|
+
return;
|
|
876
|
+
}
|
|
877
|
+
const member = team.members[memberIndex];
|
|
878
|
+
if (member.sessionName) {
|
|
879
|
+
try {
|
|
880
|
+
await this.tmuxService.killSession(member.sessionName);
|
|
881
|
+
}
|
|
882
|
+
catch (error) {
|
|
883
|
+
console.warn(`Failed to kill tmux session ${member.sessionName}:`, error);
|
|
884
|
+
}
|
|
885
|
+
}
|
|
886
|
+
team.members.splice(memberIndex, 1);
|
|
887
|
+
team.updatedAt = new Date().toISOString();
|
|
888
|
+
await this.storageService.saveTeam(team);
|
|
889
|
+
res.json({ success: true, message: 'Team member removed successfully' });
|
|
890
|
+
}
|
|
891
|
+
catch (error) {
|
|
892
|
+
console.error('Error deleting team member:', error);
|
|
893
|
+
res.status(500).json({ success: false, error: 'Failed to delete team member' });
|
|
894
|
+
}
|
|
895
|
+
}
|
|
896
|
+
export async function startTeamMember(req, res) {
|
|
897
|
+
try {
|
|
898
|
+
const { teamId, memberId } = req.params;
|
|
899
|
+
const teams = await this.storageService.getTeams();
|
|
900
|
+
const team = teams.find(t => t.id === teamId);
|
|
901
|
+
if (!team) {
|
|
902
|
+
res.status(404).json({ success: false, error: 'Team not found' });
|
|
903
|
+
return;
|
|
904
|
+
}
|
|
905
|
+
const member = team.members.find(m => m.id === memberId);
|
|
906
|
+
if (!member) {
|
|
907
|
+
res.status(404).json({ success: false, error: 'Team member not found' });
|
|
908
|
+
return;
|
|
909
|
+
}
|
|
910
|
+
// PHASE 3: Immediately set target member to 'starting' for instant UI feedback
|
|
911
|
+
const mutableMember = member;
|
|
912
|
+
mutableMember.agentStatus = CREWLY_CONSTANTS.AGENT_STATUSES.STARTING;
|
|
913
|
+
mutableMember.updatedAt = new Date().toISOString();
|
|
914
|
+
await this.storageService.saveTeam(team);
|
|
915
|
+
// Get project path if team has a current project
|
|
916
|
+
let projectPath;
|
|
917
|
+
if (team.projectIds[0]) {
|
|
918
|
+
const projects = await this.storageService.getProjects();
|
|
919
|
+
const project = projects.find(p => p.id === team.projectIds[0]);
|
|
920
|
+
projectPath = project?.path;
|
|
921
|
+
}
|
|
922
|
+
// Use the internal helper function to start the team member
|
|
923
|
+
const result = await _startTeamMemberCore(this, team, member, projectPath);
|
|
924
|
+
// Handle the result and respond appropriately
|
|
925
|
+
if (result.success) {
|
|
926
|
+
if (result.status === 'synchronized') {
|
|
927
|
+
res.json({
|
|
928
|
+
success: true,
|
|
929
|
+
message: 'Agent status synchronized with active session',
|
|
930
|
+
data: {
|
|
931
|
+
memberId: result.memberId,
|
|
932
|
+
sessionName: result.sessionName,
|
|
933
|
+
status: CREWLY_CONSTANTS.AGENT_STATUSES.ACTIVE
|
|
934
|
+
}
|
|
935
|
+
});
|
|
936
|
+
}
|
|
937
|
+
else {
|
|
938
|
+
res.json({
|
|
939
|
+
success: true,
|
|
940
|
+
data: {
|
|
941
|
+
memberId: result.memberId,
|
|
942
|
+
sessionName: result.sessionName,
|
|
943
|
+
status: result.status
|
|
944
|
+
},
|
|
945
|
+
message: `Team member ${result.memberName} started successfully`
|
|
946
|
+
});
|
|
947
|
+
}
|
|
948
|
+
}
|
|
949
|
+
else {
|
|
950
|
+
if (result.status === 'already_active') {
|
|
951
|
+
res.status(400).json({
|
|
952
|
+
success: false,
|
|
953
|
+
error: result.error || 'Team member already has an active session'
|
|
954
|
+
});
|
|
955
|
+
}
|
|
956
|
+
else if (result.error?.includes('already')) {
|
|
957
|
+
res.status(400).json({
|
|
958
|
+
success: false,
|
|
959
|
+
error: result.error
|
|
960
|
+
});
|
|
961
|
+
}
|
|
962
|
+
else {
|
|
963
|
+
res.status(500).json({
|
|
964
|
+
success: false,
|
|
965
|
+
error: result.error || 'Failed to start team member'
|
|
966
|
+
});
|
|
967
|
+
}
|
|
968
|
+
}
|
|
969
|
+
}
|
|
970
|
+
catch (error) {
|
|
971
|
+
console.error('Error starting team member:', error);
|
|
972
|
+
res.status(500).json({ success: false, error: 'Failed to start team member' });
|
|
973
|
+
}
|
|
974
|
+
}
|
|
975
|
+
export async function stopTeamMember(req, res) {
|
|
976
|
+
try {
|
|
977
|
+
const { teamId, memberId } = req.params;
|
|
978
|
+
const teams = await this.storageService.getTeams();
|
|
979
|
+
const team = teams.find(t => t.id === teamId);
|
|
980
|
+
if (!team) {
|
|
981
|
+
res.status(404).json({ success: false, error: 'Team not found' });
|
|
982
|
+
return;
|
|
983
|
+
}
|
|
984
|
+
const member = team.members.find(m => m.id === memberId);
|
|
985
|
+
if (!member) {
|
|
986
|
+
res.status(404).json({ success: false, error: 'Team member not found' });
|
|
987
|
+
return;
|
|
988
|
+
}
|
|
989
|
+
// Use the internal helper function to stop the team member
|
|
990
|
+
const result = await _stopTeamMemberCore(this, team, member);
|
|
991
|
+
// Handle the result and respond appropriately
|
|
992
|
+
if (result.success) {
|
|
993
|
+
res.json({
|
|
994
|
+
success: true,
|
|
995
|
+
data: {
|
|
996
|
+
memberId: result.memberId,
|
|
997
|
+
status: CREWLY_CONSTANTS.AGENT_STATUSES.INACTIVE
|
|
998
|
+
},
|
|
999
|
+
message: `Team member ${result.memberName} stopped successfully`
|
|
1000
|
+
});
|
|
1001
|
+
}
|
|
1002
|
+
else {
|
|
1003
|
+
res.status(500).json({
|
|
1004
|
+
success: false,
|
|
1005
|
+
error: result.error || 'Failed to stop team member'
|
|
1006
|
+
});
|
|
1007
|
+
}
|
|
1008
|
+
}
|
|
1009
|
+
catch (error) {
|
|
1010
|
+
console.error('Error stopping team member:', error);
|
|
1011
|
+
res.status(500).json({ success: false, error: 'Failed to stop team member' });
|
|
1012
|
+
}
|
|
1013
|
+
}
|
|
1014
|
+
export async function reportMemberReady(req, res) {
|
|
1015
|
+
try {
|
|
1016
|
+
const { sessionName, role, capabilities, readyAt } = req.body;
|
|
1017
|
+
if (!sessionName || !role) {
|
|
1018
|
+
res.status(400).json({ success: false, error: 'sessionName and role are required' });
|
|
1019
|
+
return;
|
|
1020
|
+
}
|
|
1021
|
+
const teams = await this.storageService.getTeams();
|
|
1022
|
+
let memberFound = false;
|
|
1023
|
+
for (const team of teams) {
|
|
1024
|
+
for (const member of team.members) {
|
|
1025
|
+
if (member.sessionName === sessionName) {
|
|
1026
|
+
const mutableMember = member;
|
|
1027
|
+
mutableMember.readyAt = readyAt || new Date().toISOString();
|
|
1028
|
+
mutableMember.capabilities = capabilities || [];
|
|
1029
|
+
memberFound = true;
|
|
1030
|
+
break;
|
|
1031
|
+
}
|
|
1032
|
+
}
|
|
1033
|
+
if (memberFound) {
|
|
1034
|
+
team.updatedAt = new Date().toISOString();
|
|
1035
|
+
await this.storageService.saveTeam(team);
|
|
1036
|
+
break;
|
|
1037
|
+
}
|
|
1038
|
+
}
|
|
1039
|
+
if (!memberFound) {
|
|
1040
|
+
console.warn(`Session ${sessionName} not found in any team, but reporting ready anyway`);
|
|
1041
|
+
}
|
|
1042
|
+
res.json({ success: true, message: `Agent ${sessionName} reported ready with role ${role}`, data: { sessionName, role, capabilities, readyAt } });
|
|
1043
|
+
}
|
|
1044
|
+
catch (error) {
|
|
1045
|
+
console.error('Error reporting member ready:', error);
|
|
1046
|
+
res.status(500).json({ success: false, error: 'Failed to report member ready' });
|
|
1047
|
+
}
|
|
1048
|
+
}
|
|
1049
|
+
export async function registerMemberStatus(req, res) {
|
|
1050
|
+
try {
|
|
1051
|
+
const { sessionName, role, status, registeredAt, memberId, claudeSessionId } = req.body;
|
|
1052
|
+
// Update agent heartbeat (proof of life)
|
|
1053
|
+
try {
|
|
1054
|
+
await updateAgentHeartbeat(sessionName, memberId, CREWLY_CONSTANTS.AGENT_STATUSES.ACTIVE);
|
|
1055
|
+
}
|
|
1056
|
+
catch {
|
|
1057
|
+
// Continue execution - heartbeat failures shouldn't break registration
|
|
1058
|
+
}
|
|
1059
|
+
if (!sessionName || !role) {
|
|
1060
|
+
res.status(400).json({ success: false, error: 'sessionName and role are required' });
|
|
1061
|
+
return;
|
|
1062
|
+
}
|
|
1063
|
+
// Handle orchestrator registration separately
|
|
1064
|
+
if (role === 'orchestrator' && sessionName === CREWLY_CONSTANTS.SESSIONS.ORCHESTRATOR_NAME) {
|
|
1065
|
+
try {
|
|
1066
|
+
await this.storageService.updateOrchestratorStatus(CREWLY_CONSTANTS.AGENT_STATUSES.ACTIVE);
|
|
1067
|
+
// Broadcast orchestrator status change via WebSocket for real-time UI updates
|
|
1068
|
+
const terminalGateway = getTerminalGateway();
|
|
1069
|
+
if (terminalGateway) {
|
|
1070
|
+
terminalGateway.broadcastOrchestratorStatus({
|
|
1071
|
+
sessionName,
|
|
1072
|
+
agentStatus: CREWLY_CONSTANTS.AGENT_STATUSES.ACTIVE,
|
|
1073
|
+
workingStatus: CREWLY_CONSTANTS.WORKING_STATUSES.IDLE,
|
|
1074
|
+
});
|
|
1075
|
+
}
|
|
1076
|
+
// Auto-subscribe orchestrator to agent lifecycle events for real-time notifications
|
|
1077
|
+
ensureOrchestratorSubscriptions();
|
|
1078
|
+
res.json({ success: true, message: `Orchestrator ${sessionName} registered as active`, sessionName });
|
|
1079
|
+
return;
|
|
1080
|
+
}
|
|
1081
|
+
catch (error) {
|
|
1082
|
+
console.error('Error updating orchestrator status:', error);
|
|
1083
|
+
res.status(500).json({ success: false, error: 'Failed to update orchestrator status' });
|
|
1084
|
+
return;
|
|
1085
|
+
}
|
|
1086
|
+
}
|
|
1087
|
+
// Find the team member to update
|
|
1088
|
+
const teams = await this.storageService.getTeams();
|
|
1089
|
+
let targetTeamId = null;
|
|
1090
|
+
let targetMemberId = null;
|
|
1091
|
+
for (const team of teams) {
|
|
1092
|
+
for (const member of team.members) {
|
|
1093
|
+
const matchesId = memberId && member.id === memberId;
|
|
1094
|
+
const matchesSession = member.sessionName === sessionName;
|
|
1095
|
+
if (matchesId || matchesSession) {
|
|
1096
|
+
targetTeamId = team.id;
|
|
1097
|
+
targetMemberId = member.id;
|
|
1098
|
+
break;
|
|
1099
|
+
}
|
|
1100
|
+
}
|
|
1101
|
+
if (targetTeamId)
|
|
1102
|
+
break;
|
|
1103
|
+
}
|
|
1104
|
+
// Load fresh team data and apply registration changes to avoid race conditions
|
|
1105
|
+
if (!targetTeamId || !targetMemberId) {
|
|
1106
|
+
console.warn(`registerMemberStatus: agent not found in any team`, { sessionName, role, memberId });
|
|
1107
|
+
res.status(404).json({ success: false, error: `Agent with sessionName '${sessionName}' not found in any team` });
|
|
1108
|
+
return;
|
|
1109
|
+
}
|
|
1110
|
+
const freshTeams = await this.storageService.getTeams();
|
|
1111
|
+
const freshTeam = freshTeams.find(t => t.id === targetTeamId);
|
|
1112
|
+
if (freshTeam) {
|
|
1113
|
+
const freshMember = freshTeam.members.find(m => m.id === targetMemberId);
|
|
1114
|
+
if (freshMember) {
|
|
1115
|
+
freshMember.agentStatus = CREWLY_CONSTANTS.AGENT_STATUSES.ACTIVE;
|
|
1116
|
+
freshMember.workingStatus = freshMember.workingStatus || CREWLY_CONSTANTS.WORKING_STATUSES.IDLE;
|
|
1117
|
+
freshMember.readyAt = registeredAt || new Date().toISOString();
|
|
1118
|
+
if (memberId && freshMember.id === memberId && !freshMember.sessionName) {
|
|
1119
|
+
freshMember.sessionName = sessionName;
|
|
1120
|
+
}
|
|
1121
|
+
freshTeam.updatedAt = new Date().toISOString();
|
|
1122
|
+
await this.storageService.saveTeam(freshTeam);
|
|
1123
|
+
}
|
|
1124
|
+
}
|
|
1125
|
+
// Store claudeSessionId for resume-on-restart support
|
|
1126
|
+
if (claudeSessionId) {
|
|
1127
|
+
try {
|
|
1128
|
+
const persistence = getSessionStatePersistence();
|
|
1129
|
+
persistence.updateSessionId(sessionName, claudeSessionId);
|
|
1130
|
+
}
|
|
1131
|
+
catch (persistError) {
|
|
1132
|
+
// Non-fatal: resume just won't work on next restart
|
|
1133
|
+
console.warn('Failed to persist claudeSessionId:', persistError);
|
|
1134
|
+
}
|
|
1135
|
+
}
|
|
1136
|
+
res.json({ success: true, message: `Agent ${sessionName} registered as active with role ${role}`, data: { sessionName, role, status: CREWLY_CONSTANTS.AGENT_STATUSES.ACTIVE, registeredAt: registeredAt || new Date().toISOString() } });
|
|
1137
|
+
// Flush any queued messages for this sub-agent (fire-and-forget after response)
|
|
1138
|
+
const subAgentQueue = SubAgentMessageQueue.getInstance();
|
|
1139
|
+
if (subAgentQueue.hasPending(sessionName)) {
|
|
1140
|
+
const runtimeType = (freshTeam?.members.find(m => m.id === targetMemberId)?.runtimeType || RUNTIME_TYPES.CLAUDE_CODE);
|
|
1141
|
+
const queuedMessages = subAgentQueue.dequeueAll(sessionName);
|
|
1142
|
+
console.log(`[registerMemberStatus] Flushing ${queuedMessages.length} queued message(s) to ${sessionName}`);
|
|
1143
|
+
// Deliver sequentially in the background
|
|
1144
|
+
(async () => {
|
|
1145
|
+
for (const queuedMsg of queuedMessages) {
|
|
1146
|
+
try {
|
|
1147
|
+
await this.agentRegistrationService.sendMessageToAgent(sessionName, queuedMsg.data, runtimeType);
|
|
1148
|
+
console.log(`[registerMemberStatus] Delivered queued message to ${sessionName} (queued at ${new Date(queuedMsg.queuedAt).toISOString()})`);
|
|
1149
|
+
}
|
|
1150
|
+
catch (flushError) {
|
|
1151
|
+
console.error(`[registerMemberStatus] Failed to deliver queued message to ${sessionName}:`, flushError);
|
|
1152
|
+
}
|
|
1153
|
+
// Delay between messages to let the agent process each one
|
|
1154
|
+
if (queuedMessages.indexOf(queuedMsg) < queuedMessages.length - 1) {
|
|
1155
|
+
await new Promise(resolve => setTimeout(resolve, SUB_AGENT_QUEUE_CONSTANTS.FLUSH_INTER_MESSAGE_DELAY));
|
|
1156
|
+
}
|
|
1157
|
+
}
|
|
1158
|
+
})().catch(err => {
|
|
1159
|
+
console.error(`[registerMemberStatus] Queue flush failed for ${sessionName}:`, err);
|
|
1160
|
+
});
|
|
1161
|
+
}
|
|
1162
|
+
}
|
|
1163
|
+
catch (error) {
|
|
1164
|
+
console.error('Error in registerMemberStatus:', error);
|
|
1165
|
+
res.status(500).json({ success: false, error: 'Failed to register member status' });
|
|
1166
|
+
}
|
|
1167
|
+
}
|
|
1168
|
+
export async function generateMemberContext(req, res) {
|
|
1169
|
+
try {
|
|
1170
|
+
const { teamId, memberId } = req.params;
|
|
1171
|
+
const options = req.query;
|
|
1172
|
+
const teams = await this.storageService.getTeams();
|
|
1173
|
+
const team = teams.find(t => t.id === teamId);
|
|
1174
|
+
if (!team) {
|
|
1175
|
+
res.status(404).json({ success: false, error: 'Team not found' });
|
|
1176
|
+
return;
|
|
1177
|
+
}
|
|
1178
|
+
const member = team.members.find(m => m.id === memberId);
|
|
1179
|
+
if (!member) {
|
|
1180
|
+
res.status(404).json({ success: false, error: 'Team member not found' });
|
|
1181
|
+
return;
|
|
1182
|
+
}
|
|
1183
|
+
const projects = await this.storageService.getProjects();
|
|
1184
|
+
const project = projects.find(p => Object.values(p.teams || {}).flat().includes(teamId));
|
|
1185
|
+
if (!project) {
|
|
1186
|
+
res.status(404).json({ success: false, error: 'No project found for this team' });
|
|
1187
|
+
return;
|
|
1188
|
+
}
|
|
1189
|
+
const contextLoader = new (await import('../../services/index.js')).ContextLoaderService(project.path);
|
|
1190
|
+
const contextPrompt = await contextLoader.generateContextPrompt(member, {
|
|
1191
|
+
includeFiles: options.includeFiles !== 'false',
|
|
1192
|
+
includeGitHistory: options.includeGitHistory !== 'false',
|
|
1193
|
+
includeTickets: options.includeTickets !== 'false'
|
|
1194
|
+
});
|
|
1195
|
+
res.json({ success: true, data: { teamId, memberId, memberName: member.name, contextPrompt, generatedAt: new Date().toISOString() } });
|
|
1196
|
+
}
|
|
1197
|
+
catch (error) {
|
|
1198
|
+
console.error('Error generating member context:', error);
|
|
1199
|
+
res.status(500).json({ success: false, error: 'Failed to generate member context' });
|
|
1200
|
+
}
|
|
1201
|
+
}
|
|
1202
|
+
export async function injectContextIntoSession(req, res) {
|
|
1203
|
+
try {
|
|
1204
|
+
const { teamId, memberId } = req.params;
|
|
1205
|
+
const teams = await this.storageService.getTeams();
|
|
1206
|
+
const team = teams.find(t => t.id === teamId);
|
|
1207
|
+
if (!team) {
|
|
1208
|
+
res.status(404).json({ success: false, error: 'Team not found' });
|
|
1209
|
+
return;
|
|
1210
|
+
}
|
|
1211
|
+
const member = team.members.find(m => m.id === memberId);
|
|
1212
|
+
if (!member) {
|
|
1213
|
+
res.status(404).json({ success: false, error: 'Team member not found' });
|
|
1214
|
+
return;
|
|
1215
|
+
}
|
|
1216
|
+
const projects = await this.storageService.getProjects();
|
|
1217
|
+
const project = projects.find(p => Object.values(p.teams || {}).flat().includes(teamId));
|
|
1218
|
+
if (!project) {
|
|
1219
|
+
res.status(404).json({ success: false, error: 'No project found for this team' });
|
|
1220
|
+
return;
|
|
1221
|
+
}
|
|
1222
|
+
const { ContextLoaderService } = await import('../../services/index.js');
|
|
1223
|
+
const contextLoader = new ContextLoaderService(project.path);
|
|
1224
|
+
const success = await contextLoader.injectContextIntoSession(member.sessionName, member, this.tmuxService);
|
|
1225
|
+
if (!success) {
|
|
1226
|
+
res.status(500).json({ success: false, error: 'Failed to inject context into session' });
|
|
1227
|
+
return;
|
|
1228
|
+
}
|
|
1229
|
+
res.json({ success: true, data: { teamId, memberId, memberName: member.name, sessionName: member.sessionName, contextInjected: true, injectedAt: new Date().toISOString() } });
|
|
1230
|
+
}
|
|
1231
|
+
catch (error) {
|
|
1232
|
+
console.error('Error injecting context into session:', error);
|
|
1233
|
+
res.status(500).json({ success: false, error: 'Failed to inject context into session' });
|
|
1234
|
+
}
|
|
1235
|
+
}
|
|
1236
|
+
export async function refreshMemberContext(req, res) {
|
|
1237
|
+
try {
|
|
1238
|
+
const { teamId, memberId } = req.params;
|
|
1239
|
+
const teams = await this.storageService.getTeams();
|
|
1240
|
+
const team = teams.find(t => t.id === teamId);
|
|
1241
|
+
if (!team) {
|
|
1242
|
+
res.status(404).json({ success: false, error: 'Team not found' });
|
|
1243
|
+
return;
|
|
1244
|
+
}
|
|
1245
|
+
const member = team.members.find(m => m.id === memberId);
|
|
1246
|
+
if (!member) {
|
|
1247
|
+
res.status(404).json({ success: false, error: 'Team member not found' });
|
|
1248
|
+
return;
|
|
1249
|
+
}
|
|
1250
|
+
const projects = await this.storageService.getProjects();
|
|
1251
|
+
const project = projects.find(p => Object.values(p.teams || {}).flat().includes(teamId));
|
|
1252
|
+
if (!project) {
|
|
1253
|
+
res.status(404).json({ success: false, error: 'No project found for this team' });
|
|
1254
|
+
return;
|
|
1255
|
+
}
|
|
1256
|
+
const { ContextLoaderService } = await import('../../services/index.js');
|
|
1257
|
+
const contextLoader = new ContextLoaderService(project.path);
|
|
1258
|
+
const contextPath = await contextLoader.refreshContext(member);
|
|
1259
|
+
res.json({ success: true, data: { teamId, memberId, memberName: member.name, contextPath, refreshedAt: new Date().toISOString() } });
|
|
1260
|
+
}
|
|
1261
|
+
catch (error) {
|
|
1262
|
+
console.error('Error refreshing member context:', error);
|
|
1263
|
+
res.status(500).json({ success: false, error: 'Failed to refresh member context' });
|
|
1264
|
+
}
|
|
1265
|
+
}
|
|
1266
|
+
export async function getTeamActivityStatus(req, res) {
|
|
1267
|
+
try {
|
|
1268
|
+
const now = new Date().toISOString();
|
|
1269
|
+
const orchestratorRunning = await this.tmuxService.sessionExists(CREWLY_CONSTANTS.SESSIONS.ORCHESTRATOR_NAME);
|
|
1270
|
+
const teams = await this.storageService.getTeams();
|
|
1271
|
+
const memberStatuses = [];
|
|
1272
|
+
const teamsToUpdate = [];
|
|
1273
|
+
// Get current task assignments
|
|
1274
|
+
const inProgressTasks = await this.taskTrackingService.getAllInProgressTasks();
|
|
1275
|
+
const tasksByMember = new Map();
|
|
1276
|
+
inProgressTasks.forEach((task) => {
|
|
1277
|
+
tasksByMember.set(task.assignedTeamMemberId, {
|
|
1278
|
+
id: task.id,
|
|
1279
|
+
taskName: task.taskName,
|
|
1280
|
+
taskFilePath: task.taskFilePath,
|
|
1281
|
+
assignedAt: task.assignedAt,
|
|
1282
|
+
status: task.status
|
|
1283
|
+
});
|
|
1284
|
+
});
|
|
1285
|
+
// Process all teams with concurrency limit to prevent overwhelming the system
|
|
1286
|
+
const CONCURRENCY_LIMIT = 2; // Reduced to be more conservative
|
|
1287
|
+
const MAX_OUTPUT_SIZE = 1024; // Max 1KB per member terminal output
|
|
1288
|
+
for (let teamIndex = 0; teamIndex < teams.length; teamIndex += CONCURRENCY_LIMIT) {
|
|
1289
|
+
const teamBatch = teams.slice(teamIndex, teamIndex + CONCURRENCY_LIMIT);
|
|
1290
|
+
const teamPromises = teamBatch.map(async (team) => {
|
|
1291
|
+
let teamUpdated = false;
|
|
1292
|
+
for (const member of team.members) {
|
|
1293
|
+
const mutableMember = member;
|
|
1294
|
+
if (member.agentStatus === CREWLY_CONSTANTS.AGENT_STATUSES.ACTIVE && member.sessionName) {
|
|
1295
|
+
try {
|
|
1296
|
+
// Add timeout to prevent hanging
|
|
1297
|
+
const sessionExists = await Promise.race([
|
|
1298
|
+
this.tmuxService.sessionExists(member.sessionName),
|
|
1299
|
+
new Promise((_, reject) => setTimeout(() => reject(new Error('Session check timeout')), 3000))
|
|
1300
|
+
]);
|
|
1301
|
+
if (!sessionExists) {
|
|
1302
|
+
mutableMember.agentStatus = CREWLY_CONSTANTS.AGENT_STATUSES.INACTIVE;
|
|
1303
|
+
mutableMember.workingStatus = CREWLY_CONSTANTS.WORKING_STATUSES.IDLE;
|
|
1304
|
+
mutableMember.lastActivityCheck = now;
|
|
1305
|
+
// Clear terminal output to prevent memory leak
|
|
1306
|
+
delete mutableMember.lastTerminalOutput;
|
|
1307
|
+
teamUpdated = true;
|
|
1308
|
+
const currentTask = tasksByMember.get(member.id) || null;
|
|
1309
|
+
memberStatuses.push({
|
|
1310
|
+
teamId: team.id,
|
|
1311
|
+
teamName: team.name,
|
|
1312
|
+
memberId: member.id,
|
|
1313
|
+
memberName: member.name,
|
|
1314
|
+
role: member.role,
|
|
1315
|
+
sessionName: member.sessionName,
|
|
1316
|
+
agentStatus: CREWLY_CONSTANTS.AGENT_STATUSES.INACTIVE,
|
|
1317
|
+
workingStatus: CREWLY_CONSTANTS.WORKING_STATUSES.IDLE,
|
|
1318
|
+
lastActivityCheck: now,
|
|
1319
|
+
activityDetected: false,
|
|
1320
|
+
currentTask
|
|
1321
|
+
});
|
|
1322
|
+
continue;
|
|
1323
|
+
}
|
|
1324
|
+
// Capture terminal output with strict timeout and size limit
|
|
1325
|
+
const currentOutput = await Promise.race([
|
|
1326
|
+
this.tmuxService.capturePane(member.sessionName, 15), // Reduced from 50 to 15 lines
|
|
1327
|
+
new Promise((_, reject) => setTimeout(() => reject(new Error('Capture timeout')), 2000) // Shorter timeout
|
|
1328
|
+
)
|
|
1329
|
+
]).catch(() => ''); // Return empty string on error/timeout
|
|
1330
|
+
// Strict size limiting to prevent memory issues
|
|
1331
|
+
const trimmedOutput = currentOutput.length > MAX_OUTPUT_SIZE
|
|
1332
|
+
? '...' + currentOutput.substring(currentOutput.length - MAX_OUTPUT_SIZE + 3)
|
|
1333
|
+
: currentOutput;
|
|
1334
|
+
const previousOutput = mutableMember.lastTerminalOutput || '';
|
|
1335
|
+
const activityDetected = trimmedOutput !== previousOutput && trimmedOutput.trim() !== '';
|
|
1336
|
+
const newWorkingStatus = activityDetected ? 'in_progress' : CREWLY_CONSTANTS.WORKING_STATUSES.IDLE;
|
|
1337
|
+
if (member.workingStatus !== newWorkingStatus) {
|
|
1338
|
+
mutableMember.workingStatus = newWorkingStatus;
|
|
1339
|
+
teamUpdated = true;
|
|
1340
|
+
}
|
|
1341
|
+
mutableMember.lastActivityCheck = now;
|
|
1342
|
+
// Store only limited output to prevent memory leak
|
|
1343
|
+
mutableMember.lastTerminalOutput = trimmedOutput;
|
|
1344
|
+
const currentTask = tasksByMember.get(member.id) || null;
|
|
1345
|
+
memberStatuses.push({
|
|
1346
|
+
teamId: team.id,
|
|
1347
|
+
teamName: team.name,
|
|
1348
|
+
memberId: member.id,
|
|
1349
|
+
memberName: member.name,
|
|
1350
|
+
role: member.role,
|
|
1351
|
+
sessionName: member.sessionName,
|
|
1352
|
+
agentStatus: member.agentStatus,
|
|
1353
|
+
workingStatus: newWorkingStatus,
|
|
1354
|
+
lastActivityCheck: now,
|
|
1355
|
+
activityDetected,
|
|
1356
|
+
currentTask
|
|
1357
|
+
});
|
|
1358
|
+
}
|
|
1359
|
+
catch (error) {
|
|
1360
|
+
console.error(`Error checking activity for member ${member.id}:`, error);
|
|
1361
|
+
// Clear terminal output on error to prevent memory leak
|
|
1362
|
+
delete mutableMember.lastTerminalOutput;
|
|
1363
|
+
const currentTask = tasksByMember.get(member.id) || null;
|
|
1364
|
+
memberStatuses.push({
|
|
1365
|
+
teamId: team.id,
|
|
1366
|
+
teamName: team.name,
|
|
1367
|
+
memberId: member.id,
|
|
1368
|
+
memberName: member.name,
|
|
1369
|
+
role: member.role,
|
|
1370
|
+
sessionName: member.sessionName,
|
|
1371
|
+
agentStatus: member.agentStatus,
|
|
1372
|
+
workingStatus: CREWLY_CONSTANTS.WORKING_STATUSES.IDLE,
|
|
1373
|
+
lastActivityCheck: now,
|
|
1374
|
+
activityDetected: false,
|
|
1375
|
+
error: error instanceof Error ? error.message : String(error),
|
|
1376
|
+
currentTask
|
|
1377
|
+
});
|
|
1378
|
+
}
|
|
1379
|
+
}
|
|
1380
|
+
else {
|
|
1381
|
+
const currentTask = tasksByMember.get(member.id) || null;
|
|
1382
|
+
memberStatuses.push({
|
|
1383
|
+
teamId: team.id,
|
|
1384
|
+
teamName: team.name,
|
|
1385
|
+
memberId: member.id,
|
|
1386
|
+
memberName: member.name,
|
|
1387
|
+
role: member.role,
|
|
1388
|
+
sessionName: member.sessionName || '',
|
|
1389
|
+
agentStatus: member.agentStatus || CREWLY_CONSTANTS.AGENT_STATUSES.INACTIVE,
|
|
1390
|
+
workingStatus: member.workingStatus || CREWLY_CONSTANTS.WORKING_STATUSES.IDLE,
|
|
1391
|
+
lastActivityCheck: mutableMember.lastActivityCheck || now,
|
|
1392
|
+
activityDetected: false,
|
|
1393
|
+
currentTask
|
|
1394
|
+
});
|
|
1395
|
+
}
|
|
1396
|
+
}
|
|
1397
|
+
if (teamUpdated) {
|
|
1398
|
+
teamsToUpdate.push(team);
|
|
1399
|
+
}
|
|
1400
|
+
});
|
|
1401
|
+
await Promise.all(teamPromises);
|
|
1402
|
+
}
|
|
1403
|
+
// Save only teams that were actually updated (more efficient than saving all teams)
|
|
1404
|
+
if (teamsToUpdate.length > 0) {
|
|
1405
|
+
const savePromises = teamsToUpdate.map(team => this.storageService.saveTeam(team));
|
|
1406
|
+
await Promise.all(savePromises);
|
|
1407
|
+
}
|
|
1408
|
+
// Clean up memory before sending response
|
|
1409
|
+
if (global.gc) {
|
|
1410
|
+
global.gc();
|
|
1411
|
+
}
|
|
1412
|
+
res.json({
|
|
1413
|
+
success: true,
|
|
1414
|
+
data: {
|
|
1415
|
+
orchestrator: { running: orchestratorRunning, sessionName: orchestratorRunning ? CREWLY_CONSTANTS.SESSIONS.ORCHESTRATOR_NAME : null },
|
|
1416
|
+
teams,
|
|
1417
|
+
members: memberStatuses,
|
|
1418
|
+
checkedAt: now,
|
|
1419
|
+
totalMembers: memberStatuses.length,
|
|
1420
|
+
totalActiveMembers: memberStatuses.filter(m => m.agentStatus === CREWLY_CONSTANTS.AGENT_STATUSES.ACTIVE).length
|
|
1421
|
+
}
|
|
1422
|
+
});
|
|
1423
|
+
}
|
|
1424
|
+
catch (error) {
|
|
1425
|
+
console.error('Error checking team activity status:', error);
|
|
1426
|
+
res.status(500).json({ success: false, error: 'Failed to check team activity status' });
|
|
1427
|
+
}
|
|
1428
|
+
}
|
|
1429
|
+
export async function updateTeamMemberRuntime(req, res) {
|
|
1430
|
+
try {
|
|
1431
|
+
const { teamId, memberId } = req.params;
|
|
1432
|
+
const { runtimeType } = req.body;
|
|
1433
|
+
if (!runtimeType || typeof runtimeType !== 'string') {
|
|
1434
|
+
res.status(400).json({
|
|
1435
|
+
success: false,
|
|
1436
|
+
error: 'runtimeType is required and must be a string'
|
|
1437
|
+
});
|
|
1438
|
+
return;
|
|
1439
|
+
}
|
|
1440
|
+
// Validate runtime type
|
|
1441
|
+
const validRuntimeTypes = ['claude-code', 'gemini-cli', 'codex-cli'];
|
|
1442
|
+
if (!validRuntimeTypes.includes(runtimeType)) {
|
|
1443
|
+
res.status(400).json({
|
|
1444
|
+
success: false,
|
|
1445
|
+
error: `Invalid runtime type. Must be one of: ${validRuntimeTypes.join(', ')}`
|
|
1446
|
+
});
|
|
1447
|
+
return;
|
|
1448
|
+
}
|
|
1449
|
+
// Special handling for orchestrator team
|
|
1450
|
+
if (teamId === 'orchestrator') {
|
|
1451
|
+
// Use the orchestrator-specific runtime update function
|
|
1452
|
+
await this.storageService.updateOrchestratorRuntimeType(runtimeType);
|
|
1453
|
+
// Get the updated orchestrator status to return
|
|
1454
|
+
const orchestratorStatus = await this.storageService.getOrchestratorStatus();
|
|
1455
|
+
const updatedMember = {
|
|
1456
|
+
id: 'orchestrator-member',
|
|
1457
|
+
name: 'Agentmux Orchestrator',
|
|
1458
|
+
sessionName: CREWLY_CONSTANTS.SESSIONS.ORCHESTRATOR_NAME,
|
|
1459
|
+
role: 'orchestrator',
|
|
1460
|
+
systemPrompt: 'You are the Crewly Orchestrator responsible for coordinating teams and managing project workflows.',
|
|
1461
|
+
agentStatus: orchestratorStatus?.agentStatus || CREWLY_CONSTANTS.AGENT_STATUSES.INACTIVE,
|
|
1462
|
+
workingStatus: orchestratorStatus?.workingStatus || CREWLY_CONSTANTS.WORKING_STATUSES.IDLE,
|
|
1463
|
+
runtimeType: runtimeType,
|
|
1464
|
+
createdAt: orchestratorStatus?.createdAt || new Date().toISOString(),
|
|
1465
|
+
updatedAt: new Date().toISOString()
|
|
1466
|
+
};
|
|
1467
|
+
res.json({
|
|
1468
|
+
success: true,
|
|
1469
|
+
data: updatedMember,
|
|
1470
|
+
message: `Orchestrator runtime updated to ${runtimeType}`
|
|
1471
|
+
});
|
|
1472
|
+
return;
|
|
1473
|
+
}
|
|
1474
|
+
const teams = await this.storageService.getTeams();
|
|
1475
|
+
const team = teams.find(t => t.id === teamId);
|
|
1476
|
+
if (!team) {
|
|
1477
|
+
res.status(404).json({
|
|
1478
|
+
success: false,
|
|
1479
|
+
error: 'Team not found'
|
|
1480
|
+
});
|
|
1481
|
+
return;
|
|
1482
|
+
}
|
|
1483
|
+
const memberIndex = team.members.findIndex(m => m.id === memberId);
|
|
1484
|
+
if (memberIndex === -1) {
|
|
1485
|
+
res.status(404).json({
|
|
1486
|
+
success: false,
|
|
1487
|
+
error: 'Team member not found'
|
|
1488
|
+
});
|
|
1489
|
+
return;
|
|
1490
|
+
}
|
|
1491
|
+
// Update the member's runtime type
|
|
1492
|
+
const updatedMember = {
|
|
1493
|
+
...team.members[memberIndex],
|
|
1494
|
+
runtimeType: runtimeType,
|
|
1495
|
+
updatedAt: new Date().toISOString()
|
|
1496
|
+
};
|
|
1497
|
+
team.members[memberIndex] = updatedMember;
|
|
1498
|
+
team.updatedAt = new Date().toISOString();
|
|
1499
|
+
await this.storageService.saveTeam(team);
|
|
1500
|
+
res.json({
|
|
1501
|
+
success: true,
|
|
1502
|
+
data: updatedMember,
|
|
1503
|
+
message: `Team member runtime updated to ${runtimeType}`
|
|
1504
|
+
});
|
|
1505
|
+
}
|
|
1506
|
+
catch (error) {
|
|
1507
|
+
console.error('Error updating team member runtime:', error);
|
|
1508
|
+
res.status(500).json({
|
|
1509
|
+
success: false,
|
|
1510
|
+
error: 'Failed to update team member runtime'
|
|
1511
|
+
});
|
|
1512
|
+
}
|
|
1513
|
+
}
|
|
1514
|
+
/**
|
|
1515
|
+
* Updates team properties like assigned project
|
|
1516
|
+
*/
|
|
1517
|
+
export async function updateTeam(req, res) {
|
|
1518
|
+
try {
|
|
1519
|
+
const { id } = req.params;
|
|
1520
|
+
const updates = req.body;
|
|
1521
|
+
if (!id) {
|
|
1522
|
+
res.status(400).json({
|
|
1523
|
+
success: false,
|
|
1524
|
+
error: 'Team ID is required'
|
|
1525
|
+
});
|
|
1526
|
+
return;
|
|
1527
|
+
}
|
|
1528
|
+
// Handle orchestrator team specially
|
|
1529
|
+
if (id === 'orchestrator') {
|
|
1530
|
+
// Orchestrator team is virtual and stored separately
|
|
1531
|
+
const orchestratorStatus = await this.storageService.getOrchestratorStatus();
|
|
1532
|
+
if (!orchestratorStatus) {
|
|
1533
|
+
res.status(404).json({
|
|
1534
|
+
success: false,
|
|
1535
|
+
error: 'Team not found'
|
|
1536
|
+
});
|
|
1537
|
+
return;
|
|
1538
|
+
}
|
|
1539
|
+
// For orchestrator, we currently cannot update the projectIds
|
|
1540
|
+
// because there's no method to save the full orchestrator status
|
|
1541
|
+
// Only status updates are supported through updateOrchestratorStatus
|
|
1542
|
+
// We'll simulate the update for the response but not persist it
|
|
1543
|
+
// The orchestrator team virtual response will include the projects
|
|
1544
|
+
// but it won't be persisted until we add the proper storage method
|
|
1545
|
+
// Return the virtual orchestrator team structure
|
|
1546
|
+
const orchestratorTeam = buildOrchestratorTeam(orchestratorStatus?.agentStatus || CREWLY_CONSTANTS.AGENT_STATUSES.INACTIVE, orchestratorStatus, { projectIds: updates.projectIds });
|
|
1547
|
+
res.json({
|
|
1548
|
+
success: true,
|
|
1549
|
+
data: orchestratorTeam,
|
|
1550
|
+
message: 'Team updated successfully'
|
|
1551
|
+
});
|
|
1552
|
+
return;
|
|
1553
|
+
}
|
|
1554
|
+
// Handle regular teams
|
|
1555
|
+
const teams = await this.storageService.getTeams();
|
|
1556
|
+
const teamIndex = teams.findIndex(t => t.id === id);
|
|
1557
|
+
if (teamIndex === -1) {
|
|
1558
|
+
res.status(404).json({
|
|
1559
|
+
success: false,
|
|
1560
|
+
error: 'Team not found'
|
|
1561
|
+
});
|
|
1562
|
+
return;
|
|
1563
|
+
}
|
|
1564
|
+
const team = teams[teamIndex];
|
|
1565
|
+
// Update allowed fields
|
|
1566
|
+
if (updates.projectIds !== undefined) {
|
|
1567
|
+
team.projectIds = updates.projectIds;
|
|
1568
|
+
}
|
|
1569
|
+
if (updates.name !== undefined) {
|
|
1570
|
+
team.name = updates.name;
|
|
1571
|
+
}
|
|
1572
|
+
if (updates.description !== undefined) {
|
|
1573
|
+
team.description = updates.description;
|
|
1574
|
+
}
|
|
1575
|
+
// Update members if provided (from TeamModal edit)
|
|
1576
|
+
if (updates.members !== undefined && Array.isArray(updates.members)) {
|
|
1577
|
+
team.members = updates.members.map((memberUpdate) => {
|
|
1578
|
+
// Find existing member by name (since the modal doesn't send IDs)
|
|
1579
|
+
const existingMember = team.members.find(m => m.name === memberUpdate.name);
|
|
1580
|
+
if (existingMember) {
|
|
1581
|
+
return {
|
|
1582
|
+
...existingMember,
|
|
1583
|
+
name: memberUpdate.name,
|
|
1584
|
+
role: memberUpdate.role,
|
|
1585
|
+
systemPrompt: memberUpdate.systemPrompt,
|
|
1586
|
+
runtimeType: memberUpdate.runtimeType || existingMember.runtimeType,
|
|
1587
|
+
avatar: memberUpdate.avatar || existingMember.avatar,
|
|
1588
|
+
skillOverrides: memberUpdate.skillOverrides || [],
|
|
1589
|
+
excludedRoleSkills: memberUpdate.excludedRoleSkills || [],
|
|
1590
|
+
updatedAt: new Date().toISOString()
|
|
1591
|
+
};
|
|
1592
|
+
}
|
|
1593
|
+
else {
|
|
1594
|
+
// New member
|
|
1595
|
+
return {
|
|
1596
|
+
id: uuidv4(),
|
|
1597
|
+
name: memberUpdate.name,
|
|
1598
|
+
role: memberUpdate.role,
|
|
1599
|
+
systemPrompt: memberUpdate.systemPrompt,
|
|
1600
|
+
agentStatus: CREWLY_CONSTANTS.AGENT_STATUSES.INACTIVE,
|
|
1601
|
+
workingStatus: CREWLY_CONSTANTS.WORKING_STATUSES.IDLE,
|
|
1602
|
+
runtimeType: memberUpdate.runtimeType || RUNTIME_TYPES.CLAUDE_CODE,
|
|
1603
|
+
avatar: memberUpdate.avatar,
|
|
1604
|
+
skillOverrides: memberUpdate.skillOverrides || [],
|
|
1605
|
+
excludedRoleSkills: memberUpdate.excludedRoleSkills || [],
|
|
1606
|
+
createdAt: new Date().toISOString(),
|
|
1607
|
+
updatedAt: new Date().toISOString()
|
|
1608
|
+
};
|
|
1609
|
+
}
|
|
1610
|
+
});
|
|
1611
|
+
}
|
|
1612
|
+
// Update timestamp
|
|
1613
|
+
team.updatedAt = new Date().toISOString();
|
|
1614
|
+
await this.storageService.saveTeam(team);
|
|
1615
|
+
res.json({
|
|
1616
|
+
success: true,
|
|
1617
|
+
data: team,
|
|
1618
|
+
message: 'Team updated successfully'
|
|
1619
|
+
});
|
|
1620
|
+
}
|
|
1621
|
+
catch (error) {
|
|
1622
|
+
console.error('Error updating team:', error);
|
|
1623
|
+
res.status(500).json({
|
|
1624
|
+
success: false,
|
|
1625
|
+
error: 'Failed to update team'
|
|
1626
|
+
});
|
|
1627
|
+
}
|
|
1628
|
+
}
|
|
1629
|
+
//# sourceMappingURL=team.controller.js.map
|