neoagent 2.3.1-beta.67 → 2.3.1-beta.68

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/.env.example CHANGED
@@ -4,7 +4,8 @@
4
4
 
5
5
  PORT=3333
6
6
  NODE_ENV=production
7
- SESSION_SECRET=change-this-to-a-random-secret-in-production
7
+ # Auto-generated on first start or setup if left blank.
8
+ SESSION_SECRET=
8
9
 
9
10
  # Optional: dedicated key for encrypting local at-rest secrets (for example API_KEYS.json).
10
11
  # If unset, encryption falls back to SESSION_SECRET.
@@ -23,7 +24,7 @@ NEOAGENT_DEPLOYMENT_MODE=self_hosted
23
24
  # Deployment profile:
24
25
  # private -> single-user / trusted host runtime
25
26
  # prod -> multi-user / isolated per-user VM runtime
26
- NEOAGENT_PROFILE=private
27
+ NEOAGENT_PROFILE=prod
27
28
 
28
29
  # VM runtime settings used by `prod`.
29
30
  # Set these before switching NEOAGENT_PROFILE=prod.
@@ -38,9 +39,8 @@ NEOAGENT_VM_BASE_IMAGE=
38
39
 
39
40
  # The guest image must boot a Linux guest that runs `npm run start:guest-agent`
40
41
  # and exposes the guest agent on port 8421.
41
- # Replace this placeholder before using NEOAGENT_PROFILE=prod.
42
- # Example: openssl rand -hex 32
43
- NEOAGENT_VM_GUEST_TOKEN=change-this-guest-token-before-prod
42
+ # Auto-generated on first start or setup if left blank.
43
+ NEOAGENT_VM_GUEST_TOKEN=
44
44
  NEOAGENT_VM_MEMORY_MB=4096
45
45
  NEOAGENT_VM_CPUS=2
46
46
 
package/lib/manager.js CHANGED
@@ -18,6 +18,7 @@ const {
18
18
  LOG_DIR,
19
19
  ENV_FILE,
20
20
  PID_FILE,
21
+ getDefaultVmBaseImageUrl,
21
22
  ensureRuntimeDirs,
22
23
  migrateLegacyRuntime
23
24
  } = require('../runtime/paths');
@@ -425,6 +426,7 @@ async function cmdSetup() {
425
426
  ensureRuntimeDirs();
426
427
 
427
428
  const current = Object.fromEntries(parseEnv(readEnvFileRaw()).entries());
429
+ const defaultVmBaseImageUrl = getDefaultVmBaseImageUrl();
428
430
 
429
431
  logInfo('Press Enter to keep the current value shown in brackets.');
430
432
 
@@ -436,7 +438,7 @@ async function cmdSetup() {
436
438
  const secureCookies = await ask('Secure cookies (true/false)', secureCookiesDefault);
437
439
  const trustProxyDefault = current.TRUST_PROXY || secureCookiesDefault;
438
440
  const trustProxy = await ask('Trust reverse proxy headers (true/false)', trustProxyDefault);
439
- const sessionSecret = await askSecret('Session secret', current.SESSION_SECRET || randomSecret());
441
+ const sessionSecret = current.SESSION_SECRET || randomSecret();
440
442
  const deploymentMode = await ask(
441
443
  'Deployment mode (self_hosted/managed)',
442
444
  current.NEOAGENT_DEPLOYMENT_MODE || 'self_hosted'
@@ -446,6 +448,11 @@ async function cmdSetup() {
446
448
  current.NEOAGENT_RELEASE_CHANNEL || 'stable'
447
449
  );
448
450
  const origins = await ask('Allowed CORS origins', current.ALLOWED_ORIGINS || '');
451
+ const deploymentProfile = current.NEOAGENT_PROFILE || 'prod';
452
+ const vmBaseImageUrl = current.NEOAGENT_VM_BASE_IMAGE_URL || defaultVmBaseImageUrl;
453
+ const vmMemoryMb = current.NEOAGENT_VM_MEMORY_MB || '4096';
454
+ const vmCpus = current.NEOAGENT_VM_CPUS || '2';
455
+ const vmGuestToken = current.NEOAGENT_VM_GUEST_TOKEN || randomSecret();
449
456
 
450
457
  heading('AI Providers');
451
458
  const anthropic = await askSecret('Anthropic API key', current.ANTHROPIC_API_KEY || '');
@@ -562,8 +569,13 @@ async function cmdSetup() {
562
569
  `SECURE_COOKIES=${normalizedSecureCookies}`,
563
570
  `TRUST_PROXY=${normalizedTrustProxy}`,
564
571
  `SESSION_SECRET=${sessionSecret}`,
572
+ `NEOAGENT_PROFILE=${deploymentProfile}`,
565
573
  `NEOAGENT_DEPLOYMENT_MODE=${normalizedDeploymentMode}`,
566
574
  `NEOAGENT_RELEASE_CHANNEL=${normalizedReleaseChannel}`,
575
+ `NEOAGENT_VM_BASE_IMAGE_URL=${vmBaseImageUrl}`,
576
+ `NEOAGENT_VM_MEMORY_MB=${vmMemoryMb}`,
577
+ `NEOAGENT_VM_CPUS=${vmCpus}`,
578
+ `NEOAGENT_VM_GUEST_TOKEN=${vmGuestToken}`,
567
579
  anthropic ? `ANTHROPIC_API_KEY=${anthropic}` : '',
568
580
  anthropicBaseUrl ? `ANTHROPIC_BASE_URL=${anthropicBaseUrl}` : '',
569
581
  openai ? `OPENAI_API_KEY=${openai}` : '',
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "neoagent",
3
- "version": "2.3.1-beta.67",
3
+ "version": "2.3.1-beta.68",
4
4
  "description": "Proactive personal AI agent with no limits",
5
5
  "license": "MIT",
6
6
  "main": "server/index.js",
package/runtime/paths.js CHANGED
@@ -17,6 +17,10 @@ const PID_FILE = path.join(DATA_DIR, 'neoagent.pid');
17
17
  const LEGACY_ENV_FILE = path.join(APP_DIR, '.env');
18
18
  const LEGACY_DATA_DIR = path.join(APP_DIR, 'data');
19
19
  const LEGACY_AGENT_DATA_DIR = path.join(APP_DIR, 'agent-data');
20
+ const DEFAULT_VM_BASE_IMAGE_URLS = Object.freeze({
21
+ arm64: 'https://cloud-images.ubuntu.com/releases/24.04/release/ubuntu-24.04-server-cloudimg-arm64.img',
22
+ x64: 'https://cloud-images.ubuntu.com/releases/24.04/release/ubuntu-24.04-server-cloudimg-amd64.img',
23
+ });
20
24
 
21
25
  function ensureRuntimeDirs() {
22
26
  for (const dir of [RUNTIME_HOME, DATA_DIR, LOG_DIR, AGENT_DATA_DIR]) {
@@ -131,6 +135,10 @@ function generateSecret(bytes = 32) {
131
135
  return crypto.randomBytes(bytes).toString('hex');
132
136
  }
133
137
 
138
+ function getDefaultVmBaseImageUrl(arch = process.arch) {
139
+ return arch === 'arm64' ? DEFAULT_VM_BASE_IMAGE_URLS.arm64 : DEFAULT_VM_BASE_IMAGE_URLS.x64;
140
+ }
141
+
134
142
  function isPlaceholderValue(value, placeholders) {
135
143
  const secret = String(value || '').trim();
136
144
  return !secret || placeholders.has(secret);
@@ -149,12 +157,45 @@ function ensureSecureRuntimeEnv({ envFile = ENV_FILE, env = process.env, logger
149
157
  const raw = readEnvFileRaw(envFile);
150
158
  const parsed = parseEnv(raw);
151
159
  const changes = [];
160
+ const defaultProfile = 'prod';
152
161
  const sessionPlaceholders = new Set([
153
162
  'neoagent-dev-secret-change-me',
154
163
  'change-this-to-a-random-secret-in-production',
155
164
  'change-me-to-something-random',
156
165
  ]);
157
166
 
167
+ let deploymentProfile = String(env.NEOAGENT_PROFILE || parsed.get('NEOAGENT_PROFILE') || '').trim();
168
+ if (!deploymentProfile) {
169
+ deploymentProfile = defaultProfile;
170
+ env.NEOAGENT_PROFILE = deploymentProfile;
171
+ upsertEnvValue(envFile, 'NEOAGENT_PROFILE', deploymentProfile);
172
+ changes.push('NEOAGENT_PROFILE');
173
+ }
174
+
175
+ let vmBaseImageUrl = String(env.NEOAGENT_VM_BASE_IMAGE_URL || parsed.get('NEOAGENT_VM_BASE_IMAGE_URL') || '').trim();
176
+ if (!vmBaseImageUrl) {
177
+ vmBaseImageUrl = getDefaultVmBaseImageUrl();
178
+ env.NEOAGENT_VM_BASE_IMAGE_URL = vmBaseImageUrl;
179
+ upsertEnvValue(envFile, 'NEOAGENT_VM_BASE_IMAGE_URL', vmBaseImageUrl);
180
+ changes.push('NEOAGENT_VM_BASE_IMAGE_URL');
181
+ }
182
+
183
+ let vmMemoryMb = String(env.NEOAGENT_VM_MEMORY_MB || parsed.get('NEOAGENT_VM_MEMORY_MB') || '').trim();
184
+ if (!vmMemoryMb) {
185
+ vmMemoryMb = '4096';
186
+ env.NEOAGENT_VM_MEMORY_MB = vmMemoryMb;
187
+ upsertEnvValue(envFile, 'NEOAGENT_VM_MEMORY_MB', vmMemoryMb);
188
+ changes.push('NEOAGENT_VM_MEMORY_MB');
189
+ }
190
+
191
+ let vmCpus = String(env.NEOAGENT_VM_CPUS || parsed.get('NEOAGENT_VM_CPUS') || '').trim();
192
+ if (!vmCpus) {
193
+ vmCpus = '2';
194
+ env.NEOAGENT_VM_CPUS = vmCpus;
195
+ upsertEnvValue(envFile, 'NEOAGENT_VM_CPUS', vmCpus);
196
+ changes.push('NEOAGENT_VM_CPUS');
197
+ }
198
+
158
199
  let sessionSecret = String(env.SESSION_SECRET || parsed.get('SESSION_SECRET') || '').trim();
159
200
  if (isPlaceholderValue(sessionSecret, sessionPlaceholders)) {
160
201
  sessionSecret = generateSecret(32);
@@ -172,7 +213,7 @@ function ensureSecureRuntimeEnv({ envFile = ENV_FILE, env = process.env, logger
172
213
  }
173
214
 
174
215
  if (changes.length > 0 && logger) {
175
- const message = `Initialized secure runtime secrets: ${changes.join(', ')}`;
216
+ const message = `Initialized runtime defaults: ${changes.join(', ')}`;
176
217
  if (typeof logger.info === 'function') {
177
218
  logger.info(message);
178
219
  } else if (typeof logger.log === 'function') {
@@ -200,7 +241,9 @@ module.exports = {
200
241
  LEGACY_ENV_FILE,
201
242
  LEGACY_DATA_DIR,
202
243
  LEGACY_AGENT_DATA_DIR,
244
+ DEFAULT_VM_BASE_IMAGE_URLS,
203
245
  ensureRuntimeDirs,
204
246
  ensureSecureRuntimeEnv,
247
+ getDefaultVmBaseImageUrl,
205
248
  migrateLegacyRuntime
206
249
  };
@@ -1 +1 @@
1
- d4a028d4f0ac72510e406325f227aae2
1
+ 2cdc5aa958700a8fae243c563d18825d
@@ -37,6 +37,6 @@ _flutter.buildConfig = {"engineRevision":"42d3d75a56efe1a2e9902f52dc8006099c45d9
37
37
 
38
38
  _flutter.loader.load({
39
39
  serviceWorkerSettings: {
40
- serviceWorkerVersion: "889725162" /* Flutter's service worker is deprecated and will be removed in a future Flutter release. */
40
+ serviceWorkerVersion: "1009655341" /* Flutter's service worker is deprecated and will be removed in a future Flutter release. */
41
41
  }
42
42
  });
@@ -127230,7 +127230,7 @@ r===$&&A.b()
127230
127230
  o.push(A.id(p,A.iS(!1,new A.a3(B.tE,A.dZ(new A.cU(B.h8,new A.a5p(r,p),p),p,p),p),!1,B.I,!0),p,p,0,0,0,p))}r=!1
127231
127231
  if(!s.ay)if(!s.ch){r=s.e
127232
127232
  r===$&&A.b()
127233
- r=B.b.A("mp0we32e-3c36f1d").length!==0&&r.b}if(r){r=s.d
127233
+ r=B.b.A("mp0wqm0n-9104fe4").length!==0&&r.b}if(r){r=s.d
127234
127234
  r===$&&A.b()
127235
127235
  r=r.V&&!r.a0?84:0
127236
127236
  q=s.e
@@ -131894,7 +131894,7 @@ $S:324}
131894
131894
  A.Y0.prototype={}
131895
131895
  A.R0.prototype={
131896
131896
  mJ(a){var s=this
131897
- if(B.b.A("mp0we32e-3c36f1d").length===0||s.a!=null)return
131897
+ if(B.b.A("mp0wqm0n-9104fe4").length===0||s.a!=null)return
131898
131898
  s.zY()
131899
131899
  s.a=A.pN(B.Pr,new A.b3g(s))},
131900
131900
  zY(){var s=0,r=A.l(t.H),q,p=2,o=[],n=this,m,l,k,j,i,h,g,f
@@ -131912,7 +131912,7 @@ if(!t.f.b(k)){s=1
131912
131912
  break}i=J.Z(k,"buildId")
131913
131913
  h=i==null?null:B.b.A(J.r(i))
131914
131914
  j=h==null?"":h
131915
- if(J.bi(j)===0||J.c(j,"mp0we32e-3c36f1d")){s=1
131915
+ if(J.bi(j)===0||J.c(j,"mp0wqm0n-9104fe4")){s=1
131916
131916
  break}n.b=!0
131917
131917
  n.J()
131918
131918
  p=2
@@ -131929,7 +131929,7 @@ case 2:return A.i(o.at(-1),r)}})
131929
131929
  return A.k($async$zY,r)},
131930
131930
  v_(){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
131931
131931
  var $async$v_=A.h(function(a2,a3){if(a2===1){o.push(a3)
131932
- s=p}for(;;)switch(s){case 0:if(B.b.A("mp0we32e-3c36f1d").length===0||n.c){s=1
131932
+ s=p}for(;;)switch(s){case 0:if(B.b.A("mp0wqm0n-9104fe4").length===0||n.c){s=1
131933
131933
  break}n.c=!0
131934
131934
  n.J()
131935
131935
  p=4