Skip to content

v0.51.4 — 10-PR full-sweep batch#1707

Merged
nesquena-hermes merged 23 commits into
masterfrom
stage-301
May 5, 2026
Merged

v0.51.4 — 10-PR full-sweep batch#1707
nesquena-hermes merged 23 commits into
masterfrom
stage-301

Conversation

@nesquena-hermes
Copy link
Copy Markdown
Collaborator

v0.51.4 — 10-PR full-sweep batch

Constituent PRs

Additions (3):

Fixes (7):

Tests

4477 → 4503 passing (+26 regression tests). 0 regressions. Full suite ~135s.

Pre-release verification

  • Stage-301: 10 PRs merged with zero conflicts (each rebased clean against current master).
  • All JS files syntax-clean (node -c).
  • All Python files syntax-clean (py_compile).
  • Live browser walkthrough on port 8789: model picker chip + group count rendering, all new endpoints respond 200, boot.js PR Fix multi-image paste attachments #1706 fix verified live (pasteTs captured outside map, index parameter present, Date.now() removed from inside .map()).
  • Opus advisor pass: SHIP, 7/7 verification questions resolved cleanly. Zero MUST-FIX, zero SHOULD-FIX.

Notes on the 1705 → 1706 swap

@Michaelyklam filed PR #1706 with a functional Node-driven regression test (extracts and executes the real paste handler) replacing the maintainer-built #1705 which used static-source-string assertions. Same code fix, better test approach. #1705 closed; #1706 absorbed.

Sweep details

Phase 0 fit-screen: 11 candidates evaluated, 10 KEEP, 1 deferred (#1686 Docker enhance — first-time contributor with action_required CI status). No UX gate applied (none of the 10 PRs cross the main-conversation-view threshold).

Closes #1320, #1425, #1691, #1696, #1697, #1698, #1699, #1680.

Michaelyklam and others added 23 commits May 4, 2026 21:02
)

- Add .model-opt-provider chip (right-aligned, muted) on every model row
  that belongs to a provider group, making same-name models across
  providers visually distinguishable at a glance.
- Add per-group model count to group headings: 'OpenRouter (47)'.
- Add subtle border-top divider between provider groups for visual
  separation during scroll.

Scope: Shape A from #1425 — smallest change, ~15 LOC, no API churn.
Note: Settings model picker is a native <select> and already has optgroup
labels; this targets the custom dropdown used in the composer.

Closes #1425
10 PRs (3 surfaces additions, 7 fixes):
- #1644 model picker chip + group count (@bergeouss, closes #1425)
- #1684 update network failures UX (@Michaelyklam, closes #1321)
- #1685 Codex spark models (@Michaelyklam, closes #1680)
- #1689 normalize profile base homes (@Michaelyklam, refs #749)
- #1693 adaptive title refresh deadlock (@ai-ag2026)
- #1701 normalize update banner URL (@Michaelyklam, closes #1691)
- #1702 workspace double-click rename (@Michaelyklam, closes #1698)
- #1703 cache invalidation on auth-store drift (@Michaelyklam, closes #1699)
- #1704 markdown fence lengths (@Michaelyklam, closes #1696)
- #1706 multi-image paste fix (@Michaelyklam, closes #1697)

Tests: 4477 → 4503 (+26). Opus: SHIP, 7/7 verification clean.

Co-authored-by: Michael Lam <Michaelyklam1@gmail.com>
Co-authored-by: ai-ag2026 <noreply@github.com>
Co-authored-by: bergeouss <noreply@github.com>
nesquena-hermes added a commit that referenced this pull request May 5, 2026
fix(workspace): preserve single-click open + double-click rename on filename (#1707)
wwg135 pushed a commit to wwg135/hermes-webui that referenced this pull request May 5, 2026
…ilename (nesquena#1707)

Closes nesquena#1707 — single-click on a workspace tree filename did nothing.

nesquena#1698 was a regression where the filename's dblclick rename handler was
unreachable because the row's el.onclick (openFile) fired synchronously
on the first click. The fix in nesquena#1702 stopped click propagation on nameEl
— but that broke single-click activation entirely (nesquena#1707): clicking the
filename now did nothing, you had to click the icon or row whitespace
to open the file.

Restored fix preserves both intents via a 300ms debounced delegator:

  let _nameClickTimer = null;
  nameEl.onclick = (e) => {
    e.stopPropagation();
    if (_nameClickTimer) { clearTimeout(_nameClickTimer); _nameClickTimer = null; }
    _nameClickTimer = setTimeout(() => {
      _nameClickTimer = null;
      if (typeof el.onclick === 'function') el.onclick(e);
    }, 300);
  };
  nameEl.ondblclick = (e) => {
    e.stopPropagation();
    if (_nameClickTimer) { clearTimeout(_nameClickTimer); _nameClickTimer = null; }
    // ... existing rename body
  };

Single-click on nameEl schedules a setTimeout that calls el.onclick(e)
after the dblclick threshold passes (300ms — matches the OS dblclick
threshold on most platforms). Double-click cancels the pending timer
and triggers the existing rename input.

Cost: 300ms latency on file-open clicks. Acceptable trade for keeping
rename reachable on single-click.

Also updated tests/test_workspace_tree_rename.py to accept both the
pre-nesquena#1707 (pure stopPropagation) and post-nesquena#1707 (debounced delegator)
shapes — the original assertion was too narrow and would have rejected
the correct fix.

9 new regression tests in tests/test_1707_workspace_filename_click.py:
  - 6 source-level static-analysis checks on the patched handler shape
  - 3 behavioral tests via Node VM (synthesize click → 300ms delay,
    click → dblclick within tick → assert rename mounts + openFile
    is not called).

7 of 9 tests fail on master pre-fix (verified); all 9 pass after.
githb-ac pushed a commit to githb-ac-org/hermes-webui that referenced this pull request May 5, 2026
…quena#1710)

The file-tree row tooltip says 'Double-click to rename' on every entry,
but folders don't actually rename on double-click — they navigate via
loadDir(). The tooltip is therefore misleading on directory rows.

Reported by @Deor in the WebUI Discord testers thread (May 5 2026):
'Ah that works yeah. May want to change the popup text as it also says
double click at the moment.'

Fix: gate the tooltip on item.type !== 'dir' so it only attaches to file
rows, where double-click does what the hint advertises. Folder rename
still reachable via the right-click context menu (unchanged).

Companion to nesquena#1698/nesquena#1702/nesquena#1707 — completes the rename-affordance triage:
- nesquena#1698 fixed: dblclick rename was unreachable on files (preview hijacked)
- nesquena#1707 fixed: single-click on filename did nothing (over-aggressive guard)
- nesquena#1710 (this PR): tooltip claimed dblclick-rename on folders too

Closes nesquena#1710

Tests: 4 source-level regression tests in tests/test_1710_folder_tooltip.py
guard the gate, the unchanged dir-dblclick navigate behaviour, the i18n key,
and that files still receive the tooltip. All 13 file-tree handler tests
(4 new + 9 from nesquena#1707) pass.
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment