@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,232 @@
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 * as logger from "@easyoref/monitoring";
8
+ function weightedConfidence(sources) {
9
+ if (sources.length === 0)
10
+ return 0;
11
+ return (sources.reduce((accumulator, extraction) => accumulator + extraction.sourceTrust * extraction.confidence, 0) / sources.length);
12
+ }
13
+ function modeQualification(sources, key) {
14
+ const values = sources
15
+ .map((extraction) => extraction[key])
16
+ .filter((value) => value !== undefined);
17
+ if (values.length === 0)
18
+ return undefined;
19
+ const frequency = new Map();
20
+ for (const value of values)
21
+ frequency.set(value, (frequency.get(value) ?? 0) + 1);
22
+ return [...frequency.entries()].sort((a, b) => b[1] - a[1])[0]?.[0];
23
+ }
24
+ function medianQualificationNumber(sources, key) {
25
+ const values = sources
26
+ .map((extraction) => extraction[key])
27
+ .filter((value) => value !== undefined)
28
+ .sort((a, b) => a - b);
29
+ return values.length > 0 ? values[Math.floor(values.length / 2)] : undefined;
30
+ }
31
+ function aggregateVote(extractions, alertId) {
32
+ const valid = extractions.filter((extraction) => extraction.valid);
33
+ if (valid.length === 0)
34
+ return undefined;
35
+ const indexed = valid.map((extraction, index) => ({
36
+ ...extraction,
37
+ citationIndex: index + 1,
38
+ }));
39
+ const citedSources = indexed.map((extraction) => ({
40
+ index: extraction.citationIndex,
41
+ channel: extraction.channel,
42
+ ...(extraction.messageUrl && { messageUrl: extraction.messageUrl }),
43
+ }));
44
+ const etaSources = indexed
45
+ .filter((extraction) => extraction.etaRefinedMinutes !== undefined)
46
+ .sort((a, b) => b.confidence - a.confidence);
47
+ const bestEtaSource = etaSources[0];
48
+ const countryMap = new Map();
49
+ for (const extraction of indexed) {
50
+ if (extraction.countryOrigin) {
51
+ const key = extraction.countryOrigin.toLowerCase();
52
+ const entry = countryMap.get(key);
53
+ if (entry) {
54
+ entry.citations.push(extraction.citationIndex);
55
+ }
56
+ else {
57
+ countryMap.set(key, {
58
+ canonical: extraction.countryOrigin,
59
+ citations: [extraction.citationIndex],
60
+ });
61
+ }
62
+ }
63
+ }
64
+ const countryOrigins = countryMap.size > 0
65
+ ? Array.from(countryMap.values()).map(({ canonical, citations }) => ({
66
+ name: canonical,
67
+ citations,
68
+ }))
69
+ : undefined;
70
+ const rocketSources = indexed.filter((extraction) => extraction.rocketCount !== undefined);
71
+ const rocketValues = rocketSources.map((extraction) => extraction.rocketCount);
72
+ const rocketCountMin = rocketValues.length > 0 ? Math.min(...rocketValues) : undefined;
73
+ const rocketCountMax = rocketValues.length > 0 ? Math.max(...rocketValues) : undefined;
74
+ const rocketCitations = rocketSources.map((extraction) => extraction.citationIndex);
75
+ const rocketConfidence = weightedConfidence(rocketSources);
76
+ const detailSources = indexed
77
+ .filter((extraction) => extraction.rocketDetail)
78
+ .sort((a, b) => b.confidence - a.confidence);
79
+ const rocketDetail = detailSources[0]?.rocketDetail;
80
+ const cassetteSources = indexed.filter((extraction) => extraction.isCassette !== undefined);
81
+ const cassetteValues = cassetteSources.map((extraction) => extraction.isCassette);
82
+ const isCassette = cassetteValues.length > 0
83
+ ? cassetteValues.filter(Boolean).length > cassetteValues.length / 2
84
+ : undefined;
85
+ const cassetteConfidence = weightedConfidence(cassetteSources);
86
+ const interceptedSources = indexed.filter((extraction) => extraction.intercepted !== undefined);
87
+ const interceptedQualSources = indexed.filter((extraction) => extraction.interceptedQual !== undefined);
88
+ const interceptedValues = interceptedSources
89
+ .map((extraction) => extraction.intercepted)
90
+ .sort((a, b) => a - b);
91
+ const intercepted = interceptedValues.length > 0
92
+ ? interceptedValues[Math.floor(interceptedValues.length / 2)]
93
+ : undefined;
94
+ const interceptedQual = intercepted === undefined
95
+ ? modeQualification(interceptedQualSources, "interceptedQual")
96
+ : undefined;
97
+ const interceptedQualNumber = interceptedQual
98
+ ? medianQualificationNumber(interceptedQualSources, "interceptedQualNum")
99
+ : undefined;
100
+ const interceptedConfidence = weightedConfidence(interceptedSources.length > 0 ? interceptedSources : interceptedQualSources);
101
+ const seaSources = indexed.filter((extraction) => extraction.seaImpact !== undefined);
102
+ const seaQualSources = indexed.filter((extraction) => extraction.seaImpactQual !== undefined);
103
+ const seaValues = seaSources
104
+ .map((extraction) => extraction.seaImpact)
105
+ .sort((a, b) => a - b);
106
+ const seaImpact = seaValues.length > 0
107
+ ? seaValues[Math.floor(seaValues.length / 2)]
108
+ : undefined;
109
+ const seaImpactQual = seaImpact === undefined
110
+ ? modeQualification(seaQualSources, "seaImpactQual")
111
+ : undefined;
112
+ const seaImpactQualNumber = seaImpactQual
113
+ ? medianQualificationNumber(seaQualSources, "seaImpactQualNum")
114
+ : undefined;
115
+ const seaConfidence = weightedConfidence(seaSources.length > 0 ? seaSources : seaQualSources);
116
+ const openSources = indexed.filter((extraction) => extraction.openAreaImpact !== undefined);
117
+ const openQualSources = indexed.filter((extraction) => extraction.openAreaImpactQual !== undefined);
118
+ const openValues = openSources
119
+ .map((extraction) => extraction.openAreaImpact)
120
+ .sort((a, b) => a - b);
121
+ const openAreaImpact = openValues.length > 0
122
+ ? openValues[Math.floor(openValues.length / 2)]
123
+ : undefined;
124
+ const openAreaImpactQual = openAreaImpact === undefined
125
+ ? modeQualification(openQualSources, "openAreaImpactQual")
126
+ : undefined;
127
+ const openAreaImpactQualNumber = openAreaImpactQual
128
+ ? medianQualificationNumber(openQualSources, "openAreaImpactQualNum")
129
+ : undefined;
130
+ const openAreaConfidence = weightedConfidence(openSources.length > 0 ? openSources : openQualSources);
131
+ const allHitsSources = indexed.filter((extraction) => extraction.hitsConfirmed !== undefined);
132
+ const hitsValues = allHitsSources
133
+ .map((extraction) => extraction.hitsConfirmed)
134
+ .sort((a, b) => a - b);
135
+ const hitsConfirmed = hitsValues.length > 0
136
+ ? hitsValues[Math.floor(hitsValues.length / 2)]
137
+ : undefined;
138
+ const positiveHitsSources = allHitsSources.filter((extraction) => extraction.hitsConfirmed > 0);
139
+ const hitsCitations = positiveHitsSources.length > 0
140
+ ? positiveHitsSources.map((extraction) => extraction.citationIndex)
141
+ : allHitsSources.map((extraction) => extraction.citationIndex);
142
+ const hitsConfidence = weightedConfidence(allHitsSources);
143
+ const hitsWithLocation = positiveHitsSources
144
+ .filter((extraction) => extraction.hitLocation)
145
+ .sort((a, b) => b.confidence - a.confidence);
146
+ const hitLocation = hitsWithLocation[0]?.hitLocation;
147
+ const hitType = hitsWithLocation[0]?.hitType;
148
+ const hitsWithDetail = positiveHitsSources
149
+ .filter((extraction) => extraction.hitDetail)
150
+ .sort((a, b) => b.confidence - a.confidence);
151
+ const hitDetail = hitsWithDetail[0]?.hitDetail;
152
+ const noImpactSources = allHitsSources.filter((extraction) => extraction.hitsConfirmed === 0);
153
+ const noImpacts = noImpactSources.length > 0 && hitsConfirmed === 0;
154
+ const noImpactsCitations = noImpactSources.map((extraction) => extraction.citationIndex);
155
+ const casualtySources = indexed.filter((extraction) => extraction.casualties && extraction.casualties > 0);
156
+ const casualtyValues = casualtySources
157
+ .map((extraction) => extraction.casualties)
158
+ .sort((a, b) => a - b);
159
+ const casualties = casualtyValues.length > 0
160
+ ? casualtyValues[Math.floor(casualtyValues.length / 2)]
161
+ : undefined;
162
+ const casualtiesCitations = casualtySources.map((extraction) => extraction.citationIndex);
163
+ const casualtiesConfidence = weightedConfidence(casualtySources);
164
+ const injurySources = indexed.filter((extraction) => extraction.injuries !== undefined && extraction.injuries > 0);
165
+ const injuryValues = injurySources
166
+ .map((extraction) => extraction.injuries)
167
+ .sort((a, b) => a - b);
168
+ const injuries = injuryValues.length > 0
169
+ ? injuryValues[Math.floor(injuryValues.length / 2)]
170
+ : undefined;
171
+ const injuriesCitations = injurySources.map((extraction) => extraction.citationIndex);
172
+ const injuriesConfidence = weightedConfidence(injurySources);
173
+ const injuryCauseValues = injurySources
174
+ .map((extraction) => extraction.injuriesCause)
175
+ .filter((value) => value !== undefined);
176
+ const rocketCauseCount = injuryCauseValues.filter((value) => value === "rocket").length;
177
+ const shelterCauseCount = injuryCauseValues.filter((value) => value === "rushing_to_shelter").length;
178
+ const injuriesCause = injuryCauseValues.length === 0
179
+ ? undefined
180
+ : rocketCauseCount >= shelterCauseCount
181
+ ? "rocket"
182
+ : "rushing_to_shelter";
183
+ const totalWeight = indexed.reduce((accumulator, extraction) => accumulator + extraction.sourceTrust * extraction.confidence, 0);
184
+ const weightedConfidenceValue = totalWeight / indexed.length;
185
+ const voted = {
186
+ etaRefinedMinutes: bestEtaSource?.etaRefinedMinutes,
187
+ etaCitations: bestEtaSource ? [bestEtaSource.citationIndex] : [],
188
+ countryOrigins: countryOrigins ?? [],
189
+ rocketCountMin: rocketCountMin,
190
+ rocketCountMax: rocketCountMax,
191
+ rocketCitations: rocketCitations,
192
+ rocketConfidence: rocketConfidence,
193
+ rocketDetail: rocketDetail,
194
+ isCassette: isCassette,
195
+ isCassetteConfidence: cassetteConfidence,
196
+ intercepted,
197
+ interceptedQual: interceptedQual,
198
+ interceptedConfidence: interceptedConfidence,
199
+ seaImpact: seaImpact,
200
+ seaImpactQual: seaImpactQual,
201
+ seaConfidence: seaConfidence,
202
+ openAreaImpact: openAreaImpact,
203
+ openAreaImpactQual: openAreaImpactQual,
204
+ openAreaConfidence: openAreaConfidence,
205
+ hitsConfirmed: hitsConfirmed,
206
+ hitsCitations: hitsCitations,
207
+ hitsConfidence: hitsConfidence,
208
+ hitLocation: hitLocation,
209
+ hitType: hitType,
210
+ hitDetail: hitDetail,
211
+ noImpacts: noImpacts,
212
+ noImpactsCitations: noImpactsCitations,
213
+ interceptedCitations: interceptedSources.map((extraction) => extraction.citationIndex),
214
+ casualties,
215
+ casualtiesCitations: casualtiesCitations,
216
+ casualtiesConfidence: casualtiesConfidence,
217
+ injuries,
218
+ injuriesCause: injuriesCause,
219
+ injuriesCitations: injuriesCitations,
220
+ injuriesConfidence: injuriesConfidence,
221
+ confidence: Math.round(weightedConfidenceValue * 100) / 100,
222
+ sourcesCount: indexed.length,
223
+ citedSources,
224
+ };
225
+ logger.info("Agent: voted", { alertId, voted });
226
+ return voted;
227
+ }
228
+ export const voteNode = (state) => {
229
+ return { votedResult: aggregateVote(state.extractions, state.alertId) };
230
+ };
231
+ export const vote = aggregateVote;
232
+ //# sourceMappingURL=vote-node.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"vote-node.js","sourceRoot":"","sources":["../../src/nodes/vote-node.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.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"vote.d.ts","sourceRoot":"","sources":["../../src/nodes/vote.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"}
@@ -0,0 +1,232 @@
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 * as logger from "@easyoref/monitoring";
8
+ function weightedConfidence(sources) {
9
+ if (sources.length === 0)
10
+ return 0;
11
+ return (sources.reduce((accumulator, extraction) => accumulator + extraction.sourceTrust * extraction.confidence, 0) / sources.length);
12
+ }
13
+ function modeQualification(sources, key) {
14
+ const values = sources
15
+ .map((extraction) => extraction[key])
16
+ .filter((value) => value !== undefined);
17
+ if (values.length === 0)
18
+ return undefined;
19
+ const frequency = new Map();
20
+ for (const value of values)
21
+ frequency.set(value, (frequency.get(value) ?? 0) + 1);
22
+ return [...frequency.entries()].sort((a, b) => b[1] - a[1])[0]?.[0];
23
+ }
24
+ function medianQualificationNumber(sources, key) {
25
+ const values = sources
26
+ .map((extraction) => extraction[key])
27
+ .filter((value) => value !== undefined)
28
+ .sort((a, b) => a - b);
29
+ return values.length > 0 ? values[Math.floor(values.length / 2)] : undefined;
30
+ }
31
+ function aggregateVote(extractions, alertId) {
32
+ const valid = extractions.filter((extraction) => extraction.valid);
33
+ if (valid.length === 0)
34
+ return undefined;
35
+ const indexed = valid.map((extraction, index) => ({
36
+ ...extraction,
37
+ citationIndex: index + 1,
38
+ }));
39
+ const citedSources = indexed.map((extraction) => ({
40
+ index: extraction.citationIndex,
41
+ channel: extraction.channel,
42
+ ...(extraction.messageUrl && { messageUrl: extraction.messageUrl }),
43
+ }));
44
+ const etaSources = indexed
45
+ .filter((extraction) => extraction.etaRefinedMinutes !== undefined)
46
+ .sort((a, b) => b.confidence - a.confidence);
47
+ const bestEtaSource = etaSources[0];
48
+ const countryMap = new Map();
49
+ for (const extraction of indexed) {
50
+ if (extraction.countryOrigin) {
51
+ const key = extraction.countryOrigin.toLowerCase();
52
+ const entry = countryMap.get(key);
53
+ if (entry) {
54
+ entry.citations.push(extraction.citationIndex);
55
+ }
56
+ else {
57
+ countryMap.set(key, {
58
+ canonical: extraction.countryOrigin,
59
+ citations: [extraction.citationIndex],
60
+ });
61
+ }
62
+ }
63
+ }
64
+ const countryOrigins = countryMap.size > 0
65
+ ? Array.from(countryMap.values()).map(({ canonical, citations }) => ({
66
+ name: canonical,
67
+ citations,
68
+ }))
69
+ : undefined;
70
+ const rocketSources = indexed.filter((extraction) => extraction.rocketCount !== undefined);
71
+ const rocketValues = rocketSources.map((extraction) => extraction.rocketCount);
72
+ const rocketCountMin = rocketValues.length > 0 ? Math.min(...rocketValues) : undefined;
73
+ const rocketCountMax = rocketValues.length > 0 ? Math.max(...rocketValues) : undefined;
74
+ const rocketCitations = rocketSources.map((extraction) => extraction.citationIndex);
75
+ const rocketConfidence = weightedConfidence(rocketSources);
76
+ const detailSources = indexed
77
+ .filter((extraction) => extraction.rocketDetail)
78
+ .sort((a, b) => b.confidence - a.confidence);
79
+ const rocketDetail = detailSources[0]?.rocketDetail;
80
+ const cassetteSources = indexed.filter((extraction) => extraction.isCassette !== undefined);
81
+ const cassetteValues = cassetteSources.map((extraction) => extraction.isCassette);
82
+ const isCassette = cassetteValues.length > 0
83
+ ? cassetteValues.filter(Boolean).length > cassetteValues.length / 2
84
+ : undefined;
85
+ const cassetteConfidence = weightedConfidence(cassetteSources);
86
+ const interceptedSources = indexed.filter((extraction) => extraction.intercepted !== undefined);
87
+ const interceptedQualSources = indexed.filter((extraction) => extraction.interceptedQual !== undefined);
88
+ const interceptedValues = interceptedSources
89
+ .map((extraction) => extraction.intercepted)
90
+ .sort((a, b) => a - b);
91
+ const intercepted = interceptedValues.length > 0
92
+ ? interceptedValues[Math.floor(interceptedValues.length / 2)]
93
+ : undefined;
94
+ const interceptedQual = intercepted === undefined
95
+ ? modeQualification(interceptedQualSources, "interceptedQual")
96
+ : undefined;
97
+ const interceptedQualNumber = interceptedQual
98
+ ? medianQualificationNumber(interceptedQualSources, "interceptedQual_num")
99
+ : undefined;
100
+ const interceptedConfidence = weightedConfidence(interceptedSources.length > 0 ? interceptedSources : interceptedQualSources);
101
+ const seaSources = indexed.filter((extraction) => extraction.seaImpact !== undefined);
102
+ const seaQualSources = indexed.filter((extraction) => extraction.seaImpactQual !== undefined);
103
+ const seaValues = seaSources
104
+ .map((extraction) => extraction.seaImpact)
105
+ .sort((a, b) => a - b);
106
+ const seaImpact = seaValues.length > 0
107
+ ? seaValues[Math.floor(seaValues.length / 2)]
108
+ : undefined;
109
+ const seaImpactQual = seaImpact === undefined
110
+ ? modeQualification(seaQualSources, "seaImpactQual")
111
+ : undefined;
112
+ const seaImpactQualNumber = seaImpactQual
113
+ ? medianQualificationNumber(seaQualSources, "seaImpactQual_num")
114
+ : undefined;
115
+ const seaConfidence = weightedConfidence(seaSources.length > 0 ? seaSources : seaQualSources);
116
+ const openSources = indexed.filter((extraction) => extraction.openAreaImpact !== undefined);
117
+ const openQualSources = indexed.filter((extraction) => extraction.openAreaImpactQual !== undefined);
118
+ const openValues = openSources
119
+ .map((extraction) => extraction.openAreaImpact)
120
+ .sort((a, b) => a - b);
121
+ const openAreaImpact = openValues.length > 0
122
+ ? openValues[Math.floor(openValues.length / 2)]
123
+ : undefined;
124
+ const openAreaImpactQual = openAreaImpact === undefined
125
+ ? modeQualification(openQualSources, "openAreaImpactQual")
126
+ : undefined;
127
+ const openAreaImpactQualNumber = openAreaImpactQual
128
+ ? medianQualificationNumber(openQualSources, "openAreaImpactQual_num")
129
+ : undefined;
130
+ const openAreaConfidence = weightedConfidence(openSources.length > 0 ? openSources : openQualSources);
131
+ const allHitsSources = indexed.filter((extraction) => extraction.hitsConfirmed !== undefined);
132
+ const hitsValues = allHitsSources
133
+ .map((extraction) => extraction.hitsConfirmed)
134
+ .sort((a, b) => a - b);
135
+ const hitsConfirmed = hitsValues.length > 0
136
+ ? hitsValues[Math.floor(hitsValues.length / 2)]
137
+ : undefined;
138
+ const positiveHitsSources = allHitsSources.filter((extraction) => extraction.hitsConfirmed > 0);
139
+ const hitsCitations = positiveHitsSources.length > 0
140
+ ? positiveHitsSources.map((extraction) => extraction.citationIndex)
141
+ : allHitsSources.map((extraction) => extraction.citationIndex);
142
+ const hitsConfidence = weightedConfidence(allHitsSources);
143
+ const hitsWithLocation = positiveHitsSources
144
+ .filter((extraction) => extraction.hitLocation)
145
+ .sort((a, b) => b.confidence - a.confidence);
146
+ const hitLocation = hitsWithLocation[0]?.hitLocation;
147
+ const hitType = hitsWithLocation[0]?.hitType;
148
+ const hitsWithDetail = positiveHitsSources
149
+ .filter((extraction) => extraction.hitDetail)
150
+ .sort((a, b) => b.confidence - a.confidence);
151
+ const hitDetail = hitsWithDetail[0]?.hitDetail;
152
+ const noImpactSources = allHitsSources.filter((extraction) => extraction.hitsConfirmed === 0);
153
+ const noImpacts = noImpactSources.length > 0 && hitsConfirmed === 0;
154
+ const noImpactsCitations = noImpactSources.map((extraction) => extraction.citationIndex);
155
+ const casualtySources = indexed.filter((extraction) => extraction.casualties && extraction.casualties > 0);
156
+ const casualtyValues = casualtySources
157
+ .map((extraction) => extraction.casualties)
158
+ .sort((a, b) => a - b);
159
+ const casualties = casualtyValues.length > 0
160
+ ? casualtyValues[Math.floor(casualtyValues.length / 2)]
161
+ : undefined;
162
+ const casualtiesCitations = casualtySources.map((extraction) => extraction.citationIndex);
163
+ const casualtiesConfidence = weightedConfidence(casualtySources);
164
+ const injurySources = indexed.filter((extraction) => extraction.injuries !== undefined && extraction.injuries > 0);
165
+ const injuryValues = injurySources
166
+ .map((extraction) => extraction.injuries)
167
+ .sort((a, b) => a - b);
168
+ const injuries = injuryValues.length > 0
169
+ ? injuryValues[Math.floor(injuryValues.length / 2)]
170
+ : undefined;
171
+ const injuriesCitations = injurySources.map((extraction) => extraction.citationIndex);
172
+ const injuriesConfidence = weightedConfidence(injurySources);
173
+ const injuryCauseValues = injurySources
174
+ .map((extraction) => extraction.injuriesCause)
175
+ .filter((value) => value !== undefined);
176
+ const rocketCauseCount = injuryCauseValues.filter((value) => value === "rocket").length;
177
+ const shelterCauseCount = injuryCauseValues.filter((value) => value === "rushing_to_shelter").length;
178
+ const injuriesCause = injuryCauseValues.length === 0
179
+ ? undefined
180
+ : rocketCauseCount >= shelterCauseCount
181
+ ? "rocket"
182
+ : "rushing_to_shelter";
183
+ const totalWeight = indexed.reduce((accumulator, extraction) => accumulator + extraction.sourceTrust * extraction.confidence, 0);
184
+ const weightedConfidenceValue = totalWeight / indexed.length;
185
+ const voted = {
186
+ etaRefinedMinutes: bestEtaSource?.etaRefinedMinutes,
187
+ etaCitations: bestEtaSource ? [bestEtaSource.citationIndex] : [],
188
+ countryOrigins: countryOrigins ?? [],
189
+ rocketCountMin: rocketCountMin,
190
+ rocketCountMax: rocketCountMax,
191
+ rocketCitations: rocketCitations,
192
+ rocketConfidence: rocketConfidence,
193
+ rocketDetail: rocketDetail,
194
+ isCassette: isCassette,
195
+ isCassetteConfidence: cassetteConfidence,
196
+ intercepted,
197
+ interceptedQual: interceptedQual,
198
+ interceptedConfidence: interceptedConfidence,
199
+ seaImpact: seaImpact,
200
+ seaImpactQual: seaImpactQual,
201
+ seaConfidence: seaConfidence,
202
+ openAreaImpact: openAreaImpact,
203
+ openAreaImpactQual: openAreaImpactQual,
204
+ openAreaConfidence: openAreaConfidence,
205
+ hitsConfirmed: hitsConfirmed,
206
+ hitsCitations: hitsCitations,
207
+ hitsConfidence: hitsConfidence,
208
+ hitLocation: hitLocation,
209
+ hitType: hitType,
210
+ hitDetail: hitDetail,
211
+ noImpacts: noImpacts,
212
+ noImpactsCitations: noImpactsCitations,
213
+ interceptedCitations: interceptedSources.map((extraction) => extraction.citationIndex),
214
+ casualties,
215
+ casualtiesCitations: casualtiesCitations,
216
+ casualtiesConfidence: casualtiesConfidence,
217
+ injuries,
218
+ injuriesCause: injuriesCause,
219
+ injuriesCitations: injuriesCitations,
220
+ injuriesConfidence: injuriesConfidence,
221
+ confidence: Math.round(weightedConfidenceValue * 100) / 100,
222
+ sourcesCount: indexed.length,
223
+ citedSources,
224
+ };
225
+ logger.info("Agent: voted", { alertId, voted });
226
+ return voted;
227
+ }
228
+ export const voteNode = (state) => {
229
+ return { votedResult: aggregateVote(state.extractions, state.alertId) };
230
+ };
231
+ export const vote = aggregateVote;
232
+ //# sourceMappingURL=vote.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"vote.js","sourceRoot":"","sources":["../../src/nodes/vote.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,15 @@
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
@@ -0,0 +1 @@
1
+ {"version":3,"file":"queue.d.ts","sourceRoot":"","sources":["../src/queue.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAIH,OAAO,EAAE,KAAK,EAAE,MAAM,QAAQ,CAAC;AAE/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,CAUf"}
package/dist/queue.js ADDED
@@ -0,0 +1,41 @@
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 * as logger from "@easyoref/monitoring";
9
+ import { config } from "@easyoref/shared";
10
+ import { Queue } from "bullmq";
11
+ let _queue = undefined;
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
@@ -0,0 +1 @@
1
+ {"version":3,"file":"queue.js","sourceRoot":"","sources":["../src/queue.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,KAAK,MAAM,MAAM,sBAAsB,CAAC;AAC/C,OAAO,EAAE,MAAM,EAAE,MAAM,kBAAkB,CAAC;AAC1C,OAAO,EAAE,KAAK,EAAE,MAAM,QAAQ,CAAC;AAO/B,IAAI,MAAM,GAAqC,SAAS,CAAC;AAEzD,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,CAAC,QAAQ,EAAE,EAAE,OAAO,EAAE,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,CAAC,CAAC;IAC3D,MAAM,CAAC,IAAI,CAAC,qBAAqB,EAAE;QACjC,OAAO;QACP,QAAQ,EAAE,KAAK;KAChB,CAAC,CAAC;AACL,CAAC"}
@@ -0,0 +1,8 @@
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
@@ -0,0 +1 @@
1
+ {"version":3,"file":"redis.d.ts","sourceRoot":"","sources":["../src/redis.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAIH,OAAO,EAAE,KAAK,IAAI,OAAO,EAAE,MAAM,SAAS,CAAC;AAI3C,wBAAgB,QAAQ,IAAI,OAAO,CAmBlC;AAED,wBAAsB,UAAU,IAAI,OAAO,CAAC,IAAI,CAAC,CAKhD"}
package/dist/redis.js ADDED
@@ -0,0 +1,33 @@
1
+ /**
2
+ * Redis singleton (ioredis).
3
+ * Lazily initialized so the main bot still works when agent.enabled=false.
4
+ */
5
+ import * as logger from "@easyoref/monitoring";
6
+ import { config } from "@easyoref/shared";
7
+ import { Redis as IORedis } from "ioredis";
8
+ let _redis = undefined;
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 = undefined;
31
+ }
32
+ }
33
+ //# sourceMappingURL=redis.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"redis.js","sourceRoot":"","sources":["../src/redis.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAAK,MAAM,MAAM,sBAAsB,CAAC;AAC/C,OAAO,EAAE,MAAM,EAAE,MAAM,kBAAkB,CAAC;AAC1C,OAAO,EAAE,KAAK,IAAI,OAAO,EAAE,MAAM,SAAS,CAAC;AAE3C,IAAI,MAAM,GAAwB,SAAS,CAAC;AAE5C,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,SAAS,CAAC;IACrB,CAAC;AACH,CAAC"}