@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,496 @@
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(result, prev, alertType, alertTs) {
128
+ const data = { ...prev };
129
+ // Origin
130
+ if (result.countryOrigins && result.countryOrigins.length > 0) {
131
+ data.origin = result.countryOrigins
132
+ .map((c) => COUNTRY_RU[c.name] ?? c.name)
133
+ .join(" + ");
134
+ data.originCites = result.countryOrigins.flatMap((c) => extractCites(c.citations, result.citedSources));
135
+ }
136
+ // ETA — only for early_warning/red_alert
137
+ if (result.etaRefinedMinutes &&
138
+ (alertType === "early_warning" || alertType === "red_alert")) {
139
+ const absTime = new Date(alertTs + result.etaRefinedMinutes * 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(result.etaCitations, result.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 (result.rocketCountMin !== undefined &&
150
+ result.rocketCountMax !== undefined &&
151
+ result.rocketConfidence >= 0.55) {
152
+ const u = result.rocketConfidence < UNCERTAIN ? " (?)" : "";
153
+ data.rocketCount =
154
+ result.rocketCountMin === result.rocketCountMax
155
+ ? `${result.rocketCountMin}${u}`
156
+ : `~${result.rocketCountMin}–${result.rocketCountMax}${u}`;
157
+ data.rocketCites = extractCites(result.rocketCitations, result.citedSources);
158
+ }
159
+ // Cassette
160
+ if (result.isCassette !== undefined && result.isCassetteConfidence >= SKIP) {
161
+ data.isCassette = result.isCassette;
162
+ }
163
+ // Intercepted
164
+ if (result.intercepted !== undefined &&
165
+ result.interceptedConfidence >= SKIP) {
166
+ const u = result.interceptedConfidence < UNCERTAIN ? " (?)" : "";
167
+ data.intercepted = `${result.intercepted}${u}`;
168
+ data.interceptedCites = extractCites(result.interceptedCitations, result.citedSources);
169
+ }
170
+ else if (result.interceptedQual && result.interceptedConfidence >= SKIP) {
171
+ const qs = qualDisplay(result.interceptedQual, result.interceptedConfidence);
172
+ if (qs)
173
+ data.intercepted = qs;
174
+ }
175
+ // Hits
176
+ if (result.hitsConfirmed &&
177
+ result.hitsConfirmed > 0 &&
178
+ result.hitsConfidence >= SKIP) {
179
+ const u = result.hitsConfidence < UNCERTAIN ? " (?)" : "";
180
+ data.hitsConfirmed = `${result.hitsConfirmed}${u}`;
181
+ data.hitsCites = extractCites(result.hitsCitations, result.citedSources);
182
+ }
183
+ // No impacts: sources explicitly confirm zero hits
184
+ if (result.noImpacts && result.hitsConfidence >= SKIP) {
185
+ data.noImpacts = true;
186
+ data.noImpactsCites = extractCites(result.noImpactsCitations, result.citedSources);
187
+ }
188
+ // Rocket detail (per-region breakdown)
189
+ if (result.rocketDetail) {
190
+ data.rocketDetail = result.rocketDetail;
191
+ }
192
+ // Hit location & type
193
+ if (result.hitLocation && result.hitsConfirmed && result.hitsConfirmed > 0) {
194
+ data.hitLocation = result.hitLocation;
195
+ }
196
+ if (result.hitType && result.hitsConfirmed && result.hitsConfirmed > 0) {
197
+ data.hitType = result.hitType;
198
+ }
199
+ if (result.hitDetail && result.hitsConfirmed && result.hitsConfirmed > 0) {
200
+ data.hitDetail = result.hitDetail;
201
+ }
202
+ // Casualties — CRITICAL: only report at near-certain confidence
203
+ // Requires explicit mention of killed/dead in source (נהרג/מת/killed/dead/убит/погиб)
204
+ if (result.casualties &&
205
+ result.casualties > 0 &&
206
+ result.casualtiesConfidence >= CERTAIN // 0.95 — never show unconfirmed deaths
207
+ ) {
208
+ // No uncertainty marker for deaths — either confirmed or not shown
209
+ data.casualties = `${result.casualties}`;
210
+ data.casualtiesCites = extractCites(result.casualtiesCitations, result.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 (result.injuries &&
215
+ result.injuries > 0 &&
216
+ result.injuriesConfidence >= UNCERTAIN) {
217
+ const u = result.injuriesConfidence < CERTAIN ? " (?)" : "";
218
+ const causeSuffix = result.injuriesCause === "rushing_to_shelter"
219
+ ? " (по дороге в укрытие)"
220
+ : result.injuriesCause === "rocket"
221
+ ? " (от ракеты)"
222
+ : "";
223
+ data.injuries = `${result.injuries}${u}${causeSuffix}`;
224
+ data.injuriesCause = result.injuriesCause;
225
+ data.injuriesCites = extractCites(result.injuriesCitations, result.citedSources);
226
+ }
227
+ else if (result.injuries &&
228
+ result.injuries === 0 &&
229
+ result.injuriesConfidence >= UNCERTAIN &&
230
+ prev.injuries) {
231
+ // Explicit retraction: source says "no injured" — clear previous report
232
+ data.injuries = undefined;
233
+ data.injuriesCause = undefined;
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 === "red_alert")) {
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) {
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 const editTelegramMessage = async (input) => {
358
+ if (!config.botToken)
359
+ return;
360
+ const tgBot = new Bot(config.botToken);
361
+ const prev = input.previousEnrichment ?? createEmptyEnrichmentData();
362
+ // Resolve targets: multi-chat or single fallback
363
+ const targets = input.telegramMessages ?? [
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.sourcesCount,
476
+ phase: input.alertType,
477
+ });
478
+ };
479
+ export const editMessage = editTelegramMessage;
480
+ export const editNode = async (state) => {
481
+ await editTelegramMessage({
482
+ alertId: state.alertId,
483
+ alertTs: state.alertTs,
484
+ alertType: state.alertType,
485
+ chatId: state.chatId,
486
+ messageId: state.messageId,
487
+ isCaption: state.isCaption,
488
+ telegramMessages: state.telegramMessages,
489
+ currentText: state.currentText,
490
+ votedResult: state.votedResult,
491
+ previousEnrichment: state.previousEnrichment ?? EnrichmentDataSchema.parse({}),
492
+ monitoringLabel: state.monitoringLabel,
493
+ });
494
+ return {};
495
+ };
496
+ //# sourceMappingURL=message.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"message.js","sourceRoot":"","sources":["../../src/nodes/message.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,13 @@
1
+ /**
2
+ * Vote Node — consensus voting, deterministic, 0 tokens.
3
+ *
4
+ * Aggregates extraction results from multiple sources into a single
5
+ * voted consensus using median, majority, and weighted confidence.
6
+ */
7
+ import type { ValidatedExtraction, VotedResult } from "@easyoref/shared";
8
+ import type { AgentStateType } from "../graph.js";
9
+ declare function aggregateVote(extractions: ValidatedExtraction[], alertId: string): VotedResult | undefined;
10
+ export declare const voteNode: (state: AgentStateType) => Partial<AgentStateType>;
11
+ export declare const vote: typeof aggregateVote;
12
+ export {};
13
+ //# sourceMappingURL=vote-node.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"vote-node.d.ts","sourceRoot":"","sources":["../../src/nodes/vote-node.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAGH,OAAO,KAAK,EAGV,mBAAmB,EACnB,WAAW,EACZ,MAAM,kBAAkB,CAAC;AAC1B,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAwClD,iBAAS,aAAa,CACpB,WAAW,EAAE,mBAAmB,EAAE,EAClC,OAAO,EAAE,MAAM,GACd,WAAW,GAAG,SAAS,CAkSzB;AAED,eAAO,MAAM,QAAQ,GAAI,OAAO,cAAc,KAAG,OAAO,CAAC,cAAc,CAEtE,CAAC;AAEF,eAAO,MAAM,IAAI,sBAAgB,CAAC"}