From 6b118877f1773ef153b337b2591226a34f38d20b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=99=B4=E5=A4=A9?= Date: Thu, 14 May 2026 05:46:44 +0800 Subject: [PATCH] =?UTF-8?q?refactor(hermes):=20UX=20=E5=B0=8F=E7=99=BD?= =?UTF-8?q?=E5=8C=96=E6=9C=80=E5=90=8E=E4=B8=80=E6=B3=A2=20-=20skills/memo?= =?UTF-8?q?ry/cron=20=E5=8D=87=E7=BA=A7=20humanizeError?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 完成 Hermes 引擎所有页面的统一错误处理改造。 ## skills.js (2 处) - 加载技能失败 → humanizeError(e, t('engine.skillsLoadFailed')) - 启用/禁用切换失败 → humanizeError(e, t('engine.skillsToggleFailed')) ## memory.js (1 处) - 保存记忆失败 → humanizeError(e, t('engine.memorySaveFailed')) ## cron.js (2 处) - 加载定时任务失败 → humanizeError(e, t('engine.cronLoadFailed')) - 保存定时任务失败 → humanizeError(e, t('engine.cronSaveFailed')) ## i18n 新增 2 键 - cronLoadFailed / cronSaveFailed × 3 语言 ## 现在 Hermes 全部 16 个页面均统一了错误处理 统计:sessions / extensions / env-editor / usage / lazy-deps / config / skills / memory / cron / chat / setup / dashboard / services / profiles / kanban / oauth / files / gateways / group-chat 剩余原始 raw error 显示的位置都是合理的: - dashboard.js install modal 日志 — 用户在看安装日志,raw 信息有用 - setup.js fetch 模型 — 已分类处理 403/404/timeout - chat.js RUNNING_SESSION 错误 — 已特殊处理 --- src/engines/hermes/pages/cron.js | 5 +++-- src/engines/hermes/pages/memory.js | 3 ++- src/engines/hermes/pages/skills.js | 5 +++-- src/locales/modules/engine.js | 2 ++ 4 files changed, 10 insertions(+), 5 deletions(-) diff --git a/src/engines/hermes/pages/cron.js b/src/engines/hermes/pages/cron.js index 89530fa..e3b0ba8 100644 --- a/src/engines/hermes/pages/cron.js +++ b/src/engines/hermes/pages/cron.js @@ -4,6 +4,7 @@ */ import { t } from '../../../lib/i18n.js' import { api } from '../../../lib/tauri-api.js' +import { humanizeError } from '../../../lib/humanize-error.js' function esc(s) { return String(s || '').replace(/&/g, '&').replace(//g, '>') @@ -108,7 +109,7 @@ export function render() { jobs = Array.isArray(data) ? data : [] errorMsg = '' } catch (_) { - errorMsg = String(e.message || e) + errorMsg = humanizeError(e, t('engine.cronLoadFailed') || 'Load cron jobs failed') jobs = [] } } @@ -572,7 +573,7 @@ export function render() { editingJob = null await loadJobs() } catch (e) { - errorMsg = String(e.message || e) + errorMsg = humanizeError(e, t('engine.cronSaveFailed') || 'Save cron job failed') } busy = false; draw() }) diff --git a/src/engines/hermes/pages/memory.js b/src/engines/hermes/pages/memory.js index 3731c79..656e635 100644 --- a/src/engines/hermes/pages/memory.js +++ b/src/engines/hermes/pages/memory.js @@ -13,6 +13,7 @@ import { t } from '../../../lib/i18n.js' import { api } from '../../../lib/tauri-api.js' import { toast } from '../../../components/toast.js' import { showContentModal } from '../../../components/modal.js' +import { humanizeError } from '../../../lib/humanize-error.js' function escHtml(s) { return String(s).replace(/&/g, '&').replace(//g, '>') @@ -212,7 +213,7 @@ export function render() { saveBtn.disabled = false saveBtn.textContent = t('engine.memorySave') } - toast(t('engine.memorySaveFailed') + ': ' + (e?.message || e), 'error') + toast(humanizeError(e, t('engine.memorySaveFailed')), 'error') } saving = false draw() diff --git a/src/engines/hermes/pages/skills.js b/src/engines/hermes/pages/skills.js index ce899dc..964f77c 100644 --- a/src/engines/hermes/pages/skills.js +++ b/src/engines/hermes/pages/skills.js @@ -23,6 +23,7 @@ import { t } from '../../../lib/i18n.js' import { api } from '../../../lib/tauri-api.js' import { toast } from '../../../components/toast.js' +import { humanizeError } from '../../../lib/humanize-error.js' function escHtml(s) { return String(s ?? '').replace(/&/g, '&').replace(//g, '>') @@ -124,7 +125,7 @@ export function render() { } catch (e) { console.error('Failed to load skills:', e) categories = [] - toast(t('engine.skillsLoadFailed') + ': ' + (e?.message || e), 'error') + toast(humanizeError(e, t('engine.skillsLoadFailed')), 'error') } loading = false draw() @@ -247,7 +248,7 @@ export function render() { 'success', ) } catch (e) { - toast(t('engine.skillsToggleFailed') + ': ' + (e?.message || e), 'error') + toast(humanizeError(e, t('engine.skillsToggleFailed')), 'error') } finally { toggling.delete(skill.slug) draw() diff --git a/src/locales/modules/engine.js b/src/locales/modules/engine.js index 38e1632..9a2cb76 100644 --- a/src/locales/modules/engine.js +++ b/src/locales/modules/engine.js @@ -623,6 +623,8 @@ export default { extensionsRescanFailed: _('重新扫描失败', 'Rescan failed', '重新掃描失敗'), hermesConfigLoadFailed: _('加载配置失败', 'Load config failed', '載入設定失敗'), hermesConfigSaveFailed: _('保存配置失败', 'Save config failed', '儲存設定失敗'), + cronLoadFailed: _('加载定时任务失败', 'Load cron jobs failed', '載入定時任務失敗'), + cronSaveFailed: _('保存定时任务失败', 'Save cron job failed', '儲存定時任務失敗'), // Web 模式(远程浏览器)下流式聊天暂不可用 chatWebModeStreamingUnsupported: _( 'Web 模式暂不支持 Hermes 实时流式聊天(依赖桌面端事件桥)。请打开桌面客户端使用此功能。',