crewly 1.2.3 → 1.2.4

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 (610) hide show
  1. package/LICENSE +1 -1
  2. package/README.md +1 -1
  3. package/config/constants.ts +44 -1
  4. package/config/index.ts +4 -0
  5. package/config/roles/orchestrator/prompt.md +30 -2
  6. package/config/roles/team-leader/prompt.md +169 -0
  7. package/config/roles/team-leader/role.json +13 -0
  8. package/config/roles/team-leader/tl-addon.md +142 -0
  9. package/config/runtime_scripts/runtime-config.json +7 -0
  10. package/config/skills/_common/lib.sh +37 -0
  11. package/config/skills/agent/computer-use/execute.sh +228 -0
  12. package/config/skills/agent/computer-use/instructions.md +103 -0
  13. package/config/skills/agent/computer-use/lib/accessibility.sh +292 -0
  14. package/config/skills/agent/computer-use/lib/applescript.sh +117 -0
  15. package/config/skills/agent/computer-use/lib/discover.sh +122 -0
  16. package/config/skills/agent/computer-use/lib/playwright.sh +153 -0
  17. package/config/skills/agent/computer-use/lib/screenshot.sh +61 -0
  18. package/config/skills/agent/computer-use/skill.json +29 -0
  19. package/config/skills/agent/core/accept-task/execute.sh +7 -1
  20. package/config/skills/agent/core/complete-task/execute.sh +38 -1
  21. package/config/skills/agent/core/report-status/execute.sh +51 -2
  22. package/config/skills/agent/desktop-app-control/execute.sh +561 -0
  23. package/config/skills/agent/desktop-app-control/instructions.md +102 -0
  24. package/config/skills/agent/desktop-app-control/skill.json +33 -0
  25. package/config/skills/orchestrator/broadcast-to-org/execute.sh +88 -0
  26. package/config/skills/orchestrator/broadcast-to-org/instructions.md +51 -0
  27. package/config/skills/orchestrator/broadcast-to-org/skill.json +20 -0
  28. package/config/skills/orchestrator/delegate-task/execute.sh +75 -10
  29. package/config/skills/orchestrator/delegate-task/instructions.md +11 -1
  30. package/config/skills/orchestrator/handle-agent-failure/execute.sh +45 -0
  31. package/config/skills/orchestrator/handle-agent-failure/instructions.md +29 -0
  32. package/config/skills/orchestrator/handle-agent-failure/skill.json +20 -0
  33. package/config/skills/orchestrator/restart-crewly/instructions.md +9 -2
  34. package/config/skills/team-leader/_common/lib.sh +4 -0
  35. package/config/skills/team-leader/aggregate-results/execute.sh +168 -0
  36. package/config/skills/team-leader/aggregate-results/instructions.md +89 -0
  37. package/config/skills/team-leader/aggregate-results/skill.json +20 -0
  38. package/config/skills/team-leader/decompose-goal/execute.sh +86 -0
  39. package/config/skills/team-leader/decompose-goal/instructions.md +84 -0
  40. package/config/skills/team-leader/decompose-goal/skill.json +20 -0
  41. package/config/skills/team-leader/delegate-task/execute.sh +142 -0
  42. package/config/skills/team-leader/delegate-task/instructions.md +55 -0
  43. package/config/skills/team-leader/delegate-task/skill.json +20 -0
  44. package/config/skills/team-leader/handle-failure/execute.sh +119 -0
  45. package/config/skills/team-leader/handle-failure/instructions.md +93 -0
  46. package/config/skills/team-leader/handle-failure/skill.json +20 -0
  47. package/config/skills/team-leader/schedule-check/execute.sh +65 -0
  48. package/config/skills/team-leader/schedule-check/execute.test.sh +247 -0
  49. package/config/skills/team-leader/schedule-check/instructions.md +49 -0
  50. package/config/skills/team-leader/schedule-check/skill.json +20 -0
  51. package/config/skills/team-leader/start-agent/execute.sh +39 -0
  52. package/config/skills/team-leader/start-agent/instructions.md +48 -0
  53. package/config/skills/team-leader/start-agent/skill.json +20 -0
  54. package/config/skills/team-leader/stop-agent/execute.sh +39 -0
  55. package/config/skills/team-leader/stop-agent/instructions.md +49 -0
  56. package/config/skills/team-leader/stop-agent/skill.json +20 -0
  57. package/config/skills/team-leader/verify-output/execute.sh +296 -0
  58. package/config/skills/team-leader/verify-output/instructions.md +122 -0
  59. package/config/skills/team-leader/verify-output/skill.json +20 -0
  60. package/config/templates/core-team/demo-script.md +41 -0
  61. package/config/templates/core-team/goals.md +20 -0
  62. package/config/templates/core-team/team.json +22 -0
  63. package/config/templates/dev-fullstack/template.json +115 -0
  64. package/config/templates/education-smb/README.md +27 -0
  65. package/config/templates/education-smb/goals.md +16 -0
  66. package/config/templates/education-smb/knowledge/docs/content-standards.md +24 -0
  67. package/config/templates/education-smb/knowledge/docs/education-industry-context.md +13 -0
  68. package/config/templates/education-smb/knowledge/index.json +24 -0
  69. package/config/templates/education-smb/learned-patterns.json +16 -0
  70. package/config/templates/education-smb/quality-gates.yaml +66 -0
  71. package/config/templates/education-smb/roles/analytics-specialist.md +6 -0
  72. package/config/templates/education-smb/roles/content-creator.md +6 -0
  73. package/config/templates/education-smb/roles/curriculum-designer.md +6 -0
  74. package/config/templates/education-smb/roles/engagement-manager.md +6 -0
  75. package/config/templates/education-smb/team.json +40 -0
  76. package/config/templates/education-smb/template.json +26 -0
  77. package/config/templates/education-smb/workflows/course-content-generation.yaml +44 -0
  78. package/config/templates/education-smb/workflows/reporting.yaml +31 -0
  79. package/config/templates/education-smb/workflows/student-communication.yaml +44 -0
  80. package/config/templates/education-smb/workflows.yaml +40 -0
  81. package/config/templates/insurance-smb/README.md +28 -0
  82. package/config/templates/insurance-smb/goals.md +21 -0
  83. package/config/templates/insurance-smb/knowledge/docs/compliance-checklist.md +28 -0
  84. package/config/templates/insurance-smb/knowledge/docs/insurance-industry-context.md +23 -0
  85. package/config/templates/insurance-smb/knowledge/index.json +24 -0
  86. package/config/templates/insurance-smb/learned-patterns.json +16 -0
  87. package/config/templates/insurance-smb/quality-gates.yaml +54 -0
  88. package/config/templates/insurance-smb/roles/claims-processor.md +6 -0
  89. package/config/templates/insurance-smb/roles/client-manager.md +6 -0
  90. package/config/templates/insurance-smb/roles/compliance-officer.md +6 -0
  91. package/config/templates/insurance-smb/roles/marketing-specialist.md +6 -0
  92. package/config/templates/insurance-smb/roles/policy-analyst.md +6 -0
  93. package/config/templates/insurance-smb/team.json +48 -0
  94. package/config/templates/insurance-smb/template.json +26 -0
  95. package/config/templates/insurance-smb/workflows/claims-processing.yaml +48 -0
  96. package/config/templates/insurance-smb/workflows.yaml +43 -0
  97. package/config/templates/research-analysis/template.json +88 -0
  98. package/config/templates/social-media-ops/template.json +85 -0
  99. package/config/templates/video-production/template.json +123 -0
  100. package/dist/backend/backend/src/constants.d.ts +303 -15
  101. package/dist/backend/backend/src/constants.d.ts.map +1 -1
  102. package/dist/backend/backend/src/constants.js +296 -15
  103. package/dist/backend/backend/src/constants.js.map +1 -1
  104. package/dist/backend/backend/src/controllers/chat/chat.controller.d.ts.map +1 -1
  105. package/dist/backend/backend/src/controllers/chat/chat.controller.js +69 -48
  106. package/dist/backend/backend/src/controllers/chat/chat.controller.js.map +1 -1
  107. package/dist/backend/backend/src/controllers/cloud/auth/auth.controller.d.ts +81 -0
  108. package/dist/backend/backend/src/controllers/cloud/auth/auth.controller.d.ts.map +1 -0
  109. package/dist/backend/backend/src/controllers/cloud/auth/auth.controller.js +234 -0
  110. package/dist/backend/backend/src/controllers/cloud/auth/auth.controller.js.map +1 -0
  111. package/dist/backend/backend/src/controllers/cloud/auth/auth.routes.d.ts +25 -0
  112. package/dist/backend/backend/src/controllers/cloud/auth/auth.routes.d.ts.map +1 -0
  113. package/dist/backend/backend/src/controllers/cloud/auth/auth.routes.js +38 -0
  114. package/dist/backend/backend/src/controllers/cloud/auth/auth.routes.js.map +1 -0
  115. package/dist/backend/backend/src/controllers/cloud/cloud-auth.controller.d.ts +69 -0
  116. package/dist/backend/backend/src/controllers/cloud/cloud-auth.controller.d.ts.map +1 -0
  117. package/dist/backend/backend/src/controllers/cloud/cloud-auth.controller.js +165 -0
  118. package/dist/backend/backend/src/controllers/cloud/cloud-auth.controller.js.map +1 -0
  119. package/dist/backend/backend/src/controllers/cloud/cloud-auth.routes.d.ts +23 -0
  120. package/dist/backend/backend/src/controllers/cloud/cloud-auth.routes.d.ts.map +1 -0
  121. package/dist/backend/backend/src/controllers/cloud/cloud-auth.routes.js +32 -0
  122. package/dist/backend/backend/src/controllers/cloud/cloud-auth.routes.js.map +1 -0
  123. package/dist/backend/backend/src/controllers/cloud/cloud.controller.d.ts +52 -0
  124. package/dist/backend/backend/src/controllers/cloud/cloud.controller.d.ts.map +1 -0
  125. package/dist/backend/backend/src/controllers/cloud/cloud.controller.js +122 -0
  126. package/dist/backend/backend/src/controllers/cloud/cloud.controller.js.map +1 -0
  127. package/dist/backend/backend/src/controllers/cloud/cloud.routes.d.ts +21 -0
  128. package/dist/backend/backend/src/controllers/cloud/cloud.routes.d.ts.map +1 -0
  129. package/dist/backend/backend/src/controllers/cloud/cloud.routes.js +32 -0
  130. package/dist/backend/backend/src/controllers/cloud/cloud.routes.js.map +1 -0
  131. package/dist/backend/backend/src/controllers/cloud/files/cloud-file.controller.d.ts +42 -0
  132. package/dist/backend/backend/src/controllers/cloud/files/cloud-file.controller.d.ts.map +1 -0
  133. package/dist/backend/backend/src/controllers/cloud/files/cloud-file.controller.js +138 -0
  134. package/dist/backend/backend/src/controllers/cloud/files/cloud-file.controller.js.map +1 -0
  135. package/dist/backend/backend/src/controllers/cloud/files/cloud-file.routes.d.ts +23 -0
  136. package/dist/backend/backend/src/controllers/cloud/files/cloud-file.routes.d.ts.map +1 -0
  137. package/dist/backend/backend/src/controllers/cloud/files/cloud-file.routes.js +34 -0
  138. package/dist/backend/backend/src/controllers/cloud/files/cloud-file.routes.js.map +1 -0
  139. package/dist/backend/backend/src/controllers/cloud/files/cloud-file.types.d.ts +43 -0
  140. package/dist/backend/backend/src/controllers/cloud/files/cloud-file.types.d.ts.map +1 -0
  141. package/dist/backend/backend/src/controllers/cloud/files/cloud-file.types.js +9 -0
  142. package/dist/backend/backend/src/controllers/cloud/files/cloud-file.types.js.map +1 -0
  143. package/dist/backend/backend/src/controllers/cloud/files/index.d.ts +7 -0
  144. package/dist/backend/backend/src/controllers/cloud/files/index.d.ts.map +1 -0
  145. package/dist/backend/backend/src/controllers/cloud/files/index.js +7 -0
  146. package/dist/backend/backend/src/controllers/cloud/files/index.js.map +1 -0
  147. package/dist/backend/backend/src/controllers/cloud/h5/h5-entry.controller.d.ts +47 -0
  148. package/dist/backend/backend/src/controllers/cloud/h5/h5-entry.controller.d.ts.map +1 -0
  149. package/dist/backend/backend/src/controllers/cloud/h5/h5-entry.controller.js +131 -0
  150. package/dist/backend/backend/src/controllers/cloud/h5/h5-entry.controller.js.map +1 -0
  151. package/dist/backend/backend/src/controllers/cloud/h5/h5-entry.routes.d.ts +23 -0
  152. package/dist/backend/backend/src/controllers/cloud/h5/h5-entry.routes.d.ts.map +1 -0
  153. package/dist/backend/backend/src/controllers/cloud/h5/h5-entry.routes.js +30 -0
  154. package/dist/backend/backend/src/controllers/cloud/h5/h5-entry.routes.js.map +1 -0
  155. package/dist/backend/backend/src/controllers/cloud/h5/h5-entry.types.d.ts +81 -0
  156. package/dist/backend/backend/src/controllers/cloud/h5/h5-entry.types.d.ts.map +1 -0
  157. package/dist/backend/backend/src/controllers/cloud/h5/h5-entry.types.js +85 -0
  158. package/dist/backend/backend/src/controllers/cloud/h5/h5-entry.types.js.map +1 -0
  159. package/dist/backend/backend/src/controllers/cloud/h5/index.d.ts +7 -0
  160. package/dist/backend/backend/src/controllers/cloud/h5/index.d.ts.map +1 -0
  161. package/dist/backend/backend/src/controllers/cloud/h5/index.js +7 -0
  162. package/dist/backend/backend/src/controllers/cloud/h5/index.js.map +1 -0
  163. package/dist/backend/backend/src/controllers/cloud/index.d.ts +14 -0
  164. package/dist/backend/backend/src/controllers/cloud/index.d.ts.map +1 -0
  165. package/dist/backend/backend/src/controllers/cloud/index.js +14 -0
  166. package/dist/backend/backend/src/controllers/cloud/index.js.map +1 -0
  167. package/dist/backend/backend/src/controllers/cloud/magic-moment/index.d.ts +7 -0
  168. package/dist/backend/backend/src/controllers/cloud/magic-moment/index.d.ts.map +1 -0
  169. package/dist/backend/backend/src/controllers/cloud/magic-moment/index.js +7 -0
  170. package/dist/backend/backend/src/controllers/cloud/magic-moment/index.js.map +1 -0
  171. package/dist/backend/backend/src/controllers/cloud/magic-moment/magic-moment.controller.d.ts +45 -0
  172. package/dist/backend/backend/src/controllers/cloud/magic-moment/magic-moment.controller.d.ts.map +1 -0
  173. package/dist/backend/backend/src/controllers/cloud/magic-moment/magic-moment.controller.js +155 -0
  174. package/dist/backend/backend/src/controllers/cloud/magic-moment/magic-moment.controller.js.map +1 -0
  175. package/dist/backend/backend/src/controllers/cloud/magic-moment/magic-moment.routes.d.ts +25 -0
  176. package/dist/backend/backend/src/controllers/cloud/magic-moment/magic-moment.routes.d.ts.map +1 -0
  177. package/dist/backend/backend/src/controllers/cloud/magic-moment/magic-moment.routes.js +32 -0
  178. package/dist/backend/backend/src/controllers/cloud/magic-moment/magic-moment.routes.js.map +1 -0
  179. package/dist/backend/backend/src/controllers/cloud/relay.controller.d.ts +101 -0
  180. package/dist/backend/backend/src/controllers/cloud/relay.controller.d.ts.map +1 -0
  181. package/dist/backend/backend/src/controllers/cloud/relay.controller.js +343 -0
  182. package/dist/backend/backend/src/controllers/cloud/relay.controller.js.map +1 -0
  183. package/dist/backend/backend/src/controllers/cloud/relay.routes.d.ts +29 -0
  184. package/dist/backend/backend/src/controllers/cloud/relay.routes.d.ts.map +1 -0
  185. package/dist/backend/backend/src/controllers/cloud/relay.routes.js +44 -0
  186. package/dist/backend/backend/src/controllers/cloud/relay.routes.js.map +1 -0
  187. package/dist/backend/backend/src/controllers/cloud/tasks/cloud-task.controller.d.ts +49 -0
  188. package/dist/backend/backend/src/controllers/cloud/tasks/cloud-task.controller.d.ts.map +1 -0
  189. package/dist/backend/backend/src/controllers/cloud/tasks/cloud-task.controller.js +152 -0
  190. package/dist/backend/backend/src/controllers/cloud/tasks/cloud-task.controller.js.map +1 -0
  191. package/dist/backend/backend/src/controllers/cloud/tasks/cloud-task.routes.d.ts +24 -0
  192. package/dist/backend/backend/src/controllers/cloud/tasks/cloud-task.routes.d.ts.map +1 -0
  193. package/dist/backend/backend/src/controllers/cloud/tasks/cloud-task.routes.js +34 -0
  194. package/dist/backend/backend/src/controllers/cloud/tasks/cloud-task.routes.js.map +1 -0
  195. package/dist/backend/backend/src/controllers/cloud/tasks/cloud-task.types.d.ts +90 -0
  196. package/dist/backend/backend/src/controllers/cloud/tasks/cloud-task.types.d.ts.map +1 -0
  197. package/dist/backend/backend/src/controllers/cloud/tasks/cloud-task.types.js +48 -0
  198. package/dist/backend/backend/src/controllers/cloud/tasks/cloud-task.types.js.map +1 -0
  199. package/dist/backend/backend/src/controllers/cloud/tasks/index.d.ts +7 -0
  200. package/dist/backend/backend/src/controllers/cloud/tasks/index.d.ts.map +1 -0
  201. package/dist/backend/backend/src/controllers/cloud/tasks/index.js +7 -0
  202. package/dist/backend/backend/src/controllers/cloud/tasks/index.js.map +1 -0
  203. package/dist/backend/backend/src/controllers/marketplace/index.d.ts +2 -0
  204. package/dist/backend/backend/src/controllers/marketplace/index.d.ts.map +1 -1
  205. package/dist/backend/backend/src/controllers/marketplace/index.js +3 -0
  206. package/dist/backend/backend/src/controllers/marketplace/index.js.map +1 -1
  207. package/dist/backend/backend/src/controllers/marketplace/marketplace.controller.d.ts +12 -12
  208. package/dist/backend/backend/src/controllers/marketplace/marketplace.controller.d.ts.map +1 -1
  209. package/dist/backend/backend/src/controllers/marketplace/marketplace.controller.js +1 -18
  210. package/dist/backend/backend/src/controllers/marketplace/marketplace.controller.js.map +1 -1
  211. package/dist/backend/backend/src/controllers/marketplace/marketplace.routes.d.ts.map +1 -1
  212. package/dist/backend/backend/src/controllers/marketplace/marketplace.routes.js +3 -0
  213. package/dist/backend/backend/src/controllers/marketplace/marketplace.routes.js.map +1 -1
  214. package/dist/backend/backend/src/controllers/marketplace/template-marketplace.controller.d.ts +111 -0
  215. package/dist/backend/backend/src/controllers/marketplace/template-marketplace.controller.d.ts.map +1 -0
  216. package/dist/backend/backend/src/controllers/marketplace/template-marketplace.controller.js +220 -0
  217. package/dist/backend/backend/src/controllers/marketplace/template-marketplace.controller.js.map +1 -0
  218. package/dist/backend/backend/src/controllers/marketplace/template-marketplace.routes.d.ts +33 -0
  219. package/dist/backend/backend/src/controllers/marketplace/template-marketplace.routes.d.ts.map +1 -0
  220. package/dist/backend/backend/src/controllers/marketplace/template-marketplace.routes.js +50 -0
  221. package/dist/backend/backend/src/controllers/marketplace/template-marketplace.routes.js.map +1 -0
  222. package/dist/backend/backend/src/controllers/messaging/messenger.routes.d.ts.map +1 -1
  223. package/dist/backend/backend/src/controllers/messaging/messenger.routes.js +4 -1
  224. package/dist/backend/backend/src/controllers/messaging/messenger.routes.js.map +1 -1
  225. package/dist/backend/backend/src/controllers/monitoring/terminal.controller.d.ts.map +1 -1
  226. package/dist/backend/backend/src/controllers/monitoring/terminal.controller.js +18 -2
  227. package/dist/backend/backend/src/controllers/monitoring/terminal.controller.js.map +1 -1
  228. package/dist/backend/backend/src/controllers/payment/index.d.ts +7 -0
  229. package/dist/backend/backend/src/controllers/payment/index.d.ts.map +1 -0
  230. package/dist/backend/backend/src/controllers/payment/index.js +7 -0
  231. package/dist/backend/backend/src/controllers/payment/index.js.map +1 -0
  232. package/dist/backend/backend/src/controllers/payment/payment.controller.d.ts +57 -0
  233. package/dist/backend/backend/src/controllers/payment/payment.controller.d.ts.map +1 -0
  234. package/dist/backend/backend/src/controllers/payment/payment.controller.js +136 -0
  235. package/dist/backend/backend/src/controllers/payment/payment.controller.js.map +1 -0
  236. package/dist/backend/backend/src/controllers/payment/payment.routes.d.ts +27 -0
  237. package/dist/backend/backend/src/controllers/payment/payment.routes.d.ts.map +1 -0
  238. package/dist/backend/backend/src/controllers/payment/payment.routes.js +38 -0
  239. package/dist/backend/backend/src/controllers/payment/payment.routes.js.map +1 -0
  240. package/dist/backend/backend/src/controllers/payment/payment.types.d.ts +109 -0
  241. package/dist/backend/backend/src/controllers/payment/payment.types.d.ts.map +1 -0
  242. package/dist/backend/backend/src/controllers/payment/payment.types.js +54 -0
  243. package/dist/backend/backend/src/controllers/payment/payment.types.js.map +1 -0
  244. package/dist/backend/backend/src/controllers/request-types.d.ts +34 -5
  245. package/dist/backend/backend/src/controllers/request-types.d.ts.map +1 -1
  246. package/dist/backend/backend/src/controllers/session/session.controller.d.ts +14 -0
  247. package/dist/backend/backend/src/controllers/session/session.controller.d.ts.map +1 -1
  248. package/dist/backend/backend/src/controllers/session/session.controller.js +48 -0
  249. package/dist/backend/backend/src/controllers/session/session.controller.js.map +1 -1
  250. package/dist/backend/backend/src/controllers/session/session.routes.d.ts.map +1 -1
  251. package/dist/backend/backend/src/controllers/session/session.routes.js +3 -1
  252. package/dist/backend/backend/src/controllers/session/session.routes.js.map +1 -1
  253. package/dist/backend/backend/src/controllers/system/scheduler.controller.d.ts.map +1 -1
  254. package/dist/backend/backend/src/controllers/system/scheduler.controller.js +4 -3
  255. package/dist/backend/backend/src/controllers/system/scheduler.controller.js.map +1 -1
  256. package/dist/backend/backend/src/controllers/system/system.controller.d.ts.map +1 -1
  257. package/dist/backend/backend/src/controllers/system/system.controller.js +13 -15
  258. package/dist/backend/backend/src/controllers/system/system.controller.js.map +1 -1
  259. package/dist/backend/backend/src/controllers/task-management/assignments.controller.d.ts.map +1 -1
  260. package/dist/backend/backend/src/controllers/task-management/assignments.controller.js.map +1 -1
  261. package/dist/backend/backend/src/controllers/task-management/task-management.controller.d.ts.map +1 -1
  262. package/dist/backend/backend/src/controllers/task-management/task-management.controller.js +40 -4
  263. package/dist/backend/backend/src/controllers/task-management/task-management.controller.js.map +1 -1
  264. package/dist/backend/backend/src/controllers/task-management/tasks.controller.js.map +1 -1
  265. package/dist/backend/backend/src/controllers/team/team.controller.d.ts.map +1 -1
  266. package/dist/backend/backend/src/controllers/team/team.controller.js +259 -13
  267. package/dist/backend/backend/src/controllers/team/team.controller.js.map +1 -1
  268. package/dist/backend/backend/src/controllers/template/index.d.ts +8 -0
  269. package/dist/backend/backend/src/controllers/template/index.d.ts.map +1 -0
  270. package/dist/backend/backend/src/controllers/template/index.js +8 -0
  271. package/dist/backend/backend/src/controllers/template/index.js.map +1 -0
  272. package/dist/backend/backend/src/controllers/template/template.controller.d.ts +63 -0
  273. package/dist/backend/backend/src/controllers/template/template.controller.d.ts.map +1 -0
  274. package/dist/backend/backend/src/controllers/template/template.controller.js +112 -0
  275. package/dist/backend/backend/src/controllers/template/template.controller.js.map +1 -0
  276. package/dist/backend/backend/src/controllers/template/template.routes.d.ts +24 -0
  277. package/dist/backend/backend/src/controllers/template/template.routes.d.ts.map +1 -0
  278. package/dist/backend/backend/src/controllers/template/template.routes.js +33 -0
  279. package/dist/backend/backend/src/controllers/template/template.routes.js.map +1 -0
  280. package/dist/backend/backend/src/index.d.ts.map +1 -1
  281. package/dist/backend/backend/src/index.js +105 -13
  282. package/dist/backend/backend/src/index.js.map +1 -1
  283. package/dist/backend/backend/src/middleware/agent-heartbeat.middleware.js +3 -3
  284. package/dist/backend/backend/src/middleware/agent-heartbeat.middleware.js.map +1 -1
  285. package/dist/backend/backend/src/models/Team.d.ts +5 -0
  286. package/dist/backend/backend/src/models/Team.d.ts.map +1 -1
  287. package/dist/backend/backend/src/models/Team.js +24 -0
  288. package/dist/backend/backend/src/models/Team.js.map +1 -1
  289. package/dist/backend/backend/src/routes/api.routes.d.ts.map +1 -1
  290. package/dist/backend/backend/src/routes/api.routes.js +21 -0
  291. package/dist/backend/backend/src/routes/api.routes.js.map +1 -1
  292. package/dist/backend/backend/src/services/agent/agent-registration.service.d.ts +1 -6
  293. package/dist/backend/backend/src/services/agent/agent-registration.service.d.ts.map +1 -1
  294. package/dist/backend/backend/src/services/agent/agent-registration.service.js +211 -287
  295. package/dist/backend/backend/src/services/agent/agent-registration.service.js.map +1 -1
  296. package/dist/backend/backend/src/services/agent/claude-runtime.service.d.ts +7 -1
  297. package/dist/backend/backend/src/services/agent/claude-runtime.service.d.ts.map +1 -1
  298. package/dist/backend/backend/src/services/agent/claude-runtime.service.js +11 -2
  299. package/dist/backend/backend/src/services/agent/claude-runtime.service.js.map +1 -1
  300. package/dist/backend/backend/src/services/agent/gemini-runtime.service.d.ts +1 -0
  301. package/dist/backend/backend/src/services/agent/gemini-runtime.service.d.ts.map +1 -1
  302. package/dist/backend/backend/src/services/agent/gemini-runtime.service.js +30 -43
  303. package/dist/backend/backend/src/services/agent/gemini-runtime.service.js.map +1 -1
  304. package/dist/backend/backend/src/services/agent/oauth-relogin-monitor.service.d.ts +216 -0
  305. package/dist/backend/backend/src/services/agent/oauth-relogin-monitor.service.d.ts.map +1 -0
  306. package/dist/backend/backend/src/services/agent/oauth-relogin-monitor.service.js +496 -0
  307. package/dist/backend/backend/src/services/agent/oauth-relogin-monitor.service.js.map +1 -0
  308. package/dist/backend/backend/src/services/agent/openhands-runtime.service.d.ts +70 -0
  309. package/dist/backend/backend/src/services/agent/openhands-runtime.service.d.ts.map +1 -0
  310. package/dist/backend/backend/src/services/agent/openhands-runtime.service.js +131 -0
  311. package/dist/backend/backend/src/services/agent/openhands-runtime.service.js.map +1 -0
  312. package/dist/backend/backend/src/services/agent/pty-activity-tracker.service.d.ts +21 -1
  313. package/dist/backend/backend/src/services/agent/pty-activity-tracker.service.d.ts.map +1 -1
  314. package/dist/backend/backend/src/services/agent/pty-activity-tracker.service.js +32 -1
  315. package/dist/backend/backend/src/services/agent/pty-activity-tracker.service.js.map +1 -1
  316. package/dist/backend/backend/src/services/agent/runtime-exit-monitor.service.d.ts +77 -3
  317. package/dist/backend/backend/src/services/agent/runtime-exit-monitor.service.d.ts.map +1 -1
  318. package/dist/backend/backend/src/services/agent/runtime-exit-monitor.service.js +281 -30
  319. package/dist/backend/backend/src/services/agent/runtime-exit-monitor.service.js.map +1 -1
  320. package/dist/backend/backend/src/services/agent/runtime-service.factory.d.ts.map +1 -1
  321. package/dist/backend/backend/src/services/agent/runtime-service.factory.js +9 -0
  322. package/dist/backend/backend/src/services/agent/runtime-service.factory.js.map +1 -1
  323. package/dist/backend/backend/src/services/ai/prompt-builder.service.d.ts +49 -2
  324. package/dist/backend/backend/src/services/ai/prompt-builder.service.d.ts.map +1 -1
  325. package/dist/backend/backend/src/services/ai/prompt-builder.service.js +124 -2
  326. package/dist/backend/backend/src/services/ai/prompt-builder.service.js.map +1 -1
  327. package/dist/backend/backend/src/services/chat/chat.service.d.ts +10 -2
  328. package/dist/backend/backend/src/services/chat/chat.service.d.ts.map +1 -1
  329. package/dist/backend/backend/src/services/chat/chat.service.js +49 -8
  330. package/dist/backend/backend/src/services/chat/chat.service.js.map +1 -1
  331. package/dist/backend/backend/src/services/cloud/auth/auth.service.d.ts +174 -0
  332. package/dist/backend/backend/src/services/cloud/auth/auth.service.d.ts.map +1 -0
  333. package/dist/backend/backend/src/services/cloud/auth/auth.service.js +402 -0
  334. package/dist/backend/backend/src/services/cloud/auth/auth.service.js.map +1 -0
  335. package/dist/backend/backend/src/services/cloud/auth/auth.types.d.ts +110 -0
  336. package/dist/backend/backend/src/services/cloud/auth/auth.types.d.ts.map +1 -0
  337. package/dist/backend/backend/src/services/cloud/auth/auth.types.js +54 -0
  338. package/dist/backend/backend/src/services/cloud/auth/auth.types.js.map +1 -0
  339. package/dist/backend/backend/src/services/cloud/auth/auth.utils.d.ts +36 -0
  340. package/dist/backend/backend/src/services/cloud/auth/auth.utils.d.ts.map +1 -0
  341. package/dist/backend/backend/src/services/cloud/auth/auth.utils.js +31 -0
  342. package/dist/backend/backend/src/services/cloud/auth/auth.utils.js.map +1 -0
  343. package/dist/backend/backend/src/services/cloud/auth/jwt-auth.middleware.d.ts +47 -0
  344. package/dist/backend/backend/src/services/cloud/auth/jwt-auth.middleware.d.ts.map +1 -0
  345. package/dist/backend/backend/src/services/cloud/auth/jwt-auth.middleware.js +116 -0
  346. package/dist/backend/backend/src/services/cloud/auth/jwt-auth.middleware.js.map +1 -0
  347. package/dist/backend/backend/src/services/cloud/auth/supabase-auth.middleware.d.ts +61 -0
  348. package/dist/backend/backend/src/services/cloud/auth/supabase-auth.middleware.d.ts.map +1 -0
  349. package/dist/backend/backend/src/services/cloud/auth/supabase-auth.middleware.js +203 -0
  350. package/dist/backend/backend/src/services/cloud/auth/supabase-auth.middleware.js.map +1 -0
  351. package/dist/backend/backend/src/services/cloud/cloud-auth.middleware.d.ts +46 -0
  352. package/dist/backend/backend/src/services/cloud/cloud-auth.middleware.d.ts.map +1 -0
  353. package/dist/backend/backend/src/services/cloud/cloud-auth.middleware.js +95 -0
  354. package/dist/backend/backend/src/services/cloud/cloud-auth.middleware.js.map +1 -0
  355. package/dist/backend/backend/src/services/cloud/cloud-auth.service.d.ts +136 -0
  356. package/dist/backend/backend/src/services/cloud/cloud-auth.service.d.ts.map +1 -0
  357. package/dist/backend/backend/src/services/cloud/cloud-auth.service.js +204 -0
  358. package/dist/backend/backend/src/services/cloud/cloud-auth.service.js.map +1 -0
  359. package/dist/backend/backend/src/services/cloud/cloud-client.service.d.ts +179 -0
  360. package/dist/backend/backend/src/services/cloud/cloud-client.service.d.ts.map +1 -0
  361. package/dist/backend/backend/src/services/cloud/cloud-client.service.js +237 -0
  362. package/dist/backend/backend/src/services/cloud/cloud-client.service.js.map +1 -0
  363. package/dist/backend/backend/src/services/cloud/cloud-file.service.d.ts +97 -0
  364. package/dist/backend/backend/src/services/cloud/cloud-file.service.d.ts.map +1 -0
  365. package/dist/backend/backend/src/services/cloud/cloud-file.service.js +184 -0
  366. package/dist/backend/backend/src/services/cloud/cloud-file.service.js.map +1 -0
  367. package/dist/backend/backend/src/services/cloud/cloud-image-analysis.service.d.ts +114 -0
  368. package/dist/backend/backend/src/services/cloud/cloud-image-analysis.service.d.ts.map +1 -0
  369. package/dist/backend/backend/src/services/cloud/cloud-image-analysis.service.js +196 -0
  370. package/dist/backend/backend/src/services/cloud/cloud-image-analysis.service.js.map +1 -0
  371. package/dist/backend/backend/src/services/cloud/cloud-task-processor.service.d.ts +118 -0
  372. package/dist/backend/backend/src/services/cloud/cloud-task-processor.service.d.ts.map +1 -0
  373. package/dist/backend/backend/src/services/cloud/cloud-task-processor.service.js +322 -0
  374. package/dist/backend/backend/src/services/cloud/cloud-task-processor.service.js.map +1 -0
  375. package/dist/backend/backend/src/services/cloud/cloud-task.service.d.ts +115 -0
  376. package/dist/backend/backend/src/services/cloud/cloud-task.service.d.ts.map +1 -0
  377. package/dist/backend/backend/src/services/cloud/cloud-task.service.js +265 -0
  378. package/dist/backend/backend/src/services/cloud/cloud-task.service.js.map +1 -0
  379. package/dist/backend/backend/src/services/cloud/relay-client.service.d.ts +175 -0
  380. package/dist/backend/backend/src/services/cloud/relay-client.service.d.ts.map +1 -0
  381. package/dist/backend/backend/src/services/cloud/relay-client.service.js +392 -0
  382. package/dist/backend/backend/src/services/cloud/relay-client.service.js.map +1 -0
  383. package/dist/backend/backend/src/services/cloud/relay-crypto.service.d.ts +87 -0
  384. package/dist/backend/backend/src/services/cloud/relay-crypto.service.d.ts.map +1 -0
  385. package/dist/backend/backend/src/services/cloud/relay-crypto.service.js +140 -0
  386. package/dist/backend/backend/src/services/cloud/relay-crypto.service.js.map +1 -0
  387. package/dist/backend/backend/src/services/cloud/relay-server.service.d.ts +183 -0
  388. package/dist/backend/backend/src/services/cloud/relay-server.service.d.ts.map +1 -0
  389. package/dist/backend/backend/src/services/cloud/relay-server.service.js +523 -0
  390. package/dist/backend/backend/src/services/cloud/relay-server.service.js.map +1 -0
  391. package/dist/backend/backend/src/services/cloud/relay.types.d.ts +170 -0
  392. package/dist/backend/backend/src/services/cloud/relay.types.d.ts.map +1 -0
  393. package/dist/backend/backend/src/services/cloud/relay.types.js +69 -0
  394. package/dist/backend/backend/src/services/cloud/relay.types.js.map +1 -0
  395. package/dist/backend/backend/src/services/continuation/patterns/idle-patterns.d.ts +9 -1
  396. package/dist/backend/backend/src/services/continuation/patterns/idle-patterns.d.ts.map +1 -1
  397. package/dist/backend/backend/src/services/continuation/patterns/idle-patterns.js +18 -4
  398. package/dist/backend/backend/src/services/continuation/patterns/idle-patterns.js.map +1 -1
  399. package/dist/backend/backend/src/services/core/env.config.d.ts +147 -0
  400. package/dist/backend/backend/src/services/core/env.config.d.ts.map +1 -0
  401. package/dist/backend/backend/src/services/core/env.config.js +226 -0
  402. package/dist/backend/backend/src/services/core/env.config.js.map +1 -0
  403. package/dist/backend/backend/src/services/core/storage.service.d.ts.map +1 -1
  404. package/dist/backend/backend/src/services/core/storage.service.js +5 -0
  405. package/dist/backend/backend/src/services/core/storage.service.js.map +1 -1
  406. package/dist/backend/backend/src/services/event-bus/event-bus.service.d.ts +20 -0
  407. package/dist/backend/backend/src/services/event-bus/event-bus.service.d.ts.map +1 -1
  408. package/dist/backend/backend/src/services/event-bus/event-bus.service.js +35 -0
  409. package/dist/backend/backend/src/services/event-bus/event-bus.service.js.map +1 -1
  410. package/dist/backend/backend/src/services/hierarchy/hierarchy-escalation.service.d.ts +160 -0
  411. package/dist/backend/backend/src/services/hierarchy/hierarchy-escalation.service.d.ts.map +1 -0
  412. package/dist/backend/backend/src/services/hierarchy/hierarchy-escalation.service.js +261 -0
  413. package/dist/backend/backend/src/services/hierarchy/hierarchy-escalation.service.js.map +1 -0
  414. package/dist/backend/backend/src/services/hierarchy/hierarchy-reporting.service.d.ts +161 -0
  415. package/dist/backend/backend/src/services/hierarchy/hierarchy-reporting.service.d.ts.map +1 -0
  416. package/dist/backend/backend/src/services/hierarchy/hierarchy-reporting.service.js +276 -0
  417. package/dist/backend/backend/src/services/hierarchy/hierarchy-reporting.service.js.map +1 -0
  418. package/dist/backend/backend/src/services/marketplace/index.d.ts +1 -0
  419. package/dist/backend/backend/src/services/marketplace/index.d.ts.map +1 -1
  420. package/dist/backend/backend/src/services/marketplace/index.js +2 -0
  421. package/dist/backend/backend/src/services/marketplace/index.js.map +1 -1
  422. package/dist/backend/backend/src/services/marketplace/marketplace.service.js +2 -2
  423. package/dist/backend/backend/src/services/marketplace/template-marketplace.service.d.ts +149 -0
  424. package/dist/backend/backend/src/services/marketplace/template-marketplace.service.d.ts.map +1 -0
  425. package/dist/backend/backend/src/services/marketplace/template-marketplace.service.js +500 -0
  426. package/dist/backend/backend/src/services/marketplace/template-marketplace.service.js.map +1 -0
  427. package/dist/backend/backend/src/services/mcp-server.js +1 -1
  428. package/dist/backend/backend/src/services/mcp-server.js.map +1 -1
  429. package/dist/backend/backend/src/services/messaging/adapters/google-chat-messenger.adapter.d.ts +90 -0
  430. package/dist/backend/backend/src/services/messaging/adapters/google-chat-messenger.adapter.d.ts.map +1 -0
  431. package/dist/backend/backend/src/services/messaging/adapters/google-chat-messenger.adapter.js +233 -0
  432. package/dist/backend/backend/src/services/messaging/adapters/google-chat-messenger.adapter.js.map +1 -0
  433. package/dist/backend/backend/src/services/messaging/messenger-adapter.interface.d.ts +1 -1
  434. package/dist/backend/backend/src/services/messaging/messenger-adapter.interface.d.ts.map +1 -1
  435. package/dist/backend/backend/src/services/messaging/queue-processor.service.js +1 -1
  436. package/dist/backend/backend/src/services/messaging/queue-processor.service.js.map +1 -1
  437. package/dist/backend/backend/src/services/monitoring/activity-monitor.service.d.ts.map +1 -1
  438. package/dist/backend/backend/src/services/monitoring/activity-monitor.service.js +3 -3
  439. package/dist/backend/backend/src/services/monitoring/activity-monitor.service.js.map +1 -1
  440. package/dist/backend/backend/src/services/orchestrator/orchestrator-heartbeat-monitor.service.d.ts.map +1 -1
  441. package/dist/backend/backend/src/services/orchestrator/orchestrator-heartbeat-monitor.service.js +29 -5
  442. package/dist/backend/backend/src/services/orchestrator/orchestrator-heartbeat-monitor.service.js.map +1 -1
  443. package/dist/backend/backend/src/services/payment/magic-moment.service.d.ts +69 -0
  444. package/dist/backend/backend/src/services/payment/magic-moment.service.d.ts.map +1 -0
  445. package/dist/backend/backend/src/services/payment/magic-moment.service.js +158 -0
  446. package/dist/backend/backend/src/services/payment/magic-moment.service.js.map +1 -0
  447. package/dist/backend/backend/src/services/payment/magic-moment.types.d.ts +95 -0
  448. package/dist/backend/backend/src/services/payment/magic-moment.types.d.ts.map +1 -0
  449. package/dist/backend/backend/src/services/payment/magic-moment.types.js +91 -0
  450. package/dist/backend/backend/src/services/payment/magic-moment.types.js.map +1 -0
  451. package/dist/backend/backend/src/services/payment/stripe.service.d.ts +122 -0
  452. package/dist/backend/backend/src/services/payment/stripe.service.d.ts.map +1 -0
  453. package/dist/backend/backend/src/services/payment/stripe.service.js +403 -0
  454. package/dist/backend/backend/src/services/payment/stripe.service.js.map +1 -0
  455. package/dist/backend/backend/src/services/plugin/index.d.ts +9 -0
  456. package/dist/backend/backend/src/services/plugin/index.d.ts.map +1 -0
  457. package/dist/backend/backend/src/services/plugin/index.js +8 -0
  458. package/dist/backend/backend/src/services/plugin/index.js.map +1 -0
  459. package/dist/backend/backend/src/services/plugin/plugin.service.d.ts +102 -0
  460. package/dist/backend/backend/src/services/plugin/plugin.service.d.ts.map +1 -0
  461. package/dist/backend/backend/src/services/plugin/plugin.service.js +179 -0
  462. package/dist/backend/backend/src/services/plugin/plugin.service.js.map +1 -0
  463. package/dist/backend/backend/src/services/plugin/plugin.types.d.ts +88 -0
  464. package/dist/backend/backend/src/services/plugin/plugin.types.d.ts.map +1 -0
  465. package/dist/backend/backend/src/services/plugin/plugin.types.js +17 -0
  466. package/dist/backend/backend/src/services/plugin/plugin.types.js.map +1 -0
  467. package/dist/backend/backend/src/services/project/task-tracking.service.d.ts +17 -0
  468. package/dist/backend/backend/src/services/project/task-tracking.service.d.ts.map +1 -1
  469. package/dist/backend/backend/src/services/project/task-tracking.service.js +63 -0
  470. package/dist/backend/backend/src/services/project/task-tracking.service.js.map +1 -1
  471. package/dist/backend/backend/src/services/session/session-command-helper.d.ts +14 -0
  472. package/dist/backend/backend/src/services/session/session-command-helper.d.ts.map +1 -1
  473. package/dist/backend/backend/src/services/session/session-command-helper.js +54 -0
  474. package/dist/backend/backend/src/services/session/session-command-helper.js.map +1 -1
  475. package/dist/backend/backend/src/services/settings/settings.service.d.ts.map +1 -1
  476. package/dist/backend/backend/src/services/settings/settings.service.js +1 -0
  477. package/dist/backend/backend/src/services/settings/settings.service.js.map +1 -1
  478. package/dist/backend/backend/src/services/slack/slack-orchestrator-bridge.d.ts.map +1 -1
  479. package/dist/backend/backend/src/services/slack/slack-orchestrator-bridge.js +15 -5
  480. package/dist/backend/backend/src/services/slack/slack-orchestrator-bridge.js.map +1 -1
  481. package/dist/backend/backend/src/services/template/template.service.d.ts +153 -0
  482. package/dist/backend/backend/src/services/template/template.service.d.ts.map +1 -0
  483. package/dist/backend/backend/src/services/template/template.service.js +372 -0
  484. package/dist/backend/backend/src/services/template/template.service.js.map +1 -0
  485. package/dist/backend/backend/src/services/workflow/scheduler.service.d.ts +51 -0
  486. package/dist/backend/backend/src/services/workflow/scheduler.service.d.ts.map +1 -1
  487. package/dist/backend/backend/src/services/workflow/scheduler.service.js +118 -2
  488. package/dist/backend/backend/src/services/workflow/scheduler.service.js.map +1 -1
  489. package/dist/backend/backend/src/types/chat.types.d.ts +39 -1
  490. package/dist/backend/backend/src/types/chat.types.d.ts.map +1 -1
  491. package/dist/backend/backend/src/types/chat.types.js +45 -2
  492. package/dist/backend/backend/src/types/chat.types.js.map +1 -1
  493. package/dist/backend/backend/src/types/event-bus.types.d.ts +14 -2
  494. package/dist/backend/backend/src/types/event-bus.types.d.ts.map +1 -1
  495. package/dist/backend/backend/src/types/event-bus.types.js +15 -0
  496. package/dist/backend/backend/src/types/event-bus.types.js.map +1 -1
  497. package/dist/backend/backend/src/types/hierarchy-message.types.d.ts +101 -0
  498. package/dist/backend/backend/src/types/hierarchy-message.types.d.ts.map +1 -0
  499. package/dist/backend/backend/src/types/hierarchy-message.types.js +15 -0
  500. package/dist/backend/backend/src/types/hierarchy-message.types.js.map +1 -0
  501. package/dist/backend/backend/src/types/index.d.ts +54 -4
  502. package/dist/backend/backend/src/types/index.d.ts.map +1 -1
  503. package/dist/backend/backend/src/types/index.js.map +1 -1
  504. package/dist/backend/backend/src/types/marketplace.types.d.ts +99 -0
  505. package/dist/backend/backend/src/types/marketplace.types.d.ts.map +1 -1
  506. package/dist/backend/backend/src/types/settings.types.d.ts +1 -1
  507. package/dist/backend/backend/src/types/settings.types.d.ts.map +1 -1
  508. package/dist/backend/backend/src/types/settings.types.js +4 -0
  509. package/dist/backend/backend/src/types/settings.types.js.map +1 -1
  510. package/dist/backend/backend/src/types/task-tracking.types.d.ts +79 -1
  511. package/dist/backend/backend/src/types/task-tracking.types.d.ts.map +1 -1
  512. package/dist/backend/backend/src/types/task-tracking.types.js.map +1 -1
  513. package/dist/backend/backend/src/types/team-template.types.d.ts +166 -0
  514. package/dist/backend/backend/src/types/team-template.types.d.ts.map +1 -0
  515. package/dist/backend/backend/src/types/team-template.types.js +139 -0
  516. package/dist/backend/backend/src/types/team-template.types.js.map +1 -0
  517. package/dist/backend/backend/src/utils/async-handler.d.ts +20 -0
  518. package/dist/backend/backend/src/utils/async-handler.d.ts.map +1 -0
  519. package/dist/backend/backend/src/utils/async-handler.js +29 -0
  520. package/dist/backend/backend/src/utils/async-handler.js.map +1 -0
  521. package/dist/backend/backend/src/utils/defaultPrompts.d.ts +4 -4
  522. package/dist/backend/backend/src/utils/defaultPrompts.d.ts.map +1 -1
  523. package/dist/backend/backend/src/utils/defaultPrompts.js +16 -0
  524. package/dist/backend/backend/src/utils/defaultPrompts.js.map +1 -1
  525. package/dist/backend/backend/src/utils/gemini-trusted-folders.d.ts +43 -0
  526. package/dist/backend/backend/src/utils/gemini-trusted-folders.d.ts.map +1 -0
  527. package/dist/backend/backend/src/utils/gemini-trusted-folders.js +94 -0
  528. package/dist/backend/backend/src/utils/gemini-trusted-folders.js.map +1 -0
  529. package/dist/backend/backend/src/utils/message-serializer.d.ts +74 -0
  530. package/dist/backend/backend/src/utils/message-serializer.d.ts.map +1 -0
  531. package/dist/backend/backend/src/utils/message-serializer.js +380 -0
  532. package/dist/backend/backend/src/utils/message-serializer.js.map +1 -0
  533. package/dist/backend/backend/src/utils/terminal-string-ops.d.ts.map +1 -1
  534. package/dist/backend/backend/src/utils/terminal-string-ops.js +20 -11
  535. package/dist/backend/backend/src/utils/terminal-string-ops.js.map +1 -1
  536. package/dist/backend/config/constants.d.ts +40 -1
  537. package/dist/backend/config/constants.d.ts.map +1 -1
  538. package/dist/backend/config/constants.js +41 -1
  539. package/dist/backend/config/constants.js.map +1 -1
  540. package/dist/backend/config/index.d.ts +2 -2
  541. package/dist/backend/config/index.d.ts.map +1 -1
  542. package/dist/backend/config/index.js +2 -2
  543. package/dist/backend/config/index.js.map +1 -1
  544. package/dist/cli/backend/src/constants.d.ts +303 -15
  545. package/dist/cli/backend/src/constants.d.ts.map +1 -1
  546. package/dist/cli/backend/src/constants.js +296 -15
  547. package/dist/cli/backend/src/constants.js.map +1 -1
  548. package/dist/cli/backend/src/models/Team.d.ts +5 -0
  549. package/dist/cli/backend/src/models/Team.d.ts.map +1 -1
  550. package/dist/cli/backend/src/models/Team.js +24 -0
  551. package/dist/cli/backend/src/models/Team.js.map +1 -1
  552. package/dist/cli/backend/src/services/core/storage.service.d.ts.map +1 -1
  553. package/dist/cli/backend/src/services/core/storage.service.js +5 -0
  554. package/dist/cli/backend/src/services/core/storage.service.js.map +1 -1
  555. package/dist/cli/backend/src/services/mcp-server.js +1 -1
  556. package/dist/cli/backend/src/services/mcp-server.js.map +1 -1
  557. package/dist/cli/backend/src/types/chat.types.d.ts +39 -1
  558. package/dist/cli/backend/src/types/chat.types.d.ts.map +1 -1
  559. package/dist/cli/backend/src/types/chat.types.js +45 -2
  560. package/dist/cli/backend/src/types/chat.types.js.map +1 -1
  561. package/dist/cli/backend/src/types/index.d.ts +54 -4
  562. package/dist/cli/backend/src/types/index.d.ts.map +1 -1
  563. package/dist/cli/backend/src/types/index.js.map +1 -1
  564. package/dist/cli/backend/src/types/settings.types.d.ts +1 -1
  565. package/dist/cli/backend/src/types/settings.types.d.ts.map +1 -1
  566. package/dist/cli/backend/src/types/settings.types.js +4 -0
  567. package/dist/cli/backend/src/types/settings.types.js.map +1 -1
  568. package/dist/cli/backend/src/utils/gemini-trusted-folders.d.ts +43 -0
  569. package/dist/cli/backend/src/utils/gemini-trusted-folders.d.ts.map +1 -0
  570. package/dist/cli/backend/src/utils/gemini-trusted-folders.js +94 -0
  571. package/dist/cli/backend/src/utils/gemini-trusted-folders.js.map +1 -0
  572. package/dist/cli/backend/src/utils/terminal-string-ops.d.ts.map +1 -1
  573. package/dist/cli/backend/src/utils/terminal-string-ops.js +20 -11
  574. package/dist/cli/backend/src/utils/terminal-string-ops.js.map +1 -1
  575. package/dist/cli/cli/src/commands/onboard.d.ts +2 -1
  576. package/dist/cli/cli/src/commands/onboard.d.ts.map +1 -1
  577. package/dist/cli/cli/src/commands/onboard.js +21 -8
  578. package/dist/cli/cli/src/commands/onboard.js.map +1 -1
  579. package/dist/cli/cli/src/commands/start.d.ts +1 -0
  580. package/dist/cli/cli/src/commands/start.d.ts.map +1 -1
  581. package/dist/cli/cli/src/commands/start.js +71 -23
  582. package/dist/cli/cli/src/commands/start.js.map +1 -1
  583. package/dist/cli/cli/src/constants.d.ts +1 -1
  584. package/dist/cli/cli/src/constants.d.ts.map +1 -1
  585. package/dist/cli/cli/src/constants.js +1 -1
  586. package/dist/cli/cli/src/constants.js.map +1 -1
  587. package/dist/cli/cli/src/index.js +1 -0
  588. package/dist/cli/cli/src/index.js.map +1 -1
  589. package/dist/cli/cli/src/utils/project-scaffold.d.ts +109 -0
  590. package/dist/cli/cli/src/utils/project-scaffold.d.ts.map +1 -0
  591. package/dist/cli/cli/src/utils/project-scaffold.js +346 -0
  592. package/dist/cli/cli/src/utils/project-scaffold.js.map +1 -0
  593. package/dist/cli/cli/src/utils/templates.d.ts +7 -2
  594. package/dist/cli/cli/src/utils/templates.d.ts.map +1 -1
  595. package/dist/cli/cli/src/utils/templates.js +76 -7
  596. package/dist/cli/cli/src/utils/templates.js.map +1 -1
  597. package/dist/cli/config/constants.d.ts +40 -1
  598. package/dist/cli/config/constants.d.ts.map +1 -1
  599. package/dist/cli/config/constants.js +41 -1
  600. package/dist/cli/config/constants.js.map +1 -1
  601. package/dist/cli/config/index.d.ts +2 -2
  602. package/dist/cli/config/index.d.ts.map +1 -1
  603. package/dist/cli/config/index.js +2 -2
  604. package/dist/cli/config/index.js.map +1 -1
  605. package/frontend/dist/assets/index-510ab719.css +33 -0
  606. package/frontend/dist/assets/index-935cd846.js +4961 -0
  607. package/frontend/dist/index.html +2 -2
  608. package/package.json +9 -4
  609. package/frontend/dist/assets/index-a23214ae.js +0 -4919
  610. 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,9 @@ 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();
51
56
  // Terminal patterns are now centralized in TERMINAL_PATTERNS constant
52
57
  // Keeping prompt chars as static getter for backwards compatibility within the class
53
58
  static get CLAUDE_PROMPT_INDICATORS() {
@@ -451,6 +456,8 @@ export class AgentRegistrationService {
451
456
  // Must be before postInitialize and sendRegistrationPromptAsync so exits
452
457
  // during those phases are detected and the abort signal fires in time.
453
458
  RuntimeExitMonitorService.getInstance().startMonitoring(sessionName, runtimeType, role);
459
+ // Start OAuth relogin monitoring for automatic re-authentication
460
+ OAuthReloginMonitorService.getInstance().startMonitoring(sessionName, runtimeType);
454
461
  // Look up per-agent browser automation override from member config
455
462
  let browserAutomationOverride;
456
463
  if (memberId) {
@@ -687,6 +694,8 @@ export class AgentRegistrationService {
687
694
  }
688
695
  // Start runtime exit monitoring immediately after runtime is ready
689
696
  RuntimeExitMonitorService.getInstance().startMonitoring(sessionName, runtimeType, role);
697
+ // Start OAuth relogin monitoring for automatic re-authentication
698
+ OAuthReloginMonitorService.getInstance().startMonitoring(sessionName, runtimeType);
690
699
  // Additional verification: Use runtime detection to confirm runtime is responding
691
700
  // Wait a bit longer for runtime to fully load after showing welcome message
692
701
  this.logger.debug('Runtime ready detected for orchestrator, waiting for full startup before verification', { sessionName, runtimeType });
@@ -729,6 +738,8 @@ export class AgentRegistrationService {
729
738
  }
730
739
  // Start runtime exit monitoring immediately after runtime is ready
731
740
  RuntimeExitMonitorService.getInstance().startMonitoring(sessionName, runtimeType, role);
741
+ // Start OAuth relogin monitoring for automatic re-authentication
742
+ OAuthReloginMonitorService.getInstance().startMonitoring(sessionName, runtimeType);
732
743
  }
733
744
  // Look up per-agent browser automation override from member config
734
745
  let browserOverrideForRecreation;
@@ -836,17 +847,23 @@ export class AgentRegistrationService {
836
847
  // For orchestrator or cases without member ID, remove the memberId parameter
837
848
  prompt = prompt.replace(/,\s*"memberId":\s*"\{\{MEMBER_ID\}\}"/g, '');
838
849
  }
839
- // Look up project path for team members
850
+ // Look up project path and TL hierarchy for team members
840
851
  let projectPath = process.cwd();
852
+ let foundTeam = null;
853
+ let foundMember = null;
841
854
  try {
842
855
  const teams = await this.storageService.getTeams();
843
856
  for (const team of teams) {
844
857
  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;
858
+ if (member) {
859
+ foundTeam = team;
860
+ foundMember = member;
861
+ if (team.projectIds[0]) {
862
+ const projects = await this.storageService.getProjects();
863
+ const project = projects.find((p) => p.id === team.projectIds[0]);
864
+ if (project?.path) {
865
+ projectPath = project.path;
866
+ }
850
867
  }
851
868
  break;
852
869
  }
@@ -888,6 +905,53 @@ export class AgentRegistrationService {
888
905
  // Replace marketplace skills path placeholder
889
906
  const marketplaceSkillsPath = path.join(os.homedir(), '.crewly', 'marketplace', 'skills');
890
907
  prompt = prompt.replace(/\{\{MARKETPLACE_SKILLS_PATH\}\}/g, marketplaceSkillsPath);
908
+ // Inject Team Lead addon for members with canDelegate=true and subordinates
909
+ if (foundMember?.canDelegate && foundMember.subordinateIds && foundMember.subordinateIds.length > 0 && foundTeam) {
910
+ try {
911
+ // Resolve subordinateIds to SubordinateInfo[]
912
+ const subordinates = foundMember.subordinateIds
913
+ .map((subId) => {
914
+ const subMember = foundTeam.members?.find((m) => m.id === subId);
915
+ if (!subMember)
916
+ return null;
917
+ return {
918
+ name: subMember.name,
919
+ sessionName: subMember.sessionName || '',
920
+ role: subMember.role || 'developer',
921
+ };
922
+ })
923
+ .filter((s) => s !== null);
924
+ if (subordinates.length > 0) {
925
+ const tlConfig = {
926
+ name: sessionName,
927
+ role: role,
928
+ systemPrompt: '',
929
+ projectPath,
930
+ memberId,
931
+ teamId: foundTeam.id,
932
+ canDelegate: true,
933
+ subordinates,
934
+ };
935
+ const promptBuilder = new PromptBuilderService(this.projectRoot);
936
+ const tlSection = await promptBuilder.buildTeamLeadSection(tlConfig);
937
+ if (tlSection) {
938
+ prompt += `\n\n---\n\n${tlSection}`;
939
+ this.logger.info('TL addon injected into init prompt', {
940
+ sessionName,
941
+ subordinateCount: subordinates.length,
942
+ subordinateNames: subordinates.map((s) => s.name),
943
+ tlSectionLength: tlSection.length,
944
+ });
945
+ }
946
+ }
947
+ }
948
+ catch (tlError) {
949
+ this.logger.warn('Failed to inject TL addon (non-critical)', {
950
+ sessionName,
951
+ error: tlError instanceof Error ? tlError.message : String(tlError),
952
+ });
953
+ }
954
+ }
891
955
  // Generate and inject startup briefing from session memory
892
956
  try {
893
957
  const sessionMemoryService = SessionMemoryService.getInstance();
@@ -1440,6 +1504,8 @@ After checking in, just say "Ready for tasks" and wait for me to send you work.`
1440
1504
  if (role !== ORCHESTRATOR_ROLE && config.teamId && config.memberId) {
1441
1505
  ContextWindowMonitorService.getInstance().startSessionMonitoring(sessionName, config.memberId, config.teamId, role, runtimeType);
1442
1506
  }
1507
+ // Start OAuth relogin monitoring for recovered session
1508
+ OAuthReloginMonitorService.getInstance().startMonitoring(sessionName, runtimeType);
1443
1509
  return {
1444
1510
  success: true,
1445
1511
  sessionName,
@@ -1533,6 +1599,8 @@ After checking in, just say "Ready for tasks" and wait for me to send you work.`
1533
1599
  if (role !== ORCHESTRATOR_ROLE && config.teamId && config.memberId) {
1534
1600
  ContextWindowMonitorService.getInstance().startSessionMonitoring(sessionName, config.memberId, config.teamId, role, runtimeType);
1535
1601
  }
1602
+ // Start OAuth relogin monitoring for newly created session
1603
+ OAuthReloginMonitorService.getInstance().startMonitoring(sessionName, runtimeType);
1536
1604
  return {
1537
1605
  success: true,
1538
1606
  sessionName,
@@ -1564,6 +1632,8 @@ After checking in, just say "Ready for tasks" and wait for me to send you work.`
1564
1632
  this.logger.info('Terminating agent session (unified approach)', { sessionName, role });
1565
1633
  // Stop runtime exit monitoring before killing the session
1566
1634
  RuntimeExitMonitorService.getInstance().stopMonitoring(sessionName);
1635
+ // Stop OAuth relogin monitoring before killing the session
1636
+ OAuthReloginMonitorService.getInstance().stopMonitoring(sessionName);
1567
1637
  // Stop context window monitoring before killing the session
1568
1638
  ContextWindowMonitorService.getInstance().stopSessionMonitoring(sessionName);
1569
1639
  // Get session helper once to avoid repeated async calls
@@ -1834,256 +1904,6 @@ After checking in, just say "Ready for tasks" and wait for me to send you work.`
1834
1904
  });
1835
1905
  });
1836
1906
  }
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
1907
  /**
2088
1908
  * Send message with retry logic for reliable delivery to Claude Code.
2089
1909
  * Uses SessionCommandHelper.sendMessage() (proven two-step write pattern)
@@ -2114,6 +1934,17 @@ After checking in, just say "Ready for tasks" and wait for me to send you work.`
2114
1934
  });
2115
1935
  // Verify agent is at prompt before sending
2116
1936
  const output = sessionHelper.capturePane(sessionName);
1937
+ // Gemini CLI stuck-connectivity guard (#128): If the CLI is in a
1938
+ // "Trying to reach <model>" retry loop, it will never process
1939
+ // new messages. Bail out immediately so the caller gets a clear
1940
+ // failure signal and the runtime-exit-monitor can trigger recovery.
1941
+ if (runtimeType === RUNTIME_TYPES.GEMINI_CLI && GEMINI_STUCK_CONNECTIVITY_PATTERN.test(output)) {
1942
+ this.logger.warn('Gemini CLI stuck in connectivity retry loop, aborting message delivery (#128)', {
1943
+ sessionName,
1944
+ attempt,
1945
+ });
1946
+ return false;
1947
+ }
2117
1948
  if (!this.isClaudeAtPrompt(output, runtimeType)) {
2118
1949
  if (attempt === maxAttempts) {
2119
1950
  // On the final attempt, check if the agent is DEFINITELY busy
@@ -2187,38 +2018,45 @@ After checking in, just say "Ready for tasks" and wait for me to send you work.`
2187
2018
  // TUI re-render (SIGWINCH), then Tab to cycle Ink focus.
2188
2019
  await sessionHelper.sendCtrlC(sessionName);
2189
2020
  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
2021
  }
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);
2022
+ // PTY resize on ALL attempts to force SIGWINCH → Ink TUI re-render.
2023
+ // Claude Code's Ink TUI can lose internal input focus after stop hooks
2024
+ // (especially ones that error), state transitions, or idle periods.
2025
+ // When defocused, the `❯` prompt is visible in the terminal buffer
2026
+ // but writes are silently consumed by the framework NOT routed to
2027
+ // the InputPrompt. Tab alone was insufficient; PTY resize forces a
2028
+ // full TUI re-render that reliably restores focus state.
2029
+ // This matches the manual workaround where pressing a key in the
2030
+ // frontend terminal "wakes up" the input handler.
2031
+ try {
2032
+ const session = sessionHelper.getSession(sessionName);
2033
+ if (session) {
2034
+ session.resize(81, 25);
2035
+ await delay(200);
2036
+ session.resize(80, 24);
2037
+ await delay(300);
2038
+ }
2210
2039
  }
2040
+ catch { /* non-fatal */ }
2041
+ await sessionHelper.sendKey(sessionName, 'Tab');
2042
+ await delay(300);
2211
2043
  }
2212
2044
  else {
2213
2045
  // Detect recent /compress — Ink TUI loses internal focus after
2214
2046
  // /compress re-renders, causing subsequent messages to be silently
2215
2047
  // dropped even though the prompt `>` is visible (#114).
2216
2048
  // Always force PTY resize on attempt 1 if /compress detected.
2049
+ // Also detect ✖ error state (#130) — MCP connection errors
2050
+ // cause a persistent error indicator that steals TUI focus.
2217
2051
  const recentOutput = sessionHelper.capturePane(sessionName, 40);
2218
2052
  const compressDetected = recentOutput.includes('/compress') ||
2219
2053
  recentOutput.includes('Context compressed') ||
2220
2054
  recentOutput.includes('Compressing context');
2221
- const needsResize = attempt > 1 || compressDetected;
2055
+ // Check for Gemini CLI error indicators in the status bar area (#130).
2056
+ const statusArea = recentOutput.split('\n').slice(-GEMINI_ERROR_STATE_CONSTANTS.STATUS_AREA_LINES).join('\n');
2057
+ const errorStateDetected = recentOutput.includes(GEMINI_ERROR_STATE_CONSTANTS.ERROR_MARKER) ||
2058
+ GEMINI_ERROR_STATE_CONSTANTS.ERROR_COUNT_PATTERN.test(statusArea);
2059
+ const needsResize = attempt > 1 || compressDetected || errorStateDetected;
2222
2060
  // Force a PTY resize to trigger SIGWINCH, making Ink
2223
2061
  // re-render the TUI and potentially restore focus state.
2224
2062
  if (needsResize) {
@@ -2244,19 +2082,39 @@ After checking in, just say "Ready for tasks" and wait for me to send you work.`
2244
2082
  });
2245
2083
  }
2246
2084
  }
2085
+ // If error state detected (✖), dismiss the error overlay first (#130).
2086
+ // F12 toggles the error details panel in Gemini CLI, Enter dismisses
2087
+ // any overlay/notification, and the combination restores the TUI to a
2088
+ // state where the InputPrompt can accept input.
2089
+ if (errorStateDetected) {
2090
+ this.logger.info('Gemini CLI error state detected (✖), dismissing before delivery (#130)', {
2091
+ sessionName,
2092
+ attempt,
2093
+ });
2094
+ // F12 to close error details panel if open
2095
+ await sessionHelper.sendKey(sessionName, 'F12');
2096
+ await delay(300);
2097
+ // Enter to dismiss any remaining overlay/notification
2098
+ await sessionHelper.sendEnter(sessionName);
2099
+ await delay(500);
2100
+ }
2247
2101
  // Send Tab to cycle Ink focus. In Ink v6, Tab triggers
2248
2102
  // focusNext() in FocusContext, which moves focus to the next
2249
2103
  // focusable component (InputPrompt). This works even when the
2250
2104
  // input is defocused because the Tab handler runs at the Ink
2251
2105
  // framework level, not the component level.
2106
+ // Send two Tabs to cycle through error/notification components
2107
+ // that may be in the focus chain (#130).
2108
+ await sessionHelper.sendKey(sessionName, 'Tab');
2109
+ await delay(200);
2252
2110
  await sessionHelper.sendKey(sessionName, 'Tab');
2253
2111
  await delay(300);
2254
2112
  // Then Enter to dismiss any notification overlay and ensure
2255
2113
  // the input is engaged. Enter on an empty `> ` prompt is a
2256
2114
  // safe no-op (just shows a new blank prompt line).
2257
2115
  await sessionHelper.sendEnter(sessionName);
2258
- // Extra settling time after /compress to let Ink TUI stabilize
2259
- await delay(compressDetected ? 1000 : 500);
2116
+ // Extra settling time after /compress or error state to let Ink TUI stabilize
2117
+ await delay((compressDetected || errorStateDetected) ? 1000 : 500);
2260
2118
  }
2261
2119
  // For Gemini CLI: detect and gently escape interactive modes before
2262
2120
  // sending the message. Avoid Ctrl-C here — Gemini interprets it as
@@ -2289,6 +2147,50 @@ After checking in, just say "Ready for tasks" and wait for me to send you work.`
2289
2147
  // border redraws that can cause length changes unrelated to delivery.
2290
2148
  const beforeOutput = sessionHelper.capturePane(sessionName, 20);
2291
2149
  const beforeLength = beforeOutput.length;
2150
+ // Deduplication guard (#128): Check if the agent is already
2151
+ // processing on ALL attempts (not just retries). A previous
2152
+ // write may have succeeded but verification failed. Re-writing
2153
+ // the same message creates a duplicate in the input buffer.
2154
+ {
2155
+ const preWriteCheck = sessionHelper.capturePane(sessionName);
2156
+ const hasSpinner = containsSpinnerOrWorkingIndicator(preWriteCheck);
2157
+ if (hasSpinner) {
2158
+ // Hash-based dedup: if the same message was recently sent
2159
+ // and the agent is processing, it's very likely our message.
2160
+ const msgHash = message.substring(0, 200);
2161
+ const lastSent = this.lastSentMessageHash.get(sessionName);
2162
+ const isRecentDuplicate = lastSent
2163
+ && lastSent.hash === msgHash
2164
+ && (Date.now() - lastSent.sentAt) < 60000;
2165
+ if (isRecentDuplicate || attempt > 1) {
2166
+ this.logger.info('Agent already processing — skipping write to prevent duplicate (#128)', {
2167
+ sessionName,
2168
+ attempt,
2169
+ isRecentDuplicate: !!isRecentDuplicate,
2170
+ });
2171
+ return true;
2172
+ }
2173
+ }
2174
+ // On retries: also check if agent is not at prompt AND our
2175
+ // message text is NOT stuck at the bottom.
2176
+ if (attempt > 1) {
2177
+ const notAtPrompt = !this.isClaudeAtPrompt(preWriteCheck, runtimeType);
2178
+ if (notAtPrompt) {
2179
+ const msgSnippet = (message.length > 20
2180
+ ? message.substring(0, 80)
2181
+ : message).replace(/\s+/g, ' ').trim();
2182
+ const bottomLines = preWriteCheck.split('\n').slice(-10).join(' ').replace(/\s+/g, ' ');
2183
+ const textStuck = bottomLines.includes(msgSnippet);
2184
+ if (!textStuck) {
2185
+ this.logger.info('Agent not at prompt and message not stuck — skipping re-write (#128)', {
2186
+ sessionName,
2187
+ attempt,
2188
+ });
2189
+ return true;
2190
+ }
2191
+ }
2192
+ }
2193
+ }
2292
2194
  // Use SessionCommandHelper.sendMessage() — proven two-step write:
2293
2195
  // 1. session.write(message) — triggers bracketed paste
2294
2196
  // 2. await delay(scaled) — waits for paste processing
@@ -2299,6 +2201,11 @@ After checking in, just say "Ready for tasks" and wait for me to send you work.`
2299
2201
  // If progressive verification below misses an Enter drop, the
2300
2202
  // background scanner will catch it within 30s.
2301
2203
  this.trackSentMessage(sessionName, message);
2204
+ // Track message hash for deduplication on retry (#128)
2205
+ this.lastSentMessageHash.set(sessionName, {
2206
+ hash: message.substring(0, 200),
2207
+ sentAt: Date.now(),
2208
+ });
2302
2209
  // Wait for agent to start processing, then verify delivery.
2303
2210
  // TUI runtimes need a longer delay (3s) for the TUI to redraw
2304
2211
  // and show processing indicators after accepting input.
@@ -2365,11 +2272,17 @@ After checking in, just say "Ready for tasks" and wait for me to send you work.`
2365
2272
  : message).replace(/\s+/g, ' ').trim();
2366
2273
  const promptBottomLines = currentOutput.split('\n').slice(-10).join(' ').replace(/\s+/g, ' ');
2367
2274
  if (promptBottomLines.includes(promptMsgSnippet)) {
2368
- this.logger.warn('At prompt with message text at bottom — pressing Enter', {
2275
+ this.logger.warn('At prompt with message text at bottom — pressing Tab+Enter', {
2369
2276
  sessionName,
2370
2277
  attempt,
2371
2278
  intervalMs,
2372
2279
  });
2280
+ // Tab restores Ink TUI focus before Enter — without this,
2281
+ // Enter may be consumed by the framework but not routed to
2282
+ // the input component if focus was lost during a re-render
2283
+ // (e.g., after stop hooks, state transitions).
2284
+ await sessionHelper.sendKey(sessionName, 'Tab');
2285
+ await delay(200);
2373
2286
  await sessionHelper.sendEnter(sessionName);
2374
2287
  await delay(500);
2375
2288
  await sessionHelper.sendEnter(sessionName); // backup
@@ -2410,12 +2323,14 @@ After checking in, just say "Ready for tasks" and wait for me to send you work.`
2410
2323
  // Message text is at the bottom of the terminal but the
2411
2324
  // prompt is no longer in its idle form — Enter was dropped.
2412
2325
  // 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', {
2326
+ // use Tab to restore TUI focus, then Enter to submit.
2327
+ this.logger.warn('Message text stuck at bottom — pressing Tab+Enter to recover', {
2415
2328
  sessionName,
2416
2329
  attempt,
2417
2330
  intervalMs,
2418
2331
  });
2332
+ await sessionHelper.sendKey(sessionName, 'Tab');
2333
+ await delay(200);
2419
2334
  await sessionHelper.sendEnter(sessionName);
2420
2335
  await delay(500);
2421
2336
  await sessionHelper.sendEnter(sessionName); // backup Enter
@@ -2735,8 +2650,12 @@ After checking in, just say "Ready for tasks" and wait for me to send you work.`
2735
2650
  */
2736
2651
  async recoverStuckTuiMessage(sessionName, message) {
2737
2652
  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 });
2653
+ // Tab restores Ink TUI focus, then Enter to submit the stuck text.
2654
+ // Without Tab, Enter may be consumed by the framework but not routed
2655
+ // to the input component if focus was lost during a re-render.
2656
+ this.logger.info('Pressing Tab+Enter to recover stuck TUI message', { sessionName });
2657
+ await sessionHelper.sendKey(sessionName, 'Tab');
2658
+ await delay(200);
2740
2659
  await sessionHelper.sendEnter(sessionName);
2741
2660
  await delay(500);
2742
2661
  // Double-tap: send a backup Enter in case the first was consumed
@@ -2850,11 +2769,13 @@ After checking in, just say "Ready for tasks" and wait for me to send you work.`
2850
2769
  if (isPlaceholder) {
2851
2770
  break;
2852
2771
  }
2853
- this.logger.warn('Background scan: text stuck at TUI prompt, pressing Enter', {
2772
+ this.logger.warn('Background scan: text stuck at TUI prompt, pressing Tab+Enter', {
2854
2773
  sessionName,
2855
2774
  promptContent: promptContent.slice(0, 80),
2856
2775
  });
2857
- // Press Enter to submit the stuck text
2776
+ // Tab restores Ink TUI focus before Enter
2777
+ await sessionHelper.sendKey(sessionName, 'Tab');
2778
+ await delay(200);
2858
2779
  await sessionHelper.sendEnter(sessionName);
2859
2780
  await delay(500);
2860
2781
  // Backup Enter
@@ -2890,11 +2811,14 @@ After checking in, just say "Ready for tasks" and wait for me to send you work.`
2890
2811
  if (now - entry.sentAt < MIN_AGE_MS)
2891
2812
  continue;
2892
2813
  if (bottomText.includes(entry.snippet)) {
2893
- this.logger.warn('Background scan: tracked message stuck, pressing Enter', {
2814
+ this.logger.warn('Background scan: tracked message stuck, pressing Tab+Enter', {
2894
2815
  sessionName,
2895
2816
  snippet: entry.snippet.slice(0, 50),
2896
2817
  ageMs: now - entry.sentAt,
2897
2818
  });
2819
+ // Tab restores Ink TUI focus before Enter
2820
+ await sessionHelper.sendKey(sessionName, 'Tab');
2821
+ await delay(200);
2898
2822
  await sessionHelper.sendEnter(sessionName);
2899
2823
  await delay(500);
2900
2824
  await sessionHelper.sendEnter(sessionName); // backup