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,142 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.Logger = void 0;
7
+ const better_sqlite3_1 = __importDefault(require("better-sqlite3"));
8
+ const fs_1 = require("fs");
9
+ const path_1 = require("path");
10
+ const events_1 = require("events");
11
+ const paths_1 = require("../paths");
12
+ const RETENTION_DAYS = 30;
13
+ class Logger extends events_1.EventEmitter {
14
+ db;
15
+ constructor(dataDir = paths_1.DEFAULT_DATA_DIR) {
16
+ super();
17
+ const dbPath = (0, path_1.join)(dataDir, 'logs.db');
18
+ const dir = (0, path_1.dirname)(dbPath);
19
+ if (!(0, fs_1.existsSync)(dir))
20
+ (0, fs_1.mkdirSync)(dir, { recursive: true });
21
+ this.db = new better_sqlite3_1.default(dbPath);
22
+ this.db.pragma('journal_mode = WAL');
23
+ this.init();
24
+ this.cleanup();
25
+ }
26
+ init() {
27
+ this.db.exec(`
28
+ CREATE TABLE IF NOT EXISTS logs (
29
+ id TEXT PRIMARY KEY,
30
+ timestamp INTEGER NOT NULL,
31
+ channel TEXT NOT NULL,
32
+ from_jid TEXT NOT NULL,
33
+ sender_name TEXT,
34
+ text TEXT,
35
+ type TEXT NOT NULL,
36
+ group_id TEXT,
37
+ group_name TEXT,
38
+ webhook_url TEXT,
39
+ response_text TEXT,
40
+ status TEXT NOT NULL,
41
+ latency_ms INTEGER,
42
+ stt_transcription TEXT,
43
+ tts_generated INTEGER,
44
+ created_at INTEGER DEFAULT (unixepoch())
45
+ );
46
+ CREATE INDEX IF NOT EXISTS idx_logs_timestamp ON logs(timestamp);
47
+ CREATE INDEX IF NOT EXISTS idx_logs_channel ON logs(channel);
48
+ `);
49
+ // Migration: add columns if they don't exist (for existing databases)
50
+ try {
51
+ this.db.exec('ALTER TABLE logs ADD COLUMN stt_transcription TEXT');
52
+ }
53
+ catch { }
54
+ try {
55
+ this.db.exec('ALTER TABLE logs ADD COLUMN tts_generated INTEGER');
56
+ }
57
+ catch { }
58
+ try {
59
+ this.db.exec('ALTER TABLE logs ADD COLUMN format_applied INTEGER');
60
+ }
61
+ catch { }
62
+ try {
63
+ this.db.exec('ALTER TABLE logs ADD COLUMN format_original_text TEXT');
64
+ }
65
+ catch { }
66
+ }
67
+ cleanup() {
68
+ const cutoff = Math.floor(Date.now() / 1000) - (RETENTION_DAYS * 86400);
69
+ const result = this.db.prepare('DELETE FROM logs WHERE timestamp < ?').run(cutoff);
70
+ if (result.changes > 0) {
71
+ console.log(`[logger] Cleaned up ${result.changes} log entries older than ${RETENTION_DAYS} days`);
72
+ }
73
+ }
74
+ log(entry) {
75
+ this.db.prepare(`
76
+ INSERT OR REPLACE INTO logs (id, timestamp, channel, from_jid, sender_name, text, type, group_id, group_name, webhook_url, response_text, status, latency_ms, stt_transcription, tts_generated, format_applied, format_original_text)
77
+ VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
78
+ `).run(entry.id, entry.timestamp, entry.channel, entry.from, entry.senderName || null, entry.text || null, entry.type, entry.groupId || null, entry.groupName || null, entry.route || null, entry.responseText || null, entry.status, entry.latency ?? null, entry.sttTranscription || null, entry.ttsGenerated ? 1 : null, entry.formatApplied ? 1 : null, entry.formatOriginalText || null);
79
+ this.emit('entry', entry);
80
+ }
81
+ clear() {
82
+ this.db.prepare('DELETE FROM logs').run();
83
+ }
84
+ getAll() {
85
+ return this.db.prepare('SELECT * FROM logs ORDER BY timestamp DESC LIMIT 1000').all().map(this.rowToEntry);
86
+ }
87
+ search(query) {
88
+ const conditions = [];
89
+ const params = [];
90
+ if (query.channel) {
91
+ conditions.push('channel = ?');
92
+ params.push(query.channel);
93
+ }
94
+ if (query.search) {
95
+ conditions.push('(text LIKE ? OR from_jid LIKE ? OR sender_name LIKE ? OR response_text LIKE ?)');
96
+ const q = `%${query.search}%`;
97
+ params.push(q, q, q, q);
98
+ }
99
+ const where = conditions.length > 0 ? `WHERE ${conditions.join(' AND ')}` : '';
100
+ const limit = query.limit || 100;
101
+ return this.db.prepare(`SELECT * FROM logs ${where} ORDER BY timestamp DESC LIMIT ?`).all(...params, limit).map(this.rowToEntry);
102
+ }
103
+ getStats() {
104
+ const total = this.db.prepare('SELECT COUNT(*) as count FROM logs').get().count;
105
+ const channels = this.db.prepare('SELECT channel, COUNT(*) as count FROM logs GROUP BY channel').all();
106
+ const byChannel = {};
107
+ for (const row of channels) {
108
+ byChannel[row.channel] = row.count;
109
+ }
110
+ const avg = this.db.prepare('SELECT AVG(latency_ms) as avg FROM logs WHERE latency_ms IS NOT NULL').get().avg;
111
+ const errorCount = this.db.prepare("SELECT COUNT(*) as count FROM logs WHERE status = 'error'").get().count;
112
+ return {
113
+ total,
114
+ byChannel,
115
+ avgLatency: Math.round(avg || 0),
116
+ errorCount,
117
+ };
118
+ }
119
+ rowToEntry(row) {
120
+ return {
121
+ id: row.id,
122
+ timestamp: row.timestamp,
123
+ channel: row.channel,
124
+ from: row.from_jid,
125
+ senderName: row.sender_name || undefined,
126
+ text: row.text || undefined,
127
+ type: row.type,
128
+ groupId: row.group_id || undefined,
129
+ groupName: row.group_name || undefined,
130
+ route: row.webhook_url || undefined,
131
+ responseText: row.response_text || undefined,
132
+ status: row.status,
133
+ latency: row.latency_ms ?? undefined,
134
+ sttTranscription: row.stt_transcription || undefined,
135
+ ttsGenerated: row.tts_generated ? true : undefined,
136
+ formatApplied: row.format_applied ? true : undefined,
137
+ formatOriginalText: row.format_original_text || undefined,
138
+ };
139
+ }
140
+ }
141
+ exports.Logger = Logger;
142
+ //# sourceMappingURL=logger.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"logger.js","sourceRoot":"","sources":["../../src/core/logger.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,15 @@
1
+ import { Channel } from '../channels/base';
2
+ import { Logger } from './logger';
3
+ import { Router } from './router';
4
+ import { Onboarding } from '../onboarding';
5
+ import { ApiServer } from '../api/server';
6
+ import { AppConfig } from '../config/types';
7
+ export interface MessageHandlerDeps {
8
+ router: Router;
9
+ apiServer: ApiServer;
10
+ logger: Logger;
11
+ onboarding?: Onboarding;
12
+ config: AppConfig;
13
+ }
14
+ export declare function wireMessageHandler(channel: Channel, deps: MessageHandlerDeps): void;
15
+ //# sourceMappingURL=messageHandler.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"messageHandler.d.ts","sourceRoot":"","sources":["../../src/core/messageHandler.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,kBAAkB,CAAC;AAG3C,OAAO,EAAE,MAAM,EAAE,MAAM,UAAU,CAAC;AAClC,OAAO,EAAE,MAAM,EAAE,MAAM,UAAU,CAAC;AAClC,OAAO,EAAE,UAAU,EAAE,MAAM,eAAe,CAAC;AAC3C,OAAO,EAAE,SAAS,EAAE,MAAM,eAAe,CAAC;AAE1C,OAAO,EAAE,SAAS,EAAiB,MAAM,iBAAiB,CAAC;AAiC3D,MAAM,WAAW,kBAAkB;IACjC,MAAM,EAAE,MAAM,CAAC;IACf,SAAS,EAAE,SAAS,CAAC;IACrB,MAAM,EAAE,MAAM,CAAC;IACf,UAAU,CAAC,EAAE,UAAU,CAAC;IACxB,MAAM,EAAE,SAAS,CAAC;CACnB;AAED,wBAAgB,kBAAkB,CAAC,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,kBAAkB,GAAG,IAAI,CA6PnF"}
@@ -0,0 +1,309 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || (function () {
19
+ var ownKeys = function(o) {
20
+ ownKeys = Object.getOwnPropertyNames || function (o) {
21
+ var ar = [];
22
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
23
+ return ar;
24
+ };
25
+ return ownKeys(o);
26
+ };
27
+ return function (mod) {
28
+ if (mod && mod.__esModule) return mod;
29
+ var result = {};
30
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
31
+ __setModuleDefault(result, mod);
32
+ return result;
33
+ };
34
+ })();
35
+ Object.defineProperty(exports, "__esModule", { value: true });
36
+ exports.wireMessageHandler = wireMessageHandler;
37
+ const voice_1 = require("../channels/voice");
38
+ const processor_1 = require("../media/processor");
39
+ /** Normalize a sender identifier by stripping non-digit characters (for phone numbers). */
40
+ function normalizeSender(sender) {
41
+ return sender.replace(/[^0-9]/g, '');
42
+ }
43
+ /** Check if a sender is allowed by an allow list. Returns true if no list or list is empty. */
44
+ function isAllowed(sender, allowList) {
45
+ if (!allowList || allowList.length === 0)
46
+ return true;
47
+ const normalized = normalizeSender(sender);
48
+ return allowList.some(entry => normalizeSender(entry) === normalized);
49
+ }
50
+ /**
51
+ * Check if a sender can interact with this channel at all (pre-routing).
52
+ * Allowed if: channel has no allow list, OR channel allows them,
53
+ * OR any service on this channel explicitly allows them (service overrides channel).
54
+ */
55
+ function isAllowedForChannel(sender, channelAllowList, servicesOnChannel) {
56
+ if (!channelAllowList || channelAllowList.length === 0)
57
+ return true;
58
+ if (isAllowed(sender, channelAllowList))
59
+ return true;
60
+ // Service allow lists override channel — if any service allows this sender, let them through
61
+ for (const svc of servicesOnChannel) {
62
+ if (svc.allow_list && svc.allow_list.length > 0 && isAllowed(sender, svc.allow_list))
63
+ return true;
64
+ }
65
+ return false;
66
+ }
67
+ function wireMessageHandler(channel, deps) {
68
+ const { router, apiServer, logger, onboarding, config } = deps;
69
+ channel.on('message', async (message) => {
70
+ message.channelName = channel.name;
71
+ // Check if sender can interact with this channel at all.
72
+ // A service-level allow list overrides the channel restriction,
73
+ // so we also check service allow lists before blocking.
74
+ const channelAllowList = config.channels[channel.name]?.allow_list;
75
+ const servicesOnChannel = router.getServicesForChannel(channel.name);
76
+ if (!isAllowedForChannel(message.from, channelAllowList, servicesOnChannel)) {
77
+ logger.log({
78
+ id: message.id,
79
+ timestamp: Date.now(),
80
+ channel: message.channel,
81
+ from: message.from,
82
+ senderName: message.senderName,
83
+ text: message.text,
84
+ type: message.type,
85
+ route: 'blocked',
86
+ status: 'blocked',
87
+ latency: 0,
88
+ });
89
+ return;
90
+ }
91
+ // Try onboarding first for DMs (only in groups mode)
92
+ const mode = router.getChannelMode(channel.name);
93
+ if (onboarding && !message.groupId && mode === 'groups' && !message._resolvedWebhook) {
94
+ const channelUnmatched = config.channels[channel.name]?.unmatched;
95
+ const handled = await onboarding.handleDirectMessage(message, channelUnmatched);
96
+ if (handled) {
97
+ logger.log({
98
+ id: message.id,
99
+ timestamp: Date.now(),
100
+ channel: message.channel,
101
+ from: message.from,
102
+ senderName: message.senderName,
103
+ text: message.text,
104
+ type: message.type,
105
+ route: 'onboarding',
106
+ status: 'success',
107
+ latency: 0,
108
+ });
109
+ return;
110
+ }
111
+ // Check if Telegram user has a service mapping
112
+ if (message.channel === 'telegram') {
113
+ const webhook = onboarding.getTelegramServiceWebhook(message.from);
114
+ if (webhook) {
115
+ const replyTo = message.from;
116
+ const replyUrl = apiServer.getReplyUrl(message.channel, replyTo);
117
+ const { dispatchWebhook } = await Promise.resolve().then(() => __importStar(require('./webhook')));
118
+ const startTime = Date.now();
119
+ const { response, error: webhookError } = await dispatchWebhook(webhook, message, replyUrl);
120
+ const latency = Date.now() - startTime;
121
+ let responseText = response?.text;
122
+ if (webhookError) {
123
+ const detail = webhookError.status
124
+ ? `[Webhook error ${webhookError.status}: ${webhookError.message}]`
125
+ : `[Webhook error: ${webhookError.message}]`;
126
+ responseText = responseText ? `${responseText}\n${detail}` : detail;
127
+ }
128
+ logger.log({
129
+ id: message.id,
130
+ timestamp: Date.now(),
131
+ channel: message.channel,
132
+ from: message.from,
133
+ senderName: message.senderName,
134
+ text: message.text,
135
+ type: message.type,
136
+ route: webhook,
137
+ responseText,
138
+ status: response ? 'success' : 'error',
139
+ latency,
140
+ });
141
+ if (response) {
142
+ await channel.send(replyTo, response);
143
+ }
144
+ return;
145
+ }
146
+ }
147
+ }
148
+ // For group messages where `from` isn't a standard user JID (e.g. group JID or LID),
149
+ // resolve to the actual user stored during onboarding
150
+ if (message.groupId && !message.from.endsWith('@s.whatsapp.net') && onboarding) {
151
+ const mapping = onboarding.getGroupStore().get(message.groupId);
152
+ if (mapping?.userId) {
153
+ message.from = mapping.userId;
154
+ }
155
+ }
156
+ // STT: transcribe audio if configured for this service
157
+ const serviceConfig = router.findServiceConfig(message);
158
+ // Check allow list: service allow list overrides channel allow list.
159
+ // If the service defines its own allow list, use it; otherwise fall back to channel's.
160
+ const effectiveAllowList = (serviceConfig?.allow_list && serviceConfig.allow_list.length > 0)
161
+ ? serviceConfig.allow_list
162
+ : channelAllowList;
163
+ if (!isAllowed(message.from, effectiveAllowList)) {
164
+ logger.log({
165
+ id: message.id,
166
+ timestamp: Date.now(),
167
+ channel: message.channel,
168
+ from: message.from,
169
+ senderName: message.senderName,
170
+ text: message.text,
171
+ type: message.type,
172
+ route: 'blocked',
173
+ status: 'blocked',
174
+ latency: 0,
175
+ });
176
+ return;
177
+ }
178
+ let sttTranscription;
179
+ let formatApplied;
180
+ let formatOriginalText;
181
+ if (serviceConfig) {
182
+ const originalText = message.text;
183
+ const inboundResult = await (0, processor_1.processInbound)(message, serviceConfig);
184
+ if (message.type === 'audio' && message.text && message.text !== originalText) {
185
+ sttTranscription = message.text;
186
+ }
187
+ formatApplied = inboundResult.formatApplied;
188
+ formatOriginalText = inboundResult.formatOriginalText;
189
+ // If formatting failed, cancel the request and log as format-error
190
+ if (inboundResult.formatError) {
191
+ logger.log({
192
+ id: message.id,
193
+ timestamp: Date.now(),
194
+ channel: message.channel,
195
+ from: message.from,
196
+ senderName: message.senderName,
197
+ text: message.text,
198
+ type: message.type,
199
+ groupId: message.groupId,
200
+ groupName: message.groupName,
201
+ responseText: `[Format error: ${inboundResult.formatError}]`,
202
+ status: 'format-error',
203
+ latency: 0,
204
+ sttTranscription,
205
+ });
206
+ return;
207
+ }
208
+ }
209
+ const replyTo = message.groupId || message.from;
210
+ const replyUrl = apiServer.getReplyUrl(message.channel, replyTo);
211
+ const { response: routedResponse, webhook: routedWebhook, latency, webhookError } = await router.route(message, replyUrl);
212
+ let response = routedResponse;
213
+ // If no service matched, check channel's unmatched policy
214
+ if (!response && !message.groupId) {
215
+ const channelCfg = config.channels[channel.name];
216
+ if (channelCfg?.unmatched === 'list') {
217
+ const svcs = router.getNamedServicesForChannel(channel.name);
218
+ if (svcs.length > 0) {
219
+ const lines = svcs.map(({ name, config: svc }) => {
220
+ if (svc.command) {
221
+ const cmd = svc.command.startsWith('/') ? svc.command : `/${svc.command}`;
222
+ return `• ${name} — use ${cmd}`;
223
+ }
224
+ if (svc.code)
225
+ return `• ${name} — send "${svc.code.toUpperCase()}" to connect`;
226
+ return `• ${name}`;
227
+ });
228
+ await channel.send(replyTo, { text: `Available services:\n${lines.join('\n')}` });
229
+ }
230
+ }
231
+ }
232
+ // TTS: convert text to speech when configured
233
+ let ttsGenerated = false;
234
+ let ttsError;
235
+ if (response && serviceConfig) {
236
+ const hadMedia = response.media;
237
+ const result = await (0, processor_1.processOutbound)(response, serviceConfig);
238
+ response = result.response;
239
+ ttsError = result.ttsError;
240
+ if (!hadMedia && response.media) {
241
+ ttsGenerated = true;
242
+ }
243
+ }
244
+ // For endpoint channels in sync mode: if no response, send an error so the HTTP request doesn't hang
245
+ if (!response && message.channel === 'endpoint') {
246
+ if (webhookError) {
247
+ const detail = webhookError.status
248
+ ? `Webhook ${routedWebhook} returned ${webhookError.status}: ${webhookError.message}`
249
+ : `Webhook ${routedWebhook} failed: ${webhookError.message}`;
250
+ response = { text: detail, _error: true };
251
+ }
252
+ else {
253
+ response = routedWebhook
254
+ ? { text: `Webhook ${routedWebhook} returned an empty response`, _error: true }
255
+ : { text: 'No service matched for this endpoint', _error: true };
256
+ }
257
+ }
258
+ // Send the response
259
+ let sendError;
260
+ if (response) {
261
+ if (message.channel === 'voice' && message._callSid && channel instanceof voice_1.TwilioVoiceChannel) {
262
+ channel.setCallResponse(message._callSid, response);
263
+ }
264
+ else {
265
+ try {
266
+ await channel.send(replyTo, response);
267
+ }
268
+ catch (sendErr) {
269
+ sendError = sendErr?.message || String(sendErr);
270
+ console.error(`[${channel.name}] Failed to send reply to ${replyTo}: ${sendError}`);
271
+ }
272
+ }
273
+ }
274
+ // Build response text for logging
275
+ let logResponseText = response?.text;
276
+ if (webhookError) {
277
+ const detail = webhookError.status
278
+ ? `[Webhook error ${webhookError.status}: ${webhookError.message}]`
279
+ : `[Webhook error: ${webhookError.message}]`;
280
+ logResponseText = logResponseText ? `${logResponseText}\n${detail}` : detail;
281
+ }
282
+ if (ttsError) {
283
+ logResponseText = `${logResponseText ? logResponseText + '\n' : ''}[TTS failed: ${ttsError}]`;
284
+ }
285
+ if (sendError) {
286
+ logResponseText = `${logResponseText ? logResponseText + '\n' : ''}[Delivery failed: ${sendError}]`;
287
+ }
288
+ logger.log({
289
+ id: message.id,
290
+ timestamp: Date.now(),
291
+ channel: message.channel,
292
+ from: message.from,
293
+ senderName: message.senderName,
294
+ text: message.text,
295
+ type: message.type,
296
+ groupId: message.groupId,
297
+ groupName: message.groupName,
298
+ route: routedWebhook,
299
+ responseText: logResponseText,
300
+ status: (sendError || ttsError || response?._error) ? 'error' : (!routedWebhook ? 'no-route' : (response ? 'success' : 'error')),
301
+ latency,
302
+ sttTranscription,
303
+ ttsGenerated: ttsGenerated || undefined,
304
+ formatApplied,
305
+ formatOriginalText,
306
+ });
307
+ });
308
+ }
309
+ //# sourceMappingURL=messageHandler.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"messageHandler.js","sourceRoot":"","sources":["../../src/core/messageHandler.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import { Channel } from '../channels/base';
2
+ export declare function restartProcess(channels: Map<string, Channel>): Promise<void>;
3
+ //# sourceMappingURL=restart.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"restart.d.ts","sourceRoot":"","sources":["../../src/core/restart.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,OAAO,EAAE,MAAM,kBAAkB,CAAC;AAE3C,wBAAsB,cAAc,CAAC,QAAQ,EAAE,GAAG,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC,CA0BlF"}
@@ -0,0 +1,35 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.restartProcess = restartProcess;
4
+ const child_process_1 = require("child_process");
5
+ const path_1 = require("path");
6
+ const fs_1 = require("fs");
7
+ async function restartProcess(channels) {
8
+ const argv1 = process.argv[1] || '';
9
+ const tsxBin = (0, path_1.join)(process.cwd(), 'node_modules', '.bin', 'tsx');
10
+ const tsxCmd = (0, fs_1.existsSync)(tsxBin) ? tsxBin : 'tsx';
11
+ let cmd;
12
+ let args;
13
+ if (argv1.endsWith('.ts')) {
14
+ cmd = tsxCmd;
15
+ args = process.argv.slice(1);
16
+ }
17
+ else if (argv1.includes('tsx')) {
18
+ cmd = tsxCmd;
19
+ args = process.argv.slice(2);
20
+ }
21
+ else {
22
+ cmd = process.execPath;
23
+ args = process.argv.slice(1);
24
+ }
25
+ await Promise.allSettled([...channels.values()].map(ch => ch.disconnect()));
26
+ const child = (0, child_process_1.spawn)(cmd, args, {
27
+ detached: true,
28
+ stdio: 'inherit',
29
+ env: process.env,
30
+ cwd: process.cwd(),
31
+ });
32
+ child.unref();
33
+ process.exit(0);
34
+ }
35
+ //# sourceMappingURL=restart.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"restart.js","sourceRoot":"","sources":["../../src/core/restart.ts"],"names":[],"mappings":";;AAKA,wCA0BC;AA/BD,iDAAsC;AACtC,+BAA4B;AAC5B,2BAAgC;AAGzB,KAAK,UAAU,cAAc,CAAC,QAA8B;IACjE,MAAM,KAAK,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;IACpC,MAAM,MAAM,GAAG,IAAA,WAAI,EAAC,OAAO,CAAC,GAAG,EAAE,EAAE,cAAc,EAAE,MAAM,EAAE,KAAK,CAAC,CAAC;IAClE,MAAM,MAAM,GAAG,IAAA,eAAU,EAAC,MAAM,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC;IACnD,IAAI,GAAW,CAAC;IAChB,IAAI,IAAc,CAAC;IACnB,IAAI,KAAK,CAAC,QAAQ,CAAC,KAAK,CAAC,EAAE,CAAC;QAC1B,GAAG,GAAG,MAAM,CAAC;QACb,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;IAC/B,CAAC;SAAM,IAAI,KAAK,CAAC,QAAQ,CAAC,KAAK,CAAC,EAAE,CAAC;QACjC,GAAG,GAAG,MAAM,CAAC;QACb,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;IAC/B,CAAC;SAAM,CAAC;QACN,GAAG,GAAG,OAAO,CAAC,QAAQ,CAAC;QACvB,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;IAC/B,CAAC;IACD,MAAM,OAAO,CAAC,UAAU,CAAC,CAAC,GAAG,QAAQ,CAAC,MAAM,EAAE,CAAC,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,UAAU,EAAE,CAAC,CAAC,CAAC;IAE5E,MAAM,KAAK,GAAG,IAAA,qBAAK,EAAC,GAAG,EAAE,IAAI,EAAE;QAC7B,QAAQ,EAAE,IAAI;QACd,KAAK,EAAE,SAAS;QAChB,GAAG,EAAE,OAAO,CAAC,GAAG;QAChB,GAAG,EAAE,OAAO,CAAC,GAAG,EAAE;KACnB,CAAC,CAAC;IACH,KAAK,CAAC,KAAK,EAAE,CAAC;IACd,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAClB,CAAC"}
@@ -0,0 +1,56 @@
1
+ import { ServiceConfig, RouteConfig, ChannelConfig } from '../config/types';
2
+ import { UnifiedMessage, WebhookResponse } from './types';
3
+ import { WebhookError } from './webhook';
4
+ import { GroupStore } from './groupStore';
5
+ import { Logger } from './logger';
6
+ export declare class Router {
7
+ private groupStore?;
8
+ private logger?;
9
+ private services;
10
+ private servicesByChannel;
11
+ private channelConfigs;
12
+ constructor(services?: Record<string, ServiceConfig>, legacyRoutes?: RouteConfig[], channelConfigs?: Record<string, ChannelConfig>);
13
+ /**
14
+ * Hot-reload services from updated config (e.g. after dashboard edits).
15
+ * Preserves legacy routes already loaded.
16
+ */
17
+ reloadServices(services: Record<string, ServiceConfig>, channelConfigs?: Record<string, ChannelConfig>): void;
18
+ setGroupStore(store: GroupStore): void;
19
+ setLogger(logger: Logger): void;
20
+ /**
21
+ * Determine the mode for a channel:
22
+ * - Explicit mode in channel config takes priority
23
+ * - Otherwise: 1 service → direct, 2+ services → groups
24
+ */
25
+ getChannelMode(channelName: string): 'direct' | 'groups';
26
+ /**
27
+ * Get the webhook for a direct-mode channel
28
+ */
29
+ getDirectWebhook(channelName: string): string | undefined;
30
+ /**
31
+ * Get all services for a channel (for onboarding codes)
32
+ */
33
+ getServicesForChannel(channelName: string): ServiceConfig[];
34
+ /**
35
+ * Get all services
36
+ */
37
+ getAllServices(): Map<string, ServiceConfig>;
38
+ /**
39
+ * Get services for a channel with their names, for building service lists.
40
+ */
41
+ getNamedServicesForChannel(channelName: string): Array<{
42
+ name: string;
43
+ config: ServiceConfig;
44
+ }>;
45
+ /**
46
+ * Find the service config that would handle this message
47
+ */
48
+ findServiceConfig(message: UnifiedMessage): ServiceConfig | undefined;
49
+ route(message: UnifiedMessage, replyUrl?: string): Promise<{
50
+ response: WebhookResponse | null;
51
+ webhook?: string;
52
+ latency: number;
53
+ webhookError?: WebhookError;
54
+ }>;
55
+ }
56
+ //# sourceMappingURL=router.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"router.d.ts","sourceRoot":"","sources":["../../src/core/router.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,WAAW,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAC;AAC5E,OAAO,EAAE,cAAc,EAAE,eAAe,EAAE,MAAM,SAAS,CAAC;AAC1D,OAAO,EAAwC,YAAY,EAAE,MAAM,WAAW,CAAC;AAC/E,OAAO,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAC1C,OAAO,EAAE,MAAM,EAAE,MAAM,UAAU,CAAC;AAElC,qBAAa,MAAM;IACjB,OAAO,CAAC,UAAU,CAAC,CAAa;IAChC,OAAO,CAAC,MAAM,CAAC,CAAS;IACxB,OAAO,CAAC,QAAQ,CAAyC;IAEzD,OAAO,CAAC,iBAAiB,CAA2C;IACpE,OAAO,CAAC,cAAc,CAAqC;gBAE/C,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,aAAa,CAAC,EAAE,YAAY,CAAC,EAAE,WAAW,EAAE,EAAE,cAAc,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,aAAa,CAAC;IA6BlI;;;OAGG;IACH,cAAc,CAAC,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,aAAa,CAAC,EAAE,cAAc,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,aAAa,CAAC,GAAG,IAAI;IAwB7G,aAAa,CAAC,KAAK,EAAE,UAAU,GAAG,IAAI;IAItC,SAAS,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI;IAI/B;;;;OAIG;IACH,cAAc,CAAC,WAAW,EAAE,MAAM,GAAG,QAAQ,GAAG,QAAQ;IAQxD;;OAEG;IACH,gBAAgB,CAAC,WAAW,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS;IAKzD;;OAEG;IACH,qBAAqB,CAAC,WAAW,EAAE,MAAM,GAAG,aAAa,EAAE;IAI3D;;OAEG;IACH,cAAc,IAAI,GAAG,CAAC,MAAM,EAAE,aAAa,CAAC;IAI5C;;OAEG;IACH,0BAA0B,CAAC,WAAW,EAAE,MAAM,GAAG,KAAK,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,aAAa,CAAA;KAAE,CAAC;IAQ/F;;OAEG;IACH,iBAAiB,CAAC,OAAO,EAAE,cAAc,GAAG,aAAa,GAAG,SAAS;IAgC/D,KAAK,CAAC,OAAO,EAAE,cAAc,EAAE,QAAQ,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC;QAAE,QAAQ,EAAE,eAAe,GAAG,IAAI,CAAC;QAAC,OAAO,CAAC,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAC;QAAC,YAAY,CAAC,EAAE,YAAY,CAAA;KAAE,CAAC;CAgBvK"}