@superinterface/react 5.3.0-beta.4 → 5.3.0-beta.5

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/dist/index.js CHANGED
@@ -47287,39 +47287,57 @@ function _toPrimitive47(t, r) {
47287
47287
  }
47288
47288
  return ("string" === r ? String : Number)(t);
47289
47289
  }
47290
+ var THROTTLE_MS = 80;
47291
+ var MAX_SEG_CACHE = 256;
47292
+ var KEEP_FINISHED_MESSAGES = 12;
47293
+ var hasLetters = function(s) {
47294
+ for(var i = 0; i < s.length; i++){
47295
+ var ch = s.charAt(i);
47296
+ if (ch.toLowerCase() !== ch.toUpperCase()) return true;
47297
+ }
47298
+ return false;
47299
+ };
47290
47300
  var splitSentencesFast = function(text) {
47291
47301
  var t = text.replace(/\s+/g, " ").trim();
47292
47302
  if (!t) return [];
47293
47303
  var parts = t.split(RegExp("(?<=[.!?])\\s+(?=[^\\s])", "g"));
47294
- return parts;
47295
- };
47296
- var getIncrementalSentences = function(prev, nextInput) {
47297
- if (!prev) {
47298
- return {
47299
- input: nextInput,
47300
- sentences: splitSentencesFast(nextInput)
47301
- };
47302
- }
47303
- if (nextInput === prev.input) {
47304
- return prev;
47304
+ var filtered = [];
47305
+ for(var i = 0; i < parts.length; i++){
47306
+ var p = parts[i].trim();
47307
+ if (p && hasLetters(p)) filtered.push(p);
47305
47308
  }
47309
+ return filtered;
47310
+ };
47311
+ var getIncrementalSentences = function(prev, nextInput, now) {
47312
+ if (!prev) return {
47313
+ input: nextInput,
47314
+ sentences: splitSentencesFast(nextInput),
47315
+ touched: now
47316
+ };
47317
+ if (nextInput === prev.input) return {
47318
+ input: prev.input,
47319
+ sentences: prev.sentences,
47320
+ touched: now
47321
+ };
47306
47322
  if (nextInput.startsWith(prev.input)) {
47307
- var _prev$sentences;
47308
- var prevLast = (_prev$sentences = prev.sentences[prev.sentences.length - 1]) !== null && _prev$sentences !== void 0 ? _prev$sentences : "";
47323
+ var prevSentences = prev.sentences;
47324
+ var prevLast = prevSentences[prevSentences.length - 1] || "";
47309
47325
  var baseLen = prev.input.length - prevLast.length;
47310
47326
  if (baseLen >= 0 && prev.input.slice(baseLen) === prevLast) {
47311
47327
  var tail = nextInput.slice(baseLen);
47312
47328
  var tailSegments = splitSentencesFast(tail);
47313
- var merged = prev.sentences.length > 0 ? _to_consumable_array(prev.sentences.slice(0, -1)).concat(_to_consumable_array(tailSegments)) : tailSegments;
47329
+ var merged = prevSentences.length > 0 ? prevSentences.slice(0, -1).concat(tailSegments) : tailSegments;
47314
47330
  return {
47315
47331
  input: nextInput,
47316
- sentences: merged
47332
+ sentences: merged,
47333
+ touched: now
47317
47334
  };
47318
47335
  }
47319
47336
  }
47320
47337
  return {
47321
47338
  input: nextInput,
47322
- sentences: splitSentencesFast(nextInput)
47339
+ sentences: splitSentencesFast(nextInput),
47340
+ touched: now
47323
47341
  };
47324
47342
  };
47325
47343
  var useMessageAudio = function(_ref) {
@@ -47340,41 +47358,65 @@ var useMessageAudio = function(_ref) {
47340
47358
  var currentSentenceRef = useRef8(null);
47341
47359
  var messagesProps = useMessages();
47342
47360
  var segCacheRef = useRef8(/* @__PURE__ */ new Map());
47361
+ var mirrorTimerRef = useRef8(null);
47362
+ var pendingMirrorRef = useRef8(false);
47343
47363
  useEffect10(function() {
47344
- var assistantsDesc = messagesProps.messages.filter(function(m) {
47345
- return m.role === "assistant";
47346
- });
47347
- var assistantsAsc = _to_consumable_array(assistantsDesc).reverse();
47348
- setAudioQueue(function(prev) {
47349
- var prevById = new Map(prev.map(function(p) {
47350
- return [
47351
- p.id,
47352
- p
47353
- ];
47354
- }));
47355
- var changed = false;
47356
- var next = [];
47357
- var _iteratorNormalCompletion = true, _didIteratorError = false, _iteratorError = undefined;
47358
- try {
47359
- for(var _iterator = assistantsAsc[Symbol.iterator](), _step; !(_iteratorNormalCompletion = (_step = _iterator.next()).done); _iteratorNormalCompletion = true){
47360
- var m_0 = _step.value;
47364
+ if (mirrorTimerRef.current != null) {
47365
+ pendingMirrorRef.current = true;
47366
+ return;
47367
+ }
47368
+ var run = function() {
47369
+ var assistantsDesc = messagesProps.messages.filter(function(m) {
47370
+ return m.role === "assistant";
47371
+ });
47372
+ var assistantsAsc = assistantsDesc.slice().reverse();
47373
+ var nowTs = typeof performance !== "undefined" && performance.now ? performance.now() : Date.now();
47374
+ var segCache = segCacheRef.current;
47375
+ var touch = function(id, entry) {
47376
+ segCache.set(id, {
47377
+ input: entry.input,
47378
+ sentences: entry.sentences,
47379
+ touched: nowTs
47380
+ });
47381
+ };
47382
+ var evictLRU = function() {
47383
+ if (segCache.size <= MAX_SEG_CACHE) return;
47384
+ var entries = Array.from(segCache.entries());
47385
+ entries.sort(function(a, b) {
47386
+ return a[1].touched - b[1].touched;
47387
+ });
47388
+ var toRemove = segCache.size - MAX_SEG_CACHE;
47389
+ for(var i = 0; i < toRemove; i++)segCache.delete(entries[i][0]);
47390
+ };
47391
+ setAudioQueue(function(prev) {
47392
+ var prevById = new Map(prev.map(function(p) {
47393
+ return [
47394
+ p.id,
47395
+ p
47396
+ ];
47397
+ }));
47398
+ var next = [];
47399
+ var changed = false;
47400
+ for(var i_0 = 0; i_0 < assistantsAsc.length; i_0++){
47361
47401
  var _existing$nextIndex, _existing$stopped;
47402
+ var m_0 = assistantsAsc[i_0];
47362
47403
  var inp = input({
47363
47404
  message: m_0
47364
47405
  });
47365
47406
  if (inp == null) continue;
47366
- var prevSeg = segCacheRef.current.get(m_0.id);
47367
- var nextSeg = getIncrementalSentences(prevSeg, inp);
47368
- if (!prevSeg || nextSeg.input !== prevSeg.input) {
47369
- segCacheRef.current.set(m_0.id, nextSeg);
47407
+ var prevSeg = segCache.get(m_0.id);
47408
+ var nextSeg = getIncrementalSentences(prevSeg, inp, nowTs);
47409
+ if (!prevSeg || nextSeg.input !== prevSeg.input || nextSeg.sentences !== prevSeg.sentences) {
47410
+ touch(m_0.id, nextSeg);
47411
+ } else {
47412
+ touch(m_0.id, prevSeg);
47370
47413
  }
47371
47414
  var existing = prevById.get(m_0.id);
47372
47415
  var sentences = nextSeg.sentences;
47373
47416
  var nextIndex = Math.min((_existing$nextIndex = existing === null || existing === void 0 ? void 0 : existing.nextIndex) !== null && _existing$nextIndex !== void 0 ? _existing$nextIndex : 0, sentences.length);
47374
47417
  var stopped = (_existing$stopped = existing === null || existing === void 0 ? void 0 : existing.stopped) !== null && _existing$stopped !== void 0 ? _existing$stopped : false;
47375
- var reuseExisting = !!existing && existing.status === m_0.status && existing.sentences === sentences && // same array ref -> no change
47376
- existing.nextIndex === nextIndex && existing.stopped === stopped;
47377
- if (reuseExisting) {
47418
+ var reuse = !!existing && existing.status === m_0.status && existing.sentences === sentences && existing.nextIndex === nextIndex && existing.stopped === stopped;
47419
+ if (reuse) {
47378
47420
  next.push(existing);
47379
47421
  } else {
47380
47422
  next.push({
@@ -47387,32 +47429,69 @@ var useMessageAudio = function(_ref) {
47387
47429
  changed = true;
47388
47430
  }
47389
47431
  }
47390
- } catch (err) {
47391
- _didIteratorError = true;
47392
- _iteratorError = err;
47393
- } finally{
47432
+ var unfinished = [];
47433
+ var finished = [];
47434
+ for(var i_1 = 0; i_1 < next.length; i_1++){
47435
+ var m_1 = next[i_1];
47436
+ if (!m_1.stopped && (m_1.status === "in_progress" || m_1.nextIndex < m_1.sentences.length)) {
47437
+ unfinished.push(m_1);
47438
+ } else {
47439
+ finished.push(m_1);
47440
+ }
47441
+ }
47442
+ var prunedFinished = finished.length > KEEP_FINISHED_MESSAGES ? finished.slice(finished.length - KEEP_FINISHED_MESSAGES) : finished;
47443
+ var combined = unfinished.concat(prunedFinished);
47444
+ if (!changed) {
47445
+ if (combined.length !== prev.length) changed = true;
47446
+ else {
47447
+ for(var i_2 = 0; i_2 < combined.length; i_2++){
47448
+ if (combined[i_2] !== prev[i_2]) {
47449
+ changed = true;
47450
+ break;
47451
+ }
47452
+ }
47453
+ }
47454
+ }
47455
+ var idsInQueue = new Set(combined.map(function(m_2) {
47456
+ return m_2.id;
47457
+ }));
47458
+ var _iteratorNormalCompletion = true, _didIteratorError = false, _iteratorError = undefined;
47394
47459
  try {
47395
- if (!_iteratorNormalCompletion && _iterator.return != null) {
47396
- _iterator.return();
47460
+ for(var _iterator = Array.from(segCache.keys())[Symbol.iterator](), _step; !(_iteratorNormalCompletion = (_step = _iterator.next()).done); _iteratorNormalCompletion = true){
47461
+ var id_0 = _step.value;
47462
+ if (!idsInQueue.has(id_0)) segCache.delete(id_0);
47397
47463
  }
47464
+ } catch (err) {
47465
+ _didIteratorError = true;
47466
+ _iteratorError = err;
47398
47467
  } finally{
47399
- if (_didIteratorError) {
47400
- throw _iteratorError;
47468
+ try {
47469
+ if (!_iteratorNormalCompletion && _iterator.return != null) {
47470
+ _iterator.return();
47471
+ }
47472
+ } finally{
47473
+ if (_didIteratorError) {
47474
+ throw _iteratorError;
47475
+ }
47401
47476
  }
47402
47477
  }
47478
+ evictLRU();
47479
+ return changed ? combined : prev;
47480
+ });
47481
+ mirrorTimerRef.current = null;
47482
+ if (pendingMirrorRef.current) {
47483
+ pendingMirrorRef.current = false;
47484
+ mirrorTimerRef.current = window.setTimeout(run, THROTTLE_MS);
47403
47485
  }
47404
- if (next.length !== prev.length) {
47405
- changed = true;
47406
- } else {
47407
- for(var i = 0; i < next.length; i++){
47408
- if (next[i] !== prev[i]) {
47409
- changed = true;
47410
- break;
47411
- }
47412
- }
47486
+ };
47487
+ mirrorTimerRef.current = window.setTimeout(run, THROTTLE_MS);
47488
+ return function() {
47489
+ if (mirrorTimerRef.current != null) {
47490
+ clearTimeout(mirrorTimerRef.current);
47491
+ mirrorTimerRef.current = null;
47413
47492
  }
47414
- return changed ? next : prev;
47415
- });
47493
+ pendingMirrorRef.current = false;
47494
+ };
47416
47495
  }, [
47417
47496
  messagesProps.messages
47418
47497
  ]);
@@ -47424,15 +47503,14 @@ var useMessageAudio = function(_ref) {
47424
47503
  audioPlayer.load("".concat(superinterfaceContext.baseUrl, "/audio-runtimes/tts?").concat(searchParams), {
47425
47504
  format: "mp3",
47426
47505
  autoplay: isAudioPlayed,
47427
- // first call false; then true for snappier chaining
47428
47506
  html5: isHtmlAudioSupported,
47429
47507
  onplay: onPlay,
47430
47508
  onstop: onStop,
47431
47509
  onload: function() {
47432
47510
  var current = currentSentenceRef.current;
47433
47511
  if (!current) return;
47434
- var msg = audioQueueRef.current.find(function(m_1) {
47435
- return m_1.id === current.messageId;
47512
+ var msg = audioQueueRef.current.find(function(m_3) {
47513
+ return m_3.id === current.messageId;
47436
47514
  });
47437
47515
  if (!msg) return;
47438
47516
  var nextSentence = msg.sentences[msg.nextIndex];
@@ -47467,42 +47545,23 @@ var useMessageAudio = function(_ref) {
47467
47545
  if (audioPlayer.playing) return;
47468
47546
  if (pickLockRef.current) return;
47469
47547
  var candidate = null;
47470
- var _iteratorNormalCompletion = true, _didIteratorError = false, _iteratorError = undefined;
47471
- try {
47472
- for(var _iterator = audioQueue[Symbol.iterator](), _step; !(_iteratorNormalCompletion = (_step = _iterator.next()).done); _iteratorNormalCompletion = true){
47473
- var msg_0 = _step.value;
47474
- if (msg_0.stopped) continue;
47475
- var sentence = msg_0.sentences[msg_0.nextIndex];
47476
- while(sentence && !/\S/.test(sentence)){
47477
- msg_0.nextIndex++;
47478
- sentence = msg_0.sentences[msg_0.nextIndex];
47479
- }
47480
- if (!sentence) continue;
47481
- var isFull = isOptimistic({
47482
- id: msg_0.id
47483
- }) || msg_0.status !== "in_progress" || fullSentenceRegex.test(sentence);
47484
- if (isFull) {
47485
- candidate = {
47486
- messageId: msg_0.id,
47487
- sentence: sentence,
47488
- index: msg_0.nextIndex,
47489
- ownerStatus: msg_0.status
47490
- };
47491
- break;
47492
- }
47493
- }
47494
- } catch (err) {
47495
- _didIteratorError = true;
47496
- _iteratorError = err;
47497
- } finally{
47498
- try {
47499
- if (!_iteratorNormalCompletion && _iterator.return != null) {
47500
- _iterator.return();
47501
- }
47502
- } finally{
47503
- if (_didIteratorError) {
47504
- throw _iteratorError;
47505
- }
47548
+ for(var mIdx = 0; mIdx < audioQueue.length; mIdx++){
47549
+ var msg_0 = audioQueue[mIdx];
47550
+ if (msg_0.stopped) continue;
47551
+ var idx = msg_0.nextIndex;
47552
+ var sentence = msg_0.sentences[idx];
47553
+ if (!sentence) continue;
47554
+ var isFull = isOptimistic({
47555
+ id: msg_0.id
47556
+ }) || msg_0.status !== "in_progress" || fullSentenceRegex.test(sentence);
47557
+ if (isFull) {
47558
+ candidate = {
47559
+ messageId: msg_0.id,
47560
+ sentence: sentence,
47561
+ index: idx,
47562
+ ownerStatus: msg_0.status
47563
+ };
47564
+ break;
47506
47565
  }
47507
47566
  }
47508
47567
  if (!candidate) return;
@@ -47513,10 +47572,10 @@ var useMessageAudio = function(_ref) {
47513
47572
  index: candidate.index
47514
47573
  };
47515
47574
  setAudioQueue(function(prev_0) {
47516
- return prev_0.map(function(m_2) {
47517
- return m_2.id === candidate.messageId ? _objectSpread47(_objectSpread47({}, m_2), {}, {
47518
- nextIndex: m_2.nextIndex + 1
47519
- }) : m_2;
47575
+ return prev_0.map(function(m_4) {
47576
+ return m_4.id === candidate.messageId ? _objectSpread47(_objectSpread47({}, m_4), {}, {
47577
+ nextIndex: candidate.index + 1
47578
+ }) : m_4;
47520
47579
  });
47521
47580
  });
47522
47581
  play({
@@ -47526,10 +47585,10 @@ var useMessageAudio = function(_ref) {
47526
47585
  },
47527
47586
  onStop: function() {
47528
47587
  setAudioQueue(function(prev_1) {
47529
- return prev_1.map(function(m_3) {
47530
- return m_3.id === candidate.messageId ? _objectSpread47(_objectSpread47({}, m_3), {}, {
47588
+ return prev_1.map(function(m_5) {
47589
+ return m_5.id === candidate.messageId ? _objectSpread47(_objectSpread47({}, m_5), {}, {
47531
47590
  stopped: true
47532
- }) : m_3;
47591
+ }) : m_5;
47533
47592
  });
47534
47593
  });
47535
47594
  setIsPlaying(false);
@@ -47540,10 +47599,10 @@ var useMessageAudio = function(_ref) {
47540
47599
  setIsPlaying(false);
47541
47600
  currentSentenceRef.current = null;
47542
47601
  pickLockRef.current = false;
47543
- var hasPending = audioQueueRef.current.some(function(m_4) {
47544
- if (m_4.stopped) return false;
47545
- var hasMore = m_4.nextIndex < m_4.sentences.length;
47546
- var streaming = m_4.status === "in_progress";
47602
+ var hasPending = audioQueueRef.current.some(function(m_6) {
47603
+ if (m_6.stopped) return false;
47604
+ var hasMore = m_6.nextIndex < m_6.sentences.length;
47605
+ var streaming = m_6.status === "in_progress";
47547
47606
  return hasMore || streaming;
47548
47607
  });
47549
47608
  if (!hasPending) _onEnd();
@@ -47559,9 +47618,9 @@ var useMessageAudio = function(_ref) {
47559
47618
  ]);
47560
47619
  useEffect10(function() {
47561
47620
  if (isHtmlAudioSupported) {
47562
- var _Howler$_howls$;
47563
- if (!(Howler !== null && Howler !== void 0 && (_Howler$_howls$ = Howler._howls[0]) !== null && _Howler$_howls$ !== void 0 && (_Howler$_howls$ = _Howler$_howls$._sounds[0]) !== null && _Howler$_howls$ !== void 0 && _Howler$_howls$._node)) return;
47564
- Howler._howls[0]._sounds[0]._node.crossOrigin = "anonymous";
47621
+ var _Howler$_howls;
47622
+ var node = Howler === null || Howler === void 0 || (_Howler$_howls = Howler._howls) === null || _Howler$_howls === void 0 || (_Howler$_howls = _Howler$_howls[0]) === null || _Howler$_howls === void 0 || (_Howler$_howls = _Howler$_howls._sounds) === null || _Howler$_howls === void 0 || (_Howler$_howls = _Howler$_howls[0]) === null || _Howler$_howls === void 0 ? void 0 : _Howler$_howls._node;
47623
+ if (node) node.crossOrigin = "anonymous";
47565
47624
  }
47566
47625
  }, [
47567
47626
  audioPlayer
@@ -47573,14 +47632,17 @@ var useMessageAudio = function(_ref) {
47573
47632
  if (isAudioEngineInited.current) return;
47574
47633
  isAudioEngineInited.current = true;
47575
47634
  if (isHtmlAudioSupported) {
47576
- var _Howler$_howls$2;
47577
- var audioContext = new AudioContext();
47578
- setAudioEngine({
47579
- // @ts-ignore-next-line
47580
- source: audioContext.createMediaElementSource(// @ts-ignore-next-line
47581
- (_Howler$_howls$2 = Howler._howls[0]) === null || _Howler$_howls$2 === void 0 || (_Howler$_howls$2 = _Howler$_howls$2._sounds[0]) === null || _Howler$_howls$2 === void 0 ? void 0 : _Howler$_howls$2._node),
47582
- audioContext: audioContext
47583
- });
47635
+ var _Howler$_howls2;
47636
+ var AudioCtx = window.AudioContext || window.webkitAudioContext;
47637
+ var audioContext = new AudioCtx();
47638
+ var node_0 = Howler === null || Howler === void 0 || (_Howler$_howls2 = Howler._howls) === null || _Howler$_howls2 === void 0 || (_Howler$_howls2 = _Howler$_howls2[0]) === null || _Howler$_howls2 === void 0 || (_Howler$_howls2 = _Howler$_howls2._sounds) === null || _Howler$_howls2 === void 0 || (_Howler$_howls2 = _Howler$_howls2[0]) === null || _Howler$_howls2 === void 0 ? void 0 : _Howler$_howls2._node;
47639
+ if (node_0) {
47640
+ setAudioEngine({
47641
+ // @ts-ignore-next-line
47642
+ source: audioContext.createMediaElementSource(node_0),
47643
+ audioContext: audioContext
47644
+ });
47645
+ }
47584
47646
  } else {
47585
47647
  setAudioEngine({
47586
47648
  source: Howler.masterGain,
@@ -47600,8 +47662,8 @@ var useMessageAudio = function(_ref) {
47600
47662
  audioEngine
47601
47663
  ]);
47602
47664
  var isPending = useMemo17(function() {
47603
- return isPlaying || audioQueue.some(function(m_5) {
47604
- return !m_5.stopped && (m_5.nextIndex < m_5.sentences.length || m_5.status === "in_progress");
47665
+ return isPlaying || audioQueue.some(function(m_7) {
47666
+ return !m_7.stopped && (m_7.nextIndex < m_7.sentences.length || m_7.status === "in_progress");
47605
47667
  });
47606
47668
  }, [
47607
47669
  isPlaying,