@bobfrankston/rmfmail 1.0.548 → 1.0.550
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/client/app.js +7 -4
- package/client/app.js.map +1 -1
- package/client/app.ts +10 -7
- package/client/compose/compose.js +2 -2
- package/client/compose/compose.js.map +1 -1
- package/client/compose/compose.ts +2 -2
- package/package.json +3 -3
- package/packages/mailx-imap/index.d.ts +9 -1
- package/packages/mailx-imap/index.d.ts.map +1 -1
- package/packages/mailx-imap/index.js +92 -51
- package/packages/mailx-imap/index.js.map +1 -1
- package/packages/mailx-imap/index.ts +83 -55
- package/packages/mailx-imap/package-lock.json +2 -2
- package/packages/mailx-imap/package.json +1 -1
- package/packages/mailx-service/local-store.d.ts.map +1 -1
- package/packages/mailx-service/local-store.js +5 -1
- package/packages/mailx-service/local-store.js.map +1 -1
- package/packages/mailx-service/local-store.ts +5 -1
- package/packages/mailx-service/reconciler.d.ts +28 -0
- package/packages/mailx-service/reconciler.d.ts.map +1 -1
- package/packages/mailx-service/reconciler.js +70 -2
- package/packages/mailx-service/reconciler.js.map +1 -1
- package/packages/mailx-service/reconciler.ts +81 -2
- package/packages/mailx-settings/docs/contacts.md +6 -1
- package/packages/mailx-settings/docs/search.md +99 -0
- package/packages/mailx-settings/package.json +1 -1
- package/packages/mailx-store/file-store.d.ts +6 -0
- package/packages/mailx-store/file-store.d.ts.map +1 -1
- package/packages/mailx-store/file-store.js +8 -0
- package/packages/mailx-store/file-store.js.map +1 -1
- package/packages/mailx-store/file-store.ts +9 -0
- package/packages/mailx-store/package.json +1 -1
|
@@ -0,0 +1,99 @@
|
|
|
1
|
+
# Search
|
|
2
|
+
|
|
3
|
+
> **Owned by rmfmail. Do not edit this file** — it's reference documentation.
|
|
4
|
+
|
|
5
|
+
Search in rmfmail runs in one of three modes depending on what you've selected:
|
|
6
|
+
|
|
7
|
+
- **All folders** (default) — searches your **local cache** using SQLite FTS5
|
|
8
|
+
- **This folder** — instant client-side filter on visible rows; full FTS5 search on Enter
|
|
9
|
+
- **Server** (the "Server" checkbox) — sends the query to the mail server (IMAP SEARCH on bobma-style accounts; **not yet wired to Gmail API for Gmail accounts** — see "Limitations" below)
|
|
10
|
+
|
|
11
|
+
The mode you're in dictates which query operators work. Scope matters.
|
|
12
|
+
|
|
13
|
+
## Common shortcuts (work in every mode)
|
|
14
|
+
|
|
15
|
+
These are parsed by mailx before dispatch, so they apply to all three scopes:
|
|
16
|
+
|
|
17
|
+
| Form | Effect |
|
|
18
|
+
|---|---|
|
|
19
|
+
| `from:bob` | Match sender substring |
|
|
20
|
+
| `to:eleanor` | Match recipient substring |
|
|
21
|
+
| `subject:lunch` | Match subject substring (everything until the next `keyword:` or end) |
|
|
22
|
+
| `/regex/` | Client-side regex over the currently-visible rows. Local only — never sent to the server. |
|
|
23
|
+
|
|
24
|
+
The remaining (unqualified) text becomes the **body** search term in the server query, or a free-text FTS5 phrase in local mode.
|
|
25
|
+
|
|
26
|
+
## Mode 1: Local search (FTS5) — default
|
|
27
|
+
|
|
28
|
+
Uses SQLite's FTS5 full-text index built from envelopes + locally-cached bodies. Fast, indexed, ~1ms per query.
|
|
29
|
+
|
|
30
|
+
Supported FTS5 syntax (when the search box has more than one word and no scope checkbox):
|
|
31
|
+
|
|
32
|
+
| Operator | Example | Meaning |
|
|
33
|
+
|---|---|---|
|
|
34
|
+
| `term1 term2` | `bob lunch` | both must appear (implicit AND) |
|
|
35
|
+
| `term1 OR term2` | `bob OR eleanor` | either |
|
|
36
|
+
| `term1 NOT term2` | `bob NOT spam` | first without the second |
|
|
37
|
+
| `"phrase"` | `"happy birthday"` | exact phrase |
|
|
38
|
+
| `term*` | `lunch*` | prefix |
|
|
39
|
+
| `^col:term` | `^subject:budget` | restrict to one indexed column (subject, body, from, to) |
|
|
40
|
+
| `NEAR(a b, 5)` | `NEAR(bob lunch, 5)` | both within 5 tokens of each other |
|
|
41
|
+
|
|
42
|
+
**Case**: FTS5 is **case-insensitive**. `AND`/`OR`/`NOT` work in any case (`and`, `OR`, `Not` are equivalent).
|
|
43
|
+
|
|
44
|
+
What's actually indexed: subject, from, to, cc, snippet (first ~200 chars of body), and the full body text *if* the body has been downloaded locally (the blue dot in the list). Bodies that haven't been prefetched aren't searchable until they are.
|
|
45
|
+
|
|
46
|
+
## Mode 2: This-folder filter
|
|
47
|
+
|
|
48
|
+
When the scope dropdown is set to "This folder" and you type, mailx **client-side filters the currently rendered rows** instantly — no server hit, no FTS5. Just substring match across each visible row's text.
|
|
49
|
+
|
|
50
|
+
Press **Enter** to escalate to a full FTS5 search of the folder.
|
|
51
|
+
|
|
52
|
+
`/regex/` works here for fast on-screen filtering.
|
|
53
|
+
|
|
54
|
+
## Mode 3: Server search
|
|
55
|
+
|
|
56
|
+
Tick the "Server" checkbox and the query goes to the mail server.
|
|
57
|
+
|
|
58
|
+
### bobma / Dovecot (IMAP SEARCH)
|
|
59
|
+
|
|
60
|
+
Standard IMAP keys, server-side. Combinable with implicit AND. mailx parses your `from:`, `to:`, `subject:` qualifiers and forwards them as IMAP keys; remaining text becomes a `BODY` search.
|
|
61
|
+
|
|
62
|
+
| Key | Example | Meaning |
|
|
63
|
+
|---|---|---|
|
|
64
|
+
| `BODY <text>` | (default for unqualified words) | Substring of body |
|
|
65
|
+
| `TEXT <text>` | (not exposed in the UI yet) | Substring of header + body |
|
|
66
|
+
| `SUBJECT <text>` | `subject:budget` | Substring of subject |
|
|
67
|
+
| `FROM <addr>` | `from:bob` | Substring of From line |
|
|
68
|
+
| `TO <addr>` | `to:eleanor` | Substring of To line |
|
|
69
|
+
| `SINCE <date>` | (not exposed) | RFC 822 date |
|
|
70
|
+
|
|
71
|
+
**Case**: IMAP SEARCH is **case-insensitive** (per RFC 3501 §6.4.4). `bob AND eleanor` and `bob and eleanor` behave the same on Dovecot.
|
|
72
|
+
|
|
73
|
+
**`AND` / `OR`**: IMAP's grammar is implicit-AND between keys. There's no literal `AND` keyword — typing `bob AND eleanor` would be sent as a body search for the literal three-word string. To OR keys you'd use IMAP's `OR <key1> <key2>` prefix syntax, which mailx doesn't expose in the UI today.
|
|
74
|
+
|
|
75
|
+
So if you typed `bob AND eleanor` on bobma and got results, what likely happened is the body literally contained the string "bob and eleanor" (case-insensitive). Apparent "AND" success is coincidence with the literal text.
|
|
76
|
+
|
|
77
|
+
### Gmail (server-search currently unwired)
|
|
78
|
+
|
|
79
|
+
`searchAndFetchOnServer` is IMAP-only and `withConnection` doesn't exist for Gmail-API accounts. Server-scope queries on Gmail today **return nothing new** — they only hit local cache. This is a known gap; the fix is to add a Gmail-API path that uses Google's `q=` query parameter (full Gmail search syntax: `from:`, `subject:`, `has:attachment`, `older_than:1y`, `label:`, etc., with proper boolean `AND`/`OR`).
|
|
80
|
+
|
|
81
|
+
That explains the asymmetry you may have noticed: `bob AND eleanor` "worked" against bobma (literal-text coincidence) but not against Gmail (no IMAP/API call ever fired).
|
|
82
|
+
|
|
83
|
+
## Limitations
|
|
84
|
+
|
|
85
|
+
- **No regex on the server side** (any provider). `/pattern/` only filters the visible local rows.
|
|
86
|
+
- **Server search results are stored locally** (envelope-only) on first hit. So a server search is also a backfill of envelopes for those messages — they appear next to local results without re-fetching.
|
|
87
|
+
- **Body search on bodies you haven't prefetched** only works server-side. The local FTS5 index can't search what isn't downloaded.
|
|
88
|
+
|
|
89
|
+
## Practical patterns
|
|
90
|
+
|
|
91
|
+
| Goal | What to type | Scope |
|
|
92
|
+
|---|---|---|
|
|
93
|
+
| Quick keyword in current folder | `lunch` | This folder (instant) |
|
|
94
|
+
| All-time mail from someone | `from:bob.frankston@example.com` | All folders (FTS5) |
|
|
95
|
+
| Mail mentioning two people | `bob eleanor` | All folders (FTS5; implicit AND) |
|
|
96
|
+
| Either of two terms | `bob OR eleanor` | All folders (FTS5) |
|
|
97
|
+
| Exact phrase | `"open source"` | All folders (FTS5) |
|
|
98
|
+
| Regex over what's on screen | `/^Re: \[mailx\]/` | Any (client-side) |
|
|
99
|
+
| Old mail beyond `historyDays` | type query, then check the **Server** checkbox | Server (Dovecot only today) |
|
|
@@ -28,6 +28,12 @@ export declare class FileMessageStore implements MessageStore {
|
|
|
28
28
|
* it in `body_path`. The (folderId, uid) args are kept for interface
|
|
29
29
|
* compatibility; they do NOT affect the filename. */
|
|
30
30
|
putMessage(accountId: string, _folderId: number, _uid: number, raw: Buffer): Promise<string>;
|
|
31
|
+
/** Resolve a stored body_path (relative or absolute) to an absolute
|
|
32
|
+
* filesystem path. Returns "" if the input doesn't resolve to a file
|
|
33
|
+
* inside the store. UI / "Source" actions need the absolute path so
|
|
34
|
+
* they can open / pass it to OS file pickers without re-introducing
|
|
35
|
+
* the basePath context every time. */
|
|
36
|
+
absolutePath(stored: string): string;
|
|
31
37
|
/** Read by stored path (relative or absolute). */
|
|
32
38
|
readByPath(stored: string): Promise<Buffer>;
|
|
33
39
|
hasByPath(stored: string): Promise<boolean>;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"file-store.d.ts","sourceRoot":"","sources":["file-store.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAKH,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,2BAA2B,CAAC;AAE9D,qBAAa,gBAAiB,YAAW,YAAY;IACrC,OAAO,CAAC,QAAQ;gBAAR,QAAQ,EAAE,MAAM;IAIpC;;;sCAGkC;IAClC,OAAO,CAAC,eAAe;IAMvB;;;gDAG4C;IAC5C,OAAO,CAAC,aAAa;IAQrB;;0DAEsD;IAChD,UAAU,CAAC,SAAS,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IAQlG,kDAAkD;IAC5C,UAAU,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IAM3C,SAAS,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAK3C,YAAY,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAMjD;;;;;;;;;uDASmD;IACnD,yBAAyB,CAAC,IAAI,EAAE,KAAK,CAAC;QAAE,EAAE,EAAE,MAAM,CAAC;QAAC,SAAS,EAAE,MAAM,CAAA;KAAE,CAAC,EAC7C,MAAM,EAAE,CAAC,EAAE,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,KAAK,IAAI,GAAG,MAAM;IA6BjF,cAAc,CAAC,UAAU,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,MAAM;IAGrE,UAAU,CAAC,UAAU,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IAGhF,UAAU,CAAC,UAAU,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAGjF,aAAa,CAAC,UAAU,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;CAG1F"}
|
|
1
|
+
{"version":3,"file":"file-store.d.ts","sourceRoot":"","sources":["file-store.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAKH,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,2BAA2B,CAAC;AAE9D,qBAAa,gBAAiB,YAAW,YAAY;IACrC,OAAO,CAAC,QAAQ;gBAAR,QAAQ,EAAE,MAAM;IAIpC;;;sCAGkC;IAClC,OAAO,CAAC,eAAe;IAMvB;;;gDAG4C;IAC5C,OAAO,CAAC,aAAa;IAQrB;;0DAEsD;IAChD,UAAU,CAAC,SAAS,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IAQlG;;;;2CAIuC;IACvC,YAAY,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM;IAIpC,kDAAkD;IAC5C,UAAU,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IAM3C,SAAS,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAK3C,YAAY,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAMjD;;;;;;;;;uDASmD;IACnD,yBAAyB,CAAC,IAAI,EAAE,KAAK,CAAC;QAAE,EAAE,EAAE,MAAM,CAAC;QAAC,SAAS,EAAE,MAAM,CAAA;KAAE,CAAC,EAC7C,MAAM,EAAE,CAAC,EAAE,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,KAAK,IAAI,GAAG,MAAM;IA6BjF,cAAc,CAAC,UAAU,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,MAAM;IAGrE,UAAU,CAAC,UAAU,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IAGhF,UAAU,CAAC,UAAU,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAGjF,aAAa,CAAC,UAAU,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;CAG1F"}
|
|
@@ -51,6 +51,14 @@ export class FileMessageStore {
|
|
|
51
51
|
fs.writeFileSync(abs, raw);
|
|
52
52
|
return rel;
|
|
53
53
|
}
|
|
54
|
+
/** Resolve a stored body_path (relative or absolute) to an absolute
|
|
55
|
+
* filesystem path. Returns "" if the input doesn't resolve to a file
|
|
56
|
+
* inside the store. UI / "Source" actions need the absolute path so
|
|
57
|
+
* they can open / pass it to OS file pickers without re-introducing
|
|
58
|
+
* the basePath context every time. */
|
|
59
|
+
absolutePath(stored) {
|
|
60
|
+
return this.resolveStored(stored);
|
|
61
|
+
}
|
|
54
62
|
/** Read by stored path (relative or absolute). */
|
|
55
63
|
async readByPath(stored) {
|
|
56
64
|
const abs = this.resolveStored(stored);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"file-store.js","sourceRoot":"","sources":["file-store.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"file-store.js","sourceRoot":"","sources":["file-store.ts"],"names":[],"mappings":"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"}
|
|
@@ -54,6 +54,15 @@ export class FileMessageStore implements MessageStore {
|
|
|
54
54
|
return rel;
|
|
55
55
|
}
|
|
56
56
|
|
|
57
|
+
/** Resolve a stored body_path (relative or absolute) to an absolute
|
|
58
|
+
* filesystem path. Returns "" if the input doesn't resolve to a file
|
|
59
|
+
* inside the store. UI / "Source" actions need the absolute path so
|
|
60
|
+
* they can open / pass it to OS file pickers without re-introducing
|
|
61
|
+
* the basePath context every time. */
|
|
62
|
+
absolutePath(stored: string): string {
|
|
63
|
+
return this.resolveStored(stored);
|
|
64
|
+
}
|
|
65
|
+
|
|
57
66
|
/** Read by stored path (relative or absolute). */
|
|
58
67
|
async readByPath(stored: string): Promise<Buffer> {
|
|
59
68
|
const abs = this.resolveStored(stored);
|