@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.
- package/LICENSE +155 -0
- package/README.md +820 -0
- package/dist/cli/account-commands.d.ts +10 -0
- package/dist/cli/account-commands.d.ts.map +1 -0
- package/dist/cli/account-commands.js +703 -0
- package/dist/cli/account-commands.js.map +1 -0
- package/dist/cli/config-commands.d.ts +9 -0
- package/dist/cli/config-commands.d.ts.map +1 -0
- package/dist/cli/config-commands.js +156 -0
- package/dist/cli/config-commands.js.map +1 -0
- package/dist/cli/guard.d.ts +11 -0
- package/dist/cli/guard.d.ts.map +1 -0
- package/dist/cli/guard.js +18 -0
- package/dist/cli/guard.js.map +1 -0
- package/dist/cli/install-commands.d.ts +12 -0
- package/dist/cli/install-commands.d.ts.map +1 -0
- package/dist/cli/install-commands.js +320 -0
- package/dist/cli/install-commands.js.map +1 -0
- package/dist/cli/notify.d.ts +8 -0
- package/dist/cli/notify.d.ts.map +1 -0
- package/dist/cli/notify.js +143 -0
- package/dist/cli/notify.js.map +1 -0
- package/dist/cli/providers.d.ts +13 -0
- package/dist/cli/providers.d.ts.map +1 -0
- package/dist/cli/providers.js +180 -0
- package/dist/cli/providers.js.map +1 -0
- package/dist/cli/scheduler.d.ts +8 -0
- package/dist/cli/scheduler.d.ts.map +1 -0
- package/dist/cli/scheduler.js +268 -0
- package/dist/cli/scheduler.js.map +1 -0
- package/dist/cli/setup.d.ts +12 -0
- package/dist/cli/setup.d.ts.map +1 -0
- package/dist/cli/setup.js +15 -0
- package/dist/cli/setup.js.map +1 -0
- package/dist/cli/test.d.ts +7 -0
- package/dist/cli/test.d.ts.map +1 -0
- package/dist/cli/test.js +67 -0
- package/dist/cli/test.js.map +1 -0
- package/dist/config/loader.d.ts +34 -0
- package/dist/config/loader.d.ts.map +1 -0
- package/dist/config/loader.js +339 -0
- package/dist/config/loader.js.map +1 -0
- package/dist/config/schema.d.ts +351 -0
- package/dist/config/schema.d.ts.map +1 -0
- package/dist/config/schema.js +165 -0
- package/dist/config/schema.js.map +1 -0
- package/dist/config/xdg.d.ts +27 -0
- package/dist/config/xdg.d.ts.map +1 -0
- package/dist/config/xdg.js +30 -0
- package/dist/config/xdg.js.map +1 -0
- package/dist/connections/manager.d.ts +42 -0
- package/dist/connections/manager.d.ts.map +1 -0
- package/dist/connections/manager.js +266 -0
- package/dist/connections/manager.js.map +1 -0
- package/dist/connections/types.d.ts +13 -0
- package/dist/connections/types.d.ts.map +1 -0
- package/dist/connections/types.js +2 -0
- package/dist/connections/types.js.map +1 -0
- package/dist/logging.d.ts +46 -0
- package/dist/logging.d.ts.map +1 -0
- package/dist/logging.js +63 -0
- package/dist/logging.js.map +1 -0
- package/dist/main.d.ts +13 -0
- package/dist/main.d.ts.map +1 -0
- package/dist/main.js +206 -0
- package/dist/main.js.map +1 -0
- package/dist/prompts/actions.prompt.d.ts +9 -0
- package/dist/prompts/actions.prompt.d.ts.map +1 -0
- package/dist/prompts/actions.prompt.js +64 -0
- package/dist/prompts/actions.prompt.js.map +1 -0
- package/dist/prompts/calendar.prompt.d.ts +9 -0
- package/dist/prompts/calendar.prompt.d.ts.map +1 -0
- package/dist/prompts/calendar.prompt.js +55 -0
- package/dist/prompts/calendar.prompt.js.map +1 -0
- package/dist/prompts/cleanup.prompt.d.ts +9 -0
- package/dist/prompts/cleanup.prompt.d.ts.map +1 -0
- package/dist/prompts/cleanup.prompt.js +78 -0
- package/dist/prompts/cleanup.prompt.js.map +1 -0
- package/dist/prompts/compose.prompt.d.ts +8 -0
- package/dist/prompts/compose.prompt.d.ts.map +1 -0
- package/dist/prompts/compose.prompt.js +116 -0
- package/dist/prompts/compose.prompt.js.map +1 -0
- package/dist/prompts/register.d.ts +8 -0
- package/dist/prompts/register.d.ts.map +1 -0
- package/dist/prompts/register.js +20 -0
- package/dist/prompts/register.js.map +1 -0
- package/dist/prompts/thread.prompt.d.ts +9 -0
- package/dist/prompts/thread.prompt.d.ts.map +1 -0
- package/dist/prompts/thread.prompt.js +58 -0
- package/dist/prompts/thread.prompt.js.map +1 -0
- package/dist/prompts/triage.prompt.d.ts +9 -0
- package/dist/prompts/triage.prompt.d.ts.map +1 -0
- package/dist/prompts/triage.prompt.js +64 -0
- package/dist/prompts/triage.prompt.js.map +1 -0
- package/dist/resources/accounts.resource.d.ts +9 -0
- package/dist/resources/accounts.resource.d.ts.map +1 -0
- package/dist/resources/accounts.resource.js +26 -0
- package/dist/resources/accounts.resource.js.map +1 -0
- package/dist/resources/mailboxes.resource.d.ts +10 -0
- package/dist/resources/mailboxes.resource.d.ts.map +1 -0
- package/dist/resources/mailboxes.resource.js +33 -0
- package/dist/resources/mailboxes.resource.js.map +1 -0
- package/dist/resources/register.d.ts +12 -0
- package/dist/resources/register.d.ts.map +1 -0
- package/dist/resources/register.js +20 -0
- package/dist/resources/register.js.map +1 -0
- package/dist/resources/scheduled.resource.d.ts +9 -0
- package/dist/resources/scheduled.resource.d.ts.map +1 -0
- package/dist/resources/scheduled.resource.js +31 -0
- package/dist/resources/scheduled.resource.js.map +1 -0
- package/dist/resources/stats.resource.d.ts +10 -0
- package/dist/resources/stats.resource.d.ts.map +1 -0
- package/dist/resources/stats.resource.js +45 -0
- package/dist/resources/stats.resource.js.map +1 -0
- package/dist/resources/templates.resource.d.ts +9 -0
- package/dist/resources/templates.resource.d.ts.map +1 -0
- package/dist/resources/templates.resource.js +34 -0
- package/dist/resources/templates.resource.js.map +1 -0
- package/dist/resources/unread.resource.d.ts +11 -0
- package/dist/resources/unread.resource.d.ts.map +1 -0
- package/dist/resources/unread.resource.js +46 -0
- package/dist/resources/unread.resource.js.map +1 -0
- package/dist/safety/audit.d.ts +17 -0
- package/dist/safety/audit.d.ts.map +1 -0
- package/dist/safety/audit.js +50 -0
- package/dist/safety/audit.js.map +1 -0
- package/dist/safety/rate-limiter.d.ts +22 -0
- package/dist/safety/rate-limiter.d.ts.map +1 -0
- package/dist/safety/rate-limiter.js +52 -0
- package/dist/safety/rate-limiter.js.map +1 -0
- package/dist/safety/validation.d.ts +44 -0
- package/dist/safety/validation.d.ts.map +1 -0
- package/dist/safety/validation.js +113 -0
- package/dist/safety/validation.js.map +1 -0
- package/dist/server.d.ts +10 -0
- package/dist/server.d.ts.map +1 -0
- package/dist/server.js +25 -0
- package/dist/server.js.map +1 -0
- package/dist/services/calendar.service.d.ts +22 -0
- package/dist/services/calendar.service.d.ts.map +1 -0
- package/dist/services/calendar.service.js +115 -0
- package/dist/services/calendar.service.js.map +1 -0
- package/dist/services/event-bus.d.ts +28 -0
- package/dist/services/event-bus.d.ts.map +1 -0
- package/dist/services/event-bus.js +16 -0
- package/dist/services/event-bus.js.map +1 -0
- package/dist/services/hooks.service.d.ts +77 -0
- package/dist/services/hooks.service.d.ts.map +1 -0
- package/dist/services/hooks.service.js +498 -0
- package/dist/services/hooks.service.js.map +1 -0
- package/dist/services/imap.service.d.ts +133 -0
- package/dist/services/imap.service.d.ts.map +1 -0
- package/dist/services/imap.service.js +1393 -0
- package/dist/services/imap.service.js.map +1 -0
- package/dist/services/label-strategy.d.ts +20 -0
- package/dist/services/label-strategy.d.ts.map +1 -0
- package/dist/services/label-strategy.js +237 -0
- package/dist/services/label-strategy.js.map +1 -0
- package/dist/services/local-calendar.service.d.ts +126 -0
- package/dist/services/local-calendar.service.d.ts.map +1 -0
- package/dist/services/local-calendar.service.js +428 -0
- package/dist/services/local-calendar.service.js.map +1 -0
- package/dist/services/notifier.service.d.ts +69 -0
- package/dist/services/notifier.service.d.ts.map +1 -0
- package/dist/services/notifier.service.js +319 -0
- package/dist/services/notifier.service.js.map +1 -0
- package/dist/services/oauth.service.d.ts +47 -0
- package/dist/services/oauth.service.d.ts.map +1 -0
- package/dist/services/oauth.service.js +140 -0
- package/dist/services/oauth.service.js.map +1 -0
- package/dist/services/presets.d.ts +36 -0
- package/dist/services/presets.d.ts.map +1 -0
- package/dist/services/presets.js +173 -0
- package/dist/services/presets.js.map +1 -0
- package/dist/services/reminders.service.d.ts +63 -0
- package/dist/services/reminders.service.d.ts.map +1 -0
- package/dist/services/reminders.service.js +281 -0
- package/dist/services/reminders.service.js.map +1 -0
- package/dist/services/scheduler.service.d.ts +42 -0
- package/dist/services/scheduler.service.d.ts.map +1 -0
- package/dist/services/scheduler.service.js +260 -0
- package/dist/services/scheduler.service.js.map +1 -0
- package/dist/services/smtp.service.d.ts +40 -0
- package/dist/services/smtp.service.d.ts.map +1 -0
- package/dist/services/smtp.service.js +151 -0
- package/dist/services/smtp.service.js.map +1 -0
- package/dist/services/template.service.d.ts +33 -0
- package/dist/services/template.service.d.ts.map +1 -0
- package/dist/services/template.service.js +123 -0
- package/dist/services/template.service.js.map +1 -0
- package/dist/services/watcher.service.d.ts +36 -0
- package/dist/services/watcher.service.d.ts.map +1 -0
- package/dist/services/watcher.service.js +241 -0
- package/dist/services/watcher.service.js.map +1 -0
- package/dist/tools/accounts.tool.d.ts +7 -0
- package/dist/tools/accounts.tool.d.ts.map +1 -0
- package/dist/tools/accounts.tool.js +29 -0
- package/dist/tools/accounts.tool.js.map +1 -0
- package/dist/tools/analytics.tool.d.ts +9 -0
- package/dist/tools/analytics.tool.d.ts.map +1 -0
- package/dist/tools/analytics.tool.js +27 -0
- package/dist/tools/analytics.tool.js.map +1 -0
- package/dist/tools/attachments.tool.d.ts +7 -0
- package/dist/tools/attachments.tool.d.ts.map +1 -0
- package/dist/tools/attachments.tool.js +45 -0
- package/dist/tools/attachments.tool.js.map +1 -0
- package/dist/tools/bulk.tool.d.ts +7 -0
- package/dist/tools/bulk.tool.d.ts.map +1 -0
- package/dist/tools/bulk.tool.js +75 -0
- package/dist/tools/bulk.tool.js.map +1 -0
- package/dist/tools/calendar.tool.d.ts +19 -0
- package/dist/tools/calendar.tool.d.ts.map +1 -0
- package/dist/tools/calendar.tool.js +538 -0
- package/dist/tools/calendar.tool.js.map +1 -0
- package/dist/tools/contacts.tool.d.ts +7 -0
- package/dist/tools/contacts.tool.d.ts.map +1 -0
- package/dist/tools/contacts.tool.js +44 -0
- package/dist/tools/contacts.tool.js.map +1 -0
- package/dist/tools/drafts.tool.d.ts +8 -0
- package/dist/tools/drafts.tool.d.ts.map +1 -0
- package/dist/tools/drafts.tool.js +92 -0
- package/dist/tools/drafts.tool.js.map +1 -0
- package/dist/tools/emails.tool.d.ts +7 -0
- package/dist/tools/emails.tool.d.ts.map +1 -0
- package/dist/tools/emails.tool.js +400 -0
- package/dist/tools/emails.tool.js.map +1 -0
- package/dist/tools/folders.tool.d.ts +7 -0
- package/dist/tools/folders.tool.d.ts.map +1 -0
- package/dist/tools/folders.tool.js +111 -0
- package/dist/tools/folders.tool.js.map +1 -0
- package/dist/tools/health.tool.d.ts +10 -0
- package/dist/tools/health.tool.d.ts.map +1 -0
- package/dist/tools/health.tool.js +78 -0
- package/dist/tools/health.tool.js.map +1 -0
- package/dist/tools/label.tool.d.ts +11 -0
- package/dist/tools/label.tool.d.ts.map +1 -0
- package/dist/tools/label.tool.js +165 -0
- package/dist/tools/label.tool.js.map +1 -0
- package/dist/tools/locate.tool.d.ts +11 -0
- package/dist/tools/locate.tool.d.ts.map +1 -0
- package/dist/tools/locate.tool.js +59 -0
- package/dist/tools/locate.tool.js.map +1 -0
- package/dist/tools/mailboxes.tool.d.ts +7 -0
- package/dist/tools/mailboxes.tool.d.ts.map +1 -0
- package/dist/tools/mailboxes.tool.js +38 -0
- package/dist/tools/mailboxes.tool.js.map +1 -0
- package/dist/tools/manage.tool.d.ts +7 -0
- package/dist/tools/manage.tool.d.ts.map +1 -0
- package/dist/tools/manage.tool.js +125 -0
- package/dist/tools/manage.tool.js.map +1 -0
- package/dist/tools/register.d.ts +20 -0
- package/dist/tools/register.d.ts.map +1 -0
- package/dist/tools/register.js +53 -0
- package/dist/tools/register.js.map +1 -0
- package/dist/tools/scheduler.tool.d.ts +9 -0
- package/dist/tools/scheduler.tool.d.ts.map +1 -0
- package/dist/tools/scheduler.tool.js +104 -0
- package/dist/tools/scheduler.tool.js.map +1 -0
- package/dist/tools/send.tool.d.ts +7 -0
- package/dist/tools/send.tool.d.ts.map +1 -0
- package/dist/tools/send.tool.js +123 -0
- package/dist/tools/send.tool.js.map +1 -0
- package/dist/tools/templates.tool.d.ts +12 -0
- package/dist/tools/templates.tool.d.ts.map +1 -0
- package/dist/tools/templates.tool.js +140 -0
- package/dist/tools/templates.tool.js.map +1 -0
- package/dist/tools/thread.tool.d.ts +10 -0
- package/dist/tools/thread.tool.d.ts.map +1 -0
- package/dist/tools/thread.tool.js +146 -0
- package/dist/tools/thread.tool.js.map +1 -0
- package/dist/tools/watcher.tool.d.ts +9 -0
- package/dist/tools/watcher.tool.d.ts.map +1 -0
- package/dist/tools/watcher.tool.js +282 -0
- package/dist/tools/watcher.tool.js.map +1 -0
- package/dist/types/index.d.ts +271 -0
- package/dist/types/index.d.ts.map +1 -0
- package/dist/types/index.js +5 -0
- package/dist/types/index.js.map +1 -0
- package/dist/utils/calendar-notes.d.ts +31 -0
- package/dist/utils/calendar-notes.d.ts.map +1 -0
- package/dist/utils/calendar-notes.js +99 -0
- package/dist/utils/calendar-notes.js.map +1 -0
- package/dist/utils/calendar-state.d.ts +27 -0
- package/dist/utils/calendar-state.d.ts.map +1 -0
- package/dist/utils/calendar-state.js +85 -0
- package/dist/utils/calendar-state.js.map +1 -0
- package/dist/utils/conference-details.d.ts +12 -0
- package/dist/utils/conference-details.d.ts.map +1 -0
- package/dist/utils/conference-details.js +71 -0
- package/dist/utils/conference-details.js.map +1 -0
- package/dist/utils/meeting-url.d.ts +10 -0
- package/dist/utils/meeting-url.d.ts.map +1 -0
- package/dist/utils/meeting-url.js +30 -0
- package/dist/utils/meeting-url.js.map +1 -0
- package/package.json +108 -0
|
@@ -0,0 +1,271 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Shared TypeScript types for the Email MCP Server.
|
|
3
|
+
*/
|
|
4
|
+
export interface EmailAddress {
|
|
5
|
+
name?: string;
|
|
6
|
+
address: string;
|
|
7
|
+
}
|
|
8
|
+
export interface Account {
|
|
9
|
+
name: string;
|
|
10
|
+
email: string;
|
|
11
|
+
fullName?: string;
|
|
12
|
+
}
|
|
13
|
+
export interface ImapConfig {
|
|
14
|
+
host: string;
|
|
15
|
+
port: number;
|
|
16
|
+
tls: boolean;
|
|
17
|
+
starttls: boolean;
|
|
18
|
+
verifySsl: boolean;
|
|
19
|
+
}
|
|
20
|
+
export interface SmtpConfig {
|
|
21
|
+
host: string;
|
|
22
|
+
port: number;
|
|
23
|
+
tls: boolean;
|
|
24
|
+
starttls: boolean;
|
|
25
|
+
verifySsl: boolean;
|
|
26
|
+
pool?: {
|
|
27
|
+
enabled: boolean;
|
|
28
|
+
maxConnections: number;
|
|
29
|
+
maxMessages: number;
|
|
30
|
+
};
|
|
31
|
+
}
|
|
32
|
+
export interface OAuth2Config {
|
|
33
|
+
provider: 'google' | 'microsoft' | 'custom';
|
|
34
|
+
clientId: string;
|
|
35
|
+
clientSecret: string;
|
|
36
|
+
refreshToken: string;
|
|
37
|
+
accessToken?: string;
|
|
38
|
+
tokenExpiry?: number;
|
|
39
|
+
tokenUrl?: string;
|
|
40
|
+
authUrl?: string;
|
|
41
|
+
scopes?: string[];
|
|
42
|
+
}
|
|
43
|
+
export interface AccountConfig {
|
|
44
|
+
name: string;
|
|
45
|
+
email: string;
|
|
46
|
+
fullName?: string;
|
|
47
|
+
username: string;
|
|
48
|
+
password?: string;
|
|
49
|
+
oauth2?: OAuth2Config;
|
|
50
|
+
imap: ImapConfig;
|
|
51
|
+
smtp: SmtpConfig;
|
|
52
|
+
}
|
|
53
|
+
export interface WatcherConfig {
|
|
54
|
+
enabled: boolean;
|
|
55
|
+
folders: string[];
|
|
56
|
+
idleTimeout: number;
|
|
57
|
+
}
|
|
58
|
+
export interface HookRuleMatch {
|
|
59
|
+
from?: string;
|
|
60
|
+
to?: string;
|
|
61
|
+
subject?: string;
|
|
62
|
+
}
|
|
63
|
+
export interface HookRuleActions {
|
|
64
|
+
labels?: string[];
|
|
65
|
+
flag?: boolean;
|
|
66
|
+
markRead?: boolean;
|
|
67
|
+
alert?: boolean;
|
|
68
|
+
/** Add the email's calendar event to the local calendar (triggers confirmation dialog). */
|
|
69
|
+
addToCalendar?: boolean;
|
|
70
|
+
}
|
|
71
|
+
export interface HookRule {
|
|
72
|
+
name: string;
|
|
73
|
+
match: HookRuleMatch;
|
|
74
|
+
actions: HookRuleActions;
|
|
75
|
+
}
|
|
76
|
+
export interface AlertsConfig {
|
|
77
|
+
desktop: boolean;
|
|
78
|
+
sound: boolean;
|
|
79
|
+
urgencyThreshold: 'urgent' | 'high' | 'normal' | 'low';
|
|
80
|
+
webhookUrl: string;
|
|
81
|
+
webhookEvents: ('urgent' | 'high' | 'normal' | 'low')[];
|
|
82
|
+
}
|
|
83
|
+
export interface HooksConfig {
|
|
84
|
+
onNewEmail: 'triage' | 'notify' | 'none';
|
|
85
|
+
preset: 'inbox-zero' | 'gtd' | 'priority-focus' | 'notification-only' | 'custom';
|
|
86
|
+
autoLabel: boolean;
|
|
87
|
+
autoFlag: boolean;
|
|
88
|
+
batchDelay: number;
|
|
89
|
+
customInstructions?: string;
|
|
90
|
+
systemPrompt?: string;
|
|
91
|
+
rules: HookRule[];
|
|
92
|
+
alerts: AlertsConfig;
|
|
93
|
+
/** Automatically add calendar events detected in new emails to the local calendar. */
|
|
94
|
+
autoCalendar?: boolean;
|
|
95
|
+
/** Target calendar name for auto-add (empty = default calendar). */
|
|
96
|
+
calendarName?: string;
|
|
97
|
+
/** Minutes before event to show an alert (default: 15). */
|
|
98
|
+
calendarAlarmMinutes?: number;
|
|
99
|
+
/** Show a native confirmation dialog before adding (default: true). */
|
|
100
|
+
calendarConfirm?: boolean;
|
|
101
|
+
}
|
|
102
|
+
export interface AppConfig {
|
|
103
|
+
settings: {
|
|
104
|
+
rateLimit: number;
|
|
105
|
+
readOnly: boolean;
|
|
106
|
+
watcher: WatcherConfig;
|
|
107
|
+
hooks: HooksConfig;
|
|
108
|
+
};
|
|
109
|
+
accounts: AccountConfig[];
|
|
110
|
+
}
|
|
111
|
+
export interface Mailbox {
|
|
112
|
+
name: string;
|
|
113
|
+
path: string;
|
|
114
|
+
specialUse?: string;
|
|
115
|
+
totalMessages: number;
|
|
116
|
+
unseenMessages: number;
|
|
117
|
+
}
|
|
118
|
+
export interface EmailMeta {
|
|
119
|
+
id: string;
|
|
120
|
+
subject: string;
|
|
121
|
+
from: EmailAddress;
|
|
122
|
+
to: EmailAddress[];
|
|
123
|
+
date: string;
|
|
124
|
+
seen: boolean;
|
|
125
|
+
flagged: boolean;
|
|
126
|
+
answered: boolean;
|
|
127
|
+
hasAttachments: boolean;
|
|
128
|
+
labels: string[];
|
|
129
|
+
preview?: string;
|
|
130
|
+
}
|
|
131
|
+
export interface AttachmentMeta {
|
|
132
|
+
filename: string;
|
|
133
|
+
mimeType: string;
|
|
134
|
+
size: number;
|
|
135
|
+
}
|
|
136
|
+
export interface Email extends EmailMeta {
|
|
137
|
+
cc?: EmailAddress[];
|
|
138
|
+
bcc?: EmailAddress[];
|
|
139
|
+
bodyText?: string;
|
|
140
|
+
bodyHtml?: string;
|
|
141
|
+
messageId: string;
|
|
142
|
+
inReplyTo?: string;
|
|
143
|
+
references?: string[];
|
|
144
|
+
attachments: AttachmentMeta[];
|
|
145
|
+
headers: Record<string, string>;
|
|
146
|
+
}
|
|
147
|
+
export interface SendResult {
|
|
148
|
+
messageId: string;
|
|
149
|
+
status: 'sent' | 'failed';
|
|
150
|
+
}
|
|
151
|
+
export interface PaginatedResult<T> {
|
|
152
|
+
items: T[];
|
|
153
|
+
total: number;
|
|
154
|
+
page: number;
|
|
155
|
+
pageSize: number;
|
|
156
|
+
hasMore: boolean;
|
|
157
|
+
}
|
|
158
|
+
export interface BulkResult {
|
|
159
|
+
total: number;
|
|
160
|
+
succeeded: number;
|
|
161
|
+
failed: number;
|
|
162
|
+
errors?: string[];
|
|
163
|
+
}
|
|
164
|
+
export interface Contact {
|
|
165
|
+
name?: string;
|
|
166
|
+
email: string;
|
|
167
|
+
frequency: number;
|
|
168
|
+
lastSeen: string;
|
|
169
|
+
}
|
|
170
|
+
export interface AuditEntry {
|
|
171
|
+
ts: string;
|
|
172
|
+
tool: string;
|
|
173
|
+
account: string;
|
|
174
|
+
params: Record<string, unknown>;
|
|
175
|
+
result: 'ok' | 'error';
|
|
176
|
+
error?: string;
|
|
177
|
+
}
|
|
178
|
+
export interface ThreadResult {
|
|
179
|
+
threadId: string;
|
|
180
|
+
messages: Email[];
|
|
181
|
+
participants: EmailAddress[];
|
|
182
|
+
messageCount: number;
|
|
183
|
+
}
|
|
184
|
+
export interface EmailTemplate {
|
|
185
|
+
name: string;
|
|
186
|
+
description?: string;
|
|
187
|
+
subject: string;
|
|
188
|
+
body: string;
|
|
189
|
+
variables: string[];
|
|
190
|
+
}
|
|
191
|
+
export interface ProviderConfig {
|
|
192
|
+
name: string;
|
|
193
|
+
domains: string[];
|
|
194
|
+
imap: ImapConfig;
|
|
195
|
+
smtp: SmtpConfig;
|
|
196
|
+
notes?: string;
|
|
197
|
+
oauth2?: {
|
|
198
|
+
authUrl: string;
|
|
199
|
+
tokenUrl: string;
|
|
200
|
+
scopes: string[];
|
|
201
|
+
};
|
|
202
|
+
}
|
|
203
|
+
export interface CalendarEvent {
|
|
204
|
+
uid: string;
|
|
205
|
+
summary: string;
|
|
206
|
+
description?: string;
|
|
207
|
+
start: string;
|
|
208
|
+
end: string;
|
|
209
|
+
location?: string;
|
|
210
|
+
organizer?: EmailAddress;
|
|
211
|
+
attendees: EmailAddress[];
|
|
212
|
+
status: 'TENTATIVE' | 'CONFIRMED' | 'CANCELLED';
|
|
213
|
+
method?: string;
|
|
214
|
+
recurrence?: string;
|
|
215
|
+
}
|
|
216
|
+
export interface SenderStat {
|
|
217
|
+
email: string;
|
|
218
|
+
name?: string;
|
|
219
|
+
count: number;
|
|
220
|
+
}
|
|
221
|
+
export interface DailyVolume {
|
|
222
|
+
date: string;
|
|
223
|
+
count: number;
|
|
224
|
+
}
|
|
225
|
+
export interface EmailStats {
|
|
226
|
+
period: 'day' | 'week' | 'month';
|
|
227
|
+
dateRange: {
|
|
228
|
+
from: string;
|
|
229
|
+
to: string;
|
|
230
|
+
};
|
|
231
|
+
totalReceived: number;
|
|
232
|
+
unreadCount: number;
|
|
233
|
+
flaggedCount: number;
|
|
234
|
+
topSenders: SenderStat[];
|
|
235
|
+
dailyVolume: DailyVolume[];
|
|
236
|
+
hasAttachmentsCount: number;
|
|
237
|
+
avgPerDay: number;
|
|
238
|
+
}
|
|
239
|
+
export interface QuotaInfo {
|
|
240
|
+
usedMb: number;
|
|
241
|
+
totalMb: number;
|
|
242
|
+
percentage: number;
|
|
243
|
+
}
|
|
244
|
+
export type LabelStrategyType = 'protonmail' | 'gmail' | 'keyword' | 'unsupported';
|
|
245
|
+
export interface LabelInfo {
|
|
246
|
+
name: string;
|
|
247
|
+
path?: string;
|
|
248
|
+
strategy: LabelStrategyType;
|
|
249
|
+
}
|
|
250
|
+
export interface ScheduledEmail {
|
|
251
|
+
id: string;
|
|
252
|
+
account: string;
|
|
253
|
+
to: string[];
|
|
254
|
+
cc?: string[];
|
|
255
|
+
bcc?: string[];
|
|
256
|
+
subject: string;
|
|
257
|
+
body: string;
|
|
258
|
+
html: boolean;
|
|
259
|
+
sendAt: string;
|
|
260
|
+
createdAt: string;
|
|
261
|
+
status: 'pending' | 'sending' | 'sent' | 'failed';
|
|
262
|
+
attempts: number;
|
|
263
|
+
lastError?: string;
|
|
264
|
+
draftMessageId?: string;
|
|
265
|
+
draftMailbox?: string;
|
|
266
|
+
inReplyTo?: string;
|
|
267
|
+
references?: string[];
|
|
268
|
+
sentAt?: string;
|
|
269
|
+
sentMessageId?: string;
|
|
270
|
+
}
|
|
271
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/types/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAMH,MAAM,WAAW,YAAY;IAC3B,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,MAAM,CAAC;CACjB;AAMD,MAAM,WAAW,OAAO;IACtB,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,UAAU;IACzB,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,GAAG,EAAE,OAAO,CAAC;IACb,QAAQ,EAAE,OAAO,CAAC;IAClB,SAAS,EAAE,OAAO,CAAC;CACpB;AAED,MAAM,WAAW,UAAU;IACzB,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,GAAG,EAAE,OAAO,CAAC;IACb,QAAQ,EAAE,OAAO,CAAC;IAClB,SAAS,EAAE,OAAO,CAAC;IACnB,IAAI,CAAC,EAAE;QACL,OAAO,EAAE,OAAO,CAAC;QACjB,cAAc,EAAE,MAAM,CAAC;QACvB,WAAW,EAAE,MAAM,CAAC;KACrB,CAAC;CACH;AAMD,MAAM,WAAW,YAAY;IAC3B,QAAQ,EAAE,QAAQ,GAAG,WAAW,GAAG,QAAQ,CAAC;IAC5C,QAAQ,EAAE,MAAM,CAAC;IACjB,YAAY,EAAE,MAAM,CAAC;IACrB,YAAY,EAAE,MAAM,CAAC;IACrB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,WAAW,CAAC,EAAE,MAAM,CAAC;IAErB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,MAAM,CAAC,EAAE,MAAM,EAAE,CAAC;CACnB;AAED,MAAM,WAAW,aAAa;IAC5B,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,MAAM,CAAC,EAAE,YAAY,CAAC;IACtB,IAAI,EAAE,UAAU,CAAC;IACjB,IAAI,EAAE,UAAU,CAAC;CAClB;AAED,MAAM,WAAW,aAAa;IAC5B,OAAO,EAAE,OAAO,CAAC;IACjB,OAAO,EAAE,MAAM,EAAE,CAAC;IAClB,WAAW,EAAE,MAAM,CAAC;CACrB;AAMD,MAAM,WAAW,aAAa;IAC5B,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,EAAE,CAAC,EAAE,MAAM,CAAC;IACZ,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED,MAAM,WAAW,eAAe;IAC9B,MAAM,CAAC,EAAE,MAAM,EAAE,CAAC;IAClB,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,2FAA2F;IAC3F,aAAa,CAAC,EAAE,OAAO,CAAC;CACzB;AAED,MAAM,WAAW,QAAQ;IACvB,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,aAAa,CAAC;IACrB,OAAO,EAAE,eAAe,CAAC;CAC1B;AAMD,MAAM,WAAW,YAAY;IAC3B,OAAO,EAAE,OAAO,CAAC;IACjB,KAAK,EAAE,OAAO,CAAC;IACf,gBAAgB,EAAE,QAAQ,GAAG,MAAM,GAAG,QAAQ,GAAG,KAAK,CAAC;IACvD,UAAU,EAAE,MAAM,CAAC;IACnB,aAAa,EAAE,CAAC,QAAQ,GAAG,MAAM,GAAG,QAAQ,GAAG,KAAK,CAAC,EAAE,CAAC;CACzD;AAMD,MAAM,WAAW,WAAW;IAC1B,UAAU,EAAE,QAAQ,GAAG,QAAQ,GAAG,MAAM,CAAC;IACzC,MAAM,EAAE,YAAY,GAAG,KAAK,GAAG,gBAAgB,GAAG,mBAAmB,GAAG,QAAQ,CAAC;IACjF,SAAS,EAAE,OAAO,CAAC;IACnB,QAAQ,EAAE,OAAO,CAAC;IAClB,UAAU,EAAE,MAAM,CAAC;IACnB,kBAAkB,CAAC,EAAE,MAAM,CAAC;IAC5B,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,KAAK,EAAE,QAAQ,EAAE,CAAC;IAClB,MAAM,EAAE,YAAY,CAAC;IACrB,sFAAsF;IACtF,YAAY,CAAC,EAAE,OAAO,CAAC;IACvB,oEAAoE;IACpE,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,2DAA2D;IAC3D,oBAAoB,CAAC,EAAE,MAAM,CAAC;IAC9B,uEAAuE;IACvE,eAAe,CAAC,EAAE,OAAO,CAAC;CAC3B;AAED,MAAM,WAAW,SAAS;IACxB,QAAQ,EAAE;QACR,SAAS,EAAE,MAAM,CAAC;QAClB,QAAQ,EAAE,OAAO,CAAC;QAClB,OAAO,EAAE,aAAa,CAAC;QACvB,KAAK,EAAE,WAAW,CAAC;KACpB,CAAC;IACF,QAAQ,EAAE,aAAa,EAAE,CAAC;CAC3B;AAMD,MAAM,WAAW,OAAO;IACtB,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,aAAa,EAAE,MAAM,CAAC;IACtB,cAAc,EAAE,MAAM,CAAC;CACxB;AAMD,MAAM,WAAW,SAAS;IACxB,EAAE,EAAE,MAAM,CAAC;IACX,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,EAAE,YAAY,CAAC;IACnB,EAAE,EAAE,YAAY,EAAE,CAAC;IACnB,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,OAAO,CAAC;IACd,OAAO,EAAE,OAAO,CAAC;IACjB,QAAQ,EAAE,OAAO,CAAC;IAClB,cAAc,EAAE,OAAO,CAAC;IACxB,MAAM,EAAE,MAAM,EAAE,CAAC;IACjB,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED,MAAM,WAAW,cAAc;IAC7B,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,EAAE,MAAM,CAAC;IACjB,IAAI,EAAE,MAAM,CAAC;CACd;AAED,MAAM,WAAW,KAAM,SAAQ,SAAS;IACtC,EAAE,CAAC,EAAE,YAAY,EAAE,CAAC;IACpB,GAAG,CAAC,EAAE,YAAY,EAAE,CAAC;IACrB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,UAAU,CAAC,EAAE,MAAM,EAAE,CAAC;IACtB,WAAW,EAAE,cAAc,EAAE,CAAC;IAC9B,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;CACjC;AAMD,MAAM,WAAW,UAAU;IACzB,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,EAAE,MAAM,GAAG,QAAQ,CAAC;CAC3B;AAED,MAAM,WAAW,eAAe,CAAC,CAAC;IAChC,KAAK,EAAE,CAAC,EAAE,CAAC;IACX,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,MAAM,CAAC;IACjB,OAAO,EAAE,OAAO,CAAC;CAClB;AAMD,MAAM,WAAW,UAAU;IACzB,KAAK,EAAE,MAAM,CAAC;IACd,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,CAAC,EAAE,MAAM,EAAE,CAAC;CACnB;AAMD,MAAM,WAAW,OAAO;IACtB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,MAAM,CAAC;IACd,SAAS,EAAE,MAAM,CAAC;IAClB,QAAQ,EAAE,MAAM,CAAC;CAClB;AAMD,MAAM,WAAW,UAAU;IACzB,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAChC,MAAM,EAAE,IAAI,GAAG,OAAO,CAAC;IACvB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAMD,MAAM,WAAW,YAAY;IAC3B,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,EAAE,KAAK,EAAE,CAAC;IAClB,YAAY,EAAE,YAAY,EAAE,CAAC;IAC7B,YAAY,EAAE,MAAM,CAAC;CACtB;AAMD,MAAM,WAAW,aAAa;IAC5B,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,EAAE,MAAM,CAAC;IACb,SAAS,EAAE,MAAM,EAAE,CAAC;CACrB;AAMD,MAAM,WAAW,cAAc;IAC7B,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,EAAE,CAAC;IAClB,IAAI,EAAE,UAAU,CAAC;IACjB,IAAI,EAAE,UAAU,CAAC;IACjB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,MAAM,CAAC,EAAE;QACP,OAAO,EAAE,MAAM,CAAC;QAChB,QAAQ,EAAE,MAAM,CAAC;QACjB,MAAM,EAAE,MAAM,EAAE,CAAC;KAClB,CAAC;CACH;AAMD,MAAM,WAAW,aAAa;IAC5B,GAAG,EAAE,MAAM,CAAC;IACZ,OAAO,EAAE,MAAM,CAAC;IAChB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,KAAK,EAAE,MAAM,CAAC;IACd,GAAG,EAAE,MAAM,CAAC;IACZ,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,SAAS,CAAC,EAAE,YAAY,CAAC;IACzB,SAAS,EAAE,YAAY,EAAE,CAAC;IAC1B,MAAM,EAAE,WAAW,GAAG,WAAW,GAAG,WAAW,CAAC;IAChD,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAMD,MAAM,WAAW,UAAU;IACzB,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,MAAM,CAAC;CACf;AAED,MAAM,WAAW,WAAW;IAC1B,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,CAAC;CACf;AAED,MAAM,WAAW,UAAU;IACzB,MAAM,EAAE,KAAK,GAAG,MAAM,GAAG,OAAO,CAAC;IACjC,SAAS,EAAE;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,EAAE,EAAE,MAAM,CAAA;KAAE,CAAC;IACxC,aAAa,EAAE,MAAM,CAAC;IACtB,WAAW,EAAE,MAAM,CAAC;IACpB,YAAY,EAAE,MAAM,CAAC;IACrB,UAAU,EAAE,UAAU,EAAE,CAAC;IACzB,WAAW,EAAE,WAAW,EAAE,CAAC;IAC3B,mBAAmB,EAAE,MAAM,CAAC;IAC5B,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,SAAS;IACxB,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,EAAE,MAAM,CAAC;IAChB,UAAU,EAAE,MAAM,CAAC;CACpB;AAMD,MAAM,MAAM,iBAAiB,GAAG,YAAY,GAAG,OAAO,GAAG,SAAS,GAAG,aAAa,CAAC;AAEnF,MAAM,WAAW,SAAS;IACxB,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,QAAQ,EAAE,iBAAiB,CAAC;CAC7B;AAMD,MAAM,WAAW,cAAc;IAC7B,EAAE,EAAE,MAAM,CAAC;IACX,OAAO,EAAE,MAAM,CAAC;IAChB,EAAE,EAAE,MAAM,EAAE,CAAC;IACb,EAAE,CAAC,EAAE,MAAM,EAAE,CAAC;IACd,GAAG,CAAC,EAAE,MAAM,EAAE,CAAC;IACf,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,OAAO,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;IACf,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,EAAE,SAAS,GAAG,SAAS,GAAG,MAAM,GAAG,QAAQ,CAAC;IAClD,QAAQ,EAAE,MAAM,CAAC;IACjB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,UAAU,CAAC,EAAE,MAAM,EAAE,CAAC;IACtB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,aAAa,CAAC,EAAE,MAAM,CAAC;CACxB"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/types/index.ts"],"names":[],"mappings":"AAAA;;GAEG"}
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Build rich calendar event notes from all available email + conference data.
|
|
3
|
+
* The resulting string is stored in the calendar event's description/notes field.
|
|
4
|
+
*/
|
|
5
|
+
export interface CalendarNotesInput {
|
|
6
|
+
emailFrom?: string;
|
|
7
|
+
emailSubject?: string;
|
|
8
|
+
emailDate?: string;
|
|
9
|
+
attendees?: string[];
|
|
10
|
+
organizer?: string;
|
|
11
|
+
dialIn?: string;
|
|
12
|
+
meetingId?: string;
|
|
13
|
+
passcode?: string;
|
|
14
|
+
conferenceProvider?: string;
|
|
15
|
+
meetingUrl?: string;
|
|
16
|
+
meetingUrlLabel?: string;
|
|
17
|
+
bodyExcerpt?: string;
|
|
18
|
+
savedAttachments?: {
|
|
19
|
+
filename: string;
|
|
20
|
+
fileUrl: string;
|
|
21
|
+
size: number;
|
|
22
|
+
}[];
|
|
23
|
+
pendingAttachments?: {
|
|
24
|
+
filename: string;
|
|
25
|
+
mimeType: string;
|
|
26
|
+
size: number;
|
|
27
|
+
}[];
|
|
28
|
+
}
|
|
29
|
+
/** Build the full rich notes string for a calendar event. */
|
|
30
|
+
export declare function buildCalendarNotes(input: CalendarNotesInput): string;
|
|
31
|
+
//# sourceMappingURL=calendar-notes.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"calendar-notes.d.ts","sourceRoot":"","sources":["../../src/utils/calendar-notes.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,MAAM,WAAW,kBAAkB;IACjC,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,SAAS,CAAC,EAAE,MAAM,EAAE,CAAC;IACrB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,kBAAkB,CAAC,EAAE,MAAM,CAAC;IAC5B,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,gBAAgB,CAAC,EAAE;QAAE,QAAQ,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE,EAAE,CAAC;IACzE,kBAAkB,CAAC,EAAE;QAAE,QAAQ,EAAE,MAAM,CAAC;QAAC,QAAQ,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE,EAAE,CAAC;CAC7E;AA0BD,6DAA6D;AAC7D,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,kBAAkB,GAAG,MAAM,CAgEpE"}
|
|
@@ -0,0 +1,99 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Build rich calendar event notes from all available email + conference data.
|
|
3
|
+
* The resulting string is stored in the calendar event's description/notes field.
|
|
4
|
+
*/
|
|
5
|
+
function formatSize(bytes) {
|
|
6
|
+
if (bytes < 1024)
|
|
7
|
+
return `${bytes} B`;
|
|
8
|
+
if (bytes < 1024 * 1024)
|
|
9
|
+
return `${Math.round(bytes / 1024)} KB`;
|
|
10
|
+
return `${(bytes / (1024 * 1024)).toFixed(1)} MB`;
|
|
11
|
+
}
|
|
12
|
+
function stripHtml(html) {
|
|
13
|
+
return html
|
|
14
|
+
.replace(/<style[^>]*>[\s\S]*?<\/style>/gi, '')
|
|
15
|
+
.replace(/<script[^>]*>[\s\S]*?<\/script>/gi, '')
|
|
16
|
+
.replace(/<br\s*\/?>/gi, '\n')
|
|
17
|
+
.replace(/<\/p>/gi, '\n')
|
|
18
|
+
.replace(/<\/div>/gi, '\n')
|
|
19
|
+
.replace(/<[^>]+>/g, '')
|
|
20
|
+
.replace(/ /g, ' ')
|
|
21
|
+
.replace(/&/g, '&')
|
|
22
|
+
.replace(/</g, '<')
|
|
23
|
+
.replace(/>/g, '>')
|
|
24
|
+
.replace(/"/g, '"')
|
|
25
|
+
.replace(/'/g, "'")
|
|
26
|
+
.replace(/\n{3,}/g, '\n\n')
|
|
27
|
+
.trim();
|
|
28
|
+
}
|
|
29
|
+
/** Build the full rich notes string for a calendar event. */
|
|
30
|
+
export function buildCalendarNotes(input) {
|
|
31
|
+
const sections = [];
|
|
32
|
+
// Email origin
|
|
33
|
+
const originLines = [];
|
|
34
|
+
if (input.emailFrom)
|
|
35
|
+
originLines.push(`📧 From: ${input.emailFrom}`);
|
|
36
|
+
if (input.emailSubject)
|
|
37
|
+
originLines.push(`📧 Subject: ${input.emailSubject}`);
|
|
38
|
+
if (input.emailDate)
|
|
39
|
+
originLines.push(`📧 Received: ${input.emailDate}`);
|
|
40
|
+
if (originLines.length > 0)
|
|
41
|
+
sections.push(originLines.join('\n'));
|
|
42
|
+
// Attendees
|
|
43
|
+
if (input.organizer) {
|
|
44
|
+
const attendeeLines = [`👤 Organizer: ${input.organizer}`];
|
|
45
|
+
if (input.attendees && input.attendees.length > 0) {
|
|
46
|
+
attendeeLines.push(`👥 Attendees: ${input.attendees.join(', ')}`);
|
|
47
|
+
}
|
|
48
|
+
sections.push(attendeeLines.join('\n'));
|
|
49
|
+
}
|
|
50
|
+
else if (input.attendees && input.attendees.length > 0) {
|
|
51
|
+
sections.push(`👥 Attendees: ${input.attendees.join(', ')}`);
|
|
52
|
+
}
|
|
53
|
+
// Conference / meeting details
|
|
54
|
+
const confLines = [];
|
|
55
|
+
if (input.meetingUrl) {
|
|
56
|
+
const label = input.meetingUrlLabel ?? input.conferenceProvider ?? 'Meeting Link';
|
|
57
|
+
confLines.push(`🎥 ${label}: ${input.meetingUrl}`);
|
|
58
|
+
}
|
|
59
|
+
if (input.dialIn)
|
|
60
|
+
confLines.push(`📞 Dial-in: ${input.dialIn}`);
|
|
61
|
+
if (input.meetingId) {
|
|
62
|
+
const idLine = input.passcode
|
|
63
|
+
? `🔑 Meeting ID: ${input.meetingId} · Passcode: ${input.passcode}`
|
|
64
|
+
: `🔑 Meeting ID: ${input.meetingId}`;
|
|
65
|
+
confLines.push(idLine);
|
|
66
|
+
}
|
|
67
|
+
else if (input.passcode) {
|
|
68
|
+
confLines.push(`🔑 Passcode: ${input.passcode}`);
|
|
69
|
+
}
|
|
70
|
+
if (confLines.length > 0)
|
|
71
|
+
sections.push(confLines.join('\n'));
|
|
72
|
+
// Body excerpt
|
|
73
|
+
if (input.bodyExcerpt) {
|
|
74
|
+
const cleaned = input.bodyExcerpt.includes('<')
|
|
75
|
+
? stripHtml(input.bodyExcerpt)
|
|
76
|
+
: input.bodyExcerpt;
|
|
77
|
+
const excerpt = cleaned.slice(0, 500).trim();
|
|
78
|
+
if (excerpt)
|
|
79
|
+
sections.push(`📝 Details:\n${excerpt}${cleaned.length > 500 ? '…' : ''}`);
|
|
80
|
+
}
|
|
81
|
+
// Saved attachments (with file:// links)
|
|
82
|
+
if (input.savedAttachments && input.savedAttachments.length > 0) {
|
|
83
|
+
const lines = ['📎 Attachments:'];
|
|
84
|
+
input.savedAttachments.forEach(({ filename, fileUrl, size }) => {
|
|
85
|
+
lines.push(` • ${filename} (${formatSize(size)}) → ${fileUrl}`);
|
|
86
|
+
});
|
|
87
|
+
sections.push(lines.join('\n'));
|
|
88
|
+
}
|
|
89
|
+
else if (input.pendingAttachments && input.pendingAttachments.length > 0) {
|
|
90
|
+
// Fallback: list without paths (pre-save)
|
|
91
|
+
const lines = ['📎 Attachments:'];
|
|
92
|
+
input.pendingAttachments.forEach(({ filename, size }) => {
|
|
93
|
+
lines.push(` • ${filename} (${formatSize(size)})`);
|
|
94
|
+
});
|
|
95
|
+
sections.push(lines.join('\n'));
|
|
96
|
+
}
|
|
97
|
+
return sections.join('\n\n');
|
|
98
|
+
}
|
|
99
|
+
//# sourceMappingURL=calendar-notes.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"calendar-notes.js","sourceRoot":"","sources":["../../src/utils/calendar-notes.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* One-shot calendar processing state.
|
|
3
|
+
*
|
|
4
|
+
* Tracks which emails have already been auto-processed for calendar/reminder
|
|
5
|
+
* creation via the hook system. Once an email is marked as processed, the
|
|
6
|
+
* auto-trigger is suppressed — the user must explicitly instruct the AI to
|
|
7
|
+
* create further events or reminders for that email.
|
|
8
|
+
*
|
|
9
|
+
* Manual tool calls (add_to_calendar, create_reminder) always work regardless
|
|
10
|
+
* of this state — it only gates the automatic hook trigger.
|
|
11
|
+
*/
|
|
12
|
+
export type CalendarAction = 'event' | 'reminder' | 'both' | 'skipped';
|
|
13
|
+
export interface ProcessedEntry {
|
|
14
|
+
processedAt: string;
|
|
15
|
+
action: CalendarAction;
|
|
16
|
+
title?: string;
|
|
17
|
+
}
|
|
18
|
+
/** Returns true if this email has already been auto-processed by the hook system. */
|
|
19
|
+
export declare function isCalendarProcessed(accountName: string, emailId: string): Promise<boolean>;
|
|
20
|
+
/** Marks an email as processed so the hook auto-trigger won't fire again. */
|
|
21
|
+
export declare function markCalendarProcessed(accountName: string, emailId: string, action: CalendarAction, title?: string): Promise<void>;
|
|
22
|
+
/** Returns all processed entries (for inspection/debugging). */
|
|
23
|
+
export declare function listCalendarProcessed(): Promise<{
|
|
24
|
+
key: string;
|
|
25
|
+
entry: ProcessedEntry;
|
|
26
|
+
}[]>;
|
|
27
|
+
//# sourceMappingURL=calendar-state.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"calendar-state.d.ts","sourceRoot":"","sources":["../../src/utils/calendar-state.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AASH,MAAM,MAAM,cAAc,GAAG,OAAO,GAAG,UAAU,GAAG,MAAM,GAAG,SAAS,CAAC;AAEvE,MAAM,WAAW,cAAc;IAC7B,WAAW,EAAE,MAAM,CAAC;IACpB,MAAM,EAAE,cAAc,CAAC;IACvB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAyDD,qFAAqF;AACrF,wBAAsB,mBAAmB,CAAC,WAAW,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAGhG;AAED,6EAA6E;AAC7E,wBAAsB,qBAAqB,CACzC,WAAW,EAAE,MAAM,EACnB,OAAO,EAAE,MAAM,EACf,MAAM,EAAE,cAAc,EACtB,KAAK,CAAC,EAAE,MAAM,GACb,OAAO,CAAC,IAAI,CAAC,CAUf;AAED,gEAAgE;AAChE,wBAAsB,qBAAqB,IAAI,OAAO,CAAC;IAAE,GAAG,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,cAAc,CAAA;CAAE,EAAE,CAAC,CAG/F"}
|
|
@@ -0,0 +1,85 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* One-shot calendar processing state.
|
|
3
|
+
*
|
|
4
|
+
* Tracks which emails have already been auto-processed for calendar/reminder
|
|
5
|
+
* creation via the hook system. Once an email is marked as processed, the
|
|
6
|
+
* auto-trigger is suppressed — the user must explicitly instruct the AI to
|
|
7
|
+
* create further events or reminders for that email.
|
|
8
|
+
*
|
|
9
|
+
* Manual tool calls (add_to_calendar, create_reminder) always work regardless
|
|
10
|
+
* of this state — it only gates the automatic hook trigger.
|
|
11
|
+
*/
|
|
12
|
+
import { mkdir, open, readFile, unlink, writeFile } from 'node:fs/promises';
|
|
13
|
+
import { dirname } from 'node:path';
|
|
14
|
+
import { CALENDAR_STATE_FILE } from '../config/xdg.js';
|
|
15
|
+
const LOCK_FILE = `${CALENDAR_STATE_FILE}.lock`;
|
|
16
|
+
function stateKey(accountName, emailId) {
|
|
17
|
+
return `${accountName.replace(/\s+/g, '_')}__${emailId}`;
|
|
18
|
+
}
|
|
19
|
+
async function readState() {
|
|
20
|
+
try {
|
|
21
|
+
const raw = await readFile(CALENDAR_STATE_FILE, 'utf8');
|
|
22
|
+
return JSON.parse(raw);
|
|
23
|
+
}
|
|
24
|
+
catch {
|
|
25
|
+
return { processedEmails: {} };
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
async function writeState(state) {
|
|
29
|
+
await mkdir(dirname(CALENDAR_STATE_FILE), { recursive: true });
|
|
30
|
+
await writeFile(CALENDAR_STATE_FILE, JSON.stringify(state, null, 2), 'utf8');
|
|
31
|
+
}
|
|
32
|
+
/**
|
|
33
|
+
* Acquire a file-based lock, execute fn, then release.
|
|
34
|
+
* Uses exclusive file creation (O_CREAT | O_EXCL) to prevent concurrent writes.
|
|
35
|
+
*/
|
|
36
|
+
async function withStateLock(fn) {
|
|
37
|
+
await mkdir(dirname(LOCK_FILE), { recursive: true });
|
|
38
|
+
const acquire = async (retries) => {
|
|
39
|
+
try {
|
|
40
|
+
return await open(LOCK_FILE, 'wx');
|
|
41
|
+
}
|
|
42
|
+
catch {
|
|
43
|
+
if (retries <= 0) {
|
|
44
|
+
// Stale lock fallback — force acquire after retries exhausted
|
|
45
|
+
return open(LOCK_FILE, 'w');
|
|
46
|
+
}
|
|
47
|
+
return new Promise((resolve) => {
|
|
48
|
+
setTimeout(() => {
|
|
49
|
+
resolve(acquire(retries - 1));
|
|
50
|
+
}, 50);
|
|
51
|
+
});
|
|
52
|
+
}
|
|
53
|
+
};
|
|
54
|
+
const lockHandle = await acquire(20);
|
|
55
|
+
try {
|
|
56
|
+
return await fn();
|
|
57
|
+
}
|
|
58
|
+
finally {
|
|
59
|
+
await lockHandle.close();
|
|
60
|
+
await unlink(LOCK_FILE).catch(() => { });
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
/** Returns true if this email has already been auto-processed by the hook system. */
|
|
64
|
+
export async function isCalendarProcessed(accountName, emailId) {
|
|
65
|
+
const state = await readState();
|
|
66
|
+
return stateKey(accountName, emailId) in state.processedEmails;
|
|
67
|
+
}
|
|
68
|
+
/** Marks an email as processed so the hook auto-trigger won't fire again. */
|
|
69
|
+
export async function markCalendarProcessed(accountName, emailId, action, title) {
|
|
70
|
+
await withStateLock(async () => {
|
|
71
|
+
const state = await readState();
|
|
72
|
+
state.processedEmails[stateKey(accountName, emailId)] = {
|
|
73
|
+
processedAt: new Date().toISOString(),
|
|
74
|
+
action,
|
|
75
|
+
title,
|
|
76
|
+
};
|
|
77
|
+
await writeState(state);
|
|
78
|
+
});
|
|
79
|
+
}
|
|
80
|
+
/** Returns all processed entries (for inspection/debugging). */
|
|
81
|
+
export async function listCalendarProcessed() {
|
|
82
|
+
const state = await readState();
|
|
83
|
+
return Object.entries(state.processedEmails).map(([key, entry]) => ({ key, entry }));
|
|
84
|
+
}
|
|
85
|
+
//# sourceMappingURL=calendar-state.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"calendar-state.js","sourceRoot":"","sources":["../../src/utils/calendar-state.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Extract conference call details (dial-in, meeting ID, passcode) from email body text.
|
|
3
|
+
*/
|
|
4
|
+
export interface ConferenceDetails {
|
|
5
|
+
dialIn?: string;
|
|
6
|
+
meetingId?: string;
|
|
7
|
+
passcode?: string;
|
|
8
|
+
provider?: string;
|
|
9
|
+
}
|
|
10
|
+
/** Extract conference details from body text. Returns undefined if nothing found. */
|
|
11
|
+
export declare function extractConferenceDetails(text: string): ConferenceDetails | undefined;
|
|
12
|
+
//# sourceMappingURL=conference-details.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"conference-details.d.ts","sourceRoot":"","sources":["../../src/utils/conference-details.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,MAAM,WAAW,iBAAiB;IAChC,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAkCD,qFAAqF;AACrF,wBAAgB,wBAAwB,CAAC,IAAI,EAAE,MAAM,GAAG,iBAAiB,GAAG,SAAS,CAqCpF"}
|
|
@@ -0,0 +1,71 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Extract conference call details (dial-in, meeting ID, passcode) from email body text.
|
|
3
|
+
*/
|
|
4
|
+
// Meeting ID patterns (Zoom "123 456 789", Teams "123 456 789 012", Webex "1234 567 890")
|
|
5
|
+
const MEETING_ID_PATTERNS = [
|
|
6
|
+
/(?:meeting|conference|webinar)\s+id[:\s]+(\d[\d\s]{6,14}\d)/i,
|
|
7
|
+
/(?:meeting|conference)\s+(?:id|number)[:\s]+(\d[\d\s]{6,14}\d)/i,
|
|
8
|
+
/id[:\s]+(\d{3}\s\d{3}\s\d{3,6})/i,
|
|
9
|
+
];
|
|
10
|
+
// Passcode / PIN patterns
|
|
11
|
+
const PASSCODE_PATTERNS = [
|
|
12
|
+
/(?:passcode|password|pin|access code)[:\s]+(\d{4,12})/i,
|
|
13
|
+
/(?:meeting\s+)?password[:\s]+([A-Za-z0-9!@#$%^&*]{4,20})/i,
|
|
14
|
+
];
|
|
15
|
+
// International dial-in phone number patterns
|
|
16
|
+
const DIAL_IN_PATTERNS = [
|
|
17
|
+
/(?:dial[\s-]*(?:in|by\s+your\s+location)?|phone(?:\s+number)?|call)[:\s]+(\+?[\d\s().,-]{8,25})/i,
|
|
18
|
+
/(?:one\s+tap\s+mobile|one-tap)[:\s]*(\+?\d[\d,*#]+)/i,
|
|
19
|
+
/(\+\d{1,3}[\s.-]\(?\d{3}\)?[\s.-]\d{3}[\s.-]\d{4})/,
|
|
20
|
+
/(\+\d{10,15})/,
|
|
21
|
+
];
|
|
22
|
+
function cleanPhone(raw) {
|
|
23
|
+
return raw
|
|
24
|
+
.replace(/[^\d+\s()-]/g, '')
|
|
25
|
+
.trim()
|
|
26
|
+
.replace(/\s{2,}/g, ' ');
|
|
27
|
+
}
|
|
28
|
+
function cleanId(raw) {
|
|
29
|
+
return raw.replace(/\s+/g, ' ').trim();
|
|
30
|
+
}
|
|
31
|
+
/** Extract conference details from body text. Returns undefined if nothing found. */
|
|
32
|
+
export function extractConferenceDetails(text) {
|
|
33
|
+
if (!text)
|
|
34
|
+
return undefined;
|
|
35
|
+
const details = {};
|
|
36
|
+
const meetingMatch = MEETING_ID_PATTERNS.reduce((acc, re) => acc ?? text.match(re), null);
|
|
37
|
+
if (meetingMatch?.[1])
|
|
38
|
+
details.meetingId = cleanId(meetingMatch[1]);
|
|
39
|
+
const passcodeMatch = PASSCODE_PATTERNS.reduce((acc, re) => acc ?? text.match(re), null);
|
|
40
|
+
if (passcodeMatch?.[1])
|
|
41
|
+
details.passcode = passcodeMatch[1].trim();
|
|
42
|
+
const dialInMatch = DIAL_IN_PATTERNS.reduce((acc, re) => {
|
|
43
|
+
if (acc)
|
|
44
|
+
return acc;
|
|
45
|
+
const m = text.match(re);
|
|
46
|
+
if (!m?.[1])
|
|
47
|
+
return null;
|
|
48
|
+
const cleaned = cleanPhone(m[1]);
|
|
49
|
+
return (cleaned.match(/\d/g) ?? []).length >= 7 ? m : null;
|
|
50
|
+
}, null);
|
|
51
|
+
if (dialInMatch?.[1])
|
|
52
|
+
details.dialIn = cleanPhone(dialInMatch[1]);
|
|
53
|
+
// Provider detection from domain keywords
|
|
54
|
+
if (/zoom\.us/i.test(text))
|
|
55
|
+
details.provider = 'Zoom';
|
|
56
|
+
else if (/teams\.microsoft\.com/i.test(text))
|
|
57
|
+
details.provider = 'Microsoft Teams';
|
|
58
|
+
else if (/meet\.google\.com/i.test(text))
|
|
59
|
+
details.provider = 'Google Meet';
|
|
60
|
+
else if (/webex\.com/i.test(text))
|
|
61
|
+
details.provider = 'Webex';
|
|
62
|
+
else if (/gotomeeting\.com/i.test(text))
|
|
63
|
+
details.provider = 'GoToMeeting';
|
|
64
|
+
else if (/jitsi/i.test(text))
|
|
65
|
+
details.provider = 'Jitsi';
|
|
66
|
+
else if (/bluejeans\.com/i.test(text))
|
|
67
|
+
details.provider = 'BlueJeans';
|
|
68
|
+
const hasData = details.dialIn ?? details.meetingId ?? details.passcode ?? details.provider;
|
|
69
|
+
return hasData ? details : undefined;
|
|
70
|
+
}
|
|
71
|
+
//# sourceMappingURL=conference-details.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"conference-details.js","sourceRoot":"","sources":["../../src/utils/conference-details.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Detect video-conferencing / meeting URLs from email body text.
|
|
3
|
+
*/
|
|
4
|
+
export interface MeetingUrl {
|
|
5
|
+
url: string;
|
|
6
|
+
label: string;
|
|
7
|
+
}
|
|
8
|
+
/** Extract the first recognised meeting URL from body text. */
|
|
9
|
+
export declare function extractMeetingUrl(text: string): MeetingUrl | undefined;
|
|
10
|
+
//# sourceMappingURL=meeting-url.d.ts.map
|