fluxmail 0.2.0 → 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 (55) hide show
  1. package/LICENSE.md +111 -0
  2. package/README.md +20 -4
  3. package/dist/accounts/gmailConnection.d.ts +17 -0
  4. package/dist/accounts/gmailConnection.d.ts.map +1 -0
  5. package/dist/accounts/gmailConnection.js +32 -0
  6. package/dist/accounts/gmailConnection.js.map +1 -0
  7. package/dist/cli.d.ts +6 -0
  8. package/dist/cli.d.ts.map +1 -1
  9. package/dist/cli.js +175 -8
  10. package/dist/cli.js.map +1 -1
  11. package/dist/config.d.ts +8 -0
  12. package/dist/config.d.ts.map +1 -1
  13. package/dist/config.js +22 -1
  14. package/dist/config.js.map +1 -1
  15. package/dist/context.d.ts +2 -0
  16. package/dist/context.d.ts.map +1 -1
  17. package/dist/context.js +3 -1
  18. package/dist/context.js.map +1 -1
  19. package/dist/http/app.d.ts +2 -0
  20. package/dist/http/app.d.ts.map +1 -1
  21. package/dist/http/app.js +96 -19
  22. package/dist/http/app.js.map +1 -1
  23. package/dist/index.d.ts +3 -1
  24. package/dist/index.d.ts.map +1 -1
  25. package/dist/index.js +3 -1
  26. package/dist/index.js.map +1 -1
  27. package/dist/mcp/buildServer.d.ts +11 -3
  28. package/dist/mcp/buildServer.d.ts.map +1 -1
  29. package/dist/mcp/buildServer.js +333 -229
  30. package/dist/mcp/buildServer.js.map +1 -1
  31. package/dist/permissions.d.ts +19 -0
  32. package/dist/permissions.d.ts.map +1 -0
  33. package/dist/permissions.js +70 -0
  34. package/dist/permissions.js.map +1 -0
  35. package/dist/service/emailService.d.ts +1 -1
  36. package/dist/service/emailService.d.ts.map +1 -1
  37. package/dist/service/emailService.js +2 -2
  38. package/dist/service/emailService.js.map +1 -1
  39. package/dist/storage/apiKeys.d.ts +6 -1
  40. package/dist/storage/apiKeys.d.ts.map +1 -1
  41. package/dist/storage/apiKeys.js +56 -5
  42. package/dist/storage/apiKeys.js.map +1 -1
  43. package/dist/storage/db.d.ts +172 -0
  44. package/dist/storage/db.d.ts.map +1 -1
  45. package/dist/storage/db.js +35 -1
  46. package/dist/storage/db.js.map +1 -1
  47. package/dist/storage/gmailConnectionGrants.d.ts +28 -0
  48. package/dist/storage/gmailConnectionGrants.d.ts.map +1 -0
  49. package/dist/storage/gmailConnectionGrants.js +70 -0
  50. package/dist/storage/gmailConnectionGrants.js.map +1 -0
  51. package/dist/telemetry.d.ts +35 -0
  52. package/dist/telemetry.d.ts.map +1 -0
  53. package/dist/telemetry.js +283 -0
  54. package/dist/telemetry.js.map +1 -0
  55. package/package.json +11 -7
@@ -0,0 +1,283 @@
1
+ import { PostHog } from 'posthog-node';
2
+ import { randomBytes } from 'node:crypto';
3
+ import { existsSync, linkSync, readFileSync, rmSync, writeFileSync } from 'node:fs';
4
+ import { Agent as HttpAgent, request as httpRequest } from 'node:http';
5
+ import { Agent as HttpsAgent, request as httpsRequest } from 'node:https';
6
+ import path from 'node:path';
7
+ import { readStoredConfig } from './config.js';
8
+ import { VERSION } from './version.js';
9
+ // PostHog project tokens are public ingestion identifiers. This is the same
10
+ // project and first-party proxy used by fluxmail.ai.
11
+ const POSTHOG_PROJECT_TOKEN = 'phc_t9WdWpoONslidKRejBKMYG8FLjLo0tR84U8lFKE4MlN';
12
+ const POSTHOG_HOST = 'https://t.fluxmail.ai';
13
+ const POSTHOG_REQUEST_TIMEOUT_MS = 500;
14
+ const POSTHOG_SHUTDOWN_TIMEOUT_MS = 1_000;
15
+ function acceptedTelemetryResponse(text = '') {
16
+ return {
17
+ status: 200,
18
+ text: async () => text,
19
+ json: async () => {
20
+ try {
21
+ return text ? JSON.parse(text) : {};
22
+ }
23
+ catch {
24
+ return {};
25
+ }
26
+ },
27
+ headers: { get: () => null },
28
+ };
29
+ }
30
+ /** Keep pooled analytics sockets under our control so shutdown can close them. */
31
+ function createPostHogTransport() {
32
+ const httpAgent = new HttpAgent({ keepAlive: true });
33
+ const httpsAgent = new HttpsAgent({ keepAlive: true });
34
+ return {
35
+ async fetch(url, options) {
36
+ try {
37
+ const target = new URL(url);
38
+ const send = target.protocol === 'https:' ? httpsRequest : target.protocol === 'http:' ? httpRequest : undefined;
39
+ if (!send)
40
+ return acceptedTelemetryResponse();
41
+ const body = options.body instanceof Blob
42
+ ? Buffer.from(await options.body.arrayBuffer())
43
+ : options.body === undefined
44
+ ? undefined
45
+ : Buffer.from(options.body);
46
+ return await new Promise((resolve, reject) => {
47
+ const request = send(target, {
48
+ method: options.method,
49
+ headers: options.headers,
50
+ signal: options.signal,
51
+ agent: target.protocol === 'https:' ? httpsAgent : httpAgent,
52
+ }, (response) => {
53
+ const chunks = [];
54
+ response.on('data', (chunk) => {
55
+ chunks.push(Buffer.isBuffer(chunk) ? chunk : Buffer.from(chunk));
56
+ });
57
+ response.once('error', reject);
58
+ response.once('end', () => {
59
+ const text = Buffer.concat(chunks).toString('utf8');
60
+ const status = response.statusCode ?? 0;
61
+ if (status < 200 || status >= 400)
62
+ return resolve(acceptedTelemetryResponse(text));
63
+ resolve({
64
+ status,
65
+ text: async () => text,
66
+ json: async () => JSON.parse(text),
67
+ headers: {
68
+ get(name) {
69
+ const value = response.headers[name.toLowerCase()];
70
+ return Array.isArray(value) ? value.join(', ') : (value ?? null);
71
+ },
72
+ },
73
+ });
74
+ });
75
+ });
76
+ request.once('error', reject);
77
+ request.end(body);
78
+ });
79
+ }
80
+ catch {
81
+ // The SDK logs batch delivery failures to stderr. Telemetry is best
82
+ // effort, so absorb transport failures before they reach the SDK.
83
+ return acceptedTelemetryResponse();
84
+ }
85
+ },
86
+ destroy() {
87
+ httpAgent.destroy();
88
+ httpsAgent.destroy();
89
+ },
90
+ };
91
+ }
92
+ function isTruthy(value) {
93
+ return value !== undefined && !['', '0', 'false', 'no', 'off'].includes(value.toLowerCase());
94
+ }
95
+ const TELEMETRY_ID_PATTERN = /^[a-f0-9]{32}$/;
96
+ function readTelemetryId(file) {
97
+ if (!existsSync(file))
98
+ return undefined;
99
+ const id = readFileSync(file, 'utf8').trim();
100
+ return TELEMETRY_ID_PATTERN.test(id) ? id : undefined;
101
+ }
102
+ export function publishTelemetryId(file, candidateFile, candidateId) {
103
+ try {
104
+ linkSync(candidateFile, file);
105
+ return candidateId;
106
+ }
107
+ catch (err) {
108
+ if (err.code !== 'EEXIST')
109
+ throw err;
110
+ const existingId = readTelemetryId(file);
111
+ if (existingId)
112
+ return existingId;
113
+ // Preserve self-repair for a corrupt ID file. Normal first-run races never
114
+ // reach this path because the linked candidate is complete before publishing.
115
+ writeFileSync(file, `${candidateId}\n`, { mode: 0o600 });
116
+ return candidateId;
117
+ }
118
+ }
119
+ function loadTelemetryId(dataDir) {
120
+ const file = path.join(dataDir, 'telemetry.id');
121
+ const id = randomBytes(16).toString('hex');
122
+ const candidateFile = `${file}.${process.pid}.${id}.tmp`;
123
+ writeFileSync(candidateFile, `${id}\n`, { flag: 'wx', mode: 0o600 });
124
+ try {
125
+ return publishTelemetryId(file, candidateFile, id);
126
+ }
127
+ finally {
128
+ rmSync(candidateFile, { force: true });
129
+ }
130
+ }
131
+ function telemetryDisabledFile(dataDir) {
132
+ return path.join(dataDir, 'telemetry.disabled');
133
+ }
134
+ export function telemetryDisabled(env = process.env) {
135
+ const setting = env.FLUXMAIL_TELEMETRY?.toLowerCase();
136
+ return (setting === '0' ||
137
+ setting === 'false' ||
138
+ setting === 'no' ||
139
+ setting === 'off' ||
140
+ isTruthy(env.DO_NOT_TRACK) ||
141
+ env.NODE_ENV === 'test' ||
142
+ env.VITEST !== undefined);
143
+ }
144
+ export function isTelemetryEnabled(dataDir, env) {
145
+ return !existsSync(telemetryDisabledFile(dataDir)) && !telemetryDisabled(env ?? withStoredTelemetrySetting(dataDir));
146
+ }
147
+ export function setTelemetryEnabled(dataDir, enabled) {
148
+ const file = telemetryDisabledFile(dataDir);
149
+ if (enabled)
150
+ rmSync(file, { force: true });
151
+ else
152
+ writeFileSync(file, 'disabled\n', { mode: 0o600 });
153
+ }
154
+ export function withStoredTelemetrySetting(dataDir, env = process.env) {
155
+ if (env.FLUXMAIL_TELEMETRY !== undefined)
156
+ return env;
157
+ const storedSetting = readStoredConfig(dataDir).FLUXMAIL_TELEMETRY;
158
+ return storedSetting === undefined ? env : { ...env, FLUXMAIL_TELEMETRY: storedSetting };
159
+ }
160
+ export function createTelemetry(options) {
161
+ const env = options.env ?? withStoredTelemetrySetting(options.dataDir);
162
+ let initialized;
163
+ let initializationFailed = false;
164
+ let activeActivities = 0;
165
+ let shutdownPromise;
166
+ const idleWaiters = new Set();
167
+ let closed = false;
168
+ function beginActivity() {
169
+ if (closed || shutdownPromise)
170
+ return () => { };
171
+ activeActivities += 1;
172
+ let finished = false;
173
+ return () => {
174
+ if (finished)
175
+ return;
176
+ finished = true;
177
+ activeActivities -= 1;
178
+ if (activeActivities !== 0)
179
+ return;
180
+ for (const resolve of idleWaiters)
181
+ resolve();
182
+ idleWaiters.clear();
183
+ };
184
+ }
185
+ function waitForIdle() {
186
+ if (activeActivities === 0)
187
+ return Promise.resolve();
188
+ return new Promise((resolve) => idleWaiters.add(resolve));
189
+ }
190
+ function initialize() {
191
+ if (closed || initializationFailed || !isTelemetryEnabled(options.dataDir, env))
192
+ return undefined;
193
+ if (initialized)
194
+ return initialized;
195
+ let transport;
196
+ try {
197
+ const distinctId = loadTelemetryId(options.dataDir);
198
+ transport = options.client ? undefined : createPostHogTransport();
199
+ const client = options.client ??
200
+ new PostHog(env.FLUXMAIL_POSTHOG_KEY ?? POSTHOG_PROJECT_TOKEN, {
201
+ host: env.FLUXMAIL_POSTHOG_HOST ?? POSTHOG_HOST,
202
+ disableGeoip: true,
203
+ flushAt: 20,
204
+ flushInterval: 10_000,
205
+ requestTimeout: POSTHOG_REQUEST_TIMEOUT_MS,
206
+ fetchRetryCount: 0,
207
+ fetch: transport?.fetch,
208
+ });
209
+ initialized = { client, distinctId, transport };
210
+ return initialized;
211
+ }
212
+ catch {
213
+ transport?.destroy();
214
+ initializationFailed = true;
215
+ return undefined;
216
+ }
217
+ }
218
+ const shutdown = () => {
219
+ shutdownPromise ??= (async () => {
220
+ await waitForIdle();
221
+ closed = true;
222
+ if (!initialized)
223
+ return;
224
+ try {
225
+ await initialized.client.shutdown(POSTHOG_SHUTDOWN_TIMEOUT_MS);
226
+ }
227
+ catch {
228
+ // Network and analytics failures are intentionally ignored.
229
+ }
230
+ finally {
231
+ initialized.transport?.destroy();
232
+ }
233
+ })();
234
+ return shutdownPromise;
235
+ };
236
+ return {
237
+ beginActivity,
238
+ capture(event, properties = {}) {
239
+ const telemetry = initialize();
240
+ if (!telemetry)
241
+ return;
242
+ try {
243
+ telemetry.client.capture({
244
+ distinctId: telemetry.distinctId,
245
+ event,
246
+ disableGeoip: true,
247
+ properties: {
248
+ ...Object.fromEntries(Object.entries(properties).filter((entry) => entry[1] !== undefined)),
249
+ $process_person_profile: false,
250
+ fluxmail_version: VERSION,
251
+ node_version: process.versions.node,
252
+ platform: process.platform,
253
+ arch: process.arch,
254
+ },
255
+ });
256
+ }
257
+ catch {
258
+ // Telemetry must never affect Fluxmail behavior.
259
+ }
260
+ },
261
+ shutdown,
262
+ };
263
+ }
264
+ let sharedTelemetry;
265
+ /** Flush queued telemetry when a long-running input stream reaches EOF. */
266
+ export function installTelemetryStreamEndHandler(stream, shutdown = shutdownTelemetry) {
267
+ stream.once('end', () => {
268
+ // The MCP SDK starts request handlers in microtasks after consuming input.
269
+ // Wait one turn so the final request can register as active before shutdown.
270
+ setImmediate(() => void shutdown().catch(() => { }));
271
+ });
272
+ }
273
+ export function getTelemetry(dataDir) {
274
+ sharedTelemetry ??= createTelemetry({ dataDir });
275
+ return sharedTelemetry;
276
+ }
277
+ export async function shutdownTelemetry() {
278
+ const telemetry = sharedTelemetry;
279
+ await telemetry?.shutdown();
280
+ if (sharedTelemetry === telemetry)
281
+ sharedTelemetry = undefined;
282
+ }
283
+ //# sourceMappingURL=telemetry.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"telemetry.js","sourceRoot":"","sources":["../src/telemetry.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,7 +1,9 @@
1
1
  {
2
2
  "name": "fluxmail",
3
- "version": "0.2.0",
4
- "description": "Fluxmail MCP server: unified email tools over Gmail and IMAP/SMTP",
3
+ "version": "0.3.0",
4
+ "mcpName": "io.github.churichard/fluxmail",
5
+ "description": "Fluxmail MCP server: unified email tools over Gmail, Outlook, and IMAP/SMTP",
6
+ "license": "SEE LICENSE IN LICENSE.md",
5
7
  "homepage": "https://github.com/churichard/fluxmail-mcp#readme",
6
8
  "repository": {
7
9
  "type": "git",
@@ -24,13 +26,14 @@
24
26
  }
25
27
  },
26
28
  "files": [
27
- "dist"
29
+ "dist",
30
+ "LICENSE.md"
28
31
  ],
29
32
  "publishConfig": {
30
33
  "access": "public"
31
34
  },
32
35
  "engines": {
33
- "node": ">=20.19"
36
+ "node": "^20.20.0 || >=22.22.0"
34
37
  },
35
38
  "dependencies": {
36
39
  "@hono/node-server": "^1.14.3",
@@ -40,10 +43,11 @@
40
43
  "drizzle-orm": "^0.45.2",
41
44
  "google-auth-library": "10.5.0",
42
45
  "hono": "^4.7.11",
46
+ "posthog-node": "^5.41.0",
43
47
  "zod": "^3.25.67",
44
- "@fluxmail/core": "0.2.0",
45
- "@fluxmail/provider-imap": "0.2.0",
46
- "@fluxmail/provider-gmail": "0.2.0"
48
+ "@fluxmail/core": "0.3.0",
49
+ "@fluxmail/provider-gmail": "0.3.0",
50
+ "@fluxmail/provider-imap": "0.3.0"
47
51
  },
48
52
  "devDependencies": {
49
53
  "@types/better-sqlite3": "^7.6.13",