@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.
- package/ai-usage.d.ts +32 -0
- package/ai-usage.d.ts.map +1 -0
- package/ai-usage.js +98 -0
- package/ai-usage.js.map +1 -0
- package/charset.d.ts +15 -0
- package/charset.d.ts.map +1 -0
- package/charset.js +61 -0
- package/charset.js.map +1 -0
- package/db-worker-client.d.ts +32 -0
- package/db-worker-client.d.ts.map +1 -0
- package/db-worker-client.js +66 -0
- package/db-worker-client.js.map +1 -0
- package/db-worker.d.ts +39 -0
- package/db-worker.d.ts.map +1 -0
- package/db-worker.js +115 -0
- package/db-worker.js.map +1 -0
- package/google-sync.d.ts +151 -0
- package/google-sync.d.ts.map +1 -0
- package/google-sync.js +259 -0
- package/google-sync.js.map +1 -0
- package/html-to-docx.d.ts +1 -0
- package/index.d.ts +1102 -0
- package/index.d.ts.map +1 -0
- package/index.js +5476 -0
- package/index.js.map +1 -0
- package/jsonrpc.d.ts +29 -0
- package/jsonrpc.d.ts.map +1 -0
- package/jsonrpc.js +481 -0
- package/jsonrpc.js.map +1 -0
- package/local-store.d.ts +10 -0
- package/local-store.d.ts.map +1 -0
- package/local-store.js +9 -0
- package/local-store.js.map +1 -0
- package/package.json +53 -0
- package/reconciler.d.ts +90 -0
- package/reconciler.d.ts.map +1 -0
- package/reconciler.js +277 -0
- package/reconciler.js.map +1 -0
- package/sync-queue.d.ts +127 -0
- package/sync-queue.d.ts.map +1 -0
- package/sync-queue.js +271 -0
- package/sync-queue.js.map +1 -0
- package/sync-worker-client.d.ts +33 -0
- package/sync-worker-client.d.ts.map +1 -0
- package/sync-worker-client.js +89 -0
- package/sync-worker-client.js.map +1 -0
- package/sync-worker.d.ts +33 -0
- package/sync-worker.d.ts.map +1 -0
- package/sync-worker.js +143 -0
- package/sync-worker.js.map +1 -0
- package/word-html.d.ts +41 -0
- package/word-html.d.ts.map +1 -0
- package/word-html.js +122 -0
- 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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"}
|
package/local-store.d.ts
ADDED
|
@@ -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
|
+
}
|