crewly 1.3.31 → 1.4.1

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 (673) hide show
  1. package/config/constants.ts +18 -3
  2. package/config/hooks/install-hooks.sh +88 -0
  3. package/config/hooks/pre-commit +104 -0
  4. package/config/orchestrator_tasks/prompts/orchestrator-prompt.md +17 -24
  5. package/config/roles/auditor/role.json +13 -0
  6. package/config/roles/orchestrator/prompt.md +25 -0
  7. package/config/roles/product-manager/prompt.md +18 -1
  8. package/config/roles/researcher/prompt.md +110 -0
  9. package/config/roles/team-leader/prompt.md +31 -8
  10. package/config/roles/team-leader/tl-addon.md +40 -9
  11. package/config/roles/ux-designer/prompt.md +111 -0
  12. package/config/skills/_common/lib.sh +33 -0
  13. package/config/skills/agent/browse-stealth/{instructions.md → SKILL.md} +40 -0
  14. package/config/skills/agent/chrome-attach/SKILL.md +84 -0
  15. package/config/skills/agent/chrome-attach/execute.sh +279 -0
  16. package/config/skills/agent/competitor-content-tracker/{instructions.md → SKILL.md} +34 -0
  17. package/config/skills/agent/computer-use/{instructions.md → SKILL.md} +43 -0
  18. package/config/skills/agent/content-calendar/{instructions.md → SKILL.md} +32 -0
  19. package/config/skills/agent/content-repurposer/{instructions.md → SKILL.md} +38 -0
  20. package/config/skills/agent/content-writer/{instructions.md → SKILL.md} +38 -0
  21. package/config/skills/agent/core/accept-task/{instructions.md → SKILL.md} +37 -0
  22. package/config/skills/agent/core/block-task/{instructions.md → SKILL.md} +37 -0
  23. package/config/skills/agent/core/check-quality-gates/{instructions.md → SKILL.md} +40 -0
  24. package/config/skills/agent/core/complete-task/{instructions.md → SKILL.md} +37 -0
  25. package/config/skills/agent/core/complete-task/execute.sh +15 -0
  26. package/config/skills/agent/core/generate-pdf/{instructions.md → SKILL.md} +42 -0
  27. package/config/skills/agent/core/get-my-context/{instructions.md → SKILL.md} +38 -0
  28. package/config/skills/agent/core/get-sops/{instructions.md → SKILL.md} +38 -0
  29. package/config/skills/agent/core/get-team-norms/execute.sh +106 -0
  30. package/config/skills/agent/core/get-team-status/SKILL.md +55 -0
  31. package/config/skills/agent/core/handoff-task/execute.sh +150 -0
  32. package/config/skills/agent/core/heartbeat/{instructions.md → SKILL.md} +27 -0
  33. package/config/skills/agent/core/marketplace-search/{instructions.md → SKILL.md} +41 -0
  34. package/config/skills/agent/core/query-knowledge/{instructions.md → SKILL.md} +40 -0
  35. package/config/skills/agent/core/read-task/SKILL.md +56 -0
  36. package/config/skills/agent/core/recall/{instructions.md → SKILL.md} +38 -0
  37. package/config/skills/agent/core/record-learning/{instructions.md → SKILL.md} +38 -0
  38. package/config/skills/agent/core/register-self/SKILL.md +54 -0
  39. package/config/skills/agent/core/remember/{instructions.md → SKILL.md} +37 -0
  40. package/config/skills/agent/core/remember/execute.sh +6 -0
  41. package/config/skills/agent/core/reply-chat/{instructions.md → SKILL.md} +37 -0
  42. package/config/skills/agent/core/report-progress/{instructions.md → SKILL.md} +38 -0
  43. package/config/skills/agent/core/report-status/{instructions.md → SKILL.md} +39 -0
  44. package/config/skills/agent/core/send-chat-response/{instructions.md → SKILL.md} +37 -0
  45. package/config/skills/agent/core/send-message/SKILL.md +58 -0
  46. package/config/skills/agent/core/update-team-norm/execute.sh +115 -0
  47. package/config/skills/agent/desktop-app-control/{instructions.md → SKILL.md} +42 -0
  48. package/config/skills/agent/trend-monitor/{instructions.md → SKILL.md} +34 -0
  49. package/config/skills/agent/vnc-browser/{instructions.md → SKILL.md} +38 -0
  50. package/config/skills/auditor/score-task/SKILL.md +28 -0
  51. package/config/skills/auditor/score-task/execute.sh +21 -0
  52. package/config/skills/examples/enterprise-skill-example.json +22 -0
  53. package/config/skills/examples/premium-skill-example.json +22 -0
  54. package/config/skills/orchestrator/assign-task/SKILL.md +41 -0
  55. package/config/skills/orchestrator/assign-team-to-project/{instructions.md → SKILL.md} +25 -0
  56. package/config/skills/orchestrator/broadcast/{instructions.md → SKILL.md} +24 -0
  57. package/config/skills/orchestrator/broadcast-to-org/{instructions.md → SKILL.md} +25 -0
  58. package/config/skills/orchestrator/cancel-all-schedules/{instructions.md → SKILL.md} +5 -0
  59. package/config/skills/orchestrator/cancel-schedule/SKILL.md +43 -0
  60. package/config/skills/orchestrator/complete-task/SKILL.md +41 -0
  61. package/config/skills/orchestrator/create-project/{instructions.md → SKILL.md} +24 -0
  62. package/config/skills/orchestrator/create-team/{instructions.md → SKILL.md} +24 -0
  63. package/config/skills/orchestrator/delegate-task/{instructions.md → SKILL.md} +27 -0
  64. package/config/skills/orchestrator/delegate-task/execute.sh +31 -2
  65. package/config/skills/orchestrator/get-agent-logs/{instructions.md → SKILL.md} +25 -0
  66. package/config/skills/orchestrator/get-agent-status/{instructions.md → SKILL.md} +24 -0
  67. package/config/skills/orchestrator/get-project-overview/SKILL.md +41 -0
  68. package/config/skills/orchestrator/get-tasks/SKILL.md +41 -0
  69. package/config/skills/orchestrator/get-team-status/SKILL.md +43 -0
  70. package/config/skills/orchestrator/handle-agent-failure/{instructions.md → SKILL.md} +27 -0
  71. package/config/skills/orchestrator/heartbeat/{instructions.md → SKILL.md} +24 -0
  72. package/config/skills/orchestrator/list-schedules/{instructions.md → SKILL.md} +5 -0
  73. package/config/skills/orchestrator/list-subscriptions/SKILL.md +41 -0
  74. package/config/skills/orchestrator/query-knowledge/{instructions.md → SKILL.md} +28 -0
  75. package/config/skills/orchestrator/read-session-logs/{instructions.md → SKILL.md} +26 -0
  76. package/config/skills/orchestrator/read-system-logs/{instructions.md → SKILL.md} +25 -0
  77. package/config/skills/orchestrator/recall/{instructions.md → SKILL.md} +24 -0
  78. package/config/skills/orchestrator/record-failure/{instructions.md → SKILL.md} +27 -0
  79. package/config/skills/orchestrator/record-learning/{instructions.md → SKILL.md} +24 -0
  80. package/config/skills/orchestrator/record-success/{instructions.md → SKILL.md} +26 -0
  81. package/config/skills/orchestrator/register-self/{instructions.md → SKILL.md} +24 -0
  82. package/config/skills/orchestrator/remember/{instructions.md → SKILL.md} +24 -0
  83. package/config/skills/orchestrator/reply-chat/{instructions.md → SKILL.md} +25 -0
  84. package/config/skills/orchestrator/reply-chat/execute.sh +0 -13
  85. package/config/skills/orchestrator/reply-gchat/{instructions.md → SKILL.md} +25 -0
  86. package/config/skills/orchestrator/reply-gchat/execute.sh +0 -18
  87. package/config/skills/orchestrator/reply-slack/{instructions.md → SKILL.md} +24 -0
  88. package/config/skills/orchestrator/reply-slack/execute.sh +18 -31
  89. package/config/skills/orchestrator/report-bug/{instructions.md → SKILL.md} +26 -0
  90. package/config/skills/orchestrator/restart-crewly/{instructions.md → SKILL.md} +26 -0
  91. package/config/skills/orchestrator/resume-session/{instructions.md → SKILL.md} +24 -0
  92. package/config/skills/orchestrator/schedule-check/{instructions.md → SKILL.md} +24 -0
  93. package/config/skills/orchestrator/send-key/{instructions.md → SKILL.md} +26 -0
  94. package/config/skills/orchestrator/send-message/{instructions.md → SKILL.md} +24 -0
  95. package/config/skills/orchestrator/send-pdf-to-slack/{instructions.md → SKILL.md} +27 -0
  96. package/config/skills/orchestrator/set-goal/{instructions.md → SKILL.md} +26 -0
  97. package/config/skills/orchestrator/start-agent/{instructions.md → SKILL.md} +24 -0
  98. package/config/skills/orchestrator/start-team/{instructions.md → SKILL.md} +24 -0
  99. package/config/skills/orchestrator/stop-agent/{instructions.md → SKILL.md} +24 -0
  100. package/config/skills/orchestrator/stop-team/SKILL.md +43 -0
  101. package/config/skills/orchestrator/subscribe-event/{instructions.md → SKILL.md} +24 -0
  102. package/config/skills/orchestrator/terminate-agent/{instructions.md → SKILL.md} +24 -0
  103. package/config/skills/orchestrator/unsubscribe-event/SKILL.md +42 -0
  104. package/config/skills/orchestrator/update-focus/{instructions.md → SKILL.md} +26 -0
  105. package/config/skills/orchestrator/update-team/{instructions.md → SKILL.md} +24 -0
  106. package/config/skills/team-leader/aggregate-results/{instructions.md → SKILL.md} +26 -0
  107. package/config/skills/team-leader/decompose-goal/{instructions.md → SKILL.md} +26 -0
  108. package/config/skills/team-leader/delegate-task/{instructions.md → SKILL.md} +26 -0
  109. package/config/skills/team-leader/delegate-task/execute.sh +14 -6
  110. package/config/skills/team-leader/delegate-task/execute.test.sh +401 -0
  111. package/config/skills/team-leader/handle-failure/{instructions.md → SKILL.md} +27 -0
  112. package/config/skills/team-leader/schedule-check/{instructions.md → SKILL.md} +26 -0
  113. package/config/skills/team-leader/start-agent/{instructions.md → SKILL.md} +26 -0
  114. package/config/skills/team-leader/stop-agent/{instructions.md → SKILL.md} +26 -0
  115. package/config/skills/team-leader/verify-output/{instructions.md → SKILL.md} +27 -0
  116. package/config/templates/agent-agents-md.md +35 -0
  117. package/config/templates/agent-gemini-md.md +35 -0
  118. package/config/templates/code-review-team/team-config.json +7 -0
  119. package/config/templates/content-generation-team/norms/brand-guidelines.md +64 -0
  120. package/config/templates/content-generation-team/norms/content-review.md +66 -0
  121. package/config/templates/content-generation-team/norms/publish-checklist.md +58 -0
  122. package/config/templates/content-generation-team/team-config.json +8 -0
  123. package/config/templates/dev-fullstack/norms/code-commit-sop.md +40 -0
  124. package/config/templates/dev-fullstack/norms/quality-gates.md +35 -0
  125. package/config/templates/dev-fullstack/template.json +17 -1
  126. package/config/templates/education-smb/template.json +10 -1
  127. package/config/templates/insurance-smb/template.json +10 -1
  128. package/config/templates/research-analysis/norms/research-methodology.md +36 -0
  129. package/config/templates/research-analysis/norms/source-citation.md +33 -0
  130. package/config/templates/research-analysis/template.json +17 -1
  131. package/config/templates/security-audit-team.json +67 -0
  132. package/config/templates/social-media-ops/norms/engagement-rules.md +35 -0
  133. package/config/templates/social-media-ops/norms/posting-schedule.md +43 -0
  134. package/config/templates/social-media-ops/template.json +17 -1
  135. package/config/templates/video-production/template.json +10 -1
  136. package/dist/backend/backend/src/constants.d.ts +80 -11
  137. package/dist/backend/backend/src/constants.d.ts.map +1 -1
  138. package/dist/backend/backend/src/constants.js +85 -11
  139. package/dist/backend/backend/src/constants.js.map +1 -1
  140. package/dist/backend/backend/src/controllers/approvals/approvals.controller.d.ts +99 -0
  141. package/dist/backend/backend/src/controllers/approvals/approvals.controller.d.ts.map +1 -0
  142. package/dist/backend/backend/src/controllers/approvals/approvals.controller.js +183 -0
  143. package/dist/backend/backend/src/controllers/approvals/approvals.controller.js.map +1 -0
  144. package/dist/backend/backend/src/controllers/approvals/approvals.routes.d.ts +15 -0
  145. package/dist/backend/backend/src/controllers/approvals/approvals.routes.d.ts.map +1 -0
  146. package/dist/backend/backend/src/controllers/approvals/approvals.routes.js +27 -0
  147. package/dist/backend/backend/src/controllers/approvals/approvals.routes.js.map +1 -0
  148. package/dist/backend/backend/src/controllers/cloud/cloud-google-auth.controller.d.ts +70 -0
  149. package/dist/backend/backend/src/controllers/cloud/cloud-google-auth.controller.d.ts.map +1 -0
  150. package/dist/backend/backend/src/controllers/cloud/cloud-google-auth.controller.js +368 -0
  151. package/dist/backend/backend/src/controllers/cloud/cloud-google-auth.controller.js.map +1 -0
  152. package/dist/backend/backend/src/controllers/cloud/cloud.controller.d.ts +24 -0
  153. package/dist/backend/backend/src/controllers/cloud/cloud.controller.d.ts.map +1 -1
  154. package/dist/backend/backend/src/controllers/cloud/cloud.controller.js +202 -3
  155. package/dist/backend/backend/src/controllers/cloud/cloud.controller.js.map +1 -1
  156. package/dist/backend/backend/src/controllers/cloud/cloud.routes.d.ts +9 -4
  157. package/dist/backend/backend/src/controllers/cloud/cloud.routes.d.ts.map +1 -1
  158. package/dist/backend/backend/src/controllers/cloud/cloud.routes.js +19 -5
  159. package/dist/backend/backend/src/controllers/cloud/cloud.routes.js.map +1 -1
  160. package/dist/backend/backend/src/controllers/cloud/index.d.ts +1 -0
  161. package/dist/backend/backend/src/controllers/cloud/index.d.ts.map +1 -1
  162. package/dist/backend/backend/src/controllers/cloud/index.js +1 -0
  163. package/dist/backend/backend/src/controllers/cloud/index.js.map +1 -1
  164. package/dist/backend/backend/src/controllers/index.d.ts.map +1 -1
  165. package/dist/backend/backend/src/controllers/index.js +2 -0
  166. package/dist/backend/backend/src/controllers/index.js.map +1 -1
  167. package/dist/backend/backend/src/controllers/marketplace/marketplace.controller.js +1 -1
  168. package/dist/backend/backend/src/controllers/marketplace/marketplace.controller.js.map +1 -1
  169. package/dist/backend/backend/src/controllers/marketplace/template-marketplace.routes.d.ts +3 -3
  170. package/dist/backend/backend/src/controllers/marketplace/template-marketplace.routes.js +9 -9
  171. package/dist/backend/backend/src/controllers/marketplace/template-marketplace.routes.js.map +1 -1
  172. package/dist/backend/backend/src/controllers/memory/memory.controller.js +6 -6
  173. package/dist/backend/backend/src/controllers/memory/memory.controller.js.map +1 -1
  174. package/dist/backend/backend/src/controllers/messaging/messenger.routes.d.ts +0 -7
  175. package/dist/backend/backend/src/controllers/messaging/messenger.routes.d.ts.map +1 -1
  176. package/dist/backend/backend/src/controllers/messaging/messenger.routes.js +2 -135
  177. package/dist/backend/backend/src/controllers/messaging/messenger.routes.js.map +1 -1
  178. package/dist/backend/backend/src/controllers/monitoring/terminal.controller.d.ts +14 -0
  179. package/dist/backend/backend/src/controllers/monitoring/terminal.controller.d.ts.map +1 -1
  180. package/dist/backend/backend/src/controllers/monitoring/terminal.controller.js +96 -1
  181. package/dist/backend/backend/src/controllers/monitoring/terminal.controller.js.map +1 -1
  182. package/dist/backend/backend/src/controllers/oauth/oauth.routes.d.ts.map +1 -1
  183. package/dist/backend/backend/src/controllers/oauth/oauth.routes.js +8 -1
  184. package/dist/backend/backend/src/controllers/oauth/oauth.routes.js.map +1 -1
  185. package/dist/backend/backend/src/controllers/orchestrator/orchestrator.controller.d.ts +16 -0
  186. package/dist/backend/backend/src/controllers/orchestrator/orchestrator.controller.d.ts.map +1 -1
  187. package/dist/backend/backend/src/controllers/orchestrator/orchestrator.controller.js +124 -13
  188. package/dist/backend/backend/src/controllers/orchestrator/orchestrator.controller.js.map +1 -1
  189. package/dist/backend/backend/src/controllers/payment/payment.controller.js +2 -2
  190. package/dist/backend/backend/src/controllers/payment/payment.controller.js.map +1 -1
  191. package/dist/backend/backend/src/controllers/payment/payment.routes.d.ts +3 -3
  192. package/dist/backend/backend/src/controllers/payment/payment.routes.d.ts.map +1 -1
  193. package/dist/backend/backend/src/controllers/payment/payment.routes.js +4 -14
  194. package/dist/backend/backend/src/controllers/payment/payment.routes.js.map +1 -1
  195. package/dist/backend/backend/src/controllers/payment/payment.types.d.ts +15 -94
  196. package/dist/backend/backend/src/controllers/payment/payment.types.d.ts.map +1 -1
  197. package/dist/backend/backend/src/controllers/payment/payment.types.js +11 -35
  198. package/dist/backend/backend/src/controllers/payment/payment.types.js.map +1 -1
  199. package/dist/backend/backend/src/controllers/pr-review/pr-review.controller.d.ts +49 -0
  200. package/dist/backend/backend/src/controllers/pr-review/pr-review.controller.d.ts.map +1 -0
  201. package/dist/backend/backend/src/controllers/pr-review/pr-review.controller.js +138 -0
  202. package/dist/backend/backend/src/controllers/pr-review/pr-review.controller.js.map +1 -0
  203. package/dist/backend/backend/src/controllers/pr-review/pr-review.routes.d.ts +20 -0
  204. package/dist/backend/backend/src/controllers/pr-review/pr-review.routes.d.ts.map +1 -0
  205. package/dist/backend/backend/src/controllers/pr-review/pr-review.routes.js +30 -0
  206. package/dist/backend/backend/src/controllers/pr-review/pr-review.routes.js.map +1 -0
  207. package/dist/backend/backend/src/controllers/quality-gate/quality-gate.controller.d.ts +12 -0
  208. package/dist/backend/backend/src/controllers/quality-gate/quality-gate.controller.d.ts.map +1 -1
  209. package/dist/backend/backend/src/controllers/quality-gate/quality-gate.controller.js +107 -0
  210. package/dist/backend/backend/src/controllers/quality-gate/quality-gate.controller.js.map +1 -1
  211. package/dist/backend/backend/src/controllers/request-types.d.ts +20 -1
  212. package/dist/backend/backend/src/controllers/request-types.d.ts.map +1 -1
  213. package/dist/backend/backend/src/controllers/slack/slack.controller.d.ts.map +1 -1
  214. package/dist/backend/backend/src/controllers/slack/slack.controller.js +11 -5
  215. package/dist/backend/backend/src/controllers/slack/slack.controller.js.map +1 -1
  216. package/dist/backend/backend/src/controllers/task-management/task-management.controller.d.ts +46 -0
  217. package/dist/backend/backend/src/controllers/task-management/task-management.controller.d.ts.map +1 -1
  218. package/dist/backend/backend/src/controllers/task-management/task-management.controller.js +598 -326
  219. package/dist/backend/backend/src/controllers/task-management/task-management.controller.js.map +1 -1
  220. package/dist/backend/backend/src/controllers/team/team.controller.d.ts +12 -0
  221. package/dist/backend/backend/src/controllers/team/team.controller.d.ts.map +1 -1
  222. package/dist/backend/backend/src/controllers/team/team.controller.js +105 -36
  223. package/dist/backend/backend/src/controllers/team/team.controller.js.map +1 -1
  224. package/dist/backend/backend/src/controllers/team/team.routes.d.ts.map +1 -1
  225. package/dist/backend/backend/src/controllers/team/team.routes.js +2 -1
  226. package/dist/backend/backend/src/controllers/team/team.routes.js.map +1 -1
  227. package/dist/backend/backend/src/controllers/template/template.controller.d.ts +11 -0
  228. package/dist/backend/backend/src/controllers/template/template.controller.d.ts.map +1 -1
  229. package/dist/backend/backend/src/controllers/template/template.controller.js +59 -0
  230. package/dist/backend/backend/src/controllers/template/template.controller.js.map +1 -1
  231. package/dist/backend/backend/src/controllers/template/template.routes.d.ts.map +1 -1
  232. package/dist/backend/backend/src/controllers/template/template.routes.js +2 -1
  233. package/dist/backend/backend/src/controllers/template/template.routes.js.map +1 -1
  234. package/dist/backend/backend/src/controllers/workspace/workspace.controller.d.ts +39 -0
  235. package/dist/backend/backend/src/controllers/workspace/workspace.controller.d.ts.map +1 -0
  236. package/dist/backend/backend/src/controllers/workspace/workspace.controller.js +120 -0
  237. package/dist/backend/backend/src/controllers/workspace/workspace.controller.js.map +1 -0
  238. package/dist/backend/backend/src/controllers/workspace/workspace.routes.d.ts +18 -0
  239. package/dist/backend/backend/src/controllers/workspace/workspace.routes.d.ts.map +1 -0
  240. package/dist/backend/backend/src/controllers/workspace/workspace.routes.js +27 -0
  241. package/dist/backend/backend/src/controllers/workspace/workspace.routes.js.map +1 -0
  242. package/dist/backend/backend/src/index.d.ts.map +1 -1
  243. package/dist/backend/backend/src/index.js +108 -15
  244. package/dist/backend/backend/src/index.js.map +1 -1
  245. package/dist/backend/backend/src/middleware/require-auth.middleware.d.ts +20 -0
  246. package/dist/backend/backend/src/middleware/require-auth.middleware.d.ts.map +1 -0
  247. package/dist/backend/backend/src/middleware/require-auth.middleware.js +21 -0
  248. package/dist/backend/backend/src/middleware/require-auth.middleware.js.map +1 -0
  249. package/dist/backend/backend/src/routes/api.routes.d.ts.map +1 -1
  250. package/dist/backend/backend/src/routes/api.routes.js +18 -5
  251. package/dist/backend/backend/src/routes/api.routes.js.map +1 -1
  252. package/dist/backend/backend/src/routes/modules/quality-gate.routes.d.ts +2 -1
  253. package/dist/backend/backend/src/routes/modules/quality-gate.routes.d.ts.map +1 -1
  254. package/dist/backend/backend/src/routes/modules/quality-gate.routes.js +4 -2
  255. package/dist/backend/backend/src/routes/modules/quality-gate.routes.js.map +1 -1
  256. package/dist/backend/backend/src/routes/modules/task-management.routes.d.ts.map +1 -1
  257. package/dist/backend/backend/src/routes/modules/task-management.routes.js +8 -0
  258. package/dist/backend/backend/src/routes/modules/task-management.routes.js.map +1 -1
  259. package/dist/backend/backend/src/routes/modules/terminal.routes.d.ts.map +1 -1
  260. package/dist/backend/backend/src/routes/modules/terminal.routes.js +4 -0
  261. package/dist/backend/backend/src/routes/modules/terminal.routes.js.map +1 -1
  262. package/dist/backend/backend/src/services/agent/adaptive-heartbeat.service.d.ts +149 -0
  263. package/dist/backend/backend/src/services/agent/adaptive-heartbeat.service.d.ts.map +1 -0
  264. package/dist/backend/backend/src/services/agent/adaptive-heartbeat.service.js +200 -0
  265. package/dist/backend/backend/src/services/agent/adaptive-heartbeat.service.js.map +1 -0
  266. package/dist/backend/backend/src/services/agent/agent-heartbeat-monitor.service.d.ts +13 -0
  267. package/dist/backend/backend/src/services/agent/agent-heartbeat-monitor.service.d.ts.map +1 -1
  268. package/dist/backend/backend/src/services/agent/agent-heartbeat-monitor.service.js +65 -6
  269. package/dist/backend/backend/src/services/agent/agent-heartbeat-monitor.service.js.map +1 -1
  270. package/dist/backend/backend/src/services/agent/agent-registration.service.d.ts +36 -0
  271. package/dist/backend/backend/src/services/agent/agent-registration.service.d.ts.map +1 -1
  272. package/dist/backend/backend/src/services/agent/agent-registration.service.js +174 -52
  273. package/dist/backend/backend/src/services/agent/agent-registration.service.js.map +1 -1
  274. package/dist/backend/backend/src/services/agent/auditor-scheduler.service.d.ts +66 -20
  275. package/dist/backend/backend/src/services/agent/auditor-scheduler.service.d.ts.map +1 -1
  276. package/dist/backend/backend/src/services/agent/auditor-scheduler.service.js +261 -60
  277. package/dist/backend/backend/src/services/agent/auditor-scheduler.service.js.map +1 -1
  278. package/dist/backend/backend/src/services/agent/claude-runtime.service.d.ts +19 -0
  279. package/dist/backend/backend/src/services/agent/claude-runtime.service.d.ts.map +1 -1
  280. package/dist/backend/backend/src/services/agent/claude-runtime.service.js +80 -0
  281. package/dist/backend/backend/src/services/agent/claude-runtime.service.js.map +1 -1
  282. package/dist/backend/backend/src/services/agent/context-window-monitor.service.d.ts +11 -0
  283. package/dist/backend/backend/src/services/agent/context-window-monitor.service.d.ts.map +1 -1
  284. package/dist/backend/backend/src/services/agent/context-window-monitor.service.js +49 -1
  285. package/dist/backend/backend/src/services/agent/context-window-monitor.service.js.map +1 -1
  286. package/dist/backend/backend/src/services/agent/crewly-agent/agent-runner.service.d.ts +74 -3
  287. package/dist/backend/backend/src/services/agent/crewly-agent/agent-runner.service.d.ts.map +1 -1
  288. package/dist/backend/backend/src/services/agent/crewly-agent/agent-runner.service.js +248 -18
  289. package/dist/backend/backend/src/services/agent/crewly-agent/agent-runner.service.js.map +1 -1
  290. package/dist/backend/backend/src/services/agent/crewly-agent/approval-queue.service.d.ts +161 -0
  291. package/dist/backend/backend/src/services/agent/crewly-agent/approval-queue.service.d.ts.map +1 -0
  292. package/dist/backend/backend/src/services/agent/crewly-agent/approval-queue.service.js +237 -0
  293. package/dist/backend/backend/src/services/agent/crewly-agent/approval-queue.service.js.map +1 -0
  294. package/dist/backend/backend/src/services/agent/crewly-agent/audit-trail.service.d.ts +74 -0
  295. package/dist/backend/backend/src/services/agent/crewly-agent/audit-trail.service.d.ts.map +1 -0
  296. package/dist/backend/backend/src/services/agent/crewly-agent/audit-trail.service.js +140 -0
  297. package/dist/backend/backend/src/services/agent/crewly-agent/audit-trail.service.js.map +1 -0
  298. package/dist/backend/backend/src/services/agent/crewly-agent/auditor-tools.d.ts.map +1 -1
  299. package/dist/backend/backend/src/services/agent/crewly-agent/auditor-tools.js +50 -2
  300. package/dist/backend/backend/src/services/agent/crewly-agent/auditor-tools.js.map +1 -1
  301. package/dist/backend/backend/src/services/agent/crewly-agent/crewly-agent-runtime.service.d.ts +16 -1
  302. package/dist/backend/backend/src/services/agent/crewly-agent/crewly-agent-runtime.service.d.ts.map +1 -1
  303. package/dist/backend/backend/src/services/agent/crewly-agent/crewly-agent-runtime.service.js +45 -5
  304. package/dist/backend/backend/src/services/agent/crewly-agent/crewly-agent-runtime.service.js.map +1 -1
  305. package/dist/backend/backend/src/services/agent/crewly-agent/index.d.ts +3 -1
  306. package/dist/backend/backend/src/services/agent/crewly-agent/index.d.ts.map +1 -1
  307. package/dist/backend/backend/src/services/agent/crewly-agent/index.js +3 -1
  308. package/dist/backend/backend/src/services/agent/crewly-agent/index.js.map +1 -1
  309. package/dist/backend/backend/src/services/agent/crewly-agent/mcp-tool-bridge.d.ts +135 -0
  310. package/dist/backend/backend/src/services/agent/crewly-agent/mcp-tool-bridge.d.ts.map +1 -0
  311. package/dist/backend/backend/src/services/agent/crewly-agent/mcp-tool-bridge.js +185 -0
  312. package/dist/backend/backend/src/services/agent/crewly-agent/mcp-tool-bridge.js.map +1 -0
  313. package/dist/backend/backend/src/services/agent/crewly-agent/model-manager.d.ts +10 -2
  314. package/dist/backend/backend/src/services/agent/crewly-agent/model-manager.d.ts.map +1 -1
  315. package/dist/backend/backend/src/services/agent/crewly-agent/model-manager.js +22 -2
  316. package/dist/backend/backend/src/services/agent/crewly-agent/model-manager.js.map +1 -1
  317. package/dist/backend/backend/src/services/agent/crewly-agent/rate-limiter.d.ts +143 -0
  318. package/dist/backend/backend/src/services/agent/crewly-agent/rate-limiter.d.ts.map +1 -0
  319. package/dist/backend/backend/src/services/agent/crewly-agent/rate-limiter.js +264 -0
  320. package/dist/backend/backend/src/services/agent/crewly-agent/rate-limiter.js.map +1 -0
  321. package/dist/backend/backend/src/services/agent/crewly-agent/smoke-test.js +2 -2
  322. package/dist/backend/backend/src/services/agent/crewly-agent/tool-registry.d.ts +55 -1
  323. package/dist/backend/backend/src/services/agent/crewly-agent/tool-registry.d.ts.map +1 -1
  324. package/dist/backend/backend/src/services/agent/crewly-agent/tool-registry.js +660 -45
  325. package/dist/backend/backend/src/services/agent/crewly-agent/tool-registry.js.map +1 -1
  326. package/dist/backend/backend/src/services/agent/crewly-agent/types.d.ts +75 -3
  327. package/dist/backend/backend/src/services/agent/crewly-agent/types.d.ts.map +1 -1
  328. package/dist/backend/backend/src/services/agent/crewly-agent/types.js +49 -2
  329. package/dist/backend/backend/src/services/agent/crewly-agent/types.js.map +1 -1
  330. package/dist/backend/backend/src/services/agent/runtime-exit-monitor.service.d.ts.map +1 -1
  331. package/dist/backend/backend/src/services/agent/runtime-exit-monitor.service.js +17 -2
  332. package/dist/backend/backend/src/services/agent/runtime-exit-monitor.service.js.map +1 -1
  333. package/dist/backend/backend/src/services/ai/prompt-builder.service.d.ts +37 -0
  334. package/dist/backend/backend/src/services/ai/prompt-builder.service.d.ts.map +1 -1
  335. package/dist/backend/backend/src/services/ai/prompt-builder.service.js +170 -3
  336. package/dist/backend/backend/src/services/ai/prompt-builder.service.js.map +1 -1
  337. package/dist/backend/backend/src/services/browser/chrome-discovery.service.d.ts +108 -0
  338. package/dist/backend/backend/src/services/browser/chrome-discovery.service.d.ts.map +1 -0
  339. package/dist/backend/backend/src/services/browser/chrome-discovery.service.js +251 -0
  340. package/dist/backend/backend/src/services/browser/chrome-discovery.service.js.map +1 -0
  341. package/dist/backend/backend/src/services/cloud/cloud-auth.middleware.js +1 -1
  342. package/dist/backend/backend/src/services/cloud/cloud-auth.middleware.js.map +1 -1
  343. package/dist/backend/backend/src/services/cloud/cloud-client.service.d.ts +12 -0
  344. package/dist/backend/backend/src/services/cloud/cloud-client.service.d.ts.map +1 -1
  345. package/dist/backend/backend/src/services/cloud/cloud-client.service.js +19 -0
  346. package/dist/backend/backend/src/services/cloud/cloud-client.service.js.map +1 -1
  347. package/dist/backend/backend/src/services/cloud/device-auto-discovery.service.d.ts +191 -0
  348. package/dist/backend/backend/src/services/cloud/device-auto-discovery.service.d.ts.map +1 -0
  349. package/dist/backend/backend/src/services/cloud/device-auto-discovery.service.js +415 -0
  350. package/dist/backend/backend/src/services/cloud/device-auto-discovery.service.js.map +1 -0
  351. package/dist/backend/backend/src/services/cloud/device-identity.service.d.ts +89 -0
  352. package/dist/backend/backend/src/services/cloud/device-identity.service.d.ts.map +1 -0
  353. package/dist/backend/backend/src/services/cloud/device-identity.service.js +148 -0
  354. package/dist/backend/backend/src/services/cloud/device-identity.service.js.map +1 -0
  355. package/dist/backend/backend/src/services/cloud/relay-client.service.d.ts.map +1 -1
  356. package/dist/backend/backend/src/services/cloud/relay-client.service.js +5 -3
  357. package/dist/backend/backend/src/services/cloud/relay-client.service.js.map +1 -1
  358. package/dist/backend/backend/src/services/core/tracing.service.d.ts +127 -0
  359. package/dist/backend/backend/src/services/core/tracing.service.d.ts.map +1 -0
  360. package/dist/backend/backend/src/services/core/tracing.service.js +238 -0
  361. package/dist/backend/backend/src/services/core/tracing.service.js.map +1 -0
  362. package/dist/backend/backend/src/services/event-bus/event-bus.service.d.ts.map +1 -1
  363. package/dist/backend/backend/src/services/event-bus/event-bus.service.js +11 -3
  364. package/dist/backend/backend/src/services/event-bus/event-bus.service.js.map +1 -1
  365. package/dist/backend/backend/src/services/index.d.ts +1 -0
  366. package/dist/backend/backend/src/services/index.d.ts.map +1 -1
  367. package/dist/backend/backend/src/services/index.js +1 -0
  368. package/dist/backend/backend/src/services/index.js.map +1 -1
  369. package/dist/backend/backend/src/services/knowledge/embedding-provider.d.ts +78 -0
  370. package/dist/backend/backend/src/services/knowledge/embedding-provider.d.ts.map +1 -0
  371. package/dist/backend/backend/src/services/knowledge/embedding-provider.js +164 -0
  372. package/dist/backend/backend/src/services/knowledge/embedding-provider.js.map +1 -0
  373. package/dist/backend/backend/src/services/knowledge/knowledge-search.service.d.ts +39 -13
  374. package/dist/backend/backend/src/services/knowledge/knowledge-search.service.d.ts.map +1 -1
  375. package/dist/backend/backend/src/services/knowledge/knowledge-search.service.js +114 -17
  376. package/dist/backend/backend/src/services/knowledge/knowledge-search.service.js.map +1 -1
  377. package/dist/backend/backend/src/services/knowledge/vector-store.service.d.ts +170 -23
  378. package/dist/backend/backend/src/services/knowledge/vector-store.service.d.ts.map +1 -1
  379. package/dist/backend/backend/src/services/knowledge/vector-store.service.js +565 -73
  380. package/dist/backend/backend/src/services/knowledge/vector-store.service.js.map +1 -1
  381. package/dist/backend/backend/src/services/marketplace/marketplace-installer.service.d.ts.map +1 -1
  382. package/dist/backend/backend/src/services/marketplace/marketplace-installer.service.js +8 -11
  383. package/dist/backend/backend/src/services/marketplace/marketplace-installer.service.js.map +1 -1
  384. package/dist/backend/backend/src/services/marketplace/marketplace.service.d.ts.map +1 -1
  385. package/dist/backend/backend/src/services/marketplace/marketplace.service.js +1 -0
  386. package/dist/backend/backend/src/services/marketplace/marketplace.service.js.map +1 -1
  387. package/dist/backend/backend/src/services/memory/context-flush.service.d.ts +73 -0
  388. package/dist/backend/backend/src/services/memory/context-flush.service.d.ts.map +1 -0
  389. package/dist/backend/backend/src/services/memory/context-flush.service.js +131 -0
  390. package/dist/backend/backend/src/services/memory/context-flush.service.js.map +1 -0
  391. package/dist/backend/backend/src/services/memory/learning-accumulation.service.d.ts +23 -2
  392. package/dist/backend/backend/src/services/memory/learning-accumulation.service.d.ts.map +1 -1
  393. package/dist/backend/backend/src/services/memory/learning-accumulation.service.js +78 -16
  394. package/dist/backend/backend/src/services/memory/learning-accumulation.service.js.map +1 -1
  395. package/dist/backend/backend/src/services/memory/memory.service.d.ts +38 -0
  396. package/dist/backend/backend/src/services/memory/memory.service.d.ts.map +1 -1
  397. package/dist/backend/backend/src/services/memory/memory.service.js +121 -2
  398. package/dist/backend/backend/src/services/memory/memory.service.js.map +1 -1
  399. package/dist/backend/backend/src/services/messaging/adapters/google-chat-messenger.adapter.d.ts +29 -207
  400. package/dist/backend/backend/src/services/messaging/adapters/google-chat-messenger.adapter.d.ts.map +1 -1
  401. package/dist/backend/backend/src/services/messaging/adapters/google-chat-messenger.adapter.js +97 -683
  402. package/dist/backend/backend/src/services/messaging/adapters/google-chat-messenger.adapter.js.map +1 -1
  403. package/dist/backend/backend/src/services/messaging/google-chat-initializer.d.ts.map +1 -1
  404. package/dist/backend/backend/src/services/messaging/google-chat-initializer.js +13 -12
  405. package/dist/backend/backend/src/services/messaging/google-chat-initializer.js.map +1 -1
  406. package/dist/backend/backend/src/services/messaging/messenger-adapter.interface.d.ts +2 -0
  407. package/dist/backend/backend/src/services/messaging/messenger-adapter.interface.d.ts.map +1 -1
  408. package/dist/backend/backend/src/services/messaging/queue-processor.service.d.ts +6 -23
  409. package/dist/backend/backend/src/services/messaging/queue-processor.service.d.ts.map +1 -1
  410. package/dist/backend/backend/src/services/messaging/queue-processor.service.js +48 -184
  411. package/dist/backend/backend/src/services/messaging/queue-processor.service.js.map +1 -1
  412. package/dist/backend/backend/src/services/monitoring/activity-monitor.service.d.ts.map +1 -1
  413. package/dist/backend/backend/src/services/monitoring/activity-monitor.service.js +51 -5
  414. package/dist/backend/backend/src/services/monitoring/activity-monitor.service.js.map +1 -1
  415. package/dist/backend/backend/src/services/orchestrator/index.d.ts +1 -1
  416. package/dist/backend/backend/src/services/orchestrator/index.d.ts.map +1 -1
  417. package/dist/backend/backend/src/services/orchestrator/index.js +1 -1
  418. package/dist/backend/backend/src/services/orchestrator/index.js.map +1 -1
  419. package/dist/backend/backend/src/services/orchestrator/orchestrator-heartbeat-monitor.service.d.ts +65 -0
  420. package/dist/backend/backend/src/services/orchestrator/orchestrator-heartbeat-monitor.service.d.ts.map +1 -1
  421. package/dist/backend/backend/src/services/orchestrator/orchestrator-heartbeat-monitor.service.js +165 -2
  422. package/dist/backend/backend/src/services/orchestrator/orchestrator-heartbeat-monitor.service.js.map +1 -1
  423. package/dist/backend/backend/src/services/orchestrator/orchestrator-status.service.d.ts +8 -0
  424. package/dist/backend/backend/src/services/orchestrator/orchestrator-status.service.d.ts.map +1 -1
  425. package/dist/backend/backend/src/services/orchestrator/orchestrator-status.service.js +23 -0
  426. package/dist/backend/backend/src/services/orchestrator/orchestrator-status.service.js.map +1 -1
  427. package/dist/backend/backend/src/services/payment/stripe.service.d.ts +95 -43
  428. package/dist/backend/backend/src/services/payment/stripe.service.d.ts.map +1 -1
  429. package/dist/backend/backend/src/services/payment/stripe.service.js +229 -190
  430. package/dist/backend/backend/src/services/payment/stripe.service.js.map +1 -1
  431. package/dist/backend/backend/src/services/pr-review/pr-review.service.d.ts +181 -0
  432. package/dist/backend/backend/src/services/pr-review/pr-review.service.d.ts.map +1 -0
  433. package/dist/backend/backend/src/services/pr-review/pr-review.service.js +336 -0
  434. package/dist/backend/backend/src/services/pr-review/pr-review.service.js.map +1 -0
  435. package/dist/backend/backend/src/services/project/task-tracking.service.d.ts +23 -0
  436. package/dist/backend/backend/src/services/project/task-tracking.service.d.ts.map +1 -1
  437. package/dist/backend/backend/src/services/project/task-tracking.service.js +88 -0
  438. package/dist/backend/backend/src/services/project/task-tracking.service.js.map +1 -1
  439. package/dist/backend/backend/src/services/session/index.d.ts +2 -0
  440. package/dist/backend/backend/src/services/session/index.d.ts.map +1 -1
  441. package/dist/backend/backend/src/services/session/index.js +2 -0
  442. package/dist/backend/backend/src/services/session/index.js.map +1 -1
  443. package/dist/backend/backend/src/services/session/session-handoff.service.d.ts +294 -0
  444. package/dist/backend/backend/src/services/session/session-handoff.service.d.ts.map +1 -0
  445. package/dist/backend/backend/src/services/session/session-handoff.service.js +674 -0
  446. package/dist/backend/backend/src/services/session/session-handoff.service.js.map +1 -0
  447. package/dist/backend/backend/src/services/skill/index.d.ts +1 -0
  448. package/dist/backend/backend/src/services/skill/index.d.ts.map +1 -1
  449. package/dist/backend/backend/src/services/skill/index.js +1 -0
  450. package/dist/backend/backend/src/services/skill/index.js.map +1 -1
  451. package/dist/backend/backend/src/services/skill/skill-catalog.service.d.ts +25 -6
  452. package/dist/backend/backend/src/services/skill/skill-catalog.service.d.ts.map +1 -1
  453. package/dist/backend/backend/src/services/skill/skill-catalog.service.js +78 -20
  454. package/dist/backend/backend/src/services/skill/skill-catalog.service.js.map +1 -1
  455. package/dist/backend/backend/src/services/skill/skill-tier.service.d.ts +116 -0
  456. package/dist/backend/backend/src/services/skill/skill-tier.service.d.ts.map +1 -0
  457. package/dist/backend/backend/src/services/skill/skill-tier.service.js +155 -0
  458. package/dist/backend/backend/src/services/skill/skill-tier.service.js.map +1 -0
  459. package/dist/backend/backend/src/services/skill/skill.service.d.ts +35 -7
  460. package/dist/backend/backend/src/services/skill/skill.service.d.ts.map +1 -1
  461. package/dist/backend/backend/src/services/skill/skill.service.js +128 -35
  462. package/dist/backend/backend/src/services/skill/skill.service.js.map +1 -1
  463. package/dist/backend/backend/src/services/slack/slack-orchestrator-bridge.d.ts +50 -47
  464. package/dist/backend/backend/src/services/slack/slack-orchestrator-bridge.d.ts.map +1 -1
  465. package/dist/backend/backend/src/services/slack/slack-orchestrator-bridge.js +267 -202
  466. package/dist/backend/backend/src/services/slack/slack-orchestrator-bridge.js.map +1 -1
  467. package/dist/backend/backend/src/services/slack/slack.service.d.ts +28 -2
  468. package/dist/backend/backend/src/services/slack/slack.service.d.ts.map +1 -1
  469. package/dist/backend/backend/src/services/slack/slack.service.js +69 -3
  470. package/dist/backend/backend/src/services/slack/slack.service.js.map +1 -1
  471. package/dist/backend/backend/src/services/template/template.service.d.ts +19 -1
  472. package/dist/backend/backend/src/services/template/template.service.d.ts.map +1 -1
  473. package/dist/backend/backend/src/services/template/template.service.js +110 -3
  474. package/dist/backend/backend/src/services/template/template.service.js.map +1 -1
  475. package/dist/backend/backend/src/services/whatsapp/whatsapp-orchestrator-bridge.d.ts +11 -0
  476. package/dist/backend/backend/src/services/whatsapp/whatsapp-orchestrator-bridge.d.ts.map +1 -1
  477. package/dist/backend/backend/src/services/whatsapp/whatsapp-orchestrator-bridge.js +57 -3
  478. package/dist/backend/backend/src/services/whatsapp/whatsapp-orchestrator-bridge.js.map +1 -1
  479. package/dist/backend/backend/src/services/workflow/message-scheduler.service.d.ts.map +1 -1
  480. package/dist/backend/backend/src/services/workflow/message-scheduler.service.js +6 -0
  481. package/dist/backend/backend/src/services/workflow/message-scheduler.service.js.map +1 -1
  482. package/dist/backend/backend/src/services/workflow/scheduler.service.d.ts +52 -0
  483. package/dist/backend/backend/src/services/workflow/scheduler.service.d.ts.map +1 -1
  484. package/dist/backend/backend/src/services/workflow/scheduler.service.js +319 -6
  485. package/dist/backend/backend/src/services/workflow/scheduler.service.js.map +1 -1
  486. package/dist/backend/backend/src/types/chat.types.d.ts +2 -2
  487. package/dist/backend/backend/src/types/chat.types.d.ts.map +1 -1
  488. package/dist/backend/backend/src/types/chat.types.js +18 -22
  489. package/dist/backend/backend/src/types/chat.types.js.map +1 -1
  490. package/dist/backend/backend/src/types/index.d.ts +37 -0
  491. package/dist/backend/backend/src/types/index.d.ts.map +1 -1
  492. package/dist/backend/backend/src/types/index.js.map +1 -1
  493. package/dist/backend/backend/src/types/marketplace.types.d.ts +1 -1
  494. package/dist/backend/backend/src/types/marketplace.types.d.ts.map +1 -1
  495. package/dist/backend/backend/src/types/scheduler.types.d.ts +4 -0
  496. package/dist/backend/backend/src/types/scheduler.types.d.ts.map +1 -1
  497. package/dist/backend/backend/src/types/scheduler.types.js.map +1 -1
  498. package/dist/backend/backend/src/types/skill.types.d.ts +4 -0
  499. package/dist/backend/backend/src/types/skill.types.d.ts.map +1 -1
  500. package/dist/backend/backend/src/types/skill.types.js.map +1 -1
  501. package/dist/backend/backend/src/types/task-tracking.types.d.ts +6 -0
  502. package/dist/backend/backend/src/types/task-tracking.types.d.ts.map +1 -1
  503. package/dist/backend/backend/src/types/task-tracking.types.js.map +1 -1
  504. package/dist/backend/backend/src/types/team-template.types.d.ts +2 -0
  505. package/dist/backend/backend/src/types/team-template.types.d.ts.map +1 -1
  506. package/dist/backend/backend/src/types/team-template.types.js.map +1 -1
  507. package/dist/backend/backend/src/utils/skill-md-parser.d.ts +38 -0
  508. package/dist/backend/backend/src/utils/skill-md-parser.d.ts.map +1 -0
  509. package/dist/backend/backend/src/utils/skill-md-parser.js +47 -0
  510. package/dist/backend/backend/src/utils/skill-md-parser.js.map +1 -0
  511. package/dist/backend/backend/src/websocket/terminal.gateway.d.ts +0 -154
  512. package/dist/backend/backend/src/websocket/terminal.gateway.d.ts.map +1 -1
  513. package/dist/backend/backend/src/websocket/terminal.gateway.js +0 -515
  514. package/dist/backend/backend/src/websocket/terminal.gateway.js.map +1 -1
  515. package/dist/backend/config/constants.d.ts +18 -3
  516. package/dist/backend/config/constants.d.ts.map +1 -1
  517. package/dist/backend/config/constants.js +18 -3
  518. package/dist/backend/config/constants.js.map +1 -1
  519. package/dist/cli/backend/src/constants.d.ts +80 -11
  520. package/dist/cli/backend/src/constants.d.ts.map +1 -1
  521. package/dist/cli/backend/src/constants.js +85 -11
  522. package/dist/cli/backend/src/constants.js.map +1 -1
  523. package/dist/cli/backend/src/services/knowledge/embedding-provider.d.ts +78 -0
  524. package/dist/cli/backend/src/services/knowledge/embedding-provider.d.ts.map +1 -0
  525. package/dist/cli/backend/src/services/knowledge/embedding-provider.js +164 -0
  526. package/dist/cli/backend/src/services/knowledge/embedding-provider.js.map +1 -0
  527. package/dist/cli/backend/src/services/knowledge/knowledge-search.service.d.ts +39 -13
  528. package/dist/cli/backend/src/services/knowledge/knowledge-search.service.d.ts.map +1 -1
  529. package/dist/cli/backend/src/services/knowledge/knowledge-search.service.js +114 -17
  530. package/dist/cli/backend/src/services/knowledge/knowledge-search.service.js.map +1 -1
  531. package/dist/cli/backend/src/services/knowledge/vector-store.service.d.ts +170 -23
  532. package/dist/cli/backend/src/services/knowledge/vector-store.service.d.ts.map +1 -1
  533. package/dist/cli/backend/src/services/knowledge/vector-store.service.js +565 -73
  534. package/dist/cli/backend/src/services/knowledge/vector-store.service.js.map +1 -1
  535. package/dist/cli/backend/src/services/memory/memory.service.d.ts +38 -0
  536. package/dist/cli/backend/src/services/memory/memory.service.d.ts.map +1 -1
  537. package/dist/cli/backend/src/services/memory/memory.service.js +121 -2
  538. package/dist/cli/backend/src/services/memory/memory.service.js.map +1 -1
  539. package/dist/cli/backend/src/types/chat.types.d.ts +2 -2
  540. package/dist/cli/backend/src/types/chat.types.d.ts.map +1 -1
  541. package/dist/cli/backend/src/types/chat.types.js +18 -22
  542. package/dist/cli/backend/src/types/chat.types.js.map +1 -1
  543. package/dist/cli/backend/src/types/index.d.ts +37 -0
  544. package/dist/cli/backend/src/types/index.d.ts.map +1 -1
  545. package/dist/cli/backend/src/types/index.js.map +1 -1
  546. package/dist/cli/backend/src/types/scheduler.types.d.ts +4 -0
  547. package/dist/cli/backend/src/types/scheduler.types.d.ts.map +1 -1
  548. package/dist/cli/backend/src/types/scheduler.types.js.map +1 -1
  549. package/dist/cli/backend/src/types/skill.types.d.ts +4 -0
  550. package/dist/cli/backend/src/types/skill.types.d.ts.map +1 -1
  551. package/dist/cli/backend/src/types/skill.types.js.map +1 -1
  552. package/dist/cli/cli/src/commands/onboard.d.ts +19 -2
  553. package/dist/cli/cli/src/commands/onboard.d.ts.map +1 -1
  554. package/dist/cli/cli/src/commands/onboard.js +58 -15
  555. package/dist/cli/cli/src/commands/onboard.js.map +1 -1
  556. package/dist/cli/cli/src/commands/pair.d.ts +46 -0
  557. package/dist/cli/cli/src/commands/pair.d.ts.map +1 -0
  558. package/dist/cli/cli/src/commands/pair.js +258 -0
  559. package/dist/cli/cli/src/commands/pair.js.map +1 -0
  560. package/dist/cli/cli/src/commands/service.d.ts +86 -0
  561. package/dist/cli/cli/src/commands/service.d.ts.map +1 -0
  562. package/dist/cli/cli/src/commands/service.js +687 -0
  563. package/dist/cli/cli/src/commands/service.js.map +1 -0
  564. package/dist/cli/cli/src/index.js +17 -0
  565. package/dist/cli/cli/src/index.js.map +1 -1
  566. package/dist/cli/config/constants.d.ts +18 -3
  567. package/dist/cli/config/constants.d.ts.map +1 -1
  568. package/dist/cli/config/constants.js +18 -3
  569. package/dist/cli/config/constants.js.map +1 -1
  570. package/frontend/dist/assets/index-60a9e4ea.css +33 -0
  571. package/frontend/dist/assets/{index-e6d7db4a.js → index-e8162966.js} +353 -353
  572. package/frontend/dist/index.html +2 -2
  573. package/package.json +22 -10
  574. package/config/skills/agent/browse-stealth/skill.json +0 -20
  575. package/config/skills/agent/competitor-content-tracker/skill.json +0 -22
  576. package/config/skills/agent/computer-use/skill.json +0 -29
  577. package/config/skills/agent/content-calendar/skill.json +0 -22
  578. package/config/skills/agent/content-repurposer/skill.json +0 -22
  579. package/config/skills/agent/content-writer/skill.json +0 -22
  580. package/config/skills/agent/core/accept-task/skill.json +0 -20
  581. package/config/skills/agent/core/block-task/skill.json +0 -20
  582. package/config/skills/agent/core/check-quality-gates/skill.json +0 -20
  583. package/config/skills/agent/core/complete-task/skill.json +0 -20
  584. package/config/skills/agent/core/generate-pdf/skill.json +0 -20
  585. package/config/skills/agent/core/get-my-context/skill.json +0 -20
  586. package/config/skills/agent/core/get-sops/skill.json +0 -20
  587. package/config/skills/agent/core/get-team-status/instructions.md +0 -17
  588. package/config/skills/agent/core/get-team-status/skill.json +0 -20
  589. package/config/skills/agent/core/heartbeat/skill.json +0 -20
  590. package/config/skills/agent/core/marketplace-search/skill.json +0 -20
  591. package/config/skills/agent/core/query-knowledge/skill.json +0 -20
  592. package/config/skills/agent/core/read-task/instructions.md +0 -19
  593. package/config/skills/agent/core/read-task/skill.json +0 -20
  594. package/config/skills/agent/core/recall/skill.json +0 -20
  595. package/config/skills/agent/core/record-learning/skill.json +0 -20
  596. package/config/skills/agent/core/register-self/instructions.md +0 -18
  597. package/config/skills/agent/core/register-self/skill.json +0 -20
  598. package/config/skills/agent/core/remember/skill.json +0 -20
  599. package/config/skills/agent/core/reply-chat/skill.json +0 -20
  600. package/config/skills/agent/core/report-progress/skill.json +0 -20
  601. package/config/skills/agent/core/report-status/skill.json +0 -20
  602. package/config/skills/agent/core/send-chat-response/skill.json +0 -20
  603. package/config/skills/agent/core/send-message/instructions.md +0 -20
  604. package/config/skills/agent/core/send-message/skill.json +0 -20
  605. package/config/skills/agent/desktop-app-control/skill.json +0 -33
  606. package/config/skills/agent/trend-monitor/skill.json +0 -22
  607. package/config/skills/agent/vnc-browser/skill.json +0 -20
  608. package/config/skills/orchestrator/assign-task/instructions.md +0 -17
  609. package/config/skills/orchestrator/assign-task/skill.json +0 -20
  610. package/config/skills/orchestrator/assign-team-to-project/skill.json +0 -20
  611. package/config/skills/orchestrator/broadcast/skill.json +0 -20
  612. package/config/skills/orchestrator/broadcast-to-org/skill.json +0 -20
  613. package/config/skills/orchestrator/cancel-all-schedules/skill.json +0 -17
  614. package/config/skills/orchestrator/cancel-schedule/instructions.md +0 -19
  615. package/config/skills/orchestrator/cancel-schedule/skill.json +0 -20
  616. package/config/skills/orchestrator/complete-task/instructions.md +0 -17
  617. package/config/skills/orchestrator/complete-task/skill.json +0 -20
  618. package/config/skills/orchestrator/create-project/skill.json +0 -20
  619. package/config/skills/orchestrator/create-team/skill.json +0 -20
  620. package/config/skills/orchestrator/delegate-task/skill.json +0 -20
  621. package/config/skills/orchestrator/get-agent-logs/skill.json +0 -20
  622. package/config/skills/orchestrator/get-agent-status/skill.json +0 -20
  623. package/config/skills/orchestrator/get-project-overview/instructions.md +0 -17
  624. package/config/skills/orchestrator/get-project-overview/skill.json +0 -20
  625. package/config/skills/orchestrator/get-tasks/instructions.md +0 -17
  626. package/config/skills/orchestrator/get-tasks/skill.json +0 -20
  627. package/config/skills/orchestrator/get-team-status/instructions.md +0 -17
  628. package/config/skills/orchestrator/get-team-status/skill.json +0 -20
  629. package/config/skills/orchestrator/handle-agent-failure/skill.json +0 -20
  630. package/config/skills/orchestrator/heartbeat/skill.json +0 -20
  631. package/config/skills/orchestrator/list-schedules/skill.json +0 -12
  632. package/config/skills/orchestrator/list-subscriptions/instructions.md +0 -17
  633. package/config/skills/orchestrator/list-subscriptions/skill.json +0 -20
  634. package/config/skills/orchestrator/query-knowledge/skill.json +0 -20
  635. package/config/skills/orchestrator/read-session-logs/skill.json +0 -20
  636. package/config/skills/orchestrator/read-system-logs/skill.json +0 -20
  637. package/config/skills/orchestrator/recall/skill.json +0 -20
  638. package/config/skills/orchestrator/record-failure/skill.json +0 -20
  639. package/config/skills/orchestrator/record-learning/skill.json +0 -20
  640. package/config/skills/orchestrator/record-success/skill.json +0 -20
  641. package/config/skills/orchestrator/register-self/skill.json +0 -20
  642. package/config/skills/orchestrator/remember/skill.json +0 -20
  643. package/config/skills/orchestrator/reply-chat/skill.json +0 -20
  644. package/config/skills/orchestrator/reply-gchat/skill.json +0 -20
  645. package/config/skills/orchestrator/reply-slack/skill.json +0 -20
  646. package/config/skills/orchestrator/report-bug/skill.json +0 -20
  647. package/config/skills/orchestrator/restart-crewly/skill.json +0 -20
  648. package/config/skills/orchestrator/resume-session/skill.json +0 -20
  649. package/config/skills/orchestrator/schedule-check/skill.json +0 -20
  650. package/config/skills/orchestrator/send-key/skill.json +0 -20
  651. package/config/skills/orchestrator/send-message/skill.json +0 -20
  652. package/config/skills/orchestrator/send-pdf-to-slack/skill.json +0 -20
  653. package/config/skills/orchestrator/set-goal/skill.json +0 -20
  654. package/config/skills/orchestrator/start-agent/skill.json +0 -20
  655. package/config/skills/orchestrator/start-team/skill.json +0 -20
  656. package/config/skills/orchestrator/stop-agent/skill.json +0 -20
  657. package/config/skills/orchestrator/stop-team/instructions.md +0 -19
  658. package/config/skills/orchestrator/stop-team/skill.json +0 -20
  659. package/config/skills/orchestrator/subscribe-event/skill.json +0 -20
  660. package/config/skills/orchestrator/terminate-agent/skill.json +0 -20
  661. package/config/skills/orchestrator/unsubscribe-event/instructions.md +0 -19
  662. package/config/skills/orchestrator/unsubscribe-event/skill.json +0 -20
  663. package/config/skills/orchestrator/update-focus/skill.json +0 -20
  664. package/config/skills/orchestrator/update-team/skill.json +0 -20
  665. package/config/skills/team-leader/aggregate-results/skill.json +0 -20
  666. package/config/skills/team-leader/decompose-goal/skill.json +0 -20
  667. package/config/skills/team-leader/delegate-task/skill.json +0 -20
  668. package/config/skills/team-leader/handle-failure/skill.json +0 -20
  669. package/config/skills/team-leader/schedule-check/skill.json +0 -20
  670. package/config/skills/team-leader/start-agent/skill.json +0 -20
  671. package/config/skills/team-leader/stop-agent/skill.json +0 -20
  672. package/config/skills/team-leader/verify-output/skill.json +0 -20
  673. package/frontend/dist/assets/index-0e5673b0.css +0 -33
@@ -0,0 +1,674 @@
1
+ /**
2
+ * Session Handoff Service
3
+ *
4
+ * Generates a structured session summary on shutdown and pushes it to agents
5
+ * on restart. Replaces the old Slack-only pushRecentSlackHistory approach with
6
+ * a channel-agnostic summary that covers Slack, Google Chat, and Chat UI.
7
+ *
8
+ * Summary is stored at ~/.crewly/session-summaries/latest.md and is limited
9
+ * to 50 lines for prompt-budget friendliness.
10
+ *
11
+ * @module services/session/session-handoff.service
12
+ */
13
+ import * as fs from 'fs/promises';
14
+ import * as path from 'path';
15
+ import * as os from 'os';
16
+ import { LoggerService } from '../core/logger.service.js';
17
+ import { CREWLY_CONSTANTS, SLACK_THREAD_CONSTANTS, GCHAT_THREAD_CONSTANTS } from '../../constants.js';
18
+ import { RUNTIME_TYPES } from '../../constants.js';
19
+ /** Maximum number of lines the summary may contain */
20
+ const MAX_SUMMARY_LINES = 80;
21
+ /** Maximum number of pending tasks to include in the summary */
22
+ const MAX_PENDING_TASKS = 10;
23
+ /** Maximum age in ms for a thread to be considered for resume notification (24 hours) */
24
+ const RESUME_MAX_AGE_MS = 24 * 60 * 60 * 1000;
25
+ /** Maximum number of recent user messages to include per thread */
26
+ const MAX_MESSAGES_PER_THREAD = 3;
27
+ /** Maximum number of active threads to include in the summary */
28
+ const MAX_ACTIVE_THREADS = 6;
29
+ /** Directory name for session summaries under crewly home */
30
+ const SUMMARIES_DIR = 'session-summaries';
31
+ /** Summary filename */
32
+ const LATEST_SUMMARY = 'latest.md';
33
+ /**
34
+ * Manages generation of session summaries on shutdown and delivery on restart.
35
+ *
36
+ * @example
37
+ * ```typescript
38
+ * const handoff = SessionHandoffService.getInstance();
39
+ *
40
+ * // On shutdown:
41
+ * await handoff.generateSummary(storageService);
42
+ *
43
+ * // On agent registration:
44
+ * await handoff.pushSessionSummary(agentService, 'crewly-orc');
45
+ * ```
46
+ */
47
+ export class SessionHandoffService {
48
+ static instance = null;
49
+ logger = LoggerService.getInstance().createComponentLogger('SessionHandoffService');
50
+ constructor() { }
51
+ /**
52
+ * Gets the singleton instance.
53
+ *
54
+ * @returns SessionHandoffService instance
55
+ */
56
+ static getInstance() {
57
+ if (!SessionHandoffService.instance) {
58
+ SessionHandoffService.instance = new SessionHandoffService();
59
+ }
60
+ return SessionHandoffService.instance;
61
+ }
62
+ /**
63
+ * Resets the singleton instance (for testing).
64
+ */
65
+ static resetInstance() {
66
+ SessionHandoffService.instance = null;
67
+ }
68
+ /**
69
+ * Returns the directory path for session summaries.
70
+ *
71
+ * @returns Absolute path to ~/.crewly/session-summaries/
72
+ */
73
+ getSummariesDir() {
74
+ return path.join(os.homedir(), CREWLY_CONSTANTS.PATHS.CREWLY_HOME, SUMMARIES_DIR);
75
+ }
76
+ /**
77
+ * Returns the path to the latest summary file.
78
+ *
79
+ * @returns Absolute path to ~/.crewly/session-summaries/latest.md
80
+ */
81
+ getLatestSummaryPath() {
82
+ return path.join(this.getSummariesDir(), LATEST_SUMMARY);
83
+ }
84
+ /**
85
+ * Scans a thread directory for the most recently modified .md files.
86
+ * Works for both Slack (~/.crewly/slack-threads/) and GChat (~/.crewly/gchat-threads/).
87
+ *
88
+ * @param baseDir - Base directory to scan (e.g., ~/.crewly/slack-threads/)
89
+ * @param channelType - Type of channel ('slack' or 'gchat')
90
+ * @param maxThreads - Maximum number of threads to return
91
+ * @returns Array of ActiveThread info sorted by recency
92
+ */
93
+ async scanThreadDirectory(baseDir, channelType, maxThreads = MAX_ACTIVE_THREADS) {
94
+ const threads = [];
95
+ try {
96
+ const entries = await fs.readdir(baseDir).catch(() => []);
97
+ // Collect all .md files across subdirectories
98
+ const candidates = [];
99
+ for (const entry of entries) {
100
+ if (entry.endsWith('.json'))
101
+ continue; // Skip index files
102
+ const entryPath = path.join(baseDir, entry);
103
+ const stat = await fs.stat(entryPath).catch(() => null);
104
+ if (stat?.isDirectory()) {
105
+ const files = await fs.readdir(entryPath).catch(() => []);
106
+ for (const file of files) {
107
+ if (!file.endsWith('.md'))
108
+ continue;
109
+ const filePath = path.join(entryPath, file);
110
+ const fileStat = await fs.stat(filePath).catch(() => null);
111
+ if (fileStat) {
112
+ candidates.push({ filePath, channelId: entry, mtimeMs: fileStat.mtimeMs });
113
+ }
114
+ }
115
+ }
116
+ }
117
+ // Sort by modification time (most recent first) and take top N
118
+ candidates.sort((a, b) => b.mtimeMs - a.mtimeMs);
119
+ for (const candidate of candidates.slice(0, maxThreads)) {
120
+ const recentMessages = await this.extractRecentMessages(candidate.filePath);
121
+ threads.push({
122
+ channelType,
123
+ channelId: candidate.channelId,
124
+ filePath: candidate.filePath,
125
+ lastActiveAt: new Date(candidate.mtimeMs).toISOString(),
126
+ recentMessages,
127
+ });
128
+ }
129
+ }
130
+ catch (error) {
131
+ this.logger.debug('Failed to scan thread directory', {
132
+ baseDir,
133
+ error: error instanceof Error ? error.message : String(error),
134
+ });
135
+ }
136
+ return threads;
137
+ }
138
+ /**
139
+ * Scans Chat UI conversation storage for active conversations.
140
+ *
141
+ * @param chatDir - Path to chat storage directory (default: ~/.crewly/chat/)
142
+ * @param maxConversations - Maximum number of conversations to return
143
+ * @returns Array of ActiveThread info for Chat UI conversations
144
+ */
145
+ async scanChatUiConversations(chatDir, maxConversations = MAX_ACTIVE_THREADS) {
146
+ const threads = [];
147
+ const dir = chatDir || path.join(os.homedir(), CREWLY_CONSTANTS.PATHS.CREWLY_HOME, 'chat');
148
+ try {
149
+ const files = await fs.readdir(dir).catch(() => []);
150
+ const jsonFiles = files.filter(f => f.endsWith('.json'));
151
+ const candidates = [];
152
+ for (const file of jsonFiles) {
153
+ const filePath = path.join(dir, file);
154
+ const stat = await fs.stat(filePath).catch(() => null);
155
+ if (stat) {
156
+ candidates.push({ filePath, id: file.replace('.json', ''), mtimeMs: stat.mtimeMs });
157
+ }
158
+ }
159
+ candidates.sort((a, b) => b.mtimeMs - a.mtimeMs);
160
+ for (const candidate of candidates.slice(0, maxConversations)) {
161
+ const recentMessages = await this.extractChatUiMessages(candidate.filePath);
162
+ threads.push({
163
+ channelType: 'chat-ui',
164
+ channelId: candidate.id,
165
+ filePath: candidate.filePath,
166
+ lastActiveAt: new Date(candidate.mtimeMs).toISOString(),
167
+ recentMessages,
168
+ });
169
+ }
170
+ }
171
+ catch (error) {
172
+ this.logger.debug('Failed to scan Chat UI conversations', {
173
+ error: error instanceof Error ? error.message : String(error),
174
+ });
175
+ }
176
+ return threads;
177
+ }
178
+ /**
179
+ * Extracts recent message summaries from a markdown thread file.
180
+ * Reads the last few message blocks (lines starting with **Name**).
181
+ *
182
+ * @param filePath - Absolute path to the thread .md file
183
+ * @returns Array of recent message summary strings
184
+ */
185
+ async extractRecentMessages(filePath) {
186
+ try {
187
+ const content = await fs.readFile(filePath, 'utf-8');
188
+ // Skip frontmatter
189
+ const frontmatterEnd = content.indexOf('---', content.indexOf('---') + 3);
190
+ const body = frontmatterEnd > 0 ? content.slice(frontmatterEnd + 3).trim() : content;
191
+ // Extract lines that look like message headers (e.g., "**Steve** (2025-03-16 12:00):")
192
+ const messagePattern = /^\*\*(.+?)\*\*\s*\(([^)]+)\):\s*$/;
193
+ const lines = body.split('\n');
194
+ const messages = [];
195
+ for (let i = 0; i < lines.length; i++) {
196
+ const match = lines[i].match(messagePattern);
197
+ if (match) {
198
+ const sender = match[1];
199
+ // Grab the next non-empty line as content preview
200
+ let preview = '';
201
+ for (let j = i + 1; j < Math.min(i + 4, lines.length); j++) {
202
+ const trimmed = lines[j].trim();
203
+ if (trimmed && !trimmed.startsWith('**')) {
204
+ preview = trimmed.slice(0, 120);
205
+ break;
206
+ }
207
+ }
208
+ messages.push(`${sender}: ${preview || '(empty)'}`);
209
+ }
210
+ }
211
+ return messages.slice(-MAX_MESSAGES_PER_THREAD);
212
+ }
213
+ catch {
214
+ return [];
215
+ }
216
+ }
217
+ /**
218
+ * Extracts recent messages from a Chat UI JSON conversation file.
219
+ *
220
+ * @param filePath - Absolute path to the conversation .json file
221
+ * @returns Array of recent message summary strings
222
+ */
223
+ async extractChatUiMessages(filePath) {
224
+ try {
225
+ const raw = await fs.readFile(filePath, 'utf-8');
226
+ const data = JSON.parse(raw);
227
+ if (!data.messages || data.messages.length === 0)
228
+ return [];
229
+ return data.messages
230
+ .slice(-MAX_MESSAGES_PER_THREAD)
231
+ .map(m => {
232
+ const sender = m.from?.name || m.from?.type || 'unknown';
233
+ const content = (m.content || '').slice(0, 120);
234
+ return `${sender}: ${content || '(empty)'}`;
235
+ });
236
+ }
237
+ catch {
238
+ return [];
239
+ }
240
+ }
241
+ /**
242
+ * Collects active agent info from team storage.
243
+ *
244
+ * @param teamReader - Service to read team data
245
+ * @returns Array of active agent info
246
+ */
247
+ async collectActiveAgents(teamReader) {
248
+ const agents = [];
249
+ try {
250
+ const teams = await teamReader.getTeams();
251
+ for (const team of teams) {
252
+ for (const member of team.members) {
253
+ if (member.agentStatus === 'active' || member.agentStatus === 'started') {
254
+ agents.push({
255
+ sessionName: member.sessionName,
256
+ role: member.role,
257
+ workingStatus: member.workingStatus || 'idle',
258
+ currentTask: member.currentTickets?.[0],
259
+ });
260
+ }
261
+ }
262
+ }
263
+ }
264
+ catch (error) {
265
+ this.logger.debug('Failed to collect active agents', {
266
+ error: error instanceof Error ? error.message : String(error),
267
+ });
268
+ }
269
+ return agents;
270
+ }
271
+ /**
272
+ * Scans .crewly/tasks/delegated/ for non-completed tasks (open + in_progress).
273
+ * Parses each task MD file to extract title, assignee, status, and priority.
274
+ *
275
+ * @param tasksBaseDir - Override for the tasks base directory (for testing)
276
+ * @returns Array of PendingTaskInfo sorted by priority (high first)
277
+ */
278
+ async scanPendingTasks(tasksBaseDir) {
279
+ const baseDir = tasksBaseDir || path.join(os.homedir(), CREWLY_CONSTANTS.PATHS.CREWLY_HOME, 'tasks', 'delegated');
280
+ const pendingTasks = [];
281
+ const statusDirs = ['in_progress', 'open'];
282
+ for (const statusDir of statusDirs) {
283
+ const dirPath = path.join(baseDir, statusDir);
284
+ try {
285
+ const files = await fs.readdir(dirPath).catch(() => []);
286
+ for (const file of files) {
287
+ if (!file.endsWith('.md'))
288
+ continue;
289
+ const filePath = path.join(dirPath, file);
290
+ const task = await this.parseTaskFile(filePath, statusDir);
291
+ if (task) {
292
+ pendingTasks.push(task);
293
+ }
294
+ }
295
+ }
296
+ catch (error) {
297
+ this.logger.debug('Failed to scan tasks directory', {
298
+ dirPath,
299
+ error: error instanceof Error ? error.message : String(error),
300
+ });
301
+ }
302
+ }
303
+ // Sort: in_progress first, then high priority first
304
+ const priorityOrder = { high: 0, medium: 1, low: 2 };
305
+ const statusOrder = { in_progress: 0, open: 1 };
306
+ pendingTasks.sort((a, b) => {
307
+ const statusDiff = (statusOrder[a.status] ?? 1) - (statusOrder[b.status] ?? 1);
308
+ if (statusDiff !== 0)
309
+ return statusDiff;
310
+ return (priorityOrder[a.priority] ?? 1) - (priorityOrder[b.priority] ?? 1);
311
+ });
312
+ return pendingTasks.slice(0, MAX_PENDING_TASKS);
313
+ }
314
+ /**
315
+ * Parses a single task MD file to extract structured info.
316
+ *
317
+ * @param filePath - Absolute path to the task .md file
318
+ * @param statusDir - Directory name indicating status ('open', 'in_progress')
319
+ * @returns PendingTaskInfo or null if parsing fails
320
+ */
321
+ async parseTaskFile(filePath, statusDir) {
322
+ try {
323
+ const content = await fs.readFile(filePath, 'utf-8');
324
+ const lines = content.split('\n');
325
+ // Extract title from first heading
326
+ let title = path.basename(filePath, '.md');
327
+ for (const line of lines) {
328
+ if (line.startsWith('# ')) {
329
+ title = line.replace(/^#\s+/, '').trim();
330
+ // Strip [TASK] prefix if present
331
+ title = title.replace(/^\[TASK\]\s*/i, '');
332
+ break;
333
+ }
334
+ }
335
+ // Truncate long titles
336
+ if (title.length > 100) {
337
+ title = title.slice(0, 97) + '...';
338
+ }
339
+ // Extract assigned agent
340
+ let assignedTo = 'unassigned';
341
+ const assignedMatch = content.match(/\*\*Assigned to\*\*:\s*(.+)/i)
342
+ || content.match(/Assignee:\s*(.+)/i);
343
+ if (assignedMatch) {
344
+ assignedTo = assignedMatch[1].trim();
345
+ }
346
+ // Extract priority
347
+ let priority = 'medium';
348
+ const priorityMatch = content.match(/\*\*Priority\*\*:\s*(.+)/i)
349
+ || content.match(/Priority:\s*(.+)/i);
350
+ if (priorityMatch) {
351
+ priority = priorityMatch[1].trim().toLowerCase();
352
+ }
353
+ // Status from directory name
354
+ const status = statusDir === 'in_progress' ? 'in_progress' : 'open';
355
+ return { title, assignedTo, status, priority, filePath };
356
+ }
357
+ catch {
358
+ return null;
359
+ }
360
+ }
361
+ /**
362
+ * Generates a full session handoff summary by scanning all thread stores
363
+ * and collecting active agent status. Saves to ~/.crewly/session-summaries/latest.md.
364
+ *
365
+ * @param teamReader - Service to read team data for agent status
366
+ * @param tasksBaseDir - Override for the tasks base directory (for testing)
367
+ * @returns The generated summary data
368
+ */
369
+ async generateSummary(teamReader, tasksBaseDir) {
370
+ this.logger.info('Generating session handoff summary...');
371
+ const crewlyHome = path.join(os.homedir(), CREWLY_CONSTANTS.PATHS.CREWLY_HOME);
372
+ // Scan all thread stores and pending tasks in parallel
373
+ const [slackThreads, gchatThreads, chatUiThreads, activeAgents, pendingTasks] = await Promise.all([
374
+ this.scanThreadDirectory(path.join(crewlyHome, SLACK_THREAD_CONSTANTS.STORAGE_DIR), 'slack', 3),
375
+ this.scanThreadDirectory(path.join(crewlyHome, GCHAT_THREAD_CONSTANTS.STORAGE_DIR), 'gchat', 3),
376
+ this.scanChatUiConversations(undefined, 2),
377
+ this.collectActiveAgents(teamReader),
378
+ this.scanPendingTasks(tasksBaseDir),
379
+ ]);
380
+ const allThreads = [...slackThreads, ...gchatThreads, ...chatUiThreads]
381
+ .sort((a, b) => new Date(b.lastActiveAt).getTime() - new Date(a.lastActiveAt).getTime())
382
+ .slice(0, MAX_ACTIVE_THREADS);
383
+ const summary = {
384
+ generatedAt: new Date().toISOString(),
385
+ activeThreads: allThreads,
386
+ activeAgents,
387
+ pendingTasks,
388
+ };
389
+ // Format and save
390
+ const markdown = this.formatSummaryMarkdown(summary);
391
+ const summariesDir = this.getSummariesDir();
392
+ await fs.mkdir(summariesDir, { recursive: true });
393
+ await fs.writeFile(this.getLatestSummaryPath(), markdown, 'utf-8');
394
+ this.logger.info('Session handoff summary saved', {
395
+ threadCount: allThreads.length,
396
+ agentCount: activeAgents.length,
397
+ pendingTaskCount: pendingTasks.length,
398
+ path: this.getLatestSummaryPath(),
399
+ });
400
+ return summary;
401
+ }
402
+ /**
403
+ * Formats a HandoffSummary into a markdown string, capped at MAX_SUMMARY_LINES.
404
+ *
405
+ * @param summary - The summary data
406
+ * @returns Markdown string
407
+ */
408
+ formatSummaryMarkdown(summary) {
409
+ const lines = [];
410
+ lines.push('# Session Handoff Summary');
411
+ lines.push(`Generated: ${summary.generatedAt}`);
412
+ lines.push('');
413
+ // Active threads section
414
+ if (summary.activeThreads.length > 0) {
415
+ lines.push('## Active Conversations');
416
+ for (const thread of summary.activeThreads) {
417
+ lines.push(`### ${thread.channelType.toUpperCase()} — ${thread.channelId}`);
418
+ lines.push(`- File: \`${thread.filePath}\``);
419
+ lines.push(`- Last active: ${thread.lastActiveAt}`);
420
+ if (thread.recentMessages.length > 0) {
421
+ lines.push('- Recent:');
422
+ for (const msg of thread.recentMessages) {
423
+ lines.push(` - ${msg}`);
424
+ }
425
+ }
426
+ lines.push('');
427
+ }
428
+ }
429
+ else {
430
+ lines.push('## Active Conversations');
431
+ lines.push('No active conversations found.');
432
+ lines.push('');
433
+ }
434
+ // Active agents section
435
+ if (summary.activeAgents.length > 0) {
436
+ lines.push('## Active Agents');
437
+ for (const agent of summary.activeAgents) {
438
+ const taskInfo = agent.currentTask ? ` — task: ${agent.currentTask}` : '';
439
+ lines.push(`- **${agent.sessionName}** (${agent.role}): ${agent.workingStatus}${taskInfo}`);
440
+ }
441
+ lines.push('');
442
+ }
443
+ // Pending tasks section
444
+ if (summary.pendingTasks && summary.pendingTasks.length > 0) {
445
+ lines.push('## Pending Tasks');
446
+ lines.push(`${summary.pendingTasks.length} task(s) require attention after restart:`);
447
+ lines.push('');
448
+ for (const task of summary.pendingTasks) {
449
+ const statusLabel = task.status === 'in_progress' ? '🔄 IN PROGRESS' : '📋 OPEN';
450
+ lines.push(`- ${statusLabel} [${task.priority}] **${task.title}**`);
451
+ lines.push(` - Assigned to: ${task.assignedTo}`);
452
+ lines.push(` - File: \`${task.filePath}\``);
453
+ }
454
+ lines.push('');
455
+ }
456
+ // Truncate to max lines
457
+ return lines.slice(0, MAX_SUMMARY_LINES).join('\n');
458
+ }
459
+ /**
460
+ * Pushes the latest session summary to an agent after registration.
461
+ * Replaces the old pushRecentSlackHistory function.
462
+ *
463
+ * Reads ~/.crewly/session-summaries/latest.md and sends it as a
464
+ * [SESSION_CONTEXT] system message. Only sends if the summary exists
465
+ * and is non-empty.
466
+ *
467
+ * @param agentService - Service to send messages to agents
468
+ * @param sessionName - Target agent session name
469
+ */
470
+ async pushSessionSummary(agentService, sessionName) {
471
+ const summaryPath = this.getLatestSummaryPath();
472
+ try {
473
+ const content = await fs.readFile(summaryPath, 'utf-8');
474
+ if (!content || content.trim().length === 0) {
475
+ this.logger.debug('No session summary to push', { sessionName });
476
+ return;
477
+ }
478
+ const message = `[SESSION_CONTEXT] Previous session context for restart recovery:\n\n${content.trim()}`;
479
+ await agentService.sendMessageToAgent(sessionName, message, RUNTIME_TYPES.CLAUDE_CODE);
480
+ this.logger.info('Pushed session summary to agent', {
481
+ sessionName,
482
+ summaryLength: content.length,
483
+ });
484
+ }
485
+ catch (error) {
486
+ this.logger.warn('Failed to push session summary', {
487
+ sessionName,
488
+ error: error instanceof Error ? error.message : String(error),
489
+ });
490
+ }
491
+ }
492
+ /**
493
+ * Scans a thread directory (Slack or GChat format) for threads modified within maxAge.
494
+ * Filters by file modification time and returns ResumeThread objects.
495
+ *
496
+ * @param baseDir - Directory to scan (e.g., ~/.crewly/slack-threads/)
497
+ * @param channelType - Channel type ('slack' or 'gchat')
498
+ * @param cutoffMs - Cutoff timestamp in ms (threads older than this are excluded)
499
+ * @returns Array of ResumeThread for qualifying threads
500
+ */
501
+ async scanRecentMdThreads(baseDir, channelType, cutoffMs) {
502
+ const threads = [];
503
+ try {
504
+ const entries = await fs.readdir(baseDir).catch(() => []);
505
+ for (const entry of entries) {
506
+ if (entry.endsWith('.json'))
507
+ continue;
508
+ const channelDir = path.join(baseDir, entry);
509
+ const stat = await fs.stat(channelDir).catch(() => null);
510
+ if (!stat?.isDirectory())
511
+ continue;
512
+ const files = await fs.readdir(channelDir).catch(() => []);
513
+ for (const file of files) {
514
+ if (!file.endsWith('.md'))
515
+ continue;
516
+ const filePath = path.join(channelDir, file);
517
+ const fileStat = await fs.stat(filePath).catch(() => null);
518
+ if (!fileStat || fileStat.mtimeMs < cutoffMs)
519
+ continue;
520
+ const threadId = file.replace('.md', '');
521
+ const recentMessages = await this.extractRecentMessages(filePath);
522
+ threads.push({
523
+ channelType,
524
+ channelId: entry,
525
+ threadId,
526
+ filePath,
527
+ lastActiveAt: new Date(fileStat.mtimeMs).toISOString(),
528
+ recentMessages,
529
+ });
530
+ }
531
+ }
532
+ }
533
+ catch (error) {
534
+ this.logger.debug('Failed to scan recent threads', {
535
+ baseDir,
536
+ channelType,
537
+ error: error instanceof Error ? error.message : String(error),
538
+ });
539
+ }
540
+ return threads;
541
+ }
542
+ /**
543
+ * Scans Chat UI conversations for those modified within maxAge.
544
+ *
545
+ * @param chatDir - Chat UI directory path
546
+ * @param cutoffMs - Cutoff timestamp in ms
547
+ * @returns Array of ResumeThread for qualifying conversations
548
+ */
549
+ async scanRecentChatUiThreads(chatDir, cutoffMs) {
550
+ const threads = [];
551
+ try {
552
+ const files = await fs.readdir(chatDir).catch(() => []);
553
+ for (const file of files) {
554
+ if (!file.endsWith('.json'))
555
+ continue;
556
+ const filePath = path.join(chatDir, file);
557
+ const fileStat = await fs.stat(filePath).catch(() => null);
558
+ if (!fileStat || fileStat.mtimeMs < cutoffMs)
559
+ continue;
560
+ const conversationId = file.replace('.json', '');
561
+ const recentMessages = await this.extractChatUiMessages(filePath);
562
+ threads.push({
563
+ channelType: 'chat-ui',
564
+ channelId: conversationId,
565
+ threadId: conversationId,
566
+ filePath,
567
+ lastActiveAt: new Date(fileStat.mtimeMs).toISOString(),
568
+ recentMessages,
569
+ });
570
+ }
571
+ }
572
+ catch (error) {
573
+ this.logger.debug('Failed to scan recent Chat UI conversations', {
574
+ error: error instanceof Error ? error.message : String(error),
575
+ });
576
+ }
577
+ return threads;
578
+ }
579
+ /**
580
+ * Finds threads across all chat channels (Slack, GChat, Chat UI) that were
581
+ * active within the specified time window.
582
+ *
583
+ * @param maxAge - Maximum age in ms for a thread to qualify (default: 24h)
584
+ * @param dirOverrides - Optional directory overrides for testing
585
+ * @returns Array of ResumeThread sorted by most recent first
586
+ */
587
+ async findRecentThreads(maxAge = RESUME_MAX_AGE_MS, dirOverrides) {
588
+ const crewlyHome = path.join(os.homedir(), CREWLY_CONSTANTS.PATHS.CREWLY_HOME);
589
+ const slackDir = dirOverrides?.slackDir || path.join(crewlyHome, SLACK_THREAD_CONSTANTS.STORAGE_DIR);
590
+ const gchatDir = dirOverrides?.gchatDir || path.join(crewlyHome, GCHAT_THREAD_CONSTANTS.STORAGE_DIR);
591
+ const chatDir = dirOverrides?.chatDir || path.join(crewlyHome, 'chat');
592
+ const cutoff = Date.now() - maxAge;
593
+ const [slackThreads, gchatThreads, chatUiThreads] = await Promise.all([
594
+ this.scanRecentMdThreads(slackDir, 'slack', cutoff),
595
+ this.scanRecentMdThreads(gchatDir, 'gchat', cutoff),
596
+ this.scanRecentChatUiThreads(chatDir, cutoff),
597
+ ]);
598
+ const all = [...slackThreads, ...gchatThreads, ...chatUiThreads];
599
+ return all.sort((a, b) => new Date(b.lastActiveAt).getTime() - new Date(a.lastActiveAt).getTime());
600
+ }
601
+ /**
602
+ * @deprecated Use findRecentThreads() instead. Kept for backward compatibility.
603
+ * Finds Slack threads that were active within the last 24 hours.
604
+ *
605
+ * @param maxAge - Maximum age in ms for a thread to qualify (default: 24h)
606
+ * @param slackDirOverride - Optional directory override (for testing)
607
+ * @returns Array of ResumeThread sorted by most recent first (Slack only)
608
+ */
609
+ async findRecentSlackThreads(maxAge = RESUME_MAX_AGE_MS, slackDirOverride) {
610
+ return this.findRecentThreads(maxAge, {
611
+ slackDir: slackDirOverride,
612
+ gchatDir: '/nonexistent',
613
+ chatDir: '/nonexistent',
614
+ });
615
+ }
616
+ /**
617
+ * Pushes a [CHAT_RESUME] notification to the orchestrator after registration,
618
+ * containing info about recently active threads across all channels (Slack,
619
+ * GChat, Chat UI) so it can proactively send a greeting message.
620
+ *
621
+ * @param agentService - Service to send messages to agents
622
+ * @param sessionName - Target agent session name (typically the orchestrator)
623
+ */
624
+ async pushResumeNotification(agentService, sessionName) {
625
+ try {
626
+ const threads = await this.findRecentThreads();
627
+ if (threads.length === 0) {
628
+ this.logger.debug('No recent threads for resume notification', { sessionName });
629
+ return;
630
+ }
631
+ const lines = [
632
+ '[CHAT_RESUME] You just restarted. The following chat threads were active in the last 24 hours.',
633
+ 'You MUST read the most recent thread and send a greeting message to prove you have recovered context.',
634
+ '',
635
+ ];
636
+ for (const thread of threads) {
637
+ const label = thread.channelType.toUpperCase();
638
+ lines.push(`## ${label} Thread: ${thread.channelId} / ${thread.threadId}`);
639
+ lines.push(`- Source: ${thread.channelType}`);
640
+ lines.push(`- File: \`${thread.filePath}\``);
641
+ lines.push(`- Channel: ${thread.channelId}`);
642
+ lines.push(`- Thread ID: ${thread.threadId}`);
643
+ lines.push(`- Last active: ${thread.lastActiveAt}`);
644
+ if (thread.recentMessages.length > 0) {
645
+ lines.push('- Recent messages:');
646
+ for (const msg of thread.recentMessages) {
647
+ lines.push(` - ${msg}`);
648
+ }
649
+ }
650
+ lines.push('');
651
+ }
652
+ const message = lines.join('\n');
653
+ await agentService.sendMessageToAgent(sessionName, message, RUNTIME_TYPES.CLAUDE_CODE);
654
+ this.logger.info('Pushed resume notification', {
655
+ sessionName,
656
+ threadCount: threads.length,
657
+ channels: [...new Set(threads.map(t => t.channelType))],
658
+ });
659
+ }
660
+ catch (error) {
661
+ this.logger.warn('Failed to push resume notification', {
662
+ sessionName,
663
+ error: error instanceof Error ? error.message : String(error),
664
+ });
665
+ }
666
+ }
667
+ /**
668
+ * @deprecated Use pushResumeNotification() instead.
669
+ */
670
+ async pushSlackResumeNotification(agentService, sessionName) {
671
+ return this.pushResumeNotification(agentService, sessionName);
672
+ }
673
+ }
674
+ //# sourceMappingURL=session-handoff.service.js.map