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.
- package/LICENSE +21 -0
- package/README.md +829 -0
- package/config.example.yaml +37 -0
- package/dist/api/middleware/auth.d.ts +14 -0
- package/dist/api/middleware/auth.d.ts.map +1 -0
- package/dist/api/middleware/auth.js +130 -0
- package/dist/api/middleware/auth.js.map +1 -0
- package/dist/api/routes/config.d.ts +4 -0
- package/dist/api/routes/config.d.ts.map +1 -0
- package/dist/api/routes/config.js +794 -0
- package/dist/api/routes/config.js.map +1 -0
- package/dist/api/routes/dashboard.d.ts +4 -0
- package/dist/api/routes/dashboard.d.ts.map +1 -0
- package/dist/api/routes/dashboard.js +89 -0
- package/dist/api/routes/dashboard.js.map +1 -0
- package/dist/api/routes/inbound.d.ts +4 -0
- package/dist/api/routes/inbound.d.ts.map +1 -0
- package/dist/api/routes/inbound.js +293 -0
- package/dist/api/routes/inbound.js.map +1 -0
- package/dist/api/routes/logs.d.ts +4 -0
- package/dist/api/routes/logs.d.ts.map +1 -0
- package/dist/api/routes/logs.js +49 -0
- package/dist/api/routes/logs.js.map +1 -0
- package/dist/api/routes/mcp.d.ts +4 -0
- package/dist/api/routes/mcp.d.ts.map +1 -0
- package/dist/api/routes/mcp.js +100 -0
- package/dist/api/routes/mcp.js.map +1 -0
- package/dist/api/routes/restart.d.ts +4 -0
- package/dist/api/routes/restart.d.ts.map +1 -0
- package/dist/api/routes/restart.js +11 -0
- package/dist/api/routes/restart.js.map +1 -0
- package/dist/api/routes/send.d.ts +4 -0
- package/dist/api/routes/send.d.ts.map +1 -0
- package/dist/api/routes/send.js +66 -0
- package/dist/api/routes/send.js.map +1 -0
- package/dist/api/routes/settings.d.ts +4 -0
- package/dist/api/routes/settings.d.ts.map +1 -0
- package/dist/api/routes/settings.js +133 -0
- package/dist/api/routes/settings.js.map +1 -0
- package/dist/api/routes/tunnel.d.ts +4 -0
- package/dist/api/routes/tunnel.d.ts.map +1 -0
- package/dist/api/routes/tunnel.js +209 -0
- package/dist/api/routes/tunnel.js.map +1 -0
- package/dist/api/routes/twilio.d.ts +4 -0
- package/dist/api/routes/twilio.d.ts.map +1 -0
- package/dist/api/routes/twilio.js +138 -0
- package/dist/api/routes/twilio.js.map +1 -0
- package/dist/api/routes/update.d.ts +4 -0
- package/dist/api/routes/update.d.ts.map +1 -0
- package/dist/api/routes/update.js +42 -0
- package/dist/api/routes/update.js.map +1 -0
- package/dist/api/server.d.ts +52 -0
- package/dist/api/server.d.ts.map +1 -0
- package/dist/api/server.js +415 -0
- package/dist/api/server.js.map +1 -0
- package/dist/api/types.d.ts +61 -0
- package/dist/api/types.d.ts.map +1 -0
- package/dist/api/types.js +3 -0
- package/dist/api/types.js.map +1 -0
- package/dist/channels/base.d.ts +15 -0
- package/dist/channels/base.d.ts.map +1 -0
- package/dist/channels/base.js +20 -0
- package/dist/channels/base.js.map +1 -0
- package/dist/channels/email/gmail.d.ts +36 -0
- package/dist/channels/email/gmail.d.ts.map +1 -0
- package/dist/channels/email/gmail.js +351 -0
- package/dist/channels/email/gmail.js.map +1 -0
- package/dist/channels/email/index.d.ts +3 -0
- package/dist/channels/email/index.d.ts.map +1 -0
- package/dist/channels/email/index.js +8 -0
- package/dist/channels/email/index.js.map +1 -0
- package/dist/channels/email/resend.d.ts +29 -0
- package/dist/channels/email/resend.d.ts.map +1 -0
- package/dist/channels/email/resend.js +155 -0
- package/dist/channels/email/resend.js.map +1 -0
- package/dist/channels/endpoint/index.d.ts +21 -0
- package/dist/channels/endpoint/index.d.ts.map +1 -0
- package/dist/channels/endpoint/index.js +80 -0
- package/dist/channels/endpoint/index.js.map +1 -0
- package/dist/channels/sms/index.d.ts +37 -0
- package/dist/channels/sms/index.d.ts.map +1 -0
- package/dist/channels/sms/index.js +163 -0
- package/dist/channels/sms/index.js.map +1 -0
- package/dist/channels/telegram/index.d.ts +24 -0
- package/dist/channels/telegram/index.d.ts.map +1 -0
- package/dist/channels/telegram/index.js +231 -0
- package/dist/channels/telegram/index.js.map +1 -0
- package/dist/channels/voice/index.d.ts +62 -0
- package/dist/channels/voice/index.d.ts.map +1 -0
- package/dist/channels/voice/index.js +286 -0
- package/dist/channels/voice/index.js.map +1 -0
- package/dist/channels/whatsapp/index.d.ts +31 -0
- package/dist/channels/whatsapp/index.d.ts.map +1 -0
- package/dist/channels/whatsapp/index.js +383 -0
- package/dist/channels/whatsapp/index.js.map +1 -0
- package/dist/cli/commands/demo.d.ts +4 -0
- package/dist/cli/commands/demo.d.ts.map +1 -0
- package/dist/cli/commands/demo.js +55 -0
- package/dist/cli/commands/demo.js.map +1 -0
- package/dist/cli/commands/init.d.ts +2 -0
- package/dist/cli/commands/init.d.ts.map +1 -0
- package/dist/cli/commands/init.js +254 -0
- package/dist/cli/commands/init.js.map +1 -0
- package/dist/cli/commands/install-skill.d.ts +4 -0
- package/dist/cli/commands/install-skill.d.ts.map +1 -0
- package/dist/cli/commands/install-skill.js +60 -0
- package/dist/cli/commands/install-skill.js.map +1 -0
- package/dist/cli/commands/send.d.ts +5 -0
- package/dist/cli/commands/send.d.ts.map +1 -0
- package/dist/cli/commands/send.js +46 -0
- package/dist/cli/commands/send.js.map +1 -0
- package/dist/cli/commands/start.d.ts +5 -0
- package/dist/cli/commands/start.d.ts.map +1 -0
- package/dist/cli/commands/start.js +129 -0
- package/dist/cli/commands/start.js.map +1 -0
- package/dist/cli/helpers.d.ts +26 -0
- package/dist/cli/helpers.d.ts.map +1 -0
- package/dist/cli/helpers.js +120 -0
- package/dist/cli/helpers.js.map +1 -0
- package/dist/cli/index.d.ts +3 -0
- package/dist/cli/index.d.ts.map +1 -0
- package/dist/cli/index.js +282 -0
- package/dist/cli/index.js.map +1 -0
- package/dist/cli/wizards/channel.d.ts +4 -0
- package/dist/cli/wizards/channel.d.ts.map +1 -0
- package/dist/cli/wizards/channel.js +285 -0
- package/dist/cli/wizards/channel.js.map +1 -0
- package/dist/cli/wizards/provision.d.ts +4 -0
- package/dist/cli/wizards/provision.d.ts.map +1 -0
- package/dist/cli/wizards/provision.js +213 -0
- package/dist/cli/wizards/provision.js.map +1 -0
- package/dist/cli/wizards/service.d.ts +5 -0
- package/dist/cli/wizards/service.d.ts.map +1 -0
- package/dist/cli/wizards/service.js +212 -0
- package/dist/cli/wizards/service.js.map +1 -0
- package/dist/cli.d.ts +3 -0
- package/dist/cli.d.ts.map +1 -0
- package/dist/cli.js +6 -0
- package/dist/cli.js.map +1 -0
- package/dist/config/parser.d.ts +6 -0
- package/dist/config/parser.d.ts.map +1 -0
- package/dist/config/parser.js +37 -0
- package/dist/config/parser.js.map +1 -0
- package/dist/config/types.d.ts +170 -0
- package/dist/config/types.d.ts.map +1 -0
- package/dist/config/types.js +3 -0
- package/dist/config/types.js.map +1 -0
- package/dist/core/apiServer.d.ts +2 -0
- package/dist/core/apiServer.d.ts.map +1 -0
- package/dist/core/apiServer.js +7 -0
- package/dist/core/apiServer.js.map +1 -0
- package/dist/core/groupStore.d.ts +19 -0
- package/dist/core/groupStore.d.ts.map +1 -0
- package/dist/core/groupStore.js +48 -0
- package/dist/core/groupStore.js.map +1 -0
- package/dist/core/logger.d.ts +42 -0
- package/dist/core/logger.d.ts.map +1 -0
- package/dist/core/logger.js +142 -0
- package/dist/core/logger.js.map +1 -0
- package/dist/core/messageHandler.d.ts +15 -0
- package/dist/core/messageHandler.d.ts.map +1 -0
- package/dist/core/messageHandler.js +309 -0
- package/dist/core/messageHandler.js.map +1 -0
- package/dist/core/restart.d.ts +3 -0
- package/dist/core/restart.d.ts.map +1 -0
- package/dist/core/restart.js +35 -0
- package/dist/core/restart.js.map +1 -0
- package/dist/core/router.d.ts +56 -0
- package/dist/core/router.d.ts.map +1 -0
- package/dist/core/router.js +168 -0
- package/dist/core/router.js.map +1 -0
- package/dist/core/tunnel.d.ts +16 -0
- package/dist/core/tunnel.d.ts.map +1 -0
- package/dist/core/tunnel.js +99 -0
- package/dist/core/tunnel.js.map +1 -0
- package/dist/core/types.d.ts +54 -0
- package/dist/core/types.d.ts.map +1 -0
- package/dist/core/types.js +3 -0
- package/dist/core/types.js.map +1 -0
- package/dist/core/updater.d.ts +44 -0
- package/dist/core/updater.d.ts.map +1 -0
- package/dist/core/updater.js +264 -0
- package/dist/core/updater.js.map +1 -0
- package/dist/core/webhook.d.ts +26 -0
- package/dist/core/webhook.d.ts.map +1 -0
- package/dist/core/webhook.js +224 -0
- package/dist/core/webhook.js.map +1 -0
- package/dist/dashboard/assets/browser-D_-rzKir.js +8 -0
- package/dist/dashboard/assets/index-CNa084vI.js +88 -0
- package/dist/dashboard/assets/index-CRvIEyjF.css +1 -0
- package/dist/dashboard/index.html +17 -0
- package/dist/index.d.ts +22 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +551 -0
- package/dist/index.js.map +1 -0
- package/dist/mcp/index.d.ts +3 -0
- package/dist/mcp/index.d.ts.map +1 -0
- package/dist/mcp/index.js +6 -0
- package/dist/mcp/index.js.map +1 -0
- package/dist/mcp/server.d.ts +45 -0
- package/dist/mcp/server.d.ts.map +1 -0
- package/dist/mcp/server.js +197 -0
- package/dist/mcp/server.js.map +1 -0
- package/dist/mcp/tools.d.ts +16 -0
- package/dist/mcp/tools.d.ts.map +1 -0
- package/dist/mcp/tools.js +502 -0
- package/dist/mcp/tools.js.map +1 -0
- package/dist/media/formatter.d.ts +12 -0
- package/dist/media/formatter.d.ts.map +1 -0
- package/dist/media/formatter.js +147 -0
- package/dist/media/formatter.js.map +1 -0
- package/dist/media/processor.d.ts +33 -0
- package/dist/media/processor.d.ts.map +1 -0
- package/dist/media/processor.js +145 -0
- package/dist/media/processor.js.map +1 -0
- package/dist/media/stt.d.ts +16 -0
- package/dist/media/stt.d.ts.map +1 -0
- package/dist/media/stt.js +298 -0
- package/dist/media/stt.js.map +1 -0
- package/dist/media/tts.d.ts +19 -0
- package/dist/media/tts.d.ts.map +1 -0
- package/dist/media/tts.js +135 -0
- package/dist/media/tts.js.map +1 -0
- package/dist/onboarding/index.d.ts +28 -0
- package/dist/onboarding/index.d.ts.map +1 -0
- package/dist/onboarding/index.js +144 -0
- package/dist/onboarding/index.js.map +1 -0
- package/dist/paths.d.ts +9 -0
- package/dist/paths.d.ts.map +1 -0
- package/dist/paths.js +14 -0
- package/dist/paths.js.map +1 -0
- package/dist/provisioning/twilio.d.ts +51 -0
- package/dist/provisioning/twilio.d.ts.map +1 -0
- package/dist/provisioning/twilio.js +175 -0
- package/dist/provisioning/twilio.js.map +1 -0
- package/echo-server.js +163 -0
- 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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"}
|
package/dist/paths.d.ts
ADDED
|
@@ -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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"}
|