crewly 1.20.364 → 1.20.366
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/roles/team-leader/prompt.md +2 -0
- package/config/skills/agent/core/attach-file/SKILL.md +7 -0
- package/config/skills/agent/core/attach-file/execute.sh +8 -3
- package/config/skills/agent/core/complete-task/SKILL.md +4 -2
- package/config/skills/agent/core/complete-task/execute.sh +9 -1
- package/config/skills/agent/core/complete-task/explicit-id.test.sh +13 -2
- package/config/skills/agent/core/create-task/SKILL.md +2 -0
- package/config/skills/agent/core/create-task/execute.sh +27 -1
- package/config/skills/agent/core/create-task/execute.test.sh +67 -0
- package/config/skills/agent/core/handoff-task/execute.sh +12 -5
- package/config/skills/agent/core/handoff-task/explicit-id.test.sh +70 -0
- package/config/skills/agent/core/reply/SKILL.md +10 -2
- package/config/skills/agent/core/reply-channel/SKILL.md +17 -0
- package/config/skills/agent/core/reply-channel/execute.sh +17 -2
- package/config/skills/agent/core/reply-channel/execute.test.sh +15 -2
- package/config/skills/agent/core/send-message/SKILL.md +14 -0
- package/config/skills/agent/core/slack-post/SKILL.md +3 -3
- package/config/skills/orchestrator/delegate-task/SKILL.md +1 -1
- package/config/skills/orchestrator/reply-slack/execute.sh +6 -2
- package/config/skills/orchestrator/send-pdf-to-slack/SKILL.md +2 -1
- package/config/skills/orchestrator/send-pdf-to-slack/execute.sh +10 -2
- package/config/skills/registry.json +6 -6
- package/config/skills/team-leader/delegate-task/SKILL.md +1 -1
- package/config/skills/team-leader/delegate-task/execute.sh +6 -0
- package/dist/backend/backend/src/constants.d.ts +26 -0
- package/dist/backend/backend/src/constants.d.ts.map +1 -1
- package/dist/backend/backend/src/constants.js +26 -0
- package/dist/backend/backend/src/constants.js.map +1 -1
- package/dist/backend/backend/src/controllers/agent-hooks/agent-hooks.controller.d.ts.map +1 -1
- package/dist/backend/backend/src/controllers/agent-hooks/agent-hooks.controller.js +7 -3
- package/dist/backend/backend/src/controllers/agent-hooks/agent-hooks.controller.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 +2 -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 +12 -0
- package/dist/backend/backend/src/controllers/chat/chat.controller.d.ts.map +1 -1
- package/dist/backend/backend/src/controllers/chat/chat.controller.js +56 -7
- 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 +9 -0
- 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 +159 -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.map +1 -1
- package/dist/backend/backend/src/controllers/monitoring/terminal.controller.js +89 -2
- package/dist/backend/backend/src/controllers/monitoring/terminal.controller.js.map +1 -1
- package/dist/backend/backend/src/controllers/slack/slack.controller.d.ts.map +1 -1
- package/dist/backend/backend/src/controllers/slack/slack.controller.js +58 -4
- package/dist/backend/backend/src/controllers/slack/slack.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 +36 -2
- package/dist/backend/backend/src/controllers/task-pool/task-pool.controller.js.map +1 -1
- package/dist/backend/backend/src/index.d.ts.map +1 -1
- package/dist/backend/backend/src/index.js +9 -0
- package/dist/backend/backend/src/index.js.map +1 -1
- package/dist/backend/backend/src/services/chat-v2/chat-v2.dispatcher.service.d.ts +16 -10
- 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 +19 -11
- package/dist/backend/backend/src/services/chat-v2/chat-v2.dispatcher.service.js.map +1 -1
- package/dist/backend/backend/src/services/messaging/agent-message-envelope.d.ts +106 -0
- package/dist/backend/backend/src/services/messaging/agent-message-envelope.d.ts.map +1 -0
- package/dist/backend/backend/src/services/messaging/agent-message-envelope.js +124 -0
- package/dist/backend/backend/src/services/messaging/agent-message-envelope.js.map +1 -0
- package/dist/backend/backend/src/services/messaging/owner-hook-message.d.ts +62 -13
- package/dist/backend/backend/src/services/messaging/owner-hook-message.d.ts.map +1 -1
- package/dist/backend/backend/src/services/messaging/owner-hook-message.js +196 -22
- package/dist/backend/backend/src/services/messaging/owner-hook-message.js.map +1 -1
- package/dist/backend/backend/src/services/messaging/owner-thread-sentinel.service.d.ts +15 -5
- package/dist/backend/backend/src/services/messaging/owner-thread-sentinel.service.d.ts.map +1 -1
- package/dist/backend/backend/src/services/messaging/owner-thread-sentinel.service.js +22 -0
- package/dist/backend/backend/src/services/messaging/owner-thread-sentinel.service.js.map +1 -1
- package/dist/backend/backend/src/services/orc/agent-mention-post-guard.d.ts +69 -0
- package/dist/backend/backend/src/services/orc/agent-mention-post-guard.d.ts.map +1 -0
- package/dist/backend/backend/src/services/orc/agent-mention-post-guard.js +81 -0
- package/dist/backend/backend/src/services/orc/agent-mention-post-guard.js.map +1 -0
- package/dist/backend/backend/src/services/orc/message-route.d.ts +129 -0
- package/dist/backend/backend/src/services/orc/message-route.d.ts.map +1 -0
- package/dist/backend/backend/src/services/orc/message-route.js +197 -0
- package/dist/backend/backend/src/services/orc/message-route.js.map +1 -0
- package/dist/backend/backend/src/services/orc/owner-completion-report.service.d.ts +34 -3
- package/dist/backend/backend/src/services/orc/owner-completion-report.service.d.ts.map +1 -1
- package/dist/backend/backend/src/services/orc/owner-completion-report.service.js +65 -8
- package/dist/backend/backend/src/services/orc/owner-completion-report.service.js.map +1 -1
- package/dist/backend/backend/src/services/orc/owner-completion-report.text.d.ts +15 -2
- package/dist/backend/backend/src/services/orc/owner-completion-report.text.d.ts.map +1 -1
- package/dist/backend/backend/src/services/orc/owner-completion-report.text.js +21 -6
- package/dist/backend/backend/src/services/orc/owner-completion-report.text.js.map +1 -1
- package/dist/backend/backend/src/services/orc/owner-completion-report.wiring.d.ts +16 -1
- package/dist/backend/backend/src/services/orc/owner-completion-report.wiring.d.ts.map +1 -1
- package/dist/backend/backend/src/services/orc/owner-completion-report.wiring.js +19 -3
- package/dist/backend/backend/src/services/orc/owner-completion-report.wiring.js.map +1 -1
- package/dist/backend/backend/src/services/orc/reply-destination-resolver.d.ts +76 -4
- package/dist/backend/backend/src/services/orc/reply-destination-resolver.d.ts.map +1 -1
- package/dist/backend/backend/src/services/orc/reply-destination-resolver.js +343 -45
- package/dist/backend/backend/src/services/orc/reply-destination-resolver.js.map +1 -1
- package/dist/backend/backend/src/services/orc/reply-destination.wiring.d.ts +70 -8
- 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 +256 -100
- package/dist/backend/backend/src/services/orc/reply-destination.wiring.js.map +1 -1
- package/dist/backend/backend/src/services/orc/triggered-by.d.ts.map +1 -1
- package/dist/backend/backend/src/services/orc/triggered-by.js +9 -0
- package/dist/backend/backend/src/services/orc/triggered-by.js.map +1 -1
- package/dist/backend/backend/src/services/orc/work-item-destination.d.ts +2 -1
- package/dist/backend/backend/src/services/orc/work-item-destination.d.ts.map +1 -1
- package/dist/backend/backend/src/services/orc/work-item-destination.js +1 -1
- package/dist/backend/backend/src/services/orc/work-item-destination.js.map +1 -1
- package/dist/backend/backend/src/services/orc/work-item-destination.wiring.d.ts +16 -1
- package/dist/backend/backend/src/services/orc/work-item-destination.wiring.d.ts.map +1 -1
- package/dist/backend/backend/src/services/orc/work-item-destination.wiring.js +33 -4
- package/dist/backend/backend/src/services/orc/work-item-destination.wiring.js.map +1 -1
- package/dist/backend/backend/src/services/project-tickets/project-ticket-workflow.service.d.ts +1 -0
- package/dist/backend/backend/src/services/project-tickets/project-ticket-workflow.service.d.ts.map +1 -1
- package/dist/backend/backend/src/services/slack/room-responder.d.ts +7 -3
- package/dist/backend/backend/src/services/slack/room-responder.d.ts.map +1 -1
- package/dist/backend/backend/src/services/slack/room-responder.js +26 -20
- package/dist/backend/backend/src/services/slack/room-responder.js.map +1 -1
- package/dist/backend/backend/src/services/slack/slack-agent-post.service.d.ts +1 -1
- package/dist/backend/backend/src/services/slack/slack-agent-post.service.d.ts.map +1 -1
- package/dist/backend/backend/src/services/slack/slack-agent-post.service.js +20 -13
- package/dist/backend/backend/src/services/slack/slack-agent-post.service.js.map +1 -1
- package/dist/backend/backend/src/services/slack/slack-team-channel.service.d.ts +17 -0
- 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 +35 -1
- package/dist/backend/backend/src/services/slack/slack-team-channel.service.js.map +1 -1
- package/dist/backend/backend/src/services/slack/slack.service.d.ts +20 -1
- package/dist/backend/backend/src/services/slack/slack.service.d.ts.map +1 -1
- package/dist/backend/backend/src/services/slack/slack.service.js +58 -3
- package/dist/backend/backend/src/services/slack/slack.service.js.map +1 -1
- package/dist/backend/backend/src/services/task-pool/task-pool.service.d.ts +31 -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 +62 -5
- package/dist/backend/backend/src/services/task-pool/task-pool.service.js.map +1 -1
- package/dist/backend/backend/src/services/trace/turn-trigger.d.ts +34 -1
- package/dist/backend/backend/src/services/trace/turn-trigger.d.ts.map +1 -1
- package/dist/backend/backend/src/services/trace/turn-trigger.js +76 -6
- package/dist/backend/backend/src/services/trace/turn-trigger.js.map +1 -1
- package/dist/backend/build-info.json +2 -2
- package/dist/cli/backend/src/constants.d.ts +26 -0
- package/dist/cli/backend/src/constants.d.ts.map +1 -1
- package/dist/cli/backend/src/constants.js +26 -0
- package/dist/cli/backend/src/constants.js.map +1 -1
- package/dist/cli/backend/src/services/chat-v2/chat-v2.dispatcher.service.d.ts +16 -10
- 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 +19 -11
- package/dist/cli/backend/src/services/chat-v2/chat-v2.dispatcher.service.js.map +1 -1
- package/dist/cli/backend/src/services/messaging/agent-message-envelope.d.ts +106 -0
- package/dist/cli/backend/src/services/messaging/agent-message-envelope.d.ts.map +1 -0
- package/dist/cli/backend/src/services/messaging/agent-message-envelope.js +124 -0
- package/dist/cli/backend/src/services/messaging/agent-message-envelope.js.map +1 -0
- package/dist/cli/backend/src/services/messaging/owner-thread-sentinel.service.d.ts +15 -5
- package/dist/cli/backend/src/services/messaging/owner-thread-sentinel.service.d.ts.map +1 -1
- package/dist/cli/backend/src/services/messaging/owner-thread-sentinel.service.js +22 -0
- package/dist/cli/backend/src/services/messaging/owner-thread-sentinel.service.js.map +1 -1
- package/dist/cli/backend/src/services/orc/message-route.d.ts +129 -0
- package/dist/cli/backend/src/services/orc/message-route.d.ts.map +1 -0
- package/dist/cli/backend/src/services/orc/message-route.js +197 -0
- package/dist/cli/backend/src/services/orc/message-route.js.map +1 -0
- package/dist/cli/backend/src/services/orc/owner-completion-report.text.d.ts +15 -2
- package/dist/cli/backend/src/services/orc/owner-completion-report.text.d.ts.map +1 -1
- package/dist/cli/backend/src/services/orc/owner-completion-report.text.js +21 -6
- package/dist/cli/backend/src/services/orc/owner-completion-report.text.js.map +1 -1
- package/dist/cli/backend/src/services/orc/work-item-destination.d.ts +2 -1
- package/dist/cli/backend/src/services/orc/work-item-destination.d.ts.map +1 -1
- package/dist/cli/backend/src/services/orc/work-item-destination.js +1 -1
- package/dist/cli/backend/src/services/orc/work-item-destination.js.map +1 -1
- package/dist/cli/backend/src/services/slack/room-responder.d.ts +7 -3
- package/dist/cli/backend/src/services/slack/room-responder.d.ts.map +1 -1
- package/dist/cli/backend/src/services/slack/room-responder.js +26 -20
- package/dist/cli/backend/src/services/slack/room-responder.js.map +1 -1
- package/dist/cli/backend/src/services/slack/slack-team-channel.service.d.ts +17 -0
- 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 +35 -1
- package/dist/cli/backend/src/services/slack/slack-team-channel.service.js.map +1 -1
- package/dist/cli/backend/src/services/slack/slack.service.d.ts +20 -1
- package/dist/cli/backend/src/services/slack/slack.service.d.ts.map +1 -1
- package/dist/cli/backend/src/services/slack/slack.service.js +58 -3
- package/dist/cli/backend/src/services/slack/slack.service.js.map +1 -1
- package/dist/cli/backend/src/services/task-pool/task-pool.service.d.ts +31 -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 +62 -5
- package/dist/cli/backend/src/services/task-pool/task-pool.service.js.map +1 -1
- package/dist/cli/backend/src/services/trace/turn-trigger.d.ts +34 -1
- package/dist/cli/backend/src/services/trace/turn-trigger.d.ts.map +1 -1
- package/dist/cli/backend/src/services/trace/turn-trigger.js +76 -6
- package/dist/cli/backend/src/services/trace/turn-trigger.js.map +1 -1
- package/package.json +1 -1
|
@@ -16,6 +16,16 @@
|
|
|
16
16
|
* @module services/messaging/owner-hook-message
|
|
17
17
|
*/
|
|
18
18
|
import { SubAgentMessageQueue, type SurfacedOwnerMessage } from './sub-agent-message-queue.service.js';
|
|
19
|
+
/**
|
|
20
|
+
* Writes an owner message too long for the note to a file, returning its
|
|
21
|
+
* path (null when it could not be written).
|
|
22
|
+
*/
|
|
23
|
+
export type OwnerMessageOverflowWriter = (fullText: string) => string | null;
|
|
24
|
+
/** Options of {@link buildOwnerHookNote}. */
|
|
25
|
+
export interface OwnerHookNoteOptions {
|
|
26
|
+
/** Where an owner message too long for the note is written in full */
|
|
27
|
+
overflow?: OwnerMessageOverflowWriter;
|
|
28
|
+
}
|
|
19
29
|
/**
|
|
20
30
|
* The note for one surfaced owner message (English harness text). The queued
|
|
21
31
|
* text already carries where the message came from and how to reply, as the
|
|
@@ -23,24 +33,51 @@ import { SubAgentMessageQueue, type SurfacedOwnerMessage } from './sub-agent-mes
|
|
|
23
33
|
*
|
|
24
34
|
* @param message - The surfaced message
|
|
25
35
|
* @param maxChars - Ceiling on the note's length
|
|
36
|
+
* @param options - Overflow writer (default: a file under CREWLY_HOME)
|
|
26
37
|
* @returns The note
|
|
27
38
|
*/
|
|
28
|
-
export declare function buildOwnerHookNote(message: SurfacedOwnerMessage, maxChars?: number): string;
|
|
39
|
+
export declare function buildOwnerHookNote(message: SurfacedOwnerMessage, maxChars?: number, options?: OwnerHookNoteOptions): string;
|
|
29
40
|
/**
|
|
30
|
-
* Fit a queued message into `room` characters
|
|
31
|
-
*
|
|
32
|
-
*
|
|
33
|
-
*
|
|
41
|
+
* Fit a queued owner message into `room` characters. The owner's own text
|
|
42
|
+
* is never cut (message-routing audit 2026-10-18, R0): what gives way is,
|
|
43
|
+
* in order, the reply instructions after the `---` line (down to their
|
|
44
|
+
* start, which holds the reply command) and the older thread context (its
|
|
45
|
+
* newest lines are kept). When the owner's text alone is still too long, it
|
|
46
|
+
* is written in full to a file and the note quotes its start and points to
|
|
47
|
+
* the file.
|
|
34
48
|
*
|
|
35
|
-
*
|
|
36
|
-
* posts and the owner's ping
|
|
37
|
-
*
|
|
49
|
+
* History: the end used to be cut, and a 13.5k-char thread prompt lost its
|
|
50
|
+
* newest posts and the owner's ping (2026-10-08, #content-team). Then the
|
|
51
|
+
* middle was cut, and with long reply instructions the cut took the owner's
|
|
52
|
+
* question just before them: the agent said the message arrived empty
|
|
53
|
+
* (2026-10-18, #awesome-videos, I1–I5).
|
|
38
54
|
*
|
|
39
55
|
* @param data - The queued text
|
|
40
56
|
* @param room - Characters available
|
|
41
|
-
* @
|
|
57
|
+
* @param overflow - Writes the full text when the owner's text cannot fit
|
|
58
|
+
* @returns The text, whole or fitted
|
|
59
|
+
*/
|
|
60
|
+
export declare function fitKeepingNewest(data: string, room: number, overflow?: OwnerMessageOverflowWriter): string;
|
|
61
|
+
/**
|
|
62
|
+
* Split a queued text into its header (where it came from), the thread
|
|
63
|
+
* context, and the owner's own message (after the last context-closing
|
|
64
|
+
* line; the whole text after the header when there is none).
|
|
65
|
+
*
|
|
66
|
+
* @param body - The queued text without its reply instructions
|
|
67
|
+
* @returns The three parts (concatenated, they are `body`)
|
|
42
68
|
*/
|
|
43
|
-
export declare function
|
|
69
|
+
export declare function splitOwnerMessage(body: string): {
|
|
70
|
+
lead: string;
|
|
71
|
+
context: string;
|
|
72
|
+
message: string;
|
|
73
|
+
};
|
|
74
|
+
/**
|
|
75
|
+
* The default overflow writer: `<CREWLY_HOME>/runtime/owner-messages/<label>-<ts>.md`.
|
|
76
|
+
*
|
|
77
|
+
* @param label - File name prefix (the agent's session)
|
|
78
|
+
* @returns The writer
|
|
79
|
+
*/
|
|
80
|
+
export declare function defaultOverflowWriter(label: string): OwnerMessageOverflowWriter;
|
|
44
81
|
/**
|
|
45
82
|
* The owner-message note for an agent's PostToolUse hook, or null. One
|
|
46
83
|
* message at most per call. Off when {@link OWNER_HOOK_MESSAGE_CONSTANTS.KILL_SWITCH_ENV}
|
|
@@ -49,16 +86,28 @@ export declare function fitKeepingNewest(data: string, room: number): string;
|
|
|
49
86
|
* @param sessionName - The agent
|
|
50
87
|
* @param env - Environment (kill switch)
|
|
51
88
|
* @param queue - The message queue
|
|
89
|
+
* @param maxChars - Room for the note (what the other notes of this hook call leave)
|
|
90
|
+
* @param overflow - Where an owner message too long for the note is written in full
|
|
52
91
|
* @returns The note, or null
|
|
53
92
|
*/
|
|
54
|
-
export declare function ownerHookNoteFor(sessionName: string, env?: NodeJS.ProcessEnv, queue?: SubAgentMessageQueue): string | null;
|
|
93
|
+
export declare function ownerHookNoteFor(sessionName: string, env?: NodeJS.ProcessEnv, queue?: SubAgentMessageQueue, maxChars?: number, overflow?: OwnerMessageOverflowWriter): string | null;
|
|
55
94
|
/**
|
|
56
|
-
* Join the notes for one hook response,
|
|
57
|
-
*
|
|
95
|
+
* Join the notes for one hook response, in priority order, within the size
|
|
96
|
+
* ceiling. Nothing goes silently (message-routing audit 2026-10-18): a note
|
|
97
|
+
* that does not fit is dropped and the result says how many were, and a
|
|
98
|
+
* first note longer than the ceiling is cut with a marker. Owner notes are
|
|
99
|
+
* built to fit their room ({@link ownerHookNoteFor}'s `maxChars`), so they
|
|
100
|
+
* are never cut here.
|
|
58
101
|
*
|
|
59
102
|
* @param notes - Notes in priority order (nulls skipped)
|
|
60
103
|
* @param maxChars - Ceiling
|
|
61
104
|
* @returns The joined text, or null when there is none
|
|
62
105
|
*/
|
|
63
106
|
export declare function joinHookNotes(notes: ReadonlyArray<string | null | undefined>, maxChars?: number): string | null;
|
|
107
|
+
/**
|
|
108
|
+
* Room {@link joinHookNotes} keeps after a note that is not the last, for
|
|
109
|
+
* the line naming notes left out. A note built to go first takes at most
|
|
110
|
+
* the ceiling less this.
|
|
111
|
+
*/
|
|
112
|
+
export declare const HOOK_NOTE_JOIN_RESERVE: number;
|
|
64
113
|
//# sourceMappingURL=owner-hook-message.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"owner-hook-message.d.ts","sourceRoot":"","sources":["../../../../../../backend/src/services/messaging/owner-hook-message.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG;
|
|
1
|
+
{"version":3,"file":"owner-hook-message.d.ts","sourceRoot":"","sources":["../../../../../../backend/src/services/messaging/owner-hook-message.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG;AAMH,OAAO,EAAE,oBAAoB,EAAE,KAAK,oBAAoB,EAAE,MAAM,sCAAsC,CAAC;AAEvG;;;GAGG;AACH,MAAM,MAAM,0BAA0B,GAAG,CAAC,QAAQ,EAAE,MAAM,KAAK,MAAM,GAAG,IAAI,CAAC;AAE7E,6CAA6C;AAC7C,MAAM,WAAW,oBAAoB;IACpC,sEAAsE;IACtE,QAAQ,CAAC,EAAE,0BAA0B,CAAC;CACtC;AAED;;;;;;;;;GASG;AACH,wBAAgB,kBAAkB,CACjC,OAAO,EAAE,oBAAoB,EAC7B,QAAQ,GAAE,MAAuD,EACjE,OAAO,GAAE,oBAAyB,GAChC,MAAM,CAgBR;AAED;;;;;;;;;;;;;;;;;;;GAmBG;AACH,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,QAAQ,CAAC,EAAE,0BAA0B,GAAG,MAAM,CA+B1G;AAeD;;;;;;;GAOG;AACH,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,MAAM,GAAG;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE,CAOlG;AA6CD;;;;;GAKG;AACH,wBAAgB,qBAAqB,CAAC,KAAK,EAAE,MAAM,GAAG,0BAA0B,CAS/E;AAuBD;;;;;;;;;;;GAWG;AACH,wBAAgB,gBAAgB,CAC/B,WAAW,EAAE,MAAM,EACnB,GAAG,GAAE,MAAM,CAAC,UAAwB,EACpC,KAAK,GAAE,oBAAyD,EAChE,QAAQ,GAAE,MAAuD,EACjE,QAAQ,GAAE,0BAA+D,GACvE,MAAM,GAAG,IAAI,CAKf;AAED;;;;;;;;;;;GAWG;AACH,wBAAgB,aAAa,CAAC,KAAK,EAAE,aAAa,CAAC,MAAM,GAAG,IAAI,GAAG,SAAS,CAAC,EAAE,QAAQ,GAAE,MAAuD,GAAG,MAAM,GAAG,IAAI,CAmB/J;AAOD;;;;GAIG;AACH,eAAO,MAAM,sBAAsB,QAA0B,CAAC"}
|
|
@@ -15,7 +15,10 @@
|
|
|
15
15
|
*
|
|
16
16
|
* @module services/messaging/owner-hook-message
|
|
17
17
|
*/
|
|
18
|
+
import * as fs from 'fs';
|
|
19
|
+
import * as path from 'path';
|
|
18
20
|
import { OWNER_HOOK_MESSAGE_CONSTANTS } from '../../constants.js';
|
|
21
|
+
import { getCrewlyHomePath } from '../core/crewly-home.utils.js';
|
|
19
22
|
import { SubAgentMessageQueue } from './sub-agent-message-queue.service.js';
|
|
20
23
|
/**
|
|
21
24
|
* The note for one surfaced owner message (English harness text). The queued
|
|
@@ -24,9 +27,10 @@ import { SubAgentMessageQueue } from './sub-agent-message-queue.service.js';
|
|
|
24
27
|
*
|
|
25
28
|
* @param message - The surfaced message
|
|
26
29
|
* @param maxChars - Ceiling on the note's length
|
|
30
|
+
* @param options - Overflow writer (default: a file under CREWLY_HOME)
|
|
27
31
|
* @returns The note
|
|
28
32
|
*/
|
|
29
|
-
export function buildOwnerHookNote(message, maxChars = OWNER_HOOK_MESSAGE_CONSTANTS.MAX_CONTEXT_CHARS) {
|
|
33
|
+
export function buildOwnerHookNote(message, maxChars = OWNER_HOOK_MESSAGE_CONSTANTS.MAX_CONTEXT_CHARS, options = {}) {
|
|
30
34
|
const C = OWNER_HOOK_MESSAGE_CONSTANTS;
|
|
31
35
|
// Drive mode (specs/2026-10-09-drive-mode-v3.md §4): the owner is listening
|
|
32
36
|
// on the phone; a quick ack now beats a full answer later.
|
|
@@ -41,33 +45,168 @@ export function buildOwnerHookNote(message, maxChars = OWNER_HOOK_MESSAGE_CONSTA
|
|
|
41
45
|
'Answer it now, in the conversation it came from, before your next step of the current work; then carry on with that work.';
|
|
42
46
|
const sep = '\n\n';
|
|
43
47
|
const room = maxChars - head.length - sep.length;
|
|
44
|
-
return `${head}${sep}${fitKeepingNewest(message.data, room)}`;
|
|
48
|
+
return `${head}${sep}${fitKeepingNewest(message.data, room, options.overflow ?? defaultOverflowWriter('owner-message'))}`;
|
|
45
49
|
}
|
|
46
50
|
/**
|
|
47
|
-
* Fit a queued message into `room` characters
|
|
48
|
-
*
|
|
49
|
-
*
|
|
50
|
-
*
|
|
51
|
+
* Fit a queued owner message into `room` characters. The owner's own text
|
|
52
|
+
* is never cut (message-routing audit 2026-10-18, R0): what gives way is,
|
|
53
|
+
* in order, the reply instructions after the `---` line (down to their
|
|
54
|
+
* start, which holds the reply command) and the older thread context (its
|
|
55
|
+
* newest lines are kept). When the owner's text alone is still too long, it
|
|
56
|
+
* is written in full to a file and the note quotes its start and points to
|
|
57
|
+
* the file.
|
|
51
58
|
*
|
|
52
|
-
*
|
|
53
|
-
* posts and the owner's ping
|
|
54
|
-
*
|
|
59
|
+
* History: the end used to be cut, and a 13.5k-char thread prompt lost its
|
|
60
|
+
* newest posts and the owner's ping (2026-10-08, #content-team). Then the
|
|
61
|
+
* middle was cut, and with long reply instructions the cut took the owner's
|
|
62
|
+
* question just before them: the agent said the message arrived empty
|
|
63
|
+
* (2026-10-18, #awesome-videos, I1–I5).
|
|
55
64
|
*
|
|
56
65
|
* @param data - The queued text
|
|
57
66
|
* @param room - Characters available
|
|
58
|
-
* @
|
|
67
|
+
* @param overflow - Writes the full text when the owner's text cannot fit
|
|
68
|
+
* @returns The text, whole or fitted
|
|
59
69
|
*/
|
|
60
|
-
export function fitKeepingNewest(data, room) {
|
|
70
|
+
export function fitKeepingNewest(data, room, overflow) {
|
|
61
71
|
if (data.length <= room)
|
|
62
72
|
return data;
|
|
63
|
-
const
|
|
73
|
+
const split = data.lastIndexOf(REPLY_TAIL_SEPARATOR);
|
|
74
|
+
const body = split > 0 ? data.slice(0, split) : data;
|
|
75
|
+
const fullTail = split > 0 ? data.slice(split) : '';
|
|
76
|
+
const { lead, context, message } = splitOwnerMessage(body);
|
|
77
|
+
// 1. The reply instructions: at most their share of the room, and less
|
|
78
|
+
// when the owner's text needs it (never below their opening).
|
|
79
|
+
const minTail = Math.min(fullTail.length, MIN_TAIL_CHARS);
|
|
80
|
+
const fixed = lead.length + message.length;
|
|
81
|
+
const tailRoom = Math.max(minTail, Math.min(Math.floor(room * REPLY_TAIL_SHARE), room - fixed - CONTEXT_CUT_MARKER.length));
|
|
82
|
+
const tail = cutTail(fullTail, tailRoom);
|
|
83
|
+
// 2. The thread context: its newest lines, in whatever room is left.
|
|
84
|
+
const contextRoom = room - fixed - tail.length;
|
|
85
|
+
if (contextRoom >= 0)
|
|
86
|
+
return `${lead}${fitContext(context, contextRoom)}${message}${tail}`;
|
|
87
|
+
// 3. The owner's text alone does not fit: point to it in full.
|
|
88
|
+
const file = overflow ? safeWrite(overflow, data) : null;
|
|
89
|
+
if (file) {
|
|
90
|
+
const open = `\n[The owner's message is ${message.trim().length} characters, too long to show here. Its start:]\n`;
|
|
91
|
+
const close = `\n[… Read the whole message, with its thread, before you answer: ${file}]\n`;
|
|
92
|
+
// The pointer always fits; the preview and the reply command share the rest.
|
|
93
|
+
const spare = Math.max(0, room - lead.length - open.length - close.length);
|
|
94
|
+
const previewChars = Math.min(OWNER_HOOK_MESSAGE_CONSTANTS.OVERFLOW_PREVIEW_CHARS, Math.max(0, spare - Math.min(fullTail.length, MIN_TAIL_CHARS)));
|
|
95
|
+
const pointer = `${open}${message.trim().slice(0, previewChars)}${close}`;
|
|
96
|
+
return `${lead}${pointer}${cutTail(fullTail, Math.max(0, room - lead.length - pointer.length))}`;
|
|
97
|
+
}
|
|
98
|
+
// No file: the old middle cut, and it says the owner's text was cut.
|
|
99
|
+
return fitBody(data, room);
|
|
100
|
+
}
|
|
101
|
+
/** Line that opens the reply instructions in a queued chat message */
|
|
102
|
+
const REPLY_TAIL_SEPARATOR = '\n---\n';
|
|
103
|
+
/** Most of the room the reply instructions may take when the message is cut */
|
|
104
|
+
const REPLY_TAIL_SHARE = 0.35;
|
|
105
|
+
/** The opening of the reply instructions (the reply command) is kept at least this long */
|
|
106
|
+
const MIN_TAIL_CHARS = 400;
|
|
107
|
+
/** Said where the reply instructions were cut */
|
|
108
|
+
const TAIL_CUT_MARKER = '\n… (rest of the reply instructions cut to fit)';
|
|
109
|
+
/** Said where the older thread context was cut */
|
|
110
|
+
const CONTEXT_CUT_MARKER = '\n… (older thread lines cut here to fit; the newest ones and the owner\'s message follow in full)\n';
|
|
111
|
+
/** Lines that close the thread context; the owner's message follows them */
|
|
112
|
+
const CONTEXT_END_RE = /\n\[end of (?:Slack (?:thread|channel context)|context-only messages)[^\n]*\]/g;
|
|
113
|
+
/**
|
|
114
|
+
* Split a queued text into its header (where it came from), the thread
|
|
115
|
+
* context, and the owner's own message (after the last context-closing
|
|
116
|
+
* line; the whole text after the header when there is none).
|
|
117
|
+
*
|
|
118
|
+
* @param body - The queued text without its reply instructions
|
|
119
|
+
* @returns The three parts (concatenated, they are `body`)
|
|
120
|
+
*/
|
|
121
|
+
export function splitOwnerMessage(body) {
|
|
122
|
+
let contextEnd = -1;
|
|
123
|
+
for (const m of body.matchAll(CONTEXT_END_RE))
|
|
124
|
+
contextEnd = (m.index ?? 0) + m[0].length;
|
|
125
|
+
const firstBreak = body.indexOf('\n\n');
|
|
126
|
+
const leadEnd = firstBreak > 0 && (contextEnd < 0 || firstBreak < contextEnd) ? firstBreak : 0;
|
|
127
|
+
if (contextEnd < 0)
|
|
128
|
+
return { lead: body.slice(0, leadEnd), context: '', message: body.slice(leadEnd) };
|
|
129
|
+
return { lead: body.slice(0, leadEnd), context: body.slice(leadEnd, contextEnd), message: body.slice(contextEnd) };
|
|
130
|
+
}
|
|
131
|
+
/**
|
|
132
|
+
* The reply instructions within `room`: whole, or their start and a marker.
|
|
133
|
+
*
|
|
134
|
+
* @param tail - Instructions (from the `---` line)
|
|
135
|
+
* @param room - Characters available
|
|
136
|
+
* @returns The fitted instructions
|
|
137
|
+
*/
|
|
138
|
+
function cutTail(tail, room) {
|
|
139
|
+
if (tail.length <= room)
|
|
140
|
+
return tail;
|
|
141
|
+
return `${tail.slice(0, Math.max(0, room - TAIL_CUT_MARKER.length))}${TAIL_CUT_MARKER}`.slice(0, Math.max(0, room));
|
|
142
|
+
}
|
|
143
|
+
/**
|
|
144
|
+
* The thread context within `room`: whole, or its newest lines after a marker.
|
|
145
|
+
*
|
|
146
|
+
* @param context - Thread context
|
|
147
|
+
* @param room - Characters available
|
|
148
|
+
* @returns The fitted context
|
|
149
|
+
*/
|
|
150
|
+
function fitContext(context, room) {
|
|
151
|
+
if (context.length <= room)
|
|
152
|
+
return context;
|
|
153
|
+
if (room <= CONTEXT_CUT_MARKER.length)
|
|
154
|
+
return '';
|
|
155
|
+
let start = context.length - (room - CONTEXT_CUT_MARKER.length);
|
|
156
|
+
const nl = context.indexOf('\n', start);
|
|
157
|
+
if (nl >= 0 && nl - start < 200 && nl + 1 < context.length)
|
|
158
|
+
start = nl + 1;
|
|
159
|
+
return `${CONTEXT_CUT_MARKER}${context.slice(start)}`;
|
|
160
|
+
}
|
|
161
|
+
/**
|
|
162
|
+
* Run an overflow writer, never throwing.
|
|
163
|
+
*
|
|
164
|
+
* @param write - The writer
|
|
165
|
+
* @param text - Full text
|
|
166
|
+
* @returns Its path, or null
|
|
167
|
+
*/
|
|
168
|
+
function safeWrite(write, text) {
|
|
169
|
+
try {
|
|
170
|
+
return write(text);
|
|
171
|
+
}
|
|
172
|
+
catch {
|
|
173
|
+
return null;
|
|
174
|
+
}
|
|
175
|
+
}
|
|
176
|
+
/**
|
|
177
|
+
* The default overflow writer: `<CREWLY_HOME>/runtime/owner-messages/<label>-<ts>.md`.
|
|
178
|
+
*
|
|
179
|
+
* @param label - File name prefix (the agent's session)
|
|
180
|
+
* @returns The writer
|
|
181
|
+
*/
|
|
182
|
+
export function defaultOverflowWriter(label) {
|
|
183
|
+
return (fullText) => {
|
|
184
|
+
const dir = path.join(getCrewlyHomePath(), OWNER_HOOK_MESSAGE_CONSTANTS.OVERFLOW_DIR);
|
|
185
|
+
fs.mkdirSync(dir, { recursive: true });
|
|
186
|
+
const safe = label.replace(/[^A-Za-z0-9_-]/g, '_').slice(0, 80) || 'owner-message';
|
|
187
|
+
const file = path.join(dir, `${safe}-${Date.now()}.md`);
|
|
188
|
+
fs.writeFileSync(file, fullText, 'utf8');
|
|
189
|
+
return file;
|
|
190
|
+
};
|
|
191
|
+
}
|
|
192
|
+
/**
|
|
193
|
+
* Last resort when the full text cannot be written: cut the older middle,
|
|
194
|
+
* keeping the first block and the end, and say the owner's text was cut.
|
|
195
|
+
*
|
|
196
|
+
* @param data - The text
|
|
197
|
+
* @param room - Characters available
|
|
198
|
+
* @returns The text, cut in the middle
|
|
199
|
+
*/
|
|
200
|
+
function fitBody(data, room) {
|
|
201
|
+
if (data.length <= room)
|
|
202
|
+
return data;
|
|
203
|
+
const marker = '\n… (cut here to fit — the owner\'s message may be incomplete; read it in full in its conversation before you answer)\n';
|
|
64
204
|
if (room <= marker.length + 20)
|
|
65
205
|
return data.slice(data.length - Math.max(0, room));
|
|
66
206
|
const firstBreak = data.indexOf('\n\n');
|
|
67
207
|
const lead = firstBreak > 0 && firstBreak <= Math.floor(room / 4) ? data.slice(0, firstBreak) : '';
|
|
68
208
|
const keep = room - lead.length - marker.length;
|
|
69
209
|
let start = data.length - keep;
|
|
70
|
-
// Start the kept end on a whole line when one begins soon.
|
|
71
210
|
const nl = data.indexOf('\n', start);
|
|
72
211
|
if (nl >= 0 && nl - start < 200 && nl + 1 < data.length)
|
|
73
212
|
start = nl + 1;
|
|
@@ -81,36 +220,71 @@ export function fitKeepingNewest(data, room) {
|
|
|
81
220
|
* @param sessionName - The agent
|
|
82
221
|
* @param env - Environment (kill switch)
|
|
83
222
|
* @param queue - The message queue
|
|
223
|
+
* @param maxChars - Room for the note (what the other notes of this hook call leave)
|
|
224
|
+
* @param overflow - Where an owner message too long for the note is written in full
|
|
84
225
|
* @returns The note, or null
|
|
85
226
|
*/
|
|
86
|
-
export function ownerHookNoteFor(sessionName, env = process.env, queue = SubAgentMessageQueue.getInstance()) {
|
|
227
|
+
export function ownerHookNoteFor(sessionName, env = process.env, queue = SubAgentMessageQueue.getInstance(), maxChars = OWNER_HOOK_MESSAGE_CONSTANTS.MAX_CONTEXT_CHARS, overflow = defaultOverflowWriter(sessionName)) {
|
|
87
228
|
const C = OWNER_HOOK_MESSAGE_CONSTANTS;
|
|
88
229
|
if (env[C.KILL_SWITCH_ENV] === C.KILL_SWITCH_OFF_VALUE)
|
|
89
230
|
return null;
|
|
90
231
|
const message = queue.takeOwnerMessageForHook(sessionName);
|
|
91
|
-
return message ? buildOwnerHookNote(message) : null;
|
|
232
|
+
return message ? buildOwnerHookNote(message, maxChars, { overflow }) : null;
|
|
92
233
|
}
|
|
93
234
|
/**
|
|
94
|
-
* Join the notes for one hook response,
|
|
95
|
-
*
|
|
235
|
+
* Join the notes for one hook response, in priority order, within the size
|
|
236
|
+
* ceiling. Nothing goes silently (message-routing audit 2026-10-18): a note
|
|
237
|
+
* that does not fit is dropped and the result says how many were, and a
|
|
238
|
+
* first note longer than the ceiling is cut with a marker. Owner notes are
|
|
239
|
+
* built to fit their room ({@link ownerHookNoteFor}'s `maxChars`), so they
|
|
240
|
+
* are never cut here.
|
|
96
241
|
*
|
|
97
242
|
* @param notes - Notes in priority order (nulls skipped)
|
|
98
243
|
* @param maxChars - Ceiling
|
|
99
244
|
* @returns The joined text, or null when there is none
|
|
100
245
|
*/
|
|
101
246
|
export function joinHookNotes(notes, maxChars = OWNER_HOOK_MESSAGE_CONSTANTS.MAX_CONTEXT_CHARS) {
|
|
247
|
+
const present = notes.filter((n) => !!n);
|
|
248
|
+
const reserve = HOOK_NOTE_JOIN_RESERVE;
|
|
102
249
|
let out = '';
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
250
|
+
const dropped = [];
|
|
251
|
+
for (const [i, note] of present.entries()) {
|
|
252
|
+
const last = i === present.length - 1;
|
|
253
|
+
// Keep room for the "dropped" line unless nothing can follow.
|
|
254
|
+
const limit = last && dropped.length === 0 ? maxChars : maxChars - reserve;
|
|
106
255
|
const next = out ? `${out}\n\n${note}` : note;
|
|
107
|
-
if (next.length >
|
|
256
|
+
if (next.length > limit) {
|
|
108
257
|
if (!out)
|
|
109
|
-
out = note.slice(0,
|
|
258
|
+
out = `${note.slice(0, Math.max(0, limit - NOTE_CUT_MARKER.length))}${NOTE_CUT_MARKER}`;
|
|
259
|
+
else
|
|
260
|
+
dropped.push(note);
|
|
110
261
|
continue;
|
|
111
262
|
}
|
|
112
263
|
out = next;
|
|
113
264
|
}
|
|
265
|
+
if (dropped.length > 0)
|
|
266
|
+
out = `${out}\n\n${droppedNotice(dropped)}`;
|
|
114
267
|
return out || null;
|
|
115
268
|
}
|
|
269
|
+
/** Said at the end of a cut note */
|
|
270
|
+
const NOTE_CUT_MARKER = '\n… (note cut to fit)';
|
|
271
|
+
/** Room kept for the line that names the notes left out */
|
|
272
|
+
const DROPPED_NOTICE_ROOM = 200;
|
|
273
|
+
/**
|
|
274
|
+
* Room {@link joinHookNotes} keeps after a note that is not the last, for
|
|
275
|
+
* the line naming notes left out. A note built to go first takes at most
|
|
276
|
+
* the ceiling less this.
|
|
277
|
+
*/
|
|
278
|
+
export const HOOK_NOTE_JOIN_RESERVE = DROPPED_NOTICE_ROOM + 2;
|
|
279
|
+
/**
|
|
280
|
+
* The line that says which notes were left out (their openings).
|
|
281
|
+
*
|
|
282
|
+
* @param dropped - Notes left out
|
|
283
|
+
* @returns The line, at most {@link DROPPED_NOTICE_ROOM} characters
|
|
284
|
+
*/
|
|
285
|
+
function droppedNotice(dropped) {
|
|
286
|
+
const n = dropped.length;
|
|
287
|
+
const openings = dropped.map((d) => d.replace(/\s+/g, ' ').trim().slice(0, 60)).join(' | ');
|
|
288
|
+
return `[Left out to fit: ${n} more Crewly note${n === 1 ? '' : 's'} — ${openings}]`.slice(0, DROPPED_NOTICE_ROOM);
|
|
289
|
+
}
|
|
116
290
|
//# sourceMappingURL=owner-hook-message.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"owner-hook-message.js","sourceRoot":"","sources":["../../../../../../backend/src/services/messaging/owner-hook-message.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG;AAEH,OAAO,EAAE,4BAA4B,EAAE,MAAM,oBAAoB,CAAC;AAClE,OAAO,EAAE,oBAAoB,EAA6B,MAAM,sCAAsC,CAAC;
|
|
1
|
+
{"version":3,"file":"owner-hook-message.js","sourceRoot":"","sources":["../../../../../../backend/src/services/messaging/owner-hook-message.ts"],"names":[],"mappings":"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"}
|
|
@@ -381,14 +381,24 @@ export declare function setOwnerThreadSentinel(service: OwnerThreadSentinelServi
|
|
|
381
381
|
* @param event - What happened
|
|
382
382
|
*/
|
|
383
383
|
export declare function reportOwnerThreadBlocking(agent: string, event: SentinelEvent): void;
|
|
384
|
+
/** An agent's Slack post, as reported by {@link reportOwnerThreadAgentPost}. */
|
|
385
|
+
export type AgentSlackPost = SlackThreadRef & {
|
|
386
|
+
agent: string;
|
|
387
|
+
text: string;
|
|
388
|
+
interim?: boolean;
|
|
389
|
+
};
|
|
390
|
+
/**
|
|
391
|
+
* Listen to every agent Slack post made on this machine, with its author
|
|
392
|
+
* (crewly#1376: the owner completion report needs to know who posted).
|
|
393
|
+
*
|
|
394
|
+
* @param listener - Called once per post; must not throw (errors are swallowed)
|
|
395
|
+
* @returns Unsubscribe
|
|
396
|
+
*/
|
|
397
|
+
export declare function onAgentSlackPost(listener: (post: AgentSlackPost) => void): () => void;
|
|
384
398
|
/**
|
|
385
399
|
* Report an agent's Slack post, if the sentinel runs. Never throws.
|
|
386
400
|
*
|
|
387
401
|
* @param input - Who, where, what
|
|
388
402
|
*/
|
|
389
|
-
export declare function reportOwnerThreadAgentPost(input:
|
|
390
|
-
agent: string;
|
|
391
|
-
text: string;
|
|
392
|
-
interim?: boolean;
|
|
393
|
-
}): void;
|
|
403
|
+
export declare function reportOwnerThreadAgentPost(input: AgentSlackPost): void;
|
|
394
404
|
//# sourceMappingURL=owner-thread-sentinel.service.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"owner-thread-sentinel.service.d.ts","sourceRoot":"","sources":["../../../../../../backend/src/services/messaging/owner-thread-sentinel.service.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"owner-thread-sentinel.service.d.ts","sourceRoot":"","sources":["../../../../../../backend/src/services/messaging/owner-thread-sentinel.service.ts"],"names":[],"mappings":"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"}
|
|
@@ -870,6 +870,20 @@ export function reportOwnerThreadBlocking(agent, event) {
|
|
|
870
870
|
return;
|
|
871
871
|
void s.noteBlocking(agent, event).catch(() => undefined);
|
|
872
872
|
}
|
|
873
|
+
const agentPostListeners = new Set();
|
|
874
|
+
/**
|
|
875
|
+
* Listen to every agent Slack post made on this machine, with its author
|
|
876
|
+
* (crewly#1376: the owner completion report needs to know who posted).
|
|
877
|
+
*
|
|
878
|
+
* @param listener - Called once per post; must not throw (errors are swallowed)
|
|
879
|
+
* @returns Unsubscribe
|
|
880
|
+
*/
|
|
881
|
+
export function onAgentSlackPost(listener) {
|
|
882
|
+
agentPostListeners.add(listener);
|
|
883
|
+
return () => {
|
|
884
|
+
agentPostListeners.delete(listener);
|
|
885
|
+
};
|
|
886
|
+
}
|
|
873
887
|
/**
|
|
874
888
|
* Report an agent's Slack post, if the sentinel runs. Never throws.
|
|
875
889
|
*
|
|
@@ -879,6 +893,14 @@ export function reportOwnerThreadAgentPost(input) {
|
|
|
879
893
|
// The follow-through guard sees every agent post, including those in threads
|
|
880
894
|
// the sentinel does not watch (a decision card's thread, 2026-10-10).
|
|
881
895
|
reportAgentPostForFollowThrough({ agent: input.agent, text: input.text, ...(input.interim ? { interim: true } : {}) });
|
|
896
|
+
for (const listener of agentPostListeners) {
|
|
897
|
+
try {
|
|
898
|
+
listener(input);
|
|
899
|
+
}
|
|
900
|
+
catch {
|
|
901
|
+
/* best-effort */
|
|
902
|
+
}
|
|
903
|
+
}
|
|
882
904
|
try {
|
|
883
905
|
instance?.noteAgentPost(input);
|
|
884
906
|
}
|