From 4f923da490c5489f6903617365d7ef4408fbe8ef Mon Sep 17 00:00:00 2001 From: ekko Date: Sat, 18 Apr 2026 22:08:34 +0800 Subject: [PATCH 1/4] feat: replace ModelSelector dropdown with modal picker NSelect dropdown is unusable with providers that have hundreds of models. Replaced with a modal dialog featuring search filter, collapsible provider groups, and click-to-select. Co-Authored-By: Claude Opus 4.6 --- .../src/components/layout/ModelSelector.vue | 242 ++++++++++++++++-- packages/client/src/i18n/locales/en.ts | 1 + packages/client/src/i18n/locales/zh.ts | 1 + 3 files changed, 220 insertions(+), 24 deletions(-) diff --git a/packages/client/src/components/layout/ModelSelector.vue b/packages/client/src/components/layout/ModelSelector.vue index fcdee7a..7861378 100644 --- a/packages/client/src/components/layout/ModelSelector.vue +++ b/packages/client/src/components/layout/ModelSelector.vue @@ -1,41 +1,105 @@ @@ -55,4 +119,134 @@ function handleChange(value: string | number | Array) { letter-spacing: 0.5px; margin-bottom: 6px; } + +.model-trigger { + display: flex; + align-items: center; + gap: 6px; + width: 100%; + padding: 6px 8px; + background: $bg-input; + border: 1px solid $border-color; + border-radius: $radius-sm; + color: $text-primary; + font-size: 13px; + cursor: pointer; + transition: border-color $transition-fast; + + &:hover { + border-color: $accent-muted; + } +} + +.model-name { + flex: 1; + overflow: hidden; + text-overflow: ellipsis; + white-space: nowrap; + text-align: left; +} + +.model-arrow { + flex-shrink: 0; + color: $text-muted; +} + +.model-search { + margin-bottom: 12px; +} + +.model-list { + max-height: 50vh; + overflow-y: auto; + scrollbar-width: thin; +} + +.model-group { + margin-bottom: 4px; +} + +.model-group-header { + display: flex; + align-items: center; + gap: 6px; + padding: 8px 8px; + font-size: 12px; + font-weight: 600; + color: $text-secondary; + cursor: pointer; + border-radius: $radius-sm; + user-select: none; + transition: background-color $transition-fast; + + &:hover { + background-color: $bg-secondary; + } +} + +.model-group-arrow { + flex-shrink: 0; + transition: transform $transition-fast; + + &.collapsed { + transform: rotate(-90deg); + } +} + +.model-group-label { + flex: 1; +} + +.model-group-count { + font-size: 11px; + color: $text-muted; + font-weight: 400; +} + +.model-group-items { + padding-left: 8px; +} + +.model-item { + display: flex; + align-items: center; + gap: 8px; + padding: 7px 10px; + font-size: 13px; + color: $text-secondary; + border-radius: $radius-sm; + cursor: pointer; + transition: all $transition-fast; + + &:hover { + background-color: rgba(var(--accent-primary-rgb), 0.06); + color: $text-primary; + } + + &.active { + color: $accent-primary; + font-weight: 500; + } +} + +.model-item-name { + flex: 1; + overflow: hidden; + text-overflow: ellipsis; + white-space: nowrap; + font-family: $font-code; + font-size: 12px; +} + +.model-check { + flex-shrink: 0; + color: $accent-primary; +} + +.model-empty { + padding: 24px 0; + text-align: center; + font-size: 13px; + color: $text-muted; +} diff --git a/packages/client/src/i18n/locales/en.ts b/packages/client/src/i18n/locales/en.ts index 337fcb6..1de19d7 100644 --- a/packages/client/src/i18n/locales/en.ts +++ b/packages/client/src/i18n/locales/en.ts @@ -190,6 +190,7 @@ export default { // Models models: { title: 'Models', + searchPlaceholder: 'Search models...', addProvider: 'Add Provider', providerType: 'Provider Type', preset: 'Preset', diff --git a/packages/client/src/i18n/locales/zh.ts b/packages/client/src/i18n/locales/zh.ts index 6fa017a..94e88c1 100644 --- a/packages/client/src/i18n/locales/zh.ts +++ b/packages/client/src/i18n/locales/zh.ts @@ -190,6 +190,7 @@ export default { // 模型 models: { title: '模型', + searchPlaceholder: '搜索模型...', addProvider: '添加 Provider', providerType: 'Provider 类型', preset: '预设', From b4f809d8b5a9b2b378fc534c2def1ebc35cba1da Mon Sep 17 00:00:00 2001 From: ekko Date: Sun, 19 Apr 2026 10:46:33 +0800 Subject: [PATCH 2/4] fix: improve chat scroll behavior and dark mode readability MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Smart auto-scroll: only follow SSE stream when user is near bottom (200px threshold), scroll once on send/switch session - Brighten dark mode text colors (primary #e0→#f0, secondary #a0→#c0, muted #66→#88) - Fix tool-call panel height to match thinking video (120px→213px) - Fix tool-call item background invisible in dark mode - Fix gateway start button using hardcoded dark color Co-Authored-By: Claude Opus 4.6 --- .gitignore | 2 +- .../components/hermes/chat/MessageList.vue | 41 ++++++++++++++++--- packages/client/src/styles/variables.scss | 12 +++--- .../client/src/views/hermes/GatewaysView.vue | 3 +- 4 files changed, 43 insertions(+), 15 deletions(-) diff --git a/.gitignore b/.gitignore index e617e9c..f225f24 100644 --- a/.gitignore +++ b/.gitignore @@ -19,7 +19,7 @@ packages/server/data/ packages/server/node_modules/ .hermes-web-ui/ hermes_data/ - +hermes-dependencies.md # Editor directories and files .vscode/* !.vscode/extensions.json diff --git a/packages/client/src/components/hermes/chat/MessageList.vue b/packages/client/src/components/hermes/chat/MessageList.vue index 03a177e..49959ac 100644 --- a/packages/client/src/components/hermes/chat/MessageList.vue +++ b/packages/client/src/components/hermes/chat/MessageList.vue @@ -1,5 +1,5 @@