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
@@ -1,46 +0,0 @@
1
- 'use strict';
2
-
3
- const {
4
- ensureOwnedIntegrationConnection,
5
- normalizeBoolean,
6
- normalizeTrimmedText,
7
- } = require('../security');
8
-
9
- module.exports = {
10
- type: 'neomail_email_received',
11
- label: 'NeoMail Email Received',
12
- providerKey: 'neomail',
13
- appKey: 'mailbox',
14
- async validateConfig(config = {}, context = {}) {
15
- const connection = ensureOwnedIntegrationConnection(context.integrationManager, {
16
- userId: context.userId,
17
- agentId: context.agentId,
18
- connectionId: config.connectionId || config.connection_id,
19
- providerKey: 'neomail',
20
- appKey: 'mailbox',
21
- });
22
- return {
23
- connectionId: connection.id,
24
- accountEmail: connection.account_email || null,
25
- mailAccountId: normalizeTrimmedText(
26
- config.mailAccountId || config.mail_account_id,
27
- 120,
28
- ),
29
- folder: normalizeTrimmedText(config.folder, 200),
30
- query: normalizeTrimmedText(config.query, 500),
31
- unreadOnly: normalizeBoolean(
32
- config.unreadOnly ?? config.unread_only,
33
- false,
34
- ),
35
- };
36
- },
37
- summarize(config = {}) {
38
- const parts = ['NeoMail'];
39
- if (config.accountEmail) parts.push(config.accountEmail);
40
- if (config.mailAccountId) parts.push(`mailbox: ${config.mailAccountId}`);
41
- if (config.folder) parts.push(`folder: ${config.folder}`);
42
- if (config.query) parts.push(`query: ${config.query}`);
43
- if (config.unreadOnly) parts.push('unread only');
44
- return parts.join(' · ');
45
- },
46
- };
@@ -1,73 +0,0 @@
1
- 'use strict';
2
-
3
- const fs = require('fs/promises');
4
- const os = require('os');
5
- const path = require('path');
6
-
7
- const { analyzeImageForUser, resolveImageMimeType } = require('../ai/imageAnalysis');
8
-
9
- function extensionForMimeType(mimeType = '') {
10
- switch (String(mimeType).trim().toLowerCase()) {
11
- case 'image/png':
12
- return 'png';
13
- case 'image/webp':
14
- return 'webp';
15
- case 'image/gif':
16
- return 'gif';
17
- case 'image/jpg':
18
- case 'image/jpeg':
19
- default:
20
- return 'jpg';
21
- }
22
- }
23
-
24
- async function analyzeVoiceAssistantScreenshot({
25
- userId,
26
- agentId = null,
27
- screenshotBase64,
28
- screenshotMimeType = 'image/jpeg',
29
- } = {}) {
30
- const encoded = String(screenshotBase64 || '').trim();
31
- if (!encoded) {
32
- return null;
33
- }
34
-
35
- const mimeType = resolveImageMimeType(
36
- `screen.${extensionForMimeType(screenshotMimeType)}`,
37
- screenshotMimeType,
38
- );
39
- const buffer = Buffer.from(encoded, 'base64');
40
- if (!buffer.length) {
41
- return null;
42
- }
43
-
44
- const tempDir = await fs.mkdtemp(
45
- path.join(os.tmpdir(), 'neoagent-voice-screen-'),
46
- );
47
- const imagePath = path.join(
48
- tempDir,
49
- `capture.${extensionForMimeType(mimeType)}`,
50
- );
51
-
52
- try {
53
- await fs.writeFile(imagePath, buffer);
54
- const result = await analyzeImageForUser({
55
- userId,
56
- agentId,
57
- imagePath,
58
- mimeType,
59
- question:
60
- 'Describe the user’s current screen for a voice assistant. Focus on the visible app, important UI state, readable text, alerts, selected items, and anything relevant to the user’s spoken request.',
61
- });
62
- return {
63
- ...result,
64
- mimeType,
65
- };
66
- } finally {
67
- await fs.rm(tempDir, { recursive: true, force: true });
68
- }
69
- }
70
-
71
- module.exports = {
72
- analyzeVoiceAssistantScreenshot,
73
- };
@@ -1,51 +0,0 @@
1
- 'use strict';
2
-
3
- class TurnCoordinator {
4
- constructor() {
5
- this._stateByKey = new Map();
6
- }
7
-
8
- async run(key, taskFactory) {
9
- const normalizedKey = String(key || '').trim();
10
- if (!normalizedKey) {
11
- return taskFactory();
12
- }
13
-
14
- const state = this._stateByKey.get(normalizedKey) || { running: false, pending: null };
15
- this._stateByKey.set(normalizedKey, state);
16
-
17
- if (state.running) {
18
- return new Promise((resolve, reject) => {
19
- state.pending = { taskFactory, resolve, reject };
20
- });
21
- }
22
-
23
- state.running = true;
24
- try {
25
- let result = await taskFactory();
26
-
27
- // Coalesce concurrent requests: keep only latest pending task.
28
- while (state.pending) {
29
- const pending = state.pending;
30
- state.pending = null;
31
- try {
32
- result = await pending.taskFactory();
33
- pending.resolve(result);
34
- } catch (err) {
35
- pending.reject(err);
36
- }
37
- }
38
-
39
- return result;
40
- } finally {
41
- state.running = false;
42
- if (!state.pending) {
43
- this._stateByKey.delete(normalizedKey);
44
- }
45
- }
46
- }
47
- }
48
-
49
- module.exports = {
50
- TurnCoordinator,
51
- };