@bobfrankston/rmfmail 1.1.203 → 1.1.205

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.
@@ -81,6 +81,31 @@ export async function createTinyMceEditor(container, opts = {}) {
81
81
  target.id = `rmf-tiny-${Math.random().toString(36).slice(2, 10)}`;
82
82
  target.style.cssText = "width:100%;height:100%;";
83
83
  container.appendChild(target);
84
+ // Code-block languages — shared by the stock codesample dialog
85
+ // (codesample_languages) AND our custom "Insert code" dialog below, so a
86
+ // language added here shows up in both. "Text" first = default (no
87
+ // highlighting, which would mangle plain pasted snippets — Bob 2026-05-24).
88
+ // PowerShell added 2026-05-31 (Bob: ".ps1 is another file type").
89
+ const CODE_LANGS = [
90
+ { text: "Text", value: "text" },
91
+ { text: "HTML/XML", value: "markup" },
92
+ { text: "JavaScript", value: "javascript" },
93
+ { text: "TypeScript", value: "typescript" },
94
+ { text: "CSS", value: "css" },
95
+ { text: "JSON", value: "json" },
96
+ { text: "Python", value: "python" },
97
+ { text: "Java", value: "java" },
98
+ { text: "C", value: "c" },
99
+ { text: "C++", value: "cpp" },
100
+ { text: "C#", value: "csharp" },
101
+ { text: "Go", value: "go" },
102
+ { text: "Rust", value: "rust" },
103
+ { text: "Ruby", value: "ruby" },
104
+ { text: "PHP", value: "php" },
105
+ { text: "Shell", value: "bash" },
106
+ { text: "PowerShell", value: "powershell" },
107
+ { text: "SQL", value: "sql" },
108
+ ];
84
109
  const editor = await new Promise((resolve) => {
85
110
  tinymce.init({
86
111
  target,
@@ -93,7 +118,7 @@ export async function createTinyMceEditor(container, opts = {}) {
93
118
  plugins: "paste lists advlist link table code codesample image searchreplace autolink wordcount emoticons charmap insertdatetime quickbars nonbreaking directionality help",
94
119
  toolbar: [
95
120
  "undo redo | bold italic underline strikethrough | forecolor backcolor",
96
- "bullist numlist outdent indent | link table image code codesample | emoticons charmap | help",
121
+ "bullist numlist outdent indent | link table image code rmfcode | emoticons charmap | help",
97
122
  ].join(" | "),
98
123
  // Include "tools" so wordcount and searchreplace are reachable.
99
124
  menubar: "file edit view insert format tools",
@@ -120,25 +145,7 @@ export async function createTinyMceEditor(container, opts = {}) {
120
145
  // which mangles unrelated paste content (Bob 2026-05-24).
121
146
  // Adding Text first so it's the default; rest are the modern
122
147
  // languages we actually paste.
123
- codesample_languages: [
124
- { text: "Text", value: "text" },
125
- { text: "HTML/XML", value: "markup" },
126
- { text: "JavaScript", value: "javascript" },
127
- { text: "TypeScript", value: "typescript" },
128
- { text: "CSS", value: "css" },
129
- { text: "JSON", value: "json" },
130
- { text: "Python", value: "python" },
131
- { text: "Java", value: "java" },
132
- { text: "C", value: "c" },
133
- { text: "C++", value: "cpp" },
134
- { text: "C#", value: "csharp" },
135
- { text: "Go", value: "go" },
136
- { text: "Rust", value: "rust" },
137
- { text: "Ruby", value: "ruby" },
138
- { text: "PHP", value: "php" },
139
- { text: "Shell", value: "bash" },
140
- { text: "SQL", value: "sql" },
141
- ],
148
+ codesample_languages: CODE_LANGS,
142
149
  // WebView's native spell-check (red underlines, right-click
143
150
  // "Add to dictionary"). Free; same UX as Quill's spellcheck=true.
144
151
  // Premium tinymcespellchecker plugin would replace this with a
@@ -156,6 +163,17 @@ export async function createTinyMceEditor(container, opts = {}) {
156
163
  statusbar: false,
157
164
  branding: false,
158
165
  license_key: "gpl",
166
+ // Keep URLs verbatim. TinyMCE defaults to convert_urls:true +
167
+ // relative_urls:true, which rewrites an absolute href
168
+ // (https://github.com/…) to be RELATIVE to the editor's base URL
169
+ // (the msger custom-protocol page). A link that worked in the
170
+ // original message arrives in the reply quote rewritten/dead
171
+ // (Bob 2026-05-31: "URL works in the original but not in the
172
+ // reply"). false on both = hrefs travel into the sent message
173
+ // exactly as the sender wrote them.
174
+ convert_urls: false,
175
+ relative_urls: false,
176
+ remove_script_host: false,
159
177
  paste_data_images: true,
160
178
  // Permissive valid_elements — preserve as much of the source
161
179
  // formatting as possible. The default is more aggressive about
@@ -250,6 +268,67 @@ export async function createTinyMceEditor(container, opts = {}) {
250
268
  applyZoom();
251
269
  saveZoom();
252
270
  };
271
+ // Custom "Insert code" — wraps the stock codesample plugin
272
+ // (keeps its Prism highlighting + edit-in-place) but adds a
273
+ // "Box it in" border checkbox so a snippet is visually
274
+ // demarcated from surrounding prose. The border is applied as
275
+ // an INLINE style on the <pre>, NOT a content_style class, so
276
+ // it survives into the sent email where the recipient has none
277
+ // of our editor CSS. Bob 2026-05-31.
278
+ const BORDER_STYLES = { "border": "1px solid #888", "border-radius": "4px", "padding": "10px" };
279
+ const openCodeDialog = () => {
280
+ const cs = ed.plugins.codesample;
281
+ const preEl = ed.dom.getParent(ed.selection.getNode(), "pre");
282
+ let curLang = "text";
283
+ let curBorder = false;
284
+ if (preEl) {
285
+ const m = (preEl.className || "").match(/language-([\w-]+)/);
286
+ if (m)
287
+ curLang = m[1];
288
+ curBorder = !!(preEl.style && preEl.style.border && preEl.style.border !== "none");
289
+ }
290
+ const curCode = (cs && cs.getCurrentCode) ? (cs.getCurrentCode(ed) || "") : "";
291
+ ed.windowManager.open({
292
+ title: "Insert code",
293
+ size: "large",
294
+ body: {
295
+ type: "panel",
296
+ items: [
297
+ { type: "listbox", name: "language", label: "Language", items: CODE_LANGS },
298
+ { type: "textarea", name: "code", label: "Code" },
299
+ { type: "checkbox", name: "border", label: "Box it in (border around the code)" },
300
+ ],
301
+ },
302
+ initialData: { language: curLang, code: curCode, border: curBorder },
303
+ buttons: [
304
+ { type: "cancel", text: "Cancel" },
305
+ { type: "submit", text: "Save", primary: true },
306
+ ],
307
+ onSubmit: (api) => {
308
+ const data = api.getData();
309
+ if (cs && cs.insertCodeSample)
310
+ cs.insertCodeSample(data.language, data.code);
311
+ const pre = ed.dom.getParent(ed.selection.getNode(), "pre");
312
+ if (pre) {
313
+ if (data.border)
314
+ ed.dom.setStyles(pre, BORDER_STYLES);
315
+ else
316
+ ed.dom.setStyles(pre, { "border": "", "border-radius": "", "padding": "" });
317
+ }
318
+ api.close();
319
+ },
320
+ });
321
+ };
322
+ ed.ui.registry.addButton("rmfcode", {
323
+ icon: "code-sample",
324
+ tooltip: "Insert/edit code block",
325
+ onAction: openCodeDialog,
326
+ });
327
+ ed.ui.registry.addMenuItem("rmfcode", {
328
+ icon: "code-sample",
329
+ text: "Code block…",
330
+ onAction: openCodeDialog,
331
+ });
253
332
  ed.ui.registry.addMenuItem("zoomIn", {
254
333
  text: "Zoom in", shortcut: "Ctrl+=",
255
334
  onAction: () => bumpZoom(ZOOM_STEP),
@@ -326,11 +405,28 @@ export async function createTinyMceEditor(container, opts = {}) {
326
405
  }
327
406
  if (tail.toString().length > 0)
328
407
  return;
329
- const after = doc.createRange();
330
- after.setStartAfter(link);
331
- after.collapse(true);
332
- sel.removeAllRanges();
333
- sel.addRange(after);
408
+ // Move the caret to just after the link. Use TinyMCE's
409
+ // own selection API rather than a raw
410
+ // removeAllRanges/addRange: the raw mutation ran ahead
411
+ // of TinyMCE's beforeinput handling and desynced its
412
+ // UndoManager, leaving Ctrl+Z erratic (Bob 2026-05-31:
413
+ // "^z is very broken in TinyMCE"). Going through
414
+ // ed.selection keeps TinyMCE's selection + undo state
415
+ // consistent. Raw range as a fallback if it throws.
416
+ const parent = link.parentNode;
417
+ const idx = parent ? Array.prototype.indexOf.call(parent.childNodes, link) + 1 : -1;
418
+ if (parent && idx >= 0) {
419
+ try {
420
+ ed.selection.setCursorLocation(parent, idx);
421
+ }
422
+ catch {
423
+ const after = doc.createRange();
424
+ after.setStartAfter(link);
425
+ after.collapse(true);
426
+ sel.removeAllRanges();
427
+ sel.addRange(after);
428
+ }
429
+ }
334
430
  }, true);
335
431
  };
336
432
  ed.on("init", installLinkEscape);
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@bobfrankston/rmfmail",
3
- "version": "1.1.203",
3
+ "version": "1.1.205",
4
4
  "description": "Local-first email client with IMAP sync and standalone native app",
5
5
  "type": "module",
6
6
  "main": "bin/mailx.js",
@@ -45,7 +45,7 @@
45
45
  "@bobfrankston/msger": "^0.1.384",
46
46
  "@bobfrankston/node-tcp-transport": "^0.1.8",
47
47
  "@bobfrankston/oauthsupport": "^1.0.31",
48
- "@bobfrankston/rmf-tiny": "^0.1.26",
48
+ "@bobfrankston/rmf-tiny": "^0.1.27",
49
49
  "@bobfrankston/smtp-direct": "^0.1.8",
50
50
  "@bobfrankston/tcp-transport": "^0.1.6",
51
51
  "@capacitor/android": "^8.3.0",
@@ -125,7 +125,7 @@
125
125
  "@bobfrankston/msger": "^0.1.384",
126
126
  "@bobfrankston/node-tcp-transport": "^0.1.8",
127
127
  "@bobfrankston/oauthsupport": "^1.0.31",
128
- "@bobfrankston/rmf-tiny": "^0.1.26",
128
+ "@bobfrankston/rmf-tiny": "^0.1.27",
129
129
  "@bobfrankston/smtp-direct": "^0.1.8",
130
130
  "@bobfrankston/tcp-transport": "^0.1.6",
131
131
  "@capacitor/android": "^8.3.0",
@@ -479,6 +479,28 @@ export declare class ImapManager extends EventEmitter {
479
479
  * sending/queued/ on every send — that write is gone now, so scanning the
480
480
  * directory is safe again. Any legitimate files that land there (crash
481
481
  * recovery, manual drop) will get sent. */
482
+ /** Recover stale `.sending-<host>-<pid>` claims for an account back to
483
+ * plain `.ltr` so the next tick can retry. A claim is stale if:
484
+ * (a) the PID is dead — original owner crashed/was replaced mid-send;
485
+ * (b) the PID is alive but it's not us and the file mtime is older than
486
+ * STALE_CLAIM_MS — `process.kill(pid,0)` only proves *some* process
487
+ * owns that PID, not our long-dead daemon (OS recycles PIDs); the
488
+ * age guard stops an unrelated Node (statusline/msger/npm) inheriting
489
+ * a recycled PID from pinning the claim forever (Bob's 7-hour stuck
490
+ * `.sending-rmf39-63196`);
491
+ * (c) it's our PID — never sweep our own live claim.
492
+ * Foreign hosts are left alone (we can't probe their PIDs); cross-host
493
+ * recovery is the IMAP-folder sweeper's job.
494
+ *
495
+ * CRITICAL: this is a local filesystem op with NO network I/O, so it MUST
496
+ * run independently of send-backoff. It used to live inside
497
+ * processLocalQueue, which the outbox worker SKIPS when an account is in
498
+ * backoff — so a persistently-erroring account (e.g. Dovecot "Not
499
+ * connected" storms) never recovered its claims, leaving a message stuck
500
+ * "sending…" forever while healthy accounts drained. Bob 2026-05-31:
501
+ * "stuck while others are getting sent." Now called every tick for every
502
+ * account before the backoff gate. */
503
+ private recoverStaleClaims;
482
504
  private processLocalQueue;
483
505
  /** Send a raw RFC 2822 message via SMTP for a given account.
484
506
  * Uses @bobfrankston/smtp-direct with the same TransportFactory as IMAP —
@@ -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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"}
@@ -4089,34 +4089,35 @@ export class ImapManager extends EventEmitter {
4089
4089
  * sending/queued/ on every send — that write is gone now, so scanning the
4090
4090
  * directory is safe again. Any legitimate files that land there (crash
4091
4091
  * recovery, manual drop) will get sent. */
4092
- async processLocalQueue(accountId) {
4093
- const outboxDir = path.join(getConfigDir(), "outbox", accountId);
4094
- const queuedDir = path.join(getConfigDir(), "sending", accountId, "queued");
4095
- // Recovery sweep: any *.sending-<host>-<pid> on THIS host whose PID is
4096
- // dead (process crashed mid-send) gets unclaimed so the next tick can
4097
- // retry. Foreign hosts are left alone we have no way to know if their
4098
- // process is alive. Cross-host stale recovery is the IMAP-folder path's
4099
- // job (sweeper looks at server-side claim flags, not local files).
4100
- // Stale-claim recovery. A claim is "stale" if any of:
4101
- // (a) the PID is dead original owner crashed mid-send
4102
- // (b) the PID is alive BUT it's not us, and the file mtime is
4103
- // older than STALE_CLAIM_MS — the OS recycled the PID for
4104
- // some other process. `process.kill(pid, 0)` returning success
4105
- // only proves *some* process owns that PID, not that it's
4106
- // our long-dead mailx daemon. Without the age guard, a
4107
- // claim survives forever as soon as any other Node process
4108
- // (statusline, msger, npm) gets the recycled PID. Bob saw
4109
- // this exact case: `.sending-rmf39-63196` sat in the queue
4110
- // for 7+ hours because PID 63196 was now an unrelated Node.
4111
- // (c) it's our PID never sweep our own claim.
4112
- // 5 minutes: SMTP transactions complete in seconds; 5m of
4113
- // claim with no progress means the worker is wedged or PID
4114
- // got recycled. Earlier 1h was a band-aid that left Bob's
4115
- // outbox stuck for hours when an SMTP wedge crashed the
4116
- // worker mid-flight.
4092
+ /** Recover stale `.sending-<host>-<pid>` claims for an account back to
4093
+ * plain `.ltr` so the next tick can retry. A claim is stale if:
4094
+ * (a) the PID is dead original owner crashed/was replaced mid-send;
4095
+ * (b) the PID is alive but it's not us and the file mtime is older than
4096
+ * STALE_CLAIM_MS `process.kill(pid,0)` only proves *some* process
4097
+ * owns that PID, not our long-dead daemon (OS recycles PIDs); the
4098
+ * age guard stops an unrelated Node (statusline/msger/npm) inheriting
4099
+ * a recycled PID from pinning the claim forever (Bob's 7-hour stuck
4100
+ * `.sending-rmf39-63196`);
4101
+ * (c) it's our PID never sweep our own live claim.
4102
+ * Foreign hosts are left alone (we can't probe their PIDs); cross-host
4103
+ * recovery is the IMAP-folder sweeper's job.
4104
+ *
4105
+ * CRITICAL: this is a local filesystem op with NO network I/O, so it MUST
4106
+ * run independently of send-backoff. It used to live inside
4107
+ * processLocalQueue, which the outbox worker SKIPS when an account is in
4108
+ * backoff so a persistently-erroring account (e.g. Dovecot "Not
4109
+ * connected" storms) never recovered its claims, leaving a message stuck
4110
+ * "sending…" forever while healthy accounts drained. Bob 2026-05-31:
4111
+ * "stuck while others are getting sent." Now called every tick for every
4112
+ * account before the backoff gate. */
4113
+ recoverStaleClaims(accountId) {
4117
4114
  const STALE_CLAIM_MS = 5 * 60_000;
4118
4115
  const myPid = process.pid;
4119
- for (const dir of [outboxDir, queuedDir]) {
4116
+ const dirs = [
4117
+ path.join(getConfigDir(), "outbox", accountId),
4118
+ path.join(getConfigDir(), "sending", accountId, "queued"),
4119
+ ];
4120
+ for (const dir of dirs) {
4120
4121
  if (!fs.existsSync(dir))
4121
4122
  continue;
4122
4123
  for (const f of fs.readdirSync(dir)) {
@@ -4140,9 +4141,8 @@ export class ImapManager extends EventEmitter {
4140
4141
  ageMs = Date.now() - fs.statSync(path.join(dir, f)).mtimeMs;
4141
4142
  }
4142
4143
  catch { /* */ }
4143
- // Live PID + recent mtime → assume genuine sibling owner.
4144
- // Live PID + ancient mtime → PID got recycled, sweep it.
4145
- // Dead PID → sweep regardless of age.
4144
+ // Live PID + recent mtime → genuine sibling owner, leave it.
4145
+ // Live PID + ancient mtime → recycled PID, sweep. Dead PID → sweep.
4146
4146
  if (alive && ageMs < STALE_CLAIM_MS)
4147
4147
  continue;
4148
4148
  try {
@@ -4153,6 +4153,14 @@ export class ImapManager extends EventEmitter {
4153
4153
  catch { /* ignore */ }
4154
4154
  }
4155
4155
  }
4156
+ }
4157
+ async processLocalQueue(accountId) {
4158
+ const outboxDir = path.join(getConfigDir(), "outbox", accountId);
4159
+ const queuedDir = path.join(getConfigDir(), "sending", accountId, "queued");
4160
+ // Recovery also runs unconditionally in the worker tick (before the
4161
+ // backoff gate); keep it here too for the direct-call path from
4162
+ // queueOutgoing. Idempotent — a no-op when nothing is stale.
4163
+ this.recoverStaleClaims(accountId);
4156
4164
  const filesToSend = [];
4157
4165
  for (const dir of [outboxDir, queuedDir]) {
4158
4166
  if (!fs.existsSync(dir))
@@ -4634,7 +4642,14 @@ export class ImapManager extends EventEmitter {
4634
4642
  // per-account sweep picks them up below.
4635
4643
  this.routeGeneralOutbox();
4636
4644
  for (const [accountId] of this.configs) {
4637
- // Skip accounts in backoff
4645
+ // Recover stale claims FIRST, unconditionally — it's a local
4646
+ // FS op with no network, so it must not be gated by send
4647
+ // backoff. Otherwise an account stuck in backoff (Dovecot "Not
4648
+ // connected" storms) never unclaims an orphaned .sending- file,
4649
+ // and a message sits "sending…" forever while other accounts
4650
+ // drain (Bob 2026-05-31).
4651
+ this.recoverStaleClaims(accountId);
4652
+ // Skip the SEND for accounts in backoff (network ops only).
4638
4653
  const retryAfter = this.outboxBackoff.get(accountId) || 0;
4639
4654
  if (now < retryAfter)
4640
4655
  continue;