@absolutejs/voice 0.0.22-beta.543 → 0.0.22-beta.545

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.
@@ -3007,7 +3007,9 @@ var defineVoiceSessionObservabilityElement = (tagName = "absolute-voice-session-
3007
3007
  reactiveSource: voiceSseReactiveSource(reactiveTopic, {
3008
3008
  path: this.getAttribute("reactive-path") ?? undefined
3009
3009
  })
3010
- } : { intervalMs: Number.isFinite(intervalMs) ? intervalMs : 5000 }
3010
+ } : {
3011
+ intervalMs: Number.isFinite(intervalMs) ? intervalMs : 5000
3012
+ }
3011
3013
  });
3012
3014
  }
3013
3015
  disconnectedCallback() {
@@ -3855,7 +3857,9 @@ var defineVoiceOpsStatusElement = (tagName = "absolute-voice-ops-status") => {
3855
3857
  reactiveSource: voiceSseReactiveSource(reactiveTopic, {
3856
3858
  path: this.getAttribute("reactive-path") ?? undefined
3857
3859
  })
3858
- } : { intervalMs: Number.isFinite(intervalMs) ? intervalMs : 5000 }
3860
+ } : {
3861
+ intervalMs: Number.isFinite(intervalMs) ? intervalMs : 5000
3862
+ }
3859
3863
  });
3860
3864
  }
3861
3865
  disconnectedCallback() {
@@ -8866,7 +8870,9 @@ var defineVoiceReconnectProfileEvidenceElement = (tagName = "absolute-voice-reco
8866
8870
  reactiveSource: voiceSseReactiveSource(reactiveTopic, {
8867
8871
  path: this.getAttribute("reactive-path") ?? undefined
8868
8872
  })
8869
- } : { intervalMs: Number.isFinite(intervalMs) ? intervalMs : 5000 }
8873
+ } : {
8874
+ intervalMs: Number.isFinite(intervalMs) ? intervalMs : 5000
8875
+ }
8870
8876
  });
8871
8877
  }
8872
8878
  disconnectedCallback() {
@@ -8963,7 +8969,9 @@ var defineVoiceProfileComparisonElement = (tagName = "absolute-voice-profile-com
8963
8969
  reactiveSource: voiceSseReactiveSource(reactiveTopic, {
8964
8970
  path: this.getAttribute("reactive-path") ?? undefined
8965
8971
  })
8966
- } : { intervalMs: Number.isFinite(intervalMs) ? intervalMs : 5000 }
8972
+ } : {
8973
+ intervalMs: Number.isFinite(intervalMs) ? intervalMs : 5000
8974
+ }
8967
8975
  });
8968
8976
  }
8969
8977
  disconnectedCallback() {
@@ -9032,7 +9040,9 @@ var defineVoiceProfileSwitchRecommendationElement = (tagName = "absolute-voice-p
9032
9040
  reactiveSource: voiceSseReactiveSource(reactiveTopic, {
9033
9041
  path: this.getAttribute("reactive-path") ?? undefined
9034
9042
  })
9035
- } : { intervalMs: Number.isFinite(intervalMs) ? intervalMs : 5000 }
9043
+ } : {
9044
+ intervalMs: Number.isFinite(intervalMs) ? intervalMs : 5000
9045
+ }
9036
9046
  });
9037
9047
  }
9038
9048
  disconnectedCallback() {
@@ -10009,7 +10019,9 @@ var defineVoiceDeliveryRuntimeElement = (tagName = "absolute-voice-delivery-runt
10009
10019
  reactiveSource: voiceSseReactiveSource(reactiveTopic, {
10010
10020
  path: this.getAttribute("reactive-path") ?? undefined
10011
10021
  })
10012
- } : { intervalMs: Number.isFinite(intervalMs) ? intervalMs : 5000 }
10022
+ } : {
10023
+ intervalMs: Number.isFinite(intervalMs) ? intervalMs : 5000
10024
+ }
10013
10025
  });
10014
10026
  }
10015
10027
  disconnectedCallback() {
@@ -10256,7 +10268,9 @@ var defineVoiceRoutingStatusElement = (tagName = "absolute-voice-routing-status"
10256
10268
  reactiveSource: voiceSseReactiveSource(reactiveTopic, {
10257
10269
  path: this.getAttribute("reactive-path") ?? undefined
10258
10270
  })
10259
- } : { intervalMs: Number.isFinite(intervalMs) ? intervalMs : 5000 }
10271
+ } : {
10272
+ intervalMs: Number.isFinite(intervalMs) ? intervalMs : 5000
10273
+ }
10260
10274
  });
10261
10275
  }
10262
10276
  disconnectedCallback() {
@@ -11263,7 +11277,9 @@ var defineVoiceProviderStatusElement = (tagName = "absolute-voice-provider-statu
11263
11277
  reactiveSource: voiceSseReactiveSource(reactiveTopic, {
11264
11278
  path: this.getAttribute("reactive-path") ?? undefined
11265
11279
  })
11266
- } : { intervalMs: Number.isFinite(intervalMs) ? intervalMs : 5000 }
11280
+ } : {
11281
+ intervalMs: Number.isFinite(intervalMs) ? intervalMs : 5000
11282
+ }
11267
11283
  });
11268
11284
  }
11269
11285
  disconnectedCallback() {
@@ -11383,7 +11399,9 @@ var defineVoiceProviderCapabilitiesElement = (tagName = "absolute-voice-provider
11383
11399
  reactiveSource: voiceSseReactiveSource(reactiveTopic, {
11384
11400
  path: this.getAttribute("reactive-path") ?? undefined
11385
11401
  })
11386
- } : { intervalMs: Number.isFinite(intervalMs) ? intervalMs : 5000 }
11402
+ } : {
11403
+ intervalMs: Number.isFinite(intervalMs) ? intervalMs : 5000
11404
+ }
11387
11405
  });
11388
11406
  }
11389
11407
  disconnectedCallback() {
@@ -11492,7 +11510,9 @@ var defineVoiceProviderContractsElement = (tagName = "absolute-voice-provider-co
11492
11510
  reactiveSource: voiceSseReactiveSource(reactiveTopic, {
11493
11511
  path: this.getAttribute("reactive-path") ?? undefined
11494
11512
  })
11495
- } : { intervalMs: Number.isFinite(intervalMs) ? intervalMs : 5000 }
11513
+ } : {
11514
+ intervalMs: Number.isFinite(intervalMs) ? intervalMs : 5000
11515
+ }
11496
11516
  });
11497
11517
  }
11498
11518
  disconnectedCallback() {
@@ -11614,7 +11634,9 @@ var defineVoiceTurnQualityElement = (tagName = "absolute-voice-turn-quality") =>
11614
11634
  reactiveSource: voiceSseReactiveSource(reactiveTopic, {
11615
11635
  path: this.getAttribute("reactive-path") ?? undefined
11616
11636
  })
11617
- } : { intervalMs: Number.isFinite(intervalMs) ? intervalMs : 5000 }
11637
+ } : {
11638
+ intervalMs: Number.isFinite(intervalMs) ? intervalMs : 5000
11639
+ }
11618
11640
  });
11619
11641
  }
11620
11642
  disconnectedCallback() {
@@ -11710,7 +11732,9 @@ var defineVoiceTurnLatencyElement = (tagName = "absolute-voice-turn-latency") =>
11710
11732
  reactiveSource: voiceSseReactiveSource(reactiveTopic, {
11711
11733
  path: this.getAttribute("reactive-path") ?? undefined
11712
11734
  })
11713
- } : { intervalMs: Number.isFinite(intervalMs) ? intervalMs : 5000 }
11735
+ } : {
11736
+ intervalMs: Number.isFinite(intervalMs) ? intervalMs : 5000
11737
+ }
11714
11738
  });
11715
11739
  }
11716
11740
  disconnectedCallback() {
@@ -11815,7 +11839,9 @@ var defineVoiceTraceTimelineElement = (tagName = "absolute-voice-trace-timeline"
11815
11839
  reactiveSource: voiceSseReactiveSource(reactiveTopic, {
11816
11840
  path: this.getAttribute("reactive-path") ?? undefined
11817
11841
  })
11818
- } : { intervalMs: Number.isFinite(intervalMs) ? intervalMs : 5000 }
11842
+ } : {
11843
+ intervalMs: Number.isFinite(intervalMs) ? intervalMs : 5000
11844
+ }
11819
11845
  });
11820
11846
  }
11821
11847
  disconnectedCallback() {
@@ -1,4 +1,4 @@
1
- import type { TTSAdapter, TTSAdapterOpenOptions } from './types';
1
+ import type { TTSAdapter, TTSAdapterOpenOptions } from "./types";
2
2
  export type CachedTTSOptions = {
3
3
  /**
4
4
  * Return a stable cache key for an utterance whose synthesized audio should
@@ -463,6 +463,13 @@ export type VoiceResolvedAudioConditioningConfig = {
463
463
  export type VoiceSocket = {
464
464
  send: (data: string | Uint8Array | ArrayBuffer) => void | Promise<void>;
465
465
  close: (code?: number, reason?: string) => void | Promise<void>;
466
+ /**
467
+ * Discard any audio already buffered downstream (e.g. a telephony carrier's
468
+ * outbound media buffer). Called on barge-in so the caller stops hearing the
469
+ * assistant immediately, even when frames have already been flushed to the
470
+ * transport. Optional: transports without a flush concept omit it.
471
+ */
472
+ clear?: () => void | Promise<void>;
466
473
  };
467
474
  export type VoiceMonitorRuntimeSessionBinding = {
468
475
  deregister: (reason?: string) => void;
package/dist/index.js CHANGED
@@ -4241,6 +4241,7 @@ var createVoiceSession = (options) => {
4241
4241
  return;
4242
4242
  }
4243
4243
  activeTTSTurnId = undefined;
4244
+ Promise.resolve(socket.clear?.()).catch(() => {});
4244
4245
  if (!ttsAdapterSessionCanCancel(activeSession)) {
4245
4246
  return;
4246
4247
  }
@@ -4887,6 +4888,9 @@ var createVoiceSession = (options) => {
4887
4888
  };
4888
4889
  };
4889
4890
  const handlePartial = async (transcript) => {
4891
+ if (activeTTSTurnId !== undefined && transcript.text.trim()) {
4892
+ cancelActiveTTS("barge-in");
4893
+ }
4890
4894
  const session = await writeSession((session2) => {
4891
4895
  const nextPartialStartedAt = transcript.startedAtMs ?? session2.currentTurn.partialStartedAt;
4892
4896
  const nextPartialEndedAt = transcript.endedAtMs ?? session2.currentTurn.partialEndedAt;
@@ -5660,9 +5664,6 @@ var createVoiceSession = (options) => {
5660
5664
  if (amdFirstAudioAt === undefined) {
5661
5665
  amdFirstAudioAt = Date.now();
5662
5666
  }
5663
- if (!speechDetected && activeTTSTurnId !== undefined) {
5664
- cancelActiveTTS("barge-in");
5665
- }
5666
5667
  speechDetected = true;
5667
5668
  clearSilenceTimer();
5668
5669
  kickCallSilenceWatchdog();
@@ -24059,6 +24060,14 @@ var parseTwilioMessage = (raw) => {
24059
24060
  return JSON.parse(raw);
24060
24061
  };
24061
24062
  var createTwilioSocketAdapter = (socket, getState) => ({
24063
+ clear: async () => {
24064
+ const state = getState();
24065
+ if (!state.streamSid) {
24066
+ return;
24067
+ }
24068
+ state.reviewRecorder?.recordTwilioOutbound({ event: "clear" });
24069
+ await Promise.resolve(socket.send(JSON.stringify({ event: "clear", streamSid: state.streamSid })));
24070
+ },
24062
24071
  close: async (code, reason) => {
24063
24072
  await Promise.resolve(socket.close(code, reason));
24064
24073
  },
@@ -24323,7 +24332,7 @@ var createTwilioMediaStreamBridge = (socket, options) => {
24323
24332
  event: "media",
24324
24333
  track: message.media.track
24325
24334
  });
24326
- if (options.clearOnInboundMedia !== false && bridgeState.hasOutboundAudioSinceLastInbound && bridgeState.streamSid) {
24335
+ if (options.clearOnInboundMedia === true && bridgeState.hasOutboundAudioSinceLastInbound && bridgeState.streamSid) {
24327
24336
  const outboundMessage = {
24328
24337
  event: "clear",
24329
24338
  streamSid: bridgeState.streamSid
@@ -278,7 +278,9 @@ var defineVoiceOpsStatusElement = (tagName = "absolute-voice-ops-status") => {
278
278
  reactiveSource: voiceSseReactiveSource(reactiveTopic, {
279
279
  path: this.getAttribute("reactive-path") ?? undefined
280
280
  })
281
- } : { intervalMs: Number.isFinite(intervalMs) ? intervalMs : 5000 }
281
+ } : {
282
+ intervalMs: Number.isFinite(intervalMs) ? intervalMs : 5000
283
+ }
282
284
  });
283
285
  }
284
286
  disconnectedCallback() {
@@ -991,7 +993,9 @@ var defineVoiceDeliveryRuntimeElement = (tagName = "absolute-voice-delivery-runt
991
993
  reactiveSource: voiceSseReactiveSource(reactiveTopic, {
992
994
  path: this.getAttribute("reactive-path") ?? undefined
993
995
  })
994
- } : { intervalMs: Number.isFinite(intervalMs) ? intervalMs : 5000 }
996
+ } : {
997
+ intervalMs: Number.isFinite(intervalMs) ? intervalMs : 5000
998
+ }
995
999
  });
996
1000
  }
997
1001
  disconnectedCallback() {
@@ -6555,7 +6559,9 @@ var defineVoiceReconnectProfileEvidenceElement = (tagName = "absolute-voice-reco
6555
6559
  reactiveSource: voiceSseReactiveSource(reactiveTopic, {
6556
6560
  path: this.getAttribute("reactive-path") ?? undefined
6557
6561
  })
6558
- } : { intervalMs: Number.isFinite(intervalMs) ? intervalMs : 5000 }
6562
+ } : {
6563
+ intervalMs: Number.isFinite(intervalMs) ? intervalMs : 5000
6564
+ }
6559
6565
  });
6560
6566
  }
6561
6567
  disconnectedCallback() {
@@ -7410,7 +7416,9 @@ var defineVoiceSessionObservabilityElement = (tagName = "absolute-voice-session-
7410
7416
  reactiveSource: voiceSseReactiveSource(reactiveTopic, {
7411
7417
  path: this.getAttribute("reactive-path") ?? undefined
7412
7418
  })
7413
- } : { intervalMs: Number.isFinite(intervalMs) ? intervalMs : 5000 }
7419
+ } : {
7420
+ intervalMs: Number.isFinite(intervalMs) ? intervalMs : 5000
7421
+ }
7414
7422
  });
7415
7423
  }
7416
7424
  disconnectedCallback() {
@@ -7676,7 +7684,9 @@ var defineVoiceProfileComparisonElement = (tagName = "absolute-voice-profile-com
7676
7684
  reactiveSource: voiceSseReactiveSource(reactiveTopic, {
7677
7685
  path: this.getAttribute("reactive-path") ?? undefined
7678
7686
  })
7679
- } : { intervalMs: Number.isFinite(intervalMs) ? intervalMs : 5000 }
7687
+ } : {
7688
+ intervalMs: Number.isFinite(intervalMs) ? intervalMs : 5000
7689
+ }
7680
7690
  });
7681
7691
  }
7682
7692
  disconnectedCallback() {
@@ -7930,7 +7940,9 @@ var defineVoiceProfileSwitchRecommendationElement = (tagName = "absolute-voice-p
7930
7940
  reactiveSource: voiceSseReactiveSource(reactiveTopic, {
7931
7941
  path: this.getAttribute("reactive-path") ?? undefined
7932
7942
  })
7933
- } : { intervalMs: Number.isFinite(intervalMs) ? intervalMs : 5000 }
7943
+ } : {
7944
+ intervalMs: Number.isFinite(intervalMs) ? intervalMs : 5000
7945
+ }
7934
7946
  });
7935
7947
  }
7936
7948
  disconnectedCallback() {
@@ -8751,7 +8763,9 @@ var defineVoiceProviderCapabilitiesElement = (tagName = "absolute-voice-provider
8751
8763
  reactiveSource: voiceSseReactiveSource(reactiveTopic, {
8752
8764
  path: this.getAttribute("reactive-path") ?? undefined
8753
8765
  })
8754
- } : { intervalMs: Number.isFinite(intervalMs) ? intervalMs : 5000 }
8766
+ } : {
8767
+ intervalMs: Number.isFinite(intervalMs) ? intervalMs : 5000
8768
+ }
8755
8769
  });
8756
8770
  }
8757
8771
  disconnectedCallback() {
@@ -9040,7 +9054,9 @@ var defineVoiceProviderContractsElement = (tagName = "absolute-voice-provider-co
9040
9054
  reactiveSource: voiceSseReactiveSource(reactiveTopic, {
9041
9055
  path: this.getAttribute("reactive-path") ?? undefined
9042
9056
  })
9043
- } : { intervalMs: Number.isFinite(intervalMs) ? intervalMs : 5000 }
9057
+ } : {
9058
+ intervalMs: Number.isFinite(intervalMs) ? intervalMs : 5000
9059
+ }
9044
9060
  });
9045
9061
  }
9046
9062
  disconnectedCallback() {
@@ -9363,7 +9379,9 @@ var defineVoiceProviderStatusElement = (tagName = "absolute-voice-provider-statu
9363
9379
  reactiveSource: voiceSseReactiveSource(reactiveTopic, {
9364
9380
  path: this.getAttribute("reactive-path") ?? undefined
9365
9381
  })
9366
- } : { intervalMs: Number.isFinite(intervalMs) ? intervalMs : 5000 }
9382
+ } : {
9383
+ intervalMs: Number.isFinite(intervalMs) ? intervalMs : 5000
9384
+ }
9367
9385
  });
9368
9386
  }
9369
9387
  disconnectedCallback() {
@@ -9694,7 +9712,9 @@ var defineVoiceRoutingStatusElement = (tagName = "absolute-voice-routing-status"
9694
9712
  reactiveSource: voiceSseReactiveSource(reactiveTopic, {
9695
9713
  path: this.getAttribute("reactive-path") ?? undefined
9696
9714
  })
9697
- } : { intervalMs: Number.isFinite(intervalMs) ? intervalMs : 5000 }
9715
+ } : {
9716
+ intervalMs: Number.isFinite(intervalMs) ? intervalMs : 5000
9717
+ }
9698
9718
  });
9699
9719
  }
9700
9720
  disconnectedCallback() {
@@ -9932,7 +9952,9 @@ var defineVoiceTraceTimelineElement = (tagName = "absolute-voice-trace-timeline"
9932
9952
  reactiveSource: voiceSseReactiveSource(reactiveTopic, {
9933
9953
  path: this.getAttribute("reactive-path") ?? undefined
9934
9954
  })
9935
- } : { intervalMs: Number.isFinite(intervalMs) ? intervalMs : 5000 }
9955
+ } : {
9956
+ intervalMs: Number.isFinite(intervalMs) ? intervalMs : 5000
9957
+ }
9936
9958
  });
9937
9959
  }
9938
9960
  disconnectedCallback() {
@@ -10520,7 +10542,9 @@ var defineVoiceTurnLatencyElement = (tagName = "absolute-voice-turn-latency") =>
10520
10542
  reactiveSource: voiceSseReactiveSource(reactiveTopic, {
10521
10543
  path: this.getAttribute("reactive-path") ?? undefined
10522
10544
  })
10523
- } : { intervalMs: Number.isFinite(intervalMs) ? intervalMs : 5000 }
10545
+ } : {
10546
+ intervalMs: Number.isFinite(intervalMs) ? intervalMs : 5000
10547
+ }
10524
10548
  });
10525
10549
  }
10526
10550
  disconnectedCallback() {
@@ -10837,7 +10861,9 @@ var defineVoiceTurnQualityElement = (tagName = "absolute-voice-turn-quality") =>
10837
10861
  reactiveSource: voiceSseReactiveSource(reactiveTopic, {
10838
10862
  path: this.getAttribute("reactive-path") ?? undefined
10839
10863
  })
10840
- } : { intervalMs: Number.isFinite(intervalMs) ? intervalMs : 5000 }
10864
+ } : {
10865
+ intervalMs: Number.isFinite(intervalMs) ? intervalMs : 5000
10866
+ }
10841
10867
  });
10842
10868
  }
10843
10869
  disconnectedCallback() {
@@ -2646,7 +2646,9 @@ var defineVoiceDeliveryRuntimeElement = (tagName = "absolute-voice-delivery-runt
2646
2646
  reactiveSource: voiceSseReactiveSource(reactiveTopic, {
2647
2647
  path: this.getAttribute("reactive-path") ?? undefined
2648
2648
  })
2649
- } : { intervalMs: Number.isFinite(intervalMs) ? intervalMs : 5000 }
2649
+ } : {
2650
+ intervalMs: Number.isFinite(intervalMs) ? intervalMs : 5000
2651
+ }
2650
2652
  });
2651
2653
  }
2652
2654
  disconnectedCallback() {
@@ -4737,7 +4739,9 @@ var defineVoiceOpsStatusElement = (tagName = "absolute-voice-ops-status") => {
4737
4739
  reactiveSource: voiceSseReactiveSource(reactiveTopic, {
4738
4740
  path: this.getAttribute("reactive-path") ?? undefined
4739
4741
  })
4740
- } : { intervalMs: Number.isFinite(intervalMs) ? intervalMs : 5000 }
4742
+ } : {
4743
+ intervalMs: Number.isFinite(intervalMs) ? intervalMs : 5000
4744
+ }
4741
4745
  });
4742
4746
  }
4743
4747
  disconnectedCallback() {
@@ -5661,7 +5665,9 @@ var defineVoiceSessionObservabilityElement = (tagName = "absolute-voice-session-
5661
5665
  reactiveSource: voiceSseReactiveSource(reactiveTopic, {
5662
5666
  path: this.getAttribute("reactive-path") ?? undefined
5663
5667
  })
5664
- } : { intervalMs: Number.isFinite(intervalMs) ? intervalMs : 5000 }
5668
+ } : {
5669
+ intervalMs: Number.isFinite(intervalMs) ? intervalMs : 5000
5670
+ }
5665
5671
  });
5666
5672
  }
5667
5673
  disconnectedCallback() {
@@ -6232,7 +6238,9 @@ var defineVoiceProviderCapabilitiesElement = (tagName = "absolute-voice-provider
6232
6238
  reactiveSource: voiceSseReactiveSource(reactiveTopic, {
6233
6239
  path: this.getAttribute("reactive-path") ?? undefined
6234
6240
  })
6235
- } : { intervalMs: Number.isFinite(intervalMs) ? intervalMs : 5000 }
6241
+ } : {
6242
+ intervalMs: Number.isFinite(intervalMs) ? intervalMs : 5000
6243
+ }
6236
6244
  });
6237
6245
  }
6238
6246
  disconnectedCallback() {
@@ -6431,7 +6439,9 @@ var defineVoiceProviderContractsElement = (tagName = "absolute-voice-provider-co
6431
6439
  reactiveSource: voiceSseReactiveSource(reactiveTopic, {
6432
6440
  path: this.getAttribute("reactive-path") ?? undefined
6433
6441
  })
6434
- } : { intervalMs: Number.isFinite(intervalMs) ? intervalMs : 5000 }
6442
+ } : {
6443
+ intervalMs: Number.isFinite(intervalMs) ? intervalMs : 5000
6444
+ }
6435
6445
  });
6436
6446
  }
6437
6447
  disconnectedCallback() {
@@ -6650,7 +6660,9 @@ var defineVoiceProviderStatusElement = (tagName = "absolute-voice-provider-statu
6650
6660
  reactiveSource: voiceSseReactiveSource(reactiveTopic, {
6651
6661
  path: this.getAttribute("reactive-path") ?? undefined
6652
6662
  })
6653
- } : { intervalMs: Number.isFinite(intervalMs) ? intervalMs : 5000 }
6663
+ } : {
6664
+ intervalMs: Number.isFinite(intervalMs) ? intervalMs : 5000
6665
+ }
6654
6666
  });
6655
6667
  }
6656
6668
  disconnectedCallback() {
@@ -6891,7 +6903,9 @@ var defineVoiceRoutingStatusElement = (tagName = "absolute-voice-routing-status"
6891
6903
  reactiveSource: voiceSseReactiveSource(reactiveTopic, {
6892
6904
  path: this.getAttribute("reactive-path") ?? undefined
6893
6905
  })
6894
- } : { intervalMs: Number.isFinite(intervalMs) ? intervalMs : 5000 }
6906
+ } : {
6907
+ intervalMs: Number.isFinite(intervalMs) ? intervalMs : 5000
6908
+ }
6895
6909
  });
6896
6910
  }
6897
6911
  disconnectedCallback() {
@@ -7082,7 +7096,9 @@ var defineVoiceTraceTimelineElement = (tagName = "absolute-voice-trace-timeline"
7082
7096
  reactiveSource: voiceSseReactiveSource(reactiveTopic, {
7083
7097
  path: this.getAttribute("reactive-path") ?? undefined
7084
7098
  })
7085
- } : { intervalMs: Number.isFinite(intervalMs) ? intervalMs : 5000 }
7099
+ } : {
7100
+ intervalMs: Number.isFinite(intervalMs) ? intervalMs : 5000
7101
+ }
7086
7102
  });
7087
7103
  }
7088
7104
  disconnectedCallback() {
@@ -7476,7 +7492,9 @@ var defineVoiceTurnLatencyElement = (tagName = "absolute-voice-turn-latency") =>
7476
7492
  reactiveSource: voiceSseReactiveSource(reactiveTopic, {
7477
7493
  path: this.getAttribute("reactive-path") ?? undefined
7478
7494
  })
7479
- } : { intervalMs: Number.isFinite(intervalMs) ? intervalMs : 5000 }
7495
+ } : {
7496
+ intervalMs: Number.isFinite(intervalMs) ? intervalMs : 5000
7497
+ }
7480
7498
  });
7481
7499
  }
7482
7500
  disconnectedCallback() {
@@ -7698,7 +7716,9 @@ var defineVoiceTurnQualityElement = (tagName = "absolute-voice-turn-quality") =>
7698
7716
  reactiveSource: voiceSseReactiveSource(reactiveTopic, {
7699
7717
  path: this.getAttribute("reactive-path") ?? undefined
7700
7718
  })
7701
- } : { intervalMs: Number.isFinite(intervalMs) ? intervalMs : 5000 }
7719
+ } : {
7720
+ intervalMs: Number.isFinite(intervalMs) ? intervalMs : 5000
7721
+ }
7702
7722
  });
7703
7723
  }
7704
7724
  disconnectedCallback() {
@@ -79,6 +79,14 @@ export type TwilioMediaStreamSocket = {
79
79
  send: (data: string) => void | Promise<void>;
80
80
  };
81
81
  export type TwilioMediaStreamBridgeOptions<TContext = unknown, TSession extends VoiceSessionRecord = VoiceSessionRecord, TResult = unknown> = Omit<VoicePluginConfig<TContext, TSession, TResult>, "htmx" | "path" | "stt"> & {
82
+ /**
83
+ * Legacy barge-in: send the carrier a "clear" on every inbound media frame
84
+ * once the assistant has spoken. Defaults to `false` — a phone line streams
85
+ * inbound audio continuously (silence included), so this flushes the
86
+ * assistant constantly. Barge-in is handled speech-gated by the session
87
+ * (`socket.clear()` on detected speech); only set `true` to force the old
88
+ * frame-level behavior.
89
+ */
82
90
  clearOnInboundMedia?: boolean;
83
91
  context: TContext;
84
92
  logger?: VoiceLogger;
@@ -6103,6 +6103,7 @@ var createVoiceSession = (options) => {
6103
6103
  return;
6104
6104
  }
6105
6105
  activeTTSTurnId = undefined;
6106
+ Promise.resolve(socket.clear?.()).catch(() => {});
6106
6107
  if (!ttsAdapterSessionCanCancel(activeSession)) {
6107
6108
  return;
6108
6109
  }
@@ -6749,6 +6750,9 @@ var createVoiceSession = (options) => {
6749
6750
  };
6750
6751
  };
6751
6752
  const handlePartial = async (transcript) => {
6753
+ if (activeTTSTurnId !== undefined && transcript.text.trim()) {
6754
+ cancelActiveTTS("barge-in");
6755
+ }
6752
6756
  const session = await writeSession((session2) => {
6753
6757
  const nextPartialStartedAt = transcript.startedAtMs ?? session2.currentTurn.partialStartedAt;
6754
6758
  const nextPartialEndedAt = transcript.endedAtMs ?? session2.currentTurn.partialEndedAt;
@@ -7522,9 +7526,6 @@ var createVoiceSession = (options) => {
7522
7526
  if (amdFirstAudioAt === undefined) {
7523
7527
  amdFirstAudioAt = Date.now();
7524
7528
  }
7525
- if (!speechDetected && activeTTSTurnId !== undefined) {
7526
- cancelActiveTTS("barge-in");
7527
- }
7528
7529
  speechDetected = true;
7529
7530
  clearSilenceTimer();
7530
7531
  kickCallSilenceWatchdog();
@@ -12737,6 +12738,14 @@ var parseTwilioMessage = (raw) => {
12737
12738
  return JSON.parse(raw);
12738
12739
  };
12739
12740
  var createTwilioSocketAdapter = (socket, getState) => ({
12741
+ clear: async () => {
12742
+ const state = getState();
12743
+ if (!state.streamSid) {
12744
+ return;
12745
+ }
12746
+ state.reviewRecorder?.recordTwilioOutbound({ event: "clear" });
12747
+ await Promise.resolve(socket.send(JSON.stringify({ event: "clear", streamSid: state.streamSid })));
12748
+ },
12740
12749
  close: async (code, reason) => {
12741
12750
  await Promise.resolve(socket.close(code, reason));
12742
12751
  },
@@ -13001,7 +13010,7 @@ var createTwilioMediaStreamBridge = (socket, options) => {
13001
13010
  event: "media",
13002
13011
  track: message.media.track
13003
13012
  });
13004
- if (options.clearOnInboundMedia !== false && bridgeState.hasOutboundAudioSinceLastInbound && bridgeState.streamSid) {
13013
+ if (options.clearOnInboundMedia === true && bridgeState.hasOutboundAudioSinceLastInbound && bridgeState.streamSid) {
13005
13014
  const outboundMessage = {
13006
13015
  event: "clear",
13007
13016
  streamSid: bridgeState.streamSid
package/dist/vue/index.js CHANGED
@@ -261,7 +261,9 @@ var defineVoiceOpsStatusElement = (tagName = "absolute-voice-ops-status") => {
261
261
  reactiveSource: voiceSseReactiveSource(reactiveTopic, {
262
262
  path: this.getAttribute("reactive-path") ?? undefined
263
263
  })
264
- } : { intervalMs: Number.isFinite(intervalMs) ? intervalMs : 5000 }
264
+ } : {
265
+ intervalMs: Number.isFinite(intervalMs) ? intervalMs : 5000
266
+ }
265
267
  });
266
268
  }
267
269
  disconnectedCallback() {
@@ -1002,7 +1004,9 @@ var defineVoiceDeliveryRuntimeElement = (tagName = "absolute-voice-delivery-runt
1002
1004
  reactiveSource: voiceSseReactiveSource(reactiveTopic, {
1003
1005
  path: this.getAttribute("reactive-path") ?? undefined
1004
1006
  })
1005
- } : { intervalMs: Number.isFinite(intervalMs) ? intervalMs : 5000 }
1007
+ } : {
1008
+ intervalMs: Number.isFinite(intervalMs) ? intervalMs : 5000
1009
+ }
1006
1010
  });
1007
1011
  }
1008
1012
  disconnectedCallback() {
@@ -6588,7 +6592,9 @@ var defineVoiceReconnectProfileEvidenceElement = (tagName = "absolute-voice-reco
6588
6592
  reactiveSource: voiceSseReactiveSource(reactiveTopic, {
6589
6593
  path: this.getAttribute("reactive-path") ?? undefined
6590
6594
  })
6591
- } : { intervalMs: Number.isFinite(intervalMs) ? intervalMs : 5000 }
6595
+ } : {
6596
+ intervalMs: Number.isFinite(intervalMs) ? intervalMs : 5000
6597
+ }
6592
6598
  });
6593
6599
  }
6594
6600
  disconnectedCallback() {
@@ -7459,7 +7465,9 @@ var defineVoiceSessionObservabilityElement = (tagName = "absolute-voice-session-
7459
7465
  reactiveSource: voiceSseReactiveSource(reactiveTopic, {
7460
7466
  path: this.getAttribute("reactive-path") ?? undefined
7461
7467
  })
7462
- } : { intervalMs: Number.isFinite(intervalMs) ? intervalMs : 5000 }
7468
+ } : {
7469
+ intervalMs: Number.isFinite(intervalMs) ? intervalMs : 5000
7470
+ }
7463
7471
  });
7464
7472
  }
7465
7473
  disconnectedCallback() {
@@ -8293,7 +8301,9 @@ var defineVoiceProviderCapabilitiesElement = (tagName = "absolute-voice-provider
8293
8301
  reactiveSource: voiceSseReactiveSource(reactiveTopic, {
8294
8302
  path: this.getAttribute("reactive-path") ?? undefined
8295
8303
  })
8296
- } : { intervalMs: Number.isFinite(intervalMs) ? intervalMs : 5000 }
8304
+ } : {
8305
+ intervalMs: Number.isFinite(intervalMs) ? intervalMs : 5000
8306
+ }
8297
8307
  });
8298
8308
  }
8299
8309
  disconnectedCallback() {
@@ -8623,7 +8633,9 @@ var defineVoiceProviderContractsElement = (tagName = "absolute-voice-provider-co
8623
8633
  reactiveSource: voiceSseReactiveSource(reactiveTopic, {
8624
8634
  path: this.getAttribute("reactive-path") ?? undefined
8625
8635
  })
8626
- } : { intervalMs: Number.isFinite(intervalMs) ? intervalMs : 5000 }
8636
+ } : {
8637
+ intervalMs: Number.isFinite(intervalMs) ? intervalMs : 5000
8638
+ }
8627
8639
  });
8628
8640
  }
8629
8641
  disconnectedCallback() {
@@ -8907,7 +8919,9 @@ var defineVoiceProviderStatusElement = (tagName = "absolute-voice-provider-statu
8907
8919
  reactiveSource: voiceSseReactiveSource(reactiveTopic, {
8908
8920
  path: this.getAttribute("reactive-path") ?? undefined
8909
8921
  })
8910
- } : { intervalMs: Number.isFinite(intervalMs) ? intervalMs : 5000 }
8922
+ } : {
8923
+ intervalMs: Number.isFinite(intervalMs) ? intervalMs : 5000
8924
+ }
8911
8925
  });
8912
8926
  }
8913
8927
  disconnectedCallback() {
@@ -9246,7 +9260,9 @@ var defineVoiceRoutingStatusElement = (tagName = "absolute-voice-routing-status"
9246
9260
  reactiveSource: voiceSseReactiveSource(reactiveTopic, {
9247
9261
  path: this.getAttribute("reactive-path") ?? undefined
9248
9262
  })
9249
- } : { intervalMs: Number.isFinite(intervalMs) ? intervalMs : 5000 }
9263
+ } : {
9264
+ intervalMs: Number.isFinite(intervalMs) ? intervalMs : 5000
9265
+ }
9250
9266
  });
9251
9267
  }
9252
9268
  disconnectedCallback() {
@@ -9739,7 +9755,9 @@ var defineVoiceTurnLatencyElement = (tagName = "absolute-voice-turn-latency") =>
9739
9755
  reactiveSource: voiceSseReactiveSource(reactiveTopic, {
9740
9756
  path: this.getAttribute("reactive-path") ?? undefined
9741
9757
  })
9742
- } : { intervalMs: Number.isFinite(intervalMs) ? intervalMs : 5000 }
9758
+ } : {
9759
+ intervalMs: Number.isFinite(intervalMs) ? intervalMs : 5000
9760
+ }
9743
9761
  });
9744
9762
  }
9745
9763
  disconnectedCallback() {
@@ -10055,7 +10073,9 @@ var defineVoiceTurnQualityElement = (tagName = "absolute-voice-turn-quality") =>
10055
10073
  reactiveSource: voiceSseReactiveSource(reactiveTopic, {
10056
10074
  path: this.getAttribute("reactive-path") ?? undefined
10057
10075
  })
10058
- } : { intervalMs: Number.isFinite(intervalMs) ? intervalMs : 5000 }
10076
+ } : {
10077
+ intervalMs: Number.isFinite(intervalMs) ? intervalMs : 5000
10078
+ }
10059
10079
  });
10060
10080
  }
10061
10081
  disconnectedCallback() {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@absolutejs/voice",
3
- "version": "0.0.22-beta.543",
3
+ "version": "0.0.22-beta.545",
4
4
  "description": "Voice primitives and Elysia plugin for AbsoluteJS",
5
5
  "repository": {
6
6
  "type": "git",