Skip to content

Commit f928bec

Browse files
committed
release: prepare v4.25.0
1 parent fd4e29f commit f928bec

File tree

15 files changed

+109
-141
lines changed

15 files changed

+109
-141
lines changed

VERSION

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
4.24.0
1+
4.25.0

deploy/helm/pulse/Chart.yaml

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,8 +2,8 @@ apiVersion: v2
22
name: pulse
33
description: Helm chart for deploying the Pulse hub and optional Docker monitoring agent.
44
type: application
5-
version: 0.1.0
6-
appVersion: "4.24.0"
5+
version: 4.25.0
6+
appVersion: "4.25.0"
77
icon: https://raw.githubusercontent.com/rcourtman/Pulse/main/docs/images/pulse-logo.svg
88
keywords:
99
- monitoring

docs/FAQ.md

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -93,6 +93,8 @@ Yes! When you add one cluster node, Pulse automatically discovers and monitors a
9393
Reduce `metricsRetentionDays` in settings and restart
9494

9595
### How do I monitor adaptive polling?
96+
**New in v4.25.0:** The adaptive scheduler now exposes staleness scores, circuit breaker state, and per-resource poll metrics so you can trace why work was delayed.
97+
9698
**New in v4.24.0:** Pulse includes adaptive polling that automatically adjusts polling intervals based on system load.
9799

98100
**Monitor adaptive polling:**
@@ -111,7 +113,8 @@ Reduce `metricsRetentionDays` in settings and restart
111113

112114
See [Adaptive Polling Documentation](monitoring/ADAPTIVE_POLLING.md) for complete details.
113115

114-
### What's new about rate limiting in v4.24.0?
116+
### What's new about rate limiting in v4.25.0?
117+
**New in v4.25.0:** Adaptive polling metrics and circuit breaker states are now exposed alongside rate-limit headers, making throttling decisions easier to interpret.
115118
Pulse now returns standard rate limit headers with all API responses:
116119

117120
**Response Headers:**

docs/INSTALL.md

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -107,6 +107,7 @@ systemctl status pulse-update.timer # Check status
107107
- Creates backup before updating
108108
- Automatically rolls back if update fails
109109
- Logs all activity to systemd journal
110+
- **New in v4.25.0**: Adaptive monitoring now ships with circuit breakers, staleness tracking, and richer poll metrics while the Helm chart streamlines Kubernetes installs bundled with the binary.
110111
- **New in v4.24.0**: Rollback history is retained in Settings → System → Updates; use the new 'Restore previous version' button if the latest build regresses
111112

112113
#### View Update Logs
@@ -138,7 +139,7 @@ docker run -d --name pulse -p 7655:7655 -v pulse_data:/data rcourtman/pulse:late
138139

139140
### Rollback to Previous Version
140141

141-
**New in v4.24.0:** Pulse retains previous versions and allows easy rollback if an update causes issues.
142+
**New in v4.25.0:** Pulse retains previous versions and allows easy rollback if an update causes issues, now backed by detailed scheduler metrics so you can see why a rollback triggered.
142143

143144
#### Via UI (Recommended)
144145
1. Navigate to **Settings → System → Updates**
@@ -187,7 +188,7 @@ curl -fsSL https://raw.githubusercontent.com/rcourtman/Pulse/main/install.sh | b
187188

188189
### Runtime Logging Configuration
189190

190-
**New in v4.24.0:** Adjust logging settings without restarting Pulse.
191+
**New in v4.25.0:** Adjust logging settings without restarting Pulse; the structured logging subsystem now centralizes format, destinations, and rotation controls.
191192

192193
#### Via UI
193194
Navigate to **Settings → System → Logging** to configure:
@@ -209,7 +210,7 @@ docker run -e LOG_LEVEL=debug -e LOG_FORMAT=json rcourtman/pulse:latest
209210

210211
### Adaptive Polling
211212

212-
**New in v4.24.0:** Adaptive polling is now enabled by default, automatically adjusting polling intervals based on system load and responsiveness. Monitor status via **Settings → System → Monitoring** or the new Scheduler Health API at `/api/monitoring/scheduler/health`.
213+
**New in v4.25.0:** Adaptive polling now publishes staleness scores, circuit breaker states, and poll timings in `/api/monitoring/scheduler/health`, giving operators context when the scheduler slows down.
213214

214215
## Troubleshooting
215216

docs/KUBERNETES.md

Lines changed: 7 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,8 @@
22

33
Deploy Pulse to Kubernetes with the bundled Helm chart under `deploy/helm/pulse`. The chart provisions the Pulse hub (web UI + API) and can optionally run the Docker monitoring agent alongside it. Stable builds are published automatically to the GitHub Container Registry (GHCR) whenever a Pulse release goes out.
44

5+
> **New in v4.25.0:** The Helm chart is shipped with the release archives and pairs with the upgraded monitoring engine (staleness tracking, circuit breakers, detailed poll metrics) so Kubernetes clusters benefit from the same adaptive scheduling improvements as bare-metal installs.
6+
57
## Prerequisites
68

79
- Kubernetes 1.24 or newer with access to a default `StorageClass`
@@ -90,7 +92,7 @@ server:
9092
API_TOKENS: docker-agent-token
9193
```
9294
93-
### Runtime Logging Configuration (v4.24.0+)
95+
### Runtime Logging Configuration (v4.25.0+)
9496
9597
Configure logging behavior via environment variables:
9698
@@ -113,9 +115,9 @@ server:
113115
114116
**Note:** Logging changes via environment variables require pod restart. Use **Settings → System → Logging** in the UI for runtime changes without restart.
115117
116-
### Adaptive Polling Configuration (v4.24.0+)
118+
### Adaptive Polling Configuration (v4.25.0+)
117119
118-
Adaptive polling is **enabled by default** in v4.24.0. Configure via environment variables:
120+
Adaptive polling is **enabled by default** in v4.25.0. Configure via environment variables:
119121
120122
```yaml
121123
server:
@@ -210,9 +212,9 @@ Notes:
210212
- **Rollback:** `helm rollback pulse <revision>`
211213
- **Uninstall:** `helm uninstall pulse -n pulse` (PVCs remain unless you delete them manually)
212214

213-
### Post-Upgrade Verification (v4.24.0+)
215+
### Post-Upgrade Verification (v4.25.0+)
214216

215-
After upgrading to v4.24.0 or newer, verify the deployment:
217+
After upgrading to v4.25.0 or newer, verify the deployment:
216218

217219
1. **Check update history**
218220
```bash

docs/RELEASE.md

Lines changed: 0 additions & 84 deletions
This file was deleted.

frontend-modern/src/components/FirstRunSetup.tsx

Lines changed: 0 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,6 @@ export const FirstRunSetup: Component = () => {
1111
const [password, setPassword] = createSignal('');
1212
const [confirmPassword, setConfirmPassword] = createSignal('');
1313
const [useCustomPassword, setUseCustomPassword] = createSignal(false);
14-
const [generatedPassword, setGeneratedPassword] = createSignal('');
1514
const [, setApiToken] = createSignal('');
1615
const [isSettingUp, setIsSettingUp] = createSignal(false);
1716
const [showCredentials, setShowCredentials] = createSignal(false);
@@ -96,9 +95,6 @@ export const FirstRunSetup: Component = () => {
9695

9796
// Generate password if not custom
9897
const finalPassword = useCustomPassword() ? password() : generatePassword();
99-
if (!useCustomPassword()) {
100-
setGeneratedPassword(finalPassword);
101-
}
10298

10399
// Generate API token
104100
const token = generateToken();

frontend-modern/src/components/Settings/Settings.tsx

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@ import { UpdatesAPI } from '@/api/updates';
1818
import { Card } from '@/components/shared/Card';
1919
import { SectionHeader } from '@/components/shared/SectionHeader';
2020
import { Toggle } from '@/components/shared/Toggle';
21+
import type { ToggleChangeEvent } from '@/components/shared/Toggle';
2122
import { formField, labelClass, controlClass, formHelpText } from '@/components/shared/Form';
2223
import Server from 'lucide-solid/icons/server';
2324
import HardDrive from 'lucide-solid/icons/hard-drive';
@@ -1898,7 +1899,7 @@ const Settings: Component<SettingsProps> = (props) => {
18981899
</span>
18991900
<Toggle
19001901
checked={discoveryEnabled()}
1901-
onChange={async (e) => {
1902+
onChange={async (e: ToggleChangeEvent) => {
19021903
if (envOverrides().discoveryEnabled || savingDiscoverySettings()) {
19031904
e.preventDefault();
19041905
return;
@@ -2437,7 +2438,7 @@ const Settings: Component<SettingsProps> = (props) => {
24372438
</span>
24382439
<Toggle
24392440
checked={discoveryEnabled()}
2440-
onChange={async (e) => {
2441+
onChange={async (e: ToggleChangeEvent) => {
24412442
if (envOverrides().discoveryEnabled || savingDiscoverySettings()) {
24422443
e.preventDefault();
24432444
return;
@@ -2866,7 +2867,7 @@ const Settings: Component<SettingsProps> = (props) => {
28662867
</span>
28672868
<Toggle
28682869
checked={discoveryEnabled()}
2869-
onChange={async (e) => {
2870+
onChange={async (e: ToggleChangeEvent) => {
28702871
if (envOverrides().discoveryEnabled || savingDiscoverySettings()) {
28712872
e.preventDefault();
28722873
return;
@@ -3309,7 +3310,7 @@ const Settings: Component<SettingsProps> = (props) => {
33093310
</div>
33103311
<Toggle
33113312
checked={discoveryEnabled()}
3312-
onChange={async (e) => {
3313+
onChange={async (e: ToggleChangeEvent) => {
33133314
if (envOverrides().discoveryEnabled || savingDiscoverySettings()) {
33143315
e.preventDefault();
33153316
return;

frontend-modern/src/components/shared/NodeSummaryTable.tsx

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -487,7 +487,7 @@ export const NodeSummaryTable: Component<NodeSummaryTableProps> = (props) => {
487487
onClick={() => props.onNodeClick(nodeId, item.type)}
488488
>
489489
<td
490-
class={`pr-2 py-0.5 whitespace-nowrap ${showAlertHighlight ? 'pl-4' : 'pl-3'}`}
490+
class={`pr-2 py-0.5 whitespace-nowrap ${showAlertHighlight() ? 'pl-4' : 'pl-3'}`}
491491
>
492492
<div class="flex items-center gap-1">
493493
<a

frontend-modern/src/components/shared/Toggle.tsx

Lines changed: 23 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -2,10 +2,13 @@ import { JSX } from 'solid-js';
22

33
type ToggleSize = 'xs' | 'sm' | 'md';
44

5-
interface ToggleChangeEvent {
5+
export interface ToggleChangeEvent {
66
currentTarget: {
77
checked: boolean;
88
};
9+
preventDefault: () => void;
10+
stopPropagation: () => void;
11+
readonly defaultPrevented: boolean;
912
}
1013

1114
interface BaseToggleProps {
@@ -37,8 +40,25 @@ export function TogglePrimitive(props: BaseToggleProps): JSX.Element {
3740
const handleClick = () => {
3841
if (isDisabled()) return;
3942
const next = !props.checked;
40-
props.onToggle?.();
41-
props.onChange?.({ currentTarget: { checked: next } });
43+
let defaultPrevented = false;
44+
45+
const event: ToggleChangeEvent = {
46+
currentTarget: { checked: next },
47+
preventDefault() {
48+
defaultPrevented = true;
49+
},
50+
stopPropagation() {
51+
/* noop for synthetic toggle event */
52+
},
53+
get defaultPrevented() {
54+
return defaultPrevented;
55+
},
56+
};
57+
58+
props.onChange?.(event);
59+
if (!event.defaultPrevented) {
60+
props.onToggle?.();
61+
}
4262
};
4363

4464
return (

0 commit comments

Comments
 (0)