fluxmail 0.2.0 → 0.2.1

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 (41) hide show
  1. package/LICENSE.md +111 -0
  2. package/README.md +15 -3
  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.js +71 -3
  8. package/dist/cli.js.map +1 -1
  9. package/dist/config.d.ts +4 -0
  10. package/dist/config.d.ts.map +1 -1
  11. package/dist/config.js +7 -1
  12. package/dist/config.js.map +1 -1
  13. package/dist/context.d.ts +2 -0
  14. package/dist/context.d.ts.map +1 -1
  15. package/dist/context.js +3 -1
  16. package/dist/context.js.map +1 -1
  17. package/dist/http/app.d.ts +2 -0
  18. package/dist/http/app.d.ts.map +1 -1
  19. package/dist/http/app.js +85 -15
  20. package/dist/http/app.js.map +1 -1
  21. package/dist/index.d.ts +2 -1
  22. package/dist/index.d.ts.map +1 -1
  23. package/dist/index.js +1 -0
  24. package/dist/index.js.map +1 -1
  25. package/dist/mcp/buildServer.d.ts +7 -1
  26. package/dist/mcp/buildServer.d.ts.map +1 -1
  27. package/dist/mcp/buildServer.js +68 -20
  28. package/dist/mcp/buildServer.js.map +1 -1
  29. package/dist/storage/db.d.ts +134 -0
  30. package/dist/storage/db.d.ts.map +1 -1
  31. package/dist/storage/db.js +21 -0
  32. package/dist/storage/db.js.map +1 -1
  33. package/dist/storage/gmailConnectionGrants.d.ts +28 -0
  34. package/dist/storage/gmailConnectionGrants.d.ts.map +1 -0
  35. package/dist/storage/gmailConnectionGrants.js +70 -0
  36. package/dist/storage/gmailConnectionGrants.js.map +1 -0
  37. package/dist/telemetry.d.ts +28 -0
  38. package/dist/telemetry.d.ts.map +1 -0
  39. package/dist/telemetry.js +220 -0
  40. package/dist/telemetry.js.map +1 -0
  41. package/package.json +10 -6
@@ -709,6 +709,140 @@ export declare const apiKeys: import("drizzle-orm/sqlite-core").SQLiteTableWithC
709
709
  };
710
710
  dialect: "sqlite";
711
711
  }>;
712
+ export declare const gmailConnectionGrants: import("drizzle-orm/sqlite-core").SQLiteTableWithColumns<{
713
+ name: "gmail_connection_grants";
714
+ schema: undefined;
715
+ columns: {
716
+ tokenHash: import("drizzle-orm/sqlite-core").SQLiteColumn<{
717
+ name: "token_hash";
718
+ tableName: "gmail_connection_grants";
719
+ dataType: "string";
720
+ columnType: "SQLiteText";
721
+ data: string;
722
+ driverParam: string;
723
+ notNull: true;
724
+ hasDefault: false;
725
+ isPrimaryKey: true;
726
+ isAutoincrement: false;
727
+ hasRuntimeDefault: false;
728
+ enumValues: [string, ...string[]];
729
+ baseColumn: never;
730
+ identity: undefined;
731
+ generated: undefined;
732
+ }, {}, {
733
+ length: number | undefined;
734
+ }>;
735
+ scope: import("drizzle-orm/sqlite-core").SQLiteColumn<{
736
+ name: "scope";
737
+ tableName: "gmail_connection_grants";
738
+ dataType: "string";
739
+ columnType: "SQLiteText";
740
+ data: string;
741
+ driverParam: string;
742
+ notNull: true;
743
+ hasDefault: false;
744
+ isPrimaryKey: false;
745
+ isAutoincrement: false;
746
+ hasRuntimeDefault: false;
747
+ enumValues: [string, ...string[]];
748
+ baseColumn: never;
749
+ identity: undefined;
750
+ generated: undefined;
751
+ }, {}, {
752
+ length: number | undefined;
753
+ }>;
754
+ memberId: import("drizzle-orm/sqlite-core").SQLiteColumn<{
755
+ name: "member_id";
756
+ tableName: "gmail_connection_grants";
757
+ dataType: "string";
758
+ columnType: "SQLiteText";
759
+ data: string;
760
+ driverParam: string;
761
+ notNull: false;
762
+ hasDefault: false;
763
+ isPrimaryKey: false;
764
+ isAutoincrement: false;
765
+ hasRuntimeDefault: false;
766
+ enumValues: [string, ...string[]];
767
+ baseColumn: never;
768
+ identity: undefined;
769
+ generated: undefined;
770
+ }, {}, {
771
+ length: number | undefined;
772
+ }>;
773
+ reauthorizeAccountId: import("drizzle-orm/sqlite-core").SQLiteColumn<{
774
+ name: "reauthorize_account_id";
775
+ tableName: "gmail_connection_grants";
776
+ dataType: "string";
777
+ columnType: "SQLiteText";
778
+ data: string;
779
+ driverParam: string;
780
+ notNull: false;
781
+ hasDefault: false;
782
+ isPrimaryKey: false;
783
+ isAutoincrement: false;
784
+ hasRuntimeDefault: false;
785
+ enumValues: [string, ...string[]];
786
+ baseColumn: never;
787
+ identity: undefined;
788
+ generated: undefined;
789
+ }, {}, {
790
+ length: number | undefined;
791
+ }>;
792
+ createdAt: import("drizzle-orm/sqlite-core").SQLiteColumn<{
793
+ name: "created_at";
794
+ tableName: "gmail_connection_grants";
795
+ dataType: "number";
796
+ columnType: "SQLiteInteger";
797
+ data: number;
798
+ driverParam: number;
799
+ notNull: true;
800
+ hasDefault: false;
801
+ isPrimaryKey: false;
802
+ isAutoincrement: false;
803
+ hasRuntimeDefault: false;
804
+ enumValues: undefined;
805
+ baseColumn: never;
806
+ identity: undefined;
807
+ generated: undefined;
808
+ }, {}, {}>;
809
+ expiresAt: import("drizzle-orm/sqlite-core").SQLiteColumn<{
810
+ name: "expires_at";
811
+ tableName: "gmail_connection_grants";
812
+ dataType: "number";
813
+ columnType: "SQLiteInteger";
814
+ data: number;
815
+ driverParam: number;
816
+ notNull: true;
817
+ hasDefault: false;
818
+ isPrimaryKey: false;
819
+ isAutoincrement: false;
820
+ hasRuntimeDefault: false;
821
+ enumValues: undefined;
822
+ baseColumn: never;
823
+ identity: undefined;
824
+ generated: undefined;
825
+ }, {}, {}>;
826
+ consumedAt: import("drizzle-orm/sqlite-core").SQLiteColumn<{
827
+ name: "consumed_at";
828
+ tableName: "gmail_connection_grants";
829
+ dataType: "number";
830
+ columnType: "SQLiteInteger";
831
+ data: number;
832
+ driverParam: number;
833
+ notNull: false;
834
+ hasDefault: false;
835
+ isPrimaryKey: false;
836
+ isAutoincrement: false;
837
+ hasRuntimeDefault: false;
838
+ enumValues: undefined;
839
+ baseColumn: never;
840
+ identity: undefined;
841
+ generated: undefined;
842
+ }, {}, {}>;
843
+ };
844
+ dialect: "sqlite";
845
+ }>;
712
846
  export declare const licenseLease: import("drizzle-orm/sqlite-core").SQLiteTableWithColumns<{
713
847
  name: "license_lease";
714
848
  schema: undefined;
@@ -1 +1 @@
1
- {"version":3,"file":"db.d.ts","sourceRoot":"","sources":["../../src/storage/db.ts"],"names":[],"mappings":"AACA,OAAO,EAAW,KAAK,qBAAqB,EAAE,MAAM,4BAA4B,CAAC;AAGjF,eAAO,MAAM,OAAO;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EASnB,CAAC;AAEF,eAAO,MAAM,QAAQ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAapB,CAAC;AAEF,eAAO,MAAM,WAAW;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAOtB,CAAC;AAEH,eAAO,MAAM,kBAAkB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAO7B,CAAC;AAEH,eAAO,MAAM,YAAY;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAyBxB,CAAC;AAEF,eAAO,MAAM,OAAO;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EASlB,CAAC;AAEH,eAAO,MAAM,YAAY;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAMvB,CAAC;AAEH,eAAO,MAAM,cAAc;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAuB1B,CAAC;AAEF,MAAM,MAAM,UAAU,GAAG,qBAAqB,CAAC;AA6F/C,wBAAgB,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,UAAU,CA0BjD"}
1
+ {"version":3,"file":"db.d.ts","sourceRoot":"","sources":["../../src/storage/db.ts"],"names":[],"mappings":"AACA,OAAO,EAAW,KAAK,qBAAqB,EAAE,MAAM,4BAA4B,CAAC;AAGjF,eAAO,MAAM,OAAO;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EASnB,CAAC;AAEF,eAAO,MAAM,QAAQ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAapB,CAAC;AAEF,eAAO,MAAM,WAAW;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAOtB,CAAC;AAEH,eAAO,MAAM,kBAAkB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAO7B,CAAC;AAEH,eAAO,MAAM,YAAY;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAyBxB,CAAC;AAEF,eAAO,MAAM,OAAO;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EASlB,CAAC;AAEH,eAAO,MAAM,qBAAqB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAShC,CAAC;AAEH,eAAO,MAAM,YAAY;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAMvB,CAAC;AAEH,eAAO,MAAM,cAAc;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAuB1B,CAAC;AAEF,MAAM,MAAM,UAAU,GAAG,qBAAqB,CAAC;AAwG/C,wBAAgB,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,UAAU,CA0BjD"}
@@ -65,6 +65,16 @@ export const apiKeys = sqliteTable('api_keys', {
65
65
  /** Member the key was issued to; NULL means an unscoped admin key. */
66
66
  memberId: text('member_id').references(() => members.id, { onDelete: 'set null' }),
67
67
  });
68
+ export const gmailConnectionGrants = sqliteTable('gmail_connection_grants', {
69
+ /** SHA-256 hex digest. The raw token is printed once and never stored. */
70
+ tokenHash: text('token_hash').primaryKey(),
71
+ scope: text('scope').notNull(),
72
+ memberId: text('member_id'),
73
+ reauthorizeAccountId: text('reauthorize_account_id'),
74
+ createdAt: integer('created_at').notNull(),
75
+ expiresAt: integer('expires_at').notNull(),
76
+ consumedAt: integer('consumed_at'),
77
+ });
68
78
  export const licenseLease = sqliteTable('license_lease', {
69
79
  /** Single-row table; the row id is always 'current'. */
70
80
  id: text('id').primaryKey(),
@@ -152,6 +162,17 @@ CREATE TABLE IF NOT EXISTS api_keys (
152
162
  last_used_at INTEGER,
153
163
  member_id TEXT REFERENCES members(id) ON DELETE SET NULL
154
164
  );
165
+ CREATE TABLE IF NOT EXISTS gmail_connection_grants (
166
+ token_hash TEXT PRIMARY KEY,
167
+ scope TEXT NOT NULL,
168
+ member_id TEXT,
169
+ reauthorize_account_id TEXT,
170
+ created_at INTEGER NOT NULL,
171
+ expires_at INTEGER NOT NULL,
172
+ consumed_at INTEGER
173
+ );
174
+ CREATE INDEX IF NOT EXISTS gmail_connection_grants_expires_at
175
+ ON gmail_connection_grants(expires_at);
155
176
  CREATE TABLE IF NOT EXISTS license_lease (
156
177
  id TEXT PRIMARY KEY,
157
178
  token TEXT NOT NULL,
@@ -1 +1 @@
1
- {"version":3,"file":"db.js","sourceRoot":"","sources":["../../src/storage/db.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"db.js","sourceRoot":"","sources":["../../src/storage/db.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,28 @@
1
+ import { type FluxmailDb } from './db.js';
2
+ export declare const GMAIL_CONNECTION_GRANT_TTL_MS: number;
3
+ export interface GmailConnectionIntent {
4
+ memberId?: string;
5
+ reauthorizeAccountId?: string;
6
+ }
7
+ export interface GmailConnectionGrant extends GmailConnectionIntent {
8
+ expiresAt: number;
9
+ }
10
+ export type GmailConnectionClaim = {
11
+ status: 'claimed';
12
+ grant: GmailConnectionGrant;
13
+ } | {
14
+ status: 'invalid';
15
+ } | {
16
+ status: 'expired';
17
+ } | {
18
+ status: 'used';
19
+ };
20
+ export type GmailConnectionGrantStatus = 'available' | 'invalid' | 'expired' | 'used';
21
+ export declare function gmailConnectionTokenHash(token: string): string;
22
+ export declare function inspectGmailConnectionGrant(db: FluxmailDb, token: string, now?: number): GmailConnectionGrantStatus;
23
+ export declare function createGmailConnectionGrant(db: FluxmailDb, intent?: GmailConnectionIntent, now?: number): {
24
+ token: string;
25
+ expiresAt: number;
26
+ };
27
+ export declare function claimGmailConnectionGrant(db: FluxmailDb, token: string, now?: number): GmailConnectionClaim;
28
+ //# sourceMappingURL=gmailConnectionGrants.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"gmailConnectionGrants.d.ts","sourceRoot":"","sources":["../../src/storage/gmailConnectionGrants.ts"],"names":[],"mappings":"AAEA,OAAO,EAAyB,KAAK,UAAU,EAAE,MAAM,SAAS,CAAC;AAEjE,eAAO,MAAM,6BAA6B,QAAiB,CAAC;AAI5D,MAAM,WAAW,qBAAqB;IACpC,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,oBAAoB,CAAC,EAAE,MAAM,CAAC;CAC/B;AAED,MAAM,WAAW,oBAAqB,SAAQ,qBAAqB;IACjE,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,MAAM,oBAAoB,GAC5B;IAAE,MAAM,EAAE,SAAS,CAAC;IAAC,KAAK,EAAE,oBAAoB,CAAA;CAAE,GAClD;IAAE,MAAM,EAAE,SAAS,CAAA;CAAE,GACrB;IAAE,MAAM,EAAE,SAAS,CAAA;CAAE,GACrB;IAAE,MAAM,EAAE,MAAM,CAAA;CAAE,CAAC;AAEvB,MAAM,MAAM,0BAA0B,GAAG,WAAW,GAAG,SAAS,GAAG,SAAS,GAAG,MAAM,CAAC;AAEtF,wBAAgB,wBAAwB,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAE9D;AAED,wBAAgB,2BAA2B,CACzC,EAAE,EAAE,UAAU,EACd,KAAK,EAAE,MAAM,EACb,GAAG,SAAa,GACf,0BAA0B,CAc5B;AAED,wBAAgB,0BAA0B,CACxC,EAAE,EAAE,UAAU,EACd,MAAM,GAAE,qBAA0B,EAClC,GAAG,SAAa,GACf;IAAE,KAAK,EAAE,MAAM,CAAC;IAAC,SAAS,EAAE,MAAM,CAAA;CAAE,CAoBtC;AAED,wBAAgB,yBAAyB,CAAC,EAAE,EAAE,UAAU,EAAE,KAAK,EAAE,MAAM,EAAE,GAAG,SAAa,GAAG,oBAAoB,CAmC/G"}
@@ -0,0 +1,70 @@
1
+ import { createHash, randomBytes } from 'node:crypto';
2
+ import { and, eq, gt, isNull, lt } from 'drizzle-orm';
3
+ import { gmailConnectionGrants } from './db.js';
4
+ export const GMAIL_CONNECTION_GRANT_TTL_MS = 10 * 60 * 1000;
5
+ const GMAIL_CONNECTION_SCOPE = 'gmail_connect';
6
+ const RETENTION_MS = 24 * 60 * 60 * 1000;
7
+ export function gmailConnectionTokenHash(token) {
8
+ return createHash('sha256').update(token).digest('hex');
9
+ }
10
+ export function inspectGmailConnectionGrant(db, token, now = Date.now()) {
11
+ const existing = db
12
+ .select()
13
+ .from(gmailConnectionGrants)
14
+ .where(and(eq(gmailConnectionGrants.tokenHash, gmailConnectionTokenHash(token)), eq(gmailConnectionGrants.scope, GMAIL_CONNECTION_SCOPE)))
15
+ .get();
16
+ if (!existing)
17
+ return 'invalid';
18
+ if (existing.consumedAt !== null)
19
+ return 'used';
20
+ return existing.expiresAt > now ? 'available' : 'expired';
21
+ }
22
+ export function createGmailConnectionGrant(db, intent = {}, now = Date.now()) {
23
+ const token = randomBytes(32).toString('base64url');
24
+ const expiresAt = now + GMAIL_CONNECTION_GRANT_TTL_MS;
25
+ db.delete(gmailConnectionGrants)
26
+ .where(lt(gmailConnectionGrants.expiresAt, now - RETENTION_MS))
27
+ .run();
28
+ db.insert(gmailConnectionGrants)
29
+ .values({
30
+ tokenHash: gmailConnectionTokenHash(token),
31
+ scope: GMAIL_CONNECTION_SCOPE,
32
+ memberId: intent.memberId ?? null,
33
+ reauthorizeAccountId: intent.reauthorizeAccountId ?? null,
34
+ createdAt: now,
35
+ expiresAt,
36
+ consumedAt: null,
37
+ })
38
+ .run();
39
+ return { token, expiresAt };
40
+ }
41
+ export function claimGmailConnectionGrant(db, token, now = Date.now()) {
42
+ const tokenHash = gmailConnectionTokenHash(token);
43
+ const claimed = db
44
+ .update(gmailConnectionGrants)
45
+ .set({ consumedAt: now })
46
+ .where(and(eq(gmailConnectionGrants.tokenHash, tokenHash), eq(gmailConnectionGrants.scope, GMAIL_CONNECTION_SCOPE), isNull(gmailConnectionGrants.consumedAt), gt(gmailConnectionGrants.expiresAt, now)))
47
+ .returning()
48
+ .get();
49
+ if (claimed) {
50
+ return {
51
+ status: 'claimed',
52
+ grant: {
53
+ expiresAt: claimed.expiresAt,
54
+ ...(claimed.memberId ? { memberId: claimed.memberId } : {}),
55
+ ...(claimed.reauthorizeAccountId ? { reauthorizeAccountId: claimed.reauthorizeAccountId } : {}),
56
+ },
57
+ };
58
+ }
59
+ const existing = db
60
+ .select()
61
+ .from(gmailConnectionGrants)
62
+ .where(and(eq(gmailConnectionGrants.tokenHash, tokenHash), eq(gmailConnectionGrants.scope, GMAIL_CONNECTION_SCOPE)))
63
+ .get();
64
+ if (!existing)
65
+ return { status: 'invalid' };
66
+ if (existing.consumedAt !== null)
67
+ return { status: 'used' };
68
+ return { status: 'expired' };
69
+ }
70
+ //# sourceMappingURL=gmailConnectionGrants.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"gmailConnectionGrants.js","sourceRoot":"","sources":["../../src/storage/gmailConnectionGrants.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,28 @@
1
+ export type TelemetryProperties = Record<string, boolean | number | string | undefined>;
2
+ export interface Telemetry {
3
+ capture(event: string, properties?: TelemetryProperties): void;
4
+ shutdown(): Promise<void>;
5
+ }
6
+ interface PostHogClient {
7
+ captureImmediate(options: {
8
+ distinctId: string;
9
+ event: string;
10
+ properties: Record<string, boolean | number | string>;
11
+ disableGeoip?: boolean;
12
+ }): Promise<void>;
13
+ shutdown(timeoutMs?: number): Promise<void>;
14
+ }
15
+ export declare function publishTelemetryId(file: string, candidateFile: string, candidateId: string): string;
16
+ export declare function telemetryDisabled(env?: NodeJS.ProcessEnv): boolean;
17
+ export declare function isTelemetryEnabled(dataDir: string, env?: NodeJS.ProcessEnv): boolean;
18
+ export declare function setTelemetryEnabled(dataDir: string, enabled: boolean): void;
19
+ export declare function withStoredTelemetrySetting(dataDir: string, env?: NodeJS.ProcessEnv): NodeJS.ProcessEnv;
20
+ export declare function createTelemetry(options: {
21
+ dataDir: string;
22
+ env?: NodeJS.ProcessEnv;
23
+ client?: PostHogClient;
24
+ }): Telemetry;
25
+ export declare function getTelemetry(dataDir: string): Telemetry;
26
+ export declare function shutdownTelemetry(): Promise<void>;
27
+ export {};
28
+ //# sourceMappingURL=telemetry.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"telemetry.d.ts","sourceRoot":"","sources":["../src/telemetry.ts"],"names":[],"mappings":"AAgBA,MAAM,MAAM,mBAAmB,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,GAAG,MAAM,GAAG,MAAM,GAAG,SAAS,CAAC,CAAC;AAExF,MAAM,WAAW,SAAS;IACxB,OAAO,CAAC,KAAK,EAAE,MAAM,EAAE,UAAU,CAAC,EAAE,mBAAmB,GAAG,IAAI,CAAC;IAC/D,QAAQ,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;CAC3B;AAED,UAAU,aAAa;IACrB,gBAAgB,CAAC,OAAO,EAAE;QACxB,UAAU,EAAE,MAAM,CAAC;QACnB,KAAK,EAAE,MAAM,CAAC;QACd,UAAU,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,GAAG,MAAM,GAAG,MAAM,CAAC,CAAC;QACtD,YAAY,CAAC,EAAE,OAAO,CAAC;KACxB,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAClB,QAAQ,CAAC,SAAS,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;CAC7C;AA6FD,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,MAAM,EAAE,aAAa,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,GAAG,MAAM,CAcnG;AAkBD,wBAAgB,iBAAiB,CAAC,GAAG,GAAE,MAAM,CAAC,UAAwB,GAAG,OAAO,CAW/E;AAED,wBAAgB,kBAAkB,CAAC,OAAO,EAAE,MAAM,EAAE,GAAG,CAAC,EAAE,MAAM,CAAC,UAAU,GAAG,OAAO,CAEpF;AAED,wBAAgB,mBAAmB,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,GAAG,IAAI,CAI3E;AAED,wBAAgB,0BAA0B,CAAC,OAAO,EAAE,MAAM,EAAE,GAAG,GAAE,MAAM,CAAC,UAAwB,GAAG,MAAM,CAAC,UAAU,CAInH;AAED,wBAAgB,eAAe,CAAC,OAAO,EAAE;IACvC,OAAO,EAAE,MAAM,CAAC;IAChB,GAAG,CAAC,EAAE,MAAM,CAAC,UAAU,CAAC;IACxB,MAAM,CAAC,EAAE,aAAa,CAAC;CACxB,GAAG,SAAS,CAqEZ;AAID,wBAAgB,YAAY,CAAC,OAAO,EAAE,MAAM,GAAG,SAAS,CAGvD;AAED,wBAAsB,iBAAiB,IAAI,OAAO,CAAC,IAAI,CAAC,CAIvD"}
@@ -0,0 +1,220 @@
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
+ /** Keep pooled analytics sockets under our control so shutdown can close them. */
16
+ function createPostHogTransport() {
17
+ const httpAgent = new HttpAgent({ keepAlive: true });
18
+ const httpsAgent = new HttpsAgent({ keepAlive: true });
19
+ return {
20
+ async fetch(url, options) {
21
+ const target = new URL(url);
22
+ const send = target.protocol === 'https:' ? httpsRequest : target.protocol === 'http:' ? httpRequest : undefined;
23
+ if (!send)
24
+ throw new Error(`Unsupported telemetry URL protocol: ${target.protocol}`);
25
+ const body = options.body instanceof Blob
26
+ ? Buffer.from(await options.body.arrayBuffer())
27
+ : options.body === undefined
28
+ ? undefined
29
+ : Buffer.from(options.body);
30
+ return new Promise((resolve, reject) => {
31
+ const request = send(target, {
32
+ method: options.method,
33
+ headers: options.headers,
34
+ signal: options.signal,
35
+ agent: target.protocol === 'https:' ? httpsAgent : httpAgent,
36
+ }, (response) => {
37
+ const chunks = [];
38
+ response.on('data', (chunk) => {
39
+ chunks.push(Buffer.isBuffer(chunk) ? chunk : Buffer.from(chunk));
40
+ });
41
+ response.once('error', reject);
42
+ response.once('end', () => {
43
+ const text = Buffer.concat(chunks).toString('utf8');
44
+ resolve({
45
+ status: response.statusCode ?? 0,
46
+ text: async () => text,
47
+ json: async () => JSON.parse(text),
48
+ headers: {
49
+ get(name) {
50
+ const value = response.headers[name.toLowerCase()];
51
+ return Array.isArray(value) ? value.join(', ') : (value ?? null);
52
+ },
53
+ },
54
+ });
55
+ });
56
+ });
57
+ request.once('error', reject);
58
+ request.end(body);
59
+ });
60
+ },
61
+ destroy() {
62
+ httpAgent.destroy();
63
+ httpsAgent.destroy();
64
+ },
65
+ };
66
+ }
67
+ function isTruthy(value) {
68
+ return value !== undefined && !['', '0', 'false', 'no', 'off'].includes(value.toLowerCase());
69
+ }
70
+ const TELEMETRY_ID_PATTERN = /^[a-f0-9]{32}$/;
71
+ function readTelemetryId(file) {
72
+ if (!existsSync(file))
73
+ return undefined;
74
+ const id = readFileSync(file, 'utf8').trim();
75
+ return TELEMETRY_ID_PATTERN.test(id) ? id : undefined;
76
+ }
77
+ export function publishTelemetryId(file, candidateFile, candidateId) {
78
+ try {
79
+ linkSync(candidateFile, file);
80
+ return candidateId;
81
+ }
82
+ catch (err) {
83
+ if (err.code !== 'EEXIST')
84
+ throw err;
85
+ const existingId = readTelemetryId(file);
86
+ if (existingId)
87
+ return existingId;
88
+ // Preserve self-repair for a corrupt ID file. Normal first-run races never
89
+ // reach this path because the linked candidate is complete before publishing.
90
+ writeFileSync(file, `${candidateId}\n`, { mode: 0o600 });
91
+ return candidateId;
92
+ }
93
+ }
94
+ function loadTelemetryId(dataDir) {
95
+ const file = path.join(dataDir, 'telemetry.id');
96
+ const id = randomBytes(16).toString('hex');
97
+ const candidateFile = `${file}.${process.pid}.${id}.tmp`;
98
+ writeFileSync(candidateFile, `${id}\n`, { flag: 'wx', mode: 0o600 });
99
+ try {
100
+ return publishTelemetryId(file, candidateFile, id);
101
+ }
102
+ finally {
103
+ rmSync(candidateFile, { force: true });
104
+ }
105
+ }
106
+ function telemetryDisabledFile(dataDir) {
107
+ return path.join(dataDir, 'telemetry.disabled');
108
+ }
109
+ export function telemetryDisabled(env = process.env) {
110
+ const setting = env.FLUXMAIL_TELEMETRY?.toLowerCase();
111
+ return (setting === '0' ||
112
+ setting === 'false' ||
113
+ setting === 'no' ||
114
+ setting === 'off' ||
115
+ isTruthy(env.DO_NOT_TRACK) ||
116
+ env.NODE_ENV === 'test' ||
117
+ env.VITEST !== undefined);
118
+ }
119
+ export function isTelemetryEnabled(dataDir, env) {
120
+ return !existsSync(telemetryDisabledFile(dataDir)) && !telemetryDisabled(env ?? withStoredTelemetrySetting(dataDir));
121
+ }
122
+ export function setTelemetryEnabled(dataDir, enabled) {
123
+ const file = telemetryDisabledFile(dataDir);
124
+ if (enabled)
125
+ rmSync(file, { force: true });
126
+ else
127
+ writeFileSync(file, 'disabled\n', { mode: 0o600 });
128
+ }
129
+ export function withStoredTelemetrySetting(dataDir, env = process.env) {
130
+ if (env.FLUXMAIL_TELEMETRY !== undefined)
131
+ return env;
132
+ const storedSetting = readStoredConfig(dataDir).FLUXMAIL_TELEMETRY;
133
+ return storedSetting === undefined ? env : { ...env, FLUXMAIL_TELEMETRY: storedSetting };
134
+ }
135
+ export function createTelemetry(options) {
136
+ const env = options.env ?? withStoredTelemetrySetting(options.dataDir);
137
+ let initialized;
138
+ let initializationFailed = false;
139
+ let closed = false;
140
+ function initialize() {
141
+ if (closed || initializationFailed || !isTelemetryEnabled(options.dataDir, env))
142
+ return undefined;
143
+ if (initialized)
144
+ return initialized;
145
+ let transport;
146
+ try {
147
+ const distinctId = loadTelemetryId(options.dataDir);
148
+ transport = options.client ? undefined : createPostHogTransport();
149
+ const client = options.client ??
150
+ new PostHog(env.FLUXMAIL_POSTHOG_KEY ?? POSTHOG_PROJECT_TOKEN, {
151
+ host: env.FLUXMAIL_POSTHOG_HOST ?? POSTHOG_HOST,
152
+ disableGeoip: true,
153
+ flushAt: 20,
154
+ flushInterval: 10_000,
155
+ requestTimeout: POSTHOG_REQUEST_TIMEOUT_MS,
156
+ fetchRetryCount: 0,
157
+ fetch: transport?.fetch,
158
+ });
159
+ initialized = { client, distinctId, transport };
160
+ return initialized;
161
+ }
162
+ catch {
163
+ transport?.destroy();
164
+ initializationFailed = true;
165
+ return undefined;
166
+ }
167
+ }
168
+ return {
169
+ capture(event, properties = {}) {
170
+ const telemetry = initialize();
171
+ if (!telemetry)
172
+ return;
173
+ try {
174
+ void telemetry.client
175
+ .captureImmediate({
176
+ distinctId: telemetry.distinctId,
177
+ event,
178
+ disableGeoip: true,
179
+ properties: {
180
+ ...Object.fromEntries(Object.entries(properties).filter((entry) => entry[1] !== undefined)),
181
+ $process_person_profile: false,
182
+ fluxmail_version: VERSION,
183
+ node_version: process.versions.node,
184
+ platform: process.platform,
185
+ arch: process.arch,
186
+ },
187
+ })
188
+ .catch(() => { });
189
+ }
190
+ catch {
191
+ // Telemetry must never affect Fluxmail behavior.
192
+ }
193
+ },
194
+ async shutdown() {
195
+ closed = true;
196
+ if (!initialized)
197
+ return;
198
+ try {
199
+ await initialized.client.shutdown(POSTHOG_SHUTDOWN_TIMEOUT_MS);
200
+ }
201
+ catch {
202
+ // Network and analytics failures are intentionally ignored.
203
+ }
204
+ finally {
205
+ initialized.transport?.destroy();
206
+ }
207
+ },
208
+ };
209
+ }
210
+ let sharedTelemetry;
211
+ export function getTelemetry(dataDir) {
212
+ sharedTelemetry ??= createTelemetry({ dataDir });
213
+ return sharedTelemetry;
214
+ }
215
+ export async function shutdownTelemetry() {
216
+ const telemetry = sharedTelemetry;
217
+ sharedTelemetry = undefined;
218
+ await telemetry?.shutdown();
219
+ }
220
+ //# 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",
3
+ "version": "0.2.1",
4
+ "mcpName": "io.github.churichard/fluxmail",
4
5
  "description": "Fluxmail MCP server: unified email tools over Gmail 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.2.1",
49
+ "@fluxmail/provider-imap": "0.2.1",
50
+ "@fluxmail/provider-gmail": "0.2.1"
47
51
  },
48
52
  "devDependencies": {
49
53
  "@types/better-sqlite3": "^7.6.13",