refactor(tile-ipc): delete vestigial tile:extensions:* surface + api.extensions
The tile:extensions:* IPC and its api.extensions preload surface
were a v1-era admin channel that duplicated the modern tile:features:*
registry path. Consumers migrated in the prior commit; this commit
removes the duplicate surface.
Deleted:
- 11 tile:extensions:* handlers in tile-ipc.ts (pickFolder,
validateFolder, add, remove, update, getAll, get, windowList,
listAllRegistered, windowDevtools, reload). Each wrote to or read
from the legacy extensions SQLite table (add/remove/update/getAll/get),
peeked runtime state (windowList/listAllRegistered), or stubbed
devtools the tile path already serves (windowDevtools). No remaining
call site.
- api.extensions block in tile-preload.cts (~75 lines).
- Unused getRunningTiles / getAllRegisteredTiles / reloadTile imports
from tile-ipc.ts and ipc.ts. The functions themselves are retained
and re-exported from backend/electron/index.ts — they are public
module surface used outside this file.
Test fixture changes:
- tests/fixtures/desktop-app.ts waitForHybridExtensions now polls
api.features.list('builtin') for entries instead of api.extensions.list
status=running. Explicitly asks for the builtin source because the
default filter hides builtins.
- tests/helpers/window-utils.ts waitForExtensionsReady: same swap.
- hybrid-extension.spec.ts api.extensions.reload → api.features.devReload.
- websearch.spec.ts, pubsub-repro.spec.ts, desktop-serial/websearch-cmd.spec.ts,
cmd-execute-twice.spec.ts: lazy-load detection switched from
api.extensions.list({status:'running'}) to a window-url probe through
api.window.list({includeInternal:true}) — detects when the tile has
produced a BrowserWindow for its peek://<id>/ origin.
- startup-events.spec.ts cmd-running check: assert cmd is registered in
api.features.list('builtin') AND has a live peek://cmd/ window.
Scope exclusions:
- backend/tauri/preload.js retains api.extensions — Tauri is frozen for
this pass.
- tests/mocks/tauri-backend.js mock — Tauri path, not migrated.
- docs/v1-removal-phase3-tasks.md, docs/feed.xml — historical docs,
left as-is.
- extensions SQLite table itself — still read by protocol.ts getTilePath
as a fallback for installed-tile path resolution. Removing the table
is a separate DB-schema concern.