Commit graph

1624 commits

Author SHA1 Message Date
Michael Lam
2e2dca4eb8 test: skip profile skills regression without agent modules 2026-05-08 16:07:49 +00:00
Michael Lam
6c4b769324 fix: scope skills endpoints to active profile 2026-05-08 16:07:49 +00:00
nesquena-hermes
c7272dbfc9
Merge pull request #1911 from nesquena/stage-320
v0.51.25 — Release C: 6-PR streaming/runtime batch (profile-isolated quotas, wedge diagnostics, max_turns, per-turn usage, interim_assistant SSE, workspace dedup)
2026-05-08 08:54:40 -07:00
nesquena-hermes
02b1b156bd chore(release): stamp v0.51.25 — 6-PR Release C streaming/runtime batch + Opus #1861 absorbed fix 2026-05-08 15:52:36 +00:00
nesquena-hermes
72b077ecce Stage 320: PR #1889 — deduplicate workspace-prefixed user turns by @ai-ag2026 2026-05-08 15:48:28 +00:00
ai-ag2026
f6d09e06ca fix: deduplicate workspace-prefixed user turns 2026-05-08 15:37:10 +00:00
nesquena-hermes
518453545c Stage 320: PR #1865 — interim_assistant streaming in runtime + live UI by @franksong2702 2026-05-08 15:37:09 +00:00
nesquena-hermes
035c537281 Stage 320: PR #1861 — overwrite session usage per turn by @franksong2702 2026-05-08 15:37:09 +00:00
Frank Song
8c02bfacd2 Restore explicit tool-segment reset calls for legacy assertions 2026-05-08 15:37:09 +00:00
Frank Song
c1a9d7ce79 fix: overwrite session usage per turn 2026-05-08 15:37:09 +00:00
Frank Song
82c7367cef Add interim_assistant streaming path to WebUI 2026-05-08 15:37:09 +00:00
nesquena-hermes
0039ae8c64 Stage 320: PR #1877 — honor configured max_turns in WebUI agents by @Michaelyklam 2026-05-08 15:37:08 +00:00
nesquena-hermes
f2194f13cd Stage 320: PR #1860 — request wedge diagnostics by @franksong2702 2026-05-08 15:37:08 +00:00
Michael Lam
01b9c82dc9 fix: honor configured max_turns in WebUI agents
Read agent.max_turns when constructing streaming WebUI AIAgent instances, pass it as max_iterations when supported, and include it in the per-session agent cache signature so budget changes take effect.

Add regression coverage for the config read, constructor kwarg, and cache key.
2026-05-08 15:37:08 +00:00
Frank Song
7e2709e281 fix: add request wedge diagnostics 2026-05-08 15:37:08 +00:00
nesquena-hermes
8324cb178f Stage 320: PR #1873 — profile-isolated account usage probes by @franksong2702 2026-05-08 15:37:07 +00:00
Frank Song
6808e06083 fix: isolate profile quota usage probes 2026-05-08 15:37:07 +00:00
nesquena-hermes
773857d159
Merge pull request #1902 from nesquena/stage-319
v0.51.24 — Release B: 5-PR contributor batch (custom-provider preservation, upload preflight, ai-gateway dedup, Kanban lifecycle, cross-container liveness)
2026-05-08 08:35:04 -07:00
nesquena-hermes
4ccee8fb18 chore(release): stamp v0.51.24 — 5-PR Release B contributor batch 2026-05-08 15:32:55 +00:00
nesquena-hermes
a21d14ead3 Stage 319: PR #1886 — Kanban lifecycle controls by @franksong2702 2026-05-08 15:22:48 +00:00
Frank Song
6879390b8f Fix Kanban lifecycle controls
- Remove Kanban card Start and bulk Running controls (PATCH to running was unsafe)
- Rename "Nudge dispatcher" → "Preview dispatcher" (matches dry-run semantics)
- Add empty-board guidance kanban_work_queue_hint

Rebased onto master post-v0.51.23 by maintainer; preserves Japanese translations
from #1863 (kanban_nudge_dispatcher: ディスパッチャープレビュー).

Closes #1885

Co-authored-by: Frank Song <franksong2702@gmail.com>
2026-05-08 15:19:04 +00:00
nesquena-hermes
0cf405cc16 Stage 319: PR #1868 — oversized upload preflight by @franksong2702 2026-05-08 15:16:19 +00:00
Frank Song
29829c3edf fix: preflight oversized browser uploads 2026-05-08 15:16:19 +00:00
nesquena-hermes
a11cbd3ee9 Stage 319: PR #1862 — preserve local custom provider model ids by @franksong2702 2026-05-08 15:16:18 +00:00
Frank Song
414c474d97 fix: preserve local custom provider model ids 2026-05-08 15:16:18 +00:00
nesquena-hermes
1105d496e9 Stage 319: PR #1887 — cross-container gateway liveness via state-file freshness fallback by @Sanjays2402 2026-05-08 15:15:50 +00:00
Sanjay Santhanam
efcfff3d7f fix(#1879): cross-container gateway liveness via state-file freshness
The dashboard banner 'Hermes agent is not responding' fires on every
multi-container deployment that doesn't set 'pid: "service:hermes-agent"'
in compose, because get_running_pid() relies on fcntl.flock and
os.kill(pid, 0) — both PID-namespace-scoped and invisible across container
boundaries.

Fix: when get_running_pid() returns None, fall back to a freshness check on
gateway_state.json. The gateway already writes that file on every tick with
gateway_state == 'running' and an aware ISO-8601 updated_at timestamp, so a
recent (<= 120s) timestamp is an equivalent live-process signal that needs
only a shared volume — no PID namespace, no compose workaround, no extra
HTTP probe URL.

Behavior preserved:
- In-namespace deployments still hit the PID-based path first; payload shape
  unchanged (no 'reason' key) so #716 contract holds.
- Cross-container alive path adds reason='cross_container_freshness' so
  support diagnostics can tell which signal succeeded.
- Stale updated_at, non-running gateway_state, malformed/naive/missing
  timestamps, and timestamps far in the future all still report 'down' — the
  fallback never produces a false positive.
- Same redaction rules: argv/command/executable/env/raw pid never leak.

Tests: 15 new cases in test_issue1879_cross_container_gateway_liveness.py
covering the cross-container alive path, every refusal case, clock-skew
tolerance, and backward compat with the #716 PID path. Existing #716
heartbeat tests (8) continue to pass.
2026-05-08 15:15:50 +00:00
nesquena-hermes
2c2e5142e3 Stage 319: PR #1883 — phantom duplicate Custom group when active provider is ai-gateway by @Sanjays2402 2026-05-08 15:15:49 +00:00
Sanjay Santhanam
a958c29373 fix(config): phantom Custom group when active provider is ai-gateway (#1881)
Two bugs in get_available_models() conspired to duplicate the active
provider's auto-detected models under a phantom 'Custom' group whenever
custom_providers was also declared in config.yaml:

1. custom:* PIDs not in _named_custom_groups (e.g. stale slugs left from
   prior configs) fell through to the auto_detected_models fallback, copying
   the active provider's whole catalog into a phantom Custom: <slug> group.
   Fix: continue unconditionally for ANY custom:* PID — the named-group
   branch is the only legitimate population path.

2. The bare 'custom' PID, with the active provider being concrete (e.g.
   ai-gateway), hit 'elif auto_detected_models: copy.deepcopy(...)' and
   built a duplicate Custom group of the active provider's models with
   mismatched provider prefixes. Fix: when pid == 'custom' and the active
   provider is non-custom, leave models_for_group empty.

The reporter also suggested a third fix gating resolve_model_provider() on
config_provider — that's intentionally NOT applied because it conflicts with
the long-standing model-specific-override semantics covered by
test_model_resolver.py::test_custom_provider_*_routes_to_named_custom_provider
(custom_providers entries explicitly override the active provider's routing
when the user opted-in). The reporter's symptom (duplicate UI group) lives
entirely in get_available_models()'s group construction and is fully fixed
by the two changes above.

Tests: 6 new regression tests (3 in #1881 file + reuse), 774 broader
tests still green (model/provider/custom/config domain).
2026-05-08 15:15:49 +00:00
nesquena-hermes
82aa628317
Merge pull request #1899 from nesquena/stage-318
v0.51.23 — Release A: 7-PR contributor batch (stale-cleanup, title refresh, ja i18n, Kanban + cron + workspace polish)
2026-05-08 08:13:49 -07:00
nesquena-hermes
8e72dc771a chore(release): stamp v0.51.23 — 7-PR Release A contributor batch 2026-05-08 15:11:13 +00:00
nesquena-hermes
2c66d349ab Stage 318: PR #1872 — Fix workspace heading affordance without workspace by @franksong2702 2026-05-08 15:01:50 +00:00
nesquena-hermes
0ba6724e16 Stage 318: PR #1871 — Fix no-agent cron edit snapshot source by @franksong2702 2026-05-08 15:01:50 +00:00
nesquena-hermes
94d3cd5e95 Stage 318: PR #1870 — Fix Kanban stale-client false-positive by @franksong2702 2026-05-08 15:01:49 +00:00
nesquena-hermes
b5f8a48de5 Stage 318: PR #1869 — Test Kanban double-404 guard across methods by @franksong2702 2026-05-08 15:01:49 +00:00
nesquena-hermes
2730d775c2 Stage 318: PR #1863 — i18n: add Japanese (ja) locale bundle by @koshikai 2026-05-08 15:01:49 +00:00
nesquena-hermes
0dcce8e434 Stage 318: PR #1859 — fix: persist generated title refresh marker by @ai-ag2026 2026-05-08 15:01:48 +00:00
nesquena-hermes
c8e6207ca3 Stage 318: PR #1856 — fix: preserve pending turn during stale cleanup by @ai-ag2026 2026-05-08 15:01:48 +00:00
Frank Song
ee0828f53d fix: disable workspace heading affordance without workspace 2026-05-08 13:32:05 +08:00
Frank Song
b0876982c4 fix: use cron edit snapshot for no-agent saves 2026-05-08 13:18:29 +08:00
Frank Song
153c34cac0 fix: tighten Kanban stale-client heuristic 2026-05-08 13:12:16 +08:00
Frank Song
b684317554 test: parametrize kanban double-404 guard across HTTP methods 2026-05-08 12:48:23 +08:00
koshikai
9ddd1ae02c i18n: add Japanese (ja) locale bundle 2026-05-08 10:16:54 +09:00
ai-ag2026
755c18bdf9 fix: persist generated title refresh marker 2026-05-08 01:36:10 +02:00
ai-ag2026
f69a81c8c3 fix: preserve pending turn during stale cleanup 2026-05-07 23:57:01 +02:00
nesquena-hermes
5005f1c8ba
Merge pull request #1853 from nesquena/fix/1793-workspace-prefs-kebab
fix(workspace): move 'Show hidden files' toggle into kebab + accent-dot state indicator (#1793)
2026-05-07 14:19:34 -07:00
nesquena-hermes
8804a5c5e9
Merge pull request #1854 from nesquena/stage-316
Stage 316: 3-PR batch — P0 markdown streaming hotfix + CSP source-map allowance + LaTeX delimiter rendering
2026-05-07 14:17:42 -07:00
nesquena-hermes
bbf707aa1c chore(release): document late absorbed commits — d703959 (code-fence-vs-math ordering) + 1448f42 (csp test pathlib)
Both stage-316 absorption commits documented in CHANGELOG. Test count
bumped 4815 → 4817 (+2 from d703959 regression coverage). Pre-release
pytest re-run confirmed 4790 passed, 0 failed.
2026-05-07 21:16:59 +00:00
ChaseFlorell
9a6e7483f6 test: align csp test with pathlib rooting pattern from existing suite
Use Path(__file__).resolve().parents[1] so the test survives being run
from a non-repo-root cwd, matching test_issue1112_csp_google_fonts.py.

Absorbed from PR #1852 follow-up commit 1448f42 by @ChaseFlorell.

Co-authored-by: Chase Florell <ChaseFlorell@users.noreply.github.com>
2026-05-07 21:14:16 +00:00
Nathan Esquenazi
d703959b74 fix(user-bubble): stash code fences before math to keep code-blocks literal
PR #1854 added a math stash to _renderUserFencedBlocks so backslash LaTeX
delimiters (\[..\], \(..\)) survive esc() and reach the KaTeX renderer in
user bubbles. The stash ran BEFORE the existing code-fence stash, so a
user-typed code block containing LaTeX-like syntax was extracted as
KaTeX and rendered as math inside <pre><code>:

    ```
    \[ a + b \] is wrong
    ```
  → <pre><code><div class="katex-block"> a + b </div> is wrong</code></pre>

renderMd() (assistant path) handles this correctly by running fence_stash
before math_stash. The user-bubble path got the order inverted. Fix:
stash code fences first, then run the math regexes on the
outside-of-fence text only. Both top-level math and code-fenced literals
now render correctly:

  - "math: \[ x + y \]"           → KaTeX block
  - "```\n\[ a + b \]\n```"       → literal <pre><code>\[ a + b \]</code></pre>

Adds two regression tests:
  - test_user_code_block_with_latex_syntax_renders_as_literal_code
    (fails pre-fix, asserts no KaTeX wrappers inside <pre><code>)
  - test_user_bubble_top_level_latex_still_renders_after_fence_reorder
    (sibling guard against over-correcting and disabling math entirely)

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-07 14:03:04 -07:00