Release v0.51.325 — Release KO (in-app Help tab, #3518) (#3806)

#3518 (@rodboev): in-app Help tab in Settings (docs + GitHub issues links), redesigned as polished icon-led cards. UX-approved by Nathan. Full suite 8242, CI 11/11. Co-authored-by: rodboev <rodboev@users.noreply.github.com>
This commit is contained in:
nesquena-hermes authored and GitHub committed 2026-06-07 18:59:01 -07:00
1 parent 0f4931d81b
commit cadbe1e5d3
6 files changed
+211 -3

No files matched your search

+5
View File
@@ -3,6 +3,11 @@
## [Unreleased]
## [v0.51.325] — 2026-06-08 — Release KO (in-app Help tab)
### Added
- **A Help tab in Settings** with quick links to the documentation (get-hermes.ai) and the GitHub issues page, presented as icon-led resource cards. Translated across all 13 locales. (#3518, @rodboev)
## [v0.51.324] — 2026-06-07 — Release KN (i18n — translate settings + gateway-status labels)
### Added
+104
View File
@@ -575,6 +575,14 @@ const LOCALES = {
plugins_provider_no_hooks: 'Provider plugin — no agent-visibility hooks',
plugins_load_failed: 'Failed to load plugins: ',
settings_tab_system: 'System',
settings_tab_help: 'Help',
settings_help_meta: 'Resources and support for Hermes WebUI.',
settings_help_docs_label: 'Documentation',
settings_help_docs_desc: 'Guides, configuration reference, and the full Hermes WebUI README.',
settings_help_docs_link: 'Open Documentation',
settings_help_issue_label: 'Having an issue?',
settings_help_issue_desc: 'Search existing reports or open a new one on GitHub.',
settings_help_issue_link: 'Open GitHub Issues',
settings_title: 'Settings',
settings_save_btn: 'Save Settings',
settings_label_model: 'Default Model',
@@ -1940,6 +1948,14 @@ const LOCALES = {
plugins_provider_no_hooks: 'Provider plugin — no agent-visibility hooks', // TODO: translate
plugins_load_failed: 'Failed to load plugins: ', // TODO: translate
settings_tab_system: 'Sistema',
settings_tab_help: 'Help',
settings_help_meta: 'Resources and support for Hermes WebUI.',
settings_help_docs_label: 'Documentation',
settings_help_docs_desc: 'Guides, configuration reference, and the full Hermes WebUI README.',
settings_help_docs_link: 'Open Documentation',
settings_help_issue_label: 'Having an issue?',
settings_help_issue_desc: 'Search existing reports or open a new one on GitHub.',
settings_help_issue_link: 'Open GitHub Issues',
settings_title: 'Impostazioni',
settings_save_btn: 'Salva Impostazioni',
settings_label_model: 'Modello Predefinito',
@@ -3297,6 +3313,14 @@ const LOCALES = {
plugins_provider_no_hooks: 'プロバイダープラグイン — エージェント可視フックなし',
plugins_load_failed: 'プラグインの読み込みに失敗しました: ',
settings_tab_system: 'システム',
settings_tab_help: 'Help',
settings_help_meta: 'Resources and support for Hermes WebUI.',
settings_help_docs_label: 'Documentation',
settings_help_docs_desc: 'Guides, configuration reference, and the full Hermes WebUI README.',
settings_help_docs_link: 'Open Documentation',
settings_help_issue_label: 'Having an issue?',
settings_help_issue_desc: 'Search existing reports or open a new one on GitHub.',
settings_help_issue_link: 'Open GitHub Issues',
settings_title: '設定',
settings_save_btn: '設定を保存',
settings_label_model: 'デフォルトモデル',
@@ -5248,6 +5272,14 @@ const LOCALES = {
plugins_provider_no_hooks: 'Provider plugin — no agent-visibility hooks', // TODO: translate
plugins_load_failed: 'Failed to load plugins: ', // TODO: translate
settings_tab_system: 'System',
settings_tab_help: 'Help',
settings_help_meta: 'Resources and support for Hermes WebUI.',
settings_help_docs_label: 'Documentation',
settings_help_docs_desc: 'Guides, configuration reference, and the full Hermes WebUI README.',
settings_help_docs_link: 'Open Documentation',
settings_help_issue_label: 'Having an issue?',
settings_help_issue_desc: 'Search existing reports or open a new one on GitHub.',
settings_help_issue_link: 'Open GitHub Issues',
status_updated: 'Updated',
status_ephemeral: 'Ephemeral snapshot — not saved to transcript history.',
status_no_tokens: 'No token data',
@@ -6530,6 +6562,14 @@ const LOCALES = {
plugins_provider_no_hooks: 'Provider plugin — no agent-visibility hooks', // TODO: translate
plugins_load_failed: 'Failed to load plugins: ', // TODO: translate
settings_tab_system: 'System',
settings_tab_help: 'Help',
settings_help_meta: 'Resources and support for Hermes WebUI.',
settings_help_docs_label: 'Documentation',
settings_help_docs_desc: 'Guides, configuration reference, and the full Hermes WebUI README.',
settings_help_docs_link: 'Open Documentation',
settings_help_issue_label: 'Having an issue?',
settings_help_issue_desc: 'Search existing reports or open a new one on GitHub.',
settings_help_issue_link: 'Open GitHub Issues',
status_updated: 'Updated',
status_ephemeral: 'Ephemeral snapshot — not saved to transcript history.',
status_no_tokens: 'No token data',
@@ -7528,6 +7568,14 @@ const LOCALES = {
plugins_provider_no_hooks: 'Provider plugin — no agent-visibility hooks', // TODO: translate
plugins_load_failed: 'Failed to load plugins: ', // TODO: translate
settings_tab_system: 'System',
settings_tab_help: 'Help',
settings_help_meta: 'Resources and support for Hermes WebUI.',
settings_help_docs_label: 'Documentation',
settings_help_docs_desc: 'Guides, configuration reference, and the full Hermes WebUI README.',
settings_help_docs_link: 'Open Documentation',
settings_help_issue_label: 'Having an issue?',
settings_help_issue_desc: 'Search existing reports or open a new one on GitHub.',
settings_help_issue_link: 'Open GitHub Issues',
status_updated: 'Updated',
status_ephemeral: 'Ephemeral snapshot — not saved to transcript history.',
status_no_tokens: 'No token data',
@@ -9116,6 +9164,14 @@ const LOCALES = {
settings_tab_preferences: '偏好',
settings_tab_plugins: '插件',
settings_tab_system: '系统',
settings_tab_help: 'Help',
settings_help_meta: 'Resources and support for Hermes WebUI.',
settings_help_docs_label: 'Documentation',
settings_help_docs_desc: 'Guides, configuration reference, and the full Hermes WebUI README.',
settings_help_docs_link: 'Open Documentation',
settings_help_issue_label: 'Having an issue?',
settings_help_issue_desc: 'Search existing reports or open a new one on GitHub.',
settings_help_issue_link: 'Open GitHub Issues',
status_updated: '已更新',
status_ephemeral: '临时快照 — 不会保存到对话记录。',
status_no_tokens: '无令牌数据',
@@ -9831,6 +9887,14 @@ const LOCALES = {
plugins_provider_no_hooks: '供應商外掛,沒有 Agent 可見的掛鉤',
plugins_load_failed: '載入外掛失敗:',
settings_tab_system: '系統',
settings_tab_help: 'Help',
settings_help_meta: 'Resources and support for Hermes WebUI.',
settings_help_docs_label: 'Documentation',
settings_help_docs_desc: 'Guides, configuration reference, and the full Hermes WebUI README.',
settings_help_docs_link: 'Open Documentation',
settings_help_issue_label: 'Having an issue?',
settings_help_issue_desc: 'Search existing reports or open a new one on GitHub.',
settings_help_issue_link: 'Open GitHub Issues',
settings_title: '設定',
settings_save_btn: '儲存設定',
settings_label_model: '預設模型',
@@ -11078,6 +11142,14 @@ const LOCALES = {
plugins_provider_no_hooks: 'Provider plugin — no agent-visibility hooks', // TODO: translate
plugins_load_failed: 'Failed to load plugins: ', // TODO: translate
settings_tab_system: 'Sistema',
settings_tab_help: 'Help',
settings_help_meta: 'Resources and support for Hermes WebUI.',
settings_help_docs_label: 'Documentation',
settings_help_docs_desc: 'Guides, configuration reference, and the full Hermes WebUI README.',
settings_help_docs_link: 'Open Documentation',
settings_help_issue_label: 'Having an issue?',
settings_help_issue_desc: 'Search existing reports or open a new one on GitHub.',
settings_help_issue_link: 'Open GitHub Issues',
settings_title: 'Configurações',
settings_save_btn: 'Salvar Configurações',
settings_label_model: 'Modelo Padrão',
@@ -12336,6 +12408,14 @@ const LOCALES = {
plugins_provider_no_hooks: 'Provider plugin — no agent-visibility hooks', // TODO: translate
plugins_load_failed: 'Failed to load plugins: ', // TODO: translate
settings_tab_system: '시스템',
settings_tab_help: 'Help',
settings_help_meta: 'Resources and support for Hermes WebUI.',
settings_help_docs_label: 'Documentation',
settings_help_docs_desc: 'Guides, configuration reference, and the full Hermes WebUI README.',
settings_help_docs_link: 'Open Documentation',
settings_help_issue_label: 'Having an issue?',
settings_help_issue_desc: 'Search existing reports or open a new one on GitHub.',
settings_help_issue_link: 'Open GitHub Issues',
settings_title: '설정',
settings_save_btn: '설정 저장',
settings_label_model: '기본 모델',
@@ -13611,6 +13691,14 @@ const LOCALES = {
plugins_provider_no_hooks: 'Provider plugin — no agent-visibility hooks', // TODO: translate
plugins_load_failed: 'Failed to load plugins: ', // TODO: translate
settings_tab_system: 'Système',
settings_tab_help: 'Help',
settings_help_meta: 'Resources and support for Hermes WebUI.',
settings_help_docs_label: 'Documentation',
settings_help_docs_desc: 'Guides, configuration reference, and the full Hermes WebUI README.',
settings_help_docs_link: 'Open Documentation',
settings_help_issue_label: 'Having an issue?',
settings_help_issue_desc: 'Search existing reports or open a new one on GitHub.',
settings_help_issue_link: 'Open GitHub Issues',
settings_title: 'Paramètres',
settings_save_btn: 'Enregistrer les paramètres',
settings_label_model: 'Modèle par défaut',
@@ -14987,6 +15075,14 @@ const LOCALES = {
plugins_provider_no_hooks: 'Sağlayıcı eklentisi — agent görünürlük kancası yok',
plugins_load_failed: 'Eklentiler yüklenemedi: ',
settings_tab_system: 'Sistem',
settings_tab_help: 'Help',
settings_help_meta: 'Resources and support for Hermes WebUI.',
settings_help_docs_label: 'Documentation',
settings_help_docs_desc: 'Guides, configuration reference, and the full Hermes WebUI README.',
settings_help_docs_link: 'Open Documentation',
settings_help_issue_label: 'Having an issue?',
settings_help_issue_desc: 'Search existing reports or open a new one on GitHub.',
settings_help_issue_link: 'Open GitHub Issues',
settings_title: 'Ayarlar',
settings_save_btn: 'Ayarları Kaydet',
settings_label_model: 'Varsayılan Model',
@@ -16355,6 +16451,14 @@ const LOCALES = {
plugins_provider_no_hooks: 'Wtyczka dostawcy — brak haków widocznych dla agenta',
plugins_load_failed: 'Nie udało się załadować wtyczek: ',
settings_tab_system: 'System',
settings_tab_help: 'Pomoc',
settings_help_meta: 'Zasoby i wsparcie dla Hermes WebUI.',
settings_help_docs_label: 'Dokumentacja',
settings_help_docs_desc: 'Przewodniki, dokumentacja konfiguracji i pełny plik README Hermes WebUI.',
settings_help_docs_link: 'Otwórz dokumentację',
settings_help_issue_label: 'Masz problem?',
settings_help_issue_desc: 'Przeszukaj istniejące zgłoszenia lub utwórz nowe w serwisie GitHub.',
settings_help_issue_link: 'Otwórz zgłoszenia GitHub',
settings_title: 'Ustawienia',
settings_save_btn: 'Zapisz ustawienia',
settings_label_model: 'Domyślny model',
+40
View File
@@ -366,6 +366,10 @@
<svg width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><rect x="2" y="3" width="20" height="8" rx="2"/><rect x="2" y="13" width="20" height="8" rx="2"/><line x1="6" y1="7" x2="6.01" y2="7"/><line x1="6" y1="17" x2="6.01" y2="17"/></svg>
<span data-i18n="settings_tab_system">System</span>
</button>
<button type="button" class="side-menu-item" data-settings-section="help" onclick="switchSettingsSection('help')">
<svg width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><circle cx="12" cy="12" r="10"/><path d="M9.09 9a3 3 0 0 1 5.83 1c0 2-3 3-3 3"/><line x1="12" y1="17" x2="12.01" y2="17"/></svg>
<span data-i18n="settings_tab_help">Help</span>
</button>
</div>
</div>
<div class="resize-handle" id="sidebarResize"></div>
@@ -1349,6 +1353,42 @@
</div>
<button class="sm-btn" onclick="saveSettings()" style="margin-top:12px;width:100%;padding:8px;font-weight:600" data-i18n="settings_save_btn">Save Settings</button>
</div>
<div class="settings-pane" id="settingsPaneHelp">
<div class="settings-section-head">
<div>
<div class="settings-section-title" data-i18n="settings_tab_help">Help</div>
<div class="settings-section-meta" data-i18n="settings_help_meta">Resources and support for Hermes WebUI.</div>
</div>
</div>
<div class="help-cards">
<div class="help-card">
<div class="help-card-icon" aria-hidden="true">
<svg width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.6" stroke-linecap="round" stroke-linejoin="round"><path d="M4 19.5A2.5 2.5 0 0 1 6.5 17H20"/><path d="M6.5 2H20v20H6.5A2.5 2.5 0 0 1 4 19.5v-15A2.5 2.5 0 0 1 6.5 2z"/></svg>
</div>
<div class="help-card-body">
<div class="help-card-title" data-i18n="settings_help_docs_label">Documentation</div>
<div class="help-card-desc" data-i18n="settings_help_docs_desc">Guides, configuration reference, and the full Hermes WebUI README.</div>
<a href="https://get-hermes.ai/" target="_blank" rel="noopener noreferrer" class="help-card-link">
<span data-i18n="settings_help_docs_link">Open Documentation</span>
<svg width="13" height="13" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="M7 17 17 7"/><path d="M7 7h10v10"/></svg>
</a>
</div>
</div>
<div class="help-card">
<div class="help-card-icon" aria-hidden="true">
<svg width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.6" stroke-linecap="round" stroke-linejoin="round"><path d="m8 2 1.88 1.88"/><path d="M14.12 3.88 16 2"/><path d="M9 7.13v-1a3.003 3.003 0 1 1 6 0v1"/><path d="M12 20c-3.3 0-6-2.7-6-6v-3a4 4 0 0 1 4-4h4a4 4 0 0 1 4 4v3c0 3.3-2.7 6-6 6"/><path d="M12 20v-9"/><path d="M6.53 9C4.6 8.8 3 7.1 3 5"/><path d="M6 13H2"/><path d="M3 21c0-2.1 1.7-3.9 3.8-4"/><path d="M20.97 5c0 2.1-1.6 3.8-3.5 4"/><path d="M22 13h-4"/><path d="M17.2 17c2.1.1 3.8 1.9 3.8 4"/></svg>
</div>
<div class="help-card-body">
<div class="help-card-title" data-i18n="settings_help_issue_label">Having an issue?</div>
<div class="help-card-desc" data-i18n="settings_help_issue_desc">Search existing reports or open a new one on GitHub.</div>
<a href="https://github.com/nesquena/hermes-webui/issues" target="_blank" rel="noopener noreferrer" class="help-card-link">
<span data-i18n="settings_help_issue_link">Open GitHub Issues</span>
<svg width="13" height="13" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="M7 17 17 7"/><path d="M7 7h10v10"/></svg>
</a>
</div>
</div>
</div>
</div>
</div>
</div>
</main>
+3 -3
View File
@@ -5911,7 +5911,7 @@ function switchSettingsSection(name){
});
}
}
let section=(name==='appearance'||name==='preferences'||name==='providers'||name==='plugins'||name==='system')?name:'conversation';
let section=(name==='appearance'||name==='preferences'||name==='providers'||name==='plugins'||name==='system'||name==='help')?name:'conversation';
// Deep-linking to the Plugins pane when the tab is hidden (no plugins
// installed, #3457) falls back to Conversation. Resolve this BEFORE toggling
// panes/sidebar/dropdown below so every downstream selection uses the
@@ -5923,13 +5923,13 @@ function switchSettingsSection(name){
}
_settingsSection=section;
_currentSettingsSection=section;
const map={conversation:'Conversation',appearance:'Appearance',preferences:'Preferences',providers:'Providers',plugins:'Plugins',system:'System'};
const map={conversation:'Conversation',appearance:'Appearance',preferences:'Preferences',providers:'Providers',plugins:'Plugins',system:'System',help:'Help'};
// Sidebar menu items
document.querySelectorAll('#settingsMenu .side-menu-item').forEach(it=>{
it.classList.toggle('active', it.dataset.settingsSection===section);
});
// Panes in main
['conversation','appearance','preferences','providers','plugins','system'].forEach(key=>{
['conversation','appearance','preferences','providers','plugins','system','help'].forEach(key=>{
const pane=$('settingsPane'+map[key]);
if(pane) pane.classList.toggle('active', key===section);
});
+11
View File
@@ -1557,6 +1557,17 @@
.sm-btn{flex:1;padding:8px 0;border-radius:8px;font-size:11px;font-weight:500;background:var(--input-bg);border:1px solid var(--border);color:var(--muted);cursor:pointer;transition:all .15s;text-align:center;letter-spacing:.02em;}
.sm-btn:hover{background:rgba(255,255,255,0.09);color:var(--text);border-color:rgba(255,255,255,.15);}
.sm-btn:disabled{opacity:.45;cursor:not-allowed;}
/* Help tab (Settings → Help): icon-led resource cards (#3518) */
.help-cards{display:flex;flex-direction:column;gap:12px;margin-top:14px;}
.help-card{display:flex;gap:14px;align-items:flex-start;padding:16px;border:1px solid var(--border2);border-radius:10px;background:var(--input-bg);transition:border-color .15s,background .15s;}
.help-card:hover{border-color:var(--accent);}
.help-card-icon{flex:0 0 38px;width:38px;height:38px;display:flex;align-items:center;justify-content:center;border-radius:9px;background:var(--accent-soft,rgba(255,255,255,.06));color:var(--accent);}
.help-card-body{min-width:0;flex:1;}
.help-card-title{font-size:13.5px;font-weight:650;color:var(--text);margin-bottom:3px;}
.help-card-desc{font-size:12px;color:var(--muted);line-height:1.45;margin-bottom:11px;}
.help-card-link{display:inline-flex;align-items:center;gap:6px;text-decoration:none;padding:7px 13px;border-radius:7px;font-size:12px;font-weight:600;background:var(--input-bg);border:1px solid var(--border);color:var(--text);transition:all .15s;}
.help-card-link:hover{background:var(--accent);border-color:var(--accent);color:var(--accent-text,#1a1a1a);}
.help-card-link svg{flex:0 0 auto;opacity:.8;}
.main{flex:1;display:flex;flex-direction:column;overflow:hidden;min-width:0;min-height:0;background:var(--main-bg);}
.topbar{padding:12px 20px;border-bottom:1px solid var(--border);background:var(--topbar-bg);backdrop-filter:blur(12px);display:flex;align-items:center;justify-content:space-between;flex-shrink:0;position:relative;z-index:10;}
.topbar-title{font-size:15px;font-weight:600;letter-spacing:-.01em;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;}
+48
View File
@@ -0,0 +1,48 @@
from pathlib import Path
ROOT = Path(__file__).resolve().parents[1]
INDEX_HTML = (ROOT / "static" / "index.html").read_text(encoding="utf-8")
PANELS_JS = (ROOT / "static" / "panels.js").read_text(encoding="utf-8")
I18N_JS = (ROOT / "static" / "i18n.js").read_text(encoding="utf-8")
LOCALE_COUNT = 13 # en, it, ja, ru, es, de, zh, zh-TW, pt, ko, fr, tr, pl
def test_help_nav_button_present():
assert 'data-settings-section="help"' in INDEX_HTML
assert "switchSettingsSection('help')" in INDEX_HTML
assert 'data-i18n="settings_tab_help"' in INDEX_HTML
def test_help_pane_present():
assert 'id="settingsPaneHelp"' in INDEX_HTML
assert 'href="https://get-hermes.ai/"' in INDEX_HTML
assert 'href="https://github.com/nesquena/hermes-webui/issues"' in INDEX_HTML
def test_help_pane_links_are_outbound():
assert 'target="_blank"' in INDEX_HTML
assert 'rel="noopener noreferrer"' in INDEX_HTML
def test_panels_js_allowlist_includes_help():
assert "name==='help'" in PANELS_JS
def test_panels_js_map_includes_help():
assert "help:'Help'" in PANELS_JS
def test_panels_js_foreach_includes_help():
assert "'help'" in PANELS_JS
assert "settingsPaneHelp" not in PANELS_JS or 'settingsPane'+'{map[key]}' not in PANELS_JS
# Simpler: confirm the forEach array string contains help
assert ",'help'," in PANELS_JS or ",'help']" in PANELS_JS
def test_i18n_help_keys_present_in_all_locales():
assert I18N_JS.count("settings_tab_help") == LOCALE_COUNT
assert I18N_JS.count("settings_help_docs_label") == LOCALE_COUNT
assert I18N_JS.count("settings_help_issue_label") == LOCALE_COUNT
assert I18N_JS.count("settings_help_docs_link") == LOCALE_COUNT
assert I18N_JS.count("settings_help_issue_link") == LOCALE_COUNT