crewly 1.20.202 → 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.
- package/config/skills/agent/core/reply/SKILL.md +1 -0
- package/config/skills/agent/core/reply/execute.sh +7 -1
- package/config/skills/agent/core/reply-channel/SKILL.md +4 -0
- package/config/skills/agent/core/reply-channel/execute.sh +12 -1
- package/dist/backend/backend/src/constants.d.ts +158 -0
- package/dist/backend/backend/src/constants.d.ts.map +1 -1
- package/dist/backend/backend/src/constants.js +158 -0
- package/dist/backend/backend/src/constants.js.map +1 -1
- package/dist/backend/backend/src/controllers/chat/agent-reply.controller.d.ts.map +1 -1
- package/dist/backend/backend/src/controllers/chat/agent-reply.controller.js +1 -0
- package/dist/backend/backend/src/controllers/chat/agent-reply.controller.js.map +1 -1
- package/dist/backend/backend/src/controllers/chat/chat.controller.d.ts.map +1 -1
- package/dist/backend/backend/src/controllers/chat/chat.controller.js +11 -1
- package/dist/backend/backend/src/controllers/chat/chat.controller.js.map +1 -1
- package/dist/backend/backend/src/controllers/chat-v2/chat-v2.controller.d.ts.map +1 -1
- package/dist/backend/backend/src/controllers/chat-v2/chat-v2.controller.js +50 -0
- package/dist/backend/backend/src/controllers/chat-v2/chat-v2.controller.js.map +1 -1
- package/dist/backend/backend/src/controllers/monitoring/terminal.controller.d.ts +6 -0
- package/dist/backend/backend/src/controllers/monitoring/terminal.controller.d.ts.map +1 -1
- package/dist/backend/backend/src/controllers/monitoring/terminal.controller.js +30 -2
- package/dist/backend/backend/src/controllers/monitoring/terminal.controller.js.map +1 -1
- package/dist/backend/backend/src/controllers/session/session.controller.d.ts.map +1 -1
- package/dist/backend/backend/src/controllers/session/session.controller.js +7 -0
- package/dist/backend/backend/src/controllers/session/session.controller.js.map +1 -1
- package/dist/backend/backend/src/controllers/task-pool/task-pool.controller.d.ts.map +1 -1
- package/dist/backend/backend/src/controllers/task-pool/task-pool.controller.js +4 -1
- package/dist/backend/backend/src/controllers/task-pool/task-pool.controller.js.map +1 -1
- package/dist/backend/backend/src/index.d.ts +28 -0
- package/dist/backend/backend/src/index.d.ts.map +1 -1
- package/dist/backend/backend/src/index.js +141 -35
- package/dist/backend/backend/src/index.js.map +1 -1
- package/dist/backend/backend/src/services/agent/agent-registration.service.d.ts.map +1 -1
- package/dist/backend/backend/src/services/agent/agent-registration.service.js +7 -0
- package/dist/backend/backend/src/services/agent/agent-registration.service.js.map +1 -1
- package/dist/backend/backend/src/services/agent/crewly-agent/crewly-agent-external-runtime.service.d.ts.map +1 -1
- package/dist/backend/backend/src/services/agent/crewly-agent/crewly-agent-external-runtime.service.js +11 -0
- package/dist/backend/backend/src/services/agent/crewly-agent/crewly-agent-external-runtime.service.js.map +1 -1
- package/dist/backend/backend/src/services/agent/fresh-task-conversation.service.d.ts +22 -0
- package/dist/backend/backend/src/services/agent/fresh-task-conversation.service.d.ts.map +1 -1
- package/dist/backend/backend/src/services/agent/fresh-task-conversation.service.js +39 -3
- package/dist/backend/backend/src/services/agent/fresh-task-conversation.service.js.map +1 -1
- package/dist/backend/backend/src/services/agent/in-process-turn-failure.service.d.ts +140 -0
- package/dist/backend/backend/src/services/agent/in-process-turn-failure.service.d.ts.map +1 -0
- package/dist/backend/backend/src/services/agent/in-process-turn-failure.service.js +267 -0
- package/dist/backend/backend/src/services/agent/in-process-turn-failure.service.js.map +1 -0
- package/dist/backend/backend/src/services/chat-v2/chat-v2.dispatcher.service.d.ts +117 -0
- package/dist/backend/backend/src/services/chat-v2/chat-v2.dispatcher.service.d.ts.map +1 -1
- package/dist/backend/backend/src/services/chat-v2/chat-v2.dispatcher.service.js +165 -9
- package/dist/backend/backend/src/services/chat-v2/chat-v2.dispatcher.service.js.map +1 -1
- package/dist/backend/backend/src/services/chat-v2/room-context-backlog.d.ts +93 -0
- package/dist/backend/backend/src/services/chat-v2/room-context-backlog.d.ts.map +1 -0
- package/dist/backend/backend/src/services/chat-v2/room-context-backlog.js +138 -0
- package/dist/backend/backend/src/services/chat-v2/room-context-backlog.js.map +1 -0
- package/dist/backend/backend/src/services/decisions/decision-card.d.ts.map +1 -1
- package/dist/backend/backend/src/services/decisions/decision-card.js +5 -1
- package/dist/backend/backend/src/services/decisions/decision-card.js.map +1 -1
- package/dist/backend/backend/src/services/decisions/decision.service.d.ts +43 -1
- package/dist/backend/backend/src/services/decisions/decision.service.d.ts.map +1 -1
- package/dist/backend/backend/src/services/decisions/decision.service.js +110 -7
- package/dist/backend/backend/src/services/decisions/decision.service.js.map +1 -1
- package/dist/backend/backend/src/services/decisions/decision.wiring.d.ts +2 -0
- package/dist/backend/backend/src/services/decisions/decision.wiring.d.ts.map +1 -1
- package/dist/backend/backend/src/services/decisions/decision.wiring.js +1 -0
- package/dist/backend/backend/src/services/decisions/decision.wiring.js.map +1 -1
- package/dist/backend/backend/src/services/messaging/drain-queued-delivery.d.ts +59 -0
- package/dist/backend/backend/src/services/messaging/drain-queued-delivery.d.ts.map +1 -0
- package/dist/backend/backend/src/services/messaging/drain-queued-delivery.js +70 -0
- package/dist/backend/backend/src/services/messaging/drain-queued-delivery.js.map +1 -0
- package/dist/backend/backend/src/services/messaging/owner-message-watchdog.service.d.ts +46 -1
- package/dist/backend/backend/src/services/messaging/owner-message-watchdog.service.d.ts.map +1 -1
- package/dist/backend/backend/src/services/messaging/owner-message-watchdog.service.js +109 -0
- package/dist/backend/backend/src/services/messaging/owner-message-watchdog.service.js.map +1 -1
- package/dist/backend/backend/src/services/messaging/owner-message-watchdog.wiring.d.ts +2 -0
- package/dist/backend/backend/src/services/messaging/owner-message-watchdog.wiring.d.ts.map +1 -1
- package/dist/backend/backend/src/services/messaging/owner-message-watchdog.wiring.js +6 -0
- package/dist/backend/backend/src/services/messaging/owner-message-watchdog.wiring.js.map +1 -1
- package/dist/backend/backend/src/services/messaging/sub-agent-message-queue.service.d.ts +51 -1
- package/dist/backend/backend/src/services/messaging/sub-agent-message-queue.service.d.ts.map +1 -1
- package/dist/backend/backend/src/services/messaging/sub-agent-message-queue.service.js +73 -3
- package/dist/backend/backend/src/services/messaging/sub-agent-message-queue.service.js.map +1 -1
- package/dist/backend/backend/src/services/monitoring/liveness-monitor.service.d.ts +168 -0
- package/dist/backend/backend/src/services/monitoring/liveness-monitor.service.d.ts.map +1 -0
- package/dist/backend/backend/src/services/monitoring/liveness-monitor.service.js +280 -0
- package/dist/backend/backend/src/services/monitoring/liveness-monitor.service.js.map +1 -0
- package/dist/backend/backend/src/services/open-items/open-items.service.d.ts +21 -0
- package/dist/backend/backend/src/services/open-items/open-items.service.d.ts.map +1 -1
- package/dist/backend/backend/src/services/open-items/open-items.service.js +72 -3
- package/dist/backend/backend/src/services/open-items/open-items.service.js.map +1 -1
- package/dist/backend/backend/src/services/orc/orc-chat-owner-mirror.d.ts +153 -0
- package/dist/backend/backend/src/services/orc/orc-chat-owner-mirror.d.ts.map +1 -0
- package/dist/backend/backend/src/services/orc/orc-chat-owner-mirror.js +276 -0
- package/dist/backend/backend/src/services/orc/orc-chat-owner-mirror.js.map +1 -0
- package/dist/backend/backend/src/services/orc/reply-destination.wiring.d.ts +16 -0
- package/dist/backend/backend/src/services/orc/reply-destination.wiring.d.ts.map +1 -1
- package/dist/backend/backend/src/services/orc/reply-destination.wiring.js +22 -2
- package/dist/backend/backend/src/services/orc/reply-destination.wiring.js.map +1 -1
- package/dist/backend/backend/src/services/restart/in-flight-turn-tracker.service.d.ts +9 -0
- package/dist/backend/backend/src/services/restart/in-flight-turn-tracker.service.d.ts.map +1 -1
- package/dist/backend/backend/src/services/restart/in-flight-turn-tracker.service.js +11 -0
- package/dist/backend/backend/src/services/restart/in-flight-turn-tracker.service.js.map +1 -1
- package/dist/backend/backend/src/services/slack/room-responder.d.ts +144 -0
- package/dist/backend/backend/src/services/slack/room-responder.d.ts.map +1 -0
- package/dist/backend/backend/src/services/slack/room-responder.js +236 -0
- package/dist/backend/backend/src/services/slack/room-responder.js.map +1 -0
- package/dist/backend/backend/src/services/slack/slack-agent-dm.service.d.ts +11 -2
- package/dist/backend/backend/src/services/slack/slack-agent-dm.service.d.ts.map +1 -1
- package/dist/backend/backend/src/services/slack/slack-agent-dm.service.js +22 -1
- package/dist/backend/backend/src/services/slack/slack-agent-dm.service.js.map +1 -1
- package/dist/backend/backend/src/services/slack/slack-initializer.d.ts.map +1 -1
- package/dist/backend/backend/src/services/slack/slack-initializer.js +64 -2
- package/dist/backend/backend/src/services/slack/slack-initializer.js.map +1 -1
- package/dist/backend/backend/src/services/slack/slack-relogin-dm.service.d.ts +8 -2
- package/dist/backend/backend/src/services/slack/slack-relogin-dm.service.d.ts.map +1 -1
- package/dist/backend/backend/src/services/slack/slack-relogin-dm.service.js +7 -4
- package/dist/backend/backend/src/services/slack/slack-relogin-dm.service.js.map +1 -1
- package/dist/backend/backend/src/services/slack/slack-team-channel.service.d.ts +148 -2
- package/dist/backend/backend/src/services/slack/slack-team-channel.service.d.ts.map +1 -1
- package/dist/backend/backend/src/services/slack/slack-team-channel.service.js +784 -231
- package/dist/backend/backend/src/services/slack/slack-team-channel.service.js.map +1 -1
- package/dist/backend/backend/src/services/slack/slack-thread-context.service.d.ts +27 -0
- package/dist/backend/backend/src/services/slack/slack-thread-context.service.d.ts.map +1 -1
- package/dist/backend/backend/src/services/slack/slack-thread-context.service.js +52 -0
- package/dist/backend/backend/src/services/slack/slack-thread-context.service.js.map +1 -1
- package/dist/backend/backend/src/services/slack/slack-typing-placeholder.service.d.ts +30 -5
- package/dist/backend/backend/src/services/slack/slack-typing-placeholder.service.d.ts.map +1 -1
- package/dist/backend/backend/src/services/slack/slack-typing-placeholder.service.js +41 -8
- package/dist/backend/backend/src/services/slack/slack-typing-placeholder.service.js.map +1 -1
- package/dist/backend/backend/src/services/task-pool/task-pool.service.d.ts +1 -0
- package/dist/backend/backend/src/services/task-pool/task-pool.service.d.ts.map +1 -1
- package/dist/backend/backend/src/services/task-pool/task-pool.service.js +8 -3
- package/dist/backend/backend/src/services/task-pool/task-pool.service.js.map +1 -1
- package/dist/backend/backend/src/services/v3/ticket-channel-hooks.d.ts +13 -1
- package/dist/backend/backend/src/services/v3/ticket-channel-hooks.d.ts.map +1 -1
- package/dist/backend/backend/src/services/v3/ticket-channel-hooks.js +36 -3
- package/dist/backend/backend/src/services/v3/ticket-channel-hooks.js.map +1 -1
- package/dist/backend/backend/src/services/v3/workitem-dispatch.subscriber.d.ts +54 -3
- package/dist/backend/backend/src/services/v3/workitem-dispatch.subscriber.d.ts.map +1 -1
- package/dist/backend/backend/src/services/v3/workitem-dispatch.subscriber.js +117 -9
- package/dist/backend/backend/src/services/v3/workitem-dispatch.subscriber.js.map +1 -1
- package/dist/backend/backend/src/types/decision.types.d.ts +7 -0
- package/dist/backend/backend/src/types/decision.types.d.ts.map +1 -1
- package/dist/backend/build-info.json +2 -2
- package/dist/cli/backend/src/constants.d.ts +158 -0
- package/dist/cli/backend/src/constants.d.ts.map +1 -1
- package/dist/cli/backend/src/constants.js +158 -0
- package/dist/cli/backend/src/constants.js.map +1 -1
- package/dist/cli/backend/src/services/agent/agent-registration.service.d.ts.map +1 -1
- package/dist/cli/backend/src/services/agent/agent-registration.service.js +7 -0
- package/dist/cli/backend/src/services/agent/agent-registration.service.js.map +1 -1
- package/dist/cli/backend/src/services/agent/crewly-agent/crewly-agent-external-runtime.service.d.ts.map +1 -1
- package/dist/cli/backend/src/services/agent/crewly-agent/crewly-agent-external-runtime.service.js +11 -0
- package/dist/cli/backend/src/services/agent/crewly-agent/crewly-agent-external-runtime.service.js.map +1 -1
- package/dist/cli/backend/src/services/agent/fresh-task-conversation.service.d.ts +22 -0
- package/dist/cli/backend/src/services/agent/fresh-task-conversation.service.d.ts.map +1 -1
- package/dist/cli/backend/src/services/agent/fresh-task-conversation.service.js +39 -3
- package/dist/cli/backend/src/services/agent/fresh-task-conversation.service.js.map +1 -1
- package/dist/cli/backend/src/services/agent/in-process-turn-failure.service.d.ts +140 -0
- package/dist/cli/backend/src/services/agent/in-process-turn-failure.service.d.ts.map +1 -0
- package/dist/cli/backend/src/services/agent/in-process-turn-failure.service.js +267 -0
- package/dist/cli/backend/src/services/agent/in-process-turn-failure.service.js.map +1 -0
- package/dist/cli/backend/src/services/chat-v2/chat-v2.dispatcher.service.d.ts +117 -0
- package/dist/cli/backend/src/services/chat-v2/chat-v2.dispatcher.service.d.ts.map +1 -1
- package/dist/cli/backend/src/services/chat-v2/chat-v2.dispatcher.service.js +165 -9
- package/dist/cli/backend/src/services/chat-v2/chat-v2.dispatcher.service.js.map +1 -1
- package/dist/cli/backend/src/services/chat-v2/room-context-backlog.d.ts +93 -0
- package/dist/cli/backend/src/services/chat-v2/room-context-backlog.d.ts.map +1 -0
- package/dist/cli/backend/src/services/chat-v2/room-context-backlog.js +138 -0
- package/dist/cli/backend/src/services/chat-v2/room-context-backlog.js.map +1 -0
- package/dist/cli/backend/src/services/decisions/decision-card.d.ts.map +1 -1
- package/dist/cli/backend/src/services/decisions/decision-card.js +5 -1
- package/dist/cli/backend/src/services/decisions/decision-card.js.map +1 -1
- package/dist/cli/backend/src/services/decisions/decision.service.d.ts +43 -1
- package/dist/cli/backend/src/services/decisions/decision.service.d.ts.map +1 -1
- package/dist/cli/backend/src/services/decisions/decision.service.js +110 -7
- package/dist/cli/backend/src/services/decisions/decision.service.js.map +1 -1
- package/dist/cli/backend/src/services/messaging/owner-message-watchdog.service.d.ts +46 -1
- package/dist/cli/backend/src/services/messaging/owner-message-watchdog.service.d.ts.map +1 -1
- package/dist/cli/backend/src/services/messaging/owner-message-watchdog.service.js +109 -0
- package/dist/cli/backend/src/services/messaging/owner-message-watchdog.service.js.map +1 -1
- package/dist/cli/backend/src/services/messaging/sub-agent-message-queue.service.d.ts +51 -1
- package/dist/cli/backend/src/services/messaging/sub-agent-message-queue.service.d.ts.map +1 -1
- package/dist/cli/backend/src/services/messaging/sub-agent-message-queue.service.js +73 -3
- package/dist/cli/backend/src/services/messaging/sub-agent-message-queue.service.js.map +1 -1
- package/dist/cli/backend/src/services/open-items/open-items.service.d.ts +21 -0
- package/dist/cli/backend/src/services/open-items/open-items.service.d.ts.map +1 -1
- package/dist/cli/backend/src/services/open-items/open-items.service.js +72 -3
- package/dist/cli/backend/src/services/open-items/open-items.service.js.map +1 -1
- package/dist/cli/backend/src/services/restart/in-flight-turn-tracker.service.d.ts +9 -0
- package/dist/cli/backend/src/services/restart/in-flight-turn-tracker.service.d.ts.map +1 -1
- package/dist/cli/backend/src/services/restart/in-flight-turn-tracker.service.js +11 -0
- package/dist/cli/backend/src/services/restart/in-flight-turn-tracker.service.js.map +1 -1
- package/dist/cli/backend/src/services/runtime-fallback/reset-time.d.ts +66 -0
- package/dist/cli/backend/src/services/runtime-fallback/reset-time.d.ts.map +1 -0
- package/dist/cli/backend/src/services/runtime-fallback/reset-time.js +211 -0
- package/dist/cli/backend/src/services/runtime-fallback/reset-time.js.map +1 -0
- package/dist/cli/backend/src/services/runtime-fallback/usage-limit-rules.d.ts +113 -0
- package/dist/cli/backend/src/services/runtime-fallback/usage-limit-rules.d.ts.map +1 -0
- package/dist/cli/backend/src/services/runtime-fallback/usage-limit-rules.js +257 -0
- package/dist/cli/backend/src/services/runtime-fallback/usage-limit-rules.js.map +1 -0
- package/dist/cli/backend/src/services/slack/room-responder.d.ts +144 -0
- package/dist/cli/backend/src/services/slack/room-responder.d.ts.map +1 -0
- package/dist/cli/backend/src/services/slack/room-responder.js +236 -0
- package/dist/cli/backend/src/services/slack/room-responder.js.map +1 -0
- package/dist/cli/backend/src/services/slack/slack-agent-dm.service.d.ts +11 -2
- package/dist/cli/backend/src/services/slack/slack-agent-dm.service.d.ts.map +1 -1
- package/dist/cli/backend/src/services/slack/slack-agent-dm.service.js +22 -1
- package/dist/cli/backend/src/services/slack/slack-agent-dm.service.js.map +1 -1
- package/dist/cli/backend/src/services/slack/slack-team-channel.service.d.ts +148 -2
- package/dist/cli/backend/src/services/slack/slack-team-channel.service.d.ts.map +1 -1
- package/dist/cli/backend/src/services/slack/slack-team-channel.service.js +784 -231
- package/dist/cli/backend/src/services/slack/slack-team-channel.service.js.map +1 -1
- package/dist/cli/backend/src/services/slack/slack-thread-context.service.d.ts +27 -0
- package/dist/cli/backend/src/services/slack/slack-thread-context.service.d.ts.map +1 -1
- package/dist/cli/backend/src/services/slack/slack-thread-context.service.js +52 -0
- package/dist/cli/backend/src/services/slack/slack-thread-context.service.js.map +1 -1
- package/dist/cli/backend/src/services/slack/slack-typing-placeholder.service.d.ts +30 -5
- package/dist/cli/backend/src/services/slack/slack-typing-placeholder.service.d.ts.map +1 -1
- package/dist/cli/backend/src/services/slack/slack-typing-placeholder.service.js +41 -8
- package/dist/cli/backend/src/services/slack/slack-typing-placeholder.service.js.map +1 -1
- package/dist/cli/backend/src/services/task-pool/task-pool.service.d.ts +1 -0
- package/dist/cli/backend/src/services/task-pool/task-pool.service.d.ts.map +1 -1
- package/dist/cli/backend/src/services/task-pool/task-pool.service.js +8 -3
- package/dist/cli/backend/src/services/task-pool/task-pool.service.js.map +1 -1
- package/dist/cli/backend/src/services/v3/ticket-channel-hooks.d.ts +13 -1
- package/dist/cli/backend/src/services/v3/ticket-channel-hooks.d.ts.map +1 -1
- package/dist/cli/backend/src/services/v3/ticket-channel-hooks.js +36 -3
- package/dist/cli/backend/src/services/v3/ticket-channel-hooks.js.map +1 -1
- package/dist/cli/backend/src/types/decision.types.d.ts +7 -0
- package/dist/cli/backend/src/types/decision.types.d.ts.map +1 -1
- package/package.json +1 -1
|
@@ -0,0 +1,267 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Failed turns of the in-process Crewly Agent runtime (crewly#1015 §2).
|
|
3
|
+
*
|
|
4
|
+
* A turn of the in-process runtime that throws (DeepSeek "No output
|
|
5
|
+
* generated", an out-of-credit account, a crashed worker) used to be logged
|
|
6
|
+
* and nothing else: the message was gone, nobody was told. On 2026-10-01 the
|
|
7
|
+
* orchestrator failed about 80 turns that way over ~20 hours.
|
|
8
|
+
*
|
|
9
|
+
* Now:
|
|
10
|
+
* 1. The same message is delivered once more after RETRY_DELAY_MS (through
|
|
11
|
+
* `sendMessageToAgent`, so a runtime switch, the token cap or the
|
|
12
|
+
* restart drain can queue it instead).
|
|
13
|
+
* Not when the account is out of credit / quota (it fails the same way),
|
|
14
|
+
* and not when the agent is stopped or not running (the message is
|
|
15
|
+
* queued for its next start instead — that is no model failure).
|
|
16
|
+
* 2. When that fails too, the owner messages the agent owes are parked by the
|
|
17
|
+
* owner-message watchdog (owner told once, message kept and re-delivered
|
|
18
|
+
* on a backing-off timer, never on a timer for credit / quota), and the
|
|
19
|
+
* failure is reported ONCE per episode — for a member to the
|
|
20
|
+
* orchestrator, for the orchestrator to the owner — until a turn succeeds.
|
|
21
|
+
* 3. The agent's next successful turn re-delivers the parked owner messages.
|
|
22
|
+
*
|
|
23
|
+
* Harness text is English. The service never throws into its callers.
|
|
24
|
+
*
|
|
25
|
+
* @module services/agent/in-process-turn-failure.service
|
|
26
|
+
* @see specs/2026-10-03-harness-drop-gaps.md §2
|
|
27
|
+
*/
|
|
28
|
+
import { createHash } from 'crypto';
|
|
29
|
+
import { IN_PROCESS_TURN_FAILURE_CONSTANTS as C, ORCHESTRATOR_SESSION_NAME } from '../../constants.js';
|
|
30
|
+
import { LoggerService } from '../core/logger.service.js';
|
|
31
|
+
/**
|
|
32
|
+
* Whether a turn error means the account is out of credit / quota: nothing
|
|
33
|
+
* helps until the owner tops up or the agent moves to another runtime.
|
|
34
|
+
*
|
|
35
|
+
* @param error - What the turn rejected with
|
|
36
|
+
* @returns True for `billing` / `usage_limit`
|
|
37
|
+
*/
|
|
38
|
+
export function isCreditFailure(error) {
|
|
39
|
+
const kind = error?.usageLimitKind;
|
|
40
|
+
return kind === 'billing' || kind === 'usage_limit';
|
|
41
|
+
}
|
|
42
|
+
/**
|
|
43
|
+
* The reason of a failed turn in plain words, for the owner and the orchestrator.
|
|
44
|
+
*
|
|
45
|
+
* @param error - What the turn rejected with (`usageLimitKind` is set by the
|
|
46
|
+
* external runtime when a usage-limit rule matched its stderr)
|
|
47
|
+
* @returns A short phrase
|
|
48
|
+
*
|
|
49
|
+
* @example
|
|
50
|
+
* ```typescript
|
|
51
|
+
* describeTurnError(Object.assign(new Error('No output generated.'), { usageLimitKind: 'billing' }));
|
|
52
|
+
* // 'the model account is out of credit'
|
|
53
|
+
* ```
|
|
54
|
+
*/
|
|
55
|
+
export function describeTurnError(error) {
|
|
56
|
+
const kind = error?.usageLimitKind;
|
|
57
|
+
if (kind === 'billing')
|
|
58
|
+
return 'the model account is out of credit';
|
|
59
|
+
if (kind === 'usage_limit')
|
|
60
|
+
return "the model's usage limit was reached";
|
|
61
|
+
if (kind === 'transient')
|
|
62
|
+
return 'the model provider is rate-limiting';
|
|
63
|
+
const message = error instanceof Error ? error.message : String(error ?? '');
|
|
64
|
+
if (/no output generated/i.test(message))
|
|
65
|
+
return 'the model returned no output';
|
|
66
|
+
const one = message.replace(/\s+/g, ' ').trim();
|
|
67
|
+
if (!one)
|
|
68
|
+
return 'unknown error';
|
|
69
|
+
return one.length > C.ERROR_CHARS ? `${one.slice(0, C.ERROR_CHARS)}…` : one;
|
|
70
|
+
}
|
|
71
|
+
/**
|
|
72
|
+
* Retries and reports failed in-process turns.
|
|
73
|
+
*
|
|
74
|
+
* One report per failure EPISODE: from the first reported failure until the
|
|
75
|
+
* agent completes a turn again, later failures are counted, not reported
|
|
76
|
+
* (crewly#1015 review B2: ~40 notices a day while credit was out).
|
|
77
|
+
*/
|
|
78
|
+
export class InProcessTurnFailureService {
|
|
79
|
+
deps;
|
|
80
|
+
logger;
|
|
81
|
+
/** `<session>\0<message hash>` → retries made and when the first failure was */
|
|
82
|
+
attempts = new Map();
|
|
83
|
+
/** Agents in a reported failure episode → failures since the report */
|
|
84
|
+
failing = new Map();
|
|
85
|
+
/**
|
|
86
|
+
* @param deps - Injected behaviour
|
|
87
|
+
*/
|
|
88
|
+
constructor(deps) {
|
|
89
|
+
this.deps = deps;
|
|
90
|
+
this.logger = LoggerService.getInstance().createComponentLogger('InProcessTurnFailure');
|
|
91
|
+
}
|
|
92
|
+
now() {
|
|
93
|
+
return this.deps.now ? this.deps.now() : Date.now();
|
|
94
|
+
}
|
|
95
|
+
/**
|
|
96
|
+
* A turn threw. Retry the message once (unless it cannot help); after
|
|
97
|
+
* that, report — once per failure episode.
|
|
98
|
+
*
|
|
99
|
+
* @param sessionName - The agent
|
|
100
|
+
* @param message - The message it was handling
|
|
101
|
+
* @param error - What the turn rejected with
|
|
102
|
+
*/
|
|
103
|
+
onTurnFailed(sessionName, message, error) {
|
|
104
|
+
try {
|
|
105
|
+
// Stopped on purpose (by the owner) or not running: not a model
|
|
106
|
+
// failure. The message waits for the agent's next start.
|
|
107
|
+
if (this.agentIsDown(sessionName)) {
|
|
108
|
+
this.hold(sessionName, message, 'the agent is not running');
|
|
109
|
+
return;
|
|
110
|
+
}
|
|
111
|
+
const detail = describeTurnError(error);
|
|
112
|
+
const needsCredit = isCreditFailure(error);
|
|
113
|
+
this.prune();
|
|
114
|
+
const key = `${sessionName}\0${createHash('sha1').update(message).digest('hex')}`;
|
|
115
|
+
const seen = this.attempts.get(key);
|
|
116
|
+
const count = seen?.count ?? 0;
|
|
117
|
+
// Out of credit / quota: a retry in a minute fails the same way.
|
|
118
|
+
if (!needsCredit && count < C.MAX_RETRIES) {
|
|
119
|
+
const failedAt = this.now();
|
|
120
|
+
this.attempts.set(key, { count: count + 1, at: seen?.at ?? failedAt });
|
|
121
|
+
this.logger.warn('In-process turn failed — delivering the message once more', {
|
|
122
|
+
sessionName,
|
|
123
|
+
detail,
|
|
124
|
+
inSeconds: Math.round(C.RETRY_DELAY_MS / 1000),
|
|
125
|
+
});
|
|
126
|
+
const timer = (this.deps.setTimer ?? ((fn, ms) => setTimeout(fn, ms)))(() => void this.retry(sessionName, message, detail, failedAt), C.RETRY_DELAY_MS);
|
|
127
|
+
timer?.unref?.();
|
|
128
|
+
return;
|
|
129
|
+
}
|
|
130
|
+
// The key is kept (until ATTEMPT_TTL_MS): a later failure of this
|
|
131
|
+
// same message goes straight here, without another retry.
|
|
132
|
+
if (!seen)
|
|
133
|
+
this.attempts.set(key, { count, at: this.now() });
|
|
134
|
+
this.giveUp(sessionName, message, detail, needsCredit, 'failed');
|
|
135
|
+
}
|
|
136
|
+
catch (err) {
|
|
137
|
+
this.logger.warn('Handling a failed in-process turn failed', { sessionName, error: err instanceof Error ? err.message : String(err) });
|
|
138
|
+
}
|
|
139
|
+
}
|
|
140
|
+
/**
|
|
141
|
+
* A turn completed: the failure episode is over. The parked owner
|
|
142
|
+
* messages are re-delivered.
|
|
143
|
+
*
|
|
144
|
+
* @param sessionName - The agent
|
|
145
|
+
*/
|
|
146
|
+
onTurnSucceeded(sessionName) {
|
|
147
|
+
const since = this.failing.get(sessionName);
|
|
148
|
+
if (since === undefined)
|
|
149
|
+
return;
|
|
150
|
+
this.failing.delete(sessionName);
|
|
151
|
+
this.logger.info('In-process agent completed a turn again after failures', { sessionName, failuresSinceReport: since });
|
|
152
|
+
void (this.deps.resumeOwnerMessages?.(sessionName) ?? Promise.resolve(0)).catch((err) => this.logger.warn('Could not re-deliver parked owner messages', { sessionName, error: err instanceof Error ? err.message : String(err) }));
|
|
153
|
+
}
|
|
154
|
+
agentIsDown(sessionName) {
|
|
155
|
+
try {
|
|
156
|
+
if (this.deps.isOwnerStopped?.(sessionName))
|
|
157
|
+
return true;
|
|
158
|
+
return this.deps.isRunning ? !this.deps.isRunning(sessionName) : false;
|
|
159
|
+
}
|
|
160
|
+
catch {
|
|
161
|
+
return false;
|
|
162
|
+
}
|
|
163
|
+
}
|
|
164
|
+
hold(sessionName, message, why) {
|
|
165
|
+
try {
|
|
166
|
+
this.deps.queueForAgent?.(sessionName, message);
|
|
167
|
+
}
|
|
168
|
+
catch (err) {
|
|
169
|
+
this.logger.warn('Could not queue the message for the stopped agent', { sessionName, error: err instanceof Error ? err.message : String(err) });
|
|
170
|
+
}
|
|
171
|
+
this.logger.info('Turn not completed and not retried — message queued for the agent\'s next start', { sessionName, why });
|
|
172
|
+
}
|
|
173
|
+
async retry(sessionName, message, detail, failedAt) {
|
|
174
|
+
// The failed turn may have answered before it threw: a second turn
|
|
175
|
+
// would answer twice (crewly#1015 review H3).
|
|
176
|
+
try {
|
|
177
|
+
if (this.deps.answeredSince?.(sessionName, message, failedAt - C.RETRY_DELAY_MS)) {
|
|
178
|
+
this.logger.info('Failed turn had already answered — not retrying', { sessionName });
|
|
179
|
+
return;
|
|
180
|
+
}
|
|
181
|
+
}
|
|
182
|
+
catch {
|
|
183
|
+
/* retry */
|
|
184
|
+
}
|
|
185
|
+
if (this.agentIsDown(sessionName)) {
|
|
186
|
+
this.hold(sessionName, message, 'the agent stopped before the retry');
|
|
187
|
+
return;
|
|
188
|
+
}
|
|
189
|
+
let result;
|
|
190
|
+
try {
|
|
191
|
+
result = await this.deps.redeliver(sessionName, message);
|
|
192
|
+
}
|
|
193
|
+
catch (err) {
|
|
194
|
+
result = { success: false, error: err instanceof Error ? err.message : String(err) };
|
|
195
|
+
}
|
|
196
|
+
// Delivered (its turn reports again if it fails) or queued (a runtime
|
|
197
|
+
// switch, the token cap, the drain — that queue reports its drops).
|
|
198
|
+
if (result.success || result.queued)
|
|
199
|
+
return;
|
|
200
|
+
if (this.agentIsDown(sessionName)) {
|
|
201
|
+
this.hold(sessionName, message, 'the agent stopped before the retry');
|
|
202
|
+
return;
|
|
203
|
+
}
|
|
204
|
+
this.giveUp(sessionName, message, `${detail}; delivering it again failed: ${result.error ?? 'unknown error'}`, false, 'undeliverable');
|
|
205
|
+
}
|
|
206
|
+
giveUp(sessionName, message, detail, needsCredit, how) {
|
|
207
|
+
this.logger.error('In-process turn failed again', { sessionName, detail, needsCredit, messagePreview: preview(message, 80) });
|
|
208
|
+
void (this.deps.noteOwnerMessages?.(sessionName, detail, { needsCredit }) ?? Promise.resolve(0)).catch((err) => this.logger.warn('Could not tell the owner about a failed turn', { sessionName, error: err instanceof Error ? err.message : String(err) }));
|
|
209
|
+
const since = this.failing.get(sessionName);
|
|
210
|
+
if (since !== undefined) {
|
|
211
|
+
// Same episode: already reported.
|
|
212
|
+
this.failing.set(sessionName, since + 1);
|
|
213
|
+
return;
|
|
214
|
+
}
|
|
215
|
+
this.failing.set(sessionName, 0);
|
|
216
|
+
const name = this.deps.displayName?.(sessionName) || sessionName;
|
|
217
|
+
const what = how === 'failed'
|
|
218
|
+
? needsCredit
|
|
219
|
+
? `${name}'s model run failed (${detail}).`
|
|
220
|
+
: `${name}'s model run failed twice on the same message (${detail}).`
|
|
221
|
+
: `${name}'s model run failed and the message could not be delivered to it again (${detail}).`;
|
|
222
|
+
const consequence = sessionName === ORCHESTRATOR_SESSION_NAME
|
|
223
|
+
? ' Until this is fixed the orchestrator answers nothing; your own messages to it are kept and re-delivered once it works again.'
|
|
224
|
+
: ` Owner messages ${name} owes are kept and re-delivered once it works again; anything else sent to ${name} needs sending again.`;
|
|
225
|
+
const text = `${what} The message was: "${preview(message, C.PREVIEW_CHARS)}".${consequence} No further notices until it completes a run.`;
|
|
226
|
+
try {
|
|
227
|
+
this.deps.report(sessionName, text, message);
|
|
228
|
+
}
|
|
229
|
+
catch (err) {
|
|
230
|
+
this.logger.warn('Could not report a failed turn', { sessionName, error: err instanceof Error ? err.message : String(err) });
|
|
231
|
+
}
|
|
232
|
+
}
|
|
233
|
+
prune() {
|
|
234
|
+
const cutoff = this.now() - C.ATTEMPT_TTL_MS;
|
|
235
|
+
for (const [k, v] of this.attempts)
|
|
236
|
+
if (v.at < cutoff)
|
|
237
|
+
this.attempts.delete(k);
|
|
238
|
+
}
|
|
239
|
+
}
|
|
240
|
+
/**
|
|
241
|
+
* One-line preview of a message, without its routing header.
|
|
242
|
+
*
|
|
243
|
+
* @param message - Message text
|
|
244
|
+
* @param max - Limit
|
|
245
|
+
* @returns Preview
|
|
246
|
+
*/
|
|
247
|
+
function preview(message, max) {
|
|
248
|
+
let body = message;
|
|
249
|
+
for (;;) {
|
|
250
|
+
const next = body.replace(/^\s*\[(?:G?CHAT|SLACK|SLACK-THREAD)[^\]]*\]\s*/, '');
|
|
251
|
+
if (next === body)
|
|
252
|
+
break;
|
|
253
|
+
body = next;
|
|
254
|
+
}
|
|
255
|
+
body = body.replace(/\s+/g, ' ').trim();
|
|
256
|
+
return body.length > max ? `${body.slice(0, max)}…` : body;
|
|
257
|
+
}
|
|
258
|
+
let instance = null;
|
|
259
|
+
/** @returns The wired service, or null before boot (and in tests) */
|
|
260
|
+
export function getInProcessTurnFailureService() {
|
|
261
|
+
return instance;
|
|
262
|
+
}
|
|
263
|
+
/** @param service - The service to expose (null to clear) */
|
|
264
|
+
export function setInProcessTurnFailureService(service) {
|
|
265
|
+
instance = service;
|
|
266
|
+
}
|
|
267
|
+
//# sourceMappingURL=in-process-turn-failure.service.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"in-process-turn-failure.service.js","sourceRoot":"","sources":["../../../../../../backend/src/services/agent/in-process-turn-failure.service.ts"],"names":[],"mappings":"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"}
|
|
@@ -21,6 +21,7 @@
|
|
|
21
21
|
*/
|
|
22
22
|
import type { ChatChannelDTO, ChatMessageDTO } from './types.js';
|
|
23
23
|
import type { ChatV2MentionResolver, MentionTarget } from './chat-v2.mention-resolver.js';
|
|
24
|
+
import { RoomContextBacklog } from './room-context-backlog.js';
|
|
24
25
|
/**
|
|
25
26
|
* Minimal surface the dispatcher needs from the agent-registration service.
|
|
26
27
|
* Typed explicitly so tests can pass a stub without pulling in the full
|
|
@@ -69,6 +70,12 @@ export interface HuddleDispatchOutcome {
|
|
|
69
70
|
responseMode: 'required' | 'optional';
|
|
70
71
|
/** Whether the prompt was successfully queued for the member. */
|
|
71
72
|
dispatched: boolean;
|
|
73
|
+
/**
|
|
74
|
+
* The agent was busy: the prompt waits on its queue (`[AGENT_BUSY]` hold)
|
|
75
|
+
* and reaches it when it is idle. It holds the message — nobody else should
|
|
76
|
+
* be handed it meanwhile.
|
|
77
|
+
*/
|
|
78
|
+
queued?: boolean;
|
|
72
79
|
/** Error message, if delivery failed. */
|
|
73
80
|
error?: string;
|
|
74
81
|
/**
|
|
@@ -109,6 +116,51 @@ export interface DispatchMessageResult {
|
|
|
109
116
|
* `responseMode: 'required'`; the rest are `'optional'`.
|
|
110
117
|
*/
|
|
111
118
|
huddleOutcomes?: HuddleDispatchOutcome[];
|
|
119
|
+
/**
|
|
120
|
+
* One-responder dispatches (Slack rooms): local members that were not
|
|
121
|
+
* delivered the message but got it queued as context only, for their
|
|
122
|
+
* next prompt from this room (specs/2026-10-03-one-responder-per-message.md).
|
|
123
|
+
*/
|
|
124
|
+
contextOnly?: string[];
|
|
125
|
+
}
|
|
126
|
+
/**
|
|
127
|
+
* A responder fixed by the caller from data only it has
|
|
128
|
+
* (specs/2026-10-03-one-responder-per-message.md §1 a / c).
|
|
129
|
+
*/
|
|
130
|
+
export interface PinnedResponder {
|
|
131
|
+
/**
|
|
132
|
+
* The local member that answers. Null: nobody here answers — the
|
|
133
|
+
* decision path already delivered it, or the responder runs on another
|
|
134
|
+
* machine.
|
|
135
|
+
*/
|
|
136
|
+
session: string | null;
|
|
137
|
+
/** The responder's display name, for the context-only line */
|
|
138
|
+
name?: string;
|
|
139
|
+
/** Why this responder */
|
|
140
|
+
reason: 'decision' | 'decision-consumed' | 'thread-owner' | 'deferred';
|
|
141
|
+
/** Who answers it, wherever it runs (local session or Cloud's name); recorded for the reply gate */
|
|
142
|
+
answeredBy?: string;
|
|
143
|
+
/**
|
|
144
|
+
* Nobody here answers, but this machine runs the 90 s unanswered watch
|
|
145
|
+
* (it is the room's owner machine): an owner message is never left
|
|
146
|
+
* without a watcher (specs/2026-10-03-one-responder-per-message.md §4).
|
|
147
|
+
*/
|
|
148
|
+
watchHere?: boolean;
|
|
149
|
+
/**
|
|
150
|
+
* With `watchHere`: this machine only tells the owner if nobody has
|
|
151
|
+
* answered by `NOTE_ONLY_WATCH_MS`, and never hands the message over — it
|
|
152
|
+
* is not the room's watcher, or cannot tell whether it is.
|
|
153
|
+
*/
|
|
154
|
+
watchNoteOnly?: boolean;
|
|
155
|
+
/** A local member that already holds the message (the decision's asker): no context entry for it */
|
|
156
|
+
alreadyHas?: string;
|
|
157
|
+
}
|
|
158
|
+
/** One responder per owner message (Slack rooms). */
|
|
159
|
+
export interface OneResponderOptions {
|
|
160
|
+
/** Set when the caller already knows the responder (decision card, Slack thread owner) */
|
|
161
|
+
pinned?: PinnedResponder;
|
|
162
|
+
/** Display name of a local session, for the context-only line */
|
|
163
|
+
nameFor?: (agentSession: string) => string | undefined;
|
|
112
164
|
}
|
|
113
165
|
/** Constructor options for {@link ChatV2DispatcherService}. */
|
|
114
166
|
export interface ChatV2DispatcherOptions {
|
|
@@ -182,6 +234,8 @@ export interface ChatV2DispatcherOptions {
|
|
|
182
234
|
* would rather not spend the tokens simply leaves it out.
|
|
183
235
|
*/
|
|
184
236
|
recentTurnsFor?: (channelId: string, threadId?: string) => readonly ChatContextTurn[];
|
|
237
|
+
/** Context-only queue (one-responder rooms); a private one when omitted */
|
|
238
|
+
contextBacklog?: RoomContextBacklog;
|
|
185
239
|
}
|
|
186
240
|
/** One earlier message, as the prompt will show it. */
|
|
187
241
|
export interface ChatContextTurn {
|
|
@@ -279,6 +333,13 @@ export interface FormatPromptArgs {
|
|
|
279
333
|
slackThreadKey?: string;
|
|
280
334
|
/** See {@link DispatchMessageOptions.peopleAddressing}. */
|
|
281
335
|
peopleAddressing?: PeopleAddressing;
|
|
336
|
+
/**
|
|
337
|
+
* Set when this agent is the one responder the harness chose for the
|
|
338
|
+
* room; the others only got the message as context.
|
|
339
|
+
*/
|
|
340
|
+
soleResponder?: boolean;
|
|
341
|
+
/** Context-only room messages queued since this agent's last prompt from the room, rendered */
|
|
342
|
+
contextOnlyBlock?: string;
|
|
282
343
|
}
|
|
283
344
|
/**
|
|
284
345
|
* Who a Slack room message was meant for, when people are involved — the
|
|
@@ -333,6 +394,12 @@ export interface DispatchMessageOptions {
|
|
|
333
394
|
slackContextFor?: (agentSession: string) => string;
|
|
334
395
|
/** People the message (or the exchange it may continue) was addressed to; rendered as an `Addressed to:` line. */
|
|
335
396
|
peopleAddressing?: PeopleAddressing;
|
|
397
|
+
/**
|
|
398
|
+
* Choose exactly one responder; every other member gets the message as
|
|
399
|
+
* context only (specs/2026-10-03-one-responder-per-message.md). Omitted:
|
|
400
|
+
* the older fan-out (chat-UI huddles, agent-authored messages).
|
|
401
|
+
*/
|
|
402
|
+
oneResponder?: OneResponderOptions;
|
|
336
403
|
}
|
|
337
404
|
/** What the Slack bridge knows about a room's presence, from this machine's point of view. */
|
|
338
405
|
export interface HuddleRoomState {
|
|
@@ -414,6 +481,11 @@ export declare function isSilentByDefault(addressing: PeopleAddressing | undefin
|
|
|
414
481
|
* @returns The line, or null when there is nothing to say
|
|
415
482
|
*/
|
|
416
483
|
export declare function peopleAddressingLine(args: FormatPromptArgs, mode: 'required' | 'optional'): string | null;
|
|
484
|
+
/**
|
|
485
|
+
* Told to the one agent the harness picked to answer a room message
|
|
486
|
+
* (specs/2026-10-03-one-responder-per-message.md).
|
|
487
|
+
*/
|
|
488
|
+
export declare const SOLE_RESPONDER_LINE = "Responder: you are the one agent answering this for the room; the others only see it as context and will not reply. If a colleague should answer instead, @ them in your reply.";
|
|
417
489
|
export declare function defaultFormatPrompt(args: FormatPromptArgs): string;
|
|
418
490
|
/**
|
|
419
491
|
* Dispatches user-origin chat messages to the agent session bound to the
|
|
@@ -432,6 +504,8 @@ export declare class ChatV2DispatcherService {
|
|
|
432
504
|
private readonly recentTurnsFor?;
|
|
433
505
|
private readonly onDispatched?;
|
|
434
506
|
private readonly refuseDelivery?;
|
|
507
|
+
/** Room messages queued as context only, shown on each agent's next prompt from the room */
|
|
508
|
+
readonly contextBacklog: RoomContextBacklog;
|
|
435
509
|
private readonly logger;
|
|
436
510
|
constructor(options: ChatV2DispatcherOptions);
|
|
437
511
|
/**
|
|
@@ -519,6 +593,18 @@ export declare class ChatV2DispatcherService {
|
|
|
519
593
|
* @returns Aggregate result with one outcome per member.
|
|
520
594
|
*/
|
|
521
595
|
private dispatchHuddleBroadcast;
|
|
596
|
+
/**
|
|
597
|
+
* Queue a room message as context only for the members that are not
|
|
598
|
+
* answering it — no turn, no wake-up. Each sees it at the top of its next
|
|
599
|
+
* prompt from this room (specs/2026-10-03-one-responder-per-message.md).
|
|
600
|
+
*
|
|
601
|
+
* @param channel - The room
|
|
602
|
+
* @param message - The message
|
|
603
|
+
* @param options - Dispatch options (thread id)
|
|
604
|
+
* @param sessions - Members that only listen
|
|
605
|
+
* @param responderName - Who answers it, when anyone does
|
|
606
|
+
*/
|
|
607
|
+
private queueContextOnly;
|
|
522
608
|
/**
|
|
523
609
|
* Who a huddle message will be delivered to, and which of them owe a reply —
|
|
524
610
|
* without delivering it.
|
|
@@ -547,6 +633,37 @@ export declare class ChatV2DispatcherService {
|
|
|
547
633
|
* @returns Targets with their reply obligation, who was @'d, and who was woken to route it
|
|
548
634
|
*/
|
|
549
635
|
private computeHuddleTargets;
|
|
636
|
+
/**
|
|
637
|
+
* Exactly one responder (specs/2026-10-03-one-responder-per-message.md §1):
|
|
638
|
+
* b. @-mentioned members (an explicit @ always wins) → required;
|
|
639
|
+
* a/c. the caller's pinned responder — the decision's asker, or the
|
|
640
|
+
* Slack thread's owner (null: nobody here) → required;
|
|
641
|
+
* c'. no pin, a thread reply: the agent that spoke last in it here;
|
|
642
|
+
* d. otherwise the room rules, narrowed to one: the leader when awake,
|
|
643
|
+
* else the awake agent that spoke last in the room, else the first
|
|
644
|
+
* awake one — optional, as the leader always was. Nobody awake: the
|
|
645
|
+
* existing wake-up rules.
|
|
646
|
+
* Every other member listens: context only.
|
|
647
|
+
*
|
|
648
|
+
* @param channel - The huddle
|
|
649
|
+
* @param message - The message
|
|
650
|
+
* @param options - Dispatch options
|
|
651
|
+
* @param one - The one-responder options
|
|
652
|
+
* @param memberSet - Members that may hear it (author excluded)
|
|
653
|
+
* @param mentioned - Members @'d
|
|
654
|
+
* @returns Targets, context-only members and the responder's name
|
|
655
|
+
*/
|
|
656
|
+
private computeOneResponder;
|
|
657
|
+
/**
|
|
658
|
+
* Of several awake members, the one that answers an un-@'d message: the
|
|
659
|
+
* room's leader, else whoever of them spoke last in the room, else the
|
|
660
|
+
* first by session name (a stable choice).
|
|
661
|
+
*
|
|
662
|
+
* @param channelId - The room
|
|
663
|
+
* @param awake - Awake members (non-empty)
|
|
664
|
+
* @returns One of them
|
|
665
|
+
*/
|
|
666
|
+
private pickOneAwake;
|
|
550
667
|
/**
|
|
551
668
|
* Deliver a huddle message to the targets {@link computeHuddleTargets} chose.
|
|
552
669
|
*
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"chat-v2.dispatcher.service.d.ts","sourceRoot":"","sources":["../../../../../../backend/src/services/chat-v2/chat-v2.dispatcher.service.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;GAoBG;AAEH,OAAO,KAAK,EAAE,cAAc,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AACjE,OAAO,KAAK,EACV,qBAAqB,EAErB,aAAa,EACd,MAAM,+BAA+B,CAAC;
|
|
1
|
+
{"version":3,"file":"chat-v2.dispatcher.service.d.ts","sourceRoot":"","sources":["../../../../../../backend/src/services/chat-v2/chat-v2.dispatcher.service.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;GAoBG;AAEH,OAAO,KAAK,EAAE,cAAc,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AACjE,OAAO,KAAK,EACV,qBAAqB,EAErB,aAAa,EACd,MAAM,+BAA+B,CAAC;AAOvC,OAAO,EAAE,kBAAkB,EAA0B,MAAM,2BAA2B,CAAC;AAMvF;;;;GAIG;AACH,MAAM,WAAW,gBAAgB;IAC/B,kBAAkB,CAChB,WAAW,EAAE,MAAM,EACnB,OAAO,EAAE,MAAM,GACd,OAAO,CAAC;QAAE,OAAO,EAAE,OAAO,CAAC;QAAC,KAAK,CAAC,EAAE,MAAM,CAAC;QAAC,OAAO,CAAC,EAAE,MAAM,CAAC;QAAC,MAAM,CAAC,EAAE,OAAO,CAAA;KAAE,CAAC,CAAC;CACtF;AAED,4CAA4C;AAC5C,MAAM,WAAW,cAAc;IAC7B,8EAA8E;IAC9E,UAAU,EAAE,OAAO,CAAC;IACpB,0CAA0C;IAC1C,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,+DAA+D;AAC/D,MAAM,WAAW,sBAAsB;IACrC,iEAAiE;IACjE,MAAM,EAAE,aAAa,CAAC;IACtB,6EAA6E;IAC7E,UAAU,EAAE,OAAO,CAAC;IACpB,yCAAyC;IACzC,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED;;;;;;;GAOG;AACH,MAAM,WAAW,qBAAqB;IACpC,mCAAmC;IACnC,WAAW,EAAE,MAAM,CAAC;IACpB;;;;OAIG;IACH,YAAY,EAAE,UAAU,GAAG,UAAU,CAAC;IACtC,iEAAiE;IACjE,UAAU,EAAE,OAAO,CAAC;IACpB;;;;OAIG;IACH,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,yCAAyC;IACzC,KAAK,CAAC,EAAE,MAAM,CAAC;IACf;;;;OAIG;IACH,eAAe,CAAC,EAAE,OAAO,CAAC;CAC3B;AAED;;;;GAIG;AACH,MAAM,WAAW,qBAAqB;IACpC;;;;;;OAMG;IACH,QAAQ,EAAE,IAAI,GAAG,kBAAkB,GAAG,kBAAkB,GAAG,MAAM,CAAC;IAClE,4DAA4D;IAC5D,UAAU,EAAE,OAAO,CAAC;IACpB,yCAAyC;IACzC,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,yCAAyC;IACzC,QAAQ,CAAC,EAAE,cAAc,CAAC;IAC1B;;;OAGG;IACH,eAAe,CAAC,EAAE,sBAAsB,EAAE,CAAC;IAC3C;;;;OAIG;IACH,cAAc,CAAC,EAAE,qBAAqB,EAAE,CAAC;IACzC;;;;OAIG;IACH,WAAW,CAAC,EAAE,MAAM,EAAE,CAAC;CACxB;AAED;;;GAGG;AACH,MAAM,WAAW,eAAe;IAC9B;;;;OAIG;IACH,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;IACvB,8DAA8D;IAC9D,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,yBAAyB;IACzB,MAAM,EAAE,UAAU,GAAG,mBAAmB,GAAG,cAAc,GAAG,UAAU,CAAC;IACvE,oGAAoG;IACpG,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB;;;;OAIG;IACH,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB;;;;OAIG;IACH,aAAa,CAAC,EAAE,OAAO,CAAC;IACxB,oGAAoG;IACpG,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAED,qDAAqD;AACrD,MAAM,WAAW,mBAAmB;IAClC,0FAA0F;IAC1F,MAAM,CAAC,EAAE,eAAe,CAAC;IACzB,iEAAiE;IACjE,OAAO,CAAC,EAAE,CAAC,YAAY,EAAE,MAAM,KAAK,MAAM,GAAG,SAAS,CAAC;CACxD;AAED,+DAA+D;AAC/D,MAAM,WAAW,uBAAuB;IACtC,SAAS,EAAE,gBAAgB,CAAC;IAC5B;;;;;OAKG;IACH,YAAY,CAAC,EAAE,CAAC,OAAO,EAAE,cAAc,EAAE,OAAO,EAAE,cAAc,EAAE,MAAM,EAAE,qBAAqB,KAAK,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IACzH;;;;OAIG;IACH,cAAc,CAAC,EAAE,CAAC,WAAW,EAAE,MAAM,EAAE,OAAO,EAAE,cAAc,KAAK,OAAO,CAAC,OAAO,CAAC,CAAC;IACpF;;;OAGG;IACH,YAAY,CAAC,EAAE,CAAC,IAAI,EAAE,gBAAgB,KAAK,MAAM,CAAC;IAClD;;;;;;;OAOG;IACH,eAAe,CAAC,EAAE,qBAAqB,CAAC;IACxC;;;;;;;;;OASG;IACH,gBAAgB,CAAC,EAAE,CAAC,SAAS,EAAE,MAAM,KAAK,SAAS,MAAM,EAAE,CAAC;IAC5D;;;;OAIG;IACH,qBAAqB,CAAC,EAAE,CAAC,SAAS,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,KAAK,SAAS,MAAM,EAAE,CAAC;IACnF,6EAA6E;IAC7E,oBAAoB,CAAC,EAAE,CAAC,SAAS,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,KAAK,MAAM,GAAG,IAAI,CAAC;IAC9E;;;;;OAKG;IACH,eAAe,CAAC,EAAE,CAAC,SAAS,EAAE,MAAM,KAAK,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAAC;IAChE;;;;;;OAMG;IACH,aAAa,CAAC,EAAE,CAAC,YAAY,EAAE,MAAM,KAAK,OAAO,CAAC,OAAO,CAAC,CAAC;IAC3D;;;;;;OAMG;IACH,cAAc,CAAC,EAAE,CAAC,SAAS,EAAE,MAAM,EAAE,QAAQ,CAAC,EAAE,MAAM,KAAK,SAAS,eAAe,EAAE,CAAC;IACtF,2EAA2E;IAC3E,cAAc,CAAC,EAAE,kBAAkB,CAAC;CACrC;AAED,uDAAuD;AACvD,MAAM,WAAW,eAAe;IAC9B,sDAAsD;IACtD,QAAQ,EAAE,MAAM,CAAC;IACjB,qBAAqB;IACrB,OAAO,EAAE,MAAM,CAAC;IAChB,qBAAqB;IACrB,SAAS,EAAE,MAAM,CAAC;IAClB,6EAA6E;IAC7E,QAAQ,CAAC,EAAE,OAAO,CAAC;CACpB;AAED,sCAAsC;AACtC,MAAM,WAAW,gBAAgB;IAC/B,+DAA+D;IAC/D,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB;;;;;;;OAOG;IACH,iBAAiB,CAAC,EAAE,OAAO,CAAC;IAC5B,SAAS,EAAE,MAAM,CAAC;IAClB,WAAW,EAAE,MAAM,CAAC;IACpB,YAAY,EAAE,MAAM,CAAC;IACrB,QAAQ,EAAE,MAAM,CAAC;IACjB,OAAO,EAAE,MAAM,CAAC;IAChB,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB;;;;;;;OAOG;IACH,YAAY,CAAC,EAAE,UAAU,GAAG,UAAU,CAAC;IACvC;;;;;OAKG;IACH,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB;;;;;OAKG;IACH,QAAQ,CAAC,EAAE,YAAY,GAAG,eAAe,CAAC;IAC1C,iFAAiF;IACjF,OAAO,CAAC,EAAE,SAAS,eAAe,EAAE,CAAC;IACrC;;;;;;OAMG;IACH,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,kEAAkE;IAClE,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,iEAAiE;IACjE,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB;;;OAGG;IACH,QAAQ,CAAC,EAAE,aAAa,GAAG,cAAc,CAAC;IAC1C;;;;OAIG;IACH,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB;;;;;;OAMG;IACH,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B;;;;;;OAMG;IACH,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,2DAA2D;IAC3D,gBAAgB,CAAC,EAAE,gBAAgB,CAAC;IACpC;;;OAGG;IACH,aAAa,CAAC,EAAE,OAAO,CAAC;IACxB,+FAA+F;IAC/F,gBAAgB,CAAC,EAAE,MAAM,CAAC;CAC3B;AAED;;;;GAIG;AACH,MAAM,WAAW,gBAAgB;IAC/B;;;;;;;OAOG;IACH,IAAI,EAAE,kBAAkB,GAAG,iBAAiB,GAAG,yBAAyB,CAAC;IACzE,6DAA6D;IAC7D,MAAM,EAAE,SAAS,MAAM,EAAE,CAAC;CAC3B;AAED;;;GAGG;AACH,MAAM,WAAW,sBAAsB;IACrC;;;;OAIG;IACH,eAAe,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;IACpC,qFAAqF;IACrF,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,6CAA6C;IAC7C,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,6CAA6C;IAC7C,QAAQ,CAAC,EAAE,YAAY,GAAG,eAAe,CAAC;IAC1C;;;;;;OAMG;IACH,IAAI,CAAC,EAAE,eAAe,CAAC;IACvB,gEAAgE;IAChE,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB;;;;OAIG;IACH,eAAe,CAAC,EAAE,CAAC,YAAY,EAAE,MAAM,KAAK,MAAM,CAAC;IACnD,kHAAkH;IAClH,gBAAgB,CAAC,EAAE,gBAAgB,CAAC;IACpC;;;;OAIG;IACH,YAAY,CAAC,EAAE,mBAAmB,CAAC;CACpC;AAED,8FAA8F;AAC9F,MAAM,WAAW,eAAe;IAC9B,uDAAuD;IACvD,SAAS,EAAE,SAAS,MAAM,EAAE,CAAC;IAC7B,qDAAqD;IACrD,cAAc,EAAE,OAAO,CAAC;IACxB;;;;OAIG;IACH,iBAAiB,CAAC,EAAE;QAAE,YAAY,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,aAAa,GAAG,cAAc,CAAA;KAAE,GAAG,IAAI,CAAC;CAC3F;AAMD;;;;;GAKG;AACH,wBAAgB,gBAAgB,CAAC,OAAO,EAAE,IAAI,CAAC,cAAc,EAAE,UAAU,CAAC,GAAG,MAAM,GAAG,SAAS,CAK9F;AAED;;;;;GAKG;AACH,wBAAgB,gBAAgB,CAAC,OAAO,EAAE,IAAI,CAAC,cAAc,EAAE,UAAU,CAAC,GAAG,MAAM,GAAG,SAAS,CAK9F;AAED;;;;;;;;GAQG;AACH;;;;;;;;;;;GAWG;AACH,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,SAAS,eAAe,EAAE,GAAG,MAAM,CAkB3E;AAmBD;;;;;;;;;;;;;GAaG;AACH,wBAAgB,iBAAiB,CAC/B,UAAU,EAAE,gBAAgB,GAAG,SAAS,GAAG,IAAI,EAC/C,IAAI,EAAE,UAAU,GAAG,UAAU,EAC7B,iBAAiB,EAAE,OAAO,GAAG,SAAS,GACrC,OAAO,CAKT;AAED;;;;;;;;;;;GAWG;AACH,wBAAgB,oBAAoB,CAAC,IAAI,EAAE,gBAAgB,EAAE,IAAI,EAAE,UAAU,GAAG,UAAU,GAAG,MAAM,GAAG,IAAI,CAezG;AAED;;;GAGG;AACH,eAAO,MAAM,mBAAmB,oLACmJ,CAAC;AAEpL,wBAAgB,mBAAmB,CAAC,IAAI,EAAE,gBAAgB,GAAG,MAAM,CAmGlE;AAMD;;;;GAIG;AACH,qBAAa,uBAAuB;IAClC,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAmB;IAC7C,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAqC;IAClE,OAAO,CAAC,QAAQ,CAAC,eAAe,CAAC,CAAwB;IACzD,OAAO,CAAC,QAAQ,CAAC,gBAAgB,CAAC,CAA2C;IAC7E,OAAO,CAAC,QAAQ,CAAC,qBAAqB,CAAC,CAA6D;IACpG,OAAO,CAAC,QAAQ,CAAC,oBAAoB,CAAC,CAAyD;IAC/F,OAAO,CAAC,QAAQ,CAAC,eAAe,CAAC,CAAgD;IACjF,OAAO,CAAC,QAAQ,CAAC,aAAa,CAAC,CAA6C;IAC5E,OAAO,CAAC,QAAQ,CAAC,cAAc,CAAC,CAAuE;IACvG,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAC,CAA0C;IACxE,OAAO,CAAC,QAAQ,CAAC,cAAc,CAAC,CAA4C;IAC5E,4FAA4F;IAC5F,QAAQ,CAAC,cAAc,EAAE,kBAAkB,CAAC;IAC5C,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAkB;gBAE7B,OAAO,EAAE,uBAAuB;IAgB5C;;;;;;;;;;;OAWG;IACH,OAAO,CAAC,UAAU;IAuBlB;;;;;;;;;;;;;;;;;;;;OAoBG;IACG,eAAe,CACnB,OAAO,EAAE,cAAc,EACvB,OAAO,EAAE,cAAc,EACvB,OAAO,GAAE,sBAA2B,GACnC,OAAO,CAAC,qBAAqB,CAAC;IAgBjC;;;;;;OAMG;YACW,SAAS;IASvB;;;;;;;;;OASG;IACH,OAAO,CAAC,aAAa;IAcrB;;;;;;;OAOG;IACH,OAAO,CAAC,gBAAgB;YAQV,KAAK;IAgCnB;;;;;;;;;;;;;;;;;;;OAmBG;YACW,uBAAuB;IAwCrC;;;;;;;;;;OAUG;IACH,OAAO,CAAC,gBAAgB;IA0BxB;;;;;;;;;;;;;;;;OAgBG;IACG,iBAAiB,CACrB,OAAO,EAAE,cAAc,EACvB,OAAO,EAAE,cAAc,EACvB,OAAO,GAAE,sBAA2B,GACnC,OAAO,CAAC,GAAG,CAAC,MAAM,EAAE,UAAU,GAAG,UAAU,CAAC,CAAC;IAOhD;;;;;;;;OAQG;YACW,oBAAoB;IA4FlC;;;;;;;;;;;;;;;;;;;OAmBG;YACW,mBAAmB;IAyDjC;;;;;;;;OAQG;YACW,YAAY;IAgB1B;;;;;;;;;;;OAWG;YACW,sBAAsB;IA+GpC;;;;;;;;;;;;OAYG;YACW,uBAAuB;IAuFrC;;;;;;;;;;;;;;;;;;;;;;;OAuBG;IACG,eAAe,CACnB,OAAO,EAAE,cAAc,EACvB,OAAO,EAAE,cAAc,EACvB,OAAO,GAAE,IAAI,CAAC,sBAAsB,EAAE,iBAAiB,CAAM,GAC5D,OAAO,CAAC,cAAc,CAAC;CA+F3B;AAED;;;;;;;GAOG;AACH,wBAAgB,aAAa,CAAC,OAAO,EAAE,IAAI,CAAC,cAAc,EAAE,UAAU,CAAC,GAAG,MAAM,GAAG,IAAI,CAOtF"}
|