Skip to content

feat(desktop): in-app notification center (OS side is a follow-up)#3122

Open
HUQIANTAO wants to merge 1 commit into
esengine:main-v2from
HUQIANTAO:feat/notification-center
Open

feat(desktop): in-app notification center (OS side is a follow-up)#3122
HUQIANTAO wants to merge 1 commit into
esengine:main-v2from
HUQIANTAO:feat/notification-center

Conversation

@HUQIANTAO
Copy link
Copy Markdown
Contributor

Long-running agent events (idle, plan approval, update available, plugin hot-add, background job done) deserve a visible signal. The kernel doesn't yet expose a Notify() binding for the OS notification center, but we can stand up the in-app half of the contract now so the rest of the app has a single emit point when the binding lands.

Add lib/notificationCenter.ts: a tiny pub-sub on a 50-entry ring of Notification records. Identical-id events are deduped. Add components/NotificationCenter.tsx with a drawer and a topbar bell with an unread dot.

The follow-up is a kernel-side App.Notify(title, body, level) Wails binding that dispatches runtime.MessageDialog / OS notification alongside the in-app push.

@github-actions github-actions Bot added the v2 Go rewrite (1.x) — main-v2 branch, active development label Jun 4, 2026
Long-running agent events (idle, plan approval, update available,
plugin hot-add, background job done) deserve a visible signal. The
kernel doesn't yet expose a Notify() binding for the OS
notification center, but we can stand up the in-app half of the
contract now so the rest of the app has a single emit point
when the binding lands.

Add lib/notificationCenter.ts: a tiny pub-sub on a 50-entry ring
of Notification records. Identical-id events are deduped (a
recurring 'agent:idle' refreshes the at and flips read back to
false, but doesn't grow the list). The store lives in module
scope — no React state, no library. Listeners are React
components; the snapshot is defensive-copied per render.

Add components/NotificationCenter.tsx:
  - NotificationCenter: a drawer (reuses the existing .drawer
    shell) listing entries reverse-chronologically with a
    'Clear all' button. Opening the drawer calls markAllRead()
    so the unread dot disappears.
  - NotificationBell: a topbar chip with a small red unread
    dot. Subscribes to the store independently so the dot
    updates without the parent re-rendering.

The store is intentionally not persisted across reloads — a
reboot is a deliberate user action and the source events can
be re-triggered if needed. Persistence is a separate concern.

The follow-up is a kernel-side App.Notify(title, body, level)
Wails binding that dispatches runtime.MessageDialog / OS
notification alongside the in-app push.
@HUQIANTAO HUQIANTAO force-pushed the feat/notification-center branch from 43b6d8c to 64d234c Compare June 5, 2026 01:43
@HUQIANTAO HUQIANTAO requested a review from SivanCola as a code owner June 5, 2026 01:43
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

v2 Go rewrite (1.x) — main-v2 branch, active development

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant