feat(dashboard): add generic desktop app updater bridge#5424
feat(dashboard): add generic desktop app updater bridge#5424zouyonghe merged 4 commits intoAstrBotDevs:masterfrom
Conversation
Summary of ChangesHello @zouyonghe, I'm Gemini Code Assist1! I'm currently reviewing this pull request and will post my feedback shortly. In the meantime, here's a summary to help you and other reviewers quickly get up to speed! This pull request significantly improves the desktop application update process by transitioning from an external redirect mechanism to an integrated in-app dialog. This change not only enhances the user experience by keeping updates within the application interface but also refactors the underlying architecture to be more generic and less coupled to specific desktop runtime implementations. The introduction of a new, standardized updater interface allows for greater flexibility and maintainability, ensuring that the dashboard remains reusable across different desktop environments. Highlights
Changelog
Using Gemini Code AssistThe full guide for Gemini Code Assist can be found on our documentation page, here are some quick tips. Invoking Gemini You can request assistance from Gemini at any point by creating a comment using either
Customization To customize Gemini Code Assist for GitHub experience, repository maintainers can create a configuration file and/or provide a custom code review style guide (such as PEP-8 for Python) by creating and adding files to a Limitations & Feedback Gemini Code Assist may make mistakes. Please leave feedback on any instances where its feedback is incorrect or counter productive. You can react with 👍 and 👎 on @gemini-code-assist comments. If you're interested in giving your feedback about your experience with Gemini Code Assist for Github and other Google products, sign up here. You can also get AI-powered code generation, chat, as well as code reviews directly in the IDE at no cost with the Gemini Code Assist IDE Extension. Footnotes
|
There was a problem hiding this comment.
Hey - 我发现了两个问题,并留下了一些整体性的反馈:
- 在
VerticalHeader.vue中,AppUpdaterBridge与desktop-bridge.d.ts中新的全局类型AstrBotAppUpdaterBridge重复;建议复用该全局类型(例如通过Window['astrbotAppUpdater'])以避免两套接口未来出现差异。 VerticalHeader.vue中的getAppUpdaterBridge以及其他直接访问window的代码没有通过typeof window !== 'undefined'做保护;如果该组件未来在 SSR 场景中渲染,增加这一保护可以避免运行时错误。
给 AI Agent 的提示
Please address the comments from this code review:
## Overall Comments
- In `VerticalHeader.vue`, `AppUpdaterBridge` duplicates the new global `AstrBotAppUpdaterBridge` type from `desktop-bridge.d.ts`; consider reusing the global type (e.g. via `Window['astrbotAppUpdater']`) to avoid divergence between the two interfaces.
- `getAppUpdaterBridge` and other direct `window` accesses in `VerticalHeader.vue` aren’t guarded by a `typeof window !== 'undefined'` check; if this component is ever rendered in an SSR context, adding that guard would prevent runtime errors.
## Individual Comments
### Comment 1
<location path="dashboard/src/layouts/full/vertical-header/VerticalHeader.vue" line_range="61-68" />
<code_context>
+const desktopUpdateLatestVersion = ref('-');
+const desktopUpdateStatus = ref('');
+
+type AppUpdaterBridge = {
+ checkForAppUpdate: () => Promise<{
+ ok: boolean;
+ reason: string | null;
+ currentVersion: string;
+ latestVersion: string | null;
+ hasUpdate: boolean;
+ }>;
+ installAppUpdate: () => Promise<{
+ ok: boolean;
</code_context>
<issue_to_address>
**suggestion:** Avoid duplicating the updater bridge type that already exists in the global typings to prevent future drift.
You can either type `getAppUpdaterBridge` to return `AstrBotAppUpdaterBridge | null`, or introduce a local alias:
```ts
type AppUpdaterBridge = AstrBotAppUpdaterBridge;
```
This avoids redefining the full shape locally.
</issue_to_address>
### Comment 2
<location path="dashboard/src/layouts/full/vertical-header/VerticalHeader.vue" line_range="182-191" />
<code_context>
- cancelExternalRedirect();
- if (targetUrl) {
- open(targetUrl);
+async function confirmDesktopUpdate() {
+ if (!desktopUpdateHasNewVersion.value || desktopUpdateInstalling.value) {
+ return;
}
-}
-const getReleaseUrlForDesktop = () => {
- const firstRelease = (releases.value as any[])?.[0];
- if (firstRelease?.tag_name) {
- return getReleaseUrlByTag(firstRelease.tag_name as string);
+ const bridge = getAppUpdaterBridge();
+ if (!bridge) {
+ desktopUpdateStatus.value = t('core.header.updateDialog.desktopApp.installFailed');
+ return;
}
- if (hasNewVersion.value) return getReleaseUrlByTag('latest');
- const tag = botCurrVersion.value?.startsWith('v') ? botCurrVersion.value : 'latest';
- return getReleaseUrlByTag(tag);
-};
+
+ desktopUpdateInstalling.value = true;
+ desktopUpdateStatus.value = t('core.header.updateDialog.desktopApp.installing');
+
+ try {
</code_context>
<issue_to_address>
**question (bug_risk):** On successful install, the dialog status remains "installing" and the dialog never closes, which may confuse users.
In `confirmDesktopUpdate`, when `result?.ok` is true, `desktopUpdateStatus` is set back to the "installing" message and the function returns. `desktopUpdateInstalling` is then reset to `false` in `finally`, leaving the dialog open with an "installing" label even though the install succeeded. Consider either showing an explicit success/"installed" status, or closing the dialog (optionally with a restart prompt) when installation is reported as successful so the user sees a clear completion state.
</issue_to_address>帮我变得更有用!请在每条评论上点 👍 或 👎,我会根据你的反馈改进后续评审。
Original comment in English
Hey - I've found 2 issues, and left some high level feedback:
- In
VerticalHeader.vue,AppUpdaterBridgeduplicates the new globalAstrBotAppUpdaterBridgetype fromdesktop-bridge.d.ts; consider reusing the global type (e.g. viaWindow['astrbotAppUpdater']) to avoid divergence between the two interfaces. getAppUpdaterBridgeand other directwindowaccesses inVerticalHeader.vuearen’t guarded by atypeof window !== 'undefined'check; if this component is ever rendered in an SSR context, adding that guard would prevent runtime errors.
Prompt for AI Agents
Please address the comments from this code review:
## Overall Comments
- In `VerticalHeader.vue`, `AppUpdaterBridge` duplicates the new global `AstrBotAppUpdaterBridge` type from `desktop-bridge.d.ts`; consider reusing the global type (e.g. via `Window['astrbotAppUpdater']`) to avoid divergence between the two interfaces.
- `getAppUpdaterBridge` and other direct `window` accesses in `VerticalHeader.vue` aren’t guarded by a `typeof window !== 'undefined'` check; if this component is ever rendered in an SSR context, adding that guard would prevent runtime errors.
## Individual Comments
### Comment 1
<location path="dashboard/src/layouts/full/vertical-header/VerticalHeader.vue" line_range="61-68" />
<code_context>
+const desktopUpdateLatestVersion = ref('-');
+const desktopUpdateStatus = ref('');
+
+type AppUpdaterBridge = {
+ checkForAppUpdate: () => Promise<{
+ ok: boolean;
+ reason: string | null;
+ currentVersion: string;
+ latestVersion: string | null;
+ hasUpdate: boolean;
+ }>;
+ installAppUpdate: () => Promise<{
+ ok: boolean;
</code_context>
<issue_to_address>
**suggestion:** Avoid duplicating the updater bridge type that already exists in the global typings to prevent future drift.
You can either type `getAppUpdaterBridge` to return `AstrBotAppUpdaterBridge | null`, or introduce a local alias:
```ts
type AppUpdaterBridge = AstrBotAppUpdaterBridge;
```
This avoids redefining the full shape locally.
</issue_to_address>
### Comment 2
<location path="dashboard/src/layouts/full/vertical-header/VerticalHeader.vue" line_range="182-191" />
<code_context>
- cancelExternalRedirect();
- if (targetUrl) {
- open(targetUrl);
+async function confirmDesktopUpdate() {
+ if (!desktopUpdateHasNewVersion.value || desktopUpdateInstalling.value) {
+ return;
}
-}
-const getReleaseUrlForDesktop = () => {
- const firstRelease = (releases.value as any[])?.[0];
- if (firstRelease?.tag_name) {
- return getReleaseUrlByTag(firstRelease.tag_name as string);
+ const bridge = getAppUpdaterBridge();
+ if (!bridge) {
+ desktopUpdateStatus.value = t('core.header.updateDialog.desktopApp.installFailed');
+ return;
}
- if (hasNewVersion.value) return getReleaseUrlByTag('latest');
- const tag = botCurrVersion.value?.startsWith('v') ? botCurrVersion.value : 'latest';
- return getReleaseUrlByTag(tag);
-};
+
+ desktopUpdateInstalling.value = true;
+ desktopUpdateStatus.value = t('core.header.updateDialog.desktopApp.installing');
+
+ try {
</code_context>
<issue_to_address>
**question (bug_risk):** On successful install, the dialog status remains "installing" and the dialog never closes, which may confuse users.
In `confirmDesktopUpdate`, when `result?.ok` is true, `desktopUpdateStatus` is set back to the "installing" message and the function returns. `desktopUpdateInstalling` is then reset to `false` in `finally`, leaving the dialog open with an "installing" label even though the install succeeded. Consider either showing an explicit success/"installed" status, or closing the dialog (optionally with a restart prompt) when installation is reported as successful so the user sees a clear completion state.
</issue_to_address>Help me be more useful! Please click 👍 or 👎 on each comment and I'll use the feedback to improve your reviews.
There was a problem hiding this comment.
Code Review
This pull request successfully introduces a generic desktop app updater bridge, effectively decoupling the dashboard from specific desktop runtime implementations. The new in-app update dialog enhances the user experience by providing a streamlined update process. The changes to i18n messages and Vue component logic are well-implemented, supporting the new functionality.
| checkDesktopAppUpdate: () => Promise<{ | ||
| ok: boolean; | ||
| reason: string | null; | ||
| currentVersion: string; | ||
| latestVersion: string | null; | ||
| hasUpdate: boolean; | ||
| }>; | ||
| installDesktopAppUpdate: () => Promise<{ | ||
| ok: boolean; | ||
| reason: string | null; | ||
| }>; |
There was a problem hiding this comment.
The astrbotDesktop interface still includes checkDesktopAppUpdate and installDesktopAppUpdate. The pull request description mentions decoupling the dashboard from astrbotDesktop-specific methods by introducing a generic window.astrbotAppUpdater interface. To fully achieve this decoupling and avoid potential confusion or redundant implementations, these update-related methods should ideally be removed from astrbotDesktop and exclusively exposed through astrbotAppUpdater.
| ? t('core.header.updateDialog.desktopApp.hasNewVersion') | ||
| : t('core.header.updateDialog.desktopApp.isLatest'); | ||
| } catch (error) { | ||
| console.log(error); |
There was a problem hiding this comment.
The console.log(error) statement is quite generic. For better debugging and monitoring in a production environment, consider adding more context to the log message, such as the function name (openDesktopUpdateDialog) and a descriptive string. This would help in quickly identifying the source of the error.
console.error('[DesktopUpdate] Failed to check for app update:', error);
| desktopUpdateStatus.value = | ||
| result?.reason || t('core.header.updateDialog.desktopApp.installFailed'); | ||
| } catch (error) { | ||
| console.log(error); |
There was a problem hiding this comment.
|
@sourcery-ai review |
There was a problem hiding this comment.
Hey - 我在这里给了一些整体性的反馈:
desktop-bridge.d.ts中新的AstrBotAppUpdaterBridge接口与astrbotDesktop上现有的checkDesktopAppUpdate/installDesktopAppUpdate结构重复;建议将它们统一起来(例如复用一个共享接口或弃用其中一侧),以避免这两个更新器约定逐渐产生差异。- 在新的桌面更新流程中(
openDesktopUpdateDialog/confirmDesktopUpdate),建议将catch块中的console.log(error)改为console.error(error)(或使用共享的错误日志记录器),以便在日志中更容易发现和筛选更新失败。
给 AI Agent 的提示
Please address the comments from this code review:
## Overall Comments
- The new `AstrBotAppUpdaterBridge` interface in `desktop-bridge.d.ts` duplicates the existing `checkDesktopAppUpdate`/`installDesktopAppUpdate` shape on `astrbotDesktop`; consider unifying these (e.g., reusing a shared interface or deprecating one side) to avoid the two updater contracts drifting apart.
- In the new desktop update flow (`openDesktopUpdateDialog`/`confirmDesktopUpdate`), switch `console.log(error)` in the catch blocks to `console.error(error)` (or a shared error logger) so update failures are easier to spot and filter in logs.帮我变得更有用!请在每条评论上点 👍 或 👎,我会根据你的反馈改进后续的代码审查。
Original comment in English
Hey - I've left some high level feedback:
- The new
AstrBotAppUpdaterBridgeinterface indesktop-bridge.d.tsduplicates the existingcheckDesktopAppUpdate/installDesktopAppUpdateshape onastrbotDesktop; consider unifying these (e.g., reusing a shared interface or deprecating one side) to avoid the two updater contracts drifting apart. - In the new desktop update flow (
openDesktopUpdateDialog/confirmDesktopUpdate), switchconsole.log(error)in the catch blocks toconsole.error(error)(or a shared error logger) so update failures are easier to spot and filter in logs.
Prompt for AI Agents
Please address the comments from this code review:
## Overall Comments
- The new `AstrBotAppUpdaterBridge` interface in `desktop-bridge.d.ts` duplicates the existing `checkDesktopAppUpdate`/`installDesktopAppUpdate` shape on `astrbotDesktop`; consider unifying these (e.g., reusing a shared interface or deprecating one side) to avoid the two updater contracts drifting apart.
- In the new desktop update flow (`openDesktopUpdateDialog`/`confirmDesktopUpdate`), switch `console.log(error)` in the catch blocks to `console.error(error)` (or a shared error logger) so update failures are easier to spot and filter in logs.Help me be more useful! Please click 👍 or 👎 on each comment and I'll use the feedback to improve your reviews.
|
@sourcery-ai review |
There was a problem hiding this comment.
Hey - 我发现了 1 个问题,并给出了一些整体性的反馈:
- 新增的
astrbotAppUpdaterbridge 与window.astrbotDesktop上的checkDesktopAppUpdate/installDesktopAppUpdate并存;建议合并这两条路径,或者明确废弃其中一条,以避免在桌面外壳侧出现重复的更新器契约。 - 在
getAppUpdaterBridge中,你是从Window['astrbotAppUpdater']重新派生了一个更窄的AppUpdaterBridge类型;你可以直接引用全局声明的AstrBotAppUpdaterBridge来简化逻辑,使 Vue 代码和 bridge 类型保持紧密一致。
给 AI 代理的提示
Please address the comments from this code review:
## Overall Comments
- 新增的 `astrbotAppUpdater` bridge 与 `window.astrbotDesktop` 上的 `checkDesktopAppUpdate`/`installDesktopAppUpdate` 并存;建议合并这两条路径,或者明确废弃其中一条,以避免在桌面外壳侧出现重复的更新器契约。
- 在 `getAppUpdaterBridge` 中,你是从 `Window['astrbotAppUpdater']` 重新派生了一个更窄的 `AppUpdaterBridge` 类型;你可以直接引用全局声明的 `AstrBotAppUpdaterBridge` 来简化逻辑,使 Vue 代码和 bridge 类型保持紧密一致。
## Individual Comments
### Comment 1
<location path="dashboard/src/types/desktop-bridge.d.ts" line_range="4-9" />
<code_context>
+export {};
+
+declare global {
+ interface AstrBotDesktopAppUpdateCheckResult {
+ ok: boolean;
+ reason: string | null;
+ currentVersion: string;
+ latestVersion: string | null;
+ hasUpdate: boolean;
+ }
+
</code_context>
<issue_to_address>
**suggestion:** 让更新检查结果字段的类型与实际使用方式保持一致(例如,在失败时 `reason`/版本字段可能不存在)。
`checkForAppUpdate` 的 Vue 使用方把 `reason`、`currentVersion` 和 `latestVersion` 视为可选/可为空(`result?.reason`、`result?.currentVersion || '-'` 等),而该接口却将 `reason` 和 `currentVersion` 声明为必填。这种不匹配可能会误导 bridge 的实现者,以为这些字段必须始终被设置。建议让类型与运行时行为对齐,放宽限制,例如使用 `reason?: string | null`、`currentVersion?: string`、`latestVersion?: string | null`。
</issue_to_address>帮我变得更有用!请在每条评论上点击 👍 或 👎,我会根据反馈改进后续评审。
Original comment in English
Hey - I've found 1 issue, and left some high level feedback:
- The new
astrbotAppUpdaterbridge lives alongsidecheckDesktopAppUpdate/installDesktopAppUpdateonwindow.astrbotDesktop; consider consolidating or clearly deprecating one of these paths to avoid duplicated updater contracts on the desktop shell side. - In
getAppUpdaterBridge, you’re re-deriving a narrowerAppUpdaterBridgetype fromWindow['astrbotAppUpdater']; you could simplify by referencing the globally declaredAstrBotAppUpdaterBridgedirectly so the Vue code and bridge typings stay tightly coupled.
Prompt for AI Agents
Please address the comments from this code review:
## Overall Comments
- The new `astrbotAppUpdater` bridge lives alongside `checkDesktopAppUpdate`/`installDesktopAppUpdate` on `window.astrbotDesktop`; consider consolidating or clearly deprecating one of these paths to avoid duplicated updater contracts on the desktop shell side.
- In `getAppUpdaterBridge`, you’re re-deriving a narrower `AppUpdaterBridge` type from `Window['astrbotAppUpdater']`; you could simplify by referencing the globally declared `AstrBotAppUpdaterBridge` directly so the Vue code and bridge typings stay tightly coupled.
## Individual Comments
### Comment 1
<location path="dashboard/src/types/desktop-bridge.d.ts" line_range="4-9" />
<code_context>
+export {};
+
+declare global {
+ interface AstrBotDesktopAppUpdateCheckResult {
+ ok: boolean;
+ reason: string | null;
+ currentVersion: string;
+ latestVersion: string | null;
+ hasUpdate: boolean;
+ }
+
</code_context>
<issue_to_address>
**suggestion:** Align the typings of update check result fields with how they’re consumed (e.g., `reason`/versions may be absent on failure).
The Vue consumer of `checkForAppUpdate` treats `reason`, `currentVersion`, and `latestVersion` as optional/nullable (`result?.reason`, `result?.currentVersion || '-'`, etc.), while this interface makes `reason` and `currentVersion` required. That mismatch may incorrectly signal to bridge implementers that these must always be set. Consider matching the runtime behavior with looser types, e.g. `reason?: string | null`, `currentVersion?: string`, `latestVersion?: string | null`.
</issue_to_address>Help me be more useful! Please click 👍 or 👎 on each comment and I'll use the feedback to improve your reviews.
|
@sourcery-ai review |
There was a problem hiding this comment.
嗨,我已经审查了你的更改,看起来非常棒!
让我变得更有用!请在每条评论上点 👍 或 👎,我会根据你的反馈改进后续的代码审查。
Original comment in English
Hey - I've reviewed your changes and they look great!
Help me be more useful! Please click 👍 or 👎 on each comment and I'll use the feedback to improve your reviews.
|
Generated docs update PR (pending manual review): AI change summary:
Experimental bot notice:
|
Summary
Why
The dashboard should not be tightly coupled to a specific desktop runtime implementation. Exposing a generic updater interface keeps upstream reusable while still allowing desktop shells to provide concrete behavior.
Verification
Summary by Sourcery
引入通用的桌面应用更新桥接层,并将原有的桌面更新跳转流程替换为仪表盘顶部栏中的应用内更新对话框。
新功能:
window.astrbotAppUpdater接口,用于在仪表盘中检查和安装桌面应用更新。增强:
desktop-bridge.d.ts),并扩展window.astrbotDesktop类型,以支持后端控制和桌面更新操作。文档:
Original summary in English
Summary by Sourcery
Introduce a generic desktop app updater bridge and replace the desktop update redirect flow with an in-app update dialog in the dashboard header.
New Features:
Enhancements:
Documentation:
新功能:
window.astrbotAppUpdater接口,以支持从仪表盘检查并安装桌面应用更新。增强:
desktop-bridgeTypeScript 定义替换原有的 Electron 专用桥接类型,并扩展window.astrbotDesktop运行时类型,以支持后端控制和桌面更新操作。文档:
Original summary in English
Summary by Sourcery
引入通用的桌面应用更新桥接层,并将原有的桌面更新跳转流程替换为仪表盘顶部栏中的应用内更新对话框。
新功能:
window.astrbotAppUpdater接口,用于在仪表盘中检查和安装桌面应用更新。增强:
desktop-bridge.d.ts),并扩展window.astrbotDesktop类型,以支持后端控制和桌面更新操作。文档:
Original summary in English
Summary by Sourcery
Introduce a generic desktop app updater bridge and replace the desktop update redirect flow with an in-app update dialog in the dashboard header.
New Features:
Enhancements:
Documentation:
新功能:
window.astrbotAppUpdater接口,用于在控制台中检查和安装桌面应用更新。增强:
desktop-bridge.d.ts),并移除特定于 Electron 的桥接声明文件,以泛化桌面端集成。window.astrbotDesktop运行时类型声明,以覆盖后端控制和桌面应用更新操作。文档:
Original summary in English
Summary by Sourcery
引入通用的桌面应用更新桥接层,并将原有的桌面更新跳转流程替换为仪表盘顶部栏中的应用内更新对话框。
新功能:
window.astrbotAppUpdater接口,用于在仪表盘中检查和安装桌面应用更新。增强:
desktop-bridge.d.ts),并扩展window.astrbotDesktop类型,以支持后端控制和桌面更新操作。文档:
Original summary in English
Summary by Sourcery
Introduce a generic desktop app updater bridge and replace the desktop update redirect flow with an in-app update dialog in the dashboard header.
New Features:
Enhancements:
Documentation:
新功能:
window.astrbotAppUpdater接口,以支持从仪表盘检查并安装桌面应用更新。增强:
desktop-bridgeTypeScript 定义替换原有的 Electron 专用桥接类型,并扩展window.astrbotDesktop运行时类型,以支持后端控制和桌面更新操作。文档:
Original summary in English
Summary by Sourcery
引入通用的桌面应用更新桥接层,并将原有的桌面更新跳转流程替换为仪表盘顶部栏中的应用内更新对话框。
新功能:
window.astrbotAppUpdater接口,用于在仪表盘中检查和安装桌面应用更新。增强:
desktop-bridge.d.ts),并扩展window.astrbotDesktop类型,以支持后端控制和桌面更新操作。文档:
Original summary in English
Summary by Sourcery
Introduce a generic desktop app updater bridge and replace the desktop update redirect flow with an in-app update dialog in the dashboard header.
New Features:
Enhancements:
Documentation:
新功能:
window.astrbotAppUpdater桥接接口,用于桌面应用更新检查与安装。增强:
window.astrbotDesktop上扩展桌面运行时类型,用于后端控制和桌面应用更新操作。文档:
Original summary in English
Summary by Sourcery
引入通用的桌面应用更新桥接层,并将原有的桌面更新跳转流程替换为仪表盘顶部栏中的应用内更新对话框。
新功能:
window.astrbotAppUpdater接口,用于在仪表盘中检查和安装桌面应用更新。增强:
desktop-bridge.d.ts),并扩展window.astrbotDesktop类型,以支持后端控制和桌面更新操作。文档:
Original summary in English
Summary by Sourcery
Introduce a generic desktop app updater bridge and replace the desktop update redirect flow with an in-app update dialog in the dashboard header.
New Features:
Enhancements:
Documentation:
新功能:
window.astrbotAppUpdater接口,以支持从仪表盘检查并安装桌面应用更新。增强:
desktop-bridgeTypeScript 定义替换原有的 Electron 专用桥接类型,并扩展window.astrbotDesktop运行时类型,以支持后端控制和桌面更新操作。文档:
Original summary in English
Summary by Sourcery
引入通用的桌面应用更新桥接层,并将原有的桌面更新跳转流程替换为仪表盘顶部栏中的应用内更新对话框。
新功能:
window.astrbotAppUpdater接口,用于在仪表盘中检查和安装桌面应用更新。增强:
desktop-bridge.d.ts),并扩展window.astrbotDesktop类型,以支持后端控制和桌面更新操作。文档:
Original summary in English
Summary by Sourcery
Introduce a generic desktop app updater bridge and replace the desktop update redirect flow with an in-app update dialog in the dashboard header.
New Features:
Enhancements:
Documentation:
新功能:
window.astrbotAppUpdater接口,用于在控制台中检查和安装桌面应用更新。增强:
desktop-bridge.d.ts),并移除特定于 Electron 的桥接声明文件,以泛化桌面端集成。window.astrbotDesktop运行时类型声明,以覆盖后端控制和桌面应用更新操作。文档:
Original summary in English
Summary by Sourcery
引入通用的桌面应用更新桥接层,并将原有的桌面更新跳转流程替换为仪表盘顶部栏中的应用内更新对话框。
新功能:
window.astrbotAppUpdater接口,用于在仪表盘中检查和安装桌面应用更新。增强:
desktop-bridge.d.ts),并扩展window.astrbotDesktop类型,以支持后端控制和桌面更新操作。文档:
Original summary in English
Summary by Sourcery
Introduce a generic desktop app updater bridge and replace the desktop update redirect flow with an in-app update dialog in the dashboard header.
New Features:
Enhancements:
Documentation:
新功能:
window.astrbotAppUpdater接口,以支持从仪表盘检查并安装桌面应用更新。增强:
desktop-bridgeTypeScript 定义替换原有的 Electron 专用桥接类型,并扩展window.astrbotDesktop运行时类型,以支持后端控制和桌面更新操作。文档:
Original summary in English
Summary by Sourcery
引入通用的桌面应用更新桥接层,并将原有的桌面更新跳转流程替换为仪表盘顶部栏中的应用内更新对话框。
新功能:
window.astrbotAppUpdater接口,用于在仪表盘中检查和安装桌面应用更新。增强:
desktop-bridge.d.ts),并扩展window.astrbotDesktop类型,以支持后端控制和桌面更新操作。文档:
Original summary in English
Summary by Sourcery
Introduce a generic desktop app updater bridge and replace the desktop update redirect flow with an in-app update dialog in the dashboard header.
New Features:
Enhancements:
Documentation: