diff --git a/src/locales/modules/about.js b/src/locales/modules/about.js index 4963667..80b49d5 100644 --- a/src/locales/modules/about.js +++ b/src/locales/modules/about.js @@ -31,6 +31,11 @@ export default { hermesUninstallCleanConfig: _('是否同时清除配置文件?(选「取消」保留配置)', 'Also remove config files? (Cancel to keep)', '是否同時清除配置文件?(選「取消」保留配置)'), hermesUninstallOk: _('Hermes Agent 已卸载', 'Hermes Agent uninstalled', 'Hermes Agent 已卸載'), hermesUninstallFail: _('卸载失败: {error}', 'Uninstall failed: {error}', '卸載失敗: {error}'), + hermesConfigFile: _('配置文件', 'Config file', '配置文件', '設定ファイル', '설정 파일'), + hermesGoSetup: _('前往配置向导', 'Go to Setup Wizard', '前往配置嚮導'), + hermesUpgradeConfirm: _('确定要升级 Hermes Agent 吗?将从 GitHub 重新安装最新版本。', 'Are you sure you want to upgrade Hermes Agent? This will reinstall the latest version from GitHub.', '確定要升級 Hermes Agent 嗎?將從 GitHub 重新安裝最新版本。'), + hermesUninstallCleanConfigHint: _('同时清除配置文件和虚拟环境', 'Also removing config files and virtual environment', '同時清除配置文件和虛擬環境'), + notSet: _('未设置', 'Not set', '未設置', '未設定', '미설정'), aheadOfRecommended: _('当前版本高于推荐稳定版: {ver}', 'Current version is ahead of recommended stable: {ver}', '目前版本高於推薦穩定版: {ver}'), rollbackToRecommended: _('回退到推荐版', 'Rollback to recommended', '回退到推薦版'), recommendedStable: _('推荐稳定版: {ver}', 'Recommended stable: {ver}', '推薦穩定版: {ver}', '推奨安定版: {ver}', '권장 안정 버전: {ver}'), diff --git a/src/pages/about.js b/src/pages/about.js index c2eb086..650b16c 100644 --- a/src/pages/about.js +++ b/src/pages/about.js @@ -4,7 +4,7 @@ */ import { api } from '../lib/tauri-api.js' import { toast } from '../components/toast.js' -import { showUpgradeModal, showConfirm } from '../components/modal.js' +import { showUpgradeModal, showConfirm, showContentModal } from '../components/modal.js' import { setUpgrading } from '../lib/app-state.js' import { icon, statusIcon } from '../lib/icons.js' import { t, getLang } from '../lib/i18n.js' @@ -107,7 +107,7 @@ async function loadHermesData(page) { ${model ? `${t('engine.dashModel')}: ${esc(model)}` : ''} ${!installed ? `${t('about.hermesSetup')}` : ''} ${installed ? ` - ${t('about.hermesConfig')} + ` : ''} @@ -122,45 +122,102 @@ async function loadHermesData(page) { // Hermes 管理按钮事件 if (installed) { - const upgradeBtn = cards.querySelector('#btn-hermes-upgrade') - const uninstallBtn = cards.querySelector('#btn-hermes-uninstall') - - if (upgradeBtn) { - upgradeBtn.onclick = async () => { - upgradeBtn.disabled = true - upgradeBtn.textContent = t('about.upgrading') - try { - const ver = await api.updateHermes() - toast(t('about.hermesUpgradeOk', { version: ver || '' }), 'success') - loadHermesData(page) - } catch (e) { - toast(t('about.hermesUpgradeFail', { error: e.message || e }), 'error') - } finally { - upgradeBtn.disabled = false - upgradeBtn.textContent = t('about.hermesUpgrade') - } + // --- 配置模态框 --- + cards.querySelector('#btn-hermes-config')?.addEventListener('click', async () => { + try { + const cfg = await api.hermesReadConfig() + const maskedKey = cfg.api_key ? cfg.api_key.slice(0, 6) + '••••' + cfg.api_key.slice(-4) : t('about.notSet') + const overlay = showContentModal({ + title: `Hermes Agent ${t('about.hermesConfig')}`, + width: 480, + content: ` +
+
${t('engine.configProvider')}:${esc(cfg.provider || '-')}
+
Base URL:${esc(cfg.base_url || '-')}
+
API Key:${esc(maskedKey)}
+
${t('engine.configModel')}:${esc(cfg.model_raw || cfg.model || '-')}
+
${t('about.hermesConfigFile')}:${cfg.config_exists ? '✓' : '✗'}
+
+ `, + buttons: [ + { label: t('about.hermesGoSetup'), className: 'btn btn-primary btn-sm', id: 'btn-goto-setup' }, + ], + }) + overlay.querySelector('#btn-goto-setup')?.addEventListener('click', () => { + overlay.close() + window.location.hash = '#/h/setup' + }) + } catch (e) { + toast(t('common.loadFailed') + ': ' + (e.message || e), 'error') } - } + }) - if (uninstallBtn) { - uninstallBtn.onclick = async () => { - const confirmed = confirm(t('about.hermesUninstallConfirm')) - if (!confirmed) return - const cleanConfig = confirm(t('about.hermesUninstallCleanConfig')) - uninstallBtn.disabled = true - uninstallBtn.textContent = t('about.uninstalling') - try { - await api.uninstallHermes(cleanConfig) - toast(t('about.hermesUninstallOk'), 'success') - loadHermesData(page) - } catch (e) { - toast(t('about.hermesUninstallFail', { error: e.message || e }), 'error') - } finally { - uninstallBtn.disabled = false - uninstallBtn.textContent = t('about.hermesUninstall') - } + // --- 升级模态框(带实时日志) --- + cards.querySelector('#btn-hermes-upgrade')?.addEventListener('click', async () => { + const confirmed = await showConfirm(t('about.hermesUpgradeConfirm')) + if (!confirmed) return + + const modal = showUpgradeModal(t('about.hermesUpgrade') + ' Hermes Agent') + modal.setProgressLabels({ + preparing: t('about.upgrading'), + downloading: t('about.upgrading'), + installing: t('about.upgrading'), + done: t('about.hermesUpgradeOk', { version: '' }), + }) + modal.setProgress(10) + + let unlisten = null + try { + const { listen } = await import('@tauri-apps/api/event') + unlisten = await listen('hermes-install-log', (e) => { + modal.appendLog(String(e.payload)) + }) + } catch (_) {} + + modal.setProgress(20) + try { + const ver = await api.updateHermes() + modal.setProgress(100) + modal.setDone(t('about.hermesUpgradeOk', { version: ver || '' })) + modal.onClose(() => loadHermesData(page)) + } catch (e) { + modal.appendLog(`❌ ${e.message || e}`) + modal.setError(t('about.hermesUpgradeFail', { error: e.message || e })) + modal.onClose(() => loadHermesData(page)) + } finally { + if (unlisten) unlisten() } - } + }) + + // --- 卸载模态框(确认 + 实时日志) --- + cards.querySelector('#btn-hermes-uninstall')?.addEventListener('click', async () => { + const confirmed = await showConfirm(t('about.hermesUninstallConfirm')) + if (!confirmed) return + const cleanConfig = await showConfirm(t('about.hermesUninstallCleanConfig')) + + const modal = showUpgradeModal(t('about.hermesUninstall') + ' Hermes Agent') + modal.setProgressLabels({ + preparing: t('about.uninstalling'), + downloading: t('about.uninstalling'), + installing: t('about.uninstalling'), + done: t('about.hermesUninstallOk'), + }) + modal.appendLog('🗑️ ' + t('about.uninstalling')) + if (cleanConfig) modal.appendLog('📁 ' + t('about.hermesUninstallCleanConfigHint')) + modal.setProgress(30) + + try { + const result = await api.uninstallHermes(cleanConfig) + modal.appendLog('✅ ' + (result || t('about.hermesUninstallOk'))) + modal.setProgress(100) + modal.setDone(t('about.hermesUninstallOk')) + modal.onClose(() => loadHermesData(page)) + } catch (e) { + modal.appendLog(`❌ ${e.message || e}`) + modal.setError(t('about.hermesUninstallFail', { error: e.message || e })) + modal.onClose(() => loadHermesData(page)) + } + }) } } catch { cards.innerHTML = `
${t('common.loadFailed')}
`