cli-jaw 2.17.24 → 2.17.26

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 (44) hide show
  1. package/README.md +2 -0
  2. package/dist/bin/commands/doctor.js +21 -0
  3. package/dist/bin/commands/doctor.js.map +1 -1
  4. package/dist/bin/commands/slack.js +36 -4
  5. package/dist/bin/commands/slack.js.map +1 -1
  6. package/dist/src/agent/spawn.js +9 -2
  7. package/dist/src/agent/spawn.js.map +1 -1
  8. package/dist/src/core/agent-readiness.js +137 -0
  9. package/dist/src/core/agent-readiness.js.map +1 -0
  10. package/dist/src/core/cli-detect.js +51 -8
  11. package/dist/src/core/cli-detect.js.map +1 -1
  12. package/dist/src/core/config.js +42 -0
  13. package/dist/src/core/config.js.map +1 -1
  14. package/dist/src/core/db.js +97 -0
  15. package/dist/src/core/db.js.map +1 -1
  16. package/dist/src/core/rate-limit.js +4 -0
  17. package/dist/src/core/rate-limit.js.map +1 -1
  18. package/dist/src/core/runtime-path.js +49 -1
  19. package/dist/src/core/runtime-path.js.map +1 -1
  20. package/dist/src/discord/bot.js +2 -1
  21. package/dist/src/discord/bot.js.map +1 -1
  22. package/dist/src/memory/heartbeat-mention-watch.js +193 -0
  23. package/dist/src/memory/heartbeat-mention-watch.js.map +1 -0
  24. package/dist/src/memory/heartbeat.js +156 -1
  25. package/dist/src/memory/heartbeat.js.map +1 -1
  26. package/dist/src/messaging/channel-health.js +16 -1
  27. package/dist/src/messaging/channel-health.js.map +1 -1
  28. package/dist/src/messaging/forwarder-origin.js +36 -0
  29. package/dist/src/messaging/forwarder-origin.js.map +1 -0
  30. package/dist/src/routes/heartbeat.js +28 -1
  31. package/dist/src/routes/heartbeat.js.map +1 -1
  32. package/dist/src/routes/system.js +26 -0
  33. package/dist/src/routes/system.js.map +1 -1
  34. package/dist/src/slack/bot.js +2 -1
  35. package/dist/src/slack/bot.js.map +1 -1
  36. package/dist/src/slack/history.js +5 -1
  37. package/dist/src/slack/history.js.map +1 -1
  38. package/dist/src/slack/hot-notify.js +7 -2
  39. package/dist/src/slack/hot-notify.js.map +1 -1
  40. package/dist/src/slack/mention-watch.js +259 -0
  41. package/dist/src/slack/mention-watch.js.map +1 -0
  42. package/dist/src/telegram/bot.js +4 -1
  43. package/dist/src/telegram/bot.js.map +1 -1
  44. package/package.json +1 -1
@@ -0,0 +1,193 @@
1
+ // ─── Heartbeat mention watch ─────────────────────────
2
+ // One tick of "find messages that tagged this person, answer each in its
3
+ // thread". The scan itself lives in src/slack/mention-watch.ts; this module owns
4
+ // the parts that must be durable: which messages are already answered, how far
5
+ // each channel has been read, and the rule that the SERVER posts the answer.
6
+ //
7
+ // WHY THE SERVER SENDS
8
+ //
9
+ // Letting the agent post directly makes a tick's success meaningless as evidence
10
+ // of delivery: it can answer three threads, fail on two sends, and still exit
11
+ // with a clean transcript. Here each item is a separate round trip — ask, send,
12
+ // record — so a receipt exists per message and a partial tick leaves the rest
13
+ // unrecorded for the next one to pick up.
14
+ //
15
+ // The guarantee is AT-LEAST-ONCE. If the process dies between a successful post
16
+ // and its 'seen' write, the next tick answers that message again. Exactly-once
17
+ // needs a durable reservation taken before the send plus an ambiguous state to
18
+ // resolve afterwards, which is more machinery than this is worth today. The limit
19
+ // is written down rather than papered over.
20
+ import { findMentionWatchSeen, insertMentionWatchSeen, pruneMentionWatchSeen, getMentionWatchCursor, upsertMentionWatchCursor, setMentionWatchResumeBefore, getMentionWatchRotation, upsertMentionWatchRotation, } from '../core/db.js';
21
+ import { scanSlackMentions, MENTION_WATCH_DEFAULT_MAX_HITS } from '../slack/mention-watch.js';
22
+ /** Intersect the job's channels with the live allowlist.
23
+ *
24
+ * Re-derived every tick on purpose. The allowlist can shrink after a job was
25
+ * saved, and the timer holds the job object as it was — so a check made only at
26
+ * save time would send this scan after channels whose answers now 403. */
27
+ function authorizedChannels(configured, allowlist) {
28
+ // An empty allowlist does NOT mean "anything goes" for an explicitly
29
+ // addressed send. `authorizeExplicitTarget` falls back to vouching only for
30
+ // conversations this process has evidence for — last-active, latest-seen, or a
31
+ // bound conversation — so a channel with no such evidence is refused with a
32
+ // 403 (src/messaging/send.ts:301).
33
+ //
34
+ // Reading it anyway would be worse than useless: the scan finds a mention,
35
+ // pays for an agent turn to answer it, gets a 403, records no receipt, and
36
+ // does the whole thing again next tick. Refusing to scan is the honest
37
+ // answer, and `unauthorized` says which channels need an allowlist entry.
38
+ if (allowlist.length === 0)
39
+ return { allowed: [], rejected: [...configured] };
40
+ const permitted = new Set(allowlist);
41
+ const allowed = [];
42
+ const rejected = [];
43
+ for (const id of configured)
44
+ (permitted.has(id) ? allowed : rejected).push(id);
45
+ return { allowed, rejected };
46
+ }
47
+ export async function runMentionWatchTick(jobId, job, watch, deps) {
48
+ const now = deps.now ?? Date.now;
49
+ const log = deps.log ?? (() => { });
50
+ const result = {
51
+ answered: 0, quiet: 0, failed: 0,
52
+ unreadable: [], unauthorized: [], overflow: [],
53
+ };
54
+ const { allowed, rejected } = authorizedChannels(watch.channelIds, deps.allowlist);
55
+ result.unauthorized = rejected;
56
+ if (rejected.length) {
57
+ // Two different situations, and an operator needs to be told which. An
58
+ // empty allowlist is the shipped default and reads as "every conversation"
59
+ // for an ordinary reply, but an explicitly addressed send still needs a
60
+ // configured list or prior evidence for that conversation — so a watch
61
+ // running under it would find mentions it cannot answer.
62
+ const reason = deps.allowlist.length === 0
63
+ ? 'slack.channelIds is empty, so an explicitly addressed send has nothing to authorize against; add the watched channels to it'
64
+ : 'outside slack.channelIds';
65
+ log(`mention watch: skipped ${rejected.length} channel(s) — ${reason}: ${rejected.join(', ')}`);
66
+ }
67
+ if (allowed.length === 0)
68
+ return result;
69
+ const rotation = getMentionWatchRotation.get(jobId);
70
+ const scan = await scanSlackMentions(deps.token, {
71
+ userId: watch.userId,
72
+ channelIds: allowed,
73
+ selfUserId: deps.selfUserId,
74
+ maxHits: watch.maxHits ?? MENTION_WATCH_DEFAULT_MAX_HITS,
75
+ ...(watch.since ? { since: watch.since } : {}),
76
+ ...(rotation?.last_channel_id ? { startAfterChannelId: rotation.last_channel_id } : {}),
77
+ ...(deps.fetchImpl ? { fetchImpl: deps.fetchImpl } : {}),
78
+ ...(deps.signal ? { signal: deps.signal } : {}),
79
+ state: {
80
+ cursor: (channelId) => {
81
+ const row = getMentionWatchCursor.get(jobId, channelId);
82
+ // An empty string is the placeholder a resume-only write leaves
83
+ // behind; it must not read as a cursor at ts 0.
84
+ return row?.last_ts ? row.last_ts : undefined;
85
+ },
86
+ resumeBefore: (channelId) => {
87
+ const row = getMentionWatchCursor.get(jobId, channelId);
88
+ return row?.resume_before ? row.resume_before : undefined;
89
+ },
90
+ seen: (channelId, ts) => findMentionWatchSeen.get(jobId, channelId, ts) !== undefined,
91
+ },
92
+ });
93
+ result.unreadable = scan.failed.map(f => f.channelId);
94
+ result.overflow = scan.overflowChannels;
95
+ if (scan.overflowChannels.length) {
96
+ log(`mention watch: ${scan.overflowChannels.length} channel(s) past the scanner ceiling were not read: ${scan.overflowChannels.join(', ')}`);
97
+ }
98
+ for (const failure of scan.failed)
99
+ log(`mention watch: ${failure.channelId} unreadable: ${failure.error}`);
100
+ // Rotation and resume bounds are persisted BEFORE any answering, because they
101
+ // describe what the SCAN did. Writing them afterwards would lose them
102
+ // whenever the answering loop exits early, and the next tick would repeat the
103
+ // same reads.
104
+ if (scan.lastChannelId)
105
+ upsertMentionWatchRotation.run(jobId, scan.lastChannelId, now());
106
+ for (const [channelId, bound] of scan.resumeBounds) {
107
+ setMentionWatchResumeBefore.run(jobId, channelId, jobId, channelId, bound, now());
108
+ }
109
+ for (const hit of scan.hits) {
110
+ if (deps.signal?.aborted) {
111
+ result.stoppedBecause = 'aborted';
112
+ break;
113
+ }
114
+ // Re-checked per item, not once for the batch: the previous answer may
115
+ // have taken minutes, and a user who started typing during it outranks
116
+ // the rest of this backlog.
117
+ const yielded = deps.yieldNow();
118
+ if (yielded) {
119
+ result.stoppedBecause = yielded;
120
+ break;
121
+ }
122
+ let text;
123
+ try {
124
+ text = await deps.answer(hit, job);
125
+ }
126
+ catch (error) {
127
+ result.failed += 1;
128
+ log(`mention watch: answer failed for ${hit.channelId}/${hit.ts}: ${error.message}`);
129
+ continue;
130
+ }
131
+ if (!text) {
132
+ // Deliberate silence is a decision about this message, so record it:
133
+ // otherwise every tick asks again and pays for the same answer.
134
+ insertMentionWatchSeen.run(jobId, hit.channelId, hit.ts, now());
135
+ result.quiet += 1;
136
+ continue;
137
+ }
138
+ const sent = await deps.send(hit, text);
139
+ if (!sent) {
140
+ // No receipt on a failed send: the next tick must be free to retry.
141
+ result.failed += 1;
142
+ log(`mention watch: send failed for ${hit.channelId}/${hit.ts}`);
143
+ continue;
144
+ }
145
+ insertMentionWatchSeen.run(jobId, hit.channelId, hit.ts, now());
146
+ result.answered += 1;
147
+ }
148
+ if (scan.rateLimited)
149
+ result.stoppedBecause ??= 'rate_limited';
150
+ // Cursors move LAST, because only now is delivery known.
151
+ //
152
+ // The scanner's frontier deliberately stops BEFORE any hit it carried: at scan
153
+ // time it cannot know whether that message will be answered, so it refuses to
154
+ // step over it. Delivery is this function's knowledge, so the settled hits are
155
+ // folded in here. Without that the cursor would never pass a mention at all
156
+ // and every tick would re-read the same window forever.
157
+ const unsettled = new Set();
158
+ const settledHigh = new Map();
159
+ for (const hit of scan.hits) {
160
+ if (findMentionWatchSeen.get(jobId, hit.channelId, hit.ts) === undefined) {
161
+ unsettled.add(hit.channelId);
162
+ continue;
163
+ }
164
+ const high = settledHigh.get(hit.channelId);
165
+ if (high === undefined || Number(hit.ts) > Number(high))
166
+ settledHigh.set(hit.channelId, hit.ts);
167
+ }
168
+ const advanceTo = new Map();
169
+ for (const [channelId, frontier] of scan.cursors)
170
+ advanceTo.set(channelId, frontier);
171
+ for (const [channelId, ts] of settledHigh) {
172
+ // Only for a channel whose backward walk actually reached the cursor. A
173
+ // truncated walk leaves an unread gap BELOW this span, and moving the
174
+ // cursor above that gap would skip whatever is in it for good.
175
+ if (scan.resumeBounds.get(channelId) !== null)
176
+ continue;
177
+ const existing = advanceTo.get(channelId);
178
+ if (existing === undefined || Number(ts) > Number(existing))
179
+ advanceTo.set(channelId, ts);
180
+ }
181
+ for (const [channelId, frontier] of advanceTo) {
182
+ // One unsettled hit holds the whole channel: the cursor may not pass a
183
+ // message this tick failed to answer, even if a later one succeeded.
184
+ if (unsettled.has(channelId))
185
+ continue;
186
+ upsertMentionWatchCursor.run(jobId, channelId, frontier, now());
187
+ // Receipts at or below the frontier can never be consulted again: the
188
+ // next scan reads strictly above it.
189
+ pruneMentionWatchSeen.run(jobId, channelId, frontier);
190
+ }
191
+ return result;
192
+ }
193
+ //# sourceMappingURL=heartbeat-mention-watch.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"heartbeat-mention-watch.js","sourceRoot":"","sources":["../../../src/memory/heartbeat-mention-watch.ts"],"names":[],"mappings":"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"}
@@ -11,7 +11,11 @@ import { claimWorker, failWorker, finishWorker, markWorkerReplayed, WorkerBusyEr
11
11
  import { hasPendingWorkerReplays } from '../orchestrator/worker-registry.js';
12
12
  import { broadcast } from '../core/bus.js';
13
13
  import { sendChannelOutput, targetFromChatId } from '../messaging/send.js';
14
- import { isHeartbeatDestination } from '../core/config.js';
14
+ import { nextDeliverySeq, wasSelfDelivered } from '../messaging/turn-delivery.js';
15
+ import { isHeartbeatDestination, isHeartbeatMentionWatch } from '../core/config.js';
16
+ import { runMentionWatchTick } from './heartbeat-mention-watch.js';
17
+ import { getSlackSelfUserId } from '../slack/bot.js';
18
+ import { readSlackAllowlist } from '../slack/events.js';
15
19
  import { getEmployees, insertHeartbeatAnchor } from '../core/db.js';
16
20
  import { runSingleAgent } from '../orchestrator/distribute.js';
17
21
  import { getState } from '../orchestrator/state-machine.js';
@@ -158,6 +162,144 @@ async function runEmployee(job, prompt) {
158
162
  throw error;
159
163
  }
160
164
  }
165
+ /** One mention-watch tick, run in place of the ordinary prompt path.
166
+ *
167
+ * The agent is asked per message and never posts: this function sends, then
168
+ * records the receipt. See heartbeat-mention-watch.ts for why that ordering is
169
+ * the whole point.
170
+ *
171
+ * Returns false when the job is not runnable as a mention watch at all, so the
172
+ * caller can say so rather than silently running the prompt against nothing. */
173
+ async function runMentionWatchJob(job, watch) {
174
+ // Per-hit delivery anchor, read before the agent turn and consumed by the
175
+ // send. Scoped to this call so nothing survives the tick.
176
+ const answerAnchors = new Map();
177
+ const sc = settings["slack"] || {};
178
+ const token = String(sc["botToken"] ?? '').trim();
179
+ if (!sc["enabled"] || !token) {
180
+ log.error(`[heartbeat:${job["name"]}] mention watch needs Slack enabled with a bot token`);
181
+ return false;
182
+ }
183
+ const { pinned, target } = heartbeatTarget(job["destination"]);
184
+ if (pinned && !target) {
185
+ log.error(`[heartbeat:${job["name"]}] malformed destination — mention watch not run`);
186
+ return false;
187
+ }
188
+ const outcome = await runMentionWatchTick(String(job["id"] ?? job["name"] ?? 'unknown'), job, watch, {
189
+ token,
190
+ selfUserId: getSlackSelfUserId(),
191
+ allowlist: readSlackAllowlist(sc["channelIds"]),
192
+ log: (message) => log.info(`[heartbeat:${job["name"]}] ${message}`),
193
+ // Yield to anything a person is waiting on. Re-read per item because the
194
+ // previous answer may have taken minutes.
195
+ yieldNow: () => {
196
+ if (getState('default') !== 'IDLE')
197
+ return 'yielded';
198
+ if (isAgentBusy(HEARTBEAT_SCOPE))
199
+ return 'yielded';
200
+ if (messageQueue.length > 0)
201
+ return 'yielded';
202
+ if (hasPendingWorkerReplays(HEARTBEAT_SCOPE))
203
+ return 'yielded';
204
+ return null;
205
+ },
206
+ answer: async (hit) => {
207
+ const prompt = buildMentionWatchPrompt(job, watch, hit);
208
+ // Anchored BEFORE the turn runs. The agent is told not to post, and
209
+ // `/api/channel/send` is a tool it can reach anyway; if it does, that
210
+ // send is recorded as a delivery claim. Reading the anchor first is
211
+ // what lets the send below tell "the user already has these words"
212
+ // from "someone said this here an hour ago".
213
+ const anchor = nextDeliverySeq();
214
+ const collected = await orchestrateAndCollectData(prompt, {
215
+ origin: 'heartbeat', requestId: crypto.randomUUID(),
216
+ scope: HEARTBEAT_SCOPE, chatSessionId: 'default',
217
+ });
218
+ const text = applyOutputPolicy(String(collected.text), { scope: 'heartbeat', channel: 'slack' }).text;
219
+ const quietConfig = loadPolicyHooksConfig()?.flags?.heartbeatQuietOk;
220
+ const extraQuietMarkers = quietConfig?.enabled ? (quietConfig.markers || []) : [];
221
+ if (!text.trim() || isHeartbeatQuietOutput(text, extraQuietMarkers))
222
+ return null;
223
+ answerAnchors.set(hit.channelId + '/' + hit.ts, anchor);
224
+ return text;
225
+ },
226
+ send: async (hit, text) => {
227
+ const key = hit.channelId + '/' + hit.ts;
228
+ const anchor = answerAnchors.get(key);
229
+ answerAnchors.delete(key);
230
+ const target = slackThreadTarget(hit);
231
+ // The agent was told the server posts, and it can still call
232
+ // `/api/channel/send` itself. When it did, these exact words are
233
+ // already in that thread and posting them again is the duplicate the
234
+ // user reported. Treated as DELIVERED, because it is: the answer is on
235
+ // screen, so the receipt should be written and the message not asked
236
+ // about again.
237
+ //
238
+ // `wasSelfDelivered` fails open on every uncertain case, so a claim
239
+ // that does not match still results in a post. A duplicate is
240
+ // annoying; a swallowed answer is the user losing what they waited for.
241
+ if (anchor !== undefined && wasSelfDelivered({ target, text, since: anchor })) {
242
+ log.info(`[heartbeat:${job["name"]}] already delivered by the agent, not posting again`);
243
+ return true;
244
+ }
245
+ // Answer IN THE THREAD that carried the mention. `threadTs` is the
246
+ // parent when the message was already a reply, so this never starts a
247
+ // second thread off a reply.
248
+ const sent = await sendChannelOutput({
249
+ channel: 'slack', type: 'text', text, target,
250
+ allowActiveFallback: false,
251
+ // Deliberately NOT `fromAgentSurface`: a heartbeat is not an agent
252
+ // surface, and recording a delivery claim here would let this
253
+ // background post suppress the turn's real answer.
254
+ });
255
+ if (!sent.ok)
256
+ log.error(`[heartbeat:${job["name"]}] slack send failed: ${sent.error}`);
257
+ return sent.ok;
258
+ },
259
+ });
260
+ const stopped = outcome.stoppedBecause ? ' (stopped: ' + outcome.stoppedBecause + ')' : '';
261
+ log.info(`[heartbeat:${job["name"]}] mention watch: ${outcome.answered} answered, ${outcome.quiet} quiet, ${outcome.failed} failed${stopped}`);
262
+ return true;
263
+ }
264
+ /** Where the answer goes: the thread that carried the mention.
265
+ *
266
+ * Built from the hit rather than from the job destination, because a
267
+ * mention-watch answer belongs beside the question. The job destination still
268
+ * gates whether the job may run (a malformed one refuses), it just does not
269
+ * choose the thread. */
270
+ function slackThreadTarget(hit) {
271
+ const base = targetFromChatId('slack', hit.channelId);
272
+ return { ...base, threadId: hit.threadTs };
273
+ }
274
+ /** The per-message prompt.
275
+ *
276
+ * The job's own prompt carries the PERSPECTIVE — whose stance to answer with,
277
+ * which notes or wiki paths to ground it in. That stays operator-owned and
278
+ * out of code: hard-coding one person's opinions here would make the feature
279
+ * unusable for anyone else, and the stance is exactly the part that changes.
280
+ * Code supplies only the message that needs answering. */
281
+ function buildMentionWatchPrompt(job, watch, hit) {
282
+ const author = hit.authorId ? `<@${hit.authorId}>` : 'unknown';
283
+ return [
284
+ `[heartbeat:${job["name"]}] Slack mention watch`,
285
+ '',
286
+ `<@${watch.userId}> was mentioned in a message you are asked to answer on their behalf.`,
287
+ `channel: ${hit.channelId}`,
288
+ `thread: ${hit.threadTs}`,
289
+ `author: ${author}`,
290
+ '',
291
+ '--- Message ---',
292
+ hit.text,
293
+ '--- End Message ---',
294
+ '',
295
+ // The server posts the reply. An agent that also posts would double it,
296
+ // and its own send would not be covered by the per-message receipt.
297
+ 'Reply with the ANSWER TEXT ONLY. Do not call any Slack send API yourself —',
298
+ 'the server posts your reply into that thread. Answer [SILENT] if no reply is warranted.',
299
+ '',
300
+ job["prompt"] || '',
301
+ ].join('\n');
302
+ }
161
303
  export async function runHeartbeatJob(job) {
162
304
  const runner = job["runner"] || 'main';
163
305
  if (runner === 'main' && getState('default') !== 'IDLE') {
@@ -181,6 +323,19 @@ export async function runHeartbeatJob(job) {
181
323
  }
182
324
  heartbeatBusy = true;
183
325
  try {
326
+ // A mention watch replaces the prompt path entirely: its prompt describes
327
+ // how to answer a message that has not been found yet, so running it bare
328
+ // would answer nothing and deliver that to the job's destination. Inside
329
+ // the try so the finally still clears `heartbeatBusy` and drains.
330
+ const watch = job["mentionWatch"];
331
+ if (watch != null) {
332
+ if (!isHeartbeatMentionWatch(watch)) {
333
+ log.error(`[heartbeat:${job["name"]}] invalid mention watch — not run`);
334
+ return;
335
+ }
336
+ await runMentionWatchJob(job, watch);
337
+ return;
338
+ }
184
339
  const schedule = normalizeHeartbeatSchedule(job["schedule"]);
185
340
  const timeZone = getHeartbeatScheduleTimeZone(schedule);
186
341
  const now = formatHeartbeatNow(schedule);
@@ -1 +1 @@
1
- {"version":3,"file":"heartbeat.js","sourceRoot":"","sources":["../../../src/memory/heartbeat.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"heartbeat.js","sourceRoot":"","sources":["../../../src/memory/heartbeat.ts"],"names":[],"mappings":"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"}
@@ -58,7 +58,22 @@ function slackHasSendTarget() {
58
58
  }
59
59
  if (ids.length)
60
60
  return true;
61
- return Boolean(lastSlack?.targetId);
61
+ // An EMPTY allowlist is "every conversation", not "no destination". That is
62
+ // the shipped default, and `validateTarget` implements it literally: with no
63
+ // ids configured it admits every Slack target it is handed. Requiring a
64
+ // last-active slot on top of that made health disagree with the send path it
65
+ // reports on — a fresh install reported `missing_channel_id` while every
66
+ // send would in fact have been permitted, so `jaw slack setup` and
67
+ // `jaw doctor` called the state "all conversations allowed" while health
68
+ // called it broken (#476).
69
+ //
70
+ // doctor stopped degrading on this in #406 and `slackChannelScope()` names
71
+ // it `all_conversations`; this is health catching up to that reading.
72
+ //
73
+ // The malformed branch above still fails closed, and it must stay above this
74
+ // line: that sentinel is an unmatchable id, so it denies every channel
75
+ // target instead of widening to all of them.
76
+ return true;
62
77
  }
63
78
  export function getTransportCapability(channel) {
64
79
  const activeInbound = isMessagingTransportRunning(channel);
@@ -1 +1 @@
1
- {"version":3,"file":"channel-health.js","sourceRoot":"","sources":["../../../src/messaging/channel-health.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"channel-health.js","sourceRoot":"","sources":["../../../src/messaging/channel-health.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,mBAAmB,CAAC;AAC7C,OAAO,EAAE,yBAAyB,EAAE,kBAAkB,EAAE,iBAAiB,EAAE,MAAM,oBAAoB,CAAC;AACtG,OAAO,EACH,cAAc,EACd,mBAAmB,EACnB,6BAA6B,EAC7B,2BAA2B,GAC9B,MAAM,cAAc,CAAC;AACtB,OAAO,EAAE,iBAAiB,EAAuB,MAAM,sBAAsB,CAAC;AAC9E,OAAO,EAAE,eAAe,EAAiC,MAAM,cAAc,CAAC;AAC9E,OAAO,EAAE,mBAAmB,EAAyB,MAAM,0BAA0B,CAAC;AACtF,OAAO,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAC;AAClD,OAAO,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AAqC5C,SAAS,qBAAqB;IAC1B,MAAM,EAAE,GAAG,QAAQ,CAAC,UAAU,CAAC,CAAC;IAChC,IAAI,EAAE,EAAE,cAAc,EAAE,MAAM;QAAE,OAAO,IAAI,CAAC;IAC5C,MAAM,SAAS,GAAG,QAAQ,CAAC,WAAW,CAAwC,CAAC;IAC/E,MAAM,IAAI,GAAG,SAAS,EAAE,CAAC,YAAY,CAAwC,CAAC;IAC9E,MAAM,YAAY,GAAG,IAAI,EAAE,CAAC,UAAU,CAAsC,CAAC;IAC7E,OAAO,OAAO,CAAC,YAAY,EAAE,QAAQ,CAAC,CAAC;AAC3C,CAAC;AAED,SAAS,oBAAoB;IACzB,MAAM,EAAE,GAAG,QAAQ,CAAC,SAAS,CAAC,CAAC;IAC/B,IAAI,EAAE,EAAE,UAAU,EAAE,MAAM;QAAE,OAAO,IAAI,CAAC;IACxC,MAAM,SAAS,GAAG,QAAQ,CAAC,WAAW,CAAwC,CAAC;IAC/E,MAAM,IAAI,GAAG,SAAS,EAAE,CAAC,YAAY,CAAwC,CAAC;IAC9E,MAAM,WAAW,GAAG,IAAI,EAAE,CAAC,SAAS,CAAsC,CAAC;IAC3E,OAAO,OAAO,CAAC,WAAW,EAAE,QAAQ,CAAC,CAAC;AAC1C,CAAC;AAED,SAAS,kBAAkB;IACvB,MAAM,EAAE,GAAG,QAAQ,CAAC,OAAO,CAAC,CAAC;IAC7B,6EAA6E;IAC7E,6EAA6E;IAC7E,EAAE;IACF,uEAAuE;IACvE,MAAM,GAAG,GAAG,kBAAkB,CAAC,EAAE,EAAE,UAAU,CAAC,CAAC;IAC/C,gEAAgE;IAChE,yEAAyE;IACzE,0EAA0E;IAC1E,qEAAqE;IACrE,yDAAyD;IACzD,MAAM,cAAc,GAAG,QAAQ,CAAC,WAAW,CAAwC,CAAC;IACpF,MAAM,UAAU,GAAG,cAAc,EAAE,CAAC,YAAY,CAAwC,CAAC;IACzF,MAAM,SAAS,GAAG,mBAAmB,CAAC,OAAO,CAAC;WACtC,UAAU,EAAE,CAAC,OAAO,CAAuC,CAAC;IACpE,IAAI,GAAG,CAAC,MAAM,KAAK,CAAC,IAAI,GAAG,CAAC,CAAC,CAAC,KAAK,yBAAyB,EAAE,CAAC;QAC3D,0EAA0E;QAC1E,wEAAwE;QACxE,yEAAyE;QACzE,uCAAuC;QACvC,EAAE;QACF,wEAAwE;QACxE,wEAAwE;QACxE,kDAAkD;QAClD,EAAE;QACF,0EAA0E;QAC1E,uEAAuE;QACvE,mCAAmC;QACnC,OAAO,cAAc,CAAC,SAAS,CAAC,IAAI,SAAS,CAAC,OAAO,KAAK,OAAO;eAC1D,aAAa,CAAC,SAAS,CAAC,QAAQ,CAAC,KAAK,QAAQ,CAAC;IAC1D,CAAC;IACD,IAAI,GAAG,CAAC,MAAM;QAAE,OAAO,IAAI,CAAC;IAC5B,4EAA4E;IAC5E,6EAA6E;IAC7E,wEAAwE;IACxE,6EAA6E;IAC7E,yEAAyE;IACzE,mEAAmE;IACnE,yEAAyE;IACzE,2BAA2B;IAC3B,EAAE;IACF,2EAA2E;IAC3E,sEAAsE;IACtE,EAAE;IACF,6EAA6E;IAC7E,uEAAuE;IACvE,6CAA6C;IAC7C,OAAO,IAAI,CAAC;AAChB,CAAC;AAED,MAAM,UAAU,sBAAsB,CAAC,OAAyB;IAC5D,MAAM,aAAa,GAAG,2BAA2B,CAAC,OAAO,CAAC,CAAC;IAC3D,IAAI,OAAO,KAAK,UAAU,EAAE,CAAC;QACzB,MAAM,EAAE,GAAG,QAAQ,CAAC,UAAU,CAAC,CAAC;QAChC,MAAM,KAAK,GAAG,OAAO,EAAE,EAAE,KAAK,KAAK,QAAQ,CAAC,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QACnE,MAAM,UAAU,GAAG,OAAO,CAAC,EAAE,EAAE,OAAO,IAAI,KAAK,CAAC,CAAC;QACjD,IAAI,CAAC,UAAU,EAAE,CAAC;YACd,OAAO,EAAE,UAAU,EAAE,KAAK,EAAE,aAAa,EAAE,WAAW,EAAE,KAAK,EAAE,MAAM,EAAE,UAAU,EAAE,CAAC;QACxF,CAAC;QACD,IAAI,CAAC,qBAAqB,EAAE,EAAE,CAAC;YAC3B,OAAO,EAAE,UAAU,EAAE,IAAI,EAAE,aAAa,EAAE,WAAW,EAAE,KAAK,EAAE,MAAM,EAAE,iBAAiB,EAAE,CAAC;QAC9F,CAAC;QACD,OAAO,EAAE,UAAU,EAAE,IAAI,EAAE,aAAa,EAAE,WAAW,EAAE,IAAI,EAAE,CAAC;IAClE,CAAC;IAED,IAAI,OAAO,KAAK,OAAO,EAAE,CAAC;QACtB,MAAM,EAAE,GAAG,QAAQ,CAAC,OAAO,CAAC,CAAC;QAC7B,MAAM,QAAQ,GAAG,OAAO,EAAE,EAAE,QAAQ,KAAK,QAAQ,CAAC,CAAC,CAAC,EAAE,CAAC,QAAQ,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QAC5E,MAAM,QAAQ,GAAG,OAAO,EAAE,EAAE,QAAQ,KAAK,QAAQ,CAAC,CAAC,CAAC,EAAE,CAAC,QAAQ,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QAC5E,IAAI,CAAC,EAAE,EAAE,OAAO,IAAI,CAAC,QAAQ,EAAE,CAAC;YAC5B,OAAO,EAAE,UAAU,EAAE,KAAK,EAAE,aAAa,EAAE,WAAW,EAAE,KAAK,EAAE,MAAM,EAAE,UAAU,EAAE,CAAC;QACxF,CAAC;QACD,IAAI,CAAC,iBAAiB,CAAC,EAAE,CAAC,UAAU,EAAE,QAAQ,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC;YACtD,kEAAkE;YAClE,yCAAyC;YACzC,OAAO,EAAE,UAAU,EAAE,IAAI,EAAE,aAAa,EAAE,KAAK,EAAE,WAAW,EAAE,KAAK,EAAE,MAAM,EAAE,qBAAqB,EAAE,CAAC;QACzG,CAAC;QACD,IAAI,CAAC,QAAQ,EAAE,CAAC;YACZ,mEAAmE;YACnE,gEAAgE;YAChE,OAAO;gBACH,UAAU,EAAE,IAAI;gBAChB,aAAa;gBACb,WAAW,EAAE,kBAAkB,EAAE;gBACjC,MAAM,EAAE,mBAAmB;aAC9B,CAAC;QACN,CAAC;QACD,IAAI,CAAC,kBAAkB,EAAE,EAAE,CAAC;YACxB,OAAO,EAAE,UAAU,EAAE,IAAI,EAAE,aAAa,EAAE,WAAW,EAAE,KAAK,EAAE,MAAM,EAAE,oBAAoB,EAAE,CAAC;QACjG,CAAC;QACD,OAAO,EAAE,UAAU,EAAE,IAAI,EAAE,aAAa,EAAE,WAAW,EAAE,IAAI,EAAE,CAAC;IAClE,CAAC;IAED,MAAM,EAAE,GAAG,QAAQ,CAAC,SAAS,CAAC,CAAC;IAC/B,MAAM,KAAK,GAAG,OAAO,EAAE,EAAE,KAAK,KAAK,QAAQ,CAAC,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;IACnE,MAAM,OAAO,GAAG,OAAO,EAAE,EAAE,OAAO,KAAK,QAAQ,CAAC,CAAC,CAAC,EAAE,CAAC,OAAO,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;IACzE,MAAM,UAAU,GAAG,OAAO,CAAC,EAAE,EAAE,OAAO,IAAI,KAAK,IAAI,OAAO,CAAC,CAAC;IAC5D,IAAI,CAAC,UAAU,EAAE,CAAC;QACd,OAAO,EAAE,UAAU,EAAE,KAAK,EAAE,aAAa,EAAE,WAAW,EAAE,KAAK,EAAE,MAAM,EAAE,UAAU,EAAE,CAAC;IACxF,CAAC;IACD,IAAI,CAAC,oBAAoB,EAAE,EAAE,CAAC;QAC1B,OAAO,EAAE,UAAU,EAAE,IAAI,EAAE,aAAa,EAAE,WAAW,EAAE,KAAK,EAAE,MAAM,EAAE,oBAAoB,EAAE,CAAC;IACjG,CAAC;IACD,OAAO,EAAE,UAAU,EAAE,IAAI,EAAE,aAAa,EAAE,WAAW,EAAE,IAAI,EAAE,CAAC;AAClE,CAAC;AAED,MAAM,aAAa,GAA0B;IACzC,QAAQ,EAAE,CAAC,EAAE,UAAU,EAAE,CAAC,EAAE,SAAS,EAAE,CAAC,EAAE,WAAW,EAAE,CAAC,EAAE,oBAAoB,EAAE,IAAI;CACvF,CAAC;AAEF,MAAM,UAAU,0BAA0B,CAAC,UAAiC,iBAAiB,EAAE;IAC3F,IAAI,CAAC,OAAO;QAAE,OAAO,EAAE,GAAG,aAAa,EAAE,CAAC;IAC1C,MAAM,MAAM,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC;IAChC,OAAO;QACH,QAAQ,EAAE,MAAM,CAAC,QAAQ;QACzB,UAAU,EAAE,MAAM,CAAC,UAAU;QAC7B,SAAS,EAAE,MAAM,CAAC,SAAS;QAC3B,WAAW,EAAE,MAAM,CAAC,WAAW;QAC/B,oBAAoB,EAAE,OAAO,CAAC,oBAAoB,EAAE;KACvD,CAAC;AACN,CAAC;AAED,MAAM,UAAU,0BAA0B;IACtC,OAAO;QACH,aAAa,EAAE,cAAc,EAAE;QAC/B,qBAAqB,EAAE,6BAA6B,EAAE;QACtD,QAAQ,EAAE,sBAAsB,CAAC,UAAU,CAAC;QAC5C,OAAO,EAAE,sBAAsB,CAAC,SAAS,CAAC;QAC1C,KAAK,EAAE,sBAAsB,CAAC,OAAO,CAAC;QACtC,WAAW,EAAE,mBAAmB,EAAE;QAClC,OAAO,EAAE,0BAA0B,EAAE;QACrC,OAAO,EAAE,eAAe,EAAE;KAC7B,CAAC;AACN,CAAC"}
@@ -0,0 +1,36 @@
1
+ // ─── Forwarder origin policy ─────────────────────────
2
+ // The per-channel `agent_done` forwarders exist for one job: a turn that began
3
+ // somewhere OTHER than this chat channel (the web UI, the CLI, an API caller)
4
+ // still deserves to have its answer land in the conversation the user is
5
+ // watching. The channel's own dispatch path handles its own turns, so each
6
+ // forwarder skips its own origin.
7
+ //
8
+ // Background producers are a third case that was never separated out, and it
9
+ // showed. A heartbeat job already owns a destination — an operator picked the
10
+ // channel and thread the report belongs in — and it delivers there itself. The
11
+ // forwarder then saw the same turn's `agent_done` and posted the text AGAIN,
12
+ // to whichever conversation happened to be last-active, which is not where the
13
+ // operator pointed the job. Two copies, one of them in the wrong room.
14
+ //
15
+ // Worse, the forwarder sees that text EARLIER than the heartbeat does.
16
+ // `agent_done` is broadcast when the agent exits; the heartbeat's own
17
+ // `[SILENT]` check, report parsing and policy filter all run after
18
+ // `orchestrate_done`. So a job that decided it had nothing to say, or whose
19
+ // output was meant to be suppressed by `reportPolicy`, had already leaked.
20
+ /** Origins whose output is delivered by their own producer, not by a channel
21
+ * forwarder. Keep this list small and specific: the forwarder failing open is
22
+ * what makes web/CLI turns visible at all. */
23
+ const PRODUCER_OWNED_ORIGINS = new Set(['heartbeat']);
24
+ /**
25
+ * True when a channel forwarder must NOT post this `agent_done`.
26
+ *
27
+ * `ownChannel` is the transport asking — it skips its own turns because its
28
+ * dispatch path is already standing there with the answer.
29
+ */
30
+ export function shouldSkipForwarding(data, ownChannel) {
31
+ const origin = typeof data['origin'] === 'string' ? data['origin'] : '';
32
+ if (origin === ownChannel)
33
+ return true;
34
+ return PRODUCER_OWNED_ORIGINS.has(origin);
35
+ }
36
+ //# sourceMappingURL=forwarder-origin.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"forwarder-origin.js","sourceRoot":"","sources":["../../../src/messaging/forwarder-origin.ts"],"names":[],"mappings":"AAAA,wDAAwD;AACxD,+EAA+E;AAC/E,8EAA8E;AAC9E,yEAAyE;AACzE,2EAA2E;AAC3E,kCAAkC;AAClC,EAAE;AACF,6EAA6E;AAC7E,8EAA8E;AAC9E,+EAA+E;AAC/E,6EAA6E;AAC7E,+EAA+E;AAC/E,uEAAuE;AACvE,EAAE;AACF,uEAAuE;AACvE,sEAAsE;AACtE,mEAAmE;AACnE,4EAA4E;AAC5E,2EAA2E;AAE3E;;+CAE+C;AAC/C,MAAM,sBAAsB,GAAG,IAAI,GAAG,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC;AAEtD;;;;;GAKG;AACH,MAAM,UAAU,oBAAoB,CAChC,IAA6B,EAC7B,UAAkB;IAElB,MAAM,MAAM,GAAG,OAAO,IAAI,CAAC,QAAQ,CAAC,KAAK,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;IACxE,IAAI,MAAM,KAAK,UAAU;QAAE,OAAO,IAAI,CAAC;IACvC,OAAO,sBAAsB,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;AAC9C,CAAC"}
@@ -1,4 +1,4 @@
1
- import { loadHeartbeatFile, saveHeartbeatFile, isHeartbeatDestination } from '../core/config.js';
1
+ import { loadHeartbeatFile, saveHeartbeatFile, isHeartbeatDestination, isHeartbeatMentionWatch } from '../core/config.js';
2
2
  import { startHeartbeat } from '../memory/heartbeat.js';
3
3
  import { validateHeartbeatScheduleInput } from '../memory/heartbeat-schedule.js';
4
4
  import { getEmployees } from '../core/db.js';
@@ -24,6 +24,27 @@ export function resolveHeartbeatDestination(job, existing) {
24
24
  return { ok: false, error: 'invalid heartbeat destination' };
25
25
  return { ok: true, destination: raw };
26
26
  }
27
+ /** Resolve the mention-watch a PUT should persist.
28
+ *
29
+ * Same inheritance rule as `destination`, for the same reason: every shipped UI
30
+ * rebuilds a job from a fixed field set, so a field it does not know about
31
+ * arrives absent rather than cleared. An explicit `null` is the deliberate
32
+ * unset.
33
+ *
34
+ * A malformed value is a 400 rather than a silent drop. The prompt on such a job
35
+ * is written to answer a mention that was handed to it; running it as an
36
+ * ordinary heartbeat would post an answer to nothing. */
37
+ export function resolveHeartbeatMentionWatch(job, existing) {
38
+ if (!Object.prototype.hasOwnProperty.call(job, 'mentionWatch')) {
39
+ return { ok: true, mentionWatch: existing ?? undefined };
40
+ }
41
+ const raw = job['mentionWatch'];
42
+ if (raw === null)
43
+ return { ok: true, mentionWatch: undefined };
44
+ if (!isHeartbeatMentionWatch(raw))
45
+ return { ok: false, error: 'invalid heartbeat mention watch' };
46
+ return { ok: true, mentionWatch: raw };
47
+ }
27
48
  export function normalizeHeartbeatPutRunnerFields(job, existing, employeeNames) {
28
49
  const inherited = (key) => Object.prototype.hasOwnProperty.call(job, key) ? job[key] : existing?.[key];
29
50
  const runnerValue = inherited('runner');
@@ -87,6 +108,11 @@ export function registerHeartbeatRoutes(app, requireAuth) {
87
108
  res.status(400).json({ error: destResult.error, index, jobId });
88
109
  return;
89
110
  }
111
+ const watchResult = resolveHeartbeatMentionWatch(job, existing?.mentionWatch);
112
+ if (!watchResult.ok) {
113
+ res.status(400).json({ error: watchResult.error, index, jobId });
114
+ return;
115
+ }
90
116
  normalizedJobs.push(stripUndefined({
91
117
  id: jobId,
92
118
  name: typeof job["name"] === 'string' ? job["name"] : '',
@@ -95,6 +121,7 @@ export function registerHeartbeatRoutes(app, requireAuth) {
95
121
  prompt: typeof job["prompt"] === 'string' ? job["prompt"] : '',
96
122
  ...runnerResult.fields,
97
123
  destination: destResult.destination,
124
+ mentionWatch: watchResult.mentionWatch,
98
125
  }));
99
126
  }
100
127
  const payload = { jobs: normalizedJobs };