Commit graph

4720 commits

Author SHA1 Message Date
Sanjay Santhanam
6dd6bced67 fix(transcript): preserve subagent accent over tool-card border-left (review feedback from @nesquena-hermes) 2026-05-25 23:10:39 -07:00
Isla-Liu
ecfa580660 fix(config): exclude credential-rotation fields from models-cache auth.json fingerprint
auth.json is rewritten by credential-pool/OAuth token refresh roughly every
14 minutes. _models_cache_source_fingerprint() hashed it via mtime/size
(#1699 _models_cache_file_fingerprint), so every token refresh churned the
fingerprint and the 24h /api/models cache was effectively dead -- the hot
GET /api/session?resolve_model=1 path paid a cold ~11.5s rebuild every few
minutes (RCA t_d127953d residual #2, t_16551f61).

Add _auth_store_semantic_fingerprint(): content-hash auth.json with a
DENY-list of known credential-rotation-only keys (access/refresh token,
expiry, per-credential status/telemetry, request_count, save updated_at)
stripped. Deny-list (not allow-list) is deliberate -- any unknown field, or
a real provider/endpoint/model-set change (active_provider, a new
credential_pool entry, base_url, source, label, auth_type, the providers{}
block, ...) stays in the fingerprint and still correctly busts the cache.
Conservative fallbacks: missing file -> marked; unreadable/corrupt ->
stat-based fallback (never less safe than pre-fix). config.yaml keeps the
cheap stat fingerprint (deliberate edits, no timer churn).

Bidirectional invariant regression test (non-tautological -- the
end-to-end churn test flips RED when the auth_json axis is reverted to
stat-based): token-only churn keeps fingerprint byte-identical AND keeps a
valid disk cache loadable; active_provider change / new credential_pool
entry / changed base_url each flip the fingerprint AND reject the stale
disk cache. Measured: 5/5 cold rebuilds per 5 refresh cycles -> 0/5.

Tests: 9 new pass; 28 adjacent (#1699/#1633/display-resolver) pass;
54 models_cache/fingerprint suite pass.
2026-05-26 12:46:59 +08:00
Frank Song
a9ea56040f Tighten interim progress activity boundaries 2026-05-26 11:32:34 +08:00
Frank Song
fb2b1ebd19 Clarify contract routing coverage boundary 2026-05-26 11:32:34 +08:00
Frank Song
8f152a005e docs: require contract change routing 2026-05-26 10:06:50 +08:00
Frank Song
26fb71839e fix(chat): keep visible interim progress in timeline 2026-05-26 09:53:55 +08:00
Frank Song
7a52dec35d feat(chat): open workspace links in preview 2026-05-26 08:57:31 +08:00
dobby-d-elf
ca9e821b5e Reduce session index churn on chat start 2026-05-25 16:25:23 -06:00
dobby-d-elf
594627806c adjust delete/archive/restore text color 2026-05-25 16:04:41 -06:00
Sanjay Santhanam
655b5f9101 docs(docker): point gateway-not-configured banner at a real fix
Scheduled cron jobs created in the Tasks panel never tick on a
single-container Docker install because the WebUI doesn't run the
gateway daemon itself. The maintainer's analysis on #2785 spells this
out: the gateway ticks the scheduler every 60s, and without it
'Gateway not configured' just sits there.

The Tasks panel already shows a banner explaining this, but doesn't
give the user anywhere to go. Two small docs-shaped changes:

1. Add a 'Scheduled jobs require a gateway daemon' section to
   docs/docker.md under 'What goes wrong' with the two-container
   compose command and a verify step. Cross-linked from the existing
   short paragraph higher up so both entry points land on the same
   fix.

2. Append a 'How to enable scheduled jobs in Docker' link to the
   cron panel banner (loadCronGatewayNotice) pointing at the new
   docs anchor when the gateway is unconfigured. The banner text
   itself is unchanged.

Verified locally by serving the WebUI without a gateway, opening
Tasks, and confirming the banner now shows the new link; clicked it
and confirmed it lands on the new docs section. With the gateway
running the banner stays hidden as before.

Refs #2785
2026-05-25 11:35:24 -07:00
Sanjay Santhanam
51f333fef0 fix(providers): clearer toast on 403 when removing a provider key
The Remove button under Settings -> Providers calls
POST /api/providers/delete, which runs through _check_csrf. When the
CSRF cookie/header pair has drifted (typically a tab opened before the
most recent login or cookie rotation), the server returns 403 with the
string 'Cross-origin request rejected'. That string reads like a
reverse-proxy deployment problem and gives the user no next step (#2572).

Surface a recovery-shaped toast on 403 from this endpoint:
'Session expired. Reload the page and try again.' The underlying
server response is unchanged so logs/diagnostics still see the original
string; only the user-facing toast is replaced for this code path.

Verified locally by patching _check_csrf to return False, clicking
Remove on a provider card, and confirming the toast now reads the new
message instead of the raw cross-origin string.

Refs #2572
2026-05-25 11:28:14 -07:00
Sanjay Santhanam
d86e841f0b fix(transcript): make tool cards visually distinct without hover
The tool-card border-subtle was so faint that the cards visually melted
into the surrounding prose once the cursor left the conversation. Bumps
the resting border to --border-muted and adds a 2px left edge so a tool
output row reads as metadata at a glance, even on light skins where
border-subtle is barely visible. Hover still escalates to --border2.

Verified by loading a session with mixed tool calls and assistant prose
on the light theme and confirming the tool cards are now identifiable
without mousing over them.

Refs #2867
2026-05-25 11:22:35 -07:00
nesquena-hermes
48a2e79224
Merge pull request #2947 from nesquena/release/stage-batch19
Release DI — stage-batch19 — 6-PR medium-risk batch (v0.51.137)
2026-05-25 10:56:06 -07:00
nesquena-hermes
4d3a59d72c stage-batch19: stamp v0.51.137 / Release DI 2026-05-25 17:52:38 +00:00
nesquena-hermes
f13433b7d3 stage-batch19: backfill CHANGELOG entry for #2915 (marker-based anchor) 2026-05-25 17:48:43 +00:00
george-andraws
0f388de09c fix duplicate chat upload filenames 2026-05-25 17:48:19 +00:00
nesquena-hermes
0c6af12723 Merge pull request #2933
# Conflicts:
#	CHANGELOG.md
2026-05-25 17:48:05 +00:00
nesquena-hermes
7c666d8e4d Merge pull request #2913
# Conflicts:
#	CHANGELOG.md
2026-05-25 17:47:51 +00:00
nesquena-hermes
fb9d67865b Merge pull request #2937
# Conflicts:
#	CHANGELOG.md
2026-05-25 17:47:36 +00:00
nesquena-hermes
c6869806f0 Merge pull request #2923
# Conflicts:
#	CHANGELOG.md
2026-05-25 17:47:23 +00:00
nesquena-hermes
c2fc390723 Merge pull request #2915 2026-05-25 17:46:56 +00:00
nesquena-hermes
2577432f14
Merge pull request #2945 from nesquena/release/stage-batch18
Release DH — stage-batch18 — 5-PR streaming + session index batch (v0.51.136)
2026-05-25 10:25:05 -07:00
nesquena-hermes
785b3eebb5 stage-batch18: stamp v0.51.136 / Release DH 2026-05-25 17:21:47 +00:00
nesquena-hermes
668cdeade0 stage-batch18: backfill CHANGELOG entry for #2907 2026-05-25 17:18:17 +00:00
nesquena-hermes
4a8b29db9e Merge pull request #2928
# Conflicts:
#	CHANGELOG.md
2026-05-25 17:18:02 +00:00
nesquena-hermes
f6dc7aad6f Merge pull request #2907 2026-05-25 17:17:44 +00:00
nesquena-hermes
68afa0e44a Merge pull request #2932
# Conflicts:
#	CHANGELOG.md
2026-05-25 17:17:44 +00:00
nesquena-hermes
0be9874549 Merge pull request #2918
# Conflicts:
#	CHANGELOG.md
2026-05-25 17:17:31 +00:00
nesquena-hermes
6eaddada93 Merge pull request #2934
# Conflicts:
#	CHANGELOG.md
2026-05-25 17:17:06 +00:00
nesquena-hermes
a0ab1687b1
Merge pull request #2944 from nesquena/release/stage-batch17
Release DG — stage-batch17 — 9-PR small-fix batch (v0.51.135)
2026-05-25 10:14:51 -07:00
nesquena-hermes
fe9d95e22b stage-batch17: skip #2927 test file when hermes-agent module not available (CI fix) 2026-05-25 17:11:59 +00:00
nesquena-hermes
41e424b3d5 stage-batch17: stamp v0.51.135 / Release DG 2026-05-25 17:06:27 +00:00
nesquena-hermes
fa9881445a stage-batch17: backfill CHANGELOG entries for #2906 and #2940 2026-05-25 17:03:00 +00:00
nesquena-hermes
f7ff8b5297 Merge pull request #2919
# Conflicts:
#	CHANGELOG.md
2026-05-25 17:02:33 +00:00
nesquena-hermes
bf28f400ec Merge pull request #2921
# Conflicts:
#	CHANGELOG.md
2026-05-25 17:02:16 +00:00
nesquena-hermes
67b41b2b54 Merge pull request #2927 2026-05-25 17:02:02 +00:00
nesquena-hermes
fdb0ccb392 Merge pull request #2940 2026-05-25 17:02:02 +00:00
nesquena-hermes
84218ce5a9 Merge pull request #2936
# Conflicts:
#	CHANGELOG.md
2026-05-25 17:02:02 +00:00
nesquena-hermes
d86aa6013f Merge pull request #2906 2026-05-25 17:01:47 +00:00
nesquena-hermes
da25aad946 Merge pull request #2912
# Conflicts:
#	CHANGELOG.md
2026-05-25 17:01:47 +00:00
nesquena-hermes
c876724ff4 Merge pull request #2922 2026-05-25 17:01:32 +00:00
nesquena-hermes
6b80df8252 Merge pull request #2917 2026-05-25 17:01:27 +00:00
george-andraws
fe597c1cdf fix chat upload attachment paths 2026-05-25 09:12:14 -07:00
Rehan Khan
0db8f5ded4 fix(terminal): harden supervisor lifecycle and eliminate timeout race conditions
- Split timeout state from spawn completion using timed_out flag
- Ensure request.done represents only spawn completion
- Add per-request locking to enforce atomic lifecycle resolution
- Prevent late Popen results from mutating timed-out requests
- Reap abandoned subprocesses before terminal registry assignment
- Strengthen supervisor stability under repeated failure and mixed workloads
- Add regression coverage for timeout + race + failure scenarios
2026-05-25 20:45:17 +05:00
Frank Song
3ee0173cd3 feat(server): allow extra CSP connect sources 2026-05-25 21:48:52 +08:00
Frank Song
aa6daf82f2 fix(gateway): treat active sessions as configured 2026-05-25 21:48:51 +08:00
Frank Song
524ed6cce3 fix(streaming): preserve profile env for checkpoints 2026-05-25 21:29:06 +08:00
Frank Song
e265389116 perf(sessions): prime missing index in background 2026-05-25 21:21:20 +08:00
Frank Song
459286830b fix(session): preserve sidecar truncation boundary 2026-05-25 21:21:15 +08:00
ai-ag2026
47f6648905 fix(chat): keep one live SSE source per stream 2026-05-25 13:14:55 +02:00