crewly 1.0.3 → 1.0.5
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/roles/orchestrator/prompt.md +61 -2
- package/config/skills/orchestrator/remember/instructions.md +8 -1
- package/config/skills/orchestrator/update-team/execute.sh +16 -0
- package/config/skills/orchestrator/update-team/instructions.md +21 -0
- package/config/skills/orchestrator/update-team/skill.json +20 -0
- package/dist/backend/backend/src/controllers/messaging/delivery-logs.controller.d.ts.map +1 -1
- package/dist/backend/backend/src/controllers/messaging/delivery-logs.controller.js +4 -2
- package/dist/backend/backend/src/controllers/messaging/delivery-logs.controller.js.map +1 -1
- package/dist/backend/backend/src/controllers/messaging/scheduled-messages.controller.d.ts.map +1 -1
- package/dist/backend/backend/src/controllers/messaging/scheduled-messages.controller.js +10 -8
- package/dist/backend/backend/src/controllers/messaging/scheduled-messages.controller.js.map +1 -1
- package/dist/backend/backend/src/controllers/orchestrator/orchestrator.controller.d.ts.map +1 -1
- package/dist/backend/backend/src/controllers/orchestrator/orchestrator.controller.js +28 -26
- package/dist/backend/backend/src/controllers/orchestrator/orchestrator.controller.js.map +1 -1
- package/dist/backend/backend/src/controllers/project/git.controller.d.ts.map +1 -1
- package/dist/backend/backend/src/controllers/project/git.controller.js +9 -7
- package/dist/backend/backend/src/controllers/project/git.controller.js.map +1 -1
- package/dist/backend/backend/src/controllers/project/project.controller.d.ts.map +1 -1
- package/dist/backend/backend/src/controllers/project/project.controller.js +52 -50
- package/dist/backend/backend/src/controllers/project/project.controller.js.map +1 -1
- package/dist/backend/backend/src/controllers/skill/skill.controller.d.ts.map +1 -1
- package/dist/backend/backend/src/controllers/skill/skill.controller.js +3 -1
- package/dist/backend/backend/src/controllers/skill/skill.controller.js.map +1 -1
- package/dist/backend/backend/src/controllers/slack/slack-thread.controller.d.ts.map +1 -1
- package/dist/backend/backend/src/controllers/slack/slack-thread.controller.js +3 -1
- package/dist/backend/backend/src/controllers/slack/slack-thread.controller.js.map +1 -1
- package/dist/backend/backend/src/controllers/system/config.controller.d.ts.map +1 -1
- package/dist/backend/backend/src/controllers/system/config.controller.js +3 -1
- package/dist/backend/backend/src/controllers/system/config.controller.js.map +1 -1
- package/dist/backend/backend/src/controllers/system/errors.controller.d.ts.map +1 -1
- package/dist/backend/backend/src/controllers/system/errors.controller.js +7 -5
- package/dist/backend/backend/src/controllers/system/errors.controller.js.map +1 -1
- package/dist/backend/backend/src/controllers/system/scheduler.controller.d.ts.map +1 -1
- package/dist/backend/backend/src/controllers/system/scheduler.controller.js +6 -4
- package/dist/backend/backend/src/controllers/system/scheduler.controller.js.map +1 -1
- package/dist/backend/backend/src/controllers/system/system.controller.d.ts.map +1 -1
- package/dist/backend/backend/src/controllers/system/system.controller.js +20 -19
- package/dist/backend/backend/src/controllers/system/system.controller.js.map +1 -1
- package/dist/backend/backend/src/controllers/task-management/assignments.controller.d.ts.map +1 -1
- package/dist/backend/backend/src/controllers/task-management/assignments.controller.js +4 -2
- package/dist/backend/backend/src/controllers/task-management/assignments.controller.js.map +1 -1
- package/dist/backend/backend/src/controllers/task-management/in-progress-tasks.controller.d.ts.map +1 -1
- package/dist/backend/backend/src/controllers/task-management/in-progress-tasks.controller.js +3 -1
- package/dist/backend/backend/src/controllers/task-management/in-progress-tasks.controller.js.map +1 -1
- package/dist/backend/backend/src/controllers/task-management/task-management.controller.d.ts.map +1 -1
- package/dist/backend/backend/src/controllers/task-management/task-management.controller.js +30 -28
- package/dist/backend/backend/src/controllers/task-management/task-management.controller.js.map +1 -1
- package/dist/backend/backend/src/controllers/task-management/tasks.controller.d.ts.map +1 -1
- package/dist/backend/backend/src/controllers/task-management/tasks.controller.js +7 -5
- package/dist/backend/backend/src/controllers/task-management/tasks.controller.js.map +1 -1
- package/dist/backend/backend/src/controllers/task-management/tickets.controller.d.ts.map +1 -1
- package/dist/backend/backend/src/controllers/task-management/tickets.controller.js +12 -10
- package/dist/backend/backend/src/controllers/task-management/tickets.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 +44 -42
- 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 +1 -0
- package/dist/backend/backend/src/controllers/team/team.routes.js.map +1 -1
- package/dist/backend/backend/src/index.d.ts.map +1 -1
- package/dist/backend/backend/src/index.js +5 -1
- package/dist/backend/backend/src/index.js.map +1 -1
- package/dist/backend/backend/src/routes/factory.routes.d.ts.map +1 -1
- package/dist/backend/backend/src/routes/factory.routes.js +4 -2
- package/dist/backend/backend/src/routes/factory.routes.js.map +1 -1
- 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 +8 -2
- 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 +6 -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 +29 -6
- package/dist/backend/backend/src/services/agent/agent-registration.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 +22 -8
- 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.map +1 -1
- package/dist/backend/backend/src/services/agent/runtime-exit-monitor.service.js +9 -3
- package/dist/backend/backend/src/services/agent/runtime-exit-monitor.service.js.map +1 -1
- package/dist/backend/backend/src/services/ai/context-loader.service.d.ts +1 -0
- package/dist/backend/backend/src/services/ai/context-loader.service.d.ts.map +1 -1
- package/dist/backend/backend/src/services/ai/context-loader.service.js +9 -7
- package/dist/backend/backend/src/services/ai/context-loader.service.js.map +1 -1
- package/dist/backend/backend/src/services/ai/prompt-template.service.d.ts +1 -0
- package/dist/backend/backend/src/services/ai/prompt-template.service.d.ts.map +1 -1
- package/dist/backend/backend/src/services/ai/prompt-template.service.js +7 -5
- package/dist/backend/backend/src/services/ai/prompt-template.service.js.map +1 -1
- package/dist/backend/backend/src/services/core/config.service.d.ts +6 -0
- package/dist/backend/backend/src/services/core/config.service.d.ts.map +1 -1
- package/dist/backend/backend/src/services/core/config.service.js +25 -5
- package/dist/backend/backend/src/services/core/config.service.js.map +1 -1
- package/dist/backend/backend/src/services/core/storage.service.d.ts +10 -2
- package/dist/backend/backend/src/services/core/storage.service.d.ts.map +1 -1
- package/dist/backend/backend/src/services/core/storage.service.js +45 -29
- package/dist/backend/backend/src/services/core/storage.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 +50 -33
- package/dist/backend/backend/src/services/monitoring/activity-monitor.service.js.map +1 -1
- package/dist/backend/backend/src/services/monitoring/team-activity-websocket.service.d.ts +4 -1
- package/dist/backend/backend/src/services/monitoring/team-activity-websocket.service.d.ts.map +1 -1
- package/dist/backend/backend/src/services/monitoring/team-activity-websocket.service.js +28 -14
- package/dist/backend/backend/src/services/monitoring/team-activity-websocket.service.js.map +1 -1
- package/dist/backend/backend/src/services/orchestrator/improvement-startup.service.d.ts +1 -0
- package/dist/backend/backend/src/services/orchestrator/improvement-startup.service.d.ts.map +1 -1
- package/dist/backend/backend/src/services/orchestrator/improvement-startup.service.js +22 -20
- package/dist/backend/backend/src/services/orchestrator/improvement-startup.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 +11 -2
- package/dist/backend/backend/src/services/orchestrator/orchestrator-heartbeat-monitor.service.js.map +1 -1
- package/dist/backend/backend/src/services/orchestrator/safe-restart.service.d.ts +1 -0
- package/dist/backend/backend/src/services/orchestrator/safe-restart.service.d.ts.map +1 -1
- package/dist/backend/backend/src/services/orchestrator/safe-restart.service.js +25 -23
- package/dist/backend/backend/src/services/orchestrator/safe-restart.service.js.map +1 -1
- package/dist/backend/backend/src/services/orchestrator/self-improvement.service.d.ts +1 -0
- package/dist/backend/backend/src/services/orchestrator/self-improvement.service.d.ts.map +1 -1
- package/dist/backend/backend/src/services/orchestrator/self-improvement.service.js +12 -10
- package/dist/backend/backend/src/services/orchestrator/self-improvement.service.js.map +1 -1
- package/dist/backend/backend/src/services/orchestrator/slack-bridge-lazy.d.ts +17 -0
- package/dist/backend/backend/src/services/orchestrator/slack-bridge-lazy.d.ts.map +1 -0
- package/dist/backend/backend/src/services/orchestrator/slack-bridge-lazy.js +30 -0
- package/dist/backend/backend/src/services/orchestrator/slack-bridge-lazy.js.map +1 -0
- package/dist/backend/backend/src/services/orchestrator/state-persistence.service.d.ts +1 -0
- package/dist/backend/backend/src/services/orchestrator/state-persistence.service.d.ts.map +1 -1
- package/dist/backend/backend/src/services/orchestrator/state-persistence.service.js +14 -12
- package/dist/backend/backend/src/services/orchestrator/state-persistence.service.js.map +1 -1
- package/dist/backend/backend/src/services/project/active-projects.service.d.ts +1 -0
- package/dist/backend/backend/src/services/project/active-projects.service.d.ts.map +1 -1
- package/dist/backend/backend/src/services/project/active-projects.service.js +8 -6
- package/dist/backend/backend/src/services/project/active-projects.service.js.map +1 -1
- package/dist/backend/backend/src/services/project/task-tracking.service.d.ts +1 -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 +18 -16
- package/dist/backend/backend/src/services/project/task-tracking.service.js.map +1 -1
- package/dist/backend/backend/src/services/project/ticket-editor.service.d.ts +1 -0
- package/dist/backend/backend/src/services/project/ticket-editor.service.d.ts.map +1 -1
- package/dist/backend/backend/src/services/project/ticket-editor.service.js +6 -4
- package/dist/backend/backend/src/services/project/ticket-editor.service.js.map +1 -1
- package/dist/backend/backend/src/services/settings/role.service.d.ts +1 -0
- package/dist/backend/backend/src/services/settings/role.service.d.ts.map +1 -1
- package/dist/backend/backend/src/services/settings/role.service.js +3 -1
- package/dist/backend/backend/src/services/settings/role.service.js.map +1 -1
- package/dist/backend/backend/src/services/skill/skill-executor.service.d.ts +1 -0
- package/dist/backend/backend/src/services/skill/skill-executor.service.d.ts.map +1 -1
- package/dist/backend/backend/src/services/skill/skill-executor.service.js +4 -2
- package/dist/backend/backend/src/services/skill/skill-executor.service.js.map +1 -1
- package/dist/backend/backend/src/services/skill/skill.service.d.ts +1 -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 +7 -5
- package/dist/backend/backend/src/services/skill/skill.service.js.map +1 -1
- package/dist/backend/backend/src/services/slack/slack-image.service.d.ts +1 -0
- package/dist/backend/backend/src/services/slack/slack-image.service.d.ts.map +1 -1
- package/dist/backend/backend/src/services/slack/slack-image.service.js +6 -4
- package/dist/backend/backend/src/services/slack/slack-image.service.js.map +1 -1
- package/dist/backend/backend/src/services/slack/slack-initializer.d.ts.map +1 -1
- package/dist/backend/backend/src/services/slack/slack-initializer.js +7 -5
- package/dist/backend/backend/src/services/slack/slack-initializer.js.map +1 -1
- package/dist/backend/backend/src/services/slack/slack-orchestrator-bridge.d.ts +1 -0
- 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 +25 -20
- 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 +1 -0
- package/dist/backend/backend/src/services/slack/slack.service.d.ts.map +1 -1
- package/dist/backend/backend/src/services/slack/slack.service.js +19 -15
- package/dist/backend/backend/src/services/slack/slack.service.js.map +1 -1
- package/dist/backend/backend/src/utils/process-recovery.d.ts +1 -0
- package/dist/backend/backend/src/utils/process-recovery.d.ts.map +1 -1
- package/dist/backend/backend/src/utils/process-recovery.js +40 -37
- package/dist/backend/backend/src/utils/process-recovery.js.map +1 -1
- package/dist/backend/backend/src/utils/prompt-resolver.d.ts.map +1 -1
- package/dist/backend/backend/src/utils/prompt-resolver.js +3 -1
- package/dist/backend/backend/src/utils/prompt-resolver.js.map +1 -1
- package/dist/backend/backend/src/utils/resource-monitor.d.ts +2 -1
- package/dist/backend/backend/src/utils/resource-monitor.d.ts.map +1 -1
- package/dist/backend/backend/src/utils/resource-monitor.js +34 -24
- package/dist/backend/backend/src/utils/resource-monitor.js.map +1 -1
- package/dist/cli/cli/src/commands/onboard.d.ts +89 -0
- package/dist/cli/cli/src/commands/onboard.d.ts.map +1 -0
- package/dist/cli/cli/src/commands/onboard.js +268 -0
- package/dist/cli/cli/src/commands/onboard.js.map +1 -0
- package/dist/cli/cli/src/index.js +5 -0
- package/dist/cli/cli/src/index.js.map +1 -1
- package/dist/cli/cli/src/utils/marketplace.d.ts +22 -0
- package/dist/cli/cli/src/utils/marketplace.d.ts.map +1 -1
- package/dist/cli/cli/src/utils/marketplace.js +43 -0
- package/dist/cli/cli/src/utils/marketplace.js.map +1 -1
- package/frontend/dist/assets/{index-4c56763b.js → index-419da091.js} +2 -2
- package/frontend/dist/assets/index-5adb4dff.css +33 -0
- package/frontend/dist/index.html +2 -2
- package/package.json +2 -1
- package/frontend/dist/assets/index-c1dd0b10.css +0 -33
|
@@ -8,6 +8,8 @@ import { ActivityMonitorService } from '../../services/monitoring/activity-monit
|
|
|
8
8
|
import { MemoryService } from '../../services/memory/memory.service.js';
|
|
9
9
|
import { SubAgentMessageQueue } from '../../services/messaging/sub-agent-message-queue.service.js';
|
|
10
10
|
import { SUB_AGENT_QUEUE_CONSTANTS } from '../../constants.js';
|
|
11
|
+
import { LoggerService } from '../../services/core/logger.service.js';
|
|
12
|
+
const logger = LoggerService.getInstance().createComponentLogger('TeamController');
|
|
11
13
|
/**
|
|
12
14
|
* Module-level EventBusService instance, injected at startup.
|
|
13
15
|
* Used to auto-subscribe the orchestrator to agent lifecycle events.
|
|
@@ -122,7 +124,7 @@ async function _startTeamMemberCore(context, team, member, projectPath) {
|
|
|
122
124
|
}
|
|
123
125
|
else {
|
|
124
126
|
// Session exists but appears zombie - kill it and proceed with new creation
|
|
125
|
-
|
|
127
|
+
logger.warn('Cleaning up zombie session', { sessionName: member.sessionName });
|
|
126
128
|
await context.tmuxService.killSession(member.sessionName).catch(() => {
|
|
127
129
|
// Ignore errors if session doesn't exist
|
|
128
130
|
});
|
|
@@ -133,7 +135,7 @@ async function _startTeamMemberCore(context, team, member, projectPath) {
|
|
|
133
135
|
}
|
|
134
136
|
catch (error) {
|
|
135
137
|
// If we can't check the session, assume it's zombie and clean it up
|
|
136
|
-
|
|
138
|
+
logger.warn('Error checking session, treating as zombie', { sessionName: member.sessionName, error: error instanceof Error ? error.message : String(error) });
|
|
137
139
|
await context.tmuxService.killSession(member.sessionName).catch(() => {
|
|
138
140
|
// Ignore errors if session doesn't exist
|
|
139
141
|
});
|
|
@@ -232,7 +234,7 @@ async function _startTeamMemberCore(context, team, member, projectPath) {
|
|
|
232
234
|
await memoryService.initializeForSession(sessionName, currentMember.role, projectPath || process.cwd());
|
|
233
235
|
}
|
|
234
236
|
catch (memError) {
|
|
235
|
-
|
|
237
|
+
logger.warn('Failed to initialize memory', { sessionName, error: memError instanceof Error ? memError.message : String(memError) });
|
|
236
238
|
}
|
|
237
239
|
// CRITICAL: Load fresh data again after session creation to preserve MCP registration updates
|
|
238
240
|
const finalTeams = await context.storageService.getTeams();
|
|
@@ -255,7 +257,7 @@ async function _startTeamMemberCore(context, team, member, projectPath) {
|
|
|
255
257
|
};
|
|
256
258
|
}
|
|
257
259
|
else {
|
|
258
|
-
|
|
260
|
+
logger.error('Team or member not found after session creation', { teamId: team.id, memberId: member.id });
|
|
259
261
|
return {
|
|
260
262
|
success: false,
|
|
261
263
|
memberName: member.name,
|
|
@@ -278,7 +280,7 @@ async function _startTeamMemberCore(context, team, member, projectPath) {
|
|
|
278
280
|
failureMember.updatedAt = new Date().toISOString();
|
|
279
281
|
await context.storageService.saveTeam(failureTeam);
|
|
280
282
|
}
|
|
281
|
-
|
|
283
|
+
logger.error('All session creation attempts failed', { retries: MAX_CREATION_RETRIES, memberName: member.name, lastError });
|
|
282
284
|
return {
|
|
283
285
|
success: false,
|
|
284
286
|
memberName: member.name,
|
|
@@ -301,7 +303,7 @@ async function _startTeamMemberCore(context, team, member, projectPath) {
|
|
|
301
303
|
errorMember.updatedAt = new Date().toISOString();
|
|
302
304
|
await context.storageService.saveTeam(errorTeam);
|
|
303
305
|
}
|
|
304
|
-
|
|
306
|
+
logger.error('Error starting team member', { error: error instanceof Error ? error.message : String(error) });
|
|
305
307
|
return {
|
|
306
308
|
success: false,
|
|
307
309
|
memberName: member.name,
|
|
@@ -325,7 +327,7 @@ async function _stopTeamMemberCore(context, team, member) {
|
|
|
325
327
|
if (member.sessionName) {
|
|
326
328
|
const stopResult = await context.agentRegistrationService.terminateAgentSession(member.sessionName, member.role);
|
|
327
329
|
if (!stopResult.success) {
|
|
328
|
-
|
|
330
|
+
logger.error('Failed to terminate team member session', { error: stopResult.error });
|
|
329
331
|
return {
|
|
330
332
|
success: false,
|
|
331
333
|
memberName: member.name,
|
|
@@ -353,7 +355,7 @@ async function _stopTeamMemberCore(context, team, member) {
|
|
|
353
355
|
};
|
|
354
356
|
}
|
|
355
357
|
catch (error) {
|
|
356
|
-
|
|
358
|
+
logger.error('Error stopping team member', { error: error instanceof Error ? error.message : String(error) });
|
|
357
359
|
return {
|
|
358
360
|
success: false,
|
|
359
361
|
memberName: member.name,
|
|
@@ -462,7 +464,7 @@ export async function createTeam(req, res) {
|
|
|
462
464
|
});
|
|
463
465
|
}
|
|
464
466
|
catch (error) {
|
|
465
|
-
|
|
467
|
+
logger.error('Error creating team', { error: error instanceof Error ? error.message : String(error) });
|
|
466
468
|
res.status(500).json({
|
|
467
469
|
success: false,
|
|
468
470
|
error: error instanceof Error ? error.message : 'Failed to create team'
|
|
@@ -513,7 +515,7 @@ export async function getTeams(req, res) {
|
|
|
513
515
|
});
|
|
514
516
|
}
|
|
515
517
|
catch (error) {
|
|
516
|
-
|
|
518
|
+
logger.error('Error getting teams', { error: error instanceof Error ? error.message : String(error) });
|
|
517
519
|
res.status(500).json({
|
|
518
520
|
success: false,
|
|
519
521
|
error: 'Failed to retrieve teams'
|
|
@@ -570,7 +572,7 @@ export async function getTeam(req, res) {
|
|
|
570
572
|
res.json({ success: true, data: team });
|
|
571
573
|
}
|
|
572
574
|
catch (error) {
|
|
573
|
-
|
|
575
|
+
logger.error('Error getting team', { error: error instanceof Error ? error.message : String(error) });
|
|
574
576
|
res.status(500).json({ success: false, error: 'Failed to retrieve team' });
|
|
575
577
|
}
|
|
576
578
|
}
|
|
@@ -654,7 +656,7 @@ export async function startTeam(req, res) {
|
|
|
654
656
|
});
|
|
655
657
|
}
|
|
656
658
|
catch (error) {
|
|
657
|
-
|
|
659
|
+
logger.error('Error starting team', { error: error instanceof Error ? error.message : String(error) });
|
|
658
660
|
res.status(500).json({ success: false, error: 'Failed to start team' });
|
|
659
661
|
}
|
|
660
662
|
}
|
|
@@ -717,13 +719,13 @@ export async function stopTeam(req, res) {
|
|
|
717
719
|
}
|
|
718
720
|
}
|
|
719
721
|
catch (error) {
|
|
720
|
-
|
|
722
|
+
logger.error('Error cancelling team scheduled messages', { error: error instanceof Error ? error.message : String(error) });
|
|
721
723
|
}
|
|
722
724
|
}
|
|
723
725
|
res.json({ success: true, message: `Team stopped. Stopped ${sessionsStopped} sessions, ${sessionsNotFound} were already stopped.`, data: { sessionsStopped, sessionsNotFound, results } });
|
|
724
726
|
}
|
|
725
727
|
catch (error) {
|
|
726
|
-
|
|
728
|
+
logger.error('Error stopping team', { error: error instanceof Error ? error.message : String(error) });
|
|
727
729
|
res.status(500).json({ success: false, error: 'Failed to stop team' });
|
|
728
730
|
}
|
|
729
731
|
}
|
|
@@ -747,7 +749,7 @@ export async function getTeamWorkload(req, res) {
|
|
|
747
749
|
res.json({ success: true, data: { teamId: id, teamName: team.name, assignedTickets, completedTickets, workloadPercentage: assignedTickets > 0 ? Math.round((completedTickets / assignedTickets) * 100) : 0 } });
|
|
748
750
|
}
|
|
749
751
|
catch (error) {
|
|
750
|
-
|
|
752
|
+
logger.error('Error getting team workload', { error: error instanceof Error ? error.message : String(error) });
|
|
751
753
|
res.status(500).json({ success: false, error: 'Failed to retrieve team workload' });
|
|
752
754
|
}
|
|
753
755
|
}
|
|
@@ -774,7 +776,7 @@ export async function deleteTeam(req, res) {
|
|
|
774
776
|
}
|
|
775
777
|
}
|
|
776
778
|
catch (notificationError) {
|
|
777
|
-
|
|
779
|
+
logger.warn('Failed to notify orchestrator about team deletion', { error: notificationError instanceof Error ? notificationError.message : String(notificationError) });
|
|
778
780
|
}
|
|
779
781
|
if (team.members && team.members.length > 0) {
|
|
780
782
|
for (const member of team.members) {
|
|
@@ -784,7 +786,7 @@ export async function deleteTeam(req, res) {
|
|
|
784
786
|
this.schedulerService.cancelAllChecksForSession(member.sessionName);
|
|
785
787
|
}
|
|
786
788
|
catch (error) {
|
|
787
|
-
|
|
789
|
+
logger.warn('Failed to kill session for member', { memberName: member.name, error: error instanceof Error ? error.message : String(error) });
|
|
788
790
|
}
|
|
789
791
|
}
|
|
790
792
|
}
|
|
@@ -793,7 +795,7 @@ export async function deleteTeam(req, res) {
|
|
|
793
795
|
res.json({ success: true, message: 'Team terminated successfully' });
|
|
794
796
|
}
|
|
795
797
|
catch (error) {
|
|
796
|
-
|
|
798
|
+
logger.error('Error deleting team', { error: error instanceof Error ? error.message : String(error) });
|
|
797
799
|
res.status(500).json({ success: false, error: 'Failed to terminate team' });
|
|
798
800
|
}
|
|
799
801
|
}
|
|
@@ -820,7 +822,7 @@ export async function getTeamMemberSession(req, res) {
|
|
|
820
822
|
res.json({ success: true, data: { memberId: member.id, memberName: member.name, sessionName: member.sessionName, output, timestamp: new Date().toISOString() } });
|
|
821
823
|
}
|
|
822
824
|
catch (error) {
|
|
823
|
-
|
|
825
|
+
logger.error('Error getting team member session', { error: error instanceof Error ? error.message : String(error) });
|
|
824
826
|
res.status(500).json({ success: false, error: 'Failed to get team member session' });
|
|
825
827
|
}
|
|
826
828
|
}
|
|
@@ -857,7 +859,7 @@ export async function addTeamMember(req, res) {
|
|
|
857
859
|
res.json({ success: true, data: newMember, message: 'Team member added successfully' });
|
|
858
860
|
}
|
|
859
861
|
catch (error) {
|
|
860
|
-
|
|
862
|
+
logger.error('Error adding team member', { error: error instanceof Error ? error.message : String(error) });
|
|
861
863
|
res.status(500).json({ success: false, error: 'Failed to add team member' });
|
|
862
864
|
}
|
|
863
865
|
}
|
|
@@ -883,7 +885,7 @@ export async function updateTeamMember(req, res) {
|
|
|
883
885
|
res.json({ success: true, data: updatedMember, message: 'Team member updated successfully' });
|
|
884
886
|
}
|
|
885
887
|
catch (error) {
|
|
886
|
-
|
|
888
|
+
logger.error('Error updating team member', { error: error instanceof Error ? error.message : String(error) });
|
|
887
889
|
res.status(500).json({ success: false, error: 'Failed to update team member' });
|
|
888
890
|
}
|
|
889
891
|
}
|
|
@@ -907,7 +909,7 @@ export async function deleteTeamMember(req, res) {
|
|
|
907
909
|
await this.tmuxService.killSession(member.sessionName);
|
|
908
910
|
}
|
|
909
911
|
catch (error) {
|
|
910
|
-
|
|
912
|
+
logger.warn('Failed to kill tmux session', { sessionName: member.sessionName, error: error instanceof Error ? error.message : String(error) });
|
|
911
913
|
}
|
|
912
914
|
}
|
|
913
915
|
team.members.splice(memberIndex, 1);
|
|
@@ -916,7 +918,7 @@ export async function deleteTeamMember(req, res) {
|
|
|
916
918
|
res.json({ success: true, message: 'Team member removed successfully' });
|
|
917
919
|
}
|
|
918
920
|
catch (error) {
|
|
919
|
-
|
|
921
|
+
logger.error('Error deleting team member', { error: error instanceof Error ? error.message : String(error) });
|
|
920
922
|
res.status(500).json({ success: false, error: 'Failed to delete team member' });
|
|
921
923
|
}
|
|
922
924
|
}
|
|
@@ -995,7 +997,7 @@ export async function startTeamMember(req, res) {
|
|
|
995
997
|
}
|
|
996
998
|
}
|
|
997
999
|
catch (error) {
|
|
998
|
-
|
|
1000
|
+
logger.error('Error starting team member', { error: error instanceof Error ? error.message : String(error) });
|
|
999
1001
|
res.status(500).json({ success: false, error: 'Failed to start team member' });
|
|
1000
1002
|
}
|
|
1001
1003
|
}
|
|
@@ -1034,7 +1036,7 @@ export async function stopTeamMember(req, res) {
|
|
|
1034
1036
|
}
|
|
1035
1037
|
}
|
|
1036
1038
|
catch (error) {
|
|
1037
|
-
|
|
1039
|
+
logger.error('Error stopping team member', { error: error instanceof Error ? error.message : String(error) });
|
|
1038
1040
|
res.status(500).json({ success: false, error: 'Failed to stop team member' });
|
|
1039
1041
|
}
|
|
1040
1042
|
}
|
|
@@ -1064,12 +1066,12 @@ export async function reportMemberReady(req, res) {
|
|
|
1064
1066
|
}
|
|
1065
1067
|
}
|
|
1066
1068
|
if (!memberFound) {
|
|
1067
|
-
|
|
1069
|
+
logger.warn('Session not found in any team, but reporting ready anyway', { sessionName });
|
|
1068
1070
|
}
|
|
1069
1071
|
res.json({ success: true, message: `Agent ${sessionName} reported ready with role ${role}`, data: { sessionName, role, capabilities, readyAt } });
|
|
1070
1072
|
}
|
|
1071
1073
|
catch (error) {
|
|
1072
|
-
|
|
1074
|
+
logger.error('Error reporting member ready', { error: error instanceof Error ? error.message : String(error) });
|
|
1073
1075
|
res.status(500).json({ success: false, error: 'Failed to report member ready' });
|
|
1074
1076
|
}
|
|
1075
1077
|
}
|
|
@@ -1106,7 +1108,7 @@ export async function registerMemberStatus(req, res) {
|
|
|
1106
1108
|
return;
|
|
1107
1109
|
}
|
|
1108
1110
|
catch (error) {
|
|
1109
|
-
|
|
1111
|
+
logger.error('Error updating orchestrator status', { error: error instanceof Error ? error.message : String(error) });
|
|
1110
1112
|
res.status(500).json({ success: false, error: 'Failed to update orchestrator status' });
|
|
1111
1113
|
return;
|
|
1112
1114
|
}
|
|
@@ -1130,7 +1132,7 @@ export async function registerMemberStatus(req, res) {
|
|
|
1130
1132
|
}
|
|
1131
1133
|
// Load fresh team data and apply registration changes to avoid race conditions
|
|
1132
1134
|
if (!targetTeamId || !targetMemberId) {
|
|
1133
|
-
|
|
1135
|
+
logger.warn('registerMemberStatus: agent not found in any team', { sessionName, role, memberId });
|
|
1134
1136
|
res.status(404).json({ success: false, error: `Agent with sessionName '${sessionName}' not found in any team` });
|
|
1135
1137
|
return;
|
|
1136
1138
|
}
|
|
@@ -1157,7 +1159,7 @@ export async function registerMemberStatus(req, res) {
|
|
|
1157
1159
|
}
|
|
1158
1160
|
catch (persistError) {
|
|
1159
1161
|
// Non-fatal: resume just won't work on next restart
|
|
1160
|
-
|
|
1162
|
+
logger.warn('Failed to persist claudeSessionId', { error: persistError instanceof Error ? persistError.message : String(persistError) });
|
|
1161
1163
|
}
|
|
1162
1164
|
}
|
|
1163
1165
|
res.json({ success: true, message: `Agent ${sessionName} registered as active with role ${role}`, data: { sessionName, role, status: CREWLY_CONSTANTS.AGENT_STATUSES.ACTIVE, registeredAt: registeredAt || new Date().toISOString() } });
|
|
@@ -1166,16 +1168,16 @@ export async function registerMemberStatus(req, res) {
|
|
|
1166
1168
|
if (subAgentQueue.hasPending(sessionName)) {
|
|
1167
1169
|
const runtimeType = (freshTeam?.members.find(m => m.id === targetMemberId)?.runtimeType || RUNTIME_TYPES.CLAUDE_CODE);
|
|
1168
1170
|
const queuedMessages = subAgentQueue.dequeueAll(sessionName);
|
|
1169
|
-
|
|
1171
|
+
logger.info('Flushing queued messages', { count: queuedMessages.length, sessionName });
|
|
1170
1172
|
// Deliver sequentially in the background
|
|
1171
1173
|
(async () => {
|
|
1172
1174
|
for (const queuedMsg of queuedMessages) {
|
|
1173
1175
|
try {
|
|
1174
1176
|
await this.agentRegistrationService.sendMessageToAgent(sessionName, queuedMsg.data, runtimeType);
|
|
1175
|
-
|
|
1177
|
+
logger.info('Delivered queued message', { sessionName, queuedAt: new Date(queuedMsg.queuedAt).toISOString() });
|
|
1176
1178
|
}
|
|
1177
1179
|
catch (flushError) {
|
|
1178
|
-
|
|
1180
|
+
logger.error('Failed to deliver queued message', { sessionName, error: flushError instanceof Error ? flushError.message : String(flushError) });
|
|
1179
1181
|
}
|
|
1180
1182
|
// Delay between messages to let the agent process each one
|
|
1181
1183
|
if (queuedMessages.indexOf(queuedMsg) < queuedMessages.length - 1) {
|
|
@@ -1183,12 +1185,12 @@ export async function registerMemberStatus(req, res) {
|
|
|
1183
1185
|
}
|
|
1184
1186
|
}
|
|
1185
1187
|
})().catch(err => {
|
|
1186
|
-
|
|
1188
|
+
logger.error('Queue flush failed', { sessionName, error: err instanceof Error ? err.message : String(err) });
|
|
1187
1189
|
});
|
|
1188
1190
|
}
|
|
1189
1191
|
}
|
|
1190
1192
|
catch (error) {
|
|
1191
|
-
|
|
1193
|
+
logger.error('Error in registerMemberStatus', { error: error instanceof Error ? error.message : String(error) });
|
|
1192
1194
|
res.status(500).json({ success: false, error: 'Failed to register member status' });
|
|
1193
1195
|
}
|
|
1194
1196
|
}
|
|
@@ -1222,7 +1224,7 @@ export async function generateMemberContext(req, res) {
|
|
|
1222
1224
|
res.json({ success: true, data: { teamId, memberId, memberName: member.name, contextPrompt, generatedAt: new Date().toISOString() } });
|
|
1223
1225
|
}
|
|
1224
1226
|
catch (error) {
|
|
1225
|
-
|
|
1227
|
+
logger.error('Error generating member context', { error: error instanceof Error ? error.message : String(error) });
|
|
1226
1228
|
res.status(500).json({ success: false, error: 'Failed to generate member context' });
|
|
1227
1229
|
}
|
|
1228
1230
|
}
|
|
@@ -1256,7 +1258,7 @@ export async function injectContextIntoSession(req, res) {
|
|
|
1256
1258
|
res.json({ success: true, data: { teamId, memberId, memberName: member.name, sessionName: member.sessionName, contextInjected: true, injectedAt: new Date().toISOString() } });
|
|
1257
1259
|
}
|
|
1258
1260
|
catch (error) {
|
|
1259
|
-
|
|
1261
|
+
logger.error('Error injecting context into session', { error: error instanceof Error ? error.message : String(error) });
|
|
1260
1262
|
res.status(500).json({ success: false, error: 'Failed to inject context into session' });
|
|
1261
1263
|
}
|
|
1262
1264
|
}
|
|
@@ -1286,7 +1288,7 @@ export async function refreshMemberContext(req, res) {
|
|
|
1286
1288
|
res.json({ success: true, data: { teamId, memberId, memberName: member.name, contextPath, refreshedAt: new Date().toISOString() } });
|
|
1287
1289
|
}
|
|
1288
1290
|
catch (error) {
|
|
1289
|
-
|
|
1291
|
+
logger.error('Error refreshing member context', { error: error instanceof Error ? error.message : String(error) });
|
|
1290
1292
|
res.status(500).json({ success: false, error: 'Failed to refresh member context' });
|
|
1291
1293
|
}
|
|
1292
1294
|
}
|
|
@@ -1384,7 +1386,7 @@ export async function getTeamActivityStatus(req, res) {
|
|
|
1384
1386
|
});
|
|
1385
1387
|
}
|
|
1386
1388
|
catch (error) {
|
|
1387
|
-
|
|
1389
|
+
logger.error('Error checking activity for member', { memberId: member.id, error: error instanceof Error ? error.message : String(error) });
|
|
1388
1390
|
// Clear terminal output on error to prevent memory leak
|
|
1389
1391
|
delete mutableMember.lastTerminalOutput;
|
|
1390
1392
|
const currentTask = tasksByMember.get(member.id) || null;
|
|
@@ -1449,7 +1451,7 @@ export async function getTeamActivityStatus(req, res) {
|
|
|
1449
1451
|
});
|
|
1450
1452
|
}
|
|
1451
1453
|
catch (error) {
|
|
1452
|
-
|
|
1454
|
+
logger.error('Error checking team activity status', { error: error instanceof Error ? error.message : String(error) });
|
|
1453
1455
|
res.status(500).json({ success: false, error: 'Failed to check team activity status' });
|
|
1454
1456
|
}
|
|
1455
1457
|
}
|
|
@@ -1531,7 +1533,7 @@ export async function updateTeamMemberRuntime(req, res) {
|
|
|
1531
1533
|
});
|
|
1532
1534
|
}
|
|
1533
1535
|
catch (error) {
|
|
1534
|
-
|
|
1536
|
+
logger.error('Error updating team member runtime', { error: error instanceof Error ? error.message : String(error) });
|
|
1535
1537
|
res.status(500).json({
|
|
1536
1538
|
success: false,
|
|
1537
1539
|
error: 'Failed to update team member runtime'
|
|
@@ -1646,7 +1648,7 @@ export async function updateTeam(req, res) {
|
|
|
1646
1648
|
});
|
|
1647
1649
|
}
|
|
1648
1650
|
catch (error) {
|
|
1649
|
-
|
|
1651
|
+
logger.error('Error updating team', { error: error instanceof Error ? error.message : String(error) });
|
|
1650
1652
|
res.status(500).json({
|
|
1651
1653
|
success: false,
|
|
1652
1654
|
error: 'Failed to update team'
|