Commit graph

4720 commits

Author SHA1 Message Date
AJV20
d34d11821b fix: label tool output cards persistently 2026-05-30 04:24:15 +00:00
nesquena-hermes
0fc38cecf8
Merge pull request #3167 from nesquena/release/stage-batch52
Release v0.51.170 — Release EP (stage-batch52: run-aware SSE replay cursors #3124)
2026-05-29 21:16:41 -07:00
AJV20
5cb82f9da4 fix: make SSE replay cursors run-aware 2026-05-30 04:09:20 +00:00
nesquena-hermes
d37e57f1ea
Merge pull request #3165 from nesquena/release/stage-batch51
Release v0.51.169 — Release EO (stage-batch51: skill-toggle profile scoping #3066 + update-tag filter #3140 + Docker docs)
2026-05-29 20:54:34 -07:00
nesquena-hermes
d032653a97 test(#3066): mark profile-skill tests requires_agent_modules (skill_utils import unavailable in CI) 2026-05-30 03:51:13 +00:00
AJV20
fbc0742621 fix: ignore release tags already contained by head 2026-05-30 03:37:12 +00:00
AJV20
7efb4c5acb fix: scope skill toggles to active profile 2026-05-30 03:36:09 +00:00
AJV20
f50763b3d2 docs: clarify docker host and home paths 2026-05-30 03:35:24 +00:00
nesquena-hermes
e8e93ad98c
Merge pull request #3163 from nesquena/fix-3162
Release v0.51.168 — Release EN (hotfix #3162: mobile 'Failed to load conversation messages' + JS runtime-lint guard)
2026-05-29 20:31:14 -07:00
nesquena-hermes
e5b31caee1 fix(#3162): const→let in _ensureMessagesLoaded (brick-class mobile TypeError) + ESLint runtime-error guard
The #3018 carry-forward reassigns msgs but it was declared const, throwing a
TypeError that surfaced as 'Failed to load conversation messages' on every mobile
message (v0.51.161-166). Change to let.

Adds a static JS runtime-error lint guard (eslint.runtime-guard.config.mjs +
tests/test_static_js_runtime_lint.py) using no-const-assign/no-import-assign — the
exact class node --check and source-presence tests miss. Dev-only dependency; app
stays pure Python + vanilla JS.
2026-05-30 03:24:41 +00:00
nesquena-hermes
9cd7729915
Merge pull request #3161 from nesquena/release/stage-batch49
Release v0.51.167 — Release EM (stage-batch49: iOS-style swipe actions for touch devices #2252)
2026-05-29 20:10:17 -07:00
nesquena-hermes
6702805527 stage-batch49: CHANGELOG for v0.51.167 (Release EM) 2026-05-30 02:57:02 +00:00
nesquena-hermes
359a86cc4f Merge PR #2252 (swipe actions for touch devices + session list FLIP) into stage-batch49 2026-05-30 02:56:40 +00:00
nesquena-hermes
6791b1d5d8 Merge PR #2252 (swipe actions for touch devices + session list FLIP) onto master — stripped out-of-scope version-badge/_dirty_suffix changes 2026-05-30 02:33:18 +00:00
nesquena-hermes
abe87b9b3e
Merge pull request #3156 from nesquena/release/stage-batch48
Release v0.51.166 — Release EL (stage-batch48: shared OpenCode runtime key #3145 + cron project-chip sessions #3134)
2026-05-29 19:26:02 -07:00
nesquena-hermes
c2663f827a Merge PR #3152 (keep agent cron sessions in project chips, #3134) into stage-batch48
# Conflicts:
#	CHANGELOG.md
2026-05-30 02:19:28 +00:00
nesquena-hermes
798ca584c6 Merge PR #3150 (honor shared OpenCode key at runtime, closes #3145) into stage-batch48 2026-05-30 02:19:06 +00:00
AJV20
e68c670bba fix: keep agent cron sessions in project chips 2026-05-30 02:18:51 +00:00
AJV20
d2686eaedb fix: honor shared OpenCode key at runtime 2026-05-30 02:18:06 +00:00
nesquena-hermes
3005811200
Merge pull request #3153 from nesquena/release/stage-batch47
Release v0.51.165 — Release EK (stage-batch47: stop EventSource reconnect storm #3103)
2026-05-29 19:15:40 -07:00
nesquena-hermes
5f0d7534db stage-batch47: CHANGELOG for v0.51.165 (Release EK) 2026-05-30 02:09:01 +00:00
nesquena-hermes
728bf42efd Merge PR #3128 (stop Connection: close on long-lived SSE streams) into stage-batch47 2026-05-30 02:08:37 +00:00
nesquena-hermes
2fc692f68b test: pin #3103 — SSE event-stream handlers must not emit Connection: close (keep it for finite responses) 2026-05-30 02:08:37 +00:00
Sanjays2402
ab4de3bb64 Fix #3103: stop emitting Connection: close on long-lived SSE streams
The gateway SSE handler (`_handle_gateway_sse_stream`) and session-events
SSE handler (`_handle_session_events_stream`) both set
`Connection: close` on the response. On long-lived SSE streams, browsers
(Chrome, Firefox, Safari) interpret that header as 'this is a one-shot
response, the EventSource lifecycle is over the moment the body ends'
and trigger an immediate reconnect when the server-side worker rotates.

The result, with EventSource's auto-reconnect on top, is a tight loop of
connect -> sessions_changed snapshot -> reconnect every ~1s that pegs
the worker, thrashes the session list, and prevents the in-app session
list from ever settling.

Removing the header lets the python BaseHTTPServer close the socket
naturally after the stream ends, which is what EventSource expects.

Regression introduced in 598fd4ff.
2026-05-30 02:02:40 +00:00
nesquena-hermes
832cf8e4be
Merge pull request #3151 from nesquena/release/stage-batch46
Release v0.51.164 — Release EJ (stage-batch46: passive performance hardening)
2026-05-29 19:01:22 -07:00
nesquena-hermes
a7848c884e stage-batch46: CHANGELOG for v0.51.164 (Release EJ) 2026-05-30 01:54:52 +00:00
nesquena-hermes
938a58b0e1 Merge PR #3105 (passive performance hardening + bounded restart-safety wait) into stage-batch46 2026-05-30 01:53:39 +00:00
nesquena-hermes
694fdd1096 review-3105: bound _wait_until_restart_safe with 300s max-wait + execv fallback (Opus review — avoid self-update soft-jam on long runs) 2026-05-30 01:53:38 +00:00
AJV20
b53bc1a2ea fix: harden webui passive performance paths 2026-05-30 01:39:54 +00:00
nesquena-hermes
e90ebd2394
Merge pull request #3149 from nesquena/release/stage-batch45
Release v0.51.163 — Release EI (stage-batch45: session duplicate/branch field propagation)
2026-05-29 18:37:35 -07:00
nesquena-hermes
315cca2ec7 stage-batch45: CHANGELOG for v0.51.163 (Release EI) 2026-05-30 01:26:21 +00:00
nesquena-hermes
71d0b1cb5e Merge PR #3101 (session duplicate/branch field propagation) into stage-batch45 2026-05-30 01:26:00 +00:00
AlexeyDsov
da9211bf43 fix(session): copy all critical fields on duplicate and branch to prevent state loss 2026-05-30 01:19:50 +00:00
nesquena-hermes
24a266841a
Merge pull request #3148 from nesquena/release/stage-batch44
Release v0.51.162 — Release EH (stage-batch44: conversation-filter clear button + title-lang regression coverage)
2026-05-29 18:13:04 -07:00
nesquena-hermes
ed12948301 stage-batch44: CHANGELOG for v0.51.162 (Release EH) 2026-05-30 01:06:24 +00:00
ai-ag2026
e0c27174b3 test: cover code-only title language fallback 2026-05-30 01:06:04 +00:00
nesquena-hermes
01c63be969 Merge PR #3026 (clear button on conversation filter) into stage-batch44 2026-05-30 01:05:58 +00:00
george-andraws
28498aa988 fix: scope conversation filter clear search CSS 2026-05-30 00:52:29 +00:00
george-andraws
317d828cff Add clear button to conversation filter 2026-05-30 00:52:29 +00:00
nesquena-hermes
cbc74e33b8
Merge pull request #3147 from nesquena/release/stage-batch43
Release v0.51.161 — Release EG (stage-batch43: 3-PR live-display fixes)
2026-05-29 17:50:01 -07:00
nesquena-hermes
3119ea8200 test: update rotate-url-sync completion_marker for #3018 _finishDone carry-forward 2026-05-30 00:43:37 +00:00
nesquena-hermes
7edd43549d stage-batch43: extend #3018 carry-forward to _finishDone completion path (Opus review — most-frequent reproducer) 2026-05-30 00:39:54 +00:00
nesquena-hermes
49a16e5fc3 stage-batch43: CHANGELOG for v0.51.161 (Release EG) 2026-05-30 00:21:35 +00:00
nesquena-hermes
9059b8f5c3 Merge PR #3116 (stale unread + compression timer + tool-card dedup) into stage-batch43 2026-05-30 00:21:04 +00:00
nesquena-hermes
86d5d63593 Merge PR #3131 (preserve per-turn ephemeral fields) into stage-batch43 2026-05-30 00:20:58 +00:00
nesquena-hermes
02e8a6ca8d Merge PR #3127 (jump-to-question on intermediate assistant msgs) into stage-batch43 2026-05-30 00:20:58 +00:00
mysoul12138
5b3771012a Fix tool card duplication: skip detail when snippet equals preview
When tc.snippet === tc.preview (common for no-progress tools where
both are set to the same result_snippet), the detail block would show
identical content as the header. Skip the detail block in this case.

This also handles the reload-path where derived entries get snippet
populated but no preview, so displaySnippet falls back to the snippet
content for the header — same deduplication applies.

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
2026-05-30 00:20:49 +00:00
mysoul12138
0002cda23d fix: stale unread dot, compression timer leak, tool card duplication (#3020, #2973)
#3020: Sync viewed-count in the polling path for actively-viewed sessions
so navigating away doesn't show a stale unread dot. Defensive clear of
completion-unread marker in _setSessionViewedCount.

#2973: Clear elapsed-timer attributes and interval when a live compression
card transitions from running to done, preventing the orphan timer from
overwriting the completed card state. Guarded by active-session check.

Tool card duplication: Route tool_complete result to tc.snippet (detail)
instead of tc.preview (header) to prevent identical content appearing in
both the card header and expanded detail section.

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
2026-05-30 00:20:49 +00:00
nesquena-hermes
6d56280e94 test: update session-rotate-url-sync marker for #3018 split assignment (behavior preserved) 2026-05-30 00:16:32 +00:00
Sanjays2402
01c27806d4 Fix #3018: preserve per-turn ephemeral fields across session refreshes
`_turnUsage` (and `_turnDuration`, `_turnTps`, `_gatewayRouting`,
`_statusCard`) are computed client-side in `_finishDone()` and attached
to the last assistant message in `S.messages`. Three code paths replace
`S.messages` wholesale with fresh API data that lacks these fields:

  1. `_restoreSettledSession()` after a late `stream_end` or SSE error.
  2. The late-restore branch after `done` (messages.js ~L2247).
  3. `loadSession()` for active-session external refresh / focus-change.

When any of these fire after `done`, the badge/duration/gateway-pill
flashes for ~1s and disappears, never returning until the next message
or page reload.

Add `_carryForwardEphemeralTurnFields(prev, next)` that matches messages
by `(role, timestamp, content prefix)` — the same identity the renderer
already uses — and copies forward the ephemeral fields when the server
payload is missing them. Wire it into all three replace sites. The fix
is conservative: it only fills slots that are `null` on the new message,
so an authoritative server-side value (if/when the API ever surfaces
per-turn usage) wins automatically.

Picked Option A from the bug report (preserve on the client side) over
Option B (synthesize from `S.lastUsage`) because `lastUsage` is a
session-level aggregate; reconstructing per-turn breakdowns from it is
lossy. Option C (set `_streamFinalized` earlier) would suppress legit
late-arriving server data on transient errors.
2026-05-30 00:11:50 +00:00