Commit Graph

1034 Commits

Author SHA1 Message Date
Colin Chang 9c3e37d2ee fix: custom_providers models allowlist takes priority over live /v1/models fetch
Custom providers that have a curated models: list in config.yaml
(e.g. ZenMux gateways) should show ONLY those configured models in
the picker dropdown, not the full /v1/models catalog.

Before this fix, _named_custom_groups unconditionally called
_read_custom_endpoint_models() which would pull hundreds of models
from aggregator gateways and overwrite the user's curated list.

Now the build checks if the custom_provider entry has a non-empty
models dict/list in config.yaml — if so, it skips the live fetch
and uses only the configured models (same behavior as hermes-agent
model_switch.py Section 4 patch).

Closes: configure-model-list-should-be-authoritative
2026-05-20 20:22:11 +00:00
nesquena-hermes 1e3ca07575 Stage 390: PR #2634
# Conflicts:
#	CHANGELOG.md
2026-05-20 20:16:30 +00:00
nesquena-hermes 495991c2db Stage 390: PR #2642 2026-05-20 20:16:30 +00:00
nesquena-hermes 7c2d56c920 Stage 389 follow-up: close TOCTOU race in pin-cap (Opus advisor #2614) 2026-05-20 18:12:38 +00:00
nesquena-hermes dd36d09f89 Stage 389: PR #2626
# Conflicts:
#	CHANGELOG.md
2026-05-20 16:41:45 +00:00
nesquena-hermes 3d34eef02d Stage 389: PR #2620 2026-05-20 16:41:45 +00:00
nesquena-hermes 4d8e1ccc10 Stage 389: PR #2618 2026-05-20 16:41:44 +00:00
nesquena-hermes eaff4d0b8e Stage 389: PR #2614
# Conflicts:
#	CHANGELOG.md
2026-05-20 16:41:44 +00:00
nesquena-hermes 3bcd81b79f Stage 389: PR #2612
# Conflicts:
#	CHANGELOG.md
2026-05-20 16:41:44 +00:00
Dennis Soong cec435a833 fix(session): rebuild missing startup index 2026-05-20 23:43:30 +08:00
Michael Lam 8ef8fae831 fix: show config-managed custom providers 2026-05-20 06:27:00 -07:00
Michael Lam c3eafa34f8 fix: surface custom provider model endpoint errors 2026-05-20 03:12:33 -07:00
manji ff0aa69d5f fix(session): use second-level timestamp granularity in legacy dedup key
The _normalized_message_timestamp_for_key helper was preserving
microsecond precision (%.6f). When the same message is persisted by
both the WebUI sidecar JSON writer and the Hermes agent state.db
writer, their timestamps can differ by a few microseconds, causing
_session_message_merge_key to produce different keys for the same
logical message and letting both copies survive the dedup pass in
merge_session_messages_append_only.

Truncating to second-level granularity collapses sub-second drift to
the same key, so the duplicate is suppressed correctly.

Fixes #2616
2026-05-20 07:13:55 +00:00
Lumen Yang b2c6af12f1 fix(webui): prefer sidecar counts over stale session index 2026-05-20 05:42:55 +00:00
Michael Lam 9ca846eb8f feat: cap pinned sessions from sidebar 2026-05-19 20:50:26 -07:00
AJV20 8109bcb7e4 fix: honor configured title generation model 2026-05-19 22:35:11 -04:00
AJV20 f966e99231 fix: preserve IPv6 dashboard link brackets 2026-05-19 21:35:10 -04:00
nesquena-hermes ed6ee3e067 Stage 388: PR #2607
# Conflicts:
#	CHANGELOG.md
2026-05-20 00:17:48 +00:00
nesquena-hermes a201401236 Stage 388: PR #2524 2026-05-20 00:17:48 +00:00
nesquena-hermes bd819f5e68 Stage 388: PR #2533 2026-05-20 00:17:47 +00:00
nesquena-hermes 7c3dcce1d0 Stage 388: PR #2598 2026-05-20 00:17:47 +00:00
Eleanor Berger 4598adfd04 feat: add Geist Contrast skin 2026-05-20 00:09:06 +00:00
AJV20 cb0850208d fix(session): dedupe messaging transcript timestamps 2026-05-19 19:17:43 -04:00
AJV20 54b6c38578 feat(health): expose WebUI stream runtime diagnostics 2026-05-19 22:48:10 +00:00
AJV20 739c948e74 fix(system): allow browser-only dashboard links 2026-05-19 22:47:55 +00:00
AJV20 612fcd30fe fix: avoid duplicate live tool events 2026-05-19 18:41:08 -04:00
nesquena-hermes 6d43116794 Stage 387: PR #2573 2026-05-19 22:10:20 +00:00
nesquena-hermes cc8ef201be Stage 387: PR #2600 2026-05-19 22:10:20 +00:00
nesquena-hermes 93727897b6 Stage 387: PR #2605
# Conflicts:
#	api/routes.py
2026-05-19 22:10:20 +00:00
nesquena-hermes 1ddb18264e Stage 387: PR #2604
# Conflicts:
#	CHANGELOG.md
2026-05-19 22:08:56 +00:00
nesquena-hermes 4bb60d9b10 Stage 387: PR #2601 2026-05-19 22:08:56 +00:00
nesquena-hermes e63de7c15f Stage 387: PR #2593
# Conflicts:
#	CHANGELOG.md
2026-05-19 22:08:56 +00:00
nesquena-hermes 536a8b7636 Stage 387: PR #2566 2026-05-19 22:08:55 +00:00
Lumen Yang dc5c8168d1 fix(webui): refresh active session on external sidecar updates 2026-05-19 21:34:08 +00:00
Michael Lam 1ebfbf3527 fix: reconcile session metadata counts 2026-05-19 14:28:20 -07:00
keyos ada59d73e6 fix(approval): simplify gateway_keys expression and document race window
Drop the redundant 'if gw_data else []' guard — gw_data is already
guaranteed to be a dict by the 'or {}' fallback above.

Add a one-line comment explaining the peek-without-pop race window:
a concurrent resolver may pop a different gateway entry, but
approve_session is idempotent over the session key set so the
outcome is the same regardless.
2026-05-19 20:56:22 +00:00
keyos 729ed415ff fix(approval): peek _gateway_queues for session-level approval when _pending is empty
During active streaming, dangerous-command approvals go through the
gateway path and are stored in _gateway_queues as _ApprovalEntry
objects, not in _pending. The _resolve_approval_legacy helper only
looked at _pending, so 'Allow for this session' never called
approve_session() — the user clicked Allow, the card vanished, but
the next dangerous command asked again.

Now when _pending has no matching entry, the helper peeks into
_gateway_queues to extract pattern_keys, calls approve_session(),
and marks found_target=True so resolve_gateway_approval also fires.

This commit is re-scoped to peek-only (no agent_session_key round-trip,
no state_db metadata changes).

Includes:
- Import + fallback for _gateway_queues
- Null-safe key filtering in all_keys
- Source-contract test (static) + functional test with
  @requires_agent_modules skip marker for CI
- All comments and docstrings in English
2026-05-19 20:24:05 +00:00
starship-s 37df7d76a4 fix(webui): prevent composer draft rollback on refresh 2026-05-19 13:31:12 -06:00
Michael Lam 5770323188 feat(runtime): add runner adapter facade 2026-05-19 12:06:57 -07:00
AJV20 ebb4dffc7d fix: stream live tool callback events 2026-05-19 14:55:19 -04:00
Lumen Yang 8d2b9d4a16 feat(webui): render indexed context metadata 2026-05-19 18:52:50 +00:00
Bryan Bartley 94ceb66c17 docs: clarify folder-zip cap bounds wall-clock/bandwidth not RSS
Per reviewer note: because the zip streams straight into handler.wfile
(no io.BytesIO buffering), peak memory is bounded by zipfile's per-file
read buffer, not the HERMES_WEBUI_FOLDER_ZIP_MAX_MB cap. Adds a comment
so the next reader doesn't have to trace it to learn the cap's actual
shape.
2026-05-19 13:44:56 -05:00
nesquena-hermes 6c0f864b10 Stage 386: PR #2587
# Conflicts:
#	CHANGELOG.md
2026-05-19 18:20:47 +00:00
nesquena-hermes 86f52f67b8 Stage 386: PR #2581
# Conflicts:
#	api/streaming.py
2026-05-19 18:20:47 +00:00
nesquena-hermes 0585881511 Stage 386: PR #2583 2026-05-19 18:20:07 +00:00
nesquena-hermes 9a512194d5 Stage 386: PR #2582
# Conflicts:
#	CHANGELOG.md
2026-05-19 18:20:07 +00:00
Michael Lam 0736e45485 fix: dedupe tool-only partial recovery markers 2026-05-19 11:16:21 -07:00
Lumen Yang a8d429775c fix(webui): preserve casual chat compaction guard 2026-05-19 14:34:58 +00:00
AJV20 f93e288214 Fix stale stream recovery writeback race 2026-05-19 10:26:45 -04:00
dobby-d-elf 2a95c1e482 Fix profile-aware assistant display names 2026-05-19 07:17:11 -06:00