From a96f50380f89240e92a985683b2098c60a54aaed Mon Sep 17 00:00:00 2001 From: yyhhyyyyyy Date: Wed, 24 Dec 2025 09:17:15 +0800 Subject: [PATCH 01/13] refactor: mac build workflow --- .github/workflows/build.yml | 7 +--- docs/rebrand-guide.md | 2 - electron-builder-macx64.yml | 83 ------------------------------------- electron-builder.yml | 3 -- package.json | 2 +- scripts/rebrand.js | 29 ------------- 6 files changed, 2 insertions(+), 124 deletions(-) delete mode 100644 electron-builder-macx64.yml diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 08ca8c19e..962c0589f 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -168,12 +168,7 @@ jobs: - name: Build Mac run: pnpm run build:mac:${{ matrix.arch }} env: - CSC_LINK: ${{ secrets.DEEPCHAT_CSC_LINK }} - CSC_KEY_PASSWORD: ${{ secrets.DEEPCHAT_CSC_KEY_PASS }} - DEEPCHAT_APPLE_NOTARY_USERNAME: ${{ secrets.DEEPCHAT_APPLE_NOTARY_USERNAME }} - DEEPCHAT_APPLE_NOTARY_TEAM_ID: ${{ secrets.DEEPCHAT_APPLE_NOTARY_TEAM_ID }} - DEEPCHAT_APPLE_NOTARY_PASSWORD: ${{ secrets.DEEPCHAT_APPLE_NOTARY_PASSWORD }} - build_for_release: '2' + CSC_IDENTITY_AUTO_DISCOVERY: 'false' VITE_GITHUB_CLIENT_ID: ${{ secrets.DC_GITHUB_CLIENT_ID }} VITE_GITHUB_CLIENT_SECRET: ${{ secrets.DC_GITHUB_CLIENT_SECRET }} VITE_GITHUB_REDIRECT_URI: ${{ secrets.DC_GITHUB_REDIRECT_URI }} diff --git a/docs/rebrand-guide.md b/docs/rebrand-guide.md index eb9f1bc2d..6ac09de52 100644 --- a/docs/rebrand-guide.md +++ b/docs/rebrand-guide.md @@ -86,7 +86,6 @@ This script will automatically replace brand information in the following files: - `package.json` - Package configuration - `electron-builder.yml` - Build configuration -- `electron-builder-macx64.yml` - macOS x64 build configuration - `src/main/index.ts` - Main process configuration - `src/main/presenter/upgradePresenter/index.ts` - Update service configuration - `src/renderer/src/i18n/*/about.json` - Internationalization files @@ -343,7 +342,6 @@ node scripts/rebrand.js - `package.json` - 包配置 - `electron-builder.yml` - 构建配置 -- `electron-builder-macx64.yml` - macOS x64 构建配置 - `src/main/index.ts` - 主进程配置 - `src/main/presenter/upgradePresenter/index.ts` - 更新服务配置 - `src/renderer/src/i18n/*/about.json` - 国际化文件 diff --git a/electron-builder-macx64.yml b/electron-builder-macx64.yml deleted file mode 100644 index beb6a7b84..000000000 --- a/electron-builder-macx64.yml +++ /dev/null @@ -1,83 +0,0 @@ -appId: com.wefonk.deepchat -productName: DeepChat -directories: - buildResources: build -files: - - '!**/.claude/*' - - '!**/.github/*' - - '!**/.cursor/*' - - '!**/.vscode/*' - - '!src/*' - - '!test/*' - - '!docs/*' - - '!electron.vite.config.{js,ts,mjs,cjs}' - - '!{.eslintignore,.eslintrc.cjs,.prettierignore,.prettierrc.yaml,dev-app-update.yml,CHANGELOG.md,README.md}' - - '!{.env,.env.*,.npmrc,pnpm-lock.yaml}' - - '!{tsconfig.json,tsconfig.node.json,tsconfig.app.json}' - - '!keys/*' - - '!scripts/*' - - '!.github/*' - - '!electron-builder.yml' - - '!electron-builder-macx64.yml' - - '!test/*' - - '!*.config.ts' - - '!*.config.js' - - '!**/{LICENSE,LICENSE.txt,*.LICENSE.txt,NOTICE.txt,README.md,CHANGELOG.md,CONTRIBUTING.md,CONTRIBUTING.zh.md,README.zh.md,README.jp.md}' - - '!**/{.DS_Store,Thumbs.db}' - - '!*.md' -asarUnpack: - - '**/node_modules/sharp/**/*' - - '**/node_modules/@img/**/*' -extraResources: - - from: ./runtime/ - to: app.asar.unpacked/runtime - filter: ['**/*'] - - from: ./resources/cdn/ - to: app.asar.unpacked/resources/cdn - filter: ['**/*'] -afterSign: scripts/notarize.js -afterPack: scripts/afterPack.js -electronLanguages: - - zh-CN - - zh-TW - - zh-HK - - en-US - - ja-JP - - ko-KR - - fr-FR - - ru-RU - - ja - - ru - - zh_CN - - zh_TW - - zh_HK - - en - - ko - - fr - - fa-IR - - fa - - pt-BR - - pt - - da-DK - - da - - he-IL - - he -mac: - entitlementsInherit: build/entitlements.mac.plist - extendInfo: - - NSCameraUsageDescription: Application requests access to the device's camera. - - NSMicrophoneUsageDescription: Application requests access to the device's microphone. - - NSDocumentsFolderUsageDescription: Application requests access to the user's Documents folder. - - NSDownloadsFolderUsageDescription: Application requests access to the user's Downloads folder. - gatekeeperAssess: false - category: public.app-category.utilities - target: - - target: dmg - arch: x64 - - target: zip - arch: x64 - artifactName: ${name}-${version}-mac-${arch}.${ext} -npmRebuild: true -publish: - provider: generic - url: https://cdn.deepchatai.cn/upgrade/ diff --git a/electron-builder.yml b/electron-builder.yml index 93c31acbb..b12ca02c1 100644 --- a/electron-builder.yml +++ b/electron-builder.yml @@ -18,7 +18,6 @@ files: - '!{.env,.env.*,.npmrc,pnpm-lock.yaml}' - '!{tsconfig.json,tsconfig.node.json,tsconfig.app.json}' - '!electron-builder.yml' - - '!electron-builder-macx64.yml' - '!test/*' - '!*.config.ts' - '!*.config.js' @@ -84,9 +83,7 @@ mac: category: public.app-category.utilities target: - target: dmg - arch: arm64 - target: zip - arch: arm64 artifactName: ${name}-${version}-mac-${arch}.${ext} linux: target: diff --git a/package.json b/package.json index e1bbee87f..dc2b828d9 100644 --- a/package.json +++ b/package.json @@ -38,7 +38,7 @@ "install:sharp": "node scripts/install-sharp-for-platform.js", "build:mac": "pnpm run build && electron-builder --mac", "build:mac:arm64": "pnpm run build && electron-builder --mac --arm64", - "build:mac:x64": "pnpm run build && electron-builder -c electron-builder-macx64.yml --mac --x64 ", + "build:mac:x64": "pnpm run build && electron-builder --mac --x64", "build:linux": "pnpm run build && electron-builder --linux", "build:linux:x64": "pnpm run build && electron-builder --linux --x64", "build:linux:arm64": "pnpm run build && electron-builder --linux --arm64", diff --git a/scripts/rebrand.js b/scripts/rebrand.js index 797ce4984..1e1731c31 100644 --- a/scripts/rebrand.js +++ b/scripts/rebrand.js @@ -122,34 +122,6 @@ function updateElectronBuilder(config) { } } -// 更新 electron-builder-macx64.yml -function updateElectronBuilderMacX64(config) { - const builderPath = path.join(PROJECT_ROOT, 'electron-builder-macx64.yml') - - if (!fs.existsSync(builderPath)) { - return // 文件不存在则跳过 - } - - try { - let content = fs.readFileSync(builderPath, 'utf8') - - // 替换 appId - content = content.replace(/appId: .+/, `appId: ${config.app.appId}`) - - // 替换 productName - content = content.replace(/productName: .+/, `productName: ${config.app.productName}`) - - // 替换 publish URL - if (config.update && config.update.baseUrl) { - content = content.replace(/url: https:\/\/cdn\.deepchatai\.cn\/upgrade\//, `url: ${config.update.baseUrl}`) - } - - fs.writeFileSync(builderPath, content, 'utf8') - success('已更新 electron-builder-macx64.yml') - } catch (err) { - error(`更新 electron-builder-macx64.yml 失败: ${err.message}`) - } -} // 更新主进程中的 app user model ID function updateMainIndex(config) { @@ -480,7 +452,6 @@ function main() { // 执行替换 updatePackageJson(config) updateElectronBuilder(config) - updateElectronBuilderMacX64(config) updateMainIndex(config) updateUpgradePresenter(config) updateI18nFiles(config) From 5536fd96bd44727ab54c62f5003c55d389914bb3 Mon Sep 17 00:00:00 2001 From: yyhhyyyyyy Date: Wed, 24 Dec 2025 10:02:47 +0800 Subject: [PATCH 02/13] feat: support github channels update --- .github/workflows/release.yml | 54 +++++- electron-builder.yml | 5 +- src/main/presenter/configPresenter/index.ts | 10 +- src/main/presenter/upgradePresenter/index.ts | 171 ++++++++---------- .../settings/components/AboutUsSettings.vue | 2 +- src/renderer/src/i18n/da-DK/about.json | 2 +- src/renderer/src/i18n/en-US/about.json | 2 +- src/renderer/src/i18n/fa-IR/about.json | 2 +- src/renderer/src/i18n/fr-FR/about.json | 2 +- src/renderer/src/i18n/he-IL/about.json | 2 +- src/renderer/src/i18n/ja-JP/about.json | 2 +- src/renderer/src/i18n/ko-KR/about.json | 2 +- src/renderer/src/i18n/pt-BR/about.json | 2 +- src/renderer/src/i18n/ru-RU/about.json | 2 +- src/renderer/src/i18n/zh-CN/about.json | 2 +- src/renderer/src/i18n/zh-HK/about.json | 2 +- src/renderer/src/i18n/zh-TW/about.json | 2 +- 17 files changed, 143 insertions(+), 123 deletions(-) diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index 1209a9066..650005d65 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -7,11 +7,6 @@ on: description: 'Build workflow run ID to use for artifacts' required: true type: string - prerelease: - description: 'Is this a prerelease?' - required: true - type: boolean - default: false jobs: create-release: @@ -32,7 +27,16 @@ jobs: run: | VERSION_FILE=$(find artifacts/deepchat-linux-x64 -name "DeepChat-*.tar.gz" | head -n 1) if [ -n "$VERSION_FILE" ]; then - VERSION=$(echo $VERSION_FILE | grep -o 'DeepChat-[0-9]\+\.[0-9]\+\.[0-9]\+' | sed 's/DeepChat-//') + VERSION=$(echo "$VERSION_FILE" | grep -oE 'DeepChat-[0-9]+\.[0-9]+\.[0-9]+(-(beta|alpha)\.[0-9]+)?' | sed 's/DeepChat-//') + if [ -z "$VERSION" ]; then + echo "Error: Failed to parse version from $VERSION_FILE" + exit 1 + fi + if echo "$VERSION" | grep -qE '-(beta|alpha)\.'; then + echo "prerelease=true" >> $GITHUB_OUTPUT + else + echo "prerelease=false" >> $GITHUB_OUTPUT + fi echo "version=$VERSION" >> $GITHUB_OUTPUT echo "Found version: $VERSION" else @@ -49,6 +53,8 @@ jobs: cp artifacts/deepchat-win-x64/*.exe release_assets/ 2>/dev/null || true cp artifacts/deepchat-win-x64/*.msi release_assets/ 2>/dev/null || true cp artifacts/deepchat-win-x64/*.zip release_assets/ 2>/dev/null || true + cp artifacts/deepchat-win-x64/*.yml release_assets/ 2>/dev/null || true + cp artifacts/deepchat-win-x64/*.blockmap release_assets/ 2>/dev/null || true fi # Process Windows arm64 artifacts @@ -64,20 +70,54 @@ jobs: cp artifacts/deepchat-linux-x64/*.deb release_assets/ 2>/dev/null || true cp artifacts/deepchat-linux-x64/*.rpm release_assets/ 2>/dev/null || true cp artifacts/deepchat-linux-x64/*.tar.gz release_assets/ 2>/dev/null || true + cp artifacts/deepchat-linux-x64/*.yml release_assets/ 2>/dev/null || true + cp artifacts/deepchat-linux-x64/*.blockmap release_assets/ 2>/dev/null || true fi # Process Mac x64 artifacts if [ -d "artifacts/deepchat-mac-x64" ]; then cp artifacts/deepchat-mac-x64/*.dmg release_assets/ 2>/dev/null || true cp artifacts/deepchat-mac-x64/*.zip release_assets/ 2>/dev/null || true + cp artifacts/deepchat-mac-x64/*.blockmap release_assets/ 2>/dev/null || true fi # Process Mac arm64 artifacts if [ -d "artifacts/deepchat-mac-arm64" ]; then cp artifacts/deepchat-mac-arm64/*.dmg release_assets/ 2>/dev/null || true cp artifacts/deepchat-mac-arm64/*.zip release_assets/ 2>/dev/null || true + cp artifacts/deepchat-mac-arm64/*.blockmap release_assets/ 2>/dev/null || true fi + merge_mac_yml() { + local name="$1" + local x64="artifacts/deepchat-mac-x64/$name" + local arm64="artifacts/deepchat-mac-arm64/$name" + if [ -f "$x64" ] && [ -f "$arm64" ]; then + ruby -ryaml -e ' + x64 = YAML.load_file(ARGV[0]) || {} + arm = YAML.load_file(ARGV[1]) || {} + merged = x64.dup + merged["version"] ||= arm["version"] + merged["releaseDate"] ||= arm["releaseDate"] + merged["releaseNotes"] ||= arm["releaseNotes"] + merged["path"] ||= arm["path"] + merged["sha512"] ||= arm["sha512"] + files = [] + files.concat(x64["files"]) if x64["files"].is_a?(Array) + files.concat(arm["files"]) if arm["files"].is_a?(Array) + merged["files"] = files.uniq { |f| f["url"] } + File.write(ARGV[2], merged.to_yaml) + ' "$x64" "$arm64" "release_assets/$name" + elif [ -f "$x64" ]; then + cp "$x64" "release_assets/$name" + elif [ -f "$arm64" ]; then + cp "$arm64" "release_assets/$name" + fi + } + + merge_mac_yml latest-mac.yml + merge_mac_yml beta-mac.yml + ls -la release_assets/ - name: Create Draft Release @@ -86,7 +126,7 @@ jobs: tag_name: v${{ steps.get_version.outputs.version }} name: DeepChat V${{ steps.get_version.outputs.version }} draft: true - prerelease: ${{ github.event.inputs.prerelease }} + prerelease: ${{ steps.get_version.outputs.prerelease == 'true' }} files: | release_assets/* body: | diff --git a/electron-builder.yml b/electron-builder.yml index b12ca02c1..acb40ec6f 100644 --- a/electron-builder.yml +++ b/electron-builder.yml @@ -96,5 +96,6 @@ linux: - x-scheme-handler/deepchat npmRebuild: true publish: - provider: generic - url: https://cdn.deepchatai.cn/upgrade/ + provider: github + owner: yyhhyyyyyy + repo: deepchat diff --git a/src/main/presenter/configPresenter/index.ts b/src/main/presenter/configPresenter/index.ts index 86c03b1b6..2b249348e 100644 --- a/src/main/presenter/configPresenter/index.ts +++ b/src/main/presenter/configPresenter/index.ts @@ -73,7 +73,7 @@ interface IAppSettings { floatingButtonEnabled?: boolean // Whether floating button is enabled default_system_prompt?: string // Default system prompt webContentLengthLimit?: number // Web content truncation length limit, default 3000 characters - updateChannel?: string // Update channel: 'stable' | 'canary' + updateChannel?: string // Update channel: 'stable' | 'beta' fontFamily?: string // Custom UI font codeFontFamily?: string // Custom code font [key: string]: unknown // Allow arbitrary keys, using unknown type instead of any @@ -1475,7 +1475,13 @@ export class ConfigPresenter implements IConfigPresenter { // 获取更新渠道 getUpdateChannel(): string { - return this.getSetting('updateChannel') || 'stable' + const raw = this.getSetting('updateChannel') || 'stable' + const normalized = raw === 'canary' ? 'beta' : raw + const channel = normalized === 'beta' || normalized === 'stable' ? normalized : 'stable' + if (channel !== raw) { + this.setSetting('updateChannel', channel) + } + return channel } // 设置更新渠道 diff --git a/src/main/presenter/upgradePresenter/index.ts b/src/main/presenter/upgradePresenter/index.ts index 9d9584eb1..cb1e0e473 100644 --- a/src/main/presenter/upgradePresenter/index.ts +++ b/src/main/presenter/upgradePresenter/index.ts @@ -8,13 +8,17 @@ import { import { eventBus, SendTarget } from '@/eventbus' import { UPDATE_EVENTS, WINDOW_EVENTS } from '@/events' import electronUpdater from 'electron-updater' -import axios from 'axios' -import { compare } from 'compare-versions' +import type { ReleaseNoteInfo, UpdateInfo } from 'electron-updater' import fs from 'fs' import path from 'path' const { autoUpdater } = electronUpdater +const GITHUB_OWNER = 'yyhhyyyyyy' +const GITHUB_REPO = 'deepchat' +const UPDATE_CHANNEL_STABLE = 'stable' +const UPDATE_CHANNEL_BETA = 'beta' + // 版本信息接口 interface VersionInfo { version: string @@ -24,26 +28,42 @@ interface VersionInfo { downloadUrl: string } -// 获取平台和架构信息 -const getPlatformInfo = () => { - const platform = process.platform - const arch = process.arch - let platformString = '' - - if (platform === 'win32') { - platformString = arch === 'arm64' ? 'winarm' : 'winx64' - } else if (platform === 'darwin') { - platformString = arch === 'arm64' ? 'macarm' : 'macx64' - } else if (platform === 'linux') { - platformString = arch === 'arm64' ? 'linuxarm' : 'linuxx64' - } +const normalizeUpdateChannel = (channel?: string): 'stable' | 'beta' => { + if (channel === UPDATE_CHANNEL_BETA || channel === 'canary') return UPDATE_CHANNEL_BETA + return UPDATE_CHANNEL_STABLE +} + +const formatTagVersion = (version: string): string => { + return version.startsWith('v') ? version : `v${version}` +} - return platformString +const buildReleaseUrl = (version: string): string => { + return `https://github.com/${GITHUB_OWNER}/${GITHUB_REPO}/releases/tag/${formatTagVersion(version)}` } -// 获取版本检查的基础URL -const getVersionCheckBaseUrl = () => { - return 'https://cdn.deepchatai.cn' +const formatReleaseNotes = (notes?: string | ReleaseNoteInfo[] | null): string => { + if (!notes) return '' + if (typeof notes === 'string') return notes + if (!Array.isArray(notes)) return String(notes) + const blocks = notes + .map((note) => { + const title = note.version ? `## ${note.version}` : '' + const body = note.note ?? '' + return [title, body].filter(Boolean).join('\n') + }) + .filter((entry) => entry.length > 0) + return blocks.join('\n\n') +} + +const toVersionInfo = (info: UpdateInfo): VersionInfo => { + const releaseUrl = buildReleaseUrl(info.version) + return { + version: info.version, + releaseDate: info.releaseDate || '', + releaseNotes: formatReleaseNotes(info.releaseNotes), + githubUrl: releaseUrl, + downloadUrl: releaseUrl + } } // 获取自动更新状态文件路径 @@ -57,8 +77,8 @@ export class UpgradePresenter implements IUpgradePresenter { private _progress: UpdateProgress | null = null private _error: string | null = null private _versionInfo: VersionInfo | null = null - private _baseUrl: string private _lastCheckTime: number = 0 // 上次检查更新的时间戳 + private _lastCheckType?: string private _updateMarkerPath: string private _previousUpdateFailed: boolean = false // 标记上次更新是否失败 private _configPresenter: IConfigPresenter // 配置presenter @@ -66,7 +86,6 @@ export class UpgradePresenter implements IUpgradePresenter { constructor(configPresenter: IConfigPresenter) { this._configPresenter = configPresenter - this._baseUrl = getVersionCheckBaseUrl() this._updateMarkerPath = getUpdateMarkerFilePath() // 配置自动更新 @@ -98,18 +117,33 @@ export class UpgradePresenter implements IUpgradePresenter { this._lock = false this._status = 'not-available' eventBus.sendToRenderer(UPDATE_EVENTS.STATUS_CHANGED, SendTarget.ALL_WINDOWS, { - status: this._status + status: this._status, + type: this._lastCheckType }) }) // 有可用更新 autoUpdater.on('update-available', (info) => { console.log('检测到新版本', info) - this._status = 'available' + this._versionInfo = toVersionInfo(info) - // 重要:这里不再使用info中的信息更新this._versionInfo - // 而是确保使用之前从versionUrl获取的原始信息 - console.log('使用已保存的版本信息:', this._versionInfo) + if (this._previousUpdateFailed) { + console.log('上次更新失败,本次不进行自动更新,改为手动更新') + this._status = 'error' + this._error = '自动更新可能不稳定,请手动下载更新' + eventBus.sendToRenderer(UPDATE_EVENTS.STATUS_CHANGED, SendTarget.ALL_WINDOWS, { + status: this._status, + error: this._error, + info: this._versionInfo + }) + return + } + + this._status = 'available' + eventBus.sendToRenderer(UPDATE_EVENTS.STATUS_CHANGED, SendTarget.ALL_WINDOWS, { + status: this._status, + info: this._versionInfo + }) // 检测到更新后自动开始下载 this.startDownloadUpdate() }) @@ -137,6 +171,10 @@ export class UpgradePresenter implements IUpgradePresenter { this._lock = false this._status = 'downloaded' + if (!this._versionInfo) { + this._versionInfo = toVersionInfo(info) + } + // 写入更新标记文件 this.writeUpdateMarker(this._versionInfo?.version || info.version) @@ -250,83 +288,17 @@ export class UpgradePresenter implements IUpgradePresenter { try { this._status = 'checking' + this._lastCheckType = type eventBus.sendToRenderer(UPDATE_EVENTS.STATUS_CHANGED, SendTarget.ALL_WINDOWS, { status: this._status }) - // 首先获取版本信息文件 - const platformString = getPlatformInfo() - const rawChannel = this._configPresenter.getUpdateChannel() - const updateChannel = rawChannel === 'canary' ? 'canary' : 'upgrade' // Sanitize channel - const randomId = Math.floor(Date.now() / 3600000) // Timestamp truncated to hour - const versionPath = updateChannel - const versionUrl = `${this._baseUrl}/${versionPath}/${platformString}.json?noCache=${randomId}` - console.log('versionUrl', versionUrl) - const response = await axios.get(versionUrl, { timeout: 60000 }) // Add network timeout - const remoteVersion = response.data - const currentVersion = app.getVersion() - - // 保存完整的远程版本信息到内存中,作为唯一的标准信息源 - this._versionInfo = { - version: remoteVersion.version, - releaseDate: remoteVersion.releaseDate, - releaseNotes: remoteVersion.releaseNotes, - githubUrl: remoteVersion.githubUrl, - downloadUrl: remoteVersion.downloadUrl - } + const updateChannel = normalizeUpdateChannel(this._configPresenter.getUpdateChannel()) + autoUpdater.allowPrerelease = updateChannel === UPDATE_CHANNEL_BETA + autoUpdater.channel = updateChannel === UPDATE_CHANNEL_BETA ? UPDATE_CHANNEL_BETA : 'latest' - console.log('cache versionInfo:', this._versionInfo) - - // 更新上次检查时间 + await autoUpdater.checkForUpdates() this._lastCheckTime = Date.now() - - // 比较版本号 - if (compare(remoteVersion.version, currentVersion, '>')) { - // 有新版本 - - // 如果上次更新失败,这次不再尝试自动更新,直接进入错误状态让用户手动更新 - if (this._previousUpdateFailed) { - console.log('上次更新失败,本次不进行自动更新,改为手动更新') - this._status = 'error' - this._error = '自动更新可能不稳定,请手动下载更新' - - eventBus.sendToRenderer(UPDATE_EVENTS.STATUS_CHANGED, SendTarget.ALL_WINDOWS, { - status: this._status, - error: this._error, - info: this._versionInfo - }) - return - } - - // 设置自动更新的URL - const autoUpdateUrl = - updateChannel === 'canary' - ? `${this._baseUrl}/canary/${platformString}` - : `${this._baseUrl}/upgrade/v${remoteVersion.version}/${platformString}` - console.log('设置自动更新URL:', autoUpdateUrl) - autoUpdater.setFeedURL(autoUpdateUrl) - - try { - // 使用electron-updater检查更新,但不自动下载 - await autoUpdater.checkForUpdates() - } catch (err) { - console.error('自动更新检查失败,回退到手动更新', err) - // 如果自动更新失败,回退到手动更新 - this._status = 'available' - - eventBus.sendToRenderer(UPDATE_EVENTS.STATUS_CHANGED, SendTarget.ALL_WINDOWS, { - status: this._status, - info: this._versionInfo // 使用已保存的版本信息 - }) - } - } else { - // 没有新版本 - this._status = 'not-available' - eventBus.sendToRenderer(UPDATE_EVENTS.STATUS_CHANGED, SendTarget.ALL_WINDOWS, { - status: this._status, - type - }) - } } catch (error: Error | unknown) { this._status = 'error' this._error = error instanceof Error ? error.message : String(error) @@ -355,13 +327,14 @@ export class UpgradePresenter implements IUpgradePresenter { } async goDownloadUpgrade(type: 'github' | 'netdisk'): Promise { + const fallbackUrl = `https://github.com/${GITHUB_OWNER}/${GITHUB_REPO}/releases` if (type === 'github') { - const url = this._versionInfo?.githubUrl + const url = this._versionInfo?.githubUrl || fallbackUrl if (url) { shell.openExternal(url) } } else if (type === 'netdisk') { - const url = this._versionInfo?.downloadUrl + const url = this._versionInfo?.downloadUrl || fallbackUrl if (url) { shell.openExternal(url) } diff --git a/src/renderer/settings/components/AboutUsSettings.vue b/src/renderer/settings/components/AboutUsSettings.vue index 5d008ec8e..1d3a85d10 100644 --- a/src/renderer/settings/components/AboutUsSettings.vue +++ b/src/renderer/settings/components/AboutUsSettings.vue @@ -57,7 +57,7 @@ {{ t('about.stableChannel') }} - + {{ t('about.canaryChannel') }} diff --git a/src/renderer/src/i18n/da-DK/about.json b/src/renderer/src/i18n/da-DK/about.json index 3b15f1a33..431240343 100644 --- a/src/renderer/src/i18n/da-DK/about.json +++ b/src/renderer/src/i18n/da-DK/about.json @@ -1,5 +1,5 @@ { - "canaryChannel": "Intern testversion", + "canaryChannel": "Beta", "checkUpdateButton": "Tjek for opdateringer", "description": "DeepChat er en tværplatform AI-klient, der har til formål at gøre det nemmere for flere mennesker at bruge AI.", "deviceInfo": { diff --git a/src/renderer/src/i18n/en-US/about.json b/src/renderer/src/i18n/en-US/about.json index c4a66a843..e58c7ea0c 100644 --- a/src/renderer/src/i18n/en-US/about.json +++ b/src/renderer/src/i18n/en-US/about.json @@ -15,5 +15,5 @@ "checkUpdateButton": "Check for Updates", "updateChannel": "Update Channel", "stableChannel": "Stable", - "canaryChannel": "Canary" + "canaryChannel": "Beta" } diff --git a/src/renderer/src/i18n/fa-IR/about.json b/src/renderer/src/i18n/fa-IR/about.json index 77b59e799..ee57127a1 100644 --- a/src/renderer/src/i18n/fa-IR/about.json +++ b/src/renderer/src/i18n/fa-IR/about.json @@ -15,5 +15,5 @@ "checkUpdateButton": "بررسی به‌روزرسانی", "updateChannel": "کانال به‌روزرسانی", "stableChannel": "پایدار", - "canaryChannel": "کاناری" + "canaryChannel": "Beta" } diff --git a/src/renderer/src/i18n/fr-FR/about.json b/src/renderer/src/i18n/fr-FR/about.json index c5d9af7d9..6ecca847c 100644 --- a/src/renderer/src/i18n/fr-FR/about.json +++ b/src/renderer/src/i18n/fr-FR/about.json @@ -15,5 +15,5 @@ "checkUpdateButton": "Vérifier les mises à jour", "updateChannel": "Canal de mise à jour", "stableChannel": "Stable", - "canaryChannel": "Canary" + "canaryChannel": "Beta" } diff --git a/src/renderer/src/i18n/he-IL/about.json b/src/renderer/src/i18n/he-IL/about.json index 03e17c5bb..fd9c2aa0d 100644 --- a/src/renderer/src/i18n/he-IL/about.json +++ b/src/renderer/src/i18n/he-IL/about.json @@ -15,5 +15,5 @@ "checkUpdateButton": "בדוק עדכונים", "updateChannel": "ערוץ עדכון", "stableChannel": "יציב (Stable)", - "canaryChannel": "קנרית (Canary)" + "canaryChannel": "Beta" } diff --git a/src/renderer/src/i18n/ja-JP/about.json b/src/renderer/src/i18n/ja-JP/about.json index e4ce28faa..ff259dcda 100644 --- a/src/renderer/src/i18n/ja-JP/about.json +++ b/src/renderer/src/i18n/ja-JP/about.json @@ -7,7 +7,7 @@ "checkUpdateButton": "アップデートを確認", "updateChannel": "アップデートチャンネル", "stableChannel": "安定版", - "canaryChannel": "テスト版", + "canaryChannel": "Beta", "deviceInfo": { "title": "デバイス情報", "platform": "プラットフォーム", diff --git a/src/renderer/src/i18n/ko-KR/about.json b/src/renderer/src/i18n/ko-KR/about.json index 114506c81..1be72f7b9 100644 --- a/src/renderer/src/i18n/ko-KR/about.json +++ b/src/renderer/src/i18n/ko-KR/about.json @@ -7,7 +7,7 @@ "checkUpdateButton": "업데이트 확인", "updateChannel": "업데이트 채널", "stableChannel": "안정 버전", - "canaryChannel": "테스트 버전", + "canaryChannel": "Beta", "deviceInfo": { "title": "장치 정보", "platform": "플랫폼", diff --git a/src/renderer/src/i18n/pt-BR/about.json b/src/renderer/src/i18n/pt-BR/about.json index e1e02d593..ce238f559 100644 --- a/src/renderer/src/i18n/pt-BR/about.json +++ b/src/renderer/src/i18n/pt-BR/about.json @@ -15,5 +15,5 @@ "checkUpdateButton": "Verificar Atualizações", "updateChannel": "Canal de Atualização", "stableChannel": "Estável", - "canaryChannel": "Canary" + "canaryChannel": "Beta" } diff --git a/src/renderer/src/i18n/ru-RU/about.json b/src/renderer/src/i18n/ru-RU/about.json index 04db38aef..3059f47e5 100644 --- a/src/renderer/src/i18n/ru-RU/about.json +++ b/src/renderer/src/i18n/ru-RU/about.json @@ -7,7 +7,7 @@ "checkUpdateButton": "Проверить обновления", "updateChannel": "Канал обновлений", "stableChannel": "Стабильный", - "canaryChannel": "Канареечный", + "canaryChannel": "Beta", "deviceInfo": { "title": "Сведения об устройстве", "platform": "Платформа", diff --git a/src/renderer/src/i18n/zh-CN/about.json b/src/renderer/src/i18n/zh-CN/about.json index 88f9bfc1d..d4c7f8d64 100644 --- a/src/renderer/src/i18n/zh-CN/about.json +++ b/src/renderer/src/i18n/zh-CN/about.json @@ -7,7 +7,7 @@ "checkUpdateButton": "检查更新", "updateChannel": "更新渠道", "stableChannel": "正式版", - "canaryChannel": "内测版", + "canaryChannel": "Beta", "deviceInfo": { "title": "设备信息", "platform": "平台", diff --git a/src/renderer/src/i18n/zh-HK/about.json b/src/renderer/src/i18n/zh-HK/about.json index 091bf17e5..cecb87687 100644 --- a/src/renderer/src/i18n/zh-HK/about.json +++ b/src/renderer/src/i18n/zh-HK/about.json @@ -7,7 +7,7 @@ "checkUpdateButton": "檢查更新", "updateChannel": "更新頻道", "stableChannel": "正式版", - "canaryChannel": "測試版", + "canaryChannel": "Beta", "deviceInfo": { "title": "設備信息", "platform": "平台", diff --git a/src/renderer/src/i18n/zh-TW/about.json b/src/renderer/src/i18n/zh-TW/about.json index 80ccdb87e..6d35136f9 100644 --- a/src/renderer/src/i18n/zh-TW/about.json +++ b/src/renderer/src/i18n/zh-TW/about.json @@ -7,7 +7,7 @@ "checkUpdateButton": "檢查更新", "updateChannel": "更新頻道", "stableChannel": "正式版", - "canaryChannel": "測試版", + "canaryChannel": "Beta", "deviceInfo": { "title": "裝置資訊", "platform": "平台", From d6489c6f2ab7470f5850817d5da1f3f446e84a84 Mon Sep 17 00:00:00 2001 From: yyhhyyyyyy Date: Wed, 24 Dec 2025 10:15:41 +0800 Subject: [PATCH 03/13] fix: action error --- .github/workflows/release.yml | 82 ++++++++++---------- CHANGELOG.md | 18 +++++ src/main/presenter/upgradePresenter/index.ts | 9 ++- 3 files changed, 68 insertions(+), 41 deletions(-) create mode 100644 CHANGELOG.md diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index 650005d65..4481a1c68 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -22,6 +22,19 @@ jobs: - name: List downloaded artifacts run: find artifacts -type f | sort + - name: Get build run info + id: build_run + uses: actions/github-script@v7 + with: + script: | + const runId = Number('${{ github.event.inputs.workflow_id }}') + const { data } = await github.rest.actions.getWorkflowRun({ + owner: context.repo.owner, + repo: context.repo.repo, + run_id: runId + }) + core.setOutput('sha', data.head_sha) + - name: Get version number id: get_version run: | @@ -44,6 +57,35 @@ jobs: exit 1 fi + - name: Checkout build commit + uses: actions/checkout@v4 + with: + ref: ${{ steps.build_run.outputs.sha }} + fetch-depth: 1 + + - name: Build release notes from CHANGELOG + run: | + VERSION="${{ steps.get_version.outputs.version }}" + CHANGELOG="CHANGELOG.md" + if [ ! -f "$CHANGELOG" ]; then + echo "Error: CHANGELOG.md not found" + exit 1 + fi + HEADER_REGEX="^## v${VERSION} \\([0-9]{4}-[0-9]{2}-[0-9]{2}\\)$" + if ! grep -Eq "$HEADER_REGEX" "$CHANGELOG"; then + echo "Error: Changelog entry not found for v${VERSION}" + exit 1 + fi + awk -v ver="v${VERSION}" ' + $0 ~ "^## " ver " \\(" { in_section = 1 } + in_section && $0 ~ "^## " && $0 !~ "^## " ver " \\(" { exit } + in_section { print } + ' "$CHANGELOG" > release_notes.md + if [ ! -s release_notes.md ]; then + echo "Error: Release notes are empty for v${VERSION}" + exit 1 + fi + - name: Prepare release assets run: | mkdir -p release_assets @@ -129,45 +171,7 @@ jobs: prerelease: ${{ steps.get_version.outputs.prerelease == 'true' }} files: | release_assets/* - body: | - # 🚀 DeepChat ${{ steps.get_version.outputs.version }} 正式发布 | 重新定义你的 AI 对话体验! - —— 不再是简单的 ChatBot,而是你的自然语言 Agent 工具🌟 - - 🔥 为什么选择 DeepChat? - - ✅ **商业友好**:基于原版 [Apache License 2.0](https://github.com/ThinkInAIXYZ/deepchat/blob/main/LICENSE) 开源,无任何协议外的额外约束,面向开源。 - ✅ **开箱即用**:极简配置,即刻开启你的智能对话之旅。 - ✅ **极致灵活**:自由切换模型,自定义模型源,满足你多样化的对话和探索需求。 - ✅ **体验绝佳**:LaTeX 公式渲染、代码高亮、Markdown 支持,模型对话从未如此顺畅。 - ✅ **持续进化**:我们倾听用户反馈,不断迭代更新,为你带来更卓越的 AI 对话体验。 - - 📥 立即体验未来 - - 💬 反馈有礼:欢迎提交你的宝贵建议,加入 VIP 用户社群,与我们一同塑造 DeepChat 的未来! - - - 🎮 加入 Discord 社区:[https://discord.gg/6RBatENX](https://discord.gg/6RBatENX) - - --- - - # 🚀 DeepChat ${{ steps.get_version.outputs.version }} Official Release | Redefine Your AI Conversation Experience! - —— Not just a simple ChatBot, but your natural language Agent tool 🌟 - - 🔥 Why Choose DeepChat? - - ✅ **Business-Friendly**: Open source under [Apache License 2.0](https://github.com/ThinkInAIXYZ/deepchat/blob/main/LICENSE), with no additional constraints beyond the license, truly open source. - ✅ **Ready to Use**: Minimal configuration, start your intelligent conversation journey immediately. - ✅ **Ultra Flexible**: Freely switch models, customize model sources, meet your diverse conversation and exploration needs. - ✅ **Excellent Experience**: LaTeX formula rendering, code highlighting, Markdown support, model conversations have never been smoother. - ✅ **Continuous Evolution**: We listen to user feedback, continuously iterate and update, bringing you an even better AI conversation experience. - - 📥 Experience the Future Now - - 💬 Feedback Welcome: We welcome your valuable suggestions, join the user community, and shape the future of DeepChat together! - - - - 🎮 Join Discord Community: [https://discord.gg/6RBatENX](https://discord.gg/6RBatENX) + body_path: release_notes.md env: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} diff --git a/CHANGELOG.md b/CHANGELOG.md new file mode 100644 index 000000000..120e96f8a --- /dev/null +++ b/CHANGELOG.md @@ -0,0 +1,18 @@ +# Changelog + +## v0.5.6-canary (2025-12-23) +- Markdown 优化,修复列表元素异常 +- 修复 Ollama 视觉模型图片格式 +- Improved Markdown rendering, fixed list element issues +- Fixed Ollama vision model image format + +## v0.5.5 (2025-12-19) +- 全新 Yo Browser 功能,让你的模型畅游网络 +- All-new Yo Browser lets your model roam the web + +## v0.5.3 (2025-12-13) +- 优化 ACP 体验,增加 ACP 调试能力 +- 增加了自定义软件字体能力 +- add acp process warmup and debug panel +- add font settings +- add Hebrew (he-IL) Translation diff --git a/src/main/presenter/upgradePresenter/index.ts b/src/main/presenter/upgradePresenter/index.ts index cb1e0e473..902000667 100644 --- a/src/main/presenter/upgradePresenter/index.ts +++ b/src/main/presenter/upgradePresenter/index.ts @@ -8,7 +8,7 @@ import { import { eventBus, SendTarget } from '@/eventbus' import { UPDATE_EVENTS, WINDOW_EVENTS } from '@/events' import electronUpdater from 'electron-updater' -import type { ReleaseNoteInfo, UpdateInfo } from 'electron-updater' +import type { UpdateInfo } from 'electron-updater' import fs from 'fs' import path from 'path' @@ -19,6 +19,11 @@ const GITHUB_REPO = 'deepchat' const UPDATE_CHANNEL_STABLE = 'stable' const UPDATE_CHANNEL_BETA = 'beta' +type ReleaseNoteItem = { + version?: string + note?: string +} + // 版本信息接口 interface VersionInfo { version: string @@ -41,7 +46,7 @@ const buildReleaseUrl = (version: string): string => { return `https://github.com/${GITHUB_OWNER}/${GITHUB_REPO}/releases/tag/${formatTagVersion(version)}` } -const formatReleaseNotes = (notes?: string | ReleaseNoteInfo[] | null): string => { +const formatReleaseNotes = (notes?: string | ReleaseNoteItem[] | null): string => { if (!notes) return '' if (typeof notes === 'string') return notes if (!Array.isArray(notes)) return String(notes) From ca8c2702539adb7e9dc271736760c89df31ae660 Mon Sep 17 00:00:00 2001 From: yyhhyyyyyy Date: Wed, 24 Dec 2025 10:31:02 +0800 Subject: [PATCH 04/13] fix: action error --- src/main/presenter/upgradePresenter/index.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/main/presenter/upgradePresenter/index.ts b/src/main/presenter/upgradePresenter/index.ts index 902000667..3ccfa701b 100644 --- a/src/main/presenter/upgradePresenter/index.ts +++ b/src/main/presenter/upgradePresenter/index.ts @@ -20,8 +20,8 @@ const UPDATE_CHANNEL_STABLE = 'stable' const UPDATE_CHANNEL_BETA = 'beta' type ReleaseNoteItem = { - version?: string - note?: string + version?: string | null + note?: string | null } // 版本信息接口 From 72039907c8812b4a2b8d8105a6741edafc16e796 Mon Sep 17 00:00:00 2001 From: yyhhyyyyyy Date: Wed, 24 Dec 2025 10:40:26 +0800 Subject: [PATCH 05/13] fix: gh_token error --- .github/workflows/build.yml | 3 +++ 1 file changed, 3 insertions(+) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 962c0589f..811e57882 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -59,6 +59,7 @@ jobs: - name: Build Windows run: pnpm run build:win:${{ matrix.arch }} env: + ELECTRON_BUILDER_PUBLISH: 'never' VITE_GITHUB_CLIENT_ID: ${{ secrets.DC_GITHUB_CLIENT_ID }} VITE_GITHUB_CLIENT_SECRET: ${{ secrets.DC_GITHUB_CLIENT_SECRET }} VITE_GITHUB_REDIRECT_URI: ${{ secrets.DC_GITHUB_REDIRECT_URI }} @@ -113,6 +114,7 @@ jobs: - name: Build Linux run: pnpm run build:linux:${{ matrix.arch }} env: + ELECTRON_BUILDER_PUBLISH: 'never' VITE_GITHUB_CLIENT_ID: ${{ secrets.DC_GITHUB_CLIENT_ID }} VITE_GITHUB_CLIENT_SECRET: ${{ secrets.DC_GITHUB_CLIENT_SECRET }} VITE_GITHUB_REDIRECT_URI: ${{ secrets.DC_GITHUB_REDIRECT_URI }} @@ -169,6 +171,7 @@ jobs: run: pnpm run build:mac:${{ matrix.arch }} env: CSC_IDENTITY_AUTO_DISCOVERY: 'false' + ELECTRON_BUILDER_PUBLISH: 'never' VITE_GITHUB_CLIENT_ID: ${{ secrets.DC_GITHUB_CLIENT_ID }} VITE_GITHUB_CLIENT_SECRET: ${{ secrets.DC_GITHUB_CLIENT_SECRET }} VITE_GITHUB_REDIRECT_URI: ${{ secrets.DC_GITHUB_REDIRECT_URI }} From 6eae300035599b12328381faf3834d020d44cebc Mon Sep 17 00:00:00 2001 From: yyhhyyyyyy Date: Wed, 24 Dec 2025 10:57:35 +0800 Subject: [PATCH 06/13] fix: gh_token error --- .github/workflows/build.yml | 15 +++++++++------ 1 file changed, 9 insertions(+), 6 deletions(-) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 811e57882..87d73b4ec 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -57,9 +57,10 @@ jobs: run: pnpm run installRuntime:win:${{ matrix.arch }} - name: Build Windows - run: pnpm run build:win:${{ matrix.arch }} + run: | + pnpm run build + pnpm exec electron-builder --win --${{ matrix.arch }} --publish=never env: - ELECTRON_BUILDER_PUBLISH: 'never' VITE_GITHUB_CLIENT_ID: ${{ secrets.DC_GITHUB_CLIENT_ID }} VITE_GITHUB_CLIENT_SECRET: ${{ secrets.DC_GITHUB_CLIENT_SECRET }} VITE_GITHUB_REDIRECT_URI: ${{ secrets.DC_GITHUB_REDIRECT_URI }} @@ -112,9 +113,10 @@ jobs: # run: pnpm run installRuntime:linux:${{ matrix.arch }} - name: Build Linux - run: pnpm run build:linux:${{ matrix.arch }} + run: | + pnpm run build + pnpm exec electron-builder --linux --${{ matrix.arch }} --publish=never env: - ELECTRON_BUILDER_PUBLISH: 'never' VITE_GITHUB_CLIENT_ID: ${{ secrets.DC_GITHUB_CLIENT_ID }} VITE_GITHUB_CLIENT_SECRET: ${{ secrets.DC_GITHUB_CLIENT_SECRET }} VITE_GITHUB_REDIRECT_URI: ${{ secrets.DC_GITHUB_REDIRECT_URI }} @@ -168,10 +170,11 @@ jobs: run: pnpm run installRuntime:mac:${{ matrix.arch }} - name: Build Mac - run: pnpm run build:mac:${{ matrix.arch }} + run: | + pnpm run build + pnpm exec electron-builder --mac --${{ matrix.arch }} --publish=never env: CSC_IDENTITY_AUTO_DISCOVERY: 'false' - ELECTRON_BUILDER_PUBLISH: 'never' VITE_GITHUB_CLIENT_ID: ${{ secrets.DC_GITHUB_CLIENT_ID }} VITE_GITHUB_CLIENT_SECRET: ${{ secrets.DC_GITHUB_CLIENT_SECRET }} VITE_GITHUB_REDIRECT_URI: ${{ secrets.DC_GITHUB_REDIRECT_URI }} From d8b282c0b45edf739cec0896f4c02fcf66e1551a Mon Sep 17 00:00:00 2001 From: yyhhyyyyyy Date: Wed, 24 Dec 2025 11:16:48 +0800 Subject: [PATCH 07/13] fix: release.yml due some pack --- .github/workflows/release.yml | 285 +++++++++++++++++++++++++++------- 1 file changed, 232 insertions(+), 53 deletions(-) diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index 4481a1c68..502927e3f 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -1,67 +1,244 @@ -name: Create Release +name: Release on: workflow_dispatch: inputs: - workflow_id: - description: 'Build workflow run ID to use for artifacts' + tag: + description: 'Release tag (e.g. v0.5.5)' required: true type: string + push: + tags: + - v*.*.* + +permissions: + contents: write jobs: - create-release: + resolve-tag: runs-on: ubuntu-latest + outputs: + tag: ${{ steps.resolve.outputs.tag }} + steps: + - name: Resolve tag + id: resolve + shell: bash + run: | + if [ "${{ github.event_name }}" = "workflow_dispatch" ]; then + echo "tag=${{ github.event.inputs.tag }}" >> $GITHUB_OUTPUT + else + echo "tag=${GITHUB_REF#refs/tags/}" >> $GITHUB_OUTPUT + fi + + build-windows: + needs: resolve-tag + runs-on: windows-latest + strategy: + matrix: + arch: [x64] + include: + - arch: x64 + platform: win-x64 steps: - - name: Download artifacts from workflow - uses: dawidd6/action-download-artifact@v6 + - uses: actions/checkout@v4 with: - workflow_conclusion: success - run_id: ${{ github.event.inputs.workflow_id }} - path: artifacts + ref: ${{ needs.resolve-tag.outputs.tag }} - - name: List downloaded artifacts - run: find artifacts -type f | sort + - name: Setup Node.js + uses: actions/setup-node@v4 + with: + node-version: '22.13.1' + + - name: Setup pnpm + uses: pnpm/action-setup@v2 + with: + version: 10.12.1 + + - name: Install dependencies + run: pnpm install + + - name: Configure pnpm workspace for Windows ${{ matrix.arch }} + run: pnpm run install:sharp + env: + TARGET_OS: win32 + TARGET_ARCH: ${{ matrix.arch }} + + - name: Install dependencies + run: pnpm install + env: + npm_config_build_from_source: true + npm_config_platform: win32 + npm_config_arch: ${{ matrix.arch }} + + - name: Install Node Runtime + run: pnpm run installRuntime:win:${{ matrix.arch }} + + - name: Build Windows + run: | + pnpm run build + pnpm exec electron-builder --win --${{ matrix.arch }} --publish=never + env: + GH_TOKEN: ${{ secrets.GITHUB_TOKEN }} + VITE_GITHUB_CLIENT_ID: ${{ secrets.DC_GITHUB_CLIENT_ID }} + VITE_GITHUB_CLIENT_SECRET: ${{ secrets.DC_GITHUB_CLIENT_SECRET }} + VITE_GITHUB_REDIRECT_URI: ${{ secrets.DC_GITHUB_REDIRECT_URI }} + VITE_PROVIDER_DB_URL: ${{ secrets.CDN_PROVIDER_DB_URL }} - - name: Get build run info - id: build_run - uses: actions/github-script@v7 + - name: Upload artifacts + uses: actions/upload-artifact@v4 with: - script: | - const runId = Number('${{ github.event.inputs.workflow_id }}') - const { data } = await github.rest.actions.getWorkflowRun({ - owner: context.repo.owner, - repo: context.repo.repo, - run_id: runId - }) - core.setOutput('sha', data.head_sha) + name: deepchat-${{ matrix.platform }} + path: | + dist/* + !dist/win-unpacked + !dist/win-arm64-unpacked + + build-linux: + needs: resolve-tag + runs-on: ubuntu-22.04 + strategy: + matrix: + arch: [x64] + include: + - arch: x64 + platform: linux-x64 + steps: + - uses: actions/checkout@v4 + with: + ref: ${{ needs.resolve-tag.outputs.tag }} + + - name: Setup Node.js + uses: actions/setup-node@v4 + with: + node-version: '22.13.1' + + - name: Setup pnpm + uses: pnpm/action-setup@v2 + with: + version: 10.12.1 + + - name: Install dependencies + run: pnpm install + + - name: Configure pnpm workspace for Linux ${{ matrix.arch }} + run: pnpm run install:sharp + env: + TARGET_OS: linux + TARGET_ARCH: ${{ matrix.arch }} + + - name: Install dependencies + run: pnpm install + + - name: Build Linux + run: | + pnpm run build + pnpm exec electron-builder --linux --${{ matrix.arch }} --publish=never + env: + GH_TOKEN: ${{ secrets.GITHUB_TOKEN }} + VITE_GITHUB_CLIENT_ID: ${{ secrets.DC_GITHUB_CLIENT_ID }} + VITE_GITHUB_CLIENT_SECRET: ${{ secrets.DC_GITHUB_CLIENT_SECRET }} + VITE_GITHUB_REDIRECT_URI: ${{ secrets.DC_GITHUB_REDIRECT_URI }} + VITE_PROVIDER_DB_URL: ${{ secrets.CDN_PROVIDER_DB_URL }} + + - name: Upload artifacts + uses: actions/upload-artifact@v4 + with: + name: deepchat-${{ matrix.platform }} + path: | + dist/* + !dist/linux-unpacked + + build-mac: + needs: resolve-tag + runs-on: macos-15 + strategy: + matrix: + arch: [x64, arm64] + include: + - arch: x64 + platform: mac-x64 + - arch: arm64 + platform: mac-arm64 + steps: + - uses: actions/checkout@v4 + with: + ref: ${{ needs.resolve-tag.outputs.tag }} + + - name: Setup Node.js + uses: actions/setup-node@v4 + with: + node-version: '22.13.1' + + - name: Setup pnpm + uses: pnpm/action-setup@v2 + with: + version: 10.12.1 + + - name: Install dependencies + run: pnpm install + + - name: Configure pnpm workspace for macOS ${{ matrix.arch }} + run: pnpm run install:sharp + env: + TARGET_OS: darwin + TARGET_ARCH: ${{ matrix.arch }} + + - name: Install dependencies + run: pnpm install + + - name: Install Node Runtime + run: pnpm run installRuntime:mac:${{ matrix.arch }} + + - name: Build Mac + run: | + pnpm run build + pnpm exec electron-builder --mac --${{ matrix.arch }} --publish=never + env: + CSC_IDENTITY_AUTO_DISCOVERY: 'false' + GH_TOKEN: ${{ secrets.GITHUB_TOKEN }} + VITE_GITHUB_CLIENT_ID: ${{ secrets.DC_GITHUB_CLIENT_ID }} + VITE_GITHUB_CLIENT_SECRET: ${{ secrets.DC_GITHUB_CLIENT_SECRET }} + VITE_GITHUB_REDIRECT_URI: ${{ secrets.DC_GITHUB_REDIRECT_URI }} + NODE_OPTIONS: '--max-old-space-size=4096' + VITE_PROVIDER_DB_URL: ${{ secrets.CDN_PROVIDER_DB_URL }} + + - name: Upload artifacts + uses: actions/upload-artifact@v4 + with: + name: deepchat-${{ matrix.platform }} + path: | + dist/* + !dist/mac/* + !dist/mac-arm64/* + + release: + needs: + - resolve-tag + - build-windows + - build-linux + - build-mac + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v4 + with: + ref: ${{ needs.resolve-tag.outputs.tag }} + fetch-depth: 1 - name: Get version number id: get_version run: | - VERSION_FILE=$(find artifacts/deepchat-linux-x64 -name "DeepChat-*.tar.gz" | head -n 1) - if [ -n "$VERSION_FILE" ]; then - VERSION=$(echo "$VERSION_FILE" | grep -oE 'DeepChat-[0-9]+\.[0-9]+\.[0-9]+(-(beta|alpha)\.[0-9]+)?' | sed 's/DeepChat-//') - if [ -z "$VERSION" ]; then - echo "Error: Failed to parse version from $VERSION_FILE" - exit 1 - fi - if echo "$VERSION" | grep -qE '-(beta|alpha)\.'; then - echo "prerelease=true" >> $GITHUB_OUTPUT - else - echo "prerelease=false" >> $GITHUB_OUTPUT - fi - echo "version=$VERSION" >> $GITHUB_OUTPUT - echo "Found version: $VERSION" - else - echo "Error: DeepChat tar.gz file not found" + VERSION=$(node -p "require('./package.json').version") + TAG="${{ needs.resolve-tag.outputs.tag }}" + if [ "v$VERSION" != "$TAG" ]; then + echo "Error: tag $TAG does not match package.json version v$VERSION" exit 1 fi - - - name: Checkout build commit - uses: actions/checkout@v4 - with: - ref: ${{ steps.build_run.outputs.sha }} - fetch-depth: 1 + if echo "$VERSION" | grep -qE '-(beta|alpha)\.[0-9]+$'; then + echo "prerelease=true" >> $GITHUB_OUTPUT + else + echo "prerelease=false" >> $GITHUB_OUTPUT + fi + echo "version=$VERSION" >> $GITHUB_OUTPUT - name: Build release notes from CHANGELOG run: | @@ -86,6 +263,11 @@ jobs: exit 1 fi + - name: Download build artifacts + uses: actions/download-artifact@v4 + with: + path: artifacts + - name: Prepare release assets run: | mkdir -p release_assets @@ -99,13 +281,6 @@ jobs: cp artifacts/deepchat-win-x64/*.blockmap release_assets/ 2>/dev/null || true fi - # Process Windows arm64 artifacts - #if [ -d "artifacts/deepchat-win-arm64" ]; then - # cp artifacts/deepchat-win-arm64/*.exe release_assets/ 2>/dev/null || true - # cp artifacts/deepchat-win-arm64/*.msi release_assets/ 2>/dev/null || true - # cp artifacts/deepchat-win-arm64/*.zip release_assets/ 2>/dev/null || true - #fi - # Process Linux x64 artifacts if [ -d "artifacts/deepchat-linux-x64" ]; then cp artifacts/deepchat-linux-x64/*.AppImage release_assets/ 2>/dev/null || true @@ -160,18 +335,22 @@ jobs: merge_mac_yml latest-mac.yml merge_mac_yml beta-mac.yml + if [ -z "$(ls -A release_assets)" ]; then + echo "Error: No release assets found" + exit 1 + fi + ls -la release_assets/ - name: Create Draft Release uses: softprops/action-gh-release@v1 with: - tag_name: v${{ steps.get_version.outputs.version }} + tag_name: ${{ needs.resolve-tag.outputs.tag }} name: DeepChat V${{ steps.get_version.outputs.version }} draft: true prerelease: ${{ steps.get_version.outputs.prerelease == 'true' }} files: | release_assets/* body_path: release_notes.md - env: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} From 063d2671946e9723c338b96c5e1f13ce746f5949 Mon Sep 17 00:00:00 2001 From: yyhhyyyyyy Date: Wed, 24 Dec 2025 11:23:54 +0800 Subject: [PATCH 08/13] fix: realeas.yml workflow failed --- .github/workflows/release.yml | 83 ++++++++++++++++++++++++++++++----- 1 file changed, 72 insertions(+), 11 deletions(-) diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index 502927e3f..b18dd283b 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -19,16 +19,74 @@ jobs: runs-on: ubuntu-latest outputs: tag: ${{ steps.resolve.outputs.tag }} + sha: ${{ steps.resolve.outputs.sha }} steps: - name: Resolve tag id: resolve - shell: bash - run: | - if [ "${{ github.event_name }}" = "workflow_dispatch" ]; then - echo "tag=${{ github.event.inputs.tag }}" >> $GITHUB_OUTPUT - else - echo "tag=${GITHUB_REF#refs/tags/}" >> $GITHUB_OUTPUT - fi + uses: actions/github-script@v7 + with: + script: | + const isDispatch = context.eventName === 'workflow_dispatch' + const tag = isDispatch + ? context.payload.inputs?.tag + : context.ref.replace('refs/tags/', '') + if (!tag) { + core.setFailed('Tag is required') + return + } + + const owner = context.repo.owner + const repo = context.repo.repo + const refName = `tags/${tag}` + + const resolveTagSha = async (refData) => { + let sha = refData.object.sha + if (refData.object.type === 'tag') { + const tagObj = await github.rest.git.getTag({ + owner, + repo, + tag_sha: sha + }) + sha = tagObj.data.object.sha + } + return sha + } + + if (isDispatch) { + try { + const { data } = await github.rest.git.getRef({ + owner, + repo, + ref: refName + }) + const sha = await resolveTagSha(data) + core.setOutput('sha', sha) + } catch (error) { + const sha = context.sha + await github.rest.git.createRef({ + owner, + repo, + ref: `refs/${refName}`, + sha + }) + core.setOutput('sha', sha) + } + } else { + try { + const { data } = await github.rest.git.getRef({ + owner, + repo, + ref: refName + }) + const sha = await resolveTagSha(data) + core.setOutput('sha', sha) + } catch (error) { + core.setFailed(`Tag ${tag} not found`) + return + } + } + + core.setOutput('tag', tag) build-windows: needs: resolve-tag @@ -42,7 +100,8 @@ jobs: steps: - uses: actions/checkout@v4 with: - ref: ${{ needs.resolve-tag.outputs.tag }} + ref: ${{ needs.resolve-tag.outputs.sha }} + fetch-depth: 1 - name: Setup Node.js uses: actions/setup-node@v4 @@ -105,7 +164,8 @@ jobs: steps: - uses: actions/checkout@v4 with: - ref: ${{ needs.resolve-tag.outputs.tag }} + ref: ${{ needs.resolve-tag.outputs.sha }} + fetch-depth: 1 - name: Setup Node.js uses: actions/setup-node@v4 @@ -162,7 +222,8 @@ jobs: steps: - uses: actions/checkout@v4 with: - ref: ${{ needs.resolve-tag.outputs.tag }} + ref: ${{ needs.resolve-tag.outputs.sha }} + fetch-depth: 1 - name: Setup Node.js uses: actions/setup-node@v4 @@ -221,7 +282,7 @@ jobs: steps: - uses: actions/checkout@v4 with: - ref: ${{ needs.resolve-tag.outputs.tag }} + ref: ${{ needs.resolve-tag.outputs.sha }} fetch-depth: 1 - name: Get version number From 7ba7e85ed73ce6233845a0a75db1d5df11a18b53 Mon Sep 17 00:00:00 2001 From: yyhhyyyyyy Date: Wed, 24 Dec 2025 11:44:05 +0800 Subject: [PATCH 09/13] chore: 0.5.6-beta.1 for testing --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index dc2b828d9..dacadd5e2 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "DeepChat", - "version": "0.5.5", + "version": "0.5.6-beta.1", "description": "DeepChat,一个简单易用的AI客户端", "main": "./out/main/index.js", "author": "ThinkInAIXYZ", From c892d9e92411f7a00d9efa2e85facb5d1d571a6a Mon Sep 17 00:00:00 2001 From: yyhhyyyyyy Date: Wed, 24 Dec 2025 12:17:51 +0800 Subject: [PATCH 10/13] docs: update changelog --- CHANGELOG.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 120e96f8a..89d95e9c4 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,6 +1,6 @@ # Changelog -## v0.5.6-canary (2025-12-23) +## 0.5.6-beta.1 (2025-12-23) - Markdown 优化,修复列表元素异常 - 修复 Ollama 视觉模型图片格式 - Improved Markdown rendering, fixed list element issues From 783fa762ae2e247a43041a530f6bec886649f763 Mon Sep 17 00:00:00 2001 From: yyhhyyyyyy Date: Wed, 24 Dec 2025 12:29:46 +0800 Subject: [PATCH 11/13] docs: update changelog --- CHANGELOG.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 89d95e9c4..cc73e0d7c 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,6 +1,6 @@ # Changelog -## 0.5.6-beta.1 (2025-12-23) +## v0.5.6-beta.1 (2025-12-23) - Markdown 优化,修复列表元素异常 - 修复 Ollama 视觉模型图片格式 - Improved Markdown rendering, fixed list element issues From 9fe10c429d21d0b30cae3478f79e65f42c8535d6 Mon Sep 17 00:00:00 2001 From: yyhhyyyyyy Date: Wed, 24 Dec 2025 13:37:34 +0800 Subject: [PATCH 12/13] docs: update changelog --- .github/workflows/release.yml | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-) diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index b18dd283b..827655aac 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -309,16 +309,18 @@ jobs: echo "Error: CHANGELOG.md not found" exit 1 fi - HEADER_REGEX="^## v${VERSION} \\([0-9]{4}-[0-9]{2}-[0-9]{2}\\)$" - if ! grep -Eq "$HEADER_REGEX" "$CHANGELOG"; then + NORMALIZED_CHANGELOG="$(mktemp)" + perl -pe 's/\x{FF08}/(/g; s/\x{FF09}/)/g; s/\r$//' "$CHANGELOG" > "$NORMALIZED_CHANGELOG" + HEADER_REGEX="^##[[:space:]]+v${VERSION}[[:space:]]*\\([0-9]{4}-[0-9]{2}-[0-9]{2}\\)[[:space:]]*$" + if ! grep -Eq "$HEADER_REGEX" "$NORMALIZED_CHANGELOG"; then echo "Error: Changelog entry not found for v${VERSION}" exit 1 fi awk -v ver="v${VERSION}" ' - $0 ~ "^## " ver " \\(" { in_section = 1 } - in_section && $0 ~ "^## " && $0 !~ "^## " ver " \\(" { exit } + $0 ~ "^##[[:space:]]+" ver "[[:space:]]*\\(" { in_section = 1 } + in_section && $0 ~ "^##[[:space:]]+" && $0 !~ "^##[[:space:]]+" ver "[[:space:]]*\\(" { exit } in_section { print } - ' "$CHANGELOG" > release_notes.md + ' "$NORMALIZED_CHANGELOG" > release_notes.md if [ ! -s release_notes.md ]; then echo "Error: Release notes are empty for v${VERSION}" exit 1 From 4eef1a89aa33b0102195c111483eaabc80d84cb3 Mon Sep 17 00:00:00 2001 From: yyhhyyyyyy Date: Wed, 24 Dec 2025 14:54:50 +0800 Subject: [PATCH 13/13] feat(update): switch to GitHub releases auto-update --- .github/workflows/build.yml | 7 ++++++- .github/workflows/release.yml | 9 +++++++-- electron-builder.yml | 2 +- src/main/presenter/configPresenter/index.ts | 3 +-- src/main/presenter/upgradePresenter/index.ts | 5 ++--- src/renderer/settings/components/AboutUsSettings.vue | 2 +- src/renderer/src/i18n/da-DK/about.json | 2 +- src/renderer/src/i18n/en-US/about.json | 2 +- src/renderer/src/i18n/fa-IR/about.json | 2 +- src/renderer/src/i18n/fr-FR/about.json | 2 +- src/renderer/src/i18n/he-IL/about.json | 2 +- src/renderer/src/i18n/ja-JP/about.json | 2 +- src/renderer/src/i18n/ko-KR/about.json | 2 +- src/renderer/src/i18n/pt-BR/about.json | 2 +- src/renderer/src/i18n/ru-RU/about.json | 2 +- src/renderer/src/i18n/zh-CN/about.json | 2 +- src/renderer/src/i18n/zh-HK/about.json | 2 +- src/renderer/src/i18n/zh-TW/about.json | 2 +- 18 files changed, 30 insertions(+), 22 deletions(-) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 87d73b4ec..ba05e9cfe 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -174,7 +174,12 @@ jobs: pnpm run build pnpm exec electron-builder --mac --${{ matrix.arch }} --publish=never env: - CSC_IDENTITY_AUTO_DISCOVERY: 'false' + CSC_LINK: ${{ secrets.DEEPCHAT_CSC_LINK }} + CSC_KEY_PASSWORD: ${{ secrets.DEEPCHAT_CSC_KEY_PASS }} + DEEPCHAT_APPLE_NOTARY_USERNAME: ${{ secrets.DEEPCHAT_APPLE_NOTARY_USERNAME }} + DEEPCHAT_APPLE_NOTARY_TEAM_ID: ${{ secrets.DEEPCHAT_APPLE_NOTARY_TEAM_ID }} + DEEPCHAT_APPLE_NOTARY_PASSWORD: ${{ secrets.DEEPCHAT_APPLE_NOTARY_PASSWORD }} + build_for_release: '2' VITE_GITHUB_CLIENT_ID: ${{ secrets.DC_GITHUB_CLIENT_ID }} VITE_GITHUB_CLIENT_SECRET: ${{ secrets.DC_GITHUB_CLIENT_SECRET }} VITE_GITHUB_REDIRECT_URI: ${{ secrets.DC_GITHUB_REDIRECT_URI }} diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index 827655aac..8065fdda9 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -4,7 +4,7 @@ on: workflow_dispatch: inputs: tag: - description: 'Release tag (e.g. v0.5.5)' + description: 'Release tag (e.g. v0.5.5 v0.5.6-beta.1)' required: true type: string push: @@ -255,7 +255,12 @@ jobs: pnpm run build pnpm exec electron-builder --mac --${{ matrix.arch }} --publish=never env: - CSC_IDENTITY_AUTO_DISCOVERY: 'false' + CSC_LINK: ${{ secrets.DEEPCHAT_CSC_LINK }} + CSC_KEY_PASSWORD: ${{ secrets.DEEPCHAT_CSC_KEY_PASS }} + DEEPCHAT_APPLE_NOTARY_USERNAME: ${{ secrets.DEEPCHAT_APPLE_NOTARY_USERNAME }} + DEEPCHAT_APPLE_NOTARY_TEAM_ID: ${{ secrets.DEEPCHAT_APPLE_NOTARY_TEAM_ID }} + DEEPCHAT_APPLE_NOTARY_PASSWORD: ${{ secrets.DEEPCHAT_APPLE_NOTARY_PASSWORD }} + build_for_release: '2' GH_TOKEN: ${{ secrets.GITHUB_TOKEN }} VITE_GITHUB_CLIENT_ID: ${{ secrets.DC_GITHUB_CLIENT_ID }} VITE_GITHUB_CLIENT_SECRET: ${{ secrets.DC_GITHUB_CLIENT_SECRET }} diff --git a/electron-builder.yml b/electron-builder.yml index acb40ec6f..3b2ace778 100644 --- a/electron-builder.yml +++ b/electron-builder.yml @@ -97,5 +97,5 @@ linux: npmRebuild: true publish: provider: github - owner: yyhhyyyyyy + owner: ThinkInAIXYZ repo: deepchat diff --git a/src/main/presenter/configPresenter/index.ts b/src/main/presenter/configPresenter/index.ts index 2b249348e..25b329a98 100644 --- a/src/main/presenter/configPresenter/index.ts +++ b/src/main/presenter/configPresenter/index.ts @@ -1476,8 +1476,7 @@ export class ConfigPresenter implements IConfigPresenter { // 获取更新渠道 getUpdateChannel(): string { const raw = this.getSetting('updateChannel') || 'stable' - const normalized = raw === 'canary' ? 'beta' : raw - const channel = normalized === 'beta' || normalized === 'stable' ? normalized : 'stable' + const channel = raw === 'stable' || raw === 'beta' ? raw : 'beta' if (channel !== raw) { this.setSetting('updateChannel', channel) } diff --git a/src/main/presenter/upgradePresenter/index.ts b/src/main/presenter/upgradePresenter/index.ts index 3ccfa701b..737dc5a0e 100644 --- a/src/main/presenter/upgradePresenter/index.ts +++ b/src/main/presenter/upgradePresenter/index.ts @@ -14,7 +14,7 @@ import path from 'path' const { autoUpdater } = electronUpdater -const GITHUB_OWNER = 'yyhhyyyyyy' +const GITHUB_OWNER = 'ThinkInAIXYZ' const GITHUB_REPO = 'deepchat' const UPDATE_CHANNEL_STABLE = 'stable' const UPDATE_CHANNEL_BETA = 'beta' @@ -34,8 +34,7 @@ interface VersionInfo { } const normalizeUpdateChannel = (channel?: string): 'stable' | 'beta' => { - if (channel === UPDATE_CHANNEL_BETA || channel === 'canary') return UPDATE_CHANNEL_BETA - return UPDATE_CHANNEL_STABLE + return channel === UPDATE_CHANNEL_BETA ? UPDATE_CHANNEL_BETA : UPDATE_CHANNEL_STABLE } const formatTagVersion = (version: string): string => { diff --git a/src/renderer/settings/components/AboutUsSettings.vue b/src/renderer/settings/components/AboutUsSettings.vue index 1d3a85d10..f88225443 100644 --- a/src/renderer/settings/components/AboutUsSettings.vue +++ b/src/renderer/settings/components/AboutUsSettings.vue @@ -58,7 +58,7 @@ {{ t('about.stableChannel') }} - {{ t('about.canaryChannel') }} + {{ t('about.betaChannel') }} diff --git a/src/renderer/src/i18n/da-DK/about.json b/src/renderer/src/i18n/da-DK/about.json index 431240343..b035590f7 100644 --- a/src/renderer/src/i18n/da-DK/about.json +++ b/src/renderer/src/i18n/da-DK/about.json @@ -1,5 +1,5 @@ { - "canaryChannel": "Beta", + "betaChannel": "Beta", "checkUpdateButton": "Tjek for opdateringer", "description": "DeepChat er en tværplatform AI-klient, der har til formål at gøre det nemmere for flere mennesker at bruge AI.", "deviceInfo": { diff --git a/src/renderer/src/i18n/en-US/about.json b/src/renderer/src/i18n/en-US/about.json index e58c7ea0c..3a2ebc9aa 100644 --- a/src/renderer/src/i18n/en-US/about.json +++ b/src/renderer/src/i18n/en-US/about.json @@ -15,5 +15,5 @@ "checkUpdateButton": "Check for Updates", "updateChannel": "Update Channel", "stableChannel": "Stable", - "canaryChannel": "Beta" + "betaChannel": "Beta" } diff --git a/src/renderer/src/i18n/fa-IR/about.json b/src/renderer/src/i18n/fa-IR/about.json index ee57127a1..b3a7c107e 100644 --- a/src/renderer/src/i18n/fa-IR/about.json +++ b/src/renderer/src/i18n/fa-IR/about.json @@ -15,5 +15,5 @@ "checkUpdateButton": "بررسی به‌روزرسانی", "updateChannel": "کانال به‌روزرسانی", "stableChannel": "پایدار", - "canaryChannel": "Beta" + "betaChannel": "Beta" } diff --git a/src/renderer/src/i18n/fr-FR/about.json b/src/renderer/src/i18n/fr-FR/about.json index 6ecca847c..d77768bb0 100644 --- a/src/renderer/src/i18n/fr-FR/about.json +++ b/src/renderer/src/i18n/fr-FR/about.json @@ -15,5 +15,5 @@ "checkUpdateButton": "Vérifier les mises à jour", "updateChannel": "Canal de mise à jour", "stableChannel": "Stable", - "canaryChannel": "Beta" + "betaChannel": "Beta" } diff --git a/src/renderer/src/i18n/he-IL/about.json b/src/renderer/src/i18n/he-IL/about.json index fd9c2aa0d..2626806ca 100644 --- a/src/renderer/src/i18n/he-IL/about.json +++ b/src/renderer/src/i18n/he-IL/about.json @@ -15,5 +15,5 @@ "checkUpdateButton": "בדוק עדכונים", "updateChannel": "ערוץ עדכון", "stableChannel": "יציב (Stable)", - "canaryChannel": "Beta" + "betaChannel": "Beta" } diff --git a/src/renderer/src/i18n/ja-JP/about.json b/src/renderer/src/i18n/ja-JP/about.json index ff259dcda..da646cdc0 100644 --- a/src/renderer/src/i18n/ja-JP/about.json +++ b/src/renderer/src/i18n/ja-JP/about.json @@ -7,7 +7,7 @@ "checkUpdateButton": "アップデートを確認", "updateChannel": "アップデートチャンネル", "stableChannel": "安定版", - "canaryChannel": "Beta", + "betaChannel": "Beta", "deviceInfo": { "title": "デバイス情報", "platform": "プラットフォーム", diff --git a/src/renderer/src/i18n/ko-KR/about.json b/src/renderer/src/i18n/ko-KR/about.json index 1be72f7b9..ef1666753 100644 --- a/src/renderer/src/i18n/ko-KR/about.json +++ b/src/renderer/src/i18n/ko-KR/about.json @@ -7,7 +7,7 @@ "checkUpdateButton": "업데이트 확인", "updateChannel": "업데이트 채널", "stableChannel": "안정 버전", - "canaryChannel": "Beta", + "betaChannel": "Beta", "deviceInfo": { "title": "장치 정보", "platform": "플랫폼", diff --git a/src/renderer/src/i18n/pt-BR/about.json b/src/renderer/src/i18n/pt-BR/about.json index ce238f559..433bfc7a2 100644 --- a/src/renderer/src/i18n/pt-BR/about.json +++ b/src/renderer/src/i18n/pt-BR/about.json @@ -15,5 +15,5 @@ "checkUpdateButton": "Verificar Atualizações", "updateChannel": "Canal de Atualização", "stableChannel": "Estável", - "canaryChannel": "Beta" + "betaChannel": "Beta" } diff --git a/src/renderer/src/i18n/ru-RU/about.json b/src/renderer/src/i18n/ru-RU/about.json index 3059f47e5..ac4af0d6d 100644 --- a/src/renderer/src/i18n/ru-RU/about.json +++ b/src/renderer/src/i18n/ru-RU/about.json @@ -7,7 +7,7 @@ "checkUpdateButton": "Проверить обновления", "updateChannel": "Канал обновлений", "stableChannel": "Стабильный", - "canaryChannel": "Beta", + "betaChannel": "Beta", "deviceInfo": { "title": "Сведения об устройстве", "platform": "Платформа", diff --git a/src/renderer/src/i18n/zh-CN/about.json b/src/renderer/src/i18n/zh-CN/about.json index d4c7f8d64..092dc8273 100644 --- a/src/renderer/src/i18n/zh-CN/about.json +++ b/src/renderer/src/i18n/zh-CN/about.json @@ -7,7 +7,7 @@ "checkUpdateButton": "检查更新", "updateChannel": "更新渠道", "stableChannel": "正式版", - "canaryChannel": "Beta", + "betaChannel": "内测版", "deviceInfo": { "title": "设备信息", "platform": "平台", diff --git a/src/renderer/src/i18n/zh-HK/about.json b/src/renderer/src/i18n/zh-HK/about.json index cecb87687..317079238 100644 --- a/src/renderer/src/i18n/zh-HK/about.json +++ b/src/renderer/src/i18n/zh-HK/about.json @@ -7,7 +7,7 @@ "checkUpdateButton": "檢查更新", "updateChannel": "更新頻道", "stableChannel": "正式版", - "canaryChannel": "Beta", + "betaChannel": "内测版", "deviceInfo": { "title": "設備信息", "platform": "平台", diff --git a/src/renderer/src/i18n/zh-TW/about.json b/src/renderer/src/i18n/zh-TW/about.json index 6d35136f9..515c09a40 100644 --- a/src/renderer/src/i18n/zh-TW/about.json +++ b/src/renderer/src/i18n/zh-TW/about.json @@ -7,7 +7,7 @@ "checkUpdateButton": "檢查更新", "updateChannel": "更新頻道", "stableChannel": "正式版", - "canaryChannel": "Beta", + "betaChannel": "内测版", "deviceInfo": { "title": "裝置資訊", "platform": "平台",