Skip to content

feat(desktop): configurable model/reasoning picker with explicit catalog refresh - #112351

Open
jkorzeniak wants to merge 14 commits into
NousResearch:mainfrom
jkorzeniak:feat/picker-styles-manual-catalog-cache
Open

jkorzeniak wants to merge 14 commits into
NousResearch:mainfrom
jkorzeniak:feat/picker-styles-manual-catalog-cache

Conversation

@jkorzeniak

@jkorzeniak jkorzeniak commented Sep 15, 2026 •

Copy link
Copy Markdown

What changes

Adds a persistent Model and Reasoning Picker preference in Desktop Appearance settings:

Style Composer Model menu
Classic Model label includes effort Edit remembered options
Split (default) Separate model and reasoning buttons Edit remembered options
Unified Model label includes effort Select an inactive model, then apply its options
Separated Separate buttons Plain selectable model rows

Unknown saved values fall back to Split; compact layouts keep their existing precedence. Copy is included for all six supported locales.

The shared model-options and model-selection paths reuse the existing disk catalog until explicit refresh or credential identity change. Opening the picker remains nonblocking: missing catalogs warm in the background. Outside the request-scoped manual-refresh policy, the existing TTL/SWR behavior remains.

The PR also preserves a manual model choice during initial gateway discovery/reconnect, and keeps managed local-provider identity through startup and conversation resume. Local model validation still uses the runtime endpoint.

Compatibility with current main

Updated through upstream 7c4d2a812ed63a93e59bfb5ef93701fdc283147c, preserving branch history.

  • Keeps upstream non_blocking_catalogs=not refresh; a degraded provider cannot stall opening the picker.
  • Provider-owned catalog validation uses the same cached snapshot as the picker instead of rediscovering it.
  • Retains gateway-reported effort translation and route tooltips.
  • Keeps upstream Anthropic alias-aware validation and local-runtime checks.

Unified uses upstream's existing select followed by applyPreset: a rejected selection does not apply options. This PR does not introduce an atomic model/options transaction or include the separate local Antigravity integration.

Validation

Native Windows, Python 3.11, Node 22.23.2; isolated checkouts with their own dependencies.

  • After the merge to fe32647090: 245 Python tests across 10 files via scripts/run_tests.sh; 76 Desktop tests across 7 files; full Desktop TypeScript checks passed.
  • After the update through 7c4d2a812e: 11 Python tests across 3 files passed for manual cache reuse, nonblocking reads and setup catalogs. Desktop source is unchanged by this final upstream update.
  • Combined with fix(gemini): derive AI Studio picker controls from model metadata #111754 on the earlier shared base: 111 Python tests across 5 files and 44 Desktop tests across 4 files passed, including six local integration cases for all picker styles and Gemini budgets. Integration-only tests are not added to either PR.
  • Ruff on conflict resolutions and diff whitespace checks passed.

The cache tests use real temporary disk caches and production validator/prefetch code, with external discovery replaced by fixtures. They cover aged entries, explicit refresh, credential rotation, custom endpoints and plugin-owned catalogs. UI coverage includes persisted style, startup selection, keyboard rows, and applying Unified options only after successful selection.

scripts/run_tests.sh tests/hermes_cli/test_manual_model_catalog.py tests/hermes_cli/test_model_options_read_path_catalogs.py tests/hermes_cli/test_local_runtime.py tests/hermes_cli/test_model_validation.py
npm run typecheck --workspace apps/desktop
npm run test --workspace apps/desktop -- src/store/picker-style.test.ts src/app/shell/model-catalog-menu.test.tsx src/app/session/hooks/use-model-controls.test.tsx

Manual checks and limits

Check all four styles, restart persistence, narrow composers, Unified rejected selections, explicit catalog refresh and a local-model conversation resumed after restart. Earlier installed-build checks confirmed startup and local-provider persistence; a complete four-style GUI pass has not been repeated for this revision.

The full repository suite and non-Windows execution were not run. Forced-refresh failure behavior is unchanged. Another client or explicit refresh can update the shared cache; this is not a snapshot pinned across requests.

AI assistance: OpenAI Codex assisted with code, tests and the PR description; Claude Opus through Hermes contributed the initial plan and an earlier audit. The human contributor specified the workflow, reported regressions and requested this contribution.

@alt-glitch alt-glitch added type/feature New feature or request P3 Low — cosmetic, nice to have comp/desktop Electron desktop app (apps/desktop/*) comp/cli CLI entry point, hermes_cli/, setup wizard comp/tui Terminal UI (ui-tui/ + tui_gateway/) labels Sep 15, 2026
@jkorzeniak
jkorzeniak marked this pull request as ready for review September 16, 2026 08:04

This branch has not been deployed

No deployments
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

comp/cli CLI entry point, hermes_cli/, setup wizard comp/desktop Electron desktop app (apps/desktop/*) comp/tui Terminal UI (ui-tui/ + tui_gateway/) P3 Low — cosmetic, nice to have type/feature New feature or request

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants