crewly 1.6.0 → 1.6.2

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 (448) hide show
  1. package/config/roles/orchestrator/fragments/role-boundary.md +4 -1
  2. package/config/roles/orchestrator/prompt.md +53 -0
  3. package/config/roles/orchestrator/soul.md +47 -10
  4. package/config/skills/_common/lib.sh +28 -0
  5. package/config/skills/agent/core/cancel-followup/execute.sh +0 -19
  6. package/config/skills/agent/core/get-my-active-work/SKILL.md +101 -0
  7. package/config/skills/agent/core/get-my-active-work/execute.sh +122 -0
  8. package/config/skills/agent/core/list-my-followups/execute.sh +0 -19
  9. package/config/skills/agent/core/record-learning/SKILL.md +29 -0
  10. package/config/skills/agent/core/reply-channel/SKILL.md +41 -0
  11. package/config/skills/agent/core/reply-channel/execute.sh +165 -0
  12. package/config/skills/agent/core/reply-channel/execute.test.sh +148 -0
  13. package/config/skills/agent/core/schedule-followup/execute.sh +0 -19
  14. package/config/skills/agent/core/watch-for-event/execute.sh +0 -19
  15. package/config/skills/agent/remote-browser/execute.sh +296 -14
  16. package/config/skills/agent/remote-browser/execute.test.sh +482 -0
  17. package/config/skills/orchestrator/credential-manager/execute.test.sh +88 -0
  18. package/config/skills/orchestrator/send-message/SKILL.md +30 -7
  19. package/config/skills/orchestrator/team-health-scan/SKILL.md +98 -0
  20. package/config/skills/orchestrator/team-health-scan/execute.sh +44 -0
  21. package/config/skills/registry.json +62 -1
  22. package/config/sops/developer/git-workflow.md +38 -3
  23. package/dist/backend/backend/src/config/oauth.config.d.ts +33 -0
  24. package/dist/backend/backend/src/config/oauth.config.d.ts.map +1 -0
  25. package/dist/backend/backend/src/config/oauth.config.js +45 -0
  26. package/dist/backend/backend/src/config/oauth.config.js.map +1 -0
  27. package/dist/backend/backend/src/constants.d.ts +69 -1
  28. package/dist/backend/backend/src/constants.d.ts.map +1 -1
  29. package/dist/backend/backend/src/constants.js +69 -2
  30. package/dist/backend/backend/src/constants.js.map +1 -1
  31. package/dist/backend/backend/src/controllers/active-work/active-work.controller.d.ts +53 -0
  32. package/dist/backend/backend/src/controllers/active-work/active-work.controller.d.ts.map +1 -0
  33. package/dist/backend/backend/src/controllers/active-work/active-work.controller.js +92 -0
  34. package/dist/backend/backend/src/controllers/active-work/active-work.controller.js.map +1 -0
  35. package/dist/backend/backend/src/controllers/agent-stream/agent-stream.controller.d.ts.map +1 -1
  36. package/dist/backend/backend/src/controllers/agent-stream/agent-stream.controller.js +18 -1
  37. package/dist/backend/backend/src/controllers/agent-stream/agent-stream.controller.js.map +1 -1
  38. package/dist/backend/backend/src/controllers/browser/browser.controller.d.ts +68 -0
  39. package/dist/backend/backend/src/controllers/browser/browser.controller.d.ts.map +1 -1
  40. package/dist/backend/backend/src/controllers/browser/browser.controller.js +233 -5
  41. package/dist/backend/backend/src/controllers/browser/browser.controller.js.map +1 -1
  42. package/dist/backend/backend/src/controllers/browser/browser.routes.d.ts.map +1 -1
  43. package/dist/backend/backend/src/controllers/browser/browser.routes.js +10 -1
  44. package/dist/backend/backend/src/controllers/browser/browser.routes.js.map +1 -1
  45. package/dist/backend/backend/src/controllers/chat/chat.controller.d.ts.map +1 -1
  46. package/dist/backend/backend/src/controllers/chat/chat.controller.js +8 -3
  47. package/dist/backend/backend/src/controllers/chat/chat.controller.js.map +1 -1
  48. package/dist/backend/backend/src/controllers/chat-v2/chat-v2.controller.d.ts +132 -0
  49. package/dist/backend/backend/src/controllers/chat-v2/chat-v2.controller.d.ts.map +1 -0
  50. package/dist/backend/backend/src/controllers/chat-v2/chat-v2.controller.js +401 -0
  51. package/dist/backend/backend/src/controllers/chat-v2/chat-v2.controller.js.map +1 -0
  52. package/dist/backend/backend/src/controllers/chat-v2/chat-v2.routes.d.ts +29 -0
  53. package/dist/backend/backend/src/controllers/chat-v2/chat-v2.routes.d.ts.map +1 -0
  54. package/dist/backend/backend/src/controllers/chat-v2/chat-v2.routes.js +39 -0
  55. package/dist/backend/backend/src/controllers/chat-v2/chat-v2.routes.js.map +1 -0
  56. package/dist/backend/backend/src/controllers/chat-v2/index.d.ts +8 -0
  57. package/dist/backend/backend/src/controllers/chat-v2/index.d.ts.map +1 -0
  58. package/dist/backend/backend/src/controllers/chat-v2/index.js +8 -0
  59. package/dist/backend/backend/src/controllers/chat-v2/index.js.map +1 -0
  60. package/dist/backend/backend/src/controllers/credentials/credentials.controller.d.ts +0 -26
  61. package/dist/backend/backend/src/controllers/credentials/credentials.controller.d.ts.map +1 -1
  62. package/dist/backend/backend/src/controllers/credentials/credentials.controller.js +47 -184
  63. package/dist/backend/backend/src/controllers/credentials/credentials.controller.js.map +1 -1
  64. package/dist/backend/backend/src/controllers/credentials/credentials.routes.d.ts.map +1 -1
  65. package/dist/backend/backend/src/controllers/credentials/credentials.routes.js +2 -1
  66. package/dist/backend/backend/src/controllers/credentials/credentials.routes.js.map +1 -1
  67. package/dist/backend/backend/src/controllers/credentials/google-oauth.controller.d.ts +40 -0
  68. package/dist/backend/backend/src/controllers/credentials/google-oauth.controller.d.ts.map +1 -0
  69. package/dist/backend/backend/src/controllers/credentials/google-oauth.controller.js +162 -0
  70. package/dist/backend/backend/src/controllers/credentials/google-oauth.controller.js.map +1 -0
  71. package/dist/backend/backend/src/controllers/onboarding/onboarding.routes.d.ts +13 -13
  72. package/dist/backend/backend/src/controllers/onboarding/onboarding.routes.d.ts.map +1 -1
  73. package/dist/backend/backend/src/controllers/onboarding/onboarding.routes.js +74 -234
  74. package/dist/backend/backend/src/controllers/onboarding/onboarding.routes.js.map +1 -1
  75. package/dist/backend/backend/src/controllers/request/request.controller.d.ts.map +1 -1
  76. package/dist/backend/backend/src/controllers/request/request.controller.js +4 -6
  77. package/dist/backend/backend/src/controllers/request/request.controller.js.map +1 -1
  78. package/dist/backend/backend/src/controllers/skill/skill.controller.d.ts.map +1 -1
  79. package/dist/backend/backend/src/controllers/skill/skill.controller.js +1 -0
  80. package/dist/backend/backend/src/controllers/skill/skill.controller.js.map +1 -1
  81. package/dist/backend/backend/src/controllers/task-management/tasks.controller.d.ts +43 -0
  82. package/dist/backend/backend/src/controllers/task-management/tasks.controller.d.ts.map +1 -1
  83. package/dist/backend/backend/src/controllers/task-management/tasks.controller.js +200 -72
  84. package/dist/backend/backend/src/controllers/task-management/tasks.controller.js.map +1 -1
  85. package/dist/backend/backend/src/controllers/team/team.controller.d.ts.map +1 -1
  86. package/dist/backend/backend/src/controllers/team/team.controller.js +46 -0
  87. package/dist/backend/backend/src/controllers/team/team.controller.js.map +1 -1
  88. package/dist/backend/backend/src/controllers/team-health/team-health.controller.d.ts +59 -0
  89. package/dist/backend/backend/src/controllers/team-health/team-health.controller.d.ts.map +1 -0
  90. package/dist/backend/backend/src/controllers/team-health/team-health.controller.js +127 -0
  91. package/dist/backend/backend/src/controllers/team-health/team-health.controller.js.map +1 -0
  92. package/dist/backend/backend/src/controllers/team-health/team-health.routes.d.ts +13 -0
  93. package/dist/backend/backend/src/controllers/team-health/team-health.routes.d.ts.map +1 -0
  94. package/dist/backend/backend/src/controllers/team-health/team-health.routes.js +20 -0
  95. package/dist/backend/backend/src/controllers/team-health/team-health.routes.js.map +1 -0
  96. package/dist/backend/backend/src/index.d.ts +9 -0
  97. package/dist/backend/backend/src/index.d.ts.map +1 -1
  98. package/dist/backend/backend/src/index.js +256 -4
  99. package/dist/backend/backend/src/index.js.map +1 -1
  100. package/dist/backend/backend/src/routes/api.routes.d.ts.map +1 -1
  101. package/dist/backend/backend/src/routes/api.routes.js +43 -6
  102. package/dist/backend/backend/src/routes/api.routes.js.map +1 -1
  103. package/dist/backend/backend/src/services/agent/active-work-briefing.service.d.ts +498 -0
  104. package/dist/backend/backend/src/services/agent/active-work-briefing.service.d.ts.map +1 -0
  105. package/dist/backend/backend/src/services/agent/active-work-briefing.service.js +759 -0
  106. package/dist/backend/backend/src/services/agent/active-work-briefing.service.js.map +1 -0
  107. package/dist/backend/backend/src/services/agent/agent-registration.service.d.ts +25 -0
  108. package/dist/backend/backend/src/services/agent/agent-registration.service.d.ts.map +1 -1
  109. package/dist/backend/backend/src/services/agent/agent-registration.service.js +193 -57
  110. package/dist/backend/backend/src/services/agent/agent-registration.service.js.map +1 -1
  111. package/dist/backend/backend/src/services/agent/crewly-agent/model-manager.d.ts +9 -2
  112. package/dist/backend/backend/src/services/agent/crewly-agent/model-manager.d.ts.map +1 -1
  113. package/dist/backend/backend/src/services/agent/crewly-agent/model-manager.js +35 -2
  114. package/dist/backend/backend/src/services/agent/crewly-agent/model-manager.js.map +1 -1
  115. package/dist/backend/backend/src/services/agent/crewly-agent/types.d.ts +8 -2
  116. package/dist/backend/backend/src/services/agent/crewly-agent/types.d.ts.map +1 -1
  117. package/dist/backend/backend/src/services/agent/crewly-agent/types.js +1 -0
  118. package/dist/backend/backend/src/services/agent/crewly-agent/types.js.map +1 -1
  119. package/dist/backend/backend/src/services/agent/tmux-command.service.d.ts.map +1 -1
  120. package/dist/backend/backend/src/services/agent/tmux-command.service.js +2 -1
  121. package/dist/backend/backend/src/services/agent/tmux-command.service.js.map +1 -1
  122. package/dist/backend/backend/src/services/agent/tmux.service.d.ts.map +1 -1
  123. package/dist/backend/backend/src/services/agent/tmux.service.js +2 -1
  124. package/dist/backend/backend/src/services/agent/tmux.service.js.map +1 -1
  125. package/dist/backend/backend/src/services/ai/prompt-builder.service.d.ts +148 -3
  126. package/dist/backend/backend/src/services/ai/prompt-builder.service.d.ts.map +1 -1
  127. package/dist/backend/backend/src/services/ai/prompt-builder.service.js +241 -2
  128. package/dist/backend/backend/src/services/ai/prompt-builder.service.js.map +1 -1
  129. package/dist/backend/backend/src/services/ai/prompt-modules/recovery.module.d.ts.map +1 -1
  130. package/dist/backend/backend/src/services/ai/prompt-modules/recovery.module.js +13 -0
  131. package/dist/backend/backend/src/services/ai/prompt-modules/recovery.module.js.map +1 -1
  132. package/dist/backend/backend/src/services/ai/prompt-modules/role-boundary.module.d.ts.map +1 -1
  133. package/dist/backend/backend/src/services/ai/prompt-modules/role-boundary.module.js +30 -2
  134. package/dist/backend/backend/src/services/ai/prompt-modules/role-boundary.module.js.map +1 -1
  135. package/dist/backend/backend/src/services/ai/prompt-modules/skills-reference.module.d.ts.map +1 -1
  136. package/dist/backend/backend/src/services/ai/prompt-modules/skills-reference.module.js +17 -0
  137. package/dist/backend/backend/src/services/ai/prompt-modules/skills-reference.module.js.map +1 -1
  138. package/dist/backend/backend/src/services/ai/prompt-modules/sop-norm-distinction.module.d.ts +79 -0
  139. package/dist/backend/backend/src/services/ai/prompt-modules/sop-norm-distinction.module.d.ts.map +1 -0
  140. package/dist/backend/backend/src/services/ai/prompt-modules/sop-norm-distinction.module.js +118 -0
  141. package/dist/backend/backend/src/services/ai/prompt-modules/sop-norm-distinction.module.js.map +1 -0
  142. package/dist/backend/backend/src/services/browser/browser-bridge.service.d.ts +161 -0
  143. package/dist/backend/backend/src/services/browser/browser-bridge.service.d.ts.map +1 -1
  144. package/dist/backend/backend/src/services/browser/browser-bridge.service.js +382 -2
  145. package/dist/backend/backend/src/services/browser/browser-bridge.service.js.map +1 -1
  146. package/dist/backend/backend/src/services/browser/browser-proxy.service.d.ts +105 -0
  147. package/dist/backend/backend/src/services/browser/browser-proxy.service.d.ts.map +1 -1
  148. package/dist/backend/backend/src/services/browser/browser-proxy.service.js +232 -13
  149. package/dist/backend/backend/src/services/browser/browser-proxy.service.js.map +1 -1
  150. package/dist/backend/backend/src/services/chat-v2/chat-v2.dispatcher.service.d.ts +178 -0
  151. package/dist/backend/backend/src/services/chat-v2/chat-v2.dispatcher.service.d.ts.map +1 -0
  152. package/dist/backend/backend/src/services/chat-v2/chat-v2.dispatcher.service.js +254 -0
  153. package/dist/backend/backend/src/services/chat-v2/chat-v2.dispatcher.service.js.map +1 -0
  154. package/dist/backend/backend/src/services/chat-v2/chat-v2.mention-resolver.d.ts +134 -0
  155. package/dist/backend/backend/src/services/chat-v2/chat-v2.mention-resolver.d.ts.map +1 -0
  156. package/dist/backend/backend/src/services/chat-v2/chat-v2.mention-resolver.js +232 -0
  157. package/dist/backend/backend/src/services/chat-v2/chat-v2.mention-resolver.js.map +1 -0
  158. package/dist/backend/backend/src/services/chat-v2/chat-v2.realtime-holder.d.ts +25 -0
  159. package/dist/backend/backend/src/services/chat-v2/chat-v2.realtime-holder.d.ts.map +1 -0
  160. package/dist/backend/backend/src/services/chat-v2/chat-v2.realtime-holder.js +23 -0
  161. package/dist/backend/backend/src/services/chat-v2/chat-v2.realtime-holder.js.map +1 -0
  162. package/dist/backend/backend/src/services/chat-v2/chat-v2.service.d.ts +254 -0
  163. package/dist/backend/backend/src/services/chat-v2/chat-v2.service.d.ts.map +1 -0
  164. package/dist/backend/backend/src/services/chat-v2/chat-v2.service.js +467 -0
  165. package/dist/backend/backend/src/services/chat-v2/chat-v2.service.js.map +1 -0
  166. package/dist/backend/backend/src/services/chat-v2/chat-v2.singleton.d.ts +27 -0
  167. package/dist/backend/backend/src/services/chat-v2/chat-v2.singleton.d.ts.map +1 -0
  168. package/dist/backend/backend/src/services/chat-v2/chat-v2.singleton.js +57 -0
  169. package/dist/backend/backend/src/services/chat-v2/chat-v2.singleton.js.map +1 -0
  170. package/dist/backend/backend/src/services/chat-v2/chat-v2.team-membership.d.ts +43 -0
  171. package/dist/backend/backend/src/services/chat-v2/chat-v2.team-membership.d.ts.map +1 -0
  172. package/dist/backend/backend/src/services/chat-v2/chat-v2.team-membership.js +54 -0
  173. package/dist/backend/backend/src/services/chat-v2/chat-v2.team-membership.js.map +1 -0
  174. package/dist/backend/backend/src/services/chat-v2/config.d.ts +100 -0
  175. package/dist/backend/backend/src/services/chat-v2/config.d.ts.map +1 -0
  176. package/dist/backend/backend/src/services/chat-v2/config.js +174 -0
  177. package/dist/backend/backend/src/services/chat-v2/config.js.map +1 -0
  178. package/dist/backend/backend/src/services/chat-v2/index.d.ts +11 -0
  179. package/dist/backend/backend/src/services/chat-v2/index.d.ts.map +1 -0
  180. package/dist/backend/backend/src/services/chat-v2/index.js +12 -0
  181. package/dist/backend/backend/src/services/chat-v2/index.js.map +1 -0
  182. package/dist/backend/backend/src/services/chat-v2/sqlite/channel.store.d.ts +114 -0
  183. package/dist/backend/backend/src/services/chat-v2/sqlite/channel.store.d.ts.map +1 -0
  184. package/dist/backend/backend/src/services/chat-v2/sqlite/channel.store.js +194 -0
  185. package/dist/backend/backend/src/services/chat-v2/sqlite/channel.store.js.map +1 -0
  186. package/dist/backend/backend/src/services/chat-v2/sqlite/chat-db.d.ts +100 -0
  187. package/dist/backend/backend/src/services/chat-v2/sqlite/chat-db.d.ts.map +1 -0
  188. package/dist/backend/backend/src/services/chat-v2/sqlite/chat-db.js +351 -0
  189. package/dist/backend/backend/src/services/chat-v2/sqlite/chat-db.js.map +1 -0
  190. package/dist/backend/backend/src/services/chat-v2/sqlite/message.store.d.ts +132 -0
  191. package/dist/backend/backend/src/services/chat-v2/sqlite/message.store.d.ts.map +1 -0
  192. package/dist/backend/backend/src/services/chat-v2/sqlite/message.store.js +281 -0
  193. package/dist/backend/backend/src/services/chat-v2/sqlite/message.store.js.map +1 -0
  194. package/dist/backend/backend/src/services/chat-v2/types.d.ts +295 -0
  195. package/dist/backend/backend/src/services/chat-v2/types.d.ts.map +1 -0
  196. package/dist/backend/backend/src/services/chat-v2/types.js +61 -0
  197. package/dist/backend/backend/src/services/chat-v2/types.js.map +1 -0
  198. package/dist/backend/backend/src/services/cloud/cloud-event-bridge.service.d.ts +113 -0
  199. package/dist/backend/backend/src/services/cloud/cloud-event-bridge.service.d.ts.map +1 -0
  200. package/dist/backend/backend/src/services/cloud/cloud-event-bridge.service.js +179 -0
  201. package/dist/backend/backend/src/services/cloud/cloud-event-bridge.service.js.map +1 -0
  202. package/dist/backend/backend/src/services/cloud/cloud-event-forwarder.service.d.ts +131 -0
  203. package/dist/backend/backend/src/services/cloud/cloud-event-forwarder.service.d.ts.map +1 -0
  204. package/dist/backend/backend/src/services/cloud/cloud-event-forwarder.service.js +227 -0
  205. package/dist/backend/backend/src/services/cloud/cloud-event-forwarder.service.js.map +1 -0
  206. package/dist/backend/backend/src/services/core/config.service.js +3 -3
  207. package/dist/backend/backend/src/services/core/config.service.js.map +1 -1
  208. package/dist/backend/backend/src/services/core/storage.service.d.ts +7 -0
  209. package/dist/backend/backend/src/services/core/storage.service.d.ts.map +1 -1
  210. package/dist/backend/backend/src/services/core/storage.service.js +15 -0
  211. package/dist/backend/backend/src/services/core/storage.service.js.map +1 -1
  212. package/dist/backend/backend/src/services/credential/helpers/gemini-cli-workspace.helper.d.ts +4 -16
  213. package/dist/backend/backend/src/services/credential/helpers/gemini-cli-workspace.helper.d.ts.map +1 -1
  214. package/dist/backend/backend/src/services/credential/helpers/gemini-cli-workspace.helper.js +7 -28
  215. package/dist/backend/backend/src/services/credential/helpers/gemini-cli-workspace.helper.js.map +1 -1
  216. package/dist/backend/backend/src/services/event-bus/event-bus.service.d.ts +69 -1
  217. package/dist/backend/backend/src/services/event-bus/event-bus.service.d.ts.map +1 -1
  218. package/dist/backend/backend/src/services/event-bus/event-bus.service.js +118 -0
  219. package/dist/backend/backend/src/services/event-bus/event-bus.service.js.map +1 -1
  220. package/dist/backend/backend/src/services/event-bus/event-to-workitem-bridge.service.d.ts +275 -0
  221. package/dist/backend/backend/src/services/event-bus/event-to-workitem-bridge.service.d.ts.map +1 -0
  222. package/dist/backend/backend/src/services/event-bus/event-to-workitem-bridge.service.js +736 -0
  223. package/dist/backend/backend/src/services/event-bus/event-to-workitem-bridge.service.js.map +1 -0
  224. package/dist/backend/backend/src/services/knowledge/fts5-index.service.d.ts.map +1 -1
  225. package/dist/backend/backend/src/services/knowledge/fts5-index.service.js +18 -2
  226. package/dist/backend/backend/src/services/knowledge/fts5-index.service.js.map +1 -1
  227. package/dist/backend/backend/src/services/knowledge/knowledge-search.service.d.ts +49 -13
  228. package/dist/backend/backend/src/services/knowledge/knowledge-search.service.d.ts.map +1 -1
  229. package/dist/backend/backend/src/services/knowledge/knowledge-search.service.js +123 -29
  230. package/dist/backend/backend/src/services/knowledge/knowledge-search.service.js.map +1 -1
  231. package/dist/backend/backend/src/services/knowledge/learnings-index.service.d.ts +159 -0
  232. package/dist/backend/backend/src/services/knowledge/learnings-index.service.d.ts.map +1 -0
  233. package/dist/backend/backend/src/services/knowledge/learnings-index.service.js +304 -0
  234. package/dist/backend/backend/src/services/knowledge/learnings-index.service.js.map +1 -0
  235. package/dist/backend/backend/src/services/knowledge/vector-store.service.d.ts.map +1 -1
  236. package/dist/backend/backend/src/services/knowledge/vector-store.service.js +24 -4
  237. package/dist/backend/backend/src/services/knowledge/vector-store.service.js.map +1 -1
  238. package/dist/backend/backend/src/services/mcp-server.d.ts +46 -2
  239. package/dist/backend/backend/src/services/mcp-server.d.ts.map +1 -1
  240. package/dist/backend/backend/src/services/mcp-server.js +216 -211
  241. package/dist/backend/backend/src/services/mcp-server.js.map +1 -1
  242. package/dist/backend/backend/src/services/mcp-tool-definitions.d.ts +254 -0
  243. package/dist/backend/backend/src/services/mcp-tool-definitions.d.ts.map +1 -0
  244. package/dist/backend/backend/src/services/mcp-tool-definitions.js +285 -0
  245. package/dist/backend/backend/src/services/mcp-tool-definitions.js.map +1 -0
  246. package/dist/backend/backend/src/services/memory/auto-learning.subscriber.d.ts +174 -0
  247. package/dist/backend/backend/src/services/memory/auto-learning.subscriber.d.ts.map +1 -0
  248. package/dist/backend/backend/src/services/memory/auto-learning.subscriber.js +375 -0
  249. package/dist/backend/backend/src/services/memory/auto-learning.subscriber.js.map +1 -0
  250. package/dist/backend/backend/src/services/memory/learning-format.validator.d.ts +97 -0
  251. package/dist/backend/backend/src/services/memory/learning-format.validator.d.ts.map +1 -0
  252. package/dist/backend/backend/src/services/memory/learning-format.validator.js +209 -0
  253. package/dist/backend/backend/src/services/memory/learning-format.validator.js.map +1 -0
  254. package/dist/backend/backend/src/services/memory/vector-store.service.d.ts.map +1 -1
  255. package/dist/backend/backend/src/services/memory/vector-store.service.js +19 -4
  256. package/dist/backend/backend/src/services/memory/vector-store.service.js.map +1 -1
  257. package/dist/backend/backend/src/services/onboarding/onboarding-provision.service.d.ts +16 -5
  258. package/dist/backend/backend/src/services/onboarding/onboarding-provision.service.d.ts.map +1 -1
  259. package/dist/backend/backend/src/services/onboarding/onboarding-provision.service.js +32 -5
  260. package/dist/backend/backend/src/services/onboarding/onboarding-provision.service.js.map +1 -1
  261. package/dist/backend/backend/src/services/onboarding/onboarding.service.d.ts +157 -0
  262. package/dist/backend/backend/src/services/onboarding/onboarding.service.d.ts.map +1 -0
  263. package/dist/backend/backend/src/services/onboarding/onboarding.service.js +229 -0
  264. package/dist/backend/backend/src/services/onboarding/onboarding.service.js.map +1 -0
  265. package/dist/backend/backend/src/services/onboarding/onboarding.types.d.ts +141 -0
  266. package/dist/backend/backend/src/services/onboarding/onboarding.types.d.ts.map +1 -0
  267. package/dist/backend/backend/src/services/onboarding/onboarding.types.js +18 -0
  268. package/dist/backend/backend/src/services/onboarding/onboarding.types.js.map +1 -0
  269. package/dist/backend/backend/src/services/pr-review/pr-review.service.d.ts.map +1 -1
  270. package/dist/backend/backend/src/services/pr-review/pr-review.service.js +1 -1
  271. package/dist/backend/backend/src/services/pr-review/pr-review.service.js.map +1 -1
  272. package/dist/backend/backend/src/services/project/task.service.d.ts.map +1 -1
  273. package/dist/backend/backend/src/services/project/task.service.js +5 -0
  274. package/dist/backend/backend/src/services/project/task.service.js.map +1 -1
  275. package/dist/backend/backend/src/services/skill/skill-executor.service.d.ts +41 -0
  276. package/dist/backend/backend/src/services/skill/skill-executor.service.d.ts.map +1 -1
  277. package/dist/backend/backend/src/services/skill/skill-executor.service.js +136 -7
  278. package/dist/backend/backend/src/services/skill/skill-executor.service.js.map +1 -1
  279. package/dist/backend/backend/src/services/skill/skill.service.d.ts.map +1 -1
  280. package/dist/backend/backend/src/services/skill/skill.service.js +1 -0
  281. package/dist/backend/backend/src/services/skill/skill.service.js.map +1 -1
  282. package/dist/backend/backend/src/services/slack/cross-machine-message.service.d.ts.map +1 -1
  283. package/dist/backend/backend/src/services/slack/cross-machine-message.service.js +17 -1
  284. package/dist/backend/backend/src/services/slack/cross-machine-message.service.js.map +1 -1
  285. package/dist/backend/backend/src/services/slack/slack-orchestrator-bridge.d.ts +39 -1
  286. package/dist/backend/backend/src/services/slack/slack-orchestrator-bridge.d.ts.map +1 -1
  287. package/dist/backend/backend/src/services/slack/slack-orchestrator-bridge.js +158 -26
  288. package/dist/backend/backend/src/services/slack/slack-orchestrator-bridge.js.map +1 -1
  289. package/dist/backend/backend/src/services/task-pool/task-pool.service.d.ts +248 -6
  290. package/dist/backend/backend/src/services/task-pool/task-pool.service.d.ts.map +1 -1
  291. package/dist/backend/backend/src/services/task-pool/task-pool.service.js +531 -51
  292. package/dist/backend/backend/src/services/task-pool/task-pool.service.js.map +1 -1
  293. package/dist/backend/backend/src/services/team-health/index.d.ts +16 -0
  294. package/dist/backend/backend/src/services/team-health/index.d.ts.map +1 -0
  295. package/dist/backend/backend/src/services/team-health/index.js +16 -0
  296. package/dist/backend/backend/src/services/team-health/index.js.map +1 -0
  297. package/dist/backend/backend/src/services/team-health/live-team-health-data-provider.d.ts +52 -0
  298. package/dist/backend/backend/src/services/team-health/live-team-health-data-provider.d.ts.map +1 -0
  299. package/dist/backend/backend/src/services/team-health/live-team-health-data-provider.js +161 -0
  300. package/dist/backend/backend/src/services/team-health/live-team-health-data-provider.js.map +1 -0
  301. package/dist/backend/backend/src/services/team-health/lost-dispatch-detector.d.ts +53 -0
  302. package/dist/backend/backend/src/services/team-health/lost-dispatch-detector.d.ts.map +1 -0
  303. package/dist/backend/backend/src/services/team-health/lost-dispatch-detector.js +88 -0
  304. package/dist/backend/backend/src/services/team-health/lost-dispatch-detector.js.map +1 -0
  305. package/dist/backend/backend/src/services/team-health/stale-trigger-detector.d.ts +44 -0
  306. package/dist/backend/backend/src/services/team-health/stale-trigger-detector.d.ts.map +1 -0
  307. package/dist/backend/backend/src/services/team-health/stale-trigger-detector.js +83 -0
  308. package/dist/backend/backend/src/services/team-health/stale-trigger-detector.js.map +1 -0
  309. package/dist/backend/backend/src/services/team-health/team-health-alert-router.d.ts +92 -0
  310. package/dist/backend/backend/src/services/team-health/team-health-alert-router.d.ts.map +1 -0
  311. package/dist/backend/backend/src/services/team-health/team-health-alert-router.js +328 -0
  312. package/dist/backend/backend/src/services/team-health/team-health-alert-router.js.map +1 -0
  313. package/dist/backend/backend/src/services/team-health/team-health-config.d.ts +41 -0
  314. package/dist/backend/backend/src/services/team-health/team-health-config.d.ts.map +1 -0
  315. package/dist/backend/backend/src/services/team-health/team-health-config.js +213 -0
  316. package/dist/backend/backend/src/services/team-health/team-health-config.js.map +1 -0
  317. package/dist/backend/backend/src/services/team-health/team-health-detector.d.ts +46 -0
  318. package/dist/backend/backend/src/services/team-health/team-health-detector.d.ts.map +1 -0
  319. package/dist/backend/backend/src/services/team-health/team-health-detector.js +347 -0
  320. package/dist/backend/backend/src/services/team-health/team-health-detector.js.map +1 -0
  321. package/dist/backend/backend/src/services/team-health/team-health-types.d.ts +154 -0
  322. package/dist/backend/backend/src/services/team-health/team-health-types.d.ts.map +1 -0
  323. package/dist/backend/backend/src/services/team-health/team-health-types.js +94 -0
  324. package/dist/backend/backend/src/services/team-health/team-health-types.js.map +1 -0
  325. package/dist/backend/backend/src/services/team-health/team-health-watchdog.service.d.ts +111 -0
  326. package/dist/backend/backend/src/services/team-health/team-health-watchdog.service.d.ts.map +1 -0
  327. package/dist/backend/backend/src/services/team-health/team-health-watchdog.service.js +226 -0
  328. package/dist/backend/backend/src/services/team-health/team-health-watchdog.service.js.map +1 -0
  329. package/dist/backend/backend/src/services/v3/mission-reminder.service.d.ts +148 -0
  330. package/dist/backend/backend/src/services/v3/mission-reminder.service.d.ts.map +1 -0
  331. package/dist/backend/backend/src/services/v3/mission-reminder.service.js +545 -0
  332. package/dist/backend/backend/src/services/v3/mission-reminder.service.js.map +1 -0
  333. package/dist/backend/backend/src/services/v3/request-sla.subscriber.d.ts +499 -0
  334. package/dist/backend/backend/src/services/v3/request-sla.subscriber.d.ts.map +1 -0
  335. package/dist/backend/backend/src/services/v3/request-sla.subscriber.js +1105 -0
  336. package/dist/backend/backend/src/services/v3/request-sla.subscriber.js.map +1 -0
  337. package/dist/backend/backend/src/services/v3/request.service.d.ts +22 -0
  338. package/dist/backend/backend/src/services/v3/request.service.d.ts.map +1 -1
  339. package/dist/backend/backend/src/services/v3/request.service.js +71 -0
  340. package/dist/backend/backend/src/services/v3/request.service.js.map +1 -1
  341. package/dist/backend/backend/src/services/v3/v3-data.service.d.ts +1 -0
  342. package/dist/backend/backend/src/services/v3/v3-data.service.d.ts.map +1 -1
  343. package/dist/backend/backend/src/services/v3/v3-data.service.js +22 -6
  344. package/dist/backend/backend/src/services/v3/v3-data.service.js.map +1 -1
  345. package/dist/backend/backend/src/types/event-bus.types.d.ts +19 -1
  346. package/dist/backend/backend/src/types/event-bus.types.d.ts.map +1 -1
  347. package/dist/backend/backend/src/types/event-bus.types.js +43 -0
  348. package/dist/backend/backend/src/types/event-bus.types.js.map +1 -1
  349. package/dist/backend/backend/src/types/index.d.ts +22 -1
  350. package/dist/backend/backend/src/types/index.d.ts.map +1 -1
  351. package/dist/backend/backend/src/types/index.js.map +1 -1
  352. package/dist/backend/backend/src/types/review-reason.types.d.ts +63 -0
  353. package/dist/backend/backend/src/types/review-reason.types.d.ts.map +1 -0
  354. package/dist/backend/backend/src/types/review-reason.types.js +50 -0
  355. package/dist/backend/backend/src/types/review-reason.types.js.map +1 -0
  356. package/dist/backend/backend/src/types/skill.types.d.ts +9 -0
  357. package/dist/backend/backend/src/types/skill.types.d.ts.map +1 -1
  358. package/dist/backend/backend/src/types/skill.types.js.map +1 -1
  359. package/dist/backend/backend/src/types/slack.types.d.ts +4 -1
  360. package/dist/backend/backend/src/types/slack.types.d.ts.map +1 -1
  361. package/dist/backend/backend/src/types/slack.types.js.map +1 -1
  362. package/dist/backend/backend/src/types/v2/mission.types.d.ts +18 -0
  363. package/dist/backend/backend/src/types/v2/mission.types.d.ts.map +1 -1
  364. package/dist/backend/backend/src/types/v2/mission.types.js +1 -0
  365. package/dist/backend/backend/src/types/v2/mission.types.js.map +1 -1
  366. package/dist/backend/backend/src/types/v2/work-item.types.d.ts.map +1 -1
  367. package/dist/backend/backend/src/types/v2/work-item.types.js +25 -1
  368. package/dist/backend/backend/src/types/v2/work-item.types.js.map +1 -1
  369. package/dist/backend/backend/src/utils/google-userinfo.utils.d.ts +41 -0
  370. package/dist/backend/backend/src/utils/google-userinfo.utils.d.ts.map +1 -0
  371. package/dist/backend/backend/src/utils/google-userinfo.utils.js +44 -0
  372. package/dist/backend/backend/src/utils/google-userinfo.utils.js.map +1 -0
  373. package/dist/backend/backend/src/utils/team.utils.d.ts +38 -0
  374. package/dist/backend/backend/src/utils/team.utils.d.ts.map +1 -0
  375. package/dist/backend/backend/src/utils/team.utils.js +45 -0
  376. package/dist/backend/backend/src/utils/team.utils.js.map +1 -0
  377. package/dist/backend/backend/src/websocket/chat-v2.gateway.d.ts +195 -0
  378. package/dist/backend/backend/src/websocket/chat-v2.gateway.d.ts.map +1 -0
  379. package/dist/backend/backend/src/websocket/chat-v2.gateway.js +401 -0
  380. package/dist/backend/backend/src/websocket/chat-v2.gateway.js.map +1 -0
  381. package/dist/backend/backend/src/websocket/terminal.gateway.d.ts +37 -2
  382. package/dist/backend/backend/src/websocket/terminal.gateway.d.ts.map +1 -1
  383. package/dist/backend/backend/src/websocket/terminal.gateway.js +106 -5
  384. package/dist/backend/backend/src/websocket/terminal.gateway.js.map +1 -1
  385. package/dist/cli/backend/src/config/oauth.config.d.ts +33 -0
  386. package/dist/cli/backend/src/config/oauth.config.d.ts.map +1 -0
  387. package/dist/cli/backend/src/config/oauth.config.js +45 -0
  388. package/dist/cli/backend/src/config/oauth.config.js.map +1 -0
  389. package/dist/cli/backend/src/constants.d.ts +69 -1
  390. package/dist/cli/backend/src/constants.d.ts.map +1 -1
  391. package/dist/cli/backend/src/constants.js +69 -2
  392. package/dist/cli/backend/src/constants.js.map +1 -1
  393. package/dist/cli/backend/src/services/core/config.service.js +3 -3
  394. package/dist/cli/backend/src/services/core/config.service.js.map +1 -1
  395. package/dist/cli/backend/src/services/core/storage.service.d.ts +7 -0
  396. package/dist/cli/backend/src/services/core/storage.service.d.ts.map +1 -1
  397. package/dist/cli/backend/src/services/core/storage.service.js +15 -0
  398. package/dist/cli/backend/src/services/core/storage.service.js.map +1 -1
  399. package/dist/cli/backend/src/services/credential/helpers/gemini-cli-workspace.helper.d.ts +4 -16
  400. package/dist/cli/backend/src/services/credential/helpers/gemini-cli-workspace.helper.d.ts.map +1 -1
  401. package/dist/cli/backend/src/services/credential/helpers/gemini-cli-workspace.helper.js +7 -28
  402. package/dist/cli/backend/src/services/credential/helpers/gemini-cli-workspace.helper.js.map +1 -1
  403. package/dist/cli/backend/src/services/knowledge/fts5-index.service.d.ts.map +1 -1
  404. package/dist/cli/backend/src/services/knowledge/fts5-index.service.js +18 -2
  405. package/dist/cli/backend/src/services/knowledge/fts5-index.service.js.map +1 -1
  406. package/dist/cli/backend/src/services/knowledge/knowledge-search.service.d.ts +49 -13
  407. package/dist/cli/backend/src/services/knowledge/knowledge-search.service.d.ts.map +1 -1
  408. package/dist/cli/backend/src/services/knowledge/knowledge-search.service.js +123 -29
  409. package/dist/cli/backend/src/services/knowledge/knowledge-search.service.js.map +1 -1
  410. package/dist/cli/backend/src/services/knowledge/vector-store.service.d.ts.map +1 -1
  411. package/dist/cli/backend/src/services/knowledge/vector-store.service.js +24 -4
  412. package/dist/cli/backend/src/services/knowledge/vector-store.service.js.map +1 -1
  413. package/dist/cli/backend/src/services/mcp-server.d.ts +46 -2
  414. package/dist/cli/backend/src/services/mcp-server.d.ts.map +1 -1
  415. package/dist/cli/backend/src/services/mcp-server.js +216 -211
  416. package/dist/cli/backend/src/services/mcp-server.js.map +1 -1
  417. package/dist/cli/backend/src/services/mcp-tool-definitions.d.ts +254 -0
  418. package/dist/cli/backend/src/services/mcp-tool-definitions.d.ts.map +1 -0
  419. package/dist/cli/backend/src/services/mcp-tool-definitions.js +285 -0
  420. package/dist/cli/backend/src/services/mcp-tool-definitions.js.map +1 -0
  421. package/dist/cli/backend/src/services/skill/skill-executor.service.d.ts +18 -0
  422. package/dist/cli/backend/src/services/skill/skill-executor.service.d.ts.map +1 -1
  423. package/dist/cli/backend/src/services/skill/skill-executor.service.js +7 -9
  424. package/dist/cli/backend/src/services/skill/skill-executor.service.js.map +1 -1
  425. package/dist/cli/backend/src/types/index.d.ts +22 -1
  426. package/dist/cli/backend/src/types/index.d.ts.map +1 -1
  427. package/dist/cli/backend/src/types/index.js.map +1 -1
  428. package/dist/cli/backend/src/types/skill.types.d.ts +9 -0
  429. package/dist/cli/backend/src/types/skill.types.d.ts.map +1 -1
  430. package/dist/cli/backend/src/types/skill.types.js.map +1 -1
  431. package/dist/cli/backend/src/types/v2/work-item.types.d.ts.map +1 -1
  432. package/dist/cli/backend/src/types/v2/work-item.types.js +25 -1
  433. package/dist/cli/backend/src/types/v2/work-item.types.js.map +1 -1
  434. package/dist/cli/backend/src/utils/google-userinfo.utils.d.ts +41 -0
  435. package/dist/cli/backend/src/utils/google-userinfo.utils.d.ts.map +1 -0
  436. package/dist/cli/backend/src/utils/google-userinfo.utils.js +44 -0
  437. package/dist/cli/backend/src/utils/google-userinfo.utils.js.map +1 -0
  438. package/frontend/dist/assets/{index-9e6d97d1.js → index-7a4e7df5.js} +328 -326
  439. package/frontend/dist/assets/index-b7e59b2b.css +33 -0
  440. package/frontend/dist/index.html +2 -2
  441. package/package.json +2 -1
  442. package/config/skills/orchestrator/recall/SKILL.md +0 -47
  443. package/config/skills/orchestrator/recall/execute.sh +0 -13
  444. package/config/skills/orchestrator/record-learning/SKILL.md +0 -47
  445. package/config/skills/orchestrator/record-learning/execute.sh +0 -13
  446. package/config/skills/orchestrator/remember/SKILL.md +0 -55
  447. package/config/skills/orchestrator/remember/execute.sh +0 -15
  448. package/frontend/dist/assets/index-6aaa0630.css +0 -33
@@ -0,0 +1,295 @@
1
+ /**
2
+ * Chat V2 — Internal types and wire-format DTOs.
3
+ *
4
+ * The shapes here back the Chat MVP Phase 1 spec
5
+ * (`.crewly/specs/chat-mvp-phase1-tech-spec-2026-04-24.md` §21).
6
+ * They are deliberately isolated from the existing `types/chat.types.ts`,
7
+ * which belongs to the legacy orchestrator chat pipe.
8
+ *
9
+ * @module services/chat-v2/types
10
+ */
11
+ /** Who authored a message. Server-assigned; never accepted from request body. */
12
+ export type ChatSenderType = 'user' | 'agent' | 'system';
13
+ /** What kind of content a message carries. */
14
+ export type ChatContentType = 'text' | 'markdown' | 'image_ref' | 'system_note';
15
+ /** Agent presence snapshot categories. */
16
+ export type ChatAgentPresenceStatus = 'online' | 'busy' | 'offline' | 'starting';
17
+ /**
18
+ * Channel type — Phase B Slack-like team-chat addition (SEALED design 2026-04-25 §3.1).
19
+ *
20
+ * - `dm`: 1:1 user↔agent direct message channel. Matches the Phase 1 / Week 2
21
+ * contract; existing rows default to this. `agent_session` field is the
22
+ * 1:1 binding key.
23
+ * - `channel`: public team-scoped channel (`#general`, `#proj-<name>`, etc.)
24
+ * where multiple agents may participate. The `agent_session` field on
25
+ * channel-typed rows is left empty (no 1:1 binding).
26
+ *
27
+ * The wire-protocol vocabulary intentionally stays narrow at BE; FE adds
28
+ * `idle` / `inactive` UI states via `@crewly/chat-ui`'s `ChatPresenceStatus`
29
+ * union (the translation lives at the boundary, not here).
30
+ */
31
+ export type ChatChannelType = 'dm' | 'channel';
32
+ /** Mention target kind — Phase B addition (SEALED design §7.1 chip pattern). */
33
+ export type ChatMentionKind = 'team' | 'agent';
34
+ /** Enum values exposed as readonly tuples for runtime validation. */
35
+ export declare const CHAT_SENDER_TYPES: readonly ChatSenderType[];
36
+ export declare const CHAT_CONTENT_TYPES: readonly ChatContentType[];
37
+ /** Phase B — channel-type tuple for runtime validation in CreateChannelInput. */
38
+ export declare const CHAT_CHANNEL_TYPES: readonly ChatChannelType[];
39
+ /** Phase B — mention-kind tuple for runtime validation in mention parsing. */
40
+ export declare const CHAT_MENTION_KINDS: readonly ChatMentionKind[];
41
+ /** Row shape of `chat_channels`. Timestamps are ms-since-epoch UTC. */
42
+ export interface ChatChannelRow {
43
+ id: string;
44
+ /**
45
+ * 1:1 binding to the agent's session for `type='dm'` rows. For
46
+ * `type='channel'` rows, holds an empty string (`''`) — the row is
47
+ * not bound to a single agent. Phase B SEALED design §3.1.
48
+ */
49
+ agent_session: string;
50
+ owner_user_id: string;
51
+ name: string;
52
+ purpose: string | null;
53
+ created_at: number;
54
+ archived_at: number | null;
55
+ last_message_at: number | null;
56
+ /**
57
+ * Phase B addition (SEALED §3.1). `'dm'` for the existing 1:1 channels
58
+ * (default — preserves backwards-compat); `'channel'` for new
59
+ * team-scoped surfaces. NOT NULL after migration; existing rows
60
+ * backfill to `'dm'`.
61
+ */
62
+ type: ChatChannelType;
63
+ /**
64
+ * Phase B addition (SEALED §3.1). Links a channel to a Crewly team
65
+ * workspace. Required for `type='channel'`; null/empty for `type='dm'`
66
+ * (which is user↔agent, not team-scoped).
67
+ */
68
+ team_id: string | null;
69
+ /**
70
+ * Phase B addition (SEALED §3.1). Optional link to a specific
71
+ * project for project-scoped channels (e.g. `#proj-<name>`). Null
72
+ * for team-general channels and DMs.
73
+ */
74
+ project_id: string | null;
75
+ /**
76
+ * Phase B addition (SEALED §3.1). For `type='dm'` rows, optionally
77
+ * holds the target member-ID being DM'd (distinct from
78
+ * `agent_session` which is the wire-level session binding). For
79
+ * `type='channel'` rows, always null.
80
+ */
81
+ target_member_id: string | null;
82
+ }
83
+ /** Row shape of `chat_messages`. */
84
+ export interface ChatMessageRow {
85
+ id: string;
86
+ channel_id: string;
87
+ seq: number;
88
+ sender_type: ChatSenderType;
89
+ sender_id: string;
90
+ content: string;
91
+ content_type: ChatContentType;
92
+ created_at: number;
93
+ /** JSON blob (string) or null. Bounded at 2KB at insert time. */
94
+ metadata: string | null;
95
+ /**
96
+ * Phase B addition (SEALED §3.2). JSON-encoded array of mention IDs
97
+ * referenced inline in `content` (member IDs and/or team IDs). Stored
98
+ * as JSON string in SQLite (no native JSON column); empty array when
99
+ * no mentions. Bounded at 1KB at insert time. Null on legacy rows;
100
+ * service layer treats null as `[]`.
101
+ */
102
+ mentions: string | null;
103
+ /**
104
+ * Phase B addition (SEALED §3.2). Optional Slack-style threading
105
+ * within a channel — when set, this message is a reply within the
106
+ * thread rooted at `thread_id`. Null for top-level messages.
107
+ */
108
+ thread_id: string | null;
109
+ }
110
+ /** Row shape of `chat_attachments`. */
111
+ export interface ChatAttachmentRow {
112
+ id: string;
113
+ message_id: string;
114
+ kind: 'image';
115
+ mime_type: string;
116
+ size_bytes: number;
117
+ local_path: string;
118
+ original_name: string | null;
119
+ created_at: number;
120
+ }
121
+ /** Outbound channel shape for `GET /channels` / `POST /channels`. */
122
+ export interface ChatChannelDTO {
123
+ id: string;
124
+ /**
125
+ * Wire-level session binding for `type='dm'` channels. Empty string
126
+ * for `type='channel'` rows.
127
+ */
128
+ agentSession: string;
129
+ name: string;
130
+ purpose?: string;
131
+ createdAt: number;
132
+ archivedAt?: number | null;
133
+ lastMessageAt?: number | null;
134
+ /**
135
+ * Agent-presence summary. Populated for `type='dm'` channels (the
136
+ * agent on the other side of the DM). For `type='channel'` rows,
137
+ * `status: 'offline'` and `lastSeenAt: null` until the FE wires
138
+ * per-member presence in Phase C.
139
+ */
140
+ agentPresence: {
141
+ status: ChatAgentPresenceStatus;
142
+ lastSeenAt: number | null;
143
+ };
144
+ /** Pending entries in the offline queue for this channel. */
145
+ queuedCount?: number;
146
+ /**
147
+ * Phase B (SEALED §3.1) — `'dm'` (existing default) or `'channel'`
148
+ * (new team-scoped surfaces). Required field on the wire from Phase B
149
+ * onward; legacy callers that omit it are treated as `'dm'`.
150
+ */
151
+ type: ChatChannelType;
152
+ /** Phase B — team workspace ID. Required when `type='channel'`. */
153
+ teamId?: string;
154
+ /** Phase B — project link. Optional even when `type='channel'`. */
155
+ projectId?: string;
156
+ /**
157
+ * Phase B — for `type='dm'`, the target member's ID. Optional in
158
+ * Week-2 contract because `agentSession` already disambiguates.
159
+ * Provided when the FE wants to render a member-level handle
160
+ * (`@Sam`) rather than the session ID.
161
+ */
162
+ targetMemberId?: string;
163
+ }
164
+ /** Outbound message shape for `GET /messages` / `POST /messages` / WS `message` frame. */
165
+ export interface ChatMessageDTO {
166
+ id: string;
167
+ channelId: string;
168
+ seq: number;
169
+ senderType: ChatSenderType;
170
+ senderId: string;
171
+ content: string;
172
+ contentType: ChatContentType;
173
+ createdAt: number;
174
+ attachments: ChatAttachmentDTO[];
175
+ metadata?: Record<string, unknown>;
176
+ /**
177
+ * Phase B (SEALED §3.2) — array of mention IDs referenced inline in
178
+ * `content`. Each entry is either a member ID or a team ID; the
179
+ * `kind` discrimination is left to consumers via a separate lookup
180
+ * (we do not embed `MentionTarget` shape in the wire to keep DTOs
181
+ * shallow). Empty array when no mentions; never null on the wire.
182
+ */
183
+ mentions: string[];
184
+ /**
185
+ * Phase B (SEALED §3.2) — optional Slack-style thread root. When
186
+ * present, this message is a reply within the thread; consumers
187
+ * group by `threadId` to render the thread sub-pane.
188
+ */
189
+ threadId?: string;
190
+ }
191
+ /** Outbound attachment shape — image only in Phase 1. */
192
+ export interface ChatAttachmentDTO {
193
+ id: string;
194
+ mimeType: string;
195
+ sizeBytes: number;
196
+ /** Relative path used by clients, e.g. `/api/chat/attachments/<id>`. */
197
+ url: string;
198
+ originalName?: string;
199
+ }
200
+ /** Opaque cursor payload before base64url encoding. */
201
+ export interface ChatMessageCursorPayload {
202
+ seq: number;
203
+ channelId: string;
204
+ }
205
+ /** Response envelope for `GET /channels/:id/messages`. */
206
+ export interface ChatMessageListResult {
207
+ messages: ChatMessageDTO[];
208
+ nextCursor: string | null;
209
+ prevCursor: string | null;
210
+ channelId: string;
211
+ }
212
+ /** Body of `POST /channels`. */
213
+ export interface CreateChannelInput {
214
+ /**
215
+ * Wire-level session binding. Required when `type='dm'` (default);
216
+ * ignored when `type='channel'` (server stores empty string).
217
+ */
218
+ agentSession?: string;
219
+ name: string;
220
+ purpose?: string;
221
+ /**
222
+ * Phase B addition (SEALED §3.1). `'dm'` (default — preserves
223
+ * Week-2 contract for callers that omit this field) or `'channel'`.
224
+ * Service layer rejects `type='channel'` requests that omit `teamId`.
225
+ */
226
+ type?: ChatChannelType;
227
+ /** Phase B — required when `type='channel'`. */
228
+ teamId?: string;
229
+ /** Phase B — optional even when `type='channel'`. */
230
+ projectId?: string;
231
+ /** Phase B — optional for `type='dm'`. */
232
+ targetMemberId?: string;
233
+ }
234
+ /** Body of `POST /channels/:id/messages`. */
235
+ export interface SendMessageInput {
236
+ content: string;
237
+ contentType?: ChatContentType;
238
+ clientMessageId?: string;
239
+ /** Pre-uploaded attachment refs; Phase 1 is `{ attachmentId }` shape. */
240
+ attachments?: Array<{
241
+ attachmentId: string;
242
+ }>;
243
+ /**
244
+ * Phase B (SEALED §3.2) — mention IDs (member or team) referenced
245
+ * inline in `content`. The FE composer parses chips into this
246
+ * shape before send; the BE persists as JSON and emits with the
247
+ * outbound message DTO. Empty array or omitted = no mentions.
248
+ */
249
+ mentions?: string[];
250
+ /**
251
+ * Phase B (SEALED §3.2) — Slack-style thread reply root. When set,
252
+ * the new message is a reply within the thread. Omit for top-level
253
+ * channel messages.
254
+ */
255
+ threadId?: string;
256
+ }
257
+ /** Principal passed down from auth middleware. */
258
+ export interface ChatPrincipal {
259
+ userId: string;
260
+ /** When an agent (not a user) is acting. Phase 1 is usually undefined. */
261
+ agentSession?: string;
262
+ /** Origin — `portal` for Cloud Pro service-token requests. */
263
+ source?: 'portal' | 'oss';
264
+ }
265
+ /** Canonical error-code strings. */
266
+ export declare const CHAT_ERROR_CODES: {
267
+ readonly VALIDATION: "validation_error";
268
+ readonly NOT_FOUND: "not_found";
269
+ readonly CHANNEL_NOT_FOUND: "channel_not_found";
270
+ readonly AGENT_NOT_FOUND: "agent_not_found";
271
+ readonly FORBIDDEN: "forbidden";
272
+ /**
273
+ * F2b (#333) — caller is authenticated but is not a member of the
274
+ * `teamId` they tried to bind a `type='channel'` channel to. Distinct
275
+ * from FORBIDDEN so the FE can surface a tenant-specific message
276
+ * instead of a generic 403.
277
+ */
278
+ readonly FORBIDDEN_TEAM: "forbidden_team";
279
+ readonly AGENT_ALREADY_BOUND: "agent_already_bound";
280
+ readonly PAYLOAD_TOO_LARGE: "payload_too_large";
281
+ readonly RATE_LIMITED: "rate_limited";
282
+ readonly INVALID_CURSOR: "invalid_cursor";
283
+ readonly CHANNEL_ARCHIVED: "channel_archived";
284
+ readonly ATTACHMENT_NOT_FOUND: "attachment_not_found";
285
+ readonly INTERNAL: "internal_error";
286
+ };
287
+ export type ChatErrorCode = (typeof CHAT_ERROR_CODES)[keyof typeof CHAT_ERROR_CODES];
288
+ /** Structured error thrown by stores/service; controller maps to HTTP. */
289
+ export declare class ChatError extends Error {
290
+ readonly code: ChatErrorCode;
291
+ readonly httpStatus: number;
292
+ readonly details?: Record<string, unknown> | undefined;
293
+ constructor(code: ChatErrorCode, httpStatus: number, message: string, details?: Record<string, unknown> | undefined);
294
+ }
295
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../../../../backend/src/services/chat-v2/types.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,61 @@
1
+ /**
2
+ * Chat V2 — Internal types and wire-format DTOs.
3
+ *
4
+ * The shapes here back the Chat MVP Phase 1 spec
5
+ * (`.crewly/specs/chat-mvp-phase1-tech-spec-2026-04-24.md` §21).
6
+ * They are deliberately isolated from the existing `types/chat.types.ts`,
7
+ * which belongs to the legacy orchestrator chat pipe.
8
+ *
9
+ * @module services/chat-v2/types
10
+ */
11
+ /** Enum values exposed as readonly tuples for runtime validation. */
12
+ export const CHAT_SENDER_TYPES = ['user', 'agent', 'system'];
13
+ export const CHAT_CONTENT_TYPES = [
14
+ 'text',
15
+ 'markdown',
16
+ 'image_ref',
17
+ 'system_note',
18
+ ];
19
+ /** Phase B — channel-type tuple for runtime validation in CreateChannelInput. */
20
+ export const CHAT_CHANNEL_TYPES = ['dm', 'channel'];
21
+ /** Phase B — mention-kind tuple for runtime validation in mention parsing. */
22
+ export const CHAT_MENTION_KINDS = ['team', 'agent'];
23
+ // ---------------------------------------------------------------------------
24
+ // Error codes — stable strings; `@crewly/chat-ui` switches UI state on them
25
+ // ---------------------------------------------------------------------------
26
+ /** Canonical error-code strings. */
27
+ export const CHAT_ERROR_CODES = {
28
+ VALIDATION: 'validation_error',
29
+ NOT_FOUND: 'not_found',
30
+ CHANNEL_NOT_FOUND: 'channel_not_found',
31
+ AGENT_NOT_FOUND: 'agent_not_found',
32
+ FORBIDDEN: 'forbidden',
33
+ /**
34
+ * F2b (#333) — caller is authenticated but is not a member of the
35
+ * `teamId` they tried to bind a `type='channel'` channel to. Distinct
36
+ * from FORBIDDEN so the FE can surface a tenant-specific message
37
+ * instead of a generic 403.
38
+ */
39
+ FORBIDDEN_TEAM: 'forbidden_team',
40
+ AGENT_ALREADY_BOUND: 'agent_already_bound',
41
+ PAYLOAD_TOO_LARGE: 'payload_too_large',
42
+ RATE_LIMITED: 'rate_limited',
43
+ INVALID_CURSOR: 'invalid_cursor',
44
+ CHANNEL_ARCHIVED: 'channel_archived',
45
+ ATTACHMENT_NOT_FOUND: 'attachment_not_found',
46
+ INTERNAL: 'internal_error',
47
+ };
48
+ /** Structured error thrown by stores/service; controller maps to HTTP. */
49
+ export class ChatError extends Error {
50
+ code;
51
+ httpStatus;
52
+ details;
53
+ constructor(code, httpStatus, message, details) {
54
+ super(message);
55
+ this.code = code;
56
+ this.httpStatus = httpStatus;
57
+ this.details = details;
58
+ this.name = 'ChatError';
59
+ }
60
+ }
61
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../../../../../backend/src/services/chat-v2/types.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAkCH,qEAAqE;AACrE,MAAM,CAAC,MAAM,iBAAiB,GAA8B,CAAC,MAAM,EAAE,OAAO,EAAE,QAAQ,CAAC,CAAC;AACxF,MAAM,CAAC,MAAM,kBAAkB,GAA+B;IAC5D,MAAM;IACN,UAAU;IACV,WAAW;IACX,aAAa;CACd,CAAC;AAEF,iFAAiF;AACjF,MAAM,CAAC,MAAM,kBAAkB,GAA+B,CAAC,IAAI,EAAE,SAAS,CAAC,CAAC;AAEhF,8EAA8E;AAC9E,MAAM,CAAC,MAAM,kBAAkB,GAA+B,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;AA2PhF,8EAA8E;AAC9E,4EAA4E;AAC5E,8EAA8E;AAE9E,oCAAoC;AACpC,MAAM,CAAC,MAAM,gBAAgB,GAAG;IAC9B,UAAU,EAAE,kBAAkB;IAC9B,SAAS,EAAE,WAAW;IACtB,iBAAiB,EAAE,mBAAmB;IACtC,eAAe,EAAE,iBAAiB;IAClC,SAAS,EAAE,WAAW;IACtB;;;;;OAKG;IACH,cAAc,EAAE,gBAAgB;IAChC,mBAAmB,EAAE,qBAAqB;IAC1C,iBAAiB,EAAE,mBAAmB;IACtC,YAAY,EAAE,cAAc;IAC5B,cAAc,EAAE,gBAAgB;IAChC,gBAAgB,EAAE,kBAAkB;IACpC,oBAAoB,EAAE,sBAAsB;IAC5C,QAAQ,EAAE,gBAAgB;CAClB,CAAC;AAIX,0EAA0E;AAC1E,MAAM,OAAO,SAAU,SAAQ,KAAK;IAEhB;IACA;IAEA;IAJlB,YACkB,IAAmB,EACnB,UAAkB,EAClC,OAAe,EACC,OAAiC;QAEjD,KAAK,CAAC,OAAO,CAAC,CAAC;QALC,SAAI,GAAJ,IAAI,CAAe;QACnB,eAAU,GAAV,UAAU,CAAQ;QAElB,YAAO,GAAP,OAAO,CAA0B;QAGjD,IAAI,CAAC,IAAI,GAAG,WAAW,CAAC;IAC1B,CAAC;CACF"}
@@ -0,0 +1,113 @@
1
+ /**
2
+ * Cloud Event Inbound Bridge — autonomy_v1.f1
3
+ *
4
+ * Receives `'event'` MessageType inbound from the Cloud Relay (via the
5
+ * existing CloudSyncService poll → `'message'` event-emitter hop) and
6
+ * re-publishes the carried AgentEvent onto the local EventBusService with
7
+ * `source = 'remote'` and `originDeviceId` stamped from the wire envelope.
8
+ *
9
+ * Compose-at-boundary discipline (per Arch verdict 2026-04-28 N1):
10
+ * - CloudSyncService stays a transport — it polls Cloud, dedupes by
11
+ * `processedMessageIds`, emits an in-process `'message'` event.
12
+ * - This service is the AgentEvent translator. It owns the bridge between
13
+ * the cloud message vocabulary (`MessageType` + `EventMessagePayload`)
14
+ * and the local event-bus vocabulary (`AgentEvent`). It does NOT touch
15
+ * the poll loop or the cloud transport.
16
+ *
17
+ * Mirrors the BRIDGE-1 ↔ EventBus separation pattern: CloudSync EMITS,
18
+ * downstream LISTENS. Same shape as PR #347 (BrandOnboarding ⊥
19
+ * OnboardingService) and PR #348 (StatusBadge ⊥ RequestStatusPill) where
20
+ * two parallel modules share a single narrow artifact.
21
+ *
22
+ * Idempotency:
23
+ * The local LRU at CloudSyncService blocks at-least-once cloud-message-id
24
+ * re-delivery upstream. The recent-publish suppression in EventBusService
25
+ * (post-M2 fix: `${type}:${sessionName}:${event.id}`) catches any
26
+ * duplicate that slips through to the publish boundary. The TriggerEngine
27
+ * per-trigger dedup `${triggerId}:${event.id}` (Slice 3) is the third
28
+ * layer at the trigger fire boundary.
29
+ *
30
+ * Unknown peer event types (Arch Q4):
31
+ * The closed `EVENT_TYPES` enum stays closed. Bridge accepts any string
32
+ * at the wire boundary via `RemoteEventType = string` and casts to
33
+ * `EventType` at the local re-publish boundary so the rest of the
34
+ * pipeline sees a stable type. A debug log names any unrecognised type
35
+ * so ops can audit drift.
36
+ *
37
+ * @module services/cloud/cloud-event-bridge.service
38
+ */
39
+ import { type ComponentLogger } from '../core/logger.service.js';
40
+ import type { EventBusService } from '../event-bus/event-bus.service.js';
41
+ import { type IncomingMessage } from './cloud-sync.types.js';
42
+ /**
43
+ * Minimum shape this bridge needs from the upstream cloud transport.
44
+ * Defined locally rather than importing the full {@link CloudSyncService}
45
+ * type so the bridge is unit-testable with a tiny mock and isn't coupled
46
+ * to the whole transport surface.
47
+ */
48
+ export interface CloudMessageEmitter {
49
+ on(eventName: 'message', listener: (msg: IncomingMessage) => void): this;
50
+ off(eventName: 'message', listener: (msg: IncomingMessage) => void): this;
51
+ }
52
+ /**
53
+ * Constructor dependencies for the inbound bridge.
54
+ */
55
+ export interface CloudEventInboundBridgeDeps {
56
+ /** Cloud transport that emits 'message' events (CloudSyncService in prod). */
57
+ cloudSync: CloudMessageEmitter;
58
+ /** Local event bus the bridge publishes onto. */
59
+ eventBus: EventBusService;
60
+ /** Optional logger override (test isolation). */
61
+ logger?: ComponentLogger;
62
+ }
63
+ /**
64
+ * Bridges inbound cross-machine events from Cloud Relay → local EventBus.
65
+ *
66
+ * @example
67
+ * ```typescript
68
+ * const bridge = new CloudEventInboundBridge({
69
+ * cloudSync: CloudSyncService.getInstance(),
70
+ * eventBus: EventBusService.getInstance(),
71
+ * });
72
+ * bridge.start();
73
+ * // ... later
74
+ * bridge.stop();
75
+ * ```
76
+ */
77
+ export declare class CloudEventInboundBridge {
78
+ private readonly logger;
79
+ private readonly cloudSync;
80
+ private readonly eventBus;
81
+ /**
82
+ * Bound listener kept so {@link stop} can detach it cleanly. Without
83
+ * this, repeated start/stop cycles (dev reloads, tests) would leak
84
+ * additional listeners.
85
+ */
86
+ private listener;
87
+ /** Whether the bridge is currently subscribed. */
88
+ private running;
89
+ /**
90
+ * Construct the bridge. Subscription does NOT start until
91
+ * {@link start} is called explicitly so callers control lifecycle.
92
+ */
93
+ constructor(deps: CloudEventInboundBridgeDeps);
94
+ /**
95
+ * Subscribe to the cloud transport's `'message'` event. Idempotent — a
96
+ * second `start()` call is a no-op.
97
+ */
98
+ start(): void;
99
+ /**
100
+ * Detach the cloud transport listener. Safe to call when not running.
101
+ */
102
+ stop(): void;
103
+ /**
104
+ * Process a single inbound cloud message. Filters on `type === 'event'`,
105
+ * validates the payload shape, then re-publishes the carried AgentEvent
106
+ * onto the local EventBus with `source = 'remote'` + `originDeviceId`.
107
+ *
108
+ * Public for unit tests only; production code should drive the bridge
109
+ * via the cloud transport's `'message'` event.
110
+ */
111
+ handle(msg: IncomingMessage): void;
112
+ }
113
+ //# sourceMappingURL=cloud-event-bridge.service.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cloud-event-bridge.service.d.ts","sourceRoot":"","sources":["../../../../../../backend/src/services/cloud/cloud-event-bridge.service.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAqCG;AAEH,OAAO,EAAiB,KAAK,eAAe,EAAE,MAAM,2BAA2B,CAAC;AAEhF,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,mCAAmC,CAAC;AAOzE,OAAO,EAEN,KAAK,eAAe,EACpB,MAAM,uBAAuB,CAAC;AAE/B;;;;;GAKG;AACH,MAAM,WAAW,mBAAmB;IACnC,EAAE,CAAC,SAAS,EAAE,SAAS,EAAE,QAAQ,EAAE,CAAC,GAAG,EAAE,eAAe,KAAK,IAAI,GAAG,IAAI,CAAC;IACzE,GAAG,CAAC,SAAS,EAAE,SAAS,EAAE,QAAQ,EAAE,CAAC,GAAG,EAAE,eAAe,KAAK,IAAI,GAAG,IAAI,CAAC;CAC1E;AAED;;GAEG;AACH,MAAM,WAAW,2BAA2B;IAC3C,8EAA8E;IAC9E,SAAS,EAAE,mBAAmB,CAAC;IAC/B,iDAAiD;IACjD,QAAQ,EAAE,eAAe,CAAC;IAC1B,iDAAiD;IACjD,MAAM,CAAC,EAAE,eAAe,CAAC;CACzB;AAED;;;;;;;;;;;;;GAaG;AACH,qBAAa,uBAAuB;IACnC,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAkB;IACzC,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAsB;IAChD,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAkB;IAE3C;;;;OAIG;IACH,OAAO,CAAC,QAAQ,CAAiD;IAEjE,kDAAkD;IAClD,OAAO,CAAC,OAAO,CAAS;IAExB;;;OAGG;gBACS,IAAI,EAAE,2BAA2B;IAQ7C;;;OAGG;IACH,KAAK,IAAI,IAAI;IAoBb;;OAEG;IACH,IAAI,IAAI,IAAI;IAQZ;;;;;;;OAOG;IACI,MAAM,CAAC,GAAG,EAAE,eAAe,GAAG,IAAI;CAwDzC"}
@@ -0,0 +1,179 @@
1
+ /**
2
+ * Cloud Event Inbound Bridge — autonomy_v1.f1
3
+ *
4
+ * Receives `'event'` MessageType inbound from the Cloud Relay (via the
5
+ * existing CloudSyncService poll → `'message'` event-emitter hop) and
6
+ * re-publishes the carried AgentEvent onto the local EventBusService with
7
+ * `source = 'remote'` and `originDeviceId` stamped from the wire envelope.
8
+ *
9
+ * Compose-at-boundary discipline (per Arch verdict 2026-04-28 N1):
10
+ * - CloudSyncService stays a transport — it polls Cloud, dedupes by
11
+ * `processedMessageIds`, emits an in-process `'message'` event.
12
+ * - This service is the AgentEvent translator. It owns the bridge between
13
+ * the cloud message vocabulary (`MessageType` + `EventMessagePayload`)
14
+ * and the local event-bus vocabulary (`AgentEvent`). It does NOT touch
15
+ * the poll loop or the cloud transport.
16
+ *
17
+ * Mirrors the BRIDGE-1 ↔ EventBus separation pattern: CloudSync EMITS,
18
+ * downstream LISTENS. Same shape as PR #347 (BrandOnboarding ⊥
19
+ * OnboardingService) and PR #348 (StatusBadge ⊥ RequestStatusPill) where
20
+ * two parallel modules share a single narrow artifact.
21
+ *
22
+ * Idempotency:
23
+ * The local LRU at CloudSyncService blocks at-least-once cloud-message-id
24
+ * re-delivery upstream. The recent-publish suppression in EventBusService
25
+ * (post-M2 fix: `${type}:${sessionName}:${event.id}`) catches any
26
+ * duplicate that slips through to the publish boundary. The TriggerEngine
27
+ * per-trigger dedup `${triggerId}:${event.id}` (Slice 3) is the third
28
+ * layer at the trigger fire boundary.
29
+ *
30
+ * Unknown peer event types (Arch Q4):
31
+ * The closed `EVENT_TYPES` enum stays closed. Bridge accepts any string
32
+ * at the wire boundary via `RemoteEventType = string` and casts to
33
+ * `EventType` at the local re-publish boundary so the rest of the
34
+ * pipeline sees a stable type. A debug log names any unrecognised type
35
+ * so ops can audit drift.
36
+ *
37
+ * @module services/cloud/cloud-event-bridge.service
38
+ */
39
+ import { LoggerService } from '../core/logger.service.js';
40
+ import { formatError } from '../../utils/format-error.js';
41
+ import { EVENT_TYPES } from '../../types/event-bus.types.js';
42
+ import { isEventMessagePayload, } from './cloud-sync.types.js';
43
+ /**
44
+ * Bridges inbound cross-machine events from Cloud Relay → local EventBus.
45
+ *
46
+ * @example
47
+ * ```typescript
48
+ * const bridge = new CloudEventInboundBridge({
49
+ * cloudSync: CloudSyncService.getInstance(),
50
+ * eventBus: EventBusService.getInstance(),
51
+ * });
52
+ * bridge.start();
53
+ * // ... later
54
+ * bridge.stop();
55
+ * ```
56
+ */
57
+ export class CloudEventInboundBridge {
58
+ logger;
59
+ cloudSync;
60
+ eventBus;
61
+ /**
62
+ * Bound listener kept so {@link stop} can detach it cleanly. Without
63
+ * this, repeated start/stop cycles (dev reloads, tests) would leak
64
+ * additional listeners.
65
+ */
66
+ listener = null;
67
+ /** Whether the bridge is currently subscribed. */
68
+ running = false;
69
+ /**
70
+ * Construct the bridge. Subscription does NOT start until
71
+ * {@link start} is called explicitly so callers control lifecycle.
72
+ */
73
+ constructor(deps) {
74
+ this.cloudSync = deps.cloudSync;
75
+ this.eventBus = deps.eventBus;
76
+ this.logger =
77
+ deps.logger ??
78
+ LoggerService.getInstance().createComponentLogger('CloudEventInboundBridge');
79
+ }
80
+ /**
81
+ * Subscribe to the cloud transport's `'message'` event. Idempotent — a
82
+ * second `start()` call is a no-op.
83
+ */
84
+ start() {
85
+ if (this.running)
86
+ return;
87
+ this.listener = (msg) => {
88
+ try {
89
+ this.handle(msg);
90
+ }
91
+ catch (err) {
92
+ // Defensive — handle() already swallows known failure modes,
93
+ // but a thrown error here MUST NOT poison other 'message'
94
+ // listeners on the cloud transport.
95
+ this.logger.error('CloudEventInboundBridge handler threw', {
96
+ error: formatError(err),
97
+ messageId: msg?.id,
98
+ });
99
+ }
100
+ };
101
+ this.cloudSync.on('message', this.listener);
102
+ this.running = true;
103
+ this.logger.info('CloudEventInboundBridge started — listening for `event` MessageType');
104
+ }
105
+ /**
106
+ * Detach the cloud transport listener. Safe to call when not running.
107
+ */
108
+ stop() {
109
+ if (this.listener) {
110
+ this.cloudSync.off('message', this.listener);
111
+ this.listener = null;
112
+ }
113
+ this.running = false;
114
+ }
115
+ /**
116
+ * Process a single inbound cloud message. Filters on `type === 'event'`,
117
+ * validates the payload shape, then re-publishes the carried AgentEvent
118
+ * onto the local EventBus with `source = 'remote'` + `originDeviceId`.
119
+ *
120
+ * Public for unit tests only; production code should drive the bridge
121
+ * via the cloud transport's `'message'` event.
122
+ */
123
+ handle(msg) {
124
+ // Wrong type — leave it for the consumer that actually owns it
125
+ // (CrossMachineMessageRouter, browser command handler, etc).
126
+ if (msg.type !== 'event') {
127
+ return;
128
+ }
129
+ if (!isEventMessagePayload(msg.payload)) {
130
+ this.logger.warn('Dropping malformed cross-machine event payload', {
131
+ messageId: msg.id,
132
+ from: msg.from,
133
+ });
134
+ return;
135
+ }
136
+ const { event: wireEvent, originDeviceId, originDeviceName } = msg.payload;
137
+ const remoteType = wireEvent.type;
138
+ // Per Arch Q4: log when a peer ships a type we don't know locally.
139
+ // We still re-publish — closed-enum sync would create a deployment-
140
+ // ordering constraint we explicitly rejected.
141
+ if (!isKnownEventType(remoteType)) {
142
+ this.logger.debug('Cross-machine event with unknown-to-local event type — accepting via RemoteEventType boundary', {
143
+ messageId: msg.id,
144
+ eventId: wireEvent.id,
145
+ unknownType: remoteType,
146
+ originDeviceId,
147
+ });
148
+ }
149
+ // Build the AgentEvent. Wire payload may carry extra fields the
150
+ // origin device knew about (e.g. workItemId, missionId, requestId)
151
+ // — pass them through unchanged. Our bridge only stamps the two
152
+ // origin-tag fields.
153
+ const agentEvent = {
154
+ ...wireEvent,
155
+ // Cast at the boundary per Arch Q4. Closed `EVENT_TYPES` enum
156
+ // stays closed; downstream consumers see a stable EventType.
157
+ type: remoteType,
158
+ source: 'remote',
159
+ originDeviceId,
160
+ };
161
+ this.logger.info('Re-publishing cross-machine event onto local EventBus', {
162
+ messageId: msg.id,
163
+ eventId: agentEvent.id,
164
+ eventType: agentEvent.type,
165
+ originDeviceId,
166
+ originDeviceName,
167
+ });
168
+ this.eventBus.publish(agentEvent);
169
+ }
170
+ }
171
+ /**
172
+ * Internal helper — true when the wire event-type matches the closed
173
+ * `EVENT_TYPES` enum. Used only for the debug-log breadcrumb; does NOT
174
+ * gate re-publish (per Arch Q4).
175
+ */
176
+ function isKnownEventType(value) {
177
+ return EVENT_TYPES.includes(value);
178
+ }
179
+ //# sourceMappingURL=cloud-event-bridge.service.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cloud-event-bridge.service.js","sourceRoot":"","sources":["../../../../../../backend/src/services/cloud/cloud-event-bridge.service.ts"],"names":[],"mappings":"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"}