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
package/server/db/database.js
CHANGED
|
@@ -406,9 +406,6 @@ db.exec(`
|
|
|
406
406
|
session_id INTEGER,
|
|
407
407
|
last_connected_at TEXT,
|
|
408
408
|
last_seen_at TEXT,
|
|
409
|
-
passive_history_enabled INTEGER DEFAULT 0,
|
|
410
|
-
passive_history_last_uploaded_at TEXT,
|
|
411
|
-
passive_history_last_error TEXT,
|
|
412
409
|
revoked_at TEXT,
|
|
413
410
|
created_at TEXT DEFAULT (datetime('now')),
|
|
414
411
|
updated_at TEXT DEFAULT (datetime('now')),
|
|
@@ -948,94 +945,6 @@ db.exec(`
|
|
|
948
945
|
CREATE INDEX IF NOT EXISTS idx_health_metric_samples_user ON health_metric_samples(user_id, metric_type, updated_at DESC);
|
|
949
946
|
CREATE INDEX IF NOT EXISTS idx_health_metric_samples_time ON health_metric_samples(user_id, start_time DESC, end_time DESC);
|
|
950
947
|
|
|
951
|
-
CREATE TABLE IF NOT EXISTS recording_sessions (
|
|
952
|
-
id TEXT PRIMARY KEY,
|
|
953
|
-
user_id INTEGER NOT NULL,
|
|
954
|
-
title TEXT,
|
|
955
|
-
platform TEXT DEFAULT 'unknown',
|
|
956
|
-
status TEXT DEFAULT 'recording',
|
|
957
|
-
transcript_text TEXT,
|
|
958
|
-
transcript_language TEXT,
|
|
959
|
-
transcript_model TEXT,
|
|
960
|
-
structured_content_json TEXT,
|
|
961
|
-
started_at TEXT DEFAULT (datetime('now')),
|
|
962
|
-
ended_at TEXT,
|
|
963
|
-
duration_ms INTEGER DEFAULT 0,
|
|
964
|
-
last_error TEXT,
|
|
965
|
-
metadata_json TEXT DEFAULT '{}',
|
|
966
|
-
created_at TEXT DEFAULT (datetime('now')),
|
|
967
|
-
updated_at TEXT DEFAULT (datetime('now')),
|
|
968
|
-
FOREIGN KEY (user_id) REFERENCES users(id) ON DELETE CASCADE
|
|
969
|
-
);
|
|
970
|
-
|
|
971
|
-
CREATE TABLE IF NOT EXISTS recording_sources (
|
|
972
|
-
id TEXT PRIMARY KEY,
|
|
973
|
-
session_id TEXT NOT NULL,
|
|
974
|
-
source_key TEXT NOT NULL,
|
|
975
|
-
source_kind TEXT NOT NULL,
|
|
976
|
-
media_kind TEXT NOT NULL,
|
|
977
|
-
mime_type TEXT,
|
|
978
|
-
status TEXT DEFAULT 'recording',
|
|
979
|
-
chunk_count INTEGER DEFAULT 0,
|
|
980
|
-
bytes_received INTEGER DEFAULT 0,
|
|
981
|
-
duration_ms INTEGER DEFAULT 0,
|
|
982
|
-
metadata_json TEXT DEFAULT '{}',
|
|
983
|
-
created_at TEXT DEFAULT (datetime('now')),
|
|
984
|
-
updated_at TEXT DEFAULT (datetime('now')),
|
|
985
|
-
FOREIGN KEY (session_id) REFERENCES recording_sessions(id) ON DELETE CASCADE,
|
|
986
|
-
UNIQUE(session_id, source_key)
|
|
987
|
-
);
|
|
988
|
-
|
|
989
|
-
CREATE TABLE IF NOT EXISTS recording_chunks (
|
|
990
|
-
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
|
991
|
-
source_id TEXT NOT NULL,
|
|
992
|
-
sequence_index INTEGER NOT NULL,
|
|
993
|
-
start_ms INTEGER DEFAULT 0,
|
|
994
|
-
end_ms INTEGER DEFAULT 0,
|
|
995
|
-
byte_count INTEGER DEFAULT 0,
|
|
996
|
-
mime_type TEXT,
|
|
997
|
-
file_path TEXT NOT NULL,
|
|
998
|
-
created_at TEXT DEFAULT (datetime('now')),
|
|
999
|
-
FOREIGN KEY (source_id) REFERENCES recording_sources(id) ON DELETE CASCADE,
|
|
1000
|
-
UNIQUE(source_id, sequence_index)
|
|
1001
|
-
);
|
|
1002
|
-
|
|
1003
|
-
CREATE TABLE IF NOT EXISTS recording_transcript_segments (
|
|
1004
|
-
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
|
1005
|
-
session_id TEXT NOT NULL,
|
|
1006
|
-
source_id TEXT,
|
|
1007
|
-
source_key TEXT,
|
|
1008
|
-
speaker TEXT,
|
|
1009
|
-
text TEXT NOT NULL,
|
|
1010
|
-
start_ms INTEGER DEFAULT 0,
|
|
1011
|
-
end_ms INTEGER DEFAULT 0,
|
|
1012
|
-
confidence REAL,
|
|
1013
|
-
words_json TEXT,
|
|
1014
|
-
created_at TEXT DEFAULT (datetime('now')),
|
|
1015
|
-
FOREIGN KEY (session_id) REFERENCES recording_sessions(id) ON DELETE CASCADE,
|
|
1016
|
-
FOREIGN KEY (source_id) REFERENCES recording_sources(id) ON DELETE CASCADE
|
|
1017
|
-
);
|
|
1018
|
-
|
|
1019
|
-
CREATE INDEX IF NOT EXISTS idx_recording_sessions_user ON recording_sessions(user_id, created_at DESC);
|
|
1020
|
-
CREATE INDEX IF NOT EXISTS idx_recording_sources_session ON recording_sources(session_id, source_key);
|
|
1021
|
-
CREATE INDEX IF NOT EXISTS idx_recording_chunks_source ON recording_chunks(source_id, sequence_index);
|
|
1022
|
-
CREATE INDEX IF NOT EXISTS idx_recording_segments_session ON recording_transcript_segments(session_id, start_ms, created_at);
|
|
1023
|
-
|
|
1024
|
-
CREATE TABLE IF NOT EXISTS screen_history (
|
|
1025
|
-
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
|
1026
|
-
user_id INTEGER NOT NULL,
|
|
1027
|
-
timestamp TEXT DEFAULT (datetime('now')),
|
|
1028
|
-
captured_at TEXT,
|
|
1029
|
-
device_id TEXT,
|
|
1030
|
-
device_label TEXT,
|
|
1031
|
-
app_name TEXT,
|
|
1032
|
-
window_title TEXT,
|
|
1033
|
-
text_content TEXT,
|
|
1034
|
-
ocr_engine TEXT,
|
|
1035
|
-
ocr_confidence REAL,
|
|
1036
|
-
FOREIGN KEY (user_id) REFERENCES users(id) ON DELETE CASCADE
|
|
1037
|
-
);
|
|
1038
|
-
|
|
1039
948
|
CREATE TABLE IF NOT EXISTS timeline_events (
|
|
1040
949
|
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
|
1041
950
|
user_id INTEGER NOT NULL,
|
|
@@ -1075,7 +984,6 @@ db.exec(`
|
|
|
1075
984
|
FOREIGN KEY (user_id) REFERENCES users(id) ON DELETE CASCADE
|
|
1076
985
|
);
|
|
1077
986
|
|
|
1078
|
-
CREATE INDEX IF NOT EXISTS idx_screen_history_user ON screen_history(user_id, timestamp DESC);
|
|
1079
987
|
CREATE INDEX IF NOT EXISTS idx_notification_history_user ON notification_history(user_id, timestamp DESC);
|
|
1080
988
|
CREATE INDEX IF NOT EXISTS idx_timeline_events_user ON timeline_events(user_id, occurred_at DESC, id DESC);
|
|
1081
989
|
CREATE INDEX IF NOT EXISTS idx_timeline_events_source ON timeline_events(user_id, source_kind, occurred_at DESC, id DESC);
|
|
@@ -1105,6 +1013,7 @@ db.exec(`
|
|
|
1105
1013
|
`);
|
|
1106
1014
|
|
|
1107
1015
|
runSchemaMigrations(db);
|
|
1016
|
+
fs.rmSync(path.join(DATA_DIR, 'recordings'), { recursive: true, force: true });
|
|
1108
1017
|
|
|
1109
1018
|
function interruptStaleAgentRuns(reason = STALE_RUN_INTERRUPTED_ERROR) {
|
|
1110
1019
|
const normalizedReason = String(reason || STALE_RUN_INTERRUPTED_ERROR).trim()
|
|
@@ -1159,29 +1068,6 @@ interruptStaleAgentRuns();
|
|
|
1159
1068
|
|
|
1160
1069
|
try {
|
|
1161
1070
|
db.exec(`
|
|
1162
|
-
CREATE VIRTUAL TABLE IF NOT EXISTS screen_history_fts USING fts5(
|
|
1163
|
-
text_content,
|
|
1164
|
-
app_name,
|
|
1165
|
-
timestamp UNINDEXED,
|
|
1166
|
-
user_id UNINDEXED,
|
|
1167
|
-
tokenize = 'porter unicode61'
|
|
1168
|
-
);
|
|
1169
|
-
|
|
1170
|
-
CREATE TRIGGER IF NOT EXISTS screen_history_fts_ai AFTER INSERT ON screen_history BEGIN
|
|
1171
|
-
INSERT INTO screen_history_fts(rowid, text_content, app_name, timestamp, user_id)
|
|
1172
|
-
VALUES (new.id, COALESCE(new.text_content, ''), COALESCE(new.app_name, ''), new.timestamp, new.user_id);
|
|
1173
|
-
END;
|
|
1174
|
-
|
|
1175
|
-
CREATE TRIGGER IF NOT EXISTS screen_history_fts_ad AFTER DELETE ON screen_history BEGIN
|
|
1176
|
-
DELETE FROM screen_history_fts WHERE rowid = old.id;
|
|
1177
|
-
END;
|
|
1178
|
-
|
|
1179
|
-
CREATE TRIGGER IF NOT EXISTS screen_history_fts_au AFTER UPDATE ON screen_history BEGIN
|
|
1180
|
-
DELETE FROM screen_history_fts WHERE rowid = old.id;
|
|
1181
|
-
INSERT INTO screen_history_fts(rowid, text_content, app_name, timestamp, user_id)
|
|
1182
|
-
VALUES (new.id, COALESCE(new.text_content, ''), COALESCE(new.app_name, ''), new.timestamp, new.user_id);
|
|
1183
|
-
END;
|
|
1184
|
-
|
|
1185
1071
|
CREATE VIRTUAL TABLE IF NOT EXISTS conversation_history_fts USING fts5(
|
|
1186
1072
|
content,
|
|
1187
1073
|
role UNINDEXED,
|
|
@@ -1330,10 +1216,6 @@ for (const col of [
|
|
|
1330
1216
|
"ALTER TABLE conversations ADD COLUMN working_state_json TEXT",
|
|
1331
1217
|
"ALTER TABLE conversations ADD COLUMN last_verified_facts_json TEXT",
|
|
1332
1218
|
"ALTER TABLE conversations ADD COLUMN last_summary TEXT",
|
|
1333
|
-
"ALTER TABLE recording_sessions ADD COLUMN transcript_language TEXT",
|
|
1334
|
-
"ALTER TABLE recording_sessions ADD COLUMN transcript_model TEXT",
|
|
1335
|
-
"ALTER TABLE recording_sessions ADD COLUMN duration_ms INTEGER DEFAULT 0",
|
|
1336
|
-
"ALTER TABLE recording_sessions ADD COLUMN structured_content_json TEXT",
|
|
1337
1219
|
"ALTER TABLE artifacts ADD COLUMN metadata_json TEXT DEFAULT '{}'",
|
|
1338
1220
|
"ALTER TABLE desktop_companion_devices ADD COLUMN activation_id TEXT",
|
|
1339
1221
|
"ALTER TABLE desktop_companion_devices ADD COLUMN app_version TEXT",
|
|
@@ -1348,17 +1230,8 @@ for (const col of [
|
|
|
1348
1230
|
"ALTER TABLE desktop_companion_devices ADD COLUMN session_id INTEGER",
|
|
1349
1231
|
"ALTER TABLE desktop_companion_devices ADD COLUMN last_connected_at TEXT",
|
|
1350
1232
|
"ALTER TABLE desktop_companion_devices ADD COLUMN last_seen_at TEXT",
|
|
1351
|
-
"ALTER TABLE desktop_companion_devices ADD COLUMN passive_history_enabled INTEGER DEFAULT 0",
|
|
1352
|
-
"ALTER TABLE desktop_companion_devices ADD COLUMN passive_history_last_uploaded_at TEXT",
|
|
1353
|
-
"ALTER TABLE desktop_companion_devices ADD COLUMN passive_history_last_error TEXT",
|
|
1354
1233
|
"ALTER TABLE desktop_companion_devices ADD COLUMN revoked_at TEXT",
|
|
1355
1234
|
"ALTER TABLE desktop_companion_devices ADD COLUMN updated_at TEXT DEFAULT (datetime('now'))",
|
|
1356
|
-
"ALTER TABLE screen_history ADD COLUMN captured_at TEXT",
|
|
1357
|
-
"ALTER TABLE screen_history ADD COLUMN device_id TEXT",
|
|
1358
|
-
"ALTER TABLE screen_history ADD COLUMN device_label TEXT",
|
|
1359
|
-
"ALTER TABLE screen_history ADD COLUMN window_title TEXT",
|
|
1360
|
-
"ALTER TABLE screen_history ADD COLUMN ocr_engine TEXT",
|
|
1361
|
-
"ALTER TABLE screen_history ADD COLUMN ocr_confidence REAL",
|
|
1362
1235
|
"ALTER TABLE memory_facts ADD COLUMN valid_from TEXT",
|
|
1363
1236
|
"ALTER TABLE memory_facts ADD COLUMN valid_to TEXT",
|
|
1364
1237
|
"ALTER TABLE memory_facts ADD COLUMN learned_at TEXT",
|
|
@@ -1388,11 +1261,6 @@ function createLegacyCompatibleIndexes() {
|
|
|
1388
1261
|
columns: ['user_id', 'status', 'created_at'],
|
|
1389
1262
|
sql: 'CREATE INDEX IF NOT EXISTS idx_desktop_companion_devices_user ON desktop_companion_devices(user_id, status, created_at DESC)',
|
|
1390
1263
|
},
|
|
1391
|
-
{
|
|
1392
|
-
table: 'screen_history',
|
|
1393
|
-
columns: ['user_id', 'device_id', 'captured_at'],
|
|
1394
|
-
sql: 'CREATE INDEX IF NOT EXISTS idx_screen_history_device ON screen_history(user_id, device_id, captured_at DESC)',
|
|
1395
|
-
},
|
|
1396
1264
|
];
|
|
1397
1265
|
|
|
1398
1266
|
for (const { table, columns, sql } of deferredIndexes) {
|
|
@@ -146,7 +146,6 @@ function createSessionMiddleware({ secureCookies, trustProxy }) {
|
|
|
146
146
|
}
|
|
147
147
|
|
|
148
148
|
function applyHttpMiddleware(app, { secureCookies, trustProxy, sessionMiddleware, validateOrigin }) {
|
|
149
|
-
const rawRecordingChunkBody = require('express').raw({ limit: '50mb', type: '*/*' });
|
|
150
149
|
const jsonBody = require('express').json({
|
|
151
150
|
limit: '10mb',
|
|
152
151
|
verify: (req, _res, buf) => {
|
|
@@ -154,10 +153,6 @@ function applyHttpMiddleware(app, { secureCookies, trustProxy, sessionMiddleware
|
|
|
154
153
|
},
|
|
155
154
|
});
|
|
156
155
|
const urlencodedBody = require('express').urlencoded({ extended: true });
|
|
157
|
-
const isRecordingChunkPath = (value = '') => {
|
|
158
|
-
const path = `${value}`.split('?')[0];
|
|
159
|
-
return /^\/api\/recordings\/[^/]+\/chunks$/i.test(path);
|
|
160
|
-
};
|
|
161
156
|
const isBrowserExtensionCorsPath = (value = '') => {
|
|
162
157
|
const path = `${value}`.split('?')[0];
|
|
163
158
|
return path === '/api/browser-extension/latest'
|
|
@@ -178,14 +173,6 @@ function applyHttpMiddleware(app, { secureCookies, trustProxy, sessionMiddleware
|
|
|
178
173
|
return '';
|
|
179
174
|
}
|
|
180
175
|
};
|
|
181
|
-
const requestPath = (req) => req.originalUrl || req.url || req.path || '';
|
|
182
|
-
const applyOnlyToRecordingChunk = (handler) => (req, res, next) => (
|
|
183
|
-
isRecordingChunkPath(requestPath(req)) ? handler(req, res, next) : next()
|
|
184
|
-
);
|
|
185
|
-
const skipRecordingChunk = (handler) => (req, res, next) => (
|
|
186
|
-
isRecordingChunkPath(requestPath(req)) ? next() : handler(req, res, next)
|
|
187
|
-
);
|
|
188
|
-
|
|
189
176
|
if (trustProxy) {
|
|
190
177
|
app.set('trust proxy', 1);
|
|
191
178
|
console.log('[HTTP] trust proxy enabled for proxied deployment handling');
|
|
@@ -262,9 +249,8 @@ function applyHttpMiddleware(app, { secureCookies, trustProxy, sessionMiddleware
|
|
|
262
249
|
|
|
263
250
|
next();
|
|
264
251
|
});
|
|
265
|
-
app.use(
|
|
266
|
-
app.use(
|
|
267
|
-
app.use(skipRecordingChunk(urlencodedBody));
|
|
252
|
+
app.use(jsonBody);
|
|
253
|
+
app.use(urlencodedBody);
|
|
268
254
|
app.use(sessionMiddleware);
|
|
269
255
|
}
|
|
270
256
|
|
package/server/http/routes.js
CHANGED
|
@@ -29,13 +29,11 @@ const routeRegistry = [
|
|
|
29
29
|
{ basePath: '/api/android', modulePath: '../routes/android' },
|
|
30
30
|
{ basePath: '/api/desktop', modulePath: '../routes/desktop' },
|
|
31
31
|
{ basePath: '/api/stream', modulePath: '../routes/stream' },
|
|
32
|
-
{ basePath: '/api/recordings', modulePath: '../routes/recordings' },
|
|
33
32
|
{ basePath: '/api/social-video', modulePath: '../routes/social_video' },
|
|
34
33
|
{ basePath: '/api/social-reach', modulePath: '../routes/social_reach' },
|
|
35
34
|
{ basePath: '/api/voice-assistant', modulePath: '../routes/voice_assistant' },
|
|
36
35
|
{ basePath: '/api/wearable', modulePath: '../routes/wearable' },
|
|
37
36
|
{ basePath: '/api/mobile/health', modulePath: '../routes/mobile-health' },
|
|
38
|
-
{ basePath: '/api/screen-history', modulePath: '../routes/screenHistory' },
|
|
39
37
|
{ basePath: '/api/timeline', modulePath: '../routes/timeline' },
|
|
40
38
|
{ basePath: '/api/triggers', modulePath: '../routes/triggers' },
|
|
41
39
|
{ basePath: '/api/security', modulePath: '../routes/security' },
|
|
@@ -1 +1 @@
|
|
|
1
|
-
|
|
1
|
+
bf2c334d1372c0a0b756a03d240a0730
|
|
@@ -3046,31 +3046,6 @@ Exhibit B - "Incompatible With Secondary Licenses" Notice
|
|
|
3046
3046
|
This Source Code Form is "Incompatible With Secondary Licenses", as
|
|
3047
3047
|
defined by the Mozilla Public License, v. 2.0.
|
|
3048
3048
|
|
|
3049
|
-
--------------------------------------------------------------------------------
|
|
3050
|
-
desktop_audio_capture
|
|
3051
|
-
|
|
3052
|
-
MIT License
|
|
3053
|
-
|
|
3054
|
-
Copyright (c) 2024 desktop_audio_capture
|
|
3055
|
-
|
|
3056
|
-
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
3057
|
-
of this software and associated documentation files (the "Software"), to deal
|
|
3058
|
-
in the Software without restriction, including without limitation the rights
|
|
3059
|
-
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
3060
|
-
copies of the Software, and to permit persons to whom the Software is
|
|
3061
|
-
furnished to do so, subject to the following conditions:
|
|
3062
|
-
|
|
3063
|
-
The above copyright notice and this permission notice shall be included in all
|
|
3064
|
-
copies or substantial portions of the Software.
|
|
3065
|
-
|
|
3066
|
-
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
3067
|
-
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
3068
|
-
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
3069
|
-
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
3070
|
-
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
3071
|
-
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
3072
|
-
SOFTWARE.
|
|
3073
|
-
|
|
3074
3049
|
--------------------------------------------------------------------------------
|
|
3075
3050
|
devtools
|
|
3076
3051
|
|
|
Binary file
|
|
@@ -37,6 +37,6 @@ _flutter.buildConfig = {"engineRevision":"83675ed27633283e7fc296c8bca22e841224c0
|
|
|
37
37
|
|
|
38
38
|
_flutter.loader.load({
|
|
39
39
|
serviceWorkerSettings: {
|
|
40
|
-
serviceWorkerVersion: "
|
|
40
|
+
serviceWorkerVersion: "3308741081" /* Flutter's service worker is deprecated and will be removed in a future Flutter release. */
|
|
41
41
|
}
|
|
42
42
|
});
|
package/server/public/index.html
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>
|