🛡️
מניעת כפילויות
fingerprint חכם — פוקע כשהתרעה נעלמת, לא רק ב-all-clear
✏️
עריכת הודעות
התראות מאותו סוג עורכות את ההודעה הקיימת בחלון זמן מוגדר; שרשרת מדורגת: editMessageMedia → editMessageCaption → editMessageText
📊
מגבלת Mapbox חודשית
מונה SQLite + מטמון תמונות — חוסך קוטה ומונע חריגה
📡
newsFlash ארצי
תפיסת הודעות ללא ערים שהספרייה מדלגת עליהן
🔄
עמידות לאיתחול
חלון ההתראות נשמר ב-SQLite — אין הודעות כפולות לאחר הפעלה מחדש
⚡
DM Queue
תור שליחה עם מגבלת מקביליות (10) ו-backoff אוטומטי לשגיאות 429
🏥
Health endpoint
`GET /health` עם uptime, lastAlertAt ו-alertsToday לניטור חיצוני
🎛️
לוח בקרה
Admin Dashboard — React + glassmorphism UI, framer-motion, ניהול מנויים, broadcast, הגדרות, ניהול WhatsApp listeners
🖥️
Terminal UI
`logger.ts` מובנה — chalk v4, logStartupHeader, logAlert, תמיכה בעברית RTL
🧙
NPX Wizard
`--update` לעדכון .env קיים, `--verify` לבדיקת טוקנים, ולידציה חיה בכל שדה, בחירת פלטפורמה (Telegram / WhatsApp / שניהם)
🐳
Docker
multi-stage build, non-root user, volume לנתונים
🚀
CI/CD
GitHub Actions: 4 jobs מקבילים — test, dashboard-build, docker-build, wizard-check
🌐
Proxy
תמיכה בהרצה מחוץ לישראל
📱
WhatsApp Listener
האזנה לקבוצות/ערוצים WhatsApp, סינון לפי מילות מפתח, העברה לטלגרם ולקבוצות WhatsApp מנויות (WHATSAPP_ENABLED=true)
🔭
Telegram Listener
האזנה לקבוצות/ערוצים Telegram דרך GramJS MTProto (חשבון משתמש), סינון מילות מפתח, העברה לנושאים + WhatsApp; auth flow בדשבורד (TELEGRAM_LISTENER_ENABLED=true)
🔒
Rate Limiting
הגנה על endpoints בדשבורד (broadcast, deploy, export), bot callbacks, ו-brute-force פרסיסטנטי ב-SQLite
⚡
Caching O(1)
cityLookup Maps, subscription cache in-memory, TTL stats cache, Mapbox usage cache — אפס DB hits בנתיב ההתראות
📨
שיפורי הודעות
חותמת זמן יציבה (Asia/Jerusalem), ספירת ערים בכותרת, מיון אלפבתי, `▸ ערים נוספות` לערים ללא polygon; תוכן ההודעה מופיע לפני רשימת הערים
👤
Onboarding + פרופיל
מערכת onboarding עם wizard ב-`/start`; פרופיל עם `display_name`, `home_city`, `locale`; מצב נשמר ב-SQLite (עמיד לריסטארט); `addColumnIfMissing` מיגרציה בטוחה
🔗
Contact System
טבלאות `contacts` + `contact_permissions` עם FK cascades; transactional `createContactWithPermissions()`; `pruneExpiredContacts()` מחזורי; dashboard API חושף `contact_count` ב-subquery
🎨
33 צבעי אזורים
33 צבעים ייחודיים לאזורים במפות Mapbox; runtime assertion שמגן מפני אי-התאמה בין רשימת הצבעים לאזורים
🏁
allClearService
שירות all-clear מלא: DM + ערוץ + שניהם; injectable deps; renderTemplate per-zone עם try-catch; ביטול ב-newsFlash רשמי "האירוע הסתיים"
📊
density infrastructure
`alertHistoryRepository`, `alertDensity.ts`, Israel-timezone cutoff — מחשב 90th percentile ב-`getDensityLabel()`
📐
פורמט משותף
`buildSummaryLine()` — מקור יחיד לספירת ערים/אזורים בטלגרם ו-WhatsApp; תיקון דקדוקי "1 עיר" לעומת "N ערים"
🗓️
alertSerial ב-Israel
מספרי אינדקס התרעות לפי שעון ישראל (`Asia/Jerusalem`) — אינדקס מתאפס בחצות המקומית
🎛️
Dashboard UX
Sidebar RTL מתקפל, page headers אחידים, toast consistency בעברית; Settings badges: ENV vs DB source לכל הגדרה
🔐
הגדרות ואבטחה
ניהול AES-256-GCM מוצפן של API keys (DEK/KEK envelope) — ללא צורך ב-env vars לאחר bootstrap; `rewrapDek()` לרוטציית סיסמה
✏️
תבניות הודעה
עורך תבניות גוף הודעה עם `{{ערים}}` `{{כותרת}}` `{{זמן}}` `{{אמוגי}}` `{{מספר_ערים}}`; live preview בסגנון Telegram
💬
טקסטי DM
רלוונטיות ("באזורך", "באזור קרוב") ו-"נשמו" — ניתנים לשינוי מלשונית "הודעות DM" בדאשבורד ללא restart
🛡️
Safety Check Dashboard
טאב `/safety-check` בדשבורד — 6 KPI cards, גרף מגמה 7 ימים, טבלת שאלות אחרונות עם מיסוך פרטיות; 60s cache
👥
ניהול טקסטים חברתיים
עריכה חמה של כל טקסטי התכונות החברתיות מהדשבורד; `getString`/`getNumber`/`getBool` ב-configResolver; תצוגה מקדימה עם DOMPurify
🏘️
Community Dashboard
עמוד `/community` בדשבורד: cooldown סקרים, מגבלת תווים לסיפורים, threshold תוצאות, השהיית שכנים — כולן hot-configurable ללא restart
🗃️
`skill_catalog` table
30 מיומנויות מוגדרות מראש עם קטגוריות; injectable deps לבדיקות; `getSkillsByCategory()` sorted
תיקון
פרטים
🔤
יישור RTL
תווי `\u200F` (Right-to-Left Mark) נוספו לכותרות אזורים ב-`buildZonedCityList`, `buildZoneOnlyList` ו-`formatAlertMessage` — מונע הצגה הפוכה של הכדור `▸`
🏠
"נשמו" לפי עיר בית
הודעת "נשמו" נשלחת רק למי שעיר המגורים (`home_city`) הייתה בהתראה המקורית — לא לכל המנויים לאזור
🔕
"נשמו" + שעות שקט
שעות שקט ו-snooze מופעלים גם על הודעת "נשמו" (לא מעקפים אותם כבעבר)
⚡
"נשמו" דרך DmQueue
הודעת "נשמו" עוברת דרך `dmQueue` (מקביליות 10 + backoff 429) — מונעת flood בעת התראות רחבות-היקף