@garrix82/reactgenie-lib 1.3.0

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 (85) hide show
  1. package/.env.example +22 -0
  2. package/.github/workflows/publish.yml +20 -0
  3. package/LICENSE.txt +201 -0
  4. package/README.md +621 -0
  5. package/babel.config.js +29 -0
  6. package/dist/adapters/__tests__/expo-router-adapter.test.d.ts +1 -0
  7. package/dist/adapters/expo-router-adapter.d.ts +16 -0
  8. package/dist/adapters/expo-router-adapter.js +521 -0
  9. package/dist/adapters/navigation-adapter.d.ts +20 -0
  10. package/dist/adapters/navigation-adapter.js +137 -0
  11. package/dist/audio-visualizer.d.ts +14 -0
  12. package/dist/audio-visualizer.js +123 -0
  13. package/dist/current-selection.d.ts +27 -0
  14. package/dist/current-selection.js +94 -0
  15. package/dist/errors.d.ts +19 -0
  16. package/dist/errors.js +37 -0
  17. package/dist/genie/DateTime.d.ts +66 -0
  18. package/dist/genie/DateTime.js +399 -0
  19. package/dist/genie/TimeDelta.d.ts +35 -0
  20. package/dist/genie/TimeDelta.js +169 -0
  21. package/dist/genie-view-wrapper.d.ts +1 -0
  22. package/dist/genie-view-wrapper.js +377 -0
  23. package/dist/hooks/__tests__/useSpeechRecognition.test.d.ts +1 -0
  24. package/dist/hooks/useSpeechRecognition.d.ts +28 -0
  25. package/dist/hooks/useSpeechRecognition.js +118 -0
  26. package/dist/index.d.ts +30 -0
  27. package/dist/index.js +469 -0
  28. package/dist/logger.d.ts +23 -0
  29. package/dist/logger.js +597 -0
  30. package/dist/logger.remote.test.d.ts +0 -0
  31. package/dist/modality-provider-v2.d.ts +28 -0
  32. package/dist/modality-provider-v2.js +1321 -0
  33. package/dist/modality-provider.d.ts +22 -0
  34. package/dist/modality-provider.js +373 -0
  35. package/dist/native-visibility.d.ts +28 -0
  36. package/dist/native-visibility.js +50 -0
  37. package/dist/platform/VoiceRecognitionBar.d.ts +17 -0
  38. package/dist/platform/VoiceRecognitionBar.js +332 -0
  39. package/dist/platform/components.d.ts +32 -0
  40. package/dist/platform/components.js +351 -0
  41. package/dist/platform/events.d.ts +31 -0
  42. package/dist/platform/events.js +274 -0
  43. package/dist/platform/index.d.ts +3 -0
  44. package/dist/platform/index.js +39 -0
  45. package/dist/platform/types.d.ts +79 -0
  46. package/dist/platform/types.js +97 -0
  47. package/dist/react-decorators.d.ts +87 -0
  48. package/dist/react-decorators.js +368 -0
  49. package/dist/shared-store.d.ts +74 -0
  50. package/dist/shared-store.js +589 -0
  51. package/dist/speech-recognition/__tests__/speech-recognition-groq-transport.test.d.ts +1 -0
  52. package/dist/speech-recognition/__tests__/speech-recognition-native.test.d.ts +1 -0
  53. package/dist/speech-recognition/__tests__/speech-recognition-openai-native.test.d.ts +1 -0
  54. package/dist/speech-recognition/__tests__/speech-recognition-openai.test.d.ts +1 -0
  55. package/dist/speech-recognition/__tests__/speech-recognition-unified-import.test.d.ts +0 -0
  56. package/dist/speech-recognition/__tests__/speech-recognition-unified.test.d.ts +1 -0
  57. package/dist/speech-recognition/speech-recognition-groq.d.ts +21 -0
  58. package/dist/speech-recognition/speech-recognition-groq.js +409 -0
  59. package/dist/speech-recognition/speech-recognition-mlx.d.ts +15 -0
  60. package/dist/speech-recognition/speech-recognition-mlx.js +393 -0
  61. package/dist/speech-recognition/speech-recognition-native.d.ts +24 -0
  62. package/dist/speech-recognition/speech-recognition-native.js +632 -0
  63. package/dist/speech-recognition/speech-recognition-openai-native.d.ts +40 -0
  64. package/dist/speech-recognition/speech-recognition-openai-native.js +653 -0
  65. package/dist/speech-recognition/speech-recognition-openai.d.ts +39 -0
  66. package/dist/speech-recognition/speech-recognition-openai.js +718 -0
  67. package/dist/speech-recognition/speech-recognition-unified.d.ts +93 -0
  68. package/dist/speech-recognition/speech-recognition-unified.js +589 -0
  69. package/dist/speech-recognition/utils/groq-transcription.d.ts +41 -0
  70. package/dist/speech-recognition/utils/groq-transcription.js +382 -0
  71. package/dist/speech-recognition.d.ts +7 -0
  72. package/dist/speech-recognition.js +61 -0
  73. package/dist/voice-pipeline-telemetry.d.ts +26 -0
  74. package/dist/voice-pipeline-telemetry.js +15 -0
  75. package/garrix82-reactgenie-lib-1.3.0.tgz +0 -0
  76. package/metro/index.js +3 -0
  77. package/metro/with-genie-registry.js +47 -0
  78. package/package.json +111 -0
  79. package/scripts/dry-run.js +23 -0
  80. package/scripts/generate-genie-registry.js +278 -0
  81. package/scripts/log-file-test.js +51 -0
  82. package/scripts/parse.js +26 -0
  83. package/scripts/prompt.js +19 -0
  84. package/scripts/set-script.js +200 -0
  85. package/tsconfig.json +36 -0
@@ -0,0 +1,22 @@
1
+ import React from "react";
2
+ import { NlInterpreter, ExampleParse, type NlInterpreterParserConfig } from "@garrix82/reactgenie-dsl";
3
+ export declare let GenieInterpreter: NlInterpreter;
4
+ export declare const enum ListenerStateEnum {
5
+ Idle = 0,
6
+ Listening = 1,
7
+ Processing = 2
8
+ }
9
+ export declare const ModalityProvider: (props: {
10
+ examples?: ExampleParse[];
11
+ codexApiKey: string;
12
+ codexApiBaseUrl?: string;
13
+ parserConfig?: NlInterpreterParserConfig;
14
+ langsmithConfig?: {
15
+ apiKey?: string;
16
+ project?: string;
17
+ endpoint?: string;
18
+ };
19
+ displayTranscript: boolean;
20
+ extraPrompt: string;
21
+ children: React.ReactElement[] | React.ReactElement;
22
+ }) => any;
@@ -0,0 +1,373 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.ModalityProvider = exports.ListenerStateEnum = exports.GenieInterpreter = void 0;
7
+ var _react = _interopRequireWildcard(require("react"));
8
+ var _reactRedux = require("react-redux");
9
+ var _native = require("@react-navigation/native");
10
+ var _stack = require("@react-navigation/stack");
11
+ var _vectorIcons = require("@expo/vector-icons");
12
+ var _speechRecognition = require("./speech-recognition");
13
+ var _core = require("@react-native-material/core");
14
+ var _reactgenieDsl = require("@garrix82/reactgenie-dsl");
15
+ var _reactDecorators = require("./react-decorators");
16
+ var _sharedStore = require("./shared-store");
17
+ var _reactNative = require("react-native");
18
+ function _interopRequireWildcard(e, t) { if ("function" == typeof WeakMap) var r = new WeakMap(), n = new WeakMap(); return (_interopRequireWildcard = function (e, t) { if (!t && e && e.__esModule) return e; var o, i, f = { __proto__: null, default: e }; if (null === e || "object" != typeof e && "function" != typeof e) return f; if (o = t ? n : r) { if (o.has(e)) return o.get(e); o.set(e, f); } for (const t in e) "default" !== t && {}.hasOwnProperty.call(e, t) && ((i = (o = Object.defineProperty) && Object.getOwnPropertyDescriptor(e, t)) && (i.get || i.set) ? o(f, t, i) : f[t] = e[t]); return f; })(e, t); }
19
+ function ownKeys(e, r) { var t = Object.keys(e); if (Object.getOwnPropertySymbols) { var o = Object.getOwnPropertySymbols(e); r && (o = o.filter(function (r) { return Object.getOwnPropertyDescriptor(e, r).enumerable; })), t.push.apply(t, o); } return t; }
20
+ function _objectSpread(e) { for (var r = 1; r < arguments.length; r++) { var t = null != arguments[r] ? arguments[r] : {}; r % 2 ? ownKeys(Object(t), !0).forEach(function (r) { _defineProperty(e, r, t[r]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(t)) : ownKeys(Object(t)).forEach(function (r) { Object.defineProperty(e, r, Object.getOwnPropertyDescriptor(t, r)); }); } return e; }
21
+ function _defineProperty(e, r, t) { return (r = _toPropertyKey(r)) in e ? Object.defineProperty(e, r, { value: t, enumerable: !0, configurable: !0, writable: !0 }) : e[r] = t, e; }
22
+ function _toPropertyKey(t) { var i = _toPrimitive(t, "string"); return "symbol" == typeof i ? i : i + ""; }
23
+ function _toPrimitive(t, r) { if ("object" != typeof t || !t) return t; var e = t[Symbol.toPrimitive]; if (void 0 !== e) { var i = e.call(t, r || "default"); if ("object" != typeof i) return i; throw new TypeError("@@toPrimitive must return a primitive value."); } return ("string" === r ? String : Number)(t); }
24
+ const Stack = (0, _stack.createStackNavigator)();
25
+ let GenieInterpreter = exports.GenieInterpreter = void 0;
26
+ const recordInterpreterTurn = (interpreter, record) => {
27
+ const maybeTurnRecorder = interpreter;
28
+ if (typeof maybeTurnRecorder.recordTurn === "function") {
29
+ maybeTurnRecorder.recordTurn(record);
30
+ return;
31
+ }
32
+ maybeTurnRecorder.recordInteraction?.(record);
33
+ };
34
+ const DefaultScreen = children => ({
35
+ navigation
36
+ }) => {
37
+ (0, _react.useEffect)(() => {
38
+ navigation.setOptions({
39
+ headerShown: false
40
+ });
41
+ }, []);
42
+ return children;
43
+ };
44
+ const ObjectInterfaceScreen = genieInterfaceStoreElement => ({
45
+ route,
46
+ navigation
47
+ }) => {
48
+ const title = genieInterfaceStoreElement.title(route.params);
49
+ (0, _react.useEffect)(() => {
50
+ navigation.setOptions({
51
+ headerShown: true
52
+ });
53
+ navigation.setOptions({
54
+ title: title
55
+ });
56
+ }, []);
57
+ return /*#__PURE__*/_react.default.createElement(genieInterfaceStoreElement.function, route.params);
58
+ };
59
+ const cardStyle = {
60
+ presentation: "card",
61
+ animation: "default",
62
+ // v7: replaced animationEnabled with animation
63
+ headerStyleInterpolator: _stack.HeaderStyleInterpolators.forUIKit,
64
+ cardStyleInterpolator: _stack.CardStyleInterpolators.forHorizontalIOS
65
+ };
66
+ let ListenerStateEnum = exports.ListenerStateEnum = /*#__PURE__*/function (ListenerStateEnum) {
67
+ ListenerStateEnum[ListenerStateEnum["Idle"] = 0] = "Idle";
68
+ ListenerStateEnum[ListenerStateEnum["Listening"] = 1] = "Listening";
69
+ ListenerStateEnum[ListenerStateEnum["Processing"] = 2] = "Processing"; // Done,
70
+ return ListenerStateEnum;
71
+ }({});
72
+ const ModalityProvider = props => {
73
+ const resolvedProxyBaseUrl = props.codexApiBaseUrl;
74
+ const examples = (0, _sharedStore.useGenieSelector)(() => {
75
+ if (props.examples === undefined) {
76
+ return _reactgenieDsl.sharedState["__EXAMPLES__"];
77
+ } else {
78
+ return props.examples.concat(_reactgenieDsl.sharedState["__EXAMPLES__"]);
79
+ }
80
+ });
81
+ const navState = (0, _reactRedux.useSelector)(state => {
82
+ return state.navState;
83
+ });
84
+ const navStack = (0, _reactRedux.useSelector)(state => {
85
+ return state.navStack;
86
+ });
87
+ const voiceMessage = (0, _reactRedux.useSelector)(state => {
88
+ return state.message;
89
+ });
90
+ const [snackbarVisible, setSnackbarVisible] = (0, _react.useState)(false);
91
+ (0, _react.useEffect)(() => {
92
+ const messageText = voiceMessage?.fullText || voiceMessage?.message || voiceMessage?.minimalText || "";
93
+ if (voiceMessage !== null && voiceMessage !== undefined && messageText != "") {
94
+ setSnackbarVisible(true);
95
+ setTimeout(() => {
96
+ setSnackbarVisible(false);
97
+ }, 3000);
98
+ }
99
+ }, [voiceMessage]);
100
+ exports.GenieInterpreter = GenieInterpreter = (0, _react.useMemo)(() => {
101
+ const descriptors = [];
102
+ for (const key in _reactDecorators.AllGenieObjects) {
103
+ descriptors.push(_reactDecorators.AllGenieObjects[key].ClassDescriptor);
104
+ }
105
+ return new _reactgenieDsl.NlInterpreter(descriptors, props.codexApiKey, undefined, examples, props.extraPrompt, {
106
+ parser: {
107
+ provider: props.parserConfig?.provider,
108
+ groq: _objectSpread(_objectSpread({}, props.parserConfig?.groq || {}), {}, {
109
+ baseUrl: props.parserConfig?.groq?.baseUrl || resolvedProxyBaseUrl
110
+ }),
111
+ openai: _objectSpread(_objectSpread({}, props.parserConfig?.openai || {}), {}, {
112
+ baseUrl: props.parserConfig?.openai?.baseUrl || resolvedProxyBaseUrl
113
+ })
114
+ },
115
+ monitoring: {
116
+ langsmithApiKey: props.langsmithConfig?.apiKey,
117
+ langsmithProject: props.langsmithConfig?.project,
118
+ langsmithEndpoint: props.langsmithConfig?.endpoint
119
+ }
120
+ });
121
+ }, [props.codexApiKey, props.extraPrompt, props.parserConfig, props.langsmithConfig?.apiKey, props.langsmithConfig?.project, props.langsmithConfig?.endpoint, resolvedProxyBaseUrl, examples]);
122
+
123
+ //create ref to NavigationContainer with type
124
+ const navigationRef = (0, _native.useNavigationContainerRef)();
125
+ (0, _react.useEffect)(() => {
126
+ console.log("nav state changed", navState);
127
+ if (navState.objectViewClassName !== null) {
128
+ navigationRef.dispatch(_native.StackActions.push(navState.objectViewClassName, navState.objectConstructorParams));
129
+ }
130
+ }, [navStack]);
131
+ const uiList = (0, _react.useMemo)(() => {
132
+ const uiList = [];
133
+ const allInterfaces = _reactDecorators.AllGenieObjectInterfaces.allInterfaces();
134
+ for (const key in allInterfaces) {
135
+ const interfacesStoreElement = allInterfaces[key];
136
+ uiList.push(/*#__PURE__*/_react.default.createElement(Stack.Screen, {
137
+ // key={key}
138
+ name: key,
139
+ component: ObjectInterfaceScreen(interfacesStoreElement),
140
+ options: cardStyle
141
+ }));
142
+ }
143
+ return uiList;
144
+ }, []);
145
+ const gui = (0, _react.useMemo)(() =>
146
+ /*#__PURE__*/
147
+ // @ts-expect-error - React Navigation v7 types are overly strict with React 19; children are properly provided below
148
+ _react.default.createElement(_native.NavigationContainer, {
149
+ ref: navigationRef
150
+ }, /*#__PURE__*/_react.default.createElement(Stack.Navigator, {
151
+ initialRouteName: "Default GUI"
152
+ }, /*#__PURE__*/_react.default.createElement(Stack.Screen, {
153
+ name: "Default GUI",
154
+ component: DefaultScreen(props.children),
155
+ options: cardStyle
156
+ }), uiList)), [uiList, props.children]);
157
+ const [listenerState, setListenerState] = (0, _react.useState)(ListenerStateEnum.Idle);
158
+ const [shouldListen, setShouldListen] = (0, _react.useState)(false);
159
+ const [transcript, setTranscript] = (0, _react.useState)("");
160
+ const [interimTranscript, setInterimTranscript] = (0, _react.useState)("");
161
+ const [mouseDown, setMouseDown] = (0, _react.useState)(false);
162
+ (0, _react.useEffect)(() => {
163
+ console.log("listener state changed", listenerState);
164
+ setShouldListen(listenerState === ListenerStateEnum.Listening);
165
+ }, [listenerState]);
166
+ const handleClick = event => {
167
+ if (listenerState === ListenerStateEnum.Listening) {
168
+ const x = event.clientX;
169
+ const y = event.clientY;
170
+ console.log(`Click position: (${x}, ${y})`);
171
+ _reactDecorators.ClickPoints.push({
172
+ x: x,
173
+ y: y
174
+ });
175
+ }
176
+ setMouseDown(false);
177
+ };
178
+ const handleDown = () => {
179
+ setMouseDown(true);
180
+ };
181
+ const speechStatusCallback = (status, interimTranscript) => {
182
+ if (listenerState === ListenerStateEnum.Listening) {
183
+ console.log(`Speech status: ${status}`);
184
+ if (status == true) {
185
+ console.log(`Interim transcript: ${interimTranscript}`);
186
+ setInterimTranscript(interimTranscript);
187
+ }
188
+ }
189
+ };
190
+ const speechResultCallback = finalTranscript => {
191
+ if (listenerState === ListenerStateEnum.Listening) {
192
+ console.log(`Final transcript: ${finalTranscript}`);
193
+ setInterimTranscript(finalTranscript);
194
+ setTranscript(finalTranscript);
195
+ }
196
+ };
197
+ let lastTranscript = "";
198
+ (0, _react.useEffect)(() => {
199
+ if (transcript !== "" && listenerState === ListenerStateEnum.Listening) {
200
+ lastTranscript = transcript;
201
+ (0, _reactDecorators.RetrieveInterfaces)();
202
+ setListenerState(ListenerStateEnum.Processing);
203
+ setTranscript("");
204
+ const processTranscript = async () => {
205
+ let parsedCommand = null;
206
+ try {
207
+ const result = await GenieInterpreter.nlParser.parse(lastTranscript);
208
+ console.log(`parsed result: ${result}`);
209
+ setInterimTranscript("");
210
+ setListenerState(ListenerStateEnum.Idle);
211
+ if (typeof result === "string" && result.trim() !== "") {
212
+ parsedCommand = result.trim();
213
+ } else {
214
+ recordInterpreterTurn(GenieInterpreter, {
215
+ utterance: lastTranscript,
216
+ success: false,
217
+ resultSummary: "parse_empty"
218
+ });
219
+ }
220
+ const genieInterfaces = (0, _reactDecorators.RetrieveInterfaces)();
221
+ const executionResult = await (0, _sharedStore.executeGenieCode)(result, {
222
+ origin: "voice",
223
+ shouldSpeakErrors: true
224
+ });
225
+ if (executionResult.success && parsedCommand) {
226
+ recordInterpreterTurn(GenieInterpreter, {
227
+ utterance: lastTranscript,
228
+ parsed: parsedCommand,
229
+ success: true,
230
+ resultSummary: "execute_ok"
231
+ });
232
+ console.log("execution result: ", executionResult);
233
+ (0, _sharedStore.displayResult)(executionResult, lastTranscript, parsedCommand, genieInterfaces);
234
+ } else if (parsedCommand) {
235
+ recordInterpreterTurn(GenieInterpreter, {
236
+ utterance: lastTranscript,
237
+ parsed: parsedCommand,
238
+ success: false,
239
+ resultSummary: "execute_error:execution_failed"
240
+ });
241
+ }
242
+ } catch (error) {
243
+ const errorMessage = error instanceof Error ? error.message : String(error);
244
+ recordInterpreterTurn(GenieInterpreter, {
245
+ utterance: lastTranscript,
246
+ parsed: parsedCommand,
247
+ success: false,
248
+ resultSummary: parsedCommand ? `execute_error:${errorMessage}` : `parse_error:${errorMessage}`
249
+ });
250
+ setInterimTranscript("");
251
+ setListenerState(ListenerStateEnum.Idle);
252
+ } finally {
253
+ _reactDecorators.ClickPoints.splice(0, _reactDecorators.ClickPoints.length);
254
+ }
255
+ };
256
+ void processTranscript();
257
+ }
258
+ }, [transcript]);
259
+ return /*#__PURE__*/_react.default.createElement(_reactNative.View, {
260
+ style: {
261
+ flex: 1
262
+ }
263
+ }, (listenerState === ListenerStateEnum.Listening || listenerState === ListenerStateEnum.Processing) && /*#__PURE__*/_react.default.createElement(_reactNative.View, {
264
+ onStartShouldSetResponder: () => true,
265
+ onResponderGrant: handleDown,
266
+ onResponderRelease: handleClick,
267
+ style: {
268
+ position: "absolute",
269
+ top: 0,
270
+ left: 0,
271
+ backgroundColor: mouseDown ? "#7f7f7f" : "#cccccc",
272
+ width: "100%",
273
+ height: "100%",
274
+ zIndex: 3,
275
+ opacity: 0.5
276
+ }
277
+ }, listenerState === ListenerStateEnum.Processing && /*#__PURE__*/_react.default.createElement(_reactNative.View, {
278
+ style: {
279
+ position: "absolute",
280
+ top: "50%",
281
+ left: "50%",
282
+ transform: [{
283
+ translateX: -25
284
+ }, {
285
+ translateY: -25
286
+ }],
287
+ backgroundColor: "#ffffff",
288
+ padding: 10,
289
+ borderRadius: 10,
290
+ shadowColor: "#000000",
291
+ shadowOffset: {
292
+ width: 0,
293
+ height: 0
294
+ },
295
+ shadowOpacity: 0.5,
296
+ shadowRadius: 10,
297
+ elevation: 10
298
+ }
299
+ }, /*#__PURE__*/_react.default.createElement(_reactNative.ActivityIndicator, {
300
+ size: "large",
301
+ color: "#888888"
302
+ })), props.displayTranscript && /*#__PURE__*/_react.default.createElement(_reactNative.View, {
303
+ style: {
304
+ position: "absolute",
305
+ bottom: "10%",
306
+ left: "50%",
307
+ transform: [{
308
+ translateX: "-50%"
309
+ }, {
310
+ translateY: "-50%"
311
+ }],
312
+ backgroundColor: "#ffffff",
313
+ padding: 10,
314
+ borderRadius: 10,
315
+ shadowColor: "#000000",
316
+ shadowOffset: {
317
+ width: 0,
318
+ height: 0
319
+ },
320
+ shadowOpacity: 0.5,
321
+ shadowRadius: 10,
322
+ elevation: 10
323
+ }
324
+ }, /*#__PURE__*/_react.default.createElement(_reactNative.Text, {
325
+ style: {
326
+ fontSize: 20
327
+ }
328
+ }, interimTranscript))), /*#__PURE__*/_react.default.createElement(_reactNative.View, {
329
+ style: {
330
+ position: "absolute",
331
+ bottom: 50,
332
+ right: 10,
333
+ zIndex: 4
334
+ }
335
+ }, /*#__PURE__*/_react.default.createElement(_reactNative.TouchableOpacity, {
336
+ onPress: () => {
337
+ if (listenerState === ListenerStateEnum.Idle) {
338
+ setListenerState(ListenerStateEnum.Listening);
339
+ } else if (listenerState === ListenerStateEnum.Listening) {
340
+ setShouldListen(false);
341
+ }
342
+ }
343
+ }, /*#__PURE__*/_react.default.createElement(_reactNative.View, {
344
+ style: {
345
+ width: 50,
346
+ height: 50,
347
+ borderRadius: 25,
348
+ backgroundColor: listenerState === ListenerStateEnum.Listening ? "#0000ff" : "#cccccc",
349
+ justifyContent: "center",
350
+ alignItems: "center"
351
+ }
352
+ }, /*#__PURE__*/_react.default.createElement(_vectorIcons.Ionicons, {
353
+ name: listenerState === ListenerStateEnum.Listening ? "mic" : "mic-outline",
354
+ size: 28,
355
+ color: "#ffffff"
356
+ })))), /*#__PURE__*/_react.default.createElement(_speechRecognition.SpeechRecognizer, {
357
+ speechStatusCallback: speechStatusCallback,
358
+ speechResultCallback: speechResultCallback,
359
+ shouldListen: shouldListen
360
+ // groqApiKey={props.codexApiKey}
361
+ }), gui, snackbarVisible && /*#__PURE__*/_react.default.createElement(_core.Snackbar, {
362
+ message: voiceMessage?.fullText || voiceMessage?.message || voiceMessage?.minimalText || "",
363
+ style: {
364
+ position: "absolute",
365
+ start: 16,
366
+ end: 16,
367
+ bottom: 100,
368
+ backgroundColor: voiceMessage.type === "error" ? "#ff0000" : "#000000"
369
+ }
370
+ }));
371
+ };
372
+ exports.ModalityProvider = ModalityProvider;
373
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJfcmVhY3QiLCJfaW50ZXJvcFJlcXVpcmVXaWxkY2FyZCIsInJlcXVpcmUiLCJfcmVhY3RSZWR1eCIsIl9uYXRpdmUiLCJfc3RhY2siLCJfdmVjdG9ySWNvbnMiLCJfc3BlZWNoUmVjb2duaXRpb24iLCJfY29yZSIsIl9yZWFjdGdlbmllRHNsIiwiX3JlYWN0RGVjb3JhdG9ycyIsIl9zaGFyZWRTdG9yZSIsIl9yZWFjdE5hdGl2ZSIsImUiLCJ0IiwiV2Vha01hcCIsInIiLCJuIiwiX19lc01vZHVsZSIsIm8iLCJpIiwiZiIsIl9fcHJvdG9fXyIsImRlZmF1bHQiLCJoYXMiLCJnZXQiLCJzZXQiLCJoYXNPd25Qcm9wZXJ0eSIsImNhbGwiLCJPYmplY3QiLCJkZWZpbmVQcm9wZXJ0eSIsImdldE93blByb3BlcnR5RGVzY3JpcHRvciIsIm93bktleXMiLCJrZXlzIiwiZ2V0T3duUHJvcGVydHlTeW1ib2xzIiwiZmlsdGVyIiwiZW51bWVyYWJsZSIsInB1c2giLCJhcHBseSIsIl9vYmplY3RTcHJlYWQiLCJhcmd1bWVudHMiLCJsZW5ndGgiLCJmb3JFYWNoIiwiX2RlZmluZVByb3BlcnR5IiwiZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9ycyIsImRlZmluZVByb3BlcnRpZXMiLCJfdG9Qcm9wZXJ0eUtleSIsInZhbHVlIiwiY29uZmlndXJhYmxlIiwid3JpdGFibGUiLCJfdG9QcmltaXRpdmUiLCJTeW1ib2wiLCJ0b1ByaW1pdGl2ZSIsIlR5cGVFcnJvciIsIlN0cmluZyIsIk51bWJlciIsIlN0YWNrIiwiY3JlYXRlU3RhY2tOYXZpZ2F0b3IiLCJHZW5pZUludGVycHJldGVyIiwiZXhwb3J0cyIsInJlY29yZEludGVycHJldGVyVHVybiIsImludGVycHJldGVyIiwicmVjb3JkIiwibWF5YmVUdXJuUmVjb3JkZXIiLCJyZWNvcmRUdXJuIiwicmVjb3JkSW50ZXJhY3Rpb24iLCJEZWZhdWx0U2NyZWVuIiwiY2hpbGRyZW4iLCJuYXZpZ2F0aW9uIiwidXNlRWZmZWN0Iiwic2V0T3B0aW9ucyIsImhlYWRlclNob3duIiwiT2JqZWN0SW50ZXJmYWNlU2NyZWVuIiwiZ2VuaWVJbnRlcmZhY2VTdG9yZUVsZW1lbnQiLCJyb3V0ZSIsInRpdGxlIiwicGFyYW1zIiwiY3JlYXRlRWxlbWVudCIsImZ1bmN0aW9uIiwiY2FyZFN0eWxlIiwicHJlc2VudGF0aW9uIiwiYW5pbWF0aW9uIiwiaGVhZGVyU3R5bGVJbnRlcnBvbGF0b3IiLCJIZWFkZXJTdHlsZUludGVycG9sYXRvcnMiLCJmb3JVSUtpdCIsImNhcmRTdHlsZUludGVycG9sYXRvciIsIkNhcmRTdHlsZUludGVycG9sYXRvcnMiLCJmb3JIb3Jpem9udGFsSU9TIiwiTGlzdGVuZXJTdGF0ZUVudW0iLCJNb2RhbGl0eVByb3ZpZGVyIiwicHJvcHMiLCJyZXNvbHZlZFByb3h5QmFzZVVybCIsImNvZGV4QXBpQmFzZVVybCIsImV4YW1wbGVzIiwidXNlR2VuaWVTZWxlY3RvciIsInVuZGVmaW5lZCIsInNoYXJlZFN0YXRlIiwiY29uY2F0IiwibmF2U3RhdGUiLCJ1c2VTZWxlY3RvciIsInN0YXRlIiwibmF2U3RhY2siLCJ2b2ljZU1lc3NhZ2UiLCJtZXNzYWdlIiwic25hY2tiYXJWaXNpYmxlIiwic2V0U25hY2tiYXJWaXNpYmxlIiwidXNlU3RhdGUiLCJtZXNzYWdlVGV4dCIsImZ1bGxUZXh0IiwibWluaW1hbFRleHQiLCJzZXRUaW1lb3V0IiwidXNlTWVtbyIsImRlc2NyaXB0b3JzIiwia2V5IiwiQWxsR2VuaWVPYmplY3RzIiwiQ2xhc3NEZXNjcmlwdG9yIiwiTmxJbnRlcnByZXRlciIsImNvZGV4QXBpS2V5IiwiZXh0cmFQcm9tcHQiLCJwYXJzZXIiLCJwcm92aWRlciIsInBhcnNlckNvbmZpZyIsImdyb3EiLCJiYXNlVXJsIiwib3BlbmFpIiwibW9uaXRvcmluZyIsImxhbmdzbWl0aEFwaUtleSIsImxhbmdzbWl0aENvbmZpZyIsImFwaUtleSIsImxhbmdzbWl0aFByb2plY3QiLCJwcm9qZWN0IiwibGFuZ3NtaXRoRW5kcG9pbnQiLCJlbmRwb2ludCIsIm5hdmlnYXRpb25SZWYiLCJ1c2VOYXZpZ2F0aW9uQ29udGFpbmVyUmVmIiwiY29uc29sZSIsImxvZyIsIm9iamVjdFZpZXdDbGFzc05hbWUiLCJkaXNwYXRjaCIsIlN0YWNrQWN0aW9ucyIsIm9iamVjdENvbnN0cnVjdG9yUGFyYW1zIiwidWlMaXN0IiwiYWxsSW50ZXJmYWNlcyIsIkFsbEdlbmllT2JqZWN0SW50ZXJmYWNlcyIsImludGVyZmFjZXNTdG9yZUVsZW1lbnQiLCJTY3JlZW4iLCJuYW1lIiwiY29tcG9uZW50Iiwib3B0aW9ucyIsImd1aSIsIk5hdmlnYXRpb25Db250YWluZXIiLCJyZWYiLCJOYXZpZ2F0b3IiLCJpbml0aWFsUm91dGVOYW1lIiwibGlzdGVuZXJTdGF0ZSIsInNldExpc3RlbmVyU3RhdGUiLCJJZGxlIiwic2hvdWxkTGlzdGVuIiwic2V0U2hvdWxkTGlzdGVuIiwidHJhbnNjcmlwdCIsInNldFRyYW5zY3JpcHQiLCJpbnRlcmltVHJhbnNjcmlwdCIsInNldEludGVyaW1UcmFuc2NyaXB0IiwibW91c2VEb3duIiwic2V0TW91c2VEb3duIiwiTGlzdGVuaW5nIiwiaGFuZGxlQ2xpY2siLCJldmVudCIsIngiLCJjbGllbnRYIiwieSIsImNsaWVudFkiLCJDbGlja1BvaW50cyIsImhhbmRsZURvd24iLCJzcGVlY2hTdGF0dXNDYWxsYmFjayIsInN0YXR1cyIsInNwZWVjaFJlc3VsdENhbGxiYWNrIiwiZmluYWxUcmFuc2NyaXB0IiwibGFzdFRyYW5zY3JpcHQiLCJSZXRyaWV2ZUludGVyZmFjZXMiLCJQcm9jZXNzaW5nIiwicHJvY2Vzc1RyYW5zY3JpcHQiLCJwYXJzZWRDb21tYW5kIiwicmVzdWx0IiwibmxQYXJzZXIiLCJwYXJzZSIsInRyaW0iLCJ1dHRlcmFuY2UiLCJzdWNjZXNzIiwicmVzdWx0U3VtbWFyeSIsImdlbmllSW50ZXJmYWNlcyIsImV4ZWN1dGlvblJlc3VsdCIsImV4ZWN1dGVHZW5pZUNvZGUiLCJvcmlnaW4iLCJzaG91bGRTcGVha0Vycm9ycyIsInBhcnNlZCIsImRpc3BsYXlSZXN1bHQiLCJlcnJvciIsImVycm9yTWVzc2FnZSIsIkVycm9yIiwic3BsaWNlIiwiVmlldyIsInN0eWxlIiwiZmxleCIsIm9uU3RhcnRTaG91bGRTZXRSZXNwb25kZXIiLCJvblJlc3BvbmRlckdyYW50Iiwib25SZXNwb25kZXJSZWxlYXNlIiwicG9zaXRpb24iLCJ0b3AiLCJsZWZ0IiwiYmFja2dyb3VuZENvbG9yIiwid2lkdGgiLCJoZWlnaHQiLCJ6SW5kZXgiLCJvcGFjaXR5IiwidHJhbnNmb3JtIiwidHJhbnNsYXRlWCIsInRyYW5zbGF0ZVkiLCJwYWRkaW5nIiwiYm9yZGVyUmFkaXVzIiwic2hhZG93Q29sb3IiLCJzaGFkb3dPZmZzZXQiLCJzaGFkb3dPcGFjaXR5Iiwic2hhZG93UmFkaXVzIiwiZWxldmF0aW9uIiwiQWN0aXZpdHlJbmRpY2F0b3IiLCJzaXplIiwiY29sb3IiLCJkaXNwbGF5VHJhbnNjcmlwdCIsImJvdHRvbSIsIlRleHQiLCJmb250U2l6ZSIsInJpZ2h0IiwiVG91Y2hhYmxlT3BhY2l0eSIsIm9uUHJlc3MiLCJqdXN0aWZ5Q29udGVudCIsImFsaWduSXRlbXMiLCJJb25pY29ucyIsIlNwZWVjaFJlY29nbml6ZXIiLCJTbmFja2JhciIsInN0YXJ0IiwiZW5kIiwidHlwZSJdLCJzb3VyY2VzIjpbIi4uL3NyYy9tb2RhbGl0eS1wcm92aWRlci50c3giXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IFJlYWN0LCB7IHVzZUVmZmVjdCwgdXNlTWVtbywgdXNlU3RhdGUgfSBmcm9tIFwicmVhY3RcIjtcbmltcG9ydCB7IHVzZVNlbGVjdG9yIH0gZnJvbSBcInJlYWN0LXJlZHV4XCI7XG5pbXBvcnQge1xuICBOYXZpZ2F0aW9uQ29udGFpbmVyLFxuICBTdGFja0FjdGlvbnMsXG4gIHVzZU5hdmlnYXRpb25Db250YWluZXJSZWYsXG59IGZyb20gXCJAcmVhY3QtbmF2aWdhdGlvbi9uYXRpdmVcIjtcbmltcG9ydCB7XG4gIENhcmRTdHlsZUludGVycG9sYXRvcnMsXG4gIGNyZWF0ZVN0YWNrTmF2aWdhdG9yLFxuICBIZWFkZXJTdHlsZUludGVycG9sYXRvcnMsXG4gIFN0YWNrTmF2aWdhdGlvbk9wdGlvbnMsXG59IGZyb20gXCJAcmVhY3QtbmF2aWdhdGlvbi9zdGFja1wiO1xuaW1wb3J0IHsgSW9uaWNvbnMgfSBmcm9tIFwiQGV4cG8vdmVjdG9yLWljb25zXCI7XG5pbXBvcnQgeyBTcGVlY2hSZWNvZ25pemVyIH0gZnJvbSBcIi4vc3BlZWNoLXJlY29nbml0aW9uXCI7XG5pbXBvcnQgeyBTbmFja2JhciB9IGZyb20gXCJAcmVhY3QtbmF0aXZlLW1hdGVyaWFsL2NvcmVcIjtcblxuaW1wb3J0IHtcbiAgTmxJbnRlcnByZXRlcixcbiAgQ2xhc3NEZXNjcmlwdG9yLFxuICBFeGFtcGxlUGFyc2UsXG4gIEdlbmllT2JqZWN0LFxuICB0eXBlIE5sSW50ZXJwcmV0ZXJQYXJzZXJDb25maWcsXG4gIHNoYXJlZFN0YXRlLFxufSBmcm9tIFwiQGdhcnJpeDgyL3JlYWN0Z2VuaWUtZHNsXCI7XG5pbXBvcnQge1xuICBBbGxHZW5pZU9iamVjdEludGVyZmFjZXMsXG4gIEFsbEdlbmllT2JqZWN0cyxcbiAgQ2xpY2tQb2ludHMsXG4gIEdlbmllSW50ZXJmYWNlU3RvcmVFbGVtZW50LFxuICBSZXRyaWV2ZUludGVyZmFjZXMsXG59IGZyb20gXCIuL3JlYWN0LWRlY29yYXRvcnNcIjtcbmltcG9ydCB7XG4gIGRpc3BsYXlSZXN1bHQsXG4gIGV4ZWN1dGVHZW5pZUNvZGUsXG4gIE5hdmlnYXRvclN0YXRlLFxuICB1c2VHZW5pZVNlbGVjdG9yLFxufSBmcm9tIFwiLi9zaGFyZWQtc3RvcmVcIjtcbmltcG9ydCB7IEFjdGl2aXR5SW5kaWNhdG9yLCBJbWFnZSwgVG91Y2hhYmxlT3BhY2l0eSwgVmlldywgVGV4dCB9IGZyb20gXCJyZWFjdC1uYXRpdmVcIjtcblxuY29uc3QgU3RhY2sgPSBjcmVhdGVTdGFja05hdmlnYXRvcigpO1xuZXhwb3J0IGxldCBHZW5pZUludGVycHJldGVyOiBObEludGVycHJldGVyO1xuXG50eXBlIEludGVycHJldGVyVHVyblJlY29yZCA9IHtcbiAgdXR0ZXJhbmNlOiBzdHJpbmc7XG4gIHBhcnNlZD86IHN0cmluZyB8IG51bGw7XG4gIHN1Y2Nlc3M6IGJvb2xlYW47XG4gIHJlc3VsdFN1bW1hcnk/OiBzdHJpbmc7XG59O1xuXG50eXBlIEludGVycHJldGVyVHVyblJlY29yZGVyID0ge1xuICByZWNvcmRUdXJuPzogKHJlY29yZDogSW50ZXJwcmV0ZXJUdXJuUmVjb3JkKSA9PiB2b2lkO1xuICByZWNvcmRJbnRlcmFjdGlvbj86IChyZWNvcmQ6IEludGVycHJldGVyVHVyblJlY29yZCkgPT4gdm9pZDtcbn07XG5cbmNvbnN0IHJlY29yZEludGVycHJldGVyVHVybiA9IChcbiAgaW50ZXJwcmV0ZXI6IE5sSW50ZXJwcmV0ZXIsXG4gIHJlY29yZDogSW50ZXJwcmV0ZXJUdXJuUmVjb3JkXG4pID0+IHtcbiAgY29uc3QgbWF5YmVUdXJuUmVjb3JkZXIgPSBpbnRlcnByZXRlciBhcyB1bmtub3duIGFzIEludGVycHJldGVyVHVyblJlY29yZGVyO1xuICBpZiAodHlwZW9mIG1heWJlVHVyblJlY29yZGVyLnJlY29yZFR1cm4gPT09IFwiZnVuY3Rpb25cIikge1xuICAgIG1heWJlVHVyblJlY29yZGVyLnJlY29yZFR1cm4ocmVjb3JkKTtcbiAgICByZXR1cm47XG4gIH1cbiAgbWF5YmVUdXJuUmVjb3JkZXIucmVjb3JkSW50ZXJhY3Rpb24/LihyZWNvcmQpO1xufTtcblxuY29uc3QgRGVmYXVsdFNjcmVlbiA9XG4gIChjaGlsZHJlbjogUmVhY3QuUmVhY3RFbGVtZW50IHwgUmVhY3QuUmVhY3RFbGVtZW50W10pID0+XG4gICh7IG5hdmlnYXRpb24gfTogYW55KSA9PiB7XG4gICAgdXNlRWZmZWN0KCgpID0+IHtcbiAgICAgIG5hdmlnYXRpb24uc2V0T3B0aW9ucyh7IGhlYWRlclNob3duOiBmYWxzZSB9KTtcbiAgICB9LCBbXSk7XG4gICAgcmV0dXJuIGNoaWxkcmVuO1xuICB9O1xuXG5jb25zdCBPYmplY3RJbnRlcmZhY2VTY3JlZW4gPVxuICAoZ2VuaWVJbnRlcmZhY2VTdG9yZUVsZW1lbnQ6IEdlbmllSW50ZXJmYWNlU3RvcmVFbGVtZW50KSA9PlxuICAoeyByb3V0ZSwgbmF2aWdhdGlvbiB9OiBhbnkpID0+IHtcbiAgICBjb25zdCB0aXRsZSA9IGdlbmllSW50ZXJmYWNlU3RvcmVFbGVtZW50LnRpdGxlKHJvdXRlLnBhcmFtcyk7XG4gICAgdXNlRWZmZWN0KCgpID0+IHtcbiAgICAgIG5hdmlnYXRpb24uc2V0T3B0aW9ucyh7IGhlYWRlclNob3duOiB0cnVlIH0pO1xuICAgICAgbmF2aWdhdGlvbi5zZXRPcHRpb25zKHsgdGl0bGU6IHRpdGxlIH0pO1xuICAgIH0sIFtdKTtcbiAgICByZXR1cm4gPGdlbmllSW50ZXJmYWNlU3RvcmVFbGVtZW50LmZ1bmN0aW9uIHsuLi5yb3V0ZS5wYXJhbXN9IC8+O1xuICB9O1xuXG5jb25zdCBjYXJkU3R5bGU6IFN0YWNrTmF2aWdhdGlvbk9wdGlvbnMgPSB7XG4gIHByZXNlbnRhdGlvbjogXCJjYXJkXCIsXG4gIGFuaW1hdGlvbjogXCJkZWZhdWx0XCIsIC8vIHY3OiByZXBsYWNlZCBhbmltYXRpb25FbmFibGVkIHdpdGggYW5pbWF0aW9uXG4gIGhlYWRlclN0eWxlSW50ZXJwb2xhdG9yOiBIZWFkZXJTdHlsZUludGVycG9sYXRvcnMuZm9yVUlLaXQsXG4gIGNhcmRTdHlsZUludGVycG9sYXRvcjogQ2FyZFN0eWxlSW50ZXJwb2xhdG9ycy5mb3JIb3Jpem9udGFsSU9TLFxufTtcblxuZXhwb3J0IGNvbnN0IGVudW0gTGlzdGVuZXJTdGF0ZUVudW0ge1xuICBJZGxlLFxuICBMaXN0ZW5pbmcsXG4gIFByb2Nlc3NpbmcsXG4gIC8vIERvbmUsXG59XG5cbmV4cG9ydCBjb25zdCBNb2RhbGl0eVByb3ZpZGVyID0gKHByb3BzOiB7XG4gIGV4YW1wbGVzPzogRXhhbXBsZVBhcnNlW107XG4gIGNvZGV4QXBpS2V5OiBzdHJpbmc7XG4gIGNvZGV4QXBpQmFzZVVybD86IHN0cmluZztcbiAgcGFyc2VyQ29uZmlnPzogTmxJbnRlcnByZXRlclBhcnNlckNvbmZpZztcbiAgbGFuZ3NtaXRoQ29uZmlnPzoge1xuICAgIGFwaUtleT86IHN0cmluZztcbiAgICBwcm9qZWN0Pzogc3RyaW5nO1xuICAgIGVuZHBvaW50Pzogc3RyaW5nO1xuICB9O1xuICAvLyBhenVyZVNwZWVjaFJlZ2lvbjogc3RyaW5nO1xuICAvLyBhenVyZVNwZWVjaEtleTogc3RyaW5nO1xuICBkaXNwbGF5VHJhbnNjcmlwdDogYm9vbGVhbjtcbiAgZXh0cmFQcm9tcHQ6IHN0cmluZztcbiAgY2hpbGRyZW46IFJlYWN0LlJlYWN0RWxlbWVudFtdIHwgUmVhY3QuUmVhY3RFbGVtZW50O1xufSkgPT4ge1xuICBjb25zdCByZXNvbHZlZFByb3h5QmFzZVVybCA9IHByb3BzLmNvZGV4QXBpQmFzZVVybDtcbiAgY29uc3QgZXhhbXBsZXMgPSB1c2VHZW5pZVNlbGVjdG9yKCgpID0+IHtcbiAgICBpZiAocHJvcHMuZXhhbXBsZXMgPT09IHVuZGVmaW5lZCkge1xuICAgICAgcmV0dXJuIHNoYXJlZFN0YXRlW1wiX19FWEFNUExFU19fXCJdO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gcHJvcHMuZXhhbXBsZXMuY29uY2F0KHNoYXJlZFN0YXRlW1wiX19FWEFNUExFU19fXCJdKTtcbiAgICB9XG4gIH0pO1xuXG4gIGNvbnN0IG5hdlN0YXRlOiBOYXZpZ2F0b3JTdGF0ZSA9IHVzZVNlbGVjdG9yKChzdGF0ZTogYW55KSA9PiB7XG4gICAgcmV0dXJuIHN0YXRlLm5hdlN0YXRlO1xuICB9KTtcblxuICBjb25zdCBuYXZTdGFjayA9IHVzZVNlbGVjdG9yKChzdGF0ZTogYW55KSA9PiB7XG4gICAgcmV0dXJuIHN0YXRlLm5hdlN0YWNrO1xuICB9KTtcblxuICBjb25zdCB2b2ljZU1lc3NhZ2UgPSB1c2VTZWxlY3Rvcigoc3RhdGU6IGFueSkgPT4ge1xuICAgIHJldHVybiBzdGF0ZS5tZXNzYWdlO1xuICB9KTtcblxuICBjb25zdCBbc25hY2tiYXJWaXNpYmxlLCBzZXRTbmFja2JhclZpc2libGVdID0gdXNlU3RhdGUoZmFsc2UpO1xuXG4gIHVzZUVmZmVjdCgoKSA9PiB7XG4gICAgY29uc3QgbWVzc2FnZVRleHQgPVxuICAgICAgdm9pY2VNZXNzYWdlPy5mdWxsVGV4dCB8fCB2b2ljZU1lc3NhZ2U/Lm1lc3NhZ2UgfHwgdm9pY2VNZXNzYWdlPy5taW5pbWFsVGV4dCB8fCBcIlwiO1xuICAgIGlmIChcbiAgICAgIHZvaWNlTWVzc2FnZSAhPT0gbnVsbCAmJlxuICAgICAgdm9pY2VNZXNzYWdlICE9PSB1bmRlZmluZWQgJiZcbiAgICAgIG1lc3NhZ2VUZXh0ICE9IFwiXCJcbiAgICApIHtcbiAgICAgIHNldFNuYWNrYmFyVmlzaWJsZSh0cnVlKTtcbiAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICBzZXRTbmFja2JhclZpc2libGUoZmFsc2UpO1xuICAgICAgfSwgMzAwMCk7XG4gICAgfVxuICB9LCBbdm9pY2VNZXNzYWdlXSk7XG5cbiAgR2VuaWVJbnRlcnByZXRlciA9IHVzZU1lbW8oKCkgPT4ge1xuICAgIGNvbnN0IGRlc2NyaXB0b3JzOiBDbGFzc0Rlc2NyaXB0b3I8R2VuaWVPYmplY3Q+W10gPSBbXTtcbiAgICBmb3IgKGNvbnN0IGtleSBpbiBBbGxHZW5pZU9iamVjdHMpIHtcbiAgICAgIGRlc2NyaXB0b3JzLnB1c2goQWxsR2VuaWVPYmplY3RzW2tleV0uQ2xhc3NEZXNjcmlwdG9yKTtcbiAgICB9XG4gICAgcmV0dXJuIG5ldyBObEludGVycHJldGVyKFxuICAgICAgZGVzY3JpcHRvcnMsXG4gICAgICBwcm9wcy5jb2RleEFwaUtleSxcbiAgICAgIHVuZGVmaW5lZCxcbiAgICAgIGV4YW1wbGVzLFxuICAgICAgcHJvcHMuZXh0cmFQcm9tcHQsXG4gICAgICB7XG4gICAgICAgIHBhcnNlcjoge1xuICAgICAgICAgIHByb3ZpZGVyOiBwcm9wcy5wYXJzZXJDb25maWc/LnByb3ZpZGVyLFxuICAgICAgICAgIGdyb3E6IHtcbiAgICAgICAgICAgIC4uLihwcm9wcy5wYXJzZXJDb25maWc/Lmdyb3EgfHwge30pLFxuICAgICAgICAgICAgYmFzZVVybDogcHJvcHMucGFyc2VyQ29uZmlnPy5ncm9xPy5iYXNlVXJsIHx8IHJlc29sdmVkUHJveHlCYXNlVXJsLFxuICAgICAgICAgIH0sXG4gICAgICAgICAgb3BlbmFpOiB7XG4gICAgICAgICAgICAuLi4ocHJvcHMucGFyc2VyQ29uZmlnPy5vcGVuYWkgfHwge30pLFxuICAgICAgICAgICAgYmFzZVVybDpcbiAgICAgICAgICAgICAgcHJvcHMucGFyc2VyQ29uZmlnPy5vcGVuYWk/LmJhc2VVcmwgfHwgcmVzb2x2ZWRQcm94eUJhc2VVcmwsXG4gICAgICAgICAgfSxcbiAgICAgICAgfSxcbiAgICAgICAgbW9uaXRvcmluZzoge1xuICAgICAgICAgIGxhbmdzbWl0aEFwaUtleTogcHJvcHMubGFuZ3NtaXRoQ29uZmlnPy5hcGlLZXksXG4gICAgICAgICAgbGFuZ3NtaXRoUHJvamVjdDogcHJvcHMubGFuZ3NtaXRoQ29uZmlnPy5wcm9qZWN0LFxuICAgICAgICAgIGxhbmdzbWl0aEVuZHBvaW50OiBwcm9wcy5sYW5nc21pdGhDb25maWc/LmVuZHBvaW50LFxuICAgICAgICB9IGFzIGFueSxcbiAgICAgIH1cbiAgICApO1xuICB9LCBbXG4gICAgcHJvcHMuY29kZXhBcGlLZXksXG4gICAgcHJvcHMuZXh0cmFQcm9tcHQsXG4gICAgcHJvcHMucGFyc2VyQ29uZmlnLFxuICAgIHByb3BzLmxhbmdzbWl0aENvbmZpZz8uYXBpS2V5LFxuICAgIHByb3BzLmxhbmdzbWl0aENvbmZpZz8ucHJvamVjdCxcbiAgICBwcm9wcy5sYW5nc21pdGhDb25maWc/LmVuZHBvaW50LFxuICAgIHJlc29sdmVkUHJveHlCYXNlVXJsLFxuICAgIGV4YW1wbGVzLFxuICBdKTtcblxuICAvL2NyZWF0ZSByZWYgdG8gTmF2aWdhdGlvbkNvbnRhaW5lciB3aXRoIHR5cGVcbiAgY29uc3QgbmF2aWdhdGlvblJlZiA9IHVzZU5hdmlnYXRpb25Db250YWluZXJSZWYoKTtcblxuICB1c2VFZmZlY3QoKCkgPT4ge1xuICAgIGNvbnNvbGUubG9nKFwibmF2IHN0YXRlIGNoYW5nZWRcIiwgbmF2U3RhdGUpO1xuICAgIGlmIChuYXZTdGF0ZS5vYmplY3RWaWV3Q2xhc3NOYW1lICE9PSBudWxsKSB7XG4gICAgICBuYXZpZ2F0aW9uUmVmLmRpc3BhdGNoKFxuICAgICAgICBTdGFja0FjdGlvbnMucHVzaChcbiAgICAgICAgICBuYXZTdGF0ZS5vYmplY3RWaWV3Q2xhc3NOYW1lLFxuICAgICAgICAgIG5hdlN0YXRlLm9iamVjdENvbnN0cnVjdG9yUGFyYW1zXG4gICAgICAgIClcbiAgICAgICk7XG4gICAgfVxuICB9LCBbbmF2U3RhY2tdKTtcblxuICBjb25zdCB1aUxpc3QgPSB1c2VNZW1vKCgpID0+IHtcbiAgICBjb25zdCB1aUxpc3QgPSBbXTtcbiAgICBjb25zdCBhbGxJbnRlcmZhY2VzID0gQWxsR2VuaWVPYmplY3RJbnRlcmZhY2VzLmFsbEludGVyZmFjZXMoKTtcbiAgICBmb3IgKGNvbnN0IGtleSBpbiBhbGxJbnRlcmZhY2VzKSB7XG4gICAgICBjb25zdCBpbnRlcmZhY2VzU3RvcmVFbGVtZW50ID0gYWxsSW50ZXJmYWNlc1trZXldO1xuICAgICAgdWlMaXN0LnB1c2goXG4gICAgICAgIDxTdGFjay5TY3JlZW5cbiAgICAgICAgICAvLyBrZXk9e2tleX1cbiAgICAgICAgICBuYW1lPXtrZXl9XG4gICAgICAgICAgY29tcG9uZW50PXtPYmplY3RJbnRlcmZhY2VTY3JlZW4oaW50ZXJmYWNlc1N0b3JlRWxlbWVudCl9XG4gICAgICAgICAgb3B0aW9ucz17Y2FyZFN0eWxlfVxuICAgICAgICAvPlxuICAgICAgKTtcbiAgICB9XG4gICAgcmV0dXJuIHVpTGlzdDtcbiAgfSwgW10pO1xuXG4gIGNvbnN0IGd1aSA9IHVzZU1lbW8oXG4gICAgKCkgPT4gKFxuICAgICAgLy8gQHRzLWV4cGVjdC1lcnJvciAtIFJlYWN0IE5hdmlnYXRpb24gdjcgdHlwZXMgYXJlIG92ZXJseSBzdHJpY3Qgd2l0aCBSZWFjdCAxOTsgY2hpbGRyZW4gYXJlIHByb3Blcmx5IHByb3ZpZGVkIGJlbG93XG4gICAgICA8TmF2aWdhdGlvbkNvbnRhaW5lciByZWY9e25hdmlnYXRpb25SZWZ9PlxuICAgICAgICB7LyogQHRzLWV4cGVjdC1lcnJvciAtIFR5cGVTY3JpcHQgY2FuJ3QgaW5mZXIgY2hpbGRyZW4gZnJvbSBKU1gsIGJ1dCB0aGV5J3JlIHByb3ZpZGVkIGNvcnJlY3RseSAqL31cbiAgICAgICAgPFN0YWNrLk5hdmlnYXRvciBpbml0aWFsUm91dGVOYW1lPVwiRGVmYXVsdCBHVUlcIj5cbiAgICAgICAgICA8U3RhY2suU2NyZWVuXG4gICAgICAgICAgICBuYW1lPVwiRGVmYXVsdCBHVUlcIlxuICAgICAgICAgICAgY29tcG9uZW50PXtEZWZhdWx0U2NyZWVuKHByb3BzLmNoaWxkcmVuKX1cbiAgICAgICAgICAgIG9wdGlvbnM9e2NhcmRTdHlsZX1cbiAgICAgICAgICAvPlxuICAgICAgICAgIHt1aUxpc3R9XG4gICAgICAgIDwvU3RhY2suTmF2aWdhdG9yPlxuICAgICAgPC9OYXZpZ2F0aW9uQ29udGFpbmVyPlxuICAgICksXG4gICAgW3VpTGlzdCwgcHJvcHMuY2hpbGRyZW5dXG4gICk7XG5cbiAgY29uc3QgW2xpc3RlbmVyU3RhdGUsIHNldExpc3RlbmVyU3RhdGVdID0gdXNlU3RhdGUoTGlzdGVuZXJTdGF0ZUVudW0uSWRsZSk7XG4gIGNvbnN0IFtzaG91bGRMaXN0ZW4sIHNldFNob3VsZExpc3Rlbl0gPSB1c2VTdGF0ZShmYWxzZSk7XG4gIGNvbnN0IFt0cmFuc2NyaXB0LCBzZXRUcmFuc2NyaXB0XSA9IHVzZVN0YXRlKFwiXCIpO1xuICBjb25zdCBbaW50ZXJpbVRyYW5zY3JpcHQsIHNldEludGVyaW1UcmFuc2NyaXB0XSA9IHVzZVN0YXRlKFwiXCIpO1xuICBjb25zdCBbbW91c2VEb3duLCBzZXRNb3VzZURvd25dID0gdXNlU3RhdGUoZmFsc2UpO1xuXG4gIHVzZUVmZmVjdCgoKSA9PiB7XG4gICAgY29uc29sZS5sb2coXCJsaXN0ZW5lciBzdGF0ZSBjaGFuZ2VkXCIsIGxpc3RlbmVyU3RhdGUpO1xuICAgIHNldFNob3VsZExpc3RlbihsaXN0ZW5lclN0YXRlID09PSBMaXN0ZW5lclN0YXRlRW51bS5MaXN0ZW5pbmcpO1xuICB9LCBbbGlzdGVuZXJTdGF0ZV0pO1xuXG4gIGNvbnN0IGhhbmRsZUNsaWNrID0gKGV2ZW50KSA9PiB7XG4gICAgaWYgKGxpc3RlbmVyU3RhdGUgPT09IExpc3RlbmVyU3RhdGVFbnVtLkxpc3RlbmluZykge1xuICAgICAgY29uc3QgeCA9IGV2ZW50LmNsaWVudFg7XG4gICAgICBjb25zdCB5ID0gZXZlbnQuY2xpZW50WTtcbiAgICAgIGNvbnNvbGUubG9nKGBDbGljayBwb3NpdGlvbjogKCR7eH0sICR7eX0pYCk7XG4gICAgICBDbGlja1BvaW50cy5wdXNoKHsgeDogeCwgeTogeSB9KTtcbiAgICB9XG4gICAgc2V0TW91c2VEb3duKGZhbHNlKTtcbiAgfTtcbiAgY29uc3QgaGFuZGxlRG93biA9ICgpID0+IHtcbiAgICBzZXRNb3VzZURvd24odHJ1ZSk7XG4gIH07XG5cbiAgY29uc3Qgc3BlZWNoU3RhdHVzQ2FsbGJhY2sgPSAoc3RhdHVzLCBpbnRlcmltVHJhbnNjcmlwdCkgPT4ge1xuICAgIGlmIChsaXN0ZW5lclN0YXRlID09PSBMaXN0ZW5lclN0YXRlRW51bS5MaXN0ZW5pbmcpIHtcbiAgICAgIGNvbnNvbGUubG9nKGBTcGVlY2ggc3RhdHVzOiAke3N0YXR1c31gKTtcbiAgICAgIGlmIChzdGF0dXMgPT0gdHJ1ZSkge1xuICAgICAgICBjb25zb2xlLmxvZyhgSW50ZXJpbSB0cmFuc2NyaXB0OiAke2ludGVyaW1UcmFuc2NyaXB0fWApO1xuICAgICAgICBzZXRJbnRlcmltVHJhbnNjcmlwdChpbnRlcmltVHJhbnNjcmlwdCk7XG4gICAgICB9XG4gICAgfVxuICB9O1xuICBjb25zdCBzcGVlY2hSZXN1bHRDYWxsYmFjayA9IChmaW5hbFRyYW5zY3JpcHQpID0+IHtcbiAgICBpZiAobGlzdGVuZXJTdGF0ZSA9PT0gTGlzdGVuZXJTdGF0ZUVudW0uTGlzdGVuaW5nKSB7XG4gICAgICBjb25zb2xlLmxvZyhgRmluYWwgdHJhbnNjcmlwdDogJHtmaW5hbFRyYW5zY3JpcHR9YCk7XG4gICAgICBzZXRJbnRlcmltVHJhbnNjcmlwdChmaW5hbFRyYW5zY3JpcHQpO1xuICAgICAgc2V0VHJhbnNjcmlwdChmaW5hbFRyYW5zY3JpcHQpO1xuICAgIH1cbiAgfTtcblxuICBsZXQgbGFzdFRyYW5zY3JpcHQgPSBcIlwiO1xuXG4gIHVzZUVmZmVjdCgoKSA9PiB7XG4gICAgaWYgKHRyYW5zY3JpcHQgIT09IFwiXCIgJiYgbGlzdGVuZXJTdGF0ZSA9PT0gTGlzdGVuZXJTdGF0ZUVudW0uTGlzdGVuaW5nKSB7XG4gICAgICBsYXN0VHJhbnNjcmlwdCA9IHRyYW5zY3JpcHQ7XG4gICAgICBSZXRyaWV2ZUludGVyZmFjZXMoKTtcbiAgICAgIHNldExpc3RlbmVyU3RhdGUoTGlzdGVuZXJTdGF0ZUVudW0uUHJvY2Vzc2luZyk7XG4gICAgICBzZXRUcmFuc2NyaXB0KFwiXCIpO1xuICAgICAgY29uc3QgcHJvY2Vzc1RyYW5zY3JpcHQgPSBhc3luYyAoKSA9PiB7XG4gICAgICAgIGxldCBwYXJzZWRDb21tYW5kOiBzdHJpbmcgfCBudWxsID0gbnVsbDtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBHZW5pZUludGVycHJldGVyLm5sUGFyc2VyLnBhcnNlKGxhc3RUcmFuc2NyaXB0KTtcbiAgICAgICAgICBjb25zb2xlLmxvZyhgcGFyc2VkIHJlc3VsdDogJHtyZXN1bHR9YCk7XG4gICAgICAgICAgc2V0SW50ZXJpbVRyYW5zY3JpcHQoXCJcIik7XG4gICAgICAgICAgc2V0TGlzdGVuZXJTdGF0ZShMaXN0ZW5lclN0YXRlRW51bS5JZGxlKTtcbiAgICAgICAgICBpZiAodHlwZW9mIHJlc3VsdCA9PT0gXCJzdHJpbmdcIiAmJiByZXN1bHQudHJpbSgpICE9PSBcIlwiKSB7XG4gICAgICAgICAgICBwYXJzZWRDb21tYW5kID0gcmVzdWx0LnRyaW0oKTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmVjb3JkSW50ZXJwcmV0ZXJUdXJuKEdlbmllSW50ZXJwcmV0ZXIsIHtcbiAgICAgICAgICAgICAgdXR0ZXJhbmNlOiBsYXN0VHJhbnNjcmlwdCxcbiAgICAgICAgICAgICAgc3VjY2VzczogZmFsc2UsXG4gICAgICAgICAgICAgIHJlc3VsdFN1bW1hcnk6IFwicGFyc2VfZW1wdHlcIixcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgIH1cbiAgICAgICAgICBjb25zdCBnZW5pZUludGVyZmFjZXMgPSBSZXRyaWV2ZUludGVyZmFjZXMoKTtcbiAgICAgICAgICBjb25zdCBleGVjdXRpb25SZXN1bHQgPSBhd2FpdCBleGVjdXRlR2VuaWVDb2RlKHJlc3VsdCwge1xuICAgICAgICAgICAgb3JpZ2luOiBcInZvaWNlXCIsXG4gICAgICAgICAgICBzaG91bGRTcGVha0Vycm9yczogdHJ1ZSxcbiAgICAgICAgICB9KTtcblxuICAgICAgICAgIGlmIChleGVjdXRpb25SZXN1bHQuc3VjY2VzcyAmJiBwYXJzZWRDb21tYW5kKSB7XG4gICAgICAgICAgICByZWNvcmRJbnRlcnByZXRlclR1cm4oR2VuaWVJbnRlcnByZXRlciwge1xuICAgICAgICAgICAgICB1dHRlcmFuY2U6IGxhc3RUcmFuc2NyaXB0LFxuICAgICAgICAgICAgICBwYXJzZWQ6IHBhcnNlZENvbW1hbmQsXG4gICAgICAgICAgICAgIHN1Y2Nlc3M6IHRydWUsXG4gICAgICAgICAgICAgIHJlc3VsdFN1bW1hcnk6IFwiZXhlY3V0ZV9va1wiLFxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICBjb25zb2xlLmxvZyhcImV4ZWN1dGlvbiByZXN1bHQ6IFwiLCBleGVjdXRpb25SZXN1bHQpO1xuICAgICAgICAgICAgZGlzcGxheVJlc3VsdChcbiAgICAgICAgICAgICAgZXhlY3V0aW9uUmVzdWx0LFxuICAgICAgICAgICAgICBsYXN0VHJhbnNjcmlwdCxcbiAgICAgICAgICAgICAgcGFyc2VkQ29tbWFuZCxcbiAgICAgICAgICAgICAgZ2VuaWVJbnRlcmZhY2VzXG4gICAgICAgICAgICApO1xuICAgICAgICAgIH0gZWxzZSBpZiAocGFyc2VkQ29tbWFuZCkge1xuICAgICAgICAgICAgcmVjb3JkSW50ZXJwcmV0ZXJUdXJuKEdlbmllSW50ZXJwcmV0ZXIsIHtcbiAgICAgICAgICAgICAgdXR0ZXJhbmNlOiBsYXN0VHJhbnNjcmlwdCxcbiAgICAgICAgICAgICAgcGFyc2VkOiBwYXJzZWRDb21tYW5kLFxuICAgICAgICAgICAgICBzdWNjZXNzOiBmYWxzZSxcbiAgICAgICAgICAgICAgcmVzdWx0U3VtbWFyeTogXCJleGVjdXRlX2Vycm9yOmV4ZWN1dGlvbl9mYWlsZWRcIixcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgIH1cbiAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICBjb25zdCBlcnJvck1lc3NhZ2UgPVxuICAgICAgICAgICAgZXJyb3IgaW5zdGFuY2VvZiBFcnJvciA/IGVycm9yLm1lc3NhZ2UgOiBTdHJpbmcoZXJyb3IpO1xuICAgICAgICAgIHJlY29yZEludGVycHJldGVyVHVybihHZW5pZUludGVycHJldGVyLCB7XG4gICAgICAgICAgICB1dHRlcmFuY2U6IGxhc3RUcmFuc2NyaXB0LFxuICAgICAgICAgICAgcGFyc2VkOiBwYXJzZWRDb21tYW5kLFxuICAgICAgICAgICAgc3VjY2VzczogZmFsc2UsXG4gICAgICAgICAgICByZXN1bHRTdW1tYXJ5OiBwYXJzZWRDb21tYW5kXG4gICAgICAgICAgICAgID8gYGV4ZWN1dGVfZXJyb3I6JHtlcnJvck1lc3NhZ2V9YFxuICAgICAgICAgICAgICA6IGBwYXJzZV9lcnJvcjoke2Vycm9yTWVzc2FnZX1gLFxuICAgICAgICAgIH0pO1xuICAgICAgICAgIHNldEludGVyaW1UcmFuc2NyaXB0KFwiXCIpO1xuICAgICAgICAgIHNldExpc3RlbmVyU3RhdGUoTGlzdGVuZXJTdGF0ZUVudW0uSWRsZSk7XG4gICAgICAgIH0gZmluYWxseSB7XG4gICAgICAgICAgQ2xpY2tQb2ludHMuc3BsaWNlKDAsIENsaWNrUG9pbnRzLmxlbmd0aCk7XG4gICAgICAgIH1cbiAgICAgIH07XG5cbiAgICAgIHZvaWQgcHJvY2Vzc1RyYW5zY3JpcHQoKTtcbiAgICB9XG4gIH0sIFt0cmFuc2NyaXB0XSk7XG5cbiAgcmV0dXJuIChcbiAgICA8VmlldyBzdHlsZT17eyBmbGV4OiAxIH19PlxuICAgICAgeyhsaXN0ZW5lclN0YXRlID09PSBMaXN0ZW5lclN0YXRlRW51bS5MaXN0ZW5pbmcgfHxcbiAgICAgICAgbGlzdGVuZXJTdGF0ZSA9PT0gTGlzdGVuZXJTdGF0ZUVudW0uUHJvY2Vzc2luZykgJiYgKFxuICAgICAgICA8Vmlld1xuICAgICAgICAgIG9uU3RhcnRTaG91bGRTZXRSZXNwb25kZXI9eygpID0+IHRydWV9XG4gICAgICAgICAgb25SZXNwb25kZXJHcmFudD17aGFuZGxlRG93bn1cbiAgICAgICAgICBvblJlc3BvbmRlclJlbGVhc2U9e2hhbmRsZUNsaWNrfVxuICAgICAgICAgIHN0eWxlPXt7XG4gICAgICAgICAgICBwb3NpdGlvbjogXCJhYnNvbHV0ZVwiLFxuICAgICAgICAgICAgdG9wOiAwLFxuICAgICAgICAgICAgbGVmdDogMCxcbiAgICAgICAgICAgIGJhY2tncm91bmRDb2xvcjogbW91c2VEb3duID8gXCIjN2Y3ZjdmXCIgOiBcIiNjY2NjY2NcIixcbiAgICAgICAgICAgIHdpZHRoOiBcIjEwMCVcIixcbiAgICAgICAgICAgIGhlaWdodDogXCIxMDAlXCIsXG4gICAgICAgICAgICB6SW5kZXg6IDMsXG4gICAgICAgICAgICBvcGFjaXR5OiAwLjUsXG4gICAgICAgICAgfX1cbiAgICAgICAgPlxuICAgICAgICAgIHtsaXN0ZW5lclN0YXRlID09PSBMaXN0ZW5lclN0YXRlRW51bS5Qcm9jZXNzaW5nICYmIChcbiAgICAgICAgICAgIDxWaWV3XG4gICAgICAgICAgICAgIHN0eWxlPXt7XG4gICAgICAgICAgICAgICAgcG9zaXRpb246IFwiYWJzb2x1dGVcIixcbiAgICAgICAgICAgICAgICB0b3A6IFwiNTAlXCIsXG4gICAgICAgICAgICAgICAgbGVmdDogXCI1MCVcIixcbiAgICAgICAgICAgICAgICB0cmFuc2Zvcm06IFt7IHRyYW5zbGF0ZVg6IC0yNSB9LCB7IHRyYW5zbGF0ZVk6IC0yNSB9XSxcbiAgICAgICAgICAgICAgICBiYWNrZ3JvdW5kQ29sb3I6IFwiI2ZmZmZmZlwiLFxuICAgICAgICAgICAgICAgIHBhZGRpbmc6IDEwLFxuICAgICAgICAgICAgICAgIGJvcmRlclJhZGl1czogMTAsXG4gICAgICAgICAgICAgICAgc2hhZG93Q29sb3I6IFwiIzAwMDAwMFwiLFxuICAgICAgICAgICAgICAgIHNoYWRvd09mZnNldDogeyB3aWR0aDogMCwgaGVpZ2h0OiAwIH0sXG4gICAgICAgICAgICAgICAgc2hhZG93T3BhY2l0eTogMC41LFxuICAgICAgICAgICAgICAgIHNoYWRvd1JhZGl1czogMTAsXG4gICAgICAgICAgICAgICAgZWxldmF0aW9uOiAxMCxcbiAgICAgICAgICAgICAgfX1cbiAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgPEFjdGl2aXR5SW5kaWNhdG9yIHNpemU9XCJsYXJnZVwiIGNvbG9yPVwiIzg4ODg4OFwiIC8+XG4gICAgICAgICAgICA8L1ZpZXc+XG4gICAgICAgICAgKX1cbiAgICAgICAgICB7LypkcmF3IHRyYW5zY3JpcHQgYXQgdGhlIGJvdHRvbSBjZW50ZXIgb2YgdGhlIHBhZ2UsIGxpa2UgYSBzdWJ0aXRsZSovfVxuICAgICAgICAgIHtwcm9wcy5kaXNwbGF5VHJhbnNjcmlwdCAmJiAoXG4gICAgICAgICAgICA8Vmlld1xuICAgICAgICAgICAgICBzdHlsZT17e1xuICAgICAgICAgICAgICAgIHBvc2l0aW9uOiBcImFic29sdXRlXCIsXG4gICAgICAgICAgICAgICAgYm90dG9tOiBcIjEwJVwiLFxuICAgICAgICAgICAgICAgIGxlZnQ6IFwiNTAlXCIsXG4gICAgICAgICAgICAgICAgdHJhbnNmb3JtOiBbeyB0cmFuc2xhdGVYOiBcIi01MCVcIiB9LCB7IHRyYW5zbGF0ZVk6IFwiLTUwJVwiIH1dLFxuICAgICAgICAgICAgICAgIGJhY2tncm91bmRDb2xvcjogXCIjZmZmZmZmXCIsXG4gICAgICAgICAgICAgICAgcGFkZGluZzogMTAsXG4gICAgICAgICAgICAgICAgYm9yZGVyUmFkaXVzOiAxMCxcbiAgICAgICAgICAgICAgICBzaGFkb3dDb2xvcjogXCIjMDAwMDAwXCIsXG4gICAgICAgICAgICAgICAgc2hhZG93T2Zmc2V0OiB7IHdpZHRoOiAwLCBoZWlnaHQ6IDAgfSxcbiAgICAgICAgICAgICAgICBzaGFkb3dPcGFjaXR5OiAwLjUsXG4gICAgICAgICAgICAgICAgc2hhZG93UmFkaXVzOiAxMCxcbiAgICAgICAgICAgICAgICBlbGV2YXRpb246IDEwLFxuICAgICAgICAgICAgICB9fVxuICAgICAgICAgICAgPlxuICAgICAgICAgICAgICA8VGV4dCBzdHlsZT17eyBmb250U2l6ZTogMjAgfX0+e2ludGVyaW1UcmFuc2NyaXB0fTwvVGV4dD5cbiAgICAgICAgICAgIDwvVmlldz5cbiAgICAgICAgICApfVxuICAgICAgICA8L1ZpZXc+XG4gICAgICApfVxuICAgICAgPFZpZXdcbiAgICAgICAgc3R5bGU9e3tcbiAgICAgICAgICBwb3NpdGlvbjogXCJhYnNvbHV0ZVwiLFxuICAgICAgICAgIGJvdHRvbTogNTAsXG4gICAgICAgICAgcmlnaHQ6IDEwLFxuICAgICAgICAgIHpJbmRleDogNCxcbiAgICAgICAgfX1cbiAgICAgID5cbiAgICAgICAgPFRvdWNoYWJsZU9wYWNpdHlcbiAgICAgICAgICBvblByZXNzPXsoKSA9PiB7XG4gICAgICAgICAgICBpZiAobGlzdGVuZXJTdGF0ZSA9PT0gTGlzdGVuZXJTdGF0ZUVudW0uSWRsZSkge1xuICAgICAgICAgICAgICBzZXRMaXN0ZW5lclN0YXRlKExpc3RlbmVyU3RhdGVFbnVtLkxpc3RlbmluZyk7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKGxpc3RlbmVyU3RhdGUgPT09IExpc3RlbmVyU3RhdGVFbnVtLkxpc3RlbmluZykge1xuICAgICAgICAgICAgICBzZXRTaG91bGRMaXN0ZW4oZmFsc2UpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH19XG4gICAgICAgID5cbiAgICAgICAgICA8Vmlld1xuICAgICAgICAgICAgc3R5bGU9e3tcbiAgICAgICAgICAgICAgd2lkdGg6IDUwLFxuICAgICAgICAgICAgICBoZWlnaHQ6IDUwLFxuICAgICAgICAgICAgICBib3JkZXJSYWRpdXM6IDI1LFxuICAgICAgICAgICAgICBiYWNrZ3JvdW5kQ29sb3I6XG4gICAgICAgICAgICAgICAgbGlzdGVuZXJTdGF0ZSA9PT0gTGlzdGVuZXJTdGF0ZUVudW0uTGlzdGVuaW5nXG4gICAgICAgICAgICAgICAgICA/IFwiIzAwMDBmZlwiXG4gICAgICAgICAgICAgICAgICA6IFwiI2NjY2NjY1wiLFxuICAgICAgICAgICAgICBqdXN0aWZ5Q29udGVudDogXCJjZW50ZXJcIixcbiAgICAgICAgICAgICAgYWxpZ25JdGVtczogXCJjZW50ZXJcIixcbiAgICAgICAgICAgIH19XG4gICAgICAgICAgPlxuICAgICAgICAgICAgPElvbmljb25zIFxuICAgICAgICAgICAgICBuYW1lPXtsaXN0ZW5lclN0YXRlID09PSBMaXN0ZW5lclN0YXRlRW51bS5MaXN0ZW5pbmcgPyBcIm1pY1wiIDogXCJtaWMtb3V0bGluZVwifSBcbiAgICAgICAgICAgICAgc2l6ZT17Mjh9IFxuICAgICAgICAgICAgICBjb2xvcj1cIiNmZmZmZmZcIiBcbiAgICAgICAgICAgIC8+XG4gICAgICAgICAgPC9WaWV3PlxuICAgICAgICA8L1RvdWNoYWJsZU9wYWNpdHk+XG4gICAgICA8L1ZpZXc+XG4gICAgICA8U3BlZWNoUmVjb2duaXplclxuICAgICAgICBzcGVlY2hTdGF0dXNDYWxsYmFjaz17c3BlZWNoU3RhdHVzQ2FsbGJhY2t9XG4gICAgICAgIHNwZWVjaFJlc3VsdENhbGxiYWNrPXtzcGVlY2hSZXN1bHRDYWxsYmFja31cbiAgICAgICAgc2hvdWxkTGlzdGVuPXtzaG91bGRMaXN0ZW59XG4gICAgICAgIC8vIGdyb3FBcGlLZXk9e3Byb3BzLmNvZGV4QXBpS2V5fVxuXG4gICAgICAvPlxuICAgICAge2d1aX1cbiAgICAgIHtzbmFja2JhclZpc2libGUgJiYgKFxuICAgICAgICA8U25hY2tiYXJcbiAgICAgICAgICBtZXNzYWdlPXt2b2ljZU1lc3NhZ2U/LmZ1bGxUZXh0IHx8IHZvaWNlTWVzc2FnZT8ubWVzc2FnZSB8fCB2b2ljZU1lc3NhZ2U/Lm1pbmltYWxUZXh0IHx8IFwiXCJ9XG4gICAgICAgICAgc3R5bGU9e3tcbiAgICAgICAgICAgIHBvc2l0aW9uOiBcImFic29sdXRlXCIsXG4gICAgICAgICAgICBzdGFydDogMTYsXG4gICAgICAgICAgICBlbmQ6IDE2LFxuICAgICAgICAgICAgYm90dG9tOiAxMDAsXG4gICAgICAgICAgICBiYWNrZ3JvdW5kQ29sb3I6XG4gICAgICAgICAgICAgIHZvaWNlTWVzc2FnZS50eXBlID09PSBcImVycm9yXCIgPyBcIiNmZjAwMDBcIiA6IFwiIzAwMDAwMFwiLFxuICAgICAgICAgIH19XG4gICAgICAgIC8+XG4gICAgICApfVxuICAgIDwvVmlldz5cbiAgKTtcbn07XG4iXSwibWFwcGluZ3MiOiI7Ozs7OztBQUFBLElBQUFBLE1BQUEsR0FBQUMsdUJBQUEsQ0FBQUMsT0FBQTtBQUNBLElBQUFDLFdBQUEsR0FBQUQsT0FBQTtBQUNBLElBQUFFLE9BQUEsR0FBQUYsT0FBQTtBQUtBLElBQUFHLE1BQUEsR0FBQUgsT0FBQTtBQU1BLElBQUFJLFlBQUEsR0FBQUosT0FBQTtBQUNBLElBQUFLLGtCQUFBLEdBQUFMLE9BQUE7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LENBQUMsTUFBTSxJQUFJWCxhQUFhLEtBQUtsRSxpQkFBaUIsQ0FBQzZFLFNBQVMsRUFBRTtRQUN4RFAsZUFBZSxDQUFDLEtBQUssQ0FBQztNQUN4QjtJQUNGO0VBQUUsZ0JBRUY5SixNQUFBLENBQUF1QixPQUFBLENBQUFzRCxhQUFBLENBQUNqRSxZQUFBLENBQUE2TCxJQUFJO0lBQ0hDLEtBQUssRUFBRTtNQUNMUyxLQUFLLEVBQUUsRUFBRTtNQUNUQyxNQUFNLEVBQUUsRUFBRTtNQUNWTyxZQUFZLEVBQUUsRUFBRTtNQUNoQlQsZUFBZSxFQUNieEQsYUFBYSxLQUFLbEUsaUJBQWlCLENBQUM2RSxTQUFTLEdBQ3pDLFNBQVMsR0FDVCxTQUFTO01BQ2ZzRSxjQUFjLEVBQUUsUUFBUTtNQUN4QkMsVUFBVSxFQUFFO0lBQ2Q7RUFBRSxnQkFFRjVPLE1BQUEsQ0FBQXVCLE9BQUEsQ0FBQXNELGFBQUEsQ0FBQ3ZFLFlBQUEsQ0FBQXVPLFFBQVE7SUFDUDNGLElBQUksRUFBRVEsYUFBYSxLQUFLbEUsaUJBQWlCLENBQUM2RSxTQUFTLEdBQUcsS0FBSyxHQUFHLGFBQWM7SUFDNUU2RCxJQUFJLEVBQUUsRUFBRztJQUNUQyxLQUFLLEVBQUM7RUFBUyxDQUNoQixDQUNHLENBQ1UsQ0FDZCxDQUFDLGVBQ1BuTyxNQUFBLENBQUF1QixPQUFBLENBQUFzRCxhQUFBLENBQUN0RSxrQkFBQSxDQUFBdU8sZ0JBQWdCO0lBQ2ZoRSxvQkFBb0IsRUFBRUEsb0JBQXFCO0lBQzNDRSxvQkFBb0IsRUFBRUEsb0JBQXFCO0lBQzNDbkIsWUFBWSxFQUFFQTtJQUNkO0VBQUEsQ0FFRCxDQUFDLEVBQ0RSLEdBQUcsRUFDSDdDLGVBQWUsaUJBQ2R4RyxNQUFBLENBQUF1QixPQUFBLENBQUFzRCxhQUFBLENBQUNyRSxLQUFBLENBQUF1TyxRQUFRO0lBQ1B4SSxPQUFPLEVBQUVELFlBQVksRUFBRU0sUUFBUSxJQUFJTixZQUFZLEVBQUVDLE9BQU8sSUFBSUQsWUFBWSxFQUFFTyxXQUFXLElBQUksRUFBRztJQUM1RjZGLEtBQUssRUFBRTtNQUNMSyxRQUFRLEVBQUUsVUFBVTtNQUNwQmlDLEtBQUssRUFBRSxFQUFFO01BQ1RDLEdBQUcsRUFBRSxFQUFFO01BQ1BaLE1BQU0sRUFBRSxHQUFHO01BQ1huQixlQUFlLEVBQ2I1RyxZQUFZLENBQUM0SSxJQUFJLEtBQUssT0FBTyxHQUFHLFNBQVMsR0FBRztJQUNoRDtFQUFFLENBQ0gsQ0FFQyxDQUFDO0FBRVgsQ0FBQztBQUFDdkwsT0FBQSxDQUFBOEIsZ0JBQUEsR0FBQUEsZ0JBQUEiLCJpZ25vcmVMaXN0IjpbXX0=
@@ -0,0 +1,28 @@
1
+ export type NativeVisibilityPlatform = "web" | "ios" | "android";
2
+ export type NativeVisibilityState = "stable" | "transition_unstable";
3
+ export type NativeVisibilityResolution = {
4
+ interfaces: FocusAwareGenieInterfaceSpec[];
5
+ state: NativeVisibilityState;
6
+ };
7
+ type NativeVisibilityResolutionOptions = {
8
+ now?: number;
9
+ };
10
+ export type FocusAwareGenieInterfaceSpec = {
11
+ className: string;
12
+ key: any;
13
+ rect: {
14
+ x: number;
15
+ y: number;
16
+ width: number;
17
+ height: number;
18
+ top: number;
19
+ left: number;
20
+ bottom: number;
21
+ right: number;
22
+ };
23
+ isFocusedScreen?: boolean;
24
+ };
25
+ export declare function resetNativeVisibilityStateForTests(): void;
26
+ export declare function resolveVisibleInterfacesForPlatform(platform: NativeVisibilityPlatform | string, interfaces: FocusAwareGenieInterfaceSpec[], options?: NativeVisibilityResolutionOptions): NativeVisibilityResolution;
27
+ export declare function filterVisibleInterfacesForPlatform(platform: NativeVisibilityPlatform | string, interfaces: FocusAwareGenieInterfaceSpec[]): FocusAwareGenieInterfaceSpec[];
28
+ export {};
@@ -0,0 +1,50 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.filterVisibleInterfacesForPlatform = filterVisibleInterfacesForPlatform;
7
+ exports.resetNativeVisibilityStateForTests = resetNativeVisibilityStateForTests;
8
+ exports.resolveVisibleInterfacesForPlatform = resolveVisibleInterfacesForPlatform;
9
+ const NATIVE_VISIBILITY_TRANSITION_GRACE_MS = 400;
10
+ let lastNativeFocusedAtMs = 0;
11
+ function resetNativeVisibilityStateForTests() {
12
+ lastNativeFocusedAtMs = 0;
13
+ }
14
+ function resolveVisibleInterfacesForPlatform(platform, interfaces, options = {}) {
15
+ const now = options.now ?? Date.now();
16
+ if (platform === "web") {
17
+ return {
18
+ interfaces,
19
+ state: "stable"
20
+ };
21
+ }
22
+ const hasFocusMetadata = interfaces.some(genieInterface => typeof genieInterface.isFocusedScreen === "boolean");
23
+ if (!hasFocusMetadata) {
24
+ return {
25
+ interfaces,
26
+ state: "stable"
27
+ };
28
+ }
29
+ const focusedInterfaces = interfaces.filter(genieInterface => genieInterface.isFocusedScreen === true);
30
+ if (focusedInterfaces.length > 0) {
31
+ lastNativeFocusedAtMs = now;
32
+ return {
33
+ interfaces: focusedInterfaces,
34
+ state: "stable"
35
+ };
36
+ }
37
+ const isTransitionUnstable = lastNativeFocusedAtMs > 0 && now - lastNativeFocusedAtMs < NATIVE_VISIBILITY_TRANSITION_GRACE_MS;
38
+ return {
39
+ interfaces: [],
40
+ state: isTransitionUnstable ? "transition_unstable" : "stable"
41
+ };
42
+ }
43
+
44
+ // Native stacks can keep blurred screens mounted, so "mounted" is not the same
45
+ // as "currently visible for Genie resolution". Web already has a stronger
46
+ // visibility signal from IntersectionObserver and should be left unchanged.
47
+ function filterVisibleInterfacesForPlatform(platform, interfaces) {
48
+ return resolveVisibleInterfacesForPlatform(platform, interfaces).interfaces;
49
+ }
50
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJOQVRJVkVfVklTSUJJTElUWV9UUkFOU0lUSU9OX0dSQUNFX01TIiwibGFzdE5hdGl2ZUZvY3VzZWRBdE1zIiwicmVzZXROYXRpdmVWaXNpYmlsaXR5U3RhdGVGb3JUZXN0cyIsInJlc29sdmVWaXNpYmxlSW50ZXJmYWNlc0ZvclBsYXRmb3JtIiwicGxhdGZvcm0iLCJpbnRlcmZhY2VzIiwib3B0aW9ucyIsIm5vdyIsIkRhdGUiLCJzdGF0ZSIsImhhc0ZvY3VzTWV0YWRhdGEiLCJzb21lIiwiZ2VuaWVJbnRlcmZhY2UiLCJpc0ZvY3VzZWRTY3JlZW4iLCJmb2N1c2VkSW50ZXJmYWNlcyIsImZpbHRlciIsImxlbmd0aCIsImlzVHJhbnNpdGlvblVuc3RhYmxlIiwiZmlsdGVyVmlzaWJsZUludGVyZmFjZXNGb3JQbGF0Zm9ybSJdLCJzb3VyY2VzIjpbIi4uL3NyYy9uYXRpdmUtdmlzaWJpbGl0eS50cyJdLCJzb3VyY2VzQ29udGVudCI6WyJleHBvcnQgdHlwZSBOYXRpdmVWaXNpYmlsaXR5UGxhdGZvcm0gPSBcIndlYlwiIHwgXCJpb3NcIiB8IFwiYW5kcm9pZFwiO1xuZXhwb3J0IHR5cGUgTmF0aXZlVmlzaWJpbGl0eVN0YXRlID0gXCJzdGFibGVcIiB8IFwidHJhbnNpdGlvbl91bnN0YWJsZVwiO1xuXG5leHBvcnQgdHlwZSBOYXRpdmVWaXNpYmlsaXR5UmVzb2x1dGlvbiA9IHtcbiAgaW50ZXJmYWNlczogRm9jdXNBd2FyZUdlbmllSW50ZXJmYWNlU3BlY1tdO1xuICBzdGF0ZTogTmF0aXZlVmlzaWJpbGl0eVN0YXRlO1xufTtcblxudHlwZSBOYXRpdmVWaXNpYmlsaXR5UmVzb2x1dGlvbk9wdGlvbnMgPSB7XG4gIG5vdz86IG51bWJlcjtcbn07XG5cbmNvbnN0IE5BVElWRV9WSVNJQklMSVRZX1RSQU5TSVRJT05fR1JBQ0VfTVMgPSA0MDA7XG5sZXQgbGFzdE5hdGl2ZUZvY3VzZWRBdE1zID0gMDtcblxuZXhwb3J0IHR5cGUgRm9jdXNBd2FyZUdlbmllSW50ZXJmYWNlU3BlYyA9IHtcbiAgY2xhc3NOYW1lOiBzdHJpbmc7XG4gIGtleTogYW55O1xuICByZWN0OiB7XG4gICAgeDogbnVtYmVyO1xuICAgIHk6IG51bWJlcjtcbiAgICB3aWR0aDogbnVtYmVyO1xuICAgIGhlaWdodDogbnVtYmVyO1xuICAgIHRvcDogbnVtYmVyO1xuICAgIGxlZnQ6IG51bWJlcjtcbiAgICBib3R0b206IG51bWJlcjtcbiAgICByaWdodDogbnVtYmVyO1xuICB9O1xuICBpc0ZvY3VzZWRTY3JlZW4/OiBib29sZWFuO1xufTtcblxuZXhwb3J0IGZ1bmN0aW9uIHJlc2V0TmF0aXZlVmlzaWJpbGl0eVN0YXRlRm9yVGVzdHMoKTogdm9pZCB7XG4gIGxhc3ROYXRpdmVGb2N1c2VkQXRNcyA9IDA7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiByZXNvbHZlVmlzaWJsZUludGVyZmFjZXNGb3JQbGF0Zm9ybShcbiAgcGxhdGZvcm06IE5hdGl2ZVZpc2liaWxpdHlQbGF0Zm9ybSB8IHN0cmluZyxcbiAgaW50ZXJmYWNlczogRm9jdXNBd2FyZUdlbmllSW50ZXJmYWNlU3BlY1tdLFxuICBvcHRpb25zOiBOYXRpdmVWaXNpYmlsaXR5UmVzb2x1dGlvbk9wdGlvbnMgPSB7fSxcbik6IE5hdGl2ZVZpc2liaWxpdHlSZXNvbHV0aW9uIHtcbiAgY29uc3Qgbm93ID0gb3B0aW9ucy5ub3cgPz8gRGF0ZS5ub3coKTtcblxuICBpZiAocGxhdGZvcm0gPT09IFwid2ViXCIpIHtcbiAgICByZXR1cm4ge1xuICAgICAgaW50ZXJmYWNlcyxcbiAgICAgIHN0YXRlOiBcInN0YWJsZVwiLFxuICAgIH07XG4gIH1cblxuICBjb25zdCBoYXNGb2N1c01ldGFkYXRhID0gaW50ZXJmYWNlcy5zb21lKFxuICAgIChnZW5pZUludGVyZmFjZSkgPT4gdHlwZW9mIGdlbmllSW50ZXJmYWNlLmlzRm9jdXNlZFNjcmVlbiA9PT0gXCJib29sZWFuXCIsXG4gICk7XG4gIGlmICghaGFzRm9jdXNNZXRhZGF0YSkge1xuICAgIHJldHVybiB7XG4gICAgICBpbnRlcmZhY2VzLFxuICAgICAgc3RhdGU6IFwic3RhYmxlXCIsXG4gICAgfTtcbiAgfVxuXG4gIGNvbnN0IGZvY3VzZWRJbnRlcmZhY2VzID0gaW50ZXJmYWNlcy5maWx0ZXIoXG4gICAgKGdlbmllSW50ZXJmYWNlKSA9PiBnZW5pZUludGVyZmFjZS5pc0ZvY3VzZWRTY3JlZW4gPT09IHRydWUsXG4gICk7XG5cbiAgaWYgKGZvY3VzZWRJbnRlcmZhY2VzLmxlbmd0aCA+IDApIHtcbiAgICBsYXN0TmF0aXZlRm9jdXNlZEF0TXMgPSBub3c7XG4gICAgcmV0dXJuIHtcbiAgICAgIGludGVyZmFjZXM6IGZvY3VzZWRJbnRlcmZhY2VzLFxuICAgICAgc3RhdGU6IFwic3RhYmxlXCIsXG4gICAgfTtcbiAgfVxuXG4gIGNvbnN0IGlzVHJhbnNpdGlvblVuc3RhYmxlID1cbiAgICBsYXN0TmF0aXZlRm9jdXNlZEF0TXMgPiAwICYmXG4gICAgbm93IC0gbGFzdE5hdGl2ZUZvY3VzZWRBdE1zIDwgTkFUSVZFX1ZJU0lCSUxJVFlfVFJBTlNJVElPTl9HUkFDRV9NUztcblxuICByZXR1cm4ge1xuICAgIGludGVyZmFjZXM6IFtdLFxuICAgIHN0YXRlOiBpc1RyYW5zaXRpb25VbnN0YWJsZSA/IFwidHJhbnNpdGlvbl91bnN0YWJsZVwiIDogXCJzdGFibGVcIixcbiAgfTtcbn1cblxuLy8gTmF0aXZlIHN0YWNrcyBjYW4ga2VlcCBibHVycmVkIHNjcmVlbnMgbW91bnRlZCwgc28gXCJtb3VudGVkXCIgaXMgbm90IHRoZSBzYW1lXG4vLyBhcyBcImN1cnJlbnRseSB2aXNpYmxlIGZvciBHZW5pZSByZXNvbHV0aW9uXCIuIFdlYiBhbHJlYWR5IGhhcyBhIHN0cm9uZ2VyXG4vLyB2aXNpYmlsaXR5IHNpZ25hbCBmcm9tIEludGVyc2VjdGlvbk9ic2VydmVyIGFuZCBzaG91bGQgYmUgbGVmdCB1bmNoYW5nZWQuXG5leHBvcnQgZnVuY3Rpb24gZmlsdGVyVmlzaWJsZUludGVyZmFjZXNGb3JQbGF0Zm9ybShcbiAgcGxhdGZvcm06IE5hdGl2ZVZpc2liaWxpdHlQbGF0Zm9ybSB8IHN0cmluZyxcbiAgaW50ZXJmYWNlczogRm9jdXNBd2FyZUdlbmllSW50ZXJmYWNlU3BlY1tdLFxuKTogRm9jdXNBd2FyZUdlbmllSW50ZXJmYWNlU3BlY1tdIHtcbiAgcmV0dXJuIHJlc29sdmVWaXNpYmxlSW50ZXJmYWNlc0ZvclBsYXRmb3JtKHBsYXRmb3JtLCBpbnRlcmZhY2VzKS5pbnRlcmZhY2VzO1xufVxuIl0sIm1hcHBpbmdzIjoiOzs7Ozs7OztBQVlBLE1BQU1BLHFDQUFxQyxHQUFHLEdBQUc7QUFDakQsSUFBSUMscUJBQXFCLEdBQUcsQ0FBQztBQWtCdEIsU0FBU0Msa0NBQWtDQSxDQUFBLEVBQVM7RUFDekRELHFCQUFxQixHQUFHLENBQUM7QUFDM0I7QUFFTyxTQUFTRSxtQ0FBbUNBLENBQ2pEQyxRQUEyQyxFQUMzQ0MsVUFBMEMsRUFDMUNDLE9BQTBDLEdBQUcsQ0FBQyxDQUFDLEVBQ25CO0VBQzVCLE1BQU1DLEdBQUcsR0FBR0QsT0FBTyxDQUFDQyxHQUFHLElBQUlDLElBQUksQ0FBQ0QsR0FBRyxDQUFDLENBQUM7RUFFckMsSUFBSUgsUUFBUSxLQUFLLEtBQUssRUFBRTtJQUN0QixPQUFPO01BQ0xDLFVBQVU7TUFDVkksS0FBSyxFQUFFO0lBQ1QsQ0FBQztFQUNIO0VBRUEsTUFBTUMsZ0JBQWdCLEdBQUdMLFVBQVUsQ0FBQ00sSUFBSSxDQUNyQ0MsY0FBYyxJQUFLLE9BQU9BLGNBQWMsQ0FBQ0MsZUFBZSxLQUFLLFNBQ2hFLENBQUM7RUFDRCxJQUFJLENBQUNILGdCQUFnQixFQUFFO0lBQ3JCLE9BQU87TUFDTEwsVUFBVTtNQUNWSSxLQUFLLEVBQUU7SUFDVCxDQUFDO0VBQ0g7RUFFQSxNQUFNSyxpQkFBaUIsR0FBR1QsVUFBVSxDQUFDVSxNQUFNLENBQ3hDSCxjQUFjLElBQUtBLGNBQWMsQ0FBQ0MsZUFBZSxLQUFLLElBQ3pELENBQUM7RUFFRCxJQUFJQyxpQkFBaUIsQ0FBQ0UsTUFBTSxHQUFHLENBQUMsRUFBRTtJQUNoQ2YscUJBQXFCLEdBQUdNLEdBQUc7SUFDM0IsT0FBTztNQUNMRixVQUFVLEVBQUVTLGlCQUFpQjtNQUM3QkwsS0FBSyxFQUFFO0lBQ1QsQ0FBQztFQUNIO0VBRUEsTUFBTVEsb0JBQW9CLEdBQ3hCaEIscUJBQXFCLEdBQUcsQ0FBQyxJQUN6Qk0sR0FBRyxHQUFHTixxQkFBcUIsR0FBR0QscUNBQXFDO0VBRXJFLE9BQU87SUFDTEssVUFBVSxFQUFFLEVBQUU7SUFDZEksS0FBSyxFQUFFUSxvQkFBb0IsR0FBRyxxQkFBcUIsR0FBRztFQUN4RCxDQUFDO0FBQ0g7O0FBRUE7QUFDQTtBQUNBO0FBQ08sU0FBU0Msa0NBQWtDQSxDQUNoRGQsUUFBMkMsRUFDM0NDLFVBQTBDLEVBQ1Y7RUFDaEMsT0FBT0YsbUNBQW1DLENBQUNDLFFBQVEsRUFBRUMsVUFBVSxDQUFDLENBQUNBLFVBQVU7QUFDN0UiLCJpZ25vcmVMaXN0IjpbXX0=
@@ -0,0 +1,17 @@
1
+ import React from 'react';
2
+ import { SpeechState } from '../hooks/useSpeechRecognition';
3
+ export interface VoiceRecognitionBarProps {
4
+ state: SpeechState;
5
+ isListening: boolean;
6
+ isProcessing: boolean;
7
+ isConnecting?: boolean;
8
+ interimTranscript: string;
9
+ transcript: string;
10
+ audioLevel: number;
11
+ waveformPreview?: number[];
12
+ onToggle: () => void;
13
+ style?: any;
14
+ showTranscript?: boolean;
15
+ placeholderText?: string;
16
+ }
17
+ export declare const VoiceRecognitionBar: React.FC<VoiceRecognitionBarProps>;