From 5144c8070a98b7e4b2d0c2bf48c11d7ac2166ff2 Mon Sep 17 00:00:00 2001 From: digua Date: Thu, 4 Jun 2026 00:45:34 +0800 Subject: [PATCH] fix(update): suppress cli dev update badge --- apps/cli/src/http/routes/web/index.ts | 7 +++-- .../src/http/routes/web/update-check.test.ts | 26 +++++++++++++++++++ apps/cli/src/http/routes/web/update-check.ts | 25 ++++++++++++++++++ src/services/platform/web.test.ts | 16 ++++++++++++ 4 files changed, 70 insertions(+), 4 deletions(-) create mode 100644 apps/cli/src/http/routes/web/update-check.test.ts create mode 100644 apps/cli/src/http/routes/web/update-check.ts diff --git a/apps/cli/src/http/routes/web/index.ts b/apps/cli/src/http/routes/web/index.ts index 25371599..5aa02ea1 100644 --- a/apps/cli/src/http/routes/web/index.ts +++ b/apps/cli/src/http/routes/web/index.ts @@ -20,7 +20,7 @@ import * as os from 'os' import * as path from 'path' import type { FastifyInstance } from 'fastify' -import { isNewerStableVersion, type PathProvider } from '@openchatlab/core' +import type { PathProvider } from '@openchatlab/core' import type { DatabaseManager, AIConversationManager, @@ -43,6 +43,7 @@ import { MergeSessionCache } from '../../../merger/merge-cache' import { registerImportRoutes } from './import' import { openDirectoryPath, showPathInFolder } from './cache' import { getVersion } from '../../../version' +import { buildWebUpdateCheckResult } from './update-check' export interface AiContextOptions { aiDataDir: string @@ -149,9 +150,7 @@ export function registerWebRoutes( return { hasUpdate: false, currentVersion, error: `latest-version HTTP ${resp.status}` } } const data = (await resp.json()) as { version?: string } - const latestVersion = data.version || currentVersion - const hasUpdate = isNewerStableVersion(latestVersion, currentVersion) - return { hasUpdate, currentVersion, latestVersion } + return buildWebUpdateCheckResult({ currentVersion, latestVersion: data.version }) } catch (err) { return { hasUpdate: false, diff --git a/apps/cli/src/http/routes/web/update-check.test.ts b/apps/cli/src/http/routes/web/update-check.test.ts new file mode 100644 index 00000000..8912f1f0 --- /dev/null +++ b/apps/cli/src/http/routes/web/update-check.test.ts @@ -0,0 +1,26 @@ +import { describe, it } from 'node:test' +import assert from 'node:assert/strict' +import { buildWebUpdateCheckResult } from './update-check' + +describe('CLI Web update check', () => { + it('does not show an update notice for local development placeholder versions', () => { + assert.deepEqual(buildWebUpdateCheckResult({ currentVersion: '0.0.0', latestVersion: '0.24.0' }), { + hasUpdate: false, + currentVersion: '0.0.0', + latestVersion: '0.24.0', + }) + assert.deepEqual(buildWebUpdateCheckResult({ currentVersion: '0.0.0-dev', latestVersion: '0.24.0' }), { + hasUpdate: false, + currentVersion: '0.0.0-dev', + latestVersion: '0.24.0', + }) + }) + + it('reports stable updates for real CLI versions', () => { + assert.deepEqual(buildWebUpdateCheckResult({ currentVersion: '0.23.0', latestVersion: '0.24.0' }), { + hasUpdate: true, + currentVersion: '0.23.0', + latestVersion: '0.24.0', + }) + }) +}) diff --git a/apps/cli/src/http/routes/web/update-check.ts b/apps/cli/src/http/routes/web/update-check.ts new file mode 100644 index 00000000..11889a9f --- /dev/null +++ b/apps/cli/src/http/routes/web/update-check.ts @@ -0,0 +1,25 @@ +import { isNewerStableVersion } from '@openchatlab/core' + +export interface WebUpdateCheckResult { + hasUpdate: boolean + currentVersion: string + latestVersion?: string +} + +function isDevelopmentPlaceholderVersion(version: string): boolean { + return /^0\.0\.0(?:$|-)/.test(version.trim()) +} + +export function buildWebUpdateCheckResult(options: { + currentVersion: string + latestVersion?: string | null +}): WebUpdateCheckResult { + const latestVersion = options.latestVersion || options.currentVersion + return { + hasUpdate: + !isDevelopmentPlaceholderVersion(options.currentVersion) && + isNewerStableVersion(latestVersion, options.currentVersion), + currentVersion: options.currentVersion, + latestVersion, + } +} diff --git a/src/services/platform/web.test.ts b/src/services/platform/web.test.ts index 351d38a6..d1f74ef0 100644 --- a/src/services/platform/web.test.ts +++ b/src/services/platform/web.test.ts @@ -3,6 +3,22 @@ import assert from 'node:assert/strict' import { WebPlatformAdapter } from './web' describe('WebPlatformAdapter', () => { + it('uses the bundled web version for display without querying the CLI server', async () => { + const originalFetch = globalThis.fetch + const requestedUrls: string[] = [] + globalThis.fetch = ((input: RequestInfo | URL) => { + requestedUrls.push(String(input)) + return Promise.resolve(new Response(JSON.stringify({ version: '0.0.0' }))) + }) as typeof fetch + + try { + assert.equal(await new WebPlatformAdapter().getVersion(), 'web') + assert.deepEqual(requestedUrls, []) + } finally { + globalThis.fetch = originalFetch + } + }) + it('does not bootstrap self-update auth from public web config', async () => { const originalFetch = globalThis.fetch const requestedUrls: string[] = []