# Changelog All notable changes to this project will be documented in this file. The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.1.0/), and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). ## [0.3.1] - 2026-05-20 ### Hot fix - Improved update logging - Improved update settings ## [0.3.0] - 2026-05-19 ### Added - `event_forwarder.py` — forwards `.IDFH` (histogram) and `.IDFW` (waveform) event files plus their `TXT/.txt` sidecars to a seismo-relay SFM server's new `/db/import/idf_file` endpoint - Sha256-keyed `thor_forwarded.json` state file for idempotency across restarts and re-scans (default path: `/thor_forwarded.json`) - "SFM Forward" tab in Settings dialog: enable/URL/Test, forward interval, quiescence, missing-report grace, HTTP timeout, max forwards per pass, max event age, state file picker - Forwarder status line in tray menu: `SFM OK | N fwd, M err | last 30s ago` - Tray icon goes amber when the SFM forwarder is failing but the API heartbeat is still healthy - Re-pair logic: events forwarded without their TXT are re-forwarded once the sidecar appears so the relay can refresh DB rows with device-authoritative PPV/ZCFreq/peak values - `event_forwarder.py --seed-state` CLI for skipping historical backfill on a first deploy - Version badge: `Thor Watcher vX.Y.Z` shown at the top of the tray menu and in the Settings dialog title bar — operators no longer have to crack open the .exe properties to tell which version is running ### Changed - Bumped `VERSION` to `0.3.0` - Settings dialog tab order: Connection / Paths / Scanning / Logging / **SFM Forward** / Updates ## [0.2.0] - 2026-03-20 ### Added - `thor_tray.py` — system tray launcher with status icon (green/amber/red/grey), Settings and Open Log Folder menu items - `thor_settings_dialog.py` — Tkinter settings dialog with first-run wizard; tabs for Connection, Paths, Scanning, Logging, Updates - Hardened auto-updater: three-layer download validation (100 KB floor, 50% relative size floor, MZ magic bytes), safer swap bat with 5-retry cap and `:fail` exit, `.exe.old` backup - Configurable update source: `update_source` (gitea / url / disabled), `update_url` for custom server - Remote push support: `update_available` flag in API heartbeat response triggers update regardless of `update_source` setting - `build.bat` — PyInstaller build script; outputs versioned exe for Gitea and plain copy for Inno Setup - `installer.iss` — Inno Setup installer script with startup shortcut - `_update_log()` helper writes timestamped `[updater]` lines to the watcher log - `log_tail` included in heartbeat payload (last 25 lines) for terra-view display - `run_watcher(state, stop_event)` pattern in `series4_ingest.py` for background thread use from tray ### Changed - `series4_ingest.py` refactored into tray-friendly background thread module; `main()` retained for standalone use - Config key `sfm_endpoint` renamed to `api_url` for consistency with series3-watcher - Heartbeat payload now uses `source_id`, `source_type`, `version` fields matching terra-view WatcherAgent model - AppData folder: `ThorWatcher` (was not previously defined) ## [0.1.1] - 2025-12-08 ### Changed - Moved configuration from hard-coded values to external `config.json` file - Configuration now loads from JSON file with graceful fallback to defaults - Config file is loaded relative to script location for portability ### Added - `config.json` - External configuration file for all application settings - `load_config()` function with error handling and default value fallback - Warning messages when config file is missing or malformed ## [0.1.0] - 2025-12-04 ### Added - Initial release of Series 4 Ingest Agent - Micromate (Series 4) heartbeat monitoring for Seismo Fleet Manager - THORDATA folder scanner for MLG files - Automatic detection of newest MLG file per unit by timestamp - Age calculation and status classification (OK / LATE / STALE) - Console heartbeat display with formatted output - Optional HTTP POST to SFM backend endpoint - Configurable age thresholds and scan intervals - Debug logging capability - Graceful error handling for filesystem and network operations