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.
- package/README.md +2 -0
- package/dist/bin/commands/doctor.js +21 -0
- package/dist/bin/commands/doctor.js.map +1 -1
- package/dist/bin/commands/slack.js +36 -4
- package/dist/bin/commands/slack.js.map +1 -1
- package/dist/src/agent/spawn.js +9 -2
- package/dist/src/agent/spawn.js.map +1 -1
- package/dist/src/core/agent-readiness.js +137 -0
- package/dist/src/core/agent-readiness.js.map +1 -0
- package/dist/src/core/cli-detect.js +51 -8
- package/dist/src/core/cli-detect.js.map +1 -1
- package/dist/src/core/config.js +42 -0
- package/dist/src/core/config.js.map +1 -1
- package/dist/src/core/db.js +97 -0
- package/dist/src/core/db.js.map +1 -1
- package/dist/src/core/rate-limit.js +4 -0
- package/dist/src/core/rate-limit.js.map +1 -1
- package/dist/src/core/runtime-path.js +49 -1
- package/dist/src/core/runtime-path.js.map +1 -1
- package/dist/src/discord/bot.js +2 -1
- package/dist/src/discord/bot.js.map +1 -1
- package/dist/src/memory/heartbeat-mention-watch.js +193 -0
- package/dist/src/memory/heartbeat-mention-watch.js.map +1 -0
- package/dist/src/memory/heartbeat.js +156 -1
- package/dist/src/memory/heartbeat.js.map +1 -1
- package/dist/src/messaging/channel-health.js +16 -1
- package/dist/src/messaging/channel-health.js.map +1 -1
- package/dist/src/messaging/forwarder-origin.js +36 -0
- package/dist/src/messaging/forwarder-origin.js.map +1 -0
- package/dist/src/routes/heartbeat.js +28 -1
- package/dist/src/routes/heartbeat.js.map +1 -1
- package/dist/src/routes/system.js +26 -0
- package/dist/src/routes/system.js.map +1 -1
- package/dist/src/slack/bot.js +2 -1
- package/dist/src/slack/bot.js.map +1 -1
- package/dist/src/slack/history.js +5 -1
- package/dist/src/slack/history.js.map +1 -1
- package/dist/src/slack/hot-notify.js +7 -2
- package/dist/src/slack/hot-notify.js.map +1 -1
- package/dist/src/slack/mention-watch.js +259 -0
- package/dist/src/slack/mention-watch.js.map +1 -0
- package/dist/src/telegram/bot.js +4 -1
- package/dist/src/telegram/bot.js.map +1 -1
- 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 {
|
|
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":"AAAA,wDAAwD;AAExD,OAAO,EAAE,MAAM,IAAI,CAAC;AACpB,OAAO,EAAE,QAAQ,EAAE,OAAO,EAAE,MAAM,MAAM,CAAC;AACzC,OAAO,MAAM,MAAM,QAAQ,CAAC;AAC5B,OAAO,EAAE,QAAQ,EAAE,MAAM,oBAAoB,CAAC;AAC9C,OAAO,EAAE,QAAQ,EAAE,mBAAmB,EAAE,iBAAiB,EAAE,iBAAiB,EAAE,MAAM,mBAAmB,CAAC;AACxG,OAAO,EAAE,cAAc,EAAE,MAAM,4BAA4B,CAAC;AAC5D,OAAO,EAAE,WAAW,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AAC9D,OAAO,EAAE,yBAAyB,EAAE,MAAM,4BAA4B,CAAC;AACvE,OAAO,EAAE,WAAW,EAAE,UAAU,EAAE,YAAY,EAAE,kBAAkB,EAAE,eAAe,EAAE,MAAM,oCAAoC,CAAC;AAChI,OAAO,EAAE,uBAAuB,EAAE,MAAM,oCAAoC,CAAC;AAC7E,OAAO,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAC3C,OAAO,EAAE,iBAAiB,EAAE,gBAAgB,EAAE,MAAM,sBAAsB,CAAC;AAC3E,OAAO,EAAE,sBAAsB,EAAE,MAAM,mBAAmB,CAAC;AAG3D,OAAO,EAAE,YAAY,EAAE,qBAAqB,EAAE,MAAM,eAAe,CAAC;AAEpE,OAAO,EAAE,cAAc,EAAE,MAAM,+BAA+B,CAAC;AAC/D,OAAO,EAAE,QAAQ,EAAE,MAAM,kCAAkC,CAAC;AAC5D,OAAO,EAAE,yBAAyB,EAAE,MAAM,sBAAsB,CAAC;AACjE,OAAO,EAAE,GAAG,EAAE,MAAM,mBAAmB,CAAC;AAExC,MAAM,eAAe,GAAG,SAAS,CAAC;AAClC,OAAO,EAAE,iBAAiB,EAAE,qBAAqB,EAAE,MAAM,yBAAyB,CAAC;AACnF,OAAO,EAAE,gBAAgB,EAAE,MAAM,yBAAyB,CAAC;AAC3D,OAAO,EAAE,oBAAoB,EAAwB,MAAM,uBAAuB,CAAC;AACnF,OAAO,EACH,yBAAyB,EACzB,kBAAkB,EAClB,yBAAyB,EACzB,4BAA4B,EAC5B,oBAAoB,EACpB,0BAA0B,EAC1B,sBAAsB,EACtB,qBAAqB,GACxB,MAAM,yBAAyB,CAAC;AAEjC,MAAM,eAAe,GAAG,IAAI,GAAG,EAAyC,CAAC;AACzE,MAAM,kBAAkB,GAAG,IAAI,GAAG,EAAkB,CAAC;AACrD,IAAI,gBAAgB,GAAwB,IAAI,CAAC;AACjD,IAAI,aAAa,GAAG,KAAK,CAAC;AAQ1B,MAAM,WAAW,GAA0B,EAAE,CAAC;AAE9C,MAAM,UAAU,sBAAsB,CAAC,MAAc,EAAE,eAAyB,EAAE;IAC9E,OAAO,CAAC,UAAU,EAAE,GAAG,YAAY,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,MAAM,CAAC,MAAM,GAAG,CAAC,IAAI,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC;AACtG,CAAC;AAED;;;;;;;;;;;;+CAY+C;AAC/C,MAAM,UAAU,eAAe,CAAC,WAAoB;IAChD,IAAI,WAAW,KAAK,SAAS,IAAI,WAAW,KAAK,IAAI;QAAE,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC;IAC9F,IAAI,CAAC,sBAAsB,CAAC,WAAW,CAAC;QAAE,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC;IAChF,MAAM,IAAI,GAAG,WAAmC,CAAC;IACjD,MAAM,MAAM,GAAG,gBAAgB,CAAC,IAAI,CAAC,OAAO,EAAE,IAAI,CAAC,QAAQ,CAAC,CAAC;IAC7D,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,EAAE,GAAG,MAAM,EAAE,QAAQ,EAAE,IAAI,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC;AACrG,CAAC;AAED,SAAS,eAAe,CAAC,MAA+B,EAAE,MAA+B;IACrF,MAAM,eAAe,GAAG,WAAW,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC,MAAM,KAAK,OAAO,CAAC,CAAC,MAAM,CAAC;IACnF,MAAM,gBAAgB,GAAG,WAAW,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC,MAAM,KAAK,YAAY,CAAC,CAAC,MAAM,CAAC;IACzF,OAAO;QACH,OAAO,EAAE,WAAW,CAAC,MAAM;QAC3B,eAAe;QACf,gBAAgB;QAChB,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QAC7B,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;KAChC,CAAC;AACN,CAAC;AAED,SAAS,iBAAiB,CACtB,GAAwB,EACxB,MAA8B,EAC9B,MAA+B;IAE/B,IAAI,WAAW,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,KAAK,GAAG,CAAC,IAAI,CAAC,CAAC;QAAE,OAAO,KAAK,CAAC;IACzE,WAAW,CAAC,IAAI,CAAC,cAAc,CAAC,EAAE,GAAG,EAAE,MAAM,EAAE,MAAM,EAAE,CAAC,CAAC,CAAC;IAC1D,SAAS,CAAC,mBAAmB,EAAE;QAC3B,GAAG,eAAe,CAAC,MAAM,EAAE,MAAM,CAAC;QAClC,KAAK,EAAE,GAAG,CAAC,IAAI,CAAC;QAChB,OAAO,EAAE,GAAG,CAAC,MAAM,CAAC;KACvB,CAAC,CAAC;IACH,OAAO,IAAI,CAAC;AAChB,CAAC;AAED,MAAM,UAAU,wBAAwB;IACpC,OAAO,eAAe,EAAE,CAAC;AAC7B,CAAC;AAED,MAAM,UAAU,cAAc;IAC1B,aAAa,EAAE,CAAC;IAChB,MAAM,EAAE,IAAI,EAAE,GAAG,iBAAiB,EAAE,CAAC;IACrC,KAAK,MAAM,GAAG,IAAI,IAAI,EAAE,CAAC;QACrB,IAAI,CAAC,GAAG,EAAE,OAAO,IAAI,CAAC,GAAG,CAAC,EAAE;YAAE,SAAS;QACvC,MAAM,QAAQ,GAAG,0BAA0B,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;QAC1D,IAAI,QAAQ,CAAC,IAAI,KAAK,MAAM,EAAE,CAAC;YAC3B,MAAM,SAAS,GAAG,qBAAqB,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC;YACvD,IAAI,SAAS,EAAE,CAAC;gBACZ,GAAG,CAAC,IAAI,CAAC,cAAc,GAAG,CAAC,IAAI,mBAAmB,QAAQ,CAAC,IAAI,MAAM,SAAS,EAAE,CAAC,CAAC;gBAClF,SAAS;YACb,CAAC;YACD,eAAe,CAAC,GAAG,CAAC,CAAC;YACrB,SAAS;QACb,CAAC;QACD,MAAM,EAAE,GAAG,QAAQ,CAAC,OAAO,GAAG,MAAM,CAAC;QACrC,MAAM,KAAK,GAAG,WAAW,CAAC,GAAG,EAAE,CAAC,eAAe,CAAC,GAAG,CAAC,EAAE,EAAE,CAAC,CAAC;QAC1D,KAAK,CAAC,KAAK,EAAE,EAAE,CAAC;QAChB,eAAe,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,EAAE,KAAK,CAAC,CAAC;IACvC,CAAC;IACD,MAAM,CAAC,GAAG,eAAe,CAAC,IAAI,CAAC;IAC/B,GAAG,CAAC,IAAI,CAAC,eAAe,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,SAAS,CAAC,CAAC;AACjE,CAAC;AAED,MAAM,UAAU,aAAa;IACzB,KAAK,MAAM,KAAK,IAAI,eAAe,CAAC,MAAM,EAAE;QAAE,YAAY,CAAC,KAAK,CAAC,CAAC;IAClE,eAAe,CAAC,KAAK,EAAE,CAAC;IACxB,kBAAkB,CAAC,KAAK,EAAE,CAAC;AAC/B,CAAC;AAID,MAAM,UAAU,qBAAqB,CAAC,MAAuB,EAAE,MAAc;IACzE,IAAI,MAAM,KAAK,QAAQ;QAAE,OAAO,EAAE,IAAI,EAAE,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,SAAS,EAAE,KAAK,EAAE,CAAC;IAChF,IAAI,MAAM,KAAK,cAAc,EAAE,CAAC;QAC5B,MAAM,IAAI,GAAG,MAAM,CAAC,MAAM,KAAK,IAAI,IAAI,MAAM,CAAC,WAAW,CAAC;QAC1D,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC;IACnD,CAAC;IACD,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC;AACzD,CAAC;AAED,MAAM,UAAU,kBAAkB,CAAC,OAAiB;IAChD,OAAO,IAAI,OAAO,CAAC,OAAO,CAAC,EAAE;QACzB,MAAM,CAAC,IAAI,EAAE,GAAG,IAAI,CAAC,GAAG,OAAO,CAAC;QAChC,IAAI,CAAC,IAAI,EAAE,CAAC;YAAC,OAAO,CAAC,oBAAoB,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC;YAAC,OAAO;QAAC,CAAC;QAC5D,QAAQ,CAAC,IAAI,EAAE,IAAI,EAAE,EAAE,OAAO,EAAE,EAAE,GAAG,MAAM,EAAE,SAAS,EAAE,EAAE,GAAG,IAAI,EAAE,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,EAAE;YAC3F,MAAM,IAAI,GAAG,KAAK,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,MAAM,IAAI,KAAK,IAAI,OAAO,KAAK,CAAC,IAAI,KAAK,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;YAClI,OAAO,CAAC,oBAAoB,CAAC,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,IAAI,CAAC,CAAC,CAAC;QACrF,CAAC,CAAC,CAAC;IACP,CAAC,CAAC,CAAC;AACP,CAAC;AAED,KAAK,UAAU,WAAW,CAAC,GAAwB,EAAE,MAAc;IAC/D,MAAM,GAAG,GAAI,YAAY,CAAC,GAAG,EAAoB,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,IAAI,KAAK,GAAG,CAAC,UAAU,CAAC,CAAC,CAAC;IAC5F,IAAI,CAAC,GAAG;QAAE,OAAO,oBAAoB,CAAC,6CAA6C,CAAC,CAAC;IACrF,IAAI,CAAC;QACD,MAAM,IAAI,GAAG,WAAW,CAAC,GAAG,EAAE,MAAM,EAAE,EAAE,MAAM,EAAE,WAAW,EAAE,OAAO,EAAE,eAAe,EAAE,aAAa,EAAE,SAAS,EAAE,CAAC,CAAC;QACnH,IAAI,CAAC;YACD,MAAM,EAAE,GAAG,EAAE,KAAK,EAAE,GAAG,CAAC,IAAI,EAAE,IAAI,EAAE,GAAG,CAAC,IAAI,IAAI,mBAAmB,EAAE,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,KAAK,EAAE,YAAY,EAAE,CAAC,EAAE,eAAe,EAAE,CAAC,EAAE,YAAY,EAAE,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,IAAI,EAAE,SAAS,EAAE,CAAC,WAAW,CAAC,EAAE,CAAC;YACpN,MAAM,MAAM,GAAG,MAAM,cAAc,CAAC,EAAE,EAAE,GAAG,EAAE,EAAE,GAAG,EAAE,aAAa,GAAG,CAAC,IAAI,CAAC,IAAI,GAAG,CAAC,MAAM,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,EAAE,MAAM,EAAE,WAAW,EAAE,EAAE,EAAE,CAAC,CAAC;YAC/H,MAAM,IAAI,GAAG,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC,CAAC;YAC1C,YAAY,CAAC,IAAI,CAAC,OAAO,EAAE,IAAI,EAAE,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;YACxF,uEAAuE;YACvE,uEAAuE;YACvE,oEAAoE;YACpE,sEAAsE;YACtE,kBAAkB,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;YACjC,OAAO,oBAAoB,CAAC,IAAI,CAAC,CAAC;QACtC,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACb,UAAU,CAAC,IAAI,CAAC,OAAO,EAAE,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC;YACjF,MAAM,KAAK,CAAC;QAChB,CAAC;IACL,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACb,IAAI,KAAK,YAAY,eAAe;YAAE,OAAO,oBAAoB,CAAC,kDAAkD,CAAC,CAAC;QACtH,MAAM,KAAK,CAAC;IAChB,CAAC;AACL,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,eAAe,CAAC,GAAwB;IAC1D,MAAM,MAAM,GAAG,GAAG,CAAC,QAAQ,CAAC,IAAI,MAAM,CAAC;IACvC,IAAI,MAAM,KAAK,MAAM,IAAI,QAAQ,CAAC,SAAS,CAAC,KAAK,MAAM,EAAE,CAAC;QACtD,MAAM,MAAM,GAAG,iBAAiB,CAAC,GAAG,EAAE,cAAc,EAAE,OAAO,CAAC,CAAC;QAC/D,GAAG,CAAC,IAAI,CAAC,cAAc,GAAG,CAAC,MAAM,CAAC,KAAK,MAAM,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,kBAAkB,yBAAyB,WAAW,CAAC,MAAM,WAAW,CAAC,CAAC;QACvI,OAAO;IACX,CAAC;IACD,IAAI,aAAa,EAAE,CAAC;QAChB,IAAI,iBAAiB,CAAC,GAAG,EAAE,MAAM,CAAC,EAAE,CAAC;YACjC,GAAG,CAAC,IAAI,CAAC,cAAc,GAAG,CAAC,MAAM,CAAC,aAAa,WAAW,CAAC,MAAM,WAAW,CAAC,CAAC;QAClF,CAAC;aAAM,CAAC;YACJ,GAAG,CAAC,IAAI,CAAC,cAAc,GAAG,CAAC,MAAM,CAAC,wBAAwB,CAAC,CAAC;QAChE,CAAC;QACD,OAAO;IACX,CAAC;IACD,IAAI,MAAM,KAAK,MAAM,IAAI,WAAW,CAAC,eAAe,CAAC,EAAE,CAAC;QACpD,MAAM,MAAM,GAAG,iBAAiB,CAAC,GAAG,EAAE,YAAY,EAAE,OAAO,CAAC,CAAC;QAC7D,GAAG,CAAC,IAAI,CAAC,cAAc,GAAG,CAAC,MAAM,CAAC,KAAK,MAAM,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,kBAAkB,8BAA8B,WAAW,CAAC,MAAM,WAAW,CAAC,CAAC;QAC5I,OAAO;IACX,CAAC;IACD,aAAa,GAAG,IAAI,CAAC;IACrB,IAAI,CAAC;QACD,MAAM,QAAQ,GAAG,0BAA0B,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC,CAAC;QAC7D,MAAM,QAAQ,GAAG,4BAA4B,CAAC,QAAQ,CAAC,CAAC;QACxD,MAAM,GAAG,GAAG,kBAAkB,CAAC,QAAQ,CAAC,CAAC;QACzC,MAAM,UAAU,GAAG,yBAAyB,EAAE,CAAC;QAC/C,MAAM,WAAW,GAAG,UAAU,CAAC,CAAC,CAAC,4BAA4B,UAAU,sBAAsB,CAAC,CAAC,CAAC,EAAE,CAAC;QACnG,MAAM,MAAM,GAAG,cAAc,GAAG,CAAC,MAAM,CAAC,YAAY,GAAG,KAAK,QAAQ,yLAAyL,WAAW,OAAO,GAAG,CAAC,QAAQ,CAAC,IAAI,iCAAiC,EAAE,CAAC;QACpU,GAAG,CAAC,IAAI,CAAC,cAAc,GAAG,CAAC,MAAM,CAAC,WAAW,yBAAyB,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC;QACrF,IAAI,SAAiB,CAAC;QACtB,IAAI,MAAM,KAAK,UAAU,EAAE,CAAC;YACxB,SAAS,GAAG,CAAC,MAAM,WAAW,CAAC,GAAG,EAAE,MAAM,CAAC,CAAC,CAAC,GAAG,CAAC;QACrD,CAAC;aAAM,IAAI,MAAM,KAAK,QAAQ,EAAE,CAAC;YAC7B,MAAM,YAAY,GAAG,MAAM,kBAAkB,CAAC,GAAG,CAAC,SAAS,CAAC,IAAI,EAAE,CAAC,CAAC;YACpE,SAAS,GAAG,YAAY,CAAC,MAAM,KAAK,QAAQ,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC;gBAC/E,CAAC,CAAC,GAAG,YAAY,CAAC,GAAG,8BAA8B,YAAY,CAAC,OAAO,IAAI,eAAe,EAAE;gBAC5F,CAAC,CAAC,YAAY,CAAC,GAAG,CAAC;QAC3B,CAAC;aAAM,CAAC;YACJ,MAAM,KAAK,GAAG,MAAM,yBAAyB,CAAC,MAAM,EAAE,EAAE,MAAM,EAAE,WAAW,EAAE,SAAS,EAAE,MAAM,CAAC,UAAU,EAAE,EAAE,KAAK,EAAE,eAAe,EAAE,aAAa,EAAE,SAAS,EAAE,CAAC,CAAC;YACjK,MAAM,SAAS,GAAG,KAAK,CAAC,IAAI,CAAC,cAAc,KAAK,IAAI;gBAChD,CAAC,CAAC,MAAM,yBAAyB,CAAC,MAAM,EAAE,EAAE,MAAM,EAAE,WAAW,EAAE,SAAS,EAAE,MAAM,CAAC,UAAU,EAAE,EAAE,KAAK,EAAE,eAAe,EAAE,aAAa,EAAE,SAAS,EAAE,CAAC;gBACpJ,CAAC,CAAC,KAAK,CAAC;YACZ,SAAS,GAAG,MAAM,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC;QACvC,CAAC;QACD,MAAM,MAAM,GAAG,iBAAiB,CAAC,SAAS,EAAE,EAAE,KAAK,EAAE,WAAW,EAAE,OAAO,EAAE,QAAQ,EAAE,CAAC,CAAC,IAAI,CAAC;QAE5F,MAAM,WAAW,GAAG,qBAAqB,EAAE,EAAE,KAAK,EAAE,gBAAgB,CAAC;QACrE,MAAM,iBAAiB,GAAG,WAAW,EAAE,OAAO,CAAC,CAAC,CAAC,CAAC,WAAW,CAAC,OAAO,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;QAClF,IAAI,sBAAsB,CAAC,MAAM,EAAE,iBAAiB,CAAC,EAAE,CAAC;YACpD,GAAG,CAAC,IAAI,CAAC,cAAc,GAAG,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC;YAC9C,OAAO;QACX,CAAC;QAED,MAAM,MAAM,GAAG,oBAAoB,CAAC,MAAM,CAAC,CAAC;QAC5C,IAAI,MAAM,CAAC,cAAc;YAAE,gBAAgB,CAAC,MAAM,CAAC,QAAQ,IAAI,MAAM,CAAC,OAAO,IAAI,MAAM,CAAC,CAAC;QACzF,MAAM,MAAM,GAAG,GAAG,CAAC,cAAc,CAAC,IAAI,QAAQ,CAAC;QAC/C,MAAM,QAAQ,GAAG,qBAAqB,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;QACvD,MAAM,YAAY,GAAG,MAAM,CAAC,OAAO,IAAI,MAAM,CAAC;QAC9C,MAAM,SAAS,GAAG,MAAM,CAAC,MAAM,KAAK,IAAI,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,IAAI,MAAM,CAAC,MAAM,KAAK,YAAY,EAAE,CAAC;QAE/F,GAAG,CAAC,IAAI,CAAC,cAAc,GAAG,CAAC,MAAM,CAAC,eAAe,MAAM,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,EAAE,CAAC,CAAC;QAExE,wEAAwE;QACxE,kEAAkE;QAClE,yEAAyE;QACzE,sEAAsE;QACtE,uEAAuE;QACvE,8DAA8D;QAC9D,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,GAAG,eAAe,CAAC,GAAG,CAAC,aAAa,CAAC,CAAC,CAAC;QAC/D,IAAI,MAAM,IAAI,CAAC,MAAM,EAAE,CAAC;YACpB,uEAAuE;YACvE,gEAAgE;YAChE,+BAA+B;YAC/B,GAAG,CAAC,KAAK,CAAC,cAAc,GAAG,CAAC,MAAM,CAAC,yCAAyC,CAAC,CAAC;QAClF,CAAC;QACD,MAAM,UAAU,GAAG,CAAC,QAAQ,CAAC,IAAI;YAC7B,CAAC,CAAC,EAAE,EAAE,EAAE,IAAa,EAAE;YACvB,CAAC,CAAC,MAAM;gBACJ,CAAC,CAAC,CAAC,MAAM;oBACL,CAAC,CAAC,MAAM,iBAAiB,CAAC,EAAE,OAAO,EAAE,MAAM,CAAC,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,SAAS,EAAE,MAAM,EAAE,mBAAmB,EAAE,KAAK,EAAE,CAAC;oBACzH,CAAC,CAAC,EAAE,EAAE,EAAE,KAAc,EAAE,KAAK,EAAE,+BAA+B,EAAE,CAAC;gBACrE,CAAC,CAAC,MAAM,iBAAiB,CAAC,EAAE,OAAO,EAAE,QAAQ,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,SAAS,EAAE,CAAC,CAAC;QACxF,IAAI,CAAC,UAAU,CAAC,EAAE,EAAE,CAAC;YACjB,GAAG,CAAC,KAAK,CAAC,cAAc,GAAG,CAAC,MAAM,CAAC,kBAAkB,UAAU,CAAC,KAAK,EAAE,CAAC,CAAC;QAC7E,CAAC;QAED,kEAAkE;QAClE,IAAI,QAAQ,CAAC,MAAM,IAAI,UAAU,CAAC,EAAE,EAAE,CAAC;YACnC,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;YACvB,IAAI,CAAC;gBACD,qBAAqB,CAAC,GAAG,CACrB,GAAG,CAAC,IAAI,CAAC,EAAE,GAAG,CAAC,MAAM,CAAC,EAAE,QAAQ,CAAC,YAAY,CAAC,EAAE,MAAM,EAAE,OAAO,IAAI,QAAQ,EAAE,MAAM,EAAE,QAAQ,IAAI,IAAI,EACrG,GAAG,CAAC,QAAQ,CAAC,EAAE,QAAQ,CAAC,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,WAAW,SAAS,EAAE,EAAE,GAAG,EAAE,QAAQ,CAAC,SAAS,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,CAC/G,CAAC;YACN,CAAC;YAAC,OAAO,CAAC,EAAE,CAAC;gBACT,GAAG,CAAC,KAAK,CAAC,cAAc,GAAG,CAAC,MAAM,CAAC,uBAAuB,EAAG,CAAW,CAAC,OAAO,CAAC,CAAC;YACtF,CAAC;QACL,CAAC;IACL,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACX,GAAG,CAAC,KAAK,CAAC,cAAc,GAAG,CAAC,MAAM,CAAC,UAAU,EAAG,GAAa,CAAC,OAAO,CAAC,CAAC;IAC3E,CAAC;YAAS,CAAC;QACP,aAAa,GAAG,KAAK,CAAC;QACtB,MAAM,YAAY,EAAE,CAAC;IACzB,CAAC;AACL,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,YAAY;IAC9B,IAAI,WAAW,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO;IACrC,IAAI,WAAW,CAAC,eAAe,CAAC,IAAI,YAAY,CAAC,MAAM,GAAG,CAAC,IAAI,uBAAuB,CAAC,eAAe,CAAC;QAAE,OAAO;IAChH,MAAM,IAAI,GAAG,WAAW,CAAC,KAAK,EAAE,EAAE,GAAG,CAAC;IACtC,IAAI,CAAC,IAAI;QAAE,OAAO;IAClB,SAAS,CAAC,mBAAmB,EAAE,eAAe,EAAE,CAAC,CAAC;IAClD,GAAG,CAAC,IAAI,CAAC,cAAc,IAAI,CAAC,MAAM,CAAC,eAAe,WAAW,CAAC,MAAM,aAAa,CAAC,CAAC;IACnF,MAAM,eAAe,CAAC,IAAI,CAAC,CAAC;AAChC,CAAC;AAED,SAAS,eAAe,CAAC,GAAwB;IAC7C,MAAM,WAAW,GAAG,CAAC,IAAgB,EAAE,EAAE;QACrC,MAAM,KAAK,GAAG,UAAU,CAAC,IAAI,EAAE,iBAAiB,EAAE,CAAC,CAAC;QACpD,KAAK,CAAC,KAAK,EAAE,EAAE,CAAC;QAChB,eAAe,CAAC,GAAG,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,KAAK,CAAC,CAAC;IAC1C,CAAC,CAAC;IACF,sBAAsB,CAAC,GAAG,EAAE,CAAC,eAAe,CAAC,GAAG,CAAC,EAAE,WAAW,CAAC,CAAC;AACpE,CAAC;AAED,SAAS,eAAe,CAAC,GAAwB;IAC7C,MAAM,QAAQ,GAAG,0BAA0B,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC,CAAC;IAC7D,IAAI,QAAQ,CAAC,IAAI,KAAK,MAAM;QAAE,OAAO;IACrC,MAAM,QAAQ,GAAG,4BAA4B,CAAC,QAAQ,CAAC,CAAC;IACxD,IAAI,CAAC,oBAAoB,CAAC,QAAQ,CAAC,IAAI,EAAE,IAAI,IAAI,EAAE,EAAE,QAAQ,CAAC;QAAE,OAAO;IACvE,MAAM,OAAO,GAAG,yBAAyB,CAAC,QAAQ,CAAC,CAAC;IACpD,IAAI,kBAAkB,CAAC,GAAG,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,KAAK,OAAO;QAAE,OAAO;IAC1D,kBAAkB,CAAC,GAAG,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,OAAO,CAAC,CAAC;IAC3C,KAAK,eAAe,CAAC,GAAG,CAAC,CAAC;AAC9B,CAAC;AAED,SAAS,iBAAiB;IACtB,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;IACvB,MAAM,SAAS,GAAG,GAAG,GAAG,MAAM,CAAC;IAC/B,OAAO,CAAC,SAAS,KAAK,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM,GAAG,SAAS,CAAC,GAAG,GAAG,CAAC;AACjE,CAAC;AAED,wDAAwD;AAExD,MAAM,UAAU,kBAAkB;IAC9B,qBAAqB,EAAE,CAAC;IACxB,IAAI,CAAC;QACD,IAAI,aAAwD,CAAC;QAC7D,MAAM,GAAG,GAAG,OAAO,CAAC,mBAAmB,CAAC,CAAC;QACzC,MAAM,IAAI,GAAG,QAAQ,CAAC,mBAAmB,CAAC,CAAC;QAC3C,gBAAgB,GAAG,EAAE,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,MAAM,EAAE,OAAO,EAAE,EAAE;YACjD,IAAI,OAAO,IAAI,OAAO,KAAK,IAAI;gBAAE,OAAO;YACxC,YAAY,CAAC,aAAa,CAAC,CAAC;YAC5B,aAAa,GAAG,UAAU,CAAC,GAAG,EAAE;gBAC5B,GAAG,CAAC,IAAI,CAAC,sCAAsC,CAAC,CAAC;gBACjD,cAAc,EAAE,CAAC;YACrB,CAAC,EAAE,GAAG,CAAC,CAAC;QACZ,CAAC,CAAC,CAAC;QACH,gBAAgB,CAAC,EAAE,CAAC,OAAO,EAAE,GAAG,EAAE,GAAE,CAAC,CAAC,CAAC;IAC3C,CAAC;IAAC,MAAM,CAAC,CAAC,yCAAyC,CAAC,CAAC;AACzD,CAAC;AAED,MAAM,UAAU,qBAAqB;IACjC,IAAI,gBAAgB,EAAE,CAAC;QACnB,gBAAgB,CAAC,KAAK,EAAE,CAAC;QACzB,gBAAgB,GAAG,IAAI,CAAC;IAC5B,CAAC;AACL,CAAC;AAED,+BAA+B;AAC/B,OAAO,EAAE,iBAAiB,EAAE,iBAAiB,EAAE,CAAC"}
|
|
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
|
-
|
|
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":"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,
|
|
1
|
+
{"version":3,"file":"channel-health.js","sourceRoot":"","sources":["../../../src/messaging/channel-health.ts"],"names":[],"mappings":"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"}
|
|
@@ -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 };
|