feat(tile-ipc): tile:theme:* strict shims with trustedBuiltin gating (Phase 3.5b)
Add 6 new tile:theme:* IPC handlers in tile-ipc.ts mirroring the legacy
theme:* surface from ipc.ts:
tile:theme:get — current theme id + color scheme
tile:theme:setColorScheme — global color scheme (system/light/dark)
tile:theme:setWindowColorScheme — per-window color scheme
tile:theme:setTheme — set active theme by id
tile:theme:list — list registered (builtin) themes
tile:theme:getAll — all themes (builtin + external from DB)
All 6 handlers require trustedBuiltin; non-trusted callers receive
{ success: false, error: 'trustedBuiltin required' } and a capability
violation event. Private theme helpers (tileGetThemeSetting,
tileSetThemeSetting, tileBroadcastThemeChange) added at module scope to
avoid coupling to ipc.ts internals.
tile-preload.cts: add corresponding wrapper methods to the base api.theme
object routing to tile:theme:*. The existing trustedBuiltin block still
overrides get/list/getAll/setTheme/setColorScheme/setWindowColorScheme
with legacy theme:* routes — Wave 3.6b will flip that override.
No legacy handler deletions. tsc --noEmit clean.
.yarn symlinks absent in worktree — yarn test:unit skipped.