crewly 1.20.196 → 1.20.198

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 (234) hide show
  1. package/config/roles/orchestrator/prompt.md +8 -9
  2. package/config/roles/team-leader/prompt.md +6 -0
  3. package/config/skills/agent/computer-use/SKILL.md +16 -0
  4. package/config/skills/agent/core/ask-owner/SKILL.md +14 -0
  5. package/config/skills/agent/core/ask-owner/execute.sh +19 -1
  6. package/config/skills/agent/core/ask-owner/execute.test.sh +12 -0
  7. package/config/skills/agent/core/gmail-send/SKILL.md +16 -0
  8. package/config/skills/agent/core/reply-channel/SKILL.md +16 -0
  9. package/config/skills/agent/core/slack-post/SKILL.md +16 -0
  10. package/config/skills/agent/core/whatsapp-send/SKILL.md +16 -0
  11. package/config/skills/agent/remote-browser/SKILL.md +43 -7
  12. package/config/skills/registry.json +7 -7
  13. package/dist/backend/backend/src/constants.d.ts +143 -0
  14. package/dist/backend/backend/src/constants.d.ts.map +1 -1
  15. package/dist/backend/backend/src/constants.js +159 -0
  16. package/dist/backend/backend/src/constants.js.map +1 -1
  17. package/dist/backend/backend/src/controllers/browser/browser.controller.d.ts +12 -1
  18. package/dist/backend/backend/src/controllers/browser/browser.controller.d.ts.map +1 -1
  19. package/dist/backend/backend/src/controllers/browser/browser.controller.js +170 -9
  20. package/dist/backend/backend/src/controllers/browser/browser.controller.js.map +1 -1
  21. package/dist/backend/backend/src/controllers/browser/browser.routes.d.ts.map +1 -1
  22. package/dist/backend/backend/src/controllers/browser/browser.routes.js +5 -1
  23. package/dist/backend/backend/src/controllers/browser/browser.routes.js.map +1 -1
  24. package/dist/backend/backend/src/controllers/monitoring/terminal.controller.d.ts.map +1 -1
  25. package/dist/backend/backend/src/controllers/monitoring/terminal.controller.js +37 -52
  26. package/dist/backend/backend/src/controllers/monitoring/terminal.controller.js.map +1 -1
  27. package/dist/backend/backend/src/controllers/team/team.controller.d.ts.map +1 -1
  28. package/dist/backend/backend/src/controllers/team/team.controller.js +13 -0
  29. package/dist/backend/backend/src/controllers/team/team.controller.js.map +1 -1
  30. package/dist/backend/backend/src/index.d.ts +17 -0
  31. package/dist/backend/backend/src/index.d.ts.map +1 -1
  32. package/dist/backend/backend/src/index.js +102 -0
  33. package/dist/backend/backend/src/index.js.map +1 -1
  34. package/dist/backend/backend/src/services/agent/agent-heartbeat-monitor.service.d.ts.map +1 -1
  35. package/dist/backend/backend/src/services/agent/agent-heartbeat-monitor.service.js +5 -8
  36. package/dist/backend/backend/src/services/agent/agent-heartbeat-monitor.service.js.map +1 -1
  37. package/dist/backend/backend/src/services/agent/agent-registration.service.d.ts +12 -0
  38. package/dist/backend/backend/src/services/agent/agent-registration.service.d.ts.map +1 -1
  39. package/dist/backend/backend/src/services/agent/agent-registration.service.js +275 -241
  40. package/dist/backend/backend/src/services/agent/agent-registration.service.js.map +1 -1
  41. package/dist/backend/backend/src/services/agent/context-window-monitor.service.d.ts.map +1 -1
  42. package/dist/backend/backend/src/services/agent/context-window-monitor.service.js +5 -6
  43. package/dist/backend/backend/src/services/agent/context-window-monitor.service.js.map +1 -1
  44. package/dist/backend/backend/src/services/agent/control-plane-guard.service.d.ts +6 -0
  45. package/dist/backend/backend/src/services/agent/control-plane-guard.service.d.ts.map +1 -1
  46. package/dist/backend/backend/src/services/agent/control-plane-guard.service.js +2 -1
  47. package/dist/backend/backend/src/services/agent/control-plane-guard.service.js.map +1 -1
  48. package/dist/backend/backend/src/services/agent/fresh-task-conversation.service.d.ts.map +1 -1
  49. package/dist/backend/backend/src/services/agent/fresh-task-conversation.service.js +12 -8
  50. package/dist/backend/backend/src/services/agent/fresh-task-conversation.service.js.map +1 -1
  51. package/dist/backend/backend/src/services/agent/gemini-runtime.service.d.ts.map +1 -1
  52. package/dist/backend/backend/src/services/agent/gemini-runtime.service.js +32 -27
  53. package/dist/backend/backend/src/services/agent/gemini-runtime.service.js.map +1 -1
  54. package/dist/backend/backend/src/services/agent/owner-stopped.registry.d.ts +44 -0
  55. package/dist/backend/backend/src/services/agent/owner-stopped.registry.d.ts.map +1 -0
  56. package/dist/backend/backend/src/services/agent/owner-stopped.registry.js +54 -0
  57. package/dist/backend/backend/src/services/agent/owner-stopped.registry.js.map +1 -0
  58. package/dist/backend/backend/src/services/agent/runtime-agent.service.abstract.js +4 -4
  59. package/dist/backend/backend/src/services/agent/runtime-agent.service.abstract.js.map +1 -1
  60. package/dist/backend/backend/src/services/agent/runtime-exit-monitor.service.d.ts.map +1 -1
  61. package/dist/backend/backend/src/services/agent/runtime-exit-monitor.service.js +4 -8
  62. package/dist/backend/backend/src/services/agent/runtime-exit-monitor.service.js.map +1 -1
  63. package/dist/backend/backend/src/services/ai/prompt-modules/decision-rights.module.d.ts +19 -4
  64. package/dist/backend/backend/src/services/ai/prompt-modules/decision-rights.module.d.ts.map +1 -1
  65. package/dist/backend/backend/src/services/ai/prompt-modules/decision-rights.module.js +28 -5
  66. package/dist/backend/backend/src/services/ai/prompt-modules/decision-rights.module.js.map +1 -1
  67. package/dist/backend/backend/src/services/browser/browser-approval.service.d.ts +2 -2
  68. package/dist/backend/backend/src/services/browser/browser-approval.service.d.ts.map +1 -1
  69. package/dist/backend/backend/src/services/browser/browser-approval.service.js +13 -2
  70. package/dist/backend/backend/src/services/browser/browser-approval.service.js.map +1 -1
  71. package/dist/backend/backend/src/services/browser/browser-outbound-guard.d.ts +214 -0
  72. package/dist/backend/backend/src/services/browser/browser-outbound-guard.d.ts.map +1 -0
  73. package/dist/backend/backend/src/services/browser/browser-outbound-guard.js +466 -0
  74. package/dist/backend/backend/src/services/browser/browser-outbound-guard.js.map +1 -0
  75. package/dist/backend/backend/src/services/browser/browser-session.service.d.ts +57 -3
  76. package/dist/backend/backend/src/services/browser/browser-session.service.d.ts.map +1 -1
  77. package/dist/backend/backend/src/services/browser/browser-session.service.js +148 -63
  78. package/dist/backend/backend/src/services/browser/browser-session.service.js.map +1 -1
  79. package/dist/backend/backend/src/services/browser/held-action-store.d.ts +4 -0
  80. package/dist/backend/backend/src/services/browser/held-action-store.d.ts.map +1 -1
  81. package/dist/backend/backend/src/services/browser/held-action-store.js.map +1 -1
  82. package/dist/backend/backend/src/services/browser/owner-browser-input.d.ts +98 -10
  83. package/dist/backend/backend/src/services/browser/owner-browser-input.d.ts.map +1 -1
  84. package/dist/backend/backend/src/services/browser/owner-browser-input.js +126 -11
  85. package/dist/backend/backend/src/services/browser/owner-browser-input.js.map +1 -1
  86. package/dist/backend/backend/src/services/cloud/cloud-initializer.d.ts.map +1 -1
  87. package/dist/backend/backend/src/services/cloud/cloud-initializer.js +6 -8
  88. package/dist/backend/backend/src/services/cloud/cloud-initializer.js.map +1 -1
  89. package/dist/backend/backend/src/services/messaging/input-blocked-retry.service.d.ts +129 -0
  90. package/dist/backend/backend/src/services/messaging/input-blocked-retry.service.d.ts.map +1 -0
  91. package/dist/backend/backend/src/services/messaging/input-blocked-retry.service.js +196 -0
  92. package/dist/backend/backend/src/services/messaging/input-blocked-retry.service.js.map +1 -0
  93. package/dist/backend/backend/src/services/messaging/sub-agent-message-queue.service.d.ts +42 -0
  94. package/dist/backend/backend/src/services/messaging/sub-agent-message-queue.service.d.ts.map +1 -1
  95. package/dist/backend/backend/src/services/messaging/sub-agent-message-queue.service.js +88 -10
  96. package/dist/backend/backend/src/services/messaging/sub-agent-message-queue.service.js.map +1 -1
  97. package/dist/backend/backend/src/services/monitoring/agent-hook-state.d.ts.map +1 -1
  98. package/dist/backend/backend/src/services/monitoring/agent-hook-state.js +5 -0
  99. package/dist/backend/backend/src/services/monitoring/agent-hook-state.js.map +1 -1
  100. package/dist/backend/backend/src/services/orchestrator/orchestrator-heartbeat-monitor.service.d.ts.map +1 -1
  101. package/dist/backend/backend/src/services/orchestrator/orchestrator-heartbeat-monitor.service.js +5 -9
  102. package/dist/backend/backend/src/services/orchestrator/orchestrator-heartbeat-monitor.service.js.map +1 -1
  103. package/dist/backend/backend/src/services/session/pty/pty-session-backend.d.ts +11 -0
  104. package/dist/backend/backend/src/services/session/pty/pty-session-backend.d.ts.map +1 -1
  105. package/dist/backend/backend/src/services/session/pty/pty-session-backend.js +14 -0
  106. package/dist/backend/backend/src/services/session/pty/pty-session-backend.js.map +1 -1
  107. package/dist/backend/backend/src/services/session/pty/pty-terminal-buffer.d.ts +37 -0
  108. package/dist/backend/backend/src/services/session/pty/pty-terminal-buffer.d.ts.map +1 -1
  109. package/dist/backend/backend/src/services/session/pty/pty-terminal-buffer.js +78 -0
  110. package/dist/backend/backend/src/services/session/pty/pty-terminal-buffer.js.map +1 -1
  111. package/dist/backend/backend/src/services/session/session-backend.interface.d.ts +13 -0
  112. package/dist/backend/backend/src/services/session/session-backend.interface.d.ts.map +1 -1
  113. package/dist/backend/backend/src/services/session/session-backend.interface.js.map +1 -1
  114. package/dist/backend/backend/src/services/session/session-command-helper.d.ts +118 -105
  115. package/dist/backend/backend/src/services/session/session-command-helper.d.ts.map +1 -1
  116. package/dist/backend/backend/src/services/session/session-command-helper.js +267 -298
  117. package/dist/backend/backend/src/services/session/session-command-helper.js.map +1 -1
  118. package/dist/backend/backend/src/services/session/tui-input-guard.d.ts +144 -0
  119. package/dist/backend/backend/src/services/session/tui-input-guard.d.ts.map +1 -0
  120. package/dist/backend/backend/src/services/session/tui-input-guard.js +312 -0
  121. package/dist/backend/backend/src/services/session/tui-input-guard.js.map +1 -0
  122. package/dist/backend/backend/src/services/slack/slack-orchestrator-bridge.d.ts.map +1 -1
  123. package/dist/backend/backend/src/services/slack/slack-orchestrator-bridge.js +14 -0
  124. package/dist/backend/backend/src/services/slack/slack-orchestrator-bridge.js.map +1 -1
  125. package/dist/backend/backend/src/services/slack/slack-team-channel.service.d.ts +31 -0
  126. package/dist/backend/backend/src/services/slack/slack-team-channel.service.d.ts.map +1 -1
  127. package/dist/backend/backend/src/services/slack/slack-team-channel.service.js +82 -4
  128. package/dist/backend/backend/src/services/slack/slack-team-channel.service.js.map +1 -1
  129. package/dist/backend/backend/src/services/trace/trace.types.d.ts +2 -2
  130. package/dist/backend/backend/src/services/trace/trace.types.d.ts.map +1 -1
  131. package/dist/backend/backend/src/services/trace/trace.types.js +4 -0
  132. package/dist/backend/backend/src/services/trace/trace.types.js.map +1 -1
  133. package/dist/backend/backend/src/services/trace/turn-origin.d.ts +70 -0
  134. package/dist/backend/backend/src/services/trace/turn-origin.d.ts.map +1 -0
  135. package/dist/backend/backend/src/services/trace/turn-origin.js +198 -0
  136. package/dist/backend/backend/src/services/trace/turn-origin.js.map +1 -0
  137. package/dist/backend/backend/src/types/slack.types.d.ts +8 -0
  138. package/dist/backend/backend/src/types/slack.types.d.ts.map +1 -1
  139. package/dist/backend/backend/src/types/slack.types.js.map +1 -1
  140. package/dist/backend/backend/src/utils/terminal-string-ops.d.ts.map +1 -1
  141. package/dist/backend/backend/src/utils/terminal-string-ops.js +3 -2
  142. package/dist/backend/backend/src/utils/terminal-string-ops.js.map +1 -1
  143. package/dist/backend/build-info.json +2 -2
  144. package/dist/cli/backend/src/constants.d.ts +143 -0
  145. package/dist/cli/backend/src/constants.d.ts.map +1 -1
  146. package/dist/cli/backend/src/constants.js +159 -0
  147. package/dist/cli/backend/src/constants.js.map +1 -1
  148. package/dist/cli/backend/src/services/agent/agent-registration.service.d.ts +12 -0
  149. package/dist/cli/backend/src/services/agent/agent-registration.service.d.ts.map +1 -1
  150. package/dist/cli/backend/src/services/agent/agent-registration.service.js +275 -241
  151. package/dist/cli/backend/src/services/agent/agent-registration.service.js.map +1 -1
  152. package/dist/cli/backend/src/services/agent/context-window-monitor.service.d.ts.map +1 -1
  153. package/dist/cli/backend/src/services/agent/context-window-monitor.service.js +5 -6
  154. package/dist/cli/backend/src/services/agent/context-window-monitor.service.js.map +1 -1
  155. package/dist/cli/backend/src/services/agent/control-plane-guard.service.d.ts +6 -0
  156. package/dist/cli/backend/src/services/agent/control-plane-guard.service.d.ts.map +1 -1
  157. package/dist/cli/backend/src/services/agent/control-plane-guard.service.js +2 -1
  158. package/dist/cli/backend/src/services/agent/control-plane-guard.service.js.map +1 -1
  159. package/dist/cli/backend/src/services/agent/fresh-task-conversation.service.d.ts.map +1 -1
  160. package/dist/cli/backend/src/services/agent/fresh-task-conversation.service.js +12 -8
  161. package/dist/cli/backend/src/services/agent/fresh-task-conversation.service.js.map +1 -1
  162. package/dist/cli/backend/src/services/agent/gemini-runtime.service.d.ts.map +1 -1
  163. package/dist/cli/backend/src/services/agent/gemini-runtime.service.js +32 -27
  164. package/dist/cli/backend/src/services/agent/gemini-runtime.service.js.map +1 -1
  165. package/dist/cli/backend/src/services/agent/runtime-agent.service.abstract.js +4 -4
  166. package/dist/cli/backend/src/services/agent/runtime-agent.service.abstract.js.map +1 -1
  167. package/dist/cli/backend/src/services/agent/runtime-exit-monitor.service.d.ts.map +1 -1
  168. package/dist/cli/backend/src/services/agent/runtime-exit-monitor.service.js +4 -8
  169. package/dist/cli/backend/src/services/agent/runtime-exit-monitor.service.js.map +1 -1
  170. package/dist/cli/backend/src/services/ai/prompt-modules/decision-rights.module.d.ts +19 -4
  171. package/dist/cli/backend/src/services/ai/prompt-modules/decision-rights.module.d.ts.map +1 -1
  172. package/dist/cli/backend/src/services/ai/prompt-modules/decision-rights.module.js +28 -5
  173. package/dist/cli/backend/src/services/ai/prompt-modules/decision-rights.module.js.map +1 -1
  174. package/dist/cli/backend/src/services/messaging/input-blocked-retry.service.d.ts +129 -0
  175. package/dist/cli/backend/src/services/messaging/input-blocked-retry.service.d.ts.map +1 -0
  176. package/dist/cli/backend/src/services/messaging/input-blocked-retry.service.js +196 -0
  177. package/dist/cli/backend/src/services/messaging/input-blocked-retry.service.js.map +1 -0
  178. package/dist/cli/backend/src/services/messaging/sub-agent-message-queue.service.d.ts +42 -0
  179. package/dist/cli/backend/src/services/messaging/sub-agent-message-queue.service.d.ts.map +1 -1
  180. package/dist/cli/backend/src/services/messaging/sub-agent-message-queue.service.js +88 -10
  181. package/dist/cli/backend/src/services/messaging/sub-agent-message-queue.service.js.map +1 -1
  182. package/dist/cli/backend/src/services/session/pty/pty-session-backend.d.ts +11 -0
  183. package/dist/cli/backend/src/services/session/pty/pty-session-backend.d.ts.map +1 -1
  184. package/dist/cli/backend/src/services/session/pty/pty-session-backend.js +14 -0
  185. package/dist/cli/backend/src/services/session/pty/pty-session-backend.js.map +1 -1
  186. package/dist/cli/backend/src/services/session/pty/pty-terminal-buffer.d.ts +37 -0
  187. package/dist/cli/backend/src/services/session/pty/pty-terminal-buffer.d.ts.map +1 -1
  188. package/dist/cli/backend/src/services/session/pty/pty-terminal-buffer.js +78 -0
  189. package/dist/cli/backend/src/services/session/pty/pty-terminal-buffer.js.map +1 -1
  190. package/dist/cli/backend/src/services/session/session-backend.interface.d.ts +13 -0
  191. package/dist/cli/backend/src/services/session/session-backend.interface.d.ts.map +1 -1
  192. package/dist/cli/backend/src/services/session/session-backend.interface.js.map +1 -1
  193. package/dist/cli/backend/src/services/session/session-command-helper.d.ts +118 -105
  194. package/dist/cli/backend/src/services/session/session-command-helper.d.ts.map +1 -1
  195. package/dist/cli/backend/src/services/session/session-command-helper.js +267 -298
  196. package/dist/cli/backend/src/services/session/session-command-helper.js.map +1 -1
  197. package/dist/cli/backend/src/services/session/tui-input-guard.d.ts +144 -0
  198. package/dist/cli/backend/src/services/session/tui-input-guard.d.ts.map +1 -0
  199. package/dist/cli/backend/src/services/session/tui-input-guard.js +312 -0
  200. package/dist/cli/backend/src/services/session/tui-input-guard.js.map +1 -0
  201. package/dist/cli/backend/src/services/slack/slack-orchestrator-bridge.d.ts.map +1 -1
  202. package/dist/cli/backend/src/services/slack/slack-orchestrator-bridge.js +14 -0
  203. package/dist/cli/backend/src/services/slack/slack-orchestrator-bridge.js.map +1 -1
  204. package/dist/cli/backend/src/services/slack/slack-team-channel.service.d.ts +31 -0
  205. package/dist/cli/backend/src/services/slack/slack-team-channel.service.d.ts.map +1 -1
  206. package/dist/cli/backend/src/services/slack/slack-team-channel.service.js +82 -4
  207. package/dist/cli/backend/src/services/slack/slack-team-channel.service.js.map +1 -1
  208. package/dist/cli/backend/src/services/trace/trace.types.d.ts +2 -2
  209. package/dist/cli/backend/src/services/trace/trace.types.d.ts.map +1 -1
  210. package/dist/cli/backend/src/services/trace/trace.types.js +4 -0
  211. package/dist/cli/backend/src/services/trace/trace.types.js.map +1 -1
  212. package/dist/cli/backend/src/services/trace/turn-origin.d.ts +70 -0
  213. package/dist/cli/backend/src/services/trace/turn-origin.d.ts.map +1 -0
  214. package/dist/cli/backend/src/services/trace/turn-origin.js +198 -0
  215. package/dist/cli/backend/src/services/trace/turn-origin.js.map +1 -0
  216. package/dist/cli/backend/src/types/slack.types.d.ts +8 -0
  217. package/dist/cli/backend/src/types/slack.types.d.ts.map +1 -1
  218. package/dist/cli/backend/src/types/slack.types.js.map +1 -1
  219. package/dist/cli/backend/src/utils/terminal-string-ops.d.ts.map +1 -1
  220. package/dist/cli/backend/src/utils/terminal-string-ops.js +3 -2
  221. package/dist/cli/backend/src/utils/terminal-string-ops.js.map +1 -1
  222. package/frontend/dist/assets/index-5cbcf45b.css +42 -0
  223. package/frontend/dist/assets/{index-edfa8e04.js → index-63a33dbf.js} +283 -283
  224. package/frontend/dist/index.html +2 -2
  225. package/package.json +1 -1
  226. package/dist/cli/backend/src/services/agent/agent-suspend.service.d.ts +0 -118
  227. package/dist/cli/backend/src/services/agent/agent-suspend.service.d.ts.map +0 -1
  228. package/dist/cli/backend/src/services/agent/agent-suspend.service.js +0 -304
  229. package/dist/cli/backend/src/services/agent/agent-suspend.service.js.map +0 -1
  230. package/dist/cli/backend/src/services/agent/disk-cleanup.service.d.ts +0 -100
  231. package/dist/cli/backend/src/services/agent/disk-cleanup.service.d.ts.map +0 -1
  232. package/dist/cli/backend/src/services/agent/disk-cleanup.service.js +0 -149
  233. package/dist/cli/backend/src/services/agent/disk-cleanup.service.js.map +0 -1
  234. package/frontend/dist/assets/index-bfa0e2e8.css +0 -42
@@ -7,8 +7,8 @@
7
7
  <meta name="color-scheme" content="dark" />
8
8
  <!-- Nunito font is self-hosted via @fontsource/nunito (imported in main.tsx) -->
9
9
  <title>Crewly AI Studio</title>
10
- <script type="module" crossorigin src="/assets/index-edfa8e04.js"></script>
11
- <link rel="stylesheet" href="/assets/index-bfa0e2e8.css">
10
+ <script type="module" crossorigin src="/assets/index-63a33dbf.js"></script>
11
+ <link rel="stylesheet" href="/assets/index-5cbcf45b.css">
12
12
  </head>
13
13
  <body class="bg-background-dark font-display text-text-primary-dark">
14
14
  <div id="root"></div>
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "crewly",
3
- "version": "1.20.196",
3
+ "version": "1.20.198",
4
4
  "type": "module",
5
5
  "description": "Multi-agent orchestration platform for AI coding teams — coordinates Claude Code, Gemini CLI, and Codex agents with a real-time web dashboard",
6
6
  "workspaces": [
@@ -1,118 +0,0 @@
1
- /**
2
- * Agent Suspend Service
3
- *
4
- * Central coordinator for the agent suspend/rehydrate lifecycle.
5
- * Suspends idle agents to free resources (RAM/disk) and transparently
6
- * rehydrates them when the orchestrator sends a message, using
7
- * Claude Code's `--resume` flag to restore conversation context.
8
- *
9
- * @module agent-suspend-service
10
- */
11
- import type { AgentRegistrationService } from './agent-registration.service.js';
12
- /**
13
- * Information stored for each suspended agent.
14
- */
15
- export interface SuspendedAgentInfo {
16
- /** PTY session name */
17
- sessionName: string;
18
- /** Team ID the agent belongs to */
19
- teamId: string;
20
- /** Member ID within the team */
21
- memberId: string;
22
- /** Agent role (developer, qa, etc.) */
23
- role: string;
24
- /** Claude conversation session ID for --resume */
25
- claudeSessionId?: string;
26
- /** ISO timestamp when the agent was suspended */
27
- suspendedAt: string;
28
- }
29
- /**
30
- * Manages suspension and rehydration of idle agents.
31
- *
32
- * Lifecycle:
33
- * - `active → suspended`: Idle timeout triggers suspendAgent()
34
- * - `suspended → starting → active`: Message triggers rehydrateAgent()
35
- * - `suspended → inactive`: Manual stop by user
36
- */
37
- export declare class AgentSuspendService {
38
- private static instance;
39
- private logger;
40
- /** Map of sessionName → suspended agent metadata */
41
- private suspendedAgents;
42
- /** Set of sessionNames currently being rehydrated (dedup guard) */
43
- private rehydratingSet;
44
- /** Injected AgentRegistrationService (set via setDependencies) */
45
- private agentRegistrationService;
46
- private constructor();
47
- /**
48
- * Get the singleton instance.
49
- *
50
- * @returns The AgentSuspendService singleton
51
- */
52
- static getInstance(): AgentSuspendService;
53
- /**
54
- * Reset the singleton (for testing).
55
- */
56
- static resetInstance(): void;
57
- /**
58
- * Inject the AgentRegistrationService dependency.
59
- * Must be called during server startup before rehydration can work.
60
- *
61
- * @param registrationService - The AgentRegistrationService instance
62
- */
63
- setDependencies(registrationService: AgentRegistrationService): void;
64
- /**
65
- * Suspend an active agent, killing its process but preserving
66
- * the Claude session ID so it can be rehydrated later.
67
- *
68
- * @param sessionName - PTY session name
69
- * @param teamId - Team ID
70
- * @param memberId - Member ID within the team
71
- * @param role - Agent role
72
- * @returns True if suspension was successful
73
- */
74
- suspendAgent(sessionName: string, teamId: string, memberId: string, role: string): Promise<boolean>;
75
- /**
76
- * Rehydrate a suspended agent by recreating its session.
77
- * Uses the saved Claude session ID for `--resume` to restore context.
78
- *
79
- * @param sessionName - PTY session name of the suspended agent
80
- * @returns True if rehydration was initiated (not necessarily complete)
81
- */
82
- rehydrateAgent(sessionName: string): Promise<boolean>;
83
- /**
84
- * Check if a session is currently suspended.
85
- *
86
- * @param sessionName - PTY session name
87
- * @returns True if the agent is suspended
88
- */
89
- isSuspended(sessionName: string): boolean;
90
- /**
91
- * Check if a session is currently being rehydrated.
92
- *
93
- * @param sessionName - PTY session name
94
- * @returns True if rehydration is in progress
95
- */
96
- isRehydrating(sessionName: string): boolean;
97
- /**
98
- * Get suspend information for a session.
99
- *
100
- * @param sessionName - PTY session name
101
- * @returns Suspend info or null if not suspended
102
- */
103
- getSuspendInfo(sessionName: string): SuspendedAgentInfo | null;
104
- /**
105
- * Remove an agent from the suspended map without rehydrating.
106
- * Used when a suspended agent is manually stopped by the user.
107
- *
108
- * @param sessionName - PTY session name
109
- */
110
- removeSuspended(sessionName: string): void;
111
- /**
112
- * Get the count of currently suspended agents.
113
- *
114
- * @returns Number of suspended agents
115
- */
116
- getSuspendedCount(): number;
117
- }
118
- //# sourceMappingURL=agent-suspend.service.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"agent-suspend.service.d.ts","sourceRoot":"","sources":["../../../../../../backend/src/services/agent/agent-suspend.service.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAUH,OAAO,KAAK,EAAE,wBAAwB,EAAE,MAAM,iCAAiC,CAAC;AAEhF;;GAEG;AACH,MAAM,WAAW,kBAAkB;IAClC,uBAAuB;IACvB,WAAW,EAAE,MAAM,CAAC;IACpB,mCAAmC;IACnC,MAAM,EAAE,MAAM,CAAC;IACf,gCAAgC;IAChC,QAAQ,EAAE,MAAM,CAAC;IACjB,uCAAuC;IACvC,IAAI,EAAE,MAAM,CAAC;IACb,kDAAkD;IAClD,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,iDAAiD;IACjD,WAAW,EAAE,MAAM,CAAC;CACpB;AAED;;;;;;;GAOG;AACH,qBAAa,mBAAmB;IAC/B,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAoC;IAC3D,OAAO,CAAC,MAAM,CAAkB;IAEhC,oDAAoD;IACpD,OAAO,CAAC,eAAe,CAA8C;IAErE,mEAAmE;IACnE,OAAO,CAAC,cAAc,CAA0B;IAEhD,kEAAkE;IAClE,OAAO,CAAC,wBAAwB,CAAyC;IAEzE,OAAO;IAIP;;;;OAIG;IACH,MAAM,CAAC,WAAW,IAAI,mBAAmB;IAOzC;;OAEG;IACH,MAAM,CAAC,aAAa,IAAI,IAAI;IAI5B;;;;;OAKG;IACH,eAAe,CAAC,mBAAmB,EAAE,wBAAwB,GAAG,IAAI;IAKpE;;;;;;;;;OASG;IACG,YAAY,CACjB,WAAW,EAAE,MAAM,EACnB,MAAM,EAAE,MAAM,EACd,QAAQ,EAAE,MAAM,EAChB,IAAI,EAAE,MAAM,GACV,OAAO,CAAC,OAAO,CAAC;IAoFnB;;;;;;OAMG;IACG,cAAc,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAyH3D;;;;;OAKG;IACH,WAAW,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO;IAIzC;;;;;OAKG;IACH,aAAa,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO;IAI3C;;;;;OAKG;IACH,cAAc,CAAC,WAAW,EAAE,MAAM,GAAG,kBAAkB,GAAG,IAAI;IAI9D;;;;;OAKG;IACH,eAAe,CAAC,WAAW,EAAE,MAAM,GAAG,IAAI;IAI1C;;;;OAIG;IACH,iBAAiB,IAAI,MAAM;CAG3B"}
@@ -1,304 +0,0 @@
1
- /**
2
- * Agent Suspend Service
3
- *
4
- * Central coordinator for the agent suspend/rehydrate lifecycle.
5
- * Suspends idle agents to free resources (RAM/disk) and transparently
6
- * rehydrates them when the orchestrator sends a message, using
7
- * Claude Code's `--resume` flag to restore conversation context.
8
- *
9
- * @module agent-suspend-service
10
- */
11
- import { LoggerService } from '../core/logger.service.js';
12
- import { StorageService } from '../core/storage.service.js';
13
- import { CREWLY_CONSTANTS, AGENT_SUSPEND_CONSTANTS } from '../../constants.js';
14
- import { PtyActivityTrackerService } from './pty-activity-tracker.service.js';
15
- import { DiskCleanupService } from './disk-cleanup.service.js';
16
- import { RuntimeExitMonitorService } from './runtime-exit-monitor.service.js';
17
- import { getSessionBackendSync, getSessionStatePersistence } from '../session/index.js';
18
- import { getTerminalGateway } from '../../websocket/terminal.gateway.js';
19
- /**
20
- * Manages suspension and rehydration of idle agents.
21
- *
22
- * Lifecycle:
23
- * - `active → suspended`: Idle timeout triggers suspendAgent()
24
- * - `suspended → starting → active`: Message triggers rehydrateAgent()
25
- * - `suspended → inactive`: Manual stop by user
26
- */
27
- export class AgentSuspendService {
28
- static instance = null;
29
- logger;
30
- /** Map of sessionName → suspended agent metadata */
31
- suspendedAgents = new Map();
32
- /** Set of sessionNames currently being rehydrated (dedup guard) */
33
- rehydratingSet = new Set();
34
- /** Injected AgentRegistrationService (set via setDependencies) */
35
- agentRegistrationService = null;
36
- constructor() {
37
- this.logger = LoggerService.getInstance().createComponentLogger('AgentSuspend');
38
- }
39
- /**
40
- * Get the singleton instance.
41
- *
42
- * @returns The AgentSuspendService singleton
43
- */
44
- static getInstance() {
45
- if (!AgentSuspendService.instance) {
46
- AgentSuspendService.instance = new AgentSuspendService();
47
- }
48
- return AgentSuspendService.instance;
49
- }
50
- /**
51
- * Reset the singleton (for testing).
52
- */
53
- static resetInstance() {
54
- AgentSuspendService.instance = null;
55
- }
56
- /**
57
- * Inject the AgentRegistrationService dependency.
58
- * Must be called during server startup before rehydration can work.
59
- *
60
- * @param registrationService - The AgentRegistrationService instance
61
- */
62
- setDependencies(registrationService) {
63
- this.agentRegistrationService = registrationService;
64
- this.logger.info('AgentSuspendService dependencies set');
65
- }
66
- /**
67
- * Suspend an active agent, killing its process but preserving
68
- * the Claude session ID so it can be rehydrated later.
69
- *
70
- * @param sessionName - PTY session name
71
- * @param teamId - Team ID
72
- * @param memberId - Member ID within the team
73
- * @param role - Agent role
74
- * @returns True if suspension was successful
75
- */
76
- async suspendAgent(sessionName, teamId, memberId, role) {
77
- // Guard: exempt roles
78
- if (AGENT_SUSPEND_CONSTANTS.EXEMPT_ROLES.includes(role)) {
79
- this.logger.warn('Cannot suspend exempt role', { sessionName, role });
80
- return false;
81
- }
82
- // Guard: already suspended
83
- if (this.suspendedAgents.has(sessionName)) {
84
- this.logger.warn('Agent is already suspended', { sessionName });
85
- return false;
86
- }
87
- try {
88
- // Get Claude session ID from persistence before killing
89
- let claudeSessionId;
90
- try {
91
- const persistence = getSessionStatePersistence();
92
- claudeSessionId = persistence.getSessionId(sessionName);
93
- }
94
- catch {
95
- this.logger.warn('Could not retrieve Claude session ID for suspend', { sessionName });
96
- }
97
- // Save suspend info
98
- const info = {
99
- sessionName,
100
- teamId,
101
- memberId,
102
- role,
103
- claudeSessionId,
104
- suspendedAt: new Date().toISOString(),
105
- };
106
- this.suspendedAgents.set(sessionName, info);
107
- // Stop runtime exit monitoring (don't trigger exit callbacks)
108
- RuntimeExitMonitorService.getInstance().stopMonitoring(sessionName);
109
- // Kill the PTY session
110
- const backend = getSessionBackendSync();
111
- if (backend && backend.sessionExists(sessionName)) {
112
- await backend.killSession(sessionName);
113
- }
114
- // Clear PTY activity tracker
115
- PtyActivityTrackerService.getInstance().clearSession(sessionName);
116
- // Run disk cleanup
117
- DiskCleanupService.getInstance().runSuspendCleanup();
118
- // Update status to suspended
119
- await StorageService.getInstance().updateAgentStatus(sessionName, CREWLY_CONSTANTS.AGENT_STATUSES.SUSPENDED);
120
- // Broadcast status change to frontend
121
- const terminalGateway = getTerminalGateway();
122
- if (terminalGateway) {
123
- terminalGateway.broadcastTeamMemberStatus({
124
- teamId,
125
- memberId,
126
- sessionName,
127
- agentStatus: CREWLY_CONSTANTS.AGENT_STATUSES.SUSPENDED,
128
- });
129
- }
130
- this.logger.info('Agent suspended successfully', {
131
- sessionName,
132
- role,
133
- claudeSessionId: claudeSessionId ? '(saved)' : '(none)',
134
- });
135
- return true;
136
- }
137
- catch (error) {
138
- // Rollback: remove from suspended map on failure
139
- this.suspendedAgents.delete(sessionName);
140
- this.logger.error('Failed to suspend agent', {
141
- sessionName,
142
- error: error instanceof Error ? error.message : String(error),
143
- });
144
- return false;
145
- }
146
- }
147
- /**
148
- * Rehydrate a suspended agent by recreating its session.
149
- * Uses the saved Claude session ID for `--resume` to restore context.
150
- *
151
- * @param sessionName - PTY session name of the suspended agent
152
- * @returns True if rehydration was initiated (not necessarily complete)
153
- */
154
- async rehydrateAgent(sessionName) {
155
- // Guard: deduplicate concurrent calls
156
- if (this.rehydratingSet.has(sessionName)) {
157
- this.logger.debug('Rehydration already in progress', { sessionName });
158
- return true;
159
- }
160
- const info = this.suspendedAgents.get(sessionName);
161
- if (!info) {
162
- this.logger.warn('Cannot rehydrate: agent not in suspended map', { sessionName });
163
- return false;
164
- }
165
- this.rehydratingSet.add(sessionName);
166
- try {
167
- // Update status to starting
168
- await StorageService.getInstance().updateAgentStatus(sessionName, CREWLY_CONSTANTS.AGENT_STATUSES.STARTING);
169
- // Broadcast starting status
170
- const terminalGateway = getTerminalGateway();
171
- if (terminalGateway) {
172
- terminalGateway.broadcastTeamMemberStatus({
173
- teamId: info.teamId,
174
- memberId: info.memberId,
175
- sessionName,
176
- agentStatus: CREWLY_CONSTANTS.AGENT_STATUSES.STARTING,
177
- });
178
- }
179
- // Ensure session persistence has the saved claudeSessionId
180
- // so createAgentSession's resume logic picks it up
181
- if (info.claudeSessionId) {
182
- try {
183
- const persistence = getSessionStatePersistence();
184
- const metadata = persistence.getSessionMetadata(sessionName);
185
- if (metadata) {
186
- persistence.updateSessionId(sessionName, info.claudeSessionId);
187
- }
188
- }
189
- catch {
190
- this.logger.warn('Could not pre-set session ID for resume', { sessionName });
191
- }
192
- }
193
- if (!this.agentRegistrationService) {
194
- this.logger.error('Cannot rehydrate: AgentRegistrationService not set (call setDependencies first)');
195
- return false;
196
- }
197
- // Recreate the agent session (this triggers the resume flow internally)
198
- const result = await this.agentRegistrationService.createAgentSession({
199
- sessionName,
200
- role: info.role,
201
- teamId: info.teamId,
202
- memberId: info.memberId,
203
- });
204
- if (!result.success) {
205
- this.logger.error('Rehydration createAgentSession failed', {
206
- sessionName,
207
- error: result.error,
208
- });
209
- // Revert to suspended status
210
- await StorageService.getInstance().updateAgentStatus(sessionName, CREWLY_CONSTANTS.AGENT_STATUSES.SUSPENDED);
211
- return false;
212
- }
213
- // Wait for agent to become active (poll with timeout)
214
- const timeoutMs = AGENT_SUSPEND_CONSTANTS.REHYDRATION_TIMEOUT_MS;
215
- const pollInterval = 2000;
216
- const startTime = Date.now();
217
- let active = false;
218
- while (Date.now() - startTime < timeoutMs) {
219
- const memberResult = await StorageService.getInstance().findMemberBySessionName(sessionName);
220
- if (memberResult?.member.agentStatus === CREWLY_CONSTANTS.AGENT_STATUSES.ACTIVE) {
221
- active = true;
222
- break;
223
- }
224
- await new Promise(resolve => setTimeout(resolve, pollInterval));
225
- }
226
- if (active) {
227
- // Success — remove from suspended map
228
- this.suspendedAgents.delete(sessionName);
229
- this.logger.info('Agent rehydrated successfully', { sessionName });
230
- return true;
231
- }
232
- else {
233
- this.logger.warn('Rehydration timed out waiting for active status', {
234
- sessionName,
235
- timeoutMs,
236
- });
237
- // Leave in suspended map — messages remain queued
238
- return false;
239
- }
240
- }
241
- catch (error) {
242
- this.logger.error('Rehydration failed', {
243
- sessionName,
244
- error: error instanceof Error ? error.message : String(error),
245
- });
246
- // Revert to suspended status
247
- try {
248
- await StorageService.getInstance().updateAgentStatus(sessionName, CREWLY_CONSTANTS.AGENT_STATUSES.SUSPENDED);
249
- }
250
- catch {
251
- // Best effort
252
- }
253
- return false;
254
- }
255
- finally {
256
- this.rehydratingSet.delete(sessionName);
257
- }
258
- }
259
- /**
260
- * Check if a session is currently suspended.
261
- *
262
- * @param sessionName - PTY session name
263
- * @returns True if the agent is suspended
264
- */
265
- isSuspended(sessionName) {
266
- return this.suspendedAgents.has(sessionName);
267
- }
268
- /**
269
- * Check if a session is currently being rehydrated.
270
- *
271
- * @param sessionName - PTY session name
272
- * @returns True if rehydration is in progress
273
- */
274
- isRehydrating(sessionName) {
275
- return this.rehydratingSet.has(sessionName);
276
- }
277
- /**
278
- * Get suspend information for a session.
279
- *
280
- * @param sessionName - PTY session name
281
- * @returns Suspend info or null if not suspended
282
- */
283
- getSuspendInfo(sessionName) {
284
- return this.suspendedAgents.get(sessionName) ?? null;
285
- }
286
- /**
287
- * Remove an agent from the suspended map without rehydrating.
288
- * Used when a suspended agent is manually stopped by the user.
289
- *
290
- * @param sessionName - PTY session name
291
- */
292
- removeSuspended(sessionName) {
293
- this.suspendedAgents.delete(sessionName);
294
- }
295
- /**
296
- * Get the count of currently suspended agents.
297
- *
298
- * @returns Number of suspended agents
299
- */
300
- getSuspendedCount() {
301
- return this.suspendedAgents.size;
302
- }
303
- }
304
- //# sourceMappingURL=agent-suspend.service.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"agent-suspend.service.js","sourceRoot":"","sources":["../../../../../../backend/src/services/agent/agent-suspend.service.ts"],"names":[],"mappings":"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"}
@@ -1,100 +0,0 @@
1
- /**
2
- * Disk Cleanup Service
3
- *
4
- * Handles cleanup of temporary files when agents are suspended and
5
- * system-level cleanup of Docker resources and log files.
6
- *
7
- * Agent cleanup targets:
8
- * - `~/.claude/debug/` — debug log files
9
- * - `~/.claude/shell-snapshots/` — shell state snapshots
10
- *
11
- * System cleanup targets:
12
- * - Docker dangling images and build cache
13
- * - Docker stopped containers and unused volumes
14
- * - Crewly log files older than 7 days
15
- *
16
- * @module disk-cleanup-service
17
- */
18
- /**
19
- * Statistics returned after a cleanup run.
20
- */
21
- export interface CleanupStats {
22
- /** Number of debug log files deleted */
23
- debugLogsDeleted: number;
24
- /** Number of shell snapshot files deleted */
25
- shellSnapshotsDeleted: number;
26
- /** Total bytes freed (approximate) */
27
- bytesFreed: number;
28
- }
29
- /**
30
- * Statistics returned after a system-level cleanup run.
31
- */
32
- export interface SystemCleanupStats {
33
- /** Whether Docker cleanup was executed */
34
- dockerCleaned: boolean;
35
- /** Textual summary of Docker cleanup output */
36
- dockerOutput: string;
37
- /** Number of Crewly log files deleted */
38
- crewlyLogsDeleted: number;
39
- /** Total bytes freed from log cleanup (approximate) */
40
- logBytesFreed: number;
41
- }
42
- /**
43
- * Handles disk cleanup on agent suspension.
44
- *
45
- * Targets the Claude Code data directories:
46
- * - `~/.claude/debug/` — debug log files
47
- * - `~/.claude/shell-snapshots/` — shell state snapshots
48
- */
49
- export declare class DiskCleanupService {
50
- private static instance;
51
- private logger;
52
- private claudeDir;
53
- private constructor();
54
- /**
55
- * Get the singleton instance.
56
- *
57
- * @param claudeDir - Optional override for the Claude data directory (testing)
58
- * @returns The DiskCleanupService singleton
59
- */
60
- static getInstance(claudeDir?: string): DiskCleanupService;
61
- /**
62
- * Reset the singleton (for testing).
63
- */
64
- static resetInstance(): void;
65
- /**
66
- * Purge debug log files older than the configured threshold.
67
- *
68
- * @param maxAgeHours - Maximum age in hours before deletion
69
- * @returns Object with count of deleted files and bytes freed
70
- */
71
- purgeDebugLogs(maxAgeHours?: number): {
72
- deleted: number;
73
- bytesFreed: number;
74
- };
75
- /**
76
- * Clear shell snapshot files.
77
- *
78
- * @returns Object with count of deleted files and bytes freed
79
- */
80
- clearShellSnapshots(): {
81
- deleted: number;
82
- bytesFreed: number;
83
- };
84
- /**
85
- * Run the full suspend cleanup pipeline.
86
- * Called by AgentSuspendService when suspending an agent.
87
- *
88
- * @returns Aggregate cleanup statistics
89
- */
90
- runSuspendCleanup(): CleanupStats;
91
- /**
92
- * Delete files in a directory older than the given threshold.
93
- *
94
- * @param dirPath - Directory to scan
95
- * @param maxAgeHours - Maximum file age in hours (0 = delete all)
96
- * @returns Object with count and bytes
97
- */
98
- private purgeOldFiles;
99
- }
100
- //# sourceMappingURL=disk-cleanup.service.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"disk-cleanup.service.d.ts","sourceRoot":"","sources":["../../../../../../backend/src/services/agent/disk-cleanup.service.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG;AAeH;;GAEG;AACH,MAAM,WAAW,YAAY;IAC5B,wCAAwC;IACxC,gBAAgB,EAAE,MAAM,CAAC;IACzB,6CAA6C;IAC7C,qBAAqB,EAAE,MAAM,CAAC;IAC9B,sCAAsC;IACtC,UAAU,EAAE,MAAM,CAAC;CACnB;AAED;;GAEG;AACH,MAAM,WAAW,kBAAkB;IAClC,0CAA0C;IAC1C,aAAa,EAAE,OAAO,CAAC;IACvB,+CAA+C;IAC/C,YAAY,EAAE,MAAM,CAAC;IACrB,yCAAyC;IACzC,iBAAiB,EAAE,MAAM,CAAC;IAC1B,uDAAuD;IACvD,aAAa,EAAE,MAAM,CAAC;CACtB;AAED;;;;;;GAMG;AACH,qBAAa,kBAAkB;IAC9B,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAmC;IAC1D,OAAO,CAAC,MAAM,CAAkB;IAChC,OAAO,CAAC,SAAS,CAAS;IAE1B,OAAO;IAKP;;;;;OAKG;IACH,MAAM,CAAC,WAAW,CAAC,SAAS,CAAC,EAAE,MAAM,GAAG,kBAAkB;IAO1D;;OAEG;IACH,MAAM,CAAC,aAAa,IAAI,IAAI;IAI5B;;;;;OAKG;IACH,cAAc,CACb,WAAW,GAAE,MAAwD,GACnE;QAAE,OAAO,EAAE,MAAM,CAAC;QAAC,UAAU,EAAE,MAAM,CAAA;KAAE;IAK1C;;;;OAIG;IACH,mBAAmB,IAAI;QAAE,OAAO,EAAE,MAAM,CAAC;QAAC,UAAU,EAAE,MAAM,CAAA;KAAE;IAM9D;;;;;OAKG;IACH,iBAAiB,IAAI,YAAY;IAqBjC;;;;;;OAMG;IACH,OAAO,CAAC,aAAa;CA4CrB"}