openclaw/apps
Peter Steinberger a0a93bdde7
fix(activity): summary card ignores the selected time filter (#161060)
* fix(activity): summary card ignores the selected time filter

The Activity pulse card was pinned to the local civil day and the Gateway
capped the pulse at one day of hourly buckets, so Last 24 hours, 7 days,
30 days, and All time all showed today's numbers while the list below
narrowed correctly.

sessions.list replaces activityPulseSince/activityPulseUntil (added in
#159611, not in a tagged release) with activityPulseBoundaries: 2 to 64
strictly ascending boundaries computed in the caller's local time zone.
Pulse sessions, people, and running counts now cover the whole filtered
result; started counts sessions created within activeMinutes and is
omitted for All time. The UI requests 25 hourly, 8 or 31 daily, or 12
monthly buckets, refreshes when the current bucket ends, and aligns axis
labels with their bars. Hour starts subtract local minutes so a repeated
DST hour cannot shift the window.

Production lines stay neutral through nearby behavior-preserving cleanup.

* fix(activity): mock Activity pulse follows the selected time filter

The dev mock answered every Activity time filter with one fixed hourly pulse and fixed totals, which the window-aware renderer drew as days or months. Each bounded window now has its own case keyed on activeMinutes, with rows filtered by activity time and a pulse bucketed by the same boundaries the UI sends.

* fix(sessions): reject unordered pulse boundaries before subscribing to events

sessions.subscribe registered the connection for session events before the list handler rejected non-ascending activityPulseBoundaries, so a rejected subscribe stayed subscribed. The ascending rule now lives in the shared sessions.list params validator as a precheck, which both RPCs run before registration or store reads, and it compares only numeric boundaries so malformed elements reach the schema's type error.

* fix(sessions): type-check pulse boundary precheck without assertions

The merged head failed tsgo (unchecked index) and the assertion-safety ratchet (uncommented cast), which also broke the declaration-building lanes. The precheck now reads params through asNullableRecord, narrows boundaries with a number type predicate, and treats the first boundary's missing predecessor explicitly.

* docs(activity): describe the pulse card for each time window

The Control UI Activity guide still promised a fixed Today card with hourly bars. It now describes the hourly, daily, and monthly pulse for the selected window, the window-scoped counts, and the All time count scope.
2026-09-29 19:16:40 -07:00
..
.i18n refactor(apple): deslop macOS and iOS apps third pass (#159778) 2026-09-28 09:26:55 -07:00
android refactor(android): deslop Android app sixth pass (#161391) 2026-09-29 23:00:47 +00:00
ios feat(ios): distribute daily TestFlight builds for external testing (#161460) 2026-09-29 20:43:46 -05:00
linux fix: dashboards require approval after native app authentication (#159860) 2026-09-28 16:16:53 -06:00
macos fix(macos): restored dashboards can stick on a failure page, and Dashboard tests flake on busy runners (#160886) 2026-09-29 17:07:38 -07:00
macos-mlx-tts chore(deps): refresh dependencies through September 19 cutoff (#159401) 2026-09-27 19:33:08 -07:00
shared fix(activity): summary card ignores the selected time filter (#161060) 2026-09-29 19:16:40 -07:00
swabble refactor(apple): deslop shared Swift packages second pass (#159386) 2026-09-27 14:35:55 +00:00