crewly 1.6.1 → 1.6.3

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 (367) hide show
  1. package/config/roles/orchestrator/prompt.md +16 -0
  2. package/config/skills/agent/core/get-my-active-work/SKILL.md +101 -0
  3. package/config/skills/agent/core/get-my-active-work/execute.sh +122 -0
  4. package/config/skills/agent/core/record-learning/SKILL.md +29 -0
  5. package/config/skills/agent/core/reply-channel/SKILL.md +41 -0
  6. package/config/skills/agent/core/reply-channel/execute.sh +165 -0
  7. package/config/skills/agent/core/reply-channel/execute.test.sh +148 -0
  8. package/config/skills/agent/remote-browser/execute.sh +296 -14
  9. package/config/skills/agent/remote-browser/execute.test.sh +482 -0
  10. package/config/skills/orchestrator/send-message/SKILL.md +30 -7
  11. package/config/skills/orchestrator/team-health-scan/SKILL.md +98 -0
  12. package/config/skills/orchestrator/team-health-scan/execute.sh +44 -0
  13. package/config/skills/registry.json +62 -1
  14. package/config/slack-app-manifest.json +2 -1
  15. package/config/sops/developer/git-workflow.md +38 -3
  16. package/dist/backend/backend/src/constants.d.ts +69 -1
  17. package/dist/backend/backend/src/constants.d.ts.map +1 -1
  18. package/dist/backend/backend/src/constants.js +69 -2
  19. package/dist/backend/backend/src/constants.js.map +1 -1
  20. package/dist/backend/backend/src/controllers/active-work/active-work.controller.d.ts +53 -0
  21. package/dist/backend/backend/src/controllers/active-work/active-work.controller.d.ts.map +1 -0
  22. package/dist/backend/backend/src/controllers/active-work/active-work.controller.js +92 -0
  23. package/dist/backend/backend/src/controllers/active-work/active-work.controller.js.map +1 -0
  24. package/dist/backend/backend/src/controllers/agent-stream/agent-stream.controller.d.ts.map +1 -1
  25. package/dist/backend/backend/src/controllers/agent-stream/agent-stream.controller.js +18 -1
  26. package/dist/backend/backend/src/controllers/agent-stream/agent-stream.controller.js.map +1 -1
  27. package/dist/backend/backend/src/controllers/browser/browser.controller.d.ts +68 -0
  28. package/dist/backend/backend/src/controllers/browser/browser.controller.d.ts.map +1 -1
  29. package/dist/backend/backend/src/controllers/browser/browser.controller.js +233 -5
  30. package/dist/backend/backend/src/controllers/browser/browser.controller.js.map +1 -1
  31. package/dist/backend/backend/src/controllers/browser/browser.routes.d.ts.map +1 -1
  32. package/dist/backend/backend/src/controllers/browser/browser.routes.js +10 -1
  33. package/dist/backend/backend/src/controllers/browser/browser.routes.js.map +1 -1
  34. package/dist/backend/backend/src/controllers/chat/chat.controller.d.ts.map +1 -1
  35. package/dist/backend/backend/src/controllers/chat/chat.controller.js +8 -3
  36. package/dist/backend/backend/src/controllers/chat/chat.controller.js.map +1 -1
  37. package/dist/backend/backend/src/controllers/chat-v2/chat-v2.controller.d.ts +132 -0
  38. package/dist/backend/backend/src/controllers/chat-v2/chat-v2.controller.d.ts.map +1 -0
  39. package/dist/backend/backend/src/controllers/chat-v2/chat-v2.controller.js +401 -0
  40. package/dist/backend/backend/src/controllers/chat-v2/chat-v2.controller.js.map +1 -0
  41. package/dist/backend/backend/src/controllers/chat-v2/chat-v2.routes.d.ts +29 -0
  42. package/dist/backend/backend/src/controllers/chat-v2/chat-v2.routes.d.ts.map +1 -0
  43. package/dist/backend/backend/src/controllers/chat-v2/chat-v2.routes.js +39 -0
  44. package/dist/backend/backend/src/controllers/chat-v2/chat-v2.routes.js.map +1 -0
  45. package/dist/backend/backend/src/controllers/chat-v2/index.d.ts +8 -0
  46. package/dist/backend/backend/src/controllers/chat-v2/index.d.ts.map +1 -0
  47. package/dist/backend/backend/src/controllers/chat-v2/index.js +8 -0
  48. package/dist/backend/backend/src/controllers/chat-v2/index.js.map +1 -0
  49. package/dist/backend/backend/src/controllers/onboarding/onboarding.routes.d.ts +13 -13
  50. package/dist/backend/backend/src/controllers/onboarding/onboarding.routes.d.ts.map +1 -1
  51. package/dist/backend/backend/src/controllers/onboarding/onboarding.routes.js +74 -234
  52. package/dist/backend/backend/src/controllers/onboarding/onboarding.routes.js.map +1 -1
  53. package/dist/backend/backend/src/controllers/orchestrator/orchestrator.controller.d.ts.map +1 -1
  54. package/dist/backend/backend/src/controllers/orchestrator/orchestrator.controller.js +76 -15
  55. package/dist/backend/backend/src/controllers/orchestrator/orchestrator.controller.js.map +1 -1
  56. package/dist/backend/backend/src/controllers/request/request.controller.d.ts.map +1 -1
  57. package/dist/backend/backend/src/controllers/request/request.controller.js +4 -6
  58. package/dist/backend/backend/src/controllers/request/request.controller.js.map +1 -1
  59. package/dist/backend/backend/src/controllers/task-management/tasks.controller.d.ts +43 -0
  60. package/dist/backend/backend/src/controllers/task-management/tasks.controller.d.ts.map +1 -1
  61. package/dist/backend/backend/src/controllers/task-management/tasks.controller.js +200 -72
  62. package/dist/backend/backend/src/controllers/task-management/tasks.controller.js.map +1 -1
  63. package/dist/backend/backend/src/controllers/team/team.controller.d.ts.map +1 -1
  64. package/dist/backend/backend/src/controllers/team/team.controller.js +49 -0
  65. package/dist/backend/backend/src/controllers/team/team.controller.js.map +1 -1
  66. package/dist/backend/backend/src/controllers/team-health/team-health.controller.d.ts +59 -0
  67. package/dist/backend/backend/src/controllers/team-health/team-health.controller.d.ts.map +1 -0
  68. package/dist/backend/backend/src/controllers/team-health/team-health.controller.js +127 -0
  69. package/dist/backend/backend/src/controllers/team-health/team-health.controller.js.map +1 -0
  70. package/dist/backend/backend/src/controllers/team-health/team-health.routes.d.ts +13 -0
  71. package/dist/backend/backend/src/controllers/team-health/team-health.routes.d.ts.map +1 -0
  72. package/dist/backend/backend/src/controllers/team-health/team-health.routes.js +20 -0
  73. package/dist/backend/backend/src/controllers/team-health/team-health.routes.js.map +1 -0
  74. package/dist/backend/backend/src/index.d.ts +9 -0
  75. package/dist/backend/backend/src/index.d.ts.map +1 -1
  76. package/dist/backend/backend/src/index.js +233 -0
  77. package/dist/backend/backend/src/index.js.map +1 -1
  78. package/dist/backend/backend/src/routes/api.routes.d.ts.map +1 -1
  79. package/dist/backend/backend/src/routes/api.routes.js +40 -6
  80. package/dist/backend/backend/src/routes/api.routes.js.map +1 -1
  81. package/dist/backend/backend/src/services/agent/active-work-briefing.service.d.ts +498 -0
  82. package/dist/backend/backend/src/services/agent/active-work-briefing.service.d.ts.map +1 -0
  83. package/dist/backend/backend/src/services/agent/active-work-briefing.service.js +759 -0
  84. package/dist/backend/backend/src/services/agent/active-work-briefing.service.js.map +1 -0
  85. package/dist/backend/backend/src/services/agent/agent-registration.service.d.ts +25 -0
  86. package/dist/backend/backend/src/services/agent/agent-registration.service.d.ts.map +1 -1
  87. package/dist/backend/backend/src/services/agent/agent-registration.service.js +221 -58
  88. package/dist/backend/backend/src/services/agent/agent-registration.service.js.map +1 -1
  89. package/dist/backend/backend/src/services/agent/crewly-agent/model-manager.d.ts +9 -2
  90. package/dist/backend/backend/src/services/agent/crewly-agent/model-manager.d.ts.map +1 -1
  91. package/dist/backend/backend/src/services/agent/crewly-agent/model-manager.js +35 -2
  92. package/dist/backend/backend/src/services/agent/crewly-agent/model-manager.js.map +1 -1
  93. package/dist/backend/backend/src/services/agent/crewly-agent/types.d.ts +8 -2
  94. package/dist/backend/backend/src/services/agent/crewly-agent/types.d.ts.map +1 -1
  95. package/dist/backend/backend/src/services/agent/crewly-agent/types.js +1 -0
  96. package/dist/backend/backend/src/services/agent/crewly-agent/types.js.map +1 -1
  97. package/dist/backend/backend/src/services/agent/tmux-command.service.d.ts.map +1 -1
  98. package/dist/backend/backend/src/services/agent/tmux-command.service.js +2 -1
  99. package/dist/backend/backend/src/services/agent/tmux-command.service.js.map +1 -1
  100. package/dist/backend/backend/src/services/agent/tmux.service.d.ts.map +1 -1
  101. package/dist/backend/backend/src/services/agent/tmux.service.js +2 -1
  102. package/dist/backend/backend/src/services/agent/tmux.service.js.map +1 -1
  103. package/dist/backend/backend/src/services/ai/prompt-builder.service.d.ts +148 -3
  104. package/dist/backend/backend/src/services/ai/prompt-builder.service.d.ts.map +1 -1
  105. package/dist/backend/backend/src/services/ai/prompt-builder.service.js +241 -2
  106. package/dist/backend/backend/src/services/ai/prompt-builder.service.js.map +1 -1
  107. package/dist/backend/backend/src/services/ai/prompt-modules/recovery.module.d.ts.map +1 -1
  108. package/dist/backend/backend/src/services/ai/prompt-modules/recovery.module.js +13 -0
  109. package/dist/backend/backend/src/services/ai/prompt-modules/recovery.module.js.map +1 -1
  110. package/dist/backend/backend/src/services/ai/prompt-modules/role-boundary.module.d.ts.map +1 -1
  111. package/dist/backend/backend/src/services/ai/prompt-modules/role-boundary.module.js +26 -1
  112. package/dist/backend/backend/src/services/ai/prompt-modules/role-boundary.module.js.map +1 -1
  113. package/dist/backend/backend/src/services/ai/prompt-modules/sop-norm-distinction.module.d.ts +79 -0
  114. package/dist/backend/backend/src/services/ai/prompt-modules/sop-norm-distinction.module.d.ts.map +1 -0
  115. package/dist/backend/backend/src/services/ai/prompt-modules/sop-norm-distinction.module.js +118 -0
  116. package/dist/backend/backend/src/services/ai/prompt-modules/sop-norm-distinction.module.js.map +1 -0
  117. package/dist/backend/backend/src/services/browser/browser-bridge.service.d.ts +161 -0
  118. package/dist/backend/backend/src/services/browser/browser-bridge.service.d.ts.map +1 -1
  119. package/dist/backend/backend/src/services/browser/browser-bridge.service.js +382 -2
  120. package/dist/backend/backend/src/services/browser/browser-bridge.service.js.map +1 -1
  121. package/dist/backend/backend/src/services/browser/browser-proxy.service.d.ts +105 -0
  122. package/dist/backend/backend/src/services/browser/browser-proxy.service.d.ts.map +1 -1
  123. package/dist/backend/backend/src/services/browser/browser-proxy.service.js +232 -13
  124. package/dist/backend/backend/src/services/browser/browser-proxy.service.js.map +1 -1
  125. package/dist/backend/backend/src/services/chat-v2/chat-v2.dispatcher.service.d.ts +178 -0
  126. package/dist/backend/backend/src/services/chat-v2/chat-v2.dispatcher.service.d.ts.map +1 -0
  127. package/dist/backend/backend/src/services/chat-v2/chat-v2.dispatcher.service.js +254 -0
  128. package/dist/backend/backend/src/services/chat-v2/chat-v2.dispatcher.service.js.map +1 -0
  129. package/dist/backend/backend/src/services/chat-v2/chat-v2.mention-resolver.d.ts +134 -0
  130. package/dist/backend/backend/src/services/chat-v2/chat-v2.mention-resolver.d.ts.map +1 -0
  131. package/dist/backend/backend/src/services/chat-v2/chat-v2.mention-resolver.js +232 -0
  132. package/dist/backend/backend/src/services/chat-v2/chat-v2.mention-resolver.js.map +1 -0
  133. package/dist/backend/backend/src/services/chat-v2/chat-v2.realtime-holder.d.ts +25 -0
  134. package/dist/backend/backend/src/services/chat-v2/chat-v2.realtime-holder.d.ts.map +1 -0
  135. package/dist/backend/backend/src/services/chat-v2/chat-v2.realtime-holder.js +23 -0
  136. package/dist/backend/backend/src/services/chat-v2/chat-v2.realtime-holder.js.map +1 -0
  137. package/dist/backend/backend/src/services/chat-v2/chat-v2.service.d.ts +254 -0
  138. package/dist/backend/backend/src/services/chat-v2/chat-v2.service.d.ts.map +1 -0
  139. package/dist/backend/backend/src/services/chat-v2/chat-v2.service.js +467 -0
  140. package/dist/backend/backend/src/services/chat-v2/chat-v2.service.js.map +1 -0
  141. package/dist/backend/backend/src/services/chat-v2/chat-v2.singleton.d.ts +27 -0
  142. package/dist/backend/backend/src/services/chat-v2/chat-v2.singleton.d.ts.map +1 -0
  143. package/dist/backend/backend/src/services/chat-v2/chat-v2.singleton.js +57 -0
  144. package/dist/backend/backend/src/services/chat-v2/chat-v2.singleton.js.map +1 -0
  145. package/dist/backend/backend/src/services/chat-v2/chat-v2.team-membership.d.ts +43 -0
  146. package/dist/backend/backend/src/services/chat-v2/chat-v2.team-membership.d.ts.map +1 -0
  147. package/dist/backend/backend/src/services/chat-v2/chat-v2.team-membership.js +54 -0
  148. package/dist/backend/backend/src/services/chat-v2/chat-v2.team-membership.js.map +1 -0
  149. package/dist/backend/backend/src/services/chat-v2/config.d.ts +100 -0
  150. package/dist/backend/backend/src/services/chat-v2/config.d.ts.map +1 -0
  151. package/dist/backend/backend/src/services/chat-v2/config.js +174 -0
  152. package/dist/backend/backend/src/services/chat-v2/config.js.map +1 -0
  153. package/dist/backend/backend/src/services/chat-v2/index.d.ts +11 -0
  154. package/dist/backend/backend/src/services/chat-v2/index.d.ts.map +1 -0
  155. package/dist/backend/backend/src/services/chat-v2/index.js +12 -0
  156. package/dist/backend/backend/src/services/chat-v2/index.js.map +1 -0
  157. package/dist/backend/backend/src/services/chat-v2/sqlite/channel.store.d.ts +114 -0
  158. package/dist/backend/backend/src/services/chat-v2/sqlite/channel.store.d.ts.map +1 -0
  159. package/dist/backend/backend/src/services/chat-v2/sqlite/channel.store.js +194 -0
  160. package/dist/backend/backend/src/services/chat-v2/sqlite/channel.store.js.map +1 -0
  161. package/dist/backend/backend/src/services/chat-v2/sqlite/chat-db.d.ts +100 -0
  162. package/dist/backend/backend/src/services/chat-v2/sqlite/chat-db.d.ts.map +1 -0
  163. package/dist/backend/backend/src/services/chat-v2/sqlite/chat-db.js +351 -0
  164. package/dist/backend/backend/src/services/chat-v2/sqlite/chat-db.js.map +1 -0
  165. package/dist/backend/backend/src/services/chat-v2/sqlite/message.store.d.ts +132 -0
  166. package/dist/backend/backend/src/services/chat-v2/sqlite/message.store.d.ts.map +1 -0
  167. package/dist/backend/backend/src/services/chat-v2/sqlite/message.store.js +281 -0
  168. package/dist/backend/backend/src/services/chat-v2/sqlite/message.store.js.map +1 -0
  169. package/dist/backend/backend/src/services/chat-v2/types.d.ts +295 -0
  170. package/dist/backend/backend/src/services/chat-v2/types.d.ts.map +1 -0
  171. package/dist/backend/backend/src/services/chat-v2/types.js +61 -0
  172. package/dist/backend/backend/src/services/chat-v2/types.js.map +1 -0
  173. package/dist/backend/backend/src/services/cloud/cloud-event-bridge.service.d.ts +113 -0
  174. package/dist/backend/backend/src/services/cloud/cloud-event-bridge.service.d.ts.map +1 -0
  175. package/dist/backend/backend/src/services/cloud/cloud-event-bridge.service.js +179 -0
  176. package/dist/backend/backend/src/services/cloud/cloud-event-bridge.service.js.map +1 -0
  177. package/dist/backend/backend/src/services/cloud/cloud-event-forwarder.service.d.ts +131 -0
  178. package/dist/backend/backend/src/services/cloud/cloud-event-forwarder.service.d.ts.map +1 -0
  179. package/dist/backend/backend/src/services/cloud/cloud-event-forwarder.service.js +227 -0
  180. package/dist/backend/backend/src/services/cloud/cloud-event-forwarder.service.js.map +1 -0
  181. package/dist/backend/backend/src/services/core/config.service.js +3 -3
  182. package/dist/backend/backend/src/services/core/config.service.js.map +1 -1
  183. package/dist/backend/backend/src/services/core/storage.service.d.ts +22 -0
  184. package/dist/backend/backend/src/services/core/storage.service.d.ts.map +1 -1
  185. package/dist/backend/backend/src/services/core/storage.service.js +57 -0
  186. package/dist/backend/backend/src/services/core/storage.service.js.map +1 -1
  187. package/dist/backend/backend/src/services/event-bus/event-bus.service.d.ts +69 -1
  188. package/dist/backend/backend/src/services/event-bus/event-bus.service.d.ts.map +1 -1
  189. package/dist/backend/backend/src/services/event-bus/event-bus.service.js +118 -0
  190. package/dist/backend/backend/src/services/event-bus/event-bus.service.js.map +1 -1
  191. package/dist/backend/backend/src/services/event-bus/event-to-workitem-bridge.service.d.ts +275 -0
  192. package/dist/backend/backend/src/services/event-bus/event-to-workitem-bridge.service.d.ts.map +1 -0
  193. package/dist/backend/backend/src/services/event-bus/event-to-workitem-bridge.service.js +736 -0
  194. package/dist/backend/backend/src/services/event-bus/event-to-workitem-bridge.service.js.map +1 -0
  195. package/dist/backend/backend/src/services/knowledge/fts5-index.service.d.ts.map +1 -1
  196. package/dist/backend/backend/src/services/knowledge/fts5-index.service.js +18 -2
  197. package/dist/backend/backend/src/services/knowledge/fts5-index.service.js.map +1 -1
  198. package/dist/backend/backend/src/services/knowledge/knowledge-search.service.d.ts +49 -13
  199. package/dist/backend/backend/src/services/knowledge/knowledge-search.service.d.ts.map +1 -1
  200. package/dist/backend/backend/src/services/knowledge/knowledge-search.service.js +123 -29
  201. package/dist/backend/backend/src/services/knowledge/knowledge-search.service.js.map +1 -1
  202. package/dist/backend/backend/src/services/knowledge/learnings-index.service.d.ts +159 -0
  203. package/dist/backend/backend/src/services/knowledge/learnings-index.service.d.ts.map +1 -0
  204. package/dist/backend/backend/src/services/knowledge/learnings-index.service.js +304 -0
  205. package/dist/backend/backend/src/services/knowledge/learnings-index.service.js.map +1 -0
  206. package/dist/backend/backend/src/services/knowledge/vector-store.service.d.ts.map +1 -1
  207. package/dist/backend/backend/src/services/knowledge/vector-store.service.js +24 -4
  208. package/dist/backend/backend/src/services/knowledge/vector-store.service.js.map +1 -1
  209. package/dist/backend/backend/src/services/memory/auto-learning.subscriber.d.ts +174 -0
  210. package/dist/backend/backend/src/services/memory/auto-learning.subscriber.d.ts.map +1 -0
  211. package/dist/backend/backend/src/services/memory/auto-learning.subscriber.js +375 -0
  212. package/dist/backend/backend/src/services/memory/auto-learning.subscriber.js.map +1 -0
  213. package/dist/backend/backend/src/services/memory/learning-format.validator.d.ts +97 -0
  214. package/dist/backend/backend/src/services/memory/learning-format.validator.d.ts.map +1 -0
  215. package/dist/backend/backend/src/services/memory/learning-format.validator.js +209 -0
  216. package/dist/backend/backend/src/services/memory/learning-format.validator.js.map +1 -0
  217. package/dist/backend/backend/src/services/memory/vector-store.service.d.ts.map +1 -1
  218. package/dist/backend/backend/src/services/memory/vector-store.service.js +19 -4
  219. package/dist/backend/backend/src/services/memory/vector-store.service.js.map +1 -1
  220. package/dist/backend/backend/src/services/onboarding/onboarding-provision.service.d.ts +16 -5
  221. package/dist/backend/backend/src/services/onboarding/onboarding-provision.service.d.ts.map +1 -1
  222. package/dist/backend/backend/src/services/onboarding/onboarding-provision.service.js +32 -5
  223. package/dist/backend/backend/src/services/onboarding/onboarding-provision.service.js.map +1 -1
  224. package/dist/backend/backend/src/services/onboarding/onboarding.service.d.ts +157 -0
  225. package/dist/backend/backend/src/services/onboarding/onboarding.service.d.ts.map +1 -0
  226. package/dist/backend/backend/src/services/onboarding/onboarding.service.js +229 -0
  227. package/dist/backend/backend/src/services/onboarding/onboarding.service.js.map +1 -0
  228. package/dist/backend/backend/src/services/onboarding/onboarding.types.d.ts +141 -0
  229. package/dist/backend/backend/src/services/onboarding/onboarding.types.d.ts.map +1 -0
  230. package/dist/backend/backend/src/services/onboarding/onboarding.types.js +18 -0
  231. package/dist/backend/backend/src/services/onboarding/onboarding.types.js.map +1 -0
  232. package/dist/backend/backend/src/services/pr-review/pr-review.service.d.ts.map +1 -1
  233. package/dist/backend/backend/src/services/pr-review/pr-review.service.js +1 -1
  234. package/dist/backend/backend/src/services/pr-review/pr-review.service.js.map +1 -1
  235. package/dist/backend/backend/src/services/slack/cross-machine-message.service.d.ts.map +1 -1
  236. package/dist/backend/backend/src/services/slack/cross-machine-message.service.js +17 -1
  237. package/dist/backend/backend/src/services/slack/cross-machine-message.service.js.map +1 -1
  238. package/dist/backend/backend/src/services/slack/slack-orchestrator-bridge.d.ts +39 -1
  239. package/dist/backend/backend/src/services/slack/slack-orchestrator-bridge.d.ts.map +1 -1
  240. package/dist/backend/backend/src/services/slack/slack-orchestrator-bridge.js +158 -26
  241. package/dist/backend/backend/src/services/slack/slack-orchestrator-bridge.js.map +1 -1
  242. package/dist/backend/backend/src/services/task-pool/task-pool.service.d.ts +248 -6
  243. package/dist/backend/backend/src/services/task-pool/task-pool.service.d.ts.map +1 -1
  244. package/dist/backend/backend/src/services/task-pool/task-pool.service.js +531 -51
  245. package/dist/backend/backend/src/services/task-pool/task-pool.service.js.map +1 -1
  246. package/dist/backend/backend/src/services/team-health/index.d.ts +16 -0
  247. package/dist/backend/backend/src/services/team-health/index.d.ts.map +1 -0
  248. package/dist/backend/backend/src/services/team-health/index.js +16 -0
  249. package/dist/backend/backend/src/services/team-health/index.js.map +1 -0
  250. package/dist/backend/backend/src/services/team-health/live-team-health-data-provider.d.ts +52 -0
  251. package/dist/backend/backend/src/services/team-health/live-team-health-data-provider.d.ts.map +1 -0
  252. package/dist/backend/backend/src/services/team-health/live-team-health-data-provider.js +161 -0
  253. package/dist/backend/backend/src/services/team-health/live-team-health-data-provider.js.map +1 -0
  254. package/dist/backend/backend/src/services/team-health/lost-dispatch-detector.d.ts +53 -0
  255. package/dist/backend/backend/src/services/team-health/lost-dispatch-detector.d.ts.map +1 -0
  256. package/dist/backend/backend/src/services/team-health/lost-dispatch-detector.js +88 -0
  257. package/dist/backend/backend/src/services/team-health/lost-dispatch-detector.js.map +1 -0
  258. package/dist/backend/backend/src/services/team-health/stale-trigger-detector.d.ts +44 -0
  259. package/dist/backend/backend/src/services/team-health/stale-trigger-detector.d.ts.map +1 -0
  260. package/dist/backend/backend/src/services/team-health/stale-trigger-detector.js +83 -0
  261. package/dist/backend/backend/src/services/team-health/stale-trigger-detector.js.map +1 -0
  262. package/dist/backend/backend/src/services/team-health/team-health-alert-router.d.ts +92 -0
  263. package/dist/backend/backend/src/services/team-health/team-health-alert-router.d.ts.map +1 -0
  264. package/dist/backend/backend/src/services/team-health/team-health-alert-router.js +328 -0
  265. package/dist/backend/backend/src/services/team-health/team-health-alert-router.js.map +1 -0
  266. package/dist/backend/backend/src/services/team-health/team-health-config.d.ts +41 -0
  267. package/dist/backend/backend/src/services/team-health/team-health-config.d.ts.map +1 -0
  268. package/dist/backend/backend/src/services/team-health/team-health-config.js +213 -0
  269. package/dist/backend/backend/src/services/team-health/team-health-config.js.map +1 -0
  270. package/dist/backend/backend/src/services/team-health/team-health-detector.d.ts +46 -0
  271. package/dist/backend/backend/src/services/team-health/team-health-detector.d.ts.map +1 -0
  272. package/dist/backend/backend/src/services/team-health/team-health-detector.js +347 -0
  273. package/dist/backend/backend/src/services/team-health/team-health-detector.js.map +1 -0
  274. package/dist/backend/backend/src/services/team-health/team-health-types.d.ts +154 -0
  275. package/dist/backend/backend/src/services/team-health/team-health-types.d.ts.map +1 -0
  276. package/dist/backend/backend/src/services/team-health/team-health-types.js +94 -0
  277. package/dist/backend/backend/src/services/team-health/team-health-types.js.map +1 -0
  278. package/dist/backend/backend/src/services/team-health/team-health-watchdog.service.d.ts +111 -0
  279. package/dist/backend/backend/src/services/team-health/team-health-watchdog.service.d.ts.map +1 -0
  280. package/dist/backend/backend/src/services/team-health/team-health-watchdog.service.js +226 -0
  281. package/dist/backend/backend/src/services/team-health/team-health-watchdog.service.js.map +1 -0
  282. package/dist/backend/backend/src/services/v3/mission-reminder.service.d.ts +148 -0
  283. package/dist/backend/backend/src/services/v3/mission-reminder.service.d.ts.map +1 -0
  284. package/dist/backend/backend/src/services/v3/mission-reminder.service.js +545 -0
  285. package/dist/backend/backend/src/services/v3/mission-reminder.service.js.map +1 -0
  286. package/dist/backend/backend/src/services/v3/request-sla.subscriber.d.ts +499 -0
  287. package/dist/backend/backend/src/services/v3/request-sla.subscriber.d.ts.map +1 -0
  288. package/dist/backend/backend/src/services/v3/request-sla.subscriber.js +1105 -0
  289. package/dist/backend/backend/src/services/v3/request-sla.subscriber.js.map +1 -0
  290. package/dist/backend/backend/src/services/v3/request.service.d.ts +22 -0
  291. package/dist/backend/backend/src/services/v3/request.service.d.ts.map +1 -1
  292. package/dist/backend/backend/src/services/v3/request.service.js +71 -0
  293. package/dist/backend/backend/src/services/v3/request.service.js.map +1 -1
  294. package/dist/backend/backend/src/services/v3/v3-data.service.d.ts +1 -0
  295. package/dist/backend/backend/src/services/v3/v3-data.service.d.ts.map +1 -1
  296. package/dist/backend/backend/src/services/v3/v3-data.service.js +22 -6
  297. package/dist/backend/backend/src/services/v3/v3-data.service.js.map +1 -1
  298. package/dist/backend/backend/src/types/event-bus.types.d.ts +19 -1
  299. package/dist/backend/backend/src/types/event-bus.types.d.ts.map +1 -1
  300. package/dist/backend/backend/src/types/event-bus.types.js +43 -0
  301. package/dist/backend/backend/src/types/event-bus.types.js.map +1 -1
  302. package/dist/backend/backend/src/types/index.d.ts +22 -1
  303. package/dist/backend/backend/src/types/index.d.ts.map +1 -1
  304. package/dist/backend/backend/src/types/index.js.map +1 -1
  305. package/dist/backend/backend/src/types/review-reason.types.d.ts +63 -0
  306. package/dist/backend/backend/src/types/review-reason.types.d.ts.map +1 -0
  307. package/dist/backend/backend/src/types/review-reason.types.js +50 -0
  308. package/dist/backend/backend/src/types/review-reason.types.js.map +1 -0
  309. package/dist/backend/backend/src/types/slack.types.d.ts +4 -1
  310. package/dist/backend/backend/src/types/slack.types.d.ts.map +1 -1
  311. package/dist/backend/backend/src/types/slack.types.js.map +1 -1
  312. package/dist/backend/backend/src/types/v2/mission.types.d.ts +18 -0
  313. package/dist/backend/backend/src/types/v2/mission.types.d.ts.map +1 -1
  314. package/dist/backend/backend/src/types/v2/mission.types.js +1 -0
  315. package/dist/backend/backend/src/types/v2/mission.types.js.map +1 -1
  316. package/dist/backend/backend/src/types/v2/work-item.types.d.ts.map +1 -1
  317. package/dist/backend/backend/src/types/v2/work-item.types.js +25 -1
  318. package/dist/backend/backend/src/types/v2/work-item.types.js.map +1 -1
  319. package/dist/backend/backend/src/utils/team.utils.d.ts +38 -0
  320. package/dist/backend/backend/src/utils/team.utils.d.ts.map +1 -0
  321. package/dist/backend/backend/src/utils/team.utils.js +45 -0
  322. package/dist/backend/backend/src/utils/team.utils.js.map +1 -0
  323. package/dist/backend/backend/src/websocket/chat-v2.gateway.d.ts +195 -0
  324. package/dist/backend/backend/src/websocket/chat-v2.gateway.d.ts.map +1 -0
  325. package/dist/backend/backend/src/websocket/chat-v2.gateway.js +401 -0
  326. package/dist/backend/backend/src/websocket/chat-v2.gateway.js.map +1 -0
  327. package/dist/backend/backend/src/websocket/terminal.gateway.d.ts +37 -2
  328. package/dist/backend/backend/src/websocket/terminal.gateway.d.ts.map +1 -1
  329. package/dist/backend/backend/src/websocket/terminal.gateway.js +106 -5
  330. package/dist/backend/backend/src/websocket/terminal.gateway.js.map +1 -1
  331. package/dist/cli/backend/src/constants.d.ts +69 -1
  332. package/dist/cli/backend/src/constants.d.ts.map +1 -1
  333. package/dist/cli/backend/src/constants.js +69 -2
  334. package/dist/cli/backend/src/constants.js.map +1 -1
  335. package/dist/cli/backend/src/services/core/config.service.js +3 -3
  336. package/dist/cli/backend/src/services/core/config.service.js.map +1 -1
  337. package/dist/cli/backend/src/services/core/storage.service.d.ts +22 -0
  338. package/dist/cli/backend/src/services/core/storage.service.d.ts.map +1 -1
  339. package/dist/cli/backend/src/services/core/storage.service.js +57 -0
  340. package/dist/cli/backend/src/services/core/storage.service.js.map +1 -1
  341. package/dist/cli/backend/src/services/knowledge/fts5-index.service.d.ts.map +1 -1
  342. package/dist/cli/backend/src/services/knowledge/fts5-index.service.js +18 -2
  343. package/dist/cli/backend/src/services/knowledge/fts5-index.service.js.map +1 -1
  344. package/dist/cli/backend/src/services/knowledge/knowledge-search.service.d.ts +49 -13
  345. package/dist/cli/backend/src/services/knowledge/knowledge-search.service.d.ts.map +1 -1
  346. package/dist/cli/backend/src/services/knowledge/knowledge-search.service.js +123 -29
  347. package/dist/cli/backend/src/services/knowledge/knowledge-search.service.js.map +1 -1
  348. package/dist/cli/backend/src/services/knowledge/vector-store.service.d.ts.map +1 -1
  349. package/dist/cli/backend/src/services/knowledge/vector-store.service.js +24 -4
  350. package/dist/cli/backend/src/services/knowledge/vector-store.service.js.map +1 -1
  351. package/dist/cli/backend/src/types/index.d.ts +22 -1
  352. package/dist/cli/backend/src/types/index.d.ts.map +1 -1
  353. package/dist/cli/backend/src/types/index.js.map +1 -1
  354. package/dist/cli/backend/src/types/v2/work-item.types.d.ts.map +1 -1
  355. package/dist/cli/backend/src/types/v2/work-item.types.js +25 -1
  356. package/dist/cli/backend/src/types/v2/work-item.types.js.map +1 -1
  357. package/frontend/dist/assets/{index-70356616.js → index-7a4e7df5.js} +328 -326
  358. package/frontend/dist/assets/index-b7e59b2b.css +33 -0
  359. package/frontend/dist/index.html +2 -2
  360. package/package.json +2 -1
  361. package/config/skills/orchestrator/recall/SKILL.md +0 -47
  362. package/config/skills/orchestrator/recall/execute.sh +0 -13
  363. package/config/skills/orchestrator/record-learning/SKILL.md +0 -47
  364. package/config/skills/orchestrator/record-learning/execute.sh +0 -13
  365. package/config/skills/orchestrator/remember/SKILL.md +0 -55
  366. package/config/skills/orchestrator/remember/execute.sh +0 -15
  367. package/frontend/dist/assets/index-6aaa0630.css +0 -33
@@ -0,0 +1,545 @@
1
+ /**
2
+ * Mission Reminder Service
3
+ *
4
+ * Scans active Missions and sends proactive Slack reminders to KR owners
5
+ * if their metrics are 'off_track' or 'at_risk'.
6
+ *
7
+ * Features:
8
+ * - Periodic sweep of all active missions
9
+ * - KR-level status evaluation via KRTrackingService
10
+ * - Intelligent owner resolution (Mission owner -> Team Lead)
11
+ * - Proactive Slack delivery via SlackOrchestratorBridge
12
+ * - Rate limiting to prevent reminder fatigue (lastReminderAt tracking)
13
+ *
14
+ * @module services/v3/mission-reminder.service
15
+ */
16
+ import * as fs from 'fs/promises';
17
+ import * as path from 'path';
18
+ import { CronExpressionParser } from 'cron-parser';
19
+ import { LoggerService } from '../core/logger.service.js';
20
+ import { StorageService } from '../core/storage.service.js';
21
+ import { KRTrackingService } from './kr-tracking.service.js';
22
+ import { getSlackOrchestratorBridge } from '../slack/slack-orchestrator-bridge.js';
23
+ import { TaskPoolService } from '../task-pool/task-pool.service.js';
24
+ import { TERMINAL_WORK_ITEM_STATUSES } from '../../types/v2/work-item.types.js';
25
+ import { atomicWriteJson } from '../../utils/file-io.utils.js';
26
+ import { pickTeamLead } from '../../utils/team.utils.js';
27
+ import { ORCHESTRATOR_SESSION_NAME } from '../../constants.js';
28
+ // ---------------------------------------------------------------------------
29
+ // Constants
30
+ // ---------------------------------------------------------------------------
31
+ /** Minimum interval between reminders for the same mission (24 hours) */
32
+ const REMINDER_COOLDOWN_MS = 24 * 60 * 60 * 1000;
33
+ /**
34
+ * Statuses that *clear* a Mission's `pendingReviewWorkItemId` so the next
35
+ * sweep tick can fire a new review. The set mirrors
36
+ * {@link TERMINAL_WORK_ITEM_STATUSES} (`done`, `verified`, `cancelled`) but
37
+ * adds two statuses that the canonical TERMINAL set excludes for valid
38
+ * reasons elsewhere — yet which DO represent "exited the active queue" for
39
+ * the V8 reentrancy-lock perspective:
40
+ *
41
+ * - `failed`: a failed review WI has terminated execution; not blocking next cadence.
42
+ * - `rejected`: a TL-rejected review WI ({@link WorkItemStatus} reachable from
43
+ * the review path per work-item.types.ts) has likewise exited the queue.
44
+ * Without this, a single TL rejection of a review WI would silently freeze
45
+ * that mission's lock forever — exactly the V8 failure mode this lock
46
+ * exists to prevent (Arch N1 BLOCKING fix on PR #354).
47
+ *
48
+ * The reentrancy lock is sweep-time lazy: we don't subscribe to TRANS-1
49
+ * events here, we just observe the WorkItem's current state on each sweep
50
+ * and clear the lock when it's terminal.
51
+ */
52
+ const PENDING_REVIEW_TERMINAL_STATUSES = new Set([
53
+ ...TERMINAL_WORK_ITEM_STATUSES,
54
+ 'failed',
55
+ 'rejected',
56
+ ]);
57
+ function getMissionsDir() {
58
+ return path.join(process.cwd(), '.crewly', 'missions');
59
+ }
60
+ /**
61
+ * Default timezone used when a mission's `policy.executionCadence.workHours`
62
+ * does not specify one. UTC keeps the dedup key globally consistent across
63
+ * deployments — overriding to a local TZ would only matter if we surfaced
64
+ * the cycleId to humans.
65
+ */
66
+ const DEFAULT_REVIEW_TIMEZONE = 'UTC';
67
+ /**
68
+ * Whether to create a `type: 'review'` WorkItem on every cadence boundary
69
+ * in addition to the existing Slack reminder. Controlled by env so ops
70
+ * can turn the loop off independently of the reminder DM if a downstream
71
+ * pipeline (BRIDGE-1, LEARN-1) regresses.
72
+ *
73
+ * Env:
74
+ * `CREWLY_REVIEW_WI_ENABLED=false` — disables review WI creation
75
+ * anything else (or unset) — review WI creation enabled (default)
76
+ */
77
+ function isReviewWorkItemEnabled() {
78
+ return process.env['CREWLY_REVIEW_WI_ENABLED'] !== 'false';
79
+ }
80
+ // ---------------------------------------------------------------------------
81
+ // Service
82
+ // ---------------------------------------------------------------------------
83
+ /**
84
+ * Service for sending proactive reminders for off-track OKRs.
85
+ */
86
+ export class MissionReminderService {
87
+ static instance = null;
88
+ logger;
89
+ storageService;
90
+ krTrackingService;
91
+ /**
92
+ * Cached TaskPoolService singleton (Arch NTH-4 on PR #354).
93
+ * Resolved lazily on first access via {@link getTaskPool} and reused
94
+ * across every sweep × mission call site for the lifetime of this
95
+ * MissionReminderService instance. Tests that need to swap the
96
+ * underlying TaskPool must call {@link resetInstance} to also discard
97
+ * this cached reference.
98
+ */
99
+ taskPool = null;
100
+ /**
101
+ * Counter of cron-parse failures observed across all sweeps (Arch NTH-3
102
+ * on PR #354). Bumped each time {@link CronExpressionParser.parse}
103
+ * throws on a mission's `reviewSchedule`. Exposed via
104
+ * {@link cronParseFailureCount} for tests + (future) Prom metric.
105
+ */
106
+ cronParseFailures = 0;
107
+ constructor() {
108
+ this.logger = LoggerService.getInstance().createComponentLogger('MissionReminder');
109
+ this.storageService = StorageService.getInstance();
110
+ this.krTrackingService = KRTrackingService.getInstance();
111
+ }
112
+ /**
113
+ * Total number of cron-parse failures observed since this service
114
+ * instance was constructed. Read by tests (asserting the warn-log path
115
+ * also bumps the counter) and intended as the source for a future
116
+ * Prometheus gauge (sister F4 follow-up filed on the OKR Mission
117
+ * Reminder spec).
118
+ */
119
+ get cronParseFailureCount() {
120
+ return this.cronParseFailures;
121
+ }
122
+ /**
123
+ * Cached TaskPoolService accessor. Resolves the singleton on first call
124
+ * and reuses it thereafter. Allows test harnesses to reset the cache
125
+ * via {@link resetInstance}, which clears both the
126
+ * MissionReminderService singleton and any private references it holds.
127
+ */
128
+ getTaskPool() {
129
+ if (!this.taskPool) {
130
+ this.taskPool = TaskPoolService.getInstance();
131
+ }
132
+ return this.taskPool;
133
+ }
134
+ static getInstance() {
135
+ if (!MissionReminderService.instance) {
136
+ MissionReminderService.instance = new MissionReminderService();
137
+ }
138
+ return MissionReminderService.instance;
139
+ }
140
+ static resetInstance() {
141
+ MissionReminderService.instance = null;
142
+ }
143
+ /**
144
+ * Run a full sweep of all active missions, sending Slack OKR reminders
145
+ * AND (per REVIEW-1, Phase E pre-beta) creating cadence-driven review
146
+ * WorkItems that wake the Team Lead.
147
+ *
148
+ * The two outputs are intentionally additive — the Slack DM keeps the
149
+ * legacy 24h-cooldown path, and the review WorkItem is created when
150
+ * the mission's `policy.executionCadence.reviewSchedule` cron has
151
+ * fired since the last `lastReviewAt`. The DM and the WI may both
152
+ * fire on the same sweep tick — one is a notification, the other is
153
+ * a queue item the TL can act on. Idempotency is guaranteed by the
154
+ * deterministic WorkItem id (`<missionId>:review:<cycleId>`) which
155
+ * the existing `addToPool` dedup-by-id catches; reentrancy is
156
+ * guaranteed by `mission.pendingReviewWorkItemId` (Arch Veto V8).
157
+ *
158
+ * @param force - If true, ignores the REMINDER_COOLDOWN_MS for the
159
+ * Slack DM path (does NOT bypass the review-WI cadence/lock — that
160
+ * would defeat the deterministic-id contract).
161
+ * @returns Summary of actions taken
162
+ */
163
+ async runSweep(force = false) {
164
+ const now = new Date();
165
+ const missions = await this.loadAllActiveMissions();
166
+ const result = {
167
+ checked: 0,
168
+ sent: 0,
169
+ skipped: 0,
170
+ reviewsCreated: 0,
171
+ reviewsSkipped: 0,
172
+ };
173
+ this.logger.info('Starting Mission OKR reminder sweep', { count: missions.length });
174
+ for (const mission of missions) {
175
+ result.checked++;
176
+ let summary = null;
177
+ try {
178
+ // Get OKR progress summary — needed for both the reminder DM
179
+ // and the reviewReason inference on the review WorkItem.
180
+ summary = await this.krTrackingService.computeMissionOKRProgress(mission.id);
181
+ }
182
+ catch (err) {
183
+ this.logger.error('Failed to compute mission OKR progress', {
184
+ missionId: mission.id,
185
+ error: err instanceof Error ? err.message : String(err),
186
+ });
187
+ // Don't `continue` — the review-WI path doesn't strictly need
188
+ // the summary (it falls back to `scheduled_review`). Slack
189
+ // path will be skipped by the off-track/at-risk filter below.
190
+ }
191
+ // -------------------------------------------------------------------
192
+ // Slack OKR reminder path (existing — 24h cooldown).
193
+ // -------------------------------------------------------------------
194
+ const reminderEligible = force || !mission.lastReminderAt ||
195
+ now.getTime() - new Date(mission.lastReminderAt).getTime() >= REMINDER_COOLDOWN_MS;
196
+ if (reminderEligible && summary && (summary.offTrack > 0 || summary.atRisk > 0)) {
197
+ try {
198
+ const sent = await this.sendReminder(mission, summary);
199
+ if (sent) {
200
+ result.sent++;
201
+ mission.lastReminderAt = now.toISOString();
202
+ await this.saveMission(mission);
203
+ }
204
+ }
205
+ catch (err) {
206
+ this.logger.error('Failed to send mission reminder', {
207
+ missionId: mission.id,
208
+ error: err instanceof Error ? err.message : String(err),
209
+ });
210
+ }
211
+ }
212
+ else if (!reminderEligible) {
213
+ result.skipped++;
214
+ }
215
+ // -------------------------------------------------------------------
216
+ // REVIEW-1: cadence-driven review WorkItem creation.
217
+ //
218
+ // The DM above is a notification; this is a queue item the TL must
219
+ // explicitly act on. Both can fire on the same sweep tick.
220
+ // -------------------------------------------------------------------
221
+ if (isReviewWorkItemEnabled()) {
222
+ try {
223
+ const created = await this.maybeCreateReviewWorkItem(mission, summary, now);
224
+ if (created === 'created')
225
+ result.reviewsCreated++;
226
+ else if (created === 'skipped')
227
+ result.reviewsSkipped++;
228
+ }
229
+ catch (err) {
230
+ this.logger.error('Failed to create mission review WorkItem', {
231
+ missionId: mission.id,
232
+ error: err instanceof Error ? err.message : String(err),
233
+ });
234
+ }
235
+ }
236
+ }
237
+ this.logger.info('Mission OKR reminder sweep complete', result);
238
+ return result;
239
+ }
240
+ /**
241
+ * Result of {@link maybeCreateReviewWorkItem} — `'created'` when a new
242
+ * review WorkItem was added to the pool, `'skipped'` when the
243
+ * reentrancy lock or cadence boundary blocked creation, `'noop'` when
244
+ * the mission has no executionCadence configured (legacy missions).
245
+ */
246
+ async maybeCreateReviewWorkItem(mission, summary, now) {
247
+ const cadence = mission.policy?.executionCadence;
248
+ if (!cadence?.reviewSchedule)
249
+ return 'noop';
250
+ const timezone = cadence.workHours?.timezone ?? DEFAULT_REVIEW_TIMEZONE;
251
+ // -----------------------------------------------------------------
252
+ // Reentrancy lock (Arch Veto V8).
253
+ // Lazily clear the pending pointer when the previous review WI has
254
+ // reached terminal status; otherwise short-circuit creation.
255
+ //
256
+ // NTH-2 (Arch on PR #354): defer the saveMission for the lock-clear
257
+ // until we know whether a new review WI will be created in the same
258
+ // sweep tick. If yes, both writes (clear + new id) collapse to one
259
+ // saveMission at the end of the success path. If no (skipped /
260
+ // noop), we still need to persist the cleared lock — handled in the
261
+ // exit branches below.
262
+ // -----------------------------------------------------------------
263
+ let pendingLockCleared = false;
264
+ if (mission.pendingReviewWorkItemId) {
265
+ const pendingWI = await this.getTaskPool().findWorkItem(mission.pendingReviewWorkItemId);
266
+ if (!pendingWI || PENDING_REVIEW_TERMINAL_STATUSES.has(pendingWI.status)) {
267
+ // Pending WI is gone or terminal — clear in memory; persist on exit.
268
+ mission.pendingReviewWorkItemId = undefined;
269
+ pendingLockCleared = true;
270
+ }
271
+ else {
272
+ return 'skipped';
273
+ }
274
+ }
275
+ // -----------------------------------------------------------------
276
+ // Cadence boundary check.
277
+ // The most recent cron-tick <= now defines the current cycle. If
278
+ // `lastReviewAt` is at or after that boundary, we already covered
279
+ // this cycle and the next sweep tick will roll into the next one.
280
+ // -----------------------------------------------------------------
281
+ let boundary;
282
+ try {
283
+ const interval = CronExpressionParser.parse(cadence.reviewSchedule, {
284
+ currentDate: now,
285
+ tz: timezone,
286
+ });
287
+ boundary = interval.prev().toDate();
288
+ }
289
+ catch (err) {
290
+ // NTH-3 (Arch on PR #354): bump the cron-parse failure counter so
291
+ // ops can see how often this fires + which missions are affected.
292
+ // The warn-log already carried mission id + cron + error message.
293
+ this.cronParseFailures += 1;
294
+ this.logger.warn('Mission has unparseable review cadence cron — skipping review WI', {
295
+ missionId: mission.id,
296
+ reviewSchedule: cadence.reviewSchedule,
297
+ error: err instanceof Error ? err.message : String(err),
298
+ totalCronParseFailures: this.cronParseFailures,
299
+ });
300
+ // Persist the cleared reentrancy lock if we cleared it earlier in
301
+ // this method but are now bailing out of WI creation — the
302
+ // mission's in-memory state would otherwise leak the cleared
303
+ // pointer to the next sweep without disk-backed durability.
304
+ if (pendingLockCleared) {
305
+ await this.saveMission(mission);
306
+ }
307
+ return 'noop';
308
+ }
309
+ if (mission.lastReviewAt) {
310
+ const lastReview = new Date(mission.lastReviewAt);
311
+ if (lastReview.getTime() >= boundary.getTime()) {
312
+ // Already reviewed within the current cadence cycle.
313
+ // NTH-2: persist any deferred lock-clear before bailing.
314
+ if (pendingLockCleared) {
315
+ await this.saveMission(mission);
316
+ }
317
+ return 'skipped';
318
+ }
319
+ }
320
+ // -----------------------------------------------------------------
321
+ // Build the deterministic review WorkItem.
322
+ //
323
+ // The id collapses to the date-form of the boundary so a sweep
324
+ // replay within the same cycle hits the existing addToPool
325
+ // dedup-by-id guard (V1 satisfied without a TaskPoolService change).
326
+ // -----------------------------------------------------------------
327
+ const cycleId = boundary.toISOString().slice(0, 10);
328
+ const reviewWorkItemId = `${mission.id}:review:${cycleId}`;
329
+ const reviewReason = this.inferReviewReason(mission, summary);
330
+ const target = await this.resolveTeamLeadSession(mission);
331
+ const reviewWorkItem = {
332
+ id: reviewWorkItemId,
333
+ type: 'review',
334
+ owner: 'team_lead',
335
+ target,
336
+ title: `Mission review — ${mission.objective.slice(0, 60)}${mission.objective.length > 60 ? '…' : ''}`,
337
+ description: `Cadence-driven review for mission ${mission.id}. Reason: ${reviewReason}.`,
338
+ status: 'queued',
339
+ createdAt: now.toISOString(),
340
+ retryCount: 0,
341
+ maxRetries: 0, // V2 N/A for review WIs — no auto-retry policy
342
+ missionId: mission.id,
343
+ inputTokens: 0,
344
+ outputTokens: 0,
345
+ cost: 0,
346
+ metadata: {
347
+ idempotencyKey: reviewWorkItemId, // V1 — same as id, surfaces in audit logs
348
+ requiresVerification: false, // F-H — review WIs do NOT loop back to TL self-verify
349
+ reviewReason,
350
+ reviewCycleId: cycleId,
351
+ cadenceSchedule: cadence.reviewSchedule,
352
+ },
353
+ };
354
+ await this.getTaskPool().addToPool(reviewWorkItem);
355
+ // Persist the reentrancy lock + bookkeeping fields.
356
+ // NTH-2: this is the canonical single saveMission per sweep tick —
357
+ // any earlier in-memory lock-clear collapses into this write.
358
+ mission.pendingReviewWorkItemId = reviewWorkItemId;
359
+ mission.lastReviewAt = now.toISOString();
360
+ await this.saveMission(mission);
361
+ this.logger.info('Mission review WorkItem created', {
362
+ missionId: mission.id,
363
+ workItemId: reviewWorkItemId,
364
+ reviewReason,
365
+ target,
366
+ cycleId,
367
+ });
368
+ return 'created';
369
+ }
370
+ /**
371
+ * Pick the {@link ReviewReason} for this sweep tick.
372
+ *
373
+ * Precedence (most-actionable-first):
374
+ * 1. `off_track_kr` — at least one KR is reported off-track.
375
+ * 2. `no_active_work` — the mission has no active project tasks.
376
+ * 3. `phase_complete` — the mission has advanced phases since
377
+ * the last review (heuristic — uses
378
+ * `currentPhase` if both this sweep's
379
+ * inferred phase and the previous one are
380
+ * recorded; otherwise skipped).
381
+ * 4. `scheduled_review` — default; cadence boundary fired.
382
+ *
383
+ * Conservative on `phase_complete`: we only emit it when the
384
+ * previous review (`lastReviewSummary`) and the current `currentPhase`
385
+ * actually disagree — REVIEW-1 doesn't reach into the phase machine
386
+ * to invent state.
387
+ */
388
+ inferReviewReason(mission, summary) {
389
+ if (summary && summary.offTrack > 0)
390
+ return 'off_track_kr';
391
+ if (!mission.activeProjectTaskIds || mission.activeProjectTaskIds.length === 0) {
392
+ return 'no_active_work';
393
+ }
394
+ if (typeof mission.currentPhase === 'number' &&
395
+ mission.lastReviewSummary &&
396
+ !mission.lastReviewSummary.includes(`phase=${mission.currentPhase}`)) {
397
+ return 'phase_complete';
398
+ }
399
+ return 'scheduled_review';
400
+ }
401
+ /**
402
+ * Resolve the session name to wake when a review WorkItem fires.
403
+ *
404
+ * Order:
405
+ * 1. The mission's explicit owner (`mission.ownerId`)
406
+ * 2. The team lead resolved via the canonical {@link pickTeamLead}
407
+ * cascade (same path as Slack reminder owner resolution)
408
+ * 3. The orchestrator session as last-resort wake target so a
409
+ * review never gets dropped on the floor.
410
+ *
411
+ * @param mission - The mission whose review WI is being created
412
+ * @returns Session name string
413
+ */
414
+ async resolveTeamLeadSession(mission) {
415
+ if (mission.ownerId) {
416
+ const member = await this.storageService.getMemberById(mission.ownerId);
417
+ if (member?.sessionName)
418
+ return member.sessionName;
419
+ }
420
+ const teams = await this.storageService.getTeams();
421
+ const team = teams.find((t) => t.id === mission.ownerTeamId);
422
+ if (team) {
423
+ const lead = pickTeamLead(team);
424
+ if (lead?.sessionName)
425
+ return lead.sessionName;
426
+ }
427
+ return ORCHESTRATOR_SESSION_NAME;
428
+ }
429
+ /**
430
+ * Send a Slack reminder for a specific mission.
431
+ */
432
+ async sendReminder(mission, summary) {
433
+ const bridge = getSlackOrchestratorBridge();
434
+ if (!bridge) {
435
+ this.logger.warn('SlackOrchestratorBridge not available, cannot send reminder');
436
+ return false;
437
+ }
438
+ // Resolve owner name for @mention
439
+ const ownerName = await this.resolveOwnerName(mission);
440
+ const urgency = summary.offTrack > 0 ? 'high' : 'normal';
441
+ const message = this.formatReminderMessage(mission, summary, ownerName);
442
+ try {
443
+ await bridge.sendNotification({
444
+ type: 'okr_reminder',
445
+ title: `OKR Alert: ${mission.objective.slice(0, 50)}${mission.objective.length > 50 ? '...' : ''}`,
446
+ message,
447
+ urgency,
448
+ timestamp: new Date().toISOString(),
449
+ metadata: {
450
+ missionId: mission.id,
451
+ offTrack: summary.offTrack,
452
+ atRisk: summary.atRisk,
453
+ },
454
+ });
455
+ return true;
456
+ }
457
+ catch (err) {
458
+ this.logger.error('Failed to send Slack notification', {
459
+ missionId: mission.id,
460
+ error: err instanceof Error ? err.message : String(err),
461
+ });
462
+ return false;
463
+ }
464
+ }
465
+ /**
466
+ * Format the reminder message text.
467
+ */
468
+ formatReminderMessage(mission, summary, ownerName) {
469
+ const statusLine = summary.offTrack > 0
470
+ ? `🚨 *${summary.offTrack} Key Results are OFF TRACK*`
471
+ : `⚠️ *${summary.atRisk} Key Results are AT RISK*`;
472
+ return `Hello ${ownerName},
473
+
474
+ ${statusLine} for Mission: "${mission.objective}"
475
+
476
+ Progress: ${Math.round(summary.overallProgress)}%
477
+ Total KRs: ${summary.totalKRs}
478
+ Achieved: ${summary.achieved}
479
+ On Track: ${summary.onTrack}
480
+ At Risk: ${summary.atRisk}
481
+ Off Track: ${summary.offTrack}
482
+
483
+ Please review the current strategy and adjust as needed.
484
+ cc: @${ORCHESTRATOR_SESSION_NAME}`;
485
+ }
486
+ /**
487
+ * Resolve a human-readable name for the mission owner.
488
+ */
489
+ async resolveOwnerName(mission) {
490
+ // 1. Try explicit ownerId
491
+ if (mission.ownerId) {
492
+ const member = await this.storageService.getMemberById(mission.ownerId);
493
+ if (member)
494
+ return member.name;
495
+ }
496
+ // 2. Fallback to Team Lead of ownerTeamId via the canonical 4-rule
497
+ // cascade in `utils/team.utils.pickTeamLead` — same resolver used
498
+ // by chat-v2 mention dispatch so behavior cannot drift.
499
+ const teams = await this.storageService.getTeams();
500
+ const team = teams.find((t) => t.id === mission.ownerTeamId);
501
+ if (team) {
502
+ const leader = pickTeamLead(team);
503
+ if (leader)
504
+ return leader.name;
505
+ return team.name;
506
+ }
507
+ return 'Team Lead';
508
+ }
509
+ /**
510
+ * Load all missions with 'active' status.
511
+ */
512
+ async loadAllActiveMissions() {
513
+ const dir = getMissionsDir();
514
+ try {
515
+ const files = await fs.readdir(dir);
516
+ const missions = [];
517
+ for (const file of files) {
518
+ if (!file.endsWith('.json'))
519
+ continue;
520
+ try {
521
+ const raw = await fs.readFile(path.join(dir, file), 'utf-8');
522
+ const mission = JSON.parse(raw);
523
+ if (mission.status === 'active') {
524
+ missions.push(mission);
525
+ }
526
+ }
527
+ catch {
528
+ // Skip corrupt files
529
+ }
530
+ }
531
+ return missions;
532
+ }
533
+ catch {
534
+ return [];
535
+ }
536
+ }
537
+ /**
538
+ * Save a mission back to disk.
539
+ */
540
+ async saveMission(mission) {
541
+ const filePath = path.join(getMissionsDir(), `${mission.id}.json`);
542
+ await atomicWriteJson(filePath, mission);
543
+ }
544
+ }
545
+ //# sourceMappingURL=mission-reminder.service.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mission-reminder.service.js","sourceRoot":"","sources":["../../../../../../backend/src/services/v3/mission-reminder.service.ts"],"names":[],"mappings":"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"}