OMV reports filesystem devices (sda1) without the /dev/ prefix, so the
partition-suffix normalization never applied and filesystem-to-SMART
matching returned no temperature. Strip partition suffixes from
unprefixed sd/vd, nvme and mmcblk names, and use the shared normalized
matcher in both the health monitoring and system disks widgets.
* feat(http): set custom User-Agent on outbound integration requests
Set a default 'User-Agent: Homarr/<version> (+https://homarr.dev)' header
on all outbound HTTP requests made via fetchWithTrustedCertificatesAsync,
so Homarr's integration traffic is distinguishable in reverse-proxy,
WAF, and security-monitoring logs instead of appearing as generic undici.
Closes#6604
* refactor(version): centralize Homarr version in @homarr/version package
Replace fragile deep-relative 'package.json' imports across the monorepo
with a single source of truth: the new @homarr/version leaf package reads
the version once from the root package.json and exports it as VERSION.
Consumers now import by package name incl. the new User-Agent header in
fetchWithTrustedCertificatesAsync (packages/core):
- core, api (info router), analytics, request-handler (update checker)
This also removes all manually-maintained relative version imports.
* fix(http): normalize User-Agent injection with Headers
Object-spreading fetchOptions.headers breaks when callers pass a Headers
instance (spread yields no entries) or a tuple array (numeric keys), and is
case-sensitive. Build a Headers instance and set the default User-Agent only
when no case-insensitive User-Agent entry exists, via a shared helper in both
fetch paths.
Adds unit tests covering record, Headers, tuple-array, and casing variants.
* revert(version): undo version refactor and tests, keep single-file change
Keep the User-Agent change as a single edit to
packages/core/src/infrastructure/http/request.ts. Remove the @homarr/version
package, the consumer migrations, and the unit tests.
Address CodeRabbit review on #6510:
- gridstack: only suppress recalculation when the width delta is
insignificant AND (non-dynamic OR height unchanged), so dynamic
sections still rebuild on height changes
- beszel: propagate the response parse failure via { cause } in both
error wrappers
- auth tests: cover invalid (non-string) OIDC groups claims
The Uptime-Kuma status-page API (toPublicJSON) does not emit a status
field on monitor objects, so the added status schema field and paused
early-return were dead code and did not resolve#6002. Paused monitors
stop producing heartbeats and the two consumed endpoints expose no
paused signal, so revert the change.
Unraid CPU: divide by cpus.length (the array actually being averaged)
instead of info.cpu.threads, which is more robust if the two ever
disagree, while keeping the SMT over-reporting fix.
- **Unraid CPU calculation** (#6082): Use thread count instead of core count
when normalizing CPU utilization. Each cpus[] entry is one thread, so
dividing by physical cores (cores) over-reports on SMT systems.
- **OIDC single-group sync** (#5716): Normalize the groups claim to always
be an array. Some providers (e.g. Jumpcloud) send a single group as a
plain string instead of an array, which caused the Array.isArray check
to skip group synchronization entirely.
- **Uptime-Kuma paused status** (#6002): Add the status field to the
monitor schema and check it before falling back to heartbeat inference.
When a monitor is paused, heartbeats stop arriving, so the latest
heartbeat may still show 'up' from before pausing. The status page
returns status=2 for paused monitors, which this change now respects.