crewly 1.2.3 → 1.2.6
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +1 -1
- package/README.md +1 -1
- package/config/constants.ts +48 -3
- package/config/index.ts +4 -0
- package/config/roles/auditor/prompt.md +84 -0
- package/config/roles/orchestrator/prompt.md +92 -9
- package/config/roles/team-leader/prompt.md +169 -0
- package/config/roles/team-leader/role.json +13 -0
- package/config/roles/team-leader/tl-addon.md +142 -0
- package/config/runtime_scripts/runtime-config.json +7 -0
- package/config/skills/_common/lib.sh +37 -0
- package/config/skills/agent/computer-use/execute.sh +228 -0
- package/config/skills/agent/computer-use/instructions.md +103 -0
- package/config/skills/agent/computer-use/lib/accessibility.sh +292 -0
- package/config/skills/agent/computer-use/lib/applescript.sh +117 -0
- package/config/skills/agent/computer-use/lib/discover.sh +122 -0
- package/config/skills/agent/computer-use/lib/playwright.sh +153 -0
- package/config/skills/agent/computer-use/lib/screenshot.sh +61 -0
- package/config/skills/agent/computer-use/skill.json +29 -0
- package/config/skills/agent/core/accept-task/execute.sh +7 -1
- package/config/skills/agent/core/complete-task/execute.sh +38 -1
- package/config/skills/agent/core/report-status/execute.sh +51 -2
- package/config/skills/agent/desktop-app-control/execute.sh +561 -0
- package/config/skills/agent/desktop-app-control/instructions.md +102 -0
- package/config/skills/agent/desktop-app-control/skill.json +33 -0
- package/config/skills/orchestrator/broadcast-to-org/execute.sh +88 -0
- package/config/skills/orchestrator/broadcast-to-org/instructions.md +51 -0
- package/config/skills/orchestrator/broadcast-to-org/skill.json +20 -0
- package/config/skills/orchestrator/cancel-all-schedules/execute.sh +24 -0
- package/config/skills/orchestrator/cancel-all-schedules/instructions.md +23 -0
- package/config/skills/orchestrator/cancel-all-schedules/skill.json +17 -0
- package/config/skills/orchestrator/delegate-task/execute.sh +75 -10
- package/config/skills/orchestrator/delegate-task/instructions.md +11 -1
- package/config/skills/orchestrator/handle-agent-failure/execute.sh +45 -0
- package/config/skills/orchestrator/handle-agent-failure/instructions.md +29 -0
- package/config/skills/orchestrator/handle-agent-failure/skill.json +20 -0
- package/config/skills/orchestrator/list-schedules/execute.sh +19 -0
- package/config/skills/orchestrator/list-schedules/instructions.md +24 -0
- package/config/skills/orchestrator/list-schedules/skill.json +12 -0
- package/config/skills/orchestrator/restart-crewly/instructions.md +9 -2
- package/config/skills/team-leader/_common/lib.sh +4 -0
- package/config/skills/team-leader/aggregate-results/execute.sh +168 -0
- package/config/skills/team-leader/aggregate-results/instructions.md +89 -0
- package/config/skills/team-leader/aggregate-results/skill.json +20 -0
- package/config/skills/team-leader/decompose-goal/execute.sh +86 -0
- package/config/skills/team-leader/decompose-goal/instructions.md +84 -0
- package/config/skills/team-leader/decompose-goal/skill.json +20 -0
- package/config/skills/team-leader/delegate-task/execute.sh +142 -0
- package/config/skills/team-leader/delegate-task/instructions.md +55 -0
- package/config/skills/team-leader/delegate-task/skill.json +20 -0
- package/config/skills/team-leader/handle-failure/execute.sh +119 -0
- package/config/skills/team-leader/handle-failure/instructions.md +93 -0
- package/config/skills/team-leader/handle-failure/skill.json +20 -0
- package/config/skills/team-leader/schedule-check/execute.sh +65 -0
- package/config/skills/team-leader/schedule-check/execute.test.sh +247 -0
- package/config/skills/team-leader/schedule-check/instructions.md +49 -0
- package/config/skills/team-leader/schedule-check/skill.json +20 -0
- package/config/skills/team-leader/start-agent/execute.sh +39 -0
- package/config/skills/team-leader/start-agent/instructions.md +48 -0
- package/config/skills/team-leader/start-agent/skill.json +20 -0
- package/config/skills/team-leader/stop-agent/execute.sh +39 -0
- package/config/skills/team-leader/stop-agent/instructions.md +49 -0
- package/config/skills/team-leader/stop-agent/skill.json +20 -0
- package/config/skills/team-leader/verify-output/execute.sh +296 -0
- package/config/skills/team-leader/verify-output/instructions.md +122 -0
- package/config/skills/team-leader/verify-output/skill.json +20 -0
- package/config/templates/core-team/demo-script.md +41 -0
- package/config/templates/core-team/goals.md +20 -0
- package/config/templates/core-team/team.json +22 -0
- package/config/templates/dev-fullstack/template.json +115 -0
- package/config/templates/education-smb/README.md +27 -0
- package/config/templates/education-smb/goals.md +16 -0
- package/config/templates/education-smb/knowledge/docs/content-standards.md +24 -0
- package/config/templates/education-smb/knowledge/docs/education-industry-context.md +13 -0
- package/config/templates/education-smb/knowledge/index.json +24 -0
- package/config/templates/education-smb/learned-patterns.json +16 -0
- package/config/templates/education-smb/quality-gates.yaml +66 -0
- package/config/templates/education-smb/roles/analytics-specialist.md +6 -0
- package/config/templates/education-smb/roles/content-creator.md +6 -0
- package/config/templates/education-smb/roles/curriculum-designer.md +6 -0
- package/config/templates/education-smb/roles/engagement-manager.md +6 -0
- package/config/templates/education-smb/team.json +40 -0
- package/config/templates/education-smb/template.json +26 -0
- package/config/templates/education-smb/workflows/course-content-generation.yaml +44 -0
- package/config/templates/education-smb/workflows/reporting.yaml +31 -0
- package/config/templates/education-smb/workflows/student-communication.yaml +44 -0
- package/config/templates/education-smb/workflows.yaml +40 -0
- package/config/templates/insurance-smb/README.md +28 -0
- package/config/templates/insurance-smb/goals.md +21 -0
- package/config/templates/insurance-smb/knowledge/docs/compliance-checklist.md +28 -0
- package/config/templates/insurance-smb/knowledge/docs/insurance-industry-context.md +23 -0
- package/config/templates/insurance-smb/knowledge/index.json +24 -0
- package/config/templates/insurance-smb/learned-patterns.json +16 -0
- package/config/templates/insurance-smb/quality-gates.yaml +54 -0
- package/config/templates/insurance-smb/roles/claims-processor.md +6 -0
- package/config/templates/insurance-smb/roles/client-manager.md +6 -0
- package/config/templates/insurance-smb/roles/compliance-officer.md +6 -0
- package/config/templates/insurance-smb/roles/marketing-specialist.md +6 -0
- package/config/templates/insurance-smb/roles/policy-analyst.md +6 -0
- package/config/templates/insurance-smb/team.json +48 -0
- package/config/templates/insurance-smb/template.json +26 -0
- package/config/templates/insurance-smb/workflows/claims-processing.yaml +48 -0
- package/config/templates/insurance-smb/workflows.yaml +43 -0
- package/config/templates/research-analysis/template.json +88 -0
- package/config/templates/social-media-ops/template.json +85 -0
- package/config/templates/video-production/template.json +123 -0
- package/dist/backend/backend/src/constants.d.ts +344 -16
- package/dist/backend/backend/src/constants.d.ts.map +1 -1
- package/dist/backend/backend/src/constants.js +334 -15
- package/dist/backend/backend/src/constants.js.map +1 -1
- package/dist/backend/backend/src/controllers/auditor/auditor.controller.d.ts +37 -0
- package/dist/backend/backend/src/controllers/auditor/auditor.controller.d.ts.map +1 -0
- package/dist/backend/backend/src/controllers/auditor/auditor.controller.js +64 -0
- package/dist/backend/backend/src/controllers/auditor/auditor.controller.js.map +1 -0
- package/dist/backend/backend/src/controllers/auditor/auditor.routes.d.ts +15 -0
- package/dist/backend/backend/src/controllers/auditor/auditor.routes.d.ts.map +1 -0
- package/dist/backend/backend/src/controllers/auditor/auditor.routes.js +23 -0
- package/dist/backend/backend/src/controllers/auditor/auditor.routes.js.map +1 -0
- package/dist/backend/backend/src/controllers/chat/chat.controller.d.ts.map +1 -1
- package/dist/backend/backend/src/controllers/chat/chat.controller.js +69 -48
- package/dist/backend/backend/src/controllers/chat/chat.controller.js.map +1 -1
- package/dist/backend/backend/src/controllers/cloud/admin/admin-auth.middleware.d.ts +23 -0
- package/dist/backend/backend/src/controllers/cloud/admin/admin-auth.middleware.d.ts.map +1 -0
- package/dist/backend/backend/src/controllers/cloud/admin/admin-auth.middleware.js +42 -0
- package/dist/backend/backend/src/controllers/cloud/admin/admin-auth.middleware.js.map +1 -0
- package/dist/backend/backend/src/controllers/cloud/admin/admin.controller.d.ts +56 -0
- package/dist/backend/backend/src/controllers/cloud/admin/admin.controller.d.ts.map +1 -0
- package/dist/backend/backend/src/controllers/cloud/admin/admin.controller.js +173 -0
- package/dist/backend/backend/src/controllers/cloud/admin/admin.controller.js.map +1 -0
- package/dist/backend/backend/src/controllers/cloud/admin/admin.routes.d.ts +22 -0
- package/dist/backend/backend/src/controllers/cloud/admin/admin.routes.d.ts.map +1 -0
- package/dist/backend/backend/src/controllers/cloud/admin/admin.routes.js +33 -0
- package/dist/backend/backend/src/controllers/cloud/admin/admin.routes.js.map +1 -0
- package/dist/backend/backend/src/controllers/cloud/admin/index.d.ts +7 -0
- package/dist/backend/backend/src/controllers/cloud/admin/index.d.ts.map +1 -0
- package/dist/backend/backend/src/controllers/cloud/admin/index.js +7 -0
- package/dist/backend/backend/src/controllers/cloud/admin/index.js.map +1 -0
- package/dist/backend/backend/src/controllers/cloud/auth/auth.controller.d.ts +81 -0
- package/dist/backend/backend/src/controllers/cloud/auth/auth.controller.d.ts.map +1 -0
- package/dist/backend/backend/src/controllers/cloud/auth/auth.controller.js +234 -0
- package/dist/backend/backend/src/controllers/cloud/auth/auth.controller.js.map +1 -0
- package/dist/backend/backend/src/controllers/cloud/auth/auth.routes.d.ts +25 -0
- package/dist/backend/backend/src/controllers/cloud/auth/auth.routes.d.ts.map +1 -0
- package/dist/backend/backend/src/controllers/cloud/auth/auth.routes.js +38 -0
- package/dist/backend/backend/src/controllers/cloud/auth/auth.routes.js.map +1 -0
- package/dist/backend/backend/src/controllers/cloud/cloud-auth.controller.d.ts +69 -0
- package/dist/backend/backend/src/controllers/cloud/cloud-auth.controller.d.ts.map +1 -0
- package/dist/backend/backend/src/controllers/cloud/cloud-auth.controller.js +165 -0
- package/dist/backend/backend/src/controllers/cloud/cloud-auth.controller.js.map +1 -0
- package/dist/backend/backend/src/controllers/cloud/cloud-auth.routes.d.ts +23 -0
- package/dist/backend/backend/src/controllers/cloud/cloud-auth.routes.d.ts.map +1 -0
- package/dist/backend/backend/src/controllers/cloud/cloud-auth.routes.js +32 -0
- package/dist/backend/backend/src/controllers/cloud/cloud-auth.routes.js.map +1 -0
- package/dist/backend/backend/src/controllers/cloud/cloud.controller.d.ts +52 -0
- package/dist/backend/backend/src/controllers/cloud/cloud.controller.d.ts.map +1 -0
- package/dist/backend/backend/src/controllers/cloud/cloud.controller.js +122 -0
- package/dist/backend/backend/src/controllers/cloud/cloud.controller.js.map +1 -0
- package/dist/backend/backend/src/controllers/cloud/cloud.routes.d.ts +21 -0
- package/dist/backend/backend/src/controllers/cloud/cloud.routes.d.ts.map +1 -0
- package/dist/backend/backend/src/controllers/cloud/cloud.routes.js +29 -0
- package/dist/backend/backend/src/controllers/cloud/cloud.routes.js.map +1 -0
- package/dist/backend/backend/src/controllers/cloud/files/cloud-file.controller.d.ts +42 -0
- package/dist/backend/backend/src/controllers/cloud/files/cloud-file.controller.d.ts.map +1 -0
- package/dist/backend/backend/src/controllers/cloud/files/cloud-file.controller.js +138 -0
- package/dist/backend/backend/src/controllers/cloud/files/cloud-file.controller.js.map +1 -0
- package/dist/backend/backend/src/controllers/cloud/files/cloud-file.routes.d.ts +23 -0
- package/dist/backend/backend/src/controllers/cloud/files/cloud-file.routes.d.ts.map +1 -0
- package/dist/backend/backend/src/controllers/cloud/files/cloud-file.routes.js +34 -0
- package/dist/backend/backend/src/controllers/cloud/files/cloud-file.routes.js.map +1 -0
- package/dist/backend/backend/src/controllers/cloud/files/cloud-file.types.d.ts +43 -0
- package/dist/backend/backend/src/controllers/cloud/files/cloud-file.types.d.ts.map +1 -0
- package/dist/backend/backend/src/controllers/cloud/files/cloud-file.types.js +9 -0
- package/dist/backend/backend/src/controllers/cloud/files/cloud-file.types.js.map +1 -0
- package/dist/backend/backend/src/controllers/cloud/files/index.d.ts +7 -0
- package/dist/backend/backend/src/controllers/cloud/files/index.d.ts.map +1 -0
- package/dist/backend/backend/src/controllers/cloud/files/index.js +7 -0
- package/dist/backend/backend/src/controllers/cloud/files/index.js.map +1 -0
- package/dist/backend/backend/src/controllers/cloud/h5/h5-entry.controller.d.ts +47 -0
- package/dist/backend/backend/src/controllers/cloud/h5/h5-entry.controller.d.ts.map +1 -0
- package/dist/backend/backend/src/controllers/cloud/h5/h5-entry.controller.js +131 -0
- package/dist/backend/backend/src/controllers/cloud/h5/h5-entry.controller.js.map +1 -0
- package/dist/backend/backend/src/controllers/cloud/h5/h5-entry.routes.d.ts +23 -0
- package/dist/backend/backend/src/controllers/cloud/h5/h5-entry.routes.d.ts.map +1 -0
- package/dist/backend/backend/src/controllers/cloud/h5/h5-entry.routes.js +30 -0
- package/dist/backend/backend/src/controllers/cloud/h5/h5-entry.routes.js.map +1 -0
- package/dist/backend/backend/src/controllers/cloud/h5/h5-entry.types.d.ts +81 -0
- package/dist/backend/backend/src/controllers/cloud/h5/h5-entry.types.d.ts.map +1 -0
- package/dist/backend/backend/src/controllers/cloud/h5/h5-entry.types.js +85 -0
- package/dist/backend/backend/src/controllers/cloud/h5/h5-entry.types.js.map +1 -0
- package/dist/backend/backend/src/controllers/cloud/h5/index.d.ts +7 -0
- package/dist/backend/backend/src/controllers/cloud/h5/index.d.ts.map +1 -0
- package/dist/backend/backend/src/controllers/cloud/h5/index.js +7 -0
- package/dist/backend/backend/src/controllers/cloud/h5/index.js.map +1 -0
- package/dist/backend/backend/src/controllers/cloud/index.d.ts +9 -0
- package/dist/backend/backend/src/controllers/cloud/index.d.ts.map +1 -0
- package/dist/backend/backend/src/controllers/cloud/index.js +9 -0
- package/dist/backend/backend/src/controllers/cloud/index.js.map +1 -0
- package/dist/backend/backend/src/controllers/cloud/magic-moment/index.d.ts +7 -0
- package/dist/backend/backend/src/controllers/cloud/magic-moment/index.d.ts.map +1 -0
- package/dist/backend/backend/src/controllers/cloud/magic-moment/index.js +7 -0
- package/dist/backend/backend/src/controllers/cloud/magic-moment/index.js.map +1 -0
- package/dist/backend/backend/src/controllers/cloud/magic-moment/magic-moment.controller.d.ts +45 -0
- package/dist/backend/backend/src/controllers/cloud/magic-moment/magic-moment.controller.d.ts.map +1 -0
- package/dist/backend/backend/src/controllers/cloud/magic-moment/magic-moment.controller.js +155 -0
- package/dist/backend/backend/src/controllers/cloud/magic-moment/magic-moment.controller.js.map +1 -0
- package/dist/backend/backend/src/controllers/cloud/magic-moment/magic-moment.routes.d.ts +25 -0
- package/dist/backend/backend/src/controllers/cloud/magic-moment/magic-moment.routes.d.ts.map +1 -0
- package/dist/backend/backend/src/controllers/cloud/magic-moment/magic-moment.routes.js +32 -0
- package/dist/backend/backend/src/controllers/cloud/magic-moment/magic-moment.routes.js.map +1 -0
- package/dist/backend/backend/src/controllers/cloud/relay.controller.d.ts +62 -0
- package/dist/backend/backend/src/controllers/cloud/relay.controller.d.ts.map +1 -0
- package/dist/backend/backend/src/controllers/cloud/relay.controller.js +184 -0
- package/dist/backend/backend/src/controllers/cloud/relay.controller.js.map +1 -0
- package/dist/backend/backend/src/controllers/cloud/relay.routes.d.ts +25 -0
- package/dist/backend/backend/src/controllers/cloud/relay.routes.d.ts.map +1 -0
- package/dist/backend/backend/src/controllers/cloud/relay.routes.js +34 -0
- package/dist/backend/backend/src/controllers/cloud/relay.routes.js.map +1 -0
- package/dist/backend/backend/src/controllers/cloud/tasks/cloud-task.controller.d.ts +49 -0
- package/dist/backend/backend/src/controllers/cloud/tasks/cloud-task.controller.d.ts.map +1 -0
- package/dist/backend/backend/src/controllers/cloud/tasks/cloud-task.controller.js +152 -0
- package/dist/backend/backend/src/controllers/cloud/tasks/cloud-task.controller.js.map +1 -0
- package/dist/backend/backend/src/controllers/cloud/tasks/cloud-task.routes.d.ts +24 -0
- package/dist/backend/backend/src/controllers/cloud/tasks/cloud-task.routes.d.ts.map +1 -0
- package/dist/backend/backend/src/controllers/cloud/tasks/cloud-task.routes.js +34 -0
- package/dist/backend/backend/src/controllers/cloud/tasks/cloud-task.routes.js.map +1 -0
- package/dist/backend/backend/src/controllers/cloud/tasks/cloud-task.types.d.ts +90 -0
- package/dist/backend/backend/src/controllers/cloud/tasks/cloud-task.types.d.ts.map +1 -0
- package/dist/backend/backend/src/controllers/cloud/tasks/cloud-task.types.js +48 -0
- package/dist/backend/backend/src/controllers/cloud/tasks/cloud-task.types.js.map +1 -0
- package/dist/backend/backend/src/controllers/cloud/tasks/index.d.ts +10 -0
- package/dist/backend/backend/src/controllers/cloud/tasks/index.d.ts.map +1 -0
- package/dist/backend/backend/src/controllers/cloud/tasks/index.js +10 -0
- package/dist/backend/backend/src/controllers/cloud/tasks/index.js.map +1 -0
- package/dist/backend/backend/src/controllers/marketplace/index.d.ts +2 -0
- package/dist/backend/backend/src/controllers/marketplace/index.d.ts.map +1 -1
- package/dist/backend/backend/src/controllers/marketplace/index.js +3 -0
- package/dist/backend/backend/src/controllers/marketplace/index.js.map +1 -1
- package/dist/backend/backend/src/controllers/marketplace/marketplace.controller.d.ts +12 -12
- package/dist/backend/backend/src/controllers/marketplace/marketplace.controller.d.ts.map +1 -1
- package/dist/backend/backend/src/controllers/marketplace/marketplace.controller.js +1 -18
- package/dist/backend/backend/src/controllers/marketplace/marketplace.controller.js.map +1 -1
- package/dist/backend/backend/src/controllers/marketplace/marketplace.routes.d.ts.map +1 -1
- package/dist/backend/backend/src/controllers/marketplace/marketplace.routes.js +3 -0
- package/dist/backend/backend/src/controllers/marketplace/marketplace.routes.js.map +1 -1
- package/dist/backend/backend/src/controllers/marketplace/template-marketplace.controller.d.ts +111 -0
- package/dist/backend/backend/src/controllers/marketplace/template-marketplace.controller.d.ts.map +1 -0
- package/dist/backend/backend/src/controllers/marketplace/template-marketplace.controller.js +220 -0
- package/dist/backend/backend/src/controllers/marketplace/template-marketplace.controller.js.map +1 -0
- package/dist/backend/backend/src/controllers/marketplace/template-marketplace.routes.d.ts +37 -0
- package/dist/backend/backend/src/controllers/marketplace/template-marketplace.routes.d.ts.map +1 -0
- package/dist/backend/backend/src/controllers/marketplace/template-marketplace.routes.js +54 -0
- package/dist/backend/backend/src/controllers/marketplace/template-marketplace.routes.js.map +1 -0
- package/dist/backend/backend/src/controllers/messaging/messenger.routes.d.ts.map +1 -1
- package/dist/backend/backend/src/controllers/messaging/messenger.routes.js +4 -1
- package/dist/backend/backend/src/controllers/messaging/messenger.routes.js.map +1 -1
- package/dist/backend/backend/src/controllers/monitoring/terminal.controller.d.ts.map +1 -1
- package/dist/backend/backend/src/controllers/monitoring/terminal.controller.js +50 -6
- package/dist/backend/backend/src/controllers/monitoring/terminal.controller.js.map +1 -1
- package/dist/backend/backend/src/controllers/payment/index.d.ts +7 -0
- package/dist/backend/backend/src/controllers/payment/index.d.ts.map +1 -0
- package/dist/backend/backend/src/controllers/payment/index.js +7 -0
- package/dist/backend/backend/src/controllers/payment/index.js.map +1 -0
- package/dist/backend/backend/src/controllers/payment/payment.controller.d.ts +68 -0
- package/dist/backend/backend/src/controllers/payment/payment.controller.d.ts.map +1 -0
- package/dist/backend/backend/src/controllers/payment/payment.controller.js +136 -0
- package/dist/backend/backend/src/controllers/payment/payment.controller.js.map +1 -0
- package/dist/backend/backend/src/controllers/payment/payment.routes.d.ts +31 -0
- package/dist/backend/backend/src/controllers/payment/payment.routes.d.ts.map +1 -0
- package/dist/backend/backend/src/controllers/payment/payment.routes.js +52 -0
- package/dist/backend/backend/src/controllers/payment/payment.routes.js.map +1 -0
- package/dist/backend/backend/src/controllers/payment/payment.types.d.ts +109 -0
- package/dist/backend/backend/src/controllers/payment/payment.types.d.ts.map +1 -0
- package/dist/backend/backend/src/controllers/payment/payment.types.js +54 -0
- package/dist/backend/backend/src/controllers/payment/payment.types.js.map +1 -0
- package/dist/backend/backend/src/controllers/request-types.d.ts +34 -5
- package/dist/backend/backend/src/controllers/request-types.d.ts.map +1 -1
- package/dist/backend/backend/src/controllers/session/session.controller.d.ts +14 -0
- package/dist/backend/backend/src/controllers/session/session.controller.d.ts.map +1 -1
- package/dist/backend/backend/src/controllers/session/session.controller.js +48 -0
- package/dist/backend/backend/src/controllers/session/session.controller.js.map +1 -1
- package/dist/backend/backend/src/controllers/session/session.routes.d.ts.map +1 -1
- package/dist/backend/backend/src/controllers/session/session.routes.js +3 -1
- package/dist/backend/backend/src/controllers/session/session.routes.js.map +1 -1
- package/dist/backend/backend/src/controllers/system/scheduler.controller.d.ts +19 -0
- package/dist/backend/backend/src/controllers/system/scheduler.controller.d.ts.map +1 -1
- package/dist/backend/backend/src/controllers/system/scheduler.controller.js +55 -3
- package/dist/backend/backend/src/controllers/system/scheduler.controller.js.map +1 -1
- package/dist/backend/backend/src/controllers/system/system.controller.d.ts.map +1 -1
- package/dist/backend/backend/src/controllers/system/system.controller.js +13 -15
- package/dist/backend/backend/src/controllers/system/system.controller.js.map +1 -1
- package/dist/backend/backend/src/controllers/task-management/assignments.controller.d.ts.map +1 -1
- package/dist/backend/backend/src/controllers/task-management/assignments.controller.js.map +1 -1
- package/dist/backend/backend/src/controllers/task-management/task-management.controller.d.ts.map +1 -1
- package/dist/backend/backend/src/controllers/task-management/task-management.controller.js +40 -4
- package/dist/backend/backend/src/controllers/task-management/task-management.controller.js.map +1 -1
- package/dist/backend/backend/src/controllers/task-management/tasks.controller.js.map +1 -1
- package/dist/backend/backend/src/controllers/team/team.controller.d.ts.map +1 -1
- package/dist/backend/backend/src/controllers/team/team.controller.js +272 -18
- package/dist/backend/backend/src/controllers/team/team.controller.js.map +1 -1
- package/dist/backend/backend/src/controllers/template/index.d.ts +8 -0
- package/dist/backend/backend/src/controllers/template/index.d.ts.map +1 -0
- package/dist/backend/backend/src/controllers/template/index.js +8 -0
- package/dist/backend/backend/src/controllers/template/index.js.map +1 -0
- package/dist/backend/backend/src/controllers/template/template.controller.d.ts +63 -0
- package/dist/backend/backend/src/controllers/template/template.controller.d.ts.map +1 -0
- package/dist/backend/backend/src/controllers/template/template.controller.js +112 -0
- package/dist/backend/backend/src/controllers/template/template.controller.js.map +1 -0
- package/dist/backend/backend/src/controllers/template/template.routes.d.ts +24 -0
- package/dist/backend/backend/src/controllers/template/template.routes.d.ts.map +1 -0
- package/dist/backend/backend/src/controllers/template/template.routes.js +33 -0
- package/dist/backend/backend/src/controllers/template/template.routes.js.map +1 -0
- package/dist/backend/backend/src/index.d.ts.map +1 -1
- package/dist/backend/backend/src/index.js +106 -13
- package/dist/backend/backend/src/index.js.map +1 -1
- package/dist/backend/backend/src/middleware/agent-heartbeat.middleware.js +3 -3
- package/dist/backend/backend/src/middleware/agent-heartbeat.middleware.js.map +1 -1
- package/dist/backend/backend/src/models/Team.d.ts +5 -0
- package/dist/backend/backend/src/models/Team.d.ts.map +1 -1
- package/dist/backend/backend/src/models/Team.js +24 -0
- package/dist/backend/backend/src/models/Team.js.map +1 -1
- package/dist/backend/backend/src/routes/api.routes.d.ts.map +1 -1
- package/dist/backend/backend/src/routes/api.routes.js +13 -0
- package/dist/backend/backend/src/routes/api.routes.js.map +1 -1
- package/dist/backend/backend/src/routes/modules/log-rotation.routes.d.ts +8 -0
- package/dist/backend/backend/src/routes/modules/log-rotation.routes.d.ts.map +1 -0
- package/dist/backend/backend/src/routes/modules/log-rotation.routes.js +62 -0
- package/dist/backend/backend/src/routes/modules/log-rotation.routes.js.map +1 -0
- package/dist/backend/backend/src/routes/modules/scheduler.routes.d.ts.map +1 -1
- package/dist/backend/backend/src/routes/modules/scheduler.routes.js +2 -0
- package/dist/backend/backend/src/routes/modules/scheduler.routes.js.map +1 -1
- package/dist/backend/backend/src/scripts/run-log-rotation.d.ts +3 -0
- package/dist/backend/backend/src/scripts/run-log-rotation.d.ts.map +1 -0
- package/dist/backend/backend/src/scripts/run-log-rotation.js +31 -0
- package/dist/backend/backend/src/scripts/run-log-rotation.js.map +1 -0
- package/dist/backend/backend/src/services/agent/agent-registration.service.d.ts +11 -6
- package/dist/backend/backend/src/services/agent/agent-registration.service.d.ts.map +1 -1
- package/dist/backend/backend/src/services/agent/agent-registration.service.js +296 -288
- package/dist/backend/backend/src/services/agent/agent-registration.service.js.map +1 -1
- package/dist/backend/backend/src/services/agent/auditor-scheduler.service.d.ts +150 -0
- package/dist/backend/backend/src/services/agent/auditor-scheduler.service.d.ts.map +1 -0
- package/dist/backend/backend/src/services/agent/auditor-scheduler.service.js +307 -0
- package/dist/backend/backend/src/services/agent/auditor-scheduler.service.js.map +1 -0
- package/dist/backend/backend/src/services/agent/claude-runtime.service.d.ts +7 -1
- package/dist/backend/backend/src/services/agent/claude-runtime.service.d.ts.map +1 -1
- package/dist/backend/backend/src/services/agent/claude-runtime.service.js +11 -2
- package/dist/backend/backend/src/services/agent/claude-runtime.service.js.map +1 -1
- package/dist/backend/backend/src/services/agent/crewly-agent/agent-runner.service.d.ts +105 -0
- package/dist/backend/backend/src/services/agent/crewly-agent/agent-runner.service.d.ts.map +1 -0
- package/dist/backend/backend/src/services/agent/crewly-agent/agent-runner.service.js +199 -0
- package/dist/backend/backend/src/services/agent/crewly-agent/agent-runner.service.js.map +1 -0
- package/dist/backend/backend/src/services/agent/crewly-agent/api-client.d.ts +68 -0
- package/dist/backend/backend/src/services/agent/crewly-agent/api-client.d.ts.map +1 -0
- package/dist/backend/backend/src/services/agent/crewly-agent/api-client.js +131 -0
- package/dist/backend/backend/src/services/agent/crewly-agent/api-client.js.map +1 -0
- package/dist/backend/backend/src/services/agent/crewly-agent/auditor-tools.d.ts +29 -0
- package/dist/backend/backend/src/services/agent/crewly-agent/auditor-tools.d.ts.map +1 -0
- package/dist/backend/backend/src/services/agent/crewly-agent/auditor-tools.js +229 -0
- package/dist/backend/backend/src/services/agent/crewly-agent/auditor-tools.js.map +1 -0
- package/dist/backend/backend/src/services/agent/crewly-agent/crewly-agent-runtime.service.d.ts +127 -0
- package/dist/backend/backend/src/services/agent/crewly-agent/crewly-agent-runtime.service.d.ts.map +1 -0
- package/dist/backend/backend/src/services/agent/crewly-agent/crewly-agent-runtime.service.js +242 -0
- package/dist/backend/backend/src/services/agent/crewly-agent/crewly-agent-runtime.service.js.map +1 -0
- package/dist/backend/backend/src/services/agent/crewly-agent/in-process-log-buffer.d.ts +95 -0
- package/dist/backend/backend/src/services/agent/crewly-agent/in-process-log-buffer.d.ts.map +1 -0
- package/dist/backend/backend/src/services/agent/crewly-agent/in-process-log-buffer.js +130 -0
- package/dist/backend/backend/src/services/agent/crewly-agent/in-process-log-buffer.js.map +1 -0
- package/dist/backend/backend/src/services/agent/crewly-agent/index.d.ts +14 -0
- package/dist/backend/backend/src/services/agent/crewly-agent/index.d.ts.map +1 -0
- package/dist/backend/backend/src/services/agent/crewly-agent/index.js +14 -0
- package/dist/backend/backend/src/services/agent/crewly-agent/index.js.map +1 -0
- package/dist/backend/backend/src/services/agent/crewly-agent/model-manager.d.ts +57 -0
- package/dist/backend/backend/src/services/agent/crewly-agent/model-manager.d.ts.map +1 -0
- package/dist/backend/backend/src/services/agent/crewly-agent/model-manager.js +93 -0
- package/dist/backend/backend/src/services/agent/crewly-agent/model-manager.js.map +1 -0
- package/dist/backend/backend/src/services/agent/crewly-agent/smoke-test.d.ts +13 -0
- package/dist/backend/backend/src/services/agent/crewly-agent/smoke-test.d.ts.map +1 -0
- package/dist/backend/backend/src/services/agent/crewly-agent/smoke-test.js +91 -0
- package/dist/backend/backend/src/services/agent/crewly-agent/smoke-test.js.map +1 -0
- package/dist/backend/backend/src/services/agent/crewly-agent/tool-registry.d.ts +29 -0
- package/dist/backend/backend/src/services/agent/crewly-agent/tool-registry.d.ts.map +1 -0
- package/dist/backend/backend/src/services/agent/crewly-agent/tool-registry.js +519 -0
- package/dist/backend/backend/src/services/agent/crewly-agent/tool-registry.js.map +1 -0
- package/dist/backend/backend/src/services/agent/crewly-agent/types.d.ts +159 -0
- package/dist/backend/backend/src/services/agent/crewly-agent/types.d.ts.map +1 -0
- package/dist/backend/backend/src/services/agent/crewly-agent/types.js +63 -0
- package/dist/backend/backend/src/services/agent/crewly-agent/types.js.map +1 -0
- package/dist/backend/backend/src/services/agent/gemini-runtime.service.d.ts +1 -0
- package/dist/backend/backend/src/services/agent/gemini-runtime.service.d.ts.map +1 -1
- package/dist/backend/backend/src/services/agent/gemini-runtime.service.js +30 -43
- package/dist/backend/backend/src/services/agent/gemini-runtime.service.js.map +1 -1
- package/dist/backend/backend/src/services/agent/oauth-relogin-monitor.service.d.ts +216 -0
- package/dist/backend/backend/src/services/agent/oauth-relogin-monitor.service.d.ts.map +1 -0
- package/dist/backend/backend/src/services/agent/oauth-relogin-monitor.service.js +496 -0
- package/dist/backend/backend/src/services/agent/oauth-relogin-monitor.service.js.map +1 -0
- package/dist/backend/backend/src/services/agent/openhands-runtime.service.d.ts +70 -0
- package/dist/backend/backend/src/services/agent/openhands-runtime.service.d.ts.map +1 -0
- package/dist/backend/backend/src/services/agent/openhands-runtime.service.js +131 -0
- package/dist/backend/backend/src/services/agent/openhands-runtime.service.js.map +1 -0
- package/dist/backend/backend/src/services/agent/pty-activity-tracker.service.d.ts +21 -1
- package/dist/backend/backend/src/services/agent/pty-activity-tracker.service.d.ts.map +1 -1
- package/dist/backend/backend/src/services/agent/pty-activity-tracker.service.js +32 -1
- package/dist/backend/backend/src/services/agent/pty-activity-tracker.service.js.map +1 -1
- package/dist/backend/backend/src/services/agent/runtime-exit-monitor.service.d.ts +133 -4
- package/dist/backend/backend/src/services/agent/runtime-exit-monitor.service.d.ts.map +1 -1
- package/dist/backend/backend/src/services/agent/runtime-exit-monitor.service.js +492 -183
- package/dist/backend/backend/src/services/agent/runtime-exit-monitor.service.js.map +1 -1
- package/dist/backend/backend/src/services/agent/runtime-service.factory.d.ts.map +1 -1
- package/dist/backend/backend/src/services/agent/runtime-service.factory.js +9 -0
- package/dist/backend/backend/src/services/agent/runtime-service.factory.js.map +1 -1
- package/dist/backend/backend/src/services/ai/prompt-builder.service.d.ts +49 -2
- package/dist/backend/backend/src/services/ai/prompt-builder.service.d.ts.map +1 -1
- package/dist/backend/backend/src/services/ai/prompt-builder.service.js +124 -2
- package/dist/backend/backend/src/services/ai/prompt-builder.service.js.map +1 -1
- package/dist/backend/backend/src/services/chat/chat.service.d.ts +17 -3
- package/dist/backend/backend/src/services/chat/chat.service.d.ts.map +1 -1
- package/dist/backend/backend/src/services/chat/chat.service.js +63 -13
- package/dist/backend/backend/src/services/chat/chat.service.js.map +1 -1
- package/dist/backend/backend/src/services/cloud/admin-seed.service.d.ts +18 -0
- package/dist/backend/backend/src/services/cloud/admin-seed.service.d.ts.map +1 -0
- package/dist/backend/backend/src/services/cloud/admin-seed.service.js +50 -0
- package/dist/backend/backend/src/services/cloud/admin-seed.service.js.map +1 -0
- package/dist/backend/backend/src/services/cloud/auth/auth.service.d.ts +174 -0
- package/dist/backend/backend/src/services/cloud/auth/auth.service.d.ts.map +1 -0
- package/dist/backend/backend/src/services/cloud/auth/auth.service.js +402 -0
- package/dist/backend/backend/src/services/cloud/auth/auth.service.js.map +1 -0
- package/dist/backend/backend/src/services/cloud/auth/auth.types.d.ts +110 -0
- package/dist/backend/backend/src/services/cloud/auth/auth.types.d.ts.map +1 -0
- package/dist/backend/backend/src/services/cloud/auth/auth.types.js +54 -0
- package/dist/backend/backend/src/services/cloud/auth/auth.types.js.map +1 -0
- package/dist/backend/backend/src/services/cloud/auth/auth.utils.d.ts +36 -0
- package/dist/backend/backend/src/services/cloud/auth/auth.utils.d.ts.map +1 -0
- package/dist/backend/backend/src/services/cloud/auth/auth.utils.js +31 -0
- package/dist/backend/backend/src/services/cloud/auth/auth.utils.js.map +1 -0
- package/dist/backend/backend/src/services/cloud/auth/jwt-auth.middleware.d.ts +47 -0
- package/dist/backend/backend/src/services/cloud/auth/jwt-auth.middleware.d.ts.map +1 -0
- package/dist/backend/backend/src/services/cloud/auth/jwt-auth.middleware.js +116 -0
- package/dist/backend/backend/src/services/cloud/auth/jwt-auth.middleware.js.map +1 -0
- package/dist/backend/backend/src/services/cloud/auth/supabase-auth.middleware.d.ts +61 -0
- package/dist/backend/backend/src/services/cloud/auth/supabase-auth.middleware.d.ts.map +1 -0
- package/dist/backend/backend/src/services/cloud/auth/supabase-auth.middleware.js +203 -0
- package/dist/backend/backend/src/services/cloud/auth/supabase-auth.middleware.js.map +1 -0
- package/dist/backend/backend/src/services/cloud/cloud-auth.middleware.d.ts +46 -0
- package/dist/backend/backend/src/services/cloud/cloud-auth.middleware.d.ts.map +1 -0
- package/dist/backend/backend/src/services/cloud/cloud-auth.middleware.js +95 -0
- package/dist/backend/backend/src/services/cloud/cloud-auth.middleware.js.map +1 -0
- package/dist/backend/backend/src/services/cloud/cloud-auth.service.d.ts +136 -0
- package/dist/backend/backend/src/services/cloud/cloud-auth.service.d.ts.map +1 -0
- package/dist/backend/backend/src/services/cloud/cloud-auth.service.js +204 -0
- package/dist/backend/backend/src/services/cloud/cloud-auth.service.js.map +1 -0
- package/dist/backend/backend/src/services/cloud/cloud-client.service.d.ts +179 -0
- package/dist/backend/backend/src/services/cloud/cloud-client.service.d.ts.map +1 -0
- package/dist/backend/backend/src/services/cloud/cloud-client.service.js +237 -0
- package/dist/backend/backend/src/services/cloud/cloud-client.service.js.map +1 -0
- package/dist/backend/backend/src/services/cloud/cloud-features.d.ts +19 -0
- package/dist/backend/backend/src/services/cloud/cloud-features.d.ts.map +1 -0
- package/dist/backend/backend/src/services/cloud/cloud-features.js +23 -0
- package/dist/backend/backend/src/services/cloud/cloud-features.js.map +1 -0
- package/dist/backend/backend/src/services/cloud/cloud-file.service.d.ts +97 -0
- package/dist/backend/backend/src/services/cloud/cloud-file.service.d.ts.map +1 -0
- package/dist/backend/backend/src/services/cloud/cloud-file.service.js +184 -0
- package/dist/backend/backend/src/services/cloud/cloud-file.service.js.map +1 -0
- package/dist/backend/backend/src/services/cloud/cloud-image-analysis.service.d.ts +114 -0
- package/dist/backend/backend/src/services/cloud/cloud-image-analysis.service.d.ts.map +1 -0
- package/dist/backend/backend/src/services/cloud/cloud-image-analysis.service.js +196 -0
- package/dist/backend/backend/src/services/cloud/cloud-image-analysis.service.js.map +1 -0
- package/dist/backend/backend/src/services/cloud/cloud-task-processor.service.d.ts +118 -0
- package/dist/backend/backend/src/services/cloud/cloud-task-processor.service.d.ts.map +1 -0
- package/dist/backend/backend/src/services/cloud/cloud-task-processor.service.js +326 -0
- package/dist/backend/backend/src/services/cloud/cloud-task-processor.service.js.map +1 -0
- package/dist/backend/backend/src/services/cloud/cloud-task.service.d.ts +115 -0
- package/dist/backend/backend/src/services/cloud/cloud-task.service.d.ts.map +1 -0
- package/dist/backend/backend/src/services/cloud/cloud-task.service.js +265 -0
- package/dist/backend/backend/src/services/cloud/cloud-task.service.js.map +1 -0
- package/dist/backend/backend/src/services/cloud/mongodb.service.d.ts +45 -0
- package/dist/backend/backend/src/services/cloud/mongodb.service.d.ts.map +1 -0
- package/dist/backend/backend/src/services/cloud/mongodb.service.js +76 -0
- package/dist/backend/backend/src/services/cloud/mongodb.service.js.map +1 -0
- package/dist/backend/backend/src/services/cloud/relay-client.service.d.ts +175 -0
- package/dist/backend/backend/src/services/cloud/relay-client.service.d.ts.map +1 -0
- package/dist/backend/backend/src/services/cloud/relay-client.service.js +392 -0
- package/dist/backend/backend/src/services/cloud/relay-client.service.js.map +1 -0
- package/dist/backend/backend/src/services/cloud/relay-crypto.service.d.ts +87 -0
- package/dist/backend/backend/src/services/cloud/relay-crypto.service.d.ts.map +1 -0
- package/dist/backend/backend/src/services/cloud/relay-crypto.service.js +140 -0
- package/dist/backend/backend/src/services/cloud/relay-crypto.service.js.map +1 -0
- package/dist/backend/backend/src/services/cloud/relay-server.service.d.ts +181 -0
- package/dist/backend/backend/src/services/cloud/relay-server.service.d.ts.map +1 -0
- package/dist/backend/backend/src/services/cloud/relay-server.service.js +494 -0
- package/dist/backend/backend/src/services/cloud/relay-server.service.js.map +1 -0
- package/dist/backend/backend/src/services/cloud/relay.types.d.ts +170 -0
- package/dist/backend/backend/src/services/cloud/relay.types.d.ts.map +1 -0
- package/dist/backend/backend/src/services/cloud/relay.types.js +69 -0
- package/dist/backend/backend/src/services/cloud/relay.types.js.map +1 -0
- package/dist/backend/backend/src/services/continuation/continuation.service.d.ts.map +1 -1
- package/dist/backend/backend/src/services/continuation/continuation.service.js +5 -10
- package/dist/backend/backend/src/services/continuation/continuation.service.js.map +1 -1
- package/dist/backend/backend/src/services/continuation/patterns/idle-patterns.d.ts +9 -1
- package/dist/backend/backend/src/services/continuation/patterns/idle-patterns.d.ts.map +1 -1
- package/dist/backend/backend/src/services/continuation/patterns/idle-patterns.js +18 -4
- package/dist/backend/backend/src/services/continuation/patterns/idle-patterns.js.map +1 -1
- package/dist/backend/backend/src/services/core/env.config.d.ts +147 -0
- package/dist/backend/backend/src/services/core/env.config.d.ts.map +1 -0
- package/dist/backend/backend/src/services/core/env.config.js +226 -0
- package/dist/backend/backend/src/services/core/env.config.js.map +1 -0
- package/dist/backend/backend/src/services/core/storage.service.d.ts.map +1 -1
- package/dist/backend/backend/src/services/core/storage.service.js +5 -0
- package/dist/backend/backend/src/services/core/storage.service.js.map +1 -1
- package/dist/backend/backend/src/services/event-bus/event-bus.service.d.ts +30 -2
- package/dist/backend/backend/src/services/event-bus/event-bus.service.d.ts.map +1 -1
- package/dist/backend/backend/src/services/event-bus/event-bus.service.js +82 -12
- package/dist/backend/backend/src/services/event-bus/event-bus.service.js.map +1 -1
- package/dist/backend/backend/src/services/hierarchy/hierarchy-escalation.service.d.ts +160 -0
- package/dist/backend/backend/src/services/hierarchy/hierarchy-escalation.service.d.ts.map +1 -0
- package/dist/backend/backend/src/services/hierarchy/hierarchy-escalation.service.js +261 -0
- package/dist/backend/backend/src/services/hierarchy/hierarchy-escalation.service.js.map +1 -0
- package/dist/backend/backend/src/services/hierarchy/hierarchy-reporting.service.d.ts +161 -0
- package/dist/backend/backend/src/services/hierarchy/hierarchy-reporting.service.d.ts.map +1 -0
- package/dist/backend/backend/src/services/hierarchy/hierarchy-reporting.service.js +276 -0
- package/dist/backend/backend/src/services/hierarchy/hierarchy-reporting.service.js.map +1 -0
- package/dist/backend/backend/src/services/marketplace/index.d.ts +1 -0
- package/dist/backend/backend/src/services/marketplace/index.d.ts.map +1 -1
- package/dist/backend/backend/src/services/marketplace/index.js +2 -0
- package/dist/backend/backend/src/services/marketplace/index.js.map +1 -1
- package/dist/backend/backend/src/services/marketplace/marketplace.service.js +2 -2
- package/dist/backend/backend/src/services/marketplace/template-marketplace.service.d.ts +149 -0
- package/dist/backend/backend/src/services/marketplace/template-marketplace.service.d.ts.map +1 -0
- package/dist/backend/backend/src/services/marketplace/template-marketplace.service.js +500 -0
- package/dist/backend/backend/src/services/marketplace/template-marketplace.service.js.map +1 -0
- package/dist/backend/backend/src/services/mcp-server.js +1 -1
- package/dist/backend/backend/src/services/mcp-server.js.map +1 -1
- package/dist/backend/backend/src/services/messaging/adapters/google-chat-messenger.adapter.d.ts +90 -0
- package/dist/backend/backend/src/services/messaging/adapters/google-chat-messenger.adapter.d.ts.map +1 -0
- package/dist/backend/backend/src/services/messaging/adapters/google-chat-messenger.adapter.js +233 -0
- package/dist/backend/backend/src/services/messaging/adapters/google-chat-messenger.adapter.js.map +1 -0
- package/dist/backend/backend/src/services/messaging/message-queue.service.d.ts.map +1 -1
- package/dist/backend/backend/src/services/messaging/message-queue.service.js +1 -0
- package/dist/backend/backend/src/services/messaging/message-queue.service.js.map +1 -1
- package/dist/backend/backend/src/services/messaging/messenger-adapter.interface.d.ts +1 -1
- package/dist/backend/backend/src/services/messaging/messenger-adapter.interface.d.ts.map +1 -1
- package/dist/backend/backend/src/services/messaging/queue-processor.service.d.ts.map +1 -1
- package/dist/backend/backend/src/services/messaging/queue-processor.service.js +23 -5
- package/dist/backend/backend/src/services/messaging/queue-processor.service.js.map +1 -1
- package/dist/backend/backend/src/services/monitoring/activity-monitor.service.d.ts.map +1 -1
- package/dist/backend/backend/src/services/monitoring/activity-monitor.service.js +3 -3
- package/dist/backend/backend/src/services/monitoring/activity-monitor.service.js.map +1 -1
- package/dist/backend/backend/src/services/orchestrator/orchestrator-heartbeat-monitor.service.d.ts.map +1 -1
- package/dist/backend/backend/src/services/orchestrator/orchestrator-heartbeat-monitor.service.js +29 -5
- package/dist/backend/backend/src/services/orchestrator/orchestrator-heartbeat-monitor.service.js.map +1 -1
- package/dist/backend/backend/src/services/orchestrator/orchestrator-restart.service.d.ts.map +1 -1
- package/dist/backend/backend/src/services/orchestrator/orchestrator-restart.service.js +6 -0
- package/dist/backend/backend/src/services/orchestrator/orchestrator-restart.service.js.map +1 -1
- package/dist/backend/backend/src/services/payment/magic-moment.service.d.ts +69 -0
- package/dist/backend/backend/src/services/payment/magic-moment.service.d.ts.map +1 -0
- package/dist/backend/backend/src/services/payment/magic-moment.service.js +158 -0
- package/dist/backend/backend/src/services/payment/magic-moment.service.js.map +1 -0
- package/dist/backend/backend/src/services/payment/magic-moment.types.d.ts +95 -0
- package/dist/backend/backend/src/services/payment/magic-moment.types.d.ts.map +1 -0
- package/dist/backend/backend/src/services/payment/magic-moment.types.js +91 -0
- package/dist/backend/backend/src/services/payment/magic-moment.types.js.map +1 -0
- package/dist/backend/backend/src/services/payment/stripe.service.d.ts +83 -0
- package/dist/backend/backend/src/services/payment/stripe.service.d.ts.map +1 -0
- package/dist/backend/backend/src/services/payment/stripe.service.js +279 -0
- package/dist/backend/backend/src/services/payment/stripe.service.js.map +1 -0
- package/dist/backend/backend/src/services/plugin/index.d.ts +9 -0
- package/dist/backend/backend/src/services/plugin/index.d.ts.map +1 -0
- package/dist/backend/backend/src/services/plugin/index.js +8 -0
- package/dist/backend/backend/src/services/plugin/index.js.map +1 -0
- package/dist/backend/backend/src/services/plugin/plugin.service.d.ts +102 -0
- package/dist/backend/backend/src/services/plugin/plugin.service.d.ts.map +1 -0
- package/dist/backend/backend/src/services/plugin/plugin.service.js +179 -0
- package/dist/backend/backend/src/services/plugin/plugin.service.js.map +1 -0
- package/dist/backend/backend/src/services/plugin/plugin.types.d.ts +88 -0
- package/dist/backend/backend/src/services/plugin/plugin.types.d.ts.map +1 -0
- package/dist/backend/backend/src/services/plugin/plugin.types.js +17 -0
- package/dist/backend/backend/src/services/plugin/plugin.types.js.map +1 -0
- package/dist/backend/backend/src/services/project/task-tracking.service.d.ts +17 -0
- package/dist/backend/backend/src/services/project/task-tracking.service.d.ts.map +1 -1
- package/dist/backend/backend/src/services/project/task-tracking.service.js +63 -0
- package/dist/backend/backend/src/services/project/task-tracking.service.js.map +1 -1
- package/dist/backend/backend/src/services/session/index.d.ts +2 -0
- package/dist/backend/backend/src/services/session/index.d.ts.map +1 -1
- package/dist/backend/backend/src/services/session/index.js +2 -0
- package/dist/backend/backend/src/services/session/index.js.map +1 -1
- package/dist/backend/backend/src/services/session/log-rotation.service.d.ts +163 -0
- package/dist/backend/backend/src/services/session/log-rotation.service.d.ts.map +1 -0
- package/dist/backend/backend/src/services/session/log-rotation.service.js +362 -0
- package/dist/backend/backend/src/services/session/log-rotation.service.js.map +1 -0
- package/dist/backend/backend/src/services/session/session-command-helper.d.ts +14 -0
- package/dist/backend/backend/src/services/session/session-command-helper.d.ts.map +1 -1
- package/dist/backend/backend/src/services/session/session-command-helper.js +54 -0
- package/dist/backend/backend/src/services/session/session-command-helper.js.map +1 -1
- package/dist/backend/backend/src/services/settings/settings.service.d.ts.map +1 -1
- package/dist/backend/backend/src/services/settings/settings.service.js +1 -0
- package/dist/backend/backend/src/services/settings/settings.service.js.map +1 -1
- package/dist/backend/backend/src/services/slack/slack-orchestrator-bridge.d.ts +11 -0
- package/dist/backend/backend/src/services/slack/slack-orchestrator-bridge.d.ts.map +1 -1
- package/dist/backend/backend/src/services/slack/slack-orchestrator-bridge.js +98 -6
- package/dist/backend/backend/src/services/slack/slack-orchestrator-bridge.js.map +1 -1
- package/dist/backend/backend/src/services/template/template.service.d.ts +118 -0
- package/dist/backend/backend/src/services/template/template.service.d.ts.map +1 -0
- package/dist/backend/backend/src/services/template/template.service.js +299 -0
- package/dist/backend/backend/src/services/template/template.service.js.map +1 -0
- package/dist/backend/backend/src/services/workflow/scheduler.service.d.ts +86 -0
- package/dist/backend/backend/src/services/workflow/scheduler.service.d.ts.map +1 -1
- package/dist/backend/backend/src/services/workflow/scheduler.service.js +251 -2
- package/dist/backend/backend/src/services/workflow/scheduler.service.js.map +1 -1
- package/dist/backend/backend/src/types/chat.types.d.ts +39 -1
- package/dist/backend/backend/src/types/chat.types.d.ts.map +1 -1
- package/dist/backend/backend/src/types/chat.types.js +65 -18
- package/dist/backend/backend/src/types/chat.types.js.map +1 -1
- package/dist/backend/backend/src/types/event-bus.types.d.ts +45 -2
- package/dist/backend/backend/src/types/event-bus.types.d.ts.map +1 -1
- package/dist/backend/backend/src/types/event-bus.types.js +65 -0
- package/dist/backend/backend/src/types/event-bus.types.js.map +1 -1
- package/dist/backend/backend/src/types/hierarchy-message.types.d.ts +101 -0
- package/dist/backend/backend/src/types/hierarchy-message.types.d.ts.map +1 -0
- package/dist/backend/backend/src/types/hierarchy-message.types.js +15 -0
- package/dist/backend/backend/src/types/hierarchy-message.types.js.map +1 -0
- package/dist/backend/backend/src/types/index.d.ts +54 -4
- package/dist/backend/backend/src/types/index.d.ts.map +1 -1
- package/dist/backend/backend/src/types/index.js.map +1 -1
- package/dist/backend/backend/src/types/marketplace.types.d.ts +99 -0
- package/dist/backend/backend/src/types/marketplace.types.d.ts.map +1 -1
- package/dist/backend/backend/src/types/messaging.types.d.ts +4 -0
- package/dist/backend/backend/src/types/messaging.types.d.ts.map +1 -1
- package/dist/backend/backend/src/types/messaging.types.js.map +1 -1
- package/dist/backend/backend/src/types/settings.types.d.ts +1 -1
- package/dist/backend/backend/src/types/settings.types.d.ts.map +1 -1
- package/dist/backend/backend/src/types/settings.types.js +4 -0
- package/dist/backend/backend/src/types/settings.types.js.map +1 -1
- package/dist/backend/backend/src/types/task-tracking.types.d.ts +79 -1
- package/dist/backend/backend/src/types/task-tracking.types.d.ts.map +1 -1
- package/dist/backend/backend/src/types/task-tracking.types.js.map +1 -1
- package/dist/backend/backend/src/types/team-template.types.d.ts +166 -0
- package/dist/backend/backend/src/types/team-template.types.d.ts.map +1 -0
- package/dist/backend/backend/src/types/team-template.types.js +139 -0
- package/dist/backend/backend/src/types/team-template.types.js.map +1 -0
- package/dist/backend/backend/src/utils/async-handler.d.ts +20 -0
- package/dist/backend/backend/src/utils/async-handler.d.ts.map +1 -0
- package/dist/backend/backend/src/utils/async-handler.js +29 -0
- package/dist/backend/backend/src/utils/async-handler.js.map +1 -0
- package/dist/backend/backend/src/utils/defaultPrompts.d.ts +4 -4
- package/dist/backend/backend/src/utils/defaultPrompts.d.ts.map +1 -1
- package/dist/backend/backend/src/utils/defaultPrompts.js +16 -0
- package/dist/backend/backend/src/utils/defaultPrompts.js.map +1 -1
- package/dist/backend/backend/src/utils/gemini-trusted-folders.d.ts +43 -0
- package/dist/backend/backend/src/utils/gemini-trusted-folders.d.ts.map +1 -0
- package/dist/backend/backend/src/utils/gemini-trusted-folders.js +94 -0
- package/dist/backend/backend/src/utils/gemini-trusted-folders.js.map +1 -0
- package/dist/backend/backend/src/utils/message-serializer.d.ts +74 -0
- package/dist/backend/backend/src/utils/message-serializer.d.ts.map +1 -0
- package/dist/backend/backend/src/utils/message-serializer.js +380 -0
- package/dist/backend/backend/src/utils/message-serializer.js.map +1 -0
- package/dist/backend/backend/src/utils/terminal-string-ops.d.ts.map +1 -1
- package/dist/backend/backend/src/utils/terminal-string-ops.js +20 -11
- package/dist/backend/backend/src/utils/terminal-string-ops.js.map +1 -1
- package/dist/backend/backend/src/websocket/terminal.gateway.d.ts +4 -4
- package/dist/backend/backend/src/websocket/terminal.gateway.d.ts.map +1 -1
- package/dist/backend/backend/src/websocket/terminal.gateway.js +9 -6
- package/dist/backend/backend/src/websocket/terminal.gateway.js.map +1 -1
- package/dist/backend/config/constants.d.ts +44 -3
- package/dist/backend/config/constants.d.ts.map +1 -1
- package/dist/backend/config/constants.js +45 -3
- package/dist/backend/config/constants.js.map +1 -1
- package/dist/backend/config/index.d.ts +2 -2
- package/dist/backend/config/index.d.ts.map +1 -1
- package/dist/backend/config/index.js +2 -2
- package/dist/backend/config/index.js.map +1 -1
- package/dist/cli/backend/src/constants.d.ts +344 -16
- package/dist/cli/backend/src/constants.d.ts.map +1 -1
- package/dist/cli/backend/src/constants.js +334 -15
- package/dist/cli/backend/src/constants.js.map +1 -1
- package/dist/cli/backend/src/models/Team.d.ts +5 -0
- package/dist/cli/backend/src/models/Team.d.ts.map +1 -1
- package/dist/cli/backend/src/models/Team.js +24 -0
- package/dist/cli/backend/src/models/Team.js.map +1 -1
- package/dist/cli/backend/src/services/core/storage.service.d.ts.map +1 -1
- package/dist/cli/backend/src/services/core/storage.service.js +5 -0
- package/dist/cli/backend/src/services/core/storage.service.js.map +1 -1
- package/dist/cli/backend/src/services/mcp-server.js +1 -1
- package/dist/cli/backend/src/services/mcp-server.js.map +1 -1
- package/dist/cli/backend/src/types/chat.types.d.ts +39 -1
- package/dist/cli/backend/src/types/chat.types.d.ts.map +1 -1
- package/dist/cli/backend/src/types/chat.types.js +65 -18
- package/dist/cli/backend/src/types/chat.types.js.map +1 -1
- package/dist/cli/backend/src/types/index.d.ts +54 -4
- package/dist/cli/backend/src/types/index.d.ts.map +1 -1
- package/dist/cli/backend/src/types/index.js.map +1 -1
- package/dist/cli/backend/src/types/settings.types.d.ts +1 -1
- package/dist/cli/backend/src/types/settings.types.d.ts.map +1 -1
- package/dist/cli/backend/src/types/settings.types.js +4 -0
- package/dist/cli/backend/src/types/settings.types.js.map +1 -1
- package/dist/cli/backend/src/utils/gemini-trusted-folders.d.ts +43 -0
- package/dist/cli/backend/src/utils/gemini-trusted-folders.d.ts.map +1 -0
- package/dist/cli/backend/src/utils/gemini-trusted-folders.js +94 -0
- package/dist/cli/backend/src/utils/gemini-trusted-folders.js.map +1 -0
- package/dist/cli/backend/src/utils/terminal-string-ops.d.ts.map +1 -1
- package/dist/cli/backend/src/utils/terminal-string-ops.js +20 -11
- package/dist/cli/backend/src/utils/terminal-string-ops.js.map +1 -1
- package/dist/cli/cli/src/commands/onboard.d.ts +2 -1
- package/dist/cli/cli/src/commands/onboard.d.ts.map +1 -1
- package/dist/cli/cli/src/commands/onboard.js +21 -8
- package/dist/cli/cli/src/commands/onboard.js.map +1 -1
- package/dist/cli/cli/src/commands/start.d.ts +1 -0
- package/dist/cli/cli/src/commands/start.d.ts.map +1 -1
- package/dist/cli/cli/src/commands/start.js +71 -23
- package/dist/cli/cli/src/commands/start.js.map +1 -1
- package/dist/cli/cli/src/constants.d.ts +1 -1
- package/dist/cli/cli/src/constants.d.ts.map +1 -1
- package/dist/cli/cli/src/constants.js +1 -1
- package/dist/cli/cli/src/constants.js.map +1 -1
- package/dist/cli/cli/src/index.js +1 -0
- package/dist/cli/cli/src/index.js.map +1 -1
- package/dist/cli/cli/src/utils/project-scaffold.d.ts +109 -0
- package/dist/cli/cli/src/utils/project-scaffold.d.ts.map +1 -0
- package/dist/cli/cli/src/utils/project-scaffold.js +346 -0
- package/dist/cli/cli/src/utils/project-scaffold.js.map +1 -0
- package/dist/cli/cli/src/utils/templates.d.ts +7 -2
- package/dist/cli/cli/src/utils/templates.d.ts.map +1 -1
- package/dist/cli/cli/src/utils/templates.js +76 -7
- package/dist/cli/cli/src/utils/templates.js.map +1 -1
- package/dist/cli/config/constants.d.ts +44 -3
- package/dist/cli/config/constants.d.ts.map +1 -1
- package/dist/cli/config/constants.js +45 -3
- package/dist/cli/config/constants.js.map +1 -1
- package/dist/cli/config/index.d.ts +2 -2
- package/dist/cli/config/index.d.ts.map +1 -1
- package/dist/cli/config/index.js +2 -2
- package/dist/cli/config/index.js.map +1 -1
- package/frontend/dist/assets/index-3558d1a2.js +4919 -0
- package/frontend/dist/assets/index-4c4dcc31.css +33 -0
- package/frontend/dist/index.html +2 -2
- package/package.json +14 -3
- package/frontend/dist/assets/index-a23214ae.js +0 -4919
- package/frontend/dist/assets/index-c407fe13.css +0 -33
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import * as fs from 'fs/promises';
|
|
2
|
+
import * as http from 'http';
|
|
2
3
|
import { LoggerService } from '../core/logger.service.js';
|
|
3
4
|
import { StorageService } from '../core/storage.service.js';
|
|
4
5
|
import { getSessionBackendSync, createSessionCommandHelper, } from '../session/index.js';
|
|
@@ -9,7 +10,8 @@ import { getTerminalGateway } from '../../websocket/terminal.gateway.js';
|
|
|
9
10
|
import { SHELL_PROMPT_PATTERNS } from '../continuation/patterns/idle-patterns.js';
|
|
10
11
|
import { PtyActivityTrackerService } from './pty-activity-tracker.service.js';
|
|
11
12
|
import { OrchestratorRestartService } from '../orchestrator/orchestrator-restart.service.js';
|
|
12
|
-
import
|
|
13
|
+
import * as crypto from 'crypto';
|
|
14
|
+
import { CREWLY_CONSTANTS, ORCHESTRATOR_SESSION_NAME, ORCHESTRATOR_ROLE, RUNTIME_EXIT_CONSTANTS, AGENT_SUSPEND_CONSTANTS, SESSION_COMMAND_DELAYS, RUNTIME_TYPES, GEMINI_FAILURE_PATTERNS, GEMINI_FORCE_RESTART_PATTERNS, CLAUDE_FATAL_PATTERNS, GEMINI_FAILURE_RETRY_CONSTANTS, GEMINI_READY_PATTERNS, WEB_CONSTANTS, AGENT_HEARTBEAT_MONITOR_CONSTANTS, } from '../../constants.js';
|
|
13
15
|
import { delay } from '../../utils/async.utils.js';
|
|
14
16
|
/**
|
|
15
17
|
* Service that monitors PTY sessions for runtime exit patterns.
|
|
@@ -28,6 +30,10 @@ import { delay } from '../../utils/async.utils.js';
|
|
|
28
30
|
* needs recovery. These failure patterns bypass the shell prompt verification
|
|
29
31
|
* since the CLI may still be running but non-functional.
|
|
30
32
|
*
|
|
33
|
+
* For Claude Code, the service detects fatal API errors (e.g. thinking
|
|
34
|
+
* block corruption) that make the CLI permanently non-functional within
|
|
35
|
+
* the current session. These trigger immediate recovery without retry.
|
|
36
|
+
*
|
|
31
37
|
* @example
|
|
32
38
|
* ```typescript
|
|
33
39
|
* const monitor = RuntimeExitMonitorService.getInstance();
|
|
@@ -43,6 +49,14 @@ export class RuntimeExitMonitorService {
|
|
|
43
49
|
onExitDetectedCallback;
|
|
44
50
|
agentRegistrationService = null;
|
|
45
51
|
taskTrackingService = null;
|
|
52
|
+
eventBusService = null;
|
|
53
|
+
/**
|
|
54
|
+
* Restart timestamps per session, persisted across monitoring cycles.
|
|
55
|
+
* Unlike MonitoredSession (which is recreated on each startMonitoring call),
|
|
56
|
+
* this map survives agent restarts to prevent infinite restart loops
|
|
57
|
+
* when agents keep crashing (e.g. during network outages).
|
|
58
|
+
*/
|
|
59
|
+
restartHistory = new Map();
|
|
46
60
|
constructor() {
|
|
47
61
|
this.logger = LoggerService.getInstance().createComponentLogger('RuntimeExitMonitorService');
|
|
48
62
|
}
|
|
@@ -89,6 +103,14 @@ export class RuntimeExitMonitorService {
|
|
|
89
103
|
setTaskTrackingService(service) {
|
|
90
104
|
this.taskTrackingService = service;
|
|
91
105
|
}
|
|
106
|
+
/**
|
|
107
|
+
* Set the EventBusService dependency for publishing agent lifecycle events.
|
|
108
|
+
*
|
|
109
|
+
* @param service - The EventBusService instance
|
|
110
|
+
*/
|
|
111
|
+
setEventBusService(service) {
|
|
112
|
+
this.eventBusService = service;
|
|
113
|
+
}
|
|
92
114
|
/**
|
|
93
115
|
* Start monitoring a PTY session for runtime exit patterns.
|
|
94
116
|
*
|
|
@@ -163,6 +185,10 @@ export class RuntimeExitMonitorService {
|
|
|
163
185
|
/**
|
|
164
186
|
* Stop monitoring a PTY session.
|
|
165
187
|
*
|
|
188
|
+
* Also prunes the restartHistory entry for this session if it has no
|
|
189
|
+
* recent timestamps within the cooldown window, preventing slow memory
|
|
190
|
+
* leak for terminated sessions.
|
|
191
|
+
*
|
|
166
192
|
* @param sessionName - PTY session name
|
|
167
193
|
*/
|
|
168
194
|
stopMonitoring(sessionName) {
|
|
@@ -178,6 +204,21 @@ export class RuntimeExitMonitorService {
|
|
|
178
204
|
}
|
|
179
205
|
monitored.unsubscribe();
|
|
180
206
|
this.sessions.delete(sessionName);
|
|
207
|
+
// Fix 3: Clean up restartHistory for terminated sessions to prevent
|
|
208
|
+
// unbounded Map growth. Keep the entry only if it has recent timestamps
|
|
209
|
+
// within the cooldown window (they may still be needed if the session
|
|
210
|
+
// is restarted soon). Delete the entry entirely otherwise.
|
|
211
|
+
const timestamps = this.restartHistory.get(sessionName);
|
|
212
|
+
if (timestamps) {
|
|
213
|
+
const windowStart = Date.now() - AGENT_HEARTBEAT_MONITOR_CONSTANTS.COOLDOWN_WINDOW_MS;
|
|
214
|
+
const recent = timestamps.filter(ts => ts > windowStart);
|
|
215
|
+
if (recent.length === 0) {
|
|
216
|
+
this.restartHistory.delete(sessionName);
|
|
217
|
+
}
|
|
218
|
+
else {
|
|
219
|
+
this.restartHistory.set(sessionName, recent);
|
|
220
|
+
}
|
|
221
|
+
}
|
|
181
222
|
this.logger.debug('Stopped runtime exit monitoring', { sessionName });
|
|
182
223
|
}
|
|
183
224
|
/**
|
|
@@ -194,6 +235,7 @@ export class RuntimeExitMonitorService {
|
|
|
194
235
|
for (const sessionName of sessionNames) {
|
|
195
236
|
this.stopMonitoring(sessionName);
|
|
196
237
|
}
|
|
238
|
+
this.restartHistory.clear();
|
|
197
239
|
this.logger.debug('All runtime exit monitors destroyed');
|
|
198
240
|
}
|
|
199
241
|
/**
|
|
@@ -229,11 +271,19 @@ export class RuntimeExitMonitorService {
|
|
|
229
271
|
/**
|
|
230
272
|
* Confirm exit by checking for a shell prompt, then react.
|
|
231
273
|
*
|
|
274
|
+
* Runtime-specific failure checks are gated by runtimeType so that
|
|
275
|
+
* patterns for one runtime cannot accidentally match another (e.g. a
|
|
276
|
+
* Codex exit matching Claude or Gemini patterns).
|
|
277
|
+
*
|
|
232
278
|
* For Gemini CLI failure patterns (API errors, quota exhaustion, etc.),
|
|
233
279
|
* the system retries with exponential backoff before declaring the agent
|
|
234
280
|
* dead. Gemini CLI often recovers automatically from transient API errors
|
|
235
281
|
* (RESOURCE_EXHAUSTED, UNAVAILABLE, Connection error). Only after
|
|
236
282
|
* MAX_RETRIES does the system proceed with the exit/restart flow.
|
|
283
|
+
*
|
|
284
|
+
* For Claude Code fatal patterns (thinking block corruption, etc.),
|
|
285
|
+
* the system skips retry and forces immediate recovery since these
|
|
286
|
+
* errors are permanently unrecoverable within the same session.
|
|
237
287
|
*/
|
|
238
288
|
async confirmAndReact(sessionName, helper) {
|
|
239
289
|
const monitored = this.sessions.get(sessionName);
|
|
@@ -245,46 +295,11 @@ export class RuntimeExitMonitorService {
|
|
|
245
295
|
// Verify shell prompt is visible (avoids false positives)
|
|
246
296
|
const shellPromptConfirmed = this.verifyExitWithShellPrompt(sessionName, helper);
|
|
247
297
|
if (!shellPromptConfirmed) {
|
|
248
|
-
|
|
249
|
-
|
|
250
|
-
// as an actionable runtime failure even if shell prompt isn't visible.
|
|
251
|
-
const isCodexInterrupted = monitored.runtimeType === RUNTIME_TYPES.CODEX_CLI
|
|
252
|
-
&& /Conversation interrupted/i.test(monitored.buffer);
|
|
253
|
-
if (isCodexInterrupted) {
|
|
254
|
-
this.logger.warn('Codex interruption detected, proceeding with recovery flow', {
|
|
255
|
-
sessionName,
|
|
256
|
-
});
|
|
257
|
-
// fall through to exit/restart handling below
|
|
258
|
-
}
|
|
259
|
-
// For Gemini CLI: detect either retryable failure patterns or forced
|
|
260
|
-
// restart/update markers that require immediate recovery handling.
|
|
261
|
-
const isGeminiFailure = monitored.runtimeType === RUNTIME_TYPES.GEMINI_CLI
|
|
262
|
-
&& GEMINI_FAILURE_PATTERNS.some((pattern) => pattern.test(monitored.buffer));
|
|
263
|
-
const isGeminiForceRestart = monitored.runtimeType === RUNTIME_TYPES.GEMINI_CLI
|
|
264
|
-
&& GEMINI_FORCE_RESTART_PATTERNS.some((pattern) => pattern.test(monitored.buffer));
|
|
265
|
-
if (!isGeminiFailure && !isGeminiForceRestart && !isCodexInterrupted) {
|
|
298
|
+
const runtimeSpecificMatch = await this.checkRuntimeSpecificFailure(sessionName, monitored, helper);
|
|
299
|
+
if (!runtimeSpecificMatch) {
|
|
266
300
|
this.logger.debug('Exit pattern matched but shell prompt not confirmed, ignoring', { sessionName });
|
|
267
301
|
return;
|
|
268
302
|
}
|
|
269
|
-
if (isGeminiFailure || isGeminiForceRestart) {
|
|
270
|
-
// Some Gemini failures are transient; others (auto-update/restart)
|
|
271
|
-
// should trigger immediate recovery and task re-delivery.
|
|
272
|
-
const forceRestart = isGeminiForceRestart;
|
|
273
|
-
if (forceRestart) {
|
|
274
|
-
this.logger.warn('Gemini auto-update interruption detected, forcing recovery flow', {
|
|
275
|
-
sessionName,
|
|
276
|
-
});
|
|
277
|
-
}
|
|
278
|
-
else {
|
|
279
|
-
// Retry with exponential backoff before declaring exit.
|
|
280
|
-
// Gemini CLI can recover from transient API errors automatically.
|
|
281
|
-
const retryResult = await this.handleGeminiFailureWithRetry(sessionName, monitored, helper);
|
|
282
|
-
if (retryResult === 'recovered') {
|
|
283
|
-
return;
|
|
284
|
-
}
|
|
285
|
-
// retryResult === 'exhausted' — fall through to exit flow
|
|
286
|
-
}
|
|
287
|
-
}
|
|
288
303
|
}
|
|
289
304
|
// Mark as detected to prevent double-processing
|
|
290
305
|
monitored.exitDetected = true;
|
|
@@ -294,179 +309,295 @@ export class RuntimeExitMonitorService {
|
|
|
294
309
|
role: monitored.role,
|
|
295
310
|
});
|
|
296
311
|
// Fire the exit-detected callback (used to cancel pending registrations)
|
|
297
|
-
|
|
298
|
-
|
|
299
|
-
|
|
312
|
+
this.fireExitDetectedCallback(sessionName);
|
|
313
|
+
// Try agent restart if it has in-progress tasks (non-orchestrator only)
|
|
314
|
+
if (monitored.role !== ORCHESTRATOR_ROLE && this.agentRegistrationService && this.taskTrackingService) {
|
|
315
|
+
const restarted = await this.tryAgentRestartWithTasks(sessionName, monitored);
|
|
316
|
+
if (restarted)
|
|
317
|
+
return;
|
|
318
|
+
}
|
|
319
|
+
// Orchestrator-specific restart
|
|
320
|
+
if (sessionName === ORCHESTRATOR_SESSION_NAME) {
|
|
321
|
+
const restarted = await this.tryOrchestratorRestart(sessionName, monitored);
|
|
322
|
+
if (restarted)
|
|
323
|
+
return;
|
|
324
|
+
}
|
|
325
|
+
// Normal inactive flow: update status, capture memory, broadcast
|
|
326
|
+
await this.transitionToInactive(sessionName, monitored);
|
|
327
|
+
// Cleanup this subscription
|
|
328
|
+
this.stopMonitoring(sessionName);
|
|
329
|
+
}
|
|
330
|
+
finally {
|
|
331
|
+
monitored.confirmationInFlight = false;
|
|
332
|
+
}
|
|
333
|
+
}
|
|
334
|
+
/**
|
|
335
|
+
* Check for runtime-specific failure patterns when shell prompt is not confirmed.
|
|
336
|
+
*
|
|
337
|
+
* Gated by runtimeType so patterns for one runtime cannot accidentally
|
|
338
|
+
* match another. Returns true if a runtime-specific failure was detected,
|
|
339
|
+
* or 'deferred' handling occurred (Gemini retry).
|
|
340
|
+
*
|
|
341
|
+
* @param sessionName - PTY session name
|
|
342
|
+
* @param monitored - Monitored session state
|
|
343
|
+
* @param helper - Session command helper
|
|
344
|
+
* @returns True if a runtime-specific failure was confirmed
|
|
345
|
+
*/
|
|
346
|
+
async checkRuntimeSpecificFailure(sessionName, monitored, helper) {
|
|
347
|
+
if (monitored.runtimeType === RUNTIME_TYPES.CODEX_CLI) {
|
|
348
|
+
const isCodexInterrupted = /Conversation interrupted/i.test(monitored.buffer);
|
|
349
|
+
if (isCodexInterrupted) {
|
|
350
|
+
this.logger.warn('Codex interruption detected, proceeding with recovery flow', { sessionName });
|
|
351
|
+
return true;
|
|
352
|
+
}
|
|
353
|
+
}
|
|
354
|
+
else if (monitored.runtimeType === RUNTIME_TYPES.CLAUDE_CODE) {
|
|
355
|
+
const isClaudeFatal = CLAUDE_FATAL_PATTERNS.some((pattern) => pattern.test(monitored.buffer));
|
|
356
|
+
if (isClaudeFatal) {
|
|
357
|
+
const detectedPattern = CLAUDE_FATAL_PATTERNS.find((p) => p.test(monitored.buffer))?.source;
|
|
358
|
+
this.logger.warn('Claude Code fatal error detected, forcing immediate recovery', {
|
|
359
|
+
sessionName,
|
|
360
|
+
detectedPattern,
|
|
361
|
+
});
|
|
362
|
+
return true;
|
|
363
|
+
}
|
|
364
|
+
}
|
|
365
|
+
else if (monitored.runtimeType === RUNTIME_TYPES.GEMINI_CLI) {
|
|
366
|
+
const isGeminiFailure = GEMINI_FAILURE_PATTERNS.some((pattern) => pattern.test(monitored.buffer));
|
|
367
|
+
const isGeminiForceRestart = GEMINI_FORCE_RESTART_PATTERNS.some((pattern) => pattern.test(monitored.buffer));
|
|
368
|
+
if (isGeminiFailure || isGeminiForceRestart) {
|
|
369
|
+
if (isGeminiForceRestart) {
|
|
370
|
+
this.logger.warn('Gemini auto-update interruption detected, forcing recovery flow', { sessionName });
|
|
300
371
|
}
|
|
301
|
-
|
|
302
|
-
this.
|
|
303
|
-
|
|
304
|
-
|
|
305
|
-
}
|
|
372
|
+
else {
|
|
373
|
+
const retryResult = await this.handleGeminiFailureWithRetry(sessionName, monitored, helper);
|
|
374
|
+
if (retryResult === 'recovered' || retryResult === 'deferred') {
|
|
375
|
+
return false; // Not a confirmed exit — caller should return early
|
|
376
|
+
}
|
|
306
377
|
}
|
|
378
|
+
return true;
|
|
307
379
|
}
|
|
308
|
-
|
|
309
|
-
|
|
380
|
+
}
|
|
381
|
+
return false;
|
|
382
|
+
}
|
|
383
|
+
/**
|
|
384
|
+
* Fire the onExitDetected callback safely.
|
|
385
|
+
*
|
|
386
|
+
* @param sessionName - PTY session name
|
|
387
|
+
*/
|
|
388
|
+
fireExitDetectedCallback(sessionName) {
|
|
389
|
+
if (!this.onExitDetectedCallback)
|
|
390
|
+
return;
|
|
391
|
+
try {
|
|
392
|
+
this.onExitDetectedCallback(sessionName);
|
|
393
|
+
}
|
|
394
|
+
catch (error) {
|
|
395
|
+
this.logger.warn('onExitDetected callback error', {
|
|
396
|
+
sessionName,
|
|
397
|
+
error: error instanceof Error ? error.message : String(error),
|
|
398
|
+
});
|
|
399
|
+
}
|
|
400
|
+
}
|
|
401
|
+
/**
|
|
402
|
+
* Try to restart an agent that has in-progress tasks.
|
|
403
|
+
*
|
|
404
|
+
* @param sessionName - PTY session name
|
|
405
|
+
* @param monitored - Monitored session state
|
|
406
|
+
* @returns True if the agent was successfully restarted (caller should return)
|
|
407
|
+
*/
|
|
408
|
+
async tryAgentRestartWithTasks(sessionName, monitored) {
|
|
409
|
+
try {
|
|
410
|
+
const tasks = await this.taskTrackingService.getTasksForTeamMember(monitored.memberId || '');
|
|
411
|
+
const activeTasks = tasks.filter(t => t.status === 'assigned' || t.status === 'active' || t.status === 'pending_assignment');
|
|
412
|
+
if (activeTasks.length === 0)
|
|
413
|
+
return false;
|
|
414
|
+
if (!this.isAgentRestartAllowed(sessionName)) {
|
|
415
|
+
this.logger.warn('Agent restart cooldown active, skipping restart', {
|
|
416
|
+
sessionName,
|
|
417
|
+
activeTaskCount: activeTasks.length,
|
|
418
|
+
maxRestartsPerWindow: AGENT_HEARTBEAT_MONITOR_CONSTANTS.MAX_RESTARTS_PER_WINDOW,
|
|
419
|
+
cooldownWindowMs: AGENT_HEARTBEAT_MONITOR_CONSTANTS.COOLDOWN_WINDOW_MS,
|
|
420
|
+
});
|
|
421
|
+
this.notifyOrchestratorOfFailure(sessionName, 'runtime_exited_cooldown', activeTasks, false);
|
|
422
|
+
return false;
|
|
423
|
+
}
|
|
424
|
+
this.logger.info('Runtime exit with in-progress tasks, attempting restart', {
|
|
425
|
+
sessionName,
|
|
426
|
+
activeTaskCount: activeTasks.length,
|
|
427
|
+
});
|
|
428
|
+
try {
|
|
429
|
+
await this.restartAgentWithTasks(sessionName, monitored, activeTasks);
|
|
430
|
+
this.recordAgentRestart(sessionName);
|
|
431
|
+
this.notifyOrchestratorOfFailure(sessionName, 'runtime_exited', activeTasks, true);
|
|
432
|
+
this.stopMonitoring(sessionName);
|
|
433
|
+
return true;
|
|
434
|
+
}
|
|
435
|
+
catch (restartError) {
|
|
436
|
+
this.logger.warn('Agent restart after runtime exit failed, falling back to inactive', {
|
|
437
|
+
sessionName,
|
|
438
|
+
error: restartError instanceof Error ? restartError.message : String(restartError),
|
|
439
|
+
});
|
|
440
|
+
this.recordAgentRestart(sessionName);
|
|
441
|
+
this.notifyOrchestratorOfFailure(sessionName, 'runtime_exited', activeTasks, false);
|
|
442
|
+
return false;
|
|
443
|
+
}
|
|
444
|
+
}
|
|
445
|
+
catch (error) {
|
|
446
|
+
this.logger.warn('Failed to check in-progress tasks after runtime exit', {
|
|
447
|
+
sessionName,
|
|
448
|
+
error: error instanceof Error ? error.message : String(error),
|
|
449
|
+
});
|
|
450
|
+
return false;
|
|
451
|
+
}
|
|
452
|
+
}
|
|
453
|
+
/**
|
|
454
|
+
* Try to restart the orchestrator after runtime exit.
|
|
455
|
+
*
|
|
456
|
+
* Sets status to inactive before restart to prevent queue processor
|
|
457
|
+
* from delivering messages during postInitialize, captures session
|
|
458
|
+
* memory, and broadcasts restart status.
|
|
459
|
+
*
|
|
460
|
+
* @param sessionName - PTY session name (should be ORCHESTRATOR_SESSION_NAME)
|
|
461
|
+
* @param monitored - Monitored session state
|
|
462
|
+
* @returns True if orchestrator was successfully restarted (caller should return)
|
|
463
|
+
*/
|
|
464
|
+
async tryOrchestratorRestart(sessionName, monitored) {
|
|
465
|
+
// Set status to inactive BEFORE restart so the queue processor
|
|
466
|
+
// doesn't deliver messages during postInitialize.
|
|
467
|
+
try {
|
|
468
|
+
const storageService = StorageService.getInstance();
|
|
469
|
+
await storageService.updateAgentStatus(sessionName, CREWLY_CONSTANTS.AGENT_STATUSES.INACTIVE);
|
|
470
|
+
}
|
|
471
|
+
catch {
|
|
472
|
+
// Best-effort — continue with restart
|
|
473
|
+
}
|
|
474
|
+
// Capture session memory before restart
|
|
475
|
+
try {
|
|
476
|
+
const sessionMemoryService = SessionMemoryService.getInstance();
|
|
477
|
+
await sessionMemoryService.onSessionEnd(sessionName, monitored.role, process.cwd());
|
|
478
|
+
}
|
|
479
|
+
catch (error) {
|
|
480
|
+
this.logger.warn('Failed to capture session memory before orchestrator restart', {
|
|
481
|
+
sessionName,
|
|
482
|
+
error: error instanceof Error ? error.message : String(error),
|
|
483
|
+
});
|
|
484
|
+
}
|
|
485
|
+
try {
|
|
486
|
+
const restartService = OrchestratorRestartService.getInstance();
|
|
487
|
+
const success = await restartService.attemptRestart();
|
|
488
|
+
if (success) {
|
|
489
|
+
this.logger.info('Orchestrator restarted after runtime exit', { sessionName });
|
|
490
|
+
// Broadcast STARTED (not ACTIVE) — agent becomes ACTIVE only
|
|
491
|
+
// after registration prompt is processed and MCP call completes.
|
|
310
492
|
try {
|
|
311
|
-
const
|
|
312
|
-
|
|
313
|
-
|
|
314
|
-
this.logger.info('Runtime exit with in-progress tasks, attempting restart', {
|
|
493
|
+
const terminalGateway = getTerminalGateway();
|
|
494
|
+
if (terminalGateway) {
|
|
495
|
+
terminalGateway.broadcastOrchestratorStatus({
|
|
315
496
|
sessionName,
|
|
316
|
-
|
|
497
|
+
agentStatus: CREWLY_CONSTANTS.AGENT_STATUSES.STARTED,
|
|
498
|
+
reason: 'runtime_exit_restart',
|
|
317
499
|
});
|
|
318
|
-
try {
|
|
319
|
-
await this.restartAgentWithTasks(sessionName, monitored, activeTasks);
|
|
320
|
-
// Cleanup this subscription (restart succeeded, skip inactive flow)
|
|
321
|
-
this.stopMonitoring(sessionName);
|
|
322
|
-
return;
|
|
323
|
-
}
|
|
324
|
-
catch (restartError) {
|
|
325
|
-
this.logger.warn('Agent restart after runtime exit failed, falling back to inactive', {
|
|
326
|
-
sessionName,
|
|
327
|
-
error: restartError instanceof Error ? restartError.message : String(restartError),
|
|
328
|
-
});
|
|
329
|
-
// Fall through to normal inactive flow
|
|
330
|
-
}
|
|
331
500
|
}
|
|
332
501
|
}
|
|
333
|
-
catch (error) {
|
|
334
|
-
this.logger.warn('Failed to check in-progress tasks after runtime exit', {
|
|
335
|
-
sessionName,
|
|
336
|
-
error: error instanceof Error ? error.message : String(error),
|
|
337
|
-
});
|
|
338
|
-
// Fall through to normal inactive flow
|
|
339
|
-
}
|
|
340
|
-
}
|
|
341
|
-
// Orchestrator-specific restart: attempt auto-restart when runtime exits
|
|
342
|
-
if (sessionName === ORCHESTRATOR_SESSION_NAME) {
|
|
343
|
-
// CRITICAL: Set status to inactive BEFORE restart so the queue
|
|
344
|
-
// processor doesn't deliver messages during postInitialize.
|
|
345
|
-
// Without this, the old 'active' status persists in storage and
|
|
346
|
-
// the queue processor sends chat messages that get concatenated
|
|
347
|
-
// into /directory add commands in the new Gemini CLI session.
|
|
348
|
-
try {
|
|
349
|
-
const storageService = StorageService.getInstance();
|
|
350
|
-
await storageService.updateAgentStatus(sessionName, CREWLY_CONSTANTS.AGENT_STATUSES.INACTIVE);
|
|
351
|
-
}
|
|
352
502
|
catch {
|
|
353
|
-
// Best-effort
|
|
354
|
-
}
|
|
355
|
-
// Capture session memory before restart
|
|
356
|
-
try {
|
|
357
|
-
const sessionMemoryService = SessionMemoryService.getInstance();
|
|
358
|
-
await sessionMemoryService.onSessionEnd(sessionName, monitored.role, process.cwd());
|
|
359
|
-
}
|
|
360
|
-
catch (error) {
|
|
361
|
-
this.logger.warn('Failed to capture session memory before orchestrator restart', {
|
|
362
|
-
sessionName,
|
|
363
|
-
error: error instanceof Error ? error.message : String(error),
|
|
364
|
-
});
|
|
503
|
+
// Best-effort broadcast
|
|
365
504
|
}
|
|
505
|
+
this.stopMonitoring(sessionName);
|
|
506
|
+
return true;
|
|
507
|
+
}
|
|
508
|
+
this.logger.warn('Orchestrator restart after runtime exit failed or not allowed, falling back to inactive', {
|
|
509
|
+
sessionName,
|
|
510
|
+
});
|
|
511
|
+
}
|
|
512
|
+
catch (error) {
|
|
513
|
+
this.logger.warn('Orchestrator restart attempt threw error, falling back to inactive', {
|
|
514
|
+
sessionName,
|
|
515
|
+
error: error instanceof Error ? error.message : String(error),
|
|
516
|
+
});
|
|
517
|
+
}
|
|
518
|
+
return false;
|
|
519
|
+
}
|
|
520
|
+
/**
|
|
521
|
+
* Transition agent to inactive state: update storage, capture memory,
|
|
522
|
+
* publish events, and broadcast WebSocket status.
|
|
523
|
+
*
|
|
524
|
+
* @param sessionName - PTY session name
|
|
525
|
+
* @param monitored - Monitored session state
|
|
526
|
+
*/
|
|
527
|
+
async transitionToInactive(sessionName, monitored) {
|
|
528
|
+
// Update agent status to inactive
|
|
529
|
+
try {
|
|
530
|
+
const storageService = StorageService.getInstance();
|
|
531
|
+
await storageService.updateAgentStatus(sessionName, CREWLY_CONSTANTS.AGENT_STATUSES.INACTIVE);
|
|
532
|
+
this.logger.info('Agent status updated to inactive after runtime exit', { sessionName });
|
|
533
|
+
// Publish agent:inactive event to EventBus so orchestrator is notified
|
|
534
|
+
if (this.eventBusService) {
|
|
366
535
|
try {
|
|
367
|
-
|
|
368
|
-
const success = await restartService.attemptRestart();
|
|
369
|
-
if (success) {
|
|
370
|
-
this.logger.info('Orchestrator restarted after runtime exit', { sessionName });
|
|
371
|
-
// Broadcast restarted status as STARTED (not ACTIVE).
|
|
372
|
-
// The agent becomes ACTIVE only after the registration prompt
|
|
373
|
-
// is fully processed and the MCP registration call completes.
|
|
374
|
-
// Broadcasting ACTIVE prematurely causes the queue processor
|
|
375
|
-
// to deliver messages during postInitialize.
|
|
376
|
-
try {
|
|
377
|
-
const terminalGateway = getTerminalGateway();
|
|
378
|
-
if (terminalGateway) {
|
|
379
|
-
terminalGateway.broadcastOrchestratorStatus({
|
|
380
|
-
sessionName,
|
|
381
|
-
agentStatus: CREWLY_CONSTANTS.AGENT_STATUSES.STARTED,
|
|
382
|
-
reason: 'runtime_exit_restart',
|
|
383
|
-
});
|
|
384
|
-
}
|
|
385
|
-
}
|
|
386
|
-
catch {
|
|
387
|
-
// Best-effort broadcast
|
|
388
|
-
}
|
|
389
|
-
this.stopMonitoring(sessionName);
|
|
390
|
-
return;
|
|
391
|
-
}
|
|
392
|
-
this.logger.warn('Orchestrator restart after runtime exit failed or not allowed, falling back to inactive', {
|
|
393
|
-
sessionName,
|
|
394
|
-
});
|
|
536
|
+
await this.publishInactiveEvent(sessionName, monitored, storageService);
|
|
395
537
|
}
|
|
396
|
-
catch (
|
|
397
|
-
this.logger.warn('
|
|
538
|
+
catch (eventError) {
|
|
539
|
+
this.logger.warn('Failed to publish agent:inactive event to EventBus', {
|
|
398
540
|
sessionName,
|
|
399
|
-
error:
|
|
541
|
+
error: eventError instanceof Error ? eventError.message : String(eventError),
|
|
400
542
|
});
|
|
401
543
|
}
|
|
402
|
-
// Fall through to normal inactive flow
|
|
403
544
|
}
|
|
404
|
-
|
|
545
|
+
}
|
|
546
|
+
catch (error) {
|
|
547
|
+
this.logger.warn('Failed to update agent status after runtime exit', {
|
|
548
|
+
sessionName,
|
|
549
|
+
error: error instanceof Error ? error.message : String(error),
|
|
550
|
+
});
|
|
551
|
+
}
|
|
552
|
+
// Capture session memory (skip for orchestrator — already captured above)
|
|
553
|
+
if (sessionName !== ORCHESTRATOR_SESSION_NAME) {
|
|
405
554
|
try {
|
|
406
|
-
const
|
|
407
|
-
await
|
|
408
|
-
this.logger.info('Agent status updated to inactive after runtime exit', { sessionName });
|
|
555
|
+
const sessionMemoryService = SessionMemoryService.getInstance();
|
|
556
|
+
await sessionMemoryService.onSessionEnd(sessionName, monitored.role, process.cwd());
|
|
409
557
|
}
|
|
410
558
|
catch (error) {
|
|
411
|
-
this.logger.warn('Failed to
|
|
559
|
+
this.logger.warn('Failed to capture session memory after runtime exit', {
|
|
412
560
|
sessionName,
|
|
413
561
|
error: error instanceof Error ? error.message : String(error),
|
|
414
562
|
});
|
|
415
563
|
}
|
|
416
|
-
|
|
417
|
-
|
|
418
|
-
|
|
419
|
-
|
|
420
|
-
|
|
421
|
-
|
|
422
|
-
|
|
423
|
-
|
|
424
|
-
|
|
425
|
-
|
|
426
|
-
|
|
564
|
+
}
|
|
565
|
+
// Broadcast WebSocket event
|
|
566
|
+
try {
|
|
567
|
+
const terminalGateway = getTerminalGateway();
|
|
568
|
+
if (terminalGateway) {
|
|
569
|
+
const statusPayload = {
|
|
570
|
+
sessionName,
|
|
571
|
+
agentStatus: CREWLY_CONSTANTS.AGENT_STATUSES.INACTIVE,
|
|
572
|
+
reason: 'runtime_exited',
|
|
573
|
+
};
|
|
574
|
+
if (sessionName === ORCHESTRATOR_SESSION_NAME) {
|
|
575
|
+
terminalGateway.broadcastOrchestratorStatus(statusPayload);
|
|
427
576
|
}
|
|
428
|
-
|
|
429
|
-
|
|
430
|
-
try {
|
|
431
|
-
const terminalGateway = getTerminalGateway();
|
|
432
|
-
if (terminalGateway) {
|
|
433
|
-
const statusPayload = {
|
|
434
|
-
sessionName,
|
|
435
|
-
agentStatus: CREWLY_CONSTANTS.AGENT_STATUSES.INACTIVE,
|
|
436
|
-
reason: 'runtime_exited',
|
|
437
|
-
};
|
|
438
|
-
if (sessionName === ORCHESTRATOR_SESSION_NAME) {
|
|
439
|
-
terminalGateway.broadcastOrchestratorStatus(statusPayload);
|
|
440
|
-
}
|
|
441
|
-
else {
|
|
442
|
-
terminalGateway.broadcastTeamMemberStatus(statusPayload);
|
|
443
|
-
}
|
|
577
|
+
else {
|
|
578
|
+
terminalGateway.broadcastTeamMemberStatus(statusPayload);
|
|
444
579
|
}
|
|
445
580
|
}
|
|
446
|
-
catch (error) {
|
|
447
|
-
this.logger.warn('Failed to broadcast runtime exit event', {
|
|
448
|
-
sessionName,
|
|
449
|
-
error: error instanceof Error ? error.message : String(error),
|
|
450
|
-
});
|
|
451
|
-
}
|
|
452
|
-
// Cleanup this subscription
|
|
453
|
-
this.stopMonitoring(sessionName);
|
|
454
581
|
}
|
|
455
|
-
|
|
456
|
-
|
|
582
|
+
catch (error) {
|
|
583
|
+
this.logger.warn('Failed to broadcast runtime exit event', {
|
|
584
|
+
sessionName,
|
|
585
|
+
error: error instanceof Error ? error.message : String(error),
|
|
586
|
+
});
|
|
457
587
|
}
|
|
458
588
|
}
|
|
459
589
|
/**
|
|
460
590
|
* Handle a Gemini CLI failure with exponential backoff retry.
|
|
461
591
|
*
|
|
462
592
|
* Waits with increasing delays and checks if the CLI recovers (returns
|
|
463
|
-
* to a ready prompt). Returns 'recovered' if the CLI is back,
|
|
464
|
-
* '
|
|
593
|
+
* to a ready prompt). Returns 'recovered' if the CLI is back,
|
|
594
|
+
* 'deferred' if retries remain (skip exit flow, re-check on next
|
|
595
|
+
* failure detection), or 'exhausted' if max retries have been reached.
|
|
465
596
|
*
|
|
466
597
|
* @param sessionName - PTY session name
|
|
467
598
|
* @param monitored - Monitored session state (retry counter is mutated)
|
|
468
599
|
* @param helper - Session command helper for terminal output capture
|
|
469
|
-
* @returns 'recovered'
|
|
600
|
+
* @returns 'recovered' | 'deferred' | 'exhausted'
|
|
470
601
|
*/
|
|
471
602
|
async handleGeminiFailureWithRetry(sessionName, monitored, helper) {
|
|
472
603
|
const detectedPattern = GEMINI_FAILURE_PATTERNS.find((p) => p.test(monitored.buffer))?.source;
|
|
@@ -496,12 +627,7 @@ export class RuntimeExitMonitorService {
|
|
|
496
627
|
// Check if the CLI has recovered by looking for ready prompt patterns
|
|
497
628
|
try {
|
|
498
629
|
const output = helper.capturePane(sessionName, RECOVERY_CHECK_LINES);
|
|
499
|
-
const
|
|
500
|
-
'Type your message',
|
|
501
|
-
'gemini>',
|
|
502
|
-
'context left)',
|
|
503
|
-
];
|
|
504
|
-
const hasRecovered = geminiReadyPatterns.some((pattern) => output.includes(pattern));
|
|
630
|
+
const hasRecovered = GEMINI_READY_PATTERNS.some((pattern) => output.includes(pattern));
|
|
505
631
|
if (hasRecovered) {
|
|
506
632
|
this.logger.info('Gemini CLI recovered after transient failure', {
|
|
507
633
|
sessionName,
|
|
@@ -523,9 +649,11 @@ export class RuntimeExitMonitorService {
|
|
|
523
649
|
error: error instanceof Error ? error.message : String(error),
|
|
524
650
|
});
|
|
525
651
|
}
|
|
526
|
-
// Not recovered but retries remain —
|
|
652
|
+
// Not recovered but retries remain — defer to the next failure detection cycle.
|
|
653
|
+
// The buffer was cleared above, so a new failure must appear in terminal
|
|
654
|
+
// output to re-trigger this method.
|
|
527
655
|
if (monitored.geminiFailureRetries < MAX_RETRIES) {
|
|
528
|
-
return '
|
|
656
|
+
return 'deferred';
|
|
529
657
|
}
|
|
530
658
|
return 'exhausted';
|
|
531
659
|
}
|
|
@@ -594,7 +722,7 @@ export class RuntimeExitMonitorService {
|
|
|
594
722
|
teamId: monitored.teamId,
|
|
595
723
|
memberId: monitored.memberId,
|
|
596
724
|
sessionName,
|
|
597
|
-
agentStatus:
|
|
725
|
+
agentStatus: CREWLY_CONSTANTS.AGENT_STATUSES.ACTIVE,
|
|
598
726
|
});
|
|
599
727
|
}
|
|
600
728
|
this.logger.info('Agent restarted after runtime exit with in-progress tasks', {
|
|
@@ -728,5 +856,186 @@ export class RuntimeExitMonitorService {
|
|
|
728
856
|
return false;
|
|
729
857
|
}
|
|
730
858
|
}
|
|
859
|
+
/**
|
|
860
|
+
* Check if an agent restart is allowed based on cooldown window.
|
|
861
|
+
* Prevents infinite restart loops when agents keep crashing (e.g. during
|
|
862
|
+
* network outages). Uses the same limits as AgentHeartbeatMonitorService.
|
|
863
|
+
*
|
|
864
|
+
* @param sessionName - PTY session name
|
|
865
|
+
* @returns True if restart is allowed, false if cooldown is active
|
|
866
|
+
*/
|
|
867
|
+
isAgentRestartAllowed(sessionName) {
|
|
868
|
+
const now = Date.now();
|
|
869
|
+
const windowStart = now - AGENT_HEARTBEAT_MONITOR_CONSTANTS.COOLDOWN_WINDOW_MS;
|
|
870
|
+
const timestamps = this.restartHistory.get(sessionName) || [];
|
|
871
|
+
// Prune old timestamps outside the cooldown window
|
|
872
|
+
const recent = timestamps.filter(ts => ts > windowStart);
|
|
873
|
+
this.restartHistory.set(sessionName, recent);
|
|
874
|
+
return recent.length < AGENT_HEARTBEAT_MONITOR_CONSTANTS.MAX_RESTARTS_PER_WINDOW;
|
|
875
|
+
}
|
|
876
|
+
/**
|
|
877
|
+
* Record a restart attempt for cooldown tracking.
|
|
878
|
+
*
|
|
879
|
+
* @param sessionName - PTY session name
|
|
880
|
+
*/
|
|
881
|
+
recordAgentRestart(sessionName) {
|
|
882
|
+
const timestamps = this.restartHistory.get(sessionName) || [];
|
|
883
|
+
timestamps.push(Date.now());
|
|
884
|
+
this.restartHistory.set(sessionName, timestamps);
|
|
885
|
+
}
|
|
886
|
+
/**
|
|
887
|
+
* Classify an error reason as transient or persistent.
|
|
888
|
+
*
|
|
889
|
+
* Transient errors (connectivity, timeout, quota) may resolve on retry.
|
|
890
|
+
* Persistent errors (auth, config, crash loop) require manual intervention.
|
|
891
|
+
*
|
|
892
|
+
* @param reason - The failure reason string
|
|
893
|
+
* @returns 'TRANSIENT' | 'PERSISTENT' | 'UNKNOWN'
|
|
894
|
+
*/
|
|
895
|
+
classifyError(reason) {
|
|
896
|
+
const transientPatterns = [
|
|
897
|
+
'timeout', 'connectivity', 'connection', 'quota', 'RESOURCE_EXHAUSTED',
|
|
898
|
+
'UNAVAILABLE', 'DEADLINE_EXCEEDED', 'network', 'INTERNAL',
|
|
899
|
+
];
|
|
900
|
+
const persistentPatterns = [
|
|
901
|
+
'auth', 'UNAUTHENTICATED', 'PERMISSION_DENIED', 'config',
|
|
902
|
+
'crash', 'cooldown', 'corruption', 'thinking.*blocks',
|
|
903
|
+
];
|
|
904
|
+
const lowerReason = reason.toLowerCase();
|
|
905
|
+
if (transientPatterns.some(p => lowerReason.includes(p.toLowerCase()))) {
|
|
906
|
+
return 'TRANSIENT';
|
|
907
|
+
}
|
|
908
|
+
if (persistentPatterns.some(p => new RegExp(p, 'i').test(reason))) {
|
|
909
|
+
return 'PERSISTENT';
|
|
910
|
+
}
|
|
911
|
+
return 'UNKNOWN';
|
|
912
|
+
}
|
|
913
|
+
/**
|
|
914
|
+
* Notify the orchestrator about an agent failure via the chat API (#129).
|
|
915
|
+
*
|
|
916
|
+
* Sends a structured failure notification with error classification so the
|
|
917
|
+
* orchestrator can decide whether to restart the agent, reassign tasks,
|
|
918
|
+
* or inform the user. This is fire-and-forget — failures are logged but
|
|
919
|
+
* do not block the exit flow.
|
|
920
|
+
*
|
|
921
|
+
* @param sessionName - Failed agent's PTY session name
|
|
922
|
+
* @param reason - Failure reason (runtime_exited, api_failure, etc.)
|
|
923
|
+
* @param activeTasks - In-progress tasks the agent had, if any
|
|
924
|
+
* @param restartSucceeded - Whether automatic restart succeeded
|
|
925
|
+
*/
|
|
926
|
+
notifyOrchestratorOfFailure(sessionName, reason, activeTasks, restartSucceeded) {
|
|
927
|
+
const errorClass = this.classifyError(reason);
|
|
928
|
+
const taskSummary = activeTasks.length > 0
|
|
929
|
+
? activeTasks.map(t => `${t.taskName} (${t.status})`).join(', ')
|
|
930
|
+
: '';
|
|
931
|
+
const message = [
|
|
932
|
+
`Agent failure notification: ${sessionName} became inactive.`,
|
|
933
|
+
`Reason: ${reason}`,
|
|
934
|
+
`Error classification: ${errorClass}`,
|
|
935
|
+
activeTasks.length > 0 ? `Active tasks: ${taskSummary}` : 'No active tasks.',
|
|
936
|
+
restartSucceeded
|
|
937
|
+
? 'Automatic restart succeeded — agent is recovering.'
|
|
938
|
+
: 'Automatic restart FAILED — please restart the agent or reassign its tasks.',
|
|
939
|
+
].join('\n');
|
|
940
|
+
// Send via chat API (fire-and-forget)
|
|
941
|
+
const backend = getSessionBackendSync();
|
|
942
|
+
if (!backend)
|
|
943
|
+
return;
|
|
944
|
+
const helper = createSessionCommandHelper(backend);
|
|
945
|
+
const orchestratorSession = helper.getSession(ORCHESTRATOR_SESSION_NAME);
|
|
946
|
+
if (!orchestratorSession) {
|
|
947
|
+
this.logger.debug('Orchestrator session not found, skipping failure notification', { sessionName });
|
|
948
|
+
return;
|
|
949
|
+
}
|
|
950
|
+
// Use the deliver endpoint for reliable delivery to the orchestrator
|
|
951
|
+
const baseUrl = process.env.CREWLY_API_URL || `http://localhost:${WEB_CONSTANTS.PORTS.BACKEND}`;
|
|
952
|
+
const body = JSON.stringify({
|
|
953
|
+
message,
|
|
954
|
+
force: true,
|
|
955
|
+
});
|
|
956
|
+
// Fire-and-forget HTTP call
|
|
957
|
+
try {
|
|
958
|
+
const url = new URL(`${baseUrl}/api/terminal/${ORCHESTRATOR_SESSION_NAME}/deliver`);
|
|
959
|
+
const req = http.request(url, {
|
|
960
|
+
method: 'POST',
|
|
961
|
+
headers: {
|
|
962
|
+
'Content-Type': 'application/json',
|
|
963
|
+
'Content-Length': Buffer.byteLength(body).toString(),
|
|
964
|
+
},
|
|
965
|
+
});
|
|
966
|
+
req.on('response', (res) => res.resume()); // Consume response to free socket
|
|
967
|
+
req.on('error', (err) => {
|
|
968
|
+
this.logger.debug('Failed to deliver failure notification to orchestrator (non-fatal)', {
|
|
969
|
+
sessionName,
|
|
970
|
+
error: err.message,
|
|
971
|
+
});
|
|
972
|
+
});
|
|
973
|
+
req.write(body);
|
|
974
|
+
req.end();
|
|
975
|
+
}
|
|
976
|
+
catch {
|
|
977
|
+
// Non-fatal — notification delivery is best-effort
|
|
978
|
+
}
|
|
979
|
+
this.logger.info('Sent agent failure notification to orchestrator (#129)', {
|
|
980
|
+
sessionName,
|
|
981
|
+
reason,
|
|
982
|
+
activeTaskCount: activeTasks.length,
|
|
983
|
+
restartSucceeded,
|
|
984
|
+
});
|
|
985
|
+
}
|
|
986
|
+
/**
|
|
987
|
+
* Publish agent:status_changed and agent:inactive events to the EventBus.
|
|
988
|
+
*
|
|
989
|
+
* Looks up team/member names from StorageService to build the full
|
|
990
|
+
* AgentEvent. This mirrors the pattern used in TeamsJsonWatcherService.
|
|
991
|
+
*
|
|
992
|
+
* @param sessionName - PTY session name
|
|
993
|
+
* @param monitored - Monitored session state with teamId/memberId
|
|
994
|
+
* @param storageService - StorageService instance for team/member lookup
|
|
995
|
+
*/
|
|
996
|
+
async publishInactiveEvent(sessionName, monitored, storageService) {
|
|
997
|
+
if (!this.eventBusService) {
|
|
998
|
+
return;
|
|
999
|
+
}
|
|
1000
|
+
// Look up team and member names
|
|
1001
|
+
let teamName = '';
|
|
1002
|
+
let memberName = '';
|
|
1003
|
+
try {
|
|
1004
|
+
const result = await storageService.findMemberBySessionName(sessionName);
|
|
1005
|
+
if (result) {
|
|
1006
|
+
teamName = result.team.name;
|
|
1007
|
+
memberName = result.member.name;
|
|
1008
|
+
}
|
|
1009
|
+
}
|
|
1010
|
+
catch {
|
|
1011
|
+
// Best-effort — use empty names if lookup fails
|
|
1012
|
+
}
|
|
1013
|
+
const baseEvent = {
|
|
1014
|
+
id: crypto.randomUUID(),
|
|
1015
|
+
type: 'agent:status_changed',
|
|
1016
|
+
timestamp: new Date().toISOString(),
|
|
1017
|
+
teamId: monitored.teamId || '',
|
|
1018
|
+
teamName,
|
|
1019
|
+
memberId: monitored.memberId || '',
|
|
1020
|
+
memberName,
|
|
1021
|
+
sessionName,
|
|
1022
|
+
previousValue: CREWLY_CONSTANTS.AGENT_STATUSES.ACTIVE,
|
|
1023
|
+
newValue: CREWLY_CONSTANTS.AGENT_STATUSES.INACTIVE,
|
|
1024
|
+
changedField: 'agentStatus',
|
|
1025
|
+
};
|
|
1026
|
+
// Publish generic status_changed event
|
|
1027
|
+
this.eventBusService.publish(baseEvent);
|
|
1028
|
+
// Publish specific agent:inactive event
|
|
1029
|
+
this.eventBusService.publish({
|
|
1030
|
+
...baseEvent,
|
|
1031
|
+
id: crypto.randomUUID(),
|
|
1032
|
+
type: 'agent:inactive',
|
|
1033
|
+
});
|
|
1034
|
+
this.logger.info('Published agent:inactive event to EventBus', {
|
|
1035
|
+
sessionName,
|
|
1036
|
+
teamId: monitored.teamId,
|
|
1037
|
+
memberId: monitored.memberId,
|
|
1038
|
+
});
|
|
1039
|
+
}
|
|
731
1040
|
}
|
|
732
1041
|
//# sourceMappingURL=runtime-exit-monitor.service.js.map
|