Commit graph

4720 commits

Author SHA1 Message Date
nesquena-hermes
dfb4007ae8
Merge pull request #4169 from nesquena/stage-4165
Release NU (v0.51.408): reasoning selector for nested Gemini custom-provider routes (#4165)
2026-06-13 21:53:10 -07:00
b3nw
db3d22912e fix(config): reasoning toggle for nested Gemini custom provider routes (#3431)
Version-gated the nested-gateway allow to 2.5-series/3-era (reviewer fix:
gemini-1.5/1.0 have no thinking controls -> selector would fail on send) +
pre-2.5 exclusion regression tests. Stamped v0.51.408 (Release NU).

Co-authored-by: b3nw <b3nw@users.noreply.github.com>
2026-06-14 04:44:47 +00:00
nesquena-hermes
5b96673f4b
Merge pull request #4168 from nesquena/stage-3601b
Release NT (v0.51.407): nest forked sessions under their parent (#3224)
2026-06-13 21:42:13 -07:00
nesquena-hermes
31f2ec31c0 docs(changelog): stamp #3224 nested forks as v0.51.407 (Release NT) 2026-06-14 04:36:45 +00:00
Rod Boev
c98f3c3abf feat(sidebar): nest forked sessions under their parent (#3224)
Re-pushed by rodboev fixing both bounce findings (parent streaming-state
isolation + nested-fork batch-select) plus a select-handler selector fix.
On current master (0 behind); sessions.js byte-identical to PR head.

Co-authored-by: Rod Boev <rod.boev@gmail.com>
2026-06-14 04:21:54 +00:00
nesquena-hermes
d637d27fa7
Merge pull request #4163 from nesquena/stage-4144
Release NS (v0.51.406): project-context file in the Memory tab (#3866)
2026-06-13 20:52:27 -07:00
nesquena-hermes
c73da44757 docs(changelog): stamp #3866 project-context Memory tab as v0.51.406 (Release NS) 2026-06-14 03:49:17 +00:00
Matt Van Horn
b139404cdc fix: guard blank session workspace + agent parity for project-context tab
- Return None for blank session.workspace instead of Path('').resolve()
  (which resolved to the server CWD and could surface the install's own
  AGENTS.md/HERMES.md as project context).
- Match the agent's lowercase filename variants (agents.md / claude.md).
- Read .cursor/rules/*.mdc, not just the legacy .cursorrules file.
- Strip YAML frontmatter and cap each source at 20k, mirroring what the
  agent actually injects.
- Regression tests for the guard, lowercase match, and frontmatter strip.
2026-06-14 03:38:26 +00:00
Matt Van Horn
6215b4535a feat: show the active workspace project-context file (AGENTS.md / HERMES.md / CLAUDE.md) in the Memory tab
Fixes #3866
2026-06-14 03:38:26 +00:00
Rod Boev
8677a11012 fix(sidebar): restore source_filter passthrough in cache builder (#3791) 2026-06-13 23:27:48 -04:00
nesquena-hermes
ac216a5c0e
Merge pull request #4160 from nesquena/stage-4158
Release NR (v0.51.405): Transparent Stream live prose stays chronological (#4096)
2026-06-13 20:06:37 -07:00
nesquena-hermes
918139461b docs(changelog): stamp #4096 transparent-stream live prose fix as v0.51.405 (Release NR) + fix changelog blank-line nit (greptile P2) 2026-06-14 02:58:12 +00:00
Rod Boev
9f86bfee40 fix(sidebar): preserve expired cache entries for stale follower fallback 2026-06-13 22:36:25 -04:00
Rod Boev
43972652e7 fix(sidebar): collapse cache reads so stale-while-rebuilding path is reachable 2026-06-13 22:36:25 -04:00
Rod Boev
3fcb831a68 Restore stale follower reuse during cache rebuilds 2026-06-13 22:36:25 -04:00
Rod Boev
52a030503b Exercise real cache diagnostics instead of source-text checks 2026-06-13 22:36:25 -04:00
Rod Boev
07641dc987 Keep session list singleflight stable for WebUI-only views 2026-06-13 22:36:25 -04:00
Rod Boev
f7dbf7df6a Invalidate cached session lists when backing stores change 2026-06-13 22:36:25 -04:00
Rod Boev
c3750fe361 perf(sidebar): cache and single-flight /api/sessions payloads (#3791) 2026-06-13 22:36:25 -04:00
nesquena-hermes
cd5a6de231 fix(transparent-stream): keep live prose chronological, don't fold into top Worklog rail (#4096)
In Transparent Stream mode a live multi-round turn (narrate -> tools ->
narrate -> tools) rendered all assistant prose bunched at the top with
every tool/thinking row clustered below; it self-healed only once the
turn settled.

_syncLiveWorklogReasonsForAnchor() runs on every live segment render
(_flushPendingSegmentRender + the RAF _doRender in messages.js) and
unconditionally built the top-anchored live-worklog rail, mirrored each
round's prose into a wl-reason row there, and hid the real inline
assistant-segment via assistant-segment-worklog-source (display:none).
That prose-folding is the Compact Worklog presentation (#3401) and must
not run in Transparent Stream mode.

Gate the helper on isCompactWorklogMode() so transparent mode keeps prose
as visible, chronologically-placed inline segments interleaved with tool
rows (matching the already-correct settled render). Compact Worklog
folding is unchanged. Verified in an isolated mock-LLM env via an
on-screen visual-position probe (before: textAfterFirstTool=0,
allTextAboveAllTools=true; after: textAfterFirstTool=3,
allTextAboveAllTools=false) and confirmed compact_worklog still folds.

Adds a behavioral regression test asserting the gate is the first
statement in the helper (precedes the rail build), red/green validated.
2026-06-14 02:18:33 +00:00
nesquena-hermes
1643d660b5
Merge pull request #4157 from nesquena/stage-4156
Release NQ (v0.51.404): PWA multi-window connection-pool saturation fix (#4151)
2026-06-13 18:36:34 -07:00
nesquena-hermes
b8a84f13e1 docs(changelog): stamp #4151 PWA multi-window SSE fix as v0.51.404 (Release NQ) 2026-06-14 01:33:14 +00:00
Rod Boev
42e85813a3 fix(#4146): preserve gateway reasoning previews on reload 2026-06-13 21:18:43 -04:00
Nathan Esquenazi
266d9cdbd3 fix(sse): guard gateway reopen on focus so transient blur can't thrash it (#4151)
The #4151 focus hook reopened both global sidebar streams on `focus` with a
bare `startGatewaySSE()`. But `startGatewaySSE()` is NOT idempotent — it begins
with an unconditional `stopGatewaySSE()` (sessions.js:3778), which closes the
live gateway EventSource, cancels its poll fallback (`stopGatewayPollFallback`),
and resets `_gatewayProbeInFlight` / `_gatewaySSEWarningShown`.

So on a transient blur shorter than the 1s debounce — where the blur-close
timer is cleared on the following focus and the stream was never torn down —
the focus handler still dropped and reconnected the gateway on every
window-switch, cancelling its fallback and resetting probe/warning state. That
is the exact thrash the debounce exists to prevent, in the multi-window PWA
scenario this PR targets. (`ensureSessionEventsSSE()` is already idempotent via
`if(_sessionEventsSSE) return`, so the session-events stream was unaffected;
only the gateway churned. greptile P1.)

Guard the reopen on the gateway actually being closed: `if(!_gatewaySSE)
startGatewaySSE()`, mirroring the session-events idempotency. A sustained blur
(timer fires → both streams closed) still reopens the gateway on focus; a
transient blur leaves the still-open gateway untouched. Verified with a
blur/focus/timer harness (transient → no teardown/reconnect; sustained → close
then reopen; CLI-disabled → stays closed) and a new regression guard
`test_focus_reopen_does_not_thrash_the_gateway_stream`.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-13 18:07:12 -07:00
nesquena-hermes
408dbeb4f0 fix(sse): close global sidebar streams on PWA window blur (#4151)
Two side-by-side PWA standalone windows saturate the browser's per-origin
HTTP/1.1 connection limit, causing 'Request timed out' toasts to cycle every
~30s. The idle-SSE close added in #3992/#3996 keys off the Page Visibility API
(visibilitychange / document.hidden), but a PWA standalone window does not
reliably fire visibilitychange when it loses focus to another window of the
same app -- document.hidden only flips on minimize. So both windows stay
'visible', each holds its two global sidebar SSE streams (session-events +
gateway) open, 2x3 = 6 hits the connection cap, and subsequent fetch() calls
(the 30s background polls) queue behind the saturated pool and time out.

The two global sidebar streams now also close on a sustained window blur (gated
on document.hasFocus(), the signal visibilitychange misses) and reopen --
catching up the session list -- on focus, via a shared _sidebarSseBackgrounded()
predicate and a debounced _installSidebarSseFocusHook().

The per-session live stream (messages.js startSessionStream) is intentionally
left visibility-only: it carries live bg_task_complete toasts and
server_turn_started live-view that an unfocused-but-visible window must still
receive (the OS-notification path is gated on document.hidden, so the in-app
toast is the only completion signal a visible-unfocused window gets). Closing
it on blur would regress the multi-window live-view UX.

Reported by @ddiall with a thorough root-cause analysis.

Co-authored-by: ddiall <ddiall@users.noreply.github.com>
2026-06-14 00:54:28 +00:00
nesquena-hermes
ebf778edd3
Merge pull request #4155 from nesquena/stage-4143
Release NP (v0.51.403): notification click reuses existing chat tab (#4109)
2026-06-13 17:47:27 -07:00
nesquena-hermes
219635f8ae docs(changelog): stamp #4109 notification focus-existing-tab as v0.51.403 (Release NP) 2026-06-14 00:26:15 +00:00
nesquena-hermes
e044a2e938 Merge #4143 (focus existing chat tab on notification click, #4109) onto master 2026-06-14 00:25:09 +00:00
Rod Boev
79cefa736c fix(#4146): accept text-only gateway thinking previews 2026-06-13 19:29:02 -04:00
nesquena-hermes
ca4b82c126
Merge pull request #4149 from nesquena/stage-4112b
Release NM (v0.51.400): skill bundles in WebUI slash commands (#4087)
2026-06-13 16:25:30 -07:00
nesquena-hermes
e069a2dbcc docs(changelog): stamp #4087 skill-bundle slash commands (precedence-fixed) as v0.51.400 (Release NM) 2026-06-13 23:14:31 +00:00
nesquena-hermes
5812df5f7b Merge #4112 (skill bundles in WebUI slash commands, #4087) onto master 2026-06-13 23:13:28 +00:00
Rod Boev
b9a997ff58 fix(gateway): surface reasoning previews in WebUI (#4146) 2026-06-13 19:07:05 -04:00
Rod Boev
d7e8f70423 fix(commands): block transient bundle shadowing 2026-06-13 18:53:46 -04:00
nesquena-hermes
3e87b620f5
Merge pull request #4147 from nesquena/stage-3940v2
Release NL (v0.51.399): per-home provider probe-worker pool, race-safe (#3787)
2026-06-13 15:15:34 -07:00
nesquena-hermes
c0ea19407b docs(changelog): stamp #3940 v2 (claim-under-pool-lock) as v0.51.399 (Release NL) 2026-06-13 22:05:58 +00:00
nesquena-hermes
fa19eae6d1 Merge #3940 v2 (claim probe workers under pool lock, #3787) onto master 2026-06-13 22:05:05 +00:00
nesquena-hermes
4eec7c3fec
Merge pull request #4145 from nesquena/stage-3998v2
Release NK (v0.51.398): auto-generate titles for imported CLI sessions (#3987)
2026-06-13 15:02:56 -07:00
nesquena-hermes
961bfbd2ba docs(changelog): stamp #3987 v2 (reload-before-save) as v0.51.398 (Release NK) 2026-06-13 21:47:42 +00:00
nesquena-hermes
4f1ce2661e Merge #3998 v2 (imported-session titles + reload-before-save fix, #3987) onto master 2026-06-13 21:46:36 +00:00
Matt Van Horn
c3f4d33392
fix: focus the existing chat tab when a notification is clicked instead of opening a new tab
Fixes #4109
2026-06-13 14:42:41 -07:00
Rod Boev
6a27b414c6 Preserve imported title rework without breaking route invariants 2026-06-13 17:34:22 -04:00
nesquena-hermes
b2d32924a4
Merge pull request #4142 from nesquena/stage-4072
Release NJ (v0.51.397): wire /credits through WebUI command dispatch (#4071)
2026-06-13 14:28:01 -07:00
nesquena-hermes
e0e4ebfde5 docs(changelog): stamp #4071 /credits WebUI command as v0.51.397 (Release NJ) 2026-06-13 21:16:33 +00:00
nesquena-hermes
f7047d4d19 Merge #4072 (wire /credits through WebUI command dispatch, #4071) onto master 2026-06-13 21:15:22 +00:00
nesquena-hermes
1557f80f83
Merge pull request #4141 from nesquena/stage-4139
Release NI (v0.51.396): longer timeout for full-history session loads (#4139)
2026-06-13 13:53:12 -07:00
Rod Boev
e1ec41b32c fix(session): reload latest imported session before title save (#3987) 2026-06-13 16:47:57 -04:00
nesquena-hermes
31af2da234 docs(changelog): stamp #4139 full-history-load timeout as v0.51.396 (Release NI) 2026-06-13 20:44:06 +00:00
Rod Boev
bb8d5e9587 fix(providers): claim probe workers under the pool lock (#3787) 2026-06-13 16:42:43 -04:00
nesquena-hermes
fd972ff2a5 Merge #4139 (extend timeout for full-history session loads) onto master 2026-06-13 20:42:17 +00:00