Commit graph

4720 commits

Author SHA1 Message Date
carryzuo00
2881fcec89 fix(agent_health): detect profile-scoped gateway.pid for correct status
_gateway_root_pid_path() unconditionally returned <hermes_root>/gateway.pid.
Profile-scoped gateways (started with --profile <name> or via active_profile)
write their runtime files under <hermes_root>/profiles/<name>/ instead of the
root, so the root-level path never existed.

build_agent_health_payload() therefore always received a non-existent pid_path,
fell through to the stale root-level gateway_state.json, and returned alive=None.
This caused the cron/scheduled-jobs page to display "Gateway not configured" even
when a gateway was actively running.

Fix: after failing to find a root-level gateway.pid, fall back to the active
profile directory via get_active_hermes_home(). Root-level wins when it exists,
so deployments that do write there are unaffected. Errors from profile lookup are
swallowed and the root path is returned, preserving the previous safe default.

Adds five focused unit tests covering the new fallback, the priority rule, and
the error-handling path.
2026-05-25 10:35:37 +00:00
MinhoJJang
d920d4222a Trim paginated session tool call payloads 2026-05-25 18:28:43 +09:00
ai-ag2026
5e1b51d16f docs: add canonical session resolution contract 2026-05-25 11:14:15 +02:00
Frank Song
cfca26f2e8 Repaint sidebar after session archive or delete 2026-05-25 16:31:15 +08:00
Frank Song
10463158f8 docs: add clarify dialog screenshot evidence 2026-05-25 16:25:11 +08:00
Frank Song
89d8c3a94c fix: cap live tool prompt estimate per turn 2026-05-25 16:04:40 +08:00
Frank Song
85e13a6121 fix: reserve space for clarify dialogs 2026-05-25 15:58:27 +08:00
Frank Song
21e981a166 test: cover metadata-only profile routing 2026-05-25 15:50:47 +08:00
fxd-jason
5b6e1e1477 fix: restore messages.js from upstream to fix inflight stream tests 2026-05-25 15:27:57 +08:00
fxd-jason
dd09e1c2a8 Merge remote-tracking branch 'origin/master' into fix/compression-anchor-marker-based
# Conflicts:
#	tests/test_issue2028_compression_anchor_helpers.py
2026-05-25 15:23:17 +08:00
fxd-jason
90dfbf2f2d fix: marker-based compression anchor calculation
Instead of using len(visible_after)-1 (which points to the last visible
message and gets pushed behind the render window as more turns accumulate),
find the last [CONTEXT COMPACTION] marker in s.messages and compute the
anchor from visible messages before it.

This keeps the compression reference card at the correct boundary even
after 50+ subsequent turns have scrolled the render window past the old
anchor position.

Fixes a bug where the assistant's output message appeared to disappear
after automatic context compression because the reference card was placed
at the wrong position.
2026-05-25 15:16:26 +08:00
ai-ag2026
9e74072bf3 fix(chat): resolve stale compression parent routes 2026-05-25 08:54:46 +02:00
ai-ag2026
3009c0bf71 fix(chat): keep compression tip selected in sidebar 2026-05-25 08:28:12 +02:00
ai-ag2026
21655af09b fix(chat): accept session_id URL parameter 2026-05-25 07:59:21 +02:00
ai-ag2026
5b9484b816 fix(streaming): suppress visible progress echoes 2026-05-25 06:18:06 +02:00
ai-ag2026
17233293ac fix(chat): dedupe uploaded-file pending turns 2026-05-25 06:11:22 +02:00
Simonas Jakubonis
7aae822872 fix(compression): ignore tool output for compaction cards 2026-05-25 11:27:15 +08:00
nesquena-hermes
4ea762ae0d
Merge pull request #2903 from nesquena/release/stage-batch16
Release DF / v0.51.134 — stage-batch16 (Windows path defaults align with agent)
2026-05-24 19:07:57 -07:00
nesquena-hermes
cc8a79cec4 Stamp CHANGELOG for v0.51.134 (Release DF / stage-batch16)
Single-PR Windows-paths align fix:
- PR #2897 (chouzz) — align WebUI default state/config paths with Hermes Agent's
  %LOCALAPPDATA%\hermes on Windows. POSIX behavior unchanged.

Cherry-picked clean from contributor tip to dodge stale-base trap (net master→PR
delta was -2184 LOC due to ~2-week-old base).

Gates passed:
- Pre-Opus: Python ast.parse on api/config.py, api/profiles.py, new test file
- Stale-base check: cherry-picked diff matches contributor's actual change (6 files, +55/-17)
- Opus advisor: SHIP-AS-IS, Linux no-op invariant verified
- Full pytest sequential: 6540 passed, 6 skipped, 3 xpassed, 0 failures (179s)

Closes #2840.
2026-05-25 02:04:15 +00:00
nesquena-hermes
0645cfe7d2 chore(changelog): add Unreleased entry for #2897 Windows paths fix 2026-05-25 02:03:26 +00:00
george-andraws
e8d4a15d19 fix: keep underscores literal while streaming 2026-05-24 19:02:58 -07:00
Harlan Zhou
e8b426d825 test: avoid global env-coupled defaults regression 2026-05-25 01:58:32 +00:00
Harlan Zhou
f8a7726e09 fix(windows): align WebUI defaults with Hermes Agent home path 2026-05-25 01:58:32 +00:00
nesquena-hermes
75e0e67af2
Merge pull request #2900 from nesquena/release/stage-batch15
Release DE / v0.51.133 — stage-batch15 (6 low-risk contributor PRs)
2026-05-24 18:57:01 -07:00
nesquena-hermes
36cd8acb98 Stamp CHANGELOG for v0.51.133 (Release DE / stage-batch15)
Six-PR low-risk contributor batch:
- PR #2891 (franksong2702) — validate auxiliary model task slots
- PR #2892 (franksong2702) — gate workspace artifact mutation paths
- PR #2893 (franksong2702) — reject update apply with no targets
- PR #2895 (franksong2702) — preserve cached agent prefill context
- PR #2894 (franksong2702) — Joplin token in Authorization header
- PR #2896 (franksong2702) — localize third-party notes drawer copy

Pre-Opus gates: Python/JS syntax OK, no merge markers, all entries present.
Opus advisor: SHIP-AS-IS (no MUST-FIX, no SHOULD-FIX).
Full pytest sequential: 6545 passed, 6 skipped, 3 xpassed, 0 failures (174s).
2026-05-25 01:53:51 +00:00
nesquena-hermes
ba4f1e58ed chore(changelog): add missing #2892 Unreleased entry 2026-05-25 01:47:49 +00:00
nesquena-hermes
18c94ad324 Merge pull request #2896 — localize third-party notes drawer copy
# Conflicts:
#	CHANGELOG.md
2026-05-25 01:47:24 +00:00
nesquena-hermes
7e22c4edd5 Merge pull request #2894 — send Joplin token in Authorization header
# Conflicts:
#	CHANGELOG.md
2026-05-25 01:47:23 +00:00
nesquena-hermes
15dc7373c1 Merge pull request #2895 — preserve cached agent prefill context
# Conflicts:
#	CHANGELOG.md
2026-05-25 01:47:23 +00:00
nesquena-hermes
e8ab7410df Merge pull request #2893 — reject update apply with no selected target
# Conflicts:
#	CHANGELOG.md
2026-05-25 01:47:23 +00:00
nesquena-hermes
16983d3ab8 Merge pull request #2892 — gate workspace artifact read-only tool paths
# Conflicts:
#	CHANGELOG.md
2026-05-25 01:47:23 +00:00
nesquena-hermes
d513c4cd45 Merge pull request #2891 — validate auxiliary task slots 2026-05-25 01:46:49 +00:00
dobby-d-elf
5c21968158 adjust animation scaling 2026-05-24 19:09:31 -06:00
AJV20
894ad9ed90 Merge origin/master into feat/webui-prefill-script 2026-05-24 21:04:27 -04:00
Qi
7bd85405c9 perf(session): cumulative tail-window load for older history
_loadOlderMessages() previously fetched older messages with the legacy
index-cursor page (msg_before=_oldestIdx&msg_limit=30) and prepended
the page to S.messages. After #2716 the backend always runs the full
append-only merge for /api/session?messages=1 — the same merge as a
larger msg_limit on the same call — so we can ask for a larger
authoritative tail window directly instead of stitching pages on the
client.

Behavior

* Default request shape becomes msg_limit=currentLoaded+30. The newly
  exposed head of the response is what the user sees as 'older
  messages'. No new query parameters.
* msg_before remains supported by the backend and is retained in the
  client as a race-fallback path: if the returned tail no longer has
  the currently displayed messages as a suffix (because the session
  appended new messages mid-flight, or merge filtered something), the
  client issues the legacy msg_before page and prepends it instead.
  This preserves correctness under concurrent appends.
* Suffix-continuity uses the existing _sameTranscriptMessage helper,
  which tolerates timestamp drift and content-array reshapes.
* Existing race guards (loadingSessionId, S.session.session_id, and
  the _messagesGeneration snapshot from #1937) are reapplied after
  the fallback await.

Tests

Updated four static-string assertions in the existing scroll/viewport
tests to track the new mutation site (S.messages = nextMessages) and
the new msg_limit=requestedLimit shape, while still asserting that
msg_before remains in the body for the race-fallback path.

  pytest -q
    tests/test_older_history_viewport_preservation.py
    tests/test_parallel_session_switch.py
    tests/test_issue1937_endless_scroll_jumpstart_race.py
    tests/test_session_tail_payload.py
  -> 52 passed
  node --check static/sessions.js -> ok

Notes

Originally part of PR #2835. That PR was closed because of an
architectural conflict with #2716 on a different file (api/models.py
metadata-only path). #2716 left static/sessions.js untouched — this
change applies cleanly on post-#2716 master with no rebase work.
2026-05-25 01:01:45 +00:00
AJV20
d0a9d3e1ac docs(chat): clarify prefill as retrieval router 2026-05-24 21:00:49 -04:00
Frank Song
d2e4dfabb4 fix: localize external notes drawer copy 2026-05-25 08:51:44 +08:00
Frank Song
dc86841547 fix: send joplin token in auth header 2026-05-25 08:51:44 +08:00
Frank Song
535c238285 fix: preserve cached agent prefill context 2026-05-25 08:51:44 +08:00
Frank Song
3836b5eee0 fix: block update apply without targets 2026-05-25 08:51:44 +08:00
Frank Song
3c9b72f75a fix: gate workspace artifact mutation paths 2026-05-25 08:51:44 +08:00
Frank Song
826e719a29 fix: validate auxiliary model task slots 2026-05-25 08:51:44 +08:00
Roberto Villegas
4c4922a0d5
fix(webui): harden reasoning chip provider coverage 2026-05-24 18:42:44 -06:00
Roberto Villegas
d1471fbed7
fix(webui): resolve reasoning efforts for routed codex models 2026-05-24 18:42:44 -06:00
Roberto Villegas
91976a8fae
fix(ui): re-sync reasoning chip on model change with provider context
Model picker onchange now calls syncReasoningChip after session model/
provider updates, and dropdown selections pass providerId so duplicate
bare model ids resolve to the correct backend capabilities.

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-05-24 18:42:44 -06:00
Roberto Villegas
a9ce2889af
fix(ui): hide reasoning chip when model lacks effort levels
Resolve supported reasoning efforts per active model/provider and pass
that context through /api/reasoning so Composer and other non-configurable
models no longer show a misleading effort picker.

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-05-24 18:42:31 -06:00
Roberto Villegas
ef5eafcceb
fix(cursor-acp): route slash models and honor picker on new chat
Ensure cursor/composer IDs always resolve via @cursor-acp:, carry the
visible picker selection into POST /api/session/new, persist model
changes before a session exists, and evict cached agents on model switch.

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-05-24 18:42:20 -06:00
Roberto Villegas
aee376323f
feat(cursor-acp): add cursor-acp to WebUI model picker
- Add cursor-acp to _PROVIDER_DISPLAY with label 'Cursor ACP'
- Add cursor-acp static model list to _PROVIDER_MODELS
- composer-2.5, composer-2, default, cursor-acp
2026-05-24 18:42:04 -06:00
nesquena-hermes
4132085e0c
Merge pull request #2889 from nesquena/release/stage-batch14
Release/stage-batch14
2026-05-24 17:39:33 -07:00
nesquena-hermes
a1e5f89ce8 Stamp CHANGELOG for v0.51.132 (Release DD / stage-batch14)
4-PR low-risk batch:
- #2685 LumenYoung: replayed-context dedup fix + live tool prompt cap
- #2739 ai-ag2026: interrupted-response classification + SSE diagnostics
  (rate-limited 30/60s, 4KB body cap, payload sanitized)
- #2824 gavinssr: shutdown server affordance — relocated to Settings
- #2859 AJV20: passkey/WebAuthn sign-in (opt-in default-off behind
  HERMES_WEBUI_PASSKEY / webui_passkey_enabled feature flag)

Opus Advisor verdict: SHIP-WITH-SHOULD-FIXES applied.
Zero MUST-FIX. 4/5 SHOULD-FIX patched inline. 1 deferred to follow-up
(live tool metering cumulative cap).
2026-05-25 00:27:30 +00:00