@inferrlm/react-native-mlx 0.2.0-inferrlm.2 → 0.4.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (102) hide show
  1. package/MLXReactNative.podspec +9 -3
  2. package/ios/Sources/AudioCaptureManager.swift +110 -0
  3. package/ios/Sources/HybridLLM.swift +562 -74
  4. package/ios/Sources/HybridSTT.swift +202 -0
  5. package/ios/Sources/HybridTTS.swift +145 -0
  6. package/ios/Sources/JSONHelpers.swift +9 -0
  7. package/ios/Sources/ModelDownloader.swift +26 -12
  8. package/ios/Sources/StreamEventEmitter.swift +132 -0
  9. package/ios/Sources/ThinkingStateMachine.swift +206 -0
  10. package/nitrogen/generated/ios/MLXReactNative+autolinking.rb +1 -1
  11. package/nitrogen/generated/ios/MLXReactNative-Swift-Cxx-Bridge.cpp +76 -1
  12. package/nitrogen/generated/ios/MLXReactNative-Swift-Cxx-Bridge.hpp +338 -1
  13. package/nitrogen/generated/ios/MLXReactNative-Swift-Cxx-Umbrella.hpp +28 -1
  14. package/nitrogen/generated/ios/MLXReactNativeAutolinking.mm +17 -1
  15. package/nitrogen/generated/ios/MLXReactNativeAutolinking.swift +31 -1
  16. package/nitrogen/generated/ios/c++/HybridLLMSpecSwift.cpp +1 -1
  17. package/nitrogen/generated/ios/c++/HybridLLMSpecSwift.hpp +18 -3
  18. package/nitrogen/generated/ios/c++/HybridModelManagerSpecSwift.cpp +1 -1
  19. package/nitrogen/generated/ios/c++/HybridModelManagerSpecSwift.hpp +1 -1
  20. package/nitrogen/generated/ios/c++/HybridSTTSpecSwift.cpp +11 -0
  21. package/nitrogen/generated/ios/c++/HybridSTTSpecSwift.hpp +149 -0
  22. package/nitrogen/generated/ios/c++/HybridTTSSpecSwift.cpp +11 -0
  23. package/nitrogen/generated/ios/c++/HybridTTSSpecSwift.hpp +128 -0
  24. package/nitrogen/generated/ios/swift/Func_std__shared_ptr_Promise_std__shared_ptr_Promise_std__shared_ptr_AnyMap______std__shared_ptr_AnyMap_.swift +62 -0
  25. package/nitrogen/generated/ios/swift/Func_void.swift +1 -1
  26. package/nitrogen/generated/ios/swift/Func_void_bool.swift +1 -1
  27. package/nitrogen/generated/ios/swift/Func_void_double.swift +1 -1
  28. package/nitrogen/generated/ios/swift/Func_void_std__exception_ptr.swift +1 -1
  29. package/nitrogen/generated/ios/swift/Func_void_std__shared_ptr_AnyMap_.swift +47 -0
  30. package/nitrogen/generated/ios/swift/Func_void_std__shared_ptr_ArrayBuffer_.swift +47 -0
  31. package/nitrogen/generated/ios/swift/Func_void_std__shared_ptr_Promise_std__shared_ptr_AnyMap___.swift +67 -0
  32. package/nitrogen/generated/ios/swift/Func_void_std__string.swift +1 -1
  33. package/nitrogen/generated/ios/swift/Func_void_std__string_std__string.swift +47 -0
  34. package/nitrogen/generated/ios/swift/Func_void_std__vector_std__string_.swift +1 -1
  35. package/nitrogen/generated/ios/swift/GenerationStats.swift +14 -3
  36. package/nitrogen/generated/ios/swift/HybridLLMSpec.swift +3 -2
  37. package/nitrogen/generated/ios/swift/HybridLLMSpec_cxx.swift +38 -2
  38. package/nitrogen/generated/ios/swift/HybridModelManagerSpec.swift +1 -1
  39. package/nitrogen/generated/ios/swift/HybridModelManagerSpec_cxx.swift +1 -1
  40. package/nitrogen/generated/ios/swift/HybridSTTSpec.swift +66 -0
  41. package/nitrogen/generated/ios/swift/HybridSTTSpec_cxx.swift +286 -0
  42. package/nitrogen/generated/ios/swift/HybridTTSSpec.swift +63 -0
  43. package/nitrogen/generated/ios/swift/HybridTTSSpec_cxx.swift +229 -0
  44. package/nitrogen/generated/ios/swift/LLMLoadOptions.swift +44 -2
  45. package/nitrogen/generated/ios/swift/LLMMessage.swift +1 -1
  46. package/nitrogen/generated/ios/swift/STTLoadOptions.swift +66 -0
  47. package/nitrogen/generated/ios/swift/TTSGenerateOptions.swift +78 -0
  48. package/nitrogen/generated/ios/swift/TTSLoadOptions.swift +66 -0
  49. package/nitrogen/generated/ios/swift/ToolDefinition.swift +113 -0
  50. package/nitrogen/generated/ios/swift/ToolParameter.swift +69 -0
  51. package/nitrogen/generated/shared/c++/GenerationStats.hpp +7 -3
  52. package/nitrogen/generated/shared/c++/HybridLLMSpec.cpp +2 -1
  53. package/nitrogen/generated/shared/c++/HybridLLMSpec.hpp +3 -2
  54. package/nitrogen/generated/shared/c++/HybridModelManagerSpec.cpp +1 -1
  55. package/nitrogen/generated/shared/c++/HybridModelManagerSpec.hpp +1 -1
  56. package/nitrogen/generated/shared/c++/HybridSTTSpec.cpp +32 -0
  57. package/nitrogen/generated/shared/c++/HybridSTTSpec.hpp +78 -0
  58. package/nitrogen/generated/shared/c++/HybridTTSSpec.cpp +29 -0
  59. package/nitrogen/generated/shared/c++/HybridTTSSpec.hpp +78 -0
  60. package/nitrogen/generated/shared/c++/LLMLoadOptions.hpp +10 -3
  61. package/nitrogen/generated/shared/c++/LLMMessage.hpp +1 -1
  62. package/nitrogen/generated/shared/c++/STTLoadOptions.hpp +76 -0
  63. package/nitrogen/generated/shared/c++/TTSGenerateOptions.hpp +80 -0
  64. package/nitrogen/generated/shared/c++/TTSLoadOptions.hpp +76 -0
  65. package/nitrogen/generated/shared/c++/ToolDefinition.hpp +93 -0
  66. package/nitrogen/generated/shared/c++/ToolParameter.hpp +87 -0
  67. package/package.json +13 -8
  68. package/src/index.ts +48 -4
  69. package/src/llm.ts +90 -5
  70. package/src/models.ts +347 -0
  71. package/src/specs/LLM.nitro.ts +111 -7
  72. package/src/specs/STT.nitro.ts +35 -0
  73. package/src/specs/TTS.nitro.ts +30 -0
  74. package/src/stt.ts +67 -0
  75. package/src/tool-utils.ts +74 -0
  76. package/src/tts.ts +60 -0
  77. package/lib/module/index.js +0 -6
  78. package/lib/module/index.js.map +0 -1
  79. package/lib/module/llm.js +0 -125
  80. package/lib/module/llm.js.map +0 -1
  81. package/lib/module/modelManager.js +0 -79
  82. package/lib/module/modelManager.js.map +0 -1
  83. package/lib/module/models.js +0 -41
  84. package/lib/module/models.js.map +0 -1
  85. package/lib/module/package.json +0 -1
  86. package/lib/module/specs/LLM.nitro.js +0 -4
  87. package/lib/module/specs/LLM.nitro.js.map +0 -1
  88. package/lib/module/specs/ModelManager.nitro.js +0 -4
  89. package/lib/module/specs/ModelManager.nitro.js.map +0 -1
  90. package/lib/typescript/package.json +0 -1
  91. package/lib/typescript/src/index.d.ts +0 -6
  92. package/lib/typescript/src/index.d.ts.map +0 -1
  93. package/lib/typescript/src/llm.d.ts +0 -87
  94. package/lib/typescript/src/llm.d.ts.map +0 -1
  95. package/lib/typescript/src/modelManager.d.ts +0 -53
  96. package/lib/typescript/src/modelManager.d.ts.map +0 -1
  97. package/lib/typescript/src/models.d.ts +0 -29
  98. package/lib/typescript/src/models.d.ts.map +0 -1
  99. package/lib/typescript/src/specs/LLM.nitro.d.ts +0 -88
  100. package/lib/typescript/src/specs/LLM.nitro.d.ts.map +0 -1
  101. package/lib/typescript/src/specs/ModelManager.nitro.d.ts +0 -41
  102. package/lib/typescript/src/specs/ModelManager.nitro.d.ts.map +0 -1
@@ -0,0 +1,206 @@
1
+ import Foundation
2
+
3
+ struct ThinkingStateMachine {
4
+ enum Output {
5
+ case token(String)
6
+ case thinkingStart
7
+ case thinkingChunk(String)
8
+ case thinkingEnd(String)
9
+ }
10
+
11
+ private enum State {
12
+ case idle
13
+ case bufferingOpenTag(String)
14
+ case inThinking
15
+ case bufferingCloseTag(String)
16
+ }
17
+
18
+ private var state: State = .idle
19
+ private var thinkingContent: String = ""
20
+
21
+ private let openTag = "<think>"
22
+ private let closeTag = "</think>"
23
+
24
+ mutating func process(token: String) -> [Output] {
25
+ var outputs: [Output] = []
26
+ var remaining = token
27
+
28
+ while !remaining.isEmpty {
29
+ switch state {
30
+ case .idle:
31
+ outputs.append(contentsOf: processIdle(&remaining))
32
+
33
+ case .bufferingOpenTag(let buffer):
34
+ outputs.append(contentsOf: processBufferingOpenTag(buffer: buffer, remaining: &remaining))
35
+
36
+ case .inThinking:
37
+ outputs.append(contentsOf: processInThinking(&remaining))
38
+
39
+ case .bufferingCloseTag(let buffer):
40
+ outputs.append(contentsOf: processBufferingCloseTag(buffer: buffer, remaining: &remaining))
41
+ }
42
+ }
43
+
44
+ return outputs
45
+ }
46
+
47
+ mutating func flush() -> [Output] {
48
+ var outputs: [Output] = []
49
+
50
+ switch state {
51
+ case .bufferingOpenTag(let buffer):
52
+ if !buffer.isEmpty {
53
+ outputs.append(.token(buffer))
54
+ }
55
+ case .bufferingCloseTag(let buffer):
56
+ if !buffer.isEmpty {
57
+ outputs.append(.thinkingChunk(buffer))
58
+ }
59
+ outputs.append(.thinkingEnd(thinkingContent + buffer))
60
+ case .inThinking:
61
+ outputs.append(.thinkingEnd(thinkingContent))
62
+ case .idle:
63
+ break
64
+ }
65
+
66
+ state = .idle
67
+ thinkingContent = ""
68
+ return outputs
69
+ }
70
+
71
+ private mutating func processIdle(_ remaining: inout String) -> [Output] {
72
+ var outputs: [Output] = []
73
+
74
+ if let tagRange = remaining.range(of: openTag) {
75
+ let before = String(remaining[..<tagRange.lowerBound])
76
+ if !before.isEmpty {
77
+ outputs.append(.token(before))
78
+ }
79
+ outputs.append(.thinkingStart)
80
+ state = .inThinking
81
+ thinkingContent = ""
82
+ remaining = String(remaining[tagRange.upperBound...])
83
+ } else if let partialMatch = findPartialMatch(remaining, target: openTag) {
84
+ let before = String(remaining[..<partialMatch.range.lowerBound])
85
+ if !before.isEmpty {
86
+ outputs.append(.token(before))
87
+ }
88
+ state = .bufferingOpenTag(partialMatch.matched)
89
+ remaining = ""
90
+ } else {
91
+ outputs.append(.token(remaining))
92
+ remaining = ""
93
+ }
94
+
95
+ return outputs
96
+ }
97
+
98
+ private mutating func processBufferingOpenTag(buffer: String, remaining: inout String) -> [Output] {
99
+ var outputs: [Output] = []
100
+ let combined = buffer + remaining
101
+
102
+ if let tagRange = combined.range(of: openTag) {
103
+ let before = String(combined[..<tagRange.lowerBound])
104
+ if !before.isEmpty {
105
+ outputs.append(.token(before))
106
+ }
107
+ outputs.append(.thinkingStart)
108
+ state = .inThinking
109
+ thinkingContent = ""
110
+ remaining = String(combined[tagRange.upperBound...])
111
+ } else if openTag.hasPrefix(combined) {
112
+ state = .bufferingOpenTag(combined)
113
+ remaining = ""
114
+ } else if let partialMatch = findPartialMatch(combined, target: openTag) {
115
+ let before = String(combined[..<partialMatch.range.lowerBound])
116
+ if !before.isEmpty {
117
+ outputs.append(.token(before))
118
+ }
119
+ state = .bufferingOpenTag(partialMatch.matched)
120
+ remaining = ""
121
+ } else {
122
+ outputs.append(.token(combined))
123
+ state = .idle
124
+ remaining = ""
125
+ }
126
+
127
+ return outputs
128
+ }
129
+
130
+ private mutating func processInThinking(_ remaining: inout String) -> [Output] {
131
+ var outputs: [Output] = []
132
+
133
+ if let tagRange = remaining.range(of: closeTag) {
134
+ let before = String(remaining[..<tagRange.lowerBound])
135
+ if !before.isEmpty {
136
+ thinkingContent += before
137
+ outputs.append(.thinkingChunk(before))
138
+ }
139
+ outputs.append(.thinkingEnd(thinkingContent))
140
+ state = .idle
141
+ thinkingContent = ""
142
+ remaining = String(remaining[tagRange.upperBound...])
143
+ } else if let partialMatch = findPartialMatch(remaining, target: closeTag) {
144
+ let before = String(remaining[..<partialMatch.range.lowerBound])
145
+ if !before.isEmpty {
146
+ thinkingContent += before
147
+ outputs.append(.thinkingChunk(before))
148
+ }
149
+ state = .bufferingCloseTag(partialMatch.matched)
150
+ remaining = ""
151
+ } else {
152
+ thinkingContent += remaining
153
+ outputs.append(.thinkingChunk(remaining))
154
+ remaining = ""
155
+ }
156
+
157
+ return outputs
158
+ }
159
+
160
+ private mutating func processBufferingCloseTag(buffer: String, remaining: inout String) -> [Output] {
161
+ var outputs: [Output] = []
162
+ let combined = buffer + remaining
163
+
164
+ if let tagRange = combined.range(of: closeTag) {
165
+ let before = String(combined[..<tagRange.lowerBound])
166
+ if !before.isEmpty {
167
+ thinkingContent += before
168
+ outputs.append(.thinkingChunk(before))
169
+ }
170
+ outputs.append(.thinkingEnd(thinkingContent))
171
+ state = .idle
172
+ thinkingContent = ""
173
+ remaining = String(combined[tagRange.upperBound...])
174
+ } else if closeTag.hasPrefix(combined) {
175
+ state = .bufferingCloseTag(combined)
176
+ remaining = ""
177
+ } else if let partialMatch = findPartialMatch(combined, target: closeTag) {
178
+ let before = String(combined[..<partialMatch.range.lowerBound])
179
+ if !before.isEmpty {
180
+ thinkingContent += before
181
+ outputs.append(.thinkingChunk(before))
182
+ }
183
+ state = .bufferingCloseTag(partialMatch.matched)
184
+ remaining = ""
185
+ } else {
186
+ thinkingContent += combined
187
+ outputs.append(.thinkingChunk(combined))
188
+ state = .inThinking
189
+ remaining = ""
190
+ }
191
+
192
+ return outputs
193
+ }
194
+
195
+ private func findPartialMatch(_ str: String, target: String) -> (range: Range<String.Index>, matched: String)? {
196
+ for i in stride(from: target.count - 1, through: 1, by: -1) {
197
+ let suffix = String(str.suffix(i))
198
+ let prefix = String(target.prefix(i))
199
+ if suffix == prefix {
200
+ let startIndex = str.index(str.endIndex, offsetBy: -i)
201
+ return (startIndex..<str.endIndex, suffix)
202
+ }
203
+ }
204
+ return nil
205
+ }
206
+ }
@@ -2,7 +2,7 @@
2
2
  # MLXReactNative+autolinking.rb
3
3
  # This file was generated by nitrogen. DO NOT MODIFY THIS FILE.
4
4
  # https://github.com/mrousavy/nitro
5
- # Copyright © 2025 Marc Rousavy @ Margelo
5
+ # Copyright © 2026 Marc Rousavy @ Margelo
6
6
  #
7
7
 
8
8
  # This is a Ruby script that adds all files generated by Nitrogen
@@ -2,7 +2,7 @@
2
2
  /// MLXReactNative-Swift-Cxx-Bridge.cpp
3
3
  /// This file was generated by nitrogen. DO NOT MODIFY THIS FILE.
4
4
  /// https://github.com/mrousavy/nitro
5
- /// Copyright © 2025 Marc Rousavy @ Margelo
5
+ /// Copyright © 2026 Marc Rousavy @ Margelo
6
6
  ///
7
7
 
8
8
  #include "MLXReactNative-Swift-Cxx-Bridge.hpp"
@@ -10,6 +10,8 @@
10
10
  // Include C++ implementation defined types
11
11
  #include "HybridLLMSpecSwift.hpp"
12
12
  #include "HybridModelManagerSpecSwift.hpp"
13
+ #include "HybridSTTSpecSwift.hpp"
14
+ #include "HybridTTSSpecSwift.hpp"
13
15
  #include "MLXReactNative-Swift-Cxx-Umbrella.hpp"
14
16
  #include <NitroModules/NitroDefines.hpp>
15
17
 
@@ -39,6 +41,31 @@ namespace margelo::nitro::mlxreactnative::bridge::swift {
39
41
  };
40
42
  }
41
43
 
44
+ // pragma MARK: std::function<void(const std::shared_ptr<AnyMap>& /* result */)>
45
+ Func_void_std__shared_ptr_AnyMap_ create_Func_void_std__shared_ptr_AnyMap_(void* NON_NULL swiftClosureWrapper) noexcept {
46
+ auto swiftClosure = MLXReactNative::Func_void_std__shared_ptr_AnyMap_::fromUnsafe(swiftClosureWrapper);
47
+ return [swiftClosure = std::move(swiftClosure)](const std::shared_ptr<AnyMap>& result) mutable -> void {
48
+ swiftClosure.call(result);
49
+ };
50
+ }
51
+
52
+ // pragma MARK: std::function<std::shared_ptr<Promise<std::shared_ptr<Promise<std::shared_ptr<AnyMap>>>>>(const std::shared_ptr<AnyMap>& /* args */)>
53
+ Func_std__shared_ptr_Promise_std__shared_ptr_Promise_std__shared_ptr_AnyMap______std__shared_ptr_AnyMap_ create_Func_std__shared_ptr_Promise_std__shared_ptr_Promise_std__shared_ptr_AnyMap______std__shared_ptr_AnyMap_(void* NON_NULL swiftClosureWrapper) noexcept {
54
+ auto swiftClosure = MLXReactNative::Func_std__shared_ptr_Promise_std__shared_ptr_Promise_std__shared_ptr_AnyMap______std__shared_ptr_AnyMap_::fromUnsafe(swiftClosureWrapper);
55
+ return [swiftClosure = std::move(swiftClosure)](const std::shared_ptr<AnyMap>& args) mutable -> std::shared_ptr<Promise<std::shared_ptr<Promise<std::shared_ptr<AnyMap>>>>> {
56
+ auto __result = swiftClosure.call(args);
57
+ return __result;
58
+ };
59
+ }
60
+
61
+ // pragma MARK: std::function<void(const std::shared_ptr<Promise<std::shared_ptr<AnyMap>>>& /* result */)>
62
+ Func_void_std__shared_ptr_Promise_std__shared_ptr_AnyMap___ create_Func_void_std__shared_ptr_Promise_std__shared_ptr_AnyMap___(void* NON_NULL swiftClosureWrapper) noexcept {
63
+ auto swiftClosure = MLXReactNative::Func_void_std__shared_ptr_Promise_std__shared_ptr_AnyMap___::fromUnsafe(swiftClosureWrapper);
64
+ return [swiftClosure = std::move(swiftClosure)](const std::shared_ptr<Promise<std::shared_ptr<AnyMap>>>& result) mutable -> void {
65
+ swiftClosure.call(result);
66
+ };
67
+ }
68
+
42
69
  // pragma MARK: std::function<void(const std::string& /* result */)>
43
70
  Func_void_std__string create_Func_void_std__string(void* NON_NULL swiftClosureWrapper) noexcept {
44
71
  auto swiftClosure = MLXReactNative::Func_void_std__string::fromUnsafe(swiftClosureWrapper);
@@ -47,6 +74,14 @@ namespace margelo::nitro::mlxreactnative::bridge::swift {
47
74
  };
48
75
  }
49
76
 
77
+ // pragma MARK: std::function<void(const std::string& /* toolName */, const std::string& /* args */)>
78
+ Func_void_std__string_std__string create_Func_void_std__string_std__string(void* NON_NULL swiftClosureWrapper) noexcept {
79
+ auto swiftClosure = MLXReactNative::Func_void_std__string_std__string::fromUnsafe(swiftClosureWrapper);
80
+ return [swiftClosure = std::move(swiftClosure)](const std::string& toolName, const std::string& args) mutable -> void {
81
+ swiftClosure.call(toolName, args);
82
+ };
83
+ }
84
+
50
85
  // pragma MARK: std::shared_ptr<HybridLLMSpec>
51
86
  std::shared_ptr<HybridLLMSpec> create_std__shared_ptr_HybridLLMSpec_(void* NON_NULL swiftUnsafePointer) noexcept {
52
87
  MLXReactNative::HybridLLMSpec_cxx swiftPart = MLXReactNative::HybridLLMSpec_cxx::fromUnsafe(swiftUnsafePointer);
@@ -94,5 +129,45 @@ namespace margelo::nitro::mlxreactnative::bridge::swift {
94
129
  MLXReactNative::HybridModelManagerSpec_cxx& swiftPart = swiftWrapper->getSwiftPart();
95
130
  return swiftPart.toUnsafe();
96
131
  }
132
+
133
+ // pragma MARK: std::shared_ptr<HybridSTTSpec>
134
+ std::shared_ptr<HybridSTTSpec> create_std__shared_ptr_HybridSTTSpec_(void* NON_NULL swiftUnsafePointer) noexcept {
135
+ MLXReactNative::HybridSTTSpec_cxx swiftPart = MLXReactNative::HybridSTTSpec_cxx::fromUnsafe(swiftUnsafePointer);
136
+ return std::make_shared<margelo::nitro::mlxreactnative::HybridSTTSpecSwift>(swiftPart);
137
+ }
138
+ void* NON_NULL get_std__shared_ptr_HybridSTTSpec_(std__shared_ptr_HybridSTTSpec_ cppType) {
139
+ std::shared_ptr<margelo::nitro::mlxreactnative::HybridSTTSpecSwift> swiftWrapper = std::dynamic_pointer_cast<margelo::nitro::mlxreactnative::HybridSTTSpecSwift>(cppType);
140
+ #ifdef NITRO_DEBUG
141
+ if (swiftWrapper == nullptr) [[unlikely]] {
142
+ throw std::runtime_error("Class \"HybridSTTSpec\" is not implemented in Swift!");
143
+ }
144
+ #endif
145
+ MLXReactNative::HybridSTTSpec_cxx& swiftPart = swiftWrapper->getSwiftPart();
146
+ return swiftPart.toUnsafe();
147
+ }
148
+
149
+ // pragma MARK: std::function<void(const std::shared_ptr<ArrayBuffer>& /* result */)>
150
+ Func_void_std__shared_ptr_ArrayBuffer_ create_Func_void_std__shared_ptr_ArrayBuffer_(void* NON_NULL swiftClosureWrapper) noexcept {
151
+ auto swiftClosure = MLXReactNative::Func_void_std__shared_ptr_ArrayBuffer_::fromUnsafe(swiftClosureWrapper);
152
+ return [swiftClosure = std::move(swiftClosure)](const std::shared_ptr<ArrayBuffer>& result) mutable -> void {
153
+ swiftClosure.call(ArrayBufferHolder(result));
154
+ };
155
+ }
156
+
157
+ // pragma MARK: std::shared_ptr<HybridTTSSpec>
158
+ std::shared_ptr<HybridTTSSpec> create_std__shared_ptr_HybridTTSSpec_(void* NON_NULL swiftUnsafePointer) noexcept {
159
+ MLXReactNative::HybridTTSSpec_cxx swiftPart = MLXReactNative::HybridTTSSpec_cxx::fromUnsafe(swiftUnsafePointer);
160
+ return std::make_shared<margelo::nitro::mlxreactnative::HybridTTSSpecSwift>(swiftPart);
161
+ }
162
+ void* NON_NULL get_std__shared_ptr_HybridTTSSpec_(std__shared_ptr_HybridTTSSpec_ cppType) {
163
+ std::shared_ptr<margelo::nitro::mlxreactnative::HybridTTSSpecSwift> swiftWrapper = std::dynamic_pointer_cast<margelo::nitro::mlxreactnative::HybridTTSSpecSwift>(cppType);
164
+ #ifdef NITRO_DEBUG
165
+ if (swiftWrapper == nullptr) [[unlikely]] {
166
+ throw std::runtime_error("Class \"HybridTTSSpec\" is not implemented in Swift!");
167
+ }
168
+ #endif
169
+ MLXReactNative::HybridTTSSpec_cxx& swiftPart = swiftWrapper->getSwiftPart();
170
+ return swiftPart.toUnsafe();
171
+ }
97
172
 
98
173
  } // namespace margelo::nitro::mlxreactnative::bridge::swift