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.
- package/package.json +7 -4
- package/server/db/database.js +17 -0
- package/server/http/middleware.js +57 -2
- package/server/http/routes.js +1 -0
- package/server/index.js +13 -0
- package/server/public/.last_build_id +1 -1
- package/server/public/assets/NOTICES +2408 -1891
- package/server/public/assets/fonts/MaterialIcons-Regular.otf +0 -0
- package/server/public/canvaskit/canvaskit.js.symbols +99 -99
- package/server/public/canvaskit/canvaskit.wasm +0 -0
- package/server/public/canvaskit/chromium/canvaskit.js.symbols +57 -57
- package/server/public/canvaskit/chromium/canvaskit.wasm +0 -0
- package/server/public/canvaskit/skwasm.js.symbols +3 -3
- package/server/public/canvaskit/skwasm.wasm +0 -0
- package/server/public/canvaskit/skwasm_heavy.js.symbols +3 -3
- package/server/public/canvaskit/skwasm_heavy.wasm +0 -0
- package/server/public/canvaskit/wimp.js.symbols +951 -951
- package/server/public/canvaskit/wimp.wasm +0 -0
- package/server/public/flutter_bootstrap.js +2 -2
- package/server/public/main.dart.js +65717 -63099
- package/server/routes/android.js +52 -138
- package/server/routes/browser.js +21 -13
- package/server/routes/recordings.js +63 -42
- package/server/routes/settings.js +10 -7
- package/server/routes/wearables.js +153 -0
- package/server/services/ai/engine.js +135 -15
- package/server/services/ai/recordingInsights.js +75 -0
- package/server/services/ai/settings.js +6 -2
- package/server/services/ai/systemPrompt.js +47 -11
- package/server/services/ai/tools.js +243 -2
- package/server/services/android/controller.js +241 -50
- package/server/services/manager.js +85 -0
- package/server/services/memory/manager.js +6 -2
- package/server/services/messaging/telegram.js +36 -19
- package/server/services/recordings/manager.js +55 -24
- package/server/services/scheduler/cron.js +32 -5
- package/server/services/wearables/manager.js +290 -0
- package/server/services/wearables/protocols/base.js +61 -0
- package/server/services/wearables/protocols/heypocket.js +98 -0
- 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.
|
|
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": "^
|
|
49
|
+
"bcrypt": "^6.0.0",
|
|
50
50
|
"better-sqlite3": "^11.8.1",
|
|
51
|
-
"
|
|
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
|
}
|
package/server/db/database.js
CHANGED
|
@@ -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
|
|
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({
|
|
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,
|
package/server/http/routes.js
CHANGED
|
@@ -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
|
-
|
|
1
|
+
1364c60312b13e5d80c77b1708e33bfb
|