@bobfrankston/rmfmail 1.2.50 → 1.2.66
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/android-bootstrap.bundle.js +63 -2
- package/client/android-bootstrap.bundle.js.map +4 -4
- package/client/app.bundle.js +417 -63
- package/client/app.bundle.js.map +3 -3
- package/client/app.js +182 -24
- package/client/app.js.map +1 -1
- package/client/app.ts +166 -21
- package/client/components/calendar-sidebar.js +5 -5
- package/client/components/calendar-sidebar.js.map +1 -1
- package/client/components/calendar-sidebar.ts +5 -5
- package/client/components/folder-tree.js +81 -0
- package/client/components/folder-tree.js.map +1 -1
- package/client/components/folder-tree.ts +70 -0
- package/client/components/message-list.js +282 -38
- package/client/components/message-list.js.map +1 -1
- package/client/components/message-list.ts +264 -36
- package/client/compose/compose.bundle.js +70 -14
- package/client/compose/compose.bundle.js.map +2 -2
- package/client/compose/compose.css +28 -7
- package/client/compose/compose.js +64 -4
- package/client/compose/compose.js.map +1 -1
- package/client/compose/compose.ts +66 -4
- package/client/compose/editor.js +23 -7
- package/client/compose/editor.js.map +1 -1
- package/client/compose/editor.ts +23 -7
- package/client/help/search-help.js +4 -3
- package/client/help/search-help.js.map +1 -1
- package/client/help/search-help.ts +4 -3
- package/client/index.html +5 -1
- package/client/lib/api-client.js +4 -2
- package/client/lib/api-client.js.map +1 -1
- package/client/lib/api-client.ts +4 -2
- package/client/lib/mailxapi.js +2 -2
- package/client/lib/rmf-tiny.js +39 -6
- package/client/styles/components.css +11 -0
- package/docs/azure.md +58 -0
- package/docs/config-help.md +131 -0
- package/docs/edit-in-word-docx.md +98 -0
- package/docs/host-abstraction-plan.md +169 -0
- package/docs/local-first-plan.md +303 -0
- package/docs/npmglobalize-transitive-workspace-deps.md +107 -0
- package/docs/outlook.md +80 -18
- package/docs/outlook.txt +35 -0
- package/docs/rules-design.md +172 -0
- package/package.json +9 -9
- package/packages/mailx-imap/index.d.ts +48 -1
- package/packages/mailx-imap/index.d.ts.map +1 -1
- package/packages/mailx-imap/index.js +320 -68
- package/packages/mailx-imap/index.js.map +1 -1
- package/packages/mailx-imap/index.ts +311 -65
- package/packages/mailx-imap/microsoft-credentials.json +8 -0
- package/packages/mailx-imap/package-lock.json +2 -2
- package/packages/mailx-imap/package.json +1 -1
- package/packages/mailx-imap/providers/outlook-api.d.ts +7 -0
- package/packages/mailx-imap/providers/outlook-api.d.ts.map +1 -0
- package/packages/mailx-imap/providers/outlook-api.js +7 -0
- package/packages/mailx-imap/providers/outlook-api.js.map +1 -0
- package/packages/mailx-service/index.d.ts +7 -1
- package/packages/mailx-service/index.d.ts.map +1 -1
- package/packages/mailx-service/index.js +8 -8
- package/packages/mailx-service/index.js.map +1 -1
- package/packages/mailx-service/index.ts +8 -7
- package/packages/mailx-service/jsonrpc.js +1 -1
- package/packages/mailx-service/jsonrpc.js.map +1 -1
- package/packages/mailx-service/jsonrpc.ts +1 -1
- package/packages/mailx-settings/docs/azure.md +58 -0
- package/packages/mailx-settings/docs/config-help.md +131 -0
- package/packages/mailx-settings/docs/edit-in-word-docx.md +98 -0
- package/packages/mailx-settings/docs/host-abstraction-plan.md +169 -0
- package/packages/mailx-settings/docs/local-first-plan.md +303 -0
- package/packages/mailx-settings/docs/npmglobalize-transitive-workspace-deps.md +107 -0
- package/packages/mailx-settings/docs/outlook.md +80 -18
- package/packages/mailx-settings/docs/rules-design.md +172 -0
- package/packages/mailx-settings/index.d.ts.map +1 -1
- package/packages/mailx-settings/index.js +9 -8
- package/packages/mailx-settings/index.js.map +1 -1
- package/packages/mailx-settings/index.ts +9 -8
- package/packages/mailx-settings/package.json +1 -1
- package/packages/mailx-store/db.d.ts +36 -1
- package/packages/mailx-store/db.d.ts.map +1 -1
- package/packages/mailx-store/db.js +100 -6
- package/packages/mailx-store/db.js.map +1 -1
- package/packages/mailx-store/db.ts +100 -6
- package/packages/mailx-store/package.json +1 -1
- package/packages/mailx-types/contact-rules.d.ts +1 -1
- package/packages/mailx-types/contact-rules.js +1 -1
- package/packages/mailx-types/contact-rules.js.map +1 -1
- package/packages/mailx-types/contact-rules.jsonc +1 -1
- package/packages/mailx-types/contact-rules.ts +1 -1
- package/packages/mailx-types/package.json +1 -1
|
@@ -0,0 +1,172 @@
|
|
|
1
|
+
# `rules.jsonc` — per-user message classification rules (design proposal)
|
|
2
|
+
|
|
3
|
+
> Draft for discussion. Nothing implemented yet. Captures the mechanism we need to agree on before writing code.
|
|
4
|
+
|
|
5
|
+
## Why
|
|
6
|
+
|
|
7
|
+
Per-sender flagging (the existing `flaggedSenders` / `flaggedDomains` in `allowlist.jsonc`) is unreliable: spammers rotate addresses faster than the user can list them. A pattern-based system that runs on first sight of a message is more durable. It also covers the cases where the user wants:
|
|
8
|
+
|
|
9
|
+
- Auto-move newsletters to a folder
|
|
10
|
+
- Star anything from a specific person
|
|
11
|
+
- Drop everything matching a phishing keyword pattern
|
|
12
|
+
- Mark certain mailing-list traffic as read on arrival
|
|
13
|
+
|
|
14
|
+
The mechanism should be **declarative** (JSONC, no code), **deterministic** (same input → same output), and **fast** (no body-parse for header-only rules).
|
|
15
|
+
|
|
16
|
+
## Where the file lives
|
|
17
|
+
|
|
18
|
+
- **Per-user, synced**: `My Drive/home/.rmfmail/rules.jsonc` — your personal rules, available on every device.
|
|
19
|
+
- **Disjoint from `contact-rules.jsonc`**: that one is *global, app-shipped* — applies to everyone, deployed on every release. `rules.jsonc` is *yours alone*.
|
|
20
|
+
- **Disjoint from `allowlist.jsonc`**: keep `senders/domains/recipients` (remote-content allow) and `flaggedSenders/flaggedDomains` (sender-watch list) where they are. `rules.jsonc` is a *new* layer on top.
|
|
21
|
+
|
|
22
|
+
## Schema (proposed)
|
|
23
|
+
|
|
24
|
+
```jsonc
|
|
25
|
+
{
|
|
26
|
+
"version": 1,
|
|
27
|
+
"rules": [
|
|
28
|
+
{
|
|
29
|
+
"name": "Newsletter auto-archive", // human label, shown in match logs
|
|
30
|
+
"when": "incoming", // "incoming" | "outgoing" | "always"; default "incoming"
|
|
31
|
+
"match": [
|
|
32
|
+
{ "header": "list-id" }, // exists check (any non-empty value)
|
|
33
|
+
{ "header": "subject", "regex": "(?i)(unsubscribe|newsletter|digest)" }
|
|
34
|
+
],
|
|
35
|
+
"matchMode": "any", // "all" | "any"; default "all"
|
|
36
|
+
"actions": [
|
|
37
|
+
{ "type": "moveTo", "folder": "Newsletters" },
|
|
38
|
+
{ "type": "markRead", "value": true }
|
|
39
|
+
],
|
|
40
|
+
"stop": true // first match wins; remaining rules skipped
|
|
41
|
+
},
|
|
42
|
+
{
|
|
43
|
+
"name": "Star anything from boss",
|
|
44
|
+
"match": [
|
|
45
|
+
{ "header": "from", "contains": "boss@example.com" }
|
|
46
|
+
],
|
|
47
|
+
"actions": [
|
|
48
|
+
{ "type": "flag", "value": true } // sets \\Flagged
|
|
49
|
+
]
|
|
50
|
+
},
|
|
51
|
+
{
|
|
52
|
+
"name": "Junk obvious phishing-domain shapes",
|
|
53
|
+
"match": [
|
|
54
|
+
{ "senderDomain": { "regex": "^[a-z0-9-]{1,3}\\.[a-z]{2,}$" } },
|
|
55
|
+
{ "header": "subject", "regex": "(?i)(verify your|account suspended|click here to)" }
|
|
56
|
+
],
|
|
57
|
+
"actions": [ { "type": "moveTo", "folder": "Junk" } ],
|
|
58
|
+
"stop": true
|
|
59
|
+
}
|
|
60
|
+
]
|
|
61
|
+
}
|
|
62
|
+
```
|
|
63
|
+
|
|
64
|
+
### Match conditions
|
|
65
|
+
|
|
66
|
+
Each entry in `match[]` is one predicate:
|
|
67
|
+
|
|
68
|
+
| Field | Operator | Example | Notes |
|
|
69
|
+
|---|---|---|---|
|
|
70
|
+
| `header: "name"` | bare = exists | `{ "header": "list-id" }` | true when header is present and non-empty |
|
|
71
|
+
| `header: "name"` + `regex` | regex match | `{ "header": "from", "regex": "(?i)@example\\.com$" }` | case-insensitive by default; explicit `(?i)` allowed |
|
|
72
|
+
| `header: "name"` + `contains` | substring | `{ "header": "subject", "contains": "[urgent]" }` | case-insensitive |
|
|
73
|
+
| `header: "name"` + `equals` | exact | `{ "header": "to", "equals": "team@bob.ma" }` | case-insensitive |
|
|
74
|
+
| `senderDomain: { regex \| contains \| equals }` | extracts domain from From | shortcut so users don't have to remember the from-header trick |
|
|
75
|
+
| `body: { regex \| contains }` | matches against text body | slower (requires body fetch); only run if no header rule rejected first |
|
|
76
|
+
| `account: "id"` | scope to one account | `{ "account": "bobma" }` | combined with other predicates via matchMode |
|
|
77
|
+
| `folder: "name"` | scope to incoming folder | rare; useful for cross-folder rules |
|
|
78
|
+
|
|
79
|
+
### Actions
|
|
80
|
+
|
|
81
|
+
| Type | Param | Effect |
|
|
82
|
+
|---|---|---|
|
|
83
|
+
| `moveTo` | `folder: "name"` | IMAP move to that folder; queued in sync-actions |
|
|
84
|
+
| `delete` | — | Move to Trash (true delete is rarely what users want) |
|
|
85
|
+
| `markRead` | `value: true \| false` | Set/clear `\\Seen` |
|
|
86
|
+
| `flag` | `value: true \| false` | Set/clear `\\Flagged` (the per-message ⚑/★) |
|
|
87
|
+
| `addLabel` | `label: "name"` | Gmail label add (Gmail only) |
|
|
88
|
+
| `tag` | `tag: "name"` | Local-only tag (no IMAP equivalent; for filtering UI) |
|
|
89
|
+
| `notify` | `message: "text"` | Desktop notification with custom message |
|
|
90
|
+
| `priority` | `value: true \| false` | Mark this message as from a priority sender. Row gets `.priority` class; CSS highlights it (e.g. gold left border, bolder sender name) — strongest while unread, fades when read. |
|
|
91
|
+
|
|
92
|
+
Deferred (require more design):
|
|
93
|
+
- `forwardTo` — auto-forward (loop risk, deliverability)
|
|
94
|
+
- `sendReply` — auto-reply with template (vacation responder territory)
|
|
95
|
+
|
|
96
|
+
### Evaluation order
|
|
97
|
+
|
|
98
|
+
1. Rules apply in array order.
|
|
99
|
+
2. Multiple rules can match a single message; all their actions accumulate.
|
|
100
|
+
3. `stop: true` on a matching rule halts further evaluation for that message.
|
|
101
|
+
4. Conflicts (e.g. two `moveTo` in the same evaluation) → last one wins.
|
|
102
|
+
|
|
103
|
+
## When rules run
|
|
104
|
+
|
|
105
|
+
- **Incoming**: during sync, after metadata is inserted into the local DB but before the row is shown in the list. Sync emits a `folderCountsChanged` event after rules apply, so the user sees the post-rule state.
|
|
106
|
+
- **Manual "apply rules to existing"**: a Settings button (or `rmfmail -applyrules` CLI) walks every cached message and applies. Useful for cleaning up an existing INBOX after adding new rules.
|
|
107
|
+
- **Live edit**: when `rules.jsonc` saves, the in-memory rule set reloads. Existing messages aren't re-evaluated until next sync (or manual apply).
|
|
108
|
+
|
|
109
|
+
## Migration
|
|
110
|
+
|
|
111
|
+
When `rules.jsonc` first loads, if `flaggedSenders` / `flaggedDomains` in `allowlist.jsonc` are non-empty AND the user has no `rules.jsonc` yet, auto-generate a starter file with one rule per entry:
|
|
112
|
+
|
|
113
|
+
```jsonc
|
|
114
|
+
{
|
|
115
|
+
"version": 1,
|
|
116
|
+
"rules": [
|
|
117
|
+
{
|
|
118
|
+
"name": "Migrated: warn on sender boss@spam.com",
|
|
119
|
+
"match": [{ "header": "from", "contains": "boss@spam.com" }],
|
|
120
|
+
"actions": [{ "type": "tag", "tag": "warn" }]
|
|
121
|
+
}
|
|
122
|
+
]
|
|
123
|
+
}
|
|
124
|
+
```
|
|
125
|
+
|
|
126
|
+
The `tag` action is intentionally weak — same effect as today's per-sender `flaggedSenders` (just paints a warning banner), no destructive action. User can then refine to `moveTo: Junk` etc.
|
|
127
|
+
|
|
128
|
+
## Priority senders (companion to watch list)
|
|
129
|
+
|
|
130
|
+
Symmetric concept: a user-curated list of *important* senders whose unread messages should visually stand out in the list. Same data shape as `flaggedSenders` (now "watch list"), opposite intent.
|
|
131
|
+
|
|
132
|
+
Two ways to source the list:
|
|
133
|
+
|
|
134
|
+
- **A. Reuse `contacts.jsonc → preferred[]`** — every preferred contact's incoming mail is "priority" by default. Single concept; simpler. May couple two things that should be separate (autocomplete-preferred vs. visually-prominent).
|
|
135
|
+
- **B. New explicit list** — `prioritySenders` / `priorityDomains` (added to `allowlist.jsonc` for symmetry with the watch list, OR a new `priority` array in `contacts.jsonc`). Independent of autocomplete preference.
|
|
136
|
+
|
|
137
|
+
Either way, the rendering is the same:
|
|
138
|
+
|
|
139
|
+
- Row gains `.priority` class when sender / domain matches.
|
|
140
|
+
- CSS: `.ml-row.priority.unread` → distinct styling (gold accent, bolder name, possibly a small star/dot indicator that's *not* the per-message ⚑/★).
|
|
141
|
+
- After the message is read, the priority cue de-emphasizes (CSS `.ml-row.priority:not(.unread)` is more subtle) — Bob's intent: "at least as long as the messages are unread".
|
|
142
|
+
|
|
143
|
+
Once `rules.jsonc` lands, the same effect can be expressed via a rule + the `priority` action above. The dedicated list could either:
|
|
144
|
+
- Be removed (rules-only), OR
|
|
145
|
+
- Stay as a fast-path the rule engine doesn't need to consult on every message.
|
|
146
|
+
|
|
147
|
+
|
|
148
|
+
|
|
149
|
+
1. **Is the action set right?** Listed: `moveTo / delete / markRead / flag / addLabel / tag / notify`. Anything missing? Anything you'd cut to keep the surface tight?
|
|
150
|
+
2. **Body matching:** include `body: { regex / contains }`? Slower (requires body-fetch before list shows the row), but useful for catching specific phishing patterns. Could gate behind `requiresBody: true` per-rule so the sync path knows to fetch first.
|
|
151
|
+
3. **Per-account scoping:** is `account` predicate enough, or do you want a top-level `account` field on the rule?
|
|
152
|
+
4. **First-match-wins by default vs all-match-applies:** I have all-match with explicit `stop`. Should it be the other way (first-match-wins, with explicit `continue`)?
|
|
153
|
+
5. **Editing UI:** JSONC editor only (matches today's pattern), or build a structured rule builder later?
|
|
154
|
+
6. **Legacy migration:** auto-translate `flaggedSenders` / `flaggedDomains` to rules with `tag: "warn"` action? Keep both systems running indefinitely? Or deprecate the old one and force migration?
|
|
155
|
+
7. **Concept of "test mode":** would you want a `--dryrun` action set ("log what would happen, don't actually move/flag")? Useful for shipping a rule confidently.
|
|
156
|
+
8. **Performance bound:** how many rules is "a lot"? My internal sense is 50-200 is fine for header-only matching. Body-matching needs to be careful.
|
|
157
|
+
|
|
158
|
+
## Status
|
|
159
|
+
|
|
160
|
+
- Priority-sender feature **shipped as a standalone facility** ahead of the rules engine. Implementation lives in `mailx-store/db.ts` (in-memory index) + `mailx-service/index.ts` (`getPriorityLists` / `setPrioritySender` / `setPriorityDomain`), with Android parity in `mailx-store-web/web-service.ts`. Visual: `.ml-row.priority` class with gold left bar + bold sender name. View → "Priority senders only" toggle. Right-click "Mark sender as priority" in the viewer.
|
|
161
|
+
- **TODO when rules engine ships:** add a `priority` action so priority can be expressed as a rule, not only as a contacts.jsonc property. Keep the contacts.jsonc field as a fast path that doesn't require running the engine on every row render. Alternatively, deprecate the field and migrate to a rule.
|
|
162
|
+
|
|
163
|
+
## Implementation order (once approved)
|
|
164
|
+
|
|
165
|
+
1. Schema + parser in `mailx-store/rules.ts` (pure function, fully testable)
|
|
166
|
+
2. Evaluator: `evaluate(message, rules) → ActionList`
|
|
167
|
+
3. Hook into desktop sync (mailx-imap) — fire after metadata insert
|
|
168
|
+
4. Hook into Android sync (mailx-store-web) — same place
|
|
169
|
+
5. JSONC editor file-list adds `rules.jsonc`
|
|
170
|
+
6. Rename `flaggedSenders/flaggedDomains` → keep field names for compat; UI already uses "watch list" wording
|
|
171
|
+
7. Migration step on first launch with new file
|
|
172
|
+
8. `rules.md` doc deployed to GDrive (same mechanism as the other `.md` files in 1.0.498+)
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@bobfrankston/rmfmail",
|
|
3
|
-
"version": "1.2.
|
|
3
|
+
"version": "1.2.66",
|
|
4
4
|
"description": "Local-first email client with IMAP sync and standalone native app",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"main": "bin/mailx.js",
|
|
@@ -38,14 +38,14 @@
|
|
|
38
38
|
"dependencies": {
|
|
39
39
|
"@bobfrankston/iflow-direct": "^0.1.55",
|
|
40
40
|
"@bobfrankston/mailx-host": "^0.1.13",
|
|
41
|
-
"@bobfrankston/mailx-imap": "^0.1.
|
|
41
|
+
"@bobfrankston/mailx-imap": "^0.1.108",
|
|
42
42
|
"@bobfrankston/mailx-store-web": "^0.1.30",
|
|
43
|
-
"@bobfrankston/mailx-sync": "^0.1.
|
|
43
|
+
"@bobfrankston/mailx-sync": "^0.1.23",
|
|
44
44
|
"@bobfrankston/miscinfo": "^1.0.13",
|
|
45
45
|
"@bobfrankston/msger": "^0.1.387",
|
|
46
46
|
"@bobfrankston/node-tcp-transport": "^0.1.10",
|
|
47
|
-
"@bobfrankston/oauthsupport": "^1.0.
|
|
48
|
-
"@bobfrankston/rmf-tiny": "^0.1.
|
|
47
|
+
"@bobfrankston/oauthsupport": "^1.0.33",
|
|
48
|
+
"@bobfrankston/rmf-tiny": "^0.1.35",
|
|
49
49
|
"@bobfrankston/smtp-direct": "^0.1.9",
|
|
50
50
|
"@bobfrankston/tcp-transport": "^0.1.7",
|
|
51
51
|
"@capacitor/android": "^8.3.0",
|
|
@@ -118,14 +118,14 @@
|
|
|
118
118
|
"dependencies": {
|
|
119
119
|
"@bobfrankston/iflow-direct": "^0.1.55",
|
|
120
120
|
"@bobfrankston/mailx-host": "^0.1.13",
|
|
121
|
-
"@bobfrankston/mailx-imap": "^0.1.
|
|
121
|
+
"@bobfrankston/mailx-imap": "^0.1.108",
|
|
122
122
|
"@bobfrankston/mailx-store-web": "^0.1.30",
|
|
123
|
-
"@bobfrankston/mailx-sync": "^0.1.
|
|
123
|
+
"@bobfrankston/mailx-sync": "^0.1.23",
|
|
124
124
|
"@bobfrankston/miscinfo": "^1.0.13",
|
|
125
125
|
"@bobfrankston/msger": "^0.1.387",
|
|
126
126
|
"@bobfrankston/node-tcp-transport": "^0.1.10",
|
|
127
|
-
"@bobfrankston/oauthsupport": "^1.0.
|
|
128
|
-
"@bobfrankston/rmf-tiny": "^0.1.
|
|
127
|
+
"@bobfrankston/oauthsupport": "^1.0.33",
|
|
128
|
+
"@bobfrankston/rmf-tiny": "^0.1.35",
|
|
129
129
|
"@bobfrankston/smtp-direct": "^0.1.9",
|
|
130
130
|
"@bobfrankston/tcp-transport": "^0.1.7",
|
|
131
131
|
"@capacitor/android": "^8.3.0",
|
|
@@ -125,6 +125,27 @@ export declare class ImapManager extends EventEmitter {
|
|
|
125
125
|
createFolderViaServer(accountId: string, fullPath: string, name: string, delimiter: string): Promise<boolean>;
|
|
126
126
|
/** Rename `oldPath` → `newPath` on the server and re-sync folders. */
|
|
127
127
|
renameFolderViaServer(accountId: string, oldPath: string, newPath: string): Promise<void>;
|
|
128
|
+
/** Special-use roles a folder may NOT be renamed/reparented out of. Renaming
|
|
129
|
+
* INBOX/Sent/Drafts/Trash/Junk/Archive would break the special-folder
|
|
130
|
+
* mapping (compose's draft auto-save, the trash target, sent-copy append),
|
|
131
|
+
* and most servers reject it outright — so we refuse before touching the
|
|
132
|
+
* server. */
|
|
133
|
+
private static readonly PROTECTED_ROLES;
|
|
134
|
+
/** Rename and/or reparent a folder. Both operations are a single server-side
|
|
135
|
+
* mailbox rename (IMAP RENAME / Gmail label PATCH / Graph move+patch) —
|
|
136
|
+
* messages never move, no copy-and-delete. Mirrors moveMessage's plumbing:
|
|
137
|
+
* validate + branch API-vs-IMAP + commit locally.
|
|
138
|
+
*
|
|
139
|
+
* - `newName` is the new LEAF name.
|
|
140
|
+
* - `newParentId` (optional) reparents under that folder; omit for an
|
|
141
|
+
* in-place rename. Reparenting and renaming share one path computation:
|
|
142
|
+
* newPath = (newParent ? newParent.path + delim : oldParentPrefix) + newName.
|
|
143
|
+
*
|
|
144
|
+
* Guard rails (all throw a UI-surfaced error): protected special-use
|
|
145
|
+
* folders, empty/whitespace names, names containing the hierarchy
|
|
146
|
+
* delimiter, a destination that already exists, and reparenting a folder
|
|
147
|
+
* under itself or its own descendant (which would orphan the subtree). */
|
|
148
|
+
renameFolder(accountId: string, folderId: number, newName: string, newParentId?: number): Promise<void>;
|
|
128
149
|
/** Delete `path` on the server (tolerating already-gone). Local folder-row
|
|
129
150
|
* removal stays with the caller (it knows the folderId). */
|
|
130
151
|
deleteFolderViaServer(accountId: string, path: string): Promise<void>;
|
|
@@ -232,6 +253,21 @@ export declare class ImapManager extends EventEmitter {
|
|
|
232
253
|
private isGmailAccount;
|
|
233
254
|
/** Get a Gmail API provider for an account (reuses tokenProvider from IMAP config) */
|
|
234
255
|
private getGmailProvider;
|
|
256
|
+
/** Check if an account is Outlook.com / Microsoft 365 (should use Graph API
|
|
257
|
+
* instead of IMAP). Detection mirrors isGmailAccount: host or email domain.
|
|
258
|
+
* office365 IMAP front-ends and consumer outlook.com both route here. */
|
|
259
|
+
private isOutlookAccount;
|
|
260
|
+
/** True for any account that syncs via a REST provider (Gmail or Outlook)
|
|
261
|
+
* rather than IMAP. The branch points that used to ask isGmailAccount to
|
|
262
|
+
* mean "API, not IMAP" ask this instead. */
|
|
263
|
+
private isApiAccount;
|
|
264
|
+
/** Get a Microsoft Graph provider for an account (reuses the tokenProvider —
|
|
265
|
+
* which mints Graph-scoped tokens for Outlook accounts, see addAccount). */
|
|
266
|
+
private getOutlookProvider;
|
|
267
|
+
/** Get the right REST provider (Gmail or Outlook) for an API account.
|
|
268
|
+
* Both implement MailProvider plus the setFlags/trashMessage/moveMessage/
|
|
269
|
+
* fetchBodiesBatch surface the dispatcher uses, so callers stay generic. */
|
|
270
|
+
private getApiProvider;
|
|
235
271
|
/** Convert ProviderMessage to the shape expected by storeMessages/upsertMessage */
|
|
236
272
|
private providerMsgToLocal;
|
|
237
273
|
/** Sync folder list for an account */
|
|
@@ -297,7 +333,7 @@ export declare class ImapManager extends EventEmitter {
|
|
|
297
333
|
private _syncAll;
|
|
298
334
|
/** Sync a single account — manages its own connection lifecycle */
|
|
299
335
|
private syncAccount;
|
|
300
|
-
/** Sync a Gmail account via REST API — no IMAP connections */
|
|
336
|
+
/** Sync a Gmail or Outlook account via REST API — no IMAP connections */
|
|
301
337
|
private syncAccountViaApi;
|
|
302
338
|
/** Sync a single folder via Gmail/Outlook API */
|
|
303
339
|
private syncFolderViaApi;
|
|
@@ -333,6 +369,11 @@ export declare class ImapManager extends EventEmitter {
|
|
|
333
369
|
private quickCheck;
|
|
334
370
|
/** Check a single account's inbox — uses its own connection, never blocked by sync */
|
|
335
371
|
quickInboxCheckAccount(accountId: string): Promise<void>;
|
|
372
|
+
/** Lightweight inbox refresh for a generic API account (Outlook). Unlike
|
|
373
|
+
* quickGmailCheck there's no cheap "top message id" probe — a single
|
|
374
|
+
* incremental syncFolderViaApi is itself cheap (Graph delta-ish page), so
|
|
375
|
+
* we just run it and recalc counts. */
|
|
376
|
+
private quickApiCheck;
|
|
336
377
|
private quickImapCheck;
|
|
337
378
|
private quickGmailCheck;
|
|
338
379
|
/** Check all accounts (used by legacy callers) */
|
|
@@ -549,6 +590,12 @@ export declare class ImapManager extends EventEmitter {
|
|
|
549
590
|
* account before the backoff gate. */
|
|
550
591
|
private recoverStaleClaims;
|
|
551
592
|
private processLocalQueue;
|
|
593
|
+
/** Send a raw RFC 2822 message for an account, choosing the transport by
|
|
594
|
+
* provider. Outlook accounts have a Graph-scoped OAuth token (no SMTP
|
|
595
|
+
* audience), so they send via Graph POST /sendMail; Gmail and IMAP
|
|
596
|
+
* accounts send via SMTP (Gmail's mail.google.com token covers XOAUTH2
|
|
597
|
+
* SMTP). Graph /sendMail auto-files a copy in Sent, so no append needed. */
|
|
598
|
+
private sendRawForAccount;
|
|
552
599
|
/** Send a raw RFC 2822 message via SMTP for a given account.
|
|
553
600
|
* Uses @bobfrankston/smtp-direct with the same TransportFactory as IMAP —
|
|
554
601
|
* same TCP byte-stream interface, no nodemailer dependency. */
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAGH,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,6BAA6B,CAAC;AAEpE,OAAO,EAAW,gBAAgB,EAA+C,KAAK,EAAE,MAAM,2BAA2B,CAAC;AAE1H,OAAO,KAAK,EAAE,aAAa,EAAE,eAAe,EAAgB,MAAM,EAAE,MAAM,2BAA2B,CAAC;AACtG,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAGH,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,6BAA6B,CAAC;AAEpE,OAAO,EAAW,gBAAgB,EAA+C,KAAK,EAAE,MAAM,2BAA2B,CAAC;AAE1H,OAAO,KAAK,EAAE,aAAa,EAAE,eAAe,EAAgB,MAAM,EAAE,MAAM,2BAA2B,CAAC;AACtG,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AA0F3C,yCAAyC;AACzC,MAAM,WAAW,iBAAiB;IAC9B,UAAU,EAAE,CAAC,SAAS,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,QAAQ,EAAE,eAAe,KAAK,IAAI,CAAC;IACrF,YAAY,EAAE,CAAC,SAAS,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,KAAK,IAAI,CAAC;IAC3E,YAAY,EAAE,CAAC,SAAS,EAAE,MAAM,KAAK,IAAI,CAAC;IAC1C,SAAS,EAAE,CAAC,SAAS,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;IACtD,mBAAmB,EAAE,CAAC,SAAS,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAA;KAAE,CAAC,KAAK,IAAI,CAAC;IAC5G,YAAY,EAAE,CAAC,SAAS,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,KAAK,IAAI,CAAC;IACzF,aAAa,EAAE,CAAC,QAAQ,EAAE,MAAM,KAAK,IAAI,CAAC;IAC1C;+EAC2E;IAC3E,UAAU,EAAE,CAAC,SAAS,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,KAAK,IAAI,CAAC;IACrD,gBAAgB,EAAE,CAAC,SAAS,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;IAC1F;;;8EAG0E;IAC1E,YAAY,EAAE,CAAC,MAAM,EAAE,YAAY,KAAK,IAAI,CAAC;IAC7C;0DACsD;IACtD,WAAW,EAAE,CAAC,SAAS,EAAE,MAAM,EAAE,QAAQ,EAAE,kBAAkB,KAAK,IAAI,CAAC;CAC1E;AAED;0DAC0D;AAC1D,MAAM,WAAW,kBAAkB;IAC/B,SAAS,EAAE,MAAM,CAAC;IAClB,kBAAkB,EAAE,MAAM,CAAC;IAC3B,WAAW,EAAE,MAAM,CAAC;IACpB,cAAc,EAAE,MAAM,CAAC;IACvB,aAAa,EAAE,MAAM,CAAC;IACtB,WAAW,EAAE,MAAM,CAAC;IACpB,SAAS,EAAE,MAAM,CAAC;CACrB;AAED,kEAAkE;AAClE,MAAM,WAAW,YAAY;IACzB,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,EAAE,MAAM,CAAC;IACjB,OAAO,EAAE,MAAM,CAAC;IAChB,YAAY,EAAE,MAAM,CAAC;IACrB,WAAW,EAAE,MAAM,CAAC;IACpB,UAAU,EAAE,MAAM,CAAC,MAAM,EAAE;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,QAAQ,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;CACpF;AA+GD,qBAAa,WAAY,SAAQ,YAAY;IACzC,OAAO,CAAC,OAAO,CAAmE;IAClF,OAAO,CAAC,QAAQ,CAAsC;IAQtD,OAAO,CAAC,cAAc,CAA+B;IACrD,OAAO,CAAC,YAAY,CAA+B;IACnD;;;;;;;6DAOyD;IACzD,OAAO,CAAC,KAAK,CAAQ;IACrB,OAAO,KAAK,EAAE,GAAqC;IACnD,OAAO,KAAK,SAAS,GAAqD;IAC1E,OAAO,CAAC,aAAa,CAA0D;IAC/E,2FAA2F;IAC3F,OAAO,CAAC,iBAAiB,CAAqB;IAC9C,OAAO,CAAC,OAAO,CAAS;IACxB,OAAO,CAAC,YAAY,CAAS;IAC7B;;;2DAGuD;IACvD,OAAO,CAAC,UAAU,CAAsB;IACxC,yEAAyE;IACzE,eAAe,UAAS;IAOxB;;;;yDAIqD;IACrD,OAAO,CAAC,WAAW,CAAyC;IAE5D,OAAO,CAAC,mBAAmB;IAS3B;;sEAEkE;IAClE,OAAO,CAAC,WAAW;IAkBnB,4EAA4E;IAC5E,sBAAsB,IAAI,kBAAkB,EAAE;IAI9C,OAAO,CAAC,gBAAgB,CAAmB;gBAE/B,KAAK,EAAE,KAAK,EAAE,gBAAgB,EAAE,gBAAgB;IAoC5D,4DAA4D;IACtD,aAAa,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC;IAM9D,uEAAuE;IACvE,OAAO,CAAC,gBAAgB,CAAqB;IAC7C,yFAAyF;IACzF,OAAO,CAAC,iBAAiB,CAA6B;IAEtD,yGAAyG;IACnG,cAAc,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IA4CzD,+FAA+F;IACzF,cAAc,CAAC,SAAS,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAOvF,iEAAiE;IAC3D,cAAc,CAAC,SAAS,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,EAAE,QAAQ,EAAE,GAAG,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC;IAM9F;;;;;uDAKmD;IAC7C,sBAAsB,CAAC,SAAS,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,EAAE,QAAQ,EAAE,GAAG,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC;IA0BxH,kFAAkF;IAC5E,kBAAkB,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,GAAG,CAAC;IAYzD;gFAC4E;IACtE,qBAAqB,CAAC,SAAS,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAUnH,sEAAsE;IAChE,qBAAqB,CAAC,SAAS,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAS/F;;;;kBAIc;IACd,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,eAAe,CAAoE;IAE3G;;;;;;;;;;;;;+EAa2E;IACrE,YAAY,CAAC,SAAS,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,WAAW,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAwE7G;iEAC6D;IACvD,qBAAqB,CAAC,SAAS,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAc3E,qDAAqD;IAC/C,oBAAoB,CAAC,SAAS,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAQ1E;;qEAEiE;IAC3D,0BAA0B,CAC5B,SAAS,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,EAC3E,OAAO,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAClD,OAAO,CAAC,IAAI,CAAC;YAiBF,wBAAwB;IAsCtC;;;;;;;;;;;;;sDAakD;IAClD,OAAO,CAAC,WAAW,CAAuC;IAC1D;;+DAE2D;IAC3D,OAAO,CAAC,UAAU,CAA6C;IAC/D;;;;;;;gFAO4E;IAC5E,OAAO,CAAC,cAAc,CAAoC;IAC1D,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,YAAY,CAAK;IAEzC,qEAAqE;IACrE,OAAO,CAAC,aAAa;YAMP,aAAa;IA4B3B;;gDAE4C;YAC9B,YAAY;IAI1B;;;;;;;;;;;gFAW4E;IACtE,cAAc,CAAC,CAAC,EAClB,SAAS,EAAE,MAAM,EACjB,EAAE,EAAE,CAAC,MAAM,EAAE,GAAG,KAAK,OAAO,CAAC,CAAC,CAAC,EAC/B,IAAI,GAAE;QAAE,IAAI,CAAC,EAAE,OAAO,CAAC;QAAC,IAAI,CAAC,EAAE,MAAM,CAAC;QAAC,SAAS,CAAC,EAAE,MAAM,CAAA;KAAO,GACjE,OAAO,CAAC,CAAC,CAAC;IA+Cb;;6DAEyD;IACzD,OAAO,CAAC,aAAa;IAerB;;;qCAGiC;IACjC,OAAO,CAAC,eAAe;IAwBvB;8DAC0D;IAC1D,OAAO,CAAC,WAAW,CAAoC;IAEvD;;;;uEAImE;YACrD,SAAS;IAgEvB;;;;4CAIwC;IAClC,eAAe,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAgBvD;sBACkB;IACZ,aAAa,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAiBrD;;qEAEiE;IAC3D,qBAAqB,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,GAAG,CAAC;IAG5D;;6DAEyD;YAC3C,YAAY;IAG1B,OAAO,CAAC,WAAW;IAEnB,yCAAyC;IACzC,eAAe,IAAI,MAAM;IAEzB,0BAA0B;IACpB,UAAU,CAAC,OAAO,EAAE,aAAa,GAAG,OAAO,CAAC,IAAI,CAAC;IA4IvD,sEAAsE;IACtE,OAAO,CAAC,cAAc;IAOtB,sFAAsF;IACtF,OAAO,CAAC,gBAAgB;IAMxB;;8EAE0E;IAC1E,OAAO,CAAC,gBAAgB;IAOxB;;iDAE6C;IAC7C,OAAO,CAAC,YAAY;IAIpB;iFAC6E;IAC7E,OAAO,CAAC,kBAAkB;IAM1B;;iFAE6E;IAC7E,OAAO,CAAC,cAAc;IAKtB,mFAAmF;IACnF,OAAO,CAAC,kBAAkB;IAmB1B,sCAAsC;IAChC,WAAW,CAAC,SAAS,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,GAAG,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC;IA0ErE,yFAAyF;YAC3E,aAAa;IAqH3B;;;;;;;;;mEAS+D;IACzD,wBAAwB,CAC1B,SAAS,EAAE,MAAM,EACjB,MAAM,EAAE;QAAE,EAAE,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE,EACpC,GAAG,EAAE,MAAM,EACX,MAAM,EAAE,MAAM,EACd,KAAK,EAAE,MAAM,EAAE,GAChB,OAAO,CAAC,IAAI,CAAC;IAkDhB,0CAA0C;IAC1C;;;;;;;;;;;;;;;8DAe0D;IAC1D,OAAO,CAAC,eAAe,CAAsC;IAE7D;;;;oDAIgD;IAChD,OAAO,CAAC,eAAe,CAA6B;IAEpD;;;;;;;;;;;;OAYG;YACW,mBAAmB;IAuF3B,UAAU,CAAC,SAAS,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,GAAG,GAAG,OAAO,CAAC,MAAM,CAAC;YAkBtE,eAAe;IAolB7B,wCAAwC;IAClC,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC;YAahB,QAAQ;IA8BtB,mEAAmE;YACrD,WAAW;IAsNzB,yEAAyE;YAC3D,iBAAiB;IAsE/B,iDAAiD;YACnC,gBAAgB;IAuH9B,uCAAuC;IACvC,OAAO,CAAC,gBAAgB;IA2DxB;0EACsE;YACxD,YAAY;IAS1B;;;;;yEAKqE;IACrE,OAAO,CAAC,eAAe;IAwBvB;;;;mEAI+D;IACzD,gBAAgB,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAgCxD,iEAAiE;IAC3D,SAAS,IAAI,OAAO,CAAC,IAAI,CAAC;IAiChC;;;4EAGwE;IACxE,OAAO,CAAC,eAAe,CAAsC;IAC7D,OAAO,CAAC,iBAAiB,CAAqB;IAE9C;;yFAEqF;YACvE,UAAU;IAyBxB,sFAAsF;IAChF,sBAAsB,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAM9D;;;4CAGwC;YAC1B,aAAa;YAab,cAAc;YAqBd,eAAe;IA4B7B,kDAAkD;IAC5C,eAAe,IAAI,OAAO,CAAC,IAAI,CAAC;IAMtC,0BAA0B;IAC1B,iBAAiB,CAAC,eAAe,EAAE,MAAM,GAAG,IAAI;IAkGhD;;sEAEkE;IAC5D,WAAW,IAAI,OAAO,CAAC,IAAI,CAAC;IAYlC,yBAAyB;IACzB,gBAAgB,IAAI,IAAI;IAOxB,gFAAgF;IAChF,cAAc,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO;IAK1C;;;6EAGyE;IACnE,aAAa,IAAI,OAAO,CAAC,IAAI,CAAC;IAuHpC,6BAA6B;IACvB,YAAY,IAAI,OAAO,CAAC,IAAI,CAAC;IAQnC;;kEAE8D;IAC9D;;;;;;oDAMgD;IAChD,OAAO,CAAC,eAAe,CAAoD;IAC3E;;;;;;wEAMoE;IACpE,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,yBAAyB,CAAe;IAEhE,OAAO,CAAC,+BAA+B;IAyCvC;;;;;;;;;;;sFAWkF;IAClF,OAAO,CAAC,gBAAgB;YAkBV,cAAc;IAQ5B;;;;;;;;;;6CAUyC;IACnC,gBAAgB,CAAC,SAAS,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,EAAE,KAAK,UAAQ,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC;IAyE/G;;;2EAGuE;YACzD,sBAAsB;IAwCpC;;;;yEAIqE;IACrE;;;gFAG4E;IAC5E,OAAO,CAAC,mBAAmB,CAAqB;IAEhD;;;;;;;4EAOwE;IACxE,OAAO,CAAC,mBAAmB,CAA+B;IAC1D,OAAO,CAAC,QAAQ,CAAC,sBAAsB,CAAe;IACtD,OAAO,CAAC,QAAQ,CAAC,sBAAsB,CAAK;IAE5C,OAAO,CAAC,gBAAgB;IAQxB,OAAO,CAAC,iBAAiB;IAMzB,OAAO,CAAC,iBAAiB;IAIzB;;;;;;;;;;;;;uDAamD;IAKnD,OAAO,CAAC,iBAAiB;IAGzB,OAAO,CAAC,eAAe;IASvB;;;;;6BAKyB;IACzB,OAAO,CAAC,kBAAkB;IAI1B;;;0EAGsE;IAChE,cAAc,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;YAgBxC,eAAe;IAqV7B,2CAA2C;IAC3C,YAAY,IAAI,gBAAgB;IAIhC;;;;iEAI6D;IAC7D,OAAO,CAAC,mBAAmB,CAAqB;IAC1C,gBAAgB,CAAC,SAAS,EAAE,MAAM,EAAE,KAAK,SAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAiCrE,qEAAqE;IAC/D,uBAAuB,CACzB,aAAa,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,EAAE,YAAY,EAAE,MAAM,EACxD,WAAW,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,GACxC,OAAO,CAAC,IAAI,CAAC;IAyBhB,kDAAkD;IAC5C,kBAAkB,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IA0P1D,oDAAoD;IACpD,OAAO,CAAC,UAAU;IAalB,2DAA2D;IACrD,UAAU,CAAC,SAAS,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,GAAG,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAa/E;2EACuE;IACjE,SAAS,CAAC,SAAS,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,GAAG,MAAM,EAAE,gBAAgB,CAAC,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC;IAmFpI;;yEAEqE;IAC/D,WAAW,CAAC,SAAS,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IA0EvF;;;;;;iFAM6E;IAC7E,kBAAkB,CAAC,SAAS,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,GAAG,IAAI;IAyC/D;;iFAE6E;IAC7E,eAAe,IAAI,YAAY;IAyD/B,4DAA4D;IAC5D,OAAO,CAAC,gBAAgB;IAIxB,uEAAuE;IACvE,OAAO,CAAC,eAAe,CAAqB;IAE5C,wFAAwF;YAC1E,kBAAkB;YAOlB,mBAAmB;IA6BjC,OAAO,CAAC,cAAc,CAA+C;IACrE,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAiB;IAE1C,oDAAoD;YACtC,YAAY;IAuB1B,mFAAmF;IACnF,OAAO,CAAC,eAAe;IAevB;;;;6DAIyD;IACzD,OAAO,CAAC,oBAAoB;IAiC5B;;;wEAGoE;IACpE,OAAO,CAAC,kBAAkB;IAiB1B,gFAAgF;IAC1E,aAAa,CAAC,SAAS,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,GAAG,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAyDlF;;;;;gDAK4C;IAC5C;;;;;;;;;;;;;;;;;;;;2CAoBuC;IACvC,OAAO,CAAC,kBAAkB;YAiDZ,iBAAiB;IAsJ/B;;;;iFAI6E;YAC/D,iBAAiB;IAU/B;;oEAEgE;YAClD,cAAc;IAwE5B;;;qEAGiE;IAC3D,aAAa,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAmJrD,8EAA8E;IAC9E,OAAO,CAAC,aAAa,CAA6B;IAClD,OAAO,CAAC,kBAAkB,CAA6B;IAEvD;;;;;;;;uEAQmE;IACnE,OAAO,CAAC,sBAAsB;IA0C9B;;;sEAGkE;IAClE,OAAO,CAAC,kBAAkB;IAyB1B,iBAAiB,IAAI,IAAI;IAgEzB,yBAAyB;IACzB,gBAAgB,IAAI,IAAI;IAOxB;;;;;;;;;;;;;;;;;;;;;;;;;;;;2EA4BuE;IACvE,OAAO,CAAC,iBAAiB,CAA+C;IACxE,OAAO,CAAC,QAAQ,CAAC,oBAAoB,CAAkB;IACvD,OAAO,CAAC,QAAQ,CAAC,sBAAsB,CAAiB;IAExD,cAAc,IAAI,IAAI;IAetB,aAAa,IAAI,IAAI;YAOP,aAAa;IAmE3B,OAAO,CAAC,cAAc,CAAsB;IAC5C,OAAO,CAAC,eAAe,CAAwC;IAE/D;;+DAE2D;IAC3D,gBAAgB,IAAI,IAAI;IAwGxB,oCAAoC;IACpC,kBAAkB,IAAI,IAAI;IAa1B;2EACuE;IACvE,OAAO,CAAC,eAAe,CAAsC;IAE7D;yEACqE;YACvD,gBAAgB;IAK9B;;;;;;iDAM6C;IACvC,kBAAkB,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;YAU9C,sBAAsB;IAyGpC,2CAA2C;IACrC,eAAe,IAAI,OAAO,CAAC,IAAI,CAAC;IAStC,wCAAwC;IAClC,QAAQ,IAAI,OAAO,CAAC,IAAI,CAAC;CAelC"}
|