Commit graph

367 commits

Author SHA1 Message Date
nesquena-hermes
cec1e87d04 Stage 382: PR #2500 (with whitespace polish on panels.js + ARCHITECTURE.md) 2026-05-18 03:45:02 +00:00
nesquena-hermes
42c677b223 Stage 382: PR #2496 2026-05-18 03:43:59 +00:00
nesquena-hermes
ea1261d03b Stage 382: PR #2501 2026-05-18 03:43:26 +00:00
nesquena-hermes
eef47ea27b Stage 381: PR #2484 2026-05-18 01:32:21 +00:00
nesquena-hermes
50d4f4cfb9 Stage 379: PR #2480
# Conflicts:
#	CHANGELOG.md
2026-05-17 23:35:19 +00:00
nesquena-hermes
6f9cead15e Stage 379: PR #2479 2026-05-17 23:35:18 +00:00
nesquena-hermes
935d9e6402 Stage 379: PR #2461
# Conflicts:
#	CHANGELOG.md
2026-05-17 23:35:18 +00:00
Frank Song
996942429c Add session-bound CSRF token checks 2026-05-18 07:14:26 +08:00
Michael Lam
f986507809 fix: align fork-from-here with merged messaging history 2026-05-17 15:01:57 -07:00
Michael Lam
a5385e5859 feat(runtime): route cancel through RuntimeAdapter seam 2026-05-17 13:23:22 -07:00
nesquena-hermes
46810bd4b2 Stage 376: PR #2457
# Conflicts:
#	CHANGELOG.md
2026-05-17 16:42:10 +00:00
nesquena-hermes
9f09f7e657 Stage 376: PR #2452
# Conflicts:
#	CHANGELOG.md
2026-05-17 16:42:10 +00:00
nesquena-hermes
c1f0f069da Stage 376: PR #2444
# Conflicts:
#	CHANGELOG.md
2026-05-17 16:42:09 +00:00
starship-s
a48cacec73 fix: evict cleared sessions outside session lock 2026-05-17 05:22:39 -06:00
Michael Lam
f56ec1ec35 fix: label email gateway sessions 2026-05-17 02:49:25 -07:00
starship-s
aecad0f427 [verified] Fix WebUI memory session lifecycle commits 2026-05-17 03:30:06 -06:00
Michael Lam
00295a916a fix: deliver manual cron run results 2026-05-17 01:41:06 -07:00
Frank Song
fe55cf5b9e Refresh session context metadata on model changes 2026-05-17 13:27:40 +08:00
Frank Song
1731232a12 Preserve chat start response shape for adapter path 2026-05-17 12:02:54 +08:00
nesquena-hermes
9fec727cf7 Stage 374: PR #2424 — feat(runtime): add default-off RuntimeAdapter seam (HERMES_WEBUI_RUNTIME_ADAPTER=legacy-journal) by @Michaelyklam (refs #1925)
Co-authored-by: Michael Lam <michael@example.local>
2026-05-17 02:49:35 +00:00
nesquena-hermes
8f98465024 Stage 374: PR #2427 — fix(streaming): recover journaled partial assistant output after WebUI restart by @franksong2702 (fixes #2423)
Co-authored-by: Frank Song <franksong2702@gmail.com>
2026-05-17 02:49:35 +00:00
nesquena-hermes
8a950cfbdd Stage 373: PR #2417 — fix(streaming): stale compaction task resume on fresh greetings (closes #2308, supersedes #2309)
Co-authored-by: Frank Song <franksong2702@gmail.com>
2026-05-17 00:22:22 +00:00
nesquena-hermes
9abf17b4f4 Stage 372: PR #2406 — fix: sanitize sync chat history with config by @Michaelyklam (fixes #2398) 2026-05-16 23:03:38 +00:00
Hermes Agent
757f63ee27 Stage 369: PR #2195 — Add OpenRouter cost history backend by @Michaelyklam 2026-05-16 20:03:43 +00:00
Michael Lam
e4dad1c25d fix: serve raw chat attachments from inbox 2026-05-16 05:13:58 -07:00
Michael Lam
690b666887 Add OpenRouter cost history backend 2026-05-15 21:28:54 -07:00
Hermes Agent
b293bf8bc5 stage-364: Opus-caught live SSE event_id fix (side-channel approach)
Replace the earlier frontend-reset approach with a backend side-channel
approach that preserves the queue (event, data) tuple shape.

Problem (Opus catch):
- Live SSE frames emitted by _sse() in api/streaming.py:2296 carried no
  'id:' field. Only journal-replay frames (via _sse_with_id) emitted IDs.
- Frontend's _lastRunJournalSeq cursor stayed at 0 during live streaming.
- Mid-stream error → reconnect-to-replay arrived with after_seq=0.
- Server replayed every journaled event from seq 1.
- assistantText (closure-scoped) had accumulated all live tokens already
  → double-rendered output.

Fix:
- api/config.py: STREAM_LAST_EVENT_ID: dict = {} module-level dict.
- api/streaming.py put(): capture journal event_id, write to
  STREAM_LAST_EVENT_ID[stream_id]. Keep queue tuple as (event, data).
- api/routes.py _handle_sse_stream: read STREAM_LAST_EVENT_ID[stream_id]
  at emit time, use _sse_with_id when set.
- api/streaming.py finally block: pop STREAM_LAST_EVENT_ID for cleanup.

Why side-channel instead of 3-tuple:
- Earlier attempt (queue tuple → (event, data, event_id)) broke 4 existing
  tests: test_cancel_interrupt, test_sprint42, test_sprint51,
  test_issue1857_usage_overwrite. These all unpack 'event, data = q.get()'.
- Frontend-reset approach (reset assistantText before replay) broke 3
  other tests: test_smooth_text_fade, test_streaming_markdown,
  test_streaming_race_fix. _wireSSE must NOT reset accumulators because
  legacy reconnect doesn't replay events; only journal-replay does.

Side-channel preserves both invariants:
- Queue contract stays (event, data) — legacy consumers unbroken.
- Frontend accumulators stay alive on _wireSSE — legacy reconnect unbroken.
- Live SSE emits 'id:' so the journal cursor advances correctly.

6 regression tests added in test_stage364_opus_live_sse_event_id.py.
1 existing test (test_run_journal_streaming_static.test_streaming_journals_sse_events_before_queue_delivery) updated to be tuple-shape-agnostic.

Test results:
- Full pytest: 5713 passed, 10 skipped, 1 xfailed, 2 xpassed, 0 failed
- Previously-failing 5 tests: ALL PASS
- 6 new regression tests: ALL PASS
2026-05-16 03:58:54 +00:00
Hermes Agent
c0662a4624 Stage 364: PR #2283 — Add WebUI run event journal replay by @franksong2702 2026-05-16 03:08:35 +00:00
Frank Song
3b96035af0 Add WebUI run event journal replay 2026-05-16 02:58:34 +00:00
Frank Song
685b075dd0 Avoid touching updated_at during stale stream cleanup 2026-05-16 02:58:33 +00:00
Hermes Agent
1e6ce3d2e7 Merge pull request #2328 into stage-362
fix: clean session attachment and stream recovery leftovers (Michaelyklam, closes #2325)
2026-05-15 22:55:37 +00:00
Michael Lam
8186577c7b feat: show cron output usage metadata 2026-05-15 14:54:20 -07:00
Michael Lam
c991f36021 fix: clean session attachment and stream recovery leftovers 2026-05-15 13:30:46 -07:00
Hermes Agent
3b05929f1a Merge pull request #2299 into stage-360
Fix profile-scoped auxiliary routing for background workers (starship-s)
2026-05-15 16:15:39 +00:00
starship-s
abb6057304 test(profiles): keep profile module reloads isolated 2026-05-15 04:14:09 -06:00
starship-s
4ffecdd7c9 refactor(profiles): consolidate background profile env 2026-05-15 03:58:40 -06:00
starship-s
aa1c7c24f4 fix(profiles): route background aux workers via session profile 2026-05-15 03:02:42 -06:00
Yao Ning
b1bf800fa4 feat: make upload size limit runtime-configurable
Signed-off-by: Yao Ning <zay11022@gmail.com>
2026-05-15 11:39:23 +08:00
Hermes Agent
612480ce56 Merge pull request #2165 into stage-358
feat(providers): show pooled Codex quota status (starship-s, post-review follow-up)
2026-05-14 21:27:51 +00:00
Michael Lam
b15b4eda31 fix: serve PWA manifest from session routes 2026-05-14 11:52:12 -07:00
Jordan SkyLF
339e62528f fix: use documented aux model for update summaries 2026-05-14 08:50:13 -07:00
Hermes Agent
29c166d813 Merge pull request #2234 into stage-355
fix: refine update summary category handling (Jordan-SkyLF, post-v0.51.61 rebase)

# Conflicts:
#	CHANGELOG.md
2026-05-14 15:15:09 +00:00
Hermes Agent
da1ea52143 Merge pull request #2249 into stage-355
Fix metadata-only cache hits in session mutation routes (franksong2702, fixes #2248)

# Conflicts:
#	CHANGELOG.md
#	tests/test_metadata_save_wipe_1558.py
2026-05-14 15:14:50 +00:00
Hermes Agent
8f2bb77cc5 Merge pull request #2244 into stage-355
Fix Archive Session for metadata-only cache hits (franksong2702, fixes #2243)

# Conflicts:
#	CHANGELOG.md
2026-05-14 15:13:47 +00:00
Frank Song
ae8658affa Fix blank skill detail views 2026-05-14 22:28:20 +08:00
Frank Song
0042126473 Fix metadata-only session mutation routes 2026-05-14 22:16:53 +08:00
Frank Song
2b537ffa1b Fix archive metadata-only session reload 2026-05-14 19:31:25 +08:00
Jordan SkyLF
a291ffdde6 fix: refine update summary category handling
Keep distinct generated summary categories, route update-summary generation through the configured auxiliary model first, disclose capped large-range summary input, and constrain long summary panels.
2026-05-14 01:07:47 -07:00
Frank Song
8b30ade923 Add profile creation model picker 2026-05-14 12:13:49 +08:00
Hermes Agent
2accf6335c Merge pull request #2149 into stage-351
perf(sessions): cache CLI session scans (starship-s)

Conflict resolution on api/routes.py:
  (1) Master grew a new helper '_messages_include_tool_metadata()' that
      pr-2149 doesn't have. Kept it (unrelated function — detects whether
      returned messages contain tool metadata, used elsewhere).
  (2) pr-2149 renames the CLI-metadata gate from '_needs_cli_session_metadata'
      to '_session_requires_cli_metadata_lookup' AND broadens it to cover
      legacy-imported sidecars with 'read_only=False' but persisted 'is_cli_session'
      or session_source markers. The new gate is strictly more inclusive than
      the master version — covers (a) is_cli_session, (b) read_only=True,
      (c) session_source in {messaging, external_agent}, AND (d) source_tag,
      raw_source, source, source_label, platform markers. All sessions that
      previously took the slow path still do, plus a few more legacy shapes
      that needed CLI metadata for correct display.
  (3) Removed the obsolete '_needs_cli_session_metadata()' definition from
      master (only consumer migrated to the new name).

29/29 tests pass across test_session_cli_scan_fast_path (new), claude_code
session import, session_index, and session_lineage_full_transcript.
2026-05-13 23:54:15 +00:00