Commit Graph

854 Commits

Author SHA1 Message Date
nesquena-hermes 20ac6dfe5c release: v0.50.242 — revert assistant serif font + remove Calm theme (#1299)
Reverts the global assistant serif rule and removes the Calm theme that were shipped in v0.50.240 PR #1282. Pure deletion; 3252 tests passing. Override on independent review per Nathan.
v0.50.242
2026-04-29 19:59:26 -07:00
nesquena-hermes 0ad95cb16a release: v0.50.241 (#1293)
release: v0.50.241

Batch release of 4 PRs:

- #1290 (@nickgiulioni1) — Inline audio/video media editor with playback
  speed controls and HTTP byte-range streaming. PDF/media previews in
  workspace file browser. Composer tray inline players for audio/video.
  (Rebased from #1232.)

- #1287 (@renatomott) — Configured model badges (Primary / Fallback N) in
  the model picker, carried through to the composer chip. Persists through
  on-disk model cache.

- #1289 (@franksong2702) — Appearance autosave for theme/skin/font-size in
  Settings; inline Saving / Saved / Failed status. Font size now persists
  to config.yaml. Refs #1003.

- #1294 (@franksong2702) — Normalize agent session source metadata
  (raw_source / session_source / source_label) through /api/sessions and
  gateway watcher SSE snapshots. Existing source_tag / is_cli_session
  fields preserved. Refs #1013.

Tests: 3254 passed, 2 skipped, 3 xpassed (was 3199 before this release).

Independently reviewed and approved by nesquena (commit d1738f6).
v0.50.241
2026-04-29 19:54:07 -07:00
nesquena-hermes 33a145a669 release: v0.50.240
## Release v0.50.240

Batch release of 13 PRs that passed full triage + code review + test suite (3199 tests, 0 failures).

---

### Added

- **Compact tool activity mode** (`simplified_tool_calling`, default on) — groups tool calls and thinking traces into a single collapsed "Activity" disclosure card per assistant turn. Also adds a new **Calm Console** theme with earth/slate palette and serif prose. @Michaelyklam — #1282
- **PDF first-page preview** — `MEDIA:` `.pdf` files render a canvas thumbnail via PDF.js CDN (4 MB cap). **HTML sandbox iframe** — `.html`/`.htm` files render inline in a sandboxed `<iframe srcdoc>` (256 KB cap). 10 i18n keys × 7 locales. @bergeouss — #1280, closes #480 #482
- **Inline Excalidraw diagram preview** — `.excalidraw` files render as pure SVG (no external deps; rectangles, ellipses, diamonds, text, lines, arrows, freehand; 512 KB cap). @bergeouss — #1279, closes #479
- **Inline CSV table rendering** — fenced `csv` blocks and `MEDIA:` CSV files render as scrollable HTML tables with auto-separator detection. @bergeouss — #1277, closes #485
- **Inline SVG, audio, and video rendering** — SVG as `<img>`, audio as `<audio controls>`, video as `<video controls>`. @bergeouss — #1276, closes #481
- **Batch session select mode** — multi-select sessions for bulk Archive/Delete/Move. 11 i18n keys × 7 locales. @bergeouss — #1275, closes #568
- **Collapsible skill category headers** — click to collapse/expand without re-render; state persists across filter cycles. @bergeouss — #1281
- **`providers.only_configured` setting** — opt-in flag to restrict the model picker to explicitly configured providers. @KingBoyAndGirl — #1268
- **OpenCode Go model catalog** — adds Kimi K2.6, DeepSeek V4 Pro/Flash, MiMo V2.5/Pro, Qwen3.6/3.5 Plus. @nesquena-hermes — #1284, closes #1269

### Fixed

- **Profile `TERMINAL_CWD` TypeError** — `_build_agent_thread_env()` helper merges env before `_set_thread_env()` call. @hi-friday — #1266
- **Service worker subpath cache bypass** — regex now matches `/api/*` under any mount prefix. @Michaelyklam — #1278
- **SSE client disconnect leaks** — `TimeoutError`/`OSError` treated as clean disconnects; server backlog 64, threads daemonized; session list renders before saved-session restore. @KayZz69 — #1267
- **i18n locale corrections** — Korean MCP strings (23), Chinese MCP strings (23), zh-Hant missing keys (41), de missing keys (229). @bergeouss — #1274, closes #1273

---

### Test results

```
3199 passed, 2 skipped, 3 xpassed in 72.79s
```

### PRs on hold (not included)

#1265 (draft), #1271 (superseded by #1266), #1272 (skipped XSS tests), #1232 (partial test run), #1222 (review questions open), #1134 (live-server tests), #1132 (superseded by #1134), #1108 (negative UX review), #1084 (empty description)
v0.50.240
2026-04-29 17:42:32 -07:00
nesquena-hermes 9f269a4f1c release: v0.50.239
h4-h6 heading fix. Approved by @nesquena. Tests: 3064 passed.
v0.50.239
2026-04-29 09:07:03 -07:00
Hermes Agent 36eb6515f6 docs: v0.50.239 CHANGELOG 2026-04-29 15:56:06 +00:00
Hermes Agent 8e546c0273 Merge remote-tracking branch pr/1260 into stage/batch-v0.50.239 2026-04-29 15:55:51 +00:00
nesquena-hermes 9b6bce3a0d release: v0.50.238
Batch release — 12 PRs. Approved by @nesquena. Tests: 3061 passed.
v0.50.238
2026-04-29 08:53:51 -07:00
Hermes Agent af433de7a7 docs: add #1261 to v0.50.238 CHANGELOG 2026-04-29 15:52:56 +00:00
Hermes Agent eeef360a74 Merge remote-tracking branch pr/1261 into stage/batch-v0.50.238 2026-04-29 15:51:54 +00:00
Hermes Agent e538286d9a docs: add #1229 to v0.50.238 CHANGELOG 2026-04-29 15:19:01 +00:00
Hermes Agent bd8fc6a2e2 fix(models): preserve @provider:model hint when hint matches active provider
When the user explicitly selects @provider:model from the picker,
_resolve_compatible_session_model() was stripping the prefix because
the hint matched the active provider (hint_matches_active=True → return bare_model, True).

This caused:
- The picker to snap back to the first duplicate entry on next render
- resolve_model_provider() to use the default provider instead of the
  explicitly selected one, running the agent on the wrong backend

The hint_matches_active branch was intended for normalizing stale cross-
provider session models. But an @provider:model where the hint IS the
active provider is not stale — it is the user's deliberate selection.

Fix: return (model, False) so the full @provider:model survives to
resolve_model_provider() in config.py, which already handles it correctly.

Updates test_active_at_provider_session_model_preserved_with_hint and
adds test_issue1253_duplicate_model_id_active_provider_hint_preserved.

Closes #1253
2026-04-29 15:18:43 +00:00
Hermes Agent 4ee80425f2 Merge remote-tracking branch 'refs/remotes/pr/1229' into stage/batch-v0.50.238 2026-04-29 15:17:57 +00:00
Hermes Agent c75be8f564 docs: v0.50.238 CHANGELOG 2026-04-29 15:16:14 +00:00
Brian f65f488635 fix(renderer): render h4-h6 markdown headings (####, #####, ######)
The post-stream renderMd() in static/ui.js only handled #, ##, ### — lines starting with #### through ###### fell through and emitted as literal text after streaming finalized.

  Extend the heading replacer chain to cover h4-h6, ordered longest-first, so ###### cannot be partially captured by the shorter ### rule. Add the matching .msg-body h4/h5/h6 CSS rules (and data-font-size variants) so the new tags inherit the same visual rhythm as h1-h3.

  Adds 3 node-driven tests in test_renderer_js_behaviour.py pinning all six heading levels and the longest-first replacer order.

Closes #1258
2026-04-29 23:15:59 +08:00
Hermes Agent e0f77d6ab4 Merge remote-tracking branch pr/1242 into stage/batch-v0.50.238 2026-04-29 15:11:25 +00:00
Hermes Agent e2ff00f819 Merge remote-tracking branch pr/1247 into stage/batch-v0.50.238 2026-04-29 15:11:21 +00:00
Hermes Agent d5c0838fcd Merge remote-tracking branch pr/1249 into stage/batch-v0.50.238 2026-04-29 15:11:16 +00:00
Hermes Agent 8b9ad761f9 Merge remote-tracking branch pr/1251 into stage/batch-v0.50.238 2026-04-29 15:10:49 +00:00
Hermes Agent 2bb0af49f2 Merge remote-tracking branch pr/1254 into stage/batch-v0.50.238 2026-04-29 15:10:22 +00:00
Hermes Agent 1cf406addb Merge remote-tracking branch 'pr/1246' into stage/batch-v0.50.238 2026-04-29 15:05:09 +00:00
Hermes Agent ea4d381e43 Merge remote-tracking branch 'pr/1248' into stage/batch-v0.50.238 2026-04-29 14:29:05 +00:00
Hermes Agent 2bdf5c77d4 Merge remote-tracking branch 'pr/1245' into stage/batch-v0.50.238 2026-04-29 14:29:05 +00:00
Hermes Agent 26579ba141 Merge remote-tracking branch 'pr/1250' into stage/batch-v0.50.238 2026-04-29 14:29:05 +00:00
Hermes Agent 3feef25737 Merge remote-tracking branch 'pr/1244' into stage/batch-v0.50.238 2026-04-29 14:29:04 +00:00
happy5318 cc45175ee5 docs: add thread safety comment for SESSION_AGENT_CACHE
All LRU cache operations (get, set, move_to_end, popitem) are already
protected by SESSION_AGENT_CACHE_LOCK. This addresses the reviewer's
concern about thread safety in multi-threaded ASGI servers.
2026-04-29 20:08:12 +08:00
bergeouss 3b614c4cd5 fix(i18n): translate MCP UI strings from Korean to English in en locale
The English locale (en) contained Korean translations for MCP server
management UI strings. This caused the Settings -> System -> MCP Servers
section to display in Korean when the user's browser language is English.

Fixed:
- tree_view: '트리' -> 'Tree'
- raw_view: '원본' -> 'Raw'
- mcp_servers_title: 'MCP 서버' -> 'MCP Servers'
- mcp_servers_desc: 'config.yaml의 MCP 서버를 관리합니다.' -> 'Manage MCP servers configured in config.yaml.'
- mcp_no_servers, mcp_add_server, mcp_field_name, mcp_transport_label,
  mcp_field_command, mcp_field_args, mcp_field_url, mcp_field_timeout,
  mcp_save, mcp_cancel, mcp_name_required, mcp_url_required,
  mcp_command_required, mcp_saved, mcp_save_failed,
  mcp_delete_confirm_title, mcp_delete_confirm_message, mcp_deleted,
  mcp_delete_failed, mcp_load_failed

Closes #1252
2026-04-29 10:50:26 +00:00
KingBoyAndGirl 4e0d8da060 fix: restore GET /api/mcp/servers route inside handle_get()
Problem:
- GET /api/mcp/servers returned 404 error
- MCP servers management UI could not load server list
- Root cause: route was placed outside handle_get(), in unreachable code

Root Cause:
- The MCP servers GET route was incorrectly placed after handle_get() returned False (404)
- handle_get() function returns False at line ~1224, so any code after it won't execute
- The route was also in handle_post() area but without proper method checking

Solution:
- Moved GET /api/mcp/servers route inside handle_get() before the return False statement
- Removed the misplaced route from the old location (originally around line 1636)
- Also updated /api/profiles response format to include full profiles list

Testing:
- After restart: curl http://localhost:8787/api/mcp/servers returns {"servers": []}
- No more 404 errors
- WebUI can now properly load MCP servers list
2026-04-29 17:39:56 +08:00
happy5318 65e5690772 fix: add LRU limit to SESSION_AGENT_CACHE to prevent memory bloat
The agent cache stores full AIAgent instances (each holding complete
conversation history) without size limit. Long-running servers with
many sessions can accumulate unbounded memory usage.

Changes:
- Replace dict with OrderedDict for LRU tracking
- Add SESSION_AGENT_CACHE_MAX = 50 limit
- Evict least-recently-used entries when cache exceeds limit
- Call move_to_end() on cache hits to maintain LRU order

This prevents memory exhaustion on servers with many active sessions.
2026-04-29 17:35:12 +08:00
yzp12138 0fe59831fe tests: add regression tests + magic-byte image validation for native image attachments 2026-04-29 17:01:01 +08:00
Frank Song 9350af6fd7 Update reasoning metadata guards for context split 2026-04-29 16:46:32 +08:00
Frank Song 22cf29d477 Restore terminal resize and collapse controls 2026-04-29 16:45:26 +08:00
Frank Song 1ed1ce219d Preserve transcript across context compaction 2026-04-29 16:37:08 +08:00
KingBoyAndGirl d184613752 fix: fetch live models for custom provider from model.base_url 2026-04-29 16:24:19 +08:00
Frank Song b277e195fe Fix MiniMax China provider visibility 2026-04-29 15:50:32 +08:00
Dennis Soong 8a74ea89e7 fix: apply profile terminal env in webui sessions 2026-04-29 14:12:59 +08:00
Feco Linhares 1fe9b76a3a Add Portuguese (pt-BR) locale
- Added Brazilian Portuguese translation with 721 keys
- 100% key parity with en locale (reference)
- Follows project convention: _lang='pt', _speech='pt-BR'
- Clean insertion without modifying existing locales
- Syntax validated with node --check

AI Translation Disclosure:
Translated using NVIDIA NIM (qwen3.5-plus model) with human review by native Brazilian Portuguese speaker (Feco Linhares)
2026-04-29 06:06:01 +00:00
Feco Linhares db358e362b Add Portuguese (pt-BR) locale
- Added Brazilian Portuguese translation with 721 keys
- 100% key parity with en locale (reference)
- Follows project convention: _lang='pt', _speech='pt-BR'
- Clean insertion without modifying existing locales
- Syntax validated with node --check

AI Translation Disclosure:
Translated using NVIDIA NIM (qwen3.5-plus model) with human review by native Brazilian Portuguese speaker (Feco Linhares)
2026-04-29 06:03:13 +00:00
KingBoyAndGirl be08842642 fix: trust custom provider base_url in SSRF validation
When using custom providers with private IPs (like AxonHub on internal
networks), the SSRF protection incorrectly blocks API calls to the user's
own configured endpoint.

This fix automatically adds the model.base_url hostname to the SSRF
trusted hosts list, since it's explicitly configured by the user.

Fixes issues where /api/models and /v1/* endpoints fail silently
when using custom providers with private IPs or IPv6 addresses.
2026-04-29 13:45:52 +08:00
Hermes Agent 72b4ff66f0 fix+feat: batch v0.50.237 — 21 PRs (embedded terminal, JSON/diff viewers, MCP UI, cron tracking, workspace CRUD, archive upload, DeepSeek V4, NVIDIA NIM, security fixes) (#1243) v0.50.237 2026-04-29 05:23:56 +00:00
Nathan Esquenazi c86545b6a7 chore(repo): remove accidentally-committed graphify artifacts; ignore them going forward
Two artifacts from a contributor's local graphify (code-graph) tooling
slipped into PR #1233 (workspace drag-to-reorder):

  .graphify_cached.json    (3.5MB)
  .graphify_uncached.txt   (refs /home/fr33m1nd/hermes-webui-src/...)

Neither belongs in source control: the .json is an autogenerated cache
of node IDs for a graph visualisation tool, and the .txt is a
file-discovery index pointing at the contributor's local workspace
(/home/fr33m1nd/hermes-webui-src/) — paths that aren't valid for any
other developer.

The repo already ignores graphify-out/ but these two top-level dotfiles
weren't covered. Add explicit ignore entries and remove the tracked
copies.

No code change. CI remains green on 3.11/3.12/3.13.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-04-28 22:12:44 -07:00
Hermes Agent bbd754a496 chore: CHANGELOG for v0.50.237 batch (21 PRs) 2026-04-29 05:08:28 +00:00
Hermes Agent 867f2a3f81 absorb: address Opus review findings (security + correctness)
B1: fix stored XSS in MCP delete button — replace inline onclick with
    data-mcp-name attribute + event delegation (panels.js)
B2: fix zip/tar-slip via startswith prefix collision — use
    is_relative_to(); track actual extracted bytes instead of trusting
    member.file_size (upload.py)
B3: add NVIDIA NIM endpoint to _OPENAI_COMPAT_ENDPOINTS and
    _SUPPORTED_PROVIDER_SETUPS so provider is reachable (routes.py,
    onboarding.py)
H1: add terminalResizeHandle element to index.html and return it from
    _terminalEls() so resize-by-drag works (index.html, terminal.js)
H2: fix dead get_terminal() branch — return None for dead terminals
    instead of always returning term (terminal.py)
H3: replace os.environ.copy() with a safe allowlist in PTY shell env
    so API keys are not exposed inside the terminal (terminal.py)
H5: make model dedup deterministic — sort groups by provider_id
    alphabetically before first-occurrence assignment (config.py)
H7: add pid regex validation before OAuth probe; constrain key_source
    to a closed set of safe values (providers.py)
M8: add double-run guard for cron run-now — reject if job is already
    tracked as running (routes.py)
2026-04-29 05:06:34 +00:00
bergeouss 6a17e4cc0c fix(ui): add touch toggle support for context tooltip on mobile
Addresses reviewer feedback on #524 — the compress affordance was only
reachable via hover (desktop). Mobile users can now tap the context ring
button to toggle the tooltip and access the compress button.

- CSS: add .ctx-tooltip-active class with opacity + pointer-events
- JS: tap-to-toggle handler on ctxIndicator with outside-click dismiss
- aria-hidden toggled correctly for accessibility

Ref: #1223 review comment
2026-04-29 04:59:00 +00:00
Hermes Agent 74ecc58afa fix(test): extend renderMd window to 15000 chars (renderMd grew with diff+tree viewers) 2026-04-29 04:39:50 +00:00
Frank Song 2f0d036455 Add terminal locale coverage 2026-04-29 04:37:31 +00:00
Frank Song eb9614854e Refine embedded terminal card entrypoint 2026-04-29 04:37:31 +00:00
Frank Song 940c82b2da Synchronize initial terminal open layout 2026-04-29 04:37:30 +00:00
Frank Song 70417359e3 Synchronize dock expand layout 2026-04-29 04:37:28 +00:00
Frank Song 8e67e4aa78 Add controlled terminal card resizing 2026-04-29 04:37:27 +00:00
Frank Song 4575cae9db Keep terminal card from covering transcript 2026-04-29 04:37:26 +00:00