neoagent 3.1.1-beta.9 → 3.2.1-beta.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 (151) 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 +875 -383
  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 +2 -2
  56. package/server/public/index.html +174 -0
  57. package/server/public/main.dart.js +92036 -91145
  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/formatting_guides.js +1 -0
  80. package/server/services/messaging/whatsapp.js +18 -0
  81. package/server/services/security/tool_categories.js +0 -5
  82. package/server/services/social_video/service.js +2 -20
  83. package/server/services/tasks/adapters/index.js +1 -1
  84. package/server/services/tasks/integration_runtime.js +3 -67
  85. package/server/services/tasks/runtime.js +1 -6
  86. package/server/services/tasks/task_repository.js +6 -13
  87. package/server/services/timeline/service.js +0 -224
  88. package/server/services/voice/message.js +0 -24
  89. package/server/services/voice/providers.js +42 -1
  90. package/server/services/voice/runtimeManager.js +9 -5
  91. package/server/services/voice/turnRunner.js +0 -22
  92. package/server/services/wearable/service.js +0 -5
  93. package/docs/recordings-and-health.md +0 -41
  94. package/flutter_app/android/app/src/main/kotlin/com/neoagent/flutter_app/recording/RecordingBootReceiver.kt +0 -21
  95. package/flutter_app/android/app/src/main/kotlin/com/neoagent/flutter_app/recording/RecordingForegroundService.kt +0 -586
  96. package/flutter_app/android/app/src/main/kotlin/com/neoagent/flutter_app/recording/RecordingStateStore.kt +0 -78
  97. package/flutter_app/android/app/src/main/kotlin/com/neoagent/flutter_app/recording/RecordingUploadClient.kt +0 -104
  98. package/flutter_app/lib/main_recordings.dart +0 -920
  99. package/flutter_app/lib/src/desktop_ocr_bridge.dart +0 -2
  100. package/flutter_app/lib/src/desktop_ocr_bridge_io.dart +0 -125
  101. package/flutter_app/lib/src/desktop_ocr_bridge_stub.dart +0 -30
  102. package/flutter_app/lib/src/desktop_passive_history.dart +0 -332
  103. package/flutter_app/lib/src/recording_bridge.dart +0 -232
  104. package/flutter_app/lib/src/recording_bridge_io.dart +0 -1027
  105. package/flutter_app/lib/src/recording_bridge_stub.dart +0 -120
  106. package/flutter_app/lib/src/recording_bridge_web.dart +0 -702
  107. package/flutter_app/lib/src/recording_chunk_queue.dart +0 -149
  108. package/flutter_app/lib/src/recording_chunk_queue_io.dart +0 -182
  109. package/flutter_app/lib/src/recording_payloads.dart +0 -95
  110. package/flutter_app/third_party/desktop_audio_capture/LICENSE +0 -21
  111. package/flutter_app/third_party/desktop_audio_capture/README.md +0 -262
  112. package/flutter_app/third_party/desktop_audio_capture/lib/audio_capture.dart +0 -65
  113. package/flutter_app/third_party/desktop_audio_capture/lib/config/mic_audio_config.dart +0 -153
  114. package/flutter_app/third_party/desktop_audio_capture/lib/config/system_adudio_config.dart +0 -110
  115. package/flutter_app/third_party/desktop_audio_capture/lib/mic/mic_audio_capture.dart +0 -461
  116. package/flutter_app/third_party/desktop_audio_capture/lib/model/audio_status.dart +0 -91
  117. package/flutter_app/third_party/desktop_audio_capture/lib/model/decibel_data.dart +0 -106
  118. package/flutter_app/third_party/desktop_audio_capture/lib/model/input_device_type.dart +0 -219
  119. package/flutter_app/third_party/desktop_audio_capture/lib/system/system_audio_capture.dart +0 -336
  120. package/flutter_app/third_party/desktop_audio_capture/linux/CMakeLists.txt +0 -101
  121. package/flutter_app/third_party/desktop_audio_capture/linux/audio_capture_plugin.cc +0 -692
  122. package/flutter_app/third_party/desktop_audio_capture/linux/include/audio_capture/audio_capture_plugin.h +0 -35
  123. package/flutter_app/third_party/desktop_audio_capture/linux/include/audio_capture/mic_capture_plugin.h +0 -36
  124. package/flutter_app/third_party/desktop_audio_capture/linux/include/desktop_audio_capture/audio_capture_plugin.h +0 -32
  125. package/flutter_app/third_party/desktop_audio_capture/linux/include/desktop_audio_capture/mic_capture_plugin.h +0 -32
  126. package/flutter_app/third_party/desktop_audio_capture/linux/mic_capture_plugin.cc +0 -878
  127. package/flutter_app/third_party/desktop_audio_capture/macos/Classes/AudioCapturePlugin.swift +0 -27
  128. package/flutter_app/third_party/desktop_audio_capture/macos/Classes/MicCapturePlugin.swift +0 -1172
  129. package/flutter_app/third_party/desktop_audio_capture/macos/Classes/SystemCapturePlugin.swift +0 -655
  130. package/flutter_app/third_party/desktop_audio_capture/macos/Resources/PrivacyInfo.xcprivacy +0 -12
  131. package/flutter_app/third_party/desktop_audio_capture/macos/desktop_audio_capture.podspec +0 -30
  132. package/flutter_app/third_party/desktop_audio_capture/pubspec.yaml +0 -87
  133. package/flutter_app/third_party/desktop_audio_capture/windows/CMakeLists.txt +0 -105
  134. package/flutter_app/third_party/desktop_audio_capture/windows/audio_capture_plugin.cpp +0 -80
  135. package/flutter_app/third_party/desktop_audio_capture/windows/audio_capture_plugin.h +0 -31
  136. package/flutter_app/third_party/desktop_audio_capture/windows/audio_capture_plugin_c_api.cpp +0 -12
  137. package/flutter_app/third_party/desktop_audio_capture/windows/include/audio_capture/audio_capture_plugin_c_api.h +0 -23
  138. package/flutter_app/third_party/desktop_audio_capture/windows/include/desktop_audio_capture/audio_capture_plugin.h +0 -25
  139. package/flutter_app/third_party/desktop_audio_capture/windows/mic_capture_plugin.cpp +0 -1117
  140. package/flutter_app/third_party/desktop_audio_capture/windows/mic_capture_plugin.h +0 -115
  141. package/flutter_app/third_party/desktop_audio_capture/windows/system_audio_capture_plugin.cpp +0 -777
  142. package/flutter_app/third_party/desktop_audio_capture/windows/system_audio_capture_plugin.h +0 -87
  143. package/server/routes/recordings.js +0 -335
  144. package/server/routes/screenHistory.js +0 -190
  145. package/server/services/ai/recordingInsights.js +0 -105
  146. package/server/services/integrations/neomail/provider.js +0 -993
  147. package/server/services/recordings/deepgram.js +0 -58
  148. package/server/services/recordings/manager.js +0 -1273
  149. package/server/services/tasks/adapters/neomail_email_received.js +0 -46
  150. package/server/services/voice/screenshotContext.js +0 -73
  151. 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
- )