feat(version-check): add HERMES_WEB_UI_DISABLE_UPDATE_CHECK env var (#1105)

Adds an opt-in environment variable to suppress the npm-registry update
check. When set, three things change:

1. checkLatestVersion() returns immediately (no outbound fetch)
2. startVersionCheck() does not arm the 30-minute interval
3. /api/health returns webui_latest='' and webui_update_available=false

Use case: hermes-web-ui is bundled inside a packaged distribution like
a desktop app where the user cannot `npm install -g hermes-web-ui@latest`
to apply an upgrade. The 'update available' prompt is then misleading
(the user would have to wait for the wrapper app to ship a new release),
and the recurring HTTPS call to the npm registry is unnecessary noise.

Set HERMES_WEB_UI_DISABLE_UPDATE_CHECK=true | 1 | on | yes to disable.
The default behavior is unchanged.

Discussed in #1091 — proposed by @EKKOLearnAI.
This commit is contained in:
sir1st
2026-05-28 22:36:07 +08:00
committed by GitHub
parent 14466dfc9f
commit 1373b4746b
+21 -2
View File
@@ -45,7 +45,23 @@ const LOCAL_VERSION = typeof __APP_VERSION__ !== 'undefined'
let cachedLatestVersion = '' let cachedLatestVersion = ''
/**
* Whether the periodic npm-registry version check is disabled.
*
* Useful when hermes-web-ui is bundled inside a packaged distribution
* (e.g. a desktop app) where the user can't `npm install -g hermes-web-ui@latest`
* to upgrade — the "update available" prompt would be misleading and
* the periodic outbound HTTP request to the npm registry is unnecessary.
*
* Set HERMES_WEB_UI_DISABLE_UPDATE_CHECK=true (or 1, on, yes) to disable.
*/
function isUpdateCheckDisabled(): boolean {
const raw = (process.env.HERMES_WEB_UI_DISABLE_UPDATE_CHECK || '').trim().toLowerCase()
return raw === 'true' || raw === '1' || raw === 'on' || raw === 'yes'
}
export async function checkLatestVersion(): Promise<void> { export async function checkLatestVersion(): Promise<void> {
if (isUpdateCheckDisabled()) return
try { try {
const packageName = PACKAGE_INFO?.name || 'hermes-web-ui' const packageName = PACKAGE_INFO?.name || 'hermes-web-ui'
const registryName = encodeURIComponent(packageName) const registryName = encodeURIComponent(packageName)
@@ -61,6 +77,7 @@ export async function checkLatestVersion(): Promise<void> {
} }
export function startVersionCheck(): void { export function startVersionCheck(): void {
if (isUpdateCheckDisabled()) return
setTimeout(checkLatestVersion, 5000) setTimeout(checkLatestVersion, 5000)
setInterval(checkLatestVersion, 30 * 60 * 1000) setInterval(checkLatestVersion, 30 * 60 * 1000)
} }
@@ -74,8 +91,10 @@ export async function healthCheck(ctx: any) {
version: hermesVersion, version: hermesVersion,
gateway: 'running', gateway: 'running',
webui_version: LOCAL_VERSION, webui_version: LOCAL_VERSION,
webui_latest: cachedLatestVersion, webui_latest: isUpdateCheckDisabled() ? '' : cachedLatestVersion,
webui_update_available: Boolean(LOCAL_VERSION && cachedLatestVersion && cachedLatestVersion !== LOCAL_VERSION), webui_update_available: isUpdateCheckDisabled()
? false
: Boolean(LOCAL_VERSION && cachedLatestVersion && cachedLatestVersion !== LOCAL_VERSION),
node_version: process.versions.node, node_version: process.versions.node,
} }
} }