easyoref 1.18.5 → 1.20.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (91) hide show
  1. package/dist/agent/extract.d.ts +5 -5
  2. package/dist/agent/extract.d.ts.map +1 -1
  3. package/dist/agent/extract.js +77 -120
  4. package/dist/agent/extract.js.map +1 -1
  5. package/dist/agent/types.d.ts.map +1 -1
  6. package/dist/agent/types.js +21 -31
  7. package/dist/agent/types.js.map +1 -1
  8. package/dist/bot.js +17 -19
  9. package/dist/bot.js.map +1 -1
  10. package/dist/gif-state.js +1 -1
  11. package/dist/gif-state.js.map +1 -1
  12. package/dist/init.js +1 -1
  13. package/dist/init.js.map +1 -1
  14. package/package.json +5 -9
  15. package/dist/agent/auth.d.ts +0 -11
  16. package/dist/agent/auth.d.ts.map +0 -1
  17. package/dist/agent/auth.js +0 -54
  18. package/dist/agent/auth.js.map +0 -1
  19. package/dist/agent/clarify.d.ts +0 -44
  20. package/dist/agent/clarify.d.ts.map +0 -1
  21. package/dist/agent/clarify.js +0 -285
  22. package/dist/agent/clarify.js.map +0 -1
  23. package/dist/agent/dry-run.d.ts +0 -12
  24. package/dist/agent/dry-run.d.ts.map +0 -1
  25. package/dist/agent/dry-run.js +0 -236
  26. package/dist/agent/dry-run.js.map +0 -1
  27. package/dist/agent/filters.d.ts +0 -48
  28. package/dist/agent/filters.d.ts.map +0 -1
  29. package/dist/agent/filters.js +0 -124
  30. package/dist/agent/filters.js.map +0 -1
  31. package/dist/agent/gramjs-monitor.d.ts +0 -26
  32. package/dist/agent/gramjs-monitor.d.ts.map +0 -1
  33. package/dist/agent/gramjs-monitor.js +0 -325
  34. package/dist/agent/gramjs-monitor.js.map +0 -1
  35. package/dist/agent/graph.d.ts +0 -30
  36. package/dist/agent/graph.d.ts.map +0 -1
  37. package/dist/agent/graph.js +0 -240
  38. package/dist/agent/graph.js.map +0 -1
  39. package/dist/agent/helpers.d.ts +0 -6
  40. package/dist/agent/helpers.d.ts.map +0 -1
  41. package/dist/agent/helpers.js +0 -15
  42. package/dist/agent/helpers.js.map +0 -1
  43. package/dist/agent/message.d.ts +0 -69
  44. package/dist/agent/message.d.ts.map +0 -1
  45. package/dist/agent/message.js +0 -479
  46. package/dist/agent/message.js.map +0 -1
  47. package/dist/agent/queue.d.ts +0 -15
  48. package/dist/agent/queue.d.ts.map +0 -1
  49. package/dist/agent/queue.js +0 -41
  50. package/dist/agent/queue.js.map +0 -1
  51. package/dist/agent/redis.d.ts +0 -8
  52. package/dist/agent/redis.d.ts.map +0 -1
  53. package/dist/agent/redis.js +0 -33
  54. package/dist/agent/redis.js.map +0 -1
  55. package/dist/agent/store.d.ts +0 -93
  56. package/dist/agent/store.d.ts.map +0 -1
  57. package/dist/agent/store.js +0 -145
  58. package/dist/agent/store.js.map +0 -1
  59. package/dist/agent/tools.d.ts +0 -159
  60. package/dist/agent/tools.d.ts.map +0 -1
  61. package/dist/agent/tools.js +0 -439
  62. package/dist/agent/tools.js.map +0 -1
  63. package/dist/agent/types.d.ts +0 -218
  64. package/dist/agent/vote.d.ts +0 -13
  65. package/dist/agent/vote.d.ts.map +0 -1
  66. package/dist/agent/vote.js +0 -246
  67. package/dist/agent/vote.js.map +0 -1
  68. package/dist/agent/worker.d.ts +0 -14
  69. package/dist/agent/worker.d.ts.map +0 -1
  70. package/dist/agent/worker.js +0 -137
  71. package/dist/agent/worker.js.map +0 -1
  72. package/dist/bin.d.ts +0 -17
  73. package/dist/bot.d.ts +0 -16
  74. package/dist/config.d.ts +0 -129
  75. package/dist/config.d.ts.map +0 -1
  76. package/dist/config.js +0 -157
  77. package/dist/config.js.map +0 -1
  78. package/dist/gif-state.d.ts +0 -17
  79. package/dist/i18n.d.ts +0 -49
  80. package/dist/i18n.d.ts.map +0 -1
  81. package/dist/i18n.js +0 -229
  82. package/dist/i18n.js.map +0 -1
  83. package/dist/init.d.ts +0 -7
  84. package/dist/logger.d.ts +0 -14
  85. package/dist/logger.d.ts.map +0 -1
  86. package/dist/logger.js +0 -45
  87. package/dist/logger.js.map +0 -1
  88. package/dist/service.d.ts +0 -19
  89. package/dist/service.d.ts.map +0 -1
  90. package/dist/service.js +0 -165
  91. package/dist/service.js.map +0 -1
@@ -1,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;AAkFH,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,325 +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
- const SOCKS5_TYPE = 5;
18
- let _client = null;
19
- // ── Monitored channels (hardcoded) ────────────────────
20
- const MONITORED_CHANNELS = [
21
- // Original 5 channels
22
- "@newsflashhhj",
23
- "@yediotnews25",
24
- "@Trueisrael",
25
- "@israelsecurity",
26
- "@N12LIVE",
27
- // New channels added 2026-03-07
28
- "@moriahdoron",
29
- "@divuhim1234",
30
- "@GLOBAL_Telegram_MOKED",
31
- "@pkpoi",
32
- "@lieldaphna",
33
- "@News_cabinet_news",
34
- "@yaronyanir1299",
35
- "@ynetalerts",
36
- "@idf_telegram",
37
- "@israel_9", // 9tv — Israeli news channel
38
- ];
39
- const PRIVATE_CHANNELS = [
40
- {
41
- inviteHash: "AmLhsj0A5YJbpv0XtJQENg",
42
- channelId: "1023468930",
43
- title: "Private Intel Group",
44
- },
45
- ];
46
- // ── Helpers ────────────────────────────────────────────
47
- function sleep(ms) {
48
- return new Promise((r) => setTimeout(r, ms));
49
- }
50
- function jitter(baseMs) {
51
- return baseMs + Math.random() * 500 - 250;
52
- }
53
- // ── Client ─────────────────────────────────────────────
54
- export async function startMonitor() {
55
- if (!config.agent.enabled)
56
- return;
57
- const { apiId, apiHash, sessionString } = config.agent.mtproto;
58
- if (!apiId || !apiHash) {
59
- logger.warn("GramJS: api_id or api_hash not set — MTProto monitor disabled");
60
- return;
61
- }
62
- const session = new StringSession(sessionString || "");
63
- const clientOpts = {
64
- connectionRetries: 5,
65
- retryDelay: 2000,
66
- autoReconnect: true,
67
- deviceModel: "Desktop",
68
- appVersion: "1.0.0",
69
- systemVersion: "macOS 14",
70
- langCode: "en",
71
- proxy: undefined,
72
- };
73
- // SOCKS5 proxy support
74
- if (config.agent.socks5Proxy) {
75
- try {
76
- const proxyUrl = new URL(config.agent.socks5Proxy);
77
- clientOpts.proxy = {
78
- socksType: SOCKS5_TYPE,
79
- ip: proxyUrl.hostname,
80
- port: Number(proxyUrl.port),
81
- username: proxyUrl.username || undefined,
82
- password: proxyUrl.password || undefined,
83
- };
84
- logger.info("GramJS: SOCKS5 proxy configured", {
85
- host: proxyUrl.hostname,
86
- });
87
- }
88
- catch {
89
- logger.warn("GramJS: invalid socks5_proxy URL, ignoring");
90
- }
91
- }
92
- _client = new TelegramClient(session, apiId, apiHash, clientOpts);
93
- if (!sessionString) {
94
- logger.warn("GramJS: no session_string configured. Run `npx tsx src/agent/auth.ts` first.");
95
- return;
96
- }
97
- try {
98
- await _client.connect();
99
- logger.info("GramJS: connected to Telegram MTProto");
100
- }
101
- catch (err) {
102
- logger.error("GramJS: connection failed", { error: String(err) });
103
- return;
104
- }
105
- // Get all dialogs to check existing memberships
106
- let existingChannels = new Set();
107
- let existingPrivateIds = new Set();
108
- try {
109
- const dialogs = await _client.getDialogs({ limit: 200 });
110
- for (const dialog of dialogs) {
111
- const entity = dialog.entity;
112
- // Public channel username
113
- if (entity && "username" in entity && entity.username) {
114
- existingChannels.add(String(entity.username).toLowerCase());
115
- }
116
- // Private channel ID
117
- if (entity && "id" in entity) {
118
- existingPrivateIds.add(String(entity.id));
119
- }
120
- }
121
- logger.info("GramJS: fetched existing dialogs", {
122
- total: dialogs.length,
123
- });
124
- }
125
- catch (err) {
126
- logger.warn("GramJS: failed to fetch dialogs, will try joining anyway", {
127
- error: String(err),
128
- });
129
- }
130
- // Auto-join all monitored public channels (required for NewMessage events)
131
- for (const ch of MONITORED_CHANNELS) {
132
- const username = ch.replace("@", "");
133
- const normalizedUsername = username.toLowerCase();
134
- // Check if already a member
135
- if (existingChannels.has(normalizedUsername)) {
136
- logger.debug("GramJS: already in channel", { channel: ch });
137
- continue;
138
- }
139
- try {
140
- await _client.invoke(new Api.channels.JoinChannel({ channel: username }));
141
- logger.info("GramJS: joined channel", { channel: ch });
142
- }
143
- catch (err) {
144
- const errStr = String(err);
145
- if (errStr.includes("USER_ALREADY_PARTICIPANT")) {
146
- logger.debug("GramJS: already in channel (via API)", { channel: ch });
147
- }
148
- else {
149
- logger.warn("GramJS: failed to join channel", {
150
- channel: ch,
151
- error: errStr,
152
- });
153
- }
154
- }
155
- // Rate limit: 1-2s between joins
156
- await sleep(jitter(1500));
157
- }
158
- // Auto-join private channels via invite hash
159
- for (const priv of PRIVATE_CHANNELS) {
160
- // Check if already a member by channel ID
161
- if (existingPrivateIds.has(priv.channelId)) {
162
- logger.debug("GramJS: already in private channel", { title: priv.title });
163
- continue;
164
- }
165
- try {
166
- await _client.invoke(new Api.messages.ImportChatInvite({ hash: priv.inviteHash }));
167
- logger.info("GramJS: joined private channel", { title: priv.title });
168
- }
169
- catch (err) {
170
- const errStr = String(err);
171
- if (errStr.includes("USER_ALREADY_PARTICIPANT") ||
172
- errStr.includes("INVITE_HASH_EXPIRED")) {
173
- logger.debug("GramJS: already in private channel or hash expired", {
174
- title: priv.title,
175
- });
176
- }
177
- else {
178
- logger.warn("GramJS: failed to join private channel", {
179
- title: priv.title,
180
- error: errStr,
181
- });
182
- }
183
- }
184
- // Rate limit: 1-2s between joins
185
- await sleep(jitter(1500));
186
- }
187
- // Subscribe to new messages across all monitored channels
188
- _client.addEventHandler(async (event) => {
189
- await handleNewMessage(event).catch((err) => {
190
- logger.warn("GramJS: handler error", { error: String(err) });
191
- });
192
- }, new NewMessage({}));
193
- logger.info("GramJS: monitoring channels", {
194
- public: MONITORED_CHANNELS.length,
195
- private: PRIVATE_CHANNELS.length,
196
- });
197
- }
198
- async function handleNewMessage(event) {
199
- const msg = event.message;
200
- if (!msg?.text || !msg.peerId) {
201
- logger.debug("GramJS: skipped message (no text or peerId)");
202
- return;
203
- }
204
- // Get channel identifier (username or title)
205
- let channel = "";
206
- let channelId = ""; // for private channels
207
- let isPrivate = false;
208
- try {
209
- const chat = await event.message.getChat();
210
- // Try to extract channel ID from peerId (for private channels)
211
- if (msg.peerId && "channelId" in msg.peerId) {
212
- // channelId is stored as bigint, convert to string
213
- const rawId = String(msg.peerId.channelId);
214
- channelId = rawId;
215
- }
216
- // Check if it's a monitored private channel
217
- const privateMatch = PRIVATE_CHANNELS.find((p) => p.channelId === channelId);
218
- if (privateMatch) {
219
- channel = privateMatch.title;
220
- isPrivate = true;
221
- }
222
- else if (chat && "username" in chat && chat.username) {
223
- channel = `@${chat.username}`;
224
- }
225
- else if (chat && "title" in chat && chat.title) {
226
- channel = String(chat.title);
227
- }
228
- else {
229
- logger.debug("GramJS: skipped message (unidentifiable chat)");
230
- return; // Not a channel we can identify
231
- }
232
- }
233
- catch {
234
- return;
235
- }
236
- // Only care about configured channels (public or private)
237
- const normalizedChannel = channel.toLowerCase();
238
- const isMonitored = isPrivate ||
239
- MONITORED_CHANNELS.some((c) => c.toLowerCase() === normalizedChannel ||
240
- c.toLowerCase().replace("@", "") === normalizedChannel.replace("@", ""));
241
- if (!isMonitored) {
242
- logger.debug("GramJS: skipped message (not monitored)", {
243
- channel,
244
- channelId,
245
- });
246
- return;
247
- }
248
- // Only store if there's an active alert window
249
- const active = await getActiveAlert();
250
- if (!active) {
251
- logger.debug("GramJS: skipped message (no active alert)", { channel });
252
- return;
253
- }
254
- // Anti-flood: jittered delay
255
- await sleep(jitter(1000));
256
- // Build direct message URL
257
- let messageUrl;
258
- if (isPrivate) {
259
- // Private channel: https://t.me/c/1023468930/123
260
- messageUrl = `https://t.me/c/${channelId}/${msg.id}`;
261
- }
262
- else {
263
- // Public channel: https://t.me/username/123
264
- const username = channel.replace("@", "");
265
- messageUrl = `https://t.me/${username}/${msg.id}`;
266
- }
267
- await pushChannelPost(active.alertId, {
268
- channel,
269
- text: msg.text,
270
- ts: Date.now(),
271
- messageUrl,
272
- });
273
- logger.info("GramJS: stored channel post", {
274
- channel,
275
- alertId: active.alertId,
276
- text_len: msg.text.length,
277
- private: isPrivate,
278
- });
279
- }
280
- export async function stopMonitor() {
281
- if (_client) {
282
- await _client.disconnect();
283
- _client = null;
284
- logger.info("GramJS: disconnected");
285
- }
286
- }
287
- // ── Fetch recent posts (used by MCP tools) ─────────────
288
- /**
289
- * Fetch recent messages from a public Telegram channel via MTProto.
290
- * Used by the telegram_mtproto_mcp_read_sources MCP tool.
291
- *
292
- * @param channel - Channel username with @ prefix (e.g. "@idf_telegram")
293
- * @param limit - Number of messages to fetch (1-20)
294
- * @returns Array of ChannelPost objects (newest first)
295
- */
296
- export async function fetchRecentChannelPosts(channel, limit = 5) {
297
- if (!_client?.connected) {
298
- logger.warn("GramJS: fetchRecentChannelPosts — client not connected");
299
- return [];
300
- }
301
- const username = channel.replace("@", "");
302
- const safeLimit = Math.min(Math.max(limit, 1), 20);
303
- try {
304
- // Rate limit: jittered delay before fetching
305
- await sleep(jitter(1000));
306
- const messages = await _client.getMessages(username, {
307
- limit: safeLimit,
308
- });
309
- return messages
310
- .filter((msg) => msg.text)
311
- .map((msg) => ({
312
- text: msg.text ?? "",
313
- ts: msg.date ? msg.date * 1000 : Date.now(),
314
- messageUrl: `https://t.me/${username}/${msg.id}`,
315
- }));
316
- }
317
- catch (err) {
318
- logger.warn("GramJS: fetchRecentChannelPosts failed", {
319
- channel,
320
- error: String(err),
321
- });
322
- return [];
323
- }
324
- }
325
- //# sourceMappingURL=gramjs-monitor.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"gramjs-monitor.js","sourceRoot":"","sources":["../../src/agent/gramjs-monitor.ts"],"names":[],"mappings":"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"}
@@ -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"}