neoagent 1.0.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 +28 -0
- package/LICENSE +21 -0
- package/README.md +42 -0
- package/bin/neoagent.js +8 -0
- package/com.neoagent.plist +45 -0
- package/docs/configuration.md +45 -0
- package/docs/skills.md +45 -0
- package/lib/manager.js +459 -0
- package/package.json +61 -0
- package/server/db/database.js +239 -0
- package/server/index.js +442 -0
- package/server/middleware/auth.js +35 -0
- package/server/public/app.html +559 -0
- package/server/public/css/app.css +608 -0
- package/server/public/css/styles.css +472 -0
- package/server/public/favicon.svg +17 -0
- package/server/public/js/app.js +3283 -0
- package/server/public/login.html +313 -0
- package/server/routes/agents.js +125 -0
- package/server/routes/auth.js +105 -0
- package/server/routes/browser.js +116 -0
- package/server/routes/mcp.js +164 -0
- package/server/routes/memory.js +193 -0
- package/server/routes/messaging.js +153 -0
- package/server/routes/protocols.js +87 -0
- package/server/routes/scheduler.js +63 -0
- package/server/routes/settings.js +98 -0
- package/server/routes/skills.js +107 -0
- package/server/routes/store.js +1192 -0
- package/server/services/ai/compaction.js +82 -0
- package/server/services/ai/engine.js +1690 -0
- package/server/services/ai/models.js +46 -0
- package/server/services/ai/multiStep.js +112 -0
- package/server/services/ai/providers/anthropic.js +181 -0
- package/server/services/ai/providers/base.js +40 -0
- package/server/services/ai/providers/google.js +187 -0
- package/server/services/ai/providers/grok.js +121 -0
- package/server/services/ai/providers/ollama.js +162 -0
- package/server/services/ai/providers/openai.js +167 -0
- package/server/services/ai/toolRunner.js +218 -0
- package/server/services/browser/controller.js +320 -0
- package/server/services/cli/executor.js +204 -0
- package/server/services/mcp/client.js +260 -0
- package/server/services/memory/embeddings.js +126 -0
- package/server/services/memory/manager.js +431 -0
- package/server/services/messaging/base.js +23 -0
- package/server/services/messaging/discord.js +238 -0
- package/server/services/messaging/manager.js +328 -0
- package/server/services/messaging/telegram.js +243 -0
- package/server/services/messaging/telnyx.js +693 -0
- package/server/services/messaging/whatsapp.js +304 -0
- package/server/services/scheduler/cron.js +312 -0
- package/server/services/websocket.js +191 -0
- package/server/utils/security.js +71 -0
package/package.json
ADDED
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "neoagent",
|
|
3
|
+
"version": "1.0.0",
|
|
4
|
+
"description": "Proactive personal AI agent with no limits",
|
|
5
|
+
"license": "MIT",
|
|
6
|
+
"main": "server/index.js",
|
|
7
|
+
"bin": {
|
|
8
|
+
"neoagent": "bin/neoagent.js"
|
|
9
|
+
},
|
|
10
|
+
"files": [
|
|
11
|
+
"bin",
|
|
12
|
+
"lib",
|
|
13
|
+
"server",
|
|
14
|
+
"docs",
|
|
15
|
+
"com.neoagent.plist",
|
|
16
|
+
"LICENSE",
|
|
17
|
+
"README.md",
|
|
18
|
+
".env.example"
|
|
19
|
+
],
|
|
20
|
+
"scripts": {
|
|
21
|
+
"start": "node server/index.js",
|
|
22
|
+
"dev": "node --watch server/index.js",
|
|
23
|
+
"manage": "node bin/neoagent.js",
|
|
24
|
+
"release": "npx semantic-release"
|
|
25
|
+
},
|
|
26
|
+
"repository": {
|
|
27
|
+
"type": "git",
|
|
28
|
+
"url": "git+https://github.com/NeoLabs-Systems/NeoAgent.git"
|
|
29
|
+
},
|
|
30
|
+
"bugs": {
|
|
31
|
+
"url": "https://github.com/NeoLabs-Systems/NeoAgent/issues"
|
|
32
|
+
},
|
|
33
|
+
"homepage": "https://github.com/NeoLabs-Systems/NeoAgent#readme",
|
|
34
|
+
"dependencies": {
|
|
35
|
+
"@anthropic-ai/sdk": "^0.39.0",
|
|
36
|
+
"@google/generative-ai": "^0.24.0",
|
|
37
|
+
"@modelcontextprotocol/sdk": "^1.12.1",
|
|
38
|
+
"@whiskeysockets/baileys": "^6.17.16",
|
|
39
|
+
"bcrypt": "^5.1.1",
|
|
40
|
+
"better-sqlite3": "^11.8.1",
|
|
41
|
+
"connect-sqlite3": "^0.9.15",
|
|
42
|
+
"cors": "^2.8.5",
|
|
43
|
+
"discord.js": "^14.25.1",
|
|
44
|
+
"dotenv": "^16.4.7",
|
|
45
|
+
"express": "^4.21.2",
|
|
46
|
+
"express-rate-limit": "^7.5.0",
|
|
47
|
+
"express-session": "^1.18.1",
|
|
48
|
+
"helmet": "^8.0.0",
|
|
49
|
+
"multer": "^1.4.5-lts.1",
|
|
50
|
+
"node-cron": "^3.0.3",
|
|
51
|
+
"node-pty": "^1.0.0",
|
|
52
|
+
"node-telegram-bot-api": "^0.67.0",
|
|
53
|
+
"openai": "^4.85.4",
|
|
54
|
+
"puppeteer": "^24.4.0",
|
|
55
|
+
"puppeteer-extra": "^3.3.6",
|
|
56
|
+
"puppeteer-extra-plugin-stealth": "^2.11.2",
|
|
57
|
+
"socket.io": "^4.8.1",
|
|
58
|
+
"telnyx": "^5.51.0",
|
|
59
|
+
"uuid": "^11.1.0"
|
|
60
|
+
}
|
|
61
|
+
}
|
|
@@ -0,0 +1,239 @@
|
|
|
1
|
+
const Database = require('better-sqlite3');
|
|
2
|
+
const path = require('path');
|
|
3
|
+
const fs = require('fs');
|
|
4
|
+
|
|
5
|
+
const DATA_DIR = path.join(__dirname, '../..', 'data');
|
|
6
|
+
if (!fs.existsSync(DATA_DIR)) fs.mkdirSync(DATA_DIR, { recursive: true });
|
|
7
|
+
|
|
8
|
+
const DB_PATH = path.join(DATA_DIR, 'neoagent.db');
|
|
9
|
+
const db = new Database(DB_PATH);
|
|
10
|
+
|
|
11
|
+
db.pragma('journal_mode = WAL');
|
|
12
|
+
db.pragma('foreign_keys = ON');
|
|
13
|
+
db.pragma('busy_timeout = 5000');
|
|
14
|
+
|
|
15
|
+
db.exec(`
|
|
16
|
+
CREATE TABLE IF NOT EXISTS users (
|
|
17
|
+
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
|
18
|
+
username TEXT UNIQUE NOT NULL,
|
|
19
|
+
email TEXT UNIQUE,
|
|
20
|
+
password TEXT NOT NULL,
|
|
21
|
+
created_at TEXT DEFAULT (datetime('now')),
|
|
22
|
+
last_login TEXT
|
|
23
|
+
);
|
|
24
|
+
|
|
25
|
+
CREATE TABLE IF NOT EXISTS user_settings (
|
|
26
|
+
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
|
27
|
+
user_id INTEGER NOT NULL,
|
|
28
|
+
key TEXT NOT NULL,
|
|
29
|
+
value TEXT,
|
|
30
|
+
FOREIGN KEY (user_id) REFERENCES users(id) ON DELETE CASCADE,
|
|
31
|
+
UNIQUE(user_id, key)
|
|
32
|
+
);
|
|
33
|
+
|
|
34
|
+
CREATE TABLE IF NOT EXISTS agent_runs (
|
|
35
|
+
id TEXT PRIMARY KEY,
|
|
36
|
+
user_id INTEGER NOT NULL,
|
|
37
|
+
title TEXT,
|
|
38
|
+
status TEXT DEFAULT 'pending',
|
|
39
|
+
trigger_type TEXT DEFAULT 'user',
|
|
40
|
+
trigger_source TEXT,
|
|
41
|
+
model TEXT,
|
|
42
|
+
total_tokens INTEGER DEFAULT 0,
|
|
43
|
+
error TEXT,
|
|
44
|
+
created_at TEXT DEFAULT (datetime('now')),
|
|
45
|
+
updated_at TEXT DEFAULT (datetime('now')),
|
|
46
|
+
completed_at TEXT,
|
|
47
|
+
FOREIGN KEY (user_id) REFERENCES users(id) ON DELETE CASCADE
|
|
48
|
+
);
|
|
49
|
+
|
|
50
|
+
CREATE TABLE IF NOT EXISTS agent_steps (
|
|
51
|
+
id TEXT PRIMARY KEY,
|
|
52
|
+
run_id TEXT NOT NULL,
|
|
53
|
+
step_index INTEGER DEFAULT 0,
|
|
54
|
+
type TEXT NOT NULL,
|
|
55
|
+
description TEXT,
|
|
56
|
+
status TEXT DEFAULT 'pending',
|
|
57
|
+
tool_name TEXT,
|
|
58
|
+
tool_input TEXT,
|
|
59
|
+
result TEXT,
|
|
60
|
+
error TEXT,
|
|
61
|
+
screenshot_path TEXT,
|
|
62
|
+
tokens_used INTEGER DEFAULT 0,
|
|
63
|
+
started_at TEXT,
|
|
64
|
+
completed_at TEXT,
|
|
65
|
+
FOREIGN KEY (run_id) REFERENCES agent_runs(id) ON DELETE CASCADE
|
|
66
|
+
);
|
|
67
|
+
|
|
68
|
+
CREATE TABLE IF NOT EXISTS messages (
|
|
69
|
+
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
|
70
|
+
user_id INTEGER NOT NULL,
|
|
71
|
+
run_id TEXT,
|
|
72
|
+
role TEXT NOT NULL,
|
|
73
|
+
content TEXT,
|
|
74
|
+
tool_calls TEXT,
|
|
75
|
+
tool_call_id TEXT,
|
|
76
|
+
platform TEXT DEFAULT 'web',
|
|
77
|
+
platform_msg_id TEXT,
|
|
78
|
+
platform_chat_id TEXT,
|
|
79
|
+
media_path TEXT,
|
|
80
|
+
metadata TEXT,
|
|
81
|
+
created_at TEXT DEFAULT (datetime('now')),
|
|
82
|
+
FOREIGN KEY (user_id) REFERENCES users(id) ON DELETE CASCADE
|
|
83
|
+
);
|
|
84
|
+
|
|
85
|
+
CREATE TABLE IF NOT EXISTS platform_connections (
|
|
86
|
+
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
|
87
|
+
user_id INTEGER NOT NULL,
|
|
88
|
+
platform TEXT NOT NULL,
|
|
89
|
+
config TEXT DEFAULT '{}',
|
|
90
|
+
status TEXT DEFAULT 'disconnected',
|
|
91
|
+
auth_data_path TEXT,
|
|
92
|
+
last_connected TEXT,
|
|
93
|
+
created_at TEXT DEFAULT (datetime('now')),
|
|
94
|
+
FOREIGN KEY (user_id) REFERENCES users(id) ON DELETE CASCADE,
|
|
95
|
+
UNIQUE(user_id, platform)
|
|
96
|
+
);
|
|
97
|
+
|
|
98
|
+
CREATE TABLE IF NOT EXISTS mcp_servers (
|
|
99
|
+
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
|
100
|
+
user_id INTEGER NOT NULL,
|
|
101
|
+
name TEXT NOT NULL,
|
|
102
|
+
command TEXT NOT NULL,
|
|
103
|
+
config TEXT DEFAULT '{}',
|
|
104
|
+
enabled INTEGER DEFAULT 1,
|
|
105
|
+
status TEXT DEFAULT 'stopped',
|
|
106
|
+
created_at TEXT DEFAULT (datetime('now')),
|
|
107
|
+
FOREIGN KEY (user_id) REFERENCES users(id) ON DELETE CASCADE
|
|
108
|
+
);
|
|
109
|
+
|
|
110
|
+
CREATE TABLE IF NOT EXISTS scheduled_tasks (
|
|
111
|
+
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
|
112
|
+
user_id INTEGER NOT NULL,
|
|
113
|
+
name TEXT NOT NULL,
|
|
114
|
+
cron_expression TEXT,
|
|
115
|
+
run_at TEXT,
|
|
116
|
+
one_time INTEGER DEFAULT 0,
|
|
117
|
+
task_type TEXT DEFAULT 'agent_prompt',
|
|
118
|
+
task_config TEXT DEFAULT '{}',
|
|
119
|
+
enabled INTEGER DEFAULT 1,
|
|
120
|
+
last_run TEXT,
|
|
121
|
+
created_at TEXT DEFAULT (datetime('now')),
|
|
122
|
+
FOREIGN KEY (user_id) REFERENCES users(id) ON DELETE CASCADE
|
|
123
|
+
);
|
|
124
|
+
|
|
125
|
+
CREATE TABLE IF NOT EXISTS skills (
|
|
126
|
+
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
|
127
|
+
name TEXT UNIQUE NOT NULL,
|
|
128
|
+
description TEXT,
|
|
129
|
+
file_path TEXT NOT NULL,
|
|
130
|
+
metadata TEXT DEFAULT '{}',
|
|
131
|
+
enabled INTEGER DEFAULT 1,
|
|
132
|
+
auto_created INTEGER DEFAULT 0,
|
|
133
|
+
created_at TEXT DEFAULT (datetime('now')),
|
|
134
|
+
updated_at TEXT DEFAULT (datetime('now'))
|
|
135
|
+
);
|
|
136
|
+
|
|
137
|
+
CREATE TABLE IF NOT EXISTS conversations (
|
|
138
|
+
id TEXT PRIMARY KEY,
|
|
139
|
+
user_id INTEGER NOT NULL,
|
|
140
|
+
platform TEXT DEFAULT 'web',
|
|
141
|
+
platform_chat_id TEXT,
|
|
142
|
+
title TEXT,
|
|
143
|
+
session_key TEXT,
|
|
144
|
+
model TEXT,
|
|
145
|
+
total_tokens INTEGER DEFAULT 0,
|
|
146
|
+
compaction_count INTEGER DEFAULT 0,
|
|
147
|
+
last_compaction TEXT,
|
|
148
|
+
created_at TEXT DEFAULT (datetime('now')),
|
|
149
|
+
updated_at TEXT DEFAULT (datetime('now')),
|
|
150
|
+
FOREIGN KEY (user_id) REFERENCES users(id) ON DELETE CASCADE
|
|
151
|
+
);
|
|
152
|
+
|
|
153
|
+
CREATE TABLE IF NOT EXISTS conversation_messages (
|
|
154
|
+
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
|
155
|
+
conversation_id TEXT NOT NULL,
|
|
156
|
+
role TEXT NOT NULL,
|
|
157
|
+
content TEXT,
|
|
158
|
+
tool_calls TEXT,
|
|
159
|
+
tool_call_id TEXT,
|
|
160
|
+
name TEXT,
|
|
161
|
+
tokens INTEGER DEFAULT 0,
|
|
162
|
+
is_compacted INTEGER DEFAULT 0,
|
|
163
|
+
created_at TEXT DEFAULT (datetime('now')),
|
|
164
|
+
FOREIGN KEY (conversation_id) REFERENCES conversations(id) ON DELETE CASCADE
|
|
165
|
+
);
|
|
166
|
+
|
|
167
|
+
CREATE INDEX IF NOT EXISTS idx_agent_runs_user ON agent_runs(user_id, created_at DESC);
|
|
168
|
+
CREATE INDEX IF NOT EXISTS idx_agent_runs_status ON agent_runs(status);
|
|
169
|
+
CREATE INDEX IF NOT EXISTS idx_agent_steps_run ON agent_steps(run_id, step_index);
|
|
170
|
+
CREATE INDEX IF NOT EXISTS idx_messages_user ON messages(user_id, created_at DESC);
|
|
171
|
+
CREATE INDEX IF NOT EXISTS idx_messages_platform ON messages(platform, platform_chat_id);
|
|
172
|
+
CREATE INDEX IF NOT EXISTS idx_conv_messages ON conversation_messages(conversation_id, created_at);
|
|
173
|
+
CREATE INDEX IF NOT EXISTS idx_conversations_user ON conversations(user_id, updated_at DESC);
|
|
174
|
+
CREATE INDEX IF NOT EXISTS idx_scheduled_tasks_user ON scheduled_tasks(user_id);
|
|
175
|
+
|
|
176
|
+
CREATE TABLE IF NOT EXISTS conversation_history (
|
|
177
|
+
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
|
178
|
+
user_id INTEGER NOT NULL,
|
|
179
|
+
agent_run_id TEXT,
|
|
180
|
+
role TEXT NOT NULL,
|
|
181
|
+
content TEXT,
|
|
182
|
+
metadata TEXT DEFAULT '{}',
|
|
183
|
+
created_at TEXT DEFAULT (datetime('now')),
|
|
184
|
+
FOREIGN KEY (user_id) REFERENCES users(id) ON DELETE CASCADE
|
|
185
|
+
);
|
|
186
|
+
|
|
187
|
+
CREATE INDEX IF NOT EXISTS idx_conv_history_user ON conversation_history(user_id, created_at DESC);
|
|
188
|
+
CREATE INDEX IF NOT EXISTS idx_conv_history_run ON conversation_history(agent_run_id, created_at);
|
|
189
|
+
|
|
190
|
+
CREATE TABLE IF NOT EXISTS memories (
|
|
191
|
+
id TEXT PRIMARY KEY,
|
|
192
|
+
user_id INTEGER NOT NULL,
|
|
193
|
+
category TEXT DEFAULT 'episodic',
|
|
194
|
+
content TEXT NOT NULL,
|
|
195
|
+
importance INTEGER DEFAULT 5,
|
|
196
|
+
embedding TEXT,
|
|
197
|
+
access_count INTEGER DEFAULT 0,
|
|
198
|
+
archived INTEGER DEFAULT 0,
|
|
199
|
+
created_at TEXT DEFAULT (datetime('now')),
|
|
200
|
+
updated_at TEXT DEFAULT (datetime('now')),
|
|
201
|
+
FOREIGN KEY (user_id) REFERENCES users(id) ON DELETE CASCADE
|
|
202
|
+
);
|
|
203
|
+
|
|
204
|
+
CREATE TABLE IF NOT EXISTS core_memory (
|
|
205
|
+
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
|
206
|
+
user_id INTEGER NOT NULL,
|
|
207
|
+
key TEXT NOT NULL,
|
|
208
|
+
value TEXT,
|
|
209
|
+
updated_at TEXT DEFAULT (datetime('now')),
|
|
210
|
+
UNIQUE(user_id, key)
|
|
211
|
+
);
|
|
212
|
+
|
|
213
|
+
CREATE INDEX IF NOT EXISTS idx_memories_user ON memories(user_id, archived, updated_at DESC);
|
|
214
|
+
CREATE INDEX IF NOT EXISTS idx_memories_category ON memories(user_id, category, archived);
|
|
215
|
+
CREATE TABLE IF NOT EXISTS protocols (
|
|
216
|
+
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
|
217
|
+
user_id INTEGER NOT NULL,
|
|
218
|
+
name TEXT UNIQUE NOT NULL,
|
|
219
|
+
description TEXT,
|
|
220
|
+
content TEXT NOT NULL,
|
|
221
|
+
created_at TEXT DEFAULT (datetime('now')),
|
|
222
|
+
updated_at TEXT DEFAULT (datetime('now')),
|
|
223
|
+
FOREIGN KEY (user_id) REFERENCES users(id) ON DELETE CASCADE
|
|
224
|
+
);
|
|
225
|
+
|
|
226
|
+
CREATE INDEX IF NOT EXISTS idx_protocols_user ON protocols(user_id);
|
|
227
|
+
|
|
228
|
+
CREATE INDEX IF NOT EXISTS idx_core_memory_user ON core_memory(user_id, key);
|
|
229
|
+
`);
|
|
230
|
+
|
|
231
|
+
// Migrations for existing databases
|
|
232
|
+
for (const col of [
|
|
233
|
+
"ALTER TABLE scheduled_tasks ADD COLUMN run_at TEXT",
|
|
234
|
+
"ALTER TABLE scheduled_tasks ADD COLUMN one_time INTEGER DEFAULT 0",
|
|
235
|
+
]) {
|
|
236
|
+
try { db.exec(col); } catch { /* column already exists */ }
|
|
237
|
+
}
|
|
238
|
+
|
|
239
|
+
module.exports = db;
|