refactor(electron): delete v1 declarative-command machinery, fold publish-action into tile-lazy
`registerDeclarativeCommands` and friends in main.ts processed v1-style
`background: false` manifests, registering pubsub subscribers for
`cmd:execute:{name}` outside the tile-lazy load-on-dispatch path. Two
features (sync, dropzone) were live consumers — both have empty
`tiles: []` and depended on the v1 path to handle their declarative
commands.
Tile-lazy already short-circuits `type: 'window'` actions in the
pre-publish hook without forcing a tile load; this extends the same
treatment to `type: 'publish'` (emit the declared topic + result, skip
the original cmd:execute publish). With that in place every
declarative action shape is handled in one place:
- `type: 'window'` → publishes window-open, no tile load
- `type: 'publish'` → publishes declared topic, no tile load
- `type: 'execute'` → loads the tile, lets the publish reach the
tile's real handler
Deleted:
- `registerDeclarativeCommands`, `registerDeclarativeCommand`,
`registerDeclarativeShortcut`, `executeDeclarativeAction`,
`isDeclarativeOnly`, `declarativeExtensions` Set in main.ts
(~165 LOC)
- `background?: string | false` field from the legacy
`ExtensionManifest` interface (chrome-extensions.ts uses
`manifest.background` for chrome MV3 manifests — different concept,
untouched)
- `background: false` from features/sync/manifest.json and
features/dropzone/manifest.json
- Unused `ManifestCommand` / `ManifestShortcut` / `ExtensionManifest`
type imports in main.ts
`getRunningExtensions` and `getAllRegisteredExtensions` no longer
walk the `declarativeExtensions` set — running = core renderers +
loaded v2 tiles. Sync and dropzone show as `registered` (not
`running`) when they haven't been invoked, which is the truthful
state for a lazy declarative-only feature.
yarn build clean. yarn test:unit: 2277 pass / 0 fail.