mirror of
https://github.com/nesquena/hermes-webui.git
synced 2026-05-26 19:50:15 +00:00
fix: allow Cmd/Ctrl+K new chat while a conversation is busy
The Cmd/Ctrl+K shortcut was gated on !S.busy, which meant users had to wait for an in-flight generation to finish before they could start a fresh conversation — exactly the moment they want to switch context. Removes the !S.busy guard. The in-flight stream keeps running on its own session; the user just gets a fresh blank one in the foreground. The existing "no messages → focus composer instead of stacking empty sessions" behavior is preserved. Tests: tests/test_mobile_layout.py — new test_new_conversation_shortcut_works_while_busy guard assertion. Existing closeMobileSidebar window check widened to 12 lines to accommodate the comment block explaining the change. Full suite: 3253 passed. Salvaged from contributor work in PR #1084. Co-authored-by: Hermes Agent <hermes@get-hermes.ai>
This commit is contained in:
+6
-1
@@ -531,7 +531,12 @@ document.addEventListener('keydown',async e=>{
|
|||||||
// If the current session has no messages, just focus the composer rather than
|
// If the current session has no messages, just focus the composer rather than
|
||||||
// creating another empty session that will clutter the sidebar list (#1171).
|
// creating another empty session that will clutter the sidebar list (#1171).
|
||||||
if(S.session&&(S.session.message_count||0)===0){$('msg').focus();return;}
|
if(S.session&&(S.session.message_count||0)===0){$('msg').focus();return;}
|
||||||
if(!S.busy){await newSession();await renderSessionList();closeMobileSidebar();$('msg').focus();}
|
// Cmd/Ctrl+K should always create a new conversation, even while the current
|
||||||
|
// one is still streaming. The old !S.busy guard meant users had to wait for
|
||||||
|
// a long generation to finish before they could start something new — exactly
|
||||||
|
// the moment they want to switch context. newSession() leaves the in-flight
|
||||||
|
// stream running on its own session; the user just gets a fresh blank one.
|
||||||
|
await newSession();await renderSessionList();closeMobileSidebar();$('msg').focus();
|
||||||
}
|
}
|
||||||
if(e.key==='Escape'){
|
if(e.key==='Escape'){
|
||||||
// Close onboarding overlay if open (skip/dismiss the wizard)
|
// Close onboarding overlay if open (skip/dismiss the wizard)
|
||||||
|
|||||||
@@ -157,11 +157,35 @@ def test_new_conversation_closes_mobile_sidebar():
|
|||||||
|
|
||||||
shortcut_line = next((ln for ln in boot_js.splitlines() if "e.key==='k'" in ln or "e.key === 'k'" in ln), "")
|
shortcut_line = next((ln for ln in boot_js.splitlines() if "e.key==='k'" in ln or "e.key === 'k'" in ln), "")
|
||||||
assert shortcut_line, "Cmd/Ctrl+K new chat shortcut missing from static/boot.js"
|
assert shortcut_line, "Cmd/Ctrl+K new chat shortcut missing from static/boot.js"
|
||||||
shortcut_block = "\n".join(boot_js.splitlines()[boot_js.splitlines().index(shortcut_line):boot_js.splitlines().index(shortcut_line)+6])
|
shortcut_block = "\n".join(boot_js.splitlines()[boot_js.splitlines().index(shortcut_line):boot_js.splitlines().index(shortcut_line)+12])
|
||||||
assert "closeMobileSidebar" in shortcut_block, \
|
assert "closeMobileSidebar" in shortcut_block, \
|
||||||
"Cmd/Ctrl+K new chat shortcut must closeMobileSidebar() after creating the new session"
|
"Cmd/Ctrl+K new chat shortcut must closeMobileSidebar() after creating the new session"
|
||||||
|
|
||||||
|
|
||||||
|
def test_new_conversation_shortcut_works_while_busy():
|
||||||
|
"""Cmd/Ctrl+K should still create a new conversation while the current one is busy.
|
||||||
|
|
||||||
|
The previous behavior gated the shortcut on !S.busy, which meant users had
|
||||||
|
to wait for a long generation to finish before they could start something
|
||||||
|
new — the exact moment they want to switch context.
|
||||||
|
"""
|
||||||
|
boot_js = (REPO / "static" / "boot.js").read_text(encoding="utf-8")
|
||||||
|
shortcut_line = next((ln for ln in boot_js.splitlines() if "e.key==='k'" in ln or "e.key === 'k'" in ln), "")
|
||||||
|
assert shortcut_line, "Cmd/Ctrl+K new chat shortcut missing from static/boot.js"
|
||||||
|
# Inspect the next 10 lines after the keybinding match — the gating block
|
||||||
|
# would live there if it had been kept.
|
||||||
|
idx = boot_js.splitlines().index(shortcut_line)
|
||||||
|
shortcut_block = "\n".join(boot_js.splitlines()[idx:idx + 10])
|
||||||
|
# Strip the existing message-count guard (which is unrelated and stays) so
|
||||||
|
# we only check for an S.busy gate on the newSession() call itself.
|
||||||
|
assert "if(!S.busy)" not in shortcut_block, (
|
||||||
|
"Cmd/Ctrl+K must not be blocked by the current session's busy state"
|
||||||
|
)
|
||||||
|
assert "if (!S.busy)" not in shortcut_block, (
|
||||||
|
"Cmd/Ctrl+K must not be blocked by the current session's busy state"
|
||||||
|
)
|
||||||
|
|
||||||
|
|
||||||
# ── Viewport and scroll safety ────────────────────────────────────────────────
|
# ── Viewport and scroll safety ────────────────────────────────────────────────
|
||||||
|
|
||||||
def test_body_overflow_hidden():
|
def test_body_overflow_hidden():
|
||||||
|
|||||||
Reference in New Issue
Block a user