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 +5 -5
- package/lib/manager.js +13 -1
- package/package.json +1 -1
- package/runtime/paths.js +44 -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/.env.example
CHANGED
|
@@ -4,7 +4,8 @@
|
|
|
4
4
|
|
|
5
5
|
PORT=3333
|
|
6
6
|
NODE_ENV=production
|
|
7
|
-
|
|
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=
|
|
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
|
-
#
|
|
42
|
-
|
|
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 =
|
|
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
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
|
|
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
|
-
|
|
1
|
+
2cdc5aa958700a8fae243c563d18825d
|
|
@@ -37,6 +37,6 @@ _flutter.buildConfig = {"engineRevision":"42d3d75a56efe1a2e9902f52dc8006099c45d9
|
|
|
37
37
|
|
|
38
38
|
_flutter.loader.load({
|
|
39
39
|
serviceWorkerSettings: {
|
|
40
|
-
serviceWorkerVersion: "
|
|
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("
|
|
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("
|
|
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,"
|
|
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("
|
|
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
|