@burdenoff/fe-libs 2026.1007.2 → 2026.1007.4

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (38) hide show
  1. package/dist/shared/assistant/i18nManifest.d.ts +3 -0
  2. package/dist/shared/assistant/i18nManifest.d.ts.map +1 -1
  3. package/dist/shared/assistant/i18nManifest.js +3 -0
  4. package/dist/shared/assistant/index.d.ts +2 -0
  5. package/dist/shared/assistant/index.d.ts.map +1 -1
  6. package/dist/shared/assistant/store.d.ts +10 -0
  7. package/dist/shared/assistant/store.d.ts.map +1 -1
  8. package/dist/shared/assistant/store.js +19 -8
  9. package/dist/shared/assistant/ui/AssistantChatArea.d.ts.map +1 -1
  10. package/dist/shared/assistant/ui/AssistantChatArea.js +1070 -1067
  11. package/dist/shared/assistant/ui/useVoiceSession.d.ts +14 -1
  12. package/dist/shared/assistant/ui/useVoiceSession.d.ts.map +1 -1
  13. package/dist/shared/assistant/ui/useVoiceSession.js +241 -233
  14. package/dist/shared/assistant/ui/voice/AssistantVoiceSession.d.ts +7 -0
  15. package/dist/shared/assistant/ui/voice/AssistantVoiceSession.d.ts.map +1 -1
  16. package/dist/shared/assistant/ui/voice/AssistantVoiceSession.js +137 -130
  17. package/dist/shared/assistant/ui/voice/HandsFreePrivacyNotice.d.ts +27 -0
  18. package/dist/shared/assistant/ui/voice/HandsFreePrivacyNotice.d.ts.map +1 -0
  19. package/dist/shared/assistant/ui/voice/HandsFreePrivacyNotice.js +52 -0
  20. package/dist/shared/assistant/voice/handsfree/backendStreamTransport.d.ts +29 -6
  21. package/dist/shared/assistant/voice/handsfree/backendStreamTransport.d.ts.map +1 -1
  22. package/dist/shared/assistant/voice/handsfree/backendStreamTransport.js +138 -63
  23. package/dist/shared/assistant/voice/handsfree/handsFreeController.d.ts +7 -1
  24. package/dist/shared/assistant/voice/handsfree/handsFreeController.d.ts.map +1 -1
  25. package/dist/shared/assistant/voice/handsfree/handsFreeRuntime.d.ts +18 -10
  26. package/dist/shared/assistant/voice/handsfree/handsFreeRuntime.d.ts.map +1 -1
  27. package/dist/shared/assistant/voice/handsfree/handsFreeRuntime.js +46 -57
  28. package/dist/shared/assistant/voice/handsfree/streamingConfig.d.ts +103 -0
  29. package/dist/shared/assistant/voice/handsfree/streamingConfig.d.ts.map +1 -0
  30. package/dist/shared/assistant/voice/handsfree/streamingConfig.js +71 -0
  31. package/dist/shared/assistant/voice/handsfree/sttTransport.d.ts +12 -7
  32. package/dist/shared/assistant/voice/handsfree/sttTransport.d.ts.map +1 -1
  33. package/dist/shared/assistant/voice/handsfree/sttTransport.js +1 -1
  34. package/dist/shared/assistant/voice/handsfree/useHandsFreeInterrupt.d.ts +23 -1
  35. package/dist/shared/assistant/voice/handsfree/useHandsFreeInterrupt.d.ts.map +1 -1
  36. package/dist/shared/assistant/voice/handsfree/useHandsFreeInterrupt.js +63 -50
  37. package/dist/shared-assistant.js +189 -187
  38. package/package.json +3 -3
@@ -7,8 +7,10 @@
7
7
  *
8
8
  * - `audio-track` desktop Chrome >= 135: `SpeechRecognition.start(track)`
9
9
  * fed OUR echo-cancelled track (`audioTrackTransport`);
10
- * - `backend-stream` our gateway WebSocket (`backendStreamTransport`),
11
- * flagged: the provider API is not enabled today;
10
+ * - `backend-stream` our gateway WebSocket (`backendStreamTransport`), only
11
+ * when an app has configured it
12
+ * (`configureHandsFreeStreaming`) and only for the
13
+ * languages it carries;
12
14
  * - `web-speech` the current `webkitSpeechRecognition` path, owned by
13
15
  * `useVoiceInput` (`webSpeechTransport`). This is the
14
16
  * fallback and what ships today.
@@ -71,10 +73,12 @@ export interface TransportEnvironment {
71
73
  userAgent: string;
72
74
  hasSpeechRecognition: boolean;
73
75
  hasAudioWorklet: boolean;
74
- /** Flag `voice.fullDuplex` / the test override says the backend stream may be used. */
76
+ /** The app switched the backend stream on (`configureHandsFreeStreaming`). */
75
77
  backendStreamEnabled: boolean;
76
- /** A ticket endpoint is configured (the gateway route exists). */
78
+ /** The app gave a usable stream URL (the gateway route exists). */
77
79
  backendStreamConfigured: boolean;
80
+ /** The backend stream carries the person's input language (`streamLanguagesFor`). */
81
+ backendStreamLanguage: boolean;
78
82
  }
79
83
  /** Chrome (not Edge/Opera/Android) major version, or null. */
80
84
  export declare function desktopChromeMajor(userAgent: string): number | null;
@@ -86,9 +90,10 @@ export interface TransportChoice {
86
90
  because: string;
87
91
  }
88
92
  /**
89
- * Pure choice. Order: the backend stream (when flagged AND configured) is the
90
- * only route that works on Chrome Android; else the audio-track route on
91
- * desktop Chrome >= 135; else the current Web Speech path.
93
+ * Pure choice. Order: the backend stream (when switched on, configured AND
94
+ * carrying the person's language) is the only route that works on Chrome
95
+ * Android; else the audio-track route on desktop Chrome >= 135; else the
96
+ * current Web Speech path.
92
97
  */
93
98
  export declare function selectSttTransport(env: TransportEnvironment): TransportChoice;
94
99
  //# sourceMappingURL=sttTransport.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"sttTransport.d.ts","sourceRoot":"","sources":["../../../../../src/shared/assistant/voice/handsfree/sttTransport.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;GAiBG;AACH,MAAM,MAAM,gBAAgB,GAAG,aAAa,GAAG,gBAAgB,GAAG,YAAY,CAAC;AAE/E,MAAM,WAAW,mBAAmB;IAClC,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,OAAO,CAAC;IACf,WAAW,EAAE,MAAM,CAAC;IACpB,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,MAAM,YAAY,GACpB,aAAa,GACb,MAAM,GACN,OAAO,GACP,UAAU,GACV,QAAQ,GACR,aAAa,CAAC;AAElB,MAAM,WAAW,iBAAiB;IAChC,IAAI,EAAE,YAAY,CAAC;IACnB,+DAA+D;IAC/D,SAAS,EAAE,OAAO,CAAC;CACpB;AAED,MAAM,WAAW,oBAAoB;IACnC,YAAY,CAAC,UAAU,EAAE,mBAAmB,GAAG,IAAI,CAAC;IACpD,OAAO,CAAC,KAAK,EAAE,iBAAiB,GAAG,IAAI,CAAC;CACzC;AAED,MAAM,WAAW,aAAa;IAC5B,OAAO,EAAE,YAAY,CAAC;IACtB,sFAAsF;IACtF,SAAS,EAAE,0BAA0B,CAAC;IACtC,KAAK,EAAE,gBAAgB,CAAC;CACzB;AAED,MAAM,WAAW,aAAa;IAC5B,WAAW,EAAE,MAAM,CAAC;IACpB,KAAK,EAAE,MAAM,CAAC;IACd,mEAAmE;IACnE,OAAO,EAAE,SAAS,UAAU,EAAE,CAAC;CAChC;AAED,MAAM,WAAW,YAAY;IAC3B,QAAQ,CAAC,IAAI,EAAE,gBAAgB,CAAC;IAChC;;;;OAIG;IACH,QAAQ,CAAC,gBAAgB,EAAE,WAAW,GAAG,cAAc,CAAC;IACxD,oFAAoF;IACpF,QAAQ,CAAC,iBAAiB,EAAE,OAAO,CAAC;IACpC,KAAK,CACH,KAAK,EAAE,aAAa,GAAG,IAAI,EAC3B,QAAQ,EAAE,MAAM,EAChB,QAAQ,EAAE,oBAAoB,GAC7B,OAAO,CAAC,IAAI,CAAC,CAAC;IACjB,aAAa,CAAC,SAAS,EAAE,aAAa,GAAG,IAAI,CAAC;IAC9C,sDAAsD;IACtD,SAAS,CAAC,KAAK,EAAE,UAAU,GAAG,IAAI,CAAC;IACnC,iDAAiD;IACjD,cAAc,CAAC,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1C,0EAA0E;IAC1E,eAAe,CAAC,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;IAC3C,IAAI,IAAI,IAAI,CAAC;CACd;AAED,MAAM,WAAW,oBAAoB;IACnC,6BAA6B;IAC7B,SAAS,EAAE,MAAM,CAAC;IAClB,oBAAoB,EAAE,OAAO,CAAC;IAC9B,eAAe,EAAE,OAAO,CAAC;IACzB,uFAAuF;IACvF,oBAAoB,EAAE,OAAO,CAAC;IAC9B,kEAAkE;IAClE,uBAAuB,EAAE,OAAO,CAAC;CAClC;AAED,8DAA8D;AAC9D,wBAAgB,kBAAkB,CAAC,SAAS,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAInE;AAED,iFAAiF;AACjF,eAAO,MAAM,sBAAsB,MAAM,CAAC;AAE1C,MAAM,WAAW,eAAe;IAC9B,IAAI,EAAE,gBAAgB,CAAC;IACvB,mDAAmD;IACnD,OAAO,EAAE,MAAM,CAAC;CACjB;AAED;;;;GAIG;AACH,wBAAgB,kBAAkB,CAAC,GAAG,EAAE,oBAAoB,GAAG,eAAe,CAe7E"}
1
+ {"version":3,"file":"sttTransport.d.ts","sourceRoot":"","sources":["../../../../../src/shared/assistant/voice/handsfree/sttTransport.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;GAmBG;AACH,MAAM,MAAM,gBAAgB,GAAG,aAAa,GAAG,gBAAgB,GAAG,YAAY,CAAC;AAE/E,MAAM,WAAW,mBAAmB;IAClC,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,OAAO,CAAC;IACf,WAAW,EAAE,MAAM,CAAC;IACpB,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,MAAM,YAAY,GACpB,aAAa,GACb,MAAM,GACN,OAAO,GACP,UAAU,GACV,QAAQ,GACR,aAAa,CAAC;AAElB,MAAM,WAAW,iBAAiB;IAChC,IAAI,EAAE,YAAY,CAAC;IACnB,+DAA+D;IAC/D,SAAS,EAAE,OAAO,CAAC;CACpB;AAED,MAAM,WAAW,oBAAoB;IACnC,YAAY,CAAC,UAAU,EAAE,mBAAmB,GAAG,IAAI,CAAC;IACpD,OAAO,CAAC,KAAK,EAAE,iBAAiB,GAAG,IAAI,CAAC;CACzC;AAED,MAAM,WAAW,aAAa;IAC5B,OAAO,EAAE,YAAY,CAAC;IACtB,sFAAsF;IACtF,SAAS,EAAE,0BAA0B,CAAC;IACtC,KAAK,EAAE,gBAAgB,CAAC;CACzB;AAED,MAAM,WAAW,aAAa;IAC5B,WAAW,EAAE,MAAM,CAAC;IACpB,KAAK,EAAE,MAAM,CAAC;IACd,mEAAmE;IACnE,OAAO,EAAE,SAAS,UAAU,EAAE,CAAC;CAChC;AAED,MAAM,WAAW,YAAY;IAC3B,QAAQ,CAAC,IAAI,EAAE,gBAAgB,CAAC;IAChC;;;;OAIG;IACH,QAAQ,CAAC,gBAAgB,EAAE,WAAW,GAAG,cAAc,CAAC;IACxD,oFAAoF;IACpF,QAAQ,CAAC,iBAAiB,EAAE,OAAO,CAAC;IACpC,KAAK,CACH,KAAK,EAAE,aAAa,GAAG,IAAI,EAC3B,QAAQ,EAAE,MAAM,EAChB,QAAQ,EAAE,oBAAoB,GAC7B,OAAO,CAAC,IAAI,CAAC,CAAC;IACjB,aAAa,CAAC,SAAS,EAAE,aAAa,GAAG,IAAI,CAAC;IAC9C,sDAAsD;IACtD,SAAS,CAAC,KAAK,EAAE,UAAU,GAAG,IAAI,CAAC;IACnC,iDAAiD;IACjD,cAAc,CAAC,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1C,0EAA0E;IAC1E,eAAe,CAAC,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;IAC3C,IAAI,IAAI,IAAI,CAAC;CACd;AAED,MAAM,WAAW,oBAAoB;IACnC,6BAA6B;IAC7B,SAAS,EAAE,MAAM,CAAC;IAClB,oBAAoB,EAAE,OAAO,CAAC;IAC9B,eAAe,EAAE,OAAO,CAAC;IACzB,8EAA8E;IAC9E,oBAAoB,EAAE,OAAO,CAAC;IAC9B,mEAAmE;IACnE,uBAAuB,EAAE,OAAO,CAAC;IACjC,qFAAqF;IACrF,qBAAqB,EAAE,OAAO,CAAC;CAChC;AAED,8DAA8D;AAC9D,wBAAgB,kBAAkB,CAAC,SAAS,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAInE;AAED,iFAAiF;AACjF,eAAO,MAAM,sBAAsB,MAAM,CAAC;AAE1C,MAAM,WAAW,eAAe;IAC9B,IAAI,EAAE,gBAAgB,CAAC;IACvB,mDAAmD;IACnD,OAAO,EAAE,MAAM,CAAC;CACjB;AAED;;;;;GAKG;AACH,wBAAgB,kBAAkB,CAAC,GAAG,EAAE,oBAAoB,GAAG,eAAe,CAmB7E"}
@@ -10,7 +10,7 @@ function n(t) {
10
10
  kind: "web-speech",
11
11
  because: "no-audio-worklet"
12
12
  };
13
- if (t.backendStreamEnabled && t.backendStreamConfigured) return {
13
+ if (t.backendStreamEnabled && t.backendStreamConfigured && t.backendStreamLanguage) return {
14
14
  kind: "backend-stream",
15
15
  because: "flagged-and-configured"
16
16
  };
@@ -7,7 +7,13 @@ export type HandsFreeMode =
7
7
  /** Setting off, or no live unmuted session: nothing is open. */
8
8
  "off"
9
9
  /** Hands-free cannot run on this device (no capture, or a phone with no stream transport). */
10
- | "unavailable" | "starting" | "active"
10
+ | "unavailable"
11
+ /**
12
+ * The backend stream is about to be used and the person has not accepted
13
+ * its privacy notice yet: the notice is on screen, and the microphone stays
14
+ * CLOSED (no capture, no recogniser) until they choose.
15
+ */
16
+ | "notice" | "starting" | "active"
11
17
  /** Gave up; the tap-first Web Speech path is in charge, and says why. */
12
18
  | "fallback";
13
19
  export interface UseHandsFreeInterruptOptions {
@@ -19,6 +25,20 @@ export interface UseHandsFreeInterruptOptions {
19
25
  /** The user's voice started while the assistant was audible. */
20
26
  onBargeIn: () => void;
21
27
  onTranscript: (text: string, final: boolean, language: string | undefined) => void;
28
+ /**
29
+ * The backend stream's privacy-notice version this person accepted (it is
30
+ * remembered per profile in the assistant store), or null.
31
+ */
32
+ streamNoticeAccepted?: string | null;
33
+ /** The person pressed Continue on the notice `version`: remember it. */
34
+ onAcceptStreamNotice?: (version: string) => void;
35
+ }
36
+ /** The two answers to the backend stream's privacy notice. */
37
+ export interface HandsFreePrivacyNoticeActions {
38
+ /** Continue: remember the answer, then open the microphone. */
39
+ accept: () => void;
40
+ /** Not now: hands-free stays off for this conversation; tap-to-talk works. */
41
+ decline: () => void;
22
42
  }
23
43
  export interface HandsFreeState {
24
44
  mode: HandsFreeMode;
@@ -28,6 +48,8 @@ export interface HandsFreeState {
28
48
  fallbackReason: FallbackReason | null;
29
49
  /** A barge-in produced no words: show "Say that again, or tap to replay". */
30
50
  nothingHeard: boolean;
51
+ /** Non-null exactly while `mode` is `notice`: what the notice's buttons do. */
52
+ privacyNotice: HandsFreePrivacyNoticeActions | null;
31
53
  }
32
54
  export declare function useHandsFreeInterrupt(options: UseHandsFreeInterruptOptions): HandsFreeState;
33
55
  //# sourceMappingURL=useHandsFreeInterrupt.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"useHandsFreeInterrupt.d.ts","sourceRoot":"","sources":["../../../../../src/shared/assistant/voice/handsfree/useHandsFreeInterrupt.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,iBAAiB,CAAC;AACzD,OAAO,EAEL,KAAK,cAAc,EACpB,MAAM,uBAAuB,CAAC;AAS/B,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,gBAAgB,CAAC;AAEvD,oFAAoF;AACpF,eAAO,MAAM,iBAAiB,QAAS,CAAC;AAExC,MAAM,MAAM,aAAa;AACvB,gEAAgE;AAC9D,KAAK;AACP,8FAA8F;GAC5F,aAAa,GACb,UAAU,GACV,QAAQ;AACV,yEAAyE;GACvE,UAAU,CAAC;AAEf,MAAM,WAAW,4BAA4B;IAC3C,qEAAqE;IACrE,OAAO,EAAE,OAAO,CAAC;IACjB,KAAK,EAAE,iBAAiB,CAAC;IACzB,KAAK,EAAE,OAAO,CAAC;IACf,QAAQ,EAAE,MAAM,CAAC;IACjB,gEAAgE;IAChE,SAAS,EAAE,MAAM,IAAI,CAAC;IACtB,YAAY,EAAE,CACZ,IAAI,EAAE,MAAM,EACZ,KAAK,EAAE,OAAO,EACd,QAAQ,EAAE,MAAM,GAAG,SAAS,KACzB,IAAI,CAAC;CACX;AAED,MAAM,WAAW,cAAc;IAC7B,IAAI,EAAE,aAAa,CAAC;IACpB,aAAa,EAAE,gBAAgB,GAAG,IAAI,CAAC;IACvC,wFAAwF;IACxF,iBAAiB,EAAE,OAAO,CAAC;IAC3B,cAAc,EAAE,cAAc,GAAG,IAAI,CAAC;IACtC,6EAA6E;IAC7E,YAAY,EAAE,OAAO,CAAC;CACvB;AAKD,wBAAgB,qBAAqB,CACnC,OAAO,EAAE,4BAA4B,GACpC,cAAc,CAsHhB"}
1
+ {"version":3,"file":"useHandsFreeInterrupt.d.ts","sourceRoot":"","sources":["../../../../../src/shared/assistant/voice/handsfree/useHandsFreeInterrupt.ts"],"names":[],"mappings":"AAQA,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,iBAAiB,CAAC;AACzD,OAAO,EAEL,KAAK,cAAc,EACpB,MAAM,uBAAuB,CAAC;AAe/B,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,gBAAgB,CAAC;AAEvD,oFAAoF;AACpF,eAAO,MAAM,iBAAiB,QAAS,CAAC;AAExC,MAAM,MAAM,aAAa;AACvB,gEAAgE;AAC9D,KAAK;AACP,8FAA8F;GAC5F,aAAa;AACf;;;;GAIG;GACD,QAAQ,GACR,UAAU,GACV,QAAQ;AACV,yEAAyE;GACvE,UAAU,CAAC;AAEf,MAAM,WAAW,4BAA4B;IAC3C,qEAAqE;IACrE,OAAO,EAAE,OAAO,CAAC;IACjB,KAAK,EAAE,iBAAiB,CAAC;IACzB,KAAK,EAAE,OAAO,CAAC;IACf,QAAQ,EAAE,MAAM,CAAC;IACjB,gEAAgE;IAChE,SAAS,EAAE,MAAM,IAAI,CAAC;IACtB,YAAY,EAAE,CACZ,IAAI,EAAE,MAAM,EACZ,KAAK,EAAE,OAAO,EACd,QAAQ,EAAE,MAAM,GAAG,SAAS,KACzB,IAAI,CAAC;IACV;;;OAGG;IACH,oBAAoB,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACrC,wEAAwE;IACxE,oBAAoB,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,IAAI,CAAC;CAClD;AAED,8DAA8D;AAC9D,MAAM,WAAW,6BAA6B;IAC5C,+DAA+D;IAC/D,MAAM,EAAE,MAAM,IAAI,CAAC;IACnB,8EAA8E;IAC9E,OAAO,EAAE,MAAM,IAAI,CAAC;CACrB;AAED,MAAM,WAAW,cAAc;IAC7B,IAAI,EAAE,aAAa,CAAC;IACpB,aAAa,EAAE,gBAAgB,GAAG,IAAI,CAAC;IACvC,wFAAwF;IACxF,iBAAiB,EAAE,OAAO,CAAC;IAC3B,cAAc,EAAE,cAAc,GAAG,IAAI,CAAC;IACtC,6EAA6E;IAC7E,YAAY,EAAE,OAAO,CAAC;IACtB,+EAA+E;IAC/E,aAAa,EAAE,6BAA6B,GAAG,IAAI,CAAC;CACrD;AA2BD,wBAAgB,qBAAqB,CACnC,OAAO,EAAE,4BAA4B,GACpC,cAAc,CAkKhB"}
@@ -1,70 +1,83 @@
1
1
  import { activePlaybackSource as e } from "./playbackReference.js";
2
- import { looksLikeHeadset as t, startMicCapture as n } from "./micCapture.js";
3
- import { createHandsFreeController as r } from "./handsFreeController.js";
4
- import { chooseTransport as i, createRuntimeTransport as a, isMobileUserAgent as o, readTransportEnvironment as s } from "./handsFreeRuntime.js";
5
- import { useEffect as c, useMemo as l, useRef as u, useState as d } from "react";
2
+ import { HANDS_FREE_STREAM_NOTICE_VERSION as t, readHandsFreeStreaming as n, subscribeHandsFreeStreaming as r } from "./streamingConfig.js";
3
+ import { looksLikeHeadset as i, startMicCapture as a } from "./micCapture.js";
4
+ import { createHandsFreeController as o } from "./handsFreeController.js";
5
+ import { chooseTransport as s, createRuntimeTransport as c, isMobileUserAgent as l, readTransportEnvironment as u } from "./handsFreeRuntime.js";
6
+ import { useCallback as d, useEffect as f, useMemo as p, useRef as m, useState as h, useSyncExternalStore as g } from "react";
6
7
  //#region src/shared/assistant/voice/handsfree/useHandsFreeInterrupt.ts
7
- var f = 3e4, p = (e) => e === "listening" || e === "thinking" || e === "speaking";
8
- function m(m) {
9
- let { enabled: h, phase: g, muted: _ } = m, v = u(m);
10
- v.current = m;
11
- let [y, b] = d(null), [x, S] = d(!1), [C, w] = d(!1), [T, E] = d(!1), D = u(!1), O = l(() => {
12
- let e = s(), t = i(e), n = t.kind === "web-speech" && o(e.userAgent);
13
- return {
14
- choice: t,
15
- supported: e.hasAudioWorklet && !n
16
- };
17
- }, []);
18
- c(() => {
19
- (g === "idle" || g === "ended") && (b(null), S(!1));
20
- }, [g]), c(() => {
21
- if (!h || typeof document > "u") return;
8
+ var _ = 3e4;
9
+ function v(e, t) {
10
+ let n = u(e, t), r = s(n), i = r.kind === "web-speech" && l(n.userAgent);
11
+ return {
12
+ kind: r.kind,
13
+ supported: n.hasAudioWorklet && !i
14
+ };
15
+ }
16
+ var y = (e) => e === "listening" || e === "thinking" || e === "speaking";
17
+ function b(s) {
18
+ let { enabled: l, phase: u, muted: b, language: x, streamNoticeAccepted: S } = s, C = m(s);
19
+ C.current = s;
20
+ let [w, T] = h(null), [E, D] = h(!1), [O, k] = h(!1), [A, j] = h(!1), M = m(!1), [N, P] = h(!1), F = g(r, n, n), I = p(() => v(x, F), [x, F]), L = I.kind;
21
+ f(() => {
22
+ S !== "google-stt-eu-1" && P(!1);
23
+ }, [S]), f(() => {
24
+ (u === "idle" || u === "ended") && (T(null), D(!1));
25
+ }, [u]), f(() => {
26
+ if (!l || typeof document > "u") return;
22
27
  let e = null, t = () => {
23
- e !== null && clearTimeout(e), e = null, document.visibilityState === "hidden" ? e = setTimeout(() => w(!0), f) : w(!1);
28
+ e !== null && clearTimeout(e), e = null, document.visibilityState === "hidden" ? e = setTimeout(() => k(!0), _) : k(!1);
24
29
  };
25
30
  return document.addEventListener("visibilitychange", t), () => {
26
31
  document.removeEventListener("visibilitychange", t), e !== null && clearTimeout(e);
27
32
  };
28
- }, [h]);
29
- let k = h && O.supported && p(g) && !_ && y === null && !C;
30
- c(() => {
31
- if (!k) return;
32
- let i = r({
33
- startCapture: n,
34
- transport: a(O.choice.kind),
33
+ }, [l]);
34
+ let R = l && I.supported && y(u) && !b && w === null && !O, z = L === "backend-stream" && !N && S !== "google-stt-eu-1", B = R && z, V = R && !z, H = d(() => {
35
+ P(!0), C.current.onAcceptStreamNotice?.(t);
36
+ }, []), U = d(() => {
37
+ T("notice-declined");
38
+ }, []), W = p(() => ({
39
+ accept: H,
40
+ decline: U
41
+ }), [H, U]);
42
+ f(() => {
43
+ if (!V) return;
44
+ let t = o({
45
+ startCapture: a,
46
+ transport: c(L),
35
47
  getSession: () => ({
36
- phase: v.current.phase,
37
- muted: v.current.muted
48
+ phase: C.current.phase,
49
+ muted: C.current.muted
38
50
  }),
39
51
  getPlaybackSource: e,
40
- getHeadsetHint: () => D.current,
41
- language: () => v.current.language,
52
+ getHeadsetHint: () => M.current,
53
+ language: () => C.current.language,
42
54
  onBargeIn: () => {
43
- S(!1), v.current.onBargeIn();
55
+ D(!1), C.current.onBargeIn();
44
56
  },
45
57
  onTranscript: (e, t, n) => {
46
- S(!1), v.current.onTranscript(e, t, n);
58
+ D(!1), C.current.onTranscript(e, t, n);
47
59
  },
48
- onFallback: b,
49
- onNothingHeard: () => S(!0),
50
- isEnabled: () => v.current.enabled
51
- }), o = !1;
52
- return i.start().then(() => {
53
- o || E(!0);
60
+ onFallback: T,
61
+ onNothingHeard: () => D(!0),
62
+ isEnabled: () => C.current.enabled
63
+ }), n = !1;
64
+ return t.start().then(() => {
65
+ n || j(!0);
54
66
  }), navigator.mediaDevices?.enumerateDevices().then((e) => {
55
- D.current = t(e.filter((e) => e.kind === "audiooutput").map((e) => e.label));
67
+ M.current = i(e.filter((e) => e.kind === "audiooutput").map((e) => e.label));
56
68
  }).catch(() => void 0), () => {
57
- o = !0, i.stop(), E(!1);
69
+ n = !0, t.stop(), j(!1);
58
70
  };
59
- }, [k, O]);
60
- let A = "off";
61
- return h && !O.supported ? A = "unavailable" : y === null ? k && (A = T ? "active" : "starting") : A = "fallback", {
62
- mode: A,
63
- transportKind: O.supported ? O.choice.kind : null,
64
- suppressWebSpeech: h && O.supported && O.choice.kind !== "web-speech" && y === null && p(g),
65
- fallbackReason: y,
66
- nothingHeard: x
71
+ }, [V, L]);
72
+ let G = "off";
73
+ return l && !I.supported ? G = "unavailable" : w === null ? B ? G = "notice" : V && (G = A ? "active" : "starting") : G = "fallback", {
74
+ mode: G,
75
+ transportKind: I.supported ? L : null,
76
+ suppressWebSpeech: l && I.supported && L !== "web-speech" && w === null && y(u),
77
+ fallbackReason: w,
78
+ nothingHeard: E,
79
+ privacyNotice: G === "notice" ? W : null
67
80
  };
68
81
  }
69
82
  //#endregion
70
- export { f as HIDDEN_RELEASE_MS, m as useHandsFreeInterrupt };
83
+ export { _ as HIDDEN_RELEASE_MS, b as useHandsFreeInterrupt };