fix(cmd-panel): mode chip, blur-suppression, close-on-other-window-focus
Three cmd-panel regressions surfaced by manual testing on the
packaged build.
1. Mode chip rendered as `[object Object]`. `api.context.watchMode`'s
initial-value path in `tile-preload.cts` passed the full
ContextEntry as the `mode` arg instead of `entry.value` — matched
only the pubsub-driven path. Unwrap `.value` consistently so
consumers (cmd panel, page widget, HUD widget) get the mode string
in both branches. Also guard cmd panel's watchMode callback against
`null`/`undefined` so the initial fire against the panel's own
window (which has no mode entry) doesn't overwrite the correct
value loadCommandContext set via the focused visible window.
2. Cmd panel stayed visible when opened via global hotkey from outside
Peek, then focusing Peek. The `__lastShowTime` stamp + 200ms
blur-suppression + re-focus mechanism from commit 1b568d40 was lost
in the tiles v2 refactor, so the brief focus dance NSPanel +
`alwaysOnTop: 'floating'` emits during show() ran the blur handler
→ hide() → hit the NSPanel orderOut race and left the panel
rendered despite `isVisible()` reporting false. Restored: stamp in
the window-open reuse path and `window-show` IPC handler; skip
close-on-blur if we're within the 200ms settle window and refocus
instead.
3. Cmd panel stayed visible when user hit Cmd+` to cycle between Peek
windows. Panel-type + alwaysOnTop windows are skipped by macOS's
Cmd+` cycling, so `blur` never fires on the cmd panel and
`closeOrHideWindow` is never called. Not a regression — v1 had the
same hole. Cmd panel now subscribes to the existing `window:focused`
GLOBAL pubsub and calls `api.window.hide()` when a non-self,
non-utility window gains focus. Utility children (chain popup)
remain exempt so opening one doesn't dismiss the panel that spawned
it. Requires `window:focused` to include the focused window's role,
added to the publish in `ipc.ts`.