crewly 1.2.7 → 1.2.9
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/skills/agent/core/reply-chat/execute.sh +59 -0
- package/config/skills/agent/core/reply-chat/instructions.md +27 -0
- package/config/skills/agent/core/reply-chat/skill.json +20 -0
- package/config/skills/orchestrator/reply-chat/execute.sh +136 -0
- package/config/skills/orchestrator/reply-chat/instructions.md +53 -0
- package/config/skills/orchestrator/reply-chat/skill.json +20 -0
- package/dist/backend/backend/src/constants.d.ts +9 -0
- package/dist/backend/backend/src/constants.d.ts.map +1 -1
- package/dist/backend/backend/src/constants.js +9 -0
- package/dist/backend/backend/src/constants.js.map +1 -1
- package/dist/backend/backend/src/controllers/messaging/messenger.routes.d.ts.map +1 -1
- package/dist/backend/backend/src/controllers/messaging/messenger.routes.js +6 -3
- package/dist/backend/backend/src/controllers/messaging/messenger.routes.js.map +1 -1
- package/dist/backend/backend/src/controllers/settings/settings.controller.d.ts.map +1 -1
- package/dist/backend/backend/src/controllers/settings/settings.controller.js +97 -2
- package/dist/backend/backend/src/controllers/settings/settings.controller.js.map +1 -1
- package/dist/backend/backend/src/controllers/team/team.controller.d.ts.map +1 -1
- package/dist/backend/backend/src/controllers/team/team.controller.js +149 -1
- package/dist/backend/backend/src/controllers/team/team.controller.js.map +1 -1
- package/dist/backend/backend/src/index.d.ts +5 -0
- package/dist/backend/backend/src/index.d.ts.map +1 -1
- package/dist/backend/backend/src/index.js +30 -0
- package/dist/backend/backend/src/index.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 +126 -86
- 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.map +1 -1
- package/dist/backend/backend/src/services/agent/auditor-scheduler.service.js +14 -3
- package/dist/backend/backend/src/services/agent/auditor-scheduler.service.js.map +1 -1
- package/dist/backend/backend/src/services/agent/crewly-agent/model-manager.d.ts +16 -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 +52 -5
- package/dist/backend/backend/src/services/agent/crewly-agent/model-manager.js.map +1 -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 +22 -9
- package/dist/backend/backend/src/services/agent/gemini-runtime.service.js.map +1 -1
- 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 +4 -3
- package/dist/backend/backend/src/services/event-bus/event-bus.service.js.map +1 -1
- package/dist/backend/backend/src/services/messaging/adapters/google-chat-messenger.adapter.d.ts +58 -2
- 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 +158 -7
- 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 +43 -0
- package/dist/backend/backend/src/services/messaging/google-chat-initializer.d.ts.map +1 -0
- package/dist/backend/backend/src/services/messaging/google-chat-initializer.js +138 -0
- package/dist/backend/backend/src/services/messaging/google-chat-initializer.js.map +1 -0
- package/dist/backend/backend/src/services/messaging/response-router.service.d.ts +12 -0
- package/dist/backend/backend/src/services/messaging/response-router.service.d.ts.map +1 -1
- package/dist/backend/backend/src/services/messaging/response-router.service.js +27 -42
- package/dist/backend/backend/src/services/messaging/response-router.service.js.map +1 -1
- package/dist/backend/backend/src/services/orchestrator/orchestrator-restart.service.d.ts.map +1 -1
- package/dist/backend/backend/src/services/orchestrator/orchestrator-restart.service.js +12 -3
- package/dist/backend/backend/src/services/orchestrator/orchestrator-restart.service.js.map +1 -1
- package/dist/backend/backend/src/services/settings/settings.service.d.ts +9 -1
- package/dist/backend/backend/src/services/settings/settings.service.d.ts.map +1 -1
- package/dist/backend/backend/src/services/settings/settings.service.js +12 -1
- package/dist/backend/backend/src/services/settings/settings.service.js.map +1 -1
- package/dist/backend/backend/src/services/slack/notify-reconciliation.service.d.ts.map +1 -1
- package/dist/backend/backend/src/services/slack/notify-reconciliation.service.js +13 -0
- package/dist/backend/backend/src/services/slack/notify-reconciliation.service.js.map +1 -1
- package/dist/backend/backend/src/types/chat.types.d.ts +1 -1
- package/dist/backend/backend/src/types/chat.types.d.ts.map +1 -1
- package/dist/backend/backend/src/types/chat.types.js +1 -1
- package/dist/backend/backend/src/types/chat.types.js.map +1 -1
- package/dist/backend/backend/src/types/settings.types.d.ts +93 -0
- package/dist/backend/backend/src/types/settings.types.d.ts.map +1 -1
- package/dist/backend/backend/src/types/settings.types.js +131 -0
- package/dist/backend/backend/src/types/settings.types.js.map +1 -1
- package/dist/backend/backend/src/types/skill.types.js +2 -2
- package/dist/backend/backend/src/types/skill.types.js.map +1 -1
- package/dist/backend/backend/src/utils/format-error.d.ts +8 -0
- package/dist/backend/backend/src/utils/format-error.d.ts.map +1 -0
- package/dist/backend/backend/src/utils/format-error.js +10 -0
- package/dist/backend/backend/src/utils/format-error.js.map +1 -0
- package/dist/backend/backend/src/websocket/terminal.gateway.d.ts.map +1 -1
- package/dist/backend/backend/src/websocket/terminal.gateway.js +15 -10
- package/dist/backend/backend/src/websocket/terminal.gateway.js.map +1 -1
- package/dist/cli/backend/src/constants.d.ts +9 -0
- package/dist/cli/backend/src/constants.d.ts.map +1 -1
- package/dist/cli/backend/src/constants.js +9 -0
- package/dist/cli/backend/src/constants.js.map +1 -1
- package/dist/cli/backend/src/types/chat.types.d.ts +1 -1
- package/dist/cli/backend/src/types/chat.types.d.ts.map +1 -1
- package/dist/cli/backend/src/types/chat.types.js +1 -1
- package/dist/cli/backend/src/types/chat.types.js.map +1 -1
- package/dist/cli/backend/src/types/settings.types.d.ts +93 -0
- package/dist/cli/backend/src/types/settings.types.d.ts.map +1 -1
- package/dist/cli/backend/src/types/settings.types.js +131 -0
- package/dist/cli/backend/src/types/settings.types.js.map +1 -1
- package/dist/cli/backend/src/types/skill.types.js +2 -2
- package/dist/cli/backend/src/types/skill.types.js.map +1 -1
- package/frontend/dist/assets/index-58509b6a.js +4919 -0
- package/frontend/dist/assets/{index-dee3a3a9.css → index-ddb38eb0.css} +1 -1
- package/frontend/dist/index.html +2 -2
- package/package.json +1 -1
- package/frontend/dist/assets/index-5cf8820f.js +0 -4919
|
@@ -7,11 +7,12 @@
|
|
|
7
7
|
*/
|
|
8
8
|
import { Router } from 'express';
|
|
9
9
|
import { getSettingsService, SettingsValidationError, } from '../../services/settings/settings.service.js';
|
|
10
|
+
import { maskApiKeysSettings, isValidApiKeyProvider, } from '../../types/settings.types.js';
|
|
10
11
|
const router = Router();
|
|
11
12
|
/**
|
|
12
13
|
* Valid section names for reset endpoints
|
|
13
14
|
*/
|
|
14
|
-
const VALID_SECTIONS = ['general', 'chat', 'skills'];
|
|
15
|
+
const VALID_SECTIONS = ['general', 'chat', 'skills', 'apiKeys'];
|
|
15
16
|
/**
|
|
16
17
|
* GET /api/settings
|
|
17
18
|
* Get current application settings
|
|
@@ -20,9 +21,14 @@ router.get('/', async (req, res, next) => {
|
|
|
20
21
|
try {
|
|
21
22
|
const settingsService = getSettingsService();
|
|
22
23
|
const settings = await settingsService.getSettings();
|
|
24
|
+
// Mask API keys before returning to prevent leaking secrets
|
|
25
|
+
const safeSettings = { ...settings };
|
|
26
|
+
if (safeSettings.apiKeys) {
|
|
27
|
+
safeSettings.apiKeys = maskApiKeysSettings(safeSettings.apiKeys);
|
|
28
|
+
}
|
|
23
29
|
res.json({
|
|
24
30
|
success: true,
|
|
25
|
-
data:
|
|
31
|
+
data: safeSettings,
|
|
26
32
|
});
|
|
27
33
|
}
|
|
28
34
|
catch (error) {
|
|
@@ -172,5 +178,94 @@ router.post('/import', async (req, res, next) => {
|
|
|
172
178
|
next(error);
|
|
173
179
|
}
|
|
174
180
|
});
|
|
181
|
+
/**
|
|
182
|
+
* POST /api/settings/test-api-key
|
|
183
|
+
* Test if an API key is valid by making a minimal API call
|
|
184
|
+
*/
|
|
185
|
+
router.post('/test-api-key', async (req, res, next) => {
|
|
186
|
+
try {
|
|
187
|
+
const { provider, key } = req.body;
|
|
188
|
+
if (!provider || !isValidApiKeyProvider(provider)) {
|
|
189
|
+
return res.status(400).json({
|
|
190
|
+
success: false,
|
|
191
|
+
error: `Invalid provider. Must be one of: gemini, anthropic, openai`,
|
|
192
|
+
});
|
|
193
|
+
}
|
|
194
|
+
if (!key || typeof key !== 'string' || key.trim().length === 0) {
|
|
195
|
+
return res.status(400).json({
|
|
196
|
+
success: false,
|
|
197
|
+
error: 'API key is required',
|
|
198
|
+
});
|
|
199
|
+
}
|
|
200
|
+
const result = await testApiKey(provider, key.trim());
|
|
201
|
+
res.json({
|
|
202
|
+
success: true,
|
|
203
|
+
data: result,
|
|
204
|
+
});
|
|
205
|
+
}
|
|
206
|
+
catch (error) {
|
|
207
|
+
next(error);
|
|
208
|
+
}
|
|
209
|
+
});
|
|
210
|
+
/**
|
|
211
|
+
* Test an API key by making a minimal request to the provider
|
|
212
|
+
*
|
|
213
|
+
* @param provider - The API key provider
|
|
214
|
+
* @param key - The API key to test
|
|
215
|
+
* @returns Test result with valid flag and optional error
|
|
216
|
+
*/
|
|
217
|
+
async function testApiKey(provider, key) {
|
|
218
|
+
try {
|
|
219
|
+
switch (provider) {
|
|
220
|
+
case 'gemini': {
|
|
221
|
+
const response = await fetch(`https://generativelanguage.googleapis.com/v1beta/models?key=${encodeURIComponent(key)}`, { method: 'GET', signal: AbortSignal.timeout(10000) });
|
|
222
|
+
if (response.ok)
|
|
223
|
+
return { valid: true };
|
|
224
|
+
const body = await response.json().catch(() => ({}));
|
|
225
|
+
return { valid: false, error: body?.error?.toString() || `HTTP ${response.status}` };
|
|
226
|
+
}
|
|
227
|
+
case 'anthropic': {
|
|
228
|
+
const response = await fetch('https://api.anthropic.com/v1/messages', {
|
|
229
|
+
method: 'POST',
|
|
230
|
+
headers: {
|
|
231
|
+
'x-api-key': key,
|
|
232
|
+
'anthropic-version': '2023-06-01',
|
|
233
|
+
'content-type': 'application/json',
|
|
234
|
+
},
|
|
235
|
+
body: JSON.stringify({
|
|
236
|
+
model: 'claude-haiku-4-5-20251001',
|
|
237
|
+
max_tokens: 1,
|
|
238
|
+
messages: [{ role: 'user', content: 'hi' }],
|
|
239
|
+
}),
|
|
240
|
+
signal: AbortSignal.timeout(10000),
|
|
241
|
+
});
|
|
242
|
+
// 200 or 429 (rate limited) both mean the key is valid
|
|
243
|
+
if (response.ok || response.status === 429)
|
|
244
|
+
return { valid: true };
|
|
245
|
+
if (response.status === 401)
|
|
246
|
+
return { valid: false, error: 'Invalid API key' };
|
|
247
|
+
return { valid: false, error: `HTTP ${response.status}` };
|
|
248
|
+
}
|
|
249
|
+
case 'openai': {
|
|
250
|
+
const response = await fetch('https://api.openai.com/v1/models', {
|
|
251
|
+
method: 'GET',
|
|
252
|
+
headers: { 'Authorization': `Bearer ${key}` },
|
|
253
|
+
signal: AbortSignal.timeout(10000),
|
|
254
|
+
});
|
|
255
|
+
if (response.ok)
|
|
256
|
+
return { valid: true };
|
|
257
|
+
if (response.status === 401)
|
|
258
|
+
return { valid: false, error: 'Invalid API key' };
|
|
259
|
+
return { valid: false, error: `HTTP ${response.status}` };
|
|
260
|
+
}
|
|
261
|
+
default:
|
|
262
|
+
return { valid: false, error: `Unknown provider: ${provider}` };
|
|
263
|
+
}
|
|
264
|
+
}
|
|
265
|
+
catch (err) {
|
|
266
|
+
const message = err instanceof Error ? err.message : 'Unknown error';
|
|
267
|
+
return { valid: false, error: message };
|
|
268
|
+
}
|
|
269
|
+
}
|
|
175
270
|
export default router;
|
|
176
271
|
//# sourceMappingURL=settings.controller.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"settings.controller.js","sourceRoot":"","sources":["../../../../../../backend/src/controllers/settings/settings.controller.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,EAAE,MAAM,EAAmC,MAAM,SAAS,CAAC;AAClE,OAAO,EACL,kBAAkB,EAClB,uBAAuB,GACxB,MAAM,6CAA6C,CAAC;
|
|
1
|
+
{"version":3,"file":"settings.controller.js","sourceRoot":"","sources":["../../../../../../backend/src/controllers/settings/settings.controller.ts"],"names":[],"mappings":"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"}
|
|
@@ -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":"AAAA,OAAO,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAC;AAC5C,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAkC9C,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,+CAA+C,CAAC;AAYrF;;;;;GAKG;AACH,wBAAgB,gCAAgC,CAAC,OAAO,EAAE,eAAe,GAAG,IAAI,CAE/E;AA8hBD,wBAAsB,UAAU,CAAC,IAAI,EAAE,UAAU,EAAE,GAAG,EAAE,OAAO,EAAE,GAAG,EAAE,QAAQ,GAAG,OAAO,CAAC,IAAI,CAAC,CA4J7F;AAED,wBAAsB,QAAQ,CAAC,IAAI,EAAE,UAAU,EAAE,GAAG,EAAE,OAAO,EAAE,GAAG,EAAE,QAAQ,GAAG,OAAO,CAAC,IAAI,CAAC,CAyD3F;AAED,wBAAsB,OAAO,CAAC,IAAI,EAAE,UAAU,EAAE,GAAG,EAAE,OAAO,EAAE,GAAG,EAAE,QAAQ,GAAG,OAAO,CAAC,IAAI,CAAC,CA6D1F;AAED,wBAAsB,SAAS,CAAC,IAAI,EAAE,UAAU,EAAE,GAAG,EAAE,OAAO,EAAE,GAAG,EAAE,QAAQ,GAAG,OAAO,CAAC,IAAI,CAAC,CA8H5F;AAED,wBAAsB,QAAQ,CAAC,IAAI,EAAE,UAAU,EAAE,GAAG,EAAE,OAAO,EAAE,GAAG,EAAE,QAAQ,GAAG,OAAO,CAAC,IAAI,CAAC,CAqE3F;AAED,wBAAsB,eAAe,CAAC,IAAI,EAAE,UAAU,EAAE,GAAG,EAAE,OAAO,EAAE,GAAG,EAAE,QAAQ,GAAG,OAAO,CAAC,IAAI,CAAC,CAkBlG;AAED,wBAAsB,UAAU,CAAC,IAAI,EAAE,UAAU,EAAE,GAAG,EAAE,OAAO,EAAE,GAAG,EAAE,QAAQ,GAAG,OAAO,CAAC,IAAI,CAAC,CAiD7F;AAED,wBAAsB,oBAAoB,CAAC,IAAI,EAAE,UAAU,EAAE,GAAG,EAAE,OAAO,EAAE,GAAG,EAAE,QAAQ,GAAG,OAAO,CAAC,IAAI,CAAC,CAgBvG;AAED,wBAAsB,aAAa,CAAC,IAAI,EAAE,UAAU,EAAE,GAAG,EAAE,OAAO,EAAE,GAAG,EAAE,QAAQ,GAAG,OAAO,CAAC,IAAI,CAAC,CA6BhG;AAED,wBAAsB,gBAAgB,CAAC,IAAI,EAAE,UAAU,EAAE,GAAG,EAAE,OAAO,EAAE,GAAG,EAAE,QAAQ,GAAG,OAAO,CAAC,IAAI,CAAC,CAkBnG;AAED,wBAAsB,gBAAgB,CAAC,IAAI,EAAE,UAAU,EAAE,GAAG,EAAE,OAAO,EAAE,GAAG,EAAE,QAAQ,GAAG,OAAO,CAAC,IAAI,CAAC,CAoBnG;AA2ID,wBAAsB,eAAe,CAAC,IAAI,EAAE,UAAU,EAAE,GAAG,EAAE,OAAO,EAAE,GAAG,EAAE,QAAQ,GAAG,OAAO,CAAC,IAAI,CAAC,CA8GlG;AAED,wBAAsB,cAAc,CAAC,IAAI,EAAE,UAAU,EAAE,GAAG,EAAE,OAAO,EAAE,GAAG,EAAE,QAAQ,GAAG,OAAO,CAAC,IAAI,CAAC,CA8CjG;AAED,wBAAsB,iBAAiB,CAAC,IAAI,EAAE,UAAU,EAAE,GAAG,EAAE,OAAO,EAAE,GAAG,EAAE,QAAQ,GAAG,OAAO,CAAC,IAAI,CAAC,CA4BpG;AAED,wBAAsB,oBAAoB,CAAC,IAAI,EAAE,UAAU,EAAE,GAAG,EAAE,OAAO,EAAE,GAAG,EAAE,QAAQ,GAAG,OAAO,CAAC,IAAI,CAAC,CAiIvG;AAED,wBAAsB,qBAAqB,CAAC,IAAI,EAAE,UAAU,EAAE,GAAG,EAAE,OAAO,EAAE,GAAG,EAAE,QAAQ,GAAG,OAAO,CAAC,IAAI,CAAC,CAuBxG;AAED,wBAAsB,wBAAwB,CAAC,IAAI,EAAE,UAAU,EAAE,GAAG,EAAE,OAAO,EAAE,GAAG,EAAE,QAAQ,GAAG,OAAO,CAAC,IAAI,CAAC,CAoB3G;AAED,wBAAsB,oBAAoB,CAAC,IAAI,EAAE,UAAU,EAAE,GAAG,EAAE,OAAO,EAAE,GAAG,EAAE,QAAQ,GAAG,OAAO,CAAC,IAAI,CAAC,CAmBvG;AAED,wBAAsB,qBAAqB,CAAC,IAAI,EAAE,UAAU,EAAE,GAAG,EAAE,OAAO,EAAE,GAAG,EAAE,QAAQ,GAAG,OAAO,CAAC,IAAI,CAAC,CAkLxG;AAED,wBAAsB,uBAAuB,CAAC,IAAI,EAAE,UAAU,EAAE,GAAG,EAAE,OAAO,EAAE,GAAG,EAAE,QAAQ,GAAG,OAAO,CAAC,IAAI,CAAC,CA+F1G;AAED;;GAEG;AACH,wBAAsB,UAAU,CAAC,IAAI,EAAE,UAAU,EAAE,GAAG,EAAE,OAAO,EAAE,GAAG,EAAE,QAAQ,GAAG,OAAO,CAAC,IAAI,CAAC,CA6P7F"}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { v4 as uuidv4 } from 'uuid';
|
|
2
|
-
import { ORCHESTRATOR_SESSION_NAME, ORCHESTRATOR_ROLE, RUNTIME_TYPES, NON_RECOVERABLE_ERROR_PATTERNS } 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';
|
|
@@ -69,6 +69,30 @@ function buildOrchestratorTeam(actualAgentStatus, orchestratorStatus, overrides)
|
|
|
69
69
|
runtimeType: (orchestratorStatus?.runtimeType || 'claude-code'),
|
|
70
70
|
createdAt: orchestratorStatus?.createdAt || now,
|
|
71
71
|
updatedAt: orchestratorStatus?.updatedAt || now
|
|
72
|
+
},
|
|
73
|
+
{
|
|
74
|
+
id: 'a1b2c3d4-5678-9abc-def0-assistant001',
|
|
75
|
+
name: 'Assistant',
|
|
76
|
+
sessionName: 'crewly-team-assistant-a1b2c3d4',
|
|
77
|
+
role: 'orchestrator',
|
|
78
|
+
systemPrompt: 'Shadow orchestrator running in-process via Crewly Agent runtime (AI SDK)',
|
|
79
|
+
agentStatus: CREWLY_CONSTANTS.AGENT_STATUSES.INACTIVE,
|
|
80
|
+
workingStatus: CREWLY_CONSTANTS.WORKING_STATUSES.IDLE,
|
|
81
|
+
runtimeType: 'crewly-agent',
|
|
82
|
+
createdAt: '2026-03-11T02:00:00.000Z',
|
|
83
|
+
updatedAt: now
|
|
84
|
+
},
|
|
85
|
+
{
|
|
86
|
+
id: 'e5f6a7b8-9012-3cde-f456-auditor00001',
|
|
87
|
+
name: 'Auditor',
|
|
88
|
+
sessionName: 'crewly-auditor',
|
|
89
|
+
role: 'auditor',
|
|
90
|
+
systemPrompt: 'Autonomous quality observer — monitors all agents, detects problems, writes audit reports',
|
|
91
|
+
agentStatus: CREWLY_CONSTANTS.AGENT_STATUSES.INACTIVE,
|
|
92
|
+
workingStatus: CREWLY_CONSTANTS.WORKING_STATUSES.IDLE,
|
|
93
|
+
runtimeType: 'claude-code',
|
|
94
|
+
createdAt: '2026-03-11T02:10:00.000Z',
|
|
95
|
+
updatedAt: now
|
|
72
96
|
}
|
|
73
97
|
],
|
|
74
98
|
projectIds: [],
|
|
@@ -240,6 +264,7 @@ async function _startTeamMemberCore(context, team, member, projectPath) {
|
|
|
240
264
|
projectPath: projectPath,
|
|
241
265
|
memberId: currentMember.id,
|
|
242
266
|
teamId: team.id,
|
|
267
|
+
runtimeType: currentMember.runtimeType || undefined,
|
|
243
268
|
});
|
|
244
269
|
if (createResult.success) {
|
|
245
270
|
break;
|
|
@@ -1056,9 +1081,127 @@ export async function deleteTeamMember(req, res) {
|
|
|
1056
1081
|
res.status(500).json({ success: false, error: 'Failed to delete team member' });
|
|
1057
1082
|
}
|
|
1058
1083
|
}
|
|
1084
|
+
/**
|
|
1085
|
+
* Start a virtual orchestrator team member (Assistant or Auditor).
|
|
1086
|
+
* These members are not persisted in teams.json — their team is built dynamically
|
|
1087
|
+
* by buildOrchestratorTeam(). The main orchestrator member is managed via /orchestrator/setup.
|
|
1088
|
+
*
|
|
1089
|
+
* @param context - API context with services
|
|
1090
|
+
* @param memberId - The member ID from the virtual orchestrator team
|
|
1091
|
+
* @param res - Express response object
|
|
1092
|
+
*/
|
|
1093
|
+
async function _startOrchestratorMember(context, memberId, res) {
|
|
1094
|
+
const orchestratorTeam = buildOrchestratorTeam(CREWLY_CONSTANTS.AGENT_STATUSES.ACTIVE, null);
|
|
1095
|
+
const member = orchestratorTeam.members.find(m => m.id === memberId);
|
|
1096
|
+
if (!member) {
|
|
1097
|
+
res.status(404).json({ success: false, error: 'Orchestrator team member not found' });
|
|
1098
|
+
return;
|
|
1099
|
+
}
|
|
1100
|
+
// Main orchestrator member is managed at system level
|
|
1101
|
+
if (memberId === 'orchestrator-member') {
|
|
1102
|
+
res.status(400).json({
|
|
1103
|
+
success: false,
|
|
1104
|
+
error: 'Orchestrator is managed at system level. Use /api/orchestrator/setup endpoint instead.'
|
|
1105
|
+
});
|
|
1106
|
+
return;
|
|
1107
|
+
}
|
|
1108
|
+
// Use project root (cwd) as the project path for orchestrator virtual members
|
|
1109
|
+
const projectPath = process.cwd();
|
|
1110
|
+
// Create the agent session via agentRegistrationService (handles both crewly-agent and claude-code runtimes)
|
|
1111
|
+
try {
|
|
1112
|
+
const createResult = await context.agentRegistrationService.createAgentSession({
|
|
1113
|
+
sessionName: member.sessionName,
|
|
1114
|
+
role: member.role,
|
|
1115
|
+
projectPath,
|
|
1116
|
+
memberId: member.id,
|
|
1117
|
+
teamId: 'orchestrator',
|
|
1118
|
+
runtimeType: member.runtimeType || undefined,
|
|
1119
|
+
});
|
|
1120
|
+
if (createResult.success) {
|
|
1121
|
+
res.json({
|
|
1122
|
+
success: true,
|
|
1123
|
+
data: {
|
|
1124
|
+
memberId: member.id,
|
|
1125
|
+
sessionName: createResult.sessionName || member.sessionName,
|
|
1126
|
+
status: CREWLY_CONSTANTS.AGENT_STATUSES.STARTING
|
|
1127
|
+
},
|
|
1128
|
+
message: `Orchestrator member ${member.name} started successfully`
|
|
1129
|
+
});
|
|
1130
|
+
}
|
|
1131
|
+
else {
|
|
1132
|
+
res.status(500).json({
|
|
1133
|
+
success: false,
|
|
1134
|
+
error: createResult.error || `Failed to start orchestrator member ${member.name}`
|
|
1135
|
+
});
|
|
1136
|
+
}
|
|
1137
|
+
}
|
|
1138
|
+
catch (error) {
|
|
1139
|
+
logger.error('Error starting orchestrator member', { memberId, error: error instanceof Error ? error.message : String(error) });
|
|
1140
|
+
res.status(500).json({
|
|
1141
|
+
success: false,
|
|
1142
|
+
error: error instanceof Error ? error.message : 'Failed to start orchestrator member'
|
|
1143
|
+
});
|
|
1144
|
+
}
|
|
1145
|
+
}
|
|
1146
|
+
/**
|
|
1147
|
+
* Stop a virtual orchestrator team member (Assistant or Auditor).
|
|
1148
|
+
* These members are not persisted in teams.json — uses agentRegistrationService
|
|
1149
|
+
* to terminate the session without storage updates.
|
|
1150
|
+
*
|
|
1151
|
+
* @param context - API context with services
|
|
1152
|
+
* @param memberId - The member ID from the virtual orchestrator team
|
|
1153
|
+
* @param res - Express response object
|
|
1154
|
+
*/
|
|
1155
|
+
async function _stopOrchestratorMember(context, memberId, res) {
|
|
1156
|
+
const orchestratorTeam = buildOrchestratorTeam(CREWLY_CONSTANTS.AGENT_STATUSES.ACTIVE, null);
|
|
1157
|
+
const member = orchestratorTeam.members.find(m => m.id === memberId);
|
|
1158
|
+
if (!member) {
|
|
1159
|
+
res.status(404).json({ success: false, error: 'Orchestrator team member not found' });
|
|
1160
|
+
return;
|
|
1161
|
+
}
|
|
1162
|
+
// Main orchestrator member is managed at system level
|
|
1163
|
+
if (memberId === 'orchestrator-member') {
|
|
1164
|
+
res.status(400).json({
|
|
1165
|
+
success: false,
|
|
1166
|
+
error: 'Orchestrator is managed at system level. Use /api/orchestrator/setup endpoint instead.'
|
|
1167
|
+
});
|
|
1168
|
+
return;
|
|
1169
|
+
}
|
|
1170
|
+
try {
|
|
1171
|
+
const stopResult = await context.agentRegistrationService.terminateAgentSession(member.sessionName, member.role);
|
|
1172
|
+
if (stopResult.success) {
|
|
1173
|
+
res.json({
|
|
1174
|
+
success: true,
|
|
1175
|
+
data: {
|
|
1176
|
+
memberId: member.id,
|
|
1177
|
+
status: CREWLY_CONSTANTS.AGENT_STATUSES.INACTIVE
|
|
1178
|
+
},
|
|
1179
|
+
message: `Orchestrator member ${member.name} stopped successfully`
|
|
1180
|
+
});
|
|
1181
|
+
}
|
|
1182
|
+
else {
|
|
1183
|
+
res.status(500).json({
|
|
1184
|
+
success: false,
|
|
1185
|
+
error: stopResult.error || `Failed to stop orchestrator member ${member.name}`
|
|
1186
|
+
});
|
|
1187
|
+
}
|
|
1188
|
+
}
|
|
1189
|
+
catch (error) {
|
|
1190
|
+
logger.error('Error stopping orchestrator member', { memberId, error: error instanceof Error ? error.message : String(error) });
|
|
1191
|
+
res.status(500).json({
|
|
1192
|
+
success: false,
|
|
1193
|
+
error: error instanceof Error ? error.message : 'Failed to stop orchestrator member'
|
|
1194
|
+
});
|
|
1195
|
+
}
|
|
1196
|
+
}
|
|
1059
1197
|
export async function startTeamMember(req, res) {
|
|
1060
1198
|
try {
|
|
1061
1199
|
const { teamId, memberId } = req.params;
|
|
1200
|
+
// Handle virtual orchestrator team members (not stored in teams.json)
|
|
1201
|
+
if (teamId === 'orchestrator') {
|
|
1202
|
+
await _startOrchestratorMember(this, memberId, res);
|
|
1203
|
+
return;
|
|
1204
|
+
}
|
|
1062
1205
|
const teams = await this.storageService.getTeams();
|
|
1063
1206
|
const team = teams.find(t => t.id === teamId);
|
|
1064
1207
|
if (!team) {
|
|
@@ -1162,6 +1305,11 @@ export async function startTeamMember(req, res) {
|
|
|
1162
1305
|
export async function stopTeamMember(req, res) {
|
|
1163
1306
|
try {
|
|
1164
1307
|
const { teamId, memberId } = req.params;
|
|
1308
|
+
// Handle virtual orchestrator team members (not stored in teams.json)
|
|
1309
|
+
if (teamId === 'orchestrator') {
|
|
1310
|
+
await _stopOrchestratorMember(this, memberId, res);
|
|
1311
|
+
return;
|
|
1312
|
+
}
|
|
1165
1313
|
const teams = await this.storageService.getTeams();
|
|
1166
1314
|
const team = teams.find(t => t.id === teamId);
|
|
1167
1315
|
if (!team) {
|