easyoref 1.13.0 → 1.13.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (77) hide show
  1. package/dist/agent/auth.d.ts +11 -0
  2. package/dist/agent/auth.d.ts.map +1 -0
  3. package/dist/agent/auth.js +54 -0
  4. package/dist/agent/auth.js.map +1 -0
  5. package/dist/agent/clarify.d.ts +43 -0
  6. package/dist/agent/clarify.d.ts.map +1 -0
  7. package/dist/agent/clarify.js +263 -0
  8. package/dist/agent/clarify.js.map +1 -0
  9. package/dist/agent/dry-run.d.ts +12 -0
  10. package/dist/agent/dry-run.d.ts.map +1 -0
  11. package/dist/agent/dry-run.js +229 -0
  12. package/dist/agent/dry-run.js.map +1 -0
  13. package/dist/agent/gramjs-monitor.d.ts +26 -0
  14. package/dist/agent/gramjs-monitor.d.ts.map +1 -0
  15. package/dist/agent/gramjs-monitor.js +320 -0
  16. package/dist/agent/gramjs-monitor.js.map +1 -0
  17. package/dist/agent/graph.d.ts +50 -0
  18. package/dist/agent/graph.d.ts.map +1 -0
  19. package/dist/agent/graph.js +803 -0
  20. package/dist/agent/graph.js.map +1 -0
  21. package/dist/agent/queue.d.ts +15 -0
  22. package/dist/agent/queue.d.ts.map +1 -0
  23. package/dist/agent/queue.js +41 -0
  24. package/dist/agent/queue.js.map +1 -0
  25. package/dist/agent/redis.d.ts +8 -0
  26. package/dist/agent/redis.d.ts.map +1 -0
  27. package/dist/agent/redis.js +33 -0
  28. package/dist/agent/redis.js.map +1 -0
  29. package/dist/agent/store.d.ts +67 -0
  30. package/dist/agent/store.d.ts.map +1 -0
  31. package/dist/agent/store.js +83 -0
  32. package/dist/agent/store.js.map +1 -0
  33. package/dist/agent/tools.d.ts +159 -0
  34. package/dist/agent/tools.d.ts.map +1 -0
  35. package/dist/agent/tools.js +439 -0
  36. package/dist/agent/tools.js.map +1 -0
  37. package/dist/agent/types.d.ts +102 -0
  38. package/dist/agent/types.d.ts.map +1 -0
  39. package/dist/agent/types.js +3 -0
  40. package/dist/agent/types.js.map +1 -0
  41. package/dist/agent/worker.d.ts +14 -0
  42. package/dist/agent/worker.d.ts.map +1 -0
  43. package/dist/agent/worker.js +90 -0
  44. package/dist/agent/worker.js.map +1 -0
  45. package/dist/bin.d.ts +17 -0
  46. package/dist/bin.d.ts.map +1 -0
  47. package/dist/bin.js +82 -0
  48. package/dist/bin.js.map +1 -0
  49. package/dist/bot.d.ts +16 -0
  50. package/dist/bot.d.ts.map +1 -0
  51. package/dist/bot.js +600 -0
  52. package/dist/bot.js.map +1 -0
  53. package/dist/config.d.ts +125 -0
  54. package/dist/config.d.ts.map +1 -0
  55. package/dist/config.js +145 -0
  56. package/dist/config.js.map +1 -0
  57. package/dist/gif-state.d.ts +17 -0
  58. package/dist/gif-state.d.ts.map +1 -0
  59. package/dist/gif-state.js +67 -0
  60. package/dist/gif-state.js.map +1 -0
  61. package/dist/i18n.d.ts +49 -0
  62. package/dist/i18n.d.ts.map +1 -0
  63. package/dist/i18n.js +229 -0
  64. package/dist/i18n.js.map +1 -0
  65. package/dist/init.d.ts +7 -0
  66. package/dist/init.d.ts.map +1 -0
  67. package/dist/init.js +163 -0
  68. package/dist/init.js.map +1 -0
  69. package/dist/logger.d.ts +14 -0
  70. package/dist/logger.d.ts.map +1 -0
  71. package/dist/logger.js +45 -0
  72. package/dist/logger.js.map +1 -0
  73. package/dist/service.d.ts +19 -0
  74. package/dist/service.d.ts.map +1 -0
  75. package/dist/service.js +165 -0
  76. package/dist/service.js.map +1 -0
  77. package/package.json +1 -1
@@ -0,0 +1,90 @@
1
+ /**
2
+ * BullMQ worker — processes "enrich-alert" jobs.
3
+ *
4
+ * Session-aware scheduling:
5
+ * early_warning → every 20s, up to 30 min
6
+ * siren → every 20s, up to 15 min
7
+ * resolved → every 60s, up to 10 min (tail — detailed intel)
8
+ *
9
+ * After each job, checks the session phase and re-enqueues
10
+ * with the appropriate delay. Stops when phase expires.
11
+ */
12
+ import { Worker } from "bullmq";
13
+ import { config } from "../config.js";
14
+ import * as logger from "../logger.js";
15
+ import { runEnrichment } from "./graph.js";
16
+ import { enqueueEnrich } from "./queue.js";
17
+ import { clearSession, getActiveSession, isPhaseExpired, PHASE_ENRICH_DELAY_MS, } from "./store.js";
18
+ let _worker = null;
19
+ export function startEnrichWorker() {
20
+ if (!config.agent.enabled)
21
+ return;
22
+ const connection = {
23
+ host: new URL(config.agent.redisUrl).hostname,
24
+ port: Number(new URL(config.agent.redisUrl).port || 6379),
25
+ password: new URL(config.agent.redisUrl).password || undefined,
26
+ };
27
+ _worker = new Worker("enrich-alert", async (job) => {
28
+ const { alertId } = job.data;
29
+ logger.info("Enrich worker: processing job", { alertId, jobId: job.id });
30
+ const session = await getActiveSession();
31
+ if (!session) {
32
+ logger.info("Enrich worker: no active session — skipping", { alertId });
33
+ return;
34
+ }
35
+ // Phase expired → end session
36
+ if (isPhaseExpired(session)) {
37
+ logger.info("Enrich worker: phase expired — ending session", {
38
+ alertId: session.latestAlertId,
39
+ phase: session.phase,
40
+ });
41
+ await clearSession();
42
+ return;
43
+ }
44
+ // Run enrichment using latest alert's message as edit target
45
+ await runEnrichment({
46
+ alertId: session.latestAlertId,
47
+ alertTs: session.latestAlertTs,
48
+ alertType: session.phase,
49
+ alertAreas: session.alertAreas,
50
+ chatId: session.chatId,
51
+ messageId: session.latestMessageId,
52
+ isCaption: session.isCaption,
53
+ currentText: session.currentText,
54
+ });
55
+ // Re-check session after enrichment (may have changed phase)
56
+ const after = await getActiveSession();
57
+ if (!after)
58
+ return;
59
+ if (isPhaseExpired(after)) {
60
+ logger.info("Enrich worker: phase expired post-enrich — ending session", {
61
+ phase: after.phase,
62
+ });
63
+ await clearSession();
64
+ return;
65
+ }
66
+ // Re-enqueue with phase-appropriate delay
67
+ const delay = PHASE_ENRICH_DELAY_MS[after.phase];
68
+ await enqueueEnrich(after.latestAlertId, after.latestAlertTs, delay);
69
+ }, {
70
+ connection,
71
+ concurrency: 1,
72
+ });
73
+ _worker.on("completed", (job) => {
74
+ logger.info("Enrich worker: job completed", { jobId: job.id });
75
+ });
76
+ _worker.on("failed", (job, err) => {
77
+ logger.error("Enrich worker: job failed", {
78
+ jobId: job?.id,
79
+ error: String(err),
80
+ });
81
+ });
82
+ logger.info("Enrich worker started");
83
+ }
84
+ export async function stopEnrichWorker() {
85
+ if (_worker) {
86
+ await _worker.close();
87
+ _worker = null;
88
+ }
89
+ }
90
+ //# sourceMappingURL=worker.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"worker.js","sourceRoot":"","sources":["../../src/agent/worker.ts"],"names":[],"mappings":"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"}
package/dist/bin.d.ts ADDED
@@ -0,0 +1,17 @@
1
+ #!/usr/bin/env node
2
+ /**
3
+ * EasyOref CLI entrypoint.
4
+ *
5
+ * easyoref — run the bot (foreground)
6
+ * easyoref run — same as above
7
+ * easyoref init — interactive setup wizard
8
+ * easyoref install — create systemd service + start
9
+ * easyoref uninstall — remove systemd service
10
+ * easyoref start — start service (install if needed)
11
+ * easyoref stop — stop service
12
+ * easyoref restart — restart service
13
+ * easyoref status — show service status
14
+ * easyoref logs — follow service logs
15
+ */
16
+ export {};
17
+ //# sourceMappingURL=bin.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"bin.d.ts","sourceRoot":"","sources":["../src/bin.ts"],"names":[],"mappings":";AACA;;;;;;;;;;;;;GAaG"}
package/dist/bin.js ADDED
@@ -0,0 +1,82 @@
1
+ #!/usr/bin/env node
2
+ /**
3
+ * EasyOref CLI entrypoint.
4
+ *
5
+ * easyoref — run the bot (foreground)
6
+ * easyoref run — same as above
7
+ * easyoref init — interactive setup wizard
8
+ * easyoref install — create systemd service + start
9
+ * easyoref uninstall — remove systemd service
10
+ * easyoref start — start service (install if needed)
11
+ * easyoref stop — stop service
12
+ * easyoref restart — restart service
13
+ * easyoref status — show service status
14
+ * easyoref logs — follow service logs
15
+ */
16
+ const command = process.argv[2];
17
+ switch (command) {
18
+ case "init": {
19
+ const { init } = await import("./init.js");
20
+ await init();
21
+ break;
22
+ }
23
+ case "install": {
24
+ const svc = await import("./service.js");
25
+ svc.install();
26
+ break;
27
+ }
28
+ case "uninstall": {
29
+ const svc = await import("./service.js");
30
+ svc.uninstall();
31
+ break;
32
+ }
33
+ case "start": {
34
+ const svc = await import("./service.js");
35
+ svc.start();
36
+ break;
37
+ }
38
+ case "stop": {
39
+ const svc = await import("./service.js");
40
+ svc.stop();
41
+ break;
42
+ }
43
+ case "restart": {
44
+ const svc = await import("./service.js");
45
+ svc.restart();
46
+ break;
47
+ }
48
+ case "status": {
49
+ const svc = await import("./service.js");
50
+ svc.status();
51
+ break;
52
+ }
53
+ case "logs": {
54
+ const svc = await import("./service.js");
55
+ svc.logs();
56
+ break;
57
+ }
58
+ case "--help":
59
+ case "-h":
60
+ console.log(`
61
+ EasyOref — Telegram alert bot for Israeli civil defense
62
+
63
+ Usage:
64
+ easyoref Run the bot (foreground)
65
+ easyoref init Interactive setup wizard
66
+
67
+ Service management:
68
+ easyoref install Create systemd service & start
69
+ easyoref uninstall Remove systemd service
70
+ easyoref start Start service (auto-install if needed)
71
+ easyoref stop Stop service
72
+ easyoref restart Restart service
73
+ easyoref status Show service status
74
+ easyoref logs Follow service logs
75
+ `);
76
+ break;
77
+ case "run":
78
+ default:
79
+ await import("./bot.js");
80
+ }
81
+ export {};
82
+ //# sourceMappingURL=bin.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"bin.js","sourceRoot":"","sources":["../src/bin.ts"],"names":[],"mappings":";AACA;;;;;;;;;;;;;GAaG;AAEH,MAAM,OAAO,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAEhC,QAAQ,OAAO,EAAE,CAAC;IAChB,KAAK,MAAM,CAAC,CAAC,CAAC;QACZ,MAAM,EAAE,IAAI,EAAE,GAAG,MAAM,MAAM,CAAC,WAAW,CAAC,CAAC;QAC3C,MAAM,IAAI,EAAE,CAAC;QACb,MAAM;IACR,CAAC;IAED,KAAK,SAAS,CAAC,CAAC,CAAC;QACf,MAAM,GAAG,GAAG,MAAM,MAAM,CAAC,cAAc,CAAC,CAAC;QACzC,GAAG,CAAC,OAAO,EAAE,CAAC;QACd,MAAM;IACR,CAAC;IAED,KAAK,WAAW,CAAC,CAAC,CAAC;QACjB,MAAM,GAAG,GAAG,MAAM,MAAM,CAAC,cAAc,CAAC,CAAC;QACzC,GAAG,CAAC,SAAS,EAAE,CAAC;QAChB,MAAM;IACR,CAAC;IAED,KAAK,OAAO,CAAC,CAAC,CAAC;QACb,MAAM,GAAG,GAAG,MAAM,MAAM,CAAC,cAAc,CAAC,CAAC;QACzC,GAAG,CAAC,KAAK,EAAE,CAAC;QACZ,MAAM;IACR,CAAC;IAED,KAAK,MAAM,CAAC,CAAC,CAAC;QACZ,MAAM,GAAG,GAAG,MAAM,MAAM,CAAC,cAAc,CAAC,CAAC;QACzC,GAAG,CAAC,IAAI,EAAE,CAAC;QACX,MAAM;IACR,CAAC;IAED,KAAK,SAAS,CAAC,CAAC,CAAC;QACf,MAAM,GAAG,GAAG,MAAM,MAAM,CAAC,cAAc,CAAC,CAAC;QACzC,GAAG,CAAC,OAAO,EAAE,CAAC;QACd,MAAM;IACR,CAAC;IAED,KAAK,QAAQ,CAAC,CAAC,CAAC;QACd,MAAM,GAAG,GAAG,MAAM,MAAM,CAAC,cAAc,CAAC,CAAC;QACzC,GAAG,CAAC,MAAM,EAAE,CAAC;QACb,MAAM;IACR,CAAC;IAED,KAAK,MAAM,CAAC,CAAC,CAAC;QACZ,MAAM,GAAG,GAAG,MAAM,MAAM,CAAC,cAAc,CAAC,CAAC;QACzC,GAAG,CAAC,IAAI,EAAE,CAAC;QACX,MAAM;IACR,CAAC;IAED,KAAK,QAAQ,CAAC;IACd,KAAK,IAAI;QACP,OAAO,CAAC,GAAG,CAAC;;;;;;;;;;;;;;;CAef,CAAC,CAAC;QACC,MAAM;IAER,KAAK,KAAK,CAAC;IACX;QACE,MAAM,MAAM,CAAC,UAAU,CAAC,CAAC;AAC7B,CAAC"}
package/dist/bot.d.ts ADDED
@@ -0,0 +1,16 @@
1
+ /**
2
+ * EasyOref — Real-time Israeli Red Alert Filter Bot
3
+ *
4
+ * Architecture:
5
+ * oref.org.il API → local filter (area map) → Telegram (grammY)
6
+ *
7
+ * Flow:
8
+ * 1. Poll oref.org.il every 2 seconds for active alerts
9
+ * 2. Match areas against configured regions (Hebrew names)
10
+ * 3. Classify alert type: early warning / siren / incident over
11
+ * 4. If relevant → send calm message to family Telegram chat
12
+ *
13
+ * No LLM needed — purely deterministic matching for <1s latency.
14
+ */
15
+ export {};
16
+ //# sourceMappingURL=bot.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"bot.d.ts","sourceRoot":"","sources":["../src/bot.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG"}