Commit graph

1622 commits

Author SHA1 Message Date
nesquena-hermes
87fa0a2ace
feat(workspace): optional Todos tab in workspace panel (#3564) (#4209)
* feat(workspace): add Todos tab to workspace panel behind a setting (#2942)

* fix(workspace): use DOM attribute to check active tab across script scope

* Prefer the live todos snapshot in the workspace tab

* Fill the missing workspace Todos locale keys

* feat(workspace): add optional Todos tab to workspace panel (#3564)

Rebased rodboev's #3564 onto current master + CHANGELOG entry.

Co-authored-by: Rod Boev <rod.boev@gmail.com>

* fix(#3564): apply workspace Todos tab visibility on cold boot

Codex gate: boot.js set window._workspaceTodosTab from saved settings but
never called _applyWorkspaceTodosTabVisibility(), so a previously-enabled
Todos tab stayed hidden on a normal page reload (only re-appeared after
opening Settings). Call the visibility helper after assigning the flag in
both the settings-apply and the fallback/default paths.

Co-authored-by: Rod Boev <rod.boev@gmail.com>

* chore(release): stamp v0.51.422 (Release OI) for #3564

---------

Co-authored-by: Rod Boev <rod.boev@gmail.com>
Co-authored-by: nesquena-hermes <agent@nesquena-hermes>
2026-06-14 17:31:13 -07:00
nesquena-hermes
92ecf8edb4
fix(models): preserve colon-suffixed model IDs in normalization (#3959, ships #4196) (#4204)
* fix(models): preserve colon-suffixed model IDs in normalization (#3959)

* fix(models): align configured-model normalizer parity (#3959)

* chore(release): stamp v0.51.421 (Release OH) CHANGELOG for #3959/#4196

---------

Co-authored-by: Rod Boev <rod.boev@gmail.com>
Co-authored-by: nesquena-hermes <agent@nesquena-hermes>
2026-06-14 16:27:39 -07:00
nesquena-hermes
6c6444396d
fix(#3750): preserve LM Studio auth on reasoning probe (self-rebased #3837 + credential hardening) (#4202)
* fix(#3750): preserve LM Studio auth on reasoning probe

Rebased rodboev's #3837 onto current master (master reworked
resolve_model_reasoning_efforts via #3431 with a combined hermes_cli
import + _nested_route_reasoning_denied guard). Threaded the api_key
resolution + the _lmstudio_model_reasoning_options wrapper + the
HTTP-fallback probe into master's current structure; intent preserved
byte-identically (+164/-24, same as the original PR diff).

Co-authored-by: Rod Boev <rod.boev@gmail.com>

* fix(#3837): gate LM Studio probe credential to configured endpoint + no-redirect opener

Codex security review (CORE) on the rebased #3837: GET /api/reasoning accepts
a caller-supplied base_url, and the new probe attached the configured LM Studio
API key as a Bearer token; urllib also re-sends Authorization across redirects.
Together that could exfiltrate the stored credential to an attacker-controlled
host. (master only escalates here because master probed WITHOUT a key.)

Fixes:
1. Only forward the LM Studio credential when the probe target normalizes to
   the configured LM Studio base URL (reuses _normalize_base_url_for_match);
   a caller-supplied non-matching base_url is probed keyless.
2. _lmstudio_reasoning_probe_options_fallback uses a no-redirect opener
   (_NoRedirectHandler) so a 3xx can't forward the Authorization header onward.
3. Two regression tests: caller-supplied base_url drops the key; redirect is
   not followed (credential never reaches the redirect target).

Co-authored-by: Rod Boev <rod.boev@gmail.com>

* fix(#3837): route ALL credentialed LM Studio probes through the no-redirect probe

Codex re-gate caught that the first fix only hardened the built-in fallback;
in production hermes_cli IS importable, so the preferred path called
hermes_cli.models.lmstudio_model_reasoning_options(..., api_key=...) which uses
plain urlopen and still follows redirects with the credential.

Fix: _lmstudio_model_reasoning_options now short-circuits to the built-in
no-redirect probe whenever api_key is set; the hermes_cli path is used ONLY for
keyless probes (no credential to leak). Reworked tests accordingly:
- test_credentialed_probe_never_calls_hermes_cli: credentialed probe bypasses CLI
- test_keyless_probe_logs_signature_mismatch_before_fallback: keyless CLI degrade
- test_credentialed_probe_does_not_follow_redirects_end_to_end: E2E through
  resolve_model_reasoning_efforts with real hermes_cli; redirect target never hit

Verified both security tests fail without the guard and pass with it.

Co-authored-by: Rod Boev <rod.boev@gmail.com>

* chore(release): stamp v0.51.420 (Release OG) in CHANGELOG

---------

Co-authored-by: nesquena-hermes <agent@nesquena-hermes>
Co-authored-by: Rod Boev <rod.boev@gmail.com>
2026-06-14 15:46:35 -07:00
nesquena-hermes
42c359abd6 Apply Codex fix: gateway done-payload uses _session_payload_with_full_messages too (sibling of streaming done/error sites) + test 2026-06-14 20:38:43 +00:00
ai-ag2026
3030babb10 fix: keep settled stream message counts consistent 2026-06-14 20:33:56 +00:00
nesquena-hermes
593acd6720 Merge PR #3881: cache + single-flight /api/sessions payloads (#3791) 2026-06-14 18:53:57 +00:00
nesquena-hermes
0d749ed9ee Merge PR #4166: keep complete sidebar metadata on index fastpath 2026-06-14 18:37:55 +00:00
nesquena-hermes
e3e14b07e3 Merge PR #4186: fix misleading error in regenerate-title endpoint (copy) 2026-06-14 18:04:40 +00:00
Rod Boev
43ec609772 Fix misleading error message in regenerate-title endpoint 2026-06-14 13:50:38 -04:00
Rod Boev
521d4434c9 fix(approval): extract _webui_mirror_token literal into named constant 2026-06-14 17:48:37 +00:00
Rod Boev
bd216432b3 fix(approval): stable mirror token via entry.data, guard stale explicit id fallthrough 2026-06-14 17:48:37 +00:00
Rod Boev
c789504a0f Avoid CI-only approval mirror regressions 2026-06-14 17:48:37 +00:00
Rod Boev
6cef9d7055 fix(approval): keep mirrored pending state aligned with gateway lifecycle (#4107) 2026-06-14 17:48:37 +00:00
Rod Boev
2db3e046d8 fix(approval): log empty gateway queue entries for diagnostics 2026-06-14 17:48:37 +00:00
Rod Boev
92e3aac1c5 fix(approval): restore pending fallback reliability (#4107) 2026-06-14 17:48:37 +00:00
nesquena-hermes
ec535daded Merge PR #4184: regenerate-title for CLI/TUI sessions lacking sidecar (#4183) 2026-06-14 17:36:17 +00:00
nesquena-hermes
f06492b3ee Merge PR #4148: surface gateway reasoning previews in WebUI (#4146) 2026-06-14 17:36:17 +00:00
Rod Boev
e0dbbaec82 Materialize CLI/TUI sessions before regenerating title (#4183) 2026-06-14 13:21:32 -04:00
Rod Boev
769fd11f22 fix(#4146): read reasoning_content gateway chunks 2026-06-14 10:22:43 -04:00
ai-ag2026
7c69f71ff9 fix: refresh stale zero-message snapshots 2026-06-14 08:26:59 +02:00
ai-ag2026
514af98362 perf: keep complete sidebar metadata on index fastpath 2026-06-14 08:26:59 +02:00
Rod Boev
bc5fceb88a fix(streaming): provider-gate title-gen reasoning extra_body (#4161, #2083)
Consolidates #4162 + #3944. Aux path: skip the reasoning-disable inject for
routes that 400 on it via _route_rejects_reasoning_extra — hostname-matched
OpenAI / Azure OpenAI / Azure AI Foundry (+ provider aliases openai*/azure*/
azure-foundry/azure-ai*) and OpenRouter Anthropic mandatory-reasoning; keep it
for local/OpenRouter-non-anthropic/other reasoning routes (#4161). Agent path:
rely on the existing agent.reasoning_config={enabled:False} + _build_api_kwargs()
(route-correct per provider profile) rather than re-injecting a generic disable
on top of it; only MiniMax reasoning_split is added (unchanged from master).

Co-authored-by: Rod Boev <rod.boev@gmail.com>
2026-06-14 05:22:47 +00: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
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
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
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
Rod Boev
42e85813a3 fix(#4146): preserve gateway reasoning previews on reload 2026-06-13 21:18:43 -04:00
Rod Boev
79cefa736c fix(#4146): accept text-only gateway thinking previews 2026-06-13 19:29:02 -04: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
fa19eae6d1 Merge #3940 v2 (claim probe workers under pool lock, #3787) onto master 2026-06-13 22:05:05 +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
Rod Boev
6a27b414c6 Preserve imported title rework without breaking route invariants 2026-06-13 17:34:22 -04:00
nesquena-hermes
f7047d4d19 Merge #4072 (wire /credits through WebUI command dispatch, #4071) onto master 2026-06-13 21:15:22 +00:00
Rod Boev
e1ec41b32c fix(session): reload latest imported session before title save (#3987) 2026-06-13 16:47:57 -04:00
Rod Boev
bb8d5e9587 fix(providers): claim probe workers under the pool lock (#3787) 2026-06-13 16:42:43 -04:00
nesquena-hermes
12107f3ae5 Merge #4011 (push source filters into agent session scans, #3930) onto master 2026-06-13 20:17:51 +00:00
nesquena-hermes
30cc15975e fix(#4130): coerce stale 'max' in get_reasoning_status read path too (Codex catch)
get_reasoning_status() returned the raw config reasoning_effort, so a stale saved
'max' surfaced on boot/status/chip even though streaming coerces it to xhigh. Now
routes the status value through coerce_reasoning_effort_for_model() with the resolved
model/provider/base_url, so all read paths agree. Added a stale-max->xhigh status
regression test.
2026-06-13 18:50:00 +00:00
Rod Boev
95bb9ebe66 Keep stale max configs on the supported path 2026-06-13 14:33:26 -04:00
Rod Boev
c7c313672c fix(reasoning): hide unsupported max effort (#4119) 2026-06-13 14:33:26 -04:00
Rod Boev
840f12a74e fix(commands): keep bundle profile scoping strict (#4087) 2026-06-13 14:06:35 -04:00
Rod Boev
5a3c6c6f05 fix(commands): surface skill bundles in WebUI slash commands (#4087) 2026-06-13 14:06:35 -04:00
nesquena-hermes
465d229800 Merge #4103 (surface dirty install state in update-check, #4085) onto master
# Conflicts:
#	CHANGELOG.md
2026-06-13 17:38:48 +00:00