crewly 1.2.1 → 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/architect/prompt.md +7 -5
- package/config/roles/backend-developer/prompt.md +8 -4
- package/config/roles/content-strategist/prompt.md +12 -4
- package/config/roles/designer/prompt.md +8 -4
- package/config/roles/developer/prompt.md +7 -4
- package/config/roles/frontend-developer/prompt.md +8 -4
- package/config/roles/fullstack-dev/prompt.md +8 -4
- package/config/roles/generalist/prompt.md +7 -4
- package/config/roles/ops/prompt.md +7 -4
- package/config/roles/orchestrator/prompt.md +52 -3
- package/config/roles/product-manager/prompt.md +8 -4
- package/config/roles/qa/prompt.md +8 -4
- package/config/roles/qa-engineer/prompt.md +8 -4
- package/config/roles/sales/prompt.md +8 -4
- package/config/roles/support/prompt.md +8 -4
- 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/roles/tpm/prompt.md +8 -4
- 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 +76 -11
- 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/agent-claude-md.md +10 -5
- 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 +310 -84
- package/dist/backend/backend/src/constants.d.ts.map +1 -1
- package/dist/backend/backend/src/constants.js +303 -89
- 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 +86 -26
- 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 +3 -19
- 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 +274 -398
- 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 +2 -1
- 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 +38 -51
- 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 -7
- 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 -31
- 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 +28 -4
- 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 +113 -60
- 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 -8
- 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/pty/pty-session-backend.js +1 -1
- package/dist/backend/backend/src/services/session/pty/pty-session-backend.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 +70 -4
- 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-output.utils.d.ts +2 -1
- package/dist/backend/backend/src/utils/terminal-output.utils.d.ts.map +1 -1
- package/dist/backend/backend/src/utils/terminal-output.utils.js +2 -28
- package/dist/backend/backend/src/utils/terminal-output.utils.js.map +1 -1
- package/dist/backend/backend/src/utils/terminal-string-ops.d.ts +183 -0
- package/dist/backend/backend/src/utils/terminal-string-ops.d.ts.map +1 -0
- package/dist/backend/backend/src/utils/terminal-string-ops.js +726 -0
- package/dist/backend/backend/src/utils/terminal-string-ops.js.map +1 -0
- package/dist/backend/backend/src/websocket/terminal.gateway.d.ts.map +1 -1
- package/dist/backend/backend/src/websocket/terminal.gateway.js +22 -27
- package/dist/backend/backend/src/websocket/terminal.gateway.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 +310 -84
- package/dist/cli/backend/src/constants.d.ts.map +1 -1
- package/dist/cli/backend/src/constants.js +303 -89
- 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-output.utils.d.ts +2 -1
- package/dist/cli/backend/src/utils/terminal-output.utils.d.ts.map +1 -1
- package/dist/cli/backend/src/utils/terminal-output.utils.js +2 -28
- package/dist/cli/backend/src/utils/terminal-output.utils.js.map +1 -1
- package/dist/cli/backend/src/utils/terminal-string-ops.d.ts +183 -0
- package/dist/cli/backend/src/utils/terminal-string-ops.d.ts.map +1 -0
- package/dist/cli/backend/src/utils/terminal-string-ops.js +726 -0
- package/dist/cli/backend/src/utils/terminal-string-ops.js.map +1 -0
- 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
|
@@ -0,0 +1,93 @@
|
|
|
1
|
+
# Handle Failure
|
|
2
|
+
|
|
3
|
+
Decides the next action when a worker task fails verification or execution. Implements a three-tier decision logic: retry, reassign, or escalate.
|
|
4
|
+
|
|
5
|
+
## When to Use
|
|
6
|
+
|
|
7
|
+
- When `verify-output` returns `passed: false`
|
|
8
|
+
- When a worker reports a `blocked` status
|
|
9
|
+
- When a worker session crashes or becomes unresponsive
|
|
10
|
+
|
|
11
|
+
## Usage
|
|
12
|
+
|
|
13
|
+
```bash
|
|
14
|
+
bash {{SKILLS_PATH}}/team-leader/handle-failure/execute.sh '{"workerId":"worker-1","workerSession":"worker-session","teamId":"team-123","failureInfo":{"error":"3 tests failed","failedSteps":["tests"],"retries":0,"failureType":"verification"},"requiredRole":"developer"}'
|
|
15
|
+
```
|
|
16
|
+
|
|
17
|
+
## Parameters
|
|
18
|
+
|
|
19
|
+
| Parameter | Required | Description |
|
|
20
|
+
|-----------|----------|-------------|
|
|
21
|
+
| `workerId` | Yes | ID of the failed worker |
|
|
22
|
+
| `workerSession` | No | Session name of the failed worker |
|
|
23
|
+
| `teamId` | No | Team ID (needed for reassignment lookup) |
|
|
24
|
+
| `requiredRole` | No | Role required for the task (helps find alternatives) |
|
|
25
|
+
| `taskDescription` | No | Brief task description for context |
|
|
26
|
+
| `failureInfo` | Yes | Failure details object (see below) |
|
|
27
|
+
|
|
28
|
+
### failureInfo Object
|
|
29
|
+
|
|
30
|
+
| Field | Description |
|
|
31
|
+
|-------|-------------|
|
|
32
|
+
| `error` | Error message or description |
|
|
33
|
+
| `failedSteps` | Array of failed verification step names |
|
|
34
|
+
| `retries` | Number of retries already attempted |
|
|
35
|
+
| `failureType` | Category of failure (see below) |
|
|
36
|
+
|
|
37
|
+
### Failure Types
|
|
38
|
+
|
|
39
|
+
| Type | Description | Default Action |
|
|
40
|
+
|------|-------------|----------------|
|
|
41
|
+
| `verification` | Verification checks failed | Retry (< 2 retries) |
|
|
42
|
+
| `format` | Output format issues | Retry |
|
|
43
|
+
| `test_failure` | Tests failed | Retry |
|
|
44
|
+
| `pty_error` | PTY session error | Retry |
|
|
45
|
+
| `session_error` | Session crashed | Retry |
|
|
46
|
+
| `skill_mismatch` | Worker lacks required skills | Reassign |
|
|
47
|
+
| `resource_error` | Resource unavailable | Escalate |
|
|
48
|
+
| `permission_error` | Permission denied | Escalate |
|
|
49
|
+
| `budget_error` | Token/API budget exceeded | Escalate |
|
|
50
|
+
|
|
51
|
+
## Decision Logic
|
|
52
|
+
|
|
53
|
+
```
|
|
54
|
+
1. retries < 2 AND recoverable failure → RETRY
|
|
55
|
+
(verification, format, test_failure, pty_error, session_error, unknown)
|
|
56
|
+
|
|
57
|
+
2. retries >= 2 OR skill_mismatch → REASSIGN
|
|
58
|
+
- Searches team for another active worker with matching role
|
|
59
|
+
- If no alternative found → ESCALATE
|
|
60
|
+
|
|
61
|
+
3. resource/permission/budget error → ESCALATE immediately
|
|
62
|
+
(These cannot be resolved at the TL level)
|
|
63
|
+
```
|
|
64
|
+
|
|
65
|
+
## Output
|
|
66
|
+
|
|
67
|
+
```json
|
|
68
|
+
{
|
|
69
|
+
"action": "retry",
|
|
70
|
+
"nextWorkerId": null,
|
|
71
|
+
"nextWorkerSession": null,
|
|
72
|
+
"instructions": "Retry attempt 1/2. Previous failure: 3 tests failed. Please fix the issues and try again.",
|
|
73
|
+
"context": {
|
|
74
|
+
"originalWorkerId": "worker-1",
|
|
75
|
+
"failureType": "verification",
|
|
76
|
+
"retriesSoFar": 0
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
```
|
|
80
|
+
|
|
81
|
+
## After Getting the Decision
|
|
82
|
+
|
|
83
|
+
| Action | Next Step |
|
|
84
|
+
|--------|-----------|
|
|
85
|
+
| `retry` | Send instructions to the original worker via `delegate-task` with incremented retry count |
|
|
86
|
+
| `reassign` | Use `delegate-task` to send the task to `nextWorkerId`/`nextWorkerSession` |
|
|
87
|
+
| `escalate` | Report to Orchestrator via `report-status` with the failure details |
|
|
88
|
+
|
|
89
|
+
## Related Skills
|
|
90
|
+
|
|
91
|
+
- `verify-output` — Triggers handle-failure when verification fails
|
|
92
|
+
- `delegate-task` — Used for retry and reassign actions
|
|
93
|
+
- `aggregate-results` — Include failure handling in reports
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
{
|
|
2
|
+
"id": "tl-handle-failure",
|
|
3
|
+
"name": "Handle Failure",
|
|
4
|
+
"description": "Decide the next action when a worker task fails verification or execution: retry the same worker, reassign to another worker, or escalate to the Orchestrator.",
|
|
5
|
+
"category": "management",
|
|
6
|
+
"skillType": "claude-skill",
|
|
7
|
+
"promptFile": "instructions.md",
|
|
8
|
+
"execution": {
|
|
9
|
+
"type": "script",
|
|
10
|
+
"script": {
|
|
11
|
+
"file": "execute.sh",
|
|
12
|
+
"interpreter": "bash",
|
|
13
|
+
"timeoutMs": 30000
|
|
14
|
+
}
|
|
15
|
+
},
|
|
16
|
+
"assignableRoles": ["team-leader"],
|
|
17
|
+
"triggers": ["handle failure", "task failed", "worker error", "decide next action"],
|
|
18
|
+
"tags": ["failure", "recovery", "retry", "escalation", "management"],
|
|
19
|
+
"version": "1.0.0"
|
|
20
|
+
}
|
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
#!/bin/bash
|
|
2
|
+
# Schedule a future check-in reminder (Team Leader version).
|
|
3
|
+
# Validates that the target is self or a subordinate worker.
|
|
4
|
+
set -euo pipefail
|
|
5
|
+
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
|
|
6
|
+
source "${SCRIPT_DIR}/../_common/lib.sh"
|
|
7
|
+
|
|
8
|
+
INPUT="${1:-}"
|
|
9
|
+
[ -z "$INPUT" ] && error_exit "Usage: execute.sh '{\"minutes\":5,\"message\":\"Check worker progress\",\"teamId\":\"team-123\",\"tlMemberId\":\"tl-id\",\"sessionName\":\"my-session\"}'"
|
|
10
|
+
|
|
11
|
+
MINUTES=$(echo "$INPUT" | jq -r '.minutes // empty')
|
|
12
|
+
MESSAGE=$(echo "$INPUT" | jq -r '.message // empty')
|
|
13
|
+
TARGET=$(echo "$INPUT" | jq -r '.target // empty')
|
|
14
|
+
RECURRING=$(echo "$INPUT" | jq -r '.recurring // false')
|
|
15
|
+
MAX_OCCURRENCES=$(echo "$INPUT" | jq -r '.maxOccurrences // empty')
|
|
16
|
+
TEAM_ID=$(echo "$INPUT" | jq -r '.teamId // empty')
|
|
17
|
+
TL_MEMBER_ID=$(echo "$INPUT" | jq -r '.tlMemberId // empty')
|
|
18
|
+
# sessionName: explicit caller identity, used as fallback when CREWLY_SESSION_NAME is not set
|
|
19
|
+
SESSION_NAME=$(echo "$INPUT" | jq -r '.sessionName // empty')
|
|
20
|
+
require_param "minutes" "$MINUTES"
|
|
21
|
+
require_param "message" "$MESSAGE"
|
|
22
|
+
|
|
23
|
+
# Resolve caller identity: env var > input param
|
|
24
|
+
CALLER_SESSION="${CREWLY_SESSION_NAME:-${SESSION_NAME}}"
|
|
25
|
+
|
|
26
|
+
# Default target to the caller's own session when not specified
|
|
27
|
+
TARGET_SESSION="${TARGET:-${CALLER_SESSION}}"
|
|
28
|
+
[ -z "$TARGET_SESSION" ] && error_exit "No target session specified and CREWLY_SESSION_NAME not set. Pass sessionName in input."
|
|
29
|
+
|
|
30
|
+
# Validate hierarchy: only when targeting a different session (not self)
|
|
31
|
+
if [ -n "$TARGET_SESSION" ] && [ "$TARGET_SESSION" != "$CALLER_SESSION" ]; then
|
|
32
|
+
if [ -n "$TEAM_ID" ] && [ -n "$TL_MEMBER_ID" ]; then
|
|
33
|
+
TEAM_DATA=$(api_call GET "/teams/${TEAM_ID}" 2>/dev/null || echo '{}')
|
|
34
|
+
TEAM_SUCCESS=$(echo "$TEAM_DATA" | jq -r '.success // false' 2>/dev/null || echo "false")
|
|
35
|
+
|
|
36
|
+
if [ "$TEAM_SUCCESS" = "true" ]; then
|
|
37
|
+
WORKER_PARENT=$(echo "$TEAM_DATA" | jq -r --arg session "$TARGET_SESSION" \
|
|
38
|
+
'.data.members[] | select(.sessionName == $session) | .parentMemberId // empty' 2>/dev/null || true)
|
|
39
|
+
|
|
40
|
+
if [ -z "$WORKER_PARENT" ]; then
|
|
41
|
+
error_exit "Hierarchy violation: target ${TARGET_SESSION} is not a member of team ${TEAM_ID}"
|
|
42
|
+
fi
|
|
43
|
+
|
|
44
|
+
if [ "$WORKER_PARENT" != "$TL_MEMBER_ID" ]; then
|
|
45
|
+
error_exit "Hierarchy violation: target ${TARGET_SESSION} (parentMemberId=${WORKER_PARENT}) is not a subordinate of TL ${TL_MEMBER_ID}"
|
|
46
|
+
fi
|
|
47
|
+
fi
|
|
48
|
+
else
|
|
49
|
+
error_exit "teamId and tlMemberId are required when scheduling checks for other sessions"
|
|
50
|
+
fi
|
|
51
|
+
fi
|
|
52
|
+
|
|
53
|
+
# Build API request body
|
|
54
|
+
if [ "$RECURRING" = "true" ]; then
|
|
55
|
+
BODY=$(jq -n --arg target "$TARGET_SESSION" --arg minutes "$MINUTES" --arg message "$MESSAGE" \
|
|
56
|
+
'{targetSession: $target, minutes: ($minutes | tonumber), intervalMinutes: ($minutes | tonumber), message: $message, isRecurring: true}')
|
|
57
|
+
if [ -n "$MAX_OCCURRENCES" ]; then
|
|
58
|
+
BODY=$(echo "$BODY" | jq --arg max "$MAX_OCCURRENCES" '. + {maxOccurrences: ($max | tonumber)}')
|
|
59
|
+
fi
|
|
60
|
+
else
|
|
61
|
+
BODY=$(jq -n --arg target "$TARGET_SESSION" --arg minutes "$MINUTES" --arg message "$MESSAGE" \
|
|
62
|
+
'{targetSession: $target, minutes: ($minutes | tonumber), message: $message}')
|
|
63
|
+
fi
|
|
64
|
+
|
|
65
|
+
api_call POST "/schedule" "$BODY"
|
|
@@ -0,0 +1,247 @@
|
|
|
1
|
+
#!/bin/bash
|
|
2
|
+
# Tests for TL schedule-check execute.sh
|
|
3
|
+
# Covers: self-scheduling, worker scheduling, hierarchy violation, missing params
|
|
4
|
+
set -euo pipefail
|
|
5
|
+
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
|
|
6
|
+
EXECUTE="$SCRIPT_DIR/execute.sh"
|
|
7
|
+
PASS=0
|
|
8
|
+
FAIL=0
|
|
9
|
+
|
|
10
|
+
assert_succeeds() {
|
|
11
|
+
local desc="$1"
|
|
12
|
+
shift
|
|
13
|
+
if OUTPUT=$("$@" 2>&1); then
|
|
14
|
+
echo " PASS: $desc"
|
|
15
|
+
PASS=$((PASS + 1))
|
|
16
|
+
else
|
|
17
|
+
echo " FAIL: $desc (expected success, got exit $? — output: $OUTPUT)"
|
|
18
|
+
FAIL=$((FAIL + 1))
|
|
19
|
+
fi
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
assert_fails() {
|
|
23
|
+
local desc="$1"
|
|
24
|
+
shift
|
|
25
|
+
if OUTPUT=$("$@" 2>&1); then
|
|
26
|
+
echo " FAIL: $desc (expected failure, got success — output: $OUTPUT)"
|
|
27
|
+
FAIL=$((FAIL + 1))
|
|
28
|
+
else
|
|
29
|
+
echo " PASS: $desc"
|
|
30
|
+
PASS=$((PASS + 1))
|
|
31
|
+
fi
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
assert_fails_with() {
|
|
35
|
+
local desc="$1" expected_msg="$2"
|
|
36
|
+
shift 2
|
|
37
|
+
local OUTPUT=""
|
|
38
|
+
if OUTPUT=$("$@" 2>&1); then
|
|
39
|
+
echo " FAIL: $desc (expected failure, got success)"
|
|
40
|
+
FAIL=$((FAIL + 1))
|
|
41
|
+
elif echo "$OUTPUT" | grep -q "$expected_msg"; then
|
|
42
|
+
echo " PASS: $desc"
|
|
43
|
+
PASS=$((PASS + 1))
|
|
44
|
+
else
|
|
45
|
+
echo " FAIL: $desc (expected '$expected_msg' in output, got: $OUTPUT)"
|
|
46
|
+
FAIL=$((FAIL + 1))
|
|
47
|
+
fi
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
# Create a mock wrapper that overrides api_call to avoid real HTTP calls.
|
|
51
|
+
# The mock returns team data with known members for hierarchy testing.
|
|
52
|
+
MOCK_DIR=$(mktemp -d)
|
|
53
|
+
MOCK_SCRIPT="$MOCK_DIR/run_schedule_check.sh"
|
|
54
|
+
cat > "$MOCK_SCRIPT" << 'MOCK_EOF'
|
|
55
|
+
#!/bin/bash
|
|
56
|
+
# Mock wrapper for schedule-check execute.sh
|
|
57
|
+
# Overrides api_call to return controlled responses
|
|
58
|
+
set -euo pipefail
|
|
59
|
+
SCRIPT_DIR_INNER="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
|
|
60
|
+
|
|
61
|
+
# Load the real shared lib first to get require_param, error_exit, etc.
|
|
62
|
+
REAL_SKILL_DIR="$1"
|
|
63
|
+
shift
|
|
64
|
+
source "${REAL_SKILL_DIR}/../_common/lib.sh"
|
|
65
|
+
|
|
66
|
+
# Override api_call with mock
|
|
67
|
+
api_call() {
|
|
68
|
+
local method="$1" endpoint="$2" body="${3:-}"
|
|
69
|
+
|
|
70
|
+
if [ "$method" = "GET" ] && echo "$endpoint" | grep -q "^/teams/"; then
|
|
71
|
+
# Return mock team data with known hierarchy:
|
|
72
|
+
# TL: ella-tl (member-id: tl-001, sessionName: crewly-marketing-ella-abc123)
|
|
73
|
+
# Worker: mila-worker (member-id: worker-001, sessionName: crewly-marketing-mila-def456, parent: tl-001)
|
|
74
|
+
cat << 'TEAMJSON'
|
|
75
|
+
{"success":true,"data":{"id":"team-123","name":"Marketing","members":[{"id":"tl-001","sessionName":"crewly-marketing-ella-abc123","role":"team-leader","parentMemberId":""},{"id":"worker-001","sessionName":"crewly-marketing-mila-def456","role":"developer","parentMemberId":"tl-001"},{"id":"worker-002","sessionName":"crewly-marketing-luna-ghi789","role":"developer","parentMemberId":"other-tl"}]}}
|
|
76
|
+
TEAMJSON
|
|
77
|
+
return 0
|
|
78
|
+
fi
|
|
79
|
+
|
|
80
|
+
if [ "$method" = "POST" ] && [ "$endpoint" = "/schedule" ]; then
|
|
81
|
+
echo '{"success":true,"data":{"checkId":"mock-check-id-001"},"message":"Check-in scheduled successfully"}'
|
|
82
|
+
return 0
|
|
83
|
+
fi
|
|
84
|
+
|
|
85
|
+
echo '{"error":true,"status":404,"details":"Unknown endpoint"}' >&2
|
|
86
|
+
return 1
|
|
87
|
+
}
|
|
88
|
+
|
|
89
|
+
# Now source and execute the main script logic inline
|
|
90
|
+
# (We can't just call execute.sh because it sources lib.sh again which would
|
|
91
|
+
# override our mock. Instead, we replicate the sourcing chain.)
|
|
92
|
+
INPUT="${1:-}"
|
|
93
|
+
[ -z "$INPUT" ] && error_exit "Usage: execute.sh '{...}'"
|
|
94
|
+
|
|
95
|
+
MINUTES=$(echo "$INPUT" | jq -r '.minutes // empty')
|
|
96
|
+
MESSAGE=$(echo "$INPUT" | jq -r '.message // empty')
|
|
97
|
+
TARGET=$(echo "$INPUT" | jq -r '.target // empty')
|
|
98
|
+
RECURRING=$(echo "$INPUT" | jq -r '.recurring // false')
|
|
99
|
+
MAX_OCCURRENCES=$(echo "$INPUT" | jq -r '.maxOccurrences // empty')
|
|
100
|
+
TEAM_ID=$(echo "$INPUT" | jq -r '.teamId // empty')
|
|
101
|
+
TL_MEMBER_ID=$(echo "$INPUT" | jq -r '.tlMemberId // empty')
|
|
102
|
+
SESSION_NAME=$(echo "$INPUT" | jq -r '.sessionName // empty')
|
|
103
|
+
require_param "minutes" "$MINUTES"
|
|
104
|
+
require_param "message" "$MESSAGE"
|
|
105
|
+
|
|
106
|
+
CALLER_SESSION="${CREWLY_SESSION_NAME:-${SESSION_NAME}}"
|
|
107
|
+
TARGET_SESSION="${TARGET:-${CALLER_SESSION}}"
|
|
108
|
+
[ -z "$TARGET_SESSION" ] && error_exit "No target session specified and CREWLY_SESSION_NAME not set. Pass sessionName in input."
|
|
109
|
+
|
|
110
|
+
if [ -n "$TARGET_SESSION" ] && [ "$TARGET_SESSION" != "$CALLER_SESSION" ]; then
|
|
111
|
+
if [ -n "$TEAM_ID" ] && [ -n "$TL_MEMBER_ID" ]; then
|
|
112
|
+
TEAM_DATA=$(api_call GET "/teams/${TEAM_ID}" 2>/dev/null || echo '{}')
|
|
113
|
+
TEAM_SUCCESS=$(echo "$TEAM_DATA" | jq -r '.success // false' 2>/dev/null || echo "false")
|
|
114
|
+
|
|
115
|
+
if [ "$TEAM_SUCCESS" = "true" ]; then
|
|
116
|
+
WORKER_PARENT=$(echo "$TEAM_DATA" | jq -r --arg session "$TARGET_SESSION" \
|
|
117
|
+
'.data.members[] | select(.sessionName == $session) | .parentMemberId // empty' 2>/dev/null || true)
|
|
118
|
+
|
|
119
|
+
if [ -z "$WORKER_PARENT" ]; then
|
|
120
|
+
error_exit "Hierarchy violation: target ${TARGET_SESSION} is not a member of team ${TEAM_ID}"
|
|
121
|
+
fi
|
|
122
|
+
|
|
123
|
+
if [ "$WORKER_PARENT" != "$TL_MEMBER_ID" ]; then
|
|
124
|
+
error_exit "Hierarchy violation: target ${TARGET_SESSION} (parentMemberId=${WORKER_PARENT}) is not a subordinate of TL ${TL_MEMBER_ID}"
|
|
125
|
+
fi
|
|
126
|
+
fi
|
|
127
|
+
else
|
|
128
|
+
error_exit "teamId and tlMemberId are required when scheduling checks for other sessions"
|
|
129
|
+
fi
|
|
130
|
+
fi
|
|
131
|
+
|
|
132
|
+
if [ "$RECURRING" = "true" ]; then
|
|
133
|
+
BODY=$(jq -n --arg target "$TARGET_SESSION" --arg minutes "$MINUTES" --arg message "$MESSAGE" \
|
|
134
|
+
'{targetSession: $target, minutes: ($minutes | tonumber), intervalMinutes: ($minutes | tonumber), message: $message, isRecurring: true}')
|
|
135
|
+
if [ -n "$MAX_OCCURRENCES" ]; then
|
|
136
|
+
BODY=$(echo "$BODY" | jq --arg max "$MAX_OCCURRENCES" '. + {maxOccurrences: ($max | tonumber)}')
|
|
137
|
+
fi
|
|
138
|
+
else
|
|
139
|
+
BODY=$(jq -n --arg target "$TARGET_SESSION" --arg minutes "$MINUTES" --arg message "$MESSAGE" \
|
|
140
|
+
'{targetSession: $target, minutes: ($minutes | tonumber), message: $message}')
|
|
141
|
+
fi
|
|
142
|
+
|
|
143
|
+
api_call POST "/schedule" "$BODY"
|
|
144
|
+
MOCK_EOF
|
|
145
|
+
chmod +x "$MOCK_SCRIPT"
|
|
146
|
+
|
|
147
|
+
SKILL_DIR="$SCRIPT_DIR"
|
|
148
|
+
|
|
149
|
+
echo "=== TL schedule-check tests ==="
|
|
150
|
+
|
|
151
|
+
# -----------------------------------------------------------------------
|
|
152
|
+
# Scenario 1: TL schedules self-check using sessionName param
|
|
153
|
+
# (CREWLY_SESSION_NAME not set — Gemini CLI scenario)
|
|
154
|
+
# -----------------------------------------------------------------------
|
|
155
|
+
echo "Scenario 1: TL self-check via sessionName param (no env var)"
|
|
156
|
+
assert_succeeds "self-check with sessionName, no CREWLY_SESSION_NAME" \
|
|
157
|
+
env -u CREWLY_SESSION_NAME bash "$MOCK_SCRIPT" "$SKILL_DIR" \
|
|
158
|
+
'{"minutes":15,"message":"Follow up on progress","sessionName":"crewly-marketing-ella-abc123"}'
|
|
159
|
+
|
|
160
|
+
# -----------------------------------------------------------------------
|
|
161
|
+
# Scenario 2: TL schedules self-check using CREWLY_SESSION_NAME env var
|
|
162
|
+
# -----------------------------------------------------------------------
|
|
163
|
+
echo "Scenario 2: TL self-check via CREWLY_SESSION_NAME env var"
|
|
164
|
+
assert_succeeds "self-check with CREWLY_SESSION_NAME set" \
|
|
165
|
+
env CREWLY_SESSION_NAME="crewly-marketing-ella-abc123" bash "$MOCK_SCRIPT" "$SKILL_DIR" \
|
|
166
|
+
'{"minutes":15,"message":"Follow up on progress"}'
|
|
167
|
+
|
|
168
|
+
# -----------------------------------------------------------------------
|
|
169
|
+
# Scenario 3: TL schedules self-check with explicit target = self session
|
|
170
|
+
# -----------------------------------------------------------------------
|
|
171
|
+
echo "Scenario 3: TL self-check with explicit target = own session"
|
|
172
|
+
assert_succeeds "self-check with explicit target matching sessionName" \
|
|
173
|
+
env -u CREWLY_SESSION_NAME bash "$MOCK_SCRIPT" "$SKILL_DIR" \
|
|
174
|
+
'{"minutes":15,"message":"Follow up","sessionName":"crewly-marketing-ella-abc123","target":"crewly-marketing-ella-abc123"}'
|
|
175
|
+
|
|
176
|
+
# -----------------------------------------------------------------------
|
|
177
|
+
# Scenario 4: TL schedules worker check — valid subordinate
|
|
178
|
+
# -----------------------------------------------------------------------
|
|
179
|
+
echo "Scenario 4: TL schedules check on valid subordinate"
|
|
180
|
+
assert_succeeds "worker check on subordinate mila" \
|
|
181
|
+
env -u CREWLY_SESSION_NAME bash "$MOCK_SCRIPT" "$SKILL_DIR" \
|
|
182
|
+
'{"minutes":10,"message":"Check mila progress","sessionName":"crewly-marketing-ella-abc123","target":"crewly-marketing-mila-def456","teamId":"team-123","tlMemberId":"tl-001"}'
|
|
183
|
+
|
|
184
|
+
# -----------------------------------------------------------------------
|
|
185
|
+
# Scenario 5: TL targets non-subordinate — hierarchy violation
|
|
186
|
+
# -----------------------------------------------------------------------
|
|
187
|
+
echo "Scenario 5: TL targets non-subordinate worker"
|
|
188
|
+
assert_fails_with "hierarchy violation on non-subordinate luna" "Hierarchy violation" \
|
|
189
|
+
env -u CREWLY_SESSION_NAME bash "$MOCK_SCRIPT" "$SKILL_DIR" \
|
|
190
|
+
'{"minutes":10,"message":"Check luna","sessionName":"crewly-marketing-ella-abc123","target":"crewly-marketing-luna-ghi789","teamId":"team-123","tlMemberId":"tl-001"}'
|
|
191
|
+
|
|
192
|
+
# -----------------------------------------------------------------------
|
|
193
|
+
# Scenario 6: TL targets unknown session — not a member
|
|
194
|
+
# -----------------------------------------------------------------------
|
|
195
|
+
echo "Scenario 6: TL targets unknown session"
|
|
196
|
+
assert_fails_with "hierarchy violation on unknown target" "Hierarchy violation" \
|
|
197
|
+
env -u CREWLY_SESSION_NAME bash "$MOCK_SCRIPT" "$SKILL_DIR" \
|
|
198
|
+
'{"minutes":10,"message":"Check unknown","sessionName":"crewly-marketing-ella-abc123","target":"crewly-unknown-agent","teamId":"team-123","tlMemberId":"tl-001"}'
|
|
199
|
+
|
|
200
|
+
# -----------------------------------------------------------------------
|
|
201
|
+
# Scenario 7: TL targets other session without teamId — error
|
|
202
|
+
# -----------------------------------------------------------------------
|
|
203
|
+
echo "Scenario 7: Missing teamId/tlMemberId for other-session target"
|
|
204
|
+
assert_fails_with "requires teamId and tlMemberId" "teamId and tlMemberId are required" \
|
|
205
|
+
env -u CREWLY_SESSION_NAME bash "$MOCK_SCRIPT" "$SKILL_DIR" \
|
|
206
|
+
'{"minutes":10,"message":"Check worker","sessionName":"crewly-marketing-ella-abc123","target":"crewly-marketing-mila-def456"}'
|
|
207
|
+
|
|
208
|
+
# -----------------------------------------------------------------------
|
|
209
|
+
# Scenario 8: No session identity at all — should fail
|
|
210
|
+
# -----------------------------------------------------------------------
|
|
211
|
+
echo "Scenario 8: No session identity (no env, no sessionName, no target)"
|
|
212
|
+
assert_fails_with "fails without any session identity" "No target session specified" \
|
|
213
|
+
env -u CREWLY_SESSION_NAME bash "$MOCK_SCRIPT" "$SKILL_DIR" \
|
|
214
|
+
'{"minutes":10,"message":"Check something"}'
|
|
215
|
+
|
|
216
|
+
# -----------------------------------------------------------------------
|
|
217
|
+
# Scenario 9: Missing required params
|
|
218
|
+
# -----------------------------------------------------------------------
|
|
219
|
+
echo "Scenario 9: Missing required params"
|
|
220
|
+
assert_fails "fails on missing minutes" \
|
|
221
|
+
env -u CREWLY_SESSION_NAME bash "$MOCK_SCRIPT" "$SKILL_DIR" \
|
|
222
|
+
'{"message":"Check","sessionName":"ella"}'
|
|
223
|
+
|
|
224
|
+
assert_fails "fails on missing message" \
|
|
225
|
+
env -u CREWLY_SESSION_NAME bash "$MOCK_SCRIPT" "$SKILL_DIR" \
|
|
226
|
+
'{"minutes":10,"sessionName":"ella"}'
|
|
227
|
+
|
|
228
|
+
# -----------------------------------------------------------------------
|
|
229
|
+
# Scenario 10: Recurring check self-scheduling
|
|
230
|
+
# -----------------------------------------------------------------------
|
|
231
|
+
echo "Scenario 10: Recurring self-check"
|
|
232
|
+
OUTPUT=$(env -u CREWLY_SESSION_NAME bash "$MOCK_SCRIPT" "$SKILL_DIR" \
|
|
233
|
+
'{"minutes":15,"message":"Recurring follow up","sessionName":"crewly-marketing-ella-abc123","recurring":true}')
|
|
234
|
+
if echo "$OUTPUT" | jq -e '.success' > /dev/null 2>&1; then
|
|
235
|
+
echo " PASS: recurring self-check succeeds"
|
|
236
|
+
PASS=$((PASS + 1))
|
|
237
|
+
else
|
|
238
|
+
echo " FAIL: recurring self-check failed (output: $OUTPUT)"
|
|
239
|
+
FAIL=$((FAIL + 1))
|
|
240
|
+
fi
|
|
241
|
+
|
|
242
|
+
# Cleanup
|
|
243
|
+
rm -rf "$MOCK_DIR"
|
|
244
|
+
|
|
245
|
+
echo ""
|
|
246
|
+
echo "Results: $PASS passed, $FAIL failed"
|
|
247
|
+
[ "$FAIL" -eq 0 ] && exit 0 || exit 1
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
# Schedule Check (Team Leader)
|
|
2
|
+
|
|
3
|
+
Schedule a future check-in reminder. Unlike the orchestrator version, this skill enforces hierarchy — you can only schedule checks targeting yourself or your subordinate workers.
|
|
4
|
+
|
|
5
|
+
## Usage
|
|
6
|
+
|
|
7
|
+
### Self-reminder (default target)
|
|
8
|
+
```bash
|
|
9
|
+
bash config/skills/team-leader/schedule-check/execute.sh '{"minutes":5,"message":"Check worker progress on feature X","sessionName":"my-session-name"}'
|
|
10
|
+
```
|
|
11
|
+
|
|
12
|
+
### Target a specific subordinate
|
|
13
|
+
```bash
|
|
14
|
+
bash config/skills/team-leader/schedule-check/execute.sh '{"minutes":10,"message":"Status update needed","target":"worker-session-name","teamId":"team-123","tlMemberId":"tl-member-id"}'
|
|
15
|
+
```
|
|
16
|
+
|
|
17
|
+
### Recurring check
|
|
18
|
+
```bash
|
|
19
|
+
bash config/skills/team-leader/schedule-check/execute.sh '{"minutes":10,"message":"Periodic progress check","recurring":true,"maxOccurrences":6}'
|
|
20
|
+
```
|
|
21
|
+
|
|
22
|
+
## Parameters
|
|
23
|
+
|
|
24
|
+
| Parameter | Required | Description |
|
|
25
|
+
|-----------|----------|-------------|
|
|
26
|
+
| `minutes` | Yes | Delay in minutes before the check fires |
|
|
27
|
+
| `message` | Yes | Reminder message text |
|
|
28
|
+
| `target` | No | Target session name (defaults to self). Must be self or a subordinate |
|
|
29
|
+
| `sessionName` | No | Caller's own session name. Used as fallback when `CREWLY_SESSION_NAME` env var is not set (e.g. Gemini CLI) |
|
|
30
|
+
| `recurring` | No | When `true`, the check repeats every `minutes` interval (default: `false`) |
|
|
31
|
+
| `maxOccurrences` | No | Max times a recurring check fires (default: unlimited). Only for `recurring: true` |
|
|
32
|
+
| `teamId` | Conditional | Required when targeting a subordinate (for hierarchy validation) |
|
|
33
|
+
| `tlMemberId` | Conditional | Required when targeting a subordinate (your member ID for hierarchy validation) |
|
|
34
|
+
|
|
35
|
+
## Hierarchy Rules
|
|
36
|
+
|
|
37
|
+
- **Self target**: Always allowed — no `teamId`/`tlMemberId` needed. Pass `sessionName` if `CREWLY_SESSION_NAME` env var is not available
|
|
38
|
+
- **Subordinate target**: Requires `teamId` and `tlMemberId`. The script verifies the target's `parentMemberId` matches your `tlMemberId`
|
|
39
|
+
- **Non-subordinate target**: Rejected with hierarchy violation error
|
|
40
|
+
|
|
41
|
+
## Output
|
|
42
|
+
|
|
43
|
+
JSON with the scheduled check ID and fire time.
|
|
44
|
+
|
|
45
|
+
## Best Practices
|
|
46
|
+
|
|
47
|
+
- **Use `maxOccurrences`** for time-bounded tasks to prevent stale schedules
|
|
48
|
+
- **Include worker name and task context** in the message for quick triage when the check fires
|
|
49
|
+
- **Prefer self-targeted checks** — schedule reminders to yourself to review worker status rather than interrupting workers directly
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
{
|
|
2
|
+
"id": "tl-schedule-check",
|
|
3
|
+
"name": "Schedule Check (TL)",
|
|
4
|
+
"description": "Schedule a future check-in or reminder. TL can only target self or subordinate workers (hierarchy-validated).",
|
|
5
|
+
"category": "monitoring",
|
|
6
|
+
"skillType": "claude-skill",
|
|
7
|
+
"promptFile": "instructions.md",
|
|
8
|
+
"execution": {
|
|
9
|
+
"type": "script",
|
|
10
|
+
"script": {
|
|
11
|
+
"file": "execute.sh",
|
|
12
|
+
"interpreter": "bash",
|
|
13
|
+
"timeoutMs": 15000
|
|
14
|
+
}
|
|
15
|
+
},
|
|
16
|
+
"assignableRoles": ["team-leader"],
|
|
17
|
+
"triggers": ["schedule check", "remind me", "check in later", "follow up"],
|
|
18
|
+
"tags": ["scheduling", "monitoring", "reminder", "hierarchy"],
|
|
19
|
+
"version": "1.0.0"
|
|
20
|
+
}
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
#!/bin/bash
|
|
2
|
+
# Start a worker agent within this Team Leader's subordinate scope.
|
|
3
|
+
# Validates hierarchy (worker.parentMemberId == TL.memberId) before starting.
|
|
4
|
+
set -euo pipefail
|
|
5
|
+
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
|
|
6
|
+
source "${SCRIPT_DIR}/../_common/lib.sh"
|
|
7
|
+
|
|
8
|
+
INPUT="${1:-}"
|
|
9
|
+
[ -z "$INPUT" ] && error_exit "Usage: execute.sh '{\"teamId\":\"team-uuid\",\"memberId\":\"member-uuid\",\"tlMemberId\":\"tl-member-id\"}'"
|
|
10
|
+
|
|
11
|
+
TEAM_ID=$(echo "$INPUT" | jq -r '.teamId // empty')
|
|
12
|
+
MEMBER_ID=$(echo "$INPUT" | jq -r '.memberId // empty')
|
|
13
|
+
TL_MEMBER_ID=$(echo "$INPUT" | jq -r '.tlMemberId // empty')
|
|
14
|
+
require_param "teamId" "$TEAM_ID"
|
|
15
|
+
require_param "memberId" "$MEMBER_ID"
|
|
16
|
+
require_param "tlMemberId" "$TL_MEMBER_ID"
|
|
17
|
+
|
|
18
|
+
# Validate hierarchy: target worker must be a subordinate of this TL
|
|
19
|
+
TEAM_DATA=$(api_call GET "/teams/${TEAM_ID}" 2>/dev/null || echo '{}')
|
|
20
|
+
TEAM_SUCCESS=$(echo "$TEAM_DATA" | jq -r '.success // false' 2>/dev/null || echo "false")
|
|
21
|
+
|
|
22
|
+
if [ "$TEAM_SUCCESS" != "true" ]; then
|
|
23
|
+
error_exit "Failed to fetch team data for team ${TEAM_ID}"
|
|
24
|
+
fi
|
|
25
|
+
|
|
26
|
+
# Find the target member and check parentMemberId
|
|
27
|
+
WORKER_PARENT=$(echo "$TEAM_DATA" | jq -r --arg mid "$MEMBER_ID" \
|
|
28
|
+
'.data.members[] | select(.id == $mid) | .parentMemberId // empty' 2>/dev/null || true)
|
|
29
|
+
|
|
30
|
+
if [ -z "$WORKER_PARENT" ]; then
|
|
31
|
+
error_exit "Member ${MEMBER_ID} not found in team ${TEAM_ID} or has no parentMemberId set"
|
|
32
|
+
fi
|
|
33
|
+
|
|
34
|
+
if [ "$WORKER_PARENT" != "$TL_MEMBER_ID" ]; then
|
|
35
|
+
error_exit "Hierarchy violation: member ${MEMBER_ID} (parentMemberId=${WORKER_PARENT}) is not a subordinate of TL ${TL_MEMBER_ID}"
|
|
36
|
+
fi
|
|
37
|
+
|
|
38
|
+
# Hierarchy validated — start the agent
|
|
39
|
+
api_call POST "/teams/${TEAM_ID}/members/${MEMBER_ID}/start"
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
# Start Agent (TL Version)
|
|
2
|
+
|
|
3
|
+
Starts a worker agent within the Team Leader's subordinate scope. Validates hierarchy before starting — the target worker's `parentMemberId` must match the TL's `memberId`.
|
|
4
|
+
|
|
5
|
+
## When to Use
|
|
6
|
+
|
|
7
|
+
- When a worker needs to be activated for task assignment
|
|
8
|
+
- After a worker was previously stopped and needs to be restarted
|
|
9
|
+
- When scaling up the sub-team for a new objective
|
|
10
|
+
|
|
11
|
+
## Usage
|
|
12
|
+
|
|
13
|
+
```bash
|
|
14
|
+
bash {{TL_SKILLS_PATH}}/start-agent/execute.sh '{"teamId":"{{TEAM_ID}}","memberId":"worker-member-uuid","tlMemberId":"{{MEMBER_ID}}"}'
|
|
15
|
+
```
|
|
16
|
+
|
|
17
|
+
## Parameters
|
|
18
|
+
|
|
19
|
+
| Parameter | Required | Description |
|
|
20
|
+
|-----------|----------|-------------|
|
|
21
|
+
| `teamId` | Yes | The team's UUID |
|
|
22
|
+
| `memberId` | Yes | The target worker's member UUID |
|
|
23
|
+
| `tlMemberId` | Yes | The TL's own member ID for hierarchy validation |
|
|
24
|
+
|
|
25
|
+
## Hierarchy Validation
|
|
26
|
+
|
|
27
|
+
The script fetches team data and validates:
|
|
28
|
+
- The target member exists in the team
|
|
29
|
+
- The member's `parentMemberId` matches the TL's `memberId`
|
|
30
|
+
|
|
31
|
+
If validation fails, the start is rejected with a hierarchy violation error. TLs can only start their own subordinates — not agents in other teams or under other TLs.
|
|
32
|
+
|
|
33
|
+
## Differences from Orchestrator start-agent
|
|
34
|
+
|
|
35
|
+
| Aspect | Orchestrator | Team Leader |
|
|
36
|
+
|--------|-------------|-------------|
|
|
37
|
+
| Scope | Any agent in any team | Only subordinates |
|
|
38
|
+
| Hierarchy check | None | Validates parentMemberId |
|
|
39
|
+
| Extra parameter | None | `tlMemberId` required |
|
|
40
|
+
|
|
41
|
+
## Output
|
|
42
|
+
|
|
43
|
+
JSON confirmation with agent startup status, same format as orchestrator start-agent.
|
|
44
|
+
|
|
45
|
+
## Related Skills
|
|
46
|
+
|
|
47
|
+
- `stop-agent` — Stop a subordinate worker
|
|
48
|
+
- `delegate-task` — Assign tasks to workers after starting them
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
{
|
|
2
|
+
"id": "tl-start-agent",
|
|
3
|
+
"name": "Start Agent (TL)",
|
|
4
|
+
"description": "Start a worker agent within the Team Leader's subordinate scope. Validates that the target worker's parentMemberId matches the TL's memberId before starting.",
|
|
5
|
+
"category": "management",
|
|
6
|
+
"skillType": "claude-skill",
|
|
7
|
+
"promptFile": "instructions.md",
|
|
8
|
+
"execution": {
|
|
9
|
+
"type": "script",
|
|
10
|
+
"script": {
|
|
11
|
+
"file": "execute.sh",
|
|
12
|
+
"interpreter": "bash",
|
|
13
|
+
"timeoutMs": 60000
|
|
14
|
+
}
|
|
15
|
+
},
|
|
16
|
+
"assignableRoles": ["team-leader"],
|
|
17
|
+
"triggers": ["start agent", "start worker", "activate worker", "boot worker"],
|
|
18
|
+
"tags": ["agent", "management", "lifecycle", "hierarchy"],
|
|
19
|
+
"version": "1.0.0"
|
|
20
|
+
}
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
#!/bin/bash
|
|
2
|
+
# Stop a worker agent within this Team Leader's subordinate scope.
|
|
3
|
+
# Validates hierarchy (worker.parentMemberId == TL.memberId) before stopping.
|
|
4
|
+
set -euo pipefail
|
|
5
|
+
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
|
|
6
|
+
source "${SCRIPT_DIR}/../_common/lib.sh"
|
|
7
|
+
|
|
8
|
+
INPUT="${1:-}"
|
|
9
|
+
[ -z "$INPUT" ] && error_exit "Usage: execute.sh '{\"teamId\":\"team-uuid\",\"memberId\":\"member-uuid\",\"tlMemberId\":\"tl-member-id\"}'"
|
|
10
|
+
|
|
11
|
+
TEAM_ID=$(echo "$INPUT" | jq -r '.teamId // empty')
|
|
12
|
+
MEMBER_ID=$(echo "$INPUT" | jq -r '.memberId // empty')
|
|
13
|
+
TL_MEMBER_ID=$(echo "$INPUT" | jq -r '.tlMemberId // empty')
|
|
14
|
+
require_param "teamId" "$TEAM_ID"
|
|
15
|
+
require_param "memberId" "$MEMBER_ID"
|
|
16
|
+
require_param "tlMemberId" "$TL_MEMBER_ID"
|
|
17
|
+
|
|
18
|
+
# Validate hierarchy: target worker must be a subordinate of this TL
|
|
19
|
+
TEAM_DATA=$(api_call GET "/teams/${TEAM_ID}" 2>/dev/null || echo '{}')
|
|
20
|
+
TEAM_SUCCESS=$(echo "$TEAM_DATA" | jq -r '.success // false' 2>/dev/null || echo "false")
|
|
21
|
+
|
|
22
|
+
if [ "$TEAM_SUCCESS" != "true" ]; then
|
|
23
|
+
error_exit "Failed to fetch team data for team ${TEAM_ID}"
|
|
24
|
+
fi
|
|
25
|
+
|
|
26
|
+
# Find the target member and check parentMemberId
|
|
27
|
+
WORKER_PARENT=$(echo "$TEAM_DATA" | jq -r --arg mid "$MEMBER_ID" \
|
|
28
|
+
'.data.members[] | select(.id == $mid) | .parentMemberId // empty' 2>/dev/null || true)
|
|
29
|
+
|
|
30
|
+
if [ -z "$WORKER_PARENT" ]; then
|
|
31
|
+
error_exit "Member ${MEMBER_ID} not found in team ${TEAM_ID} or has no parentMemberId set"
|
|
32
|
+
fi
|
|
33
|
+
|
|
34
|
+
if [ "$WORKER_PARENT" != "$TL_MEMBER_ID" ]; then
|
|
35
|
+
error_exit "Hierarchy violation: member ${MEMBER_ID} (parentMemberId=${WORKER_PARENT}) is not a subordinate of TL ${TL_MEMBER_ID}"
|
|
36
|
+
fi
|
|
37
|
+
|
|
38
|
+
# Hierarchy validated — stop the agent
|
|
39
|
+
api_call POST "/teams/${TEAM_ID}/members/${MEMBER_ID}/stop"
|