neoagent 3.1.1-beta.2 → 3.1.1-beta.4

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 (53) hide show
  1. package/extensions/chrome-browser/manifest.json +1 -1
  2. package/extensions/chrome-browser/protocol.mjs +36 -0
  3. package/flutter_app/lib/main_app_shell.dart +9 -3
  4. package/flutter_app/lib/main_controller.dart +49 -0
  5. package/flutter_app/lib/main_models.dart +55 -0
  6. package/flutter_app/lib/main_operations.dart +530 -2
  7. package/flutter_app/lib/main_settings.dart +301 -1
  8. package/flutter_app/lib/main_shared.dart +7 -2
  9. package/flutter_app/lib/main_timeline.dart +82 -11
  10. package/flutter_app/lib/src/backend_client.dart +50 -0
  11. package/landing/index.html +3 -0
  12. package/landing/status.html +178 -0
  13. package/lib/schema_migrations.js +23 -0
  14. package/package.json +1 -1
  15. package/server/db/database.js +6 -0
  16. package/server/http/routes.js +2 -0
  17. package/server/http/static.js +1 -0
  18. package/server/public/.last_build_id +1 -1
  19. package/server/public/assets/fonts/MaterialIcons-Regular.otf +0 -0
  20. package/server/public/flutter_bootstrap.js +1 -1
  21. package/server/public/main.dart.js +76806 -75964
  22. package/server/routes/public_status.js +12 -0
  23. package/server/routes/settings.js +14 -0
  24. package/server/routes/social_reach.js +88 -0
  25. package/server/routes/tasks.js +17 -0
  26. package/server/services/ai/tools.js +60 -1
  27. package/server/services/browser/extension/protocol.js +1 -0
  28. package/server/services/manager.js +14 -0
  29. package/server/services/memory/consolidation.js +2 -0
  30. package/server/services/memory/manager.js +70 -8
  31. package/server/services/memory/retention.js +66 -0
  32. package/server/services/memory/routing.js +68 -0
  33. package/server/services/messaging/access_policy.js +39 -2
  34. package/server/services/messaging/manager.js +9 -4
  35. package/server/services/public_status.js +103 -0
  36. package/server/services/runtime/settings.js +6 -0
  37. package/server/services/social_reach/channels/base.js +56 -0
  38. package/server/services/social_reach/channels/github.js +75 -0
  39. package/server/services/social_reach/channels/index.js +34 -0
  40. package/server/services/social_reach/channels/linkedin.js +34 -0
  41. package/server/services/social_reach/channels/rss.js +58 -0
  42. package/server/services/social_reach/channels/unsupported.js +49 -0
  43. package/server/services/social_reach/channels/v2ex.js +85 -0
  44. package/server/services/social_reach/channels/web.js +40 -0
  45. package/server/services/social_reach/channels/xueqiu.js +101 -0
  46. package/server/services/social_reach/channels/youtube.js +42 -0
  47. package/server/services/social_reach/index.js +7 -0
  48. package/server/services/social_reach/platforms.js +162 -0
  49. package/server/services/social_reach/service.js +163 -0
  50. package/server/services/social_reach/store.js +89 -0
  51. package/server/services/social_reach/utils.js +95 -0
  52. package/server/services/tasks/delivery_targets.js +260 -0
  53. package/server/utils/whatsapp.js +33 -1
@@ -0,0 +1,178 @@
1
+ <!DOCTYPE html>
2
+ <html lang="en">
3
+ <head>
4
+ <meta charset="UTF-8">
5
+ <meta name="viewport" content="width=device-width, initial-scale=1">
6
+ <title>NeoAgent Status</title>
7
+ <meta name="description" content="Public status for NeoAgent systems.">
8
+ <link rel="icon" type="image/png" href="images/favicon.png">
9
+ <style>
10
+ :root {
11
+ color-scheme: light dark;
12
+ --bg: #f7f3ea;
13
+ --ink: #171512;
14
+ --muted: #6f675a;
15
+ --line: rgba(33, 28, 20, 0.14);
16
+ --panel: rgba(255, 252, 245, 0.82);
17
+ --good: #14874d;
18
+ --warn: #b56a09;
19
+ --bad: #b3261e;
20
+ --accent: #9d7635;
21
+ --shadow: 0 22px 70px rgba(52, 38, 17, 0.14);
22
+ font-family: Inter, ui-sans-serif, system-ui, -apple-system, BlinkMacSystemFont, "Segoe UI", sans-serif;
23
+ }
24
+
25
+ @media (prefers-color-scheme: dark) {
26
+ :root {
27
+ --bg: #11100e;
28
+ --ink: #f5efe5;
29
+ --muted: #b8ac9b;
30
+ --line: rgba(245, 239, 229, 0.14);
31
+ --panel: rgba(31, 29, 25, 0.82);
32
+ --good: #49d18b;
33
+ --warn: #efb35d;
34
+ --bad: #ff827a;
35
+ --accent: #e5c58d;
36
+ --shadow: 0 22px 70px rgba(0, 0, 0, 0.28);
37
+ }
38
+ }
39
+
40
+ * { box-sizing: border-box; }
41
+ body {
42
+ margin: 0;
43
+ min-height: 100vh;
44
+ background:
45
+ radial-gradient(circle at 18% 8%, rgba(229, 197, 141, 0.24), transparent 34rem),
46
+ radial-gradient(circle at 88% 20%, rgba(74, 118, 158, 0.12), transparent 32rem),
47
+ var(--bg);
48
+ color: var(--ink);
49
+ }
50
+
51
+ a { color: inherit; text-decoration: none; }
52
+ .shell { width: min(1120px, calc(100% - 32px)); margin: 0 auto; }
53
+ .nav { display: flex; align-items: center; justify-content: space-between; padding: 24px 0; }
54
+ .brand { display: inline-flex; align-items: center; gap: 12px; font-weight: 750; }
55
+ .mark { width: 34px; height: 34px; border-radius: 10px; background: linear-gradient(135deg, #171512, var(--accent)); box-shadow: inset 0 0 0 1px rgba(255,255,255,.18); }
56
+ .nav a:last-child { color: var(--muted); font-size: 14px; font-weight: 650; }
57
+
58
+ .hero { padding: clamp(54px, 8vw, 104px) 0 34px; }
59
+ .eyebrow { color: var(--accent); font-size: 13px; font-weight: 800; letter-spacing: .08em; text-transform: uppercase; }
60
+ h1 { max-width: 850px; margin: 14px 0 18px; font-size: clamp(42px, 8vw, 84px); line-height: .96; letter-spacing: 0; font-weight: 520; }
61
+ .lede { max-width: 680px; margin: 0; color: var(--muted); font-size: clamp(17px, 2vw, 21px); line-height: 1.55; }
62
+
63
+ .summary {
64
+ display: grid;
65
+ grid-template-columns: 1fr auto;
66
+ gap: 24px;
67
+ align-items: center;
68
+ margin: 34px 0 22px;
69
+ padding: clamp(20px, 4vw, 32px);
70
+ border: 1px solid var(--line);
71
+ border-radius: 8px;
72
+ background: var(--panel);
73
+ box-shadow: var(--shadow);
74
+ backdrop-filter: blur(18px);
75
+ }
76
+
77
+ .status { display: inline-flex; align-items: center; gap: 10px; font-weight: 800; font-size: clamp(24px, 4vw, 42px); }
78
+ .dot { width: .72em; height: .72em; border-radius: 50%; background: var(--good); box-shadow: 0 0 0 6px color-mix(in srgb, var(--good) 16%, transparent); }
79
+ .status.degraded .dot { background: var(--warn); box-shadow: 0 0 0 6px color-mix(in srgb, var(--warn) 18%, transparent); }
80
+ .status.unavailable .dot { background: var(--bad); box-shadow: 0 0 0 6px color-mix(in srgb, var(--bad) 18%, transparent); }
81
+ .meta { color: var(--muted); font-size: 14px; line-height: 1.7; }
82
+ .note { margin-top: 12px; color: var(--muted); }
83
+
84
+ .grid { display: grid; grid-template-columns: repeat(2, minmax(0, 1fr)); gap: 14px; padding: 18px 0 64px; }
85
+ .card { border: 1px solid var(--line); border-radius: 8px; padding: 18px; background: color-mix(in srgb, var(--panel) 86%, transparent); }
86
+ .card-top { display: flex; align-items: start; justify-content: space-between; gap: 14px; }
87
+ .group { margin-bottom: 8px; color: var(--accent); font-size: 12px; font-weight: 800; text-transform: uppercase; letter-spacing: .08em; }
88
+ h2 { margin: 0; font-size: 18px; letter-spacing: 0; }
89
+ .pill { flex: 0 0 auto; border: 1px solid var(--line); border-radius: 999px; padding: 5px 10px; color: var(--good); font-size: 12px; font-weight: 800; }
90
+ .pill.degraded { color: var(--warn); }
91
+ .pill.unavailable { color: var(--bad); }
92
+ .description { margin: 12px 0 0; color: var(--muted); line-height: 1.55; }
93
+ .footer { border-top: 1px solid var(--line); color: var(--muted); padding: 24px 0 36px; font-size: 14px; }
94
+
95
+ @media (max-width: 720px) {
96
+ .summary, .grid { grid-template-columns: 1fr; }
97
+ .nav { align-items: flex-start; }
98
+ .card-top { flex-direction: column; }
99
+ }
100
+ </style>
101
+ </head>
102
+ <body>
103
+ <div class="shell">
104
+ <header class="nav">
105
+ <a class="brand" href="/"><span class="mark" aria-hidden="true"></span><span>NeoAgent</span></a>
106
+ <a href="/app">Sign in</a>
107
+ </header>
108
+
109
+ <main>
110
+ <section class="hero">
111
+ <div class="eyebrow">Public status</div>
112
+ <h1>All the important systems, minus the secret knobs.</h1>
113
+ <p class="lede">A live, public overview of NeoAgent platform health. We show broad system posture here, not private account, device, or workspace details.</p>
114
+ </section>
115
+
116
+ <section class="summary" aria-live="polite">
117
+ <div>
118
+ <div id="overall" class="status"><span class="dot" aria-hidden="true"></span><span>Checking systems</span></div>
119
+ <div id="note" class="note">The robots are tapping gauges with tiny clipboards.</div>
120
+ </div>
121
+ <div id="meta" class="meta">Last checked: loading</div>
122
+ </section>
123
+
124
+ <section id="components" class="grid" aria-label="System components"></section>
125
+ </main>
126
+
127
+ <footer class="footer">Status data refreshes automatically. No incident confetti is deployed on this page.</footer>
128
+ </div>
129
+
130
+ <script>
131
+ (function () {
132
+ 'use strict';
133
+ const labels = {
134
+ operational: 'Operational',
135
+ degraded: 'Degraded',
136
+ unavailable: 'Unavailable',
137
+ maintenance: 'Maintenance'
138
+ };
139
+ const fallback = {
140
+ product: 'NeoAgent',
141
+ status: 'degraded',
142
+ updatedAt: new Date().toISOString(),
143
+ note: 'Live status is taking the scenic route.',
144
+ components: [
145
+ { group: 'Core', name: 'Web App & API', status: 'degraded', description: 'The public page loaded, but live component data is unavailable.' }
146
+ ]
147
+ };
148
+
149
+ function esc(value) {
150
+ return String(value == null ? '' : value).replace(/[&<>"']/g, function (char) {
151
+ return ({ '&': '&amp;', '<': '&lt;', '>': '&gt;', '"': '&quot;', "'": '&#39;' })[char];
152
+ });
153
+ }
154
+
155
+ function render(data) {
156
+ const status = data.status || 'degraded';
157
+ const overall = document.getElementById('overall');
158
+ overall.className = 'status ' + status;
159
+ overall.querySelector('span:last-child').textContent = labels[status] || 'Status unknown';
160
+ document.getElementById('note').textContent = data.note || '';
161
+ document.getElementById('meta').textContent = 'Last checked: ' + new Date(data.updatedAt || Date.now()).toLocaleString();
162
+ document.getElementById('components').innerHTML = (data.components || []).map(function (item) {
163
+ const itemStatus = item.status || 'degraded';
164
+ return '<article class="card">' +
165
+ '<div class="card-top"><div><div class="group">' + esc(item.group) + '</div><h2>' + esc(item.name) + '</h2></div>' +
166
+ '<div class="pill ' + esc(itemStatus) + '">' + esc(labels[itemStatus] || itemStatus) + '</div></div>' +
167
+ '<p class="description">' + esc(item.description) + '</p></article>';
168
+ }).join('');
169
+ }
170
+
171
+ fetch('/api/public/status', { headers: { accept: 'application/json' } })
172
+ .then(function (res) { return res.ok ? res.json() : Promise.reject(new Error('Status unavailable')); })
173
+ .then(render)
174
+ .catch(function () { render(fallback); });
175
+ })();
176
+ </script>
177
+ </body>
178
+ </html>
@@ -191,6 +191,27 @@ function migrateMemoryEmbeddingMetadata(db) {
191
191
  }
192
192
  }
193
193
 
194
+ function migrateMemoryRetentionMetadata(db) {
195
+ const columns = new Set(
196
+ db.prepare('PRAGMA table_info(memories)').all().map((column) => column.name),
197
+ );
198
+ const additions = [
199
+ ['memory_strength', 'REAL DEFAULT 1'],
200
+ ['last_accessed_at', 'TEXT'],
201
+ ['pinned', 'INTEGER DEFAULT 0'],
202
+ ];
203
+ for (const [name, type] of additions) {
204
+ if (!columns.has(name)) {
205
+ db.exec(`ALTER TABLE memories ADD COLUMN ${name} ${type}`);
206
+ }
207
+ }
208
+ db.exec(`
209
+ UPDATE memories
210
+ SET memory_strength = COALESCE(memory_strength, 1),
211
+ pinned = COALESCE(pinned, 0)
212
+ `);
213
+ }
214
+
194
215
  function migrateMemoryExactHashUniqueness(db) {
195
216
  const columns = new Set(
196
217
  db.prepare('PRAGMA table_info(memories)').all().map((column) => column.name),
@@ -546,6 +567,7 @@ function runSchemaMigrations(db) {
546
567
  migrateMemoryRelations(db);
547
568
  migrateMemoryRetrievalEvents(db);
548
569
  migrateMemoryEmbeddingMetadata(db);
570
+ migrateMemoryRetentionMetadata(db);
549
571
  migrateMemoryExactHashUniqueness(db);
550
572
  migrateSkillOwnership(db);
551
573
  migrateToolPermissions(db);
@@ -560,6 +582,7 @@ module.exports = {
560
582
  migrateMemoryRelations,
561
583
  migrateMemoryRetrievalEvents,
562
584
  migrateMemoryEmbeddingMetadata,
585
+ migrateMemoryRetentionMetadata,
563
586
  migrateMemoryExactHashUniqueness,
564
587
  migrateSkillOwnership,
565
588
  migrateToolPermissions,
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "neoagent",
3
- "version": "3.1.1-beta.2",
3
+ "version": "3.1.1-beta.4",
4
4
  "description": "Self-hosted AI agent for long-running tasks, automation, messaging, device control, and local memory",
5
5
  "license": "AGPL-3.0-only",
6
6
  "main": "server/index.js",
@@ -586,6 +586,9 @@ db.exec(`
586
586
  memory_hash TEXT,
587
587
  embedding TEXT,
588
588
  access_count INTEGER DEFAULT 0,
589
+ memory_strength REAL DEFAULT 1,
590
+ last_accessed_at TEXT,
591
+ pinned INTEGER DEFAULT 0,
589
592
  archived INTEGER DEFAULT 0,
590
593
  created_at TEXT DEFAULT (datetime('now')),
591
594
  updated_at TEXT DEFAULT (datetime('now')),
@@ -1311,6 +1314,9 @@ for (const col of [
1311
1314
  "ALTER TABLE memories ADD COLUMN confidence REAL DEFAULT 0.7",
1312
1315
  "ALTER TABLE memories ADD COLUMN summary TEXT",
1313
1316
  "ALTER TABLE memories ADD COLUMN memory_hash TEXT",
1317
+ "ALTER TABLE memories ADD COLUMN memory_strength REAL DEFAULT 1",
1318
+ "ALTER TABLE memories ADD COLUMN last_accessed_at TEXT",
1319
+ "ALTER TABLE memories ADD COLUMN pinned INTEGER DEFAULT 0",
1314
1320
  "ALTER TABLE scheduled_tasks ADD COLUMN run_at TEXT",
1315
1321
  "ALTER TABLE scheduled_tasks ADD COLUMN one_time INTEGER DEFAULT 0",
1316
1322
  "ALTER TABLE scheduled_tasks ADD COLUMN execution_mode TEXT DEFAULT 'prompt'",
@@ -6,6 +6,7 @@ const { getVersionInfo } = require('../utils/version');
6
6
  const { getRuntimeValidation } = require('../services/runtime/validation');
7
7
 
8
8
  const routeRegistry = [
9
+ { basePath: '/api/public', modulePath: '../routes/public_status' },
9
10
  { basePath: '/api/runtime', modulePath: '../routes/runtime' },
10
11
  { basePath: null, modulePath: '../routes/auth' },
11
12
  { basePath: '/api/account', modulePath: '../routes/account' },
@@ -30,6 +31,7 @@ const routeRegistry = [
30
31
  { basePath: '/api/stream', modulePath: '../routes/stream' },
31
32
  { basePath: '/api/recordings', modulePath: '../routes/recordings' },
32
33
  { basePath: '/api/social-video', modulePath: '../routes/social_video' },
34
+ { basePath: '/api/social-reach', modulePath: '../routes/social_reach' },
33
35
  { basePath: '/api/voice-assistant', modulePath: '../routes/voice_assistant' },
34
36
  { basePath: '/api/wearable', modulePath: '../routes/wearable' },
35
37
  { basePath: '/api/mobile/health', modulePath: '../routes/mobile-health' },
@@ -80,6 +80,7 @@ function registerStaticRoutes(app) {
80
80
  // Landing page at /
81
81
  if (fs.existsSync(path.join(LANDING_DIR, 'index.html'))) {
82
82
  app.use(express.static(LANDING_DIR));
83
+ app.get('/status', (req, res) => res.sendFile(path.join(LANDING_DIR, 'status.html')));
83
84
  app.get('/', (req, res) => res.sendFile(path.join(LANDING_DIR, 'index.html')));
84
85
  }
85
86
  }
@@ -1 +1 @@
1
- f7df01608b06990693a484c0623d8650
1
+ 290aea80d4ae81e5a61607695f613845
@@ -37,6 +37,6 @@ _flutter.buildConfig = {"engineRevision":"a10d8ac38de835021c8d2f920dbf50a920ccc0
37
37
 
38
38
  _flutter.loader.load({
39
39
  serviceWorkerSettings: {
40
- serviceWorkerVersion: "62998229" /* Flutter's service worker is deprecated and will be removed in a future Flutter release. */
40
+ serviceWorkerVersion: "3576241244" /* Flutter's service worker is deprecated and will be removed in a future Flutter release. */
41
41
  }
42
42
  });