crewly 1.20.168 → 1.20.170

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (152) hide show
  1. package/config/constants.ts +4 -0
  2. package/config/skills/_common/lib.sh +5 -0
  3. package/config/skills/agent/core/reply/SKILL.md +71 -0
  4. package/config/skills/agent/core/reply/execute.sh +81 -0
  5. package/config/skills/agent/core/reply/execute.test.sh +87 -0
  6. package/dist/backend/backend/src/constants.d.ts +101 -0
  7. package/dist/backend/backend/src/constants.d.ts.map +1 -1
  8. package/dist/backend/backend/src/constants.js +105 -0
  9. package/dist/backend/backend/src/constants.js.map +1 -1
  10. package/dist/backend/backend/src/controllers/chat/agent-reply.controller.d.ts +36 -0
  11. package/dist/backend/backend/src/controllers/chat/agent-reply.controller.d.ts.map +1 -0
  12. package/dist/backend/backend/src/controllers/chat/agent-reply.controller.js +182 -0
  13. package/dist/backend/backend/src/controllers/chat/agent-reply.controller.js.map +1 -0
  14. package/dist/backend/backend/src/controllers/chat/chat.controller.d.ts +30 -0
  15. package/dist/backend/backend/src/controllers/chat/chat.controller.d.ts.map +1 -1
  16. package/dist/backend/backend/src/controllers/chat/chat.controller.js +171 -0
  17. package/dist/backend/backend/src/controllers/chat/chat.controller.js.map +1 -1
  18. package/dist/backend/backend/src/controllers/chat/chat.routes.d.ts.map +1 -1
  19. package/dist/backend/backend/src/controllers/chat/chat.routes.js +4 -0
  20. package/dist/backend/backend/src/controllers/chat/chat.routes.js.map +1 -1
  21. package/dist/backend/backend/src/controllers/slack/slack.controller.d.ts +55 -0
  22. package/dist/backend/backend/src/controllers/slack/slack.controller.d.ts.map +1 -1
  23. package/dist/backend/backend/src/controllers/slack/slack.controller.js +1 -1
  24. package/dist/backend/backend/src/controllers/slack/slack.controller.js.map +1 -1
  25. package/dist/backend/backend/src/index.d.ts +10 -0
  26. package/dist/backend/backend/src/index.d.ts.map +1 -1
  27. package/dist/backend/backend/src/index.js +119 -1
  28. package/dist/backend/backend/src/index.js.map +1 -1
  29. package/dist/backend/backend/src/middleware/agent-origin.middleware.d.ts +45 -0
  30. package/dist/backend/backend/src/middleware/agent-origin.middleware.d.ts.map +1 -0
  31. package/dist/backend/backend/src/middleware/agent-origin.middleware.js +148 -0
  32. package/dist/backend/backend/src/middleware/agent-origin.middleware.js.map +1 -0
  33. package/dist/backend/backend/src/routes/modules/system.routes.d.ts.map +1 -1
  34. package/dist/backend/backend/src/routes/modules/system.routes.js +6 -0
  35. package/dist/backend/backend/src/routes/modules/system.routes.js.map +1 -1
  36. package/dist/backend/backend/src/services/agent/agent-process-origin.service.d.ts +86 -0
  37. package/dist/backend/backend/src/services/agent/agent-process-origin.service.d.ts.map +1 -0
  38. package/dist/backend/backend/src/services/agent/agent-process-origin.service.js +114 -0
  39. package/dist/backend/backend/src/services/agent/agent-process-origin.service.js.map +1 -0
  40. package/dist/backend/backend/src/services/agent/codex-daemon.utils.d.ts +56 -0
  41. package/dist/backend/backend/src/services/agent/codex-daemon.utils.d.ts.map +1 -0
  42. package/dist/backend/backend/src/services/agent/codex-daemon.utils.js +100 -0
  43. package/dist/backend/backend/src/services/agent/codex-daemon.utils.js.map +1 -0
  44. package/dist/backend/backend/src/services/agent/runtime-agent.service.abstract.d.ts +15 -0
  45. package/dist/backend/backend/src/services/agent/runtime-agent.service.abstract.d.ts.map +1 -1
  46. package/dist/backend/backend/src/services/agent/runtime-agent.service.abstract.js +27 -0
  47. package/dist/backend/backend/src/services/agent/runtime-agent.service.abstract.js.map +1 -1
  48. package/dist/backend/backend/src/services/chat-v2/chat-v2.dispatcher.service.d.ts +18 -0
  49. package/dist/backend/backend/src/services/chat-v2/chat-v2.dispatcher.service.d.ts.map +1 -1
  50. package/dist/backend/backend/src/services/chat-v2/chat-v2.dispatcher.service.js +48 -3
  51. package/dist/backend/backend/src/services/chat-v2/chat-v2.dispatcher.service.js.map +1 -1
  52. package/dist/backend/backend/src/services/messaging/owner-message-watchdog.service.d.ts +271 -0
  53. package/dist/backend/backend/src/services/messaging/owner-message-watchdog.service.d.ts.map +1 -0
  54. package/dist/backend/backend/src/services/messaging/owner-message-watchdog.service.js +605 -0
  55. package/dist/backend/backend/src/services/messaging/owner-message-watchdog.service.js.map +1 -0
  56. package/dist/backend/backend/src/services/messaging/owner-message-watchdog.wiring.d.ts +179 -0
  57. package/dist/backend/backend/src/services/messaging/owner-message-watchdog.wiring.d.ts.map +1 -0
  58. package/dist/backend/backend/src/services/messaging/owner-message-watchdog.wiring.js +327 -0
  59. package/dist/backend/backend/src/services/messaging/owner-message-watchdog.wiring.js.map +1 -0
  60. package/dist/backend/backend/src/services/orc/agent-reply-target.d.ts +95 -0
  61. package/dist/backend/backend/src/services/orc/agent-reply-target.d.ts.map +1 -0
  62. package/dist/backend/backend/src/services/orc/agent-reply-target.js +85 -0
  63. package/dist/backend/backend/src/services/orc/agent-reply-target.js.map +1 -0
  64. package/dist/backend/backend/src/services/orc/orc-reply-route.service.d.ts +20 -0
  65. package/dist/backend/backend/src/services/orc/orc-reply-route.service.d.ts.map +1 -1
  66. package/dist/backend/backend/src/services/orc/orc-reply-route.service.js +34 -1
  67. package/dist/backend/backend/src/services/orc/orc-reply-route.service.js.map +1 -1
  68. package/dist/backend/backend/src/services/slack/slack-initializer.d.ts.map +1 -1
  69. package/dist/backend/backend/src/services/slack/slack-initializer.js +5 -0
  70. package/dist/backend/backend/src/services/slack/slack-initializer.js.map +1 -1
  71. package/dist/backend/backend/src/services/slack/slack-orchestrator-bridge.d.ts +13 -0
  72. package/dist/backend/backend/src/services/slack/slack-orchestrator-bridge.d.ts.map +1 -1
  73. package/dist/backend/backend/src/services/slack/slack-orchestrator-bridge.js +40 -0
  74. package/dist/backend/backend/src/services/slack/slack-orchestrator-bridge.js.map +1 -1
  75. package/dist/backend/backend/src/services/slack/slack-team-channel.service.d.ts.map +1 -1
  76. package/dist/backend/backend/src/services/slack/slack-team-channel.service.js +2 -0
  77. package/dist/backend/backend/src/services/slack/slack-team-channel.service.js.map +1 -1
  78. package/dist/backend/backend/src/services/slack/slack-typing-placeholder.service.d.ts +33 -0
  79. package/dist/backend/backend/src/services/slack/slack-typing-placeholder.service.d.ts.map +1 -1
  80. package/dist/backend/backend/src/services/slack/slack-typing-placeholder.service.js +68 -0
  81. package/dist/backend/backend/src/services/slack/slack-typing-placeholder.service.js.map +1 -1
  82. package/dist/backend/backend/src/services/slack/slack.service.d.ts +16 -0
  83. package/dist/backend/backend/src/services/slack/slack.service.d.ts.map +1 -1
  84. package/dist/backend/backend/src/services/slack/slack.service.js +22 -5
  85. package/dist/backend/backend/src/services/slack/slack.service.js.map +1 -1
  86. package/dist/backend/backend/src/services/system/auto-update.service.d.ts +15 -5
  87. package/dist/backend/backend/src/services/system/auto-update.service.d.ts.map +1 -1
  88. package/dist/backend/backend/src/services/system/auto-update.service.js +26 -21
  89. package/dist/backend/backend/src/services/system/auto-update.service.js.map +1 -1
  90. package/dist/backend/backend/src/services/system/auto-update.utils.d.ts +51 -0
  91. package/dist/backend/backend/src/services/system/auto-update.utils.d.ts.map +1 -1
  92. package/dist/backend/backend/src/services/system/auto-update.utils.js +103 -0
  93. package/dist/backend/backend/src/services/system/auto-update.utils.js.map +1 -1
  94. package/dist/backend/backend/src/types/slack.types.d.ts +6 -0
  95. package/dist/backend/backend/src/types/slack.types.d.ts.map +1 -1
  96. package/dist/backend/backend/src/types/slack.types.js.map +1 -1
  97. package/dist/backend/build-info.json +2 -2
  98. package/dist/backend/config/constants.d.ts +4 -0
  99. package/dist/backend/config/constants.d.ts.map +1 -1
  100. package/dist/backend/config/constants.js +4 -0
  101. package/dist/backend/config/constants.js.map +1 -1
  102. package/dist/cli/backend/src/constants.d.ts +101 -0
  103. package/dist/cli/backend/src/constants.d.ts.map +1 -1
  104. package/dist/cli/backend/src/constants.js +105 -0
  105. package/dist/cli/backend/src/constants.js.map +1 -1
  106. package/dist/cli/backend/src/services/agent/codex-daemon.utils.d.ts +56 -0
  107. package/dist/cli/backend/src/services/agent/codex-daemon.utils.d.ts.map +1 -0
  108. package/dist/cli/backend/src/services/agent/codex-daemon.utils.js +100 -0
  109. package/dist/cli/backend/src/services/agent/codex-daemon.utils.js.map +1 -0
  110. package/dist/cli/backend/src/services/agent/runtime-agent.service.abstract.d.ts +15 -0
  111. package/dist/cli/backend/src/services/agent/runtime-agent.service.abstract.d.ts.map +1 -1
  112. package/dist/cli/backend/src/services/agent/runtime-agent.service.abstract.js +27 -0
  113. package/dist/cli/backend/src/services/agent/runtime-agent.service.abstract.js.map +1 -1
  114. package/dist/cli/backend/src/services/chat-v2/chat-v2.dispatcher.service.d.ts +18 -0
  115. package/dist/cli/backend/src/services/chat-v2/chat-v2.dispatcher.service.d.ts.map +1 -1
  116. package/dist/cli/backend/src/services/chat-v2/chat-v2.dispatcher.service.js +48 -3
  117. package/dist/cli/backend/src/services/chat-v2/chat-v2.dispatcher.service.js.map +1 -1
  118. package/dist/cli/backend/src/services/messaging/owner-message-watchdog.service.d.ts +271 -0
  119. package/dist/cli/backend/src/services/messaging/owner-message-watchdog.service.d.ts.map +1 -0
  120. package/dist/cli/backend/src/services/messaging/owner-message-watchdog.service.js +605 -0
  121. package/dist/cli/backend/src/services/messaging/owner-message-watchdog.service.js.map +1 -0
  122. package/dist/cli/backend/src/services/orc/orc-reply-route.service.d.ts +20 -0
  123. package/dist/cli/backend/src/services/orc/orc-reply-route.service.d.ts.map +1 -1
  124. package/dist/cli/backend/src/services/orc/orc-reply-route.service.js +34 -1
  125. package/dist/cli/backend/src/services/orc/orc-reply-route.service.js.map +1 -1
  126. package/dist/cli/backend/src/services/slack/slack-orchestrator-bridge.d.ts +13 -0
  127. package/dist/cli/backend/src/services/slack/slack-orchestrator-bridge.d.ts.map +1 -1
  128. package/dist/cli/backend/src/services/slack/slack-orchestrator-bridge.js +40 -0
  129. package/dist/cli/backend/src/services/slack/slack-orchestrator-bridge.js.map +1 -1
  130. package/dist/cli/backend/src/services/slack/slack-team-channel.service.d.ts.map +1 -1
  131. package/dist/cli/backend/src/services/slack/slack-team-channel.service.js +2 -0
  132. package/dist/cli/backend/src/services/slack/slack-team-channel.service.js.map +1 -1
  133. package/dist/cli/backend/src/services/slack/slack-typing-placeholder.service.d.ts +33 -0
  134. package/dist/cli/backend/src/services/slack/slack-typing-placeholder.service.d.ts.map +1 -1
  135. package/dist/cli/backend/src/services/slack/slack-typing-placeholder.service.js +68 -0
  136. package/dist/cli/backend/src/services/slack/slack-typing-placeholder.service.js.map +1 -1
  137. package/dist/cli/backend/src/services/slack/slack.service.d.ts +16 -0
  138. package/dist/cli/backend/src/services/slack/slack.service.d.ts.map +1 -1
  139. package/dist/cli/backend/src/services/slack/slack.service.js +22 -5
  140. package/dist/cli/backend/src/services/slack/slack.service.js.map +1 -1
  141. package/dist/cli/backend/src/services/system/auto-update.utils.d.ts +51 -0
  142. package/dist/cli/backend/src/services/system/auto-update.utils.d.ts.map +1 -1
  143. package/dist/cli/backend/src/services/system/auto-update.utils.js +103 -0
  144. package/dist/cli/backend/src/services/system/auto-update.utils.js.map +1 -1
  145. package/dist/cli/backend/src/types/slack.types.d.ts +6 -0
  146. package/dist/cli/backend/src/types/slack.types.d.ts.map +1 -1
  147. package/dist/cli/backend/src/types/slack.types.js.map +1 -1
  148. package/dist/cli/config/constants.d.ts +4 -0
  149. package/dist/cli/config/constants.d.ts.map +1 -1
  150. package/dist/cli/config/constants.js +4 -0
  151. package/dist/cli/config/constants.js.map +1 -1
  152. package/package.json +1 -1
@@ -0,0 +1,271 @@
1
+ /**
2
+ * Unanswered-owner-message watchdog.
3
+ *
4
+ * Every owner message delivered to an agent on this machine ends in either an
5
+ * answer the owner can see, or ONE plain-words note in the same thread saying
6
+ * who it is waiting on and why. Four different bugs on 2026-09-30 each lost an
7
+ * owner message silently; each was fixed on its own, but nothing guaranteed
8
+ * the end-to-end property. This does.
9
+ *
10
+ * Timeline per message (constants in OWNER_MESSAGE_WATCHDOG_CONSTANTS):
11
+ * - an answer (or a settled placeholder, or `reply --none`) clears it;
12
+ * - a placeholder showing while the agent is mid-turn extends the wait, up
13
+ * to BUSY_EXTEND_CAP_MS, then a note;
14
+ * - T1 → one re-delivery ("nudge") to the responsible agent, waking it;
15
+ * an agent that cannot be reached skips straight to the note;
16
+ * - T2 → one note, and the message is no longer tracked.
17
+ *
18
+ * The service is transport-agnostic: what counts as "delivered", "answered",
19
+ * "busy" and how to nudge / post a note are injected (see the wiring module).
20
+ *
21
+ * @module services/messaging/owner-message-watchdog.service
22
+ * @see specs/2026-09-30-owner-message-guarantee.md
23
+ */
24
+ /** Where the owner wrote: a Slack conversation, or a Crewly chat (portal / Talk / dashboard). */
25
+ export type OwnerMessageSurface = 'slack' | 'chat';
26
+ /** What a watched message needs to be tracked. */
27
+ export interface OwnerMessageTrackInput {
28
+ surface: OwnerMessageSurface;
29
+ /** Slack channel / DM id (slack surface) */
30
+ slackChannelId?: string;
31
+ /** Slack thread root the answer belongs in (slack surface) */
32
+ threadTs?: string;
33
+ /** The owner's Slack message ts (dedupe key for slack) */
34
+ sourceTs?: string;
35
+ /** chat-v2 channel / conversation the message was recorded in (both surfaces when known) */
36
+ chatChannelId?: string;
37
+ /** chat-v2 thread the answer belongs in (huddles) */
38
+ chatThreadId?: string;
39
+ /** chat-v2 message id (dedupe key for chat) */
40
+ messageId?: string;
41
+ /** The agent that must answer (nudged at T1, named in the note) */
42
+ responsible: string;
43
+ /** Every agent that holds the message */
44
+ recipients: readonly string[];
45
+ /** True when at least one recipient was required to answer (DM, @mention, woken lead) */
46
+ required: boolean;
47
+ /** The owner's words */
48
+ text: string;
49
+ /** When it arrived (epoch ms); defaults to now */
50
+ receivedAt?: number;
51
+ }
52
+ /** One tracked message. */
53
+ export interface OwnerMessageEntry {
54
+ key: string;
55
+ surface: OwnerMessageSurface;
56
+ slackChannelId?: string;
57
+ threadTs?: string;
58
+ sourceTs?: string;
59
+ chatChannelId?: string;
60
+ chatThreadId?: string;
61
+ messageId?: string;
62
+ responsible: string;
63
+ recipients: string[];
64
+ required: boolean;
65
+ /** Clipped owner text */
66
+ preview: string;
67
+ receivedAt: number;
68
+ stage: 'waiting' | 'nudged';
69
+ nudgedAt?: number;
70
+ /** A nudge that could not reach the agent */
71
+ nudgeBlocked?: {
72
+ reason: NudgeBlockReason;
73
+ detail?: string;
74
+ };
75
+ /** An interim note was posted in chat (a visible "working on it") */
76
+ interimAt?: number;
77
+ /** The nudged agent started a turn after the nudge */
78
+ busyAfterNudge?: boolean;
79
+ /** …and finished it */
80
+ turnDoneAfterNudge?: boolean;
81
+ /** Extension already logged */
82
+ extendedLogged?: boolean;
83
+ }
84
+ /** Why a nudge could not reach the agent. */
85
+ export type NudgeBlockReason = 'asleep' | 'login' | 'error';
86
+ /** Outcome of one nudge. */
87
+ export type NudgeOutcome = {
88
+ outcome: 'sent';
89
+ } | {
90
+ outcome: 'blocked';
91
+ reason: NudgeBlockReason;
92
+ detail?: string;
93
+ };
94
+ /** Pending sign-in, for the one-tap fix in the note. */
95
+ export interface LoginHint {
96
+ /** Human name of the runtime ("Claude", "Codex") */
97
+ runtime: string;
98
+ /** Word the owner types after 重新登录 ("claude", "codex") */
99
+ runtimeCmd: string;
100
+ }
101
+ /** Injected behaviour. */
102
+ export interface OwnerMessageWatchdogDeps {
103
+ /** Is the agent mid-turn right now? */
104
+ isBusy: (agentSession: string) => boolean;
105
+ /** Is a "working on it" placeholder showing where the answer will land (slack surface)? */
106
+ hasVisiblePlaceholder?: (entry: OwnerMessageEntry) => boolean;
107
+ /** Re-deliver the message to its responsible agent, waking it when stopped. */
108
+ nudge: (entry: OwnerMessageEntry, waitedMinutes: number) => Promise<NudgeOutcome>;
109
+ /** Post the note where the owner wrote. Returns false when it could not be posted. */
110
+ postNote: (entry: OwnerMessageEntry, text: string) => Promise<boolean>;
111
+ /** A sign-in the agent's runtime is waiting for, if any. */
112
+ loginRequired?: (agentSession: string) => LoginHint | null;
113
+ /** Display name for notes ("Ella"); defaults to the session name. */
114
+ displayNameOf?: (agentSession: string) => string;
115
+ /** Persisted state; omitted in tests that do not exercise restarts. */
116
+ storePath?: string;
117
+ /** Clock (tests). */
118
+ now?: () => number;
119
+ }
120
+ /** Row of the debug listing. */
121
+ export interface OwnerMessageListing {
122
+ key: string;
123
+ surface: OwnerMessageSurface;
124
+ where: string;
125
+ responsible: string;
126
+ recipients: string[];
127
+ required: boolean;
128
+ ageMinutes: number;
129
+ stage: OwnerMessageEntry['stage'];
130
+ nudgedMinutesAgo?: number;
131
+ nudgeBlocked?: OwnerMessageEntry['nudgeBlocked'];
132
+ preview: string;
133
+ }
134
+ /**
135
+ * Whether a whole message is a bare acknowledgement ("好", "ok", "👍", "谢谢")
136
+ * that needs no answer.
137
+ *
138
+ * @param text - The owner's message
139
+ * @returns True for an acknowledgement from ACK_WORDS
140
+ */
141
+ export declare function isAcknowledgement(text: string): boolean;
142
+ /**
143
+ * The dedupe key of a message.
144
+ *
145
+ * @param input - Track input (or entry)
146
+ * @returns `slack:<channel>:<ts>` / `chat:<channel>:<messageId>`, or null when underspecified
147
+ */
148
+ export declare function ownerMessageKey(input: Pick<OwnerMessageTrackInput, 'surface' | 'slackChannelId' | 'sourceTs' | 'threadTs' | 'chatChannelId' | 'messageId'>): string | null;
149
+ /**
150
+ * Tracks owner messages until they are answered, nudging and then noting.
151
+ */
152
+ export declare class OwnerMessageWatchdogService {
153
+ private readonly deps;
154
+ private readonly logger;
155
+ private readonly entries;
156
+ /** Recently finished keys, oldest first (Map keeps insertion order). */
157
+ private readonly resolved;
158
+ /** Thread → when an answer was last seen there (answers can beat the tracking call). */
159
+ private readonly recentAnswers;
160
+ private timer;
161
+ private ticking;
162
+ /**
163
+ * @param deps - Injected behaviour (see {@link OwnerMessageWatchdogDeps})
164
+ */
165
+ constructor(deps: OwnerMessageWatchdogDeps);
166
+ private now;
167
+ /** Start the periodic evaluation. */
168
+ start(): void;
169
+ /** Stop the periodic evaluation. */
170
+ stop(): void;
171
+ /**
172
+ * Start watching an owner message that was delivered to at least one agent.
173
+ * A second delivery of the same message (a hand-off, a re-dispatch) updates
174
+ * the entry rather than adding one; a message already answered is ignored.
175
+ *
176
+ * @param input - The message and who holds it
177
+ * @returns The entry, or null when it is not tracked (ack, answered, underspecified)
178
+ */
179
+ track(input: OwnerMessageTrackInput): OwnerMessageEntry | null;
180
+ /**
181
+ * Something the owner can see was posted in a Slack thread (an answer, a
182
+ * file, a settled placeholder, a colleague on another machine).
183
+ *
184
+ * @param slackChannelId - Slack channel / DM
185
+ * @param threadTs - Thread root (undefined = top level: clears nothing)
186
+ * @param why - For the log
187
+ * @returns How many entries were cleared
188
+ */
189
+ noteSlackAnswer(slackChannelId: string, threadTs: string | undefined, why: string): number;
190
+ /**
191
+ * An agent (or the orchestrator) spoke in a Crewly chat channel.
192
+ *
193
+ * @param chatChannelId - chat-v2 channel
194
+ * @param threadId - Thread of the turn (null/undefined = top level)
195
+ * @param interim - An interim note: shown, but the answer is still owed
196
+ * @returns How many entries were cleared
197
+ */
198
+ noteChatAnswer(chatChannelId: string, threadId: string | null | undefined, interim: boolean): number;
199
+ /**
200
+ * The responsible agent said no answer is needed (`reply --none`) for what
201
+ * it was asked in this conversation.
202
+ *
203
+ * @param agentSession - The agent
204
+ * @param where - Conversation (and thread) of its turn origin
205
+ * @returns How many entries were closed
206
+ */
207
+ closeByAgent(agentSession: string, where: {
208
+ chatChannelId?: string;
209
+ slackChannelId?: string;
210
+ threadTs?: string;
211
+ }): number;
212
+ /**
213
+ * An agent's working status changed. After a nudge, an optional-only
214
+ * message whose agent then finished a whole turn without answering is
215
+ * that agent's judgement ("not for me") — closed quietly at the next tick.
216
+ *
217
+ * @param agentSession - The agent
218
+ * @param busy - True when a turn started, false when it ended
219
+ */
220
+ noteAgentTurn(agentSession: string, busy: boolean): void;
221
+ /**
222
+ * Open messages an agent holds (responsible or recipient), oldest first.
223
+ *
224
+ * @param agentSession - The agent
225
+ * @returns Entries
226
+ */
227
+ owedBy(agentSession: string): OwnerMessageEntry[];
228
+ /**
229
+ * Debug listing of what is still waiting.
230
+ *
231
+ * @returns One row per tracked message, oldest first
232
+ */
233
+ list(): OwnerMessageListing[];
234
+ /** Number of tracked messages. */
235
+ get size(): number;
236
+ /**
237
+ * Evaluate every tracked message once. Safe to call concurrently (a second
238
+ * call while one runs is a no-op).
239
+ *
240
+ * @returns When the evaluation is done
241
+ */
242
+ tick(): Promise<void>;
243
+ private evaluate;
244
+ private isVisiblyWorking;
245
+ private runNudge;
246
+ /**
247
+ * Post the one note and stop tracking.
248
+ *
249
+ * @param entry - The message
250
+ * @param kind - Why now
251
+ */
252
+ private note;
253
+ /**
254
+ * The note in plain words.
255
+ *
256
+ * @param entry - The message
257
+ * @param kind - Why now
258
+ * @returns The note text
259
+ */
260
+ noteText(entry: OwnerMessageEntry, kind: 'cap' | 'silent' | 'blocked'): string;
261
+ private noteRecentAnswer;
262
+ private remember;
263
+ private finish;
264
+ private persist;
265
+ private load;
266
+ }
267
+ /** @returns The wired watchdog, or null before it started (and in tests). */
268
+ export declare function getOwnerMessageWatchdog(): OwnerMessageWatchdogService | null;
269
+ /** @param service - The watchdog to expose (null to clear) */
270
+ export declare function setOwnerMessageWatchdog(service: OwnerMessageWatchdogService | null): void;
271
+ //# sourceMappingURL=owner-message-watchdog.service.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"owner-message-watchdog.service.d.ts","sourceRoot":"","sources":["../../../../../../backend/src/services/messaging/owner-message-watchdog.service.ts"],"names":[],"mappings":"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"}