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
@@ -4,15 +4,17 @@ import { readFile, readdir, stat, mkdir, writeFile, access } from 'fs/promises';
4
4
  import { LoggerService } from '../core/logger.service.js';
5
5
  import { createSessionCommandHelper, getSessionBackendSync, createSessionBackend, getSessionStatePersistence, } from '../session/index.js';
6
6
  import { RuntimeServiceFactory } from './runtime-service.factory.js';
7
- import { CREWLY_CONSTANTS, ENV_CONSTANTS, AGENT_TIMEOUTS, ORCHESTRATOR_SESSION_NAME, ORCHESTRATOR_ROLE, RUNTIME_TYPES, SESSION_COMMAND_DELAYS, EVENT_DELIVERY_CONSTANTS, TERMINAL_PATTERNS, GEMINI_SHELL_MODE_CONSTANTS, } from '../../constants.js';
7
+ import { CREWLY_CONSTANTS, ENV_CONSTANTS, AGENT_TIMEOUTS, ORCHESTRATOR_SESSION_NAME, ORCHESTRATOR_ROLE, RUNTIME_TYPES, SESSION_COMMAND_DELAYS, EVENT_DELIVERY_CONSTANTS, TERMINAL_PATTERNS, GEMINI_SHELL_MODE_CONSTANTS, GEMINI_STUCK_CONNECTIVITY_PATTERN, GEMINI_ERROR_STATE_CONSTANTS, } from '../../constants.js';
8
8
  import { WEB_CONSTANTS } from '../../../../config/constants.js';
9
9
  import { delay } from '../../utils/async.utils.js';
10
10
  import { getSettingsService } from '../settings/settings.service.js';
11
11
  import { SessionMemoryService } from '../memory/session-memory.service.js';
12
12
  import { RuntimeExitMonitorService } from './runtime-exit-monitor.service.js';
13
13
  import { ContextWindowMonitorService } from './context-window-monitor.service.js';
14
+ import { OAuthReloginMonitorService } from './oauth-relogin-monitor.service.js';
14
15
  import { SubAgentMessageQueue } from '../messaging/sub-agent-message-queue.service.js';
15
16
  import { AgentSuspendService } from './agent-suspend.service.js';
17
+ import { PromptBuilderService } from '../ai/prompt-builder.service.js';
16
18
  import { stripAnsiCodes } from '../../utils/terminal-output.utils.js';
17
19
  import { isPromptLine, containsSpinnerOrWorkingIndicator, containsProcessingIndicator, containsBusyStatusBar, containsRewindMode, containsGeminiProcessingKeywords, extractChatPrefix, stripTuiLineBorders, matchTuiPromptLine, } from '../../utils/terminal-string-ops.js';
18
20
  import { PtyActivityTrackerService } from './pty-activity-tracker.service.js';
@@ -48,6 +50,12 @@ export class AgentRegistrationService {
48
50
  // Prevents concurrent sendMessageWithRetry calls to the same session,
49
51
  // which causes multiple Ctrl+C presses that can crash the runtime.
50
52
  sessionDeliveryMutex = new Map();
53
+ // Per-session hash of last sent message to prevent duplicate writes (#128).
54
+ // Key: sessionName, Value: { hash, sentAt }
55
+ lastSentMessageHash = new Map();
56
+ // In-process Crewly Agent runtimes (sessionName → runtime instance).
57
+ // Used for crewly-agent runtimeType agents that run without PTY sessions.
58
+ inProcessRuntimes = new Map();
51
59
  // Terminal patterns are now centralized in TERMINAL_PATTERNS constant
52
60
  // Keeping prompt chars as static getter for backwards compatibility within the class
53
61
  static get CLAUDE_PROMPT_INDICATORS() {
@@ -252,6 +260,16 @@ export class AgentRegistrationService {
252
260
  createRuntimeService(runtimeType) {
253
261
  return RuntimeServiceFactory.create(runtimeType, null, this.projectRoot);
254
262
  }
263
+ /**
264
+ * Get an in-process Crewly Agent runtime by session name.
265
+ * Used by the terminal controller for force-delivery to in-process agents.
266
+ *
267
+ * @param sessionName - Session name to look up
268
+ * @returns The CrewlyAgentRuntimeService if it exists, undefined otherwise
269
+ */
270
+ getInProcessRuntime(sessionName) {
271
+ return this.inProcessRuntimes.get(sessionName);
272
+ }
255
273
  /**
256
274
  * Get the check interval based on environment.
257
275
  * Uses shorter intervals in test environment for faster tests.
@@ -451,6 +469,8 @@ export class AgentRegistrationService {
451
469
  // Must be before postInitialize and sendRegistrationPromptAsync so exits
452
470
  // during those phases are detected and the abort signal fires in time.
453
471
  RuntimeExitMonitorService.getInstance().startMonitoring(sessionName, runtimeType, role);
472
+ // Start OAuth relogin monitoring for automatic re-authentication
473
+ OAuthReloginMonitorService.getInstance().startMonitoring(sessionName, runtimeType);
454
474
  // Look up per-agent browser automation override from member config
455
475
  let browserAutomationOverride;
456
476
  if (memberId) {
@@ -687,6 +707,8 @@ export class AgentRegistrationService {
687
707
  }
688
708
  // Start runtime exit monitoring immediately after runtime is ready
689
709
  RuntimeExitMonitorService.getInstance().startMonitoring(sessionName, runtimeType, role);
710
+ // Start OAuth relogin monitoring for automatic re-authentication
711
+ OAuthReloginMonitorService.getInstance().startMonitoring(sessionName, runtimeType);
690
712
  // Additional verification: Use runtime detection to confirm runtime is responding
691
713
  // Wait a bit longer for runtime to fully load after showing welcome message
692
714
  this.logger.debug('Runtime ready detected for orchestrator, waiting for full startup before verification', { sessionName, runtimeType });
@@ -729,6 +751,8 @@ export class AgentRegistrationService {
729
751
  }
730
752
  // Start runtime exit monitoring immediately after runtime is ready
731
753
  RuntimeExitMonitorService.getInstance().startMonitoring(sessionName, runtimeType, role);
754
+ // Start OAuth relogin monitoring for automatic re-authentication
755
+ OAuthReloginMonitorService.getInstance().startMonitoring(sessionName, runtimeType);
732
756
  }
733
757
  // Look up per-agent browser automation override from member config
734
758
  let browserOverrideForRecreation;
@@ -836,17 +860,23 @@ export class AgentRegistrationService {
836
860
  // For orchestrator or cases without member ID, remove the memberId parameter
837
861
  prompt = prompt.replace(/,\s*"memberId":\s*"\{\{MEMBER_ID\}\}"/g, '');
838
862
  }
839
- // Look up project path for team members
863
+ // Look up project path and TL hierarchy for team members
840
864
  let projectPath = process.cwd();
865
+ let foundTeam = null;
866
+ let foundMember = null;
841
867
  try {
842
868
  const teams = await this.storageService.getTeams();
843
869
  for (const team of teams) {
844
870
  const member = team.members?.find((m) => m.sessionName === sessionName);
845
- if (member && team.projectIds[0]) {
846
- const projects = await this.storageService.getProjects();
847
- const project = projects.find((p) => p.id === team.projectIds[0]);
848
- if (project?.path) {
849
- projectPath = project.path;
871
+ if (member) {
872
+ foundTeam = team;
873
+ foundMember = member;
874
+ if (team.projectIds[0]) {
875
+ const projects = await this.storageService.getProjects();
876
+ const project = projects.find((p) => p.id === team.projectIds[0]);
877
+ if (project?.path) {
878
+ projectPath = project.path;
879
+ }
850
880
  }
851
881
  break;
852
882
  }
@@ -888,6 +918,53 @@ export class AgentRegistrationService {
888
918
  // Replace marketplace skills path placeholder
889
919
  const marketplaceSkillsPath = path.join(os.homedir(), '.crewly', 'marketplace', 'skills');
890
920
  prompt = prompt.replace(/\{\{MARKETPLACE_SKILLS_PATH\}\}/g, marketplaceSkillsPath);
921
+ // Inject Team Lead addon for members with canDelegate=true and subordinates
922
+ if (foundMember?.canDelegate && foundMember.subordinateIds && foundMember.subordinateIds.length > 0 && foundTeam) {
923
+ try {
924
+ // Resolve subordinateIds to SubordinateInfo[]
925
+ const subordinates = foundMember.subordinateIds
926
+ .map((subId) => {
927
+ const subMember = foundTeam.members?.find((m) => m.id === subId);
928
+ if (!subMember)
929
+ return null;
930
+ return {
931
+ name: subMember.name,
932
+ sessionName: subMember.sessionName || '',
933
+ role: subMember.role || 'developer',
934
+ };
935
+ })
936
+ .filter((s) => s !== null);
937
+ if (subordinates.length > 0) {
938
+ const tlConfig = {
939
+ name: sessionName,
940
+ role: role,
941
+ systemPrompt: '',
942
+ projectPath,
943
+ memberId,
944
+ teamId: foundTeam.id,
945
+ canDelegate: true,
946
+ subordinates,
947
+ };
948
+ const promptBuilder = new PromptBuilderService(this.projectRoot);
949
+ const tlSection = await promptBuilder.buildTeamLeadSection(tlConfig);
950
+ if (tlSection) {
951
+ prompt += `\n\n---\n\n${tlSection}`;
952
+ this.logger.info('TL addon injected into init prompt', {
953
+ sessionName,
954
+ subordinateCount: subordinates.length,
955
+ subordinateNames: subordinates.map((s) => s.name),
956
+ tlSectionLength: tlSection.length,
957
+ });
958
+ }
959
+ }
960
+ }
961
+ catch (tlError) {
962
+ this.logger.warn('Failed to inject TL addon (non-critical)', {
963
+ sessionName,
964
+ error: tlError instanceof Error ? tlError.message : String(tlError),
965
+ });
966
+ }
967
+ }
891
968
  // Generate and inject startup briefing from session memory
892
969
  try {
893
970
  const sessionMemoryService = SessionMemoryService.getInstance();
@@ -1440,6 +1517,8 @@ After checking in, just say "Ready for tasks" and wait for me to send you work.`
1440
1517
  if (role !== ORCHESTRATOR_ROLE && config.teamId && config.memberId) {
1441
1518
  ContextWindowMonitorService.getInstance().startSessionMonitoring(sessionName, config.memberId, config.teamId, role, runtimeType);
1442
1519
  }
1520
+ // Start OAuth relogin monitoring for recovered session
1521
+ OAuthReloginMonitorService.getInstance().startMonitoring(sessionName, runtimeType);
1443
1522
  return {
1444
1523
  success: true,
1445
1524
  sessionName,
@@ -1453,6 +1532,40 @@ After checking in, just say "Ready for tasks" and wait for me to send you work.`
1453
1532
  await (await this.getSessionHelper()).killSession(sessionName);
1454
1533
  await delay(1000); // Wait for cleanup
1455
1534
  }
1535
+ // ===== In-process Crewly Agent branch =====
1536
+ // Crewly Agent runs inside the Node.js process — no PTY session needed.
1537
+ if (runtimeType === RUNTIME_TYPES.CREWLY_AGENT) {
1538
+ this.logger.info('Starting in-process Crewly Agent runtime', { sessionName, role });
1539
+ const crewlyRuntime = this.createRuntimeService(runtimeType);
1540
+ // Determine role name for system prompt lookup
1541
+ const roleName = role === ORCHESTRATOR_ROLE ? 'orchestrator' : role.toLowerCase().replace(/\s+/g, '-');
1542
+ await crewlyRuntime.initializeInProcess(sessionName, undefined, roleName);
1543
+ // Track the in-process runtime for message routing
1544
+ this.inProcessRuntimes.set(sessionName, crewlyRuntime);
1545
+ // Load and deliver registration prompt as the first message
1546
+ try {
1547
+ const prompt = await this.loadRegistrationPrompt(role, sessionName, memberId);
1548
+ this.logger.info('Delivering registration prompt to Crewly Agent', {
1549
+ sessionName, promptLength: prompt.length,
1550
+ });
1551
+ await crewlyRuntime.handleMessage(prompt);
1552
+ }
1553
+ catch (promptError) {
1554
+ this.logger.warn('Registration prompt delivery failed (non-fatal for crewly-agent)', {
1555
+ sessionName,
1556
+ error: promptError instanceof Error ? promptError.message : String(promptError),
1557
+ });
1558
+ }
1559
+ // Start context window monitoring if applicable
1560
+ if (role !== ORCHESTRATOR_ROLE && config.teamId && config.memberId) {
1561
+ ContextWindowMonitorService.getInstance().startSessionMonitoring(sessionName, config.memberId, config.teamId, role, runtimeType);
1562
+ }
1563
+ return {
1564
+ success: true,
1565
+ sessionName,
1566
+ message: 'Crewly Agent in-process runtime initialized and registered',
1567
+ };
1568
+ }
1456
1569
  // Create new session (same approach for both orchestrator and team members)
1457
1570
  const cwdToUse = projectPath || process.cwd();
1458
1571
  this.logger.info('Creating PTY session', {
@@ -1533,6 +1646,8 @@ After checking in, just say "Ready for tasks" and wait for me to send you work.`
1533
1646
  if (role !== ORCHESTRATOR_ROLE && config.teamId && config.memberId) {
1534
1647
  ContextWindowMonitorService.getInstance().startSessionMonitoring(sessionName, config.memberId, config.teamId, role, runtimeType);
1535
1648
  }
1649
+ // Start OAuth relogin monitoring for newly created session
1650
+ OAuthReloginMonitorService.getInstance().startMonitoring(sessionName, runtimeType);
1536
1651
  return {
1537
1652
  success: true,
1538
1653
  sessionName,
@@ -1564,8 +1679,17 @@ After checking in, just say "Ready for tasks" and wait for me to send you work.`
1564
1679
  this.logger.info('Terminating agent session (unified approach)', { sessionName, role });
1565
1680
  // Stop runtime exit monitoring before killing the session
1566
1681
  RuntimeExitMonitorService.getInstance().stopMonitoring(sessionName);
1682
+ // Stop OAuth relogin monitoring before killing the session
1683
+ OAuthReloginMonitorService.getInstance().stopMonitoring(sessionName);
1567
1684
  // Stop context window monitoring before killing the session
1568
1685
  ContextWindowMonitorService.getInstance().stopSessionMonitoring(sessionName);
1686
+ // Shut down in-process Crewly Agent runtime if present
1687
+ const inProcessRuntime = this.inProcessRuntimes.get(sessionName);
1688
+ if (inProcessRuntime) {
1689
+ inProcessRuntime.shutdown();
1690
+ this.inProcessRuntimes.delete(sessionName);
1691
+ this.logger.info('In-process Crewly Agent runtime shut down', { sessionName });
1692
+ }
1569
1693
  // Get session helper once to avoid repeated async calls
1570
1694
  const sessionHelper = await this.getSessionHelper();
1571
1695
  const sessionExists = sessionHelper.sessionExists(sessionName);
@@ -1574,7 +1698,7 @@ After checking in, just say "Ready for tasks" and wait for me to send you work.`
1574
1698
  await sessionHelper.killSession(sessionName);
1575
1699
  this.logger.info('Session terminated successfully', { sessionName });
1576
1700
  }
1577
- else {
1701
+ else if (!inProcessRuntime) {
1578
1702
  this.logger.info('Session already terminated or does not exist', { sessionName });
1579
1703
  }
1580
1704
  // Capture session end for memory persistence
@@ -1674,6 +1798,31 @@ After checking in, just say "Ready for tasks" and wait for me to send you work.`
1674
1798
  if (!runtimeType) {
1675
1799
  runtimeType = await this.resolveSessionRuntimeType(sessionName);
1676
1800
  }
1801
+ // ===== In-process Crewly Agent delivery =====
1802
+ // Route directly to the in-process runtime, bypassing PTY entirely.
1803
+ if (runtimeType === RUNTIME_TYPES.CREWLY_AGENT) {
1804
+ const crewlyRuntime = this.inProcessRuntimes.get(sessionName);
1805
+ if (!crewlyRuntime || !crewlyRuntime.isReady()) {
1806
+ return {
1807
+ success: false,
1808
+ error: `Crewly Agent runtime for '${sessionName}' is not initialized`,
1809
+ };
1810
+ }
1811
+ try {
1812
+ await crewlyRuntime.handleMessage(message);
1813
+ this.logger.info('Message delivered to in-process Crewly Agent', {
1814
+ sessionName, messageLength: message.length,
1815
+ });
1816
+ return { success: true, message: 'Message delivered to Crewly Agent' };
1817
+ }
1818
+ catch (agentError) {
1819
+ const errMsg = agentError instanceof Error ? agentError.message : String(agentError);
1820
+ this.logger.error('Crewly Agent message handling failed', {
1821
+ sessionName, error: errMsg,
1822
+ });
1823
+ return { success: false, error: `Crewly Agent error: ${errMsg}` };
1824
+ }
1825
+ }
1677
1826
  // Get session helper once for this method
1678
1827
  const sessionHelper = await this.getSessionHelper();
1679
1828
  // Check if session exists
@@ -1755,6 +1904,11 @@ After checking in, just say "Ready for tasks" and wait for me to send you work.`
1755
1904
  * @returns true if agent is ready, false if timed out
1756
1905
  */
1757
1906
  async waitForAgentReady(sessionName, timeoutMs = EVENT_DELIVERY_CONSTANTS.AGENT_READY_TIMEOUT, runtimeType) {
1907
+ // In-process Crewly Agent is always "ready" (no prompt to wait for)
1908
+ const inProcessRuntime = this.inProcessRuntimes.get(sessionName);
1909
+ if (inProcessRuntime) {
1910
+ return inProcessRuntime.isReady();
1911
+ }
1758
1912
  const sessionHelper = await this.getSessionHelper();
1759
1913
  // Check if session exists
1760
1914
  if (!sessionHelper.sessionExists(sessionName)) {
@@ -1834,256 +1988,6 @@ After checking in, just say "Ready for tasks" and wait for me to send you work.`
1834
1988
  });
1835
1989
  });
1836
1990
  }
1837
- /**
1838
- * @deprecated Replaced by SessionCommandHelper.sendMessage() in sendMessageWithRetry.
1839
- * Complex event-driven state machine was fragile — Enter key often got lost.
1840
- * Kept as dead code for reference during transition.
1841
- */
1842
- async _deprecated_sendMessageEventDriven(sessionName, message, timeoutMs = EVENT_DELIVERY_CONSTANTS.TOTAL_DELIVERY_TIMEOUT) {
1843
- const sessionHelper = await this.getSessionHelper();
1844
- const session = sessionHelper.getSession(sessionName);
1845
- if (!session) {
1846
- this.logger.error('Session not found for event-driven delivery', { sessionName });
1847
- return false;
1848
- }
1849
- return new Promise((resolve) => {
1850
- let buffer = '';
1851
- let messageSent = false;
1852
- let enterSent = false;
1853
- let enterAccepted = false;
1854
- let deliveryConfirmed = false;
1855
- let resolved = false;
1856
- // Track all timeouts to prevent memory leaks (P1.1 fix)
1857
- const pendingTimeouts = [];
1858
- const scheduleTimeout = (fn, delayMs) => {
1859
- const id = setTimeout(fn, delayMs);
1860
- pendingTimeouts.push(id);
1861
- return id;
1862
- };
1863
- const cleanup = () => {
1864
- // Immediately mark as resolved to prevent race conditions (P1.2 fix)
1865
- const wasResolved = resolved;
1866
- resolved = true;
1867
- if (!wasResolved) {
1868
- // Clear all pending timeouts to prevent memory leaks
1869
- pendingTimeouts.forEach((id) => clearTimeout(id));
1870
- clearTimeout(timeoutId);
1871
- unsubscribe();
1872
- }
1873
- };
1874
- // Use centralized patterns from TERMINAL_PATTERNS
1875
- const PASTE_PATTERN = TERMINAL_PATTERNS.PASTE_INDICATOR;
1876
- const PROCESSING_PATTERN = TERMINAL_PATTERNS.PROCESSING;
1877
- // Use centralized timing from EVENT_DELIVERY_CONSTANTS
1878
- const INITIAL_DELAY = EVENT_DELIVERY_CONSTANTS.INITIAL_MESSAGE_DELAY;
1879
- const PASTE_CHECK_DELAY = EVENT_DELIVERY_CONSTANTS.PASTE_CHECK_DELAY;
1880
- const ENTER_RETRY_DELAY = EVENT_DELIVERY_CONSTANTS.ENTER_RETRY_DELAY;
1881
- const MAX_ENTER_RETRIES = EVENT_DELIVERY_CONSTANTS.MAX_ENTER_RETRIES;
1882
- const MAX_BUFFER_SIZE = EVENT_DELIVERY_CONSTANTS.MAX_BUFFER_SIZE;
1883
- // Helper to send the message when prompt is detected
1884
- const sendMessageNow = () => {
1885
- if (messageSent || resolved)
1886
- return;
1887
- this.logger.debug('Claude at prompt, sending message', {
1888
- sessionName,
1889
- messageLength: message.length,
1890
- isMultiLine: message.includes('\n'),
1891
- });
1892
- // Send the message text
1893
- session.write(message);
1894
- messageSent = true;
1895
- const isMultiLine = message.includes('\n');
1896
- // Track Enter key state
1897
- let enterAttempts = 0;
1898
- let processingDetected = false;
1899
- const bufferAtSend = buffer;
1900
- // Function to send Enter and track attempts
1901
- const sendEnterKey = (reason) => {
1902
- if (resolved || processingDetected)
1903
- return;
1904
- enterAttempts++;
1905
- session.write('\r');
1906
- enterSent = true;
1907
- this.logger.debug('Enter key sent', {
1908
- sessionName,
1909
- attempt: enterAttempts,
1910
- reason,
1911
- });
1912
- };
1913
- // Function to check if Enter was accepted (processing started)
1914
- const checkProcessingStarted = () => {
1915
- const newData = buffer.slice(bufferAtSend.length);
1916
- return PROCESSING_PATTERN.test(newData);
1917
- };
1918
- // Function to check for paste indicator
1919
- const checkPasteIndicator = () => {
1920
- const newData = buffer.slice(bufferAtSend.length);
1921
- return PASTE_PATTERN.test(newData);
1922
- };
1923
- // Strategy: Send Enter with progressive timing, retry if not accepted
1924
- const attemptEnter = (attemptNum) => {
1925
- if (resolved || processingDetected)
1926
- return;
1927
- // Check if processing already started
1928
- if (checkProcessingStarted()) {
1929
- processingDetected = true;
1930
- enterAccepted = true;
1931
- this.logger.debug('Processing detected, message accepted', { sessionName, attemptNum });
1932
- buffer = ''; // Reset for processing indicator detection
1933
- return;
1934
- }
1935
- if (attemptNum > MAX_ENTER_RETRIES) {
1936
- this.logger.warn('Max Enter retries reached, verifying message acceptance', { sessionName });
1937
- scheduleTimeout(async () => {
1938
- if (resolved)
1939
- return;
1940
- const stuck = await this.isMessageStuckAtPrompt(sessionName, message);
1941
- if (stuck) {
1942
- this.logger.warn('Message stuck at prompt after all Enter retries', { sessionName });
1943
- const stuckHelper = await this.getSessionHelper();
1944
- await stuckHelper.clearCurrentCommandLine(sessionName);
1945
- enterAccepted = false;
1946
- }
1947
- else {
1948
- this.logger.debug('Message appears accepted (no longer at prompt)', { sessionName });
1949
- enterAccepted = true;
1950
- buffer = '';
1951
- }
1952
- }, EVENT_DELIVERY_CONSTANTS.POST_ENTER_VERIFICATION_DELAY);
1953
- return;
1954
- }
1955
- sendEnterKey(attemptNum === 1 ? 'initial' : `retry-${attemptNum}`);
1956
- // Schedule check and possible retry (using tracked timeout to prevent leaks)
1957
- scheduleTimeout(() => {
1958
- if (resolved)
1959
- return;
1960
- if (checkProcessingStarted()) {
1961
- processingDetected = true;
1962
- enterAccepted = true;
1963
- this.logger.debug('Processing detected after Enter', { sessionName, attemptNum });
1964
- buffer = '';
1965
- }
1966
- else {
1967
- // Not accepted yet, retry
1968
- this.logger.debug('Enter may not have been accepted, retrying', {
1969
- sessionName,
1970
- attemptNum,
1971
- bufferLength: buffer.length,
1972
- });
1973
- attemptEnter(attemptNum + 1);
1974
- }
1975
- }, ENTER_RETRY_DELAY);
1976
- };
1977
- // For multi-line messages, wait longer for paste indicator
1978
- // For single-line messages, send Enter sooner
1979
- const initialWait = isMultiLine ? PASTE_CHECK_DELAY : INITIAL_DELAY;
1980
- scheduleTimeout(() => {
1981
- if (resolved)
1982
- return;
1983
- // For multi-line: check if paste indicator appeared
1984
- if (isMultiLine && checkPasteIndicator()) {
1985
- this.logger.debug('Paste indicator detected', { sessionName });
1986
- }
1987
- // Start Enter key attempts
1988
- attemptEnter(1);
1989
- }, initialWait);
1990
- };
1991
- const timeoutId = setTimeout(async () => {
1992
- this.logger.debug('Event-driven delivery timed out', {
1993
- sessionName,
1994
- messageSent,
1995
- enterSent,
1996
- enterAccepted,
1997
- deliveryConfirmed,
1998
- bufferLength: buffer.length,
1999
- });
2000
- // If Enter was sent but not confirmed accepted, verify via terminal capture
2001
- if (enterSent && !enterAccepted && !deliveryConfirmed) {
2002
- const timeoutHelper = await this.getSessionHelper();
2003
- const stuck = await this.isMessageStuckAtPrompt(sessionName, message);
2004
- if (stuck) {
2005
- this.logger.warn('Timeout: message stuck at prompt, clearing and failing', { sessionName });
2006
- await timeoutHelper.clearCurrentCommandLine(sessionName);
2007
- cleanup();
2008
- resolve(false);
2009
- return;
2010
- }
2011
- this.logger.debug('Timeout: message not at prompt, treating as accepted', { sessionName });
2012
- }
2013
- cleanup();
2014
- resolve(enterAccepted || deliveryConfirmed);
2015
- }, timeoutMs);
2016
- // IMPORTANT: Check current terminal state, but wait for output to settle first.
2017
- // If the orchestrator just finished outputting (greeting, notification, status bar),
2018
- // the prompt may not be cleanly detectable. We capture the pane, wait briefly,
2019
- // and re-capture. If output is still changing, wait again before checking prompt.
2020
- // Use 50 lines to account for status bars and notifications that can
2021
- // wrap across many lines and push the prompt out of a smaller window.
2022
- const waitForSettled = async () => {
2023
- let prevOutput = sessionHelper.capturePane(sessionName);
2024
- for (let i = 0; i < 5; i++) { // Max 5 checks, 500ms apart = 2.5s max
2025
- if (resolved)
2026
- return;
2027
- await delay(500);
2028
- if (resolved)
2029
- return;
2030
- const currentOutput = sessionHelper.capturePane(sessionName);
2031
- if (currentOutput === prevOutput) {
2032
- // Output settled
2033
- if (this.isClaudeAtPrompt(currentOutput)) {
2034
- this.logger.debug('Claude at prompt after output settled', { sessionName, settleChecks: i + 1 });
2035
- sendMessageNow();
2036
- }
2037
- return;
2038
- }
2039
- prevOutput = currentOutput;
2040
- }
2041
- // Output still changing after 2.5s - check anyway
2042
- if (!resolved && this.isClaudeAtPrompt(prevOutput)) {
2043
- this.logger.debug('Claude at prompt (output still changing, checking anyway)', { sessionName });
2044
- sendMessageNow();
2045
- }
2046
- };
2047
- waitForSettled();
2048
- const unsubscribe = session.onData((data) => {
2049
- if (resolved)
2050
- return;
2051
- // Accumulate data with size limit to prevent memory exhaustion (P2.3 fix)
2052
- buffer += data;
2053
- if (buffer.length > MAX_BUFFER_SIZE) {
2054
- buffer = buffer.slice(-MAX_BUFFER_SIZE);
2055
- }
2056
- // Phase 1: Wait for Claude to be at prompt before sending
2057
- if (!messageSent) {
2058
- const isAtPrompt = buffer.split('\n').some(line => line.trim().length > 0 && isPromptLine(line));
2059
- if (isAtPrompt) {
2060
- sendMessageNow();
2061
- }
2062
- return;
2063
- }
2064
- // Phase 2: Only check for processing indicators AFTER Enter has been sent
2065
- if (!enterSent) {
2066
- return; // Wait for Enter to be sent
2067
- }
2068
- // Look for processing indicators confirming delivery
2069
- const hasProcessingIndicator = containsProcessingIndicator(buffer);
2070
- // Also check if prompt disappeared (Claude is working)
2071
- const promptStillVisible = buffer.split('\n').some(line => line.trim().length > 0 && isPromptLine(line));
2072
- // Use constant for minimum buffer check (P3.2 fix)
2073
- if (hasProcessingIndicator || (!promptStillVisible && buffer.length > EVENT_DELIVERY_CONSTANTS.MIN_BUFFER_FOR_PROCESSING_DETECTION)) {
2074
- this.logger.debug('Message delivery confirmed (event-driven)', {
2075
- sessionName,
2076
- hasProcessingIndicator,
2077
- promptStillVisible,
2078
- bufferLength: buffer.length,
2079
- });
2080
- deliveryConfirmed = true;
2081
- cleanup();
2082
- resolve(true);
2083
- }
2084
- });
2085
- });
2086
- }
2087
1991
  /**
2088
1992
  * Send message with retry logic for reliable delivery to Claude Code.
2089
1993
  * Uses SessionCommandHelper.sendMessage() (proven two-step write pattern)
@@ -2114,6 +2018,17 @@ After checking in, just say "Ready for tasks" and wait for me to send you work.`
2114
2018
  });
2115
2019
  // Verify agent is at prompt before sending
2116
2020
  const output = sessionHelper.capturePane(sessionName);
2021
+ // Gemini CLI stuck-connectivity guard (#128): If the CLI is in a
2022
+ // "Trying to reach <model>" retry loop, it will never process
2023
+ // new messages. Bail out immediately so the caller gets a clear
2024
+ // failure signal and the runtime-exit-monitor can trigger recovery.
2025
+ if (runtimeType === RUNTIME_TYPES.GEMINI_CLI && GEMINI_STUCK_CONNECTIVITY_PATTERN.test(output)) {
2026
+ this.logger.warn('Gemini CLI stuck in connectivity retry loop, aborting message delivery (#128)', {
2027
+ sessionName,
2028
+ attempt,
2029
+ });
2030
+ return false;
2031
+ }
2117
2032
  if (!this.isClaudeAtPrompt(output, runtimeType)) {
2118
2033
  if (attempt === maxAttempts) {
2119
2034
  // On the final attempt, check if the agent is DEFINITELY busy
@@ -2187,38 +2102,45 @@ After checking in, just say "Ready for tasks" and wait for me to send you work.`
2187
2102
  // TUI re-render (SIGWINCH), then Tab to cycle Ink focus.
2188
2103
  await sessionHelper.sendCtrlC(sessionName);
2189
2104
  await delay(300);
2190
- try {
2191
- const session = sessionHelper.getSession(sessionName);
2192
- if (session) {
2193
- session.resize(81, 25);
2194
- await delay(200);
2195
- session.resize(80, 24);
2196
- await delay(300);
2197
- }
2198
- }
2199
- catch { /* non-fatal */ }
2200
- await sessionHelper.sendKey(sessionName, 'Tab');
2201
- await delay(300);
2202
2105
  }
2203
- else {
2204
- // First attempt: lightweight focus nudge Tab key cycles Ink's
2205
- // focusNext() to ensure the InputPrompt is active. This prevents
2206
- // the "write succeeds but TUI ignores it" failure mode without
2207
- // the overhead of Ctrl+C or PTY resize.
2208
- await sessionHelper.sendKey(sessionName, 'Tab');
2209
- await delay(200);
2106
+ // PTY resize on ALL attempts to force SIGWINCH → Ink TUI re-render.
2107
+ // Claude Code's Ink TUI can lose internal input focus after stop hooks
2108
+ // (especially ones that error), state transitions, or idle periods.
2109
+ // When defocused, the `❯` prompt is visible in the terminal buffer
2110
+ // but writes are silently consumed by the framework NOT routed to
2111
+ // the InputPrompt. Tab alone was insufficient; PTY resize forces a
2112
+ // full TUI re-render that reliably restores focus state.
2113
+ // This matches the manual workaround where pressing a key in the
2114
+ // frontend terminal "wakes up" the input handler.
2115
+ try {
2116
+ const session = sessionHelper.getSession(sessionName);
2117
+ if (session) {
2118
+ session.resize(81, 25);
2119
+ await delay(200);
2120
+ session.resize(80, 24);
2121
+ await delay(300);
2122
+ }
2210
2123
  }
2124
+ catch { /* non-fatal */ }
2125
+ await sessionHelper.sendKey(sessionName, 'Tab');
2126
+ await delay(300);
2211
2127
  }
2212
2128
  else {
2213
2129
  // Detect recent /compress — Ink TUI loses internal focus after
2214
2130
  // /compress re-renders, causing subsequent messages to be silently
2215
2131
  // dropped even though the prompt `>` is visible (#114).
2216
2132
  // Always force PTY resize on attempt 1 if /compress detected.
2133
+ // Also detect ✖ error state (#130) — MCP connection errors
2134
+ // cause a persistent error indicator that steals TUI focus.
2217
2135
  const recentOutput = sessionHelper.capturePane(sessionName, 40);
2218
2136
  const compressDetected = recentOutput.includes('/compress') ||
2219
2137
  recentOutput.includes('Context compressed') ||
2220
2138
  recentOutput.includes('Compressing context');
2221
- const needsResize = attempt > 1 || compressDetected;
2139
+ // Check for Gemini CLI error indicators in the status bar area (#130).
2140
+ const statusArea = recentOutput.split('\n').slice(-GEMINI_ERROR_STATE_CONSTANTS.STATUS_AREA_LINES).join('\n');
2141
+ const errorStateDetected = recentOutput.includes(GEMINI_ERROR_STATE_CONSTANTS.ERROR_MARKER) ||
2142
+ GEMINI_ERROR_STATE_CONSTANTS.ERROR_COUNT_PATTERN.test(statusArea);
2143
+ const needsResize = attempt > 1 || compressDetected || errorStateDetected;
2222
2144
  // Force a PTY resize to trigger SIGWINCH, making Ink
2223
2145
  // re-render the TUI and potentially restore focus state.
2224
2146
  if (needsResize) {
@@ -2244,19 +2166,39 @@ After checking in, just say "Ready for tasks" and wait for me to send you work.`
2244
2166
  });
2245
2167
  }
2246
2168
  }
2169
+ // If error state detected (✖), dismiss the error overlay first (#130).
2170
+ // F12 toggles the error details panel in Gemini CLI, Enter dismisses
2171
+ // any overlay/notification, and the combination restores the TUI to a
2172
+ // state where the InputPrompt can accept input.
2173
+ if (errorStateDetected) {
2174
+ this.logger.info('Gemini CLI error state detected (✖), dismissing before delivery (#130)', {
2175
+ sessionName,
2176
+ attempt,
2177
+ });
2178
+ // F12 to close error details panel if open
2179
+ await sessionHelper.sendKey(sessionName, 'F12');
2180
+ await delay(300);
2181
+ // Enter to dismiss any remaining overlay/notification
2182
+ await sessionHelper.sendEnter(sessionName);
2183
+ await delay(500);
2184
+ }
2247
2185
  // Send Tab to cycle Ink focus. In Ink v6, Tab triggers
2248
2186
  // focusNext() in FocusContext, which moves focus to the next
2249
2187
  // focusable component (InputPrompt). This works even when the
2250
2188
  // input is defocused because the Tab handler runs at the Ink
2251
2189
  // framework level, not the component level.
2190
+ // Send two Tabs to cycle through error/notification components
2191
+ // that may be in the focus chain (#130).
2192
+ await sessionHelper.sendKey(sessionName, 'Tab');
2193
+ await delay(200);
2252
2194
  await sessionHelper.sendKey(sessionName, 'Tab');
2253
2195
  await delay(300);
2254
2196
  // Then Enter to dismiss any notification overlay and ensure
2255
2197
  // the input is engaged. Enter on an empty `> ` prompt is a
2256
2198
  // safe no-op (just shows a new blank prompt line).
2257
2199
  await sessionHelper.sendEnter(sessionName);
2258
- // Extra settling time after /compress to let Ink TUI stabilize
2259
- await delay(compressDetected ? 1000 : 500);
2200
+ // Extra settling time after /compress or error state to let Ink TUI stabilize
2201
+ await delay((compressDetected || errorStateDetected) ? 1000 : 500);
2260
2202
  }
2261
2203
  // For Gemini CLI: detect and gently escape interactive modes before
2262
2204
  // sending the message. Avoid Ctrl-C here — Gemini interprets it as
@@ -2289,6 +2231,50 @@ After checking in, just say "Ready for tasks" and wait for me to send you work.`
2289
2231
  // border redraws that can cause length changes unrelated to delivery.
2290
2232
  const beforeOutput = sessionHelper.capturePane(sessionName, 20);
2291
2233
  const beforeLength = beforeOutput.length;
2234
+ // Deduplication guard (#128): Check if the agent is already
2235
+ // processing on ALL attempts (not just retries). A previous
2236
+ // write may have succeeded but verification failed. Re-writing
2237
+ // the same message creates a duplicate in the input buffer.
2238
+ {
2239
+ const preWriteCheck = sessionHelper.capturePane(sessionName);
2240
+ const hasSpinner = containsSpinnerOrWorkingIndicator(preWriteCheck);
2241
+ if (hasSpinner) {
2242
+ // Hash-based dedup: if the same message was recently sent
2243
+ // and the agent is processing, it's very likely our message.
2244
+ const msgHash = message.substring(0, 200);
2245
+ const lastSent = this.lastSentMessageHash.get(sessionName);
2246
+ const isRecentDuplicate = lastSent
2247
+ && lastSent.hash === msgHash
2248
+ && (Date.now() - lastSent.sentAt) < 60000;
2249
+ if (isRecentDuplicate || attempt > 1) {
2250
+ this.logger.info('Agent already processing — skipping write to prevent duplicate (#128)', {
2251
+ sessionName,
2252
+ attempt,
2253
+ isRecentDuplicate: !!isRecentDuplicate,
2254
+ });
2255
+ return true;
2256
+ }
2257
+ }
2258
+ // On retries: also check if agent is not at prompt AND our
2259
+ // message text is NOT stuck at the bottom.
2260
+ if (attempt > 1) {
2261
+ const notAtPrompt = !this.isClaudeAtPrompt(preWriteCheck, runtimeType);
2262
+ if (notAtPrompt) {
2263
+ const msgSnippet = (message.length > 20
2264
+ ? message.substring(0, 80)
2265
+ : message).replace(/\s+/g, ' ').trim();
2266
+ const bottomLines = preWriteCheck.split('\n').slice(-10).join(' ').replace(/\s+/g, ' ');
2267
+ const textStuck = bottomLines.includes(msgSnippet);
2268
+ if (!textStuck) {
2269
+ this.logger.info('Agent not at prompt and message not stuck — skipping re-write (#128)', {
2270
+ sessionName,
2271
+ attempt,
2272
+ });
2273
+ return true;
2274
+ }
2275
+ }
2276
+ }
2277
+ }
2292
2278
  // Use SessionCommandHelper.sendMessage() — proven two-step write:
2293
2279
  // 1. session.write(message) — triggers bracketed paste
2294
2280
  // 2. await delay(scaled) — waits for paste processing
@@ -2299,6 +2285,11 @@ After checking in, just say "Ready for tasks" and wait for me to send you work.`
2299
2285
  // If progressive verification below misses an Enter drop, the
2300
2286
  // background scanner will catch it within 30s.
2301
2287
  this.trackSentMessage(sessionName, message);
2288
+ // Track message hash for deduplication on retry (#128)
2289
+ this.lastSentMessageHash.set(sessionName, {
2290
+ hash: message.substring(0, 200),
2291
+ sentAt: Date.now(),
2292
+ });
2302
2293
  // Wait for agent to start processing, then verify delivery.
2303
2294
  // TUI runtimes need a longer delay (3s) for the TUI to redraw
2304
2295
  // and show processing indicators after accepting input.
@@ -2365,11 +2356,17 @@ After checking in, just say "Ready for tasks" and wait for me to send you work.`
2365
2356
  : message).replace(/\s+/g, ' ').trim();
2366
2357
  const promptBottomLines = currentOutput.split('\n').slice(-10).join(' ').replace(/\s+/g, ' ');
2367
2358
  if (promptBottomLines.includes(promptMsgSnippet)) {
2368
- this.logger.warn('At prompt with message text at bottom — pressing Enter', {
2359
+ this.logger.warn('At prompt with message text at bottom — pressing Tab+Enter', {
2369
2360
  sessionName,
2370
2361
  attempt,
2371
2362
  intervalMs,
2372
2363
  });
2364
+ // Tab restores Ink TUI focus before Enter — without this,
2365
+ // Enter may be consumed by the framework but not routed to
2366
+ // the input component if focus was lost during a re-render
2367
+ // (e.g., after stop hooks, state transitions).
2368
+ await sessionHelper.sendKey(sessionName, 'Tab');
2369
+ await delay(200);
2373
2370
  await sessionHelper.sendEnter(sessionName);
2374
2371
  await delay(500);
2375
2372
  await sessionHelper.sendEnter(sessionName); // backup
@@ -2410,12 +2407,14 @@ After checking in, just say "Ready for tasks" and wait for me to send you work.`
2410
2407
  // Message text is at the bottom of the terminal but the
2411
2408
  // prompt is no longer in its idle form — Enter was dropped.
2412
2409
  // Instead of waiting and doing a full Ctrl+C + resend retry,
2413
- // press Enter immediately to submit the already-pasted text.
2414
- this.logger.warn('Message text stuck at bottom — pressing Enter to recover', {
2410
+ // use Tab to restore TUI focus, then Enter to submit.
2411
+ this.logger.warn('Message text stuck at bottom — pressing Tab+Enter to recover', {
2415
2412
  sessionName,
2416
2413
  attempt,
2417
2414
  intervalMs,
2418
2415
  });
2416
+ await sessionHelper.sendKey(sessionName, 'Tab');
2417
+ await delay(200);
2419
2418
  await sessionHelper.sendEnter(sessionName);
2420
2419
  await delay(500);
2421
2420
  await sessionHelper.sendEnter(sessionName); // backup Enter
@@ -2735,8 +2734,12 @@ After checking in, just say "Ready for tasks" and wait for me to send you work.`
2735
2734
  */
2736
2735
  async recoverStuckTuiMessage(sessionName, message) {
2737
2736
  const sessionHelper = await this.getSessionHelper();
2738
- // Press Enter to submit the stuck text
2739
- this.logger.info('Pressing Enter to recover stuck TUI message', { sessionName });
2737
+ // Tab restores Ink TUI focus, then Enter to submit the stuck text.
2738
+ // Without Tab, Enter may be consumed by the framework but not routed
2739
+ // to the input component if focus was lost during a re-render.
2740
+ this.logger.info('Pressing Tab+Enter to recover stuck TUI message', { sessionName });
2741
+ await sessionHelper.sendKey(sessionName, 'Tab');
2742
+ await delay(200);
2740
2743
  await sessionHelper.sendEnter(sessionName);
2741
2744
  await delay(500);
2742
2745
  // Double-tap: send a backup Enter in case the first was consumed
@@ -2850,11 +2853,13 @@ After checking in, just say "Ready for tasks" and wait for me to send you work.`
2850
2853
  if (isPlaceholder) {
2851
2854
  break;
2852
2855
  }
2853
- this.logger.warn('Background scan: text stuck at TUI prompt, pressing Enter', {
2856
+ this.logger.warn('Background scan: text stuck at TUI prompt, pressing Tab+Enter', {
2854
2857
  sessionName,
2855
2858
  promptContent: promptContent.slice(0, 80),
2856
2859
  });
2857
- // Press Enter to submit the stuck text
2860
+ // Tab restores Ink TUI focus before Enter
2861
+ await sessionHelper.sendKey(sessionName, 'Tab');
2862
+ await delay(200);
2858
2863
  await sessionHelper.sendEnter(sessionName);
2859
2864
  await delay(500);
2860
2865
  // Backup Enter
@@ -2890,11 +2895,14 @@ After checking in, just say "Ready for tasks" and wait for me to send you work.`
2890
2895
  if (now - entry.sentAt < MIN_AGE_MS)
2891
2896
  continue;
2892
2897
  if (bottomText.includes(entry.snippet)) {
2893
- this.logger.warn('Background scan: tracked message stuck, pressing Enter', {
2898
+ this.logger.warn('Background scan: tracked message stuck, pressing Tab+Enter', {
2894
2899
  sessionName,
2895
2900
  snippet: entry.snippet.slice(0, 50),
2896
2901
  ageMs: now - entry.sentAt,
2897
2902
  });
2903
+ // Tab restores Ink TUI focus before Enter
2904
+ await sessionHelper.sendKey(sessionName, 'Tab');
2905
+ await delay(200);
2898
2906
  await sessionHelper.sendEnter(sessionName);
2899
2907
  await delay(500);
2900
2908
  await sessionHelper.sendEnter(sessionName); // backup