crewly 1.20.163 → 1.20.165

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 (167) hide show
  1. package/config/roles/orchestrator/prompt.md +2 -0
  2. package/config/roles/team-leader/prompt.md +2 -0
  3. package/config/roles/team-leader/tl-addon.md +2 -0
  4. package/config/skills/agent/core/project-tickets/SKILL.md +4 -0
  5. package/config/skills/orchestrator/set-team-lead/SKILL.md +58 -0
  6. package/config/skills/orchestrator/set-team-lead/execute.sh +46 -0
  7. package/config/skills/orchestrator/set-team-lead/execute.test.sh +77 -0
  8. package/dist/backend/backend/src/constants.d.ts +46 -1
  9. package/dist/backend/backend/src/constants.d.ts.map +1 -1
  10. package/dist/backend/backend/src/constants.js +54 -2
  11. package/dist/backend/backend/src/constants.js.map +1 -1
  12. package/dist/backend/backend/src/controllers/project-tickets/project-tickets.controller.d.ts +1 -1
  13. package/dist/backend/backend/src/controllers/project-tickets/project-tickets.controller.d.ts.map +1 -1
  14. package/dist/backend/backend/src/controllers/project-tickets/project-tickets.controller.js +6 -1
  15. package/dist/backend/backend/src/controllers/project-tickets/project-tickets.controller.js.map +1 -1
  16. package/dist/backend/backend/src/controllers/team/team.controller.d.ts +15 -0
  17. package/dist/backend/backend/src/controllers/team/team.controller.d.ts.map +1 -1
  18. package/dist/backend/backend/src/controllers/team/team.controller.js +110 -15
  19. package/dist/backend/backend/src/controllers/team/team.controller.js.map +1 -1
  20. package/dist/backend/backend/src/controllers/team/team.routes.d.ts.map +1 -1
  21. package/dist/backend/backend/src/controllers/team/team.routes.js +3 -1
  22. package/dist/backend/backend/src/controllers/team/team.routes.js.map +1 -1
  23. package/dist/backend/backend/src/index.d.ts.map +1 -1
  24. package/dist/backend/backend/src/index.js +16 -15
  25. package/dist/backend/backend/src/index.js.map +1 -1
  26. package/dist/backend/backend/src/models/Team.d.ts.map +1 -1
  27. package/dist/backend/backend/src/models/Team.js +5 -9
  28. package/dist/backend/backend/src/models/Team.js.map +1 -1
  29. package/dist/backend/backend/src/services/agent/agent-registration.service.d.ts.map +1 -1
  30. package/dist/backend/backend/src/services/agent/agent-registration.service.js +20 -28
  31. package/dist/backend/backend/src/services/agent/agent-registration.service.js.map +1 -1
  32. package/dist/backend/backend/src/services/agent/idle-detection.service.d.ts +26 -0
  33. package/dist/backend/backend/src/services/agent/idle-detection.service.d.ts.map +1 -1
  34. package/dist/backend/backend/src/services/agent/idle-detection.service.js +43 -0
  35. package/dist/backend/backend/src/services/agent/idle-detection.service.js.map +1 -1
  36. package/dist/backend/backend/src/services/ai/prompt-builder.service.d.ts +18 -6
  37. package/dist/backend/backend/src/services/ai/prompt-builder.service.d.ts.map +1 -1
  38. package/dist/backend/backend/src/services/ai/prompt-builder.service.js +21 -23
  39. package/dist/backend/backend/src/services/ai/prompt-builder.service.js.map +1 -1
  40. package/dist/backend/backend/src/services/chat-v2/huddle-leader.d.ts +23 -0
  41. package/dist/backend/backend/src/services/chat-v2/huddle-leader.d.ts.map +1 -0
  42. package/dist/backend/backend/src/services/chat-v2/huddle-leader.js +37 -0
  43. package/dist/backend/backend/src/services/chat-v2/huddle-leader.js.map +1 -0
  44. package/dist/backend/backend/src/services/core/storage.service.d.ts.map +1 -1
  45. package/dist/backend/backend/src/services/core/storage.service.js +3 -0
  46. package/dist/backend/backend/src/services/core/storage.service.js.map +1 -1
  47. package/dist/backend/backend/src/services/monitoring/activity-monitor.service.d.ts +34 -0
  48. package/dist/backend/backend/src/services/monitoring/activity-monitor.service.d.ts.map +1 -1
  49. package/dist/backend/backend/src/services/monitoring/activity-monitor.service.js +52 -0
  50. package/dist/backend/backend/src/services/monitoring/activity-monitor.service.js.map +1 -1
  51. package/dist/backend/backend/src/services/project-tickets/project-ticket-workflow.service.d.ts +28 -7
  52. package/dist/backend/backend/src/services/project-tickets/project-ticket-workflow.service.d.ts.map +1 -1
  53. package/dist/backend/backend/src/services/project-tickets/project-ticket-workflow.service.js +51 -15
  54. package/dist/backend/backend/src/services/project-tickets/project-ticket-workflow.service.js.map +1 -1
  55. package/dist/backend/backend/src/services/project-tickets/ticket-assignee-waker.d.ts +70 -0
  56. package/dist/backend/backend/src/services/project-tickets/ticket-assignee-waker.d.ts.map +1 -0
  57. package/dist/backend/backend/src/services/project-tickets/ticket-assignee-waker.js +64 -0
  58. package/dist/backend/backend/src/services/project-tickets/ticket-assignee-waker.js.map +1 -0
  59. package/dist/backend/backend/src/services/project-tickets/ticket-autopilot-decision.d.ts +24 -0
  60. package/dist/backend/backend/src/services/project-tickets/ticket-autopilot-decision.d.ts.map +1 -1
  61. package/dist/backend/backend/src/services/project-tickets/ticket-autopilot-decision.js +38 -1
  62. package/dist/backend/backend/src/services/project-tickets/ticket-autopilot-decision.js.map +1 -1
  63. package/dist/backend/backend/src/services/project-tickets/ticket-autopilot-messages.d.ts +14 -2
  64. package/dist/backend/backend/src/services/project-tickets/ticket-autopilot-messages.d.ts.map +1 -1
  65. package/dist/backend/backend/src/services/project-tickets/ticket-autopilot-messages.js +33 -3
  66. package/dist/backend/backend/src/services/project-tickets/ticket-autopilot-messages.js.map +1 -1
  67. package/dist/backend/backend/src/services/project-tickets/ticket-autopilot.service.d.ts +13 -2
  68. package/dist/backend/backend/src/services/project-tickets/ticket-autopilot.service.d.ts.map +1 -1
  69. package/dist/backend/backend/src/services/project-tickets/ticket-autopilot.service.js +43 -12
  70. package/dist/backend/backend/src/services/project-tickets/ticket-autopilot.service.js.map +1 -1
  71. package/dist/backend/backend/src/services/slack/slack-agent-dm.service.d.ts +6 -0
  72. package/dist/backend/backend/src/services/slack/slack-agent-dm.service.d.ts.map +1 -1
  73. package/dist/backend/backend/src/services/slack/slack-agent-dm.service.js +13 -0
  74. package/dist/backend/backend/src/services/slack/slack-agent-dm.service.js.map +1 -1
  75. package/dist/backend/backend/src/services/slack/slack-auto-working.service.d.ts +127 -0
  76. package/dist/backend/backend/src/services/slack/slack-auto-working.service.d.ts.map +1 -0
  77. package/dist/backend/backend/src/services/slack/slack-auto-working.service.js +200 -0
  78. package/dist/backend/backend/src/services/slack/slack-auto-working.service.js.map +1 -0
  79. package/dist/backend/backend/src/services/slack/slack-initializer.d.ts.map +1 -1
  80. package/dist/backend/backend/src/services/slack/slack-initializer.js +25 -1
  81. package/dist/backend/backend/src/services/slack/slack-initializer.js.map +1 -1
  82. package/dist/backend/backend/src/services/slack/slack-instance-registry.service.js +2 -2
  83. package/dist/backend/backend/src/services/slack/slack-instance-registry.service.js.map +1 -1
  84. package/dist/backend/backend/src/services/slack/slack-team-channel.service.d.ts +16 -1
  85. package/dist/backend/backend/src/services/slack/slack-team-channel.service.d.ts.map +1 -1
  86. package/dist/backend/backend/src/services/slack/slack-team-channel.service.js +40 -8
  87. package/dist/backend/backend/src/services/slack/slack-team-channel.service.js.map +1 -1
  88. package/dist/backend/backend/src/services/slack/slack-typing-placeholder.service.d.ts +12 -0
  89. package/dist/backend/backend/src/services/slack/slack-typing-placeholder.service.d.ts.map +1 -1
  90. package/dist/backend/backend/src/services/slack/slack-typing-placeholder.service.js +29 -0
  91. package/dist/backend/backend/src/services/slack/slack-typing-placeholder.service.js.map +1 -1
  92. package/dist/backend/backend/src/services/team-health/live-team-health-data-provider.d.ts.map +1 -1
  93. package/dist/backend/backend/src/services/team-health/live-team-health-data-provider.js +4 -3
  94. package/dist/backend/backend/src/services/team-health/live-team-health-data-provider.js.map +1 -1
  95. package/dist/backend/backend/src/services/v3/owner-receipt/owner-receipt.boot.d.ts +4 -3
  96. package/dist/backend/backend/src/services/v3/owner-receipt/owner-receipt.boot.d.ts.map +1 -1
  97. package/dist/backend/backend/src/services/v3/owner-receipt/owner-receipt.boot.js +6 -7
  98. package/dist/backend/backend/src/services/v3/owner-receipt/owner-receipt.boot.js.map +1 -1
  99. package/dist/backend/backend/src/services/wiki/wiki-owner.resolver.d.ts.map +1 -1
  100. package/dist/backend/backend/src/services/wiki/wiki-owner.resolver.js +2 -1
  101. package/dist/backend/backend/src/services/wiki/wiki-owner.resolver.js.map +1 -1
  102. package/dist/backend/backend/src/types/index.d.ts +3 -2
  103. package/dist/backend/backend/src/types/index.d.ts.map +1 -1
  104. package/dist/backend/backend/src/types/index.js.map +1 -1
  105. package/dist/backend/backend/src/utils/defaultPrompts.d.ts.map +1 -1
  106. package/dist/backend/backend/src/utils/defaultPrompts.js +8 -0
  107. package/dist/backend/backend/src/utils/defaultPrompts.js.map +1 -1
  108. package/dist/backend/backend/src/utils/member-default-model.utils.d.ts +5 -5
  109. package/dist/backend/backend/src/utils/member-default-model.utils.d.ts.map +1 -1
  110. package/dist/backend/backend/src/utils/member-default-model.utils.js +4 -4
  111. package/dist/backend/backend/src/utils/member-default-model.utils.js.map +1 -1
  112. package/dist/backend/backend/src/utils/team.utils.d.ts +129 -18
  113. package/dist/backend/backend/src/utils/team.utils.d.ts.map +1 -1
  114. package/dist/backend/backend/src/utils/team.utils.js +240 -28
  115. package/dist/backend/backend/src/utils/team.utils.js.map +1 -1
  116. package/dist/backend/build-info.json +2 -2
  117. package/dist/cli/backend/src/constants.d.ts +46 -1
  118. package/dist/cli/backend/src/constants.d.ts.map +1 -1
  119. package/dist/cli/backend/src/constants.js +54 -2
  120. package/dist/cli/backend/src/constants.js.map +1 -1
  121. package/dist/cli/backend/src/models/Team.d.ts.map +1 -1
  122. package/dist/cli/backend/src/models/Team.js +5 -9
  123. package/dist/cli/backend/src/models/Team.js.map +1 -1
  124. package/dist/cli/backend/src/services/agent/agent-registration.service.d.ts.map +1 -1
  125. package/dist/cli/backend/src/services/agent/agent-registration.service.js +20 -28
  126. package/dist/cli/backend/src/services/agent/agent-registration.service.js.map +1 -1
  127. package/dist/cli/backend/src/services/ai/prompt-builder.service.d.ts +18 -6
  128. package/dist/cli/backend/src/services/ai/prompt-builder.service.d.ts.map +1 -1
  129. package/dist/cli/backend/src/services/ai/prompt-builder.service.js +21 -23
  130. package/dist/cli/backend/src/services/ai/prompt-builder.service.js.map +1 -1
  131. package/dist/cli/backend/src/services/core/storage.service.d.ts.map +1 -1
  132. package/dist/cli/backend/src/services/core/storage.service.js +3 -0
  133. package/dist/cli/backend/src/services/core/storage.service.js.map +1 -1
  134. package/dist/cli/backend/src/services/monitoring/activity-monitor.service.d.ts +34 -0
  135. package/dist/cli/backend/src/services/monitoring/activity-monitor.service.d.ts.map +1 -1
  136. package/dist/cli/backend/src/services/monitoring/activity-monitor.service.js +52 -0
  137. package/dist/cli/backend/src/services/monitoring/activity-monitor.service.js.map +1 -1
  138. package/dist/cli/backend/src/services/slack/slack-agent-dm.service.d.ts +6 -0
  139. package/dist/cli/backend/src/services/slack/slack-agent-dm.service.d.ts.map +1 -1
  140. package/dist/cli/backend/src/services/slack/slack-agent-dm.service.js +13 -0
  141. package/dist/cli/backend/src/services/slack/slack-agent-dm.service.js.map +1 -1
  142. package/dist/cli/backend/src/services/slack/slack-auto-working.service.d.ts +127 -0
  143. package/dist/cli/backend/src/services/slack/slack-auto-working.service.d.ts.map +1 -0
  144. package/dist/cli/backend/src/services/slack/slack-auto-working.service.js +200 -0
  145. package/dist/cli/backend/src/services/slack/slack-auto-working.service.js.map +1 -0
  146. package/dist/cli/backend/src/services/slack/slack-team-channel.service.d.ts +16 -1
  147. package/dist/cli/backend/src/services/slack/slack-team-channel.service.d.ts.map +1 -1
  148. package/dist/cli/backend/src/services/slack/slack-team-channel.service.js +40 -8
  149. package/dist/cli/backend/src/services/slack/slack-team-channel.service.js.map +1 -1
  150. package/dist/cli/backend/src/services/slack/slack-typing-placeholder.service.d.ts +12 -0
  151. package/dist/cli/backend/src/services/slack/slack-typing-placeholder.service.d.ts.map +1 -1
  152. package/dist/cli/backend/src/services/slack/slack-typing-placeholder.service.js +29 -0
  153. package/dist/cli/backend/src/services/slack/slack-typing-placeholder.service.js.map +1 -1
  154. package/dist/cli/backend/src/types/index.d.ts +3 -2
  155. package/dist/cli/backend/src/types/index.d.ts.map +1 -1
  156. package/dist/cli/backend/src/types/index.js.map +1 -1
  157. package/dist/cli/backend/src/utils/member-default-model.utils.d.ts +5 -5
  158. package/dist/cli/backend/src/utils/member-default-model.utils.d.ts.map +1 -1
  159. package/dist/cli/backend/src/utils/member-default-model.utils.js +4 -4
  160. package/dist/cli/backend/src/utils/member-default-model.utils.js.map +1 -1
  161. package/dist/cli/backend/src/utils/team.utils.d.ts +129 -18
  162. package/dist/cli/backend/src/utils/team.utils.d.ts.map +1 -1
  163. package/dist/cli/backend/src/utils/team.utils.js +240 -28
  164. package/dist/cli/backend/src/utils/team.utils.js.map +1 -1
  165. package/frontend/dist/assets/{index-64c8a616.js → index-9153caca.js} +263 -263
  166. package/frontend/dist/index.html +1 -1
  167. package/package.json +1 -1
@@ -60,6 +60,7 @@ import { agentNameIndexOf, createSlackOwnerSender, startOwnerReceiptSchedule, te
60
60
  import { IntakeOutcomeLog } from './services/v3/ticket-intake-log.js';
61
61
  import { getSlackService } from './services/slack/slack.service.js';
62
62
  import { getSlackTypingPlaceholderService } from './services/slack/slack-typing-placeholder.service.js';
63
+ import { getSlackAutoWorkingService } from './services/slack/slack-auto-working.service.js';
63
64
  import { getSlackAgentDmService } from './services/slack/slack-agent-dm.service.js';
64
65
  import { sendBootAnnouncement, isFirstBoot, markBooted } from './services/boot/boot-announce.service.js';
65
66
  import { SubAgentMessageQueue } from './services/messaging/sub-agent-message-queue.service.js';
@@ -129,6 +130,7 @@ import { FissionGuardService, createFailOpenBudgetChecker } from './services/fis
129
130
  import { BudgetService } from './services/autonomous/budget.service.js';
130
131
  import { setFissionGuardService } from './controllers/fission/fission.controller.js';
131
132
  import { TaskPoolService } from './services/task-pool/task-pool.service.js';
133
+ import { PENDING_WORK_STATUSES } from './services/agent/idle-detection.service.js';
132
134
  import { WorkItemWorktreeService } from './services/worktree/workitem-worktree.service.js';
133
135
  import { WorkItemWorktreeSubscriber, createTerminalNotifier } from './services/worktree/workitem-worktree.subscriber.js';
134
136
  import { sessionsToRestore } from './services/agent/restore-filter.js';
@@ -1106,6 +1108,12 @@ export class CrewlyServer {
1106
1108
  if (event.type === 'agent:inactive' && event.sessionName) {
1107
1109
  this.wakeIfMessagesQueued(event.sessionName);
1108
1110
  }
1111
+ // A turn started: the harness's "working on it" watch may be waiting
1112
+ // for it (the ActivityMonitor tells it sooner; this covers other
1113
+ // busy sources). Repeats are harmless — a watch ends on first use.
1114
+ if (event.type === 'agent:busy' && event.sessionName) {
1115
+ getSlackAutoWorkingService()?.noteBusy(event.sessionName);
1116
+ }
1109
1117
  if (event.type === 'agent:idle' && event.sessionName) {
1110
1118
  try {
1111
1119
  const waitingThreads = this.threadStatusQueueService.getByStatus('replied_waiting_actions');
@@ -1687,6 +1695,12 @@ export class CrewlyServer {
1687
1695
  this.logger.info('Starting idle detection service...');
1688
1696
  const idleDetection = IdleDetectionService.getInstance();
1689
1697
  idleDetection.setAgentRegistrationService(this.apiController.agentRegistrationService);
1698
+ // An agent with work queued for it (e.g. a ticket just assigned to a
1699
+ // member that was started for it) is never idle-stopped.
1700
+ idleDetection.setPendingWorkCheck(async (sessionName) => {
1701
+ const items = await TaskPoolService.getInstance().getAllItems();
1702
+ return items.some((wi) => wi.target === sessionName && PENDING_WORK_STATUSES.has(wi.status));
1703
+ });
1690
1704
  idleDetection.start();
1691
1705
  // Wire OrchestratorRestartService with dependencies for auto-restart
1692
1706
  try {
@@ -1953,21 +1967,8 @@ export class CrewlyServer {
1953
1967
  const members = new Set(chatService.queryHuddleMembersForDispatch(channelId));
1954
1968
  if (members.size === 0)
1955
1969
  return null;
1956
- const teams = await this.storageService.getTeams();
1957
- const { resolveMemberSessionName } = await import('./utils/member-session-name.utils.js');
1958
- for (const team of teams) {
1959
- // An idle member has no stored sessionName (cleared on stop);
1960
- // match on the derived name or a stopped leader is invisible
1961
- // and the message is silently dropped (#claude-login, 2026-09-19).
1962
- const roster = (team.members ?? [])
1963
- .map((m) => ({ m, session: resolveMemberSessionName(team.name, m) }))
1964
- .filter(({ session }) => session && members.has(session));
1965
- if (roster.length === 0)
1966
- continue;
1967
- const leader = roster.find(({ m }) => m.role === 'team-leader') ?? roster[0];
1968
- return leader?.session ?? null;
1969
- }
1970
- return null;
1970
+ const { resolveHuddleLeader } = await import('./services/chat-v2/huddle-leader.js');
1971
+ return resolveHuddleLeader(await this.storageService.getTeams(), members);
1971
1972
  },
1972
1973
  // Activate-on-send: messaging an offline agent wakes it, then
1973
1974
  // the dispatcher retries delivery. User-initiated, so it uses