crewly 1.3.31 → 1.4.1
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/config/constants.ts +18 -3
- package/config/hooks/install-hooks.sh +88 -0
- package/config/hooks/pre-commit +104 -0
- package/config/orchestrator_tasks/prompts/orchestrator-prompt.md +17 -24
- package/config/roles/auditor/role.json +13 -0
- package/config/roles/orchestrator/prompt.md +25 -0
- package/config/roles/product-manager/prompt.md +18 -1
- package/config/roles/researcher/prompt.md +110 -0
- package/config/roles/team-leader/prompt.md +31 -8
- package/config/roles/team-leader/tl-addon.md +40 -9
- package/config/roles/ux-designer/prompt.md +111 -0
- package/config/skills/_common/lib.sh +33 -0
- package/config/skills/agent/browse-stealth/{instructions.md → SKILL.md} +40 -0
- package/config/skills/agent/chrome-attach/SKILL.md +84 -0
- package/config/skills/agent/chrome-attach/execute.sh +279 -0
- package/config/skills/agent/competitor-content-tracker/{instructions.md → SKILL.md} +34 -0
- package/config/skills/agent/computer-use/{instructions.md → SKILL.md} +43 -0
- package/config/skills/agent/content-calendar/{instructions.md → SKILL.md} +32 -0
- package/config/skills/agent/content-repurposer/{instructions.md → SKILL.md} +38 -0
- package/config/skills/agent/content-writer/{instructions.md → SKILL.md} +38 -0
- package/config/skills/agent/core/accept-task/{instructions.md → SKILL.md} +37 -0
- package/config/skills/agent/core/block-task/{instructions.md → SKILL.md} +37 -0
- package/config/skills/agent/core/check-quality-gates/{instructions.md → SKILL.md} +40 -0
- package/config/skills/agent/core/complete-task/{instructions.md → SKILL.md} +37 -0
- package/config/skills/agent/core/complete-task/execute.sh +15 -0
- package/config/skills/agent/core/generate-pdf/{instructions.md → SKILL.md} +42 -0
- package/config/skills/agent/core/get-my-context/{instructions.md → SKILL.md} +38 -0
- package/config/skills/agent/core/get-sops/{instructions.md → SKILL.md} +38 -0
- package/config/skills/agent/core/get-team-norms/execute.sh +106 -0
- package/config/skills/agent/core/get-team-status/SKILL.md +55 -0
- package/config/skills/agent/core/handoff-task/execute.sh +150 -0
- package/config/skills/agent/core/heartbeat/{instructions.md → SKILL.md} +27 -0
- package/config/skills/agent/core/marketplace-search/{instructions.md → SKILL.md} +41 -0
- package/config/skills/agent/core/query-knowledge/{instructions.md → SKILL.md} +40 -0
- package/config/skills/agent/core/read-task/SKILL.md +56 -0
- package/config/skills/agent/core/recall/{instructions.md → SKILL.md} +38 -0
- package/config/skills/agent/core/record-learning/{instructions.md → SKILL.md} +38 -0
- package/config/skills/agent/core/register-self/SKILL.md +54 -0
- package/config/skills/agent/core/remember/{instructions.md → SKILL.md} +37 -0
- package/config/skills/agent/core/remember/execute.sh +6 -0
- package/config/skills/agent/core/reply-chat/{instructions.md → SKILL.md} +37 -0
- package/config/skills/agent/core/report-progress/{instructions.md → SKILL.md} +38 -0
- package/config/skills/agent/core/report-status/{instructions.md → SKILL.md} +39 -0
- package/config/skills/agent/core/send-chat-response/{instructions.md → SKILL.md} +37 -0
- package/config/skills/agent/core/send-message/SKILL.md +58 -0
- package/config/skills/agent/core/update-team-norm/execute.sh +115 -0
- package/config/skills/agent/desktop-app-control/{instructions.md → SKILL.md} +42 -0
- package/config/skills/agent/trend-monitor/{instructions.md → SKILL.md} +34 -0
- package/config/skills/agent/vnc-browser/{instructions.md → SKILL.md} +38 -0
- package/config/skills/auditor/score-task/SKILL.md +28 -0
- package/config/skills/auditor/score-task/execute.sh +21 -0
- package/config/skills/examples/enterprise-skill-example.json +22 -0
- package/config/skills/examples/premium-skill-example.json +22 -0
- package/config/skills/orchestrator/assign-task/SKILL.md +41 -0
- package/config/skills/orchestrator/assign-team-to-project/{instructions.md → SKILL.md} +25 -0
- package/config/skills/orchestrator/broadcast/{instructions.md → SKILL.md} +24 -0
- package/config/skills/orchestrator/broadcast-to-org/{instructions.md → SKILL.md} +25 -0
- package/config/skills/orchestrator/cancel-all-schedules/{instructions.md → SKILL.md} +5 -0
- package/config/skills/orchestrator/cancel-schedule/SKILL.md +43 -0
- package/config/skills/orchestrator/complete-task/SKILL.md +41 -0
- package/config/skills/orchestrator/create-project/{instructions.md → SKILL.md} +24 -0
- package/config/skills/orchestrator/create-team/{instructions.md → SKILL.md} +24 -0
- package/config/skills/orchestrator/delegate-task/{instructions.md → SKILL.md} +27 -0
- package/config/skills/orchestrator/delegate-task/execute.sh +31 -2
- package/config/skills/orchestrator/get-agent-logs/{instructions.md → SKILL.md} +25 -0
- package/config/skills/orchestrator/get-agent-status/{instructions.md → SKILL.md} +24 -0
- package/config/skills/orchestrator/get-project-overview/SKILL.md +41 -0
- package/config/skills/orchestrator/get-tasks/SKILL.md +41 -0
- package/config/skills/orchestrator/get-team-status/SKILL.md +43 -0
- package/config/skills/orchestrator/handle-agent-failure/{instructions.md → SKILL.md} +27 -0
- package/config/skills/orchestrator/heartbeat/{instructions.md → SKILL.md} +24 -0
- package/config/skills/orchestrator/list-schedules/{instructions.md → SKILL.md} +5 -0
- package/config/skills/orchestrator/list-subscriptions/SKILL.md +41 -0
- package/config/skills/orchestrator/query-knowledge/{instructions.md → SKILL.md} +28 -0
- package/config/skills/orchestrator/read-session-logs/{instructions.md → SKILL.md} +26 -0
- package/config/skills/orchestrator/read-system-logs/{instructions.md → SKILL.md} +25 -0
- package/config/skills/orchestrator/recall/{instructions.md → SKILL.md} +24 -0
- package/config/skills/orchestrator/record-failure/{instructions.md → SKILL.md} +27 -0
- package/config/skills/orchestrator/record-learning/{instructions.md → SKILL.md} +24 -0
- package/config/skills/orchestrator/record-success/{instructions.md → SKILL.md} +26 -0
- package/config/skills/orchestrator/register-self/{instructions.md → SKILL.md} +24 -0
- package/config/skills/orchestrator/remember/{instructions.md → SKILL.md} +24 -0
- package/config/skills/orchestrator/reply-chat/{instructions.md → SKILL.md} +25 -0
- package/config/skills/orchestrator/reply-chat/execute.sh +0 -13
- package/config/skills/orchestrator/reply-gchat/{instructions.md → SKILL.md} +25 -0
- package/config/skills/orchestrator/reply-gchat/execute.sh +0 -18
- package/config/skills/orchestrator/reply-slack/{instructions.md → SKILL.md} +24 -0
- package/config/skills/orchestrator/reply-slack/execute.sh +18 -31
- package/config/skills/orchestrator/report-bug/{instructions.md → SKILL.md} +26 -0
- package/config/skills/orchestrator/restart-crewly/{instructions.md → SKILL.md} +26 -0
- package/config/skills/orchestrator/resume-session/{instructions.md → SKILL.md} +24 -0
- package/config/skills/orchestrator/schedule-check/{instructions.md → SKILL.md} +24 -0
- package/config/skills/orchestrator/send-key/{instructions.md → SKILL.md} +26 -0
- package/config/skills/orchestrator/send-message/{instructions.md → SKILL.md} +24 -0
- package/config/skills/orchestrator/send-pdf-to-slack/{instructions.md → SKILL.md} +27 -0
- package/config/skills/orchestrator/set-goal/{instructions.md → SKILL.md} +26 -0
- package/config/skills/orchestrator/start-agent/{instructions.md → SKILL.md} +24 -0
- package/config/skills/orchestrator/start-team/{instructions.md → SKILL.md} +24 -0
- package/config/skills/orchestrator/stop-agent/{instructions.md → SKILL.md} +24 -0
- package/config/skills/orchestrator/stop-team/SKILL.md +43 -0
- package/config/skills/orchestrator/subscribe-event/{instructions.md → SKILL.md} +24 -0
- package/config/skills/orchestrator/terminate-agent/{instructions.md → SKILL.md} +24 -0
- package/config/skills/orchestrator/unsubscribe-event/SKILL.md +42 -0
- package/config/skills/orchestrator/update-focus/{instructions.md → SKILL.md} +26 -0
- package/config/skills/orchestrator/update-team/{instructions.md → SKILL.md} +24 -0
- package/config/skills/team-leader/aggregate-results/{instructions.md → SKILL.md} +26 -0
- package/config/skills/team-leader/decompose-goal/{instructions.md → SKILL.md} +26 -0
- package/config/skills/team-leader/delegate-task/{instructions.md → SKILL.md} +26 -0
- package/config/skills/team-leader/delegate-task/execute.sh +14 -6
- package/config/skills/team-leader/delegate-task/execute.test.sh +401 -0
- package/config/skills/team-leader/handle-failure/{instructions.md → SKILL.md} +27 -0
- package/config/skills/team-leader/schedule-check/{instructions.md → SKILL.md} +26 -0
- package/config/skills/team-leader/start-agent/{instructions.md → SKILL.md} +26 -0
- package/config/skills/team-leader/stop-agent/{instructions.md → SKILL.md} +26 -0
- package/config/skills/team-leader/verify-output/{instructions.md → SKILL.md} +27 -0
- package/config/templates/agent-agents-md.md +35 -0
- package/config/templates/agent-gemini-md.md +35 -0
- package/config/templates/code-review-team/team-config.json +7 -0
- package/config/templates/content-generation-team/norms/brand-guidelines.md +64 -0
- package/config/templates/content-generation-team/norms/content-review.md +66 -0
- package/config/templates/content-generation-team/norms/publish-checklist.md +58 -0
- package/config/templates/content-generation-team/team-config.json +8 -0
- package/config/templates/dev-fullstack/norms/code-commit-sop.md +40 -0
- package/config/templates/dev-fullstack/norms/quality-gates.md +35 -0
- package/config/templates/dev-fullstack/template.json +17 -1
- package/config/templates/education-smb/template.json +10 -1
- package/config/templates/insurance-smb/template.json +10 -1
- package/config/templates/research-analysis/norms/research-methodology.md +36 -0
- package/config/templates/research-analysis/norms/source-citation.md +33 -0
- package/config/templates/research-analysis/template.json +17 -1
- package/config/templates/security-audit-team.json +67 -0
- package/config/templates/social-media-ops/norms/engagement-rules.md +35 -0
- package/config/templates/social-media-ops/norms/posting-schedule.md +43 -0
- package/config/templates/social-media-ops/template.json +17 -1
- package/config/templates/video-production/template.json +10 -1
- package/dist/backend/backend/src/constants.d.ts +80 -11
- package/dist/backend/backend/src/constants.d.ts.map +1 -1
- package/dist/backend/backend/src/constants.js +85 -11
- package/dist/backend/backend/src/constants.js.map +1 -1
- package/dist/backend/backend/src/controllers/approvals/approvals.controller.d.ts +99 -0
- package/dist/backend/backend/src/controllers/approvals/approvals.controller.d.ts.map +1 -0
- package/dist/backend/backend/src/controllers/approvals/approvals.controller.js +183 -0
- package/dist/backend/backend/src/controllers/approvals/approvals.controller.js.map +1 -0
- package/dist/backend/backend/src/controllers/approvals/approvals.routes.d.ts +15 -0
- package/dist/backend/backend/src/controllers/approvals/approvals.routes.d.ts.map +1 -0
- package/dist/backend/backend/src/controllers/approvals/approvals.routes.js +27 -0
- package/dist/backend/backend/src/controllers/approvals/approvals.routes.js.map +1 -0
- package/dist/backend/backend/src/controllers/cloud/cloud-google-auth.controller.d.ts +70 -0
- package/dist/backend/backend/src/controllers/cloud/cloud-google-auth.controller.d.ts.map +1 -0
- package/dist/backend/backend/src/controllers/cloud/cloud-google-auth.controller.js +368 -0
- package/dist/backend/backend/src/controllers/cloud/cloud-google-auth.controller.js.map +1 -0
- package/dist/backend/backend/src/controllers/cloud/cloud.controller.d.ts +24 -0
- package/dist/backend/backend/src/controllers/cloud/cloud.controller.d.ts.map +1 -1
- package/dist/backend/backend/src/controllers/cloud/cloud.controller.js +202 -3
- package/dist/backend/backend/src/controllers/cloud/cloud.controller.js.map +1 -1
- package/dist/backend/backend/src/controllers/cloud/cloud.routes.d.ts +9 -4
- package/dist/backend/backend/src/controllers/cloud/cloud.routes.d.ts.map +1 -1
- package/dist/backend/backend/src/controllers/cloud/cloud.routes.js +19 -5
- package/dist/backend/backend/src/controllers/cloud/cloud.routes.js.map +1 -1
- package/dist/backend/backend/src/controllers/cloud/index.d.ts +1 -0
- package/dist/backend/backend/src/controllers/cloud/index.d.ts.map +1 -1
- package/dist/backend/backend/src/controllers/cloud/index.js +1 -0
- package/dist/backend/backend/src/controllers/cloud/index.js.map +1 -1
- package/dist/backend/backend/src/controllers/index.d.ts.map +1 -1
- package/dist/backend/backend/src/controllers/index.js +2 -0
- package/dist/backend/backend/src/controllers/index.js.map +1 -1
- package/dist/backend/backend/src/controllers/marketplace/marketplace.controller.js +1 -1
- package/dist/backend/backend/src/controllers/marketplace/marketplace.controller.js.map +1 -1
- package/dist/backend/backend/src/controllers/marketplace/template-marketplace.routes.d.ts +3 -3
- package/dist/backend/backend/src/controllers/marketplace/template-marketplace.routes.js +9 -9
- package/dist/backend/backend/src/controllers/marketplace/template-marketplace.routes.js.map +1 -1
- package/dist/backend/backend/src/controllers/memory/memory.controller.js +6 -6
- package/dist/backend/backend/src/controllers/memory/memory.controller.js.map +1 -1
- package/dist/backend/backend/src/controllers/messaging/messenger.routes.d.ts +0 -7
- package/dist/backend/backend/src/controllers/messaging/messenger.routes.d.ts.map +1 -1
- package/dist/backend/backend/src/controllers/messaging/messenger.routes.js +2 -135
- package/dist/backend/backend/src/controllers/messaging/messenger.routes.js.map +1 -1
- package/dist/backend/backend/src/controllers/monitoring/terminal.controller.d.ts +14 -0
- package/dist/backend/backend/src/controllers/monitoring/terminal.controller.d.ts.map +1 -1
- package/dist/backend/backend/src/controllers/monitoring/terminal.controller.js +96 -1
- package/dist/backend/backend/src/controllers/monitoring/terminal.controller.js.map +1 -1
- package/dist/backend/backend/src/controllers/oauth/oauth.routes.d.ts.map +1 -1
- package/dist/backend/backend/src/controllers/oauth/oauth.routes.js +8 -1
- package/dist/backend/backend/src/controllers/oauth/oauth.routes.js.map +1 -1
- package/dist/backend/backend/src/controllers/orchestrator/orchestrator.controller.d.ts +16 -0
- package/dist/backend/backend/src/controllers/orchestrator/orchestrator.controller.d.ts.map +1 -1
- package/dist/backend/backend/src/controllers/orchestrator/orchestrator.controller.js +124 -13
- package/dist/backend/backend/src/controllers/orchestrator/orchestrator.controller.js.map +1 -1
- package/dist/backend/backend/src/controllers/payment/payment.controller.js +2 -2
- package/dist/backend/backend/src/controllers/payment/payment.controller.js.map +1 -1
- package/dist/backend/backend/src/controllers/payment/payment.routes.d.ts +3 -3
- package/dist/backend/backend/src/controllers/payment/payment.routes.d.ts.map +1 -1
- package/dist/backend/backend/src/controllers/payment/payment.routes.js +4 -14
- package/dist/backend/backend/src/controllers/payment/payment.routes.js.map +1 -1
- package/dist/backend/backend/src/controllers/payment/payment.types.d.ts +15 -94
- package/dist/backend/backend/src/controllers/payment/payment.types.d.ts.map +1 -1
- package/dist/backend/backend/src/controllers/payment/payment.types.js +11 -35
- package/dist/backend/backend/src/controllers/payment/payment.types.js.map +1 -1
- package/dist/backend/backend/src/controllers/pr-review/pr-review.controller.d.ts +49 -0
- package/dist/backend/backend/src/controllers/pr-review/pr-review.controller.d.ts.map +1 -0
- package/dist/backend/backend/src/controllers/pr-review/pr-review.controller.js +138 -0
- package/dist/backend/backend/src/controllers/pr-review/pr-review.controller.js.map +1 -0
- package/dist/backend/backend/src/controllers/pr-review/pr-review.routes.d.ts +20 -0
- package/dist/backend/backend/src/controllers/pr-review/pr-review.routes.d.ts.map +1 -0
- package/dist/backend/backend/src/controllers/pr-review/pr-review.routes.js +30 -0
- package/dist/backend/backend/src/controllers/pr-review/pr-review.routes.js.map +1 -0
- package/dist/backend/backend/src/controllers/quality-gate/quality-gate.controller.d.ts +12 -0
- package/dist/backend/backend/src/controllers/quality-gate/quality-gate.controller.d.ts.map +1 -1
- package/dist/backend/backend/src/controllers/quality-gate/quality-gate.controller.js +107 -0
- package/dist/backend/backend/src/controllers/quality-gate/quality-gate.controller.js.map +1 -1
- package/dist/backend/backend/src/controllers/request-types.d.ts +20 -1
- package/dist/backend/backend/src/controllers/request-types.d.ts.map +1 -1
- package/dist/backend/backend/src/controllers/slack/slack.controller.d.ts.map +1 -1
- package/dist/backend/backend/src/controllers/slack/slack.controller.js +11 -5
- package/dist/backend/backend/src/controllers/slack/slack.controller.js.map +1 -1
- package/dist/backend/backend/src/controllers/task-management/task-management.controller.d.ts +46 -0
- 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 +598 -326
- package/dist/backend/backend/src/controllers/task-management/task-management.controller.js.map +1 -1
- package/dist/backend/backend/src/controllers/team/team.controller.d.ts +12 -0
- package/dist/backend/backend/src/controllers/team/team.controller.d.ts.map +1 -1
- package/dist/backend/backend/src/controllers/team/team.controller.js +105 -36
- package/dist/backend/backend/src/controllers/team/team.controller.js.map +1 -1
- package/dist/backend/backend/src/controllers/team/team.routes.d.ts.map +1 -1
- package/dist/backend/backend/src/controllers/team/team.routes.js +2 -1
- package/dist/backend/backend/src/controllers/team/team.routes.js.map +1 -1
- package/dist/backend/backend/src/controllers/template/template.controller.d.ts +11 -0
- package/dist/backend/backend/src/controllers/template/template.controller.d.ts.map +1 -1
- package/dist/backend/backend/src/controllers/template/template.controller.js +59 -0
- package/dist/backend/backend/src/controllers/template/template.controller.js.map +1 -1
- package/dist/backend/backend/src/controllers/template/template.routes.d.ts.map +1 -1
- package/dist/backend/backend/src/controllers/template/template.routes.js +2 -1
- package/dist/backend/backend/src/controllers/template/template.routes.js.map +1 -1
- package/dist/backend/backend/src/controllers/workspace/workspace.controller.d.ts +39 -0
- package/dist/backend/backend/src/controllers/workspace/workspace.controller.d.ts.map +1 -0
- package/dist/backend/backend/src/controllers/workspace/workspace.controller.js +120 -0
- package/dist/backend/backend/src/controllers/workspace/workspace.controller.js.map +1 -0
- package/dist/backend/backend/src/controllers/workspace/workspace.routes.d.ts +18 -0
- package/dist/backend/backend/src/controllers/workspace/workspace.routes.d.ts.map +1 -0
- package/dist/backend/backend/src/controllers/workspace/workspace.routes.js +27 -0
- package/dist/backend/backend/src/controllers/workspace/workspace.routes.js.map +1 -0
- package/dist/backend/backend/src/index.d.ts.map +1 -1
- package/dist/backend/backend/src/index.js +108 -15
- package/dist/backend/backend/src/index.js.map +1 -1
- package/dist/backend/backend/src/middleware/require-auth.middleware.d.ts +20 -0
- package/dist/backend/backend/src/middleware/require-auth.middleware.d.ts.map +1 -0
- package/dist/backend/backend/src/middleware/require-auth.middleware.js +21 -0
- package/dist/backend/backend/src/middleware/require-auth.middleware.js.map +1 -0
- package/dist/backend/backend/src/routes/api.routes.d.ts.map +1 -1
- package/dist/backend/backend/src/routes/api.routes.js +18 -5
- package/dist/backend/backend/src/routes/api.routes.js.map +1 -1
- package/dist/backend/backend/src/routes/modules/quality-gate.routes.d.ts +2 -1
- package/dist/backend/backend/src/routes/modules/quality-gate.routes.d.ts.map +1 -1
- package/dist/backend/backend/src/routes/modules/quality-gate.routes.js +4 -2
- package/dist/backend/backend/src/routes/modules/quality-gate.routes.js.map +1 -1
- package/dist/backend/backend/src/routes/modules/task-management.routes.d.ts.map +1 -1
- package/dist/backend/backend/src/routes/modules/task-management.routes.js +8 -0
- package/dist/backend/backend/src/routes/modules/task-management.routes.js.map +1 -1
- package/dist/backend/backend/src/routes/modules/terminal.routes.d.ts.map +1 -1
- package/dist/backend/backend/src/routes/modules/terminal.routes.js +4 -0
- package/dist/backend/backend/src/routes/modules/terminal.routes.js.map +1 -1
- package/dist/backend/backend/src/services/agent/adaptive-heartbeat.service.d.ts +149 -0
- package/dist/backend/backend/src/services/agent/adaptive-heartbeat.service.d.ts.map +1 -0
- package/dist/backend/backend/src/services/agent/adaptive-heartbeat.service.js +200 -0
- package/dist/backend/backend/src/services/agent/adaptive-heartbeat.service.js.map +1 -0
- package/dist/backend/backend/src/services/agent/agent-heartbeat-monitor.service.d.ts +13 -0
- package/dist/backend/backend/src/services/agent/agent-heartbeat-monitor.service.d.ts.map +1 -1
- package/dist/backend/backend/src/services/agent/agent-heartbeat-monitor.service.js +65 -6
- package/dist/backend/backend/src/services/agent/agent-heartbeat-monitor.service.js.map +1 -1
- package/dist/backend/backend/src/services/agent/agent-registration.service.d.ts +36 -0
- 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 +174 -52
- package/dist/backend/backend/src/services/agent/agent-registration.service.js.map +1 -1
- package/dist/backend/backend/src/services/agent/auditor-scheduler.service.d.ts +66 -20
- package/dist/backend/backend/src/services/agent/auditor-scheduler.service.d.ts.map +1 -1
- package/dist/backend/backend/src/services/agent/auditor-scheduler.service.js +261 -60
- package/dist/backend/backend/src/services/agent/auditor-scheduler.service.js.map +1 -1
- package/dist/backend/backend/src/services/agent/claude-runtime.service.d.ts +19 -0
- 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 +80 -0
- package/dist/backend/backend/src/services/agent/claude-runtime.service.js.map +1 -1
- package/dist/backend/backend/src/services/agent/context-window-monitor.service.d.ts +11 -0
- package/dist/backend/backend/src/services/agent/context-window-monitor.service.d.ts.map +1 -1
- package/dist/backend/backend/src/services/agent/context-window-monitor.service.js +49 -1
- package/dist/backend/backend/src/services/agent/context-window-monitor.service.js.map +1 -1
- package/dist/backend/backend/src/services/agent/crewly-agent/agent-runner.service.d.ts +74 -3
- package/dist/backend/backend/src/services/agent/crewly-agent/agent-runner.service.d.ts.map +1 -1
- package/dist/backend/backend/src/services/agent/crewly-agent/agent-runner.service.js +248 -18
- package/dist/backend/backend/src/services/agent/crewly-agent/agent-runner.service.js.map +1 -1
- package/dist/backend/backend/src/services/agent/crewly-agent/approval-queue.service.d.ts +161 -0
- package/dist/backend/backend/src/services/agent/crewly-agent/approval-queue.service.d.ts.map +1 -0
- package/dist/backend/backend/src/services/agent/crewly-agent/approval-queue.service.js +237 -0
- package/dist/backend/backend/src/services/agent/crewly-agent/approval-queue.service.js.map +1 -0
- package/dist/backend/backend/src/services/agent/crewly-agent/audit-trail.service.d.ts +74 -0
- package/dist/backend/backend/src/services/agent/crewly-agent/audit-trail.service.d.ts.map +1 -0
- package/dist/backend/backend/src/services/agent/crewly-agent/audit-trail.service.js +140 -0
- package/dist/backend/backend/src/services/agent/crewly-agent/audit-trail.service.js.map +1 -0
- package/dist/backend/backend/src/services/agent/crewly-agent/auditor-tools.d.ts.map +1 -1
- package/dist/backend/backend/src/services/agent/crewly-agent/auditor-tools.js +50 -2
- package/dist/backend/backend/src/services/agent/crewly-agent/auditor-tools.js.map +1 -1
- package/dist/backend/backend/src/services/agent/crewly-agent/crewly-agent-runtime.service.d.ts +16 -1
- package/dist/backend/backend/src/services/agent/crewly-agent/crewly-agent-runtime.service.d.ts.map +1 -1
- package/dist/backend/backend/src/services/agent/crewly-agent/crewly-agent-runtime.service.js +45 -5
- package/dist/backend/backend/src/services/agent/crewly-agent/crewly-agent-runtime.service.js.map +1 -1
- package/dist/backend/backend/src/services/agent/crewly-agent/index.d.ts +3 -1
- package/dist/backend/backend/src/services/agent/crewly-agent/index.d.ts.map +1 -1
- package/dist/backend/backend/src/services/agent/crewly-agent/index.js +3 -1
- package/dist/backend/backend/src/services/agent/crewly-agent/index.js.map +1 -1
- package/dist/backend/backend/src/services/agent/crewly-agent/mcp-tool-bridge.d.ts +135 -0
- package/dist/backend/backend/src/services/agent/crewly-agent/mcp-tool-bridge.d.ts.map +1 -0
- package/dist/backend/backend/src/services/agent/crewly-agent/mcp-tool-bridge.js +185 -0
- package/dist/backend/backend/src/services/agent/crewly-agent/mcp-tool-bridge.js.map +1 -0
- package/dist/backend/backend/src/services/agent/crewly-agent/model-manager.d.ts +10 -2
- package/dist/backend/backend/src/services/agent/crewly-agent/model-manager.d.ts.map +1 -1
- package/dist/backend/backend/src/services/agent/crewly-agent/model-manager.js +22 -2
- package/dist/backend/backend/src/services/agent/crewly-agent/model-manager.js.map +1 -1
- package/dist/backend/backend/src/services/agent/crewly-agent/rate-limiter.d.ts +143 -0
- package/dist/backend/backend/src/services/agent/crewly-agent/rate-limiter.d.ts.map +1 -0
- package/dist/backend/backend/src/services/agent/crewly-agent/rate-limiter.js +264 -0
- package/dist/backend/backend/src/services/agent/crewly-agent/rate-limiter.js.map +1 -0
- package/dist/backend/backend/src/services/agent/crewly-agent/smoke-test.js +2 -2
- package/dist/backend/backend/src/services/agent/crewly-agent/tool-registry.d.ts +55 -1
- package/dist/backend/backend/src/services/agent/crewly-agent/tool-registry.d.ts.map +1 -1
- package/dist/backend/backend/src/services/agent/crewly-agent/tool-registry.js +660 -45
- package/dist/backend/backend/src/services/agent/crewly-agent/tool-registry.js.map +1 -1
- package/dist/backend/backend/src/services/agent/crewly-agent/types.d.ts +75 -3
- package/dist/backend/backend/src/services/agent/crewly-agent/types.d.ts.map +1 -1
- package/dist/backend/backend/src/services/agent/crewly-agent/types.js +49 -2
- package/dist/backend/backend/src/services/agent/crewly-agent/types.js.map +1 -1
- 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 +17 -2
- package/dist/backend/backend/src/services/agent/runtime-exit-monitor.service.js.map +1 -1
- package/dist/backend/backend/src/services/ai/prompt-builder.service.d.ts +37 -0
- 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 +170 -3
- package/dist/backend/backend/src/services/ai/prompt-builder.service.js.map +1 -1
- package/dist/backend/backend/src/services/browser/chrome-discovery.service.d.ts +108 -0
- package/dist/backend/backend/src/services/browser/chrome-discovery.service.d.ts.map +1 -0
- package/dist/backend/backend/src/services/browser/chrome-discovery.service.js +251 -0
- package/dist/backend/backend/src/services/browser/chrome-discovery.service.js.map +1 -0
- package/dist/backend/backend/src/services/cloud/cloud-auth.middleware.js +1 -1
- package/dist/backend/backend/src/services/cloud/cloud-auth.middleware.js.map +1 -1
- package/dist/backend/backend/src/services/cloud/cloud-client.service.d.ts +12 -0
- package/dist/backend/backend/src/services/cloud/cloud-client.service.d.ts.map +1 -1
- package/dist/backend/backend/src/services/cloud/cloud-client.service.js +19 -0
- package/dist/backend/backend/src/services/cloud/cloud-client.service.js.map +1 -1
- package/dist/backend/backend/src/services/cloud/device-auto-discovery.service.d.ts +191 -0
- package/dist/backend/backend/src/services/cloud/device-auto-discovery.service.d.ts.map +1 -0
- package/dist/backend/backend/src/services/cloud/device-auto-discovery.service.js +415 -0
- package/dist/backend/backend/src/services/cloud/device-auto-discovery.service.js.map +1 -0
- package/dist/backend/backend/src/services/cloud/device-identity.service.d.ts +89 -0
- package/dist/backend/backend/src/services/cloud/device-identity.service.d.ts.map +1 -0
- package/dist/backend/backend/src/services/cloud/device-identity.service.js +148 -0
- package/dist/backend/backend/src/services/cloud/device-identity.service.js.map +1 -0
- package/dist/backend/backend/src/services/cloud/relay-client.service.d.ts.map +1 -1
- package/dist/backend/backend/src/services/cloud/relay-client.service.js +5 -3
- package/dist/backend/backend/src/services/cloud/relay-client.service.js.map +1 -1
- package/dist/backend/backend/src/services/core/tracing.service.d.ts +127 -0
- package/dist/backend/backend/src/services/core/tracing.service.d.ts.map +1 -0
- package/dist/backend/backend/src/services/core/tracing.service.js +238 -0
- package/dist/backend/backend/src/services/core/tracing.service.js.map +1 -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 +11 -3
- package/dist/backend/backend/src/services/event-bus/event-bus.service.js.map +1 -1
- package/dist/backend/backend/src/services/index.d.ts +1 -0
- package/dist/backend/backend/src/services/index.d.ts.map +1 -1
- package/dist/backend/backend/src/services/index.js +1 -0
- package/dist/backend/backend/src/services/index.js.map +1 -1
- package/dist/backend/backend/src/services/knowledge/embedding-provider.d.ts +78 -0
- package/dist/backend/backend/src/services/knowledge/embedding-provider.d.ts.map +1 -0
- package/dist/backend/backend/src/services/knowledge/embedding-provider.js +164 -0
- package/dist/backend/backend/src/services/knowledge/embedding-provider.js.map +1 -0
- package/dist/backend/backend/src/services/knowledge/knowledge-search.service.d.ts +39 -13
- package/dist/backend/backend/src/services/knowledge/knowledge-search.service.d.ts.map +1 -1
- package/dist/backend/backend/src/services/knowledge/knowledge-search.service.js +114 -17
- package/dist/backend/backend/src/services/knowledge/knowledge-search.service.js.map +1 -1
- package/dist/backend/backend/src/services/knowledge/vector-store.service.d.ts +170 -23
- package/dist/backend/backend/src/services/knowledge/vector-store.service.d.ts.map +1 -1
- package/dist/backend/backend/src/services/knowledge/vector-store.service.js +565 -73
- package/dist/backend/backend/src/services/knowledge/vector-store.service.js.map +1 -1
- package/dist/backend/backend/src/services/marketplace/marketplace-installer.service.d.ts.map +1 -1
- package/dist/backend/backend/src/services/marketplace/marketplace-installer.service.js +8 -11
- package/dist/backend/backend/src/services/marketplace/marketplace-installer.service.js.map +1 -1
- package/dist/backend/backend/src/services/marketplace/marketplace.service.d.ts.map +1 -1
- package/dist/backend/backend/src/services/marketplace/marketplace.service.js +1 -0
- package/dist/backend/backend/src/services/marketplace/marketplace.service.js.map +1 -1
- package/dist/backend/backend/src/services/memory/context-flush.service.d.ts +73 -0
- package/dist/backend/backend/src/services/memory/context-flush.service.d.ts.map +1 -0
- package/dist/backend/backend/src/services/memory/context-flush.service.js +131 -0
- package/dist/backend/backend/src/services/memory/context-flush.service.js.map +1 -0
- package/dist/backend/backend/src/services/memory/learning-accumulation.service.d.ts +23 -2
- package/dist/backend/backend/src/services/memory/learning-accumulation.service.d.ts.map +1 -1
- package/dist/backend/backend/src/services/memory/learning-accumulation.service.js +78 -16
- package/dist/backend/backend/src/services/memory/learning-accumulation.service.js.map +1 -1
- package/dist/backend/backend/src/services/memory/memory.service.d.ts +38 -0
- package/dist/backend/backend/src/services/memory/memory.service.d.ts.map +1 -1
- package/dist/backend/backend/src/services/memory/memory.service.js +121 -2
- package/dist/backend/backend/src/services/memory/memory.service.js.map +1 -1
- package/dist/backend/backend/src/services/messaging/adapters/google-chat-messenger.adapter.d.ts +29 -207
- package/dist/backend/backend/src/services/messaging/adapters/google-chat-messenger.adapter.d.ts.map +1 -1
- package/dist/backend/backend/src/services/messaging/adapters/google-chat-messenger.adapter.js +97 -683
- package/dist/backend/backend/src/services/messaging/adapters/google-chat-messenger.adapter.js.map +1 -1
- package/dist/backend/backend/src/services/messaging/google-chat-initializer.d.ts.map +1 -1
- package/dist/backend/backend/src/services/messaging/google-chat-initializer.js +13 -12
- package/dist/backend/backend/src/services/messaging/google-chat-initializer.js.map +1 -1
- package/dist/backend/backend/src/services/messaging/messenger-adapter.interface.d.ts +2 -0
- package/dist/backend/backend/src/services/messaging/messenger-adapter.interface.d.ts.map +1 -1
- package/dist/backend/backend/src/services/messaging/queue-processor.service.d.ts +6 -23
- package/dist/backend/backend/src/services/messaging/queue-processor.service.d.ts.map +1 -1
- package/dist/backend/backend/src/services/messaging/queue-processor.service.js +48 -184
- 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 +51 -5
- package/dist/backend/backend/src/services/monitoring/activity-monitor.service.js.map +1 -1
- package/dist/backend/backend/src/services/orchestrator/index.d.ts +1 -1
- package/dist/backend/backend/src/services/orchestrator/index.d.ts.map +1 -1
- package/dist/backend/backend/src/services/orchestrator/index.js +1 -1
- package/dist/backend/backend/src/services/orchestrator/index.js.map +1 -1
- package/dist/backend/backend/src/services/orchestrator/orchestrator-heartbeat-monitor.service.d.ts +65 -0
- 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 +165 -2
- package/dist/backend/backend/src/services/orchestrator/orchestrator-heartbeat-monitor.service.js.map +1 -1
- package/dist/backend/backend/src/services/orchestrator/orchestrator-status.service.d.ts +8 -0
- package/dist/backend/backend/src/services/orchestrator/orchestrator-status.service.d.ts.map +1 -1
- package/dist/backend/backend/src/services/orchestrator/orchestrator-status.service.js +23 -0
- package/dist/backend/backend/src/services/orchestrator/orchestrator-status.service.js.map +1 -1
- package/dist/backend/backend/src/services/payment/stripe.service.d.ts +95 -43
- package/dist/backend/backend/src/services/payment/stripe.service.d.ts.map +1 -1
- package/dist/backend/backend/src/services/payment/stripe.service.js +229 -190
- package/dist/backend/backend/src/services/payment/stripe.service.js.map +1 -1
- package/dist/backend/backend/src/services/pr-review/pr-review.service.d.ts +181 -0
- package/dist/backend/backend/src/services/pr-review/pr-review.service.d.ts.map +1 -0
- package/dist/backend/backend/src/services/pr-review/pr-review.service.js +336 -0
- package/dist/backend/backend/src/services/pr-review/pr-review.service.js.map +1 -0
- package/dist/backend/backend/src/services/project/task-tracking.service.d.ts +23 -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 +88 -0
- package/dist/backend/backend/src/services/project/task-tracking.service.js.map +1 -1
- package/dist/backend/backend/src/services/session/index.d.ts +2 -0
- package/dist/backend/backend/src/services/session/index.d.ts.map +1 -1
- package/dist/backend/backend/src/services/session/index.js +2 -0
- package/dist/backend/backend/src/services/session/index.js.map +1 -1
- package/dist/backend/backend/src/services/session/session-handoff.service.d.ts +294 -0
- package/dist/backend/backend/src/services/session/session-handoff.service.d.ts.map +1 -0
- package/dist/backend/backend/src/services/session/session-handoff.service.js +674 -0
- package/dist/backend/backend/src/services/session/session-handoff.service.js.map +1 -0
- package/dist/backend/backend/src/services/skill/index.d.ts +1 -0
- package/dist/backend/backend/src/services/skill/index.d.ts.map +1 -1
- package/dist/backend/backend/src/services/skill/index.js +1 -0
- package/dist/backend/backend/src/services/skill/index.js.map +1 -1
- package/dist/backend/backend/src/services/skill/skill-catalog.service.d.ts +25 -6
- package/dist/backend/backend/src/services/skill/skill-catalog.service.d.ts.map +1 -1
- package/dist/backend/backend/src/services/skill/skill-catalog.service.js +78 -20
- package/dist/backend/backend/src/services/skill/skill-catalog.service.js.map +1 -1
- package/dist/backend/backend/src/services/skill/skill-tier.service.d.ts +116 -0
- package/dist/backend/backend/src/services/skill/skill-tier.service.d.ts.map +1 -0
- package/dist/backend/backend/src/services/skill/skill-tier.service.js +155 -0
- package/dist/backend/backend/src/services/skill/skill-tier.service.js.map +1 -0
- package/dist/backend/backend/src/services/skill/skill.service.d.ts +35 -7
- package/dist/backend/backend/src/services/skill/skill.service.d.ts.map +1 -1
- package/dist/backend/backend/src/services/skill/skill.service.js +128 -35
- package/dist/backend/backend/src/services/skill/skill.service.js.map +1 -1
- package/dist/backend/backend/src/services/slack/slack-orchestrator-bridge.d.ts +50 -47
- 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 +267 -202
- package/dist/backend/backend/src/services/slack/slack-orchestrator-bridge.js.map +1 -1
- package/dist/backend/backend/src/services/slack/slack.service.d.ts +28 -2
- package/dist/backend/backend/src/services/slack/slack.service.d.ts.map +1 -1
- package/dist/backend/backend/src/services/slack/slack.service.js +69 -3
- package/dist/backend/backend/src/services/slack/slack.service.js.map +1 -1
- package/dist/backend/backend/src/services/template/template.service.d.ts +19 -1
- package/dist/backend/backend/src/services/template/template.service.d.ts.map +1 -1
- package/dist/backend/backend/src/services/template/template.service.js +110 -3
- package/dist/backend/backend/src/services/template/template.service.js.map +1 -1
- package/dist/backend/backend/src/services/whatsapp/whatsapp-orchestrator-bridge.d.ts +11 -0
- package/dist/backend/backend/src/services/whatsapp/whatsapp-orchestrator-bridge.d.ts.map +1 -1
- package/dist/backend/backend/src/services/whatsapp/whatsapp-orchestrator-bridge.js +57 -3
- package/dist/backend/backend/src/services/whatsapp/whatsapp-orchestrator-bridge.js.map +1 -1
- package/dist/backend/backend/src/services/workflow/message-scheduler.service.d.ts.map +1 -1
- package/dist/backend/backend/src/services/workflow/message-scheduler.service.js +6 -0
- package/dist/backend/backend/src/services/workflow/message-scheduler.service.js.map +1 -1
- package/dist/backend/backend/src/services/workflow/scheduler.service.d.ts +52 -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 +319 -6
- package/dist/backend/backend/src/services/workflow/scheduler.service.js.map +1 -1
- package/dist/backend/backend/src/types/chat.types.d.ts +2 -2
- package/dist/backend/backend/src/types/chat.types.d.ts.map +1 -1
- package/dist/backend/backend/src/types/chat.types.js +18 -22
- package/dist/backend/backend/src/types/chat.types.js.map +1 -1
- package/dist/backend/backend/src/types/index.d.ts +37 -0
- 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 +1 -1
- package/dist/backend/backend/src/types/marketplace.types.d.ts.map +1 -1
- package/dist/backend/backend/src/types/scheduler.types.d.ts +4 -0
- package/dist/backend/backend/src/types/scheduler.types.d.ts.map +1 -1
- package/dist/backend/backend/src/types/scheduler.types.js.map +1 -1
- package/dist/backend/backend/src/types/skill.types.d.ts +4 -0
- package/dist/backend/backend/src/types/skill.types.d.ts.map +1 -1
- package/dist/backend/backend/src/types/skill.types.js.map +1 -1
- package/dist/backend/backend/src/types/task-tracking.types.d.ts +6 -0
- 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 +2 -0
- package/dist/backend/backend/src/types/team-template.types.d.ts.map +1 -1
- package/dist/backend/backend/src/types/team-template.types.js.map +1 -1
- package/dist/backend/backend/src/utils/skill-md-parser.d.ts +38 -0
- package/dist/backend/backend/src/utils/skill-md-parser.d.ts.map +1 -0
- package/dist/backend/backend/src/utils/skill-md-parser.js +47 -0
- package/dist/backend/backend/src/utils/skill-md-parser.js.map +1 -0
- package/dist/backend/backend/src/websocket/terminal.gateway.d.ts +0 -154
- package/dist/backend/backend/src/websocket/terminal.gateway.d.ts.map +1 -1
- package/dist/backend/backend/src/websocket/terminal.gateway.js +0 -515
- package/dist/backend/backend/src/websocket/terminal.gateway.js.map +1 -1
- package/dist/backend/config/constants.d.ts +18 -3
- package/dist/backend/config/constants.d.ts.map +1 -1
- package/dist/backend/config/constants.js +18 -3
- package/dist/backend/config/constants.js.map +1 -1
- package/dist/cli/backend/src/constants.d.ts +80 -11
- package/dist/cli/backend/src/constants.d.ts.map +1 -1
- package/dist/cli/backend/src/constants.js +85 -11
- package/dist/cli/backend/src/constants.js.map +1 -1
- package/dist/cli/backend/src/services/knowledge/embedding-provider.d.ts +78 -0
- package/dist/cli/backend/src/services/knowledge/embedding-provider.d.ts.map +1 -0
- package/dist/cli/backend/src/services/knowledge/embedding-provider.js +164 -0
- package/dist/cli/backend/src/services/knowledge/embedding-provider.js.map +1 -0
- package/dist/cli/backend/src/services/knowledge/knowledge-search.service.d.ts +39 -13
- package/dist/cli/backend/src/services/knowledge/knowledge-search.service.d.ts.map +1 -1
- package/dist/cli/backend/src/services/knowledge/knowledge-search.service.js +114 -17
- package/dist/cli/backend/src/services/knowledge/knowledge-search.service.js.map +1 -1
- package/dist/cli/backend/src/services/knowledge/vector-store.service.d.ts +170 -23
- package/dist/cli/backend/src/services/knowledge/vector-store.service.d.ts.map +1 -1
- package/dist/cli/backend/src/services/knowledge/vector-store.service.js +565 -73
- package/dist/cli/backend/src/services/knowledge/vector-store.service.js.map +1 -1
- package/dist/cli/backend/src/services/memory/memory.service.d.ts +38 -0
- package/dist/cli/backend/src/services/memory/memory.service.d.ts.map +1 -1
- package/dist/cli/backend/src/services/memory/memory.service.js +121 -2
- package/dist/cli/backend/src/services/memory/memory.service.js.map +1 -1
- package/dist/cli/backend/src/types/chat.types.d.ts +2 -2
- package/dist/cli/backend/src/types/chat.types.d.ts.map +1 -1
- package/dist/cli/backend/src/types/chat.types.js +18 -22
- package/dist/cli/backend/src/types/chat.types.js.map +1 -1
- package/dist/cli/backend/src/types/index.d.ts +37 -0
- 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/scheduler.types.d.ts +4 -0
- package/dist/cli/backend/src/types/scheduler.types.d.ts.map +1 -1
- package/dist/cli/backend/src/types/scheduler.types.js.map +1 -1
- package/dist/cli/backend/src/types/skill.types.d.ts +4 -0
- package/dist/cli/backend/src/types/skill.types.d.ts.map +1 -1
- package/dist/cli/backend/src/types/skill.types.js.map +1 -1
- package/dist/cli/cli/src/commands/onboard.d.ts +19 -2
- package/dist/cli/cli/src/commands/onboard.d.ts.map +1 -1
- package/dist/cli/cli/src/commands/onboard.js +58 -15
- package/dist/cli/cli/src/commands/onboard.js.map +1 -1
- package/dist/cli/cli/src/commands/pair.d.ts +46 -0
- package/dist/cli/cli/src/commands/pair.d.ts.map +1 -0
- package/dist/cli/cli/src/commands/pair.js +258 -0
- package/dist/cli/cli/src/commands/pair.js.map +1 -0
- package/dist/cli/cli/src/commands/service.d.ts +86 -0
- package/dist/cli/cli/src/commands/service.d.ts.map +1 -0
- package/dist/cli/cli/src/commands/service.js +687 -0
- package/dist/cli/cli/src/commands/service.js.map +1 -0
- package/dist/cli/cli/src/index.js +17 -0
- package/dist/cli/cli/src/index.js.map +1 -1
- package/dist/cli/config/constants.d.ts +18 -3
- package/dist/cli/config/constants.d.ts.map +1 -1
- package/dist/cli/config/constants.js +18 -3
- package/dist/cli/config/constants.js.map +1 -1
- package/frontend/dist/assets/index-60a9e4ea.css +33 -0
- package/frontend/dist/assets/{index-e6d7db4a.js → index-e8162966.js} +353 -353
- package/frontend/dist/index.html +2 -2
- package/package.json +22 -10
- package/config/skills/agent/browse-stealth/skill.json +0 -20
- package/config/skills/agent/competitor-content-tracker/skill.json +0 -22
- package/config/skills/agent/computer-use/skill.json +0 -29
- package/config/skills/agent/content-calendar/skill.json +0 -22
- package/config/skills/agent/content-repurposer/skill.json +0 -22
- package/config/skills/agent/content-writer/skill.json +0 -22
- package/config/skills/agent/core/accept-task/skill.json +0 -20
- package/config/skills/agent/core/block-task/skill.json +0 -20
- package/config/skills/agent/core/check-quality-gates/skill.json +0 -20
- package/config/skills/agent/core/complete-task/skill.json +0 -20
- package/config/skills/agent/core/generate-pdf/skill.json +0 -20
- package/config/skills/agent/core/get-my-context/skill.json +0 -20
- package/config/skills/agent/core/get-sops/skill.json +0 -20
- package/config/skills/agent/core/get-team-status/instructions.md +0 -17
- package/config/skills/agent/core/get-team-status/skill.json +0 -20
- package/config/skills/agent/core/heartbeat/skill.json +0 -20
- package/config/skills/agent/core/marketplace-search/skill.json +0 -20
- package/config/skills/agent/core/query-knowledge/skill.json +0 -20
- package/config/skills/agent/core/read-task/instructions.md +0 -19
- package/config/skills/agent/core/read-task/skill.json +0 -20
- package/config/skills/agent/core/recall/skill.json +0 -20
- package/config/skills/agent/core/record-learning/skill.json +0 -20
- package/config/skills/agent/core/register-self/instructions.md +0 -18
- package/config/skills/agent/core/register-self/skill.json +0 -20
- package/config/skills/agent/core/remember/skill.json +0 -20
- package/config/skills/agent/core/reply-chat/skill.json +0 -20
- package/config/skills/agent/core/report-progress/skill.json +0 -20
- package/config/skills/agent/core/report-status/skill.json +0 -20
- package/config/skills/agent/core/send-chat-response/skill.json +0 -20
- package/config/skills/agent/core/send-message/instructions.md +0 -20
- package/config/skills/agent/core/send-message/skill.json +0 -20
- package/config/skills/agent/desktop-app-control/skill.json +0 -33
- package/config/skills/agent/trend-monitor/skill.json +0 -22
- package/config/skills/agent/vnc-browser/skill.json +0 -20
- package/config/skills/orchestrator/assign-task/instructions.md +0 -17
- package/config/skills/orchestrator/assign-task/skill.json +0 -20
- package/config/skills/orchestrator/assign-team-to-project/skill.json +0 -20
- package/config/skills/orchestrator/broadcast/skill.json +0 -20
- package/config/skills/orchestrator/broadcast-to-org/skill.json +0 -20
- package/config/skills/orchestrator/cancel-all-schedules/skill.json +0 -17
- package/config/skills/orchestrator/cancel-schedule/instructions.md +0 -19
- package/config/skills/orchestrator/cancel-schedule/skill.json +0 -20
- package/config/skills/orchestrator/complete-task/instructions.md +0 -17
- package/config/skills/orchestrator/complete-task/skill.json +0 -20
- package/config/skills/orchestrator/create-project/skill.json +0 -20
- package/config/skills/orchestrator/create-team/skill.json +0 -20
- package/config/skills/orchestrator/delegate-task/skill.json +0 -20
- package/config/skills/orchestrator/get-agent-logs/skill.json +0 -20
- package/config/skills/orchestrator/get-agent-status/skill.json +0 -20
- package/config/skills/orchestrator/get-project-overview/instructions.md +0 -17
- package/config/skills/orchestrator/get-project-overview/skill.json +0 -20
- package/config/skills/orchestrator/get-tasks/instructions.md +0 -17
- package/config/skills/orchestrator/get-tasks/skill.json +0 -20
- package/config/skills/orchestrator/get-team-status/instructions.md +0 -17
- package/config/skills/orchestrator/get-team-status/skill.json +0 -20
- package/config/skills/orchestrator/handle-agent-failure/skill.json +0 -20
- package/config/skills/orchestrator/heartbeat/skill.json +0 -20
- package/config/skills/orchestrator/list-schedules/skill.json +0 -12
- package/config/skills/orchestrator/list-subscriptions/instructions.md +0 -17
- package/config/skills/orchestrator/list-subscriptions/skill.json +0 -20
- package/config/skills/orchestrator/query-knowledge/skill.json +0 -20
- package/config/skills/orchestrator/read-session-logs/skill.json +0 -20
- package/config/skills/orchestrator/read-system-logs/skill.json +0 -20
- package/config/skills/orchestrator/recall/skill.json +0 -20
- package/config/skills/orchestrator/record-failure/skill.json +0 -20
- package/config/skills/orchestrator/record-learning/skill.json +0 -20
- package/config/skills/orchestrator/record-success/skill.json +0 -20
- package/config/skills/orchestrator/register-self/skill.json +0 -20
- package/config/skills/orchestrator/remember/skill.json +0 -20
- package/config/skills/orchestrator/reply-chat/skill.json +0 -20
- package/config/skills/orchestrator/reply-gchat/skill.json +0 -20
- package/config/skills/orchestrator/reply-slack/skill.json +0 -20
- package/config/skills/orchestrator/report-bug/skill.json +0 -20
- package/config/skills/orchestrator/restart-crewly/skill.json +0 -20
- package/config/skills/orchestrator/resume-session/skill.json +0 -20
- package/config/skills/orchestrator/schedule-check/skill.json +0 -20
- package/config/skills/orchestrator/send-key/skill.json +0 -20
- package/config/skills/orchestrator/send-message/skill.json +0 -20
- package/config/skills/orchestrator/send-pdf-to-slack/skill.json +0 -20
- package/config/skills/orchestrator/set-goal/skill.json +0 -20
- package/config/skills/orchestrator/start-agent/skill.json +0 -20
- package/config/skills/orchestrator/start-team/skill.json +0 -20
- package/config/skills/orchestrator/stop-agent/skill.json +0 -20
- package/config/skills/orchestrator/stop-team/instructions.md +0 -19
- package/config/skills/orchestrator/stop-team/skill.json +0 -20
- package/config/skills/orchestrator/subscribe-event/skill.json +0 -20
- package/config/skills/orchestrator/terminate-agent/skill.json +0 -20
- package/config/skills/orchestrator/unsubscribe-event/instructions.md +0 -19
- package/config/skills/orchestrator/unsubscribe-event/skill.json +0 -20
- package/config/skills/orchestrator/update-focus/skill.json +0 -20
- package/config/skills/orchestrator/update-team/skill.json +0 -20
- package/config/skills/team-leader/aggregate-results/skill.json +0 -20
- package/config/skills/team-leader/decompose-goal/skill.json +0 -20
- package/config/skills/team-leader/delegate-task/skill.json +0 -20
- package/config/skills/team-leader/handle-failure/skill.json +0 -20
- package/config/skills/team-leader/schedule-check/skill.json +0 -20
- package/config/skills/team-leader/start-agent/skill.json +0 -20
- package/config/skills/team-leader/stop-agent/skill.json +0 -20
- package/config/skills/team-leader/verify-output/skill.json +0 -20
- package/frontend/dist/assets/index-0e5673b0.css +0 -33
|
@@ -0,0 +1,674 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Session Handoff Service
|
|
3
|
+
*
|
|
4
|
+
* Generates a structured session summary on shutdown and pushes it to agents
|
|
5
|
+
* on restart. Replaces the old Slack-only pushRecentSlackHistory approach with
|
|
6
|
+
* a channel-agnostic summary that covers Slack, Google Chat, and Chat UI.
|
|
7
|
+
*
|
|
8
|
+
* Summary is stored at ~/.crewly/session-summaries/latest.md and is limited
|
|
9
|
+
* to 50 lines for prompt-budget friendliness.
|
|
10
|
+
*
|
|
11
|
+
* @module services/session/session-handoff.service
|
|
12
|
+
*/
|
|
13
|
+
import * as fs from 'fs/promises';
|
|
14
|
+
import * as path from 'path';
|
|
15
|
+
import * as os from 'os';
|
|
16
|
+
import { LoggerService } from '../core/logger.service.js';
|
|
17
|
+
import { CREWLY_CONSTANTS, SLACK_THREAD_CONSTANTS, GCHAT_THREAD_CONSTANTS } from '../../constants.js';
|
|
18
|
+
import { RUNTIME_TYPES } from '../../constants.js';
|
|
19
|
+
/** Maximum number of lines the summary may contain */
|
|
20
|
+
const MAX_SUMMARY_LINES = 80;
|
|
21
|
+
/** Maximum number of pending tasks to include in the summary */
|
|
22
|
+
const MAX_PENDING_TASKS = 10;
|
|
23
|
+
/** Maximum age in ms for a thread to be considered for resume notification (24 hours) */
|
|
24
|
+
const RESUME_MAX_AGE_MS = 24 * 60 * 60 * 1000;
|
|
25
|
+
/** Maximum number of recent user messages to include per thread */
|
|
26
|
+
const MAX_MESSAGES_PER_THREAD = 3;
|
|
27
|
+
/** Maximum number of active threads to include in the summary */
|
|
28
|
+
const MAX_ACTIVE_THREADS = 6;
|
|
29
|
+
/** Directory name for session summaries under crewly home */
|
|
30
|
+
const SUMMARIES_DIR = 'session-summaries';
|
|
31
|
+
/** Summary filename */
|
|
32
|
+
const LATEST_SUMMARY = 'latest.md';
|
|
33
|
+
/**
|
|
34
|
+
* Manages generation of session summaries on shutdown and delivery on restart.
|
|
35
|
+
*
|
|
36
|
+
* @example
|
|
37
|
+
* ```typescript
|
|
38
|
+
* const handoff = SessionHandoffService.getInstance();
|
|
39
|
+
*
|
|
40
|
+
* // On shutdown:
|
|
41
|
+
* await handoff.generateSummary(storageService);
|
|
42
|
+
*
|
|
43
|
+
* // On agent registration:
|
|
44
|
+
* await handoff.pushSessionSummary(agentService, 'crewly-orc');
|
|
45
|
+
* ```
|
|
46
|
+
*/
|
|
47
|
+
export class SessionHandoffService {
|
|
48
|
+
static instance = null;
|
|
49
|
+
logger = LoggerService.getInstance().createComponentLogger('SessionHandoffService');
|
|
50
|
+
constructor() { }
|
|
51
|
+
/**
|
|
52
|
+
* Gets the singleton instance.
|
|
53
|
+
*
|
|
54
|
+
* @returns SessionHandoffService instance
|
|
55
|
+
*/
|
|
56
|
+
static getInstance() {
|
|
57
|
+
if (!SessionHandoffService.instance) {
|
|
58
|
+
SessionHandoffService.instance = new SessionHandoffService();
|
|
59
|
+
}
|
|
60
|
+
return SessionHandoffService.instance;
|
|
61
|
+
}
|
|
62
|
+
/**
|
|
63
|
+
* Resets the singleton instance (for testing).
|
|
64
|
+
*/
|
|
65
|
+
static resetInstance() {
|
|
66
|
+
SessionHandoffService.instance = null;
|
|
67
|
+
}
|
|
68
|
+
/**
|
|
69
|
+
* Returns the directory path for session summaries.
|
|
70
|
+
*
|
|
71
|
+
* @returns Absolute path to ~/.crewly/session-summaries/
|
|
72
|
+
*/
|
|
73
|
+
getSummariesDir() {
|
|
74
|
+
return path.join(os.homedir(), CREWLY_CONSTANTS.PATHS.CREWLY_HOME, SUMMARIES_DIR);
|
|
75
|
+
}
|
|
76
|
+
/**
|
|
77
|
+
* Returns the path to the latest summary file.
|
|
78
|
+
*
|
|
79
|
+
* @returns Absolute path to ~/.crewly/session-summaries/latest.md
|
|
80
|
+
*/
|
|
81
|
+
getLatestSummaryPath() {
|
|
82
|
+
return path.join(this.getSummariesDir(), LATEST_SUMMARY);
|
|
83
|
+
}
|
|
84
|
+
/**
|
|
85
|
+
* Scans a thread directory for the most recently modified .md files.
|
|
86
|
+
* Works for both Slack (~/.crewly/slack-threads/) and GChat (~/.crewly/gchat-threads/).
|
|
87
|
+
*
|
|
88
|
+
* @param baseDir - Base directory to scan (e.g., ~/.crewly/slack-threads/)
|
|
89
|
+
* @param channelType - Type of channel ('slack' or 'gchat')
|
|
90
|
+
* @param maxThreads - Maximum number of threads to return
|
|
91
|
+
* @returns Array of ActiveThread info sorted by recency
|
|
92
|
+
*/
|
|
93
|
+
async scanThreadDirectory(baseDir, channelType, maxThreads = MAX_ACTIVE_THREADS) {
|
|
94
|
+
const threads = [];
|
|
95
|
+
try {
|
|
96
|
+
const entries = await fs.readdir(baseDir).catch(() => []);
|
|
97
|
+
// Collect all .md files across subdirectories
|
|
98
|
+
const candidates = [];
|
|
99
|
+
for (const entry of entries) {
|
|
100
|
+
if (entry.endsWith('.json'))
|
|
101
|
+
continue; // Skip index files
|
|
102
|
+
const entryPath = path.join(baseDir, entry);
|
|
103
|
+
const stat = await fs.stat(entryPath).catch(() => null);
|
|
104
|
+
if (stat?.isDirectory()) {
|
|
105
|
+
const files = await fs.readdir(entryPath).catch(() => []);
|
|
106
|
+
for (const file of files) {
|
|
107
|
+
if (!file.endsWith('.md'))
|
|
108
|
+
continue;
|
|
109
|
+
const filePath = path.join(entryPath, file);
|
|
110
|
+
const fileStat = await fs.stat(filePath).catch(() => null);
|
|
111
|
+
if (fileStat) {
|
|
112
|
+
candidates.push({ filePath, channelId: entry, mtimeMs: fileStat.mtimeMs });
|
|
113
|
+
}
|
|
114
|
+
}
|
|
115
|
+
}
|
|
116
|
+
}
|
|
117
|
+
// Sort by modification time (most recent first) and take top N
|
|
118
|
+
candidates.sort((a, b) => b.mtimeMs - a.mtimeMs);
|
|
119
|
+
for (const candidate of candidates.slice(0, maxThreads)) {
|
|
120
|
+
const recentMessages = await this.extractRecentMessages(candidate.filePath);
|
|
121
|
+
threads.push({
|
|
122
|
+
channelType,
|
|
123
|
+
channelId: candidate.channelId,
|
|
124
|
+
filePath: candidate.filePath,
|
|
125
|
+
lastActiveAt: new Date(candidate.mtimeMs).toISOString(),
|
|
126
|
+
recentMessages,
|
|
127
|
+
});
|
|
128
|
+
}
|
|
129
|
+
}
|
|
130
|
+
catch (error) {
|
|
131
|
+
this.logger.debug('Failed to scan thread directory', {
|
|
132
|
+
baseDir,
|
|
133
|
+
error: error instanceof Error ? error.message : String(error),
|
|
134
|
+
});
|
|
135
|
+
}
|
|
136
|
+
return threads;
|
|
137
|
+
}
|
|
138
|
+
/**
|
|
139
|
+
* Scans Chat UI conversation storage for active conversations.
|
|
140
|
+
*
|
|
141
|
+
* @param chatDir - Path to chat storage directory (default: ~/.crewly/chat/)
|
|
142
|
+
* @param maxConversations - Maximum number of conversations to return
|
|
143
|
+
* @returns Array of ActiveThread info for Chat UI conversations
|
|
144
|
+
*/
|
|
145
|
+
async scanChatUiConversations(chatDir, maxConversations = MAX_ACTIVE_THREADS) {
|
|
146
|
+
const threads = [];
|
|
147
|
+
const dir = chatDir || path.join(os.homedir(), CREWLY_CONSTANTS.PATHS.CREWLY_HOME, 'chat');
|
|
148
|
+
try {
|
|
149
|
+
const files = await fs.readdir(dir).catch(() => []);
|
|
150
|
+
const jsonFiles = files.filter(f => f.endsWith('.json'));
|
|
151
|
+
const candidates = [];
|
|
152
|
+
for (const file of jsonFiles) {
|
|
153
|
+
const filePath = path.join(dir, file);
|
|
154
|
+
const stat = await fs.stat(filePath).catch(() => null);
|
|
155
|
+
if (stat) {
|
|
156
|
+
candidates.push({ filePath, id: file.replace('.json', ''), mtimeMs: stat.mtimeMs });
|
|
157
|
+
}
|
|
158
|
+
}
|
|
159
|
+
candidates.sort((a, b) => b.mtimeMs - a.mtimeMs);
|
|
160
|
+
for (const candidate of candidates.slice(0, maxConversations)) {
|
|
161
|
+
const recentMessages = await this.extractChatUiMessages(candidate.filePath);
|
|
162
|
+
threads.push({
|
|
163
|
+
channelType: 'chat-ui',
|
|
164
|
+
channelId: candidate.id,
|
|
165
|
+
filePath: candidate.filePath,
|
|
166
|
+
lastActiveAt: new Date(candidate.mtimeMs).toISOString(),
|
|
167
|
+
recentMessages,
|
|
168
|
+
});
|
|
169
|
+
}
|
|
170
|
+
}
|
|
171
|
+
catch (error) {
|
|
172
|
+
this.logger.debug('Failed to scan Chat UI conversations', {
|
|
173
|
+
error: error instanceof Error ? error.message : String(error),
|
|
174
|
+
});
|
|
175
|
+
}
|
|
176
|
+
return threads;
|
|
177
|
+
}
|
|
178
|
+
/**
|
|
179
|
+
* Extracts recent message summaries from a markdown thread file.
|
|
180
|
+
* Reads the last few message blocks (lines starting with **Name**).
|
|
181
|
+
*
|
|
182
|
+
* @param filePath - Absolute path to the thread .md file
|
|
183
|
+
* @returns Array of recent message summary strings
|
|
184
|
+
*/
|
|
185
|
+
async extractRecentMessages(filePath) {
|
|
186
|
+
try {
|
|
187
|
+
const content = await fs.readFile(filePath, 'utf-8');
|
|
188
|
+
// Skip frontmatter
|
|
189
|
+
const frontmatterEnd = content.indexOf('---', content.indexOf('---') + 3);
|
|
190
|
+
const body = frontmatterEnd > 0 ? content.slice(frontmatterEnd + 3).trim() : content;
|
|
191
|
+
// Extract lines that look like message headers (e.g., "**Steve** (2025-03-16 12:00):")
|
|
192
|
+
const messagePattern = /^\*\*(.+?)\*\*\s*\(([^)]+)\):\s*$/;
|
|
193
|
+
const lines = body.split('\n');
|
|
194
|
+
const messages = [];
|
|
195
|
+
for (let i = 0; i < lines.length; i++) {
|
|
196
|
+
const match = lines[i].match(messagePattern);
|
|
197
|
+
if (match) {
|
|
198
|
+
const sender = match[1];
|
|
199
|
+
// Grab the next non-empty line as content preview
|
|
200
|
+
let preview = '';
|
|
201
|
+
for (let j = i + 1; j < Math.min(i + 4, lines.length); j++) {
|
|
202
|
+
const trimmed = lines[j].trim();
|
|
203
|
+
if (trimmed && !trimmed.startsWith('**')) {
|
|
204
|
+
preview = trimmed.slice(0, 120);
|
|
205
|
+
break;
|
|
206
|
+
}
|
|
207
|
+
}
|
|
208
|
+
messages.push(`${sender}: ${preview || '(empty)'}`);
|
|
209
|
+
}
|
|
210
|
+
}
|
|
211
|
+
return messages.slice(-MAX_MESSAGES_PER_THREAD);
|
|
212
|
+
}
|
|
213
|
+
catch {
|
|
214
|
+
return [];
|
|
215
|
+
}
|
|
216
|
+
}
|
|
217
|
+
/**
|
|
218
|
+
* Extracts recent messages from a Chat UI JSON conversation file.
|
|
219
|
+
*
|
|
220
|
+
* @param filePath - Absolute path to the conversation .json file
|
|
221
|
+
* @returns Array of recent message summary strings
|
|
222
|
+
*/
|
|
223
|
+
async extractChatUiMessages(filePath) {
|
|
224
|
+
try {
|
|
225
|
+
const raw = await fs.readFile(filePath, 'utf-8');
|
|
226
|
+
const data = JSON.parse(raw);
|
|
227
|
+
if (!data.messages || data.messages.length === 0)
|
|
228
|
+
return [];
|
|
229
|
+
return data.messages
|
|
230
|
+
.slice(-MAX_MESSAGES_PER_THREAD)
|
|
231
|
+
.map(m => {
|
|
232
|
+
const sender = m.from?.name || m.from?.type || 'unknown';
|
|
233
|
+
const content = (m.content || '').slice(0, 120);
|
|
234
|
+
return `${sender}: ${content || '(empty)'}`;
|
|
235
|
+
});
|
|
236
|
+
}
|
|
237
|
+
catch {
|
|
238
|
+
return [];
|
|
239
|
+
}
|
|
240
|
+
}
|
|
241
|
+
/**
|
|
242
|
+
* Collects active agent info from team storage.
|
|
243
|
+
*
|
|
244
|
+
* @param teamReader - Service to read team data
|
|
245
|
+
* @returns Array of active agent info
|
|
246
|
+
*/
|
|
247
|
+
async collectActiveAgents(teamReader) {
|
|
248
|
+
const agents = [];
|
|
249
|
+
try {
|
|
250
|
+
const teams = await teamReader.getTeams();
|
|
251
|
+
for (const team of teams) {
|
|
252
|
+
for (const member of team.members) {
|
|
253
|
+
if (member.agentStatus === 'active' || member.agentStatus === 'started') {
|
|
254
|
+
agents.push({
|
|
255
|
+
sessionName: member.sessionName,
|
|
256
|
+
role: member.role,
|
|
257
|
+
workingStatus: member.workingStatus || 'idle',
|
|
258
|
+
currentTask: member.currentTickets?.[0],
|
|
259
|
+
});
|
|
260
|
+
}
|
|
261
|
+
}
|
|
262
|
+
}
|
|
263
|
+
}
|
|
264
|
+
catch (error) {
|
|
265
|
+
this.logger.debug('Failed to collect active agents', {
|
|
266
|
+
error: error instanceof Error ? error.message : String(error),
|
|
267
|
+
});
|
|
268
|
+
}
|
|
269
|
+
return agents;
|
|
270
|
+
}
|
|
271
|
+
/**
|
|
272
|
+
* Scans .crewly/tasks/delegated/ for non-completed tasks (open + in_progress).
|
|
273
|
+
* Parses each task MD file to extract title, assignee, status, and priority.
|
|
274
|
+
*
|
|
275
|
+
* @param tasksBaseDir - Override for the tasks base directory (for testing)
|
|
276
|
+
* @returns Array of PendingTaskInfo sorted by priority (high first)
|
|
277
|
+
*/
|
|
278
|
+
async scanPendingTasks(tasksBaseDir) {
|
|
279
|
+
const baseDir = tasksBaseDir || path.join(os.homedir(), CREWLY_CONSTANTS.PATHS.CREWLY_HOME, 'tasks', 'delegated');
|
|
280
|
+
const pendingTasks = [];
|
|
281
|
+
const statusDirs = ['in_progress', 'open'];
|
|
282
|
+
for (const statusDir of statusDirs) {
|
|
283
|
+
const dirPath = path.join(baseDir, statusDir);
|
|
284
|
+
try {
|
|
285
|
+
const files = await fs.readdir(dirPath).catch(() => []);
|
|
286
|
+
for (const file of files) {
|
|
287
|
+
if (!file.endsWith('.md'))
|
|
288
|
+
continue;
|
|
289
|
+
const filePath = path.join(dirPath, file);
|
|
290
|
+
const task = await this.parseTaskFile(filePath, statusDir);
|
|
291
|
+
if (task) {
|
|
292
|
+
pendingTasks.push(task);
|
|
293
|
+
}
|
|
294
|
+
}
|
|
295
|
+
}
|
|
296
|
+
catch (error) {
|
|
297
|
+
this.logger.debug('Failed to scan tasks directory', {
|
|
298
|
+
dirPath,
|
|
299
|
+
error: error instanceof Error ? error.message : String(error),
|
|
300
|
+
});
|
|
301
|
+
}
|
|
302
|
+
}
|
|
303
|
+
// Sort: in_progress first, then high priority first
|
|
304
|
+
const priorityOrder = { high: 0, medium: 1, low: 2 };
|
|
305
|
+
const statusOrder = { in_progress: 0, open: 1 };
|
|
306
|
+
pendingTasks.sort((a, b) => {
|
|
307
|
+
const statusDiff = (statusOrder[a.status] ?? 1) - (statusOrder[b.status] ?? 1);
|
|
308
|
+
if (statusDiff !== 0)
|
|
309
|
+
return statusDiff;
|
|
310
|
+
return (priorityOrder[a.priority] ?? 1) - (priorityOrder[b.priority] ?? 1);
|
|
311
|
+
});
|
|
312
|
+
return pendingTasks.slice(0, MAX_PENDING_TASKS);
|
|
313
|
+
}
|
|
314
|
+
/**
|
|
315
|
+
* Parses a single task MD file to extract structured info.
|
|
316
|
+
*
|
|
317
|
+
* @param filePath - Absolute path to the task .md file
|
|
318
|
+
* @param statusDir - Directory name indicating status ('open', 'in_progress')
|
|
319
|
+
* @returns PendingTaskInfo or null if parsing fails
|
|
320
|
+
*/
|
|
321
|
+
async parseTaskFile(filePath, statusDir) {
|
|
322
|
+
try {
|
|
323
|
+
const content = await fs.readFile(filePath, 'utf-8');
|
|
324
|
+
const lines = content.split('\n');
|
|
325
|
+
// Extract title from first heading
|
|
326
|
+
let title = path.basename(filePath, '.md');
|
|
327
|
+
for (const line of lines) {
|
|
328
|
+
if (line.startsWith('# ')) {
|
|
329
|
+
title = line.replace(/^#\s+/, '').trim();
|
|
330
|
+
// Strip [TASK] prefix if present
|
|
331
|
+
title = title.replace(/^\[TASK\]\s*/i, '');
|
|
332
|
+
break;
|
|
333
|
+
}
|
|
334
|
+
}
|
|
335
|
+
// Truncate long titles
|
|
336
|
+
if (title.length > 100) {
|
|
337
|
+
title = title.slice(0, 97) + '...';
|
|
338
|
+
}
|
|
339
|
+
// Extract assigned agent
|
|
340
|
+
let assignedTo = 'unassigned';
|
|
341
|
+
const assignedMatch = content.match(/\*\*Assigned to\*\*:\s*(.+)/i)
|
|
342
|
+
|| content.match(/Assignee:\s*(.+)/i);
|
|
343
|
+
if (assignedMatch) {
|
|
344
|
+
assignedTo = assignedMatch[1].trim();
|
|
345
|
+
}
|
|
346
|
+
// Extract priority
|
|
347
|
+
let priority = 'medium';
|
|
348
|
+
const priorityMatch = content.match(/\*\*Priority\*\*:\s*(.+)/i)
|
|
349
|
+
|| content.match(/Priority:\s*(.+)/i);
|
|
350
|
+
if (priorityMatch) {
|
|
351
|
+
priority = priorityMatch[1].trim().toLowerCase();
|
|
352
|
+
}
|
|
353
|
+
// Status from directory name
|
|
354
|
+
const status = statusDir === 'in_progress' ? 'in_progress' : 'open';
|
|
355
|
+
return { title, assignedTo, status, priority, filePath };
|
|
356
|
+
}
|
|
357
|
+
catch {
|
|
358
|
+
return null;
|
|
359
|
+
}
|
|
360
|
+
}
|
|
361
|
+
/**
|
|
362
|
+
* Generates a full session handoff summary by scanning all thread stores
|
|
363
|
+
* and collecting active agent status. Saves to ~/.crewly/session-summaries/latest.md.
|
|
364
|
+
*
|
|
365
|
+
* @param teamReader - Service to read team data for agent status
|
|
366
|
+
* @param tasksBaseDir - Override for the tasks base directory (for testing)
|
|
367
|
+
* @returns The generated summary data
|
|
368
|
+
*/
|
|
369
|
+
async generateSummary(teamReader, tasksBaseDir) {
|
|
370
|
+
this.logger.info('Generating session handoff summary...');
|
|
371
|
+
const crewlyHome = path.join(os.homedir(), CREWLY_CONSTANTS.PATHS.CREWLY_HOME);
|
|
372
|
+
// Scan all thread stores and pending tasks in parallel
|
|
373
|
+
const [slackThreads, gchatThreads, chatUiThreads, activeAgents, pendingTasks] = await Promise.all([
|
|
374
|
+
this.scanThreadDirectory(path.join(crewlyHome, SLACK_THREAD_CONSTANTS.STORAGE_DIR), 'slack', 3),
|
|
375
|
+
this.scanThreadDirectory(path.join(crewlyHome, GCHAT_THREAD_CONSTANTS.STORAGE_DIR), 'gchat', 3),
|
|
376
|
+
this.scanChatUiConversations(undefined, 2),
|
|
377
|
+
this.collectActiveAgents(teamReader),
|
|
378
|
+
this.scanPendingTasks(tasksBaseDir),
|
|
379
|
+
]);
|
|
380
|
+
const allThreads = [...slackThreads, ...gchatThreads, ...chatUiThreads]
|
|
381
|
+
.sort((a, b) => new Date(b.lastActiveAt).getTime() - new Date(a.lastActiveAt).getTime())
|
|
382
|
+
.slice(0, MAX_ACTIVE_THREADS);
|
|
383
|
+
const summary = {
|
|
384
|
+
generatedAt: new Date().toISOString(),
|
|
385
|
+
activeThreads: allThreads,
|
|
386
|
+
activeAgents,
|
|
387
|
+
pendingTasks,
|
|
388
|
+
};
|
|
389
|
+
// Format and save
|
|
390
|
+
const markdown = this.formatSummaryMarkdown(summary);
|
|
391
|
+
const summariesDir = this.getSummariesDir();
|
|
392
|
+
await fs.mkdir(summariesDir, { recursive: true });
|
|
393
|
+
await fs.writeFile(this.getLatestSummaryPath(), markdown, 'utf-8');
|
|
394
|
+
this.logger.info('Session handoff summary saved', {
|
|
395
|
+
threadCount: allThreads.length,
|
|
396
|
+
agentCount: activeAgents.length,
|
|
397
|
+
pendingTaskCount: pendingTasks.length,
|
|
398
|
+
path: this.getLatestSummaryPath(),
|
|
399
|
+
});
|
|
400
|
+
return summary;
|
|
401
|
+
}
|
|
402
|
+
/**
|
|
403
|
+
* Formats a HandoffSummary into a markdown string, capped at MAX_SUMMARY_LINES.
|
|
404
|
+
*
|
|
405
|
+
* @param summary - The summary data
|
|
406
|
+
* @returns Markdown string
|
|
407
|
+
*/
|
|
408
|
+
formatSummaryMarkdown(summary) {
|
|
409
|
+
const lines = [];
|
|
410
|
+
lines.push('# Session Handoff Summary');
|
|
411
|
+
lines.push(`Generated: ${summary.generatedAt}`);
|
|
412
|
+
lines.push('');
|
|
413
|
+
// Active threads section
|
|
414
|
+
if (summary.activeThreads.length > 0) {
|
|
415
|
+
lines.push('## Active Conversations');
|
|
416
|
+
for (const thread of summary.activeThreads) {
|
|
417
|
+
lines.push(`### ${thread.channelType.toUpperCase()} — ${thread.channelId}`);
|
|
418
|
+
lines.push(`- File: \`${thread.filePath}\``);
|
|
419
|
+
lines.push(`- Last active: ${thread.lastActiveAt}`);
|
|
420
|
+
if (thread.recentMessages.length > 0) {
|
|
421
|
+
lines.push('- Recent:');
|
|
422
|
+
for (const msg of thread.recentMessages) {
|
|
423
|
+
lines.push(` - ${msg}`);
|
|
424
|
+
}
|
|
425
|
+
}
|
|
426
|
+
lines.push('');
|
|
427
|
+
}
|
|
428
|
+
}
|
|
429
|
+
else {
|
|
430
|
+
lines.push('## Active Conversations');
|
|
431
|
+
lines.push('No active conversations found.');
|
|
432
|
+
lines.push('');
|
|
433
|
+
}
|
|
434
|
+
// Active agents section
|
|
435
|
+
if (summary.activeAgents.length > 0) {
|
|
436
|
+
lines.push('## Active Agents');
|
|
437
|
+
for (const agent of summary.activeAgents) {
|
|
438
|
+
const taskInfo = agent.currentTask ? ` — task: ${agent.currentTask}` : '';
|
|
439
|
+
lines.push(`- **${agent.sessionName}** (${agent.role}): ${agent.workingStatus}${taskInfo}`);
|
|
440
|
+
}
|
|
441
|
+
lines.push('');
|
|
442
|
+
}
|
|
443
|
+
// Pending tasks section
|
|
444
|
+
if (summary.pendingTasks && summary.pendingTasks.length > 0) {
|
|
445
|
+
lines.push('## Pending Tasks');
|
|
446
|
+
lines.push(`${summary.pendingTasks.length} task(s) require attention after restart:`);
|
|
447
|
+
lines.push('');
|
|
448
|
+
for (const task of summary.pendingTasks) {
|
|
449
|
+
const statusLabel = task.status === 'in_progress' ? '🔄 IN PROGRESS' : '📋 OPEN';
|
|
450
|
+
lines.push(`- ${statusLabel} [${task.priority}] **${task.title}**`);
|
|
451
|
+
lines.push(` - Assigned to: ${task.assignedTo}`);
|
|
452
|
+
lines.push(` - File: \`${task.filePath}\``);
|
|
453
|
+
}
|
|
454
|
+
lines.push('');
|
|
455
|
+
}
|
|
456
|
+
// Truncate to max lines
|
|
457
|
+
return lines.slice(0, MAX_SUMMARY_LINES).join('\n');
|
|
458
|
+
}
|
|
459
|
+
/**
|
|
460
|
+
* Pushes the latest session summary to an agent after registration.
|
|
461
|
+
* Replaces the old pushRecentSlackHistory function.
|
|
462
|
+
*
|
|
463
|
+
* Reads ~/.crewly/session-summaries/latest.md and sends it as a
|
|
464
|
+
* [SESSION_CONTEXT] system message. Only sends if the summary exists
|
|
465
|
+
* and is non-empty.
|
|
466
|
+
*
|
|
467
|
+
* @param agentService - Service to send messages to agents
|
|
468
|
+
* @param sessionName - Target agent session name
|
|
469
|
+
*/
|
|
470
|
+
async pushSessionSummary(agentService, sessionName) {
|
|
471
|
+
const summaryPath = this.getLatestSummaryPath();
|
|
472
|
+
try {
|
|
473
|
+
const content = await fs.readFile(summaryPath, 'utf-8');
|
|
474
|
+
if (!content || content.trim().length === 0) {
|
|
475
|
+
this.logger.debug('No session summary to push', { sessionName });
|
|
476
|
+
return;
|
|
477
|
+
}
|
|
478
|
+
const message = `[SESSION_CONTEXT] Previous session context for restart recovery:\n\n${content.trim()}`;
|
|
479
|
+
await agentService.sendMessageToAgent(sessionName, message, RUNTIME_TYPES.CLAUDE_CODE);
|
|
480
|
+
this.logger.info('Pushed session summary to agent', {
|
|
481
|
+
sessionName,
|
|
482
|
+
summaryLength: content.length,
|
|
483
|
+
});
|
|
484
|
+
}
|
|
485
|
+
catch (error) {
|
|
486
|
+
this.logger.warn('Failed to push session summary', {
|
|
487
|
+
sessionName,
|
|
488
|
+
error: error instanceof Error ? error.message : String(error),
|
|
489
|
+
});
|
|
490
|
+
}
|
|
491
|
+
}
|
|
492
|
+
/**
|
|
493
|
+
* Scans a thread directory (Slack or GChat format) for threads modified within maxAge.
|
|
494
|
+
* Filters by file modification time and returns ResumeThread objects.
|
|
495
|
+
*
|
|
496
|
+
* @param baseDir - Directory to scan (e.g., ~/.crewly/slack-threads/)
|
|
497
|
+
* @param channelType - Channel type ('slack' or 'gchat')
|
|
498
|
+
* @param cutoffMs - Cutoff timestamp in ms (threads older than this are excluded)
|
|
499
|
+
* @returns Array of ResumeThread for qualifying threads
|
|
500
|
+
*/
|
|
501
|
+
async scanRecentMdThreads(baseDir, channelType, cutoffMs) {
|
|
502
|
+
const threads = [];
|
|
503
|
+
try {
|
|
504
|
+
const entries = await fs.readdir(baseDir).catch(() => []);
|
|
505
|
+
for (const entry of entries) {
|
|
506
|
+
if (entry.endsWith('.json'))
|
|
507
|
+
continue;
|
|
508
|
+
const channelDir = path.join(baseDir, entry);
|
|
509
|
+
const stat = await fs.stat(channelDir).catch(() => null);
|
|
510
|
+
if (!stat?.isDirectory())
|
|
511
|
+
continue;
|
|
512
|
+
const files = await fs.readdir(channelDir).catch(() => []);
|
|
513
|
+
for (const file of files) {
|
|
514
|
+
if (!file.endsWith('.md'))
|
|
515
|
+
continue;
|
|
516
|
+
const filePath = path.join(channelDir, file);
|
|
517
|
+
const fileStat = await fs.stat(filePath).catch(() => null);
|
|
518
|
+
if (!fileStat || fileStat.mtimeMs < cutoffMs)
|
|
519
|
+
continue;
|
|
520
|
+
const threadId = file.replace('.md', '');
|
|
521
|
+
const recentMessages = await this.extractRecentMessages(filePath);
|
|
522
|
+
threads.push({
|
|
523
|
+
channelType,
|
|
524
|
+
channelId: entry,
|
|
525
|
+
threadId,
|
|
526
|
+
filePath,
|
|
527
|
+
lastActiveAt: new Date(fileStat.mtimeMs).toISOString(),
|
|
528
|
+
recentMessages,
|
|
529
|
+
});
|
|
530
|
+
}
|
|
531
|
+
}
|
|
532
|
+
}
|
|
533
|
+
catch (error) {
|
|
534
|
+
this.logger.debug('Failed to scan recent threads', {
|
|
535
|
+
baseDir,
|
|
536
|
+
channelType,
|
|
537
|
+
error: error instanceof Error ? error.message : String(error),
|
|
538
|
+
});
|
|
539
|
+
}
|
|
540
|
+
return threads;
|
|
541
|
+
}
|
|
542
|
+
/**
|
|
543
|
+
* Scans Chat UI conversations for those modified within maxAge.
|
|
544
|
+
*
|
|
545
|
+
* @param chatDir - Chat UI directory path
|
|
546
|
+
* @param cutoffMs - Cutoff timestamp in ms
|
|
547
|
+
* @returns Array of ResumeThread for qualifying conversations
|
|
548
|
+
*/
|
|
549
|
+
async scanRecentChatUiThreads(chatDir, cutoffMs) {
|
|
550
|
+
const threads = [];
|
|
551
|
+
try {
|
|
552
|
+
const files = await fs.readdir(chatDir).catch(() => []);
|
|
553
|
+
for (const file of files) {
|
|
554
|
+
if (!file.endsWith('.json'))
|
|
555
|
+
continue;
|
|
556
|
+
const filePath = path.join(chatDir, file);
|
|
557
|
+
const fileStat = await fs.stat(filePath).catch(() => null);
|
|
558
|
+
if (!fileStat || fileStat.mtimeMs < cutoffMs)
|
|
559
|
+
continue;
|
|
560
|
+
const conversationId = file.replace('.json', '');
|
|
561
|
+
const recentMessages = await this.extractChatUiMessages(filePath);
|
|
562
|
+
threads.push({
|
|
563
|
+
channelType: 'chat-ui',
|
|
564
|
+
channelId: conversationId,
|
|
565
|
+
threadId: conversationId,
|
|
566
|
+
filePath,
|
|
567
|
+
lastActiveAt: new Date(fileStat.mtimeMs).toISOString(),
|
|
568
|
+
recentMessages,
|
|
569
|
+
});
|
|
570
|
+
}
|
|
571
|
+
}
|
|
572
|
+
catch (error) {
|
|
573
|
+
this.logger.debug('Failed to scan recent Chat UI conversations', {
|
|
574
|
+
error: error instanceof Error ? error.message : String(error),
|
|
575
|
+
});
|
|
576
|
+
}
|
|
577
|
+
return threads;
|
|
578
|
+
}
|
|
579
|
+
/**
|
|
580
|
+
* Finds threads across all chat channels (Slack, GChat, Chat UI) that were
|
|
581
|
+
* active within the specified time window.
|
|
582
|
+
*
|
|
583
|
+
* @param maxAge - Maximum age in ms for a thread to qualify (default: 24h)
|
|
584
|
+
* @param dirOverrides - Optional directory overrides for testing
|
|
585
|
+
* @returns Array of ResumeThread sorted by most recent first
|
|
586
|
+
*/
|
|
587
|
+
async findRecentThreads(maxAge = RESUME_MAX_AGE_MS, dirOverrides) {
|
|
588
|
+
const crewlyHome = path.join(os.homedir(), CREWLY_CONSTANTS.PATHS.CREWLY_HOME);
|
|
589
|
+
const slackDir = dirOverrides?.slackDir || path.join(crewlyHome, SLACK_THREAD_CONSTANTS.STORAGE_DIR);
|
|
590
|
+
const gchatDir = dirOverrides?.gchatDir || path.join(crewlyHome, GCHAT_THREAD_CONSTANTS.STORAGE_DIR);
|
|
591
|
+
const chatDir = dirOverrides?.chatDir || path.join(crewlyHome, 'chat');
|
|
592
|
+
const cutoff = Date.now() - maxAge;
|
|
593
|
+
const [slackThreads, gchatThreads, chatUiThreads] = await Promise.all([
|
|
594
|
+
this.scanRecentMdThreads(slackDir, 'slack', cutoff),
|
|
595
|
+
this.scanRecentMdThreads(gchatDir, 'gchat', cutoff),
|
|
596
|
+
this.scanRecentChatUiThreads(chatDir, cutoff),
|
|
597
|
+
]);
|
|
598
|
+
const all = [...slackThreads, ...gchatThreads, ...chatUiThreads];
|
|
599
|
+
return all.sort((a, b) => new Date(b.lastActiveAt).getTime() - new Date(a.lastActiveAt).getTime());
|
|
600
|
+
}
|
|
601
|
+
/**
|
|
602
|
+
* @deprecated Use findRecentThreads() instead. Kept for backward compatibility.
|
|
603
|
+
* Finds Slack threads that were active within the last 24 hours.
|
|
604
|
+
*
|
|
605
|
+
* @param maxAge - Maximum age in ms for a thread to qualify (default: 24h)
|
|
606
|
+
* @param slackDirOverride - Optional directory override (for testing)
|
|
607
|
+
* @returns Array of ResumeThread sorted by most recent first (Slack only)
|
|
608
|
+
*/
|
|
609
|
+
async findRecentSlackThreads(maxAge = RESUME_MAX_AGE_MS, slackDirOverride) {
|
|
610
|
+
return this.findRecentThreads(maxAge, {
|
|
611
|
+
slackDir: slackDirOverride,
|
|
612
|
+
gchatDir: '/nonexistent',
|
|
613
|
+
chatDir: '/nonexistent',
|
|
614
|
+
});
|
|
615
|
+
}
|
|
616
|
+
/**
|
|
617
|
+
* Pushes a [CHAT_RESUME] notification to the orchestrator after registration,
|
|
618
|
+
* containing info about recently active threads across all channels (Slack,
|
|
619
|
+
* GChat, Chat UI) so it can proactively send a greeting message.
|
|
620
|
+
*
|
|
621
|
+
* @param agentService - Service to send messages to agents
|
|
622
|
+
* @param sessionName - Target agent session name (typically the orchestrator)
|
|
623
|
+
*/
|
|
624
|
+
async pushResumeNotification(agentService, sessionName) {
|
|
625
|
+
try {
|
|
626
|
+
const threads = await this.findRecentThreads();
|
|
627
|
+
if (threads.length === 0) {
|
|
628
|
+
this.logger.debug('No recent threads for resume notification', { sessionName });
|
|
629
|
+
return;
|
|
630
|
+
}
|
|
631
|
+
const lines = [
|
|
632
|
+
'[CHAT_RESUME] You just restarted. The following chat threads were active in the last 24 hours.',
|
|
633
|
+
'You MUST read the most recent thread and send a greeting message to prove you have recovered context.',
|
|
634
|
+
'',
|
|
635
|
+
];
|
|
636
|
+
for (const thread of threads) {
|
|
637
|
+
const label = thread.channelType.toUpperCase();
|
|
638
|
+
lines.push(`## ${label} Thread: ${thread.channelId} / ${thread.threadId}`);
|
|
639
|
+
lines.push(`- Source: ${thread.channelType}`);
|
|
640
|
+
lines.push(`- File: \`${thread.filePath}\``);
|
|
641
|
+
lines.push(`- Channel: ${thread.channelId}`);
|
|
642
|
+
lines.push(`- Thread ID: ${thread.threadId}`);
|
|
643
|
+
lines.push(`- Last active: ${thread.lastActiveAt}`);
|
|
644
|
+
if (thread.recentMessages.length > 0) {
|
|
645
|
+
lines.push('- Recent messages:');
|
|
646
|
+
for (const msg of thread.recentMessages) {
|
|
647
|
+
lines.push(` - ${msg}`);
|
|
648
|
+
}
|
|
649
|
+
}
|
|
650
|
+
lines.push('');
|
|
651
|
+
}
|
|
652
|
+
const message = lines.join('\n');
|
|
653
|
+
await agentService.sendMessageToAgent(sessionName, message, RUNTIME_TYPES.CLAUDE_CODE);
|
|
654
|
+
this.logger.info('Pushed resume notification', {
|
|
655
|
+
sessionName,
|
|
656
|
+
threadCount: threads.length,
|
|
657
|
+
channels: [...new Set(threads.map(t => t.channelType))],
|
|
658
|
+
});
|
|
659
|
+
}
|
|
660
|
+
catch (error) {
|
|
661
|
+
this.logger.warn('Failed to push resume notification', {
|
|
662
|
+
sessionName,
|
|
663
|
+
error: error instanceof Error ? error.message : String(error),
|
|
664
|
+
});
|
|
665
|
+
}
|
|
666
|
+
}
|
|
667
|
+
/**
|
|
668
|
+
* @deprecated Use pushResumeNotification() instead.
|
|
669
|
+
*/
|
|
670
|
+
async pushSlackResumeNotification(agentService, sessionName) {
|
|
671
|
+
return this.pushResumeNotification(agentService, sessionName);
|
|
672
|
+
}
|
|
673
|
+
}
|
|
674
|
+
//# sourceMappingURL=session-handoff.service.js.map
|