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.
- package/.env.example +2 -2
- package/README.md +5 -1
- package/docs/architecture.md +1 -1
- package/docs/benchmarking.md +68 -87
- package/docs/capabilities.md +1 -1
- package/docs/clients-and-devices.md +3 -4
- package/docs/configuration.md +1 -1
- package/docs/devices.md +1 -2
- package/docs/health.md +24 -0
- package/docs/index.md +2 -2
- package/docs/integrations-architecture.md +6 -0
- package/docs/integrations.md +15 -1
- package/docs/models.md +1 -1
- package/docs/persistence.md +1 -1
- package/docs/why-neoagent.md +1 -1
- package/flutter_app/README.md +0 -5
- package/flutter_app/android/app/src/main/AndroidManifest.xml +0 -14
- package/flutter_app/android/app/src/main/kotlin/com/neoagent/flutter_app/MainActivity.kt +0 -98
- package/flutter_app/lib/main.dart +0 -6
- package/flutter_app/lib/main_app_shell.dart +0 -2
- package/flutter_app/lib/main_controller.dart +2 -867
- package/flutter_app/lib/main_devices.dart +0 -73
- package/flutter_app/lib/main_integrations.dart +339 -187
- package/flutter_app/lib/main_launcher.dart +2 -212
- package/flutter_app/lib/main_models.dart +0 -259
- package/flutter_app/lib/main_navigation.dart +2 -14
- package/flutter_app/lib/main_operations.dart +322 -364
- package/flutter_app/lib/main_runtime.dart +9 -208
- package/flutter_app/lib/main_settings.dart +17 -199
- package/flutter_app/lib/main_shared.dart +20 -591
- package/flutter_app/lib/main_timeline.dart +26 -122
- package/flutter_app/lib/main_voice_assistant.dart +0 -5
- package/flutter_app/lib/src/backend_client.dart +0 -102
- package/flutter_app/lib/src/desktop_companion_io.dart +1 -65
- package/flutter_app/lib/src/desktop_companion_stub.dart +0 -12
- package/flutter_app/linux/flutter/generated_plugin_registrant.cc +0 -4
- package/flutter_app/linux/flutter/generated_plugins.cmake +0 -1
- package/flutter_app/macos/Flutter/GeneratedPluginRegistrant.swift +0 -2
- package/flutter_app/macos/Podfile.lock +56 -5
- package/flutter_app/pubspec.lock +0 -7
- package/flutter_app/pubspec.yaml +0 -2
- package/flutter_app/web/index.html +174 -0
- package/flutter_app/windows/flutter/generated_plugin_registrant.cc +0 -3
- package/flutter_app/windows/flutter/generated_plugins.cmake +0 -1
- package/landing/index.html +0 -2
- package/lib/manager.js +1 -1
- package/lib/schema_migrations.js +75 -0
- package/package.json +1 -4
- package/server/db/database.js +1 -133
- package/server/http/middleware.js +2 -16
- package/server/http/routes.js +0 -2
- package/server/public/.last_build_id +1 -1
- package/server/public/assets/NOTICES +0 -25
- package/server/public/assets/fonts/MaterialIcons-Regular.otf +0 -0
- package/server/public/flutter_bootstrap.js +1 -1
- package/server/public/index.html +174 -0
- package/server/public/main.dart.js +88081 -90036
- package/server/routes/auth.js +11 -2
- package/server/routes/settings.js +0 -5
- package/server/routes/voice_assistant.js +1 -128
- package/server/services/account/erasure.js +0 -3
- package/server/services/ai/deliverables/artifact_helpers.js +1 -1
- package/server/services/ai/loop/conversation_loop.js +6 -2
- package/server/services/ai/loop/tool_dispatch.js +0 -3
- package/server/services/ai/messagingFallback.js +1 -1
- package/server/services/ai/settings.js +0 -6
- package/server/services/ai/toolEvidence.js +1 -4
- package/server/services/ai/tools.js +0 -234
- package/server/services/desktop/auth.js +0 -3
- package/server/services/desktop/registry.js +2 -50
- package/server/services/integrations/neoarchive/provider.js +616 -0
- package/server/services/integrations/neorecall/client.js +140 -0
- package/server/services/integrations/neorecall/constants.js +87 -0
- package/server/services/integrations/neorecall/provider.js +163 -0
- package/server/services/integrations/registry.js +4 -2
- package/server/services/manager.js +0 -22
- package/server/services/memory/manager.js +44 -19
- package/server/services/memory/retrieval_reasoning.js +36 -14
- package/server/services/messaging/whatsapp.js +18 -0
- package/server/services/security/tool_categories.js +0 -5
- package/server/services/social_video/service.js +2 -20
- package/server/services/tasks/adapters/index.js +1 -1
- package/server/services/tasks/integration_runtime.js +3 -67
- package/server/services/tasks/runtime.js +1 -6
- package/server/services/tasks/task_repository.js +6 -13
- package/server/services/timeline/service.js +0 -224
- package/server/services/voice/message.js +0 -24
- package/server/services/voice/providers.js +42 -1
- package/server/services/voice/runtimeManager.js +9 -5
- package/server/services/voice/turnRunner.js +0 -22
- package/server/services/wearable/service.js +0 -5
- package/docs/recordings-and-health.md +0 -41
- package/flutter_app/android/app/src/main/kotlin/com/neoagent/flutter_app/recording/RecordingBootReceiver.kt +0 -21
- package/flutter_app/android/app/src/main/kotlin/com/neoagent/flutter_app/recording/RecordingForegroundService.kt +0 -586
- package/flutter_app/android/app/src/main/kotlin/com/neoagent/flutter_app/recording/RecordingStateStore.kt +0 -78
- package/flutter_app/android/app/src/main/kotlin/com/neoagent/flutter_app/recording/RecordingUploadClient.kt +0 -104
- package/flutter_app/lib/main_recordings.dart +0 -920
- package/flutter_app/lib/src/desktop_ocr_bridge.dart +0 -2
- package/flutter_app/lib/src/desktop_ocr_bridge_io.dart +0 -125
- package/flutter_app/lib/src/desktop_ocr_bridge_stub.dart +0 -30
- package/flutter_app/lib/src/desktop_passive_history.dart +0 -332
- package/flutter_app/lib/src/recording_bridge.dart +0 -232
- package/flutter_app/lib/src/recording_bridge_io.dart +0 -1027
- package/flutter_app/lib/src/recording_bridge_stub.dart +0 -120
- package/flutter_app/lib/src/recording_bridge_web.dart +0 -702
- package/flutter_app/lib/src/recording_chunk_queue.dart +0 -149
- package/flutter_app/lib/src/recording_chunk_queue_io.dart +0 -182
- package/flutter_app/lib/src/recording_payloads.dart +0 -95
- package/flutter_app/third_party/desktop_audio_capture/LICENSE +0 -21
- package/flutter_app/third_party/desktop_audio_capture/README.md +0 -262
- package/flutter_app/third_party/desktop_audio_capture/lib/audio_capture.dart +0 -65
- package/flutter_app/third_party/desktop_audio_capture/lib/config/mic_audio_config.dart +0 -153
- package/flutter_app/third_party/desktop_audio_capture/lib/config/system_adudio_config.dart +0 -110
- package/flutter_app/third_party/desktop_audio_capture/lib/mic/mic_audio_capture.dart +0 -461
- package/flutter_app/third_party/desktop_audio_capture/lib/model/audio_status.dart +0 -91
- package/flutter_app/third_party/desktop_audio_capture/lib/model/decibel_data.dart +0 -106
- package/flutter_app/third_party/desktop_audio_capture/lib/model/input_device_type.dart +0 -219
- package/flutter_app/third_party/desktop_audio_capture/lib/system/system_audio_capture.dart +0 -336
- package/flutter_app/third_party/desktop_audio_capture/linux/CMakeLists.txt +0 -101
- package/flutter_app/third_party/desktop_audio_capture/linux/audio_capture_plugin.cc +0 -692
- package/flutter_app/third_party/desktop_audio_capture/linux/include/audio_capture/audio_capture_plugin.h +0 -35
- package/flutter_app/third_party/desktop_audio_capture/linux/include/audio_capture/mic_capture_plugin.h +0 -36
- package/flutter_app/third_party/desktop_audio_capture/linux/include/desktop_audio_capture/audio_capture_plugin.h +0 -32
- package/flutter_app/third_party/desktop_audio_capture/linux/include/desktop_audio_capture/mic_capture_plugin.h +0 -32
- package/flutter_app/third_party/desktop_audio_capture/linux/mic_capture_plugin.cc +0 -878
- package/flutter_app/third_party/desktop_audio_capture/macos/Classes/AudioCapturePlugin.swift +0 -27
- package/flutter_app/third_party/desktop_audio_capture/macos/Classes/MicCapturePlugin.swift +0 -1172
- package/flutter_app/third_party/desktop_audio_capture/macos/Classes/SystemCapturePlugin.swift +0 -655
- package/flutter_app/third_party/desktop_audio_capture/macos/Resources/PrivacyInfo.xcprivacy +0 -12
- package/flutter_app/third_party/desktop_audio_capture/macos/desktop_audio_capture.podspec +0 -30
- package/flutter_app/third_party/desktop_audio_capture/pubspec.yaml +0 -87
- package/flutter_app/third_party/desktop_audio_capture/windows/CMakeLists.txt +0 -105
- package/flutter_app/third_party/desktop_audio_capture/windows/audio_capture_plugin.cpp +0 -80
- package/flutter_app/third_party/desktop_audio_capture/windows/audio_capture_plugin.h +0 -31
- package/flutter_app/third_party/desktop_audio_capture/windows/audio_capture_plugin_c_api.cpp +0 -12
- package/flutter_app/third_party/desktop_audio_capture/windows/include/audio_capture/audio_capture_plugin_c_api.h +0 -23
- package/flutter_app/third_party/desktop_audio_capture/windows/include/desktop_audio_capture/audio_capture_plugin.h +0 -25
- package/flutter_app/third_party/desktop_audio_capture/windows/mic_capture_plugin.cpp +0 -1117
- package/flutter_app/third_party/desktop_audio_capture/windows/mic_capture_plugin.h +0 -115
- package/flutter_app/third_party/desktop_audio_capture/windows/system_audio_capture_plugin.cpp +0 -777
- package/flutter_app/third_party/desktop_audio_capture/windows/system_audio_capture_plugin.h +0 -87
- package/server/routes/recordings.js +0 -335
- package/server/routes/screenHistory.js +0 -190
- package/server/services/ai/recordingInsights.js +0 -105
- package/server/services/integrations/neomail/provider.js +0 -993
- package/server/services/recordings/deepgram.js +0 -58
- package/server/services/recordings/manager.js +0 -1273
- package/server/services/tasks/adapters/neomail_email_received.js +0 -46
- package/server/services/voice/screenshotContext.js +0 -73
- 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
|
-
-
|
|
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
|
-
-
|
|
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
|
-
|
|
51
|
-
:path: Flutter/ephemeral/.symlinks/plugins/
|
|
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
|
-
|
|
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
|
package/flutter_app/pubspec.lock
CHANGED
|
@@ -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:
|
package/flutter_app/pubspec.yaml
CHANGED
|
@@ -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(
|
package/landing/index.html
CHANGED
|
@@ -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 & 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 & 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
|
|
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',
|
package/lib/schema_migrations.js
CHANGED
|
@@ -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.
|
|
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
|
},
|