crewly 1.0.4 → 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.
Files changed (155) hide show
  1. package/config/roles/orchestrator/prompt.md +49 -1
  2. package/dist/backend/backend/src/controllers/messaging/delivery-logs.controller.d.ts.map +1 -1
  3. package/dist/backend/backend/src/controllers/messaging/delivery-logs.controller.js +4 -2
  4. package/dist/backend/backend/src/controllers/messaging/delivery-logs.controller.js.map +1 -1
  5. package/dist/backend/backend/src/controllers/messaging/scheduled-messages.controller.d.ts.map +1 -1
  6. package/dist/backend/backend/src/controllers/messaging/scheduled-messages.controller.js +10 -8
  7. package/dist/backend/backend/src/controllers/messaging/scheduled-messages.controller.js.map +1 -1
  8. package/dist/backend/backend/src/controllers/orchestrator/orchestrator.controller.d.ts.map +1 -1
  9. package/dist/backend/backend/src/controllers/orchestrator/orchestrator.controller.js +28 -26
  10. package/dist/backend/backend/src/controllers/orchestrator/orchestrator.controller.js.map +1 -1
  11. package/dist/backend/backend/src/controllers/project/git.controller.d.ts.map +1 -1
  12. package/dist/backend/backend/src/controllers/project/git.controller.js +9 -7
  13. package/dist/backend/backend/src/controllers/project/git.controller.js.map +1 -1
  14. package/dist/backend/backend/src/controllers/project/project.controller.d.ts.map +1 -1
  15. package/dist/backend/backend/src/controllers/project/project.controller.js +52 -50
  16. package/dist/backend/backend/src/controllers/project/project.controller.js.map +1 -1
  17. package/dist/backend/backend/src/controllers/skill/skill.controller.d.ts.map +1 -1
  18. package/dist/backend/backend/src/controllers/skill/skill.controller.js +3 -1
  19. package/dist/backend/backend/src/controllers/skill/skill.controller.js.map +1 -1
  20. package/dist/backend/backend/src/controllers/slack/slack-thread.controller.d.ts.map +1 -1
  21. package/dist/backend/backend/src/controllers/slack/slack-thread.controller.js +3 -1
  22. package/dist/backend/backend/src/controllers/slack/slack-thread.controller.js.map +1 -1
  23. package/dist/backend/backend/src/controllers/system/config.controller.d.ts.map +1 -1
  24. package/dist/backend/backend/src/controllers/system/config.controller.js +3 -1
  25. package/dist/backend/backend/src/controllers/system/config.controller.js.map +1 -1
  26. package/dist/backend/backend/src/controllers/system/errors.controller.d.ts.map +1 -1
  27. package/dist/backend/backend/src/controllers/system/errors.controller.js +7 -5
  28. package/dist/backend/backend/src/controllers/system/errors.controller.js.map +1 -1
  29. package/dist/backend/backend/src/controllers/system/scheduler.controller.d.ts.map +1 -1
  30. package/dist/backend/backend/src/controllers/system/scheduler.controller.js +6 -4
  31. package/dist/backend/backend/src/controllers/system/scheduler.controller.js.map +1 -1
  32. package/dist/backend/backend/src/controllers/system/system.controller.d.ts.map +1 -1
  33. package/dist/backend/backend/src/controllers/system/system.controller.js +20 -19
  34. package/dist/backend/backend/src/controllers/system/system.controller.js.map +1 -1
  35. package/dist/backend/backend/src/controllers/task-management/assignments.controller.d.ts.map +1 -1
  36. package/dist/backend/backend/src/controllers/task-management/assignments.controller.js +4 -2
  37. package/dist/backend/backend/src/controllers/task-management/assignments.controller.js.map +1 -1
  38. package/dist/backend/backend/src/controllers/task-management/in-progress-tasks.controller.d.ts.map +1 -1
  39. package/dist/backend/backend/src/controllers/task-management/in-progress-tasks.controller.js +3 -1
  40. package/dist/backend/backend/src/controllers/task-management/in-progress-tasks.controller.js.map +1 -1
  41. package/dist/backend/backend/src/controllers/task-management/task-management.controller.d.ts.map +1 -1
  42. package/dist/backend/backend/src/controllers/task-management/task-management.controller.js +30 -28
  43. package/dist/backend/backend/src/controllers/task-management/task-management.controller.js.map +1 -1
  44. package/dist/backend/backend/src/controllers/task-management/tasks.controller.d.ts.map +1 -1
  45. package/dist/backend/backend/src/controllers/task-management/tasks.controller.js +7 -5
  46. package/dist/backend/backend/src/controllers/task-management/tasks.controller.js.map +1 -1
  47. package/dist/backend/backend/src/controllers/task-management/tickets.controller.d.ts.map +1 -1
  48. package/dist/backend/backend/src/controllers/task-management/tickets.controller.js +12 -10
  49. package/dist/backend/backend/src/controllers/task-management/tickets.controller.js.map +1 -1
  50. package/dist/backend/backend/src/controllers/team/team.controller.d.ts.map +1 -1
  51. package/dist/backend/backend/src/controllers/team/team.controller.js +44 -42
  52. package/dist/backend/backend/src/controllers/team/team.controller.js.map +1 -1
  53. package/dist/backend/backend/src/index.d.ts.map +1 -1
  54. package/dist/backend/backend/src/index.js +5 -1
  55. package/dist/backend/backend/src/index.js.map +1 -1
  56. package/dist/backend/backend/src/routes/factory.routes.d.ts.map +1 -1
  57. package/dist/backend/backend/src/routes/factory.routes.js +4 -2
  58. package/dist/backend/backend/src/routes/factory.routes.js.map +1 -1
  59. package/dist/backend/backend/src/services/agent/agent-registration.service.d.ts +6 -0
  60. package/dist/backend/backend/src/services/agent/agent-registration.service.d.ts.map +1 -1
  61. package/dist/backend/backend/src/services/agent/agent-registration.service.js +17 -0
  62. package/dist/backend/backend/src/services/agent/agent-registration.service.js.map +1 -1
  63. package/dist/backend/backend/src/services/ai/context-loader.service.d.ts +1 -0
  64. package/dist/backend/backend/src/services/ai/context-loader.service.d.ts.map +1 -1
  65. package/dist/backend/backend/src/services/ai/context-loader.service.js +9 -7
  66. package/dist/backend/backend/src/services/ai/context-loader.service.js.map +1 -1
  67. package/dist/backend/backend/src/services/ai/prompt-template.service.d.ts +1 -0
  68. package/dist/backend/backend/src/services/ai/prompt-template.service.d.ts.map +1 -1
  69. package/dist/backend/backend/src/services/ai/prompt-template.service.js +7 -5
  70. package/dist/backend/backend/src/services/ai/prompt-template.service.js.map +1 -1
  71. package/dist/backend/backend/src/services/core/config.service.d.ts +6 -0
  72. package/dist/backend/backend/src/services/core/config.service.d.ts.map +1 -1
  73. package/dist/backend/backend/src/services/core/config.service.js +25 -5
  74. package/dist/backend/backend/src/services/core/config.service.js.map +1 -1
  75. package/dist/backend/backend/src/services/core/storage.service.js +20 -20
  76. package/dist/backend/backend/src/services/core/storage.service.js.map +1 -1
  77. package/dist/backend/backend/src/services/monitoring/team-activity-websocket.service.d.ts +1 -0
  78. package/dist/backend/backend/src/services/monitoring/team-activity-websocket.service.d.ts.map +1 -1
  79. package/dist/backend/backend/src/services/monitoring/team-activity-websocket.service.js +12 -10
  80. package/dist/backend/backend/src/services/monitoring/team-activity-websocket.service.js.map +1 -1
  81. package/dist/backend/backend/src/services/orchestrator/improvement-startup.service.d.ts +1 -0
  82. package/dist/backend/backend/src/services/orchestrator/improvement-startup.service.d.ts.map +1 -1
  83. package/dist/backend/backend/src/services/orchestrator/improvement-startup.service.js +22 -20
  84. package/dist/backend/backend/src/services/orchestrator/improvement-startup.service.js.map +1 -1
  85. package/dist/backend/backend/src/services/orchestrator/safe-restart.service.d.ts +1 -0
  86. package/dist/backend/backend/src/services/orchestrator/safe-restart.service.d.ts.map +1 -1
  87. package/dist/backend/backend/src/services/orchestrator/safe-restart.service.js +25 -23
  88. package/dist/backend/backend/src/services/orchestrator/safe-restart.service.js.map +1 -1
  89. package/dist/backend/backend/src/services/orchestrator/self-improvement.service.d.ts +1 -0
  90. package/dist/backend/backend/src/services/orchestrator/self-improvement.service.d.ts.map +1 -1
  91. package/dist/backend/backend/src/services/orchestrator/self-improvement.service.js +12 -10
  92. package/dist/backend/backend/src/services/orchestrator/self-improvement.service.js.map +1 -1
  93. package/dist/backend/backend/src/services/orchestrator/slack-bridge-lazy.d.ts +17 -0
  94. package/dist/backend/backend/src/services/orchestrator/slack-bridge-lazy.d.ts.map +1 -0
  95. package/dist/backend/backend/src/services/orchestrator/slack-bridge-lazy.js +30 -0
  96. package/dist/backend/backend/src/services/orchestrator/slack-bridge-lazy.js.map +1 -0
  97. package/dist/backend/backend/src/services/orchestrator/state-persistence.service.d.ts +1 -0
  98. package/dist/backend/backend/src/services/orchestrator/state-persistence.service.d.ts.map +1 -1
  99. package/dist/backend/backend/src/services/orchestrator/state-persistence.service.js +14 -12
  100. package/dist/backend/backend/src/services/orchestrator/state-persistence.service.js.map +1 -1
  101. package/dist/backend/backend/src/services/project/active-projects.service.d.ts +1 -0
  102. package/dist/backend/backend/src/services/project/active-projects.service.d.ts.map +1 -1
  103. package/dist/backend/backend/src/services/project/active-projects.service.js +8 -6
  104. package/dist/backend/backend/src/services/project/active-projects.service.js.map +1 -1
  105. package/dist/backend/backend/src/services/project/task-tracking.service.d.ts +1 -0
  106. package/dist/backend/backend/src/services/project/task-tracking.service.d.ts.map +1 -1
  107. package/dist/backend/backend/src/services/project/task-tracking.service.js +18 -16
  108. package/dist/backend/backend/src/services/project/task-tracking.service.js.map +1 -1
  109. package/dist/backend/backend/src/services/project/ticket-editor.service.d.ts +1 -0
  110. package/dist/backend/backend/src/services/project/ticket-editor.service.d.ts.map +1 -1
  111. package/dist/backend/backend/src/services/project/ticket-editor.service.js +6 -4
  112. package/dist/backend/backend/src/services/project/ticket-editor.service.js.map +1 -1
  113. package/dist/backend/backend/src/services/settings/role.service.d.ts +1 -0
  114. package/dist/backend/backend/src/services/settings/role.service.d.ts.map +1 -1
  115. package/dist/backend/backend/src/services/settings/role.service.js +3 -1
  116. package/dist/backend/backend/src/services/settings/role.service.js.map +1 -1
  117. package/dist/backend/backend/src/services/skill/skill-executor.service.d.ts +1 -0
  118. package/dist/backend/backend/src/services/skill/skill-executor.service.d.ts.map +1 -1
  119. package/dist/backend/backend/src/services/skill/skill-executor.service.js +4 -2
  120. package/dist/backend/backend/src/services/skill/skill-executor.service.js.map +1 -1
  121. package/dist/backend/backend/src/services/skill/skill.service.d.ts +1 -0
  122. package/dist/backend/backend/src/services/skill/skill.service.d.ts.map +1 -1
  123. package/dist/backend/backend/src/services/skill/skill.service.js +7 -5
  124. package/dist/backend/backend/src/services/skill/skill.service.js.map +1 -1
  125. package/dist/backend/backend/src/services/slack/slack-image.service.d.ts +1 -0
  126. package/dist/backend/backend/src/services/slack/slack-image.service.d.ts.map +1 -1
  127. package/dist/backend/backend/src/services/slack/slack-image.service.js +6 -4
  128. package/dist/backend/backend/src/services/slack/slack-image.service.js.map +1 -1
  129. package/dist/backend/backend/src/services/slack/slack-initializer.d.ts.map +1 -1
  130. package/dist/backend/backend/src/services/slack/slack-initializer.js +7 -5
  131. package/dist/backend/backend/src/services/slack/slack-initializer.js.map +1 -1
  132. package/dist/backend/backend/src/services/slack/slack-orchestrator-bridge.d.ts +1 -0
  133. package/dist/backend/backend/src/services/slack/slack-orchestrator-bridge.d.ts.map +1 -1
  134. package/dist/backend/backend/src/services/slack/slack-orchestrator-bridge.js +25 -20
  135. package/dist/backend/backend/src/services/slack/slack-orchestrator-bridge.js.map +1 -1
  136. package/dist/backend/backend/src/services/slack/slack.service.d.ts +1 -0
  137. package/dist/backend/backend/src/services/slack/slack.service.d.ts.map +1 -1
  138. package/dist/backend/backend/src/services/slack/slack.service.js +19 -15
  139. package/dist/backend/backend/src/services/slack/slack.service.js.map +1 -1
  140. package/dist/backend/backend/src/utils/process-recovery.d.ts +1 -0
  141. package/dist/backend/backend/src/utils/process-recovery.d.ts.map +1 -1
  142. package/dist/backend/backend/src/utils/process-recovery.js +40 -37
  143. package/dist/backend/backend/src/utils/process-recovery.js.map +1 -1
  144. package/dist/backend/backend/src/utils/prompt-resolver.d.ts.map +1 -1
  145. package/dist/backend/backend/src/utils/prompt-resolver.js +3 -1
  146. package/dist/backend/backend/src/utils/prompt-resolver.js.map +1 -1
  147. package/dist/backend/backend/src/utils/resource-monitor.d.ts +2 -1
  148. package/dist/backend/backend/src/utils/resource-monitor.d.ts.map +1 -1
  149. package/dist/backend/backend/src/utils/resource-monitor.js +34 -24
  150. package/dist/backend/backend/src/utils/resource-monitor.js.map +1 -1
  151. package/frontend/dist/assets/{index-959a77b6.js → index-419da091.js} +1 -1
  152. package/frontend/dist/assets/index-5adb4dff.css +33 -0
  153. package/frontend/dist/index.html +2 -2
  154. package/package.json +2 -1
  155. 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
- console.warn(`Cleaning up zombie session: ${member.sessionName}`);
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
- console.warn(`Error checking session ${member.sessionName}, treating as zombie:`, error);
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
- console.warn(`[TeamController] Failed to initialize memory for ${sessionName}:`, memError);
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
- console.error(`Team or member not found after session creation: teamId=${team.id}, memberId=${member.id}`);
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
- console.error(`All ${MAX_CREATION_RETRIES} session creation attempts failed for ${member.name}: ${lastError}`);
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
- console.error('Error starting team member:', error);
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
- console.error('Failed to terminate team member session:', stopResult.error);
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
- console.error('Error stopping team member:', error);
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
- console.error('Error creating team:', error);
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
- console.error('Error getting teams:', error);
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
- console.error('Error getting team:', error);
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
- console.error('Error starting team:', error);
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
- console.error('Error cancelling team scheduled messages:', error);
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
- console.error('Error stopping team:', error);
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
- console.error('Error getting team workload:', error);
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
- console.warn('Failed to notify orchestrator about team deletion:', notificationError);
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
- console.warn(`Failed to kill session for member ${member.name}:`, error);
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
- console.error('Error deleting team:', error);
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
- console.error('Error getting team member session:', error);
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
- console.error('Error adding team member:', error);
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
- console.error('Error updating team member:', error);
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
- console.warn(`Failed to kill tmux session ${member.sessionName}:`, error);
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
- console.error('Error deleting team member:', error);
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
- console.error('Error starting team member:', error);
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
- console.error('Error stopping team member:', error);
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
- console.warn(`Session ${sessionName} not found in any team, but reporting ready anyway`);
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
- console.error('Error reporting member ready:', error);
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
- console.error('Error updating orchestrator status:', error);
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
- console.warn(`registerMemberStatus: agent not found in any team`, { sessionName, role, memberId });
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
- console.warn('Failed to persist claudeSessionId:', persistError);
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
- console.log(`[registerMemberStatus] Flushing ${queuedMessages.length} queued message(s) to ${sessionName}`);
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
- console.log(`[registerMemberStatus] Delivered queued message to ${sessionName} (queued at ${new Date(queuedMsg.queuedAt).toISOString()})`);
1177
+ logger.info('Delivered queued message', { sessionName, queuedAt: new Date(queuedMsg.queuedAt).toISOString() });
1176
1178
  }
1177
1179
  catch (flushError) {
1178
- console.error(`[registerMemberStatus] Failed to deliver queued message to ${sessionName}:`, flushError);
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
- console.error(`[registerMemberStatus] Queue flush failed for ${sessionName}:`, err);
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
- console.error('Error in registerMemberStatus:', error);
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
- console.error('Error generating member context:', error);
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
- console.error('Error injecting context into session:', error);
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
- console.error('Error refreshing member context:', error);
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
- console.error(`Error checking activity for member ${member.id}:`, error);
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
- console.error('Error checking team activity status:', error);
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
- console.error('Error updating team member runtime:', error);
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
- console.error('Error updating team:', error);
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'