@diskd-ai/email-mcp 0.3.0

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.
Files changed (295) hide show
  1. package/LICENSE +155 -0
  2. package/README.md +820 -0
  3. package/dist/cli/account-commands.d.ts +10 -0
  4. package/dist/cli/account-commands.d.ts.map +1 -0
  5. package/dist/cli/account-commands.js +703 -0
  6. package/dist/cli/account-commands.js.map +1 -0
  7. package/dist/cli/config-commands.d.ts +9 -0
  8. package/dist/cli/config-commands.d.ts.map +1 -0
  9. package/dist/cli/config-commands.js +156 -0
  10. package/dist/cli/config-commands.js.map +1 -0
  11. package/dist/cli/guard.d.ts +11 -0
  12. package/dist/cli/guard.d.ts.map +1 -0
  13. package/dist/cli/guard.js +18 -0
  14. package/dist/cli/guard.js.map +1 -0
  15. package/dist/cli/install-commands.d.ts +12 -0
  16. package/dist/cli/install-commands.d.ts.map +1 -0
  17. package/dist/cli/install-commands.js +320 -0
  18. package/dist/cli/install-commands.js.map +1 -0
  19. package/dist/cli/notify.d.ts +8 -0
  20. package/dist/cli/notify.d.ts.map +1 -0
  21. package/dist/cli/notify.js +143 -0
  22. package/dist/cli/notify.js.map +1 -0
  23. package/dist/cli/providers.d.ts +13 -0
  24. package/dist/cli/providers.d.ts.map +1 -0
  25. package/dist/cli/providers.js +180 -0
  26. package/dist/cli/providers.js.map +1 -0
  27. package/dist/cli/scheduler.d.ts +8 -0
  28. package/dist/cli/scheduler.d.ts.map +1 -0
  29. package/dist/cli/scheduler.js +268 -0
  30. package/dist/cli/scheduler.js.map +1 -0
  31. package/dist/cli/setup.d.ts +12 -0
  32. package/dist/cli/setup.d.ts.map +1 -0
  33. package/dist/cli/setup.js +15 -0
  34. package/dist/cli/setup.js.map +1 -0
  35. package/dist/cli/test.d.ts +7 -0
  36. package/dist/cli/test.d.ts.map +1 -0
  37. package/dist/cli/test.js +67 -0
  38. package/dist/cli/test.js.map +1 -0
  39. package/dist/config/loader.d.ts +34 -0
  40. package/dist/config/loader.d.ts.map +1 -0
  41. package/dist/config/loader.js +339 -0
  42. package/dist/config/loader.js.map +1 -0
  43. package/dist/config/schema.d.ts +351 -0
  44. package/dist/config/schema.d.ts.map +1 -0
  45. package/dist/config/schema.js +165 -0
  46. package/dist/config/schema.js.map +1 -0
  47. package/dist/config/xdg.d.ts +27 -0
  48. package/dist/config/xdg.d.ts.map +1 -0
  49. package/dist/config/xdg.js +30 -0
  50. package/dist/config/xdg.js.map +1 -0
  51. package/dist/connections/manager.d.ts +42 -0
  52. package/dist/connections/manager.d.ts.map +1 -0
  53. package/dist/connections/manager.js +266 -0
  54. package/dist/connections/manager.js.map +1 -0
  55. package/dist/connections/types.d.ts +13 -0
  56. package/dist/connections/types.d.ts.map +1 -0
  57. package/dist/connections/types.js +2 -0
  58. package/dist/connections/types.js.map +1 -0
  59. package/dist/logging.d.ts +46 -0
  60. package/dist/logging.d.ts.map +1 -0
  61. package/dist/logging.js +63 -0
  62. package/dist/logging.js.map +1 -0
  63. package/dist/main.d.ts +13 -0
  64. package/dist/main.d.ts.map +1 -0
  65. package/dist/main.js +206 -0
  66. package/dist/main.js.map +1 -0
  67. package/dist/prompts/actions.prompt.d.ts +9 -0
  68. package/dist/prompts/actions.prompt.d.ts.map +1 -0
  69. package/dist/prompts/actions.prompt.js +64 -0
  70. package/dist/prompts/actions.prompt.js.map +1 -0
  71. package/dist/prompts/calendar.prompt.d.ts +9 -0
  72. package/dist/prompts/calendar.prompt.d.ts.map +1 -0
  73. package/dist/prompts/calendar.prompt.js +55 -0
  74. package/dist/prompts/calendar.prompt.js.map +1 -0
  75. package/dist/prompts/cleanup.prompt.d.ts +9 -0
  76. package/dist/prompts/cleanup.prompt.d.ts.map +1 -0
  77. package/dist/prompts/cleanup.prompt.js +78 -0
  78. package/dist/prompts/cleanup.prompt.js.map +1 -0
  79. package/dist/prompts/compose.prompt.d.ts +8 -0
  80. package/dist/prompts/compose.prompt.d.ts.map +1 -0
  81. package/dist/prompts/compose.prompt.js +116 -0
  82. package/dist/prompts/compose.prompt.js.map +1 -0
  83. package/dist/prompts/register.d.ts +8 -0
  84. package/dist/prompts/register.d.ts.map +1 -0
  85. package/dist/prompts/register.js +20 -0
  86. package/dist/prompts/register.js.map +1 -0
  87. package/dist/prompts/thread.prompt.d.ts +9 -0
  88. package/dist/prompts/thread.prompt.d.ts.map +1 -0
  89. package/dist/prompts/thread.prompt.js +58 -0
  90. package/dist/prompts/thread.prompt.js.map +1 -0
  91. package/dist/prompts/triage.prompt.d.ts +9 -0
  92. package/dist/prompts/triage.prompt.d.ts.map +1 -0
  93. package/dist/prompts/triage.prompt.js +64 -0
  94. package/dist/prompts/triage.prompt.js.map +1 -0
  95. package/dist/resources/accounts.resource.d.ts +9 -0
  96. package/dist/resources/accounts.resource.d.ts.map +1 -0
  97. package/dist/resources/accounts.resource.js +26 -0
  98. package/dist/resources/accounts.resource.js.map +1 -0
  99. package/dist/resources/mailboxes.resource.d.ts +10 -0
  100. package/dist/resources/mailboxes.resource.d.ts.map +1 -0
  101. package/dist/resources/mailboxes.resource.js +33 -0
  102. package/dist/resources/mailboxes.resource.js.map +1 -0
  103. package/dist/resources/register.d.ts +12 -0
  104. package/dist/resources/register.d.ts.map +1 -0
  105. package/dist/resources/register.js +20 -0
  106. package/dist/resources/register.js.map +1 -0
  107. package/dist/resources/scheduled.resource.d.ts +9 -0
  108. package/dist/resources/scheduled.resource.d.ts.map +1 -0
  109. package/dist/resources/scheduled.resource.js +31 -0
  110. package/dist/resources/scheduled.resource.js.map +1 -0
  111. package/dist/resources/stats.resource.d.ts +10 -0
  112. package/dist/resources/stats.resource.d.ts.map +1 -0
  113. package/dist/resources/stats.resource.js +45 -0
  114. package/dist/resources/stats.resource.js.map +1 -0
  115. package/dist/resources/templates.resource.d.ts +9 -0
  116. package/dist/resources/templates.resource.d.ts.map +1 -0
  117. package/dist/resources/templates.resource.js +34 -0
  118. package/dist/resources/templates.resource.js.map +1 -0
  119. package/dist/resources/unread.resource.d.ts +11 -0
  120. package/dist/resources/unread.resource.d.ts.map +1 -0
  121. package/dist/resources/unread.resource.js +46 -0
  122. package/dist/resources/unread.resource.js.map +1 -0
  123. package/dist/safety/audit.d.ts +17 -0
  124. package/dist/safety/audit.d.ts.map +1 -0
  125. package/dist/safety/audit.js +50 -0
  126. package/dist/safety/audit.js.map +1 -0
  127. package/dist/safety/rate-limiter.d.ts +22 -0
  128. package/dist/safety/rate-limiter.d.ts.map +1 -0
  129. package/dist/safety/rate-limiter.js +52 -0
  130. package/dist/safety/rate-limiter.js.map +1 -0
  131. package/dist/safety/validation.d.ts +44 -0
  132. package/dist/safety/validation.d.ts.map +1 -0
  133. package/dist/safety/validation.js +113 -0
  134. package/dist/safety/validation.js.map +1 -0
  135. package/dist/server.d.ts +10 -0
  136. package/dist/server.d.ts.map +1 -0
  137. package/dist/server.js +25 -0
  138. package/dist/server.js.map +1 -0
  139. package/dist/services/calendar.service.d.ts +22 -0
  140. package/dist/services/calendar.service.d.ts.map +1 -0
  141. package/dist/services/calendar.service.js +115 -0
  142. package/dist/services/calendar.service.js.map +1 -0
  143. package/dist/services/event-bus.d.ts +28 -0
  144. package/dist/services/event-bus.d.ts.map +1 -0
  145. package/dist/services/event-bus.js +16 -0
  146. package/dist/services/event-bus.js.map +1 -0
  147. package/dist/services/hooks.service.d.ts +77 -0
  148. package/dist/services/hooks.service.d.ts.map +1 -0
  149. package/dist/services/hooks.service.js +498 -0
  150. package/dist/services/hooks.service.js.map +1 -0
  151. package/dist/services/imap.service.d.ts +133 -0
  152. package/dist/services/imap.service.d.ts.map +1 -0
  153. package/dist/services/imap.service.js +1393 -0
  154. package/dist/services/imap.service.js.map +1 -0
  155. package/dist/services/label-strategy.d.ts +20 -0
  156. package/dist/services/label-strategy.d.ts.map +1 -0
  157. package/dist/services/label-strategy.js +237 -0
  158. package/dist/services/label-strategy.js.map +1 -0
  159. package/dist/services/local-calendar.service.d.ts +126 -0
  160. package/dist/services/local-calendar.service.d.ts.map +1 -0
  161. package/dist/services/local-calendar.service.js +428 -0
  162. package/dist/services/local-calendar.service.js.map +1 -0
  163. package/dist/services/notifier.service.d.ts +69 -0
  164. package/dist/services/notifier.service.d.ts.map +1 -0
  165. package/dist/services/notifier.service.js +319 -0
  166. package/dist/services/notifier.service.js.map +1 -0
  167. package/dist/services/oauth.service.d.ts +47 -0
  168. package/dist/services/oauth.service.d.ts.map +1 -0
  169. package/dist/services/oauth.service.js +140 -0
  170. package/dist/services/oauth.service.js.map +1 -0
  171. package/dist/services/presets.d.ts +36 -0
  172. package/dist/services/presets.d.ts.map +1 -0
  173. package/dist/services/presets.js +173 -0
  174. package/dist/services/presets.js.map +1 -0
  175. package/dist/services/reminders.service.d.ts +63 -0
  176. package/dist/services/reminders.service.d.ts.map +1 -0
  177. package/dist/services/reminders.service.js +281 -0
  178. package/dist/services/reminders.service.js.map +1 -0
  179. package/dist/services/scheduler.service.d.ts +42 -0
  180. package/dist/services/scheduler.service.d.ts.map +1 -0
  181. package/dist/services/scheduler.service.js +260 -0
  182. package/dist/services/scheduler.service.js.map +1 -0
  183. package/dist/services/smtp.service.d.ts +40 -0
  184. package/dist/services/smtp.service.d.ts.map +1 -0
  185. package/dist/services/smtp.service.js +151 -0
  186. package/dist/services/smtp.service.js.map +1 -0
  187. package/dist/services/template.service.d.ts +33 -0
  188. package/dist/services/template.service.d.ts.map +1 -0
  189. package/dist/services/template.service.js +123 -0
  190. package/dist/services/template.service.js.map +1 -0
  191. package/dist/services/watcher.service.d.ts +36 -0
  192. package/dist/services/watcher.service.d.ts.map +1 -0
  193. package/dist/services/watcher.service.js +241 -0
  194. package/dist/services/watcher.service.js.map +1 -0
  195. package/dist/tools/accounts.tool.d.ts +7 -0
  196. package/dist/tools/accounts.tool.d.ts.map +1 -0
  197. package/dist/tools/accounts.tool.js +29 -0
  198. package/dist/tools/accounts.tool.js.map +1 -0
  199. package/dist/tools/analytics.tool.d.ts +9 -0
  200. package/dist/tools/analytics.tool.d.ts.map +1 -0
  201. package/dist/tools/analytics.tool.js +27 -0
  202. package/dist/tools/analytics.tool.js.map +1 -0
  203. package/dist/tools/attachments.tool.d.ts +7 -0
  204. package/dist/tools/attachments.tool.d.ts.map +1 -0
  205. package/dist/tools/attachments.tool.js +45 -0
  206. package/dist/tools/attachments.tool.js.map +1 -0
  207. package/dist/tools/bulk.tool.d.ts +7 -0
  208. package/dist/tools/bulk.tool.d.ts.map +1 -0
  209. package/dist/tools/bulk.tool.js +75 -0
  210. package/dist/tools/bulk.tool.js.map +1 -0
  211. package/dist/tools/calendar.tool.d.ts +19 -0
  212. package/dist/tools/calendar.tool.d.ts.map +1 -0
  213. package/dist/tools/calendar.tool.js +538 -0
  214. package/dist/tools/calendar.tool.js.map +1 -0
  215. package/dist/tools/contacts.tool.d.ts +7 -0
  216. package/dist/tools/contacts.tool.d.ts.map +1 -0
  217. package/dist/tools/contacts.tool.js +44 -0
  218. package/dist/tools/contacts.tool.js.map +1 -0
  219. package/dist/tools/drafts.tool.d.ts +8 -0
  220. package/dist/tools/drafts.tool.d.ts.map +1 -0
  221. package/dist/tools/drafts.tool.js +92 -0
  222. package/dist/tools/drafts.tool.js.map +1 -0
  223. package/dist/tools/emails.tool.d.ts +7 -0
  224. package/dist/tools/emails.tool.d.ts.map +1 -0
  225. package/dist/tools/emails.tool.js +400 -0
  226. package/dist/tools/emails.tool.js.map +1 -0
  227. package/dist/tools/folders.tool.d.ts +7 -0
  228. package/dist/tools/folders.tool.d.ts.map +1 -0
  229. package/dist/tools/folders.tool.js +111 -0
  230. package/dist/tools/folders.tool.js.map +1 -0
  231. package/dist/tools/health.tool.d.ts +10 -0
  232. package/dist/tools/health.tool.d.ts.map +1 -0
  233. package/dist/tools/health.tool.js +78 -0
  234. package/dist/tools/health.tool.js.map +1 -0
  235. package/dist/tools/label.tool.d.ts +11 -0
  236. package/dist/tools/label.tool.d.ts.map +1 -0
  237. package/dist/tools/label.tool.js +165 -0
  238. package/dist/tools/label.tool.js.map +1 -0
  239. package/dist/tools/locate.tool.d.ts +11 -0
  240. package/dist/tools/locate.tool.d.ts.map +1 -0
  241. package/dist/tools/locate.tool.js +59 -0
  242. package/dist/tools/locate.tool.js.map +1 -0
  243. package/dist/tools/mailboxes.tool.d.ts +7 -0
  244. package/dist/tools/mailboxes.tool.d.ts.map +1 -0
  245. package/dist/tools/mailboxes.tool.js +38 -0
  246. package/dist/tools/mailboxes.tool.js.map +1 -0
  247. package/dist/tools/manage.tool.d.ts +7 -0
  248. package/dist/tools/manage.tool.d.ts.map +1 -0
  249. package/dist/tools/manage.tool.js +125 -0
  250. package/dist/tools/manage.tool.js.map +1 -0
  251. package/dist/tools/register.d.ts +20 -0
  252. package/dist/tools/register.d.ts.map +1 -0
  253. package/dist/tools/register.js +53 -0
  254. package/dist/tools/register.js.map +1 -0
  255. package/dist/tools/scheduler.tool.d.ts +9 -0
  256. package/dist/tools/scheduler.tool.d.ts.map +1 -0
  257. package/dist/tools/scheduler.tool.js +104 -0
  258. package/dist/tools/scheduler.tool.js.map +1 -0
  259. package/dist/tools/send.tool.d.ts +7 -0
  260. package/dist/tools/send.tool.d.ts.map +1 -0
  261. package/dist/tools/send.tool.js +123 -0
  262. package/dist/tools/send.tool.js.map +1 -0
  263. package/dist/tools/templates.tool.d.ts +12 -0
  264. package/dist/tools/templates.tool.d.ts.map +1 -0
  265. package/dist/tools/templates.tool.js +140 -0
  266. package/dist/tools/templates.tool.js.map +1 -0
  267. package/dist/tools/thread.tool.d.ts +10 -0
  268. package/dist/tools/thread.tool.d.ts.map +1 -0
  269. package/dist/tools/thread.tool.js +146 -0
  270. package/dist/tools/thread.tool.js.map +1 -0
  271. package/dist/tools/watcher.tool.d.ts +9 -0
  272. package/dist/tools/watcher.tool.d.ts.map +1 -0
  273. package/dist/tools/watcher.tool.js +282 -0
  274. package/dist/tools/watcher.tool.js.map +1 -0
  275. package/dist/types/index.d.ts +271 -0
  276. package/dist/types/index.d.ts.map +1 -0
  277. package/dist/types/index.js +5 -0
  278. package/dist/types/index.js.map +1 -0
  279. package/dist/utils/calendar-notes.d.ts +31 -0
  280. package/dist/utils/calendar-notes.d.ts.map +1 -0
  281. package/dist/utils/calendar-notes.js +99 -0
  282. package/dist/utils/calendar-notes.js.map +1 -0
  283. package/dist/utils/calendar-state.d.ts +27 -0
  284. package/dist/utils/calendar-state.d.ts.map +1 -0
  285. package/dist/utils/calendar-state.js +85 -0
  286. package/dist/utils/calendar-state.js.map +1 -0
  287. package/dist/utils/conference-details.d.ts +12 -0
  288. package/dist/utils/conference-details.d.ts.map +1 -0
  289. package/dist/utils/conference-details.js +71 -0
  290. package/dist/utils/conference-details.js.map +1 -0
  291. package/dist/utils/meeting-url.d.ts +10 -0
  292. package/dist/utils/meeting-url.d.ts.map +1 -0
  293. package/dist/utils/meeting-url.js +30 -0
  294. package/dist/utils/meeting-url.js.map +1 -0
  295. package/package.json +108 -0
@@ -0,0 +1,15 @@
1
+ /**
2
+ * Interactive setup wizard for email-mcp.
3
+ *
4
+ * Legacy entry point — delegates to `account add`.
5
+ */
6
+ import runAccountCommand from './account-commands.js';
7
+ /**
8
+ * Run the setup wizard.
9
+ *
10
+ * @deprecated Use `email-mcp account add` instead. This alias is kept for backwards-compatibility.
11
+ */
12
+ export default async function runSetup() {
13
+ await runAccountCommand('add');
14
+ }
15
+ //# sourceMappingURL=setup.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"setup.js","sourceRoot":"","sources":["../../src/cli/setup.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,iBAAiB,MAAM,uBAAuB,CAAC;AAEtD;;;;GAIG;AACH,MAAM,CAAC,OAAO,CAAC,KAAK,UAAU,QAAQ;IACpC,MAAM,iBAAiB,CAAC,KAAK,CAAC,CAAC;AACjC,CAAC"}
@@ -0,0 +1,7 @@
1
+ /**
2
+ * Connection test command.
3
+ *
4
+ * Tests IMAP and SMTP connections for all or a specific account.
5
+ */
6
+ export default function runTest(accountFilter?: string): Promise<void>;
7
+ //# sourceMappingURL=test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"test.d.ts","sourceRoot":"","sources":["../../src/cli/test.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAuCH,wBAA8B,OAAO,CAAC,aAAa,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAoC3E"}
@@ -0,0 +1,67 @@
1
+ /**
2
+ * Connection test command.
3
+ *
4
+ * Tests IMAP and SMTP connections for all or a specific account.
5
+ */
6
+ import { intro, log, outro, spinner as p_spinner } from '@clack/prompts';
7
+ import { loadConfig } from '../config/loader.js';
8
+ import ConnectionManager from '../connections/manager.js';
9
+ async function testAccount(account) {
10
+ log.step(`Testing account: ${account.name} (${account.email})`);
11
+ let ok = true;
12
+ // Test IMAP
13
+ const spinner = p_spinner();
14
+ spinner.start(`IMAP ${account.imap.host}:${account.imap.port}...`);
15
+ const imapResult = await ConnectionManager.testImap(account);
16
+ if (imapResult.success) {
17
+ spinner.stop(`IMAP ✓ ${account.imap.host}:${account.imap.port} — ${imapResult.details?.messages} messages, ${imapResult.details?.folders} folders`);
18
+ }
19
+ else {
20
+ spinner.stop(`IMAP ✗ ${account.imap.host}:${account.imap.port} — ${imapResult.error}`);
21
+ ok = false;
22
+ }
23
+ // Test SMTP
24
+ spinner.start(`SMTP ${account.smtp.host}:${account.smtp.port}...`);
25
+ const smtpResult = await ConnectionManager.testSmtp(account);
26
+ if (smtpResult.success) {
27
+ spinner.stop(`SMTP ✓ ${account.smtp.host}:${account.smtp.port} — authenticated`);
28
+ }
29
+ else {
30
+ spinner.stop(`SMTP ✗ ${account.smtp.host}:${account.smtp.port} — ${smtpResult.error}`);
31
+ ok = false;
32
+ }
33
+ return ok;
34
+ }
35
+ export default async function runTest(accountFilter) {
36
+ intro('email-mcp test');
37
+ const config = await loadConfig();
38
+ const accounts = accountFilter
39
+ ? config.accounts.filter((a) => a.name === accountFilter)
40
+ : config.accounts;
41
+ if (accounts.length === 0) {
42
+ if (accountFilter) {
43
+ log.error(`Account "${accountFilter}" not found. Available: ${config.accounts.map((a) => a.name).join(', ')}`);
44
+ }
45
+ else {
46
+ log.error('No accounts configured.');
47
+ }
48
+ throw new Error('No matching accounts found');
49
+ }
50
+ let allPassed = true;
51
+ // Sequential testing — connections can't be parallelized reliably
52
+ // eslint-disable-next-line no-restricted-syntax
53
+ for (const account of accounts) {
54
+ // eslint-disable-next-line no-await-in-loop
55
+ const ok = await testAccount(account);
56
+ if (!ok)
57
+ allPassed = false;
58
+ }
59
+ if (allPassed) {
60
+ outro('All accounts OK ✅');
61
+ }
62
+ else {
63
+ outro('Some connections failed ❌');
64
+ throw new Error('Connection tests failed');
65
+ }
66
+ }
67
+ //# sourceMappingURL=test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"test.js","sourceRoot":"","sources":["../../src/cli/test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,34 @@
1
+ /**
2
+ * Configuration loader.
3
+ *
4
+ * Precedence: environment variables → TOML config file → defaults.
5
+ */
6
+ import type { AppConfig } from '../types/index.js';
7
+ import type { RawAppConfig } from './schema.js';
8
+ import { CONFIG_FILE, xdg } from './xdg.js';
9
+ /**
10
+ * Load raw (snake_case) config from TOML file without normalization.
11
+ * Useful for read-modify-write operations in CLI commands.
12
+ * Throws if no config file exists or validation fails.
13
+ */
14
+ export declare function loadRawConfig(configPath?: string): Promise<RawAppConfig>;
15
+ /**
16
+ * Load and validate configuration from env vars or TOML file.
17
+ * Throws on validation errors.
18
+ */
19
+ export declare function loadConfig(configPath?: string): Promise<AppConfig>;
20
+ /**
21
+ * Save configuration to a TOML file.
22
+ */
23
+ export declare function saveConfig(config: RawAppConfig, filePath?: string): Promise<void>;
24
+ /**
25
+ * Generate a template TOML config string.
26
+ */
27
+ export declare function generateTemplate(): string;
28
+ /**
29
+ * Check if a config file exists at the default XDG path.
30
+ */
31
+ export declare function configExists(filePath?: string): Promise<boolean>;
32
+ /** Re-export for convenience */
33
+ export { CONFIG_FILE, xdg };
34
+ //# sourceMappingURL=loader.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"loader.d.ts","sourceRoot":"","sources":["../../src/config/loader.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAMH,OAAO,KAAK,EAAiB,SAAS,EAA0B,MAAM,mBAAmB,CAAC;AAC1F,OAAO,KAAK,EAAoB,YAAY,EAAE,MAAM,aAAa,CAAC;AAElE,OAAO,EAAE,WAAW,EAAE,GAAG,EAAE,MAAM,UAAU,CAAC;AA0O5C;;;;GAIG;AACH,wBAAsB,aAAa,CAAC,UAAU,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,YAAY,CAAC,CAO9E;AAED;;;GAGG;AACH,wBAAsB,UAAU,CAAC,UAAU,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,SAAS,CAAC,CAqBxE;AAED;;GAEG;AACH,wBAAsB,UAAU,CAC9B,MAAM,EAAE,YAAY,EACpB,QAAQ,GAAE,MAAoB,GAC7B,OAAO,CAAC,IAAI,CAAC,CAKf;AAED;;GAEG;AACH,wBAAgB,gBAAgB,IAAI,MAAM,CAmEzC;AAED;;GAEG;AACH,wBAAsB,YAAY,CAAC,QAAQ,GAAE,MAAoB,GAAG,OAAO,CAAC,OAAO,CAAC,CAOnF;AAED,gCAAgC;AAChC,OAAO,EAAE,WAAW,EAAE,GAAG,EAAE,CAAC"}
@@ -0,0 +1,339 @@
1
+ /**
2
+ * Configuration loader.
3
+ *
4
+ * Precedence: environment variables → TOML config file → defaults.
5
+ */
6
+ import fs from 'node:fs/promises';
7
+ import path from 'node:path';
8
+ import { parse as parseTOML, stringify as stringifyTOML } from 'smol-toml';
9
+ import { AppConfigFileSchema } from './schema.js';
10
+ import { CONFIG_FILE, xdg } from './xdg.js';
11
+ // ---------------------------------------------------------------------------
12
+ // Environment variable loader (single-account quick setup)
13
+ // ---------------------------------------------------------------------------
14
+ function loadFromEnv() {
15
+ const email = process.env.MCP_EMAIL_ADDRESS;
16
+ const password = process.env.MCP_EMAIL_PASSWORD;
17
+ const imapHost = process.env.MCP_EMAIL_IMAP_HOST;
18
+ const smtpHost = process.env.MCP_EMAIL_SMTP_HOST;
19
+ if (!email || !imapHost || !smtpHost) {
20
+ return null;
21
+ }
22
+ // Need either password or OAuth2 env vars
23
+ const oauth2Provider = process.env.MCP_EMAIL_OAUTH2_PROVIDER;
24
+ if (!password && !oauth2Provider) {
25
+ return null;
26
+ }
27
+ const oauth2 = oauth2Provider
28
+ ? {
29
+ provider: oauth2Provider,
30
+ client_id: process.env.MCP_EMAIL_OAUTH2_CLIENT_ID ?? '',
31
+ client_secret: process.env.MCP_EMAIL_OAUTH2_CLIENT_SECRET ?? '',
32
+ refresh_token: process.env.MCP_EMAIL_OAUTH2_REFRESH_TOKEN ?? '',
33
+ }
34
+ : undefined;
35
+ return {
36
+ settings: {
37
+ rate_limit: parseInt(process.env.MCP_EMAIL_RATE_LIMIT ?? '10', 10),
38
+ read_only: process.env.MCP_EMAIL_READ_ONLY === 'true',
39
+ watcher: {
40
+ enabled: process.env.MCP_EMAIL_WATCHER_ENABLED === 'true',
41
+ folders: (process.env.MCP_EMAIL_WATCHER_FOLDERS ?? 'INBOX')
42
+ .split(',')
43
+ .map((f) => f.trim())
44
+ .filter(Boolean),
45
+ idle_timeout: parseInt(process.env.MCP_EMAIL_WATCHER_IDLE_TIMEOUT ?? '1740', 10),
46
+ },
47
+ hooks: {
48
+ on_new_email: process.env.MCP_EMAIL_HOOK_ON_NEW_EMAIL ?? 'notify',
49
+ preset: process.env.MCP_EMAIL_HOOK_PRESET ?? 'priority-focus',
50
+ auto_label: process.env.MCP_EMAIL_HOOK_AUTO_LABEL === 'true',
51
+ auto_flag: process.env.MCP_EMAIL_HOOK_AUTO_FLAG === 'true',
52
+ batch_delay: parseInt(process.env.MCP_EMAIL_HOOK_BATCH_DELAY ?? '5', 10),
53
+ custom_instructions: process.env.MCP_EMAIL_HOOK_CUSTOM_INSTRUCTIONS,
54
+ rules: [],
55
+ alerts: {
56
+ desktop: process.env.MCP_EMAIL_ALERT_DESKTOP === 'true',
57
+ sound: process.env.MCP_EMAIL_ALERT_SOUND === 'true',
58
+ urgency_threshold: process.env.MCP_EMAIL_ALERT_URGENCY_THRESHOLD ?? 'high',
59
+ webhook_url: process.env.MCP_EMAIL_ALERT_WEBHOOK_URL ?? '',
60
+ webhook_events: ['urgent', 'high'],
61
+ },
62
+ auto_calendar: process.env.MCP_EMAIL_HOOK_AUTO_CALENDAR === 'true',
63
+ calendar_name: process.env.MCP_EMAIL_HOOK_CALENDAR_NAME ?? '',
64
+ calendar_alarm_minutes: parseInt(process.env.MCP_EMAIL_HOOK_CALENDAR_ALARM_MINUTES ?? '15', 10),
65
+ calendar_confirm: process.env.MCP_EMAIL_HOOK_CALENDAR_CONFIRM !== 'false',
66
+ },
67
+ },
68
+ accounts: [
69
+ {
70
+ name: process.env.MCP_EMAIL_ACCOUNT_NAME ?? 'default',
71
+ email,
72
+ full_name: process.env.MCP_EMAIL_FULL_NAME,
73
+ username: process.env.MCP_EMAIL_USERNAME,
74
+ password,
75
+ oauth2,
76
+ imap: {
77
+ host: imapHost,
78
+ port: parseInt(process.env.MCP_EMAIL_IMAP_PORT ?? '993', 10),
79
+ tls: process.env.MCP_EMAIL_IMAP_TLS !== 'false',
80
+ starttls: process.env.MCP_EMAIL_IMAP_STARTTLS === 'true',
81
+ verify_ssl: process.env.MCP_EMAIL_IMAP_VERIFY_SSL !== 'false',
82
+ },
83
+ smtp: {
84
+ host: smtpHost,
85
+ port: parseInt(process.env.MCP_EMAIL_SMTP_PORT ?? '465', 10),
86
+ tls: process.env.MCP_EMAIL_SMTP_TLS !== 'false',
87
+ starttls: process.env.MCP_EMAIL_SMTP_STARTTLS === 'true',
88
+ verify_ssl: process.env.MCP_EMAIL_SMTP_VERIFY_SSL !== 'false',
89
+ pool: {
90
+ enabled: process.env.MCP_EMAIL_SMTP_POOL_ENABLED !== 'false',
91
+ max_connections: parseInt(process.env.MCP_EMAIL_SMTP_POOL_MAX_CONNECTIONS ?? '1', 10),
92
+ max_messages: parseInt(process.env.MCP_EMAIL_SMTP_POOL_MAX_MESSAGES ?? '100', 10),
93
+ },
94
+ },
95
+ },
96
+ ],
97
+ };
98
+ }
99
+ // ---------------------------------------------------------------------------
100
+ // TOML file loader
101
+ // ---------------------------------------------------------------------------
102
+ async function loadFromFile(filePath = CONFIG_FILE) {
103
+ try {
104
+ const content = await fs.readFile(filePath, 'utf-8');
105
+ const parsed = parseTOML(content);
106
+ return parsed;
107
+ }
108
+ catch {
109
+ return null;
110
+ }
111
+ }
112
+ // ---------------------------------------------------------------------------
113
+ // Normalize raw config → typed AppConfig
114
+ // ---------------------------------------------------------------------------
115
+ function normalizeOAuth2(raw) {
116
+ return {
117
+ provider: raw.provider,
118
+ clientId: raw.client_id,
119
+ clientSecret: raw.client_secret,
120
+ refreshToken: raw.refresh_token,
121
+ tokenUrl: raw.token_url,
122
+ authUrl: raw.auth_url,
123
+ scopes: raw.scopes,
124
+ };
125
+ }
126
+ function normalizeAccount(raw) {
127
+ return {
128
+ name: raw.name,
129
+ email: raw.email,
130
+ fullName: raw.full_name,
131
+ username: raw.username ?? raw.email,
132
+ password: raw.password,
133
+ oauth2: raw.oauth2 ? normalizeOAuth2(raw.oauth2) : undefined,
134
+ imap: {
135
+ host: raw.imap.host,
136
+ port: raw.imap.port,
137
+ tls: raw.imap.tls,
138
+ starttls: raw.imap.starttls,
139
+ verifySsl: raw.imap.verify_ssl,
140
+ },
141
+ smtp: {
142
+ host: raw.smtp.host,
143
+ port: raw.smtp.port,
144
+ tls: raw.smtp.tls,
145
+ starttls: raw.smtp.starttls,
146
+ verifySsl: raw.smtp.verify_ssl,
147
+ pool: {
148
+ enabled: raw.smtp.pool.enabled,
149
+ maxConnections: raw.smtp.pool.max_connections,
150
+ maxMessages: raw.smtp.pool.max_messages,
151
+ },
152
+ },
153
+ };
154
+ }
155
+ function normalizeHookRule(raw) {
156
+ return {
157
+ name: raw.name,
158
+ match: {
159
+ from: raw.match.from,
160
+ to: raw.match.to,
161
+ subject: raw.match.subject,
162
+ },
163
+ actions: {
164
+ labels: Array.isArray(raw.actions.labels) ? raw.actions.labels : undefined,
165
+ flag: typeof raw.actions.flag === 'boolean' ? raw.actions.flag : undefined,
166
+ markRead: typeof raw.actions.mark_read === 'boolean' ? raw.actions.mark_read : undefined,
167
+ alert: typeof raw.actions.alert === 'boolean' ? raw.actions.alert : undefined,
168
+ addToCalendar: typeof raw.actions.add_to_calendar === 'boolean' ? raw.actions.add_to_calendar : undefined,
169
+ },
170
+ };
171
+ }
172
+ function normalizeConfig(raw) {
173
+ return {
174
+ settings: {
175
+ rateLimit: raw.settings.rate_limit,
176
+ readOnly: raw.settings.read_only,
177
+ watcher: {
178
+ enabled: raw.settings.watcher.enabled,
179
+ folders: raw.settings.watcher.folders,
180
+ idleTimeout: raw.settings.watcher.idle_timeout,
181
+ },
182
+ hooks: {
183
+ onNewEmail: raw.settings.hooks.on_new_email,
184
+ preset: raw.settings.hooks.preset,
185
+ autoLabel: raw.settings.hooks.auto_label,
186
+ autoFlag: raw.settings.hooks.auto_flag,
187
+ batchDelay: raw.settings.hooks.batch_delay,
188
+ customInstructions: raw.settings.hooks.custom_instructions,
189
+ systemPrompt: raw.settings.hooks.system_prompt,
190
+ rules: (raw.settings.hooks.rules ?? []).map(normalizeHookRule),
191
+ alerts: {
192
+ desktop: raw.settings.hooks.alerts?.desktop ?? false,
193
+ sound: raw.settings.hooks.alerts?.sound ?? false,
194
+ urgencyThreshold: raw.settings.hooks.alerts?.urgency_threshold ?? 'high',
195
+ webhookUrl: raw.settings.hooks.alerts?.webhook_url ?? '',
196
+ webhookEvents: raw.settings.hooks.alerts?.webhook_events ?? ['urgent', 'high'],
197
+ },
198
+ autoCalendar: raw.settings.hooks.auto_calendar ?? false,
199
+ calendarName: raw.settings.hooks.calendar_name ?? '',
200
+ calendarAlarmMinutes: raw.settings.hooks.calendar_alarm_minutes ?? 15,
201
+ calendarConfirm: raw.settings.hooks.calendar_confirm ?? true,
202
+ },
203
+ },
204
+ accounts: raw.accounts.map(normalizeAccount),
205
+ };
206
+ }
207
+ // ---------------------------------------------------------------------------
208
+ // Public API
209
+ // ---------------------------------------------------------------------------
210
+ /**
211
+ * Load raw (snake_case) config from TOML file without normalization.
212
+ * Useful for read-modify-write operations in CLI commands.
213
+ * Throws if no config file exists or validation fails.
214
+ */
215
+ export async function loadRawConfig(configPath) {
216
+ const filePath = configPath ?? CONFIG_FILE;
217
+ const fileConfig = await loadFromFile(filePath);
218
+ if (!fileConfig) {
219
+ throw new Error(`No config file found at: ${filePath}`);
220
+ }
221
+ return AppConfigFileSchema.parse(fileConfig);
222
+ }
223
+ /**
224
+ * Load and validate configuration from env vars or TOML file.
225
+ * Throws on validation errors.
226
+ */
227
+ export async function loadConfig(configPath) {
228
+ // 1. Try environment variables first
229
+ const envConfig = loadFromEnv();
230
+ if (envConfig) {
231
+ const validated = AppConfigFileSchema.parse(envConfig);
232
+ return normalizeConfig(validated);
233
+ }
234
+ // 2. Fall back to TOML config file
235
+ const fileConfig = await loadFromFile(configPath);
236
+ if (fileConfig) {
237
+ const validated = AppConfigFileSchema.parse(fileConfig);
238
+ return normalizeConfig(validated);
239
+ }
240
+ throw new Error(`No configuration found.\n\n` +
241
+ `Set environment variables (MCP_EMAIL_ADDRESS, MCP_EMAIL_PASSWORD, etc.)\n` +
242
+ `or create a config file at: ${configPath ?? CONFIG_FILE}\n\n` +
243
+ `Run 'email-mcp setup' for interactive configuration.`);
244
+ }
245
+ /**
246
+ * Save configuration to a TOML file.
247
+ */
248
+ export async function saveConfig(config, filePath = CONFIG_FILE) {
249
+ const dir = path.dirname(filePath);
250
+ await fs.mkdir(dir, { recursive: true });
251
+ const toml = stringifyTOML(config);
252
+ await fs.writeFile(filePath, toml, 'utf-8');
253
+ }
254
+ /**
255
+ * Generate a template TOML config string.
256
+ */
257
+ export function generateTemplate() {
258
+ return `# Email MCP Server Configuration
259
+ # Location: ${CONFIG_FILE}
260
+
261
+ [settings]
262
+ rate_limit = 10 # max emails per minute per account
263
+ read_only = false # set to true to disable all write operations
264
+
265
+ # [settings.watcher]
266
+ # enabled = false # enable IMAP IDLE real-time monitoring
267
+ # folders = ["INBOX"] # folders to watch per account
268
+ # idle_timeout = 1740 # seconds (29 min, IMAP max is 30)
269
+
270
+ # [settings.hooks]
271
+ # on_new_email = "notify" # "triage" (AI) | "notify" (log) | "none"
272
+ # preset = "priority-focus" # "inbox-zero" | "gtd" | "priority-focus" | "notification-only" | "custom"
273
+ # auto_label = false # auto-apply AI-suggested labels
274
+ # auto_flag = false # auto-flag urgent emails
275
+ # batch_delay = 5 # seconds to batch before processing
276
+ # custom_instructions = "I'm a software engineer. Emails from @company.com are high priority."
277
+ # system_prompt = "" # full override (only when preset = "custom")
278
+
279
+ # Static rules — run BEFORE AI triage, skip AI if matched
280
+ # [[settings.hooks.rules]]
281
+ # name = "GitHub Notifications"
282
+ # match = { from = "*@github.com" }
283
+ # actions = { labels = ["Dev"], mark_read = true }
284
+ #
285
+ # [[settings.hooks.rules]]
286
+ # name = "VIP Contacts"
287
+ # match = { from = "ceo@company.com" }
288
+ # actions = { flag = true, alert = true, labels = ["VIP"] }
289
+
290
+ # [settings.hooks.alerts]
291
+ # desktop = false # enable OS-level desktop notifications
292
+ # sound = false # play sound for urgent emails
293
+ # urgency_threshold = "high" # minimum priority: "urgent" | "high" | "normal" | "low"
294
+ # webhook_url = "" # HTTP POST to Slack/Discord/ntfy.sh/etc.
295
+ # webhook_events = ["urgent", "high"] # which priorities trigger webhook
296
+
297
+ [[accounts]]
298
+ name = "personal"
299
+ email = "you@example.com"
300
+ full_name = "Your Name"
301
+ # username defaults to email if omitted
302
+ # username = "you@example.com"
303
+ password = "your-app-password"
304
+
305
+ [accounts.imap]
306
+ host = "imap.example.com"
307
+ port = 993
308
+ tls = true
309
+ starttls = false
310
+ verify_ssl = true
311
+
312
+ [accounts.smtp]
313
+ host = "smtp.example.com"
314
+ port = 465
315
+ tls = true
316
+ starttls = false
317
+ verify_ssl = true
318
+
319
+ [accounts.smtp.pool]
320
+ enabled = true
321
+ max_connections = 1
322
+ max_messages = 100
323
+ `;
324
+ }
325
+ /**
326
+ * Check if a config file exists at the default XDG path.
327
+ */
328
+ export async function configExists(filePath = CONFIG_FILE) {
329
+ try {
330
+ await fs.access(filePath);
331
+ return true;
332
+ }
333
+ catch {
334
+ return false;
335
+ }
336
+ }
337
+ /** Re-export for convenience */
338
+ export { CONFIG_FILE, xdg };
339
+ //# sourceMappingURL=loader.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"loader.js","sourceRoot":"","sources":["../../src/config/loader.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,MAAM,kBAAkB,CAAC;AAClC,OAAO,IAAI,MAAM,WAAW,CAAC;AAE7B,OAAO,EAAE,KAAK,IAAI,SAAS,EAAE,SAAS,IAAI,aAAa,EAAE,MAAM,WAAW,CAAC;AAG3E,OAAO,EAAE,mBAAmB,EAAE,MAAM,aAAa,CAAC;AAClD,OAAO,EAAE,WAAW,EAAE,GAAG,EAAE,MAAM,UAAU,CAAC;AAE5C,8EAA8E;AAC9E,2DAA2D;AAC3D,8EAA8E;AAE9E,SAAS,WAAW;IAClB,MAAM,KAAK,GAAG,OAAO,CAAC,GAAG,CAAC,iBAAiB,CAAC;IAC5C,MAAM,QAAQ,GAAG,OAAO,CAAC,GAAG,CAAC,kBAAkB,CAAC;IAChD,MAAM,QAAQ,GAAG,OAAO,CAAC,GAAG,CAAC,mBAAmB,CAAC;IACjD,MAAM,QAAQ,GAAG,OAAO,CAAC,GAAG,CAAC,mBAAmB,CAAC;IAEjD,IAAI,CAAC,KAAK,IAAI,CAAC,QAAQ,IAAI,CAAC,QAAQ,EAAE,CAAC;QACrC,OAAO,IAAI,CAAC;IACd,CAAC;IAED,0CAA0C;IAC1C,MAAM,cAAc,GAAG,OAAO,CAAC,GAAG,CAAC,yBAAyB,CAAC;IAC7D,IAAI,CAAC,QAAQ,IAAI,CAAC,cAAc,EAAE,CAAC;QACjC,OAAO,IAAI,CAAC;IACd,CAAC;IAED,MAAM,MAAM,GAAG,cAAc;QAC3B,CAAC,CAAC;YACE,QAAQ,EAAE,cAAmD;YAC7D,SAAS,EAAE,OAAO,CAAC,GAAG,CAAC,0BAA0B,IAAI,EAAE;YACvD,aAAa,EAAE,OAAO,CAAC,GAAG,CAAC,8BAA8B,IAAI,EAAE;YAC/D,aAAa,EAAE,OAAO,CAAC,GAAG,CAAC,8BAA8B,IAAI,EAAE;SAChE;QACH,CAAC,CAAC,SAAS,CAAC;IAEd,OAAO;QACL,QAAQ,EAAE;YACR,UAAU,EAAE,QAAQ,CAAC,OAAO,CAAC,GAAG,CAAC,oBAAoB,IAAI,IAAI,EAAE,EAAE,CAAC;YAClE,SAAS,EAAE,OAAO,CAAC,GAAG,CAAC,mBAAmB,KAAK,MAAM;YACrD,OAAO,EAAE;gBACP,OAAO,EAAE,OAAO,CAAC,GAAG,CAAC,yBAAyB,KAAK,MAAM;gBACzD,OAAO,EAAE,CAAC,OAAO,CAAC,GAAG,CAAC,yBAAyB,IAAI,OAAO,CAAC;qBACxD,KAAK,CAAC,GAAG,CAAC;qBACV,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;qBACpB,MAAM,CAAC,OAAO,CAAC;gBAClB,YAAY,EAAE,QAAQ,CAAC,OAAO,CAAC,GAAG,CAAC,8BAA8B,IAAI,MAAM,EAAE,EAAE,CAAC;aACjF;YACD,KAAK,EAAE;gBACL,YAAY,EACT,OAAO,CAAC,GAAG,CAAC,2BAA4D,IAAI,QAAQ;gBACvF,MAAM,EACH,OAAO,CAAC,GAAG,CAAC,qBAKA,IAAI,gBAAgB;gBACnC,UAAU,EAAE,OAAO,CAAC,GAAG,CAAC,yBAAyB,KAAK,MAAM;gBAC5D,SAAS,EAAE,OAAO,CAAC,GAAG,CAAC,wBAAwB,KAAK,MAAM;gBAC1D,WAAW,EAAE,QAAQ,CAAC,OAAO,CAAC,GAAG,CAAC,0BAA0B,IAAI,GAAG,EAAE,EAAE,CAAC;gBACxE,mBAAmB,EAAE,OAAO,CAAC,GAAG,CAAC,kCAAkC;gBACnE,KAAK,EAAE,EAAE;gBACT,MAAM,EAAE;oBACN,OAAO,EAAE,OAAO,CAAC,GAAG,CAAC,uBAAuB,KAAK,MAAM;oBACvD,KAAK,EAAE,OAAO,CAAC,GAAG,CAAC,qBAAqB,KAAK,MAAM;oBACnD,iBAAiB,EACd,OAAO,CAAC,GAAG,CAAC,iCAIH,IAAI,MAAM;oBACtB,WAAW,EAAE,OAAO,CAAC,GAAG,CAAC,2BAA2B,IAAI,EAAE;oBAC1D,cAAc,EAAE,CAAC,QAAQ,EAAE,MAAM,CAAC;iBACnC;gBACD,aAAa,EAAE,OAAO,CAAC,GAAG,CAAC,4BAA4B,KAAK,MAAM;gBAClE,aAAa,EAAE,OAAO,CAAC,GAAG,CAAC,4BAA4B,IAAI,EAAE;gBAC7D,sBAAsB,EAAE,QAAQ,CAC9B,OAAO,CAAC,GAAG,CAAC,qCAAqC,IAAI,IAAI,EACzD,EAAE,CACH;gBACD,gBAAgB,EAAE,OAAO,CAAC,GAAG,CAAC,+BAA+B,KAAK,OAAO;aAC1E;SACF;QACD,QAAQ,EAAE;YACR;gBACE,IAAI,EAAE,OAAO,CAAC,GAAG,CAAC,sBAAsB,IAAI,SAAS;gBACrD,KAAK;gBACL,SAAS,EAAE,OAAO,CAAC,GAAG,CAAC,mBAAmB;gBAC1C,QAAQ,EAAE,OAAO,CAAC,GAAG,CAAC,kBAAkB;gBACxC,QAAQ;gBACR,MAAM;gBACN,IAAI,EAAE;oBACJ,IAAI,EAAE,QAAQ;oBACd,IAAI,EAAE,QAAQ,CAAC,OAAO,CAAC,GAAG,CAAC,mBAAmB,IAAI,KAAK,EAAE,EAAE,CAAC;oBAC5D,GAAG,EAAE,OAAO,CAAC,GAAG,CAAC,kBAAkB,KAAK,OAAO;oBAC/C,QAAQ,EAAE,OAAO,CAAC,GAAG,CAAC,uBAAuB,KAAK,MAAM;oBACxD,UAAU,EAAE,OAAO,CAAC,GAAG,CAAC,yBAAyB,KAAK,OAAO;iBAC9D;gBACD,IAAI,EAAE;oBACJ,IAAI,EAAE,QAAQ;oBACd,IAAI,EAAE,QAAQ,CAAC,OAAO,CAAC,GAAG,CAAC,mBAAmB,IAAI,KAAK,EAAE,EAAE,CAAC;oBAC5D,GAAG,EAAE,OAAO,CAAC,GAAG,CAAC,kBAAkB,KAAK,OAAO;oBAC/C,QAAQ,EAAE,OAAO,CAAC,GAAG,CAAC,uBAAuB,KAAK,MAAM;oBACxD,UAAU,EAAE,OAAO,CAAC,GAAG,CAAC,yBAAyB,KAAK,OAAO;oBAC7D,IAAI,EAAE;wBACJ,OAAO,EAAE,OAAO,CAAC,GAAG,CAAC,2BAA2B,KAAK,OAAO;wBAC5D,eAAe,EAAE,QAAQ,CAAC,OAAO,CAAC,GAAG,CAAC,mCAAmC,IAAI,GAAG,EAAE,EAAE,CAAC;wBACrF,YAAY,EAAE,QAAQ,CAAC,OAAO,CAAC,GAAG,CAAC,gCAAgC,IAAI,KAAK,EAAE,EAAE,CAAC;qBAClF;iBACF;aACF;SACF;KACF,CAAC;AACJ,CAAC;AAED,8EAA8E;AAC9E,mBAAmB;AACnB,8EAA8E;AAE9E,KAAK,UAAU,YAAY,CAAC,WAAmB,WAAW;IACxD,IAAI,CAAC;QACH,MAAM,OAAO,GAAG,MAAM,EAAE,CAAC,QAAQ,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;QACrD,MAAM,MAAM,GAAG,SAAS,CAAC,OAAO,CAAC,CAAC;QAClC,OAAO,MAAiC,CAAC;IAC3C,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,IAAI,CAAC;IACd,CAAC;AACH,CAAC;AAED,8EAA8E;AAC9E,yCAAyC;AACzC,8EAA8E;AAE9E,SAAS,eAAe,CAAC,GAA4C;IACnE,OAAO;QACL,QAAQ,EAAE,GAAG,CAAC,QAAQ;QACtB,QAAQ,EAAE,GAAG,CAAC,SAAS;QACvB,YAAY,EAAE,GAAG,CAAC,aAAa;QAC/B,YAAY,EAAE,GAAG,CAAC,aAAa;QAC/B,QAAQ,EAAE,GAAG,CAAC,SAAS;QACvB,OAAO,EAAE,GAAG,CAAC,QAAQ;QACrB,MAAM,EAAE,GAAG,CAAC,MAAM;KACnB,CAAC;AACJ,CAAC;AAED,SAAS,gBAAgB,CAAC,GAAqB;IAC7C,OAAO;QACL,IAAI,EAAE,GAAG,CAAC,IAAI;QACd,KAAK,EAAE,GAAG,CAAC,KAAK;QAChB,QAAQ,EAAE,GAAG,CAAC,SAAS;QACvB,QAAQ,EAAE,GAAG,CAAC,QAAQ,IAAI,GAAG,CAAC,KAAK;QACnC,QAAQ,EAAE,GAAG,CAAC,QAAQ;QACtB,MAAM,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,eAAe,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,SAAS;QAC5D,IAAI,EAAE;YACJ,IAAI,EAAE,GAAG,CAAC,IAAI,CAAC,IAAI;YACnB,IAAI,EAAE,GAAG,CAAC,IAAI,CAAC,IAAI;YACnB,GAAG,EAAE,GAAG,CAAC,IAAI,CAAC,GAAG;YACjB,QAAQ,EAAE,GAAG,CAAC,IAAI,CAAC,QAAQ;YAC3B,SAAS,EAAE,GAAG,CAAC,IAAI,CAAC,UAAU;SAC/B;QACD,IAAI,EAAE;YACJ,IAAI,EAAE,GAAG,CAAC,IAAI,CAAC,IAAI;YACnB,IAAI,EAAE,GAAG,CAAC,IAAI,CAAC,IAAI;YACnB,GAAG,EAAE,GAAG,CAAC,IAAI,CAAC,GAAG;YACjB,QAAQ,EAAE,GAAG,CAAC,IAAI,CAAC,QAAQ;YAC3B,SAAS,EAAE,GAAG,CAAC,IAAI,CAAC,UAAU;YAC9B,IAAI,EAAE;gBACJ,OAAO,EAAE,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO;gBAC9B,cAAc,EAAE,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,eAAe;gBAC7C,WAAW,EAAE,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,YAAY;aACxC;SACF;KACF,CAAC;AACJ,CAAC;AAED,SAAS,iBAAiB,CAAC,GAI1B;IACC,OAAO;QACL,IAAI,EAAE,GAAG,CAAC,IAAI;QACd,KAAK,EAAE;YACL,IAAI,EAAE,GAAG,CAAC,KAAK,CAAC,IAAI;YACpB,EAAE,EAAE,GAAG,CAAC,KAAK,CAAC,EAAE;YAChB,OAAO,EAAE,GAAG,CAAC,KAAK,CAAC,OAAO;SAC3B;QACD,OAAO,EAAE;YACP,MAAM,EAAE,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,CAAE,GAAG,CAAC,OAAO,CAAC,MAAmB,CAAC,CAAC,CAAC,SAAS;YACxF,IAAI,EAAE,OAAO,GAAG,CAAC,OAAO,CAAC,IAAI,KAAK,SAAS,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,SAAS;YAC1E,QAAQ,EAAE,OAAO,GAAG,CAAC,OAAO,CAAC,SAAS,KAAK,SAAS,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC,CAAC,SAAS;YACxF,KAAK,EAAE,OAAO,GAAG,CAAC,OAAO,CAAC,KAAK,KAAK,SAAS,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,SAAS;YAC7E,aAAa,EACX,OAAO,GAAG,CAAC,OAAO,CAAC,eAAe,KAAK,SAAS,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,eAAe,CAAC,CAAC,CAAC,SAAS;SAC7F;KACF,CAAC;AACJ,CAAC;AAED,SAAS,eAAe,CAAC,GAAiB;IACxC,OAAO;QACL,QAAQ,EAAE;YACR,SAAS,EAAE,GAAG,CAAC,QAAQ,CAAC,UAAU;YAClC,QAAQ,EAAE,GAAG,CAAC,QAAQ,CAAC,SAAS;YAChC,OAAO,EAAE;gBACP,OAAO,EAAE,GAAG,CAAC,QAAQ,CAAC,OAAO,CAAC,OAAO;gBACrC,OAAO,EAAE,GAAG,CAAC,QAAQ,CAAC,OAAO,CAAC,OAAO;gBACrC,WAAW,EAAE,GAAG,CAAC,QAAQ,CAAC,OAAO,CAAC,YAAY;aAC/C;YACD,KAAK,EAAE;gBACL,UAAU,EAAE,GAAG,CAAC,QAAQ,CAAC,KAAK,CAAC,YAAY;gBAC3C,MAAM,EAAE,GAAG,CAAC,QAAQ,CAAC,KAAK,CAAC,MAAM;gBACjC,SAAS,EAAE,GAAG,CAAC,QAAQ,CAAC,KAAK,CAAC,UAAU;gBACxC,QAAQ,EAAE,GAAG,CAAC,QAAQ,CAAC,KAAK,CAAC,SAAS;gBACtC,UAAU,EAAE,GAAG,CAAC,QAAQ,CAAC,KAAK,CAAC,WAAW;gBAC1C,kBAAkB,EAAE,GAAG,CAAC,QAAQ,CAAC,KAAK,CAAC,mBAAmB;gBAC1D,YAAY,EAAE,GAAG,CAAC,QAAQ,CAAC,KAAK,CAAC,aAAa;gBAC9C,KAAK,EAAE,CAAC,GAAG,CAAC,QAAQ,CAAC,KAAK,CAAC,KAAK,IAAI,EAAE,CAAC,CAAC,GAAG,CAAC,iBAAiB,CAAC;gBAC9D,MAAM,EAAE;oBACN,OAAO,EAAE,GAAG,CAAC,QAAQ,CAAC,KAAK,CAAC,MAAM,EAAE,OAAO,IAAI,KAAK;oBACpD,KAAK,EAAE,GAAG,CAAC,QAAQ,CAAC,KAAK,CAAC,MAAM,EAAE,KAAK,IAAI,KAAK;oBAChD,gBAAgB,EAAE,GAAG,CAAC,QAAQ,CAAC,KAAK,CAAC,MAAM,EAAE,iBAAiB,IAAI,MAAM;oBACxE,UAAU,EAAE,GAAG,CAAC,QAAQ,CAAC,KAAK,CAAC,MAAM,EAAE,WAAW,IAAI,EAAE;oBACxD,aAAa,EAAE,GAAG,CAAC,QAAQ,CAAC,KAAK,CAAC,MAAM,EAAE,cAAc,IAAI,CAAC,QAAQ,EAAE,MAAM,CAAC;iBAC/E;gBACD,YAAY,EAAE,GAAG,CAAC,QAAQ,CAAC,KAAK,CAAC,aAAa,IAAI,KAAK;gBACvD,YAAY,EAAE,GAAG,CAAC,QAAQ,CAAC,KAAK,CAAC,aAAa,IAAI,EAAE;gBACpD,oBAAoB,EAAE,GAAG,CAAC,QAAQ,CAAC,KAAK,CAAC,sBAAsB,IAAI,EAAE;gBACrE,eAAe,EAAE,GAAG,CAAC,QAAQ,CAAC,KAAK,CAAC,gBAAgB,IAAI,IAAI;aAC7D;SACF;QACD,QAAQ,EAAE,GAAG,CAAC,QAAQ,CAAC,GAAG,CAAC,gBAAgB,CAAC;KAC7C,CAAC;AACJ,CAAC;AAED,8EAA8E;AAC9E,aAAa;AACb,8EAA8E;AAE9E;;;;GAIG;AACH,MAAM,CAAC,KAAK,UAAU,aAAa,CAAC,UAAmB;IACrD,MAAM,QAAQ,GAAG,UAAU,IAAI,WAAW,CAAC;IAC3C,MAAM,UAAU,GAAG,MAAM,YAAY,CAAC,QAAQ,CAAC,CAAC;IAChD,IAAI,CAAC,UAAU,EAAE,CAAC;QAChB,MAAM,IAAI,KAAK,CAAC,4BAA4B,QAAQ,EAAE,CAAC,CAAC;IAC1D,CAAC;IACD,OAAO,mBAAmB,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC;AAC/C,CAAC;AAED;;;GAGG;AACH,MAAM,CAAC,KAAK,UAAU,UAAU,CAAC,UAAmB;IAClD,qCAAqC;IACrC,MAAM,SAAS,GAAG,WAAW,EAAE,CAAC;IAChC,IAAI,SAAS,EAAE,CAAC;QACd,MAAM,SAAS,GAAG,mBAAmB,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC;QACvD,OAAO,eAAe,CAAC,SAAS,CAAC,CAAC;IACpC,CAAC;IAED,mCAAmC;IACnC,MAAM,UAAU,GAAG,MAAM,YAAY,CAAC,UAAU,CAAC,CAAC;IAClD,IAAI,UAAU,EAAE,CAAC;QACf,MAAM,SAAS,GAAG,mBAAmB,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC;QACxD,OAAO,eAAe,CAAC,SAAS,CAAC,CAAC;IACpC,CAAC;IAED,MAAM,IAAI,KAAK,CACb,6BAA6B;QAC3B,2EAA2E;QAC3E,+BAA+B,UAAU,IAAI,WAAW,MAAM;QAC9D,sDAAsD,CACzD,CAAC;AACJ,CAAC;AAED;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,UAAU,CAC9B,MAAoB,EACpB,WAAmB,WAAW;IAE9B,MAAM,GAAG,GAAG,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC;IACnC,MAAM,EAAE,CAAC,KAAK,CAAC,GAAG,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IACzC,MAAM,IAAI,GAAG,aAAa,CAAC,MAAiC,CAAC,CAAC;IAC9D,MAAM,EAAE,CAAC,SAAS,CAAC,QAAQ,EAAE,IAAI,EAAE,OAAO,CAAC,CAAC;AAC9C,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,gBAAgB;IAC9B,OAAO;cACK,WAAW;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAgExB,CAAC;AACF,CAAC;AAED;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,YAAY,CAAC,WAAmB,WAAW;IAC/D,IAAI,CAAC;QACH,MAAM,EAAE,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;QAC1B,OAAO,IAAI,CAAC;IACd,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,KAAK,CAAC;IACf,CAAC;AACH,CAAC;AAED,gCAAgC;AAChC,OAAO,EAAE,WAAW,EAAE,GAAG,EAAE,CAAC"}