fix(tiles): allowlist bypass for cmd/noun infrastructure topics
Two bugs surfacing as silent drops:
1. `noun:register-batch` (and the dynamic `noun:result:<noun>:<ts>`
topics the cmd panel subscribes to for each invocation) were
gated by the per-tile `pubsub.topics` allowlist. Feature manifests
don't list them — why would they, they're infrastructure — so
every noun registration and every browse-command result was
silently rejected. Symptoms: `open entities` / `list entities` /
`new feed` etc. never showed up in the cmd panel; when they did
(via stale cache), the spinner hung forever because the browse
handler's result publish was also blocked.
2. `cmd:register` / `cmd:register-batch` / `cmd:unregister` were in
the same boat but partially worked thanks to a separate
`tile:command:register` IPC that bypasses the allowlist via
main's `publish()` directly. The full-metadata publish path
(via `tile:pubsub:publish`) was still blocked.
Fix: in `tile-ipc.ts`'s `tile:pubsub:publish` handler, topics owned
by the cmd/noun registry infrastructure — `cmd:register`,
`cmd:register-batch`, `cmd:unregister`, anything starting with
`noun:` — are exempt from the per-tile allowlist when the tile holds
the `commands` capability. The scope check still applies; only the
topic allowlist is bypassed.
Also fix packaging: `chrome-extensions/**/*` must live on a real
filesystem for Electron's `session.loadExtension()` to find them.
They were getting packed into `app.asar` where `loadExtension` can't
read. Added to `asarUnpack` in `electron-builder.yml`.