easyoref 1.18.4 → 1.20.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (91) hide show
  1. package/dist/agent/extract.d.ts +5 -5
  2. package/dist/agent/extract.d.ts.map +1 -1
  3. package/dist/agent/extract.js +86 -110
  4. package/dist/agent/extract.js.map +1 -1
  5. package/dist/agent/types.d.ts.map +1 -1
  6. package/dist/agent/types.js +21 -30
  7. package/dist/agent/types.js.map +1 -1
  8. package/dist/bot.js +17 -19
  9. package/dist/bot.js.map +1 -1
  10. package/dist/gif-state.js +1 -1
  11. package/dist/gif-state.js.map +1 -1
  12. package/dist/init.js +1 -1
  13. package/dist/init.js.map +1 -1
  14. package/package.json +5 -9
  15. package/dist/agent/auth.d.ts +0 -11
  16. package/dist/agent/auth.d.ts.map +0 -1
  17. package/dist/agent/auth.js +0 -54
  18. package/dist/agent/auth.js.map +0 -1
  19. package/dist/agent/clarify.d.ts +0 -44
  20. package/dist/agent/clarify.d.ts.map +0 -1
  21. package/dist/agent/clarify.js +0 -284
  22. package/dist/agent/clarify.js.map +0 -1
  23. package/dist/agent/dry-run.d.ts +0 -12
  24. package/dist/agent/dry-run.d.ts.map +0 -1
  25. package/dist/agent/dry-run.js +0 -236
  26. package/dist/agent/dry-run.js.map +0 -1
  27. package/dist/agent/filters.d.ts +0 -48
  28. package/dist/agent/filters.d.ts.map +0 -1
  29. package/dist/agent/filters.js +0 -124
  30. package/dist/agent/filters.js.map +0 -1
  31. package/dist/agent/gramjs-monitor.d.ts +0 -26
  32. package/dist/agent/gramjs-monitor.d.ts.map +0 -1
  33. package/dist/agent/gramjs-monitor.js +0 -324
  34. package/dist/agent/gramjs-monitor.js.map +0 -1
  35. package/dist/agent/graph.d.ts +0 -30
  36. package/dist/agent/graph.d.ts.map +0 -1
  37. package/dist/agent/graph.js +0 -240
  38. package/dist/agent/graph.js.map +0 -1
  39. package/dist/agent/helpers.d.ts +0 -6
  40. package/dist/agent/helpers.d.ts.map +0 -1
  41. package/dist/agent/helpers.js +0 -15
  42. package/dist/agent/helpers.js.map +0 -1
  43. package/dist/agent/message.d.ts +0 -69
  44. package/dist/agent/message.d.ts.map +0 -1
  45. package/dist/agent/message.js +0 -464
  46. package/dist/agent/message.js.map +0 -1
  47. package/dist/agent/queue.d.ts +0 -15
  48. package/dist/agent/queue.d.ts.map +0 -1
  49. package/dist/agent/queue.js +0 -41
  50. package/dist/agent/queue.js.map +0 -1
  51. package/dist/agent/redis.d.ts +0 -8
  52. package/dist/agent/redis.d.ts.map +0 -1
  53. package/dist/agent/redis.js +0 -33
  54. package/dist/agent/redis.js.map +0 -1
  55. package/dist/agent/store.d.ts +0 -93
  56. package/dist/agent/store.d.ts.map +0 -1
  57. package/dist/agent/store.js +0 -145
  58. package/dist/agent/store.js.map +0 -1
  59. package/dist/agent/tools.d.ts +0 -159
  60. package/dist/agent/tools.d.ts.map +0 -1
  61. package/dist/agent/tools.js +0 -439
  62. package/dist/agent/tools.js.map +0 -1
  63. package/dist/agent/types.d.ts +0 -213
  64. package/dist/agent/vote.d.ts +0 -13
  65. package/dist/agent/vote.d.ts.map +0 -1
  66. package/dist/agent/vote.js +0 -226
  67. package/dist/agent/vote.js.map +0 -1
  68. package/dist/agent/worker.d.ts +0 -14
  69. package/dist/agent/worker.d.ts.map +0 -1
  70. package/dist/agent/worker.js +0 -137
  71. package/dist/agent/worker.js.map +0 -1
  72. package/dist/bin.d.ts +0 -17
  73. package/dist/bot.d.ts +0 -16
  74. package/dist/config.d.ts +0 -129
  75. package/dist/config.d.ts.map +0 -1
  76. package/dist/config.js +0 -157
  77. package/dist/config.js.map +0 -1
  78. package/dist/gif-state.d.ts +0 -17
  79. package/dist/i18n.d.ts +0 -49
  80. package/dist/i18n.d.ts.map +0 -1
  81. package/dist/i18n.js +0 -229
  82. package/dist/i18n.js.map +0 -1
  83. package/dist/init.d.ts +0 -7
  84. package/dist/logger.d.ts +0 -14
  85. package/dist/logger.d.ts.map +0 -1
  86. package/dist/logger.js +0 -45
  87. package/dist/logger.js.map +0 -1
  88. package/dist/service.d.ts +0 -19
  89. package/dist/service.d.ts.map +0 -1
  90. package/dist/service.js +0 -165
  91. package/dist/service.js.map +0 -1
@@ -1,124 +0,0 @@
1
- /**
2
- * Deterministic pre-filters — zero LLM tokens.
3
- *
4
- * Filters out noise:
5
- * - Pikud HaOref area list "простыни" (high comma count)
6
- * - Summary/recap posts with timestamp patterns "(HH:MM)", "X минут"
7
- * - IDF/Tsahal press releases (long official texts)
8
- *
9
- * Builds ChannelTracking structure for the LLM pipeline.
10
- */
11
- // ── Noise detectors ────────────────────────────────────
12
- const OREF_LINK_RE = /oref\.org\.il/i;
13
- const OREF_CHANNEL_RE = /pikud|פיקוד|oref/i;
14
- const IDF_CHANNEL_RE = /idf|צה"?ל|tsahal/i;
15
- /**
16
- * Pikud HaOref "простыня" — area list with many commas.
17
- */
18
- function isAreaListNoise(text) {
19
- if (OREF_LINK_RE.test(text))
20
- return true;
21
- const commaCount = (text.match(/,/g) || []).length;
22
- return commaCount >= 8;
23
- }
24
- /**
25
- * Summary/recap posts with timestamp patterns.
26
- * Real-time intel doesn't contain multiple "(HH:MM)" timestamps
27
- * or "X минут/минуты" duration references.
28
- */
29
- function isSummaryPost(text) {
30
- // Multiple "(HH:MM)" timestamps in one post = recap/summary
31
- const timeParenCount = (text.match(/\(\d{1,2}:\d{2}\)/g) || []).length;
32
- if (timeParenCount >= 2)
33
- return true;
34
- // "X минуты" / "X минут" — Russian time duration references (recap formatting)
35
- if (/\d+\s+минут[ыа]?\b/i.test(text))
36
- return true;
37
- return false;
38
- }
39
- /**
40
- * IDF/Tsahal press releases — long official texts (>400 chars from IDF channels).
41
- */
42
- function isIdfPressRelease(channel, text) {
43
- if (!IDF_CHANNEL_RE.test(channel))
44
- return false;
45
- return text.length > 400;
46
- }
47
- /**
48
- * Combined noise filter. Returns true if post should be filtered OUT.
49
- */
50
- export function isNoise(post) {
51
- // Pikud HaOref channels with long posts are area lists
52
- if (OREF_CHANNEL_RE.test(post.channel) && post.text.length > 300)
53
- return true;
54
- // Area list spam (any channel)
55
- if (isAreaListNoise(post.text))
56
- return true;
57
- // Summary/recap posts
58
- if (isSummaryPost(post.text))
59
- return true;
60
- // IDF press releases
61
- if (isIdfPressRelease(post.channel, post.text))
62
- return true;
63
- return false;
64
- }
65
- // ── Channel tracking structure ─────────────────────────
66
- function toTrackedMessage(post) {
67
- return {
68
- timestamp: post.ts,
69
- text: post.text,
70
- url: post.messageUrl,
71
- channel: post.channel,
72
- };
73
- }
74
- /**
75
- * Build ChannelTracking from session posts.
76
- *
77
- * Splits posts per channel into prev (already processed) and last (new).
78
- * Applies deterministic noise filter on all posts.
79
- * Only includes channels that have new (last) messages.
80
- */
81
- export function buildChannelTracking(posts, sessionStartTs, lastUpdateTs) {
82
- const channelMap = new Map();
83
- for (const post of posts) {
84
- if (isNoise(post))
85
- continue;
86
- if (post.ts < sessionStartTs)
87
- continue;
88
- if (!channelMap.has(post.channel)) {
89
- channelMap.set(post.channel, { prev: [], last: [] });
90
- }
91
- const bucket = channelMap.get(post.channel);
92
- const msg = toTrackedMessage(post);
93
- if (lastUpdateTs > 0 && post.ts <= lastUpdateTs) {
94
- bucket.prev.push(msg);
95
- }
96
- else {
97
- bucket.last.push(msg);
98
- }
99
- }
100
- const channels_with_updates = [];
101
- for (const [channel, { prev, last }] of channelMap) {
102
- if (last.length > 0) {
103
- channels_with_updates.push({
104
- channel,
105
- prev_tracked_messages: prev.sort((a, b) => a.timestamp - b.timestamp),
106
- last_tracked_messages: last.sort((a, b) => a.timestamp - b.timestamp),
107
- });
108
- }
109
- }
110
- return {
111
- track_start_timestamp: sessionStartTs,
112
- last_update_timestamp: lastUpdateTs,
113
- channels_with_updates,
114
- };
115
- }
116
- // ── Exported for testing ───────────────────────────────
117
- export const _test = {
118
- isAreaListNoise,
119
- isSummaryPost,
120
- isIdfPressRelease,
121
- isNoise,
122
- toTrackedMessage,
123
- };
124
- //# sourceMappingURL=filters.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"filters.js","sourceRoot":"","sources":["../../src/agent/filters.ts"],"names":[],"mappings":"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"}
@@ -1,26 +0,0 @@
1
- /**
2
- * GramJS MTProto channel monitor.
3
- *
4
- * Connects to Telegram as a user account (burner), joins/monitors
5
- * the configured public channels, and stores new messages in Redis
6
- * when there's an active alert window.
7
- *
8
- * Rate-limited: 1-2s/channel with ±500ms jitter to avoid bans.
9
- * Uses exponential backoff on flood errors.
10
- */
11
- export declare function startMonitor(): Promise<void>;
12
- export declare function stopMonitor(): Promise<void>;
13
- /**
14
- * Fetch recent messages from a public Telegram channel via MTProto.
15
- * Used by the telegram_mtproto_mcp_read_sources MCP tool.
16
- *
17
- * @param channel - Channel username with @ prefix (e.g. "@idf_telegram")
18
- * @param limit - Number of messages to fetch (1-20)
19
- * @returns Array of ChannelPost objects (newest first)
20
- */
21
- export declare function fetchRecentChannelPosts(channel: string, limit?: number): Promise<Array<{
22
- text: string;
23
- ts: number;
24
- messageUrl?: string;
25
- }>>;
26
- //# sourceMappingURL=gramjs-monitor.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"gramjs-monitor.d.ts","sourceRoot":"","sources":["../../src/agent/gramjs-monitor.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAgEH,wBAAsB,YAAY,IAAI,OAAO,CAAC,IAAI,CAAC,CAgKlD;AAiGD,wBAAsB,WAAW,IAAI,OAAO,CAAC,IAAI,CAAC,CAMjD;AAID;;;;;;;GAOG;AACH,wBAAsB,uBAAuB,CAC3C,OAAO,EAAE,MAAM,EACf,KAAK,GAAE,MAAU,GAChB,OAAO,CAAC,KAAK,CAAC;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,EAAE,EAAE,MAAM,CAAC;IAAC,UAAU,CAAC,EAAE,MAAM,CAAA;CAAE,CAAC,CAAC,CA+BnE"}
@@ -1,324 +0,0 @@
1
- /**
2
- * GramJS MTProto channel monitor.
3
- *
4
- * Connects to Telegram as a user account (burner), joins/monitors
5
- * the configured public channels, and stores new messages in Redis
6
- * when there's an active alert window.
7
- *
8
- * Rate-limited: 1-2s/channel with ±500ms jitter to avoid bans.
9
- * Uses exponential backoff on flood errors.
10
- */
11
- import { Api, TelegramClient } from "telegram";
12
- import { NewMessage } from "telegram/events/index.js";
13
- import { StringSession } from "telegram/sessions/index.js";
14
- import { config } from "../config.js";
15
- import * as logger from "../logger.js";
16
- import { getActiveAlert, pushChannelPost } from "./store.js";
17
- let _client = null;
18
- // ── Monitored channels (hardcoded) ────────────────────
19
- const MONITORED_CHANNELS = [
20
- // Original 5 channels
21
- "@newsflashhhj",
22
- "@yediotnews25",
23
- "@Trueisrael",
24
- "@israelsecurity",
25
- "@N12LIVE",
26
- // New channels added 2026-03-07
27
- "@moriahdoron",
28
- "@divuhim1234",
29
- "@GLOBAL_Telegram_MOKED",
30
- "@pkpoi",
31
- "@lieldaphna",
32
- "@News_cabinet_news",
33
- "@yaronyanir1299",
34
- "@ynetalerts",
35
- "@idf_telegram",
36
- "@israel_9", // 9tv — Israeli news channel
37
- ];
38
- const PRIVATE_CHANNELS = [
39
- {
40
- inviteHash: "AmLhsj0A5YJbpv0XtJQENg",
41
- channelId: "1023468930",
42
- title: "Private Intel Group",
43
- },
44
- ];
45
- // ── Helpers ────────────────────────────────────────────
46
- function sleep(ms) {
47
- return new Promise((r) => setTimeout(r, ms));
48
- }
49
- function jitter(baseMs) {
50
- return baseMs + Math.random() * 500 - 250;
51
- }
52
- // ── Client ─────────────────────────────────────────────
53
- export async function startMonitor() {
54
- if (!config.agent.enabled)
55
- return;
56
- const { apiId, apiHash, sessionString } = config.agent.mtproto;
57
- if (!apiId || !apiHash) {
58
- logger.warn("GramJS: api_id or api_hash not set — MTProto monitor disabled");
59
- return;
60
- }
61
- const session = new StringSession(sessionString || "");
62
- const clientOpts = {
63
- connectionRetries: 5,
64
- retryDelay: 2000,
65
- autoReconnect: true,
66
- deviceModel: "Desktop",
67
- appVersion: "1.0.0",
68
- systemVersion: "macOS 14",
69
- langCode: "en",
70
- };
71
- // SOCKS5 proxy support
72
- if (config.agent.socks5Proxy) {
73
- try {
74
- const proxyUrl = new URL(config.agent.socks5Proxy);
75
- clientOpts.proxy = {
76
- socksType: 5,
77
- ip: proxyUrl.hostname,
78
- port: Number(proxyUrl.port),
79
- username: proxyUrl.username || undefined,
80
- password: proxyUrl.password || undefined,
81
- };
82
- logger.info("GramJS: SOCKS5 proxy configured", {
83
- host: proxyUrl.hostname,
84
- });
85
- }
86
- catch {
87
- logger.warn("GramJS: invalid socks5_proxy URL, ignoring");
88
- }
89
- }
90
- // eslint-disable-next-line @typescript-eslint/no-explicit-any
91
- _client = new TelegramClient(session, apiId, apiHash, clientOpts);
92
- if (!sessionString) {
93
- logger.warn("GramJS: no session_string configured. Run `npx tsx src/agent/auth.ts` first.");
94
- return;
95
- }
96
- try {
97
- await _client.connect();
98
- logger.info("GramJS: connected to Telegram MTProto");
99
- }
100
- catch (err) {
101
- logger.error("GramJS: connection failed", { error: String(err) });
102
- return;
103
- }
104
- // Get all dialogs to check existing memberships
105
- let existingChannels = new Set();
106
- let existingPrivateIds = new Set();
107
- try {
108
- const dialogs = await _client.getDialogs({ limit: 200 });
109
- for (const dialog of dialogs) {
110
- const entity = dialog.entity;
111
- // Public channel username
112
- if (entity && "username" in entity && entity.username) {
113
- existingChannels.add(String(entity.username).toLowerCase());
114
- }
115
- // Private channel ID
116
- if (entity && "id" in entity) {
117
- existingPrivateIds.add(String(entity.id));
118
- }
119
- }
120
- logger.info("GramJS: fetched existing dialogs", {
121
- total: dialogs.length,
122
- });
123
- }
124
- catch (err) {
125
- logger.warn("GramJS: failed to fetch dialogs, will try joining anyway", {
126
- error: String(err),
127
- });
128
- }
129
- // Auto-join all monitored public channels (required for NewMessage events)
130
- for (const ch of MONITORED_CHANNELS) {
131
- const username = ch.replace("@", "");
132
- const normalizedUsername = username.toLowerCase();
133
- // Check if already a member
134
- if (existingChannels.has(normalizedUsername)) {
135
- logger.debug("GramJS: already in channel", { channel: ch });
136
- continue;
137
- }
138
- try {
139
- await _client.invoke(new Api.channels.JoinChannel({ channel: username }));
140
- logger.info("GramJS: joined channel", { channel: ch });
141
- }
142
- catch (err) {
143
- const errStr = String(err);
144
- if (errStr.includes("USER_ALREADY_PARTICIPANT")) {
145
- logger.debug("GramJS: already in channel (via API)", { channel: ch });
146
- }
147
- else {
148
- logger.warn("GramJS: failed to join channel", {
149
- channel: ch,
150
- error: errStr,
151
- });
152
- }
153
- }
154
- // Rate limit: 1-2s between joins
155
- await sleep(jitter(1500));
156
- }
157
- // Auto-join private channels via invite hash
158
- for (const priv of PRIVATE_CHANNELS) {
159
- // Check if already a member by channel ID
160
- if (existingPrivateIds.has(priv.channelId)) {
161
- logger.debug("GramJS: already in private channel", { title: priv.title });
162
- continue;
163
- }
164
- try {
165
- await _client.invoke(new Api.messages.ImportChatInvite({ hash: priv.inviteHash }));
166
- logger.info("GramJS: joined private channel", { title: priv.title });
167
- }
168
- catch (err) {
169
- const errStr = String(err);
170
- if (errStr.includes("USER_ALREADY_PARTICIPANT") ||
171
- errStr.includes("INVITE_HASH_EXPIRED")) {
172
- logger.debug("GramJS: already in private channel or hash expired", {
173
- title: priv.title,
174
- });
175
- }
176
- else {
177
- logger.warn("GramJS: failed to join private channel", {
178
- title: priv.title,
179
- error: errStr,
180
- });
181
- }
182
- }
183
- // Rate limit: 1-2s between joins
184
- await sleep(jitter(1500));
185
- }
186
- // Subscribe to new messages across all monitored channels
187
- _client.addEventHandler(async (event) => {
188
- await handleNewMessage(event).catch((err) => {
189
- logger.warn("GramJS: handler error", { error: String(err) });
190
- });
191
- }, new NewMessage({}));
192
- logger.info("GramJS: monitoring channels", {
193
- public: MONITORED_CHANNELS.length,
194
- private: PRIVATE_CHANNELS.length,
195
- });
196
- }
197
- async function handleNewMessage(event) {
198
- const msg = event.message;
199
- if (!msg?.text || !msg.peerId) {
200
- logger.debug("GramJS: skipped message (no text or peerId)");
201
- return;
202
- }
203
- // Get channel identifier (username or title)
204
- let channel = "";
205
- let channelId = ""; // for private channels
206
- let isPrivate = false;
207
- try {
208
- const chat = await event.message.getChat();
209
- // Try to extract channel ID from peerId (for private channels)
210
- if (msg.peerId && "channelId" in msg.peerId) {
211
- // channelId is stored as bigint, convert to string
212
- const rawId = String(msg.peerId.channelId);
213
- channelId = rawId;
214
- }
215
- // Check if it's a monitored private channel
216
- const privateMatch = PRIVATE_CHANNELS.find((p) => p.channelId === channelId);
217
- if (privateMatch) {
218
- channel = privateMatch.title;
219
- isPrivate = true;
220
- }
221
- else if (chat && "username" in chat && chat.username) {
222
- channel = `@${chat.username}`;
223
- }
224
- else if (chat && "title" in chat && chat.title) {
225
- channel = String(chat.title);
226
- }
227
- else {
228
- logger.debug("GramJS: skipped message (unidentifiable chat)");
229
- return; // Not a channel we can identify
230
- }
231
- }
232
- catch {
233
- return;
234
- }
235
- // Only care about configured channels (public or private)
236
- const normalizedChannel = channel.toLowerCase();
237
- const isMonitored = isPrivate ||
238
- MONITORED_CHANNELS.some((c) => c.toLowerCase() === normalizedChannel ||
239
- c.toLowerCase().replace("@", "") === normalizedChannel.replace("@", ""));
240
- if (!isMonitored) {
241
- logger.debug("GramJS: skipped message (not monitored)", {
242
- channel,
243
- channelId,
244
- });
245
- return;
246
- }
247
- // Only store if there's an active alert window
248
- const active = await getActiveAlert();
249
- if (!active) {
250
- logger.debug("GramJS: skipped message (no active alert)", { channel });
251
- return;
252
- }
253
- // Anti-flood: jittered delay
254
- await sleep(jitter(1000));
255
- // Build direct message URL
256
- let messageUrl;
257
- if (isPrivate) {
258
- // Private channel: https://t.me/c/1023468930/123
259
- messageUrl = `https://t.me/c/${channelId}/${msg.id}`;
260
- }
261
- else {
262
- // Public channel: https://t.me/username/123
263
- const username = channel.replace("@", "");
264
- messageUrl = `https://t.me/${username}/${msg.id}`;
265
- }
266
- await pushChannelPost(active.alertId, {
267
- channel,
268
- text: msg.text,
269
- ts: Date.now(),
270
- messageUrl,
271
- });
272
- logger.info("GramJS: stored channel post", {
273
- channel,
274
- alertId: active.alertId,
275
- text_len: msg.text.length,
276
- private: isPrivate,
277
- });
278
- }
279
- export async function stopMonitor() {
280
- if (_client) {
281
- await _client.disconnect();
282
- _client = null;
283
- logger.info("GramJS: disconnected");
284
- }
285
- }
286
- // ── Fetch recent posts (used by MCP tools) ─────────────
287
- /**
288
- * Fetch recent messages from a public Telegram channel via MTProto.
289
- * Used by the telegram_mtproto_mcp_read_sources MCP tool.
290
- *
291
- * @param channel - Channel username with @ prefix (e.g. "@idf_telegram")
292
- * @param limit - Number of messages to fetch (1-20)
293
- * @returns Array of ChannelPost objects (newest first)
294
- */
295
- export async function fetchRecentChannelPosts(channel, limit = 5) {
296
- if (!_client?.connected) {
297
- logger.warn("GramJS: fetchRecentChannelPosts — client not connected");
298
- return [];
299
- }
300
- const username = channel.replace("@", "");
301
- const safeLimit = Math.min(Math.max(limit, 1), 20);
302
- try {
303
- // Rate limit: jittered delay before fetching
304
- await sleep(jitter(1000));
305
- const messages = await _client.getMessages(username, {
306
- limit: safeLimit,
307
- });
308
- return messages
309
- .filter((msg) => msg.text)
310
- .map((msg) => ({
311
- text: msg.text ?? "",
312
- ts: msg.date ? msg.date * 1000 : Date.now(),
313
- messageUrl: `https://t.me/${username}/${msg.id}`,
314
- }));
315
- }
316
- catch (err) {
317
- logger.warn("GramJS: fetchRecentChannelPosts failed", {
318
- channel,
319
- error: String(err),
320
- });
321
- return [];
322
- }
323
- }
324
- //# sourceMappingURL=gramjs-monitor.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"gramjs-monitor.js","sourceRoot":"","sources":["../../src/agent/gramjs-monitor.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,OAAO,EAAE,GAAG,EAAE,cAAc,EAAE,MAAM,UAAU,CAAC;AAC/C,OAAO,EAAE,UAAU,EAAE,MAAM,0BAA0B,CAAC;AAEtD,OAAO,EAAE,aAAa,EAAE,MAAM,4BAA4B,CAAC;AAC3D,OAAO,EAAE,MAAM,EAAE,MAAM,cAAc,CAAC;AACtC,OAAO,KAAK,MAAM,MAAM,cAAc,CAAC;AACvC,OAAO,EAAE,cAAc,EAAE,eAAe,EAAE,MAAM,YAAY,CAAC;AAK7D,IAAI,OAAO,GAA0B,IAAI,CAAC;AAE1C,yDAAyD;AAEzD,MAAM,kBAAkB,GAAG;IACzB,sBAAsB;IACtB,eAAe;IACf,eAAe;IACf,aAAa;IACb,iBAAiB;IACjB,UAAU;IACV,gCAAgC;IAChC,cAAc;IACd,cAAc;IACd,wBAAwB;IACxB,QAAQ;IACR,aAAa;IACb,oBAAoB;IACpB,iBAAiB;IACjB,aAAa;IACb,eAAe;IACf,WAAW,EAAE,6BAA6B;CAC3C,CAAC;AASF,MAAM,gBAAgB,GAAqB;IACzC;QACE,UAAU,EAAE,wBAAwB;QACpC,SAAS,EAAE,YAAY;QACvB,KAAK,EAAE,qBAAqB;KAC7B;CACF,CAAC;AAEF,0DAA0D;AAE1D,SAAS,KAAK,CAAC,EAAU;IACvB,OAAO,IAAI,OAAO,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,UAAU,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC;AAC/C,CAAC;AAED,SAAS,MAAM,CAAC,MAAc;IAC5B,OAAO,MAAM,GAAG,IAAI,CAAC,MAAM,EAAE,GAAG,GAAG,GAAG,GAAG,CAAC;AAC5C,CAAC;AAED,0DAA0D;AAE1D,MAAM,CAAC,KAAK,UAAU,YAAY;IAChC,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,OAAO;QAAE,OAAO;IAElC,MAAM,EAAE,KAAK,EAAE,OAAO,EAAE,aAAa,EAAE,GAAG,MAAM,CAAC,KAAK,CAAC,OAAO,CAAC;IAE/D,IAAI,CAAC,KAAK,IAAI,CAAC,OAAO,EAAE,CAAC;QACvB,MAAM,CAAC,IAAI,CACT,+DAA+D,CAChE,CAAC;QACF,OAAO;IACT,CAAC;IAED,MAAM,OAAO,GAAG,IAAI,aAAa,CAAC,aAAa,IAAI,EAAE,CAAC,CAAC;IAEvD,MAAM,UAAU,GAAY;QAC1B,iBAAiB,EAAE,CAAC;QACpB,UAAU,EAAE,IAAI;QAChB,aAAa,EAAE,IAAI;QACnB,WAAW,EAAE,SAAS;QACtB,UAAU,EAAE,OAAO;QACnB,aAAa,EAAE,UAAU;QACzB,QAAQ,EAAE,IAAI;KACf,CAAC;IAEF,uBAAuB;IACvB,IAAI,MAAM,CAAC,KAAK,CAAC,WAAW,EAAE,CAAC;QAC7B,IAAI,CAAC;YACH,MAAM,QAAQ,GAAG,IAAI,GAAG,CAAC,MAAM,CAAC,KAAK,CAAC,WAAW,CAAC,CAAC;YACnD,UAAU,CAAC,KAAK,GAAG;gBACjB,SAAS,EAAE,CAAC;gBACZ,EAAE,EAAE,QAAQ,CAAC,QAAQ;gBACrB,IAAI,EAAE,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC;gBAC3B,QAAQ,EAAE,QAAQ,CAAC,QAAQ,IAAI,SAAS;gBACxC,QAAQ,EAAE,QAAQ,CAAC,QAAQ,IAAI,SAAS;aACzC,CAAC;YACF,MAAM,CAAC,IAAI,CAAC,iCAAiC,EAAE;gBAC7C,IAAI,EAAE,QAAQ,CAAC,QAAQ;aACxB,CAAC,CAAC;QACL,CAAC;QAAC,MAAM,CAAC;YACP,MAAM,CAAC,IAAI,CAAC,4CAA4C,CAAC,CAAC;QAC5D,CAAC;IACH,CAAC;IAED,8DAA8D;IAC9D,OAAO,GAAG,IAAI,cAAc,CAAC,OAAO,EAAE,KAAK,EAAE,OAAO,EAAE,UAAiB,CAAC,CAAC;IAEzE,IAAI,CAAC,aAAa,EAAE,CAAC;QACnB,MAAM,CAAC,IAAI,CACT,8EAA8E,CAC/E,CAAC;QACF,OAAO;IACT,CAAC;IAED,IAAI,CAAC;QACH,MAAM,OAAO,CAAC,OAAO,EAAE,CAAC;QACxB,MAAM,CAAC,IAAI,CAAC,uCAAuC,CAAC,CAAC;IACvD,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,MAAM,CAAC,KAAK,CAAC,2BAA2B,EAAE,EAAE,KAAK,EAAE,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QAClE,OAAO;IACT,CAAC;IAED,gDAAgD;IAChD,IAAI,gBAAgB,GAAgB,IAAI,GAAG,EAAE,CAAC;IAC9C,IAAI,kBAAkB,GAAgB,IAAI,GAAG,EAAE,CAAC;IAEhD,IAAI,CAAC;QACH,MAAM,OAAO,GAAG,MAAM,OAAO,CAAC,UAAU,CAAC,EAAE,KAAK,EAAE,GAAG,EAAE,CAAC,CAAC;QACzD,KAAK,MAAM,MAAM,IAAI,OAAO,EAAE,CAAC;YAC7B,MAAM,MAAM,GAAG,MAAM,CAAC,MAAM,CAAC;YAC7B,0BAA0B;YAC1B,IAAI,MAAM,IAAI,UAAU,IAAI,MAAM,IAAI,MAAM,CAAC,QAAQ,EAAE,CAAC;gBACtD,gBAAgB,CAAC,GAAG,CAAC,MAAM,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,WAAW,EAAE,CAAC,CAAC;YAC9D,CAAC;YACD,qBAAqB;YACrB,IAAI,MAAM,IAAI,IAAI,IAAI,MAAM,EAAE,CAAC;gBAC7B,kBAAkB,CAAC,GAAG,CAAC,MAAM,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,CAAC;YAC5C,CAAC;QACH,CAAC;QACD,MAAM,CAAC,IAAI,CAAC,kCAAkC,EAAE;YAC9C,KAAK,EAAE,OAAO,CAAC,MAAM;SACtB,CAAC,CAAC;IACL,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,MAAM,CAAC,IAAI,CAAC,0DAA0D,EAAE;YACtE,KAAK,EAAE,MAAM,CAAC,GAAG,CAAC;SACnB,CAAC,CAAC;IACL,CAAC;IAED,2EAA2E;IAC3E,KAAK,MAAM,EAAE,IAAI,kBAAkB,EAAE,CAAC;QACpC,MAAM,QAAQ,GAAG,EAAE,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC;QACrC,MAAM,kBAAkB,GAAG,QAAQ,CAAC,WAAW,EAAE,CAAC;QAElD,4BAA4B;QAC5B,IAAI,gBAAgB,CAAC,GAAG,CAAC,kBAAkB,CAAC,EAAE,CAAC;YAC7C,MAAM,CAAC,KAAK,CAAC,4BAA4B,EAAE,EAAE,OAAO,EAAE,EAAE,EAAE,CAAC,CAAC;YAC5D,SAAS;QACX,CAAC;QAED,IAAI,CAAC;YACH,MAAM,OAAO,CAAC,MAAM,CAAC,IAAI,GAAG,CAAC,QAAQ,CAAC,WAAW,CAAC,EAAE,OAAO,EAAE,QAAQ,EAAE,CAAC,CAAC,CAAC;YAC1E,MAAM,CAAC,IAAI,CAAC,wBAAwB,EAAE,EAAE,OAAO,EAAE,EAAE,EAAE,CAAC,CAAC;QACzD,CAAC;QAAC,OAAO,GAAY,EAAE,CAAC;YACtB,MAAM,MAAM,GAAG,MAAM,CAAC,GAAG,CAAC,CAAC;YAC3B,IAAI,MAAM,CAAC,QAAQ,CAAC,0BAA0B,CAAC,EAAE,CAAC;gBAChD,MAAM,CAAC,KAAK,CAAC,sCAAsC,EAAE,EAAE,OAAO,EAAE,EAAE,EAAE,CAAC,CAAC;YACxE,CAAC;iBAAM,CAAC;gBACN,MAAM,CAAC,IAAI,CAAC,gCAAgC,EAAE;oBAC5C,OAAO,EAAE,EAAE;oBACX,KAAK,EAAE,MAAM;iBACd,CAAC,CAAC;YACL,CAAC;QACH,CAAC;QACD,iCAAiC;QACjC,MAAM,KAAK,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC;IAC5B,CAAC;IAED,6CAA6C;IAC7C,KAAK,MAAM,IAAI,IAAI,gBAAgB,EAAE,CAAC;QACpC,0CAA0C;QAC1C,IAAI,kBAAkB,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,CAAC;YAC3C,MAAM,CAAC,KAAK,CAAC,oCAAoC,EAAE,EAAE,KAAK,EAAE,IAAI,CAAC,KAAK,EAAE,CAAC,CAAC;YAC1E,SAAS;QACX,CAAC;QAED,IAAI,CAAC;YACH,MAAM,OAAO,CAAC,MAAM,CAClB,IAAI,GAAG,CAAC,QAAQ,CAAC,gBAAgB,CAAC,EAAE,IAAI,EAAE,IAAI,CAAC,UAAU,EAAE,CAAC,CAC7D,CAAC;YACF,MAAM,CAAC,IAAI,CAAC,gCAAgC,EAAE,EAAE,KAAK,EAAE,IAAI,CAAC,KAAK,EAAE,CAAC,CAAC;QACvE,CAAC;QAAC,OAAO,GAAY,EAAE,CAAC;YACtB,MAAM,MAAM,GAAG,MAAM,CAAC,GAAG,CAAC,CAAC;YAC3B,IACE,MAAM,CAAC,QAAQ,CAAC,0BAA0B,CAAC;gBAC3C,MAAM,CAAC,QAAQ,CAAC,qBAAqB,CAAC,EACtC,CAAC;gBACD,MAAM,CAAC,KAAK,CAAC,oDAAoD,EAAE;oBACjE,KAAK,EAAE,IAAI,CAAC,KAAK;iBAClB,CAAC,CAAC;YACL,CAAC;iBAAM,CAAC;gBACN,MAAM,CAAC,IAAI,CAAC,wCAAwC,EAAE;oBACpD,KAAK,EAAE,IAAI,CAAC,KAAK;oBACjB,KAAK,EAAE,MAAM;iBACd,CAAC,CAAC;YACL,CAAC;QACH,CAAC;QACD,iCAAiC;QACjC,MAAM,KAAK,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC;IAC5B,CAAC;IAED,0DAA0D;IAC1D,OAAO,CAAC,eAAe,CAAC,KAAK,EAAE,KAAsB,EAAE,EAAE;QACvD,MAAM,gBAAgB,CAAC,KAAK,CAAC,CAAC,KAAK,CAAC,CAAC,GAAG,EAAE,EAAE;YAC1C,MAAM,CAAC,IAAI,CAAC,uBAAuB,EAAE,EAAE,KAAK,EAAE,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QAC/D,CAAC,CAAC,CAAC;IACL,CAAC,EAAE,IAAI,UAAU,CAAC,EAAE,CAAC,CAAC,CAAC;IAEvB,MAAM,CAAC,IAAI,CAAC,6BAA6B,EAAE;QACzC,MAAM,EAAE,kBAAkB,CAAC,MAAM;QACjC,OAAO,EAAE,gBAAgB,CAAC,MAAM;KACjC,CAAC,CAAC;AACL,CAAC;AAED,KAAK,UAAU,gBAAgB,CAAC,KAAsB;IACpD,MAAM,GAAG,GAAG,KAAK,CAAC,OAAO,CAAC;IAC1B,IAAI,CAAC,GAAG,EAAE,IAAI,IAAI,CAAC,GAAG,CAAC,MAAM,EAAE,CAAC;QAC9B,MAAM,CAAC,KAAK,CAAC,6CAA6C,CAAC,CAAC;QAC5D,OAAO;IACT,CAAC;IAED,6CAA6C;IAC7C,IAAI,OAAO,GAAG,EAAE,CAAC;IACjB,IAAI,SAAS,GAAG,EAAE,CAAC,CAAC,uBAAuB;IAC3C,IAAI,SAAS,GAAG,KAAK,CAAC;IAEtB,IAAI,CAAC;QACH,MAAM,IAAI,GAAG,MAAM,KAAK,CAAC,OAAO,CAAC,OAAO,EAAE,CAAC;QAE3C,+DAA+D;QAC/D,IAAI,GAAG,CAAC,MAAM,IAAI,WAAW,IAAI,GAAG,CAAC,MAAM,EAAE,CAAC;YAC5C,mDAAmD;YACnD,MAAM,KAAK,GAAG,MAAM,CAAC,GAAG,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC;YAC3C,SAAS,GAAG,KAAK,CAAC;QACpB,CAAC;QAED,4CAA4C;QAC5C,MAAM,YAAY,GAAG,gBAAgB,CAAC,IAAI,CACxC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,SAAS,KAAK,SAAS,CACjC,CAAC;QACF,IAAI,YAAY,EAAE,CAAC;YACjB,OAAO,GAAG,YAAY,CAAC,KAAK,CAAC;YAC7B,SAAS,GAAG,IAAI,CAAC;QACnB,CAAC;aAAM,IAAI,IAAI,IAAI,UAAU,IAAI,IAAI,IAAI,IAAI,CAAC,QAAQ,EAAE,CAAC;YACvD,OAAO,GAAG,IAAI,IAAI,CAAC,QAAQ,EAAE,CAAC;QAChC,CAAC;aAAM,IAAI,IAAI,IAAI,OAAO,IAAI,IAAI,IAAI,IAAI,CAAC,KAAK,EAAE,CAAC;YACjD,OAAO,GAAG,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QAC/B,CAAC;aAAM,CAAC;YACN,MAAM,CAAC,KAAK,CAAC,+CAA+C,CAAC,CAAC;YAC9D,OAAO,CAAC,gCAAgC;QAC1C,CAAC;IACH,CAAC;IAAC,MAAM,CAAC;QACP,OAAO;IACT,CAAC;IAED,0DAA0D;IAC1D,MAAM,iBAAiB,GAAG,OAAO,CAAC,WAAW,EAAE,CAAC;IAChD,MAAM,WAAW,GACf,SAAS;QACT,kBAAkB,CAAC,IAAI,CACrB,CAAC,CAAC,EAAE,EAAE,CACJ,CAAC,CAAC,WAAW,EAAE,KAAK,iBAAiB;YACrC,CAAC,CAAC,WAAW,EAAE,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,CAAC,KAAK,iBAAiB,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,CAAC,CAC1E,CAAC;IAEJ,IAAI,CAAC,WAAW,EAAE,CAAC;QACjB,MAAM,CAAC,KAAK,CAAC,yCAAyC,EAAE;YACtD,OAAO;YACP,SAAS;SACV,CAAC,CAAC;QACH,OAAO;IACT,CAAC;IAED,+CAA+C;IAC/C,MAAM,MAAM,GAAG,MAAM,cAAc,EAAE,CAAC;IACtC,IAAI,CAAC,MAAM,EAAE,CAAC;QACZ,MAAM,CAAC,KAAK,CAAC,2CAA2C,EAAE,EAAE,OAAO,EAAE,CAAC,CAAC;QACvE,OAAO;IACT,CAAC;IAED,6BAA6B;IAC7B,MAAM,KAAK,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC;IAE1B,2BAA2B;IAC3B,IAAI,UAAkB,CAAC;IACvB,IAAI,SAAS,EAAE,CAAC;QACd,iDAAiD;QACjD,UAAU,GAAG,kBAAkB,SAAS,IAAI,GAAG,CAAC,EAAE,EAAE,CAAC;IACvD,CAAC;SAAM,CAAC;QACN,4CAA4C;QAC5C,MAAM,QAAQ,GAAG,OAAO,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC;QAC1C,UAAU,GAAG,gBAAgB,QAAQ,IAAI,GAAG,CAAC,EAAE,EAAE,CAAC;IACpD,CAAC;IAED,MAAM,eAAe,CAAC,MAAM,CAAC,OAAO,EAAE;QACpC,OAAO;QACP,IAAI,EAAE,GAAG,CAAC,IAAI;QACd,EAAE,EAAE,IAAI,CAAC,GAAG,EAAE;QACd,UAAU;KACX,CAAC,CAAC;IAEH,MAAM,CAAC,IAAI,CAAC,6BAA6B,EAAE;QACzC,OAAO;QACP,OAAO,EAAE,MAAM,CAAC,OAAO;QACvB,QAAQ,EAAE,GAAG,CAAC,IAAI,CAAC,MAAM;QACzB,OAAO,EAAE,SAAS;KACnB,CAAC,CAAC;AACL,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,WAAW;IAC/B,IAAI,OAAO,EAAE,CAAC;QACZ,MAAM,OAAO,CAAC,UAAU,EAAE,CAAC;QAC3B,OAAO,GAAG,IAAI,CAAC;QACf,MAAM,CAAC,IAAI,CAAC,sBAAsB,CAAC,CAAC;IACtC,CAAC;AACH,CAAC;AAED,0DAA0D;AAE1D;;;;;;;GAOG;AACH,MAAM,CAAC,KAAK,UAAU,uBAAuB,CAC3C,OAAe,EACf,QAAgB,CAAC;IAEjB,IAAI,CAAC,OAAO,EAAE,SAAS,EAAE,CAAC;QACxB,MAAM,CAAC,IAAI,CAAC,wDAAwD,CAAC,CAAC;QACtE,OAAO,EAAE,CAAC;IACZ,CAAC;IAED,MAAM,QAAQ,GAAG,OAAO,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC;IAC1C,MAAM,SAAS,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,KAAK,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;IAEnD,IAAI,CAAC;QACH,6CAA6C;QAC7C,MAAM,KAAK,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC;QAE1B,MAAM,QAAQ,GAAG,MAAM,OAAO,CAAC,WAAW,CAAC,QAAQ,EAAE;YACnD,KAAK,EAAE,SAAS;SACjB,CAAC,CAAC;QAEH,OAAO,QAAQ;aACZ,MAAM,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,CAAC,IAAI,CAAC;aACzB,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC;YACb,IAAI,EAAE,GAAG,CAAC,IAAI,IAAI,EAAE;YACpB,EAAE,EAAE,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,GAAG,CAAC,IAAI,GAAG,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,EAAE;YAC3C,UAAU,EAAE,gBAAgB,QAAQ,IAAI,GAAG,CAAC,EAAE,EAAE;SACjD,CAAC,CAAC,CAAC;IACR,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,MAAM,CAAC,IAAI,CAAC,wCAAwC,EAAE;YACpD,OAAO;YACP,KAAK,EAAE,MAAM,CAAC,GAAG,CAAC;SACnB,CAAC,CAAC;QACH,OAAO,EAAE,CAAC;IACZ,CAAC;AACH,CAAC"}
@@ -1,30 +0,0 @@
1
- /**
2
- * LangGraph.js enrichment pipeline — phase-aware, time-validated.
3
- *
4
- * Lean orchestrator: connects filter → extract → vote → edit.
5
- * All logic lives in dedicated modules:
6
- * - filters.ts: deterministic noise filter, channel tracking
7
- * - extract.ts: cheap LLM pre-filter, expensive extraction, post-filter
8
- * - vote.ts: consensus voting (deterministic)
9
- * - message.ts: message building, Telegram editing
10
- * - helpers.ts: toIsraelTime, textHash
11
- *
12
- * Pipeline:
13
- * collectAndFilter → extract → vote → [clarify → revote] → editMessage
14
- */
15
- import { type ChatMessage } from "./store.js";
16
- import type { AlertType } from "./types.js";
17
- export interface RunEnrichmentInput {
18
- alertId: string;
19
- alertTs: number;
20
- alertType: AlertType;
21
- alertAreas: string[];
22
- chatId: string;
23
- messageId: number;
24
- isCaption: boolean;
25
- chatMessages?: ChatMessage[];
26
- currentText: string;
27
- monitoringLabel?: string;
28
- }
29
- export declare function runEnrichment(input: RunEnrichmentInput): Promise<void>;
30
- //# sourceMappingURL=graph.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"graph.d.ts","sourceRoot":"","sources":["../../src/agent/graph.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAcH,OAAO,EAML,KAAK,WAAW,EACjB,MAAM,YAAY,CAAC;AACpB,OAAO,KAAK,EACV,SAAS,EAMV,MAAM,YAAY,CAAC;AAqQpB,MAAM,WAAW,kBAAkB;IACjC,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,EAAE,SAAS,CAAC;IACrB,UAAU,EAAE,MAAM,EAAE,CAAC;IACrB,MAAM,EAAE,MAAM,CAAC;IACf,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,OAAO,CAAC;IACnB,YAAY,CAAC,EAAE,WAAW,EAAE,CAAC;IAC7B,WAAW,EAAE,MAAM,CAAC;IACpB,eAAe,CAAC,EAAE,MAAM,CAAC;CAC1B;AAED,wBAAsB,aAAa,CAAC,KAAK,EAAE,kBAAkB,GAAG,OAAO,CAAC,IAAI,CAAC,CAqB5E"}