neoagent 2.4.1 → 2.4.2-beta.1
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/flutter_app/lib/main_operations.dart +87 -10
- package/landing/assets/logo.svg +43 -0
- package/landing/images/dashboard-dark.png +0 -0
- package/landing/images/dashboard-light.png +0 -0
- package/landing/images/favicon.png +0 -0
- package/landing/images/memory-dark.png +0 -0
- package/landing/images/memory-light.png +0 -0
- package/landing/images/remote-devices-dark.png +0 -0
- package/landing/images/remote-devices-light.png +0 -0
- package/landing/index.html +1293 -0
- package/landing/js/main.js +77 -0
- package/package.json +2 -1
- package/server/public/.last_build_id +1 -1
- package/server/public/flutter_bootstrap.js +1 -1
- package/server/public/main.dart.js +21464 -21409
- package/server/routes/admin.js +1 -4
- package/server/routes/android.js +15 -2
- package/server/routes/browser.js +6 -0
- package/server/services/ai/systemPrompt.js +4 -4
- package/server/services/browser/controller.js +66 -0
- package/server/services/browser/extension/provider.js +1 -0
- package/server/utils/cloud-security.js +80 -0
|
@@ -0,0 +1,77 @@
|
|
|
1
|
+
/* NeoAgent landing v3 — interactions */
|
|
2
|
+
(function () {
|
|
3
|
+
'use strict';
|
|
4
|
+
const reduced = matchMedia('(prefers-reduced-motion: reduce)').matches;
|
|
5
|
+
|
|
6
|
+
/* ---- nav scrolled ---- */
|
|
7
|
+
const nav = document.querySelector('.nav');
|
|
8
|
+
const onScroll = () => nav.classList.toggle('scrolled', window.scrollY > 12);
|
|
9
|
+
window.addEventListener('scroll', onScroll, { passive: true });
|
|
10
|
+
onScroll();
|
|
11
|
+
|
|
12
|
+
/* ---- mobile menu ---- */
|
|
13
|
+
const toggle = document.querySelector('.nav-toggle');
|
|
14
|
+
if (toggle) {
|
|
15
|
+
toggle.addEventListener('click', () => nav.classList.toggle('open'));
|
|
16
|
+
nav.querySelectorAll('.mobile-menu a').forEach((a) =>
|
|
17
|
+
a.addEventListener('click', () => nav.classList.remove('open'))
|
|
18
|
+
);
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
/* ---- scroll reveals (rect-based) ---- */
|
|
22
|
+
const reveals = Array.from(document.querySelectorAll('.reveal'));
|
|
23
|
+
let pending = reveals.slice();
|
|
24
|
+
const check = () => {
|
|
25
|
+
const vh = window.innerHeight;
|
|
26
|
+
pending = pending.filter((el) => {
|
|
27
|
+
const r = el.getBoundingClientRect();
|
|
28
|
+
if (r.top < vh * 0.9 && r.bottom > 0) { el.classList.add('in'); return false; }
|
|
29
|
+
return true;
|
|
30
|
+
});
|
|
31
|
+
if (!pending.length) window.removeEventListener('scroll', onRev);
|
|
32
|
+
};
|
|
33
|
+
let tick = false;
|
|
34
|
+
const onRev = () => { if (tick) return; tick = true; requestAnimationFrame(() => { check(); tick = false; }); };
|
|
35
|
+
window.addEventListener('scroll', onRev, { passive: true });
|
|
36
|
+
window.addEventListener('resize', onRev, { passive: true });
|
|
37
|
+
requestAnimationFrame(check);
|
|
38
|
+
// safety nets: all reveals + hero animated elements
|
|
39
|
+
setTimeout(() => {
|
|
40
|
+
reveals.forEach((el) => el.classList.add('in'));
|
|
41
|
+
const heroEls = document.querySelectorAll('.hero h1 .w, .hero .pill, .hero .lede, .hero-actions, .hero-note');
|
|
42
|
+
heroEls.forEach((el) => { el.style.animation = 'none'; el.style.opacity = '1'; el.style.transform = 'none'; el.style.filter = 'none'; });
|
|
43
|
+
}, 1200);
|
|
44
|
+
|
|
45
|
+
/* ---- scroll progress ---- */
|
|
46
|
+
const bar = document.createElement('div');
|
|
47
|
+
bar.className = 'scroll-progress';
|
|
48
|
+
document.body.appendChild(bar);
|
|
49
|
+
const onProg = () => {
|
|
50
|
+
const h = document.documentElement.scrollHeight - window.innerHeight;
|
|
51
|
+
bar.style.width = (h > 0 ? (window.scrollY / h) * 100 : 0) + '%';
|
|
52
|
+
};
|
|
53
|
+
window.addEventListener('scroll', onProg, { passive: true });
|
|
54
|
+
onProg();
|
|
55
|
+
|
|
56
|
+
if (reduced) return;
|
|
57
|
+
|
|
58
|
+
/* ---- github pages: hide sign-in (no app at /app on static host) ---- */
|
|
59
|
+
if (location.hostname.includes('github.io')) {
|
|
60
|
+
document.querySelectorAll('a.signin').forEach((a) => (a.style.display = 'none'));
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
/* ---- hero parallax ---- */
|
|
64
|
+
const stage = document.querySelector('.hero-stage');
|
|
65
|
+
const orbitStage = document.querySelector('.orbit-stage');
|
|
66
|
+
let raf = null;
|
|
67
|
+
const onPar = () => {
|
|
68
|
+
if (raf) return;
|
|
69
|
+
raf = requestAnimationFrame(() => {
|
|
70
|
+
const y = window.scrollY;
|
|
71
|
+
if (stage) stage.style.transform = `translateY(${Math.min(y, 500) * -0.028}px)`;
|
|
72
|
+
if (orbitStage) orbitStage.style.transform = `translateY(${Math.min(y, 400) * -0.015}px)`;
|
|
73
|
+
raf = null;
|
|
74
|
+
});
|
|
75
|
+
};
|
|
76
|
+
window.addEventListener('scroll', onPar, { passive: true });
|
|
77
|
+
})();
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "neoagent",
|
|
3
|
-
"version": "2.4.1",
|
|
3
|
+
"version": "2.4.2-beta.1",
|
|
4
4
|
"description": "Proactive personal AI agent with no limits",
|
|
5
5
|
"license": "AGPL-3.0-only",
|
|
6
6
|
"main": "server/index.js",
|
|
@@ -18,6 +18,7 @@
|
|
|
18
18
|
"extensions",
|
|
19
19
|
"flutter_app",
|
|
20
20
|
"docs",
|
|
21
|
+
"landing",
|
|
21
22
|
"com.neoagent.plist",
|
|
22
23
|
"LICENSE",
|
|
23
24
|
"README.md",
|
|
@@ -1 +1 @@
|
|
|
1
|
-
|
|
1
|
+
51db7b9df84b3e5c1c7c8099ea37acf8
|
|
@@ -37,6 +37,6 @@ _flutter.buildConfig = {"engineRevision":"c416acfeb8126e097f758c664aaa3da929e27d
|
|
|
37
37
|
|
|
38
38
|
_flutter.loader.load({
|
|
39
39
|
serviceWorkerSettings: {
|
|
40
|
-
serviceWorkerVersion: "
|
|
40
|
+
serviceWorkerVersion: "2675250729" /* Flutter's service worker is deprecated and will be removed in a future Flutter release. */
|
|
41
41
|
}
|
|
42
42
|
});
|