@burdenoff/fe-libs 2026.1007.3 → 2026.1007.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.
Files changed (112) hide show
  1. package/dist/chrome/AutoBreadcrumbs.d.ts.map +1 -1
  2. package/dist/chrome/AutoBreadcrumbs.js +65 -76
  3. package/dist/chrome/Breadcrumb.d.ts.map +1 -1
  4. package/dist/chrome/Breadcrumbs.d.ts.map +1 -1
  5. package/dist/chrome/Breadcrumbs.js +47 -46
  6. package/dist/chrome/ContextSwitcher.js +86 -86
  7. package/dist/chrome/HeaderBar.d.ts.map +1 -1
  8. package/dist/chrome/HeaderBar.js +111 -107
  9. package/dist/chrome/HeaderThemeSwitcher.d.ts.map +1 -1
  10. package/dist/chrome/HeaderThemeSwitcher.js +46 -45
  11. package/dist/chrome/LanguageSwitcher.js +4 -4
  12. package/dist/chrome/MobileTabBar.js +4 -4
  13. package/dist/chrome/PageHeader.d.ts.map +1 -1
  14. package/dist/chrome/PageHeader.js +32 -30
  15. package/dist/chrome/PersonaSurfaceControls.js +8 -8
  16. package/dist/chrome/ProductSideNav.js +6 -6
  17. package/dist/chrome/ProfileSwitcher.d.ts.map +1 -1
  18. package/dist/chrome/ProfileSwitcher.js +89 -88
  19. package/dist/chrome/SideNavigation.js +4 -4
  20. package/dist/chrome/Tabs.d.ts.map +1 -1
  21. package/dist/chrome/Tabs.js +30 -29
  22. package/dist/chrome/breadcrumbLabel.d.ts +10 -0
  23. package/dist/chrome/breadcrumbLabel.d.ts.map +1 -0
  24. package/dist/chrome/breadcrumbLabel.js +31 -0
  25. package/dist/chrome/contextSwitcher/TriggerButton.d.ts.map +1 -1
  26. package/dist/chrome/contextSwitcher/TriggerButton.js +40 -36
  27. package/dist/chrome/notificationCenter/BellButton.d.ts.map +1 -1
  28. package/dist/chrome/notificationCenter/BellButton.js +29 -25
  29. package/dist/chrome/shellLabelManifest.d.ts +27 -0
  30. package/dist/chrome/shellLabelManifest.d.ts.map +1 -0
  31. package/dist/chrome/sideNavigation/SidebarHeader.d.ts.map +1 -1
  32. package/dist/chrome/sideNavigation/SidebarHeader.js +23 -22
  33. package/dist/shared/assistant/appControls/languageReply.d.ts +6 -1
  34. package/dist/shared/assistant/appControls/languageReply.d.ts.map +1 -1
  35. package/dist/shared/assistant/i18nManifest.d.ts +20 -5
  36. package/dist/shared/assistant/i18nManifest.d.ts.map +1 -1
  37. package/dist/shared/assistant/i18nManifest.js +30 -22
  38. package/dist/shared/assistant/index.d.ts +3 -0
  39. package/dist/shared/assistant/index.d.ts.map +1 -1
  40. package/dist/shared/assistant/productCopy.d.ts +78 -0
  41. package/dist/shared/assistant/productCopy.d.ts.map +1 -0
  42. package/dist/shared/assistant/productCopy.js +45 -0
  43. package/dist/shared/assistant/store.d.ts +10 -0
  44. package/dist/shared/assistant/store.d.ts.map +1 -1
  45. package/dist/shared/assistant/store.js +19 -8
  46. package/dist/shared/assistant/ui/AssistantChatArea.d.ts.map +1 -1
  47. package/dist/shared/assistant/ui/AssistantChatArea.js +1070 -1067
  48. package/dist/shared/assistant/ui/AssistantEmptyState.d.ts.map +1 -1
  49. package/dist/shared/assistant/ui/AssistantEmptyState.js +30 -22
  50. package/dist/shared/assistant/ui/AssistantHeader.d.ts.map +1 -1
  51. package/dist/shared/assistant/ui/AssistantHeader.js +46 -45
  52. package/dist/shared/assistant/ui/useVoiceSession.d.ts +14 -1
  53. package/dist/shared/assistant/ui/useVoiceSession.d.ts.map +1 -1
  54. package/dist/shared/assistant/ui/useVoiceSession.js +241 -233
  55. package/dist/shared/assistant/ui/voice/AssistantVoiceSession.d.ts +7 -0
  56. package/dist/shared/assistant/ui/voice/AssistantVoiceSession.d.ts.map +1 -1
  57. package/dist/shared/assistant/ui/voice/AssistantVoiceSession.js +137 -130
  58. package/dist/shared/assistant/ui/voice/HandsFreePrivacyNotice.d.ts +27 -0
  59. package/dist/shared/assistant/ui/voice/HandsFreePrivacyNotice.d.ts.map +1 -0
  60. package/dist/shared/assistant/ui/voice/HandsFreePrivacyNotice.js +52 -0
  61. package/dist/shared/assistant/voice/handsfree/backendStreamTransport.d.ts +29 -6
  62. package/dist/shared/assistant/voice/handsfree/backendStreamTransport.d.ts.map +1 -1
  63. package/dist/shared/assistant/voice/handsfree/backendStreamTransport.js +138 -63
  64. package/dist/shared/assistant/voice/handsfree/handsFreeController.d.ts +7 -1
  65. package/dist/shared/assistant/voice/handsfree/handsFreeController.d.ts.map +1 -1
  66. package/dist/shared/assistant/voice/handsfree/handsFreeRuntime.d.ts +18 -10
  67. package/dist/shared/assistant/voice/handsfree/handsFreeRuntime.d.ts.map +1 -1
  68. package/dist/shared/assistant/voice/handsfree/handsFreeRuntime.js +46 -57
  69. package/dist/shared/assistant/voice/handsfree/streamingConfig.d.ts +103 -0
  70. package/dist/shared/assistant/voice/handsfree/streamingConfig.d.ts.map +1 -0
  71. package/dist/shared/assistant/voice/handsfree/streamingConfig.js +71 -0
  72. package/dist/shared/assistant/voice/handsfree/sttTransport.d.ts +12 -7
  73. package/dist/shared/assistant/voice/handsfree/sttTransport.d.ts.map +1 -1
  74. package/dist/shared/assistant/voice/handsfree/sttTransport.js +1 -1
  75. package/dist/shared/assistant/voice/handsfree/useHandsFreeInterrupt.d.ts +23 -1
  76. package/dist/shared/assistant/voice/handsfree/useHandsFreeInterrupt.d.ts.map +1 -1
  77. package/dist/shared/assistant/voice/handsfree/useHandsFreeInterrupt.js +63 -50
  78. package/dist/shared/components/ContextConversationWidget.js +1 -1
  79. package/dist/shared/events/sinks/RybbitSink.d.ts.map +1 -1
  80. package/dist/shared/events/sinks/RybbitSink.js +66 -69
  81. package/dist/shared/providers/AppShellProvider.d.ts +17 -0
  82. package/dist/shared/providers/AppShellProvider.d.ts.map +1 -1
  83. package/dist/shared/providers/AppShellProvider.js +188 -180
  84. package/dist/shared/providers/shell/I18nProvider.d.ts +92 -4
  85. package/dist/shared/providers/shell/I18nProvider.d.ts.map +1 -1
  86. package/dist/shared/providers/shell/I18nProvider.js +187 -79
  87. package/dist/shared/providers/shell/ProfileI18nBridge.d.ts +18 -2
  88. package/dist/shared/providers/shell/ProfileI18nBridge.d.ts.map +1 -1
  89. package/dist/shared/providers/shell/ProfileI18nBridge.js +55 -41
  90. package/dist/shared/providers/shell/directionMode.d.ts +25 -0
  91. package/dist/shared/providers/shell/directionMode.d.ts.map +1 -0
  92. package/dist/shared/providers/shell/directionMode.js +34 -0
  93. package/dist/shared/providers/shell/index.d.ts +4 -2
  94. package/dist/shared/providers/shell/index.d.ts.map +1 -1
  95. package/dist/shared/providers/shell/translationLayers.d.ts +30 -0
  96. package/dist/shared/providers/shell/translationLayers.d.ts.map +1 -0
  97. package/dist/shared/providers/shell/translationLayers.js +35 -0
  98. package/dist/shared/providers/shell/translationStore.d.ts +55 -0
  99. package/dist/shared/providers/shell/translationStore.d.ts.map +1 -0
  100. package/dist/shared/providers/shell/translationStore.js +100 -0
  101. package/dist/shared/providers/shell/useShellLabel.d.ts +13 -1
  102. package/dist/shared/providers/shell/useShellLabel.d.ts.map +1 -1
  103. package/dist/shared/providers/shell/useShellLabel.js +10 -9
  104. package/dist/shared-assistant.js +190 -187
  105. package/dist/shared-providers-shell.js +20 -19
  106. package/dist/ui/boff-ui2.d.ts.map +1 -1
  107. package/dist/ui/cta-overflow-menu.d.ts.map +1 -1
  108. package/dist/ui/cta-overflow-menu.js +20 -18
  109. package/dist/ui/guidance.d.ts +1 -1
  110. package/dist/ui/guidance.d.ts.map +1 -1
  111. package/dist/ui/guidance.js +53 -52
  112. package/package.json +3 -2
@@ -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 };
@@ -3,8 +3,8 @@ import "../../shared-graphql.js";
3
3
  import { useAuth as t } from "../providers/shell/AuthProvider.js";
4
4
  import { useActiveContext as n } from "../providers/shell/ActiveContextProvider.js";
5
5
  import { Card as r, CardContent as ee } from "../../ui/card.js";
6
- import "../../ui.js";
7
6
  import { useI18n as te } from "../providers/shell/I18nProvider.js";
7
+ import "../../ui.js";
8
8
  import { usePageConversationContext as ne } from "../providers/shell/PageConversationContextProvider.js";
9
9
  import "../../shared-providers-shell.js";
10
10
  import { Composer as i } from "./contextConversationWidget/Composer.js";
@@ -1 +1 @@
1
- {"version":3,"file":"RybbitSink.d.ts","sourceRoot":"","sources":["../../../../src/shared/events/sinks/RybbitSink.tsx"],"names":[],"mappings":"AAGA,OAAO,EAAe,KAAK,kBAAkB,EAAE,MAAM,UAAU,CAAC;AAEhE;;;;GAIG;AACH,eAAO,MAAM,wBAAwB,EAAE,kBAAkB,EAiCxD,CAAC;AAqDF,UAAU,eAAe;IACvB,MAAM,EAAE,MAAM,GAAG,SAAS,CAAC;IAC3B,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,uEAAuE;IACvE,MAAM,CAAC,EAAE,OAAO,CAAC,MAAM,CAAC,kBAAkB,EAAE,MAAM,CAAC,CAAC,CAAC;IACrD,yFAAyF;IACzF,SAAS,CAAC,EAAE,kBAAkB,EAAE,CAAC;IACjC,8CAA8C;IAC9C,UAAU,CAAC,EAAE,kBAAkB,CAAC;CACjC;AAWD,6EAA6E;AAC7E,MAAM,MAAM,sBAAsB,GAAG,SAAS,GAAG,QAAQ,CAAC;AAE1D;;;;;;;;;GASG;AACH,wBAAgB,0BAA0B,IAAI,sBAAsB,GAAG,IAAI,CAI1E;AAED,wBAAgB,oBAAoB,IAAI,OAAO,CAG9C;AAED,wBAAgB,mBAAmB,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CAQ1D;AA2BD,wBAAgB,sBAAsB,CAAC,GAAG,EAAE,MAAM,EAAE,SAAS,EAAE,kBAAkB,GAAG,OAAO,CAM1F;AA6BD;;;GAGG;AACH,wBAAgB,UAAU,CAAC,EACzB,MAAM,EACN,SAAiD,EACjD,MAAqB,EACrB,SAAoC,EACpC,UAA6B,GAC9B,EAAE,eAAe,QAqEjB;AAED;;;;;;GAMG;AACH,wBAAgB,sBAAsB,CAAC,EAAE,WAA4B,EAAE,EAAE;IAAE,WAAW,CAAC,EAAE,MAAM,CAAA;CAAE,kDA4DhG"}
1
+ {"version":3,"file":"RybbitSink.d.ts","sourceRoot":"","sources":["../../../../src/shared/events/sinks/RybbitSink.tsx"],"names":[],"mappings":"AAGA,OAAO,EAAe,KAAK,kBAAkB,EAAE,MAAM,UAAU,CAAC;AAGhE;;;;GAIG;AACH,eAAO,MAAM,wBAAwB,EAAE,kBAAkB,EAiCxD,CAAC;AAqDF,UAAU,eAAe;IACvB,MAAM,EAAE,MAAM,GAAG,SAAS,CAAC;IAC3B,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,uEAAuE;IACvE,MAAM,CAAC,EAAE,OAAO,CAAC,MAAM,CAAC,kBAAkB,EAAE,MAAM,CAAC,CAAC,CAAC;IACrD,yFAAyF;IACzF,SAAS,CAAC,EAAE,kBAAkB,EAAE,CAAC;IACjC,8CAA8C;IAC9C,UAAU,CAAC,EAAE,kBAAkB,CAAC;CACjC;AAWD,6EAA6E;AAC7E,MAAM,MAAM,sBAAsB,GAAG,SAAS,GAAG,QAAQ,CAAC;AAE1D;;;;;;;;;GASG;AACH,wBAAgB,0BAA0B,IAAI,sBAAsB,GAAG,IAAI,CAI1E;AAED,wBAAgB,oBAAoB,IAAI,OAAO,CAG9C;AAED,wBAAgB,mBAAmB,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CAQ1D;AA2BD,wBAAgB,sBAAsB,CAAC,GAAG,EAAE,MAAM,EAAE,SAAS,EAAE,kBAAkB,GAAG,OAAO,CAM1F;AA6BD;;;GAGG;AACH,wBAAgB,UAAU,CAAC,EACzB,MAAM,EACN,SAAiD,EACjD,MAAqB,EACrB,SAAoC,EACpC,UAA6B,GAC9B,EAAE,eAAe,QAqEjB;AAED;;;;;;GAMG;AACH,wBAAgB,sBAAsB,CAAC,EAAE,WAA4B,EAAE,EAAE;IAAE,WAAW,CAAC,EAAE,MAAM,CAAA;CAAE,kDAiEhG"}
@@ -1,16 +1,17 @@
1
1
  "use client";
2
- import { useEventBus as e } from "../../../shared-events.js";
3
- import { useEffect as t, useRef as n, useState as r } from "react";
4
- import { jsx as i, jsxs as a } from "react/jsx-runtime";
2
+ import { useShellLabel as e } from "../../providers/shell/useShellLabel.js";
3
+ import { useEventBus as t } from "../../../shared-events.js";
4
+ import { useEffect as n, useRef as r, useState as i } from "react";
5
+ import { jsx as a, jsxs as o } from "react/jsx-runtime";
5
6
  //#region src/shared/events/sinks/RybbitSink.tsx
6
- var o = /* @__PURE__ */ "nav.route.changed,auth.signed_in,auth.signed_out,support.ticket.created,support.ticket.closed,support.ticket.reopened,support.kb.article_rated,notification.item.opened,notification.preference.updated,notification.admin.sent,notification.template.saved,notification.schedule.updated,bigconsole.dashboard.import_clicked,bigconsole.dashboard.imported,bigconsole.dashboard.share_clicked,bigconsole.dashboard.shared,bigconsole.data_sink.import_clicked,bigconsole.data_sink.imported,bigconsole.widget.create_clicked,bigconsole.widget.created,bigconsole.widget.duplicate_clicked,bigconsole.widget.duplicated,bigconsole.ai.generate_clicked,bigconsole.ai.dashboard_generated,bigconsole.ai.create_dashboard_clicked,bigconsole.ai.dashboard_created".split(","), s = /(token|password|secret|authorization|cookie|session|email|name|stack|message|subject|description|query|search|prompt|formula|reason|body|content)/i, c = /(^id$|Id$|_id$|_ID$)/, l = [
7
+ var s = /* @__PURE__ */ "nav.route.changed,auth.signed_in,auth.signed_out,support.ticket.created,support.ticket.closed,support.ticket.reopened,support.kb.article_rated,notification.item.opened,notification.preference.updated,notification.admin.sent,notification.template.saved,notification.schedule.updated,bigconsole.dashboard.import_clicked,bigconsole.dashboard.imported,bigconsole.dashboard.share_clicked,bigconsole.dashboard.shared,bigconsole.data_sink.import_clicked,bigconsole.data_sink.imported,bigconsole.widget.create_clicked,bigconsole.widget.created,bigconsole.widget.duplicate_clicked,bigconsole.widget.duplicated,bigconsole.ai.generate_clicked,bigconsole.ai.dashboard_generated,bigconsole.ai.create_dashboard_clicked,bigconsole.ai.dashboard_created".split(","), c = /(token|password|secret|authorization|cookie|session|email|name|stack|message|subject|description|query|search|prompt|formula|reason|body|content)/i, l = /(^id$|Id$|_id$|_ID$)/, u = [
7
8
  "ticketId",
8
9
  "categoryId",
9
10
  "workspaceId"
10
- ], u = ["workspaceId"], d = {
11
- "support.ticket.created": l,
12
- "support.ticket.closed": l,
13
- "support.ticket.reopened": l,
11
+ ], d = ["workspaceId"], f = {
12
+ "support.ticket.created": u,
13
+ "support.ticket.closed": u,
14
+ "support.ticket.reopened": u,
14
15
  "support.kb.article_rated": ["articleId"],
15
16
  "bigconsole.dashboard.imported": ["dashboardId"],
16
17
  "bigconsole.dashboard.share_clicked": ["dashboardId"],
@@ -36,54 +37,54 @@ var o = /* @__PURE__ */ "nav.route.changed,auth.signed_in,auth.signed_out,suppor
36
37
  "bigconsole.ai.dashboard_generated": ["generationId"],
37
38
  "bigconsole.ai.create_dashboard_clicked": ["generationId"],
38
39
  "bigconsole.ai.dashboard_created": ["dashboardId", "generationId"],
39
- "healthybowl.farm.created": u,
40
- "healthybowl.crop.created": u,
41
- "healthybowl.crop.updated": u,
42
- "healthybowl.harvest.recorded": u
43
- }, f = {
40
+ "healthybowl.farm.created": d,
41
+ "healthybowl.crop.created": d,
42
+ "healthybowl.crop.updated": d,
43
+ "healthybowl.harvest.recorded": d
44
+ }, p = {
44
45
  "auth.signed_out": ["reason"],
45
46
  "psw.search.performed": ["queryLength"]
46
- }, p = {}, m = "bf-analytics-consent", h = "burdenoff:analytics-consent";
47
- function g() {
47
+ }, m = {}, h = "bf-analytics-consent", g = "burdenoff:analytics-consent";
48
+ function _() {
48
49
  return navigator.globalPrivacyControl === !0;
49
50
  }
50
- function _() {
51
+ function v() {
51
52
  if (typeof window > "u") return null;
52
- let e = window.localStorage.getItem(m);
53
+ let e = window.localStorage.getItem(h);
53
54
  return e === "granted" || e === "denied" ? e : null;
54
55
  }
55
- function v() {
56
- return typeof window > "u" || g() ? !1 : _() === "granted";
56
+ function y() {
57
+ return typeof window > "u" || _() ? !1 : v() === "granted";
57
58
  }
58
- function y(e) {
59
- typeof window > "u" || (window.localStorage.setItem(m, e ? "granted" : "denied"), window.dispatchEvent(new CustomEvent(h, { detail: { granted: e } })));
59
+ function b(e) {
60
+ typeof window > "u" || (window.localStorage.setItem(h, e ? "granted" : "denied"), window.dispatchEvent(new CustomEvent(g, { detail: { granted: e } })));
60
61
  }
61
- function b() {
62
+ function x() {
62
63
  let e = window;
63
64
  return navigator.doNotTrack === "1" || e.doNotTrack === "1";
64
65
  }
65
- function x(e) {
66
+ function S(e) {
66
67
  let t = 2166136261;
67
68
  for (let n = 0; n < e.length; n += 1) t ^= e.charCodeAt(n), t = Math.imul(t, 16777619);
68
69
  return `u_${(t >>> 0).toString(16).padStart(8, "0")}`;
69
70
  }
70
- async function S(e) {
71
+ async function C(e) {
71
72
  if (crypto.subtle) {
72
73
  let t = new TextEncoder().encode(e), n = await crypto.subtle.digest("SHA-256", t);
73
74
  return Array.from(new Uint8Array(n), (e) => e.toString(16).padStart(2, "0")).join("");
74
75
  }
75
- return x(e);
76
- }
77
- function C(e, t) {
78
- return s.test(e) ? !(f[t] ?? []).includes(e) : c.test(e) ? !(d[t] ?? []).includes(e) : !1;
76
+ return S(e);
79
77
  }
80
78
  function w(e, t) {
79
+ return c.test(e) ? !(p[t] ?? []).includes(e) : l.test(e) ? !(f[t] ?? []).includes(e) : !1;
80
+ }
81
+ function T(e, t) {
81
82
  if (!e || typeof e != "object" || Array.isArray(e)) return {};
82
83
  let n = {};
83
- for (let [r, i] of Object.entries(e)) C(r, t) || (typeof i == "string" || typeof i == "number" || typeof i == "boolean") && (n[r] = i);
84
+ for (let [r, i] of Object.entries(e)) w(r, t) || (typeof i == "string" || typeof i == "number" || typeof i == "boolean") && (n[r] = i);
84
85
  return n;
85
86
  }
86
- function T(e) {
87
+ function E(e) {
87
88
  let t = {};
88
89
  for (let [n, r] of Object.entries(e)) {
89
90
  let e = {
@@ -95,39 +96,39 @@ function T(e) {
95
96
  }
96
97
  return t;
97
98
  }
98
- function E({ siteId: i, scriptUrl: a = "https://app.rybbit.io/api/script.js", rename: s = p, allowlist: c = o, identifyOn: l = "auth.signed_in" }) {
99
- let u = e(), d = n(!1), [f, _] = r(v);
100
- return t(() => {
101
- let e = () => _(v()), t = (t) => {
102
- t.key === m && e();
99
+ function D({ siteId: e, scriptUrl: a = "https://app.rybbit.io/api/script.js", rename: o = m, allowlist: c = s, identifyOn: l = "auth.signed_in" }) {
100
+ let u = t(), d = r(!1), [f, p] = i(y);
101
+ return n(() => {
102
+ let e = () => p(y()), t = (t) => {
103
+ t.key === h && e();
103
104
  };
104
- return window.addEventListener(h, e), window.addEventListener("storage", t), () => {
105
- window.removeEventListener(h, e), window.removeEventListener("storage", t);
105
+ return window.addEventListener(g, e), window.addEventListener("storage", t), () => {
106
+ window.removeEventListener(g, e), window.removeEventListener("storage", t);
106
107
  };
107
- }, []), t(() => {
108
- if (!i || !f || g() || d.current) return;
108
+ }, []), n(() => {
109
+ if (!e || !f || _() || d.current) return;
109
110
  d.current = !0;
110
- let e = document.createElement("script");
111
- return e.src = a, e.defer = !0, e.dataset.siteId = i, document.head.appendChild(e), () => {
112
- document.head.removeChild(e);
111
+ let t = document.createElement("script");
112
+ return t.src = a, t.defer = !0, t.dataset.siteId = e, document.head.appendChild(t), () => {
113
+ document.head.removeChild(t);
113
114
  };
114
115
  }, [
115
- i,
116
+ e,
116
117
  a,
117
118
  f
118
- ]), t(() => {
119
- if (!(!i || !f || g())) return u.onAny((e) => {
120
- if (b()) return;
119
+ ]), n(() => {
120
+ if (!(!e || !f || _())) return u.onAny((e) => {
121
+ if (x()) return;
121
122
  let t = window;
122
123
  if (!t.rybbit || !c.includes(e.name)) return;
123
- let n = T({
124
+ let n = E({
124
125
  route: e.metadata.route.pathname,
125
126
  env: e.metadata.app.env,
126
- ...w(e.payload, e.name)
127
+ ...T(e.payload, e.name)
127
128
  });
128
129
  if (e.name === l) {
129
130
  let r = e.payload, i = r?.userId ?? r?.actorId ?? r?.id;
130
- i && S(i).then((e) => {
131
+ i && C(i).then((e) => {
131
132
  t.rybbit?.identify(e, n);
132
133
  });
133
134
  }
@@ -135,50 +136,46 @@ function E({ siteId: i, scriptUrl: a = "https://app.rybbit.io/api/script.js", re
135
136
  t.rybbit.pageview();
136
137
  return;
137
138
  }
138
- let r = s[e.name] ?? e.name;
139
+ let r = o[e.name] ?? e.name;
139
140
  t.rybbit.event(r, n);
140
141
  });
141
142
  }, [
142
143
  u,
143
- i,
144
+ e,
144
145
  c,
145
146
  l,
146
- s,
147
+ o,
147
148
  f
148
149
  ]), null;
149
150
  }
150
- function D({ productName: e = "this product" }) {
151
- let [t, n] = r(() => _() === null);
152
- return !t || g() ? null : /* @__PURE__ */ a("aside", {
151
+ function O({ productName: t = "this product" }) {
152
+ let [n, r] = i(() => v() === null), s = e();
153
+ return !n || _() ? null : /* @__PURE__ */ o("aside", {
153
154
  className: "fixed bottom-4 left-4 z-[100] w-[calc(100%-2rem)] max-w-sm rounded-xl border border-border-seam bg-bg-surface p-4 text-text-primary shadow-pop",
154
- "aria-label": "Privacy choices",
155
+ "aria-label": s("privacyConsent.ariaLabel", "Privacy choices"),
155
156
  "data-testid": "analytics-consent-banner",
156
157
  children: [/* @__PURE__ */ a("p", {
157
158
  className: "text-sm",
158
- children: [
159
- "Allow optional analytics to help improve ",
160
- e,
161
- "? Essential product operation works either way."
162
- ]
163
- }), /* @__PURE__ */ a("div", {
159
+ children: s("privacyConsent.message", "Allow optional analytics to help improve {{productName}}? Essential product operation works either way.", { productName: t })
160
+ }), /* @__PURE__ */ o("div", {
164
161
  className: "mt-3 flex gap-2",
165
- children: [/* @__PURE__ */ i("button", {
162
+ children: [/* @__PURE__ */ a("button", {
166
163
  type: "button",
167
164
  className: "rounded-md border border-border-seam px-3 py-2 text-sm",
168
165
  onClick: () => {
169
- y(!1), n(!1);
166
+ b(!1), r(!1);
170
167
  },
171
- children: "Reject optional"
172
- }), /* @__PURE__ */ i("button", {
168
+ children: s("privacyConsent.reject", "Reject optional")
169
+ }), /* @__PURE__ */ a("button", {
173
170
  type: "button",
174
171
  className: "rounded-md bg-action-primary-bg px-3 py-2 text-sm text-action-primary-text",
175
172
  onClick: () => {
176
- y(!0), n(!1);
173
+ b(!0), r(!1);
177
174
  },
178
- children: "Allow analytics"
175
+ children: s("privacyConsent.allow", "Allow analytics")
179
176
  })]
180
177
  })]
181
178
  });
182
179
  }
183
180
  //#endregion
184
- export { D as AnalyticsConsentBanner, E as RybbitSink, v as readAnalyticsConsent, _ as readAnalyticsConsentChoice, y as setAnalyticsConsent };
181
+ export { O as AnalyticsConsentBanner, D as RybbitSink, y as readAnalyticsConsent, v as readAnalyticsConsentChoice, b as setAnalyticsConsent };
@@ -13,6 +13,23 @@ export interface AppShellConfig {
13
13
  domain?: string;
14
14
  /** Product ID for i18n translations service */
15
15
  i18nProductId: string;
16
+ /**
17
+ * The platform dictionary layered UNDER the product's: fallback < platform <
18
+ * product (BOFF-8060). Default `workspaces`, where the platform screens and
19
+ * the shared chrome keep their keys. `null` loads the product dictionary
20
+ * alone. Ignored by the Workspaces app itself (same id).
21
+ */
22
+ platformI18nProductId?: string | null;
23
+ /**
24
+ * Right-to-left support (BOFF-8060, F6). `enabled` (default false) lets
25
+ * `dir` follow the locale (Arabic RTL); leave it off until the product's UI
26
+ * uses logical CSS properties. `preview` (default true) honours the QA
27
+ * override `?dir=rtl` / `?dir=locale` / `?dir=off`.
28
+ */
29
+ rtl?: {
30
+ enabled?: boolean;
31
+ preview?: boolean;
32
+ };
16
33
  /** Resolved gateway URLs */
17
34
  gatewayUrls: {
18
35
  workspaceBaseUrl: string;
@@ -1 +1 @@
1
- {"version":3,"file":"AppShellProvider.d.ts","sourceRoot":"","sources":["../../../src/shared/providers/AppShellProvider.tsx"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"AppShellProvider.d.ts","sourceRoot":"","sources":["../../../src/shared/providers/AppShellProvider.tsx"],"names":[],"mappings":"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"}