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,286 @@
1
+ "use strict";
2
+ /**
3
+ * Twilio Voice Channel
4
+ *
5
+ * Flow:
6
+ * 1. Incoming call → POST /inbound/voice/<channel>
7
+ * 2. ChannelKit returns TwiML: greeting + record
8
+ * 3. Recording done → POST /inbound/voice/<channel>/recording
9
+ * 4. ChannelKit: STT → webhook → TTS → respond to caller
10
+ * 5. Loop back to record (default) — webhook returns { endcall: true } to hang up
11
+ */
12
+ var __importDefault = (this && this.__importDefault) || function (mod) {
13
+ return (mod && mod.__esModule) ? mod : { "default": mod };
14
+ };
15
+ Object.defineProperty(exports, "__esModule", { value: true });
16
+ exports.TwilioVoiceChannel = void 0;
17
+ const crypto_1 = require("crypto");
18
+ const twilio_1 = __importDefault(require("twilio"));
19
+ const base_1 = require("../base");
20
+ class TwilioVoiceChannel extends base_1.Channel {
21
+ client;
22
+ pendingCalls = new Map();
23
+ publicUrl = null;
24
+ audioCache = new Map();
25
+ statusMessage = null;
26
+ constructor(name, config) {
27
+ super(name, config);
28
+ this.connected = false;
29
+ this.statusMessage = 'Waiting for public URL to configure Twilio webhook. Start a tunnel or use --public-url.';
30
+ this.client = (0, twilio_1.default)(config.account_sid, config.auth_token);
31
+ }
32
+ get cfg() {
33
+ return this.config;
34
+ }
35
+ setPublicUrl(url) {
36
+ this.publicUrl = url;
37
+ }
38
+ /**
39
+ * Store an audio buffer in cache and return its ID
40
+ */
41
+ storeAudio(buffer, mimetype) {
42
+ const id = (0, crypto_1.randomUUID)();
43
+ this.audioCache.set(id, { buffer, mimetype, createdAt: Date.now() });
44
+ // Auto-cleanup after 60s
45
+ setTimeout(() => this.audioCache.delete(id), 60_000);
46
+ return id;
47
+ }
48
+ /**
49
+ * Retrieve and remove an audio buffer from cache
50
+ */
51
+ getAudio(id) {
52
+ const entry = this.audioCache.get(id);
53
+ if (entry)
54
+ this.audioCache.delete(id);
55
+ return entry;
56
+ }
57
+ async connect() {
58
+ try {
59
+ const numbers = await this.client.incomingPhoneNumbers.list({ phoneNumber: this.cfg.number, limit: 1 });
60
+ if (numbers.length > 0) {
61
+ console.log(`✅ Twilio Voice connected: ${this.name} (${this.cfg.number})`);
62
+ }
63
+ else {
64
+ console.warn(`⚠️ Twilio number ${this.cfg.number} not found in account.`);
65
+ }
66
+ }
67
+ catch (err) {
68
+ console.warn(`⚠️ Could not verify Twilio number: ${err.message}`);
69
+ }
70
+ if (!this.publicUrl) {
71
+ console.log(` 📞 Waiting for public URL to configure voice webhook (use --tunnel or --public-url)`);
72
+ }
73
+ }
74
+ async disconnect() {
75
+ // Nothing to disconnect
76
+ }
77
+ /**
78
+ * Set the voice webhook URL on this Twilio number
79
+ */
80
+ async setWebhookUrl(url) {
81
+ try {
82
+ const numbers = await this.client.incomingPhoneNumbers.list({ phoneNumber: this.cfg.number, limit: 1 });
83
+ if (numbers.length > 0) {
84
+ await this.client.incomingPhoneNumbers(numbers[0].sid).update({
85
+ voiceUrl: url,
86
+ voiceMethod: 'POST',
87
+ });
88
+ console.log(` 📞 Updated Twilio voice webhook for ${this.cfg.number}`);
89
+ this.connected = true;
90
+ this.statusMessage = null;
91
+ this.emit('connected');
92
+ }
93
+ else {
94
+ this.connected = false;
95
+ this.statusMessage = `Phone number ${this.cfg.number} not found in your Twilio account. Check your Twilio console.`;
96
+ this.emit('disconnected');
97
+ }
98
+ }
99
+ catch (err) {
100
+ this.connected = false;
101
+ this.statusMessage = `Failed to configure Twilio webhook: ${err.message}`;
102
+ this.emit('disconnected');
103
+ console.error(`[voice:${this.name}] Failed to set webhook:`, err);
104
+ }
105
+ }
106
+ /**
107
+ * Handle incoming call — returns TwiML
108
+ */
109
+ handleIncomingCall(payload, voiceConfig) {
110
+ const callSid = payload.CallSid;
111
+ const from = payload.From || '';
112
+ const VoiceResponse = twilio_1.default.twiml.VoiceResponse;
113
+ const twiml = new VoiceResponse();
114
+ const language = voiceConfig?.language || 'en-US';
115
+ const voiceName = voiceConfig?.voice_name;
116
+ const maxRecord = voiceConfig?.max_record_seconds || 30;
117
+ // Store pending call
118
+ this.pendingCalls.set(callSid, { callSid, from });
119
+ // Greeting
120
+ const greeting = voiceConfig?.greeting || 'Hello. Please speak after the beep.';
121
+ const sayOpts = { language };
122
+ if (voiceName)
123
+ sayOpts.voice = voiceName;
124
+ twiml.say(sayOpts, greeting);
125
+ // Record
126
+ const recordUrl = `${this.publicUrl}/inbound/voice/${this.name}/recording`;
127
+ twiml.record({
128
+ action: recordUrl,
129
+ maxLength: maxRecord,
130
+ playBeep: true,
131
+ transcribe: false, // we do our own STT
132
+ });
133
+ // Fallback if no recording (caller hung up)
134
+ twiml.say(sayOpts, 'No message received. Goodbye.');
135
+ twiml.hangup();
136
+ console.log(`[voice:${this.name}] Incoming call from ${from} (${callSid})`);
137
+ return twiml.toString();
138
+ }
139
+ /**
140
+ * Handle recording callback — downloads audio, emits as message
141
+ */
142
+ async handleRecording(payload, voiceConfig) {
143
+ const callSid = payload.CallSid;
144
+ const recordingUrl = payload.RecordingUrl;
145
+ const from = payload.From || this.pendingCalls.get(callSid)?.from || '';
146
+ const VoiceResponse = twilio_1.default.twiml.VoiceResponse;
147
+ const twiml = new VoiceResponse();
148
+ const language = voiceConfig?.language || 'en-US';
149
+ const voiceName = voiceConfig?.voice_name;
150
+ const sayOpts = { language };
151
+ if (voiceName)
152
+ sayOpts.voice = voiceName;
153
+ if (!recordingUrl) {
154
+ twiml.say(sayOpts, voiceConfig?.hold_message || 'Sorry, no recording received. Goodbye.');
155
+ twiml.hangup();
156
+ return twiml.toString();
157
+ }
158
+ // Hold message or music while we process
159
+ const holdMessage = voiceConfig?.hold_message;
160
+ const holdMusic = voiceConfig?.hold_music;
161
+ if (holdMessage) {
162
+ twiml.say(sayOpts, holdMessage);
163
+ }
164
+ else if (holdMusic) {
165
+ twiml.play(holdMusic);
166
+ }
167
+ else {
168
+ twiml.pause({ length: 1 });
169
+ }
170
+ // Download recording audio
171
+ try {
172
+ const audioUrl = `${recordingUrl}.mp3`;
173
+ const res = await fetch(audioUrl, {
174
+ headers: {
175
+ 'Authorization': 'Basic ' + Buffer.from(`${this.cfg.account_sid}:${this.cfg.auth_token}`).toString('base64'),
176
+ },
177
+ });
178
+ const buffer = Buffer.from(await res.arrayBuffer());
179
+ // Emit as unified message — STT + webhook will be handled by the pipeline
180
+ const unified = {
181
+ id: callSid + '-' + Date.now(),
182
+ channel: 'voice',
183
+ from,
184
+ type: 'audio',
185
+ text: undefined,
186
+ timestamp: Math.floor(Date.now() / 1000),
187
+ media: {
188
+ buffer,
189
+ mimetype: 'audio/mpeg',
190
+ },
191
+ };
192
+ // Store call context for response routing
193
+ unified._callSid = callSid;
194
+ unified._voiceConfig = voiceConfig;
195
+ this.emitMessage(unified);
196
+ }
197
+ catch (err) {
198
+ console.error(`[voice:${this.name}] Failed to download recording:`, err);
199
+ twiml.say(sayOpts, 'Sorry, there was an error processing your message. Goodbye.');
200
+ twiml.hangup();
201
+ }
202
+ // Return hold TwiML — the actual response will come via the API
203
+ // We need to use <Redirect> to poll for the response
204
+ const redirectUrl = `${this.publicUrl}/inbound/voice/${this.name}/respond/${callSid}`;
205
+ twiml.redirect({ method: 'POST' }, redirectUrl);
206
+ return twiml.toString();
207
+ }
208
+ // Store responses from webhook for active calls
209
+ callResponses = new Map();
210
+ /**
211
+ * Store a webhook response for an active call
212
+ */
213
+ setCallResponse(callSid, response) {
214
+ this.callResponses.set(callSid, response);
215
+ }
216
+ /**
217
+ * Handle respond redirect — check if webhook response is ready
218
+ */
219
+ handleRespond(callSid, voiceConfig) {
220
+ const VoiceResponse = twilio_1.default.twiml.VoiceResponse;
221
+ const twiml = new VoiceResponse();
222
+ const language = voiceConfig?.language || 'en-US';
223
+ const voiceName = voiceConfig?.voice_name;
224
+ const sayOpts = { language };
225
+ if (voiceName)
226
+ sayOpts.voice = voiceName;
227
+ const response = this.callResponses.get(callSid);
228
+ if (!response) {
229
+ // Not ready yet — wait and redirect again
230
+ const holdMessage = voiceConfig?.hold_message;
231
+ const holdMusic = voiceConfig?.hold_music;
232
+ if (holdMusic) {
233
+ twiml.play(holdMusic);
234
+ }
235
+ else if (holdMessage) {
236
+ twiml.say(sayOpts, holdMessage);
237
+ }
238
+ else {
239
+ twiml.pause({ length: 2 });
240
+ }
241
+ const redirectUrl = `${this.publicUrl}/inbound/voice/${this.name}/respond/${callSid}`;
242
+ twiml.redirect({ method: 'POST' }, redirectUrl);
243
+ return twiml.toString();
244
+ }
245
+ // Response ready — play it
246
+ this.callResponses.delete(callSid);
247
+ if (response.media?.buffer && response.media.mimetype?.includes('audio')) {
248
+ // TTS audio — store in cache and play via URL
249
+ const audioId = this.storeAudio(Buffer.isBuffer(response.media.buffer) ? response.media.buffer : Buffer.from(response.media.buffer), response.media.mimetype || 'audio/mpeg');
250
+ const audioUrl = `${this.publicUrl}/inbound/voice/${this.name}/audio/${audioId}`;
251
+ twiml.play(audioUrl);
252
+ }
253
+ else if (response.text) {
254
+ twiml.say(sayOpts, response.text);
255
+ }
256
+ if (response.endcall) {
257
+ // Webhook explicitly asked to end the call
258
+ twiml.say(sayOpts, 'Goodbye.');
259
+ twiml.hangup();
260
+ this.pendingCalls.delete(callSid);
261
+ }
262
+ else {
263
+ // Default: loop back to record (keep the conversation going)
264
+ const maxRecord = voiceConfig?.max_record_seconds || 30;
265
+ const recordUrl = `${this.publicUrl}/inbound/voice/${this.name}/recording`;
266
+ twiml.record({
267
+ action: recordUrl,
268
+ maxLength: maxRecord,
269
+ playBeep: true,
270
+ transcribe: false,
271
+ });
272
+ // Fallback if caller stays silent
273
+ twiml.say(sayOpts, 'Goodbye.');
274
+ twiml.hangup();
275
+ }
276
+ return twiml.toString();
277
+ }
278
+ // send() is not used for voice — responses go through TwiML
279
+ async send(_to, response) {
280
+ // Voice responses are handled via setCallResponse + TwiML redirect
281
+ // This is a no-op but required by the Channel interface
282
+ console.log(`[voice:${this.name}] send() called — voice uses TwiML flow, not direct send`);
283
+ }
284
+ }
285
+ exports.TwilioVoiceChannel = TwilioVoiceChannel;
286
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/channels/voice/index.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,31 @@
1
+ import { Channel } from '../base';
2
+ import { WhatsAppChannelConfig } from '../../config/types';
3
+ import { WebhookResponse } from '../../core/types';
4
+ export declare function isBaileysAvailable(): boolean;
5
+ export declare class WhatsAppChannel extends Channel {
6
+ private processedIds;
7
+ /**
8
+ * Pair a new WhatsApp device by showing a QR code.
9
+ * Creates a temporary Baileys connection, waits for successful pairing, then disconnects.
10
+ * Auth state is persisted to authDir for later use by connect().
11
+ */
12
+ static pair(authDir: string, onQR?: (qr: string) => void): Promise<void>;
13
+ private sock;
14
+ private authDir;
15
+ private reconnectAttempts;
16
+ private reconnectTimer;
17
+ private static readonly MAX_RECONNECT_ATTEMPTS;
18
+ constructor(name: string, config: WhatsAppChannelConfig, authDir?: string);
19
+ private scheduleReconnect;
20
+ getSocket(): any;
21
+ createGroup(name: string, participants: string[]): Promise<{
22
+ id: string;
23
+ subject: string;
24
+ }>;
25
+ sendToJid(jid: string, text: string): Promise<void>;
26
+ connect(): Promise<void>;
27
+ disconnect(): Promise<void>;
28
+ send(to: string, response: WebhookResponse): Promise<void>;
29
+ private toUnified;
30
+ }
31
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/channels/whatsapp/index.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,OAAO,EAAE,MAAM,SAAS,CAAC;AAClC,OAAO,EAAE,qBAAqB,EAAE,MAAM,oBAAoB,CAAC;AAC3D,OAAO,EAAkB,eAAe,EAAE,MAAM,kBAAkB,CAAC;AAoBnE,wBAAgB,kBAAkB,IAAI,OAAO,CAO5C;AAED,qBAAa,eAAgB,SAAQ,OAAO;IAC1C,OAAO,CAAC,YAAY,CAA0B;IAC9C;;;;OAIG;WACU,IAAI,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,CAAC,EAAE,EAAE,MAAM,KAAK,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC;IA6E9E,OAAO,CAAC,IAAI,CAAa;IACzB,OAAO,CAAC,OAAO,CAAS;IACxB,OAAO,CAAC,iBAAiB,CAAK;IAC9B,OAAO,CAAC,cAAc,CAA8C;IACpE,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,sBAAsB,CAAM;gBAExC,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,qBAAqB,EAAE,OAAO,SAAmB;IAMnF,OAAO,CAAC,iBAAiB;IAWzB,SAAS,IAAI,GAAG;IAIV,WAAW,CAAC,IAAI,EAAE,MAAM,EAAE,YAAY,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC;QAAE,EAAE,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAA;KAAE,CAAC;IAM3F,SAAS,CAAC,GAAG,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAKnD,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC;IA8HxB,UAAU,IAAI,OAAO,CAAC,IAAI,CAAC;IAW3B,IAAI,CAAC,EAAE,EAAE,MAAM,EAAE,QAAQ,EAAE,eAAe,GAAG,OAAO,CAAC,IAAI,CAAC;IAuChE,OAAO,CAAC,SAAS;CAyClB"}