neoagent 2.4.1 → 2.4.2-beta.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/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 +4 -4
- package/server/routes/admin.js +1 -4
|
@@ -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.
|
|
3
|
+
"version": "2.4.2-beta.0",
|
|
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
|
+
fffcffcece223938c04c1b5ec10b61c5
|
|
@@ -37,6 +37,6 @@ _flutter.buildConfig = {"engineRevision":"c416acfeb8126e097f758c664aaa3da929e27d
|
|
|
37
37
|
|
|
38
38
|
_flutter.loader.load({
|
|
39
39
|
serviceWorkerSettings: {
|
|
40
|
-
serviceWorkerVersion: "
|
|
40
|
+
serviceWorkerVersion: "248735873" /* Flutter's service worker is deprecated and will be removed in a future Flutter release. */
|
|
41
41
|
}
|
|
42
42
|
});
|
|
@@ -133824,7 +133824,7 @@ r===$&&A.b()
|
|
|
133824
133824
|
o.push(A.j4(p,A.j8(!1,new A.a3(B.up,A.dl(new A.cv(B.hr,new A.a7p(r,p),p),p,p),p),!1,B.I,!0),p,p,0,0,0,p))}r=!1
|
|
133825
133825
|
if(!s.ay)if(!s.ch){r=s.e
|
|
133826
133826
|
r===$&&A.b()
|
|
133827
|
-
r=B.b.t("
|
|
133827
|
+
r=B.b.t("mq76f7c9-5fdf6f8").length!==0&&r.b}if(r){r=s.d
|
|
133828
133828
|
r===$&&A.b()
|
|
133829
133829
|
r=r.au&&!r.aQ?84:0
|
|
133830
133830
|
q=s.e
|
|
@@ -139266,7 +139266,7 @@ $S:0}
|
|
|
139266
139266
|
A.ZM.prototype={}
|
|
139267
139267
|
A.Sw.prototype={
|
|
139268
139268
|
n9(a){var s=this
|
|
139269
|
-
if(B.b.t("
|
|
139269
|
+
if(B.b.t("mq76f7c9-5fdf6f8").length===0||s.a!=null)return
|
|
139270
139270
|
s.AN()
|
|
139271
139271
|
s.a=A.qh(B.Rb,new A.bas(s))},
|
|
139272
139272
|
AN(){var s=0,r=A.l(t.H),q,p=2,o=[],n=this,m,l,k,j,i,h,g,f
|
|
@@ -139284,7 +139284,7 @@ if(!t.f.b(k)){s=1
|
|
|
139284
139284
|
break}i=J.a_(k,"buildId")
|
|
139285
139285
|
h=i==null?null:B.b.t(J.p(i))
|
|
139286
139286
|
j=h==null?"":h
|
|
139287
|
-
if(J.bf(j)===0||J.d(j,"
|
|
139287
|
+
if(J.bf(j)===0||J.d(j,"mq76f7c9-5fdf6f8")){s=1
|
|
139288
139288
|
break}n.b=!0
|
|
139289
139289
|
n.E()
|
|
139290
139290
|
p=2
|
|
@@ -139301,7 +139301,7 @@ case 2:return A.i(o.at(-1),r)}})
|
|
|
139301
139301
|
return A.k($async$AN,r)},
|
|
139302
139302
|
vw(){var s=0,r=A.l(t.H),q,p=2,o=[],n=this,m,l,k,j,i,h,g,f,e,d,c,b,a,a0,a1
|
|
139303
139303
|
var $async$vw=A.h(function(a2,a3){if(a2===1){o.push(a3)
|
|
139304
|
-
s=p}for(;;)switch(s){case 0:if(B.b.t("
|
|
139304
|
+
s=p}for(;;)switch(s){case 0:if(B.b.t("mq76f7c9-5fdf6f8").length===0||n.c){s=1
|
|
139305
139305
|
break}n.c=!0
|
|
139306
139306
|
n.E()
|
|
139307
139307
|
p=4
|
package/server/routes/admin.js
CHANGED
|
@@ -64,10 +64,7 @@ router.get('/login', (req, res) => {
|
|
|
64
64
|
router.post('/api/login', loginLimiter, express.json(), async (req, res) => {
|
|
65
65
|
const { username, password } = req.body || {};
|
|
66
66
|
const expectedUsername = process.env.ADMIN_USERNAME || 'admin';
|
|
67
|
-
const expectedPassword = process.env.ADMIN_PASSWORD || '';
|
|
68
|
-
if (!expectedPassword) {
|
|
69
|
-
return res.status(503).json({ error: 'Admin credentials not configured. Run `neoagent setup`.' });
|
|
70
|
-
}
|
|
67
|
+
const expectedPassword = process.env.ADMIN_PASSWORD || 'admin';
|
|
71
68
|
if (username !== expectedUsername || password !== expectedPassword) {
|
|
72
69
|
return res.status(401).json({ error: 'Invalid credentials' });
|
|
73
70
|
}
|