crewly 1.0.8 → 1.0.11
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 +59 -0
- package/config/index.ts +2 -0
- package/config/roles/architect/prompt.md +8 -5
- package/config/roles/backend-developer/prompt.md +24 -5
- package/config/roles/designer/prompt.md +6 -5
- package/config/roles/developer/prompt.md +27 -5
- package/config/roles/frontend-developer/prompt.md +24 -5
- package/config/roles/fullstack-dev/prompt.md +24 -5
- package/config/roles/generalist/prompt.md +9 -5
- package/config/roles/orchestrator/prompt.md +126 -15
- package/config/roles/product-manager/prompt.md +6 -5
- package/config/roles/qa/prompt.md +24 -5
- package/config/roles/qa-engineer/prompt.md +24 -5
- package/config/roles/sales/prompt.md +6 -5
- package/config/roles/support/prompt.md +6 -5
- package/config/roles/tpm/prompt.md +6 -5
- package/config/skills/agent/_common/lib.sh +4 -0
- package/config/skills/agent/core/accept-task/execute.sh +21 -0
- package/config/skills/agent/core/accept-task/instructions.md +20 -0
- package/config/skills/agent/core/accept-task/skill.json +20 -0
- package/config/skills/agent/core/block-task/execute.sh +26 -0
- package/config/skills/agent/core/block-task/instructions.md +22 -0
- package/config/skills/agent/core/block-task/skill.json +20 -0
- package/config/skills/agent/core/check-quality-gates/execute.sh +20 -0
- package/config/skills/agent/core/check-quality-gates/instructions.md +23 -0
- package/config/skills/agent/core/check-quality-gates/skill.json +20 -0
- package/config/skills/agent/core/complete-task/execute.sh +29 -0
- package/config/skills/agent/core/complete-task/instructions.md +53 -0
- package/config/skills/agent/core/complete-task/skill.json +20 -0
- package/config/skills/agent/core/get-my-context/execute.sh +23 -0
- package/config/skills/agent/core/get-my-context/instructions.md +21 -0
- package/config/skills/agent/core/get-my-context/skill.json +20 -0
- package/config/skills/agent/core/get-sops/execute.sh +24 -0
- package/config/skills/agent/core/get-sops/instructions.md +21 -0
- package/config/skills/agent/core/get-sops/skill.json +20 -0
- package/config/skills/agent/core/get-team-status/execute.sh +8 -0
- package/config/skills/agent/core/get-team-status/instructions.md +17 -0
- package/config/skills/agent/core/get-team-status/skill.json +20 -0
- package/config/skills/agent/core/heartbeat/execute.sh +22 -0
- package/config/skills/agent/core/heartbeat/instructions.md +23 -0
- package/config/skills/agent/core/heartbeat/skill.json +20 -0
- package/config/skills/agent/core/manage-knowledge/execute.sh +60 -0
- package/config/skills/agent/core/manage-knowledge/instructions.md +46 -0
- package/config/skills/agent/core/marketplace-search/execute.sh +77 -0
- package/config/skills/agent/core/marketplace-search/instructions.md +59 -0
- package/config/skills/agent/core/marketplace-search/skill.json +20 -0
- package/config/skills/agent/core/query-knowledge/execute.sh +30 -0
- package/config/skills/agent/core/query-knowledge/instructions.md +47 -0
- package/config/skills/agent/core/query-knowledge/skill.json +20 -0
- package/config/skills/agent/core/read-task/execute.sh +15 -0
- package/config/skills/agent/core/read-task/instructions.md +19 -0
- package/config/skills/agent/core/read-task/skill.json +20 -0
- package/config/skills/agent/core/recall/execute.sh +24 -0
- package/config/skills/agent/core/recall/instructions.md +23 -0
- package/config/skills/agent/core/recall/skill.json +20 -0
- package/config/skills/agent/core/record-learning/execute.sh +29 -0
- package/config/skills/agent/core/record-learning/instructions.md +24 -0
- package/config/skills/agent/core/record-learning/skill.json +20 -0
- package/config/skills/agent/core/register-self/execute.sh +28 -0
- package/config/skills/agent/core/register-self/instructions.md +18 -0
- package/config/skills/agent/core/register-self/skill.json +20 -0
- package/config/skills/agent/core/remember/execute.sh +29 -0
- package/config/skills/agent/core/remember/instructions.md +24 -0
- package/config/skills/agent/core/remember/skill.json +20 -0
- package/config/skills/agent/core/report-progress/execute.sh +28 -0
- package/config/skills/agent/core/report-progress/instructions.md +25 -0
- package/config/skills/agent/core/report-progress/skill.json +20 -0
- package/config/skills/agent/core/report-status/execute.sh +35 -0
- package/config/skills/agent/core/report-status/instructions.md +36 -0
- package/config/skills/agent/core/report-status/skill.json +20 -0
- package/config/skills/agent/core/send-chat-response/execute.sh +26 -0
- package/config/skills/agent/core/send-chat-response/instructions.md +22 -0
- package/config/skills/agent/core/send-chat-response/skill.json +20 -0
- package/config/skills/agent/core/send-message/execute.sh +17 -0
- package/config/skills/agent/core/send-message/instructions.md +20 -0
- package/config/skills/agent/core/send-message/skill.json +20 -0
- package/config/skills/orchestrator/delegate-task/execute.sh +1 -1
- package/config/skills/orchestrator/schedule-check/instructions.md +6 -0
- package/config/skills/registry.json +850 -0
- package/config/templates/research-team.json +2 -2
- package/dist/backend/backend/src/constants.d.ts +89 -4
- package/dist/backend/backend/src/constants.d.ts.map +1 -1
- package/dist/backend/backend/src/constants.js +84 -6
- package/dist/backend/backend/src/constants.js.map +1 -1
- package/dist/backend/backend/src/controllers/marketplace/index.d.ts +1 -1
- package/dist/backend/backend/src/controllers/marketplace/index.d.ts.map +1 -1
- package/dist/backend/backend/src/controllers/marketplace/index.js +1 -1
- package/dist/backend/backend/src/controllers/marketplace/index.js.map +1 -1
- package/dist/backend/backend/src/controllers/marketplace/marketplace.controller.d.ts +64 -8
- package/dist/backend/backend/src/controllers/marketplace/marketplace.controller.d.ts.map +1 -1
- package/dist/backend/backend/src/controllers/marketplace/marketplace.controller.js +194 -96
- package/dist/backend/backend/src/controllers/marketplace/marketplace.controller.js.map +1 -1
- package/dist/backend/backend/src/controllers/marketplace/marketplace.routes.d.ts.map +1 -1
- package/dist/backend/backend/src/controllers/marketplace/marketplace.routes.js +7 -2
- package/dist/backend/backend/src/controllers/marketplace/marketplace.routes.js.map +1 -1
- package/dist/backend/backend/src/controllers/team/team.controller.d.ts.map +1 -1
- package/dist/backend/backend/src/controllers/team/team.controller.js +30 -13
- package/dist/backend/backend/src/controllers/team/team.controller.js.map +1 -1
- 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 +37 -0
- package/dist/backend/backend/src/services/agent/agent-registration.service.js.map +1 -1
- package/dist/backend/backend/src/services/agent/context-window-monitor.service.d.ts +51 -8
- 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 +201 -11
- package/dist/backend/backend/src/services/agent/context-window-monitor.service.js.map +1 -1
- package/dist/backend/backend/src/services/agent/gemini-runtime.service.d.ts +16 -1
- package/dist/backend/backend/src/services/agent/gemini-runtime.service.d.ts.map +1 -1
- package/dist/backend/backend/src/services/agent/gemini-runtime.service.js +99 -9
- package/dist/backend/backend/src/services/agent/gemini-runtime.service.js.map +1 -1
- package/dist/backend/backend/src/services/agent/idle-detection.service.d.ts.map +1 -1
- package/dist/backend/backend/src/services/agent/idle-detection.service.js +11 -4
- package/dist/backend/backend/src/services/agent/idle-detection.service.js.map +1 -1
- package/dist/backend/backend/src/services/agent/pty-activity-tracker.service.d.ts +11 -0
- package/dist/backend/backend/src/services/agent/pty-activity-tracker.service.d.ts.map +1 -1
- package/dist/backend/backend/src/services/agent/pty-activity-tracker.service.js +18 -0
- package/dist/backend/backend/src/services/agent/pty-activity-tracker.service.js.map +1 -1
- package/dist/backend/backend/src/services/agent/runtime-agent.service.abstract.d.ts.map +1 -1
- package/dist/backend/backend/src/services/agent/runtime-agent.service.abstract.js +13 -0
- package/dist/backend/backend/src/services/agent/runtime-agent.service.abstract.js.map +1 -1
- package/dist/backend/backend/src/services/agent/runtime-exit-monitor.service.d.ts +21 -0
- 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 +227 -91
- package/dist/backend/backend/src/services/agent/runtime-exit-monitor.service.js.map +1 -1
- package/dist/backend/backend/src/services/chat/chat.service.d.ts +12 -0
- package/dist/backend/backend/src/services/chat/chat.service.d.ts.map +1 -1
- package/dist/backend/backend/src/services/chat/chat.service.js +23 -1
- package/dist/backend/backend/src/services/chat/chat.service.js.map +1 -1
- package/dist/backend/backend/src/services/continuation/patterns/waiting-patterns.d.ts +6 -0
- package/dist/backend/backend/src/services/continuation/patterns/waiting-patterns.d.ts.map +1 -1
- package/dist/backend/backend/src/services/continuation/patterns/waiting-patterns.js +10 -0
- package/dist/backend/backend/src/services/continuation/patterns/waiting-patterns.js.map +1 -1
- package/dist/backend/backend/src/services/marketplace/index.d.ts +1 -0
- package/dist/backend/backend/src/services/marketplace/index.d.ts.map +1 -1
- package/dist/backend/backend/src/services/marketplace/index.js +2 -0
- package/dist/backend/backend/src/services/marketplace/index.js.map +1 -1
- package/dist/backend/backend/src/services/marketplace/marketplace-installer.service.d.ts +10 -9
- 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 +262 -73
- package/dist/backend/backend/src/services/marketplace/marketplace-installer.service.js.map +1 -1
- package/dist/backend/backend/src/services/marketplace/marketplace-submission.service.d.ts +71 -0
- package/dist/backend/backend/src/services/marketplace/marketplace-submission.service.d.ts.map +1 -0
- package/dist/backend/backend/src/services/marketplace/marketplace-submission.service.js +339 -0
- package/dist/backend/backend/src/services/marketplace/marketplace-submission.service.js.map +1 -0
- package/dist/backend/backend/src/services/marketplace/marketplace.service.d.ts +4 -15
- package/dist/backend/backend/src/services/marketplace/marketplace.service.d.ts.map +1 -1
- package/dist/backend/backend/src/services/marketplace/marketplace.service.js +172 -27
- package/dist/backend/backend/src/services/marketplace/marketplace.service.js.map +1 -1
- package/dist/backend/backend/src/services/messaging/message-queue.service.d.ts +30 -2
- package/dist/backend/backend/src/services/messaging/message-queue.service.d.ts.map +1 -1
- package/dist/backend/backend/src/services/messaging/message-queue.service.js +79 -3
- package/dist/backend/backend/src/services/messaging/message-queue.service.js.map +1 -1
- package/dist/backend/backend/src/services/messaging/queue-processor.service.d.ts.map +1 -1
- package/dist/backend/backend/src/services/messaging/queue-processor.service.js +57 -4
- package/dist/backend/backend/src/services/messaging/queue-processor.service.js.map +1 -1
- package/dist/backend/backend/src/services/orchestrator/orchestrator-heartbeat-monitor.service.d.ts.map +1 -1
- package/dist/backend/backend/src/services/orchestrator/orchestrator-heartbeat-monitor.service.js +20 -1
- 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.map +1 -1
- package/dist/backend/backend/src/services/orchestrator/orchestrator-status.service.js +31 -0
- package/dist/backend/backend/src/services/orchestrator/orchestrator-status.service.js.map +1 -1
- package/dist/backend/backend/src/services/runtime-adapter.d.ts +20 -0
- package/dist/backend/backend/src/services/runtime-adapter.d.ts.map +1 -1
- package/dist/backend/backend/src/services/runtime-adapter.js +22 -1
- package/dist/backend/backend/src/services/runtime-adapter.js.map +1 -1
- package/dist/backend/backend/src/services/session/pty/pty-session-backend.d.ts +19 -0
- package/dist/backend/backend/src/services/session/pty/pty-session-backend.d.ts.map +1 -1
- package/dist/backend/backend/src/services/session/pty/pty-session-backend.js +31 -2
- package/dist/backend/backend/src/services/session/pty/pty-session-backend.js.map +1 -1
- package/dist/backend/backend/src/services/session/session-backend.interface.d.ts +14 -0
- package/dist/backend/backend/src/services/session/session-backend.interface.d.ts.map +1 -1
- package/dist/backend/backend/src/services/session/session-backend.interface.js.map +1 -1
- package/dist/backend/backend/src/services/session/session-command-helper.d.ts +9 -0
- package/dist/backend/backend/src/services/session/session-command-helper.d.ts.map +1 -1
- package/dist/backend/backend/src/services/session/session-command-helper.js +24 -1
- package/dist/backend/backend/src/services/session/session-command-helper.js.map +1 -1
- package/dist/backend/backend/src/services/skill/skill-catalog.service.d.ts +7 -13
- 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 +38 -47
- package/dist/backend/backend/src/services/skill/skill-catalog.service.js.map +1 -1
- package/dist/backend/backend/src/services/skill/skill.service.d.ts +3 -0
- package/dist/backend/backend/src/services/skill/skill.service.d.ts.map +1 -1
- package/dist/backend/backend/src/services/skill/skill.service.js +17 -0
- package/dist/backend/backend/src/services/skill/skill.service.js.map +1 -1
- package/dist/backend/backend/src/types/chat.types.d.ts +5 -5
- package/dist/backend/backend/src/types/chat.types.d.ts.map +1 -1
- package/dist/backend/backend/src/types/chat.types.js +21 -1
- package/dist/backend/backend/src/types/chat.types.js.map +1 -1
- package/dist/backend/backend/src/types/marketplace.types.d.ts +37 -0
- package/dist/backend/backend/src/types/marketplace.types.d.ts.map +1 -1
- package/dist/backend/backend/src/websocket/terminal.gateway.d.ts.map +1 -1
- package/dist/backend/backend/src/websocket/terminal.gateway.js +3 -5
- package/dist/backend/backend/src/websocket/terminal.gateway.js.map +1 -1
- package/dist/backend/config/constants.d.ts +41 -0
- package/dist/backend/config/constants.d.ts.map +1 -1
- package/dist/backend/config/constants.js +57 -0
- package/dist/backend/config/constants.js.map +1 -1
- package/dist/backend/config/index.d.ts +2 -2
- package/dist/backend/config/index.d.ts.map +1 -1
- package/dist/backend/config/index.js +2 -2
- package/dist/backend/config/index.js.map +1 -1
- package/dist/cli/backend/src/constants.d.ts +89 -4
- package/dist/cli/backend/src/constants.d.ts.map +1 -1
- package/dist/cli/backend/src/constants.js +84 -6
- package/dist/cli/backend/src/constants.js.map +1 -1
- package/dist/cli/backend/src/services/continuation/patterns/waiting-patterns.d.ts +40 -0
- package/dist/cli/backend/src/services/continuation/patterns/waiting-patterns.d.ts.map +1 -0
- package/dist/cli/backend/src/services/continuation/patterns/waiting-patterns.js +74 -0
- package/dist/cli/backend/src/services/continuation/patterns/waiting-patterns.js.map +1 -0
- package/dist/cli/backend/src/types/chat.types.d.ts +5 -5
- package/dist/cli/backend/src/types/chat.types.d.ts.map +1 -1
- package/dist/cli/backend/src/types/chat.types.js +21 -1
- package/dist/cli/backend/src/types/chat.types.js.map +1 -1
- package/dist/cli/cli/src/commands/onboard.d.ts +11 -1
- package/dist/cli/cli/src/commands/onboard.d.ts.map +1 -1
- package/dist/cli/cli/src/commands/onboard.js +118 -18
- package/dist/cli/cli/src/commands/onboard.js.map +1 -1
- package/dist/cli/cli/src/commands/publish.d.ts +14 -6
- package/dist/cli/cli/src/commands/publish.d.ts.map +1 -1
- package/dist/cli/cli/src/commands/publish.js +32 -8
- package/dist/cli/cli/src/commands/publish.js.map +1 -1
- package/dist/cli/cli/src/commands/seed-marketplace.d.ts +28 -0
- package/dist/cli/cli/src/commands/seed-marketplace.d.ts.map +1 -0
- package/dist/cli/cli/src/commands/seed-marketplace.js +148 -0
- package/dist/cli/cli/src/commands/seed-marketplace.js.map +1 -0
- package/dist/cli/cli/src/index.js +9 -0
- package/dist/cli/cli/src/index.js.map +1 -1
- package/dist/cli/cli/src/utils/marketplace.d.ts +17 -4
- package/dist/cli/cli/src/utils/marketplace.d.ts.map +1 -1
- package/dist/cli/cli/src/utils/marketplace.js +172 -58
- package/dist/cli/cli/src/utils/marketplace.js.map +1 -1
- package/dist/cli/config/constants.d.ts +41 -0
- package/dist/cli/config/constants.d.ts.map +1 -1
- package/dist/cli/config/constants.js +57 -0
- package/dist/cli/config/constants.js.map +1 -1
- package/dist/cli/config/index.d.ts +2 -2
- package/dist/cli/config/index.d.ts.map +1 -1
- package/dist/cli/config/index.js +2 -2
- package/dist/cli/config/index.js.map +1 -1
- package/frontend/dist/assets/{index-68d1eb5a.js → index-0a245b0d.js} +242 -242
- package/frontend/dist/assets/{index-c5043a83.css → index-6972eeee.css} +1 -1
- package/frontend/dist/index.html +2 -2
- package/package.json +2 -2
- package/config/skills/chrome-browser/instructions.md +0 -42
- package/config/skills/chrome-browser/skill.json +0 -39
- package/config/skills/nano-banana-image/generate.sh +0 -73
- package/config/skills/nano-banana-image/instructions.md +0 -50
- package/config/skills/nano-banana-image/skill.json +0 -39
- package/config/skills/playwright-chrome-browser/instructions.md +0 -95
- package/config/skills/playwright-chrome-browser/skill.json +0 -44
|
@@ -8,7 +8,30 @@
|
|
|
8
8
|
*
|
|
9
9
|
* @module controllers/marketplace/marketplace.controller
|
|
10
10
|
*/
|
|
11
|
-
import
|
|
11
|
+
import path from 'path';
|
|
12
|
+
import { homedir } from 'os';
|
|
13
|
+
import { listItems, getItem, getInstalledItems, getUpdatableItems, fetchRegistry, installItem, uninstallItem, updateItem, submitSkill, listSubmissions, getSubmission, reviewSubmission, } from '../../services/marketplace/index.js';
|
|
14
|
+
const VALID_TYPES = ['skill', 'model', 'role'];
|
|
15
|
+
const VALID_SORTS = ['popular', 'rating', 'newest'];
|
|
16
|
+
const VALID_SUBMISSION_STATUSES = ['pending', 'approved', 'rejected'];
|
|
17
|
+
/**
|
|
18
|
+
* Wraps an async route handler with a standard try/catch that returns
|
|
19
|
+
* a consistent JSON error response on unhandled exceptions.
|
|
20
|
+
*
|
|
21
|
+
* @param fn - The async handler function to wrap
|
|
22
|
+
* @returns A wrapped handler that catches errors and responds with 500
|
|
23
|
+
*/
|
|
24
|
+
function asyncHandler(fn) {
|
|
25
|
+
return async (req, res) => {
|
|
26
|
+
try {
|
|
27
|
+
await fn(req, res);
|
|
28
|
+
}
|
|
29
|
+
catch (error) {
|
|
30
|
+
const msg = error instanceof Error ? error.message : String(error);
|
|
31
|
+
res.status(500).json({ success: false, error: msg });
|
|
32
|
+
}
|
|
33
|
+
};
|
|
34
|
+
}
|
|
12
35
|
/**
|
|
13
36
|
* GET /api/marketplace - List marketplace items with optional filters.
|
|
14
37
|
*
|
|
@@ -25,20 +48,25 @@ import { listItems, getItem, getInstalledItems, getUpdatableItems, fetchRegistry
|
|
|
25
48
|
* GET /api/marketplace?type=skill&search=deploy&sort=popular
|
|
26
49
|
* ```
|
|
27
50
|
*/
|
|
28
|
-
export
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
sortBy: req.query.sort || undefined,
|
|
34
|
-
});
|
|
35
|
-
res.json({ success: true, data: items });
|
|
51
|
+
export const handleListItems = asyncHandler(async (req, res) => {
|
|
52
|
+
const typeParam = req.query.type;
|
|
53
|
+
if (typeParam && !VALID_TYPES.includes(typeParam)) {
|
|
54
|
+
res.status(400).json({ success: false, error: `Invalid type "${typeParam}". Must be one of: ${VALID_TYPES.join(', ')}` });
|
|
55
|
+
return;
|
|
36
56
|
}
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
res.status(
|
|
57
|
+
const sortParam = req.query.sort;
|
|
58
|
+
if (sortParam && !VALID_SORTS.includes(sortParam)) {
|
|
59
|
+
res.status(400).json({ success: false, error: `Invalid sort "${sortParam}". Must be one of: ${VALID_SORTS.join(', ')}` });
|
|
60
|
+
return;
|
|
40
61
|
}
|
|
41
|
-
|
|
62
|
+
const items = await listItems({
|
|
63
|
+
type: typeParam,
|
|
64
|
+
category: req.query.category,
|
|
65
|
+
search: req.query.search,
|
|
66
|
+
sortBy: sortParam,
|
|
67
|
+
});
|
|
68
|
+
res.json({ success: true, data: items });
|
|
69
|
+
});
|
|
42
70
|
/**
|
|
43
71
|
* GET /api/marketplace/installed - List locally installed marketplace items.
|
|
44
72
|
*
|
|
@@ -53,16 +81,10 @@ export async function handleListItems(req, res) {
|
|
|
53
81
|
* GET /api/marketplace/installed
|
|
54
82
|
* ```
|
|
55
83
|
*/
|
|
56
|
-
export
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
}
|
|
61
|
-
catch (error) {
|
|
62
|
-
const msg = error instanceof Error ? error.message : String(error);
|
|
63
|
-
res.status(500).json({ success: false, error: msg });
|
|
64
|
-
}
|
|
65
|
-
}
|
|
84
|
+
export const handleListInstalled = asyncHandler(async (_req, res) => {
|
|
85
|
+
const items = await getInstalledItems();
|
|
86
|
+
res.json({ success: true, data: items });
|
|
87
|
+
});
|
|
66
88
|
/**
|
|
67
89
|
* GET /api/marketplace/updates - List items with available updates.
|
|
68
90
|
*
|
|
@@ -77,16 +99,10 @@ export async function handleListInstalled(_req, res) {
|
|
|
77
99
|
* GET /api/marketplace/updates
|
|
78
100
|
* ```
|
|
79
101
|
*/
|
|
80
|
-
export
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
}
|
|
85
|
-
catch (error) {
|
|
86
|
-
const msg = error instanceof Error ? error.message : String(error);
|
|
87
|
-
res.status(500).json({ success: false, error: msg });
|
|
88
|
-
}
|
|
89
|
-
}
|
|
102
|
+
export const handleListUpdates = asyncHandler(async (_req, res) => {
|
|
103
|
+
const items = await getUpdatableItems();
|
|
104
|
+
res.json({ success: true, data: items });
|
|
105
|
+
});
|
|
90
106
|
/**
|
|
91
107
|
* GET /api/marketplace/:id - Get a single marketplace item by ID.
|
|
92
108
|
*
|
|
@@ -101,20 +117,14 @@ export async function handleListUpdates(_req, res) {
|
|
|
101
117
|
* GET /api/marketplace/skill-deploy-aws
|
|
102
118
|
* ```
|
|
103
119
|
*/
|
|
104
|
-
export
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
return;
|
|
110
|
-
}
|
|
111
|
-
res.json({ success: true, data: item });
|
|
120
|
+
export const handleGetItem = asyncHandler(async (req, res) => {
|
|
121
|
+
const item = await getItem(req.params.id);
|
|
122
|
+
if (!item) {
|
|
123
|
+
res.status(404).json({ success: false, error: 'Item not found' });
|
|
124
|
+
return;
|
|
112
125
|
}
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
res.status(500).json({ success: false, error: msg });
|
|
116
|
-
}
|
|
117
|
-
}
|
|
126
|
+
res.json({ success: true, data: item });
|
|
127
|
+
});
|
|
118
128
|
/**
|
|
119
129
|
* POST /api/marketplace/refresh - Force refresh the registry cache.
|
|
120
130
|
*
|
|
@@ -129,19 +139,13 @@ export async function handleGetItem(req, res) {
|
|
|
129
139
|
* POST /api/marketplace/refresh
|
|
130
140
|
* ```
|
|
131
141
|
*/
|
|
132
|
-
export
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
}
|
|
140
|
-
catch (error) {
|
|
141
|
-
const msg = error instanceof Error ? error.message : String(error);
|
|
142
|
-
res.status(500).json({ success: false, error: msg });
|
|
143
|
-
}
|
|
144
|
-
}
|
|
142
|
+
export const handleRefresh = asyncHandler(async (_req, res) => {
|
|
143
|
+
const registry = await fetchRegistry(true);
|
|
144
|
+
res.json({
|
|
145
|
+
success: true,
|
|
146
|
+
data: { itemCount: registry.items.length, lastUpdated: registry.lastUpdated },
|
|
147
|
+
});
|
|
148
|
+
});
|
|
145
149
|
/**
|
|
146
150
|
* POST /api/marketplace/:id/install - Install a marketplace item.
|
|
147
151
|
*
|
|
@@ -157,21 +161,15 @@ export async function handleRefresh(_req, res) {
|
|
|
157
161
|
* POST /api/marketplace/skill-deploy-aws/install
|
|
158
162
|
* ```
|
|
159
163
|
*/
|
|
160
|
-
export
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
return;
|
|
166
|
-
}
|
|
167
|
-
const result = await installItem(item);
|
|
168
|
-
res.json(result);
|
|
164
|
+
export const handleInstall = asyncHandler(async (req, res) => {
|
|
165
|
+
const item = await getItem(req.params.id);
|
|
166
|
+
if (!item) {
|
|
167
|
+
res.status(404).json({ success: false, error: 'Item not found' });
|
|
168
|
+
return;
|
|
169
169
|
}
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
}
|
|
174
|
-
}
|
|
170
|
+
const result = await installItem(item);
|
|
171
|
+
res.json(result);
|
|
172
|
+
});
|
|
175
173
|
/**
|
|
176
174
|
* POST /api/marketplace/:id/uninstall - Uninstall a marketplace item.
|
|
177
175
|
*
|
|
@@ -186,16 +184,10 @@ export async function handleInstall(req, res) {
|
|
|
186
184
|
* POST /api/marketplace/skill-deploy-aws/uninstall
|
|
187
185
|
* ```
|
|
188
186
|
*/
|
|
189
|
-
export
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
}
|
|
194
|
-
catch (error) {
|
|
195
|
-
const msg = error instanceof Error ? error.message : String(error);
|
|
196
|
-
res.status(500).json({ success: false, error: msg });
|
|
197
|
-
}
|
|
198
|
-
}
|
|
187
|
+
export const handleUninstall = asyncHandler(async (req, res) => {
|
|
188
|
+
const result = await uninstallItem(req.params.id);
|
|
189
|
+
res.json(result);
|
|
190
|
+
});
|
|
199
191
|
/**
|
|
200
192
|
* POST /api/marketplace/:id/update - Update a marketplace item.
|
|
201
193
|
*
|
|
@@ -210,19 +202,125 @@ export async function handleUninstall(req, res) {
|
|
|
210
202
|
* POST /api/marketplace/skill-deploy-aws/update
|
|
211
203
|
* ```
|
|
212
204
|
*/
|
|
213
|
-
export
|
|
214
|
-
|
|
215
|
-
|
|
216
|
-
|
|
217
|
-
|
|
218
|
-
return;
|
|
219
|
-
}
|
|
220
|
-
const result = await updateItem(item);
|
|
221
|
-
res.json(result);
|
|
205
|
+
export const handleUpdate = asyncHandler(async (req, res) => {
|
|
206
|
+
const item = await getItem(req.params.id);
|
|
207
|
+
if (!item) {
|
|
208
|
+
res.status(404).json({ success: false, error: 'Item not found' });
|
|
209
|
+
return;
|
|
222
210
|
}
|
|
223
|
-
|
|
224
|
-
|
|
225
|
-
|
|
211
|
+
const result = await updateItem(item);
|
|
212
|
+
res.json(result);
|
|
213
|
+
});
|
|
214
|
+
/**
|
|
215
|
+
* POST /api/marketplace/submit - Submit a skill for marketplace review.
|
|
216
|
+
*
|
|
217
|
+
* Accepts a JSON body with `archivePath` pointing to a local tar.gz archive.
|
|
218
|
+
* Validates the archive contents, stores a copy, and creates a pending
|
|
219
|
+
* submission record.
|
|
220
|
+
*
|
|
221
|
+
* @param req - Express request with body: { archivePath: string }
|
|
222
|
+
* @param res - Express response returning submission result
|
|
223
|
+
*
|
|
224
|
+
* @example
|
|
225
|
+
* ```
|
|
226
|
+
* POST /api/marketplace/submit
|
|
227
|
+
* { "archivePath": "/path/to/my-skill-1.0.0.tar.gz" }
|
|
228
|
+
* ```
|
|
229
|
+
*/
|
|
230
|
+
export const handleSubmit = asyncHandler(async (req, res) => {
|
|
231
|
+
const { archivePath } = req.body;
|
|
232
|
+
if (!archivePath) {
|
|
233
|
+
res.status(400).json({ success: false, error: 'archivePath is required' });
|
|
234
|
+
return;
|
|
226
235
|
}
|
|
227
|
-
|
|
236
|
+
// Validate archivePath is within allowed directories to prevent path traversal
|
|
237
|
+
const resolvedPath = path.resolve(archivePath);
|
|
238
|
+
const allowedDirs = [
|
|
239
|
+
path.resolve(homedir(), '.crewly'),
|
|
240
|
+
path.resolve(process.cwd()),
|
|
241
|
+
path.resolve('/tmp'),
|
|
242
|
+
];
|
|
243
|
+
const isAllowed = allowedDirs.some((dir) => {
|
|
244
|
+
const normalizedDir = dir.endsWith(path.sep) ? dir : dir + path.sep;
|
|
245
|
+
return resolvedPath === dir || resolvedPath.startsWith(normalizedDir);
|
|
246
|
+
});
|
|
247
|
+
if (!isAllowed) {
|
|
248
|
+
res.status(400).json({
|
|
249
|
+
success: false,
|
|
250
|
+
error: 'archivePath must be within the project directory, ~/.crewly, or /tmp',
|
|
251
|
+
});
|
|
252
|
+
return;
|
|
253
|
+
}
|
|
254
|
+
const result = await submitSkill(archivePath);
|
|
255
|
+
res.json(result);
|
|
256
|
+
});
|
|
257
|
+
/**
|
|
258
|
+
* GET /api/marketplace/submissions - List all submissions.
|
|
259
|
+
*
|
|
260
|
+
* Accepts an optional `status` query parameter to filter by submission status.
|
|
261
|
+
*
|
|
262
|
+
* @param req - Express request with optional query: status (pending|approved|rejected)
|
|
263
|
+
* @param res - Express response returning { success, data: MarketplaceSubmission[] }
|
|
264
|
+
*
|
|
265
|
+
* @example
|
|
266
|
+
* ```
|
|
267
|
+
* GET /api/marketplace/submissions?status=pending
|
|
268
|
+
* ```
|
|
269
|
+
*/
|
|
270
|
+
export const handleListSubmissions = asyncHandler(async (req, res) => {
|
|
271
|
+
const statusParam = req.query.status;
|
|
272
|
+
if (statusParam && !VALID_SUBMISSION_STATUSES.includes(statusParam)) {
|
|
273
|
+
res.status(400).json({
|
|
274
|
+
success: false,
|
|
275
|
+
error: `Invalid status "${statusParam}". Must be one of: ${VALID_SUBMISSION_STATUSES.join(', ')}`,
|
|
276
|
+
});
|
|
277
|
+
return;
|
|
278
|
+
}
|
|
279
|
+
const submissions = await listSubmissions(statusParam);
|
|
280
|
+
res.json({ success: true, data: submissions });
|
|
281
|
+
});
|
|
282
|
+
/**
|
|
283
|
+
* GET /api/marketplace/submissions/:id - Get a single submission.
|
|
284
|
+
*
|
|
285
|
+
* @param req - Express request with params.id
|
|
286
|
+
* @param res - Express response returning { success, data: MarketplaceSubmission } or 404
|
|
287
|
+
*
|
|
288
|
+
* @example
|
|
289
|
+
* ```
|
|
290
|
+
* GET /api/marketplace/submissions/abc-123
|
|
291
|
+
* ```
|
|
292
|
+
*/
|
|
293
|
+
export const handleGetSubmission = asyncHandler(async (req, res) => {
|
|
294
|
+
const submission = await getSubmission(req.params.id);
|
|
295
|
+
if (!submission) {
|
|
296
|
+
res.status(404).json({ success: false, error: 'Submission not found' });
|
|
297
|
+
return;
|
|
298
|
+
}
|
|
299
|
+
res.json({ success: true, data: submission });
|
|
300
|
+
});
|
|
301
|
+
/**
|
|
302
|
+
* POST /api/marketplace/submissions/:id/review - Approve or reject a submission.
|
|
303
|
+
*
|
|
304
|
+
* @param req - Express request with params.id and body: { action: 'approve'|'reject', notes?: string }
|
|
305
|
+
* @param res - Express response returning operation result
|
|
306
|
+
*
|
|
307
|
+
* @example
|
|
308
|
+
* ```
|
|
309
|
+
* POST /api/marketplace/submissions/abc-123/review
|
|
310
|
+
* { "action": "approve" }
|
|
311
|
+
* ```
|
|
312
|
+
*/
|
|
313
|
+
export const handleReviewSubmission = asyncHandler(async (req, res) => {
|
|
314
|
+
const { action, notes } = req.body;
|
|
315
|
+
if (action !== 'approve' && action !== 'reject') {
|
|
316
|
+
res.status(400).json({ success: false, error: 'action must be "approve" or "reject"' });
|
|
317
|
+
return;
|
|
318
|
+
}
|
|
319
|
+
const result = await reviewSubmission(req.params.id, action, notes);
|
|
320
|
+
if (!result.success && result.message.startsWith('Submission not found')) {
|
|
321
|
+
res.status(404).json(result);
|
|
322
|
+
return;
|
|
323
|
+
}
|
|
324
|
+
res.json(result);
|
|
325
|
+
});
|
|
228
326
|
//# sourceMappingURL=marketplace.controller.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"marketplace.controller.js","sourceRoot":"","sources":["../../../../../../backend/src/controllers/marketplace/marketplace.controller.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAGH,OAAO,EACL,SAAS,EACT,OAAO,EACP,iBAAiB,EACjB,iBAAiB,EACjB,aAAa,EACb,WAAW,EACX,aAAa,EACb,UAAU,
|
|
1
|
+
{"version":3,"file":"marketplace.controller.js","sourceRoot":"","sources":["../../../../../../backend/src/controllers/marketplace/marketplace.controller.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"marketplace.routes.d.ts","sourceRoot":"","sources":["../../../../../../backend/src/controllers/marketplace/marketplace.routes.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,EAAE,MAAM,EAAE,MAAM,SAAS,CAAC;
|
|
1
|
+
{"version":3,"file":"marketplace.routes.d.ts","sourceRoot":"","sources":["../../../../../../backend/src/controllers/marketplace/marketplace.routes.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,EAAE,MAAM,EAAE,MAAM,SAAS,CAAC;AAgBjC;;;;;;;;;;;;;;;;;GAiBG;AACH,wBAAgB,uBAAuB,IAAI,MAAM,CAsBhD"}
|
|
@@ -8,7 +8,7 @@
|
|
|
8
8
|
* @module controllers/marketplace/marketplace.routes
|
|
9
9
|
*/
|
|
10
10
|
import { Router } from 'express';
|
|
11
|
-
import { handleListItems, handleListInstalled, handleListUpdates, handleGetItem, handleRefresh, handleInstall, handleUninstall, handleUpdate, } from './marketplace.controller.js';
|
|
11
|
+
import { handleListItems, handleListInstalled, handleListUpdates, handleGetItem, handleRefresh, handleInstall, handleUninstall, handleUpdate, handleSubmit, handleListSubmissions, handleGetSubmission, handleReviewSubmission, } from './marketplace.controller.js';
|
|
12
12
|
/**
|
|
13
13
|
* Creates the marketplace router with all marketplace endpoints.
|
|
14
14
|
*
|
|
@@ -29,11 +29,16 @@ import { handleListItems, handleListInstalled, handleListUpdates, handleGetItem,
|
|
|
29
29
|
*/
|
|
30
30
|
export function createMarketplaceRouter() {
|
|
31
31
|
const router = Router();
|
|
32
|
-
// Static routes first to avoid /:id matching "installed", "updates", "refresh"
|
|
32
|
+
// Static routes first to avoid /:id matching "installed", "updates", "refresh", "submissions"
|
|
33
33
|
router.get('/', handleListItems);
|
|
34
34
|
router.get('/installed', handleListInstalled);
|
|
35
35
|
router.get('/updates', handleListUpdates);
|
|
36
36
|
router.post('/refresh', handleRefresh);
|
|
37
|
+
// Submission routes (static paths, must come before /:id)
|
|
38
|
+
router.post('/submit', handleSubmit);
|
|
39
|
+
router.get('/submissions', handleListSubmissions);
|
|
40
|
+
router.get('/submissions/:id', handleGetSubmission);
|
|
41
|
+
router.post('/submissions/:id/review', handleReviewSubmission);
|
|
37
42
|
// Parameterized routes after static routes
|
|
38
43
|
router.get('/:id', handleGetItem);
|
|
39
44
|
router.post('/:id/install', handleInstall);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"marketplace.routes.js","sourceRoot":"","sources":["../../../../../../backend/src/controllers/marketplace/marketplace.routes.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,EAAE,MAAM,EAAE,MAAM,SAAS,CAAC;AACjC,OAAO,EACL,eAAe,EACf,mBAAmB,EACnB,iBAAiB,EACjB,aAAa,EACb,aAAa,EACb,aAAa,EACb,eAAe,EACf,YAAY,
|
|
1
|
+
{"version":3,"file":"marketplace.routes.js","sourceRoot":"","sources":["../../../../../../backend/src/controllers/marketplace/marketplace.routes.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,EAAE,MAAM,EAAE,MAAM,SAAS,CAAC;AACjC,OAAO,EACL,eAAe,EACf,mBAAmB,EACnB,iBAAiB,EACjB,aAAa,EACb,aAAa,EACb,aAAa,EACb,eAAe,EACf,YAAY,EACZ,YAAY,EACZ,qBAAqB,EACrB,mBAAmB,EACnB,sBAAsB,GACvB,MAAM,6BAA6B,CAAC;AAErC;;;;;;;;;;;;;;;;;GAiBG;AACH,MAAM,UAAU,uBAAuB;IACrC,MAAM,MAAM,GAAG,MAAM,EAAE,CAAC;IAExB,8FAA8F;IAC9F,MAAM,CAAC,GAAG,CAAC,GAAG,EAAE,eAAe,CAAC,CAAC;IACjC,MAAM,CAAC,GAAG,CAAC,YAAY,EAAE,mBAAmB,CAAC,CAAC;IAC9C,MAAM,CAAC,GAAG,CAAC,UAAU,EAAE,iBAAiB,CAAC,CAAC;IAC1C,MAAM,CAAC,IAAI,CAAC,UAAU,EAAE,aAAa,CAAC,CAAC;IAEvC,0DAA0D;IAC1D,MAAM,CAAC,IAAI,CAAC,SAAS,EAAE,YAAY,CAAC,CAAC;IACrC,MAAM,CAAC,GAAG,CAAC,cAAc,EAAE,qBAAqB,CAAC,CAAC;IAClD,MAAM,CAAC,GAAG,CAAC,kBAAkB,EAAE,mBAAmB,CAAC,CAAC;IACpD,MAAM,CAAC,IAAI,CAAC,yBAAyB,EAAE,sBAAsB,CAAC,CAAC;IAE/D,2CAA2C;IAC3C,MAAM,CAAC,GAAG,CAAC,MAAM,EAAE,aAAa,CAAC,CAAC;IAClC,MAAM,CAAC,IAAI,CAAC,cAAc,EAAE,aAAa,CAAC,CAAC;IAC3C,MAAM,CAAC,IAAI,CAAC,gBAAgB,EAAE,eAAe,CAAC,CAAC;IAC/C,MAAM,CAAC,IAAI,CAAC,aAAa,EAAE,YAAY,CAAC,CAAC;IAEzC,OAAO,MAAM,CAAC;AAChB,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"team.controller.d.ts","sourceRoot":"","sources":["../../../../../../backend/src/controllers/team/team.controller.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAC;AAC5C,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;
|
|
1
|
+
{"version":3,"file":"team.controller.d.ts","sourceRoot":"","sources":["../../../../../../backend/src/controllers/team/team.controller.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,8 +1,9 @@
|
|
|
1
1
|
import { v4 as uuidv4 } from 'uuid';
|
|
2
|
-
import { ORCHESTRATOR_SESSION_NAME, ORCHESTRATOR_ROLE, RUNTIME_TYPES } from '../../constants.js';
|
|
2
|
+
import { ORCHESTRATOR_SESSION_NAME, ORCHESTRATOR_ROLE, RUNTIME_TYPES, NON_RECOVERABLE_ERROR_PATTERNS } from '../../constants.js';
|
|
3
3
|
import { CREWLY_CONSTANTS } from '../../constants.js';
|
|
4
4
|
import { updateAgentHeartbeat } from '../../services/agent/agent-heartbeat.service.js';
|
|
5
5
|
import { getSessionBackendSync, getSessionStatePersistence } from '../../services/session/index.js';
|
|
6
|
+
import { getSettingsService } from '../../services/settings/settings.service.js';
|
|
6
7
|
import { getTerminalGateway } from '../../websocket/terminal.gateway.js';
|
|
7
8
|
import { ActivityMonitorService } from '../../services/monitoring/activity-monitor.service.js';
|
|
8
9
|
import { MemoryService } from '../../services/memory/memory.service.js';
|
|
@@ -24,6 +25,20 @@ let eventBusService = null;
|
|
|
24
25
|
export function setTeamControllerEventBusService(service) {
|
|
25
26
|
eventBusService = service;
|
|
26
27
|
}
|
|
28
|
+
/**
|
|
29
|
+
* Get the default runtime type from user settings, falling back to CLAUDE_CODE.
|
|
30
|
+
*
|
|
31
|
+
* @returns The default runtime type configured in settings
|
|
32
|
+
*/
|
|
33
|
+
async function getDefaultRuntime() {
|
|
34
|
+
try {
|
|
35
|
+
const settings = await getSettingsService().getSettings();
|
|
36
|
+
return settings.general.defaultRuntime || RUNTIME_TYPES.CLAUDE_CODE;
|
|
37
|
+
}
|
|
38
|
+
catch {
|
|
39
|
+
return RUNTIME_TYPES.CLAUDE_CODE;
|
|
40
|
+
}
|
|
41
|
+
}
|
|
27
42
|
/**
|
|
28
43
|
* Build the virtual orchestrator Team object.
|
|
29
44
|
*
|
|
@@ -221,6 +236,11 @@ async function _startTeamMemberCore(context, team, member, projectPath) {
|
|
|
221
236
|
break;
|
|
222
237
|
}
|
|
223
238
|
lastError = createResult.error;
|
|
239
|
+
// Don't retry non-recoverable errors (e.g. missing CLI binary)
|
|
240
|
+
if (lastError && NON_RECOVERABLE_ERROR_PATTERNS.some(p => lastError.includes(p))) {
|
|
241
|
+
logger.error('Non-recoverable error detected, skipping retries', { sessionName, lastError });
|
|
242
|
+
break;
|
|
243
|
+
}
|
|
224
244
|
// If this isn't the last attempt, wait before retrying with exponential backoff
|
|
225
245
|
if (attempt < MAX_CREATION_RETRIES) {
|
|
226
246
|
const retryDelay = 1000 * attempt; // 1s, 2s exponential backoff
|
|
@@ -431,7 +451,7 @@ export async function createTeam(req, res) {
|
|
|
431
451
|
systemPrompt: member.systemPrompt,
|
|
432
452
|
agentStatus: CREWLY_CONSTANTS.AGENT_STATUSES.INACTIVE,
|
|
433
453
|
workingStatus: CREWLY_CONSTANTS.WORKING_STATUSES.IDLE,
|
|
434
|
-
runtimeType: member.runtimeType ||
|
|
454
|
+
runtimeType: member.runtimeType || await getDefaultRuntime(),
|
|
435
455
|
skillOverrides: member.skillOverrides || [],
|
|
436
456
|
excludedRoleSkills: member.excludedRoleSkills || [],
|
|
437
457
|
createdAt: new Date().toISOString(),
|
|
@@ -849,7 +869,7 @@ export async function addTeamMember(req, res) {
|
|
|
849
869
|
systemPrompt: `You are ${name}, a ${role} on the ${team.name} team.`,
|
|
850
870
|
agentStatus: CREWLY_CONSTANTS.AGENT_STATUSES.INACTIVE,
|
|
851
871
|
workingStatus: CREWLY_CONSTANTS.WORKING_STATUSES.IDLE,
|
|
852
|
-
runtimeType:
|
|
872
|
+
runtimeType: await getDefaultRuntime(),
|
|
853
873
|
createdAt: new Date().toISOString(),
|
|
854
874
|
updatedAt: new Date().toISOString()
|
|
855
875
|
};
|
|
@@ -1171,7 +1191,8 @@ export async function registerMemberStatus(req, res) {
|
|
|
1171
1191
|
logger.info('Flushing queued messages', { count: queuedMessages.length, sessionName });
|
|
1172
1192
|
// Deliver sequentially in the background
|
|
1173
1193
|
(async () => {
|
|
1174
|
-
for (
|
|
1194
|
+
for (let i = 0; i < queuedMessages.length; i++) {
|
|
1195
|
+
const queuedMsg = queuedMessages[i];
|
|
1175
1196
|
try {
|
|
1176
1197
|
await this.agentRegistrationService.sendMessageToAgent(sessionName, queuedMsg.data, runtimeType);
|
|
1177
1198
|
logger.info('Delivered queued message', { sessionName, queuedAt: new Date(queuedMsg.queuedAt).toISOString() });
|
|
@@ -1180,7 +1201,7 @@ export async function registerMemberStatus(req, res) {
|
|
|
1180
1201
|
logger.error('Failed to deliver queued message', { sessionName, error: flushError instanceof Error ? flushError.message : String(flushError) });
|
|
1181
1202
|
}
|
|
1182
1203
|
// Delay between messages to let the agent process each one
|
|
1183
|
-
if (
|
|
1204
|
+
if (i < queuedMessages.length - 1) {
|
|
1184
1205
|
await new Promise(resolve => setTimeout(resolve, SUB_AGENT_QUEUE_CONSTANTS.FLUSH_INTER_MESSAGE_DELAY));
|
|
1185
1206
|
}
|
|
1186
1207
|
}
|
|
@@ -1434,10 +1455,6 @@ export async function getTeamActivityStatus(req, res) {
|
|
|
1434
1455
|
const savePromises = teamsToUpdate.map(team => this.storageService.saveTeam(team));
|
|
1435
1456
|
await Promise.all(savePromises);
|
|
1436
1457
|
}
|
|
1437
|
-
// Clean up memory before sending response
|
|
1438
|
-
if (global.gc) {
|
|
1439
|
-
global.gc();
|
|
1440
|
-
}
|
|
1441
1458
|
res.json({
|
|
1442
1459
|
success: true,
|
|
1443
1460
|
data: {
|
|
@@ -1467,7 +1484,7 @@ export async function updateTeamMemberRuntime(req, res) {
|
|
|
1467
1484
|
return;
|
|
1468
1485
|
}
|
|
1469
1486
|
// Validate runtime type
|
|
1470
|
-
const validRuntimeTypes =
|
|
1487
|
+
const validRuntimeTypes = Object.values(RUNTIME_TYPES);
|
|
1471
1488
|
if (!validRuntimeTypes.includes(runtimeType)) {
|
|
1472
1489
|
res.status(400).json({
|
|
1473
1490
|
success: false,
|
|
@@ -1603,7 +1620,7 @@ export async function updateTeam(req, res) {
|
|
|
1603
1620
|
}
|
|
1604
1621
|
// Update members if provided (from TeamModal edit)
|
|
1605
1622
|
if (updates.members !== undefined && Array.isArray(updates.members)) {
|
|
1606
|
-
team.members = updates.members.map((memberUpdate) => {
|
|
1623
|
+
team.members = await Promise.all(updates.members.map(async (memberUpdate) => {
|
|
1607
1624
|
// Find existing member by name (since the modal doesn't send IDs)
|
|
1608
1625
|
const existingMember = team.members.find(m => m.name === memberUpdate.name);
|
|
1609
1626
|
if (existingMember) {
|
|
@@ -1628,7 +1645,7 @@ export async function updateTeam(req, res) {
|
|
|
1628
1645
|
systemPrompt: memberUpdate.systemPrompt,
|
|
1629
1646
|
agentStatus: CREWLY_CONSTANTS.AGENT_STATUSES.INACTIVE,
|
|
1630
1647
|
workingStatus: CREWLY_CONSTANTS.WORKING_STATUSES.IDLE,
|
|
1631
|
-
runtimeType: memberUpdate.runtimeType ||
|
|
1648
|
+
runtimeType: memberUpdate.runtimeType || await getDefaultRuntime(),
|
|
1632
1649
|
avatar: memberUpdate.avatar,
|
|
1633
1650
|
skillOverrides: memberUpdate.skillOverrides || [],
|
|
1634
1651
|
excludedRoleSkills: memberUpdate.excludedRoleSkills || [],
|
|
@@ -1636,7 +1653,7 @@ export async function updateTeam(req, res) {
|
|
|
1636
1653
|
updatedAt: new Date().toISOString()
|
|
1637
1654
|
};
|
|
1638
1655
|
}
|
|
1639
|
-
});
|
|
1656
|
+
}));
|
|
1640
1657
|
}
|
|
1641
1658
|
// Update timestamp
|
|
1642
1659
|
team.updatedAt = new Date().toISOString();
|