@bobfrankston/rmfmail 1.2.125 → 1.2.127
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/TODO.md +1 -1
- package/client/app.bundle.js +5 -0
- package/client/app.bundle.js.map +2 -2
- package/client/compose/compose.bundle.js +36 -0
- package/client/compose/compose.bundle.js.map +3 -3
- package/client/compose/compose.js +48 -0
- package/client/compose/compose.js.map +1 -1
- package/client/compose/compose.ts +42 -0
- package/client/lib/api-client.js +6 -0
- package/client/lib/api-client.js.map +1 -1
- package/client/lib/api-client.ts +7 -0
- package/client/lib/mailxapi.js +4 -0
- package/package.json +3 -3
- package/packages/mailx-service/index.d.ts +9 -0
- package/packages/mailx-service/index.d.ts.map +1 -1
- package/packages/mailx-service/index.js +28 -0
- package/packages/mailx-service/index.js.map +1 -1
- package/packages/mailx-service/index.ts +24 -0
- package/packages/mailx-service/jsonrpc.js +2 -0
- package/packages/mailx-service/jsonrpc.js.map +1 -1
- package/packages/mailx-service/jsonrpc.ts +2 -0
- package/packages/mailx-service/sync-queue.d.ts +1 -0
- package/packages/mailx-service/sync-queue.d.ts.map +1 -1
- package/packages/mailx-service/sync-queue.js +20 -0
- package/packages/mailx-service/sync-queue.js.map +1 -1
- package/packages/mailx-service/sync-queue.ts +28 -0
package/TODO.md
CHANGED
|
@@ -254,7 +254,7 @@ Small, self-contained items. Pick them up between higher-priority blocks without
|
|
|
254
254
|
|
|
255
255
|
Alternative source worth evaluating before generalizing: **Hebcal** (`https://www.hebcal.com/`) publishes a more rigorously curated Jewish-only feed (iCal + JSON API), and similar projects exist for other traditions. A `JsonHolidayProvider` interface that abstracts Google vs Hebcal vs ICS-by-URL behind a common shape would let users plug in whatever feed they trust.
|
|
256
256
|
- **Q150 — `discovered` contacts don't belong in the cloud file — split it.** Bob 2026-05-16 hit a 1.5 MB `contacts.jsonc` (11,034 `discovered` rows) and asked about CSV. CSV is the wrong fix (saves ~half the bytes, loses the preferred/denylist/groups structure). Real issue: `discovered` is a *derived cache* — name/email/useCount/lastUsed rebuildable per-device from the message corpus (`seedContactsFromMessages`) — so it shouldn't be in the cloud-synced JSONC at all. Split: cloud `contacts.jsonc` keeps only user-curated data (`preferred`, `denylist`, `groups`) ≈ a few KB; `discovered` lives in the local DB only, rebuilt from each device's mail. Shrinks the cloud file ~700×, kills the 1.5 MB-blob fragility, and matches the "local store is a cache" rule.
|
|
257
|
-
-
|
|
257
|
+
- ~~**Q154 — Prefetch "0 FETCH responses" on new arrivals: verify-then-classify instead of ERROR noise.**~~ **DONE (2026-07-12, v1.2.125).** Zero-response chunks now UID-verify against the server: absent → one info line ("no longer in folder — reconcile owns the rows"); still present → ERROR marked "real fetch failure". Watch the log for the STILL-PRESENT variant — that would be a genuine prefetch bug. [S] Diagnosed 2026-07-12: 60–120×/day, bobma INBOX. Sequence: envelope arrives → server-side filtering (Sieve/screener) moves it to _Spam within seconds → body prefetch FETCHes the now-gone UID in INBOX → 0 responses → logged as ERROR twice; move-detect later rebinds the row (self-healing). Fix: on a 0-response batch, UID SEARCH the missing UIDs — absent from folder = expected-move (log one info line, let reconcile own it); still present = REAL fetch failure (keep the ERROR). Also answers the broader "deleted on server — find out for certain" principle (see v1.2.124 bodyError classifier: deletion is only claimed on positive server evidence). Watch: whether messages that STAY in INBOX ever hit this path — if so that is a real prefetch bug, not noise.
|
|
258
258
|
|
|
259
259
|
- **Q151 — AI config window (natural-language config edits).** Bob 2026-05-16: an AI window that understands the config files so he can say "don't show outlook_…@outlook.com". Feasible — mailx already has AI plumbing (aiTransform, provider+key in autocomplete settings) so it reuses the existing key. Design constraint: the AI must NOT free-form-rewrite a JSONC file (a malformed contacts.jsonc wipes everything — just saw it). It proposes a structured operation (`denylist add <email>`, `preferred add …`), shows a diff, the user confirms, and mailx applies it via the existing typed methods (`addToDenylist`, `addPreferredContact`, …). Worth it for open-ended requests ("stop showing anything from that marketing company", "merge these contacts") — for a single denylist it's overkill vs. a direct affordance (Q149).
|
|
260
260
|
- **Q149 — Visible prefer/ignore affordances.** (1) ✅ **Done v1.1.55** — compose autocomplete rows now have visible per-row ★ (prefer → `contacts.jsonc#preferred[]`) and ⊘ (ignore → `denylist[]`) buttons, shown on hover; plain click, no dependence on the flaky right-click. (2) STILL OPEN — "Never use this address" in the message-viewer From/To/Cc right-click menu (currently Copy / Add to contacts / Reply only). (3) Related: route ★ to a Google-Contacts star instead of `preferred[]` once that's decided (see Q151 discussion).
|
package/client/app.bundle.js
CHANGED
|
@@ -46,6 +46,7 @@ __export(api_client_exports, {
|
|
|
46
46
|
deleteTask: () => deleteTask,
|
|
47
47
|
drainStoreSync: () => drainStoreSync,
|
|
48
48
|
emptyFolder: () => emptyFolder,
|
|
49
|
+
fetchImageAsDataUri: () => fetchImageAsDataUri,
|
|
49
50
|
flagSenderOrDomain: () => flagSenderOrDomain,
|
|
50
51
|
formatJsonc: () => formatJsonc,
|
|
51
52
|
getAccounts: () => getAccounts,
|
|
@@ -648,6 +649,10 @@ function closeComposePopout(id) {
|
|
|
648
649
|
const fn = ipc().closeComposePopout;
|
|
649
650
|
return fn ? fn(id) : Promise.resolve({ ok: false });
|
|
650
651
|
}
|
|
652
|
+
function fetchImageAsDataUri(url) {
|
|
653
|
+
const fn = ipc().fetchImageAsDataUri;
|
|
654
|
+
return fn ? fn(url) : Promise.resolve({ error: "no bridge" });
|
|
655
|
+
}
|
|
651
656
|
async function popoutMainWindow(accountId, folderId, name) {
|
|
652
657
|
const fn = ipc().popoutMainWindow;
|
|
653
658
|
if (!fn)
|