Commit graph

4929 commits

Author SHA1 Message Date
nesquena-hermes
ca368cc166 Merge branch 'peek-4478' into stage/4478-dom-recycle 2026-06-23 20:07:56 +00:00
nesquena-hermes
f1eafdda4f
Merge pull request #4789 from nesquena/stage/4748-empty-skeleton
Release v0.51.607 — empty-profile loading skeleton (#4717)
2026-06-23 12:06:37 -07:00
nesquena-hermes
d3425a4ce5 release: stamp v0.51.607 (#4717 empty-profile loading skeleton) 2026-06-23 19:01:44 +00:00
nesquena-hermes
e617acfc79 test(#4748): stub _recordSessionProfileCount in the #4766 node harness
#4748 added a _recordSessionProfileCount() call inside _applySessionListPayload();
the pre-existing #4766 test isolates that function in node and must stub the new
helper (same pattern as the other stubbed helpers) or it ReferenceErrors. Not a
weakened assertion — the test still verifies old+new payload tab-count coverage.
2026-06-23 17:58:39 +00:00
nesquena-hermes
e89977d270 test(#4748): widen skeleton-flag slice to full _applySessionListPayload body (Codex gate)
#4748 added lines inside _applySessionListPayload() that pushed the
'_sessionListSkeletonActive = false;' assertion past the test's fixed 4000-char
window. Anchor the slice on the next function def (_mergeRenderSessionListOptions)
instead — robust to future additions. Assertion unchanged.
2026-06-23 17:47:43 +00:00
nesquena-hermes
a7eb7de83f Merge remote-tracking branch 'origin/master' into peek-4748
# Conflicts:
#	CHANGELOG.md
2026-06-23 17:43:38 +00:00
nesquena-hermes
46f5fb93fe
Merge pull request #4787 from nesquena/stage/4741-backend-caching
Release v0.51.606 — backend hot-path caching (profile-switch perf #4662 phase 2+3, #4741)
2026-06-23 10:39:11 -07:00
nesquena-hermes
f9a687d01d release: stamp v0.51.606 (#4662 phase 2+3 backend hot-path caching) 2026-06-23 17:27:06 +00:00
nesquena-hermes
18e252d59c test(#4741): update #4766 mock to accept the new redact_enabled kwarg
#4741 added redact_enabled= to _sidebar_session_response_item's call site
(routes.py:2199); the pre-existing #4766 test mocked it with a bare 'lambda row: row'
that rejects the kwarg -> full-suite TypeError. Mock now accepts the keyword-only
arg. Not a weakened assertion — the test still asserts bucket-count omission.
2026-06-23 17:17:17 +00:00
nesquena-hermes
50f7f7fcd3 test(#4741): add two #798 isolation regression guards (Opus gate hardening)
- env-change-with-unchanged-mtime must re-expand (proves the cache stores raw
  un-expanded YAML, not the expanded result -> no stale cross-profile expansion)
- no-cross-serve between two profile config paths (proves the parse cache is
  path-keyed). Both pass on the current impl; locks down the highest-risk
  cross-profile credential-bleed invariant per Opus's non-blocking note.
2026-06-23 17:13:22 +00:00
nesquena-hermes
235bfffaf0 Merge remote-tracking branch 'origin/master' into peek-4741
# Conflicts:
#	CHANGELOG.md
2026-06-23 17:06:17 +00:00
nesquena-hermes
d5f49392b3
Merge pull request #4786 from nesquena/gate/4782-sidebar-trim
Release v0.51.605 — trim hidden/empty rows from sidebar payload (#4775)
2026-06-23 10:01:39 -07:00
nesquena-hermes
337cd95e32 release: stamp v0.51.605 (#4775 trim hidden/empty sidebar payload rows) 2026-06-23 16:56:22 +00:00
nesquena-hermes
98e672551a Merge branch 'peek-4782' into gate/4782-sidebar-trim 2026-06-23 16:46:10 +00:00
nesquena-hermes
d613345887
Merge pull request #4785 from nesquena/stage/livestream-chat-scroll-4778-4777-4780
Release v0.51.604 — live-stream worklog scroll/dedup + mobile session-switch scroll (#4778, #4777, #4780)
2026-06-23 09:41:05 -07:00
nesquena-hermes
198e98ec74 release: stamp v0.51.604 (live-stream worklog scroll/dedup + mobile session-switch scroll) 2026-06-23 16:36:54 +00:00
nesquena-hermes
29ceed3a72 fix(#4778): gate deferred rAF re-restore on still-unpinned (Opus gate)
Opus caught a narrow timing race: if a reader re-pins between the scroll-rebuild
guard engaging and its deferred rAF firing, the stale re-restore would yank them
back off the bottom. Gate the re-restore on _messageUserUnpinned at rAF time; the
minHeight release still always runs. Normal single-render unpinned case unaffected.
2026-06-23 16:19:50 +00:00
nesquena-hermes
f4af6d8419 fix(#4778): scroll-rebuild guard must not reclassify a pinned follower as unpinned
Codex regression gate caught: the guard predicate keyed on a raw messagesEl.scrollTop>0,
so a pinned reader transiently at bottomDistance>250 mid-render (assistant body grows
before the anchor scene re-renders) got flipped to _messageUserUnpinned=true/_scrollPinned=false
and lost auto-follow. Require an explicit non-follow signal (_messageUserUnpinned || _scrollPinned===false)
instead. Updated the existing guard test to a genuine unpinned reader + added a pinned-large-growth
regression. Co-authored-by: franksong2702
2026-06-23 16:17:01 +00:00
nesquena-hermes
c6d633fd2c Merge branch 'peek-4777' into stage/livestream-chat-scroll-4778-4777-4780
# Conflicts:
#	CHANGELOG.md
2026-06-23 16:09:00 +00:00
nesquena-hermes
a349b0b7e8 Merge branch 'peek-4780' into stage/livestream-chat-scroll-4778-4777-4780 2026-06-23 16:08:31 +00:00
nesquena-hermes
343cb0737e Merge branch 'peek-4778' into stage/livestream-chat-scroll-4778-4777-4780 2026-06-23 16:08:30 +00:00
Rod Boev
165433fea6 Keep legacy sidebar tests aligned with visible-row filtering 2026-06-23 11:56:25 -04:00
Rod Boev
75016c99f6 test(sidebar): align legacy list checks with visible-session filtering (#4775) 2026-06-23 11:46:37 -04:00
Hermes Agent
ba6349bdcb fix: reset scroll state on session switch to prevent stale unpin blocking scroll-to-bottom 2026-06-23 17:19:50 +02:00
Rod Boev
bd72c785b5 fix(sidebar): reject cached fallback rows from the wrong hidden-filter mode (#4775) 2026-06-23 11:13:33 -04:00
Frank Song
4c8e88ab2d fix: dedupe live compact worklog process prose 2026-06-23 23:03:04 +08:00
Rod Boev
9296604667 fix(sidebar): keep delete fallback in the visible session scope (#4775) 2026-06-23 11:00:40 -04:00
Frank Song
1269289d01 fix: guard live worklog scroll rebuilds 2026-06-23 23:00:32 +08:00
Rod Boev
5ccabedcd4 test(sidebar): keep unassigned filter assertions aligned with refresh helper (#4775) 2026-06-23 10:56:42 -04:00
Rod Boev
e9baeff2b2 fix(sidebar): preserve attention rows in filtered session payloads (#4775) 2026-06-23 10:51:33 -04:00
Rod Boev
df6dba7a94 fix(sidebar): refresh project-chip payload after filter switch (#4775) 2026-06-23 10:40:40 -04:00
Rod Boev
e27b7cf042 perf(sidebar): trim hidden and empty sidebar payload rows (#4775) 2026-06-23 10:29:06 -04:00
nesquena-hermes
8a98626967
Merge pull request #4776 from nesquena/stage-4774-release
Release v0.51.603 — Release VJ (cache app-shell template, #4774)
2026-06-23 06:42:54 -07:00
nesquena-hermes
f3a509e2e9 Release v0.51.603 — Release VJ (cache app-shell template, #4774) 2026-06-23 13:39:07 +00:00
nesquena-hermes
9cc3f30d82 test(#4774): point asset-version-encoding test at relocated shell-render helper
#4774 moved the version-token substitution from the index route handler into the cached
_render_index_shell_base() helper. quote(WEBUI_VERSION, safe='') encoding is intact (verified),
just relocated, so the source-marker test scanning the route block no longer found it. Updated
to check the helper. Maintainer test-fix on boriken72's PR.
2026-06-23 13:27:40 +00:00
nesquena-hermes
7c9fef2fb3 stage #4774 (boriken72): cache app-shell template 2026-06-23 13:14:02 +00:00
boriken72
c6994b501a perf: cache app-shell template instead of re-reading index.html per request
The `/`, `/index.html`, and `/session/<id>` routes are the hottest
navigations. Each request re-read the ~190 KB static/index.html from disk
and re-applied two process-constant token substitutions
(__WEBUI_VERSION__, __MAX_UPLOAD_BYTES__), then ran inject_extension_tags()
(which itself reads the extension state + manifest from disk).

WEBUI_VERSION and MAX_UPLOAD_BYTES are fixed for the process lifetime, so
this caches the partially rendered template in an in-process cache keyed by
(size, mtime_ns) -- mirroring the existing _STATIC_CACHE pattern in this
file -- so a redeploy is still picked up without a restart. The per-session
CSRF token and runtime extension tags are still applied per request, so
output is byte-identical to before.

Verified: byte-identical to the old inline render, CSRF still varies per
request, cache invalidates on mtime change, ~5x faster shell render in a
local microbenchmark. Adds tests/test_index_shell_template_cache.py.
2026-06-23 09:01:59 -04:00
nesquena-hermes
2d857f8b5a
Merge pull request #4773 from nesquena/stage-4769-release
Release v0.51.602 — Release VI (sidebar fetches only active source bucket, #4766/#4769)
2026-06-23 05:23:22 -07:00
nesquena-hermes
49e0f84474 Release v0.51.602 — Release VI (sidebar fetches only active source bucket, #4766/#4769) 2026-06-23 12:19:34 +00:00
nesquena-hermes
ced64ff1f3 stage #4769 v2 (rodboev): sidebar source-bucket pushdown, re-push 2026-06-23 12:07:34 +00:00
Rod Boev
148a1bfab2 Keep source-bucket cleanup tied to real session origin 2026-06-23 07:58:55 -04:00
Rod Boev
df4cdf7f9b Prevent stale cross-bucket rows during source-tab switches 2026-06-23 07:49:46 -04:00
Rod Boev
52557d1137 Keep isolated sidebar dedupe harnesses aligned with source-map cleanup 2026-06-23 07:44:03 -04:00
Rod Boev
0f5e0d71b7 Keep sidebar state helpers compatible with isolated JS harnesses 2026-06-23 07:37:42 -04:00
Rod Boev
f5f8f48006 Keep hidden source state through failed source refreshes 2026-06-23 07:06:07 -04:00
Rod Boev
742a19ab70 Keep sidebar partition proofs aligned with helper counts 2026-06-23 06:58:53 -04:00
Rod Boev
efb784730a Keep sidebar source fallbacks honest under refresh failure 2026-06-23 06:51:12 -04:00
Rod Boev
534008c3fc Preserve hidden source runtime state across tab refreshes 2026-06-23 06:39:34 -04:00
Rod Boev
4ee5ef0d01 fix(#4766): harden source-tab refresh state 2026-06-23 06:21:15 -04:00
Rod Boev
73a209aca7 fix(#4766): close review gaps in sidebar source filtering 2026-06-23 06:10:16 -04:00