crewly 1.6.5 → 1.8.0

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 (338) hide show
  1. package/config/constants.ts +2 -0
  2. package/config/roles/auditor/prompt.md +24 -0
  3. package/config/roles/developer/prompt.md +2 -1
  4. package/config/roles/orchestrator/prompt.md +118 -2
  5. package/config/roles/team-leader/prompt.md +6 -0
  6. package/config/skills/agent/core/create-request/SKILL.md +1 -1
  7. package/config/skills/agent/core/create-request/execute.sh +29 -2
  8. package/config/skills/agent/core/create-request/execute.test.sh +168 -0
  9. package/config/skills/agent/core/report-status/SKILL.md +8 -1
  10. package/config/skills/agent/core/report-status/execute.sh +23 -1
  11. package/config/skills/orchestrator/heartbeat/execute.sh +48 -6
  12. package/config/sops/common/mid-flight-milestone-surface.md +128 -0
  13. package/config/sops/common/owner-facing-communication.md +46 -2
  14. package/config/sops/developer/git-workflow.md +33 -0
  15. package/dist/backend/backend/src/constants.d.ts +13 -0
  16. package/dist/backend/backend/src/constants.d.ts.map +1 -1
  17. package/dist/backend/backend/src/constants.js +12 -0
  18. package/dist/backend/backend/src/constants.js.map +1 -1
  19. package/dist/backend/backend/src/controllers/browser/browser.controller.js +2 -2
  20. package/dist/backend/backend/src/controllers/browser/browser.controller.js.map +1 -1
  21. package/dist/backend/backend/src/controllers/chat/chat.controller.d.ts.map +1 -1
  22. package/dist/backend/backend/src/controllers/chat/chat.controller.js +6 -0
  23. package/dist/backend/backend/src/controllers/chat/chat.controller.js.map +1 -1
  24. package/dist/backend/backend/src/controllers/chat-v2/chat-v2.controller.d.ts +73 -0
  25. package/dist/backend/backend/src/controllers/chat-v2/chat-v2.controller.d.ts.map +1 -1
  26. package/dist/backend/backend/src/controllers/chat-v2/chat-v2.controller.js +128 -0
  27. package/dist/backend/backend/src/controllers/chat-v2/chat-v2.controller.js.map +1 -1
  28. package/dist/backend/backend/src/controllers/chat-v2/chat-v2.routes.d.ts +3 -0
  29. package/dist/backend/backend/src/controllers/chat-v2/chat-v2.routes.d.ts.map +1 -1
  30. package/dist/backend/backend/src/controllers/chat-v2/chat-v2.routes.js +8 -0
  31. package/dist/backend/backend/src/controllers/chat-v2/chat-v2.routes.js.map +1 -1
  32. package/dist/backend/backend/src/controllers/session/session.controller.d.ts.map +1 -1
  33. package/dist/backend/backend/src/controllers/session/session.controller.js +50 -8
  34. package/dist/backend/backend/src/controllers/session/session.controller.js.map +1 -1
  35. package/dist/backend/backend/src/controllers/slack/slack.controller.d.ts.map +1 -1
  36. package/dist/backend/backend/src/controllers/slack/slack.controller.js +215 -94
  37. package/dist/backend/backend/src/controllers/slack/slack.controller.js.map +1 -1
  38. package/dist/backend/backend/src/controllers/team/team.controller.d.ts.map +1 -1
  39. package/dist/backend/backend/src/controllers/team/team.controller.js +27 -0
  40. package/dist/backend/backend/src/controllers/team/team.controller.js.map +1 -1
  41. package/dist/backend/backend/src/index.d.ts +1 -0
  42. package/dist/backend/backend/src/index.d.ts.map +1 -1
  43. package/dist/backend/backend/src/index.js +201 -37
  44. package/dist/backend/backend/src/index.js.map +1 -1
  45. package/dist/backend/backend/src/routes/api.routes.d.ts.map +1 -1
  46. package/dist/backend/backend/src/routes/api.routes.js +11 -1
  47. package/dist/backend/backend/src/routes/api.routes.js.map +1 -1
  48. package/dist/backend/backend/src/services/agent/agent-registration.service.d.ts +45 -3
  49. package/dist/backend/backend/src/services/agent/agent-registration.service.d.ts.map +1 -1
  50. package/dist/backend/backend/src/services/agent/agent-registration.service.js +219 -7
  51. package/dist/backend/backend/src/services/agent/agent-registration.service.js.map +1 -1
  52. package/dist/backend/backend/src/services/agent/crewly-agent/agent-runner.service.d.ts +61 -1
  53. package/dist/backend/backend/src/services/agent/crewly-agent/agent-runner.service.d.ts.map +1 -1
  54. package/dist/backend/backend/src/services/agent/crewly-agent/agent-runner.service.js +117 -9
  55. package/dist/backend/backend/src/services/agent/crewly-agent/agent-runner.service.js.map +1 -1
  56. package/dist/backend/backend/src/services/agent/crewly-agent/crewly-agent-external-runtime.service.d.ts +44 -0
  57. package/dist/backend/backend/src/services/agent/crewly-agent/crewly-agent-external-runtime.service.d.ts.map +1 -1
  58. package/dist/backend/backend/src/services/agent/crewly-agent/crewly-agent-external-runtime.service.js +179 -10
  59. package/dist/backend/backend/src/services/agent/crewly-agent/crewly-agent-external-runtime.service.js.map +1 -1
  60. package/dist/backend/backend/src/services/agent/crewly-agent/in-process-runtime-registry.d.ts +6 -6
  61. package/dist/backend/backend/src/services/agent/crewly-agent/in-process-runtime-registry.d.ts.map +1 -1
  62. package/dist/backend/backend/src/services/agent/crewly-agent/in-process-runtime-registry.js +3 -3
  63. package/dist/backend/backend/src/services/agent/crewly-agent/in-process-runtime-registry.js.map +1 -1
  64. package/dist/backend/backend/src/services/agent/crewly-agent/types.d.ts +7 -1
  65. package/dist/backend/backend/src/services/agent/crewly-agent/types.d.ts.map +1 -1
  66. package/dist/backend/backend/src/services/agent/crewly-agent/types.js.map +1 -1
  67. package/dist/backend/backend/src/services/agent/idle-detection.service.d.ts +33 -0
  68. package/dist/backend/backend/src/services/agent/idle-detection.service.d.ts.map +1 -1
  69. package/dist/backend/backend/src/services/agent/idle-detection.service.js +108 -4
  70. package/dist/backend/backend/src/services/agent/idle-detection.service.js.map +1 -1
  71. package/dist/backend/backend/src/services/agent/runtime-service.factory.js +4 -4
  72. package/dist/backend/backend/src/services/agent/runtime-service.factory.js.map +1 -1
  73. package/dist/backend/backend/src/services/browser/browser-proxy.service.d.ts +1 -1
  74. package/dist/backend/backend/src/services/browser/browser-proxy.service.d.ts.map +1 -1
  75. package/dist/backend/backend/src/services/browser/browser-proxy.service.js +40 -2
  76. package/dist/backend/backend/src/services/browser/browser-proxy.service.js.map +1 -1
  77. package/dist/backend/backend/src/services/chat/chat.service.d.ts +48 -331
  78. package/dist/backend/backend/src/services/chat/chat.service.d.ts.map +1 -1
  79. package/dist/backend/backend/src/services/chat/chat.service.js +261 -712
  80. package/dist/backend/backend/src/services/chat/chat.service.js.map +1 -1
  81. package/dist/backend/backend/src/services/chat-v2/chat-v2.dispatcher.service.d.ts +82 -1
  82. package/dist/backend/backend/src/services/chat-v2/chat-v2.dispatcher.service.d.ts.map +1 -1
  83. package/dist/backend/backend/src/services/chat-v2/chat-v2.dispatcher.service.js +120 -2
  84. package/dist/backend/backend/src/services/chat-v2/chat-v2.dispatcher.service.js.map +1 -1
  85. package/dist/backend/backend/src/services/chat-v2/chat-v2.providers.d.ts +114 -0
  86. package/dist/backend/backend/src/services/chat-v2/chat-v2.providers.d.ts.map +1 -0
  87. package/dist/backend/backend/src/services/chat-v2/chat-v2.providers.js +182 -0
  88. package/dist/backend/backend/src/services/chat-v2/chat-v2.providers.js.map +1 -0
  89. package/dist/backend/backend/src/services/chat-v2/chat-v2.relay-adapter.service.d.ts +188 -0
  90. package/dist/backend/backend/src/services/chat-v2/chat-v2.relay-adapter.service.d.ts.map +1 -0
  91. package/dist/backend/backend/src/services/chat-v2/chat-v2.relay-adapter.service.js +434 -0
  92. package/dist/backend/backend/src/services/chat-v2/chat-v2.relay-adapter.service.js.map +1 -0
  93. package/dist/backend/backend/src/services/chat-v2/chat-v2.service.d.ts +401 -5
  94. package/dist/backend/backend/src/services/chat-v2/chat-v2.service.d.ts.map +1 -1
  95. package/dist/backend/backend/src/services/chat-v2/chat-v2.service.js +619 -3
  96. package/dist/backend/backend/src/services/chat-v2/chat-v2.service.js.map +1 -1
  97. package/dist/backend/backend/src/services/chat-v2/legacy-dto.utils.d.ts +93 -0
  98. package/dist/backend/backend/src/services/chat-v2/legacy-dto.utils.d.ts.map +1 -0
  99. package/dist/backend/backend/src/services/chat-v2/legacy-dto.utils.js +138 -0
  100. package/dist/backend/backend/src/services/chat-v2/legacy-dto.utils.js.map +1 -0
  101. package/dist/backend/backend/src/services/chat-v2/sqlite/channel.store.d.ts +46 -0
  102. package/dist/backend/backend/src/services/chat-v2/sqlite/channel.store.d.ts.map +1 -1
  103. package/dist/backend/backend/src/services/chat-v2/sqlite/channel.store.js +75 -0
  104. package/dist/backend/backend/src/services/chat-v2/sqlite/channel.store.js.map +1 -1
  105. package/dist/backend/backend/src/services/chat-v2/sqlite/chat-db.d.ts +10 -2
  106. package/dist/backend/backend/src/services/chat-v2/sqlite/chat-db.d.ts.map +1 -1
  107. package/dist/backend/backend/src/services/chat-v2/sqlite/chat-db.js +178 -10
  108. package/dist/backend/backend/src/services/chat-v2/sqlite/chat-db.js.map +1 -1
  109. package/dist/backend/backend/src/services/chat-v2/sqlite/message.store.d.ts +37 -0
  110. package/dist/backend/backend/src/services/chat-v2/sqlite/message.store.d.ts.map +1 -1
  111. package/dist/backend/backend/src/services/chat-v2/sqlite/message.store.js +71 -0
  112. package/dist/backend/backend/src/services/chat-v2/sqlite/message.store.js.map +1 -1
  113. package/dist/backend/backend/src/services/chat-v2/types.d.ts +33 -1
  114. package/dist/backend/backend/src/services/chat-v2/types.d.ts.map +1 -1
  115. package/dist/backend/backend/src/services/chat-v2/types.js +1 -1
  116. package/dist/backend/backend/src/services/chat-v2/types.js.map +1 -1
  117. package/dist/backend/backend/src/services/cloud/cloud-sync.service.d.ts +22 -0
  118. package/dist/backend/backend/src/services/cloud/cloud-sync.service.d.ts.map +1 -1
  119. package/dist/backend/backend/src/services/cloud/cloud-sync.service.js +71 -1
  120. package/dist/backend/backend/src/services/cloud/cloud-sync.service.js.map +1 -1
  121. package/dist/backend/backend/src/services/cloud/cloud-sync.types.d.ts +102 -1
  122. package/dist/backend/backend/src/services/cloud/cloud-sync.types.d.ts.map +1 -1
  123. package/dist/backend/backend/src/services/cloud/cloud-sync.types.js +61 -0
  124. package/dist/backend/backend/src/services/cloud/cloud-sync.types.js.map +1 -1
  125. package/dist/backend/backend/src/services/cloud/device-auto-discovery.service.d.ts +21 -3
  126. package/dist/backend/backend/src/services/cloud/device-auto-discovery.service.d.ts.map +1 -1
  127. package/dist/backend/backend/src/services/cloud/device-auto-discovery.service.js +47 -13
  128. package/dist/backend/backend/src/services/cloud/device-auto-discovery.service.js.map +1 -1
  129. package/dist/backend/backend/src/services/core/system-health.util.d.ts +25 -4
  130. package/dist/backend/backend/src/services/core/system-health.util.d.ts.map +1 -1
  131. package/dist/backend/backend/src/services/core/system-health.util.js +30 -5
  132. package/dist/backend/backend/src/services/core/system-health.util.js.map +1 -1
  133. package/dist/backend/backend/src/services/event-bus/event-bus.service.d.ts.map +1 -1
  134. package/dist/backend/backend/src/services/event-bus/event-bus.service.js +22 -11
  135. package/dist/backend/backend/src/services/event-bus/event-bus.service.js.map +1 -1
  136. package/dist/backend/backend/src/services/mcp-server.d.ts.map +1 -1
  137. package/dist/backend/backend/src/services/mcp-server.js +5 -0
  138. package/dist/backend/backend/src/services/mcp-server.js.map +1 -1
  139. package/dist/backend/backend/src/services/mcp-tool-definitions.d.ts +4 -0
  140. package/dist/backend/backend/src/services/mcp-tool-definitions.d.ts.map +1 -1
  141. package/dist/backend/backend/src/services/mcp-tool-definitions.js +12 -1
  142. package/dist/backend/backend/src/services/mcp-tool-definitions.js.map +1 -1
  143. package/dist/backend/backend/src/services/memory/capability-inference.d.ts +73 -0
  144. package/dist/backend/backend/src/services/memory/capability-inference.d.ts.map +1 -0
  145. package/dist/backend/backend/src/services/memory/capability-inference.js +115 -0
  146. package/dist/backend/backend/src/services/memory/capability-inference.js.map +1 -0
  147. package/dist/backend/backend/src/services/memory/memory.service.d.ts +22 -1
  148. package/dist/backend/backend/src/services/memory/memory.service.d.ts.map +1 -1
  149. package/dist/backend/backend/src/services/memory/memory.service.js +81 -3
  150. package/dist/backend/backend/src/services/memory/memory.service.js.map +1 -1
  151. package/dist/backend/backend/src/services/memory/project-memory.service.d.ts +25 -1
  152. package/dist/backend/backend/src/services/memory/project-memory.service.d.ts.map +1 -1
  153. package/dist/backend/backend/src/services/memory/project-memory.service.js +43 -0
  154. package/dist/backend/backend/src/services/memory/project-memory.service.js.map +1 -1
  155. package/dist/backend/backend/src/services/memory/task-history-seeder.d.ts +47 -0
  156. package/dist/backend/backend/src/services/memory/task-history-seeder.d.ts.map +1 -0
  157. package/dist/backend/backend/src/services/memory/task-history-seeder.js +89 -0
  158. package/dist/backend/backend/src/services/memory/task-history-seeder.js.map +1 -0
  159. package/dist/backend/backend/src/services/memory/task-history.subscriber.d.ts +76 -0
  160. package/dist/backend/backend/src/services/memory/task-history.subscriber.d.ts.map +1 -0
  161. package/dist/backend/backend/src/services/memory/task-history.subscriber.js +199 -0
  162. package/dist/backend/backend/src/services/memory/task-history.subscriber.js.map +1 -0
  163. package/dist/backend/backend/src/services/messaging/message-replay.service.d.ts +2 -4
  164. package/dist/backend/backend/src/services/messaging/message-replay.service.d.ts.map +1 -1
  165. package/dist/backend/backend/src/services/messaging/message-replay.service.js +22 -12
  166. package/dist/backend/backend/src/services/messaging/message-replay.service.js.map +1 -1
  167. package/dist/backend/backend/src/services/messaging/queue-processor.service.d.ts.map +1 -1
  168. package/dist/backend/backend/src/services/messaging/queue-processor.service.js +25 -5
  169. package/dist/backend/backend/src/services/messaging/queue-processor.service.js.map +1 -1
  170. package/dist/backend/backend/src/services/monitoring/system-resource-alert.service.d.ts.map +1 -1
  171. package/dist/backend/backend/src/services/monitoring/system-resource-alert.service.js +13 -3
  172. package/dist/backend/backend/src/services/monitoring/system-resource-alert.service.js.map +1 -1
  173. package/dist/backend/backend/src/services/notification/milestone-notification.subscriber.d.ts +99 -0
  174. package/dist/backend/backend/src/services/notification/milestone-notification.subscriber.d.ts.map +1 -0
  175. package/dist/backend/backend/src/services/notification/milestone-notification.subscriber.js +225 -0
  176. package/dist/backend/backend/src/services/notification/milestone-notification.subscriber.js.map +1 -0
  177. package/dist/backend/backend/src/services/reconciler/reconcile-rules.d.ts +39 -18
  178. package/dist/backend/backend/src/services/reconciler/reconcile-rules.d.ts.map +1 -1
  179. package/dist/backend/backend/src/services/reconciler/reconcile-rules.js +60 -32
  180. package/dist/backend/backend/src/services/reconciler/reconcile-rules.js.map +1 -1
  181. package/dist/backend/backend/src/services/reconciler/reconciler-data-provider.d.ts +134 -0
  182. package/dist/backend/backend/src/services/reconciler/reconciler-data-provider.d.ts.map +1 -1
  183. package/dist/backend/backend/src/services/reconciler/reconciler-data-provider.js +416 -13
  184. package/dist/backend/backend/src/services/reconciler/reconciler-data-provider.js.map +1 -1
  185. package/dist/backend/backend/src/services/reconciler/reconciler.service.d.ts.map +1 -1
  186. package/dist/backend/backend/src/services/reconciler/reconciler.service.js +73 -7
  187. package/dist/backend/backend/src/services/reconciler/reconciler.service.js.map +1 -1
  188. package/dist/backend/backend/src/services/session/session-handoff.service.d.ts.map +1 -1
  189. package/dist/backend/backend/src/services/session/session-handoff.service.js +30 -4
  190. package/dist/backend/backend/src/services/session/session-handoff.service.js.map +1 -1
  191. package/dist/backend/backend/src/services/skill/skill-executor.service.d.ts.map +1 -1
  192. package/dist/backend/backend/src/services/skill/skill-executor.service.js +13 -1
  193. package/dist/backend/backend/src/services/skill/skill-executor.service.js.map +1 -1
  194. package/dist/backend/backend/src/services/slack/notify-reconciliation.service.d.ts.map +1 -1
  195. package/dist/backend/backend/src/services/slack/notify-reconciliation.service.js +9 -6
  196. package/dist/backend/backend/src/services/slack/notify-reconciliation.service.js.map +1 -1
  197. package/dist/backend/backend/src/services/slack/slack-orchestrator-bridge.d.ts +21 -2
  198. package/dist/backend/backend/src/services/slack/slack-orchestrator-bridge.d.ts.map +1 -1
  199. package/dist/backend/backend/src/services/slack/slack-orchestrator-bridge.js +120 -46
  200. package/dist/backend/backend/src/services/slack/slack-orchestrator-bridge.js.map +1 -1
  201. package/dist/backend/backend/src/services/slack/slack.service.d.ts.map +1 -1
  202. package/dist/backend/backend/src/services/slack/slack.service.js +49 -0
  203. package/dist/backend/backend/src/services/slack/slack.service.js.map +1 -1
  204. package/dist/backend/backend/src/services/task-pool/task-pool.service.d.ts +33 -2
  205. package/dist/backend/backend/src/services/task-pool/task-pool.service.d.ts.map +1 -1
  206. package/dist/backend/backend/src/services/task-pool/task-pool.service.js +160 -8
  207. package/dist/backend/backend/src/services/task-pool/task-pool.service.js.map +1 -1
  208. package/dist/backend/backend/src/services/v3/cascade-request-status.d.ts.map +1 -1
  209. package/dist/backend/backend/src/services/v3/cascade-request-status.js +55 -2
  210. package/dist/backend/backend/src/services/v3/cascade-request-status.js.map +1 -1
  211. package/dist/backend/backend/src/services/v3/mission-executor.service.d.ts.map +1 -1
  212. package/dist/backend/backend/src/services/v3/mission-executor.service.js +9 -1
  213. package/dist/backend/backend/src/services/v3/mission-executor.service.js.map +1 -1
  214. package/dist/backend/backend/src/services/v3/request-decompose.subscriber.d.ts.map +1 -1
  215. package/dist/backend/backend/src/services/v3/request-decompose.subscriber.js +28 -3
  216. package/dist/backend/backend/src/services/v3/request-decompose.subscriber.js.map +1 -1
  217. package/dist/backend/backend/src/services/v3/request-sla.subscriber.d.ts.map +1 -1
  218. package/dist/backend/backend/src/services/v3/request-sla.subscriber.js +5 -2
  219. package/dist/backend/backend/src/services/v3/request-sla.subscriber.js.map +1 -1
  220. package/dist/backend/backend/src/services/v3/request-status-update.subscriber.d.ts.map +1 -1
  221. package/dist/backend/backend/src/services/v3/request-status-update.subscriber.js +57 -15
  222. package/dist/backend/backend/src/services/v3/request-status-update.subscriber.js.map +1 -1
  223. package/dist/backend/backend/src/services/v3/trigger-engine.service.d.ts +39 -0
  224. package/dist/backend/backend/src/services/v3/trigger-engine.service.d.ts.map +1 -1
  225. package/dist/backend/backend/src/services/v3/trigger-engine.service.js +81 -0
  226. package/dist/backend/backend/src/services/v3/trigger-engine.service.js.map +1 -1
  227. package/dist/backend/backend/src/services/v3/workitem-dispatch.subscriber.d.ts +17 -1
  228. package/dist/backend/backend/src/services/v3/workitem-dispatch.subscriber.d.ts.map +1 -1
  229. package/dist/backend/backend/src/services/v3/workitem-dispatch.subscriber.js +22 -3
  230. package/dist/backend/backend/src/services/v3/workitem-dispatch.subscriber.js.map +1 -1
  231. package/dist/backend/backend/src/services/whatsapp/whatsapp-orchestrator-bridge.d.ts +1 -1
  232. package/dist/backend/backend/src/services/whatsapp/whatsapp-orchestrator-bridge.d.ts.map +1 -1
  233. package/dist/backend/backend/src/services/whatsapp/whatsapp-orchestrator-bridge.js +26 -10
  234. package/dist/backend/backend/src/services/whatsapp/whatsapp-orchestrator-bridge.js.map +1 -1
  235. package/dist/backend/backend/src/services/workflow/cron-task.service.d.ts.map +1 -1
  236. package/dist/backend/backend/src/services/workflow/cron-task.service.js +68 -5
  237. package/dist/backend/backend/src/services/workflow/cron-task.service.js.map +1 -1
  238. package/dist/backend/backend/src/services/workflow/team-identifier-resolver.d.ts +44 -0
  239. package/dist/backend/backend/src/services/workflow/team-identifier-resolver.d.ts.map +1 -0
  240. package/dist/backend/backend/src/services/workflow/team-identifier-resolver.js +57 -0
  241. package/dist/backend/backend/src/services/workflow/team-identifier-resolver.js.map +1 -0
  242. package/dist/backend/backend/src/types/credential.types.d.ts +17 -1
  243. package/dist/backend/backend/src/types/credential.types.d.ts.map +1 -1
  244. package/dist/backend/backend/src/types/credential.types.js +15 -5
  245. package/dist/backend/backend/src/types/credential.types.js.map +1 -1
  246. package/dist/backend/backend/src/types/cron-task.types.d.ts +17 -0
  247. package/dist/backend/backend/src/types/cron-task.types.d.ts.map +1 -1
  248. package/dist/backend/backend/src/types/event-bus.types.d.ts +1 -1
  249. package/dist/backend/backend/src/types/event-bus.types.d.ts.map +1 -1
  250. package/dist/backend/backend/src/types/event-bus.types.js +12 -0
  251. package/dist/backend/backend/src/types/event-bus.types.js.map +1 -1
  252. package/dist/backend/backend/src/types/intent-task.types.d.ts +10 -13
  253. package/dist/backend/backend/src/types/intent-task.types.d.ts.map +1 -1
  254. package/dist/backend/backend/src/types/intent-task.types.js +4 -1
  255. package/dist/backend/backend/src/types/intent-task.types.js.map +1 -1
  256. package/dist/backend/backend/src/types/memory.types.d.ts +94 -1
  257. package/dist/backend/backend/src/types/memory.types.d.ts.map +1 -1
  258. package/dist/backend/backend/src/types/memory.types.js.map +1 -1
  259. package/dist/backend/backend/src/types/v2/work-item.types.d.ts +23 -0
  260. package/dist/backend/backend/src/types/v2/work-item.types.d.ts.map +1 -1
  261. package/dist/backend/backend/src/types/v2/work-item.types.js.map +1 -1
  262. package/dist/backend/backend/src/utils/team.utils.d.ts +3 -1
  263. package/dist/backend/backend/src/utils/team.utils.d.ts.map +1 -1
  264. package/dist/backend/backend/src/utils/team.utils.js +26 -5
  265. package/dist/backend/backend/src/utils/team.utils.js.map +1 -1
  266. package/dist/backend/backend/src/websocket/chat-v2.gateway.d.ts +23 -0
  267. package/dist/backend/backend/src/websocket/chat-v2.gateway.d.ts.map +1 -1
  268. package/dist/backend/backend/src/websocket/chat-v2.gateway.js +56 -7
  269. package/dist/backend/backend/src/websocket/chat-v2.gateway.js.map +1 -1
  270. package/dist/backend/backend/src/websocket/chat.gateway.d.ts +19 -4
  271. package/dist/backend/backend/src/websocket/chat.gateway.d.ts.map +1 -1
  272. package/dist/backend/backend/src/websocket/chat.gateway.js +78 -63
  273. package/dist/backend/backend/src/websocket/chat.gateway.js.map +1 -1
  274. package/dist/backend/backend/src/websocket/terminal.gateway.d.ts.map +1 -1
  275. package/dist/backend/backend/src/websocket/terminal.gateway.js +10 -2
  276. package/dist/backend/backend/src/websocket/terminal.gateway.js.map +1 -1
  277. package/dist/backend/config/constants.d.ts +2 -0
  278. package/dist/backend/config/constants.d.ts.map +1 -1
  279. package/dist/backend/config/constants.js +2 -0
  280. package/dist/backend/config/constants.js.map +1 -1
  281. package/dist/backend/config/index.d.ts +1 -0
  282. package/dist/backend/config/index.d.ts.map +1 -1
  283. package/dist/cli/backend/src/constants.d.ts +13 -0
  284. package/dist/cli/backend/src/constants.d.ts.map +1 -1
  285. package/dist/cli/backend/src/constants.js +12 -0
  286. package/dist/cli/backend/src/constants.js.map +1 -1
  287. package/dist/cli/backend/src/services/event-bus/event-bus.service.d.ts.map +1 -1
  288. package/dist/cli/backend/src/services/event-bus/event-bus.service.js +22 -11
  289. package/dist/cli/backend/src/services/event-bus/event-bus.service.js.map +1 -1
  290. package/dist/cli/backend/src/services/mcp-server.d.ts.map +1 -1
  291. package/dist/cli/backend/src/services/mcp-server.js +5 -0
  292. package/dist/cli/backend/src/services/mcp-server.js.map +1 -1
  293. package/dist/cli/backend/src/services/mcp-tool-definitions.d.ts +4 -0
  294. package/dist/cli/backend/src/services/mcp-tool-definitions.d.ts.map +1 -1
  295. package/dist/cli/backend/src/services/mcp-tool-definitions.js +12 -1
  296. package/dist/cli/backend/src/services/mcp-tool-definitions.js.map +1 -1
  297. package/dist/cli/backend/src/services/memory/memory.service.d.ts +22 -1
  298. package/dist/cli/backend/src/services/memory/memory.service.d.ts.map +1 -1
  299. package/dist/cli/backend/src/services/memory/memory.service.js +81 -3
  300. package/dist/cli/backend/src/services/memory/memory.service.js.map +1 -1
  301. package/dist/cli/backend/src/services/memory/project-memory.service.d.ts +25 -1
  302. package/dist/cli/backend/src/services/memory/project-memory.service.d.ts.map +1 -1
  303. package/dist/cli/backend/src/services/memory/project-memory.service.js +43 -0
  304. package/dist/cli/backend/src/services/memory/project-memory.service.js.map +1 -1
  305. package/dist/cli/backend/src/services/skill/skill-executor.service.d.ts.map +1 -1
  306. package/dist/cli/backend/src/services/skill/skill-executor.service.js +13 -1
  307. package/dist/cli/backend/src/services/skill/skill-executor.service.js.map +1 -1
  308. package/dist/cli/backend/src/services/task-pool/task-pool.service.d.ts +33 -2
  309. package/dist/cli/backend/src/services/task-pool/task-pool.service.d.ts.map +1 -1
  310. package/dist/cli/backend/src/services/task-pool/task-pool.service.js +160 -8
  311. package/dist/cli/backend/src/services/task-pool/task-pool.service.js.map +1 -1
  312. package/dist/cli/backend/src/types/credential.types.d.ts +17 -1
  313. package/dist/cli/backend/src/types/credential.types.d.ts.map +1 -1
  314. package/dist/cli/backend/src/types/credential.types.js +15 -5
  315. package/dist/cli/backend/src/types/credential.types.js.map +1 -1
  316. package/dist/cli/backend/src/types/event-bus.types.d.ts +1 -1
  317. package/dist/cli/backend/src/types/event-bus.types.d.ts.map +1 -1
  318. package/dist/cli/backend/src/types/event-bus.types.js +12 -0
  319. package/dist/cli/backend/src/types/event-bus.types.js.map +1 -1
  320. package/dist/cli/backend/src/types/memory.types.d.ts +94 -1
  321. package/dist/cli/backend/src/types/memory.types.d.ts.map +1 -1
  322. package/dist/cli/backend/src/types/memory.types.js.map +1 -1
  323. package/dist/cli/backend/src/types/v2/work-item.types.d.ts +23 -0
  324. package/dist/cli/backend/src/types/v2/work-item.types.d.ts.map +1 -1
  325. package/dist/cli/backend/src/types/v2/work-item.types.js.map +1 -1
  326. package/dist/cli/cli/src/commands/start.js +73 -12
  327. package/dist/cli/cli/src/commands/start.js.map +1 -1
  328. package/dist/cli/config/constants.d.ts +2 -0
  329. package/dist/cli/config/constants.d.ts.map +1 -1
  330. package/dist/cli/config/constants.js +2 -0
  331. package/dist/cli/config/constants.js.map +1 -1
  332. package/dist/cli/config/index.d.ts +1 -0
  333. package/dist/cli/config/index.d.ts.map +1 -1
  334. package/frontend/dist/assets/index-b279da34.js +4926 -0
  335. package/frontend/dist/assets/{index-b7e59b2b.css → index-c07e04c0.css} +2 -2
  336. package/frontend/dist/index.html +2 -2
  337. package/package.json +1 -1
  338. package/frontend/dist/assets/index-698305f3.js +0 -5228
@@ -0,0 +1,47 @@
1
+ /**
2
+ * Task History Seeder
3
+ *
4
+ * Seeds the project task-history ledger with synthetic "declared"
5
+ * entries when a team member registers. Solves the cold-start problem
6
+ * for capability routing: on day-0, no real tasks have run yet, but
7
+ * the team config can still declare what capabilities each member
8
+ * holds, and the orchestrator's `recall(capability)` query finds them.
9
+ *
10
+ * The convention: a `TeamMember.capabilities` entry counts as a
11
+ * canonical capability when it contains a `:` separator (e.g.
12
+ * `gmail:read`, `oauth:gmail`). Free-form strings without `:` are
13
+ * ignored — they aren't part of the routing vocabulary.
14
+ *
15
+ * @module services/memory/task-history-seeder
16
+ */
17
+ import { IProjectMemoryService } from './project-memory.service.js';
18
+ export interface SeedDeclaredCapabilitiesArgs {
19
+ projectPath: string;
20
+ member: {
21
+ sessionName: string;
22
+ role: string;
23
+ teamId?: string;
24
+ capabilities?: string[];
25
+ };
26
+ projectMemory: IProjectMemoryService;
27
+ /** Optional clock for tests; defaults to Date.now() */
28
+ now?: () => Date;
29
+ }
30
+ /**
31
+ * Filter a free-form `capabilities[]` array down to the entries that
32
+ * look like canonical capability strings. Exported for unit testing.
33
+ */
34
+ export declare function pickCanonicalCapabilities(raw: readonly string[] | undefined): string[];
35
+ /**
36
+ * Emit a single synthetic `outcome: 'declared'` entry capturing every
37
+ * canonical capability the member declares. One entry per registration,
38
+ * keyed `th-declared-<sessionName>` so re-registration dedups cleanly
39
+ * (the entry is overwritten in place when the same id arrives — see
40
+ * ProjectMemoryService.addTaskHistory).
41
+ *
42
+ * No-op if the member has no canonical capabilities to declare.
43
+ *
44
+ * @returns The entry id if one was written, or null when skipped.
45
+ */
46
+ export declare function seedDeclaredCapabilities(args: SeedDeclaredCapabilitiesArgs): Promise<string | null>;
47
+ //# sourceMappingURL=task-history-seeder.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"task-history-seeder.d.ts","sourceRoot":"","sources":["../../../../../../backend/src/services/memory/task-history-seeder.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AAEH,OAAO,EAAE,qBAAqB,EAAE,MAAM,6BAA6B,CAAC;AAMpE,MAAM,WAAW,4BAA4B;IAC3C,WAAW,EAAE,MAAM,CAAC;IACpB,MAAM,EAAE;QACN,WAAW,EAAE,MAAM,CAAC;QACpB,IAAI,EAAE,MAAM,CAAC;QACb,MAAM,CAAC,EAAE,MAAM,CAAC;QAChB,YAAY,CAAC,EAAE,MAAM,EAAE,CAAC;KACzB,CAAC;IACF,aAAa,EAAE,qBAAqB,CAAC;IACrC,uDAAuD;IACvD,GAAG,CAAC,EAAE,MAAM,IAAI,CAAC;CAClB;AAED;;;GAGG;AACH,wBAAgB,yBAAyB,CAAC,GAAG,EAAE,SAAS,MAAM,EAAE,GAAG,SAAS,GAAG,MAAM,EAAE,CAYtF;AAED;;;;;;;;;;GAUG;AACH,wBAAsB,wBAAwB,CAC5C,IAAI,EAAE,4BAA4B,GACjC,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAsCxB"}
@@ -0,0 +1,89 @@
1
+ /**
2
+ * Task History Seeder
3
+ *
4
+ * Seeds the project task-history ledger with synthetic "declared"
5
+ * entries when a team member registers. Solves the cold-start problem
6
+ * for capability routing: on day-0, no real tasks have run yet, but
7
+ * the team config can still declare what capabilities each member
8
+ * holds, and the orchestrator's `recall(capability)` query finds them.
9
+ *
10
+ * The convention: a `TeamMember.capabilities` entry counts as a
11
+ * canonical capability when it contains a `:` separator (e.g.
12
+ * `gmail:read`, `oauth:gmail`). Free-form strings without `:` are
13
+ * ignored — they aren't part of the routing vocabulary.
14
+ *
15
+ * @module services/memory/task-history-seeder
16
+ */
17
+ import { LoggerService } from '../core/logger.service.js';
18
+ const logger = LoggerService.getInstance().createComponentLogger('TaskHistorySeeder');
19
+ /**
20
+ * Filter a free-form `capabilities[]` array down to the entries that
21
+ * look like canonical capability strings. Exported for unit testing.
22
+ */
23
+ export function pickCanonicalCapabilities(raw) {
24
+ if (!raw || raw.length === 0)
25
+ return [];
26
+ const seen = new Set();
27
+ for (const c of raw) {
28
+ if (typeof c !== 'string')
29
+ continue;
30
+ const trimmed = c.trim();
31
+ if (!trimmed.includes(':'))
32
+ continue;
33
+ const [left, right] = trimmed.split(':', 2);
34
+ if (!left || !right)
35
+ continue;
36
+ seen.add(trimmed);
37
+ }
38
+ return [...seen];
39
+ }
40
+ /**
41
+ * Emit a single synthetic `outcome: 'declared'` entry capturing every
42
+ * canonical capability the member declares. One entry per registration,
43
+ * keyed `th-declared-<sessionName>` so re-registration dedups cleanly
44
+ * (the entry is overwritten in place when the same id arrives — see
45
+ * ProjectMemoryService.addTaskHistory).
46
+ *
47
+ * No-op if the member has no canonical capabilities to declare.
48
+ *
49
+ * @returns The entry id if one was written, or null when skipped.
50
+ */
51
+ export async function seedDeclaredCapabilities(args) {
52
+ const canonical = pickCanonicalCapabilities(args.member.capabilities);
53
+ if (canonical.length === 0) {
54
+ return null;
55
+ }
56
+ const now = (args.now ?? (() => new Date()))().toISOString();
57
+ const entry = {
58
+ id: `th-declared-${args.member.sessionName}`,
59
+ completedAt: now,
60
+ agent: {
61
+ sessionName: args.member.sessionName,
62
+ role: args.member.role,
63
+ teamId: args.member.teamId,
64
+ },
65
+ task: {
66
+ description: 'Self-declared capabilities at register_self',
67
+ outcome: 'declared',
68
+ },
69
+ capabilities: canonical,
70
+ toolsUsed: [],
71
+ };
72
+ try {
73
+ await args.projectMemory.addTaskHistory(args.projectPath, entry);
74
+ logger.info('Seeded declared capabilities', {
75
+ sessionName: args.member.sessionName,
76
+ count: canonical.length,
77
+ });
78
+ return entry.id;
79
+ }
80
+ catch (err) {
81
+ // Non-fatal — registration must succeed even if memory write fails.
82
+ logger.warn('Failed to seed declared capabilities (non-fatal)', {
83
+ sessionName: args.member.sessionName,
84
+ error: err instanceof Error ? err.message : String(err),
85
+ });
86
+ return null;
87
+ }
88
+ }
89
+ //# sourceMappingURL=task-history-seeder.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"task-history-seeder.js","sourceRoot":"","sources":["../../../../../../backend/src/services/memory/task-history-seeder.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AAIH,OAAO,EAAE,aAAa,EAAE,MAAM,2BAA2B,CAAC;AAE1D,MAAM,MAAM,GAAG,aAAa,CAAC,WAAW,EAAE,CAAC,qBAAqB,CAAC,mBAAmB,CAAC,CAAC;AAetF;;;GAGG;AACH,MAAM,UAAU,yBAAyB,CAAC,GAAkC;IAC1E,IAAI,CAAC,GAAG,IAAI,GAAG,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,EAAE,CAAC;IACxC,MAAM,IAAI,GAAG,IAAI,GAAG,EAAU,CAAC;IAC/B,KAAK,MAAM,CAAC,IAAI,GAAG,EAAE,CAAC;QACpB,IAAI,OAAO,CAAC,KAAK,QAAQ;YAAE,SAAS;QACpC,MAAM,OAAO,GAAG,CAAC,CAAC,IAAI,EAAE,CAAC;QACzB,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAC;YAAE,SAAS;QACrC,MAAM,CAAC,IAAI,EAAE,KAAK,CAAC,GAAG,OAAO,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC;QAC5C,IAAI,CAAC,IAAI,IAAI,CAAC,KAAK;YAAE,SAAS;QAC9B,IAAI,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;IACpB,CAAC;IACD,OAAO,CAAC,GAAG,IAAI,CAAC,CAAC;AACnB,CAAC;AAED;;;;;;;;;;GAUG;AACH,MAAM,CAAC,KAAK,UAAU,wBAAwB,CAC5C,IAAkC;IAElC,MAAM,SAAS,GAAG,yBAAyB,CAAC,IAAI,CAAC,MAAM,CAAC,YAAY,CAAC,CAAC;IACtE,IAAI,SAAS,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAC3B,OAAO,IAAI,CAAC;IACd,CAAC;IAED,MAAM,GAAG,GAAG,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC,IAAI,IAAI,EAAE,CAAC,CAAC,EAAE,CAAC,WAAW,EAAE,CAAC;IAC7D,MAAM,KAAK,GAAqB;QAC9B,EAAE,EAAE,eAAe,IAAI,CAAC,MAAM,CAAC,WAAW,EAAE;QAC5C,WAAW,EAAE,GAAG;QAChB,KAAK,EAAE;YACL,WAAW,EAAE,IAAI,CAAC,MAAM,CAAC,WAAW;YACpC,IAAI,EAAE,IAAI,CAAC,MAAM,CAAC,IAAI;YACtB,MAAM,EAAE,IAAI,CAAC,MAAM,CAAC,MAAM;SAC3B;QACD,IAAI,EAAE;YACJ,WAAW,EAAE,6CAA6C;YAC1D,OAAO,EAAE,UAAU;SACpB;QACD,YAAY,EAAE,SAAS;QACvB,SAAS,EAAE,EAAE;KACd,CAAC;IAEF,IAAI,CAAC;QACH,MAAM,IAAI,CAAC,aAAa,CAAC,cAAc,CAAC,IAAI,CAAC,WAAW,EAAE,KAAK,CAAC,CAAC;QACjE,MAAM,CAAC,IAAI,CAAC,8BAA8B,EAAE;YAC1C,WAAW,EAAE,IAAI,CAAC,MAAM,CAAC,WAAW;YACpC,KAAK,EAAE,SAAS,CAAC,MAAM;SACxB,CAAC,CAAC;QACH,OAAO,KAAK,CAAC,EAAE,CAAC;IAClB,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,oEAAoE;QACpE,MAAM,CAAC,IAAI,CAAC,kDAAkD,EAAE;YAC9D,WAAW,EAAE,IAAI,CAAC,MAAM,CAAC,WAAW;YACpC,KAAK,EAAE,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC;SACxD,CAAC,CAAC;QACH,OAAO,IAAI,CAAC;IACd,CAAC;AACH,CAAC"}
@@ -0,0 +1,76 @@
1
+ /**
2
+ * Task History Subscriber
3
+ *
4
+ * Listens on the in-process EventBus for `task:done_by_worker`,
5
+ * `task:rejected`, and `task:cancelled` and writes a {@link
6
+ * TaskHistoryEntry} into the originating project's `ProjectMemory`.
7
+ *
8
+ * This is the load-bearing write path behind "who in my team has done
9
+ * X?" — the orchestrator queries the resulting ledger via
10
+ * `recall_memory({ capability: '<canonical-cap>' })` before delegating
11
+ * external-access work.
12
+ *
13
+ * @module services/memory/task-history.subscriber
14
+ */
15
+ import { EventBusService, type InProcessUnsubscribe } from '../event-bus/event-bus.service.js';
16
+ import { TaskPoolService } from '../task-pool/task-pool.service.js';
17
+ import { IProjectMemoryService } from './project-memory.service.js';
18
+ import { AgentEvent } from '../../types/event-bus.types.js';
19
+ import { CapabilityInferenceService } from './capability-inference.js';
20
+ export interface TaskHistorySubscriberDeps {
21
+ /** Bus to listen on */
22
+ eventBus: EventBusService;
23
+ /** Memory service that owns the ledger */
24
+ projectMemoryService: IProjectMemoryService;
25
+ /** Pool service used to resolve the WorkItem from id (description, type, etc.) */
26
+ taskPoolService: TaskPoolService;
27
+ /** Optional override for capability inference (tests pass a stub) */
28
+ capabilityInference?: CapabilityInferenceService;
29
+ /**
30
+ * Optional override for the project path resolver. Production uses the
31
+ * WorkItem's `metadata.projectPath`; tests can substitute a fixed path.
32
+ */
33
+ resolveProjectPath?: (event: AgentEvent) => string | null;
34
+ }
35
+ export declare class TaskHistorySubscriber {
36
+ private readonly logger;
37
+ private readonly eventBus;
38
+ private readonly projectMemory;
39
+ private readonly taskPool;
40
+ private readonly inference;
41
+ private readonly resolveProjectPath;
42
+ private unsubscribeFn;
43
+ constructor(deps: TaskHistorySubscriberDeps);
44
+ /**
45
+ * Attach the in-process handler. Returns a detach function. Idempotent —
46
+ * calling start() twice without intervening stop() returns the first
47
+ * detach function (the second start is a no-op).
48
+ */
49
+ start(): InProcessUnsubscribe;
50
+ /**
51
+ * Detach the handler. Safe to call multiple times.
52
+ */
53
+ stop(): void;
54
+ /**
55
+ * Handle one event. Public for unit testing — production flow goes
56
+ * through the bus.
57
+ */
58
+ handle(event: AgentEvent): Promise<void>;
59
+ }
60
+ /**
61
+ * Default resolver: lift `metadata.projectPath` off the WorkItem. The
62
+ * subscriber prefers the event's own projectPath if present, then falls
63
+ * back to the WorkItem's. Returns null when neither is set.
64
+ *
65
+ * Exported for unit testing.
66
+ */
67
+ export declare function defaultResolveProjectPath(event: AgentEvent): string | null;
68
+ /**
69
+ * Extract the tool names invoked during the task from the WorkItem's
70
+ * metadata. Tries `metadata.toolsUsed` (canonical), `metadata.tools`
71
+ * (legacy), and an empty list as a last resort.
72
+ *
73
+ * Exported for unit testing.
74
+ */
75
+ export declare function extractToolsUsed(workItem: Record<string, unknown>): string[];
76
+ //# sourceMappingURL=task-history.subscriber.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"task-history.subscriber.d.ts","sourceRoot":"","sources":["../../../../../../backend/src/services/memory/task-history.subscriber.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAEH,OAAO,EACL,eAAe,EACf,KAAK,oBAAoB,EAC1B,MAAM,mCAAmC,CAAC;AAC3C,OAAO,EAAE,eAAe,EAAE,MAAM,mCAAmC,CAAC;AACpE,OAAO,EAAE,qBAAqB,EAAE,MAAM,6BAA6B,CAAC;AAKpE,OAAO,EACL,UAAU,EAEX,MAAM,gCAAgC,CAAC;AAExC,OAAO,EACL,0BAA0B,EAE3B,MAAM,2BAA2B,CAAC;AA6BnC,MAAM,WAAW,yBAAyB;IACxC,uBAAuB;IACvB,QAAQ,EAAE,eAAe,CAAC;IAC1B,0CAA0C;IAC1C,oBAAoB,EAAE,qBAAqB,CAAC;IAC5C,kFAAkF;IAClF,eAAe,EAAE,eAAe,CAAC;IACjC,qEAAqE;IACrE,mBAAmB,CAAC,EAAE,0BAA0B,CAAC;IACjD;;;OAGG;IACH,kBAAkB,CAAC,EAAE,CAAC,KAAK,EAAE,UAAU,KAAK,MAAM,GAAG,IAAI,CAAC;CAC3D;AAED,qBAAa,qBAAqB;IAChC,OAAO,CAAC,QAAQ,CAAC,MAAM,CAErB;IACF,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAkB;IAC3C,OAAO,CAAC,QAAQ,CAAC,aAAa,CAAwB;IACtD,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAkB;IAC3C,OAAO,CAAC,QAAQ,CAAC,SAAS,CAA6B;IACvD,OAAO,CAAC,QAAQ,CAAC,kBAAkB,CAAuC;IAC1E,OAAO,CAAC,aAAa,CAAqC;gBAE9C,IAAI,EAAE,yBAAyB;IAQ3C;;;;OAIG;IACH,KAAK,IAAI,oBAAoB;IAe7B;;OAEG;IACH,IAAI,IAAI,IAAI;IAQZ;;;OAGG;IACG,MAAM,CAAC,KAAK,EAAE,UAAU,GAAG,OAAO,CAAC,IAAI,CAAC;CAoF/C;AAED;;;;;;GAMG;AACH,wBAAgB,yBAAyB,CAAC,KAAK,EAAE,UAAU,GAAG,MAAM,GAAG,IAAI,CAQ1E;AAED;;;;;;GAMG;AACH,wBAAgB,gBAAgB,CAAC,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,MAAM,EAAE,CAY5E"}
@@ -0,0 +1,199 @@
1
+ /**
2
+ * Task History Subscriber
3
+ *
4
+ * Listens on the in-process EventBus for `task:done_by_worker`,
5
+ * `task:rejected`, and `task:cancelled` and writes a {@link
6
+ * TaskHistoryEntry} into the originating project's `ProjectMemory`.
7
+ *
8
+ * This is the load-bearing write path behind "who in my team has done
9
+ * X?" — the orchestrator queries the resulting ledger via
10
+ * `recall_memory({ capability: '<canonical-cap>' })` before delegating
11
+ * external-access work.
12
+ *
13
+ * @module services/memory/task-history.subscriber
14
+ */
15
+ import { LoggerService } from '../core/logger.service.js';
16
+ import { inferCapabilities, } from './capability-inference.js';
17
+ /** Event types we record. Symmetric across success/failure/cancellation. */
18
+ const RECORDED_EVENT_TYPES = [
19
+ 'task:done_by_worker',
20
+ 'task:rejected',
21
+ 'task:cancelled',
22
+ ];
23
+ /**
24
+ * Map task pool event types → TaskOutcome. Done-by-worker is the
25
+ * success path; rejected is verifier-driven failure; cancelled is
26
+ * lifecycle abandonment (which we record as `partial` so the
27
+ * capability-index can still surface "the agent attempted this kind
28
+ * of work" without misleading on success rates).
29
+ */
30
+ function eventTypeToOutcome(eventType) {
31
+ switch (eventType) {
32
+ case 'task:done_by_worker':
33
+ return 'success';
34
+ case 'task:rejected':
35
+ return 'failure';
36
+ case 'task:cancelled':
37
+ return 'partial';
38
+ default:
39
+ return 'partial';
40
+ }
41
+ }
42
+ export class TaskHistorySubscriber {
43
+ logger = LoggerService.getInstance().createComponentLogger('TaskHistorySubscriber');
44
+ eventBus;
45
+ projectMemory;
46
+ taskPool;
47
+ inference;
48
+ resolveProjectPath;
49
+ unsubscribeFn = null;
50
+ constructor(deps) {
51
+ this.eventBus = deps.eventBus;
52
+ this.projectMemory = deps.projectMemoryService;
53
+ this.taskPool = deps.taskPoolService;
54
+ this.inference = deps.capabilityInference ?? { infer: inferCapabilities };
55
+ this.resolveProjectPath = deps.resolveProjectPath ?? defaultResolveProjectPath;
56
+ }
57
+ /**
58
+ * Attach the in-process handler. Returns a detach function. Idempotent —
59
+ * calling start() twice without intervening stop() returns the first
60
+ * detach function (the second start is a no-op).
61
+ */
62
+ start() {
63
+ if (this.unsubscribeFn) {
64
+ this.logger.debug('start() called while already attached — returning existing detach');
65
+ return this.unsubscribeFn;
66
+ }
67
+ this.unsubscribeFn = this.eventBus.onInProcess([...RECORDED_EVENT_TYPES], (event) => this.handle(event));
68
+ this.logger.info('TaskHistorySubscriber attached', {
69
+ types: RECORDED_EVENT_TYPES,
70
+ });
71
+ return this.unsubscribeFn;
72
+ }
73
+ /**
74
+ * Detach the handler. Safe to call multiple times.
75
+ */
76
+ stop() {
77
+ if (this.unsubscribeFn) {
78
+ this.unsubscribeFn();
79
+ this.unsubscribeFn = null;
80
+ this.logger.info('TaskHistorySubscriber detached');
81
+ }
82
+ }
83
+ /**
84
+ * Handle one event. Public for unit testing — production flow goes
85
+ * through the bus.
86
+ */
87
+ async handle(event) {
88
+ try {
89
+ const workItemId = event.workItemId;
90
+ if (!workItemId) {
91
+ this.logger.debug('Event has no workItemId — skipping', {
92
+ eventId: event.id,
93
+ type: event.type,
94
+ });
95
+ return;
96
+ }
97
+ const workItem = await this.taskPool.findWorkItem(workItemId);
98
+ if (!workItem) {
99
+ this.logger.debug('WorkItem not found in pool — skipping', { workItemId });
100
+ return;
101
+ }
102
+ const projectPath = this.resolveProjectPath(event);
103
+ if (!projectPath) {
104
+ this.logger.debug('No projectPath resolvable — skipping', {
105
+ workItemId,
106
+ eventId: event.id,
107
+ });
108
+ return;
109
+ }
110
+ const sessionName = event.sessionName ||
111
+ workItem.target ||
112
+ workItem.owner ||
113
+ '';
114
+ if (!sessionName) {
115
+ this.logger.debug('No session attributable — skipping', { workItemId });
116
+ return;
117
+ }
118
+ const role = workItem.metadata?.['role'] ?? 'unknown';
119
+ const teamId = workItem.metadata?.['teamId'] ||
120
+ event.teamId ||
121
+ undefined;
122
+ const description = workItem.title ||
123
+ workItem.briefMarkdown?.slice(0, 200) ||
124
+ '(no description)';
125
+ // Cast through unknown: WorkItem is a richer typed shape, but the
126
+ // helpers only need free-form metadata access. Avoids importing
127
+ // WorkItem's type just to widen it.
128
+ const workItemAsRecord = workItem;
129
+ const toolsUsed = extractToolsUsed(workItemAsRecord);
130
+ const capabilities = this.inference.infer(toolsUsed, workItemAsRecord);
131
+ const entry = {
132
+ id: `th-${workItemId}`,
133
+ completedAt: event.timestamp || new Date().toISOString(),
134
+ agent: { sessionName, role, teamId },
135
+ task: {
136
+ description,
137
+ outcome: eventTypeToOutcome(event.type),
138
+ },
139
+ capabilities,
140
+ toolsUsed,
141
+ taskId: workItemId,
142
+ };
143
+ await this.projectMemory.addTaskHistory(projectPath, entry);
144
+ this.logger.info('Task history recorded', {
145
+ workItemId,
146
+ sessionName,
147
+ outcome: entry.task.outcome,
148
+ capCount: capabilities.length,
149
+ });
150
+ }
151
+ catch (err) {
152
+ // Subscribers MUST swallow exceptions — a memory-write failure
153
+ // cannot back out the upstream task completion.
154
+ this.logger.warn('Failed to record task history (non-fatal)', {
155
+ eventId: event.id,
156
+ eventType: event.type,
157
+ error: err instanceof Error ? err.message : String(err),
158
+ });
159
+ }
160
+ }
161
+ }
162
+ /**
163
+ * Default resolver: lift `metadata.projectPath` off the WorkItem. The
164
+ * subscriber prefers the event's own projectPath if present, then falls
165
+ * back to the WorkItem's. Returns null when neither is set.
166
+ *
167
+ * Exported for unit testing.
168
+ */
169
+ export function defaultResolveProjectPath(event) {
170
+ // AgentEvent doesn't have a typed projectPath field, but task-pool
171
+ // events sometimes ride one as a free-form attribute. Be defensive.
172
+ const eventPath = event['projectPath'];
173
+ if (typeof eventPath === 'string' && eventPath.length > 0) {
174
+ return eventPath;
175
+ }
176
+ return null;
177
+ }
178
+ /**
179
+ * Extract the tool names invoked during the task from the WorkItem's
180
+ * metadata. Tries `metadata.toolsUsed` (canonical), `metadata.tools`
181
+ * (legacy), and an empty list as a last resort.
182
+ *
183
+ * Exported for unit testing.
184
+ */
185
+ export function extractToolsUsed(workItem) {
186
+ const metadata = workItem['metadata'];
187
+ if (!metadata)
188
+ return [];
189
+ const canonical = metadata['toolsUsed'];
190
+ if (Array.isArray(canonical)) {
191
+ return canonical.filter((t) => typeof t === 'string');
192
+ }
193
+ const legacy = metadata['tools'];
194
+ if (Array.isArray(legacy)) {
195
+ return legacy.filter((t) => typeof t === 'string');
196
+ }
197
+ return [];
198
+ }
199
+ //# sourceMappingURL=task-history.subscriber.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"task-history.subscriber.js","sourceRoot":"","sources":["../../../../../../backend/src/services/memory/task-history.subscriber.ts"],"names":[],"mappings":"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"}
@@ -19,7 +19,6 @@
19
19
  * @module services/messaging/message-replay
20
20
  */
21
21
  import type { MessageQueueService } from './message-queue.service.js';
22
- import type { ChatService } from '../chat/chat.service.js';
23
22
  import type { ChatMessage } from '../../types/chat.types.js';
24
23
  /**
25
24
  * Result of a replay scan, containing details about what was found and replayed.
@@ -56,16 +55,15 @@ export interface ReplayResult {
56
55
  export declare class MessageReplayService {
57
56
  private logger;
58
57
  private messageQueueService;
59
- private chatService;
58
+ private chatV2;
60
59
  private crewlyHome;
61
60
  /**
62
61
  * Create a new MessageReplayService.
63
62
  *
64
63
  * @param messageQueueService - The message queue to enqueue replayed messages into
65
- * @param chatService - The chat service to scan for unreplied messages
66
64
  * @param crewlyHome - Path to the crewly home directory (e.g. ~/.crewly)
67
65
  */
68
- constructor(messageQueueService: MessageQueueService, chatService: ChatService, crewlyHome: string);
66
+ constructor(messageQueueService: MessageQueueService, crewlyHome: string);
69
67
  /**
70
68
  * Scan chat history for unreplied user messages and replay them into the queue.
71
69
  *
@@ -1 +1 @@
1
- {"version":3,"file":"message-replay.service.d.ts","sourceRoot":"","sources":["../../../../../../backend/src/services/messaging/message-replay.service.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;GAmBG;AAGH,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,4BAA4B,CAAC;AACtE,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,yBAAyB,CAAC;AAC3D,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,2BAA2B,CAAC;AAO7D;;GAEG;AACH,MAAM,WAAW,YAAY;IAC3B,yCAAyC;IACzC,UAAU,EAAE,MAAM,CAAC;IACnB,wEAAwE;IACxE,aAAa,EAAE,MAAM,CAAC;IACtB,4DAA4D;IAC5D,gBAAgB,EAAE,MAAM,CAAC;IACzB,4DAA4D;IAC5D,YAAY,EAAE,MAAM,CAAC;IACrB,4CAA4C;IAC5C,iBAAiB,EAAE,MAAM,CAAC;CAC3B;AAED;;;;;;;;;;;;;;;;GAgBG;AACH,qBAAa,oBAAoB;IAC/B,OAAO,CAAC,MAAM,CAAkB;IAChC,OAAO,CAAC,mBAAmB,CAAsB;IACjD,OAAO,CAAC,WAAW,CAAc;IACjC,OAAO,CAAC,UAAU,CAAS;IAE3B;;;;;;OAMG;gBAED,mBAAmB,EAAE,mBAAmB,EACxC,WAAW,EAAE,WAAW,EACxB,UAAU,EAAE,MAAM;IAQpB;;;;;;;OAOG;IACG,qBAAqB,IAAI,OAAO,CAAC,YAAY,CAAC;IAqKpD;;;;;OAKG;IACG,yBAAyB,IAAI,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC;IAWzD;;;;;;;OAOG;IACH,yBAAyB,CAAC,QAAQ,EAAE,WAAW,EAAE,GAAG,WAAW,EAAE;IAqBjE;;;;;;OAMG;IACH,OAAO,CAAC,kBAAkB;CAiB3B"}
1
+ {"version":3,"file":"message-replay.service.d.ts","sourceRoot":"","sources":["../../../../../../backend/src/services/messaging/message-replay.service.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;GAmBG;AAGH,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,4BAA4B,CAAC;AAQtE,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,2BAA2B,CAAC;AAO7D;;GAEG;AACH,MAAM,WAAW,YAAY;IAC3B,yCAAyC;IACzC,UAAU,EAAE,MAAM,CAAC;IACnB,wEAAwE;IACxE,aAAa,EAAE,MAAM,CAAC;IACtB,4DAA4D;IAC5D,gBAAgB,EAAE,MAAM,CAAC;IACzB,4DAA4D;IAC5D,YAAY,EAAE,MAAM,CAAC;IACrB,4CAA4C;IAC5C,iBAAiB,EAAE,MAAM,CAAC;CAC3B;AAED;;;;;;;;;;;;;;;;GAgBG;AACH,qBAAa,oBAAoB;IAC/B,OAAO,CAAC,MAAM,CAAkB;IAChC,OAAO,CAAC,mBAAmB,CAAsB;IACjD,OAAO,CAAC,MAAM,CAAgB;IAC9B,OAAO,CAAC,UAAU,CAAS;IAE3B;;;;;OAKG;gBAED,mBAAmB,EAAE,mBAAmB,EACxC,UAAU,EAAE,MAAM;IAQpB;;;;;;;OAOG;IACG,qBAAqB,IAAI,OAAO,CAAC,YAAY,CAAC;IAgLpD;;;;;OAKG;IACG,yBAAyB,IAAI,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC;IAWzD;;;;;;;OAOG;IACH,yBAAyB,CAAC,QAAQ,EAAE,WAAW,EAAE,GAAG,WAAW,EAAE;IAqBjE;;;;;;OAMG;IACH,OAAO,CAAC,kBAAkB;CAiB3B"}
@@ -19,6 +19,8 @@
19
19
  * @module services/messaging/message-replay
20
20
  */
21
21
  import { LoggerService } from '../core/logger.service.js';
22
+ import { getChatV2Service } from '../chat-v2/chat-v2.singleton.js';
23
+ import { SYSTEM_PRINCIPAL, v2MessageToLegacy, v2ChannelToLegacy, } from '../chat-v2/legacy-dto.utils.js';
22
24
  import { MESSAGE_REPLAY_CONSTANTS, MESSAGE_SOURCES } from '../../constants.js';
23
25
  import { safeReadJson } from '../../utils/file-io.utils.js';
24
26
  import { ThreadStatusQueueService } from './thread-status-queue.service.js';
@@ -44,19 +46,18 @@ import path from 'path';
44
46
  export class MessageReplayService {
45
47
  logger;
46
48
  messageQueueService;
47
- chatService;
49
+ chatV2;
48
50
  crewlyHome;
49
51
  /**
50
52
  * Create a new MessageReplayService.
51
53
  *
52
54
  * @param messageQueueService - The message queue to enqueue replayed messages into
53
- * @param chatService - The chat service to scan for unreplied messages
54
55
  * @param crewlyHome - Path to the crewly home directory (e.g. ~/.crewly)
55
56
  */
56
- constructor(messageQueueService, chatService, crewlyHome) {
57
+ constructor(messageQueueService, crewlyHome) {
57
58
  this.logger = LoggerService.getInstance().createComponentLogger('MessageReplay');
58
59
  this.messageQueueService = messageQueueService;
59
- this.chatService = chatService;
60
+ this.chatV2 = getChatV2Service();
60
61
  this.crewlyHome = crewlyHome;
61
62
  }
62
63
  /**
@@ -100,10 +101,11 @@ export class MessageReplayService {
100
101
  offlineDurationMs,
101
102
  replayWindowStart,
102
103
  });
103
- // Step 2: Get all active conversations
104
- const conversations = await this.chatService.getConversations({
105
- includeArchived: false,
106
- });
104
+ // Step 2: Get all active conversations (chat-v2 channels)
105
+ const conversations = this.chatV2
106
+ .listChannels({ principal: SYSTEM_PRINCIPAL })
107
+ .filter((c) => !c.archivedAt)
108
+ .map((c) => v2ChannelToLegacy(c, this.chatV2.countChannelMessages(c.id, SYSTEM_PRINCIPAL)));
107
109
  if (conversations.length === 0) {
108
110
  this.logger.debug('No active conversations found, skipping replay');
109
111
  return result;
@@ -114,11 +116,19 @@ export class MessageReplayService {
114
116
  // Step 4: Scan each conversation for unreplied user messages
115
117
  const unrepliedMessages = [];
116
118
  for (const conversation of conversations) {
117
- const messages = await this.chatService.getMessages({
118
- conversationId: conversation.id,
119
- after: replayWindowStart,
119
+ // Pull recent message page from chat-v2 then DTO-convert + filter
120
+ // by replayWindowStart locally (chat-v2's cursor pagination is
121
+ // by seq/created_at, but the legacy filter used an ISO date).
122
+ const v2Messages = this.chatV2.listMessages({
123
+ channelId: conversation.id,
124
+ principal: SYSTEM_PRINCIPAL,
120
125
  limit: 100,
121
- });
126
+ direction: 'forward',
127
+ }).messages;
128
+ const cutoffMs = new Date(replayWindowStart).getTime();
129
+ const messages = v2Messages
130
+ .filter((m) => m.createdAt >= cutoffMs)
131
+ .map(v2MessageToLegacy);
122
132
  // Find user messages that have no orchestrator reply after them
123
133
  const userMessages = this.findUnrepliedUserMessages(messages);
124
134
  for (const msg of userMessages) {
@@ -1 +1 @@
1
- {"version":3,"file":"message-replay.service.js","sourceRoot":"","sources":["../../../../../../backend/src/services/messaging/message-replay.service.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"message-replay.service.js","sourceRoot":"","sources":["../../../../../../backend/src/services/messaging/message-replay.service.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"queue-processor.service.d.ts","sourceRoot":"","sources":["../../../../../../backend/src/services/messaging/queue-processor.service.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"queue-processor.service.d.ts","sourceRoot":"","sources":["../../../../../../backend/src/services/messaging/queue-processor.service.ts"],"names":[],"mappings":"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"}
@@ -15,7 +15,7 @@
15
15
  */
16
16
  import { EventEmitter } from 'events';
17
17
  import { LoggerService } from '../core/logger.service.js';
18
- import { getChatService } from '../chat/chat.service.js';
18
+ import { getChatV2Service } from '../chat-v2/chat-v2.singleton.js';
19
19
  import { getTerminalGateway } from '../../websocket/terminal.gateway.js';
20
20
  import { MESSAGE_QUEUE_CONSTANTS, ORCHESTRATOR_SESSION_NAME, CHAT_ROUTING_CONSTANTS, EVENT_DELIVERY_CONSTANTS, RUNTIME_TYPES, ORCHESTRATOR_HEARTBEAT_CONSTANTS, MESSAGE_SOURCES, } from '../../constants.js';
21
21
  import { PtyActivityTrackerService } from '../agent/pty-activity-tracker.service.js';
@@ -346,8 +346,18 @@ export class QueueProcessorService extends EventEmitter {
346
346
  // Notify user in conversation
347
347
  if (message.source !== MESSAGE_SOURCES.SYSTEM_EVENT) {
348
348
  try {
349
- const chatService = getChatService();
350
- await chatService.addSystemMessage(message.conversationId, `Message delivery failed: ${errorMsg} Please try again later.`);
349
+ const chatV2 = getChatV2Service();
350
+ const channel = chatV2.ensureChannelForLegacyConversation({
351
+ conversationId: message.conversationId,
352
+ agentSession: 'crewly-orc',
353
+ });
354
+ chatV2.recordTurn({
355
+ channelId: channel.id,
356
+ senderType: 'system',
357
+ senderId: 'system',
358
+ content: `Message delivery failed: ${errorMsg} Please try again later.`,
359
+ metadata: { source: 'system' },
360
+ });
351
361
  }
352
362
  catch (sysErr) {
353
363
  this.logger.warn('Failed to send max-retry failure system message', {
@@ -525,8 +535,18 @@ export class QueueProcessorService extends EventEmitter {
525
535
  // (skip for system events — no user conversation to notify)
526
536
  if (!isSystemEvent) {
527
537
  try {
528
- const chatService = getChatService();
529
- await chatService.addSystemMessage(message.conversationId, `Failed to deliver message to orchestrator: ${errorMsg}. Please try again.`);
538
+ const chatV2 = getChatV2Service();
539
+ const channel = chatV2.ensureChannelForLegacyConversation({
540
+ conversationId: message.conversationId,
541
+ agentSession: 'crewly-orc',
542
+ });
543
+ chatV2.recordTurn({
544
+ channelId: channel.id,
545
+ senderType: 'system',
546
+ senderId: 'system',
547
+ content: `Failed to deliver message to orchestrator: ${errorMsg}. Please try again.`,
548
+ metadata: { source: 'system' },
549
+ });
530
550
  }
531
551
  catch (sysErr) {
532
552
  this.logger.warn('Failed to send delivery-failure system message', {