You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
Drive-by review — flagging the substantive items so they don't get lost.
Suggest blocking on these
Polling vs. event-driven mismatch with bdf270b7. The track-block scheduler just moved to event-driven calendar/Gmail sync, but notify_calendar_meetings.ts spins up a separate 30s polling loop over calendar_sync/. Worth subscribing to the same event bus that track/events.ts already listens on, so we don't have two systems reading the same writes on different cadences.
State-file write isn't atomic.saveState in notify_calendar_meetings.ts does a plain fs.writeFile. A crash mid-write leaves calendar_notifications_state.json corrupt; on next start loadState falls back to empty state, which means every event in the 90s window re-fires a notification. Easy fix: write to a .tmp and fs.rename.
PR description is empty. Title is Notification2. Big surface area in here (custom URL scheme, native notifications, calendar warnings) — please add a summary so reviewers and future archaeologists have context.
Missing app.setAppUserModelId() in main.ts. The notifications doc explicitly requires it on Windows ("Your app requires a Start Menu shortcut with an AppUserModelID..."). Without it, notifications likely won't show on Windows. One-line add.
Missing Linux maker mimeType: ['x-scheme-handler/rowboat'] on maker-deb / maker-rpm in forge.config.cjs. The launch-from-URL doc requires this for the Linux desktop environment to route rowboat:// to the app.
No 256-byte cap on message. macOS truncates silently — worth a .max(256) on the Zod schema (or a runtime warn).
If we're macOS-only for now, the Windows/Linux items are non-blocking but worth a // TODO comment so they don't get forgotten.
Code-level nits
extractConferenceLink duplicated inline in App.tsx:3115; canonical is calendar-block.tsx:48. Reuse before this drifts.
pendingUrl is single-slot (deeplink.ts:30) — a second URL during cold start overwrites the first. Small array would be safer.
z.string().url() on link is redundant given the .refine(), and stricter Zod versions reject rowboat:// from .url(). Drop .url().
No tests for parseDeepLink, parseAction, or the calendar tick window math — all pure, cheap to cover.
What looked great
DI pattern matches IBrowserControlService exactly — clean.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
No description provided.