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
@@ -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(applyOnlyToRecordingChunk(rawRecordingChunkBody));
266
- app.use(skipRecordingChunk(jsonBody));
267
- app.use(skipRecordingChunk(urlencodedBody));
252
+ app.use(jsonBody);
253
+ app.use(urlencodedBody);
268
254
  app.use(sessionMiddleware);
269
255
  }
270
256
 
@@ -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
- 42ed3501c09c6e3ffc03212056c51751
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
 
@@ -37,6 +37,6 @@ _flutter.buildConfig = {"engineRevision":"83675ed27633283e7fc296c8bca22e841224c0
37
37
 
38
38
  _flutter.loader.load({
39
39
  serviceWorkerSettings: {
40
- serviceWorkerVersion: "648964245" /* Flutter's service worker is deprecated and will be removed in a future Flutter release. */
40
+ serviceWorkerVersion: "3308741081" /* Flutter's service worker is deprecated and will be removed in a future Flutter release. */
41
41
  }
42
42
  });
@@ -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>