feat(desktop): macOS menu bar tray with live session state and mini-chat UX
Add an always-visible macOS status bar (tray) item that surfaces OpenChamber's
live state and acts as a quick launcher, plus a series of related desktop UX
fixes around mini-chat, window routing, notifications and shortcuts.
Tray (new):
- Monochrome template cube glyph that adapts to the menu bar light/dark.
- Icon-driven activity indicator: a smooth, eased, infinite "breathing" fill
while sessions are busy; a static filled cube when finished sessions are left
unread; a plain outline when idle. Text counters next to the icon only for
actionable states (pending approvals, errors).
- Menu lists active sessions (status glyph, branch, unread count) with overflow
rolled into a submenu; pending permission/question approvals with inline
Allow once / Allow always / Deny; quick actions (New Session, New Mini Chat,
Show OpenChamber, Quit). Header shows the active instance name
("Local OpenChamber" or the remote host label) for multi-window clarity.
- Session list sourced from the global (cross-project) sessions store, sorted by
last-updated, independent of which directories are currently open; live
status/unread/branch merged in from directory sync stores where available.
Sub-session (multi-run) activity rolls up to the parent row.
- Event-driven updates (global store + directory stores + notifications +
registry) with a short debounce; polling kept only as a slow safety net.
Tray/window routing:
- Opening a session from the tray targets the surface the user was last on: if a
mini-chat is active it switches that existing window to the session in place
(no new window); otherwise the main window (revealed without a reload).
- app.activate (dock click) restores the last-focused/minimized window instead
of spawning a new main window; only creates one when nothing is left.
- "Open in main window" and tray session-open now create the main window when
none exists, queuing the session as a pending deep-link so it opens once the
fresh renderer is ready.
Mini chat:
- New Mini Chat is now a customizable shortcut, exposed in Settings > Shortcuts,
in the File menu (hint only, renderer owns the binding), and in the tray.
- Themed splash backdrop on window open to remove the white flash / flicker;
dismissed once content is ready, leaving the content's single cube logo.
- Mini-chat can switch sessions in place via openchamber:open-session.
Notifications:
- The active/selected session only counts as "seen" when the window is focused,
so turns completing while the app is backgrounded raise an unread marker;
refocusing the window clears it.
@@ -0,0 +1,10 @@
|
||||
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 32 32" fill="none"
|
||||
stroke="#000" stroke-linejoin="round" stroke-linecap="round">
|
||||
<g stroke-width="2.3">
|
||||
<path d="M16 2.5 L28.5 9.5 L28.5 23 L16 30 L3.5 23 L3.5 9.5 Z"/>
|
||||
<path d="M3.5 9.5 L16 16.25 L28.5 9.5"/>
|
||||
<path d="M16 16.25 L16 30"/>
|
||||
</g>
|
||||
<!-- thinner stroke for the diamond on the top face -->
|
||||
<path stroke-width="1.5" d="M16 6.5 L21.5 9.4 L16 12.3 L10.5 9.4 Z"/>
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 455 B |
|
After Width: | Height: | Size: 430 B |
|
After Width: | Height: | Size: 861 B |
|
After Width: | Height: | Size: 430 B |
|
After Width: | Height: | Size: 869 B |
|
After Width: | Height: | Size: 435 B |
|
After Width: | Height: | Size: 872 B |
|
After Width: | Height: | Size: 435 B |
|
After Width: | Height: | Size: 888 B |
|
After Width: | Height: | Size: 437 B |
|
After Width: | Height: | Size: 886 B |
|
After Width: | Height: | Size: 434 B |
|
After Width: | Height: | Size: 904 B |
|
After Width: | Height: | Size: 439 B |
|
After Width: | Height: | Size: 911 B |
|
After Width: | Height: | Size: 442 B |
|
After Width: | Height: | Size: 908 B |
|
After Width: | Height: | Size: 437 B |
|
After Width: | Height: | Size: 936 B |
|
After Width: | Height: | Size: 441 B |
|
After Width: | Height: | Size: 937 B |
|
After Width: | Height: | Size: 439 B |
|
After Width: | Height: | Size: 937 B |
|
After Width: | Height: | Size: 442 B |
|
After Width: | Height: | Size: 941 B |
|
After Width: | Height: | Size: 446 B |
|
After Width: | Height: | Size: 962 B |
|
After Width: | Height: | Size: 438 B |
|
After Width: | Height: | Size: 967 B |
|
After Width: | Height: | Size: 444 B |
|
After Width: | Height: | Size: 961 B |
|
After Width: | Height: | Size: 444 B |
|
After Width: | Height: | Size: 965 B |
|
After Width: | Height: | Size: 426 B |
|
After Width: | Height: | Size: 794 B |
|
After Width: | Height: | Size: 447 B |
|
After Width: | Height: | Size: 947 B |