@mobileai/react-native 0.4.6 → 0.5.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 (43) hide show
  1. package/README.md +80 -4
  2. package/lib/module/components/AIAgent.js +179 -38
  3. package/lib/module/components/AIAgent.js.map +1 -1
  4. package/lib/module/components/AgentChatBar.js +53 -29
  5. package/lib/module/components/AgentChatBar.js.map +1 -1
  6. package/lib/module/components/Icons.js +337 -0
  7. package/lib/module/components/Icons.js.map +1 -0
  8. package/lib/module/core/AgentRuntime.js +74 -3
  9. package/lib/module/core/AgentRuntime.js.map +1 -1
  10. package/lib/module/core/systemPrompt.js +57 -38
  11. package/lib/module/core/systemPrompt.js.map +1 -1
  12. package/lib/module/index.js +3 -9
  13. package/lib/module/index.js.map +1 -1
  14. package/lib/module/services/AudioInputService.js +73 -2
  15. package/lib/module/services/AudioInputService.js.map +1 -1
  16. package/lib/module/services/AudioOutputService.js +58 -5
  17. package/lib/module/services/AudioOutputService.js.map +1 -1
  18. package/lib/module/services/VoiceService.js +281 -275
  19. package/lib/module/services/VoiceService.js.map +1 -1
  20. package/lib/typescript/src/components/AIAgent.d.ts.map +1 -1
  21. package/lib/typescript/src/components/AgentChatBar.d.ts.map +1 -1
  22. package/lib/typescript/src/components/Icons.d.ts +43 -0
  23. package/lib/typescript/src/components/Icons.d.ts.map +1 -0
  24. package/lib/typescript/src/core/AgentRuntime.d.ts +12 -0
  25. package/lib/typescript/src/core/AgentRuntime.d.ts.map +1 -1
  26. package/lib/typescript/src/core/systemPrompt.d.ts.map +1 -1
  27. package/lib/typescript/src/index.d.ts +4 -0
  28. package/lib/typescript/src/index.d.ts.map +1 -1
  29. package/lib/typescript/src/services/AudioInputService.d.ts +13 -0
  30. package/lib/typescript/src/services/AudioInputService.d.ts.map +1 -1
  31. package/lib/typescript/src/services/AudioOutputService.d.ts.map +1 -1
  32. package/lib/typescript/src/services/VoiceService.d.ts +38 -29
  33. package/lib/typescript/src/services/VoiceService.d.ts.map +1 -1
  34. package/package.json +1 -1
  35. package/src/components/AIAgent.tsx +192 -39
  36. package/src/components/AgentChatBar.tsx +44 -25
  37. package/src/components/Icons.tsx +253 -0
  38. package/src/core/AgentRuntime.ts +70 -3
  39. package/src/core/systemPrompt.ts +57 -38
  40. package/src/index.ts +8 -8
  41. package/src/services/AudioInputService.ts +77 -2
  42. package/src/services/AudioOutputService.ts +59 -5
  43. package/src/services/VoiceService.ts +278 -290
@@ -45,6 +45,23 @@ export class AudioOutputService {
45
45
  }
46
46
  const sampleRate = this.config.sampleRate || GEMINI_OUTPUT_SAMPLE_RATE;
47
47
 
48
+ // Configure audio session for duplex audio (simultaneous mic + speaker)
49
+ // BEFORE creating AudioContext. This enables hardware-level AEC, AGC,
50
+ // and noise suppression through the OS — no extra library needed.
51
+ try {
52
+ const {
53
+ AudioManager
54
+ } = audioApi;
55
+ AudioManager.setAudioSessionOptions({
56
+ iosCategory: 'playAndRecord',
57
+ iosMode: 'voiceChat',
58
+ iosOptions: ['defaultToSpeaker', 'allowBluetoothHFP']
59
+ });
60
+ logger.info('AudioOutput', '🔊 Audio session configured: playAndRecord + voiceChat (hardware AEC enabled)');
61
+ } catch (sessionErr) {
62
+ logger.warn('AudioOutput', `⚠️ AudioManager setup failed: ${sessionErr?.message || sessionErr} — continuing with default session`);
63
+ }
64
+
48
65
  // Create AudioContext at Gemini's output sample rate
49
66
  this.audioContext = new audioApi.AudioContext({
50
67
  sampleRate
@@ -59,6 +76,13 @@ export class AudioOutputService {
59
76
  this.queueSourceNode = this.audioContext.createBufferQueueSource();
60
77
  this.queueSourceNode.connect(this.gainNode);
61
78
  logger.info('AudioOutput', `Initialized (${sampleRate}Hz, AudioBufferQueueSourceNode)`);
79
+
80
+ // CRITICAL: Resume AudioContext — it starts in 'suspended' state.
81
+ // Per Web Audio API spec, audio won't render until context is 'running'.
82
+ if (this.audioContext.state === 'suspended') {
83
+ await this.audioContext.resume();
84
+ logger.info('AudioOutput', `AudioContext resumed: state=${this.audioContext.state}`);
85
+ }
62
86
  return true;
63
87
  } catch (error) {
64
88
  logger.error('AudioOutput', `Failed to initialize: ${error.message}`);
@@ -71,7 +95,14 @@ export class AudioOutputService {
71
95
 
72
96
  /** Add a base64-encoded PCM chunk from Gemini to the playback queue */
73
97
  enqueue(base64Audio) {
74
- if (this.muted || !this.audioContext || !this.queueSourceNode) return;
98
+ // LOG EVERY CALL we need full visibility
99
+ if (this.chunkCount < 5 || this.chunkCount % 50 === 0) {
100
+ logger.info('AudioOutput', `📥 enqueue() called #${this.chunkCount + 1}: b64len=${base64Audio.length}, muted=${this.muted}, ctx=${!!this.audioContext}, ctxState=${this.audioContext?.state || 'null'}, queue=${!!this.queueSourceNode}, started=${this.isStarted}, gain=${this.gainNode?.gain?.value}`);
101
+ }
102
+ if (this.muted || !this.audioContext || !this.queueSourceNode) {
103
+ logger.warn('AudioOutput', `⚠️ enqueue() SKIPPED #${this.chunkCount}: muted=${this.muted}, ctx=${!!this.audioContext}, queue=${!!this.queueSourceNode}`);
104
+ return;
105
+ }
75
106
  try {
76
107
  this.chunkCount++;
77
108
 
@@ -79,25 +110,38 @@ export class AudioOutputService {
79
110
  const float32Data = base64ToFloat32(base64Audio);
80
111
  const sampleRate = this.config.sampleRate || GEMINI_OUTPUT_SAMPLE_RATE;
81
112
 
113
+ // Diagnostic on first 3 chunks
114
+ if (this.chunkCount <= 3) {
115
+ let peakAmp = 0;
116
+ for (let i = 0; i < float32Data.length; i++) {
117
+ const abs = Math.abs(float32Data[i] || 0);
118
+ if (abs > peakAmp) peakAmp = abs;
119
+ }
120
+ logger.info('AudioOutput', `🔍 Chunk #${this.chunkCount}: ${base64Audio.length} b64 → ${float32Data.length} samples, peakAmp=${peakAmp.toFixed(4)}, rate=${sampleRate}`);
121
+ }
122
+
82
123
  // Create an AudioBuffer and fill it with PCM data
83
124
  const audioBuffer = this.audioContext.createBuffer(1, float32Data.length, sampleRate);
84
125
  audioBuffer.copyToChannel(float32Data, 0);
85
126
 
86
127
  // Enqueue the buffer for gapless playback
87
128
  this.queueSourceNode.enqueueBuffer(audioBuffer);
129
+ if (this.chunkCount <= 3) {
130
+ logger.info('AudioOutput', `✅ Buffer enqueued #${this.chunkCount}`);
131
+ }
88
132
 
89
133
  // Start playback on first enqueue
90
134
  if (!this.isStarted) {
91
135
  this.queueSourceNode.start();
92
136
  this.isStarted = true;
93
137
  this.config.onPlaybackStart?.();
94
- logger.info('AudioOutput', '▶️ Playback started');
138
+ logger.info('AudioOutput', `▶️ Playback started — ctxState=${this.audioContext?.state}`);
95
139
  }
96
140
  if (this.chunkCount % 20 === 0) {
97
- logger.debug('AudioOutput', `Queued chunk #${this.chunkCount}`);
141
+ logger.info('AudioOutput', `Queued chunk #${this.chunkCount}`);
98
142
  }
99
143
  } catch (error) {
100
- logger.error('AudioOutput', `Enqueue error: ${error.message}`);
144
+ logger.error('AudioOutput', `❌ Enqueue error #${this.chunkCount}: ${error.message}\n${error.stack?.substring(0, 300)}`);
101
145
  }
102
146
  }
103
147
 
@@ -131,8 +175,17 @@ export class AudioOutputService {
131
175
  }
132
176
  this.isStarted = false;
133
177
  this.chunkCount = 0;
178
+
179
+ // Web Audio API: once a source node is stopped, it CANNOT be restarted.
180
+ // We must create a fresh AudioBufferQueueSourceNode for the next session.
181
+ if (this.audioContext && this.gainNode) {
182
+ this.queueSourceNode = this.audioContext.createBufferQueueSource();
183
+ this.queueSourceNode.connect(this.gainNode);
184
+ logger.info('AudioOutput', 'Playback stopped — fresh queue node created for next session');
185
+ } else {
186
+ logger.info('AudioOutput', 'Playback stopped');
187
+ }
134
188
  this.config.onPlaybackEnd?.();
135
- logger.info('AudioOutput', 'Playback stopped');
136
189
  } catch (error) {
137
190
  logger.error('AudioOutput', `Stop error: ${error.message}`);
138
191
  }
@@ -1 +1 @@
1
- {"version":3,"names":["logger","base64ToFloat32","GEMINI_OUTPUT_SAMPLE_RATE","AudioOutputService","audioContext","queueSourceNode","gainNode","muted","isStarted","chunkCount","constructor","config","initialize","audioApi","require","msg","error","onError","sampleRate","AudioContext","createGain","gain","value","connect","destination","createBufferQueueSource","info","message","enqueue","base64Audio","float32Data","audioBuffer","createBuffer","length","copyToChannel","enqueueBuffer","start","onPlaybackStart","debug","mute","unmute","isMuted","stop","clearBuffers","onPlaybackEnd","cleanup","close"],"sourceRoot":"../../../src","sources":["services/AudioOutputService.ts"],"mappings":"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","ignoreList":[]}
1
+ {"version":3,"names":["logger","base64ToFloat32","GEMINI_OUTPUT_SAMPLE_RATE","AudioOutputService","audioContext","queueSourceNode","gainNode","muted","isStarted","chunkCount","constructor","config","initialize","audioApi","require","msg","error","onError","sampleRate","AudioManager","setAudioSessionOptions","iosCategory","iosMode","iosOptions","info","sessionErr","warn","message","AudioContext","createGain","gain","value","connect","destination","createBufferQueueSource","state","resume","enqueue","base64Audio","length","float32Data","peakAmp","i","abs","Math","toFixed","audioBuffer","createBuffer","copyToChannel","enqueueBuffer","start","onPlaybackStart","stack","substring","mute","unmute","isMuted","stop","clearBuffers","onPlaybackEnd","cleanup","close"],"sourceRoot":"../../../src","sources":["services/AudioOutputService.ts"],"mappings":"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","ignoreList":[]}