crewly 1.20.210 → 1.20.212

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 (246) hide show
  1. package/config/roles/orchestrator/prompt.md +1 -0
  2. package/config/skills/agent/core/app-data/SKILL.md +30 -1
  3. package/config/skills/agent/core/publish-app/SKILL.md +73 -6
  4. package/config/skills/agent/core/publish-app/execute.sh +125 -4
  5. package/config/skills/agent/core/publish-app/execute.test.sh +95 -4
  6. package/config/skills/agent/core/send-message/SKILL.md +9 -0
  7. package/config/skills/orchestrator/delegate-task/SKILL.md +9 -0
  8. package/config/skills/orchestrator/get-team-status/SKILL.md +9 -0
  9. package/config/skills/orchestrator/get-team-status/execute.sh +5 -1
  10. package/config/skills/orchestrator/send-message/SKILL.md +9 -0
  11. package/config/skills/orchestrator/start-agent/SKILL.md +9 -0
  12. package/config/skills/orchestrator/start-team/SKILL.md +9 -0
  13. package/config/skills/team-leader/assign-ticket/SKILL.md +9 -0
  14. package/config/skills/team-leader/delegate-task/SKILL.md +9 -0
  15. package/dist/backend/backend/src/constants.d.ts +78 -0
  16. package/dist/backend/backend/src/constants.d.ts.map +1 -1
  17. package/dist/backend/backend/src/constants.js +78 -0
  18. package/dist/backend/backend/src/constants.js.map +1 -1
  19. package/dist/backend/backend/src/controllers/apps/apps.controller.d.ts +17 -1
  20. package/dist/backend/backend/src/controllers/apps/apps.controller.d.ts.map +1 -1
  21. package/dist/backend/backend/src/controllers/apps/apps.controller.js +45 -8
  22. package/dist/backend/backend/src/controllers/apps/apps.controller.js.map +1 -1
  23. package/dist/backend/backend/src/controllers/apps/apps.routes.d.ts +7 -0
  24. package/dist/backend/backend/src/controllers/apps/apps.routes.d.ts.map +1 -1
  25. package/dist/backend/backend/src/controllers/apps/apps.routes.js +15 -1
  26. package/dist/backend/backend/src/controllers/apps/apps.routes.js.map +1 -1
  27. package/dist/backend/backend/src/controllers/monitoring/terminal.controller.d.ts +12 -0
  28. package/dist/backend/backend/src/controllers/monitoring/terminal.controller.d.ts.map +1 -1
  29. package/dist/backend/backend/src/controllers/monitoring/terminal.controller.js +36 -1
  30. package/dist/backend/backend/src/controllers/monitoring/terminal.controller.js.map +1 -1
  31. package/dist/backend/backend/src/controllers/request-types.d.ts +10 -1
  32. package/dist/backend/backend/src/controllers/request-types.d.ts.map +1 -1
  33. package/dist/backend/backend/src/controllers/task-pool/task-pool.controller.d.ts +0 -36
  34. package/dist/backend/backend/src/controllers/task-pool/task-pool.controller.d.ts.map +1 -1
  35. package/dist/backend/backend/src/controllers/task-pool/task-pool.controller.js +41 -1
  36. package/dist/backend/backend/src/controllers/task-pool/task-pool.controller.js.map +1 -1
  37. package/dist/backend/backend/src/controllers/team/team-pause.controller.d.ts +59 -0
  38. package/dist/backend/backend/src/controllers/team/team-pause.controller.d.ts.map +1 -0
  39. package/dist/backend/backend/src/controllers/team/team-pause.controller.js +161 -0
  40. package/dist/backend/backend/src/controllers/team/team-pause.controller.js.map +1 -0
  41. package/dist/backend/backend/src/controllers/team/team.controller.d.ts +14 -0
  42. package/dist/backend/backend/src/controllers/team/team.controller.d.ts.map +1 -1
  43. package/dist/backend/backend/src/controllers/team/team.controller.js +78 -5
  44. package/dist/backend/backend/src/controllers/team/team.controller.js.map +1 -1
  45. package/dist/backend/backend/src/controllers/team/team.routes.d.ts.map +1 -1
  46. package/dist/backend/backend/src/controllers/team/team.routes.js +7 -1
  47. package/dist/backend/backend/src/controllers/team/team.routes.js.map +1 -1
  48. package/dist/backend/backend/src/index.d.ts.map +1 -1
  49. package/dist/backend/backend/src/index.js +18 -1
  50. package/dist/backend/backend/src/index.js.map +1 -1
  51. package/dist/backend/backend/src/models/Team.d.ts +5 -1
  52. package/dist/backend/backend/src/models/Team.d.ts.map +1 -1
  53. package/dist/backend/backend/src/models/Team.js +8 -0
  54. package/dist/backend/backend/src/models/Team.js.map +1 -1
  55. package/dist/backend/backend/src/services/agent/owner-stopped.registry.d.ts +7 -2
  56. package/dist/backend/backend/src/services/agent/owner-stopped.registry.d.ts.map +1 -1
  57. package/dist/backend/backend/src/services/agent/owner-stopped.registry.js +9 -3
  58. package/dist/backend/backend/src/services/agent/owner-stopped.registry.js.map +1 -1
  59. package/dist/backend/backend/src/services/ai/prompt-modules/skills-reference.module.d.ts.map +1 -1
  60. package/dist/backend/backend/src/services/ai/prompt-modules/skills-reference.module.js +3 -2
  61. package/dist/backend/backend/src/services/ai/prompt-modules/skills-reference.module.js.map +1 -1
  62. package/dist/backend/backend/src/services/apps/app-open-link.d.ts +61 -0
  63. package/dist/backend/backend/src/services/apps/app-open-link.d.ts.map +1 -0
  64. package/dist/backend/backend/src/services/apps/app-open-link.js +112 -0
  65. package/dist/backend/backend/src/services/apps/app-open-link.js.map +1 -0
  66. package/dist/backend/backend/src/services/apps/app-wake-message.d.ts +44 -3
  67. package/dist/backend/backend/src/services/apps/app-wake-message.d.ts.map +1 -1
  68. package/dist/backend/backend/src/services/apps/app-wake-message.js +99 -7
  69. package/dist/backend/backend/src/services/apps/app-wake-message.js.map +1 -1
  70. package/dist/backend/backend/src/services/apps/app-wake.service.d.ts +29 -2
  71. package/dist/backend/backend/src/services/apps/app-wake.service.d.ts.map +1 -1
  72. package/dist/backend/backend/src/services/apps/app-wake.service.js +151 -21
  73. package/dist/backend/backend/src/services/apps/app-wake.service.js.map +1 -1
  74. package/dist/backend/backend/src/services/apps/apps-registry.service.d.ts +18 -0
  75. package/dist/backend/backend/src/services/apps/apps-registry.service.d.ts.map +1 -1
  76. package/dist/backend/backend/src/services/apps/apps-registry.service.js +14 -0
  77. package/dist/backend/backend/src/services/apps/apps-registry.service.js.map +1 -1
  78. package/dist/backend/backend/src/services/apps/apps.service.d.ts +261 -12
  79. package/dist/backend/backend/src/services/apps/apps.service.d.ts.map +1 -1
  80. package/dist/backend/backend/src/services/apps/apps.service.js +387 -30
  81. package/dist/backend/backend/src/services/apps/apps.service.js.map +1 -1
  82. package/dist/backend/backend/src/services/apps/apps.wiring.d.ts +15 -1
  83. package/dist/backend/backend/src/services/apps/apps.wiring.d.ts.map +1 -1
  84. package/dist/backend/backend/src/services/apps/apps.wiring.js +27 -7
  85. package/dist/backend/backend/src/services/apps/apps.wiring.js.map +1 -1
  86. package/dist/backend/backend/src/services/chat-v2/chat-v2.dispatcher.service.d.ts.map +1 -1
  87. package/dist/backend/backend/src/services/chat-v2/chat-v2.dispatcher.service.js +17 -5
  88. package/dist/backend/backend/src/services/chat-v2/chat-v2.dispatcher.service.js.map +1 -1
  89. package/dist/backend/backend/src/services/core/logger.service.d.ts +5 -0
  90. package/dist/backend/backend/src/services/core/logger.service.d.ts.map +1 -1
  91. package/dist/backend/backend/src/services/core/logger.service.js +8 -0
  92. package/dist/backend/backend/src/services/core/logger.service.js.map +1 -1
  93. package/dist/backend/backend/src/services/core/storage.service.d.ts.map +1 -1
  94. package/dist/backend/backend/src/services/core/storage.service.js +6 -0
  95. package/dist/backend/backend/src/services/core/storage.service.js.map +1 -1
  96. package/dist/backend/backend/src/services/messaging/owner-message-watchdog.wiring.d.ts.map +1 -1
  97. package/dist/backend/backend/src/services/messaging/owner-message-watchdog.wiring.js +6 -0
  98. package/dist/backend/backend/src/services/messaging/owner-message-watchdog.wiring.js.map +1 -1
  99. package/dist/backend/backend/src/services/project-tickets/project-ticket-workflow.service.d.ts +12 -0
  100. package/dist/backend/backend/src/services/project-tickets/project-ticket-workflow.service.d.ts.map +1 -1
  101. package/dist/backend/backend/src/services/project-tickets/project-ticket-workflow.service.js +59 -0
  102. package/dist/backend/backend/src/services/project-tickets/project-ticket-workflow.service.js.map +1 -1
  103. package/dist/backend/backend/src/services/project-tickets/ticket-autopilot.service.d.ts.map +1 -1
  104. package/dist/backend/backend/src/services/project-tickets/ticket-autopilot.service.js +12 -6
  105. package/dist/backend/backend/src/services/project-tickets/ticket-autopilot.service.js.map +1 -1
  106. package/dist/backend/backend/src/services/reconciler/reconcile-rules.d.ts.map +1 -1
  107. package/dist/backend/backend/src/services/reconciler/reconcile-rules.js +5 -0
  108. package/dist/backend/backend/src/services/reconciler/reconcile-rules.js.map +1 -1
  109. package/dist/backend/backend/src/services/reconciler/reconciler.service.d.ts.map +1 -1
  110. package/dist/backend/backend/src/services/reconciler/reconciler.service.js +4 -0
  111. package/dist/backend/backend/src/services/reconciler/reconciler.service.js.map +1 -1
  112. package/dist/backend/backend/src/services/slack/slack-agent-dm.service.d.ts.map +1 -1
  113. package/dist/backend/backend/src/services/slack/slack-agent-dm.service.js +22 -0
  114. package/dist/backend/backend/src/services/slack/slack-agent-dm.service.js.map +1 -1
  115. package/dist/backend/backend/src/services/slack/slack-channel-members.d.ts +27 -0
  116. package/dist/backend/backend/src/services/slack/slack-channel-members.d.ts.map +1 -0
  117. package/dist/backend/backend/src/services/slack/slack-channel-members.js +54 -0
  118. package/dist/backend/backend/src/services/slack/slack-channel-members.js.map +1 -0
  119. package/dist/backend/backend/src/services/slack/slack-directory.service.d.ts.map +1 -1
  120. package/dist/backend/backend/src/services/slack/slack-directory.service.js +7 -2
  121. package/dist/backend/backend/src/services/slack/slack-directory.service.js.map +1 -1
  122. package/dist/backend/backend/src/services/slack/slack-initializer.d.ts.map +1 -1
  123. package/dist/backend/backend/src/services/slack/slack-initializer.js +3 -0
  124. package/dist/backend/backend/src/services/slack/slack-initializer.js.map +1 -1
  125. package/dist/backend/backend/src/services/slack/slack-orchestrator-bridge.d.ts.map +1 -1
  126. package/dist/backend/backend/src/services/slack/slack-orchestrator-bridge.js +19 -0
  127. package/dist/backend/backend/src/services/slack/slack-orchestrator-bridge.js.map +1 -1
  128. package/dist/backend/backend/src/services/slack/slack-team-channel.service.d.ts +48 -0
  129. package/dist/backend/backend/src/services/slack/slack-team-channel.service.d.ts.map +1 -1
  130. package/dist/backend/backend/src/services/slack/slack-team-channel.service.js +155 -4
  131. package/dist/backend/backend/src/services/slack/slack-team-channel.service.js.map +1 -1
  132. package/dist/backend/backend/src/services/slack/slack-thread-context.service.d.ts.map +1 -1
  133. package/dist/backend/backend/src/services/slack/slack-thread-context.service.js +3 -1
  134. package/dist/backend/backend/src/services/slack/slack-thread-context.service.js.map +1 -1
  135. package/dist/backend/backend/src/services/task-pool/task-pool.service.d.ts +11 -0
  136. package/dist/backend/backend/src/services/task-pool/task-pool.service.d.ts.map +1 -1
  137. package/dist/backend/backend/src/services/task-pool/task-pool.service.js +36 -1
  138. package/dist/backend/backend/src/services/task-pool/task-pool.service.js.map +1 -1
  139. package/dist/backend/backend/src/services/task-pool/untargeted-router.d.ts.map +1 -1
  140. package/dist/backend/backend/src/services/task-pool/untargeted-router.js +14 -6
  141. package/dist/backend/backend/src/services/task-pool/untargeted-router.js.map +1 -1
  142. package/dist/backend/backend/src/services/team/team-pause-command.d.ts +97 -0
  143. package/dist/backend/backend/src/services/team/team-pause-command.d.ts.map +1 -0
  144. package/dist/backend/backend/src/services/team/team-pause-command.js +177 -0
  145. package/dist/backend/backend/src/services/team/team-pause-command.js.map +1 -0
  146. package/dist/backend/backend/src/services/team/team-pause-notice.d.ts +43 -0
  147. package/dist/backend/backend/src/services/team/team-pause-notice.d.ts.map +1 -0
  148. package/dist/backend/backend/src/services/team/team-pause-notice.js +61 -0
  149. package/dist/backend/backend/src/services/team/team-pause-notice.js.map +1 -0
  150. package/dist/backend/backend/src/services/team/team-pause.registry.d.ts +167 -0
  151. package/dist/backend/backend/src/services/team/team-pause.registry.d.ts.map +1 -0
  152. package/dist/backend/backend/src/services/team/team-pause.registry.js +263 -0
  153. package/dist/backend/backend/src/services/team/team-pause.registry.js.map +1 -0
  154. package/dist/backend/backend/src/services/team/team-pause.service.d.ts +172 -0
  155. package/dist/backend/backend/src/services/team/team-pause.service.d.ts.map +1 -0
  156. package/dist/backend/backend/src/services/team/team-pause.service.js +254 -0
  157. package/dist/backend/backend/src/services/team/team-pause.service.js.map +1 -0
  158. package/dist/backend/backend/src/services/team/team-pause.wiring.d.ts +30 -0
  159. package/dist/backend/backend/src/services/team/team-pause.wiring.d.ts.map +1 -0
  160. package/dist/backend/backend/src/services/team/team-pause.wiring.js +48 -0
  161. package/dist/backend/backend/src/services/team/team-pause.wiring.js.map +1 -0
  162. package/dist/backend/backend/src/services/v3/agent-auto-claim.service.d.ts.map +1 -1
  163. package/dist/backend/backend/src/services/v3/agent-auto-claim.service.js +11 -0
  164. package/dist/backend/backend/src/services/v3/agent-auto-claim.service.js.map +1 -1
  165. package/dist/backend/backend/src/services/v3/trigger-engine.service.d.ts +9 -0
  166. package/dist/backend/backend/src/services/v3/trigger-engine.service.d.ts.map +1 -1
  167. package/dist/backend/backend/src/services/v3/trigger-engine.service.js +27 -2
  168. package/dist/backend/backend/src/services/v3/trigger-engine.service.js.map +1 -1
  169. package/dist/backend/backend/src/services/v3/workitem-dispatch.subscriber.d.ts.map +1 -1
  170. package/dist/backend/backend/src/services/v3/workitem-dispatch.subscriber.js +7 -0
  171. package/dist/backend/backend/src/services/v3/workitem-dispatch.subscriber.js.map +1 -1
  172. package/dist/backend/backend/src/services/workflow/cron-task.service.d.ts.map +1 -1
  173. package/dist/backend/backend/src/services/workflow/cron-task.service.js +14 -0
  174. package/dist/backend/backend/src/services/workflow/cron-task.service.js.map +1 -1
  175. package/dist/backend/backend/src/services/workflow/message-scheduler.service.d.ts.map +1 -1
  176. package/dist/backend/backend/src/services/workflow/message-scheduler.service.js +5 -0
  177. package/dist/backend/backend/src/services/workflow/message-scheduler.service.js.map +1 -1
  178. package/dist/backend/backend/src/services/workflow/scheduler.service.d.ts.map +1 -1
  179. package/dist/backend/backend/src/services/workflow/scheduler.service.js +6 -0
  180. package/dist/backend/backend/src/services/workflow/scheduler.service.js.map +1 -1
  181. package/dist/backend/backend/src/types/index.d.ts +22 -0
  182. package/dist/backend/backend/src/types/index.d.ts.map +1 -1
  183. package/dist/backend/backend/src/types/index.js.map +1 -1
  184. package/dist/backend/build-info.json +2 -2
  185. package/dist/cli/backend/src/constants.d.ts +78 -0
  186. package/dist/cli/backend/src/constants.d.ts.map +1 -1
  187. package/dist/cli/backend/src/constants.js +78 -0
  188. package/dist/cli/backend/src/constants.js.map +1 -1
  189. package/dist/cli/backend/src/models/Team.d.ts +5 -1
  190. package/dist/cli/backend/src/models/Team.d.ts.map +1 -1
  191. package/dist/cli/backend/src/models/Team.js +8 -0
  192. package/dist/cli/backend/src/models/Team.js.map +1 -1
  193. package/dist/cli/backend/src/services/ai/prompt-modules/skills-reference.module.d.ts.map +1 -1
  194. package/dist/cli/backend/src/services/ai/prompt-modules/skills-reference.module.js +3 -2
  195. package/dist/cli/backend/src/services/ai/prompt-modules/skills-reference.module.js.map +1 -1
  196. package/dist/cli/backend/src/services/apps/app-open-link.d.ts +61 -0
  197. package/dist/cli/backend/src/services/apps/app-open-link.d.ts.map +1 -0
  198. package/dist/cli/backend/src/services/apps/app-open-link.js +112 -0
  199. package/dist/cli/backend/src/services/apps/app-open-link.js.map +1 -0
  200. package/dist/cli/backend/src/services/chat-v2/chat-v2.dispatcher.service.d.ts.map +1 -1
  201. package/dist/cli/backend/src/services/chat-v2/chat-v2.dispatcher.service.js +17 -5
  202. package/dist/cli/backend/src/services/chat-v2/chat-v2.dispatcher.service.js.map +1 -1
  203. package/dist/cli/backend/src/services/core/logger.service.d.ts +5 -0
  204. package/dist/cli/backend/src/services/core/logger.service.d.ts.map +1 -1
  205. package/dist/cli/backend/src/services/core/logger.service.js +8 -0
  206. package/dist/cli/backend/src/services/core/logger.service.js.map +1 -1
  207. package/dist/cli/backend/src/services/core/storage.service.d.ts.map +1 -1
  208. package/dist/cli/backend/src/services/core/storage.service.js +6 -0
  209. package/dist/cli/backend/src/services/core/storage.service.js.map +1 -1
  210. package/dist/cli/backend/src/services/slack/slack-agent-dm.service.d.ts.map +1 -1
  211. package/dist/cli/backend/src/services/slack/slack-agent-dm.service.js +22 -0
  212. package/dist/cli/backend/src/services/slack/slack-agent-dm.service.js.map +1 -1
  213. package/dist/cli/backend/src/services/slack/slack-directory.service.d.ts.map +1 -1
  214. package/dist/cli/backend/src/services/slack/slack-directory.service.js +7 -2
  215. package/dist/cli/backend/src/services/slack/slack-directory.service.js.map +1 -1
  216. package/dist/cli/backend/src/services/slack/slack-orchestrator-bridge.d.ts.map +1 -1
  217. package/dist/cli/backend/src/services/slack/slack-orchestrator-bridge.js +19 -0
  218. package/dist/cli/backend/src/services/slack/slack-orchestrator-bridge.js.map +1 -1
  219. package/dist/cli/backend/src/services/slack/slack-team-channel.service.d.ts +48 -0
  220. package/dist/cli/backend/src/services/slack/slack-team-channel.service.d.ts.map +1 -1
  221. package/dist/cli/backend/src/services/slack/slack-team-channel.service.js +155 -4
  222. package/dist/cli/backend/src/services/slack/slack-team-channel.service.js.map +1 -1
  223. package/dist/cli/backend/src/services/slack/slack-thread-context.service.d.ts.map +1 -1
  224. package/dist/cli/backend/src/services/slack/slack-thread-context.service.js +3 -1
  225. package/dist/cli/backend/src/services/slack/slack-thread-context.service.js.map +1 -1
  226. package/dist/cli/backend/src/services/task-pool/task-pool.service.d.ts +11 -0
  227. package/dist/cli/backend/src/services/task-pool/task-pool.service.d.ts.map +1 -1
  228. package/dist/cli/backend/src/services/task-pool/task-pool.service.js +36 -1
  229. package/dist/cli/backend/src/services/task-pool/task-pool.service.js.map +1 -1
  230. package/dist/cli/backend/src/services/team/team-pause-notice.d.ts +43 -0
  231. package/dist/cli/backend/src/services/team/team-pause-notice.d.ts.map +1 -0
  232. package/dist/cli/backend/src/services/team/team-pause-notice.js +61 -0
  233. package/dist/cli/backend/src/services/team/team-pause-notice.js.map +1 -0
  234. package/dist/cli/backend/src/services/team/team-pause.registry.d.ts +167 -0
  235. package/dist/cli/backend/src/services/team/team-pause.registry.d.ts.map +1 -0
  236. package/dist/cli/backend/src/services/team/team-pause.registry.js +263 -0
  237. package/dist/cli/backend/src/services/team/team-pause.registry.js.map +1 -0
  238. package/dist/cli/backend/src/services/workflow/cron-task.service.d.ts.map +1 -1
  239. package/dist/cli/backend/src/services/workflow/cron-task.service.js +14 -0
  240. package/dist/cli/backend/src/services/workflow/cron-task.service.js.map +1 -1
  241. package/dist/cli/backend/src/types/index.d.ts +22 -0
  242. package/dist/cli/backend/src/types/index.d.ts.map +1 -1
  243. package/dist/cli/backend/src/types/index.js.map +1 -1
  244. package/frontend/dist/assets/{index-f64b333a.js → index-917db1b8.js} +279 -279
  245. package/frontend/dist/index.html +1 -1
  246. package/package.json +1 -1
@@ -3,7 +3,7 @@ import { isPersonId } from '../../services/people/people-directory.service.js';
3
3
  import { canMemberDelegate, getTeamLeadIds, isLeadRole, setTeamLead } from '../../utils/team.utils.js';
4
4
  import { v4 as uuidv4 } from 'uuid';
5
5
  import { ORCHESTRATOR_SESSION_NAME, ORCHESTRATOR_ROLE, RUNTIME_TYPES, NON_RECOVERABLE_ERROR_PATTERNS, CLAUDE_STARTUP_CONSTANTS, RUNTIME_STARTUP_CONSTANTS, } from '../../constants.js';
6
- import { CREWLY_CONSTANTS, AGENT_TIMEOUTS, AGENT_WAKE_ERROR_CODES, TEAM_LEAD_CONSTANTS } from '../../constants.js';
6
+ import { CREWLY_CONSTANTS, AGENT_TIMEOUTS, AGENT_WAKE_ERROR_CODES, TEAM_LEAD_CONSTANTS, TEAM_PAUSE_CONSTANTS } from '../../constants.js';
7
7
  import { updateAgentHeartbeat } from '../../services/agent/agent-heartbeat.service.js';
8
8
  import { getSessionBackendSync, getSessionStatePersistence } from '../../services/session/index.js';
9
9
  import { removeCrewlyAgentFile } from '../../services/session/session-binding.js';
@@ -27,6 +27,7 @@ import { getCallerIdentity, isOwnerCaller, rejectNonOwner, sendOwnerAuthRequired
27
27
  import { effectiveRuntimeType } from '../../services/runtime-fallback/effective-runtime.js';
28
28
  import { getRuntimeFallbackService } from '../../services/runtime-fallback/runtime-fallback.service.js';
29
29
  import { clearOwnerStopped, markOwnerStopped } from '../../services/agent/owner-stopped.registry.js';
30
+ import { isTeamPausedNow, pausedRefusalMessage } from '../../services/team/team-pause.registry.js';
30
31
  const logger = LoggerService.getInstance().createComponentLogger('TeamController');
31
32
  /**
32
33
  * Module-level EventBusService instance, injected at startup.
@@ -467,7 +468,28 @@ export async function activateAgentBySession(context, sessionName) {
467
468
  * @param projectPath - Optional project path for the session
468
469
  * @returns Result of the start operation
469
470
  */
470
- async function _startTeamMemberCore(context, team, member, projectPath) {
471
+ async function _startTeamMemberCore(context, team, member, projectPath, options = {}) {
472
+ // A paused team's members are started only by the owner
473
+ // (specs/2026-10-04-team-pause.md). Every automated start — the queued-
474
+ // message wake, the owner-message watchdog, activate-on-send, a skill —
475
+ // comes through here without `ownerStart` and is refused.
476
+ if (!options.ownerStart && isTeamPausedNow(team)) {
477
+ logger.info('Not starting a member of a paused team (only the owner can)', {
478
+ teamId: team.id,
479
+ team: team.name,
480
+ member: member.name,
481
+ sessionName: member.sessionName || undefined,
482
+ });
483
+ return {
484
+ success: false,
485
+ memberName: member.name,
486
+ memberId: member.id,
487
+ sessionName: member.sessionName || null,
488
+ status: 'failed',
489
+ error: `${team.name} is paused by the owner; only the owner can start its members.`,
490
+ errorCode: TEAM_PAUSE_CONSTANTS.ERROR_CODE,
491
+ };
492
+ }
471
493
  try {
472
494
  // Guard against members with no role — without this, undefined flows into
473
495
  // session creation, gets stringified to "undefined" in CREWLY_ROLE, and
@@ -906,6 +928,19 @@ async function _stopTeamMemberCore(context, team, member) {
906
928
  };
907
929
  }
908
930
  }
931
+ /**
932
+ * Stop one member the way stop-team does (owner-stopped mark, terminate,
933
+ * status inactive). Used by the team pause (specs/2026-10-04-team-pause.md).
934
+ *
935
+ * @param context - API context
936
+ * @param team - The member's team (saved with the member's new status)
937
+ * @param member - Member to stop
938
+ * @returns `{ success, error? }`
939
+ */
940
+ export async function stopTeamMemberGracefully(context, team, member) {
941
+ const result = await _stopTeamMemberCore(context, team, member);
942
+ return { success: result.success, ...(result.error ? { error: result.error } : {}) };
943
+ }
909
944
  // Orchestrator reads agent status on-demand; no push subscriptions.
910
945
  export async function createTeam(req, res) {
911
946
  try {
@@ -1114,9 +1149,12 @@ export async function getTeams(req, res) {
1114
1149
  // Non-fatal: fall back to teams.json workingStatus values
1115
1150
  workingStatusData = null;
1116
1151
  }
1117
- // Also update status for team members based on actual session existence
1152
+ // Also update status for team members based on actual session existence.
1153
+ // `pausedNow` / `pauseLabel`: the owner's pause is in force (an expired
1154
+ // `paused` waits for the auto-resume sweep) — specs/2026-10-04-team-pause.md.
1118
1155
  const teamsWithActualStatus = teams.map(team => ({
1119
1156
  ...team,
1157
+ ...(isTeamPausedNow(team) ? { pausedNow: true, pauseLabel: TEAM_PAUSE_CONSTANTS.ORC_STATUS_LABEL } : {}),
1120
1158
  members: team.members.map(member => {
1121
1159
  const memberSessionExists = backend?.sessionExists(member.sessionName) || false;
1122
1160
  const isInProcessActive = this.agentRegistrationService.isInProcessRuntimeActive(member.sessionName);
@@ -1241,6 +1279,16 @@ export async function startTeam(req, res) {
1241
1279
  res.status(404).json({ success: false, error: 'Team not found' });
1242
1280
  return;
1243
1281
  }
1282
+ // A paused team is started by the owner only (specs/2026-10-04-team-pause.md).
1283
+ const ownerStart = isOwnerDashboardRequest(req);
1284
+ if (!ownerStart && isTeamPausedNow(team)) {
1285
+ res.status(409).json({
1286
+ success: false,
1287
+ error: pausedRefusalMessage({ teamName: team.name, issueRepo: team.issueRepo, pause: team.paused }, { callerIsOrc: readAgentSessionHeader(req) === ORCHESTRATOR_SESSION_NAME }),
1288
+ code: TEAM_PAUSE_CONSTANTS.ERROR_CODE,
1289
+ });
1290
+ return;
1291
+ }
1244
1292
  const projects = await this.storageService.getProjects();
1245
1293
  let targetProjectId = projectId || team.projectIds[0];
1246
1294
  if (!targetProjectId) {
@@ -1300,7 +1348,7 @@ export async function startTeam(req, res) {
1300
1348
  }
1301
1349
  // Session doesn't exist despite active status — fall through to start it
1302
1350
  }
1303
- const result = await _startTeamMemberCore(this, team, member, assignedProject.path);
1351
+ const result = await _startTeamMemberCore(this, team, member, assignedProject.path, { ownerStart });
1304
1352
  // Convert internal result to the expected format for the response
1305
1353
  const resultForResponse = {
1306
1354
  memberName: result.memberName,
@@ -1854,6 +1902,15 @@ export async function startTeamMember(req, res) {
1854
1902
  // — see isOwnerDashboardRequest for why a missing `X-Agent-Session`
1855
1903
  // alone is not enough.
1856
1904
  const ownerDashboardCall = isOwnerDashboardRequest(req);
1905
+ // A paused team is started by the owner only (specs/2026-10-04-team-pause.md).
1906
+ if (!ownerDashboardCall && isTeamPausedNow(team)) {
1907
+ res.status(409).json({
1908
+ success: false,
1909
+ error: pausedRefusalMessage({ teamName: team.name, issueRepo: team.issueRepo, pause: team.paused }, { callerIsOrc: readAgentSessionHeader(req) === ORCHESTRATOR_SESSION_NAME }),
1910
+ code: TEAM_PAUSE_CONSTANTS.ERROR_CODE,
1911
+ });
1912
+ return;
1913
+ }
1857
1914
  if (ownerDashboardCall && !memberAlreadyActive) {
1858
1915
  logger.info('startTeamMember: owner dashboard request — wake and commitment gates do not apply', {
1859
1916
  teamId,
@@ -1992,7 +2049,7 @@ export async function startTeamMember(req, res) {
1992
2049
  projectPath = project?.path;
1993
2050
  }
1994
2051
  // Use the internal helper function to start the team member
1995
- const result = await _startTeamMemberCore(this, team, member, projectPath);
2052
+ const result = await _startTeamMemberCore(this, team, member, projectPath, { ownerStart: ownerDashboardCall });
1996
2053
  // Handle the result and respond appropriately
1997
2054
  if (result.success) {
1998
2055
  if (result.status === 'synchronized') {
@@ -2944,6 +3001,22 @@ export async function updateTeam(req, res) {
2944
3001
  team.archived = updates.archived;
2945
3002
  team.archivedAt = updates.archived ? new Date().toISOString() : undefined;
2946
3003
  }
3004
+ // Where other agents file work while the team is paused (owner only;
3005
+ // specs/2026-10-04-team-pause.md).
3006
+ const requestedRepo = updates.issueRepo === undefined ? undefined : typeof updates.issueRepo === 'string' ? updates.issueRepo.trim() : '';
3007
+ if (requestedRepo !== undefined && requestedRepo !== (team.issueRepo ?? '')) {
3008
+ if (rejectNonOwner(req, res, { success: false, error: 'Only the owner can set a team\'s issue repo' }))
3009
+ return;
3010
+ const repo = requestedRepo;
3011
+ if (repo && !TEAM_PAUSE_CONSTANTS.ISSUE_REPO_PATTERN.test(repo)) {
3012
+ res.status(400).json({ success: false, error: 'issueRepo must look like owner/name (e.g. stevehuang0115/crewly)' });
3013
+ return;
3014
+ }
3015
+ if (repo)
3016
+ team.issueRepo = repo;
3017
+ else
3018
+ delete team.issueRepo;
3019
+ }
2947
3020
  // #173: Handle org chart fields
2948
3021
  if (updates.mission !== undefined) {
2949
3022
  team.mission = updates.mission;