Commit Graph

3034 Commits

Author SHA1 Message Date
nesquena-hermes fe9d95e22b stage-batch17: skip #2927 test file when hermes-agent module not available (CI fix) 2026-05-25 17:11:59 +00:00
nesquena-hermes 41e424b3d5 stage-batch17: stamp v0.51.135 / Release DG 2026-05-25 17:06:27 +00:00
nesquena-hermes fa9881445a stage-batch17: backfill CHANGELOG entries for #2906 and #2940 2026-05-25 17:03:00 +00:00
nesquena-hermes f7ff8b5297 Merge pull request #2919
# Conflicts:
#	CHANGELOG.md
2026-05-25 17:02:33 +00:00
nesquena-hermes bf28f400ec Merge pull request #2921
# Conflicts:
#	CHANGELOG.md
2026-05-25 17:02:16 +00:00
nesquena-hermes 67b41b2b54 Merge pull request #2927 2026-05-25 17:02:02 +00:00
nesquena-hermes fdb0ccb392 Merge pull request #2940 2026-05-25 17:02:02 +00:00
nesquena-hermes 84218ce5a9 Merge pull request #2936
# Conflicts:
#	CHANGELOG.md
2026-05-25 17:02:02 +00:00
nesquena-hermes d86aa6013f Merge pull request #2906 2026-05-25 17:01:47 +00:00
nesquena-hermes da25aad946 Merge pull request #2912
# Conflicts:
#	CHANGELOG.md
2026-05-25 17:01:47 +00:00
nesquena-hermes c876724ff4 Merge pull request #2922 2026-05-25 17:01:32 +00:00
nesquena-hermes 6b80df8252 Merge pull request #2917 2026-05-25 17:01:27 +00:00
george-andraws fe597c1cdf fix chat upload attachment paths 2026-05-25 09:12:14 -07:00
Frank Song aa6daf82f2 fix(gateway): treat active sessions as configured 2026-05-25 21:48:51 +08:00
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
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 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
ai-ag2026 21655af09b fix(chat): accept session_id URL parameter 2026-05-25 07:59:21 +02:00
ai-ag2026 17233293ac fix(chat): dedupe uploaded-file pending turns 2026-05-25 06:11:22 +02: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)
v0.51.134
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
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)
v0.51.133
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
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
nesquena-hermes 4132085e0c Merge pull request #2889 from nesquena/release/stage-batch14
Release/stage-batch14
v0.51.132
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
nesquena-hermes 1c2d574882 Stage-batch14: Opus advisor SHOULD-FIX patches (UX + defense-in-depth)
Inline fixes for 4 of 5 Opus SHOULD-FIX items before tag:

1. /api/auth/status now gates passkeys_enabled / passwordless_enabled on
   _passkey_feature_flag_enabled() — when flag is off, status reports
   no credentials even if passkeys.json has legacy entries. New
   passkey_feature_flag field added to the response for the frontend.

2. Settings → System Passkeys block (passkeysSettingsBlock) now starts
   display:none and loadPasskeys() reveals it only when the server
   confirms passkey_feature_flag === true AND /api/auth/passkeys
   doesn't return {disabled: true}. Stops the broken-affordance trap
   where users would see Add passkey → click → 404.

3. /api/settings/save now refuses to set passwordless mode when the
   passkey feature flag is off. Closes the auth-bypass path Opus flagged:
   user goes passwordless while flag on → admin unsets flag → restart
   serves the WebUI fully unauthenticated.

4. CHANGELOG entries added for PR #2685 (replayed-context dedup +
   per-turn metering cap) and PR #2824 (Stop server affordance,
   relocated to Settings) — both PRs had functional changes but no
   release-notes entries. Also enriched the rate-limit detail on the
   #2739 entry (30 events / 60s / 4KB body cap).

Deferred to follow-up issue (#5 in Opus review):
- Live tool metering cumulative cap across many tool calls — non-trivial
  refactor of _bump_live_prompt_estimate, will be a separate PR
2026-05-25 00:26:40 +00:00
nesquena-hermes 8c170b50ac Stage-batch14: i18n parity for new shutdown keys
Adds the 7 shutdown-related i18n keys to all 10 non-en/tr locales
(it, ja, ru, es, de, zh, zh-Hant, pt, ko, fr) with proper translations.

Resolves test_*_locale.py::test_*_locale_covers_english_keys failures
that were caught by full sequential pytest. Locale parity is enforced
because untranslated keys would surface in non-en deployments as
English fallback text in the Stop Server affordance.

Italian + Portuguese translations use \' to escape apostrophes inside
the single-quoted JS string literals.
2026-05-25 00:22:15 +00:00
nesquena-hermes 19c6e5d5f2 Stage-batch14: update passkey test for HERMES_WEBUI_PASSKEY feature flag
test_passwordless_mode_keeps_auth_enabled_with_passkeys now sets
HERMES_WEBUI_PASSKEY=1 via monkeypatch since are_passkeys_enabled()
gates on the feature flag.

Adds 2 new tests:
- test_passkey_feature_flag_off_disables_passkeys_even_with_credentials
- test_passkey_feature_flag_via_config
2026-05-25 00:17:11 +00:00
nesquena-hermes 46ed70bfde Stage-batch14: add HERMES_WEBUI_PASSKEY feature flag for #2859 passkey support
Per the stage-batch14 ship plan, passkey/WebAuthn support is shipped
opt-in default-off behind an explicit feature flag so deployments can
disable the entire surface (UI + endpoints + credential storage) without
needing to delete code.

Enable via either:
  - HERMES_WEBUI_PASSKEY=1 environment variable, OR
  - webui_passkey_enabled: true in config.yaml

With the flag off:
  - are_passkeys_enabled() returns False even if credentials exist
  - is_auth_enabled() falls back to password-only checking
  - /login renders password-only (no passkey button)
  - All 6 /api/auth/passkey/* endpoints return 404 with a clear message
  - Settings → System → Passkeys section is hidden

Mirrors the #2527 notes-drawer flag shape (env-or-config, truthy parse).
Auth is high-stakes; opt-in lets us land the code while keeping default
deployments on the well-tested password-only path.

Touches: api/auth.py (new _passkey_feature_flag_enabled helper, gated
are_passkeys_enabled), api/routes.py (6 endpoint guards).
2026-05-25 00:16:12 +00:00
AJV20 1b48643f63 feat: support passkey-only auth 2026-05-25 00:14:38 +00:00
AJV20 7c257ae8f9 fix: avoid prompt in passkey registration 2026-05-25 00:14:38 +00:00