channelkit 1.0.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 (237) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +829 -0
  3. package/config.example.yaml +37 -0
  4. package/dist/api/middleware/auth.d.ts +14 -0
  5. package/dist/api/middleware/auth.d.ts.map +1 -0
  6. package/dist/api/middleware/auth.js +130 -0
  7. package/dist/api/middleware/auth.js.map +1 -0
  8. package/dist/api/routes/config.d.ts +4 -0
  9. package/dist/api/routes/config.d.ts.map +1 -0
  10. package/dist/api/routes/config.js +794 -0
  11. package/dist/api/routes/config.js.map +1 -0
  12. package/dist/api/routes/dashboard.d.ts +4 -0
  13. package/dist/api/routes/dashboard.d.ts.map +1 -0
  14. package/dist/api/routes/dashboard.js +89 -0
  15. package/dist/api/routes/dashboard.js.map +1 -0
  16. package/dist/api/routes/inbound.d.ts +4 -0
  17. package/dist/api/routes/inbound.d.ts.map +1 -0
  18. package/dist/api/routes/inbound.js +293 -0
  19. package/dist/api/routes/inbound.js.map +1 -0
  20. package/dist/api/routes/logs.d.ts +4 -0
  21. package/dist/api/routes/logs.d.ts.map +1 -0
  22. package/dist/api/routes/logs.js +49 -0
  23. package/dist/api/routes/logs.js.map +1 -0
  24. package/dist/api/routes/mcp.d.ts +4 -0
  25. package/dist/api/routes/mcp.d.ts.map +1 -0
  26. package/dist/api/routes/mcp.js +100 -0
  27. package/dist/api/routes/mcp.js.map +1 -0
  28. package/dist/api/routes/restart.d.ts +4 -0
  29. package/dist/api/routes/restart.d.ts.map +1 -0
  30. package/dist/api/routes/restart.js +11 -0
  31. package/dist/api/routes/restart.js.map +1 -0
  32. package/dist/api/routes/send.d.ts +4 -0
  33. package/dist/api/routes/send.d.ts.map +1 -0
  34. package/dist/api/routes/send.js +66 -0
  35. package/dist/api/routes/send.js.map +1 -0
  36. package/dist/api/routes/settings.d.ts +4 -0
  37. package/dist/api/routes/settings.d.ts.map +1 -0
  38. package/dist/api/routes/settings.js +133 -0
  39. package/dist/api/routes/settings.js.map +1 -0
  40. package/dist/api/routes/tunnel.d.ts +4 -0
  41. package/dist/api/routes/tunnel.d.ts.map +1 -0
  42. package/dist/api/routes/tunnel.js +209 -0
  43. package/dist/api/routes/tunnel.js.map +1 -0
  44. package/dist/api/routes/twilio.d.ts +4 -0
  45. package/dist/api/routes/twilio.d.ts.map +1 -0
  46. package/dist/api/routes/twilio.js +138 -0
  47. package/dist/api/routes/twilio.js.map +1 -0
  48. package/dist/api/routes/update.d.ts +4 -0
  49. package/dist/api/routes/update.d.ts.map +1 -0
  50. package/dist/api/routes/update.js +42 -0
  51. package/dist/api/routes/update.js.map +1 -0
  52. package/dist/api/server.d.ts +52 -0
  53. package/dist/api/server.d.ts.map +1 -0
  54. package/dist/api/server.js +415 -0
  55. package/dist/api/server.js.map +1 -0
  56. package/dist/api/types.d.ts +61 -0
  57. package/dist/api/types.d.ts.map +1 -0
  58. package/dist/api/types.js +3 -0
  59. package/dist/api/types.js.map +1 -0
  60. package/dist/channels/base.d.ts +15 -0
  61. package/dist/channels/base.d.ts.map +1 -0
  62. package/dist/channels/base.js +20 -0
  63. package/dist/channels/base.js.map +1 -0
  64. package/dist/channels/email/gmail.d.ts +36 -0
  65. package/dist/channels/email/gmail.d.ts.map +1 -0
  66. package/dist/channels/email/gmail.js +351 -0
  67. package/dist/channels/email/gmail.js.map +1 -0
  68. package/dist/channels/email/index.d.ts +3 -0
  69. package/dist/channels/email/index.d.ts.map +1 -0
  70. package/dist/channels/email/index.js +8 -0
  71. package/dist/channels/email/index.js.map +1 -0
  72. package/dist/channels/email/resend.d.ts +29 -0
  73. package/dist/channels/email/resend.d.ts.map +1 -0
  74. package/dist/channels/email/resend.js +155 -0
  75. package/dist/channels/email/resend.js.map +1 -0
  76. package/dist/channels/endpoint/index.d.ts +21 -0
  77. package/dist/channels/endpoint/index.d.ts.map +1 -0
  78. package/dist/channels/endpoint/index.js +80 -0
  79. package/dist/channels/endpoint/index.js.map +1 -0
  80. package/dist/channels/sms/index.d.ts +37 -0
  81. package/dist/channels/sms/index.d.ts.map +1 -0
  82. package/dist/channels/sms/index.js +163 -0
  83. package/dist/channels/sms/index.js.map +1 -0
  84. package/dist/channels/telegram/index.d.ts +24 -0
  85. package/dist/channels/telegram/index.d.ts.map +1 -0
  86. package/dist/channels/telegram/index.js +231 -0
  87. package/dist/channels/telegram/index.js.map +1 -0
  88. package/dist/channels/voice/index.d.ts +62 -0
  89. package/dist/channels/voice/index.d.ts.map +1 -0
  90. package/dist/channels/voice/index.js +286 -0
  91. package/dist/channels/voice/index.js.map +1 -0
  92. package/dist/channels/whatsapp/index.d.ts +31 -0
  93. package/dist/channels/whatsapp/index.d.ts.map +1 -0
  94. package/dist/channels/whatsapp/index.js +383 -0
  95. package/dist/channels/whatsapp/index.js.map +1 -0
  96. package/dist/cli/commands/demo.d.ts +4 -0
  97. package/dist/cli/commands/demo.d.ts.map +1 -0
  98. package/dist/cli/commands/demo.js +55 -0
  99. package/dist/cli/commands/demo.js.map +1 -0
  100. package/dist/cli/commands/init.d.ts +2 -0
  101. package/dist/cli/commands/init.d.ts.map +1 -0
  102. package/dist/cli/commands/init.js +254 -0
  103. package/dist/cli/commands/init.js.map +1 -0
  104. package/dist/cli/commands/install-skill.d.ts +4 -0
  105. package/dist/cli/commands/install-skill.d.ts.map +1 -0
  106. package/dist/cli/commands/install-skill.js +60 -0
  107. package/dist/cli/commands/install-skill.js.map +1 -0
  108. package/dist/cli/commands/send.d.ts +5 -0
  109. package/dist/cli/commands/send.d.ts.map +1 -0
  110. package/dist/cli/commands/send.js +46 -0
  111. package/dist/cli/commands/send.js.map +1 -0
  112. package/dist/cli/commands/start.d.ts +5 -0
  113. package/dist/cli/commands/start.d.ts.map +1 -0
  114. package/dist/cli/commands/start.js +129 -0
  115. package/dist/cli/commands/start.js.map +1 -0
  116. package/dist/cli/helpers.d.ts +26 -0
  117. package/dist/cli/helpers.d.ts.map +1 -0
  118. package/dist/cli/helpers.js +120 -0
  119. package/dist/cli/helpers.js.map +1 -0
  120. package/dist/cli/index.d.ts +3 -0
  121. package/dist/cli/index.d.ts.map +1 -0
  122. package/dist/cli/index.js +282 -0
  123. package/dist/cli/index.js.map +1 -0
  124. package/dist/cli/wizards/channel.d.ts +4 -0
  125. package/dist/cli/wizards/channel.d.ts.map +1 -0
  126. package/dist/cli/wizards/channel.js +285 -0
  127. package/dist/cli/wizards/channel.js.map +1 -0
  128. package/dist/cli/wizards/provision.d.ts +4 -0
  129. package/dist/cli/wizards/provision.d.ts.map +1 -0
  130. package/dist/cli/wizards/provision.js +213 -0
  131. package/dist/cli/wizards/provision.js.map +1 -0
  132. package/dist/cli/wizards/service.d.ts +5 -0
  133. package/dist/cli/wizards/service.d.ts.map +1 -0
  134. package/dist/cli/wizards/service.js +212 -0
  135. package/dist/cli/wizards/service.js.map +1 -0
  136. package/dist/cli.d.ts +3 -0
  137. package/dist/cli.d.ts.map +1 -0
  138. package/dist/cli.js +6 -0
  139. package/dist/cli.js.map +1 -0
  140. package/dist/config/parser.d.ts +6 -0
  141. package/dist/config/parser.d.ts.map +1 -0
  142. package/dist/config/parser.js +37 -0
  143. package/dist/config/parser.js.map +1 -0
  144. package/dist/config/types.d.ts +170 -0
  145. package/dist/config/types.d.ts.map +1 -0
  146. package/dist/config/types.js +3 -0
  147. package/dist/config/types.js.map +1 -0
  148. package/dist/core/apiServer.d.ts +2 -0
  149. package/dist/core/apiServer.d.ts.map +1 -0
  150. package/dist/core/apiServer.js +7 -0
  151. package/dist/core/apiServer.js.map +1 -0
  152. package/dist/core/groupStore.d.ts +19 -0
  153. package/dist/core/groupStore.d.ts.map +1 -0
  154. package/dist/core/groupStore.js +48 -0
  155. package/dist/core/groupStore.js.map +1 -0
  156. package/dist/core/logger.d.ts +42 -0
  157. package/dist/core/logger.d.ts.map +1 -0
  158. package/dist/core/logger.js +142 -0
  159. package/dist/core/logger.js.map +1 -0
  160. package/dist/core/messageHandler.d.ts +15 -0
  161. package/dist/core/messageHandler.d.ts.map +1 -0
  162. package/dist/core/messageHandler.js +309 -0
  163. package/dist/core/messageHandler.js.map +1 -0
  164. package/dist/core/restart.d.ts +3 -0
  165. package/dist/core/restart.d.ts.map +1 -0
  166. package/dist/core/restart.js +35 -0
  167. package/dist/core/restart.js.map +1 -0
  168. package/dist/core/router.d.ts +56 -0
  169. package/dist/core/router.d.ts.map +1 -0
  170. package/dist/core/router.js +168 -0
  171. package/dist/core/router.js.map +1 -0
  172. package/dist/core/tunnel.d.ts +16 -0
  173. package/dist/core/tunnel.d.ts.map +1 -0
  174. package/dist/core/tunnel.js +99 -0
  175. package/dist/core/tunnel.js.map +1 -0
  176. package/dist/core/types.d.ts +54 -0
  177. package/dist/core/types.d.ts.map +1 -0
  178. package/dist/core/types.js +3 -0
  179. package/dist/core/types.js.map +1 -0
  180. package/dist/core/updater.d.ts +44 -0
  181. package/dist/core/updater.d.ts.map +1 -0
  182. package/dist/core/updater.js +264 -0
  183. package/dist/core/updater.js.map +1 -0
  184. package/dist/core/webhook.d.ts +26 -0
  185. package/dist/core/webhook.d.ts.map +1 -0
  186. package/dist/core/webhook.js +224 -0
  187. package/dist/core/webhook.js.map +1 -0
  188. package/dist/dashboard/assets/browser-D_-rzKir.js +8 -0
  189. package/dist/dashboard/assets/index-CNa084vI.js +88 -0
  190. package/dist/dashboard/assets/index-CRvIEyjF.css +1 -0
  191. package/dist/dashboard/index.html +17 -0
  192. package/dist/index.d.ts +22 -0
  193. package/dist/index.d.ts.map +1 -0
  194. package/dist/index.js +551 -0
  195. package/dist/index.js.map +1 -0
  196. package/dist/mcp/index.d.ts +3 -0
  197. package/dist/mcp/index.d.ts.map +1 -0
  198. package/dist/mcp/index.js +6 -0
  199. package/dist/mcp/index.js.map +1 -0
  200. package/dist/mcp/server.d.ts +45 -0
  201. package/dist/mcp/server.d.ts.map +1 -0
  202. package/dist/mcp/server.js +197 -0
  203. package/dist/mcp/server.js.map +1 -0
  204. package/dist/mcp/tools.d.ts +16 -0
  205. package/dist/mcp/tools.d.ts.map +1 -0
  206. package/dist/mcp/tools.js +502 -0
  207. package/dist/mcp/tools.js.map +1 -0
  208. package/dist/media/formatter.d.ts +12 -0
  209. package/dist/media/formatter.d.ts.map +1 -0
  210. package/dist/media/formatter.js +147 -0
  211. package/dist/media/formatter.js.map +1 -0
  212. package/dist/media/processor.d.ts +33 -0
  213. package/dist/media/processor.d.ts.map +1 -0
  214. package/dist/media/processor.js +145 -0
  215. package/dist/media/processor.js.map +1 -0
  216. package/dist/media/stt.d.ts +16 -0
  217. package/dist/media/stt.d.ts.map +1 -0
  218. package/dist/media/stt.js +298 -0
  219. package/dist/media/stt.js.map +1 -0
  220. package/dist/media/tts.d.ts +19 -0
  221. package/dist/media/tts.d.ts.map +1 -0
  222. package/dist/media/tts.js +135 -0
  223. package/dist/media/tts.js.map +1 -0
  224. package/dist/onboarding/index.d.ts +28 -0
  225. package/dist/onboarding/index.d.ts.map +1 -0
  226. package/dist/onboarding/index.js +144 -0
  227. package/dist/onboarding/index.js.map +1 -0
  228. package/dist/paths.d.ts +9 -0
  229. package/dist/paths.d.ts.map +1 -0
  230. package/dist/paths.js +14 -0
  231. package/dist/paths.js.map +1 -0
  232. package/dist/provisioning/twilio.d.ts +51 -0
  233. package/dist/provisioning/twilio.d.ts.map +1 -0
  234. package/dist/provisioning/twilio.js +175 -0
  235. package/dist/provisioning/twilio.js.map +1 -0
  236. package/echo-server.js +163 -0
  237. package/package.json +79 -0
@@ -0,0 +1,351 @@
1
+ "use strict";
2
+ /**
3
+ * Gmail Channel — OAuth2 + polling
4
+ *
5
+ * Flow:
6
+ * 1. First run: opens browser for OAuth consent → saves refresh token
7
+ * 2. Polls for new messages at configured interval
8
+ * 3. Sends replies via Gmail API
9
+ */
10
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
11
+ if (k2 === undefined) k2 = k;
12
+ var desc = Object.getOwnPropertyDescriptor(m, k);
13
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
14
+ desc = { enumerable: true, get: function() { return m[k]; } };
15
+ }
16
+ Object.defineProperty(o, k2, desc);
17
+ }) : (function(o, m, k, k2) {
18
+ if (k2 === undefined) k2 = k;
19
+ o[k2] = m[k];
20
+ }));
21
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
22
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
23
+ }) : function(o, v) {
24
+ o["default"] = v;
25
+ });
26
+ var __importStar = (this && this.__importStar) || (function () {
27
+ var ownKeys = function(o) {
28
+ ownKeys = Object.getOwnPropertyNames || function (o) {
29
+ var ar = [];
30
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
31
+ return ar;
32
+ };
33
+ return ownKeys(o);
34
+ };
35
+ return function (mod) {
36
+ if (mod && mod.__esModule) return mod;
37
+ var result = {};
38
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
39
+ __setModuleDefault(result, mod);
40
+ return result;
41
+ };
42
+ })();
43
+ Object.defineProperty(exports, "__esModule", { value: true });
44
+ exports.GmailChannel = void 0;
45
+ const base_1 = require("../base");
46
+ const fs_1 = require("fs");
47
+ const path_1 = require("path");
48
+ const paths_1 = require("../../paths");
49
+ class GmailChannel extends base_1.Channel {
50
+ tokens = null;
51
+ tokenPath;
52
+ pollTimer = null;
53
+ lastHistoryId = null;
54
+ processedIds = new Set();
55
+ constructor(name, config) {
56
+ super(name, config);
57
+ this.tokenPath = (0, path_1.join)(paths_1.DEFAULT_AUTH_DIR, `gmail-${name}.json`);
58
+ }
59
+ get cfg() {
60
+ return this.config;
61
+ }
62
+ async connect() {
63
+ // Load saved tokens
64
+ if ((0, fs_1.existsSync)(this.tokenPath)) {
65
+ this.tokens = JSON.parse((0, fs_1.readFileSync)(this.tokenPath, 'utf-8'));
66
+ }
67
+ if (!this.tokens?.refresh_token) {
68
+ // Need OAuth flow
69
+ await this.startOAuthFlow();
70
+ }
71
+ else {
72
+ // Refresh access token
73
+ await this.refreshAccessToken();
74
+ }
75
+ // Get initial history ID
76
+ const profile = await this.gmailApi('GET', '/users/me/profile');
77
+ this.lastHistoryId = profile.historyId;
78
+ // Start polling
79
+ const interval = (this.cfg.poll_interval || 30) * 1000;
80
+ console.log(`✅ Gmail connected: ${this.name} (polling every ${interval / 1000}s)`);
81
+ // Poll immediately once, then on interval
82
+ this.poll();
83
+ this.pollTimer = setInterval(() => this.poll(), interval);
84
+ }
85
+ async disconnect() {
86
+ if (this.pollTimer) {
87
+ clearInterval(this.pollTimer);
88
+ this.pollTimer = null;
89
+ }
90
+ }
91
+ async send(to, response) {
92
+ if (!this.tokens)
93
+ return;
94
+ await this.ensureValidToken();
95
+ const subject = response.email?.subject || '';
96
+ const body = response.email?.html || response.text || '';
97
+ const isHtml = !!response.email?.html;
98
+ // Build RFC 2822 message
99
+ const headers = [
100
+ `To: ${to}`,
101
+ `Subject: ${subject}`,
102
+ `MIME-Version: 1.0`,
103
+ `Content-Type: ${isHtml ? 'text/html' : 'text/plain'}; charset=utf-8`,
104
+ ].join('\r\n');
105
+ const raw = Buffer.from(`${headers}\r\n\r\n${body}`).toString('base64url');
106
+ await this.gmailApi('POST', '/users/me/messages/send', { raw });
107
+ }
108
+ /**
109
+ * Send a reply to a specific thread
110
+ */
111
+ async sendReply(to, response, threadId, inReplyTo) {
112
+ if (!this.tokens)
113
+ return;
114
+ await this.ensureValidToken();
115
+ const subject = response.email?.subject || '';
116
+ const body = response.email?.html || response.text || '';
117
+ const isHtml = !!response.email?.html;
118
+ const headers = [
119
+ `To: ${to}`,
120
+ `Subject: ${subject}`,
121
+ `MIME-Version: 1.0`,
122
+ `Content-Type: ${isHtml ? 'text/html' : 'text/plain'}; charset=utf-8`,
123
+ ...(inReplyTo ? [`In-Reply-To: ${inReplyTo}`, `References: ${inReplyTo}`] : []),
124
+ ].join('\r\n');
125
+ const raw = Buffer.from(`${headers}\r\n\r\n${body}`).toString('base64url');
126
+ await this.gmailApi('POST', '/users/me/messages/send', { raw, threadId });
127
+ }
128
+ // --- OAuth Flow ---
129
+ async startOAuthFlow() {
130
+ const http = await Promise.resolve().then(() => __importStar(require('http')));
131
+ const { exec: execCmd } = await Promise.resolve().then(() => __importStar(require('child_process')));
132
+ // Start a temporary HTTP server on a random port to receive the OAuth callback
133
+ const { code, redirectUri } = await new Promise((resolve, reject) => {
134
+ const server = http.createServer((req, res) => {
135
+ const url = new URL(req.url || '/', `http://localhost`);
136
+ const authCode = url.searchParams.get('code');
137
+ const error = url.searchParams.get('error');
138
+ if (error) {
139
+ res.writeHead(200, { 'Content-Type': 'text/html' });
140
+ res.end('<html><body><h2>❌ Authorization failed</h2><p>You can close this tab.</p></body></html>');
141
+ server.close();
142
+ reject(new Error(`OAuth error: ${error}`));
143
+ return;
144
+ }
145
+ if (authCode) {
146
+ res.writeHead(200, { 'Content-Type': 'text/html' });
147
+ res.end('<html><body><h2>✅ Authorization successful!</h2><p>You can close this tab and return to the terminal.</p></body></html>');
148
+ server.close();
149
+ resolve({ code: authCode, redirectUri: localRedirectUri });
150
+ }
151
+ else {
152
+ res.writeHead(400, { 'Content-Type': 'text/plain' });
153
+ res.end('Missing code parameter');
154
+ }
155
+ });
156
+ let localRedirectUri = '';
157
+ server.listen(0, '127.0.0.1', () => {
158
+ const addr = server.address();
159
+ localRedirectUri = `http://localhost:${addr.port}`;
160
+ const authUrl = `https://accounts.google.com/o/oauth2/v2/auth?` +
161
+ `client_id=${encodeURIComponent(this.cfg.client_id)}` +
162
+ `&redirect_uri=${encodeURIComponent(localRedirectUri)}` +
163
+ `&response_type=code` +
164
+ `&scope=${encodeURIComponent('https://www.googleapis.com/auth/gmail.modify')}` +
165
+ `&access_type=offline` +
166
+ `&prompt=consent`;
167
+ console.log(`\n 📧 Gmail OAuth required for channel "${this.name}"`);
168
+ console.log(`\n Opening browser for authorization...\n`);
169
+ // Try to open browser automatically
170
+ execCmd(`open "${authUrl}" 2>/dev/null || xdg-open "${authUrl}" 2>/dev/null`, (err) => {
171
+ if (err) {
172
+ console.log(` Could not open browser automatically. Open this URL:\n`);
173
+ console.log(` ${authUrl}\n`);
174
+ }
175
+ });
176
+ // Timeout after 2 minutes
177
+ setTimeout(() => {
178
+ server.close();
179
+ reject(new Error('OAuth timeout — no callback received within 2 minutes'));
180
+ }, 120000);
181
+ });
182
+ });
183
+ // Exchange code for tokens
184
+ const res = await fetch('https://oauth2.googleapis.com/token', {
185
+ method: 'POST',
186
+ headers: { 'Content-Type': 'application/x-www-form-urlencoded' },
187
+ body: new URLSearchParams({
188
+ code,
189
+ client_id: this.cfg.client_id,
190
+ client_secret: this.cfg.client_secret,
191
+ redirect_uri: redirectUri,
192
+ grant_type: 'authorization_code',
193
+ }),
194
+ });
195
+ if (!res.ok) {
196
+ const err = await res.text();
197
+ throw new Error(`Gmail OAuth failed: ${err}`);
198
+ }
199
+ const data = await res.json();
200
+ this.tokens = {
201
+ access_token: data.access_token,
202
+ refresh_token: data.refresh_token,
203
+ expiry: Date.now() + (data.expires_in * 1000),
204
+ };
205
+ this.saveTokens();
206
+ console.log(` ✅ Gmail authenticated successfully!\n`);
207
+ }
208
+ async refreshAccessToken() {
209
+ if (!this.tokens?.refresh_token)
210
+ throw new Error('No refresh token');
211
+ const res = await fetch('https://oauth2.googleapis.com/token', {
212
+ method: 'POST',
213
+ headers: { 'Content-Type': 'application/x-www-form-urlencoded' },
214
+ body: new URLSearchParams({
215
+ refresh_token: this.tokens.refresh_token,
216
+ client_id: this.cfg.client_id,
217
+ client_secret: this.cfg.client_secret,
218
+ grant_type: 'refresh_token',
219
+ }),
220
+ });
221
+ if (!res.ok) {
222
+ const err = await res.text();
223
+ throw new Error(`Gmail token refresh failed: ${err}`);
224
+ }
225
+ const data = await res.json();
226
+ this.tokens.access_token = data.access_token;
227
+ this.tokens.expiry = Date.now() + (data.expires_in * 1000);
228
+ this.saveTokens();
229
+ }
230
+ async ensureValidToken() {
231
+ if (!this.tokens)
232
+ throw new Error('Not authenticated');
233
+ if (Date.now() > this.tokens.expiry - 60000) {
234
+ await this.refreshAccessToken();
235
+ }
236
+ }
237
+ saveTokens() {
238
+ const dir = (0, path_1.dirname)(this.tokenPath);
239
+ if (!(0, fs_1.existsSync)(dir))
240
+ (0, fs_1.mkdirSync)(dir, { recursive: true });
241
+ (0, fs_1.writeFileSync)(this.tokenPath, JSON.stringify(this.tokens, null, 2));
242
+ }
243
+ // --- Gmail API ---
244
+ async gmailApi(method, path, body) {
245
+ await this.ensureValidToken();
246
+ const res = await fetch(`https://gmail.googleapis.com/gmail/v1${path}`, {
247
+ method,
248
+ headers: {
249
+ 'Authorization': `Bearer ${this.tokens.access_token}`,
250
+ ...(body ? { 'Content-Type': 'application/json' } : {}),
251
+ },
252
+ ...(body ? { body: JSON.stringify(body) } : {}),
253
+ });
254
+ if (!res.ok) {
255
+ const err = await res.text();
256
+ throw new Error(`Gmail API ${method} ${path}: ${res.status} ${err}`);
257
+ }
258
+ return res.json();
259
+ }
260
+ // --- Polling ---
261
+ async poll() {
262
+ try {
263
+ await this.ensureValidToken();
264
+ // List new messages
265
+ const labels = this.cfg.labels || ['INBOX'];
266
+ const labelQuery = labels.map(l => `label:${l}`).join(' OR ');
267
+ const query = `is:unread ${labelQuery}`;
268
+ const list = await this.gmailApi('GET', `/users/me/messages?q=${encodeURIComponent(query)}&maxResults=10`);
269
+ if (!list.messages || list.messages.length === 0)
270
+ return;
271
+ for (const { id } of list.messages) {
272
+ if (this.processedIds.has(id))
273
+ continue;
274
+ this.processedIds.add(id);
275
+ // Keep processed set bounded
276
+ if (this.processedIds.size > 1000) {
277
+ const arr = [...this.processedIds];
278
+ this.processedIds = new Set(arr.slice(-500));
279
+ }
280
+ const msg = await this.gmailApi('GET', `/users/me/messages/${id}?format=full`);
281
+ const unified = this.toUnified(msg);
282
+ if (unified) {
283
+ this.emitMessage(unified);
284
+ // Mark as read
285
+ await this.gmailApi('POST', `/users/me/messages/${id}/modify`, {
286
+ removeLabelIds: ['UNREAD'],
287
+ });
288
+ }
289
+ }
290
+ }
291
+ catch (err) {
292
+ console.error(`[gmail:${this.name}] Poll error:`, err);
293
+ }
294
+ }
295
+ toUnified(msg) {
296
+ const headers = msg.payload?.headers || [];
297
+ const getHeader = (name) => headers.find((h) => h.name.toLowerCase() === name.toLowerCase())?.value;
298
+ const from = getHeader('From') || '';
299
+ const subject = getHeader('Subject') || '';
300
+ const to = getHeader('To') || '';
301
+ const cc = getHeader('Cc')?.split(',').map((s) => s.trim()) || [];
302
+ const messageId = getHeader('Message-ID') || '';
303
+ // Extract body
304
+ let textBody = '';
305
+ let htmlBody = '';
306
+ this.extractBody(msg.payload, (text, html) => {
307
+ if (text)
308
+ textBody = text;
309
+ if (html)
310
+ htmlBody = html;
311
+ });
312
+ // Extract sender email
313
+ const emailMatch = from.match(/<(.+?)>/) || [null, from];
314
+ const senderEmail = emailMatch[1] || from;
315
+ const senderName = from.replace(/<.+?>/, '').trim().replace(/^"|"$/g, '');
316
+ return {
317
+ id: msg.id,
318
+ channel: 'email',
319
+ from: senderEmail,
320
+ type: 'email',
321
+ text: textBody || subject,
322
+ timestamp: Math.floor(parseInt(msg.internalDate) / 1000),
323
+ senderName: senderName || undefined,
324
+ email: {
325
+ subject,
326
+ html: htmlBody || undefined,
327
+ to,
328
+ cc: cc.length > 0 ? cc : undefined,
329
+ threadId: msg.threadId,
330
+ messageId,
331
+ },
332
+ };
333
+ }
334
+ extractBody(part, cb) {
335
+ if (!part)
336
+ return;
337
+ if (part.mimeType === 'text/plain' && part.body?.data) {
338
+ cb(Buffer.from(part.body.data, 'base64url').toString('utf-8'));
339
+ }
340
+ if (part.mimeType === 'text/html' && part.body?.data) {
341
+ cb(undefined, Buffer.from(part.body.data, 'base64url').toString('utf-8'));
342
+ }
343
+ if (part.parts) {
344
+ for (const subpart of part.parts) {
345
+ this.extractBody(subpart, cb);
346
+ }
347
+ }
348
+ }
349
+ }
350
+ exports.GmailChannel = GmailChannel;
351
+ //# sourceMappingURL=gmail.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"gmail.js","sourceRoot":"","sources":["../../../src/channels/email/gmail.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ export { GmailChannel } from './gmail';
2
+ export { ResendChannel } from './resend';
3
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/channels/email/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AACvC,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC"}
@@ -0,0 +1,8 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.ResendChannel = exports.GmailChannel = void 0;
4
+ var gmail_1 = require("./gmail");
5
+ Object.defineProperty(exports, "GmailChannel", { enumerable: true, get: function () { return gmail_1.GmailChannel; } });
6
+ var resend_1 = require("./resend");
7
+ Object.defineProperty(exports, "ResendChannel", { enumerable: true, get: function () { return resend_1.ResendChannel; } });
8
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/channels/email/index.ts"],"names":[],"mappings":";;;AAAA,iCAAuC;AAA9B,qGAAA,YAAY,OAAA;AACrB,mCAAyC;AAAhC,uGAAA,aAAa,OAAA"}
@@ -0,0 +1,29 @@
1
+ /**
2
+ * Resend Channel — API send + inbound webhook
3
+ *
4
+ * Inbound: Resend forwards incoming emails to a webhook endpoint on ChannelKit
5
+ * Outbound: Sends via Resend API
6
+ *
7
+ * Requires: public URL for inbound webhook, Resend API key, verified domain
8
+ */
9
+ import { Channel } from '../base';
10
+ import { ResendChannelConfig } from '../../config/types';
11
+ import { WebhookResponse } from '../../core/types';
12
+ export declare class ResendChannel extends Channel {
13
+ private pollTimer;
14
+ private lastSeenId;
15
+ constructor(name: string, config: ResendChannelConfig);
16
+ private get cfg();
17
+ connect(): Promise<void>;
18
+ disconnect(): Promise<void>;
19
+ send(to: string, response: WebhookResponse): Promise<void>;
20
+ /**
21
+ * Handle inbound webhook from Resend.
22
+ * Called by ApiServer when POST /inbound/resend/<channelName> is hit.
23
+ */
24
+ handleInbound(payload: any): void;
25
+ private poll;
26
+ private fetchEmail;
27
+ private toUnified;
28
+ }
29
+ //# sourceMappingURL=resend.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"resend.d.ts","sourceRoot":"","sources":["../../../src/channels/email/resend.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,SAAS,CAAC;AAClC,OAAO,EAAE,mBAAmB,EAAE,MAAM,oBAAoB,CAAC;AACzD,OAAO,EAAkB,eAAe,EAAE,MAAM,kBAAkB,CAAC;AAEnE,qBAAa,aAAc,SAAQ,OAAO;IACxC,OAAO,CAAC,SAAS,CAA+C;IAChE,OAAO,CAAC,UAAU,CAAuB;gBAE7B,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,mBAAmB;IAIrD,OAAO,KAAK,GAAG,GAEd;IAEK,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC;IAexB,UAAU,IAAI,OAAO,CAAC,IAAI,CAAC;IAO3B,IAAI,CAAC,EAAE,EAAE,MAAM,EAAE,QAAQ,EAAE,eAAe,GAAG,OAAO,CAAC,IAAI,CAAC;IA+BhE;;;OAGG;IACH,aAAa,CAAC,OAAO,EAAE,GAAG,GAAG,IAAI;YAWnB,IAAI;YAoCJ,UAAU;IAQxB,OAAO,CAAC,SAAS;CA+BlB"}
@@ -0,0 +1,155 @@
1
+ "use strict";
2
+ /**
3
+ * Resend Channel — API send + inbound webhook
4
+ *
5
+ * Inbound: Resend forwards incoming emails to a webhook endpoint on ChannelKit
6
+ * Outbound: Sends via Resend API
7
+ *
8
+ * Requires: public URL for inbound webhook, Resend API key, verified domain
9
+ */
10
+ Object.defineProperty(exports, "__esModule", { value: true });
11
+ exports.ResendChannel = void 0;
12
+ const base_1 = require("../base");
13
+ class ResendChannel extends base_1.Channel {
14
+ pollTimer = null;
15
+ lastSeenId = null;
16
+ constructor(name, config) {
17
+ super(name, config);
18
+ }
19
+ get cfg() {
20
+ return this.config;
21
+ }
22
+ async connect() {
23
+ console.log(`✅ Resend email connected: ${this.name} (from: ${this.cfg.from_email})`);
24
+ if (this.cfg.poll_interval) {
25
+ // Polling mode — no public URL needed
26
+ const interval = this.cfg.poll_interval * 1000;
27
+ console.log(` 📬 Polling for inbound emails every ${this.cfg.poll_interval}s`);
28
+ this.poll(); // initial poll
29
+ this.pollTimer = setInterval(() => this.poll(), interval);
30
+ }
31
+ else {
32
+ // Webhook mode
33
+ console.log(` 📬 Configure Resend inbound webhook to point to your ChannelKit API endpoint`);
34
+ }
35
+ }
36
+ async disconnect() {
37
+ if (this.pollTimer) {
38
+ clearInterval(this.pollTimer);
39
+ this.pollTimer = null;
40
+ }
41
+ }
42
+ async send(to, response) {
43
+ const subject = response.email?.subject || 'No Subject';
44
+ const html = response.email?.html || undefined;
45
+ const text = response.text || '';
46
+ const body = {
47
+ from: this.cfg.from_email,
48
+ to: [to],
49
+ subject,
50
+ };
51
+ if (html)
52
+ body.html = html;
53
+ else
54
+ body.text = text;
55
+ const res = await fetch('https://api.resend.com/emails', {
56
+ method: 'POST',
57
+ headers: {
58
+ 'Authorization': `Bearer ${this.cfg.api_key}`,
59
+ 'Content-Type': 'application/json',
60
+ },
61
+ body: JSON.stringify(body),
62
+ });
63
+ if (!res.ok) {
64
+ const err = await res.text();
65
+ throw new Error(`Resend send error: ${res.status} ${err}`);
66
+ }
67
+ const data = await res.json();
68
+ console.log(`[resend:${this.name}] Sent email to ${to}: ${data.id}`);
69
+ }
70
+ /**
71
+ * Handle inbound webhook from Resend.
72
+ * Called by ApiServer when POST /inbound/resend/<channelName> is hit.
73
+ */
74
+ handleInbound(payload) {
75
+ // Resend webhook events wrap email data under `data`
76
+ const emailData = payload.data || payload;
77
+ const unified = this.toUnified(emailData);
78
+ if (unified) {
79
+ this.emitMessage(unified);
80
+ }
81
+ }
82
+ // --- Polling ---
83
+ async poll() {
84
+ try {
85
+ const params = new URLSearchParams({ limit: '20' });
86
+ if (this.lastSeenId)
87
+ params.set('after', this.lastSeenId);
88
+ const res = await fetch(`https://api.resend.com/emails/received?${params}`, {
89
+ headers: { 'Authorization': `Bearer ${this.cfg.api_key}` },
90
+ });
91
+ if (!res.ok) {
92
+ const err = await res.text();
93
+ console.error(`[resend:${this.name}] Poll error: ${res.status} ${err}`);
94
+ return;
95
+ }
96
+ const data = await res.json();
97
+ const emails = data.data || [];
98
+ if (emails.length === 0)
99
+ return;
100
+ // Process from oldest to newest
101
+ for (const email of emails.reverse()) {
102
+ this.lastSeenId = email.id;
103
+ // Fetch full email content
104
+ const detail = await this.fetchEmail(email.id);
105
+ if (detail) {
106
+ const unified = this.toUnified(detail);
107
+ if (unified)
108
+ this.emitMessage(unified);
109
+ }
110
+ }
111
+ }
112
+ catch (err) {
113
+ console.error(`[resend:${this.name}] Poll error:`, err);
114
+ }
115
+ }
116
+ async fetchEmail(id) {
117
+ const res = await fetch(`https://api.resend.com/emails/received/${id}`, {
118
+ headers: { 'Authorization': `Bearer ${this.cfg.api_key}` },
119
+ });
120
+ if (!res.ok)
121
+ return null;
122
+ return res.json();
123
+ }
124
+ toUnified(payload) {
125
+ // Resend inbound webhook payload
126
+ const from = payload.from || '';
127
+ const subject = payload.subject || '';
128
+ const text = payload.text || payload.plain || '';
129
+ const html = payload.html || '';
130
+ const to = payload.to || '';
131
+ const cc = payload.cc ? (Array.isArray(payload.cc) ? payload.cc : [payload.cc]) : undefined;
132
+ // Extract sender email
133
+ const emailMatch = from.match(/<(.+?)>/);
134
+ const senderEmail = emailMatch ? emailMatch[1] : from;
135
+ const senderName = from.replace(/<.+?>/, '').trim().replace(/^"|"$/g, '') || undefined;
136
+ return {
137
+ id: payload.id || `resend-${Date.now()}`,
138
+ channel: 'email',
139
+ from: senderEmail,
140
+ type: 'email',
141
+ text: text || subject,
142
+ timestamp: Math.floor(Date.now() / 1000),
143
+ senderName,
144
+ email: {
145
+ subject,
146
+ html: html || undefined,
147
+ to: Array.isArray(to) ? to.join(', ') : to,
148
+ cc,
149
+ messageId: payload.message_id,
150
+ },
151
+ };
152
+ }
153
+ }
154
+ exports.ResendChannel = ResendChannel;
155
+ //# sourceMappingURL=resend.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"resend.js","sourceRoot":"","sources":["../../../src/channels/email/resend.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,21 @@
1
+ import { Channel } from '../base';
2
+ import { EndpointChannelConfig } from '../../config/types';
3
+ import { UnifiedMessage, WebhookResponse } from '../../core/types';
4
+ export declare class EndpointChannel extends Channel {
5
+ private pendingResponses;
6
+ constructor(name: string, config: EndpointChannelConfig);
7
+ get cfg(): EndpointChannelConfig;
8
+ connect(): Promise<void>;
9
+ disconnect(): Promise<void>;
10
+ send(to: string, response: WebhookResponse): Promise<void>;
11
+ /**
12
+ * Called by the inbound route handler.
13
+ * Creates a UnifiedMessage, emits it, and optionally returns a promise
14
+ * that resolves when the pipeline calls send() (sync mode).
15
+ */
16
+ handleRequest(body: any, query: Record<string, string>, headers: Record<string, string>, method: string): {
17
+ message: UnifiedMessage;
18
+ waitForResponse?: Promise<WebhookResponse>;
19
+ };
20
+ }
21
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/channels/endpoint/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,OAAO,EAAE,MAAM,SAAS,CAAC;AAClC,OAAO,EAAE,qBAAqB,EAAE,MAAM,oBAAoB,CAAC;AAC3D,OAAO,EAAE,cAAc,EAAE,eAAe,EAAE,MAAM,kBAAkB,CAAC;AAOnE,qBAAa,eAAgB,SAAQ,OAAO;IAC1C,OAAO,CAAC,gBAAgB,CAA2C;gBAEvD,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,qBAAqB;IAIvD,IAAI,GAAG,IAAI,qBAAqB,CAE/B;IAEK,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC;IAMxB,UAAU,IAAI,OAAO,CAAC,IAAI,CAAC;IAQ3B,IAAI,CAAC,EAAE,EAAE,MAAM,EAAE,QAAQ,EAAE,eAAe,GAAG,OAAO,CAAC,IAAI,CAAC;IAShE;;;;OAIG;IACH,aAAa,CACX,IAAI,EAAE,GAAG,EACT,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,EAC7B,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,EAC/B,MAAM,EAAE,MAAM,GACb;QAAE,OAAO,EAAE,cAAc,CAAC;QAAC,eAAe,CAAC,EAAE,OAAO,CAAC,eAAe,CAAC,CAAA;KAAE;CA4C3E"}