@mobileai/react-native 0.4.2 → 0.4.4
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +23 -3
- package/lib/module/components/AIAgent.js +216 -5
- package/lib/module/components/AIAgent.js.map +1 -1
- package/lib/module/components/AgentChatBar.js +358 -36
- package/lib/module/components/AgentChatBar.js.map +1 -1
- package/lib/module/core/AgentRuntime.js +122 -6
- package/lib/module/core/AgentRuntime.js.map +1 -1
- package/lib/module/core/systemPrompt.js +57 -0
- package/lib/module/core/systemPrompt.js.map +1 -1
- package/lib/module/index.js +8 -0
- package/lib/module/index.js.map +1 -1
- package/lib/module/providers/GeminiProvider.js +108 -85
- package/lib/module/providers/GeminiProvider.js.map +1 -1
- package/lib/module/services/AudioInputService.js +128 -0
- package/lib/module/services/AudioInputService.js.map +1 -0
- package/lib/module/services/AudioOutputService.js +154 -0
- package/lib/module/services/AudioOutputService.js.map +1 -0
- package/lib/module/services/VoiceService.js +361 -0
- package/lib/module/services/VoiceService.js.map +1 -0
- package/lib/module/utils/audioUtils.js +49 -0
- package/lib/module/utils/audioUtils.js.map +1 -0
- package/lib/module/utils/logger.js +21 -4
- package/lib/module/utils/logger.js.map +1 -1
- package/lib/typescript/babel.config.d.ts +10 -0
- package/lib/typescript/babel.config.d.ts.map +1 -0
- package/lib/typescript/eslint.config.d.mts +3 -0
- package/lib/typescript/eslint.config.d.mts.map +1 -0
- package/lib/typescript/fetch-models.d.mts +2 -0
- package/lib/typescript/fetch-models.d.mts.map +1 -0
- package/lib/typescript/list-all-models.d.mts +2 -0
- package/lib/typescript/list-all-models.d.mts.map +1 -0
- package/lib/typescript/list-models.d.mts +2 -0
- package/lib/typescript/list-models.d.mts.map +1 -0
- package/lib/typescript/src/components/AIAgent.d.ts +8 -2
- package/lib/typescript/src/components/AIAgent.d.ts.map +1 -1
- package/lib/typescript/src/components/AgentChatBar.d.ts +19 -2
- package/lib/typescript/src/components/AgentChatBar.d.ts.map +1 -1
- package/lib/typescript/src/core/AgentRuntime.d.ts +17 -1
- package/lib/typescript/src/core/AgentRuntime.d.ts.map +1 -1
- package/lib/typescript/src/core/systemPrompt.d.ts +8 -0
- package/lib/typescript/src/core/systemPrompt.d.ts.map +1 -1
- package/lib/typescript/src/core/types.d.ts +24 -1
- package/lib/typescript/src/core/types.d.ts.map +1 -1
- package/lib/typescript/src/index.d.ts +6 -1
- package/lib/typescript/src/index.d.ts.map +1 -1
- package/lib/typescript/src/providers/GeminiProvider.d.ts +22 -18
- package/lib/typescript/src/providers/GeminiProvider.d.ts.map +1 -1
- package/lib/typescript/src/services/AudioInputService.d.ts +31 -0
- package/lib/typescript/src/services/AudioInputService.d.ts.map +1 -0
- package/lib/typescript/src/services/AudioOutputService.d.ts +34 -0
- package/lib/typescript/src/services/AudioOutputService.d.ts.map +1 -0
- package/lib/typescript/src/services/VoiceService.d.ts +73 -0
- package/lib/typescript/src/services/VoiceService.d.ts.map +1 -0
- package/lib/typescript/src/utils/audioUtils.d.ts +17 -0
- package/lib/typescript/src/utils/audioUtils.d.ts.map +1 -0
- package/lib/typescript/src/utils/logger.d.ts +4 -0
- package/lib/typescript/src/utils/logger.d.ts.map +1 -1
- package/package.json +24 -8
- package/src/components/AIAgent.tsx +222 -3
- package/src/components/AgentChatBar.tsx +487 -42
- package/src/core/AgentRuntime.ts +131 -2
- package/src/core/systemPrompt.ts +62 -0
- package/src/core/types.ts +30 -0
- package/src/index.ts +16 -0
- package/src/providers/GeminiProvider.ts +105 -89
- package/src/services/AudioInputService.ts +141 -0
- package/src/services/AudioOutputService.ts +167 -0
- package/src/services/VoiceService.ts +407 -0
- package/src/utils/audioUtils.ts +54 -0
- package/src/utils/logger.ts +24 -7
package/README.md
CHANGED
|
@@ -23,6 +23,8 @@ Wrap your navigation with `<AIAgent>`. The AI automatically understands your ent
|
|
|
23
23
|
- 🔒 **Production-grade security** — Element gating, content masking, lifecycle hooks, human-in-the-loop confirmation.
|
|
24
24
|
- 🧩 **Custom actions** — Expose any business logic (checkout, API calls) as AI-callable tools with `useAction`.
|
|
25
25
|
- 🌐 **MCP bridge** — Let external AI agents (OpenClaw, Claude Desktop) control your app remotely.
|
|
26
|
+
- 🎙️ **Live Agent (Voice Mode)** — Real-time conversational AI that sees your screen and takes action while you speak.
|
|
27
|
+
- 🎤 **Voice Dictation** — Built-in on-device speech-to-text for the text chat mode.
|
|
26
28
|
- 🌍 **Bilingual** — English and Arabic support built-in.
|
|
27
29
|
|
|
28
30
|
## 📦 Installation
|
|
@@ -33,7 +35,24 @@ npm install @mobileai/react-native
|
|
|
33
35
|
npm install react-native-agentic-ai
|
|
34
36
|
```
|
|
35
37
|
|
|
36
|
-
No native modules required. Works with Expo managed workflow out of the box — **no eject needed**.
|
|
38
|
+
No native modules required by default. Works with Expo managed workflow out of the box — **no eject needed**.
|
|
39
|
+
|
|
40
|
+
### Optional Native Dependencies
|
|
41
|
+
|
|
42
|
+
If you want to use **Live Agent (Voice)**, **Text Mode Dictation**, or **Screenshots** (for image/video content), install these optional peer dependencies:
|
|
43
|
+
|
|
44
|
+
```bash
|
|
45
|
+
# For Voice / Live Agent mode:
|
|
46
|
+
npx expo install react-native-audio-api
|
|
47
|
+
|
|
48
|
+
# For Text mode voice dictation (mic button):
|
|
49
|
+
npx expo install expo-speech-recognition
|
|
50
|
+
|
|
51
|
+
# For Screenshots (when asking AI "what do you see in this image?"):
|
|
52
|
+
npx expo install react-native-view-shot
|
|
53
|
+
```
|
|
54
|
+
|
|
55
|
+
> **Note on Permissions**: Ensure you add Microphone permissions (`NSMicrophoneUsageDescription` / `RECORD_AUDIO`) to your `app.json` or `Info.plist`/`AndroidManifest.xml` if using the audio packages.
|
|
37
56
|
|
|
38
57
|
## 🚀 Quick Start
|
|
39
58
|
|
|
@@ -61,14 +80,14 @@ A floating chat bar appears automatically. Ask the AI to navigate, tap buttons,
|
|
|
61
80
|
|
|
62
81
|
### `<AIAgent>` Component
|
|
63
82
|
|
|
64
|
-
The root provider. Wrap your app once at the top level.
|
|
83
|
+
The root provider. Wrap your app once at the top level. You can toggle between Text and Live Agent (Voice) modes.
|
|
65
84
|
|
|
66
85
|
| Prop | Type | Default | Description |
|
|
67
86
|
|------|------|---------|-------------|
|
|
68
87
|
| `apiKey` | `string` | — | **Required.** Gemini API key. |
|
|
69
88
|
| `model` | `string` | `'gemini-2.5-flash'` | Gemini model name. |
|
|
70
89
|
| `navRef` | `NavigationContainerRef` | — | Navigation ref for auto-navigation. |
|
|
71
|
-
| `language` | `'en' \| 'ar'` | `'en'` | UI language. |
|
|
90
|
+
| `language` | `'en' \| 'ar'` | `'en'` | UI language. Forces Gemini Voice to speak the chosen dialect natively. |
|
|
72
91
|
| `maxSteps` | `number` | `10` | Max steps per task. |
|
|
73
92
|
| `showChatBar` | `boolean` | `true` | Show the floating chat bar. |
|
|
74
93
|
| `onResult` | `(result) => void` | — | Called when the agent finishes. |
|
|
@@ -249,6 +268,7 @@ This starts two servers:
|
|
|
249
268
|
| `tap(index)` | Tap any interactive element. Works universally on buttons, switches, checkboxes, and custom components. |
|
|
250
269
|
| `type(index, text)` | Type text into a text-input. |
|
|
251
270
|
| `navigate(screen)` | Navigate to a screen. |
|
|
271
|
+
| `capture_screenshot(reason)` | Capture the current screen as an image. Called on-demand by the AI (requires `react-native-view-shot`). |
|
|
252
272
|
| `done(text)` | Complete the task with a response. |
|
|
253
273
|
| `ask_user(question)` | Ask the user for clarification. |
|
|
254
274
|
|
|
@@ -18,12 +18,17 @@ import { AgentContext } from "../hooks/useAction.js";
|
|
|
18
18
|
import { AgentChatBar } from "./AgentChatBar.js";
|
|
19
19
|
import { AgentOverlay } from "./AgentOverlay.js";
|
|
20
20
|
import { logger } from "../utils/logger.js";
|
|
21
|
+
import { buildVoiceSystemPrompt } from "../core/systemPrompt.js";
|
|
21
22
|
import { MCPBridge } from "../core/MCPBridge.js";
|
|
22
|
-
|
|
23
|
+
import { VoiceService } from "../services/VoiceService.js";
|
|
24
|
+
import { AudioInputService } from "../services/AudioInputService.js";
|
|
25
|
+
import { AudioOutputService } from "../services/AudioOutputService.js";
|
|
26
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
23
27
|
// ─── Context ───────────────────────────────────────────────────
|
|
28
|
+
console.log('🚀 AIAgent.tsx MODULE LOADED');
|
|
24
29
|
|
|
25
30
|
// ─── Props ─────────────────────────────────────────────────────
|
|
26
|
-
|
|
31
|
+
|
|
27
32
|
// ─── Component ─────────────────────────────────────────────────
|
|
28
33
|
|
|
29
34
|
export function AIAgent({
|
|
@@ -48,13 +53,42 @@ export function AIAgent({
|
|
|
48
53
|
stepDelay,
|
|
49
54
|
mcpServerUrl,
|
|
50
55
|
router,
|
|
51
|
-
pathname
|
|
56
|
+
pathname,
|
|
57
|
+
enableVoice = false,
|
|
58
|
+
onTokenUsage,
|
|
59
|
+
debug = false
|
|
52
60
|
}) {
|
|
61
|
+
// Configure logger based on debug prop
|
|
62
|
+
React.useEffect(() => {
|
|
63
|
+
console.log('[AIAgent] DEBUG PROP =', debug, '— enabling logger');
|
|
64
|
+
logger.setEnabled(debug);
|
|
65
|
+
if (debug) {
|
|
66
|
+
logger.info('AIAgent', '🔧 Debug logging enabled');
|
|
67
|
+
}
|
|
68
|
+
}, [debug]);
|
|
53
69
|
const rootViewRef = useRef(null);
|
|
54
70
|
const [isThinking, setIsThinking] = useState(false);
|
|
55
71
|
const [statusText, setStatusText] = useState('');
|
|
56
72
|
const [lastResult, setLastResult] = useState(null);
|
|
57
73
|
|
|
74
|
+
// ─── Voice/Live Mode State ──────────────────────────────────
|
|
75
|
+
const [mode, setMode] = useState('text');
|
|
76
|
+
const [isMicActive, setIsMicActive] = useState(false);
|
|
77
|
+
const [isSpeakerMuted, setIsSpeakerMuted] = useState(false);
|
|
78
|
+
const [isAISpeaking, setIsAISpeaking] = useState(false);
|
|
79
|
+
const [isVoiceConnected, setIsVoiceConnected] = useState(false);
|
|
80
|
+
const voiceServiceRef = useRef(null);
|
|
81
|
+
const audioInputRef = useRef(null);
|
|
82
|
+
const audioOutputRef = useRef(null);
|
|
83
|
+
|
|
84
|
+
// Compute available modes from props
|
|
85
|
+
const availableModes = useMemo(() => {
|
|
86
|
+
const modes = ['text'];
|
|
87
|
+
if (enableVoice) modes.push('voice');
|
|
88
|
+
logger.info('AIAgent', `Available modes: ${modes.join(', ')}`);
|
|
89
|
+
return modes;
|
|
90
|
+
}, [enableVoice]);
|
|
91
|
+
|
|
58
92
|
// Ref-based resolver for ask_user — stays alive across renders
|
|
59
93
|
const askUserResolverRef = useRef(null);
|
|
60
94
|
|
|
@@ -79,6 +113,7 @@ export function AIAgent({
|
|
|
79
113
|
router,
|
|
80
114
|
pathname,
|
|
81
115
|
onStatusUpdate: setStatusText,
|
|
116
|
+
onTokenUsage,
|
|
82
117
|
// Page-agent pattern: block the agent loop until user responds
|
|
83
118
|
onAskUser: question => {
|
|
84
119
|
return new Promise(resolve => {
|
|
@@ -93,7 +128,7 @@ export function AIAgent({
|
|
|
93
128
|
setStatusText('');
|
|
94
129
|
});
|
|
95
130
|
}
|
|
96
|
-
}), [apiKey, model, language, maxSteps, interactiveBlacklist, interactiveWhitelist, onBeforeStep, onAfterStep, onBeforeTask, onAfterTask, transformScreenContent, customTools, instructions, stepDelay, mcpServerUrl, router, pathname]);
|
|
131
|
+
}), [apiKey, model, language, maxSteps, interactiveBlacklist, interactiveWhitelist, onBeforeStep, onAfterStep, onBeforeTask, onAfterTask, transformScreenContent, customTools, instructions, stepDelay, mcpServerUrl, router, pathname, onTokenUsage]);
|
|
97
132
|
const provider = useMemo(() => new GeminiProvider(apiKey, model), [apiKey, model]);
|
|
98
133
|
const runtime = useMemo(() => new AgentRuntime(provider, config, rootViewRef.current, navRef),
|
|
99
134
|
// eslint-disable-next-line react-hooks/exhaustive-deps
|
|
@@ -115,6 +150,145 @@ export function AIAgent({
|
|
|
115
150
|
};
|
|
116
151
|
}, [mcpServerUrl, runtime]);
|
|
117
152
|
|
|
153
|
+
// ─── Voice/Live Service Initialization ──────────────────────
|
|
154
|
+
|
|
155
|
+
// Initialize voice services when mode changes to voice or live
|
|
156
|
+
useEffect(() => {
|
|
157
|
+
if (mode === 'text') {
|
|
158
|
+
logger.info('AIAgent', 'Text mode — skipping voice service init');
|
|
159
|
+
return;
|
|
160
|
+
}
|
|
161
|
+
logger.info('AIAgent', `Mode changed to "${mode}" — initializing voice services...`);
|
|
162
|
+
|
|
163
|
+
// Create VoiceService with runtime's built-in tools (navigate, tap, type, done, etc.)
|
|
164
|
+
if (!voiceServiceRef.current) {
|
|
165
|
+
logger.info('AIAgent', 'Creating VoiceService...');
|
|
166
|
+
const runtimeTools = runtime.getTools();
|
|
167
|
+
logger.info('AIAgent', `Registering ${runtimeTools.length} tools with VoiceService: ${runtimeTools.map(t => t.name).join(', ')}`);
|
|
168
|
+
// Build the full voice system prompt (screen format + tool descriptions + guardrails)
|
|
169
|
+
// This gives voice mode the same screen understanding as text mode
|
|
170
|
+
const voicePrompt = buildVoiceSystemPrompt(language, instructions?.system);
|
|
171
|
+
voiceServiceRef.current = new VoiceService({
|
|
172
|
+
apiKey,
|
|
173
|
+
systemPrompt: voicePrompt,
|
|
174
|
+
tools: runtimeTools,
|
|
175
|
+
language
|
|
176
|
+
});
|
|
177
|
+
logger.info('AIAgent', 'VoiceService created with full voice system prompt and tools');
|
|
178
|
+
}
|
|
179
|
+
|
|
180
|
+
// Create AudioOutputService if not exists
|
|
181
|
+
if (!audioOutputRef.current) {
|
|
182
|
+
logger.info('AIAgent', 'Creating AudioOutputService...');
|
|
183
|
+
audioOutputRef.current = new AudioOutputService({
|
|
184
|
+
onError: err => logger.error('AIAgent', `AudioOutput error: ${err}`)
|
|
185
|
+
});
|
|
186
|
+
audioOutputRef.current.initialize().then(ok => {
|
|
187
|
+
logger.info('AIAgent', `AudioOutputService initialized: ${ok}`);
|
|
188
|
+
});
|
|
189
|
+
}
|
|
190
|
+
|
|
191
|
+
// Create AudioInputService if not exists
|
|
192
|
+
if (!audioInputRef.current) {
|
|
193
|
+
logger.info('AIAgent', 'Creating AudioInputService...');
|
|
194
|
+
audioInputRef.current = new AudioInputService({
|
|
195
|
+
// Default 16kHz — Gemini Live API input standard
|
|
196
|
+
onAudioChunk: chunk => {
|
|
197
|
+
logger.debug('AIAgent', `Mic chunk: ${chunk.length} chars`);
|
|
198
|
+
voiceServiceRef.current?.sendAudio(chunk);
|
|
199
|
+
},
|
|
200
|
+
onError: err => logger.error('AIAgent', `AudioInput error: ${err}`),
|
|
201
|
+
onPermissionDenied: () => logger.warn('AIAgent', 'Mic permission denied by user')
|
|
202
|
+
});
|
|
203
|
+
}
|
|
204
|
+
|
|
205
|
+
// Connect VoiceService
|
|
206
|
+
logger.info('AIAgent', 'Connecting VoiceService...');
|
|
207
|
+
voiceServiceRef.current.connect({
|
|
208
|
+
onAudioResponse: audio => {
|
|
209
|
+
logger.info('AIAgent', `Received audio response (${audio.length} chars)`);
|
|
210
|
+
setIsAISpeaking(true);
|
|
211
|
+
audioOutputRef.current?.enqueue(audio);
|
|
212
|
+
},
|
|
213
|
+
onStatusChange: status => {
|
|
214
|
+
logger.info('AIAgent', `Voice status: ${status}`);
|
|
215
|
+
const connected = status === 'connected';
|
|
216
|
+
setIsVoiceConnected(connected);
|
|
217
|
+
if (connected) {
|
|
218
|
+
logger.info('AIAgent', '✅ VoiceService connected — auto-starting mic...');
|
|
219
|
+
// Auto-start mic streaming once WebSocket is ready
|
|
220
|
+
audioInputRef.current?.start().then(ok => {
|
|
221
|
+
if (ok) {
|
|
222
|
+
setIsMicActive(true);
|
|
223
|
+
logger.info('AIAgent', '🎙️ Mic auto-started after connection');
|
|
224
|
+
}
|
|
225
|
+
});
|
|
226
|
+
// Send initial screen context (tree) so the model knows what's on screen
|
|
227
|
+
const initialContext = runtime.getScreenContext();
|
|
228
|
+
voiceServiceRef.current?.sendScreenContext(initialContext);
|
|
229
|
+
logger.info('AIAgent', '📡 Initial screen context sent to voice model');
|
|
230
|
+
}
|
|
231
|
+
},
|
|
232
|
+
onTranscript: (text, isFinal, role) => {
|
|
233
|
+
logger.info('AIAgent', `Transcript [${role}] (final=${isFinal}): "${text}"`);
|
|
234
|
+
},
|
|
235
|
+
onToolCall: async toolCall => {
|
|
236
|
+
logger.info('AIAgent', `Voice tool call: ${toolCall.name}(${JSON.stringify(toolCall.args)})`);
|
|
237
|
+
// Execute the tool via AgentRuntime and send result back to Gemini
|
|
238
|
+
const result = await runtime.executeTool(toolCall.name, toolCall.args);
|
|
239
|
+
logger.info('AIAgent', `Voice tool result: ${result}`);
|
|
240
|
+
voiceServiceRef.current?.sendFunctionResponse(toolCall.name, toolCall.id, {
|
|
241
|
+
result
|
|
242
|
+
});
|
|
243
|
+
|
|
244
|
+
// After tool execution, push updated screen context
|
|
245
|
+
// (the screen may have changed from tap/type/navigate)
|
|
246
|
+
const updatedContext = runtime.getScreenContext();
|
|
247
|
+
voiceServiceRef.current?.sendScreenContext(updatedContext);
|
|
248
|
+
logger.info('AIAgent', '📡 Updated screen context sent after tool call');
|
|
249
|
+
},
|
|
250
|
+
onError: err => {
|
|
251
|
+
logger.error('AIAgent', `VoiceService error: ${err}`);
|
|
252
|
+
},
|
|
253
|
+
onTurnComplete: () => {
|
|
254
|
+
logger.info('AIAgent', 'AI turn complete');
|
|
255
|
+
setIsAISpeaking(false);
|
|
256
|
+
}
|
|
257
|
+
});
|
|
258
|
+
|
|
259
|
+
// Cleanup on mode change back to text
|
|
260
|
+
return () => {
|
|
261
|
+
logger.info('AIAgent', `Cleaning up voice services (leaving "${mode}" mode)`);
|
|
262
|
+
voiceServiceRef.current?.disconnect();
|
|
263
|
+
voiceServiceRef.current = null; // Ensure fresh instance on next connect
|
|
264
|
+
audioInputRef.current?.stop();
|
|
265
|
+
setIsMicActive(false);
|
|
266
|
+
setIsAISpeaking(false);
|
|
267
|
+
setIsVoiceConnected(false);
|
|
268
|
+
};
|
|
269
|
+
// eslint-disable-next-line react-hooks/exhaustive-deps
|
|
270
|
+
}, [mode, apiKey, runtime, language, instructions]);
|
|
271
|
+
|
|
272
|
+
// ─── Stop Voice Session (full cleanup) ─────────────────────
|
|
273
|
+
|
|
274
|
+
const stopVoiceSession = useCallback(() => {
|
|
275
|
+
logger.info('AIAgent', '🛑 Stopping voice session (full cleanup)...');
|
|
276
|
+
// 1. Stop mic input
|
|
277
|
+
audioInputRef.current?.stop();
|
|
278
|
+
// 2. Stop audio output (clear queued chunks)
|
|
279
|
+
audioOutputRef.current?.stop();
|
|
280
|
+
// 3. Disconnect WebSocket
|
|
281
|
+
voiceServiceRef.current?.disconnect();
|
|
282
|
+
voiceServiceRef.current = null;
|
|
283
|
+
// 4. Reset state
|
|
284
|
+
setIsMicActive(false);
|
|
285
|
+
setIsAISpeaking(false);
|
|
286
|
+
setIsVoiceConnected(false);
|
|
287
|
+
// 5. Switch back to text mode (triggers cleanup effect naturally)
|
|
288
|
+
setMode('text');
|
|
289
|
+
logger.info('AIAgent', '🛑 Voice session fully stopped');
|
|
290
|
+
}, [runtime]);
|
|
291
|
+
|
|
118
292
|
// ─── Execute ──────────────────────────────────────────────────
|
|
119
293
|
|
|
120
294
|
const handleSend = useCallback(async message => {
|
|
@@ -173,7 +347,44 @@ export function AIAgent({
|
|
|
173
347
|
isThinking: isThinking,
|
|
174
348
|
lastResult: lastResult,
|
|
175
349
|
language: language,
|
|
176
|
-
onDismiss: () => setLastResult(null)
|
|
350
|
+
onDismiss: () => setLastResult(null),
|
|
351
|
+
availableModes: availableModes,
|
|
352
|
+
mode: mode,
|
|
353
|
+
onModeChange: newMode => {
|
|
354
|
+
logger.info('AIAgent', `Mode change: ${mode} → ${newMode}`);
|
|
355
|
+
setMode(newMode);
|
|
356
|
+
},
|
|
357
|
+
isMicActive: isMicActive,
|
|
358
|
+
isSpeakerMuted: isSpeakerMuted,
|
|
359
|
+
isAISpeaking: isAISpeaking,
|
|
360
|
+
onStopSession: stopVoiceSession,
|
|
361
|
+
isVoiceConnected: isVoiceConnected,
|
|
362
|
+
onMicToggle: active => {
|
|
363
|
+
if (active && !isVoiceConnected) {
|
|
364
|
+
logger.warn('AIAgent', 'Cannot toggle mic — VoiceService not connected yet');
|
|
365
|
+
return;
|
|
366
|
+
}
|
|
367
|
+
logger.info('AIAgent', `Mic toggle: ${active ? 'ON' : 'OFF'}`);
|
|
368
|
+
setIsMicActive(active);
|
|
369
|
+
if (active) {
|
|
370
|
+
logger.info('AIAgent', 'Starting AudioInput...');
|
|
371
|
+
audioInputRef.current?.start().then(ok => {
|
|
372
|
+
logger.info('AIAgent', `AudioInput start result: ${ok}`);
|
|
373
|
+
});
|
|
374
|
+
} else {
|
|
375
|
+
logger.info('AIAgent', 'Stopping AudioInput...');
|
|
376
|
+
audioInputRef.current?.stop();
|
|
377
|
+
}
|
|
378
|
+
},
|
|
379
|
+
onSpeakerToggle: muted => {
|
|
380
|
+
logger.info('AIAgent', `Speaker toggle: ${muted ? 'MUTED' : 'UNMUTED'}`);
|
|
381
|
+
setIsSpeakerMuted(muted);
|
|
382
|
+
if (muted) {
|
|
383
|
+
audioOutputRef.current?.mute();
|
|
384
|
+
} else {
|
|
385
|
+
audioOutputRef.current?.unmute();
|
|
386
|
+
}
|
|
387
|
+
}
|
|
177
388
|
})]
|
|
178
389
|
});
|
|
179
390
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["React","useCallback","useEffect","useMemo","useRef","useState","View","StyleSheet","AgentRuntime","GeminiProvider","AgentContext","AgentChatBar","AgentOverlay","logger","MCPBridge","jsx","_jsx","jsxs","_jsxs","AIAgent","apiKey","model","navRef","language","maxSteps","showChatBar","children","onResult","interactiveBlacklist","interactiveWhitelist","onBeforeStep","onAfterStep","onBeforeTask","onAfterTask","transformScreenContent","customTools","instructions","stepDelay","mcpServerUrl","router","pathname","rootViewRef","isThinking","setIsThinking","statusText","setStatusText","lastResult","setLastResult","askUserResolverRef","config","onStatusUpdate","onAskUser","question","Promise","resolve","current","success","message","steps","provider","runtime","updateRefs","info","bridge","destroy","handleSend","trim","resolver","result","execute","error","Provider","value","ref","style","styles","root","collapsable","visible","onSend","onDismiss","create","flex"],"sourceRoot":"../../../src","sources":["components/AIAgent.tsx"],"mappings":"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","ignoreList":[]}
|
|
1
|
+
{"version":3,"names":["React","useCallback","useEffect","useMemo","useRef","useState","View","StyleSheet","AgentRuntime","GeminiProvider","AgentContext","AgentChatBar","AgentOverlay","logger","buildVoiceSystemPrompt","MCPBridge","VoiceService","AudioInputService","AudioOutputService","jsx","_jsx","jsxs","_jsxs","console","log","AIAgent","apiKey","model","navRef","language","maxSteps","showChatBar","children","onResult","interactiveBlacklist","interactiveWhitelist","onBeforeStep","onAfterStep","onBeforeTask","onAfterTask","transformScreenContent","customTools","instructions","stepDelay","mcpServerUrl","router","pathname","enableVoice","onTokenUsage","debug","setEnabled","info","rootViewRef","isThinking","setIsThinking","statusText","setStatusText","lastResult","setLastResult","mode","setMode","isMicActive","setIsMicActive","isSpeakerMuted","setIsSpeakerMuted","isAISpeaking","setIsAISpeaking","isVoiceConnected","setIsVoiceConnected","voiceServiceRef","audioInputRef","audioOutputRef","availableModes","modes","push","join","askUserResolverRef","config","onStatusUpdate","onAskUser","question","Promise","resolve","current","success","message","steps","provider","runtime","updateRefs","bridge","destroy","runtimeTools","getTools","length","map","t","name","voicePrompt","system","systemPrompt","tools","onError","err","error","initialize","then","ok","onAudioChunk","chunk","sendAudio","onPermissionDenied","warn","connect","onAudioResponse","audio","enqueue","onStatusChange","status","connected","start","initialContext","getScreenContext","sendScreenContext","onTranscript","text","isFinal","role","onToolCall","toolCall","JSON","stringify","args","result","executeTool","sendFunctionResponse","id","updatedContext","onTurnComplete","disconnect","stop","stopVoiceSession","handleSend","trim","resolver","execute","Provider","value","ref","style","styles","root","collapsable","visible","onSend","onDismiss","onModeChange","newMode","onStopSession","onMicToggle","active","onSpeakerToggle","muted","mute","unmute","create","flex"],"sourceRoot":"../../../src","sources":["components/AIAgent.tsx"],"mappings":";;AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA,OAAOA,KAAK,IACVC,WAAW,EACXC,SAAS,EACTC,OAAO,EACPC,MAAM,EACNC,QAAQ,QACH,OAAO;AACd,SAASC,IAAI,EAAEC,UAAU,QAAQ,cAAc;AAC/C,SAASC,YAAY,QAAQ,yBAAsB;AACnD,SAASC,cAAc,QAAQ,gCAA6B;AAC5D,SAASC,YAAY,QAAQ,uBAAoB;AACjD,SAASC,YAAY,QAAQ,mBAAgB;AAC7C,SAASC,YAAY,QAAQ,mBAAgB;AAC7C,SAASC,MAAM,QAAQ,oBAAiB;AACxC,SAASC,sBAAsB,QAAQ,yBAAsB;AAC7D,SAASC,SAAS,QAAQ,sBAAmB;AAC7C,SAASC,YAAY,QAAQ,6BAA0B;AACvD,SAASC,iBAAiB,QAAQ,kCAA+B;AACjE,SAASC,kBAAkB,QAAQ,mCAAgC;AAAC,SAAAC,GAAA,IAAAC,IAAA,EAAAC,IAAA,IAAAC,KAAA;AAGpE;AACAC,OAAO,CAACC,GAAG,CAAC,8BAA8B,CAAC;;AAE3C;;AA+DA;;AAEA,OAAO,SAASC,OAAOA,CAAC;EACtBC,MAAM;EACNC,KAAK,GAAG,kBAAkB;EAC1BC,MAAM;EACNC,QAAQ,GAAG,IAAI;EACfC,QAAQ,GAAG,EAAE;EACbC,WAAW,GAAG,IAAI;EAClBC,QAAQ;EACRC,QAAQ;EACR;EACAC,oBAAoB;EACpBC,oBAAoB;EACpBC,YAAY;EACZC,WAAW;EACXC,YAAY;EACZC,WAAW;EACXC,sBAAsB;EACtBC,WAAW;EACXC,YAAY;EACZC,SAAS;EACTC,YAAY;EACZC,MAAM;EACNC,QAAQ;EACRC,WAAW,GAAG,KAAK;EACnBC,YAAY;EACZC,KAAK,GAAG;AACI,CAAC,EAAE;EACf;EACAjD,KAAK,CAACE,SAAS,CAAC,MAAM;IACpBqB,OAAO,CAACC,GAAG,CAAC,wBAAwB,EAAEyB,KAAK,EAAE,mBAAmB,CAAC;IACjEpC,MAAM,CAACqC,UAAU,CAACD,KAAK,CAAC;IACxB,IAAIA,KAAK,EAAE;MACTpC,MAAM,CAACsC,IAAI,CAAC,SAAS,EAAE,0BAA0B,CAAC;IACpD;EACF,CAAC,EAAE,CAACF,KAAK,CAAC,CAAC;EAEX,MAAMG,WAAW,GAAGhD,MAAM,CAAM,IAAI,CAAC;EACrC,MAAM,CAACiD,UAAU,EAAEC,aAAa,CAAC,GAAGjD,QAAQ,CAAC,KAAK,CAAC;EACnD,MAAM,CAACkD,UAAU,EAAEC,aAAa,CAAC,GAAGnD,QAAQ,CAAC,EAAE,CAAC;EAChD,MAAM,CAACoD,UAAU,EAAEC,aAAa,CAAC,GAAGrD,QAAQ,CAAyB,IAAI,CAAC;;EAE1E;EACA,MAAM,CAACsD,IAAI,EAAEC,OAAO,CAAC,GAAGvD,QAAQ,CAAY,MAAM,CAAC;EACnD,MAAM,CAACwD,WAAW,EAAEC,cAAc,CAAC,GAAGzD,QAAQ,CAAC,KAAK,CAAC;EACrD,MAAM,CAAC0D,cAAc,EAAEC,iBAAiB,CAAC,GAAG3D,QAAQ,CAAC,KAAK,CAAC;EAC3D,MAAM,CAAC4D,YAAY,EAAEC,eAAe,CAAC,GAAG7D,QAAQ,CAAC,KAAK,CAAC;EACvD,MAAM,CAAC8D,gBAAgB,EAAEC,mBAAmB,CAAC,GAAG/D,QAAQ,CAAC,KAAK,CAAC;EAE/D,MAAMgE,eAAe,GAAGjE,MAAM,CAAsB,IAAI,CAAC;EACzD,MAAMkE,aAAa,GAAGlE,MAAM,CAA2B,IAAI,CAAC;EAC5D,MAAMmE,cAAc,GAAGnE,MAAM,CAA4B,IAAI,CAAC;;EAE9D;EACA,MAAMoE,cAA2B,GAAGrE,OAAO,CAAC,MAAM;IAChD,MAAMsE,KAAkB,GAAG,CAAC,MAAM,CAAC;IACnC,IAAI1B,WAAW,EAAE0B,KAAK,CAACC,IAAI,CAAC,OAAO,CAAC;IACpC7D,MAAM,CAACsC,IAAI,CAAC,SAAS,EAAE,oBAAoBsB,KAAK,CAACE,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;IAC9D,OAAOF,KAAK;EACd,CAAC,EAAE,CAAC1B,WAAW,CAAC,CAAC;;EAEjB;EACA,MAAM6B,kBAAkB,GAAGxE,MAAM,CAAoC,IAAI,CAAC;;EAE1E;;EAEA,MAAMyE,MAAmB,GAAG1E,OAAO,CAAC,OAAO;IACzCuB,MAAM;IACNC,KAAK;IACLE,QAAQ;IACRC,QAAQ;IACRI,oBAAoB;IACpBC,oBAAoB;IACpBC,YAAY;IACZC,WAAW;IACXC,YAAY;IACZC,WAAW;IACXC,sBAAsB;IACtBC,WAAW;IACXC,YAAY;IACZC,SAAS;IACTC,YAAY;IACZC,MAAM;IACNC,QAAQ;IACRgC,cAAc,EAAEtB,aAAa;IAC7BR,YAAY;IACZ;IACA+B,SAAS,EAAGC,QAAgB,IAAK;MAC/B,OAAO,IAAIC,OAAO,CAAUC,OAAO,IAAK;QACtCN,kBAAkB,CAACO,OAAO,GAAGD,OAAO;QACpC;QACAxB,aAAa,CAAC;UAAE0B,OAAO,EAAE,IAAI;UAAEC,OAAO,EAAE,KAAKL,QAAQ,EAAE;UAAEM,KAAK,EAAE;QAAG,CAAC,CAAC;QACrEhC,aAAa,CAAC,KAAK,CAAC;QACpBE,aAAa,CAAC,EAAE,CAAC;MACnB,CAAC,CAAC;IACJ;EACF,CAAC,CAAC,EAAE,CACF9B,MAAM,EAAEC,KAAK,EAAEE,QAAQ,EAAEC,QAAQ,EACjCI,oBAAoB,EAAEC,oBAAoB,EAC1CC,YAAY,EAAEC,WAAW,EAAEC,YAAY,EAAEC,WAAW,EACpDC,sBAAsB,EAAEC,WAAW,EAAEC,YAAY,EAAEC,SAAS,EAC5DC,YAAY,EAAEC,MAAM,EAAEC,QAAQ,EAAEE,YAAY,CAC7C,CAAC;EAEF,MAAMuC,QAAQ,GAAGpF,OAAO,CAAC,MAAM,IAAIM,cAAc,CAACiB,MAAM,EAAEC,KAAK,CAAC,EAAE,CAACD,MAAM,EAAEC,KAAK,CAAC,CAAC;EAElF,MAAM6D,OAAO,GAAGrF,OAAO,CACrB,MAAM,IAAIK,YAAY,CAAC+E,QAAQ,EAAEV,MAAM,EAAEzB,WAAW,CAAC+B,OAAO,EAAEvD,MAAM,CAAC;EACrE;EACA,CAAC2D,QAAQ,EAAEV,MAAM,CACnB,CAAC;;EAED;EACA3E,SAAS,CAAC,MAAM;IACdsF,OAAO,CAACC,UAAU,CAACrC,WAAW,CAAC+B,OAAO,EAAEvD,MAAM,CAAC;EACjD,CAAC,EAAE,CAAC4D,OAAO,EAAE5D,MAAM,CAAC,CAAC;;EAErB;;EAEA1B,SAAS,CAAC,MAAM;IACd,IAAI,CAAC0C,YAAY,EAAE;IAEnB/B,MAAM,CAACsC,IAAI,CAAC,SAAS,EAAE,4BAA4BP,YAAY,EAAE,CAAC;IAClE,MAAM8C,MAAM,GAAG,IAAI3E,SAAS,CAAC6B,YAAY,EAAE4C,OAAO,CAAC;IAEnD,OAAO,MAAM;MACXE,MAAM,CAACC,OAAO,CAAC,CAAC;IAClB,CAAC;EACH,CAAC,EAAE,CAAC/C,YAAY,EAAE4C,OAAO,CAAC,CAAC;;EAE3B;;EAEA;EACAtF,SAAS,CAAC,MAAM;IACd,IAAIyD,IAAI,KAAK,MAAM,EAAE;MACnB9C,MAAM,CAACsC,IAAI,CAAC,SAAS,EAAE,yCAAyC,CAAC;MACjE;IACF;IAEAtC,MAAM,CAACsC,IAAI,CAAC,SAAS,EAAE,oBAAoBQ,IAAI,oCAAoC,CAAC;;IAEpF;IACA,IAAI,CAACU,eAAe,CAACc,OAAO,EAAE;MAC5BtE,MAAM,CAACsC,IAAI,CAAC,SAAS,EAAE,0BAA0B,CAAC;MAClD,MAAMyC,YAAY,GAAGJ,OAAO,CAACK,QAAQ,CAAC,CAAC;MACvChF,MAAM,CAACsC,IAAI,CAAC,SAAS,EAAE,eAAeyC,YAAY,CAACE,MAAM,6BAA6BF,YAAY,CAACG,GAAG,CAACC,CAAC,IAAIA,CAAC,CAACC,IAAI,CAAC,CAACtB,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;MACjI;MACA;MACA,MAAMuB,WAAW,GAAGpF,sBAAsB,CAACe,QAAQ,EAAEa,YAAY,EAAEyD,MAAM,CAAC;MAC1E9B,eAAe,CAACc,OAAO,GAAG,IAAInE,YAAY,CAAC;QACzCU,MAAM;QACN0E,YAAY,EAAEF,WAAW;QACzBG,KAAK,EAAET,YAAY;QACnB/D;MACF,CAAC,CAAC;MACFhB,MAAM,CAACsC,IAAI,CAAC,SAAS,EAAE,8DAA8D,CAAC;IACxF;;IAEA;IACA,IAAI,CAACoB,cAAc,CAACY,OAAO,EAAE;MAC3BtE,MAAM,CAACsC,IAAI,CAAC,SAAS,EAAE,gCAAgC,CAAC;MACxDoB,cAAc,CAACY,OAAO,GAAG,IAAIjE,kBAAkB,CAAC;QAC9CoF,OAAO,EAAGC,GAAG,IAAK1F,MAAM,CAAC2F,KAAK,CAAC,SAAS,EAAE,sBAAsBD,GAAG,EAAE;MACvE,CAAC,CAAC;MACFhC,cAAc,CAACY,OAAO,CAACsB,UAAU,CAAC,CAAC,CAACC,IAAI,CAAEC,EAAE,IAAK;QAC/C9F,MAAM,CAACsC,IAAI,CAAC,SAAS,EAAE,mCAAmCwD,EAAE,EAAE,CAAC;MACjE,CAAC,CAAC;IACJ;;IAEA;IACA,IAAI,CAACrC,aAAa,CAACa,OAAO,EAAE;MAC1BtE,MAAM,CAACsC,IAAI,CAAC,SAAS,EAAE,+BAA+B,CAAC;MACvDmB,aAAa,CAACa,OAAO,GAAG,IAAIlE,iBAAiB,CAAC;QAC5C;QACA2F,YAAY,EAAGC,KAAK,IAAK;UACvBhG,MAAM,CAACoC,KAAK,CAAC,SAAS,EAAE,cAAc4D,KAAK,CAACf,MAAM,QAAQ,CAAC;UAC3DzB,eAAe,CAACc,OAAO,EAAE2B,SAAS,CAACD,KAAK,CAAC;QAC3C,CAAC;QACDP,OAAO,EAAGC,GAAG,IAAK1F,MAAM,CAAC2F,KAAK,CAAC,SAAS,EAAE,qBAAqBD,GAAG,EAAE,CAAC;QACrEQ,kBAAkB,EAAEA,CAAA,KAAMlG,MAAM,CAACmG,IAAI,CAAC,SAAS,EAAE,+BAA+B;MAClF,CAAC,CAAC;IACJ;;IAEA;IACAnG,MAAM,CAACsC,IAAI,CAAC,SAAS,EAAE,4BAA4B,CAAC;IACpDkB,eAAe,CAACc,OAAO,CAAC8B,OAAO,CAAC;MAC9BC,eAAe,EAAGC,KAAK,IAAK;QAC1BtG,MAAM,CAACsC,IAAI,CAAC,SAAS,EAAE,4BAA4BgE,KAAK,CAACrB,MAAM,SAAS,CAAC;QACzE5B,eAAe,CAAC,IAAI,CAAC;QACrBK,cAAc,CAACY,OAAO,EAAEiC,OAAO,CAACD,KAAK,CAAC;MACxC,CAAC;MACDE,cAAc,EAAGC,MAAM,IAAK;QAC1BzG,MAAM,CAACsC,IAAI,CAAC,SAAS,EAAE,iBAAiBmE,MAAM,EAAE,CAAC;QACjD,MAAMC,SAAS,GAAGD,MAAM,KAAK,WAAW;QACxClD,mBAAmB,CAACmD,SAAS,CAAC;QAC9B,IAAIA,SAAS,EAAE;UACb1G,MAAM,CAACsC,IAAI,CAAC,SAAS,EAAE,iDAAiD,CAAC;UACzE;UACAmB,aAAa,CAACa,OAAO,EAAEqC,KAAK,CAAC,CAAC,CAACd,IAAI,CAAEC,EAAE,IAAK;YAC1C,IAAIA,EAAE,EAAE;cACN7C,cAAc,CAAC,IAAI,CAAC;cACpBjD,MAAM,CAACsC,IAAI,CAAC,SAAS,EAAE,uCAAuC,CAAC;YACjE;UACF,CAAC,CAAC;UACF;UACA,MAAMsE,cAAc,GAAGjC,OAAO,CAACkC,gBAAgB,CAAC,CAAC;UACjDrD,eAAe,CAACc,OAAO,EAAEwC,iBAAiB,CAACF,cAAc,CAAC;UAC1D5G,MAAM,CAACsC,IAAI,CAAC,SAAS,EAAE,+CAA+C,CAAC;QACzE;MACF,CAAC;MACDyE,YAAY,EAAEA,CAACC,IAAI,EAAEC,OAAO,EAAEC,IAAI,KAAK;QACrClH,MAAM,CAACsC,IAAI,CAAC,SAAS,EAAE,eAAe4E,IAAI,YAAYD,OAAO,OAAOD,IAAI,GAAG,CAAC;MAC9E,CAAC;MACDG,UAAU,EAAE,MAAOC,QAAQ,IAAK;QAC9BpH,MAAM,CAACsC,IAAI,CAAC,SAAS,EAAE,oBAAoB8E,QAAQ,CAAChC,IAAI,IAAIiC,IAAI,CAACC,SAAS,CAACF,QAAQ,CAACG,IAAI,CAAC,GAAG,CAAC;QAC7F;QACA,MAAMC,MAAM,GAAG,MAAM7C,OAAO,CAAC8C,WAAW,CAACL,QAAQ,CAAChC,IAAI,EAAEgC,QAAQ,CAACG,IAAI,CAAC;QACtEvH,MAAM,CAACsC,IAAI,CAAC,SAAS,EAAE,sBAAsBkF,MAAM,EAAE,CAAC;QACtDhE,eAAe,CAACc,OAAO,EAAEoD,oBAAoB,CAACN,QAAQ,CAAChC,IAAI,EAAEgC,QAAQ,CAACO,EAAE,EAAE;UAAEH;QAAO,CAAC,CAAC;;QAErF;QACA;QACA,MAAMI,cAAc,GAAGjD,OAAO,CAACkC,gBAAgB,CAAC,CAAC;QACjDrD,eAAe,CAACc,OAAO,EAAEwC,iBAAiB,CAACc,cAAc,CAAC;QAC1D5H,MAAM,CAACsC,IAAI,CAAC,SAAS,EAAE,gDAAgD,CAAC;MAC1E,CAAC;MACDmD,OAAO,EAAGC,GAAG,IAAK;QAChB1F,MAAM,CAAC2F,KAAK,CAAC,SAAS,EAAE,uBAAuBD,GAAG,EAAE,CAAC;MACvD,CAAC;MACDmC,cAAc,EAAEA,CAAA,KAAM;QACpB7H,MAAM,CAACsC,IAAI,CAAC,SAAS,EAAE,kBAAkB,CAAC;QAC1Ce,eAAe,CAAC,KAAK,CAAC;MACxB;IACF,CAAC,CAAC;;IAEF;IACA,OAAO,MAAM;MACXrD,MAAM,CAACsC,IAAI,CAAC,SAAS,EAAE,wCAAwCQ,IAAI,SAAS,CAAC;MAC7EU,eAAe,CAACc,OAAO,EAAEwD,UAAU,CAAC,CAAC;MACrCtE,eAAe,CAACc,OAAO,GAAG,IAAI,CAAC,CAAC;MAChCb,aAAa,CAACa,OAAO,EAAEyD,IAAI,CAAC,CAAC;MAC7B9E,cAAc,CAAC,KAAK,CAAC;MACrBI,eAAe,CAAC,KAAK,CAAC;MACtBE,mBAAmB,CAAC,KAAK,CAAC;IAC5B,CAAC;IACD;EACF,CAAC,EAAE,CAACT,IAAI,EAAEjC,MAAM,EAAE8D,OAAO,EAAE3D,QAAQ,EAAEa,YAAY,CAAC,CAAC;;EAEnD;;EAEA,MAAMmG,gBAAgB,GAAG5I,WAAW,CAAC,MAAM;IACzCY,MAAM,CAACsC,IAAI,CAAC,SAAS,EAAE,6CAA6C,CAAC;IACrE;IACAmB,aAAa,CAACa,OAAO,EAAEyD,IAAI,CAAC,CAAC;IAC7B;IACArE,cAAc,CAACY,OAAO,EAAEyD,IAAI,CAAC,CAAC;IAC9B;IACAvE,eAAe,CAACc,OAAO,EAAEwD,UAAU,CAAC,CAAC;IACrCtE,eAAe,CAACc,OAAO,GAAG,IAAI;IAC9B;IACArB,cAAc,CAAC,KAAK,CAAC;IACrBI,eAAe,CAAC,KAAK,CAAC;IACtBE,mBAAmB,CAAC,KAAK,CAAC;IAC1B;IACAR,OAAO,CAAC,MAAM,CAAC;IACf/C,MAAM,CAACsC,IAAI,CAAC,SAAS,EAAE,gCAAgC,CAAC;EAC1D,CAAC,EAAE,CAACqC,OAAO,CAAC,CAAC;;EAEb;;EAEA,MAAMsD,UAAU,GAAG7I,WAAW,CAAC,MAAOoF,OAAe,IAAK;IACxD,IAAI,CAACA,OAAO,CAAC0D,IAAI,CAAC,CAAC,EAAE;IAErBlI,MAAM,CAACsC,IAAI,CAAC,SAAS,EAAE,kBAAkBkC,OAAO,GAAG,CAAC;;IAEpD;IACA,IAAIT,kBAAkB,CAACO,OAAO,EAAE;MAC9B,MAAM6D,QAAQ,GAAGpE,kBAAkB,CAACO,OAAO;MAC3CP,kBAAkB,CAACO,OAAO,GAAG,IAAI;MACjC7B,aAAa,CAAC,IAAI,CAAC;MACnBE,aAAa,CAAC,2BAA2B,CAAC;MAC1CE,aAAa,CAAC,IAAI,CAAC;MACnBsF,QAAQ,CAAC3D,OAAO,CAAC;MACjB;IACF;;IAEA;IACA/B,aAAa,CAAC,IAAI,CAAC;IACnBE,aAAa,CAAC,aAAa,CAAC;IAC5BE,aAAa,CAAC,IAAI,CAAC;IAEnB,IAAI;MACF;MACA8B,OAAO,CAACC,UAAU,CAACrC,WAAW,CAAC+B,OAAO,EAAEvD,MAAM,CAAC;MAE/C,MAAMyG,MAAM,GAAG,MAAM7C,OAAO,CAACyD,OAAO,CAAC5D,OAAO,CAAC;MAE7C3B,aAAa,CAAC2E,MAAM,CAAC;MACrBpG,QAAQ,GAAGoG,MAAM,CAAC;MAElBxH,MAAM,CAACsC,IAAI,CAAC,SAAS,EAAE,WAAWkF,MAAM,CAACjD,OAAO,GAAG,GAAG,GAAG,GAAG,IAAIiD,MAAM,CAAChD,OAAO,EAAE,CAAC;IACnF,CAAC,CAAC,OAAOmB,KAAU,EAAE;MACnB3F,MAAM,CAAC2F,KAAK,CAAC,SAAS,EAAE,mBAAmB,EAAEA,KAAK,CAAC;MACnD9C,aAAa,CAAC;QACZ0B,OAAO,EAAE,KAAK;QACdC,OAAO,EAAE,UAAUmB,KAAK,CAACnB,OAAO,EAAE;QAClCC,KAAK,EAAE;MACT,CAAC,CAAC;IACJ,CAAC,SAAS;MACRhC,aAAa,CAAC,KAAK,CAAC;MACpBE,aAAa,CAAC,EAAE,CAAC;IACnB;EACF,CAAC,EAAE,CAACgC,OAAO,EAAE5D,MAAM,EAAEK,QAAQ,CAAC,CAAC;;EAE/B;;EAEA,oBACEX,KAAA,CAACZ,YAAY,CAACwI,QAAQ;IAACC,KAAK,EAAE3D,OAAQ;IAAAxD,QAAA,gBACpCZ,IAAA,CAACd,IAAI;MAAC8I,GAAG,EAAEhG,WAAY;MAACiG,KAAK,EAAEC,MAAM,CAACC,IAAK;MAACC,WAAW,EAAE,KAAM;MAAAxH,QAAA,EAC5DA;IAAQ,CACL,CAAC,eAGPZ,IAAA,CAACR,YAAY;MAAC6I,OAAO,EAAEpG,UAAW;MAACE,UAAU,EAAEA;IAAW,CAAE,CAAC,EAG5DxB,WAAW,iBACVX,IAAA,CAACT,YAAY;MACX+I,MAAM,EAAEZ,UAAW;MACnBzF,UAAU,EAAEA,UAAW;MACvBI,UAAU,EAAEA,UAAW;MACvB5B,QAAQ,EAAEA,QAAS;MACnB8H,SAAS,EAAEA,CAAA,KAAMjG,aAAa,CAAC,IAAI,CAAE;MACrCc,cAAc,EAAEA,cAAe;MAC/Bb,IAAI,EAAEA,IAAK;MACXiG,YAAY,EAAGC,OAAO,IAAK;QACzBhJ,MAAM,CAACsC,IAAI,CAAC,SAAS,EAAE,gBAAgBQ,IAAI,MAAMkG,OAAO,EAAE,CAAC;QAC3DjG,OAAO,CAACiG,OAAO,CAAC;MAClB,CAAE;MACFhG,WAAW,EAAEA,WAAY;MACzBE,cAAc,EAAEA,cAAe;MAC/BE,YAAY,EAAEA,YAAa;MAC3B6F,aAAa,EAAEjB,gBAAiB;MAChC1E,gBAAgB,EAAEA,gBAAiB;MACnC4F,WAAW,EAAGC,MAAM,IAAK;QACvB,IAAIA,MAAM,IAAI,CAAC7F,gBAAgB,EAAE;UAC/BtD,MAAM,CAACmG,IAAI,CAAC,SAAS,EAAE,oDAAoD,CAAC;UAC5E;QACF;QACAnG,MAAM,CAACsC,IAAI,CAAC,SAAS,EAAE,eAAe6G,MAAM,GAAG,IAAI,GAAG,KAAK,EAAE,CAAC;QAC9DlG,cAAc,CAACkG,MAAM,CAAC;QACtB,IAAIA,MAAM,EAAE;UACVnJ,MAAM,CAACsC,IAAI,CAAC,SAAS,EAAE,wBAAwB,CAAC;UAChDmB,aAAa,CAACa,OAAO,EAAEqC,KAAK,CAAC,CAAC,CAACd,IAAI,CAAEC,EAAE,IAAK;YAC1C9F,MAAM,CAACsC,IAAI,CAAC,SAAS,EAAE,4BAA4BwD,EAAE,EAAE,CAAC;UAC1D,CAAC,CAAC;QACJ,CAAC,MAAM;UACL9F,MAAM,CAACsC,IAAI,CAAC,SAAS,EAAE,wBAAwB,CAAC;UAChDmB,aAAa,CAACa,OAAO,EAAEyD,IAAI,CAAC,CAAC;QAC/B;MACF,CAAE;MACFqB,eAAe,EAAGC,KAAK,IAAK;QAC1BrJ,MAAM,CAACsC,IAAI,CAAC,SAAS,EAAE,mBAAmB+G,KAAK,GAAG,OAAO,GAAG,SAAS,EAAE,CAAC;QACxElG,iBAAiB,CAACkG,KAAK,CAAC;QACxB,IAAIA,KAAK,EAAE;UACT3F,cAAc,CAACY,OAAO,EAAEgF,IAAI,CAAC,CAAC;QAChC,CAAC,MAAM;UACL5F,cAAc,CAACY,OAAO,EAAEiF,MAAM,CAAC,CAAC;QAClC;MACF;IAAE,CAEH,CACF;EAAA,CACoB,CAAC;AAE5B;AAGA,MAAMd,MAAM,GAAG/I,UAAU,CAAC8J,MAAM,CAAC;EAC/Bd,IAAI,EAAE;IACJe,IAAI,EAAE;EACR;AACF,CAAC,CAAC","ignoreList":[]}
|