Commit graph

178 commits

Author SHA1 Message Date
nesquena-hermes
f731f1fa43 Stage 382: PR #2499 2026-05-18 03:43:01 +00:00
Dennis Soong
9b65e2440b fix: collapse WebUI compression continuations in sidebar 2026-05-18 08:35:38 +08:00
nesquena-hermes
935d9e6402 Stage 379: PR #2461
# Conflicts:
#	CHANGELOG.md
2026-05-17 23:35:18 +00:00
nesquena-hermes
46810bd4b2 Stage 376: PR #2457
# Conflicts:
#	CHANGELOG.md
2026-05-17 16:42:10 +00:00
nesquena-hermes
ccea8ed66f Stage 376: PR #2455
# Conflicts:
#	CHANGELOG.md
2026-05-17 16:42:10 +00:00
Michael Lam
f56ec1ec35 fix: label email gateway sessions 2026-05-17 02:49:25 -07:00
Frank Song
bd9a4924bf fix: clear stale active session spinner 2026-05-17 17:34:43 +08:00
starship-s
aecad0f427 [verified] Fix WebUI memory session lifecycle commits 2026-05-17 03:30:06 -06:00
Frank Song
fe55cf5b9e Refresh session context metadata on model changes 2026-05-17 13:27:40 +08:00
Hermes Agent
8b4f8b0600 Stage 369: PR #2347 — Preserve live agent timeline across session switches by @franksong2702 2026-05-16 20:03:43 +00:00
Hermes Agent
8f4d6c1431 Stage 368: PR #2391 — fix: reduce browser storage pressure by @Michaelyklam 2026-05-16 17:19:08 +00:00
Michael Lam
48b82d57db fix: reduce browser storage pressure 2026-05-16 08:44:04 -07:00
Michael Lam
3bb8c7b276 fix: guard localStorage quota writes 2026-05-16 07:31:44 -07:00
Frank Song
faedcab739 Preserve live agent timeline across session switches 2026-05-16 14:12:08 +08:00
Frank Song
2162dab4a5 Fix pending user row on active reattach 2026-05-16 10:34:55 +08:00
Dennis Soong
a145bf4364 fix: apply display titles in content search 2026-05-14 21:10:50 +08:00
Dennis Soong
143d9d8ef7 fix: reconcile stale sidebar display titles 2026-05-14 16:18:53 +08:00
Frank Song
996d4f9a8c Hide session lineage metadata in compact sidebar 2026-05-14 10:14:15 +08:00
Jordan SkyLF
2dfe765b60 fix: stabilize Firefox session sidebar scrolling 2026-05-13 11:30:06 -07:00
Hermes Agent
afe42b96c1 Merge pull request #2156 into stage-346
Issue #2057 Slice 2: Add guarded worktree remove action
2026-05-13 06:56:25 +00:00
Frank Song
02ca306ffc Consolidate session post-render processing 2026-05-13 11:50:31 +08:00
Frank Song
46c62851ad Harden worktree removal safeguards 2026-05-13 09:49:15 +08:00
Frank Song
93b7d35bfa Issue #2057 Slice 2: Add worktree remove action
Backend:
- POST /api/session/worktree/remove — removes a session's git worktree
- Guards: stream/terminal lock, dirty/untracked without force
- remove_worktree_for_session() in api/worktrees.py

Frontend:
- 'Remove Worktree' context menu item + confirm modal
- i18n keys for all 11 locales

Tests:
- 5 tests: clean remove, missing worktree, no-path, route success, 404
2026-05-13 09:11:55 +08:00
Hermes Agent
c677c19a8f Merge pull request #2128 into stage-344
Fix manual compression proxy timeouts (closes #2087)

# Conflicts:
#	CHANGELOG.md
2026-05-12 16:13:01 +00:00
Hermes Agent
23425b23c8 Merge pull request #2129 into stage-344
fix: purge missing inflight sessions (closes #2092)
2026-05-12 16:12:57 +00:00
Dennis Soong
f1b2a21bd4 feat: lazy-load full lineage segments 2026-05-12 18:02:49 +08:00
Michael Lam
dd543e4175 fix: purge missing inflight sessions 2026-05-12 02:57:37 -07:00
Frank Song
8fa92c680f Fix manual compression proxy timeouts 2026-05-12 17:33:59 +08:00
Frank Song
4e8899592d Prefer worktree retention responses in session UI 2026-05-12 10:17:12 +08:00
Frank Song
2da4f108c5 Clarify worktree session archive/delete semantics
(cherry picked from commit f5c8fb58d1892f2c964389295530e8be5d84323f)
2026-05-12 00:05:05 +00:00
Frank Song
6a52edf2ab Fix stale inflight purge runtime lookup 2026-05-11 21:53:43 +08:00
Frank Song
c60078b356 fix(ui): prevent stuck sidebar spinner on completed sessions (closes #2066)
The spinner (.session-state-indicator.is-streaming) can remain spinning
indefinitely on completed sessions when the INFLIGHT in-memory cache is
not cleaned up due to abnormal stream termination (page refresh, network
disconnect, gateway restart).

Add a staleness guard in _isSessionLocallyStreaming: if the server
reports is_streaming=false and last_message_at is older than 5 minutes,
force the streaming state to false regardless of stale INFLIGHT entries.
2026-05-11 17:54:14 +08:00
Frank Song
186453ea0e Add worktree-backed session creation 2026-05-11 12:12:40 +08:00
nesquena-hermes
2377216860 Stage 333: PR #2009 — feat(context): live status tracking during streaming by @dobby-d-elf 2026-05-10 18:16:59 +00:00
nesquena-hermes
fe922d83b0 Merge remote-tracking branch 'origin/master' into stage-332
# Conflicts:
#	CHANGELOG.md
2026-05-10 18:07:50 +00:00
nesquena-hermes
44dc7d05e8 Stage 331: PR #2014 — fix(sessions): keep explicit fork sessions out of compression lineage by @ai-ag2026 2026-05-10 17:09:21 +00:00
ai-ag2026
017a631b6c fix: keep explicit fork sessions out of compression lineage 2026-05-10 18:03:21 +02:00
ai-ag2026
8226328cba fix: avoid sidebar jumps when active session is visible 2026-05-10 18:00:10 +02:00
ai-ag2026
2a34a1256e fix: prefer latest compressed session segment 2026-05-10 17:04:33 +02:00
dobby-d-elf
1cf0ff01b5 feat: live context window status tracking during streaming 2026-05-10 06:51:46 -06:00
nesquena-hermes
55623ef249 Stage 327: PR #1943 — feat: expand collapsed session lineage segments by @dso2ng 2026-05-09 19:50:50 +00:00
nesquena-hermes
7cf8dcff4c Stage 326: PR #1956 — feat: persistent composer draft — server-side, cross-client, survives refresh by @JKJameson 2026-05-09 18:17:51 +00:00
Minimax
08c4ef8d88 feat: persistent composer draft — server-side, cross-client, survives refresh
- Session.composer_draft field: {text, files} stored in session JSON
- POST+GET /api/session/draft endpoint for save/load
- loadSession: save draft before switch, restore from S.session.composer_draft
- textarea input: debounced 400ms auto-save to server
- send(): clear draft after message is sent
- lockComposerForClarify(): save draft before card locks composer
- _restoreComposerDraft: clears textarea when target has no draft, guards
  against stale responses racing new session loads, exact text comparison
- Session.compact(): includes composer_draft in response
- Fix: use handler.command instead of parsed.method (ParseResult has no .method)

Co-authored-by: Minimax <noreply@minimax.io>
2026-05-09 13:47:57 +01:00
Sanjay Santhanam
fb822239ea fix(#1937): close endless-scroll prefetch vs Start-jump race with generation-token + mutex
The originally-proposed fix (gate _ensureAllMessagesLoaded on the existing
_loadingOlder flag) does not actually close the race. By the time the
prefetch reaches its post-await body, it has already cleared the entry-
gate that reads _loadingOlder, so a same-flag check inside the resolved
callback would be a no-op for an in-flight request.

The actual fix is two-pronged:

1. New module-scoped _messagesGeneration counter, bumped every time
   S.messages is wholesale-replaced. _loadOlderMessages snapshots it
   BEFORE its await and re-checks after — if it changed, the prepend
   is aborted. This is the canonical async-invalidation pattern.

2. _ensureAllMessagesLoaded now claims the _loadingOlder mutex around
   its body so a new prefetch cannot start mid-replace and concurrent
   ensure-all calls (rapid double-click on Start) serialize cleanly.
   It bumps the generation token before mutating S.messages, yields
   until any in-flight prefetch finishes, and resets _oldestIdx so a
   subsequent prefetch cannot request stale older messages.

Also adds the same-session / _loadingSessionId guards that the original
ensure-all body was missing post-await — if the user switched sessions
mid-flight, the old code would happily overwrite the new session's
messages with the previous session's full history.

12 new regression tests in tests/test_issue1937_endless_scroll_jumpstart_race.py
lock in: generation token declaration, bump-helper presence, snapshot-
before-await ordering, post-await-abort behaviour, mutex acquisition and
finally-release, yield-then-claim ordering when a prefetch is in flight,
generation bump during the wait phase, _oldestIdx reset, and the new
session-switch guard.

Closes #1937.
2026-05-08 21:14:22 -07:00
Dennis Soong
376727a6d1 fix: localize lineage segment row labels 2026-05-09 10:39:44 +08:00
Dennis Soong
a3ab46e345 fix: keep project-dot regression resilient 2026-05-09 09:53:38 +08:00
Dennis Soong
5b36232cbf feat: expand collapsed session lineage segments 2026-05-09 09:49:10 +08:00
nesquena-hermes
383507f368 Stage 324: PR #1926 — fix: prevent chat scroll resets after final render by @ai-ag2026 2026-05-08 20:49:00 +00:00
nesquena-hermes
1f8e641e27 Stage 324: PR #1927 — fix: preserve viewport when loading older messages by @ai-ag2026 2026-05-08 20:49:00 +00:00
ai-ag2026
447b4e6c0f fix: collapse stale compression sidebar segments 2026-05-08 20:48:47 +00:00