feat(desktop): Phase D — inline-reply notifications (Windows toast reply box)

Reply to a chat straight from the OS notification, no app switch:
- node-notifier (bundles SnoreToast) renders a native Windows toast with a reply box —
  Electron's own Notification can't do Windows inline reply.
- main.js reply-notification handler resolves {text}|{open}|null; preload exposes replyNotify.
- home.html notify() routes chat toasts through it on desktop: a typed reply -> sendReplyTo()
  POSTs to /api/messages without opening the app; a click opens the chat. Web/PWA path unchanged.
- Works only in the installed app (needs the installer's AppUserModelID). desktop 0.1.2, build batch21.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
2026-07-01 22:36:02 +05:30
parent 160a66f934
commit 21ae3e1aa5
6 changed files with 133 additions and 13 deletions
+6 -4
View File
@@ -78,10 +78,12 @@ absolute API base if offline-launch or store policy requires it.
### Phase D — Inline-reply notifications (Teams-style) *(right AFTER packaging)*
Reply to a chat directly from the OS notification, without opening the app. Cross-platform:
- **Desktop (Windows):** native **Windows Toast** with an `<input>` reply box + action, a
registered **AppUserModelID** + Start-menu shortcut (why it needs the installer first), and
a toast-activation handler that POSTs the reply to `/api/messages`. (Web `Notification` and
Electron's built-in notification can't do Windows text reply; needs a native toast lib.)
- [x] **Desktop (Windows):** native Windows toast with a **reply box** via **node-notifier**
(bundles SnoreToast). main.js `reply-notification` handler → preload `replyNotify`
home.html `notify()` routes chat toasts through it: a typed reply calls `sendReplyTo`
(POST /api/messages) without opening the app; clicking opens the chat. Uses the installer's
AppUserModelID, so it only works in the **installed** app. *Needs a live test in the
installed app (can't drive a real Windows toast from CI).*
- **Android:** notification action with **`RemoteInput`** (direct reply) on the FCM message.
- **iOS:** **`UNTextInputNotificationAction`** on the APNs notification category.
All three hand the typed text to the same send path. Depends on Phase B push + Phase C packaging.