Releases: nocoo/owl
Releases · nocoo/owl
v1.8.0
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
computeCPUPercentto walk the full delta list (consistent withcomputeTopMemory) 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
formatMemorystatic method for UI and clipboard, eliminating duplicate formatting logic
Documentation
- Clarify RSS (
pti_resident_size) limitation —phys_footprintrequires root/taskgated entitlement for other processes
Tests
- Rewrite
computeTopMemorySortsByMemoryDescendingwith deterministic input using real PIDs (getpid/getppid) - Add
computeTopMemorySkipsUnresolvablePidstest for name-resolution skip path - Split
topProcessesRefreshesWhenEmptyinto separate CPU-empty and memory-empty test cases
v1.7.0
Features
- Add
MetricsDetectorprotocol 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.ThermalStatetransitions to.fair/.serious/.critical - Add generic
MetricsThresholdDetectorwith 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
notificationsEnabledsetting (default: on) to control notification banners - Enable swap and disk metrics sampling in background mode for always-on detector coverage
Bug Fixes
- Guard
UNUserNotificationCentercalls against missing bundle identifier to prevent crash in SPM debug builds
Tests
- Add 10 tests for
SustainedCPUDetectorstate machine (normal/elevated/warning/critical/recovery) - Add 8 tests for
ThermalStateDetectorstate 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.onAlertActivatedcallback (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
Performance
- Replace
String.containswith UTF-8 byte-level substring search inpassesPreFilter, eliminating Unicode normalization overhead (~5-15× faster for pure-ASCII keywords). Addresses high CPU usage that caused macOS to generatecpu_resourcediagnostics 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.owltoai.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
Bug Fixes
- Add early-exit guards in
OwlEngineandSystemMetricsPollerto eliminate redundant work when popover is already in the target state - Preserve
refreshNowflag semantics and network history append behavior inAppState.updateMetrics
Tests
- Add unit tests locking down history semantics in
AppState.updateMetrics(network history append, refreshNow passthrough) - Add unit tests for
SystemMetricsPollerearly-exit guard behavior
v1.6.0
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
uniquingKeysWithinstead ofuniqueKeysWithValues
Refactoring
- Extract
BatteryProviderandHIDTemperatureProviderpure-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.buildMetricswith property snapshot injection - Add unit tests for
HIDTemperatureProviderstatic CPU/GPU temperature calculation - Add integration tests for log stream pre-filter pass-through (app hang, network failure)
- Add unit tests for
SystemMetricsPollersampling profiles, top-process throttling, and mode switching
v1.5.0
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
CopyableSectionwrapper with green "Copied" feedback badge in section header and hover highlight
Bug Fixes
- Fix missed clicks in metric sections by moving
contentShapeinside button label to prevent ScrollView gesture conflicts
Tests
- Add 34 tests for clipboard text generation across all metric sections
v1.4.0
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_infoand 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
Features
- Add HID thermal sensor support via
IOHIDEventSystemClientfor reliable CPU temperature on Apple Silicon (replaces unreliable SMCTp*keys) - Add
HIDThermalBridgeObj-C target andHIDTemperatureProviderSwift 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
\uXXXXunicode escapes and surrogate pairs in fast JSON parser - Defer
proc_namecalls to top-N candidates only to reduce syscall overhead - Add independent timer flush to prevent entries stuck in batch during low traffic
- Annotate
AlertStateManagerwith@MainActorfor compile-time isolation
Performance
- Replace O(n log n) sort with linear scan in LRU eviction
- Avoid temporary set allocation in
distinctCountby counting incrementally
Refactoring
- Migrate
AppStatefromObservableObjectto@Observablefor 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
Features
- Add
SignatureDetectorwith 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
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
L10nKeyin config structs, resolve at emission time instead of detector construction time - Fix hardcoded English in recovery alerts ("— Recovered", "system") — now uses L10n keys
- Expand
alertSleepDescto 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