"New Chat" button in ChatHistoryPanel sidebar is a no-op when user is already on /chatgxy (no exchange ID in URL).
ChatHistoryPanel.vue:67-75 does router.push("/chatgxy") to start a new chat. Vue Router ignores navigation to the current route, so nothing happens when already at /chatgxy.
This is the most common scenario: ChatGXY.onMounted calls loadLatestChat() which loads a conversation without updating the URL to include the exchange ID.
ChatGXY.vue:290-305 — the main window's "New" button calls startNewChat() directly on component-local state (messages, currentChatId, query). No routing involved, always works.
ChatHistoryPanel lives in the activity bar panel — separate component tree from ChatGXY. No shared store or event mechanism connects them, so it relies on router navigation to communicate.
If the user clicked a history item first (navigating to /chatgxy/{id}), then "New Chat" pushes /chatgxy which is a route change. The exchangeId watcher fires with newId=undefined, calling startNewChat().
- Sentinel route — push
/chatgxy/new, handleexchangeId === "new"in the watcher - Query param with timestamp —
router.push("/chatgxy?new=" + Date.now()), force unique route - Shared event —
window.dispatchEvent(new CustomEvent("chatgxy:new")), ChatGXY listens - Pinia store — add a
requestNewChatflag to a shared store, ChatGXY watches it
Option 1 is cleanest for this codebase — matches existing router-based pattern, minimal changes.