Skip to content

Releases: nocoo/owl

v1.8.0

16 Mar 22:03

Choose a tag to compare

Features

  • Add top memory processes section to popover — shows top 3 processes by RSS with color-coded mini bars and dynamic scaling
  • Increase popover default height from 696 to 760 for better content fit

Bug Fixes

  • Fix process name resolution ordering — resolve names before truncating to count so exited processes don't reduce result count
  • Fix top-process refresh throttle — check both CPU and memory list counts so an empty CPU list doesn't bypass the 10-second cooldown
  • Fix computeCPUPercent to walk the full delta list (consistent with computeTopMemory) instead of over-fetching by a fixed margin
  • Fix dynamic MiniBar scaling — use the largest process as 100% baseline instead of a hardcoded 4 GB cap

Refactoring

  • Extract shared formatMemory static method for UI and clipboard, eliminating duplicate formatting logic

Documentation

  • Clarify RSS (pti_resident_size) limitation — phys_footprint requires root/taskgated entitlement for other processes

Tests

  • Rewrite computeTopMemorySortsByMemoryDescending with deterministic input using real PIDs (getpid/getppid)
  • Add computeTopMemorySkipsUnresolvablePids test for name-resolution skip path
  • Split topProcessesRefreshesWhenEmpty into separate CPU-empty and memory-empty test cases

v1.7.0

15 Mar 00:01

Choose a tag to compare

Features

  • Add MetricsDetector protocol for periodic system metrics analysis alongside log-based pattern detection
  • Add P15 Sustained High CPU detector — warns when CPU usage exceeds 80% for 60+ seconds, escalates to critical when combined with thermal pressure
  • Add P16 Thermal State detector — alerts on ProcessInfo.ThermalState transitions to .fair/.serious/.critical
  • Add generic MetricsThresholdDetector with sustained duration tracking, hysteresis recovery, and configurable warning/critical thresholds
  • Add P17 Memory Pressure detector — warns at >85%, critical at >95%, recovery ≤80% (30s sustained)
  • Add P18 Swap Usage detector — warns at >4 GB, critical at >8 GB, recovery ≤3 GB (30s sustained)
  • Add P19 Disk Usage detector — warns at >85%, critical at >95%, recovery ≤80% (60s sustained)
  • Add macOS system notification banners (UNUserNotification) when alerts are activated or upgraded in severity
  • Add notificationsEnabled setting (default: on) to control notification banners
  • Enable swap and disk metrics sampling in background mode for always-on detector coverage

Bug Fixes

  • Guard UNUserNotificationCenter calls against missing bundle identifier to prevent crash in SPM debug builds

Tests

  • Add 10 tests for SustainedCPUDetector state machine (normal/elevated/warning/critical/recovery)
  • Add 8 tests for ThermalStateDetector state transitions
  • Add 13 tests for MetricsThresholdDetector (state transitions, hysteresis, direct-to-critical, disabled)
  • Add 3 smoke tests for P17/P18/P19 pattern factories (ID, initial state, metric extraction)
  • Add 4 tests for AlertStateManager.onAlertActivated callback (promote, upgrade, no-fire on refresh/downgrade)
  • Add 3 tests for AppSettings.notificationsEnabled (default, toggle, reset)
  • Update pipeline and catalog test counts from 17 to 20 detectors

v1.6.2

14 Mar 12:01

Choose a tag to compare

Performance

  • Replace String.contains with UTF-8 byte-level substring search in passesPreFilter, eliminating Unicode normalization overhead (~5-15× faster for pure-ASCII keywords). Addresses high CPU usage that caused macOS to generate cpu_resource diagnostics and hide the menu bar icon.

UI

  • Hide status label text in Normal state — menu bar shows only the bird icon, making alert states (Info/Warning/Critical) more visually prominent

Maintenance

  • Change bundle identifier from com.nocoo.owl to ai.hexly.owl.01

Tests

  • Add 21 unit tests for UTF-8 pre-filter covering all 20 keywords, NDJSON embedding, case sensitivity, substring matching, and keyword position

v1.6.1

12 Mar 09:05

Choose a tag to compare

Bug Fixes

  • Add early-exit guards in OwlEngine and SystemMetricsPoller to eliminate redundant work when popover is already in the target state
  • Preserve refreshNow flag semantics and network history append behavior in AppState.updateMetrics

Tests

  • Add unit tests locking down history semantics in AppState.updateMetrics (network history append, refreshNow passthrough)
  • Add unit tests for SystemMetricsPoller early-exit guard behavior

v1.6.0

09 Mar 06:38

Choose a tag to compare

Performance

  • Unify metrics polling into a single external control loop, eliminating the redundant internal poll loop in SystemMetricsPoller
  • Scale metrics polling by popover visibility — background mode (10s) collects only CPU and memory, foreground mode (2s) collects all sensors
  • Throttle top-process sampling to once per 10s in foreground mode, reusing cached rankings between refreshes
  • Reduce per-poll overhead by reusing HID/SMC sensor snapshots within a single sample cycle

Bug Fixes

  • Fix time-driven detector ticks by passing explicit clock values via tick(at:), enabling deterministic leak detection without synthetic log entries
  • Expand log stream pre-filter keywords for P11 (app hang) and P12 (network failure) patterns
  • Fix potential crash in SMC temperature dictionary construction by using uniquingKeysWith instead of uniqueKeysWithValues

Refactoring

  • Extract BatteryProvider and HIDTemperatureProvider pure-logic methods as static functions for testability
  • Remove redundant ThresholdDetector.tick(at:) override, relying on protocol default extension
  • Clean up pre-filter keyword ordering to match detector ID sequence

Tests

  • Add unit tests for BatteryProvider.buildMetrics with property snapshot injection
  • Add unit tests for HIDTemperatureProvider static CPU/GPU temperature calculation
  • Add integration tests for log stream pre-filter pass-through (app hang, network failure)
  • Add unit tests for SystemMetricsPoller sampling profiles, top-process throttling, and mode switching

v1.5.0

08 Mar 23:49

Choose a tag to compare

Features

  • Add click-to-copy for all metric sections (CPU, Memory, Disk, Power, Temperature, Network, Processes) — click any section to copy a formatted snapshot to clipboard
  • Add CopyableSection wrapper with green "Copied" feedback badge in section header and hover highlight

Bug Fixes

  • Fix missed clicks in metric sections by moving contentShape inside button label to prevent ScrollView gesture conflicts

Tests

  • Add 34 tests for clipboard text generation across all metric sections

v1.4.0

08 Mar 11:32

Choose a tag to compare

Features

  • Add battery wattage display in Power section via IOKit (Voltage × Amperage)
  • Refine popover section labels for CPU, memory, disk, and power

Bug Fixes

  • Fix CPU usage calculation: convert Mach absolute ticks to nanoseconds via mach_timebase_info and remove double-counted thread times
  • Fix real-time top processes display by expanding process sampling range
  • Align full-width row bars (MetricRow, InfoRow, SpeedRow) with two-column layout edges
  • Restore full state text in power section (Charging/Plugged/Battery)

Refactoring

  • Standardize all 2-column bar layouts (CoreMiniRow, DualThroughputRow) to TempMiniRow spec: label 38pt, bar flex, value 28pt, spacing 3, infoRowHeight 12pt
  • Merge memory info rows (Cache/Avail + PageIn/PageOut) into single 4-column row
  • Merge power info rows (State/Cycles/Condition) into single 4-column row with wattage
  • Compact disk, memory, and power section layouts

Tests

  • Add TopProcessProvider tests for sampling and CPU calculation

v1.3.0

08 Mar 07:29

Choose a tag to compare

Features

  • Add HID thermal sensor support via IOHIDEventSystemClient for reliable CPU temperature on Apple Silicon (replaces unreliable SMC Tp* keys)
  • Add HIDThermalBridge Obj-C target and HIDTemperatureProvider Swift wrapper with automatic chip generation detection (M1/M2 pACC/eACC, M3/M4 PMU tdie)
  • Add smooth animation to MiniBar and temperature text transitions
  • Show aggregated CPU/GPU/SSD/Battery temperatures instead of raw HID sensor dump

Bug Fixes

  • Fix CPU temperature flickering on Apple Silicon (M4 Max) — SMC Tp* keys return garbage data; now uses HID sensors as primary source
  • Tighten temperature validation range to 5–130°C to reject spurious readings
  • Cache last-known-good temperature to survive sporadic bad reads
  • Reset SMC input/output structs before second call to prevent stale data
  • Cache IOKit SMC connection for provider lifetime instead of per-call open/close
  • Add carry-over buffer to prevent pipe-fragmented line drops in log stream
  • Retain log stream reader reference to prevent subprocess leak on shutdown
  • Handle \uXXXX unicode escapes and surrogate pairs in fast JSON parser
  • Defer proc_name calls to top-N candidates only to reduce syscall overhead
  • Add independent timer flush to prevent entries stuck in batch during low traffic
  • Annotate AlertStateManager with @MainActor for compile-time isolation

Performance

  • Replace O(n log n) sort with linear scan in LRU eviction
  • Avoid temporary set allocation in distinctCount by counting incrementally

Refactoring

  • Migrate AppState from ObservableObject to @Observable for property-level tracking

Tests

  • Add unit tests for SMC temperature decoding and validation range
  • Add 12 tests for HIDTemperatureProvider sensor name parsing across chip generations

v1.2.0

07 Mar 12:47

Choose a tag to compare

Features

  • Add SignatureDetector with explicit capture group mapping, dual-buffer distinct counting, cooldowns, stale cleanup, and LRU eviction
  • Migrate P05 sandbox violation detection from rate counting to signature diversity with target normalization for temp paths, UUIDs, and numeric segments
  • Add release helper script to package versioned DMGs and publish them to GitHub Releases via gh

v1.1.1

07 Mar 07:47

Choose a tag to compare

Bug Fixes

  • Fix duplicate emoji in power state display (charging/plugged/battery labels showed emoji twice)
  • Fix alert strings not updating on language switch — store L10nKey in config structs, resolve at emission time instead of detector construction time
  • Fix hardcoded English in recovery alerts ("— Recovered", "system") — now uses L10n keys
  • Expand alertSleepDesc to include assertion ID and type in description template
  • Reduce AlertRow font sizes (title 14→11, body 12→10, timestamp 12→9) to match popover density