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 @@
1
+ {"version":3,"file":"stt.js","sourceRoot":"","sources":["../../src/media/stt.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,19 @@
1
+ /**
2
+ * Text-to-Speech providers for ChannelKit
3
+ */
4
+ export interface TTSProvider {
5
+ synthesize(text: string, voice?: string): Promise<{
6
+ buffer: Buffer;
7
+ mimetype: string;
8
+ }>;
9
+ }
10
+ export interface TTSConfig {
11
+ provider: 'google' | 'elevenlabs' | 'openai';
12
+ voice?: string;
13
+ language?: string;
14
+ }
15
+ /**
16
+ * Create a TTS provider instance
17
+ */
18
+ export declare function createTTSProvider(config: TTSConfig): TTSProvider;
19
+ //# sourceMappingURL=tts.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tts.d.ts","sourceRoot":"","sources":["../../src/media/tts.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,MAAM,WAAW,WAAW;IAC1B,UAAU,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC;QAAE,MAAM,EAAE,MAAM,CAAC;QAAC,QAAQ,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;CACzF;AAED,MAAM,WAAW,SAAS;IACxB,QAAQ,EAAE,QAAQ,GAAG,YAAY,GAAG,QAAQ,CAAC;IAC7C,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AA0ID;;GAEG;AACH,wBAAgB,iBAAiB,CAAC,MAAM,EAAE,SAAS,GAAG,WAAW,CAWhE"}
@@ -0,0 +1,135 @@
1
+ "use strict";
2
+ /**
3
+ * Text-to-Speech providers for ChannelKit
4
+ */
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.createTTSProvider = createTTSProvider;
7
+ function getApiKey(provider) {
8
+ const key = process.env[`${provider.toUpperCase()}_TTS_API_KEY`]
9
+ || process.env[`${provider.toUpperCase()}_API_KEY`];
10
+ if (!key) {
11
+ throw new Error(`Missing API key for TTS provider "${provider}". Set ${provider.toUpperCase()}_TTS_API_KEY or ${provider.toUpperCase()}_API_KEY environment variable.`);
12
+ }
13
+ return key;
14
+ }
15
+ /**
16
+ * Google Cloud Text-to-Speech (REST)
17
+ */
18
+ class GoogleTTS {
19
+ apiKey;
20
+ language;
21
+ constructor(config) {
22
+ this.apiKey = getApiKey('google');
23
+ this.language = config.language || 'en-US';
24
+ }
25
+ async synthesize(text, voice) {
26
+ const body = {
27
+ input: { text },
28
+ voice: {
29
+ languageCode: this.language,
30
+ name: voice || undefined,
31
+ },
32
+ audioConfig: {
33
+ audioEncoding: 'MP3',
34
+ },
35
+ };
36
+ const res = await fetch(`https://texttospeech.googleapis.com/v1/text:synthesize?key=${this.apiKey}`, {
37
+ method: 'POST',
38
+ headers: { 'Content-Type': 'application/json' },
39
+ body: JSON.stringify(body),
40
+ });
41
+ if (!res.ok) {
42
+ const err = await res.text();
43
+ throw new Error(`Google TTS error: ${res.status} ${err}`);
44
+ }
45
+ const data = await res.json();
46
+ const buffer = Buffer.from(data.audioContent, 'base64');
47
+ return { buffer, mimetype: 'audio/mpeg' };
48
+ }
49
+ }
50
+ /**
51
+ * ElevenLabs TTS
52
+ */
53
+ class ElevenLabsTTS {
54
+ apiKey;
55
+ defaultVoice;
56
+ constructor(config) {
57
+ this.apiKey = getApiKey('elevenlabs');
58
+ this.defaultVoice = config.voice || '21m00Tcm4TlvDq8ikWAM'; // Rachel
59
+ }
60
+ async synthesize(text, voice) {
61
+ const voiceId = voice || this.defaultVoice;
62
+ const res = await fetch(`https://api.elevenlabs.io/v1/text-to-speech/${voiceId}`, {
63
+ method: 'POST',
64
+ headers: {
65
+ 'xi-api-key': this.apiKey,
66
+ 'Content-Type': 'application/json',
67
+ 'Accept': 'audio/mpeg',
68
+ },
69
+ body: JSON.stringify({
70
+ text,
71
+ model_id: 'eleven_v3',
72
+ voice_settings: {
73
+ stability: 0.5,
74
+ similarity_boost: 0.75,
75
+ },
76
+ }),
77
+ });
78
+ if (!res.ok) {
79
+ const err = await res.text();
80
+ throw new Error(`ElevenLabs TTS error: ${res.status} ${err}`);
81
+ }
82
+ const arrayBuf = await res.arrayBuffer();
83
+ const buffer = Buffer.from(arrayBuf);
84
+ return { buffer, mimetype: 'audio/mpeg' };
85
+ }
86
+ }
87
+ /**
88
+ * OpenAI TTS
89
+ */
90
+ class OpenAITTS {
91
+ apiKey;
92
+ defaultVoice;
93
+ constructor(config) {
94
+ this.apiKey = getApiKey('openai');
95
+ this.defaultVoice = config.voice || 'alloy';
96
+ }
97
+ async synthesize(text, voice) {
98
+ const res = await fetch('https://api.openai.com/v1/audio/speech', {
99
+ method: 'POST',
100
+ headers: {
101
+ 'Authorization': `Bearer ${this.apiKey}`,
102
+ 'Content-Type': 'application/json',
103
+ },
104
+ body: JSON.stringify({
105
+ model: 'tts-1',
106
+ input: text,
107
+ voice: voice || this.defaultVoice,
108
+ response_format: 'mp3',
109
+ }),
110
+ });
111
+ if (!res.ok) {
112
+ const err = await res.text();
113
+ throw new Error(`OpenAI TTS error: ${res.status} ${err}`);
114
+ }
115
+ const arrayBuf = await res.arrayBuffer();
116
+ const buffer = Buffer.from(arrayBuf);
117
+ return { buffer, mimetype: 'audio/mpeg' };
118
+ }
119
+ }
120
+ /**
121
+ * Create a TTS provider instance
122
+ */
123
+ function createTTSProvider(config) {
124
+ switch (config.provider) {
125
+ case 'google':
126
+ return new GoogleTTS(config);
127
+ case 'elevenlabs':
128
+ return new ElevenLabsTTS(config);
129
+ case 'openai':
130
+ return new OpenAITTS(config);
131
+ default:
132
+ throw new Error(`Unknown TTS provider: ${config.provider}`);
133
+ }
134
+ }
135
+ //# sourceMappingURL=tts.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tts.js","sourceRoot":"","sources":["../../src/media/tts.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,28 @@
1
+ import { OnboardingConfig } from '../config/types';
2
+ import { WhatsAppChannel } from '../channels/whatsapp';
3
+ import { TelegramChannel } from '../channels/telegram';
4
+ import { GroupStore } from '../core/groupStore';
5
+ import { UnifiedMessage } from '../core/types';
6
+ export declare class Onboarding {
7
+ private config;
8
+ private whatsappChannel?;
9
+ private telegramChannel?;
10
+ private groupStore;
11
+ private telegramMappings;
12
+ constructor(config: OnboardingConfig, whatsappChannel?: WhatsAppChannel | undefined, telegramChannel?: TelegramChannel | undefined);
13
+ getGroupStore(): GroupStore;
14
+ /**
15
+ * Handle a direct message for onboarding. Returns true if handled.
16
+ * @param unmatchedPolicy - what to do when no code matches ('list' = send menu, 'ignore' or undefined = silent)
17
+ */
18
+ handleDirectMessage(message: UnifiedMessage, unmatchedPolicy?: 'list' | 'ignore'): Promise<boolean>;
19
+ /**
20
+ * Check if a Telegram chat has a service mapping. Returns the webhook URL if so.
21
+ */
22
+ getTelegramServiceWebhook(chatId: string): string | undefined;
23
+ private handleWhatsApp;
24
+ private createWhatsAppGroup;
25
+ private handleTelegram;
26
+ private getCodesForChannel;
27
+ }
28
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/onboarding/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,gBAAgB,EAAwB,MAAM,iBAAiB,CAAC;AACzE,OAAO,EAAE,eAAe,EAAE,MAAM,sBAAsB,CAAC;AACvD,OAAO,EAAE,eAAe,EAAE,MAAM,sBAAsB,CAAC;AACvD,OAAO,EAAE,UAAU,EAAE,MAAM,oBAAoB,CAAC;AAChD,OAAO,EAAE,cAAc,EAAE,MAAM,eAAe,CAAC;AAE/C,qBAAa,UAAU;IAMnB,OAAO,CAAC,MAAM;IACd,OAAO,CAAC,eAAe,CAAC;IACxB,OAAO,CAAC,eAAe,CAAC;IAP1B,OAAO,CAAC,UAAU,CAAa;IAE/B,OAAO,CAAC,gBAAgB,CAAkC;gBAGhD,MAAM,EAAE,gBAAgB,EACxB,eAAe,CAAC,EAAE,eAAe,YAAA,EACjC,eAAe,CAAC,EAAE,eAAe,YAAA;IAK3C,aAAa,IAAI,UAAU;IAI3B;;;OAGG;IACG,mBAAmB,CAAC,OAAO,EAAE,cAAc,EAAE,eAAe,CAAC,EAAE,MAAM,GAAG,QAAQ,GAAG,OAAO,CAAC,OAAO,CAAC;IAYzG;;OAEG;IACH,yBAAyB,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS;YAS/C,cAAc;YAsCd,mBAAmB;YAmCnB,cAAc;IAqD5B,OAAO,CAAC,kBAAkB;CAM3B"}
@@ -0,0 +1,144 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.Onboarding = void 0;
4
+ const groupStore_1 = require("../core/groupStore");
5
+ class Onboarding {
6
+ config;
7
+ whatsappChannel;
8
+ telegramChannel;
9
+ groupStore;
10
+ // Track telegram user→service mappings (chatId → serviceName)
11
+ telegramMappings = new Map();
12
+ constructor(config, whatsappChannel, telegramChannel) {
13
+ this.config = config;
14
+ this.whatsappChannel = whatsappChannel;
15
+ this.telegramChannel = telegramChannel;
16
+ this.groupStore = new groupStore_1.GroupStore();
17
+ }
18
+ getGroupStore() {
19
+ return this.groupStore;
20
+ }
21
+ /**
22
+ * Handle a direct message for onboarding. Returns true if handled.
23
+ * @param unmatchedPolicy - what to do when no code matches ('list' = send menu, 'ignore' or undefined = silent)
24
+ */
25
+ async handleDirectMessage(message, unmatchedPolicy) {
26
+ if (message.groupId)
27
+ return false;
28
+ if (message.channel === 'whatsapp') {
29
+ return this.handleWhatsApp(message, unmatchedPolicy);
30
+ }
31
+ if (message.channel === 'telegram') {
32
+ return this.handleTelegram(message, unmatchedPolicy);
33
+ }
34
+ return false;
35
+ }
36
+ /**
37
+ * Check if a Telegram chat has a service mapping. Returns the webhook URL if so.
38
+ */
39
+ getTelegramServiceWebhook(chatId) {
40
+ const serviceName = this.telegramMappings.get(chatId);
41
+ if (!serviceName)
42
+ return undefined;
43
+ const code = (this.config.codes || []).find(c => c.name === serviceName);
44
+ return code?.webhook;
45
+ }
46
+ // --- WhatsApp ---
47
+ async handleWhatsApp(message, unmatchedPolicy) {
48
+ if (!this.whatsappChannel)
49
+ return false;
50
+ const codes = this.getCodesForChannel(message.channelName || message.channel);
51
+ const text = (message.text || '').trim().toUpperCase();
52
+ const matched = codes.find(c => c.code.toUpperCase() === text);
53
+ if (matched) {
54
+ const existing = this.groupStore.findByUserAndService(message.from, matched.name);
55
+ if (existing) {
56
+ await this.whatsappChannel.sendToJid(message.from, `You're already connected to ${matched.name}! Check the group "${matched.name}" in your chats.`);
57
+ return true;
58
+ }
59
+ const now = Math.floor(Date.now() / 1000);
60
+ if (message.timestamp && now - message.timestamp > 30) {
61
+ console.log(`[onboarding] Skipping old message from ${message.from} (${now - message.timestamp}s old)`);
62
+ return true;
63
+ }
64
+ await this.createWhatsAppGroup(message.from, matched, message.senderName);
65
+ return true;
66
+ }
67
+ // No match — send menu only if the channel's unmatched policy is 'list'
68
+ if (unmatchedPolicy === 'list' && codes.length > 0) {
69
+ const codeList = codes.map(c => c.code).join(' or ');
70
+ await this.whatsappChannel.sendToJid(message.from, `Available services: send ${codeList} to connect`);
71
+ }
72
+ return true;
73
+ }
74
+ async createWhatsAppGroup(userJid, service, senderName) {
75
+ if (!this.whatsappChannel)
76
+ return;
77
+ const phone = userJid.replace(/@s\.whatsapp\.net$/, '');
78
+ const groupName = `${service.name} - ${senderName || phone}`;
79
+ try {
80
+ console.log(`[onboarding] Creating group "${groupName}" with participant: ${userJid}`);
81
+ const group = await this.whatsappChannel.createGroup(groupName, [userJid]);
82
+ this.groupStore.add(group.id, {
83
+ groupId: group.id,
84
+ serviceName: service.name,
85
+ webhook: service.webhook,
86
+ userId: userJid,
87
+ createdAt: Date.now(),
88
+ });
89
+ await this.whatsappChannel.sendToJid(group.id, `Welcome to ${service.name}! 🎉\nAll messages in this group will be forwarded to the service.`);
90
+ console.log(`[onboarding] Created group "${groupName}" (${group.id}) for service ${service.name}`);
91
+ }
92
+ catch (err) {
93
+ console.error(`[onboarding] Failed to create group:`, err);
94
+ await this.whatsappChannel.sendToJid(userJid, `Sorry, failed to set up ${service.name}. Please try again.`);
95
+ }
96
+ }
97
+ // --- Telegram ---
98
+ async handleTelegram(message, unmatchedPolicy) {
99
+ if (!this.telegramChannel)
100
+ return false;
101
+ const codes = this.getCodesForChannel(message.channelName || message.channel);
102
+ if (codes.length === 0)
103
+ return false;
104
+ // Support both plain code and /start CODE
105
+ let text = (message.text || '').trim().toUpperCase();
106
+ if (text.startsWith('/START ')) {
107
+ text = text.slice(7).trim();
108
+ }
109
+ const matched = codes.find(c => c.code.toUpperCase() === text);
110
+ if (matched) {
111
+ // Check if already connected
112
+ const existingService = this.telegramMappings.get(message.from);
113
+ if (existingService === matched.name) {
114
+ await this.telegramChannel.sendToChat(message.from, `You're already connected to ${matched.name}! Just send messages here.`);
115
+ return true;
116
+ }
117
+ // Map this chat to the service
118
+ this.telegramMappings.set(message.from, matched.name);
119
+ await this.telegramChannel.sendToChat(message.from, `Welcome to ${matched.name}! 🎉\nAll messages here will be forwarded to the service.`);
120
+ console.log(`[onboarding] Telegram user ${message.senderName || message.from} connected to ${matched.name}`);
121
+ return true;
122
+ }
123
+ // If already mapped to a service, don't show menu — let it route
124
+ if (this.telegramMappings.has(message.from)) {
125
+ return false;
126
+ }
127
+ // No match, no mapping — send menu only if the channel's unmatched policy is 'list'
128
+ if (unmatchedPolicy === 'list' && codes.length > 0) {
129
+ const codeList = codes.map(c => `\`${c.code}\` → ${c.name}`).join('\n');
130
+ await this.telegramChannel.sendToChat(message.from, `Available services:\n${codeList}\n\nSend a code to connect.`);
131
+ }
132
+ return true;
133
+ }
134
+ // --- Helpers ---
135
+ getCodesForChannel(channel) {
136
+ return (this.config.codes || []).filter(c => {
137
+ if (!c.channels || c.channels.length === 0)
138
+ return true; // all channels
139
+ return c.channels.includes(channel);
140
+ });
141
+ }
142
+ }
143
+ exports.Onboarding = Onboarding;
144
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/onboarding/index.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,9 @@
1
+ /** Default home directory for all ChannelKit data: ~/.channelkit */
2
+ export declare const CHANNELKIT_HOME: string;
3
+ /** Default config file path */
4
+ export declare const DEFAULT_CONFIG_PATH: string;
5
+ /** Default auth directory (WhatsApp sessions, Gmail tokens, etc.) */
6
+ export declare const DEFAULT_AUTH_DIR: string;
7
+ /** Default data directory (logs database, etc.) */
8
+ export declare const DEFAULT_DATA_DIR: string;
9
+ //# sourceMappingURL=paths.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"paths.d.ts","sourceRoot":"","sources":["../src/paths.ts"],"names":[],"mappings":"AAGA,oEAAoE;AACpE,eAAO,MAAM,eAAe,QAAiC,CAAC;AAE9D,+BAA+B;AAC/B,eAAO,MAAM,mBAAmB,QAAuC,CAAC;AAExE,qEAAqE;AACrE,eAAO,MAAM,gBAAgB,QAAgC,CAAC;AAE9D,mDAAmD;AACnD,eAAO,MAAM,gBAAgB,QAAgC,CAAC"}
package/dist/paths.js ADDED
@@ -0,0 +1,14 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.DEFAULT_DATA_DIR = exports.DEFAULT_AUTH_DIR = exports.DEFAULT_CONFIG_PATH = exports.CHANNELKIT_HOME = void 0;
4
+ const path_1 = require("path");
5
+ const os_1 = require("os");
6
+ /** Default home directory for all ChannelKit data: ~/.channelkit */
7
+ exports.CHANNELKIT_HOME = (0, path_1.join)((0, os_1.homedir)(), '.channelkit');
8
+ /** Default config file path */
9
+ exports.DEFAULT_CONFIG_PATH = (0, path_1.join)(exports.CHANNELKIT_HOME, 'config.yaml');
10
+ /** Default auth directory (WhatsApp sessions, Gmail tokens, etc.) */
11
+ exports.DEFAULT_AUTH_DIR = (0, path_1.join)(exports.CHANNELKIT_HOME, 'auth');
12
+ /** Default data directory (logs database, etc.) */
13
+ exports.DEFAULT_DATA_DIR = (0, path_1.join)(exports.CHANNELKIT_HOME, 'data');
14
+ //# sourceMappingURL=paths.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"paths.js","sourceRoot":"","sources":["../src/paths.ts"],"names":[],"mappings":";;;AAAA,+BAA4B;AAC5B,2BAA6B;AAE7B,oEAAoE;AACvD,QAAA,eAAe,GAAG,IAAA,WAAI,EAAC,IAAA,YAAO,GAAE,EAAE,aAAa,CAAC,CAAC;AAE9D,+BAA+B;AAClB,QAAA,mBAAmB,GAAG,IAAA,WAAI,EAAC,uBAAe,EAAE,aAAa,CAAC,CAAC;AAExE,qEAAqE;AACxD,QAAA,gBAAgB,GAAG,IAAA,WAAI,EAAC,uBAAe,EAAE,MAAM,CAAC,CAAC;AAE9D,mDAAmD;AACtC,QAAA,gBAAgB,GAAG,IAAA,WAAI,EAAC,uBAAe,EAAE,MAAM,CAAC,CAAC"}
@@ -0,0 +1,51 @@
1
+ export interface TwilioConfig {
2
+ accountSid: string;
3
+ authToken: string;
4
+ }
5
+ export interface AvailableNumber {
6
+ phoneNumber: string;
7
+ friendlyName: string;
8
+ locality?: string;
9
+ region?: string;
10
+ isoCountry: string;
11
+ capabilities: {
12
+ sms: boolean;
13
+ mms: boolean;
14
+ voice: boolean;
15
+ };
16
+ price?: string;
17
+ priceUnit?: string;
18
+ }
19
+ export interface PurchasedNumber {
20
+ sid: string;
21
+ phoneNumber: string;
22
+ friendlyName: string;
23
+ }
24
+ export declare class TwilioProvisioner {
25
+ private client;
26
+ constructor(config: TwilioConfig);
27
+ listOwnedNumbers(): Promise<{
28
+ phoneNumber: string;
29
+ friendlyName: string;
30
+ capabilities: {
31
+ sms: boolean;
32
+ mms: boolean;
33
+ voice: boolean;
34
+ };
35
+ }[]>;
36
+ searchNumbers(countryCode: string, options?: {
37
+ type?: 'mobile' | 'local';
38
+ limit?: number;
39
+ smsEnabled?: boolean;
40
+ voiceEnabled?: boolean;
41
+ }): Promise<AvailableNumber[]>;
42
+ purchaseNumber(phoneNumber: string): Promise<PurchasedNumber>;
43
+ private findApprovedBundle;
44
+ /**
45
+ * Poll Twilio for incoming SMS to a specific number.
46
+ * Returns the 6-digit verification code when found.
47
+ */
48
+ waitForSms(phoneNumber: string, timeoutMs?: number, onPoll?: () => void): Promise<string>;
49
+ releaseNumber(numberSid: string): Promise<void>;
50
+ }
51
+ //# sourceMappingURL=twilio.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"twilio.d.ts","sourceRoot":"","sources":["../../src/provisioning/twilio.ts"],"names":[],"mappings":"AAEA,MAAM,WAAW,YAAY;IAC3B,UAAU,EAAE,MAAM,CAAC;IACnB,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,eAAe;IAC9B,WAAW,EAAE,MAAM,CAAC;IACpB,YAAY,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,UAAU,EAAE,MAAM,CAAC;IACnB,YAAY,EAAE;QACZ,GAAG,EAAE,OAAO,CAAC;QACb,GAAG,EAAE,OAAO,CAAC;QACb,KAAK,EAAE,OAAO,CAAC;KAChB,CAAC;IACF,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,eAAe;IAC9B,GAAG,EAAE,MAAM,CAAC;IACZ,WAAW,EAAE,MAAM,CAAC;IACpB,YAAY,EAAE,MAAM,CAAC;CACtB;AAED,qBAAa,iBAAiB;IAC5B,OAAO,CAAC,MAAM,CAA4B;gBAE9B,MAAM,EAAE,YAAY;IAI1B,gBAAgB,IAAI,OAAO,CAAC;QAAE,WAAW,EAAE,MAAM,CAAC;QAAC,YAAY,EAAE,MAAM,CAAC;QAAC,YAAY,EAAE;YAAE,GAAG,EAAE,OAAO,CAAC;YAAC,GAAG,EAAE,OAAO,CAAC;YAAC,KAAK,EAAE,OAAO,CAAA;SAAE,CAAA;KAAE,EAAE,CAAC;IAiB1I,aAAa,CAAC,WAAW,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE;QAAE,IAAI,CAAC,EAAE,QAAQ,GAAG,OAAO,CAAC;QAAC,KAAK,CAAC,EAAE,MAAM,CAAC;QAAC,UAAU,CAAC,EAAE,OAAO,CAAC;QAAC,YAAY,CAAC,EAAE,OAAO,CAAA;KAAE,GAAG,OAAO,CAAC,eAAe,EAAE,CAAC;IAwDrK,cAAc,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,eAAe,CAAC;YAsCrD,kBAAkB;IAYhC;;;OAGG;IACG,UAAU,CAAC,WAAW,EAAE,MAAM,EAAE,SAAS,SAAS,EAAE,MAAM,CAAC,EAAE,MAAM,IAAI,GAAG,OAAO,CAAC,MAAM,CAAC;IAiCzF,aAAa,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;CAOtD"}
@@ -0,0 +1,175 @@
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.TwilioProvisioner = void 0;
7
+ const twilio_1 = __importDefault(require("twilio"));
8
+ class TwilioProvisioner {
9
+ client;
10
+ constructor(config) {
11
+ this.client = (0, twilio_1.default)(config.accountSid, config.authToken);
12
+ }
13
+ async listOwnedNumbers() {
14
+ try {
15
+ const numbers = await this.client.incomingPhoneNumbers.list({ limit: 100 });
16
+ return numbers.map(n => ({
17
+ phoneNumber: n.phoneNumber,
18
+ friendlyName: n.friendlyName,
19
+ capabilities: {
20
+ sms: n.capabilities?.sms || false,
21
+ mms: n.capabilities?.mms || false,
22
+ voice: n.capabilities?.voice || false,
23
+ },
24
+ }));
25
+ }
26
+ catch (err) {
27
+ throw new Error(`Failed to list numbers: ${err.message}`);
28
+ }
29
+ }
30
+ async searchNumbers(countryCode, options) {
31
+ const type = options?.type || 'mobile';
32
+ const limit = options?.limit || 5;
33
+ const smsEnabled = options?.smsEnabled ?? true;
34
+ const voiceEnabled = options?.voiceEnabled ?? true;
35
+ try {
36
+ const filters = { limit };
37
+ if (smsEnabled)
38
+ filters.smsEnabled = true;
39
+ if (voiceEnabled)
40
+ filters.voiceEnabled = true;
41
+ let results;
42
+ if (type === 'mobile') {
43
+ results = await this.client.availablePhoneNumbers(countryCode).mobile.list(filters);
44
+ }
45
+ else {
46
+ results = await this.client.availablePhoneNumbers(countryCode).local.list(filters);
47
+ }
48
+ // Fetch pricing for this country/type
49
+ let price;
50
+ let priceUnit;
51
+ try {
52
+ const pricing = await this.client.pricing.v1.phoneNumbers.countries(countryCode).fetch();
53
+ // SDK passes raw API objects — inner keys are snake_case despite type declarations
54
+ const match = pricing.phoneNumberPrices?.find((p) => p.number_type === type);
55
+ if (match) {
56
+ price = String(match.current_price ?? match.base_price);
57
+ priceUnit = pricing.priceUnit;
58
+ }
59
+ }
60
+ catch (_) {
61
+ // Pricing API may not be available — continue without price
62
+ }
63
+ return results.map((n) => ({
64
+ phoneNumber: n.phoneNumber,
65
+ friendlyName: n.friendlyName,
66
+ locality: n.locality,
67
+ region: n.region,
68
+ isoCountry: n.isoCountry,
69
+ capabilities: {
70
+ // Trust the filter we sent — if we asked for smsEnabled/voiceEnabled,
71
+ // the number supports it even if Twilio's capabilities object disagrees.
72
+ sms: smsEnabled || (n.capabilities.sms || false),
73
+ mms: n.capabilities.mms || false,
74
+ voice: voiceEnabled || (n.capabilities.voice || false),
75
+ },
76
+ price,
77
+ priceUnit,
78
+ }));
79
+ }
80
+ catch (err) {
81
+ throw new Error(`Failed to search numbers: ${err.message}`);
82
+ }
83
+ }
84
+ async purchaseNumber(phoneNumber) {
85
+ try {
86
+ const result = await this.client.incomingPhoneNumbers.create({
87
+ phoneNumber,
88
+ });
89
+ return {
90
+ sid: result.sid,
91
+ phoneNumber: result.phoneNumber,
92
+ friendlyName: result.friendlyName,
93
+ };
94
+ }
95
+ catch (err) {
96
+ // If a regulatory bundle is required, try to find an approved one and retry
97
+ if (err.code === 21725 || /bundle required/i.test(err.message)) {
98
+ const bundleSid = await this.findApprovedBundle();
99
+ if (!bundleSid) {
100
+ throw new Error('This country requires a regulatory bundle. Create one at https://console.twilio.com/us1/develop/phone-numbers/manage/regulatory-compliance/bundles then try again.');
101
+ }
102
+ try {
103
+ const result = await this.client.incomingPhoneNumbers.create({
104
+ phoneNumber,
105
+ bundleSid,
106
+ });
107
+ return {
108
+ sid: result.sid,
109
+ phoneNumber: result.phoneNumber,
110
+ friendlyName: result.friendlyName,
111
+ };
112
+ }
113
+ catch (retryErr) {
114
+ throw new Error(`Failed to purchase number: ${retryErr.message}`);
115
+ }
116
+ }
117
+ throw new Error(`Failed to purchase number: ${err.message}`);
118
+ }
119
+ }
120
+ async findApprovedBundle() {
121
+ try {
122
+ const bundles = await this.client.numbers.v2.regulatoryCompliance.bundles.list({
123
+ status: 'twilio-approved',
124
+ limit: 1,
125
+ });
126
+ return bundles[0]?.sid;
127
+ }
128
+ catch (_) {
129
+ return undefined;
130
+ }
131
+ }
132
+ /**
133
+ * Poll Twilio for incoming SMS to a specific number.
134
+ * Returns the 6-digit verification code when found.
135
+ */
136
+ async waitForSms(phoneNumber, timeoutMs = 120000, onPoll) {
137
+ const startTime = Date.now();
138
+ const sentAfter = new Date(startTime - 5000); // small buffer
139
+ while (Date.now() - startTime < timeoutMs) {
140
+ if (onPoll)
141
+ onPoll();
142
+ try {
143
+ const messages = await this.client.messages.list({
144
+ to: phoneNumber,
145
+ dateSentAfter: sentAfter,
146
+ limit: 10,
147
+ });
148
+ for (const msg of messages) {
149
+ if (msg.body) {
150
+ // Match WhatsApp verification codes (6 digits, or "xxx-xxx" format)
151
+ const codeMatch = msg.body.match(/(\d{3})-?(\d{3})/);
152
+ if (codeMatch) {
153
+ return codeMatch[1] + codeMatch[2];
154
+ }
155
+ }
156
+ }
157
+ }
158
+ catch (err) {
159
+ // Ignore polling errors, keep trying
160
+ }
161
+ await new Promise((resolve) => setTimeout(resolve, 3000));
162
+ }
163
+ throw new Error('Timeout waiting for SMS verification code');
164
+ }
165
+ async releaseNumber(numberSid) {
166
+ try {
167
+ await this.client.incomingPhoneNumbers(numberSid).remove();
168
+ }
169
+ catch (err) {
170
+ throw new Error(`Failed to release number: ${err.message}`);
171
+ }
172
+ }
173
+ }
174
+ exports.TwilioProvisioner = TwilioProvisioner;
175
+ //# sourceMappingURL=twilio.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"twilio.js","sourceRoot":"","sources":["../../src/provisioning/twilio.ts"],"names":[],"mappings":"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"}