crewly 1.2.3 → 1.2.6

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 (735) hide show
  1. package/LICENSE +1 -1
  2. package/README.md +1 -1
  3. package/config/constants.ts +48 -3
  4. package/config/index.ts +4 -0
  5. package/config/roles/auditor/prompt.md +84 -0
  6. package/config/roles/orchestrator/prompt.md +92 -9
  7. package/config/roles/team-leader/prompt.md +169 -0
  8. package/config/roles/team-leader/role.json +13 -0
  9. package/config/roles/team-leader/tl-addon.md +142 -0
  10. package/config/runtime_scripts/runtime-config.json +7 -0
  11. package/config/skills/_common/lib.sh +37 -0
  12. package/config/skills/agent/computer-use/execute.sh +228 -0
  13. package/config/skills/agent/computer-use/instructions.md +103 -0
  14. package/config/skills/agent/computer-use/lib/accessibility.sh +292 -0
  15. package/config/skills/agent/computer-use/lib/applescript.sh +117 -0
  16. package/config/skills/agent/computer-use/lib/discover.sh +122 -0
  17. package/config/skills/agent/computer-use/lib/playwright.sh +153 -0
  18. package/config/skills/agent/computer-use/lib/screenshot.sh +61 -0
  19. package/config/skills/agent/computer-use/skill.json +29 -0
  20. package/config/skills/agent/core/accept-task/execute.sh +7 -1
  21. package/config/skills/agent/core/complete-task/execute.sh +38 -1
  22. package/config/skills/agent/core/report-status/execute.sh +51 -2
  23. package/config/skills/agent/desktop-app-control/execute.sh +561 -0
  24. package/config/skills/agent/desktop-app-control/instructions.md +102 -0
  25. package/config/skills/agent/desktop-app-control/skill.json +33 -0
  26. package/config/skills/orchestrator/broadcast-to-org/execute.sh +88 -0
  27. package/config/skills/orchestrator/broadcast-to-org/instructions.md +51 -0
  28. package/config/skills/orchestrator/broadcast-to-org/skill.json +20 -0
  29. package/config/skills/orchestrator/cancel-all-schedules/execute.sh +24 -0
  30. package/config/skills/orchestrator/cancel-all-schedules/instructions.md +23 -0
  31. package/config/skills/orchestrator/cancel-all-schedules/skill.json +17 -0
  32. package/config/skills/orchestrator/delegate-task/execute.sh +75 -10
  33. package/config/skills/orchestrator/delegate-task/instructions.md +11 -1
  34. package/config/skills/orchestrator/handle-agent-failure/execute.sh +45 -0
  35. package/config/skills/orchestrator/handle-agent-failure/instructions.md +29 -0
  36. package/config/skills/orchestrator/handle-agent-failure/skill.json +20 -0
  37. package/config/skills/orchestrator/list-schedules/execute.sh +19 -0
  38. package/config/skills/orchestrator/list-schedules/instructions.md +24 -0
  39. package/config/skills/orchestrator/list-schedules/skill.json +12 -0
  40. package/config/skills/orchestrator/restart-crewly/instructions.md +9 -2
  41. package/config/skills/team-leader/_common/lib.sh +4 -0
  42. package/config/skills/team-leader/aggregate-results/execute.sh +168 -0
  43. package/config/skills/team-leader/aggregate-results/instructions.md +89 -0
  44. package/config/skills/team-leader/aggregate-results/skill.json +20 -0
  45. package/config/skills/team-leader/decompose-goal/execute.sh +86 -0
  46. package/config/skills/team-leader/decompose-goal/instructions.md +84 -0
  47. package/config/skills/team-leader/decompose-goal/skill.json +20 -0
  48. package/config/skills/team-leader/delegate-task/execute.sh +142 -0
  49. package/config/skills/team-leader/delegate-task/instructions.md +55 -0
  50. package/config/skills/team-leader/delegate-task/skill.json +20 -0
  51. package/config/skills/team-leader/handle-failure/execute.sh +119 -0
  52. package/config/skills/team-leader/handle-failure/instructions.md +93 -0
  53. package/config/skills/team-leader/handle-failure/skill.json +20 -0
  54. package/config/skills/team-leader/schedule-check/execute.sh +65 -0
  55. package/config/skills/team-leader/schedule-check/execute.test.sh +247 -0
  56. package/config/skills/team-leader/schedule-check/instructions.md +49 -0
  57. package/config/skills/team-leader/schedule-check/skill.json +20 -0
  58. package/config/skills/team-leader/start-agent/execute.sh +39 -0
  59. package/config/skills/team-leader/start-agent/instructions.md +48 -0
  60. package/config/skills/team-leader/start-agent/skill.json +20 -0
  61. package/config/skills/team-leader/stop-agent/execute.sh +39 -0
  62. package/config/skills/team-leader/stop-agent/instructions.md +49 -0
  63. package/config/skills/team-leader/stop-agent/skill.json +20 -0
  64. package/config/skills/team-leader/verify-output/execute.sh +296 -0
  65. package/config/skills/team-leader/verify-output/instructions.md +122 -0
  66. package/config/skills/team-leader/verify-output/skill.json +20 -0
  67. package/config/templates/core-team/demo-script.md +41 -0
  68. package/config/templates/core-team/goals.md +20 -0
  69. package/config/templates/core-team/team.json +22 -0
  70. package/config/templates/dev-fullstack/template.json +115 -0
  71. package/config/templates/education-smb/README.md +27 -0
  72. package/config/templates/education-smb/goals.md +16 -0
  73. package/config/templates/education-smb/knowledge/docs/content-standards.md +24 -0
  74. package/config/templates/education-smb/knowledge/docs/education-industry-context.md +13 -0
  75. package/config/templates/education-smb/knowledge/index.json +24 -0
  76. package/config/templates/education-smb/learned-patterns.json +16 -0
  77. package/config/templates/education-smb/quality-gates.yaml +66 -0
  78. package/config/templates/education-smb/roles/analytics-specialist.md +6 -0
  79. package/config/templates/education-smb/roles/content-creator.md +6 -0
  80. package/config/templates/education-smb/roles/curriculum-designer.md +6 -0
  81. package/config/templates/education-smb/roles/engagement-manager.md +6 -0
  82. package/config/templates/education-smb/team.json +40 -0
  83. package/config/templates/education-smb/template.json +26 -0
  84. package/config/templates/education-smb/workflows/course-content-generation.yaml +44 -0
  85. package/config/templates/education-smb/workflows/reporting.yaml +31 -0
  86. package/config/templates/education-smb/workflows/student-communication.yaml +44 -0
  87. package/config/templates/education-smb/workflows.yaml +40 -0
  88. package/config/templates/insurance-smb/README.md +28 -0
  89. package/config/templates/insurance-smb/goals.md +21 -0
  90. package/config/templates/insurance-smb/knowledge/docs/compliance-checklist.md +28 -0
  91. package/config/templates/insurance-smb/knowledge/docs/insurance-industry-context.md +23 -0
  92. package/config/templates/insurance-smb/knowledge/index.json +24 -0
  93. package/config/templates/insurance-smb/learned-patterns.json +16 -0
  94. package/config/templates/insurance-smb/quality-gates.yaml +54 -0
  95. package/config/templates/insurance-smb/roles/claims-processor.md +6 -0
  96. package/config/templates/insurance-smb/roles/client-manager.md +6 -0
  97. package/config/templates/insurance-smb/roles/compliance-officer.md +6 -0
  98. package/config/templates/insurance-smb/roles/marketing-specialist.md +6 -0
  99. package/config/templates/insurance-smb/roles/policy-analyst.md +6 -0
  100. package/config/templates/insurance-smb/team.json +48 -0
  101. package/config/templates/insurance-smb/template.json +26 -0
  102. package/config/templates/insurance-smb/workflows/claims-processing.yaml +48 -0
  103. package/config/templates/insurance-smb/workflows.yaml +43 -0
  104. package/config/templates/research-analysis/template.json +88 -0
  105. package/config/templates/social-media-ops/template.json +85 -0
  106. package/config/templates/video-production/template.json +123 -0
  107. package/dist/backend/backend/src/constants.d.ts +344 -16
  108. package/dist/backend/backend/src/constants.d.ts.map +1 -1
  109. package/dist/backend/backend/src/constants.js +334 -15
  110. package/dist/backend/backend/src/constants.js.map +1 -1
  111. package/dist/backend/backend/src/controllers/auditor/auditor.controller.d.ts +37 -0
  112. package/dist/backend/backend/src/controllers/auditor/auditor.controller.d.ts.map +1 -0
  113. package/dist/backend/backend/src/controllers/auditor/auditor.controller.js +64 -0
  114. package/dist/backend/backend/src/controllers/auditor/auditor.controller.js.map +1 -0
  115. package/dist/backend/backend/src/controllers/auditor/auditor.routes.d.ts +15 -0
  116. package/dist/backend/backend/src/controllers/auditor/auditor.routes.d.ts.map +1 -0
  117. package/dist/backend/backend/src/controllers/auditor/auditor.routes.js +23 -0
  118. package/dist/backend/backend/src/controllers/auditor/auditor.routes.js.map +1 -0
  119. package/dist/backend/backend/src/controllers/chat/chat.controller.d.ts.map +1 -1
  120. package/dist/backend/backend/src/controllers/chat/chat.controller.js +69 -48
  121. package/dist/backend/backend/src/controllers/chat/chat.controller.js.map +1 -1
  122. package/dist/backend/backend/src/controllers/cloud/admin/admin-auth.middleware.d.ts +23 -0
  123. package/dist/backend/backend/src/controllers/cloud/admin/admin-auth.middleware.d.ts.map +1 -0
  124. package/dist/backend/backend/src/controllers/cloud/admin/admin-auth.middleware.js +42 -0
  125. package/dist/backend/backend/src/controllers/cloud/admin/admin-auth.middleware.js.map +1 -0
  126. package/dist/backend/backend/src/controllers/cloud/admin/admin.controller.d.ts +56 -0
  127. package/dist/backend/backend/src/controllers/cloud/admin/admin.controller.d.ts.map +1 -0
  128. package/dist/backend/backend/src/controllers/cloud/admin/admin.controller.js +173 -0
  129. package/dist/backend/backend/src/controllers/cloud/admin/admin.controller.js.map +1 -0
  130. package/dist/backend/backend/src/controllers/cloud/admin/admin.routes.d.ts +22 -0
  131. package/dist/backend/backend/src/controllers/cloud/admin/admin.routes.d.ts.map +1 -0
  132. package/dist/backend/backend/src/controllers/cloud/admin/admin.routes.js +33 -0
  133. package/dist/backend/backend/src/controllers/cloud/admin/admin.routes.js.map +1 -0
  134. package/dist/backend/backend/src/controllers/cloud/admin/index.d.ts +7 -0
  135. package/dist/backend/backend/src/controllers/cloud/admin/index.d.ts.map +1 -0
  136. package/dist/backend/backend/src/controllers/cloud/admin/index.js +7 -0
  137. package/dist/backend/backend/src/controllers/cloud/admin/index.js.map +1 -0
  138. package/dist/backend/backend/src/controllers/cloud/auth/auth.controller.d.ts +81 -0
  139. package/dist/backend/backend/src/controllers/cloud/auth/auth.controller.d.ts.map +1 -0
  140. package/dist/backend/backend/src/controllers/cloud/auth/auth.controller.js +234 -0
  141. package/dist/backend/backend/src/controllers/cloud/auth/auth.controller.js.map +1 -0
  142. package/dist/backend/backend/src/controllers/cloud/auth/auth.routes.d.ts +25 -0
  143. package/dist/backend/backend/src/controllers/cloud/auth/auth.routes.d.ts.map +1 -0
  144. package/dist/backend/backend/src/controllers/cloud/auth/auth.routes.js +38 -0
  145. package/dist/backend/backend/src/controllers/cloud/auth/auth.routes.js.map +1 -0
  146. package/dist/backend/backend/src/controllers/cloud/cloud-auth.controller.d.ts +69 -0
  147. package/dist/backend/backend/src/controllers/cloud/cloud-auth.controller.d.ts.map +1 -0
  148. package/dist/backend/backend/src/controllers/cloud/cloud-auth.controller.js +165 -0
  149. package/dist/backend/backend/src/controllers/cloud/cloud-auth.controller.js.map +1 -0
  150. package/dist/backend/backend/src/controllers/cloud/cloud-auth.routes.d.ts +23 -0
  151. package/dist/backend/backend/src/controllers/cloud/cloud-auth.routes.d.ts.map +1 -0
  152. package/dist/backend/backend/src/controllers/cloud/cloud-auth.routes.js +32 -0
  153. package/dist/backend/backend/src/controllers/cloud/cloud-auth.routes.js.map +1 -0
  154. package/dist/backend/backend/src/controllers/cloud/cloud.controller.d.ts +52 -0
  155. package/dist/backend/backend/src/controllers/cloud/cloud.controller.d.ts.map +1 -0
  156. package/dist/backend/backend/src/controllers/cloud/cloud.controller.js +122 -0
  157. package/dist/backend/backend/src/controllers/cloud/cloud.controller.js.map +1 -0
  158. package/dist/backend/backend/src/controllers/cloud/cloud.routes.d.ts +21 -0
  159. package/dist/backend/backend/src/controllers/cloud/cloud.routes.d.ts.map +1 -0
  160. package/dist/backend/backend/src/controllers/cloud/cloud.routes.js +29 -0
  161. package/dist/backend/backend/src/controllers/cloud/cloud.routes.js.map +1 -0
  162. package/dist/backend/backend/src/controllers/cloud/files/cloud-file.controller.d.ts +42 -0
  163. package/dist/backend/backend/src/controllers/cloud/files/cloud-file.controller.d.ts.map +1 -0
  164. package/dist/backend/backend/src/controllers/cloud/files/cloud-file.controller.js +138 -0
  165. package/dist/backend/backend/src/controllers/cloud/files/cloud-file.controller.js.map +1 -0
  166. package/dist/backend/backend/src/controllers/cloud/files/cloud-file.routes.d.ts +23 -0
  167. package/dist/backend/backend/src/controllers/cloud/files/cloud-file.routes.d.ts.map +1 -0
  168. package/dist/backend/backend/src/controllers/cloud/files/cloud-file.routes.js +34 -0
  169. package/dist/backend/backend/src/controllers/cloud/files/cloud-file.routes.js.map +1 -0
  170. package/dist/backend/backend/src/controllers/cloud/files/cloud-file.types.d.ts +43 -0
  171. package/dist/backend/backend/src/controllers/cloud/files/cloud-file.types.d.ts.map +1 -0
  172. package/dist/backend/backend/src/controllers/cloud/files/cloud-file.types.js +9 -0
  173. package/dist/backend/backend/src/controllers/cloud/files/cloud-file.types.js.map +1 -0
  174. package/dist/backend/backend/src/controllers/cloud/files/index.d.ts +7 -0
  175. package/dist/backend/backend/src/controllers/cloud/files/index.d.ts.map +1 -0
  176. package/dist/backend/backend/src/controllers/cloud/files/index.js +7 -0
  177. package/dist/backend/backend/src/controllers/cloud/files/index.js.map +1 -0
  178. package/dist/backend/backend/src/controllers/cloud/h5/h5-entry.controller.d.ts +47 -0
  179. package/dist/backend/backend/src/controllers/cloud/h5/h5-entry.controller.d.ts.map +1 -0
  180. package/dist/backend/backend/src/controllers/cloud/h5/h5-entry.controller.js +131 -0
  181. package/dist/backend/backend/src/controllers/cloud/h5/h5-entry.controller.js.map +1 -0
  182. package/dist/backend/backend/src/controllers/cloud/h5/h5-entry.routes.d.ts +23 -0
  183. package/dist/backend/backend/src/controllers/cloud/h5/h5-entry.routes.d.ts.map +1 -0
  184. package/dist/backend/backend/src/controllers/cloud/h5/h5-entry.routes.js +30 -0
  185. package/dist/backend/backend/src/controllers/cloud/h5/h5-entry.routes.js.map +1 -0
  186. package/dist/backend/backend/src/controllers/cloud/h5/h5-entry.types.d.ts +81 -0
  187. package/dist/backend/backend/src/controllers/cloud/h5/h5-entry.types.d.ts.map +1 -0
  188. package/dist/backend/backend/src/controllers/cloud/h5/h5-entry.types.js +85 -0
  189. package/dist/backend/backend/src/controllers/cloud/h5/h5-entry.types.js.map +1 -0
  190. package/dist/backend/backend/src/controllers/cloud/h5/index.d.ts +7 -0
  191. package/dist/backend/backend/src/controllers/cloud/h5/index.d.ts.map +1 -0
  192. package/dist/backend/backend/src/controllers/cloud/h5/index.js +7 -0
  193. package/dist/backend/backend/src/controllers/cloud/h5/index.js.map +1 -0
  194. package/dist/backend/backend/src/controllers/cloud/index.d.ts +9 -0
  195. package/dist/backend/backend/src/controllers/cloud/index.d.ts.map +1 -0
  196. package/dist/backend/backend/src/controllers/cloud/index.js +9 -0
  197. package/dist/backend/backend/src/controllers/cloud/index.js.map +1 -0
  198. package/dist/backend/backend/src/controllers/cloud/magic-moment/index.d.ts +7 -0
  199. package/dist/backend/backend/src/controllers/cloud/magic-moment/index.d.ts.map +1 -0
  200. package/dist/backend/backend/src/controllers/cloud/magic-moment/index.js +7 -0
  201. package/dist/backend/backend/src/controllers/cloud/magic-moment/index.js.map +1 -0
  202. package/dist/backend/backend/src/controllers/cloud/magic-moment/magic-moment.controller.d.ts +45 -0
  203. package/dist/backend/backend/src/controllers/cloud/magic-moment/magic-moment.controller.d.ts.map +1 -0
  204. package/dist/backend/backend/src/controllers/cloud/magic-moment/magic-moment.controller.js +155 -0
  205. package/dist/backend/backend/src/controllers/cloud/magic-moment/magic-moment.controller.js.map +1 -0
  206. package/dist/backend/backend/src/controllers/cloud/magic-moment/magic-moment.routes.d.ts +25 -0
  207. package/dist/backend/backend/src/controllers/cloud/magic-moment/magic-moment.routes.d.ts.map +1 -0
  208. package/dist/backend/backend/src/controllers/cloud/magic-moment/magic-moment.routes.js +32 -0
  209. package/dist/backend/backend/src/controllers/cloud/magic-moment/magic-moment.routes.js.map +1 -0
  210. package/dist/backend/backend/src/controllers/cloud/relay.controller.d.ts +62 -0
  211. package/dist/backend/backend/src/controllers/cloud/relay.controller.d.ts.map +1 -0
  212. package/dist/backend/backend/src/controllers/cloud/relay.controller.js +184 -0
  213. package/dist/backend/backend/src/controllers/cloud/relay.controller.js.map +1 -0
  214. package/dist/backend/backend/src/controllers/cloud/relay.routes.d.ts +25 -0
  215. package/dist/backend/backend/src/controllers/cloud/relay.routes.d.ts.map +1 -0
  216. package/dist/backend/backend/src/controllers/cloud/relay.routes.js +34 -0
  217. package/dist/backend/backend/src/controllers/cloud/relay.routes.js.map +1 -0
  218. package/dist/backend/backend/src/controllers/cloud/tasks/cloud-task.controller.d.ts +49 -0
  219. package/dist/backend/backend/src/controllers/cloud/tasks/cloud-task.controller.d.ts.map +1 -0
  220. package/dist/backend/backend/src/controllers/cloud/tasks/cloud-task.controller.js +152 -0
  221. package/dist/backend/backend/src/controllers/cloud/tasks/cloud-task.controller.js.map +1 -0
  222. package/dist/backend/backend/src/controllers/cloud/tasks/cloud-task.routes.d.ts +24 -0
  223. package/dist/backend/backend/src/controllers/cloud/tasks/cloud-task.routes.d.ts.map +1 -0
  224. package/dist/backend/backend/src/controllers/cloud/tasks/cloud-task.routes.js +34 -0
  225. package/dist/backend/backend/src/controllers/cloud/tasks/cloud-task.routes.js.map +1 -0
  226. package/dist/backend/backend/src/controllers/cloud/tasks/cloud-task.types.d.ts +90 -0
  227. package/dist/backend/backend/src/controllers/cloud/tasks/cloud-task.types.d.ts.map +1 -0
  228. package/dist/backend/backend/src/controllers/cloud/tasks/cloud-task.types.js +48 -0
  229. package/dist/backend/backend/src/controllers/cloud/tasks/cloud-task.types.js.map +1 -0
  230. package/dist/backend/backend/src/controllers/cloud/tasks/index.d.ts +10 -0
  231. package/dist/backend/backend/src/controllers/cloud/tasks/index.d.ts.map +1 -0
  232. package/dist/backend/backend/src/controllers/cloud/tasks/index.js +10 -0
  233. package/dist/backend/backend/src/controllers/cloud/tasks/index.js.map +1 -0
  234. package/dist/backend/backend/src/controllers/marketplace/index.d.ts +2 -0
  235. package/dist/backend/backend/src/controllers/marketplace/index.d.ts.map +1 -1
  236. package/dist/backend/backend/src/controllers/marketplace/index.js +3 -0
  237. package/dist/backend/backend/src/controllers/marketplace/index.js.map +1 -1
  238. package/dist/backend/backend/src/controllers/marketplace/marketplace.controller.d.ts +12 -12
  239. package/dist/backend/backend/src/controllers/marketplace/marketplace.controller.d.ts.map +1 -1
  240. package/dist/backend/backend/src/controllers/marketplace/marketplace.controller.js +1 -18
  241. package/dist/backend/backend/src/controllers/marketplace/marketplace.controller.js.map +1 -1
  242. package/dist/backend/backend/src/controllers/marketplace/marketplace.routes.d.ts.map +1 -1
  243. package/dist/backend/backend/src/controllers/marketplace/marketplace.routes.js +3 -0
  244. package/dist/backend/backend/src/controllers/marketplace/marketplace.routes.js.map +1 -1
  245. package/dist/backend/backend/src/controllers/marketplace/template-marketplace.controller.d.ts +111 -0
  246. package/dist/backend/backend/src/controllers/marketplace/template-marketplace.controller.d.ts.map +1 -0
  247. package/dist/backend/backend/src/controllers/marketplace/template-marketplace.controller.js +220 -0
  248. package/dist/backend/backend/src/controllers/marketplace/template-marketplace.controller.js.map +1 -0
  249. package/dist/backend/backend/src/controllers/marketplace/template-marketplace.routes.d.ts +37 -0
  250. package/dist/backend/backend/src/controllers/marketplace/template-marketplace.routes.d.ts.map +1 -0
  251. package/dist/backend/backend/src/controllers/marketplace/template-marketplace.routes.js +54 -0
  252. package/dist/backend/backend/src/controllers/marketplace/template-marketplace.routes.js.map +1 -0
  253. package/dist/backend/backend/src/controllers/messaging/messenger.routes.d.ts.map +1 -1
  254. package/dist/backend/backend/src/controllers/messaging/messenger.routes.js +4 -1
  255. package/dist/backend/backend/src/controllers/messaging/messenger.routes.js.map +1 -1
  256. package/dist/backend/backend/src/controllers/monitoring/terminal.controller.d.ts.map +1 -1
  257. package/dist/backend/backend/src/controllers/monitoring/terminal.controller.js +50 -6
  258. package/dist/backend/backend/src/controllers/monitoring/terminal.controller.js.map +1 -1
  259. package/dist/backend/backend/src/controllers/payment/index.d.ts +7 -0
  260. package/dist/backend/backend/src/controllers/payment/index.d.ts.map +1 -0
  261. package/dist/backend/backend/src/controllers/payment/index.js +7 -0
  262. package/dist/backend/backend/src/controllers/payment/index.js.map +1 -0
  263. package/dist/backend/backend/src/controllers/payment/payment.controller.d.ts +68 -0
  264. package/dist/backend/backend/src/controllers/payment/payment.controller.d.ts.map +1 -0
  265. package/dist/backend/backend/src/controllers/payment/payment.controller.js +136 -0
  266. package/dist/backend/backend/src/controllers/payment/payment.controller.js.map +1 -0
  267. package/dist/backend/backend/src/controllers/payment/payment.routes.d.ts +31 -0
  268. package/dist/backend/backend/src/controllers/payment/payment.routes.d.ts.map +1 -0
  269. package/dist/backend/backend/src/controllers/payment/payment.routes.js +52 -0
  270. package/dist/backend/backend/src/controllers/payment/payment.routes.js.map +1 -0
  271. package/dist/backend/backend/src/controllers/payment/payment.types.d.ts +109 -0
  272. package/dist/backend/backend/src/controllers/payment/payment.types.d.ts.map +1 -0
  273. package/dist/backend/backend/src/controllers/payment/payment.types.js +54 -0
  274. package/dist/backend/backend/src/controllers/payment/payment.types.js.map +1 -0
  275. package/dist/backend/backend/src/controllers/request-types.d.ts +34 -5
  276. package/dist/backend/backend/src/controllers/request-types.d.ts.map +1 -1
  277. package/dist/backend/backend/src/controllers/session/session.controller.d.ts +14 -0
  278. package/dist/backend/backend/src/controllers/session/session.controller.d.ts.map +1 -1
  279. package/dist/backend/backend/src/controllers/session/session.controller.js +48 -0
  280. package/dist/backend/backend/src/controllers/session/session.controller.js.map +1 -1
  281. package/dist/backend/backend/src/controllers/session/session.routes.d.ts.map +1 -1
  282. package/dist/backend/backend/src/controllers/session/session.routes.js +3 -1
  283. package/dist/backend/backend/src/controllers/session/session.routes.js.map +1 -1
  284. package/dist/backend/backend/src/controllers/system/scheduler.controller.d.ts +19 -0
  285. package/dist/backend/backend/src/controllers/system/scheduler.controller.d.ts.map +1 -1
  286. package/dist/backend/backend/src/controllers/system/scheduler.controller.js +55 -3
  287. package/dist/backend/backend/src/controllers/system/scheduler.controller.js.map +1 -1
  288. package/dist/backend/backend/src/controllers/system/system.controller.d.ts.map +1 -1
  289. package/dist/backend/backend/src/controllers/system/system.controller.js +13 -15
  290. package/dist/backend/backend/src/controllers/system/system.controller.js.map +1 -1
  291. package/dist/backend/backend/src/controllers/task-management/assignments.controller.d.ts.map +1 -1
  292. package/dist/backend/backend/src/controllers/task-management/assignments.controller.js.map +1 -1
  293. package/dist/backend/backend/src/controllers/task-management/task-management.controller.d.ts.map +1 -1
  294. package/dist/backend/backend/src/controllers/task-management/task-management.controller.js +40 -4
  295. package/dist/backend/backend/src/controllers/task-management/task-management.controller.js.map +1 -1
  296. package/dist/backend/backend/src/controllers/task-management/tasks.controller.js.map +1 -1
  297. package/dist/backend/backend/src/controllers/team/team.controller.d.ts.map +1 -1
  298. package/dist/backend/backend/src/controllers/team/team.controller.js +272 -18
  299. package/dist/backend/backend/src/controllers/team/team.controller.js.map +1 -1
  300. package/dist/backend/backend/src/controllers/template/index.d.ts +8 -0
  301. package/dist/backend/backend/src/controllers/template/index.d.ts.map +1 -0
  302. package/dist/backend/backend/src/controllers/template/index.js +8 -0
  303. package/dist/backend/backend/src/controllers/template/index.js.map +1 -0
  304. package/dist/backend/backend/src/controllers/template/template.controller.d.ts +63 -0
  305. package/dist/backend/backend/src/controllers/template/template.controller.d.ts.map +1 -0
  306. package/dist/backend/backend/src/controllers/template/template.controller.js +112 -0
  307. package/dist/backend/backend/src/controllers/template/template.controller.js.map +1 -0
  308. package/dist/backend/backend/src/controllers/template/template.routes.d.ts +24 -0
  309. package/dist/backend/backend/src/controllers/template/template.routes.d.ts.map +1 -0
  310. package/dist/backend/backend/src/controllers/template/template.routes.js +33 -0
  311. package/dist/backend/backend/src/controllers/template/template.routes.js.map +1 -0
  312. package/dist/backend/backend/src/index.d.ts.map +1 -1
  313. package/dist/backend/backend/src/index.js +106 -13
  314. package/dist/backend/backend/src/index.js.map +1 -1
  315. package/dist/backend/backend/src/middleware/agent-heartbeat.middleware.js +3 -3
  316. package/dist/backend/backend/src/middleware/agent-heartbeat.middleware.js.map +1 -1
  317. package/dist/backend/backend/src/models/Team.d.ts +5 -0
  318. package/dist/backend/backend/src/models/Team.d.ts.map +1 -1
  319. package/dist/backend/backend/src/models/Team.js +24 -0
  320. package/dist/backend/backend/src/models/Team.js.map +1 -1
  321. package/dist/backend/backend/src/routes/api.routes.d.ts.map +1 -1
  322. package/dist/backend/backend/src/routes/api.routes.js +13 -0
  323. package/dist/backend/backend/src/routes/api.routes.js.map +1 -1
  324. package/dist/backend/backend/src/routes/modules/log-rotation.routes.d.ts +8 -0
  325. package/dist/backend/backend/src/routes/modules/log-rotation.routes.d.ts.map +1 -0
  326. package/dist/backend/backend/src/routes/modules/log-rotation.routes.js +62 -0
  327. package/dist/backend/backend/src/routes/modules/log-rotation.routes.js.map +1 -0
  328. package/dist/backend/backend/src/routes/modules/scheduler.routes.d.ts.map +1 -1
  329. package/dist/backend/backend/src/routes/modules/scheduler.routes.js +2 -0
  330. package/dist/backend/backend/src/routes/modules/scheduler.routes.js.map +1 -1
  331. package/dist/backend/backend/src/scripts/run-log-rotation.d.ts +3 -0
  332. package/dist/backend/backend/src/scripts/run-log-rotation.d.ts.map +1 -0
  333. package/dist/backend/backend/src/scripts/run-log-rotation.js +31 -0
  334. package/dist/backend/backend/src/scripts/run-log-rotation.js.map +1 -0
  335. package/dist/backend/backend/src/services/agent/agent-registration.service.d.ts +11 -6
  336. package/dist/backend/backend/src/services/agent/agent-registration.service.d.ts.map +1 -1
  337. package/dist/backend/backend/src/services/agent/agent-registration.service.js +296 -288
  338. package/dist/backend/backend/src/services/agent/agent-registration.service.js.map +1 -1
  339. package/dist/backend/backend/src/services/agent/auditor-scheduler.service.d.ts +150 -0
  340. package/dist/backend/backend/src/services/agent/auditor-scheduler.service.d.ts.map +1 -0
  341. package/dist/backend/backend/src/services/agent/auditor-scheduler.service.js +307 -0
  342. package/dist/backend/backend/src/services/agent/auditor-scheduler.service.js.map +1 -0
  343. package/dist/backend/backend/src/services/agent/claude-runtime.service.d.ts +7 -1
  344. package/dist/backend/backend/src/services/agent/claude-runtime.service.d.ts.map +1 -1
  345. package/dist/backend/backend/src/services/agent/claude-runtime.service.js +11 -2
  346. package/dist/backend/backend/src/services/agent/claude-runtime.service.js.map +1 -1
  347. package/dist/backend/backend/src/services/agent/crewly-agent/agent-runner.service.d.ts +105 -0
  348. package/dist/backend/backend/src/services/agent/crewly-agent/agent-runner.service.d.ts.map +1 -0
  349. package/dist/backend/backend/src/services/agent/crewly-agent/agent-runner.service.js +199 -0
  350. package/dist/backend/backend/src/services/agent/crewly-agent/agent-runner.service.js.map +1 -0
  351. package/dist/backend/backend/src/services/agent/crewly-agent/api-client.d.ts +68 -0
  352. package/dist/backend/backend/src/services/agent/crewly-agent/api-client.d.ts.map +1 -0
  353. package/dist/backend/backend/src/services/agent/crewly-agent/api-client.js +131 -0
  354. package/dist/backend/backend/src/services/agent/crewly-agent/api-client.js.map +1 -0
  355. package/dist/backend/backend/src/services/agent/crewly-agent/auditor-tools.d.ts +29 -0
  356. package/dist/backend/backend/src/services/agent/crewly-agent/auditor-tools.d.ts.map +1 -0
  357. package/dist/backend/backend/src/services/agent/crewly-agent/auditor-tools.js +229 -0
  358. package/dist/backend/backend/src/services/agent/crewly-agent/auditor-tools.js.map +1 -0
  359. package/dist/backend/backend/src/services/agent/crewly-agent/crewly-agent-runtime.service.d.ts +127 -0
  360. package/dist/backend/backend/src/services/agent/crewly-agent/crewly-agent-runtime.service.d.ts.map +1 -0
  361. package/dist/backend/backend/src/services/agent/crewly-agent/crewly-agent-runtime.service.js +242 -0
  362. package/dist/backend/backend/src/services/agent/crewly-agent/crewly-agent-runtime.service.js.map +1 -0
  363. package/dist/backend/backend/src/services/agent/crewly-agent/in-process-log-buffer.d.ts +95 -0
  364. package/dist/backend/backend/src/services/agent/crewly-agent/in-process-log-buffer.d.ts.map +1 -0
  365. package/dist/backend/backend/src/services/agent/crewly-agent/in-process-log-buffer.js +130 -0
  366. package/dist/backend/backend/src/services/agent/crewly-agent/in-process-log-buffer.js.map +1 -0
  367. package/dist/backend/backend/src/services/agent/crewly-agent/index.d.ts +14 -0
  368. package/dist/backend/backend/src/services/agent/crewly-agent/index.d.ts.map +1 -0
  369. package/dist/backend/backend/src/services/agent/crewly-agent/index.js +14 -0
  370. package/dist/backend/backend/src/services/agent/crewly-agent/index.js.map +1 -0
  371. package/dist/backend/backend/src/services/agent/crewly-agent/model-manager.d.ts +57 -0
  372. package/dist/backend/backend/src/services/agent/crewly-agent/model-manager.d.ts.map +1 -0
  373. package/dist/backend/backend/src/services/agent/crewly-agent/model-manager.js +93 -0
  374. package/dist/backend/backend/src/services/agent/crewly-agent/model-manager.js.map +1 -0
  375. package/dist/backend/backend/src/services/agent/crewly-agent/smoke-test.d.ts +13 -0
  376. package/dist/backend/backend/src/services/agent/crewly-agent/smoke-test.d.ts.map +1 -0
  377. package/dist/backend/backend/src/services/agent/crewly-agent/smoke-test.js +91 -0
  378. package/dist/backend/backend/src/services/agent/crewly-agent/smoke-test.js.map +1 -0
  379. package/dist/backend/backend/src/services/agent/crewly-agent/tool-registry.d.ts +29 -0
  380. package/dist/backend/backend/src/services/agent/crewly-agent/tool-registry.d.ts.map +1 -0
  381. package/dist/backend/backend/src/services/agent/crewly-agent/tool-registry.js +519 -0
  382. package/dist/backend/backend/src/services/agent/crewly-agent/tool-registry.js.map +1 -0
  383. package/dist/backend/backend/src/services/agent/crewly-agent/types.d.ts +159 -0
  384. package/dist/backend/backend/src/services/agent/crewly-agent/types.d.ts.map +1 -0
  385. package/dist/backend/backend/src/services/agent/crewly-agent/types.js +63 -0
  386. package/dist/backend/backend/src/services/agent/crewly-agent/types.js.map +1 -0
  387. package/dist/backend/backend/src/services/agent/gemini-runtime.service.d.ts +1 -0
  388. package/dist/backend/backend/src/services/agent/gemini-runtime.service.d.ts.map +1 -1
  389. package/dist/backend/backend/src/services/agent/gemini-runtime.service.js +30 -43
  390. package/dist/backend/backend/src/services/agent/gemini-runtime.service.js.map +1 -1
  391. package/dist/backend/backend/src/services/agent/oauth-relogin-monitor.service.d.ts +216 -0
  392. package/dist/backend/backend/src/services/agent/oauth-relogin-monitor.service.d.ts.map +1 -0
  393. package/dist/backend/backend/src/services/agent/oauth-relogin-monitor.service.js +496 -0
  394. package/dist/backend/backend/src/services/agent/oauth-relogin-monitor.service.js.map +1 -0
  395. package/dist/backend/backend/src/services/agent/openhands-runtime.service.d.ts +70 -0
  396. package/dist/backend/backend/src/services/agent/openhands-runtime.service.d.ts.map +1 -0
  397. package/dist/backend/backend/src/services/agent/openhands-runtime.service.js +131 -0
  398. package/dist/backend/backend/src/services/agent/openhands-runtime.service.js.map +1 -0
  399. package/dist/backend/backend/src/services/agent/pty-activity-tracker.service.d.ts +21 -1
  400. package/dist/backend/backend/src/services/agent/pty-activity-tracker.service.d.ts.map +1 -1
  401. package/dist/backend/backend/src/services/agent/pty-activity-tracker.service.js +32 -1
  402. package/dist/backend/backend/src/services/agent/pty-activity-tracker.service.js.map +1 -1
  403. package/dist/backend/backend/src/services/agent/runtime-exit-monitor.service.d.ts +133 -4
  404. package/dist/backend/backend/src/services/agent/runtime-exit-monitor.service.d.ts.map +1 -1
  405. package/dist/backend/backend/src/services/agent/runtime-exit-monitor.service.js +492 -183
  406. package/dist/backend/backend/src/services/agent/runtime-exit-monitor.service.js.map +1 -1
  407. package/dist/backend/backend/src/services/agent/runtime-service.factory.d.ts.map +1 -1
  408. package/dist/backend/backend/src/services/agent/runtime-service.factory.js +9 -0
  409. package/dist/backend/backend/src/services/agent/runtime-service.factory.js.map +1 -1
  410. package/dist/backend/backend/src/services/ai/prompt-builder.service.d.ts +49 -2
  411. package/dist/backend/backend/src/services/ai/prompt-builder.service.d.ts.map +1 -1
  412. package/dist/backend/backend/src/services/ai/prompt-builder.service.js +124 -2
  413. package/dist/backend/backend/src/services/ai/prompt-builder.service.js.map +1 -1
  414. package/dist/backend/backend/src/services/chat/chat.service.d.ts +17 -3
  415. package/dist/backend/backend/src/services/chat/chat.service.d.ts.map +1 -1
  416. package/dist/backend/backend/src/services/chat/chat.service.js +63 -13
  417. package/dist/backend/backend/src/services/chat/chat.service.js.map +1 -1
  418. package/dist/backend/backend/src/services/cloud/admin-seed.service.d.ts +18 -0
  419. package/dist/backend/backend/src/services/cloud/admin-seed.service.d.ts.map +1 -0
  420. package/dist/backend/backend/src/services/cloud/admin-seed.service.js +50 -0
  421. package/dist/backend/backend/src/services/cloud/admin-seed.service.js.map +1 -0
  422. package/dist/backend/backend/src/services/cloud/auth/auth.service.d.ts +174 -0
  423. package/dist/backend/backend/src/services/cloud/auth/auth.service.d.ts.map +1 -0
  424. package/dist/backend/backend/src/services/cloud/auth/auth.service.js +402 -0
  425. package/dist/backend/backend/src/services/cloud/auth/auth.service.js.map +1 -0
  426. package/dist/backend/backend/src/services/cloud/auth/auth.types.d.ts +110 -0
  427. package/dist/backend/backend/src/services/cloud/auth/auth.types.d.ts.map +1 -0
  428. package/dist/backend/backend/src/services/cloud/auth/auth.types.js +54 -0
  429. package/dist/backend/backend/src/services/cloud/auth/auth.types.js.map +1 -0
  430. package/dist/backend/backend/src/services/cloud/auth/auth.utils.d.ts +36 -0
  431. package/dist/backend/backend/src/services/cloud/auth/auth.utils.d.ts.map +1 -0
  432. package/dist/backend/backend/src/services/cloud/auth/auth.utils.js +31 -0
  433. package/dist/backend/backend/src/services/cloud/auth/auth.utils.js.map +1 -0
  434. package/dist/backend/backend/src/services/cloud/auth/jwt-auth.middleware.d.ts +47 -0
  435. package/dist/backend/backend/src/services/cloud/auth/jwt-auth.middleware.d.ts.map +1 -0
  436. package/dist/backend/backend/src/services/cloud/auth/jwt-auth.middleware.js +116 -0
  437. package/dist/backend/backend/src/services/cloud/auth/jwt-auth.middleware.js.map +1 -0
  438. package/dist/backend/backend/src/services/cloud/auth/supabase-auth.middleware.d.ts +61 -0
  439. package/dist/backend/backend/src/services/cloud/auth/supabase-auth.middleware.d.ts.map +1 -0
  440. package/dist/backend/backend/src/services/cloud/auth/supabase-auth.middleware.js +203 -0
  441. package/dist/backend/backend/src/services/cloud/auth/supabase-auth.middleware.js.map +1 -0
  442. package/dist/backend/backend/src/services/cloud/cloud-auth.middleware.d.ts +46 -0
  443. package/dist/backend/backend/src/services/cloud/cloud-auth.middleware.d.ts.map +1 -0
  444. package/dist/backend/backend/src/services/cloud/cloud-auth.middleware.js +95 -0
  445. package/dist/backend/backend/src/services/cloud/cloud-auth.middleware.js.map +1 -0
  446. package/dist/backend/backend/src/services/cloud/cloud-auth.service.d.ts +136 -0
  447. package/dist/backend/backend/src/services/cloud/cloud-auth.service.d.ts.map +1 -0
  448. package/dist/backend/backend/src/services/cloud/cloud-auth.service.js +204 -0
  449. package/dist/backend/backend/src/services/cloud/cloud-auth.service.js.map +1 -0
  450. package/dist/backend/backend/src/services/cloud/cloud-client.service.d.ts +179 -0
  451. package/dist/backend/backend/src/services/cloud/cloud-client.service.d.ts.map +1 -0
  452. package/dist/backend/backend/src/services/cloud/cloud-client.service.js +237 -0
  453. package/dist/backend/backend/src/services/cloud/cloud-client.service.js.map +1 -0
  454. package/dist/backend/backend/src/services/cloud/cloud-features.d.ts +19 -0
  455. package/dist/backend/backend/src/services/cloud/cloud-features.d.ts.map +1 -0
  456. package/dist/backend/backend/src/services/cloud/cloud-features.js +23 -0
  457. package/dist/backend/backend/src/services/cloud/cloud-features.js.map +1 -0
  458. package/dist/backend/backend/src/services/cloud/cloud-file.service.d.ts +97 -0
  459. package/dist/backend/backend/src/services/cloud/cloud-file.service.d.ts.map +1 -0
  460. package/dist/backend/backend/src/services/cloud/cloud-file.service.js +184 -0
  461. package/dist/backend/backend/src/services/cloud/cloud-file.service.js.map +1 -0
  462. package/dist/backend/backend/src/services/cloud/cloud-image-analysis.service.d.ts +114 -0
  463. package/dist/backend/backend/src/services/cloud/cloud-image-analysis.service.d.ts.map +1 -0
  464. package/dist/backend/backend/src/services/cloud/cloud-image-analysis.service.js +196 -0
  465. package/dist/backend/backend/src/services/cloud/cloud-image-analysis.service.js.map +1 -0
  466. package/dist/backend/backend/src/services/cloud/cloud-task-processor.service.d.ts +118 -0
  467. package/dist/backend/backend/src/services/cloud/cloud-task-processor.service.d.ts.map +1 -0
  468. package/dist/backend/backend/src/services/cloud/cloud-task-processor.service.js +326 -0
  469. package/dist/backend/backend/src/services/cloud/cloud-task-processor.service.js.map +1 -0
  470. package/dist/backend/backend/src/services/cloud/cloud-task.service.d.ts +115 -0
  471. package/dist/backend/backend/src/services/cloud/cloud-task.service.d.ts.map +1 -0
  472. package/dist/backend/backend/src/services/cloud/cloud-task.service.js +265 -0
  473. package/dist/backend/backend/src/services/cloud/cloud-task.service.js.map +1 -0
  474. package/dist/backend/backend/src/services/cloud/mongodb.service.d.ts +45 -0
  475. package/dist/backend/backend/src/services/cloud/mongodb.service.d.ts.map +1 -0
  476. package/dist/backend/backend/src/services/cloud/mongodb.service.js +76 -0
  477. package/dist/backend/backend/src/services/cloud/mongodb.service.js.map +1 -0
  478. package/dist/backend/backend/src/services/cloud/relay-client.service.d.ts +175 -0
  479. package/dist/backend/backend/src/services/cloud/relay-client.service.d.ts.map +1 -0
  480. package/dist/backend/backend/src/services/cloud/relay-client.service.js +392 -0
  481. package/dist/backend/backend/src/services/cloud/relay-client.service.js.map +1 -0
  482. package/dist/backend/backend/src/services/cloud/relay-crypto.service.d.ts +87 -0
  483. package/dist/backend/backend/src/services/cloud/relay-crypto.service.d.ts.map +1 -0
  484. package/dist/backend/backend/src/services/cloud/relay-crypto.service.js +140 -0
  485. package/dist/backend/backend/src/services/cloud/relay-crypto.service.js.map +1 -0
  486. package/dist/backend/backend/src/services/cloud/relay-server.service.d.ts +181 -0
  487. package/dist/backend/backend/src/services/cloud/relay-server.service.d.ts.map +1 -0
  488. package/dist/backend/backend/src/services/cloud/relay-server.service.js +494 -0
  489. package/dist/backend/backend/src/services/cloud/relay-server.service.js.map +1 -0
  490. package/dist/backend/backend/src/services/cloud/relay.types.d.ts +170 -0
  491. package/dist/backend/backend/src/services/cloud/relay.types.d.ts.map +1 -0
  492. package/dist/backend/backend/src/services/cloud/relay.types.js +69 -0
  493. package/dist/backend/backend/src/services/cloud/relay.types.js.map +1 -0
  494. package/dist/backend/backend/src/services/continuation/continuation.service.d.ts.map +1 -1
  495. package/dist/backend/backend/src/services/continuation/continuation.service.js +5 -10
  496. package/dist/backend/backend/src/services/continuation/continuation.service.js.map +1 -1
  497. package/dist/backend/backend/src/services/continuation/patterns/idle-patterns.d.ts +9 -1
  498. package/dist/backend/backend/src/services/continuation/patterns/idle-patterns.d.ts.map +1 -1
  499. package/dist/backend/backend/src/services/continuation/patterns/idle-patterns.js +18 -4
  500. package/dist/backend/backend/src/services/continuation/patterns/idle-patterns.js.map +1 -1
  501. package/dist/backend/backend/src/services/core/env.config.d.ts +147 -0
  502. package/dist/backend/backend/src/services/core/env.config.d.ts.map +1 -0
  503. package/dist/backend/backend/src/services/core/env.config.js +226 -0
  504. package/dist/backend/backend/src/services/core/env.config.js.map +1 -0
  505. package/dist/backend/backend/src/services/core/storage.service.d.ts.map +1 -1
  506. package/dist/backend/backend/src/services/core/storage.service.js +5 -0
  507. package/dist/backend/backend/src/services/core/storage.service.js.map +1 -1
  508. package/dist/backend/backend/src/services/event-bus/event-bus.service.d.ts +30 -2
  509. package/dist/backend/backend/src/services/event-bus/event-bus.service.d.ts.map +1 -1
  510. package/dist/backend/backend/src/services/event-bus/event-bus.service.js +82 -12
  511. package/dist/backend/backend/src/services/event-bus/event-bus.service.js.map +1 -1
  512. package/dist/backend/backend/src/services/hierarchy/hierarchy-escalation.service.d.ts +160 -0
  513. package/dist/backend/backend/src/services/hierarchy/hierarchy-escalation.service.d.ts.map +1 -0
  514. package/dist/backend/backend/src/services/hierarchy/hierarchy-escalation.service.js +261 -0
  515. package/dist/backend/backend/src/services/hierarchy/hierarchy-escalation.service.js.map +1 -0
  516. package/dist/backend/backend/src/services/hierarchy/hierarchy-reporting.service.d.ts +161 -0
  517. package/dist/backend/backend/src/services/hierarchy/hierarchy-reporting.service.d.ts.map +1 -0
  518. package/dist/backend/backend/src/services/hierarchy/hierarchy-reporting.service.js +276 -0
  519. package/dist/backend/backend/src/services/hierarchy/hierarchy-reporting.service.js.map +1 -0
  520. package/dist/backend/backend/src/services/marketplace/index.d.ts +1 -0
  521. package/dist/backend/backend/src/services/marketplace/index.d.ts.map +1 -1
  522. package/dist/backend/backend/src/services/marketplace/index.js +2 -0
  523. package/dist/backend/backend/src/services/marketplace/index.js.map +1 -1
  524. package/dist/backend/backend/src/services/marketplace/marketplace.service.js +2 -2
  525. package/dist/backend/backend/src/services/marketplace/template-marketplace.service.d.ts +149 -0
  526. package/dist/backend/backend/src/services/marketplace/template-marketplace.service.d.ts.map +1 -0
  527. package/dist/backend/backend/src/services/marketplace/template-marketplace.service.js +500 -0
  528. package/dist/backend/backend/src/services/marketplace/template-marketplace.service.js.map +1 -0
  529. package/dist/backend/backend/src/services/mcp-server.js +1 -1
  530. package/dist/backend/backend/src/services/mcp-server.js.map +1 -1
  531. package/dist/backend/backend/src/services/messaging/adapters/google-chat-messenger.adapter.d.ts +90 -0
  532. package/dist/backend/backend/src/services/messaging/adapters/google-chat-messenger.adapter.d.ts.map +1 -0
  533. package/dist/backend/backend/src/services/messaging/adapters/google-chat-messenger.adapter.js +233 -0
  534. package/dist/backend/backend/src/services/messaging/adapters/google-chat-messenger.adapter.js.map +1 -0
  535. package/dist/backend/backend/src/services/messaging/message-queue.service.d.ts.map +1 -1
  536. package/dist/backend/backend/src/services/messaging/message-queue.service.js +1 -0
  537. package/dist/backend/backend/src/services/messaging/message-queue.service.js.map +1 -1
  538. package/dist/backend/backend/src/services/messaging/messenger-adapter.interface.d.ts +1 -1
  539. package/dist/backend/backend/src/services/messaging/messenger-adapter.interface.d.ts.map +1 -1
  540. package/dist/backend/backend/src/services/messaging/queue-processor.service.d.ts.map +1 -1
  541. package/dist/backend/backend/src/services/messaging/queue-processor.service.js +23 -5
  542. package/dist/backend/backend/src/services/messaging/queue-processor.service.js.map +1 -1
  543. package/dist/backend/backend/src/services/monitoring/activity-monitor.service.d.ts.map +1 -1
  544. package/dist/backend/backend/src/services/monitoring/activity-monitor.service.js +3 -3
  545. package/dist/backend/backend/src/services/monitoring/activity-monitor.service.js.map +1 -1
  546. package/dist/backend/backend/src/services/orchestrator/orchestrator-heartbeat-monitor.service.d.ts.map +1 -1
  547. package/dist/backend/backend/src/services/orchestrator/orchestrator-heartbeat-monitor.service.js +29 -5
  548. package/dist/backend/backend/src/services/orchestrator/orchestrator-heartbeat-monitor.service.js.map +1 -1
  549. package/dist/backend/backend/src/services/orchestrator/orchestrator-restart.service.d.ts.map +1 -1
  550. package/dist/backend/backend/src/services/orchestrator/orchestrator-restart.service.js +6 -0
  551. package/dist/backend/backend/src/services/orchestrator/orchestrator-restart.service.js.map +1 -1
  552. package/dist/backend/backend/src/services/payment/magic-moment.service.d.ts +69 -0
  553. package/dist/backend/backend/src/services/payment/magic-moment.service.d.ts.map +1 -0
  554. package/dist/backend/backend/src/services/payment/magic-moment.service.js +158 -0
  555. package/dist/backend/backend/src/services/payment/magic-moment.service.js.map +1 -0
  556. package/dist/backend/backend/src/services/payment/magic-moment.types.d.ts +95 -0
  557. package/dist/backend/backend/src/services/payment/magic-moment.types.d.ts.map +1 -0
  558. package/dist/backend/backend/src/services/payment/magic-moment.types.js +91 -0
  559. package/dist/backend/backend/src/services/payment/magic-moment.types.js.map +1 -0
  560. package/dist/backend/backend/src/services/payment/stripe.service.d.ts +83 -0
  561. package/dist/backend/backend/src/services/payment/stripe.service.d.ts.map +1 -0
  562. package/dist/backend/backend/src/services/payment/stripe.service.js +279 -0
  563. package/dist/backend/backend/src/services/payment/stripe.service.js.map +1 -0
  564. package/dist/backend/backend/src/services/plugin/index.d.ts +9 -0
  565. package/dist/backend/backend/src/services/plugin/index.d.ts.map +1 -0
  566. package/dist/backend/backend/src/services/plugin/index.js +8 -0
  567. package/dist/backend/backend/src/services/plugin/index.js.map +1 -0
  568. package/dist/backend/backend/src/services/plugin/plugin.service.d.ts +102 -0
  569. package/dist/backend/backend/src/services/plugin/plugin.service.d.ts.map +1 -0
  570. package/dist/backend/backend/src/services/plugin/plugin.service.js +179 -0
  571. package/dist/backend/backend/src/services/plugin/plugin.service.js.map +1 -0
  572. package/dist/backend/backend/src/services/plugin/plugin.types.d.ts +88 -0
  573. package/dist/backend/backend/src/services/plugin/plugin.types.d.ts.map +1 -0
  574. package/dist/backend/backend/src/services/plugin/plugin.types.js +17 -0
  575. package/dist/backend/backend/src/services/plugin/plugin.types.js.map +1 -0
  576. package/dist/backend/backend/src/services/project/task-tracking.service.d.ts +17 -0
  577. package/dist/backend/backend/src/services/project/task-tracking.service.d.ts.map +1 -1
  578. package/dist/backend/backend/src/services/project/task-tracking.service.js +63 -0
  579. package/dist/backend/backend/src/services/project/task-tracking.service.js.map +1 -1
  580. package/dist/backend/backend/src/services/session/index.d.ts +2 -0
  581. package/dist/backend/backend/src/services/session/index.d.ts.map +1 -1
  582. package/dist/backend/backend/src/services/session/index.js +2 -0
  583. package/dist/backend/backend/src/services/session/index.js.map +1 -1
  584. package/dist/backend/backend/src/services/session/log-rotation.service.d.ts +163 -0
  585. package/dist/backend/backend/src/services/session/log-rotation.service.d.ts.map +1 -0
  586. package/dist/backend/backend/src/services/session/log-rotation.service.js +362 -0
  587. package/dist/backend/backend/src/services/session/log-rotation.service.js.map +1 -0
  588. package/dist/backend/backend/src/services/session/session-command-helper.d.ts +14 -0
  589. package/dist/backend/backend/src/services/session/session-command-helper.d.ts.map +1 -1
  590. package/dist/backend/backend/src/services/session/session-command-helper.js +54 -0
  591. package/dist/backend/backend/src/services/session/session-command-helper.js.map +1 -1
  592. package/dist/backend/backend/src/services/settings/settings.service.d.ts.map +1 -1
  593. package/dist/backend/backend/src/services/settings/settings.service.js +1 -0
  594. package/dist/backend/backend/src/services/settings/settings.service.js.map +1 -1
  595. package/dist/backend/backend/src/services/slack/slack-orchestrator-bridge.d.ts +11 -0
  596. package/dist/backend/backend/src/services/slack/slack-orchestrator-bridge.d.ts.map +1 -1
  597. package/dist/backend/backend/src/services/slack/slack-orchestrator-bridge.js +98 -6
  598. package/dist/backend/backend/src/services/slack/slack-orchestrator-bridge.js.map +1 -1
  599. package/dist/backend/backend/src/services/template/template.service.d.ts +118 -0
  600. package/dist/backend/backend/src/services/template/template.service.d.ts.map +1 -0
  601. package/dist/backend/backend/src/services/template/template.service.js +299 -0
  602. package/dist/backend/backend/src/services/template/template.service.js.map +1 -0
  603. package/dist/backend/backend/src/services/workflow/scheduler.service.d.ts +86 -0
  604. package/dist/backend/backend/src/services/workflow/scheduler.service.d.ts.map +1 -1
  605. package/dist/backend/backend/src/services/workflow/scheduler.service.js +251 -2
  606. package/dist/backend/backend/src/services/workflow/scheduler.service.js.map +1 -1
  607. package/dist/backend/backend/src/types/chat.types.d.ts +39 -1
  608. package/dist/backend/backend/src/types/chat.types.d.ts.map +1 -1
  609. package/dist/backend/backend/src/types/chat.types.js +65 -18
  610. package/dist/backend/backend/src/types/chat.types.js.map +1 -1
  611. package/dist/backend/backend/src/types/event-bus.types.d.ts +45 -2
  612. package/dist/backend/backend/src/types/event-bus.types.d.ts.map +1 -1
  613. package/dist/backend/backend/src/types/event-bus.types.js +65 -0
  614. package/dist/backend/backend/src/types/event-bus.types.js.map +1 -1
  615. package/dist/backend/backend/src/types/hierarchy-message.types.d.ts +101 -0
  616. package/dist/backend/backend/src/types/hierarchy-message.types.d.ts.map +1 -0
  617. package/dist/backend/backend/src/types/hierarchy-message.types.js +15 -0
  618. package/dist/backend/backend/src/types/hierarchy-message.types.js.map +1 -0
  619. package/dist/backend/backend/src/types/index.d.ts +54 -4
  620. package/dist/backend/backend/src/types/index.d.ts.map +1 -1
  621. package/dist/backend/backend/src/types/index.js.map +1 -1
  622. package/dist/backend/backend/src/types/marketplace.types.d.ts +99 -0
  623. package/dist/backend/backend/src/types/marketplace.types.d.ts.map +1 -1
  624. package/dist/backend/backend/src/types/messaging.types.d.ts +4 -0
  625. package/dist/backend/backend/src/types/messaging.types.d.ts.map +1 -1
  626. package/dist/backend/backend/src/types/messaging.types.js.map +1 -1
  627. package/dist/backend/backend/src/types/settings.types.d.ts +1 -1
  628. package/dist/backend/backend/src/types/settings.types.d.ts.map +1 -1
  629. package/dist/backend/backend/src/types/settings.types.js +4 -0
  630. package/dist/backend/backend/src/types/settings.types.js.map +1 -1
  631. package/dist/backend/backend/src/types/task-tracking.types.d.ts +79 -1
  632. package/dist/backend/backend/src/types/task-tracking.types.d.ts.map +1 -1
  633. package/dist/backend/backend/src/types/task-tracking.types.js.map +1 -1
  634. package/dist/backend/backend/src/types/team-template.types.d.ts +166 -0
  635. package/dist/backend/backend/src/types/team-template.types.d.ts.map +1 -0
  636. package/dist/backend/backend/src/types/team-template.types.js +139 -0
  637. package/dist/backend/backend/src/types/team-template.types.js.map +1 -0
  638. package/dist/backend/backend/src/utils/async-handler.d.ts +20 -0
  639. package/dist/backend/backend/src/utils/async-handler.d.ts.map +1 -0
  640. package/dist/backend/backend/src/utils/async-handler.js +29 -0
  641. package/dist/backend/backend/src/utils/async-handler.js.map +1 -0
  642. package/dist/backend/backend/src/utils/defaultPrompts.d.ts +4 -4
  643. package/dist/backend/backend/src/utils/defaultPrompts.d.ts.map +1 -1
  644. package/dist/backend/backend/src/utils/defaultPrompts.js +16 -0
  645. package/dist/backend/backend/src/utils/defaultPrompts.js.map +1 -1
  646. package/dist/backend/backend/src/utils/gemini-trusted-folders.d.ts +43 -0
  647. package/dist/backend/backend/src/utils/gemini-trusted-folders.d.ts.map +1 -0
  648. package/dist/backend/backend/src/utils/gemini-trusted-folders.js +94 -0
  649. package/dist/backend/backend/src/utils/gemini-trusted-folders.js.map +1 -0
  650. package/dist/backend/backend/src/utils/message-serializer.d.ts +74 -0
  651. package/dist/backend/backend/src/utils/message-serializer.d.ts.map +1 -0
  652. package/dist/backend/backend/src/utils/message-serializer.js +380 -0
  653. package/dist/backend/backend/src/utils/message-serializer.js.map +1 -0
  654. package/dist/backend/backend/src/utils/terminal-string-ops.d.ts.map +1 -1
  655. package/dist/backend/backend/src/utils/terminal-string-ops.js +20 -11
  656. package/dist/backend/backend/src/utils/terminal-string-ops.js.map +1 -1
  657. package/dist/backend/backend/src/websocket/terminal.gateway.d.ts +4 -4
  658. package/dist/backend/backend/src/websocket/terminal.gateway.d.ts.map +1 -1
  659. package/dist/backend/backend/src/websocket/terminal.gateway.js +9 -6
  660. package/dist/backend/backend/src/websocket/terminal.gateway.js.map +1 -1
  661. package/dist/backend/config/constants.d.ts +44 -3
  662. package/dist/backend/config/constants.d.ts.map +1 -1
  663. package/dist/backend/config/constants.js +45 -3
  664. package/dist/backend/config/constants.js.map +1 -1
  665. package/dist/backend/config/index.d.ts +2 -2
  666. package/dist/backend/config/index.d.ts.map +1 -1
  667. package/dist/backend/config/index.js +2 -2
  668. package/dist/backend/config/index.js.map +1 -1
  669. package/dist/cli/backend/src/constants.d.ts +344 -16
  670. package/dist/cli/backend/src/constants.d.ts.map +1 -1
  671. package/dist/cli/backend/src/constants.js +334 -15
  672. package/dist/cli/backend/src/constants.js.map +1 -1
  673. package/dist/cli/backend/src/models/Team.d.ts +5 -0
  674. package/dist/cli/backend/src/models/Team.d.ts.map +1 -1
  675. package/dist/cli/backend/src/models/Team.js +24 -0
  676. package/dist/cli/backend/src/models/Team.js.map +1 -1
  677. package/dist/cli/backend/src/services/core/storage.service.d.ts.map +1 -1
  678. package/dist/cli/backend/src/services/core/storage.service.js +5 -0
  679. package/dist/cli/backend/src/services/core/storage.service.js.map +1 -1
  680. package/dist/cli/backend/src/services/mcp-server.js +1 -1
  681. package/dist/cli/backend/src/services/mcp-server.js.map +1 -1
  682. package/dist/cli/backend/src/types/chat.types.d.ts +39 -1
  683. package/dist/cli/backend/src/types/chat.types.d.ts.map +1 -1
  684. package/dist/cli/backend/src/types/chat.types.js +65 -18
  685. package/dist/cli/backend/src/types/chat.types.js.map +1 -1
  686. package/dist/cli/backend/src/types/index.d.ts +54 -4
  687. package/dist/cli/backend/src/types/index.d.ts.map +1 -1
  688. package/dist/cli/backend/src/types/index.js.map +1 -1
  689. package/dist/cli/backend/src/types/settings.types.d.ts +1 -1
  690. package/dist/cli/backend/src/types/settings.types.d.ts.map +1 -1
  691. package/dist/cli/backend/src/types/settings.types.js +4 -0
  692. package/dist/cli/backend/src/types/settings.types.js.map +1 -1
  693. package/dist/cli/backend/src/utils/gemini-trusted-folders.d.ts +43 -0
  694. package/dist/cli/backend/src/utils/gemini-trusted-folders.d.ts.map +1 -0
  695. package/dist/cli/backend/src/utils/gemini-trusted-folders.js +94 -0
  696. package/dist/cli/backend/src/utils/gemini-trusted-folders.js.map +1 -0
  697. package/dist/cli/backend/src/utils/terminal-string-ops.d.ts.map +1 -1
  698. package/dist/cli/backend/src/utils/terminal-string-ops.js +20 -11
  699. package/dist/cli/backend/src/utils/terminal-string-ops.js.map +1 -1
  700. package/dist/cli/cli/src/commands/onboard.d.ts +2 -1
  701. package/dist/cli/cli/src/commands/onboard.d.ts.map +1 -1
  702. package/dist/cli/cli/src/commands/onboard.js +21 -8
  703. package/dist/cli/cli/src/commands/onboard.js.map +1 -1
  704. package/dist/cli/cli/src/commands/start.d.ts +1 -0
  705. package/dist/cli/cli/src/commands/start.d.ts.map +1 -1
  706. package/dist/cli/cli/src/commands/start.js +71 -23
  707. package/dist/cli/cli/src/commands/start.js.map +1 -1
  708. package/dist/cli/cli/src/constants.d.ts +1 -1
  709. package/dist/cli/cli/src/constants.d.ts.map +1 -1
  710. package/dist/cli/cli/src/constants.js +1 -1
  711. package/dist/cli/cli/src/constants.js.map +1 -1
  712. package/dist/cli/cli/src/index.js +1 -0
  713. package/dist/cli/cli/src/index.js.map +1 -1
  714. package/dist/cli/cli/src/utils/project-scaffold.d.ts +109 -0
  715. package/dist/cli/cli/src/utils/project-scaffold.d.ts.map +1 -0
  716. package/dist/cli/cli/src/utils/project-scaffold.js +346 -0
  717. package/dist/cli/cli/src/utils/project-scaffold.js.map +1 -0
  718. package/dist/cli/cli/src/utils/templates.d.ts +7 -2
  719. package/dist/cli/cli/src/utils/templates.d.ts.map +1 -1
  720. package/dist/cli/cli/src/utils/templates.js +76 -7
  721. package/dist/cli/cli/src/utils/templates.js.map +1 -1
  722. package/dist/cli/config/constants.d.ts +44 -3
  723. package/dist/cli/config/constants.d.ts.map +1 -1
  724. package/dist/cli/config/constants.js +45 -3
  725. package/dist/cli/config/constants.js.map +1 -1
  726. package/dist/cli/config/index.d.ts +2 -2
  727. package/dist/cli/config/index.d.ts.map +1 -1
  728. package/dist/cli/config/index.js +2 -2
  729. package/dist/cli/config/index.js.map +1 -1
  730. package/frontend/dist/assets/index-3558d1a2.js +4919 -0
  731. package/frontend/dist/assets/index-4c4dcc31.css +33 -0
  732. package/frontend/dist/index.html +2 -2
  733. package/package.json +14 -3
  734. package/frontend/dist/assets/index-a23214ae.js +0 -4919
  735. package/frontend/dist/assets/index-c407fe13.css +0 -33
@@ -1,4 +1,5 @@
1
1
  import * as fs from 'fs/promises';
2
+ import * as http from 'http';
2
3
  import { LoggerService } from '../core/logger.service.js';
3
4
  import { StorageService } from '../core/storage.service.js';
4
5
  import { getSessionBackendSync, createSessionCommandHelper, } from '../session/index.js';
@@ -9,7 +10,8 @@ import { getTerminalGateway } from '../../websocket/terminal.gateway.js';
9
10
  import { SHELL_PROMPT_PATTERNS } from '../continuation/patterns/idle-patterns.js';
10
11
  import { PtyActivityTrackerService } from './pty-activity-tracker.service.js';
11
12
  import { OrchestratorRestartService } from '../orchestrator/orchestrator-restart.service.js';
12
- import { CREWLY_CONSTANTS, ORCHESTRATOR_SESSION_NAME, ORCHESTRATOR_ROLE, RUNTIME_EXIT_CONSTANTS, AGENT_SUSPEND_CONSTANTS, SESSION_COMMAND_DELAYS, RUNTIME_TYPES, GEMINI_FAILURE_PATTERNS, GEMINI_FORCE_RESTART_PATTERNS, GEMINI_FAILURE_RETRY_CONSTANTS, } from '../../constants.js';
13
+ import * as crypto from 'crypto';
14
+ import { CREWLY_CONSTANTS, ORCHESTRATOR_SESSION_NAME, ORCHESTRATOR_ROLE, RUNTIME_EXIT_CONSTANTS, AGENT_SUSPEND_CONSTANTS, SESSION_COMMAND_DELAYS, RUNTIME_TYPES, GEMINI_FAILURE_PATTERNS, GEMINI_FORCE_RESTART_PATTERNS, CLAUDE_FATAL_PATTERNS, GEMINI_FAILURE_RETRY_CONSTANTS, GEMINI_READY_PATTERNS, WEB_CONSTANTS, AGENT_HEARTBEAT_MONITOR_CONSTANTS, } from '../../constants.js';
13
15
  import { delay } from '../../utils/async.utils.js';
14
16
  /**
15
17
  * Service that monitors PTY sessions for runtime exit patterns.
@@ -28,6 +30,10 @@ import { delay } from '../../utils/async.utils.js';
28
30
  * needs recovery. These failure patterns bypass the shell prompt verification
29
31
  * since the CLI may still be running but non-functional.
30
32
  *
33
+ * For Claude Code, the service detects fatal API errors (e.g. thinking
34
+ * block corruption) that make the CLI permanently non-functional within
35
+ * the current session. These trigger immediate recovery without retry.
36
+ *
31
37
  * @example
32
38
  * ```typescript
33
39
  * const monitor = RuntimeExitMonitorService.getInstance();
@@ -43,6 +49,14 @@ export class RuntimeExitMonitorService {
43
49
  onExitDetectedCallback;
44
50
  agentRegistrationService = null;
45
51
  taskTrackingService = null;
52
+ eventBusService = null;
53
+ /**
54
+ * Restart timestamps per session, persisted across monitoring cycles.
55
+ * Unlike MonitoredSession (which is recreated on each startMonitoring call),
56
+ * this map survives agent restarts to prevent infinite restart loops
57
+ * when agents keep crashing (e.g. during network outages).
58
+ */
59
+ restartHistory = new Map();
46
60
  constructor() {
47
61
  this.logger = LoggerService.getInstance().createComponentLogger('RuntimeExitMonitorService');
48
62
  }
@@ -89,6 +103,14 @@ export class RuntimeExitMonitorService {
89
103
  setTaskTrackingService(service) {
90
104
  this.taskTrackingService = service;
91
105
  }
106
+ /**
107
+ * Set the EventBusService dependency for publishing agent lifecycle events.
108
+ *
109
+ * @param service - The EventBusService instance
110
+ */
111
+ setEventBusService(service) {
112
+ this.eventBusService = service;
113
+ }
92
114
  /**
93
115
  * Start monitoring a PTY session for runtime exit patterns.
94
116
  *
@@ -163,6 +185,10 @@ export class RuntimeExitMonitorService {
163
185
  /**
164
186
  * Stop monitoring a PTY session.
165
187
  *
188
+ * Also prunes the restartHistory entry for this session if it has no
189
+ * recent timestamps within the cooldown window, preventing slow memory
190
+ * leak for terminated sessions.
191
+ *
166
192
  * @param sessionName - PTY session name
167
193
  */
168
194
  stopMonitoring(sessionName) {
@@ -178,6 +204,21 @@ export class RuntimeExitMonitorService {
178
204
  }
179
205
  monitored.unsubscribe();
180
206
  this.sessions.delete(sessionName);
207
+ // Fix 3: Clean up restartHistory for terminated sessions to prevent
208
+ // unbounded Map growth. Keep the entry only if it has recent timestamps
209
+ // within the cooldown window (they may still be needed if the session
210
+ // is restarted soon). Delete the entry entirely otherwise.
211
+ const timestamps = this.restartHistory.get(sessionName);
212
+ if (timestamps) {
213
+ const windowStart = Date.now() - AGENT_HEARTBEAT_MONITOR_CONSTANTS.COOLDOWN_WINDOW_MS;
214
+ const recent = timestamps.filter(ts => ts > windowStart);
215
+ if (recent.length === 0) {
216
+ this.restartHistory.delete(sessionName);
217
+ }
218
+ else {
219
+ this.restartHistory.set(sessionName, recent);
220
+ }
221
+ }
181
222
  this.logger.debug('Stopped runtime exit monitoring', { sessionName });
182
223
  }
183
224
  /**
@@ -194,6 +235,7 @@ export class RuntimeExitMonitorService {
194
235
  for (const sessionName of sessionNames) {
195
236
  this.stopMonitoring(sessionName);
196
237
  }
238
+ this.restartHistory.clear();
197
239
  this.logger.debug('All runtime exit monitors destroyed');
198
240
  }
199
241
  /**
@@ -229,11 +271,19 @@ export class RuntimeExitMonitorService {
229
271
  /**
230
272
  * Confirm exit by checking for a shell prompt, then react.
231
273
  *
274
+ * Runtime-specific failure checks are gated by runtimeType so that
275
+ * patterns for one runtime cannot accidentally match another (e.g. a
276
+ * Codex exit matching Claude or Gemini patterns).
277
+ *
232
278
  * For Gemini CLI failure patterns (API errors, quota exhaustion, etc.),
233
279
  * the system retries with exponential backoff before declaring the agent
234
280
  * dead. Gemini CLI often recovers automatically from transient API errors
235
281
  * (RESOURCE_EXHAUSTED, UNAVAILABLE, Connection error). Only after
236
282
  * MAX_RETRIES does the system proceed with the exit/restart flow.
283
+ *
284
+ * For Claude Code fatal patterns (thinking block corruption, etc.),
285
+ * the system skips retry and forces immediate recovery since these
286
+ * errors are permanently unrecoverable within the same session.
237
287
  */
238
288
  async confirmAndReact(sessionName, helper) {
239
289
  const monitored = this.sessions.get(sessionName);
@@ -245,46 +295,11 @@ export class RuntimeExitMonitorService {
245
295
  // Verify shell prompt is visible (avoids false positives)
246
296
  const shellPromptConfirmed = this.verifyExitWithShellPrompt(sessionName, helper);
247
297
  if (!shellPromptConfirmed) {
248
- // Codex: "Conversation interrupted" indicates the run was aborted and
249
- // often leaves the agent stranded without completion callbacks. Treat it
250
- // as an actionable runtime failure even if shell prompt isn't visible.
251
- const isCodexInterrupted = monitored.runtimeType === RUNTIME_TYPES.CODEX_CLI
252
- && /Conversation interrupted/i.test(monitored.buffer);
253
- if (isCodexInterrupted) {
254
- this.logger.warn('Codex interruption detected, proceeding with recovery flow', {
255
- sessionName,
256
- });
257
- // fall through to exit/restart handling below
258
- }
259
- // For Gemini CLI: detect either retryable failure patterns or forced
260
- // restart/update markers that require immediate recovery handling.
261
- const isGeminiFailure = monitored.runtimeType === RUNTIME_TYPES.GEMINI_CLI
262
- && GEMINI_FAILURE_PATTERNS.some((pattern) => pattern.test(monitored.buffer));
263
- const isGeminiForceRestart = monitored.runtimeType === RUNTIME_TYPES.GEMINI_CLI
264
- && GEMINI_FORCE_RESTART_PATTERNS.some((pattern) => pattern.test(monitored.buffer));
265
- if (!isGeminiFailure && !isGeminiForceRestart && !isCodexInterrupted) {
298
+ const runtimeSpecificMatch = await this.checkRuntimeSpecificFailure(sessionName, monitored, helper);
299
+ if (!runtimeSpecificMatch) {
266
300
  this.logger.debug('Exit pattern matched but shell prompt not confirmed, ignoring', { sessionName });
267
301
  return;
268
302
  }
269
- if (isGeminiFailure || isGeminiForceRestart) {
270
- // Some Gemini failures are transient; others (auto-update/restart)
271
- // should trigger immediate recovery and task re-delivery.
272
- const forceRestart = isGeminiForceRestart;
273
- if (forceRestart) {
274
- this.logger.warn('Gemini auto-update interruption detected, forcing recovery flow', {
275
- sessionName,
276
- });
277
- }
278
- else {
279
- // Retry with exponential backoff before declaring exit.
280
- // Gemini CLI can recover from transient API errors automatically.
281
- const retryResult = await this.handleGeminiFailureWithRetry(sessionName, monitored, helper);
282
- if (retryResult === 'recovered') {
283
- return;
284
- }
285
- // retryResult === 'exhausted' — fall through to exit flow
286
- }
287
- }
288
303
  }
289
304
  // Mark as detected to prevent double-processing
290
305
  monitored.exitDetected = true;
@@ -294,179 +309,295 @@ export class RuntimeExitMonitorService {
294
309
  role: monitored.role,
295
310
  });
296
311
  // Fire the exit-detected callback (used to cancel pending registrations)
297
- if (this.onExitDetectedCallback) {
298
- try {
299
- this.onExitDetectedCallback(sessionName);
312
+ this.fireExitDetectedCallback(sessionName);
313
+ // Try agent restart if it has in-progress tasks (non-orchestrator only)
314
+ if (monitored.role !== ORCHESTRATOR_ROLE && this.agentRegistrationService && this.taskTrackingService) {
315
+ const restarted = await this.tryAgentRestartWithTasks(sessionName, monitored);
316
+ if (restarted)
317
+ return;
318
+ }
319
+ // Orchestrator-specific restart
320
+ if (sessionName === ORCHESTRATOR_SESSION_NAME) {
321
+ const restarted = await this.tryOrchestratorRestart(sessionName, monitored);
322
+ if (restarted)
323
+ return;
324
+ }
325
+ // Normal inactive flow: update status, capture memory, broadcast
326
+ await this.transitionToInactive(sessionName, monitored);
327
+ // Cleanup this subscription
328
+ this.stopMonitoring(sessionName);
329
+ }
330
+ finally {
331
+ monitored.confirmationInFlight = false;
332
+ }
333
+ }
334
+ /**
335
+ * Check for runtime-specific failure patterns when shell prompt is not confirmed.
336
+ *
337
+ * Gated by runtimeType so patterns for one runtime cannot accidentally
338
+ * match another. Returns true if a runtime-specific failure was detected,
339
+ * or 'deferred' handling occurred (Gemini retry).
340
+ *
341
+ * @param sessionName - PTY session name
342
+ * @param monitored - Monitored session state
343
+ * @param helper - Session command helper
344
+ * @returns True if a runtime-specific failure was confirmed
345
+ */
346
+ async checkRuntimeSpecificFailure(sessionName, monitored, helper) {
347
+ if (monitored.runtimeType === RUNTIME_TYPES.CODEX_CLI) {
348
+ const isCodexInterrupted = /Conversation interrupted/i.test(monitored.buffer);
349
+ if (isCodexInterrupted) {
350
+ this.logger.warn('Codex interruption detected, proceeding with recovery flow', { sessionName });
351
+ return true;
352
+ }
353
+ }
354
+ else if (monitored.runtimeType === RUNTIME_TYPES.CLAUDE_CODE) {
355
+ const isClaudeFatal = CLAUDE_FATAL_PATTERNS.some((pattern) => pattern.test(monitored.buffer));
356
+ if (isClaudeFatal) {
357
+ const detectedPattern = CLAUDE_FATAL_PATTERNS.find((p) => p.test(monitored.buffer))?.source;
358
+ this.logger.warn('Claude Code fatal error detected, forcing immediate recovery', {
359
+ sessionName,
360
+ detectedPattern,
361
+ });
362
+ return true;
363
+ }
364
+ }
365
+ else if (monitored.runtimeType === RUNTIME_TYPES.GEMINI_CLI) {
366
+ const isGeminiFailure = GEMINI_FAILURE_PATTERNS.some((pattern) => pattern.test(monitored.buffer));
367
+ const isGeminiForceRestart = GEMINI_FORCE_RESTART_PATTERNS.some((pattern) => pattern.test(monitored.buffer));
368
+ if (isGeminiFailure || isGeminiForceRestart) {
369
+ if (isGeminiForceRestart) {
370
+ this.logger.warn('Gemini auto-update interruption detected, forcing recovery flow', { sessionName });
300
371
  }
301
- catch (error) {
302
- this.logger.warn('onExitDetected callback error', {
303
- sessionName,
304
- error: error instanceof Error ? error.message : String(error),
305
- });
372
+ else {
373
+ const retryResult = await this.handleGeminiFailureWithRetry(sessionName, monitored, helper);
374
+ if (retryResult === 'recovered' || retryResult === 'deferred') {
375
+ return false; // Not a confirmed exit — caller should return early
376
+ }
306
377
  }
378
+ return true;
307
379
  }
308
- // Check for in-progress tasks — restart agent if any exist (non-orchestrator only)
309
- if (monitored.role !== ORCHESTRATOR_ROLE && this.agentRegistrationService && this.taskTrackingService) {
380
+ }
381
+ return false;
382
+ }
383
+ /**
384
+ * Fire the onExitDetected callback safely.
385
+ *
386
+ * @param sessionName - PTY session name
387
+ */
388
+ fireExitDetectedCallback(sessionName) {
389
+ if (!this.onExitDetectedCallback)
390
+ return;
391
+ try {
392
+ this.onExitDetectedCallback(sessionName);
393
+ }
394
+ catch (error) {
395
+ this.logger.warn('onExitDetected callback error', {
396
+ sessionName,
397
+ error: error instanceof Error ? error.message : String(error),
398
+ });
399
+ }
400
+ }
401
+ /**
402
+ * Try to restart an agent that has in-progress tasks.
403
+ *
404
+ * @param sessionName - PTY session name
405
+ * @param monitored - Monitored session state
406
+ * @returns True if the agent was successfully restarted (caller should return)
407
+ */
408
+ async tryAgentRestartWithTasks(sessionName, monitored) {
409
+ try {
410
+ const tasks = await this.taskTrackingService.getTasksForTeamMember(monitored.memberId || '');
411
+ const activeTasks = tasks.filter(t => t.status === 'assigned' || t.status === 'active' || t.status === 'pending_assignment');
412
+ if (activeTasks.length === 0)
413
+ return false;
414
+ if (!this.isAgentRestartAllowed(sessionName)) {
415
+ this.logger.warn('Agent restart cooldown active, skipping restart', {
416
+ sessionName,
417
+ activeTaskCount: activeTasks.length,
418
+ maxRestartsPerWindow: AGENT_HEARTBEAT_MONITOR_CONSTANTS.MAX_RESTARTS_PER_WINDOW,
419
+ cooldownWindowMs: AGENT_HEARTBEAT_MONITOR_CONSTANTS.COOLDOWN_WINDOW_MS,
420
+ });
421
+ this.notifyOrchestratorOfFailure(sessionName, 'runtime_exited_cooldown', activeTasks, false);
422
+ return false;
423
+ }
424
+ this.logger.info('Runtime exit with in-progress tasks, attempting restart', {
425
+ sessionName,
426
+ activeTaskCount: activeTasks.length,
427
+ });
428
+ try {
429
+ await this.restartAgentWithTasks(sessionName, monitored, activeTasks);
430
+ this.recordAgentRestart(sessionName);
431
+ this.notifyOrchestratorOfFailure(sessionName, 'runtime_exited', activeTasks, true);
432
+ this.stopMonitoring(sessionName);
433
+ return true;
434
+ }
435
+ catch (restartError) {
436
+ this.logger.warn('Agent restart after runtime exit failed, falling back to inactive', {
437
+ sessionName,
438
+ error: restartError instanceof Error ? restartError.message : String(restartError),
439
+ });
440
+ this.recordAgentRestart(sessionName);
441
+ this.notifyOrchestratorOfFailure(sessionName, 'runtime_exited', activeTasks, false);
442
+ return false;
443
+ }
444
+ }
445
+ catch (error) {
446
+ this.logger.warn('Failed to check in-progress tasks after runtime exit', {
447
+ sessionName,
448
+ error: error instanceof Error ? error.message : String(error),
449
+ });
450
+ return false;
451
+ }
452
+ }
453
+ /**
454
+ * Try to restart the orchestrator after runtime exit.
455
+ *
456
+ * Sets status to inactive before restart to prevent queue processor
457
+ * from delivering messages during postInitialize, captures session
458
+ * memory, and broadcasts restart status.
459
+ *
460
+ * @param sessionName - PTY session name (should be ORCHESTRATOR_SESSION_NAME)
461
+ * @param monitored - Monitored session state
462
+ * @returns True if orchestrator was successfully restarted (caller should return)
463
+ */
464
+ async tryOrchestratorRestart(sessionName, monitored) {
465
+ // Set status to inactive BEFORE restart so the queue processor
466
+ // doesn't deliver messages during postInitialize.
467
+ try {
468
+ const storageService = StorageService.getInstance();
469
+ await storageService.updateAgentStatus(sessionName, CREWLY_CONSTANTS.AGENT_STATUSES.INACTIVE);
470
+ }
471
+ catch {
472
+ // Best-effort — continue with restart
473
+ }
474
+ // Capture session memory before restart
475
+ try {
476
+ const sessionMemoryService = SessionMemoryService.getInstance();
477
+ await sessionMemoryService.onSessionEnd(sessionName, monitored.role, process.cwd());
478
+ }
479
+ catch (error) {
480
+ this.logger.warn('Failed to capture session memory before orchestrator restart', {
481
+ sessionName,
482
+ error: error instanceof Error ? error.message : String(error),
483
+ });
484
+ }
485
+ try {
486
+ const restartService = OrchestratorRestartService.getInstance();
487
+ const success = await restartService.attemptRestart();
488
+ if (success) {
489
+ this.logger.info('Orchestrator restarted after runtime exit', { sessionName });
490
+ // Broadcast STARTED (not ACTIVE) — agent becomes ACTIVE only
491
+ // after registration prompt is processed and MCP call completes.
310
492
  try {
311
- const tasks = await this.taskTrackingService.getTasksForTeamMember(monitored.memberId || '');
312
- const activeTasks = tasks.filter(t => t.status === 'assigned' || t.status === 'active' || t.status === 'pending_assignment');
313
- if (activeTasks.length > 0) {
314
- this.logger.info('Runtime exit with in-progress tasks, attempting restart', {
493
+ const terminalGateway = getTerminalGateway();
494
+ if (terminalGateway) {
495
+ terminalGateway.broadcastOrchestratorStatus({
315
496
  sessionName,
316
- activeTaskCount: activeTasks.length,
497
+ agentStatus: CREWLY_CONSTANTS.AGENT_STATUSES.STARTED,
498
+ reason: 'runtime_exit_restart',
317
499
  });
318
- try {
319
- await this.restartAgentWithTasks(sessionName, monitored, activeTasks);
320
- // Cleanup this subscription (restart succeeded, skip inactive flow)
321
- this.stopMonitoring(sessionName);
322
- return;
323
- }
324
- catch (restartError) {
325
- this.logger.warn('Agent restart after runtime exit failed, falling back to inactive', {
326
- sessionName,
327
- error: restartError instanceof Error ? restartError.message : String(restartError),
328
- });
329
- // Fall through to normal inactive flow
330
- }
331
500
  }
332
501
  }
333
- catch (error) {
334
- this.logger.warn('Failed to check in-progress tasks after runtime exit', {
335
- sessionName,
336
- error: error instanceof Error ? error.message : String(error),
337
- });
338
- // Fall through to normal inactive flow
339
- }
340
- }
341
- // Orchestrator-specific restart: attempt auto-restart when runtime exits
342
- if (sessionName === ORCHESTRATOR_SESSION_NAME) {
343
- // CRITICAL: Set status to inactive BEFORE restart so the queue
344
- // processor doesn't deliver messages during postInitialize.
345
- // Without this, the old 'active' status persists in storage and
346
- // the queue processor sends chat messages that get concatenated
347
- // into /directory add commands in the new Gemini CLI session.
348
- try {
349
- const storageService = StorageService.getInstance();
350
- await storageService.updateAgentStatus(sessionName, CREWLY_CONSTANTS.AGENT_STATUSES.INACTIVE);
351
- }
352
502
  catch {
353
- // Best-effort — continue with restart
354
- }
355
- // Capture session memory before restart
356
- try {
357
- const sessionMemoryService = SessionMemoryService.getInstance();
358
- await sessionMemoryService.onSessionEnd(sessionName, monitored.role, process.cwd());
359
- }
360
- catch (error) {
361
- this.logger.warn('Failed to capture session memory before orchestrator restart', {
362
- sessionName,
363
- error: error instanceof Error ? error.message : String(error),
364
- });
503
+ // Best-effort broadcast
365
504
  }
505
+ this.stopMonitoring(sessionName);
506
+ return true;
507
+ }
508
+ this.logger.warn('Orchestrator restart after runtime exit failed or not allowed, falling back to inactive', {
509
+ sessionName,
510
+ });
511
+ }
512
+ catch (error) {
513
+ this.logger.warn('Orchestrator restart attempt threw error, falling back to inactive', {
514
+ sessionName,
515
+ error: error instanceof Error ? error.message : String(error),
516
+ });
517
+ }
518
+ return false;
519
+ }
520
+ /**
521
+ * Transition agent to inactive state: update storage, capture memory,
522
+ * publish events, and broadcast WebSocket status.
523
+ *
524
+ * @param sessionName - PTY session name
525
+ * @param monitored - Monitored session state
526
+ */
527
+ async transitionToInactive(sessionName, monitored) {
528
+ // Update agent status to inactive
529
+ try {
530
+ const storageService = StorageService.getInstance();
531
+ await storageService.updateAgentStatus(sessionName, CREWLY_CONSTANTS.AGENT_STATUSES.INACTIVE);
532
+ this.logger.info('Agent status updated to inactive after runtime exit', { sessionName });
533
+ // Publish agent:inactive event to EventBus so orchestrator is notified
534
+ if (this.eventBusService) {
366
535
  try {
367
- const restartService = OrchestratorRestartService.getInstance();
368
- const success = await restartService.attemptRestart();
369
- if (success) {
370
- this.logger.info('Orchestrator restarted after runtime exit', { sessionName });
371
- // Broadcast restarted status as STARTED (not ACTIVE).
372
- // The agent becomes ACTIVE only after the registration prompt
373
- // is fully processed and the MCP registration call completes.
374
- // Broadcasting ACTIVE prematurely causes the queue processor
375
- // to deliver messages during postInitialize.
376
- try {
377
- const terminalGateway = getTerminalGateway();
378
- if (terminalGateway) {
379
- terminalGateway.broadcastOrchestratorStatus({
380
- sessionName,
381
- agentStatus: CREWLY_CONSTANTS.AGENT_STATUSES.STARTED,
382
- reason: 'runtime_exit_restart',
383
- });
384
- }
385
- }
386
- catch {
387
- // Best-effort broadcast
388
- }
389
- this.stopMonitoring(sessionName);
390
- return;
391
- }
392
- this.logger.warn('Orchestrator restart after runtime exit failed or not allowed, falling back to inactive', {
393
- sessionName,
394
- });
536
+ await this.publishInactiveEvent(sessionName, monitored, storageService);
395
537
  }
396
- catch (error) {
397
- this.logger.warn('Orchestrator restart attempt threw error, falling back to inactive', {
538
+ catch (eventError) {
539
+ this.logger.warn('Failed to publish agent:inactive event to EventBus', {
398
540
  sessionName,
399
- error: error instanceof Error ? error.message : String(error),
541
+ error: eventError instanceof Error ? eventError.message : String(eventError),
400
542
  });
401
543
  }
402
- // Fall through to normal inactive flow
403
544
  }
404
- // Update agent status to inactive
545
+ }
546
+ catch (error) {
547
+ this.logger.warn('Failed to update agent status after runtime exit', {
548
+ sessionName,
549
+ error: error instanceof Error ? error.message : String(error),
550
+ });
551
+ }
552
+ // Capture session memory (skip for orchestrator — already captured above)
553
+ if (sessionName !== ORCHESTRATOR_SESSION_NAME) {
405
554
  try {
406
- const storageService = StorageService.getInstance();
407
- await storageService.updateAgentStatus(sessionName, CREWLY_CONSTANTS.AGENT_STATUSES.INACTIVE);
408
- this.logger.info('Agent status updated to inactive after runtime exit', { sessionName });
555
+ const sessionMemoryService = SessionMemoryService.getInstance();
556
+ await sessionMemoryService.onSessionEnd(sessionName, monitored.role, process.cwd());
409
557
  }
410
558
  catch (error) {
411
- this.logger.warn('Failed to update agent status after runtime exit', {
559
+ this.logger.warn('Failed to capture session memory after runtime exit', {
412
560
  sessionName,
413
561
  error: error instanceof Error ? error.message : String(error),
414
562
  });
415
563
  }
416
- // Capture session memory (skip for orchestrator — already captured above)
417
- if (sessionName !== ORCHESTRATOR_SESSION_NAME) {
418
- try {
419
- const sessionMemoryService = SessionMemoryService.getInstance();
420
- await sessionMemoryService.onSessionEnd(sessionName, monitored.role, process.cwd());
421
- }
422
- catch (error) {
423
- this.logger.warn('Failed to capture session memory after runtime exit', {
424
- sessionName,
425
- error: error instanceof Error ? error.message : String(error),
426
- });
564
+ }
565
+ // Broadcast WebSocket event
566
+ try {
567
+ const terminalGateway = getTerminalGateway();
568
+ if (terminalGateway) {
569
+ const statusPayload = {
570
+ sessionName,
571
+ agentStatus: CREWLY_CONSTANTS.AGENT_STATUSES.INACTIVE,
572
+ reason: 'runtime_exited',
573
+ };
574
+ if (sessionName === ORCHESTRATOR_SESSION_NAME) {
575
+ terminalGateway.broadcastOrchestratorStatus(statusPayload);
427
576
  }
428
- }
429
- // Broadcast WebSocket event
430
- try {
431
- const terminalGateway = getTerminalGateway();
432
- if (terminalGateway) {
433
- const statusPayload = {
434
- sessionName,
435
- agentStatus: CREWLY_CONSTANTS.AGENT_STATUSES.INACTIVE,
436
- reason: 'runtime_exited',
437
- };
438
- if (sessionName === ORCHESTRATOR_SESSION_NAME) {
439
- terminalGateway.broadcastOrchestratorStatus(statusPayload);
440
- }
441
- else {
442
- terminalGateway.broadcastTeamMemberStatus(statusPayload);
443
- }
577
+ else {
578
+ terminalGateway.broadcastTeamMemberStatus(statusPayload);
444
579
  }
445
580
  }
446
- catch (error) {
447
- this.logger.warn('Failed to broadcast runtime exit event', {
448
- sessionName,
449
- error: error instanceof Error ? error.message : String(error),
450
- });
451
- }
452
- // Cleanup this subscription
453
- this.stopMonitoring(sessionName);
454
581
  }
455
- finally {
456
- monitored.confirmationInFlight = false;
582
+ catch (error) {
583
+ this.logger.warn('Failed to broadcast runtime exit event', {
584
+ sessionName,
585
+ error: error instanceof Error ? error.message : String(error),
586
+ });
457
587
  }
458
588
  }
459
589
  /**
460
590
  * Handle a Gemini CLI failure with exponential backoff retry.
461
591
  *
462
592
  * Waits with increasing delays and checks if the CLI recovers (returns
463
- * to a ready prompt). Returns 'recovered' if the CLI is back, or
464
- * 'exhausted' if max retries have been reached.
593
+ * to a ready prompt). Returns 'recovered' if the CLI is back,
594
+ * 'deferred' if retries remain (skip exit flow, re-check on next
595
+ * failure detection), or 'exhausted' if max retries have been reached.
465
596
  *
466
597
  * @param sessionName - PTY session name
467
598
  * @param monitored - Monitored session state (retry counter is mutated)
468
599
  * @param helper - Session command helper for terminal output capture
469
- * @returns 'recovered' if CLI is back, 'exhausted' if retries exhausted
600
+ * @returns 'recovered' | 'deferred' | 'exhausted'
470
601
  */
471
602
  async handleGeminiFailureWithRetry(sessionName, monitored, helper) {
472
603
  const detectedPattern = GEMINI_FAILURE_PATTERNS.find((p) => p.test(monitored.buffer))?.source;
@@ -496,12 +627,7 @@ export class RuntimeExitMonitorService {
496
627
  // Check if the CLI has recovered by looking for ready prompt patterns
497
628
  try {
498
629
  const output = helper.capturePane(sessionName, RECOVERY_CHECK_LINES);
499
- const geminiReadyPatterns = [
500
- 'Type your message',
501
- 'gemini>',
502
- 'context left)',
503
- ];
504
- const hasRecovered = geminiReadyPatterns.some((pattern) => output.includes(pattern));
630
+ const hasRecovered = GEMINI_READY_PATTERNS.some((pattern) => output.includes(pattern));
505
631
  if (hasRecovered) {
506
632
  this.logger.info('Gemini CLI recovered after transient failure', {
507
633
  sessionName,
@@ -523,9 +649,11 @@ export class RuntimeExitMonitorService {
523
649
  error: error instanceof Error ? error.message : String(error),
524
650
  });
525
651
  }
526
- // Not recovered but retries remain — let the next failure detection handle it
652
+ // Not recovered but retries remain — defer to the next failure detection cycle.
653
+ // The buffer was cleared above, so a new failure must appear in terminal
654
+ // output to re-trigger this method.
527
655
  if (monitored.geminiFailureRetries < MAX_RETRIES) {
528
- return 'recovered'; // Return 'recovered' to skip exit flow this time
656
+ return 'deferred';
529
657
  }
530
658
  return 'exhausted';
531
659
  }
@@ -594,7 +722,7 @@ export class RuntimeExitMonitorService {
594
722
  teamId: monitored.teamId,
595
723
  memberId: monitored.memberId,
596
724
  sessionName,
597
- agentStatus: 'active',
725
+ agentStatus: CREWLY_CONSTANTS.AGENT_STATUSES.ACTIVE,
598
726
  });
599
727
  }
600
728
  this.logger.info('Agent restarted after runtime exit with in-progress tasks', {
@@ -728,5 +856,186 @@ export class RuntimeExitMonitorService {
728
856
  return false;
729
857
  }
730
858
  }
859
+ /**
860
+ * Check if an agent restart is allowed based on cooldown window.
861
+ * Prevents infinite restart loops when agents keep crashing (e.g. during
862
+ * network outages). Uses the same limits as AgentHeartbeatMonitorService.
863
+ *
864
+ * @param sessionName - PTY session name
865
+ * @returns True if restart is allowed, false if cooldown is active
866
+ */
867
+ isAgentRestartAllowed(sessionName) {
868
+ const now = Date.now();
869
+ const windowStart = now - AGENT_HEARTBEAT_MONITOR_CONSTANTS.COOLDOWN_WINDOW_MS;
870
+ const timestamps = this.restartHistory.get(sessionName) || [];
871
+ // Prune old timestamps outside the cooldown window
872
+ const recent = timestamps.filter(ts => ts > windowStart);
873
+ this.restartHistory.set(sessionName, recent);
874
+ return recent.length < AGENT_HEARTBEAT_MONITOR_CONSTANTS.MAX_RESTARTS_PER_WINDOW;
875
+ }
876
+ /**
877
+ * Record a restart attempt for cooldown tracking.
878
+ *
879
+ * @param sessionName - PTY session name
880
+ */
881
+ recordAgentRestart(sessionName) {
882
+ const timestamps = this.restartHistory.get(sessionName) || [];
883
+ timestamps.push(Date.now());
884
+ this.restartHistory.set(sessionName, timestamps);
885
+ }
886
+ /**
887
+ * Classify an error reason as transient or persistent.
888
+ *
889
+ * Transient errors (connectivity, timeout, quota) may resolve on retry.
890
+ * Persistent errors (auth, config, crash loop) require manual intervention.
891
+ *
892
+ * @param reason - The failure reason string
893
+ * @returns 'TRANSIENT' | 'PERSISTENT' | 'UNKNOWN'
894
+ */
895
+ classifyError(reason) {
896
+ const transientPatterns = [
897
+ 'timeout', 'connectivity', 'connection', 'quota', 'RESOURCE_EXHAUSTED',
898
+ 'UNAVAILABLE', 'DEADLINE_EXCEEDED', 'network', 'INTERNAL',
899
+ ];
900
+ const persistentPatterns = [
901
+ 'auth', 'UNAUTHENTICATED', 'PERMISSION_DENIED', 'config',
902
+ 'crash', 'cooldown', 'corruption', 'thinking.*blocks',
903
+ ];
904
+ const lowerReason = reason.toLowerCase();
905
+ if (transientPatterns.some(p => lowerReason.includes(p.toLowerCase()))) {
906
+ return 'TRANSIENT';
907
+ }
908
+ if (persistentPatterns.some(p => new RegExp(p, 'i').test(reason))) {
909
+ return 'PERSISTENT';
910
+ }
911
+ return 'UNKNOWN';
912
+ }
913
+ /**
914
+ * Notify the orchestrator about an agent failure via the chat API (#129).
915
+ *
916
+ * Sends a structured failure notification with error classification so the
917
+ * orchestrator can decide whether to restart the agent, reassign tasks,
918
+ * or inform the user. This is fire-and-forget — failures are logged but
919
+ * do not block the exit flow.
920
+ *
921
+ * @param sessionName - Failed agent's PTY session name
922
+ * @param reason - Failure reason (runtime_exited, api_failure, etc.)
923
+ * @param activeTasks - In-progress tasks the agent had, if any
924
+ * @param restartSucceeded - Whether automatic restart succeeded
925
+ */
926
+ notifyOrchestratorOfFailure(sessionName, reason, activeTasks, restartSucceeded) {
927
+ const errorClass = this.classifyError(reason);
928
+ const taskSummary = activeTasks.length > 0
929
+ ? activeTasks.map(t => `${t.taskName} (${t.status})`).join(', ')
930
+ : '';
931
+ const message = [
932
+ `Agent failure notification: ${sessionName} became inactive.`,
933
+ `Reason: ${reason}`,
934
+ `Error classification: ${errorClass}`,
935
+ activeTasks.length > 0 ? `Active tasks: ${taskSummary}` : 'No active tasks.',
936
+ restartSucceeded
937
+ ? 'Automatic restart succeeded — agent is recovering.'
938
+ : 'Automatic restart FAILED — please restart the agent or reassign its tasks.',
939
+ ].join('\n');
940
+ // Send via chat API (fire-and-forget)
941
+ const backend = getSessionBackendSync();
942
+ if (!backend)
943
+ return;
944
+ const helper = createSessionCommandHelper(backend);
945
+ const orchestratorSession = helper.getSession(ORCHESTRATOR_SESSION_NAME);
946
+ if (!orchestratorSession) {
947
+ this.logger.debug('Orchestrator session not found, skipping failure notification', { sessionName });
948
+ return;
949
+ }
950
+ // Use the deliver endpoint for reliable delivery to the orchestrator
951
+ const baseUrl = process.env.CREWLY_API_URL || `http://localhost:${WEB_CONSTANTS.PORTS.BACKEND}`;
952
+ const body = JSON.stringify({
953
+ message,
954
+ force: true,
955
+ });
956
+ // Fire-and-forget HTTP call
957
+ try {
958
+ const url = new URL(`${baseUrl}/api/terminal/${ORCHESTRATOR_SESSION_NAME}/deliver`);
959
+ const req = http.request(url, {
960
+ method: 'POST',
961
+ headers: {
962
+ 'Content-Type': 'application/json',
963
+ 'Content-Length': Buffer.byteLength(body).toString(),
964
+ },
965
+ });
966
+ req.on('response', (res) => res.resume()); // Consume response to free socket
967
+ req.on('error', (err) => {
968
+ this.logger.debug('Failed to deliver failure notification to orchestrator (non-fatal)', {
969
+ sessionName,
970
+ error: err.message,
971
+ });
972
+ });
973
+ req.write(body);
974
+ req.end();
975
+ }
976
+ catch {
977
+ // Non-fatal — notification delivery is best-effort
978
+ }
979
+ this.logger.info('Sent agent failure notification to orchestrator (#129)', {
980
+ sessionName,
981
+ reason,
982
+ activeTaskCount: activeTasks.length,
983
+ restartSucceeded,
984
+ });
985
+ }
986
+ /**
987
+ * Publish agent:status_changed and agent:inactive events to the EventBus.
988
+ *
989
+ * Looks up team/member names from StorageService to build the full
990
+ * AgentEvent. This mirrors the pattern used in TeamsJsonWatcherService.
991
+ *
992
+ * @param sessionName - PTY session name
993
+ * @param monitored - Monitored session state with teamId/memberId
994
+ * @param storageService - StorageService instance for team/member lookup
995
+ */
996
+ async publishInactiveEvent(sessionName, monitored, storageService) {
997
+ if (!this.eventBusService) {
998
+ return;
999
+ }
1000
+ // Look up team and member names
1001
+ let teamName = '';
1002
+ let memberName = '';
1003
+ try {
1004
+ const result = await storageService.findMemberBySessionName(sessionName);
1005
+ if (result) {
1006
+ teamName = result.team.name;
1007
+ memberName = result.member.name;
1008
+ }
1009
+ }
1010
+ catch {
1011
+ // Best-effort — use empty names if lookup fails
1012
+ }
1013
+ const baseEvent = {
1014
+ id: crypto.randomUUID(),
1015
+ type: 'agent:status_changed',
1016
+ timestamp: new Date().toISOString(),
1017
+ teamId: monitored.teamId || '',
1018
+ teamName,
1019
+ memberId: monitored.memberId || '',
1020
+ memberName,
1021
+ sessionName,
1022
+ previousValue: CREWLY_CONSTANTS.AGENT_STATUSES.ACTIVE,
1023
+ newValue: CREWLY_CONSTANTS.AGENT_STATUSES.INACTIVE,
1024
+ changedField: 'agentStatus',
1025
+ };
1026
+ // Publish generic status_changed event
1027
+ this.eventBusService.publish(baseEvent);
1028
+ // Publish specific agent:inactive event
1029
+ this.eventBusService.publish({
1030
+ ...baseEvent,
1031
+ id: crypto.randomUUID(),
1032
+ type: 'agent:inactive',
1033
+ });
1034
+ this.logger.info('Published agent:inactive event to EventBus', {
1035
+ sessionName,
1036
+ teamId: monitored.teamId,
1037
+ memberId: monitored.memberId,
1038
+ });
1039
+ }
731
1040
  }
732
1041
  //# sourceMappingURL=runtime-exit-monitor.service.js.map