easyoref 1.18.5 → 1.20.0

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 (91) hide show
  1. package/dist/agent/extract.d.ts +5 -5
  2. package/dist/agent/extract.d.ts.map +1 -1
  3. package/dist/agent/extract.js +77 -120
  4. package/dist/agent/extract.js.map +1 -1
  5. package/dist/agent/types.d.ts.map +1 -1
  6. package/dist/agent/types.js +21 -31
  7. package/dist/agent/types.js.map +1 -1
  8. package/dist/bot.js +17 -19
  9. package/dist/bot.js.map +1 -1
  10. package/dist/gif-state.js +1 -1
  11. package/dist/gif-state.js.map +1 -1
  12. package/dist/init.js +1 -1
  13. package/dist/init.js.map +1 -1
  14. package/package.json +5 -9
  15. package/dist/agent/auth.d.ts +0 -11
  16. package/dist/agent/auth.d.ts.map +0 -1
  17. package/dist/agent/auth.js +0 -54
  18. package/dist/agent/auth.js.map +0 -1
  19. package/dist/agent/clarify.d.ts +0 -44
  20. package/dist/agent/clarify.d.ts.map +0 -1
  21. package/dist/agent/clarify.js +0 -285
  22. package/dist/agent/clarify.js.map +0 -1
  23. package/dist/agent/dry-run.d.ts +0 -12
  24. package/dist/agent/dry-run.d.ts.map +0 -1
  25. package/dist/agent/dry-run.js +0 -236
  26. package/dist/agent/dry-run.js.map +0 -1
  27. package/dist/agent/filters.d.ts +0 -48
  28. package/dist/agent/filters.d.ts.map +0 -1
  29. package/dist/agent/filters.js +0 -124
  30. package/dist/agent/filters.js.map +0 -1
  31. package/dist/agent/gramjs-monitor.d.ts +0 -26
  32. package/dist/agent/gramjs-monitor.d.ts.map +0 -1
  33. package/dist/agent/gramjs-monitor.js +0 -325
  34. package/dist/agent/gramjs-monitor.js.map +0 -1
  35. package/dist/agent/graph.d.ts +0 -30
  36. package/dist/agent/graph.d.ts.map +0 -1
  37. package/dist/agent/graph.js +0 -240
  38. package/dist/agent/graph.js.map +0 -1
  39. package/dist/agent/helpers.d.ts +0 -6
  40. package/dist/agent/helpers.d.ts.map +0 -1
  41. package/dist/agent/helpers.js +0 -15
  42. package/dist/agent/helpers.js.map +0 -1
  43. package/dist/agent/message.d.ts +0 -69
  44. package/dist/agent/message.d.ts.map +0 -1
  45. package/dist/agent/message.js +0 -479
  46. package/dist/agent/message.js.map +0 -1
  47. package/dist/agent/queue.d.ts +0 -15
  48. package/dist/agent/queue.d.ts.map +0 -1
  49. package/dist/agent/queue.js +0 -41
  50. package/dist/agent/queue.js.map +0 -1
  51. package/dist/agent/redis.d.ts +0 -8
  52. package/dist/agent/redis.d.ts.map +0 -1
  53. package/dist/agent/redis.js +0 -33
  54. package/dist/agent/redis.js.map +0 -1
  55. package/dist/agent/store.d.ts +0 -93
  56. package/dist/agent/store.d.ts.map +0 -1
  57. package/dist/agent/store.js +0 -145
  58. package/dist/agent/store.js.map +0 -1
  59. package/dist/agent/tools.d.ts +0 -159
  60. package/dist/agent/tools.d.ts.map +0 -1
  61. package/dist/agent/tools.js +0 -439
  62. package/dist/agent/tools.js.map +0 -1
  63. package/dist/agent/types.d.ts +0 -218
  64. package/dist/agent/vote.d.ts +0 -13
  65. package/dist/agent/vote.d.ts.map +0 -1
  66. package/dist/agent/vote.js +0 -246
  67. package/dist/agent/vote.js.map +0 -1
  68. package/dist/agent/worker.d.ts +0 -14
  69. package/dist/agent/worker.d.ts.map +0 -1
  70. package/dist/agent/worker.js +0 -137
  71. package/dist/agent/worker.js.map +0 -1
  72. package/dist/bin.d.ts +0 -17
  73. package/dist/bot.d.ts +0 -16
  74. package/dist/config.d.ts +0 -129
  75. package/dist/config.d.ts.map +0 -1
  76. package/dist/config.js +0 -157
  77. package/dist/config.js.map +0 -1
  78. package/dist/gif-state.d.ts +0 -17
  79. package/dist/i18n.d.ts +0 -49
  80. package/dist/i18n.d.ts.map +0 -1
  81. package/dist/i18n.js +0 -229
  82. package/dist/i18n.js.map +0 -1
  83. package/dist/init.d.ts +0 -7
  84. package/dist/logger.d.ts +0 -14
  85. package/dist/logger.d.ts.map +0 -1
  86. package/dist/logger.js +0 -45
  87. package/dist/logger.js.map +0 -1
  88. package/dist/service.d.ts +0 -19
  89. package/dist/service.d.ts.map +0 -1
  90. package/dist/service.js +0 -165
  91. package/dist/service.js.map +0 -1
@@ -1,479 +0,0 @@
1
- /**
2
- * Message building and Telegram editing.
3
- *
4
- * Builds enriched message text from voted consensus + carry-forward data.
5
- * Uses inline [[1]](url) citations. No superscripts. No footer sources.
6
- */
7
- import { Bot } from "grammy";
8
- import { config } from "../config.js";
9
- import * as logger from "../logger.js";
10
- import { textHash, toIsraelTime } from "./helpers.js";
11
- import { getActiveSession, saveEnrichmentData, setActiveSession, } from "./store.js";
12
- import { emptyEnrichmentData } from "./types.js";
13
- // ── Country translations ───────────────────────────────
14
- /** EN country name → Russian */
15
- export const COUNTRY_RU = {
16
- Iran: "Иран",
17
- Yemen: "Йемен",
18
- Lebanon: "Ливан",
19
- Gaza: "Газа",
20
- Iraq: "Ирак",
21
- Syria: "Сирия",
22
- Hezbollah: "Хезболла",
23
- };
24
- // ── Citation helpers ───────────────────────────────────
25
- /** Format inline citations: [[1]](url), [[2]](url) */
26
- export function inlineCites(indices, citedSources) {
27
- const parts = [];
28
- for (const idx of indices) {
29
- const src = citedSources.find((s) => s.index === idx);
30
- if (src?.messageUrl) {
31
- parts.push(`<a href="${src.messageUrl}">[${idx}]</a>`);
32
- }
33
- }
34
- return parts.length > 0 ? " " + parts.join(", ") : "";
35
- }
36
- /** Get InlineCite[] from citation indices */
37
- export function extractCites(indices, citedSources) {
38
- const cites = [];
39
- for (const idx of indices) {
40
- const src = citedSources.find((s) => s.index === idx);
41
- if (src?.messageUrl) {
42
- cites.push({ url: src.messageUrl, channel: src.channel });
43
- }
44
- }
45
- return cites;
46
- }
47
- /** Format inline citations from InlineCite[] (carry-forward data) */
48
- export function inlineCitesFromData(cites) {
49
- if (cites.length === 0)
50
- return "";
51
- return (" " + cites.map((c, i) => `<a href="${c.url}">[${i + 1}]</a>`).join(", "));
52
- }
53
- /**
54
- * Build a global URL→index map across ALL enrichment fields.
55
- * Deduplicates by URL so the same source gets the same [N] everywhere.
56
- */
57
- export function buildGlobalCiteMap(enrichment) {
58
- // Order matches visual render order in buildEnrichedMessage:
59
- // ETA (inline replacement first), then appended fields top-to-bottom.
60
- const allCites = [
61
- ...enrichment.etaCites,
62
- ...enrichment.originCites,
63
- ...enrichment.rocketCites,
64
- ...enrichment.interceptedCites,
65
- ...enrichment.hitsCites,
66
- ...enrichment.noImpactsCites,
67
- ...enrichment.casualtiesCites,
68
- ...enrichment.injuriesCites,
69
- ];
70
- const map = new Map();
71
- let idx = 1;
72
- for (const cite of allCites) {
73
- if (!map.has(cite.url)) {
74
- map.set(cite.url, idx++);
75
- }
76
- }
77
- return map;
78
- }
79
- /** Format inline citations using global numbering */
80
- export function renderCitesGlobal(cites, globalMap) {
81
- if (cites.length === 0)
82
- return "";
83
- const parts = [];
84
- for (const c of cites) {
85
- const i = globalMap.get(c.url);
86
- if (i !== undefined) {
87
- parts.push(`<a href="${c.url}">[${i}]</a>`);
88
- }
89
- }
90
- return parts.length > 0 ? " " + parts.join(", ") : "";
91
- }
92
- // ── Confidence thresholds ──────────────────────────────
93
- export const SKIP = 0.6;
94
- export const UNCERTAIN = 0.75;
95
- export const CERTAIN = 0.95;
96
- // ── Monitoring indicator ───────────────────────────────
97
- /** Strip custom-emoji monitoring line from message text */
98
- export const MONITORING_RE = /\n?<tg-emoji emoji-id="\d+">⏳<\/tg-emoji>\s*[^\n]+$/;
99
- export function stripMonitoring(text) {
100
- return text.replace(MONITORING_RE, "");
101
- }
102
- export function appendMonitoring(text, label) {
103
- return text + "\n" + label;
104
- }
105
- // ── Display helpers ────────────────────────────────────
106
- function qualDisplay(qual, qualNum, conf) {
107
- if (qual === null)
108
- return null;
109
- if (qual === "none")
110
- return conf >= CERTAIN ? "нет" : null;
111
- const map = {
112
- all: "все",
113
- most: "большинство",
114
- many: "много",
115
- few: "несколько",
116
- exists: "есть",
117
- none: "нет",
118
- more_than: qualNum != null ? `>${qualNum}` : ">1",
119
- less_than: qualNum != null ? `<${qualNum}` : "<нескольких",
120
- };
121
- return map[qual];
122
- }
123
- // ── Build enrichment data from vote ────────────────────
124
- /**
125
- * Build enrichment data from current vote + previous enrichment (carry-forward).
126
- * Returns updated EnrichmentData for Redis persistence.
127
- */
128
- export function buildEnrichmentFromVote(r, prev, alertType, alertTs) {
129
- const data = { ...prev };
130
- // Origin
131
- if (r.country_origins && r.country_origins.length > 0) {
132
- data.origin = r.country_origins
133
- .map((c) => COUNTRY_RU[c.name] ?? c.name)
134
- .join(" + ");
135
- data.originCites = r.country_origins.flatMap((c) => extractCites(c.citations, r.citedSources));
136
- }
137
- // ETA — only for early_warning/siren
138
- if (r.eta_refined_minutes !== null &&
139
- (alertType === "early_warning" || alertType === "siren")) {
140
- const absTime = new Date(alertTs + r.eta_refined_minutes * 60_000).toLocaleTimeString("he-IL", {
141
- hour: "2-digit",
142
- minute: "2-digit",
143
- timeZone: "Asia/Jerusalem",
144
- });
145
- data.etaAbsolute = `~${absTime}`;
146
- data.etaCites = extractCites(r.eta_citations, r.citedSources);
147
- }
148
- // Rocket count — show even at lower confidence (high-value intel)
149
- // >= 0.55: show with (?); >= UNCERTAIN (0.75): show without marker
150
- if (r.rocket_count_min !== null &&
151
- r.rocket_count_max !== null &&
152
- r.rocket_confidence >= 0.55) {
153
- const u = r.rocket_confidence < UNCERTAIN ? " (?)" : "";
154
- data.rocketCount =
155
- r.rocket_count_min === r.rocket_count_max
156
- ? `${r.rocket_count_min}${u}`
157
- : `~${r.rocket_count_min}–${r.rocket_count_max}${u}`;
158
- data.rocketCites = extractCites(r.rocket_citations, r.citedSources);
159
- }
160
- // Cassette
161
- if (r.is_cassette !== null && r.is_cassette_confidence >= SKIP) {
162
- data.isCassette = r.is_cassette;
163
- }
164
- // Intercepted
165
- if (r.intercepted !== null && r.intercepted_confidence >= SKIP) {
166
- const u = r.intercepted_confidence < UNCERTAIN ? " (?)" : "";
167
- data.intercepted = `${r.intercepted}${u}`;
168
- data.interceptedCites = extractCites(r.intercepted_citations, r.citedSources);
169
- }
170
- else if (r.intercepted_qual !== null && r.intercepted_confidence >= SKIP) {
171
- const qs = qualDisplay(r.intercepted_qual, r.intercepted_qual_num, r.intercepted_confidence);
172
- if (qs)
173
- data.intercepted = qs;
174
- }
175
- // Hits
176
- if (r.hits_confirmed !== null &&
177
- r.hits_confirmed > 0 &&
178
- r.hits_confidence >= SKIP) {
179
- const u = r.hits_confidence < UNCERTAIN ? " (?)" : "";
180
- data.hitsConfirmed = `${r.hits_confirmed}${u}`;
181
- data.hitsCites = extractCites(r.hits_citations, r.citedSources);
182
- }
183
- // No impacts: sources explicitly confirm zero hits
184
- if (r.no_impacts && r.hits_confidence >= SKIP) {
185
- data.noImpacts = true;
186
- data.noImpactsCites = extractCites(r.no_impacts_citations, r.citedSources);
187
- }
188
- // Rocket detail (per-region breakdown)
189
- if (r.rocket_detail) {
190
- data.rocketDetail = r.rocket_detail;
191
- }
192
- // Hit location & type
193
- if (r.hit_location && r.hits_confirmed !== null && r.hits_confirmed > 0) {
194
- data.hitLocation = r.hit_location;
195
- }
196
- if (r.hit_type && r.hits_confirmed !== null && r.hits_confirmed > 0) {
197
- data.hitType = r.hit_type;
198
- }
199
- if (r.hit_detail && r.hits_confirmed !== null && r.hits_confirmed > 0) {
200
- data.hitDetail = r.hit_detail;
201
- }
202
- // Casualties — CRITICAL: only report at near-certain confidence
203
- // Requires explicit mention of killed/dead in source (נהרג/מת/killed/dead/убит/погиб)
204
- if (r.casualties !== null &&
205
- r.casualties > 0 &&
206
- r.casualties_confidence >= CERTAIN // 0.95 — never show unconfirmed deaths
207
- ) {
208
- // No uncertainty marker for deaths — either confirmed or not shown
209
- data.casualties = `${r.casualties}`;
210
- data.casualtiesCites = extractCites(r.casualties_citations, r.citedSources);
211
- }
212
- // Injuries — show only if confidence >= UNCERTAIN (not SKIP)
213
- // Retractions: if new vote has injuries=0 and confidence >= UNCERTAIN, clear previous data
214
- if (r.injuries !== null &&
215
- r.injuries > 0 &&
216
- r.injuries_confidence >= UNCERTAIN) {
217
- const u = r.injuries_confidence < CERTAIN ? " (?)" : "";
218
- const causeSuffix = r.injuries_cause === "rushing_to_shelter"
219
- ? " (по дороге в укрытие)"
220
- : r.injuries_cause === "rocket"
221
- ? " (от ракеты)"
222
- : "";
223
- data.injuries = `${r.injuries}${u}${causeSuffix}`;
224
- data.injuriesCause = r.injuries_cause;
225
- data.injuriesCites = extractCites(r.injuries_citations, r.citedSources);
226
- }
227
- else if (r.injuries !== null &&
228
- r.injuries === 0 &&
229
- r.injuries_confidence >= UNCERTAIN &&
230
- prev.injuries) {
231
- // Explicit retraction: source says "no injured" — clear previous report
232
- data.injuries = null;
233
- data.injuriesCause = null;
234
- data.injuriesCites = [];
235
- }
236
- // Early warning time
237
- if (alertType === "early_warning" && !data.earlyWarningTime) {
238
- data.earlyWarningTime = toIsraelTime(alertTs);
239
- }
240
- return data;
241
- }
242
- // ── Build enriched message text ────────────────────────
243
- /**
244
- * Build the enriched message text from current message + enrichment data.
245
- * Uses inline [[1]](url) citations.
246
- */
247
- export function buildEnrichedMessage(currentText, alertType, alertTs, enrichment, monitoringLabel) {
248
- // Strip monitoring indicator before building — will re-add at the end
249
- let text = stripMonitoring(currentText);
250
- // ── Global citation map ──
251
- const citeMap = buildGlobalCiteMap(enrichment);
252
- // ── Refine ETA in-place ──
253
- if (enrichment.etaAbsolute &&
254
- (alertType === "early_warning" || alertType === "siren")) {
255
- const etaCiteStr = renderCitesGlobal(enrichment.etaCites, citeMap);
256
- const refined = `${enrichment.etaAbsolute}${etaCiteStr}`;
257
- const etaPatterns = [
258
- /~\d+[–-]\d+\s*мин/,
259
- /~\d+[–-]\d+\s*min/,
260
- /~\d+[–-]\d+\s*דקות/,
261
- /~\d+[–-]\d+\s*دقيقة/,
262
- /1\.5\s*мин/,
263
- /1\.5\s*min/,
264
- /1\.5\s*דקות/,
265
- /1\.5\s*دقيقة/,
266
- ];
267
- for (const pattern of etaPatterns) {
268
- if (pattern.test(text)) {
269
- text = text.replace(pattern, refined);
270
- break;
271
- }
272
- }
273
- }
274
- // ── Origin ──
275
- if (enrichment.origin) {
276
- const citeStr = renderCitesGlobal(enrichment.originCites, citeMap);
277
- text = insertBeforeBlockEnd(text, `<b>Откуда:</b> ${enrichment.origin}${citeStr}`);
278
- }
279
- // ── Rocket count (separate line, no compound breakdown) ──
280
- if (enrichment.rocketCount) {
281
- const citeStr = renderCitesGlobal(enrichment.rocketCites, citeMap);
282
- const cassette = enrichment.isCassette ? ", кассетные" : "";
283
- const detail = enrichment.rocketDetail
284
- ? ` (${enrichment.rocketDetail})`
285
- : "";
286
- text = insertBeforeBlockEnd(text, `<b>Ракет:</b> ${enrichment.rocketCount}${detail}${cassette}${citeStr}`);
287
- }
288
- // ── Intercepted (own line) ──
289
- if (enrichment.intercepted && alertType !== "early_warning") {
290
- const citeStr = renderCitesGlobal(enrichment.interceptedCites, citeMap);
291
- text = insertBeforeBlockEnd(text, `<b>Перехваты:</b> ${enrichment.intercepted}${citeStr}`);
292
- }
293
- // ── Hits / No impacts (own line) ──
294
- if (enrichment.hitsConfirmed && alertType !== "early_warning") {
295
- const citeStr = renderCitesGlobal(enrichment.hitsCites, citeMap);
296
- const HIT_TYPE_DISPLAY = {
297
- direct: "прямое",
298
- shrapnel: "обломки",
299
- };
300
- const qualifiers = [];
301
- if (enrichment.hitLocation)
302
- qualifiers.push(enrichment.hitLocation);
303
- if (enrichment.hitDetail)
304
- qualifiers.push(enrichment.hitDetail);
305
- if (enrichment.hitType)
306
- qualifiers.push(HIT_TYPE_DISPLAY[enrichment.hitType] ?? enrichment.hitType);
307
- const suffix = qualifiers.length > 0 ? ` (${qualifiers.join(", ")})` : "";
308
- text = insertBeforeBlockEnd(text, `<b>Попадания:</b> ${enrichment.hitsConfirmed}${suffix}${citeStr}`);
309
- }
310
- else if (enrichment.noImpacts && alertType !== "early_warning") {
311
- const citeStr = renderCitesGlobal(enrichment.noImpactsCites, citeMap);
312
- text = insertBeforeBlockEnd(text, `<b>Прилетов:</b> нет${citeStr}`);
313
- }
314
- // ── Casualties / Injuries (resolved only) ──
315
- if (enrichment.casualties && alertType === "resolved") {
316
- const citeStr = renderCitesGlobal(enrichment.casualtiesCites, citeMap);
317
- text = insertBeforeBlockEnd(text, `<b>Погибшие:</b> ${enrichment.casualties}${citeStr}`);
318
- }
319
- if (enrichment.injuries && alertType === "resolved") {
320
- const citeStr = renderCitesGlobal(enrichment.injuriesCites, citeMap);
321
- const causeLabel = enrichment.injuriesCause === "rushing_to_shelter"
322
- ? " (на пути в укрытие)"
323
- : enrichment.injuriesCause === "rocket"
324
- ? " (от ракеты)"
325
- : "";
326
- text = insertBeforeBlockEnd(text, `<b>Пострадавшие:</b> ${enrichment.injuries}${causeLabel}${citeStr}`);
327
- }
328
- // Re-add monitoring indicator if still in active phase
329
- if (monitoringLabel && alertType !== "resolved") {
330
- text = appendMonitoring(text, monitoringLabel);
331
- }
332
- return text;
333
- }
334
- /**
335
- * Insert a line before </blockquote> (or legacy time line as fallback).
336
- */
337
- export function insertBeforeBlockEnd(text, line) {
338
- const bqIdx = text.lastIndexOf("</blockquote>");
339
- if (bqIdx !== -1) {
340
- return text.slice(0, bqIdx) + line + "\n" + text.slice(bqIdx);
341
- }
342
- // Legacy fallback: insert before time line
343
- const timePattern = /(<b>(?:Время оповещения|Alert time|שעת ההתרעה|وقت الإنذار):<\/b>)/;
344
- const match = text.match(timePattern);
345
- if (match?.index !== undefined) {
346
- return text.slice(0, match.index) + line + "\n" + text.slice(match.index);
347
- }
348
- const lines = text.split("\n");
349
- lines.splice(Math.max(lines.length - 1, 0), 0, line);
350
- return lines.join("\n");
351
- }
352
- /** @deprecated Use insertBeforeBlockEnd */
353
- export const insertBeforeTimeLine = insertBeforeBlockEnd;
354
- /**
355
- * Edit the Telegram message with enriched data.
356
- */
357
- export async function editMessage(input) {
358
- if (!config.botToken)
359
- return;
360
- const tgBot = new Bot(config.botToken);
361
- const prev = input.previousEnrichment ?? emptyEnrichmentData();
362
- // Resolve targets: multi-chat or single fallback
363
- const targets = input.chatMessages ?? [
364
- {
365
- chatId: input.chatId,
366
- messageId: input.messageId,
367
- isCaption: input.isCaption,
368
- },
369
- ];
370
- if (!input.votedResult) {
371
- // No new data — try carry-forward only
372
- if (prev.origin || prev.intercepted) {
373
- const newText = buildEnrichedMessage(input.currentText, input.alertType, input.alertTs, prev, input.monitoringLabel);
374
- const hash = textHash(newText);
375
- if (hash === prev.lastEditHash) {
376
- logger.info("Agent: no change (dedup)", { alertId: input.alertId });
377
- return;
378
- }
379
- for (const t of targets) {
380
- try {
381
- if (t.isCaption) {
382
- await tgBot.api.editMessageCaption(t.chatId, t.messageId, {
383
- caption: newText,
384
- parse_mode: "HTML",
385
- });
386
- }
387
- else {
388
- await tgBot.api.editMessageText(t.chatId, t.messageId, newText, {
389
- parse_mode: "HTML",
390
- });
391
- }
392
- }
393
- catch (err) {
394
- const errStr = String(err);
395
- if (!errStr.includes("message is not modified")) {
396
- logger.error("Agent: edit failed", {
397
- alertId: input.alertId,
398
- chatId: t.chatId,
399
- error: errStr,
400
- });
401
- }
402
- }
403
- }
404
- prev.lastEditHash = hash;
405
- await saveEnrichmentData(prev);
406
- // Keep session.currentText in sync for monitoring removal
407
- const sess = await getActiveSession();
408
- if (sess) {
409
- sess.currentText = newText;
410
- await setActiveSession(sess);
411
- }
412
- logger.info("Agent: enriched (carry-forward)", {
413
- alertId: input.alertId,
414
- });
415
- }
416
- else {
417
- logger.info("Agent: no voted result — skipping", {
418
- alertId: input.alertId,
419
- });
420
- }
421
- return;
422
- }
423
- // Build enrichment data: merge vote + previous
424
- const enrichment = buildEnrichmentFromVote(input.votedResult, prev, input.alertType, input.alertTs);
425
- const newText = buildEnrichedMessage(input.currentText, input.alertType, input.alertTs, enrichment, input.monitoringLabel);
426
- // Dedup: skip if text hasn't changed
427
- const hash = textHash(newText);
428
- if (hash === enrichment.lastEditHash) {
429
- logger.info("Agent: no change (dedup)", { alertId: input.alertId });
430
- return;
431
- }
432
- if (input.votedResult.confidence < config.agent.confidenceThreshold) {
433
- logger.info("Agent: low confidence — editing with (?) markers", {
434
- alertId: input.alertId,
435
- confidence: input.votedResult.confidence,
436
- });
437
- }
438
- for (const t of targets) {
439
- try {
440
- if (t.isCaption) {
441
- await tgBot.api.editMessageCaption(t.chatId, t.messageId, {
442
- caption: newText,
443
- parse_mode: "HTML",
444
- });
445
- }
446
- else {
447
- await tgBot.api.editMessageText(t.chatId, t.messageId, newText, {
448
- parse_mode: "HTML",
449
- });
450
- }
451
- }
452
- catch (err) {
453
- const errStr = String(err);
454
- if (!errStr.includes("message is not modified")) {
455
- logger.error("Agent: edit failed", {
456
- alertId: input.alertId,
457
- chatId: t.chatId,
458
- error: errStr,
459
- });
460
- }
461
- }
462
- }
463
- enrichment.lastEditHash = hash;
464
- await saveEnrichmentData(enrichment);
465
- // Keep session.currentText in sync for monitoring removal
466
- const sess = await getActiveSession();
467
- if (sess) {
468
- sess.currentText = newText;
469
- await setActiveSession(sess);
470
- }
471
- logger.info("Agent: enriched", {
472
- alertId: input.alertId,
473
- targets: targets.length,
474
- confidence: input.votedResult.confidence,
475
- sources: input.votedResult.sources_count,
476
- phase: input.alertType,
477
- });
478
- }
479
- //# sourceMappingURL=message.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"message.js","sourceRoot":"","sources":["../../src/agent/message.ts"],"names":[],"mappings":"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"}
@@ -1,15 +0,0 @@
1
- /**
2
- * BullMQ queue — enrich alert jobs.
3
- *
4
- * Job payload: { alertId, alertTs }
5
- * Job is added with a delay (config.agent.enrichDelayMs) after alert fires,
6
- * then the worker runs the LangGraph pipeline and edits the Telegram message.
7
- */
8
- import { Queue } from "bullmq";
9
- export interface EnrichJobData {
10
- alertId: string;
11
- alertTs: number;
12
- }
13
- export declare function getEnrichQueue(): Queue<EnrichJobData>;
14
- export declare function enqueueEnrich(alertId: string, alertTs: number, delayMs?: number): Promise<void>;
15
- //# sourceMappingURL=queue.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"queue.d.ts","sourceRoot":"","sources":["../../src/agent/queue.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,EAAE,KAAK,EAAE,MAAM,QAAQ,CAAC;AAI/B,MAAM,WAAW,aAAa;IAC5B,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE,MAAM,CAAC;CACjB;AAID,wBAAgB,cAAc,IAAI,KAAK,CAAC,aAAa,CAAC,CAiBrD;AAED,wBAAsB,aAAa,CACjC,OAAO,EAAE,MAAM,EACf,OAAO,EAAE,MAAM,EACf,OAAO,CAAC,EAAE,MAAM,GACf,OAAO,CAAC,IAAI,CAAC,CAcf"}
@@ -1,41 +0,0 @@
1
- /**
2
- * BullMQ queue — enrich alert jobs.
3
- *
4
- * Job payload: { alertId, alertTs }
5
- * Job is added with a delay (config.agent.enrichDelayMs) after alert fires,
6
- * then the worker runs the LangGraph pipeline and edits the Telegram message.
7
- */
8
- import { Queue } from "bullmq";
9
- import { config } from "../config.js";
10
- import * as logger from "../logger.js";
11
- let _queue = null;
12
- export function getEnrichQueue() {
13
- if (!_queue) {
14
- _queue = new Queue("enrich-alert", {
15
- connection: {
16
- host: new URL(config.agent.redisUrl).hostname,
17
- port: Number(new URL(config.agent.redisUrl).port || 6379),
18
- password: new URL(config.agent.redisUrl).password || undefined,
19
- },
20
- defaultJobOptions: {
21
- removeOnComplete: 100,
22
- removeOnFail: 50,
23
- attempts: 2,
24
- backoff: { type: "exponential", delay: 10_000 },
25
- },
26
- });
27
- }
28
- return _queue;
29
- }
30
- export async function enqueueEnrich(alertId, alertTs, delayMs) {
31
- if (!config.agent.enabled)
32
- return;
33
- const delay = delayMs ?? config.agent.enrichDelayMs;
34
- const queue = getEnrichQueue();
35
- await queue.add("enrich", { alertId, alertTs }, { delay });
36
- logger.info("Enrich job enqueued", {
37
- alertId,
38
- delay_ms: delay,
39
- });
40
- }
41
- //# sourceMappingURL=queue.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"queue.js","sourceRoot":"","sources":["../../src/agent/queue.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,EAAE,KAAK,EAAE,MAAM,QAAQ,CAAC;AAC/B,OAAO,EAAE,MAAM,EAAE,MAAM,cAAc,CAAC;AACtC,OAAO,KAAK,MAAM,MAAM,cAAc,CAAC;AAOvC,IAAI,MAAM,GAAgC,IAAI,CAAC;AAE/C,MAAM,UAAU,cAAc;IAC5B,IAAI,CAAC,MAAM,EAAE,CAAC;QACZ,MAAM,GAAG,IAAI,KAAK,CAAgB,cAAc,EAAE;YAChD,UAAU,EAAE;gBACV,IAAI,EAAE,IAAI,GAAG,CAAC,MAAM,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC,QAAQ;gBAC7C,IAAI,EAAE,MAAM,CAAC,IAAI,GAAG,CAAC,MAAM,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC,IAAI,IAAI,IAAI,CAAC;gBACzD,QAAQ,EAAE,IAAI,GAAG,CAAC,MAAM,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC,QAAQ,IAAI,SAAS;aAC/D;YACD,iBAAiB,EAAE;gBACjB,gBAAgB,EAAE,GAAG;gBACrB,YAAY,EAAE,EAAE;gBAChB,QAAQ,EAAE,CAAC;gBACX,OAAO,EAAE,EAAE,IAAI,EAAE,aAAa,EAAE,KAAK,EAAE,MAAM,EAAE;aAChD;SACF,CAAC,CAAC;IACL,CAAC;IACD,OAAO,MAAM,CAAC;AAChB,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,aAAa,CACjC,OAAe,EACf,OAAe,EACf,OAAgB;IAEhB,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,OAAO;QAAE,OAAO;IAElC,MAAM,KAAK,GAAG,OAAO,IAAI,MAAM,CAAC,KAAK,CAAC,aAAa,CAAC;IACpD,MAAM,KAAK,GAAG,cAAc,EAAE,CAAC;IAC/B,MAAM,KAAK,CAAC,GAAG,CACb,QAAQ,EACR,EAAE,OAAO,EAAE,OAAO,EAAE,EACpB,EAAE,KAAK,EAAE,CACV,CAAC;IACF,MAAM,CAAC,IAAI,CAAC,qBAAqB,EAAE;QACjC,OAAO;QACP,QAAQ,EAAE,KAAK;KAChB,CAAC,CAAC;AACL,CAAC"}
@@ -1,8 +0,0 @@
1
- /**
2
- * Redis singleton (ioredis).
3
- * Lazily initialized so the main bot still works when agent.enabled=false.
4
- */
5
- import { Redis as IORedis } from "ioredis";
6
- export declare function getRedis(): IORedis;
7
- export declare function closeRedis(): Promise<void>;
8
- //# sourceMappingURL=redis.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"redis.d.ts","sourceRoot":"","sources":["../../src/agent/redis.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,KAAK,IAAI,OAAO,EAAE,MAAM,SAAS,CAAC;AAM3C,wBAAgB,QAAQ,IAAI,OAAO,CAmBlC;AAED,wBAAsB,UAAU,IAAI,OAAO,CAAC,IAAI,CAAC,CAKhD"}
@@ -1,33 +0,0 @@
1
- /**
2
- * Redis singleton (ioredis).
3
- * Lazily initialized so the main bot still works when agent.enabled=false.
4
- */
5
- import { Redis as IORedis } from "ioredis";
6
- import { config } from "../config.js";
7
- import * as logger from "../logger.js";
8
- let _redis = null;
9
- export function getRedis() {
10
- if (!_redis) {
11
- _redis = new IORedis(config.agent.redisUrl, {
12
- lazyConnect: false,
13
- maxRetriesPerRequest: 3,
14
- enableReadyCheck: true,
15
- });
16
- _redis.on("error", (err) => {
17
- logger.warn("Redis error", { error: String(err) });
18
- });
19
- _redis.on("connect", () => {
20
- logger.info("Redis connected", {
21
- url: config.agent.redisUrl.replace(/:[^:@]+@/, ":***@"),
22
- });
23
- });
24
- }
25
- return _redis;
26
- }
27
- export async function closeRedis() {
28
- if (_redis) {
29
- await _redis.quit();
30
- _redis = null;
31
- }
32
- }
33
- //# sourceMappingURL=redis.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"redis.js","sourceRoot":"","sources":["../../src/agent/redis.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,KAAK,IAAI,OAAO,EAAE,MAAM,SAAS,CAAC;AAC3C,OAAO,EAAE,MAAM,EAAE,MAAM,cAAc,CAAC;AACtC,OAAO,KAAK,MAAM,MAAM,cAAc,CAAC;AAEvC,IAAI,MAAM,GAAmB,IAAI,CAAC;AAElC,MAAM,UAAU,QAAQ;IACtB,IAAI,CAAC,MAAM,EAAE,CAAC;QACZ,MAAM,GAAG,IAAI,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,QAAQ,EAAE;YAC1C,WAAW,EAAE,KAAK;YAClB,oBAAoB,EAAE,CAAC;YACvB,gBAAgB,EAAE,IAAI;SACvB,CAAC,CAAC;QAEH,MAAM,CAAC,EAAE,CAAC,OAAO,EAAE,CAAC,GAAU,EAAE,EAAE;YAChC,MAAM,CAAC,IAAI,CAAC,aAAa,EAAE,EAAE,KAAK,EAAE,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QACrD,CAAC,CAAC,CAAC;QAEH,MAAM,CAAC,EAAE,CAAC,SAAS,EAAE,GAAG,EAAE;YACxB,MAAM,CAAC,IAAI,CAAC,iBAAiB,EAAE;gBAC7B,GAAG,EAAE,MAAM,CAAC,KAAK,CAAC,QAAQ,CAAC,OAAO,CAAC,UAAU,EAAE,OAAO,CAAC;aACxD,CAAC,CAAC;QACL,CAAC,CAAC,CAAC;IACL,CAAC;IACD,OAAO,MAAM,CAAC;AAChB,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,UAAU;IAC9B,IAAI,MAAM,EAAE,CAAC;QACX,MAAM,MAAM,CAAC,IAAI,EAAE,CAAC;QACpB,MAAM,GAAG,IAAI,CAAC;IAChB,CAAC;AACH,CAAC"}