crewly 1.20.203 → 1.20.205

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 (316) hide show
  1. package/config/skills/_common/lib.sh +4 -3
  2. package/config/skills/agent/core/project-tickets/SKILL.md +13 -1
  3. package/config/skills/agent/core/project-tickets/execute.sh +20 -6
  4. package/config/skills/agent/core/project-tickets/execute.test.sh +8 -2
  5. package/config/skills/agent/core/reply/SKILL.md +1 -0
  6. package/config/skills/agent/core/reply/execute.sh +7 -1
  7. package/config/skills/agent/core/reply-channel/SKILL.md +4 -0
  8. package/config/skills/agent/core/reply-channel/execute.sh +12 -1
  9. package/dist/backend/backend/src/constants.d.ts +124 -0
  10. package/dist/backend/backend/src/constants.d.ts.map +1 -1
  11. package/dist/backend/backend/src/constants.js +130 -0
  12. package/dist/backend/backend/src/constants.js.map +1 -1
  13. package/dist/backend/backend/src/controllers/chat/agent-reply.controller.d.ts.map +1 -1
  14. package/dist/backend/backend/src/controllers/chat/agent-reply.controller.js +1 -0
  15. package/dist/backend/backend/src/controllers/chat/agent-reply.controller.js.map +1 -1
  16. package/dist/backend/backend/src/controllers/chat/chat.controller.d.ts.map +1 -1
  17. package/dist/backend/backend/src/controllers/chat/chat.controller.js +1 -0
  18. package/dist/backend/backend/src/controllers/chat/chat.controller.js.map +1 -1
  19. package/dist/backend/backend/src/controllers/chat-v2/chat-v2.controller.d.ts.map +1 -1
  20. package/dist/backend/backend/src/controllers/chat-v2/chat-v2.controller.js +50 -0
  21. package/dist/backend/backend/src/controllers/chat-v2/chat-v2.controller.js.map +1 -1
  22. package/dist/backend/backend/src/controllers/monitoring/terminal.controller.d.ts +6 -0
  23. package/dist/backend/backend/src/controllers/monitoring/terminal.controller.d.ts.map +1 -1
  24. package/dist/backend/backend/src/controllers/monitoring/terminal.controller.js +2 -1
  25. package/dist/backend/backend/src/controllers/monitoring/terminal.controller.js.map +1 -1
  26. package/dist/backend/backend/src/controllers/project-tickets/project-tickets.controller.d.ts +1 -1
  27. package/dist/backend/backend/src/controllers/project-tickets/project-tickets.controller.d.ts.map +1 -1
  28. package/dist/backend/backend/src/controllers/project-tickets/project-tickets.controller.js +9 -1
  29. package/dist/backend/backend/src/controllers/project-tickets/project-tickets.controller.js.map +1 -1
  30. package/dist/backend/backend/src/controllers/project-tickets/project-tickets.routes.d.ts +1 -1
  31. package/dist/backend/backend/src/controllers/project-tickets/project-tickets.routes.js +1 -1
  32. package/dist/backend/backend/src/controllers/settings/role.controller.d.ts.map +1 -1
  33. package/dist/backend/backend/src/controllers/settings/role.controller.js +21 -7
  34. package/dist/backend/backend/src/controllers/settings/role.controller.js.map +1 -1
  35. package/dist/backend/backend/src/controllers/settings/settings.controller.d.ts.map +1 -1
  36. package/dist/backend/backend/src/controllers/settings/settings.controller.js +26 -20
  37. package/dist/backend/backend/src/controllers/settings/settings.controller.js.map +1 -1
  38. package/dist/backend/backend/src/controllers/skill/skill.controller.d.ts +13 -0
  39. package/dist/backend/backend/src/controllers/skill/skill.controller.d.ts.map +1 -1
  40. package/dist/backend/backend/src/controllers/skill/skill.controller.js +21 -0
  41. package/dist/backend/backend/src/controllers/skill/skill.controller.js.map +1 -1
  42. package/dist/backend/backend/src/controllers/system/system-control.controller.d.ts +11 -1
  43. package/dist/backend/backend/src/controllers/system/system-control.controller.d.ts.map +1 -1
  44. package/dist/backend/backend/src/controllers/system/system-control.controller.js +36 -2
  45. package/dist/backend/backend/src/controllers/system/system-control.controller.js.map +1 -1
  46. package/dist/backend/backend/src/index.d.ts +9 -0
  47. package/dist/backend/backend/src/index.d.ts.map +1 -1
  48. package/dist/backend/backend/src/index.js +37 -1
  49. package/dist/backend/backend/src/index.js.map +1 -1
  50. package/dist/backend/backend/src/middleware/agent-origin.middleware.d.ts +3 -2
  51. package/dist/backend/backend/src/middleware/agent-origin.middleware.d.ts.map +1 -1
  52. package/dist/backend/backend/src/middleware/agent-origin.middleware.js +5 -3
  53. package/dist/backend/backend/src/middleware/agent-origin.middleware.js.map +1 -1
  54. package/dist/backend/backend/src/middleware/caller-identity.middleware.d.ts +36 -0
  55. package/dist/backend/backend/src/middleware/caller-identity.middleware.d.ts.map +1 -1
  56. package/dist/backend/backend/src/middleware/caller-identity.middleware.js +97 -1
  57. package/dist/backend/backend/src/middleware/caller-identity.middleware.js.map +1 -1
  58. package/dist/backend/backend/src/routes/modules/terminal.routes.d.ts +4 -0
  59. package/dist/backend/backend/src/routes/modules/terminal.routes.d.ts.map +1 -1
  60. package/dist/backend/backend/src/routes/modules/terminal.routes.js +19 -5
  61. package/dist/backend/backend/src/routes/modules/terminal.routes.js.map +1 -1
  62. package/dist/backend/backend/src/scripts/input-guard-classify.d.ts +44 -0
  63. package/dist/backend/backend/src/scripts/input-guard-classify.d.ts.map +1 -0
  64. package/dist/backend/backend/src/scripts/input-guard-classify.js +116 -0
  65. package/dist/backend/backend/src/scripts/input-guard-classify.js.map +1 -0
  66. package/dist/backend/backend/src/services/agent/crewly-agent/crewly-agent-external-runtime.service.d.ts +8 -0
  67. package/dist/backend/backend/src/services/agent/crewly-agent/crewly-agent-external-runtime.service.d.ts.map +1 -1
  68. package/dist/backend/backend/src/services/agent/crewly-agent/crewly-agent-external-runtime.service.js +10 -0
  69. package/dist/backend/backend/src/services/agent/crewly-agent/crewly-agent-external-runtime.service.js.map +1 -1
  70. package/dist/backend/backend/src/services/agent/crewly-agent/in-process-runtime-registry.d.ts +8 -0
  71. package/dist/backend/backend/src/services/agent/crewly-agent/in-process-runtime-registry.d.ts.map +1 -1
  72. package/dist/backend/backend/src/services/agent/crewly-agent/in-process-runtime-registry.js +21 -0
  73. package/dist/backend/backend/src/services/agent/crewly-agent/in-process-runtime-registry.js.map +1 -1
  74. package/dist/backend/backend/src/services/agent/runtime-exit-monitor.service.d.ts.map +1 -1
  75. package/dist/backend/backend/src/services/agent/runtime-exit-monitor.service.js +13 -27
  76. package/dist/backend/backend/src/services/agent/runtime-exit-monitor.service.js.map +1 -1
  77. package/dist/backend/backend/src/services/chat-v2/chat-v2.dispatcher.service.d.ts +117 -0
  78. package/dist/backend/backend/src/services/chat-v2/chat-v2.dispatcher.service.d.ts.map +1 -1
  79. package/dist/backend/backend/src/services/chat-v2/chat-v2.dispatcher.service.js +165 -9
  80. package/dist/backend/backend/src/services/chat-v2/chat-v2.dispatcher.service.js.map +1 -1
  81. package/dist/backend/backend/src/services/chat-v2/room-context-backlog.d.ts +93 -0
  82. package/dist/backend/backend/src/services/chat-v2/room-context-backlog.d.ts.map +1 -0
  83. package/dist/backend/backend/src/services/chat-v2/room-context-backlog.js +138 -0
  84. package/dist/backend/backend/src/services/chat-v2/room-context-backlog.js.map +1 -0
  85. package/dist/backend/backend/src/services/decisions/decision-card.d.ts.map +1 -1
  86. package/dist/backend/backend/src/services/decisions/decision-card.js +5 -1
  87. package/dist/backend/backend/src/services/decisions/decision-card.js.map +1 -1
  88. package/dist/backend/backend/src/services/decisions/decision.service.d.ts +26 -1
  89. package/dist/backend/backend/src/services/decisions/decision.service.d.ts.map +1 -1
  90. package/dist/backend/backend/src/services/decisions/decision.service.js +83 -5
  91. package/dist/backend/backend/src/services/decisions/decision.service.js.map +1 -1
  92. package/dist/backend/backend/src/services/messaging/forced-delivery.d.ts +75 -0
  93. package/dist/backend/backend/src/services/messaging/forced-delivery.d.ts.map +1 -0
  94. package/dist/backend/backend/src/services/messaging/forced-delivery.js +87 -0
  95. package/dist/backend/backend/src/services/messaging/forced-delivery.js.map +1 -0
  96. package/dist/backend/backend/src/services/messaging/sub-agent-message-queue.service.d.ts +21 -0
  97. package/dist/backend/backend/src/services/messaging/sub-agent-message-queue.service.d.ts.map +1 -1
  98. package/dist/backend/backend/src/services/messaging/sub-agent-message-queue.service.js +48 -3
  99. package/dist/backend/backend/src/services/messaging/sub-agent-message-queue.service.js.map +1 -1
  100. package/dist/backend/backend/src/services/monitoring/liveness-monitor.service.d.ts +27 -1
  101. package/dist/backend/backend/src/services/monitoring/liveness-monitor.service.d.ts.map +1 -1
  102. package/dist/backend/backend/src/services/monitoring/liveness-monitor.service.js +51 -2
  103. package/dist/backend/backend/src/services/monitoring/liveness-monitor.service.js.map +1 -1
  104. package/dist/backend/backend/src/services/orc/orc-chat-owner-mirror.d.ts +51 -4
  105. package/dist/backend/backend/src/services/orc/orc-chat-owner-mirror.d.ts.map +1 -1
  106. package/dist/backend/backend/src/services/orc/orc-chat-owner-mirror.js +83 -6
  107. package/dist/backend/backend/src/services/orc/orc-chat-owner-mirror.js.map +1 -1
  108. package/dist/backend/backend/src/services/orc/reply-destination.wiring.d.ts +16 -0
  109. package/dist/backend/backend/src/services/orc/reply-destination.wiring.d.ts.map +1 -1
  110. package/dist/backend/backend/src/services/orc/reply-destination.wiring.js +22 -2
  111. package/dist/backend/backend/src/services/orc/reply-destination.wiring.js.map +1 -1
  112. package/dist/backend/backend/src/services/project-tickets/ticket-autopilot-decision.d.ts +130 -4
  113. package/dist/backend/backend/src/services/project-tickets/ticket-autopilot-decision.d.ts.map +1 -1
  114. package/dist/backend/backend/src/services/project-tickets/ticket-autopilot-decision.js +115 -3
  115. package/dist/backend/backend/src/services/project-tickets/ticket-autopilot-decision.js.map +1 -1
  116. package/dist/backend/backend/src/services/project-tickets/ticket-autopilot-goal.d.ts +122 -0
  117. package/dist/backend/backend/src/services/project-tickets/ticket-autopilot-goal.d.ts.map +1 -0
  118. package/dist/backend/backend/src/services/project-tickets/ticket-autopilot-goal.js +274 -0
  119. package/dist/backend/backend/src/services/project-tickets/ticket-autopilot-goal.js.map +1 -0
  120. package/dist/backend/backend/src/services/project-tickets/ticket-autopilot-messages.d.ts +34 -2
  121. package/dist/backend/backend/src/services/project-tickets/ticket-autopilot-messages.d.ts.map +1 -1
  122. package/dist/backend/backend/src/services/project-tickets/ticket-autopilot-messages.js +59 -2
  123. package/dist/backend/backend/src/services/project-tickets/ticket-autopilot-messages.js.map +1 -1
  124. package/dist/backend/backend/src/services/project-tickets/ticket-autopilot-retro.js +1 -1
  125. package/dist/backend/backend/src/services/project-tickets/ticket-autopilot-retro.js.map +1 -1
  126. package/dist/backend/backend/src/services/project-tickets/ticket-autopilot-stats.d.ts +6 -1
  127. package/dist/backend/backend/src/services/project-tickets/ticket-autopilot-stats.d.ts.map +1 -1
  128. package/dist/backend/backend/src/services/project-tickets/ticket-autopilot-stats.js +9 -1
  129. package/dist/backend/backend/src/services/project-tickets/ticket-autopilot-stats.js.map +1 -1
  130. package/dist/backend/backend/src/services/project-tickets/ticket-autopilot-trace.d.ts +13 -3
  131. package/dist/backend/backend/src/services/project-tickets/ticket-autopilot-trace.d.ts.map +1 -1
  132. package/dist/backend/backend/src/services/project-tickets/ticket-autopilot-trace.js +28 -2
  133. package/dist/backend/backend/src/services/project-tickets/ticket-autopilot-trace.js.map +1 -1
  134. package/dist/backend/backend/src/services/project-tickets/ticket-autopilot.service.d.ts +92 -7
  135. package/dist/backend/backend/src/services/project-tickets/ticket-autopilot.service.d.ts.map +1 -1
  136. package/dist/backend/backend/src/services/project-tickets/ticket-autopilot.service.js +316 -41
  137. package/dist/backend/backend/src/services/project-tickets/ticket-autopilot.service.js.map +1 -1
  138. package/dist/backend/backend/src/services/restart/in-flight-turn-tracker.service.d.ts +9 -0
  139. package/dist/backend/backend/src/services/restart/in-flight-turn-tracker.service.d.ts.map +1 -1
  140. package/dist/backend/backend/src/services/restart/in-flight-turn-tracker.service.js +11 -0
  141. package/dist/backend/backend/src/services/restart/in-flight-turn-tracker.service.js.map +1 -1
  142. package/dist/backend/backend/src/services/settings/api-key-access.service.d.ts +126 -0
  143. package/dist/backend/backend/src/services/settings/api-key-access.service.d.ts.map +1 -0
  144. package/dist/backend/backend/src/services/settings/api-key-access.service.js +223 -0
  145. package/dist/backend/backend/src/services/settings/api-key-access.service.js.map +1 -0
  146. package/dist/backend/backend/src/services/skill/skill-executor.service.d.ts.map +1 -1
  147. package/dist/backend/backend/src/services/skill/skill-executor.service.js +17 -0
  148. package/dist/backend/backend/src/services/skill/skill-executor.service.js.map +1 -1
  149. package/dist/backend/backend/src/services/slack/room-responder.d.ts +144 -0
  150. package/dist/backend/backend/src/services/slack/room-responder.d.ts.map +1 -0
  151. package/dist/backend/backend/src/services/slack/room-responder.js +236 -0
  152. package/dist/backend/backend/src/services/slack/room-responder.js.map +1 -0
  153. package/dist/backend/backend/src/services/slack/slack-initializer.d.ts.map +1 -1
  154. package/dist/backend/backend/src/services/slack/slack-initializer.js +36 -2
  155. package/dist/backend/backend/src/services/slack/slack-initializer.js.map +1 -1
  156. package/dist/backend/backend/src/services/slack/slack-orchestrator-bridge.d.ts.map +1 -1
  157. package/dist/backend/backend/src/services/slack/slack-orchestrator-bridge.js +29 -8
  158. package/dist/backend/backend/src/services/slack/slack-orchestrator-bridge.js.map +1 -1
  159. package/dist/backend/backend/src/services/slack/slack-team-channel.service.d.ts +107 -2
  160. package/dist/backend/backend/src/services/slack/slack-team-channel.service.d.ts.map +1 -1
  161. package/dist/backend/backend/src/services/slack/slack-team-channel.service.js +403 -13
  162. package/dist/backend/backend/src/services/slack/slack-team-channel.service.js.map +1 -1
  163. package/dist/backend/backend/src/services/slack/slack-thread-context.service.d.ts +27 -0
  164. package/dist/backend/backend/src/services/slack/slack-thread-context.service.d.ts.map +1 -1
  165. package/dist/backend/backend/src/services/slack/slack-thread-context.service.js +52 -0
  166. package/dist/backend/backend/src/services/slack/slack-thread-context.service.js.map +1 -1
  167. package/dist/backend/backend/src/services/slack/slack-typing-placeholder.service.d.ts +9 -0
  168. package/dist/backend/backend/src/services/slack/slack-typing-placeholder.service.d.ts.map +1 -1
  169. package/dist/backend/backend/src/services/slack/slack-typing-placeholder.service.js +20 -0
  170. package/dist/backend/backend/src/services/slack/slack-typing-placeholder.service.js.map +1 -1
  171. package/dist/backend/backend/src/services/system/auto-update.service.d.ts +24 -0
  172. package/dist/backend/backend/src/services/system/auto-update.service.d.ts.map +1 -1
  173. package/dist/backend/backend/src/services/system/auto-update.service.js +78 -8
  174. package/dist/backend/backend/src/services/system/auto-update.service.js.map +1 -1
  175. package/dist/backend/backend/src/services/system/auto-update.utils.d.ts +1 -1
  176. package/dist/backend/backend/src/services/system/auto-update.utils.d.ts.map +1 -1
  177. package/dist/backend/backend/src/services/system/auto-update.utils.js.map +1 -1
  178. package/dist/backend/backend/src/services/system/input-guard-release-check.d.ts +162 -0
  179. package/dist/backend/backend/src/services/system/input-guard-release-check.d.ts.map +1 -0
  180. package/dist/backend/backend/src/services/system/input-guard-release-check.js +264 -0
  181. package/dist/backend/backend/src/services/system/input-guard-release-check.js.map +1 -0
  182. package/dist/backend/backend/src/services/system/system-control.service.d.ts +36 -0
  183. package/dist/backend/backend/src/services/system/system-control.service.d.ts.map +1 -1
  184. package/dist/backend/backend/src/services/system/system-control.service.js +109 -10
  185. package/dist/backend/backend/src/services/system/system-control.service.js.map +1 -1
  186. package/dist/backend/backend/src/services/v3/ticket-channel-hooks.d.ts +13 -1
  187. package/dist/backend/backend/src/services/v3/ticket-channel-hooks.d.ts.map +1 -1
  188. package/dist/backend/backend/src/services/v3/ticket-channel-hooks.js +36 -3
  189. package/dist/backend/backend/src/services/v3/ticket-channel-hooks.js.map +1 -1
  190. package/dist/backend/backend/src/services/v3/workitem-dispatch.subscriber.d.ts +54 -3
  191. package/dist/backend/backend/src/services/v3/workitem-dispatch.subscriber.d.ts.map +1 -1
  192. package/dist/backend/backend/src/services/v3/workitem-dispatch.subscriber.js +117 -9
  193. package/dist/backend/backend/src/services/v3/workitem-dispatch.subscriber.js.map +1 -1
  194. package/dist/backend/backend/src/types/decision.types.d.ts +7 -0
  195. package/dist/backend/backend/src/types/decision.types.d.ts.map +1 -1
  196. package/dist/backend/backend/src/types/skill.types.d.ts +16 -0
  197. package/dist/backend/backend/src/types/skill.types.d.ts.map +1 -1
  198. package/dist/backend/backend/src/types/skill.types.js.map +1 -1
  199. package/dist/backend/backend/src/types/ticket-autopilot.types.d.ts +21 -0
  200. package/dist/backend/backend/src/types/ticket-autopilot.types.d.ts.map +1 -1
  201. package/dist/backend/backend/src/types/ticket-autopilot.types.js +48 -0
  202. package/dist/backend/backend/src/types/ticket-autopilot.types.js.map +1 -1
  203. package/dist/backend/backend/src/types/v2/work-item.types.d.ts +1 -1
  204. package/dist/backend/backend/src/types/v2/work-item.types.d.ts.map +1 -1
  205. package/dist/backend/backend/src/types/v2/work-item.types.js +1 -0
  206. package/dist/backend/backend/src/types/v2/work-item.types.js.map +1 -1
  207. package/dist/backend/build-info.json +2 -2
  208. package/dist/cli/backend/src/constants.d.ts +124 -0
  209. package/dist/cli/backend/src/constants.d.ts.map +1 -1
  210. package/dist/cli/backend/src/constants.js +130 -0
  211. package/dist/cli/backend/src/constants.js.map +1 -1
  212. package/dist/cli/backend/src/scripts/input-guard-classify.d.ts +44 -0
  213. package/dist/cli/backend/src/scripts/input-guard-classify.d.ts.map +1 -0
  214. package/dist/cli/backend/src/scripts/input-guard-classify.js +116 -0
  215. package/dist/cli/backend/src/scripts/input-guard-classify.js.map +1 -0
  216. package/dist/cli/backend/src/services/agent/crewly-agent/crewly-agent-external-runtime.service.d.ts +8 -0
  217. package/dist/cli/backend/src/services/agent/crewly-agent/crewly-agent-external-runtime.service.d.ts.map +1 -1
  218. package/dist/cli/backend/src/services/agent/crewly-agent/crewly-agent-external-runtime.service.js +10 -0
  219. package/dist/cli/backend/src/services/agent/crewly-agent/crewly-agent-external-runtime.service.js.map +1 -1
  220. package/dist/cli/backend/src/services/agent/crewly-agent/in-process-runtime-registry.d.ts +8 -0
  221. package/dist/cli/backend/src/services/agent/crewly-agent/in-process-runtime-registry.d.ts.map +1 -1
  222. package/dist/cli/backend/src/services/agent/crewly-agent/in-process-runtime-registry.js +21 -0
  223. package/dist/cli/backend/src/services/agent/crewly-agent/in-process-runtime-registry.js.map +1 -1
  224. package/dist/cli/backend/src/services/agent/runtime-exit-monitor.service.d.ts.map +1 -1
  225. package/dist/cli/backend/src/services/agent/runtime-exit-monitor.service.js +13 -27
  226. package/dist/cli/backend/src/services/agent/runtime-exit-monitor.service.js.map +1 -1
  227. package/dist/cli/backend/src/services/chat-v2/chat-v2.dispatcher.service.d.ts +117 -0
  228. package/dist/cli/backend/src/services/chat-v2/chat-v2.dispatcher.service.d.ts.map +1 -1
  229. package/dist/cli/backend/src/services/chat-v2/chat-v2.dispatcher.service.js +165 -9
  230. package/dist/cli/backend/src/services/chat-v2/chat-v2.dispatcher.service.js.map +1 -1
  231. package/dist/cli/backend/src/services/chat-v2/room-context-backlog.d.ts +93 -0
  232. package/dist/cli/backend/src/services/chat-v2/room-context-backlog.d.ts.map +1 -0
  233. package/dist/cli/backend/src/services/chat-v2/room-context-backlog.js +138 -0
  234. package/dist/cli/backend/src/services/chat-v2/room-context-backlog.js.map +1 -0
  235. package/dist/cli/backend/src/services/decisions/decision-card.d.ts.map +1 -1
  236. package/dist/cli/backend/src/services/decisions/decision-card.js +5 -1
  237. package/dist/cli/backend/src/services/decisions/decision-card.js.map +1 -1
  238. package/dist/cli/backend/src/services/decisions/decision.service.d.ts +26 -1
  239. package/dist/cli/backend/src/services/decisions/decision.service.d.ts.map +1 -1
  240. package/dist/cli/backend/src/services/decisions/decision.service.js +83 -5
  241. package/dist/cli/backend/src/services/decisions/decision.service.js.map +1 -1
  242. package/dist/cli/backend/src/services/messaging/drain-queued-delivery.d.ts +59 -0
  243. package/dist/cli/backend/src/services/messaging/drain-queued-delivery.d.ts.map +1 -0
  244. package/dist/cli/backend/src/services/messaging/drain-queued-delivery.js +70 -0
  245. package/dist/cli/backend/src/services/messaging/drain-queued-delivery.js.map +1 -0
  246. package/dist/cli/backend/src/services/messaging/forced-delivery.d.ts +75 -0
  247. package/dist/cli/backend/src/services/messaging/forced-delivery.d.ts.map +1 -0
  248. package/dist/cli/backend/src/services/messaging/forced-delivery.js +87 -0
  249. package/dist/cli/backend/src/services/messaging/forced-delivery.js.map +1 -0
  250. package/dist/cli/backend/src/services/messaging/spend-capped-delivery.d.ts +54 -0
  251. package/dist/cli/backend/src/services/messaging/spend-capped-delivery.d.ts.map +1 -0
  252. package/dist/cli/backend/src/services/messaging/spend-capped-delivery.js +65 -0
  253. package/dist/cli/backend/src/services/messaging/spend-capped-delivery.js.map +1 -0
  254. package/dist/cli/backend/src/services/messaging/sub-agent-message-queue.service.d.ts +21 -0
  255. package/dist/cli/backend/src/services/messaging/sub-agent-message-queue.service.d.ts.map +1 -1
  256. package/dist/cli/backend/src/services/messaging/sub-agent-message-queue.service.js +48 -3
  257. package/dist/cli/backend/src/services/messaging/sub-agent-message-queue.service.js.map +1 -1
  258. package/dist/cli/backend/src/services/restart/in-flight-turn-tracker.service.d.ts +9 -0
  259. package/dist/cli/backend/src/services/restart/in-flight-turn-tracker.service.d.ts.map +1 -1
  260. package/dist/cli/backend/src/services/restart/in-flight-turn-tracker.service.js +11 -0
  261. package/dist/cli/backend/src/services/restart/in-flight-turn-tracker.service.js.map +1 -1
  262. package/dist/cli/backend/src/services/skill/skill-executor.service.d.ts.map +1 -1
  263. package/dist/cli/backend/src/services/skill/skill-executor.service.js +17 -0
  264. package/dist/cli/backend/src/services/skill/skill-executor.service.js.map +1 -1
  265. package/dist/cli/backend/src/services/slack/room-responder.d.ts +144 -0
  266. package/dist/cli/backend/src/services/slack/room-responder.d.ts.map +1 -0
  267. package/dist/cli/backend/src/services/slack/room-responder.js +236 -0
  268. package/dist/cli/backend/src/services/slack/room-responder.js.map +1 -0
  269. package/dist/cli/backend/src/services/slack/slack-orchestrator-bridge.d.ts.map +1 -1
  270. package/dist/cli/backend/src/services/slack/slack-orchestrator-bridge.js +29 -8
  271. package/dist/cli/backend/src/services/slack/slack-orchestrator-bridge.js.map +1 -1
  272. package/dist/cli/backend/src/services/slack/slack-team-channel.service.d.ts +107 -2
  273. package/dist/cli/backend/src/services/slack/slack-team-channel.service.d.ts.map +1 -1
  274. package/dist/cli/backend/src/services/slack/slack-team-channel.service.js +403 -13
  275. package/dist/cli/backend/src/services/slack/slack-team-channel.service.js.map +1 -1
  276. package/dist/cli/backend/src/services/slack/slack-thread-context.service.d.ts +27 -0
  277. package/dist/cli/backend/src/services/slack/slack-thread-context.service.d.ts.map +1 -1
  278. package/dist/cli/backend/src/services/slack/slack-thread-context.service.js +52 -0
  279. package/dist/cli/backend/src/services/slack/slack-thread-context.service.js.map +1 -1
  280. package/dist/cli/backend/src/services/slack/slack-typing-placeholder.service.d.ts +9 -0
  281. package/dist/cli/backend/src/services/slack/slack-typing-placeholder.service.d.ts.map +1 -1
  282. package/dist/cli/backend/src/services/slack/slack-typing-placeholder.service.js +20 -0
  283. package/dist/cli/backend/src/services/slack/slack-typing-placeholder.service.js.map +1 -1
  284. package/dist/cli/backend/src/services/system/auto-update.utils.d.ts +1 -1
  285. package/dist/cli/backend/src/services/system/auto-update.utils.d.ts.map +1 -1
  286. package/dist/cli/backend/src/services/system/auto-update.utils.js.map +1 -1
  287. package/dist/cli/backend/src/services/system/input-guard-release-check.d.ts +162 -0
  288. package/dist/cli/backend/src/services/system/input-guard-release-check.d.ts.map +1 -0
  289. package/dist/cli/backend/src/services/system/input-guard-release-check.js +264 -0
  290. package/dist/cli/backend/src/services/system/input-guard-release-check.js.map +1 -0
  291. package/dist/cli/backend/src/services/v3/ticket-channel-hooks.d.ts +13 -1
  292. package/dist/cli/backend/src/services/v3/ticket-channel-hooks.d.ts.map +1 -1
  293. package/dist/cli/backend/src/services/v3/ticket-channel-hooks.js +36 -3
  294. package/dist/cli/backend/src/services/v3/ticket-channel-hooks.js.map +1 -1
  295. package/dist/cli/backend/src/types/decision.types.d.ts +7 -0
  296. package/dist/cli/backend/src/types/decision.types.d.ts.map +1 -1
  297. package/dist/cli/backend/src/types/skill.types.d.ts +16 -0
  298. package/dist/cli/backend/src/types/skill.types.d.ts.map +1 -1
  299. package/dist/cli/backend/src/types/skill.types.js.map +1 -1
  300. package/dist/cli/backend/src/types/ticket-autopilot.types.d.ts +21 -0
  301. package/dist/cli/backend/src/types/ticket-autopilot.types.d.ts.map +1 -1
  302. package/dist/cli/backend/src/types/ticket-autopilot.types.js +48 -0
  303. package/dist/cli/backend/src/types/ticket-autopilot.types.js.map +1 -1
  304. package/dist/cli/backend/src/types/v2/work-item.types.d.ts +1 -1
  305. package/dist/cli/backend/src/types/v2/work-item.types.d.ts.map +1 -1
  306. package/dist/cli/backend/src/types/v2/work-item.types.js +1 -0
  307. package/dist/cli/backend/src/types/v2/work-item.types.js.map +1 -1
  308. package/dist/cli/cli/src/commands/doctor.d.ts +20 -0
  309. package/dist/cli/cli/src/commands/doctor.d.ts.map +1 -1
  310. package/dist/cli/cli/src/commands/doctor.js +49 -0
  311. package/dist/cli/cli/src/commands/doctor.js.map +1 -1
  312. package/dist/cli/cli/src/index.js +9 -2
  313. package/dist/cli/cli/src/index.js.map +1 -1
  314. package/frontend/dist/assets/{index-63a33dbf.js → index-f64b333a.js} +258 -258
  315. package/frontend/dist/index.html +1 -1
  316. package/package.json +2 -1
@@ -0,0 +1,144 @@
1
+ /**
2
+ * One responder per owner message in Slack rooms — the pure parts
3
+ * (specs/2026-10-03-one-responder-per-message.md).
4
+ *
5
+ * - {@link threadOwnerFromSlack}: who owns a Slack thread, read from the
6
+ * thread itself, so every machine names the same agent.
7
+ * - {@link findPriorRoomAnswer} / {@link heldReplyMessage}: the reply gate —
8
+ * a colleague already answered the owner's latest message in this thread.
9
+ *
10
+ * Incident (2026-10-03, #content-team): the owner's un-@'d reply to Atlas's
11
+ * D-92 reminder resolved the card (delivered to Atlas) and was also
12
+ * broadcast to the room; Atlas answered, and Ella answered the same thing
13
+ * six minutes later.
14
+ *
15
+ * @module services/slack/room-responder
16
+ */
17
+ import type { SlackContextMessage, SlackThreadContext } from '../../types/slack.types.js';
18
+ import type { ChatMessageDTO } from '../chat-v2/types.js';
19
+ /** An agent of the room, on this machine or another. */
20
+ export interface RoomAgentRef {
21
+ /** Session name (as this machine knows it; Cloud's for a remote agent) */
22
+ session: string;
23
+ /** Display name */
24
+ name: string;
25
+ /** Whether it runs on this machine */
26
+ local: boolean;
27
+ }
28
+ /** What {@link buildRoomAgentDirectory} needs. */
29
+ export interface RoomAgentDirectoryInput {
30
+ /** This machine's room members, with their own bot user id when installed */
31
+ local: ReadonlyArray<{
32
+ session: string;
33
+ name: string;
34
+ botUserId?: string | null;
35
+ }>;
36
+ /** Room members on other machines (Cloud's room roster minus this machine) */
37
+ remote: ReadonlyArray<{
38
+ session: string;
39
+ name: string;
40
+ }>;
41
+ }
42
+ /** Maps Slack authors and names to room agents. */
43
+ export interface RoomAgentDirectory {
44
+ /** The agent that wrote a Slack message, or null (a person, an unknown bot, or an unclear name) */
45
+ authorOf(m: SlackContextMessage): RoomAgentRef | null;
46
+ }
47
+ /**
48
+ * Whether two display names name the same agent: equal (case-insensitive),
49
+ * or one is the other plus a team suffix — "Ella" / "Ella (Crewly Marketing)".
50
+ *
51
+ * @param a - A name
52
+ * @param b - Another name
53
+ * @returns True when they match
54
+ */
55
+ export declare function sameAgentName(a: string, b: string): boolean;
56
+ /**
57
+ * Build the directory every machine uses to read the same thread the same way.
58
+ *
59
+ * A post by a local agent's own bot is that agent. Any other bot post is
60
+ * matched by name against the remote members — and against local members
61
+ * when it was posted with a username override (an agent with no app of its
62
+ * own). A name that matches several agents is unclear and maps to nobody.
63
+ *
64
+ * @param input - Local and remote room members
65
+ * @returns The directory
66
+ */
67
+ export declare function buildRoomAgentDirectory(input: RoomAgentDirectoryInput): RoomAgentDirectory;
68
+ /**
69
+ * Whether a Slack post is a decision card or a card reminder — the post an
70
+ * owner's reply in that thread answers. Cards carry `Decision D-n` (or
71
+ * `[D-n]` when titled by a ticket); the reminder says "Still waiting on you".
72
+ *
73
+ * @param text - Normalised Slack text
74
+ * @returns True for a card or reminder
75
+ */
76
+ export declare function isDecisionCardText(text: string): boolean;
77
+ /** Who owns a Slack thread, and by which rule. */
78
+ export interface SlackThreadOwner {
79
+ agent: RoomAgentRef;
80
+ /**
81
+ * `card`: a decision card / reminder went up since a person last spoke —
82
+ * the reply answers it, and the card's machine handles it whatever Cloud's
83
+ * presence says. `last-speaker`: the agent that spoke last.
84
+ */
85
+ via: 'card' | 'last-speaker';
86
+ }
87
+ /**
88
+ * Who owns a Slack thread (specs/2026-10-03-one-responder-per-message.md §1 c):
89
+ *
90
+ * 1. a decision card or reminder an agent posted since a person last spoke
91
+ * in the thread — the reply answers that card (the decision path's own
92
+ * rule, read from Slack so every machine agrees);
93
+ * 2. otherwise the agent that spoke last (owner's rule, 2026-09-21: a bare
94
+ * follow-up addresses whoever just spoke).
95
+ *
96
+ * @param ctx - The Slack thread before the owner's message (oldest first)
97
+ * @param dir - Room directory
98
+ * @returns The owner and the rule, or null when no agent has spoken in the thread
99
+ */
100
+ export declare function threadOwnerFromSlack(ctx: SlackThreadContext | null | undefined, dir: RoomAgentDirectory): SlackThreadOwner | null;
101
+ /** An answer already in the thread after the owner's latest message. */
102
+ export interface PriorRoomAnswer {
103
+ /** Who wrote it (display name when known, else its session) */
104
+ by: string;
105
+ /** The agent's session (local) or the recorded sender id (a colleague's Slack post) */
106
+ bySession: string;
107
+ /** The start of the answer */
108
+ excerpt: string;
109
+ /** Its chat message id */
110
+ messageId: string;
111
+ }
112
+ /**
113
+ * The responders the harness chose for a room message, as recorded on its row.
114
+ *
115
+ * @param m - Chat row
116
+ * @returns Sessions (local or Cloud names), empty when none was recorded
117
+ */
118
+ export declare function chosenRespondersOf(m: Pick<ChatMessageDTO, 'metadata'>): string[];
119
+ /**
120
+ * The reply gate (specs/2026-10-03-one-responder-per-message.md §2). A post
121
+ * is held only when ALL of these hold:
122
+ *
123
+ * - the owner's latest message in the thread has recorded responders, and
124
+ * the agent posting is not one of them nor @'d in it;
125
+ * - the agent owes no earlier owner message in this thread (it was the
126
+ * responder for, or @'d in, one it has not posted after);
127
+ * - one of those responders already answered (an interim note is not an
128
+ * answer), and that answer does not @ the agent posting.
129
+ *
130
+ * @param thread - The thread's rows, oldest first
131
+ * @param session - The agent about to post
132
+ * @param nameFor - Display name of a session, when known
133
+ * @returns The responder's answer when the post should be held, else null
134
+ */
135
+ export declare function findPriorRoomAnswer(thread: readonly ChatMessageDTO[], session: string, nameFor?: (session: string) => string | undefined): PriorRoomAnswer | null;
136
+ /**
137
+ * What the agent is told when its post is held. Never "drop it": an agent
138
+ * that was asked must still be able to answer.
139
+ *
140
+ * @param prior - The answer already there
141
+ * @returns English harness text
142
+ */
143
+ export declare function heldReplyMessage(prior: Pick<PriorRoomAnswer, 'by' | 'excerpt'>): string;
144
+ //# sourceMappingURL=room-responder.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"room-responder.d.ts","sourceRoot":"","sources":["../../../../../../backend/src/services/slack/room-responder.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AAGH,OAAO,KAAK,EAAE,mBAAmB,EAAE,kBAAkB,EAAE,MAAM,4BAA4B,CAAC;AAC1F,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC;AAE1D,wDAAwD;AACxD,MAAM,WAAW,YAAY;IAC3B,0EAA0E;IAC1E,OAAO,EAAE,MAAM,CAAC;IAChB,mBAAmB;IACnB,IAAI,EAAE,MAAM,CAAC;IACb,sCAAsC;IACtC,KAAK,EAAE,OAAO,CAAC;CAChB;AAED,kDAAkD;AAClD,MAAM,WAAW,uBAAuB;IACtC,6EAA6E;IAC7E,KAAK,EAAE,aAAa,CAAC;QAAE,OAAO,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAC;QAAC,SAAS,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;KAAE,CAAC,CAAC;IACnF,8EAA8E;IAC9E,MAAM,EAAE,aAAa,CAAC;QAAE,OAAO,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;CAC1D;AAED,mDAAmD;AACnD,MAAM,WAAW,kBAAkB;IACjC,mGAAmG;IACnG,QAAQ,CAAC,CAAC,EAAE,mBAAmB,GAAG,YAAY,GAAG,IAAI,CAAC;CACvD;AAED;;;;;;;GAOG;AACH,wBAAgB,aAAa,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,GAAG,OAAO,CAK3D;AAED;;;;;;;;;;GAUG;AACH,wBAAgB,uBAAuB,CAAC,KAAK,EAAE,uBAAuB,GAAG,kBAAkB,CAqB1F;AAED;;;;;;;GAOG;AACH,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAExD;AAED,kDAAkD;AAClD,MAAM,WAAW,gBAAgB;IAC/B,KAAK,EAAE,YAAY,CAAC;IACpB;;;;OAIG;IACH,GAAG,EAAE,MAAM,GAAG,cAAc,CAAC;CAC9B;AAED;;;;;;;;;;;;GAYG;AACH,wBAAgB,oBAAoB,CAAC,GAAG,EAAE,kBAAkB,GAAG,IAAI,GAAG,SAAS,EAAE,GAAG,EAAE,kBAAkB,GAAG,gBAAgB,GAAG,IAAI,CAoBjI;AAED,wEAAwE;AACxE,MAAM,WAAW,eAAe;IAC9B,+DAA+D;IAC/D,EAAE,EAAE,MAAM,CAAC;IACX,uFAAuF;IACvF,SAAS,EAAE,MAAM,CAAC;IAClB,8BAA8B;IAC9B,OAAO,EAAE,MAAM,CAAC;IAChB,0BAA0B;IAC1B,SAAS,EAAE,MAAM,CAAC;CACnB;AAkBD;;;;;GAKG;AACH,wBAAgB,kBAAkB,CAAC,CAAC,EAAE,IAAI,CAAC,cAAc,EAAE,UAAU,CAAC,GAAG,MAAM,EAAE,CAGhF;AAkBD;;;;;;;;;;;;;;;GAeG;AACH,wBAAgB,mBAAmB,CACjC,MAAM,EAAE,SAAS,cAAc,EAAE,EACjC,OAAO,EAAE,MAAM,EACf,OAAO,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,MAAM,GAAG,SAAS,GAChD,eAAe,GAAG,IAAI,CAwCxB;AAED;;;;;;GAMG;AACH,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,IAAI,CAAC,eAAe,EAAE,IAAI,GAAG,SAAS,CAAC,GAAG,MAAM,CAKvF"}
@@ -0,0 +1,236 @@
1
+ /**
2
+ * One responder per owner message in Slack rooms — the pure parts
3
+ * (specs/2026-10-03-one-responder-per-message.md).
4
+ *
5
+ * - {@link threadOwnerFromSlack}: who owns a Slack thread, read from the
6
+ * thread itself, so every machine names the same agent.
7
+ * - {@link findPriorRoomAnswer} / {@link heldReplyMessage}: the reply gate —
8
+ * a colleague already answered the owner's latest message in this thread.
9
+ *
10
+ * Incident (2026-10-03, #content-team): the owner's un-@'d reply to Atlas's
11
+ * D-92 reminder resolved the card (delivered to Atlas) and was also
12
+ * broadcast to the room; Atlas answered, and Ella answered the same thing
13
+ * six minutes later.
14
+ *
15
+ * @module services/slack/room-responder
16
+ */
17
+ import { OWNER_EVIDENCE_METADATA, ROOM_RESPONDER_CONSTANTS, SLACK_TYPING_CONSTANTS } from '../../constants.js';
18
+ /**
19
+ * Whether two display names name the same agent: equal (case-insensitive),
20
+ * or one is the other plus a team suffix — "Ella" / "Ella (Crewly Marketing)".
21
+ *
22
+ * @param a - A name
23
+ * @param b - Another name
24
+ * @returns True when they match
25
+ */
26
+ export function sameAgentName(a, b) {
27
+ const x = a.trim().toLowerCase();
28
+ const y = b.trim().toLowerCase();
29
+ if (!x || !y)
30
+ return false;
31
+ return x === y || x.startsWith(`${y} (`) || y.startsWith(`${x} (`);
32
+ }
33
+ /**
34
+ * Build the directory every machine uses to read the same thread the same way.
35
+ *
36
+ * A post by a local agent's own bot is that agent. Any other bot post is
37
+ * matched by name against the remote members — and against local members
38
+ * when it was posted with a username override (an agent with no app of its
39
+ * own). A name that matches several agents is unclear and maps to nobody.
40
+ *
41
+ * @param input - Local and remote room members
42
+ * @returns The directory
43
+ */
44
+ export function buildRoomAgentDirectory(input) {
45
+ const local = input.local.map((m) => ({ session: m.session, name: m.name, local: true }));
46
+ const remote = input.remote.map((m) => ({ session: m.session, name: m.name, local: false }));
47
+ const byBot = new Map();
48
+ for (const m of input.local) {
49
+ if (m.botUserId)
50
+ byBot.set(m.botUserId, { session: m.session, name: m.name, local: true });
51
+ }
52
+ const unique = (pool, name) => {
53
+ const hits = pool.filter((a) => sameAgentName(a.name, name));
54
+ if (hits.length === 1)
55
+ return hits[0];
56
+ // Prefer an exact name over a suffix match ("Ella" vs "Ella (Marketing)").
57
+ const exact = hits.filter((a) => a.name.trim().toLowerCase() === name.trim().toLowerCase());
58
+ return exact.length === 1 ? exact[0] : null;
59
+ };
60
+ return {
61
+ authorOf(m) {
62
+ if (m.userId && byBot.has(m.userId))
63
+ return byBot.get(m.userId);
64
+ if (!m.isBot)
65
+ return null;
66
+ return unique([...(m.usernameOverride ? local : []), ...remote], m.authorName);
67
+ },
68
+ };
69
+ }
70
+ /**
71
+ * Whether a Slack post is a decision card or a card reminder — the post an
72
+ * owner's reply in that thread answers. Cards carry `Decision D-n` (or
73
+ * `[D-n]` when titled by a ticket); the reminder says "Still waiting on you".
74
+ *
75
+ * @param text - Normalised Slack text
76
+ * @returns True for a card or reminder
77
+ */
78
+ export function isDecisionCardText(text) {
79
+ return /\bDecision D-\d+\b/.test(text) || /\[D-\d+\]/.test(text) || /Still waiting on you\b/.test(text);
80
+ }
81
+ /**
82
+ * Who owns a Slack thread (specs/2026-10-03-one-responder-per-message.md §1 c):
83
+ *
84
+ * 1. a decision card or reminder an agent posted since a person last spoke
85
+ * in the thread — the reply answers that card (the decision path's own
86
+ * rule, read from Slack so every machine agrees);
87
+ * 2. otherwise the agent that spoke last (owner's rule, 2026-09-21: a bare
88
+ * follow-up addresses whoever just spoke).
89
+ *
90
+ * @param ctx - The Slack thread before the owner's message (oldest first)
91
+ * @param dir - Room directory
92
+ * @returns The owner and the rule, or null when no agent has spoken in the thread
93
+ */
94
+ export function threadOwnerFromSlack(ctx, dir) {
95
+ if (!ctx || ctx.kind !== 'thread' || ctx.messages.length === 0)
96
+ return null;
97
+ const msgs = ctx.messages;
98
+ const authors = msgs.map((m) => dir.authorOf(m));
99
+ let lastPerson = -1;
100
+ for (let i = msgs.length - 1; i >= 0; i--) {
101
+ if (!authors[i] && !msgs[i].isBot) {
102
+ lastPerson = i;
103
+ break;
104
+ }
105
+ }
106
+ for (let i = msgs.length - 1; i > lastPerson; i--) {
107
+ const agent = authors[i];
108
+ if (agent && isDecisionCardText(msgs[i].text))
109
+ return { agent, via: 'card' };
110
+ }
111
+ for (let i = msgs.length - 1; i >= 0; i--) {
112
+ const agent = authors[i];
113
+ if (agent)
114
+ return { agent, via: 'last-speaker' };
115
+ }
116
+ return null;
117
+ }
118
+ /**
119
+ * The agent session behind a chat row, when an agent wrote it.
120
+ *
121
+ * @param m - Chat row
122
+ * @returns Session (or sender id for a colleague's post), or null for a person
123
+ */
124
+ function agentWriterOf(m) {
125
+ if (m.senderType === 'agent')
126
+ return m.senderId;
127
+ const md = m.metadata ?? {};
128
+ for (const key of [OWNER_EVIDENCE_METADATA.AUTHOR_AGENT_SESSION, OWNER_EVIDENCE_METADATA.REMOTE_AGENT_SESSION]) {
129
+ const v = md[key];
130
+ if (typeof v === 'string' && v.trim())
131
+ return v.trim();
132
+ }
133
+ return null;
134
+ }
135
+ /**
136
+ * The responders the harness chose for a room message, as recorded on its row.
137
+ *
138
+ * @param m - Chat row
139
+ * @returns Sessions (local or Cloud names), empty when none was recorded
140
+ */
141
+ export function chosenRespondersOf(m) {
142
+ const v = m.metadata?.[ROOM_RESPONDER_CONSTANTS.CHOSEN_RESPONDERS_METADATA_KEY];
143
+ return Array.isArray(v) ? v.filter((s) => typeof s === 'string') : [];
144
+ }
145
+ /**
146
+ * Whether an agent's post @'s a session: in its resolved mentions, or as
147
+ * `@Name` in its text.
148
+ *
149
+ * @param m - Chat row
150
+ * @param session - The agent
151
+ * @param name - Its display name, when known
152
+ * @returns True when it addresses that agent
153
+ */
154
+ function addresses(m, session, name) {
155
+ if ((m.mentions ?? []).includes(session))
156
+ return true;
157
+ if (!name?.trim())
158
+ return false;
159
+ const re = new RegExp(`@${name.trim().replace(/[.*+?^${}()|[\]\\]/g, '\\$&')}(?![\\p{L}\\p{N}_])`, 'iu');
160
+ return re.test(m.content);
161
+ }
162
+ /**
163
+ * The reply gate (specs/2026-10-03-one-responder-per-message.md §2). A post
164
+ * is held only when ALL of these hold:
165
+ *
166
+ * - the owner's latest message in the thread has recorded responders, and
167
+ * the agent posting is not one of them nor @'d in it;
168
+ * - the agent owes no earlier owner message in this thread (it was the
169
+ * responder for, or @'d in, one it has not posted after);
170
+ * - one of those responders already answered (an interim note is not an
171
+ * answer), and that answer does not @ the agent posting.
172
+ *
173
+ * @param thread - The thread's rows, oldest first
174
+ * @param session - The agent about to post
175
+ * @param nameFor - Display name of a session, when known
176
+ * @returns The responder's answer when the post should be held, else null
177
+ */
178
+ export function findPriorRoomAnswer(thread, session, nameFor) {
179
+ const isOwnerRow = (m) => m.senderType === 'user' && !agentWriterOf(m);
180
+ const isAnswer = (m) => !!agentWriterOf(m) && m.metadata?.[SLACK_TYPING_CONSTANTS.INTERIM_METADATA_KEY] !== true && !!m.content.trim();
181
+ let ownerIdx = -1;
182
+ for (let i = thread.length - 1; i >= 0; i--) {
183
+ if (isOwnerRow(thread[i])) {
184
+ ownerIdx = i;
185
+ break;
186
+ }
187
+ }
188
+ if (ownerIdx < 0)
189
+ return null;
190
+ const latest = thread[ownerIdx];
191
+ const chosen = chosenRespondersOf(latest);
192
+ if (chosen.length === 0 || chosen.includes(session) || (latest.mentions ?? []).includes(session))
193
+ return null;
194
+ // An earlier owner message this agent was asked (or chosen) to answer and has not answered yet.
195
+ for (let i = 0; i < ownerIdx; i++) {
196
+ const m = thread[i];
197
+ if (!isOwnerRow(m))
198
+ continue;
199
+ if (!chosenRespondersOf(m).includes(session) && !(m.mentions ?? []).includes(session))
200
+ continue;
201
+ const answered = thread.slice(i + 1).some((r) => agentWriterOf(r) === session && isAnswer(r));
202
+ if (!answered)
203
+ return null;
204
+ }
205
+ const name = nameFor?.(session);
206
+ for (let j = ownerIdx + 1; j < thread.length; j++) {
207
+ const m = thread[j];
208
+ const writer = agentWriterOf(m);
209
+ if (!writer || writer === session || !chosen.includes(writer) || !isAnswer(m))
210
+ continue;
211
+ if (addresses(m, session, name))
212
+ return null;
213
+ const flat = m.content.replace(/\s+/g, ' ').trim();
214
+ const max = ROOM_RESPONDER_CONSTANTS.GATE_EXCERPT_CHARS;
215
+ const by = m.senderType === 'agent' ? nameFor?.(writer) ?? writer : m.senderId.replace(/\s*\(agent\)$/, '');
216
+ return {
217
+ by,
218
+ bySession: writer,
219
+ excerpt: flat.length > max ? `${flat.slice(0, max)}…` : flat,
220
+ messageId: m.id,
221
+ };
222
+ }
223
+ return null;
224
+ }
225
+ /**
226
+ * What the agent is told when its post is held. Never "drop it": an agent
227
+ * that was asked must still be able to answer.
228
+ *
229
+ * @param prior - The answer already there
230
+ * @returns English harness text
231
+ */
232
+ export function heldReplyMessage(prior) {
233
+ return (`Held, not posted: ${prior.by}, the agent answering the owner's latest message in this thread, already replied: "${prior.excerpt}". ` +
234
+ 'Post with --adds-new if you have something new, or if you were asked.');
235
+ }
236
+ //# sourceMappingURL=room-responder.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"room-responder.js","sourceRoot":"","sources":["../../../../../../backend/src/services/slack/room-responder.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"slack-orchestrator-bridge.d.ts","sourceRoot":"","sources":["../../../../../../backend/src/services/slack/slack-orchestrator-bridge.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"slack-orchestrator-bridge.d.ts","sourceRoot":"","sources":["../../../../../../backend/src/services/slack/slack-orchestrator-bridge.ts"],"names":[],"mappings":"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"}
@@ -34,7 +34,7 @@ import { contextKindFor, getSlackThreadContextService, renderSlackThreadContext
34
34
  import { getTicketIntakeService, suppressTrivialOrShort, suppressFileOnly, } from '../v3/ticket-intake.service.js';
35
35
  import { appendTicketLine, intakeWithin, slackIntakeMessage, ticketOfOutcome, } from '../v3/ticket-channel-hooks.js';
36
36
  import { toSlackMrkdwn } from './slack-mrkdwn.js';
37
- import { getLocalApiBaseUrl } from '../../utils/local-api-url.utils.js';
37
+ import { deliverForcedMessage } from '../messaging/forced-delivery.js';
38
38
  import { inboundFileHint } from '../../utils/inbound-file-hint.utils.js';
39
39
  /**
40
40
  * Default bridge configuration
@@ -2097,13 +2097,34 @@ Just type naturally to chat with the orchestrator!`;
2097
2097
  // write, but the actual reply hasn't been generated yet. Return a
2098
2098
  // placeholder with fromOrcReply=false so the SLA cascade does NOT
2099
2099
  // close on this.
2100
- const { default: fetch } = await import('node-fetch').catch(() => ({ default: globalThis.fetch }));
2101
- const apiUrl = getLocalApiBaseUrl();
2102
- await fetch(`${apiUrl}/api/terminal/${sessionName}/deliver`, {
2103
- method: 'POST',
2104
- headers: { 'Content-Type': 'application/json' },
2105
- body: JSON.stringify({ message: deliveredMessage, force: true }),
2106
- });
2100
+ // The owner's message still waits for an answer from this agent: record
2101
+ // it in chat-v2 (the watchdog looks for the reply there) and hand it to
2102
+ // the unanswered-owner watchdog, as the queue path above does.
2103
+ let fallbackConversationId;
2104
+ try {
2105
+ fallbackConversationId = this.persistSlackInbound({
2106
+ content: enrichedMessage,
2107
+ conversationId: context?.conversationId,
2108
+ agentSession: sessionName,
2109
+ channelId: context?.channelId,
2110
+ threadTs: context?.threadTs,
2111
+ userId: context?.userId,
2112
+ authorAgentSession,
2113
+ ...persistIdsOf(context),
2114
+ }).conversationId;
2115
+ }
2116
+ catch {
2117
+ fallbackConversationId =
2118
+ context?.conversationId ??
2119
+ synthesizeSlackConversationId(context?.channelId ?? 'unknown', context?.threadTs || context?.messageTs || String(Date.now()));
2120
+ }
2121
+ this.watchOwnerMessage(context, authorAgentSession, message, fallbackConversationId, sessionName);
2122
+ // In process (#1024): the HTTP deliver route refuses callers without a
2123
+ // credential, and this bridge is already in the backend.
2124
+ const delivery = await deliverForcedMessage(sessionName, deliveredMessage);
2125
+ if (delivery.status !== 'delivered' && delivery.status !== 'queued') {
2126
+ throw new Error(delivery.error);
2127
+ }
2107
2128
  return {
2108
2129
  response: 'Message delivered to agent. Response will arrive shortly.',
2109
2130
  fromOrcReply: false,