@memberjunction/ai-bridge-twilio 6.2.0-edge.2 → 6.2.0-edge.3

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.
@@ -26,6 +26,12 @@
26
26
  * @see `/plans/realtime/bridges-and-widget/telephony-vendor-bindings.md` §2, §3 (T1).
27
27
  */
28
28
  import { ITwilioClientBindings } from './twilio-call-sdk.js';
29
+ /**
30
+ * The custom-parameter name MJ stamps on every `<Stream>` it emits (`<Parameter name="mjToken" .../>`).
31
+ * Twilio echoes it back on the Media-Streams `start` frame as `start.customParameters.mjToken`, which is
32
+ * how the media websocket proves it belongs to a call MJ itself accepted or placed.
33
+ */
34
+ export declare const TWILIO_MEDIA_TOKEN_PARAMETER = "mjToken";
29
35
  /**
30
36
  * Builds the outbound-dial / inbound-answer TwiML that opens a **bidirectional** Media-Streams websocket
31
37
  * to the agent's media endpoint. `<Connect><Stream>` (not `<Start><Stream>`) is the bidirectional form:
@@ -35,9 +41,11 @@ import { ITwilioClientBindings } from './twilio-call-sdk.js';
35
41
  * Pure + exported so it unit-tests with no network and the MJAPI router can reuse it verbatim.
36
42
  *
37
43
  * @param streamUrl The `wss://…` Media-Streams endpoint Twilio connects the call's audio to.
44
+ * @param parameters Optional custom `<Parameter>` name/value pairs Twilio echoes back on the `start` frame
45
+ * (`start.customParameters`). MJ passes the per-call media token here so the websocket can be authenticated.
38
46
  * @returns The TwiML document string to return to Twilio (REST `twiml` param or webhook response body).
39
47
  */
40
- export declare function BuildConnectStreamTwiML(streamUrl: string): string;
48
+ export declare function BuildConnectStreamTwiML(streamUrl: string, parameters?: Record<string, string>): string;
41
49
  /** @deprecated Use {@link BuildConnectStreamTwiML}. */
42
50
  export declare function buildConnectStreamTwiML(streamUrl: string): string;
43
51
  /** One Twilio Media-Streams `media` frame as it appears (post-JSON-parse) on the websocket. */
@@ -104,12 +112,22 @@ export interface TwilioCreateCallParams {
104
112
  Twiml: string;
105
113
  /** Optional status-callback URL for lifecycle events. Maps to Twilio's `statusCallback`. */
106
114
  StatusCallback?: string;
115
+ /** Lifecycle events to post to {@link StatusCallback} (`initiated`/`ringing`/`answered`/`completed`). Maps to `statusCallbackEvent`. */
116
+ StatusCallbackEvents?: string[];
117
+ /**
118
+ * Enables **asynchronous** answering-machine detection: Twilio keeps the call flowing (so the agent can
119
+ * start speaking) and later POSTs the verdict (`AnsweredBy`) to {@link AsyncAmdStatusCallback}. Maps to
120
+ * `machineDetection: 'Enable'` + `asyncAmd: 'true'`.
121
+ */
122
+ AsyncAmd?: boolean;
123
+ /** URL Twilio POSTs the async-AMD verdict to. Maps to `asyncAmdStatusCallback`. Required when {@link AsyncAmd} is set. */
124
+ AsyncAmdStatusCallback?: string;
107
125
  }
108
126
  /** The REST update payload {@link ITwilioRestLike} `calls(sid).update` accepts (the subset we use). */
109
127
  export interface TwilioUpdateCallParams {
110
128
  /** New call status — `'completed'` ends the call. */
111
129
  Status?: 'completed' | 'canceled';
112
- /** Replacement TwiML — used for transfer (`<Dial>…`) and DTMF (`<Play digits>…`). */
130
+ /** Replacement TwiML — used for transfer (`<Dial>…`) and the goodbye-and-hang-up (`<Say>…<Hangup/>`). */
113
131
  Twiml?: string;
114
132
  }
115
133
  /**
@@ -135,6 +153,12 @@ export interface ITwilioMediaPump {
135
153
  OnFrame(callSid: string, handler: (frame: TwilioMediaFrame) => void): void;
136
154
  /** Registers the call's stream-SID resolver, so outbound frames address the right stream. */
137
155
  GetStreamSid(callSid: string): string;
156
+ /**
157
+ * **Optional.** Registers the per-call media-socket token for a call MJ has just placed (the REST
158
+ * `calls.create` response is the first moment the Call SID is known). The pump uses it to authenticate
159
+ * the Media-Streams `start` frame; a pump that does not authenticate sockets may omit it.
160
+ */
161
+ ExpectCall?(callSid: string, token: string): void;
138
162
  }
139
163
  /** Options {@link RealTwilioBindings} needs at construction — the injected client surfaces + the stream URL. */
140
164
  export interface RealTwilioBindingsOptions {
@@ -146,7 +170,14 @@ export interface RealTwilioBindingsOptions {
146
170
  StreamUrl: string;
147
171
  /** Optional status-callback URL passed on outbound `createCall`. */
148
172
  StatusCallbackUrl?: string;
173
+ /**
174
+ * When set, outbound calls enable asynchronous answering-machine detection and Twilio POSTs the verdict
175
+ * to this URL (`asyncAmdStatusCallback`). Omit to place calls without AMD.
176
+ */
177
+ AsyncAmdStatusCallbackUrl?: string;
149
178
  }
179
+ /** The lifecycle events requested on {@link TwilioCreateCallParams.StatusCallbackEvents} for every outbound call. */
180
+ export declare const TWILIO_STATUS_CALLBACK_EVENTS: readonly string[];
150
181
  /**
151
182
  * Production {@link ITwilioClientBindings} over the real Twilio REST API + Media Streams, expressed against
152
183
  * the injected {@link ITwilioRestLike} / {@link ITwilioMediaPump} surfaces so it builds and unit-tests with
@@ -163,8 +194,15 @@ export declare class RealTwilioBindings implements ITwilioClientBindings {
163
194
  private readonly mediaPump;
164
195
  private readonly streamUrl;
165
196
  private readonly statusCallbackUrl?;
197
+ private readonly asyncAmdStatusCallbackUrl?;
166
198
  constructor(options: RealTwilioBindingsOptions);
167
- /** @inheritdoc */
199
+ /**
200
+ * @inheritdoc
201
+ *
202
+ * Generates the per-call media token BEFORE the REST call (it rides in the TwiML the call executes), then
203
+ * registers it with the media pump under the returned Call SID so the Media-Streams socket can be
204
+ * authenticated when Twilio connects it.
205
+ */
168
206
  createCall(toNumber: string, fromNumber: string, args?: Record<string, unknown>): Promise<string>;
169
207
  /** @inheritdoc */
170
208
  acceptInbound(_callSid: string): Promise<void>;
@@ -174,9 +212,18 @@ export declare class RealTwilioBindings implements ITwilioClientBindings {
174
212
  pushStreamAudio(callSid: string, pcm: ArrayBuffer): void;
175
213
  /** @inheritdoc */
176
214
  onStreamAudio(callSid: string, cb: (pcm: ArrayBuffer) => void): void;
177
- /** @inheritdoc */
215
+ /**
216
+ * @inheritdoc
217
+ *
218
+ * Sent IN-BAND over the media stream as synthesized tones. The REST alternative (`<Play digits>`) replaces the
219
+ * call's TwiML, which ends `<Connect><Stream>` — the agent would lose the call's audio and the stream `stop`
220
+ * would tear the whole call down. Tones go out in 20 ms frames like any other agent audio, so they queue
221
+ * behind whatever the agent is already saying.
222
+ */
178
223
  playDigits(callSid: string, digits: string): Promise<void>;
179
224
  /** @inheritdoc */
225
+ sayAndHangup(callSid: string, message: string): Promise<void>;
226
+ /** @inheritdoc */
180
227
  onDigits(callSid: string, cb: (digits: string) => void): void;
181
228
  /** @inheritdoc */
182
229
  redirectCall(callSid: string, toNumber: string): Promise<void>;
@@ -185,7 +232,14 @@ export declare class RealTwilioBindings implements ITwilioClientBindings {
185
232
  /** @inheritdoc */
186
233
  flushOutbound(callSid: string): void;
187
234
  }
188
- /** Builds the `<Play digits>` TwiML used to emit DTMF tones on a live call (REST update). */
235
+ /** Builds the `<Say>…</Say><Hangup/>` TwiML that speaks a goodbye and ends the call (REST update). */
236
+ export declare function BuildSayHangupTwiML(message: string): string;
237
+ /**
238
+ * Builds the `<Play digits>` TwiML for a REST-update DTMF send.
239
+ *
240
+ * Not used for live agent calls: replacing the TwiML ends the `<Connect><Stream>`, so {@link RealTwilioBindings}
241
+ * sends DTMF in-band instead. Kept for callers outside a media-streamed call.
242
+ */
189
243
  export declare function BuildPlayDigitsTwiML(digits: string): string;
190
244
  /** @deprecated Use {@link BuildPlayDigitsTwiML}. */
191
245
  export declare function buildPlayDigitsTwiML(digits: string): string;
@@ -1 +1 @@
1
- {"version":3,"file":"real-twilio-bindings.d.ts","sourceRoot":"","sources":["../src/real-twilio-bindings.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"real-twilio-bindings.d.ts","sourceRoot":"","sources":["../src/real-twilio-bindings.ts"],"names":[],"mappings":"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"}
@@ -25,7 +25,13 @@
25
25
  * @see {@link ITwilioClientBindings} — the seam this implements.
26
26
  * @see `/plans/realtime/bridges-and-widget/telephony-vendor-bindings.md` §2, §3 (T1).
27
27
  */
28
- import { muLawToPcm16Buffer, pcm16ToMuLawBuffer } from '@memberjunction/ai-bridge-base';
28
+ import { GenerateDtmfPcm16, GenerateMediaToken, muLawToPcm16Buffer, pcm16ToMuLawBuffer } from '@memberjunction/ai-bridge-base';
29
+ /**
30
+ * The custom-parameter name MJ stamps on every `<Stream>` it emits (`<Parameter name="mjToken" .../>`).
31
+ * Twilio echoes it back on the Media-Streams `start` frame as `start.customParameters.mjToken`, which is
32
+ * how the media websocket proves it belongs to a call MJ itself accepted or placed.
33
+ */
34
+ export const TWILIO_MEDIA_TOKEN_PARAMETER = 'mjToken';
29
35
  // ──────────────────────────────────────────────────────────────────────────────
30
36
  // Pure helpers — TwiML + Media-Streams frame transcode. No network, no SDK.
31
37
  // ──────────────────────────────────────────────────────────────────────────────
@@ -38,16 +44,17 @@ import { muLawToPcm16Buffer, pcm16ToMuLawBuffer } from '@memberjunction/ai-bridg
38
44
  * Pure + exported so it unit-tests with no network and the MJAPI router can reuse it verbatim.
39
45
  *
40
46
  * @param streamUrl The `wss://…` Media-Streams endpoint Twilio connects the call's audio to.
47
+ * @param parameters Optional custom `<Parameter>` name/value pairs Twilio echoes back on the `start` frame
48
+ * (`start.customParameters`). MJ passes the per-call media token here so the websocket can be authenticated.
41
49
  * @returns The TwiML document string to return to Twilio (REST `twiml` param or webhook response body).
42
50
  */
43
- export function BuildConnectStreamTwiML(streamUrl) {
51
+ export function BuildConnectStreamTwiML(streamUrl, parameters) {
44
52
  const escaped = escapeXmlAttribute(streamUrl);
45
- return ('<?xml version="1.0" encoding="UTF-8"?>' +
46
- '<Response>' +
47
- '<Connect>' +
48
- `<Stream url="${escaped}" />` +
49
- '</Connect>' +
50
- '</Response>');
53
+ const params = Object.entries(parameters ?? {})
54
+ .map(([name, value]) => `<Parameter name="${escapeXmlAttribute(name)}" value="${escapeXmlAttribute(value)}"/>`)
55
+ .join('');
56
+ const stream = params ? `<Stream url="${escaped}">${params}</Stream>` : `<Stream url="${escaped}" />`;
57
+ return '<?xml version="1.0" encoding="UTF-8"?><Response><Connect>' + stream + '</Connect></Response>';
51
58
  }
52
59
  /** @deprecated Use {@link BuildConnectStreamTwiML}. */
53
60
  export function buildConnectStreamTwiML(streamUrl) {
@@ -130,6 +137,8 @@ function base64ToArrayBuffer(base64) {
130
137
  function arrayBufferToBase64(buffer) {
131
138
  return Buffer.from(new Uint8Array(buffer)).toString('base64');
132
139
  }
140
+ /** The lifecycle events requested on {@link TwilioCreateCallParams.StatusCallbackEvents} for every outbound call. */
141
+ export const TWILIO_STATUS_CALLBACK_EVENTS = ['initiated', 'ringing', 'answered', 'completed'];
133
142
  /**
134
143
  * Production {@link ITwilioClientBindings} over the real Twilio REST API + Media Streams, expressed against
135
144
  * the injected {@link ITwilioRestLike} / {@link ITwilioMediaPump} surfaces so it builds and unit-tests with
@@ -147,16 +156,27 @@ export class RealTwilioBindings {
147
156
  this.mediaPump = options.MediaPump;
148
157
  this.streamUrl = options.StreamUrl;
149
158
  this.statusCallbackUrl = options.StatusCallbackUrl;
159
+ this.asyncAmdStatusCallbackUrl = options.AsyncAmdStatusCallbackUrl;
150
160
  }
151
- /** @inheritdoc */
161
+ /**
162
+ * @inheritdoc
163
+ *
164
+ * Generates the per-call media token BEFORE the REST call (it rides in the TwiML the call executes), then
165
+ * registers it with the media pump under the returned Call SID so the Media-Streams socket can be
166
+ * authenticated when Twilio connects it.
167
+ */
152
168
  async createCall(toNumber, fromNumber, args) {
153
169
  const statusCallback = readStatusCallback(args) ?? this.statusCallbackUrl;
154
- return this.rest.CreateCall({
170
+ const token = GenerateMediaToken();
171
+ const callSid = await this.rest.CreateCall({
155
172
  To: toNumber,
156
173
  From: fromNumber,
157
- Twiml: BuildConnectStreamTwiML(this.streamUrl),
158
- ...(statusCallback ? { StatusCallback: statusCallback } : {}),
174
+ Twiml: BuildConnectStreamTwiML(this.streamUrl, { [TWILIO_MEDIA_TOKEN_PARAMETER]: token }),
175
+ ...(statusCallback ? { StatusCallback: statusCallback, StatusCallbackEvents: [...TWILIO_STATUS_CALLBACK_EVENTS] } : {}),
176
+ ...(this.asyncAmdStatusCallbackUrl ? { AsyncAmd: true, AsyncAmdStatusCallback: this.asyncAmdStatusCallbackUrl } : {}),
159
177
  });
178
+ this.mediaPump.ExpectCall?.(callSid, token);
179
+ return callSid;
160
180
  }
161
181
  /** @inheritdoc */
162
182
  async acceptInbound(_callSid) {
@@ -181,9 +201,24 @@ export class RealTwilioBindings {
181
201
  }
182
202
  });
183
203
  }
184
- /** @inheritdoc */
204
+ /**
205
+ * @inheritdoc
206
+ *
207
+ * Sent IN-BAND over the media stream as synthesized tones. The REST alternative (`<Play digits>`) replaces the
208
+ * call's TwiML, which ends `<Connect><Stream>` — the agent would lose the call's audio and the stream `stop`
209
+ * would tear the whole call down. Tones go out in 20 ms frames like any other agent audio, so they queue
210
+ * behind whatever the agent is already saying.
211
+ */
185
212
  async playDigits(callSid, digits) {
186
- await this.rest.UpdateCall(callSid, { Twiml: BuildPlayDigitsTwiML(digits) });
213
+ const tones = GenerateDtmfPcm16(digits, TWILIO_MEDIA_SAMPLE_RATE);
214
+ for (let offset = 0; offset < tones.length; offset += TWILIO_FRAME_SAMPLES) {
215
+ const frame = tones.slice(offset, offset + TWILIO_FRAME_SAMPLES);
216
+ this.pushStreamAudio(callSid, frame.buffer.slice(frame.byteOffset, frame.byteOffset + frame.byteLength));
217
+ }
218
+ }
219
+ /** @inheritdoc */
220
+ async sayAndHangup(callSid, message) {
221
+ await this.rest.UpdateCall(callSid, { Twiml: BuildSayHangupTwiML(message) });
187
222
  }
188
223
  /** @inheritdoc */
189
224
  onDigits(callSid, cb) {
@@ -212,7 +247,20 @@ export class RealTwilioBindings {
212
247
  this.mediaPump.Send(callSid, EncodeTwilioClearFrame(streamSid));
213
248
  }
214
249
  }
215
- /** Builds the `<Play digits>` TwiML used to emit DTMF tones on a live call (REST update). */
250
+ /** Twilio Media Streams audio rate (G.711 μ-law at 8 kHz). */
251
+ const TWILIO_MEDIA_SAMPLE_RATE = 8000;
252
+ /** Samples per 20 ms Media-Streams frame at {@link TWILIO_MEDIA_SAMPLE_RATE}. */
253
+ const TWILIO_FRAME_SAMPLES = 160;
254
+ /** Builds the `<Say>…</Say><Hangup/>` TwiML that speaks a goodbye and ends the call (REST update). */
255
+ export function BuildSayHangupTwiML(message) {
256
+ return '<?xml version="1.0" encoding="UTF-8"?><Response>' + `<Say>${escapeXmlAttribute(message)}</Say><Hangup/>` + '</Response>';
257
+ }
258
+ /**
259
+ * Builds the `<Play digits>` TwiML for a REST-update DTMF send.
260
+ *
261
+ * Not used for live agent calls: replacing the TwiML ends the `<Connect><Stream>`, so {@link RealTwilioBindings}
262
+ * sends DTMF in-band instead. Kept for callers outside a media-streamed call.
263
+ */
216
264
  export function BuildPlayDigitsTwiML(digits) {
217
265
  return ('<?xml version="1.0" encoding="UTF-8"?>' +
218
266
  '<Response>' +
@@ -1 +1 @@
1
- {"version":3,"file":"real-twilio-bindings.js","sourceRoot":"","sources":["../src/real-twilio-bindings.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"real-twilio-bindings.js","sourceRoot":"","sources":["../src/real-twilio-bindings.ts"],"names":[],"mappings":"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"}
@@ -117,6 +117,15 @@ export interface ITwilioClientBindings {
117
117
  * @param callSid The Call SID whose playback buffer to clear.
118
118
  */
119
119
  flushOutbound(callSid: string): void;
120
+ /**
121
+ * **Optional.** Speaks `message` to the caller and then hangs up, in one carrier-side step (REST
122
+ * `calls(sid).update({ twiml: '<Say>…</Say><Hangup/>' })`). The call is ending anyway, so replacing its TwiML
123
+ * (which ends the media stream) is what we want here. When absent the SDK just completes the call.
124
+ *
125
+ * @param callSid The Call SID.
126
+ * @param message The text to speak.
127
+ */
128
+ sayAndHangup?(callSid: string, message: string): Promise<void>;
120
129
  }
121
130
  /**
122
131
  * Twilio's implementation of the {@link ITelephonyCallSdk} telephony seam over **Twilio Programmable
@@ -159,6 +168,10 @@ export declare class TwilioCallSdk implements ITelephonyCallSdk {
159
168
  onCallEnded(cb: () => void): void;
160
169
  /** @inheritdoc */
161
170
  flushOutbound(): void;
171
+ /** @inheritdoc — after a transfer / goodbye Twilio owns the call; just forget it locally, never hang it up. */
172
+ detach(_callId: string): Promise<void>;
173
+ /** @inheritdoc — speaks the message and hangs up at Twilio; completes the call when the bindings cannot speak. */
174
+ playMessageAndHangup(callId: string, message: string): Promise<void>;
162
175
  /** Binds the active Call SID and (re-)registers any handlers the driver set before the call existed. */
163
176
  private bindCall;
164
177
  }
@@ -1 +1 @@
1
- {"version":3,"file":"twilio-call-sdk.d.ts","sourceRoot":"","sources":["../src/twilio-call-sdk.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"twilio-call-sdk.d.ts","sourceRoot":"","sources":["../src/twilio-call-sdk.ts"],"names":[],"mappings":"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"}
@@ -134,6 +134,19 @@ export class TwilioCallSdk {
134
134
  this.bindings.flushOutbound(this.activeCallSid);
135
135
  }
136
136
  }
137
+ /** @inheritdoc — after a transfer / goodbye Twilio owns the call; just forget it locally, never hang it up. */
138
+ async detach(_callId) {
139
+ this.activeCallSid = null;
140
+ }
141
+ /** @inheritdoc — speaks the message and hangs up at Twilio; completes the call when the bindings cannot speak. */
142
+ async playMessageAndHangup(callId, message) {
143
+ if (this.bindings.sayAndHangup) {
144
+ await this.bindings.sayAndHangup(callId, message);
145
+ }
146
+ else {
147
+ await this.bindings.completeCall(callId);
148
+ }
149
+ }
137
150
  /** Binds the active Call SID and (re-)registers any handlers the driver set before the call existed. */
138
151
  bindCall(callSid) {
139
152
  this.activeCallSid = callSid;
@@ -1 +1 @@
1
- {"version":3,"file":"twilio-call-sdk.js","sourceRoot":"","sources":["../src/twilio-call-sdk.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAqCG;AA+FH,mGAAmG;AACnG,MAAM,gBAAgB,GAA0B;IAC5C,UAAU,EAAE,GAAG,EAAE,CAAC,YAAY,CAAC,4BAA4B,CAAC;IAC5D,aAAa,EAAE,GAAG,EAAE,CAAC,YAAY,CAAC,gCAAgC,CAAC;IACnE,YAAY,EAAE,GAAG,EAAE,CAAC,YAAY,CAAC,uBAAuB,CAAC;IACzD,eAAe,EAAE,GAAG,EAAE,CAAC,gBAAgB,CAAC,kCAAkC,CAAC;IAC3E,aAAa,EAAE,GAAG,EAAE,CAAC,gBAAgB,CAAC,+BAA+B,CAAC;IACtE,UAAU,EAAE,GAAG,EAAE,CAAC,YAAY,CAAC,wBAAwB,CAAC;IACxD,QAAQ,EAAE,GAAG,EAAE,CAAC,gBAAgB,CAAC,yBAAyB,CAAC;IAC3D,YAAY,EAAE,GAAG,EAAE,CAAC,YAAY,CAAC,yBAAyB,CAAC;IAC3D,YAAY,EAAE,GAAG,EAAE,CAAC,gBAAgB,CAAC,2BAA2B,CAAC;IACjE,aAAa,EAAE,GAAG,EAAE,CAAC,gBAAgB,CAAC,uCAAuC,CAAC;CACjF,CAAC;AAEF,SAAS,YAAY,CAAC,EAAU;IAC5B,MAAM,IAAI,KAAK,CACX,6DAA6D,EAAE,2BAA2B;QACtF,mGAAmG,CAC1G,CAAC;AACN,CAAC;AAED,SAAS,gBAAgB,CAAC,EAAU;IAChC,YAAY,CAAC,EAAE,CAAC,CAAC;AACrB,CAAC;AAED;;;;;;;;GAQG;AACH,MAAM,OAAO,aAAa;IAQtB;;;OAGG;IACH,YAA6B,WAAkC,gBAAgB;QAAlD,aAAQ,GAAR,QAAQ,CAA0C;QAX/E,0FAA0F;QAClF,kBAAa,GAAkB,IAAI,CAAC;IAUsC,CAAC;IAEnF,kBAAkB;IACX,KAAK,CAAC,IAAI,CAAC,QAAgB,EAAE,UAAkB,EAAE,IAA8B;QAClF,MAAM,GAAG,GAAG,MAAM,IAAI,CAAC,QAAQ,CAAC,UAAU,CAAC,QAAQ,EAAE,UAAU,EAAE,IAAI,CAAC,CAAC;QACvE,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC;QACnB,OAAO,GAAG,CAAC;IACf,CAAC;IAED,kBAAkB;IACX,KAAK,CAAC,MAAM,CAAC,MAAc;QAC9B,MAAM,IAAI,CAAC,QAAQ,CAAC,aAAa,CAAC,MAAM,CAAC,CAAC;QAC1C,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC;IAC1B,CAAC;IAED,kBAAkB;IACX,KAAK,CAAC,MAAM,CAAC,MAAc;QAC9B,MAAM,IAAI,CAAC,QAAQ,CAAC,YAAY,CAAC,MAAM,CAAC,CAAC;QACzC,IAAI,CAAC,aAAa,GAAG,IAAI,CAAC;IAC9B,CAAC;IAED,kBAAkB;IACX,cAAc,CAAC,GAAgB;QAClC,IAAI,IAAI,CAAC,aAAa,EAAE,CAAC;YACrB,IAAI,CAAC,QAAQ,CAAC,eAAe,CAAC,IAAI,CAAC,aAAa,EAAE,GAAG,CAAC,CAAC;QAC3D,CAAC;IACL,CAAC;IAED,kBAAkB;IACX,YAAY,CAAC,EAA8B;QAC9C,IAAI,CAAC,OAAO,GAAG,EAAE,CAAC;QAClB,IAAI,IAAI,CAAC,aAAa,EAAE,CAAC;YACrB,IAAI,CAAC,QAAQ,CAAC,aAAa,CAAC,IAAI,CAAC,aAAa,EAAE,EAAE,CAAC,CAAC;QACxD,CAAC;IACL,CAAC;IAED,kBAAkB;IACX,KAAK,CAAC,QAAQ,CAAC,MAAc;QAChC,IAAI,IAAI,CAAC,aAAa,EAAE,CAAC;YACrB,MAAM,IAAI,CAAC,QAAQ,CAAC,UAAU,CAAC,IAAI,CAAC,aAAa,EAAE,MAAM,CAAC,CAAC;QAC/D,CAAC;IACL,CAAC;IAED,kBAAkB;IACX,MAAM,CAAC,EAA4B;QACtC,IAAI,CAAC,MAAM,GAAG,EAAE,CAAC;QACjB,IAAI,IAAI,CAAC,aAAa,EAAE,CAAC;YACrB,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,IAAI,CAAC,aAAa,EAAE,EAAE,CAAC,CAAC;QACnD,CAAC;IACL,CAAC;IAED,kBAAkB;IACX,KAAK,CAAC,QAAQ,CAAC,MAAc,EAAE,QAAgB;QAClD,MAAM,IAAI,CAAC,QAAQ,CAAC,YAAY,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAC;IACvD,CAAC;IAED,kBAAkB;IACX,WAAW,CAAC,EAAc;QAC7B,IAAI,CAAC,OAAO,GAAG,EAAE,CAAC;QAClB,IAAI,IAAI,CAAC,aAAa,EAAE,CAAC;YACrB,IAAI,CAAC,QAAQ,CAAC,YAAY,CAAC,IAAI,CAAC,aAAa,EAAE,EAAE,CAAC,CAAC;QACvD,CAAC;IACL,CAAC;IAED,kBAAkB;IACX,aAAa;QAChB,IAAI,IAAI,CAAC,aAAa,EAAE,CAAC;YACrB,IAAI,CAAC,QAAQ,CAAC,aAAa,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC;QACpD,CAAC;IACL,CAAC;IAED,wGAAwG;IAChG,QAAQ,CAAC,OAAe;QAC5B,IAAI,CAAC,aAAa,GAAG,OAAO,CAAC;QAC7B,IAAI,IAAI,CAAC,OAAO,EAAE,CAAC;YACf,IAAI,CAAC,QAAQ,CAAC,aAAa,CAAC,OAAO,EAAE,IAAI,CAAC,OAAO,CAAC,CAAC;QACvD,CAAC;QACD,IAAI,IAAI,CAAC,MAAM,EAAE,CAAC;YACd,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,OAAO,EAAE,IAAI,CAAC,MAAM,CAAC,CAAC;QACjD,CAAC;QACD,IAAI,IAAI,CAAC,OAAO,EAAE,CAAC;YACf,IAAI,CAAC,QAAQ,CAAC,YAAY,CAAC,OAAO,EAAE,IAAI,CAAC,OAAO,CAAC,CAAC;QACtD,CAAC;IACL,CAAC;CACJ;AAED;;;;;;;;GAQG;AACH,MAAM,CAAC,MAAM,oBAAoB,GAAG,CAAC,OAAiC,EAAiB,EAAE;IACrF,OAAO,IAAI,aAAa,EAAE,CAAC;AAC/B,CAAC,CAAC"}
1
+ {"version":3,"file":"twilio-call-sdk.js","sourceRoot":"","sources":["../src/twilio-call-sdk.ts"],"names":[],"mappings":"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"}
@@ -52,9 +52,10 @@ export declare function computeTwilioSignature(authToken: string, url: string, p
52
52
  * inbound and outbound legs share one media contract.
53
53
  *
54
54
  * @param streamWssUrl The `wss://…/telephony/twilio/media` endpoint to connect the inbound call's audio to.
55
+ * @param parameters Optional custom `<Parameter>`s Twilio echoes on the `start` frame (the per-call media token).
55
56
  * @returns The TwiML document string to return to Twilio as the webhook response.
56
57
  */
57
- export declare function BuildInboundVoiceTwiML(streamWssUrl: string): string;
58
+ export declare function BuildInboundVoiceTwiML(streamWssUrl: string, parameters?: Record<string, string>): string;
58
59
  /** @deprecated Use {@link BuildInboundVoiceTwiML}. */
59
60
  export declare function buildInboundVoiceTwiML(streamWssUrl: string): string;
60
61
  /** The resolved identity of an inbound Twilio call, mapped from the voice-webhook params. */
@@ -78,4 +79,21 @@ export interface ResolvedInboundCall {
78
79
  export declare function ResolveInboundCall(params: Record<string, string>): ResolvedInboundCall;
79
80
  /** @deprecated Use {@link ResolveInboundCall}. */
80
81
  export declare function resolveInboundCall(params: Record<string, string>): ResolvedInboundCall;
82
+ /**
83
+ * Whether a Twilio `CallStatus` is terminal (`completed`, `busy`, `failed`, `no-answer`, `canceled`). Pure.
84
+ * An unknown or missing status is NOT terminal — an unrecognized value must never tear down a live call.
85
+ *
86
+ * @param status The `CallStatus` param from a status-callback webhook.
87
+ * @returns `true` when the call has ended.
88
+ */
89
+ export declare function IsTerminalTwilioCallStatus(status: string | undefined): boolean;
90
+ /**
91
+ * Whether an async-AMD `AnsweredBy` verdict means a machine (or fax) picked up rather than a person:
92
+ * `machine_start`, `machine_end_beep`, `machine_end_silence`, `machine_end_other`, `fax`. `human` and
93
+ * `unknown` are NOT machines — an inconclusive verdict must never hang up on a possible human. Pure.
94
+ *
95
+ * @param answeredBy The `AnsweredBy` param from the async-AMD callback.
96
+ * @returns `true` when the verdict is a machine or fax.
97
+ */
98
+ export declare function IsMachineAnsweredBy(answeredBy: string | undefined): boolean;
81
99
  //# sourceMappingURL=twilio-ingress.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"twilio-ingress.d.ts","sourceRoot":"","sources":["../src/twilio-ingress.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAKH;;;;;;;;;;;;;;;;;GAiBG;AACH,wBAAgB,qBAAqB,CACjC,SAAS,EAAE,MAAM,EACjB,eAAe,EAAE,MAAM,GAAG,SAAS,EACnC,GAAG,EAAE,MAAM,EACX,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAC/B,OAAO,CAMT;AAED,qDAAqD;AACrD,wBAAgB,qBAAqB,CACjC,SAAS,EAAE,MAAM,EACjB,eAAe,EAAE,MAAM,GAAG,SAAS,EACnC,GAAG,EAAE,MAAM,EACX,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAC/B,OAAO,CAET;AAED;;;;;;;;GAQG;AACH,wBAAgB,sBAAsB,CAAC,SAAS,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,MAAM,CAG7G;AAED,sDAAsD;AACtD,wBAAgB,sBAAsB,CAAC,SAAS,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,MAAM,CAE7G;AAED;;;;;;;GAOG;AACH,wBAAgB,sBAAsB,CAAC,YAAY,EAAE,MAAM,GAAG,MAAM,CAEnE;AAED,sDAAsD;AACtD,wBAAgB,sBAAsB,CAAC,YAAY,EAAE,MAAM,GAAG,MAAM,CAEnE;AAED,6FAA6F;AAC7F,MAAM,WAAW,mBAAmB;IAChC,+CAA+C;IAC/C,OAAO,EAAE,MAAM,CAAC;IAChB,2CAA2C;IAC3C,IAAI,EAAE,MAAM,CAAC;IACb,wDAAwD;IACxD,EAAE,EAAE,MAAM,CAAC;CACd;AAED;;;;;;;;GAQG;AACH,wBAAgB,kBAAkB,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,mBAAmB,CAWtF;AAED,kDAAkD;AAClD,wBAAgB,kBAAkB,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,mBAAmB,CAEtF"}
1
+ {"version":3,"file":"twilio-ingress.d.ts","sourceRoot":"","sources":["../src/twilio-ingress.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAKH;;;;;;;;;;;;;;;;;GAiBG;AACH,wBAAgB,qBAAqB,CACjC,SAAS,EAAE,MAAM,EACjB,eAAe,EAAE,MAAM,GAAG,SAAS,EACnC,GAAG,EAAE,MAAM,EACX,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAC/B,OAAO,CAMT;AAED,qDAAqD;AACrD,wBAAgB,qBAAqB,CACjC,SAAS,EAAE,MAAM,EACjB,eAAe,EAAE,MAAM,GAAG,SAAS,EACnC,GAAG,EAAE,MAAM,EACX,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAC/B,OAAO,CAET;AAED;;;;;;;;GAQG;AACH,wBAAgB,sBAAsB,CAAC,SAAS,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,MAAM,CAG7G;AAED,sDAAsD;AACtD,wBAAgB,sBAAsB,CAAC,SAAS,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,MAAM,CAE7G;AAED;;;;;;;;GAQG;AACH,wBAAgB,sBAAsB,CAAC,YAAY,EAAE,MAAM,EAAE,UAAU,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,MAAM,CAExG;AAED,sDAAsD;AACtD,wBAAgB,sBAAsB,CAAC,YAAY,EAAE,MAAM,GAAG,MAAM,CAEnE;AAED,6FAA6F;AAC7F,MAAM,WAAW,mBAAmB;IAChC,+CAA+C;IAC/C,OAAO,EAAE,MAAM,CAAC;IAChB,2CAA2C;IAC3C,IAAI,EAAE,MAAM,CAAC;IACb,wDAAwD;IACxD,EAAE,EAAE,MAAM,CAAC;CACd;AAED;;;;;;;;GAQG;AACH,wBAAgB,kBAAkB,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,mBAAmB,CAWtF;AAED,kDAAkD;AAClD,wBAAgB,kBAAkB,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,mBAAmB,CAEtF;AAKD;;;;;;GAMG;AACH,wBAAgB,0BAA0B,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,GAAG,OAAO,CAE9E;AAED;;;;;;;GAOG;AACH,wBAAgB,mBAAmB,CAAC,UAAU,EAAE,MAAM,GAAG,SAAS,GAAG,OAAO,CAM3E"}
@@ -67,10 +67,11 @@ export function computeTwilioSignature(authToken, url, params) {
67
67
  * inbound and outbound legs share one media contract.
68
68
  *
69
69
  * @param streamWssUrl The `wss://…/telephony/twilio/media` endpoint to connect the inbound call's audio to.
70
+ * @param parameters Optional custom `<Parameter>`s Twilio echoes on the `start` frame (the per-call media token).
70
71
  * @returns The TwiML document string to return to Twilio as the webhook response.
71
72
  */
72
- export function BuildInboundVoiceTwiML(streamWssUrl) {
73
- return BuildConnectStreamTwiML(streamWssUrl);
73
+ export function BuildInboundVoiceTwiML(streamWssUrl, parameters) {
74
+ return BuildConnectStreamTwiML(streamWssUrl, parameters);
74
75
  }
75
76
  /** @deprecated Use {@link BuildInboundVoiceTwiML}. */
76
77
  export function buildInboundVoiceTwiML(streamWssUrl) {
@@ -99,6 +100,33 @@ export function ResolveInboundCall(params) {
99
100
  export function resolveInboundCall(params) {
100
101
  return ResolveInboundCall(params);
101
102
  }
103
+ /** Twilio call-status values that mean the call is over and will never carry media again. */
104
+ const TWILIO_TERMINAL_CALL_STATUSES = new Set(['completed', 'busy', 'failed', 'no-answer', 'canceled']);
105
+ /**
106
+ * Whether a Twilio `CallStatus` is terminal (`completed`, `busy`, `failed`, `no-answer`, `canceled`). Pure.
107
+ * An unknown or missing status is NOT terminal — an unrecognized value must never tear down a live call.
108
+ *
109
+ * @param status The `CallStatus` param from a status-callback webhook.
110
+ * @returns `true` when the call has ended.
111
+ */
112
+ export function IsTerminalTwilioCallStatus(status) {
113
+ return status !== undefined && TWILIO_TERMINAL_CALL_STATUSES.has(status.trim().toLowerCase());
114
+ }
115
+ /**
116
+ * Whether an async-AMD `AnsweredBy` verdict means a machine (or fax) picked up rather than a person:
117
+ * `machine_start`, `machine_end_beep`, `machine_end_silence`, `machine_end_other`, `fax`. `human` and
118
+ * `unknown` are NOT machines — an inconclusive verdict must never hang up on a possible human. Pure.
119
+ *
120
+ * @param answeredBy The `AnsweredBy` param from the async-AMD callback.
121
+ * @returns `true` when the verdict is a machine or fax.
122
+ */
123
+ export function IsMachineAnsweredBy(answeredBy) {
124
+ if (!answeredBy) {
125
+ return false;
126
+ }
127
+ const value = answeredBy.trim().toLowerCase();
128
+ return value.startsWith('machine') || value === 'fax';
129
+ }
102
130
  /** Concatenates params sorted by key as `key + value` (Twilio's signature input), with no separators. */
103
131
  function concatSortedParams(params) {
104
132
  return Object.keys(params)
@@ -1 +1 @@
1
- {"version":3,"file":"twilio-ingress.js","sourceRoot":"","sources":["../src/twilio-ingress.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"twilio-ingress.js","sourceRoot":"","sources":["../src/twilio-ingress.ts"],"names":[],"mappings":"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"}
@@ -68,7 +68,8 @@ export declare const defaultTwilioRestModuleLoader: TwilioRestModuleLoader;
68
68
  /**
69
69
  * A real {@link ITwilioRestLike} over the `twilio` SDK's Programmable Voice REST API.
70
70
  *
71
- * - `CreateCall` → `client.calls.create({ to, from, twiml, statusCallback })`, resolving the new Call SID.
71
+ * - `CreateCall` → `client.calls.create({ to, from, twiml, statusCallback, statusCallbackEvent, machineDetection, asyncAmd, … })`,
72
+ * resolving the new Call SID.
72
73
  * - `UpdateCall` → `client.calls(sid).update({ status, twiml })` for hangup / transfer / DTMF.
73
74
  *
74
75
  * The constructed client is built once on first use and reused for the life of the instance.
@@ -1 +1 @@
1
- {"version":3,"file":"twilio-rest-client.d.ts","sourceRoot":"","sources":["../src/twilio-rest-client.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;GAiBG;AAEH,OAAO,KAAK,EAAE,eAAe,EAAE,sBAAsB,EAAE,sBAAsB,EAAE,MAAM,2BAA2B,CAAC;AAOjH,gGAAgG;AAChG,MAAM,WAAW,sBAAsB;IACnC,GAAG,EAAE,MAAM,CAAC;CACf;AAED,uGAAuG;AACvG,MAAM,WAAW,qBAAqB;IAClC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;CAC7D;AAED;;;GAGG;AACH,MAAM,WAAW,uBAAuB;IACpC,CAAC,OAAO,EAAE,MAAM,GAAG,qBAAqB,CAAC;IACzC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,OAAO,CAAC,sBAAsB,CAAC,CAAC;CAC5E;AAED,iEAAiE;AACjE,MAAM,WAAW,oBAAoB;IACjC,KAAK,EAAE,uBAAuB,CAAC;CAClC;AAED;;;GAGG;AACH,MAAM,MAAM,mBAAmB,GAAG,CAC9B,oBAAoB,EAAE,MAAM,EAC5B,QAAQ,EAAE,MAAM,EAChB,IAAI,CAAC,EAAE;IAAE,UAAU,CAAC,EAAE,MAAM,CAAA;CAAE,KAC7B,oBAAoB,CAAC;AAE1B,2GAA2G;AAC3G,MAAM,MAAM,sBAAsB,GAAG,MAAM,OAAO,CAAC,mBAAmB,CAAC,CAAC;AAExE,qHAAqH;AACrH,MAAM,WAAW,qBAAqB;IAClC,qHAAqH;IACrH,UAAU,EAAE,MAAM,CAAC;IACnB,wHAAwH;IACxH,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,kHAAkH;IAClH,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,sDAAsD;IACtD,YAAY,CAAC,EAAE,MAAM,CAAC;CACzB;AAED;;;;GAIG;AACH,eAAO,MAAM,6BAA6B,EAAE,sBAe3C,CAAC;AAEF,6DAA6D;AAC7D,eAAO,MAAM,6BAA6B,EAAE,sBAAsD,CAAC;AAanG;;;;;;;GAOG;AACH,qBAAa,oBAAqB,YAAW,eAAe;IACxD,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAwB;IACpD,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAyB;IACpD,kFAAkF;IAClF,OAAO,CAAC,aAAa,CAAC,CAAgC;IAEtD;;;OAGG;gBACS,WAAW,EAAE,qBAAqB,EAAE,UAAU,GAAE,sBAAsD;IAKlH,kBAAkB;IACL,UAAU,CAAC,MAAM,EAAE,sBAAsB,GAAG,OAAO,CAAC,MAAM,CAAC;IAcxE,kBAAkB;IACL,UAAU,CAAC,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,sBAAsB,GAAG,OAAO,CAAC,IAAI,CAAC;IAQvF,4GAA4G;IAC5G,OAAO,CAAC,YAAY;IAOpB,6GAA6G;YAC/F,WAAW;CAW5B"}
1
+ {"version":3,"file":"twilio-rest-client.d.ts","sourceRoot":"","sources":["../src/twilio-rest-client.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;GAiBG;AAEH,OAAO,KAAK,EAAE,eAAe,EAAE,sBAAsB,EAAE,sBAAsB,EAAE,MAAM,2BAA2B,CAAC;AAOjH,gGAAgG;AAChG,MAAM,WAAW,sBAAsB;IACnC,GAAG,EAAE,MAAM,CAAC;CACf;AAED,uGAAuG;AACvG,MAAM,WAAW,qBAAqB;IAClC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;CAC7D;AAED;;;GAGG;AACH,MAAM,WAAW,uBAAuB;IACpC,CAAC,OAAO,EAAE,MAAM,GAAG,qBAAqB,CAAC;IACzC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,OAAO,CAAC,sBAAsB,CAAC,CAAC;CAC5E;AAED,iEAAiE;AACjE,MAAM,WAAW,oBAAoB;IACjC,KAAK,EAAE,uBAAuB,CAAC;CAClC;AAED;;;GAGG;AACH,MAAM,MAAM,mBAAmB,GAAG,CAC9B,oBAAoB,EAAE,MAAM,EAC5B,QAAQ,EAAE,MAAM,EAChB,IAAI,CAAC,EAAE;IAAE,UAAU,CAAC,EAAE,MAAM,CAAA;CAAE,KAC7B,oBAAoB,CAAC;AAE1B,2GAA2G;AAC3G,MAAM,MAAM,sBAAsB,GAAG,MAAM,OAAO,CAAC,mBAAmB,CAAC,CAAC;AAExE,qHAAqH;AACrH,MAAM,WAAW,qBAAqB;IAClC,qHAAqH;IACrH,UAAU,EAAE,MAAM,CAAC;IACnB,wHAAwH;IACxH,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,kHAAkH;IAClH,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,sDAAsD;IACtD,YAAY,CAAC,EAAE,MAAM,CAAC;CACzB;AAED;;;;GAIG;AACH,eAAO,MAAM,6BAA6B,EAAE,sBAe3C,CAAC;AAEF,6DAA6D;AAC7D,eAAO,MAAM,6BAA6B,EAAE,sBAAsD,CAAC;AAanG;;;;;;;;GAQG;AACH,qBAAa,oBAAqB,YAAW,eAAe;IACxD,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAwB;IACpD,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAyB;IACpD,kFAAkF;IAClF,OAAO,CAAC,aAAa,CAAC,CAAgC;IAEtD;;;OAGG;gBACS,WAAW,EAAE,qBAAqB,EAAE,UAAU,GAAE,sBAAsD;IAKlH,kBAAkB;IACL,UAAU,CAAC,MAAM,EAAE,sBAAsB,GAAG,OAAO,CAAC,MAAM,CAAC;IAsBxE,kBAAkB;IACL,UAAU,CAAC,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,sBAAsB,GAAG,OAAO,CAAC,IAAI,CAAC;IAQvF,4GAA4G;IAC5G,OAAO,CAAC,YAAY;IAOpB,6GAA6G;YAC/F,WAAW;CAW5B"}
@@ -51,7 +51,8 @@ function unwrapTwilioFactory(mod) {
51
51
  /**
52
52
  * A real {@link ITwilioRestLike} over the `twilio` SDK's Programmable Voice REST API.
53
53
  *
54
- * - `CreateCall` → `client.calls.create({ to, from, twiml, statusCallback })`, resolving the new Call SID.
54
+ * - `CreateCall` → `client.calls.create({ to, from, twiml, statusCallback, statusCallbackEvent, machineDetection, asyncAmd, … })`,
55
+ * resolving the new Call SID.
55
56
  * - `UpdateCall` → `client.calls(sid).update({ status, twiml })` for hangup / transfer / DTMF.
56
57
  *
57
58
  * The constructed client is built once on first use and reused for the life of the instance.
@@ -73,6 +74,14 @@ export class RealTwilioRestClient {
73
74
  from: params.From,
74
75
  twiml: params.Twiml,
75
76
  ...(params.StatusCallback ? { statusCallback: params.StatusCallback } : {}),
77
+ ...(params.StatusCallbackEvents?.length ? { statusCallbackEvent: params.StatusCallbackEvents } : {}),
78
+ ...(params.AsyncAmd && params.AsyncAmdStatusCallback
79
+ ? {
80
+ machineDetection: 'Enable',
81
+ asyncAmd: 'true',
82
+ asyncAmdStatusCallback: params.AsyncAmdStatusCallback,
83
+ }
84
+ : {}),
76
85
  });
77
86
  if (!created?.sid) {
78
87
  throw new Error('Twilio calls.create returned no Call SID.');
@@ -1 +1 @@
1
- {"version":3,"file":"twilio-rest-client.js","sourceRoot":"","sources":["../src/twilio-rest-client.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"twilio-rest-client.js","sourceRoot":"","sources":["../src/twilio-rest-client.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@memberjunction/ai-bridge-twilio",
3
3
  "type": "module",
4
- "version": "6.2.0-edge.2",
4
+ "version": "6.2.0-edge.3",
5
5
  "description": "MemberJunction: Twilio Realtime Bridge driver (telephony). Connects the realtime agent engine to a phone call over Twilio Programmable Voice + Media Streams — outbound dial, inbound DID routing, single-party audio in/out, DTMF send/receive, and call transfer — via an injectable telephony call SDK seam. Audio only: no video, no screen, no Meeting Controls.",
6
6
  "main": "dist/index.js",
7
7
  "types": "dist/index.d.ts",
@@ -11,10 +11,10 @@
11
11
  "author": "MemberJunction.com",
12
12
  "license": "BUSL-1.1",
13
13
  "dependencies": {
14
- "@memberjunction/core": "6.2.0-edge.2",
15
- "@memberjunction/global": "6.2.0-edge.2",
16
- "@memberjunction/core-entities": "6.2.0-edge.2",
17
- "@memberjunction/ai-bridge-base": "6.2.0-edge.2"
14
+ "@memberjunction/core": "6.2.0-edge.3",
15
+ "@memberjunction/global": "6.2.0-edge.3",
16
+ "@memberjunction/core-entities": "6.2.0-edge.3",
17
+ "@memberjunction/ai-bridge-base": "6.2.0-edge.3"
18
18
  },
19
19
  "//optionalDependencies": "twilio is an OPTIONAL PEER SDK (CLAUDE rule 8, category 2): the package never statically imports it. Production wires RealTwilioBindings over the real twilio REST client + a Media-Streams websocket through the injected ITwilioRestLike/ITwilioMediaPump surfaces, so the package builds and unit-tests with no twilio install and no network. Loaded only when the Twilio provider is configured at deployment.",
20
20
  "optionalDependencies": {