@mobileai/react-native 0.4.1 → 0.4.3
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 +25 -34
- 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 +362 -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 +409 -0
- package/src/utils/audioUtils.ts +54 -0
- package/src/utils/logger.ts +24 -7
package/README.md
CHANGED
|
@@ -16,14 +16,15 @@ Wrap your navigation with `<AIAgent>`. The AI automatically understands your ent
|
|
|
16
16
|
|
|
17
17
|
## ✨ Features
|
|
18
18
|
|
|
19
|
-
- 🤖 **Zero-config UI understanding** — No annotations
|
|
20
|
-
- 🎯 **
|
|
21
|
-
- 🖼️ **
|
|
22
|
-
- 📐 **Compact DOM output** — Collapses structural view nesting into flat, token-efficient output. Your 50-level deep navigation bar becomes a single line.
|
|
19
|
+
- 🤖 **Zero-config UI understanding** — No annotations needed. The AI sees and understands your entire screen automatically.
|
|
20
|
+
- 🎯 **Works with every component** — Buttons, switches, inputs, custom components — all work out of the box.
|
|
21
|
+
- 🖼️ **Sees images & videos** — The AI knows what media is on screen and can describe it.
|
|
23
22
|
- 🧭 **Auto-navigation** — Navigates between screens to complete multi-step tasks.
|
|
24
23
|
- 🔒 **Production-grade security** — Element gating, content masking, lifecycle hooks, human-in-the-loop confirmation.
|
|
25
24
|
- 🧩 **Custom actions** — Expose any business logic (checkout, API calls) as AI-callable tools with `useAction`.
|
|
26
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.
|
|
27
28
|
- 🌍 **Bilingual** — English and Arabic support built-in.
|
|
28
29
|
|
|
29
30
|
## 📦 Installation
|
|
@@ -34,7 +35,24 @@ npm install @mobileai/react-native
|
|
|
34
35
|
npm install react-native-agentic-ai
|
|
35
36
|
```
|
|
36
37
|
|
|
37
|
-
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.
|
|
38
56
|
|
|
39
57
|
## 🚀 Quick Start
|
|
40
58
|
|
|
@@ -58,38 +76,11 @@ export default function App() {
|
|
|
58
76
|
|
|
59
77
|
A floating chat bar appears automatically. Ask the AI to navigate, tap buttons, fill forms — it reads your live UI and acts.
|
|
60
78
|
|
|
61
|
-
## 🧠 How It Works
|
|
62
|
-
|
|
63
|
-
The SDK traverses your **React Fiber tree** at runtime and generates a compact, LLM-friendly representation of everything on screen:
|
|
64
|
-
|
|
65
|
-
```
|
|
66
|
-
Account Settings
|
|
67
|
-
[image in="SettingsScreen" src="https://randomuser.me/api/portraits/men/32.jpg"]
|
|
68
|
-
Demo User
|
|
69
|
-
demo@test.com
|
|
70
|
-
Profile Information
|
|
71
|
-
Full Name
|
|
72
|
-
[0]<text-input>Enter your name />
|
|
73
|
-
Email Address
|
|
74
|
-
[1]<text-input>Enter your email />
|
|
75
|
-
Notifications
|
|
76
|
-
Email Alerts
|
|
77
|
-
[2]<switch value="true"> />
|
|
78
|
-
Push Notifications
|
|
79
|
-
[3]<switch value="false"> />
|
|
80
|
-
```
|
|
81
|
-
|
|
82
|
-
**Key design decisions:**
|
|
83
|
-
- **Structural views are transparent** — React Navigation's 50+ nested `<View>` layers are collapsed. Only interactive elements and text content appear.
|
|
84
|
-
- **Media is context-aware** — Images emit `[image in="ComponentName" src="url"]`, giving the LLM both *where* the image is and the full URL for Gemini's vision model.
|
|
85
|
-
- **State is explicit** — Switch values, check states, and input values are emitted as attributes so the LLM knows the current state.
|
|
86
|
-
- **Polymorphic tap** — `tap(index)` works on any component: calls `onPress` for buttons, `onValueChange` for switches, and bubbles up the Fiber tree for custom wrapper components.
|
|
87
|
-
|
|
88
79
|
## 🔌 API Reference
|
|
89
80
|
|
|
90
81
|
### `<AIAgent>` Component
|
|
91
82
|
|
|
92
|
-
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.
|
|
93
84
|
|
|
94
85
|
| Prop | Type | Default | Description |
|
|
95
86
|
|------|------|---------|-------------|
|
|
@@ -274,7 +265,7 @@ This starts two servers:
|
|
|
274
265
|
|
|
275
266
|
| Tool | Description |
|
|
276
267
|
|------|-------------|
|
|
277
|
-
| `tap(index)` | Tap any interactive element.
|
|
268
|
+
| `tap(index)` | Tap any interactive element. Works universally on buttons, switches, checkboxes, and custom components. |
|
|
278
269
|
| `type(index, text)` | Type text into a text-input. |
|
|
279
270
|
| `navigate(screen)` | Navigate to a screen. |
|
|
280
271
|
| `done(text)` | Complete the task with a response. |
|
|
@@ -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":";;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,SAAS,QAAQ,sBAAmB;;AAG7C;;AAGA;AAAA,SAAAC,GAAA,IAAAC,IAAA,EAAAC,IAAA,IAAAC,KAAA;AAyDA;;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;AACY,CAAC,EAAE;EACf,MAAMC,WAAW,GAAGrC,MAAM,CAAM,IAAI,CAAC;EACrC,MAAM,CAACsC,UAAU,EAAEC,aAAa,CAAC,GAAGtC,QAAQ,CAAC,KAAK,CAAC;EACnD,MAAM,CAACuC,UAAU,EAAEC,aAAa,CAAC,GAAGxC,QAAQ,CAAC,EAAE,CAAC;EAChD,MAAM,CAACyC,UAAU,EAAEC,aAAa,CAAC,GAAG1C,QAAQ,CAAyB,IAAI,CAAC;;EAE1E;EACA,MAAM2C,kBAAkB,GAAG5C,MAAM,CAAoC,IAAI,CAAC;;EAE1E;;EAEA,MAAM6C,MAAmB,GAAG9C,OAAO,CAAC,OAAO;IACzCiB,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;IACRU,cAAc,EAAEL,aAAa;IAC7B;IACAM,SAAS,EAAGC,QAAgB,IAAK;MAC/B,OAAO,IAAIC,OAAO,CAAUC,OAAO,IAAK;QACtCN,kBAAkB,CAACO,OAAO,GAAGD,OAAO;QACpC;QACAP,aAAa,CAAC;UAAES,OAAO,EAAE,IAAI;UAAEC,OAAO,EAAE,KAAKL,QAAQ,EAAE;UAAEM,KAAK,EAAE;QAAG,CAAC,CAAC;QACrEf,aAAa,CAAC,KAAK,CAAC;QACpBE,aAAa,CAAC,EAAE,CAAC;MACnB,CAAC,CAAC;IACJ;EACF,CAAC,CAAC,EAAE,CACFzB,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,CAC/B,CAAC;EAEF,MAAMmB,QAAQ,GAAGxD,OAAO,CAAC,MAAM,IAAIM,cAAc,CAACW,MAAM,EAAEC,KAAK,CAAC,EAAE,CAACD,MAAM,EAAEC,KAAK,CAAC,CAAC;EAElF,MAAMuC,OAAO,GAAGzD,OAAO,CACrB,MAAM,IAAIK,YAAY,CAACmD,QAAQ,EAAEV,MAAM,EAAER,WAAW,CAACc,OAAO,EAAEjC,MAAM,CAAC;EACrE;EACA,CAACqC,QAAQ,EAAEV,MAAM,CACnB,CAAC;;EAED;EACA/C,SAAS,CAAC,MAAM;IACd0D,OAAO,CAACC,UAAU,CAACpB,WAAW,CAACc,OAAO,EAAEjC,MAAM,CAAC;EACjD,CAAC,EAAE,CAACsC,OAAO,EAAEtC,MAAM,CAAC,CAAC;;EAErB;;EAEApB,SAAS,CAAC,MAAM;IACd,IAAI,CAACoC,YAAY,EAAE;IAEnBzB,MAAM,CAACiD,IAAI,CAAC,SAAS,EAAE,4BAA4BxB,YAAY,EAAE,CAAC;IAClE,MAAMyB,MAAM,GAAG,IAAIjD,SAAS,CAACwB,YAAY,EAAEsB,OAAO,CAAC;IAEnD,OAAO,MAAM;MACXG,MAAM,CAACC,OAAO,CAAC,CAAC;IAClB,CAAC;EACH,CAAC,EAAE,CAAC1B,YAAY,EAAEsB,OAAO,CAAC,CAAC;;EAE3B;;EAEA,MAAMK,UAAU,GAAGhE,WAAW,CAAC,MAAOwD,OAAe,IAAK;IACxD,IAAI,CAACA,OAAO,CAACS,IAAI,CAAC,CAAC,EAAE;IAErBrD,MAAM,CAACiD,IAAI,CAAC,SAAS,EAAE,kBAAkBL,OAAO,GAAG,CAAC;;IAEpD;IACA,IAAIT,kBAAkB,CAACO,OAAO,EAAE;MAC9B,MAAMY,QAAQ,GAAGnB,kBAAkB,CAACO,OAAO;MAC3CP,kBAAkB,CAACO,OAAO,GAAG,IAAI;MACjCZ,aAAa,CAAC,IAAI,CAAC;MACnBE,aAAa,CAAC,2BAA2B,CAAC;MAC1CE,aAAa,CAAC,IAAI,CAAC;MACnBoB,QAAQ,CAACV,OAAO,CAAC;MACjB;IACF;;IAEA;IACAd,aAAa,CAAC,IAAI,CAAC;IACnBE,aAAa,CAAC,aAAa,CAAC;IAC5BE,aAAa,CAAC,IAAI,CAAC;IAEnB,IAAI;MACF;MACAa,OAAO,CAACC,UAAU,CAACpB,WAAW,CAACc,OAAO,EAAEjC,MAAM,CAAC;MAE/C,MAAM8C,MAAM,GAAG,MAAMR,OAAO,CAACS,OAAO,CAACZ,OAAO,CAAC;MAE7CV,aAAa,CAACqB,MAAM,CAAC;MACrBzC,QAAQ,GAAGyC,MAAM,CAAC;MAElBvD,MAAM,CAACiD,IAAI,CAAC,SAAS,EAAE,WAAWM,MAAM,CAACZ,OAAO,GAAG,GAAG,GAAG,GAAG,IAAIY,MAAM,CAACX,OAAO,EAAE,CAAC;IACnF,CAAC,CAAC,OAAOa,KAAU,EAAE;MACnBzD,MAAM,CAACyD,KAAK,CAAC,SAAS,EAAE,mBAAmB,EAAEA,KAAK,CAAC;MACnDvB,aAAa,CAAC;QACZS,OAAO,EAAE,KAAK;QACdC,OAAO,EAAE,UAAUa,KAAK,CAACb,OAAO,EAAE;QAClCC,KAAK,EAAE;MACT,CAAC,CAAC;IACJ,CAAC,SAAS;MACRf,aAAa,CAAC,KAAK,CAAC;MACpBE,aAAa,CAAC,EAAE,CAAC;IACnB;EACF,CAAC,EAAE,CAACe,OAAO,EAAEtC,MAAM,EAAEK,QAAQ,CAAC,CAAC;;EAE/B;;EAEA,oBACET,KAAA,CAACR,YAAY,CAAC6D,QAAQ;IAACC,KAAK,EAAEZ,OAAQ;IAAAlC,QAAA,gBACpCV,IAAA,CAACV,IAAI;MAACmE,GAAG,EAAEhC,WAAY;MAACiC,KAAK,EAAEC,MAAM,CAACC,IAAK;MAACC,WAAW,EAAE,KAAM;MAAAnD,QAAA,EAC5DA;IAAQ,CACL,CAAC,eAGPV,IAAA,CAACJ,YAAY;MAACkE,OAAO,EAAEpC,UAAW;MAACE,UAAU,EAAEA;IAAW,CAAE,CAAC,EAG5DnB,WAAW,iBACVT,IAAA,CAACL,YAAY;MACXoE,MAAM,EAAEd,UAAW;MACnBvB,UAAU,EAAEA,UAAW;MACvBI,UAAU,EAAEA,UAAW;MACvBvB,QAAQ,EAAEA,QAAS;MACnByD,SAAS,EAAEA,CAAA,KAAMjC,aAAa,CAAC,IAAI;IAAE,CACtC,CACF;EAAA,CACoB,CAAC;AAE5B;AAEA,MAAM4B,MAAM,GAAGpE,UAAU,CAAC0E,MAAM,CAAC;EAC/BL,IAAI,EAAE;IACJM,IAAI,EAAE;EACR;AACF,CAAC,CAAC","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":"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","ignoreList":[]}
|