crewly 1.3.30 → 1.4.0
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 +195 -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 +106 -3
- 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/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 +178 -49
- 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 +57 -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 +259 -67
- 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 +150 -5
- 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 +426 -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 +46 -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/in-process-log-buffer.d.ts +23 -1
- package/dist/backend/backend/src/services/agent/crewly-agent/in-process-log-buffer.d.ts.map +1 -1
- package/dist/backend/backend/src/services/agent/crewly-agent/in-process-log-buffer.js +37 -8
- package/dist/backend/backend/src/services/agent/crewly-agent/in-process-log-buffer.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 +27 -9
- 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 +64 -2
- 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 +927 -39
- 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 +166 -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 +55 -1
- 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-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/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/index.d.ts +1 -0
- package/dist/backend/backend/src/services/knowledge/index.d.ts.map +1 -1
- package/dist/backend/backend/src/services/knowledge/index.js +1 -0
- package/dist/backend/backend/src/services/knowledge/index.js.map +1 -1
- package/dist/backend/backend/src/services/knowledge/knowledge-search.service.d.ts +91 -11
- 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 +244 -15
- 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 +331 -0
- package/dist/backend/backend/src/services/knowledge/vector-store.service.d.ts.map +1 -0
- package/dist/backend/backend/src/services/knowledge/vector-store.service.js +814 -0
- package/dist/backend/backend/src/services/knowledge/vector-store.service.js.map +1 -0
- 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 +260 -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 +565 -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 +38 -1
- 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 +49 -139
- package/dist/backend/backend/src/websocket/terminal.gateway.d.ts.map +1 -1
- package/dist/backend/backend/src/websocket/terminal.gateway.js +143 -502
- 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 +91 -11
- 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 +244 -15
- 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 +331 -0
- package/dist/cli/backend/src/services/knowledge/vector-store.service.d.ts.map +1 -0
- package/dist/cli/backend/src/services/knowledge/vector-store.service.js +814 -0
- package/dist/cli/backend/src/services/knowledge/vector-store.service.js.map +1 -0
- 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 +38 -1
- 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-1d23cce8.js +4919 -0
- package/frontend/dist/assets/index-60a9e4ea.css +33 -0
- package/frontend/dist/index.html +2 -2
- package/package.json +22 -9
- 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
- package/frontend/dist/assets/index-adae9eb6.js +0 -5213
|
@@ -0,0 +1,181 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* PR Review Service
|
|
3
|
+
*
|
|
4
|
+
* Core service for automated pull request code review. Analyzes PR diffs
|
|
5
|
+
* for code quality, security issues, and test coverage gaps, then posts
|
|
6
|
+
* review comments back to GitHub via the gh CLI.
|
|
7
|
+
*
|
|
8
|
+
* @module services/pr-review/pr-review.service
|
|
9
|
+
*/
|
|
10
|
+
/** Supported PR webhook event actions */
|
|
11
|
+
export declare const PR_REVIEW_ACTIONS: readonly ["opened", "synchronize", "reopened"];
|
|
12
|
+
/** GitHub PR webhook payload (subset of fields used) */
|
|
13
|
+
export interface PullRequestPayload {
|
|
14
|
+
/** Webhook action type */
|
|
15
|
+
action: string;
|
|
16
|
+
/** Pull request data */
|
|
17
|
+
pull_request: {
|
|
18
|
+
/** PR number */
|
|
19
|
+
number: number;
|
|
20
|
+
/** PR title */
|
|
21
|
+
title: string;
|
|
22
|
+
/** PR author */
|
|
23
|
+
user: {
|
|
24
|
+
login: string;
|
|
25
|
+
};
|
|
26
|
+
/** Head branch info */
|
|
27
|
+
head: {
|
|
28
|
+
sha: string;
|
|
29
|
+
ref: string;
|
|
30
|
+
};
|
|
31
|
+
/** Base branch info */
|
|
32
|
+
base: {
|
|
33
|
+
sha: string;
|
|
34
|
+
ref: string;
|
|
35
|
+
};
|
|
36
|
+
/** URL to raw diff */
|
|
37
|
+
diff_url: string;
|
|
38
|
+
/** HTML URL for the PR */
|
|
39
|
+
html_url: string;
|
|
40
|
+
/** Changed file count */
|
|
41
|
+
changed_files?: number;
|
|
42
|
+
};
|
|
43
|
+
/** Repository info */
|
|
44
|
+
repository: {
|
|
45
|
+
/** Full repo name (owner/repo) */
|
|
46
|
+
full_name: string;
|
|
47
|
+
};
|
|
48
|
+
}
|
|
49
|
+
/** A single review finding */
|
|
50
|
+
export interface ReviewFinding {
|
|
51
|
+
/** File path relative to repo root */
|
|
52
|
+
file: string;
|
|
53
|
+
/** Line number in the diff (if applicable) */
|
|
54
|
+
line?: number;
|
|
55
|
+
/** Severity level */
|
|
56
|
+
severity: 'critical' | 'warning' | 'info';
|
|
57
|
+
/** Category of the finding */
|
|
58
|
+
category: 'security' | 'quality' | 'testing' | 'style';
|
|
59
|
+
/** Human-readable description of the issue */
|
|
60
|
+
message: string;
|
|
61
|
+
}
|
|
62
|
+
/** Result of a full PR review */
|
|
63
|
+
export interface ReviewResult {
|
|
64
|
+
/** PR number reviewed */
|
|
65
|
+
prNumber: number;
|
|
66
|
+
/** Repository full name */
|
|
67
|
+
repository: string;
|
|
68
|
+
/** Overall verdict */
|
|
69
|
+
verdict: 'approve' | 'request_changes' | 'comment';
|
|
70
|
+
/** Summary text */
|
|
71
|
+
summary: string;
|
|
72
|
+
/** Individual findings */
|
|
73
|
+
findings: ReviewFinding[];
|
|
74
|
+
/** Timestamp of review */
|
|
75
|
+
reviewedAt: string;
|
|
76
|
+
}
|
|
77
|
+
/** Status of a review job */
|
|
78
|
+
export interface ReviewStatus {
|
|
79
|
+
/** Whether a review is currently running */
|
|
80
|
+
isRunning: boolean;
|
|
81
|
+
/** Number of reviews completed */
|
|
82
|
+
reviewCount: number;
|
|
83
|
+
/** Last review timestamp */
|
|
84
|
+
lastReviewAt: string | null;
|
|
85
|
+
}
|
|
86
|
+
/**
|
|
87
|
+
* Verify the GitHub webhook signature using HMAC-SHA256.
|
|
88
|
+
*
|
|
89
|
+
* Compares the X-Hub-Signature-256 header against a computed HMAC
|
|
90
|
+
* of the raw request body using the configured webhook secret.
|
|
91
|
+
*
|
|
92
|
+
* @param payload - Raw request body as string
|
|
93
|
+
* @param signature - Value of the X-Hub-Signature-256 header
|
|
94
|
+
* @param secret - Webhook secret configured in GitHub
|
|
95
|
+
* @returns True if the signature is valid
|
|
96
|
+
*/
|
|
97
|
+
export declare function verifyWebhookSignature(payload: string, signature: string, secret: string): boolean;
|
|
98
|
+
/**
|
|
99
|
+
* Fetch the diff for a pull request using the gh CLI.
|
|
100
|
+
*
|
|
101
|
+
* @param repo - Repository full name (owner/repo)
|
|
102
|
+
* @param prNumber - Pull request number
|
|
103
|
+
* @returns The unified diff as a string
|
|
104
|
+
* @throws Error if gh CLI fails or diff exceeds size limit
|
|
105
|
+
*/
|
|
106
|
+
export declare function fetchPrDiff(repo: string, prNumber: number): string;
|
|
107
|
+
/**
|
|
108
|
+
* Parse a unified diff into per-file changed sections.
|
|
109
|
+
*
|
|
110
|
+
* Extracts file paths and their changed lines from a unified diff string.
|
|
111
|
+
*
|
|
112
|
+
* @param diff - Unified diff string
|
|
113
|
+
* @returns Array of objects with file path and changed content
|
|
114
|
+
*/
|
|
115
|
+
export declare function parseDiff(diff: string): {
|
|
116
|
+
file: string;
|
|
117
|
+
content: string;
|
|
118
|
+
}[];
|
|
119
|
+
/**
|
|
120
|
+
* Analyze a PR diff for code quality, security, and testing issues.
|
|
121
|
+
*
|
|
122
|
+
* Performs static analysis checks on the diff content:
|
|
123
|
+
* - Security: hardcoded secrets, SQL injection patterns, eval usage
|
|
124
|
+
* - Quality: console.log in production, TODO comments, large functions
|
|
125
|
+
* - Testing: new source files without corresponding test files
|
|
126
|
+
* - Style: any types in TypeScript files
|
|
127
|
+
*
|
|
128
|
+
* @param diff - Unified diff string
|
|
129
|
+
* @returns Array of review findings
|
|
130
|
+
*/
|
|
131
|
+
export declare function analyzeDiff(diff: string): ReviewFinding[];
|
|
132
|
+
/**
|
|
133
|
+
* Determine the review verdict based on findings.
|
|
134
|
+
*
|
|
135
|
+
* @param findings - Array of review findings
|
|
136
|
+
* @returns 'request_changes' if critical issues, 'comment' if warnings, 'approve' if clean
|
|
137
|
+
*/
|
|
138
|
+
export declare function determineVerdict(findings: ReviewFinding[]): 'approve' | 'request_changes' | 'comment';
|
|
139
|
+
/**
|
|
140
|
+
* Format review findings into a markdown comment body.
|
|
141
|
+
*
|
|
142
|
+
* @param result - The review result to format
|
|
143
|
+
* @returns Markdown-formatted review comment
|
|
144
|
+
*/
|
|
145
|
+
export declare function formatReviewComment(result: ReviewResult): string;
|
|
146
|
+
/**
|
|
147
|
+
* Post a review comment on a GitHub PR using the gh CLI.
|
|
148
|
+
*
|
|
149
|
+
* @param repo - Repository full name (owner/repo)
|
|
150
|
+
* @param prNumber - Pull request number
|
|
151
|
+
* @param body - Comment body in markdown
|
|
152
|
+
* @returns The URL of the posted comment
|
|
153
|
+
* @throws Error if the gh CLI command fails
|
|
154
|
+
*/
|
|
155
|
+
export declare function postReviewComment(repo: string, prNumber: number, body: string): string;
|
|
156
|
+
/**
|
|
157
|
+
* Execute a full PR review: fetch diff, analyze, post comment.
|
|
158
|
+
*
|
|
159
|
+
* This is the main entry point called by the webhook controller.
|
|
160
|
+
* It orchestrates the full review pipeline:
|
|
161
|
+
* 1. Fetch the PR diff via gh CLI
|
|
162
|
+
* 2. Analyze the diff for issues
|
|
163
|
+
* 3. Determine the verdict
|
|
164
|
+
* 4. Format and post the review comment
|
|
165
|
+
*
|
|
166
|
+
* @param payload - The GitHub PR webhook payload
|
|
167
|
+
* @returns The review result with findings and verdict
|
|
168
|
+
* @throws Error if the review pipeline fails
|
|
169
|
+
*/
|
|
170
|
+
export declare function executePrReview(payload: PullRequestPayload): Promise<ReviewResult>;
|
|
171
|
+
/**
|
|
172
|
+
* Get the current review service status.
|
|
173
|
+
*
|
|
174
|
+
* @returns Status object with running state and review count
|
|
175
|
+
*/
|
|
176
|
+
export declare function getReviewStatus(): ReviewStatus;
|
|
177
|
+
/**
|
|
178
|
+
* Reset review service state (for testing).
|
|
179
|
+
*/
|
|
180
|
+
export declare function resetReviewState(): void;
|
|
181
|
+
//# sourceMappingURL=pr-review.service.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"pr-review.service.d.ts","sourceRoot":"","sources":["../../../../../../backend/src/services/pr-review/pr-review.service.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,336 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* PR Review Service
|
|
3
|
+
*
|
|
4
|
+
* Core service for automated pull request code review. Analyzes PR diffs
|
|
5
|
+
* for code quality, security issues, and test coverage gaps, then posts
|
|
6
|
+
* review comments back to GitHub via the gh CLI.
|
|
7
|
+
*
|
|
8
|
+
* @module services/pr-review/pr-review.service
|
|
9
|
+
*/
|
|
10
|
+
import { execSync } from 'child_process';
|
|
11
|
+
// ========================= Constants =========================
|
|
12
|
+
/** Timeout for gh CLI commands in milliseconds */
|
|
13
|
+
const GH_CLI_TIMEOUT_MS = 30000;
|
|
14
|
+
/** Maximum diff size to analyze (characters) */
|
|
15
|
+
const MAX_DIFF_SIZE = 500000;
|
|
16
|
+
/** Supported PR webhook event actions */
|
|
17
|
+
export const PR_REVIEW_ACTIONS = ['opened', 'synchronize', 'reopened'];
|
|
18
|
+
/** HMAC algorithm for webhook signature verification */
|
|
19
|
+
const HMAC_ALGORITHM = 'sha256';
|
|
20
|
+
// ========================= Webhook Verification =========================
|
|
21
|
+
/**
|
|
22
|
+
* Verify the GitHub webhook signature using HMAC-SHA256.
|
|
23
|
+
*
|
|
24
|
+
* Compares the X-Hub-Signature-256 header against a computed HMAC
|
|
25
|
+
* of the raw request body using the configured webhook secret.
|
|
26
|
+
*
|
|
27
|
+
* @param payload - Raw request body as string
|
|
28
|
+
* @param signature - Value of the X-Hub-Signature-256 header
|
|
29
|
+
* @param secret - Webhook secret configured in GitHub
|
|
30
|
+
* @returns True if the signature is valid
|
|
31
|
+
*/
|
|
32
|
+
export function verifyWebhookSignature(payload, signature, secret) {
|
|
33
|
+
if (!signature || !secret) {
|
|
34
|
+
return false;
|
|
35
|
+
}
|
|
36
|
+
const crypto = require('crypto');
|
|
37
|
+
const hmac = crypto.createHmac(HMAC_ALGORITHM, secret);
|
|
38
|
+
hmac.update(payload);
|
|
39
|
+
const expected = `sha256=${hmac.digest('hex')}`;
|
|
40
|
+
// Use timing-safe comparison to prevent timing attacks
|
|
41
|
+
try {
|
|
42
|
+
return crypto.timingSafeEqual(Buffer.from(signature), Buffer.from(expected));
|
|
43
|
+
}
|
|
44
|
+
catch {
|
|
45
|
+
return false;
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
// ========================= Diff Analysis =========================
|
|
49
|
+
/**
|
|
50
|
+
* Fetch the diff for a pull request using the gh CLI.
|
|
51
|
+
*
|
|
52
|
+
* @param repo - Repository full name (owner/repo)
|
|
53
|
+
* @param prNumber - Pull request number
|
|
54
|
+
* @returns The unified diff as a string
|
|
55
|
+
* @throws Error if gh CLI fails or diff exceeds size limit
|
|
56
|
+
*/
|
|
57
|
+
export function fetchPrDiff(repo, prNumber) {
|
|
58
|
+
const diff = execSync(`gh pr diff ${prNumber} --repo ${repo}`, { encoding: 'utf-8', timeout: GH_CLI_TIMEOUT_MS });
|
|
59
|
+
if (diff.length > MAX_DIFF_SIZE) {
|
|
60
|
+
throw new Error(`PR diff exceeds maximum size (${diff.length} > ${MAX_DIFF_SIZE} chars)`);
|
|
61
|
+
}
|
|
62
|
+
return diff;
|
|
63
|
+
}
|
|
64
|
+
/**
|
|
65
|
+
* Parse a unified diff into per-file changed sections.
|
|
66
|
+
*
|
|
67
|
+
* Extracts file paths and their changed lines from a unified diff string.
|
|
68
|
+
*
|
|
69
|
+
* @param diff - Unified diff string
|
|
70
|
+
* @returns Array of objects with file path and changed content
|
|
71
|
+
*/
|
|
72
|
+
export function parseDiff(diff) {
|
|
73
|
+
const files = [];
|
|
74
|
+
const fileSections = diff.split(/^diff --git /m).filter(Boolean);
|
|
75
|
+
for (const section of fileSections) {
|
|
76
|
+
const fileMatch = section.match(/^a\/(.+?) b\//);
|
|
77
|
+
if (!fileMatch)
|
|
78
|
+
continue;
|
|
79
|
+
const file = fileMatch[1];
|
|
80
|
+
files.push({ file, content: section });
|
|
81
|
+
}
|
|
82
|
+
return files;
|
|
83
|
+
}
|
|
84
|
+
/**
|
|
85
|
+
* Analyze a PR diff for code quality, security, and testing issues.
|
|
86
|
+
*
|
|
87
|
+
* Performs static analysis checks on the diff content:
|
|
88
|
+
* - Security: hardcoded secrets, SQL injection patterns, eval usage
|
|
89
|
+
* - Quality: console.log in production, TODO comments, large functions
|
|
90
|
+
* - Testing: new source files without corresponding test files
|
|
91
|
+
* - Style: any types in TypeScript files
|
|
92
|
+
*
|
|
93
|
+
* @param diff - Unified diff string
|
|
94
|
+
* @returns Array of review findings
|
|
95
|
+
*/
|
|
96
|
+
export function analyzeDiff(diff) {
|
|
97
|
+
const findings = [];
|
|
98
|
+
const files = parseDiff(diff);
|
|
99
|
+
const addedFileNames = new Set();
|
|
100
|
+
for (const { file, content } of files) {
|
|
101
|
+
// Track added files for test coverage check
|
|
102
|
+
if (content.includes('new file mode')) {
|
|
103
|
+
addedFileNames.add(file);
|
|
104
|
+
}
|
|
105
|
+
// Only analyze added lines (lines starting with +)
|
|
106
|
+
const addedLines = content
|
|
107
|
+
.split('\n')
|
|
108
|
+
.filter((line) => line.startsWith('+') && !line.startsWith('+++'));
|
|
109
|
+
for (let i = 0; i < addedLines.length; i++) {
|
|
110
|
+
const line = addedLines[i];
|
|
111
|
+
// Security: hardcoded secrets/tokens
|
|
112
|
+
if (/(?:password|secret|token|api_key|apikey)\s*[:=]\s*['"][^'"]{8,}/i.test(line)) {
|
|
113
|
+
findings.push({
|
|
114
|
+
file,
|
|
115
|
+
line: i + 1,
|
|
116
|
+
severity: 'critical',
|
|
117
|
+
category: 'security',
|
|
118
|
+
message: 'Potential hardcoded secret or API key detected',
|
|
119
|
+
});
|
|
120
|
+
}
|
|
121
|
+
// Security: eval usage
|
|
122
|
+
if (/\beval\s*\(/.test(line) && !file.endsWith('.test.ts') && !file.endsWith('.test.tsx')) {
|
|
123
|
+
findings.push({
|
|
124
|
+
file,
|
|
125
|
+
line: i + 1,
|
|
126
|
+
severity: 'critical',
|
|
127
|
+
category: 'security',
|
|
128
|
+
message: 'Usage of eval() detected — potential code injection vulnerability',
|
|
129
|
+
});
|
|
130
|
+
}
|
|
131
|
+
// Security: SQL injection pattern
|
|
132
|
+
if (/\$\{.*\}.*(?:SELECT|INSERT|UPDATE|DELETE|DROP)\b/i.test(line) ||
|
|
133
|
+
/(?:SELECT|INSERT|UPDATE|DELETE|DROP)\b.*\$\{/i.test(line)) {
|
|
134
|
+
findings.push({
|
|
135
|
+
file,
|
|
136
|
+
line: i + 1,
|
|
137
|
+
severity: 'critical',
|
|
138
|
+
category: 'security',
|
|
139
|
+
message: 'Potential SQL injection — use parameterized queries instead of string interpolation',
|
|
140
|
+
});
|
|
141
|
+
}
|
|
142
|
+
// Quality: console.log in production code
|
|
143
|
+
if (/\bconsole\.(log|debug|info)\b/.test(line) &&
|
|
144
|
+
!file.endsWith('.test.ts') && !file.endsWith('.test.tsx') &&
|
|
145
|
+
!file.includes('logger') && !file.includes('cli/')) {
|
|
146
|
+
findings.push({
|
|
147
|
+
file,
|
|
148
|
+
line: i + 1,
|
|
149
|
+
severity: 'warning',
|
|
150
|
+
category: 'quality',
|
|
151
|
+
message: 'console.log detected in production code — use the LoggerService instead',
|
|
152
|
+
});
|
|
153
|
+
}
|
|
154
|
+
// Style: any type in TypeScript
|
|
155
|
+
if ((file.endsWith('.ts') || file.endsWith('.tsx')) &&
|
|
156
|
+
/:\s*any\b/.test(line) && !file.endsWith('.test.ts') && !file.endsWith('.test.tsx')) {
|
|
157
|
+
findings.push({
|
|
158
|
+
file,
|
|
159
|
+
line: i + 1,
|
|
160
|
+
severity: 'info',
|
|
161
|
+
category: 'style',
|
|
162
|
+
message: 'Usage of `any` type — consider using a specific type or `unknown` with type guards',
|
|
163
|
+
});
|
|
164
|
+
}
|
|
165
|
+
}
|
|
166
|
+
}
|
|
167
|
+
// Testing: check for new source files without corresponding test files
|
|
168
|
+
for (const file of addedFileNames) {
|
|
169
|
+
if ((file.endsWith('.ts') || file.endsWith('.tsx')) &&
|
|
170
|
+
!file.endsWith('.test.ts') && !file.endsWith('.test.tsx') &&
|
|
171
|
+
!file.endsWith('.d.ts') &&
|
|
172
|
+
!file.includes('types/')) {
|
|
173
|
+
const testFile = file.replace(/\.tsx?$/, (ext) => `.test${ext}`);
|
|
174
|
+
if (!addedFileNames.has(testFile)) {
|
|
175
|
+
findings.push({
|
|
176
|
+
file,
|
|
177
|
+
severity: 'warning',
|
|
178
|
+
category: 'testing',
|
|
179
|
+
message: `New source file without corresponding test file (expected: ${testFile})`,
|
|
180
|
+
});
|
|
181
|
+
}
|
|
182
|
+
}
|
|
183
|
+
}
|
|
184
|
+
return findings;
|
|
185
|
+
}
|
|
186
|
+
// ========================= Review Execution =========================
|
|
187
|
+
/**
|
|
188
|
+
* Determine the review verdict based on findings.
|
|
189
|
+
*
|
|
190
|
+
* @param findings - Array of review findings
|
|
191
|
+
* @returns 'request_changes' if critical issues, 'comment' if warnings, 'approve' if clean
|
|
192
|
+
*/
|
|
193
|
+
export function determineVerdict(findings) {
|
|
194
|
+
if (findings.some((f) => f.severity === 'critical')) {
|
|
195
|
+
return 'request_changes';
|
|
196
|
+
}
|
|
197
|
+
if (findings.some((f) => f.severity === 'warning')) {
|
|
198
|
+
return 'comment';
|
|
199
|
+
}
|
|
200
|
+
return 'approve';
|
|
201
|
+
}
|
|
202
|
+
/**
|
|
203
|
+
* Format review findings into a markdown comment body.
|
|
204
|
+
*
|
|
205
|
+
* @param result - The review result to format
|
|
206
|
+
* @returns Markdown-formatted review comment
|
|
207
|
+
*/
|
|
208
|
+
export function formatReviewComment(result) {
|
|
209
|
+
const lines = [
|
|
210
|
+
'## Automated PR Review',
|
|
211
|
+
'',
|
|
212
|
+
`**Verdict:** ${result.verdict === 'approve' ? 'Approved' : result.verdict === 'request_changes' ? 'Changes Requested' : 'Comment'}`,
|
|
213
|
+
'',
|
|
214
|
+
result.summary,
|
|
215
|
+
'',
|
|
216
|
+
];
|
|
217
|
+
if (result.findings.length === 0) {
|
|
218
|
+
lines.push('No issues found. Code looks good!');
|
|
219
|
+
return lines.join('\n');
|
|
220
|
+
}
|
|
221
|
+
const grouped = {
|
|
222
|
+
critical: result.findings.filter((f) => f.severity === 'critical'),
|
|
223
|
+
warning: result.findings.filter((f) => f.severity === 'warning'),
|
|
224
|
+
info: result.findings.filter((f) => f.severity === 'info'),
|
|
225
|
+
};
|
|
226
|
+
if (grouped.critical.length > 0) {
|
|
227
|
+
lines.push('### Critical Issues');
|
|
228
|
+
for (const f of grouped.critical) {
|
|
229
|
+
lines.push(`- **${f.file}${f.line ? `:${f.line}` : ''}** [${f.category}] — ${f.message}`);
|
|
230
|
+
}
|
|
231
|
+
lines.push('');
|
|
232
|
+
}
|
|
233
|
+
if (grouped.warning.length > 0) {
|
|
234
|
+
lines.push('### Warnings');
|
|
235
|
+
for (const f of grouped.warning) {
|
|
236
|
+
lines.push(`- **${f.file}${f.line ? `:${f.line}` : ''}** [${f.category}] — ${f.message}`);
|
|
237
|
+
}
|
|
238
|
+
lines.push('');
|
|
239
|
+
}
|
|
240
|
+
if (grouped.info.length > 0) {
|
|
241
|
+
lines.push('### Info');
|
|
242
|
+
for (const f of grouped.info) {
|
|
243
|
+
lines.push(`- **${f.file}${f.line ? `:${f.line}` : ''}** [${f.category}] — ${f.message}`);
|
|
244
|
+
}
|
|
245
|
+
lines.push('');
|
|
246
|
+
}
|
|
247
|
+
lines.push('---');
|
|
248
|
+
lines.push('*Automated review by Crewly PR Review*');
|
|
249
|
+
return lines.join('\n');
|
|
250
|
+
}
|
|
251
|
+
/**
|
|
252
|
+
* Post a review comment on a GitHub PR using the gh CLI.
|
|
253
|
+
*
|
|
254
|
+
* @param repo - Repository full name (owner/repo)
|
|
255
|
+
* @param prNumber - Pull request number
|
|
256
|
+
* @param body - Comment body in markdown
|
|
257
|
+
* @returns The URL of the posted comment
|
|
258
|
+
* @throws Error if the gh CLI command fails
|
|
259
|
+
*/
|
|
260
|
+
export function postReviewComment(repo, prNumber, body) {
|
|
261
|
+
const escapedBody = body.replace(/'/g, "'\\''");
|
|
262
|
+
const result = execSync(`gh pr comment ${prNumber} --repo ${repo} --body '${escapedBody}'`, { encoding: 'utf-8', timeout: GH_CLI_TIMEOUT_MS });
|
|
263
|
+
return result.trim();
|
|
264
|
+
}
|
|
265
|
+
// ========================= PR Review Service =========================
|
|
266
|
+
/** Module-level state for tracking review activity */
|
|
267
|
+
let reviewCount = 0;
|
|
268
|
+
let lastReviewAt = null;
|
|
269
|
+
let isRunning = false;
|
|
270
|
+
/**
|
|
271
|
+
* Execute a full PR review: fetch diff, analyze, post comment.
|
|
272
|
+
*
|
|
273
|
+
* This is the main entry point called by the webhook controller.
|
|
274
|
+
* It orchestrates the full review pipeline:
|
|
275
|
+
* 1. Fetch the PR diff via gh CLI
|
|
276
|
+
* 2. Analyze the diff for issues
|
|
277
|
+
* 3. Determine the verdict
|
|
278
|
+
* 4. Format and post the review comment
|
|
279
|
+
*
|
|
280
|
+
* @param payload - The GitHub PR webhook payload
|
|
281
|
+
* @returns The review result with findings and verdict
|
|
282
|
+
* @throws Error if the review pipeline fails
|
|
283
|
+
*/
|
|
284
|
+
export async function executePrReview(payload) {
|
|
285
|
+
const repo = payload.repository.full_name;
|
|
286
|
+
const prNumber = payload.pull_request.number;
|
|
287
|
+
isRunning = true;
|
|
288
|
+
try {
|
|
289
|
+
// 1. Fetch diff
|
|
290
|
+
const diff = fetchPrDiff(repo, prNumber);
|
|
291
|
+
// 2. Analyze
|
|
292
|
+
const findings = analyzeDiff(diff);
|
|
293
|
+
// 3. Determine verdict
|
|
294
|
+
const verdict = determineVerdict(findings);
|
|
295
|
+
// 4. Build result
|
|
296
|
+
const result = {
|
|
297
|
+
prNumber,
|
|
298
|
+
repository: repo,
|
|
299
|
+
verdict,
|
|
300
|
+
summary: `Reviewed ${parseDiff(diff).length} file(s) — found ${findings.length} issue(s).`,
|
|
301
|
+
findings,
|
|
302
|
+
reviewedAt: new Date().toISOString(),
|
|
303
|
+
};
|
|
304
|
+
// 5. Post comment
|
|
305
|
+
const comment = formatReviewComment(result);
|
|
306
|
+
postReviewComment(repo, prNumber, comment);
|
|
307
|
+
// 6. Update state
|
|
308
|
+
reviewCount++;
|
|
309
|
+
lastReviewAt = result.reviewedAt;
|
|
310
|
+
return result;
|
|
311
|
+
}
|
|
312
|
+
finally {
|
|
313
|
+
isRunning = false;
|
|
314
|
+
}
|
|
315
|
+
}
|
|
316
|
+
/**
|
|
317
|
+
* Get the current review service status.
|
|
318
|
+
*
|
|
319
|
+
* @returns Status object with running state and review count
|
|
320
|
+
*/
|
|
321
|
+
export function getReviewStatus() {
|
|
322
|
+
return {
|
|
323
|
+
isRunning,
|
|
324
|
+
reviewCount,
|
|
325
|
+
lastReviewAt,
|
|
326
|
+
};
|
|
327
|
+
}
|
|
328
|
+
/**
|
|
329
|
+
* Reset review service state (for testing).
|
|
330
|
+
*/
|
|
331
|
+
export function resetReviewState() {
|
|
332
|
+
reviewCount = 0;
|
|
333
|
+
lastReviewAt = null;
|
|
334
|
+
isRunning = false;
|
|
335
|
+
}
|
|
336
|
+
//# sourceMappingURL=pr-review.service.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"pr-review.service.js","sourceRoot":"","sources":["../../../../../../backend/src/services/pr-review/pr-review.service.ts"],"names":[],"mappings":"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"}
|
|
@@ -67,6 +67,29 @@ export declare class TaskTrackingService extends EventEmitter {
|
|
|
67
67
|
scheduleIds: string[];
|
|
68
68
|
subscriptionIds: string[];
|
|
69
69
|
}>;
|
|
70
|
+
/**
|
|
71
|
+
* Detect orphan tasks: tasks stuck in in_progress/assigned/active with no
|
|
72
|
+
* corresponding active agent. Returns the list without modifying state.
|
|
73
|
+
*
|
|
74
|
+
* @param getTeamStatus - Function returning current team configurations
|
|
75
|
+
* @param staleThresholdMs - Age threshold in ms to consider a task stale (default: 24 hours)
|
|
76
|
+
* @returns Array of orphan tasks with staleness info
|
|
77
|
+
*/
|
|
78
|
+
detectOrphanTasks(getTeamStatus: () => Promise<any[]>, staleThresholdMs?: number): Promise<Array<InProgressTask & {
|
|
79
|
+
staleSinceMs: number;
|
|
80
|
+
}>>;
|
|
81
|
+
/**
|
|
82
|
+
* Bulk cleanup orphan tasks by marking them as cancelled and optionally
|
|
83
|
+
* moving their files back to the open folder.
|
|
84
|
+
*
|
|
85
|
+
* @param taskIds - Array of task IDs to clean up
|
|
86
|
+
* @param action - 'cancel' marks tasks as cancelled, 'reopen' moves them back to open
|
|
87
|
+
* @returns Cleanup report with counts
|
|
88
|
+
*/
|
|
89
|
+
cleanupOrphanTasks(taskIds: string[], action?: 'cancel' | 'reopen'): Promise<{
|
|
90
|
+
cleaned: number;
|
|
91
|
+
errors: string[];
|
|
92
|
+
}>;
|
|
70
93
|
private extractTaskNameFromFile;
|
|
71
94
|
/**
|
|
72
95
|
* Recovers abandoned in-progress tasks by checking agent status and moving inactive tasks back to open
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"task-tracking.service.d.ts","sourceRoot":"","sources":["../../../../../../backend/src/services/project/task-tracking.service.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"task-tracking.service.d.ts","sourceRoot":"","sources":["../../../../../../backend/src/services/project/task-tracking.service.ts"],"names":[],"mappings":"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"}
|
|
@@ -300,6 +300,94 @@ export class TaskTrackingService extends EventEmitter {
|
|
|
300
300
|
}
|
|
301
301
|
return { scheduleIds, subscriptionIds };
|
|
302
302
|
}
|
|
303
|
+
/**
|
|
304
|
+
* Detect orphan tasks: tasks stuck in in_progress/assigned/active with no
|
|
305
|
+
* corresponding active agent. Returns the list without modifying state.
|
|
306
|
+
*
|
|
307
|
+
* @param getTeamStatus - Function returning current team configurations
|
|
308
|
+
* @param staleThresholdMs - Age threshold in ms to consider a task stale (default: 24 hours)
|
|
309
|
+
* @returns Array of orphan tasks with staleness info
|
|
310
|
+
*/
|
|
311
|
+
async detectOrphanTasks(getTeamStatus, staleThresholdMs = 24 * 60 * 60 * 1000) {
|
|
312
|
+
const data = await this.loadTaskData();
|
|
313
|
+
const activeTasks = data.tasks.filter(t => t.status === 'assigned' || t.status === 'active' || t.status === 'working');
|
|
314
|
+
if (activeTasks.length === 0)
|
|
315
|
+
return [];
|
|
316
|
+
// Build set of all known agent session names + member IDs
|
|
317
|
+
const teams = await getTeamStatus();
|
|
318
|
+
const knownAgents = new Set();
|
|
319
|
+
for (const team of teams) {
|
|
320
|
+
for (const member of (team.members || [])) {
|
|
321
|
+
if (member.sessionName)
|
|
322
|
+
knownAgents.add(member.sessionName);
|
|
323
|
+
if (member.id)
|
|
324
|
+
knownAgents.add(member.id);
|
|
325
|
+
}
|
|
326
|
+
}
|
|
327
|
+
const now = Date.now();
|
|
328
|
+
const orphans = [];
|
|
329
|
+
for (const task of activeTasks) {
|
|
330
|
+
const agentKnown = knownAgents.has(task.assignedSessionName) ||
|
|
331
|
+
knownAgents.has(task.assignedTeamMemberId);
|
|
332
|
+
const assignedTime = new Date(task.assignedAt).getTime();
|
|
333
|
+
const staleSinceMs = now - assignedTime;
|
|
334
|
+
// Orphan if agent doesn't exist in any team OR task is stale
|
|
335
|
+
if (!agentKnown || staleSinceMs > staleThresholdMs) {
|
|
336
|
+
orphans.push({ ...task, staleSinceMs });
|
|
337
|
+
}
|
|
338
|
+
}
|
|
339
|
+
return orphans;
|
|
340
|
+
}
|
|
341
|
+
/**
|
|
342
|
+
* Bulk cleanup orphan tasks by marking them as cancelled and optionally
|
|
343
|
+
* moving their files back to the open folder.
|
|
344
|
+
*
|
|
345
|
+
* @param taskIds - Array of task IDs to clean up
|
|
346
|
+
* @param action - 'cancel' marks tasks as cancelled, 'reopen' moves them back to open
|
|
347
|
+
* @returns Cleanup report with counts
|
|
348
|
+
*/
|
|
349
|
+
async cleanupOrphanTasks(taskIds, action = 'cancel') {
|
|
350
|
+
const report = { cleaned: 0, errors: [] };
|
|
351
|
+
const data = await this.loadTaskData();
|
|
352
|
+
for (const taskId of taskIds) {
|
|
353
|
+
const task = data.tasks.find(t => t.id === taskId);
|
|
354
|
+
if (!task) {
|
|
355
|
+
report.errors.push(`Task ${taskId} not found`);
|
|
356
|
+
continue;
|
|
357
|
+
}
|
|
358
|
+
try {
|
|
359
|
+
if (action === 'reopen') {
|
|
360
|
+
const moved = await this.moveTaskBackToOpen(task);
|
|
361
|
+
if (moved) {
|
|
362
|
+
await this.removeTask(taskId);
|
|
363
|
+
report.cleaned++;
|
|
364
|
+
}
|
|
365
|
+
else {
|
|
366
|
+
// File may already be gone — just remove from tracking
|
|
367
|
+
await this.removeTask(taskId);
|
|
368
|
+
report.cleaned++;
|
|
369
|
+
}
|
|
370
|
+
}
|
|
371
|
+
else {
|
|
372
|
+
// Cancel: update status and remove from active tracking
|
|
373
|
+
task.status = 'cancelled';
|
|
374
|
+
task.completedAt = new Date().toISOString();
|
|
375
|
+
await this.saveTaskData(data);
|
|
376
|
+
await this.removeTask(taskId);
|
|
377
|
+
report.cleaned++;
|
|
378
|
+
}
|
|
379
|
+
}
|
|
380
|
+
catch (err) {
|
|
381
|
+
report.errors.push(`Failed to clean task ${taskId}: ${err instanceof Error ? err.message : String(err)}`);
|
|
382
|
+
}
|
|
383
|
+
}
|
|
384
|
+
this.logger.info('Orphan task cleanup complete', {
|
|
385
|
+
action,
|
|
386
|
+
cleaned: report.cleaned,
|
|
387
|
+
errors: report.errors.length,
|
|
388
|
+
});
|
|
389
|
+
return report;
|
|
390
|
+
}
|
|
303
391
|
extractTaskNameFromFile(filename) {
|
|
304
392
|
// Remove extension and number prefix
|
|
305
393
|
return filename
|