feat: add auto-update system with release checking, notification UI, and install-type-aware apply

- Abstract ReleaseProvider interface (Gitea impl, swappable for GitHub/GitLab)
- Background UpdateService with periodic checks, debounce, dismissed version persistence
- Install type detection (installer/portable/docker/dev) with platform-aware asset matching
- Download with progress events, silent NSIS reinstall, portable ZIP/tarball swap scripts
- Version badge pulse animation, dismissible banner with icon buttons, Settings > Updates tab
- Single source of truth: pyproject.toml version via importlib.metadata, CI stamps tag with sed
- API: GET/POST status, check, dismiss, apply, GET/PUT settings
- i18n: en, ru, zh (27+ keys each)
This commit is contained in:
2026-03-25 13:16:18 +03:00
parent d2b3fdf786
commit 382a42755d
30 changed files with 1750 additions and 44 deletions

View File

@@ -199,6 +199,11 @@ import {
loadLogLevel, setLogLevel,
saveExternalUrl, getBaseOrigin, loadExternalUrl,
} from './features/settings.ts';
import {
loadUpdateStatus, initUpdateListener, checkForUpdates,
loadUpdateSettings, saveUpdateSettings, dismissUpdate,
initUpdateSettingsPanel, applyUpdate,
} from './features/update.ts';
// ─── Register all HTML onclick / onchange / onfocus globals ───
@@ -560,6 +565,14 @@ Object.assign(window, {
saveExternalUrl,
getBaseOrigin,
// update
checkForUpdates,
loadUpdateSettings,
saveUpdateSettings,
dismissUpdate,
initUpdateSettingsPanel,
applyUpdate,
// appearance
applyStylePreset,
applyBgEffect,
@@ -703,6 +716,10 @@ document.addEventListener('DOMContentLoaded', async () => {
startEntityEventListeners();
startAutoRefresh();
// Initialize update checker (banner + WS listener)
initUpdateListener();
loadUpdateStatus();
// Show getting-started tutorial on first visit
if (!localStorage.getItem('tour_completed')) {
setTimeout(() => startGettingStartedTutorial(), 600);