feat(desktop): open any chat in its own window#43219
Merged
Merged
Conversation
Pops a session into a standalone, focused window for side-by-side work. A secondary window loads the renderer at the session route with a ?win=secondary flag (ahead of the HashRouter '#'); it drops the global sidebar plus the install/onboarding overlays and renders a single chat, sharing the one local gateway over WS (no backend duplication). The main process keys windows by sessionId so re-opening focuses the existing one and self-cleans on close. Open it via: - ⌘-click (mac) / ⌃-click (win/linux) a sidebar session — the universal "open in new window" gesture. Archive moves to the ⋯ / right-click menus only, off the easy-to-misfire modifier-click. - "New window" in the session ⋯ and context menus (link-external icon, i18n'd across en/ja/zh/zh-hant). A standalone window has no left rail, so AppShell treats its edge as uncovered and applies the titlebar inset — the chat title clears the macOS traffic lights instead of hiding behind them. Co-authored-by: tim404x <tim404x@users.noreply.github.com>
23 tasks
Contributor
🔎 Lint report:
|
jquesnelle
approved these changes
Jun 10, 2026
tonydwb
approved these changes
Jun 10, 2026
tonydwb
left a comment
There was a problem hiding this comment.
Code Review Summary
Verdict: Approved
Looks Good
- Clean desktop feature: open any chat in its own window.
- Well-structured Electron code with session-windows.cjs for window management.
- TypeScript React components for UI integration (session-actions-menu, session-row, desktop-controller).
- Good test coverage (session-windows.test.cjs, windows.test.ts).
- No security concerns - window management is properly scoped.
Reviewed by Hermes Agent
wachoo
pushed a commit
to wachoo/hermes-agent
that referenced
this pull request
Jun 10, 2026
Pops a session into a standalone, focused window for side-by-side work. A secondary window loads the renderer at the session route with a ?win=secondary flag (ahead of the HashRouter '#'); it drops the global sidebar plus the install/onboarding overlays and renders a single chat, sharing the one local gateway over WS (no backend duplication). The main process keys windows by sessionId so re-opening focuses the existing one and self-cleans on close. Open it via: - ⌘-click (mac) / ⌃-click (win/linux) a sidebar session — the universal "open in new window" gesture. Archive moves to the ⋯ / right-click menus only, off the easy-to-misfire modifier-click. - "New window" in the session ⋯ and context menus (link-external icon, i18n'd across en/ja/zh/zh-hant). A standalone window has no left rail, so AppShell treats its edge as uncovered and applies the titlebar inset — the chat title clears the macOS traffic lights instead of hiding behind them. Co-authored-by: tim404x <tim404x@users.noreply.github.com>
changman
pushed a commit
to changman/hermes-agent
that referenced
this pull request
Jun 10, 2026
Pops a session into a standalone, focused window for side-by-side work. A secondary window loads the renderer at the session route with a ?win=secondary flag (ahead of the HashRouter '#'); it drops the global sidebar plus the install/onboarding overlays and renders a single chat, sharing the one local gateway over WS (no backend duplication). The main process keys windows by sessionId so re-opening focuses the existing one and self-cleans on close. Open it via: - ⌘-click (mac) / ⌃-click (win/linux) a sidebar session — the universal "open in new window" gesture. Archive moves to the ⋯ / right-click menus only, off the easy-to-misfire modifier-click. - "New window" in the session ⋯ and context menus (link-external icon, i18n'd across en/ja/zh/zh-hant). A standalone window has no left rail, so AppShell treats its edge as uncovered and applies the titlebar inset — the chat title clears the macOS traffic lights instead of hiding behind them. Co-authored-by: tim404x <tim404x@users.noreply.github.com>
alt-glitch
pushed a commit
that referenced
this pull request
Jun 14, 2026
Pops a session into a standalone, focused window for side-by-side work. A secondary window loads the renderer at the session route with a ?win=secondary flag (ahead of the HashRouter '#'); it drops the global sidebar plus the install/onboarding overlays and renders a single chat, sharing the one local gateway over WS (no backend duplication). The main process keys windows by sessionId so re-opening focuses the existing one and self-cleans on close. Open it via: - ⌘-click (mac) / ⌃-click (win/linux) a sidebar session — the universal "open in new window" gesture. Archive moves to the ⋯ / right-click menus only, off the easy-to-misfire modifier-click. - "New window" in the session ⋯ and context menus (link-external icon, i18n'd across en/ja/zh/zh-hant). A standalone window has no left rail, so AppShell treats its edge as uncovered and applies the titlebar inset — the chat title clears the macOS traffic lights instead of hiding behind them. Co-authored-by: tim404x <tim404x@users.noreply.github.com>
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Supersedes #39887 (salvage — rebased on
main, traffic-light overlap fixed,⌘/⌃-click gesture added, label/icon polished, strings i18n'd). Original work and design by @tim404x, kept as co-author.What
Pop any session into a standalone, focused window so you can run several chats side by side.
?win=secondaryflag (ahead of the HashRouter#). It drops the global sidebar + install/onboarding overlays and renders a single chat, sharing the one local gateway over WS — no backend duplication.sessionId: re-opening a chat focuses the existing window instead of duplicating, and each window self-cleans from the registry on close.minWidthis already400onmain, so narrow windows tile cleanly.Open it via
⌘-click (mac) /⌃-click (win/linux) a sidebar session — the universal "open in a new window" gesture. Archive moved to the⋯/ right-click menus only, off the easy-to-misfire modifier-click.⋯and right-click menus (link-externalicon, i18n'd across en/ja/zh/zh-hant).Salvage notes (delta vs #39887)
sidebarOpentruthy, soAppShellcomputed a0titlebar inset and the chat title slid under the macOS traffic lights.leftEdgePaneOpennow also accounts forisSecondaryWindow(), so the edge reads as uncovered and the existing--titlebar-content-insetclears the lights — chrome handling stays in the shell instead of the bare-chat path.main(slim-down sidebar work:hoverReveal+forceCollapsed); the sidebar pane keeps that treatment, gated off for secondary windows.⌘/⌃-click gesture to skip the menu, with archive demoted to menu-only.Open in New Window→New window, iconmultiple-windows→link-external, string moved into i18n.Tests
src/store/windows.test.ts(vitest jsdom) — 8 passing.electron/session-windows.test.cjs(node --test) — 10 passing.tsc -b+eslintclean.🤖 Generated with Cursor