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
@@ -68,6 +68,7 @@ import { getSlackAutoWorkingService } from './services/slack/slack-auto-working.
68
68
  import { getSlackAgentDmService } from './services/slack/slack-agent-dm.service.js';
69
69
  import { sendBootAnnouncement, isFirstBoot, markBooted } from './services/boot/boot-announce.service.js';
70
70
  import { SubAgentMessageQueue } from './services/messaging/sub-agent-message-queue.service.js';
71
+ import { InputBlockedRetryService } from './services/messaging/input-blocked-retry.service.js';
71
72
  import { SUB_AGENT_QUEUE_CONSTANTS, CHAT_CONTEXT_CONSTANTS, SAFE_RESTART, AUTO_UPDATE_CONSTANTS, PROCESS_EXIT_CODES, CLAUDE_STARTUP_CONSTANTS, WEB_CONSTANTS, TICKET_CONSTANTS, UNASSIGNED_ROUTE_CONSTANTS, CLOUD_TALK_CONSTANTS, STANDING_ANSWERS_CONSTANTS, TICKET_AUTOPILOT_CONSTANTS, EXPERIMENT_CONSTANTS, WORK_ITEM_DESTINATION_CONSTANTS, CODEX_USAGE_SYNC_CONSTANTS, ANTIGRAVITY_USAGE_SYNC_CONSTANTS, OWNER_AUTH_CONSTANTS } from './constants.js';
72
73
  import { PtyActivityTrackerService } from './services/agent/pty-activity-tracker.service.js';
73
74
  import { InFlightTurnTracker } from './services/restart/in-flight-turn-tracker.service.js';
@@ -127,6 +128,7 @@ import { startBackendRuntimeFallback } from './services/runtime-fallback/runtime
127
128
  import { getRuntimeFallbackService } from './services/runtime-fallback/runtime-fallback.service.js';
128
129
  import { getSlackAgentIdentityService } from './services/slack/slack-agent-identity.service.js';
129
130
  import { getChatV2Service } from './services/chat-v2/chat-v2.singleton.js';
131
+ import { isOwnerStopped } from './services/agent/owner-stopped.registry.js';
130
132
  import { findPackageRoot } from './utils/package-root.js';
131
133
  import { getLocalApiBaseUrl, setLocalApiPort } from './utils/local-api-url.utils.js';
132
134
  import { assertBuildProvenance } from './utils/build-provenance.js';
@@ -1316,6 +1318,7 @@ export class CrewlyServer {
1316
1318
  }
1317
1319
  });
1318
1320
  this.wireSafeRestart();
1321
+ this.wireInputBlockedRetry();
1319
1322
  // Shared LiveReconcilerDataProvider instance used by both the
1320
1323
  // Reconciler service and the TeamHealthWatchdog data provider.
1321
1324
  // Sharing is required so the memory-pressure broadcast state
@@ -5322,6 +5325,11 @@ export class CrewlyServer {
5322
5325
  return;
5323
5326
  if (!SubAgentMessageQueue.getInstance().hasPending(sessionName))
5324
5327
  return;
5328
+ // Stopped on purpose: hold the queue until someone starts the agent.
5329
+ if (isOwnerStopped(sessionName)) {
5330
+ this.logger.info('Holding queued messages for an agent that was stopped on purpose (not waking it)', { sessionName });
5331
+ return;
5332
+ }
5325
5333
  const last = this.queuedWakeAt.get(sessionName) ?? 0;
5326
5334
  if (Date.now() - last < SUB_AGENT_QUEUE_CONSTANTS.QUEUED_WAKE_COOLDOWN_MS)
5327
5335
  return;
@@ -5345,6 +5353,100 @@ export class CrewlyServer {
5345
5353
  })();
5346
5354
  }, SUB_AGENT_QUEUE_CONSTANTS.QUEUED_WAKE_DELAY_MS);
5347
5355
  }
5356
+ /**
5357
+ * Write a system note into the orchestrator's own chat (the conversation
5358
+ * the owner last used with it), and flash it on open dashboards when there
5359
+ * is no such conversation. Used when the orchestrator itself is the agent
5360
+ * a notice is about, so it cannot relay the notice. Never throws.
5361
+ *
5362
+ * @param text - The note, in English
5363
+ */
5364
+ tellOrchestratorChat(text) {
5365
+ try {
5366
+ const gateway = this.terminalGateway;
5367
+ const conversationId = gateway?.getActiveConversationId();
5368
+ if (conversationId) {
5369
+ const chatV2 = getChatV2Service();
5370
+ const channel = chatV2.ensureChannelForLegacyConversation({ conversationId, agentSession: ORCHESTRATOR_SESSION_NAME });
5371
+ chatV2.recordTurn({ channelId: channel.id, senderType: 'system', senderId: 'system', content: text, metadata: { source: 'system' } });
5372
+ return;
5373
+ }
5374
+ gateway?.broadcastSystemNotification(text, 'warning');
5375
+ }
5376
+ catch (err) {
5377
+ this.logger.warn('Could not write a notice to the orchestrator chat', {
5378
+ error: err instanceof Error ? err.message : String(err),
5379
+ });
5380
+ }
5381
+ }
5382
+ /**
5383
+ * Messages the input guard held back (crewly#1014) are retried on a timer
5384
+ * while the agent is idle, and the owner/orchestrator is told once when an
5385
+ * agent's input stays blocked. Messages the queue drops undelivered (aged
5386
+ * out after a restart, or the oldest at capacity) are reported too —
5387
+ * nothing expires silently.
5388
+ */
5389
+ wireInputBlockedRetry() {
5390
+ try {
5391
+ const queue = SubAgentMessageQueue.getInstance();
5392
+ const tell = (sessionName, text, sample) => {
5393
+ // In the chat the held message came from, when it names one…
5394
+ const chat = sample ? /^\s*\[CHAT:([^\]\s:]+)/.exec(sample) : null;
5395
+ if (chat) {
5396
+ try {
5397
+ getChatV2Service().recordTurn({ channelId: chat[1], senderType: 'system', senderId: 'crewly', content: text, metadata: { source: 'system' } });
5398
+ }
5399
+ catch {
5400
+ // The channel may be gone; the orchestrator still hears below.
5401
+ }
5402
+ }
5403
+ // …and to the orchestrator, which can reach the owner anywhere —
5404
+ // unless the orchestrator itself is the one blocked: then the
5405
+ // owner directly, over Slack, and in the orchestrator's own chat
5406
+ // when Slack is not set up (or the notice could not be sent).
5407
+ if (sessionName !== ORCHESTRATOR_SESSION_NAME) {
5408
+ this.messageQueueService.enqueue({ content: `[SYSTEM]\n${text}\n[/SYSTEM]`, conversationId: `system:input-blocked:${sessionName}`, source: 'system_event' });
5409
+ }
5410
+ else {
5411
+ const slack = getSlackService();
5412
+ const viaSlack = slack.isConnected()
5413
+ ? slack
5414
+ .sendNotification({ type: 'project_update', title: 'Orchestrator input blocked', message: text, urgency: 'high', timestamp: new Date().toISOString() })
5415
+ .then((sent) => sent !== false, () => false)
5416
+ : Promise.resolve(false);
5417
+ void viaSlack.then((sent) => {
5418
+ if (sent || chat)
5419
+ return;
5420
+ this.tellOrchestratorChat(text);
5421
+ });
5422
+ }
5423
+ };
5424
+ InputBlockedRetryService.getInstance().setDeps({
5425
+ hasQueued: (session) => queue.hasPending(session),
5426
+ isIdle: (session) => this.activityMonitorService.getObservedWorkingStatus(session) !== 'in_progress',
5427
+ flush: (session) => this.flushQueuedAgentMessages(session),
5428
+ notify: async (notice) => {
5429
+ const minutes = Math.max(1, Math.round(notice.blockedForMs / 60000));
5430
+ // The kind of content, never the text: a box can hold a password.
5431
+ const what = notice.state === 'unknown'
5432
+ ? 'its input box cannot be read (a dialog or an unfamiliar screen)'
5433
+ : `its input box holds ${notice.inputLength} characters of text not written by Crewly`;
5434
+ tell(notice.sessionName, `Messages to ${notice.sessionName} are waiting: ${what}. Crewly will not type over it. Tried ${notice.refusals} times over ${minutes} min; it keeps retrying. Clear the agent's input (or answer its screen) to let them through.`, notice.message);
5435
+ },
5436
+ });
5437
+ queue.setDropListener((sessionName, dropped, reason) => {
5438
+ const why = reason === 'aged-out'
5439
+ ? 'they were older than the queue keeps after a restart'
5440
+ : reason === 'undeliverable'
5441
+ ? 'delivery kept failing (the agent session was gone or its runtime had exited)'
5442
+ : 'the queue was full';
5443
+ tell(sessionName, `${dropped.length} message(s) to ${sessionName} were dropped undelivered: ${why}.`, dropped[0]?.data);
5444
+ });
5445
+ }
5446
+ catch (error) {
5447
+ this.logger.warn('Input-blocked retry not wired', { error: error instanceof Error ? error.message : String(error) });
5448
+ }
5449
+ }
5348
5450
  async flushQueuedAgentMessages(sessionName) {
5349
5451
  const queue = SubAgentMessageQueue.getInstance();
5350
5452
  if (!queue.hasPending(sessionName))