crewly 1.2.3 → 1.2.4
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 +44 -1
- package/config/index.ts +4 -0
- package/config/roles/orchestrator/prompt.md +30 -2
- 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/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/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 +303 -15
- package/dist/backend/backend/src/constants.d.ts.map +1 -1
- package/dist/backend/backend/src/constants.js +296 -15
- package/dist/backend/backend/src/constants.js.map +1 -1
- 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/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 +32 -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 +14 -0
- package/dist/backend/backend/src/controllers/cloud/index.d.ts.map +1 -0
- package/dist/backend/backend/src/controllers/cloud/index.js +14 -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 +101 -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 +343 -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 +29 -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 +44 -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 +7 -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 +7 -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 +33 -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 +50 -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 +18 -2
- 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 +57 -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 +27 -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 +38 -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.map +1 -1
- package/dist/backend/backend/src/controllers/system/scheduler.controller.js +4 -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 +259 -13
- 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 +105 -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 +21 -0
- package/dist/backend/backend/src/routes/api.routes.js.map +1 -1
- package/dist/backend/backend/src/services/agent/agent-registration.service.d.ts +1 -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 +211 -287
- package/dist/backend/backend/src/services/agent/agent-registration.service.js.map +1 -1
- 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/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 +77 -3
- 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 +281 -30
- 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 +10 -2
- package/dist/backend/backend/src/services/chat/chat.service.d.ts.map +1 -1
- package/dist/backend/backend/src/services/chat/chat.service.js +49 -8
- package/dist/backend/backend/src/services/chat/chat.service.js.map +1 -1
- 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-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 +322 -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/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 +183 -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 +523 -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/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 +20 -0
- 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 +35 -0
- 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/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.js +1 -1
- 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/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 +122 -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 +403 -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/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.map +1 -1
- package/dist/backend/backend/src/services/slack/slack-orchestrator-bridge.js +15 -5
- 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 +153 -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 +372 -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 +51 -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 +118 -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 +45 -2
- package/dist/backend/backend/src/types/chat.types.js.map +1 -1
- package/dist/backend/backend/src/types/event-bus.types.d.ts +14 -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 +15 -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/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/config/constants.d.ts +40 -1
- package/dist/backend/config/constants.d.ts.map +1 -1
- package/dist/backend/config/constants.js +41 -1
- 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 +303 -15
- package/dist/cli/backend/src/constants.d.ts.map +1 -1
- package/dist/cli/backend/src/constants.js +296 -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 +45 -2
- 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 +40 -1
- package/dist/cli/config/constants.d.ts.map +1 -1
- package/dist/cli/config/constants.js +41 -1
- 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-510ab719.css +33 -0
- package/frontend/dist/assets/index-935cd846.js +4961 -0
- package/frontend/dist/index.html +2 -2
- package/package.json +9 -4
- 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,9 @@ 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();
|
|
51
56
|
// Terminal patterns are now centralized in TERMINAL_PATTERNS constant
|
|
52
57
|
// Keeping prompt chars as static getter for backwards compatibility within the class
|
|
53
58
|
static get CLAUDE_PROMPT_INDICATORS() {
|
|
@@ -451,6 +456,8 @@ export class AgentRegistrationService {
|
|
|
451
456
|
// Must be before postInitialize and sendRegistrationPromptAsync so exits
|
|
452
457
|
// during those phases are detected and the abort signal fires in time.
|
|
453
458
|
RuntimeExitMonitorService.getInstance().startMonitoring(sessionName, runtimeType, role);
|
|
459
|
+
// Start OAuth relogin monitoring for automatic re-authentication
|
|
460
|
+
OAuthReloginMonitorService.getInstance().startMonitoring(sessionName, runtimeType);
|
|
454
461
|
// Look up per-agent browser automation override from member config
|
|
455
462
|
let browserAutomationOverride;
|
|
456
463
|
if (memberId) {
|
|
@@ -687,6 +694,8 @@ export class AgentRegistrationService {
|
|
|
687
694
|
}
|
|
688
695
|
// Start runtime exit monitoring immediately after runtime is ready
|
|
689
696
|
RuntimeExitMonitorService.getInstance().startMonitoring(sessionName, runtimeType, role);
|
|
697
|
+
// Start OAuth relogin monitoring for automatic re-authentication
|
|
698
|
+
OAuthReloginMonitorService.getInstance().startMonitoring(sessionName, runtimeType);
|
|
690
699
|
// Additional verification: Use runtime detection to confirm runtime is responding
|
|
691
700
|
// Wait a bit longer for runtime to fully load after showing welcome message
|
|
692
701
|
this.logger.debug('Runtime ready detected for orchestrator, waiting for full startup before verification', { sessionName, runtimeType });
|
|
@@ -729,6 +738,8 @@ export class AgentRegistrationService {
|
|
|
729
738
|
}
|
|
730
739
|
// Start runtime exit monitoring immediately after runtime is ready
|
|
731
740
|
RuntimeExitMonitorService.getInstance().startMonitoring(sessionName, runtimeType, role);
|
|
741
|
+
// Start OAuth relogin monitoring for automatic re-authentication
|
|
742
|
+
OAuthReloginMonitorService.getInstance().startMonitoring(sessionName, runtimeType);
|
|
732
743
|
}
|
|
733
744
|
// Look up per-agent browser automation override from member config
|
|
734
745
|
let browserOverrideForRecreation;
|
|
@@ -836,17 +847,23 @@ export class AgentRegistrationService {
|
|
|
836
847
|
// For orchestrator or cases without member ID, remove the memberId parameter
|
|
837
848
|
prompt = prompt.replace(/,\s*"memberId":\s*"\{\{MEMBER_ID\}\}"/g, '');
|
|
838
849
|
}
|
|
839
|
-
// Look up project path for team members
|
|
850
|
+
// Look up project path and TL hierarchy for team members
|
|
840
851
|
let projectPath = process.cwd();
|
|
852
|
+
let foundTeam = null;
|
|
853
|
+
let foundMember = null;
|
|
841
854
|
try {
|
|
842
855
|
const teams = await this.storageService.getTeams();
|
|
843
856
|
for (const team of teams) {
|
|
844
857
|
const member = team.members?.find((m) => m.sessionName === sessionName);
|
|
845
|
-
if (member
|
|
846
|
-
|
|
847
|
-
|
|
848
|
-
if (
|
|
849
|
-
|
|
858
|
+
if (member) {
|
|
859
|
+
foundTeam = team;
|
|
860
|
+
foundMember = member;
|
|
861
|
+
if (team.projectIds[0]) {
|
|
862
|
+
const projects = await this.storageService.getProjects();
|
|
863
|
+
const project = projects.find((p) => p.id === team.projectIds[0]);
|
|
864
|
+
if (project?.path) {
|
|
865
|
+
projectPath = project.path;
|
|
866
|
+
}
|
|
850
867
|
}
|
|
851
868
|
break;
|
|
852
869
|
}
|
|
@@ -888,6 +905,53 @@ export class AgentRegistrationService {
|
|
|
888
905
|
// Replace marketplace skills path placeholder
|
|
889
906
|
const marketplaceSkillsPath = path.join(os.homedir(), '.crewly', 'marketplace', 'skills');
|
|
890
907
|
prompt = prompt.replace(/\{\{MARKETPLACE_SKILLS_PATH\}\}/g, marketplaceSkillsPath);
|
|
908
|
+
// Inject Team Lead addon for members with canDelegate=true and subordinates
|
|
909
|
+
if (foundMember?.canDelegate && foundMember.subordinateIds && foundMember.subordinateIds.length > 0 && foundTeam) {
|
|
910
|
+
try {
|
|
911
|
+
// Resolve subordinateIds to SubordinateInfo[]
|
|
912
|
+
const subordinates = foundMember.subordinateIds
|
|
913
|
+
.map((subId) => {
|
|
914
|
+
const subMember = foundTeam.members?.find((m) => m.id === subId);
|
|
915
|
+
if (!subMember)
|
|
916
|
+
return null;
|
|
917
|
+
return {
|
|
918
|
+
name: subMember.name,
|
|
919
|
+
sessionName: subMember.sessionName || '',
|
|
920
|
+
role: subMember.role || 'developer',
|
|
921
|
+
};
|
|
922
|
+
})
|
|
923
|
+
.filter((s) => s !== null);
|
|
924
|
+
if (subordinates.length > 0) {
|
|
925
|
+
const tlConfig = {
|
|
926
|
+
name: sessionName,
|
|
927
|
+
role: role,
|
|
928
|
+
systemPrompt: '',
|
|
929
|
+
projectPath,
|
|
930
|
+
memberId,
|
|
931
|
+
teamId: foundTeam.id,
|
|
932
|
+
canDelegate: true,
|
|
933
|
+
subordinates,
|
|
934
|
+
};
|
|
935
|
+
const promptBuilder = new PromptBuilderService(this.projectRoot);
|
|
936
|
+
const tlSection = await promptBuilder.buildTeamLeadSection(tlConfig);
|
|
937
|
+
if (tlSection) {
|
|
938
|
+
prompt += `\n\n---\n\n${tlSection}`;
|
|
939
|
+
this.logger.info('TL addon injected into init prompt', {
|
|
940
|
+
sessionName,
|
|
941
|
+
subordinateCount: subordinates.length,
|
|
942
|
+
subordinateNames: subordinates.map((s) => s.name),
|
|
943
|
+
tlSectionLength: tlSection.length,
|
|
944
|
+
});
|
|
945
|
+
}
|
|
946
|
+
}
|
|
947
|
+
}
|
|
948
|
+
catch (tlError) {
|
|
949
|
+
this.logger.warn('Failed to inject TL addon (non-critical)', {
|
|
950
|
+
sessionName,
|
|
951
|
+
error: tlError instanceof Error ? tlError.message : String(tlError),
|
|
952
|
+
});
|
|
953
|
+
}
|
|
954
|
+
}
|
|
891
955
|
// Generate and inject startup briefing from session memory
|
|
892
956
|
try {
|
|
893
957
|
const sessionMemoryService = SessionMemoryService.getInstance();
|
|
@@ -1440,6 +1504,8 @@ After checking in, just say "Ready for tasks" and wait for me to send you work.`
|
|
|
1440
1504
|
if (role !== ORCHESTRATOR_ROLE && config.teamId && config.memberId) {
|
|
1441
1505
|
ContextWindowMonitorService.getInstance().startSessionMonitoring(sessionName, config.memberId, config.teamId, role, runtimeType);
|
|
1442
1506
|
}
|
|
1507
|
+
// Start OAuth relogin monitoring for recovered session
|
|
1508
|
+
OAuthReloginMonitorService.getInstance().startMonitoring(sessionName, runtimeType);
|
|
1443
1509
|
return {
|
|
1444
1510
|
success: true,
|
|
1445
1511
|
sessionName,
|
|
@@ -1533,6 +1599,8 @@ After checking in, just say "Ready for tasks" and wait for me to send you work.`
|
|
|
1533
1599
|
if (role !== ORCHESTRATOR_ROLE && config.teamId && config.memberId) {
|
|
1534
1600
|
ContextWindowMonitorService.getInstance().startSessionMonitoring(sessionName, config.memberId, config.teamId, role, runtimeType);
|
|
1535
1601
|
}
|
|
1602
|
+
// Start OAuth relogin monitoring for newly created session
|
|
1603
|
+
OAuthReloginMonitorService.getInstance().startMonitoring(sessionName, runtimeType);
|
|
1536
1604
|
return {
|
|
1537
1605
|
success: true,
|
|
1538
1606
|
sessionName,
|
|
@@ -1564,6 +1632,8 @@ After checking in, just say "Ready for tasks" and wait for me to send you work.`
|
|
|
1564
1632
|
this.logger.info('Terminating agent session (unified approach)', { sessionName, role });
|
|
1565
1633
|
// Stop runtime exit monitoring before killing the session
|
|
1566
1634
|
RuntimeExitMonitorService.getInstance().stopMonitoring(sessionName);
|
|
1635
|
+
// Stop OAuth relogin monitoring before killing the session
|
|
1636
|
+
OAuthReloginMonitorService.getInstance().stopMonitoring(sessionName);
|
|
1567
1637
|
// Stop context window monitoring before killing the session
|
|
1568
1638
|
ContextWindowMonitorService.getInstance().stopSessionMonitoring(sessionName);
|
|
1569
1639
|
// Get session helper once to avoid repeated async calls
|
|
@@ -1834,256 +1904,6 @@ After checking in, just say "Ready for tasks" and wait for me to send you work.`
|
|
|
1834
1904
|
});
|
|
1835
1905
|
});
|
|
1836
1906
|
}
|
|
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
1907
|
/**
|
|
2088
1908
|
* Send message with retry logic for reliable delivery to Claude Code.
|
|
2089
1909
|
* Uses SessionCommandHelper.sendMessage() (proven two-step write pattern)
|
|
@@ -2114,6 +1934,17 @@ After checking in, just say "Ready for tasks" and wait for me to send you work.`
|
|
|
2114
1934
|
});
|
|
2115
1935
|
// Verify agent is at prompt before sending
|
|
2116
1936
|
const output = sessionHelper.capturePane(sessionName);
|
|
1937
|
+
// Gemini CLI stuck-connectivity guard (#128): If the CLI is in a
|
|
1938
|
+
// "Trying to reach <model>" retry loop, it will never process
|
|
1939
|
+
// new messages. Bail out immediately so the caller gets a clear
|
|
1940
|
+
// failure signal and the runtime-exit-monitor can trigger recovery.
|
|
1941
|
+
if (runtimeType === RUNTIME_TYPES.GEMINI_CLI && GEMINI_STUCK_CONNECTIVITY_PATTERN.test(output)) {
|
|
1942
|
+
this.logger.warn('Gemini CLI stuck in connectivity retry loop, aborting message delivery (#128)', {
|
|
1943
|
+
sessionName,
|
|
1944
|
+
attempt,
|
|
1945
|
+
});
|
|
1946
|
+
return false;
|
|
1947
|
+
}
|
|
2117
1948
|
if (!this.isClaudeAtPrompt(output, runtimeType)) {
|
|
2118
1949
|
if (attempt === maxAttempts) {
|
|
2119
1950
|
// On the final attempt, check if the agent is DEFINITELY busy
|
|
@@ -2187,38 +2018,45 @@ After checking in, just say "Ready for tasks" and wait for me to send you work.`
|
|
|
2187
2018
|
// TUI re-render (SIGWINCH), then Tab to cycle Ink focus.
|
|
2188
2019
|
await sessionHelper.sendCtrlC(sessionName);
|
|
2189
2020
|
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
2021
|
}
|
|
2203
|
-
|
|
2204
|
-
|
|
2205
|
-
|
|
2206
|
-
|
|
2207
|
-
|
|
2208
|
-
|
|
2209
|
-
|
|
2022
|
+
// PTY resize on ALL attempts to force SIGWINCH → Ink TUI re-render.
|
|
2023
|
+
// Claude Code's Ink TUI can lose internal input focus after stop hooks
|
|
2024
|
+
// (especially ones that error), state transitions, or idle periods.
|
|
2025
|
+
// When defocused, the `❯` prompt is visible in the terminal buffer
|
|
2026
|
+
// but writes are silently consumed by the framework — NOT routed to
|
|
2027
|
+
// the InputPrompt. Tab alone was insufficient; PTY resize forces a
|
|
2028
|
+
// full TUI re-render that reliably restores focus state.
|
|
2029
|
+
// This matches the manual workaround where pressing a key in the
|
|
2030
|
+
// frontend terminal "wakes up" the input handler.
|
|
2031
|
+
try {
|
|
2032
|
+
const session = sessionHelper.getSession(sessionName);
|
|
2033
|
+
if (session) {
|
|
2034
|
+
session.resize(81, 25);
|
|
2035
|
+
await delay(200);
|
|
2036
|
+
session.resize(80, 24);
|
|
2037
|
+
await delay(300);
|
|
2038
|
+
}
|
|
2210
2039
|
}
|
|
2040
|
+
catch { /* non-fatal */ }
|
|
2041
|
+
await sessionHelper.sendKey(sessionName, 'Tab');
|
|
2042
|
+
await delay(300);
|
|
2211
2043
|
}
|
|
2212
2044
|
else {
|
|
2213
2045
|
// Detect recent /compress — Ink TUI loses internal focus after
|
|
2214
2046
|
// /compress re-renders, causing subsequent messages to be silently
|
|
2215
2047
|
// dropped even though the prompt `>` is visible (#114).
|
|
2216
2048
|
// Always force PTY resize on attempt 1 if /compress detected.
|
|
2049
|
+
// Also detect ✖ error state (#130) — MCP connection errors
|
|
2050
|
+
// cause a persistent error indicator that steals TUI focus.
|
|
2217
2051
|
const recentOutput = sessionHelper.capturePane(sessionName, 40);
|
|
2218
2052
|
const compressDetected = recentOutput.includes('/compress') ||
|
|
2219
2053
|
recentOutput.includes('Context compressed') ||
|
|
2220
2054
|
recentOutput.includes('Compressing context');
|
|
2221
|
-
|
|
2055
|
+
// Check for Gemini CLI error indicators in the status bar area (#130).
|
|
2056
|
+
const statusArea = recentOutput.split('\n').slice(-GEMINI_ERROR_STATE_CONSTANTS.STATUS_AREA_LINES).join('\n');
|
|
2057
|
+
const errorStateDetected = recentOutput.includes(GEMINI_ERROR_STATE_CONSTANTS.ERROR_MARKER) ||
|
|
2058
|
+
GEMINI_ERROR_STATE_CONSTANTS.ERROR_COUNT_PATTERN.test(statusArea);
|
|
2059
|
+
const needsResize = attempt > 1 || compressDetected || errorStateDetected;
|
|
2222
2060
|
// Force a PTY resize to trigger SIGWINCH, making Ink
|
|
2223
2061
|
// re-render the TUI and potentially restore focus state.
|
|
2224
2062
|
if (needsResize) {
|
|
@@ -2244,19 +2082,39 @@ After checking in, just say "Ready for tasks" and wait for me to send you work.`
|
|
|
2244
2082
|
});
|
|
2245
2083
|
}
|
|
2246
2084
|
}
|
|
2085
|
+
// If error state detected (✖), dismiss the error overlay first (#130).
|
|
2086
|
+
// F12 toggles the error details panel in Gemini CLI, Enter dismisses
|
|
2087
|
+
// any overlay/notification, and the combination restores the TUI to a
|
|
2088
|
+
// state where the InputPrompt can accept input.
|
|
2089
|
+
if (errorStateDetected) {
|
|
2090
|
+
this.logger.info('Gemini CLI error state detected (✖), dismissing before delivery (#130)', {
|
|
2091
|
+
sessionName,
|
|
2092
|
+
attempt,
|
|
2093
|
+
});
|
|
2094
|
+
// F12 to close error details panel if open
|
|
2095
|
+
await sessionHelper.sendKey(sessionName, 'F12');
|
|
2096
|
+
await delay(300);
|
|
2097
|
+
// Enter to dismiss any remaining overlay/notification
|
|
2098
|
+
await sessionHelper.sendEnter(sessionName);
|
|
2099
|
+
await delay(500);
|
|
2100
|
+
}
|
|
2247
2101
|
// Send Tab to cycle Ink focus. In Ink v6, Tab triggers
|
|
2248
2102
|
// focusNext() in FocusContext, which moves focus to the next
|
|
2249
2103
|
// focusable component (InputPrompt). This works even when the
|
|
2250
2104
|
// input is defocused because the Tab handler runs at the Ink
|
|
2251
2105
|
// framework level, not the component level.
|
|
2106
|
+
// Send two Tabs to cycle through error/notification components
|
|
2107
|
+
// that may be in the focus chain (#130).
|
|
2108
|
+
await sessionHelper.sendKey(sessionName, 'Tab');
|
|
2109
|
+
await delay(200);
|
|
2252
2110
|
await sessionHelper.sendKey(sessionName, 'Tab');
|
|
2253
2111
|
await delay(300);
|
|
2254
2112
|
// Then Enter to dismiss any notification overlay and ensure
|
|
2255
2113
|
// the input is engaged. Enter on an empty `> ` prompt is a
|
|
2256
2114
|
// safe no-op (just shows a new blank prompt line).
|
|
2257
2115
|
await sessionHelper.sendEnter(sessionName);
|
|
2258
|
-
// Extra settling time after /compress to let Ink TUI stabilize
|
|
2259
|
-
await delay(compressDetected ? 1000 : 500);
|
|
2116
|
+
// Extra settling time after /compress or error state to let Ink TUI stabilize
|
|
2117
|
+
await delay((compressDetected || errorStateDetected) ? 1000 : 500);
|
|
2260
2118
|
}
|
|
2261
2119
|
// For Gemini CLI: detect and gently escape interactive modes before
|
|
2262
2120
|
// sending the message. Avoid Ctrl-C here — Gemini interprets it as
|
|
@@ -2289,6 +2147,50 @@ After checking in, just say "Ready for tasks" and wait for me to send you work.`
|
|
|
2289
2147
|
// border redraws that can cause length changes unrelated to delivery.
|
|
2290
2148
|
const beforeOutput = sessionHelper.capturePane(sessionName, 20);
|
|
2291
2149
|
const beforeLength = beforeOutput.length;
|
|
2150
|
+
// Deduplication guard (#128): Check if the agent is already
|
|
2151
|
+
// processing on ALL attempts (not just retries). A previous
|
|
2152
|
+
// write may have succeeded but verification failed. Re-writing
|
|
2153
|
+
// the same message creates a duplicate in the input buffer.
|
|
2154
|
+
{
|
|
2155
|
+
const preWriteCheck = sessionHelper.capturePane(sessionName);
|
|
2156
|
+
const hasSpinner = containsSpinnerOrWorkingIndicator(preWriteCheck);
|
|
2157
|
+
if (hasSpinner) {
|
|
2158
|
+
// Hash-based dedup: if the same message was recently sent
|
|
2159
|
+
// and the agent is processing, it's very likely our message.
|
|
2160
|
+
const msgHash = message.substring(0, 200);
|
|
2161
|
+
const lastSent = this.lastSentMessageHash.get(sessionName);
|
|
2162
|
+
const isRecentDuplicate = lastSent
|
|
2163
|
+
&& lastSent.hash === msgHash
|
|
2164
|
+
&& (Date.now() - lastSent.sentAt) < 60000;
|
|
2165
|
+
if (isRecentDuplicate || attempt > 1) {
|
|
2166
|
+
this.logger.info('Agent already processing — skipping write to prevent duplicate (#128)', {
|
|
2167
|
+
sessionName,
|
|
2168
|
+
attempt,
|
|
2169
|
+
isRecentDuplicate: !!isRecentDuplicate,
|
|
2170
|
+
});
|
|
2171
|
+
return true;
|
|
2172
|
+
}
|
|
2173
|
+
}
|
|
2174
|
+
// On retries: also check if agent is not at prompt AND our
|
|
2175
|
+
// message text is NOT stuck at the bottom.
|
|
2176
|
+
if (attempt > 1) {
|
|
2177
|
+
const notAtPrompt = !this.isClaudeAtPrompt(preWriteCheck, runtimeType);
|
|
2178
|
+
if (notAtPrompt) {
|
|
2179
|
+
const msgSnippet = (message.length > 20
|
|
2180
|
+
? message.substring(0, 80)
|
|
2181
|
+
: message).replace(/\s+/g, ' ').trim();
|
|
2182
|
+
const bottomLines = preWriteCheck.split('\n').slice(-10).join(' ').replace(/\s+/g, ' ');
|
|
2183
|
+
const textStuck = bottomLines.includes(msgSnippet);
|
|
2184
|
+
if (!textStuck) {
|
|
2185
|
+
this.logger.info('Agent not at prompt and message not stuck — skipping re-write (#128)', {
|
|
2186
|
+
sessionName,
|
|
2187
|
+
attempt,
|
|
2188
|
+
});
|
|
2189
|
+
return true;
|
|
2190
|
+
}
|
|
2191
|
+
}
|
|
2192
|
+
}
|
|
2193
|
+
}
|
|
2292
2194
|
// Use SessionCommandHelper.sendMessage() — proven two-step write:
|
|
2293
2195
|
// 1. session.write(message) — triggers bracketed paste
|
|
2294
2196
|
// 2. await delay(scaled) — waits for paste processing
|
|
@@ -2299,6 +2201,11 @@ After checking in, just say "Ready for tasks" and wait for me to send you work.`
|
|
|
2299
2201
|
// If progressive verification below misses an Enter drop, the
|
|
2300
2202
|
// background scanner will catch it within 30s.
|
|
2301
2203
|
this.trackSentMessage(sessionName, message);
|
|
2204
|
+
// Track message hash for deduplication on retry (#128)
|
|
2205
|
+
this.lastSentMessageHash.set(sessionName, {
|
|
2206
|
+
hash: message.substring(0, 200),
|
|
2207
|
+
sentAt: Date.now(),
|
|
2208
|
+
});
|
|
2302
2209
|
// Wait for agent to start processing, then verify delivery.
|
|
2303
2210
|
// TUI runtimes need a longer delay (3s) for the TUI to redraw
|
|
2304
2211
|
// and show processing indicators after accepting input.
|
|
@@ -2365,11 +2272,17 @@ After checking in, just say "Ready for tasks" and wait for me to send you work.`
|
|
|
2365
2272
|
: message).replace(/\s+/g, ' ').trim();
|
|
2366
2273
|
const promptBottomLines = currentOutput.split('\n').slice(-10).join(' ').replace(/\s+/g, ' ');
|
|
2367
2274
|
if (promptBottomLines.includes(promptMsgSnippet)) {
|
|
2368
|
-
this.logger.warn('At prompt with message text at bottom — pressing Enter', {
|
|
2275
|
+
this.logger.warn('At prompt with message text at bottom — pressing Tab+Enter', {
|
|
2369
2276
|
sessionName,
|
|
2370
2277
|
attempt,
|
|
2371
2278
|
intervalMs,
|
|
2372
2279
|
});
|
|
2280
|
+
// Tab restores Ink TUI focus before Enter — without this,
|
|
2281
|
+
// Enter may be consumed by the framework but not routed to
|
|
2282
|
+
// the input component if focus was lost during a re-render
|
|
2283
|
+
// (e.g., after stop hooks, state transitions).
|
|
2284
|
+
await sessionHelper.sendKey(sessionName, 'Tab');
|
|
2285
|
+
await delay(200);
|
|
2373
2286
|
await sessionHelper.sendEnter(sessionName);
|
|
2374
2287
|
await delay(500);
|
|
2375
2288
|
await sessionHelper.sendEnter(sessionName); // backup
|
|
@@ -2410,12 +2323,14 @@ After checking in, just say "Ready for tasks" and wait for me to send you work.`
|
|
|
2410
2323
|
// Message text is at the bottom of the terminal but the
|
|
2411
2324
|
// prompt is no longer in its idle form — Enter was dropped.
|
|
2412
2325
|
// 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', {
|
|
2326
|
+
// use Tab to restore TUI focus, then Enter to submit.
|
|
2327
|
+
this.logger.warn('Message text stuck at bottom — pressing Tab+Enter to recover', {
|
|
2415
2328
|
sessionName,
|
|
2416
2329
|
attempt,
|
|
2417
2330
|
intervalMs,
|
|
2418
2331
|
});
|
|
2332
|
+
await sessionHelper.sendKey(sessionName, 'Tab');
|
|
2333
|
+
await delay(200);
|
|
2419
2334
|
await sessionHelper.sendEnter(sessionName);
|
|
2420
2335
|
await delay(500);
|
|
2421
2336
|
await sessionHelper.sendEnter(sessionName); // backup Enter
|
|
@@ -2735,8 +2650,12 @@ After checking in, just say "Ready for tasks" and wait for me to send you work.`
|
|
|
2735
2650
|
*/
|
|
2736
2651
|
async recoverStuckTuiMessage(sessionName, message) {
|
|
2737
2652
|
const sessionHelper = await this.getSessionHelper();
|
|
2738
|
-
//
|
|
2739
|
-
|
|
2653
|
+
// Tab restores Ink TUI focus, then Enter to submit the stuck text.
|
|
2654
|
+
// Without Tab, Enter may be consumed by the framework but not routed
|
|
2655
|
+
// to the input component if focus was lost during a re-render.
|
|
2656
|
+
this.logger.info('Pressing Tab+Enter to recover stuck TUI message', { sessionName });
|
|
2657
|
+
await sessionHelper.sendKey(sessionName, 'Tab');
|
|
2658
|
+
await delay(200);
|
|
2740
2659
|
await sessionHelper.sendEnter(sessionName);
|
|
2741
2660
|
await delay(500);
|
|
2742
2661
|
// Double-tap: send a backup Enter in case the first was consumed
|
|
@@ -2850,11 +2769,13 @@ After checking in, just say "Ready for tasks" and wait for me to send you work.`
|
|
|
2850
2769
|
if (isPlaceholder) {
|
|
2851
2770
|
break;
|
|
2852
2771
|
}
|
|
2853
|
-
this.logger.warn('Background scan: text stuck at TUI prompt, pressing Enter', {
|
|
2772
|
+
this.logger.warn('Background scan: text stuck at TUI prompt, pressing Tab+Enter', {
|
|
2854
2773
|
sessionName,
|
|
2855
2774
|
promptContent: promptContent.slice(0, 80),
|
|
2856
2775
|
});
|
|
2857
|
-
//
|
|
2776
|
+
// Tab restores Ink TUI focus before Enter
|
|
2777
|
+
await sessionHelper.sendKey(sessionName, 'Tab');
|
|
2778
|
+
await delay(200);
|
|
2858
2779
|
await sessionHelper.sendEnter(sessionName);
|
|
2859
2780
|
await delay(500);
|
|
2860
2781
|
// Backup Enter
|
|
@@ -2890,11 +2811,14 @@ After checking in, just say "Ready for tasks" and wait for me to send you work.`
|
|
|
2890
2811
|
if (now - entry.sentAt < MIN_AGE_MS)
|
|
2891
2812
|
continue;
|
|
2892
2813
|
if (bottomText.includes(entry.snippet)) {
|
|
2893
|
-
this.logger.warn('Background scan: tracked message stuck, pressing Enter', {
|
|
2814
|
+
this.logger.warn('Background scan: tracked message stuck, pressing Tab+Enter', {
|
|
2894
2815
|
sessionName,
|
|
2895
2816
|
snippet: entry.snippet.slice(0, 50),
|
|
2896
2817
|
ageMs: now - entry.sentAt,
|
|
2897
2818
|
});
|
|
2819
|
+
// Tab restores Ink TUI focus before Enter
|
|
2820
|
+
await sessionHelper.sendKey(sessionName, 'Tab');
|
|
2821
|
+
await delay(200);
|
|
2898
2822
|
await sessionHelper.sendEnter(sessionName);
|
|
2899
2823
|
await delay(500);
|
|
2900
2824
|
await sessionHelper.sendEnter(sessionName); // backup
|