easyoref 1.11.0 → 1.11.2
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/auth.d.ts +11 -0
- package/dist/agent/auth.d.ts.map +1 -0
- package/dist/agent/auth.js +54 -0
- package/dist/agent/auth.js.map +1 -0
- package/dist/agent/dry-run.d.ts +12 -0
- package/dist/agent/dry-run.d.ts.map +1 -0
- package/dist/agent/dry-run.js +229 -0
- package/dist/agent/dry-run.js.map +1 -0
- package/dist/agent/gramjs-monitor.d.ts +13 -0
- package/dist/agent/gramjs-monitor.d.ts.map +1 -0
- package/dist/agent/gramjs-monitor.js +193 -0
- package/dist/agent/gramjs-monitor.js.map +1 -0
- package/dist/agent/graph.d.ts +44 -0
- package/dist/agent/graph.d.ts.map +1 -0
- package/dist/agent/graph.js +707 -0
- package/dist/agent/graph.js.map +1 -0
- package/dist/agent/queue.d.ts +15 -0
- package/dist/agent/queue.d.ts.map +1 -0
- package/dist/agent/queue.js +40 -0
- package/dist/agent/queue.js.map +1 -0
- package/dist/agent/redis.d.ts +8 -0
- package/dist/agent/redis.d.ts.map +1 -0
- package/dist/agent/redis.js +33 -0
- package/dist/agent/redis.js.map +1 -0
- package/dist/agent/store.d.ts +39 -0
- package/dist/agent/store.d.ts.map +1 -0
- package/dist/agent/store.js +52 -0
- package/dist/agent/store.js.map +1 -0
- package/dist/agent/types.d.ts +102 -0
- package/dist/agent/types.d.ts.map +1 -0
- package/dist/agent/types.js +3 -0
- package/dist/agent/types.js.map +1 -0
- package/dist/agent/worker.d.ts +10 -0
- package/dist/agent/worker.d.ts.map +1 -0
- package/dist/agent/worker.js +69 -0
- package/dist/agent/worker.js.map +1 -0
- package/dist/bin.d.ts +17 -0
- package/dist/bin.d.ts.map +1 -0
- package/dist/bin.js +82 -0
- package/dist/bin.js.map +1 -0
- package/dist/bot.d.ts +16 -0
- package/dist/bot.d.ts.map +1 -0
- package/dist/bot.js +557 -0
- package/dist/bot.js.map +1 -0
- package/dist/config.d.ts +116 -0
- package/dist/config.d.ts.map +1 -0
- package/dist/config.js +145 -0
- package/dist/config.js.map +1 -0
- package/dist/gif-state.d.ts +17 -0
- package/dist/gif-state.d.ts.map +1 -0
- package/dist/gif-state.js +67 -0
- package/dist/gif-state.js.map +1 -0
- package/dist/i18n.d.ts +49 -0
- package/dist/i18n.d.ts.map +1 -0
- package/dist/i18n.js +229 -0
- package/dist/i18n.js.map +1 -0
- package/dist/init.d.ts +7 -0
- package/dist/init.d.ts.map +1 -0
- package/dist/init.js +163 -0
- package/dist/init.js.map +1 -0
- package/dist/logger.d.ts +14 -0
- package/dist/logger.d.ts.map +1 -0
- package/dist/logger.js +45 -0
- package/dist/logger.js.map +1 -0
- package/dist/service.d.ts +19 -0
- package/dist/service.d.ts.map +1 -0
- package/dist/service.js +165 -0
- package/dist/service.js.map +1 -0
- package/package.json +3 -3
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
#!/usr/bin/env tsx
|
|
2
|
+
/**
|
|
3
|
+
* GramJS QR Auth — run once to generate session_string.
|
|
4
|
+
*
|
|
5
|
+
* Usage:
|
|
6
|
+
* npx tsx packages/bot/src/agent/auth.ts
|
|
7
|
+
*
|
|
8
|
+
* Scan QR with burner phone → session_string printed → done.
|
|
9
|
+
*/
|
|
10
|
+
export {};
|
|
11
|
+
//# sourceMappingURL=auth.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"auth.d.ts","sourceRoot":"","sources":["../../src/agent/auth.ts"],"names":[],"mappings":";AACA;;;;;;;GAOG"}
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
#!/usr/bin/env tsx
|
|
2
|
+
/**
|
|
3
|
+
* GramJS QR Auth — run once to generate session_string.
|
|
4
|
+
*
|
|
5
|
+
* Usage:
|
|
6
|
+
* npx tsx packages/bot/src/agent/auth.ts
|
|
7
|
+
*
|
|
8
|
+
* Scan QR with burner phone → session_string printed → done.
|
|
9
|
+
*/
|
|
10
|
+
import qrcode from "qrcode-terminal";
|
|
11
|
+
import { TelegramClient } from "telegram";
|
|
12
|
+
import { StringSession } from "telegram/sessions/index.js";
|
|
13
|
+
// Telegram Desktop public api_id/api_hash (from open-source TDesktop)
|
|
14
|
+
const apiId = 2040;
|
|
15
|
+
const apiHash = "b18441a1ff607e10a989891a5462e627";
|
|
16
|
+
const session = new StringSession("");
|
|
17
|
+
const client = new TelegramClient(session, apiId, apiHash, {
|
|
18
|
+
connectionRetries: 3,
|
|
19
|
+
deviceModel: "EasyOref Auth",
|
|
20
|
+
appVersion: "1.0.0",
|
|
21
|
+
});
|
|
22
|
+
console.log("\n🔑 EasyOref — Telegram QR Auth\n");
|
|
23
|
+
console.log("Connecting to Telegram...\n");
|
|
24
|
+
// GramJS requires phoneNumber callback to enter QR flow.
|
|
25
|
+
// Throwing RESTART_AUTH_WITH_QR makes it switch to QR login.
|
|
26
|
+
await client.start({
|
|
27
|
+
phoneNumber: async () => {
|
|
28
|
+
throw { errorMessage: "RESTART_AUTH_WITH_QR" };
|
|
29
|
+
},
|
|
30
|
+
password: async () => "",
|
|
31
|
+
phoneCode: async () => "",
|
|
32
|
+
qrCode: async ({ token }) => {
|
|
33
|
+
const url = `tg://login?token=${token.toString("base64url")}`;
|
|
34
|
+
console.clear();
|
|
35
|
+
console.log("📱 Scan this QR in Telegram → Settings → Devices → Link Desktop\n");
|
|
36
|
+
qrcode.generate(url, { small: true });
|
|
37
|
+
console.log("");
|
|
38
|
+
},
|
|
39
|
+
onError: (err) => {
|
|
40
|
+
if (String(err).includes("RESTART_AUTH"))
|
|
41
|
+
return Promise.resolve(true);
|
|
42
|
+
console.error("Auth error:", err);
|
|
43
|
+
return Promise.resolve(true);
|
|
44
|
+
},
|
|
45
|
+
});
|
|
46
|
+
console.log("\n✅ Authenticated!\n");
|
|
47
|
+
const sessionString = client.session.save();
|
|
48
|
+
console.log("━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━");
|
|
49
|
+
console.log("SESSION STRING (copy this to config.yaml):\n");
|
|
50
|
+
console.log(sessionString);
|
|
51
|
+
console.log("\n━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━");
|
|
52
|
+
await client.disconnect();
|
|
53
|
+
process.exit(0);
|
|
54
|
+
//# sourceMappingURL=auth.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"auth.js","sourceRoot":"","sources":["../../src/agent/auth.ts"],"names":[],"mappings":";AACA;;;;;;;GAOG;AAEH,OAAO,MAAM,MAAM,iBAAiB,CAAC;AACrC,OAAO,EAAE,cAAc,EAAE,MAAM,UAAU,CAAC;AAC1C,OAAO,EAAE,aAAa,EAAE,MAAM,4BAA4B,CAAC;AAE3D,sEAAsE;AACtE,MAAM,KAAK,GAAG,IAAI,CAAC;AACnB,MAAM,OAAO,GAAG,kCAAkC,CAAC;AAEnD,MAAM,OAAO,GAAG,IAAI,aAAa,CAAC,EAAE,CAAC,CAAC;AACtC,MAAM,MAAM,GAAG,IAAI,cAAc,CAAC,OAAO,EAAE,KAAK,EAAE,OAAO,EAAE;IACzD,iBAAiB,EAAE,CAAC;IACpB,WAAW,EAAE,eAAe;IAC5B,UAAU,EAAE,OAAO;CACpB,CAAC,CAAC;AAEH,OAAO,CAAC,GAAG,CAAC,oCAAoC,CAAC,CAAC;AAClD,OAAO,CAAC,GAAG,CAAC,6BAA6B,CAAC,CAAC;AAE3C,yDAAyD;AACzD,6DAA6D;AAC7D,MAAM,MAAM,CAAC,KAAK,CAAC;IACjB,WAAW,EAAE,KAAK,IAAI,EAAE;QACtB,MAAM,EAAE,YAAY,EAAE,sBAAsB,EAAE,CAAC;IACjD,CAAC;IACD,QAAQ,EAAE,KAAK,IAAI,EAAE,CAAC,EAAE;IACxB,SAAS,EAAE,KAAK,IAAI,EAAE,CAAC,EAAE;IACzB,MAAM,EAAE,KAAK,EAAE,EAAE,KAAK,EAAE,EAAE,EAAE;QAC1B,MAAM,GAAG,GAAG,oBAAoB,KAAK,CAAC,QAAQ,CAAC,WAAW,CAAC,EAAE,CAAC;QAC9D,OAAO,CAAC,KAAK,EAAE,CAAC;QAChB,OAAO,CAAC,GAAG,CACT,mEAAmE,CACpE,CAAC;QACF,MAAM,CAAC,QAAQ,CAAC,GAAG,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;QACtC,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;IAClB,CAAC;IACD,OAAO,EAAE,CAAC,GAAG,EAAE,EAAE;QACf,IAAI,MAAM,CAAC,GAAG,CAAC,CAAC,QAAQ,CAAC,cAAc,CAAC;YAAE,OAAO,OAAO,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;QACvE,OAAO,CAAC,KAAK,CAAC,aAAa,EAAE,GAAG,CAAC,CAAC;QAClC,OAAO,OAAO,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;IAC/B,CAAC;CACF,CAAC,CAAC;AAEH,OAAO,CAAC,GAAG,CAAC,sBAAsB,CAAC,CAAC;AAEpC,MAAM,aAAa,GAAG,MAAM,CAAC,OAAO,CAAC,IAAI,EAAuB,CAAC;AAEjE,OAAO,CAAC,GAAG,CAAC,mDAAmD,CAAC,CAAC;AACjE,OAAO,CAAC,GAAG,CAAC,8CAA8C,CAAC,CAAC;AAC5D,OAAO,CAAC,GAAG,CAAC,aAAa,CAAC,CAAC;AAC3B,OAAO,CAAC,GAAG,CAAC,qDAAqD,CAAC,CAAC;AAEnE,MAAM,MAAM,CAAC,UAAU,EAAE,CAAC;AAC1B,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Dry-run: test vote + buildEnrichedMessage without Redis / Telegram / LLM.
|
|
3
|
+
*
|
|
4
|
+
* Usage:
|
|
5
|
+
* npx tsx packages/bot/src/agent/dry-run.ts
|
|
6
|
+
*
|
|
7
|
+
* Prints the enriched message HTML to stdout.
|
|
8
|
+
* Strip HTML tags to preview plain text:
|
|
9
|
+
* npx tsx packages/bot/src/agent/dry-run.ts | sed 's/<[^>]*>//g'
|
|
10
|
+
*/
|
|
11
|
+
export {};
|
|
12
|
+
//# sourceMappingURL=dry-run.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"dry-run.d.ts","sourceRoot":"","sources":["../../src/agent/dry-run.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG"}
|
|
@@ -0,0 +1,229 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Dry-run: test vote + buildEnrichedMessage without Redis / Telegram / LLM.
|
|
3
|
+
*
|
|
4
|
+
* Usage:
|
|
5
|
+
* npx tsx packages/bot/src/agent/dry-run.ts
|
|
6
|
+
*
|
|
7
|
+
* Prints the enriched message HTML to stdout.
|
|
8
|
+
* Strip HTML tags to preview plain text:
|
|
9
|
+
* npx tsx packages/bot/src/agent/dry-run.ts | sed 's/<[^>]*>//g'
|
|
10
|
+
*/
|
|
11
|
+
// ── Mock base message (as formatMessage() would produce) ──────────────────────
|
|
12
|
+
const BASE_MESSAGE = [
|
|
13
|
+
"<b>🚀 Ракетная атака</b>",
|
|
14
|
+
"Ожидаются прилёты. Пройдите в укрытие.",
|
|
15
|
+
"",
|
|
16
|
+
"<b>Район:</b> Тель-Авив — Яффо",
|
|
17
|
+
"<b>Подлётное время:</b> ~5–12 мин",
|
|
18
|
+
"<b>Время оповещения:</b> 03:47",
|
|
19
|
+
].join("\n");
|
|
20
|
+
// ── Mock validated extractions (normally come from LLM) ───────────────────────
|
|
21
|
+
const NOW = Date.now();
|
|
22
|
+
const ALERT_TS = NOW - 90_000; // alert was 90s ago
|
|
23
|
+
const MOCK_EXTRACTIONS = [
|
|
24
|
+
{
|
|
25
|
+
channel: "@newsflashhhj",
|
|
26
|
+
messageUrl: "https://t.me/newsflashhhj/12340",
|
|
27
|
+
region_relevance: 0.9,
|
|
28
|
+
source_trust: 0.85,
|
|
29
|
+
tone: "calm",
|
|
30
|
+
country_origin: "Iran",
|
|
31
|
+
rocket_count: 6,
|
|
32
|
+
is_cassette: false,
|
|
33
|
+
hits_confirmed: null,
|
|
34
|
+
eta_refined_minutes: 8,
|
|
35
|
+
confidence: 0.88,
|
|
36
|
+
valid: true,
|
|
37
|
+
},
|
|
38
|
+
{
|
|
39
|
+
channel: "@israelsecurity",
|
|
40
|
+
messageUrl: "https://t.me/israelsecurity/5521",
|
|
41
|
+
region_relevance: 0.85,
|
|
42
|
+
source_trust: 0.78,
|
|
43
|
+
tone: "neutral",
|
|
44
|
+
country_origin: "Lebanon",
|
|
45
|
+
rocket_count: 7,
|
|
46
|
+
is_cassette: true,
|
|
47
|
+
hits_confirmed: null,
|
|
48
|
+
eta_refined_minutes: 9,
|
|
49
|
+
confidence: 0.75,
|
|
50
|
+
valid: true,
|
|
51
|
+
},
|
|
52
|
+
{
|
|
53
|
+
channel: "@N12LIVE",
|
|
54
|
+
messageUrl: "https://t.me/N12LIVE/8802",
|
|
55
|
+
region_relevance: 0.7,
|
|
56
|
+
source_trust: 0.9,
|
|
57
|
+
tone: "calm",
|
|
58
|
+
country_origin: "Iran",
|
|
59
|
+
rocket_count: 5,
|
|
60
|
+
is_cassette: null,
|
|
61
|
+
hits_confirmed: 2,
|
|
62
|
+
eta_refined_minutes: null,
|
|
63
|
+
confidence: 0.82,
|
|
64
|
+
valid: true,
|
|
65
|
+
},
|
|
66
|
+
];
|
|
67
|
+
// ── Inline copy of vote() + buildEnrichedMessage() ────────────────────────────
|
|
68
|
+
// (avoids importing config / redis which require a real config.yaml)
|
|
69
|
+
const SUPERSCRIPTS = ["⁰", "¹", "²", "³", "⁴", "⁵", "⁶", "⁷", "⁸", "⁹"];
|
|
70
|
+
function sup(indices) {
|
|
71
|
+
return indices
|
|
72
|
+
.map((n) => String(n)
|
|
73
|
+
.split("")
|
|
74
|
+
.map((d) => SUPERSCRIPTS[Number(d)])
|
|
75
|
+
.join(""))
|
|
76
|
+
.join("");
|
|
77
|
+
}
|
|
78
|
+
const COUNTRY_RU = {
|
|
79
|
+
Iran: "Иран",
|
|
80
|
+
Yemen: "Йемен",
|
|
81
|
+
Lebanon: "Ливан",
|
|
82
|
+
Gaza: "Газа",
|
|
83
|
+
Iraq: "Ирак",
|
|
84
|
+
Syria: "Сирия",
|
|
85
|
+
Hezbollah: "Хезболла",
|
|
86
|
+
};
|
|
87
|
+
function vote(extractions) {
|
|
88
|
+
const indexed = extractions.map((e, i) => ({ ...e, idx: i + 1 }));
|
|
89
|
+
const citedSources = indexed.map((e) => ({
|
|
90
|
+
index: e.idx,
|
|
91
|
+
channel: e.channel,
|
|
92
|
+
messageUrl: e.messageUrl ?? null,
|
|
93
|
+
}));
|
|
94
|
+
// ETA: highest-confidence source
|
|
95
|
+
const withEta = indexed
|
|
96
|
+
.filter((e) => e.eta_refined_minutes !== null)
|
|
97
|
+
.sort((a, b) => b.confidence - a.confidence);
|
|
98
|
+
const bestEta = withEta[0] ?? null;
|
|
99
|
+
// Countries: group, collect citations
|
|
100
|
+
const countryMap = new Map();
|
|
101
|
+
for (const e of indexed) {
|
|
102
|
+
if (e.country_origin) {
|
|
103
|
+
const list = countryMap.get(e.country_origin) ?? [];
|
|
104
|
+
list.push(e.idx);
|
|
105
|
+
countryMap.set(e.country_origin, list);
|
|
106
|
+
}
|
|
107
|
+
}
|
|
108
|
+
const country_origins = countryMap.size > 0
|
|
109
|
+
? Array.from(countryMap.entries()).map(([name, citations]) => ({
|
|
110
|
+
name,
|
|
111
|
+
citations,
|
|
112
|
+
}))
|
|
113
|
+
: null;
|
|
114
|
+
// Rocket range
|
|
115
|
+
const rocketSrcs = indexed.filter((e) => e.rocket_count !== null);
|
|
116
|
+
const rocketVals = rocketSrcs.map((e) => e.rocket_count);
|
|
117
|
+
const rocket_count_min = rocketVals.length > 0 ? Math.min(...rocketVals) : null;
|
|
118
|
+
const rocket_count_max = rocketVals.length > 0 ? Math.max(...rocketVals) : null;
|
|
119
|
+
const rocket_citations = rocketSrcs.map((e) => e.idx);
|
|
120
|
+
// Cassette: majority
|
|
121
|
+
const cassVals = indexed
|
|
122
|
+
.filter((e) => e.is_cassette !== null)
|
|
123
|
+
.map((e) => e.is_cassette);
|
|
124
|
+
const is_cassette = cassVals.length > 0
|
|
125
|
+
? cassVals.filter(Boolean).length > cassVals.length / 2
|
|
126
|
+
: null;
|
|
127
|
+
// Hits: median
|
|
128
|
+
const hitsVals = indexed
|
|
129
|
+
.filter((e) => e.hits_confirmed !== null)
|
|
130
|
+
.map((e) => e.hits_confirmed)
|
|
131
|
+
.sort((a, b) => a - b);
|
|
132
|
+
const hits_confirmed = hitsVals.length > 0 ? hitsVals[Math.floor(hitsVals.length / 2)] : null;
|
|
133
|
+
// Hits citations
|
|
134
|
+
const hitsSrcs = indexed.filter((e) => e.hits_confirmed !== null && e.hits_confirmed > 0);
|
|
135
|
+
const hits_citations = hitsSrcs.map((e) => e.idx);
|
|
136
|
+
// Weighted confidence
|
|
137
|
+
const totalWeight = indexed.reduce((s, e) => s + e.source_trust * e.confidence, 0);
|
|
138
|
+
return {
|
|
139
|
+
eta_refined_minutes: bestEta?.eta_refined_minutes ?? null,
|
|
140
|
+
eta_citations: bestEta ? [bestEta.idx] : [],
|
|
141
|
+
country_origins,
|
|
142
|
+
rocket_count_min,
|
|
143
|
+
rocket_count_max,
|
|
144
|
+
is_cassette,
|
|
145
|
+
rocket_citations,
|
|
146
|
+
hits_confirmed,
|
|
147
|
+
hits_citations,
|
|
148
|
+
confidence: Math.round((totalWeight / indexed.length) * 100) / 100,
|
|
149
|
+
sources_count: indexed.length,
|
|
150
|
+
citedSources,
|
|
151
|
+
};
|
|
152
|
+
}
|
|
153
|
+
function insertBeforeTimeLine(text, line) {
|
|
154
|
+
const timeLinePattern = /(<b>Время оповещения:<\/b>)/;
|
|
155
|
+
const match = text.match(timeLinePattern);
|
|
156
|
+
if (match?.index !== undefined) {
|
|
157
|
+
return text.slice(0, match.index) + line + "\n" + text.slice(match.index);
|
|
158
|
+
}
|
|
159
|
+
const lines = text.split("\n");
|
|
160
|
+
lines.splice(Math.max(lines.length - 1, 0), 0, line);
|
|
161
|
+
return lines.join("\n");
|
|
162
|
+
}
|
|
163
|
+
function refineEtaInPlace(text, minutes, alertTs, citations) {
|
|
164
|
+
const absTime = new Date(alertTs + minutes * 60_000).toLocaleTimeString("he-IL", { hour: "2-digit", minute: "2-digit", timeZone: "Asia/Jerusalem" });
|
|
165
|
+
const refined = `~${absTime}${sup(citations)}`;
|
|
166
|
+
const etaPatterns = [
|
|
167
|
+
/~\d+[–-]\d+\s*мин/,
|
|
168
|
+
/~\d+[–-]\d+\s*min/,
|
|
169
|
+
/~\d+[–-]\d+\s*דקות/,
|
|
170
|
+
/1\.5\s*мин/,
|
|
171
|
+
/1\.5\s*min/,
|
|
172
|
+
];
|
|
173
|
+
for (const pattern of etaPatterns) {
|
|
174
|
+
if (pattern.test(text))
|
|
175
|
+
return text.replace(pattern, refined);
|
|
176
|
+
}
|
|
177
|
+
return text;
|
|
178
|
+
}
|
|
179
|
+
function buildEnrichedMessage(currentText, alertTs, r) {
|
|
180
|
+
let text = currentText;
|
|
181
|
+
if (r.eta_refined_minutes !== null && r.eta_citations.length > 0) {
|
|
182
|
+
text = refineEtaInPlace(text, r.eta_refined_minutes, alertTs, r.eta_citations);
|
|
183
|
+
}
|
|
184
|
+
if (r.country_origins && r.country_origins.length > 0) {
|
|
185
|
+
const parts = r.country_origins.map((c) => {
|
|
186
|
+
const ru = COUNTRY_RU[c.name] ?? c.name;
|
|
187
|
+
return `${ru}${sup(c.citations)}`;
|
|
188
|
+
});
|
|
189
|
+
// Leading \n creates blank line between ETA and intel block
|
|
190
|
+
text = insertBeforeTimeLine(text, `\n<b>Откуда:</b> ${parts.join(" + ")}`);
|
|
191
|
+
}
|
|
192
|
+
if (r.rocket_count_min !== null && r.rocket_count_max !== null) {
|
|
193
|
+
const countStr = r.rocket_count_min === r.rocket_count_max
|
|
194
|
+
? `${r.rocket_count_min}`
|
|
195
|
+
: `~${r.rocket_count_min}-${r.rocket_count_max}`;
|
|
196
|
+
const cassette = r.is_cassette ? " (кассет.)" : "";
|
|
197
|
+
text = insertBeforeTimeLine(text, `<b>Ракет:</b> ${countStr}${cassette}`);
|
|
198
|
+
}
|
|
199
|
+
if (r.hits_confirmed !== null && r.hits_confirmed > 0) {
|
|
200
|
+
const hitsCite = r.hits_citations.length > 0 ? sup(r.hits_citations) : "";
|
|
201
|
+
text = insertBeforeTimeLine(text, `<b>Попадания (Дан центр):</b> ${r.hits_confirmed}${hitsCite}`);
|
|
202
|
+
}
|
|
203
|
+
const sourcesWithUrl = r.citedSources.filter((s) => s.messageUrl);
|
|
204
|
+
if (sourcesWithUrl.length > 0) {
|
|
205
|
+
const links = sourcesWithUrl
|
|
206
|
+
.map((s) => `<a href="${s.messageUrl}">[${s.index}]</a>`)
|
|
207
|
+
.join(" ");
|
|
208
|
+
text += `\n—\n<i>Источники: ${links}</i>`;
|
|
209
|
+
}
|
|
210
|
+
return text;
|
|
211
|
+
}
|
|
212
|
+
// ── Run ───────────────────────────────────────────────────────────────────────
|
|
213
|
+
const voted = vote(MOCK_EXTRACTIONS);
|
|
214
|
+
console.log("\n=== VOTE RESULT ===");
|
|
215
|
+
console.log(JSON.stringify(voted, null, 2));
|
|
216
|
+
const enriched = buildEnrichedMessage(BASE_MESSAGE, ALERT_TS, voted);
|
|
217
|
+
console.log("\n=== ENRICHED MESSAGE (HTML) ===");
|
|
218
|
+
console.log(enriched);
|
|
219
|
+
console.log("\n=== PLAIN TEXT PREVIEW ===");
|
|
220
|
+
console.log(enriched
|
|
221
|
+
.replace(/<[^>]*>/g, "")
|
|
222
|
+
.replace(/</g, "<")
|
|
223
|
+
.replace(/>/g, ">"));
|
|
224
|
+
console.log(`\n=== STATS ===`);
|
|
225
|
+
console.log(`Confidence: ${voted.confidence}`);
|
|
226
|
+
console.log(`Sources: ${voted.sources_count}`);
|
|
227
|
+
console.log(`Chars: ${enriched.length} (TG caption limit: 1024)`);
|
|
228
|
+
export {};
|
|
229
|
+
//# sourceMappingURL=dry-run.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"dry-run.js","sourceRoot":"","sources":["../../src/agent/dry-run.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,13 @@
|
|
|
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
|
+
//# sourceMappingURL=gramjs-monitor.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"gramjs-monitor.d.ts","sourceRoot":"","sources":["../../src/agent/gramjs-monitor.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAiDH,wBAAsB,YAAY,IAAI,OAAO,CAAC,IAAI,CAAC,CA8FlD;AAiED,wBAAsB,WAAW,IAAI,OAAO,CAAC,IAAI,CAAC,CAMjD"}
|
|
@@ -0,0 +1,193 @@
|
|
|
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
|
+
// Note: private group @+6Jd-rxu0ZPo1ZmE0 may not work with MTProto
|
|
37
|
+
];
|
|
38
|
+
// ── Helpers ────────────────────────────────────────────
|
|
39
|
+
function sleep(ms) {
|
|
40
|
+
return new Promise((r) => setTimeout(r, ms));
|
|
41
|
+
}
|
|
42
|
+
function jitter(baseMs) {
|
|
43
|
+
return baseMs + Math.random() * 500 - 250;
|
|
44
|
+
}
|
|
45
|
+
// ── Client ─────────────────────────────────────────────
|
|
46
|
+
export async function startMonitor() {
|
|
47
|
+
if (!config.agent.enabled)
|
|
48
|
+
return;
|
|
49
|
+
const { apiId, apiHash, sessionString } = config.agent.mtproto;
|
|
50
|
+
if (!apiId || !apiHash) {
|
|
51
|
+
logger.warn("GramJS: api_id or api_hash not set — MTProto monitor disabled");
|
|
52
|
+
return;
|
|
53
|
+
}
|
|
54
|
+
const session = new StringSession(sessionString || "");
|
|
55
|
+
const clientOpts = {
|
|
56
|
+
connectionRetries: 5,
|
|
57
|
+
retryDelay: 2000,
|
|
58
|
+
autoReconnect: true,
|
|
59
|
+
deviceModel: "Desktop",
|
|
60
|
+
appVersion: "1.0.0",
|
|
61
|
+
systemVersion: "macOS 14",
|
|
62
|
+
langCode: "en",
|
|
63
|
+
};
|
|
64
|
+
// SOCKS5 proxy support
|
|
65
|
+
if (config.agent.socks5Proxy) {
|
|
66
|
+
try {
|
|
67
|
+
const proxyUrl = new URL(config.agent.socks5Proxy);
|
|
68
|
+
clientOpts.proxy = {
|
|
69
|
+
socksType: 5,
|
|
70
|
+
ip: proxyUrl.hostname,
|
|
71
|
+
port: Number(proxyUrl.port),
|
|
72
|
+
username: proxyUrl.username || undefined,
|
|
73
|
+
password: proxyUrl.password || undefined,
|
|
74
|
+
};
|
|
75
|
+
logger.info("GramJS: SOCKS5 proxy configured", {
|
|
76
|
+
host: proxyUrl.hostname,
|
|
77
|
+
});
|
|
78
|
+
}
|
|
79
|
+
catch {
|
|
80
|
+
logger.warn("GramJS: invalid socks5_proxy URL, ignoring");
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
84
|
+
_client = new TelegramClient(session, apiId, apiHash, clientOpts);
|
|
85
|
+
if (!sessionString) {
|
|
86
|
+
logger.warn("GramJS: no session_string configured. Run `npx tsx src/agent/auth.ts` first.");
|
|
87
|
+
return;
|
|
88
|
+
}
|
|
89
|
+
try {
|
|
90
|
+
await _client.connect();
|
|
91
|
+
logger.info("GramJS: connected to Telegram MTProto");
|
|
92
|
+
}
|
|
93
|
+
catch (err) {
|
|
94
|
+
logger.error("GramJS: connection failed", { error: String(err) });
|
|
95
|
+
return;
|
|
96
|
+
}
|
|
97
|
+
// Auto-join all monitored public channels (required for NewMessage events)
|
|
98
|
+
for (const ch of MONITORED_CHANNELS) {
|
|
99
|
+
const username = ch.replace("@", "");
|
|
100
|
+
try {
|
|
101
|
+
await _client.invoke(new Api.channels.JoinChannel({ channel: username }));
|
|
102
|
+
logger.info("GramJS: joined channel", { channel: ch });
|
|
103
|
+
}
|
|
104
|
+
catch (err) {
|
|
105
|
+
const errStr = String(err);
|
|
106
|
+
// CHANNELS_TOO_MUCH = account in too many channels
|
|
107
|
+
// USER_ALREADY_PARTICIPANT = already joined
|
|
108
|
+
if (errStr.includes("USER_ALREADY_PARTICIPANT")) {
|
|
109
|
+
logger.debug("GramJS: already in channel", { channel: ch });
|
|
110
|
+
}
|
|
111
|
+
else {
|
|
112
|
+
logger.warn("GramJS: failed to join channel", {
|
|
113
|
+
channel: ch,
|
|
114
|
+
error: errStr,
|
|
115
|
+
});
|
|
116
|
+
}
|
|
117
|
+
}
|
|
118
|
+
// Rate limit: 1-2s between joins
|
|
119
|
+
await sleep(jitter(1500));
|
|
120
|
+
}
|
|
121
|
+
// Subscribe to new messages across all monitored channels
|
|
122
|
+
_client.addEventHandler(async (event) => {
|
|
123
|
+
await handleNewMessage(event).catch((err) => {
|
|
124
|
+
logger.warn("GramJS: handler error", { error: String(err) });
|
|
125
|
+
});
|
|
126
|
+
}, new NewMessage({}));
|
|
127
|
+
logger.info("GramJS: monitoring channels", {
|
|
128
|
+
channels: MONITORED_CHANNELS,
|
|
129
|
+
});
|
|
130
|
+
}
|
|
131
|
+
async function handleNewMessage(event) {
|
|
132
|
+
const msg = event.message;
|
|
133
|
+
if (!msg?.text || !msg.peerId) {
|
|
134
|
+
logger.debug("GramJS: skipped message (no text or peerId)");
|
|
135
|
+
return;
|
|
136
|
+
}
|
|
137
|
+
// Get channel username
|
|
138
|
+
let channel = "";
|
|
139
|
+
try {
|
|
140
|
+
const chat = await event.message.getChat();
|
|
141
|
+
if (chat && "username" in chat && chat.username) {
|
|
142
|
+
channel = `@${chat.username}`;
|
|
143
|
+
}
|
|
144
|
+
else if (chat && "title" in chat && chat.title) {
|
|
145
|
+
channel = String(chat.title);
|
|
146
|
+
}
|
|
147
|
+
else {
|
|
148
|
+
logger.debug("GramJS: skipped message (unidentifiable chat)");
|
|
149
|
+
return; // Not a channel we can identify
|
|
150
|
+
}
|
|
151
|
+
}
|
|
152
|
+
catch {
|
|
153
|
+
return;
|
|
154
|
+
}
|
|
155
|
+
// Only care about configured channels
|
|
156
|
+
const normalizedChannel = channel.toLowerCase();
|
|
157
|
+
const isMonitored = MONITORED_CHANNELS.some((c) => c.toLowerCase() === normalizedChannel ||
|
|
158
|
+
c.toLowerCase().replace("@", "") === normalizedChannel.replace("@", ""));
|
|
159
|
+
if (!isMonitored) {
|
|
160
|
+
logger.debug("GramJS: skipped message (not monitored)", { channel });
|
|
161
|
+
return;
|
|
162
|
+
}
|
|
163
|
+
// Only store if there's an active alert window
|
|
164
|
+
const active = await getActiveAlert();
|
|
165
|
+
if (!active) {
|
|
166
|
+
logger.debug("GramJS: skipped message (no active alert)", { channel });
|
|
167
|
+
return;
|
|
168
|
+
}
|
|
169
|
+
// Anti-flood: jittered delay
|
|
170
|
+
await sleep(jitter(1000));
|
|
171
|
+
// Build direct message URL for the sources footer
|
|
172
|
+
const username = channel.replace("@", "");
|
|
173
|
+
const messageUrl = `https://t.me/${username}/${msg.id}`;
|
|
174
|
+
await pushChannelPost(active.alertId, {
|
|
175
|
+
channel,
|
|
176
|
+
text: msg.text,
|
|
177
|
+
ts: Date.now(),
|
|
178
|
+
messageUrl,
|
|
179
|
+
});
|
|
180
|
+
logger.info("GramJS: stored channel post", {
|
|
181
|
+
channel,
|
|
182
|
+
alertId: active.alertId,
|
|
183
|
+
text_len: msg.text.length,
|
|
184
|
+
});
|
|
185
|
+
}
|
|
186
|
+
export async function stopMonitor() {
|
|
187
|
+
if (_client) {
|
|
188
|
+
await _client.disconnect();
|
|
189
|
+
_client = null;
|
|
190
|
+
logger.info("GramJS: disconnected");
|
|
191
|
+
}
|
|
192
|
+
}
|
|
193
|
+
//# sourceMappingURL=gramjs-monitor.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"gramjs-monitor.js","sourceRoot":"","sources":["../../src/agent/gramjs-monitor.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* LangGraph.js enrichment pipeline — tiered validation.
|
|
3
|
+
*
|
|
4
|
+
* Design: minimize tokens, maximize confidence.
|
|
5
|
+
*
|
|
6
|
+
* ┌──────────────────────────────────────────────────────────────┐
|
|
7
|
+
* │ Tier 0: preFilter (deterministic, 0 tokens) │
|
|
8
|
+
* │ → keyword + region check on raw post text │
|
|
9
|
+
* │ │
|
|
10
|
+
* │ Tier 1: extractAndValidate (1 LLM call per post) │
|
|
11
|
+
* │ → combined extraction + 3 validators in single JSON: │
|
|
12
|
+
* │ V1: region_relevance (is post about our area?) │
|
|
13
|
+
* │ V2: source_trust (factual vs rumor/panic?) │
|
|
14
|
+
* │ V3: tone (calm/neutral/alarmist?) │
|
|
15
|
+
* │ → structured output, all validation in one prompt │
|
|
16
|
+
* │ │
|
|
17
|
+
* │ Tier 2: postFilter (deterministic, 0 tokens) │
|
|
18
|
+
* │ → reject: region_relevance < 0.5 │
|
|
19
|
+
* │ → reject: source_trust < 0.4 │
|
|
20
|
+
* │ → reject: tone === "alarmist" │
|
|
21
|
+
* │ → reject: all data fields null │
|
|
22
|
+
* │ │
|
|
23
|
+
* │ Tier 3: vote (deterministic, 0 tokens) │
|
|
24
|
+
* │ → majority consensus across validated sources │
|
|
25
|
+
* │ │
|
|
26
|
+
* │ Tier 4: editMessage (deterministic, 0 tokens) │
|
|
27
|
+
* │ → inline update of existing key:value pairs │
|
|
28
|
+
* └──────────────────────────────────────────────────────────────┘
|
|
29
|
+
*
|
|
30
|
+
* Total LLM cost: 1 call × N posts (max 8). GPT-4o-mini ≈ $0.0001/post.
|
|
31
|
+
*/
|
|
32
|
+
import type { AlertType } from "./types.js";
|
|
33
|
+
export interface RunEnrichmentInput {
|
|
34
|
+
alertId: string;
|
|
35
|
+
alertTs: number;
|
|
36
|
+
alertType: AlertType;
|
|
37
|
+
alertAreas: string[];
|
|
38
|
+
chatId: string;
|
|
39
|
+
messageId: number;
|
|
40
|
+
isCaption: boolean;
|
|
41
|
+
currentText: string;
|
|
42
|
+
}
|
|
43
|
+
export declare function runEnrichment(input: RunEnrichmentInput): Promise<void>;
|
|
44
|
+
//# sourceMappingURL=graph.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"graph.d.ts","sourceRoot":"","sources":["../../src/agent/graph.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA8BG;AASH,OAAO,KAAK,EACV,SAAS,EAMV,MAAM,YAAY,CAAC;AAo2BpB,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,WAAW,EAAE,MAAM,CAAC;CACrB;AAED,wBAAsB,aAAa,CAAC,KAAK,EAAE,kBAAkB,GAAG,OAAO,CAAC,IAAI,CAAC,CAiB5E"}
|