@soulbatical/tetra-core 0.10.4 → 0.11.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 (271) hide show
  1. package/README.md +78 -38
  2. package/dist/core/createApp.d.ts +1 -1
  3. package/dist/core/createApp.d.ts.map +1 -1
  4. package/dist/core/createApp.js +77 -2
  5. package/dist/core/createApp.js.map +1 -1
  6. package/dist/core/dualWriteProxy.d.ts +7 -2
  7. package/dist/core/dualWriteProxy.d.ts.map +1 -1
  8. package/dist/core/dualWriteProxy.js +16 -5
  9. package/dist/core/dualWriteProxy.js.map +1 -1
  10. package/dist/core/routeContext.d.ts +24 -0
  11. package/dist/core/routeContext.d.ts.map +1 -1
  12. package/dist/core/routeContext.js +31 -4
  13. package/dist/core/routeContext.js.map +1 -1
  14. package/dist/core/systemDb.d.ts +2 -2
  15. package/dist/core/systemDb.js +2 -2
  16. package/dist/generators/rls-checker.d.ts +1 -1
  17. package/dist/generators/rls-checker.js +1 -1
  18. package/dist/generators/rls-exec-sql.d.ts +1 -1
  19. package/dist/generators/rls-exec-sql.js +1 -1
  20. package/dist/generators/rpc/index.d.ts +1 -1
  21. package/dist/generators/rpc/index.js +1 -1
  22. package/dist/index.d.ts +3 -31
  23. package/dist/index.d.ts.map +1 -1
  24. package/dist/index.js +4 -32
  25. package/dist/index.js.map +1 -1
  26. package/dist/middleware/securityMiddleware.d.ts +1 -1
  27. package/dist/middleware/securityMiddleware.d.ts.map +1 -1
  28. package/dist/middleware/validateBody.d.ts.map +1 -1
  29. package/dist/middleware/validateBody.js +51 -8
  30. package/dist/middleware/validateBody.js.map +1 -1
  31. package/dist/shared/rfc7807ErrorResponse.d.ts +7 -0
  32. package/dist/shared/rfc7807ErrorResponse.d.ts.map +1 -1
  33. package/dist/shared/rfc7807ErrorResponse.js +19 -5
  34. package/dist/shared/rfc7807ErrorResponse.js.map +1 -1
  35. package/dist/utils/logger.d.ts.map +1 -1
  36. package/dist/utils/logger.js +16 -1
  37. package/dist/utils/logger.js.map +1 -1
  38. package/package.json +33 -77
  39. package/dist/affiliate.d.ts +0 -11
  40. package/dist/affiliate.d.ts.map +0 -1
  41. package/dist/affiliate.js +0 -10
  42. package/dist/affiliate.js.map +0 -1
  43. package/dist/billing.d.ts +0 -8
  44. package/dist/billing.d.ts.map +0 -1
  45. package/dist/billing.js +0 -7
  46. package/dist/billing.js.map +0 -1
  47. package/dist/email.d.ts +0 -9
  48. package/dist/email.d.ts.map +0 -1
  49. package/dist/email.js +0 -8
  50. package/dist/email.js.map +0 -1
  51. package/dist/generators/rls-exec-sql.sql +0 -57
  52. package/dist/generators.d.ts +0 -15
  53. package/dist/generators.d.ts.map +0 -1
  54. package/dist/generators.js +0 -12
  55. package/dist/generators.js.map +0 -1
  56. package/dist/mcp.d.ts +0 -8
  57. package/dist/mcp.d.ts.map +0 -1
  58. package/dist/mcp.js +0 -7
  59. package/dist/mcp.js.map +0 -1
  60. package/dist/planner.d.ts +0 -8
  61. package/dist/planner.d.ts.map +0 -1
  62. package/dist/planner.js +0 -7
  63. package/dist/planner.js.map +0 -1
  64. package/dist/shared/affiliate/AffiliateAttributionService.d.ts +0 -47
  65. package/dist/shared/affiliate/AffiliateAttributionService.d.ts.map +0 -1
  66. package/dist/shared/affiliate/AffiliateAttributionService.js +0 -308
  67. package/dist/shared/affiliate/AffiliateAttributionService.js.map +0 -1
  68. package/dist/shared/affiliate/AffiliateClickService.d.ts +0 -35
  69. package/dist/shared/affiliate/AffiliateClickService.d.ts.map +0 -1
  70. package/dist/shared/affiliate/AffiliateClickService.js +0 -87
  71. package/dist/shared/affiliate/AffiliateClickService.js.map +0 -1
  72. package/dist/shared/affiliate/affiliateFeatureConfig.d.ts +0 -11
  73. package/dist/shared/affiliate/affiliateFeatureConfig.d.ts.map +0 -1
  74. package/dist/shared/affiliate/affiliateFeatureConfig.js +0 -242
  75. package/dist/shared/affiliate/affiliateFeatureConfig.js.map +0 -1
  76. package/dist/shared/affiliate/index.d.ts +0 -11
  77. package/dist/shared/affiliate/index.d.ts.map +0 -1
  78. package/dist/shared/affiliate/index.js +0 -13
  79. package/dist/shared/affiliate/index.js.map +0 -1
  80. package/dist/shared/affiliate/routes.d.ts +0 -87
  81. package/dist/shared/affiliate/routes.d.ts.map +0 -1
  82. package/dist/shared/affiliate/routes.js +0 -404
  83. package/dist/shared/affiliate/routes.js.map +0 -1
  84. package/dist/shared/affiliate/types.d.ts +0 -170
  85. package/dist/shared/affiliate/types.d.ts.map +0 -1
  86. package/dist/shared/affiliate/types.js +0 -11
  87. package/dist/shared/affiliate/types.js.map +0 -1
  88. package/dist/shared/billing/BillingService.d.ts +0 -56
  89. package/dist/shared/billing/BillingService.d.ts.map +0 -1
  90. package/dist/shared/billing/BillingService.js +0 -588
  91. package/dist/shared/billing/BillingService.js.map +0 -1
  92. package/dist/shared/billing/SeatBillingService.d.ts +0 -106
  93. package/dist/shared/billing/SeatBillingService.d.ts.map +0 -1
  94. package/dist/shared/billing/SeatBillingService.js +0 -292
  95. package/dist/shared/billing/SeatBillingService.js.map +0 -1
  96. package/dist/shared/billing/index.d.ts +0 -30
  97. package/dist/shared/billing/index.d.ts.map +0 -1
  98. package/dist/shared/billing/index.js +0 -27
  99. package/dist/shared/billing/index.js.map +0 -1
  100. package/dist/shared/billing/routes.d.ts +0 -45
  101. package/dist/shared/billing/routes.d.ts.map +0 -1
  102. package/dist/shared/billing/routes.js +0 -184
  103. package/dist/shared/billing/routes.js.map +0 -1
  104. package/dist/shared/billing/seat-pricing.d.ts +0 -53
  105. package/dist/shared/billing/seat-pricing.d.ts.map +0 -1
  106. package/dist/shared/billing/seat-pricing.js +0 -81
  107. package/dist/shared/billing/seat-pricing.js.map +0 -1
  108. package/dist/shared/billing/types.d.ts +0 -109
  109. package/dist/shared/billing/types.d.ts.map +0 -1
  110. package/dist/shared/billing/types.js +0 -8
  111. package/dist/shared/billing/types.js.map +0 -1
  112. package/dist/shared/email/EmailService.d.ts +0 -64
  113. package/dist/shared/email/EmailService.d.ts.map +0 -1
  114. package/dist/shared/email/EmailService.js +0 -300
  115. package/dist/shared/email/EmailService.js.map +0 -1
  116. package/dist/shared/email/adminRoutes.d.ts +0 -30
  117. package/dist/shared/email/adminRoutes.d.ts.map +0 -1
  118. package/dist/shared/email/adminRoutes.js +0 -227
  119. package/dist/shared/email/adminRoutes.js.map +0 -1
  120. package/dist/shared/email/gmail.d.ts +0 -208
  121. package/dist/shared/email/gmail.d.ts.map +0 -1
  122. package/dist/shared/email/gmail.js +0 -626
  123. package/dist/shared/email/gmail.js.map +0 -1
  124. package/dist/shared/email/index.d.ts +0 -15
  125. package/dist/shared/email/index.d.ts.map +0 -1
  126. package/dist/shared/email/index.js +0 -18
  127. package/dist/shared/email/index.js.map +0 -1
  128. package/dist/shared/email/mailgun.d.ts +0 -18
  129. package/dist/shared/email/mailgun.d.ts.map +0 -1
  130. package/dist/shared/email/mailgun.js +0 -76
  131. package/dist/shared/email/mailgun.js.map +0 -1
  132. package/dist/shared/email/sanitize.d.ts +0 -25
  133. package/dist/shared/email/sanitize.d.ts.map +0 -1
  134. package/dist/shared/email/sanitize.js +0 -39
  135. package/dist/shared/email/sanitize.js.map +0 -1
  136. package/dist/shared/email/smtp.d.ts +0 -20
  137. package/dist/shared/email/smtp.d.ts.map +0 -1
  138. package/dist/shared/email/smtp.js +0 -53
  139. package/dist/shared/email/smtp.js.map +0 -1
  140. package/dist/shared/email/types.d.ts +0 -113
  141. package/dist/shared/email/types.d.ts.map +0 -1
  142. package/dist/shared/email/types.js +0 -7
  143. package/dist/shared/email/types.js.map +0 -1
  144. package/dist/shared/email/webhookRoutes.d.ts +0 -29
  145. package/dist/shared/email/webhookRoutes.d.ts.map +0 -1
  146. package/dist/shared/email/webhookRoutes.js +0 -125
  147. package/dist/shared/email/webhookRoutes.js.map +0 -1
  148. package/dist/shared/mcp/index.d.ts +0 -51
  149. package/dist/shared/mcp/index.d.ts.map +0 -1
  150. package/dist/shared/mcp/index.js +0 -51
  151. package/dist/shared/mcp/index.js.map +0 -1
  152. package/dist/shared/mcp/mcp-auth-routes.d.ts +0 -26
  153. package/dist/shared/mcp/mcp-auth-routes.d.ts.map +0 -1
  154. package/dist/shared/mcp/mcp-auth-routes.js +0 -141
  155. package/dist/shared/mcp/mcp-auth-routes.js.map +0 -1
  156. package/dist/shared/mcp/mcp-db.d.ts +0 -99
  157. package/dist/shared/mcp/mcp-db.d.ts.map +0 -1
  158. package/dist/shared/mcp/mcp-db.js +0 -106
  159. package/dist/shared/mcp/mcp-db.js.map +0 -1
  160. package/dist/shared/mcp/mcp-routes.d.ts +0 -29
  161. package/dist/shared/mcp/mcp-routes.d.ts.map +0 -1
  162. package/dist/shared/mcp/mcp-routes.js +0 -171
  163. package/dist/shared/mcp/mcp-routes.js.map +0 -1
  164. package/dist/shared/mcp/mcp-tokens-routes.d.ts +0 -35
  165. package/dist/shared/mcp/mcp-tokens-routes.d.ts.map +0 -1
  166. package/dist/shared/mcp/mcp-tokens-routes.js +0 -94
  167. package/dist/shared/mcp/mcp-tokens-routes.js.map +0 -1
  168. package/dist/shared/mcp/mcp-usage-routes.d.ts +0 -17
  169. package/dist/shared/mcp/mcp-usage-routes.d.ts.map +0 -1
  170. package/dist/shared/mcp/mcp-usage-routes.js +0 -81
  171. package/dist/shared/mcp/mcp-usage-routes.js.map +0 -1
  172. package/dist/shared/mcp/tenant-context.d.ts +0 -59
  173. package/dist/shared/mcp/tenant-context.d.ts.map +0 -1
  174. package/dist/shared/mcp/tenant-context.js +0 -136
  175. package/dist/shared/mcp/tenant-context.js.map +0 -1
  176. package/dist/shared/mcp/types.d.ts +0 -74
  177. package/dist/shared/mcp/types.d.ts.map +0 -1
  178. package/dist/shared/mcp/types.js +0 -7
  179. package/dist/shared/mcp/types.js.map +0 -1
  180. package/dist/shared/planner/GoogleCalendarService.d.ts +0 -137
  181. package/dist/shared/planner/GoogleCalendarService.d.ts.map +0 -1
  182. package/dist/shared/planner/GoogleCalendarService.js +0 -525
  183. package/dist/shared/planner/GoogleCalendarService.js.map +0 -1
  184. package/dist/shared/planner/PlannerService.d.ts +0 -264
  185. package/dist/shared/planner/PlannerService.d.ts.map +0 -1
  186. package/dist/shared/planner/PlannerService.js +0 -1393
  187. package/dist/shared/planner/PlannerService.js.map +0 -1
  188. package/dist/shared/planner/index.d.ts +0 -37
  189. package/dist/shared/planner/index.d.ts.map +0 -1
  190. package/dist/shared/planner/index.js +0 -35
  191. package/dist/shared/planner/index.js.map +0 -1
  192. package/dist/shared/planner/intervals.d.ts +0 -60
  193. package/dist/shared/planner/intervals.d.ts.map +0 -1
  194. package/dist/shared/planner/intervals.js +0 -141
  195. package/dist/shared/planner/intervals.js.map +0 -1
  196. package/dist/shared/planner/routes.d.ts +0 -69
  197. package/dist/shared/planner/routes.d.ts.map +0 -1
  198. package/dist/shared/planner/routes.js +0 -770
  199. package/dist/shared/planner/routes.js.map +0 -1
  200. package/dist/shared/planner/types.d.ts +0 -328
  201. package/dist/shared/planner/types.d.ts.map +0 -1
  202. package/dist/shared/planner/types.js +0 -9
  203. package/dist/shared/planner/types.js.map +0 -1
  204. package/dist/shared/storage/ImageProcessingService.d.ts +0 -32
  205. package/dist/shared/storage/ImageProcessingService.d.ts.map +0 -1
  206. package/dist/shared/storage/ImageProcessingService.js +0 -127
  207. package/dist/shared/storage/ImageProcessingService.js.map +0 -1
  208. package/dist/shared/storage/StorageProxyService.d.ts +0 -47
  209. package/dist/shared/storage/StorageProxyService.d.ts.map +0 -1
  210. package/dist/shared/storage/StorageProxyService.js +0 -196
  211. package/dist/shared/storage/StorageProxyService.js.map +0 -1
  212. package/dist/shared/storage/StorageUploadService.d.ts +0 -126
  213. package/dist/shared/storage/StorageUploadService.d.ts.map +0 -1
  214. package/dist/shared/storage/StorageUploadService.js +0 -206
  215. package/dist/shared/storage/StorageUploadService.js.map +0 -1
  216. package/dist/shared/storage/creative-urls.d.ts +0 -14
  217. package/dist/shared/storage/creative-urls.d.ts.map +0 -1
  218. package/dist/shared/storage/creative-urls.js +0 -30
  219. package/dist/shared/storage/creative-urls.js.map +0 -1
  220. package/dist/shared/storage/index.d.ts +0 -28
  221. package/dist/shared/storage/index.d.ts.map +0 -1
  222. package/dist/shared/storage/index.js +0 -27
  223. package/dist/shared/storage/index.js.map +0 -1
  224. package/dist/shared/storage/routes.d.ts +0 -42
  225. package/dist/shared/storage/routes.d.ts.map +0 -1
  226. package/dist/shared/storage/routes.js +0 -160
  227. package/dist/shared/storage/routes.js.map +0 -1
  228. package/dist/shared/storage/types.d.ts +0 -53
  229. package/dist/shared/storage/types.d.ts.map +0 -1
  230. package/dist/shared/storage/types.js +0 -2
  231. package/dist/shared/storage/types.js.map +0 -1
  232. package/dist/shared/telegram/index.d.ts +0 -4
  233. package/dist/shared/telegram/index.d.ts.map +0 -1
  234. package/dist/shared/telegram/index.js +0 -3
  235. package/dist/shared/telegram/index.js.map +0 -1
  236. package/dist/shared/telegram/routes.d.ts +0 -43
  237. package/dist/shared/telegram/routes.d.ts.map +0 -1
  238. package/dist/shared/telegram/routes.js +0 -868
  239. package/dist/shared/telegram/routes.js.map +0 -1
  240. package/dist/shared/telegram/types.d.ts +0 -168
  241. package/dist/shared/telegram/types.d.ts.map +0 -1
  242. package/dist/shared/telegram/types.js +0 -7
  243. package/dist/shared/telegram/types.js.map +0 -1
  244. package/dist/shared/telegram/utils.d.ts +0 -44
  245. package/dist/shared/telegram/utils.d.ts.map +0 -1
  246. package/dist/shared/telegram/utils.js +0 -121
  247. package/dist/shared/telegram/utils.js.map +0 -1
  248. package/dist/storage.d.ts +0 -9
  249. package/dist/storage.d.ts.map +0 -1
  250. package/dist/storage.js +0 -8
  251. package/dist/storage.js.map +0 -1
  252. package/dist/telemetry.d.ts +0 -9
  253. package/dist/telemetry.d.ts.map +0 -1
  254. package/dist/telemetry.js +0 -8
  255. package/dist/telemetry.js.map +0 -1
  256. package/scripts/postinstall.js +0 -79
  257. package/src/shared/affiliate/migrations/001_create_affiliates.sql +0 -49
  258. package/src/shared/affiliate/migrations/002_create_affiliate_commissions.sql +0 -31
  259. package/src/shared/affiliate/migrations/003_create_affiliate_clicks.sql +0 -26
  260. package/src/shared/affiliate/migrations/004_create_affiliate_payments.sql +0 -34
  261. package/src/shared/affiliate/migrations/005_create_affiliate_tier_history.sql +0 -19
  262. package/src/shared/affiliate/migrations/006_create_affiliate_rpc_functions.sql +0 -209
  263. package/src/shared/affiliate/migrations/007_create_affiliate_rls_policies.sql +0 -123
  264. package/src/shared/billing/migrations/00000000000001_billing.sql +0 -114
  265. package/src/shared/email/migrations/000_create_email_logs.sql +0 -27
  266. package/src/shared/email/migrations/001_create_email_templates.sql +0 -27
  267. package/src/shared/email/migrations/002_add_rls_baseline_policies.sql +0 -37
  268. package/src/shared/email/migrations/003_create_gmail_accounts.sql +0 -82
  269. package/src/shared/email/migrations/004_add_email_logs_tracking_columns.sql +0 -15
  270. package/src/shared/mcp/migrations/001_mcp_api_tokens.sql +0 -21
  271. package/src/shared/mcp/migrations/002_mcp_audit_log.sql +0 -16
@@ -1,626 +0,0 @@
1
- /**
2
- * Gmail API Client — Generic OAuth2-based Gmail integration for Tetra projects.
3
- *
4
- * Supports: sending (plain text + HTML), reading, searching, attachments.
5
- * Token lifecycle:
6
- * 1. startGmailOAuth(): loopback OAuth2 flow → encrypted tokens in gmail_accounts table
7
- * 2. getAccessToken(): auto-refreshes expired tokens using refresh_token
8
- * 3. disconnectGmail(): deactivates account in DB
9
- *
10
- * @module @soulbatical/tetra-core/email/gmail
11
- */
12
- import { encryptCredential, decryptCredential } from '../crypto/index.js';
13
- import http from 'node:http';
14
- import { URL } from 'node:url';
15
- // ============================================
16
- // CONSTANTS
17
- // ============================================
18
- const GMAIL_API_BASE = 'https://www.googleapis.com/gmail/v1/users/me';
19
- const GOOGLE_TOKEN_URL = 'https://oauth2.googleapis.com/token';
20
- const GOOGLE_AUTH_URL = 'https://accounts.google.com/o/oauth2/v2/auth';
21
- const DEFAULT_SCOPES = [
22
- 'https://www.googleapis.com/auth/gmail.send',
23
- 'https://www.googleapis.com/auth/gmail.readonly',
24
- ];
25
- const DEFAULT_LOOPBACK_PORT = 9876;
26
- const TOKEN_REFRESH_MARGIN_MS = 5 * 60 * 1000;
27
- // ============================================
28
- // CLIENT CACHE
29
- // ============================================
30
- const clientCache = new Map();
31
- function cacheKey(userId, email) {
32
- return `${userId}:${email}`;
33
- }
34
- /**
35
- * Get or create a GmailClient for a user.
36
- * Loads encrypted tokens from gmail_accounts table.
37
- */
38
- export async function getGmailClient(supabase, userId, email) {
39
- if (email) {
40
- const cached = clientCache.get(cacheKey(userId, email));
41
- if (cached)
42
- return cached;
43
- }
44
- let query = supabase
45
- .from('gmail_accounts')
46
- .select('*')
47
- .eq('user_id', userId)
48
- .eq('is_active', true);
49
- if (email) {
50
- query = query.eq('email', email);
51
- }
52
- else {
53
- query = query.order('created_at', { ascending: true });
54
- }
55
- const { data, error } = await query.limit(1).single();
56
- if (error || !data)
57
- return null;
58
- const accessToken = await decryptCredential(data.access_token_encrypted);
59
- const refreshToken = await decryptCredential(data.refresh_token_encrypted);
60
- const client = new GmailClient(supabase, userId, data.id, data.email, {
61
- access_token: accessToken,
62
- refresh_token: refreshToken,
63
- expires_at: new Date(data.token_expires_at),
64
- });
65
- clientCache.set(cacheKey(userId, data.email), client);
66
- return client;
67
- }
68
- /**
69
- * List all active Gmail accounts for a user.
70
- */
71
- export async function listGmailAccounts(supabase, userId) {
72
- const { data, error } = await supabase
73
- .from('gmail_accounts')
74
- .select('id, email, created_at')
75
- .eq('user_id', userId)
76
- .eq('is_active', true)
77
- .order('created_at', { ascending: true });
78
- if (error || !data)
79
- return [];
80
- return data;
81
- }
82
- /**
83
- * Clear cached client for a user.
84
- */
85
- export function clearGmailClientCache(userId, email) {
86
- if (email) {
87
- clientCache.delete(cacheKey(userId, email));
88
- }
89
- else {
90
- for (const key of clientCache.keys()) {
91
- if (key.startsWith(`${userId}:`)) {
92
- clientCache.delete(key);
93
- }
94
- }
95
- }
96
- }
97
- /**
98
- * Disconnect a Gmail account (sets is_active = false).
99
- */
100
- export async function disconnectGmail(supabase, userId, email) {
101
- let query = supabase
102
- .from('gmail_accounts')
103
- .update({ is_active: false })
104
- .eq('user_id', userId)
105
- .eq('is_active', true);
106
- if (email) {
107
- query = query.eq('email', email);
108
- }
109
- const { data } = await query.select('email');
110
- clearGmailClientCache(userId, email);
111
- return (data ?? []).map((d) => d.email);
112
- }
113
- // ============================================
114
- // OAUTH2 FLOW
115
- // ============================================
116
- let authServer = null;
117
- let authServerResult = null;
118
- let authServerError = null;
119
- /**
120
- * Generate the OAuth2 authorization URL.
121
- */
122
- export function getGmailAuthUrl(config, state) {
123
- const redirectUri = config.redirectUri ?? `http://localhost:${config.loopbackPort ?? DEFAULT_LOOPBACK_PORT}/callback`;
124
- const scopes = [...DEFAULT_SCOPES, ...(config.additionalScopes ?? [])];
125
- const params = new URLSearchParams({
126
- client_id: config.clientId,
127
- redirect_uri: redirectUri,
128
- response_type: 'code',
129
- scope: scopes.join(' '),
130
- access_type: 'offline',
131
- prompt: 'consent',
132
- });
133
- if (state) {
134
- params.set('state', state);
135
- }
136
- return `${GOOGLE_AUTH_URL}?${params.toString()}`;
137
- }
138
- /**
139
- * Start a loopback OAuth server that handles the callback.
140
- * Auto-closes after handling or after 5 minutes.
141
- */
142
- export function startGmailOAuth(supabase, config, organizationId, userId) {
143
- if (authServer) {
144
- throw new Error('Gmail auth server already running.');
145
- }
146
- const port = config.loopbackPort ?? DEFAULT_LOOPBACK_PORT;
147
- authServerResult = null;
148
- authServerError = null;
149
- const timeout = setTimeout(() => {
150
- stopGmailAuthServer();
151
- authServerError = 'OAuth flow timed out after 5 minutes';
152
- }, 5 * 60 * 1000);
153
- authServer = http.createServer((req, res) => {
154
- if (!req.url?.startsWith('/callback')) {
155
- res.writeHead(404);
156
- res.end('Not found');
157
- return;
158
- }
159
- const url = new URL(req.url, `http://localhost:${port}`);
160
- const code = url.searchParams.get('code');
161
- const error = url.searchParams.get('error');
162
- if (error) {
163
- res.writeHead(200, { 'Content-Type': 'text/html' });
164
- res.end(`<html><body><h2>Authorization failed: ${error}</h2><p>You can close this tab.</p></body></html>`);
165
- clearTimeout(timeout);
166
- authServerError = `OAuth authorization denied: ${error}`;
167
- stopGmailAuthServer();
168
- return;
169
- }
170
- if (!code) {
171
- res.writeHead(400, { 'Content-Type': 'text/html' });
172
- res.end('<html><body><h2>Missing authorization code</h2></body></html>');
173
- return;
174
- }
175
- res.writeHead(200, { 'Content-Type': 'text/html' });
176
- res.end('<html><body><h2>Gmail connected!</h2><p>You can close this tab.</p></body></html>');
177
- clearTimeout(timeout);
178
- exchangeGmailCode(supabase, config, code, organizationId, userId)
179
- .then((result) => {
180
- authServerResult = result;
181
- stopGmailAuthServer();
182
- })
183
- .catch((err) => {
184
- authServerError = err instanceof Error ? err.message : String(err);
185
- stopGmailAuthServer();
186
- });
187
- });
188
- authServer.listen(port, () => {
189
- console.log(`[gmail] OAuth loopback server listening on port ${port}`);
190
- });
191
- authServer.on('error', (err) => {
192
- clearTimeout(timeout);
193
- authServerError = `Failed to start OAuth server on port ${port}: ${err.message}`;
194
- authServer = null;
195
- });
196
- }
197
- function stopGmailAuthServer() {
198
- if (authServer) {
199
- authServer.close();
200
- authServer = null;
201
- }
202
- }
203
- /**
204
- * Get the current state of the OAuth auth server.
205
- */
206
- export function getGmailAuthServerStatus() {
207
- return {
208
- running: authServer !== null,
209
- result: authServerResult,
210
- error: authServerError,
211
- };
212
- }
213
- /**
214
- * Reset auth server state so a new connect flow can start.
215
- */
216
- export function resetGmailAuthServerState() {
217
- authServerResult = null;
218
- authServerError = null;
219
- }
220
- /**
221
- * Exchange authorization code for tokens and store encrypted in DB.
222
- */
223
- export async function exchangeGmailCode(supabase, config, code, organizationId, userId) {
224
- const redirectUri = config.redirectUri ?? `http://localhost:${config.loopbackPort ?? DEFAULT_LOOPBACK_PORT}/callback`;
225
- const tokenResponse = await fetch(GOOGLE_TOKEN_URL, {
226
- method: 'POST',
227
- headers: { 'Content-Type': 'application/x-www-form-urlencoded' },
228
- body: new URLSearchParams({
229
- code,
230
- client_id: config.clientId,
231
- client_secret: config.clientSecret,
232
- redirect_uri: redirectUri,
233
- grant_type: 'authorization_code',
234
- }),
235
- });
236
- if (!tokenResponse.ok) {
237
- const errorBody = await tokenResponse.text();
238
- throw new Error(`Token exchange failed: ${tokenResponse.status} ${errorBody}`);
239
- }
240
- const tokenData = (await tokenResponse.json());
241
- if (!tokenData.refresh_token) {
242
- throw new Error('No refresh_token received. Revoke access and re-authorize with prompt=consent.');
243
- }
244
- // Get user profile
245
- const profileResponse = await fetch(`${GMAIL_API_BASE}/profile`, {
246
- headers: { Authorization: `Bearer ${tokenData.access_token}` },
247
- });
248
- if (!profileResponse.ok) {
249
- throw new Error(`Failed to get Gmail profile: ${profileResponse.status}`);
250
- }
251
- const profile = (await profileResponse.json());
252
- const expiresAt = new Date(Date.now() + tokenData.expires_in * 1000);
253
- // Encrypt tokens
254
- const accessTokenEncrypted = await encryptCredential(tokenData.access_token);
255
- const refreshTokenEncrypted = await encryptCredential(tokenData.refresh_token);
256
- // Upsert in DB
257
- const { error } = await supabase.from('gmail_accounts').upsert({
258
- organization_id: organizationId,
259
- user_id: userId,
260
- email: profile.emailAddress,
261
- access_token_encrypted: accessTokenEncrypted,
262
- refresh_token_encrypted: refreshTokenEncrypted,
263
- token_expires_at: expiresAt.toISOString(),
264
- scopes: [...DEFAULT_SCOPES, ...(config.additionalScopes ?? [])],
265
- is_active: true,
266
- }, { onConflict: 'user_id,email' });
267
- if (error) {
268
- throw new Error(`Failed to store Gmail tokens: ${error.message}`);
269
- }
270
- clearGmailClientCache(userId, profile.emailAddress);
271
- console.log(`[gmail] Account connected: ${profile.emailAddress}`);
272
- return { email: profile.emailAddress };
273
- }
274
- // ============================================
275
- // GMAIL CLIENT
276
- // ============================================
277
- export class GmailClient {
278
- supabase;
279
- accountId;
280
- email;
281
- tokens;
282
- constructor(supabase, _userId, accountId, email, tokens) {
283
- this.supabase = supabase;
284
- this.accountId = accountId;
285
- this.email = email;
286
- this.tokens = tokens;
287
- }
288
- getEmail() {
289
- return this.email;
290
- }
291
- /**
292
- * Get a valid access token, refreshing if necessary.
293
- */
294
- async getAccessToken() {
295
- const now = new Date();
296
- if (now.getTime() + TOKEN_REFRESH_MARGIN_MS >= this.tokens.expires_at.getTime()) {
297
- await this.refreshToken();
298
- }
299
- return this.tokens.access_token;
300
- }
301
- /**
302
- * Refresh the access token using the refresh token.
303
- */
304
- async refreshToken() {
305
- const clientId = process.env.GOOGLE_CLIENT_ID;
306
- const clientSecret = process.env.GOOGLE_CLIENT_SECRET;
307
- if (!clientId || !clientSecret) {
308
- throw new Error('GOOGLE_CLIENT_ID and GOOGLE_CLIENT_SECRET required for token refresh');
309
- }
310
- const response = await fetch(GOOGLE_TOKEN_URL, {
311
- method: 'POST',
312
- headers: { 'Content-Type': 'application/x-www-form-urlencoded' },
313
- body: new URLSearchParams({
314
- client_id: clientId,
315
- client_secret: clientSecret,
316
- refresh_token: this.tokens.refresh_token,
317
- grant_type: 'refresh_token',
318
- }),
319
- });
320
- if (!response.ok) {
321
- const errorBody = await response.text();
322
- throw new Error(`Gmail token refresh failed: ${response.status}. Re-run Gmail connect. ${errorBody}`);
323
- }
324
- const data = (await response.json());
325
- const expiresAt = new Date(Date.now() + data.expires_in * 1000);
326
- this.tokens.access_token = data.access_token;
327
- this.tokens.expires_at = expiresAt;
328
- // Persist refreshed token
329
- const accessTokenEncrypted = await encryptCredential(data.access_token);
330
- await this.supabase
331
- .from('gmail_accounts')
332
- .update({
333
- access_token_encrypted: accessTokenEncrypted,
334
- token_expires_at: expiresAt.toISOString(),
335
- })
336
- .eq('id', this.accountId);
337
- }
338
- /**
339
- * Make an authenticated request to the Gmail API.
340
- */
341
- async request(path, options) {
342
- const accessToken = await this.getAccessToken();
343
- const response = await fetch(`${GMAIL_API_BASE}${path}`, {
344
- ...options,
345
- headers: {
346
- Authorization: `Bearer ${accessToken}`,
347
- ...options?.headers,
348
- },
349
- });
350
- if (!response.ok) {
351
- const errorBody = await response.text();
352
- throw new Error(`Gmail API error ${response.status}: ${errorBody}`);
353
- }
354
- return response.json();
355
- }
356
- /**
357
- * Send a plain text email.
358
- */
359
- async send(to, subject, body, options) {
360
- const headers = this.buildMimeHeaders(to, subject, options);
361
- headers.push('Content-Type: text/plain; charset=UTF-8');
362
- headers.push('Content-Transfer-Encoding: base64');
363
- const mimeMessage = headers.join('\r\n') + '\r\n\r\n' + Buffer.from(body).toString('base64');
364
- return this.sendRaw(mimeMessage);
365
- }
366
- /**
367
- * Send an HTML email (for transactional/notification emails).
368
- */
369
- async sendHtml(to, subject, html, options) {
370
- const boundary = `tetra_${Date.now()}_${Math.random().toString(36).slice(2)}`;
371
- const headers = this.buildMimeHeaders(to, subject, options);
372
- headers.push(`Content-Type: multipart/alternative; boundary="${boundary}"`);
373
- // Plain text fallback (strip HTML tags)
374
- const plainText = html.replace(/<[^>]*>/g, '').replace(/\s+/g, ' ').trim();
375
- let mimeMessage = headers.join('\r\n') + '\r\n\r\n';
376
- // Plain text part
377
- mimeMessage += `--${boundary}\r\n`;
378
- mimeMessage += 'Content-Type: text/plain; charset=UTF-8\r\n';
379
- mimeMessage += 'Content-Transfer-Encoding: base64\r\n\r\n';
380
- mimeMessage += Buffer.from(plainText).toString('base64') + '\r\n';
381
- // HTML part
382
- mimeMessage += `--${boundary}\r\n`;
383
- mimeMessage += 'Content-Type: text/html; charset=UTF-8\r\n';
384
- mimeMessage += 'Content-Transfer-Encoding: base64\r\n\r\n';
385
- mimeMessage += Buffer.from(html).toString('base64') + '\r\n';
386
- mimeMessage += `--${boundary}--`;
387
- return this.sendRaw(mimeMessage);
388
- }
389
- /**
390
- * Search for messages using Gmail query syntax.
391
- */
392
- async search(query, maxResults = 20) {
393
- const params = new URLSearchParams({
394
- q: query,
395
- maxResults: String(Math.min(maxResults, 100)),
396
- });
397
- const result = await this.request(`/messages?${params.toString()}`);
398
- return {
399
- messages: result.messages ?? [],
400
- resultSizeEstimate: result.resultSizeEstimate,
401
- };
402
- }
403
- /**
404
- * Read a full message by ID.
405
- */
406
- async read(messageId) {
407
- return this.request(`/messages/${messageId}?format=full`);
408
- }
409
- /**
410
- * List attachments from a message.
411
- */
412
- extractAttachments(message) {
413
- const attachments = [];
414
- function walk(parts) {
415
- if (!parts)
416
- return;
417
- for (const part of parts) {
418
- if (part.body.attachmentId && part.filename) {
419
- attachments.push({
420
- attachmentId: part.body.attachmentId,
421
- filename: part.filename,
422
- mimeType: part.mimeType,
423
- size: part.body.size,
424
- });
425
- }
426
- walk(part.parts);
427
- }
428
- }
429
- if (message.payload.body.attachmentId && message.payload.filename) {
430
- attachments.push({
431
- attachmentId: message.payload.body.attachmentId,
432
- filename: message.payload.filename,
433
- mimeType: message.payload.mimeType,
434
- size: message.payload.body.size,
435
- });
436
- }
437
- walk(message.payload.parts);
438
- return attachments;
439
- }
440
- /**
441
- * Download an attachment as a Buffer.
442
- */
443
- async downloadAttachment(messageId, attachmentId) {
444
- const result = await this.request(`/messages/${messageId}/attachments/${attachmentId}`);
445
- const base64 = result.data.replace(/-/g, '+').replace(/_/g, '/');
446
- return Buffer.from(base64, 'base64');
447
- }
448
- /**
449
- * Get Gmail profile information.
450
- */
451
- async getProfile() {
452
- return this.request('/profile');
453
- }
454
- /**
455
- * Extract plain text body from a message.
456
- */
457
- extractTextBody(message) {
458
- function findText(part) {
459
- if (part.mimeType === 'text/plain' && part.body.data) {
460
- const base64 = part.body.data.replace(/-/g, '+').replace(/_/g, '/');
461
- return Buffer.from(base64, 'base64').toString('utf8');
462
- }
463
- if (part.parts) {
464
- for (const sub of part.parts) {
465
- const text = findText(sub);
466
- if (text)
467
- return text;
468
- }
469
- }
470
- return null;
471
- }
472
- return findText(message.payload) ?? '(no text body)';
473
- }
474
- // ── Private helpers ──
475
- buildMimeHeaders(to, subject, options) {
476
- const headers = [
477
- `From: ${this.email}`,
478
- `To: ${to}`,
479
- `Subject: =?UTF-8?B?${Buffer.from(subject).toString('base64')}?=`,
480
- 'MIME-Version: 1.0',
481
- ];
482
- if (options?.cc)
483
- headers.push(`Cc: ${options.cc}`);
484
- if (options?.bcc)
485
- headers.push(`Bcc: ${options.bcc}`);
486
- if (options?.reply_to)
487
- headers.push(`Reply-To: ${options.reply_to}`);
488
- return headers;
489
- }
490
- async sendRaw(mimeMessage) {
491
- const raw = Buffer.from(mimeMessage)
492
- .toString('base64')
493
- .replace(/\+/g, '-')
494
- .replace(/\//g, '_')
495
- .replace(/=+$/, '');
496
- return this.request('/messages/send', {
497
- method: 'POST',
498
- headers: { 'Content-Type': 'application/json' },
499
- body: JSON.stringify({ raw }),
500
- });
501
- }
502
- }
503
- // ============================================
504
- // EXPRESS ROUTES FACTORY
505
- // ============================================
506
- /**
507
- * Add Gmail OAuth routes to an Express router.
508
- * Requires authenticateToken middleware to be applied before mounting.
509
- *
510
- * Routes:
511
- * - POST /connect — Start OAuth flow (returns auth_url to redirect user to)
512
- * - GET /callback — Google redirects here after authorization
513
- * - GET /status — Check connection status
514
- * - POST /disconnect — Disconnect Gmail account
515
- */
516
- export function addGmailOAuthRoutes(router, getSystemDB, routesConfig) {
517
- const frontendUrl = routesConfig?.frontendUrl || process.env.FRONTEND_URL || 'http://localhost:3000';
518
- const successPath = routesConfig?.frontendSuccessPath || '/settings';
519
- const errorPath = routesConfig?.frontendErrorPath || '/settings';
520
- function getOAuthConfig(callbackUrl) {
521
- const clientId = process.env.GOOGLE_CLIENT_ID;
522
- const clientSecret = process.env.GOOGLE_CLIENT_SECRET;
523
- if (!clientId || !clientSecret) {
524
- throw new Error('GOOGLE_CLIENT_ID and GOOGLE_CLIENT_SECRET are required');
525
- }
526
- return { clientId, clientSecret, redirectUri: callbackUrl };
527
- }
528
- // POST /connect — Start OAuth flow
529
- router.post('/connect', async (req, res) => {
530
- const user = req.user;
531
- const supabase = getSystemDB();
532
- const { data: membership } = await supabase
533
- .from('organization_members')
534
- .select('organization_id')
535
- .eq('user_id', user.id)
536
- .eq('status', 'active')
537
- .limit(1)
538
- .single();
539
- if (!membership) {
540
- res.status(400).json({ success: false, error: 'No organization found' });
541
- return;
542
- }
543
- try {
544
- // Build callback URL based on the request origin
545
- const protocol = req.headers['x-forwarded-proto'] || req.protocol;
546
- const host = req.headers['x-forwarded-host'] || req.headers.host;
547
- const basePath = req.baseUrl; // e.g. /api/gmail
548
- const callbackUrl = `${protocol}://${host}${basePath}/callback`;
549
- const config = getOAuthConfig(callbackUrl);
550
- // Encode state with user info for the callback
551
- const state = Buffer.from(JSON.stringify({
552
- userId: user.id,
553
- organizationId: membership.organization_id,
554
- })).toString('base64url');
555
- const authUrl = getGmailAuthUrl(config, state);
556
- res.json({
557
- success: true,
558
- status: 'redirect',
559
- auth_url: authUrl,
560
- });
561
- }
562
- catch (err) {
563
- const msg = err instanceof Error ? err.message : String(err);
564
- res.status(500).json({ success: false, error: msg });
565
- }
566
- });
567
- // GET /callback — Google redirects here after authorization
568
- router.get('/callback', async (req, res) => {
569
- const code = req.query.code;
570
- const error = req.query.error;
571
- const stateParam = req.query.state;
572
- if (error) {
573
- res.redirect(`${frontendUrl}${errorPath}?gmail_error=${encodeURIComponent(error)}`);
574
- return;
575
- }
576
- if (!code || !stateParam) {
577
- res.redirect(`${frontendUrl}${errorPath}?gmail_error=missing_code`);
578
- return;
579
- }
580
- try {
581
- const state = JSON.parse(Buffer.from(stateParam, 'base64url').toString());
582
- const protocol = req.headers['x-forwarded-proto'] || req.protocol;
583
- const host = req.headers['x-forwarded-host'] || req.headers.host;
584
- const basePath = req.baseUrl;
585
- const callbackUrl = `${protocol}://${host}${basePath}/callback`;
586
- const config = getOAuthConfig(callbackUrl);
587
- const supabase = getSystemDB();
588
- const result = await exchangeGmailCode(supabase, config, code, state.organizationId, state.userId);
589
- res.redirect(`${frontendUrl}${successPath}?gmail_connected=${encodeURIComponent(result.email)}`);
590
- }
591
- catch (err) {
592
- const msg = err instanceof Error ? err.message : String(err);
593
- console.error('[gmail] OAuth callback error:', msg);
594
- res.redirect(`${frontendUrl}${errorPath}?gmail_error=${encodeURIComponent(msg)}`);
595
- }
596
- });
597
- // GET /status — Check Gmail connection status
598
- router.get('/status', async (req, res) => {
599
- const user = req.user;
600
- const supabase = getSystemDB();
601
- const accounts = await listGmailAccounts(supabase, user.id);
602
- res.json({
603
- success: true,
604
- connected: accounts.length > 0,
605
- accounts: accounts.map((a) => ({
606
- email: a.email,
607
- connected_since: a.created_at,
608
- })),
609
- });
610
- });
611
- // POST /disconnect — Disconnect Gmail account
612
- router.post('/disconnect', async (req, res) => {
613
- const user = req.user;
614
- const email = req.body?.email;
615
- const supabase = getSystemDB();
616
- const disconnected = await disconnectGmail(supabase, user.id, email);
617
- res.json({
618
- success: true,
619
- disconnected,
620
- message: disconnected.length > 0
621
- ? `Disconnected: ${disconnected.join(', ')}`
622
- : 'No active accounts found',
623
- });
624
- });
625
- }
626
- //# sourceMappingURL=gmail.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"gmail.js","sourceRoot":"","sources":["../../../src/shared/email/gmail.ts"],"names":[],"mappings":"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"}
@@ -1,15 +0,0 @@
1
- /**
2
- * Email Module — Barrel Export
3
- *
4
- * @module @soulbatical/tetra-core/email
5
- */
6
- export { EmailService } from './EmailService.js';
7
- export { sendMailgunEmail } from './mailgun.js';
8
- export { sendSmtpEmail } from './smtp.js';
9
- export { addEmailAdminRoutes } from './adminRoutes.js';
10
- export { addMailgunWebhookRoutes } from './webhookRoutes.js';
11
- export { GmailClient, getGmailClient, listGmailAccounts, clearGmailClientCache, disconnectGmail, getGmailAuthUrl, startGmailOAuth, getGmailAuthServerStatus, resetGmailAuthServerState, exchangeGmailCode, addGmailOAuthRoutes, } from './gmail.js';
12
- export type { GmailTokens, GmailSendOptions, GmailSendResult, GmailSearchResult, GmailMessageSummary, GmailMessage, GmailMessagePart, GmailMessageHeader, GmailAttachmentInfo, GmailProfile, GmailOAuthConfig, GmailAuthServerStatus, GmailOAuthRoutesConfig, } from './gmail.js';
13
- export { escapeHtml, stripCRLF, sanitizeEmailHeader, stripHtml } from './sanitize.js';
14
- export type { EmailAttachment, EmailConfig, SendEmailOpts, EmailTemplate, EmailLogEntry, MailgunResponse, SmtpResponse, EmailSendResponse, } from './types.js';
15
- //# sourceMappingURL=index.d.ts.map