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.
@@ -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.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
- dcad55b6198b066ebc14a3b7bb789972
1
+ fffcffcece223938c04c1b5ec10b61c5
@@ -37,6 +37,6 @@ _flutter.buildConfig = {"engineRevision":"c416acfeb8126e097f758c664aaa3da929e27d
37
37
 
38
38
  _flutter.loader.load({
39
39
  serviceWorkerSettings: {
40
- serviceWorkerVersion: "141262336" /* Flutter's service worker is deprecated and will be removed in a future Flutter release. */
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("mq74dagq-4d5f92d").length!==0&&r.b}if(r){r=s.d
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("mq74dagq-4d5f92d").length===0||s.a!=null)return
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,"mq74dagq-4d5f92d")){s=1
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("mq74dagq-4d5f92d").length===0||n.c){s=1
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
@@ -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
  }