✨ feat: add server version check for desktop app#11710
Conversation
- Add /api/version endpoint consumption in globalService - Add serverVersion and isServerVersionOutdated states to global store - Add useCheckServerVersion hook to detect outdated server - Show ServerVersionOutdatedAlert when server version is incompatible - Display server version tag in settings when different from client - Support version diff threshold (5 versions) for compatibility check
|
The latest updates on your projects. Learn more about Vercel for GitHub.
|
Reviewer's GuideAdds a desktop-only server version compatibility check: fetches Sequence diagram for desktop server version compatibility checksequenceDiagram
actor User
participant DesktopApp
participant StoreInitialization
participant GlobalStore
participant GlobalService
participant Server
participant AlertUI as ServerVersionOutdatedAlert
User->>DesktopApp: Launch desktop app
DesktopApp->>StoreInitialization: Render StoreInitialization
StoreInitialization->>GlobalStore: useInitSystemStatus()
StoreInitialization->>GlobalStore: useCheckServerVersion(isDesktop)
activate GlobalStore
GlobalStore->>GlobalService: getServerVersion()
activate GlobalService
GlobalService->>Server: GET /api/version
alt Server supports /api/version and is compatible
Server-->>GlobalService: 200 { version }
GlobalService-->>GlobalStore: version string
GlobalStore-->>GlobalStore: set serverVersion
GlobalStore-->>DesktopApp: isServerVersionOutdated = false
DesktopApp->>AlertUI: Render
AlertUI-->>DesktopApp: Returns null (not shown)
else Server too old or version too low
Server-->>GlobalService: 404 or 200 { old version }
GlobalService-->>GlobalStore: null or old version
GlobalStore-->>GlobalStore: set isServerVersionOutdated = true
GlobalStore-->>DesktopApp: isServerVersionOutdated = true
DesktopApp->>AlertUI: Render
AlertUI-->>User: Show outdated server modal
end
deactivate GlobalService
deactivate GlobalStore
Sequence diagram for About page server version displaysequenceDiagram
actor User
participant AboutPage as AboutVersionComponent
participant GlobalStore
participant VersionHook as useCheckServerVersion
participant GlobalService
participant Server
User->>AboutPage: Open Settings → About
AboutPage->>GlobalStore: select latestVersion, serverVersion, useCheckServerVersion
AboutPage->>VersionHook: useCheckServerVersion(isDesktop)
activate VersionHook
VersionHook->>GlobalService: getServerVersion()
GlobalService->>Server: GET /api/version
Server-->>GlobalService: 200 { version } or 404
GlobalService-->>VersionHook: version or null
VersionHook-->>GlobalStore: set serverVersion or isServerVersionOutdated
deactivate VersionHook
GlobalStore-->>AboutPage: serverVersion
alt serverVersion exists and != CURRENT_VERSION
AboutPage-->>User: Render client Tag vCURRENT_VERSION and server Tag v{serverVersion}
else No serverVersion or same as client
AboutPage-->>User: Render only client Tag vCURRENT_VERSION
end
Updated class diagram for global server version state and serviceclassDiagram
class GlobalState {
<<interface>>
+DatabaseLoadingState initClientDBStage
+boolean isMobile
+boolean isServerVersionOutdated
+boolean isStatusInit
+string latestVersion
+NavigateFunction navigate
+string serverVersion
+SidebarTabKey sidebarKey
+SystemStatus status
+AsyncLocalStorage~SystemStatus~ statusStorage
}
class GlobalGeneralAction {
<<interface>>
+updateResourceManagerColumnWidth(column, width) void
+updateSystemStatus(status, action) void
+useCheckLatestVersion(enabledCheck) SWRResponse~string~
+useCheckServerVersion(enabledCheck) SWRResponse~string_or_null~
+useInitSystemStatus() SWRResponse
}
class GlobalService {
+getLatestVersion() Promise~string~
+getServerVersion() Promise~string_or_null~
+getGlobalConfig() Promise~GlobalRuntimeConfig~
}
class BusinessGlobalService {
}
GlobalService --|> BusinessGlobalService
GlobalGeneralAction --> GlobalState : updates
GlobalGeneralAction --> GlobalService : calls getServerVersion
class ServerVersionOutdatedAlert {
+dismissed boolean
}
class GlobalStore {
+boolean isServerVersionOutdated
+string serverVersion
+useCheckServerVersion(enabledCheck) SWRResponse~string_or_null~
}
GlobalStore --> GlobalService : getServerVersion
ServerVersionOutdatedAlert --> GlobalStore : reads isServerVersionOutdated
File-Level Changes
Possibly linked issues
Tips and commandsInteracting with Sourcery
Customizing Your ExperienceAccess your dashboard to:
Getting Help
|
TestGru AssignmentSummary
Files
Tip You can |
There was a problem hiding this comment.
Hey - I've found 2 issues, and left some high level feedback:
- The
useCheckServerVersionhook is invoked both inStoreInitializationand in the AboutVersioncomponent for desktop, which is redundant given theuseOnlyFetchOnceSWRbehavior; consider centralizing this call (e.g., only during store initialization) to keep the flow simpler. - The version diff calculation comment table in
useCheckServerVersiondoes not match the actual formula (e.g., 2.0.0 → 1.9.9 is shown as 91 but the formula yields 101); updating the examples to reflect the computation precisely would avoid confusion for future maintainers. - In
getServerVersion, all non-OK responses and fetch errors are treated as 'old server' by returningnull; if you need to distinguish between 'endpoint missing' and general server/network errors, consider checking specifically for 404 vs other status codes and handling them separately.
Prompt for AI Agents
Please address the comments from this code review:
## Overall Comments
- The `useCheckServerVersion` hook is invoked both in `StoreInitialization` and in the About `Version` component for desktop, which is redundant given the `useOnlyFetchOnceSWR` behavior; consider centralizing this call (e.g., only during store initialization) to keep the flow simpler.
- The version diff calculation comment table in `useCheckServerVersion` does not match the actual formula (e.g., 2.0.0 → 1.9.9 is shown as 91 but the formula yields 101); updating the examples to reflect the computation precisely would avoid confusion for future maintainers.
- In `getServerVersion`, all non-OK responses and fetch errors are treated as 'old server' by returning `null`; if you need to distinguish between 'endpoint missing' and general server/network errors, consider checking specifically for 404 vs other status codes and handling them separately.
## Individual Comments
### Comment 1
<location> `src/layout/GlobalProvider/ServerVersionOutdatedAlert.tsx:86-89` </location>
<code_context>
+const ServerVersionOutdatedAlert = () => {
+ const { styles } = useStyles();
+ const { t } = useTranslation('common');
+ const [dismissed, setDismissed] = useState(false);
+ const isServerVersionOutdated = useGlobalStore((s) => s.isServerVersionOutdated);
+
+ if (!isServerVersionOutdated || dismissed) return null;
+
+ return (
</code_context>
<issue_to_address>
**suggestion:** The dismissal state is not persisted, so the alert reappears on every reload.
Since `dismissed` is only local component state, the alert will reappear on every reload or new tab, even after “Continue Anyway” is selected. To avoid repeatedly interrupting users on long-lived outdated servers, consider persisting the dismissal (e.g., via localStorage or a global store flag keyed by version/session).
Suggested implementation:
```typescript
const SERVER_VERSION_OUTDATED_DISMISSED_KEY = 'serverVersionOutdated.dismissed';
const ServerVersionOutdatedAlert = () => {
const { styles } = useStyles();
const { t } = useTranslation('common');
const [dismissed, setDismissed] = useState(false);
const isServerVersionOutdated = useGlobalStore((s) => s.isServerVersionOutdated);
useEffect(() => {
try {
const stored = window.localStorage.getItem(SERVER_VERSION_OUTDATED_DISMISSED_KEY);
if (stored === 'true') {
setDismissed(true);
}
} catch {
// Ignore storage errors and fall back to non-persistent behavior
}
}, []);
const handleDismiss = () => {
try {
window.localStorage.setItem(SERVER_VERSION_OUTDATED_DISMISSED_KEY, 'true');
} catch {
// Ignore storage errors; dismissal will still apply for this session
}
setDismissed(true);
};
if (!isServerVersionOutdated || dismissed) return null;
```
```typescript
<div className={styles.closeButton} onClick={handleDismiss}>
```
1. Ensure `useEffect` is imported from React at the top of this file, e.g. update the existing React import to: `import React, { useEffect, useState } from 'react';` (or equivalent based on current import style).
2. If the project prefers a version-aware dismissal (i.e. reset when server version changes), you can extend this by incorporating the server version into `SERVER_VERSION_OUTDATED_DISMISSED_KEY` (e.g., `serverVersionOutdated.dismissed.${version}`) once the version is available in this component.
</issue_to_address>
### Comment 2
<location> `src/app/[variants]/(main)/settings/about/features/Version.tsx:19-30` </location>
<code_context>
const Version = memo<{ mobile?: boolean }>(({ mobile }) => {
const hasNewVersion = useNewVersion();
- const [latestVersion] = useGlobalStore((s) => [s.latestVersion]);
+ const [latestVersion, serverVersion, useCheckServerVersion] = useGlobalStore((s) => [
+ s.latestVersion,
+ s.serverVersion,
+ s.useCheckServerVersion,
+ ]);
const { t } = useTranslation('common');
+ useCheckServerVersion(isDesktop);
+
+ const showServerVersion = serverVersion && serverVersion !== CURRENT_VERSION;
</code_context>
<issue_to_address>
**suggestion:** Redundant server-version check between StoreInitialization and Version component.
This logic now calls `useCheckServerVersion` in both `StoreInitialization` and `Version` with the same key and `isDesktop` condition. Although SWR dedupes the network request, the extra hook adds unnecessary complexity and duplicates responsibility. It would be cleaner to keep `useCheckServerVersion` in a single place (e.g., initialization) and have `Version` consume `serverVersion` from the store instead of invoking the hook again.
```suggestion
const Version = memo<{ mobile?: boolean }>(({ mobile }) => {
const hasNewVersion = useNewVersion();
const [latestVersion, serverVersion] = useGlobalStore((s) => [
s.latestVersion,
s.serverVersion,
]);
const { t } = useTranslation('common');
const showServerVersion = serverVersion && serverVersion !== CURRENT_VERSION;
```
</issue_to_address>Help me be more useful! Please click 👍 or 👎 on each comment and I'll use the feedback to improve your reviews.
| const [dismissed, setDismissed] = useState(false); | ||
| const isServerVersionOutdated = useGlobalStore((s) => s.isServerVersionOutdated); | ||
|
|
||
| if (!isServerVersionOutdated || dismissed) return null; |
There was a problem hiding this comment.
suggestion: The dismissal state is not persisted, so the alert reappears on every reload.
Since dismissed is only local component state, the alert will reappear on every reload or new tab, even after “Continue Anyway” is selected. To avoid repeatedly interrupting users on long-lived outdated servers, consider persisting the dismissal (e.g., via localStorage or a global store flag keyed by version/session).
Suggested implementation:
const SERVER_VERSION_OUTDATED_DISMISSED_KEY = 'serverVersionOutdated.dismissed';
const ServerVersionOutdatedAlert = () => {
const { styles } = useStyles();
const { t } = useTranslation('common');
const [dismissed, setDismissed] = useState(false);
const isServerVersionOutdated = useGlobalStore((s) => s.isServerVersionOutdated);
useEffect(() => {
try {
const stored = window.localStorage.getItem(SERVER_VERSION_OUTDATED_DISMISSED_KEY);
if (stored === 'true') {
setDismissed(true);
}
} catch {
// Ignore storage errors and fall back to non-persistent behavior
}
}, []);
const handleDismiss = () => {
try {
window.localStorage.setItem(SERVER_VERSION_OUTDATED_DISMISSED_KEY, 'true');
} catch {
// Ignore storage errors; dismissal will still apply for this session
}
setDismissed(true);
};
if (!isServerVersionOutdated || dismissed) return null; <div className={styles.closeButton} onClick={handleDismiss}>- Ensure
useEffectis imported from React at the top of this file, e.g. update the existing React import to:import React, { useEffect, useState } from 'react';(or equivalent based on current import style). - If the project prefers a version-aware dismissal (i.e. reset when server version changes), you can extend this by incorporating the server version into
SERVER_VERSION_OUTDATED_DISMISSED_KEY(e.g.,serverVersionOutdated.dismissed.${version}) once the version is available in this component.
| const Version = memo<{ mobile?: boolean }>(({ mobile }) => { | ||
| const hasNewVersion = useNewVersion(); | ||
| const [latestVersion] = useGlobalStore((s) => [s.latestVersion]); | ||
| const [latestVersion, serverVersion, useCheckServerVersion] = useGlobalStore((s) => [ | ||
| s.latestVersion, | ||
| s.serverVersion, | ||
| s.useCheckServerVersion, | ||
| ]); | ||
| const { t } = useTranslation('common'); | ||
|
|
||
| useCheckServerVersion(isDesktop); | ||
|
|
||
| const showServerVersion = serverVersion && serverVersion !== CURRENT_VERSION; |
There was a problem hiding this comment.
suggestion: Redundant server-version check between StoreInitialization and Version component.
This logic now calls useCheckServerVersion in both StoreInitialization and Version with the same key and isDesktop condition. Although SWR dedupes the network request, the extra hook adds unnecessary complexity and duplicates responsibility. It would be cleaner to keep useCheckServerVersion in a single place (e.g., initialization) and have Version consume serverVersion from the store instead of invoking the hook again.
| const Version = memo<{ mobile?: boolean }>(({ mobile }) => { | |
| const hasNewVersion = useNewVersion(); | |
| const [latestVersion] = useGlobalStore((s) => [s.latestVersion]); | |
| const [latestVersion, serverVersion, useCheckServerVersion] = useGlobalStore((s) => [ | |
| s.latestVersion, | |
| s.serverVersion, | |
| s.useCheckServerVersion, | |
| ]); | |
| const { t } = useTranslation('common'); | |
| useCheckServerVersion(isDesktop); | |
| const showServerVersion = serverVersion && serverVersion !== CURRENT_VERSION; | |
| const Version = memo<{ mobile?: boolean }>(({ mobile }) => { | |
| const hasNewVersion = useNewVersion(); | |
| const [latestVersion, serverVersion] = useGlobalStore((s) => [ | |
| s.latestVersion, | |
| s.serverVersion, | |
| ]); | |
| const { t } = useTranslation('common'); | |
| const showServerVersion = serverVersion && serverVersion !== CURRENT_VERSION; |
Check storageMode from electron store - only show alert when using 'selfHost' mode, not 'cloud' mode.
There was a problem hiding this comment.
💡 Codex Review
Here are some automated review suggestions for this pull request.
Reviewed commit: bc53bb460a
ℹ️ About Codex in GitHub
Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you
- Open a pull request for review
- Mark a draft as ready
- Comment "@codex review".
If Codex has suggestions, it will comment; otherwise it will react with 👍.
Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".
src/services/global.ts
Outdated
| const res = await fetch(SERVER_VERSION_URL); | ||
|
|
||
| if (!res.ok) { | ||
| return null; | ||
| } |
There was a problem hiding this comment.
Treat only 404 as outdated server
The new check treats any non-OK response from /api/version as “server doesn’t support the API” by returning null, which then causes useCheckServerVersion to flag isServerVersionOutdated and show the blocking alert. This means transient failures (e.g., 500s, temporary auth/proxy errors, or brief network hiccups) will incorrectly warn that the server is too old even though it just failed to respond. Consider distinguishing a 404 (API truly missing) from other errors or surfacing a retry/error state so the outdated alert only appears when the endpoint is genuinely absent.
Useful? React with 👍 / 👎.
6b50033 to
56c4d28
Compare
Previously any non-OK response was treated as "server doesn't support the API", causing transient failures (500s, network issues) to incorrectly show the outdated alert. Now only 404 returns null to indicate a missing API, while other errors throw to allow SWR retry.
Codecov Report❌ Patch coverage is Additional details and impacted files@@ Coverage Diff @@
## next #11710 +/- ##
==========================================
- Coverage 74.33% 74.31% -0.03%
==========================================
Files 1191 1191
Lines 94844 94890 +46
Branches 13002 13003 +1
==========================================
+ Hits 70502 70516 +14
- Misses 24252 24284 +32
Partials 90 90
Flags with carried forward coverage won't be shown. Click here to find out more.
🚀 New features to boost your workflow:
|
- Implemented server version check functionality to notify users when their client version requires a newer server version. - Added localized messages for server version outdated alerts in English and Chinese. - Enhanced the global state management to track server version and its status. - Updated UI components to display server version information and warnings appropriately. - Introduced a new alert component to inform users about the need to upgrade their server for optimal performance. Signed-off-by: Innei <tukon479@gmail.com>
|
❤️ Great PR @Innei ❤️ The growth of project is inseparable from user feedback and contribution, thanks for your contribution! If you are interesting with the lobehub developer community, please join our discord and then dm @arvinxx or @canisminor1990. They will invite you to our private developer channel. We are talking about the lobe-chat development or sharing ai newsletter around the world. |
## [Version 2.0.0-next.341](v2.0.0-next.340...v2.0.0-next.341) <sup>Released on **2026-01-22**</sup> #### ✨ Features - **misc**: Add server version check for desktop app. <br/> <details> <summary><kbd>Improvements and Fixes</kbd></summary> #### What's improved * **misc**: Add server version check for desktop app, closes [#11710](#11710) ([0cf2723](0cf2723)) </details> <div align="right"> [](#readme-top) </div>
|
🎉 This PR is included in version 2.0.0-next.341 🎉 The release is available on: Your semantic-release bot 📦🚀 |
## [Version 1.153.0](v1.152.0...v1.153.0) <sup>Released on **2026-01-23**</sup> #### ♻ Code Refactoring - **auth**: Remove NEXT_PUBLIC_AUTH_URL env variable. - **model-select**: Migrate FunctionCallingModelSelect to LobeSelect. - **ModelSwitchPanel**: Migrate from Popover to DropdownMenu with virtual scrolling. - **userMemories**: Removed un-used code. - **misc**: Improve memory data with experience and identity, move vercel-react-best-practices skills to .agents directory. #### ✨ Features - **database**: Added user memory activity. - **desktop**: Add legacy local database detection and migration guidance. - **misc**: Add platform-aware download client menu option, add server version check for desktop app, remove Clerk authentication code, skill setting page and skill store, support agent group unpublish agents, support client tasks mode, update the sandbox preinstall libs in sys role. #### 🐛 Bug Fixes - **copilot**: Pass correct scope when creating new session in PageEditor. - **desktop**: Gracefully handle missing update manifest 404 errors. - **model-runtime**: Filter unsupported image types (SVG) before sending to vision models. - **pdf**: Upgrade pdfjs-dist and react-pdf to v5.x. - **sidebar-drawer**: Fix drawer positioning and title style. - **misc**: Fix group broadcast trigger tool use, fix local system tools, fix memory schema, fix multi agent tasks issue, fix multi tasks no summary issue, fix scope issue, fix tool argument scape and improve multi task run, fixed the sandbox tools call when error should use right callback, improve e2e server and complete i18n resources, slove the agent group editor not focus in editdata area, slove the agents header switch agents the lobeAI not show problem, sloved the old removeSessionTopics not work, TypewriterEffect not refreshing on language change, updata cron job ui & fixed commnuity pagenation goto error, update the agentbuilder tools not always use humanIntervention. #### 💄 Styles - **misc**: Improve auto scroll and group profile, update og, update share style. <br/> <details> <summary><kbd>Improvements and Fixes</kbd></summary> #### Code refactoring * **auth**: Remove NEXT_PUBLIC_AUTH_URL env variable, closes [lobehub#11658](https://github.com/jaworldwideorg/OneJA-Bot/issues/11658) ([c0f9875](c0f9875)) * **model-select**: Migrate FunctionCallingModelSelect to LobeSelect, closes [lobehub#11664](https://github.com/jaworldwideorg/OneJA-Bot/issues/11664) ([ad51305](ad51305)) * **ModelSwitchPanel**: Migrate from Popover to DropdownMenu with virtual scrolling, closes [lobehub#11663](https://github.com/jaworldwideorg/OneJA-Bot/issues/11663) ([c9d9dff](c9d9dff)) * **userMemories**: Removed un-used code, closes [lobehub#11713](https://github.com/jaworldwideorg/OneJA-Bot/issues/11713) ([89750fc](89750fc)) * **misc**: Improve memory data with experience and identity, closes [lobehub#11717](https://github.com/jaworldwideorg/OneJA-Bot/issues/11717) ([bdb3eb4](bdb3eb4)) * **misc**: Move vercel-react-best-practices skills to .agents directory, closes [lobehub#11703](https://github.com/jaworldwideorg/OneJA-Bot/issues/11703) ([6df7731](6df7731)) #### What's improved * **database**: Added user memory activity, closes [lobehub#11680](https://github.com/jaworldwideorg/OneJA-Bot/issues/11680) ([0160fbd](0160fbd)) * **desktop**: Add legacy local database detection and migration guidance, closes [lobehub#11682](https://github.com/jaworldwideorg/OneJA-Bot/issues/11682) ([5664b84](5664b84)) * **misc**: Add platform-aware download client menu option, closes [lobehub#11676](https://github.com/jaworldwideorg/OneJA-Bot/issues/11676) ([55abddc](55abddc)) * **misc**: Add server version check for desktop app, closes [lobehub#11710](https://github.com/jaworldwideorg/OneJA-Bot/issues/11710) ([0cf2723](0cf2723)) * **misc**: Remove Clerk authentication code, closes [lobehub#11711](https://github.com/jaworldwideorg/OneJA-Bot/issues/11711) ([395595a](395595a)) * **misc**: Skill setting page and skill store, closes [lobehub#11665](https://github.com/jaworldwideorg/OneJA-Bot/issues/11665) ([d8c0c26](d8c0c26)) * **misc**: Support agent group unpublish agents, closes [lobehub#11687](https://github.com/jaworldwideorg/OneJA-Bot/issues/11687) ([4e060be](4e060be)) * **misc**: Support client tasks mode, closes [lobehub#11666](https://github.com/jaworldwideorg/OneJA-Bot/issues/11666) ([98cf57b](98cf57b)) * **misc**: Update the sandbox preinstall libs in sys role, closes [lobehub#11688](https://github.com/jaworldwideorg/OneJA-Bot/issues/11688) ([404c577](404c577)) #### What's fixed * **copilot**: Pass correct scope when creating new session in PageEditor, closes [lobehub#11714](https://github.com/jaworldwideorg/OneJA-Bot/issues/11714) ([0259270](0259270)) * **desktop**: Gracefully handle missing update manifest 404 errors, closes [lobehub#11625](https://github.com/jaworldwideorg/OneJA-Bot/issues/11625) ([13e95b9](13e95b9)) * **model-runtime**: Filter unsupported image types (SVG) before sending to vision models, closes [lobehub#11698](https://github.com/jaworldwideorg/OneJA-Bot/issues/11698) ([c0c99a7](c0c99a7)) * **pdf**: Upgrade pdfjs-dist and react-pdf to v5.x, closes [lobehub#11686](https://github.com/jaworldwideorg/OneJA-Bot/issues/11686) ([2b620df](2b620df)) * **sidebar-drawer**: Fix drawer positioning and title style, closes [lobehub#11655](https://github.com/jaworldwideorg/OneJA-Bot/issues/11655) ([cf5320e](cf5320e)) * **misc**: Fix group broadcast trigger tool use, closes [lobehub#11646](https://github.com/jaworldwideorg/OneJA-Bot/issues/11646) ([831a9b3](831a9b3)) * **misc**: Fix local system tools, closes [lobehub#11702](https://github.com/jaworldwideorg/OneJA-Bot/issues/11702) ([6548fc7](6548fc7)) * **misc**: Fix memory schema, closes [lobehub#11645](https://github.com/jaworldwideorg/OneJA-Bot/issues/11645) ([3baf780](3baf780)) * **misc**: Fix multi agent tasks issue, closes [lobehub#11672](https://github.com/jaworldwideorg/OneJA-Bot/issues/11672) ([9de773b](9de773b)) * **misc**: Fix multi tasks no summary issue, closes [lobehub#11685](https://github.com/jaworldwideorg/OneJA-Bot/issues/11685) ([26ce317](26ce317)) * **misc**: Fix scope issue, closes [lobehub#11719](https://github.com/jaworldwideorg/OneJA-Bot/issues/11719) ([17adde8](17adde8)) * **misc**: Fix tool argument scape and improve multi task run, closes [lobehub#11691](https://github.com/jaworldwideorg/OneJA-Bot/issues/11691) ([b13bb8a](b13bb8a)) * **misc**: Fixed the sandbox tools call when error should use right callback, closes [lobehub#11721](https://github.com/jaworldwideorg/OneJA-Bot/issues/11721) ([e8fce68](e8fce68)) * **misc**: Improve e2e server and complete i18n resources, closes [lobehub#11678](https://github.com/jaworldwideorg/OneJA-Bot/issues/11678) ([d450dd9](d450dd9)) * **misc**: Slove the agent group editor not focus in editdata area, closes [lobehub#11677](https://github.com/jaworldwideorg/OneJA-Bot/issues/11677) ([9ac84e6](9ac84e6)) * **misc**: Slove the agents header switch agents the lobeAI not show problem, closes [lobehub#11726](https://github.com/jaworldwideorg/OneJA-Bot/issues/11726) ([f45f508](f45f508)) * **misc**: Sloved the old removeSessionTopics not work, closes [lobehub#11671](https://github.com/jaworldwideorg/OneJA-Bot/issues/11671) ([06d41e5](06d41e5)) * **misc**: TypewriterEffect not refreshing on language change, closes [lobehub#11657](https://github.com/jaworldwideorg/OneJA-Bot/issues/11657) ([ba30f46](ba30f46)) * **misc**: Updata cron job ui & fixed commnuity pagenation goto error, closes [lobehub#11700](https://github.com/jaworldwideorg/OneJA-Bot/issues/11700) ([42ad2a0](42ad2a0)) * **misc**: Update the agentbuilder tools not always use humanIntervention, closes [lobehub#11696](https://github.com/jaworldwideorg/OneJA-Bot/issues/11696) ([0d3017b](0d3017b)) #### Styles * **misc**: Improve auto scroll and group profile, closes [lobehub#11725](https://github.com/jaworldwideorg/OneJA-Bot/issues/11725) ([550acc2](550acc2)) * **misc**: Update og, closes [lobehub#11709](https://github.com/jaworldwideorg/OneJA-Bot/issues/11709) ([01cf4e4](01cf4e4)) * **misc**: Update share style, closes [lobehub#11716](https://github.com/jaworldwideorg/OneJA-Bot/issues/11716) ([3c70dfa](3c70dfa)) </details> <div align="right"> [](#readme-top) </div>
💻 Change Type
🔗 Related Issue
🔀 Description of Change
This PR adds server version compatibility check for the desktop app:
/api/versionendpoint to get server versionserverVersionandisServerVersionOutdatedstates to global storeuseCheckServerVersionhook with:ServerVersionOutdatedAlertmodal when server is incompatibleThe desktop app client is not compatible with old server versions. When detected:
🧪 How to Test
/api/versionendpoint)📸 Screenshots / Videos
📝 Additional Information
This feature is only active in desktop app environment (
isDesktop === true).Summary by Sourcery
Add server version compatibility checks to the desktop app and surface warnings when the connected server is too old.
New Features:
/api/versionendpoint and computes version drift against the client.Enhancements: