crewly 1.20.193 → 1.20.195

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 (407) hide show
  1. package/config/roles/auditor/prompt.md +2 -2
  2. package/config/roles/orchestrator/fragments/communication.md +1 -1
  3. package/config/roles/orchestrator/prompt.md +15 -505
  4. package/config/skills/agent/computer-use/SKILL.md +6 -0
  5. package/config/skills/agent/core/experiment-card/SKILL.md +101 -0
  6. package/config/skills/agent/core/experiment-card/execute.sh +149 -0
  7. package/config/skills/agent/core/experiment-card/execute.test.sh +97 -0
  8. package/config/skills/agent/desktop-app-control/execute.sh +5 -2
  9. package/config/skills/orchestrator/send-message/execute.sh +19 -2
  10. package/config/skills/orchestrator/send-message/execute.test.sh +80 -0
  11. package/config/skills/registry.json +7 -5
  12. package/config/skills/team-leader/signal-digest/SKILL.md +110 -0
  13. package/config/skills/team-leader/signal-digest/execute.sh +173 -0
  14. package/config/skills/team-leader/signal-digest/execute.test.sh +123 -0
  15. package/config/skills/team-leader/signal-digest/signal-digest.config.example.json +23 -0
  16. package/config/skills/team-leader/signal-digest/signal_digest.py +572 -0
  17. package/config/skills/team-leader/signal-digest/signal_digest.test.py +319 -0
  18. package/dist/backend/backend/src/constants.d.ts +191 -1
  19. package/dist/backend/backend/src/constants.d.ts.map +1 -1
  20. package/dist/backend/backend/src/constants.js +194 -1
  21. package/dist/backend/backend/src/constants.js.map +1 -1
  22. package/dist/backend/backend/src/controllers/chat/chat.controller.d.ts.map +1 -1
  23. package/dist/backend/backend/src/controllers/chat/chat.controller.js +6 -0
  24. package/dist/backend/backend/src/controllers/chat/chat.controller.js.map +1 -1
  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 +3 -1
  27. package/dist/backend/backend/src/controllers/chat-v2/chat-v2.controller.js.map +1 -1
  28. package/dist/backend/backend/src/controllers/experiments/experiments.routes.d.ts +27 -0
  29. package/dist/backend/backend/src/controllers/experiments/experiments.routes.d.ts.map +1 -0
  30. package/dist/backend/backend/src/controllers/experiments/experiments.routes.js +96 -0
  31. package/dist/backend/backend/src/controllers/experiments/experiments.routes.js.map +1 -0
  32. package/dist/backend/backend/src/controllers/marketplace/marketplace.routes.d.ts +1 -0
  33. package/dist/backend/backend/src/controllers/marketplace/marketplace.routes.d.ts.map +1 -1
  34. package/dist/backend/backend/src/controllers/marketplace/marketplace.routes.js +1 -0
  35. package/dist/backend/backend/src/controllers/marketplace/marketplace.routes.js.map +1 -1
  36. package/dist/backend/backend/src/controllers/monitoring/terminal.controller.d.ts.map +1 -1
  37. package/dist/backend/backend/src/controllers/monitoring/terminal.controller.js +5 -2
  38. package/dist/backend/backend/src/controllers/monitoring/terminal.controller.js.map +1 -1
  39. package/dist/backend/backend/src/controllers/request/request.controller.d.ts.map +1 -1
  40. package/dist/backend/backend/src/controllers/request/request.controller.js +5 -1
  41. package/dist/backend/backend/src/controllers/request/request.controller.js.map +1 -1
  42. package/dist/backend/backend/src/controllers/settings/settings.controller.d.ts.map +1 -1
  43. package/dist/backend/backend/src/controllers/settings/settings.controller.js +18 -2
  44. package/dist/backend/backend/src/controllers/settings/settings.controller.js.map +1 -1
  45. package/dist/backend/backend/src/controllers/signal-digest/signal-digest.controller.d.ts +26 -0
  46. package/dist/backend/backend/src/controllers/signal-digest/signal-digest.controller.d.ts.map +1 -0
  47. package/dist/backend/backend/src/controllers/signal-digest/signal-digest.controller.js +100 -0
  48. package/dist/backend/backend/src/controllers/signal-digest/signal-digest.controller.js.map +1 -0
  49. package/dist/backend/backend/src/controllers/trace/trace.controller.d.ts +47 -0
  50. package/dist/backend/backend/src/controllers/trace/trace.controller.d.ts.map +1 -0
  51. package/dist/backend/backend/src/controllers/trace/trace.controller.js +169 -0
  52. package/dist/backend/backend/src/controllers/trace/trace.controller.js.map +1 -0
  53. package/dist/backend/backend/src/index.d.ts.map +1 -1
  54. package/dist/backend/backend/src/index.js +66 -20
  55. package/dist/backend/backend/src/index.js.map +1 -1
  56. package/dist/backend/backend/src/routes/api.routes.d.ts.map +1 -1
  57. package/dist/backend/backend/src/routes/api.routes.js +14 -0
  58. package/dist/backend/backend/src/routes/api.routes.js.map +1 -1
  59. package/dist/backend/backend/src/services/agent/agent-registration.service.d.ts.map +1 -1
  60. package/dist/backend/backend/src/services/agent/agent-registration.service.js +6 -1
  61. package/dist/backend/backend/src/services/agent/agent-registration.service.js.map +1 -1
  62. package/dist/backend/backend/src/services/agent/auditor-scheduler.service.d.ts.map +1 -1
  63. package/dist/backend/backend/src/services/agent/auditor-scheduler.service.js +3 -0
  64. package/dist/backend/backend/src/services/agent/auditor-scheduler.service.js.map +1 -1
  65. package/dist/backend/backend/src/services/agent/oauth-relogin-monitor.service.d.ts +1 -1
  66. package/dist/backend/backend/src/services/agent/oauth-relogin-monitor.service.d.ts.map +1 -1
  67. package/dist/backend/backend/src/services/agent/runtime-session-recovery.d.ts +4 -2
  68. package/dist/backend/backend/src/services/agent/runtime-session-recovery.d.ts.map +1 -1
  69. package/dist/backend/backend/src/services/agent/runtime-session-recovery.js +22 -6
  70. package/dist/backend/backend/src/services/agent/runtime-session-recovery.js.map +1 -1
  71. package/dist/backend/backend/src/services/ai/prompt-modules/communication.module.js +2 -2
  72. package/dist/backend/backend/src/services/ai/prompt-modules/communication.module.js.map +1 -1
  73. package/dist/backend/backend/src/services/ai/prompt-modules/skills-reference.module.d.ts.map +1 -1
  74. package/dist/backend/backend/src/services/ai/prompt-modules/skills-reference.module.js +1 -0
  75. package/dist/backend/backend/src/services/ai/prompt-modules/skills-reference.module.js.map +1 -1
  76. package/dist/backend/backend/src/services/backup/backup-archive.service.d.ts +6 -0
  77. package/dist/backend/backend/src/services/backup/backup-archive.service.d.ts.map +1 -1
  78. package/dist/backend/backend/src/services/backup/backup-archive.service.js +7 -1
  79. package/dist/backend/backend/src/services/backup/backup-archive.service.js.map +1 -1
  80. package/dist/backend/backend/src/services/boot/boot-announce.service.d.ts +1 -1
  81. package/dist/backend/backend/src/services/boot/boot-announce.service.d.ts.map +1 -1
  82. package/dist/backend/backend/src/services/canva/canva-token.service.d.ts.map +1 -1
  83. package/dist/backend/backend/src/services/canva/canva-token.service.js +5 -0
  84. package/dist/backend/backend/src/services/canva/canva-token.service.js.map +1 -1
  85. package/dist/backend/backend/src/services/chat/chat.service.d.ts +78 -2
  86. package/dist/backend/backend/src/services/chat/chat.service.d.ts.map +1 -1
  87. package/dist/backend/backend/src/services/chat/chat.service.js +210 -26
  88. package/dist/backend/backend/src/services/chat/chat.service.js.map +1 -1
  89. package/dist/backend/backend/src/services/chat-v2/chat-v2.dispatcher.service.d.ts +14 -3
  90. package/dist/backend/backend/src/services/chat-v2/chat-v2.dispatcher.service.d.ts.map +1 -1
  91. package/dist/backend/backend/src/services/chat-v2/chat-v2.dispatcher.service.js +28 -4
  92. package/dist/backend/backend/src/services/chat-v2/chat-v2.dispatcher.service.js.map +1 -1
  93. package/dist/backend/backend/src/services/chat-v2/chat-v2.service.d.ts +4 -3
  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 +7 -4
  96. package/dist/backend/backend/src/services/chat-v2/chat-v2.service.js.map +1 -1
  97. package/dist/backend/backend/src/services/decisions/decision-store.d.ts.map +1 -1
  98. package/dist/backend/backend/src/services/decisions/decision-store.js +5 -1
  99. package/dist/backend/backend/src/services/decisions/decision-store.js.map +1 -1
  100. package/dist/backend/backend/src/services/decisions/decision.wiring.d.ts +10 -1
  101. package/dist/backend/backend/src/services/decisions/decision.wiring.d.ts.map +1 -1
  102. package/dist/backend/backend/src/services/decisions/decision.wiring.js +20 -9
  103. package/dist/backend/backend/src/services/decisions/decision.wiring.js.map +1 -1
  104. package/dist/backend/backend/src/services/experiments/experiment-verdict.d.ts +88 -0
  105. package/dist/backend/backend/src/services/experiments/experiment-verdict.d.ts.map +1 -0
  106. package/dist/backend/backend/src/services/experiments/experiment-verdict.js +226 -0
  107. package/dist/backend/backend/src/services/experiments/experiment-verdict.js.map +1 -0
  108. package/dist/backend/backend/src/services/experiments/experiment.service.d.ts +350 -0
  109. package/dist/backend/backend/src/services/experiments/experiment.service.d.ts.map +1 -0
  110. package/dist/backend/backend/src/services/experiments/experiment.service.js +908 -0
  111. package/dist/backend/backend/src/services/experiments/experiment.service.js.map +1 -0
  112. package/dist/backend/backend/src/services/experiments/experiment.wiring.d.ts +88 -0
  113. package/dist/backend/backend/src/services/experiments/experiment.wiring.d.ts.map +1 -0
  114. package/dist/backend/backend/src/services/experiments/experiment.wiring.js +162 -0
  115. package/dist/backend/backend/src/services/experiments/experiment.wiring.js.map +1 -0
  116. package/dist/backend/backend/src/services/experiments/seo-ops-metric.fetcher.d.ts +67 -0
  117. package/dist/backend/backend/src/services/experiments/seo-ops-metric.fetcher.d.ts.map +1 -0
  118. package/dist/backend/backend/src/services/experiments/seo-ops-metric.fetcher.js +133 -0
  119. package/dist/backend/backend/src/services/experiments/seo-ops-metric.fetcher.js.map +1 -0
  120. package/dist/backend/backend/src/services/google/google-workspace-token.service.d.ts.map +1 -1
  121. package/dist/backend/backend/src/services/google/google-workspace-token.service.js +5 -0
  122. package/dist/backend/backend/src/services/google/google-workspace-token.service.js.map +1 -1
  123. package/dist/backend/backend/src/services/messaging/owner-message-watchdog.service.d.ts.map +1 -1
  124. package/dist/backend/backend/src/services/messaging/owner-message-watchdog.service.js +7 -0
  125. package/dist/backend/backend/src/services/messaging/owner-message-watchdog.service.js.map +1 -1
  126. package/dist/backend/backend/src/services/messaging/queue-processor.service.d.ts +11 -3
  127. package/dist/backend/backend/src/services/messaging/queue-processor.service.d.ts.map +1 -1
  128. package/dist/backend/backend/src/services/messaging/queue-processor.service.js +24 -7
  129. package/dist/backend/backend/src/services/messaging/queue-processor.service.js.map +1 -1
  130. package/dist/backend/backend/src/services/microsoft/microsoft-token.service.d.ts.map +1 -1
  131. package/dist/backend/backend/src/services/microsoft/microsoft-token.service.js +5 -0
  132. package/dist/backend/backend/src/services/microsoft/microsoft-token.service.js.map +1 -1
  133. package/dist/backend/backend/src/services/monitoring/token-usage.service.d.ts +7 -0
  134. package/dist/backend/backend/src/services/monitoring/token-usage.service.d.ts.map +1 -1
  135. package/dist/backend/backend/src/services/monitoring/token-usage.service.js +4 -0
  136. package/dist/backend/backend/src/services/monitoring/token-usage.service.js.map +1 -1
  137. package/dist/backend/backend/src/services/orc/orc-status-router.service.d.ts.map +1 -1
  138. package/dist/backend/backend/src/services/orc/orc-status-router.service.js +12 -3
  139. package/dist/backend/backend/src/services/orc/orc-status-router.service.js.map +1 -1
  140. package/dist/backend/backend/src/services/orc/reply-destination.wiring.d.ts.map +1 -1
  141. package/dist/backend/backend/src/services/orc/reply-destination.wiring.js +16 -0
  142. package/dist/backend/backend/src/services/orc/reply-destination.wiring.js.map +1 -1
  143. package/dist/backend/backend/src/services/people/acting-for.service.d.ts +42 -5
  144. package/dist/backend/backend/src/services/people/acting-for.service.d.ts.map +1 -1
  145. package/dist/backend/backend/src/services/people/acting-for.service.js +80 -5
  146. package/dist/backend/backend/src/services/people/acting-for.service.js.map +1 -1
  147. package/dist/backend/backend/src/services/people/grant-sharing.d.ts +5 -4
  148. package/dist/backend/backend/src/services/people/grant-sharing.d.ts.map +1 -1
  149. package/dist/backend/backend/src/services/people/grant-sharing.js +12 -4
  150. package/dist/backend/backend/src/services/people/grant-sharing.js.map +1 -1
  151. package/dist/backend/backend/src/services/people/people-directory.service.d.ts +71 -13
  152. package/dist/backend/backend/src/services/people/people-directory.service.d.ts.map +1 -1
  153. package/dist/backend/backend/src/services/people/people-directory.service.js +164 -27
  154. package/dist/backend/backend/src/services/people/people-directory.service.js.map +1 -1
  155. package/dist/backend/backend/src/services/project-tickets/project-ticket.service.d.ts.map +1 -1
  156. package/dist/backend/backend/src/services/project-tickets/project-ticket.service.js +2 -0
  157. package/dist/backend/backend/src/services/project-tickets/project-ticket.service.js.map +1 -1
  158. package/dist/backend/backend/src/services/reconciler/reconciler.service.d.ts.map +1 -1
  159. package/dist/backend/backend/src/services/reconciler/reconciler.service.js +15 -0
  160. package/dist/backend/backend/src/services/reconciler/reconciler.service.js.map +1 -1
  161. package/dist/backend/backend/src/services/session/session-handoff.service.d.ts.map +1 -1
  162. package/dist/backend/backend/src/services/session/session-handoff.service.js +8 -5
  163. package/dist/backend/backend/src/services/session/session-handoff.service.js.map +1 -1
  164. package/dist/backend/backend/src/services/signal-digest/signal-digest-card.d.ts +75 -0
  165. package/dist/backend/backend/src/services/signal-digest/signal-digest-card.d.ts.map +1 -0
  166. package/dist/backend/backend/src/services/signal-digest/signal-digest-card.js +187 -0
  167. package/dist/backend/backend/src/services/signal-digest/signal-digest-card.js.map +1 -0
  168. package/dist/backend/backend/src/services/signal-digest/signal-digest-contract.d.ts +86 -0
  169. package/dist/backend/backend/src/services/signal-digest/signal-digest-contract.d.ts.map +1 -0
  170. package/dist/backend/backend/src/services/signal-digest/signal-digest-contract.js +307 -0
  171. package/dist/backend/backend/src/services/signal-digest/signal-digest-contract.js.map +1 -0
  172. package/dist/backend/backend/src/services/signal-digest/signal-digest-store.d.ts +85 -0
  173. package/dist/backend/backend/src/services/signal-digest/signal-digest-store.d.ts.map +1 -0
  174. package/dist/backend/backend/src/services/signal-digest/signal-digest-store.js +185 -0
  175. package/dist/backend/backend/src/services/signal-digest/signal-digest-store.js.map +1 -0
  176. package/dist/backend/backend/src/services/signal-digest/signal-digest.service.d.ts +272 -0
  177. package/dist/backend/backend/src/services/signal-digest/signal-digest.service.d.ts.map +1 -0
  178. package/dist/backend/backend/src/services/signal-digest/signal-digest.service.js +570 -0
  179. package/dist/backend/backend/src/services/signal-digest/signal-digest.service.js.map +1 -0
  180. package/dist/backend/backend/src/services/signal-digest/signal-digest.wiring.d.ts +51 -0
  181. package/dist/backend/backend/src/services/signal-digest/signal-digest.wiring.d.ts.map +1 -0
  182. package/dist/backend/backend/src/services/signal-digest/signal-digest.wiring.js +116 -0
  183. package/dist/backend/backend/src/services/signal-digest/signal-digest.wiring.js.map +1 -0
  184. package/dist/backend/backend/src/services/slack/notify-reconciliation.service.d.ts +5 -1
  185. package/dist/backend/backend/src/services/slack/notify-reconciliation.service.d.ts.map +1 -1
  186. package/dist/backend/backend/src/services/slack/notify-reconciliation.service.js +6 -2
  187. package/dist/backend/backend/src/services/slack/notify-reconciliation.service.js.map +1 -1
  188. package/dist/backend/backend/src/services/slack/slack-bot-ids.d.ts +33 -0
  189. package/dist/backend/backend/src/services/slack/slack-bot-ids.d.ts.map +1 -0
  190. package/dist/backend/backend/src/services/slack/slack-bot-ids.js +56 -0
  191. package/dist/backend/backend/src/services/slack/slack-bot-ids.js.map +1 -0
  192. package/dist/backend/backend/src/services/slack/slack-orchestrator-bridge.d.ts +14 -1
  193. package/dist/backend/backend/src/services/slack/slack-orchestrator-bridge.d.ts.map +1 -1
  194. package/dist/backend/backend/src/services/slack/slack-orchestrator-bridge.js +30 -10
  195. package/dist/backend/backend/src/services/slack/slack-orchestrator-bridge.js.map +1 -1
  196. package/dist/backend/backend/src/services/slack/slack-relogin-dm.service.d.ts +1 -1
  197. package/dist/backend/backend/src/services/slack/slack-relogin-dm.service.d.ts.map +1 -1
  198. package/dist/backend/backend/src/services/slack/slack.service.d.ts +31 -1
  199. package/dist/backend/backend/src/services/slack/slack.service.d.ts.map +1 -1
  200. package/dist/backend/backend/src/services/slack/slack.service.js +52 -7
  201. package/dist/backend/backend/src/services/slack/slack.service.js.map +1 -1
  202. package/dist/backend/backend/src/services/system/auto-update.service.d.ts +2 -2
  203. package/dist/backend/backend/src/services/system/auto-update.service.d.ts.map +1 -1
  204. package/dist/backend/backend/src/services/task-pool/pool-storage.d.ts.map +1 -1
  205. package/dist/backend/backend/src/services/task-pool/pool-storage.js +4 -0
  206. package/dist/backend/backend/src/services/task-pool/pool-storage.js.map +1 -1
  207. package/dist/backend/backend/src/services/task-pool/task-pool.service.d.ts.map +1 -1
  208. package/dist/backend/backend/src/services/task-pool/task-pool.service.js +2 -0
  209. package/dist/backend/backend/src/services/task-pool/task-pool.service.js.map +1 -1
  210. package/dist/backend/backend/src/services/trace/trace-context.service.d.ts +195 -0
  211. package/dist/backend/backend/src/services/trace/trace-context.service.d.ts.map +1 -0
  212. package/dist/backend/backend/src/services/trace/trace-context.service.js +432 -0
  213. package/dist/backend/backend/src/services/trace/trace-context.service.js.map +1 -0
  214. package/dist/backend/backend/src/services/trace/trace-http.middleware.d.ts +42 -0
  215. package/dist/backend/backend/src/services/trace/trace-http.middleware.d.ts.map +1 -0
  216. package/dist/backend/backend/src/services/trace/trace-http.middleware.js +146 -0
  217. package/dist/backend/backend/src/services/trace/trace-http.middleware.js.map +1 -0
  218. package/dist/backend/backend/src/services/trace/trace-markers.d.ts +93 -0
  219. package/dist/backend/backend/src/services/trace/trace-markers.d.ts.map +1 -0
  220. package/dist/backend/backend/src/services/trace/trace-markers.js +162 -0
  221. package/dist/backend/backend/src/services/trace/trace-markers.js.map +1 -0
  222. package/dist/backend/backend/src/services/trace/trace-recorder.d.ts +290 -0
  223. package/dist/backend/backend/src/services/trace/trace-recorder.d.ts.map +1 -0
  224. package/dist/backend/backend/src/services/trace/trace-recorder.js +669 -0
  225. package/dist/backend/backend/src/services/trace/trace-recorder.js.map +1 -0
  226. package/dist/backend/backend/src/services/trace/trace-store.d.ts +269 -0
  227. package/dist/backend/backend/src/services/trace/trace-store.d.ts.map +1 -0
  228. package/dist/backend/backend/src/services/trace/trace-store.js +602 -0
  229. package/dist/backend/backend/src/services/trace/trace-store.js.map +1 -0
  230. package/dist/backend/backend/src/services/trace/trace.types.d.ts +118 -0
  231. package/dist/backend/backend/src/services/trace/trace.types.d.ts.map +1 -0
  232. package/dist/backend/backend/src/services/trace/trace.types.js +85 -0
  233. package/dist/backend/backend/src/services/trace/trace.types.js.map +1 -0
  234. package/dist/backend/backend/src/services/v3/owner-receipt/owner-receipt.boot.d.ts +1 -1
  235. package/dist/backend/backend/src/services/v3/owner-receipt/owner-receipt.boot.d.ts.map +1 -1
  236. package/dist/backend/backend/src/services/v3/request.service.d.ts.map +1 -1
  237. package/dist/backend/backend/src/services/v3/request.service.js +4 -0
  238. package/dist/backend/backend/src/services/v3/request.service.js.map +1 -1
  239. package/dist/backend/backend/src/services/v3/workitem-dispatch.subscriber.d.ts.map +1 -1
  240. package/dist/backend/backend/src/services/v3/workitem-dispatch.subscriber.js +22 -2
  241. package/dist/backend/backend/src/services/v3/workitem-dispatch.subscriber.js.map +1 -1
  242. package/dist/backend/backend/src/services/wiki/wiki-ingest.service.d.ts +3 -1
  243. package/dist/backend/backend/src/services/wiki/wiki-ingest.service.d.ts.map +1 -1
  244. package/dist/backend/backend/src/services/wiki/wiki-ingest.service.js.map +1 -1
  245. package/dist/backend/backend/src/services/workflow/message-scheduler.service.d.ts.map +1 -1
  246. package/dist/backend/backend/src/services/workflow/message-scheduler.service.js +3 -0
  247. package/dist/backend/backend/src/services/workflow/message-scheduler.service.js.map +1 -1
  248. package/dist/backend/backend/src/services/workflow/scheduler.service.d.ts.map +1 -1
  249. package/dist/backend/backend/src/services/workflow/scheduler.service.js +3 -0
  250. package/dist/backend/backend/src/services/workflow/scheduler.service.js.map +1 -1
  251. package/dist/backend/backend/src/services/worktree/worktree-janitor.service.d.ts +3 -0
  252. package/dist/backend/backend/src/services/worktree/worktree-janitor.service.d.ts.map +1 -1
  253. package/dist/backend/backend/src/services/worktree/worktree-janitor.service.js +7 -0
  254. package/dist/backend/backend/src/services/worktree/worktree-janitor.service.js.map +1 -1
  255. package/dist/backend/backend/src/types/experiment.types.d.ts +155 -0
  256. package/dist/backend/backend/src/types/experiment.types.d.ts.map +1 -0
  257. package/dist/backend/backend/src/types/experiment.types.js +32 -0
  258. package/dist/backend/backend/src/types/experiment.types.js.map +1 -0
  259. package/dist/backend/backend/src/types/messaging.types.d.ts +6 -0
  260. package/dist/backend/backend/src/types/messaging.types.d.ts.map +1 -1
  261. package/dist/backend/backend/src/types/messaging.types.js.map +1 -1
  262. package/dist/backend/backend/src/types/signal-digest.types.d.ts +185 -0
  263. package/dist/backend/backend/src/types/signal-digest.types.d.ts.map +1 -0
  264. package/dist/backend/backend/src/types/signal-digest.types.js +21 -0
  265. package/dist/backend/backend/src/types/signal-digest.types.js.map +1 -0
  266. package/dist/backend/backend/src/types/v2/request.types.d.ts +4 -0
  267. package/dist/backend/backend/src/types/v2/request.types.d.ts.map +1 -1
  268. package/dist/backend/backend/src/types/v2/request.types.js.map +1 -1
  269. package/dist/backend/backend/src/types/v2/work-item.types.d.ts +4 -0
  270. package/dist/backend/backend/src/types/v2/work-item.types.d.ts.map +1 -1
  271. package/dist/backend/backend/src/types/v2/work-item.types.js +1 -0
  272. package/dist/backend/backend/src/types/v2/work-item.types.js.map +1 -1
  273. package/dist/backend/backend/src/utils/security.d.ts +2 -0
  274. package/dist/backend/backend/src/utils/security.d.ts.map +1 -1
  275. package/dist/backend/backend/src/utils/security.js +3 -1
  276. package/dist/backend/backend/src/utils/security.js.map +1 -1
  277. package/dist/backend/backend/src/websocket/chat.gateway.d.ts +9 -0
  278. package/dist/backend/backend/src/websocket/chat.gateway.d.ts.map +1 -1
  279. package/dist/backend/backend/src/websocket/chat.gateway.js +26 -0
  280. package/dist/backend/backend/src/websocket/chat.gateway.js.map +1 -1
  281. package/dist/backend/build-info.json +2 -2
  282. package/dist/cli/backend/src/constants.d.ts +191 -1
  283. package/dist/cli/backend/src/constants.d.ts.map +1 -1
  284. package/dist/cli/backend/src/constants.js +194 -1
  285. package/dist/cli/backend/src/constants.js.map +1 -1
  286. package/dist/cli/backend/src/services/agent/agent-registration.service.d.ts.map +1 -1
  287. package/dist/cli/backend/src/services/agent/agent-registration.service.js +6 -1
  288. package/dist/cli/backend/src/services/agent/agent-registration.service.js.map +1 -1
  289. package/dist/cli/backend/src/services/agent/auditor-scheduler.service.d.ts.map +1 -1
  290. package/dist/cli/backend/src/services/agent/auditor-scheduler.service.js +3 -0
  291. package/dist/cli/backend/src/services/agent/auditor-scheduler.service.js.map +1 -1
  292. package/dist/cli/backend/src/services/agent/oauth-relogin-monitor.service.d.ts +1 -1
  293. package/dist/cli/backend/src/services/agent/oauth-relogin-monitor.service.d.ts.map +1 -1
  294. package/dist/cli/backend/src/services/agent/runtime-session-recovery.d.ts +4 -2
  295. package/dist/cli/backend/src/services/agent/runtime-session-recovery.d.ts.map +1 -1
  296. package/dist/cli/backend/src/services/agent/runtime-session-recovery.js +22 -6
  297. package/dist/cli/backend/src/services/agent/runtime-session-recovery.js.map +1 -1
  298. package/dist/cli/backend/src/services/ai/prompt-modules/communication.module.js +2 -2
  299. package/dist/cli/backend/src/services/ai/prompt-modules/communication.module.js.map +1 -1
  300. package/dist/cli/backend/src/services/ai/prompt-modules/skills-reference.module.d.ts.map +1 -1
  301. package/dist/cli/backend/src/services/ai/prompt-modules/skills-reference.module.js +1 -0
  302. package/dist/cli/backend/src/services/ai/prompt-modules/skills-reference.module.js.map +1 -1
  303. package/dist/cli/backend/src/services/backup/backup-archive.service.d.ts +6 -0
  304. package/dist/cli/backend/src/services/backup/backup-archive.service.d.ts.map +1 -1
  305. package/dist/cli/backend/src/services/backup/backup-archive.service.js +7 -1
  306. package/dist/cli/backend/src/services/backup/backup-archive.service.js.map +1 -1
  307. package/dist/cli/backend/src/services/chat/chat.service.d.ts +185 -0
  308. package/dist/cli/backend/src/services/chat/chat.service.d.ts.map +1 -0
  309. package/dist/cli/backend/src/services/chat/chat.service.js +558 -0
  310. package/dist/cli/backend/src/services/chat/chat.service.js.map +1 -0
  311. package/dist/cli/backend/src/services/chat-v2/chat-v2.dispatcher.service.d.ts +14 -3
  312. package/dist/cli/backend/src/services/chat-v2/chat-v2.dispatcher.service.d.ts.map +1 -1
  313. package/dist/cli/backend/src/services/chat-v2/chat-v2.dispatcher.service.js +28 -4
  314. package/dist/cli/backend/src/services/chat-v2/chat-v2.dispatcher.service.js.map +1 -1
  315. package/dist/cli/backend/src/services/chat-v2/chat-v2.service.d.ts +4 -3
  316. package/dist/cli/backend/src/services/chat-v2/chat-v2.service.d.ts.map +1 -1
  317. package/dist/cli/backend/src/services/chat-v2/chat-v2.service.js +7 -4
  318. package/dist/cli/backend/src/services/chat-v2/chat-v2.service.js.map +1 -1
  319. package/dist/cli/backend/src/services/decisions/decision-store.d.ts.map +1 -1
  320. package/dist/cli/backend/src/services/decisions/decision-store.js +5 -1
  321. package/dist/cli/backend/src/services/decisions/decision-store.js.map +1 -1
  322. package/dist/cli/backend/src/services/messaging/owner-message-watchdog.service.d.ts.map +1 -1
  323. package/dist/cli/backend/src/services/messaging/owner-message-watchdog.service.js +7 -0
  324. package/dist/cli/backend/src/services/messaging/owner-message-watchdog.service.js.map +1 -1
  325. package/dist/cli/backend/src/services/messaging/queue-processor.service.d.ts +11 -3
  326. package/dist/cli/backend/src/services/messaging/queue-processor.service.d.ts.map +1 -1
  327. package/dist/cli/backend/src/services/messaging/queue-processor.service.js +24 -7
  328. package/dist/cli/backend/src/services/messaging/queue-processor.service.js.map +1 -1
  329. package/dist/cli/backend/src/services/monitoring/token-usage.service.d.ts +7 -0
  330. package/dist/cli/backend/src/services/monitoring/token-usage.service.d.ts.map +1 -1
  331. package/dist/cli/backend/src/services/monitoring/token-usage.service.js +4 -0
  332. package/dist/cli/backend/src/services/monitoring/token-usage.service.js.map +1 -1
  333. package/dist/cli/backend/src/services/people/acting-for.service.d.ts +42 -5
  334. package/dist/cli/backend/src/services/people/acting-for.service.d.ts.map +1 -1
  335. package/dist/cli/backend/src/services/people/acting-for.service.js +80 -5
  336. package/dist/cli/backend/src/services/people/acting-for.service.js.map +1 -1
  337. package/dist/cli/backend/src/services/people/people-directory.service.d.ts +71 -13
  338. package/dist/cli/backend/src/services/people/people-directory.service.d.ts.map +1 -1
  339. package/dist/cli/backend/src/services/people/people-directory.service.js +164 -27
  340. package/dist/cli/backend/src/services/people/people-directory.service.js.map +1 -1
  341. package/dist/cli/backend/src/services/project-tickets/project-ticket.service.d.ts.map +1 -1
  342. package/dist/cli/backend/src/services/project-tickets/project-ticket.service.js +2 -0
  343. package/dist/cli/backend/src/services/project-tickets/project-ticket.service.js.map +1 -1
  344. package/dist/cli/backend/src/services/session/session-handoff.service.d.ts.map +1 -1
  345. package/dist/cli/backend/src/services/session/session-handoff.service.js +8 -5
  346. package/dist/cli/backend/src/services/session/session-handoff.service.js.map +1 -1
  347. package/dist/cli/backend/src/services/slack/slack-orchestrator-bridge.d.ts +14 -1
  348. package/dist/cli/backend/src/services/slack/slack-orchestrator-bridge.d.ts.map +1 -1
  349. package/dist/cli/backend/src/services/slack/slack-orchestrator-bridge.js +30 -10
  350. package/dist/cli/backend/src/services/slack/slack-orchestrator-bridge.js.map +1 -1
  351. package/dist/cli/backend/src/services/slack/slack.service.d.ts +31 -1
  352. package/dist/cli/backend/src/services/slack/slack.service.d.ts.map +1 -1
  353. package/dist/cli/backend/src/services/slack/slack.service.js +52 -7
  354. package/dist/cli/backend/src/services/slack/slack.service.js.map +1 -1
  355. package/dist/cli/backend/src/services/task-pool/pool-storage.d.ts.map +1 -1
  356. package/dist/cli/backend/src/services/task-pool/pool-storage.js +4 -0
  357. package/dist/cli/backend/src/services/task-pool/pool-storage.js.map +1 -1
  358. package/dist/cli/backend/src/services/task-pool/task-pool.service.d.ts.map +1 -1
  359. package/dist/cli/backend/src/services/task-pool/task-pool.service.js +2 -0
  360. package/dist/cli/backend/src/services/task-pool/task-pool.service.js.map +1 -1
  361. package/dist/cli/backend/src/services/trace/trace-context.service.d.ts +195 -0
  362. package/dist/cli/backend/src/services/trace/trace-context.service.d.ts.map +1 -0
  363. package/dist/cli/backend/src/services/trace/trace-context.service.js +432 -0
  364. package/dist/cli/backend/src/services/trace/trace-context.service.js.map +1 -0
  365. package/dist/cli/backend/src/services/trace/trace-markers.d.ts +93 -0
  366. package/dist/cli/backend/src/services/trace/trace-markers.d.ts.map +1 -0
  367. package/dist/cli/backend/src/services/trace/trace-markers.js +162 -0
  368. package/dist/cli/backend/src/services/trace/trace-markers.js.map +1 -0
  369. package/dist/cli/backend/src/services/trace/trace-recorder.d.ts +290 -0
  370. package/dist/cli/backend/src/services/trace/trace-recorder.d.ts.map +1 -0
  371. package/dist/cli/backend/src/services/trace/trace-recorder.js +669 -0
  372. package/dist/cli/backend/src/services/trace/trace-recorder.js.map +1 -0
  373. package/dist/cli/backend/src/services/trace/trace-store.d.ts +269 -0
  374. package/dist/cli/backend/src/services/trace/trace-store.d.ts.map +1 -0
  375. package/dist/cli/backend/src/services/trace/trace-store.js +602 -0
  376. package/dist/cli/backend/src/services/trace/trace-store.js.map +1 -0
  377. package/dist/cli/backend/src/services/trace/trace.types.d.ts +118 -0
  378. package/dist/cli/backend/src/services/trace/trace.types.d.ts.map +1 -0
  379. package/dist/cli/backend/src/services/trace/trace.types.js +85 -0
  380. package/dist/cli/backend/src/services/trace/trace.types.js.map +1 -0
  381. package/dist/cli/backend/src/services/v3/request.service.d.ts.map +1 -1
  382. package/dist/cli/backend/src/services/v3/request.service.js +4 -0
  383. package/dist/cli/backend/src/services/v3/request.service.js.map +1 -1
  384. package/dist/cli/backend/src/services/wiki/wiki-ingest.service.d.ts +3 -1
  385. package/dist/cli/backend/src/services/wiki/wiki-ingest.service.d.ts.map +1 -1
  386. package/dist/cli/backend/src/services/wiki/wiki-ingest.service.js.map +1 -1
  387. package/dist/cli/backend/src/types/messaging.types.d.ts +6 -0
  388. package/dist/cli/backend/src/types/messaging.types.d.ts.map +1 -1
  389. package/dist/cli/backend/src/types/messaging.types.js.map +1 -1
  390. package/dist/cli/backend/src/types/v2/request.types.d.ts +4 -0
  391. package/dist/cli/backend/src/types/v2/request.types.d.ts.map +1 -1
  392. package/dist/cli/backend/src/types/v2/request.types.js.map +1 -1
  393. package/dist/cli/backend/src/types/v2/work-item.types.d.ts +4 -0
  394. package/dist/cli/backend/src/types/v2/work-item.types.d.ts.map +1 -1
  395. package/dist/cli/backend/src/types/v2/work-item.types.js +1 -0
  396. package/dist/cli/backend/src/types/v2/work-item.types.js.map +1 -1
  397. package/dist/cli/backend/src/utils/security.d.ts +196 -0
  398. package/dist/cli/backend/src/utils/security.d.ts.map +1 -0
  399. package/dist/cli/backend/src/utils/security.js +538 -0
  400. package/dist/cli/backend/src/utils/security.js.map +1 -0
  401. package/dist/cli/backend/src/websocket/chat.gateway.d.ts +9 -0
  402. package/dist/cli/backend/src/websocket/chat.gateway.d.ts.map +1 -1
  403. package/dist/cli/backend/src/websocket/chat.gateway.js +26 -0
  404. package/dist/cli/backend/src/websocket/chat.gateway.js.map +1 -1
  405. package/frontend/dist/assets/{index-465d1f8f.js → index-800118ca.js} +274 -274
  406. package/frontend/dist/index.html +1 -1
  407. package/package.json +1 -1
@@ -0,0 +1,570 @@
1
+ /**
2
+ * Daily signal digest (#987, specs/2026-10-03-signal-digest.md).
3
+ *
4
+ * A team lead proposes 3–5 actions for a site (the `signal-digest` skill
5
+ * collects the signals and drafts them). This service:
6
+ * 1. refuses actions the site's history blocks (tried with Do, or skipped
7
+ * recently), and replaces the site's earlier unanswered actions;
8
+ * 2. posts ONE Slack card with Do / Skip per action, from the lead's bot, in
9
+ * the lead's team channel (else the owner's DM);
10
+ * 3. on Do, opens an experiment ticket in the site's project and tells the
11
+ * lead; on Skip, records it so the action stays off the list for a while;
12
+ * 4. keeps each site's signal-source status and tells the owner once when a
13
+ * source starts or stops failing (nothing on the days it does not change).
14
+ *
15
+ * @module services/signal-digest/signal-digest.service
16
+ */
17
+ import { SIGNAL_DIGEST_CONSTANTS } from '../../constants.js';
18
+ import { SignalDigestError, blockedLines, normalizeKey, parseSourceStatuses, siteHistory, validateSignalDigest, validateSite } from './signal-digest-contract.js';
19
+ import { digestFallbackText, parseSignalButtonValue, renderDigestCard } from './signal-digest-card.js';
20
+ /**
21
+ * Error text.
22
+ *
23
+ * @param err - Anything thrown
24
+ * @returns Message
25
+ */
26
+ function errText(err) {
27
+ return err instanceof Error ? err.message : String(err);
28
+ }
29
+ /**
30
+ * The description of the ticket a Do opens: the digest item plus the
31
+ * experiment card fields #986 measures (hypothesis, metric, baseline, window).
32
+ *
33
+ * @param digest - Digest
34
+ * @param item - The action
35
+ * @returns Markdown
36
+ */
37
+ export function experimentTicketDescription(digest, item) {
38
+ return [
39
+ `From the daily signal digest ${digest.id} for ${digest.site} (${digest.createdAt.slice(0, 10)}), action ${item.n}. The owner chose Do.`,
40
+ '',
41
+ '## Signal',
42
+ item.signal,
43
+ '',
44
+ '## Proposal',
45
+ item.proposal,
46
+ '',
47
+ '## Expected effect',
48
+ item.expectedEffect,
49
+ '',
50
+ '## Effort',
51
+ item.effort,
52
+ '',
53
+ '## Experiment',
54
+ `- Hypothesis: ${item.proposal} → ${item.expectedEffect}`,
55
+ `- Metric: ${item.metric ?? (item.experiment ? `${item.experiment.source} ${item.experiment.measure}` : 'name the metric (GA4 / Search Console) before shipping')}`,
56
+ item.experiment && digest.config
57
+ ? '- Baseline and result: measured automatically by the experiment card linked to this ticket (when it is done, and after the window)'
58
+ : '- Baseline: capture it right before the change ships (or add an experiment card)',
59
+ `- Window: ${SIGNAL_DIGEST_CONSTANTS.EXPERIMENT_WINDOW_DAYS} days after shipping`,
60
+ `- Signal key: \`${item.key}\` (source: ${item.source})`,
61
+ ].join('\n');
62
+ }
63
+ /**
64
+ * How a source is named to the owner.
65
+ *
66
+ * @param name - Source name
67
+ * @returns Label
68
+ */
69
+ export function sourceLabel(name) {
70
+ return SIGNAL_DIGEST_CONSTANTS.SOURCE_LABELS[name] ?? name;
71
+ }
72
+ /**
73
+ * Whether a digest holds the same actions (by key) as a proposal.
74
+ *
75
+ * @param digest - Stored digest
76
+ * @param items - Proposed actions
77
+ * @returns True for the same key set
78
+ */
79
+ function sameActions(digest, items) {
80
+ const a = digest.items.map((i) => normalizeKey(i.key)).sort();
81
+ const b = items.map((i) => normalizeKey(i.key)).sort();
82
+ return a.length === b.length && a.every((k, i) => k === b[i]);
83
+ }
84
+ /**
85
+ * Signal digests: proposals, the Slack card, the owner's answers.
86
+ */
87
+ export class SignalDigestService {
88
+ deps;
89
+ static instance = null;
90
+ now;
91
+ /** Source reports are handled one at a time (one change notice per change) */
92
+ sourceChain = Promise.resolve();
93
+ /**
94
+ * @param deps - Collaborators
95
+ */
96
+ constructor(deps) {
97
+ this.deps = deps;
98
+ this.now = deps.now ?? (() => new Date());
99
+ }
100
+ /** The running service, when started. */
101
+ static getInstance() {
102
+ return SignalDigestService.instance;
103
+ }
104
+ /**
105
+ * Set (or clear) the running service.
106
+ *
107
+ * @param service - Service or null
108
+ */
109
+ static setInstance(service) {
110
+ SignalDigestService.instance = service;
111
+ }
112
+ /**
113
+ * Propose a digest. The site's earlier unanswered actions are replaced
114
+ * (expired) first; then any action the history still blocks is refused.
115
+ *
116
+ * @param callerSession - Team lead session (X-Agent-Session)
117
+ * @param input - `{ site, project?, config?, items }`
118
+ * @returns The stored digest (with `card`, or `postError` when Slack refused)
119
+ * @throws SignalDigestError(400) for a contract violation, (409) for blocked actions
120
+ */
121
+ async propose(callerSession, input) {
122
+ if (!callerSession)
123
+ throw new SignalDigestError(400, 'Who is proposing? Run signal-digest propose from the team lead\'s agent session.');
124
+ const valid = validateSignalDigest(input);
125
+ // One card a day: a digest from the last DUPLICATE_WINDOW_MS with actions
126
+ // still open stands. The same actions again (a retried call) get it back;
127
+ // different ones are refused instead of posting a second card.
128
+ const recent = await this.recentOpenDigest(valid.site);
129
+ if (recent) {
130
+ if (sameActions(recent, valid.items)) {
131
+ this.deps.logger.info('Signal digest proposed again — returning the open one', { digestId: recent.id, site: recent.site });
132
+ return recent;
133
+ }
134
+ const open = recent.items.filter((i) => i.status === 'open').length;
135
+ throw new SignalDigestError(409, `${recent.id} for ${recent.site} was posted at ${recent.createdAt} and still has ${open} open action(s) waiting for the owner. Do not post another card today; the next run replaces the unanswered actions.`);
136
+ }
137
+ const sources = valid.sources ? (await this.recordSources(callerSession, valid.site, valid.sources)).sources : await this.latestSources(valid.site);
138
+ const all = await this.deps.store.list();
139
+ const history = siteHistory(all, valid.site, this.now()).filter((h) => h.status !== 'open');
140
+ const blocked = blockedLines(valid.items, history);
141
+ if (blocked.length > 0) {
142
+ throw new SignalDigestError(409, `These actions were already decided for ${valid.site}; replace them with other actions and propose again:\n- ${blocked.join('\n- ')}`);
143
+ }
144
+ await this.expireOpen(valid.site);
145
+ await this.deps.store.prune().catch(() => 0);
146
+ const teamId = await this.deps.teamOf(callerSession).catch(() => undefined);
147
+ const digest = await this.deps.store.create({
148
+ site: valid.site,
149
+ asker: callerSession,
150
+ ...(teamId ? { teamId } : {}),
151
+ ...(valid.project ? { project: valid.project } : {}),
152
+ ...(valid.config ? { config: valid.config } : {}),
153
+ ...(sources ? { sources } : {}),
154
+ items: valid.items.map((item, i) => ({ ...item, n: i + 1, status: 'open' })),
155
+ });
156
+ this.deps.logger.info('Signal digest proposed', { digestId: digest.id, site: digest.site, asker: callerSession, items: digest.items.length });
157
+ return this.postCard(digest);
158
+ }
159
+ /**
160
+ * A site's digest proposed within DUPLICATE_WINDOW_MS that still has open actions.
161
+ *
162
+ * @param site - Site
163
+ * @returns The newest such digest, or null
164
+ */
165
+ async recentOpenDigest(site) {
166
+ const want = site.trim().toLowerCase();
167
+ const since = this.now().getTime() - SIGNAL_DIGEST_CONSTANTS.DUPLICATE_WINDOW_MS;
168
+ const recent = await this.deps.store.list((d) => d.site.trim().toLowerCase() === want && Date.parse(d.createdAt) >= since && d.items.some((i) => i.status === 'open'));
169
+ return recent[0] ?? null;
170
+ }
171
+ /**
172
+ * The site's latest source report, when it is recent enough to describe today's run.
173
+ *
174
+ * @param site - Site
175
+ * @returns Statuses, or undefined
176
+ */
177
+ async latestSources(site) {
178
+ const s = await this.deps.store.getSiteSources(site).catch(() => null);
179
+ if (!s || this.now().getTime() - Date.parse(s.reportedAt) > SIGNAL_DIGEST_CONSTANTS.SOURCE_REPORT_MAX_AGE_MS)
180
+ return undefined;
181
+ return s.sources;
182
+ }
183
+ /**
184
+ * A collect run's source statuses (`POST /api/signal-digests/sources`).
185
+ * Stored per site; the owner is told once when a source starts or stops
186
+ * failing — not every day it stays broken.
187
+ *
188
+ * @param callerSession - Team lead session (X-Agent-Session)
189
+ * @param input - `{ site, sources }`
190
+ * @returns What changed and whether the owner was told
191
+ * @throws SignalDigestError(400)
192
+ */
193
+ async reportSources(callerSession, input) {
194
+ if (!callerSession)
195
+ throw new SignalDigestError(400, "Who is reporting? Run signal-digest collect from the team lead's agent session.");
196
+ const site = validateSite(input.site);
197
+ const sources = parseSourceStatuses(input.sources);
198
+ if (!sources || sources.length === 0)
199
+ throw new SignalDigestError(400, '"sources" is required: {"ga4":"ok","gsc":"error: why",…} as collect prints it.');
200
+ return this.recordSources(callerSession, site, sources);
201
+ }
202
+ /**
203
+ * Store a source report and send the change notice (see {@link reportSources}).
204
+ *
205
+ * @param caller - Reporting session
206
+ * @param site - Site
207
+ * @param sources - Statuses
208
+ * @returns The report outcome
209
+ */
210
+ recordSources(caller, site, sources) {
211
+ const run = async () => {
212
+ const at = this.now().toISOString();
213
+ const failing = sources.filter((s) => s.state === 'error').map((s) => s.name);
214
+ const state = await this.deps.store.updateSiteSources(site, (cur) => ({
215
+ site,
216
+ sources,
217
+ reportedAt: at,
218
+ reportedBy: caller,
219
+ toldFailing: cur?.toldFailing ?? [],
220
+ ...(cur?.toldAt ? { toldAt: cur.toldAt } : {}),
221
+ }));
222
+ const told = new Set(state.toldFailing);
223
+ const started = failing.filter((n) => !told.has(n));
224
+ const stopped = state.toldFailing.filter((n) => !failing.includes(n));
225
+ const out = { site, sources, started, stopped, notified: false };
226
+ if ((started.length === 0 && stopped.length === 0) || !this.deps.notifyOwner)
227
+ return out;
228
+ const lines = [];
229
+ for (const n of started)
230
+ lines.push(`Not working: ${sourceLabel(n)} — ${sources.find((s) => s.name === n)?.detail ?? 'failed'}`);
231
+ for (const n of stopped)
232
+ lines.push(`Working again: ${sourceLabel(n)}`);
233
+ if (started.length > 0)
234
+ lines.push('The daily digest runs without it until it is fixed. You will hear again only when this changes.');
235
+ const sent = await this.deps
236
+ .notifyOwner({
237
+ title: `Signal digest · ${site}: ${started.length > 0 ? 'a signal source is failing' : 'signal sources work again'}`,
238
+ message: lines.join('\n'),
239
+ urgent: false,
240
+ })
241
+ .catch(() => false);
242
+ if (sent) {
243
+ await this.deps.store.updateSiteSources(site, (cur) => ({ ...(cur ?? { site, sources, reportedAt: at }), toldFailing: failing, toldAt: at }));
244
+ out.notified = true;
245
+ }
246
+ this.deps.logger.info('Signal digest source status changed', { site, started, stopped, notified: out.notified });
247
+ return out;
248
+ };
249
+ const next = this.sourceChain.then(run, run);
250
+ this.sourceChain = next.catch(() => undefined);
251
+ return next;
252
+ }
253
+ /**
254
+ * The site's blocked keys (Do within 90 days, Skip within 30) and its open ones.
255
+ *
256
+ * @param site - Site
257
+ * @returns History entries
258
+ */
259
+ async history(site) {
260
+ return siteHistory(await this.deps.store.list(), site, this.now());
261
+ }
262
+ /**
263
+ * Digests, newest first.
264
+ *
265
+ * @param site - Only this site, when given
266
+ * @returns Digests
267
+ */
268
+ async list(site) {
269
+ const want = site?.trim().toLowerCase();
270
+ return this.deps.store.list((d) => !want || d.site.trim().toLowerCase() === want);
271
+ }
272
+ /**
273
+ * One digest.
274
+ *
275
+ * @param id - Digest id
276
+ * @returns Digest or null
277
+ */
278
+ get(id) {
279
+ return this.deps.store.get(id);
280
+ }
281
+ /**
282
+ * Answer one action from the dashboard / API (owner only; the caller checks).
283
+ *
284
+ * @param id - Digest id
285
+ * @param n - Item number
286
+ * @param choice - do / skip
287
+ * @returns The updated digest
288
+ * @throws SignalDigestError(404) unknown digest / item, (409) already answered
289
+ */
290
+ async choose(id, n, choice) {
291
+ const digest = await this.deps.store.get(id);
292
+ if (!digest)
293
+ throw new SignalDigestError(404, `Signal digest ${id} not found`);
294
+ const item = digest.items.find((i) => i.n === n);
295
+ if (!item)
296
+ throw new SignalDigestError(404, `${id} has no action ${n}`);
297
+ if (item.status !== 'open')
298
+ throw new SignalDigestError(409, `${id} action ${n} is already ${item.status}`);
299
+ const out = await this.apply(id, n, choice, 'dashboard');
300
+ if (!out)
301
+ throw new SignalDigestError(409, `${id} action ${n} was answered meanwhile`);
302
+ return out;
303
+ }
304
+ /**
305
+ * A Slack `block_actions` payload. Ignores anything that is not a click on
306
+ * one of this instance's digest cards by the owner.
307
+ *
308
+ * @param payload - Slack payload
309
+ * @returns What happened
310
+ */
311
+ async handleInteraction(payload) {
312
+ const action = payload?.actions?.[0];
313
+ if (!action?.action_id?.startsWith(SIGNAL_DIGEST_CONSTANTS.ACTION_PREFIX))
314
+ return { handled: false, reason: 'not a signal digest action' };
315
+ const value = parseSignalButtonValue(action.value);
316
+ if (!value)
317
+ return { handled: false, reason: 'unreadable button value' };
318
+ const self = this.deps.instanceId();
319
+ if (value.i && self && value.i !== self)
320
+ return { handled: false, reason: `card belongs to instance ${value.i}` };
321
+ const digest = await this.deps.store.get(value.s);
322
+ if (!digest)
323
+ return { handled: false, reason: `unknown digest ${value.s}` };
324
+ const channel = payload.container?.channel_id ?? payload.channel?.id;
325
+ const ts = payload.container?.message_ts ?? payload.message?.ts;
326
+ if (!digest.card || digest.card.slackChannelId !== channel || digest.card.messageTs !== ts) {
327
+ return { handled: false, reason: 'click is not on the stored card', digest };
328
+ }
329
+ const user = payload.user?.id ?? '';
330
+ if (!user || !this.deps.isOwner(user)) {
331
+ this.deps.logger.info('Signal digest click by someone other than the owner — ignored', { digestId: digest.id, user });
332
+ return { handled: false, reason: 'not the owner', digest };
333
+ }
334
+ const item = digest.items.find((i) => i.n === value.n);
335
+ if (!item)
336
+ return { handled: false, reason: `no action ${value.n}`, digest };
337
+ if (item.status !== 'open')
338
+ return { handled: false, reason: `already ${item.status}`, digest };
339
+ const out = await this.apply(digest.id, value.n, value.o, user);
340
+ return out ? { handled: true, reason: value.o, digest: out } : { handled: false, reason: 'answered meanwhile', digest };
341
+ }
342
+ /**
343
+ * Record the answer; on Do open the ticket and tell the lead; redraw the card.
344
+ *
345
+ * @param id - Digest id
346
+ * @param n - Item number
347
+ * @param choice - do / skip
348
+ * @param by - Slack user id, or `dashboard`
349
+ * @returns The updated digest, or null when the item was not open
350
+ */
351
+ async apply(id, n, choice, by) {
352
+ const at = this.now().toISOString();
353
+ let digest = await this.deps.store.update(id, (d) => {
354
+ const item = d.items.find((i) => i.n === n);
355
+ if (!item || item.status !== 'open')
356
+ return null;
357
+ Object.assign(item, { status: choice, answeredAt: at, answeredBy: by });
358
+ return d;
359
+ });
360
+ if (!digest)
361
+ return null;
362
+ const item = digest.items.find((i) => i.n === n);
363
+ this.deps.logger.info('Signal digest answered', { digestId: id, item: n, choice, by });
364
+ if (choice === 'do') {
365
+ const ticket = await this.openTicket(digest, item);
366
+ const experiment = ticket.id ? await this.openExperiment(digest, item, ticket.id) : null;
367
+ digest = (await this.deps.store.update(id, (d) => {
368
+ const it = d.items.find((i) => i.n === n);
369
+ if (!it)
370
+ return null;
371
+ if (ticket.id)
372
+ it.ticketId = ticket.id;
373
+ else
374
+ it.ticketError = ticket.error;
375
+ if (experiment?.id)
376
+ it.experimentId = experiment.id;
377
+ else if (experiment?.error)
378
+ it.experimentError = experiment.error;
379
+ return d;
380
+ })) ?? digest;
381
+ const updated = digest.items.find((i) => i.n === n);
382
+ await this.tellAsker(digest, this.doNote(digest, updated));
383
+ }
384
+ await this.refreshCard(digest);
385
+ return digest;
386
+ }
387
+ /**
388
+ * Open the experiment ticket of a Do.
389
+ *
390
+ * @param digest - Digest
391
+ * @param item - The action
392
+ * @returns The ticket id, or why there is none
393
+ */
394
+ async openTicket(digest, item) {
395
+ if (!digest.project)
396
+ return { error: 'no project set for this site (signalDigest.project in its config)' };
397
+ try {
398
+ const ticket = await this.deps.createTicket({
399
+ project: digest.project,
400
+ ...(digest.teamId ? { team: digest.teamId } : {}),
401
+ title: `Experiment: ${item.proposal}`.slice(0, SIGNAL_DIGEST_CONSTANTS.TICKET_TITLE_MAX_CHARS),
402
+ description: experimentTicketDescription(digest, item),
403
+ acceptance: [
404
+ 'Baseline of the metric recorded right before the change ships',
405
+ 'Change shipped',
406
+ `Result recorded after ${SIGNAL_DIGEST_CONSTANTS.EXPERIMENT_WINDOW_DAYS} days: worked / didn't / inconclusive`,
407
+ ],
408
+ labels: [...SIGNAL_DIGEST_CONSTANTS.TICKET_LABELS],
409
+ source: `signal-digest:${digest.id}#${item.n}`,
410
+ });
411
+ return { id: ticket.id };
412
+ }
413
+ catch (err) {
414
+ this.deps.logger.warn('Signal digest: Do ticket not created', { digestId: digest.id, item: item.n, error: errText(err) });
415
+ return { error: errText(err).slice(0, SIGNAL_DIGEST_CONSTANTS.EXPECTED_MAX_CHARS) };
416
+ }
417
+ }
418
+ /**
419
+ * Create the experiment card of a Do (#986), linked to its ticket, as the
420
+ * lead (its prediction is recorded under the lead). Only when the action
421
+ * names a metric and the digest has the seo-ops config.
422
+ *
423
+ * @param digest - Digest
424
+ * @param item - The action
425
+ * @param ticketId - The ticket the Do opened
426
+ * @returns The card id, why there is none, or null when none was asked for
427
+ */
428
+ async openExperiment(digest, item, ticketId) {
429
+ if (!item.experiment || !digest.config || !digest.project)
430
+ return null;
431
+ if (!this.deps.createExperiment)
432
+ return { error: 'experiment cards are not running on this instance' };
433
+ try {
434
+ const { source, measure, ...filters } = item.experiment;
435
+ const card = await this.deps.createExperiment({
436
+ title: item.proposal.slice(0, SIGNAL_DIGEST_CONSTANTS.TICKET_TITLE_MAX_CHARS),
437
+ hypothesis: `${item.proposal} → ${item.expectedEffect}`,
438
+ metric: { source, measure, config: digest.config, ...filters, ...(item.metric ? { label: item.metric } : {}) },
439
+ ticket: { kind: 'project', project: digest.project, id: ticketId },
440
+ }, digest.asker);
441
+ return { id: card.id };
442
+ }
443
+ catch (err) {
444
+ this.deps.logger.warn('Signal digest: experiment card not created', { digestId: digest.id, item: item.n, error: errText(err) });
445
+ return { error: errText(err).slice(0, SIGNAL_DIGEST_CONSTANTS.EXPECTED_MAX_CHARS) };
446
+ }
447
+ }
448
+ /**
449
+ * What the lead is told after a Do.
450
+ *
451
+ * @param digest - Digest
452
+ * @param item - The answered action
453
+ * @returns Message text
454
+ */
455
+ doNote(digest, item) {
456
+ const head = `[SIGNAL DIGEST] The owner chose Do for ${digest.id} action ${item.n} (${digest.site}): "${item.proposal}".`;
457
+ if (item.ticketId && item.experimentId) {
458
+ return `${head} Ticket ${item.ticketId} is ready in ${digest.project}, with experiment card ${item.experimentId}: ship the change and close the ticket — the baseline and the result are measured automatically.`;
459
+ }
460
+ if (item.ticketId) {
461
+ const why = item.experimentError ? ` The experiment card was not created (${item.experimentError}); create it with experiment-card before you ship.` : '';
462
+ return `${head} Ticket ${item.ticketId} is ready in ${digest.project}: run it as an experiment — record the baseline of "${item.metric ?? 'the metric'}" right before you ship, then the result after ${SIGNAL_DIGEST_CONSTANTS.EXPERIMENT_WINDOW_DAYS} days.${why}`;
463
+ }
464
+ return `${head} No ticket was created (${item.ticketError}). Create it yourself with project-tickets, labelled ${SIGNAL_DIGEST_CONSTANTS.TICKET_LABELS.join(' + ')}, and run it as an experiment.`;
465
+ }
466
+ /**
467
+ * Replace the site's earlier unanswered actions: they become `expired` and
468
+ * their cards say so.
469
+ *
470
+ * @param site - Site
471
+ */
472
+ async expireOpen(site) {
473
+ const want = site.trim().toLowerCase();
474
+ const open = await this.deps.store.list((d) => d.site.trim().toLowerCase() === want && d.items.some((i) => i.status === 'open'));
475
+ const at = this.now().toISOString();
476
+ for (const d of open) {
477
+ const expired = await this.deps.store.update(d.id, (cur) => {
478
+ for (const item of cur.items)
479
+ if (item.status === 'open')
480
+ Object.assign(item, { status: 'expired', answeredAt: at });
481
+ return cur;
482
+ });
483
+ if (expired)
484
+ await this.refreshCard(expired);
485
+ }
486
+ }
487
+ /**
488
+ * Post the card: the lead's team channel from the lead's bot, else the
489
+ * owner's DM.
490
+ *
491
+ * @param digest - Digest without a card
492
+ * @returns The digest with `card`, or `postError`
493
+ */
494
+ async postCard(digest) {
495
+ const slack = this.deps.slack();
496
+ if (!slack || !slack.isConnected()) {
497
+ return (await this.deps.store.update(digest.id, (d) => ({ ...d, postError: 'Slack is not connected' }))) ?? digest;
498
+ }
499
+ try {
500
+ const identity = await this.deps.identityOf(digest.asker);
501
+ const channel = (digest.teamId ? await this.deps.teamChannelOf(digest.teamId) : null) ?? (await this.deps.ownerDmOf?.(identity)) ?? null;
502
+ if (!channel)
503
+ throw new Error(`No Slack team channel for ${digest.asker} and no DM with the owner`);
504
+ const askerName = await this.deps.displayName?.(digest.asker).catch(() => undefined);
505
+ const message = { channelId: channel, text: digestFallbackText(digest), blocks: renderDigestCard(digest, this.deps.instanceId(), askerName), skipChatV2Mirror: true };
506
+ let ts;
507
+ let ownBot = false;
508
+ if (identity.botToken) {
509
+ try {
510
+ ts = await slack.sendMessage({ ...message, botToken: identity.botToken });
511
+ ownBot = true;
512
+ }
513
+ catch (err) {
514
+ this.deps.logger.warn("Lead's own bot could not post the signal digest — using the shared bot", { digestId: digest.id, error: errText(err) });
515
+ ts = await slack.sendMessage({ ...message, ...identity, botToken: undefined });
516
+ }
517
+ }
518
+ else {
519
+ ts = await slack.sendMessage({ ...message, ...identity });
520
+ }
521
+ const updated = await this.deps.store.update(digest.id, (d) => {
522
+ const next = { ...d, card: { slackChannelId: channel, messageTs: ts, postedBy: ownBot ? digest.asker : 'crewly', ownBot } };
523
+ delete next.postError;
524
+ return next;
525
+ });
526
+ this.deps.logger.info('Signal digest card posted', { digestId: digest.id, channel, ownBot });
527
+ return updated ?? digest;
528
+ }
529
+ catch (err) {
530
+ this.deps.logger.warn('Signal digest card not posted', { digestId: digest.id, error: errText(err) });
531
+ return (await this.deps.store.update(digest.id, (d) => ({ ...d, postError: errText(err) }))) ?? digest;
532
+ }
533
+ }
534
+ /**
535
+ * Redraw a posted card.
536
+ *
537
+ * @param digest - Digest
538
+ * @returns True when Slack accepted the update
539
+ */
540
+ async refreshCard(digest) {
541
+ const slack = this.deps.slack();
542
+ if (!digest.card || !slack)
543
+ return false;
544
+ try {
545
+ const askerName = await this.deps.displayName?.(digest.asker).catch(() => undefined);
546
+ const token = digest.card.ownBot ? (await this.deps.identityOf(digest.card.postedBy).catch(() => ({}))).botToken : undefined;
547
+ await slack.updateMessage(digest.card.slackChannelId, digest.card.messageTs, digestFallbackText(digest), renderDigestCard(digest, this.deps.instanceId(), askerName), token);
548
+ return true;
549
+ }
550
+ catch (err) {
551
+ this.deps.logger.warn('Could not update the signal digest card', { digestId: digest.id, error: errText(err) });
552
+ return false;
553
+ }
554
+ }
555
+ /**
556
+ * Tell the lead (best effort).
557
+ *
558
+ * @param digest - Digest
559
+ * @param text - Message
560
+ */
561
+ async tellAsker(digest, text) {
562
+ try {
563
+ await this.deps.deliverToAgent(digest.asker, text);
564
+ }
565
+ catch (err) {
566
+ this.deps.logger.warn('Could not tell the lead about the signal digest answer', { digestId: digest.id, error: errText(err) });
567
+ }
568
+ }
569
+ }
570
+ //# sourceMappingURL=signal-digest.service.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"signal-digest.service.js","sourceRoot":"","sources":["../../../../../../backend/src/services/signal-digest/signal-digest.service.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,51 @@
1
+ /**
2
+ * Signal digest — wiring with the real Slack, project tickets and teams
3
+ * (#987, specs/2026-10-03-signal-digest.md). Process-specific hooks (how to
4
+ * reach an agent) come from `index.ts`.
5
+ *
6
+ * @module services/signal-digest/signal-digest.wiring
7
+ */
8
+ import type { Team } from '../../types/index.js';
9
+ import { SignalDigestService, type SignalTicketInput } from './signal-digest.service.js';
10
+ /** What the composition root provides. */
11
+ export interface SignalDigestWiringInput {
12
+ crewlyHome: string;
13
+ getTeams: () => Promise<Team[]>;
14
+ /** Deliver text to an agent; wakes it when needed */
15
+ sendToAgent: (session: string, text: string) => Promise<boolean>;
16
+ }
17
+ /** The ticket workflow slice a Do uses. */
18
+ export interface SignalTicketWorkflow {
19
+ create(ref: string, input: Record<string, unknown>, caller: {
20
+ session?: string;
21
+ }): Promise<{
22
+ id: string;
23
+ }>;
24
+ }
25
+ /**
26
+ * Open a Do ticket as the owner (who clicked Do). When the lead's team is not
27
+ * on the site's project, the ticket is opened without a team rather than not
28
+ * at all.
29
+ *
30
+ * @param workflow - Ticket workflow
31
+ * @param input - Ticket
32
+ * @returns The new ticket's id
33
+ */
34
+ export declare function createSignalTicket(workflow: SignalTicketWorkflow, input: SignalTicketInput): Promise<{
35
+ id: string;
36
+ }>;
37
+ /**
38
+ * Build the service with the real collaborators.
39
+ *
40
+ * @param input - Composition-root hooks
41
+ * @returns The service
42
+ */
43
+ export declare function createSignalDigestService(input: SignalDigestWiringInput): SignalDigestService;
44
+ /**
45
+ * Subscribe the service to Slack button clicks (Cloud relay, Socket Mode, HTTP).
46
+ *
47
+ * @param service - Signal digest service
48
+ * @returns Unsubscribe
49
+ */
50
+ export declare function attachSignalDigestSlackListeners(service: SignalDigestService): () => void;
51
+ //# sourceMappingURL=signal-digest.wiring.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"signal-digest.wiring.d.ts","sourceRoot":"","sources":["../../../../../../backend/src/services/signal-digest/signal-digest.wiring.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,sBAAsB,CAAC;AASjD,OAAO,EAAE,mBAAmB,EAAE,KAAK,iBAAiB,EAAE,MAAM,4BAA4B,CAAC;AAGzF,0CAA0C;AAC1C,MAAM,WAAW,uBAAuB;IACtC,UAAU,EAAE,MAAM,CAAC;IACnB,QAAQ,EAAE,MAAM,OAAO,CAAC,IAAI,EAAE,CAAC,CAAC;IAChC,qDAAqD;IACrD,WAAW,EAAE,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,KAAK,OAAO,CAAC,OAAO,CAAC,CAAC;CAClE;AAED,2CAA2C;AAC3C,MAAM,WAAW,oBAAoB;IACnC,MAAM,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,MAAM,EAAE;QAAE,OAAO,CAAC,EAAE,MAAM,CAAA;KAAE,GAAG,OAAO,CAAC;QAAE,EAAE,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;CAC5G;AAID;;;;;;;;GAQG;AACH,wBAAsB,kBAAkB,CAAC,QAAQ,EAAE,oBAAoB,EAAE,KAAK,EAAE,iBAAiB,GAAG,OAAO,CAAC;IAAE,EAAE,EAAE,MAAM,CAAA;CAAE,CAAC,CAkB1H;AAED;;;;;GAKG;AACH,wBAAgB,yBAAyB,CAAC,KAAK,EAAE,uBAAuB,GAAG,mBAAmB,CAuC7F;AAED;;;;;GAKG;AACH,wBAAgB,gCAAgC,CAAC,OAAO,EAAE,mBAAmB,GAAG,MAAM,IAAI,CAYzF"}