@bobfrankston/mailx-service 0.1.47

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.
Files changed (54) hide show
  1. package/ai-usage.d.ts +32 -0
  2. package/ai-usage.d.ts.map +1 -0
  3. package/ai-usage.js +98 -0
  4. package/ai-usage.js.map +1 -0
  5. package/charset.d.ts +15 -0
  6. package/charset.d.ts.map +1 -0
  7. package/charset.js +61 -0
  8. package/charset.js.map +1 -0
  9. package/db-worker-client.d.ts +32 -0
  10. package/db-worker-client.d.ts.map +1 -0
  11. package/db-worker-client.js +66 -0
  12. package/db-worker-client.js.map +1 -0
  13. package/db-worker.d.ts +39 -0
  14. package/db-worker.d.ts.map +1 -0
  15. package/db-worker.js +115 -0
  16. package/db-worker.js.map +1 -0
  17. package/google-sync.d.ts +151 -0
  18. package/google-sync.d.ts.map +1 -0
  19. package/google-sync.js +259 -0
  20. package/google-sync.js.map +1 -0
  21. package/html-to-docx.d.ts +1 -0
  22. package/index.d.ts +1102 -0
  23. package/index.d.ts.map +1 -0
  24. package/index.js +5476 -0
  25. package/index.js.map +1 -0
  26. package/jsonrpc.d.ts +29 -0
  27. package/jsonrpc.d.ts.map +1 -0
  28. package/jsonrpc.js +481 -0
  29. package/jsonrpc.js.map +1 -0
  30. package/local-store.d.ts +10 -0
  31. package/local-store.d.ts.map +1 -0
  32. package/local-store.js +9 -0
  33. package/local-store.js.map +1 -0
  34. package/package.json +53 -0
  35. package/reconciler.d.ts +90 -0
  36. package/reconciler.d.ts.map +1 -0
  37. package/reconciler.js +277 -0
  38. package/reconciler.js.map +1 -0
  39. package/sync-queue.d.ts +127 -0
  40. package/sync-queue.d.ts.map +1 -0
  41. package/sync-queue.js +271 -0
  42. package/sync-queue.js.map +1 -0
  43. package/sync-worker-client.d.ts +33 -0
  44. package/sync-worker-client.d.ts.map +1 -0
  45. package/sync-worker-client.js +89 -0
  46. package/sync-worker-client.js.map +1 -0
  47. package/sync-worker.d.ts +33 -0
  48. package/sync-worker.d.ts.map +1 -0
  49. package/sync-worker.js +143 -0
  50. package/sync-worker.js.map +1 -0
  51. package/word-html.d.ts +41 -0
  52. package/word-html.d.ts.map +1 -0
  53. package/word-html.js +122 -0
  54. package/word-html.js.map +1 -0
package/jsonrpc.js ADDED
@@ -0,0 +1,481 @@
1
+ /**
2
+ * JSON-RPC dispatcher for MailxService.
3
+ * Maps mailxapi action names to MailxService method calls.
4
+ * Used by msger's bidirectional IPC (Phase 3) and can also
5
+ * serve as a stdio JSON-RPC interface for testing.
6
+ */
7
+ // 2026-09-29 16:30 EDT — Claude Code (Fable 5.1), after Bob's new-machine
8
+ // failure. This module used to read the app's version for itself:
9
+ // readFileSync(join(import.meta.dirname, "..", "..", "package.json"))
10
+ // That path is the app's package.json only in the DEV layout
11
+ // (app/packages/mailx-service). Installed from the registry this package sits
12
+ // at rmfmail/node_modules/@bobfrankston/mailx-service, the same two steps up
13
+ // land on rmfmail/node_modules/package.json, which does not exist — and because
14
+ // the read ran at module load, importing this file threw ENOENT and rmfmail
15
+ // died at startup on every registry install.
16
+ // The version is the HOST's knowledge. The host hands it over; this package no
17
+ // longer looks outside itself.
18
+ let appVersion = "";
19
+ /** Tell the dispatcher which app version to report from `getVersion`.
20
+ * Called once by the host (bin/mailx.ts) at startup. */
21
+ export function setAppVersion(version) {
22
+ appVersion = version || "";
23
+ }
24
+ /**
25
+ * Largest message body we will hand to the IPC channel.
26
+ *
27
+ * This is a TRANSPORT limit, not a display limit. msger answers every IPC call
28
+ * by marshalling the reply into a JavaScript source string and running it
29
+ * through `webview.evaluate_script(...)`. A 9 MB body therefore becomes a
30
+ * ~10 MB script for WebView2 to compile, which kills the renderer outright:
31
+ *
32
+ * [msger] WebView2 process failed (kind=2) — reloading
33
+ *
34
+ * and the app comes back unusable (Bob 2026-08-08, a 9.35 MB qmail bounce from
35
+ * gal.iecc.com that inlined the entire original message — no MIME structure, so
36
+ * the whole thing is one text/plain part). Worse than the crash: when the reply
37
+ * never lands the viewer silently fell back to the 200-character `preview`
38
+ * column and presented it AS the message, so a 9 MB bounce looked like one
39
+ * sentence trailing off mid-word at "<al".
40
+ *
41
+ * 1.5 MB is comfortably above any body a human wrote and far below what breaks
42
+ * evaluate_script. Over the line, the head of the body still goes across (so
43
+ * the message is readable) with `bodyTruncated` set, and the UI says plainly
44
+ * what happened instead of pretending the snippet is the whole letter.
45
+ *
46
+ * The proper fix is to stop marshalling bodies through evaluate_script at all —
47
+ * the loopback server already serves them over plain HTTP at `/body`, which has
48
+ * no such limit. This guard is what makes the failure survivable until then.
49
+ */
50
+ const IPC_BODY_MAX_BYTES = 1_500_000;
51
+ /** Head of an oversized body, cut on a line boundary so the visible text ends
52
+ * somewhere sensible rather than mid-token. */
53
+ function headOf(s, max) {
54
+ if (s.length <= max)
55
+ return s;
56
+ const cut = s.slice(0, max);
57
+ const lastBreak = cut.lastIndexOf("\n");
58
+ return lastBreak > max * 0.8 ? cut.slice(0, lastBreak) : cut;
59
+ }
60
+ /**
61
+ * Keep a getMessage reply inside what the IPC channel can actually carry.
62
+ * Returns the message unchanged when it already fits — the overwhelming
63
+ * majority of mail — so there is no cost on the normal path.
64
+ */
65
+ function capBodyForIpc(msg) {
66
+ if (!msg || typeof msg !== "object")
67
+ return msg;
68
+ const html = typeof msg.bodyHtml === "string" ? msg.bodyHtml : "";
69
+ const text = typeof msg.bodyText === "string" ? msg.bodyText : "";
70
+ // A message with an HTML part is NEVER touched, at any size.
71
+ //
72
+ // The first cut of this guard truncated on total size and refused to send
73
+ // partial HTML, so a legitimate 9.8 MB message — one Bob had just written,
74
+ // large because of a pasted inline image — arrived with its HTML dropped
75
+ // and rendered as "Showing the first 0.0 MB" (Bob 2026-08-08: "I pasted in
76
+ // an image and you blew it away?"). Destroying real content to protect the
77
+ // renderer is a worse failure than the one being protected against.
78
+ //
79
+ // What remains guarded is the genuinely pathological shape: NO MIME
80
+ // structure at all, so the entire multi-megabyte payload is one implicit
81
+ // text/plain part (a qmail bounce that inlines the whole original). There,
82
+ // the tail is base64 of a returned attachment — truncating it costs the
83
+ // user nothing, while the head carries every diagnostic that matters.
84
+ if (html)
85
+ return msg;
86
+ if (text.length <= IPC_BODY_MAX_BYTES)
87
+ return msg;
88
+ const keptText = headOf(text, IPC_BODY_MAX_BYTES);
89
+ console.log(` [ipc] MIME-less body of ${text.length} bytes — acct=${msg.accountId} uid=${msg.uid} `
90
+ + `→ sending first ${keptText.length} bytes with a truncation notice`);
91
+ return {
92
+ ...msg,
93
+ bodyText: keptText,
94
+ bodyTruncated: {
95
+ totalBytes: text.length,
96
+ sentBytes: keptText.length,
97
+ hadHtml: false,
98
+ emlPath: msg.emlPath || "",
99
+ },
100
+ };
101
+ }
102
+ // ── Debug eval return channel ──
103
+ // The `--debug-server` /api/eval endpoint pushes a `debugEval` event to the
104
+ // main window; app.ts evaluates the code and answers via the
105
+ // `debugEvalResult` action below. bin/mailx.ts registers this sink to
106
+ // correlate answers back to the waiting HTTP request. Dev tooling only —
107
+ // nothing fires unless --debug-server pushed an eval event.
108
+ let debugEvalSink = null;
109
+ export function setDebugEvalSink(fn) {
110
+ debugEvalSink = fn;
111
+ }
112
+ /** Dispatch an incoming mailxapi call to the appropriate MailxService method */
113
+ export async function dispatch(svc, req) {
114
+ const { _action, _cbid, ...params } = req;
115
+ try {
116
+ const result = await dispatchAction(svc, _action, params);
117
+ return { _cbid, result };
118
+ }
119
+ catch (e) {
120
+ return { _cbid, error: formatRpcError(e) };
121
+ }
122
+ }
123
+ /** Turn any thrown value into a useful one-line message for the UI.
124
+ * Critically, unwraps AggregateError — Node throws it for a failed
125
+ * connection that tried multiple addresses (IPv6 + IPv4), and its `.message`
126
+ * is the useless bare string "AggregateError" while the real reasons
127
+ * (ECONNREFUSED / ETIMEDOUT / connection-limit) live in `.errors`. Surfacing
128
+ * those turns "Failed: AggregateError" into "Failed: couldn't connect —
129
+ * ETIMEDOUT" (Bob 2026-06-12). Also appends `.code` and the `.cause` chain. */
130
+ function formatRpcError(e) {
131
+ if (e == null)
132
+ return "Unknown error";
133
+ let msg = (typeof e === "string") ? e : (e.message || "");
134
+ if (Array.isArray(e?.errors) && e.errors.length) {
135
+ const inner = e.errors
136
+ .map((x) => (x?.message || x?.code || String(x)))
137
+ .filter(Boolean)
138
+ .join("; ");
139
+ msg = (msg && msg !== "AggregateError") ? `${msg}: ${inner}` : inner;
140
+ }
141
+ if (!msg)
142
+ msg = String(e);
143
+ if (e?.code && !msg.includes(e.code))
144
+ msg += ` (${e.code})`;
145
+ if (e?.cause) {
146
+ const c = e.cause.message || e.cause.code || String(e.cause);
147
+ if (c && !msg.includes(c))
148
+ msg += ` ← ${c}`;
149
+ }
150
+ return msg;
151
+ }
152
+ async function dispatchAction(svc, action, p) {
153
+ switch (action) {
154
+ // Accounts
155
+ case "getAccounts":
156
+ return svc.getAccounts();
157
+ case "getFolders":
158
+ return svc.getFolders(p.accountId);
159
+ // Messages
160
+ case "getMessages":
161
+ return svc.getMessages(p.accountId, p.folderId, p.page, p.pageSize, p.sort, p.sortDir, p.search, p.flaggedOnly, p.dateBasis);
162
+ case "getUnifiedInbox":
163
+ return svc.getUnifiedInbox(p.page || 1, p.pageSize || 50, !!p.flaggedOnly, p.dateBasis);
164
+ case "getMessage":
165
+ // capBodyForIpc, not the store: the HTTP /body path in
166
+ // popout-server has no evaluate_script limit and must keep
167
+ // serving the FULL body. The cap belongs to this transport only.
168
+ return capBodyForIpc(await svc.getMessage(p.accountId, p.uid, p.allowRemote, p.folderId));
169
+ // Flags & actions
170
+ case "updateFlags":
171
+ await svc.updateFlags(p.accountId, p.uid, p.flags, p.folderId);
172
+ return { ok: true };
173
+ case "deleteMessage":
174
+ await svc.deleteMessage(p.accountId, p.uid, p.folderId);
175
+ return { ok: true };
176
+ case "deleteMessages":
177
+ await svc.deleteMessages(p.accountId, p.uids, p.folderIds);
178
+ return { ok: true, count: p.uids.length };
179
+ case "undeleteMessage":
180
+ await svc.undeleteMessage(p.accountId, p.uid, p.folderId);
181
+ return { ok: true };
182
+ case "moveMessage":
183
+ await svc.moveMessage(p.accountId, p.uid, p.targetFolderId, p.targetAccountId);
184
+ return { ok: true };
185
+ case "moveMessages":
186
+ await svc.moveMessages(p.accountId, p.uids, p.targetFolderId, p.folderIds);
187
+ return { ok: true, count: p.uids.length };
188
+ case "copyMessages":
189
+ await svc.copyMessages(p.accountId, p.uids, p.folderIds, p.targetFolderId);
190
+ return { ok: true, count: p.uids.length };
191
+ case "markAsSpamMessages":
192
+ return await svc.markAsSpamMessages(p.accountId, p.uids, p.folderIds);
193
+ // Folders
194
+ case "markFolderRead":
195
+ svc.markFolderRead(p.folderId);
196
+ return { ok: true };
197
+ case "createFolder":
198
+ await svc.createFolder(p.accountId, p.parentPath, p.name);
199
+ return { ok: true };
200
+ case "renameFolder":
201
+ await svc.renameFolder(p.accountId, p.folderId, p.newName, p.newParentId);
202
+ return { ok: true };
203
+ case "deleteFolder":
204
+ await svc.deleteFolder(p.accountId, p.folderId);
205
+ return { ok: true };
206
+ case "moveFolderToTrash":
207
+ await svc.moveFolderToTrash(p.accountId, p.folderId);
208
+ return { ok: true };
209
+ case "emptyFolder":
210
+ await svc.emptyFolder(p.accountId, p.folderId);
211
+ return { ok: true };
212
+ // Compose. sendMessage validates synchronously (fast — regex check on
213
+ // recipient strings), then writes to disk synchronously inside the
214
+ // service. Validation errors come back immediately to the user; once
215
+ // we've ACK'd, the message is durable on disk and the worker drains it.
216
+ // The whole call should be sub-100ms; if it ever isn't, the [send]
217
+ // timing log shows which step ate the budget.
218
+ case "sendMessage":
219
+ await svc.send(p);
220
+ return { ok: true };
221
+ case "saveDraft":
222
+ return svc.saveDraft(p.accountId, p.subject, p.bodyHtml, p.bodyText, p.to, p.cc, p.previousDraftUid, p.draftId, p.bcc, p.from, p.attachments);
223
+ case "deleteDraft":
224
+ await svc.deleteDraft(p.accountId, p.draftUid, p.draftId);
225
+ return { ok: true };
226
+ case "checkDraftNewer":
227
+ return await svc.checkDraftNewer(p.accountId, p.draftId, p.sinceUid);
228
+ // Sync
229
+ case "syncAll":
230
+ await svc.syncAll();
231
+ return { ok: true };
232
+ case "syncAccount":
233
+ await svc.syncAccount(p.accountId);
234
+ return { ok: true };
235
+ case "syncFolderNow":
236
+ await svc.syncFolderNow(p.accountId, p.folderId);
237
+ return { ok: true };
238
+ case "getSyncPending":
239
+ return svc.getSyncPending();
240
+ case "getDiagnostics":
241
+ return svc.getDiagnostics();
242
+ case "getPrimaryAccount":
243
+ return svc.getPrimaryAccount(p?.feature);
244
+ // Calendar / Tasks: two-way cache. Reads return local immediately
245
+ // and kick a background refresh that emits updates when done.
246
+ case "getCalendarEvents":
247
+ return await svc.getCalendarEvents(p.fromMs, p.toMs);
248
+ case "refreshCalendarNow":
249
+ return await svc.refreshCalendarNow();
250
+ case "getCalendars":
251
+ return await svc.getCalendars();
252
+ case "createCalendarEvent":
253
+ return { uuid: await svc.createCalendarEventLocal(p) };
254
+ case "updateCalendarEvent":
255
+ await svc.updateCalendarEventLocal(p.uuid, p.patch);
256
+ return { ok: true };
257
+ case "deleteCalendarEvent":
258
+ await svc.deleteCalendarEventLocal(p.uuid);
259
+ return { ok: true };
260
+ case "getTasks":
261
+ return await svc.getTasks(!!p.includeCompleted);
262
+ case "createTask":
263
+ return { uuid: await svc.createTaskLocal(p) };
264
+ case "updateTask":
265
+ await svc.updateTaskLocal(p.uuid, p.patch);
266
+ return { ok: true };
267
+ case "deleteTask":
268
+ await svc.deleteTaskLocal(p.uuid);
269
+ return { ok: true };
270
+ case "drainStoreSync":
271
+ await svc.drainStoreSync();
272
+ return { ok: true };
273
+ case "recordSpamReport":
274
+ return await svc.recordSpamReport(p.accountId, p.uid, p.folderId);
275
+ case "getOutboxStatus":
276
+ return svc.getOutboxStatus();
277
+ case "listQueuedOutgoing":
278
+ return svc.listQueuedOutgoing();
279
+ case "cancelQueuedOutgoing":
280
+ return svc.cancelQueuedOutgoing(p.path);
281
+ case "reauthenticate":
282
+ return { ok: await svc.reauthenticate(p.accountId) };
283
+ case "reauthGoogleScopes":
284
+ return svc.reauthGoogleScopes();
285
+ // Search & contacts
286
+ case "searchMessages":
287
+ return svc.search(p.query, p.page, p.pageSize, p.scope, p.accountId, p.folderId, !!p.includeTrashSpam);
288
+ case "cancelServerSearch":
289
+ svc.cancelServerSearch();
290
+ return { ok: true };
291
+ case "searchContacts":
292
+ return svc.searchContacts(p.query);
293
+ case "hasCcHistoryTo":
294
+ return { hasCc: svc.hasCcHistoryTo(p.email) };
295
+ case "hasBccHistoryTo":
296
+ return { hasBcc: svc.hasBccHistoryTo(p.email) };
297
+ case "addContact":
298
+ return { ok: svc.addContact(p.name, p.email) };
299
+ case "listContacts":
300
+ return svc.listContacts(p.query || "", p.page || 1, p.pageSize || 100);
301
+ case "upsertContact":
302
+ return svc.upsertContact(p.name, p.email, p.fields);
303
+ case "deleteContact":
304
+ return svc.deleteContact(p.email);
305
+ case "addPreferredContact":
306
+ await svc.addPreferredContact({ name: p.name, email: p.email, source: p.source, organization: p.organization });
307
+ return { ok: true };
308
+ case "addToDenylist":
309
+ await svc.addToDenylist(p.email);
310
+ return { ok: true };
311
+ case "getPriorityLists":
312
+ return svc.getPriorityLists();
313
+ case "setPrioritySender":
314
+ await svc.setPrioritySender(p.email, !!p.value, p.name);
315
+ return { ok: true };
316
+ case "setPriorityDomain":
317
+ await svc.setPriorityDomain(p.domain, !!p.value);
318
+ return { ok: true };
319
+ case "loadContactsConfig":
320
+ return { result: await svc.loadContactsConfig() };
321
+ case "openLocalPath":
322
+ return await svc.openLocalPath(p.which);
323
+ case "openInTextEditor":
324
+ return await svc.openInTextEditor(p.path);
325
+ case "getThreadMessages":
326
+ return svc.getThreadMessages(p.accountId, p.threadId);
327
+ case "readJsoncFile":
328
+ return { content: await svc.readJsoncFile(p.name) };
329
+ case "writeJsoncFile":
330
+ await svc.writeJsoncFile(p.name, p.content);
331
+ return { ok: true };
332
+ case "formatJsonc":
333
+ return { content: await svc.formatJsonc(p.content) };
334
+ case "readConfigHelp":
335
+ return { content: await svc.readConfigHelp(p.name) };
336
+ case "unsubscribeOneClick":
337
+ return await svc.unsubscribeOneClick(p.url);
338
+ case "fetchRemoteImage":
339
+ return await svc.fetchRemoteImage(p.url);
340
+ case "openInWord":
341
+ return await svc.openInWord(p.editId, p.html, String(p.popoutId || ""));
342
+ case "closeWordEdit":
343
+ return await svc.closeWordEdit(p.editId);
344
+ case "showReminderPopup":
345
+ return await svc.showReminderPopup(p);
346
+ case "closeReminderPopup":
347
+ return svc.closeReminderPopup(p.key);
348
+ case "getReminderState":
349
+ return await svc.getReminderState();
350
+ case "mergeReminderState":
351
+ return await svc.mergeReminderState(p.patch);
352
+ case "consumePendingMailto":
353
+ return svc.consumePendingMailto();
354
+ case "consumePendingShare":
355
+ return svc.consumePendingShare?.() ?? null;
356
+ // Client-side tracing — lets webview / iframe code ship events to the
357
+ // Node log so a "compose→send→vanished" report can be diagnosed without
358
+ // opening devtools. Every call shows up as `[client] <tag> <data>` in
359
+ // the main log. Keep it on the top of the switch so it's cheap + first
360
+ // to dispatch.
361
+ // Answer leg of the --debug-server /api/eval round trip (see
362
+ // setDebugEvalSink above).
363
+ case "debugEvalResult":
364
+ debugEvalSink?.(p.id, p.result, p.error);
365
+ return { ok: true };
366
+ case "logClientEvent": {
367
+ // 2026-05-27: bumped truncation from 400 → 2000 chars. The new
368
+ // installConsoleCapture routes console.error and window.error
369
+ // through this same channel, and 400 chars truncated stacks to
370
+ // ~3 frames — too short to diagnose the unhandled rejection that
371
+ // was leaving the message list empty.
372
+ const tag = p.tag || "?";
373
+ // Errors deserve a louder log level than info traces.
374
+ const isErr = tag === "console.error" || tag === "window.error" || tag === "window.unhandledrejection";
375
+ const fn = isErr ? console.error : console.log;
376
+ fn(` [client] ${tag}${p.data ? " " + JSON.stringify(p.data).slice(0, 2000) : ""}`);
377
+ return { ok: true };
378
+ }
379
+ // Settings
380
+ case "getSettings":
381
+ return svc.getSettings();
382
+ case "saveSettingsData":
383
+ await svc.saveSettings(p);
384
+ return { ok: true };
385
+ case "allowRemoteContent":
386
+ // Was missing `await` — the IPC ack fired before saveAllowlist
387
+ // committed, so the immediate getMessage(allowRemote=true) ran
388
+ // against a stale list. Functionally OK because that follow-up
389
+ // call passes allowRemote=true explicitly, but a refresh /
390
+ // background poll could re-block until the write landed.
391
+ await svc.allowRemoteContent(p.type, p.value);
392
+ return { ok: true };
393
+ case "getAllowlist":
394
+ return await svc.getAllowlist();
395
+ case "getUserDict":
396
+ return await svc.getUserDict();
397
+ case "addUserDictWord":
398
+ return await svc.addUserDictWord(p.word);
399
+ case "addUserDictWords":
400
+ return await svc.addUserDictWords(p.words);
401
+ case "removeUserDictWord":
402
+ return await svc.removeUserDictWord(p.word);
403
+ case "flagSenderOrDomain":
404
+ return await svc.flagSenderOrDomain(p.type, p.value);
405
+ case "trustSenderOrDomain":
406
+ return await svc.trustSenderOrDomain(p.type, p.value);
407
+ case "getVersion": {
408
+ try {
409
+ const settings = svc.getSettings();
410
+ const storage = svc.getStorageInfo();
411
+ return { version: appVersion || "dev", theme: settings.ui?.theme || "system", storage, dbWriteDenied: svc.isDbWriteDenied() };
412
+ }
413
+ catch (e) {
414
+ console.error(` [jsonrpc] getVersion error: ${e.message}`);
415
+ return { version: appVersion || "dev", theme: "system", storage: {} };
416
+ }
417
+ }
418
+ // Autocomplete
419
+ case "autocomplete":
420
+ return svc.autocomplete(p);
421
+ case "getAutocompleteSettings":
422
+ return svc.getAutocompleteSettings();
423
+ case "saveAutocompleteSettings":
424
+ svc.saveAutocompleteSettings(p);
425
+ return { ok: true };
426
+ // AI transform (translate / proofread / summarize) — gated by per-feature
427
+ // toggles in autocomplete settings, both default false.
428
+ case "aiTransform":
429
+ return svc.aiTransform(p);
430
+ // Attachments
431
+ case "getAttachment": {
432
+ const att = await svc.getAttachment(p.accountId, p.uid, p.attachmentId, p.folderId);
433
+ // att.content is USUALLY a Buffer, but for some parts (a 7bit/quoted-
434
+ // printable text/calendar invite — `invite.ics`) mailparser hands back
435
+ // a STRING. `someString.toString("base64")` IGNORES the argument and
436
+ // returns the string verbatim, so the client got raw .ics text and
437
+ // atob() threw "string to be decoded is not correctly encoded" (Bob
438
+ // 2026-06-18, "failing to save invite"). Normalise to a Buffer first so
439
+ // the wire payload is always real base64. Buffer.from() handles string
440
+ // (utf8), Uint8Array, and Buffer.
441
+ const buf = Buffer.isBuffer(att.content) ? att.content : Buffer.from(att.content ?? "");
442
+ return { content: buf.toString("base64"), contentType: att.contentType, filename: att.filename };
443
+ }
444
+ case "openAttachment":
445
+ return await svc.openAttachment(p.accountId, p.uid, p.attachmentId, p.folderId, p.filename);
446
+ case "openPendingAttachment":
447
+ return await svc.openPendingAttachment(p.filename, p.mimeType, p.dataBase64);
448
+ case "getMessageSource":
449
+ return await svc.getMessageSource(p.accountId, p.uid, p.folderId);
450
+ case "openExternal":
451
+ return await svc.openExternal(p.url);
452
+ case "popoutWindow":
453
+ return await svc.popoutWindow(p.accountId, p.uid, p.folderId, p.subject);
454
+ case "registerMailto":
455
+ return await svc.registerMailto();
456
+ case "grammarLint":
457
+ return await svc.grammarLint(p.blocks);
458
+ case "deleteAttachments":
459
+ return await svc.deleteAttachments(p.accountId, p.uid, p.folderId, p.ids);
460
+ case "popoutCompose":
461
+ return await svc.popoutCompose(p.init);
462
+ case "consumePopoutComposeInit":
463
+ return svc.consumePopoutComposeInit(p.id);
464
+ case "closeComposePopout":
465
+ return svc.closeComposePopout(p.id);
466
+ case "fetchImageAsDataUri":
467
+ return await svc.fetchImageAsDataUri(p.url);
468
+ case "popoutMainWindow":
469
+ return await svc.popoutMainWindow(p.accountId ? { accountId: p.accountId, folderId: p.folderId, name: p.name } : undefined);
470
+ case "getReminderSound":
471
+ return await svc.getReminderSound();
472
+ // Setup & Repair
473
+ case "setupAccount":
474
+ return svc.setupAccount(p.name, p.email, p.password);
475
+ case "repairAccounts":
476
+ return svc.repairAccounts();
477
+ default:
478
+ throw new Error(`Unknown action: ${action}`);
479
+ }
480
+ }
481
+ //# sourceMappingURL=jsonrpc.js.map
package/jsonrpc.js.map ADDED
@@ -0,0 +1 @@
1
+ {"version":3,"file":"jsonrpc.js","sourceRoot":"","sources":["jsonrpc.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,10 @@
1
+ /**
2
+ * LocalStore — DEPRECATED. The Store moved to `@bobfrankston/mailx-store`
3
+ * (it's now the architectural nexus and lives in the package that owns
4
+ * the underlying DB + .eml file backend). Re-exported here only so any
5
+ * stale `./local-store.js` imports keep resolving while in-tree callers
6
+ * migrate to `import { Store } from "@bobfrankston/mailx-store"`.
7
+ */
8
+ export { Store as LocalStore } from "@bobfrankston/mailx-store";
9
+ export type { StoreMessage as LocalMessage } from "@bobfrankston/mailx-store";
10
+ //# sourceMappingURL=local-store.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"local-store.d.ts","sourceRoot":"","sources":["local-store.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AACH,OAAO,EAAE,KAAK,IAAI,UAAU,EAAE,MAAM,2BAA2B,CAAC;AAChE,YAAY,EAAE,YAAY,IAAI,YAAY,EAAE,MAAM,2BAA2B,CAAC"}
package/local-store.js ADDED
@@ -0,0 +1,9 @@
1
+ /**
2
+ * LocalStore — DEPRECATED. The Store moved to `@bobfrankston/mailx-store`
3
+ * (it's now the architectural nexus and lives in the package that owns
4
+ * the underlying DB + .eml file backend). Re-exported here only so any
5
+ * stale `./local-store.js` imports keep resolving while in-tree callers
6
+ * migrate to `import { Store } from "@bobfrankston/mailx-store"`.
7
+ */
8
+ export { Store as LocalStore } from "@bobfrankston/mailx-store";
9
+ //# sourceMappingURL=local-store.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"local-store.js","sourceRoot":"","sources":["local-store.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AACH,OAAO,EAAE,KAAK,IAAI,UAAU,EAAE,MAAM,2BAA2B,CAAC"}
package/package.json ADDED
@@ -0,0 +1,53 @@
1
+ {
2
+ "name": "@bobfrankston/mailx-service",
3
+ "version": "0.1.47",
4
+ "type": "module",
5
+ "main": "index.js",
6
+ "types": "index.d.ts",
7
+ "scripts": {
8
+ "build": "tsc"
9
+ },
10
+ "license": "ISC",
11
+ "dependencies": {
12
+ "@bobfrankston/mailx-bus": "^0.1.2",
13
+ "@bobfrankston/mailx-imap": "^0.1.193",
14
+ "@bobfrankston/mailx-settings": "^0.1.99",
15
+ "@bobfrankston/mailx-store": "^0.1.130",
16
+ "@bobfrankston/node-tcp-transport": "^0.1.10",
17
+ "@bobfrankston/mailx-types": "^0.1.106",
18
+ "html-to-docx": "^1.8.0",
19
+ "mailparser": "^3.7.2",
20
+ "mammoth": "^1.12.0"
21
+ },
22
+ "repository": {
23
+ "type": "git",
24
+ "url": "https://github.com/BobFrankston/mailx.git"
25
+ },
26
+ "publishConfig": {
27
+ "access": "public"
28
+ },
29
+ ".dependencies": {
30
+ "@bobfrankston/mailx-bus": "file:../mailx-bus",
31
+ "@bobfrankston/mailx-imap": "file:../mailx-imap",
32
+ "@bobfrankston/mailx-settings": "file:../mailx-settings",
33
+ "@bobfrankston/mailx-store": "file:../mailx-store",
34
+ "@bobfrankston/node-tcp-transport": "file:../../../../MailApps/node-tcp-transport",
35
+ "@bobfrankston/mailx-types": "file:../mailx-types",
36
+ "html-to-docx": "^1.8.0",
37
+ "mailparser": "^3.7.2",
38
+ "mammoth": "^1.12.0"
39
+ },
40
+ ".transformedSnapshot": {
41
+ "dependencies": {
42
+ "@bobfrankston/mailx-bus": "^0.1.2",
43
+ "@bobfrankston/mailx-imap": "^0.1.193",
44
+ "@bobfrankston/mailx-settings": "^0.1.99",
45
+ "@bobfrankston/mailx-store": "^0.1.130",
46
+ "@bobfrankston/node-tcp-transport": "^0.1.10",
47
+ "@bobfrankston/mailx-types": "^0.1.106",
48
+ "html-to-docx": "^1.8.0",
49
+ "mailparser": "^3.7.2",
50
+ "mammoth": "^1.12.0"
51
+ }
52
+ }
53
+ }