Commit Graph
100 Commits
Author SHA1 Message Date
nesquena-hermesandnesquena-hermes 71584418a8 Release: upgrade bundled SQLite to 3.53.0 (WAL-reset fix, secure_delete preserved) (#6900, @qxxaa) (#7043)
Co-authored-by: nesquena-hermes <agent@nesquena-hermes>
2026-08-14 20:16:20 -07:00
nesquena-hermesandnesquena-hermes 7506884d29 Release: bound long-session memory to prevent tab-focus OOM (#7006, @webtecnica) (#7042)
Co-authored-by: nesquena-hermes <agent@nesquena-hermes>
2026-08-14 19:44:38 -07:00
nesquena-hermesandnesquena-hermes 95f05c5147 Release: composer auto-dismisses transient Reconnected status pill (#7028, @starship-s) (#7041)
Co-authored-by: nesquena-hermes <agent@nesquena-hermes>
2026-08-14 18:34:28 -07:00
nesquena-hermesandnesquena-hermes ae075ba188 docs(changelog): boot script no longer fabricates appearance choice on fresh browser (#6808) (#7029)
Co-authored-by: nesquena-hermes <nesquena-hermes@users.noreply.github.com>
2026-08-14 18:41:06 +00:00
nesquena-hermesandnesquena-hermes dd44aa9830 docs(changelog): ja-locale profile wording consistency (#6762) (#7026)
Co-authored-by: nesquena-hermes <nesquena-hermes@users.noreply.github.com>
2026-08-14 16:48:28 +00:00
nesquena-hermesandnesquena-hermes 0dc9cc381c docs(changelog): suppress reserved [SILENT] control turns at ingress (#7018) (#7020)
Co-authored-by: nesquena-hermes <nesquena-hermes@users.noreply.github.com>
2026-08-14 12:41:19 +00:00
nesquena-hermesandnesquena-hermes 91356b7c3f docs(changelog): kanban sidebar-eviction fix (#6998) (#7016)
Co-authored-by: nesquena-hermes <nesquena-hermes@users.noreply.github.com>
2026-08-14 10:41:12 +00:00
nesquena-hermesandnesquena-hermes b58ea15e31 docs(changelog): translate workspace-sort keys in 14 locales (#6910) (#7014)
Co-authored-by: nesquena-hermes <nesquena-hermes@users.noreply.github.com>
2026-08-14 05:40:23 +00:00
nesquena-hermesandnesquena-hermes 69fb748f73 docs(changelog): streaming session-scope render guard (#6502) (#7012)
Co-authored-by: nesquena-hermes <nesquena-hermes@users.noreply.github.com>
2026-08-14 05:03:33 +00:00
nesquena-hermesandnesquena-hermes fe8fc067aa docs(changelog): first-response jump scroll-settle fix (#6621) (#7011)
Co-authored-by: nesquena-hermes <nesquena-hermes@users.noreply.github.com>
2026-08-14 04:18:49 +00:00
nesquena-hermesandnesquena-hermes 5a68684fc7 docs(changelog): 402 exhausted-TTL fast recovery (#6626) (#7010)
Co-authored-by: nesquena-hermes <nesquena-hermes@users.noreply.github.com>
2026-08-14 03:16:43 +00:00
nesquena-hermesandnesquena-hermes 7c1239dbe7 docs(changelog): stamp v0.52.113 stable section (promotion) (#7009)
Co-authored-by: nesquena-hermes <nesquena-hermes@users.noreply.github.com>
2026-08-13 19:43:40 -07:00
5b0246de61 Release: preserve intentional transcript shrinks (#6954) (#6997)
* fix(session): preserve intentional transcript shrinks

* fix(session): validate shrink generations

* docs(changelog): stamp #6954 (preserve intentional transcript shrinks)

---------

Co-authored-by: Frank Song <franksong2702@gmail.com>
Co-authored-by: nesquena-hermes <nesquena-hermes@users.noreply.github.com>
2026-08-13 20:44:06 +00:00
07118df53c Release: multi-container Docker gateway API forwarding (#6917) (#6995)
* feat(docker): enable gateway API and password forwarding in compose files

- Added API_SERVER_KEY forwarding to enable the gateway API listener in multi-container setups.
- Configured HERMES_WEBUI_PASSWORD to ensure password authentication works as expected.
- Updated documentation to clarify API_SERVER_KEY requirements and forwarding behavior.
- Added regression tests to cover the new functionality and ensure proper configuration.

* build(docker): force LF line endings for shell scripts via .gitattributes

A CRLF shebang (#!/bin/bash\r) breaks locally-built Docker images: the
kernel can't resolve the interpreter /bin/bash\r, so 'docker compose up
-d --build' on Windows with core.autocrlf=true fails with
'exec /hermeswebui_init.bash: no such file or directory'. The repo blobs
and CI/GHCR builds are LF and unaffected; only Windows local builds
baked the CRLF checkout into the image.

* fixup(docker): dedup API_SERVER_HOST after rebase onto #6968 (which already added it)

* docs(changelog): stamp #6917 (multi-container gateway API forwarding)

---------

Co-authored-by: Yang <yang_qwq@qq.com>
Co-authored-by: nesquena-hermes <nesquena-hermes@users.noreply.github.com>
2026-08-13 18:21:14 +00:00
0b69346970 Release: provider-filter + memory diagnostics (#6338 #6363) (#6994)
* fix(#6335): filter unconfigured providers from model selector

When a known provider (e.g. openai-api) is listed in config.yaml's
providers section with only metadata (name, display_name) and no route
configuration or credentials, it should not appear in the chat model
selector dropdown.

Previously, any provider recognised as a 'known provider' (present in
_PROVIDER_MODELS or _PROVIDER_DISPLAY) would be admitted to the picker
simply by being listed in the config.yaml providers block — even after
the user removed its API key.  This caused a persistent ghost provider
entry in the dropdown (#6335).

The fix gates known-provider admission on credential evidence: the
provider must already have been detected from a credential source (env
vars, hermes auth, or credential pool) OR carry explicit route
configuration (api/base_url/api_key/key_env) OR be the active provider
with a configured models allowlist.

* fix(#6338): normalize provider aliases in credential check

The credential check compared _canonical (config key like 'x-ai',
'google') directly against detected_providers (alias-resolved values
like 'xai', 'gemini').  Alias-named authenticated providers were
therefore incorrectly treated as unconfigured and removed from the
model selector.

Fix: resolve _canonical through _resolve_provider_alias() before the
membership test, so config keys like 'x-ai' match credential evidence
reported as 'xai'.  Also check the raw canonical for cases where the
config key is itself the alias target.

Refs: #6335, #6338

* fix(#6338): normalize detected_providers through alias resolver

Normalize both _canonical and detected_providers entries through
_resolve_provider_alias before the membership test, so that a WebUI
canonical form in detected_providers (e.g. x-ai added by a prior
loop iteration) also matches the alias-resolved form used in
credential detection (e.g. xai from hermes_cli).

This is belt-and-braces on the existing _resolve_provider_alias(_canonical)
check: both sides now map into the same alias-resolved namespace,
closing any edge case where detected_providers contains a WebUI-canonical
form that happens to differ from the alias target.

* test(ui): catalog-admission regression for credentialed providers (#6338)

* test(ui): pin config path state in catalog-admission regression (#6338)

* fix(system-health): expose runtime memory diagnostics without blocking owner locks (#6351)

* fix(system-health): keep owner contention local to runtime status (#6351)

* docs(changelog): stamp #6338 #6363 (certified batch)

---------

Co-authored-by: webtecnica <webtecnica@users.noreply.github.com>
Co-authored-by: webtecnica <webtecnica@gmail.com>
Co-authored-by: Rod Boev <rod.boev@gmail.com>
Co-authored-by: nesquena-hermes <nesquena-hermes@users.noreply.github.com>
2026-08-13 17:47:46 +00:00
f556cf349e Release: chat stream scroll-bounce fix (#6257) (#6993)
* fix(stream): preserve fade nodes while prose is live

* fix(stream): preserve transparent fade nodes like assistant prose

The transparent-activity prose path (transparent_stream mode) kept the
pre-PR fade cleanup: _bindTransparentFadeCleanup() in static/ui.js still
replaced every animated stream-fade-word span with a fresh text node on
animationend, invalidating the native scroll anchor while the row is
still growing.

Mirror the messages.js fix so both live prose paths share one
node-preserving cleanup: remove only the transient is-new class and the
--stream-fade-ms inline property, keeping span identity until final
settlement rebuilds the persisted DOM.

Extend tests/test_smooth_text_fade.py with a sibling regression that
extracts the production _bindTransparentFadeCleanup() from ui.js and
fires animationend, asserting no replacement, is-new removal,
stream-fade-word retention, and timing-override cleanup (plus
source-string guards against replaceWith in the cleanup block). The new
test is red-before-green against the previous ui.js implementation.

* docs(changelog): stamp #6257 (stream fade scroll-bounce fix)

---------

Co-authored-by: Anthony Ruiz <ruizanthony@users.noreply.github.com>
Co-authored-by: nesquena-hermes <nesquena-hermes@users.noreply.github.com>
2026-08-13 17:40:54 +00:00
83b5ccb0fe Release: CJK full-width punctuation autolink fix (#6792) (#6991)
* fix(renderer): exclude CJK full-width punctuation from autolink URLs

* fix(test): widen autolink block search window for CJK punctuation fix (#6792)

The CJK full-width punctuation fix expanded the autolink regex and
comment text, pushing target='_blank' and esc(clean) beyond the 600/
700-char search windows in tests.  Widen to 1200 chars.

* fix(test): widen autolink window in test_issue470 to match 1200-char block

The CJK punctuation fix added comment lines that pushed href="${clean}"
beyond the 600-char search window in test_issue470.py::test_autolink_no_esc_on_href,
causing the same failure across 3.11/3.12/3.13 shard-4. test_issue342.py was
already widened in cc52202f; apply the same 1200-char window here.

* fix(test): drive real renderMd() for CJK full-width autolink behaviour

Replace the test-owned FIXED_REGEX copy in test_fullwidth_autolink.js with
a pytest + node harness that extracts and runs the ACTUAL renderMd() from
static/ui.js (same driver pattern as test_renderer_js_behaviour.py).

Coverage per review:
- every CJK trailing mark (),。;:!?、) through both the outer
  paragraph pass and the inline pass (list items + blockquotes)
- ASCII trailing marks (regression guard)
- normal URLs with query params (href keeps raw &, text is escaped)
- Markdown links and pre-existing anchors are stashed, never re-wrapped

Reverse-verified: reverting the \uFF09 exclusion + CJK strip makes 27 of
38 assertions fail on the real production code.

* fix(test): drop stray f-prefix from placeholder-free asserts (F541)

* docs(changelog): stamp #6792 (CJK autolink punctuation)

---------

Co-authored-by: happy5318 <happy5318@users.noreply.github.com>
Co-authored-by: nesquena-hermes <nesquena-hermes@users.noreply.github.com>
2026-08-13 17:08:40 +00:00
e7ac9f09fd Release: mobile drawer + terminal-backend cache fixes (#6921 #6933 #6671 #6175) (#6990)
* fix: include terminal backend identity in agent cache signature (#5937) (#6175)

* fix(mobile): preserve extension panels in drawer sync

* fix: close mobile sidebar drawer when opening main-view create forms

The add-space/new-profile/new-skill/new-cron forms render in the main
view, which on phones is covered by the full-screen sidebar drawer
(z-index 200). Opening one from inside the drawer only focused the
input (keyboard popped up) while the form stayed hidden underneath.

- openWorkspaceCreate / openProfileCreate / openSkillCreate /
  openCronCreate now close the drawer after rendering the form,
  mirroring their *_Detail siblings.
- move the fromRailClick drawer re-open in switchPanel() into the
  synchronous section: it used to run after await loadXxxPanel(),
  racing (and re-opening over) a drawer close issued from inside the
  drawer during the panel load window.

Verified in Playwright (390x844): drawer closes and stays closed after
plus-click, form visible with focus on the path input; desktop (1280x800)
unchanged; 83 mobile + 26 workspace tests pass.

* fix: close mobile sidebar after project quick-create plus

The per-project '+' button (_attachProjectQuickCreateButton) created the
new project conversation but never closed the mobile sidebar drawer, so on
phones the tap looked like a no-op: the session was created, just hidden
underneath the full-screen drawer (z-index 200).

Close the drawer in the success path after the sidebar repaint, mirroring
$('btnNewChat').onclick in boot.js and the #5409 close in
_openSidebarSession. Failure path keeps the drawer open so the error toast
stays visible for retry.

Adds static regression tests pinning the guarded close call and its
position after the repaint.

* test: pin quick-create drawer close to the success path (try block)

Greptile review note: the string-presence and ordering assertions alone
would still pass if the guarded closeMobileSidebar call were moved into
the later catch branch, silently reintroducing the mobile drawer bug.

Add an explicit assertion that the close sits before the success-path
catch(err), so a regression that moves it into the failure branch is
caught.

* docs(changelog): stamp batch1-p1 (#6921 #6933 #6671 #6175)

---------

Co-authored-by: webtecnica <75556242+webtecnica@users.noreply.github.com>
Co-authored-by: Rodrigo Gomes da Silva <rodrigo.smscom@gmail.com>
Co-authored-by: silent-reader-cn <silent-reader-cn@users.noreply.github.com>
Co-authored-by: nesquena-hermes <nesquena-hermes@users.noreply.github.com>
2026-08-13 16:41:32 +00:00
nesquena-hermes 7d0bc4b6a5 Merge pull request #6981 from nesquena/release/stage-6979-1786619874
Release: per-message media preview snapshots (#6979)
2026-08-13 04:23:23 -07:00
nesquena-hermes 0fc0ebb2b7 Merge pull request #6977 from nesquena/release/stage-6968-1786605449
Release: multi-container Docker agent API reachability (#6968)
2026-08-13 00:23:39 -07:00
nesquena-hermes 8540583d95 Merge pull request #6971 from nesquena/release/stage-6922-1786592110
Release: media ETag revalidation + post-commit error containment (#6922)
2026-08-12 20:40:31 -07:00
nesquena-hermes f3e0e29815 Merge pull request #6969 from nesquena/release/stage-6966-1786581547
Release: de-dup session title on collision (#6964)
2026-08-12 17:44:22 -07:00
nesquena-hermes 3d1e2f1204 Merge pull request #6967 from nesquena/release/stage-6944-1786574898
Release: preserve custom-provider model identity (#6944)
2026-08-12 15:53:35 -07:00
nesquena-hermes 5defcfedfe Merge pull request #6965 from nesquena/release/stage-6947-1786567873
Release: guard persist_user_timestamp kwarg for older-agent compat (#6935)
2026-08-12 14:02:26 -07:00
nesquena-hermes 8fb95b43a7 Merge pull request #6960 from nesquena/release/stage-6892-1786560706
Release: sync session titles to state.db (#6892)
2026-08-12 11:57:04 -07:00
nesquena-hermes 483772b44b Merge pull request #6941 from nesquena/release/stage-6938-1786517565
Release: clear stale compression UI state on session switch (#6938)
2026-08-11 23:58:06 -07:00
nesquena-hermes e9f1e2a459 Merge pull request #6934 from nesquena/release/stage-6932-1786470719
Release: search skills by keyword in slash-command autocomplete (#6932)
2026-08-11 10:57:28 -07:00
nesquena-hermes 3c7fbe3809 Merge pull request #6926 from nesquena/release/stage-6924-1786445624
Release: extension turn-lifecycle events (#6924)
2026-08-11 04:03:34 -07:00
nesquena-hermes cefcb21b29 Merge pull request #6918 from nesquena/release/stage-6795-1786419322
Release: cooperative extension identity handle (#6795)
2026-08-10 20:39:44 -07:00
nesquena-hermes bf9b61ff3d Merge pull request #6915 from nesquena/release/stage-6410-1786414679
Release exp-v0.52.198: Refine selected transcript text in composer (#6410, @rodboev)
2026-08-10 20:09:41 -07:00
nesquena-hermes 3ea7964a50 Merge pull request #6914 from nesquena/release/stage-6757-1786414089
Release exp-v0.52.197: preserve api_content for agent replay (#6757, @franksong2702)
2026-08-10 20:02:52 -07:00
nesquena-hermes dbbccfaa2a Merge pull request #6916 from nesquena/fix/layout-scrollable-offviewport-1786415762
Release exp-v0.52.197: layout helper — don't flag scroll-reachable fields as off-viewport
2026-08-10 19:56:33 -07:00
nesquena-hermes 728ec10e66 Merge pull request #6907 from nesquena/release/stage-6037-1786396633
Release exp-v0.52.196: Transparent Stream copy feedback (#6037, @Stacey2911)
2026-08-10 14:29:04 -07:00
nesquena-hermes c37d0568ae Merge pull request #6905 from nesquena/release/stage-6055b-1786393156
Release exp-v0.52.195: per-board default workspace path (#6055, @rodboev)
2026-08-10 13:55:07 -07:00
nesquena-hermes bc6e01afad Merge pull request #6901 from nesquena/release/stage-6091-1786388870
Release exp-v0.52.194: workspace file-tree sort selector (#6091, @rodboev)
2026-08-10 12:34:18 -07:00
nesquena-hermesandnesquena-hermes bd91b649f1 Release exp-v0.52.193: a11y aria-expanded clear on panel switch (#6656, @rodrigogs) (#6887)
Co-authored-by: nesquena-hermes <nesquena-hermes@users.noreply.github.com>
2026-08-09 21:46:31 +00:00
nesquena-hermesandnesquena-hermes 192df903c8 Release exp-v0.52.192: session-aware image-input routing (#6882, @happy5318) (#6883)
Co-authored-by: nesquena-hermes <nesquena-hermes@users.noreply.github.com>
2026-08-09 16:10:26 +00:00
nesquena-hermesandnesquena-hermes d42dae81a8 Release: mark running cron sessions active in sidebar (#6734, @webtecnica) (#6879)
Co-authored-by: nesquena-hermes <nesquena-hermes@users.noreply.github.com>
2026-08-09 09:41:53 +00:00
nesquena-hermesandnesquena-hermes 1af7eb5b16 Release: honor auxiliary.title_generation.enabled=false in WebUI (#6877, @X-Shihai) (#6878)
Co-authored-by: nesquena-hermes <nesquena-hermes@users.noreply.github.com>
2026-08-09 07:36:57 +00:00
nesquena-hermesandnesquena-hermes 0b839f7ef8 Release: honor persisted auto-follow across settings-fetch failures (#6856, @sand01chi) (#6873)
Co-authored-by: nesquena-hermes <nesquena-hermes@users.noreply.github.com>
2026-08-09 03:38:05 +00:00
nesquena-hermesandnesquena-hermes c354c13c7d Release: hide kanban worker sessions from the default sidebar (#6780, @vduke) (#6872)
Co-authored-by: nesquena-hermes <nesquena-hermes@users.noreply.github.com>
2026-08-09 02:55:15 +00:00
nesquena-hermesandnesquena-hermes eb04bf5951 Release exp-v0.52.187: reject obsolete cancel finalizer after successor completes (#6636, @webtecnica) (#6868)
Co-authored-by: nesquena-hermes <nesquena-hermes@users.noreply.github.com>
2026-08-09 01:12:19 +00:00
nesquena-hermesandnesquena-hermes 614b5c9f48 Release exp-v0.52.186: stop full-message fade replay on tool-call rewind (#6783, @silent-reader-cn) (#6866)
Co-authored-by: nesquena-hermes <nesquena-hermes@users.noreply.github.com>
2026-08-08 23:40:08 +00:00
nesquena-hermesandnesquena-hermes 44fca1e9a4 Release exp-v0.52.185: preserve displayed conclusion in session forks (#6735, @ruizanthony) (#6865)
Co-authored-by: nesquena-hermes <nesquena-hermes@users.noreply.github.com>
2026-08-08 22:58:49 +00:00
nesquena-hermesandnesquena-hermes 51e3d09ad6 Release exp-v0.52.184: three-font typography contract (#5918, @starship-s) (#6864)
Co-authored-by: nesquena-hermes <nesquena-hermes@users.noreply.github.com>
2026-08-08 22:51:42 +00:00
nesquena-hermesandnesquena-hermes 84f9be2088 Release exp-v0.52.183: phantom compression barrier (#6572) + same-session renotify (#6681) (#6863)
Co-authored-by: nesquena-hermes <nesquena-hermes@users.noreply.github.com>
2026-08-08 22:13:46 +00:00
nesquena-hermesandnesquena-hermes 0d37067123 Release exp-v0.52.182: isolate update_channel writes from generic autosave (#6666, @rodboev) (#6861)
Co-authored-by: nesquena-hermes <nesquena-hermes@users.noreply.github.com>
2026-08-08 20:38:37 +00:00
nesquena-hermesandnesquena-hermes 7a94e34a6d Release exp-v0.52.181: compact active recovery snapshot transport (#6858, @allenliang2022) (#6860)
Co-authored-by: nesquena-hermes <nesquena-hermes@users.noreply.github.com>
2026-08-08 19:12:33 +00:00
7f27942393 Release exp-v0.52.180: don't drop async delegation completions while origin session busy (#6632 + #6662) (#6852)
* fix: preserve async completion delivery attempts while busy

* fix(async): keep legacy busy completions retryable

* fix(async): extend keep_legacy_retrying to resolved-target transient-failure exits; keep formatting failures bounded (combined #6632+#6662 gate findings)

* Release exp-v0.52.180: don't drop async delegation completions delivered while origin session busy (#6632, #6662)

---------

Co-authored-by: nesquena-hermes <nesquena-hermes@users.noreply.github.com>
Co-authored-by: ai-ag2026 <261867348+ai-ag2026@users.noreply.github.com>
2026-08-08 00:14:21 -07:00
21a8160338 Release exp-v0.52.179: gateway watcher index-covered fingerprint + failure-state preservation (#6821) (#6850)
* perf: keep gateway watcher fingerprint index-covered

* [verified] fix: preserve watcher state on projection failure

* Release exp-v0.52.179: keep gateway watcher fingerprint index-covered + preserve state on projection failure (#6821)

---------

Co-authored-by: StefanPieter <stefan@noble-pro.com>
Co-authored-by: nesquena-hermes <nesquena-hermes@users.noreply.github.com>
2026-08-07 23:18:33 -07:00
c1fc3f2c79 Release exp-v0.52.178: honor configured appearance defaults for no-settings-file users (#6834) (#6849)
* fix(settings): _SETTINGS_DEFAULTS theme/skin never reach a user with no settings file

`_read_raw_settings_file()` returns `{}` for a MISSING settings.json. `{}` is a
dict, so `load_settings()` always took its `isinstance(stored, dict)` arms:

    settings["theme"], settings["skin"] = _normalize_appearance(
        stored.get("theme") if isinstance(stored, dict) else settings.get("theme"),
        stored.get("skin") if isinstance(stored, dict) else settings.get("skin"),
    )

`stored.get("theme")` is then None, `_normalize_appearance(None, None)` falls
through to its unknown-theme branch, and the result is ("dark", "default").
`_SETTINGS_DEFAULTS["theme"]` and `["skin"]` are therefore unreachable for the
one case they exist to serve: a user who has no settings file yet.

This is invisible on the shipped defaults, because dark/default is exactly what
the fallback produces — the two paths agree, so nothing ever caught it. It only
surfaces once the defaults are changed, at which point the dict silently does
nothing: a deployment (or fork, or a future change to the shipped values) sets an
appearance and every new user still gets dark.

The fix falls back to the defaults instead of to None, gated on the PAIR of
keys. Per-field (`or settings.get(...)`) looks equivalent and is not: with a
stored legacy theme and no stored skin, `slate` normalises to ("dark", "slate"),
but per-field fallback injects the default skin and returns ("dark", "default"),
silently dropping the legacy migration. That is the same absent-vs-explicit
distinction the boot script draws in #6808 — this is its server-side half. #6808
stops the browser fabricating a choice; without this, the server still answers
with the fallback rather than the configured default.

Behaviour on stock defaults is provably unchanged: `_normalize_appearance(None,
None)` and `_normalize_appearance("dark", "default")` both return
("dark", "default"). A stored preference is untouched in every case.

13 tests. Both directions are pinned, and both were checked by injection:
reverting api/config.py fails exactly the two "defaults are honoured" cases and
nothing else; substituting the per-field variant fails 8, including four of the
five legacy migrations. Ran the full settings/appearance surface — 61 test files,
873 passed.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>

* Release exp-v0.52.178: honor configured appearance defaults for users with no settings file (#6834)

---------

Co-authored-by: Hermes Agent <hermes@aip.de>
Co-authored-by: Claude Opus 5 <noreply@anthropic.com>
Co-authored-by: nesquena-hermes <nesquena-hermes@users.noreply.github.com>
2026-08-07 23:06:57 -07:00
80e3574eca Release exp-v0.52.177: scope aux-title test module stubs (#6661) (#6848)
* test(#6630): isolate auxiliary client fixtures

* test(#6630): route both aux-title suites through one scoped module stub

* test(#6630): drop dead import and record the patch.dict restore constraint

* Release exp-v0.52.177: scope auxiliary-title test module stubs, stop cross-file sys.modules leak (#6661)

---------

Co-authored-by: Rod Boev <rod.boev@gmail.com>
Co-authored-by: nesquena-hermes <nesquena-hermes@users.noreply.github.com>
2026-08-07 22:47:51 -07:00
5e5a41e79f Release exp-v0.52.176: start profile list-cache TTL after row build (#6846) (#6847)
* fix(profiles): start list cache TTL after row build

Slow row builds currently consume the cache TTL before the result is stored.
Timestamp the cache at completion so every successful build receives the full TTL.

Refs #5364

Assisted-by: Hermes Agent:gpt-5.6-sol
Assisted-by: Codex:gpt-5.6-luna

* Release exp-v0.52.176: start profile list-cache TTL after row build (#6846)

---------

Co-authored-by: starship-s <45587122+starship-s@users.noreply.github.com>
Co-authored-by: nesquena-hermes <nesquena-hermes@users.noreply.github.com>
2026-08-07 22:40:22 -07:00
nesquena-hermesandnesquena-hermes fcef6ba1af Release exp-v0.52.175: identical-prompt retry settlement regression (#6631) (#6845)
* test: pin identical-prompt retry settlement

* Release exp-v0.52.175: two-direction regression for identical-prompt retry settlement (#6631)

---------

Co-authored-by: nesquena-hermes <nesquena-hermes@users.noreply.github.com>
2026-08-07 20:05:49 -07:00
e09ccbaac9 Release exp-v0.52.174: regression coverage for empty tool_calls drop on mirror path (#6803) (#6844)
* test(streaming): cover empty tool_calls drop in _api_safe_message_positions (#6796)

* Release exp-v0.52.174: regression coverage for empty tool_calls drop on mirror path (#6803)

---------

Co-authored-by: Webtecnica Bot <bot@webtecnica.com.br>
Co-authored-by: nesquena-hermes <nesquena-hermes@users.noreply.github.com>
2026-08-07 19:53:02 -07:00
898a01b766 Release exp-v0.52.173: don't mutate system prompt on workspace switch (#6683) (#6841)
* fix(cache): don't mutate system prompt on workspace switch (#6672)

* test(#6672): pin created_workspace freeze + compact round-trip + legacy fallback (closes coverage gap flagged in review)

* Release exp-v0.52.173: don't mutate system prompt on workspace switch (#6683)

---------

Co-authored-by: webtecnica <webtecnica@users.noreply.github.com>
Co-authored-by: nesquena-hermes <nesquena-hermes@users.noreply.github.com>
2026-08-07 19:42:15 -07:00
a818be1ed4 Release exp-v0.52.172: preserve reader scroll intent during live renders (#6453) (#6838)
* fix: preserve reader scroll intent during live renders

* fix: enforce programmatic scroll guard freshness

* test: update programmatic scroll guard assertion

* test: update scroll safety valve assertion

* fix: reconcile scroll intent helper after base refresh

* fix: timestamp fallback history scroll writes

* test: cover stale older-message fallback scroll guard

* test: execute the real slow-render history fallback

* test: provide the history fallback DOM helper

* test: retain async declaration in history fallback harness

* test: remove trailing blank line from scroll intent regression

* test(#6414): update scroll-intent harness for window._autoScrollFollow + _messageScrollInputGeneration (master drift)

* Release exp-v0.52.172: preserve reader scroll intent during live renders (#6453)

---------

Co-authored-by: Frank Song <franksong2702@gmail.com>
Co-authored-by: Frank Song <xuefu.song@qq.com>
Co-authored-by: nesquena-hermes <nesquena-hermes@users.noreply.github.com>
2026-08-07 18:37:31 -07:00
37547a7bd1 Release exp-v0.52.171: keep settled Worklog in place across stream settlement (#6454) (#6837)
* test: prove worklog continuity across stream settle

* fix: keep settled worklog in place on stream done

* fix: preserve settle follow ordering

* test: wire settled worklog frame proof

* fix: preserve settled worklog detail disclosure

* fix: preserve default-open settled worklogs

* fix: preserve blank-owner worklogs

* fix: keep render fallback self-contained

* ci: retrigger hosted checks

* style(worklog): grow collapsed Worklog rail tap target to 44px on touch devices (#6454 follow-up)

* Release exp-v0.52.171: keep settled Worklog in place across stream settlement (#6454)

---------

Co-authored-by: Frank Song <franksong2702@gmail.com>
Co-authored-by: nesquena-hermes <nesquena-hermes@users.noreply.github.com>
2026-08-07 18:06:57 -07:00
nesquena-hermes 9d142e7868 Merge pull request #6835 from nesquena/stage/6723-provider-resolver
Release exp-v0.52.170: resolve @provider:model through shared parser at gateway boundary (#6723)
2026-08-07 16:16:24 -07:00
nesquena-hermes c31d607a69 Merge pull request #6833 from nesquena/stage/6774-dict-models
Release exp-v0.52.169: expand dict-shaped custom-provider models in Providers card (#6774)
2026-08-07 15:53:23 -07:00
nesquena-hermes 218d586432 Merge pull request #6832 from nesquena/stage/6816-matrix-msg
Release exp-v0.52.168: classify Matrix gateway sessions as messaging (#6816)
2026-08-07 15:04:23 -07:00
nesquena-hermes a4bd54ef71 Merge pull request #6831 from nesquena/stage/6823-fd-leak
Release exp-v0.52.167: close leaked state.db read-only connections (#6823)
2026-08-07 14:40:27 -07:00
nesquena-hermes 5f3117f81e Merge pull request #6788 from nesquena/stage/6498b-0806
Release exp-v0.52.166: honor memory_enabled/user_profile_enabled in memory panel (#6498)
2026-08-05 19:45:54 -07:00
nesquena-hermes 7fe2274ad0 Merge pull request #6787 from nesquena/stage/6486-0805b
Release exp-v0.52.165: show final assistant report with tool-limit status card (#6486)
2026-08-05 18:24:48 -07:00
nesquena-hermes 2d819d4d7f Merge pull request #6786 from nesquena/stage/6670-0805
Release exp-v0.52.164: active-turn user-row dedup on mid-run reload (#6670)
2026-08-05 17:53:43 -07:00
nesquena-hermes 3d6c17aba6 Merge pull request #6785 from nesquena/stage/6688-0805
Release exp-v0.52.163: Force-recovery for dirty Stable no-ref checkouts (#6688)
2026-08-05 16:38:42 -07:00
nesquena-hermes c35b0659fe Merge pull request #6784 from nesquena/stage/6663-0805
Release exp-v0.52.162: OIDC allow_values whitespace warning (#6663)
2026-08-05 16:11:50 -07:00
nesquena-hermes c6c0046ae1 Merge pull request #6782 from nesquena/release/stage-b3-0805
Release exp-v0.52.161: HTML inline preview no-store (#6706)
2026-08-05 15:35:00 -07:00
nesquena-hermes 835589352d Merge pull request #6781 from nesquena/release/stage-b2-0805
Release exp-v0.52.160: CLI sessions on named profiles (#6690) + Windows backslash artifact paths (#6763)
2026-08-05 14:58:02 -07:00
nesquena-hermes 705b75c16c Merge pull request #6779 from nesquena/release/stage-b1-0805
Release exp-v0.52.159: docker editable install (#6458) + autoScrollFollow guard (#6614)
2026-08-05 14:34:20 -07:00
nesquena-hermes 320789ae59 Merge pull request #6487 from starship-s/fix/interim-anchor-final-character
fix(streaming): complete interim anchor prose before tools
2026-07-31 11:58:21 -07:00
nesquena-hermes d85eb85c25 Merge branch 'master' into fix/interim-anchor-final-character 2026-07-31 11:52:58 -07:00
nesquena-hermes bf7d39c67a Merge pull request #6642 from franksong2702/franksong2702/fix-gateway-terminal-persistence
fix: preserve gateway terminal error recovery after save failure
2026-07-31 11:52:48 -07:00
nesquena-hermes 07b33505fd Merge branch 'master' into franksong2702/fix-gateway-terminal-persistence 2026-07-31 11:47:43 -07:00
nesquena-hermes 7ce03cbbdd Merge pull request #6474 from franksong2702/franksong2702/viewport-scroll-anchor-6414
fix: restore desktop scroll on unpinned anchor miss
2026-07-31 11:47:33 -07:00
nesquena-hermes d482a12345 Merge branch 'master' into franksong2702/viewport-scroll-anchor-6414 2026-07-31 11:40:47 -07:00
nesquena-hermes 620da54cde Merge pull request #6650 from happy5318/fix/preflight-compression-false-positive
fix: stop false Compressing-context card on preflight-compression sessions
2026-07-31 11:14:31 -07:00
nesquena-hermes dd7f6ac318 Merge pull request #6627 from nesquena/release/stage-6473
Release exp-v0.52.158: preserve live Worklog through final settlement (#6473)
2026-07-30 11:08:44 -07:00
nesquena-hermes 0f010db5be Merge pull request #6473 from franksong2702/franksong2702/live-worklog-settle-no-blank
Preserve Live Worklog through final settlement
2026-07-30 11:04:46 -07:00
nesquena-hermes 0a40159759 Release exp-v0.52.157: reconnect transcript ordering (#6457) (#6609)
Ships #6457 (@nankingjing) — one shared pending_user_message merge helper keeps the reconnect prompt above the live worklog (#6419). Supersedes #6465.
2026-07-29 16:05:41 -07:00
nesquena-hermes ab6f0855a5 Release exp-v0.52.156: hard-refresh session restore (#6507) (#6608)
Ships #6507 (@ruizanthony) — preserve active chat across hard refresh + fully consume PWA launch action.
2026-07-29 15:26:26 -07:00
nesquena-hermes 480de19710 Merge pull request #6605 from nesquena/changelog/stamp-v0.52.106
docs(changelog): stamp v0.52.106
2026-07-29 13:52:04 -07:00
nesquena-hermes 0fa4b5f5ac Merge pull request #6604 from nesquena/revert/stable-v0.52.113-stamp
docs(changelog): revert withdrawn v0.52.113 stable stamp
2026-07-29 13:42:01 -07:00
nesquena-hermes edb69763a7 Merge pull request #6599 from nesquena/changelog/stamp-v0.52.113
docs(changelog): stamp v0.52.113
2026-07-29 13:24:02 -07:00
nesquena-hermes b8f615e4bd Merge pull request #6503 from rodboev/pr/6481-verification-evidence-contamination
fix(#6481): settle verification turns from exact turn ownership
2026-07-29 11:51:07 -07:00
nesquena-hermes 41321f6f70 Merge pull request #6307 from pxxD1998/fix/recover-stale-file-workspaces
fix: recover deleted session workspaces
2026-07-29 11:34:12 -07:00
nesquena-hermes 7e091e09dd Merge pull request #6488 from happy5318/fix/qwen-prefixed-reasoning-heuristic
fix: Qwen reasoning heuristic fails for prefixed model IDs
2026-07-29 11:12:13 -07:00
nesquena-hermes 4b3fdde31b Merge pull request #6567 from stefanpieter/fix/sigusr1-stack-dump-no-restart
fix: keep SIGUSR1 stack dumps non-terminating
2026-07-29 10:53:29 -07:00
nesquena-hermes 21bdd7c1f1 Merge pull request #6538 from nesquena/gate-6529-title-echo
Release exp-v0.52.153: reject trivial-echo session titles (#6529)
2026-07-26 13:27:24 -07:00
nesquena-hermes 8e3bb02e0e Merge pull request #6537 from nesquena/gate-6527-sse-relay-close
Release exp-v0.52.152: SSE relay apperror-hang fix (#6527)
2026-07-26 13:20:11 -07:00
nesquena-hermes a7180a8108 Merge pull request #6523 from nesquena/release/stage-6477
Release exp-v0.52.151: repair admin model reload rebinding (#6477, @mspgle-dotcom)
2026-07-25 19:13:28 -07:00
nesquena-hermes dd155912a7 Merge pull request #6520 from nesquena/release/stage-5844
Release exp-v0.52.150: reap idle abandoned terminals (#5844, @ai-ag2026)
2026-07-25 18:03:47 -07:00
nesquena-hermesandnesquena-hermes 399cd7ab19 Release: credit collapsed wakeup cards (#6350, @b3nw) (#6466)
Co-authored-by: nesquena-hermes <agent@nesquena-hermes>
2026-07-23 20:54:32 +00:00
nesquena-hermes ecc47782e3 Merge pull request #6447 from nesquena/stage/6349
Release: composer keystroke resize round-trip fix (#6349)
2026-07-22 21:24:22 -07:00
nesquena-hermes d2a4ecb767 Merge pull request #6446 from nesquena/stage/6040
Release: gateway approvals routed by run ID (#6040, fix #6008)
2026-07-22 20:20:05 -07:00
nesquena-hermes 12ea6ec927 Merge pull request #6445 from nesquena/stage/6408
Release: Compact Worklog last-char finalize fix (#6408)
2026-07-22 19:09:22 -07:00
nesquena-hermes 5b325d1472 Merge pull request #6443 from nesquena/stage/6319
Release: public-share local-media leak fix (#6319, P0 #6174)
2026-07-22 18:28:20 -07:00
nesquena-hermes f26abae544 Merge pull request #6439 from nesquena/stage/6113
Release: #6113 per-turn used-model chip in transparent footer
2026-07-22 15:18:52 -07:00
nesquena-hermes 9e1b8a115a Release: #6390 preserve scroll position after live-to-final settlement (#6436)
Release: #6390 preserve scroll position after live-to-final settlement
2026-07-22 13:59:04 -07:00
nesquena-hermes 699e592e85 Release exp-batch1: #6372 #5797 #5944 (#6425)
Release exp-batch1: MIME safety (#6372), atomic config writes (#5797), ctl.sh foreign-instance guard (#5944)
2026-07-22 12:05:00 -07:00