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,105 +0,0 @@
|
|
|
1
|
-
'use strict';
|
|
2
|
-
|
|
3
|
-
const { sanitizeError } = require('../../utils/security');
|
|
4
|
-
const { getProviderForUser } = require('./engine');
|
|
5
|
-
const { getSupportedModels } = require('./models');
|
|
6
|
-
const { getAiSettings } = require('./settings');
|
|
7
|
-
const { parseJsonObject } = require('./taskAnalysis');
|
|
8
|
-
|
|
9
|
-
const INSIGHTS_SYSTEM_PROMPT = `Return JSON only. No markdown, no prose, no code fences.
|
|
10
|
-
|
|
11
|
-
You are a precise conversation analyst. Read the transcript and extract exactly what happened: who said what, what was decided, what needs to happen next, and when.
|
|
12
|
-
|
|
13
|
-
Schema:
|
|
14
|
-
{
|
|
15
|
-
"summary": "1-2 paragraph factual summary. Name speakers if identifiable. Cover the main topic, key decisions, outcome, and any unresolved items.",
|
|
16
|
-
"action_items": ["Each item as: '[Owner if named] — specific action'. One item per string. Empty array if none."],
|
|
17
|
-
"events": ["Each as: '[date/time if stated] — event description'. One event per string. Empty array if none."]
|
|
18
|
-
}
|
|
19
|
-
|
|
20
|
-
Rules:
|
|
21
|
-
- Report only what the transcript explicitly contains. Do not infer or add context not present in the recording.
|
|
22
|
-
- Be specific: "Alice will send the contract by Friday" beats "follow-up needed".
|
|
23
|
-
- If a field has no data, use an empty array.`;
|
|
24
|
-
|
|
25
|
-
async function extractRecordingInsights(userId, transcriptText, options = {}) {
|
|
26
|
-
if (!transcriptText || !transcriptText.trim()) {
|
|
27
|
-
return null;
|
|
28
|
-
}
|
|
29
|
-
|
|
30
|
-
const aiSettings = getAiSettings(userId);
|
|
31
|
-
const configuredSummaryProvider = `${aiSettings.default_recording_summary_provider || ''}`
|
|
32
|
-
.trim()
|
|
33
|
-
.toLowerCase();
|
|
34
|
-
const configuredSummaryModel = `${aiSettings.default_recording_summary_model || ''}`.trim();
|
|
35
|
-
const fallbackModel = aiSettings.smarter_model_selector ? 'auto' : aiSettings.default_chat_model;
|
|
36
|
-
const requestedProvider = `${options.provider || configuredSummaryProvider || 'auto'}`.trim().toLowerCase() || 'auto';
|
|
37
|
-
const requestedModel = `${options.model || configuredSummaryModel || fallbackModel}`.trim() || fallbackModel;
|
|
38
|
-
|
|
39
|
-
try {
|
|
40
|
-
const availableModels = (await getSupportedModels(userId)).filter((model) => model.available !== false);
|
|
41
|
-
const resolveModelForProvider = () => {
|
|
42
|
-
if (!availableModels.length) {
|
|
43
|
-
return requestedModel;
|
|
44
|
-
}
|
|
45
|
-
|
|
46
|
-
if (requestedModel && requestedModel !== 'auto') {
|
|
47
|
-
const explicitMatch = availableModels.find((model) => model.id === requestedModel);
|
|
48
|
-
if (explicitMatch && (requestedProvider === 'auto' || explicitMatch.provider === requestedProvider)) {
|
|
49
|
-
return explicitMatch.id;
|
|
50
|
-
}
|
|
51
|
-
}
|
|
52
|
-
|
|
53
|
-
if (requestedProvider !== 'auto') {
|
|
54
|
-
const providerModels = availableModels.filter((model) => model.provider === requestedProvider);
|
|
55
|
-
const preferred = providerModels.find((model) => model.purpose === 'general')
|
|
56
|
-
|| providerModels.find((model) => model.purpose === 'planning')
|
|
57
|
-
|| providerModels[0];
|
|
58
|
-
if (preferred) {
|
|
59
|
-
return preferred.id;
|
|
60
|
-
}
|
|
61
|
-
}
|
|
62
|
-
|
|
63
|
-
return requestedModel;
|
|
64
|
-
};
|
|
65
|
-
|
|
66
|
-
const preferredModel = resolveModelForProvider();
|
|
67
|
-
const { provider, model } = await getProviderForUser(userId, "analyze transcript", false, preferredModel);
|
|
68
|
-
|
|
69
|
-
const messages = [
|
|
70
|
-
{ role: 'system', content: INSIGHTS_SYSTEM_PROMPT },
|
|
71
|
-
{ role: 'user', content: transcriptText }
|
|
72
|
-
];
|
|
73
|
-
|
|
74
|
-
const response = await provider.chat(messages, [], {
|
|
75
|
-
model,
|
|
76
|
-
reasoningEffort: process.env.REASONING_EFFORT || 'low'
|
|
77
|
-
});
|
|
78
|
-
|
|
79
|
-
try {
|
|
80
|
-
const rawContent = String(response.content || '');
|
|
81
|
-
const parsed = parseJsonObject(rawContent);
|
|
82
|
-
if (!parsed) {
|
|
83
|
-
throw new Error('Response did not contain a valid JSON object.');
|
|
84
|
-
}
|
|
85
|
-
return {
|
|
86
|
-
...parsed,
|
|
87
|
-
_model: model,
|
|
88
|
-
_generated_at: new Date().toISOString()
|
|
89
|
-
};
|
|
90
|
-
} catch (parseErr) {
|
|
91
|
-
const content = String(response.content || '');
|
|
92
|
-
console.warn(
|
|
93
|
-
`[AI] Failed to parse recording insights JSON: length=${content.length} error=${parseErr.message}`
|
|
94
|
-
);
|
|
95
|
-
return null;
|
|
96
|
-
}
|
|
97
|
-
} catch (err) {
|
|
98
|
-
console.error('[AI] Recording insights extraction failed:', sanitizeError(err));
|
|
99
|
-
return null;
|
|
100
|
-
}
|
|
101
|
-
}
|
|
102
|
-
|
|
103
|
-
module.exports = {
|
|
104
|
-
extractRecordingInsights
|
|
105
|
-
};
|