@bobfrankston/rmfmail 1.0.688 → 1.0.691
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/client/app.bundle.js +57 -19
- package/client/app.bundle.js.map +2 -2
- package/client/app.js +36 -2
- package/client/app.js.map +1 -1
- package/client/app.ts +36 -2
- package/client/components/alarms.js +24 -12
- package/client/components/alarms.js.map +1 -1
- package/client/components/alarms.ts +23 -11
- package/client/components/message-list.js +9 -4
- package/client/components/message-list.js.map +1 -1
- package/client/components/message-list.ts +9 -4
- package/client/components/message-viewer.js +33 -3
- package/client/components/message-viewer.js.map +1 -1
- package/client/components/message-viewer.ts +33 -3
- package/client/compose/compose.bundle.js +7 -0
- package/client/compose/compose.bundle.js.map +2 -2
- package/client/compose/spellcheck.js +19 -0
- package/client/compose/spellcheck.js.map +1 -1
- package/client/compose/spellcheck.ts +17 -0
- package/package.json +3 -3
- package/packages/mailx-imap/index.d.ts.map +1 -1
- package/packages/mailx-imap/index.js +46 -9
- package/packages/mailx-imap/index.js.map +1 -1
- package/packages/mailx-imap/index.ts +44 -9
- package/packages/mailx-imap/package-lock.json +2 -2
- package/packages/mailx-imap/package.json +1 -1
- package/packages/mailx-service/google-sync.d.ts +46 -1
- package/packages/mailx-service/google-sync.d.ts.map +1 -1
- package/packages/mailx-service/google-sync.js +50 -1
- package/packages/mailx-service/google-sync.js.map +1 -1
- package/packages/mailx-service/google-sync.ts +91 -1
- package/packages/mailx-service/index.d.ts.map +1 -1
- package/packages/mailx-service/index.js +79 -6
- package/packages/mailx-service/index.js.map +1 -1
- package/packages/mailx-service/index.ts +76 -6
- package/packages/mailx-store/db.d.ts +1 -0
- package/packages/mailx-store/db.d.ts.map +1 -1
- package/packages/mailx-store/db.js +23 -4
- package/packages/mailx-store/db.js.map +1 -1
- package/packages/mailx-store/db.ts +22 -4
- package/packages/mailx-store/package.json +1 -1
- /package/packages/mailx-imap/{node_modules.npmglobalize-stash-78076 → node_modules.npmglobalize-stash-18280}/.package-lock.json +0 -0
|
@@ -1087,6 +1087,11 @@ export class ImapManager extends EventEmitter {
|
|
|
1087
1087
|
// matches our local count, NOTHING changed — skip SELECT entirely.
|
|
1088
1088
|
// For first sync (highestUid = 0) skip the STATUS check and let the
|
|
1089
1089
|
// existing first-sync path (sequence-FETCH the latest N) run.
|
|
1090
|
+
// Captured at function scope so the set-diff block below can decide
|
|
1091
|
+
// when to skip the date-bound and fetch all UIDs (small folder
|
|
1092
|
+
// where a full UID SEARCH is cheap and reveals server-side deletes
|
|
1093
|
+
// of older messages).
|
|
1094
|
+
let statusMessageCount: number | null = null;
|
|
1090
1095
|
if (highestUid > 0) {
|
|
1091
1096
|
try {
|
|
1092
1097
|
console.log(` [sync-status] ${accountId}/${folder.path}: calling STATUS...`);
|
|
@@ -1094,6 +1099,7 @@ export class ImapManager extends EventEmitter {
|
|
|
1094
1099
|
const status: any = await (client as any).native?.getStatus?.(folder.path)
|
|
1095
1100
|
?? await (client as any).getStatus?.(folder.path);
|
|
1096
1101
|
console.log(` [sync-status] ${accountId}/${folder.path}: STATUS returned in ${Date.now() - __statusT0}ms`);
|
|
1102
|
+
if (status && typeof status.messages === "number") statusMessageCount = status.messages;
|
|
1097
1103
|
if (status && typeof status.uidNext === "number") {
|
|
1098
1104
|
const serverHighest = status.uidNext - 1;
|
|
1099
1105
|
const noNewUids = serverHighest <= highestUid;
|
|
@@ -1180,19 +1186,37 @@ export class ImapManager extends EventEmitter {
|
|
|
1180
1186
|
// archive every cycle. First sync gets all UIDs (no anchor
|
|
1181
1187
|
// yet so we have to compare against the empty local set
|
|
1182
1188
|
// anyway).
|
|
1189
|
+
// Small folders (Drafts, Sent, Outbox, Trash, …) get a FULL
|
|
1190
|
+
// UID fetch instead of date-bounded. Without this, server-side
|
|
1191
|
+
// deletions of OLDER messages (e.g., user emptied Trash from
|
|
1192
|
+
// Thunderbird) are never reflected — date-bound filters them
|
|
1193
|
+
// out of the comparison entirely. Bob 2026-05-12: "I deleted
|
|
1194
|
+
// my drafts and Thunderbird shows that but rmfmail is not
|
|
1195
|
+
// acknowledging the deletions." Threshold tuned conservatively
|
|
1196
|
+
// — UID SEARCH ALL on a 500-message folder is sub-second; the
|
|
1197
|
+
// pathology being avoided is the same call on 130k+ INBOX.
|
|
1198
|
+
const SMALL_FOLDER_THRESHOLD = 500;
|
|
1199
|
+
const isSmallFolder = statusMessageCount !== null && statusMessageCount <= SMALL_FOLDER_THRESHOLD;
|
|
1183
1200
|
const SINCE_DAYS = effectiveDays > 0 ? effectiveDays : 1825;
|
|
1184
1201
|
const sinceDate = new Date(Date.now() - SINCE_DAYS * 86400000);
|
|
1185
|
-
|
|
1202
|
+
let allServerUids: number[];
|
|
1186
1203
|
const __uidsT0 = Date.now();
|
|
1187
|
-
|
|
1188
|
-
|
|
1189
|
-
|
|
1204
|
+
if (isSmallFolder) {
|
|
1205
|
+
console.log(` [sync-uids] ${accountId}/${folder.path}: small folder (server=${statusMessageCount}) — getUids ALL`);
|
|
1206
|
+
allServerUids = await (client as any).getUids(folder.path);
|
|
1207
|
+
serverUidsAreDateBounded = false;
|
|
1208
|
+
} else {
|
|
1209
|
+
console.log(` [sync-uids] ${accountId}/${folder.path}: getUidsSince ${sinceDate.toISOString().slice(0,10)}...`);
|
|
1210
|
+
allServerUids = typeof (client as any).getUidsSince === "function"
|
|
1211
|
+
? await (client as any).getUidsSince(folder.path, sinceDate)
|
|
1212
|
+
: await (client as any).getUids(folder.path);
|
|
1213
|
+
serverUidsAreDateBounded = true;
|
|
1214
|
+
}
|
|
1190
1215
|
console.log(` [sync-uids] ${accountId}/${folder.path}: ${allServerUids.length} UIDs in ${Date.now() - __uidsT0}ms`);
|
|
1191
1216
|
// Stash for the deletion-reconciliation block below — we
|
|
1192
|
-
// already have the
|
|
1193
|
-
//
|
|
1217
|
+
// already have the server UID list, no point hitting the
|
|
1218
|
+
// server a second time.
|
|
1194
1219
|
serverUidsCached = allServerUids;
|
|
1195
|
-
serverUidsAreDateBounded = true;
|
|
1196
1220
|
const existingSet = new Set(existingUids);
|
|
1197
1221
|
const newSet = new Set(messages.map(m => m.uid));
|
|
1198
1222
|
const missingUids = allServerUids.filter((uid: number) =>
|
|
@@ -1420,9 +1444,20 @@ export class ImapManager extends EventEmitter {
|
|
|
1420
1444
|
localUids = localUidsAll.filter(u => u >= minServerUid);
|
|
1421
1445
|
}
|
|
1422
1446
|
const toDelete = localUids.filter(uid => !serverUids.has(uid));
|
|
1423
|
-
|
|
1447
|
+
// Authoritative-list signal: when the server's UID list came
|
|
1448
|
+
// back as the FULL set (not date-bounded) AND the size matches
|
|
1449
|
+
// what STATUS reported, we know we have the server's truth.
|
|
1450
|
+
// The 50% safety guard exists to protect against partial /
|
|
1451
|
+
// transient server responses; it should NOT block reconcile
|
|
1452
|
+
// when the response is authoritative. Without this carve-out,
|
|
1453
|
+
// emptying a folder externally (Thunderbird, webmail, mobile)
|
|
1454
|
+
// leaves the old rows in mailx forever (Bob 2026-05-12).
|
|
1455
|
+
const authoritative = !serverUidsAreDateBounded
|
|
1456
|
+
&& statusMessageCount !== null
|
|
1457
|
+
&& serverUidsArr.length === statusMessageCount;
|
|
1458
|
+
if (serverUidsArr.length === 0 && localUidsAll.length > 0 && !authoritative) {
|
|
1424
1459
|
console.log(` [sync] ${accountId}/${folder.path}: reconcile skipped — server UID list empty but local has ${localUidsAll.length} (treating as transient)`);
|
|
1425
|
-
} else if (localUids.length > 0 && toDelete.length / localUids.length > 0.5) {
|
|
1460
|
+
} else if (!authoritative && localUids.length > 0 && toDelete.length / localUids.length > 0.5) {
|
|
1426
1461
|
console.log(` [sync] ${accountId}/${folder.path}: reconcile REFUSED — would delete ${toDelete.length}/${localUids.length} (${Math.round(toDelete.length / localUids.length * 100)}%) — probably a sync bug, skipping`);
|
|
1427
1462
|
} else if (toDelete.length > 0) {
|
|
1428
1463
|
// DEFERRED DELETE — DO NOT delete immediately. Server-side
|
|
@@ -1,12 +1,12 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@bobfrankston/mailx-imap",
|
|
3
|
-
"version": "0.1.
|
|
3
|
+
"version": "0.1.39",
|
|
4
4
|
"lockfileVersion": 3,
|
|
5
5
|
"requires": true,
|
|
6
6
|
"packages": {
|
|
7
7
|
"": {
|
|
8
8
|
"name": "@bobfrankston/mailx-imap",
|
|
9
|
-
"version": "0.1.
|
|
9
|
+
"version": "0.1.39",
|
|
10
10
|
"license": "ISC",
|
|
11
11
|
"dependencies": {
|
|
12
12
|
"@bobfrankston/iflow-direct": "^0.1.27",
|
|
@@ -35,8 +35,42 @@ export interface GCalEvent {
|
|
|
35
35
|
recurringEventId?: string;
|
|
36
36
|
/** Link to open the event in Google Calendar web. */
|
|
37
37
|
htmlLink?: string;
|
|
38
|
+
/** Per-event reminder configuration. `useDefault: true` means apply
|
|
39
|
+
* the calendar's `defaultReminders` (carried separately on the
|
|
40
|
+
* calendarList entry); when false, `overrides` lists each popup /
|
|
41
|
+
* email reminder offset for this specific event. */
|
|
42
|
+
reminders?: {
|
|
43
|
+
useDefault?: boolean;
|
|
44
|
+
overrides?: Array<{
|
|
45
|
+
method: string;
|
|
46
|
+
minutes: number;
|
|
47
|
+
}>;
|
|
48
|
+
};
|
|
38
49
|
}
|
|
39
50
|
export declare function listCalendarEvents(tokenProvider: TokenProvider, fromMs: number, toMs: number, calendarId?: string): Promise<GCalEvent[]>;
|
|
51
|
+
/** Enumerate the user's Google Calendars (everything in their
|
|
52
|
+
* `calendarList` — owned, shared, subscribed). Used so refreshCalendarEvents
|
|
53
|
+
* doesn't hard-code `primary` and miss events on secondary calendars
|
|
54
|
+
* (Bob 2026-05-12: recurring Statin event showed in Thunderbird but not
|
|
55
|
+
* rmfmail because it's on a secondary calendar, not primary).
|
|
56
|
+
*
|
|
57
|
+
* Returns each entry's id (use as `calendarId` in subsequent fetches),
|
|
58
|
+
* summary (display name), and `selected` flag (matches the "show in
|
|
59
|
+
* Google web UI" toggle — a sensible default filter for "which calendars
|
|
60
|
+
* should mailx show"). Hidden / explicitly-unselected calendars are
|
|
61
|
+
* filtered out by the caller; we still return them so a future UI can
|
|
62
|
+
* expose the full list. */
|
|
63
|
+
export interface GCalendarListEntry {
|
|
64
|
+
id: string;
|
|
65
|
+
summary: string;
|
|
66
|
+
selected: boolean;
|
|
67
|
+
primary: boolean;
|
|
68
|
+
/** Calendar-wide default reminder offsets, applied to events whose
|
|
69
|
+
* `reminders.useDefault === true`. Each entry is `{ method, minutes }`;
|
|
70
|
+
* client carries only the minutes for popup reminders. */
|
|
71
|
+
defaultReminderMinutes: number[];
|
|
72
|
+
}
|
|
73
|
+
export declare function listCalendars(tokenProvider: TokenProvider): Promise<GCalendarListEntry[]>;
|
|
40
74
|
export declare function createCalendarEvent(tokenProvider: TokenProvider, event: any, calendarId?: string): Promise<GCalEvent>;
|
|
41
75
|
export declare function updateCalendarEvent(tokenProvider: TokenProvider, eventId: string, event: any, calendarId?: string): Promise<GCalEvent>;
|
|
42
76
|
export declare function deleteCalendarEvent(tokenProvider: TokenProvider, eventId: string, calendarId?: string): Promise<void>;
|
|
@@ -49,6 +83,16 @@ export interface GTask {
|
|
|
49
83
|
status?: "needsAction" | "completed";
|
|
50
84
|
etag?: string;
|
|
51
85
|
}
|
|
86
|
+
/** Enumerate all of the user's Google task lists. Mirrors `listCalendars`
|
|
87
|
+
* — Google "Reminders" are stored as TASKS as of late 2023, and a user
|
|
88
|
+
* can have many task lists, each potentially holding reminders. Without
|
|
89
|
+
* this enumeration mailx only ever sees the `@default` list and misses
|
|
90
|
+
* every reminder filed elsewhere. Bob 2026-05-12. */
|
|
91
|
+
export interface GTaskListEntry {
|
|
92
|
+
id: string;
|
|
93
|
+
title: string;
|
|
94
|
+
}
|
|
95
|
+
export declare function listTaskLists(tokenProvider: TokenProvider): Promise<GTaskListEntry[]>;
|
|
52
96
|
export declare function listTasks(tokenProvider: TokenProvider, listId?: string, showCompleted?: boolean): Promise<GTask[]>;
|
|
53
97
|
export declare function createTask(tokenProvider: TokenProvider, task: any, listId?: string): Promise<GTask>;
|
|
54
98
|
export declare function updateTask(tokenProvider: TokenProvider, taskId: string, task: any, listId?: string): Promise<GTask>;
|
|
@@ -56,7 +100,7 @@ export declare function deleteTask(tokenProvider: TokenProvider, taskId: string,
|
|
|
56
100
|
export declare function createContact(tokenProvider: TokenProvider, person: any): Promise<any>;
|
|
57
101
|
export declare function updateContact(tokenProvider: TokenProvider, resourceName: string, updatePersonFields: string, person: any): Promise<any>;
|
|
58
102
|
export declare function deleteContact(tokenProvider: TokenProvider, resourceName: string): Promise<void>;
|
|
59
|
-
export declare function calendarEventToLocal(ev: GCalEvent, accountId: string): {
|
|
103
|
+
export declare function calendarEventToLocal(ev: GCalEvent, accountId: string, calendarDefaultReminderMinutes?: number[]): {
|
|
60
104
|
providerId: string;
|
|
61
105
|
accountId: string;
|
|
62
106
|
title: string;
|
|
@@ -68,6 +112,7 @@ export declare function calendarEventToLocal(ev: GCalEvent, accountId: string):
|
|
|
68
112
|
etag: string;
|
|
69
113
|
recurringEventId: string | undefined;
|
|
70
114
|
htmlLink: string | undefined;
|
|
115
|
+
reminderMinutes: number[];
|
|
71
116
|
};
|
|
72
117
|
export declare function localToCalendarEvent(local: {
|
|
73
118
|
title: string;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"google-sync.d.ts","sourceRoot":"","sources":["google-sync.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAEH,KAAK,aAAa,GAAG,MAAM,OAAO,CAAC,MAAM,CAAC,CAAC;AAE3C,qBAAa,eAAgB,SAAQ,KAAK;IACtC,MAAM,EAAE,MAAM,CAAC;IACf,UAAU,EAAE,MAAM,CAAC;IACnB,IAAI,EAAE,MAAM,CAAC;gBACD,MAAM,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM;CAM/D;AAmBD,MAAM,WAAW,SAAS;IACtB,EAAE,EAAE,MAAM,CAAC;IACX,OAAO,EAAE,MAAM,CAAC;IAChB,KAAK,EAAE;QAAE,QAAQ,CAAC,EAAE,MAAM,CAAC;QAAC,IAAI,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;IAC5C,GAAG,EAAE;QAAE,QAAQ,CAAC,EAAE,MAAM,CAAC;QAAC,IAAI,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;IAC1C,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd;8EAC0E;IAC1E,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,qDAAqD;IACrD,QAAQ,CAAC,EAAE,MAAM,CAAC;
|
|
1
|
+
{"version":3,"file":"google-sync.d.ts","sourceRoot":"","sources":["google-sync.ts"],"names":[],"mappings":"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"}
|
|
@@ -51,6 +51,32 @@ export async function listCalendarEvents(tokenProvider, fromMs, toMs, calendarId
|
|
|
51
51
|
} while (pageToken);
|
|
52
52
|
return all;
|
|
53
53
|
}
|
|
54
|
+
export async function listCalendars(tokenProvider) {
|
|
55
|
+
const url = "https://www.googleapis.com/calendar/v3/users/me/calendarList?minAccessRole=reader&maxResults=250";
|
|
56
|
+
const out = [];
|
|
57
|
+
let pageToken;
|
|
58
|
+
do {
|
|
59
|
+
const pagedUrl = pageToken ? `${url}&pageToken=${encodeURIComponent(pageToken)}` : url;
|
|
60
|
+
const res = await googleFetch(tokenProvider, pagedUrl);
|
|
61
|
+
const data = await res.json();
|
|
62
|
+
for (const item of (data.items || [])) {
|
|
63
|
+
const dr = Array.isArray(item.defaultReminders)
|
|
64
|
+
? item.defaultReminders
|
|
65
|
+
.filter((r) => (r.method === "popup" || !r.method) && Number.isFinite(r.minutes))
|
|
66
|
+
.map((r) => r.minutes)
|
|
67
|
+
: [];
|
|
68
|
+
out.push({
|
|
69
|
+
id: item.id,
|
|
70
|
+
summary: item.summary || item.id,
|
|
71
|
+
selected: !!item.selected,
|
|
72
|
+
primary: !!item.primary,
|
|
73
|
+
defaultReminderMinutes: dr,
|
|
74
|
+
});
|
|
75
|
+
}
|
|
76
|
+
pageToken = data.nextPageToken;
|
|
77
|
+
} while (pageToken);
|
|
78
|
+
return out;
|
|
79
|
+
}
|
|
54
80
|
export async function createCalendarEvent(tokenProvider, event, calendarId = "primary") {
|
|
55
81
|
const url = `https://www.googleapis.com/calendar/v3/calendars/${encodeURIComponent(calendarId)}/events`;
|
|
56
82
|
const res = await googleFetch(tokenProvider, url, { method: "POST", body: JSON.stringify(event) });
|
|
@@ -65,6 +91,12 @@ export async function deleteCalendarEvent(tokenProvider, eventId, calendarId = "
|
|
|
65
91
|
const url = `https://www.googleapis.com/calendar/v3/calendars/${encodeURIComponent(calendarId)}/events/${encodeURIComponent(eventId)}`;
|
|
66
92
|
await googleFetch(tokenProvider, url, { method: "DELETE" });
|
|
67
93
|
}
|
|
94
|
+
export async function listTaskLists(tokenProvider) {
|
|
95
|
+
const url = "https://tasks.googleapis.com/tasks/v1/users/@me/lists?maxResults=100";
|
|
96
|
+
const res = await googleFetch(tokenProvider, url);
|
|
97
|
+
const data = await res.json();
|
|
98
|
+
return (data.items || []).map((it) => ({ id: it.id, title: it.title || it.id }));
|
|
99
|
+
}
|
|
68
100
|
export async function listTasks(tokenProvider, listId = "@default", showCompleted = false) {
|
|
69
101
|
const url = `https://tasks.googleapis.com/tasks/v1/lists/${encodeURIComponent(listId)}/tasks`
|
|
70
102
|
+ `?showCompleted=${showCompleted}&maxResults=100`;
|
|
@@ -103,7 +135,7 @@ export async function deleteContact(tokenProvider, resourceName) {
|
|
|
103
135
|
await googleFetch(tokenProvider, url, { method: "DELETE" });
|
|
104
136
|
}
|
|
105
137
|
// ── Conversion helpers ──
|
|
106
|
-
export function calendarEventToLocal(ev, accountId) {
|
|
138
|
+
export function calendarEventToLocal(ev, accountId, calendarDefaultReminderMinutes = []) {
|
|
107
139
|
const allDay = !!ev.start.date && !ev.start.dateTime;
|
|
108
140
|
const startMs = allDay
|
|
109
141
|
? Date.parse(ev.start.date)
|
|
@@ -111,6 +143,22 @@ export function calendarEventToLocal(ev, accountId) {
|
|
|
111
143
|
const endMs = allDay
|
|
112
144
|
? Date.parse(ev.end.date)
|
|
113
145
|
: Date.parse(ev.end.dateTime);
|
|
146
|
+
// Per-event reminder offsets. Google sends `useDefault: true` to mean
|
|
147
|
+
// "apply the calendar's defaultReminders" (which we passed in from the
|
|
148
|
+
// calendarList entry). When `useDefault: false`, the event's own
|
|
149
|
+
// `overrides` array wins. We only fire `popup` reminders client-side
|
|
150
|
+
// — email reminders are Google's job, sending a duplicate from mailx
|
|
151
|
+
// would be redundant. Bob 2026-05-12: "use the reminder times in the
|
|
152
|
+
// event (there can be multiple)".
|
|
153
|
+
let reminderMinutes = [];
|
|
154
|
+
if (ev.reminders?.useDefault) {
|
|
155
|
+
reminderMinutes = calendarDefaultReminderMinutes.slice();
|
|
156
|
+
}
|
|
157
|
+
else if (Array.isArray(ev.reminders?.overrides)) {
|
|
158
|
+
reminderMinutes = ev.reminders.overrides
|
|
159
|
+
.filter(r => (r.method === "popup" || !r.method) && Number.isFinite(r.minutes))
|
|
160
|
+
.map(r => r.minutes);
|
|
161
|
+
}
|
|
114
162
|
return {
|
|
115
163
|
providerId: ev.id, accountId,
|
|
116
164
|
title: ev.summary || "(no title)",
|
|
@@ -119,6 +167,7 @@ export function calendarEventToLocal(ev, accountId) {
|
|
|
119
167
|
etag: ev.etag || "",
|
|
120
168
|
recurringEventId: ev.recurringEventId,
|
|
121
169
|
htmlLink: ev.htmlLink,
|
|
170
|
+
reminderMinutes,
|
|
122
171
|
};
|
|
123
172
|
}
|
|
124
173
|
export function localToCalendarEvent(local) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"google-sync.js","sourceRoot":"","sources":["google-sync.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAIH,MAAM,OAAO,eAAgB,SAAQ,KAAK;IACtC,MAAM,CAAS;IACf,UAAU,CAAS;IACnB,IAAI,CAAS;IACb,YAAY,MAAc,EAAE,UAAkB,EAAE,IAAY;QACxD,KAAK,CAAC,cAAc,MAAM,IAAI,UAAU,KAAK,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,EAAE,CAAC,CAAC;QACnE,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC;QACrB,IAAI,CAAC,UAAU,GAAG,UAAU,CAAC;QAC7B,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC;IACrB,CAAC;CACJ;AAED,KAAK,UAAU,WAAW,CACtB,aAA4B,EAAE,GAAW,EAAE,OAAoB,EAAE;IAEjE,MAAM,KAAK,GAAG,MAAM,aAAa,EAAE,CAAC;IACpC,MAAM,OAAO,GAAG,IAAI,OAAO,CAAC,IAAI,CAAC,OAAO,IAAI,EAAE,CAAC,CAAC;IAChD,OAAO,CAAC,GAAG,CAAC,eAAe,EAAE,UAAU,KAAK,EAAE,CAAC,CAAC;IAChD,IAAI,IAAI,CAAC,IAAI,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,cAAc,CAAC;QAAE,OAAO,CAAC,GAAG,CAAC,cAAc,EAAE,kBAAkB,CAAC,CAAC;IAC/F,MAAM,GAAG,GAAG,MAAM,KAAK,CAAC,GAAG,EAAE,EAAE,GAAG,IAAI,EAAE,OAAO,EAAE,CAAC,CAAC;IACnD,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,CAAC;QACV,MAAM,IAAI,GAAG,MAAM,GAAG,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,EAAE,CAAC,CAAC;QAC9C,MAAM,IAAI,eAAe,CAAC,GAAG,CAAC,MAAM,EAAE,GAAG,CAAC,UAAU,EAAE,IAAI,CAAC,CAAC;IAChE,CAAC;IACD,OAAO,GAAG,CAAC;AACf,CAAC;
|
|
1
|
+
{"version":3,"file":"google-sync.js","sourceRoot":"","sources":["google-sync.ts"],"names":[],"mappings":"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"}
|
|
@@ -54,6 +54,14 @@ export interface GCalEvent {
|
|
|
54
54
|
recurringEventId?: string;
|
|
55
55
|
/** Link to open the event in Google Calendar web. */
|
|
56
56
|
htmlLink?: string;
|
|
57
|
+
/** Per-event reminder configuration. `useDefault: true` means apply
|
|
58
|
+
* the calendar's `defaultReminders` (carried separately on the
|
|
59
|
+
* calendarList entry); when false, `overrides` lists each popup /
|
|
60
|
+
* email reminder offset for this specific event. */
|
|
61
|
+
reminders?: {
|
|
62
|
+
useDefault?: boolean;
|
|
63
|
+
overrides?: Array<{ method: string; minutes: number }>;
|
|
64
|
+
};
|
|
57
65
|
}
|
|
58
66
|
|
|
59
67
|
export async function listCalendarEvents(
|
|
@@ -76,6 +84,55 @@ export async function listCalendarEvents(
|
|
|
76
84
|
return all;
|
|
77
85
|
}
|
|
78
86
|
|
|
87
|
+
/** Enumerate the user's Google Calendars (everything in their
|
|
88
|
+
* `calendarList` — owned, shared, subscribed). Used so refreshCalendarEvents
|
|
89
|
+
* doesn't hard-code `primary` and miss events on secondary calendars
|
|
90
|
+
* (Bob 2026-05-12: recurring Statin event showed in Thunderbird but not
|
|
91
|
+
* rmfmail because it's on a secondary calendar, not primary).
|
|
92
|
+
*
|
|
93
|
+
* Returns each entry's id (use as `calendarId` in subsequent fetches),
|
|
94
|
+
* summary (display name), and `selected` flag (matches the "show in
|
|
95
|
+
* Google web UI" toggle — a sensible default filter for "which calendars
|
|
96
|
+
* should mailx show"). Hidden / explicitly-unselected calendars are
|
|
97
|
+
* filtered out by the caller; we still return them so a future UI can
|
|
98
|
+
* expose the full list. */
|
|
99
|
+
export interface GCalendarListEntry {
|
|
100
|
+
id: string;
|
|
101
|
+
summary: string;
|
|
102
|
+
selected: boolean;
|
|
103
|
+
primary: boolean;
|
|
104
|
+
/** Calendar-wide default reminder offsets, applied to events whose
|
|
105
|
+
* `reminders.useDefault === true`. Each entry is `{ method, minutes }`;
|
|
106
|
+
* client carries only the minutes for popup reminders. */
|
|
107
|
+
defaultReminderMinutes: number[];
|
|
108
|
+
}
|
|
109
|
+
export async function listCalendars(tokenProvider: TokenProvider): Promise<GCalendarListEntry[]> {
|
|
110
|
+
const url = "https://www.googleapis.com/calendar/v3/users/me/calendarList?minAccessRole=reader&maxResults=250";
|
|
111
|
+
const out: GCalendarListEntry[] = [];
|
|
112
|
+
let pageToken: string | undefined;
|
|
113
|
+
do {
|
|
114
|
+
const pagedUrl = pageToken ? `${url}&pageToken=${encodeURIComponent(pageToken)}` : url;
|
|
115
|
+
const res = await googleFetch(tokenProvider, pagedUrl);
|
|
116
|
+
const data = await res.json() as any;
|
|
117
|
+
for (const item of (data.items || [])) {
|
|
118
|
+
const dr: number[] = Array.isArray(item.defaultReminders)
|
|
119
|
+
? item.defaultReminders
|
|
120
|
+
.filter((r: any) => (r.method === "popup" || !r.method) && Number.isFinite(r.minutes))
|
|
121
|
+
.map((r: any) => r.minutes)
|
|
122
|
+
: [];
|
|
123
|
+
out.push({
|
|
124
|
+
id: item.id,
|
|
125
|
+
summary: item.summary || item.id,
|
|
126
|
+
selected: !!item.selected,
|
|
127
|
+
primary: !!item.primary,
|
|
128
|
+
defaultReminderMinutes: dr,
|
|
129
|
+
});
|
|
130
|
+
}
|
|
131
|
+
pageToken = data.nextPageToken;
|
|
132
|
+
} while (pageToken);
|
|
133
|
+
return out;
|
|
134
|
+
}
|
|
135
|
+
|
|
79
136
|
export async function createCalendarEvent(
|
|
80
137
|
tokenProvider: TokenProvider, event: any, calendarId = "primary",
|
|
81
138
|
): Promise<GCalEvent> {
|
|
@@ -111,6 +168,22 @@ export interface GTask {
|
|
|
111
168
|
etag?: string;
|
|
112
169
|
}
|
|
113
170
|
|
|
171
|
+
/** Enumerate all of the user's Google task lists. Mirrors `listCalendars`
|
|
172
|
+
* — Google "Reminders" are stored as TASKS as of late 2023, and a user
|
|
173
|
+
* can have many task lists, each potentially holding reminders. Without
|
|
174
|
+
* this enumeration mailx only ever sees the `@default` list and misses
|
|
175
|
+
* every reminder filed elsewhere. Bob 2026-05-12. */
|
|
176
|
+
export interface GTaskListEntry {
|
|
177
|
+
id: string;
|
|
178
|
+
title: string;
|
|
179
|
+
}
|
|
180
|
+
export async function listTaskLists(tokenProvider: TokenProvider): Promise<GTaskListEntry[]> {
|
|
181
|
+
const url = "https://tasks.googleapis.com/tasks/v1/users/@me/lists?maxResults=100";
|
|
182
|
+
const res = await googleFetch(tokenProvider, url);
|
|
183
|
+
const data = await res.json() as any;
|
|
184
|
+
return (data.items || []).map((it: any) => ({ id: it.id, title: it.title || it.id }));
|
|
185
|
+
}
|
|
186
|
+
|
|
114
187
|
export async function listTasks(
|
|
115
188
|
tokenProvider: TokenProvider, listId = "@default", showCompleted = false,
|
|
116
189
|
): Promise<GTask[]> {
|
|
@@ -172,12 +245,13 @@ export async function deleteContact(
|
|
|
172
245
|
|
|
173
246
|
// ── Conversion helpers ──
|
|
174
247
|
|
|
175
|
-
export function calendarEventToLocal(ev: GCalEvent, accountId: string): {
|
|
248
|
+
export function calendarEventToLocal(ev: GCalEvent, accountId: string, calendarDefaultReminderMinutes: number[] = []): {
|
|
176
249
|
providerId: string; accountId: string; title: string;
|
|
177
250
|
startMs: number; endMs: number; allDay: boolean;
|
|
178
251
|
location: string; notes: string; etag: string;
|
|
179
252
|
recurringEventId: string | undefined;
|
|
180
253
|
htmlLink: string | undefined;
|
|
254
|
+
reminderMinutes: number[];
|
|
181
255
|
} {
|
|
182
256
|
const allDay = !!ev.start.date && !ev.start.dateTime;
|
|
183
257
|
const startMs = allDay
|
|
@@ -186,6 +260,21 @@ export function calendarEventToLocal(ev: GCalEvent, accountId: string): {
|
|
|
186
260
|
const endMs = allDay
|
|
187
261
|
? Date.parse(ev.end.date!)
|
|
188
262
|
: Date.parse(ev.end.dateTime!);
|
|
263
|
+
// Per-event reminder offsets. Google sends `useDefault: true` to mean
|
|
264
|
+
// "apply the calendar's defaultReminders" (which we passed in from the
|
|
265
|
+
// calendarList entry). When `useDefault: false`, the event's own
|
|
266
|
+
// `overrides` array wins. We only fire `popup` reminders client-side
|
|
267
|
+
// — email reminders are Google's job, sending a duplicate from mailx
|
|
268
|
+
// would be redundant. Bob 2026-05-12: "use the reminder times in the
|
|
269
|
+
// event (there can be multiple)".
|
|
270
|
+
let reminderMinutes: number[] = [];
|
|
271
|
+
if (ev.reminders?.useDefault) {
|
|
272
|
+
reminderMinutes = calendarDefaultReminderMinutes.slice();
|
|
273
|
+
} else if (Array.isArray(ev.reminders?.overrides)) {
|
|
274
|
+
reminderMinutes = ev.reminders!.overrides!
|
|
275
|
+
.filter(r => (r.method === "popup" || !r.method) && Number.isFinite(r.minutes))
|
|
276
|
+
.map(r => r.minutes);
|
|
277
|
+
}
|
|
189
278
|
return {
|
|
190
279
|
providerId: ev.id, accountId,
|
|
191
280
|
title: ev.summary || "(no title)",
|
|
@@ -194,6 +283,7 @@ export function calendarEventToLocal(ev: GCalEvent, accountId: string): {
|
|
|
194
283
|
etag: ev.etag || "",
|
|
195
284
|
recurringEventId: ev.recurringEventId,
|
|
196
285
|
htmlLink: ev.htmlLink,
|
|
286
|
+
reminderMinutes,
|
|
197
287
|
};
|
|
198
288
|
}
|
|
199
289
|
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["index.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["index.ts"],"names":[],"mappings":"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"}
|
|
@@ -1264,8 +1264,54 @@ export class MailxService {
|
|
|
1264
1264
|
* Tight loop = 429 quota burn. */
|
|
1265
1265
|
async refreshCalendarEvents(accountId, fromMs, toMs) {
|
|
1266
1266
|
const tp = await this.primaryTokenProvider("calendar");
|
|
1267
|
-
|
|
1268
|
-
|
|
1267
|
+
// Enumerate ALL of the user's `selected` calendars (the ones shown
|
|
1268
|
+
// in Google's web UI) and pull events from each. Earlier code
|
|
1269
|
+
// hard-coded `primary` only — so any event living on a secondary
|
|
1270
|
+
// calendar (a personal "Statin" reminder, a shared work cal, a
|
|
1271
|
+
// sports schedule) was invisible to mailx. Bob 2026-05-12:
|
|
1272
|
+
// "you're still not showing me and alerting me about recurring
|
|
1273
|
+
// events." Thunderbird and Google's own UI walk the entire
|
|
1274
|
+
// calendarList; mailx now does too. Failing to list calendars
|
|
1275
|
+
// falls back to primary so single-calendar users still work.
|
|
1276
|
+
let calendarsToFetch = [{ id: "primary", label: "primary", defaultReminderMinutes: [] }];
|
|
1277
|
+
try {
|
|
1278
|
+
const all = await gsync.listCalendars(tp);
|
|
1279
|
+
const selected = all.filter(c => c.selected);
|
|
1280
|
+
if (selected.length > 0) {
|
|
1281
|
+
calendarsToFetch = selected.map(c => ({
|
|
1282
|
+
id: c.id, label: c.summary || c.id,
|
|
1283
|
+
defaultReminderMinutes: c.defaultReminderMinutes,
|
|
1284
|
+
}));
|
|
1285
|
+
console.log(` [calendar] enumerated ${all.length} calendars, ${selected.length} selected`);
|
|
1286
|
+
}
|
|
1287
|
+
else {
|
|
1288
|
+
console.log(` [calendar] no selected calendars — falling back to primary`);
|
|
1289
|
+
}
|
|
1290
|
+
}
|
|
1291
|
+
catch (e) {
|
|
1292
|
+
console.warn(` [calendar] listCalendars failed (${e?.message || e}) — falling back to primary`);
|
|
1293
|
+
}
|
|
1294
|
+
const fetchResults = await Promise.all(calendarsToFetch.map(async (c) => {
|
|
1295
|
+
try {
|
|
1296
|
+
const ev = await gsync.listCalendarEvents(tp, fromMs, toMs, c.id);
|
|
1297
|
+
console.log(` [calendar] pulled ${ev.length} events from "${c.label}" (${new Date(fromMs).toISOString().slice(0, 10)} to ${new Date(toMs).toISOString().slice(0, 10)})`);
|
|
1298
|
+
return { events: ev, calendarId: c.id, defaultReminderMinutes: c.defaultReminderMinutes };
|
|
1299
|
+
}
|
|
1300
|
+
catch (e) {
|
|
1301
|
+
console.warn(` [calendar] fetch from "${c.label}" failed: ${e?.message || e}`);
|
|
1302
|
+
return { events: [], calendarId: c.id, defaultReminderMinutes: c.defaultReminderMinutes };
|
|
1303
|
+
}
|
|
1304
|
+
}));
|
|
1305
|
+
// Flatten with each event remembering its source calendar's default
|
|
1306
|
+
// reminder list, so calendarEventToLocal can apply the right
|
|
1307
|
+
// defaults when `reminders.useDefault === true`.
|
|
1308
|
+
const eventsWithDefaults = [];
|
|
1309
|
+
for (const fr of fetchResults) {
|
|
1310
|
+
for (const ev of fr.events) {
|
|
1311
|
+
eventsWithDefaults.push({ ev, defaultReminderMinutes: fr.defaultReminderMinutes });
|
|
1312
|
+
}
|
|
1313
|
+
}
|
|
1314
|
+
const events = eventsWithDefaults.map(x => x.ev);
|
|
1269
1315
|
// Holiday calendars (Q131 + Bob 2026-05-11 second-toggle request).
|
|
1270
1316
|
// Each enabled toggle pulls a separate Google public calendar; rows
|
|
1271
1317
|
// are tagged with the source `calendar_id` so toggling one off only
|
|
@@ -1327,8 +1373,8 @@ export class MailxService {
|
|
|
1327
1373
|
// so an event whose start moves outside the prior query range doesn't
|
|
1328
1374
|
// get a second row on the next pull.
|
|
1329
1375
|
const seenProviderIds = new Set();
|
|
1330
|
-
for (const ev of
|
|
1331
|
-
const local = gsync.calendarEventToLocal(ev, accountId);
|
|
1376
|
+
for (const { ev, defaultReminderMinutes } of eventsWithDefaults) {
|
|
1377
|
+
const local = gsync.calendarEventToLocal(ev, accountId, defaultReminderMinutes);
|
|
1332
1378
|
seenProviderIds.add(ev.id);
|
|
1333
1379
|
const existing = this.db.getCalendarEventByProviderId(accountId, ev.id);
|
|
1334
1380
|
if (existing && calendarRowEquals(existing, local) && !existing.isHoliday)
|
|
@@ -1461,8 +1507,35 @@ export class MailxService {
|
|
|
1461
1507
|
}
|
|
1462
1508
|
async refreshTasks(accountId, includeCompleted) {
|
|
1463
1509
|
const tp = await this.primaryTokenProvider("tasks");
|
|
1464
|
-
|
|
1465
|
-
|
|
1510
|
+
// Enumerate every task list (Google Reminders since late 2023 live
|
|
1511
|
+
// here, and users can have many lists — "My Tasks", "Reminders",
|
|
1512
|
+
// custom ones). Earlier code only queried `@default`, so reminders
|
|
1513
|
+
// filed elsewhere were invisible. Bob 2026-05-12. Falling back to
|
|
1514
|
+
// a single `@default` query keeps single-list users working when
|
|
1515
|
+
// the listTaskLists call fails.
|
|
1516
|
+
let lists = [{ id: "@default", title: "@default" }];
|
|
1517
|
+
try {
|
|
1518
|
+
const all = await gsync.listTaskLists(tp);
|
|
1519
|
+
if (all.length > 0) {
|
|
1520
|
+
lists = all;
|
|
1521
|
+
console.log(` [tasks] enumerated ${all.length} task list(s)`);
|
|
1522
|
+
}
|
|
1523
|
+
}
|
|
1524
|
+
catch (e) {
|
|
1525
|
+
console.warn(` [tasks] listTaskLists failed (${e?.message || e}) — falling back to @default`);
|
|
1526
|
+
}
|
|
1527
|
+
const fetchResults = await Promise.all(lists.map(async (l) => {
|
|
1528
|
+
try {
|
|
1529
|
+
const t = await gsync.listTasks(tp, l.id, includeCompleted);
|
|
1530
|
+
console.log(` [tasks] pulled ${t.length} tasks from "${l.title}"`);
|
|
1531
|
+
return t;
|
|
1532
|
+
}
|
|
1533
|
+
catch (e) {
|
|
1534
|
+
console.warn(` [tasks] fetch from "${l.title}" failed: ${e?.message || e}`);
|
|
1535
|
+
return [];
|
|
1536
|
+
}
|
|
1537
|
+
}));
|
|
1538
|
+
const tasks = [].concat(...fetchResults);
|
|
1466
1539
|
const existing = this.db.getTasks(accountId, true);
|
|
1467
1540
|
let changed = false;
|
|
1468
1541
|
const seen = new Set();
|