* wip(notifications): core module skeleton + controller registration
Phase 7 PR #714 work-in-progress. Shipped:
- src/openhuman/webview_notifications/ — mod, types, dispatch, bus, schemas
- pub mod declaration in src/openhuman/mod.rs
- controllers entry in src/core/all.rs
Remaining: schemas line in all.rs, Tauri shell edits (OpenHuman: prefix,
feature flag gate, click event emit), new shell module for feature flag
state + commands, frontend app/src/lib/webviewNotifications/ IPC wrapper,
Redux click handler.
* feat(notifications): register webview_notifications schemas in core registry
Adds the schemas line next to the already-registered controllers entry so
the domain participates in declared-schema validation. v1 controller list
is empty (settings live shell-side), but the wiring is in place for
future additions.
* feat(notifications): add OpenHuman: prefix, feature flag, and click-routing event
Updates the CEF notification hook in webview_accounts to:
- Prefix OS toast titles with "OpenHuman:" so they visually disambiguate
from natively installed apps (Slack, Gmail, Discord desktop) firing the
same DM twice.
- Gate delivery on a new shell-side feature flag (off by default).
- Mirror each fire to the React frontend via a `webview-notification:fired`
Tauri event carrying {account_id, provider, title, body, tag}, so the
UI can route click-to-focus back to the originating webview.
Adds a new notification_settings shell module holding the runtime toggle
as an AtomicBool (lock-free read from the CEF callback thread) plus
notification_settings_{get,set} Tauri commands for the settings UI to
flip the flag. State lives shell-side rather than in the core sidecar so
the toggle doesn't require a JSON-RPC round-trip.
* feat(notifications): frontend IPC wrapper + Redux click routing
Mirrors the Rust-side `webview-notification:fired` Tauri event into
Redux so the UI can:
- bump an unread badge on the originating account (sidebar surface
reads `accounts.unread[accountId]`)
- route a subsequent click intent back to the right embedded webview
via `focusAccountFromNotification`, which sets `activeAccountId`
and clears the unread counter in one action
Plumbing:
- `app/src/lib/webviewNotifications/` — typed subscribe/unsubscribe,
idempotent `started` guard mirroring `webviewAccountService.ts`,
`handleNotificationClick(accountId)` as the public click entrypoint
so in-app toast UI or a future OS-notification click hook share one
Redux intent
- `accountsSlice`: `noteWebviewNotificationFired` and
`focusAccountFromNotification` reducers (both no-op for unknown
account ids — guards against stale payloads from a closed webview)
- `App.tsx`: start the service at boot, right next to the existing
`startWebviewAccountService()` call
Tests:
- `accountsSlice.webviewNotifications.test.ts` — reducer behavior
- `service.test.ts` — fired dispatches + click focuses via real store
Also: `cargo fmt` noise fixups on `src/core/all.rs` and
`src/openhuman/webview_notifications/mod.rs` so the branch passes
`cargo fmt --check` in CI.
---------
Co-authored-by: Jwalin Shah <jshah1331@gmail.com>