Software update notification (#1002) (#1054)

* add `auto_check_updates` config value

* add `auto_check_updates` to dist config

* add `Update` `NotificationType`

* implement update checker and worker

* add endpoint, add to documentation, add worker

* clone update_status_lock Arc

* fmt

* add more tests

* remove todo

* add to docs

* frontend update notice

* improve name in documentation

* add user-agent to update check request

* add update check request timeout

* openapi trait bound

* do not enable `auto_check_updates` by default

* remove redundant documentation

* surface fetch of update status error

* fail on version with pre-release for now, add additional test cases

* Update configuration.md

---------

Co-authored-by: Markus Unterwaditzer <markus-tarpit+git@unterwaditzer.net>
This commit is contained in:
recanman
2026-05-24 20:59:18 +00:00
committed by GitHub
parent e86d30a0c6
commit 517a17db14
13 changed files with 428 additions and 1 deletions
+12
View File
@@ -3,9 +3,11 @@
import {
get_manifest,
get_system_stats,
get_update_status,
get_gps,
get_config,
GpsMode,
type UpdateStatus,
type GpsData,
} from '$lib/utils.svelte';
import ManifestTable from '$lib/components/ManifestTable.svelte';
@@ -19,6 +21,7 @@
import ActionErrors from '$lib/components/ActionErrors.svelte';
import ClockDriftAlert from '$lib/components/ClockDriftAlert.svelte';
import LogView from '$lib/components/LogView.svelte';
import UpdateNotice from '$lib/components/UpdateNotice.svelte';
let manager: AnalysisManager = new AnalysisManager();
let loaded = $state(false);
@@ -31,6 +34,7 @@
let config_shown: boolean = $state(false);
let gps_data: GpsData | null = $state(null);
let gps_mode: GpsMode = $state(GpsMode.Disabled);
let update_status: UpdateStatus | null = $state(null);
$effect(() => {
const interval = setInterval(async () => {
try {
@@ -49,6 +53,13 @@
current_entry = new_manifest.current_entry;
system_stats = await get_system_stats();
// Allow update status to fail
try {
update_status = await get_update_status();
} catch (error) {
console.error('Error fetching update status:', error);
update_status = null;
}
const config = await get_config();
gps_mode = config.gps_mode;
gps_data = await get_gps();
@@ -252,6 +263,7 @@
{/if}
<ActionErrors />
<ClockDriftAlert />
<UpdateNotice status={update_status} />
{#if loaded}
<div class="flex flex-col lg:flex-row gap-4">
{#if current_entry}