neoagent 3.1.1-beta.9 → 3.2.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 (150) hide show
  1. package/.env.example +2 -2
  2. package/README.md +5 -1
  3. package/docs/architecture.md +1 -1
  4. package/docs/benchmarking.md +68 -87
  5. package/docs/capabilities.md +1 -1
  6. package/docs/clients-and-devices.md +3 -4
  7. package/docs/configuration.md +1 -1
  8. package/docs/devices.md +1 -2
  9. package/docs/health.md +24 -0
  10. package/docs/index.md +2 -2
  11. package/docs/integrations-architecture.md +6 -0
  12. package/docs/integrations.md +15 -1
  13. package/docs/models.md +1 -1
  14. package/docs/persistence.md +1 -1
  15. package/docs/why-neoagent.md +1 -1
  16. package/flutter_app/README.md +0 -5
  17. package/flutter_app/android/app/src/main/AndroidManifest.xml +0 -14
  18. package/flutter_app/android/app/src/main/kotlin/com/neoagent/flutter_app/MainActivity.kt +0 -98
  19. package/flutter_app/lib/main.dart +0 -6
  20. package/flutter_app/lib/main_app_shell.dart +0 -2
  21. package/flutter_app/lib/main_controller.dart +2 -867
  22. package/flutter_app/lib/main_devices.dart +0 -73
  23. package/flutter_app/lib/main_integrations.dart +339 -187
  24. package/flutter_app/lib/main_launcher.dart +2 -212
  25. package/flutter_app/lib/main_models.dart +0 -259
  26. package/flutter_app/lib/main_navigation.dart +2 -14
  27. package/flutter_app/lib/main_operations.dart +322 -364
  28. package/flutter_app/lib/main_runtime.dart +9 -208
  29. package/flutter_app/lib/main_settings.dart +17 -199
  30. package/flutter_app/lib/main_shared.dart +20 -591
  31. package/flutter_app/lib/main_timeline.dart +26 -122
  32. package/flutter_app/lib/main_voice_assistant.dart +0 -5
  33. package/flutter_app/lib/src/backend_client.dart +0 -102
  34. package/flutter_app/lib/src/desktop_companion_io.dart +1 -65
  35. package/flutter_app/lib/src/desktop_companion_stub.dart +0 -12
  36. package/flutter_app/linux/flutter/generated_plugin_registrant.cc +0 -4
  37. package/flutter_app/linux/flutter/generated_plugins.cmake +0 -1
  38. package/flutter_app/macos/Flutter/GeneratedPluginRegistrant.swift +0 -2
  39. package/flutter_app/macos/Podfile.lock +56 -5
  40. package/flutter_app/pubspec.lock +0 -7
  41. package/flutter_app/pubspec.yaml +0 -2
  42. package/flutter_app/web/index.html +174 -0
  43. package/flutter_app/windows/flutter/generated_plugin_registrant.cc +0 -3
  44. package/flutter_app/windows/flutter/generated_plugins.cmake +0 -1
  45. package/landing/index.html +0 -2
  46. package/lib/manager.js +1 -1
  47. package/lib/schema_migrations.js +75 -0
  48. package/package.json +1 -4
  49. package/server/db/database.js +1 -133
  50. package/server/http/middleware.js +2 -16
  51. package/server/http/routes.js +0 -2
  52. package/server/public/.last_build_id +1 -1
  53. package/server/public/assets/NOTICES +0 -25
  54. package/server/public/assets/fonts/MaterialIcons-Regular.otf +0 -0
  55. package/server/public/flutter_bootstrap.js +1 -1
  56. package/server/public/index.html +174 -0
  57. package/server/public/main.dart.js +88081 -90036
  58. package/server/routes/auth.js +11 -2
  59. package/server/routes/settings.js +0 -5
  60. package/server/routes/voice_assistant.js +1 -128
  61. package/server/services/account/erasure.js +0 -3
  62. package/server/services/ai/deliverables/artifact_helpers.js +1 -1
  63. package/server/services/ai/loop/conversation_loop.js +6 -2
  64. package/server/services/ai/loop/tool_dispatch.js +0 -3
  65. package/server/services/ai/messagingFallback.js +1 -1
  66. package/server/services/ai/settings.js +0 -6
  67. package/server/services/ai/toolEvidence.js +1 -4
  68. package/server/services/ai/tools.js +0 -234
  69. package/server/services/desktop/auth.js +0 -3
  70. package/server/services/desktop/registry.js +2 -50
  71. package/server/services/integrations/neoarchive/provider.js +616 -0
  72. package/server/services/integrations/neorecall/client.js +140 -0
  73. package/server/services/integrations/neorecall/constants.js +87 -0
  74. package/server/services/integrations/neorecall/provider.js +163 -0
  75. package/server/services/integrations/registry.js +4 -2
  76. package/server/services/manager.js +0 -22
  77. package/server/services/memory/manager.js +44 -19
  78. package/server/services/memory/retrieval_reasoning.js +36 -14
  79. package/server/services/messaging/whatsapp.js +18 -0
  80. package/server/services/security/tool_categories.js +0 -5
  81. package/server/services/social_video/service.js +2 -20
  82. package/server/services/tasks/adapters/index.js +1 -1
  83. package/server/services/tasks/integration_runtime.js +3 -67
  84. package/server/services/tasks/runtime.js +1 -6
  85. package/server/services/tasks/task_repository.js +6 -13
  86. package/server/services/timeline/service.js +0 -224
  87. package/server/services/voice/message.js +0 -24
  88. package/server/services/voice/providers.js +42 -1
  89. package/server/services/voice/runtimeManager.js +9 -5
  90. package/server/services/voice/turnRunner.js +0 -22
  91. package/server/services/wearable/service.js +0 -5
  92. package/docs/recordings-and-health.md +0 -41
  93. package/flutter_app/android/app/src/main/kotlin/com/neoagent/flutter_app/recording/RecordingBootReceiver.kt +0 -21
  94. package/flutter_app/android/app/src/main/kotlin/com/neoagent/flutter_app/recording/RecordingForegroundService.kt +0 -586
  95. package/flutter_app/android/app/src/main/kotlin/com/neoagent/flutter_app/recording/RecordingStateStore.kt +0 -78
  96. package/flutter_app/android/app/src/main/kotlin/com/neoagent/flutter_app/recording/RecordingUploadClient.kt +0 -104
  97. package/flutter_app/lib/main_recordings.dart +0 -920
  98. package/flutter_app/lib/src/desktop_ocr_bridge.dart +0 -2
  99. package/flutter_app/lib/src/desktop_ocr_bridge_io.dart +0 -125
  100. package/flutter_app/lib/src/desktop_ocr_bridge_stub.dart +0 -30
  101. package/flutter_app/lib/src/desktop_passive_history.dart +0 -332
  102. package/flutter_app/lib/src/recording_bridge.dart +0 -232
  103. package/flutter_app/lib/src/recording_bridge_io.dart +0 -1027
  104. package/flutter_app/lib/src/recording_bridge_stub.dart +0 -120
  105. package/flutter_app/lib/src/recording_bridge_web.dart +0 -702
  106. package/flutter_app/lib/src/recording_chunk_queue.dart +0 -149
  107. package/flutter_app/lib/src/recording_chunk_queue_io.dart +0 -182
  108. package/flutter_app/lib/src/recording_payloads.dart +0 -95
  109. package/flutter_app/third_party/desktop_audio_capture/LICENSE +0 -21
  110. package/flutter_app/third_party/desktop_audio_capture/README.md +0 -262
  111. package/flutter_app/third_party/desktop_audio_capture/lib/audio_capture.dart +0 -65
  112. package/flutter_app/third_party/desktop_audio_capture/lib/config/mic_audio_config.dart +0 -153
  113. package/flutter_app/third_party/desktop_audio_capture/lib/config/system_adudio_config.dart +0 -110
  114. package/flutter_app/third_party/desktop_audio_capture/lib/mic/mic_audio_capture.dart +0 -461
  115. package/flutter_app/third_party/desktop_audio_capture/lib/model/audio_status.dart +0 -91
  116. package/flutter_app/third_party/desktop_audio_capture/lib/model/decibel_data.dart +0 -106
  117. package/flutter_app/third_party/desktop_audio_capture/lib/model/input_device_type.dart +0 -219
  118. package/flutter_app/third_party/desktop_audio_capture/lib/system/system_audio_capture.dart +0 -336
  119. package/flutter_app/third_party/desktop_audio_capture/linux/CMakeLists.txt +0 -101
  120. package/flutter_app/third_party/desktop_audio_capture/linux/audio_capture_plugin.cc +0 -692
  121. package/flutter_app/third_party/desktop_audio_capture/linux/include/audio_capture/audio_capture_plugin.h +0 -35
  122. package/flutter_app/third_party/desktop_audio_capture/linux/include/audio_capture/mic_capture_plugin.h +0 -36
  123. package/flutter_app/third_party/desktop_audio_capture/linux/include/desktop_audio_capture/audio_capture_plugin.h +0 -32
  124. package/flutter_app/third_party/desktop_audio_capture/linux/include/desktop_audio_capture/mic_capture_plugin.h +0 -32
  125. package/flutter_app/third_party/desktop_audio_capture/linux/mic_capture_plugin.cc +0 -878
  126. package/flutter_app/third_party/desktop_audio_capture/macos/Classes/AudioCapturePlugin.swift +0 -27
  127. package/flutter_app/third_party/desktop_audio_capture/macos/Classes/MicCapturePlugin.swift +0 -1172
  128. package/flutter_app/third_party/desktop_audio_capture/macos/Classes/SystemCapturePlugin.swift +0 -655
  129. package/flutter_app/third_party/desktop_audio_capture/macos/Resources/PrivacyInfo.xcprivacy +0 -12
  130. package/flutter_app/third_party/desktop_audio_capture/macos/desktop_audio_capture.podspec +0 -30
  131. package/flutter_app/third_party/desktop_audio_capture/pubspec.yaml +0 -87
  132. package/flutter_app/third_party/desktop_audio_capture/windows/CMakeLists.txt +0 -105
  133. package/flutter_app/third_party/desktop_audio_capture/windows/audio_capture_plugin.cpp +0 -80
  134. package/flutter_app/third_party/desktop_audio_capture/windows/audio_capture_plugin.h +0 -31
  135. package/flutter_app/third_party/desktop_audio_capture/windows/audio_capture_plugin_c_api.cpp +0 -12
  136. package/flutter_app/third_party/desktop_audio_capture/windows/include/audio_capture/audio_capture_plugin_c_api.h +0 -23
  137. package/flutter_app/third_party/desktop_audio_capture/windows/include/desktop_audio_capture/audio_capture_plugin.h +0 -25
  138. package/flutter_app/third_party/desktop_audio_capture/windows/mic_capture_plugin.cpp +0 -1117
  139. package/flutter_app/third_party/desktop_audio_capture/windows/mic_capture_plugin.h +0 -115
  140. package/flutter_app/third_party/desktop_audio_capture/windows/system_audio_capture_plugin.cpp +0 -777
  141. package/flutter_app/third_party/desktop_audio_capture/windows/system_audio_capture_plugin.h +0 -87
  142. package/server/routes/recordings.js +0 -335
  143. package/server/routes/screenHistory.js +0 -190
  144. package/server/services/ai/recordingInsights.js +0 -105
  145. package/server/services/integrations/neomail/provider.js +0 -993
  146. package/server/services/recordings/deepgram.js +0 -58
  147. package/server/services/recordings/manager.js +0 -1273
  148. package/server/services/tasks/adapters/neomail_email_received.js +0 -46
  149. package/server/services/voice/screenshotContext.js +0 -73
  150. package/server/services/voice/turnCoordinator.js +0 -51
@@ -23,25 +23,17 @@ class _NeoAgentAppState extends State<NeoAgentApp>
23
23
  Timer? _assistantHotKeyHoldTimer;
24
24
  bool _desktopShellInitialized = false;
25
25
  bool _handlingDesktopClose = false;
26
- bool _desktopToolbarWindowMode = false;
27
26
  bool _desktopAssistantPopupWindowMode = false;
28
- bool _syncingDesktopPresentation = false;
29
27
  bool _assistantHotKeyPressed = false;
30
28
  bool _assistantHotKeyHandledAsHold = false;
31
29
  bool _assistantPttActive = false;
32
- bool _desktopAssistantBlockedHintVisible = false;
33
30
  bool _desktopAssistantReturnToHidden = false;
34
- bool _desktopToolbarReturnToHidden = false;
35
31
  Rect? _desktopNormalWindowBounds;
36
32
 
37
- static const Size _desktopToolbarWindowSize = Size(840, 128);
38
33
  static const Size _desktopAssistantPopupWindowSize = Size(460, 112);
39
34
  static const Duration _desktopAssistantHoldThreshold = Duration(
40
35
  milliseconds: 220,
41
36
  );
42
- static const Duration _desktopAssistantBlockedHintDuration = Duration(
43
- milliseconds: 1400,
44
- );
45
37
 
46
38
  @override
47
39
  void initState() {
@@ -52,7 +44,6 @@ class _NeoAgentAppState extends State<NeoAgentApp>
52
44
  backendClient: backendClient,
53
45
  healthBridge: HealthBridge(),
54
46
  widgetBridge: WidgetBridge(),
55
- recordingBridge: createRecordingBridge(),
56
47
  )..bootstrap();
57
48
  _webAppUpdateMonitor = createWebAppUpdateMonitor()..start();
58
49
  _controller.addListener(_handleControllerChanged);
@@ -155,80 +146,12 @@ class _NeoAgentAppState extends State<NeoAgentApp>
155
146
  }
156
147
  await _syncTrayMenu();
157
148
  await _syncAssistantHotkey();
158
- await _syncDesktopPresentation();
159
- }
160
-
161
- Future<void> _syncDesktopPresentation() async {
162
- if (_syncingDesktopPresentation) {
163
- return;
164
- }
165
- _syncingDesktopPresentation = true;
166
- try {
167
- final runtime = _controller.recordingRuntime;
168
- if (_desktopAssistantPopupWindowMode) {
169
- return;
170
- }
171
- final isWindowVisible = await windowManager.isVisible();
172
- if (_desktopToolbarWindowMode &&
173
- (!runtime.active || !runtime.floatingToolbarVisible)) {
174
- await _restoreMainWindowPresentation(
175
- hideAfterRestore: _desktopToolbarReturnToHidden,
176
- focusWindow: false,
177
- );
178
- _desktopToolbarReturnToHidden = false;
179
- return;
180
- }
181
- if (!_desktopToolbarWindowMode &&
182
- runtime.active &&
183
- runtime.supportsFloatingToolbar &&
184
- runtime.floatingToolbarVisible &&
185
- (_controller.desktopFloatingToolbarPopupRequested ||
186
- !isWindowVisible)) {
187
- await _showDetachedToolbarWindow(
188
- focusWindow:
189
- _controller.desktopFloatingToolbarPopupRequested ||
190
- isWindowVisible,
191
- );
192
- _controller.acknowledgeDesktopFloatingToolbarPopupRequest();
193
- }
194
- } finally {
195
- _syncingDesktopPresentation = false;
196
- }
197
149
  }
198
150
 
199
151
  Future<void> _syncTrayMenu() async {
200
- final runtime = _controller.recordingRuntime;
201
- final isRecordingActive = runtime.active;
202
- final pauseLabel = runtime.paused ? 'Resume' : 'Pause';
203
- final toolbarLabel = runtime.floatingToolbarVisible
204
- ? 'Hide floating bar'
205
- : 'Show floating bar';
206
152
  _trayMenu = Menu(
207
153
  items: <MenuItem>[
208
154
  MenuItem(key: 'open', label: 'Open'),
209
- MenuItem(
210
- key: 'start_recording',
211
- label: 'Start recording',
212
- disabled: isRecordingActive || !_controller.canStartDesktopRecording,
213
- ),
214
- MenuItem(
215
- key: 'pause_resume_recording',
216
- label: pauseLabel,
217
- disabled: !isRecordingActive,
218
- ),
219
- MenuItem(
220
- key: 'stop_recording',
221
- label: 'Stop',
222
- disabled: !isRecordingActive,
223
- ),
224
- MenuItem.separator(),
225
- MenuItem(
226
- key: 'toggle_toolbar',
227
- label: toolbarLabel,
228
- disabled:
229
- !_controller.recordingRuntime.supportsFloatingToolbar ||
230
- !isRecordingActive,
231
- ),
232
155
  MenuItem(key: 'open_voice_assistant', label: 'Open voice assistant'),
233
156
  MenuItem.separator(),
234
157
  MenuItem(key: 'quit', label: 'Quit'),
@@ -238,9 +161,7 @@ class _NeoAgentAppState extends State<NeoAgentApp>
238
161
  }
239
162
 
240
163
  Future<void> _syncAssistantHotkey() async {
241
- final shouldRegister =
242
- _controller.desktopAssistantHotkeyEnabled &&
243
- _controller.recordingRuntime.supportsGlobalHotkeys;
164
+ final shouldRegister = _controller.desktopAssistantHotkeyEnabled;
244
165
  if (!shouldRegister) {
245
166
  if (_assistantHotKey != null) {
246
167
  await hotKeyManager.unregister(_assistantHotKey!);
@@ -278,7 +199,6 @@ class _NeoAgentAppState extends State<NeoAgentApp>
278
199
  _assistantHotKeyPressed = true;
279
200
  _assistantHotKeyHandledAsHold = false;
280
201
  _assistantPttActive = false;
281
- _desktopAssistantBlockedHintVisible = false;
282
202
  _assistantHotKeyHoldTimer?.cancel();
283
203
  _assistantHotKeyHoldTimer = Timer(
284
204
  _desktopAssistantHoldThreshold,
@@ -291,7 +211,6 @@ class _NeoAgentAppState extends State<NeoAgentApp>
291
211
  _assistantHotKeyHoldTimer?.cancel();
292
212
  if (_assistantHotKeyHandledAsHold) {
293
213
  _assistantHotKeyHandledAsHold = false;
294
- _desktopAssistantBlockedHintVisible = false;
295
214
  if (_assistantPttActive ||
296
215
  _controller.isLiveVoiceCaptureStarting ||
297
216
  _controller.isLiveVoiceCaptureActive) {
@@ -314,12 +233,7 @@ class _NeoAgentAppState extends State<NeoAgentApp>
314
233
  if (!_assistantHotKeyPressed) {
315
234
  return;
316
235
  }
317
- _desktopAssistantBlockedHintVisible = false;
318
236
  _assistantHotKeyHandledAsHold = true;
319
- if (_controller.recordingRuntime.active) {
320
- await _showAssistantBlockedHint();
321
- return;
322
- }
323
237
  try {
324
238
  await _showAssistantPopupWindow();
325
239
  await _controller.startLiveVoiceCapture();
@@ -336,19 +250,6 @@ class _NeoAgentAppState extends State<NeoAgentApp>
336
250
  }
337
251
  }
338
252
 
339
- Future<void> _showAssistantBlockedHint() async {
340
- _desktopAssistantBlockedHintVisible = true;
341
- await _showAssistantPopupWindow();
342
- if (mounted) {
343
- setState(() {});
344
- }
345
- await Future<void>.delayed(_desktopAssistantBlockedHintDuration);
346
- if (_desktopAssistantBlockedHintVisible) {
347
- _desktopAssistantBlockedHintVisible = false;
348
- await _hideAssistantPopupWindow();
349
- }
350
- }
351
-
352
253
  bool _hotKeysMatch(HotKey first, HotKey second) {
353
254
  final firstModifiers = Set<HotKeyModifier>.from(
354
255
  first.modifiers ?? const <HotKeyModifier>[],
@@ -363,17 +264,14 @@ class _NeoAgentAppState extends State<NeoAgentApp>
363
264
  }
364
265
 
365
266
  Future<void> _openMainWindow() async {
366
- if (_desktopToolbarWindowMode || _desktopAssistantPopupWindowMode) {
267
+ if (_desktopAssistantPopupWindowMode) {
367
268
  await _restoreMainWindowPresentation();
368
269
  }
369
- _controller.acknowledgeDesktopFloatingToolbarPopupRequest();
370
- _desktopToolbarReturnToHidden = false;
371
270
  await windowManager.show();
372
271
  await windowManager.focus();
373
272
  }
374
273
 
375
274
  Future<void> _hideMainWindow() async {
376
- final runtime = _controller.recordingRuntime;
377
275
  if (_desktopAssistantPopupWindowMode) {
378
276
  await _restoreMainWindowPresentation(
379
277
  hideAfterRestore: true,
@@ -381,70 +279,15 @@ class _NeoAgentAppState extends State<NeoAgentApp>
381
279
  );
382
280
  return;
383
281
  }
384
- if (runtime.active &&
385
- runtime.supportsFloatingToolbar &&
386
- runtime.floatingToolbarVisible) {
387
- await _showDetachedToolbarWindow(focusWindow: false);
388
- return;
389
- }
390
- if (_desktopToolbarWindowMode) {
391
- await _restoreMainWindowPresentation(
392
- hideAfterRestore: true,
393
- focusWindow: false,
394
- );
395
- return;
396
- }
397
282
  await windowManager.hide();
398
283
  }
399
284
 
400
- Future<void> _showDetachedToolbarWindow({required bool focusWindow}) async {
401
- final runtime = _controller.recordingRuntime;
402
- if (!runtime.active || !runtime.supportsFloatingToolbar) {
403
- return;
404
- }
405
- final isVisible = await windowManager.isVisible();
406
- _desktopToolbarReturnToHidden =
407
- !isVisible &&
408
- !_desktopToolbarWindowMode &&
409
- !_desktopAssistantPopupWindowMode;
410
- if (!_desktopToolbarWindowMode && !_desktopAssistantPopupWindowMode) {
411
- _desktopNormalWindowBounds = await windowManager.getBounds();
412
- }
413
- if (mounted &&
414
- (!_desktopToolbarWindowMode || _desktopAssistantPopupWindowMode)) {
415
- setState(() {
416
- _desktopToolbarWindowMode = true;
417
- _desktopAssistantPopupWindowMode = false;
418
- });
419
- }
420
- await windowManager.setTitle('NeoAgent');
421
- await windowManager.setBackgroundColor(Colors.transparent);
422
- await windowManager.setTitleBarStyle(
423
- TitleBarStyle.hidden,
424
- windowButtonVisibility: false,
425
- );
426
- if (!kIsWeb && defaultTargetPlatform == TargetPlatform.macOS) {
427
- await windowManager.setHasShadow(false);
428
- }
429
- await windowManager.setResizable(false);
430
- await windowManager.setAlwaysOnTop(true);
431
- await windowManager.setSkipTaskbar(true);
432
- await windowManager.setSize(_desktopToolbarWindowSize);
433
- await windowManager.center();
434
- await windowManager.show(inactive: !focusWindow);
435
- if (focusWindow) {
436
- await windowManager.focus();
437
- }
438
- }
439
-
440
285
  Future<void> _restoreMainWindowPresentation({
441
286
  bool hideAfterRestore = false,
442
287
  bool focusWindow = true,
443
288
  }) async {
444
- if (mounted &&
445
- (_desktopToolbarWindowMode || _desktopAssistantPopupWindowMode)) {
289
+ if (mounted && _desktopAssistantPopupWindowMode) {
446
290
  setState(() {
447
- _desktopToolbarWindowMode = false;
448
291
  _desktopAssistantPopupWindowMode = false;
449
292
  });
450
293
  }
@@ -476,13 +319,11 @@ class _NeoAgentAppState extends State<NeoAgentApp>
476
319
  Future<void> _showAssistantPopupWindow() async {
477
320
  final isVisible = await windowManager.isVisible();
478
321
  _desktopAssistantReturnToHidden = !isVisible;
479
- if (!_desktopToolbarWindowMode && !_desktopAssistantPopupWindowMode) {
322
+ if (!_desktopAssistantPopupWindowMode) {
480
323
  _desktopNormalWindowBounds = await windowManager.getBounds();
481
324
  }
482
- if (mounted &&
483
- (!_desktopAssistantPopupWindowMode || _desktopToolbarWindowMode)) {
325
+ if (mounted && !_desktopAssistantPopupWindowMode) {
484
326
  setState(() {
485
- _desktopToolbarWindowMode = false;
486
327
  _desktopAssistantPopupWindowMode = true;
487
328
  });
488
329
  }
@@ -508,7 +349,6 @@ class _NeoAgentAppState extends State<NeoAgentApp>
508
349
  if (!_desktopAssistantPopupWindowMode) {
509
350
  return;
510
351
  }
511
- _desktopAssistantBlockedHintVisible = false;
512
352
  final shouldHideWindow = _desktopAssistantReturnToHidden;
513
353
  _desktopAssistantReturnToHidden = false;
514
354
  await _restoreMainWindowPresentation(
@@ -532,9 +372,6 @@ class _NeoAgentAppState extends State<NeoAgentApp>
532
372
  }
533
373
 
534
374
  Future<void> _toggleAssistantPopupCaptureFromUi() async {
535
- if (_desktopAssistantBlockedHintVisible) {
536
- return;
537
- }
538
375
  try {
539
376
  _assistantPttActive = !_controller.isLiveVoiceCaptureEngaged;
540
377
  await _controller.toggleLiveVoiceCapture();
@@ -568,11 +405,9 @@ class _NeoAgentAppState extends State<NeoAgentApp>
568
405
  '|auth:${_controller.isAuthenticated}'
569
406
  '|refresh:${_controller.isRefreshing}'
570
407
  '|section:${_controller.selectedSection.name}'
571
- '|toolbarMode:$_desktopToolbarWindowMode'
572
408
  '|assistantPopupMode:$_desktopAssistantPopupWindowMode'
573
409
  '|assistantPttActive:${_controller.isLiveVoiceCaptureActive}'
574
- '|assistantPttStarting:${_controller.isLiveVoiceCaptureStarting}'
575
- '|assistantBlockedHint:$_desktopAssistantBlockedHintVisible';
410
+ '|assistantPttStarting:${_controller.isLiveVoiceCaptureStarting}';
576
411
  if (_navigatorScopeSignature != rootStateSignature) {
577
412
  _navigatorScopeSignature = rootStateSignature;
578
413
  _navigatorKey = GlobalKey<NavigatorState>();
@@ -591,8 +426,7 @@ class _NeoAgentAppState extends State<NeoAgentApp>
591
426
  return Stack(
592
427
  children: <Widget>[
593
428
  if (child != null) child,
594
- if (!_desktopToolbarWindowMode &&
595
- !_desktopAssistantPopupWindowMode &&
429
+ if (!_desktopAssistantPopupWindowMode &&
596
430
  _controller.showOfflineBanner)
597
431
  Positioned(
598
432
  top: 0,
@@ -613,8 +447,7 @@ class _NeoAgentAppState extends State<NeoAgentApp>
613
447
  ),
614
448
  ),
615
449
  ),
616
- if (!_desktopToolbarWindowMode &&
617
- !_desktopAssistantPopupWindowMode &&
450
+ if (!_desktopAssistantPopupWindowMode &&
618
451
  _webAppUpdateMonitor.isSupported &&
619
452
  _webAppUpdateMonitor.updateAvailable)
620
453
  Positioned(
@@ -636,26 +469,16 @@ class _NeoAgentAppState extends State<NeoAgentApp>
636
469
  ),
637
470
  ),
638
471
  ),
639
- if (_supportsDesktopShell &&
640
- !_desktopToolbarWindowMode &&
641
- !_desktopAssistantPopupWindowMode)
642
- _DesktopFloatingToolbar(controller: _controller),
643
472
  ],
644
473
  );
645
474
  },
646
475
  home: _desktopAssistantPopupWindowMode
647
476
  ? _DesktopAssistantPopupShell(
648
477
  controller: _controller,
649
- blockedHintVisible: _desktopAssistantBlockedHintVisible,
650
478
  onPrimaryAction: _toggleAssistantPopupCaptureFromUi,
651
479
  onCancel: _cancelAssistantPopupFromUi,
652
480
  )
653
- : (_desktopToolbarWindowMode
654
- ? _DetachedDesktopFloatingToolbarShell(
655
- controller: _controller,
656
- onOpenMainWindow: _openMainWindow,
657
- )
658
- : NeoAgentRoot(controller: _controller)),
481
+ : NeoAgentRoot(controller: _controller),
659
482
  );
660
483
  },
661
484
  );
@@ -676,28 +499,6 @@ class _NeoAgentAppState extends State<NeoAgentApp>
676
499
  case 'open':
677
500
  unawaited(_openMainWindow());
678
501
  break;
679
- case 'start_recording':
680
- if (_controller.canStartDesktopRecording) {
681
- unawaited(_controller.startDesktopRecording());
682
- }
683
- break;
684
- case 'pause_resume_recording':
685
- if (_controller.recordingRuntime.paused) {
686
- unawaited(_controller.resumeDesktopRecording());
687
- } else {
688
- unawaited(_controller.pauseDesktopRecording());
689
- }
690
- break;
691
- case 'stop_recording':
692
- unawaited(_controller.stopRecording());
693
- break;
694
- case 'toggle_toolbar':
695
- if (_controller.recordingRuntime.floatingToolbarVisible) {
696
- unawaited(_controller.hideDesktopFloatingToolbar());
697
- } else {
698
- unawaited(_controller.showDesktopFloatingToolbar());
699
- }
700
- break;
701
502
  case 'open_voice_assistant':
702
503
  unawaited(_openMainWindow());
703
504
  _controller.setSelectedSection(AppSection.voiceAssistant);