crewly 1.20.211 → 1.20.213

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 (205) hide show
  1. package/config/roles/orchestrator/prompt.md +1 -0
  2. package/config/skills/agent/core/send-message/SKILL.md +9 -0
  3. package/config/skills/orchestrator/delegate-task/SKILL.md +9 -0
  4. package/config/skills/orchestrator/get-team-status/SKILL.md +9 -0
  5. package/config/skills/orchestrator/get-team-status/execute.sh +5 -1
  6. package/config/skills/orchestrator/send-message/SKILL.md +9 -0
  7. package/config/skills/orchestrator/start-agent/SKILL.md +9 -0
  8. package/config/skills/orchestrator/start-team/SKILL.md +9 -0
  9. package/config/skills/team-leader/assign-ticket/SKILL.md +9 -0
  10. package/config/skills/team-leader/delegate-task/SKILL.md +9 -0
  11. package/dist/backend/backend/src/constants.d.ts +25 -0
  12. package/dist/backend/backend/src/constants.d.ts.map +1 -1
  13. package/dist/backend/backend/src/constants.js +25 -0
  14. package/dist/backend/backend/src/constants.js.map +1 -1
  15. package/dist/backend/backend/src/controllers/monitoring/terminal.controller.d.ts +12 -0
  16. package/dist/backend/backend/src/controllers/monitoring/terminal.controller.d.ts.map +1 -1
  17. package/dist/backend/backend/src/controllers/monitoring/terminal.controller.js +36 -1
  18. package/dist/backend/backend/src/controllers/monitoring/terminal.controller.js.map +1 -1
  19. package/dist/backend/backend/src/controllers/request-types.d.ts +10 -1
  20. package/dist/backend/backend/src/controllers/request-types.d.ts.map +1 -1
  21. package/dist/backend/backend/src/controllers/task-pool/task-pool.controller.d.ts +0 -36
  22. package/dist/backend/backend/src/controllers/task-pool/task-pool.controller.d.ts.map +1 -1
  23. package/dist/backend/backend/src/controllers/task-pool/task-pool.controller.js +41 -1
  24. package/dist/backend/backend/src/controllers/task-pool/task-pool.controller.js.map +1 -1
  25. package/dist/backend/backend/src/controllers/team/team-pause.controller.d.ts +59 -0
  26. package/dist/backend/backend/src/controllers/team/team-pause.controller.d.ts.map +1 -0
  27. package/dist/backend/backend/src/controllers/team/team-pause.controller.js +161 -0
  28. package/dist/backend/backend/src/controllers/team/team-pause.controller.js.map +1 -0
  29. package/dist/backend/backend/src/controllers/team/team.controller.d.ts +14 -0
  30. package/dist/backend/backend/src/controllers/team/team.controller.d.ts.map +1 -1
  31. package/dist/backend/backend/src/controllers/team/team.controller.js +78 -5
  32. package/dist/backend/backend/src/controllers/team/team.controller.js.map +1 -1
  33. package/dist/backend/backend/src/controllers/team/team.routes.d.ts.map +1 -1
  34. package/dist/backend/backend/src/controllers/team/team.routes.js +7 -1
  35. package/dist/backend/backend/src/controllers/team/team.routes.js.map +1 -1
  36. package/dist/backend/backend/src/index.d.ts.map +1 -1
  37. package/dist/backend/backend/src/index.js +18 -1
  38. package/dist/backend/backend/src/index.js.map +1 -1
  39. package/dist/backend/backend/src/models/Team.d.ts +5 -1
  40. package/dist/backend/backend/src/models/Team.d.ts.map +1 -1
  41. package/dist/backend/backend/src/models/Team.js +8 -0
  42. package/dist/backend/backend/src/models/Team.js.map +1 -1
  43. package/dist/backend/backend/src/services/agent/owner-stopped.registry.d.ts +7 -2
  44. package/dist/backend/backend/src/services/agent/owner-stopped.registry.d.ts.map +1 -1
  45. package/dist/backend/backend/src/services/agent/owner-stopped.registry.js +9 -3
  46. package/dist/backend/backend/src/services/agent/owner-stopped.registry.js.map +1 -1
  47. package/dist/backend/backend/src/services/chat-v2/chat-v2.dispatcher.service.d.ts.map +1 -1
  48. package/dist/backend/backend/src/services/chat-v2/chat-v2.dispatcher.service.js +14 -4
  49. package/dist/backend/backend/src/services/chat-v2/chat-v2.dispatcher.service.js.map +1 -1
  50. package/dist/backend/backend/src/services/chat-v2/chat-v2.service.d.ts.map +1 -1
  51. package/dist/backend/backend/src/services/chat-v2/chat-v2.service.js +3 -1
  52. package/dist/backend/backend/src/services/chat-v2/chat-v2.service.js.map +1 -1
  53. package/dist/backend/backend/src/services/chat-v2/ticket-line.utils.d.ts +29 -0
  54. package/dist/backend/backend/src/services/chat-v2/ticket-line.utils.d.ts.map +1 -0
  55. package/dist/backend/backend/src/services/chat-v2/ticket-line.utils.js +48 -0
  56. package/dist/backend/backend/src/services/chat-v2/ticket-line.utils.js.map +1 -0
  57. package/dist/backend/backend/src/services/cloud/conversation-cloud-sync.service.d.ts.map +1 -1
  58. package/dist/backend/backend/src/services/cloud/conversation-cloud-sync.service.js +3 -1
  59. package/dist/backend/backend/src/services/cloud/conversation-cloud-sync.service.js.map +1 -1
  60. package/dist/backend/backend/src/services/core/storage.service.d.ts.map +1 -1
  61. package/dist/backend/backend/src/services/core/storage.service.js +6 -0
  62. package/dist/backend/backend/src/services/core/storage.service.js.map +1 -1
  63. package/dist/backend/backend/src/services/messaging/owner-message-watchdog.wiring.d.ts.map +1 -1
  64. package/dist/backend/backend/src/services/messaging/owner-message-watchdog.wiring.js +6 -0
  65. package/dist/backend/backend/src/services/messaging/owner-message-watchdog.wiring.js.map +1 -1
  66. package/dist/backend/backend/src/services/project-tickets/project-ticket-workflow.service.d.ts +12 -0
  67. package/dist/backend/backend/src/services/project-tickets/project-ticket-workflow.service.d.ts.map +1 -1
  68. package/dist/backend/backend/src/services/project-tickets/project-ticket-workflow.service.js +59 -0
  69. package/dist/backend/backend/src/services/project-tickets/project-ticket-workflow.service.js.map +1 -1
  70. package/dist/backend/backend/src/services/project-tickets/ticket-autopilot.service.d.ts.map +1 -1
  71. package/dist/backend/backend/src/services/project-tickets/ticket-autopilot.service.js +12 -6
  72. package/dist/backend/backend/src/services/project-tickets/ticket-autopilot.service.js.map +1 -1
  73. package/dist/backend/backend/src/services/reconciler/reconcile-rules.d.ts.map +1 -1
  74. package/dist/backend/backend/src/services/reconciler/reconcile-rules.js +5 -0
  75. package/dist/backend/backend/src/services/reconciler/reconcile-rules.js.map +1 -1
  76. package/dist/backend/backend/src/services/reconciler/reconciler.service.d.ts.map +1 -1
  77. package/dist/backend/backend/src/services/reconciler/reconciler.service.js +4 -0
  78. package/dist/backend/backend/src/services/reconciler/reconciler.service.js.map +1 -1
  79. package/dist/backend/backend/src/services/slack/slack-agent-dm.service.d.ts.map +1 -1
  80. package/dist/backend/backend/src/services/slack/slack-agent-dm.service.js +22 -0
  81. package/dist/backend/backend/src/services/slack/slack-agent-dm.service.js.map +1 -1
  82. package/dist/backend/backend/src/services/slack/slack-channel-members.d.ts +27 -0
  83. package/dist/backend/backend/src/services/slack/slack-channel-members.d.ts.map +1 -0
  84. package/dist/backend/backend/src/services/slack/slack-channel-members.js +54 -0
  85. package/dist/backend/backend/src/services/slack/slack-channel-members.js.map +1 -0
  86. package/dist/backend/backend/src/services/slack/slack-directory.service.d.ts.map +1 -1
  87. package/dist/backend/backend/src/services/slack/slack-directory.service.js +7 -2
  88. package/dist/backend/backend/src/services/slack/slack-directory.service.js.map +1 -1
  89. package/dist/backend/backend/src/services/slack/slack-initializer.d.ts.map +1 -1
  90. package/dist/backend/backend/src/services/slack/slack-initializer.js +3 -0
  91. package/dist/backend/backend/src/services/slack/slack-initializer.js.map +1 -1
  92. package/dist/backend/backend/src/services/slack/slack-orchestrator-bridge.d.ts +12 -1
  93. package/dist/backend/backend/src/services/slack/slack-orchestrator-bridge.d.ts.map +1 -1
  94. package/dist/backend/backend/src/services/slack/slack-orchestrator-bridge.js +57 -16
  95. package/dist/backend/backend/src/services/slack/slack-orchestrator-bridge.js.map +1 -1
  96. package/dist/backend/backend/src/services/slack/slack-team-channel.service.d.ts +48 -0
  97. package/dist/backend/backend/src/services/slack/slack-team-channel.service.d.ts.map +1 -1
  98. package/dist/backend/backend/src/services/slack/slack-team-channel.service.js +155 -4
  99. package/dist/backend/backend/src/services/slack/slack-team-channel.service.js.map +1 -1
  100. package/dist/backend/backend/src/services/task-pool/task-pool.service.d.ts +11 -0
  101. package/dist/backend/backend/src/services/task-pool/task-pool.service.d.ts.map +1 -1
  102. package/dist/backend/backend/src/services/task-pool/task-pool.service.js +36 -1
  103. package/dist/backend/backend/src/services/task-pool/task-pool.service.js.map +1 -1
  104. package/dist/backend/backend/src/services/task-pool/untargeted-router.d.ts.map +1 -1
  105. package/dist/backend/backend/src/services/task-pool/untargeted-router.js +14 -6
  106. package/dist/backend/backend/src/services/task-pool/untargeted-router.js.map +1 -1
  107. package/dist/backend/backend/src/services/team/team-pause-command.d.ts +97 -0
  108. package/dist/backend/backend/src/services/team/team-pause-command.d.ts.map +1 -0
  109. package/dist/backend/backend/src/services/team/team-pause-command.js +177 -0
  110. package/dist/backend/backend/src/services/team/team-pause-command.js.map +1 -0
  111. package/dist/backend/backend/src/services/team/team-pause-notice.d.ts +43 -0
  112. package/dist/backend/backend/src/services/team/team-pause-notice.d.ts.map +1 -0
  113. package/dist/backend/backend/src/services/team/team-pause-notice.js +61 -0
  114. package/dist/backend/backend/src/services/team/team-pause-notice.js.map +1 -0
  115. package/dist/backend/backend/src/services/team/team-pause.registry.d.ts +167 -0
  116. package/dist/backend/backend/src/services/team/team-pause.registry.d.ts.map +1 -0
  117. package/dist/backend/backend/src/services/team/team-pause.registry.js +263 -0
  118. package/dist/backend/backend/src/services/team/team-pause.registry.js.map +1 -0
  119. package/dist/backend/backend/src/services/team/team-pause.service.d.ts +172 -0
  120. package/dist/backend/backend/src/services/team/team-pause.service.d.ts.map +1 -0
  121. package/dist/backend/backend/src/services/team/team-pause.service.js +254 -0
  122. package/dist/backend/backend/src/services/team/team-pause.service.js.map +1 -0
  123. package/dist/backend/backend/src/services/team/team-pause.wiring.d.ts +30 -0
  124. package/dist/backend/backend/src/services/team/team-pause.wiring.d.ts.map +1 -0
  125. package/dist/backend/backend/src/services/team/team-pause.wiring.js +48 -0
  126. package/dist/backend/backend/src/services/team/team-pause.wiring.js.map +1 -0
  127. package/dist/backend/backend/src/services/v3/agent-auto-claim.service.d.ts.map +1 -1
  128. package/dist/backend/backend/src/services/v3/agent-auto-claim.service.js +11 -0
  129. package/dist/backend/backend/src/services/v3/agent-auto-claim.service.js.map +1 -1
  130. package/dist/backend/backend/src/services/v3/trigger-engine.service.d.ts +9 -0
  131. package/dist/backend/backend/src/services/v3/trigger-engine.service.d.ts.map +1 -1
  132. package/dist/backend/backend/src/services/v3/trigger-engine.service.js +27 -2
  133. package/dist/backend/backend/src/services/v3/trigger-engine.service.js.map +1 -1
  134. package/dist/backend/backend/src/services/v3/workitem-dispatch.subscriber.d.ts.map +1 -1
  135. package/dist/backend/backend/src/services/v3/workitem-dispatch.subscriber.js +7 -0
  136. package/dist/backend/backend/src/services/v3/workitem-dispatch.subscriber.js.map +1 -1
  137. package/dist/backend/backend/src/services/workflow/cron-task.service.d.ts.map +1 -1
  138. package/dist/backend/backend/src/services/workflow/cron-task.service.js +14 -0
  139. package/dist/backend/backend/src/services/workflow/cron-task.service.js.map +1 -1
  140. package/dist/backend/backend/src/services/workflow/message-scheduler.service.d.ts.map +1 -1
  141. package/dist/backend/backend/src/services/workflow/message-scheduler.service.js +5 -0
  142. package/dist/backend/backend/src/services/workflow/message-scheduler.service.js.map +1 -1
  143. package/dist/backend/backend/src/services/workflow/scheduler.service.d.ts.map +1 -1
  144. package/dist/backend/backend/src/services/workflow/scheduler.service.js +6 -0
  145. package/dist/backend/backend/src/services/workflow/scheduler.service.js.map +1 -1
  146. package/dist/backend/backend/src/types/index.d.ts +22 -0
  147. package/dist/backend/backend/src/types/index.d.ts.map +1 -1
  148. package/dist/backend/backend/src/types/index.js.map +1 -1
  149. package/dist/backend/build-info.json +2 -2
  150. package/dist/cli/backend/src/constants.d.ts +25 -0
  151. package/dist/cli/backend/src/constants.d.ts.map +1 -1
  152. package/dist/cli/backend/src/constants.js +25 -0
  153. package/dist/cli/backend/src/constants.js.map +1 -1
  154. package/dist/cli/backend/src/models/Team.d.ts +5 -1
  155. package/dist/cli/backend/src/models/Team.d.ts.map +1 -1
  156. package/dist/cli/backend/src/models/Team.js +8 -0
  157. package/dist/cli/backend/src/models/Team.js.map +1 -1
  158. package/dist/cli/backend/src/services/chat-v2/chat-v2.dispatcher.service.d.ts.map +1 -1
  159. package/dist/cli/backend/src/services/chat-v2/chat-v2.dispatcher.service.js +14 -4
  160. package/dist/cli/backend/src/services/chat-v2/chat-v2.dispatcher.service.js.map +1 -1
  161. package/dist/cli/backend/src/services/chat-v2/chat-v2.service.d.ts.map +1 -1
  162. package/dist/cli/backend/src/services/chat-v2/chat-v2.service.js +3 -1
  163. package/dist/cli/backend/src/services/chat-v2/chat-v2.service.js.map +1 -1
  164. package/dist/cli/backend/src/services/chat-v2/ticket-line.utils.d.ts +29 -0
  165. package/dist/cli/backend/src/services/chat-v2/ticket-line.utils.d.ts.map +1 -0
  166. package/dist/cli/backend/src/services/chat-v2/ticket-line.utils.js +48 -0
  167. package/dist/cli/backend/src/services/chat-v2/ticket-line.utils.js.map +1 -0
  168. package/dist/cli/backend/src/services/core/storage.service.d.ts.map +1 -1
  169. package/dist/cli/backend/src/services/core/storage.service.js +6 -0
  170. package/dist/cli/backend/src/services/core/storage.service.js.map +1 -1
  171. package/dist/cli/backend/src/services/slack/slack-agent-dm.service.d.ts.map +1 -1
  172. package/dist/cli/backend/src/services/slack/slack-agent-dm.service.js +22 -0
  173. package/dist/cli/backend/src/services/slack/slack-agent-dm.service.js.map +1 -1
  174. package/dist/cli/backend/src/services/slack/slack-directory.service.d.ts.map +1 -1
  175. package/dist/cli/backend/src/services/slack/slack-directory.service.js +7 -2
  176. package/dist/cli/backend/src/services/slack/slack-directory.service.js.map +1 -1
  177. package/dist/cli/backend/src/services/slack/slack-orchestrator-bridge.d.ts +12 -1
  178. package/dist/cli/backend/src/services/slack/slack-orchestrator-bridge.d.ts.map +1 -1
  179. package/dist/cli/backend/src/services/slack/slack-orchestrator-bridge.js +57 -16
  180. package/dist/cli/backend/src/services/slack/slack-orchestrator-bridge.js.map +1 -1
  181. package/dist/cli/backend/src/services/slack/slack-team-channel.service.d.ts +48 -0
  182. package/dist/cli/backend/src/services/slack/slack-team-channel.service.d.ts.map +1 -1
  183. package/dist/cli/backend/src/services/slack/slack-team-channel.service.js +155 -4
  184. package/dist/cli/backend/src/services/slack/slack-team-channel.service.js.map +1 -1
  185. package/dist/cli/backend/src/services/task-pool/task-pool.service.d.ts +11 -0
  186. package/dist/cli/backend/src/services/task-pool/task-pool.service.d.ts.map +1 -1
  187. package/dist/cli/backend/src/services/task-pool/task-pool.service.js +36 -1
  188. package/dist/cli/backend/src/services/task-pool/task-pool.service.js.map +1 -1
  189. package/dist/cli/backend/src/services/team/team-pause-notice.d.ts +43 -0
  190. package/dist/cli/backend/src/services/team/team-pause-notice.d.ts.map +1 -0
  191. package/dist/cli/backend/src/services/team/team-pause-notice.js +61 -0
  192. package/dist/cli/backend/src/services/team/team-pause-notice.js.map +1 -0
  193. package/dist/cli/backend/src/services/team/team-pause.registry.d.ts +167 -0
  194. package/dist/cli/backend/src/services/team/team-pause.registry.d.ts.map +1 -0
  195. package/dist/cli/backend/src/services/team/team-pause.registry.js +263 -0
  196. package/dist/cli/backend/src/services/team/team-pause.registry.js.map +1 -0
  197. package/dist/cli/backend/src/services/workflow/cron-task.service.d.ts.map +1 -1
  198. package/dist/cli/backend/src/services/workflow/cron-task.service.js +14 -0
  199. package/dist/cli/backend/src/services/workflow/cron-task.service.js.map +1 -1
  200. package/dist/cli/backend/src/types/index.d.ts +22 -0
  201. package/dist/cli/backend/src/types/index.d.ts.map +1 -1
  202. package/dist/cli/backend/src/types/index.js.map +1 -1
  203. package/frontend/dist/assets/{index-f64b333a.js → index-917db1b8.js} +279 -279
  204. package/frontend/dist/index.html +1 -1
  205. package/package.json +1 -1
@@ -0,0 +1,263 @@
1
+ /**
2
+ * Paused teams — the in-memory index every automation path consults
3
+ * (specs/2026-10-04-team-pause.md).
4
+ *
5
+ * The pause itself is stored on the team (`Team.paused`, persisted in the
6
+ * team's config.json), so it survives restarts. This module keeps a
7
+ * synchronous index of it — team id → pause, and every session name a
8
+ * member of a paused team may run under → team — because most of the gates
9
+ * (the reconciler's wake rule, the queued-message wake, the dispatcher's
10
+ * target planning) only have a session name and must not await storage.
11
+ *
12
+ * The index is rebuilt from storage: {@link syncPausedTeams} runs on every
13
+ * `StorageService.getTeams()` read and at boot, and {@link notePausedTeam}
14
+ * on every save. A pause whose `until` has passed counts as resumed at once,
15
+ * before the auto-resume sweep clears it from storage.
16
+ *
17
+ * Module-level and dependency-free (types and two utils only), so the team
18
+ * controller, the storage service and the services can share it without
19
+ * import cycles.
20
+ *
21
+ * @module services/team/team-pause.registry
22
+ */
23
+ import { deriveMemberSessionName } from '../../utils/member-session-name.utils.js';
24
+ const pausedTeams = new Map();
25
+ const teamOfSession = new Map();
26
+ /** Every known team (id → name, archived), for the owner's Slack commands */
27
+ const knownTeams = new Map();
28
+ /**
29
+ * Whether a pause is in force at `now` (set, and its `until` not reached).
30
+ *
31
+ * @param pause - The team's pause, if any
32
+ * @param now - Clock (ms)
33
+ * @returns True while paused
34
+ *
35
+ * @example
36
+ * isPauseActive({ pausedAt: '…', by: 'owner', until: '2099-01-01T00:00:00Z' }) // true
37
+ */
38
+ export function isPauseActive(pause, now = Date.now()) {
39
+ if (!pause || !pause.pausedAt)
40
+ return false;
41
+ if (!pause.until)
42
+ return true;
43
+ const until = Date.parse(pause.until);
44
+ return Number.isNaN(until) || until > now;
45
+ }
46
+ /**
47
+ * Whether a team object is paused now. Prefer this where the team is at
48
+ * hand: it reads the team itself, not the index.
49
+ *
50
+ * @param team - Team (only `paused` is read)
51
+ * @param now - Clock (ms)
52
+ * @returns True while paused
53
+ */
54
+ export function isTeamPausedNow(team, now = Date.now()) {
55
+ return isPauseActive(team?.paused, now);
56
+ }
57
+ /**
58
+ * Every session name a member may run under: its live session, its
59
+ * permanent agent id, and the name the controller derives on start.
60
+ *
61
+ * @param teamName - Team display name
62
+ * @param member - Member
63
+ * @returns Distinct, non-empty session names
64
+ */
65
+ export function memberSessionKeys(teamName, member) {
66
+ const keys = [member.sessionName, member.agentId, member.id ? deriveMemberSessionName(teamName, member.name, member.id) : undefined];
67
+ return [...new Set(keys.filter((k) => typeof k === 'string' && k.length > 0))];
68
+ }
69
+ /**
70
+ * Build the index entry for a team (whether or not it is paused).
71
+ *
72
+ * @param team - Team with a pause
73
+ * @returns Entry
74
+ */
75
+ function entryOf(team) {
76
+ const sessions = new Set();
77
+ for (const m of team.members ?? [])
78
+ for (const k of memberSessionKeys(team.name, m))
79
+ sessions.add(k);
80
+ return {
81
+ teamId: team.id,
82
+ teamName: team.name || team.id,
83
+ ...(team.issueRepo ? { issueRepo: team.issueRepo } : {}),
84
+ pause: team.paused,
85
+ sessions: [...sessions],
86
+ memberNames: (team.members ?? []).map((m) => m.name).filter(Boolean),
87
+ };
88
+ }
89
+ /**
90
+ * Remove a team from the index.
91
+ *
92
+ * @param teamId - Team
93
+ */
94
+ function forget(teamId) {
95
+ const prev = pausedTeams.get(teamId);
96
+ if (!prev)
97
+ return;
98
+ for (const s of prev.sessions)
99
+ if (teamOfSession.get(s) === teamId)
100
+ teamOfSession.delete(s);
101
+ pausedTeams.delete(teamId);
102
+ }
103
+ /**
104
+ * Update the index for one team (after a save). A team that is not paused
105
+ * is removed from it.
106
+ *
107
+ * @param team - The saved team
108
+ */
109
+ export function notePausedTeam(team) {
110
+ if (!team?.id)
111
+ return;
112
+ knownTeams.set(team.id, { name: team.name || team.id, archived: !!team.archived });
113
+ forget(team.id);
114
+ if (!team.paused)
115
+ return;
116
+ const entry = entryOf(team);
117
+ pausedTeams.set(team.id, entry);
118
+ for (const s of entry.sessions)
119
+ teamOfSession.set(s, team.id);
120
+ }
121
+ /**
122
+ * Forget a deleted team.
123
+ *
124
+ * @param teamId - Deleted team
125
+ */
126
+ export function noteTeamDeleted(teamId) {
127
+ forget(teamId);
128
+ knownTeams.delete(teamId);
129
+ }
130
+ /**
131
+ * Every team the index has seen (id and name), archived ones excluded.
132
+ *
133
+ * @returns Teams
134
+ */
135
+ export function listKnownTeams() {
136
+ return [...knownTeams.entries()].filter(([, t]) => !t.archived).map(([id, t]) => ({ id, name: t.name }));
137
+ }
138
+ /**
139
+ * Rebuild the index from a full team list (a storage read, boot).
140
+ *
141
+ * @param teams - Every stored team
142
+ */
143
+ export function syncPausedTeams(teams) {
144
+ pausedTeams.clear();
145
+ teamOfSession.clear();
146
+ knownTeams.clear();
147
+ for (const team of teams)
148
+ notePausedTeam(team);
149
+ }
150
+ /**
151
+ * The paused team with this id, if its pause is in force.
152
+ *
153
+ * @param teamId - Team id
154
+ * @param now - Clock (ms)
155
+ * @returns Info, or null
156
+ */
157
+ export function pausedTeamById(teamId, now = Date.now()) {
158
+ if (!teamId)
159
+ return null;
160
+ const entry = pausedTeams.get(teamId);
161
+ return entry && isPauseActive(entry.pause, now) ? entry : null;
162
+ }
163
+ /**
164
+ * Whether the team with this id is paused now.
165
+ *
166
+ * @param teamId - Team id
167
+ * @returns True while paused
168
+ */
169
+ export function isTeamIdPaused(teamId) {
170
+ return pausedTeamById(teamId) !== null;
171
+ }
172
+ /**
173
+ * The paused team a session belongs to, if its pause is in force.
174
+ *
175
+ * @param session - Agent session (or agent id)
176
+ * @param now - Clock (ms)
177
+ * @returns Info, or null
178
+ */
179
+ export function pausedTeamOfSession(session, now = Date.now()) {
180
+ if (!session)
181
+ return null;
182
+ const teamId = teamOfSession.get(session);
183
+ return teamId ? pausedTeamById(teamId, now) : null;
184
+ }
185
+ /**
186
+ * Whether a session belongs to a paused team.
187
+ *
188
+ * @param session - Agent session (or agent id)
189
+ * @returns True while its team is paused
190
+ *
191
+ * @example
192
+ * if (isSessionPaused(wi.target)) return false; // do not dispatch
193
+ */
194
+ export function isSessionPaused(session) {
195
+ return pausedTeamOfSession(session) !== null;
196
+ }
197
+ /**
198
+ * The paused team named by an id, a name (case-insensitive) or a member
199
+ * session — whatever an agent typed.
200
+ *
201
+ * @param ref - Team id, team name, or member session
202
+ * @returns Info, or null
203
+ */
204
+ export function pausedTeamByRef(ref) {
205
+ if (!ref)
206
+ return null;
207
+ const byId = pausedTeamById(ref) ?? pausedTeamOfSession(ref);
208
+ if (byId)
209
+ return byId;
210
+ const want = ref.trim().toLowerCase();
211
+ for (const entry of pausedTeams.values()) {
212
+ if (entry.teamName.toLowerCase() === want && isPauseActive(entry.pause))
213
+ return entry;
214
+ }
215
+ return null;
216
+ }
217
+ /**
218
+ * Every team paused now.
219
+ *
220
+ * @param now - Clock (ms)
221
+ * @returns Infos
222
+ */
223
+ export function listPausedTeams(now = Date.now()) {
224
+ return [...pausedTeams.values()].filter((e) => isPauseActive(e.pause, now));
225
+ }
226
+ /**
227
+ * Teams whose pause has an `until` that has passed (still stored as paused).
228
+ *
229
+ * @param now - Clock (ms)
230
+ * @returns Infos due for auto-resume
231
+ */
232
+ export function listExpiredPauses(now = Date.now()) {
233
+ return [...pausedTeams.values()].filter((e) => !isPauseActive(e.pause, now));
234
+ }
235
+ /**
236
+ * The refusal an agent gets when it targets a paused team (English: harness
237
+ * text rule).
238
+ *
239
+ * @param info - The paused team
240
+ * @param options - `callerIsOrc`: the orchestrator asked (it tells the owner, not itself)
241
+ * @returns Message
242
+ *
243
+ * @example
244
+ * pausedRefusalMessage({ teamName: 'Crewly', issueRepo: 'stevehuang0115/crewly' })
245
+ * // 'Crewly is paused by the owner. File a GitHub issue instead: `gh issue create -R stevehuang0115/crewly --title "…" --body "…"`'
246
+ */
247
+ export function pausedRefusalMessage(info, options = {}) {
248
+ const until = info.pause?.until ? ` until ${info.pause.until}` : '';
249
+ const head = `${info.teamName} is paused by the owner${until}.`;
250
+ if (info.issueRepo) {
251
+ return `${head} File a GitHub issue instead: \`gh issue create -R ${info.issueRepo} --title "<short title>" --body "<what is needed and why>"\``;
252
+ }
253
+ return options.callerIsOrc
254
+ ? `${head} Do not hand it work or wake it. If this cannot wait until the owner resumes it, tell the owner.`
255
+ : `${head} Do not hand it work. Tell the orc what you need instead.`;
256
+ }
257
+ /** Clear the index (tests only). */
258
+ export function resetTeamPauseRegistryForTesting() {
259
+ pausedTeams.clear();
260
+ teamOfSession.clear();
261
+ knownTeams.clear();
262
+ }
263
+ //# sourceMappingURL=team-pause.registry.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"team-pause.registry.js","sourceRoot":"","sources":["../../../../../../backend/src/services/team/team-pause.registry.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,172 @@
1
+ /**
2
+ * Pause and resume a team (specs/2026-10-04-team-pause.md).
3
+ *
4
+ * The owner pauses a team — from the dashboard, the API or a DM to the orc —
5
+ * when its work is handled elsewhere for a while (the Crewly product team
6
+ * while a separate harness session works on the harness). While paused:
7
+ *
8
+ * - its members are not started by automation (the start path refuses
9
+ * unless the owner asks), and automation does not route work to it;
10
+ * - other agents do not see it, and an agent that targets it is told to
11
+ * file a GitHub issue (or tell the orc) instead.
12
+ *
13
+ * Pausing stores `Team.paused`, stops the running members the way stop-team
14
+ * does, and unassigns work that has not started: queued WorkItems go back to
15
+ * the unassigned pool (the router picks a decider that is not paused), and
16
+ * backlog / ready tickets lose their assignee. Running work stays where it
17
+ * is, for the owner to see. Resuming clears the pause; an `until` time
18
+ * resumes the team by itself ({@link TeamPauseService.sweepExpired}).
19
+ *
20
+ * @module services/team/team-pause.service
21
+ */
22
+ import type { Team, TeamMember } from '../../types/index.js';
23
+ /** A refused pause / resume (HTTP status + English message). */
24
+ export declare class TeamPauseError extends Error {
25
+ readonly status: number;
26
+ /**
27
+ * @param status - HTTP status (400 bad input, 404 unknown team)
28
+ * @param message - Reason
29
+ */
30
+ constructor(status: number, message: string);
31
+ }
32
+ /** Pause options. */
33
+ export interface PauseTeamInput {
34
+ reason?: string;
35
+ /** ISO time (or anything `Date.parse` reads) the pause ends by itself */
36
+ until?: string;
37
+ }
38
+ /** What a pause did. */
39
+ export interface PauseTeamOutcome {
40
+ team: Team;
41
+ /** The team was already paused (reason / until updated) */
42
+ alreadyPaused: boolean;
43
+ /** Members whose running session was stopped */
44
+ stopped: string[];
45
+ /** Members whose session could not be stopped */
46
+ stopFailed: Array<{
47
+ member: string;
48
+ error: string;
49
+ }>;
50
+ /** Queued WorkItems unassigned */
51
+ releasedWorkItems: string[];
52
+ /** Tickets unassigned (or put back to ready) */
53
+ releasedTickets: string[];
54
+ }
55
+ /** What a resume did. */
56
+ export interface ResumeTeamOutcome {
57
+ team: Team;
58
+ /** The team was not paused */
59
+ wasPaused: boolean;
60
+ /** The pause ran out (`until`), not an owner action */
61
+ auto: boolean;
62
+ }
63
+ /** Collaborators. */
64
+ export interface TeamPauseServiceDeps {
65
+ storage: {
66
+ getTeams(): Promise<Team[]>;
67
+ saveTeam(team: Team): Promise<void>;
68
+ };
69
+ /** Stop one member's running session, the way stop-team does */
70
+ stopMember: (team: Team, member: TeamMember) => Promise<{
71
+ success: boolean;
72
+ error?: string;
73
+ }>;
74
+ /** Unassign queued (unstarted) WorkItems targeting these sessions; returns their ids */
75
+ releaseWorkItems?: (sessions: ReadonlySet<string>, team: Team) => Promise<string[]>;
76
+ /** Unassign unstarted tickets assigned to these sessions; returns `<project>/<id>` refs */
77
+ releaseTickets?: (sessions: ReadonlySet<string>, team: Team) => Promise<string[]>;
78
+ /** Tell the owner (auto-resume); best effort */
79
+ notifyOwner?: (text: string) => Promise<unknown>;
80
+ logger?: {
81
+ info(msg: string, meta?: Record<string, unknown>): void;
82
+ warn(msg: string, meta?: Record<string, unknown>): void;
83
+ };
84
+ now?: () => number;
85
+ }
86
+ /**
87
+ * Find a team by id, by name (case-insensitive), or by a unique name prefix.
88
+ *
89
+ * @param teams - Every team
90
+ * @param ref - What the owner typed
91
+ * @returns The team, or null
92
+ */
93
+ export declare function findTeamByRef(teams: readonly Team[], ref: string): Team | null;
94
+ /**
95
+ * Every session name a team's members may run under.
96
+ *
97
+ * @param team - Team
98
+ * @returns Sessions
99
+ */
100
+ export declare function teamSessionKeys(team: Team): Set<string>;
101
+ /** The team pause service. */
102
+ export declare class TeamPauseService {
103
+ private readonly deps;
104
+ private timer;
105
+ /**
106
+ * @param deps - Collaborators
107
+ */
108
+ constructor(deps: TeamPauseServiceDeps);
109
+ /**
110
+ * Resolve a team reference or throw 404.
111
+ *
112
+ * @param ref - Team id or name
113
+ * @returns The stored team
114
+ */
115
+ resolveTeam(ref: string): Promise<Team>;
116
+ /**
117
+ * Pause a team: store the pause, stop its running members, unassign its
118
+ * unstarted work. Pausing a paused team updates its reason / until.
119
+ *
120
+ * @param ref - Team id or name
121
+ * @param input - Reason and until
122
+ * @returns What was done
123
+ * @throws TeamPauseError on bad input or an unknown team
124
+ */
125
+ pause(ref: string, input?: PauseTeamInput): Promise<PauseTeamOutcome>;
126
+ /**
127
+ * Resume a team. Its members are not started: they start when there is
128
+ * work for them or the owner starts them, as before the pause.
129
+ *
130
+ * @param ref - Team id or name
131
+ * @param options - `auto`: the pause ran out
132
+ * @returns What was done
133
+ * @throws TeamPauseError(404) for an unknown team
134
+ */
135
+ resume(ref: string, options?: {
136
+ auto?: boolean;
137
+ }): Promise<ResumeTeamOutcome>;
138
+ /**
139
+ * Resume every team whose `until` has passed, and tell the owner.
140
+ *
141
+ * @returns Names of the teams resumed
142
+ */
143
+ sweepExpired(): Promise<string[]>;
144
+ /** Start the auto-resume sweep (runs once now, then every minute). */
145
+ start(): void;
146
+ /** Stop the sweep. */
147
+ stop(): void;
148
+ /**
149
+ * Run one release step; a failure is logged, never thrown.
150
+ *
151
+ * @param what - For the log
152
+ * @param fn - The step
153
+ * @param team - Team
154
+ * @returns Released ids
155
+ */
156
+ private release;
157
+ /** @returns Clock (ms) */
158
+ private now;
159
+ }
160
+ /**
161
+ * The wired service.
162
+ *
163
+ * @returns Service, or null before the server wired it
164
+ */
165
+ export declare function getTeamPauseService(): TeamPauseService | null;
166
+ /**
167
+ * Install (or clear) the service.
168
+ *
169
+ * @param service - Service, null to clear (tests)
170
+ */
171
+ export declare function setTeamPauseService(service: TeamPauseService | null): void;
172
+ //# sourceMappingURL=team-pause.service.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"team-pause.service.d.ts","sourceRoot":"","sources":["../../../../../../backend/src/services/team/team-pause.service.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;GAoBG;AAEH,OAAO,KAAK,EAAE,IAAI,EAAE,UAAU,EAAkB,MAAM,sBAAsB,CAAC;AAK7E,gEAAgE;AAChE,qBAAa,cAAe,SAAQ,KAAK;IAMvC,QAAQ,CAAC,MAAM,EAAE,MAAM;IALxB;;;OAGG;gBAEO,MAAM,EAAE,MAAM,EACvB,OAAO,EAAE,MAAM;CAKhB;AAED,qBAAqB;AACrB,MAAM,WAAW,cAAc;IAC9B,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,yEAAyE;IACzE,KAAK,CAAC,EAAE,MAAM,CAAC;CACf;AAED,wBAAwB;AACxB,MAAM,WAAW,gBAAgB;IAChC,IAAI,EAAE,IAAI,CAAC;IACX,2DAA2D;IAC3D,aAAa,EAAE,OAAO,CAAC;IACvB,gDAAgD;IAChD,OAAO,EAAE,MAAM,EAAE,CAAC;IAClB,iDAAiD;IACjD,UAAU,EAAE,KAAK,CAAC;QAAE,MAAM,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IACrD,kCAAkC;IAClC,iBAAiB,EAAE,MAAM,EAAE,CAAC;IAC5B,gDAAgD;IAChD,eAAe,EAAE,MAAM,EAAE,CAAC;CAC1B;AAED,yBAAyB;AACzB,MAAM,WAAW,iBAAiB;IACjC,IAAI,EAAE,IAAI,CAAC;IACX,8BAA8B;IAC9B,SAAS,EAAE,OAAO,CAAC;IACnB,uDAAuD;IACvD,IAAI,EAAE,OAAO,CAAC;CACd;AAED,qBAAqB;AACrB,MAAM,WAAW,oBAAoB;IACpC,OAAO,EAAE;QAAE,QAAQ,IAAI,OAAO,CAAC,IAAI,EAAE,CAAC,CAAC;QAAC,QAAQ,CAAC,IAAI,EAAE,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAA;KAAE,CAAC;IAC9E,gEAAgE;IAChE,UAAU,EAAE,CAAC,IAAI,EAAE,IAAI,EAAE,MAAM,EAAE,UAAU,KAAK,OAAO,CAAC;QAAE,OAAO,EAAE,OAAO,CAAC;QAAC,KAAK,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IAC9F,wFAAwF;IACxF,gBAAgB,CAAC,EAAE,CAAC,QAAQ,EAAE,WAAW,CAAC,MAAM,CAAC,EAAE,IAAI,EAAE,IAAI,KAAK,OAAO,CAAC,MAAM,EAAE,CAAC,CAAC;IACpF,2FAA2F;IAC3F,cAAc,CAAC,EAAE,CAAC,QAAQ,EAAE,WAAW,CAAC,MAAM,CAAC,EAAE,IAAI,EAAE,IAAI,KAAK,OAAO,CAAC,MAAM,EAAE,CAAC,CAAC;IAClF,gDAAgD;IAChD,WAAW,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,OAAO,CAAC,OAAO,CAAC,CAAC;IACjD,MAAM,CAAC,EAAE;QAAE,IAAI,CAAC,GAAG,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI,CAAC;QAAC,IAAI,CAAC,GAAG,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI,CAAA;KAAE,CAAC;IAC9H,GAAG,CAAC,EAAE,MAAM,MAAM,CAAC;CACnB;AAED;;;;;;GAMG;AACH,wBAAgB,aAAa,CAAC,KAAK,EAAE,SAAS,IAAI,EAAE,EAAE,GAAG,EAAE,MAAM,GAAG,IAAI,GAAG,IAAI,CAW9E;AAED;;;;;GAKG;AACH,wBAAgB,eAAe,CAAC,IAAI,EAAE,IAAI,GAAG,GAAG,CAAC,MAAM,CAAC,CAIvD;AAED,8BAA8B;AAC9B,qBAAa,gBAAgB;IAMhB,OAAO,CAAC,QAAQ,CAAC,IAAI;IALjC,OAAO,CAAC,KAAK,CAA+C;IAE5D;;OAEG;gBAC0B,IAAI,EAAE,oBAAoB;IAEvD;;;;;OAKG;IACG,WAAW,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAO7C;;;;;;;;OAQG;IACG,KAAK,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,GAAE,cAAmB,GAAG,OAAO,CAAC,gBAAgB,CAAC;IAgD/E;;;;;;;;OAQG;IACG,MAAM,CAAC,GAAG,EAAE,MAAM,EAAE,OAAO,GAAE;QAAE,IAAI,CAAC,EAAE,OAAO,CAAA;KAAO,GAAG,OAAO,CAAC,iBAAiB,CAAC;IAevF;;;;OAIG;IACG,YAAY,IAAI,OAAO,CAAC,MAAM,EAAE,CAAC;IAkBvC,sEAAsE;IACtE,KAAK,IAAI,IAAI;IAOb,sBAAsB;IACtB,IAAI,IAAI,IAAI;IAKZ;;;;;;;OAOG;YACW,OAAO;IASrB,0BAA0B;IAC1B,OAAO,CAAC,GAAG;CAGX;AAID;;;;GAIG;AACH,wBAAgB,mBAAmB,IAAI,gBAAgB,GAAG,IAAI,CAE7D;AAED;;;;GAIG;AACH,wBAAgB,mBAAmB,CAAC,OAAO,EAAE,gBAAgB,GAAG,IAAI,GAAG,IAAI,CAG1E"}