@@ -58,10 +58,17 @@ const resolveReleaseBaseUrl = () => {
5858 const raw = import .meta .env .VITE_ASTRBOT_RELEASE_BASE_URL ;
5959 // Keep upstream default on AstrBot releases; desktop distributors can override via env injection.
6060 const normalized = raw ?.trim ()?.replace (/ \/ + $ / , ' ' ) || ' ' ;
61- return normalized || DEFAULT_ASTRBOT_RELEASE_BASE_URL ;
61+ const withoutLatestSuffix = normalized .replace (/ \/ latest$ / i , ' ' );
62+ return withoutLatestSuffix || DEFAULT_ASTRBOT_RELEASE_BASE_URL ;
63+ };
64+ const releaseBaseUrl = resolveReleaseBaseUrl ();
65+ const getReleaseUrlByTag = (tag : string | null | undefined ) => {
66+ const normalizedTag = (tag || ' ' ).trim ();
67+ if (! normalizedTag || normalizedTag .toLowerCase () === ' latest' ) {
68+ return ` ${releaseBaseUrl }/latest ` ;
69+ }
70+ return ` ${releaseBaseUrl }/tag/${normalizedTag } ` ;
6271};
63- const desktopReleaseBaseUrl = resolveReleaseBaseUrl ();
64- const fallbackReleaseUrl = ` ${desktopReleaseBaseUrl }/latest ` ;
6572
6673const getSelectedGitHubProxy = () => {
6774 if (typeof window === " undefined" || ! window .localStorage ) return " " ;
@@ -144,14 +151,11 @@ function confirmExternalRedirect() {
144151const getReleaseUrlForDesktop = () => {
145152 const firstRelease = (releases .value as any [])?.[0 ];
146153 if (firstRelease ?.tag_name ) {
147- const tag = firstRelease .tag_name as string ;
148- return ` ${desktopReleaseBaseUrl }/tag/${tag } ` ;
154+ return getReleaseUrlByTag (firstRelease .tag_name as string );
149155 }
150- if (hasNewVersion .value ) return fallbackReleaseUrl ;
156+ if (hasNewVersion .value ) return getReleaseUrlByTag ( ' latest ' ) ;
151157 const tag = botCurrVersion .value ?.startsWith (' v' ) ? botCurrVersion .value : ' latest' ;
152- return tag === ' latest'
153- ? fallbackReleaseUrl
154- : ` ${desktopReleaseBaseUrl }/tag/${tag } ` ;
158+ return getReleaseUrlByTag (tag );
155159};
156160
157161function handleUpdateClick() {
@@ -160,7 +164,7 @@ function handleUpdateClick() {
160164 resolvingReleaseTarget .value = true ;
161165 checkUpdate ();
162166 void getReleases ().finally (() => {
163- pendingRedirectUrl .value = getReleaseUrlForDesktop () || fallbackReleaseUrl ;
167+ pendingRedirectUrl .value = getReleaseUrlForDesktop () || getReleaseUrlByTag ( ' latest ' ) ;
164168 resolvingReleaseTarget .value = false ;
165169 });
166170 return ;
0 commit comments