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
@@ -2,13 +2,27 @@ PODS:
2
2
  - audioplayers_darwin (0.0.1):
3
3
  - Flutter
4
4
  - FlutterMacOS
5
- - desktop_audio_capture (0.0.1):
5
+ - connectivity_plus (0.0.1):
6
+ - FlutterMacOS
7
+ - file_picker (0.0.1):
8
+ - FlutterMacOS
9
+ - flutter_local_notifications (0.0.1):
10
+ - FlutterMacOS
11
+ - flutter_secure_storage_macos (6.1.3):
6
12
  - FlutterMacOS
7
13
  - FlutterMacOS (1.0.0)
14
+ - geolocator_apple (1.2.0):
15
+ - Flutter
16
+ - FlutterMacOS
8
17
  - HotKey (0.2.1)
9
18
  - hotkey_manager_macos (0.0.1):
10
19
  - FlutterMacOS
11
20
  - HotKey
21
+ - mobile_scanner (7.0.0):
22
+ - Flutter
23
+ - FlutterMacOS
24
+ - package_info_plus (0.0.1):
25
+ - FlutterMacOS
12
26
  - path_provider_foundation (0.0.1):
13
27
  - Flutter
14
28
  - FlutterMacOS
@@ -24,20 +38,33 @@ PODS:
24
38
  - universal_ble (0.0.1):
25
39
  - Flutter
26
40
  - FlutterMacOS
41
+ - url_launcher_macos (0.0.1):
42
+ - FlutterMacOS
43
+ - video_player_avfoundation (0.0.1):
44
+ - Flutter
45
+ - FlutterMacOS
27
46
  - window_manager (0.5.0):
28
47
  - FlutterMacOS
29
48
 
30
49
  DEPENDENCIES:
31
50
  - audioplayers_darwin (from `Flutter/ephemeral/.symlinks/plugins/audioplayers_darwin/darwin`)
32
- - desktop_audio_capture (from `Flutter/ephemeral/.symlinks/plugins/desktop_audio_capture/macos`)
51
+ - connectivity_plus (from `Flutter/ephemeral/.symlinks/plugins/connectivity_plus/macos`)
52
+ - file_picker (from `Flutter/ephemeral/.symlinks/plugins/file_picker/macos`)
53
+ - flutter_local_notifications (from `Flutter/ephemeral/.symlinks/plugins/flutter_local_notifications/macos`)
54
+ - flutter_secure_storage_macos (from `Flutter/ephemeral/.symlinks/plugins/flutter_secure_storage_macos/macos`)
33
55
  - FlutterMacOS (from `Flutter/ephemeral`)
56
+ - geolocator_apple (from `Flutter/ephemeral/.symlinks/plugins/geolocator_apple/darwin`)
34
57
  - hotkey_manager_macos (from `Flutter/ephemeral/.symlinks/plugins/hotkey_manager_macos/macos`)
58
+ - mobile_scanner (from `Flutter/ephemeral/.symlinks/plugins/mobile_scanner/darwin`)
59
+ - package_info_plus (from `Flutter/ephemeral/.symlinks/plugins/package_info_plus/macos`)
35
60
  - path_provider_foundation (from `Flutter/ephemeral/.symlinks/plugins/path_provider_foundation/darwin`)
36
61
  - record_macos (from `Flutter/ephemeral/.symlinks/plugins/record_macos/macos`)
37
62
  - screen_retriever_macos (from `Flutter/ephemeral/.symlinks/plugins/screen_retriever_macos/macos`)
38
63
  - shared_preferences_foundation (from `Flutter/ephemeral/.symlinks/plugins/shared_preferences_foundation/darwin`)
39
64
  - tray_manager (from `Flutter/ephemeral/.symlinks/plugins/tray_manager/macos`)
40
65
  - universal_ble (from `Flutter/ephemeral/.symlinks/plugins/universal_ble/darwin`)
66
+ - url_launcher_macos (from `Flutter/ephemeral/.symlinks/plugins/url_launcher_macos/macos`)
67
+ - video_player_avfoundation (from `Flutter/ephemeral/.symlinks/plugins/video_player_avfoundation/darwin`)
41
68
  - window_manager (from `Flutter/ephemeral/.symlinks/plugins/window_manager/macos`)
42
69
 
43
70
  SPEC REPOS:
@@ -47,12 +74,24 @@ SPEC REPOS:
47
74
  EXTERNAL SOURCES:
48
75
  audioplayers_darwin:
49
76
  :path: Flutter/ephemeral/.symlinks/plugins/audioplayers_darwin/darwin
50
- desktop_audio_capture:
51
- :path: Flutter/ephemeral/.symlinks/plugins/desktop_audio_capture/macos
77
+ connectivity_plus:
78
+ :path: Flutter/ephemeral/.symlinks/plugins/connectivity_plus/macos
79
+ file_picker:
80
+ :path: Flutter/ephemeral/.symlinks/plugins/file_picker/macos
81
+ flutter_local_notifications:
82
+ :path: Flutter/ephemeral/.symlinks/plugins/flutter_local_notifications/macos
83
+ flutter_secure_storage_macos:
84
+ :path: Flutter/ephemeral/.symlinks/plugins/flutter_secure_storage_macos/macos
52
85
  FlutterMacOS:
53
86
  :path: Flutter/ephemeral
87
+ geolocator_apple:
88
+ :path: Flutter/ephemeral/.symlinks/plugins/geolocator_apple/darwin
54
89
  hotkey_manager_macos:
55
90
  :path: Flutter/ephemeral/.symlinks/plugins/hotkey_manager_macos/macos
91
+ mobile_scanner:
92
+ :path: Flutter/ephemeral/.symlinks/plugins/mobile_scanner/darwin
93
+ package_info_plus:
94
+ :path: Flutter/ephemeral/.symlinks/plugins/package_info_plus/macos
56
95
  path_provider_foundation:
57
96
  :path: Flutter/ephemeral/.symlinks/plugins/path_provider_foundation/darwin
58
97
  record_macos:
@@ -65,21 +104,33 @@ EXTERNAL SOURCES:
65
104
  :path: Flutter/ephemeral/.symlinks/plugins/tray_manager/macos
66
105
  universal_ble:
67
106
  :path: Flutter/ephemeral/.symlinks/plugins/universal_ble/darwin
107
+ url_launcher_macos:
108
+ :path: Flutter/ephemeral/.symlinks/plugins/url_launcher_macos/macos
109
+ video_player_avfoundation:
110
+ :path: Flutter/ephemeral/.symlinks/plugins/video_player_avfoundation/darwin
68
111
  window_manager:
69
112
  :path: Flutter/ephemeral/.symlinks/plugins/window_manager/macos
70
113
 
71
114
  SPEC CHECKSUMS:
72
115
  audioplayers_darwin: 835ced6edd4c9fc8ebb0a7cc9e294a91d99917d5
73
- desktop_audio_capture: b3f657c2048bf41a309e31f1e1b656c5cdee1bd1
116
+ connectivity_plus: 4adf20a405e25b42b9c9f87feff8f4b6fde18a4e
117
+ file_picker: 7584aae6fa07a041af2b36a2655122d42f578c1a
118
+ flutter_local_notifications: 13862b132e32eb858dea558a86d45d08daeacfe7
119
+ flutter_secure_storage_macos: 7f45e30f838cf2659862a4e4e3ee1c347c2b3b54
74
120
  FlutterMacOS: d0db08ddef1a9af05a5ec4b724367152bb0500b1
121
+ geolocator_apple: ab36aa0e8b7d7a2d7639b3b4e48308394e8cef5e
75
122
  HotKey: 400beb7caa29054ea8d864c96f5ba7e5b4852277
76
123
  hotkey_manager_macos: a4317849af96d2430fa89944d3c58977ca089fbe
124
+ mobile_scanner: 9157936403f5a0644ca3779a38ff8404c5434a93
125
+ package_info_plus: f0052d280d17aa382b932f399edf32507174e870
77
126
  path_provider_foundation: bb55f6dbba17d0dccd6737fe6f7f34fbd0376880
78
127
  record_macos: 7f227161b93c49e7e34fe681c5891c8622c8cc8b
79
128
  screen_retriever_macos: 452e51764a9e1cdb74b3c541238795849f21557f
80
129
  shared_preferences_foundation: 7036424c3d8ec98dfe75ff1667cb0cd531ec82bb
81
130
  tray_manager: a104b5c81b578d83f3c3d0f40a997c8b10810166
82
131
  universal_ble: 45519b2aeafe62761e2c6309f8927edb5288b914
132
+ url_launcher_macos: f87a979182d112f911de6820aefddaf56ee9fbfd
133
+ video_player_avfoundation: dd410b52df6d2466a42d28550e33e4146928280a
83
134
  window_manager: b729e31d38fb04905235df9ea896128991cad99e
84
135
 
85
136
  PODFILE CHECKSUM: 89c84cf5c2351c1e554c6dea18d31a879fc3a19e
@@ -177,13 +177,6 @@ packages:
177
177
  url: "https://pub.dev"
178
178
  source: hosted
179
179
  version: "0.7.12"
180
- desktop_audio_capture:
181
- dependency: "direct main"
182
- description:
183
- path: "third_party/desktop_audio_capture"
184
- relative: true
185
- source: path
186
- version: "0.0.2"
187
180
  fake_async:
188
181
  dependency: transitive
189
182
  description:
@@ -29,8 +29,6 @@ dependencies:
29
29
  window_manager: ^0.5.1
30
30
  tray_manager: ^0.5.2
31
31
  hotkey_manager: ^0.2.3
32
- desktop_audio_capture:
33
- path: third_party/desktop_audio_capture
34
32
  launch_at_startup: ^0.5.1
35
33
  mobile_scanner: ^7.2.0
36
34
  geolocator: ^13.0.2
@@ -32,8 +32,182 @@
32
32
 
33
33
  <title>NeoAgent</title>
34
34
  <link rel="manifest" href="manifest.json">
35
+
36
+ <style>
37
+ /* NeoAgent "Control Surface" splash — mirrors flutter_app/lib/src/theme/palette.dart
38
+ so the pre-Flutter paint matches the app instead of flashing white. */
39
+ html, body {
40
+ height: 100%;
41
+ margin: 0;
42
+ background: #0E1511;
43
+ }
44
+ @media (prefers-color-scheme: light) {
45
+ html, body { background: #F4F1E8; }
46
+ }
47
+
48
+ #splash {
49
+ position: fixed;
50
+ inset: 0;
51
+ z-index: 9999;
52
+ display: flex;
53
+ flex-direction: column;
54
+ align-items: center;
55
+ justify-content: center;
56
+ gap: 20px;
57
+ background: radial-gradient(120% 120% at 50% 38%, #131b16 0%, #0A0F0C 70%, #0E1511 100%);
58
+ transition: opacity 0.5s ease;
59
+ }
60
+ @media (prefers-color-scheme: light) {
61
+ #splash {
62
+ background: radial-gradient(120% 120% at 50% 38%, #FDFCF8 0%, #EDE9DC 70%, #F4F1E8 100%);
63
+ }
64
+ }
65
+ #splash.splash-hidden {
66
+ opacity: 0;
67
+ pointer-events: none;
68
+ }
69
+
70
+ #splash-mark {
71
+ width: 88px;
72
+ height: 88px;
73
+ filter: drop-shadow(0 6px 18px rgba(0, 0, 0, 0.35));
74
+ animation: splash-breathe 2.4s ease-in-out infinite;
75
+ }
76
+ @media (prefers-color-scheme: light) {
77
+ #splash-mark { filter: drop-shadow(0 6px 16px rgba(28, 33, 23, 0.18)); }
78
+ }
79
+ #splash-mark .orbit {
80
+ transform-origin: 50px 50px;
81
+ animation: splash-spin 5.5s linear infinite;
82
+ }
83
+ #splash-mark .orbit-2 {
84
+ animation-duration: 8.5s;
85
+ animation-direction: reverse;
86
+ }
87
+
88
+ #splash-word {
89
+ font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", ui-sans-serif, system-ui, sans-serif;
90
+ font-size: 15px;
91
+ font-weight: 600;
92
+ letter-spacing: 0.28em;
93
+ text-transform: uppercase;
94
+ color: #AEB7A6;
95
+ opacity: 0.92;
96
+ }
97
+ @media (prefers-color-scheme: light) {
98
+ #splash-word { color: #49503F; }
99
+ }
100
+
101
+ #splash-dots {
102
+ display: flex;
103
+ gap: 6px;
104
+ }
105
+ #splash-dots span {
106
+ width: 5px;
107
+ height: 5px;
108
+ border-radius: 50%;
109
+ background: #E1B052;
110
+ opacity: 0.35;
111
+ animation: splash-dot 1.2s ease-in-out infinite;
112
+ }
113
+ @media (prefers-color-scheme: light) {
114
+ #splash-dots span { background: #B07D2B; }
115
+ }
116
+ #splash-dots span:nth-child(2) { animation-delay: 0.15s; }
117
+ #splash-dots span:nth-child(3) { animation-delay: 0.3s; }
118
+
119
+ @keyframes splash-breathe {
120
+ 0%, 100% { transform: scale(1); }
121
+ 50% { transform: scale(1.045); }
122
+ }
123
+ @keyframes splash-spin {
124
+ from { transform: rotate(0deg); }
125
+ to { transform: rotate(360deg); }
126
+ }
127
+ @keyframes splash-dot {
128
+ 0%, 80%, 100% { opacity: 0.35; transform: translateY(0); }
129
+ 40% { opacity: 1; transform: translateY(-3px); }
130
+ }
131
+
132
+ @media (prefers-reduced-motion: reduce) {
133
+ #splash-mark, #splash-mark .orbit, #splash-dots span {
134
+ animation: none !important;
135
+ }
136
+ }
137
+ </style>
35
138
  </head>
36
139
  <body>
140
+ <div id="splash" role="presentation" aria-hidden="true">
141
+ <svg id="splash-mark" viewBox="0 0 100 100" xmlns="http://www.w3.org/2000/svg">
142
+ <defs>
143
+ <linearGradient id="splash-tile" x1="0%" y1="0%" x2="100%" y2="100%">
144
+ <stop offset="0%" stop-color="#705331"/>
145
+ <stop offset="100%" stop-color="#22564c"/>
146
+ </linearGradient>
147
+ <radialGradient id="splash-shine" cx="26%" cy="14%" r="72%">
148
+ <stop offset="0%" stop-color="#ffffff" stop-opacity="0.22"/>
149
+ <stop offset="100%" stop-color="#ffffff" stop-opacity="0"/>
150
+ </radialGradient>
151
+ <radialGradient id="splash-core" cx="38%" cy="32%" r="75%">
152
+ <stop offset="0%" stop-color="#fffdf6"/>
153
+ <stop offset="48%" stop-color="#eee3cc"/>
154
+ <stop offset="100%" stop-color="#b5a888"/>
155
+ </radialGradient>
156
+ <radialGradient id="splash-node" cx="36%" cy="30%" r="80%">
157
+ <stop offset="0%" stop-color="#f8dca8"/>
158
+ <stop offset="52%" stop-color="#d3a85f"/>
159
+ <stop offset="100%" stop-color="#9b6f2f"/>
160
+ </radialGradient>
161
+ <linearGradient id="splash-tube" x1="0%" y1="0%" x2="0%" y2="100%">
162
+ <stop offset="0%" stop-color="#fffaf0"/>
163
+ <stop offset="52%" stop-color="#efe7d6"/>
164
+ <stop offset="100%" stop-color="#cabf9f"/>
165
+ </linearGradient>
166
+ <clipPath id="splash-tc"><rect x="0" y="0" width="100" height="100" rx="22.5"/></clipPath>
167
+ </defs>
168
+ <g clip-path="url(#splash-tc)">
169
+ <rect x="0" y="0" width="100" height="100" fill="url(#splash-tile)"/>
170
+ <rect x="0" y="0" width="100" height="100" fill="url(#splash-shine)"/>
171
+ <g fill="none" stroke="url(#splash-tube)" stroke-linecap="round">
172
+ <circle class="orbit orbit-1" cx="50" cy="50" r="17" stroke-width="5" stroke-dasharray="78 29" transform="rotate(-35 50 50)" stroke-opacity="0.92"/>
173
+ <circle class="orbit orbit-2" cx="50" cy="50" r="30" stroke-width="5" stroke-dasharray="150 39" transform="rotate(70 50 50)" stroke-opacity="0.8"/>
174
+ </g>
175
+ <circle cx="50" cy="50" r="7" fill="url(#splash-core)"/>
176
+ <circle cx="50" cy="20" r="5.6" fill="url(#splash-node)"/>
177
+ <circle cx="48" cy="18.4" r="1.7" fill="#fff7e6" fill-opacity="0.8"/>
178
+ </g>
179
+ <rect x="0.6" y="0.6" width="98.8" height="98.8" rx="22" fill="none" stroke="#ffffff" stroke-opacity="0.16" stroke-width="1.2"/>
180
+ </svg>
181
+ <div id="splash-word">NeoAgent</div>
182
+ <div id="splash-dots"><span></span><span></span><span></span></div>
183
+ </div>
184
+
185
+ <script>
186
+ // Fade the splash once Flutter mounts its view (or after a safety timeout),
187
+ // so we never get stuck showing it if the mutation never fires.
188
+ (function () {
189
+ var splash = document.getElementById('splash');
190
+ var hidden = false;
191
+
192
+ function hideSplash() {
193
+ if (hidden) return;
194
+ hidden = true;
195
+ splash.classList.add('splash-hidden');
196
+ setTimeout(function () { splash.remove(); }, 550);
197
+ }
198
+
199
+ var observer = new MutationObserver(function () {
200
+ if (document.querySelector('flt-glass-pane, flutter-view')) {
201
+ hideSplash();
202
+ observer.disconnect();
203
+ }
204
+ });
205
+ observer.observe(document.body, { childList: true, subtree: true });
206
+
207
+ setTimeout(hideSplash, 6000);
208
+ })();
209
+ </script>
210
+
37
211
  <script src="flutter_bootstrap.js" async></script>
38
212
  </body>
39
213
  </html>
@@ -8,7 +8,6 @@
8
8
 
9
9
  #include <audioplayers_windows/audioplayers_windows_plugin.h>
10
10
  #include <connectivity_plus/connectivity_plus_windows_plugin.h>
11
- #include <desktop_audio_capture/audio_capture_plugin.h>
12
11
  #include <flutter_secure_storage_windows/flutter_secure_storage_windows_plugin.h>
13
12
  #include <geolocator_windows/geolocator_windows.h>
14
13
  #include <hotkey_manager_windows/hotkey_manager_windows_plugin_c_api.h>
@@ -25,8 +24,6 @@ void RegisterPlugins(flutter::PluginRegistry* registry) {
25
24
  registry->GetRegistrarForPlugin("AudioplayersWindowsPlugin"));
26
25
  ConnectivityPlusWindowsPluginRegisterWithRegistrar(
27
26
  registry->GetRegistrarForPlugin("ConnectivityPlusWindowsPlugin"));
28
- AudioCapturePluginRegisterWithRegistrar(
29
- registry->GetRegistrarForPlugin("AudioCapturePlugin"));
30
27
  FlutterSecureStorageWindowsPluginRegisterWithRegistrar(
31
28
  registry->GetRegistrarForPlugin("FlutterSecureStorageWindowsPlugin"));
32
29
  GeolocatorWindowsRegisterWithRegistrar(
@@ -5,7 +5,6 @@
5
5
  list(APPEND FLUTTER_PLUGIN_LIST
6
6
  audioplayers_windows
7
7
  connectivity_plus
8
- desktop_audio_capture
9
8
  flutter_secure_storage_windows
10
9
  geolocator_windows
11
10
  hotkey_manager_windows
@@ -1055,13 +1055,11 @@ p { margin: 0; text-wrap: pretty; }
1055
1055
  <span class="chip"><svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><path d="M12 3a5 5 0 0 0-5 5c0 1-1 1.5-1 3a4 4 0 0 0 4 4v3M12 3a5 5 0 0 1 5 5c0 1 1 1.5 1 3a4 4 0 0 1-4 4v3" stroke-linecap="round"></path></svg>Memory</span>
1056
1056
  <span class="chip"><svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><circle cx="5" cy="12" r="2"></circle><circle cx="19" cy="5" r="2"></circle><circle cx="19" cy="19" r="2"></circle><path d="m7 12 10-6M7 12l10 6" stroke-linecap="round"></path></svg>Skills</span>
1057
1057
  <span class="chip"><svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><path d="M14 7a4 4 0 0 0-5.4 5.4L4 17l3 3 4.6-4.6A4 4 0 0 0 17 10l-2.5 2.5L12 10l2.5-2.5Z" stroke-linejoin="round"></path></svg>Tools &amp; MCP</span>
1058
- <span class="chip"><svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><path d="M5 12h14M13 6l6 6-6 6" stroke-linecap="round" stroke-linejoin="round"></path></svg>Recordings</span>
1059
1058
  <span class="chip"><svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><rect x="2" y="3" width="20" height="15" rx="2"></rect><path d="M8 21h8M12 18v3" stroke-linecap="round"></path></svg>Remote browser</span>
1060
1059
  <span class="chip"><svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><path d="m12 3 2.2 5.8L20 11l-5.8 2.2L12 19l-2.2-5.8L4 11l5.8-2.2L12 3Z" stroke-linejoin="round"></path></svg>Automations</span>
1061
1060
  <span class="chip"><svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><path d="M12 3a5 5 0 0 0-5 5c0 1-1 1.5-1 3a4 4 0 0 0 4 4v3M12 3a5 5 0 0 1 5 5c0 1 1 1.5 1 3a4 4 0 0 1-4 4v3" stroke-linecap="round"></path></svg>Memory</span>
1062
1061
  <span class="chip"><svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><circle cx="5" cy="12" r="2"></circle><circle cx="19" cy="5" r="2"></circle><circle cx="19" cy="19" r="2"></circle><path d="m7 12 10-6M7 12l10 6" stroke-linecap="round"></path></svg>Skills</span>
1063
1062
  <span class="chip"><svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><path d="M14 7a4 4 0 0 0-5.4 5.4L4 17l3 3 4.6-4.6A4 4 0 0 0 17 10l-2.5 2.5L12 10l2.5-2.5Z" stroke-linejoin="round"></path></svg>Tools &amp; MCP</span>
1064
- <span class="chip"><svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><path d="M5 12h14M13 6l6 6-6 6" stroke-linecap="round" stroke-linejoin="round"></path></svg>Recordings</span>
1065
1063
  </div>
1066
1064
  </div>
1067
1065
  </section>
package/lib/manager.js CHANGED
@@ -695,7 +695,7 @@ async function cmdSetup() {
695
695
  current.FIGMA_OAUTH_REDIRECT_URI || ''
696
696
  );
697
697
 
698
- heading('Voice And Recording');
698
+ heading('Voice');
699
699
  const deepgramApiKey = await askSecret('Deepgram API key', current.DEEPGRAM_API_KEY || '');
700
700
  const deepgramBaseUrl = await ask(
701
701
  'Deepgram base URL',
@@ -46,6 +46,78 @@ function migrateMemoryEmbeddingIndex(db) {
46
46
  `);
47
47
  }
48
48
 
49
+ function removeRetiredCaptureData(db) {
50
+ migrateLegacyTranscriptionSettings(db);
51
+
52
+ for (const table of [
53
+ 'screen_history_fts',
54
+ 'screen_history',
55
+ 'recording_transcript_segments',
56
+ 'recording_chunks',
57
+ 'recording_sources',
58
+ 'recording_sessions',
59
+ ]) {
60
+ db.exec(`DROP TABLE IF EXISTS ${table}`);
61
+ }
62
+
63
+ db.prepare("DELETE FROM timeline_events WHERE source_kind = 'screen'").run();
64
+
65
+ for (const column of [
66
+ 'passive_history_enabled',
67
+ 'passive_history_last_uploaded_at',
68
+ 'passive_history_last_error',
69
+ ]) {
70
+ try {
71
+ db.exec(`ALTER TABLE desktop_companion_devices DROP COLUMN ${column}`);
72
+ } catch {
73
+ // The column was already removed or never existed.
74
+ }
75
+ }
76
+ }
77
+
78
+ function migrateLegacyTranscriptionSettings(db) {
79
+ const keyMappings = [
80
+ ['default_recording_transcription_provider', 'voice_stt_provider'],
81
+ ['default_recording_transcription_model', 'voice_stt_model'],
82
+ ];
83
+
84
+ const migrateUserSetting = db.prepare(`
85
+ INSERT INTO user_settings (user_id, key, value)
86
+ SELECT source.user_id, ?, source.value
87
+ FROM user_settings AS source
88
+ WHERE source.key = ?
89
+ AND NOT EXISTS (
90
+ SELECT 1
91
+ FROM user_settings AS target
92
+ WHERE target.user_id = source.user_id
93
+ AND target.key = ?
94
+ )
95
+ `);
96
+ const migrateAgentSetting = db.prepare(`
97
+ INSERT INTO agent_settings (user_id, agent_id, key, value)
98
+ SELECT source.user_id, source.agent_id, ?, source.value
99
+ FROM agent_settings AS source
100
+ WHERE source.key = ?
101
+ AND NOT EXISTS (
102
+ SELECT 1
103
+ FROM agent_settings AS target
104
+ WHERE target.user_id = source.user_id
105
+ AND target.agent_id = source.agent_id
106
+ AND target.key = ?
107
+ )
108
+ `);
109
+
110
+ const transaction = db.transaction(() => {
111
+ for (const [legacyKey, currentKey] of keyMappings) {
112
+ migrateUserSetting.run(currentKey, legacyKey, currentKey);
113
+ migrateAgentSetting.run(currentKey, legacyKey, currentKey);
114
+ db.prepare('DELETE FROM user_settings WHERE key = ?').run(legacyKey);
115
+ db.prepare('DELETE FROM agent_settings WHERE key = ?').run(legacyKey);
116
+ }
117
+ });
118
+ transaction();
119
+ }
120
+
49
121
  function migrateMemoryProvenance(db) {
50
122
  db.exec(`
51
123
  CREATE TABLE IF NOT EXISTS memory_source_chunks (
@@ -562,6 +634,7 @@ function migrateBilling(db) {
562
634
  }
563
635
 
564
636
  function runSchemaMigrations(db) {
637
+ removeRetiredCaptureData(db);
565
638
  migrateMemoryEmbeddingIndex(db);
566
639
  migrateMemoryProvenance(db);
567
640
  migrateMemoryRelations(db);
@@ -577,6 +650,8 @@ function runSchemaMigrations(db) {
577
650
  }
578
651
 
579
652
  module.exports = {
653
+ migrateLegacyTranscriptionSettings,
654
+ removeRetiredCaptureData,
580
655
  migrateMemoryEmbeddingIndex,
581
656
  migrateMemoryProvenance,
582
657
  migrateMemoryRelations,
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "neoagent",
3
- "version": "3.1.1-beta.9",
3
+ "version": "3.2.0",
4
4
  "description": "Self-hosted AI agent for long-running tasks, automation, messaging, device control, and local memory",
5
5
  "license": "AGPL-3.0-only",
6
6
  "main": "server/index.js",
@@ -54,9 +54,6 @@
54
54
  "benchmark:setup": "node benchmark/cli.js setup",
55
55
  "benchmark:run": "node benchmark/cli.js run",
56
56
  "benchmark:report": "node benchmark/cli.js report",
57
- "benchmark:tokens": "node scripts/benchmark-token-cost.js",
58
- "benchmark:memory": "node scripts/benchmark-memory.js",
59
- "benchmark:memorybench:install": "node scripts/install-memorybench-provider.js",
60
57
  "release": "npx semantic-release",
61
58
  "audit:ci": "npm audit --omit=dev --audit-level=high"
62
59
  },