From a3394df1499ef19ae834bad7ad3ce2aa45b27b7f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Micha=C5=82=20Dydek?= <54865962+mdydek@users.noreply.github.com> Date: Tue, 22 Apr 2025 13:56:17 +0200 Subject: [PATCH 1/3] feat: llama with whisper demo (#179) - [ ] Bug fix (non-breaking change which fixes an issue) - [x] New feature (non-breaking change which adds functionality) - [ ] Breaking change (fix or feature that would cause existing functionality to not work as expected) - [ ] Documentation update (improves or adds clarity to existing documentation) - [x] iOS - [x] Android - [x] I have performed a self-review of my code - [ ] I have commented my code, particularly in hard-to-understand areas - [ ] I have updated the documentation accordingly - [ ] My changes generate no new warnings --- examples/llama/ios/llama/Info.plist | 81 ++ examples/llm/assets/icons/mic_icon.svg | 4 + examples/llm/assets/icons/stop_icon.svg | 4 + examples/llm/ios/Podfile.lock | 144 +-- examples/llm/package.json | 3 +- examples/llm/screens/LLMScreen.tsx | 307 +++-- examples/llm/yarn.lock | 1491 +++-------------------- 7 files changed, 546 insertions(+), 1488 deletions(-) create mode 100644 examples/llama/ios/llama/Info.plist create mode 100644 examples/llm/assets/icons/mic_icon.svg create mode 100644 examples/llm/assets/icons/stop_icon.svg diff --git a/examples/llama/ios/llama/Info.plist b/examples/llama/ios/llama/Info.plist new file mode 100644 index 00000000..1febd3e0 --- /dev/null +++ b/examples/llama/ios/llama/Info.plist @@ -0,0 +1,81 @@ + + + + + CADisableMinimumFrameDurationOnPhone + + CFBundleDevelopmentRegion + $(DEVELOPMENT_LANGUAGE) + CFBundleDisplayName + llama + CFBundleExecutable + $(EXECUTABLE_NAME) + CFBundleIdentifier + $(PRODUCT_BUNDLE_IDENTIFIER) + CFBundleInfoDictionaryVersion + 6.0 + CFBundleName + $(PRODUCT_NAME) + CFBundlePackageType + $(PRODUCT_BUNDLE_PACKAGE_TYPE) + CFBundleShortVersionString + 1.0.0 + CFBundleSignature + ???? + CFBundleURLTypes + + + CFBundleURLSchemes + + com.anonymous.llama + + + + CFBundleVersion + 1 + LSMinimumSystemVersion + 12.0 + LSRequiresIPhoneOS + + NSAppTransportSecurity + + NSAllowsArbitraryLoads + + NSAllowsLocalNetworking + + + NSMicrophoneUsageDescription + We need your permission to use the microphone. + UIAppFonts + + Aeonik-Regular.otf + Aeonik-Medium.otf + + UILaunchStoryboardName + SplashScreen + UIRequiredDeviceCapabilities + + arm64 + + UIRequiresFullScreen + + UIStatusBarStyle + UIStatusBarStyleDefault + UISupportedInterfaceOrientations + + UIInterfaceOrientationPortrait + UIInterfaceOrientationPortraitUpsideDown + + UISupportedInterfaceOrientations~ipad + + UIInterfaceOrientationPortrait + UIInterfaceOrientationPortraitUpsideDown + UIInterfaceOrientationLandscapeLeft + UIInterfaceOrientationLandscapeRight + + UIUserInterfaceStyle + Light + UIViewControllerBasedStatusBarAppearance + + + diff --git a/examples/llm/assets/icons/mic_icon.svg b/examples/llm/assets/icons/mic_icon.svg new file mode 100644 index 00000000..955808bf --- /dev/null +++ b/examples/llm/assets/icons/mic_icon.svg @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/examples/llm/assets/icons/stop_icon.svg b/examples/llm/assets/icons/stop_icon.svg new file mode 100644 index 00000000..cb051899 --- /dev/null +++ b/examples/llm/assets/icons/stop_icon.svg @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/examples/llm/ios/Podfile.lock b/examples/llm/ios/Podfile.lock index 9f1afe5b..b217a449 100644 --- a/examples/llm/ios/Podfile.lock +++ b/examples/llm/ios/Podfile.lock @@ -1,7 +1,7 @@ PODS: - boost (1.84.0) - DoubleConversion (1.1.6) - - EXConstants (17.1.5): + - EXConstants (17.1.6): - ExpoModulesCore - Expo (53.0.8): - DoubleConversion @@ -67,6 +67,8 @@ PODS: - ReactCommon/turbomodule/bridging - ReactCommon/turbomodule/core - Yoga + - ExpoSpeech (13.1.4): + - ExpoModulesCore - fast_float (6.1.4) - FBLazyVector (0.79.2) - fmt (11.0.2) @@ -1399,7 +1401,7 @@ PODS: - React-jsiexecutor - React-RCTFBReactNativeSpec - ReactCommon/turbomodule/core - - react-native-executorch (0.3.2): + - react-native-executorch (0.3.1-stt-7): - DoubleConversion - glog - hermes-engine @@ -2009,6 +2011,7 @@ DEPENDENCIES: - ExpoFont (from `../node_modules/expo-font/ios`) - ExpoKeepAwake (from `../node_modules/expo-keep-awake/ios`) - ExpoModulesCore (from `../node_modules/expo-modules-core`) + - ExpoSpeech (from `../node_modules/expo-speech/ios`) - fast_float (from `../node_modules/react-native/third-party-podspecs/fast_float.podspec`) - FBLazyVector (from `../node_modules/react-native/Libraries/FBLazyVector`) - fmt (from `../node_modules/react-native/third-party-podspecs/fmt.podspec`) @@ -2112,6 +2115,8 @@ EXTERNAL SOURCES: :path: "../node_modules/expo-keep-awake/ios" ExpoModulesCore: :path: "../node_modules/expo-modules-core" + ExpoSpeech: + :path: "../node_modules/expo-speech/ios" fast_float: :podspec: "../node_modules/react-native/third-party-podspecs/fast_float.podspec" FBLazyVector: @@ -2259,91 +2264,92 @@ EXTERNAL SOURCES: :path: "../node_modules/react-native/ReactCommon/yoga" SPEC CHECKSUMS: - boost: 1dca942403ed9342f98334bf4c3621f011aa7946 - DoubleConversion: f16ae600a246532c4020132d54af21d0ddb2a385 - EXConstants: 26f334022fc0b454b7ecdc7c12d36ffa68c7c397 - Expo: 54adb30ffa0a086c1a4bb87364d69b7917caeb49 - ExpoAsset: 3ea3275cca6a7793b3d36fbf1075c590f803fbcb - ExpoBrightness: 05e750736f8886dcf235212b0caf85b0f605fc88 - ExpoCalendar: 660542dc1c5ef98f46bedcc8745aa707df5d501a - ExpoFileSystem: ff47f2208da552fbee872dedc4e74fb7c6ac5907 - ExpoFont: 312c73403bbd4f98e1d6a5330641a56292583cd2 - ExpoKeepAwake: e8dedc115d9f6f24b153ccd2d1d8efcdfd68a527 - ExpoModulesCore: 0bf5158ae9fb71e575582a8a48dbd26ced42f306 + boost: 7e761d76ca2ce687f7cc98e698152abd03a18f90 + DoubleConversion: cb417026b2400c8f53ae97020b2be961b59470cb + EXConstants: 9f310f44bfedba09087042756802040e464323c0 + Expo: 769ab5c190382eedebc733af6708bbc9ca5f643b + ExpoAsset: 3bc9adb7dbbf27ae82c18ca97eb988a3ae7e73b1 + ExpoBrightness: c335c6ccc082d5249a4b38dba5cd9a08aa0bf62b + ExpoCalendar: f5f94ea8dcd957b1434beb4e1c0da1af063322e6 + ExpoFileSystem: 0f3f466ecd3560f55768cd3f94ac3a17f093b8e6 + ExpoFont: abbb91a911eb961652c2b0a22eef801860425ed6 + ExpoKeepAwake: bf0811570c8da182bfb879169437d4de298376e7 + ExpoModulesCore: 3ac17421302df62928fc99c133cf25bdbcf0b004 + ExpoSpeech: 4db7ef7888b9edc39ca9afee54e9c4b3df269ccb fast_float: 06eeec4fe712a76acc9376682e4808b05ce978b6 FBLazyVector: 84b955f7b4da8b895faf5946f73748267347c975 - fmt: 01b82d4ca6470831d1cc0852a1af644be019e8f6 - glog: 08b301085f15bcbb6ff8632a8ebaf239aae04e6a + fmt: a40bb5bd0294ea969aaaba240a927bd33d878cdd + glog: 5683914934d5b6e4240e497e0f4a3b42d1854183 hermes-engine: 314be5250afa5692b57b4dd1705959e1973a8ebe opencv-rne: 63e933ae2373fc91351f9a348dc46c3f523c2d3f - RCT-Folly: 36fe2295e44b10d831836cc0d1daec5f8abcf809 + RCT-Folly: e78785aa9ba2ed998ea4151e314036f6c49e6d82 RCTDeprecation: 83ffb90c23ee5cea353bd32008a7bca100908f8c RCTRequired: eb7c0aba998009f47a540bec9e9d69a54f68136e RCTTypeSafety: 659ae318c09de0477fd27bbc9e140071c7ea5c93 React: c2d3aa44c49bb34e4dfd49d3ee92da5ebacc1c1c React-callinvoker: 1bdfb7549b5af266d85757193b5069f60659ef9d - React-Core: 7150cf9b6a5af063b37003062689f1691e79c020 - React-CoreModules: 15a85e6665d61678942da6ae485b351f4c699049 - React-cxxreact: 74f9de59259ac951923f5726aa14f0398f167af9 + React-Core: 10597593fdbae06f0089881e025a172e51d4a769 + React-CoreModules: 6907b255529dd46895cf687daa67b24484a612c2 + React-cxxreact: a9f5b8180d6955bc3f6a3fcd657c4d9b4d95c1f6 React-debug: e74e76912b91e08d580c481c34881899ccf63da9 - React-defaultsnativemodule: 628285212bbd65417d40ad6a9f8781830fda6c98 - React-domnativemodule: 185d9808198405c176784aaf33403d713bd24fb7 - React-Fabric: c814804affbe1952e16149ddd20256e1bccae67e - React-FabricComponents: 81ef47d596966121784afec9924f9562a29b1691 - React-FabricImage: f14f371d678aa557101def954ac3ba27e48948ff + React-defaultsnativemodule: 11f6ee2cf69bf3af9d0f28a6253def33d21b5266 + React-domnativemodule: f940bbc4fa9e134190acbf3a4a9f95621b5a8f51 + React-Fabric: 6f5c357bf3a42ff11f8844ad3fc7a1eb04f4b9de + React-FabricComponents: 10e0c0209822ac9e69412913a8af1ca33573379b + React-FabricImage: f582e764072dfa4715ae8c42979a5bace9cbcc12 React-featureflags: d5facceff8f8f6de430e0acecf4979a9a0839ba9 - React-featureflagsnativemodule: 96f0ab285382d95c90f663e02526a5ceefa95a11 - React-graphics: 1a66ee0a3f093b125b853f6370296fadcaf6f233 - React-hermes: 8b86e5f54a65ecb69cdf22b3a00a11562eda82d2 - React-idlecallbacksnativemodule: 5c25ab145c602264d00cb26a397ab52e0efa031c - React-ImageManager: 15e34bd5ef1ac4a18e96660817ef70a7f99ee8c2 - React-jserrorhandler: 02cdf2cd45350108be1ffd2b164578936dbbdff7 - React-jsi: 6af1987cfbb1b6621664fdbf6c7b62bd4d38c923 - React-jsiexecutor: 51f372998e0303585cb0317232b938d694663cbd - React-jsinspector: 3539ad976d073bfaa8a7d2fa9bef35e70e55033e - React-jsinspectortracing: e8dbacaf67c201f23052ca1c2bae2f7b84dec443 - React-jsitooling: 95a34f41e3c249d42181de13b4f8d854f178ca9f - React-jsitracing: 25b029cf5cad488252d46da19dd8c4c134fd5fe4 - React-logger: 368570a253f00879a1e4fea24ed4047e72e7bbf3 - React-Mapbuffer: c04fcda1c6281fc0a6824c7dcc1633dd217ac1ec - React-microtasksnativemodule: ca2804a25fdcefffa0aa942aa23ab53b99614a34 - react-native-executorch: aa97983ed344f0cbfb47f531f0c24638c579f1c1 - react-native-safe-area-context: 00d03dc688ba86664be66f9e3f203fc7d747d899 - React-NativeModulesApple: 452b86b29fae99ed0a4015dca3ad9cd222f88abf + React-featureflagsnativemodule: a7dd141f1ef4b7c1331af0035689fbc742a49ff4 + React-graphics: 36ae3407172c1c77cea29265d2b12b90aaef6aa0 + React-hermes: 9116d4e6d07abeb519a2852672de087f44da8f12 + React-idlecallbacksnativemodule: ae7f5ffc6cf2d2058b007b78248e5b08172ad5c3 + React-ImageManager: 9daee0dc99ad6a001d4b9e691fbf37107e2b7b54 + React-jserrorhandler: 1e6211581071edaf4ecd5303147328120c73f4dc + React-jsi: 753ba30c902f3a41fa7f956aca8eea3317a44ee6 + React-jsiexecutor: 47520714aa7d9589c51c0f3713dfbfca4895d4f9 + React-jsinspector: cfd27107f6d6f1076a57d88c932401251560fe5f + React-jsinspectortracing: 76a7d791f3c0c09a0d2bf6f46dfb0e79a4fcc0ac + React-jsitooling: 995e826570dd58f802251490486ebd3244a037ab + React-jsitracing: 094ae3d8c123cea67b50211c945b7c0443d3e97b + React-logger: 8edfcedc100544791cd82692ca5a574240a16219 + React-Mapbuffer: c3f4b608e4a59dd2f6a416ef4d47a14400194468 + React-microtasksnativemodule: 054f34e9b82f02bd40f09cebd4083828b5b2beb6 + react-native-executorch: 8bca350ccbb66246dd7366fb6514fed57083930e + react-native-safe-area-context: 562163222d999b79a51577eda2ea8ad2c32b4d06 + React-NativeModulesApple: 2c4377e139522c3d73f5df582e4f051a838ff25e React-oscompat: ef5df1c734f19b8003e149317d041b8ce1f7d29c - React-perflogger: 6fd2f6811533e9c19a61e855c3033eecbf4ad2a0 - React-performancetimeline: abf31259d794c9274b3ea19c5016186925eec6c4 + React-perflogger: 9a151e0b4c933c9205fd648c246506a83f31395d + React-performancetimeline: 5b0dfc0acba29ea0269ddb34cd6dd59d3b8a1c66 React-RCTActionSheet: a499b0d6d9793886b67ba3e16046a3fef2cdbbc3 - React-RCTAnimation: 2595dcb10a82216a511b54742f8c28d793852ac6 - React-RCTAppDelegate: f03604b70f57c9469a84a159d8abecf793a5bcff - React-RCTBlob: e00f9b4e2f151938f4d9864cf33ebf24ac03328a - React-RCTFabric: 3945d116fd271598db262d4e6ed5691d431ed9e8 - React-RCTFBReactNativeSpec: 0f4d4f0da938101f2ca9d5333a8f46e527ad2819 - React-RCTImage: dac5e9f8ec476aefe6e60ee640ebc1dfaf1a4dbe - React-RCTLinking: 494b785a40d952a1dfbe712f43214376e5f0e408 - React-RCTNetwork: b3d7c30cd21793e268db107dd0980cb61b3c1c44 - React-RCTRuntime: a8ff419d437228e7b8a793b14f9d711e1cbb82af - React-RCTSettings: a060c7e381a3896104761b8eed7e284d95e37df3 - React-RCTText: 4f272b72dbb61f390d8c8274528f9fdbff983806 - React-RCTVibration: 0e5326220719aca12473d703aa46693e3b4ce67a + React-RCTAnimation: cc64adc259aabc3354b73065e2231d796dfce576 + React-RCTAppDelegate: 9d523da768f1c9e84c5f3b7e3624d097dfb0e16b + React-RCTBlob: e727f53eeefded7e6432eb76bd22b57bc880e5d1 + React-RCTFabric: 58590aa4fdb4ad546c06a7449b486cf6844e991f + React-RCTFBReactNativeSpec: 9064c63d99e467a3893e328ba3612745c3c3a338 + React-RCTImage: 7159cbdbb18a09d97ba1a611416eced75b3ccb29 + React-RCTLinking: 46293afdb859bccc63e1d3dedc6901a3c04ef360 + React-RCTNetwork: 4a6cd18f5bcd0363657789c64043123a896b1170 + React-RCTRuntime: 5ab904fd749aa52f267ef771d265612582a17880 + React-RCTSettings: 61e361dc85136d1cb0e148b7541993d2ee950ea7 + React-RCTText: abd1e196c3167175e6baef18199c6d9d8ac54b4e + React-RCTVibration: 490e0dcb01a3fe4a0dfb7bc51ad5856d8b84f343 React-rendererconsistency: 351fdbc5c1fe4da24243d939094a80f0e149c7a1 - React-renderercss: d333f2ada83969591100d91ec6b23ca2e17e1507 - React-rendererdebug: 039e5949b72ba63c703de020701e3fd152434c61 + React-renderercss: 3438814bee838ae7840a633ab085ac81699fd5cf + React-rendererdebug: 0ac2b9419ad6f88444f066d4b476180af311fb1e React-rncore: 57ed480649bb678d8bdc386d20fee8bf2b0c307c - React-RuntimeApple: 344a5e1105256000afabaa8df12c3e4cab880340 - React-RuntimeCore: 0e48fb5e5160acc0334c7a723a42d42cef4b58b6 + React-RuntimeApple: 8b7a9788f31548298ba1990620fe06b40de65ad7 + React-RuntimeCore: e03d96fbd57ce69fd9bca8c925942194a5126dbc React-runtimeexecutor: d60846710facedd1edb70c08b738119b3ee2c6c2 - React-RuntimeHermes: 064286a03871d932c99738e0f8ef854962ab4b99 - React-runtimescheduler: e917ab17ae08c204af1ebf8f669b7e411b0220c8 + React-RuntimeHermes: aab794755d9f6efd249b61f3af4417296904e3ba + React-runtimescheduler: c3cd124fa5db7c37f601ee49ca0d97019acd8788 React-timing: a90f4654cbda9c628614f9bee68967f1768bd6a5 - React-utils: 51c4e71608b8133fecc9a15801d244ae7bdf3758 - ReactAppDependencyProvider: d5dcc564f129632276bd3184e60f053fcd574d6b - ReactCodegen: fda99a79c866370190e162083a35602fdc314e5d - ReactCommon: 4d0da92a5eb8da86c08e3ec34bd23ab439fb2461 - RNReanimated: 8b24b49fc13fce9a6e1729ccff645a63d2b7a6d1 - RNSVG: ee32efbed652c5151fd3f98bed13c68af285bc38 + React-utils: a612d50555b6f0f90c74b7d79954019ad47f5de6 + ReactAppDependencyProvider: 04d5eb15eb46be6720e17a4a7fa92940a776e584 + ReactCodegen: c63eda03ba1d94353fb97b031fc84f75a0d125ba + ReactCommon: 76d2dc87136d0a667678668b86f0fca0c16fdeb0 + RNReanimated: 2313402fe27fecb7237619e9c6fcee3177f08a65 + RNSVG: 794f269526df9ddc1f79b3d1a202b619df0368e3 SocketRocket: d4aabe649be1e368d1318fdf28a022d714d65748 - Yoga: 9f110fc4b7aa538663cba3c14cbb1c335f43c13f + Yoga: c758bfb934100bb4bf9cbaccb52557cee35e8bdf PODFILE CHECKSUM: bba19a069e673f2259009e9d2caab44374fdebcf diff --git a/examples/llm/package.json b/examples/llm/package.json index cffa62e1..f92475f7 100644 --- a/examples/llm/package.json +++ b/examples/llm/package.json @@ -14,11 +14,12 @@ "expo-brightness": "~13.1.4", "expo-calendar": "~14.1.4", "expo-font": "~13.3.1", + "expo-speech": "^13.0.1", "expo-status-bar": "~2.2.3", "metro-config": "^0.81.0", "react": "19.0.0", "react-native": "^0.79.2", - "react-native-executorch": "^0.3.2", + "react-native-executorch": "/Users/kopcion/swm-ai/react-native-executorch/react-native-executorch-0.3.1-stt-7.tgz", "react-native-loading-spinner-overlay": "^3.0.1", "react-native-markdown-display": "^7.0.2", "react-native-reanimated": "^3.17.5", diff --git a/examples/llm/screens/LLMScreen.tsx b/examples/llm/screens/LLMScreen.tsx index 11fb1aee..3f528c5b 100644 --- a/examples/llm/screens/LLMScreen.tsx +++ b/examples/llm/screens/LLMScreen.tsx @@ -1,122 +1,257 @@ import { useEffect, useRef, useState } from 'react'; import { Keyboard, + KeyboardAvoidingView, + Platform, StyleSheet, Text, - TextInput, TouchableOpacity, TouchableWithoutFeedback, View, + TextInput, } from 'react-native'; import { SafeAreaView } from 'react-native-safe-area-context'; -import SendIcon from '../assets/icons/send_icon.svg'; +import SWMIcon from '../assets/icons/swm_icon.svg'; import Spinner from 'react-native-loading-spinner-overlay'; import { + // STREAMING_ACTION, + useSpeechToText, LLAMA3_2_1B_QLORA, - LLAMA3_2_TOKENIZER, - LLAMA3_2_TOKENIZER_CONFIG, + LLAMA3_2_1B_TOKENIZER, useLLM, + LLAMA3_2_TOKENIZER_CONFIG, } from 'react-native-executorch'; import PauseIcon from '../assets/icons/pause_icon.svg'; +import MicIcon from '../assets/icons/mic_icon.svg'; +import SendIcon from '../assets/icons/send_icon.svg'; +import StopIcon from '../assets/icons/stop_icon.svg'; import ColorPalette from '../colors'; import Messages from '../components/Messages'; +import LiveAudioStream from 'react-native-live-audio-stream'; +import { Buffer } from 'buffer'; +// import * as Speech from 'expo-speech'; + +const audioStreamOptions = { + sampleRate: 16000, + channels: 1, + bitsPerSample: 16, + audioSource: 1, + bufferSize: 16000, +}; -export default function LLMScreen() { +const startStreamingAudio = (options: any, onChunk: (data: string) => void) => { + LiveAudioStream.init(options); + LiveAudioStream.on('data', onChunk); + LiveAudioStream.start(); +}; + +const float32ArrayFromPCMBinaryBuffer = (b64EncodedBuffer: string) => { + const b64DecodedChunk = Buffer.from(b64EncodedBuffer, 'base64'); + const int16Array = new Int16Array(b64DecodedChunk.buffer); + + const float32Array = new Float32Array(int16Array.length); + for (let i = 0; i < int16Array.length; i++) { + float32Array[i] = Math.max( + -1, + Math.min(1, (int16Array[i] / audioStreamOptions.bufferSize) * 8) + ); + } + return float32Array; +}; + +export default function ChatScreen() { + // const [currentMessage, setCurrentMessage] = useState(''); + const [isRecording, setIsRecording] = useState(false); const [isTextInputFocused, setIsTextInputFocused] = useState(false); const [userInput, setUserInput] = useState(''); - + const textInputRef = useRef(null); + const messageRecorded = useRef(false); const llm = useLLM({ modelSource: LLAMA3_2_1B_QLORA, - tokenizerSource: LLAMA3_2_TOKENIZER, + tokenizerSource: LLAMA3_2_1B_TOKENIZER, tokenizerConfigSource: LLAMA3_2_TOKENIZER_CONFIG, + chatConfig: { + contextWindowLength: 6, + }, + }); + const speechToText = useSpeechToText({ + modelName: 'whisper', + windowSize: 5, + overlapSeconds: 1.2, }); - useEffect(() => { - if (llm.error) { - console.log('LLM error:', llm.error); - } - }, [llm.error]); + const onChunk = (data: string) => { + const float32Chunk = float32ArrayFromPCMBinaryBuffer(data); + speechToText.transcribe(Array.from(float32Chunk)); + // speechToText.streamingTranscribe( + // STREAMING_ACTION.DATA, + // Array.from(float32Chunk) + // ); + }; - const textInputRef = useRef(null); + const handleRecordPress = async () => { + if (isRecording) { + setIsRecording(false); + LiveAudioStream.stop(); + messageRecorded.current = true; + // await llm.generate( + // await speechToText.streamingTranscribe(STREAMING_ACTION.STOP) + // ); + } else { + setIsRecording(true); + startStreamingAudio(audioStreamOptions, onChunk); + // await speechToText.streamingTranscribe(STREAMING_ACTION.START); + } + }; + // const sendMessage = async () => { + // setUserInput(''); + // textInputRef.current?.clear(); + // try { + // await llm.sendMessage(userInput); + // } catch (e) { + // console.error(e); + // } + // }; const sendMessage = async () => { - setUserInput(''); - textInputRef.current?.clear(); - try { - await llm.sendMessage(userInput); - } catch (e) { - console.error(e); + if (userInput) { + llm.sendMessage(userInput); + setUserInput(''); + setIsTextInputFocused(false); + textInputRef.current?.clear(); } }; - return !llm.isReady ? ( + // useEffect(() => { + // if (llm.response && !llm.isGenerating) { + // appendToMessageHistory(llm.response, 'assistant'); + // } + // }, [llm.response, llm.isGenerating]); + + // const modifyLastMessage = (content: string) => { + // setCurrentMessage((prevMessage) => prevMessage + content); + // }; + + useEffect(() => { + if (speechToText.sequence.length && !speechToText.isGenerating) { + llm.sendMessage(speechToText.sequence); + } + }, [speechToText.sequence, speechToText.isGenerating, llm.sendMessage]); //eslint-disable-line react-hooks/exhaustive-deps + + // const appendToMessageHistory = (content: string, role: SenderType) => { + // setChatHistory((prevHistory) => [...prevHistory, { role, content }]); + // if (role == 'assistant' && messageRecorded.current) + // Speech.speak(content, { language: 'en-US' }); + // }; + + return !llm.isReady || !speechToText.isReady ? ( ) : ( - - - {llm.messageHistory.length ? ( - - - - ) : ( - - Hello! 👋 - - What can I help you with? - + + + + + + llm 3.2 1B QLoRA x Whisper - )} - - - setIsTextInputFocused(true)} - onBlur={() => setIsTextInputFocused(false)} - style={{ - ...styles.textInput, - borderColor: isTextInputFocused - ? ColorPalette.blueDark - : ColorPalette.blueLight, - }} - placeholder="Your message" - placeholderTextColor={'#C1C6E5'} - multiline={true} - ref={textInputRef} - onChangeText={(text: string) => setUserInput(text)} - /> - {userInput && ( - !llm.isGenerating && (await sendMessage())} - > - - - )} - {llm.isGenerating && ( - - - + {llm.messageHistory.length ? ( + + + + ) : ( + + Hello! 👋 + + What can I help you with? + + )} - - - + + + setIsTextInputFocused(true)} + onBlur={() => setIsTextInputFocused(false)} + editable={!isRecording && !llm.isGenerating} + style={{ + ...styles.textInput, + borderColor: isTextInputFocused + ? ColorPalette.blueDark + : ColorPalette.blueLight, + display: isRecording ? 'none' : 'flex', + }} + placeholder="Your message" + placeholderTextColor={'#C1C6E5'} + multiline={true} + ref={textInputRef} + onChangeText={(text: string) => setUserInput(text)} + /> + {llm.isGenerating ? ( + + + + ) : !userInput ? ( + + {isRecording ? ( + + ) : ( + + )} + + ) : ( + !llm.isGenerating && (await sendMessage())} + > + + + )} + + + + ); } const styles = StyleSheet.create({ - container: { flex: 1 }, - chatContainer: { flex: 10, width: '100%' }, + container: { + flex: 1, + }, + keyboardAvoidingView: { + flex: 1, + }, + topContainer: { + height: 68, + width: '100%', + alignItems: 'center', + justifyContent: 'center', + }, + chatContainer: { + flex: 10, + width: '100%', + }, + textModelName: { + color: ColorPalette.primary, + }, helloMessageContainer: { flex: 10, width: '100%', @@ -152,10 +287,20 @@ const styles = StyleSheet.create({ color: ColorPalette.primary, padding: 16, }, - sendChatTouchable: { + fromUrlTouchable: { height: '100%', - width: 48, justifyContent: 'center', - alignItems: 'flex-end', + alignItems: 'flex-start', + }, + recordTouchable: { + height: '100%', + justifyContent: 'center', + alignItems: 'center', + }, + recordingInfo: { + width: '100%', + display: 'flex', + justifyContent: 'center', + alignItems: 'center', }, }); diff --git a/examples/llm/yarn.lock b/examples/llm/yarn.lock index 67524771..90612aef 100644 --- a/examples/llm/yarn.lock +++ b/examples/llm/yarn.lock @@ -54,13 +54,6 @@ __metadata: languageName: node linkType: hard -"@babel/compat-data@npm:^7.27.2": - version: 7.27.2 - resolution: "@babel/compat-data@npm:7.27.2" - checksum: 8d4066324e5f1275adc43f2e22110cac29ee09fe926260c43f0eaa432c148859367df4152574a28ee02dbb3e3d11dd57145eed345d49cc07f9b6e11fee06535f - languageName: node - linkType: hard - "@babel/core@npm:^7.11.6, @babel/core@npm:^7.12.3, @babel/core@npm:^7.13.16, @babel/core@npm:^7.20.0, @babel/core@npm:^7.21.3, @babel/core@npm:^7.25.2": version: 7.26.0 resolution: "@babel/core@npm:7.26.0" @@ -119,19 +112,6 @@ __metadata: languageName: node linkType: hard -"@babel/helper-compilation-targets@npm:^7.27.2": - version: 7.27.2 - resolution: "@babel/helper-compilation-targets@npm:7.27.2" - dependencies: - "@babel/compat-data": ^7.27.2 - "@babel/helper-validator-option": ^7.27.1 - browserslist: ^4.24.0 - lru-cache: ^5.1.1 - semver: ^6.3.1 - checksum: 7b95328237de85d7af1dea010a4daa28e79f961dda48b652860d5893ce9b136fc8b9ea1f126d8e0a24963b09ba5c6631dcb907b4ce109b04452d34a6ae979807 - languageName: node - linkType: hard - "@babel/helper-create-class-features-plugin@npm:^7.18.6, @babel/helper-create-class-features-plugin@npm:^7.25.9": version: 7.25.9 resolution: "@babel/helper-create-class-features-plugin@npm:7.25.9" @@ -290,13 +270,6 @@ __metadata: languageName: node linkType: hard -"@babel/helper-validator-option@npm:^7.27.1": - version: 7.27.1 - resolution: "@babel/helper-validator-option@npm:7.27.1" - checksum: db73e6a308092531c629ee5de7f0d04390835b21a263be2644276cb27da2384b64676cab9f22cd8d8dbd854c92b1d7d56fc8517cf0070c35d1c14a8c828b0903 - languageName: node - linkType: hard - "@babel/helper-wrap-function@npm:^7.25.9": version: 7.25.9 resolution: "@babel/helper-wrap-function@npm:7.25.9" @@ -732,18 +705,7 @@ __metadata: languageName: node linkType: hard -"@babel/plugin-transform-destructuring@npm:^7.27.1": - version: 7.27.1 - resolution: "@babel/plugin-transform-destructuring@npm:7.27.1" - dependencies: - "@babel/helper-plugin-utils": ^7.27.1 - peerDependencies: - "@babel/core": ^7.0.0-0 - checksum: 492013fc4befd5f3554853f983b82cfa748dd2004a525f1f16a37f841ac402a51e891cac2084b03e2b89553f0e1e685cf5bf8bf9df8fed82114c580b3c567bb6 - languageName: node - linkType: hard - -"@babel/plugin-transform-export-namespace-from@npm:^7.22.11, @babel/plugin-transform-export-namespace-from@npm:^7.25.9": +"@babel/plugin-transform-export-namespace-from@npm:^7.25.9": version: 7.27.1 resolution: "@babel/plugin-transform-export-namespace-from@npm:7.27.1" dependencies: @@ -859,20 +821,6 @@ __metadata: languageName: node linkType: hard -"@babel/plugin-transform-object-rest-spread@npm:^7.12.13": - version: 7.27.2 - resolution: "@babel/plugin-transform-object-rest-spread@npm:7.27.2" - dependencies: - "@babel/helper-compilation-targets": ^7.27.2 - "@babel/helper-plugin-utils": ^7.27.1 - "@babel/plugin-transform-destructuring": ^7.27.1 - "@babel/plugin-transform-parameters": ^7.27.1 - peerDependencies: - "@babel/core": ^7.0.0-0 - checksum: 6d518c21cddfa436029d72409aac8f680d3ba3a10eb94477112869132226498474a61218893ac9958f8bc079109af0f684d1347d5036fee8e9b477daecf2d8f3 - languageName: node - linkType: hard - "@babel/plugin-transform-object-rest-spread@npm:^7.24.7": version: 7.25.9 resolution: "@babel/plugin-transform-object-rest-spread@npm:7.25.9" @@ -909,17 +857,6 @@ __metadata: languageName: node linkType: hard -"@babel/plugin-transform-parameters@npm:^7.22.15, @babel/plugin-transform-parameters@npm:^7.27.1": - version: 7.27.1 - resolution: "@babel/plugin-transform-parameters@npm:7.27.1" - dependencies: - "@babel/helper-plugin-utils": ^7.27.1 - peerDependencies: - "@babel/core": ^7.0.0-0 - checksum: 52dd9db2be63ca954dbf86bba3f1dedce5f8bcf0cbc2b9ab26981b6f9c3ad5ea3a1b7ba286d18ae05d7487763f2bd086533826ee82f7b8d76873265569e45125 - languageName: node - linkType: hard - "@babel/plugin-transform-parameters@npm:^7.24.7, @babel/plugin-transform-parameters@npm:^7.25.9": version: 7.25.9 resolution: "@babel/plugin-transform-parameters@npm:7.25.9" @@ -1231,63 +1168,46 @@ __metadata: languageName: node linkType: hard -"@expo/bunyan@npm:^4.0.0": - version: 4.0.1 - resolution: "@expo/bunyan@npm:4.0.1" - dependencies: - uuid: ^8.0.0 - checksum: 7a503cf202ef26bd151ef31be63fdac113a27edd1e5703aee96326c3b7bea349e09e706a18854c251b313814a05673d5041eaea4c018667d9afa2c583d821af7 - languageName: node - linkType: hard - -"@expo/cli@npm:0.22.26": - version: 0.22.26 - resolution: "@expo/cli@npm:0.22.26" +"@expo/cli@npm:0.24.12": + version: 0.24.12 + resolution: "@expo/cli@npm:0.24.12" dependencies: "@0no-co/graphql.web": ^1.0.8 "@babel/runtime": ^7.20.0 "@expo/code-signing-certificates": ^0.0.5 - "@expo/config": ~10.0.11 - "@expo/config-plugins": ~9.0.17 + "@expo/config": ~11.0.9 + "@expo/config-plugins": ~10.0.2 "@expo/devcert": ^1.1.2 - "@expo/env": ~0.4.2 - "@expo/image-utils": ^0.6.5 - "@expo/json-file": ^9.0.2 - "@expo/metro-config": ~0.19.12 - "@expo/osascript": ^2.1.6 - "@expo/package-manager": ^1.7.2 - "@expo/plist": ^0.2.2 - "@expo/prebuild-config": ~8.2.0 - "@expo/rudder-sdk-node": ^1.1.1 + "@expo/env": ~1.0.5 + "@expo/image-utils": ^0.7.4 + "@expo/json-file": ^9.1.4 + "@expo/metro-config": ~0.20.14 + "@expo/osascript": ^2.2.4 + "@expo/package-manager": ^1.8.4 + "@expo/plist": ^0.3.4 + "@expo/prebuild-config": ^9.0.6 "@expo/spawn-async": ^1.7.2 "@expo/ws-tunnel": ^1.0.1 "@expo/xcpretty": ^4.3.0 - "@react-native/dev-middleware": 0.76.9 + "@react-native/dev-middleware": 0.79.2 "@urql/core": ^5.0.6 "@urql/exchange-retry": ^1.3.0 accepts: ^1.3.8 arg: ^5.0.2 better-opn: ~3.0.2 - bplist-creator: 0.0.7 + bplist-creator: 0.1.0 bplist-parser: ^0.3.1 - cacache: ^18.0.2 chalk: ^4.0.0 ci-info: ^3.3.0 compression: ^1.7.4 connect: ^3.7.0 debug: ^4.3.4 env-editor: ^0.4.1 - fast-glob: ^3.3.2 - form-data: ^3.0.1 freeport-async: ^2.0.0 - fs-extra: ~8.1.0 getenv: ^1.0.0 glob: ^10.4.2 - internal-ip: ^4.3.0 - is-docker: ^2.0.0 - is-wsl: ^2.1.1 - lodash.debounce: ^4.0.8 - minimatch: ^3.0.4 + lan-network: ^0.1.4 + minimatch: ^9.0.0 node-forge: ^1.3.1 npm-package-arg: ^11.0.0 ora: ^3.4.0 @@ -1308,28 +1228,25 @@ __metadata: source-map-support: ~0.5.21 stacktrace-parser: ^0.1.10 structured-headers: ^0.4.1 - tar: ^6.2.1 - temp-dir: ^2.0.0 - tempy: ^0.7.1 + tar: ^7.4.3 terminal-link: ^2.1.1 undici: ^6.18.2 - unique-string: ~2.0.0 wrap-ansi: ^7.0.0 ws: ^8.12.1 bin: expo-internal: build/bin/cli - checksum: 32b79ab6a5ee88487e457e5f74249b2e081889521a89d53b452fbd454652428a08164e933681bf7707f4834f1cf529c3b6eaa9df7a077bc1a7bc026442990bf4 + checksum: 4e3af21db0a361e0b83dc2497e4ebef80bb636947df034d6da422909a15283bf023600bbe859b457353297cde1f67e2c1a011ba16bc7d4b2d55f7a9e0437338a languageName: node linkType: hard -"@expo/cli@npm:0.24.12": - version: 0.24.12 - resolution: "@expo/cli@npm:0.24.12" +"@expo/cli@npm:0.24.13": + version: 0.24.13 + resolution: "@expo/cli@npm:0.24.13" dependencies: "@0no-co/graphql.web": ^1.0.8 "@babel/runtime": ^7.20.0 "@expo/code-signing-certificates": ^0.0.5 - "@expo/config": ~11.0.9 + "@expo/config": ~11.0.10 "@expo/config-plugins": ~10.0.2 "@expo/devcert": ^1.1.2 "@expo/env": ~1.0.5 @@ -1360,7 +1277,7 @@ __metadata: freeport-async: ^2.0.0 getenv: ^1.0.0 glob: ^10.4.2 - lan-network: ^0.1.4 + lan-network: ^0.1.6 minimatch: ^9.0.0 node-forge: ^1.3.1 npm-package-arg: ^11.0.0 @@ -1389,7 +1306,7 @@ __metadata: ws: ^8.12.1 bin: expo-internal: build/bin/cli - checksum: 4e3af21db0a361e0b83dc2497e4ebef80bb636947df034d6da422909a15283bf023600bbe859b457353297cde1f67e2c1a011ba16bc7d4b2d55f7a9e0437338a + checksum: 9392445606c21f37b4360e08f6cc436a2081651998c0fe167f87d4573a89279be0ffa85481ab465b162269c348223326786e9afca5da99b7df6bb6d0969a021c languageName: node linkType: hard @@ -1489,6 +1406,27 @@ __metadata: languageName: node linkType: hard +"@expo/config@npm:~11.0.10": + version: 11.0.10 + resolution: "@expo/config@npm:11.0.10" + dependencies: + "@babel/code-frame": ~7.10.4 + "@expo/config-plugins": ~10.0.2 + "@expo/config-types": ^53.0.4 + "@expo/json-file": ^9.1.4 + deepmerge: ^4.3.1 + getenv: ^1.0.0 + glob: ^10.4.2 + require-from-string: ^2.0.2 + resolve-from: ^5.0.0 + resolve-workspace-root: ^2.0.0 + semver: ^7.6.0 + slugify: ^1.3.4 + sucrase: 3.35.0 + checksum: d3308c41602fd7eae22b23dfd64925037e1e0e9d9356781c208bcfc8c3ee4d64ecb309b4b07e081732b96c98801d16e36cbe83d84e88f6b11531714e48a3e24f + languageName: node + linkType: hard + "@expo/config@npm:~11.0.7": version: 11.0.8 resolution: "@expo/config@npm:11.0.8" @@ -1577,26 +1515,6 @@ __metadata: languageName: node linkType: hard -"@expo/fingerprint@npm:0.11.11": - version: 0.11.11 - resolution: "@expo/fingerprint@npm:0.11.11" - dependencies: - "@expo/spawn-async": ^1.7.2 - arg: ^5.0.2 - chalk: ^4.1.2 - debug: ^4.3.4 - find-up: ^5.0.0 - getenv: ^1.0.0 - minimatch: ^3.0.4 - p-limit: ^3.1.0 - resolve-from: ^5.0.0 - semver: ^7.6.0 - bin: - fingerprint: bin/cli.js - checksum: ef98fc8a4d7026ad409063f5a5776bf89375e4869bbcb5e4b2f3315bb1af75300d1f07107da458ff010dd71b295513e15838a0de91daed877a68dc52790b3adc - languageName: node - linkType: hard - "@expo/fingerprint@npm:0.12.4": version: 0.12.4 resolution: "@expo/fingerprint@npm:0.12.4" @@ -1673,32 +1591,6 @@ __metadata: languageName: node linkType: hard -"@expo/metro-config@npm:0.19.12, @expo/metro-config@npm:~0.19.12": - version: 0.19.12 - resolution: "@expo/metro-config@npm:0.19.12" - dependencies: - "@babel/core": ^7.20.0 - "@babel/generator": ^7.20.5 - "@babel/parser": ^7.20.0 - "@babel/types": ^7.20.0 - "@expo/config": ~10.0.11 - "@expo/env": ~0.4.2 - "@expo/json-file": ~9.0.2 - "@expo/spawn-async": ^1.7.2 - chalk: ^4.1.0 - debug: ^4.3.2 - fs-extra: ^9.1.0 - getenv: ^1.0.0 - glob: ^10.4.2 - jsc-safe-url: ^0.2.4 - lightningcss: ~1.27.0 - minimatch: ^3.0.4 - postcss: ~8.4.32 - resolve-from: ^5.0.0 - checksum: 241934860fcf90575de47d67a6de5c701b51e16069a7007c15fac5addc04a66663e66800241aac63635761921829c2c6895217fd2bf6b8d95a00c2e1c664dfc3 - languageName: node - linkType: hard - "@expo/metro-config@npm:0.20.14, @expo/metro-config@npm:~0.20.14": version: 0.20.14 resolution: "@expo/metro-config@npm:0.20.14" @@ -1726,7 +1618,7 @@ __metadata: languageName: node linkType: hard -"@expo/osascript@npm:^2.1.6, @expo/osascript@npm:^2.2.4": +"@expo/osascript@npm:^2.2.4": version: 2.2.4 resolution: "@expo/osascript@npm:2.2.4" dependencies: @@ -1736,7 +1628,7 @@ __metadata: languageName: node linkType: hard -"@expo/package-manager@npm:^1.7.2, @expo/package-manager@npm:^1.8.4": +"@expo/package-manager@npm:^1.8.4": version: 1.8.4 resolution: "@expo/package-manager@npm:1.8.4" dependencies: @@ -1790,40 +1682,6 @@ __metadata: languageName: node linkType: hard -"@expo/prebuild-config@npm:~8.2.0": - version: 8.2.0 - resolution: "@expo/prebuild-config@npm:8.2.0" - dependencies: - "@expo/config": ~10.0.11 - "@expo/config-plugins": ~9.0.17 - "@expo/config-types": ^52.0.5 - "@expo/image-utils": ^0.6.5 - "@expo/json-file": ^9.0.2 - "@react-native/normalize-colors": 0.76.9 - debug: ^4.3.1 - fs-extra: ^9.0.0 - resolve-from: ^5.0.0 - semver: ^7.6.0 - xml2js: 0.6.0 - checksum: 5c9d194e63cc4ec9ba3076179832ce928208e09846981cccc6f07e70742b1d7a29bf7594788543578ced75a42fbc0d4a624c4bd7af73e755d220170090f0b2e5 - languageName: node - linkType: hard - -"@expo/rudder-sdk-node@npm:^1.1.1": - version: 1.1.1 - resolution: "@expo/rudder-sdk-node@npm:1.1.1" - dependencies: - "@expo/bunyan": ^4.0.0 - "@segment/loosely-validate-event": ^2.0.0 - fetch-retry: ^4.1.1 - md5: ^2.2.1 - node-fetch: ^2.6.1 - remove-trailing-slash: ^0.1.0 - uuid: ^8.3.2 - checksum: 5ce50c1a82f899b135600cb29cddf3fab601938700c8203f16a1394d2ffbf9e2cdd246b92ff635f8415121072d99a7b4a370f715b78f6680594b5a630e8d78c6 - languageName: node - linkType: hard - "@expo/sdk-runtime-versions@npm:^1.0.0": version: 1.0.0 resolution: "@expo/sdk-runtime-versions@npm:1.0.0" @@ -1870,6 +1728,13 @@ __metadata: languageName: node linkType: hard +"@huggingface/jinja@npm:^0.5.0": + version: 0.5.0 + resolution: "@huggingface/jinja@npm:0.5.0" + checksum: 8bb04021f381158d5e358a166f8eec250785c0dc9f70a04b92d0aabddc8583a9f20026c808be59d4926787087399ca8f5a4cc8fc37749be35bea63473af19c53 + languageName: node + linkType: hard + "@isaacs/cliui@npm:^8.0.2": version: 8.0.2 resolution: "@isaacs/cliui@npm:8.0.2" @@ -2053,33 +1918,6 @@ __metadata: languageName: node linkType: hard -"@nodelib/fs.scandir@npm:2.1.5": - version: 2.1.5 - resolution: "@nodelib/fs.scandir@npm:2.1.5" - dependencies: - "@nodelib/fs.stat": 2.0.5 - run-parallel: ^1.1.9 - checksum: a970d595bd23c66c880e0ef1817791432dbb7acbb8d44b7e7d0e7a22f4521260d4a83f7f9fd61d44fda4610105577f8f58a60718105fb38352baed612fd79e59 - languageName: node - linkType: hard - -"@nodelib/fs.stat@npm:2.0.5, @nodelib/fs.stat@npm:^2.0.2": - version: 2.0.5 - resolution: "@nodelib/fs.stat@npm:2.0.5" - checksum: 012480b5ca9d97bff9261571dbbec7bbc6033f69cc92908bc1ecfad0792361a5a1994bc48674b9ef76419d056a03efadfce5a6cf6dbc0a36559571a7a483f6f0 - languageName: node - linkType: hard - -"@nodelib/fs.walk@npm:^1.2.3": - version: 1.2.8 - resolution: "@nodelib/fs.walk@npm:1.2.8" - dependencies: - "@nodelib/fs.scandir": 2.1.5 - fastq: ^1.6.0 - checksum: 190c643f156d8f8f277bf2a6078af1ffde1fd43f498f187c2db24d35b4b4b5785c02c7dc52e356497b9a1b65b13edc996de08de0b961c32844364da02986dc53 - languageName: node - linkType: hard - "@npmcli/agent@npm:^3.0.0": version: 3.0.0 resolution: "@npmcli/agent@npm:3.0.0" @@ -2093,15 +1931,6 @@ __metadata: languageName: node linkType: hard -"@npmcli/fs@npm:^3.1.0": - version: 3.1.1 - resolution: "@npmcli/fs@npm:3.1.1" - dependencies: - semver: ^7.3.5 - checksum: d960cab4b93adcb31ce223bfb75c5714edbd55747342efb67dcc2f25e023d930a7af6ece3e75f2f459b6f38fc14d031c766f116cd124fdc937fd33112579e820 - languageName: node - linkType: hard - "@npmcli/fs@npm:^4.0.0": version: 4.0.0 resolution: "@npmcli/fs@npm:4.0.0" @@ -2134,15 +1963,6 @@ __metadata: languageName: node linkType: hard -"@react-native/babel-plugin-codegen@npm:0.76.9": - version: 0.76.9 - resolution: "@react-native/babel-plugin-codegen@npm:0.76.9" - dependencies: - "@react-native/codegen": 0.76.9 - checksum: 13bba234a6c9e29fa4f7bf13a23ce8aecc5fc00da6cef6f6dd0462f82cdfeeeca62842c054ffe626662a92326774bf22723a90be5ac2158990386422ceee96c5 - languageName: node - linkType: hard - "@react-native/babel-plugin-codegen@npm:0.79.2": version: 0.79.2 resolution: "@react-native/babel-plugin-codegen@npm:0.79.2" @@ -2208,61 +2028,6 @@ __metadata: languageName: node linkType: hard -"@react-native/babel-preset@npm:0.76.9": - version: 0.76.9 - resolution: "@react-native/babel-preset@npm:0.76.9" - dependencies: - "@babel/core": ^7.25.2 - "@babel/plugin-proposal-export-default-from": ^7.24.7 - "@babel/plugin-syntax-dynamic-import": ^7.8.3 - "@babel/plugin-syntax-export-default-from": ^7.24.7 - "@babel/plugin-syntax-nullish-coalescing-operator": ^7.8.3 - "@babel/plugin-syntax-optional-chaining": ^7.8.3 - "@babel/plugin-transform-arrow-functions": ^7.24.7 - "@babel/plugin-transform-async-generator-functions": ^7.25.4 - "@babel/plugin-transform-async-to-generator": ^7.24.7 - "@babel/plugin-transform-block-scoping": ^7.25.0 - "@babel/plugin-transform-class-properties": ^7.25.4 - "@babel/plugin-transform-classes": ^7.25.4 - "@babel/plugin-transform-computed-properties": ^7.24.7 - "@babel/plugin-transform-destructuring": ^7.24.8 - "@babel/plugin-transform-flow-strip-types": ^7.25.2 - "@babel/plugin-transform-for-of": ^7.24.7 - "@babel/plugin-transform-function-name": ^7.25.1 - "@babel/plugin-transform-literals": ^7.25.2 - "@babel/plugin-transform-logical-assignment-operators": ^7.24.7 - "@babel/plugin-transform-modules-commonjs": ^7.24.8 - "@babel/plugin-transform-named-capturing-groups-regex": ^7.24.7 - "@babel/plugin-transform-nullish-coalescing-operator": ^7.24.7 - "@babel/plugin-transform-numeric-separator": ^7.24.7 - "@babel/plugin-transform-object-rest-spread": ^7.24.7 - "@babel/plugin-transform-optional-catch-binding": ^7.24.7 - "@babel/plugin-transform-optional-chaining": ^7.24.8 - "@babel/plugin-transform-parameters": ^7.24.7 - "@babel/plugin-transform-private-methods": ^7.24.7 - "@babel/plugin-transform-private-property-in-object": ^7.24.7 - "@babel/plugin-transform-react-display-name": ^7.24.7 - "@babel/plugin-transform-react-jsx": ^7.25.2 - "@babel/plugin-transform-react-jsx-self": ^7.24.7 - "@babel/plugin-transform-react-jsx-source": ^7.24.7 - "@babel/plugin-transform-regenerator": ^7.24.7 - "@babel/plugin-transform-runtime": ^7.24.7 - "@babel/plugin-transform-shorthand-properties": ^7.24.7 - "@babel/plugin-transform-spread": ^7.24.7 - "@babel/plugin-transform-sticky-regex": ^7.24.7 - "@babel/plugin-transform-typescript": ^7.25.2 - "@babel/plugin-transform-unicode-regex": ^7.24.7 - "@babel/template": ^7.25.0 - "@react-native/babel-plugin-codegen": 0.76.9 - babel-plugin-syntax-hermes-parser: ^0.25.1 - babel-plugin-transform-flow-enums: ^0.0.2 - react-refresh: ^0.14.0 - peerDependencies: - "@babel/core": "*" - checksum: b48ac1195d4b52a14134f3dbfa26771aa66db0b787ebced6153d7c60802f1b959a3cf07b873da1b085e7db9b527507d1111302bb177ad52d7c77d635b6f3805b - languageName: node - linkType: hard - "@react-native/babel-preset@npm:0.79.2": version: 0.79.2 resolution: "@react-native/babel-preset@npm:0.79.2" @@ -2336,24 +2101,6 @@ __metadata: languageName: node linkType: hard -"@react-native/codegen@npm:0.76.9": - version: 0.76.9 - resolution: "@react-native/codegen@npm:0.76.9" - dependencies: - "@babel/parser": ^7.25.3 - glob: ^7.1.1 - hermes-parser: 0.23.1 - invariant: ^2.2.4 - jscodeshift: ^0.14.0 - mkdirp: ^0.5.1 - nullthrows: ^1.1.1 - yargs: ^17.6.2 - peerDependencies: - "@babel/preset-env": ^7.1.6 - checksum: fcb26bd5be6f923eafd05e356ab01c9bbd30cab5e950bb050312a651771bcb2cb8484a3ba511e1460d44f508700565b0b69d43039c8cc61e63b9eacca6b9c756 - languageName: node - linkType: hard - "@react-native/codegen@npm:0.79.2": version: 0.79.2 resolution: "@react-native/codegen@npm:0.79.2" @@ -2390,13 +2137,6 @@ __metadata: languageName: node linkType: hard -"@react-native/debugger-frontend@npm:0.76.9": - version: 0.76.9 - resolution: "@react-native/debugger-frontend@npm:0.76.9" - checksum: c537ae5be75bb9a0a549d88b6545762364d87a1166c8a7339ccd774257096a2c62f83efdd86c78553a3f1c4ef35cfa7708aba477bf6eeb76b7814ceab2b98069 - languageName: node - linkType: hard - "@react-native/debugger-frontend@npm:0.79.2": version: 0.79.2 resolution: "@react-native/debugger-frontend@npm:0.79.2" @@ -2404,26 +2144,6 @@ __metadata: languageName: node linkType: hard -"@react-native/dev-middleware@npm:0.76.9": - version: 0.76.9 - resolution: "@react-native/dev-middleware@npm:0.76.9" - dependencies: - "@isaacs/ttlcache": ^1.4.1 - "@react-native/debugger-frontend": 0.76.9 - chrome-launcher: ^0.15.2 - chromium-edge-launcher: ^0.2.0 - connect: ^3.6.5 - debug: ^2.2.0 - invariant: ^2.2.4 - nullthrows: ^1.1.1 - open: ^7.0.3 - selfsigned: ^2.4.1 - serve-static: ^1.13.1 - ws: ^6.2.3 - checksum: 1f7750ae0c4d4d7970a73cd4f8443004a93b91b998a003ddb965274eb718d2a70ff06d182903dcaeccf15d8d245f488a397ea8ae53f6ed5f25e4d476d844b90f - languageName: node - linkType: hard - "@react-native/dev-middleware@npm:0.79.2": version: 0.79.2 resolution: "@react-native/dev-middleware@npm:0.79.2" @@ -2490,13 +2210,6 @@ __metadata: languageName: node linkType: hard -"@react-native/normalize-colors@npm:0.76.9": - version: 0.76.9 - resolution: "@react-native/normalize-colors@npm:0.76.9" - checksum: 4fddb977b8aad2e848cb698f13b9ffec539668e8ae891846327d5e23ce3de13dea59a2dfbea8a154ea034791c7abc3f7d1d4c8caae2114f7a683c78b221aed36 - languageName: node - linkType: hard - "@react-native/normalize-colors@npm:0.79.2": version: 0.79.2 resolution: "@react-native/normalize-colors@npm:0.79.2" @@ -2521,16 +2234,6 @@ __metadata: languageName: node linkType: hard -"@segment/loosely-validate-event@npm:^2.0.0": - version: 2.0.0 - resolution: "@segment/loosely-validate-event@npm:2.0.0" - dependencies: - component-type: ^1.2.1 - join-component: ^1.1.0 - checksum: 8c4aacc903fb717619b69ca7eecf8d4a7b928661b0e835c9cd98f1b858a85ce62c348369ad9a52cb2df8df02578c0525a73fce4c69a42ac414d9554cc6be7117 - languageName: node - linkType: hard - "@sinclair/typebox@npm:^0.27.8": version: 0.27.8 resolution: "@sinclair/typebox@npm:0.27.8" @@ -2778,15 +2481,6 @@ __metadata: languageName: node linkType: hard -"@types/node-forge@npm:^1.3.0": - version: 1.3.11 - resolution: "@types/node-forge@npm:1.3.11" - dependencies: - "@types/node": "*" - checksum: 1e86bd55b92a492eaafd75f6d01f31e7d86a5cdadd0c6bcdc0b1df4103b7f99bb75b832efd5217c7ddda5c781095dc086a868e20b9de00f5a427ddad4c296cd5 - languageName: node - linkType: hard - "@types/node@npm:*": version: 22.10.2 resolution: "@types/node@npm:22.10.2" @@ -2906,16 +2600,6 @@ __metadata: languageName: node linkType: hard -"aggregate-error@npm:^3.0.0": - version: 3.1.0 - resolution: "aggregate-error@npm:3.1.0" - dependencies: - clean-stack: ^2.0.0 - indent-string: ^4.0.0 - checksum: 1101a33f21baa27a2fa8e04b698271e64616b886795fd43c31068c07533c7b3facfcaf4e9e0cab3624bd88f729a592f1c901a1a229c9e490eafce411a8644b79 - languageName: node - linkType: hard - "anser@npm:^1.4.9": version: 1.4.10 resolution: "anser@npm:1.4.10" @@ -3032,14 +2716,7 @@ __metadata: languageName: node linkType: hard -"array-union@npm:^2.1.0": - version: 2.1.0 - resolution: "array-union@npm:2.1.0" - checksum: 5bee12395cba82da674931df6d0fea23c4aa4660cb3b338ced9f828782a65caa232573e6bf3968f23e0c5eb301764a382cef2f128b170a9dc59de0e36c39f98d - languageName: node - linkType: hard - -"asap@npm:~2.0.3, asap@npm:~2.0.6": +"asap@npm:~2.0.6": version: 2.0.6 resolution: "asap@npm:2.0.6" checksum: b296c92c4b969e973260e47523207cd5769abd27c245a68c26dc7a0fe8053c55bb04360237cb51cab1df52be939da77150ace99ad331fb7fb13b3423ed73ff3d @@ -3062,13 +2739,6 @@ __metadata: languageName: node linkType: hard -"asynckit@npm:^0.4.0": - version: 0.4.0 - resolution: "asynckit@npm:0.4.0" - checksum: 7b78c451df768adba04e2d02e63e2d0bf3b07adcd6e42b4cf665cb7ce899bedd344c69a1dcbce355b5f972d597b25aaa1c1742b52cffd9caccb22f348114f6be - languageName: node - linkType: hard - "at-least-node@npm:^1.0.0": version: 1.0.0 resolution: "at-least-node@npm:1.0.0" @@ -3213,31 +2883,6 @@ __metadata: languageName: node linkType: hard -"babel-preset-expo@npm:~12.0.11": - version: 12.0.11 - resolution: "babel-preset-expo@npm:12.0.11" - dependencies: - "@babel/plugin-proposal-decorators": ^7.12.9 - "@babel/plugin-transform-export-namespace-from": ^7.22.11 - "@babel/plugin-transform-object-rest-spread": ^7.12.13 - "@babel/plugin-transform-parameters": ^7.22.15 - "@babel/preset-react": ^7.22.15 - "@babel/preset-typescript": ^7.23.0 - "@react-native/babel-preset": 0.76.9 - babel-plugin-react-native-web: ~0.19.13 - react-refresh: ^0.14.2 - peerDependencies: - babel-plugin-react-compiler: ^19.0.0-beta-9ee70a1-20241017 - react-compiler-runtime: ^19.0.0-beta-8a03594-20241020 - peerDependenciesMeta: - babel-plugin-react-compiler: - optional: true - react-compiler-runtime: - optional: true - checksum: 8ff4437a5e3ea229c22ad2de645abc452f05fe55bc72b2586e4cfe675fcc6b3c83779c1a18343364d200b988cac5e60eed6e616a29eb1446e2294236f9f60d3f - languageName: node - linkType: hard - "babel-preset-expo@npm:~13.1.11": version: 13.1.11 resolution: "babel-preset-expo@npm:13.1.11" @@ -3321,15 +2966,6 @@ __metadata: languageName: node linkType: hard -"bplist-creator@npm:0.0.7": - version: 0.0.7 - resolution: "bplist-creator@npm:0.0.7" - dependencies: - stream-buffers: ~2.2.0 - checksum: 5bcf4091c5a0e5934d56643d9f2705b5149a0b0b62b8314762f6ad4b3208d313c75ad03bab97a3c42b6e17db3d73530d3642d082ca249b55f952c90056c2b2ad - languageName: node - linkType: hard - "bplist-creator@npm:0.1.0": version: 0.1.0 resolution: "bplist-creator@npm:0.1.0" @@ -3456,26 +3092,6 @@ __metadata: languageName: node linkType: hard -"cacache@npm:^18.0.2": - version: 18.0.4 - resolution: "cacache@npm:18.0.4" - dependencies: - "@npmcli/fs": ^3.1.0 - fs-minipass: ^3.0.0 - glob: ^10.2.2 - lru-cache: ^10.0.1 - minipass: ^7.0.3 - minipass-collect: ^2.0.1 - minipass-flush: ^1.0.5 - minipass-pipeline: ^1.2.4 - p-map: ^4.0.0 - ssri: ^10.0.0 - tar: ^6.1.11 - unique-filename: ^3.0.0 - checksum: b7422c113b4ec750f33beeca0f426a0024c28e3172f332218f48f963e5b970647fa1ac05679fe5bb448832c51efea9fda4456b9a95c3a1af1105fe6c1833cde2 - languageName: node - linkType: hard - "cacache@npm:^19.0.1": version: 19.0.1 resolution: "cacache@npm:19.0.1" @@ -3496,16 +3112,6 @@ __metadata: languageName: node linkType: hard -"call-bind-apply-helpers@npm:^1.0.1, call-bind-apply-helpers@npm:^1.0.2": - version: 1.0.2 - resolution: "call-bind-apply-helpers@npm:1.0.2" - dependencies: - es-errors: ^1.3.0 - function-bind: ^1.1.2 - checksum: b2863d74fcf2a6948221f65d95b91b4b2d90cfe8927650b506141e669f7d5de65cea191bf788838bc40d13846b7886c5bc5c84ab96c3adbcf88ad69a72fcdc6b - languageName: node - linkType: hard - "caller-callsite@npm:^2.0.0": version: 2.0.0 resolution: "caller-callsite@npm:2.0.0" @@ -3587,20 +3193,6 @@ __metadata: languageName: node linkType: hard -"charenc@npm:0.0.2": - version: 0.0.2 - resolution: "charenc@npm:0.0.2" - checksum: 81dcadbe57e861d527faf6dd3855dc857395a1c4d6781f4847288ab23cffb7b3ee80d57c15bba7252ffe3e5e8019db767757ee7975663ad2ca0939bb8fcaf2e5 - languageName: node - linkType: hard - -"chownr@npm:^2.0.0": - version: 2.0.0 - resolution: "chownr@npm:2.0.0" - checksum: c57cf9dd0791e2f18a5ee9c1a299ae6e801ff58fee96dc8bfd0dcb4738a6ce58dd252a3605b1c93c6418fe4f9d5093b28ffbf4d66648cb2a9c67eaef9679be2f - languageName: node - linkType: hard - "chownr@npm:^3.0.0": version: 3.0.0 resolution: "chownr@npm:3.0.0" @@ -3650,13 +3242,6 @@ __metadata: languageName: node linkType: hard -"clean-stack@npm:^2.0.0": - version: 2.2.0 - resolution: "clean-stack@npm:2.2.0" - checksum: 2ac8cd2b2f5ec986a3c743935ec85b07bc174d5421a5efc8017e1f146a1cf5f781ae962618f416352103b32c9cd7e203276e8c28241bbe946160cab16149fb68 - languageName: node - linkType: hard - "cli-cursor@npm:^2.1.0": version: 2.1.0 resolution: "cli-cursor@npm:2.1.0" @@ -3734,15 +3319,6 @@ __metadata: languageName: node linkType: hard -"combined-stream@npm:^1.0.8": - version: 1.0.8 - resolution: "combined-stream@npm:1.0.8" - dependencies: - delayed-stream: ~1.0.0 - checksum: 49fa4aeb4916567e33ea81d088f6584749fc90c7abec76fd516bf1c5aa5c79f3584b5ba3de6b86d26ddd64bae5329c4c7479343250cfe71c75bb366eae53bb7c - languageName: node - linkType: hard - "command-exists@npm:^1.2.4": version: 1.2.9 resolution: "command-exists@npm:1.2.9" @@ -3785,13 +3361,6 @@ __metadata: languageName: node linkType: hard -"component-type@npm:^1.2.1": - version: 1.2.2 - resolution: "component-type@npm:1.2.2" - checksum: ca5a9886a961985b9ebcc0a5b23f2526506eced1c2c932648e5f8960db22fffcc3a77442013c6aef0b5afa8e6b9de02ae2a23ce5c967374edaf99d74fd6d6c3e - languageName: node - linkType: hard - "compressible@npm:~2.0.18": version: 2.0.18 resolution: "compressible@npm:2.0.18" @@ -3887,28 +3456,6 @@ __metadata: languageName: node linkType: hard -"cross-fetch@npm:^3.1.5": - version: 3.2.0 - resolution: "cross-fetch@npm:3.2.0" - dependencies: - node-fetch: ^2.7.0 - checksum: 8ded5ea35f705e81e569e7db244a3f96e05e95996ff51877c89b0c1ec1163c76bb5dad77d0f8fba6bb35a0abacb36403d7271dc586d8b1f636110ee7a8d959fd - languageName: node - linkType: hard - -"cross-spawn@npm:^6.0.0": - version: 6.0.6 - resolution: "cross-spawn@npm:6.0.6" - dependencies: - nice-try: ^1.0.4 - path-key: ^2.0.1 - semver: ^5.5.0 - shebang-command: ^1.2.0 - which: ^1.2.9 - checksum: a6e2e5b04a0e0f806c1df45f92cd079b65f95fbe5a7650ee1ab60318c33a6c156a8a2f8b6898f57764f7363ec599a0625e9855dfa78d52d2d73dbd32eb11c25e - languageName: node - linkType: hard - "cross-spawn@npm:^7.0.0, cross-spawn@npm:^7.0.3": version: 7.0.6 resolution: "cross-spawn@npm:7.0.6" @@ -3920,13 +3467,6 @@ __metadata: languageName: node linkType: hard -"crypt@npm:0.0.2": - version: 0.0.2 - resolution: "crypt@npm:0.0.2" - checksum: baf4c7bbe05df656ec230018af8cf7dbe8c14b36b98726939cef008d473f6fe7a4fad906cfea4062c93af516f1550a3f43ceb4d6615329612c6511378ed9fe34 - languageName: node - linkType: hard - "crypto-random-string@npm:^2.0.0": version: 2.0.0 resolution: "crypto-random-string@npm:2.0.0" @@ -4062,16 +3602,6 @@ __metadata: languageName: node linkType: hard -"default-gateway@npm:^4.2.0": - version: 4.2.0 - resolution: "default-gateway@npm:4.2.0" - dependencies: - execa: ^1.0.0 - ip-regex: ^2.1.0 - checksum: 1f5be765471689c6bab33e0c8b87363c3e2485cc1ab78904d383a8a8293a79f684da2a3303744b112503f986af4ea87d917c63a468ed913e9b0c31588c02d6a4 - languageName: node - linkType: hard - "defaults@npm:^1.0.3": version: 1.0.4 resolution: "defaults@npm:1.0.4" @@ -4088,29 +3618,6 @@ __metadata: languageName: node linkType: hard -"del@npm:^6.0.0": - version: 6.1.1 - resolution: "del@npm:6.1.1" - dependencies: - globby: ^11.0.1 - graceful-fs: ^4.2.4 - is-glob: ^4.0.1 - is-path-cwd: ^2.2.0 - is-path-inside: ^3.0.2 - p-map: ^4.0.0 - rimraf: ^3.0.2 - slash: ^3.0.0 - checksum: 563288b73b8b19a7261c47fd21a330eeab6e2acd7c6208c49790dfd369127120dd7836cdf0c1eca216b77c94782a81507eac6b4734252d3bef2795cb366996b6 - languageName: node - linkType: hard - -"delayed-stream@npm:~1.0.0": - version: 1.0.0 - resolution: "delayed-stream@npm:1.0.0" - checksum: 46fe6e83e2cb1d85ba50bd52803c68be9bd953282fa7096f51fc29edd5d67ff84ff753c51966061e5ba7cb5e47ef6d36a91924eddb7f3f3483b1c560f77a0020 - languageName: node - linkType: hard - "denodeify@npm:^1.2.1": version: 1.2.1 resolution: "denodeify@npm:1.2.1" @@ -4141,15 +3648,6 @@ __metadata: languageName: node linkType: hard -"dir-glob@npm:^3.0.1": - version: 3.0.1 - resolution: "dir-glob@npm:3.0.1" - dependencies: - path-type: ^4.0.0 - checksum: fa05e18324510d7283f55862f3161c6759a3f2f8dbce491a2fc14c8324c498286c54282c1f0e933cb930da8419b30679389499b919122952a4f8592362ef4615 - languageName: node - linkType: hard - "dom-serializer@npm:^2.0.0": version: 2.0.0 resolution: "dom-serializer@npm:2.0.0" @@ -4214,17 +3712,6 @@ __metadata: languageName: node linkType: hard -"dunder-proto@npm:^1.0.1": - version: 1.0.1 - resolution: "dunder-proto@npm:1.0.1" - dependencies: - call-bind-apply-helpers: ^1.0.1 - es-errors: ^1.3.0 - gopd: ^1.2.0 - checksum: 149207e36f07bd4941921b0ca929e3a28f1da7bd6b6ff8ff7f4e2f2e460675af4576eeba359c635723dc189b64cdd4787e0255897d5b135ccc5d15cb8685fc90 - languageName: node - linkType: hard - "eastasianwidth@npm:^0.2.0": version: 0.2.0 resolution: "eastasianwidth@npm:0.2.0" @@ -4283,15 +3770,6 @@ __metadata: languageName: node linkType: hard -"end-of-stream@npm:^1.1.0": - version: 1.4.4 - resolution: "end-of-stream@npm:1.4.4" - dependencies: - once: ^1.4.0 - checksum: 530a5a5a1e517e962854a31693dbb5c0b2fc40b46dad2a56a2deec656ca040631124f4795823acc68238147805f8b021abbe221f4afed5ef3c8e8efc2024908b - languageName: node - linkType: hard - "entities@npm:^4.2.0, entities@npm:^4.4.0": version: 4.5.0 resolution: "entities@npm:4.5.0" @@ -4352,41 +3830,6 @@ __metadata: languageName: node linkType: hard -"es-define-property@npm:^1.0.1": - version: 1.0.1 - resolution: "es-define-property@npm:1.0.1" - checksum: 0512f4e5d564021c9e3a644437b0155af2679d10d80f21adaf868e64d30efdfbd321631956f20f42d655fedb2e3a027da479fad3fa6048f768eb453a80a5f80a - languageName: node - linkType: hard - -"es-errors@npm:^1.3.0": - version: 1.3.0 - resolution: "es-errors@npm:1.3.0" - checksum: ec1414527a0ccacd7f15f4a3bc66e215f04f595ba23ca75cdae0927af099b5ec865f9f4d33e9d7e86f512f252876ac77d4281a7871531a50678132429b1271b5 - languageName: node - linkType: hard - -"es-object-atoms@npm:^1.0.0, es-object-atoms@npm:^1.1.1": - version: 1.1.1 - resolution: "es-object-atoms@npm:1.1.1" - dependencies: - es-errors: ^1.3.0 - checksum: 214d3767287b12f36d3d7267ef342bbbe1e89f899cfd67040309fc65032372a8e60201410a99a1645f2f90c1912c8c49c8668066f6bdd954bcd614dda2e3da97 - languageName: node - linkType: hard - -"es-set-tostringtag@npm:^2.1.0": - version: 2.1.0 - resolution: "es-set-tostringtag@npm:2.1.0" - dependencies: - es-errors: ^1.3.0 - get-intrinsic: ^1.2.6 - has-tostringtag: ^1.0.2 - hasown: ^2.0.2 - checksum: 789f35de4be3dc8d11fdcb91bc26af4ae3e6d602caa93299a8c45cf05d36cc5081454ae2a6d3afa09cceca214b76c046e4f8151e092e6fc7feeb5efb9e794fc6 - languageName: node - linkType: hard - "escalade@npm:^3.1.1, escalade@npm:^3.2.0": version: 3.2.0 resolution: "escalade@npm:3.2.0" @@ -4453,22 +3896,23 @@ __metadata: languageName: node linkType: hard -"execa@npm:^1.0.0": - version: 1.0.0 - resolution: "execa@npm:1.0.0" +"expo-asset@npm:~11.0.5": + version: 11.0.5 + resolution: "expo-asset@npm:11.0.5" dependencies: - cross-spawn: ^6.0.0 - get-stream: ^4.0.0 - is-stream: ^1.1.0 - npm-run-path: ^2.0.0 - p-finally: ^1.0.0 - signal-exit: ^3.0.0 - strip-eof: ^1.0.0 - checksum: ddf1342c1c7d02dd93b41364cd847640f6163350d9439071abf70bf4ceb1b9b2b2e37f54babb1d8dc1df8e0d8def32d0e81e74a2e62c3e1d70c303eb4c306bc4 + "@expo/image-utils": ^0.6.5 + expo-constants: ~17.0.8 + invariant: ^2.2.4 + md5-file: ^3.2.3 + peerDependencies: + expo: "*" + react: "*" + react-native: "*" + checksum: 7650dc032f76b0924eedaf24dee135b293e5c3258e0a9e43a6db7c93ef40ea6b6d6a47432bf80f3051f3b62e40a6ccb25e8acca820baa791d52a2e95432868bc languageName: node linkType: hard -"expo-asset@npm:^11.0.3, expo-asset@npm:~11.1.5": +"expo-asset@npm:~11.1.5": version: 11.1.5 resolution: "expo-asset@npm:11.1.5" dependencies: @@ -4482,22 +3926,6 @@ __metadata: languageName: node linkType: hard -"expo-asset@npm:~11.0.5": - version: 11.0.5 - resolution: "expo-asset@npm:11.0.5" - dependencies: - "@expo/image-utils": ^0.6.5 - expo-constants: ~17.0.8 - invariant: ^2.2.4 - md5-file: ^3.2.3 - peerDependencies: - expo: "*" - react: "*" - react-native: "*" - checksum: 7650dc032f76b0924eedaf24dee135b293e5c3258e0a9e43a6db7c93ef40ea6b6d6a47432bf80f3051f3b62e40a6ccb25e8acca820baa791d52a2e95432868bc - languageName: node - linkType: hard - "expo-brightness@npm:~13.1.4": version: 13.1.4 resolution: "expo-brightness@npm:13.1.4" @@ -4557,16 +3985,6 @@ __metadata: languageName: node linkType: hard -"expo-file-system@npm:^18.0.10, expo-file-system@npm:~18.1.9": - version: 18.1.9 - resolution: "expo-file-system@npm:18.1.9" - peerDependencies: - expo: "*" - react-native: "*" - checksum: fa8cb76ef8b76478a7c09005378962a3510536bffb6f4929924ff491ea3f4194323b1c165612b9645589dc66da9d549e206c5d1c774b07999ecc07c059b8073d - languageName: node - linkType: hard - "expo-file-system@npm:~18.0.12": version: 18.0.12 resolution: "expo-file-system@npm:18.0.12" @@ -4579,15 +3997,23 @@ __metadata: languageName: node linkType: hard -"expo-font@npm:~13.0.4": - version: 13.0.4 - resolution: "expo-font@npm:13.0.4" - dependencies: - fontfaceobserver: ^2.1.0 +"expo-file-system@npm:~18.1.10": + version: 18.1.10 + resolution: "expo-file-system@npm:18.1.10" peerDependencies: expo: "*" - react: "*" - checksum: 36fa98d333c97a9a309f0ffa45827616167162caaaca6873f04d6e3d658c669da9e894fadd582b9bcc569f3b5b2043553ca204e4333d7496ad2e5843f0373b09 + react-native: "*" + checksum: 2dc26898cc13e1933fec417e587c81fd87139f617afc266d82f47189391b83c345c6e7a0e097448fcfcd6bf7039da6aae263154f75d2944e611738cd126c386c + languageName: node + linkType: hard + +"expo-file-system@npm:~18.1.9": + version: 18.1.9 + resolution: "expo-file-system@npm:18.1.9" + peerDependencies: + expo: "*" + react-native: "*" + checksum: fa8cb76ef8b76478a7c09005378962a3510536bffb6f4929924ff491ea3f4194323b1c165612b9645589dc66da9d549e206c5d1c774b07999ecc07c059b8073d languageName: node linkType: hard @@ -4603,16 +4029,6 @@ __metadata: languageName: node linkType: hard -"expo-keep-awake@npm:~14.0.3": - version: 14.0.3 - resolution: "expo-keep-awake@npm:14.0.3" - peerDependencies: - expo: "*" - react: "*" - checksum: 1f8c4c4fbc6030b4ea55fd51b6bb74ba926c71ab3c5350445b065d1433188553b67c64114230240055788df918c96d2d925d9987dcd9fc4045e45362adcbb110 - languageName: node - linkType: hard - "expo-keep-awake@npm:~14.1.4": version: 14.1.4 resolution: "expo-keep-awake@npm:14.1.4" @@ -4623,24 +4039,6 @@ __metadata: languageName: node linkType: hard -"expo-modules-autolinking@npm:2.0.8": - version: 2.0.8 - resolution: "expo-modules-autolinking@npm:2.0.8" - dependencies: - "@expo/spawn-async": ^1.7.2 - chalk: ^4.1.0 - commander: ^7.2.0 - fast-glob: ^3.2.5 - find-up: ^5.0.0 - fs-extra: ^9.1.0 - require-from-string: ^2.0.2 - resolve-from: ^5.0.0 - bin: - expo-modules-autolinking: bin/expo-modules-autolinking.js - checksum: 1e706d40163e0d3c239641c6d4a846c8006c0367007006cff1eb26a571e605d5fa5ce49c995b9118516d82c819be0e2e2849c2ae63df9b2921bf23bc9a4c2939 - languageName: node - linkType: hard - "expo-modules-autolinking@npm:2.1.10": version: 2.1.10 resolution: "expo-modules-autolinking@npm:2.1.10" @@ -4658,21 +4056,30 @@ __metadata: languageName: node linkType: hard -"expo-modules-core@npm:2.2.3": - version: 2.2.3 - resolution: "expo-modules-core@npm:2.2.3" +"expo-modules-core@npm:2.3.12": + version: 2.3.12 + resolution: "expo-modules-core@npm:2.3.12" dependencies: invariant: ^2.2.4 - checksum: 7b2952f1220b55eb03f395d1549525edeb5bff7bf805257d9652ea4ef85ea71e34ad13b5971f1b559e7aa080f41130846b24cbe3d754660c08196c3ce899143b + checksum: 37f127b3ad31e78b8c81883a6c4f6142a3a46a005e28edf7a5db207f35221c597b49cd2c54c92a966bbf89b06dbbec5668e7deb4be558c5523ba379dc19a6901 languageName: node linkType: hard -"expo-modules-core@npm:2.3.12": - version: 2.3.12 - resolution: "expo-modules-core@npm:2.3.12" +"expo-modules-core@npm:2.3.13": + version: 2.3.13 + resolution: "expo-modules-core@npm:2.3.13" dependencies: invariant: ^2.2.4 - checksum: 37f127b3ad31e78b8c81883a6c4f6142a3a46a005e28edf7a5db207f35221c597b49cd2c54c92a966bbf89b06dbbec5668e7deb4be558c5523ba379dc19a6901 + checksum: 08bad8ffed47c72ec0ceae79e8d9ebbc1df6d6d4ade65f285b2370198821334330c961ca02eb3316ac4f96191753b96907aca6a0804b5be8f9653eef71452710 + languageName: node + linkType: hard + +"expo-speech@npm:^13.0.1": + version: 13.1.4 + resolution: "expo-speech@npm:13.1.4" + peerDependencies: + expo: "*" + checksum: ea6677d22b3678bae89a03a69699b1c66690846c1427dbc41d7b5d3eb5ae45821996d79a58ef3ee760fe44e23d588262500a476c0dbdcee2ea6f24dbc31cb132 languageName: node linkType: hard @@ -4689,27 +4096,26 @@ __metadata: languageName: node linkType: hard -"expo@npm:^52.0.37": - version: 52.0.46 - resolution: "expo@npm:52.0.46" +"expo@npm:^53.0.7": + version: 53.0.9 + resolution: "expo@npm:53.0.9" dependencies: "@babel/runtime": ^7.20.0 - "@expo/cli": 0.22.26 - "@expo/config": ~10.0.11 - "@expo/config-plugins": ~9.0.17 - "@expo/fingerprint": 0.11.11 - "@expo/metro-config": 0.19.12 + "@expo/cli": 0.24.13 + "@expo/config": ~11.0.10 + "@expo/config-plugins": ~10.0.2 + "@expo/fingerprint": 0.12.4 + "@expo/metro-config": 0.20.14 "@expo/vector-icons": ^14.0.0 - babel-preset-expo: ~12.0.11 - expo-asset: ~11.0.5 - expo-constants: ~17.0.8 - expo-file-system: ~18.0.12 - expo-font: ~13.0.4 - expo-keep-awake: ~14.0.3 - expo-modules-autolinking: 2.0.8 - expo-modules-core: 2.2.3 - fbemitter: ^3.0.0 - web-streams-polyfill: ^3.3.2 + babel-preset-expo: ~13.1.11 + expo-asset: ~11.1.5 + expo-constants: ~17.1.6 + expo-file-system: ~18.1.10 + expo-font: ~13.3.1 + expo-keep-awake: ~14.1.4 + expo-modules-autolinking: 2.1.10 + expo-modules-core: 2.3.13 + react-native-edge-to-edge: 1.6.0 whatwg-url-without-unicode: 8.0.0-3 peerDependencies: "@expo/dom-webview": "*" @@ -4728,7 +4134,7 @@ __metadata: expo: bin/cli expo-modules-autolinking: bin/autolinking fingerprint: bin/fingerprint - checksum: 603b4fa89edf9c2aaf8741818bdd5ca46195a461093ecb2c1855164ba9799d2a590a1424f2e11ae7d97f2f8fe64928516a84b8c8ecfbe5a1dad09a5c0edca83e + checksum: 5a6e79cf95c521bca4e06d7612595704ac24da118ec48700d1ee287c4b52aa75764bda2842d75bdd01e985917e4af8575059d5bc7e13683603bd47abb268b309 languageName: node linkType: hard @@ -4781,19 +4187,6 @@ __metadata: languageName: node linkType: hard -"fast-glob@npm:^3.2.5, fast-glob@npm:^3.2.9, fast-glob@npm:^3.3.2": - version: 3.3.3 - resolution: "fast-glob@npm:3.3.3" - dependencies: - "@nodelib/fs.stat": ^2.0.2 - "@nodelib/fs.walk": ^1.2.3 - glob-parent: ^5.1.2 - merge2: ^1.3.0 - micromatch: ^4.0.8 - checksum: 0704d7b85c0305fd2cef37777337dfa26230fdd072dce9fb5c82a4b03156f3ffb8ed3e636033e65d45d2a5805a4e475825369a27404c0307f2db0c8eb3366fbd - languageName: node - linkType: hard - "fast-json-stable-stringify@npm:^2.1.0": version: 2.1.0 resolution: "fast-json-stable-stringify@npm:2.1.0" @@ -4801,15 +4194,6 @@ __metadata: languageName: node linkType: hard -"fastq@npm:^1.6.0": - version: 1.19.1 - resolution: "fastq@npm:1.19.1" - dependencies: - reusify: ^1.0.4 - checksum: 7691d1794fb84ad0ec2a185f10e00f0e1713b894e2c9c4d42f0bc0ba5f8c00e6e655a202074ca0b91b9c3d977aab7c30c41a8dc069fb5368576ac0054870a0e6 - languageName: node - linkType: hard - "fb-watchman@npm:^2.0.0": version: 2.0.2 resolution: "fb-watchman@npm:2.0.2" @@ -4819,44 +4203,6 @@ __metadata: languageName: node linkType: hard -"fbemitter@npm:^3.0.0": - version: 3.0.0 - resolution: "fbemitter@npm:3.0.0" - dependencies: - fbjs: ^3.0.0 - checksum: 069690b8cdff3521ade3c9beb92ba0a38d818a86ef36dff8690e66749aef58809db4ac0d6938eb1cacea2dbef5f2a508952d455669590264cdc146bbe839f605 - languageName: node - linkType: hard - -"fbjs-css-vars@npm:^1.0.0": - version: 1.0.2 - resolution: "fbjs-css-vars@npm:1.0.2" - checksum: 72baf6d22c45b75109118b4daecb6c8016d4c83c8c0f23f683f22e9d7c21f32fff6201d288df46eb561e3c7d4bb4489b8ad140b7f56444c453ba407e8bd28511 - languageName: node - linkType: hard - -"fbjs@npm:^3.0.0": - version: 3.0.5 - resolution: "fbjs@npm:3.0.5" - dependencies: - cross-fetch: ^3.1.5 - fbjs-css-vars: ^1.0.0 - loose-envify: ^1.0.0 - object-assign: ^4.1.0 - promise: ^7.1.1 - setimmediate: ^1.0.5 - ua-parser-js: ^1.0.35 - checksum: e609b5b64686bc96495a5c67728ed9b2710b9b3d695c5759c5f5e47c9483d1c323543ac777a86459e3694efc5712c6ce7212e944feb19752867d699568bb0e54 - languageName: node - linkType: hard - -"fetch-retry@npm:^4.1.1": - version: 4.1.1 - resolution: "fetch-retry@npm:4.1.1" - checksum: a06b6a0201efeb5082794713bcdc8dd2c8f1fd4ad5660de860b9c4e51738aa369be58ba7cfa67aa7aa4a3bf9d9b5a4cd2d2fdea88868856483fb81bacd70455b - languageName: node - linkType: hard - "fill-range@npm:^7.1.1": version: 7.1.1 resolution: "fill-range@npm:7.1.1" @@ -4952,18 +4298,6 @@ __metadata: languageName: node linkType: hard -"form-data@npm:^3.0.1": - version: 3.0.3 - resolution: "form-data@npm:3.0.3" - dependencies: - asynckit: ^0.4.0 - combined-stream: ^1.0.8 - es-set-tostringtag: ^2.1.0 - mime-types: ^2.1.35 - checksum: e79641abb58b3d7230816ed00645c2732cb64aa44172221644619238106556584aafd908bcc0d728fb06ef6a0d88261e72f4e01111bae3da6d2d7a429e4e1fd2 - languageName: node - linkType: hard - "freeport-async@npm:^2.0.0": version: 2.0.0 resolution: "freeport-async@npm:2.0.0" @@ -4990,38 +4324,6 @@ __metadata: languageName: node linkType: hard -"fs-extra@npm:^9.0.0, fs-extra@npm:^9.1.0": - version: 9.1.0 - resolution: "fs-extra@npm:9.1.0" - dependencies: - at-least-node: ^1.0.0 - graceful-fs: ^4.2.0 - jsonfile: ^6.0.1 - universalify: ^2.0.0 - checksum: ba71ba32e0faa74ab931b7a0031d1523c66a73e225de7426e275e238e312d07313d2da2d33e34a52aa406c8763ade5712eb3ec9ba4d9edce652bcacdc29e6b20 - languageName: node - linkType: hard - -"fs-extra@npm:~8.1.0": - version: 8.1.0 - resolution: "fs-extra@npm:8.1.0" - dependencies: - graceful-fs: ^4.2.0 - jsonfile: ^4.0.0 - universalify: ^0.1.0 - checksum: bf44f0e6cea59d5ce071bba4c43ca76d216f89e402dc6285c128abc0902e9b8525135aa808adad72c9d5d218e9f4bcc63962815529ff2f684ad532172a284880 - languageName: node - linkType: hard - -"fs-minipass@npm:^2.0.0": - version: 2.1.0 - resolution: "fs-minipass@npm:2.1.0" - dependencies: - minipass: ^3.0.0 - checksum: 1b8d128dae2ac6cc94230cc5ead341ba3e0efaef82dab46a33d171c044caaa6ca001364178d42069b2809c35a1c3c35079a32107c770e9ffab3901b59af8c8b1 - languageName: node - linkType: hard - "fs-minipass@npm:^3.0.0": version: 3.0.3 resolution: "fs-minipass@npm:3.0.3" @@ -5078,24 +4380,6 @@ __metadata: languageName: node linkType: hard -"get-intrinsic@npm:^1.2.6": - version: 1.3.0 - resolution: "get-intrinsic@npm:1.3.0" - dependencies: - call-bind-apply-helpers: ^1.0.2 - es-define-property: ^1.0.1 - es-errors: ^1.3.0 - es-object-atoms: ^1.1.1 - function-bind: ^1.1.2 - get-proto: ^1.0.1 - gopd: ^1.2.0 - has-symbols: ^1.1.0 - hasown: ^2.0.2 - math-intrinsics: ^1.1.0 - checksum: 301008e4482bb9a9cb49e132b88fee093bff373b4e6def8ba219b1e96b60158a6084f273ef5cafe832e42cd93462f4accb46a618d35fe59a2b507f2388c5b79d - languageName: node - linkType: hard - "get-package-type@npm:^0.1.0": version: 0.1.0 resolution: "get-package-type@npm:0.1.0" @@ -5104,28 +4388,9 @@ __metadata: linkType: hard "get-port@npm:^3.2.0": - version: 3.2.0 - resolution: "get-port@npm:3.2.0" - checksum: 31f530326569683ac4b7452eb7573c40e9dbe52aec14d80745c35475261e6389160da153d5b8ae911150b4ce99003472b30c69ba5be0cedeaa7865b95542d168 - languageName: node - linkType: hard - -"get-proto@npm:^1.0.1": - version: 1.0.1 - resolution: "get-proto@npm:1.0.1" - dependencies: - dunder-proto: ^1.0.1 - es-object-atoms: ^1.0.0 - checksum: 4fc96afdb58ced9a67558698b91433e6b037aaa6f1493af77498d7c85b141382cf223c0e5946f334fb328ee85dfe6edd06d218eaf09556f4bc4ec6005d7f5f7b - languageName: node - linkType: hard - -"get-stream@npm:^4.0.0": - version: 4.1.0 - resolution: "get-stream@npm:4.1.0" - dependencies: - pump: ^3.0.0 - checksum: 443e1914170c15bd52ff8ea6eff6dfc6d712b031303e36302d2778e3de2506af9ee964d6124010f7818736dcfde05c04ba7ca6cc26883106e084357a17ae7d73 + version: 3.2.0 + resolution: "get-port@npm:3.2.0" + checksum: 31f530326569683ac4b7452eb7573c40e9dbe52aec14d80745c35475261e6389160da153d5b8ae911150b4ce99003472b30c69ba5be0cedeaa7865b95542d168 languageName: node linkType: hard @@ -5136,15 +4401,6 @@ __metadata: languageName: node linkType: hard -"glob-parent@npm:^5.1.2": - version: 5.1.2 - resolution: "glob-parent@npm:5.1.2" - dependencies: - is-glob: ^4.0.1 - checksum: f4f2bfe2425296e8a47e36864e4f42be38a996db40420fe434565e4480e3322f18eb37589617a98640c5dc8fdec1a387007ee18dbb1f3f5553409c34d17f425e - languageName: node - linkType: hard - "glob@npm:^10.2.2, glob@npm:^10.3.10, glob@npm:^10.3.7, glob@npm:^10.4.2": version: 10.4.5 resolution: "glob@npm:10.4.5" @@ -5182,27 +4438,6 @@ __metadata: languageName: node linkType: hard -"globby@npm:^11.0.1": - version: 11.1.0 - resolution: "globby@npm:11.1.0" - dependencies: - array-union: ^2.1.0 - dir-glob: ^3.0.1 - fast-glob: ^3.2.9 - ignore: ^5.2.0 - merge2: ^1.4.1 - slash: ^3.0.0 - checksum: b4be8885e0cfa018fc783792942d53926c35c50b3aefd3fdcfb9d22c627639dc26bd2327a40a0b74b074100ce95bb7187bfeae2f236856aa3de183af7a02aea6 - languageName: node - linkType: hard - -"gopd@npm:^1.2.0": - version: 1.2.0 - resolution: "gopd@npm:1.2.0" - checksum: cc6d8e655e360955bdccaca51a12a474268f95bb793fc3e1f2bdadb075f28bfd1fd988dab872daf77a61d78cbaf13744bc8727a17cfb1d150d76047d805375f3 - languageName: node - linkType: hard - "graceful-fs@npm:^4.1.11, graceful-fs@npm:^4.1.6, graceful-fs@npm:^4.2.0, graceful-fs@npm:^4.2.4, graceful-fs@npm:^4.2.6, graceful-fs@npm:^4.2.9": version: 4.2.11 resolution: "graceful-fs@npm:4.2.11" @@ -5224,22 +4459,6 @@ __metadata: languageName: node linkType: hard -"has-symbols@npm:^1.0.3, has-symbols@npm:^1.1.0": - version: 1.1.0 - resolution: "has-symbols@npm:1.1.0" - checksum: b2316c7302a0e8ba3aaba215f834e96c22c86f192e7310bdf689dd0e6999510c89b00fbc5742571507cebf25764d68c988b3a0da217369a73596191ac0ce694b - languageName: node - linkType: hard - -"has-tostringtag@npm:^1.0.2": - version: 1.0.2 - resolution: "has-tostringtag@npm:1.0.2" - dependencies: - has-symbols: ^1.0.3 - checksum: 999d60bb753ad714356b2c6c87b7fb74f32463b8426e159397da4bde5bca7e598ab1073f4d8d4deafac297f2eb311484cd177af242776bf05f0d11565680468d - languageName: node - linkType: hard - "hasown@npm:^2.0.2": version: 2.0.2 resolution: "hasown@npm:2.0.2" @@ -5378,13 +4597,6 @@ __metadata: languageName: node linkType: hard -"ignore@npm:^5.2.0": - version: 5.3.2 - resolution: "ignore@npm:5.3.2" - checksum: 2acfd32a573260ea522ea0bfeff880af426d68f6831f973129e2ba7363f422923cf53aab62f8369cbf4667c7b25b6f8a3761b34ecdb284ea18e87a5262a865be - languageName: node - linkType: hard - "image-size@npm:^1.0.2": version: 1.1.1 resolution: "image-size@npm:1.1.1" @@ -5423,13 +4635,6 @@ __metadata: languageName: node linkType: hard -"indent-string@npm:^4.0.0": - version: 4.0.0 - resolution: "indent-string@npm:4.0.0" - checksum: 824cfb9929d031dabf059bebfe08cf3137365e112019086ed3dcff6a0a7b698cb80cf67ccccde0e25b9e2d7527aa6cc1fed1ac490c752162496caba3e6699612 - languageName: node - linkType: hard - "inflight@npm:^1.0.4": version: 1.0.6 resolution: "inflight@npm:1.0.6" @@ -5454,16 +4659,6 @@ __metadata: languageName: node linkType: hard -"internal-ip@npm:^4.3.0": - version: 4.3.0 - resolution: "internal-ip@npm:4.3.0" - dependencies: - default-gateway: ^4.2.0 - ipaddr.js: ^1.9.0 - checksum: c970433c84d9a6b46e2c9f5ab7785d3105b856d0a566891bf919241b5a884c5c1c9bf8e915aebb822a86c14b1b6867e58c1eaf5cd49eb023368083069d1a4a9a - languageName: node - linkType: hard - "invariant@npm:^2.2.4": version: 2.2.4 resolution: "invariant@npm:2.2.4" @@ -5483,20 +4678,6 @@ __metadata: languageName: node linkType: hard -"ip-regex@npm:^2.1.0": - version: 2.1.0 - resolution: "ip-regex@npm:2.1.0" - checksum: 331d95052aa53ce245745ea0fc3a6a1e2e3c8d6da65fa8ea52bf73768c1b22a9ac50629d1d2b08c04e7b3ac4c21b536693c149ce2c2615ee4796030e5b3e3cba - languageName: node - linkType: hard - -"ipaddr.js@npm:^1.9.0": - version: 1.9.1 - resolution: "ipaddr.js@npm:1.9.1" - checksum: f88d3825981486f5a1942414c8d77dd6674dd71c065adcfa46f578d677edcb99fda25af42675cb59db492fdf427b34a5abfcde3982da11a8fd83a500b41cfe77 - languageName: node - linkType: hard - "is-arrayish@npm:^0.2.1": version: 0.2.1 resolution: "is-arrayish@npm:0.2.1" @@ -5504,13 +4685,6 @@ __metadata: languageName: node linkType: hard -"is-buffer@npm:~1.1.6": - version: 1.1.6 - resolution: "is-buffer@npm:1.1.6" - checksum: 4a186d995d8bbf9153b4bd9ff9fd04ae75068fe695d29025d25e592d9488911eeece84eefbd8fa41b8ddcc0711058a71d4c466dcf6f1f6e1d83830052d8ca707 - languageName: node - linkType: hard - "is-core-module@npm:^2.16.0": version: 2.16.0 resolution: "is-core-module@npm:2.16.0" @@ -5536,13 +4710,6 @@ __metadata: languageName: node linkType: hard -"is-extglob@npm:^2.1.1": - version: 2.1.1 - resolution: "is-extglob@npm:2.1.1" - checksum: df033653d06d0eb567461e58a7a8c9f940bd8c22274b94bf7671ab36df5719791aae15eef6d83bbb5e23283967f2f984b8914559d4449efda578c775c4be6f85 - languageName: node - linkType: hard - "is-fullwidth-code-point@npm:^3.0.0": version: 3.0.0 resolution: "is-fullwidth-code-point@npm:3.0.0" @@ -5550,15 +4717,6 @@ __metadata: languageName: node linkType: hard -"is-glob@npm:^4.0.1": - version: 4.0.3 - resolution: "is-glob@npm:4.0.3" - dependencies: - is-extglob: ^2.1.1 - checksum: d381c1319fcb69d341cc6e6c7cd588e17cd94722d9a32dbd60660b993c4fb7d0f19438674e68dfec686d09b7c73139c9166b47597f846af387450224a8101ab4 - languageName: node - linkType: hard - "is-number@npm:^7.0.0": version: 7.0.0 resolution: "is-number@npm:7.0.0" @@ -5566,20 +4724,6 @@ __metadata: languageName: node linkType: hard -"is-path-cwd@npm:^2.2.0": - version: 2.2.0 - resolution: "is-path-cwd@npm:2.2.0" - checksum: 46a840921bb8cc0dc7b5b423a14220e7db338072a4495743a8230533ce78812dc152548c86f4b828411fe98c5451959f07cf841c6a19f611e46600bd699e8048 - languageName: node - linkType: hard - -"is-path-inside@npm:^3.0.2": - version: 3.0.3 - resolution: "is-path-inside@npm:3.0.3" - checksum: abd50f06186a052b349c15e55b182326f1936c89a78bf6c8f2b707412517c097ce04bc49a0ca221787bc44e1049f51f09a2ffb63d22899051988d3a618ba13e9 - languageName: node - linkType: hard - "is-plain-object@npm:^2.0.4": version: 2.0.4 resolution: "is-plain-object@npm:2.0.4" @@ -5589,20 +4733,6 @@ __metadata: languageName: node linkType: hard -"is-stream@npm:^1.1.0": - version: 1.1.0 - resolution: "is-stream@npm:1.1.0" - checksum: 063c6bec9d5647aa6d42108d4c59723d2bd4ae42135a2d4db6eadbd49b7ea05b750fd69d279e5c7c45cf9da753ad2c00d8978be354d65aa9f6bb434969c6a2ae - languageName: node - linkType: hard - -"is-stream@npm:^2.0.0": - version: 2.0.1 - resolution: "is-stream@npm:2.0.1" - checksum: b8e05ccdf96ac330ea83c12450304d4a591f9958c11fd17bed240af8d5ffe08aedafa4c0f4cfccd4d28dc9d4d129daca1023633d5c11601a6cbc77521f6fae66 - languageName: node - linkType: hard - "is-wsl@npm:^2.1.1, is-wsl@npm:^2.2.0": version: 2.2.0 resolution: "is-wsl@npm:2.2.0" @@ -5799,13 +4929,6 @@ __metadata: languageName: node linkType: hard -"join-component@npm:^1.1.0": - version: 1.1.0 - resolution: "join-component@npm:1.1.0" - checksum: b904c2f98549e4195022caca3a7dc837f9706c670ff333f3d617f2aed23bce2841322a999734683b6ab8e202568ad810c11ff79b58a64df66888153f04750239 - languageName: node - linkType: hard - "js-tokens@npm:^3.0.0 || ^4.0.0, js-tokens@npm:^4.0.0": version: 4.0.0 resolution: "js-tokens@npm:4.0.0" @@ -5922,18 +5045,6 @@ __metadata: languageName: node linkType: hard -"jsonfile@npm:^4.0.0": - version: 4.0.0 - resolution: "jsonfile@npm:4.0.0" - dependencies: - graceful-fs: ^4.1.6 - dependenciesMeta: - graceful-fs: - optional: true - checksum: 6447d6224f0d31623eef9b51185af03ac328a7553efcee30fa423d98a9e276ca08db87d71e17f2310b0263fd3ffa6c2a90a6308367f661dc21580f9469897c9e - languageName: node - linkType: hard - "jsonfile@npm:^6.0.1": version: 6.1.0 resolution: "jsonfile@npm:6.1.0" @@ -5970,6 +5081,15 @@ __metadata: languageName: node linkType: hard +"lan-network@npm:^0.1.6": + version: 0.1.6 + resolution: "lan-network@npm:0.1.6" + bin: + lan-network: dist/lan-network-cli.js + checksum: b041675765ed06c1bc9ba82da2c69bfe5ce2382e03b6800ab1c79390740118eeb6f78efc1ee3b692a9f3b6f3447b1267561a7569d01da5be8c96fc7745ede4e7 + languageName: node + linkType: hard + "leven@npm:^3.1.0": version: 3.1.0 resolution: "leven@npm:3.1.0" @@ -6124,11 +5244,12 @@ __metadata: expo-brightness: ~13.1.4 expo-calendar: ~14.1.4 expo-font: ~13.3.1 + expo-speech: ^13.0.1 expo-status-bar: ~2.2.3 metro-config: ^0.81.0 react: 19.0.0 react-native: ^0.79.2 - react-native-executorch: ^0.3.2 + react-native-executorch: /Users/kopcion/swm-ai/react-native-executorch/react-native-executorch-0.3.1-stt-7.tgz react-native-loading-spinner-overlay: ^3.0.1 react-native-markdown-display: ^7.0.2 react-native-reanimated: ^3.17.5 @@ -6294,13 +5415,6 @@ __metadata: languageName: node linkType: hard -"math-intrinsics@npm:^1.1.0": - version: 1.1.0 - resolution: "math-intrinsics@npm:1.1.0" - checksum: 0e513b29d120f478c85a70f49da0b8b19bc638975eca466f2eeae0071f3ad00454c621bf66e16dd435896c208e719fc91ad79bbfba4e400fe0b372e7c1c9c9a2 - languageName: node - linkType: hard - "md5-file@npm:^3.2.3": version: 3.2.3 resolution: "md5-file@npm:3.2.3" @@ -6312,17 +5426,6 @@ __metadata: languageName: node linkType: hard -"md5@npm:^2.2.1": - version: 2.3.0 - resolution: "md5@npm:2.3.0" - dependencies: - charenc: 0.0.2 - crypt: 0.0.2 - is-buffer: ~1.1.6 - checksum: a63cacf4018dc9dee08c36e6f924a64ced735b37826116c905717c41cebeb41a522f7a526ba6ad578f9c80f02cb365033ccd67fe186ffbcc1a1faeb75daa9b6e - languageName: node - linkType: hard - "mdn-data@npm:2.0.14": version: 2.0.14 resolution: "mdn-data@npm:2.0.14" @@ -6365,13 +5468,6 @@ __metadata: languageName: node linkType: hard -"merge2@npm:^1.3.0, merge2@npm:^1.4.1": - version: 1.4.1 - resolution: "merge2@npm:1.4.1" - checksum: 7268db63ed5169466540b6fb947aec313200bcf6d40c5ab722c22e242f651994619bcd85601602972d3c85bd2cc45a358a4c61937e9f11a061919a1da569b0c2 - languageName: node - linkType: hard - "metro-babel-transformer@npm:0.81.0": version: 0.81.0 resolution: "metro-babel-transformer@npm:0.81.0" @@ -6830,7 +5926,7 @@ __metadata: languageName: node linkType: hard -"micromatch@npm:^4.0.4, micromatch@npm:^4.0.8": +"micromatch@npm:^4.0.4": version: 4.0.8 resolution: "micromatch@npm:4.0.8" dependencies: @@ -6854,7 +5950,7 @@ __metadata: languageName: node linkType: hard -"mime-types@npm:^2.1.27, mime-types@npm:^2.1.35, mime-types@npm:~2.1.34": +"mime-types@npm:^2.1.27, mime-types@npm:~2.1.34": version: 2.1.35 resolution: "mime-types@npm:2.1.35" dependencies: @@ -6964,13 +6060,6 @@ __metadata: languageName: node linkType: hard -"minipass@npm:^5.0.0": - version: 5.0.0 - resolution: "minipass@npm:5.0.0" - checksum: 425dab288738853fded43da3314a0b5c035844d6f3097a8e3b5b29b328da8f3c1af6fc70618b32c29ff906284cf6406b6841376f21caaadd0793c1d5a6a620ea - languageName: node - linkType: hard - "minipass@npm:^5.0.0 || ^6.0.2 || ^7.0.0, minipass@npm:^7.0.2, minipass@npm:^7.0.3, minipass@npm:^7.0.4, minipass@npm:^7.1.2": version: 7.1.2 resolution: "minipass@npm:7.1.2" @@ -6978,16 +6067,6 @@ __metadata: languageName: node linkType: hard -"minizlib@npm:^2.1.1": - version: 2.1.2 - resolution: "minizlib@npm:2.1.2" - dependencies: - minipass: ^3.0.0 - yallist: ^4.0.0 - checksum: f1fdeac0b07cf8f30fcf12f4b586795b97be856edea22b5e9072707be51fc95d41487faec3f265b42973a304fe3a64acd91a44a3826a963e37b37bafde0212c3 - languageName: node - linkType: hard - "minizlib@npm:^3.0.1": version: 3.0.1 resolution: "minizlib@npm:3.0.1" @@ -7009,7 +6088,7 @@ __metadata: languageName: node linkType: hard -"mkdirp@npm:^1.0.3, mkdirp@npm:^1.0.4": +"mkdirp@npm:^1.0.4": version: 1.0.4 resolution: "mkdirp@npm:1.0.4" bin: @@ -7096,13 +6175,6 @@ __metadata: languageName: node linkType: hard -"nice-try@npm:^1.0.4": - version: 1.0.5 - resolution: "nice-try@npm:1.0.5" - checksum: 0b4af3b5bb5d86c289f7a026303d192a7eb4417231fe47245c460baeabae7277bcd8fd9c728fb6bd62c30b3e15cd6620373e2cf33353b095d8b403d3e8a15aff - languageName: node - linkType: hard - "no-case@npm:^3.0.4": version: 3.0.4 resolution: "no-case@npm:3.0.4" @@ -7129,21 +6201,7 @@ __metadata: languageName: node linkType: hard -"node-fetch@npm:^2.6.1, node-fetch@npm:^2.7.0": - version: 2.7.0 - resolution: "node-fetch@npm:2.7.0" - dependencies: - whatwg-url: ^5.0.0 - peerDependencies: - encoding: ^0.1.0 - peerDependenciesMeta: - encoding: - optional: true - checksum: d76d2f5edb451a3f05b15115ec89fc6be39de37c6089f1b6368df03b91e1633fd379a7e01b7ab05089a25034b2023d959b47e59759cb38d88341b2459e89d6e5 - languageName: node - linkType: hard - -"node-forge@npm:^1, node-forge@npm:^1.2.1, node-forge@npm:^1.3.1": +"node-forge@npm:^1.2.1, node-forge@npm:^1.3.1": version: 1.3.1 resolution: "node-forge@npm:1.3.1" checksum: 08fb072d3d670599c89a1704b3e9c649ff1b998256737f0e06fbd1a5bf41cae4457ccaee32d95052d80bbafd9ffe01284e078c8071f0267dc9744e51c5ed42a9 @@ -7214,15 +6272,6 @@ __metadata: languageName: node linkType: hard -"npm-run-path@npm:^2.0.0": - version: 2.0.2 - resolution: "npm-run-path@npm:2.0.2" - dependencies: - path-key: ^2.0.0 - checksum: acd5ad81648ba4588ba5a8effb1d98d2b339d31be16826a118d50f182a134ac523172101b82eab1d01cb4c2ba358e857d54cfafd8163a1ffe7bd52100b741125 - languageName: node - linkType: hard - "nth-check@npm:^2.0.1": version: 2.1.1 resolution: "nth-check@npm:2.1.1" @@ -7257,7 +6306,7 @@ __metadata: languageName: node linkType: hard -"object-assign@npm:^4.0.1, object-assign@npm:^4.1.0, object-assign@npm:^4.1.1": +"object-assign@npm:^4.0.1, object-assign@npm:^4.1.1": version: 4.1.1 resolution: "object-assign@npm:4.1.1" checksum: fcc6e4ea8c7fe48abfbb552578b1c53e0d194086e2e6bbbf59e0a536381a292f39943c6e9628af05b5528aa5e3318bb30d6b2e53cadaf5b8fe9e12c4b69af23f @@ -7289,7 +6338,7 @@ __metadata: languageName: node linkType: hard -"once@npm:^1.3.0, once@npm:^1.3.1, once@npm:^1.4.0": +"once@npm:^1.3.0": version: 1.4.0 resolution: "once@npm:1.4.0" dependencies: @@ -7349,13 +6398,6 @@ __metadata: languageName: node linkType: hard -"p-finally@npm:^1.0.0": - version: 1.0.0 - resolution: "p-finally@npm:1.0.0" - checksum: 93a654c53dc805dd5b5891bab16eb0ea46db8f66c4bfd99336ae929323b1af2b70a8b0654f8f1eae924b2b73d037031366d645f1fd18b3d30cbd15950cc4b1d4 - languageName: node - linkType: hard - "p-limit@npm:^2.0.0, p-limit@npm:^2.2.0": version: 2.3.0 resolution: "p-limit@npm:2.3.0" @@ -7401,15 +6443,6 @@ __metadata: languageName: node linkType: hard -"p-map@npm:^4.0.0": - version: 4.0.0 - resolution: "p-map@npm:4.0.0" - dependencies: - aggregate-error: ^3.0.0 - checksum: cb0ab21ec0f32ddffd31dfc250e3afa61e103ef43d957cc45497afe37513634589316de4eb88abdfd969fe6410c22c0b93ab24328833b8eb1ccc087fc0442a1c - languageName: node - linkType: hard - "p-map@npm:^7.0.2": version: 7.0.3 resolution: "p-map@npm:7.0.3" @@ -7516,13 +6549,6 @@ __metadata: languageName: node linkType: hard -"path-key@npm:^2.0.0, path-key@npm:^2.0.1": - version: 2.0.1 - resolution: "path-key@npm:2.0.1" - checksum: f7ab0ad42fe3fb8c7f11d0c4f849871e28fbd8e1add65c370e422512fc5887097b9cf34d09c1747d45c942a8c1e26468d6356e2df3f740bf177ab8ca7301ebfd - languageName: node - linkType: hard - "path-key@npm:^3.1.0": version: 3.1.1 resolution: "path-key@npm:3.1.1" @@ -7690,15 +6716,6 @@ __metadata: languageName: node linkType: hard -"promise@npm:^7.1.1": - version: 7.3.1 - resolution: "promise@npm:7.3.1" - dependencies: - asap: ~2.0.3 - checksum: 475bb069130179fbd27ed2ab45f26d8862376a137a57314cf53310bdd85cc986a826fd585829be97ebc0aaf10e9d8e68be1bfe5a4a0364144b1f9eedfa940cf1 - languageName: node - linkType: hard - "promise@npm:^8.3.0": version: 8.3.0 resolution: "promise@npm:8.3.0" @@ -7729,16 +6746,6 @@ __metadata: languageName: node linkType: hard -"pump@npm:^3.0.0": - version: 3.0.2 - resolution: "pump@npm:3.0.2" - dependencies: - end-of-stream: ^1.1.0 - once: ^1.3.1 - checksum: e0c4216874b96bd25ddf31a0b61a5613e26cc7afa32379217cf39d3915b0509def3565f5f6968fafdad2894c8bbdbd67d340e84f3634b2a29b950cffb6442d9f - languageName: node - linkType: hard - "punycode@npm:^2.1.1": version: 2.3.1 resolution: "punycode@npm:2.3.1" @@ -7755,13 +6762,6 @@ __metadata: languageName: node linkType: hard -"queue-microtask@npm:^1.2.2": - version: 1.2.3 - resolution: "queue-microtask@npm:1.2.3" - checksum: b676f8c040cdc5b12723ad2f91414d267605b26419d5c821ff03befa817ddd10e238d22b25d604920340fd73efd8ba795465a0377c4adf45a4a41e4234e42dc4 - languageName: node - linkType: hard - "queue@npm:6.0.2": version: 6.0.2 resolution: "queue@npm:6.0.2" @@ -7826,18 +6826,19 @@ __metadata: languageName: node linkType: hard -"react-native-executorch@npm:^0.3.2": - version: 0.3.2 - resolution: "react-native-executorch@npm:0.3.2" +"react-native-executorch@file:/Users/kopcion/swm-ai/react-native-executorch/react-native-executorch-0.3.1-stt-7.tgz::locator=llm%40workspace%3A.": + version: 0.3.1-stt-7 + resolution: "react-native-executorch@file:/Users/kopcion/swm-ai/react-native-executorch/react-native-executorch-0.3.1-stt-7.tgz::locator=llm%40workspace%3A." dependencies: - expo: ^52.0.37 - expo-asset: ^11.0.3 - expo-file-system: ^18.0.10 + "@huggingface/jinja": ^0.5.0 + expo: ^53.0.7 + expo-asset: ~11.0.5 + expo-file-system: ~18.0.12 react-native-live-audio-stream: ^1.1.1 peerDependencies: react: "*" react-native: "*" - checksum: c5ac5f0739186e05cc5bd5b7d03c9a8709ff037c0704e4cce12a489b20ac3dc572a454088c9cb81828abce755d576e980db1ef55fc64659ca0cfc0962789ab62 + checksum: e22c53ea487332e00272419622651d39944b78efac75f4715dbec1ddf928b4c70a012021053f608fcead55de736766b257838b15fa50c5a1d279d3047e965472 languageName: node linkType: hard @@ -8132,13 +7133,6 @@ __metadata: languageName: node linkType: hard -"remove-trailing-slash@npm:^0.1.0": - version: 0.1.1 - resolution: "remove-trailing-slash@npm:0.1.1" - checksum: dd200c6b7d6f2b49d12b3eff3abc7089917e8a268cefcd5bf67ff23f8c2ad9f866fbe2f3566e1a8dbdc4f4b1171e2941f7dd00852f8de549bb73c3df53b09d96 - languageName: node - linkType: hard - "require-directory@npm:^2.1.1": version: 2.1.1 resolution: "require-directory@npm:2.1.1" @@ -8260,13 +7254,6 @@ __metadata: languageName: node linkType: hard -"reusify@npm:^1.0.4": - version: 1.1.0 - resolution: "reusify@npm:1.1.0" - checksum: 64cb3142ac5e9ad689aca289585cb41d22521f4571f73e9488af39f6b1bd62f0cbb3d65e2ecc768ec6494052523f473f1eb4b55c3e9014b3590c17fc6a03e22a - languageName: node - linkType: hard - "rimraf@npm:^3.0.2": version: 3.0.2 resolution: "rimraf@npm:3.0.2" @@ -8300,15 +7287,6 @@ __metadata: languageName: node linkType: hard -"run-parallel@npm:^1.1.9": - version: 1.2.0 - resolution: "run-parallel@npm:1.2.0" - dependencies: - queue-microtask: ^1.2.2 - checksum: cb4f97ad25a75ebc11a8ef4e33bb962f8af8516bb2001082ceabd8902e15b98f4b84b4f8a9b222e5d57fc3bd1379c483886ed4619367a7680dad65316993021d - languageName: node - linkType: hard - "safe-buffer@npm:5.2.1": version: 5.2.1 resolution: "safe-buffer@npm:5.2.1" @@ -8344,17 +7322,7 @@ __metadata: languageName: node linkType: hard -"selfsigned@npm:^2.4.1": - version: 2.4.1 - resolution: "selfsigned@npm:2.4.1" - dependencies: - "@types/node-forge": ^1.3.0 - node-forge: ^1 - checksum: 38b91c56f1d7949c0b77f9bbe4545b19518475cae15e7d7f0043f87b1626710b011ce89879a88969651f650a19d213bb15b7d5b4c2877df9eeeff7ba8f8b9bfa - languageName: node - linkType: hard - -"semver@npm:^5.5.0, semver@npm:^5.6.0": +"semver@npm:^5.6.0": version: 5.7.2 resolution: "semver@npm:5.7.2" bin: @@ -8430,7 +7398,7 @@ __metadata: languageName: node linkType: hard -"serve-static@npm:^1.13.1, serve-static@npm:^1.16.2": +"serve-static@npm:^1.16.2": version: 1.16.2 resolution: "serve-static@npm:1.16.2" dependencies: @@ -8442,13 +7410,6 @@ __metadata: languageName: node linkType: hard -"setimmediate@npm:^1.0.5": - version: 1.0.5 - resolution: "setimmediate@npm:1.0.5" - checksum: c9a6f2c5b51a2dabdc0247db9c46460152ffc62ee139f3157440bd48e7c59425093f42719ac1d7931f054f153e2d26cf37dfeb8da17a794a58198a2705e527fd - languageName: node - linkType: hard - "setprototypeof@npm:1.2.0": version: 1.2.0 resolution: "setprototypeof@npm:1.2.0" @@ -8465,15 +7426,6 @@ __metadata: languageName: node linkType: hard -"shebang-command@npm:^1.2.0": - version: 1.2.0 - resolution: "shebang-command@npm:1.2.0" - dependencies: - shebang-regex: ^1.0.0 - checksum: 9eed1750301e622961ba5d588af2212505e96770ec376a37ab678f965795e995ade7ed44910f5d3d3cb5e10165a1847f52d3348c64e146b8be922f7707958908 - languageName: node - linkType: hard - "shebang-command@npm:^2.0.0": version: 2.0.0 resolution: "shebang-command@npm:2.0.0" @@ -8483,13 +7435,6 @@ __metadata: languageName: node linkType: hard -"shebang-regex@npm:^1.0.0": - version: 1.0.0 - resolution: "shebang-regex@npm:1.0.0" - checksum: 404c5a752cd40f94591dfd9346da40a735a05139dac890ffc229afba610854d8799aaa52f87f7e0c94c5007f2c6af55bdcaeb584b56691926c5eaf41dc8f1372 - languageName: node - linkType: hard - "shebang-regex@npm:^3.0.0": version: 3.0.0 resolution: "shebang-regex@npm:3.0.0" @@ -8504,7 +7449,7 @@ __metadata: languageName: node linkType: hard -"signal-exit@npm:^3.0.0, signal-exit@npm:^3.0.2, signal-exit@npm:^3.0.7": +"signal-exit@npm:^3.0.2, signal-exit@npm:^3.0.7": version: 3.0.7 resolution: "signal-exit@npm:3.0.7" checksum: a2f098f247adc367dffc27845853e9959b9e88b01cb301658cfe4194352d8d2bb32e18467c786a7fe15f1d44b233ea35633d076d5e737870b7139949d1ab6318 @@ -8633,15 +7578,6 @@ __metadata: languageName: node linkType: hard -"ssri@npm:^10.0.0": - version: 10.0.6 - resolution: "ssri@npm:10.0.6" - dependencies: - minipass: ^7.0.3 - checksum: 4603d53a05bcd44188747d38f1cc43833b9951b5a1ee43ba50535bdfc5fe4a0897472dbe69837570a5417c3c073377ef4f8c1a272683b401857f72738ee57299 - languageName: node - linkType: hard - "ssri@npm:^12.0.0": version: 12.0.0 resolution: "ssri@npm:12.0.0" @@ -8690,7 +7626,7 @@ __metadata: languageName: node linkType: hard -"stream-buffers@npm:2.2.x, stream-buffers@npm:~2.2.0": +"stream-buffers@npm:2.2.x": version: 2.2.0 resolution: "stream-buffers@npm:2.2.0" checksum: 4587d9e8f050d689fb38b4295e73408401b16de8edecc12026c6f4ae92956705ecfd995ae3845d7fa3ebf19502d5754df9143d91447fd881d86e518f43882c1c @@ -8755,13 +7691,6 @@ __metadata: languageName: node linkType: hard -"strip-eof@npm:^1.0.0": - version: 1.0.0 - resolution: "strip-eof@npm:1.0.0" - checksum: 40bc8ddd7e072f8ba0c2d6d05267b4e0a4800898c3435b5fb5f5a21e6e47dfaff18467e7aa0d1844bb5d6274c3097246595841fbfeb317e541974ee992cac506 - languageName: node - linkType: hard - "strip-json-comments@npm:~2.0.1": version: 2.0.1 resolution: "strip-json-comments@npm:2.0.1" @@ -8869,20 +7798,6 @@ __metadata: languageName: node linkType: hard -"tar@npm:^6.1.11, tar@npm:^6.2.1": - version: 6.2.1 - resolution: "tar@npm:6.2.1" - dependencies: - chownr: ^2.0.0 - fs-minipass: ^2.0.0 - minipass: ^5.0.0 - minizlib: ^2.1.1 - mkdirp: ^1.0.3 - yallist: ^4.0.0 - checksum: f1322768c9741a25356c11373bce918483f40fa9a25c69c59410c8a1247632487edef5fe76c5f12ac51a6356d2f1829e96d2bc34098668a2fc34d76050ac2b6c - languageName: node - linkType: hard - "tar@npm:^7.4.3": version: 7.4.3 resolution: "tar@npm:7.4.3" @@ -8897,7 +7812,7 @@ __metadata: languageName: node linkType: hard -"temp-dir@npm:^2.0.0, temp-dir@npm:~2.0.0": +"temp-dir@npm:~2.0.0": version: 2.0.0 resolution: "temp-dir@npm:2.0.0" checksum: cc4f0404bf8d6ae1a166e0e64f3f409b423f4d1274d8c02814a59a5529f07db6cd070a749664141b992b2c1af337fa9bb451a460a43bb9bcddc49f235d3115aa @@ -8913,19 +7828,6 @@ __metadata: languageName: node linkType: hard -"tempy@npm:^0.7.1": - version: 0.7.1 - resolution: "tempy@npm:0.7.1" - dependencies: - del: ^6.0.0 - is-stream: ^2.0.0 - temp-dir: ^2.0.0 - type-fest: ^0.16.0 - unique-string: ^2.0.0 - checksum: 265652f94eed077c311777e0290c4b4f3ec670c71c62c979efcbbd67ee506d677ff2741a72d7160556e9b0fba8fc5fbd7b3c482ac94c8acc48d85411f1f079c3 - languageName: node - linkType: hard - "terminal-link@npm:^2.1.1": version: 2.1.1 resolution: "terminal-link@npm:2.1.1" @@ -9028,13 +7930,6 @@ __metadata: languageName: node linkType: hard -"tr46@npm:~0.0.3": - version: 0.0.3 - resolution: "tr46@npm:0.0.3" - checksum: 726321c5eaf41b5002e17ffbd1fb7245999a073e8979085dacd47c4b4e8068ff5777142fc6726d6ca1fd2ff16921b48788b87225cbc57c72636f6efa8efbffe3 - languageName: node - linkType: hard - "ts-interface-checker@npm:^0.1.9": version: 0.1.13 resolution: "ts-interface-checker@npm:0.1.13" @@ -9056,13 +7951,6 @@ __metadata: languageName: node linkType: hard -"type-fest@npm:^0.16.0": - version: 0.16.0 - resolution: "type-fest@npm:0.16.0" - checksum: 1a4102c06dc109db00418c753062e206cab65befd469d000ece4452ee649bf2a9cf57686d96fb42326bc9d918d9a194d4452897b486dcc41989e5c99e4e87094 - languageName: node - linkType: hard - "type-fest@npm:^0.21.3": version: 0.21.3 resolution: "type-fest@npm:0.21.3" @@ -9097,15 +7985,6 @@ __metadata: languageName: node linkType: hard -"ua-parser-js@npm:^1.0.35": - version: 1.0.40 - resolution: "ua-parser-js@npm:1.0.40" - bin: - ua-parser-js: script/cli.js - checksum: ae555a33dc9395dd877e295d6adbf5634e047aad7c3358328830218f3ca3a6233e35848cd355465a7612f269860e8029984389282940c7a27c9af4dfcdbba8c3 - languageName: node - linkType: hard - "uc.micro@npm:^1.0.1, uc.micro@npm:^1.0.5": version: 1.0.6 resolution: "uc.micro@npm:1.0.6" @@ -9158,15 +8037,6 @@ __metadata: languageName: node linkType: hard -"unique-filename@npm:^3.0.0": - version: 3.0.0 - resolution: "unique-filename@npm:3.0.0" - dependencies: - unique-slug: ^4.0.0 - checksum: 8e2f59b356cb2e54aab14ff98a51ac6c45781d15ceaab6d4f1c2228b780193dc70fae4463ce9e1df4479cb9d3304d7c2043a3fb905bdeca71cc7e8ce27e063df - languageName: node - linkType: hard - "unique-filename@npm:^4.0.0": version: 4.0.0 resolution: "unique-filename@npm:4.0.0" @@ -9176,15 +8046,6 @@ __metadata: languageName: node linkType: hard -"unique-slug@npm:^4.0.0": - version: 4.0.0 - resolution: "unique-slug@npm:4.0.0" - dependencies: - imurmurhash: ^0.1.4 - checksum: 0884b58365af59f89739e6f71e3feacb5b1b41f2df2d842d0757933620e6de08eff347d27e9d499b43c40476cbaf7988638d3acb2ffbcb9d35fd035591adfd15 - languageName: node - linkType: hard - "unique-slug@npm:^5.0.0": version: 5.0.0 resolution: "unique-slug@npm:5.0.0" @@ -9194,7 +8055,7 @@ __metadata: languageName: node linkType: hard -"unique-string@npm:^2.0.0, unique-string@npm:~2.0.0": +"unique-string@npm:~2.0.0": version: 2.0.0 resolution: "unique-string@npm:2.0.0" dependencies: @@ -9203,13 +8064,6 @@ __metadata: languageName: node linkType: hard -"universalify@npm:^0.1.0": - version: 0.1.2 - resolution: "universalify@npm:0.1.2" - checksum: 40cdc60f6e61070fe658ca36016a8f4ec216b29bf04a55dce14e3710cc84c7448538ef4dad3728d0bfe29975ccd7bfb5f414c45e7b78883567fb31b246f02dff - languageName: node - linkType: hard - "universalify@npm:^1.0.0": version: 1.0.0 resolution: "universalify@npm:1.0.0" @@ -9268,15 +8122,6 @@ __metadata: languageName: node linkType: hard -"uuid@npm:^8.0.0, uuid@npm:^8.3.2": - version: 8.3.2 - resolution: "uuid@npm:8.3.2" - bin: - uuid: dist/bin/uuid - checksum: 5575a8a75c13120e2f10e6ddc801b2c7ed7d8f3c8ac22c7ed0c7b2ba6383ec0abda88c905085d630e251719e0777045ae3236f04c812184b7c765f63a70e58df - languageName: node - linkType: hard - "validate-npm-package-name@npm:^5.0.0": version: 5.0.1 resolution: "validate-npm-package-name@npm:5.0.1" @@ -9330,13 +8175,6 @@ __metadata: languageName: node linkType: hard -"webidl-conversions@npm:^3.0.0": - version: 3.0.1 - resolution: "webidl-conversions@npm:3.0.1" - checksum: c92a0a6ab95314bde9c32e1d0a6dfac83b578f8fa5f21e675bc2706ed6981bc26b7eb7e6a1fab158e5ce4adf9caa4a0aee49a52505d4d13c7be545f15021b17c - languageName: node - linkType: hard - "webidl-conversions@npm:^5.0.0": version: 5.0.0 resolution: "webidl-conversions@npm:5.0.0" @@ -9362,27 +8200,6 @@ __metadata: languageName: node linkType: hard -"whatwg-url@npm:^5.0.0": - version: 5.0.0 - resolution: "whatwg-url@npm:5.0.0" - dependencies: - tr46: ~0.0.3 - webidl-conversions: ^3.0.0 - checksum: b8daed4ad3356cc4899048a15b2c143a9aed0dfae1f611ebd55073310c7b910f522ad75d727346ad64203d7e6c79ef25eafd465f4d12775ca44b90fa82ed9e2c - languageName: node - linkType: hard - -"which@npm:^1.2.9": - version: 1.3.1 - resolution: "which@npm:1.3.1" - dependencies: - isexe: ^2.0.0 - bin: - which: ./bin/which - checksum: f2e185c6242244b8426c9df1510e86629192d93c1a986a7d2a591f2c24869e7ffd03d6dac07ca863b2e4c06f59a4cc9916c585b72ee9fa1aa609d0124df15e04 - languageName: node - linkType: hard - "which@npm:^2.0.1": version: 2.0.2 resolution: "which@npm:2.0.2" From a4c262acd6cbe4178b02c7c275a8d65169b78bf7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mateusz=20Kopci=C5=84ski?= Date: Thu, 8 May 2025 14:40:32 +0200 Subject: [PATCH 2/3] fixed S2T streaming improved error handling, minor refactoring --- examples/llama/ios/llama/Info.plist | 81 ---- examples/llm/ios/Podfile.lock | 88 +++- .../llm/ios/llm.xcodeproj/project.pbxproj | 10 +- .../xcshareddata/WorkspaceSettings.xcsettings | 8 + examples/llm/ios/llm/Info.plist | 2 + examples/llm/package.json | 4 +- examples/llm/screens/LLMScreen.tsx | 94 ++--- examples/llm/yarn.lock | 288 ++----------- src/Error.ts | 13 +- src/constants/sttDefaults.ts | 6 + src/controllers/SpeechToTextController.ts | 384 +++++++++++------- .../useSpeechToText.ts | 11 + src/index.tsx | 1 + src/native/NativeSpeechToText.ts | 2 +- 14 files changed, 438 insertions(+), 554 deletions(-) delete mode 100644 examples/llama/ios/llama/Info.plist create mode 100644 examples/llm/ios/llm.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings diff --git a/examples/llama/ios/llama/Info.plist b/examples/llama/ios/llama/Info.plist deleted file mode 100644 index 1febd3e0..00000000 --- a/examples/llama/ios/llama/Info.plist +++ /dev/null @@ -1,81 +0,0 @@ - - - - - CADisableMinimumFrameDurationOnPhone - - CFBundleDevelopmentRegion - $(DEVELOPMENT_LANGUAGE) - CFBundleDisplayName - llama - CFBundleExecutable - $(EXECUTABLE_NAME) - CFBundleIdentifier - $(PRODUCT_BUNDLE_IDENTIFIER) - CFBundleInfoDictionaryVersion - 6.0 - CFBundleName - $(PRODUCT_NAME) - CFBundlePackageType - $(PRODUCT_BUNDLE_PACKAGE_TYPE) - CFBundleShortVersionString - 1.0.0 - CFBundleSignature - ???? - CFBundleURLTypes - - - CFBundleURLSchemes - - com.anonymous.llama - - - - CFBundleVersion - 1 - LSMinimumSystemVersion - 12.0 - LSRequiresIPhoneOS - - NSAppTransportSecurity - - NSAllowsArbitraryLoads - - NSAllowsLocalNetworking - - - NSMicrophoneUsageDescription - We need your permission to use the microphone. - UIAppFonts - - Aeonik-Regular.otf - Aeonik-Medium.otf - - UILaunchStoryboardName - SplashScreen - UIRequiredDeviceCapabilities - - arm64 - - UIRequiresFullScreen - - UIStatusBarStyle - UIStatusBarStyleDefault - UISupportedInterfaceOrientations - - UIInterfaceOrientationPortrait - UIInterfaceOrientationPortraitUpsideDown - - UISupportedInterfaceOrientations~ipad - - UIInterfaceOrientationPortrait - UIInterfaceOrientationPortraitUpsideDown - UIInterfaceOrientationLandscapeLeft - UIInterfaceOrientationLandscapeRight - - UIUserInterfaceStyle - Light - UIViewControllerBasedStatusBarAppearance - - - diff --git a/examples/llm/ios/Podfile.lock b/examples/llm/ios/Podfile.lock index b217a449..6df6b89a 100644 --- a/examples/llm/ios/Podfile.lock +++ b/examples/llm/ios/Podfile.lock @@ -1401,7 +1401,7 @@ PODS: - React-jsiexecutor - React-RCTFBReactNativeSpec - ReactCommon/turbomodule/core - - react-native-executorch (0.3.1-stt-7): + - react-native-executorch (0.3.3): - DoubleConversion - glog - hermes-engine @@ -1823,6 +1823,82 @@ PODS: - React-logger (= 0.79.2) - React-perflogger (= 0.79.2) - React-utils (= 0.79.2) + - RNAudioAPI (0.5.7): + - DoubleConversion + - glog + - hermes-engine + - RCT-Folly (= 2024.11.18.00) + - RCTRequired + - RCTTypeSafety + - React-Core + - React-debug + - React-Fabric + - React-featureflags + - React-graphics + - React-hermes + - React-ImageManager + - React-jsi + - React-NativeModulesApple + - React-RCTFabric + - React-renderercss + - React-rendererdebug + - React-utils + - ReactCodegen + - ReactCommon/turbomodule/bridging + - ReactCommon/turbomodule/core + - RNAudioAPI/audioapi (= 0.5.7) + - Yoga + - RNAudioAPI/audioapi (0.5.7): + - DoubleConversion + - glog + - hermes-engine + - RCT-Folly (= 2024.11.18.00) + - RCTRequired + - RCTTypeSafety + - React-Core + - React-debug + - React-Fabric + - React-featureflags + - React-graphics + - React-hermes + - React-ImageManager + - React-jsi + - React-NativeModulesApple + - React-RCTFabric + - React-renderercss + - React-rendererdebug + - React-utils + - ReactCodegen + - ReactCommon/turbomodule/bridging + - ReactCommon/turbomodule/core + - RNAudioAPI/audioapi/ios (= 0.5.7) + - Yoga + - RNAudioAPI/audioapi/ios (0.5.7): + - DoubleConversion + - glog + - hermes-engine + - RCT-Folly (= 2024.11.18.00) + - RCTRequired + - RCTTypeSafety + - React-Core + - React-debug + - React-Fabric + - React-featureflags + - React-graphics + - React-hermes + - React-ImageManager + - React-jsi + - React-NativeModulesApple + - React-RCTFabric + - React-renderercss + - React-rendererdebug + - React-utils + - ReactCodegen + - ReactCommon/turbomodule/bridging + - ReactCommon/turbomodule/core + - Yoga + - RNLiveAudioStream (1.1.1): + - React - RNReanimated (3.17.5): - DoubleConversion - glog @@ -2083,6 +2159,8 @@ DEPENDENCIES: - ReactAppDependencyProvider (from `build/generated/ios`) - ReactCodegen (from `build/generated/ios`) - ReactCommon/turbomodule/core (from `../node_modules/react-native/ReactCommon`) + - RNAudioAPI (from `../node_modules/react-native-audio-api`) + - RNLiveAudioStream (from `../node_modules/react-native-live-audio-stream`) - RNReanimated (from `../node_modules/react-native-reanimated`) - RNSVG (from `../node_modules/react-native-svg`) - Yoga (from `../node_modules/react-native/ReactCommon/yoga`) @@ -2256,6 +2334,10 @@ EXTERNAL SOURCES: :path: build/generated/ios ReactCommon: :path: "../node_modules/react-native/ReactCommon" + RNAudioAPI: + :path: "../node_modules/react-native-audio-api" + RNLiveAudioStream: + :path: "../node_modules/react-native-live-audio-stream" RNReanimated: :path: "../node_modules/react-native-reanimated" RNSVG: @@ -2313,7 +2395,7 @@ SPEC CHECKSUMS: React-logger: 8edfcedc100544791cd82692ca5a574240a16219 React-Mapbuffer: c3f4b608e4a59dd2f6a416ef4d47a14400194468 React-microtasksnativemodule: 054f34e9b82f02bd40f09cebd4083828b5b2beb6 - react-native-executorch: 8bca350ccbb66246dd7366fb6514fed57083930e + react-native-executorch: d0c3dffa0a4a4111ea9c7b97f3fbf088a48d3b2a react-native-safe-area-context: 562163222d999b79a51577eda2ea8ad2c32b4d06 React-NativeModulesApple: 2c4377e139522c3d73f5df582e4f051a838ff25e React-oscompat: ef5df1c734f19b8003e149317d041b8ce1f7d29c @@ -2346,6 +2428,8 @@ SPEC CHECKSUMS: ReactAppDependencyProvider: 04d5eb15eb46be6720e17a4a7fa92940a776e584 ReactCodegen: c63eda03ba1d94353fb97b031fc84f75a0d125ba ReactCommon: 76d2dc87136d0a667678668b86f0fca0c16fdeb0 + RNAudioAPI: 2e3fd4bf75aa5717791babb30126707504996f09 + RNLiveAudioStream: 93ac2bb6065be9018d0b00157b220f11cebc1513 RNReanimated: 2313402fe27fecb7237619e9c6fcee3177f08a65 RNSVG: 794f269526df9ddc1f79b3d1a202b619df0368e3 SocketRocket: d4aabe649be1e368d1318fdf28a022d714d65748 diff --git a/examples/llm/ios/llm.xcodeproj/project.pbxproj b/examples/llm/ios/llm.xcodeproj/project.pbxproj index 9a546b96..cb65f305 100644 --- a/examples/llm/ios/llm.xcodeproj/project.pbxproj +++ b/examples/llm/ios/llm.xcodeproj/project.pbxproj @@ -23,8 +23,8 @@ 13B07F961A680F5B00A75B9A /* llm.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = llm.app; sourceTree = BUILT_PRODUCTS_DIR; }; 13B07FB51A68108700A75B9A /* Images.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; name = Images.xcassets; path = llm/Images.xcassets; sourceTree = ""; }; 13B07FB61A68108700A75B9A /* Info.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; name = Info.plist; path = llm/Info.plist; sourceTree = ""; }; - 52F93D50E948F855530BE970 /* PrivacyInfo.xcprivacy */ = {isa = PBXFileReference; includeInIndex = 1; name = PrivacyInfo.xcprivacy; path = llm/PrivacyInfo.xcprivacy; sourceTree = ""; }; - 66FD0DA88DE041D4B2294CB4 /* Aeonik-Medium.otf */ = {isa = PBXFileReference; explicitFileType = undefined; fileEncoding = undefined; includeInIndex = 0; lastKnownFileType = unknown; name = "Aeonik-Medium.otf"; path = "../assets/fonts/Aeonik-Medium.otf"; sourceTree = ""; }; + 52F93D50E948F855530BE970 /* PrivacyInfo.xcprivacy */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xml; name = PrivacyInfo.xcprivacy; path = llm/PrivacyInfo.xcprivacy; sourceTree = ""; }; + 66FD0DA88DE041D4B2294CB4 /* Aeonik-Medium.otf */ = {isa = PBXFileReference; explicitFileType = undefined; fileEncoding = 9; includeInIndex = 0; lastKnownFileType = unknown; name = "Aeonik-Medium.otf"; path = "../assets/fonts/Aeonik-Medium.otf"; sourceTree = ""; }; 99F00DD47E42AF45816C58B8 /* Pods-llm.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-llm.release.xcconfig"; path = "Target Support Files/Pods-llm/Pods-llm.release.xcconfig"; sourceTree = ""; }; A8F7447548358E44DADA5029 /* Pods-llm.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-llm.debug.xcconfig"; path = "Target Support Files/Pods-llm/Pods-llm.debug.xcconfig"; sourceTree = ""; }; AA286B85B6C04FC6940260E9 /* SplashScreen.storyboard */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.storyboard; name = SplashScreen.storyboard; path = llm/SplashScreen.storyboard; sourceTree = ""; }; @@ -33,7 +33,7 @@ ED297162215061F000B7C4FE /* JavaScriptCore.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = JavaScriptCore.framework; path = System/Library/Frameworks/JavaScriptCore.framework; sourceTree = SDKROOT; }; F11748412D0307B40044C1D9 /* AppDelegate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; name = AppDelegate.swift; path = llm/AppDelegate.swift; sourceTree = ""; }; F11748442D0722820044C1D9 /* llm-Bridging-Header.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "llm-Bridging-Header.h"; path = "llm/llm-Bridging-Header.h"; sourceTree = ""; }; - F73A1A19BDF34985A5AAA585 /* Aeonik-Regular.otf */ = {isa = PBXFileReference; explicitFileType = undefined; fileEncoding = undefined; includeInIndex = 0; lastKnownFileType = unknown; name = "Aeonik-Regular.otf"; path = "../assets/fonts/Aeonik-Regular.otf"; sourceTree = ""; }; + F73A1A19BDF34985A5AAA585 /* Aeonik-Regular.otf */ = {isa = PBXFileReference; explicitFileType = undefined; fileEncoding = 9; includeInIndex = 0; lastKnownFileType = unknown; name = "Aeonik-Regular.otf"; path = "../assets/fonts/Aeonik-Regular.otf"; sourceTree = ""; }; /* End PBXFileReference section */ /* Begin PBXFrameworksBuildPhase section */ @@ -117,7 +117,6 @@ 66FD0DA88DE041D4B2294CB4 /* Aeonik-Medium.otf */, ); name = Resources; - path = ""; sourceTree = ""; }; B83BB53798F9A57DA3D5DBEC /* Pods */ = { @@ -126,7 +125,6 @@ A8F7447548358E44DADA5029 /* Pods-llm.debug.xcconfig */, 99F00DD47E42AF45816C58B8 /* Pods-llm.release.xcconfig */, ); - name = Pods; path = Pods; sourceTree = ""; }; @@ -353,6 +351,7 @@ CLANG_ENABLE_MODULES = YES; CODE_SIGN_ENTITLEMENTS = llm/llm.entitlements; CURRENT_PROJECT_VERSION = 1; + DEVELOPMENT_TEAM = J5FM626PE2; ENABLE_BITCODE = NO; GCC_PREPROCESSOR_DEFINITIONS = ( "$(inherited)", @@ -389,6 +388,7 @@ CLANG_ENABLE_MODULES = YES; CODE_SIGN_ENTITLEMENTS = llm/llm.entitlements; CURRENT_PROJECT_VERSION = 1; + DEVELOPMENT_TEAM = J5FM626PE2; INFOPLIST_FILE = llm/Info.plist; IPHONEOS_DEPLOYMENT_TARGET = 15.1; LD_RUNPATH_SEARCH_PATHS = ( diff --git a/examples/llm/ios/llm.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings b/examples/llm/ios/llm.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings new file mode 100644 index 00000000..08de0be8 --- /dev/null +++ b/examples/llm/ios/llm.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings @@ -0,0 +1,8 @@ + + + + + IDEWorkspaceSharedSettings_AutocreateContextsIfNeeded + + + diff --git a/examples/llm/ios/llm/Info.plist b/examples/llm/ios/llm/Info.plist index 5b589e2d..86608be4 100644 --- a/examples/llm/ios/llm/Info.plist +++ b/examples/llm/ios/llm/Info.plist @@ -52,6 +52,8 @@ Allow $(PRODUCT_NAME) to access your reminders NSRemindersUsageDescription Allow $(PRODUCT_NAME) to access your reminders + NSMicrophoneUsageDescription + We need your permission to use the microphone. UIAppFonts Aeonik-Regular.otf diff --git a/examples/llm/package.json b/examples/llm/package.json index f92475f7..1bf51f4a 100644 --- a/examples/llm/package.json +++ b/examples/llm/package.json @@ -19,7 +19,9 @@ "metro-config": "^0.81.0", "react": "19.0.0", "react-native": "^0.79.2", - "react-native-executorch": "/Users/kopcion/swm-ai/react-native-executorch/react-native-executorch-0.3.1-stt-7.tgz", + "react-native-audio-api": "0.5.7", + "react-native-executorch": "^0.3.1", + "react-native-live-audio-stream": "^1.1.1", "react-native-loading-spinner-overlay": "^3.0.1", "react-native-markdown-display": "^7.0.2", "react-native-reanimated": "^3.17.5", diff --git a/examples/llm/screens/LLMScreen.tsx b/examples/llm/screens/LLMScreen.tsx index 3f528c5b..4155cfe1 100644 --- a/examples/llm/screens/LLMScreen.tsx +++ b/examples/llm/screens/LLMScreen.tsx @@ -1,4 +1,4 @@ -import { useEffect, useRef, useState } from 'react'; +import { useRef, useState } from 'react'; import { Keyboard, KeyboardAvoidingView, @@ -14,12 +14,12 @@ import { SafeAreaView } from 'react-native-safe-area-context'; import SWMIcon from '../assets/icons/swm_icon.svg'; import Spinner from 'react-native-loading-spinner-overlay'; import { - // STREAMING_ACTION, + STREAMING_ACTION, useSpeechToText, - LLAMA3_2_1B_QLORA, - LLAMA3_2_1B_TOKENIZER, useLLM, - LLAMA3_2_TOKENIZER_CONFIG, + QWEN3_0_6B_QUANTIZED, + QWEN3_TOKENIZER, + QWEN3_TOKENIZER_CONFIG, } from 'react-native-executorch'; import PauseIcon from '../assets/icons/pause_icon.svg'; import MicIcon from '../assets/icons/mic_icon.svg'; @@ -29,7 +29,6 @@ import ColorPalette from '../colors'; import Messages from '../components/Messages'; import LiveAudioStream from 'react-native-live-audio-stream'; import { Buffer } from 'buffer'; -// import * as Speech from 'expo-speech'; const audioStreamOptions = { sampleRate: 16000, @@ -59,34 +58,36 @@ const float32ArrayFromPCMBinaryBuffer = (b64EncodedBuffer: string) => { return float32Array; }; -export default function ChatScreen() { - // const [currentMessage, setCurrentMessage] = useState(''); +export default function LLMScreen({ + setIsGenerating, +}: { + setIsGenerating: React.Dispatch>; +}) { const [isRecording, setIsRecording] = useState(false); const [isTextInputFocused, setIsTextInputFocused] = useState(false); const [userInput, setUserInput] = useState(''); const textInputRef = useRef(null); const messageRecorded = useRef(false); const llm = useLLM({ - modelSource: LLAMA3_2_1B_QLORA, - tokenizerSource: LLAMA3_2_1B_TOKENIZER, - tokenizerConfigSource: LLAMA3_2_TOKENIZER_CONFIG, + modelSource: QWEN3_0_6B_QUANTIZED, + tokenizerSource: QWEN3_TOKENIZER, + tokenizerConfigSource: QWEN3_TOKENIZER_CONFIG, chatConfig: { contextWindowLength: 6, }, }); const speechToText = useSpeechToText({ - modelName: 'whisper', - windowSize: 5, + modelName: 'moonshine', + windowSize: 3, overlapSeconds: 1.2, }); const onChunk = (data: string) => { const float32Chunk = float32ArrayFromPCMBinaryBuffer(data); - speechToText.transcribe(Array.from(float32Chunk)); - // speechToText.streamingTranscribe( - // STREAMING_ACTION.DATA, - // Array.from(float32Chunk) - // ); + speechToText.streamingTranscribe( + STREAMING_ACTION.DATA, + Array.from(float32Chunk) + ); }; const handleRecordPress = async () => { @@ -94,25 +95,20 @@ export default function ChatScreen() { setIsRecording(false); LiveAudioStream.stop(); messageRecorded.current = true; - // await llm.generate( - // await speechToText.streamingTranscribe(STREAMING_ACTION.STOP) - // ); + await llm.sendMessage( + await speechToText.streamingTranscribe(STREAMING_ACTION.STOP) + ); } else { setIsRecording(true); startStreamingAudio(audioStreamOptions, onChunk); - // await speechToText.streamingTranscribe(STREAMING_ACTION.START); + await speechToText.streamingTranscribe(STREAMING_ACTION.START); } }; - // const sendMessage = async () => { - // setUserInput(''); - // textInputRef.current?.clear(); - // try { - // await llm.sendMessage(userInput); - // } catch (e) { - // console.error(e); - // } - // }; + useEffect(() => { + setIsGenerating(llm.isGenerating); + }, [llm.isGenerating, setIsGenerating]); + const sendMessage = async () => { if (userInput) { llm.sendMessage(userInput); @@ -122,28 +118,6 @@ export default function ChatScreen() { } }; - // useEffect(() => { - // if (llm.response && !llm.isGenerating) { - // appendToMessageHistory(llm.response, 'assistant'); - // } - // }, [llm.response, llm.isGenerating]); - - // const modifyLastMessage = (content: string) => { - // setCurrentMessage((prevMessage) => prevMessage + content); - // }; - - useEffect(() => { - if (speechToText.sequence.length && !speechToText.isGenerating) { - llm.sendMessage(speechToText.sequence); - } - }, [speechToText.sequence, speechToText.isGenerating, llm.sendMessage]); //eslint-disable-line react-hooks/exhaustive-deps - - // const appendToMessageHistory = (content: string, role: SenderType) => { - // setChatHistory((prevHistory) => [...prevHistory, { role, content }]); - // if (role == 'assistant' && messageRecorded.current) - // Speech.speak(content, { language: 'en-US' }); - // }; - return !llm.isReady || !speechToText.isReady ? ( llm 3.2 1B QLoRA x Whisper - {llm.messageHistory.length ? ( + {llm.messageHistory.length || speechToText.sequence ? ( { +export const getError = (e: unknown | ETError | Error): string => { if (typeof e === 'number') { if (e in ETError) return ETError[e] as string; return ETError[ETError.UndefinedError] as string; @@ -43,9 +48,13 @@ export const getError = (e: unknown | ETError): string => { // try to extract number from message (can contain false positives) const error = e as Error; const errorCode = parseInt(error.message, 10); + const message = Number.isNaN(errorCode) + ? error.message + : ' ' + error.message.slice(`${errorCode}`.length).trimStart(); + const ETErrorMessage = ( errorCode in ETError ? ETError[errorCode] : ETError[ETError.UndefinedError] ) as string; - return ETErrorMessage + error.message; + return ETErrorMessage + message; }; diff --git a/src/constants/sttDefaults.ts b/src/constants/sttDefaults.ts index 119e5d2e..db1bffc3 100644 --- a/src/constants/sttDefaults.ts +++ b/src/constants/sttDefaults.ts @@ -78,3 +78,9 @@ export const MODES = { }; export const NUM_TOKENS_TO_SLICE = 3; + +export enum STREAMING_ACTION { + START, + DATA, + STOP, +} diff --git a/src/controllers/SpeechToTextController.ts b/src/controllers/SpeechToTextController.ts index 13b50203..001aae72 100644 --- a/src/controllers/SpeechToTextController.ts +++ b/src/controllers/SpeechToTextController.ts @@ -4,27 +4,32 @@ import { SECOND, MODES, NUM_TOKENS_TO_SLICE, + STREAMING_ACTION, } from '../constants/sttDefaults'; import { AvailableModels, ModelConfig } from '../types/stt'; -import { - SpeechToTextNativeModule, - TokenizerNativeModule, -} from '../native/RnExecutorchModules'; +import { SpeechToTextNativeModule } from '../native/RnExecutorchModules'; import { ResourceSource } from '../types/common'; import { ResourceFetcher } from '../utils/ResourceFetcher'; import { longCommonInfPref } from '../utils/stt'; import { SpeechToTextLanguage } from '../types/stt'; +import { ETError, getError } from '../Error'; +import { TokenizerModule } from '../modules/natural_language_processing/TokenizerModule'; export class SpeechToTextController { private speechToTextNativeModule = SpeechToTextNativeModule; - private overlapSeconds!: number; - private windowSize!: number; - private chunks: number[][] = []; public sequence: number[] = []; public isReady = false; public isGenerating = false; - private nativeTokenizer = TokenizerNativeModule; + + private overlapSeconds!: number; + private windowSize!: number; + private chunks: number[][] = []; + private seqs: number[][] = []; + private prevSeq: number[] = []; + private waveform: number[] = []; + private numOfChunks = 0; + private streaming = false; // User callbacks private decodedTranscribeCallback: (sequence: number[]) => void; @@ -100,9 +105,7 @@ export class SpeechToTextController { ); // The tokenizer native module does not accept the file:// prefix - await this.nativeTokenizer.loadModule( - tokenizerUri.replace('file://', '') - ); + TokenizerModule.load(tokenizerUri.replace('file://', '')); } catch (e) { this.onErrorCallback?.(e); return; @@ -153,36 +156,36 @@ export class SpeechToTextController { this.windowSize = 30 * SECOND - 2 * this.overlapSeconds; } } - private chunkWaveform(waveform: number[]) { - this.chunks = []; - const numOfChunks = Math.ceil(waveform.length / this.windowSize); - for (let i = 0; i < numOfChunks; i++) { - let chunk = waveform.slice( - Math.max(this.windowSize * i - this.overlapSeconds, 0), - Math.min( - this.windowSize * (i + 1) + this.overlapSeconds, - waveform.length - ) + + private chunkWaveform() { + this.numOfChunks = Math.ceil(this.waveform.length / this.windowSize); + for (let i = 0; i < this.numOfChunks; i++) { + let chunk: number[] = []; + const left = Math.max(this.windowSize * i - this.overlapSeconds, 0); + const right = Math.min( + this.windowSize * (i + 1) + this.overlapSeconds, + this.waveform.length ); + chunk = this.waveform.slice(left, right); this.chunks.push(chunk); } } - private checkCanTranscribe() { - if (!this.isReady) { - throw Error('Model is not yet ready'); - } - if (this.isGenerating) { - throw Error('Model is already transcribing'); - } - } - - public async encode(waveform: number[]) { - return await this.speechToTextNativeModule.encode(waveform); + private resetState() { + this.sequence = []; + this.seqs = []; + this.waveform = []; + this.prevSeq = []; + this.chunks = []; + this.decodedTranscribeCallback([]); + this.onErrorCallback?.(undefined); } - public async decode(seq: number[], encodings: number[]) { - return await this.speechToTextNativeModule.decode(seq, encodings); + private expectedChunkLength() { + //only first chunk can be of shorter length, for first chunk there are no seqs decoded + return this.seqs.length + ? this.windowSize + 2 * this.overlapSeconds + : this.windowSize + this.overlapSeconds; } private async getStartingTokenIds(audioLanguage?: string): Promise { @@ -194,13 +197,10 @@ export class SpeechToTextController { return [this.config.tokenizer.bos]; } // FIXME: I should use .getTokenId for the BOS as well, should remove it from config - const langTokenId = await this.nativeTokenizer.tokenToId( - `<|${audioLanguage}|>` - ); - const transcribeTokenId = - await this.nativeTokenizer.tokenToId('<|transcribe|>'); + const langTokenId = await TokenizerModule.tokenToId(`<|${audioLanguage}|>`); + const transcribeTokenId = await TokenizerModule.tokenToId('<|transcribe|>'); const noTimestampsTokenId = - await this.nativeTokenizer.tokenToId('<|notimestamps|>'); + await TokenizerModule.tokenToId('<|notimestamps|>'); const startingTokenIds = [ this.config.tokenizer.bos, langTokenId, @@ -210,123 +210,142 @@ export class SpeechToTextController { return startingTokenIds; } - public async transcribe( - waveform: number[], + private async decodeChunk( + chunk: number[], audioLanguage?: SpeechToTextLanguage - ): Promise { + ): Promise { + const seq = await this.getStartingTokenIds(audioLanguage); + let prevSeqTokenIdx = 0; + this.prevSeq = this.sequence.slice(); try { - this.checkCanTranscribe(); - } catch (e) { - this.onErrorCallback?.(e); - return ''; + await this.encode(chunk); + } catch (error) { + this.onErrorCallback?.(new Error(getError(error) + ' encoding error')); + return []; } + let lastToken = seq.at(-1) as number; + while (lastToken !== this.config.tokenizer.eos) { + try { + lastToken = await this.decode(seq); + } catch (error) { + this.onErrorCallback?.(new Error(getError(error) + ' decoding error')); + return [...seq, this.config.tokenizer.eos]; + } + seq.push(lastToken); + if ( + this.seqs.length > 0 && + seq.length < this.seqs.at(-1)!.length && + seq.length % 3 !== 0 + ) { + this.prevSeq.push(this.seqs.at(-1)![prevSeqTokenIdx++]!); + this.decodedTranscribeCallback(this.prevSeq); + } + } + return seq; + } + + private async handleOverlaps(seqs: number[][]): Promise { + const maxInd = longCommonInfPref( + seqs.at(-2)!, + seqs.at(-1)!, + HAMMING_DIST_THRESHOLD + ); + this.sequence = [...this.sequence, ...seqs.at(-2)!.slice(0, maxInd)]; + this.decodedTranscribeCallback(this.sequence); + return this.sequence.slice(); + } + + private trimLeft(numOfTokensToSlice: number) { + for (let idx = 1; idx < this.seqs.length; idx++) { + if (this.seqs[idx]![0] === this.config.tokenizer.bos) + this.seqs[idx] = this.seqs[idx]!.slice(numOfTokensToSlice); + } + } + + private trimRight(numOfTokensToSlice: number) { + for (let idx = 0; idx < this.seqs.length - 1; idx++) { + if (this.seqs[idx]!.at(-1) === this.config.tokenizer.eos) + this.seqs[idx] = this.seqs[idx]!.slice(0, -numOfTokensToSlice); + } + } + + private async trimSequences(audioLanguage?: string) { + const numSpecialTokens = (await this.getStartingTokenIds(audioLanguage)) + .length; + this.trimLeft(numSpecialTokens + NUM_TOKENS_TO_SLICE); + this.trimRight(numSpecialTokens + NUM_TOKENS_TO_SLICE); + } - if (!audioLanguage && this.config.isMultilingual) { + // if last chunk is too short combine it with second to last to improve quality + private validateAndFixLastChunk() { + const lastChunkLength = this.chunks.at(-1)!.length / SECOND; + const secondToLastChunkLength = this.chunks.at(-2)!.length / SECOND; + if (lastChunkLength < 5 && secondToLastChunkLength + lastChunkLength < 30) { + this.chunks[this.chunks.length - 2] = [ + ...this.chunks.at(-2)!.slice(0, -this.overlapSeconds * 2), + ...this.chunks.at(-1)!, + ]; + this.chunks = this.chunks.slice(0, -1); + } + } + + private async tokenIdsToText(tokenIds: number[]): Promise { + try { + return TokenizerModule.decode(tokenIds, true); + } catch (e) { this.onErrorCallback?.( - new Error( - 'Language parameter was not provided for a multilingual model. Please pass lang parameter to the transcribe.' - ) + new Error(`An error has occurred when decoding the token ids: ${e}`) ); return ''; - } else if (audioLanguage && !this.config.isMultilingual) { - this.onErrorCallback?.( - new Error( - 'Language parameter was passed to a non-multilingual model. Please either use a multilingual version or delete the lang parameter.' - ) - ); + } + } + + public async transcribe( + waveform: number[], + audioLanguage?: SpeechToTextLanguage + ): Promise { + try { + if (!this.isReady) throw Error(getError(ETError.ModuleNotLoaded)); + if (this.isGenerating || this.streaming) + throw Error(getError(ETError.ModelGenerating)); + if (!!audioLanguage !== this.config.isMultilingual) + throw new Error(getError(ETError.MultilingualConfiguration)); + } catch (e) { + this.onErrorCallback?.(e); return ''; } // Making sure that the error is not set when we get there - this.onErrorCallback?.(undefined); this.isGeneratingCallback(true); - this.chunkWaveform(waveform); + this.resetState(); + this.waveform = waveform; + this.chunkWaveform(); + this.validateAndFixLastChunk(); - this.sequence = []; - let seqs: number[][] = []; - let prevSeq: number[] = []; for (let chunkId = 0; chunkId < this.chunks.length; chunkId++) { - let prevSeqTokenIdx = 0; - let finalSeq: number[] = []; - - let seq = await this.getStartingTokenIds(audioLanguage); - const numSpecialTokens = seq.length; - let encoderOutput; - try { - encoderOutput = await this.speechToTextNativeModule.encode( - this.chunks!.at(chunkId)! - ); - } catch (error) { - this.onErrorCallback?.(`An error has occurred while encoding ${error}`); - return ''; - } - - let lastToken = seq.at(-1) as number; - while (lastToken !== this.config.tokenizer.eos) { - try { - // Returns a single predicted token - lastToken = await this.speechToTextNativeModule.decode( - seq, - encoderOutput - ); - } catch (error) { - this.onErrorCallback?.( - `An error has occurred while decoding: ${error}` - ); - return ''; - } - seq.push(lastToken); - if ( - seqs.length > 0 && - seq.length < seqs.at(-1)!.length && - seq.length % 3 !== 0 - ) { - prevSeq.push(seqs.at(-1)![prevSeqTokenIdx++]!); - this.decodedTranscribeCallback(prevSeq); - } - } - + const seq = await this.decodeChunk(this.chunks!.at(chunkId)!); + // whole audio is inside one chunk, no processing required if (this.chunks.length === 1) { - finalSeq = seq; - this.sequence = finalSeq; - this.decodedTranscribeCallback(finalSeq); + this.sequence = seq; + this.decodedTranscribeCallback(seq); break; } + this.seqs.push(seq); - // Remove starting tokenIds and 3 additional ones - if (seqs.length === 0) { - seqs = [seq.slice(0, -(numSpecialTokens + NUM_TOKENS_TO_SLICE))]; - } else if (seqs.length === this.chunks.length - 1) { - seqs.push(seq.slice(numSpecialTokens + NUM_TOKENS_TO_SLICE)); - } else { - seqs.push( - seq.slice( - numSpecialTokens + NUM_TOKENS_TO_SLICE, - -(numSpecialTokens + NUM_TOKENS_TO_SLICE) - ) - ); - } - if (seqs.length < 2) { - continue; - } + // Remove starting tokenIds and some additional ones + await this.trimSequences(audioLanguage); - const maxInd = longCommonInfPref( - seqs.at(-2)!, - seqs.at(-1)!, - HAMMING_DIST_THRESHOLD - ); - finalSeq = [...this.sequence, ...seqs.at(-2)!.slice(0, maxInd)]; - this.sequence = finalSeq; - this.decodedTranscribeCallback(finalSeq); - prevSeq = finalSeq; + if (this.seqs.length < 2) continue; + + this.prevSeq = await this.handleOverlaps(this.seqs); // last sequence processed - if (seqs.length === this.chunks.length) { - finalSeq = [...this.sequence, ...seqs.at(-1)!]; - this.sequence = finalSeq; - this.decodedTranscribeCallback(finalSeq); - prevSeq = finalSeq; + // overlaps are already handled, so just append the last seq + if (this.seqs.length === this.chunks.length) { + this.sequence = [...this.sequence, ...this.seqs.at(-1)!]; + this.decodedTranscribeCallback(this.sequence); + this.prevSeq = this.sequence; } } const decodedText = await this.tokenIdsToText(this.sequence); @@ -334,14 +353,99 @@ export class SpeechToTextController { return decodedText; } - private async tokenIdsToText(tokenIds: number[]): Promise { + public async streamingTranscribe( + streamAction: STREAMING_ACTION, + waveform?: number[], + audioLanguage?: SpeechToTextLanguage + ): Promise { try { - return this.nativeTokenizer.decode(tokenIds, true); + if (!this.isReady) throw Error(getError(ETError.ModuleNotLoaded)); + if (!!audioLanguage !== this.config.isMultilingual) + throw new Error(getError(ETError.MultilingualConfiguration)); + + if ( + streamAction === STREAMING_ACTION.START && + !this.streaming && + this.isGenerating + ) + throw Error(getError(ETError.ModelGenerating)); + if (streamAction === STREAMING_ACTION.START && this.streaming) + throw Error(getError(ETError.ModelGenerating)); + if (streamAction === STREAMING_ACTION.DATA && !this.streaming) + throw Error(getError(ETError.StreamingNotStarted)); + if (streamAction === STREAMING_ACTION.STOP && !this.streaming) + throw Error(getError(ETError.StreamingNotStarted)); + if (streamAction === STREAMING_ACTION.DATA && !waveform) + throw new Error(getError(ETError.MissingDataChunk)); } catch (e) { - this.onErrorCallback?.( - new Error(`An error has occurred when decoding the token ids: ${e}`) - ); + this.onErrorCallback?.(e); return ''; } + + if (streamAction === STREAMING_ACTION.START) { + this.resetState(); + this.streaming = true; + this.isGeneratingCallback(true); + } + + this.waveform = [...this.waveform, ...(waveform || [])]; + + // while buffer has at least required size get chunk and decode + while (this.waveform.length >= this.expectedChunkLength()) { + const chunk = this.waveform.slice( + 0, + this.windowSize + + this.overlapSeconds * (1 + Number(this.seqs.length > 0)) + ); + this.chunks = [chunk]; //save last chunk for STREAMING_ACTION.STOP + this.waveform = this.waveform.slice( + this.windowSize - this.overlapSeconds * Number(this.seqs.length === 0) + ); + const seq = await this.decodeChunk(chunk, audioLanguage); + this.seqs.push(seq); + await this.trimSequences(audioLanguage); + + if (this.seqs.length < 2) continue; + await this.handleOverlaps(this.seqs); + } + + // got final package, process all remaining waveform data + // since we run the loop above the waveform has at most one chunk in it + if (streamAction === STREAMING_ACTION.STOP) { + // pad remaining waveform data with previous chunk to this.windowSize + 2 * this.overlapSeconds + const chunk = this.chunks.length + ? [ + ...this.chunks[0]!.slice(0, this.windowSize), + ...this.waveform, + ].slice(-this.windowSize - 2 * this.overlapSeconds) + : this.waveform; + + this.waveform = []; + const seq = await this.decodeChunk(chunk, audioLanguage); + this.seqs.push(seq); + await this.trimSequences(audioLanguage); + + if (this.seqs.length === 1) { + this.sequence = this.seqs[0]!; + } else { + await this.handleOverlaps(this.seqs); + this.sequence = [...this.sequence, ...this.seqs.at(-1)!]; + } + this.decodedTranscribeCallback(this.sequence); + this.isGeneratingCallback(false); + this.streaming = false; + } + + const decodedText = await this.tokenIdsToText(this.sequence); + + return decodedText; + } + + public async encode(waveform: number[]) { + return await this.speechToTextNativeModule.encode(waveform); + } + + public async decode(seq: number[], encodings?: number[]) { + return await this.speechToTextNativeModule.decode(seq, encodings); } } diff --git a/src/hooks/natural_language_processing/useSpeechToText.ts b/src/hooks/natural_language_processing/useSpeechToText.ts index 536202f0..9a9f2455 100644 --- a/src/hooks/natural_language_processing/useSpeechToText.ts +++ b/src/hooks/natural_language_processing/useSpeechToText.ts @@ -1,6 +1,7 @@ import { useEffect, useState } from 'react'; import { SpeechToTextController } from '../../controllers/SpeechToTextController'; import { ResourceSource } from '../../types/common'; +import { STREAMING_ACTION } from '../../constants/sttDefaults'; import { AvailableModels, SpeechToTextLanguage } from '../../types/stt'; interface SpeechToTextModule { @@ -14,6 +15,11 @@ interface SpeechToTextModule { input: number[], audioLanguage?: SpeechToTextLanguage ) => ReturnType; + streamingTranscribe: ( + streamAction: STREAMING_ACTION, + input?: number[], + audioLanguage?: SpeechToTextLanguage + ) => ReturnType; } export const useSpeechToText = ({ @@ -80,5 +86,10 @@ export const useSpeechToText = ({ error, transcribe: (waveform: number[], audioLanguage?: SpeechToTextLanguage) => model.transcribe(waveform, audioLanguage), + streamingTranscribe: ( + streamAction: STREAMING_ACTION, + waveform?: number[], + audioLanguage?: SpeechToTextLanguage + ) => model.streamingTranscribe(streamAction, waveform, audioLanguage), }; }; diff --git a/src/index.tsx b/src/index.tsx index 9519e2aa..1871fd44 100644 --- a/src/index.tsx +++ b/src/index.tsx @@ -44,3 +44,4 @@ export { SpeechToTextLanguage }; export * from './constants/modelUrls'; export * from './constants/ocr/models'; export * from './constants/llmDefaults'; +export { STREAMING_ACTION, MODES } from './constants/sttDefaults'; diff --git a/src/native/NativeSpeechToText.ts b/src/native/NativeSpeechToText.ts index b140eac3..279ab9eb 100644 --- a/src/native/NativeSpeechToText.ts +++ b/src/native/NativeSpeechToText.ts @@ -9,7 +9,7 @@ export interface Spec extends TurboModule { ): Promise; generate(waveform: number[]): Promise; encode(input: number[]): Promise; - decode(prevTokens: number[], encoderOutput: number[]): Promise; + decode(prevTokens: number[], encoderOutput?: number[]): Promise; readonly onToken: EventEmitter; } From 135eb72fe835863cdc3fa4c9d0731f0af935c023 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mateusz=20Kopci=C5=84ski?= Date: Thu, 15 May 2025 14:30:34 +0200 Subject: [PATCH 3/3] missing import --- examples/llm/screens/LLMScreen.tsx | 159 ++++++++++++++--------------- 1 file changed, 78 insertions(+), 81 deletions(-) diff --git a/examples/llm/screens/LLMScreen.tsx b/examples/llm/screens/LLMScreen.tsx index 5fde314f..c2f5d06e 100644 --- a/examples/llm/screens/LLMScreen.tsx +++ b/examples/llm/screens/LLMScreen.tsx @@ -1,4 +1,4 @@ -import { useRef, useState } from 'react'; +import { useEffect, useRef, useState } from 'react'; import { Keyboard, KeyboardAvoidingView, @@ -10,7 +10,6 @@ import { View, TextInput, } from 'react-native'; -import { SafeAreaView } from 'react-native-safe-area-context'; import SWMIcon from '../assets/icons/swm_icon.svg'; import Spinner from 'react-native-loading-spinner-overlay'; import { @@ -125,88 +124,86 @@ export default function LLMScreen({ textContent={`Loading the model ${(llm.downloadProgress * 100).toFixed(0)} %\nLoading the speech model ${(speechToText.downloadProgress * 100).toFixed(0)} %`} /> ) : ( - - - - - - llm 3.2 1B QLoRA x Whisper + + + + + Qwen 3 x Whisper + + {llm.messageHistory.length || speechToText.sequence ? ( + + + + ) : ( + + Hello! 👋 + + What can I help you with? + - {llm.messageHistory.length || speechToText.sequence ? ( - - - + )} + + setIsTextInputFocused(true)} + onBlur={() => setIsTextInputFocused(false)} + editable={!isRecording && !llm.isGenerating} + style={{ + ...styles.textInput, + borderColor: isTextInputFocused + ? ColorPalette.blueDark + : ColorPalette.blueLight, + display: isRecording ? 'none' : 'flex', + }} + placeholder="Your message" + placeholderTextColor={'#C1C6E5'} + multiline={true} + ref={textInputRef} + onChangeText={(text: string) => setUserInput(text)} + /> + {llm.isGenerating ? ( + + + + ) : !userInput ? ( + + {isRecording ? ( + + ) : ( + + )} + ) : ( - - Hello! 👋 - - What can I help you with? - - + !llm.isGenerating && (await sendMessage())} + > + + )} - - setIsTextInputFocused(true)} - onBlur={() => setIsTextInputFocused(false)} - editable={!isRecording && !llm.isGenerating} - style={{ - ...styles.textInput, - borderColor: isTextInputFocused - ? ColorPalette.blueDark - : ColorPalette.blueLight, - display: isRecording ? 'none' : 'flex', - }} - placeholder="Your message" - placeholderTextColor={'#C1C6E5'} - multiline={true} - ref={textInputRef} - onChangeText={(text: string) => setUserInput(text)} - /> - {llm.isGenerating ? ( - - - - ) : !userInput ? ( - - {isRecording ? ( - - ) : ( - - )} - - ) : ( - !llm.isGenerating && (await sendMessage())} - > - - - )} - - - - + + + ); }