refactor(tiles): collapse lists bg+home tile + harden tile-launcher (frame, keepLive)
Started as a websearch-style consolidation of the `lists` feature (drop
the `background.html` lazy tile, fold its command/shortcut/settings
wiring into the now-resident `home.html`). User testing surfaced three
real architectural issues:
1. Tile windows opened with an OS titlebar.
`createTileBrowserWindow` defaulted `frame: hints?.frame !== false`
(titlebar by default), divergent from the legacy `api.window.open`
path (`ipc.ts:594`) which always defaulted frameless. Any resident
tile inherited a titlebar, and Peek's design is "no OS titlebar
anywhere, ever". Flipped the default to `frame: hints?.frame === true`
- opt-in only. Spaces' `border` tile already opts in to `frame:
false` explicitly so its behavior is unchanged; every other tile
silently becomes frameless.
2. Second `cmd → lists` showed an endless spinner.
The first invocation called `api.window.showSelf()` and the resident
tile became visible. After cmd+W (or any close path) the
BrowserWindow was destroyed - the tile launcher's `closed` handler
removed it from `tileWindows`. The next `showSelf()` returned
"Tile window not found" silently. Added `keepLive` as a
first-class `TileEntry` field; when true, the launcher intercepts
the BrowserWindow `close` event and `hide()`s instead. Skipped
during `app.before-quit` so shutdown isn't blocked. Added
`keepLive: true` to the lists + websearch manifests (both were
exposed to the same bug).
3. Lists results were jammed together.
`.result-group` was `margin-bottom: 12px` only; consecutive
`peek-card` children had no inter-card spacing. Switched the
group to `display: flex; flex-direction: column; gap: 6px` so
cards have breathing room without per-card margin hacks.
Plus the original consolidation: deleted
`features/lists/background.{html,js}`, moved settings/command/
shortcut wiring into `home.js` (mirrors websearch home.js shape),
manifest now ships a single resident+keepLive `home` tile.
Test: `tests/desktop/lists-tile.spec.ts` (4/0) covers manifest shape
(resident + keepLive), command registration, command-shows-window,
and the close→hide→re-show keepLive cycle. Existing websearch suite
(10/0) unaffected.