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.
- package/dist/agent/extract.d.ts +5 -5
- package/dist/agent/extract.d.ts.map +1 -1
- package/dist/agent/extract.js +77 -120
- package/dist/agent/extract.js.map +1 -1
- package/dist/agent/types.d.ts.map +1 -1
- package/dist/agent/types.js +21 -31
- package/dist/agent/types.js.map +1 -1
- package/dist/bot.js +17 -19
- package/dist/bot.js.map +1 -1
- package/dist/gif-state.js +1 -1
- package/dist/gif-state.js.map +1 -1
- package/dist/init.js +1 -1
- package/dist/init.js.map +1 -1
- package/package.json +5 -9
- package/dist/agent/auth.d.ts +0 -11
- package/dist/agent/auth.d.ts.map +0 -1
- package/dist/agent/auth.js +0 -54
- package/dist/agent/auth.js.map +0 -1
- package/dist/agent/clarify.d.ts +0 -44
- package/dist/agent/clarify.d.ts.map +0 -1
- package/dist/agent/clarify.js +0 -285
- package/dist/agent/clarify.js.map +0 -1
- package/dist/agent/dry-run.d.ts +0 -12
- package/dist/agent/dry-run.d.ts.map +0 -1
- package/dist/agent/dry-run.js +0 -236
- package/dist/agent/dry-run.js.map +0 -1
- package/dist/agent/filters.d.ts +0 -48
- package/dist/agent/filters.d.ts.map +0 -1
- package/dist/agent/filters.js +0 -124
- package/dist/agent/filters.js.map +0 -1
- package/dist/agent/gramjs-monitor.d.ts +0 -26
- package/dist/agent/gramjs-monitor.d.ts.map +0 -1
- package/dist/agent/gramjs-monitor.js +0 -325
- package/dist/agent/gramjs-monitor.js.map +0 -1
- package/dist/agent/graph.d.ts +0 -30
- package/dist/agent/graph.d.ts.map +0 -1
- package/dist/agent/graph.js +0 -240
- package/dist/agent/graph.js.map +0 -1
- package/dist/agent/helpers.d.ts +0 -6
- package/dist/agent/helpers.d.ts.map +0 -1
- package/dist/agent/helpers.js +0 -15
- package/dist/agent/helpers.js.map +0 -1
- package/dist/agent/message.d.ts +0 -69
- package/dist/agent/message.d.ts.map +0 -1
- package/dist/agent/message.js +0 -479
- package/dist/agent/message.js.map +0 -1
- package/dist/agent/queue.d.ts +0 -15
- package/dist/agent/queue.d.ts.map +0 -1
- package/dist/agent/queue.js +0 -41
- package/dist/agent/queue.js.map +0 -1
- package/dist/agent/redis.d.ts +0 -8
- package/dist/agent/redis.d.ts.map +0 -1
- package/dist/agent/redis.js +0 -33
- package/dist/agent/redis.js.map +0 -1
- package/dist/agent/store.d.ts +0 -93
- package/dist/agent/store.d.ts.map +0 -1
- package/dist/agent/store.js +0 -145
- package/dist/agent/store.js.map +0 -1
- package/dist/agent/tools.d.ts +0 -159
- package/dist/agent/tools.d.ts.map +0 -1
- package/dist/agent/tools.js +0 -439
- package/dist/agent/tools.js.map +0 -1
- package/dist/agent/types.d.ts +0 -218
- package/dist/agent/vote.d.ts +0 -13
- package/dist/agent/vote.d.ts.map +0 -1
- package/dist/agent/vote.js +0 -246
- package/dist/agent/vote.js.map +0 -1
- package/dist/agent/worker.d.ts +0 -14
- package/dist/agent/worker.d.ts.map +0 -1
- package/dist/agent/worker.js +0 -137
- package/dist/agent/worker.js.map +0 -1
- package/dist/bin.d.ts +0 -17
- package/dist/bot.d.ts +0 -16
- package/dist/config.d.ts +0 -129
- package/dist/config.d.ts.map +0 -1
- package/dist/config.js +0 -157
- package/dist/config.js.map +0 -1
- package/dist/gif-state.d.ts +0 -17
- package/dist/i18n.d.ts +0 -49
- package/dist/i18n.d.ts.map +0 -1
- package/dist/i18n.js +0 -229
- package/dist/i18n.js.map +0 -1
- package/dist/init.d.ts +0 -7
- package/dist/logger.d.ts +0 -14
- package/dist/logger.d.ts.map +0 -1
- package/dist/logger.js +0 -45
- package/dist/logger.js.map +0 -1
- package/dist/service.d.ts +0 -19
- package/dist/service.d.ts.map +0 -1
- package/dist/service.js +0 -165
- package/dist/service.js.map +0 -1
package/dist/agent/filters.js
DELETED
|
@@ -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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"}
|
package/dist/agent/graph.d.ts
DELETED
|
@@ -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"}
|