crewly 1.20.194 → 1.20.196

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 (791) hide show
  1. package/config/constants.ts +68 -0
  2. package/config/hooks/agent-status/report.sh +31 -12
  3. package/config/hooks/subagent-guard/subagent.sh +25 -1
  4. package/config/roles/auditor/prompt.md +2 -2
  5. package/config/roles/orchestrator/fragments/communication.md +1 -1
  6. package/config/roles/orchestrator/fragments/lifecycle.md +1 -1
  7. package/config/roles/orchestrator/prompt.md +18 -508
  8. package/config/skills/_common/lib.sh +28 -5
  9. package/config/skills/_common/lib.test.sh +32 -1
  10. package/config/skills/agent/computer-use/SKILL.md +6 -0
  11. package/config/skills/agent/core/create-intent-tasks/execute.sh +2 -0
  12. package/config/skills/agent/core/decompose-intent/execute.sh +2 -0
  13. package/config/skills/agent/core/experiment-card/SKILL.md +38 -5
  14. package/config/skills/agent/core/experiment-card/execute.sh +40 -4
  15. package/config/skills/agent/core/experiment-card/execute.test.sh +17 -0
  16. package/config/skills/agent/core/project-tickets/SKILL.md +35 -2
  17. package/config/skills/agent/core/project-tickets/execute.sh +59 -6
  18. package/config/skills/agent/core/project-tickets/execute.test.sh +24 -0
  19. package/config/skills/agent/core/send-message/execute.sh +16 -0
  20. package/config/skills/agent/core/send-message/execute.test.sh +10 -0
  21. package/config/skills/agent/core/trace-read/SKILL.md +117 -0
  22. package/config/skills/agent/core/trace-read/execute.sh +116 -0
  23. package/config/skills/agent/core/update-intent-task/execute.sh +2 -0
  24. package/config/skills/agent/desktop-app-control/execute.sh +5 -2
  25. package/config/skills/agent/marketing/submit-for-approval/execute.sh +3 -2
  26. package/config/skills/orchestrator/decompose-mission/execute.sh +2 -0
  27. package/config/skills/orchestrator/decompose-okr/execute.sh +1 -0
  28. package/config/skills/orchestrator/design-team/execute.sh +2 -0
  29. package/config/skills/orchestrator/measure-kr/execute.sh +2 -0
  30. package/config/skills/orchestrator/review-mission/execute.sh +2 -0
  31. package/config/skills/orchestrator/send-message/execute.sh +27 -2
  32. package/config/skills/orchestrator/send-message/execute.test.sh +89 -0
  33. package/config/skills/registry.json +6 -5
  34. package/config/skills/team-leader/design-checklist/execute.sh +2 -0
  35. package/config/skills/team-leader/signal-digest/SKILL.md +110 -0
  36. package/config/skills/team-leader/signal-digest/execute.sh +173 -0
  37. package/config/skills/team-leader/signal-digest/execute.test.sh +123 -0
  38. package/config/skills/team-leader/signal-digest/signal-digest.config.example.json +23 -0
  39. package/config/skills/team-leader/signal-digest/signal_digest.py +572 -0
  40. package/config/skills/team-leader/signal-digest/signal_digest.test.py +319 -0
  41. package/dist/backend/backend/src/constants.d.ts +356 -5
  42. package/dist/backend/backend/src/constants.d.ts.map +1 -1
  43. package/dist/backend/backend/src/constants.js +341 -8
  44. package/dist/backend/backend/src/constants.js.map +1 -1
  45. package/dist/backend/backend/src/controllers/agent-hooks/agent-hooks.controller.d.ts +9 -3
  46. package/dist/backend/backend/src/controllers/agent-hooks/agent-hooks.controller.d.ts.map +1 -1
  47. package/dist/backend/backend/src/controllers/agent-hooks/agent-hooks.controller.js +38 -5
  48. package/dist/backend/backend/src/controllers/agent-hooks/agent-hooks.controller.js.map +1 -1
  49. package/dist/backend/backend/src/controllers/approvals/approvals.controller.d.ts +4 -9
  50. package/dist/backend/backend/src/controllers/approvals/approvals.controller.d.ts.map +1 -1
  51. package/dist/backend/backend/src/controllers/approvals/approvals.controller.js +6 -14
  52. package/dist/backend/backend/src/controllers/approvals/approvals.controller.js.map +1 -1
  53. package/dist/backend/backend/src/controllers/auth/owner-session.controller.d.ts +64 -0
  54. package/dist/backend/backend/src/controllers/auth/owner-session.controller.d.ts.map +1 -0
  55. package/dist/backend/backend/src/controllers/auth/owner-session.controller.js +164 -0
  56. package/dist/backend/backend/src/controllers/auth/owner-session.controller.js.map +1 -0
  57. package/dist/backend/backend/src/controllers/browser/browser.routes.d.ts.map +1 -1
  58. package/dist/backend/backend/src/controllers/browser/browser.routes.js +18 -5
  59. package/dist/backend/backend/src/controllers/browser/browser.routes.js.map +1 -1
  60. package/dist/backend/backend/src/controllers/canva/canva.routes.d.ts.map +1 -1
  61. package/dist/backend/backend/src/controllers/canva/canva.routes.js +8 -1
  62. package/dist/backend/backend/src/controllers/canva/canva.routes.js.map +1 -1
  63. package/dist/backend/backend/src/controllers/chat/chat.controller.d.ts.map +1 -1
  64. package/dist/backend/backend/src/controllers/chat/chat.controller.js +16 -1
  65. package/dist/backend/backend/src/controllers/chat/chat.controller.js.map +1 -1
  66. package/dist/backend/backend/src/controllers/chat-v2/chat-v2.controller.d.ts.map +1 -1
  67. package/dist/backend/backend/src/controllers/chat-v2/chat-v2.controller.js +3 -1
  68. package/dist/backend/backend/src/controllers/chat-v2/chat-v2.controller.js.map +1 -1
  69. package/dist/backend/backend/src/controllers/cloud/cloud-device-pairing.controller.d.ts.map +1 -1
  70. package/dist/backend/backend/src/controllers/cloud/cloud-device-pairing.controller.js +3 -5
  71. package/dist/backend/backend/src/controllers/cloud/cloud-device-pairing.controller.js.map +1 -1
  72. package/dist/backend/backend/src/controllers/connector/connector.controller.d.ts +4 -2
  73. package/dist/backend/backend/src/controllers/connector/connector.controller.d.ts.map +1 -1
  74. package/dist/backend/backend/src/controllers/connector/connector.controller.js +17 -2
  75. package/dist/backend/backend/src/controllers/connector/connector.controller.js.map +1 -1
  76. package/dist/backend/backend/src/controllers/connector/grant-sharing.handler.d.ts.map +1 -1
  77. package/dist/backend/backend/src/controllers/connector/grant-sharing.handler.js +2 -3
  78. package/dist/backend/backend/src/controllers/connector/grant-sharing.handler.js.map +1 -1
  79. package/dist/backend/backend/src/controllers/decisions/decisions.controller.d.ts +4 -2
  80. package/dist/backend/backend/src/controllers/decisions/decisions.controller.d.ts.map +1 -1
  81. package/dist/backend/backend/src/controllers/decisions/decisions.controller.js +31 -20
  82. package/dist/backend/backend/src/controllers/decisions/decisions.controller.js.map +1 -1
  83. package/dist/backend/backend/src/controllers/desktop/desktop.controller.d.ts.map +1 -1
  84. package/dist/backend/backend/src/controllers/desktop/desktop.controller.js +16 -0
  85. package/dist/backend/backend/src/controllers/desktop/desktop.controller.js.map +1 -1
  86. package/dist/backend/backend/src/controllers/google/google.controller.d.ts.map +1 -1
  87. package/dist/backend/backend/src/controllers/google/google.controller.js +9 -5
  88. package/dist/backend/backend/src/controllers/google/google.controller.js.map +1 -1
  89. package/dist/backend/backend/src/controllers/google/google.routes.d.ts.map +1 -1
  90. package/dist/backend/backend/src/controllers/google/google.routes.js +16 -3
  91. package/dist/backend/backend/src/controllers/google/google.routes.js.map +1 -1
  92. package/dist/backend/backend/src/controllers/harness/harness.controller.d.ts.map +1 -1
  93. package/dist/backend/backend/src/controllers/harness/harness.controller.js +3 -5
  94. package/dist/backend/backend/src/controllers/harness/harness.controller.js.map +1 -1
  95. package/dist/backend/backend/src/controllers/marketplace/marketplace.routes.d.ts +1 -0
  96. package/dist/backend/backend/src/controllers/marketplace/marketplace.routes.d.ts.map +1 -1
  97. package/dist/backend/backend/src/controllers/marketplace/marketplace.routes.js +1 -0
  98. package/dist/backend/backend/src/controllers/marketplace/marketplace.routes.js.map +1 -1
  99. package/dist/backend/backend/src/controllers/microsoft/microsoft-todo.routes.d.ts.map +1 -1
  100. package/dist/backend/backend/src/controllers/microsoft/microsoft-todo.routes.js +8 -1
  101. package/dist/backend/backend/src/controllers/microsoft/microsoft-todo.routes.js.map +1 -1
  102. package/dist/backend/backend/src/controllers/mission/mission-policy.routes.js +1 -1
  103. package/dist/backend/backend/src/controllers/mission/mission-policy.routes.js.map +1 -1
  104. package/dist/backend/backend/src/controllers/monitoring/terminal.controller.d.ts.map +1 -1
  105. package/dist/backend/backend/src/controllers/monitoring/terminal.controller.js +5 -2
  106. package/dist/backend/backend/src/controllers/monitoring/terminal.controller.js.map +1 -1
  107. package/dist/backend/backend/src/controllers/owner-receipt/owner-receipt.controller.d.ts.map +1 -1
  108. package/dist/backend/backend/src/controllers/owner-receipt/owner-receipt.controller.js +3 -5
  109. package/dist/backend/backend/src/controllers/owner-receipt/owner-receipt.controller.js.map +1 -1
  110. package/dist/backend/backend/src/controllers/people/people.routes.d.ts.map +1 -1
  111. package/dist/backend/backend/src/controllers/people/people.routes.js +3 -5
  112. package/dist/backend/backend/src/controllers/people/people.routes.js.map +1 -1
  113. package/dist/backend/backend/src/controllers/project-tickets/project-tickets.controller.d.ts +35 -2
  114. package/dist/backend/backend/src/controllers/project-tickets/project-tickets.controller.d.ts.map +1 -1
  115. package/dist/backend/backend/src/controllers/project-tickets/project-tickets.controller.js +138 -4
  116. package/dist/backend/backend/src/controllers/project-tickets/project-tickets.controller.js.map +1 -1
  117. package/dist/backend/backend/src/controllers/project-tickets/project-tickets.routes.d.ts +2 -0
  118. package/dist/backend/backend/src/controllers/project-tickets/project-tickets.routes.d.ts.map +1 -1
  119. package/dist/backend/backend/src/controllers/project-tickets/project-tickets.routes.js +7 -1
  120. package/dist/backend/backend/src/controllers/project-tickets/project-tickets.routes.js.map +1 -1
  121. package/dist/backend/backend/src/controllers/request/open-items.controller.d.ts.map +1 -1
  122. package/dist/backend/backend/src/controllers/request/open-items.controller.js +2 -4
  123. package/dist/backend/backend/src/controllers/request/open-items.controller.js.map +1 -1
  124. package/dist/backend/backend/src/controllers/request/request.controller.d.ts.map +1 -1
  125. package/dist/backend/backend/src/controllers/request/request.controller.js +5 -1
  126. package/dist/backend/backend/src/controllers/request/request.controller.js.map +1 -1
  127. package/dist/backend/backend/src/controllers/settings/settings.controller.d.ts.map +1 -1
  128. package/dist/backend/backend/src/controllers/settings/settings.controller.js +18 -2
  129. package/dist/backend/backend/src/controllers/settings/settings.controller.js.map +1 -1
  130. package/dist/backend/backend/src/controllers/signal-digest/signal-digest.controller.d.ts +26 -0
  131. package/dist/backend/backend/src/controllers/signal-digest/signal-digest.controller.d.ts.map +1 -0
  132. package/dist/backend/backend/src/controllers/signal-digest/signal-digest.controller.js +100 -0
  133. package/dist/backend/backend/src/controllers/signal-digest/signal-digest.controller.js.map +1 -0
  134. package/dist/backend/backend/src/controllers/slack/slack.controller.d.ts.map +1 -1
  135. package/dist/backend/backend/src/controllers/slack/slack.controller.js +9 -0
  136. package/dist/backend/backend/src/controllers/slack/slack.controller.js.map +1 -1
  137. package/dist/backend/backend/src/controllers/system/runtime-fallback.controller.d.ts.map +1 -1
  138. package/dist/backend/backend/src/controllers/system/runtime-fallback.controller.js +11 -0
  139. package/dist/backend/backend/src/controllers/system/runtime-fallback.controller.js.map +1 -1
  140. package/dist/backend/backend/src/controllers/system/system-control.controller.d.ts +6 -4
  141. package/dist/backend/backend/src/controllers/system/system-control.controller.d.ts.map +1 -1
  142. package/dist/backend/backend/src/controllers/system/system-control.controller.js +20 -13
  143. package/dist/backend/backend/src/controllers/system/system-control.controller.js.map +1 -1
  144. package/dist/backend/backend/src/controllers/team/team.controller.d.ts.map +1 -1
  145. package/dist/backend/backend/src/controllers/team/team.controller.js +14 -7
  146. package/dist/backend/backend/src/controllers/team/team.controller.js.map +1 -1
  147. package/dist/backend/backend/src/controllers/tickets/tickets.controller.d.ts.map +1 -1
  148. package/dist/backend/backend/src/controllers/tickets/tickets.controller.js +5 -7
  149. package/dist/backend/backend/src/controllers/tickets/tickets.controller.js.map +1 -1
  150. package/dist/backend/backend/src/controllers/trace/trace.controller.d.ts +73 -0
  151. package/dist/backend/backend/src/controllers/trace/trace.controller.d.ts.map +1 -0
  152. package/dist/backend/backend/src/controllers/trace/trace.controller.js +437 -0
  153. package/dist/backend/backend/src/controllers/trace/trace.controller.js.map +1 -0
  154. package/dist/backend/backend/src/controllers/whatsapp/whatsapp-inbox.controller.d.ts +3 -3
  155. package/dist/backend/backend/src/controllers/whatsapp/whatsapp-inbox.controller.d.ts.map +1 -1
  156. package/dist/backend/backend/src/controllers/whatsapp/whatsapp-inbox.controller.js +4 -2
  157. package/dist/backend/backend/src/controllers/whatsapp/whatsapp-inbox.controller.js.map +1 -1
  158. package/dist/backend/backend/src/controllers/whatsapp/whatsapp.controller.d.ts.map +1 -1
  159. package/dist/backend/backend/src/controllers/whatsapp/whatsapp.controller.js +10 -2
  160. package/dist/backend/backend/src/controllers/whatsapp/whatsapp.controller.js.map +1 -1
  161. package/dist/backend/backend/src/index.d.ts +34 -0
  162. package/dist/backend/backend/src/index.d.ts.map +1 -1
  163. package/dist/backend/backend/src/index.js +342 -61
  164. package/dist/backend/backend/src/index.js.map +1 -1
  165. package/dist/backend/backend/src/middleware/agent-origin-correction.d.ts +31 -0
  166. package/dist/backend/backend/src/middleware/agent-origin-correction.d.ts.map +1 -0
  167. package/dist/backend/backend/src/middleware/agent-origin-correction.js +31 -0
  168. package/dist/backend/backend/src/middleware/agent-origin-correction.js.map +1 -0
  169. package/dist/backend/backend/src/middleware/agent-origin.middleware.d.ts +6 -0
  170. package/dist/backend/backend/src/middleware/agent-origin.middleware.d.ts.map +1 -1
  171. package/dist/backend/backend/src/middleware/agent-origin.middleware.js +4 -1
  172. package/dist/backend/backend/src/middleware/agent-origin.middleware.js.map +1 -1
  173. package/dist/backend/backend/src/middleware/api-token.middleware.d.ts +20 -17
  174. package/dist/backend/backend/src/middleware/api-token.middleware.d.ts.map +1 -1
  175. package/dist/backend/backend/src/middleware/api-token.middleware.js +27 -37
  176. package/dist/backend/backend/src/middleware/api-token.middleware.js.map +1 -1
  177. package/dist/backend/backend/src/middleware/caller-identity.middleware.d.ts +213 -0
  178. package/dist/backend/backend/src/middleware/caller-identity.middleware.d.ts.map +1 -0
  179. package/dist/backend/backend/src/middleware/caller-identity.middleware.js +481 -0
  180. package/dist/backend/backend/src/middleware/caller-identity.middleware.js.map +1 -0
  181. package/dist/backend/backend/src/middleware/caller-identity.testing.d.ts +67 -0
  182. package/dist/backend/backend/src/middleware/caller-identity.testing.d.ts.map +1 -0
  183. package/dist/backend/backend/src/middleware/caller-identity.testing.js +108 -0
  184. package/dist/backend/backend/src/middleware/caller-identity.testing.js.map +1 -0
  185. package/dist/backend/backend/src/routes/api.routes.d.ts.map +1 -1
  186. package/dist/backend/backend/src/routes/api.routes.js +11 -0
  187. package/dist/backend/backend/src/routes/api.routes.js.map +1 -1
  188. package/dist/backend/backend/src/services/agent/agent-registration.service.d.ts.map +1 -1
  189. package/dist/backend/backend/src/services/agent/agent-registration.service.js +17 -2
  190. package/dist/backend/backend/src/services/agent/agent-registration.service.js.map +1 -1
  191. package/dist/backend/backend/src/services/agent/control-plane-guard.service.d.ts +7 -5
  192. package/dist/backend/backend/src/services/agent/control-plane-guard.service.d.ts.map +1 -1
  193. package/dist/backend/backend/src/services/agent/control-plane-guard.service.js +19 -10
  194. package/dist/backend/backend/src/services/agent/control-plane-guard.service.js.map +1 -1
  195. package/dist/backend/backend/src/services/agent/crewly-agent/crewly-agent-external-runtime.service.d.ts.map +1 -1
  196. package/dist/backend/backend/src/services/agent/crewly-agent/crewly-agent-external-runtime.service.js +10 -1
  197. package/dist/backend/backend/src/services/agent/crewly-agent/crewly-agent-external-runtime.service.js.map +1 -1
  198. package/dist/backend/backend/src/services/agent/oauth-relogin-monitor.service.d.ts +1 -1
  199. package/dist/backend/backend/src/services/agent/oauth-relogin-monitor.service.d.ts.map +1 -1
  200. package/dist/backend/backend/src/services/agent/restore-filter.d.ts +5 -2
  201. package/dist/backend/backend/src/services/agent/restore-filter.d.ts.map +1 -1
  202. package/dist/backend/backend/src/services/agent/restore-filter.js +5 -2
  203. package/dist/backend/backend/src/services/agent/restore-filter.js.map +1 -1
  204. package/dist/backend/backend/src/services/agent/runtime-agent.service.abstract.d.ts.map +1 -1
  205. package/dist/backend/backend/src/services/agent/runtime-agent.service.abstract.js +4 -0
  206. package/dist/backend/backend/src/services/agent/runtime-agent.service.abstract.js.map +1 -1
  207. package/dist/backend/backend/src/services/agent/runtime-exit-monitor.service.d.ts +29 -0
  208. package/dist/backend/backend/src/services/agent/runtime-exit-monitor.service.d.ts.map +1 -1
  209. package/dist/backend/backend/src/services/agent/runtime-exit-monitor.service.js +77 -1
  210. package/dist/backend/backend/src/services/agent/runtime-exit-monitor.service.js.map +1 -1
  211. package/dist/backend/backend/src/services/agent/runtime-session-recovery.d.ts +4 -2
  212. package/dist/backend/backend/src/services/agent/runtime-session-recovery.d.ts.map +1 -1
  213. package/dist/backend/backend/src/services/agent/runtime-session-recovery.js +22 -6
  214. package/dist/backend/backend/src/services/agent/runtime-session-recovery.js.map +1 -1
  215. package/dist/backend/backend/src/services/ai/prompt-modules/communication.module.js +2 -2
  216. package/dist/backend/backend/src/services/ai/prompt-modules/communication.module.js.map +1 -1
  217. package/dist/backend/backend/src/services/ai/prompt-modules/skills-reference.module.d.ts.map +1 -1
  218. package/dist/backend/backend/src/services/ai/prompt-modules/skills-reference.module.js +1 -0
  219. package/dist/backend/backend/src/services/ai/prompt-modules/skills-reference.module.js.map +1 -1
  220. package/dist/backend/backend/src/services/backup/backup-archive.service.d.ts +6 -0
  221. package/dist/backend/backend/src/services/backup/backup-archive.service.d.ts.map +1 -1
  222. package/dist/backend/backend/src/services/backup/backup-archive.service.js +7 -1
  223. package/dist/backend/backend/src/services/backup/backup-archive.service.js.map +1 -1
  224. package/dist/backend/backend/src/services/boot/boot-announce.service.d.ts +1 -1
  225. package/dist/backend/backend/src/services/boot/boot-announce.service.d.ts.map +1 -1
  226. package/dist/backend/backend/src/services/chat/chat.service.d.ts +175 -2
  227. package/dist/backend/backend/src/services/chat/chat.service.d.ts.map +1 -1
  228. package/dist/backend/backend/src/services/chat/chat.service.js +444 -35
  229. package/dist/backend/backend/src/services/chat/chat.service.js.map +1 -1
  230. package/dist/backend/backend/src/services/chat-v2/chat-v2.dispatcher.service.d.ts +30 -5
  231. package/dist/backend/backend/src/services/chat-v2/chat-v2.dispatcher.service.d.ts.map +1 -1
  232. package/dist/backend/backend/src/services/chat-v2/chat-v2.dispatcher.service.js +34 -4
  233. package/dist/backend/backend/src/services/chat-v2/chat-v2.dispatcher.service.js.map +1 -1
  234. package/dist/backend/backend/src/services/chat-v2/chat-v2.service.d.ts +4 -3
  235. package/dist/backend/backend/src/services/chat-v2/chat-v2.service.d.ts.map +1 -1
  236. package/dist/backend/backend/src/services/chat-v2/chat-v2.service.js +7 -4
  237. package/dist/backend/backend/src/services/chat-v2/chat-v2.service.js.map +1 -1
  238. package/dist/backend/backend/src/services/chat-v2/sqlite/channel.store.d.ts +18 -11
  239. package/dist/backend/backend/src/services/chat-v2/sqlite/channel.store.d.ts.map +1 -1
  240. package/dist/backend/backend/src/services/chat-v2/sqlite/channel.store.js +19 -25
  241. package/dist/backend/backend/src/services/chat-v2/sqlite/channel.store.js.map +1 -1
  242. package/dist/backend/backend/src/services/chat-v2/sqlite/message.store.d.ts +7 -4
  243. package/dist/backend/backend/src/services/chat-v2/sqlite/message.store.d.ts.map +1 -1
  244. package/dist/backend/backend/src/services/chat-v2/sqlite/message.store.js +8 -4
  245. package/dist/backend/backend/src/services/chat-v2/sqlite/message.store.js.map +1 -1
  246. package/dist/backend/backend/src/services/chat-v2/types.d.ts +0 -1
  247. package/dist/backend/backend/src/services/chat-v2/types.d.ts.map +1 -1
  248. package/dist/backend/backend/src/services/chat-v2/types.js +0 -1
  249. package/dist/backend/backend/src/services/chat-v2/types.js.map +1 -1
  250. package/dist/backend/backend/src/services/cloud/mobile-api-relay.service.d.ts.map +1 -1
  251. package/dist/backend/backend/src/services/cloud/mobile-api-relay.service.js +5 -0
  252. package/dist/backend/backend/src/services/cloud/mobile-api-relay.service.js.map +1 -1
  253. package/dist/backend/backend/src/services/core/api-token.service.d.ts +28 -0
  254. package/dist/backend/backend/src/services/core/api-token.service.d.ts.map +1 -1
  255. package/dist/backend/backend/src/services/core/api-token.service.js +46 -0
  256. package/dist/backend/backend/src/services/core/api-token.service.js.map +1 -1
  257. package/dist/backend/backend/src/services/core/dashboard-build.d.ts +49 -0
  258. package/dist/backend/backend/src/services/core/dashboard-build.d.ts.map +1 -0
  259. package/dist/backend/backend/src/services/core/dashboard-build.js +68 -0
  260. package/dist/backend/backend/src/services/core/dashboard-build.js.map +1 -0
  261. package/dist/backend/backend/src/services/core/owner-auth.service.d.ts +127 -0
  262. package/dist/backend/backend/src/services/core/owner-auth.service.d.ts.map +1 -0
  263. package/dist/backend/backend/src/services/core/owner-auth.service.js +205 -0
  264. package/dist/backend/backend/src/services/core/owner-auth.service.js.map +1 -0
  265. package/dist/backend/backend/src/services/core/peer-process.service.d.ts +168 -0
  266. package/dist/backend/backend/src/services/core/peer-process.service.d.ts.map +1 -0
  267. package/dist/backend/backend/src/services/core/peer-process.service.js +352 -0
  268. package/dist/backend/backend/src/services/core/peer-process.service.js.map +1 -0
  269. package/dist/backend/backend/src/services/decisions/decision-store.d.ts.map +1 -1
  270. package/dist/backend/backend/src/services/decisions/decision-store.js +5 -1
  271. package/dist/backend/backend/src/services/decisions/decision-store.js.map +1 -1
  272. package/dist/backend/backend/src/services/decisions/decision.wiring.d.ts +10 -1
  273. package/dist/backend/backend/src/services/decisions/decision.wiring.d.ts.map +1 -1
  274. package/dist/backend/backend/src/services/decisions/decision.wiring.js +20 -9
  275. package/dist/backend/backend/src/services/decisions/decision.wiring.js.map +1 -1
  276. package/dist/backend/backend/src/services/experiments/experiment-verdict.d.ts +1 -1
  277. package/dist/backend/backend/src/services/experiments/experiment-verdict.js +2 -2
  278. package/dist/backend/backend/src/services/experiments/experiment-verdict.js.map +1 -1
  279. package/dist/backend/backend/src/services/experiments/experiment.service.d.ts +149 -4
  280. package/dist/backend/backend/src/services/experiments/experiment.service.d.ts.map +1 -1
  281. package/dist/backend/backend/src/services/experiments/experiment.service.js +549 -24
  282. package/dist/backend/backend/src/services/experiments/experiment.service.js.map +1 -1
  283. package/dist/backend/backend/src/services/experiments/experiment.wiring.d.ts +20 -5
  284. package/dist/backend/backend/src/services/experiments/experiment.wiring.d.ts.map +1 -1
  285. package/dist/backend/backend/src/services/experiments/experiment.wiring.js +46 -9
  286. package/dist/backend/backend/src/services/experiments/experiment.wiring.js.map +1 -1
  287. package/dist/backend/backend/src/services/experiments/seo-ops-metric.fetcher.d.ts +7 -0
  288. package/dist/backend/backend/src/services/experiments/seo-ops-metric.fetcher.d.ts.map +1 -1
  289. package/dist/backend/backend/src/services/experiments/seo-ops-metric.fetcher.js +21 -1
  290. package/dist/backend/backend/src/services/experiments/seo-ops-metric.fetcher.js.map +1 -1
  291. package/dist/backend/backend/src/services/messaging/owner-message-watchdog.service.d.ts.map +1 -1
  292. package/dist/backend/backend/src/services/messaging/owner-message-watchdog.service.js +7 -0
  293. package/dist/backend/backend/src/services/messaging/owner-message-watchdog.service.js.map +1 -1
  294. package/dist/backend/backend/src/services/messaging/owner-message-watchdog.wiring.d.ts.map +1 -1
  295. package/dist/backend/backend/src/services/messaging/owner-message-watchdog.wiring.js +2 -1
  296. package/dist/backend/backend/src/services/messaging/owner-message-watchdog.wiring.js.map +1 -1
  297. package/dist/backend/backend/src/services/messaging/thread-status-queue.service.d.ts +0 -8
  298. package/dist/backend/backend/src/services/messaging/thread-status-queue.service.d.ts.map +1 -1
  299. package/dist/backend/backend/src/services/messaging/thread-status-queue.service.js +0 -18
  300. package/dist/backend/backend/src/services/messaging/thread-status-queue.service.js.map +1 -1
  301. package/dist/backend/backend/src/services/monitoring/activity-monitor.service.d.ts +19 -0
  302. package/dist/backend/backend/src/services/monitoring/activity-monitor.service.d.ts.map +1 -1
  303. package/dist/backend/backend/src/services/monitoring/activity-monitor.service.js +41 -5
  304. package/dist/backend/backend/src/services/monitoring/activity-monitor.service.js.map +1 -1
  305. package/dist/backend/backend/src/services/monitoring/agent-turn-state.d.ts +184 -0
  306. package/dist/backend/backend/src/services/monitoring/agent-turn-state.d.ts.map +1 -0
  307. package/dist/backend/backend/src/services/monitoring/agent-turn-state.js +391 -0
  308. package/dist/backend/backend/src/services/monitoring/agent-turn-state.js.map +1 -0
  309. package/dist/backend/backend/src/services/monitoring/claude-transcript-sync.service.d.ts +35 -1
  310. package/dist/backend/backend/src/services/monitoring/claude-transcript-sync.service.d.ts.map +1 -1
  311. package/dist/backend/backend/src/services/monitoring/claude-transcript-sync.service.js +138 -2
  312. package/dist/backend/backend/src/services/monitoring/claude-transcript-sync.service.js.map +1 -1
  313. package/dist/backend/backend/src/services/monitoring/claude-transcript-turn.d.ts +73 -0
  314. package/dist/backend/backend/src/services/monitoring/claude-transcript-turn.d.ts.map +1 -0
  315. package/dist/backend/backend/src/services/monitoring/claude-transcript-turn.js +258 -0
  316. package/dist/backend/backend/src/services/monitoring/claude-transcript-turn.js.map +1 -0
  317. package/dist/backend/backend/src/services/monitoring/deferred-idle-settle.d.ts +82 -0
  318. package/dist/backend/backend/src/services/monitoring/deferred-idle-settle.d.ts.map +1 -0
  319. package/dist/backend/backend/src/services/monitoring/deferred-idle-settle.js +141 -0
  320. package/dist/backend/backend/src/services/monitoring/deferred-idle-settle.js.map +1 -0
  321. package/dist/backend/backend/src/services/monitoring/system-resource-alert.service.d.ts +51 -1
  322. package/dist/backend/backend/src/services/monitoring/system-resource-alert.service.d.ts.map +1 -1
  323. package/dist/backend/backend/src/services/monitoring/system-resource-alert.service.js +118 -2
  324. package/dist/backend/backend/src/services/monitoring/system-resource-alert.service.js.map +1 -1
  325. package/dist/backend/backend/src/services/monitoring/token-usage.service.d.ts +7 -0
  326. package/dist/backend/backend/src/services/monitoring/token-usage.service.d.ts.map +1 -1
  327. package/dist/backend/backend/src/services/monitoring/token-usage.service.js +4 -0
  328. package/dist/backend/backend/src/services/monitoring/token-usage.service.js.map +1 -1
  329. package/dist/backend/backend/src/services/monitoring/transcript-cost-repair.d.ts +103 -0
  330. package/dist/backend/backend/src/services/monitoring/transcript-cost-repair.d.ts.map +1 -0
  331. package/dist/backend/backend/src/services/monitoring/transcript-cost-repair.js +86 -0
  332. package/dist/backend/backend/src/services/monitoring/transcript-cost-repair.js.map +1 -0
  333. package/dist/backend/backend/src/services/open-items/open-items.service.d.ts +57 -0
  334. package/dist/backend/backend/src/services/open-items/open-items.service.d.ts.map +1 -1
  335. package/dist/backend/backend/src/services/open-items/open-items.service.js +100 -4
  336. package/dist/backend/backend/src/services/open-items/open-items.service.js.map +1 -1
  337. package/dist/backend/backend/src/services/orc/orc-status-router.service.d.ts.map +1 -1
  338. package/dist/backend/backend/src/services/orc/orc-status-router.service.js +10 -2
  339. package/dist/backend/backend/src/services/orc/orc-status-router.service.js.map +1 -1
  340. package/dist/backend/backend/src/services/orc/reply-destination.wiring.d.ts.map +1 -1
  341. package/dist/backend/backend/src/services/orc/reply-destination.wiring.js +16 -0
  342. package/dist/backend/backend/src/services/orc/reply-destination.wiring.js.map +1 -1
  343. package/dist/backend/backend/src/services/project-tickets/project-ticket-workflow.service.d.ts.map +1 -1
  344. package/dist/backend/backend/src/services/project-tickets/project-ticket-workflow.service.js +13 -0
  345. package/dist/backend/backend/src/services/project-tickets/project-ticket-workflow.service.js.map +1 -1
  346. package/dist/backend/backend/src/services/project-tickets/project-ticket.service.d.ts +36 -0
  347. package/dist/backend/backend/src/services/project-tickets/project-ticket.service.d.ts.map +1 -1
  348. package/dist/backend/backend/src/services/project-tickets/project-ticket.service.js +44 -3
  349. package/dist/backend/backend/src/services/project-tickets/project-ticket.service.js.map +1 -1
  350. package/dist/backend/backend/src/services/project-tickets/ticket-assignee-waker.d.ts.map +1 -1
  351. package/dist/backend/backend/src/services/project-tickets/ticket-assignee-waker.js +2 -1
  352. package/dist/backend/backend/src/services/project-tickets/ticket-assignee-waker.js.map +1 -1
  353. package/dist/backend/backend/src/services/project-tickets/ticket-autopilot-decision.d.ts.map +1 -1
  354. package/dist/backend/backend/src/services/project-tickets/ticket-autopilot-decision.js +3 -0
  355. package/dist/backend/backend/src/services/project-tickets/ticket-autopilot-decision.js.map +1 -1
  356. package/dist/backend/backend/src/services/project-tickets/ticket-autopilot-retro.d.ts +156 -0
  357. package/dist/backend/backend/src/services/project-tickets/ticket-autopilot-retro.d.ts.map +1 -0
  358. package/dist/backend/backend/src/services/project-tickets/ticket-autopilot-retro.js +308 -0
  359. package/dist/backend/backend/src/services/project-tickets/ticket-autopilot-retro.js.map +1 -0
  360. package/dist/backend/backend/src/services/project-tickets/ticket-autopilot-stats.d.ts +212 -0
  361. package/dist/backend/backend/src/services/project-tickets/ticket-autopilot-stats.d.ts.map +1 -0
  362. package/dist/backend/backend/src/services/project-tickets/ticket-autopilot-stats.js +515 -0
  363. package/dist/backend/backend/src/services/project-tickets/ticket-autopilot-stats.js.map +1 -0
  364. package/dist/backend/backend/src/services/project-tickets/ticket-autopilot-trace.d.ts +186 -0
  365. package/dist/backend/backend/src/services/project-tickets/ticket-autopilot-trace.d.ts.map +1 -0
  366. package/dist/backend/backend/src/services/project-tickets/ticket-autopilot-trace.js +341 -0
  367. package/dist/backend/backend/src/services/project-tickets/ticket-autopilot-trace.js.map +1 -0
  368. package/dist/backend/backend/src/services/project-tickets/ticket-autopilot.service.d.ts +309 -0
  369. package/dist/backend/backend/src/services/project-tickets/ticket-autopilot.service.d.ts.map +1 -1
  370. package/dist/backend/backend/src/services/project-tickets/ticket-autopilot.service.js +726 -1
  371. package/dist/backend/backend/src/services/project-tickets/ticket-autopilot.service.js.map +1 -1
  372. package/dist/backend/backend/src/services/reconciler/reconciler.service.d.ts.map +1 -1
  373. package/dist/backend/backend/src/services/reconciler/reconciler.service.js +15 -0
  374. package/dist/backend/backend/src/services/reconciler/reconciler.service.js.map +1 -1
  375. package/dist/backend/backend/src/services/restart/in-flight-turn-tracker.service.d.ts +34 -3
  376. package/dist/backend/backend/src/services/restart/in-flight-turn-tracker.service.d.ts.map +1 -1
  377. package/dist/backend/backend/src/services/restart/in-flight-turn-tracker.service.js +57 -2
  378. package/dist/backend/backend/src/services/restart/in-flight-turn-tracker.service.js.map +1 -1
  379. package/dist/backend/backend/src/services/restart/interrupted-turns.d.ts +61 -3
  380. package/dist/backend/backend/src/services/restart/interrupted-turns.d.ts.map +1 -1
  381. package/dist/backend/backend/src/services/restart/interrupted-turns.js +106 -9
  382. package/dist/backend/backend/src/services/restart/interrupted-turns.js.map +1 -1
  383. package/dist/backend/backend/src/services/restart/restart-drain.service.d.ts +22 -0
  384. package/dist/backend/backend/src/services/restart/restart-drain.service.d.ts.map +1 -1
  385. package/dist/backend/backend/src/services/restart/restart-drain.service.js +37 -5
  386. package/dist/backend/backend/src/services/restart/restart-drain.service.js.map +1 -1
  387. package/dist/backend/backend/src/services/restart/supervisor-stop-budget.d.ts +62 -0
  388. package/dist/backend/backend/src/services/restart/supervisor-stop-budget.d.ts.map +1 -0
  389. package/dist/backend/backend/src/services/restart/supervisor-stop-budget.js +126 -0
  390. package/dist/backend/backend/src/services/restart/supervisor-stop-budget.js.map +1 -0
  391. package/dist/backend/backend/src/services/restart/turn-probe.d.ts +17 -2
  392. package/dist/backend/backend/src/services/restart/turn-probe.d.ts.map +1 -1
  393. package/dist/backend/backend/src/services/restart/turn-probe.js +29 -4
  394. package/dist/backend/backend/src/services/restart/turn-probe.js.map +1 -1
  395. package/dist/backend/backend/src/services/runtime-fallback/runtime-fallback.service.d.ts.map +1 -1
  396. package/dist/backend/backend/src/services/runtime-fallback/runtime-fallback.service.js +4 -0
  397. package/dist/backend/backend/src/services/runtime-fallback/runtime-fallback.service.js.map +1 -1
  398. package/dist/backend/backend/src/services/session/session-handoff.service.d.ts.map +1 -1
  399. package/dist/backend/backend/src/services/session/session-handoff.service.js +8 -5
  400. package/dist/backend/backend/src/services/session/session-handoff.service.js.map +1 -1
  401. package/dist/backend/backend/src/services/signal-digest/signal-digest-card.d.ts +75 -0
  402. package/dist/backend/backend/src/services/signal-digest/signal-digest-card.d.ts.map +1 -0
  403. package/dist/backend/backend/src/services/signal-digest/signal-digest-card.js +187 -0
  404. package/dist/backend/backend/src/services/signal-digest/signal-digest-card.js.map +1 -0
  405. package/dist/backend/backend/src/services/signal-digest/signal-digest-contract.d.ts +86 -0
  406. package/dist/backend/backend/src/services/signal-digest/signal-digest-contract.d.ts.map +1 -0
  407. package/dist/backend/backend/src/services/signal-digest/signal-digest-contract.js +307 -0
  408. package/dist/backend/backend/src/services/signal-digest/signal-digest-contract.js.map +1 -0
  409. package/dist/backend/backend/src/services/signal-digest/signal-digest-store.d.ts +85 -0
  410. package/dist/backend/backend/src/services/signal-digest/signal-digest-store.d.ts.map +1 -0
  411. package/dist/backend/backend/src/services/signal-digest/signal-digest-store.js +185 -0
  412. package/dist/backend/backend/src/services/signal-digest/signal-digest-store.js.map +1 -0
  413. package/dist/backend/backend/src/services/signal-digest/signal-digest.service.d.ts +272 -0
  414. package/dist/backend/backend/src/services/signal-digest/signal-digest.service.d.ts.map +1 -0
  415. package/dist/backend/backend/src/services/signal-digest/signal-digest.service.js +570 -0
  416. package/dist/backend/backend/src/services/signal-digest/signal-digest.service.js.map +1 -0
  417. package/dist/backend/backend/src/services/signal-digest/signal-digest.wiring.d.ts +51 -0
  418. package/dist/backend/backend/src/services/signal-digest/signal-digest.wiring.d.ts.map +1 -0
  419. package/dist/backend/backend/src/services/signal-digest/signal-digest.wiring.js +116 -0
  420. package/dist/backend/backend/src/services/signal-digest/signal-digest.wiring.js.map +1 -0
  421. package/dist/backend/backend/src/services/slack/notify-reconciliation.service.d.ts +5 -1
  422. package/dist/backend/backend/src/services/slack/notify-reconciliation.service.d.ts.map +1 -1
  423. package/dist/backend/backend/src/services/slack/notify-reconciliation.service.js +6 -2
  424. package/dist/backend/backend/src/services/slack/notify-reconciliation.service.js.map +1 -1
  425. package/dist/backend/backend/src/services/slack/slack-auto-working.service.d.ts +29 -0
  426. package/dist/backend/backend/src/services/slack/slack-auto-working.service.d.ts.map +1 -1
  427. package/dist/backend/backend/src/services/slack/slack-auto-working.service.js +66 -3
  428. package/dist/backend/backend/src/services/slack/slack-auto-working.service.js.map +1 -1
  429. package/dist/backend/backend/src/services/slack/slack-orchestrator-bridge.d.ts +2 -1
  430. package/dist/backend/backend/src/services/slack/slack-orchestrator-bridge.d.ts.map +1 -1
  431. package/dist/backend/backend/src/services/slack/slack-orchestrator-bridge.js +3 -2
  432. package/dist/backend/backend/src/services/slack/slack-orchestrator-bridge.js.map +1 -1
  433. package/dist/backend/backend/src/services/slack/slack-relogin-dm.service.d.ts +1 -1
  434. package/dist/backend/backend/src/services/slack/slack-relogin-dm.service.d.ts.map +1 -1
  435. package/dist/backend/backend/src/services/slack/slack-team-channel.service.d.ts +79 -15
  436. package/dist/backend/backend/src/services/slack/slack-team-channel.service.d.ts.map +1 -1
  437. package/dist/backend/backend/src/services/slack/slack-team-channel.service.js +200 -41
  438. package/dist/backend/backend/src/services/slack/slack-team-channel.service.js.map +1 -1
  439. package/dist/backend/backend/src/services/slack/slack.service.d.ts +43 -1
  440. package/dist/backend/backend/src/services/slack/slack.service.d.ts.map +1 -1
  441. package/dist/backend/backend/src/services/slack/slack.service.js +76 -7
  442. package/dist/backend/backend/src/services/slack/slack.service.js.map +1 -1
  443. package/dist/backend/backend/src/services/system/auto-update.service.d.ts +2 -2
  444. package/dist/backend/backend/src/services/system/auto-update.service.d.ts.map +1 -1
  445. package/dist/backend/backend/src/services/task-pool/pool-storage.d.ts.map +1 -1
  446. package/dist/backend/backend/src/services/task-pool/pool-storage.js +4 -0
  447. package/dist/backend/backend/src/services/task-pool/pool-storage.js.map +1 -1
  448. package/dist/backend/backend/src/services/task-pool/task-pool.service.d.ts.map +1 -1
  449. package/dist/backend/backend/src/services/task-pool/task-pool.service.js +2 -0
  450. package/dist/backend/backend/src/services/task-pool/task-pool.service.js.map +1 -1
  451. package/dist/backend/backend/src/services/trace/trace-analysis.service.d.ts +99 -0
  452. package/dist/backend/backend/src/services/trace/trace-analysis.service.d.ts.map +1 -0
  453. package/dist/backend/backend/src/services/trace/trace-analysis.service.js +148 -0
  454. package/dist/backend/backend/src/services/trace/trace-analysis.service.js.map +1 -0
  455. package/dist/backend/backend/src/services/trace/trace-context.service.d.ts +212 -0
  456. package/dist/backend/backend/src/services/trace/trace-context.service.d.ts.map +1 -0
  457. package/dist/backend/backend/src/services/trace/trace-context.service.js +489 -0
  458. package/dist/backend/backend/src/services/trace/trace-context.service.js.map +1 -0
  459. package/dist/backend/backend/src/services/trace/trace-http.middleware.d.ts +46 -0
  460. package/dist/backend/backend/src/services/trace/trace-http.middleware.d.ts.map +1 -0
  461. package/dist/backend/backend/src/services/trace/trace-http.middleware.js +176 -0
  462. package/dist/backend/backend/src/services/trace/trace-http.middleware.js.map +1 -0
  463. package/dist/backend/backend/src/services/trace/trace-markers.d.ts +93 -0
  464. package/dist/backend/backend/src/services/trace/trace-markers.d.ts.map +1 -0
  465. package/dist/backend/backend/src/services/trace/trace-markers.js +162 -0
  466. package/dist/backend/backend/src/services/trace/trace-markers.js.map +1 -0
  467. package/dist/backend/backend/src/services/trace/trace-metrics.d.ts +262 -0
  468. package/dist/backend/backend/src/services/trace/trace-metrics.d.ts.map +1 -0
  469. package/dist/backend/backend/src/services/trace/trace-metrics.js +810 -0
  470. package/dist/backend/backend/src/services/trace/trace-metrics.js.map +1 -0
  471. package/dist/backend/backend/src/services/trace/trace-recorder.d.ts +338 -0
  472. package/dist/backend/backend/src/services/trace/trace-recorder.d.ts.map +1 -0
  473. package/dist/backend/backend/src/services/trace/trace-recorder.js +789 -0
  474. package/dist/backend/backend/src/services/trace/trace-recorder.js.map +1 -0
  475. package/dist/backend/backend/src/services/trace/trace-store.d.ts +308 -0
  476. package/dist/backend/backend/src/services/trace/trace-store.d.ts.map +1 -0
  477. package/dist/backend/backend/src/services/trace/trace-store.js +714 -0
  478. package/dist/backend/backend/src/services/trace/trace-store.js.map +1 -0
  479. package/dist/backend/backend/src/services/trace/trace-summary.d.ts +77 -0
  480. package/dist/backend/backend/src/services/trace/trace-summary.d.ts.map +1 -0
  481. package/dist/backend/backend/src/services/trace/trace-summary.js +239 -0
  482. package/dist/backend/backend/src/services/trace/trace-summary.js.map +1 -0
  483. package/dist/backend/backend/src/services/trace/trace-timeline.d.ts +74 -0
  484. package/dist/backend/backend/src/services/trace/trace-timeline.d.ts.map +1 -0
  485. package/dist/backend/backend/src/services/trace/trace-timeline.js +162 -0
  486. package/dist/backend/backend/src/services/trace/trace-timeline.js.map +1 -0
  487. package/dist/backend/backend/src/services/trace/trace.types.d.ts +137 -0
  488. package/dist/backend/backend/src/services/trace/trace.types.d.ts.map +1 -0
  489. package/dist/backend/backend/src/services/trace/trace.types.js +104 -0
  490. package/dist/backend/backend/src/services/trace/trace.types.js.map +1 -0
  491. package/dist/backend/backend/src/services/v3/owner-receipt/owner-receipt-format-ask.d.ts +80 -0
  492. package/dist/backend/backend/src/services/v3/owner-receipt/owner-receipt-format-ask.d.ts.map +1 -0
  493. package/dist/backend/backend/src/services/v3/owner-receipt/owner-receipt-format-ask.js +184 -0
  494. package/dist/backend/backend/src/services/v3/owner-receipt/owner-receipt-format-ask.js.map +1 -0
  495. package/dist/backend/backend/src/services/v3/owner-receipt/owner-receipt.boot.d.ts +1 -1
  496. package/dist/backend/backend/src/services/v3/owner-receipt/owner-receipt.boot.d.ts.map +1 -1
  497. package/dist/backend/backend/src/services/v3/owner-receipt/owner-receipt.service.d.ts +7 -0
  498. package/dist/backend/backend/src/services/v3/owner-receipt/owner-receipt.service.d.ts.map +1 -1
  499. package/dist/backend/backend/src/services/v3/owner-receipt/owner-receipt.service.js +16 -0
  500. package/dist/backend/backend/src/services/v3/owner-receipt/owner-receipt.service.js.map +1 -1
  501. package/dist/backend/backend/src/services/v3/owner-receipt/owner-receipt.types.d.ts +16 -0
  502. package/dist/backend/backend/src/services/v3/owner-receipt/owner-receipt.types.d.ts.map +1 -1
  503. package/dist/backend/backend/src/services/v3/owner-receipt/owner-receipt.types.js.map +1 -1
  504. package/dist/backend/backend/src/services/v3/request.service.d.ts.map +1 -1
  505. package/dist/backend/backend/src/services/v3/request.service.js +4 -0
  506. package/dist/backend/backend/src/services/v3/request.service.js.map +1 -1
  507. package/dist/backend/backend/src/services/v3/tl-auto-verify.service.d.ts.map +1 -1
  508. package/dist/backend/backend/src/services/v3/tl-auto-verify.service.js +2 -1
  509. package/dist/backend/backend/src/services/v3/tl-auto-verify.service.js.map +1 -1
  510. package/dist/backend/backend/src/services/v3/workitem-dispatch.subscriber.d.ts +8 -0
  511. package/dist/backend/backend/src/services/v3/workitem-dispatch.subscriber.d.ts.map +1 -1
  512. package/dist/backend/backend/src/services/v3/workitem-dispatch.subscriber.js +46 -4
  513. package/dist/backend/backend/src/services/v3/workitem-dispatch.subscriber.js.map +1 -1
  514. package/dist/backend/backend/src/services/whatsapp/whatsapp-draft-gate.d.ts +4 -3
  515. package/dist/backend/backend/src/services/whatsapp/whatsapp-draft-gate.d.ts.map +1 -1
  516. package/dist/backend/backend/src/services/whatsapp/whatsapp-draft-gate.js +3 -2
  517. package/dist/backend/backend/src/services/whatsapp/whatsapp-draft-gate.js.map +1 -1
  518. package/dist/backend/backend/src/services/wiki/wiki-ingest.service.d.ts +3 -1
  519. package/dist/backend/backend/src/services/wiki/wiki-ingest.service.d.ts.map +1 -1
  520. package/dist/backend/backend/src/services/wiki/wiki-ingest.service.js.map +1 -1
  521. package/dist/backend/backend/src/services/workflow/message-scheduler.service.d.ts.map +1 -1
  522. package/dist/backend/backend/src/services/workflow/message-scheduler.service.js +3 -0
  523. package/dist/backend/backend/src/services/workflow/message-scheduler.service.js.map +1 -1
  524. package/dist/backend/backend/src/services/workflow/scheduler.service.d.ts.map +1 -1
  525. package/dist/backend/backend/src/services/workflow/scheduler.service.js +3 -0
  526. package/dist/backend/backend/src/services/workflow/scheduler.service.js.map +1 -1
  527. package/dist/backend/backend/src/services/worktree/workitem-worktree.subscriber.d.ts.map +1 -1
  528. package/dist/backend/backend/src/services/worktree/workitem-worktree.subscriber.js +2 -1
  529. package/dist/backend/backend/src/services/worktree/workitem-worktree.subscriber.js.map +1 -1
  530. package/dist/backend/backend/src/services/worktree/worktree-janitor.service.d.ts +3 -0
  531. package/dist/backend/backend/src/services/worktree/worktree-janitor.service.d.ts.map +1 -1
  532. package/dist/backend/backend/src/services/worktree/worktree-janitor.service.js +7 -0
  533. package/dist/backend/backend/src/services/worktree/worktree-janitor.service.js.map +1 -1
  534. package/dist/backend/backend/src/types/decision.types.d.ts +3 -1
  535. package/dist/backend/backend/src/types/decision.types.d.ts.map +1 -1
  536. package/dist/backend/backend/src/types/experiment.types.d.ts +65 -6
  537. package/dist/backend/backend/src/types/experiment.types.d.ts.map +1 -1
  538. package/dist/backend/backend/src/types/experiment.types.js.map +1 -1
  539. package/dist/backend/backend/src/types/signal-digest.types.d.ts +185 -0
  540. package/dist/backend/backend/src/types/signal-digest.types.d.ts.map +1 -0
  541. package/dist/backend/backend/src/types/signal-digest.types.js +21 -0
  542. package/dist/backend/backend/src/types/signal-digest.types.js.map +1 -0
  543. package/dist/backend/backend/src/types/ticket-autopilot.types.d.ts +9 -0
  544. package/dist/backend/backend/src/types/ticket-autopilot.types.d.ts.map +1 -1
  545. package/dist/backend/backend/src/types/ticket-autopilot.types.js +14 -0
  546. package/dist/backend/backend/src/types/ticket-autopilot.types.js.map +1 -1
  547. package/dist/backend/backend/src/types/v2/open-item.types.d.ts +4 -0
  548. package/dist/backend/backend/src/types/v2/open-item.types.d.ts.map +1 -1
  549. package/dist/backend/backend/src/types/v2/request.types.d.ts +4 -0
  550. package/dist/backend/backend/src/types/v2/request.types.d.ts.map +1 -1
  551. package/dist/backend/backend/src/types/v2/request.types.js.map +1 -1
  552. package/dist/backend/backend/src/types/v2/work-item.types.d.ts +5 -1
  553. package/dist/backend/backend/src/types/v2/work-item.types.d.ts.map +1 -1
  554. package/dist/backend/backend/src/types/v2/work-item.types.js +2 -0
  555. package/dist/backend/backend/src/types/v2/work-item.types.js.map +1 -1
  556. package/dist/backend/backend/src/utils/agent-caller.utils.d.ts +44 -37
  557. package/dist/backend/backend/src/utils/agent-caller.utils.d.ts.map +1 -1
  558. package/dist/backend/backend/src/utils/agent-caller.utils.js +48 -42
  559. package/dist/backend/backend/src/utils/agent-caller.utils.js.map +1 -1
  560. package/dist/backend/backend/src/utils/secret-env.d.ts.map +1 -1
  561. package/dist/backend/backend/src/utils/secret-env.js +8 -1
  562. package/dist/backend/backend/src/utils/secret-env.js.map +1 -1
  563. package/dist/backend/backend/src/utils/security.d.ts +2 -0
  564. package/dist/backend/backend/src/utils/security.d.ts.map +1 -1
  565. package/dist/backend/backend/src/utils/security.js +3 -1
  566. package/dist/backend/backend/src/utils/security.js.map +1 -1
  567. package/dist/backend/backend/src/websocket/chat.gateway.d.ts +9 -0
  568. package/dist/backend/backend/src/websocket/chat.gateway.d.ts.map +1 -1
  569. package/dist/backend/backend/src/websocket/chat.gateway.js +26 -0
  570. package/dist/backend/backend/src/websocket/chat.gateway.js.map +1 -1
  571. package/dist/backend/build-info.json +2 -2
  572. package/dist/backend/config/constants.d.ts +67 -0
  573. package/dist/backend/config/constants.d.ts.map +1 -1
  574. package/dist/backend/config/constants.js +67 -0
  575. package/dist/backend/config/constants.js.map +1 -1
  576. package/dist/cli/backend/src/constants.d.ts +356 -5
  577. package/dist/cli/backend/src/constants.d.ts.map +1 -1
  578. package/dist/cli/backend/src/constants.js +341 -8
  579. package/dist/cli/backend/src/constants.js.map +1 -1
  580. package/dist/cli/backend/src/services/agent/agent-registration.service.d.ts.map +1 -1
  581. package/dist/cli/backend/src/services/agent/agent-registration.service.js +17 -2
  582. package/dist/cli/backend/src/services/agent/agent-registration.service.js.map +1 -1
  583. package/dist/cli/backend/src/services/agent/control-plane-guard.service.d.ts +7 -5
  584. package/dist/cli/backend/src/services/agent/control-plane-guard.service.d.ts.map +1 -1
  585. package/dist/cli/backend/src/services/agent/control-plane-guard.service.js +19 -10
  586. package/dist/cli/backend/src/services/agent/control-plane-guard.service.js.map +1 -1
  587. package/dist/cli/backend/src/services/agent/crewly-agent/crewly-agent-external-runtime.service.d.ts.map +1 -1
  588. package/dist/cli/backend/src/services/agent/crewly-agent/crewly-agent-external-runtime.service.js +10 -1
  589. package/dist/cli/backend/src/services/agent/crewly-agent/crewly-agent-external-runtime.service.js.map +1 -1
  590. package/dist/cli/backend/src/services/agent/oauth-relogin-monitor.service.d.ts +1 -1
  591. package/dist/cli/backend/src/services/agent/oauth-relogin-monitor.service.d.ts.map +1 -1
  592. package/dist/cli/backend/src/services/agent/runtime-agent.service.abstract.d.ts.map +1 -1
  593. package/dist/cli/backend/src/services/agent/runtime-agent.service.abstract.js +4 -0
  594. package/dist/cli/backend/src/services/agent/runtime-agent.service.abstract.js.map +1 -1
  595. package/dist/cli/backend/src/services/agent/runtime-exit-monitor.service.d.ts +29 -0
  596. package/dist/cli/backend/src/services/agent/runtime-exit-monitor.service.d.ts.map +1 -1
  597. package/dist/cli/backend/src/services/agent/runtime-exit-monitor.service.js +77 -1
  598. package/dist/cli/backend/src/services/agent/runtime-exit-monitor.service.js.map +1 -1
  599. package/dist/cli/backend/src/services/agent/runtime-session-recovery.d.ts +4 -2
  600. package/dist/cli/backend/src/services/agent/runtime-session-recovery.d.ts.map +1 -1
  601. package/dist/cli/backend/src/services/agent/runtime-session-recovery.js +22 -6
  602. package/dist/cli/backend/src/services/agent/runtime-session-recovery.js.map +1 -1
  603. package/dist/cli/backend/src/services/ai/prompt-modules/communication.module.js +2 -2
  604. package/dist/cli/backend/src/services/ai/prompt-modules/communication.module.js.map +1 -1
  605. package/dist/cli/backend/src/services/ai/prompt-modules/skills-reference.module.d.ts.map +1 -1
  606. package/dist/cli/backend/src/services/ai/prompt-modules/skills-reference.module.js +1 -0
  607. package/dist/cli/backend/src/services/ai/prompt-modules/skills-reference.module.js.map +1 -1
  608. package/dist/cli/backend/src/services/backup/backup-archive.service.d.ts +6 -0
  609. package/dist/cli/backend/src/services/backup/backup-archive.service.d.ts.map +1 -1
  610. package/dist/cli/backend/src/services/backup/backup-archive.service.js +7 -1
  611. package/dist/cli/backend/src/services/backup/backup-archive.service.js.map +1 -1
  612. package/dist/cli/backend/src/services/chat/chat.service.d.ts +282 -0
  613. package/dist/cli/backend/src/services/chat/chat.service.d.ts.map +1 -0
  614. package/dist/cli/backend/src/services/chat/chat.service.js +783 -0
  615. package/dist/cli/backend/src/services/chat/chat.service.js.map +1 -0
  616. package/dist/cli/backend/src/services/chat-v2/chat-v2.dispatcher.service.d.ts +30 -5
  617. package/dist/cli/backend/src/services/chat-v2/chat-v2.dispatcher.service.d.ts.map +1 -1
  618. package/dist/cli/backend/src/services/chat-v2/chat-v2.dispatcher.service.js +34 -4
  619. package/dist/cli/backend/src/services/chat-v2/chat-v2.dispatcher.service.js.map +1 -1
  620. package/dist/cli/backend/src/services/chat-v2/chat-v2.service.d.ts +4 -3
  621. package/dist/cli/backend/src/services/chat-v2/chat-v2.service.d.ts.map +1 -1
  622. package/dist/cli/backend/src/services/chat-v2/chat-v2.service.js +7 -4
  623. package/dist/cli/backend/src/services/chat-v2/chat-v2.service.js.map +1 -1
  624. package/dist/cli/backend/src/services/chat-v2/sqlite/channel.store.d.ts +18 -11
  625. package/dist/cli/backend/src/services/chat-v2/sqlite/channel.store.d.ts.map +1 -1
  626. package/dist/cli/backend/src/services/chat-v2/sqlite/channel.store.js +19 -25
  627. package/dist/cli/backend/src/services/chat-v2/sqlite/channel.store.js.map +1 -1
  628. package/dist/cli/backend/src/services/chat-v2/sqlite/message.store.d.ts +7 -4
  629. package/dist/cli/backend/src/services/chat-v2/sqlite/message.store.d.ts.map +1 -1
  630. package/dist/cli/backend/src/services/chat-v2/sqlite/message.store.js +8 -4
  631. package/dist/cli/backend/src/services/chat-v2/sqlite/message.store.js.map +1 -1
  632. package/dist/cli/backend/src/services/chat-v2/types.d.ts +0 -1
  633. package/dist/cli/backend/src/services/chat-v2/types.d.ts.map +1 -1
  634. package/dist/cli/backend/src/services/chat-v2/types.js +0 -1
  635. package/dist/cli/backend/src/services/chat-v2/types.js.map +1 -1
  636. package/dist/cli/backend/src/services/core/api-token.service.d.ts +28 -0
  637. package/dist/cli/backend/src/services/core/api-token.service.d.ts.map +1 -1
  638. package/dist/cli/backend/src/services/core/api-token.service.js +46 -0
  639. package/dist/cli/backend/src/services/core/api-token.service.js.map +1 -1
  640. package/dist/cli/backend/src/services/core/owner-auth.service.d.ts +127 -0
  641. package/dist/cli/backend/src/services/core/owner-auth.service.d.ts.map +1 -0
  642. package/dist/cli/backend/src/services/core/owner-auth.service.js +205 -0
  643. package/dist/cli/backend/src/services/core/owner-auth.service.js.map +1 -0
  644. package/dist/cli/backend/src/services/decisions/decision-store.d.ts.map +1 -1
  645. package/dist/cli/backend/src/services/decisions/decision-store.js +5 -1
  646. package/dist/cli/backend/src/services/decisions/decision-store.js.map +1 -1
  647. package/dist/cli/backend/src/services/messaging/owner-message-watchdog.service.d.ts.map +1 -1
  648. package/dist/cli/backend/src/services/messaging/owner-message-watchdog.service.js +7 -0
  649. package/dist/cli/backend/src/services/messaging/owner-message-watchdog.service.js.map +1 -1
  650. package/dist/cli/backend/src/services/messaging/thread-status-queue.service.d.ts +0 -8
  651. package/dist/cli/backend/src/services/messaging/thread-status-queue.service.d.ts.map +1 -1
  652. package/dist/cli/backend/src/services/messaging/thread-status-queue.service.js +0 -18
  653. package/dist/cli/backend/src/services/messaging/thread-status-queue.service.js.map +1 -1
  654. package/dist/cli/backend/src/services/monitoring/activity-monitor.service.d.ts +19 -0
  655. package/dist/cli/backend/src/services/monitoring/activity-monitor.service.d.ts.map +1 -1
  656. package/dist/cli/backend/src/services/monitoring/activity-monitor.service.js +41 -5
  657. package/dist/cli/backend/src/services/monitoring/activity-monitor.service.js.map +1 -1
  658. package/dist/cli/backend/src/services/monitoring/agent-turn-state.d.ts +184 -0
  659. package/dist/cli/backend/src/services/monitoring/agent-turn-state.d.ts.map +1 -0
  660. package/dist/cli/backend/src/services/monitoring/agent-turn-state.js +391 -0
  661. package/dist/cli/backend/src/services/monitoring/agent-turn-state.js.map +1 -0
  662. package/dist/cli/backend/src/services/monitoring/claude-transcript-turn.d.ts +73 -0
  663. package/dist/cli/backend/src/services/monitoring/claude-transcript-turn.d.ts.map +1 -0
  664. package/dist/cli/backend/src/services/monitoring/claude-transcript-turn.js +258 -0
  665. package/dist/cli/backend/src/services/monitoring/claude-transcript-turn.js.map +1 -0
  666. package/dist/cli/backend/src/services/monitoring/token-usage.service.d.ts +7 -0
  667. package/dist/cli/backend/src/services/monitoring/token-usage.service.d.ts.map +1 -1
  668. package/dist/cli/backend/src/services/monitoring/token-usage.service.js +4 -0
  669. package/dist/cli/backend/src/services/monitoring/token-usage.service.js.map +1 -1
  670. package/dist/cli/backend/src/services/open-items/open-items.service.d.ts +57 -0
  671. package/dist/cli/backend/src/services/open-items/open-items.service.d.ts.map +1 -1
  672. package/dist/cli/backend/src/services/open-items/open-items.service.js +100 -4
  673. package/dist/cli/backend/src/services/open-items/open-items.service.js.map +1 -1
  674. package/dist/cli/backend/src/services/project-tickets/project-ticket.service.d.ts +36 -0
  675. package/dist/cli/backend/src/services/project-tickets/project-ticket.service.d.ts.map +1 -1
  676. package/dist/cli/backend/src/services/project-tickets/project-ticket.service.js +44 -3
  677. package/dist/cli/backend/src/services/project-tickets/project-ticket.service.js.map +1 -1
  678. package/dist/cli/backend/src/services/restart/in-flight-turn-tracker.service.d.ts +34 -3
  679. package/dist/cli/backend/src/services/restart/in-flight-turn-tracker.service.d.ts.map +1 -1
  680. package/dist/cli/backend/src/services/restart/in-flight-turn-tracker.service.js +57 -2
  681. package/dist/cli/backend/src/services/restart/in-flight-turn-tracker.service.js.map +1 -1
  682. package/dist/cli/backend/src/services/restart/restart-drain.service.d.ts +22 -0
  683. package/dist/cli/backend/src/services/restart/restart-drain.service.d.ts.map +1 -1
  684. package/dist/cli/backend/src/services/restart/restart-drain.service.js +37 -5
  685. package/dist/cli/backend/src/services/restart/restart-drain.service.js.map +1 -1
  686. package/dist/cli/backend/src/services/session/session-handoff.service.d.ts.map +1 -1
  687. package/dist/cli/backend/src/services/session/session-handoff.service.js +8 -5
  688. package/dist/cli/backend/src/services/session/session-handoff.service.js.map +1 -1
  689. package/dist/cli/backend/src/services/slack/slack-auto-working.service.d.ts +29 -0
  690. package/dist/cli/backend/src/services/slack/slack-auto-working.service.d.ts.map +1 -1
  691. package/dist/cli/backend/src/services/slack/slack-auto-working.service.js +66 -3
  692. package/dist/cli/backend/src/services/slack/slack-auto-working.service.js.map +1 -1
  693. package/dist/cli/backend/src/services/slack/slack-orchestrator-bridge.d.ts +2 -1
  694. package/dist/cli/backend/src/services/slack/slack-orchestrator-bridge.d.ts.map +1 -1
  695. package/dist/cli/backend/src/services/slack/slack-orchestrator-bridge.js +3 -2
  696. package/dist/cli/backend/src/services/slack/slack-orchestrator-bridge.js.map +1 -1
  697. package/dist/cli/backend/src/services/slack/slack-team-channel.service.d.ts +79 -15
  698. package/dist/cli/backend/src/services/slack/slack-team-channel.service.d.ts.map +1 -1
  699. package/dist/cli/backend/src/services/slack/slack-team-channel.service.js +200 -41
  700. package/dist/cli/backend/src/services/slack/slack-team-channel.service.js.map +1 -1
  701. package/dist/cli/backend/src/services/slack/slack.service.d.ts +43 -1
  702. package/dist/cli/backend/src/services/slack/slack.service.d.ts.map +1 -1
  703. package/dist/cli/backend/src/services/slack/slack.service.js +76 -7
  704. package/dist/cli/backend/src/services/slack/slack.service.js.map +1 -1
  705. package/dist/cli/backend/src/services/task-pool/pool-storage.d.ts.map +1 -1
  706. package/dist/cli/backend/src/services/task-pool/pool-storage.js +4 -0
  707. package/dist/cli/backend/src/services/task-pool/pool-storage.js.map +1 -1
  708. package/dist/cli/backend/src/services/task-pool/task-pool.service.d.ts.map +1 -1
  709. package/dist/cli/backend/src/services/task-pool/task-pool.service.js +2 -0
  710. package/dist/cli/backend/src/services/task-pool/task-pool.service.js.map +1 -1
  711. package/dist/cli/backend/src/services/trace/trace-context.service.d.ts +212 -0
  712. package/dist/cli/backend/src/services/trace/trace-context.service.d.ts.map +1 -0
  713. package/dist/cli/backend/src/services/trace/trace-context.service.js +489 -0
  714. package/dist/cli/backend/src/services/trace/trace-context.service.js.map +1 -0
  715. package/dist/cli/backend/src/services/trace/trace-markers.d.ts +93 -0
  716. package/dist/cli/backend/src/services/trace/trace-markers.d.ts.map +1 -0
  717. package/dist/cli/backend/src/services/trace/trace-markers.js +162 -0
  718. package/dist/cli/backend/src/services/trace/trace-markers.js.map +1 -0
  719. package/dist/cli/backend/src/services/trace/trace-recorder.d.ts +338 -0
  720. package/dist/cli/backend/src/services/trace/trace-recorder.d.ts.map +1 -0
  721. package/dist/cli/backend/src/services/trace/trace-recorder.js +789 -0
  722. package/dist/cli/backend/src/services/trace/trace-recorder.js.map +1 -0
  723. package/dist/cli/backend/src/services/trace/trace-store.d.ts +308 -0
  724. package/dist/cli/backend/src/services/trace/trace-store.d.ts.map +1 -0
  725. package/dist/cli/backend/src/services/trace/trace-store.js +714 -0
  726. package/dist/cli/backend/src/services/trace/trace-store.js.map +1 -0
  727. package/dist/cli/backend/src/services/trace/trace.types.d.ts +137 -0
  728. package/dist/cli/backend/src/services/trace/trace.types.d.ts.map +1 -0
  729. package/dist/cli/backend/src/services/trace/trace.types.js +104 -0
  730. package/dist/cli/backend/src/services/trace/trace.types.js.map +1 -0
  731. package/dist/cli/backend/src/services/v3/request.service.d.ts.map +1 -1
  732. package/dist/cli/backend/src/services/v3/request.service.js +4 -0
  733. package/dist/cli/backend/src/services/v3/request.service.js.map +1 -1
  734. package/dist/cli/backend/src/services/wiki/wiki-ingest.service.d.ts +3 -1
  735. package/dist/cli/backend/src/services/wiki/wiki-ingest.service.d.ts.map +1 -1
  736. package/dist/cli/backend/src/services/wiki/wiki-ingest.service.js.map +1 -1
  737. package/dist/cli/backend/src/types/decision.types.d.ts +3 -1
  738. package/dist/cli/backend/src/types/decision.types.d.ts.map +1 -1
  739. package/dist/cli/backend/src/types/ticket-autopilot.types.d.ts +9 -0
  740. package/dist/cli/backend/src/types/ticket-autopilot.types.d.ts.map +1 -1
  741. package/dist/cli/backend/src/types/ticket-autopilot.types.js +14 -0
  742. package/dist/cli/backend/src/types/ticket-autopilot.types.js.map +1 -1
  743. package/dist/cli/backend/src/types/v2/open-item.types.d.ts +4 -0
  744. package/dist/cli/backend/src/types/v2/open-item.types.d.ts.map +1 -1
  745. package/dist/cli/backend/src/types/v2/request.types.d.ts +4 -0
  746. package/dist/cli/backend/src/types/v2/request.types.d.ts.map +1 -1
  747. package/dist/cli/backend/src/types/v2/request.types.js.map +1 -1
  748. package/dist/cli/backend/src/types/v2/work-item.types.d.ts +5 -1
  749. package/dist/cli/backend/src/types/v2/work-item.types.d.ts.map +1 -1
  750. package/dist/cli/backend/src/types/v2/work-item.types.js +2 -0
  751. package/dist/cli/backend/src/types/v2/work-item.types.js.map +1 -1
  752. package/dist/cli/backend/src/utils/secret-env.d.ts.map +1 -1
  753. package/dist/cli/backend/src/utils/secret-env.js +8 -1
  754. package/dist/cli/backend/src/utils/secret-env.js.map +1 -1
  755. package/dist/cli/backend/src/utils/security.d.ts +196 -0
  756. package/dist/cli/backend/src/utils/security.d.ts.map +1 -0
  757. package/dist/cli/backend/src/utils/security.js +538 -0
  758. package/dist/cli/backend/src/utils/security.js.map +1 -0
  759. package/dist/cli/backend/src/websocket/chat.gateway.d.ts +9 -0
  760. package/dist/cli/backend/src/websocket/chat.gateway.d.ts.map +1 -1
  761. package/dist/cli/backend/src/websocket/chat.gateway.js +26 -0
  762. package/dist/cli/backend/src/websocket/chat.gateway.js.map +1 -1
  763. package/dist/cli/cli/src/commands/service.d.ts +12 -0
  764. package/dist/cli/cli/src/commands/service.d.ts.map +1 -1
  765. package/dist/cli/cli/src/commands/service.js +36 -2
  766. package/dist/cli/cli/src/commands/service.js.map +1 -1
  767. package/dist/cli/cli/src/index.js +4 -0
  768. package/dist/cli/cli/src/index.js.map +1 -1
  769. package/dist/cli/cli/src/utils/owner-token-fetch.d.ts +41 -0
  770. package/dist/cli/cli/src/utils/owner-token-fetch.d.ts.map +1 -0
  771. package/dist/cli/cli/src/utils/owner-token-fetch.js +83 -0
  772. package/dist/cli/cli/src/utils/owner-token-fetch.js.map +1 -0
  773. package/dist/cli/cli/src/utils/safe-shutdown.d.ts +13 -3
  774. package/dist/cli/cli/src/utils/safe-shutdown.d.ts.map +1 -1
  775. package/dist/cli/cli/src/utils/safe-shutdown.js +26 -4
  776. package/dist/cli/cli/src/utils/safe-shutdown.js.map +1 -1
  777. package/dist/cli/config/constants.d.ts +67 -0
  778. package/dist/cli/config/constants.d.ts.map +1 -1
  779. package/dist/cli/config/constants.js +67 -0
  780. package/dist/cli/config/constants.js.map +1 -1
  781. package/frontend/dist/assets/index-bfa0e2e8.css +42 -0
  782. package/frontend/dist/assets/{index-800118ca.js → index-edfa8e04.js} +285 -285
  783. package/frontend/dist/index.html +2 -2
  784. package/package.json +1 -1
  785. package/packages/crewly-agent/src/runtime/api-client.test.ts +42 -0
  786. package/packages/crewly-agent/src/runtime/api-client.ts +6 -0
  787. package/dist/backend/backend/src/services/v3/request-notification.service.d.ts +0 -52
  788. package/dist/backend/backend/src/services/v3/request-notification.service.d.ts.map +0 -1
  789. package/dist/backend/backend/src/services/v3/request-notification.service.js +0 -161
  790. package/dist/backend/backend/src/services/v3/request-notification.service.js.map +0 -1
  791. package/frontend/dist/assets/index-5e967795.css +0 -42
@@ -0,0 +1,572 @@
1
+ #!/usr/bin/env python3
2
+ """signal-digest: a site's daily signals, turned into ranked draft actions (#987).
3
+
4
+ Standard library only. Google access, the site config, Search Console windows and
5
+ analysis come from the seo-ops skill (seo_ops.py), so both skills share one config
6
+ file and one service account.
7
+
8
+ Subcommand
9
+ collect GA4 traffic + key events, Search Console opportunities, the site inbox
10
+ (passed in by execute.sh), broken sitemap pages and an optional JS-error
11
+ source; drops what the site's history or experiment log already covers;
12
+ prints JSON with the signals and up to 10 rule-ranked draft actions.
13
+
14
+ The team lead reads the output, keeps or rewrites 3-5 actions and proposes them
15
+ (execute.sh propose). Every source reports what it examined; a source that fails
16
+ (whatever the exception) says why and the others still run. execute.sh reports
17
+ the source statuses to Crewly, which tells the owner once when a source starts or
18
+ stops failing. Exit codes: 0 ok, 1 nothing could be examined, 2 setup problem.
19
+ """
20
+
21
+ from __future__ import annotations
22
+
23
+ import argparse
24
+ import concurrent.futures
25
+ import datetime as dt
26
+ import importlib.util
27
+ import json
28
+ import os
29
+ import re
30
+ import subprocess
31
+ import sys
32
+ import urllib.parse
33
+
34
+ EXIT_OK, EXIT_EMPTY, EXIT_SETUP = 0, 1, 2
35
+
36
+ MAX_CANDIDATES = 10
37
+ SITEMAP_CHECK_DEFAULT = 60
38
+ SITEMAP_CHECK_WORKERS = 8
39
+ ERRORS_COMMAND_TIMEOUT_S = 60
40
+ DEFAULT_DAYS = 7
41
+ LIST_ROWS = 5
42
+
43
+ # Typical organic CTR by position (rounded industry curves), used only to size
44
+ # the expected effect of a title rewrite or of reaching the top 3.
45
+ BENCHMARK_CTR = {1: 0.28, 2: 0.16, 3: 0.11, 4: 0.08, 5: 0.06}
46
+ NEAR_MISS_TARGET_POSITION = 3
47
+ # A rising query is proposed as a new topic only beyond this position (or when new).
48
+ RISING_MAX_RANKED_POSITION = 10
49
+ # A finished experiment keeps its query / page off the list this long (as a Do does).
50
+ EXPERIMENT_RECENT_DAYS = 90
51
+
52
+ DEFAULTS = {
53
+ "days": DEFAULT_DAYS,
54
+ "thresholds": {
55
+ "ga4DropPct": 20,
56
+ "ga4MinPrevSessions": 50,
57
+ "ga4MinPrevKeyEvents": 5,
58
+ },
59
+ "errors": {"checkSitemap": True, "maxUrls": SITEMAP_CHECK_DEFAULT},
60
+ }
61
+
62
+
63
+ class DigestError(Exception):
64
+ """A setup problem the operator can act on."""
65
+
66
+
67
+ # --------------------------------------------------------------------------- seo-ops
68
+
69
+ def seo_ops_candidates(script_dir=None, home=None):
70
+ """Where seo_ops.py may live: env override, the bundled skill, the marketplace install."""
71
+ script_dir = script_dir or os.path.dirname(os.path.abspath(__file__))
72
+ home = home or os.path.expanduser("~")
73
+ out = []
74
+ if os.environ.get("SIGNAL_DIGEST_SEO_OPS"):
75
+ out.append(os.environ["SIGNAL_DIGEST_SEO_OPS"])
76
+ out.append(os.path.join(script_dir, "..", "..", "agent", "marketplace", "seo-ops", "seo_ops.py"))
77
+ out.append(os.path.join(home, ".crewly", "marketplace", "skills", "seo-ops", "seo_ops.py"))
78
+ return out
79
+
80
+
81
+ def load_seo_ops(paths=None):
82
+ """Import seo_ops.py from the first path that exists."""
83
+ for path in paths or seo_ops_candidates():
84
+ if os.path.isfile(path):
85
+ spec = importlib.util.spec_from_file_location("seo_ops", path)
86
+ module = importlib.util.module_from_spec(spec)
87
+ spec.loader.exec_module(module)
88
+ return module
89
+ raise DigestError("seo-ops (seo_ops.py) not found. Install the seo-ops skill, or set "
90
+ "SIGNAL_DIGEST_SEO_OPS to its seo_ops.py.")
91
+
92
+
93
+ # --------------------------------------------------------------------------- helpers
94
+
95
+ def normalize_key(key):
96
+ """Same identity rule as the backend: case and spacing do not matter."""
97
+ return re.sub(r"\s+", " ", str(key)).strip().lower()
98
+
99
+
100
+ def change_pct(now, prev):
101
+ if not prev:
102
+ return None
103
+ return round(100.0 * (now - prev) / prev, 1)
104
+
105
+
106
+ def per_week(value, days):
107
+ return value * 7.0 / days if days else value
108
+
109
+
110
+ def short_path(url, site_url=""):
111
+ if site_url and url.startswith(site_url.rstrip("/")):
112
+ rest = url[len(site_url.rstrip("/")):]
113
+ return rest or "/"
114
+ p = urllib.parse.urlsplit(url)
115
+ return p.path or url
116
+
117
+
118
+ def digest_settings(cfg):
119
+ sd = cfg.get("signalDigest") or {}
120
+ merged = json.loads(json.dumps(DEFAULTS))
121
+ for k, v in sd.items():
122
+ if isinstance(v, dict) and isinstance(merged.get(k), dict):
123
+ merged[k].update(v)
124
+ else:
125
+ merged[k] = v
126
+ if not merged.get("site"):
127
+ host = urllib.parse.urlsplit(cfg.get("siteUrl", "")).netloc
128
+ if not host:
129
+ raise DigestError("Config needs signalDigest.site (or siteUrl) to name the site.")
130
+ merged["site"] = host
131
+ return merged
132
+
133
+
134
+ # --------------------------------------------------------------------------- GA4
135
+
136
+ def ga4_windows(days, today):
137
+ end = today - dt.timedelta(days=1)
138
+ start = end - dt.timedelta(days=days - 1)
139
+ p_end = start - dt.timedelta(days=1)
140
+ return start, end, p_end - dt.timedelta(days=days - 1), p_end
141
+
142
+
143
+ def _ga4_report(so, net, cfg, dims, metrics, ranges):
144
+ body = {"dateRanges": ranges, "dimensions": [{"name": d} for d in dims], "metrics": [{"name": m} for m in metrics]}
145
+ if cfg.get("ga4HostName"):
146
+ # One GA4 property can carry several sites (seo-ops ga4HostName, #885).
147
+ body["dimensionFilter"] = {"filter": {"fieldName": "hostName", "stringFilter": {"matchType": "EXACT", "value": cfg["ga4HostName"]}}}
148
+ data = net.post_json(so.GA4_API.format(prop=cfg["ga4PropertyId"]), body, so.GA4_SCOPE,
149
+ "GA4 property %s" % cfg["ga4PropertyId"], net.service_account_email())
150
+ out = []
151
+ for r in data.get("rows", []) or []:
152
+ values = [v.get("value", "") for v in r.get("dimensionValues", [])]
153
+ # With two date ranges GA4 appends the range name as an extra dimension.
154
+ rng = values[len(dims)] if len(values) > len(dims) else "now"
155
+ nums = [float(v.get("value", 0) or 0) for v in r.get("metricValues", [])]
156
+ out.append((values[:len(dims)], rng, nums))
157
+ return out
158
+
159
+
160
+ def ga4_summary(so, net, cfg, days, today, conversion_events=None):
161
+ """Sessions (all / organic) and key events, this window vs the previous one."""
162
+ start, end, p_start, p_end = ga4_windows(days, today)
163
+ ranges = [{"startDate": str(start), "endDate": str(end), "name": "now"},
164
+ {"startDate": str(p_start), "endDate": str(p_end), "name": "prev"}]
165
+ totals = {"now": {"sessions": 0.0, "organic": 0.0, "keyEvents": 0.0}, "prev": {"sessions": 0.0, "organic": 0.0, "keyEvents": 0.0}}
166
+ for (channel,), rng, (sessions, key_events) in _ga4_report(so, net, cfg, ["sessionDefaultChannelGroup"], ["sessions", "keyEvents"], ranges):
167
+ t = totals.setdefault(rng, {"sessions": 0.0, "organic": 0.0, "keyEvents": 0.0})
168
+ t["sessions"] += sessions
169
+ t["keyEvents"] += key_events
170
+ if channel == "Organic Search":
171
+ t["organic"] += sessions
172
+ events = {}
173
+ for (name,), rng, (count,) in _ga4_report(so, net, cfg, ["eventName"], ["keyEvents"], ranges):
174
+ if conversion_events and name not in conversion_events:
175
+ continue
176
+ events.setdefault(name, {"now": 0, "prev": 0})[rng] = int(count)
177
+ by_event = sorted(({"event": k, **v} for k, v in events.items() if v["now"] or v["prev"]), key=lambda e: -e["now"])
178
+ if conversion_events:
179
+ key_now = sum(e["now"] for e in by_event)
180
+ key_prev = sum(e["prev"] for e in by_event)
181
+ else:
182
+ key_now, key_prev = int(totals["now"]["keyEvents"]), int(totals["prev"]["keyEvents"])
183
+
184
+ def metric(now, prev):
185
+ return {"now": int(now), "prev": int(prev), "changePct": change_pct(now, prev)}
186
+ return {
187
+ "window": {"start": str(start), "end": str(end), "prevStart": str(p_start), "prevEnd": str(p_end)},
188
+ "sessions": metric(totals["now"]["sessions"], totals["prev"]["sessions"]),
189
+ "organicSessions": metric(totals["now"]["organic"], totals["prev"]["organic"]),
190
+ "keyEvents": metric(key_now, key_prev),
191
+ "byEvent": by_event[:LIST_ROWS * 2],
192
+ }
193
+
194
+
195
+ # --------------------------------------------------------------------------- Search Console
196
+
197
+ def top_pages(qp_rows):
198
+ """Best page (most impressions) per query."""
199
+ best = {}
200
+ for r in qp_rows:
201
+ q, page = r["keys"][0], r["keys"][1]
202
+ if q not in best or r["impressions"] > best[q][1]:
203
+ best[q] = (page, r["impressions"])
204
+ return {q: p for q, (p, _) in best.items()}
205
+
206
+
207
+ def gsc_opportunities(so, net, cfg, days, today):
208
+ start, end, p_start, p_end = so.windows(days, today)
209
+ q_now = so.gsc_rows(net, cfg, start, end, ["query"])
210
+ q_prev = so.gsc_rows(net, cfg, p_start, p_end, ["query"])
211
+ qp = so.gsc_rows(net, cfg, start, end, ["query", "page"])
212
+ res = so.analyse_queries(q_now, q_prev, qp, cfg)
213
+ pages = top_pages(qp)
214
+
215
+ def q(r):
216
+ query = r["keys"][0]
217
+ out = {"query": query, "impressions": int(r["impressions"]), "clicks": int(r["clicks"]),
218
+ "ctr": round(r["ctr"], 4), "position": round(r["position"], 1)}
219
+ if query in pages:
220
+ out["page"] = pages[query]
221
+ return out
222
+ return {
223
+ "window": {"start": str(start), "end": str(end), "days": days},
224
+ "examined": {"queries": res["queries_examined"], "queryPageRows": res["query_page_rows_examined"]},
225
+ "clicks": int(sum(r["clicks"] for r in q_now)),
226
+ "impressions": int(sum(r["impressions"] for r in q_now)),
227
+ "lowCtrTop3": [q(r) for r in res["low_ctr_top3"][:LIST_ROWS]],
228
+ "nearMiss": [q(r) for r in res["near_miss_4_20"][:LIST_ROWS]],
229
+ "rising": [dict(q(r), previous=int(r["previous"]), isNew=bool(r["is_new"])) for r in res["rising"][:LIST_ROWS]],
230
+ "cannibalization": [{"query": f["query"], "impressions": int(f["total_impressions"]),
231
+ "pages": [{"page": p["page"], "impressions": int(p["impressions"]), "position": p["position"]} for p in f["pages"][:3]]}
232
+ for f in res["cannibalization"][:LIST_ROWS]],
233
+ }
234
+
235
+
236
+ # --------------------------------------------------------------------------- errors
237
+
238
+ def check_urls(net, urls, workers=SITEMAP_CHECK_WORKERS):
239
+ """Status of each URL (0 = unreachable)."""
240
+ def one(u):
241
+ try:
242
+ return u, net.get(u, timeout=20)[0]
243
+ except Exception: # noqa: BLE001 - a URL that cannot be fetched is a finding, not a crash
244
+ return u, 0
245
+ with concurrent.futures.ThreadPoolExecutor(max_workers=workers) as pool:
246
+ return dict(pool.map(one, urls))
247
+
248
+
249
+ def parse_error_list(raw):
250
+ """External JS-error source: a list, or {"errors": [...]}; each {message, count?, url?}."""
251
+ data = json.loads(raw)
252
+ items = data.get("errors", []) if isinstance(data, dict) else data
253
+ if not isinstance(items, list):
254
+ raise ValueError("expected a JSON list of errors")
255
+ out = []
256
+ for e in items:
257
+ if isinstance(e, dict) and e.get("message"):
258
+ out.append({"message": str(e["message"])[:200], "count": int(e.get("count") or 1),
259
+ **({"url": str(e["url"])} if e.get("url") else {})})
260
+ return sorted(out, key=lambda e: -e["count"])
261
+
262
+
263
+ def sitemap_slice(urls, n, today):
264
+ """Today's share of the sitemap: n URLs starting at a day-based offset, wrapping
265
+ around, so successive days check successive slices and the whole sitemap is
266
+ covered every ceil(len/n) days (not the same first n URLs every day).
267
+ Returns (urls, offset)."""
268
+ urls = sorted(urls)
269
+ if n <= 0 or len(urls) <= n:
270
+ return urls, 0
271
+ offset = (today.toordinal() * n) % len(urls)
272
+ return (urls + urls)[offset:offset + n], offset
273
+
274
+
275
+ def site_errors(so, net, cfg, settings, today=None):
276
+ out = {"brokenPages": [], "checked": 0, "jsErrors": [], "notes": []}
277
+ es = settings.get("errors") or {}
278
+ if es.get("checkSitemap") and cfg.get("sitemapUrl"):
279
+ all_urls = list(so.load_sitemap(net, cfg["sitemapUrl"]).keys())
280
+ urls, offset = sitemap_slice(all_urls, int(es.get("maxUrls") or SITEMAP_CHECK_DEFAULT), today or dt.date.today())
281
+ statuses = check_urls(net, urls)
282
+ out["checked"] = len(urls)
283
+ out["sitemapUrls"] = len(all_urls)
284
+ out["sitemapOffset"] = offset
285
+ out["brokenPages"] = [{"url": u, "status": s} for u, s in sorted(statuses.items()) if s != 200]
286
+ elif es.get("checkSitemap"):
287
+ out["notes"].append("no sitemapUrl in config: sitemap pages not checked")
288
+ if es.get("url"):
289
+ status, body = net.get(es["url"])
290
+ if status != 200:
291
+ out["notes"].append("errors.url answered HTTP %d" % status)
292
+ else:
293
+ out["jsErrors"] = parse_error_list(body)
294
+ elif es.get("command"):
295
+ proc = subprocess.run(es["command"], shell=True, capture_output=True, text=True, timeout=ERRORS_COMMAND_TIMEOUT_S)
296
+ if proc.returncode != 0:
297
+ out["notes"].append("errors.command exited %d: %s" % (proc.returncode, proc.stderr.strip()[:160]))
298
+ else:
299
+ out["jsErrors"] = parse_error_list(proc.stdout)
300
+ else:
301
+ out["notes"].append("no JS-error source configured (signalDigest.errors.url or .command)")
302
+ out["jsErrors"] = out["jsErrors"][:LIST_ROWS]
303
+ return out
304
+
305
+
306
+ # --------------------------------------------------------------------------- inbox / history / log
307
+
308
+ def read_json_file(path):
309
+ if not path:
310
+ return None
311
+ with open(path, encoding="utf-8") as f:
312
+ return json.load(f)
313
+
314
+
315
+ def inbox_summary(raw):
316
+ """gmail-search output (passed in by execute.sh) → count + messages."""
317
+ if raw is None:
318
+ return None
319
+ if raw.get("success") is False:
320
+ raise DigestError("inbox search failed: %s %s" % (raw.get("reason", ""), raw.get("message", "")))
321
+ messages = [{k: m.get(k) for k in ("from", "subject", "date", "snippet") if m.get(k)} for m in raw.get("messages", [])]
322
+ return {"query": raw.get("query"), "count": len(messages), "messages": messages}
323
+
324
+
325
+ def history_entries(raw):
326
+ if not raw:
327
+ return []
328
+ data = raw.get("data", raw)
329
+ return data.get("entries", []) if isinstance(data, dict) else []
330
+
331
+
332
+ def read_log(path):
333
+ if not path:
334
+ return ""
335
+ try:
336
+ with open(os.path.expanduser(path), encoding="utf-8") as f:
337
+ return f.read().lower()
338
+ except FileNotFoundError:
339
+ return ""
340
+
341
+
342
+ # --------------------------------------------------------------------------- candidates
343
+
344
+ def _cand(key, source, signal, proposal, effect, effort, score, subject, metric=None, experiment=None):
345
+ c = {"key": key, "source": source, "signal": signal, "proposal": proposal,
346
+ "expectedEffect": effect, "effort": effort, "score": round(score, 1), "subject": subject}
347
+ if metric:
348
+ c["metric"] = metric
349
+ if experiment:
350
+ # The experiment card a Do creates (#986): seo-ops metric source/measure + filters.
351
+ c["experiment"] = {k: v for k, v in experiment.items() if v}
352
+ return c
353
+
354
+
355
+ def build_candidates(signals, settings, site_url=""):
356
+ """Rule-based draft actions from the signals, best first (the lead decides)."""
357
+ out = []
358
+ t = settings["thresholds"]
359
+ ga4 = signals.get("ga4")
360
+ if isinstance(ga4, dict) and "sessions" in ga4:
361
+ ke, ss = ga4["keyEvents"], ga4["sessions"]
362
+ events = (settings.get("ga4") or {}).get("conversionEvents") or []
363
+ if ke["prev"] >= t["ga4MinPrevKeyEvents"] and ke["changePct"] is not None and ke["changePct"] <= -t["ga4DropPct"]:
364
+ out.append(_cand("ga4:key-events-drop", "ga4",
365
+ "Key events (form submissions) %d → %d (%s%%) vs the previous %d days" % (ke["prev"], ke["now"], ke["changePct"], settings["days"]),
366
+ "Find where the inquiry-form drop happens (form errors, landing pages that lost traffic) and fix the biggest cause",
367
+ "Back to ~%d key events per %d days" % (ke["prev"], settings["days"]), "M — half a day", 1000 + abs(ke["changePct"]),
368
+ "key-events-drop", "GA4 key events",
369
+ # seo-ops `conversions` = GA4 key events; one configured event narrows it.
370
+ {"source": "ga4", "measure": "conversions", "channel": "all", "event": events[0] if len(events) == 1 else None}))
371
+ if ss["prev"] >= t["ga4MinPrevSessions"] and ss["changePct"] is not None and ss["changePct"] <= -t["ga4DropPct"]:
372
+ out.append(_cand("ga4:sessions-drop", "ga4",
373
+ "Sessions %d → %d (%s%%) vs the previous %d days" % (ss["prev"], ss["now"], ss["changePct"], settings["days"]),
374
+ "Find which channel and landing pages lost the sessions and fix the top one",
375
+ "Recover ~%d sessions per %d days" % (ss["prev"] - ss["now"], settings["days"]), "M — half a day", 500 + abs(ss["changePct"]),
376
+ "sessions-drop", "GA4 sessions", {"source": "ga4", "measure": "sessions", "channel": "all"}))
377
+ gsc = signals.get("gsc")
378
+ if isinstance(gsc, dict) and "lowCtrTop3" in gsc:
379
+ days = gsc["window"]["days"]
380
+ for r in gsc["lowCtrTop3"]:
381
+ bench = BENCHMARK_CTR.get(max(1, min(5, int(round(r["position"])))), 0.06)
382
+ extra = per_week(max(0.0, (bench - r["ctr"]) * r["impressions"]), days)
383
+ page = short_path(r.get("page", ""), site_url) if r.get("page") else "the ranking page"
384
+ out.append(_cand("gsc:low-ctr:%s" % r["query"], "gsc",
385
+ "'%s' ranks #%d with %.1f%% CTR on %d impressions (%d days)" % (r["query"], round(r["position"]), 100 * r["ctr"], r["impressions"], days),
386
+ "Rewrite the title and description of %s to answer '%s'" % (page, r["query"]),
387
+ "CTR %.1f%% → ~%d%%: about +%d clicks a week" % (100 * r["ctr"], round(100 * bench), round(extra)),
388
+ "S — 1 h", extra, r["query"], "GSC CTR for '%s'" % r["query"],
389
+ {"source": "gsc", "measure": "ctr", "query": r["query"], "page": r.get("page")}))
390
+ for r in gsc["nearMiss"]:
391
+ target = BENCHMARK_CTR[NEAR_MISS_TARGET_POSITION]
392
+ extra = per_week(max(0.0, (target - r["ctr"]) * r["impressions"]), days)
393
+ page = short_path(r.get("page", ""), site_url) if r.get("page") else "the best page"
394
+ out.append(_cand("gsc:near-miss:%s" % r["query"], "gsc",
395
+ "'%s' averages position %s on %d impressions (%d days)" % (r["query"], r["position"], r["impressions"], days),
396
+ "Expand %s with a section that answers '%s' and add 2–3 internal links to it" % (page, r["query"]),
397
+ "Into the top 3: about +%d clicks a week" % round(extra),
398
+ "M — half a day", extra * 0.6, r["query"], "GSC position for '%s'" % r["query"],
399
+ {"source": "gsc", "measure": "position", "query": r["query"], "page": r.get("page")}))
400
+ covered = {r["query"] for r in gsc["lowCtrTop3"] + gsc["nearMiss"]} | {f["query"] for f in gsc["cannibalization"]}
401
+ for r in gsc["rising"]:
402
+ # Rising demand is a topic only when no page ranks for it yet: new,
403
+ # or beyond page 1, and not already an action above.
404
+ if r["query"] in covered or not (r["isNew"] or r["position"] > RISING_MAX_RANKED_POSITION):
405
+ continue
406
+ out.append(_cand("gsc:rising:%s" % r["query"], "gsc",
407
+ "'%s' impressions %d → %d%s (%d days)" % (r["query"], r["previous"], r["impressions"], " (new)" if r["isNew"] else "", days),
408
+ "Check whether a page answers '%s'; if none does, write one" % r["query"],
409
+ "Catch new demand: ~%d impressions a week" % round(per_week(r["impressions"], days)),
410
+ "M — half a day", per_week(r["impressions"], days) * 0.05, r["query"], "GSC clicks for '%s'" % r["query"],
411
+ {"source": "gsc", "measure": "clicks", "query": r["query"]}))
412
+ for f in gsc["cannibalization"]:
413
+ pages = [short_path(p["page"], site_url) for p in f["pages"]]
414
+ out.append(_cand("gsc:cannibal:%s" % f["query"], "gsc",
415
+ "'%s' is split across %d pages (%s), %d impressions" % (f["query"], len(pages), ", ".join(pages), f["impressions"]),
416
+ "Make %s the one page for '%s': differentiate the others or point them at it" % (pages[0], f["query"]),
417
+ "One stronger ranking for '%s'" % f["query"],
418
+ "M — half a day", per_week(f["impressions"], days) * 0.05, f["query"], "GSC position for '%s'" % f["query"],
419
+ {"source": "gsc", "measure": "position", "query": f["query"]}))
420
+ errors = signals.get("errors")
421
+ if isinstance(errors, dict):
422
+ for p in errors.get("brokenPages", []):
423
+ path = short_path(p["url"], site_url)
424
+ out.append(_cand("errors:broken:%s" % path, "errors",
425
+ "%s is in the sitemap but answers %s" % (path, "no response" if p["status"] == 0 else "HTTP %d" % p["status"]),
426
+ "Fix or redirect %s, and drop it from the sitemap if it is gone" % path,
427
+ "No dead page for visitors and crawlers", "S — 1 h", 300, path))
428
+ for e in errors.get("jsErrors", []):
429
+ msg = e["message"][:80]
430
+ out.append(_cand("errors:js:%s" % msg, "errors",
431
+ "JS error '%s' ×%d%s" % (msg, e["count"], " on %s" % short_path(e["url"], site_url) if e.get("url") else ""),
432
+ "Fix the JS error '%s'" % msg,
433
+ "Fewer broken sessions (×%d in the window)" % e["count"], "S — 1 h", 200 + e["count"], msg))
434
+ return sorted(out, key=lambda c: -c["score"])
435
+
436
+
437
+ def experiment_subjects(experiments, today):
438
+ """Queries / pages an experiment card already covers: planned or running, or
439
+ finished within EXPERIMENT_RECENT_DAYS. Maps subject → why."""
440
+ out = {}
441
+ cutoff = today - dt.timedelta(days=EXPERIMENT_RECENT_DAYS)
442
+ for e in experiments or []:
443
+ status = e.get("status")
444
+ if status == "cancelled":
445
+ continue
446
+ if status == "done":
447
+ try:
448
+ if dt.date.fromisoformat(str(e.get("updatedAt", ""))[:10]) < cutoff:
449
+ continue
450
+ except ValueError:
451
+ continue
452
+ metric = e.get("metric") or {}
453
+ why = "experiment %s (%s)" % (e.get("id", "?"), status)
454
+ if metric.get("query"):
455
+ out.setdefault(metric["query"].strip().lower(), why)
456
+ if metric.get("page"):
457
+ out.setdefault(short_path(metric["page"]).strip().lower(), why)
458
+ return out
459
+
460
+
461
+ def experiments_list(raw):
462
+ """GET /api/experiments output (envelope or bare list) → experiments."""
463
+ if not raw:
464
+ return []
465
+ data = raw.get("data", raw) if isinstance(raw, dict) else raw
466
+ return data if isinstance(data, list) else []
467
+
468
+
469
+ def filter_tried(candidates, history, log_text, experiments=None, today=None):
470
+ """Drop candidates whose key was Done/Skipped, whose query or page an experiment
471
+ card covers, or whose subject the experiment log mentions."""
472
+ blocked = {normalize_key(h["key"]): h for h in history if h.get("status") in ("do", "skip")}
473
+ covered = experiment_subjects(experiments, today or dt.date.today())
474
+ kept, tried = [], []
475
+ for c in candidates:
476
+ h = blocked.get(normalize_key(c["key"]))
477
+ page = (c.get("experiment") or {}).get("page")
478
+ hit = covered.get(c["subject"].strip().lower()) or (covered.get(short_path(page).strip().lower()) if page else None)
479
+ if h:
480
+ tried.append({"key": c["key"], "why": "owner chose %s on %s (%s)" % ("Do" if h["status"] == "do" else "Skip", str(h.get("at", ""))[:10], h.get("digestId", ""))})
481
+ elif hit:
482
+ tried.append({"key": c["key"], "why": hit})
483
+ elif log_text and len(c["subject"]) >= 4 and c["subject"].lower() in log_text:
484
+ tried.append({"key": c["key"], "why": "mentioned in the experiment log"})
485
+ else:
486
+ kept.append(c)
487
+ return kept, tried
488
+
489
+
490
+ # --------------------------------------------------------------------------- collect
491
+
492
+ def collect(so, cfg, net, today, history=None, inbox=None, days=None, experiments=None):
493
+ settings = digest_settings(cfg)
494
+ days = int(days or settings["days"])
495
+ settings["days"] = days
496
+ signals, sources = {}, {}
497
+
498
+ def run(name, configured, fn):
499
+ if not configured:
500
+ sources[name] = "not configured"
501
+ return
502
+ try:
503
+ signals[name] = fn()
504
+ sources[name] = "ok"
505
+ except Exception as e: # noqa: BLE001 - one bad source must not kill collect; it is reported
506
+ text = (str(e).splitlines() or [""])[0][:200] or type(e).__name__
507
+ sources[name] = "error: %s" % text
508
+
509
+ run("ga4", bool(cfg.get("ga4PropertyId")), lambda: ga4_summary(so, net, cfg, days, today, (settings.get("ga4") or {}).get("conversionEvents")))
510
+ run("gsc", bool(cfg.get("gscProperty")), lambda: gsc_opportunities(so, net, cfg, days, today))
511
+ run("inbox", inbox is not None, lambda: inbox_summary(inbox))
512
+ es = settings.get("errors") or {}
513
+ # Only a source that can examine something counts as configured.
514
+ run("errors", bool((es.get("checkSitemap") and cfg.get("sitemapUrl")) or es.get("url") or es.get("command")),
515
+ lambda: site_errors(so, net, cfg, settings, today))
516
+ entries = history_entries(history)
517
+ candidates, tried = filter_tried(build_candidates(signals, settings, cfg.get("siteUrl", "")), entries,
518
+ read_log(settings.get("experimentLog")), experiments_list(experiments), today)
519
+ for c in candidates:
520
+ c.pop("subject", None)
521
+ pending = [{"key": h["key"], "digestId": h.get("digestId")} for h in entries if h.get("status") == "open"]
522
+ return {
523
+ "site": settings["site"],
524
+ "project": settings.get("project"),
525
+ "date": str(today),
526
+ "days": days,
527
+ "sources": sources,
528
+ **signals,
529
+ "alreadyTried": tried,
530
+ "pendingOnOwner": pending,
531
+ "candidates": candidates[:MAX_CANDIDATES],
532
+ "next": "Pick 3-5 actions (the candidates, rewritten, or your own from the signals, e.g. repeated inbox questions), "
533
+ "best first, each with key/source/signal/proposal/expectedEffect/effort (+ metric, + experiment so that "
534
+ "Do creates an experiment card), and run: "
535
+ "execute.sh propose --config <config> --actions <file.json>",
536
+ }
537
+
538
+
539
+ def main(argv=None, net=None, today=None, so=None):
540
+ parser = argparse.ArgumentParser(prog="signal_digest.py", description="Daily signal digest for one site.")
541
+ sub = parser.add_subparsers(dest="command", required=True)
542
+ c = sub.add_parser("collect", help="gather the signals and draft actions (JSON)")
543
+ c.add_argument("--config", required=True)
544
+ c.add_argument("--days", type=int)
545
+ c.add_argument("--history", help="file with GET /api/signal-digests/history output")
546
+ c.add_argument("--inbox", help="file with gmail-search output")
547
+ c.add_argument("--experiments", help="file with GET /api/experiments output")
548
+ args = parser.parse_args(argv)
549
+ try:
550
+ so = so or load_seo_ops()
551
+ cfg = so.load_config(args.config)
552
+ net = net or so.Net(cfg)
553
+ result = collect(so, cfg, net, today or dt.date.today(), read_json_file(args.history), read_json_file(args.inbox), args.days,
554
+ read_json_file(args.experiments))
555
+ except DigestError as e:
556
+ print("signal-digest: %s" % e, file=sys.stderr)
557
+ return EXIT_SETUP
558
+ except Exception as e: # noqa: BLE001 - seo_ops errors carry their own message
559
+ if so is not None and isinstance(e, getattr(so, "SeoOpsError", ())):
560
+ print("signal-digest: %s" % e, file=sys.stderr)
561
+ return EXIT_SETUP
562
+ raise
563
+ print(json.dumps(result, ensure_ascii=False, indent=1))
564
+ if not any(v == "ok" for v in result["sources"].values()):
565
+ print("signal-digest: no source could be examined (%s). Nothing to propose from."
566
+ % ", ".join("%s: %s" % kv for kv in result["sources"].items()), file=sys.stderr)
567
+ return EXIT_EMPTY
568
+ return EXIT_OK
569
+
570
+
571
+ if __name__ == "__main__":
572
+ sys.exit(main())