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.
Files changed (54) hide show
  1. package/.env.example +28 -0
  2. package/LICENSE +21 -0
  3. package/README.md +42 -0
  4. package/bin/neoagent.js +8 -0
  5. package/com.neoagent.plist +45 -0
  6. package/docs/configuration.md +45 -0
  7. package/docs/skills.md +45 -0
  8. package/lib/manager.js +459 -0
  9. package/package.json +61 -0
  10. package/server/db/database.js +239 -0
  11. package/server/index.js +442 -0
  12. package/server/middleware/auth.js +35 -0
  13. package/server/public/app.html +559 -0
  14. package/server/public/css/app.css +608 -0
  15. package/server/public/css/styles.css +472 -0
  16. package/server/public/favicon.svg +17 -0
  17. package/server/public/js/app.js +3283 -0
  18. package/server/public/login.html +313 -0
  19. package/server/routes/agents.js +125 -0
  20. package/server/routes/auth.js +105 -0
  21. package/server/routes/browser.js +116 -0
  22. package/server/routes/mcp.js +164 -0
  23. package/server/routes/memory.js +193 -0
  24. package/server/routes/messaging.js +153 -0
  25. package/server/routes/protocols.js +87 -0
  26. package/server/routes/scheduler.js +63 -0
  27. package/server/routes/settings.js +98 -0
  28. package/server/routes/skills.js +107 -0
  29. package/server/routes/store.js +1192 -0
  30. package/server/services/ai/compaction.js +82 -0
  31. package/server/services/ai/engine.js +1690 -0
  32. package/server/services/ai/models.js +46 -0
  33. package/server/services/ai/multiStep.js +112 -0
  34. package/server/services/ai/providers/anthropic.js +181 -0
  35. package/server/services/ai/providers/base.js +40 -0
  36. package/server/services/ai/providers/google.js +187 -0
  37. package/server/services/ai/providers/grok.js +121 -0
  38. package/server/services/ai/providers/ollama.js +162 -0
  39. package/server/services/ai/providers/openai.js +167 -0
  40. package/server/services/ai/toolRunner.js +218 -0
  41. package/server/services/browser/controller.js +320 -0
  42. package/server/services/cli/executor.js +204 -0
  43. package/server/services/mcp/client.js +260 -0
  44. package/server/services/memory/embeddings.js +126 -0
  45. package/server/services/memory/manager.js +431 -0
  46. package/server/services/messaging/base.js +23 -0
  47. package/server/services/messaging/discord.js +238 -0
  48. package/server/services/messaging/manager.js +328 -0
  49. package/server/services/messaging/telegram.js +243 -0
  50. package/server/services/messaging/telnyx.js +693 -0
  51. package/server/services/messaging/whatsapp.js +304 -0
  52. package/server/services/scheduler/cron.js +312 -0
  53. package/server/services/websocket.js +191 -0
  54. package/server/utils/security.js +71 -0
@@ -0,0 +1,472 @@
1
+ /* ══════════════════════════════════════════
2
+ NeoAgent · Design System · v2
3
+ ══════════════════════════════════════════ */
4
+
5
+ @import url('https://fonts.googleapis.com/css2?family=Inter:ital,wght@0,400;0,500;0,600;0,700;1,400&family=JetBrains+Mono:wght@400;500&display=swap');
6
+
7
+ /* ── design tokens ── */
8
+ :root {
9
+ /* backgrounds */
10
+ --bg-0: #07070f;
11
+ --bg-1: #0c0c18;
12
+ --bg-2: #111120;
13
+ --bg-3: #181828;
14
+ --bg-4: #1e1e32;
15
+ --bg-5: #262640;
16
+
17
+ /* legacy compat */
18
+ --bg-primary: var(--bg-0);
19
+ --bg-secondary: var(--bg-1);
20
+ --bg-tertiary: var(--bg-2);
21
+ --bg-card: var(--bg-3);
22
+ --bg-hover: var(--bg-5);
23
+ --bg-input: var(--bg-1);
24
+
25
+ /* borders */
26
+ --border: rgba(255,255,255,.07);
27
+ --border-light: rgba(255,255,255,.13);
28
+
29
+ /* text */
30
+ --text-primary: #eaeaf4;
31
+ --text-secondary: #8080a8;
32
+ --text-muted: #4d4d6a;
33
+
34
+ /* accent */
35
+ --accent: #6366f1;
36
+ --accent-hover: #818cf8;
37
+ --accent-dim: rgba(99,102,241,.12);
38
+ --accent-glow: rgba(99,102,241,.28);
39
+ --accent-muted: rgba(99,102,241,.15);
40
+
41
+ /* semantic */
42
+ --success: #22c55e;
43
+ --warning: #f59e0b;
44
+ --error: #ef4444;
45
+ --info: #3b82f6;
46
+
47
+ /* layout */
48
+ --sidebar-width: 220px;
49
+ --header-height: 56px;
50
+
51
+ /* shape */
52
+ --radius: 8px;
53
+ --radius-lg: 14px;
54
+ --radius-xl: 20px;
55
+
56
+ /* shadow */
57
+ --shadow-sm: 0 2px 8px rgba(0,0,0,.35);
58
+ --shadow: 0 8px 32px rgba(0,0,0,.5);
59
+ --shadow-lg: 0 20px 60px rgba(0,0,0,.6);
60
+
61
+ /* motion */
62
+ --ease-out: cubic-bezier(.16,1,.3,1);
63
+ --ease-in: cubic-bezier(.7,0,.84,0);
64
+ --t-fast: 100ms;
65
+ --t-mid: 200ms;
66
+ --t-slow: 360ms;
67
+ --transition: var(--t-mid) var(--ease-out);
68
+ }
69
+
70
+ *, *::before, *::after { margin: 0; padding: 0; box-sizing: border-box; }
71
+
72
+ html, body {
73
+ height: 100%;
74
+ font-family: 'Inter', -apple-system, BlinkMacSystemFont, 'Segoe UI', system-ui, sans-serif;
75
+ background: var(--bg-0);
76
+ color: var(--text-primary);
77
+ font-size: 14px;
78
+ line-height: 1.5;
79
+ -webkit-font-smoothing: antialiased;
80
+ -moz-osx-font-smoothing: grayscale;
81
+ }
82
+
83
+ a { color: var(--accent); text-decoration: none; }
84
+ a:hover { color: var(--accent-hover); }
85
+
86
+ button, input, textarea, select {
87
+ font-family: inherit;
88
+ font-size: inherit;
89
+ color: inherit;
90
+ }
91
+
92
+ ::selection {
93
+ background: var(--accent);
94
+ color: white;
95
+ }
96
+
97
+ ::-webkit-scrollbar { width: 4px; height: 4px; }
98
+ ::-webkit-scrollbar-track { background: transparent; }
99
+ ::-webkit-scrollbar-thumb { background: rgba(255,255,255,.1); border-radius: 99px; }
100
+ ::-webkit-scrollbar-thumb:hover { background: rgba(255,255,255,.2); }
101
+
102
+ /* ── Buttons ── */
103
+
104
+ .btn {
105
+ display: inline-flex;
106
+ align-items: center;
107
+ gap: 7px;
108
+ padding: 8px 16px;
109
+ border-radius: var(--radius);
110
+ border: 1px solid transparent;
111
+ cursor: pointer;
112
+ font-weight: 500;
113
+ transition: background var(--t-fast, 100ms), border-color var(--t-fast, 100ms), transform var(--t-fast, 100ms), box-shadow var(--t-fast, 100ms);
114
+ white-space: nowrap;
115
+ font-size: 13px;
116
+ user-select: none;
117
+ position: relative;
118
+ }
119
+ .btn:active { transform: scale(.96); }
120
+
121
+ .btn-primary {
122
+ background: var(--accent);
123
+ color: white;
124
+ border-color: var(--accent);
125
+ box-shadow: 0 2px 10px rgba(99,102,241,.3);
126
+ }
127
+ .btn-primary:hover {
128
+ background: var(--accent-hover);
129
+ border-color: var(--accent-hover);
130
+ box-shadow: 0 4px 18px rgba(99,102,241,.45);
131
+ }
132
+
133
+ .btn-secondary {
134
+ background: rgba(255,255,255,.04);
135
+ color: var(--text-primary);
136
+ border-color: var(--border);
137
+ }
138
+ .btn-secondary:hover { background: rgba(255,255,255,.08); border-color: var(--border-light); }
139
+
140
+ .btn-danger {
141
+ background: transparent;
142
+ color: var(--error);
143
+ border-color: var(--error);
144
+ }
145
+ .btn-danger:hover { background: rgba(239, 68, 68, 0.1); }
146
+
147
+ .btn-ghost {
148
+ background: transparent;
149
+ color: var(--text-secondary);
150
+ border: none;
151
+ padding: 6px 10px;
152
+ }
153
+ .btn-ghost:hover { color: var(--text-primary); background: rgba(255,255,255,.06); }
154
+
155
+ .btn-sm { padding: 4px 10px; font-size: 12px; }
156
+ .btn-lg { padding: 12px 24px; font-size: 15px; }
157
+
158
+ .btn:disabled { opacity: 0.5; cursor: not-allowed; }
159
+
160
+ /* ── Inputs ── */
161
+
162
+ .input, .textarea, .select {
163
+ width: 100%;
164
+ padding: 9px 13px;
165
+ background: var(--bg-input);
166
+ border: 1px solid var(--border);
167
+ border-radius: var(--radius);
168
+ color: var(--text-primary);
169
+ transition: border-color var(--t-fast, 100ms), box-shadow var(--t-fast, 100ms);
170
+ outline: none;
171
+ }
172
+
173
+ .input:focus, .textarea:focus, .select:focus {
174
+ border-color: var(--accent);
175
+ box-shadow: 0 0 0 3px var(--accent-dim, rgba(99,102,241,.12));
176
+ }
177
+
178
+ .input::placeholder, .textarea::placeholder {
179
+ color: var(--text-muted);
180
+ }
181
+
182
+ .textarea { resize: vertical; min-height: 80px; }
183
+
184
+ .form-group { margin-bottom: 16px; }
185
+ .form-label {
186
+ display: block;
187
+ margin-bottom: 5px;
188
+ font-size: 11px;
189
+ font-weight: 600;
190
+ letter-spacing: .4px;
191
+ color: var(--text-secondary);
192
+ text-transform: uppercase;
193
+ }
194
+
195
+ /* ── Cards ── */
196
+
197
+ .card {
198
+ background: var(--bg-card);
199
+ border: 1px solid var(--border);
200
+ border-radius: var(--radius-lg);
201
+ padding: 20px;
202
+ transition: border-color var(--t-mid, 200ms), box-shadow var(--t-mid, 200ms);
203
+ }
204
+ .card:hover { border-color: var(--border-light); box-shadow: 0 2px 12px rgba(0,0,0,.3); }
205
+
206
+ .card-header {
207
+ display: flex;
208
+ align-items: center;
209
+ justify-content: space-between;
210
+ margin-bottom: 16px;
211
+ }
212
+
213
+ .card-title {
214
+ font-size: 16px;
215
+ font-weight: 600;
216
+ }
217
+
218
+ /* ── Badge / Tag ── */
219
+
220
+ .badge {
221
+ display: inline-flex;
222
+ align-items: center;
223
+ gap: 4px;
224
+ padding: 2px 8px;
225
+ border-radius: 100px;
226
+ font-size: 11px;
227
+ font-weight: 600;
228
+ text-transform: uppercase;
229
+ letter-spacing: 0.5px;
230
+ }
231
+
232
+ .badge-success { background: rgba(34, 197, 94, 0.15); color: var(--success); }
233
+ .badge-warning { background: rgba(245, 158, 11, 0.15); color: var(--warning); }
234
+ .badge-error { background: rgba(239, 68, 68, 0.15); color: var(--error); }
235
+ .badge-info { background: rgba(59, 130, 246, 0.15); color: var(--info); }
236
+ .badge-neutral { background: var(--bg-hover); color: var(--text-secondary); }
237
+
238
+ /* ── Toast / Notification ── */
239
+
240
+ .toast-container {
241
+ position: fixed;
242
+ top: 20px;
243
+ right: 20px;
244
+ z-index: 10000;
245
+ display: flex;
246
+ flex-direction: column;
247
+ gap: 8px;
248
+ pointer-events: none;
249
+ }
250
+
251
+ .toast {
252
+ padding: 12px 18px;
253
+ border-radius: var(--radius-lg);
254
+ background: rgba(18,18,32,.92);
255
+ backdrop-filter: blur(20px) saturate(1.4);
256
+ -webkit-backdrop-filter: blur(20px) saturate(1.4);
257
+ border: 1px solid var(--border-light);
258
+ box-shadow: var(--shadow);
259
+ font-size: 13px;
260
+ pointer-events: all;
261
+ animation: toastIn 200ms var(--ease-out, cubic-bezier(.16,1,.3,1)) both;
262
+ max-width: 380px;
263
+ }
264
+ .toast.removing { animation: toastOut 120ms ease-in both; }
265
+
266
+ .toast-success { border-left: 3px solid var(--success); }
267
+ .toast-error { border-left: 3px solid var(--error); }
268
+ .toast-info { border-left: 3px solid var(--info); }
269
+
270
+ @keyframes toastIn {
271
+ from { transform: translateX(110%) scale(.9); opacity: 0; }
272
+ to { transform: translateX(0) scale(1); opacity: 1; }
273
+ }
274
+ @keyframes toastOut {
275
+ from { transform: translateX(0) scale(1); opacity: 1; }
276
+ to { transform: translateX(60%) scale(.9); opacity: 0; }
277
+ }
278
+
279
+ /* ── Modal ── */
280
+
281
+ .modal-overlay {
282
+ position: fixed;
283
+ inset: 0;
284
+ background: rgba(0,0,0,.68);
285
+ backdrop-filter: blur(10px);
286
+ -webkit-backdrop-filter: blur(10px);
287
+ display: flex;
288
+ align-items: center;
289
+ justify-content: center;
290
+ z-index: 5000;
291
+ animation: fadeIn 120ms ease both;
292
+ }
293
+
294
+ .modal {
295
+ background: rgba(14,14,26,.96);
296
+ backdrop-filter: blur(24px) saturate(1.3);
297
+ -webkit-backdrop-filter: blur(24px) saturate(1.3);
298
+ border: 1px solid var(--border-light);
299
+ border-radius: var(--radius-xl);
300
+ width: 90%;
301
+ max-width: 600px;
302
+ max-height: 80vh;
303
+ overflow-y: auto;
304
+ box-shadow: var(--shadow-lg);
305
+ animation: modalIn 200ms var(--ease-out, cubic-bezier(.16,1,.3,1)) both;
306
+ }
307
+
308
+ .modal-header {
309
+ display: flex;
310
+ align-items: center;
311
+ justify-content: space-between;
312
+ padding: 20px 24px;
313
+ border-bottom: 1px solid var(--border);
314
+ }
315
+
316
+ .modal-header h2 { font-size: 18px; font-weight: 600; }
317
+
318
+ .modal-body { padding: 24px; }
319
+
320
+ .modal-footer {
321
+ display: flex;
322
+ justify-content: flex-end;
323
+ gap: 8px;
324
+ padding: 16px 24px;
325
+ border-top: 1px solid var(--border);
326
+ }
327
+
328
+ @keyframes modalIn {
329
+ from { transform: translateY(14px) scale(.96); opacity: 0; }
330
+ to { transform: translateY(0) scale(1); opacity: 1; }
331
+ }
332
+
333
+ @keyframes fadeIn { from { opacity: 0; } to { opacity: 1; } }
334
+
335
+ /* ── Tabs ── */
336
+
337
+ .tabs {
338
+ display: flex;
339
+ gap: 0;
340
+ border-bottom: 1px solid var(--border);
341
+ margin-bottom: 20px;
342
+ }
343
+
344
+ .tab {
345
+ padding: 10px 20px;
346
+ cursor: pointer;
347
+ color: var(--text-secondary);
348
+ border-bottom: 2px solid transparent;
349
+ font-weight: 500;
350
+ transition: all var(--transition);
351
+ font-size: 13px;
352
+ }
353
+
354
+ .tab:hover { color: var(--text-primary); }
355
+ .tab.active { color: var(--accent); border-bottom-color: var(--accent); }
356
+
357
+ /* ── Code Block ── */
358
+
359
+ .code-block {
360
+ background: var(--bg-primary);
361
+ border: 1px solid var(--border);
362
+ border-radius: var(--radius);
363
+ padding: 14px;
364
+ font-family: 'SF Mono', 'Fira Code', 'JetBrains Mono', monospace;
365
+ font-size: 12.5px;
366
+ line-height: 1.6;
367
+ overflow-x: auto;
368
+ white-space: pre-wrap;
369
+ word-break: break-word;
370
+ }
371
+
372
+ /* ── Empty State ── */
373
+
374
+ .empty-state {
375
+ display: flex;
376
+ flex-direction: column;
377
+ align-items: center;
378
+ justify-content: center;
379
+ padding: 64px 24px;
380
+ color: var(--text-muted);
381
+ text-align: center;
382
+ gap: 8px;
383
+ }
384
+ .empty-state svg { opacity: .25; margin-bottom: 8px; }
385
+ .empty-state p { font-size: 15px; font-weight: 500; color: var(--text-secondary); }
386
+
387
+ /* ── Spinner ── */
388
+
389
+ .spinner {
390
+ width: 20px;
391
+ height: 20px;
392
+ border: 2px solid var(--border);
393
+ border-top-color: var(--accent);
394
+ border-radius: 50%;
395
+ animation: spin 600ms linear infinite;
396
+ }
397
+
398
+ @keyframes spin { to { transform: rotate(360deg); } }
399
+
400
+ /* ── Markdown Content ── */
401
+
402
+ .md-content h1, .md-content h2, .md-content h3 { margin: 16px 0 8px; }
403
+ .md-content h1 { font-size: 20px; }
404
+ .md-content h2 { font-size: 17px; }
405
+ .md-content h3 { font-size: 15px; }
406
+ .md-content p { margin-bottom: 8px; }
407
+ .md-content ul, .md-content ol { padding-left: 24px; margin-bottom: 8px; }
408
+ .md-content code {
409
+ background: var(--bg-2, #111120);
410
+ padding: 2px 6px;
411
+ border-radius: 5px;
412
+ font-family: 'JetBrains Mono', 'SF Mono', monospace;
413
+ font-size: 12.5px;
414
+ color: var(--accent-hover);
415
+ }
416
+ .md-content pre {
417
+ background: var(--bg-primary);
418
+ border: 1px solid var(--border);
419
+ border-radius: var(--radius);
420
+ padding: 14px;
421
+ overflow-x: auto;
422
+ margin-bottom: 12px;
423
+ }
424
+ .md-content pre code { background: none; padding: 0; }
425
+ .md-content blockquote {
426
+ border-left: 3px solid var(--accent);
427
+ padding-left: 14px;
428
+ color: var(--text-secondary);
429
+ margin-bottom: 8px;
430
+ }
431
+
432
+ /* ── Utility ── */
433
+
434
+ .flex { display: flex; }
435
+ .flex-col { flex-direction: column; }
436
+ .items-center { align-items: center; }
437
+ .justify-between { justify-content: space-between; }
438
+ .gap-2 { gap: 8px; }
439
+ .gap-3 { gap: 12px; }
440
+ .gap-4 { gap: 16px; }
441
+ .w-full { width: 100%; }
442
+ .text-center { text-align: center; }
443
+ .text-sm { font-size: 13px; }
444
+ .text-xs { font-size: 11px; }
445
+ .text-muted { color: var(--text-secondary); }
446
+ .font-mono { font-family: 'JetBrains Mono', 'SF Mono', 'Fira Code', monospace; }
447
+ .truncate { overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
448
+ .hidden { display: none !important; }
449
+ .mt-1 { margin-top: 4px; }
450
+ .mt-2 { margin-top: 8px; }
451
+ .mt-4 { margin-top: 16px; }
452
+ .mb-2 { margin-bottom: 8px; }
453
+ .mb-4 { margin-bottom: 16px; }
454
+ .p-4 { padding: 16px; }
455
+ .gap-1 { gap: 4px; }
456
+ .justify-center { justify-content: center; }
457
+ .rounded { border-radius: var(--radius); }
458
+
459
+ /* ── ANIMATIONS (global) ── */
460
+
461
+ @keyframes pulse {
462
+ 0%, 100% { opacity: 1; }
463
+ 50% { opacity: .35; }
464
+ }
465
+
466
+ @keyframes fadeSlideUp {
467
+ from { opacity: 0; transform: translateY(8px); }
468
+ to { opacity: 1; transform: translateY(0); }
469
+ }
470
+
471
+ .animate-in { animation: fadeSlideUp 200ms cubic-bezier(.16,1,.3,1) both; }
472
+
@@ -0,0 +1,17 @@
1
+ <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 32 32">
2
+ <defs>
3
+ <linearGradient id="bg" x1="0%" y1="0%" x2="100%" y2="100%">
4
+ <stop offset="0%" stop-color="#6366f1"/>
5
+ <stop offset="100%" stop-color="#8b5cf6"/>
6
+ </linearGradient>
7
+ </defs>
8
+ <!-- rounded square background -->
9
+ <rect width="32" height="32" rx="8" ry="8" fill="url(#bg)"/>
10
+ <!-- layers icon (Lucide layers, scaled to fit) -->
11
+ <!-- top diamond -->
12
+ <polygon points="16,5 5,10.5 16,16 27,10.5" fill="white"/>
13
+ <!-- middle line -->
14
+ <polyline points="5,16 16,21.5 27,16" fill="none" stroke="white" stroke-width="2.2" stroke-linecap="round" stroke-linejoin="round"/>
15
+ <!-- bottom line -->
16
+ <polyline points="5,21.5 16,27 27,21.5" fill="none" stroke="white" stroke-width="2.2" stroke-linecap="round" stroke-linejoin="round"/>
17
+ </svg>