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
|
@@ -1,78 +0,0 @@
|
|
|
1
|
-
package com.neoagent.flutter_app.recording
|
|
2
|
-
|
|
3
|
-
import android.content.Context
|
|
4
|
-
import android.content.SharedPreferences
|
|
5
|
-
|
|
6
|
-
class RecordingStateStore(context: Context) {
|
|
7
|
-
private val prefs: SharedPreferences =
|
|
8
|
-
context.getSharedPreferences(PREFS_NAME, Context.MODE_PRIVATE)
|
|
9
|
-
|
|
10
|
-
fun saveConfig(config: RecordingConfig) {
|
|
11
|
-
prefs.edit()
|
|
12
|
-
.putString(KEY_BACKEND_URL, config.backendUrl)
|
|
13
|
-
.putString(KEY_SESSION_COOKIE, config.sessionCookie)
|
|
14
|
-
.putString(KEY_SESSION_ID, config.sessionId)
|
|
15
|
-
.putBoolean(KEY_ACTIVE, config.active)
|
|
16
|
-
.putBoolean(KEY_PAUSED, config.paused)
|
|
17
|
-
.putInt(KEY_NEXT_SEQUENCE, config.nextSequence)
|
|
18
|
-
.putLong(KEY_CAPTURED_AUDIO_MS, config.capturedAudioMs)
|
|
19
|
-
.putString(KEY_STARTED_AT, config.startedAt)
|
|
20
|
-
.putString(KEY_ERROR_MESSAGE, config.errorMessage)
|
|
21
|
-
.apply()
|
|
22
|
-
}
|
|
23
|
-
|
|
24
|
-
fun loadConfig(): RecordingConfig? {
|
|
25
|
-
val sessionId = prefs.getString(KEY_SESSION_ID, null) ?: return null
|
|
26
|
-
return RecordingConfig(
|
|
27
|
-
backendUrl = prefs.getString(KEY_BACKEND_URL, "").orEmpty(),
|
|
28
|
-
sessionCookie = prefs.getString(KEY_SESSION_COOKIE, "").orEmpty(),
|
|
29
|
-
sessionId = sessionId,
|
|
30
|
-
active = prefs.getBoolean(KEY_ACTIVE, false),
|
|
31
|
-
paused = prefs.getBoolean(KEY_PAUSED, false),
|
|
32
|
-
nextSequence = prefs.getInt(KEY_NEXT_SEQUENCE, 0),
|
|
33
|
-
capturedAudioMs = prefs.getLong(KEY_CAPTURED_AUDIO_MS, 0L),
|
|
34
|
-
startedAt = prefs.getString(KEY_STARTED_AT, null),
|
|
35
|
-
errorMessage = prefs.getString(KEY_ERROR_MESSAGE, null),
|
|
36
|
-
)
|
|
37
|
-
}
|
|
38
|
-
|
|
39
|
-
fun clear() {
|
|
40
|
-
prefs.edit().clear().apply()
|
|
41
|
-
}
|
|
42
|
-
|
|
43
|
-
fun statusMap(): Map<String, Any?> {
|
|
44
|
-
val config = loadConfig()
|
|
45
|
-
return mapOf(
|
|
46
|
-
"active" to (config?.active == true),
|
|
47
|
-
"paused" to (config?.paused == true),
|
|
48
|
-
"sessionId" to config?.sessionId,
|
|
49
|
-
"startedAt" to config?.startedAt,
|
|
50
|
-
"errorMessage" to config?.errorMessage,
|
|
51
|
-
)
|
|
52
|
-
}
|
|
53
|
-
|
|
54
|
-
companion object {
|
|
55
|
-
private const val PREFS_NAME = "neoagent_recordings"
|
|
56
|
-
private const val KEY_BACKEND_URL = "backend_url"
|
|
57
|
-
private const val KEY_SESSION_COOKIE = "session_cookie"
|
|
58
|
-
private const val KEY_SESSION_ID = "session_id"
|
|
59
|
-
private const val KEY_ACTIVE = "active"
|
|
60
|
-
private const val KEY_PAUSED = "paused"
|
|
61
|
-
private const val KEY_NEXT_SEQUENCE = "next_sequence"
|
|
62
|
-
private const val KEY_CAPTURED_AUDIO_MS = "captured_audio_ms"
|
|
63
|
-
private const val KEY_STARTED_AT = "started_at"
|
|
64
|
-
private const val KEY_ERROR_MESSAGE = "error_message"
|
|
65
|
-
}
|
|
66
|
-
}
|
|
67
|
-
|
|
68
|
-
data class RecordingConfig(
|
|
69
|
-
val backendUrl: String,
|
|
70
|
-
val sessionCookie: String,
|
|
71
|
-
val sessionId: String,
|
|
72
|
-
val active: Boolean,
|
|
73
|
-
val paused: Boolean,
|
|
74
|
-
val nextSequence: Int,
|
|
75
|
-
val capturedAudioMs: Long,
|
|
76
|
-
val startedAt: String?,
|
|
77
|
-
val errorMessage: String?,
|
|
78
|
-
)
|
|
@@ -1,104 +0,0 @@
|
|
|
1
|
-
package com.neoagent.flutter_app.recording
|
|
2
|
-
|
|
3
|
-
import org.json.JSONObject
|
|
4
|
-
import java.io.BufferedReader
|
|
5
|
-
import java.io.File
|
|
6
|
-
import java.io.OutputStreamWriter
|
|
7
|
-
import java.net.HttpURLConnection
|
|
8
|
-
import java.net.URL
|
|
9
|
-
import java.nio.charset.StandardCharsets
|
|
10
|
-
|
|
11
|
-
class RecordingUploadClient {
|
|
12
|
-
fun uploadChunk(
|
|
13
|
-
backendUrl: String,
|
|
14
|
-
sessionCookie: String,
|
|
15
|
-
sessionId: String,
|
|
16
|
-
meta: PendingChunkMeta,
|
|
17
|
-
file: File,
|
|
18
|
-
) {
|
|
19
|
-
val url = URL(resolveUrl(backendUrl, "/api/recordings/$sessionId/chunks"))
|
|
20
|
-
val connection = (url.openConnection() as HttpURLConnection).apply {
|
|
21
|
-
requestMethod = "POST"
|
|
22
|
-
doOutput = true
|
|
23
|
-
connectTimeout = 20_000
|
|
24
|
-
readTimeout = 60_000
|
|
25
|
-
setRequestProperty("Cookie", sessionCookie)
|
|
26
|
-
setRequestProperty("Content-Type", meta.mimeType)
|
|
27
|
-
setRequestProperty("X-Recording-Source-Key", SOURCE_KEY)
|
|
28
|
-
setRequestProperty("X-Recording-Sequence", meta.sequence.toString())
|
|
29
|
-
setRequestProperty("X-Recording-Start-Ms", meta.startMs.toString())
|
|
30
|
-
setRequestProperty("X-Recording-End-Ms", meta.endMs.toString())
|
|
31
|
-
}
|
|
32
|
-
|
|
33
|
-
file.inputStream().use { input ->
|
|
34
|
-
connection.outputStream.use { output ->
|
|
35
|
-
input.copyTo(output)
|
|
36
|
-
}
|
|
37
|
-
}
|
|
38
|
-
|
|
39
|
-
val statusCode = connection.responseCode
|
|
40
|
-
if (statusCode !in 200..299) {
|
|
41
|
-
val body = readResponse(connection)
|
|
42
|
-
connection.disconnect()
|
|
43
|
-
throw IllegalStateException("Chunk upload failed ($statusCode): $body")
|
|
44
|
-
}
|
|
45
|
-
connection.disconnect()
|
|
46
|
-
}
|
|
47
|
-
|
|
48
|
-
fun finalizeSession(
|
|
49
|
-
backendUrl: String,
|
|
50
|
-
sessionCookie: String,
|
|
51
|
-
sessionId: String,
|
|
52
|
-
stopReason: String,
|
|
53
|
-
) {
|
|
54
|
-
val url = URL(resolveUrl(backendUrl, "/api/recordings/$sessionId/finalize"))
|
|
55
|
-
val connection = (url.openConnection() as HttpURLConnection).apply {
|
|
56
|
-
requestMethod = "POST"
|
|
57
|
-
doOutput = true
|
|
58
|
-
connectTimeout = 20_000
|
|
59
|
-
readTimeout = 60_000
|
|
60
|
-
setRequestProperty("Cookie", sessionCookie)
|
|
61
|
-
setRequestProperty("Content-Type", "application/json")
|
|
62
|
-
}
|
|
63
|
-
|
|
64
|
-
val payload = JSONObject()
|
|
65
|
-
.put("stopReason", stopReason)
|
|
66
|
-
.toString()
|
|
67
|
-
OutputStreamWriter(connection.outputStream, StandardCharsets.UTF_8).use { writer ->
|
|
68
|
-
writer.write(payload)
|
|
69
|
-
}
|
|
70
|
-
|
|
71
|
-
val statusCode = connection.responseCode
|
|
72
|
-
if (statusCode !in 200..299) {
|
|
73
|
-
val body = readResponse(connection)
|
|
74
|
-
connection.disconnect()
|
|
75
|
-
throw IllegalStateException("Finalize failed ($statusCode): $body")
|
|
76
|
-
}
|
|
77
|
-
connection.disconnect()
|
|
78
|
-
}
|
|
79
|
-
|
|
80
|
-
private fun readResponse(connection: HttpURLConnection): String {
|
|
81
|
-
val stream = connection.errorStream ?: connection.inputStream ?: return ""
|
|
82
|
-
return stream.bufferedReader().use(BufferedReader::readText)
|
|
83
|
-
}
|
|
84
|
-
|
|
85
|
-
private fun resolveUrl(baseUrl: String, path: String): String {
|
|
86
|
-
val trimmed = baseUrl.trim().removeSuffix("/")
|
|
87
|
-
return if (trimmed.isEmpty()) {
|
|
88
|
-
path
|
|
89
|
-
} else {
|
|
90
|
-
"$trimmed$path"
|
|
91
|
-
}
|
|
92
|
-
}
|
|
93
|
-
|
|
94
|
-
companion object {
|
|
95
|
-
const val SOURCE_KEY = "microphone"
|
|
96
|
-
}
|
|
97
|
-
}
|
|
98
|
-
|
|
99
|
-
data class PendingChunkMeta(
|
|
100
|
-
val sequence: Int,
|
|
101
|
-
val startMs: Long,
|
|
102
|
-
val endMs: Long,
|
|
103
|
-
val mimeType: String = "audio/wav",
|
|
104
|
-
)
|