@bobfrankston/mailx-settings 0.1.4 → 0.1.7
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/cloud.d.ts +72 -0
- package/cloud.d.ts.map +1 -0
- package/cloud.js +423 -0
- package/copy-docs.js +31 -0
- package/docs/accounts.md +41 -0
- package/docs/allowlist.md +27 -0
- package/docs/clients.md +24 -0
- package/docs/config.md +32 -0
- package/docs/contact-rules.md +40 -0
- package/docs/contacts.md +48 -0
- package/docs/editor.md +92 -0
- package/docs/preferences.md +43 -0
- package/index.d.ts +109 -10
- package/index.d.ts.map +1 -0
- package/index.js +881 -40
- package/package.json +18 -2
- package/tsconfig.tsbuildinfo +0 -1
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
# contact-rules.jsonc
|
|
2
|
+
|
|
3
|
+
> **Owned by rmfmail. Do not edit this file — your changes will be overwritten the next time the app starts.** This is reference documentation. The actual rules ship with the app and update on every release.
|
|
4
|
+
|
|
5
|
+
## What this file documents
|
|
6
|
+
|
|
7
|
+
`contact-rules.jsonc` defines the **global** junk-contact filter patterns (noreply, mailer-daemon, gateway domains, one-off-shape locals, etc.). It is *NOT* user-editable — it's part of the app, deployed alongside your data so you can see what's being filtered.
|
|
8
|
+
|
|
9
|
+
User-specific filters live in `contacts.jsonc` (`denylist` exact match; `denylistPatterns` regex array — TODO).
|
|
10
|
+
|
|
11
|
+
## Shape
|
|
12
|
+
|
|
13
|
+
```jsonc
|
|
14
|
+
{
|
|
15
|
+
"rulesVersion": "v3-domain-oneoff", // bump when patterns tighten — triggers one-shot purge
|
|
16
|
+
"junk": {
|
|
17
|
+
"localExact": "^(no-?reply|do-?not-?reply|noreply|mailer-daemon|...)$",
|
|
18
|
+
"localSuffix": "(-bounces|\\+bounces|-noreply|-no-reply|...)$",
|
|
19
|
+
"localPrefix": "^(no-?reply|noreply|notifications?|alerts?|bounces?|mailer)[-_+]",
|
|
20
|
+
"localOneoff": "^[0-9a-f]{4,}\\.[0-9a-f]{4,}(\\.[0-9a-z]{6,})?$",
|
|
21
|
+
"domain": "^(txt\\.voice\\.google\\.com|reply\\.facebook\\.com|reply\\.linkedin\\.com)$"
|
|
22
|
+
}
|
|
23
|
+
}
|
|
24
|
+
```
|
|
25
|
+
|
|
26
|
+
## How rules apply
|
|
27
|
+
|
|
28
|
+
Each newly-harvested address is checked against ALL rule patterns; any match drops it. Each rule is a single regex, case-insensitive:
|
|
29
|
+
|
|
30
|
+
- **localExact** — whole-string match against the local part (before `@`).
|
|
31
|
+
- **localSuffix** — local part ends with the pattern.
|
|
32
|
+
- **localPrefix** — local part begins with the pattern + a `-` / `_` / `+` separator. Catches `noreply-<random>` style.
|
|
33
|
+
- **localOneoff** — full-shape match for per-message gateway addresses (Google Voice SMS uses three dot-separated alphanumeric segments).
|
|
34
|
+
- **domain** — whole-string match against the domain (after `@`).
|
|
35
|
+
|
|
36
|
+
## When rules update
|
|
37
|
+
|
|
38
|
+
Each rmfmail release ships an updated `contact-rules.jsonc`. On startup, the app compares the bundled `rulesVersion` to the value stored locally. If they differ, the app sweeps the contacts table once and removes rows the new rules now reject — then records the new version so the sweep doesn't repeat.
|
|
39
|
+
|
|
40
|
+
To add a rule: file an issue, or fork+PR. (Eventually `rules.jsonc` per-user will allow personal additions without forking.)
|
package/docs/contacts.md
ADDED
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
# contacts.jsonc
|
|
2
|
+
|
|
3
|
+
> **Owned by rmfmail. Do not edit this file — your changes will be overwritten the next time the app starts.** This is reference documentation. To change contact data, edit `contacts.jsonc` itself.
|
|
4
|
+
|
|
5
|
+
## What this file documents
|
|
6
|
+
|
|
7
|
+
`contacts.jsonc` is your address book. It's split into three tiers and lives in `My Drive/home/.rmfmail/`.
|
|
8
|
+
|
|
9
|
+
## Shape
|
|
10
|
+
|
|
11
|
+
```jsonc
|
|
12
|
+
{
|
|
13
|
+
"preferred": [
|
|
14
|
+
{ "name": "David Reed", "email": "dpreed@example.com", "organization": "Deep Plum" }
|
|
15
|
+
],
|
|
16
|
+
"denylist": [
|
|
17
|
+
"spammer@example.com"
|
|
18
|
+
],
|
|
19
|
+
"discovered": [
|
|
20
|
+
{ "name": "Bob", "email": "bob@example.com", "useCount": 715, "lastUsed": 1777921829000 }
|
|
21
|
+
]
|
|
22
|
+
}
|
|
23
|
+
```
|
|
24
|
+
|
|
25
|
+
## Tiers
|
|
26
|
+
|
|
27
|
+
- **preferred** — manually-curated, top-ranked in autocomplete. Add people you actually want to reach quickly.
|
|
28
|
+
- **denylist** — addresses (lowercased) excluded from autocomplete entirely.
|
|
29
|
+
- **discovered** — auto-collected from sent/received mail. `useCount` × recency drives autocomplete ranking. Junk patterns (see below) are dropped at insertion.
|
|
30
|
+
|
|
31
|
+
## Global junk filter
|
|
32
|
+
|
|
33
|
+
Addresses matching any of these are dropped at insertion AND swept on startup:
|
|
34
|
+
|
|
35
|
+
- Whole local part: `noreply`, `no-reply`, `do-not-reply`, `mailer-daemon`, `postmaster`, `bounces`, etc.
|
|
36
|
+
- Local-part prefix: `noreply-<random>`, `notifications-<id>`, `alerts-<x>`, `bounces-<x>`, `mailer-<x>`
|
|
37
|
+
- Local-part suffix: `*-bounces`, `*+bounces`, `*-noreply`, `*-notifications`
|
|
38
|
+
- Multi-segment one-off shape: `16179691997.15082868100.nfblcbll1x` (per-message gateway addresses)
|
|
39
|
+
- Domains: `txt.voice.google.com` (Google Voice SMS gateway), `reply.facebook.com`, `reply.linkedin.com`
|
|
40
|
+
|
|
41
|
+
The full pattern set lives in `contact-rules.jsonc` (shipped with the app). Bumping `rulesVersion` in that file triggers a one-shot purge of historical rows the new rules now reject.
|
|
42
|
+
|
|
43
|
+
## Notes
|
|
44
|
+
|
|
45
|
+
- JSONC: `// line comments` and trailing commas are allowed.
|
|
46
|
+
- `useCount` and `lastUsed` are auto-managed; manually editing them only changes ranking briefly until the next sync.
|
|
47
|
+
- Removing a `preferred` entry doesn't add it to `denylist` — it just demotes back to `discovered` (or drops if not seen in mail).
|
|
48
|
+
- Each device contributes its observed addresses to `discovered`. The file accumulates the union across devices.
|
package/docs/editor.md
ADDED
|
@@ -0,0 +1,92 @@
|
|
|
1
|
+
# Compose editor — formatting and shortcuts
|
|
2
|
+
|
|
3
|
+
mailx ships with two rich-text editors: **Quill** (default) and **tiptap**.
|
|
4
|
+
Most things work the same in both. Differences are called out below.
|
|
5
|
+
|
|
6
|
+
Switch editors via **Settings → Editor → Quill | tiptap**.
|
|
7
|
+
|
|
8
|
+
## Universal — works in both editors
|
|
9
|
+
|
|
10
|
+
| Action | Shortcut | Where |
|
|
11
|
+
|---|---|---|
|
|
12
|
+
| **Send** | Ctrl+Enter | toolbar Send button |
|
|
13
|
+
| Bold / Italic / Underline | Ctrl+B / Ctrl+I / Ctrl+U | toolbar B / I / U |
|
|
14
|
+
| Strikethrough | Ctrl+Shift+X | toolbar S |
|
|
15
|
+
| Bulleted list | Ctrl+Shift+8 | toolbar • |
|
|
16
|
+
| Ordered list | Ctrl+Shift+7 | toolbar 1. |
|
|
17
|
+
| Insert / edit link | Ctrl+K | toolbar 🔗 |
|
|
18
|
+
| Remove link | Ctrl+Shift+K | (no toolbar button — use Ctrl+Shift+K) |
|
|
19
|
+
| Blockquote | (Quill: Ctrl+Shift+Q; tiptap: toolbar) | toolbar `“` |
|
|
20
|
+
| Clear formatting | Ctrl+\\ | toolbar ✖ |
|
|
21
|
+
| Heading (H1 / H2 / H3) | (Quill: format dropdown; tiptap: select dropdown) | "Normal / Heading 1 / 2 / 3" |
|
|
22
|
+
| Undo / Redo | Ctrl+Z / Ctrl+Y | (no toolbar button) |
|
|
23
|
+
| Spell-check | (browser native — red underlines) | right-click word |
|
|
24
|
+
| Paste plain text | Ctrl+Shift+V | (browser native) |
|
|
25
|
+
|
|
26
|
+
## Quill-only
|
|
27
|
+
|
|
28
|
+
| Action | Shortcut |
|
|
29
|
+
|---|---|
|
|
30
|
+
| Indent / outdent | Ctrl+] / Ctrl+[ |
|
|
31
|
+
| Color text | Ctrl+Shift+C |
|
|
32
|
+
| Format dropdown | toolbar (left side) |
|
|
33
|
+
| Inline code | toolbar `<>` |
|
|
34
|
+
| Code block | toolbar |
|
|
35
|
+
| Image inserter | (no built-in; use drag-and-drop or paste) |
|
|
36
|
+
|
|
37
|
+
Quill has a more elaborate toolbar with format-specific dropdowns (font,
|
|
38
|
+
size, color). Internally Quill uses its own *Delta* document model — copy/
|
|
39
|
+
paste from Word/Outlook sometimes leaves extra `<p><br></p>` empty
|
|
40
|
+
paragraphs that you'll see in the sent message body.
|
|
41
|
+
|
|
42
|
+
## tiptap-only
|
|
43
|
+
|
|
44
|
+
| Action | Where |
|
|
45
|
+
|---|---|
|
|
46
|
+
| Heading select | left of toolbar |
|
|
47
|
+
| Toggle bold / italic / underline / strike | toolbar B / I / U / S |
|
|
48
|
+
| Blockquote | toolbar `“` |
|
|
49
|
+
| Image (drag-and-drop) | drop a file into the body |
|
|
50
|
+
|
|
51
|
+
tiptap is built on ProseMirror. Output HTML is cleaner than Quill on
|
|
52
|
+
Word/Outlook paste roundtrips. Bundle is smaller. Some Quill toolbar
|
|
53
|
+
features (inline code, indent shortcuts, color picker) aren't wired —
|
|
54
|
+
use the heading select / format menu instead.
|
|
55
|
+
|
|
56
|
+
## Common features (across both)
|
|
57
|
+
|
|
58
|
+
- **Drag-and-drop attachments** — drop files anywhere on the compose
|
|
59
|
+
window to attach. Overlay highlights the drop target while dragging.
|
|
60
|
+
- **Edit in Word / LibreOffice** — toolbar **Edit in Word** button opens
|
|
61
|
+
the body in your default external editor (configurable in
|
|
62
|
+
Settings → External editor). Save in the external editor and the body
|
|
63
|
+
reloads here. Behind the scenes mailx writes a temporary `.docx` file
|
|
64
|
+
(see `~/.rmfmail/external-edit/`) and watches it for changes.
|
|
65
|
+
- **Auto-save drafts** — every 5 seconds (and on input debounce + on
|
|
66
|
+
blur). Drafts land in the Drafts folder via IMAP append.
|
|
67
|
+
- **Address auto-completion** — type a partial name in To/Cc/Bcc; matches
|
|
68
|
+
rank by recency × use-count. Group names from `contacts.jsonc → groups`
|
|
69
|
+
also surface here.
|
|
70
|
+
- **Address-field expansion** — recipient fields are auto-growing
|
|
71
|
+
textareas; long lists wrap to multiple lines.
|
|
72
|
+
- **Group expansion on send** — type a group name (e.g. `family`) in
|
|
73
|
+
To/Cc/Bcc and it expands to the address list at send time.
|
|
74
|
+
- **Ghost-text autocomplete** (off by default) — Settings →
|
|
75
|
+
AI autocomplete → on. Predicts the next words while you type.
|
|
76
|
+
|
|
77
|
+
## When the toolbar doesn't appear
|
|
78
|
+
|
|
79
|
+
The editor loads from a CDN (jsdelivr). If your network can't reach it,
|
|
80
|
+
the toolbar disappears and a plain `contenteditable` fallback takes over.
|
|
81
|
+
Status bar shows the failure. mailx now tries the *other* editor before
|
|
82
|
+
falling all the way back; if both fail you get a plain textarea with no
|
|
83
|
+
shortcuts and no toolbar — sending still works.
|
|
84
|
+
|
|
85
|
+
## See also
|
|
86
|
+
|
|
87
|
+
- `accounts.md`, `contacts.md`, `allowlist.md`, `clients.md`, `config.md`,
|
|
88
|
+
`preferences.md` — config-file references (these live in your GDrive
|
|
89
|
+
`.rmfmail/` folder).
|
|
90
|
+
- This `editor.md` is **app-internal** — it ships with each release and
|
|
91
|
+
documents the editor as it currently exists in the version you're
|
|
92
|
+
running. It is not deployed to your user folder.
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
# preferences.jsonc
|
|
2
|
+
|
|
3
|
+
> **Owned by rmfmail. Do not edit this file — your changes will be overwritten the next time the app starts.** This is reference documentation.
|
|
4
|
+
|
|
5
|
+
## What this file documents
|
|
6
|
+
|
|
7
|
+
`preferences.jsonc` holds your shared UI / sync / autocomplete preferences, synced via `My Drive/home/.rmfmail/`.
|
|
8
|
+
|
|
9
|
+
## Shape
|
|
10
|
+
|
|
11
|
+
```jsonc
|
|
12
|
+
{
|
|
13
|
+
"ui": {
|
|
14
|
+
"theme": "system", // "system" | "light" | "dark"
|
|
15
|
+
"twoLine": false, // two-line message-list rows
|
|
16
|
+
"previewPane": true,
|
|
17
|
+
"previewSnippets": true,
|
|
18
|
+
"threaded": false,
|
|
19
|
+
"flaggedOnly": false,
|
|
20
|
+
"folderCounts": false,
|
|
21
|
+
"calendarSidebar": false,
|
|
22
|
+
"editor": "quill" // "quill" | "tiptap"
|
|
23
|
+
},
|
|
24
|
+
"sync": {
|
|
25
|
+
"intervalMinutes": 5, // full-sync interval (per-folder); IDLE handles INBOX inline
|
|
26
|
+
"historyDays": 30, // how far back to sync (overridable per-machine in config.jsonc)
|
|
27
|
+
"prefetch": true // background-fetch message bodies after metadata sync
|
|
28
|
+
},
|
|
29
|
+
"autocomplete": {
|
|
30
|
+
"enabled": false, // ghost-text completions in compose
|
|
31
|
+
"provider": "ollama", // "ollama" | "claude" | "openai"
|
|
32
|
+
"translateEnabled": false, // AI-powered Translate menu item in viewer
|
|
33
|
+
"proofreadEnabled": false
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
```
|
|
37
|
+
|
|
38
|
+
## Notes
|
|
39
|
+
|
|
40
|
+
- The View menu and Settings menu in the toolbar both write here.
|
|
41
|
+
- `sync.intervalMinutes` controls the full-folder sync cadence. INBOX uses RFC 2177 IDLE (instant push) on Dovecot accounts; Gmail accounts poll every 30s.
|
|
42
|
+
- `sync.historyDays` is a default; override per-machine via `config.jsonc`.
|
|
43
|
+
- AI features are off by default. Enabling `autocomplete.enabled` requires a configured provider (Ollama local, Claude API key, or OpenAI API key).
|
package/index.d.ts
CHANGED
|
@@ -8,19 +8,49 @@
|
|
|
8
8
|
* allowlist.jsonc — remote content allow-list
|
|
9
9
|
*
|
|
10
10
|
* Local overrides (~/.mailx/):
|
|
11
|
-
* config.
|
|
11
|
+
* config.jsonc — pointer to shared dir + local-only settings (storePath, historyDays)
|
|
12
12
|
* accounts.jsonc — cached copy, fallback when shared unavailable
|
|
13
13
|
* preferences.jsonc — local overrides merged on top of shared
|
|
14
14
|
* allowlist.jsonc — cached copy
|
|
15
15
|
*
|
|
16
16
|
* The old settings.jsonc is still supported for backward compatibility.
|
|
17
17
|
*/
|
|
18
|
-
import type { MailxSettings, AccountConfig } from "@bobfrankston/mailx-types";
|
|
18
|
+
import type { MailxSettings, AccountConfig, AutocompleteSettings } from "@bobfrankston/mailx-types";
|
|
19
19
|
declare const LOCAL_DIR: string;
|
|
20
|
+
/** Subscribers notified whenever lastCloudError changes (push to UI immediately). */
|
|
21
|
+
type CloudErrorListener = (error: string | null, context?: {
|
|
22
|
+
op: "read" | "write";
|
|
23
|
+
filename: string;
|
|
24
|
+
}) => void;
|
|
25
|
+
export declare function onCloudError(cb: CloudErrorListener): () => void;
|
|
26
|
+
export declare function getLastCloudError(): string | null;
|
|
20
27
|
declare function getSharedDir(): string;
|
|
28
|
+
/** Read a file via cloud API (when filesystem mount not available) */
|
|
29
|
+
export declare function cloudRead(filename: string): Promise<string | null>;
|
|
30
|
+
/** Write a file via cloud API. Throws on failure with a descriptive error,
|
|
31
|
+
* and updates lastCloudError so UI banners pick it up via getStorageInfo()
|
|
32
|
+
* and the onCloudError listener. */
|
|
33
|
+
export declare function cloudWrite(filename: string, content: string): Promise<void>;
|
|
34
|
+
/** Whether cloud API fallback is active */
|
|
35
|
+
export declare function isCloudMode(): boolean;
|
|
36
|
+
/** Get storage provider info for display */
|
|
37
|
+
export declare function getStorageInfo(): {
|
|
38
|
+
provider: string;
|
|
39
|
+
mode: "mount" | "api" | "local";
|
|
40
|
+
cloudPath?: string;
|
|
41
|
+
folderName?: string;
|
|
42
|
+
folderId?: string;
|
|
43
|
+
configDir?: string;
|
|
44
|
+
cloudError?: string;
|
|
45
|
+
};
|
|
46
|
+
/** Fill in provider defaults for an account based on email domain.
|
|
47
|
+
* Exported so mailx-service's leanAccountsJsonc helper can reuse the same
|
|
48
|
+
* canonicalization rules that loadAccounts uses. */
|
|
49
|
+
export declare function normalizeAccount(acct: any, globalName?: string): AccountConfig;
|
|
21
50
|
declare const DEFAULT_PREFERENCES: {
|
|
22
51
|
ui: {
|
|
23
|
-
theme: "dark" | "light";
|
|
52
|
+
theme: "system" | "dark" | "light";
|
|
53
|
+
editor: "quill" | "tiptap";
|
|
24
54
|
folderWidth: number;
|
|
25
55
|
listViewerSplit: number;
|
|
26
56
|
fontSize: number;
|
|
@@ -28,29 +58,73 @@ declare const DEFAULT_PREFERENCES: {
|
|
|
28
58
|
sync: {
|
|
29
59
|
intervalMinutes: number;
|
|
30
60
|
historyDays: number;
|
|
61
|
+
prefetch: boolean;
|
|
62
|
+
};
|
|
63
|
+
autocomplete: {
|
|
64
|
+
enabled: boolean;
|
|
65
|
+
provider: "ollama";
|
|
66
|
+
ollamaUrl: string;
|
|
67
|
+
ollamaModel: string;
|
|
68
|
+
cloudApiKey: string;
|
|
69
|
+
cloudModel: string;
|
|
70
|
+
debounceMs: number;
|
|
71
|
+
maxTokens: number;
|
|
31
72
|
};
|
|
32
73
|
};
|
|
74
|
+
declare const DEFAULT_AUTOCOMPLETE: AutocompleteSettings;
|
|
33
75
|
declare const DEFAULT_ALLOWLIST: {
|
|
34
76
|
senders: string[];
|
|
35
77
|
domains: string[];
|
|
36
78
|
recipients: string[];
|
|
79
|
+
flaggedSenders: string[];
|
|
80
|
+
flaggedDomains: string[];
|
|
37
81
|
};
|
|
38
82
|
/** Load account configs */
|
|
39
83
|
export declare function loadAccounts(): AccountConfig[];
|
|
84
|
+
/** Load accounts, preferring the cloud copy when cloud is configured.
|
|
85
|
+
* The local file in `~/.rmfmail/` is an offline cache, NOT the source of
|
|
86
|
+
* truth — earlier versions returned the local copy whenever it was non-empty,
|
|
87
|
+
* which left the desktop reading a stale single-account file forever after
|
|
88
|
+
* the GDrive folder lookup got fixed. */
|
|
89
|
+
export declare function loadAccountsAsync(): Promise<AccountConfig[]>;
|
|
90
|
+
/** Strip default-valued fields from a normalized AccountConfig so the
|
|
91
|
+
* serialized JSONC stays compact and human-editable. The previous version
|
|
92
|
+
* was round-tripping every defaulted field (port: 993, tls: true, auth:
|
|
93
|
+
* "password", enabled: true, etc.), which bloated a 10-line accounts.jsonc
|
|
94
|
+
* to 60+ lines and embedded unnecessary "knowledge" about defaults.
|
|
95
|
+
*
|
|
96
|
+
* Rules:
|
|
97
|
+
* - Drop fields that match the provider default (host/port/tls/auth derived
|
|
98
|
+
* from email domain via PROVIDERS).
|
|
99
|
+
* - Drop `enabled: true` (default).
|
|
100
|
+
* - Drop `name` if equal to the file-level `globalName`.
|
|
101
|
+
* - Drop `imap.user` / `smtp.user` if they equal the email.
|
|
102
|
+
* - Drop `sig.html: false` (default; only keep when user enabled HTML sigs).
|
|
103
|
+
* - Keep field order: id → label → email → primary* → imap → smtp → defaultSend
|
|
104
|
+
* → relayDomains → deliveredToPrefix → identityDomains → syncContacts → sig.
|
|
105
|
+
* Curated for readability, not alphabetic. */
|
|
106
|
+
export declare function denormalizeAccount(acct: AccountConfig, globalName?: string): any;
|
|
40
107
|
/** Save account configs */
|
|
41
|
-
|
|
42
|
-
|
|
108
|
+
/** Save accounts — merges with cloud copy by email (multi-client safe).
|
|
109
|
+
* Writes the lean form via denormalizeAccount so accounts.jsonc stays
|
|
110
|
+
* compact and human-editable. */
|
|
111
|
+
export declare function saveAccounts(accounts: AccountConfig[]): Promise<void>;
|
|
112
|
+
/** Load preferences (shared + local overrides, with legacy fallback) */
|
|
43
113
|
export declare function loadPreferences(): typeof DEFAULT_PREFERENCES;
|
|
44
114
|
/** Save preferences */
|
|
45
|
-
export declare function savePreferences(prefs:
|
|
115
|
+
export declare function savePreferences(prefs: any): void;
|
|
116
|
+
/** Load autocomplete settings */
|
|
117
|
+
export declare function loadAutocomplete(): AutocompleteSettings;
|
|
118
|
+
/** Save autocomplete settings */
|
|
119
|
+
export declare function saveAutocomplete(settings: AutocompleteSettings): void;
|
|
46
120
|
/** Load remote content allow-list */
|
|
47
121
|
export declare function loadAllowlist(): typeof DEFAULT_ALLOWLIST;
|
|
48
|
-
/** Save allow-list */
|
|
49
|
-
export declare function saveAllowlist(list: typeof DEFAULT_ALLOWLIST): void
|
|
122
|
+
/** Save allow-list — merges with existing cloud copy (multi-client safe) */
|
|
123
|
+
export declare function saveAllowlist(list: typeof DEFAULT_ALLOWLIST): Promise<void>;
|
|
50
124
|
/** Load settings — unified view combining all files (backward compatible) */
|
|
51
125
|
export declare function loadSettings(): MailxSettings;
|
|
52
126
|
/** Save settings — writes to split files */
|
|
53
|
-
export declare function saveSettings(settings: MailxSettings): void
|
|
127
|
+
export declare function saveSettings(settings: MailxSettings): Promise<void>;
|
|
54
128
|
/** Get the local store base path */
|
|
55
129
|
export declare function getStorePath(): string;
|
|
56
130
|
/** Get the local data directory (DB, store, etc.) */
|
|
@@ -59,6 +133,31 @@ export declare function getConfigDir(): string;
|
|
|
59
133
|
export { getSharedDir };
|
|
60
134
|
/** Initialize local config if it doesn't exist */
|
|
61
135
|
export declare function initLocalConfig(sharedDir?: string, storePath?: string): void;
|
|
136
|
+
/** Initialize config with Google Drive cloud storage.
|
|
137
|
+
* Finds or creates the app-owned ".rmfmail" folder via Drive API and stores its ID.
|
|
138
|
+
* No mount scanning — API only. Existing settings at other paths (e.g., home/.rmfmail
|
|
139
|
+
* from Desktop sync) must be migrated manually or via config.jsonc importPath. */
|
|
140
|
+
export declare function initCloudConfig(provider?: "gdrive"): Promise<void>;
|
|
62
141
|
declare const DEFAULT_SETTINGS: MailxSettings;
|
|
63
|
-
|
|
142
|
+
/** Get historyDays for an account: per-account override > system override > shared default */
|
|
143
|
+
export declare function getHistoryDays(accountId?: string): number;
|
|
144
|
+
/** Get prefetch setting: download bodies during sync (default true) */
|
|
145
|
+
export declare function getPrefetch(): boolean;
|
|
146
|
+
export { DEFAULT_SETTINGS, DEFAULT_ALLOWLIST, DEFAULT_PREFERENCES, DEFAULT_AUTOCOMPLETE, LOCAL_DIR };
|
|
147
|
+
/** Deploy the app-owned `.md` reference docs to the shared cloud folder so
|
|
148
|
+
* users can read them next to the `.jsonc` files they document. The .md
|
|
149
|
+
* files live in the app bundle (`<workspace>/app/docs/` in dev, or
|
|
150
|
+
* `<package>/docs/` in published builds) and are overwritten on every
|
|
151
|
+
* release — the file header documents that fact, so users know not to
|
|
152
|
+
* edit them.
|
|
153
|
+
*
|
|
154
|
+
* Skip-path: a manifest file `.docs-version` on the cloud records the
|
|
155
|
+
* app version that last deployed. We re-deploy only when the running
|
|
156
|
+
* app's version differs, so startup doesn't pound Drive on every launch.
|
|
157
|
+
*
|
|
158
|
+
* This function is fire-and-forget at the call site; failures are logged
|
|
159
|
+
* but never throw. The `.md` files are reference material, not load-
|
|
160
|
+
* bearing — the app works without them.
|
|
161
|
+
*/
|
|
162
|
+
export declare function deployDocs(appVersion: string): Promise<void>;
|
|
64
163
|
//# sourceMappingURL=index.d.ts.map
|
package/index.d.ts.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["index.ts"],"names":[],"mappings":"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"}
|