crewly 1.20.203 → 1.20.204

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 (139) hide show
  1. package/config/skills/agent/core/reply/SKILL.md +1 -0
  2. package/config/skills/agent/core/reply/execute.sh +7 -1
  3. package/config/skills/agent/core/reply-channel/SKILL.md +4 -0
  4. package/config/skills/agent/core/reply-channel/execute.sh +12 -1
  5. package/dist/backend/backend/src/constants.d.ts +60 -0
  6. package/dist/backend/backend/src/constants.d.ts.map +1 -1
  7. package/dist/backend/backend/src/constants.js +60 -0
  8. package/dist/backend/backend/src/constants.js.map +1 -1
  9. package/dist/backend/backend/src/controllers/chat/agent-reply.controller.d.ts.map +1 -1
  10. package/dist/backend/backend/src/controllers/chat/agent-reply.controller.js +1 -0
  11. package/dist/backend/backend/src/controllers/chat/agent-reply.controller.js.map +1 -1
  12. package/dist/backend/backend/src/controllers/chat/chat.controller.d.ts.map +1 -1
  13. package/dist/backend/backend/src/controllers/chat/chat.controller.js +1 -0
  14. package/dist/backend/backend/src/controllers/chat/chat.controller.js.map +1 -1
  15. package/dist/backend/backend/src/controllers/chat-v2/chat-v2.controller.d.ts.map +1 -1
  16. package/dist/backend/backend/src/controllers/chat-v2/chat-v2.controller.js +50 -0
  17. package/dist/backend/backend/src/controllers/chat-v2/chat-v2.controller.js.map +1 -1
  18. package/dist/backend/backend/src/controllers/monitoring/terminal.controller.d.ts +6 -0
  19. package/dist/backend/backend/src/controllers/monitoring/terminal.controller.d.ts.map +1 -1
  20. package/dist/backend/backend/src/controllers/monitoring/terminal.controller.js +2 -1
  21. package/dist/backend/backend/src/controllers/monitoring/terminal.controller.js.map +1 -1
  22. package/dist/backend/backend/src/index.d.ts.map +1 -1
  23. package/dist/backend/backend/src/index.js +9 -1
  24. package/dist/backend/backend/src/index.js.map +1 -1
  25. package/dist/backend/backend/src/services/chat-v2/chat-v2.dispatcher.service.d.ts +117 -0
  26. package/dist/backend/backend/src/services/chat-v2/chat-v2.dispatcher.service.d.ts.map +1 -1
  27. package/dist/backend/backend/src/services/chat-v2/chat-v2.dispatcher.service.js +165 -9
  28. package/dist/backend/backend/src/services/chat-v2/chat-v2.dispatcher.service.js.map +1 -1
  29. package/dist/backend/backend/src/services/chat-v2/room-context-backlog.d.ts +93 -0
  30. package/dist/backend/backend/src/services/chat-v2/room-context-backlog.d.ts.map +1 -0
  31. package/dist/backend/backend/src/services/chat-v2/room-context-backlog.js +138 -0
  32. package/dist/backend/backend/src/services/chat-v2/room-context-backlog.js.map +1 -0
  33. package/dist/backend/backend/src/services/decisions/decision-card.d.ts.map +1 -1
  34. package/dist/backend/backend/src/services/decisions/decision-card.js +5 -1
  35. package/dist/backend/backend/src/services/decisions/decision-card.js.map +1 -1
  36. package/dist/backend/backend/src/services/decisions/decision.service.d.ts +26 -1
  37. package/dist/backend/backend/src/services/decisions/decision.service.d.ts.map +1 -1
  38. package/dist/backend/backend/src/services/decisions/decision.service.js +83 -5
  39. package/dist/backend/backend/src/services/decisions/decision.service.js.map +1 -1
  40. package/dist/backend/backend/src/services/messaging/sub-agent-message-queue.service.d.ts +21 -0
  41. package/dist/backend/backend/src/services/messaging/sub-agent-message-queue.service.d.ts.map +1 -1
  42. package/dist/backend/backend/src/services/messaging/sub-agent-message-queue.service.js +48 -3
  43. package/dist/backend/backend/src/services/messaging/sub-agent-message-queue.service.js.map +1 -1
  44. package/dist/backend/backend/src/services/monitoring/liveness-monitor.service.d.ts +27 -1
  45. package/dist/backend/backend/src/services/monitoring/liveness-monitor.service.d.ts.map +1 -1
  46. package/dist/backend/backend/src/services/monitoring/liveness-monitor.service.js +51 -2
  47. package/dist/backend/backend/src/services/monitoring/liveness-monitor.service.js.map +1 -1
  48. package/dist/backend/backend/src/services/orc/orc-chat-owner-mirror.d.ts +51 -4
  49. package/dist/backend/backend/src/services/orc/orc-chat-owner-mirror.d.ts.map +1 -1
  50. package/dist/backend/backend/src/services/orc/orc-chat-owner-mirror.js +83 -6
  51. package/dist/backend/backend/src/services/orc/orc-chat-owner-mirror.js.map +1 -1
  52. package/dist/backend/backend/src/services/orc/reply-destination.wiring.d.ts +16 -0
  53. package/dist/backend/backend/src/services/orc/reply-destination.wiring.d.ts.map +1 -1
  54. package/dist/backend/backend/src/services/orc/reply-destination.wiring.js +22 -2
  55. package/dist/backend/backend/src/services/orc/reply-destination.wiring.js.map +1 -1
  56. package/dist/backend/backend/src/services/restart/in-flight-turn-tracker.service.d.ts +9 -0
  57. package/dist/backend/backend/src/services/restart/in-flight-turn-tracker.service.d.ts.map +1 -1
  58. package/dist/backend/backend/src/services/restart/in-flight-turn-tracker.service.js +11 -0
  59. package/dist/backend/backend/src/services/restart/in-flight-turn-tracker.service.js.map +1 -1
  60. package/dist/backend/backend/src/services/slack/room-responder.d.ts +144 -0
  61. package/dist/backend/backend/src/services/slack/room-responder.d.ts.map +1 -0
  62. package/dist/backend/backend/src/services/slack/room-responder.js +236 -0
  63. package/dist/backend/backend/src/services/slack/room-responder.js.map +1 -0
  64. package/dist/backend/backend/src/services/slack/slack-initializer.d.ts.map +1 -1
  65. package/dist/backend/backend/src/services/slack/slack-initializer.js +36 -2
  66. package/dist/backend/backend/src/services/slack/slack-initializer.js.map +1 -1
  67. package/dist/backend/backend/src/services/slack/slack-team-channel.service.d.ts +107 -2
  68. package/dist/backend/backend/src/services/slack/slack-team-channel.service.d.ts.map +1 -1
  69. package/dist/backend/backend/src/services/slack/slack-team-channel.service.js +403 -13
  70. package/dist/backend/backend/src/services/slack/slack-team-channel.service.js.map +1 -1
  71. package/dist/backend/backend/src/services/slack/slack-thread-context.service.d.ts +27 -0
  72. package/dist/backend/backend/src/services/slack/slack-thread-context.service.d.ts.map +1 -1
  73. package/dist/backend/backend/src/services/slack/slack-thread-context.service.js +52 -0
  74. package/dist/backend/backend/src/services/slack/slack-thread-context.service.js.map +1 -1
  75. package/dist/backend/backend/src/services/slack/slack-typing-placeholder.service.d.ts +9 -0
  76. package/dist/backend/backend/src/services/slack/slack-typing-placeholder.service.d.ts.map +1 -1
  77. package/dist/backend/backend/src/services/slack/slack-typing-placeholder.service.js +20 -0
  78. package/dist/backend/backend/src/services/slack/slack-typing-placeholder.service.js.map +1 -1
  79. package/dist/backend/backend/src/services/v3/ticket-channel-hooks.d.ts +13 -1
  80. package/dist/backend/backend/src/services/v3/ticket-channel-hooks.d.ts.map +1 -1
  81. package/dist/backend/backend/src/services/v3/ticket-channel-hooks.js +36 -3
  82. package/dist/backend/backend/src/services/v3/ticket-channel-hooks.js.map +1 -1
  83. package/dist/backend/backend/src/services/v3/workitem-dispatch.subscriber.d.ts +54 -3
  84. package/dist/backend/backend/src/services/v3/workitem-dispatch.subscriber.d.ts.map +1 -1
  85. package/dist/backend/backend/src/services/v3/workitem-dispatch.subscriber.js +117 -9
  86. package/dist/backend/backend/src/services/v3/workitem-dispatch.subscriber.js.map +1 -1
  87. package/dist/backend/backend/src/types/decision.types.d.ts +7 -0
  88. package/dist/backend/backend/src/types/decision.types.d.ts.map +1 -1
  89. package/dist/backend/build-info.json +2 -2
  90. package/dist/cli/backend/src/constants.d.ts +60 -0
  91. package/dist/cli/backend/src/constants.d.ts.map +1 -1
  92. package/dist/cli/backend/src/constants.js +60 -0
  93. package/dist/cli/backend/src/constants.js.map +1 -1
  94. package/dist/cli/backend/src/services/chat-v2/chat-v2.dispatcher.service.d.ts +117 -0
  95. package/dist/cli/backend/src/services/chat-v2/chat-v2.dispatcher.service.d.ts.map +1 -1
  96. package/dist/cli/backend/src/services/chat-v2/chat-v2.dispatcher.service.js +165 -9
  97. package/dist/cli/backend/src/services/chat-v2/chat-v2.dispatcher.service.js.map +1 -1
  98. package/dist/cli/backend/src/services/chat-v2/room-context-backlog.d.ts +93 -0
  99. package/dist/cli/backend/src/services/chat-v2/room-context-backlog.d.ts.map +1 -0
  100. package/dist/cli/backend/src/services/chat-v2/room-context-backlog.js +138 -0
  101. package/dist/cli/backend/src/services/chat-v2/room-context-backlog.js.map +1 -0
  102. package/dist/cli/backend/src/services/decisions/decision-card.d.ts.map +1 -1
  103. package/dist/cli/backend/src/services/decisions/decision-card.js +5 -1
  104. package/dist/cli/backend/src/services/decisions/decision-card.js.map +1 -1
  105. package/dist/cli/backend/src/services/decisions/decision.service.d.ts +26 -1
  106. package/dist/cli/backend/src/services/decisions/decision.service.d.ts.map +1 -1
  107. package/dist/cli/backend/src/services/decisions/decision.service.js +83 -5
  108. package/dist/cli/backend/src/services/decisions/decision.service.js.map +1 -1
  109. package/dist/cli/backend/src/services/messaging/sub-agent-message-queue.service.d.ts +21 -0
  110. package/dist/cli/backend/src/services/messaging/sub-agent-message-queue.service.d.ts.map +1 -1
  111. package/dist/cli/backend/src/services/messaging/sub-agent-message-queue.service.js +48 -3
  112. package/dist/cli/backend/src/services/messaging/sub-agent-message-queue.service.js.map +1 -1
  113. package/dist/cli/backend/src/services/restart/in-flight-turn-tracker.service.d.ts +9 -0
  114. package/dist/cli/backend/src/services/restart/in-flight-turn-tracker.service.d.ts.map +1 -1
  115. package/dist/cli/backend/src/services/restart/in-flight-turn-tracker.service.js +11 -0
  116. package/dist/cli/backend/src/services/restart/in-flight-turn-tracker.service.js.map +1 -1
  117. package/dist/cli/backend/src/services/slack/room-responder.d.ts +144 -0
  118. package/dist/cli/backend/src/services/slack/room-responder.d.ts.map +1 -0
  119. package/dist/cli/backend/src/services/slack/room-responder.js +236 -0
  120. package/dist/cli/backend/src/services/slack/room-responder.js.map +1 -0
  121. package/dist/cli/backend/src/services/slack/slack-team-channel.service.d.ts +107 -2
  122. package/dist/cli/backend/src/services/slack/slack-team-channel.service.d.ts.map +1 -1
  123. package/dist/cli/backend/src/services/slack/slack-team-channel.service.js +403 -13
  124. package/dist/cli/backend/src/services/slack/slack-team-channel.service.js.map +1 -1
  125. package/dist/cli/backend/src/services/slack/slack-thread-context.service.d.ts +27 -0
  126. package/dist/cli/backend/src/services/slack/slack-thread-context.service.d.ts.map +1 -1
  127. package/dist/cli/backend/src/services/slack/slack-thread-context.service.js +52 -0
  128. package/dist/cli/backend/src/services/slack/slack-thread-context.service.js.map +1 -1
  129. package/dist/cli/backend/src/services/slack/slack-typing-placeholder.service.d.ts +9 -0
  130. package/dist/cli/backend/src/services/slack/slack-typing-placeholder.service.d.ts.map +1 -1
  131. package/dist/cli/backend/src/services/slack/slack-typing-placeholder.service.js +20 -0
  132. package/dist/cli/backend/src/services/slack/slack-typing-placeholder.service.js.map +1 -1
  133. package/dist/cli/backend/src/services/v3/ticket-channel-hooks.d.ts +13 -1
  134. package/dist/cli/backend/src/services/v3/ticket-channel-hooks.d.ts.map +1 -1
  135. package/dist/cli/backend/src/services/v3/ticket-channel-hooks.js +36 -3
  136. package/dist/cli/backend/src/services/v3/ticket-channel-hooks.js.map +1 -1
  137. package/dist/cli/backend/src/types/decision.types.d.ts +7 -0
  138. package/dist/cli/backend/src/types/decision.types.d.ts.map +1 -1
  139. package/package.json +1 -1
@@ -1 +1 @@
1
- {"version":3,"file":"in-flight-turn-tracker.service.d.ts","sourceRoot":"","sources":["../../../../../../backend/src/services/restart/in-flight-turn-tracker.service.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;GAwBG;AAKH,qDAAqD;AACrD,MAAM,MAAM,eAAe,GAAG,MAAM,GAAG,MAAM,GAAG,MAAM,CAAC;AAEvD,sHAAsH;AACtH,MAAM,MAAM,SAAS,GAAG,CAAC,WAAW,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE;IAAE,KAAK,CAAC,EAAE,MAAM,CAAA;CAAE,KAAK,eAAe,CAAC;AAE/F,yCAAyC;AACzC,MAAM,MAAM,eAAe,GAAG,KAAK,GAAG,YAAY,CAAC;AAEnD,6EAA6E;AAC7E,MAAM,WAAW,YAAY;IAC5B,uBAAuB;IACvB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,wDAAwD;IACxD,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,6CAA6C;IAC7C,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,wEAAwE;IACxE,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,uEAAuE;IACvE,cAAc,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,GAAG,OAAO,CAAC,CAAC;IAC3D,oEAAoE;IACpE,WAAW,CAAC,EAAE,OAAO,CAAC;CACtB;AAED,0DAA0D;AAC1D,MAAM,WAAW,gBAAiB,SAAQ,YAAY;IACrD,4BAA4B;IAC5B,WAAW,EAAE,MAAM,CAAC;IACpB,oDAAoD;IACpD,IAAI,EAAE,MAAM,CAAC;IACb,oCAAoC;IACpC,OAAO,EAAE,MAAM,CAAC;CAChB;AAED,0EAA0E;AAC1E,MAAM,WAAW,YAAY;IAC5B,yBAAyB;IACzB,WAAW,EAAE,MAAM,CAAC;IACpB,sCAAsC;IACtC,OAAO,EAAE,eAAe,CAAC;IACzB,2CAA2C;IAC3C,KAAK,EAAE,MAAM,CAAC;IACd,kFAAkF;IAClF,QAAQ,EAAE,gBAAgB,EAAE,CAAC;IAC7B,gIAAgI;IAChI,MAAM,CAAC,EAAE,UAAU,GAAG,SAAS,CAAC;IAChC,yFAAyF;IACzF,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,wGAAwG;IACxG,aAAa,CAAC,EAAE,MAAM,CAAC;CACvB;AAED,sEAAsE;AACtE,MAAM,WAAW,kBAAkB;IAClC,yBAAyB;IACzB,WAAW,EAAE,MAAM,CAAC;IACpB,4DAA4D;IAC5D,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;IACrB,uDAAuD;IACvD,WAAW,EAAE,OAAO,CAAC;CACrB;AAED,oEAAoE;AACpE,MAAM,MAAM,iBAAiB,GAAG,CAAC,GAAG,EAAE,MAAM,KAAK,kBAAkB,EAAE,CAAC;AAEtE,wDAAwD;AACxD,MAAM,WAAW,eAAe;IAC/B,EAAE,CAAC,KAAK,EAAE,gBAAgB,EAAE,QAAQ,EAAE,CAAC,KAAK,EAAE;QAAE,IAAI,CAAC,EAAE,MAAM,CAAC;QAAC,WAAW,CAAC,EAAE,MAAM,CAAA;KAAE,KAAK,IAAI,GAAG,OAAO,CAAC;IACzG,GAAG,CAAC,CAAC,KAAK,EAAE,gBAAgB,EAAE,QAAQ,EAAE,CAAC,KAAK,EAAE;QAAE,IAAI,CAAC,EAAE,MAAM,CAAC;QAAC,WAAW,CAAC,EAAE,MAAM,CAAA;KAAE,KAAK,IAAI,GAAG,OAAO,CAAC;IAC3G,cAAc,CAAC,CAAC,KAAK,EAAE,gBAAgB,EAAE,QAAQ,EAAE,CAAC,KAAK,EAAE;QAAE,IAAI,CAAC,EAAE,MAAM,CAAC;QAAC,WAAW,CAAC,EAAE,MAAM,CAAA;KAAE,KAAK,IAAI,GAAG,OAAO,CAAC;CACtH;AAKD;;;;;GAKG;AACH,wBAAgB,SAAS,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAG9C;AAED;;GAEG;AACH,qBAAa,mBAAmB;IAC/B,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAoC;IAC3D,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAkB;IACzC,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAmC;IACzD,OAAO,CAAC,KAAK,CAA0B;IACvC,OAAO,CAAC,iBAAiB,CAAkC;IAC3D,mFAAmF;IACnF,OAAO,CAAC,QAAQ,CAAC,aAAa,CAA6B;IAE3D,OAAO;IAIP;;;;OAIG;IACH,MAAM,CAAC,WAAW,IAAI,mBAAmB;IAOzC;;OAEG;IACH,MAAM,CAAC,aAAa,IAAI,IAAI;IAI5B;;;;OAIG;IACH,QAAQ,CAAC,KAAK,EAAE,SAAS,GAAG,IAAI,GAAG,IAAI;IAIvC;;;;;;;OAOG;IACH,oBAAoB,CAAC,MAAM,EAAE,iBAAiB,GAAG,IAAI,GAAG,IAAI;IAI5D;;;;;;;;;;;;;;;OAeG;IACH,cAAc,CAAC,WAAW,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,GAAE,eAAuB,EAAE,GAAG,GAAE,MAAmB,GAAG,gBAAgB;IA6B/H;;;;;;;;;OASG;IACH,QAAQ,CAAC,WAAW,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,YAAY,GAAG,OAAO;IAaxE;;;;;OAKG;IACH,eAAe,CAAC,WAAW,EAAE,MAAM,EAAE,OAAO,EAAE,gBAAgB,GAAG,IAAI;IAWrE;;;;;OAKG;IACH,gBAAgB,CAAC,WAAW,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,IAAI;IAM3D;;;;;;;;OAQG;IACH,MAAM,CAAC,WAAW,EAAE,MAAM,EAAE,GAAG,GAAE,MAAmB,GAAG,OAAO;IAuB9D;;;;;OAKG;IACH,UAAU,CAAC,GAAG,GAAE,MAAmB,GAAG,YAAY,EAAE;IAoCpD;;;;OAIG;IACH,QAAQ,IAAI,YAAY,EAAE;IAM1B;;;;;;;OAOG;IACH,iBAAiB,CAAC,MAAM,EAAE,eAAe,GAAG,MAAM,IAAI;CAYtD"}
1
+ {"version":3,"file":"in-flight-turn-tracker.service.d.ts","sourceRoot":"","sources":["../../../../../../backend/src/services/restart/in-flight-turn-tracker.service.ts"],"names":[],"mappings":"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"}
@@ -184,6 +184,17 @@ export class InFlightTurnTracker {
184
184
  this.logger.debug('Turn complete', { sessionName, reason });
185
185
  }
186
186
  }
187
+ /**
188
+ * Whether a delivery to the session is still tracked as in flight. Read
189
+ * only: unlike {@link settle} it never probes and never drops anything
190
+ * (crewly#1015 follow-up L3).
191
+ *
192
+ * @param sessionName - Agent session
193
+ * @returns True while an open delivery is tracked
194
+ */
195
+ hasOpenTurn(sessionName) {
196
+ return this.turns.has(sessionName);
197
+ }
187
198
  /**
188
199
  * Re-check one session with the probe and drop its open deliveries if the
189
200
  * agent is resting or its session is gone. In-process turns are left alone:
@@ -1 +1 @@
1
- {"version":3,"file":"in-flight-turn-tracker.service.js","sourceRoot":"","sources":["../../../../../../backend/src/services/restart/in-flight-turn-tracker.service.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"in-flight-turn-tracker.service.js","sourceRoot":"","sources":["../../../../../../backend/src/services/restart/in-flight-turn-tracker.service.ts"],"names":[],"mappings":"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"}
@@ -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-initializer.d.ts","sourceRoot":"","sources":["../../../../../../backend/src/services/slack/slack-initializer.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"slack-initializer.d.ts","sourceRoot":"","sources":["../../../../../../backend/src/services/slack/slack-initializer.ts"],"names":[],"mappings":"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"}
@@ -21,6 +21,7 @@ import * as path from 'path';
21
21
  import { getCrewlyHomePath } from '../core/crewly-home.utils.js';
22
22
  import { InFlightTurnTracker } from '../restart/in-flight-turn-tracker.service.js';
23
23
  import { OrcReplyRouteService } from '../orc/orc-reply-route.service.js';
24
+ import { AgentTurnStateService } from '../monitoring/agent-turn-state.js';
24
25
  import { parseSlackThreadKey } from './slack-thread-key.js';
25
26
  import { getOwnerMessageWatchdog } from '../messaging/owner-message-watchdog.service.js';
26
27
  import { LoggerService } from '../core/logger.service.js';
@@ -843,6 +844,13 @@ export async function startSlackTeamChannels() {
843
844
  linkMentions: async (text, channelId) => (await getSlackTeamChannelService()?.linkAgentMentions(text, channelId)) ?? text,
844
845
  }));
845
846
  }
847
+ // Tokens that can read a room's threads: its agents' own bots, then the workspace bot.
848
+ const roomReadTokens = (slackChannelId) => [
849
+ ...new Set([
850
+ ...(getSlackTeamChannelService()?.rosterSessions(slackChannelId) ?? []).map((s) => identities.getInstalled(s)?.botToken),
851
+ getSlackService().getBotToken() ?? undefined,
852
+ ].filter((t) => !!t)),
853
+ ];
846
854
  let service = getSlackTeamChannelService();
847
855
  if (!service) {
848
856
  service = new SlackTeamChannelService({
@@ -864,6 +872,29 @@ export async function startSlackTeamChannels() {
864
872
  throw new Error('Not connected to Crewly Cloud');
865
873
  await registry.handoff(body);
866
874
  },
875
+ // One responder per owner message: a reply in a decision card's
876
+ // thread belongs to the card's asker, and when the decision path
877
+ // consumed it the room only passes it on as context
878
+ // (specs/2026-10-03-one-responder-per-message.md §3).
879
+ // The 90 s fallback looks at the Slack thread first: a reply or a
880
+ // "working on it" from any machine means nothing is handed over.
881
+ slackRepliesAfter: async (slackChannelId, threadTs, afterTs) => {
882
+ const { getSlackThreadContextService } = await import('./slack-thread-context.service.js');
883
+ return getSlackThreadContextService().getRepliesAfter(slackChannelId, threadTs, afterTs, roomReadTokens(slackChannelId));
884
+ },
885
+ // The one retry of a thread read that gave nothing (one responder, §1 c).
886
+ readThreadContext: async (message, { maxWaitMs }) => {
887
+ const { getSlackThreadContextService } = await import('./slack-thread-context.service.js');
888
+ return getSlackThreadContextService().getContextWithinRateLimit({ channelId: message.channelId, ts: message.ts, threadTs: message.threadTs, text: message.text }, roomReadTokens(message.channelId), maxWaitMs);
889
+ },
890
+ decisionReplyFor: async (message) => {
891
+ const { DecisionService } = await import('../decisions/decision.service.js');
892
+ const decisions = DecisionService.getInstance();
893
+ if (!decisions)
894
+ return null;
895
+ const outcome = await decisions.threadReplyOutcome(message);
896
+ return outcome.decision ? { asker: outcome.decision.asker, consumed: outcome.handled } : null;
897
+ },
867
898
  });
868
899
  setSlackTeamChannelService(service);
869
900
  }
@@ -891,8 +922,11 @@ export async function startSlackTeamChannels() {
891
922
  // Fresh, or older but the agent is still in the turn it started
892
923
  // (a long task): the origin lasts the whole turn (review H2).
893
924
  const routes = OrcReplyRouteService.getInstance();
894
- const origin = routes.getFreshOrigin(agentSession) ??
895
- (InFlightTurnTracker.getInstance().settle(agentSession) ? routes.getLastOrigin(agentSession) : undefined);
925
+ // Read only (follow-up L3): no settle() here — resolving a reply
926
+ // target must not probe the agent or drop its tracked turn.
927
+ const midTurn = InFlightTurnTracker.getInstance().hasOpenTurn(agentSession) ||
928
+ ['turn', 'background'].includes(AgentTurnStateService.getInstance().getVerdict(agentSession).state);
929
+ const origin = routes.getFreshOrigin(agentSession) ?? (midTurn ? routes.getLastOrigin(agentSession) : undefined);
896
930
  if (!origin)
897
931
  return undefined;
898
932
  const key = parseSlackThreadKey(origin.slackThreadKey);