neoagent 2.1.17-beta.5 → 2.1.17-beta.9

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 (40) hide show
  1. package/package.json +7 -4
  2. package/server/db/database.js +17 -0
  3. package/server/http/middleware.js +57 -2
  4. package/server/http/routes.js +1 -0
  5. package/server/index.js +13 -0
  6. package/server/public/.last_build_id +1 -1
  7. package/server/public/assets/NOTICES +2408 -1891
  8. package/server/public/assets/fonts/MaterialIcons-Regular.otf +0 -0
  9. package/server/public/canvaskit/canvaskit.js.symbols +99 -99
  10. package/server/public/canvaskit/canvaskit.wasm +0 -0
  11. package/server/public/canvaskit/chromium/canvaskit.js.symbols +57 -57
  12. package/server/public/canvaskit/chromium/canvaskit.wasm +0 -0
  13. package/server/public/canvaskit/skwasm.js.symbols +3 -3
  14. package/server/public/canvaskit/skwasm.wasm +0 -0
  15. package/server/public/canvaskit/skwasm_heavy.js.symbols +3 -3
  16. package/server/public/canvaskit/skwasm_heavy.wasm +0 -0
  17. package/server/public/canvaskit/wimp.js.symbols +951 -951
  18. package/server/public/canvaskit/wimp.wasm +0 -0
  19. package/server/public/flutter_bootstrap.js +2 -2
  20. package/server/public/main.dart.js +65717 -63099
  21. package/server/routes/android.js +52 -138
  22. package/server/routes/browser.js +21 -13
  23. package/server/routes/recordings.js +63 -42
  24. package/server/routes/settings.js +10 -7
  25. package/server/routes/wearables.js +153 -0
  26. package/server/services/ai/engine.js +135 -15
  27. package/server/services/ai/recordingInsights.js +75 -0
  28. package/server/services/ai/settings.js +6 -2
  29. package/server/services/ai/systemPrompt.js +47 -11
  30. package/server/services/ai/tools.js +243 -2
  31. package/server/services/android/controller.js +241 -50
  32. package/server/services/manager.js +85 -0
  33. package/server/services/memory/manager.js +6 -2
  34. package/server/services/messaging/telegram.js +36 -19
  35. package/server/services/recordings/manager.js +55 -24
  36. package/server/services/scheduler/cron.js +32 -5
  37. package/server/services/wearables/manager.js +290 -0
  38. package/server/services/wearables/protocols/base.js +61 -0
  39. package/server/services/wearables/protocols/heypocket.js +98 -0
  40. package/server/services/websocket.js +25 -1
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "neoagent",
3
- "version": "2.1.17-beta.5",
3
+ "version": "2.1.17-beta.9",
4
4
  "description": "Proactive personal AI agent with no limits",
5
5
  "license": "MIT",
6
6
  "main": "server/index.js",
@@ -46,9 +46,9 @@
46
46
  "@google/generative-ai": "^0.24.0",
47
47
  "@modelcontextprotocol/sdk": "^1.12.1",
48
48
  "baileys": "^6.7.1",
49
- "bcrypt": "^5.1.1",
49
+ "bcrypt": "^6.0.0",
50
50
  "better-sqlite3": "^11.8.1",
51
- "connect-sqlite3": "^0.9.15",
51
+ "better-sqlite3-session-store": "^0.1.0",
52
52
  "cors": "^2.8.5",
53
53
  "discord.js": "^14.25.1",
54
54
  "dotenv": "^16.4.7",
@@ -59,13 +59,16 @@
59
59
  "multer": "^1.4.5-lts.1",
60
60
  "node-cron": "^3.0.3",
61
61
  "node-pty": "^1.0.0",
62
- "node-telegram-bot-api": "^0.67.0",
63
62
  "openai": "^4.85.4",
64
63
  "puppeteer-core": "^24.40.0",
65
64
  "puppeteer-extra": "^3.3.6",
66
65
  "puppeteer-extra-plugin-stealth": "^2.11.2",
67
66
  "socket.io": "^4.8.1",
67
+ "telegraf": "^4.16.3",
68
68
  "telnyx": "^5.51.0",
69
69
  "uuid": "^11.1.0"
70
+ },
71
+ "overrides": {
72
+ "undici": "^6.24.0"
70
73
  }
71
74
  }
@@ -267,6 +267,7 @@ db.exec(`
267
267
  transcript_text TEXT,
268
268
  transcript_language TEXT,
269
269
  transcript_model TEXT,
270
+ structured_content_json TEXT,
270
271
  started_at TEXT DEFAULT (datetime('now')),
271
272
  ended_at TEXT,
272
273
  duration_ms INTEGER DEFAULT 0,
@@ -277,6 +278,21 @@ db.exec(`
277
278
  FOREIGN KEY (user_id) REFERENCES users(id) ON DELETE CASCADE
278
279
  );
279
280
 
281
+ CREATE TABLE IF NOT EXISTS wearable_devices (
282
+ id TEXT PRIMARY KEY,
283
+ user_id INTEGER NOT NULL,
284
+ mac_address TEXT,
285
+ protocol TEXT NOT NULL,
286
+ name TEXT NOT NULL,
287
+ status TEXT DEFAULT 'disconnected',
288
+ battery_level INTEGER,
289
+ last_seen_at TEXT,
290
+ created_at TEXT DEFAULT (datetime('now')),
291
+ updated_at TEXT DEFAULT (datetime('now')),
292
+ FOREIGN KEY (user_id) REFERENCES users(id) ON DELETE CASCADE,
293
+ UNIQUE(user_id, mac_address)
294
+ );
295
+
280
296
  CREATE TABLE IF NOT EXISTS recording_sources (
281
297
  id TEXT PRIMARY KEY,
282
298
  session_id TEXT NOT NULL,
@@ -397,6 +413,7 @@ for (const col of [
397
413
  "ALTER TABLE recording_sessions ADD COLUMN transcript_language TEXT",
398
414
  "ALTER TABLE recording_sessions ADD COLUMN transcript_model TEXT",
399
415
  "ALTER TABLE recording_sessions ADD COLUMN duration_ms INTEGER DEFAULT 0",
416
+ "ALTER TABLE recording_sessions ADD COLUMN structured_content_json TEXT",
400
417
  ]) {
401
418
  try { db.exec(col); } catch { /* column already exists */ }
402
419
  }
@@ -1,12 +1,61 @@
1
1
  'use strict';
2
2
 
3
3
  const session = require('express-session');
4
- const SQLiteStore = require('connect-sqlite3')(session);
4
+ const Sqlite = require('better-sqlite3');
5
+ const SQLiteStore = require('better-sqlite3-session-store')(session);
5
6
  const helmet = require('helmet');
6
7
  const cors = require('cors');
7
8
  const { DATA_DIR } = require('../../runtime/paths');
8
9
  const { logRequestSummary } = require('../utils/logger');
9
10
 
11
+ const sessionsDb = new Sqlite(`${DATA_DIR}/sessions.db`);
12
+
13
+ function ensureSessionStoreSchema(db) {
14
+ const table = db.prepare("SELECT name FROM sqlite_master WHERE type = 'table' AND name = 'sessions'").get();
15
+ if (!table) {
16
+ db.exec('CREATE TABLE sessions (sid PRIMARY KEY, sess, expire)');
17
+ return;
18
+ }
19
+
20
+ const columns = db.prepare('PRAGMA table_info(sessions)').all().map((row) => row.name);
21
+ const expected = ['sid', 'sess', 'expire'];
22
+ if (columns.length === expected.length && columns.every((name, index) => name === expected[index])) {
23
+ return;
24
+ }
25
+
26
+ const hasSid = columns.includes('sid');
27
+ const hasSess = columns.includes('sess');
28
+ const expireColumn = columns.includes('expire') ? 'expire' : (columns.includes('expired') ? 'expired' : null);
29
+
30
+ const legacyTableName = `sessions_legacy_${Date.now()}`;
31
+ db.exec('BEGIN');
32
+ try {
33
+ db.exec(`ALTER TABLE sessions RENAME TO ${legacyTableName}`);
34
+ db.exec('CREATE TABLE sessions (sid PRIMARY KEY, sess, expire)');
35
+
36
+ if (hasSid && hasSess) {
37
+ const expireExpr = expireColumn ? expireColumn : 'NULL';
38
+ db.exec(`
39
+ INSERT OR REPLACE INTO sessions (sid, sess, expire)
40
+ SELECT sid, sess, ${expireExpr}
41
+ FROM ${legacyTableName}
42
+ WHERE sid IS NOT NULL
43
+ `);
44
+ }
45
+
46
+ db.exec(`DROP TABLE ${legacyTableName}`);
47
+ db.exec('COMMIT');
48
+ console.warn('[Session] Normalized sessions table schema to (sid, sess, expire).');
49
+ } catch (error) {
50
+ try {
51
+ db.exec('ROLLBACK');
52
+ } catch {}
53
+ throw error;
54
+ }
55
+ }
56
+
57
+ ensureSessionStoreSchema(sessionsDb);
58
+
10
59
  function buildHelmetOptions({ secureCookies }) {
11
60
  const wsConnectSrc = secureCookies ? ['wss:'] : ['ws:', 'wss:'];
12
61
 
@@ -48,7 +97,13 @@ function buildHelmetOptions({ secureCookies }) {
48
97
 
49
98
  function createSessionMiddleware({ secureCookies }) {
50
99
  return session({
51
- store: new SQLiteStore({ db: 'sessions.db', dir: DATA_DIR }),
100
+ store: new SQLiteStore({
101
+ client: sessionsDb,
102
+ expired: {
103
+ clear: true,
104
+ intervalMs: 15 * 60 * 1000,
105
+ },
106
+ }),
52
107
  secret: process.env.SESSION_SECRET || 'neoagent-dev-secret-change-me',
53
108
  name: 'neoagent.sid',
54
109
  resave: false,
@@ -17,6 +17,7 @@ const routeRegistry = [
17
17
  { basePath: '/api/browser', modulePath: '../routes/browser' },
18
18
  { basePath: '/api/android', modulePath: '../routes/android' },
19
19
  { basePath: '/api/recordings', modulePath: '../routes/recordings' },
20
+ { basePath: '/api/wearables', modulePath: '../routes/wearables' },
20
21
  { basePath: '/api/mobile/health', modulePath: '../routes/mobile-health' }
21
22
  ];
22
23
 
package/server/index.js CHANGED
@@ -29,6 +29,19 @@ const { startServices, stopServices } = require('./services/manager');
29
29
  const PORT = Number(process.env.PORT) || 3333;
30
30
  const SECURE_COOKIES = process.env.SECURE_COOKIES === 'true';
31
31
 
32
+ function logStartupConfig() {
33
+ const flags = {
34
+ SESSION_SECRET: Boolean(process.env.SESSION_SECRET),
35
+ OPENAI_API_KEY: Boolean(process.env.OPENAI_API_KEY),
36
+ DEEPGRAM_API_KEY: Boolean(process.env.DEEPGRAM_API_KEY),
37
+ };
38
+
39
+ console.log(`[Startup] Using env file: ${ENV_FILE}`);
40
+ console.log('[Startup] Key availability:', flags);
41
+ }
42
+
43
+ logStartupConfig();
44
+
32
45
  if (!process.env.SESSION_SECRET) {
33
46
  console.warn(
34
47
  'WARNING: SESSION_SECRET not set — using insecure default. Set it in .env before exposing this server.'
@@ -1 +1 @@
1
- e38b9444952230adccfb989891baa8ec
1
+ 1364c60312b13e5d80c77b1708e33bfb