Commit graph

2085 commits

Author SHA1 Message Date
Hermes Agent
43f86d038e stage-350: fix #2178 CI — update Ollama test assertion to match new allowOllamaFormat guard
PR #2178 added an 'allowOllamaFormat' guard (resolves to false for non-ollama
@-provider prefixes like '@custom:ai_gateway') to stop the ollama label
formatter from reformatting custom-provider model IDs with dashes. The
existing test asserted on the pre-PR code shape and didn't pick up the new
guard.

Updated the assertion to match the actual post-PR code at static/ui.js:2202,
with an extended docstring explaining the bug class the guard fixes (bare
custom-provider model IDs like 'Qwen3.6-35B-A3B' had hyphens stripped to
spaces + last letter lowercased by the formatter).
2026-05-13 20:45:44 +00:00
Hermes Agent
1f9520d3f9 Merge pull request #2178 into stage-350
fix(ui): custom models not displayed in model configuration list (hualong1009)
2026-05-13 20:44:55 +00:00
Hermes Agent
3f851051cf Merge pull request #2151 into stage-350
fix: clarify cancelled chat turn status (Jordan-SkyLF)

Conflict resolution on api/streaming.py:4549-4567 (the cancel-handler
ownership guard). Both this PR and the already-shipped PR #2136 add a
guard at the same site against stale stream writebacks, from different
angles:

  - PR #2136 (HEAD): _stream_writeback_is_current(_cs, stream_id) — strictly
    dominates by checking the active_stream_id token equality.
  - PR #2151: 'worker won the race' check via (active_stream_id != stream_id
    and not pending_user_message), with _emit_cancel_event = False to suppress
    the terminal cancel event.

Resolution merges both: keep #2136's strictly-stronger condition for skip
detection, and adopt #2151's _emit_cancel_event = False semantic so the
cancel event isn't emitted in addition to skipping the writeback (when
client may have already received the successful done payload).

55/55 tests pass across cancelled-turn-status + stale-stream-writeback +
the four cancel/data-loss sibling test files.
2026-05-13 20:44:44 +00:00
Hermes Agent
df3352eae3 Merge pull request #2192 into stage-350
fix(auth) 2/3: invalidate password hash cache when password changes via Settings panel (lucasrc, depends on #2191)
2026-05-13 20:42:52 +00:00
Hermes Agent
5f8b834833 Merge pull request #2193 into stage-350
fix(auth) 3/3: full HMAC digest with upgrade migration bridge + restore Secure cookie heuristic (lucasrc)
2026-05-13 20:41:38 +00:00
Hermes Agent
ca82f60144 Merge pull request #2191 into stage-350
fix(auth) 1/3: thread-safe login rate limiter + PBKDF2 key separation + transparent migration (lucasrc)
2026-05-13 20:41:36 +00:00
Hermes Agent
73b47ec4b5 Merge pull request #2203 into stage-350
Activity highlight animation (dobby-d-elf)
2026-05-13 20:41:35 +00:00
Hermes Agent
f94314e164 Merge pull request #2204 into stage-350
Fix opencode-go custom provider overlap routing (Michaelyklam, closes #1894)
2026-05-13 20:41:33 +00:00
nesquena-hermes
1a9234af7f
Merge pull request #2205 from nesquena/stage-349
stage-349: Tier 1 safe slice — #2201 reasoning_content whitelist + #2198 fork-from-here + #2200 Firefox sidebar scroll + #2202 provisional titles
2026-05-13 12:22:17 -07:00
Hermes Agent
67faed08dd stage-349: fix CHANGELOG inaccuracy — #2198 uses inline _oldestIdx+msgIdx, not a helper function
Opus advisor flagged that the original CHANGELOG entry referenced a
_fork_keep_count_for_anchor() helper that doesn't exist in the diff.
The actual fix is the inline (_oldestIdx + msgIdx) computation in
static/commands.js, captured BEFORE _ensureAllMessagesLoaded() resets
_oldestIdx. Updated the entry to match the code.
2026-05-13 19:19:11 +00:00
Lucas Coutinho
fe4689e280 test(auth): merge invalidation tests into hash cache test file, remove duplicate 2026-05-13 16:17:44 -03:00
Michael Lam
1e17760a04 Fix opencode-go provider overlap routing
Closes #1894
2026-05-13 12:13:37 -07:00
dobby-d-elf
efce9ebdd6 Merge remote-tracking branch 'origin/master' into tools-animation-version-b
# Conflicts:
#	static/ui.js
2026-05-13 13:11:35 -06:00
Hermes Agent
da4b6122cd docs: CHANGELOG stage-349 — close v0.51.55, open Unreleased for Tier 1 (#2198 #2200 #2201 #2202) 2026-05-13 19:03:51 +00:00
Hermes Agent
7150e9fe70 Merge pull request #2202 into stage-349
feat: show early session titles on chat start (Jordan-SkyLF)
2026-05-13 19:03:03 +00:00
Hermes Agent
26e726c17e Merge pull request #2200 into stage-349
fix: stabilize Firefox session sidebar scrolling (Jordan-SkyLF)
2026-05-13 19:03:01 +00:00
Hermes Agent
97b60c68b8 Merge pull request #2198 into stage-349
Fix fork-from-here keep count for truncated sessions (Michaelyklam)
2026-05-13 19:02:59 +00:00
Hermes Agent
e990adf54e Merge pull request #2201 into stage-349
fix: preserve reasoning_content in API message whitelist (MrFant — fixes MiMo/DeepSeek/Kimi multi-turn 400)
2026-05-13 19:02:58 +00:00
dobby-d-elf
11d9687483 Polish version B Activity highlight sweep 2026-05-13 13:02:07 -06:00
Jordan SkyLF
0381294f1c feat: add early session provisional titles 2026-05-13 11:37:11 -07:00
Jordan SkyLF
2dfe765b60 fix: stabilize Firefox session sidebar scrolling 2026-05-13 11:30:06 -07:00
MrFant
520795fdd2 fix: preserve reasoning_content in API message whitelist
Providers like Xiaomi MiMo, DeepSeek, and Kimi require reasoning_content
to be echoed back on every assistant message in multi-turn conversations
with tool calls. Omitting it causes HTTP 400: 'The reasoning_content in
the thinking mode must be passed back to the API.'

The WebUI's _sanitize_messages_for_api() strips all fields not in
_API_SAFE_MSG_KEYS before sending conversation history to the LLM API.
reasoning_content was not in this whitelist, so it was silently dropped.

The CLI path (run_agent.py) is unaffected because it has its own
_copy_reasoning_content_for_api() logic that operates on raw message
dicts without going through this filter. This is why the same session
works from CLI but fails from WebUI with HTTP 400.

The fix adds 'reasoning_content' to _API_SAFE_MSG_KEYS so the field
passes through sanitization intact.
2026-05-14 02:29:17 +08:00
Lucas Coutinho
2a96fb4a5b fix(auth): update HMAC sig length assertion to 64 chars and rebase on PR1 2026-05-13 14:19:09 -03:00
Lucas Coutinho
b734d95bc0 test(auth): add regression tests for HMAC migration bridge (32→64 char) 2026-05-13 14:18:47 -03:00
Lucas Coutinho
7e6f7372d5 fix(auth): add type hint to verify_session() 2026-05-13 14:18:47 -03:00
Lucas Coutinho
9921bbb412 docs(auth): add X-Forwarded-Proto trust warning to _is_secure_context() 2026-05-13 14:18:47 -03:00
Lucas Coutinho
07a5fe0838 fix(auth): HMAC length migration bridge and restore Secure cookie heuristic
HMAC length: create_session() now emits a full 64-char HMAC-SHA256 hex
digest instead of the truncated 32-char form. verify_session() accepts
both lengths during a transition window so existing sessions survive the
upgrade without a forced global logout. The legacy 32-char branch can be
removed once the default 30-day session TTL has elapsed.

Secure flag: introduce _is_secure_context(handler) to encapsulate the
env-var override and heuristic. Restores the getpeercert / X-Forwarded-Proto
heuristic that was present before this refactor, keeping the env-var
override (HERMES_WEBUI_SECURE) on top for proxy deployments that need
explicit control. The bare `return False` stub that the previous commit
left in place silently broke Secure-cookie delivery for all reverse-proxy
users who never set the env var.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-05-13 14:18:47 -03:00
nesquena-hermes
f5be6e3a69
Merge pull request #2199 from nesquena/stage-348
stage-348: 9-PR contributor batch — docs/onboarding + compress fixes + steer badge + perf + thinking-card state + #2171 prefilter URL-marker patch
2026-05-13 10:11:12 -07:00
Lucas Coutinho
3daa12ceb0 test(auth): add cache invalidation regression tests for save_settings() 2026-05-13 14:09:39 -03:00
Hermes Agent
32ba73c816 stage-348: fix CI-vs-local divergence on Opus prefilter test
The original tests asserted on the final output of _redact_text(), which
exercises agent.redact.redact_sensitive_text() from the hermes-agent venv.
That function's URL-userinfo / query-param redaction is available locally
but not in the CI test environment (different agent install version).

Rewrite the tests to assert on the prefilter routing decision instead:
_might_contain_sensitive_text() must return True for URL-shaped strings.
That's the actual contract #2171 establishes and the regression Opus
flagged. The downstream agent redactor behavior is its own contract.

Sanity-checked: 5 of 6 URL cases fail when '://' marker reverted, all
pass when restored. 62 redaction tests total pass.
2026-05-13 17:08:53 +00:00
Lucas Coutinho
2bcf411519 fix(auth): invalidate password hash cache in save_settings() on password change 2026-05-13 14:08:37 -03:00
Michael Lam
c522384c6d Fix fork-from-here keep count for truncated sessions 2026-05-13 09:57:40 -07:00
Hermes Agent
7c2b2785e7 stage-348: apply Opus SHOULD-FIX-pre-merge — add '://' to _SENSITIVE_LOWER_MARKERS
Opus advisor flagged that PR #2171's credential prefilter only listed
specific DB scheme prefixes and form keys, letting OAuth callback URLs,
URL userinfo, signed-URL query params bypass the hard agent redactor.

Adding the generic '://' marker restores the WebUI-as-hard-safety-boundary
contract. Plain URLs without sensitive substrings still pass through
unchanged because the redactor itself only mutates sensitive substrings.

Regression-pinned with 5 new parametric cases in test_security_redaction.py
plus 1 negative-case companion. Verified test FAILS without the fix and
PASSES with it.
2026-05-13 16:54:36 +00:00
Hermes Agent
3bfa0fc885 docs: CHANGELOG stage-348 — close v0.51.54, open Unreleased for 9-PR contributor batch 2026-05-13 16:35:35 +00:00
Hermes Agent
39df1a1ef3 Merge pull request #2171 into stage-348
Trim session tail response overhead (franksong2702)
2026-05-13 16:34:43 +00:00
Hermes Agent
ef042ad8c2 Merge pull request #2188 into stage-348
fix: refresh context ring after compression (LumenYoung)
2026-05-13 16:34:42 +00:00
Hermes Agent
fbd1e27181 Merge pull request #2185 into stage-348
fix: prevent 404 on /api/session/compress/status during session switch (jasonjcwu)
2026-05-13 16:34:40 +00:00
Hermes Agent
479e388be8 Merge pull request #2182 into stage-348
fix: keep compression banner attached to the compaction marker (LumenYoung)
2026-05-13 16:34:39 +00:00
Hermes Agent
63a1855b95 Merge pull request #2187 into stage-348
feat: show steer messages in chat with visual badge (jasonjcwu, split from #2164)
2026-05-13 16:34:38 +00:00
Hermes Agent
785b1fe7e9 Merge pull request #2186 into stage-348
fix: prevent concurrent send() from losing messages or swallowing stream output (jasonjcwu, split from #2164)
2026-05-13 16:34:36 +00:00
Hermes Agent
5ba097c40b Merge pull request #2162 into stage-348
docs: refresh project snapshot and agent onboarding entrypoint (franksong2702)
2026-05-13 16:34:35 +00:00
Hermes Agent
acefaa180e Merge pull request #2190 into stage-348
fix: preserve thinking card state during reasoning updates (xz-dev)
2026-05-13 16:34:34 +00:00
Hermes Agent
3c20e102df Merge pull request #2189 into stage-348
fix: keep background metering from overwriting visible session usage (xz-dev)
2026-05-13 16:34:32 +00:00
Lucas Coutinho
978dbc15d8 fix(auth): correct misleading cache invalidation comment in verify_password() 2026-05-13 12:48:35 -03:00
Lucas Coutinho
8ca29618fe fix(auth): tighten except to OSError, add type hints, fix test imports 2026-05-13 12:27:27 -03:00
dobby-d-elf
f6a5fc2885 Widen version B Activity highlight sweep 2026-05-13 09:21:59 -06:00
dobby-d-elf
a183378a05 Refine version B Activity highlight sweep 2026-05-13 08:17:12 -06:00
Lucas Coutinho
720e69cb83 fix(auth): cache signing and PBKDF2 keys in memory, remove migration side-effect call 2026-05-13 11:13:23 -03:00
dobby-d-elf
3640cd8edf Version B: use gold Activity highlight sweep 2026-05-13 08:08:49 -06:00
dobby-d-elf
a60c222e76 Version A: tune Activity sweep animation 2026-05-13 08:07:52 -06:00