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
|
@@ -4,15 +4,17 @@ import { readFile, readdir, stat, mkdir, writeFile, access } from 'fs/promises';
|
|
|
4
4
|
import { LoggerService } from '../core/logger.service.js';
|
|
5
5
|
import { createSessionCommandHelper, getSessionBackendSync, createSessionBackend, getSessionStatePersistence, } from '../session/index.js';
|
|
6
6
|
import { RuntimeServiceFactory } from './runtime-service.factory.js';
|
|
7
|
-
import { CREWLY_CONSTANTS, ENV_CONSTANTS, AGENT_TIMEOUTS, ORCHESTRATOR_SESSION_NAME, ORCHESTRATOR_ROLE, RUNTIME_TYPES, SESSION_COMMAND_DELAYS, EVENT_DELIVERY_CONSTANTS, TERMINAL_PATTERNS, GEMINI_SHELL_MODE_CONSTANTS, } from '../../constants.js';
|
|
7
|
+
import { CREWLY_CONSTANTS, ENV_CONSTANTS, AGENT_TIMEOUTS, ORCHESTRATOR_SESSION_NAME, ORCHESTRATOR_ROLE, RUNTIME_TYPES, SESSION_COMMAND_DELAYS, EVENT_DELIVERY_CONSTANTS, TERMINAL_PATTERNS, GEMINI_SHELL_MODE_CONSTANTS, GEMINI_STUCK_CONNECTIVITY_PATTERN, GEMINI_ERROR_STATE_CONSTANTS, } from '../../constants.js';
|
|
8
8
|
import { WEB_CONSTANTS } from '../../../../config/constants.js';
|
|
9
9
|
import { delay } from '../../utils/async.utils.js';
|
|
10
10
|
import { getSettingsService } from '../settings/settings.service.js';
|
|
11
11
|
import { SessionMemoryService } from '../memory/session-memory.service.js';
|
|
12
12
|
import { RuntimeExitMonitorService } from './runtime-exit-monitor.service.js';
|
|
13
13
|
import { ContextWindowMonitorService } from './context-window-monitor.service.js';
|
|
14
|
+
import { OAuthReloginMonitorService } from './oauth-relogin-monitor.service.js';
|
|
14
15
|
import { SubAgentMessageQueue } from '../messaging/sub-agent-message-queue.service.js';
|
|
15
16
|
import { AgentSuspendService } from './agent-suspend.service.js';
|
|
17
|
+
import { PromptBuilderService } from '../ai/prompt-builder.service.js';
|
|
16
18
|
import { stripAnsiCodes } from '../../utils/terminal-output.utils.js';
|
|
17
19
|
import { isPromptLine, containsSpinnerOrWorkingIndicator, containsProcessingIndicator, containsBusyStatusBar, containsRewindMode, containsGeminiProcessingKeywords, extractChatPrefix, stripTuiLineBorders, matchTuiPromptLine, } from '../../utils/terminal-string-ops.js';
|
|
18
20
|
import { PtyActivityTrackerService } from './pty-activity-tracker.service.js';
|
|
@@ -48,6 +50,12 @@ export class AgentRegistrationService {
|
|
|
48
50
|
// Prevents concurrent sendMessageWithRetry calls to the same session,
|
|
49
51
|
// which causes multiple Ctrl+C presses that can crash the runtime.
|
|
50
52
|
sessionDeliveryMutex = new Map();
|
|
53
|
+
// Per-session hash of last sent message to prevent duplicate writes (#128).
|
|
54
|
+
// Key: sessionName, Value: { hash, sentAt }
|
|
55
|
+
lastSentMessageHash = new Map();
|
|
56
|
+
// In-process Crewly Agent runtimes (sessionName → runtime instance).
|
|
57
|
+
// Used for crewly-agent runtimeType agents that run without PTY sessions.
|
|
58
|
+
inProcessRuntimes = new Map();
|
|
51
59
|
// Terminal patterns are now centralized in TERMINAL_PATTERNS constant
|
|
52
60
|
// Keeping prompt chars as static getter for backwards compatibility within the class
|
|
53
61
|
static get CLAUDE_PROMPT_INDICATORS() {
|
|
@@ -252,6 +260,16 @@ export class AgentRegistrationService {
|
|
|
252
260
|
createRuntimeService(runtimeType) {
|
|
253
261
|
return RuntimeServiceFactory.create(runtimeType, null, this.projectRoot);
|
|
254
262
|
}
|
|
263
|
+
/**
|
|
264
|
+
* Get an in-process Crewly Agent runtime by session name.
|
|
265
|
+
* Used by the terminal controller for force-delivery to in-process agents.
|
|
266
|
+
*
|
|
267
|
+
* @param sessionName - Session name to look up
|
|
268
|
+
* @returns The CrewlyAgentRuntimeService if it exists, undefined otherwise
|
|
269
|
+
*/
|
|
270
|
+
getInProcessRuntime(sessionName) {
|
|
271
|
+
return this.inProcessRuntimes.get(sessionName);
|
|
272
|
+
}
|
|
255
273
|
/**
|
|
256
274
|
* Get the check interval based on environment.
|
|
257
275
|
* Uses shorter intervals in test environment for faster tests.
|
|
@@ -451,6 +469,8 @@ export class AgentRegistrationService {
|
|
|
451
469
|
// Must be before postInitialize and sendRegistrationPromptAsync so exits
|
|
452
470
|
// during those phases are detected and the abort signal fires in time.
|
|
453
471
|
RuntimeExitMonitorService.getInstance().startMonitoring(sessionName, runtimeType, role);
|
|
472
|
+
// Start OAuth relogin monitoring for automatic re-authentication
|
|
473
|
+
OAuthReloginMonitorService.getInstance().startMonitoring(sessionName, runtimeType);
|
|
454
474
|
// Look up per-agent browser automation override from member config
|
|
455
475
|
let browserAutomationOverride;
|
|
456
476
|
if (memberId) {
|
|
@@ -687,6 +707,8 @@ export class AgentRegistrationService {
|
|
|
687
707
|
}
|
|
688
708
|
// Start runtime exit monitoring immediately after runtime is ready
|
|
689
709
|
RuntimeExitMonitorService.getInstance().startMonitoring(sessionName, runtimeType, role);
|
|
710
|
+
// Start OAuth relogin monitoring for automatic re-authentication
|
|
711
|
+
OAuthReloginMonitorService.getInstance().startMonitoring(sessionName, runtimeType);
|
|
690
712
|
// Additional verification: Use runtime detection to confirm runtime is responding
|
|
691
713
|
// Wait a bit longer for runtime to fully load after showing welcome message
|
|
692
714
|
this.logger.debug('Runtime ready detected for orchestrator, waiting for full startup before verification', { sessionName, runtimeType });
|
|
@@ -729,6 +751,8 @@ export class AgentRegistrationService {
|
|
|
729
751
|
}
|
|
730
752
|
// Start runtime exit monitoring immediately after runtime is ready
|
|
731
753
|
RuntimeExitMonitorService.getInstance().startMonitoring(sessionName, runtimeType, role);
|
|
754
|
+
// Start OAuth relogin monitoring for automatic re-authentication
|
|
755
|
+
OAuthReloginMonitorService.getInstance().startMonitoring(sessionName, runtimeType);
|
|
732
756
|
}
|
|
733
757
|
// Look up per-agent browser automation override from member config
|
|
734
758
|
let browserOverrideForRecreation;
|
|
@@ -836,17 +860,23 @@ export class AgentRegistrationService {
|
|
|
836
860
|
// For orchestrator or cases without member ID, remove the memberId parameter
|
|
837
861
|
prompt = prompt.replace(/,\s*"memberId":\s*"\{\{MEMBER_ID\}\}"/g, '');
|
|
838
862
|
}
|
|
839
|
-
// Look up project path for team members
|
|
863
|
+
// Look up project path and TL hierarchy for team members
|
|
840
864
|
let projectPath = process.cwd();
|
|
865
|
+
let foundTeam = null;
|
|
866
|
+
let foundMember = null;
|
|
841
867
|
try {
|
|
842
868
|
const teams = await this.storageService.getTeams();
|
|
843
869
|
for (const team of teams) {
|
|
844
870
|
const member = team.members?.find((m) => m.sessionName === sessionName);
|
|
845
|
-
if (member
|
|
846
|
-
|
|
847
|
-
|
|
848
|
-
if (
|
|
849
|
-
|
|
871
|
+
if (member) {
|
|
872
|
+
foundTeam = team;
|
|
873
|
+
foundMember = member;
|
|
874
|
+
if (team.projectIds[0]) {
|
|
875
|
+
const projects = await this.storageService.getProjects();
|
|
876
|
+
const project = projects.find((p) => p.id === team.projectIds[0]);
|
|
877
|
+
if (project?.path) {
|
|
878
|
+
projectPath = project.path;
|
|
879
|
+
}
|
|
850
880
|
}
|
|
851
881
|
break;
|
|
852
882
|
}
|
|
@@ -888,6 +918,53 @@ export class AgentRegistrationService {
|
|
|
888
918
|
// Replace marketplace skills path placeholder
|
|
889
919
|
const marketplaceSkillsPath = path.join(os.homedir(), '.crewly', 'marketplace', 'skills');
|
|
890
920
|
prompt = prompt.replace(/\{\{MARKETPLACE_SKILLS_PATH\}\}/g, marketplaceSkillsPath);
|
|
921
|
+
// Inject Team Lead addon for members with canDelegate=true and subordinates
|
|
922
|
+
if (foundMember?.canDelegate && foundMember.subordinateIds && foundMember.subordinateIds.length > 0 && foundTeam) {
|
|
923
|
+
try {
|
|
924
|
+
// Resolve subordinateIds to SubordinateInfo[]
|
|
925
|
+
const subordinates = foundMember.subordinateIds
|
|
926
|
+
.map((subId) => {
|
|
927
|
+
const subMember = foundTeam.members?.find((m) => m.id === subId);
|
|
928
|
+
if (!subMember)
|
|
929
|
+
return null;
|
|
930
|
+
return {
|
|
931
|
+
name: subMember.name,
|
|
932
|
+
sessionName: subMember.sessionName || '',
|
|
933
|
+
role: subMember.role || 'developer',
|
|
934
|
+
};
|
|
935
|
+
})
|
|
936
|
+
.filter((s) => s !== null);
|
|
937
|
+
if (subordinates.length > 0) {
|
|
938
|
+
const tlConfig = {
|
|
939
|
+
name: sessionName,
|
|
940
|
+
role: role,
|
|
941
|
+
systemPrompt: '',
|
|
942
|
+
projectPath,
|
|
943
|
+
memberId,
|
|
944
|
+
teamId: foundTeam.id,
|
|
945
|
+
canDelegate: true,
|
|
946
|
+
subordinates,
|
|
947
|
+
};
|
|
948
|
+
const promptBuilder = new PromptBuilderService(this.projectRoot);
|
|
949
|
+
const tlSection = await promptBuilder.buildTeamLeadSection(tlConfig);
|
|
950
|
+
if (tlSection) {
|
|
951
|
+
prompt += `\n\n---\n\n${tlSection}`;
|
|
952
|
+
this.logger.info('TL addon injected into init prompt', {
|
|
953
|
+
sessionName,
|
|
954
|
+
subordinateCount: subordinates.length,
|
|
955
|
+
subordinateNames: subordinates.map((s) => s.name),
|
|
956
|
+
tlSectionLength: tlSection.length,
|
|
957
|
+
});
|
|
958
|
+
}
|
|
959
|
+
}
|
|
960
|
+
}
|
|
961
|
+
catch (tlError) {
|
|
962
|
+
this.logger.warn('Failed to inject TL addon (non-critical)', {
|
|
963
|
+
sessionName,
|
|
964
|
+
error: tlError instanceof Error ? tlError.message : String(tlError),
|
|
965
|
+
});
|
|
966
|
+
}
|
|
967
|
+
}
|
|
891
968
|
// Generate and inject startup briefing from session memory
|
|
892
969
|
try {
|
|
893
970
|
const sessionMemoryService = SessionMemoryService.getInstance();
|
|
@@ -1440,6 +1517,8 @@ After checking in, just say "Ready for tasks" and wait for me to send you work.`
|
|
|
1440
1517
|
if (role !== ORCHESTRATOR_ROLE && config.teamId && config.memberId) {
|
|
1441
1518
|
ContextWindowMonitorService.getInstance().startSessionMonitoring(sessionName, config.memberId, config.teamId, role, runtimeType);
|
|
1442
1519
|
}
|
|
1520
|
+
// Start OAuth relogin monitoring for recovered session
|
|
1521
|
+
OAuthReloginMonitorService.getInstance().startMonitoring(sessionName, runtimeType);
|
|
1443
1522
|
return {
|
|
1444
1523
|
success: true,
|
|
1445
1524
|
sessionName,
|
|
@@ -1453,6 +1532,40 @@ After checking in, just say "Ready for tasks" and wait for me to send you work.`
|
|
|
1453
1532
|
await (await this.getSessionHelper()).killSession(sessionName);
|
|
1454
1533
|
await delay(1000); // Wait for cleanup
|
|
1455
1534
|
}
|
|
1535
|
+
// ===== In-process Crewly Agent branch =====
|
|
1536
|
+
// Crewly Agent runs inside the Node.js process — no PTY session needed.
|
|
1537
|
+
if (runtimeType === RUNTIME_TYPES.CREWLY_AGENT) {
|
|
1538
|
+
this.logger.info('Starting in-process Crewly Agent runtime', { sessionName, role });
|
|
1539
|
+
const crewlyRuntime = this.createRuntimeService(runtimeType);
|
|
1540
|
+
// Determine role name for system prompt lookup
|
|
1541
|
+
const roleName = role === ORCHESTRATOR_ROLE ? 'orchestrator' : role.toLowerCase().replace(/\s+/g, '-');
|
|
1542
|
+
await crewlyRuntime.initializeInProcess(sessionName, undefined, roleName);
|
|
1543
|
+
// Track the in-process runtime for message routing
|
|
1544
|
+
this.inProcessRuntimes.set(sessionName, crewlyRuntime);
|
|
1545
|
+
// Load and deliver registration prompt as the first message
|
|
1546
|
+
try {
|
|
1547
|
+
const prompt = await this.loadRegistrationPrompt(role, sessionName, memberId);
|
|
1548
|
+
this.logger.info('Delivering registration prompt to Crewly Agent', {
|
|
1549
|
+
sessionName, promptLength: prompt.length,
|
|
1550
|
+
});
|
|
1551
|
+
await crewlyRuntime.handleMessage(prompt);
|
|
1552
|
+
}
|
|
1553
|
+
catch (promptError) {
|
|
1554
|
+
this.logger.warn('Registration prompt delivery failed (non-fatal for crewly-agent)', {
|
|
1555
|
+
sessionName,
|
|
1556
|
+
error: promptError instanceof Error ? promptError.message : String(promptError),
|
|
1557
|
+
});
|
|
1558
|
+
}
|
|
1559
|
+
// Start context window monitoring if applicable
|
|
1560
|
+
if (role !== ORCHESTRATOR_ROLE && config.teamId && config.memberId) {
|
|
1561
|
+
ContextWindowMonitorService.getInstance().startSessionMonitoring(sessionName, config.memberId, config.teamId, role, runtimeType);
|
|
1562
|
+
}
|
|
1563
|
+
return {
|
|
1564
|
+
success: true,
|
|
1565
|
+
sessionName,
|
|
1566
|
+
message: 'Crewly Agent in-process runtime initialized and registered',
|
|
1567
|
+
};
|
|
1568
|
+
}
|
|
1456
1569
|
// Create new session (same approach for both orchestrator and team members)
|
|
1457
1570
|
const cwdToUse = projectPath || process.cwd();
|
|
1458
1571
|
this.logger.info('Creating PTY session', {
|
|
@@ -1533,6 +1646,8 @@ After checking in, just say "Ready for tasks" and wait for me to send you work.`
|
|
|
1533
1646
|
if (role !== ORCHESTRATOR_ROLE && config.teamId && config.memberId) {
|
|
1534
1647
|
ContextWindowMonitorService.getInstance().startSessionMonitoring(sessionName, config.memberId, config.teamId, role, runtimeType);
|
|
1535
1648
|
}
|
|
1649
|
+
// Start OAuth relogin monitoring for newly created session
|
|
1650
|
+
OAuthReloginMonitorService.getInstance().startMonitoring(sessionName, runtimeType);
|
|
1536
1651
|
return {
|
|
1537
1652
|
success: true,
|
|
1538
1653
|
sessionName,
|
|
@@ -1564,8 +1679,17 @@ After checking in, just say "Ready for tasks" and wait for me to send you work.`
|
|
|
1564
1679
|
this.logger.info('Terminating agent session (unified approach)', { sessionName, role });
|
|
1565
1680
|
// Stop runtime exit monitoring before killing the session
|
|
1566
1681
|
RuntimeExitMonitorService.getInstance().stopMonitoring(sessionName);
|
|
1682
|
+
// Stop OAuth relogin monitoring before killing the session
|
|
1683
|
+
OAuthReloginMonitorService.getInstance().stopMonitoring(sessionName);
|
|
1567
1684
|
// Stop context window monitoring before killing the session
|
|
1568
1685
|
ContextWindowMonitorService.getInstance().stopSessionMonitoring(sessionName);
|
|
1686
|
+
// Shut down in-process Crewly Agent runtime if present
|
|
1687
|
+
const inProcessRuntime = this.inProcessRuntimes.get(sessionName);
|
|
1688
|
+
if (inProcessRuntime) {
|
|
1689
|
+
inProcessRuntime.shutdown();
|
|
1690
|
+
this.inProcessRuntimes.delete(sessionName);
|
|
1691
|
+
this.logger.info('In-process Crewly Agent runtime shut down', { sessionName });
|
|
1692
|
+
}
|
|
1569
1693
|
// Get session helper once to avoid repeated async calls
|
|
1570
1694
|
const sessionHelper = await this.getSessionHelper();
|
|
1571
1695
|
const sessionExists = sessionHelper.sessionExists(sessionName);
|
|
@@ -1574,7 +1698,7 @@ After checking in, just say "Ready for tasks" and wait for me to send you work.`
|
|
|
1574
1698
|
await sessionHelper.killSession(sessionName);
|
|
1575
1699
|
this.logger.info('Session terminated successfully', { sessionName });
|
|
1576
1700
|
}
|
|
1577
|
-
else {
|
|
1701
|
+
else if (!inProcessRuntime) {
|
|
1578
1702
|
this.logger.info('Session already terminated or does not exist', { sessionName });
|
|
1579
1703
|
}
|
|
1580
1704
|
// Capture session end for memory persistence
|
|
@@ -1674,6 +1798,31 @@ After checking in, just say "Ready for tasks" and wait for me to send you work.`
|
|
|
1674
1798
|
if (!runtimeType) {
|
|
1675
1799
|
runtimeType = await this.resolveSessionRuntimeType(sessionName);
|
|
1676
1800
|
}
|
|
1801
|
+
// ===== In-process Crewly Agent delivery =====
|
|
1802
|
+
// Route directly to the in-process runtime, bypassing PTY entirely.
|
|
1803
|
+
if (runtimeType === RUNTIME_TYPES.CREWLY_AGENT) {
|
|
1804
|
+
const crewlyRuntime = this.inProcessRuntimes.get(sessionName);
|
|
1805
|
+
if (!crewlyRuntime || !crewlyRuntime.isReady()) {
|
|
1806
|
+
return {
|
|
1807
|
+
success: false,
|
|
1808
|
+
error: `Crewly Agent runtime for '${sessionName}' is not initialized`,
|
|
1809
|
+
};
|
|
1810
|
+
}
|
|
1811
|
+
try {
|
|
1812
|
+
await crewlyRuntime.handleMessage(message);
|
|
1813
|
+
this.logger.info('Message delivered to in-process Crewly Agent', {
|
|
1814
|
+
sessionName, messageLength: message.length,
|
|
1815
|
+
});
|
|
1816
|
+
return { success: true, message: 'Message delivered to Crewly Agent' };
|
|
1817
|
+
}
|
|
1818
|
+
catch (agentError) {
|
|
1819
|
+
const errMsg = agentError instanceof Error ? agentError.message : String(agentError);
|
|
1820
|
+
this.logger.error('Crewly Agent message handling failed', {
|
|
1821
|
+
sessionName, error: errMsg,
|
|
1822
|
+
});
|
|
1823
|
+
return { success: false, error: `Crewly Agent error: ${errMsg}` };
|
|
1824
|
+
}
|
|
1825
|
+
}
|
|
1677
1826
|
// Get session helper once for this method
|
|
1678
1827
|
const sessionHelper = await this.getSessionHelper();
|
|
1679
1828
|
// Check if session exists
|
|
@@ -1755,6 +1904,11 @@ After checking in, just say "Ready for tasks" and wait for me to send you work.`
|
|
|
1755
1904
|
* @returns true if agent is ready, false if timed out
|
|
1756
1905
|
*/
|
|
1757
1906
|
async waitForAgentReady(sessionName, timeoutMs = EVENT_DELIVERY_CONSTANTS.AGENT_READY_TIMEOUT, runtimeType) {
|
|
1907
|
+
// In-process Crewly Agent is always "ready" (no prompt to wait for)
|
|
1908
|
+
const inProcessRuntime = this.inProcessRuntimes.get(sessionName);
|
|
1909
|
+
if (inProcessRuntime) {
|
|
1910
|
+
return inProcessRuntime.isReady();
|
|
1911
|
+
}
|
|
1758
1912
|
const sessionHelper = await this.getSessionHelper();
|
|
1759
1913
|
// Check if session exists
|
|
1760
1914
|
if (!sessionHelper.sessionExists(sessionName)) {
|
|
@@ -1834,256 +1988,6 @@ After checking in, just say "Ready for tasks" and wait for me to send you work.`
|
|
|
1834
1988
|
});
|
|
1835
1989
|
});
|
|
1836
1990
|
}
|
|
1837
|
-
/**
|
|
1838
|
-
* @deprecated Replaced by SessionCommandHelper.sendMessage() in sendMessageWithRetry.
|
|
1839
|
-
* Complex event-driven state machine was fragile — Enter key often got lost.
|
|
1840
|
-
* Kept as dead code for reference during transition.
|
|
1841
|
-
*/
|
|
1842
|
-
async _deprecated_sendMessageEventDriven(sessionName, message, timeoutMs = EVENT_DELIVERY_CONSTANTS.TOTAL_DELIVERY_TIMEOUT) {
|
|
1843
|
-
const sessionHelper = await this.getSessionHelper();
|
|
1844
|
-
const session = sessionHelper.getSession(sessionName);
|
|
1845
|
-
if (!session) {
|
|
1846
|
-
this.logger.error('Session not found for event-driven delivery', { sessionName });
|
|
1847
|
-
return false;
|
|
1848
|
-
}
|
|
1849
|
-
return new Promise((resolve) => {
|
|
1850
|
-
let buffer = '';
|
|
1851
|
-
let messageSent = false;
|
|
1852
|
-
let enterSent = false;
|
|
1853
|
-
let enterAccepted = false;
|
|
1854
|
-
let deliveryConfirmed = false;
|
|
1855
|
-
let resolved = false;
|
|
1856
|
-
// Track all timeouts to prevent memory leaks (P1.1 fix)
|
|
1857
|
-
const pendingTimeouts = [];
|
|
1858
|
-
const scheduleTimeout = (fn, delayMs) => {
|
|
1859
|
-
const id = setTimeout(fn, delayMs);
|
|
1860
|
-
pendingTimeouts.push(id);
|
|
1861
|
-
return id;
|
|
1862
|
-
};
|
|
1863
|
-
const cleanup = () => {
|
|
1864
|
-
// Immediately mark as resolved to prevent race conditions (P1.2 fix)
|
|
1865
|
-
const wasResolved = resolved;
|
|
1866
|
-
resolved = true;
|
|
1867
|
-
if (!wasResolved) {
|
|
1868
|
-
// Clear all pending timeouts to prevent memory leaks
|
|
1869
|
-
pendingTimeouts.forEach((id) => clearTimeout(id));
|
|
1870
|
-
clearTimeout(timeoutId);
|
|
1871
|
-
unsubscribe();
|
|
1872
|
-
}
|
|
1873
|
-
};
|
|
1874
|
-
// Use centralized patterns from TERMINAL_PATTERNS
|
|
1875
|
-
const PASTE_PATTERN = TERMINAL_PATTERNS.PASTE_INDICATOR;
|
|
1876
|
-
const PROCESSING_PATTERN = TERMINAL_PATTERNS.PROCESSING;
|
|
1877
|
-
// Use centralized timing from EVENT_DELIVERY_CONSTANTS
|
|
1878
|
-
const INITIAL_DELAY = EVENT_DELIVERY_CONSTANTS.INITIAL_MESSAGE_DELAY;
|
|
1879
|
-
const PASTE_CHECK_DELAY = EVENT_DELIVERY_CONSTANTS.PASTE_CHECK_DELAY;
|
|
1880
|
-
const ENTER_RETRY_DELAY = EVENT_DELIVERY_CONSTANTS.ENTER_RETRY_DELAY;
|
|
1881
|
-
const MAX_ENTER_RETRIES = EVENT_DELIVERY_CONSTANTS.MAX_ENTER_RETRIES;
|
|
1882
|
-
const MAX_BUFFER_SIZE = EVENT_DELIVERY_CONSTANTS.MAX_BUFFER_SIZE;
|
|
1883
|
-
// Helper to send the message when prompt is detected
|
|
1884
|
-
const sendMessageNow = () => {
|
|
1885
|
-
if (messageSent || resolved)
|
|
1886
|
-
return;
|
|
1887
|
-
this.logger.debug('Claude at prompt, sending message', {
|
|
1888
|
-
sessionName,
|
|
1889
|
-
messageLength: message.length,
|
|
1890
|
-
isMultiLine: message.includes('\n'),
|
|
1891
|
-
});
|
|
1892
|
-
// Send the message text
|
|
1893
|
-
session.write(message);
|
|
1894
|
-
messageSent = true;
|
|
1895
|
-
const isMultiLine = message.includes('\n');
|
|
1896
|
-
// Track Enter key state
|
|
1897
|
-
let enterAttempts = 0;
|
|
1898
|
-
let processingDetected = false;
|
|
1899
|
-
const bufferAtSend = buffer;
|
|
1900
|
-
// Function to send Enter and track attempts
|
|
1901
|
-
const sendEnterKey = (reason) => {
|
|
1902
|
-
if (resolved || processingDetected)
|
|
1903
|
-
return;
|
|
1904
|
-
enterAttempts++;
|
|
1905
|
-
session.write('\r');
|
|
1906
|
-
enterSent = true;
|
|
1907
|
-
this.logger.debug('Enter key sent', {
|
|
1908
|
-
sessionName,
|
|
1909
|
-
attempt: enterAttempts,
|
|
1910
|
-
reason,
|
|
1911
|
-
});
|
|
1912
|
-
};
|
|
1913
|
-
// Function to check if Enter was accepted (processing started)
|
|
1914
|
-
const checkProcessingStarted = () => {
|
|
1915
|
-
const newData = buffer.slice(bufferAtSend.length);
|
|
1916
|
-
return PROCESSING_PATTERN.test(newData);
|
|
1917
|
-
};
|
|
1918
|
-
// Function to check for paste indicator
|
|
1919
|
-
const checkPasteIndicator = () => {
|
|
1920
|
-
const newData = buffer.slice(bufferAtSend.length);
|
|
1921
|
-
return PASTE_PATTERN.test(newData);
|
|
1922
|
-
};
|
|
1923
|
-
// Strategy: Send Enter with progressive timing, retry if not accepted
|
|
1924
|
-
const attemptEnter = (attemptNum) => {
|
|
1925
|
-
if (resolved || processingDetected)
|
|
1926
|
-
return;
|
|
1927
|
-
// Check if processing already started
|
|
1928
|
-
if (checkProcessingStarted()) {
|
|
1929
|
-
processingDetected = true;
|
|
1930
|
-
enterAccepted = true;
|
|
1931
|
-
this.logger.debug('Processing detected, message accepted', { sessionName, attemptNum });
|
|
1932
|
-
buffer = ''; // Reset for processing indicator detection
|
|
1933
|
-
return;
|
|
1934
|
-
}
|
|
1935
|
-
if (attemptNum > MAX_ENTER_RETRIES) {
|
|
1936
|
-
this.logger.warn('Max Enter retries reached, verifying message acceptance', { sessionName });
|
|
1937
|
-
scheduleTimeout(async () => {
|
|
1938
|
-
if (resolved)
|
|
1939
|
-
return;
|
|
1940
|
-
const stuck = await this.isMessageStuckAtPrompt(sessionName, message);
|
|
1941
|
-
if (stuck) {
|
|
1942
|
-
this.logger.warn('Message stuck at prompt after all Enter retries', { sessionName });
|
|
1943
|
-
const stuckHelper = await this.getSessionHelper();
|
|
1944
|
-
await stuckHelper.clearCurrentCommandLine(sessionName);
|
|
1945
|
-
enterAccepted = false;
|
|
1946
|
-
}
|
|
1947
|
-
else {
|
|
1948
|
-
this.logger.debug('Message appears accepted (no longer at prompt)', { sessionName });
|
|
1949
|
-
enterAccepted = true;
|
|
1950
|
-
buffer = '';
|
|
1951
|
-
}
|
|
1952
|
-
}, EVENT_DELIVERY_CONSTANTS.POST_ENTER_VERIFICATION_DELAY);
|
|
1953
|
-
return;
|
|
1954
|
-
}
|
|
1955
|
-
sendEnterKey(attemptNum === 1 ? 'initial' : `retry-${attemptNum}`);
|
|
1956
|
-
// Schedule check and possible retry (using tracked timeout to prevent leaks)
|
|
1957
|
-
scheduleTimeout(() => {
|
|
1958
|
-
if (resolved)
|
|
1959
|
-
return;
|
|
1960
|
-
if (checkProcessingStarted()) {
|
|
1961
|
-
processingDetected = true;
|
|
1962
|
-
enterAccepted = true;
|
|
1963
|
-
this.logger.debug('Processing detected after Enter', { sessionName, attemptNum });
|
|
1964
|
-
buffer = '';
|
|
1965
|
-
}
|
|
1966
|
-
else {
|
|
1967
|
-
// Not accepted yet, retry
|
|
1968
|
-
this.logger.debug('Enter may not have been accepted, retrying', {
|
|
1969
|
-
sessionName,
|
|
1970
|
-
attemptNum,
|
|
1971
|
-
bufferLength: buffer.length,
|
|
1972
|
-
});
|
|
1973
|
-
attemptEnter(attemptNum + 1);
|
|
1974
|
-
}
|
|
1975
|
-
}, ENTER_RETRY_DELAY);
|
|
1976
|
-
};
|
|
1977
|
-
// For multi-line messages, wait longer for paste indicator
|
|
1978
|
-
// For single-line messages, send Enter sooner
|
|
1979
|
-
const initialWait = isMultiLine ? PASTE_CHECK_DELAY : INITIAL_DELAY;
|
|
1980
|
-
scheduleTimeout(() => {
|
|
1981
|
-
if (resolved)
|
|
1982
|
-
return;
|
|
1983
|
-
// For multi-line: check if paste indicator appeared
|
|
1984
|
-
if (isMultiLine && checkPasteIndicator()) {
|
|
1985
|
-
this.logger.debug('Paste indicator detected', { sessionName });
|
|
1986
|
-
}
|
|
1987
|
-
// Start Enter key attempts
|
|
1988
|
-
attemptEnter(1);
|
|
1989
|
-
}, initialWait);
|
|
1990
|
-
};
|
|
1991
|
-
const timeoutId = setTimeout(async () => {
|
|
1992
|
-
this.logger.debug('Event-driven delivery timed out', {
|
|
1993
|
-
sessionName,
|
|
1994
|
-
messageSent,
|
|
1995
|
-
enterSent,
|
|
1996
|
-
enterAccepted,
|
|
1997
|
-
deliveryConfirmed,
|
|
1998
|
-
bufferLength: buffer.length,
|
|
1999
|
-
});
|
|
2000
|
-
// If Enter was sent but not confirmed accepted, verify via terminal capture
|
|
2001
|
-
if (enterSent && !enterAccepted && !deliveryConfirmed) {
|
|
2002
|
-
const timeoutHelper = await this.getSessionHelper();
|
|
2003
|
-
const stuck = await this.isMessageStuckAtPrompt(sessionName, message);
|
|
2004
|
-
if (stuck) {
|
|
2005
|
-
this.logger.warn('Timeout: message stuck at prompt, clearing and failing', { sessionName });
|
|
2006
|
-
await timeoutHelper.clearCurrentCommandLine(sessionName);
|
|
2007
|
-
cleanup();
|
|
2008
|
-
resolve(false);
|
|
2009
|
-
return;
|
|
2010
|
-
}
|
|
2011
|
-
this.logger.debug('Timeout: message not at prompt, treating as accepted', { sessionName });
|
|
2012
|
-
}
|
|
2013
|
-
cleanup();
|
|
2014
|
-
resolve(enterAccepted || deliveryConfirmed);
|
|
2015
|
-
}, timeoutMs);
|
|
2016
|
-
// IMPORTANT: Check current terminal state, but wait for output to settle first.
|
|
2017
|
-
// If the orchestrator just finished outputting (greeting, notification, status bar),
|
|
2018
|
-
// the prompt may not be cleanly detectable. We capture the pane, wait briefly,
|
|
2019
|
-
// and re-capture. If output is still changing, wait again before checking prompt.
|
|
2020
|
-
// Use 50 lines to account for status bars and notifications that can
|
|
2021
|
-
// wrap across many lines and push the prompt out of a smaller window.
|
|
2022
|
-
const waitForSettled = async () => {
|
|
2023
|
-
let prevOutput = sessionHelper.capturePane(sessionName);
|
|
2024
|
-
for (let i = 0; i < 5; i++) { // Max 5 checks, 500ms apart = 2.5s max
|
|
2025
|
-
if (resolved)
|
|
2026
|
-
return;
|
|
2027
|
-
await delay(500);
|
|
2028
|
-
if (resolved)
|
|
2029
|
-
return;
|
|
2030
|
-
const currentOutput = sessionHelper.capturePane(sessionName);
|
|
2031
|
-
if (currentOutput === prevOutput) {
|
|
2032
|
-
// Output settled
|
|
2033
|
-
if (this.isClaudeAtPrompt(currentOutput)) {
|
|
2034
|
-
this.logger.debug('Claude at prompt after output settled', { sessionName, settleChecks: i + 1 });
|
|
2035
|
-
sendMessageNow();
|
|
2036
|
-
}
|
|
2037
|
-
return;
|
|
2038
|
-
}
|
|
2039
|
-
prevOutput = currentOutput;
|
|
2040
|
-
}
|
|
2041
|
-
// Output still changing after 2.5s - check anyway
|
|
2042
|
-
if (!resolved && this.isClaudeAtPrompt(prevOutput)) {
|
|
2043
|
-
this.logger.debug('Claude at prompt (output still changing, checking anyway)', { sessionName });
|
|
2044
|
-
sendMessageNow();
|
|
2045
|
-
}
|
|
2046
|
-
};
|
|
2047
|
-
waitForSettled();
|
|
2048
|
-
const unsubscribe = session.onData((data) => {
|
|
2049
|
-
if (resolved)
|
|
2050
|
-
return;
|
|
2051
|
-
// Accumulate data with size limit to prevent memory exhaustion (P2.3 fix)
|
|
2052
|
-
buffer += data;
|
|
2053
|
-
if (buffer.length > MAX_BUFFER_SIZE) {
|
|
2054
|
-
buffer = buffer.slice(-MAX_BUFFER_SIZE);
|
|
2055
|
-
}
|
|
2056
|
-
// Phase 1: Wait for Claude to be at prompt before sending
|
|
2057
|
-
if (!messageSent) {
|
|
2058
|
-
const isAtPrompt = buffer.split('\n').some(line => line.trim().length > 0 && isPromptLine(line));
|
|
2059
|
-
if (isAtPrompt) {
|
|
2060
|
-
sendMessageNow();
|
|
2061
|
-
}
|
|
2062
|
-
return;
|
|
2063
|
-
}
|
|
2064
|
-
// Phase 2: Only check for processing indicators AFTER Enter has been sent
|
|
2065
|
-
if (!enterSent) {
|
|
2066
|
-
return; // Wait for Enter to be sent
|
|
2067
|
-
}
|
|
2068
|
-
// Look for processing indicators confirming delivery
|
|
2069
|
-
const hasProcessingIndicator = containsProcessingIndicator(buffer);
|
|
2070
|
-
// Also check if prompt disappeared (Claude is working)
|
|
2071
|
-
const promptStillVisible = buffer.split('\n').some(line => line.trim().length > 0 && isPromptLine(line));
|
|
2072
|
-
// Use constant for minimum buffer check (P3.2 fix)
|
|
2073
|
-
if (hasProcessingIndicator || (!promptStillVisible && buffer.length > EVENT_DELIVERY_CONSTANTS.MIN_BUFFER_FOR_PROCESSING_DETECTION)) {
|
|
2074
|
-
this.logger.debug('Message delivery confirmed (event-driven)', {
|
|
2075
|
-
sessionName,
|
|
2076
|
-
hasProcessingIndicator,
|
|
2077
|
-
promptStillVisible,
|
|
2078
|
-
bufferLength: buffer.length,
|
|
2079
|
-
});
|
|
2080
|
-
deliveryConfirmed = true;
|
|
2081
|
-
cleanup();
|
|
2082
|
-
resolve(true);
|
|
2083
|
-
}
|
|
2084
|
-
});
|
|
2085
|
-
});
|
|
2086
|
-
}
|
|
2087
1991
|
/**
|
|
2088
1992
|
* Send message with retry logic for reliable delivery to Claude Code.
|
|
2089
1993
|
* Uses SessionCommandHelper.sendMessage() (proven two-step write pattern)
|
|
@@ -2114,6 +2018,17 @@ After checking in, just say "Ready for tasks" and wait for me to send you work.`
|
|
|
2114
2018
|
});
|
|
2115
2019
|
// Verify agent is at prompt before sending
|
|
2116
2020
|
const output = sessionHelper.capturePane(sessionName);
|
|
2021
|
+
// Gemini CLI stuck-connectivity guard (#128): If the CLI is in a
|
|
2022
|
+
// "Trying to reach <model>" retry loop, it will never process
|
|
2023
|
+
// new messages. Bail out immediately so the caller gets a clear
|
|
2024
|
+
// failure signal and the runtime-exit-monitor can trigger recovery.
|
|
2025
|
+
if (runtimeType === RUNTIME_TYPES.GEMINI_CLI && GEMINI_STUCK_CONNECTIVITY_PATTERN.test(output)) {
|
|
2026
|
+
this.logger.warn('Gemini CLI stuck in connectivity retry loop, aborting message delivery (#128)', {
|
|
2027
|
+
sessionName,
|
|
2028
|
+
attempt,
|
|
2029
|
+
});
|
|
2030
|
+
return false;
|
|
2031
|
+
}
|
|
2117
2032
|
if (!this.isClaudeAtPrompt(output, runtimeType)) {
|
|
2118
2033
|
if (attempt === maxAttempts) {
|
|
2119
2034
|
// On the final attempt, check if the agent is DEFINITELY busy
|
|
@@ -2187,38 +2102,45 @@ After checking in, just say "Ready for tasks" and wait for me to send you work.`
|
|
|
2187
2102
|
// TUI re-render (SIGWINCH), then Tab to cycle Ink focus.
|
|
2188
2103
|
await sessionHelper.sendCtrlC(sessionName);
|
|
2189
2104
|
await delay(300);
|
|
2190
|
-
try {
|
|
2191
|
-
const session = sessionHelper.getSession(sessionName);
|
|
2192
|
-
if (session) {
|
|
2193
|
-
session.resize(81, 25);
|
|
2194
|
-
await delay(200);
|
|
2195
|
-
session.resize(80, 24);
|
|
2196
|
-
await delay(300);
|
|
2197
|
-
}
|
|
2198
|
-
}
|
|
2199
|
-
catch { /* non-fatal */ }
|
|
2200
|
-
await sessionHelper.sendKey(sessionName, 'Tab');
|
|
2201
|
-
await delay(300);
|
|
2202
2105
|
}
|
|
2203
|
-
|
|
2204
|
-
|
|
2205
|
-
|
|
2206
|
-
|
|
2207
|
-
|
|
2208
|
-
|
|
2209
|
-
|
|
2106
|
+
// PTY resize on ALL attempts to force SIGWINCH → Ink TUI re-render.
|
|
2107
|
+
// Claude Code's Ink TUI can lose internal input focus after stop hooks
|
|
2108
|
+
// (especially ones that error), state transitions, or idle periods.
|
|
2109
|
+
// When defocused, the `❯` prompt is visible in the terminal buffer
|
|
2110
|
+
// but writes are silently consumed by the framework — NOT routed to
|
|
2111
|
+
// the InputPrompt. Tab alone was insufficient; PTY resize forces a
|
|
2112
|
+
// full TUI re-render that reliably restores focus state.
|
|
2113
|
+
// This matches the manual workaround where pressing a key in the
|
|
2114
|
+
// frontend terminal "wakes up" the input handler.
|
|
2115
|
+
try {
|
|
2116
|
+
const session = sessionHelper.getSession(sessionName);
|
|
2117
|
+
if (session) {
|
|
2118
|
+
session.resize(81, 25);
|
|
2119
|
+
await delay(200);
|
|
2120
|
+
session.resize(80, 24);
|
|
2121
|
+
await delay(300);
|
|
2122
|
+
}
|
|
2210
2123
|
}
|
|
2124
|
+
catch { /* non-fatal */ }
|
|
2125
|
+
await sessionHelper.sendKey(sessionName, 'Tab');
|
|
2126
|
+
await delay(300);
|
|
2211
2127
|
}
|
|
2212
2128
|
else {
|
|
2213
2129
|
// Detect recent /compress — Ink TUI loses internal focus after
|
|
2214
2130
|
// /compress re-renders, causing subsequent messages to be silently
|
|
2215
2131
|
// dropped even though the prompt `>` is visible (#114).
|
|
2216
2132
|
// Always force PTY resize on attempt 1 if /compress detected.
|
|
2133
|
+
// Also detect ✖ error state (#130) — MCP connection errors
|
|
2134
|
+
// cause a persistent error indicator that steals TUI focus.
|
|
2217
2135
|
const recentOutput = sessionHelper.capturePane(sessionName, 40);
|
|
2218
2136
|
const compressDetected = recentOutput.includes('/compress') ||
|
|
2219
2137
|
recentOutput.includes('Context compressed') ||
|
|
2220
2138
|
recentOutput.includes('Compressing context');
|
|
2221
|
-
|
|
2139
|
+
// Check for Gemini CLI error indicators in the status bar area (#130).
|
|
2140
|
+
const statusArea = recentOutput.split('\n').slice(-GEMINI_ERROR_STATE_CONSTANTS.STATUS_AREA_LINES).join('\n');
|
|
2141
|
+
const errorStateDetected = recentOutput.includes(GEMINI_ERROR_STATE_CONSTANTS.ERROR_MARKER) ||
|
|
2142
|
+
GEMINI_ERROR_STATE_CONSTANTS.ERROR_COUNT_PATTERN.test(statusArea);
|
|
2143
|
+
const needsResize = attempt > 1 || compressDetected || errorStateDetected;
|
|
2222
2144
|
// Force a PTY resize to trigger SIGWINCH, making Ink
|
|
2223
2145
|
// re-render the TUI and potentially restore focus state.
|
|
2224
2146
|
if (needsResize) {
|
|
@@ -2244,19 +2166,39 @@ After checking in, just say "Ready for tasks" and wait for me to send you work.`
|
|
|
2244
2166
|
});
|
|
2245
2167
|
}
|
|
2246
2168
|
}
|
|
2169
|
+
// If error state detected (✖), dismiss the error overlay first (#130).
|
|
2170
|
+
// F12 toggles the error details panel in Gemini CLI, Enter dismisses
|
|
2171
|
+
// any overlay/notification, and the combination restores the TUI to a
|
|
2172
|
+
// state where the InputPrompt can accept input.
|
|
2173
|
+
if (errorStateDetected) {
|
|
2174
|
+
this.logger.info('Gemini CLI error state detected (✖), dismissing before delivery (#130)', {
|
|
2175
|
+
sessionName,
|
|
2176
|
+
attempt,
|
|
2177
|
+
});
|
|
2178
|
+
// F12 to close error details panel if open
|
|
2179
|
+
await sessionHelper.sendKey(sessionName, 'F12');
|
|
2180
|
+
await delay(300);
|
|
2181
|
+
// Enter to dismiss any remaining overlay/notification
|
|
2182
|
+
await sessionHelper.sendEnter(sessionName);
|
|
2183
|
+
await delay(500);
|
|
2184
|
+
}
|
|
2247
2185
|
// Send Tab to cycle Ink focus. In Ink v6, Tab triggers
|
|
2248
2186
|
// focusNext() in FocusContext, which moves focus to the next
|
|
2249
2187
|
// focusable component (InputPrompt). This works even when the
|
|
2250
2188
|
// input is defocused because the Tab handler runs at the Ink
|
|
2251
2189
|
// framework level, not the component level.
|
|
2190
|
+
// Send two Tabs to cycle through error/notification components
|
|
2191
|
+
// that may be in the focus chain (#130).
|
|
2192
|
+
await sessionHelper.sendKey(sessionName, 'Tab');
|
|
2193
|
+
await delay(200);
|
|
2252
2194
|
await sessionHelper.sendKey(sessionName, 'Tab');
|
|
2253
2195
|
await delay(300);
|
|
2254
2196
|
// Then Enter to dismiss any notification overlay and ensure
|
|
2255
2197
|
// the input is engaged. Enter on an empty `> ` prompt is a
|
|
2256
2198
|
// safe no-op (just shows a new blank prompt line).
|
|
2257
2199
|
await sessionHelper.sendEnter(sessionName);
|
|
2258
|
-
// Extra settling time after /compress to let Ink TUI stabilize
|
|
2259
|
-
await delay(compressDetected ? 1000 : 500);
|
|
2200
|
+
// Extra settling time after /compress or error state to let Ink TUI stabilize
|
|
2201
|
+
await delay((compressDetected || errorStateDetected) ? 1000 : 500);
|
|
2260
2202
|
}
|
|
2261
2203
|
// For Gemini CLI: detect and gently escape interactive modes before
|
|
2262
2204
|
// sending the message. Avoid Ctrl-C here — Gemini interprets it as
|
|
@@ -2289,6 +2231,50 @@ After checking in, just say "Ready for tasks" and wait for me to send you work.`
|
|
|
2289
2231
|
// border redraws that can cause length changes unrelated to delivery.
|
|
2290
2232
|
const beforeOutput = sessionHelper.capturePane(sessionName, 20);
|
|
2291
2233
|
const beforeLength = beforeOutput.length;
|
|
2234
|
+
// Deduplication guard (#128): Check if the agent is already
|
|
2235
|
+
// processing on ALL attempts (not just retries). A previous
|
|
2236
|
+
// write may have succeeded but verification failed. Re-writing
|
|
2237
|
+
// the same message creates a duplicate in the input buffer.
|
|
2238
|
+
{
|
|
2239
|
+
const preWriteCheck = sessionHelper.capturePane(sessionName);
|
|
2240
|
+
const hasSpinner = containsSpinnerOrWorkingIndicator(preWriteCheck);
|
|
2241
|
+
if (hasSpinner) {
|
|
2242
|
+
// Hash-based dedup: if the same message was recently sent
|
|
2243
|
+
// and the agent is processing, it's very likely our message.
|
|
2244
|
+
const msgHash = message.substring(0, 200);
|
|
2245
|
+
const lastSent = this.lastSentMessageHash.get(sessionName);
|
|
2246
|
+
const isRecentDuplicate = lastSent
|
|
2247
|
+
&& lastSent.hash === msgHash
|
|
2248
|
+
&& (Date.now() - lastSent.sentAt) < 60000;
|
|
2249
|
+
if (isRecentDuplicate || attempt > 1) {
|
|
2250
|
+
this.logger.info('Agent already processing — skipping write to prevent duplicate (#128)', {
|
|
2251
|
+
sessionName,
|
|
2252
|
+
attempt,
|
|
2253
|
+
isRecentDuplicate: !!isRecentDuplicate,
|
|
2254
|
+
});
|
|
2255
|
+
return true;
|
|
2256
|
+
}
|
|
2257
|
+
}
|
|
2258
|
+
// On retries: also check if agent is not at prompt AND our
|
|
2259
|
+
// message text is NOT stuck at the bottom.
|
|
2260
|
+
if (attempt > 1) {
|
|
2261
|
+
const notAtPrompt = !this.isClaudeAtPrompt(preWriteCheck, runtimeType);
|
|
2262
|
+
if (notAtPrompt) {
|
|
2263
|
+
const msgSnippet = (message.length > 20
|
|
2264
|
+
? message.substring(0, 80)
|
|
2265
|
+
: message).replace(/\s+/g, ' ').trim();
|
|
2266
|
+
const bottomLines = preWriteCheck.split('\n').slice(-10).join(' ').replace(/\s+/g, ' ');
|
|
2267
|
+
const textStuck = bottomLines.includes(msgSnippet);
|
|
2268
|
+
if (!textStuck) {
|
|
2269
|
+
this.logger.info('Agent not at prompt and message not stuck — skipping re-write (#128)', {
|
|
2270
|
+
sessionName,
|
|
2271
|
+
attempt,
|
|
2272
|
+
});
|
|
2273
|
+
return true;
|
|
2274
|
+
}
|
|
2275
|
+
}
|
|
2276
|
+
}
|
|
2277
|
+
}
|
|
2292
2278
|
// Use SessionCommandHelper.sendMessage() — proven two-step write:
|
|
2293
2279
|
// 1. session.write(message) — triggers bracketed paste
|
|
2294
2280
|
// 2. await delay(scaled) — waits for paste processing
|
|
@@ -2299,6 +2285,11 @@ After checking in, just say "Ready for tasks" and wait for me to send you work.`
|
|
|
2299
2285
|
// If progressive verification below misses an Enter drop, the
|
|
2300
2286
|
// background scanner will catch it within 30s.
|
|
2301
2287
|
this.trackSentMessage(sessionName, message);
|
|
2288
|
+
// Track message hash for deduplication on retry (#128)
|
|
2289
|
+
this.lastSentMessageHash.set(sessionName, {
|
|
2290
|
+
hash: message.substring(0, 200),
|
|
2291
|
+
sentAt: Date.now(),
|
|
2292
|
+
});
|
|
2302
2293
|
// Wait for agent to start processing, then verify delivery.
|
|
2303
2294
|
// TUI runtimes need a longer delay (3s) for the TUI to redraw
|
|
2304
2295
|
// and show processing indicators after accepting input.
|
|
@@ -2365,11 +2356,17 @@ After checking in, just say "Ready for tasks" and wait for me to send you work.`
|
|
|
2365
2356
|
: message).replace(/\s+/g, ' ').trim();
|
|
2366
2357
|
const promptBottomLines = currentOutput.split('\n').slice(-10).join(' ').replace(/\s+/g, ' ');
|
|
2367
2358
|
if (promptBottomLines.includes(promptMsgSnippet)) {
|
|
2368
|
-
this.logger.warn('At prompt with message text at bottom — pressing Enter', {
|
|
2359
|
+
this.logger.warn('At prompt with message text at bottom — pressing Tab+Enter', {
|
|
2369
2360
|
sessionName,
|
|
2370
2361
|
attempt,
|
|
2371
2362
|
intervalMs,
|
|
2372
2363
|
});
|
|
2364
|
+
// Tab restores Ink TUI focus before Enter — without this,
|
|
2365
|
+
// Enter may be consumed by the framework but not routed to
|
|
2366
|
+
// the input component if focus was lost during a re-render
|
|
2367
|
+
// (e.g., after stop hooks, state transitions).
|
|
2368
|
+
await sessionHelper.sendKey(sessionName, 'Tab');
|
|
2369
|
+
await delay(200);
|
|
2373
2370
|
await sessionHelper.sendEnter(sessionName);
|
|
2374
2371
|
await delay(500);
|
|
2375
2372
|
await sessionHelper.sendEnter(sessionName); // backup
|
|
@@ -2410,12 +2407,14 @@ After checking in, just say "Ready for tasks" and wait for me to send you work.`
|
|
|
2410
2407
|
// Message text is at the bottom of the terminal but the
|
|
2411
2408
|
// prompt is no longer in its idle form — Enter was dropped.
|
|
2412
2409
|
// Instead of waiting and doing a full Ctrl+C + resend retry,
|
|
2413
|
-
//
|
|
2414
|
-
this.logger.warn('Message text stuck at bottom — pressing Enter to recover', {
|
|
2410
|
+
// use Tab to restore TUI focus, then Enter to submit.
|
|
2411
|
+
this.logger.warn('Message text stuck at bottom — pressing Tab+Enter to recover', {
|
|
2415
2412
|
sessionName,
|
|
2416
2413
|
attempt,
|
|
2417
2414
|
intervalMs,
|
|
2418
2415
|
});
|
|
2416
|
+
await sessionHelper.sendKey(sessionName, 'Tab');
|
|
2417
|
+
await delay(200);
|
|
2419
2418
|
await sessionHelper.sendEnter(sessionName);
|
|
2420
2419
|
await delay(500);
|
|
2421
2420
|
await sessionHelper.sendEnter(sessionName); // backup Enter
|
|
@@ -2735,8 +2734,12 @@ After checking in, just say "Ready for tasks" and wait for me to send you work.`
|
|
|
2735
2734
|
*/
|
|
2736
2735
|
async recoverStuckTuiMessage(sessionName, message) {
|
|
2737
2736
|
const sessionHelper = await this.getSessionHelper();
|
|
2738
|
-
//
|
|
2739
|
-
|
|
2737
|
+
// Tab restores Ink TUI focus, then Enter to submit the stuck text.
|
|
2738
|
+
// Without Tab, Enter may be consumed by the framework but not routed
|
|
2739
|
+
// to the input component if focus was lost during a re-render.
|
|
2740
|
+
this.logger.info('Pressing Tab+Enter to recover stuck TUI message', { sessionName });
|
|
2741
|
+
await sessionHelper.sendKey(sessionName, 'Tab');
|
|
2742
|
+
await delay(200);
|
|
2740
2743
|
await sessionHelper.sendEnter(sessionName);
|
|
2741
2744
|
await delay(500);
|
|
2742
2745
|
// Double-tap: send a backup Enter in case the first was consumed
|
|
@@ -2850,11 +2853,13 @@ After checking in, just say "Ready for tasks" and wait for me to send you work.`
|
|
|
2850
2853
|
if (isPlaceholder) {
|
|
2851
2854
|
break;
|
|
2852
2855
|
}
|
|
2853
|
-
this.logger.warn('Background scan: text stuck at TUI prompt, pressing Enter', {
|
|
2856
|
+
this.logger.warn('Background scan: text stuck at TUI prompt, pressing Tab+Enter', {
|
|
2854
2857
|
sessionName,
|
|
2855
2858
|
promptContent: promptContent.slice(0, 80),
|
|
2856
2859
|
});
|
|
2857
|
-
//
|
|
2860
|
+
// Tab restores Ink TUI focus before Enter
|
|
2861
|
+
await sessionHelper.sendKey(sessionName, 'Tab');
|
|
2862
|
+
await delay(200);
|
|
2858
2863
|
await sessionHelper.sendEnter(sessionName);
|
|
2859
2864
|
await delay(500);
|
|
2860
2865
|
// Backup Enter
|
|
@@ -2890,11 +2895,14 @@ After checking in, just say "Ready for tasks" and wait for me to send you work.`
|
|
|
2890
2895
|
if (now - entry.sentAt < MIN_AGE_MS)
|
|
2891
2896
|
continue;
|
|
2892
2897
|
if (bottomText.includes(entry.snippet)) {
|
|
2893
|
-
this.logger.warn('Background scan: tracked message stuck, pressing Enter', {
|
|
2898
|
+
this.logger.warn('Background scan: tracked message stuck, pressing Tab+Enter', {
|
|
2894
2899
|
sessionName,
|
|
2895
2900
|
snippet: entry.snippet.slice(0, 50),
|
|
2896
2901
|
ageMs: now - entry.sentAt,
|
|
2897
2902
|
});
|
|
2903
|
+
// Tab restores Ink TUI focus before Enter
|
|
2904
|
+
await sessionHelper.sendKey(sessionName, 'Tab');
|
|
2905
|
+
await delay(200);
|
|
2898
2906
|
await sessionHelper.sendEnter(sessionName);
|
|
2899
2907
|
await delay(500);
|
|
2900
2908
|
await sessionHelper.sendEnter(sessionName); // backup
|