@easyoref/agent 1.21.1

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 (158) hide show
  1. package/__tests__/clarify.test.ts +827 -0
  2. package/__tests__/config.test.ts +304 -0
  3. package/__tests__/enrichment.integration.test.ts +871 -0
  4. package/__tests__/graph.test.ts +661 -0
  5. package/dist/auth.d.ts +11 -0
  6. package/dist/auth.d.ts.map +1 -0
  7. package/dist/auth.js +54 -0
  8. package/dist/auth.js.map +1 -0
  9. package/dist/dry-run.d.ts +12 -0
  10. package/dist/dry-run.d.ts.map +1 -0
  11. package/dist/dry-run.js +236 -0
  12. package/dist/dry-run.js.map +1 -0
  13. package/dist/extract.d.ts +180 -0
  14. package/dist/extract.d.ts.map +1 -0
  15. package/dist/extract.js +210 -0
  16. package/dist/extract.js.map +1 -0
  17. package/dist/graph.d.ts +4083 -0
  18. package/dist/graph.d.ts.map +1 -0
  19. package/dist/graph.js +162 -0
  20. package/dist/graph.js.map +1 -0
  21. package/dist/index.d.ts +23 -0
  22. package/dist/index.d.ts.map +1 -0
  23. package/dist/index.js +23 -0
  24. package/dist/index.js.map +1 -0
  25. package/dist/models.d.ts +7 -0
  26. package/dist/models.d.ts.map +1 -0
  27. package/dist/models.js +18 -0
  28. package/dist/models.js.map +1 -0
  29. package/dist/nodes/clarify-node.d.ts +132 -0
  30. package/dist/nodes/clarify-node.d.ts.map +1 -0
  31. package/dist/nodes/clarify-node.js +118 -0
  32. package/dist/nodes/clarify-node.js.map +1 -0
  33. package/dist/nodes/clarify.d.ts +6 -0
  34. package/dist/nodes/clarify.d.ts.map +1 -0
  35. package/dist/nodes/clarify.js +124 -0
  36. package/dist/nodes/clarify.js.map +1 -0
  37. package/dist/nodes/edit-node.d.ts +71 -0
  38. package/dist/nodes/edit-node.d.ts.map +1 -0
  39. package/dist/nodes/edit-node.js +496 -0
  40. package/dist/nodes/edit-node.js.map +1 -0
  41. package/dist/nodes/edit.d.ts +6 -0
  42. package/dist/nodes/edit.d.ts.map +1 -0
  43. package/dist/nodes/edit.js +22 -0
  44. package/dist/nodes/edit.js.map +1 -0
  45. package/dist/nodes/extract-node.d.ts +174 -0
  46. package/dist/nodes/extract-node.d.ts.map +1 -0
  47. package/dist/nodes/extract-node.js +233 -0
  48. package/dist/nodes/extract-node.js.map +1 -0
  49. package/dist/nodes/extract.d.ts +6 -0
  50. package/dist/nodes/extract.d.ts.map +1 -0
  51. package/dist/nodes/extract.js +49 -0
  52. package/dist/nodes/extract.js.map +1 -0
  53. package/dist/nodes/filter-agent.d.ts +11 -0
  54. package/dist/nodes/filter-agent.d.ts.map +1 -0
  55. package/dist/nodes/filter-agent.js +60 -0
  56. package/dist/nodes/filter-agent.js.map +1 -0
  57. package/dist/nodes/filter-node.d.ts +9 -0
  58. package/dist/nodes/filter-node.d.ts.map +1 -0
  59. package/dist/nodes/filter-node.js +111 -0
  60. package/dist/nodes/filter-node.js.map +1 -0
  61. package/dist/nodes/filters.d.ts +13 -0
  62. package/dist/nodes/filters.d.ts.map +1 -0
  63. package/dist/nodes/filters.js +111 -0
  64. package/dist/nodes/filters.js.map +1 -0
  65. package/dist/nodes/message-node.d.ts +71 -0
  66. package/dist/nodes/message-node.d.ts.map +1 -0
  67. package/dist/nodes/message-node.js +491 -0
  68. package/dist/nodes/message-node.js.map +1 -0
  69. package/dist/nodes/message.d.ts +71 -0
  70. package/dist/nodes/message.d.ts.map +1 -0
  71. package/dist/nodes/message.js +496 -0
  72. package/dist/nodes/message.js.map +1 -0
  73. package/dist/nodes/vote-node.d.ts +13 -0
  74. package/dist/nodes/vote-node.d.ts.map +1 -0
  75. package/dist/nodes/vote-node.js +232 -0
  76. package/dist/nodes/vote-node.js.map +1 -0
  77. package/dist/nodes/vote.d.ts +13 -0
  78. package/dist/nodes/vote.d.ts.map +1 -0
  79. package/dist/nodes/vote.js +232 -0
  80. package/dist/nodes/vote.js.map +1 -0
  81. package/dist/queue.d.ts +15 -0
  82. package/dist/queue.d.ts.map +1 -0
  83. package/dist/queue.js +41 -0
  84. package/dist/queue.js.map +1 -0
  85. package/dist/redis.d.ts +8 -0
  86. package/dist/redis.d.ts.map +1 -0
  87. package/dist/redis.js +33 -0
  88. package/dist/redis.js.map +1 -0
  89. package/dist/runtime/auth.d.ts +11 -0
  90. package/dist/runtime/auth.d.ts.map +1 -0
  91. package/dist/runtime/auth.js +54 -0
  92. package/dist/runtime/auth.js.map +1 -0
  93. package/dist/runtime/dry-run.d.ts +12 -0
  94. package/dist/runtime/dry-run.d.ts.map +1 -0
  95. package/dist/runtime/dry-run.js +236 -0
  96. package/dist/runtime/dry-run.js.map +1 -0
  97. package/dist/runtime/queue.d.ts +15 -0
  98. package/dist/runtime/queue.d.ts.map +1 -0
  99. package/dist/runtime/queue.js +41 -0
  100. package/dist/runtime/queue.js.map +1 -0
  101. package/dist/runtime/redis.d.ts +8 -0
  102. package/dist/runtime/redis.d.ts.map +1 -0
  103. package/dist/runtime/redis.js +33 -0
  104. package/dist/runtime/redis.js.map +1 -0
  105. package/dist/runtime/worker.d.ts +14 -0
  106. package/dist/runtime/worker.d.ts.map +1 -0
  107. package/dist/runtime/worker.js +135 -0
  108. package/dist/runtime/worker.js.map +1 -0
  109. package/dist/tools/alert-history.d.ts +18 -0
  110. package/dist/tools/alert-history.d.ts.map +1 -0
  111. package/dist/tools/alert-history.js +98 -0
  112. package/dist/tools/alert-history.js.map +1 -0
  113. package/dist/tools/betterstack-log.d.ts +15 -0
  114. package/dist/tools/betterstack-log.d.ts.map +1 -0
  115. package/dist/tools/betterstack-log.js +80 -0
  116. package/dist/tools/betterstack-log.js.map +1 -0
  117. package/dist/tools/index.d.ts +44 -0
  118. package/dist/tools/index.d.ts.map +1 -0
  119. package/dist/tools/index.js +20 -0
  120. package/dist/tools/index.js.map +1 -0
  121. package/dist/tools/read-sources.d.ts +15 -0
  122. package/dist/tools/read-sources.d.ts.map +1 -0
  123. package/dist/tools/read-sources.js +67 -0
  124. package/dist/tools/read-sources.js.map +1 -0
  125. package/dist/tools/resolve-area.d.ts +19 -0
  126. package/dist/tools/resolve-area.d.ts.map +1 -0
  127. package/dist/tools/resolve-area.js +147 -0
  128. package/dist/tools/resolve-area.js.map +1 -0
  129. package/dist/tools.d.ts +115 -0
  130. package/dist/tools.d.ts.map +1 -0
  131. package/dist/tools.js +439 -0
  132. package/dist/tools.js.map +1 -0
  133. package/dist/worker.d.ts +14 -0
  134. package/dist/worker.d.ts.map +1 -0
  135. package/dist/worker.js +135 -0
  136. package/dist/worker.js.map +1 -0
  137. package/package.json +26 -0
  138. package/src/graph.ts +200 -0
  139. package/src/index.ts +27 -0
  140. package/src/models.ts +20 -0
  141. package/src/nodes/clarify-node.ts +172 -0
  142. package/src/nodes/edit-node.ts +695 -0
  143. package/src/nodes/extract-node.ts +299 -0
  144. package/src/nodes/filter-node.ts +139 -0
  145. package/src/nodes/message.ts +695 -0
  146. package/src/nodes/vote-node.ts +354 -0
  147. package/src/nodes/vote.ts +354 -0
  148. package/src/runtime/auth.ts +63 -0
  149. package/src/runtime/dry-run.ts +303 -0
  150. package/src/runtime/queue.ts +53 -0
  151. package/src/runtime/redis.ts +38 -0
  152. package/src/runtime/worker.ts +167 -0
  153. package/src/tools/alert-history.ts +120 -0
  154. package/src/tools/betterstack-log.ts +102 -0
  155. package/src/tools/index.ts +23 -0
  156. package/src/tools/read-sources.ts +86 -0
  157. package/src/tools/resolve-area.ts +202 -0
  158. package/tsconfig.json +14 -0
@@ -0,0 +1,491 @@
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 * as logger from "@easyoref/monitoring";
8
+ import { config, createEmptyEnrichmentData, EnrichmentDataSchema, getActiveSession, saveEnrichmentData, setActiveSession, textHash, toIsraelTime, } from "@easyoref/shared";
9
+ import { Bot } from "grammy";
10
+ // ── Country translations ───────────────────────────────
11
+ /** EN country name → Russian */
12
+ export const COUNTRY_RU = {
13
+ Iran: "Иран",
14
+ Yemen: "Йемен",
15
+ Lebanon: "Ливан",
16
+ Gaza: "Газа",
17
+ Iraq: "Ирак",
18
+ Syria: "Сирия",
19
+ Hezbollah: "Хезболла",
20
+ };
21
+ // ── Citation helpers ───────────────────────────────────
22
+ /** Format inline citations: [[1]](url), [[2]](url) */
23
+ export function inlineCites(indices, citedSources) {
24
+ const parts = [];
25
+ for (const idx of indices) {
26
+ const src = citedSources.find((s) => s.index === idx);
27
+ if (src?.messageUrl) {
28
+ parts.push(`<a href="${src.messageUrl}">[${idx}]</a>`);
29
+ }
30
+ }
31
+ return parts.length > 0 ? " " + parts.join(", ") : "";
32
+ }
33
+ /** Get InlineCite[] from citation indices */
34
+ export function extractCites(indices, citedSources) {
35
+ const cites = [];
36
+ for (const idx of indices) {
37
+ const src = citedSources.find((s) => s.index === idx);
38
+ if (src?.messageUrl) {
39
+ cites.push({ url: src.messageUrl, channel: src.channel });
40
+ }
41
+ }
42
+ return cites;
43
+ }
44
+ /** Format inline citations from InlineCite[] (carry-forward data) */
45
+ export function inlineCitesFromData(cites) {
46
+ if (cites.length === 0)
47
+ return "";
48
+ return (" " + cites.map((c, i) => `<a href="${c.url}">[${i + 1}]</a>`).join(", "));
49
+ }
50
+ /**
51
+ * Build a global URL→index map across ALL enrichment fields.
52
+ * Deduplicates by URL so the same source gets the same [N] everywhere.
53
+ */
54
+ export function buildGlobalCiteMap(enrichment) {
55
+ // Order matches visual render order in buildEnrichedMessage:
56
+ // ETA (inline replacement first), then appended fields top-to-bottom.
57
+ const allCites = [
58
+ ...enrichment.etaCites,
59
+ ...enrichment.originCites,
60
+ ...enrichment.rocketCites,
61
+ ...enrichment.interceptedCites,
62
+ ...enrichment.hitsCites,
63
+ ...enrichment.noImpactsCites,
64
+ ...enrichment.casualtiesCites,
65
+ ...enrichment.injuriesCites,
66
+ ];
67
+ const map = new Map();
68
+ let idx = 1;
69
+ for (const cite of allCites) {
70
+ if (!map.has(cite.url)) {
71
+ map.set(cite.url, idx++);
72
+ }
73
+ }
74
+ return map;
75
+ }
76
+ /** Format inline citations using global numbering */
77
+ export function renderCitesGlobal(cites, globalMap) {
78
+ if (cites.length === 0)
79
+ return "";
80
+ const parts = [];
81
+ for (const c of cites) {
82
+ const i = globalMap.get(c.url);
83
+ if (i) {
84
+ parts.push(`<a href="${c.url}">[${i}]</a>`);
85
+ }
86
+ }
87
+ return parts.length > 0 ? " " + parts.join(", ") : "";
88
+ }
89
+ // ── Confidence thresholds ──────────────────────────────
90
+ export const SKIP = 0.6;
91
+ export const UNCERTAIN = 0.75;
92
+ export const CERTAIN = 0.95;
93
+ // ── Monitoring indicator ───────────────────────────────
94
+ /** Strip custom-emoji monitoring line from message text */
95
+ export const MONITORING_RE = /\n?<tg-emoji emoji-id="\d+">⏳<\/tg-emoji>\s*[^\n]+$/;
96
+ export function stripMonitoring(text) {
97
+ return text.replace(MONITORING_RE, "");
98
+ }
99
+ export function appendMonitoring(text, label) {
100
+ return text + "\n" + label;
101
+ }
102
+ // ── Display helpers ────────────────────────────────────
103
+ function qualDisplay(qual, conf) {
104
+ if (qual === undefined)
105
+ return undefined;
106
+ if (qual.type === "none")
107
+ return conf >= CERTAIN ? "нет" : undefined;
108
+ const map = {
109
+ all: "все",
110
+ most: "большинство",
111
+ many: "много",
112
+ few: "несколько",
113
+ exists: "есть",
114
+ none: "нет",
115
+ };
116
+ if (qual.type === "more_than")
117
+ return `>${qual.value}`;
118
+ if (qual.type === "less_than")
119
+ return `<${qual.value}`;
120
+ return map[qual.type];
121
+ }
122
+ // ── Build enrichment data from vote ────────────────────
123
+ /**
124
+ * Build enrichment data from current vote + previous enrichment (carry-forward).
125
+ * Returns updated EnrichmentData for Redis persistence.
126
+ */
127
+ export function buildEnrichmentFromVote(r, prev, alertType, alertTs) {
128
+ const data = { ...prev };
129
+ // Origin
130
+ if (r.country_origins && r.country_origins.length > 0) {
131
+ data.origin = r.country_origins
132
+ .map((c) => COUNTRY_RU[c.name] ?? c.name)
133
+ .join(" + ");
134
+ data.originCites = r.country_origins.flatMap((c) => extractCites(c.citations, r.citedSources));
135
+ }
136
+ // ETA — only for early_warning/siren
137
+ if (r.eta_refined_minutes &&
138
+ (alertType === "early_warning" || alertType === "siren")) {
139
+ const absTime = new Date(alertTs + r.eta_refined_minutes * 60_000).toLocaleTimeString("he-IL", {
140
+ hour: "2-digit",
141
+ minute: "2-digit",
142
+ timeZone: "Asia/Jerusalem",
143
+ });
144
+ data.etaAbsolute = `~${absTime}`;
145
+ data.etaCites = extractCites(r.eta_citations, r.citedSources);
146
+ }
147
+ // Rocket count — show even at lower confidence (high-value intel)
148
+ // >= 0.55: show with (?); >= UNCERTAIN (0.75): show without marker
149
+ if (r.rocket_count_min !== undefined &&
150
+ r.rocket_count_max !== undefined &&
151
+ r.rocket_confidence >= 0.55) {
152
+ const u = r.rocket_confidence < UNCERTAIN ? " (?)" : "";
153
+ data.rocketCount =
154
+ r.rocket_count_min === r.rocket_count_max
155
+ ? `${r.rocket_count_min}${u}`
156
+ : `~${r.rocket_count_min}–${r.rocket_count_max}${u}`;
157
+ data.rocketCites = extractCites(r.rocket_citations, r.citedSources);
158
+ }
159
+ // Cassette
160
+ if (r.is_cassette !== undefined && r.is_cassette_confidence >= SKIP) {
161
+ data.isCassette = r.is_cassette;
162
+ }
163
+ // Intercepted
164
+ if (r.intercepted !== undefined && r.intercepted_confidence >= SKIP) {
165
+ const u = r.intercepted_confidence < UNCERTAIN ? " (?)" : "";
166
+ data.intercepted = `${r.intercepted}${u}`;
167
+ data.interceptedCites = extractCites(r.intercepted_citations, r.citedSources);
168
+ }
169
+ else if (r.intercepted_qual && r.intercepted_confidence >= SKIP) {
170
+ const qs = qualDisplay(r.intercepted_qual, r.intercepted_confidence);
171
+ if (qs)
172
+ data.intercepted = qs;
173
+ }
174
+ // Hits
175
+ if (r.hits_confirmed && r.hits_confirmed > 0 && r.hits_confidence >= SKIP) {
176
+ const u = r.hits_confidence < UNCERTAIN ? " (?)" : "";
177
+ data.hitsConfirmed = `${r.hits_confirmed}${u}`;
178
+ data.hitsCites = extractCites(r.hits_citations, r.citedSources);
179
+ }
180
+ // No impacts: sources explicitly confirm zero hits
181
+ if (r.no_impacts && r.hits_confidence >= SKIP) {
182
+ data.noImpacts = true;
183
+ data.noImpactsCites = extractCites(r.no_impacts_citations, r.citedSources);
184
+ }
185
+ // Rocket detail (per-region breakdown)
186
+ if (r.rocket_detail) {
187
+ data.rocketDetail = r.rocket_detail;
188
+ }
189
+ // Hit location & type
190
+ if (r.hit_location && r.hits_confirmed && r.hits_confirmed > 0) {
191
+ data.hitLocation = r.hit_location;
192
+ }
193
+ if (r.hit_type && r.hits_confirmed && r.hits_confirmed > 0) {
194
+ data.hitType = r.hit_type;
195
+ }
196
+ if (r.hit_detail && r.hits_confirmed && r.hits_confirmed > 0) {
197
+ data.hitDetail = r.hit_detail;
198
+ }
199
+ // Casualties — CRITICAL: only report at near-certain confidence
200
+ // Requires explicit mention of killed/dead in source (נהרג/מת/killed/dead/убит/погиб)
201
+ if (r.casualties &&
202
+ r.casualties > 0 &&
203
+ r.casualties_confidence >= CERTAIN // 0.95 — never show unconfirmed deaths
204
+ ) {
205
+ // No uncertainty marker for deaths — either confirmed or not shown
206
+ data.casualties = `${r.casualties}`;
207
+ data.casualtiesCites = extractCites(r.casualties_citations, r.citedSources);
208
+ }
209
+ // Injuries — show only if confidence >= UNCERTAIN (not SKIP)
210
+ // Retractions: if new vote has injuries=0 and confidence >= UNCERTAIN, clear previous data
211
+ if (r.injuries && r.injuries > 0 && r.injuries_confidence >= UNCERTAIN) {
212
+ const u = r.injuries_confidence < CERTAIN ? " (?)" : "";
213
+ const causeSuffix = r.injuries_cause === "rushing_to_shelter"
214
+ ? " (по дороге в укрытие)"
215
+ : r.injuries_cause === "rocket"
216
+ ? " (от ракеты)"
217
+ : "";
218
+ data.injuries = `${r.injuries}${u}${causeSuffix}`;
219
+ data.injuriesCause = r.injuries_cause;
220
+ data.injuriesCites = extractCites(r.injuries_citations, r.citedSources);
221
+ }
222
+ else if (r.injuries &&
223
+ r.injuries === 0 &&
224
+ r.injuries_confidence >= UNCERTAIN &&
225
+ prev.injuries) {
226
+ // Explicit retraction: source says "no injured" — clear previous report
227
+ data.injuries = undefined;
228
+ data.injuriesCause = undefined;
229
+ data.injuriesCites = [];
230
+ }
231
+ // Early warning time
232
+ if (alertType === "early_warning" && !data.earlyWarningTime) {
233
+ data.earlyWarningTime = toIsraelTime(alertTs);
234
+ }
235
+ return data;
236
+ }
237
+ // ── Build enriched message text ────────────────────────
238
+ /**
239
+ * Build the enriched message text from current message + enrichment data.
240
+ * Uses inline [[1]](url) citations.
241
+ */
242
+ export function buildEnrichedMessage(currentText, alertType, alertTs, enrichment, monitoringLabel) {
243
+ // Strip monitoring indicator before building — will re-add at the end
244
+ let text = stripMonitoring(currentText);
245
+ // ── Global citation map ──
246
+ const citeMap = buildGlobalCiteMap(enrichment);
247
+ // ── Refine ETA in-place ──
248
+ if (enrichment.etaAbsolute &&
249
+ (alertType === "early_warning" || alertType === "siren")) {
250
+ const etaCiteStr = renderCitesGlobal(enrichment.etaCites, citeMap);
251
+ const refined = `${enrichment.etaAbsolute}${etaCiteStr}`;
252
+ const etaPatterns = [
253
+ /~\d+[–-]\d+\s*мин/,
254
+ /~\d+[–-]\d+\s*min/,
255
+ /~\d+[–-]\d+\s*דקות/,
256
+ /~\d+[–-]\d+\s*دقيقة/,
257
+ /1\.5\s*мин/,
258
+ /1\.5\s*min/,
259
+ /1\.5\s*דקות/,
260
+ /1\.5\s*دقيقة/,
261
+ ];
262
+ for (const pattern of etaPatterns) {
263
+ if (pattern.test(text)) {
264
+ text = text.replace(pattern, refined);
265
+ break;
266
+ }
267
+ }
268
+ }
269
+ // ── Origin ──
270
+ if (enrichment.origin) {
271
+ const citeStr = renderCitesGlobal(enrichment.originCites, citeMap);
272
+ text = insertBeforeBlockEnd(text, `<b>Откуда:</b> ${enrichment.origin}${citeStr}`);
273
+ }
274
+ // ── Rocket count (separate line, no compound breakdown) ──
275
+ if (enrichment.rocketCount) {
276
+ const citeStr = renderCitesGlobal(enrichment.rocketCites, citeMap);
277
+ const cassette = enrichment.isCassette ? ", кассетные" : "";
278
+ const detail = enrichment.rocketDetail
279
+ ? ` (${enrichment.rocketDetail})`
280
+ : "";
281
+ text = insertBeforeBlockEnd(text, `<b>Ракет:</b> ${enrichment.rocketCount}${detail}${cassette}${citeStr}`);
282
+ }
283
+ // ── Intercepted (own line) ──
284
+ if (enrichment.intercepted && alertType !== "early_warning") {
285
+ const citeStr = renderCitesGlobal(enrichment.interceptedCites, citeMap);
286
+ text = insertBeforeBlockEnd(text, `<b>Перехваты:</b> ${enrichment.intercepted}${citeStr}`);
287
+ }
288
+ // ── Hits / No impacts (own line) ──
289
+ if (enrichment.hitsConfirmed && alertType !== "early_warning") {
290
+ const citeStr = renderCitesGlobal(enrichment.hitsCites, citeMap);
291
+ const HIT_TYPE_DISPLAY = {
292
+ direct: "прямое",
293
+ shrapnel: "обломки",
294
+ };
295
+ const qualifiers = [];
296
+ if (enrichment.hitLocation)
297
+ qualifiers.push(enrichment.hitLocation);
298
+ if (enrichment.hitDetail)
299
+ qualifiers.push(enrichment.hitDetail);
300
+ if (enrichment.hitType)
301
+ qualifiers.push(HIT_TYPE_DISPLAY[enrichment.hitType] ?? enrichment.hitType);
302
+ const suffix = qualifiers.length > 0 ? ` (${qualifiers.join(", ")})` : "";
303
+ text = insertBeforeBlockEnd(text, `<b>Попадания:</b> ${enrichment.hitsConfirmed}${suffix}${citeStr}`);
304
+ }
305
+ else if (enrichment.noImpacts && alertType !== "early_warning") {
306
+ const citeStr = renderCitesGlobal(enrichment.noImpactsCites, citeMap);
307
+ text = insertBeforeBlockEnd(text, `<b>Прилетов:</b> нет${citeStr}`);
308
+ }
309
+ // ── Casualties / Injuries (resolved only) ──
310
+ if (enrichment.casualties && alertType === "resolved") {
311
+ const citeStr = renderCitesGlobal(enrichment.casualtiesCites, citeMap);
312
+ text = insertBeforeBlockEnd(text, `<b>Погибшие:</b> ${enrichment.casualties}${citeStr}`);
313
+ }
314
+ if (enrichment.injuries && alertType === "resolved") {
315
+ const citeStr = renderCitesGlobal(enrichment.injuriesCites, citeMap);
316
+ const causeLabel = enrichment.injuriesCause === "rushing_to_shelter"
317
+ ? " (на пути в укрытие)"
318
+ : enrichment.injuriesCause === "rocket"
319
+ ? " (от ракеты)"
320
+ : "";
321
+ text = insertBeforeBlockEnd(text, `<b>Пострадавшие:</b> ${enrichment.injuries}${causeLabel}${citeStr}`);
322
+ }
323
+ // Re-add monitoring indicator if still in active phase
324
+ if (monitoringLabel && alertType !== "resolved") {
325
+ text = appendMonitoring(text, monitoringLabel);
326
+ }
327
+ return text;
328
+ }
329
+ /**
330
+ * Insert a line before </blockquote> (or legacy time line as fallback).
331
+ */
332
+ export function insertBeforeBlockEnd(text, line) {
333
+ const bqIdx = text.lastIndexOf("</blockquote>");
334
+ if (bqIdx !== -1) {
335
+ return text.slice(0, bqIdx) + line + "\n" + text.slice(bqIdx);
336
+ }
337
+ // Legacy fallback: insert before time line
338
+ const timePattern = /(<b>(?:Время оповещения|Alert time|שעת ההתרעה|وقت الإنذار):<\/b>)/;
339
+ const match = text.match(timePattern);
340
+ if (match?.index) {
341
+ return text.slice(0, match.index) + line + "\n" + text.slice(match.index);
342
+ }
343
+ const lines = text.split("\n");
344
+ lines.splice(Math.max(lines.length - 1, 0), 0, line);
345
+ return lines.join("\n");
346
+ }
347
+ /** @deprecated Use insertBeforeBlockEnd */
348
+ export const insertBeforeTimeLine = insertBeforeBlockEnd;
349
+ /**
350
+ * Edit the Telegram message with enriched data.
351
+ */
352
+ export const editTelegramMessage = async (input) => {
353
+ if (!config.botToken)
354
+ return;
355
+ const tgBot = new Bot(config.botToken);
356
+ const prev = input.previousEnrichment ?? createEmptyEnrichmentData();
357
+ // Resolve targets: multi-chat or single fallback
358
+ const targets = input.telegramMessages ?? [
359
+ {
360
+ chatId: input.chatId,
361
+ messageId: input.messageId,
362
+ isCaption: input.isCaption,
363
+ },
364
+ ];
365
+ if (!input.votedResult) {
366
+ // No new data — try carry-forward only
367
+ if (prev.origin || prev.intercepted) {
368
+ const newText = buildEnrichedMessage(input.currentText, input.alertType, input.alertTs, prev, input.monitoringLabel);
369
+ const hash = textHash(newText);
370
+ if (hash === prev.lastEditHash) {
371
+ logger.info("Agent: no change (dedup)", { alertId: input.alertId });
372
+ return;
373
+ }
374
+ for (const t of targets) {
375
+ try {
376
+ if (t.isCaption) {
377
+ await tgBot.api.editMessageCaption(t.chatId, t.messageId, {
378
+ caption: newText,
379
+ parse_mode: "HTML",
380
+ });
381
+ }
382
+ else {
383
+ await tgBot.api.editMessageText(t.chatId, t.messageId, newText, {
384
+ parse_mode: "HTML",
385
+ });
386
+ }
387
+ }
388
+ catch (err) {
389
+ const errStr = String(err);
390
+ if (!errStr.includes("message is not modified")) {
391
+ logger.error("Agent: edit failed", {
392
+ alertId: input.alertId,
393
+ chatId: t.chatId,
394
+ error: errStr,
395
+ });
396
+ }
397
+ }
398
+ }
399
+ prev.lastEditHash = hash;
400
+ await saveEnrichmentData(prev);
401
+ // Keep session.currentText in sync for monitoring removal
402
+ const sess = await getActiveSession();
403
+ if (sess) {
404
+ sess.currentText = newText;
405
+ await setActiveSession(sess);
406
+ }
407
+ logger.info("Agent: enriched (carry-forward)", {
408
+ alertId: input.alertId,
409
+ });
410
+ }
411
+ else {
412
+ logger.info("Agent: no voted result — skipping", {
413
+ alertId: input.alertId,
414
+ });
415
+ }
416
+ return;
417
+ }
418
+ // Build enrichment data: merge vote + previous
419
+ const enrichment = buildEnrichmentFromVote(input.votedResult, prev, input.alertType, input.alertTs);
420
+ const newText = buildEnrichedMessage(input.currentText, input.alertType, input.alertTs, enrichment, input.monitoringLabel);
421
+ // Dedup: skip if text hasn't changed
422
+ const hash = textHash(newText);
423
+ if (hash === enrichment.lastEditHash) {
424
+ logger.info("Agent: no change (dedup)", { alertId: input.alertId });
425
+ return;
426
+ }
427
+ if (input.votedResult.confidence < config.agent.confidenceThreshold) {
428
+ logger.info("Agent: low confidence — editing with (?) markers", {
429
+ alertId: input.alertId,
430
+ confidence: input.votedResult.confidence,
431
+ });
432
+ }
433
+ for (const t of targets) {
434
+ try {
435
+ if (t.isCaption) {
436
+ await tgBot.api.editMessageCaption(t.chatId, t.messageId, {
437
+ caption: newText,
438
+ parse_mode: "HTML",
439
+ });
440
+ }
441
+ else {
442
+ await tgBot.api.editMessageText(t.chatId, t.messageId, newText, {
443
+ parse_mode: "HTML",
444
+ });
445
+ }
446
+ }
447
+ catch (err) {
448
+ const errStr = String(err);
449
+ if (!errStr.includes("message is not modified")) {
450
+ logger.error("Agent: edit failed", {
451
+ alertId: input.alertId,
452
+ chatId: t.chatId,
453
+ error: errStr,
454
+ });
455
+ }
456
+ }
457
+ }
458
+ enrichment.lastEditHash = hash;
459
+ await saveEnrichmentData(enrichment);
460
+ // Keep session.currentText in sync for monitoring removal
461
+ const sess = await getActiveSession();
462
+ if (sess) {
463
+ sess.currentText = newText;
464
+ await setActiveSession(sess);
465
+ }
466
+ logger.info("Agent: enriched", {
467
+ alertId: input.alertId,
468
+ targets: targets.length,
469
+ confidence: input.votedResult.confidence,
470
+ sources: input.votedResult.sources_count,
471
+ phase: input.alertType,
472
+ });
473
+ };
474
+ export const editMessage = editTelegramMessage;
475
+ export const editNode = async (state) => {
476
+ await editTelegramMessage({
477
+ alertId: state.alertId,
478
+ alertTs: state.alertTs,
479
+ alertType: state.alertType,
480
+ chatId: state.chatId,
481
+ messageId: state.messageId,
482
+ isCaption: state.isCaption,
483
+ telegramMessages: state.telegramMessages,
484
+ currentText: state.currentText,
485
+ votedResult: state.votedResult,
486
+ previousEnrichment: state.previousEnrichment ?? EnrichmentDataSchema.parse({}),
487
+ monitoringLabel: state.monitoringLabel,
488
+ });
489
+ return {};
490
+ };
491
+ //# sourceMappingURL=message-node.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"message-node.js","sourceRoot":"","sources":["../../src/nodes/message-node.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,MAAM,MAAM,sBAAsB,CAAC;AAS/C,OAAO,EACL,MAAM,EACN,yBAAyB,EACzB,oBAAoB,EACpB,gBAAgB,EAChB,kBAAkB,EAClB,gBAAgB,EAChB,QAAQ,EACR,YAAY,GACb,MAAM,kBAAkB,CAAC;AAC1B,OAAO,EAAE,GAAG,EAAE,MAAM,QAAQ,CAAC;AAE7B,0DAA0D;AAE1D,gCAAgC;AAChC,MAAM,CAAC,MAAM,UAAU,GAA2B;IAChD,IAAI,EAAE,MAAM;IACZ,KAAK,EAAE,OAAO;IACd,OAAO,EAAE,OAAO;IAChB,IAAI,EAAE,MAAM;IACZ,IAAI,EAAE,MAAM;IACZ,KAAK,EAAE,OAAO;IACd,SAAS,EAAE,UAAU;CACtB,CAAC;AAEF,0DAA0D;AAE1D,sDAAsD;AACtD,MAAM,UAAU,WAAW,CACzB,OAAiB,EACjB,YAA2B;IAE3B,MAAM,KAAK,GAAa,EAAE,CAAC;IAC3B,KAAK,MAAM,GAAG,IAAI,OAAO,EAAE,CAAC;QAC1B,MAAM,GAAG,GAAG,YAAY,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,KAAK,KAAK,GAAG,CAAC,CAAC;QACtD,IAAI,GAAG,EAAE,UAAU,EAAE,CAAC;YACpB,KAAK,CAAC,IAAI,CAAC,YAAY,GAAG,CAAC,UAAU,MAAM,GAAG,OAAO,CAAC,CAAC;QACzD,CAAC;IACH,CAAC;IACD,OAAO,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,GAAG,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;AACxD,CAAC;AAED,6CAA6C;AAC7C,MAAM,UAAU,YAAY,CAC1B,OAAiB,EACjB,YAA2B;IAE3B,MAAM,KAAK,GAAiB,EAAE,CAAC;IAC/B,KAAK,MAAM,GAAG,IAAI,OAAO,EAAE,CAAC;QAC1B,MAAM,GAAG,GAAG,YAAY,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,KAAK,KAAK,GAAG,CAAC,CAAC;QACtD,IAAI,GAAG,EAAE,UAAU,EAAE,CAAC;YACpB,KAAK,CAAC,IAAI,CAAC,EAAE,GAAG,EAAE,GAAG,CAAC,UAAU,EAAE,OAAO,EAAE,GAAG,CAAC,OAAO,EAAE,CAAC,CAAC;QAC5D,CAAC;IACH,CAAC;IACD,OAAO,KAAK,CAAC;AACf,CAAC;AAED,qEAAqE;AACrE,MAAM,UAAU,mBAAmB,CAAC,KAAmB;IACrD,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,EAAE,CAAC;IAClC,OAAO,CACL,GAAG,GAAG,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,YAAY,CAAC,CAAC,GAAG,MAAM,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAC1E,CAAC;AACJ,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,kBAAkB,CAChC,UAA0B;IAE1B,6DAA6D;IAC7D,sEAAsE;IACtE,MAAM,QAAQ,GAAiB;QAC7B,GAAG,UAAU,CAAC,QAAQ;QACtB,GAAG,UAAU,CAAC,WAAW;QACzB,GAAG,UAAU,CAAC,WAAW;QACzB,GAAG,UAAU,CAAC,gBAAgB;QAC9B,GAAG,UAAU,CAAC,SAAS;QACvB,GAAG,UAAU,CAAC,cAAc;QAC5B,GAAG,UAAU,CAAC,eAAe;QAC7B,GAAG,UAAU,CAAC,aAAa;KAC5B,CAAC;IACF,MAAM,GAAG,GAAG,IAAI,GAAG,EAAkB,CAAC;IACtC,IAAI,GAAG,GAAG,CAAC,CAAC;IACZ,KAAK,MAAM,IAAI,IAAI,QAAQ,EAAE,CAAC;QAC5B,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC;YACvB,GAAG,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,EAAE,CAAC,CAAC;QAC3B,CAAC;IACH,CAAC;IACD,OAAO,GAAG,CAAC;AACb,CAAC;AAED,qDAAqD;AACrD,MAAM,UAAU,iBAAiB,CAC/B,KAAmB,EACnB,SAA8B;IAE9B,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,EAAE,CAAC;IAClC,MAAM,KAAK,GAAa,EAAE,CAAC;IAC3B,KAAK,MAAM,CAAC,IAAI,KAAK,EAAE,CAAC;QACtB,MAAM,CAAC,GAAG,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC;QAC/B,IAAI,CAAC,EAAE,CAAC;YACN,KAAK,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC,GAAG,MAAM,CAAC,OAAO,CAAC,CAAC;QAC9C,CAAC;IACH,CAAC;IACD,OAAO,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,GAAG,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;AACxD,CAAC;AAED,0DAA0D;AAE1D,MAAM,CAAC,MAAM,IAAI,GAAG,GAAG,CAAC;AACxB,MAAM,CAAC,MAAM,SAAS,GAAG,IAAI,CAAC;AAC9B,MAAM,CAAC,MAAM,OAAO,GAAG,IAAI,CAAC;AAE5B,0DAA0D;AAE1D,2DAA2D;AAC3D,MAAM,CAAC,MAAM,aAAa,GACxB,qDAAqD,CAAC;AAExD,MAAM,UAAU,eAAe,CAAC,IAAY;IAC1C,OAAO,IAAI,CAAC,OAAO,CAAC,aAAa,EAAE,EAAE,CAAC,CAAC;AACzC,CAAC;AAED,MAAM,UAAU,gBAAgB,CAAC,IAAY,EAAE,KAAa;IAC1D,OAAO,IAAI,GAAG,IAAI,GAAG,KAAK,CAAC;AAC7B,CAAC;AAED,0DAA0D;AAE1D,SAAS,WAAW,CAClB,IAA2B,EAC3B,IAAY;IAEZ,IAAI,IAAI,KAAK,SAAS;QAAE,OAAO,SAAS,CAAC;IACzC,IAAI,IAAI,CAAC,IAAI,KAAK,MAAM;QAAE,OAAO,IAAI,IAAI,OAAO,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,SAAS,CAAC;IACrE,MAAM,GAAG,GAA2B;QAClC,GAAG,EAAE,KAAK;QACV,IAAI,EAAE,aAAa;QACnB,IAAI,EAAE,OAAO;QACb,GAAG,EAAE,WAAW;QAChB,MAAM,EAAE,MAAM;QACd,IAAI,EAAE,KAAK;KACZ,CAAC;IACF,IAAI,IAAI,CAAC,IAAI,KAAK,WAAW;QAAE,OAAO,IAAI,IAAI,CAAC,KAAK,EAAE,CAAC;IACvD,IAAI,IAAI,CAAC,IAAI,KAAK,WAAW;QAAE,OAAO,IAAI,IAAI,CAAC,KAAK,EAAE,CAAC;IACvD,OAAO,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AACxB,CAAC;AAED,0DAA0D;AAE1D;;;GAGG;AACH,MAAM,UAAU,uBAAuB,CACrC,CAAc,EACd,IAAoB,EACpB,SAAoB,EACpB,OAAe;IAEf,MAAM,IAAI,GAAmB,EAAE,GAAG,IAAI,EAAE,CAAC;IAEzC,SAAS;IACT,IAAI,CAAC,CAAC,eAAe,IAAI,CAAC,CAAC,eAAe,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACtD,IAAI,CAAC,MAAM,GAAG,CAAC,CAAC,eAAe;aAC5B,GAAG,CAAC,CAAC,CAAmB,EAAE,EAAE,CAAC,UAAU,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC;aAC1D,IAAI,CAAC,KAAK,CAAC,CAAC;QACf,IAAI,CAAC,WAAW,GAAG,CAAC,CAAC,eAAe,CAAC,OAAO,CAAC,CAAC,CAA0B,EAAE,EAAE,CAC1E,YAAY,CAAC,CAAC,CAAC,SAAS,EAAE,CAAC,CAAC,YAAY,CAAC,CAC1C,CAAC;IACJ,CAAC;IAED,qCAAqC;IACrC,IACE,CAAC,CAAC,mBAAmB;QACrB,CAAC,SAAS,KAAK,eAAe,IAAI,SAAS,KAAK,OAAO,CAAC,EACxD,CAAC;QACD,MAAM,OAAO,GAAG,IAAI,IAAI,CACtB,OAAO,GAAG,CAAC,CAAC,mBAAmB,GAAG,MAAM,CACzC,CAAC,kBAAkB,CAAC,OAAO,EAAE;YAC5B,IAAI,EAAE,SAAS;YACf,MAAM,EAAE,SAAS;YACjB,QAAQ,EAAE,gBAAgB;SAC3B,CAAC,CAAC;QACH,IAAI,CAAC,WAAW,GAAG,IAAI,OAAO,EAAE,CAAC;QACjC,IAAI,CAAC,QAAQ,GAAG,YAAY,CAAC,CAAC,CAAC,aAAa,EAAE,CAAC,CAAC,YAAY,CAAC,CAAC;IAChE,CAAC;IAED,kEAAkE;IAClE,mEAAmE;IACnE,IACE,CAAC,CAAC,gBAAgB,KAAK,SAAS;QAChC,CAAC,CAAC,gBAAgB,KAAK,SAAS;QAChC,CAAC,CAAC,iBAAiB,IAAI,IAAI,EAC3B,CAAC;QACD,MAAM,CAAC,GAAG,CAAC,CAAC,iBAAiB,GAAG,SAAS,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC;QACxD,IAAI,CAAC,WAAW;YACd,CAAC,CAAC,gBAAgB,KAAK,CAAC,CAAC,gBAAgB;gBACvC,CAAC,CAAC,GAAG,CAAC,CAAC,gBAAgB,GAAG,CAAC,EAAE;gBAC7B,CAAC,CAAC,IAAI,CAAC,CAAC,gBAAgB,IAAI,CAAC,CAAC,gBAAgB,GAAG,CAAC,EAAE,CAAC;QACzD,IAAI,CAAC,WAAW,GAAG,YAAY,CAAC,CAAC,CAAC,gBAAgB,EAAE,CAAC,CAAC,YAAY,CAAC,CAAC;IACtE,CAAC;IAED,WAAW;IACX,IAAI,CAAC,CAAC,WAAW,KAAK,SAAS,IAAI,CAAC,CAAC,sBAAsB,IAAI,IAAI,EAAE,CAAC;QACpE,IAAI,CAAC,UAAU,GAAG,CAAC,CAAC,WAAW,CAAC;IAClC,CAAC;IAED,cAAc;IACd,IAAI,CAAC,CAAC,WAAW,KAAK,SAAS,IAAI,CAAC,CAAC,sBAAsB,IAAI,IAAI,EAAE,CAAC;QACpE,MAAM,CAAC,GAAG,CAAC,CAAC,sBAAsB,GAAG,SAAS,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC;QAC7D,IAAI,CAAC,WAAW,GAAG,GAAG,CAAC,CAAC,WAAW,GAAG,CAAC,EAAE,CAAC;QAC1C,IAAI,CAAC,gBAAgB,GAAG,YAAY,CAClC,CAAC,CAAC,qBAAqB,EACvB,CAAC,CAAC,YAAY,CACf,CAAC;IACJ,CAAC;SAAM,IAAI,CAAC,CAAC,gBAAgB,IAAI,CAAC,CAAC,sBAAsB,IAAI,IAAI,EAAE,CAAC;QAClE,MAAM,EAAE,GAAG,WAAW,CAAC,CAAC,CAAC,gBAAgB,EAAE,CAAC,CAAC,sBAAsB,CAAC,CAAC;QACrE,IAAI,EAAE;YAAE,IAAI,CAAC,WAAW,GAAG,EAAE,CAAC;IAChC,CAAC;IAED,OAAO;IACP,IAAI,CAAC,CAAC,cAAc,IAAI,CAAC,CAAC,cAAc,GAAG,CAAC,IAAI,CAAC,CAAC,eAAe,IAAI,IAAI,EAAE,CAAC;QAC1E,MAAM,CAAC,GAAG,CAAC,CAAC,eAAe,GAAG,SAAS,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC;QACtD,IAAI,CAAC,aAAa,GAAG,GAAG,CAAC,CAAC,cAAc,GAAG,CAAC,EAAE,CAAC;QAC/C,IAAI,CAAC,SAAS,GAAG,YAAY,CAAC,CAAC,CAAC,cAAc,EAAE,CAAC,CAAC,YAAY,CAAC,CAAC;IAClE,CAAC;IAED,mDAAmD;IACnD,IAAI,CAAC,CAAC,UAAU,IAAI,CAAC,CAAC,eAAe,IAAI,IAAI,EAAE,CAAC;QAC9C,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC;QACtB,IAAI,CAAC,cAAc,GAAG,YAAY,CAAC,CAAC,CAAC,oBAAoB,EAAE,CAAC,CAAC,YAAY,CAAC,CAAC;IAC7E,CAAC;IAED,uCAAuC;IACvC,IAAI,CAAC,CAAC,aAAa,EAAE,CAAC;QACpB,IAAI,CAAC,YAAY,GAAG,CAAC,CAAC,aAAa,CAAC;IACtC,CAAC;IAED,sBAAsB;IACtB,IAAI,CAAC,CAAC,YAAY,IAAI,CAAC,CAAC,cAAc,IAAI,CAAC,CAAC,cAAc,GAAG,CAAC,EAAE,CAAC;QAC/D,IAAI,CAAC,WAAW,GAAG,CAAC,CAAC,YAAY,CAAC;IACpC,CAAC;IACD,IAAI,CAAC,CAAC,QAAQ,IAAI,CAAC,CAAC,cAAc,IAAI,CAAC,CAAC,cAAc,GAAG,CAAC,EAAE,CAAC;QAC3D,IAAI,CAAC,OAAO,GAAG,CAAC,CAAC,QAAQ,CAAC;IAC5B,CAAC;IACD,IAAI,CAAC,CAAC,UAAU,IAAI,CAAC,CAAC,cAAc,IAAI,CAAC,CAAC,cAAc,GAAG,CAAC,EAAE,CAAC;QAC7D,IAAI,CAAC,SAAS,GAAG,CAAC,CAAC,UAAU,CAAC;IAChC,CAAC;IAED,gEAAgE;IAChE,sFAAsF;IACtF,IACE,CAAC,CAAC,UAAU;QACZ,CAAC,CAAC,UAAU,GAAG,CAAC;QAChB,CAAC,CAAC,qBAAqB,IAAI,OAAO,CAAC,uCAAuC;MAC1E,CAAC;QACD,mEAAmE;QACnE,IAAI,CAAC,UAAU,GAAG,GAAG,CAAC,CAAC,UAAU,EAAE,CAAC;QACpC,IAAI,CAAC,eAAe,GAAG,YAAY,CAAC,CAAC,CAAC,oBAAoB,EAAE,CAAC,CAAC,YAAY,CAAC,CAAC;IAC9E,CAAC;IAED,6DAA6D;IAC7D,2FAA2F;IAC3F,IAAI,CAAC,CAAC,QAAQ,IAAI,CAAC,CAAC,QAAQ,GAAG,CAAC,IAAI,CAAC,CAAC,mBAAmB,IAAI,SAAS,EAAE,CAAC;QACvE,MAAM,CAAC,GAAG,CAAC,CAAC,mBAAmB,GAAG,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC;QACxD,MAAM,WAAW,GACf,CAAC,CAAC,cAAc,KAAK,oBAAoB;YACvC,CAAC,CAAC,wBAAwB;YAC1B,CAAC,CAAC,CAAC,CAAC,cAAc,KAAK,QAAQ;gBAC/B,CAAC,CAAC,cAAc;gBAChB,CAAC,CAAC,EAAE,CAAC;QACT,IAAI,CAAC,QAAQ,GAAG,GAAG,CAAC,CAAC,QAAQ,GAAG,CAAC,GAAG,WAAW,EAAE,CAAC;QAClD,IAAI,CAAC,aAAa,GAAG,CAAC,CAAC,cAAc,CAAC;QACtC,IAAI,CAAC,aAAa,GAAG,YAAY,CAAC,CAAC,CAAC,kBAAkB,EAAE,CAAC,CAAC,YAAY,CAAC,CAAC;IAC1E,CAAC;SAAM,IACL,CAAC,CAAC,QAAQ;QACV,CAAC,CAAC,QAAQ,KAAK,CAAC;QAChB,CAAC,CAAC,mBAAmB,IAAI,SAAS;QAClC,IAAI,CAAC,QAAQ,EACb,CAAC;QACD,wEAAwE;QACxE,IAAI,CAAC,QAAQ,GAAG,SAAS,CAAC;QAC1B,IAAI,CAAC,aAAa,GAAG,SAAS,CAAC;QAC/B,IAAI,CAAC,aAAa,GAAG,EAAE,CAAC;IAC1B,CAAC;IAED,qBAAqB;IACrB,IAAI,SAAS,KAAK,eAAe,IAAI,CAAC,IAAI,CAAC,gBAAgB,EAAE,CAAC;QAC5D,IAAI,CAAC,gBAAgB,GAAG,YAAY,CAAC,OAAO,CAAC,CAAC;IAChD,CAAC;IAED,OAAO,IAAI,CAAC;AACd,CAAC;AAED,0DAA0D;AAE1D;;;GAGG;AACH,MAAM,UAAU,oBAAoB,CAClC,WAAmB,EACnB,SAAoB,EACpB,OAAe,EACf,UAA0B,EAC1B,eAAwB;IAExB,sEAAsE;IACtE,IAAI,IAAI,GAAG,eAAe,CAAC,WAAW,CAAC,CAAC;IAExC,4BAA4B;IAC5B,MAAM,OAAO,GAAG,kBAAkB,CAAC,UAAU,CAAC,CAAC;IAE/C,4BAA4B;IAC5B,IACE,UAAU,CAAC,WAAW;QACtB,CAAC,SAAS,KAAK,eAAe,IAAI,SAAS,KAAK,OAAO,CAAC,EACxD,CAAC;QACD,MAAM,UAAU,GAAG,iBAAiB,CAAC,UAAU,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;QACnE,MAAM,OAAO,GAAG,GAAG,UAAU,CAAC,WAAW,GAAG,UAAU,EAAE,CAAC;QAEzD,MAAM,WAAW,GAAG;YAClB,mBAAmB;YACnB,mBAAmB;YACnB,oBAAoB;YACpB,qBAAqB;YACrB,YAAY;YACZ,YAAY;YACZ,aAAa;YACb,cAAc;SACf,CAAC;QAEF,KAAK,MAAM,OAAO,IAAI,WAAW,EAAE,CAAC;YAClC,IAAI,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;gBACvB,IAAI,GAAG,IAAI,CAAC,OAAO,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;gBACtC,MAAM;YACR,CAAC;QACH,CAAC;IACH,CAAC;IAED,eAAe;IACf,IAAI,UAAU,CAAC,MAAM,EAAE,CAAC;QACtB,MAAM,OAAO,GAAG,iBAAiB,CAAC,UAAU,CAAC,WAAW,EAAE,OAAO,CAAC,CAAC;QACnE,IAAI,GAAG,oBAAoB,CACzB,IAAI,EACJ,kBAAkB,UAAU,CAAC,MAAM,GAAG,OAAO,EAAE,CAChD,CAAC;IACJ,CAAC;IAED,4DAA4D;IAC5D,IAAI,UAAU,CAAC,WAAW,EAAE,CAAC;QAC3B,MAAM,OAAO,GAAG,iBAAiB,CAAC,UAAU,CAAC,WAAW,EAAE,OAAO,CAAC,CAAC;QACnE,MAAM,QAAQ,GAAG,UAAU,CAAC,UAAU,CAAC,CAAC,CAAC,aAAa,CAAC,CAAC,CAAC,EAAE,CAAC;QAC5D,MAAM,MAAM,GAAG,UAAU,CAAC,YAAY;YACpC,CAAC,CAAC,KAAK,UAAU,CAAC,YAAY,GAAG;YACjC,CAAC,CAAC,EAAE,CAAC;QACP,IAAI,GAAG,oBAAoB,CACzB,IAAI,EACJ,iBAAiB,UAAU,CAAC,WAAW,GAAG,MAAM,GAAG,QAAQ,GAAG,OAAO,EAAE,CACxE,CAAC;IACJ,CAAC;IAED,+BAA+B;IAC/B,IAAI,UAAU,CAAC,WAAW,IAAI,SAAS,KAAK,eAAe,EAAE,CAAC;QAC5D,MAAM,OAAO,GAAG,iBAAiB,CAAC,UAAU,CAAC,gBAAgB,EAAE,OAAO,CAAC,CAAC;QACxE,IAAI,GAAG,oBAAoB,CACzB,IAAI,EACJ,qBAAqB,UAAU,CAAC,WAAW,GAAG,OAAO,EAAE,CACxD,CAAC;IACJ,CAAC;IAED,qCAAqC;IACrC,IAAI,UAAU,CAAC,aAAa,IAAI,SAAS,KAAK,eAAe,EAAE,CAAC;QAC9D,MAAM,OAAO,GAAG,iBAAiB,CAAC,UAAU,CAAC,SAAS,EAAE,OAAO,CAAC,CAAC;QACjE,MAAM,gBAAgB,GAA2B;YAC/C,MAAM,EAAE,QAAQ;YAChB,QAAQ,EAAE,SAAS;SACpB,CAAC;QACF,MAAM,UAAU,GAAa,EAAE,CAAC;QAChC,IAAI,UAAU,CAAC,WAAW;YAAE,UAAU,CAAC,IAAI,CAAC,UAAU,CAAC,WAAW,CAAC,CAAC;QACpE,IAAI,UAAU,CAAC,SAAS;YAAE,UAAU,CAAC,IAAI,CAAC,UAAU,CAAC,SAAS,CAAC,CAAC;QAChE,IAAI,UAAU,CAAC,OAAO;YACpB,UAAU,CAAC,IAAI,CACb,gBAAgB,CAAC,UAAU,CAAC,OAAO,CAAC,IAAI,UAAU,CAAC,OAAO,CAC3D,CAAC;QACJ,MAAM,MAAM,GAAG,UAAU,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,KAAK,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC;QAC1E,IAAI,GAAG,oBAAoB,CACzB,IAAI,EACJ,qBAAqB,UAAU,CAAC,aAAa,GAAG,MAAM,GAAG,OAAO,EAAE,CACnE,CAAC;IACJ,CAAC;SAAM,IAAI,UAAU,CAAC,SAAS,IAAI,SAAS,KAAK,eAAe,EAAE,CAAC;QACjE,MAAM,OAAO,GAAG,iBAAiB,CAAC,UAAU,CAAC,cAAc,EAAE,OAAO,CAAC,CAAC;QACtE,IAAI,GAAG,oBAAoB,CAAC,IAAI,EAAE,uBAAuB,OAAO,EAAE,CAAC,CAAC;IACtE,CAAC;IAED,8CAA8C;IAC9C,IAAI,UAAU,CAAC,UAAU,IAAI,SAAS,KAAK,UAAU,EAAE,CAAC;QACtD,MAAM,OAAO,GAAG,iBAAiB,CAAC,UAAU,CAAC,eAAe,EAAE,OAAO,CAAC,CAAC;QACvE,IAAI,GAAG,oBAAoB,CACzB,IAAI,EACJ,oBAAoB,UAAU,CAAC,UAAU,GAAG,OAAO,EAAE,CACtD,CAAC;IACJ,CAAC;IACD,IAAI,UAAU,CAAC,QAAQ,IAAI,SAAS,KAAK,UAAU,EAAE,CAAC;QACpD,MAAM,OAAO,GAAG,iBAAiB,CAAC,UAAU,CAAC,aAAa,EAAE,OAAO,CAAC,CAAC;QACrE,MAAM,UAAU,GACd,UAAU,CAAC,aAAa,KAAK,oBAAoB;YAC/C,CAAC,CAAC,sBAAsB;YACxB,CAAC,CAAC,UAAU,CAAC,aAAa,KAAK,QAAQ;gBACvC,CAAC,CAAC,cAAc;gBAChB,CAAC,CAAC,EAAE,CAAC;QACT,IAAI,GAAG,oBAAoB,CACzB,IAAI,EACJ,wBAAwB,UAAU,CAAC,QAAQ,GAAG,UAAU,GAAG,OAAO,EAAE,CACrE,CAAC;IACJ,CAAC;IAED,uDAAuD;IACvD,IAAI,eAAe,IAAI,SAAS,KAAK,UAAU,EAAE,CAAC;QAChD,IAAI,GAAG,gBAAgB,CAAC,IAAI,EAAE,eAAe,CAAC,CAAC;IACjD,CAAC;IAED,OAAO,IAAI,CAAC;AACd,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,oBAAoB,CAAC,IAAY,EAAE,IAAY;IAC7D,MAAM,KAAK,GAAG,IAAI,CAAC,WAAW,CAAC,eAAe,CAAC,CAAC;IAChD,IAAI,KAAK,KAAK,CAAC,CAAC,EAAE,CAAC;QACjB,OAAO,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,KAAK,CAAC,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;IAChE,CAAC;IACD,2CAA2C;IAC3C,MAAM,WAAW,GACf,mEAAmE,CAAC;IACtE,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,WAAW,CAAC,CAAC;IACtC,IAAI,KAAK,EAAE,KAAK,EAAE,CAAC;QACjB,OAAO,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,KAAK,CAAC,KAAK,CAAC,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;IAC5E,CAAC;IACD,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;IAC/B,KAAK,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,IAAI,CAAC,CAAC;IACrD,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AAC1B,CAAC;AAED,2CAA2C;AAC3C,MAAM,CAAC,MAAM,oBAAoB,GAAG,oBAAoB,CAAC;AAwBzD;;GAEG;AACH,MAAM,CAAC,MAAM,mBAAmB,GAAG,KAAK,EACtC,KAAuB,EACR,EAAE;IACjB,IAAI,CAAC,MAAM,CAAC,QAAQ;QAAE,OAAO;IAE7B,MAAM,KAAK,GAAG,IAAI,GAAG,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;IACvC,MAAM,IAAI,GAAG,KAAK,CAAC,kBAAkB,IAAI,yBAAyB,EAAE,CAAC;IAErE,iDAAiD;IACjD,MAAM,OAAO,GAA4B,KAAK,CAAC,gBAAgB,IAAI;QACjE;YACE,MAAM,EAAE,KAAK,CAAC,MAAM;YACpB,SAAS,EAAE,KAAK,CAAC,SAAS;YAC1B,SAAS,EAAE,KAAK,CAAC,SAAS;SAC3B;KACF,CAAC;IAEF,IAAI,CAAC,KAAK,CAAC,WAAW,EAAE,CAAC;QACvB,uCAAuC;QACvC,IAAI,IAAI,CAAC,MAAM,IAAI,IAAI,CAAC,WAAW,EAAE,CAAC;YACpC,MAAM,OAAO,GAAG,oBAAoB,CAClC,KAAK,CAAC,WAAW,EACjB,KAAK,CAAC,SAAS,EACf,KAAK,CAAC,OAAO,EACb,IAAI,EACJ,KAAK,CAAC,eAAe,CACtB,CAAC;YAEF,MAAM,IAAI,GAAG,QAAQ,CAAC,OAAO,CAAC,CAAC;YAC/B,IAAI,IAAI,KAAK,IAAI,CAAC,YAAY,EAAE,CAAC;gBAC/B,MAAM,CAAC,IAAI,CAAC,0BAA0B,EAAE,EAAE,OAAO,EAAE,KAAK,CAAC,OAAO,EAAE,CAAC,CAAC;gBACpE,OAAO;YACT,CAAC;YAED,KAAK,MAAM,CAAC,IAAI,OAAO,EAAE,CAAC;gBACxB,IAAI,CAAC;oBACH,IAAI,CAAC,CAAC,SAAS,EAAE,CAAC;wBAChB,MAAM,KAAK,CAAC,GAAG,CAAC,kBAAkB,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC,SAAS,EAAE;4BACxD,OAAO,EAAE,OAAO;4BAChB,UAAU,EAAE,MAAM;yBACnB,CAAC,CAAC;oBACL,CAAC;yBAAM,CAAC;wBACN,MAAM,KAAK,CAAC,GAAG,CAAC,eAAe,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC,SAAS,EAAE,OAAO,EAAE;4BAC9D,UAAU,EAAE,MAAM;yBACnB,CAAC,CAAC;oBACL,CAAC;gBACH,CAAC;gBAAC,OAAO,GAAG,EAAE,CAAC;oBACb,MAAM,MAAM,GAAG,MAAM,CAAC,GAAG,CAAC,CAAC;oBAC3B,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,yBAAyB,CAAC,EAAE,CAAC;wBAChD,MAAM,CAAC,KAAK,CAAC,oBAAoB,EAAE;4BACjC,OAAO,EAAE,KAAK,CAAC,OAAO;4BACtB,MAAM,EAAE,CAAC,CAAC,MAAM;4BAChB,KAAK,EAAE,MAAM;yBACd,CAAC,CAAC;oBACL,CAAC;gBACH,CAAC;YACH,CAAC;YAED,IAAI,CAAC,YAAY,GAAG,IAAI,CAAC;YACzB,MAAM,kBAAkB,CAAC,IAAI,CAAC,CAAC;YAE/B,0DAA0D;YAC1D,MAAM,IAAI,GAAG,MAAM,gBAAgB,EAAE,CAAC;YACtC,IAAI,IAAI,EAAE,CAAC;gBACT,IAAI,CAAC,WAAW,GAAG,OAAO,CAAC;gBAC3B,MAAM,gBAAgB,CAAC,IAAI,CAAC,CAAC;YAC/B,CAAC;YAED,MAAM,CAAC,IAAI,CAAC,iCAAiC,EAAE;gBAC7C,OAAO,EAAE,KAAK,CAAC,OAAO;aACvB,CAAC,CAAC;QACL,CAAC;aAAM,CAAC;YACN,MAAM,CAAC,IAAI,CAAC,mCAAmC,EAAE;gBAC/C,OAAO,EAAE,KAAK,CAAC,OAAO;aACvB,CAAC,CAAC;QACL,CAAC;QACD,OAAO;IACT,CAAC;IAED,+CAA+C;IAC/C,MAAM,UAAU,GAAG,uBAAuB,CACxC,KAAK,CAAC,WAAW,EACjB,IAAI,EACJ,KAAK,CAAC,SAAS,EACf,KAAK,CAAC,OAAO,CACd,CAAC;IAEF,MAAM,OAAO,GAAG,oBAAoB,CAClC,KAAK,CAAC,WAAW,EACjB,KAAK,CAAC,SAAS,EACf,KAAK,CAAC,OAAO,EACb,UAAU,EACV,KAAK,CAAC,eAAe,CACtB,CAAC;IAEF,qCAAqC;IACrC,MAAM,IAAI,GAAG,QAAQ,CAAC,OAAO,CAAC,CAAC;IAC/B,IAAI,IAAI,KAAK,UAAU,CAAC,YAAY,EAAE,CAAC;QACrC,MAAM,CAAC,IAAI,CAAC,0BAA0B,EAAE,EAAE,OAAO,EAAE,KAAK,CAAC,OAAO,EAAE,CAAC,CAAC;QACpE,OAAO;IACT,CAAC;IAED,IAAI,KAAK,CAAC,WAAW,CAAC,UAAU,GAAG,MAAM,CAAC,KAAK,CAAC,mBAAmB,EAAE,CAAC;QACpE,MAAM,CAAC,IAAI,CAAC,kDAAkD,EAAE;YAC9D,OAAO,EAAE,KAAK,CAAC,OAAO;YACtB,UAAU,EAAE,KAAK,CAAC,WAAW,CAAC,UAAU;SACzC,CAAC,CAAC;IACL,CAAC;IAED,KAAK,MAAM,CAAC,IAAI,OAAO,EAAE,CAAC;QACxB,IAAI,CAAC;YACH,IAAI,CAAC,CAAC,SAAS,EAAE,CAAC;gBAChB,MAAM,KAAK,CAAC,GAAG,CAAC,kBAAkB,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC,SAAS,EAAE;oBACxD,OAAO,EAAE,OAAO;oBAChB,UAAU,EAAE,MAAM;iBACnB,CAAC,CAAC;YACL,CAAC;iBAAM,CAAC;gBACN,MAAM,KAAK,CAAC,GAAG,CAAC,eAAe,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC,SAAS,EAAE,OAAO,EAAE;oBAC9D,UAAU,EAAE,MAAM;iBACnB,CAAC,CAAC;YACL,CAAC;QACH,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,MAAM,MAAM,GAAG,MAAM,CAAC,GAAG,CAAC,CAAC;YAC3B,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,yBAAyB,CAAC,EAAE,CAAC;gBAChD,MAAM,CAAC,KAAK,CAAC,oBAAoB,EAAE;oBACjC,OAAO,EAAE,KAAK,CAAC,OAAO;oBACtB,MAAM,EAAE,CAAC,CAAC,MAAM;oBAChB,KAAK,EAAE,MAAM;iBACd,CAAC,CAAC;YACL,CAAC;QACH,CAAC;IACH,CAAC;IAED,UAAU,CAAC,YAAY,GAAG,IAAI,CAAC;IAC/B,MAAM,kBAAkB,CAAC,UAAU,CAAC,CAAC;IAErC,0DAA0D;IAC1D,MAAM,IAAI,GAAG,MAAM,gBAAgB,EAAE,CAAC;IACtC,IAAI,IAAI,EAAE,CAAC;QACT,IAAI,CAAC,WAAW,GAAG,OAAO,CAAC;QAC3B,MAAM,gBAAgB,CAAC,IAAI,CAAC,CAAC;IAC/B,CAAC;IAED,MAAM,CAAC,IAAI,CAAC,iBAAiB,EAAE;QAC7B,OAAO,EAAE,KAAK,CAAC,OAAO;QACtB,OAAO,EAAE,OAAO,CAAC,MAAM;QACvB,UAAU,EAAE,KAAK,CAAC,WAAW,CAAC,UAAU;QACxC,OAAO,EAAE,KAAK,CAAC,WAAW,CAAC,aAAa;QACxC,KAAK,EAAE,KAAK,CAAC,SAAS;KACvB,CAAC,CAAC;AACL,CAAC,CAAC;AAEF,MAAM,CAAC,MAAM,WAAW,GAAG,mBAAmB,CAAC;AAI/C,MAAM,CAAC,MAAM,QAAQ,GAAG,KAAK,EAC3B,KAAqB,EACa,EAAE;IACpC,MAAM,mBAAmB,CAAC;QACxB,OAAO,EAAE,KAAK,CAAC,OAAO;QACtB,OAAO,EAAE,KAAK,CAAC,OAAO;QACtB,SAAS,EAAE,KAAK,CAAC,SAAS;QAC1B,MAAM,EAAE,KAAK,CAAC,MAAM;QACpB,SAAS,EAAE,KAAK,CAAC,SAAS;QAC1B,SAAS,EAAE,KAAK,CAAC,SAAS;QAC1B,gBAAgB,EAAE,KAAK,CAAC,gBAAgB;QACxC,WAAW,EAAE,KAAK,CAAC,WAAW;QAC9B,WAAW,EAAE,KAAK,CAAC,WAAW;QAC9B,kBAAkB,EAChB,KAAK,CAAC,kBAAkB,IAAI,oBAAoB,CAAC,KAAK,CAAC,EAAE,CAAC;QAC5D,eAAe,EAAE,KAAK,CAAC,eAAe;KACvC,CAAC,CAAC;IACH,OAAO,EAAE,CAAC;AACZ,CAAC,CAAC"}
@@ -0,0 +1,71 @@
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 type { AlertType, CitedSource, EnrichmentData, InlineCite, VotedResult } from "@easyoref/shared";
8
+ /** EN country name → Russian */
9
+ export declare const COUNTRY_RU: Record<string, string>;
10
+ /** Format inline citations: [[1]](url), [[2]](url) */
11
+ export declare function inlineCites(indices: number[], citedSources: CitedSource[]): string;
12
+ /** Get InlineCite[] from citation indices */
13
+ export declare function extractCites(indices: number[], citedSources: CitedSource[]): InlineCite[];
14
+ /** Format inline citations from InlineCite[] (carry-forward data) */
15
+ export declare function inlineCitesFromData(cites: InlineCite[]): string;
16
+ /**
17
+ * Build a global URL→index map across ALL enrichment fields.
18
+ * Deduplicates by URL so the same source gets the same [N] everywhere.
19
+ */
20
+ export declare function buildGlobalCiteMap(enrichment: EnrichmentData): Map<string, number>;
21
+ /** Format inline citations using global numbering */
22
+ export declare function renderCitesGlobal(cites: InlineCite[], globalMap: Map<string, number>): string;
23
+ export declare const SKIP = 0.6;
24
+ export declare const UNCERTAIN = 0.75;
25
+ export declare const CERTAIN = 0.95;
26
+ /** Strip custom-emoji monitoring line from message text */
27
+ export declare const MONITORING_RE: RegExp;
28
+ export declare function stripMonitoring(text: string): string;
29
+ export declare function appendMonitoring(text: string, label: string): string;
30
+ /**
31
+ * Build enrichment data from current vote + previous enrichment (carry-forward).
32
+ * Returns updated EnrichmentData for Redis persistence.
33
+ */
34
+ export declare function buildEnrichmentFromVote(result: VotedResult, prev: EnrichmentData, alertType: AlertType, alertTs: number): EnrichmentData;
35
+ /**
36
+ * Build the enriched message text from current message + enrichment data.
37
+ * Uses inline [[1]](url) citations.
38
+ */
39
+ export declare function buildEnrichedMessage(currentText: string, alertType: AlertType, alertTs: number, enrichment: EnrichmentData, monitoringLabel?: string): string;
40
+ /**
41
+ * Insert a line before </blockquote> (or legacy time line as fallback).
42
+ */
43
+ export declare function insertBeforeBlockEnd(text: string, line: string): string;
44
+ /** @deprecated Use insertBeforeBlockEnd */
45
+ export declare const insertBeforeTimeLine: typeof insertBeforeBlockEnd;
46
+ export interface TelegramTargetMessage {
47
+ chatId: string;
48
+ messageId: number;
49
+ isCaption: boolean;
50
+ }
51
+ export interface EditMessageInput {
52
+ alertId: string;
53
+ alertTs: number;
54
+ alertType: AlertType;
55
+ chatId: string;
56
+ messageId: number;
57
+ isCaption: boolean;
58
+ telegramMessages?: TelegramTargetMessage[];
59
+ currentText: string;
60
+ votedResult: VotedResult | undefined;
61
+ previousEnrichment: EnrichmentData;
62
+ monitoringLabel?: string;
63
+ }
64
+ /**
65
+ * Edit the Telegram message with enriched data.
66
+ */
67
+ export declare const editTelegramMessage: (input: EditMessageInput) => Promise<void>;
68
+ export declare const editMessage: (input: EditMessageInput) => Promise<void>;
69
+ import type { AgentStateType } from "../graph.js";
70
+ export declare const editNode: (state: AgentStateType) => Promise<Partial<AgentStateType>>;
71
+ //# sourceMappingURL=message.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"message.d.ts","sourceRoot":"","sources":["../../src/nodes/message.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAGH,OAAO,KAAK,EACV,SAAS,EACT,WAAW,EACX,cAAc,EACd,UAAU,EAEV,WAAW,EACZ,MAAM,kBAAkB,CAAC;AAe1B,gCAAgC;AAChC,eAAO,MAAM,UAAU,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAQ7C,CAAC;AAIF,sDAAsD;AACtD,wBAAgB,WAAW,CACzB,OAAO,EAAE,MAAM,EAAE,EACjB,YAAY,EAAE,WAAW,EAAE,GAC1B,MAAM,CASR;AAED,6CAA6C;AAC7C,wBAAgB,YAAY,CAC1B,OAAO,EAAE,MAAM,EAAE,EACjB,YAAY,EAAE,WAAW,EAAE,GAC1B,UAAU,EAAE,CASd;AAED,qEAAqE;AACrE,wBAAgB,mBAAmB,CAAC,KAAK,EAAE,UAAU,EAAE,GAAG,MAAM,CAK/D;AAED;;;GAGG;AACH,wBAAgB,kBAAkB,CAChC,UAAU,EAAE,cAAc,GACzB,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAqBrB;AAED,qDAAqD;AACrD,wBAAgB,iBAAiB,CAC/B,KAAK,EAAE,UAAU,EAAE,EACnB,SAAS,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,GAC7B,MAAM,CAUR;AAID,eAAO,MAAM,IAAI,MAAM,CAAC;AACxB,eAAO,MAAM,SAAS,OAAO,CAAC;AAC9B,eAAO,MAAM,OAAO,OAAO,CAAC;AAI5B,2DAA2D;AAC3D,eAAO,MAAM,aAAa,QAC6B,CAAC;AAExD,wBAAgB,eAAe,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAEpD;AAED,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,MAAM,CAEpE;AAyBD;;;GAGG;AACH,wBAAgB,uBAAuB,CACrC,MAAM,EAAE,WAAW,EACnB,IAAI,EAAE,cAAc,EACpB,SAAS,EAAE,SAAS,EACpB,OAAO,EAAE,MAAM,GACd,cAAc,CAiKhB;AAID;;;GAGG;AACH,wBAAgB,oBAAoB,CAClC,WAAW,EAAE,MAAM,EACnB,SAAS,EAAE,SAAS,EACpB,OAAO,EAAE,MAAM,EACf,UAAU,EAAE,cAAc,EAC1B,eAAe,CAAC,EAAE,MAAM,GACvB,MAAM,CAqHR;AAED;;GAEG;AACH,wBAAgB,oBAAoB,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,MAAM,CAevE;AAED,2CAA2C;AAC3C,eAAO,MAAM,oBAAoB,6BAAuB,CAAC;AAIzD,MAAM,WAAW,qBAAqB;IACpC,MAAM,EAAE,MAAM,CAAC;IACf,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,OAAO,CAAC;CACpB;AAED,MAAM,WAAW,gBAAgB;IAC/B,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,EAAE,SAAS,CAAC;IACrB,MAAM,EAAE,MAAM,CAAC;IACf,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,OAAO,CAAC;IACnB,gBAAgB,CAAC,EAAE,qBAAqB,EAAE,CAAC;IAC3C,WAAW,EAAE,MAAM,CAAC;IACpB,WAAW,EAAE,WAAW,GAAG,SAAS,CAAC;IACrC,kBAAkB,EAAE,cAAc,CAAC;IACnC,eAAe,CAAC,EAAE,MAAM,CAAC;CAC1B;AAED;;GAEG;AACH,eAAO,MAAM,mBAAmB,GAC9B,OAAO,gBAAgB,KACtB,OAAO,CAAC,IAAI,CAoJd,CAAC;AAEF,eAAO,MAAM,WAAW,UAvJf,gBAAgB,KACtB,OAAO,CAAC,IAAI,CAsJ+B,CAAC;AAE/C,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAElD,eAAO,MAAM,QAAQ,GACnB,OAAO,cAAc,KACpB,OAAO,CAAC,OAAO,CAAC,cAAc,CAAC,CAgBjC,CAAC"}