The Insights tab ignored the time-range picker in the upper right: clicking
'15 minutes' still showed findings from the analyzer's fixed background
window (WindowDays, e.g. 7 days), because /api/insights always returned the
cached background result regardless of what range the UI requested.
- internal/insights/analyzer.go: split Refresh()'s logic into a shared
analyze(from, to) core, and add a public AnalyzeRange(from, to) that runs
the detectors on demand for an arbitrary window without disturbing the
cached background result used by Latest() and the Stop-hook/surfacing
path.
- internal/web/insights.go: handleInsights now honors optional from/to query
params, calling AnalyzeRange for that window instead of Latest() when
present.
- internal/web/static/app.js: loadInsights() sends the current
state.rangeMicros as from/to, and the window label now renders
minutes/hours/days appropriately (windowLabel()) instead of always
rounding up to whole days, so a 15-minute selection reads as '15 minutes'
rather than '1 day'.