Commit Graph
81 Commits
Author SHA1 Message Date
n 6d2289d865 Merge PR #7546: fix(steer): resolve the active worker after compression without cache eviction 2026-09-20 23:16:50 +00:00
n 207d165184 Merge PR #6962: fix(commands): autocomplete only announces webui-dispatchable slash commands 2026-09-20 12:32:05 +00:00
n 1800233b5c Merge PR #6989: fix(async): atomic per-origin wakeup admission prevents budget exhaustion 2026-09-20 10:43:48 +00:00
n 8bef9c44f5 Merge PR #7654: fix(media): session auth and snapshot capture inspect Codex commentary sidecars 2026-09-20 09:01:03 +00:00
n 9960d09d97 Merge PR #7401: fix(picker): keep custom model names containing colons whole 2026-09-20 06:42:46 +00:00
n fe47d3f4ac Merge PR #7124: fix(ui): keep context compactions visible in long transcripts 2026-09-20 04:10:00 +00:00
n 2ce84d9216 Fold gate fix: keep natural-language recurring schedules verbatim (#7649) 2026-09-20 03:14:48 +00:00
n bc9390da63 Merge PR #7649: fix(cron): round-trip a parseable schedule on edit/duplicate; 400 on bad input 2026-09-20 03:14:22 +00:00
n ac787e5ebb Merge PR #7630: fix(projects): tag scan-minted system projects to the scanned profile 2026-09-20 03:14:22 +00:00
n 3da9a0975c Merge PR #7641: fix(redaction): validate MPF JPEG attachments before the native-image exemption 2026-09-20 02:25:35 +00:00
n 9dbd647f40 Merge PR #7643: fix(logging): preserve access logs during agent stdout capture 2026-09-20 00:45:40 +00:00
n 5bf257aa9a Merge PR #7636: perf(sessions): call-scoped profile-home resolve cache 2026-09-20 00:39:42 +00:00
n e74aa7ec3a Merge PR #7276: perf(redaction): stop re-doing constant redaction work on every /api/session response 2026-09-20 00:02:06 +00:00
n eb7f5df284 Merge PR #7394: fix(tts): honor the persisted TTS engine when requests omit it 2026-09-20 00:02:05 +00:00
n 770174f8fe docs(changelog): stamp #7618 renderer + #7619 Extensions i18n 2026-09-18 23:41:51 +00:00
n 27bed49ee4 test(renderer): pin master-parity for malformed trailing-text table rows
Round-3 gate finding: the downstream table regex lacks an end-of-line anchor, so
it accepts a prefix that the physical-line guard rejects (e.g.
'| h<br>x | n |\n|---|---| trailing').

Measured against MASTER rather than against the intermediate commit: master does
not render that input as a table either, so the stage is at parity, not
regressed. Across the edge-case matrix (indented, CRLF, trailing-space, padded
separator, blank-line delimited, mid-document) the stage is equal to master on
the two malformed inputs and strictly better on six genuine tables.

Pinned as a regression so any future change to the table guard has to make a
deliberate decision about this input instead of changing it silently.
2026-09-18 22:41:56 +00:00
nandJayaMegelar 49d4aab4e2 fix(renderer): match the table-row guard to the real table grammar
Third gate finding: the table-row predicate accepted ANY pipe-wrapped line, but
the downstream table parser only accepts a run of pipe-lines whose SECOND line
is a separator. So pipe-delimited prose such as '| note<br># heading |' was
treated as a table row and kept its literal <br>, silently losing heading/list
rendering that master renders correctly.

The guard now classifies complete blocks with the parser's own grammar
(row regex + separator check) and converts <br> on every unclassified line.
Verified: all non-table cases now match master byte-for-byte, while genuine
multi-row tables keep <br> in every data cell.

Co-authored-by: JayaMegelar <JayaMegelar@users.noreply.github.com>
2026-09-18 22:33:38 +00:00
nandJayaMegelar 75d51d5ee2 fix(renderer): repair two gate-found defects in the #7618 fix
The release gate (Codex, adversarial pass) reproduced two SILENT regressions
introduced by the original implementation. Both are fixed here with
revert-sensitive regressions.

1. Collidable sentinel. Table-row <br> was stashed as a fixed \x00BR\x00 token
   and that token was unconditionally rewritten back to <br> afterwards, so
   user-supplied text containing the literal token was corrupted -- in prose it
   became a <br>, and inside a link URL it broke the anchor apart. Replaced with
   conditional conversion: <br> becomes a newline only on non-table-row lines,
   so no placeholder is ever introduced and nothing user-suppliable is rewritten.

2. Lost HTML emphasis. The stricter italic regex (which correctly stops
   'a * b * c' from italicising) also rejected the '* x *' produced by the
   <em>/<i> pre-pass, so '<em> italic </em>' degraded to literal asterisks -- and
   to a bullet list at line start. Boundary whitespace is now kept OUTSIDE the
   generated delimiters.

Verified against the real renderMd(): output for both cases now matches master,
while the table-cell <br> and spaced-asterisk fixes still hold. A revert probe
confirms all five new regressions fail against the defective implementation.

Co-authored-by: JayaMegelar <JayaMegelar@users.noreply.github.com>
2026-09-18 22:24:45 +00:00
n 4e70791757 chore: trim trailing blank line at EOF (pre-release whitespace gate) 2026-09-18 22:12:03 +00:00
nandYularzhi 33d19811ab Merge PR #7619: fix(i18n): route the Extensions panel through t() and patch all 15 locales (#7581)
Co-authored-by: Yularzhi <Yularzhi@users.noreply.github.com>
2026-09-18 22:11:29 +00:00
nandJayaMegelar 78818c1566 Merge PR #7618: fix(renderer): preserve <br> in table cells and fix bullet list italic collision
Co-authored-by: JayaMegelar <JayaMegelar@users.noreply.github.com>
2026-09-18 22:11:24 +00:00
n c8a443454c Stage: PR #7315 — SIGTERM+SIGINT graceful shutdown by @aniruddhaadak80 (closes #7078) 2026-09-12 02:44:44 +00:00
n c196306fcb Stage: PR #7337 — chat-attachment upload anchored O_EXCL (TOCTOU) by @zicochaos 2026-09-12 01:26:51 +00:00
n cb5e1974d1 Stage: PR #7372 — serve static binaries with correct MIME types by @Oidaladn0 2026-09-12 01:26:51 +00:00
n a284d478d4 docs: credit key_cmd cache fix (#7398) 2026-09-10 05:43:14 +00:00
n f08c8426e1 test: keep key_cmd laziness assertion at construction boundary 2026-09-10 04:48:14 +00:00
n f74b8a7c86 Merge remote-tracking branch 'origin/pr/7398-head' into release/exp289-pr7398 2026-09-10 04:41:05 +00:00
n a8f46e899e docs: credit bounded sidebar cache fix (#7489) 2026-09-10 00:09:11 +00:00
nandMartin Dell 3e616ad455 fix: harden bounded sidebar cache projection (#7489)
Preserve nested request isolation, make the response allowlist single-source,
and strip heavy fields from existing index rows after reconciliation.

Co-authored-by: Martin Dell <martindell@users.noreply.github.com>
2026-09-09 23:36:41 +00:00
n 989d7f3668 Merge remote-tracking branch 'origin/pr-7489' 2026-09-09 22:49:54 +00:00
n 1607767408 changelog: #7270 canonical Windows restart entrypoint (@rodboev) 2026-09-09 06:32:16 +00:00
n f9443e17b2 stage: merge #7270 (canonical Windows restart entrypoint) 2026-09-09 06:14:20 +00:00
n 58df481bc5 changelog: #7336 reject malformed/non-object JSON bodies (@zicochaos) 2026-09-09 04:40:08 +00:00
nandzicochaos 1e17127f49 fix: treat whitespace-only body as empty ({}) not a 400
Gate finding on #7336: read_body() rejected whitespace-only bodies that
worked on master (a body-optional DELETE/PATCH/PUT can send b' \n'), returning
400 Invalid JSON body. Normalize a fully-whitespace body to {} before json.loads,
matching the pre-#7336 lenient behavior for that shape. Adds a parametrized
regression test.

Co-authored-by: zicochaos <zicochaos@users.noreply.github.com>
2026-09-09 04:21:46 +00:00
n 1f57afd84c stage: merge #7336 (reject malformed JSON bodies) 2026-09-09 04:02:32 +00:00
n 547ca6bb5e changelog: #7476 warn once per state.db missing source column (@rodrigogs) 2026-09-09 02:28:40 +00:00
n 927c4fa1b6 stage: merge #7476 (warn once per state.db) 2026-09-09 02:10:36 +00:00
n f129de62e1 changelog: #7474 publish conversation context for aux title client (@webtecnica) 2026-09-09 02:03:26 +00:00
n f990201f48 stage: merge #7474 (aux title context) 2026-09-09 01:45:11 +00:00
n b52f5b1f0e changelog: #7082 stop tearing live progress words (@ruizanthony) 2026-09-08 21:48:18 +00:00
n 049a1ef3de stage: merge #7082 (stream word-tearing) 2026-09-08 21:16:39 +00:00
n 4717dc97f2 changelog: #7356 keep provider hint for slash-id picks (@Manny7717) 2026-09-08 18:38:41 +00:00
n ad620c3211 stage: merge #7356 (provider-hint slash-id) 2026-09-08 18:20:45 +00:00
n 38462d7cbd changelog: #7277 guard submitEdit re-entry (data-loss prevention, @alanjds) 2026-09-08 17:40:31 +00:00
n 649083eb7f stage: merge #7277 (submitEdit re-entry guard) 2026-09-08 17:22:39 +00:00
n f765e8178d ci: re-trigger (test_warm_models_catalog_provenance flake — network-timing, unrelated to this sessions.js-only diff) 2026-09-08 16:53:34 +00:00
nandigorroncevic 6cac3244d7 changelog: #5888 read-only child session ordering (@igorroncevic)
Co-authored-by: igorroncevic <igorroncevic@users.noreply.github.com>
2026-09-08 16:44:00 +00:00
n a1f8c51e6b stage: #5888 read-only child session ordering (@igorroncevic) 2026-09-08 16:43:05 +00:00
nandzicochaos 2d391310f8 changelog: #7335 jsArg inline-handler escaping (@zicochaos)
Co-authored-by: zicochaos <zicochaos@users.noreply.github.com>
2026-09-08 16:24:06 +00:00
n 990a92a18e stage: #7335 jsArg inline-handler escaping (@zicochaos) 2026-09-08 16:05:36 +00:00
n de742f64ef docs(changelog): stamp #6716 nested mixed-list renderer + iterative serializer 2026-09-08 15:14:52 +00:00
n cedc2ffc22 Merge PR #6716 re-push for re-gate 2026-09-08 14:54:50 +00:00
n 5df1470619 docs(changelog): stamp #7428 skill-not-found truncation disclosure 2026-09-08 06:48:29 +00:00
n 4311143c12 Merge PR #7428 for gate 2026-09-08 06:29:12 +00:00
n a946b616c8 docs(changelog): stamp #7402 transport-normalizer port 2026-09-08 05:41:51 +00:00
n 2a804ae38d Merge PR #7402 for gate 2026-09-08 05:23:11 +00:00
n 07f1a1405a docs(changelog): stamp #7288 streaming echo-fold perf fix 2026-09-08 04:51:10 +00:00
n edf6c6a686 Merge PR #7288 for re-gate on current master 2026-09-08 04:37:42 +00:00
n d53587d77a docs(changelog): stamp #6620 extension archive dotfile allowlist 2026-09-08 03:14:02 +00:00
n e69d681e82 Merge PR #6620 for exact-head re-gate 2026-09-08 03:01:00 +00:00
n 286c5e3336 docs(changelog): #7331 pipe separator is opt-in 2026-09-08 01:53:18 +00:00
n e7841a5988 gate fixes: opt-in pipe separator (#7331) + IPv6-safe Origin (#6772)
Two Codex adversarial-security-gate findings on the batch:

1. #7331 CORE (backward-compat break): making '|' an unconditional trusted-groups
   separator would re-split an existing deployment whose group NAME legitimately
   contains a literal '|' (e.g. 'unprivileged|admins' read as one group), silently
   changing its profile binding. Pipe splitting is now OPT-IN via
   HERMES_WEBUI_TRUSTED_GROUPS_PIPE_SEPARATOR; comma/newline stay the default.
   Tests: literal-pipe preserved by default, pipe splits only with the flag set.

2. #6772 follow-up (my own hardening introduced it): rebuilding the origin from
   parsed parts dropped the brackets around an IPv6 host, so 'http://[::1]:8787'
   became 'http://::1:8787' and never matched the browser's bracketed
   clientDataJSON.origin -> passkey login over IPv6 would fail. Re-bracket IPv6
   literals. Added rp_context regression tests (Origin-first, port preserved,
   IPv6 bracketed, malformed->Host fallback, userinfo stripped).
2026-09-08 01:53:01 +00:00
n 2e62c4f896 docs(changelog): stamp Phase-1 batch 2 security fixes (#6772, #7331) 2026-09-08 01:31:45 +00:00
n 289b539bc4 harden(passkeys): accept only a well-formed http(s) Origin for RPID derivation
Follow-up on #6772. Preferring Origin over Host for the WebAuthn RPID is correct
(the RPID must match the page origin, not the backend's), and it is not a trust
decision: the authenticator only releases a credential whose RPID is a registrable
suffix of the real page origin, clientDataJSON.origin must equal the stored origin,
rpIdHash must match the stored RPID, and the assertion signature is verified against
the stored credential public key.

Still, only accept a syntactically valid http(s) Origin carrying a hostname, and
rebuild the stored origin from the parsed scheme/host/port instead of echoing the raw
header — so a malformed, non-http (javascript:/file:), or userinfo-bearing Origin
falls through to the Host-derived path rather than being stored verbatim.
2026-09-08 01:31:26 +00:00
n 0f76602790 Merge PR #7331 2026-09-08 01:30:36 +00:00
n 1e00ef131b Merge PR #6772 2026-09-08 01:30:35 +00:00
n 7ee8e43392 docs(changelog): stamp Phase-1 batch 1 (#7427 #7207 #7447 #7385 #6768 #7430 #6330) 2026-09-08 00:59:17 +00:00
n a8d10887df fix(picker): don't let a separator-only search match every model
Codex gate finding on #7385: the new fold-matching (#7228) normalizes the search
term by stripping [\s._-], so a separator-only query ('.', '-', '_') folds to '' and
String.includes('') is always true — every model matched. Verified: searching '.'
returned all models, including ids with no dot.

Guard the folded clauses with a non-empty foldTerm, keeping the literal
name/id includes() checks so '-' still matches ids that really contain one.
Real searches ('ox alpha' / 'ox-alpha' / 'sonnet') are unchanged.
2026-09-08 00:58:05 +00:00
n 150c766875 fix(transcript): mount the render window when jumping to session start mid-stream
Codex gate finding on #7427: moving _scheduleMessageVirtualizedRender() below the
_freshProgrammaticScrollActive() guard (the idle re-render-loop fix) removed the ONLY
thing that mounted the new render window on the jumpToSessionStart() streaming path,
which deliberately skips renderMessages(). Reproduced in Chromium: 160 rows produced a
14,827px spacer and zero visible rows (blank transcript) where master mounted correctly.

Schedule the virtualized render explicitly in the streaming branch, after invalidating
_messageVirtualWindowKey, preserving #7427's listener guard and its idle-loop fix.
2026-09-08 00:26:54 +00:00
n 94b70ce8b8 Merge PR #7385 2026-09-08 00:16:17 +00:00
n d52596a269 Merge PR #7427 2026-09-08 00:16:17 +00:00
n f8ade25db9 Merge PR #7207 2026-09-08 00:16:17 +00:00
n e025f0aca6 Merge PR #7447 2026-09-08 00:16:17 +00:00
n d510c2f508 Merge PR #6768 2026-09-08 00:16:17 +00:00
n 6d248ecd0b Merge PR #7430 2026-09-08 00:16:17 +00:00
n df9187e5f8 Merge PR #6330 2026-09-08 00:16:16 +00:00
n bee7b8a9e4 fix(state-sync): repoint to renamed agent SessionDB API + fix agent-coupled tests
The Hermes Agent's state-module refactor (agent commit 53db597201, released
v2026.9.7) renamed SessionDB.set_auto_title_if_empty -> set_auto_title(
session_id, title, *, source) and (agent commit 14791b4d4e) dropped the
tools.approval._ApprovalEntry back-compat facade (class moved, unchanged, to
tools.approval_gateway_wait).

Production impact (real, silent): api.state_sync.sync_session_title called the
removed set_auto_title_if_empty, whose AttributeError was swallowed by the
surrounding `except Exception: logger.debug(...)`, so WebUI auto-generated
session titles stopped persisting to state.db on agent >= v2026.9.7 — hermes
sessions list went blank again (the exact #6892 regression). Now calls
set_auto_title with LLM provenance, which preserves the identical semantics
(only fills NULL/lower-authority title, returns False untouched on a manual
rename, ValueError -> get_next_title_in_lineage #N de-dup).

Test fixes (agent-coupled; skip on GitHub CI which installs no agent, so they
only surface on an agent-equipped box like our gate):
 1. tools.approval._ApprovalEntry -> idempotent autouse conftest compat shim
    backfilling the class from its post-split location only when the installed
    agent lacks the dropped facade. No production code imports it.
 2. test_goal_command_webui::test_profile_goal_falls_back_when_session_db_path_is_frozen
    was missing the monkeypatch.syspath_prepend(...) that every sibling test in
    the file has, so its bare `import hermes_state` failed under full-suite
    ordering after a predecessor stripped the agent dir from sys.path. Added it.

Verified: authoritative 5-shard CI-equivalent split all green (0 failed);
each failure proven pre-existing on clean master (not this diff).
2026-09-07 23:34:45 +00:00
n 37bb44173e docs(changelog): stamp #7433 Docker env-reload secret fix 2026-09-07 22:19:51 +00:00
nandwebtecnica 95107ceb94 fix(docker): preserve trailing = in env values on su reload (#7432)
docker_init.bash load_env() reloaded the save_env() snapshot after the
su privilege drop with `while IFS='=' read -r key value`, and Bash
silently drops a single trailing `=` from the last field. Any secret
ending in one `=` (openssl rand -base64 32 output is 44 chars ending in
`=`) reloaded one character short, breaking shared-secret auth and
HERMES_WEBUI_PASSWORD matching in the container.

Read each line whole (`IFS= read -r line`) then split at the FIRST `=`
only (key=${line%%=*}, value=${line#*=}), preserving embedded and
trailing `=`. Blank and comment lines are skipped; lines without `=`
keep prior empty-value behavior.

Closes #7432.

Co-authored-by: webtecnica <webtecnica@gmail.com>
2026-09-07 22:19:51 +00:00
n ebc631f53a Release exp-v0.52.264: fast regenerate via bounded sidecar-anchored tail read (#7204, @webtecnica)
Adds the CHANGELOG entry for #7204 (closes #6826). Release-metadata only;
the code change ships via the merge of #7204 (contributor webtecnica).
2026-08-26 01:01:19 +00:00
nandwebtecnica 3fac79bb59 lint: drop redundant unused import in regeneration test (#6826)
Removes the local re-import of api.streaming._session_payload_with_full_messages
inside test_in_tail_duplicate_guard_refuses_bounded_and_full_revision_accepted;
it is already imported at module level (line 17) and unused in the function body,
tripping F401 on CI's hosted lint. Mechanical maintainer fix per auto-fix policy.

Co-authored-by: webtecnica <webtecnica@users.noreply.github.com>
2026-08-26 00:24:07 +00:00