refactor(hermes): UX 小白化最后一波 - skills/memory/cron 升级 humanizeError

完成 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 错误 — 已特殊处理
This commit is contained in:
晴天
2026-05-14 05:46:44 +08:00
parent dcac1d6d21
commit 6b118877f1
4 changed files with 10 additions and 5 deletions

View File

@@ -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, '&amp;').replace(/</g, '&lt;').replace(/>/g, '&gt;')
@@ -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()
})

View File

@@ -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, '&amp;').replace(/</g, '&lt;').replace(/>/g, '&gt;')
@@ -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()

View File

@@ -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, '&amp;').replace(/</g, '&lt;').replace(/>/g, '&gt;')
@@ -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()

View File

@@ -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 实时流式聊天(依赖桌面端事件桥)。请打开桌面客户端使用此功能。',