@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,125 @@
1
+ /**
2
+ * MCP tools: move_email, delete_email, mark_email
3
+ */
4
+ import { z } from 'zod';
5
+ import audit from '../safety/audit.js';
6
+ import { sanitizeMailboxName } from '../safety/validation.js';
7
+ export default function registerManageTools(server, imapService) {
8
+ // ---------------------------------------------------------------------------
9
+ // move_email
10
+ // ---------------------------------------------------------------------------
11
+ server.tool('move_email', 'Move an email to a different mailbox folder. ' +
12
+ 'The sourceMailbox must be a real folder, not a virtual one like "All Mail". ' +
13
+ 'Use find_email_folder first if the email was discovered in a virtual folder.', {
14
+ account: z.string().describe('Account name from list_accounts'),
15
+ emailId: z.string().describe('Email ID to move (from list_emails)'),
16
+ sourceMailbox: z.string().describe('Current mailbox (e.g., INBOX)'),
17
+ destinationMailbox: z
18
+ .string()
19
+ .describe('Target mailbox (e.g., Archive). Use list_mailboxes to see options.'),
20
+ }, { readOnlyHint: false, destructiveHint: false, idempotentHint: true }, async ({ account, emailId, sourceMailbox, destinationMailbox }) => {
21
+ try {
22
+ const cleanSource = sanitizeMailboxName(sourceMailbox);
23
+ const cleanDest = sanitizeMailboxName(destinationMailbox);
24
+ await imapService.moveEmail(account, emailId, cleanSource, cleanDest);
25
+ await audit.log('move_email', account, { emailId, sourceMailbox, destinationMailbox }, 'ok');
26
+ return {
27
+ content: [
28
+ {
29
+ type: 'text',
30
+ text: `✅ Email moved from "${sourceMailbox}" to "${destinationMailbox}".`,
31
+ },
32
+ ],
33
+ };
34
+ }
35
+ catch (err) {
36
+ const errMsg = err instanceof Error ? err.message : String(err);
37
+ await audit.log('move_email', account, { emailId, sourceMailbox, destinationMailbox }, 'error', errMsg);
38
+ return {
39
+ isError: true,
40
+ content: [
41
+ {
42
+ type: 'text',
43
+ text: `Failed to move email: ${errMsg}`,
44
+ },
45
+ ],
46
+ };
47
+ }
48
+ });
49
+ // ---------------------------------------------------------------------------
50
+ // delete_email
51
+ // ---------------------------------------------------------------------------
52
+ server.tool('delete_email', 'Delete an email. By default moves to Trash. Set permanent=true for permanent deletion (⚠️ irreversible). ' +
53
+ 'The mailbox must be a real folder. Use find_email_folder first if the email was found in a virtual folder.', {
54
+ account: z.string().describe('Account name from list_accounts'),
55
+ emailId: z.string().describe('Email ID to delete (from list_emails)'),
56
+ mailbox: z.string().default('INBOX').describe('Mailbox containing the email'),
57
+ permanent: z.boolean().default(false).describe('⚠️ Permanently delete (skip Trash)'),
58
+ }, { readOnlyHint: false, destructiveHint: true }, async ({ account, emailId, mailbox, permanent }) => {
59
+ try {
60
+ const cleanMailbox = sanitizeMailboxName(mailbox);
61
+ await imapService.deleteEmail(account, emailId, cleanMailbox, permanent);
62
+ await audit.log('delete_email', account, { emailId, mailbox, permanent }, 'ok');
63
+ return {
64
+ content: [
65
+ {
66
+ type: 'text',
67
+ text: permanent ? `⚠️ Email permanently deleted.` : `🗑️ Email moved to Trash.`,
68
+ },
69
+ ],
70
+ };
71
+ }
72
+ catch (err) {
73
+ const errMsg = err instanceof Error ? err.message : String(err);
74
+ await audit.log('delete_email', account, { emailId, mailbox, permanent }, 'error', errMsg);
75
+ return {
76
+ isError: true,
77
+ content: [
78
+ {
79
+ type: 'text',
80
+ text: `Failed to delete email: ${errMsg}`,
81
+ },
82
+ ],
83
+ };
84
+ }
85
+ });
86
+ // ---------------------------------------------------------------------------
87
+ // mark_email
88
+ // ---------------------------------------------------------------------------
89
+ server.tool('mark_email', 'Change email flags — mark as read/unread, flag/unflag. Idempotent: marking an already-read email as read is a no-op.', {
90
+ account: z.string().describe('Account name from list_accounts'),
91
+ id: z.string().describe('Email ID (UID) from list_emails or search_emails'),
92
+ mailbox: z.string().default('INBOX').describe('Mailbox containing the email'),
93
+ action: z
94
+ .enum(['read', 'unread', 'flag', 'unflag'])
95
+ .describe('Action: read, unread, flag (star), or unflag (unstar)'),
96
+ }, { readOnlyHint: false, destructiveHint: false, idempotentHint: true }, async ({ account, id, mailbox, action }) => {
97
+ try {
98
+ await imapService.setFlags(account, id, mailbox, action);
99
+ await audit.log('mark_email', account, { id, mailbox, action }, 'ok');
100
+ const labels = {
101
+ read: '📖 Marked as read',
102
+ unread: '📩 Marked as unread',
103
+ flag: '⭐ Flagged',
104
+ unflag: '☆ Unflagged',
105
+ };
106
+ return {
107
+ content: [{ type: 'text', text: `${labels[action]}.` }],
108
+ };
109
+ }
110
+ catch (err) {
111
+ const errMsg = err instanceof Error ? err.message : String(err);
112
+ await audit.log('mark_email', account, { id, mailbox, action }, 'error', errMsg);
113
+ return {
114
+ isError: true,
115
+ content: [
116
+ {
117
+ type: 'text',
118
+ text: `Failed to mark email: ${errMsg}`,
119
+ },
120
+ ],
121
+ };
122
+ }
123
+ });
124
+ }
125
+ //# sourceMappingURL=manage.tool.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"manage.tool.js","sourceRoot":"","sources":["../../src/tools/manage.tool.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,20 @@
1
+ /**
2
+ * Tool registration — single wiring point.
3
+ *
4
+ * Registers all MCP tools with the server instance.
5
+ * In read-only mode, write tools are not registered at all.
6
+ */
7
+ import type { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
8
+ import type ConnectionManager from '../connections/manager.js';
9
+ import type CalendarService from '../services/calendar.service.js';
10
+ import type HooksService from '../services/hooks.service.js';
11
+ import type ImapService from '../services/imap.service.js';
12
+ import type LocalCalendarService from '../services/local-calendar.service.js';
13
+ import type RemindersService from '../services/reminders.service.js';
14
+ import type SchedulerService from '../services/scheduler.service.js';
15
+ import type SmtpService from '../services/smtp.service.js';
16
+ import type TemplateService from '../services/template.service.js';
17
+ import type WatcherService from '../services/watcher.service.js';
18
+ import type { AppConfig } from '../types/index.js';
19
+ export default function registerAllTools(server: McpServer, connections: ConnectionManager, imapService: ImapService, smtpService: SmtpService, config: AppConfig, templateService: TemplateService, calendarService: CalendarService, localCalendarService: LocalCalendarService, remindersService: RemindersService, schedulerService: SchedulerService, watcherService: WatcherService, hooksService: HooksService): void;
20
+ //# sourceMappingURL=register.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"register.d.ts","sourceRoot":"","sources":["../../src/tools/register.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AACzE,OAAO,KAAK,iBAAiB,MAAM,2BAA2B,CAAC;AAC/D,OAAO,KAAK,eAAe,MAAM,iCAAiC,CAAC;AACnE,OAAO,KAAK,YAAY,MAAM,8BAA8B,CAAC;AAC7D,OAAO,KAAK,WAAW,MAAM,6BAA6B,CAAC;AAC3D,OAAO,KAAK,oBAAoB,MAAM,uCAAuC,CAAC;AAC9E,OAAO,KAAK,gBAAgB,MAAM,kCAAkC,CAAC;AACrE,OAAO,KAAK,gBAAgB,MAAM,kCAAkC,CAAC;AACrE,OAAO,KAAK,WAAW,MAAM,6BAA6B,CAAC;AAC3D,OAAO,KAAK,eAAe,MAAM,iCAAiC,CAAC;AACnE,OAAO,KAAK,cAAc,MAAM,gCAAgC,CAAC;AACjE,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,mBAAmB,CAAC;AAqBnD,MAAM,CAAC,OAAO,UAAU,gBAAgB,CACtC,MAAM,EAAE,SAAS,EACjB,WAAW,EAAE,iBAAiB,EAC9B,WAAW,EAAE,WAAW,EACxB,WAAW,EAAE,WAAW,EACxB,MAAM,EAAE,SAAS,EACjB,eAAe,EAAE,eAAe,EAChC,eAAe,EAAE,eAAe,EAChC,oBAAoB,EAAE,oBAAoB,EAC1C,gBAAgB,EAAE,gBAAgB,EAClC,gBAAgB,EAAE,gBAAgB,EAClC,cAAc,EAAE,cAAc,EAC9B,YAAY,EAAE,YAAY,GACzB,IAAI,CAkCN"}
@@ -0,0 +1,53 @@
1
+ /**
2
+ * Tool registration — single wiring point.
3
+ *
4
+ * Registers all MCP tools with the server instance.
5
+ * In read-only mode, write tools are not registered at all.
6
+ */
7
+ import registerAccountsTools from './accounts.tool.js';
8
+ import registerAnalyticsTools from './analytics.tool.js';
9
+ import registerAttachmentTools from './attachments.tool.js';
10
+ import registerBulkTools from './bulk.tool.js';
11
+ import registerCalendarTools from './calendar.tool.js';
12
+ import registerContactsTools from './contacts.tool.js';
13
+ import registerDraftTools from './drafts.tool.js';
14
+ import registerEmailsTools from './emails.tool.js';
15
+ import registerFolderTools from './folders.tool.js';
16
+ import registerHealthTools from './health.tool.js';
17
+ import registerLabelTools from './label.tool.js';
18
+ import registerLocateTools from './locate.tool.js';
19
+ import registerMailboxesTools from './mailboxes.tool.js';
20
+ import registerManageTools from './manage.tool.js';
21
+ import registerSchedulerTools from './scheduler.tool.js';
22
+ import registerSendTools from './send.tool.js';
23
+ import { registerTemplateReadTools, registerTemplateWriteTools } from './templates.tool.js';
24
+ import registerThreadTools from './thread.tool.js';
25
+ import registerWatcherTools from './watcher.tool.js';
26
+ export default function registerAllTools(server, connections, imapService, smtpService, config, templateService, calendarService, localCalendarService, remindersService, schedulerService, watcherService, hooksService) {
27
+ const { readOnly } = config.settings;
28
+ // Read tools — always registered
29
+ registerAccountsTools(server, connections);
30
+ registerMailboxesTools(server, imapService);
31
+ registerEmailsTools(server, imapService);
32
+ registerAttachmentTools(server, imapService);
33
+ registerContactsTools(server, imapService);
34
+ registerThreadTools(server, imapService);
35
+ registerTemplateReadTools(server, templateService);
36
+ registerCalendarTools(server, imapService, calendarService, localCalendarService, remindersService);
37
+ registerAnalyticsTools(server, imapService);
38
+ registerHealthTools(server, connections, imapService);
39
+ registerLocateTools(server, imapService);
40
+ registerWatcherTools(server, watcherService, hooksService);
41
+ // Write tools — skipped in read-only mode
42
+ if (!readOnly) {
43
+ registerSendTools(server, smtpService);
44
+ registerManageTools(server, imapService);
45
+ registerLabelTools(server, imapService);
46
+ registerBulkTools(server, imapService);
47
+ registerDraftTools(server, imapService, smtpService);
48
+ registerFolderTools(server, imapService);
49
+ registerTemplateWriteTools(server, templateService, imapService, smtpService);
50
+ registerSchedulerTools(server, schedulerService);
51
+ }
52
+ }
53
+ //# sourceMappingURL=register.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"register.js","sourceRoot":"","sources":["../../src/tools/register.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAcH,OAAO,qBAAqB,MAAM,oBAAoB,CAAC;AACvD,OAAO,sBAAsB,MAAM,qBAAqB,CAAC;AACzD,OAAO,uBAAuB,MAAM,uBAAuB,CAAC;AAC5D,OAAO,iBAAiB,MAAM,gBAAgB,CAAC;AAC/C,OAAO,qBAAqB,MAAM,oBAAoB,CAAC;AACvD,OAAO,qBAAqB,MAAM,oBAAoB,CAAC;AACvD,OAAO,kBAAkB,MAAM,kBAAkB,CAAC;AAClD,OAAO,mBAAmB,MAAM,kBAAkB,CAAC;AACnD,OAAO,mBAAmB,MAAM,mBAAmB,CAAC;AACpD,OAAO,mBAAmB,MAAM,kBAAkB,CAAC;AACnD,OAAO,kBAAkB,MAAM,iBAAiB,CAAC;AACjD,OAAO,mBAAmB,MAAM,kBAAkB,CAAC;AACnD,OAAO,sBAAsB,MAAM,qBAAqB,CAAC;AACzD,OAAO,mBAAmB,MAAM,kBAAkB,CAAC;AACnD,OAAO,sBAAsB,MAAM,qBAAqB,CAAC;AACzD,OAAO,iBAAiB,MAAM,gBAAgB,CAAC;AAC/C,OAAO,EAAE,yBAAyB,EAAE,0BAA0B,EAAE,MAAM,qBAAqB,CAAC;AAC5F,OAAO,mBAAmB,MAAM,kBAAkB,CAAC;AACnD,OAAO,oBAAoB,MAAM,mBAAmB,CAAC;AAErD,MAAM,CAAC,OAAO,UAAU,gBAAgB,CACtC,MAAiB,EACjB,WAA8B,EAC9B,WAAwB,EACxB,WAAwB,EACxB,MAAiB,EACjB,eAAgC,EAChC,eAAgC,EAChC,oBAA0C,EAC1C,gBAAkC,EAClC,gBAAkC,EAClC,cAA8B,EAC9B,YAA0B;IAE1B,MAAM,EAAE,QAAQ,EAAE,GAAG,MAAM,CAAC,QAAQ,CAAC;IAErC,iCAAiC;IACjC,qBAAqB,CAAC,MAAM,EAAE,WAAW,CAAC,CAAC;IAC3C,sBAAsB,CAAC,MAAM,EAAE,WAAW,CAAC,CAAC;IAC5C,mBAAmB,CAAC,MAAM,EAAE,WAAW,CAAC,CAAC;IACzC,uBAAuB,CAAC,MAAM,EAAE,WAAW,CAAC,CAAC;IAC7C,qBAAqB,CAAC,MAAM,EAAE,WAAW,CAAC,CAAC;IAC3C,mBAAmB,CAAC,MAAM,EAAE,WAAW,CAAC,CAAC;IACzC,yBAAyB,CAAC,MAAM,EAAE,eAAe,CAAC,CAAC;IACnD,qBAAqB,CACnB,MAAM,EACN,WAAW,EACX,eAAe,EACf,oBAAoB,EACpB,gBAAgB,CACjB,CAAC;IACF,sBAAsB,CAAC,MAAM,EAAE,WAAW,CAAC,CAAC;IAC5C,mBAAmB,CAAC,MAAM,EAAE,WAAW,EAAE,WAAW,CAAC,CAAC;IACtD,mBAAmB,CAAC,MAAM,EAAE,WAAW,CAAC,CAAC;IACzC,oBAAoB,CAAC,MAAM,EAAE,cAAc,EAAE,YAAY,CAAC,CAAC;IAE3D,0CAA0C;IAC1C,IAAI,CAAC,QAAQ,EAAE,CAAC;QACd,iBAAiB,CAAC,MAAM,EAAE,WAAW,CAAC,CAAC;QACvC,mBAAmB,CAAC,MAAM,EAAE,WAAW,CAAC,CAAC;QACzC,kBAAkB,CAAC,MAAM,EAAE,WAAW,CAAC,CAAC;QACxC,iBAAiB,CAAC,MAAM,EAAE,WAAW,CAAC,CAAC;QACvC,kBAAkB,CAAC,MAAM,EAAE,WAAW,EAAE,WAAW,CAAC,CAAC;QACrD,mBAAmB,CAAC,MAAM,EAAE,WAAW,CAAC,CAAC;QACzC,0BAA0B,CAAC,MAAM,EAAE,eAAe,EAAE,WAAW,EAAE,WAAW,CAAC,CAAC;QAC9E,sBAAsB,CAAC,MAAM,EAAE,gBAAgB,CAAC,CAAC;IACnD,CAAC;AACH,CAAC"}
@@ -0,0 +1,9 @@
1
+ /**
2
+ * MCP Tools: schedule_email, list_scheduled, cancel_scheduled
3
+ *
4
+ * Email scheduling tools for "send later" functionality.
5
+ */
6
+ import type { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
7
+ import type SchedulerService from '../services/scheduler.service.js';
8
+ export default function registerSchedulerTools(server: McpServer, schedulerService: SchedulerService): void;
9
+ //# sourceMappingURL=scheduler.tool.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"scheduler.tool.d.ts","sourceRoot":"","sources":["../../src/tools/scheduler.tool.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAIzE,OAAO,KAAK,gBAAgB,MAAM,kCAAkC,CAAC;AAErE,MAAM,CAAC,OAAO,UAAU,sBAAsB,CAC5C,MAAM,EAAE,SAAS,EACjB,gBAAgB,EAAE,gBAAgB,GACjC,IAAI,CAiIN"}
@@ -0,0 +1,104 @@
1
+ /**
2
+ * MCP Tools: schedule_email, list_scheduled, cancel_scheduled
3
+ *
4
+ * Email scheduling tools for "send later" functionality.
5
+ */
6
+ import { z } from 'zod';
7
+ import audit from '../safety/audit.js';
8
+ export default function registerSchedulerTools(server, schedulerService) {
9
+ // ---------------------------------------------------------------------------
10
+ // schedule_email (write)
11
+ // ---------------------------------------------------------------------------
12
+ server.tool('schedule_email', 'Schedule an email to be sent at a specific time in the future. The email is queued locally and sent automatically when the time arrives.', {
13
+ account: z.string().describe('Account name to send from'),
14
+ to: z.array(z.string()).min(1).describe('Recipient email addresses'),
15
+ subject: z.string().describe('Email subject'),
16
+ body: z.string().describe('Email body'),
17
+ send_at: z.string().describe("When to send (ISO 8601 datetime, e.g. '2025-02-20T09:00:00Z')"),
18
+ cc: z.array(z.string()).optional().describe('CC recipients'),
19
+ bcc: z.array(z.string()).optional().describe('BCC recipients'),
20
+ html: z.boolean().default(false).describe('Send as HTML (default: false)'),
21
+ in_reply_to: z.string().optional().describe('Message-ID to reply to'),
22
+ }, { readOnlyHint: false, destructiveHint: false }, async (params) => {
23
+ const scheduled = await schedulerService.schedule(params.account, {
24
+ to: params.to,
25
+ subject: params.subject,
26
+ body: params.body,
27
+ sendAt: params.send_at,
28
+ cc: params.cc,
29
+ bcc: params.bcc,
30
+ html: params.html,
31
+ inReplyTo: params.in_reply_to,
32
+ });
33
+ const result = {
34
+ schedule_id: scheduled.id,
35
+ send_at: scheduled.sendAt,
36
+ draft_saved: !!scheduled.draftMessageId,
37
+ status: 'scheduled',
38
+ };
39
+ await audit.log('schedule_email', params.account, params, 'ok');
40
+ return {
41
+ content: [
42
+ {
43
+ type: 'text',
44
+ text: JSON.stringify(result, null, 2),
45
+ },
46
+ ],
47
+ };
48
+ });
49
+ // ---------------------------------------------------------------------------
50
+ // list_scheduled (read)
51
+ // ---------------------------------------------------------------------------
52
+ server.tool('list_scheduled', 'List scheduled emails. Shows pending, sent, or all scheduled emails.', {
53
+ account: z.string().optional().describe('Filter by account name (all accounts if omitted)'),
54
+ status: z
55
+ .enum(['pending', 'sent', 'failed', 'all'])
56
+ .default('pending')
57
+ .describe('Filter by status (default: pending)'),
58
+ }, { readOnlyHint: true, destructiveHint: false }, async ({ account, status }) => {
59
+ const emails = await schedulerService.list({
60
+ account,
61
+ status,
62
+ });
63
+ const summary = emails.map((e) => ({
64
+ id: e.id,
65
+ account: e.account,
66
+ to: e.to.join(', '),
67
+ subject: e.subject,
68
+ send_at: e.sendAt,
69
+ status: e.status,
70
+ attempts: e.attempts,
71
+ overdue: e.status === 'pending' && new Date(e.sendAt).getTime() < Date.now(),
72
+ last_error: e.lastError,
73
+ }));
74
+ return {
75
+ content: [
76
+ {
77
+ type: 'text',
78
+ text: JSON.stringify({ scheduled_emails: summary, count: summary.length }, null, 2),
79
+ },
80
+ ],
81
+ };
82
+ });
83
+ // ---------------------------------------------------------------------------
84
+ // cancel_scheduled (write)
85
+ // ---------------------------------------------------------------------------
86
+ server.tool('cancel_scheduled', 'Cancel a scheduled email. Removes it from the queue and deletes the associated draft.', {
87
+ schedule_id: z.string().describe('Schedule ID to cancel'),
88
+ }, { readOnlyHint: false, destructiveHint: true }, async ({ schedule_id: scheduleId }) => {
89
+ const result = await schedulerService.cancel(scheduleId);
90
+ await audit.log('cancel_scheduled', 'system', { scheduleId }, 'ok');
91
+ return {
92
+ content: [
93
+ {
94
+ type: 'text',
95
+ text: JSON.stringify({
96
+ cancelled: result.cancelled,
97
+ draft_deleted: result.draftDeleted,
98
+ }, null, 2),
99
+ },
100
+ ],
101
+ };
102
+ });
103
+ }
104
+ //# sourceMappingURL=scheduler.tool.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"scheduler.tool.js","sourceRoot":"","sources":["../../src/tools/scheduler.tool.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,7 @@
1
+ /**
2
+ * MCP tools: send_email, reply_email, forward_email
3
+ */
4
+ import type { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
5
+ import type SmtpService from '../services/smtp.service.js';
6
+ export default function registerSendTools(server: McpServer, smtpService: SmtpService): void;
7
+ //# sourceMappingURL=send.tool.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"send.tool.d.ts","sourceRoot":"","sources":["../../src/tools/send.tool.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAKzE,OAAO,KAAK,WAAW,MAAM,6BAA6B,CAAC;AAE3D,MAAM,CAAC,OAAO,UAAU,iBAAiB,CAAC,MAAM,EAAE,SAAS,EAAE,WAAW,EAAE,WAAW,GAAG,IAAI,CAqK3F"}
@@ -0,0 +1,123 @@
1
+ /**
2
+ * MCP tools: send_email, reply_email, forward_email
3
+ */
4
+ import { z } from 'zod';
5
+ import audit from '../safety/audit.js';
6
+ import { validateInputLength } from '../safety/validation.js';
7
+ export default function registerSendTools(server, smtpService) {
8
+ // ---------------------------------------------------------------------------
9
+ // send_email
10
+ // ---------------------------------------------------------------------------
11
+ server.tool('send_email', 'Send a new email. Supports plain text or HTML body, CC, and BCC.', {
12
+ account: z.string().describe('Account name from list_accounts'),
13
+ to: z.array(z.string().email()).min(1).describe('Recipient email addresses'),
14
+ subject: z.string().describe('Email subject'),
15
+ body: z.string().describe('Email body content'),
16
+ cc: z.array(z.string().email()).optional().describe('CC recipients'),
17
+ bcc: z.array(z.string().email()).optional().describe('BCC recipients'),
18
+ html: z.boolean().default(false).describe('Send as HTML (default: plain text)'),
19
+ }, { readOnlyHint: false, destructiveHint: false, openWorldHint: true }, async (params) => {
20
+ try {
21
+ validateInputLength(params.subject, 998, 'Subject');
22
+ validateInputLength(params.body, 5_000_000, 'Body');
23
+ const result = await smtpService.sendEmail(params.account, params);
24
+ await audit.log('send_email', params.account, { to: params.to, subject: params.subject }, 'ok');
25
+ return {
26
+ content: [
27
+ {
28
+ type: 'text',
29
+ text: `✅ Email sent successfully!\nTo: ${params.to.join(', ')}\nSubject: ${params.subject}\nMessage-ID: ${result.messageId}`,
30
+ },
31
+ ],
32
+ };
33
+ }
34
+ catch (err) {
35
+ const errMsg = err instanceof Error ? err.message : String(err);
36
+ await audit.log('send_email', params.account, { to: params.to, subject: params.subject }, 'error', errMsg);
37
+ return {
38
+ isError: true,
39
+ content: [
40
+ {
41
+ type: 'text',
42
+ text: `Failed to send email: ${errMsg}`,
43
+ },
44
+ ],
45
+ };
46
+ }
47
+ });
48
+ // ---------------------------------------------------------------------------
49
+ // reply_email
50
+ // ---------------------------------------------------------------------------
51
+ server.tool('reply_email', 'Reply to an email with proper threading (In-Reply-To & References headers). Use get_email first to read the original.', {
52
+ account: z.string().describe('Account name from list_accounts'),
53
+ emailId: z.string().describe('Email ID to reply to (from list_emails or get_email)'),
54
+ mailbox: z.string().default('INBOX').describe('Mailbox where the original email is'),
55
+ body: z.string().describe('Reply body content'),
56
+ replyAll: z.boolean().default(false).describe('Reply to all recipients'),
57
+ html: z.boolean().default(false).describe('Send as HTML'),
58
+ }, { readOnlyHint: false, destructiveHint: false, openWorldHint: true }, async (params) => {
59
+ try {
60
+ const result = await smtpService.replyToEmail(params.account, params);
61
+ await audit.log('reply_email', params.account, { emailId: params.emailId, mailbox: params.mailbox }, 'ok');
62
+ return {
63
+ content: [
64
+ {
65
+ type: 'text',
66
+ text: `✅ Reply sent successfully!\nMessage-ID: ${result.messageId}`,
67
+ },
68
+ ],
69
+ };
70
+ }
71
+ catch (err) {
72
+ const errMsg = err instanceof Error ? err.message : String(err);
73
+ await audit.log('reply_email', params.account, { emailId: params.emailId, mailbox: params.mailbox }, 'error', errMsg);
74
+ return {
75
+ isError: true,
76
+ content: [
77
+ {
78
+ type: 'text',
79
+ text: `Failed to reply: ${errMsg}`,
80
+ },
81
+ ],
82
+ };
83
+ }
84
+ });
85
+ // ---------------------------------------------------------------------------
86
+ // forward_email
87
+ // ---------------------------------------------------------------------------
88
+ server.tool('forward_email', 'Forward an email to new recipients with optional additional message. Original email is quoted below.', {
89
+ account: z.string().describe('Account name from list_accounts'),
90
+ emailId: z.string().describe('Email ID to forward (from list_emails or get_email)'),
91
+ mailbox: z.string().default('INBOX').describe('Mailbox where the original email is'),
92
+ to: z.array(z.string().email()).min(1).describe('Forward to these recipients'),
93
+ body: z.string().optional().describe('Additional message above the forwarded content'),
94
+ cc: z.array(z.string().email()).optional().describe('CC recipients'),
95
+ }, { readOnlyHint: false, destructiveHint: false, openWorldHint: true }, async (params) => {
96
+ try {
97
+ const result = await smtpService.forwardEmail(params.account, params);
98
+ await audit.log('forward_email', params.account, { to: params.to, emailId: params.emailId }, 'ok');
99
+ return {
100
+ content: [
101
+ {
102
+ type: 'text',
103
+ text: `✅ Email forwarded successfully!\nTo: ${params.to.join(', ')}\nMessage-ID: ${result.messageId}`,
104
+ },
105
+ ],
106
+ };
107
+ }
108
+ catch (err) {
109
+ const errMsg = err instanceof Error ? err.message : String(err);
110
+ await audit.log('forward_email', params.account, { to: params.to, emailId: params.emailId }, 'error', errMsg);
111
+ return {
112
+ isError: true,
113
+ content: [
114
+ {
115
+ type: 'text',
116
+ text: `Failed to forward: ${errMsg}`,
117
+ },
118
+ ],
119
+ };
120
+ }
121
+ });
122
+ }
123
+ //# sourceMappingURL=send.tool.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"send.tool.js","sourceRoot":"","sources":["../../src/tools/send.tool.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,12 @@
1
+ /**
2
+ * MCP tools: list_templates, apply_template
3
+ *
4
+ * User-defined email templates with {{variable}} substitution.
5
+ */
6
+ import type { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
7
+ import type ImapService from '../services/imap.service.js';
8
+ import type SmtpService from '../services/smtp.service.js';
9
+ import type TemplateService from '../services/template.service.js';
10
+ export declare function registerTemplateReadTools(server: McpServer, templateService: TemplateService): void;
11
+ export declare function registerTemplateWriteTools(server: McpServer, templateService: TemplateService, imapService: ImapService, smtpService: SmtpService): void;
12
+ //# sourceMappingURL=templates.tool.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"templates.tool.d.ts","sourceRoot":"","sources":["../../src/tools/templates.tool.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAIzE,OAAO,KAAK,WAAW,MAAM,6BAA6B,CAAC;AAC3D,OAAO,KAAK,WAAW,MAAM,6BAA6B,CAAC;AAC3D,OAAO,KAAK,eAAe,MAAM,iCAAiC,CAAC;AAEnE,wBAAgB,yBAAyB,CACvC,MAAM,EAAE,SAAS,EACjB,eAAe,EAAE,eAAe,GAC/B,IAAI,CAgDN;AAED,wBAAgB,0BAA0B,CACxC,MAAM,EAAE,SAAS,EACjB,eAAe,EAAE,eAAe,EAChC,WAAW,EAAE,WAAW,EACxB,WAAW,EAAE,WAAW,GACvB,IAAI,CAiHN"}