@overlordai/cli 1.0.52 → 1.0.54
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/dist/commands/doctor.d.ts.map +1 -1
- package/dist/commands/doctor.js +33 -53
- package/dist/commands/doctor.js.map +1 -1
- package/dist/commands/fetch-json.d.ts +2 -0
- package/dist/commands/fetch-json.d.ts.map +1 -0
- package/dist/commands/fetch-json.js +18 -0
- package/dist/commands/fetch-json.js.map +1 -0
- package/dist/commands/logs.d.ts.map +1 -1
- package/dist/commands/logs.js +3 -1
- package/dist/commands/logs.js.map +1 -1
- package/dist/commands/setup-worker.d.ts.map +1 -1
- package/dist/commands/setup-worker.js +16 -15
- package/dist/commands/setup-worker.js.map +1 -1
- package/dist/commands/start.d.ts.map +1 -1
- package/dist/commands/start.js +32 -49
- package/dist/commands/start.js.map +1 -1
- package/dist/commands/status.d.ts.map +1 -1
- package/dist/commands/status.js +4 -31
- package/dist/commands/status.js.map +1 -1
- package/dist/commands/stop.d.ts.map +1 -1
- package/dist/commands/stop.js +7 -13
- package/dist/commands/stop.js.map +1 -1
- package/dist/commands/uninstall.d.ts +2 -0
- package/dist/commands/uninstall.d.ts.map +1 -0
- package/dist/commands/uninstall.js +63 -0
- package/dist/commands/uninstall.js.map +1 -0
- package/dist/commands/upgrade.d.ts.map +1 -1
- package/dist/commands/upgrade.js +3 -24
- package/dist/commands/upgrade.js.map +1 -1
- package/dist/installer/admin-creator.d.ts +0 -9
- package/dist/installer/admin-creator.d.ts.map +1 -1
- package/dist/installer/admin-creator.js +9 -12
- package/dist/installer/admin-creator.js.map +1 -1
- package/dist/installer/config-writer.d.ts +0 -11
- package/dist/installer/config-writer.d.ts.map +1 -1
- package/dist/installer/config-writer.js +13 -33
- package/dist/installer/config-writer.js.map +1 -1
- package/dist/installer/db-initializer.d.ts +0 -13
- package/dist/installer/db-initializer.d.ts.map +1 -1
- package/dist/installer/db-initializer.js +6 -25
- package/dist/installer/db-initializer.js.map +1 -1
- package/dist/installer/env-checker.d.ts +0 -27
- package/dist/installer/env-checker.d.ts.map +1 -1
- package/dist/installer/env-checker.js +10 -37
- package/dist/installer/env-checker.js.map +1 -1
- package/dist/installer/secret-gen.d.ts +0 -15
- package/dist/installer/secret-gen.d.ts.map +1 -1
- package/dist/installer/secret-gen.js +6 -24
- package/dist/installer/secret-gen.js.map +1 -1
- package/dist/installer/wizard.d.ts +0 -4
- package/dist/installer/wizard.d.ts.map +1 -1
- package/dist/installer/wizard.js +39 -35
- package/dist/installer/wizard.js.map +1 -1
- package/dist/main.js +22 -25
- package/dist/main.js.map +1 -1
- package/dist/service-manager.d.ts +1 -9
- package/dist/service-manager.d.ts.map +1 -1
- package/dist/service-manager.js +53 -98
- package/dist/service-manager.js.map +1 -1
- package/package.json +2 -2
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"uninstall.d.ts","sourceRoot":"","sources":["../../src/commands/uninstall.ts"],"names":[],"mappings":"AASA,wBAAsB,gBAAgB,IAAI,OAAO,CAAC,IAAI,CAAC,CAgEtD"}
|
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
import * as p from '@clack/prompts';
|
|
2
|
+
import * as fs from 'node:fs';
|
|
3
|
+
import * as path from 'node:path';
|
|
4
|
+
import * as os from 'node:os';
|
|
5
|
+
import chalk from 'chalk';
|
|
6
|
+
import { ServiceManager } from '../service-manager.js';
|
|
7
|
+
const SERVICES = ['overlord-server', 'overlord-worker'];
|
|
8
|
+
export async function uninstallCommand() {
|
|
9
|
+
p.intro(chalk.bold('Overlord Uninstall'));
|
|
10
|
+
const installDir = path.join(os.homedir(), '.overlord');
|
|
11
|
+
const workerDir = path.join(os.homedir(), '.overlord-worker');
|
|
12
|
+
const sm = new ServiceManager();
|
|
13
|
+
// Show what will be removed
|
|
14
|
+
const items = [];
|
|
15
|
+
for (const svc of SERVICES) {
|
|
16
|
+
if (sm.isInstalled(svc))
|
|
17
|
+
items.push(`Service: ${svc}`);
|
|
18
|
+
}
|
|
19
|
+
if (fs.existsSync(installDir))
|
|
20
|
+
items.push(`Directory: ${installDir}`);
|
|
21
|
+
if (fs.existsSync(workerDir))
|
|
22
|
+
items.push(`Directory: ${workerDir}`);
|
|
23
|
+
if (items.length === 0) {
|
|
24
|
+
p.log.info('Nothing to uninstall — Overlord is not installed on this system.');
|
|
25
|
+
p.outro('Done.');
|
|
26
|
+
return;
|
|
27
|
+
}
|
|
28
|
+
p.note(items.join('\n'), 'The following will be removed');
|
|
29
|
+
const confirm = await p.confirm({
|
|
30
|
+
message: 'This will stop all services and delete all data (database, config, logs). Continue?',
|
|
31
|
+
initialValue: false,
|
|
32
|
+
});
|
|
33
|
+
if (p.isCancel(confirm) || !confirm) {
|
|
34
|
+
p.cancel('Uninstall cancelled.');
|
|
35
|
+
return;
|
|
36
|
+
}
|
|
37
|
+
// 1. Stop and uninstall services
|
|
38
|
+
for (const svc of SERVICES) {
|
|
39
|
+
if (sm.isInstalled(svc)) {
|
|
40
|
+
const s = p.spinner();
|
|
41
|
+
s.start(`Removing service ${svc}...`);
|
|
42
|
+
sm.uninstall(svc);
|
|
43
|
+
s.stop(`${svc} removed`);
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
// 2. Remove data directories
|
|
47
|
+
if (fs.existsSync(installDir)) {
|
|
48
|
+
const s = p.spinner();
|
|
49
|
+
s.start(`Removing ${installDir}...`);
|
|
50
|
+
fs.rmSync(installDir, { recursive: true, force: true });
|
|
51
|
+
s.stop(`${installDir} removed`);
|
|
52
|
+
}
|
|
53
|
+
if (fs.existsSync(workerDir)) {
|
|
54
|
+
const s = p.spinner();
|
|
55
|
+
s.start(`Removing ${workerDir}...`);
|
|
56
|
+
fs.rmSync(workerDir, { recursive: true, force: true });
|
|
57
|
+
s.stop(`${workerDir} removed`);
|
|
58
|
+
}
|
|
59
|
+
p.note('Overlord has been completely removed from this system.\n' +
|
|
60
|
+
'To reinstall, run: ' + chalk.cyan('overlord install'), 'Uninstall Complete');
|
|
61
|
+
p.outro(chalk.green('Done.'));
|
|
62
|
+
}
|
|
63
|
+
//# sourceMappingURL=uninstall.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"uninstall.js","sourceRoot":"","sources":["../../src/commands/uninstall.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"upgrade.d.ts","sourceRoot":"","sources":["../../src/commands/upgrade.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"upgrade.d.ts","sourceRoot":"","sources":["../../src/commands/upgrade.ts"],"names":[],"mappings":"AAmBA,wBAAsB,cAAc,IAAI,OAAO,CAAC,IAAI,CAAC,CA0DpD"}
|
package/dist/commands/upgrade.js
CHANGED
|
@@ -1,30 +1,9 @@
|
|
|
1
1
|
import chalk from 'chalk';
|
|
2
2
|
import { createRequire } from 'node:module';
|
|
3
|
-
import * as https from 'node:https';
|
|
4
3
|
import { execFileSync } from 'node:child_process';
|
|
5
4
|
import { ServiceManager } from '../service-manager.js';
|
|
5
|
+
import { getErrorMessage, httpsGet } from '@overlordai/protocol';
|
|
6
6
|
const require = createRequire(import.meta.url);
|
|
7
|
-
function httpsGet(url) {
|
|
8
|
-
return new Promise((resolve, reject) => {
|
|
9
|
-
const request = https.get(url, { headers: { 'User-Agent': 'overlord-cli' } }, (res) => {
|
|
10
|
-
if (res.statusCode === 301 || res.statusCode === 302) {
|
|
11
|
-
const redirectUrl = res.headers.location;
|
|
12
|
-
if (redirectUrl) {
|
|
13
|
-
httpsGet(redirectUrl).then(resolve, reject);
|
|
14
|
-
return;
|
|
15
|
-
}
|
|
16
|
-
}
|
|
17
|
-
if (res.statusCode !== 200) {
|
|
18
|
-
reject(new Error(`HTTP ${res.statusCode}`));
|
|
19
|
-
return;
|
|
20
|
-
}
|
|
21
|
-
let data = '';
|
|
22
|
-
res.on('data', (chunk) => { data += chunk.toString(); });
|
|
23
|
-
res.on('end', () => resolve(data));
|
|
24
|
-
});
|
|
25
|
-
request.on('error', reject);
|
|
26
|
-
});
|
|
27
|
-
}
|
|
28
7
|
async function fetchLatestVersion(packageName) {
|
|
29
8
|
const url = `https://registry.npmjs.org/${encodeURIComponent(packageName)}`;
|
|
30
9
|
const body = await httpsGet(url);
|
|
@@ -42,7 +21,7 @@ export async function upgradeCommand() {
|
|
|
42
21
|
latestVersion = await fetchLatestVersion('@overlordai/cli');
|
|
43
22
|
}
|
|
44
23
|
catch (err) {
|
|
45
|
-
console.error(chalk.red(`Failed to check for updates: ${
|
|
24
|
+
console.error(chalk.red(`Failed to check for updates: ${getErrorMessage(err)}`));
|
|
46
25
|
process.exit(1);
|
|
47
26
|
}
|
|
48
27
|
console.log(`Latest version: ${chalk.cyan(latestVersion)}`);
|
|
@@ -64,7 +43,7 @@ export async function upgradeCommand() {
|
|
|
64
43
|
execFileSync('npm', args, { stdio: 'inherit' });
|
|
65
44
|
}
|
|
66
45
|
catch (err) {
|
|
67
|
-
console.error(chalk.red(`\nFailed to install packages: ${
|
|
46
|
+
console.error(chalk.red(`\nFailed to install packages: ${getErrorMessage(err)}`));
|
|
68
47
|
console.log(chalk.yellow('You can try manually: npm install -g @overlordai/cli@latest'));
|
|
69
48
|
process.exit(1);
|
|
70
49
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"upgrade.js","sourceRoot":"","sources":["../../src/commands/upgrade.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAC5C,OAAO,
|
|
1
|
+
{"version":3,"file":"upgrade.js","sourceRoot":"","sources":["../../src/commands/upgrade.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAC5C,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAClD,OAAO,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AAEvD,OAAO,EAAE,eAAe,EAAE,QAAQ,EAAE,MAAM,sBAAsB,CAAC;AACjE,MAAM,OAAO,GAAG,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;AAM/C,KAAK,UAAU,kBAAkB,CAAC,WAAmB;IACnD,MAAM,GAAG,GAAG,8BAA8B,kBAAkB,CAAC,WAAW,CAAC,EAAE,CAAC;IAC5E,MAAM,IAAI,GAAG,MAAM,QAAQ,CAAC,GAAG,CAAC,CAAC;IACjC,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAoB,CAAC;IACjD,OAAO,IAAI,CAAC,WAAW,CAAC,CAAC,MAAM,CAAC;AAClC,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,cAAc;IAClC,MAAM,EAAE,GAAG,IAAI,cAAc,EAAE,CAAC;IAChC,MAAM,EAAE,OAAO,EAAE,cAAc,EAAE,GAAG,OAAO,CAAC,oBAAoB,CAAC,CAAC;IAElE,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,yBAAyB,CAAC,CAAC,CAAC;IACnD,OAAO,CAAC,GAAG,CAAC,oBAAoB,KAAK,CAAC,IAAI,CAAC,cAAc,CAAC,EAAE,CAAC,CAAC;IAE9D,yCAAyC;IACzC,IAAI,aAAqB,CAAC;IAC1B,IAAI,CAAC;QACH,aAAa,GAAG,MAAM,kBAAkB,CAAC,iBAAiB,CAAC,CAAC;IAC9D,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,gCAAgC,eAAe,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC;QACjF,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;IAED,OAAO,CAAC,GAAG,CAAC,oBAAoB,KAAK,CAAC,IAAI,CAAC,aAAa,CAAC,EAAE,CAAC,CAAC;IAE7D,IAAI,cAAc,KAAK,aAAa,EAAE,CAAC;QACrC,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,uBAAuB,CAAC,CAAC,CAAC;QAClD,OAAO;IACT,CAAC;IAED,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,oBAAoB,cAAc,OAAO,aAAa,KAAK,CAAC,CAAC,CAAC;IAErF,wCAAwC;IACxC,MAAM,QAAQ,GAAG;QACf,iBAAiB;QACjB,oBAAoB;QACpB,oBAAoB;QACpB,2BAA2B;KAC5B,CAAC;IAEF,IAAI,CAAC;QACH,MAAM,IAAI,GAAG,CAAC,SAAS,EAAE,IAAI,EAAE,iBAAiB,EAAE,GAAG,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,GAAG,CAAC,IAAI,aAAa,EAAE,CAAC,CAAC,CAAC;QACjG,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,SAAS,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC;QAClD,YAAY,CAAC,KAAK,EAAE,IAAI,EAAE,EAAE,KAAK,EAAE,SAAS,EAAE,CAAC,CAAC;IAClD,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,iCAAiC,eAAe,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC;QAClF,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC,6DAA6D,CAAC,CAAC,CAAC;QACzF,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;IAED,gCAAgC;IAChC,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,0BAA0B,CAAC,CAAC,CAAC;IACpD,KAAK,MAAM,OAAO,IAAI,CAAC,iBAAiB,EAAE,iBAAiB,CAAU,EAAE,CAAC;QACtE,IAAI,CAAC;YACH,IAAI,EAAE,CAAC,WAAW,CAAC,OAAO,CAAC,EAAE,CAAC;gBAC5B,EAAE,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;gBACpB,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,KAAK,OAAO,YAAY,CAAC,CAAC,CAAC;YACrD,CAAC;QACH,CAAC;QAAC,MAAM,CAAC;YACP,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC,KAAK,OAAO,uBAAuB,CAAC,CAAC,CAAC;QACjE,CAAC;IACH,CAAC;IAED,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,gBAAgB,aAAa,YAAY,CAAC,CAAC,CAAC;IACpE,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,gDAAgD,CAAC,CAAC,CAAC;AAC3E,CAAC"}
|
|
@@ -4,16 +4,7 @@ export interface AdminConfig {
|
|
|
4
4
|
gitName: string;
|
|
5
5
|
gitEmail: string;
|
|
6
6
|
}
|
|
7
|
-
/**
|
|
8
|
-
* Creates the initial admin developer account in the database.
|
|
9
|
-
*/
|
|
10
7
|
export declare class AdminCreator {
|
|
11
|
-
/**
|
|
12
|
-
* Create an admin user in the developers table.
|
|
13
|
-
*
|
|
14
|
-
* @param dbPath - Absolute path to the SQLite database file.
|
|
15
|
-
* @param config - Admin account configuration.
|
|
16
|
-
*/
|
|
17
8
|
create(dbPath: string, config: AdminConfig): Promise<void>;
|
|
18
9
|
}
|
|
19
10
|
//# sourceMappingURL=admin-creator.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"admin-creator.d.ts","sourceRoot":"","sources":["../../src/installer/admin-creator.ts"],"names":[],"mappings":"AAIA,MAAM,WAAW,WAAW;IAC1B,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,EAAE,MAAM,CAAC;IACjB,OAAO,EAAE,MAAM,CAAC;IAChB,QAAQ,EAAE,MAAM,CAAC;CAClB;AAED
|
|
1
|
+
{"version":3,"file":"admin-creator.d.ts","sourceRoot":"","sources":["../../src/installer/admin-creator.ts"],"names":[],"mappings":"AAIA,MAAM,WAAW,WAAW;IAC1B,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,EAAE,MAAM,CAAC;IACjB,OAAO,EAAE,MAAM,CAAC;IAChB,QAAQ,EAAE,MAAM,CAAC;CAClB;AAED,qBAAa,YAAY;IACjB,MAAM,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,WAAW,GAAG,OAAO,CAAC,IAAI,CAAC;CA+BjE"}
|
|
@@ -1,16 +1,7 @@
|
|
|
1
1
|
import Database from 'better-sqlite3';
|
|
2
2
|
import bcrypt from 'bcrypt';
|
|
3
|
-
import { BCRYPT_COST_FACTOR } from '@overlordai/protocol';
|
|
4
|
-
/**
|
|
5
|
-
* Creates the initial admin developer account in the database.
|
|
6
|
-
*/
|
|
3
|
+
import { BCRYPT_COST_FACTOR, getErrorMessage } from '@overlordai/protocol';
|
|
7
4
|
export class AdminCreator {
|
|
8
|
-
/**
|
|
9
|
-
* Create an admin user in the developers table.
|
|
10
|
-
*
|
|
11
|
-
* @param dbPath - Absolute path to the SQLite database file.
|
|
12
|
-
* @param config - Admin account configuration.
|
|
13
|
-
*/
|
|
14
5
|
async create(dbPath, config) {
|
|
15
6
|
const db = new Database(dbPath);
|
|
16
7
|
try {
|
|
@@ -23,8 +14,14 @@ export class AdminCreator {
|
|
|
23
14
|
}
|
|
24
15
|
// Hash password with bcrypt
|
|
25
16
|
const passwordHash = await bcrypt.hash(config.password, BCRYPT_COST_FACTOR);
|
|
26
|
-
|
|
27
|
-
|
|
17
|
+
try {
|
|
18
|
+
db.prepare(`INSERT INTO developers (name, git_name, git_email, password_hash, role, status, platform_uids, created_at)
|
|
19
|
+
VALUES (?, ?, ?, ?, 'admin', 'active', '{}', datetime('now'))`).run(config.username, config.gitName, config.gitEmail, passwordHash);
|
|
20
|
+
}
|
|
21
|
+
catch (err) {
|
|
22
|
+
throw new Error(`Failed to create admin account: ${getErrorMessage(err)}. ` +
|
|
23
|
+
'Ensure database migrations have been run first (overlord install or overlord migrate).');
|
|
24
|
+
}
|
|
28
25
|
}
|
|
29
26
|
finally {
|
|
30
27
|
db.close();
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"admin-creator.js","sourceRoot":"","sources":["../../src/installer/admin-creator.ts"],"names":[],"mappings":"AAAA,OAAO,QAAQ,MAAM,gBAAgB,CAAC;AACtC,OAAO,MAAM,MAAM,QAAQ,CAAC;AAC5B,OAAO,EAAE,kBAAkB,EAAE,MAAM,sBAAsB,CAAC;
|
|
1
|
+
{"version":3,"file":"admin-creator.js","sourceRoot":"","sources":["../../src/installer/admin-creator.ts"],"names":[],"mappings":"AAAA,OAAO,QAAQ,MAAM,gBAAgB,CAAC;AACtC,OAAO,MAAM,MAAM,QAAQ,CAAC;AAC5B,OAAO,EAAE,kBAAkB,EAAE,eAAe,EAAE,MAAM,sBAAsB,CAAC;AAS3E,MAAM,OAAO,YAAY;IACvB,KAAK,CAAC,MAAM,CAAC,MAAc,EAAE,MAAmB;QAC9C,MAAM,EAAE,GAAG,IAAI,QAAQ,CAAC,MAAM,CAAC,CAAC;QAEhC,IAAI,CAAC;YACH,+BAA+B;YAC/B,MAAM,QAAQ,GAAG,EAAE;iBAChB,OAAO,CAAC,0CAA0C,CAAC;iBACnD,GAAG,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;YAExB,IAAI,QAAQ,EAAE,CAAC;gBACb,MAAM,IAAI,KAAK,CAAC,wBAAwB,MAAM,CAAC,QAAQ,kBAAkB,CAAC,CAAC;YAC7E,CAAC;YAED,4BAA4B;YAC5B,MAAM,YAAY,GAAG,MAAM,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,QAAQ,EAAE,kBAAkB,CAAC,CAAC;YAE5E,IAAI,CAAC;gBACH,EAAE,CAAC,OAAO,CACR;yEAC+D,CAChE,CAAC,GAAG,CAAC,MAAM,CAAC,QAAQ,EAAE,MAAM,CAAC,OAAO,EAAE,MAAM,CAAC,QAAQ,EAAE,YAAY,CAAC,CAAC;YACxE,CAAC;YAAC,OAAO,GAAG,EAAE,CAAC;gBACb,MAAM,IAAI,KAAK,CACb,mCAAmC,eAAe,CAAC,GAAG,CAAC,IAAI;oBAC3D,wFAAwF,CACzF,CAAC;YACJ,CAAC;QACH,CAAC;gBAAS,CAAC;YACT,EAAE,CAAC,KAAK,EAAE,CAAC;QACb,CAAC;IACH,CAAC;CACF"}
|
|
@@ -1,16 +1,5 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Writes and manages .env configuration files.
|
|
3
|
-
*/
|
|
4
1
|
export declare class ConfigWriter {
|
|
5
|
-
/**
|
|
6
|
-
* Write a complete .env file with the given key-value pairs.
|
|
7
|
-
* Creates parent directories if needed. Sets file permissions to 600.
|
|
8
|
-
*/
|
|
9
2
|
write(config: Record<string, string>, envPath: string): void;
|
|
10
|
-
/**
|
|
11
|
-
* Append or update a single key in an existing .env file.
|
|
12
|
-
* If the key already exists, it will be updated in place.
|
|
13
|
-
*/
|
|
14
3
|
appendToEnv(key: string, value: string, envPath: string): void;
|
|
15
4
|
}
|
|
16
5
|
//# sourceMappingURL=config-writer.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"config-writer.d.ts","sourceRoot":"","sources":["../../src/installer/config-writer.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"config-writer.d.ts","sourceRoot":"","sources":["../../src/installer/config-writer.ts"],"names":[],"mappings":"AASA,qBAAa,YAAY;IACvB,KAAK,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,EAAE,OAAO,EAAE,MAAM,GAAG,IAAI;IAY5D,WAAW,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,IAAI;CA0B/D"}
|
|
@@ -1,60 +1,40 @@
|
|
|
1
1
|
import * as fs from 'node:fs';
|
|
2
2
|
import * as path from 'node:path';
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
3
|
+
function formatEnvEntry(key, value) {
|
|
4
|
+
const needsQuoting = /[\s#"'\\$`!]/.test(value);
|
|
5
|
+
const escapedValue = needsQuoting ? `"${value.replace(/["\\$`]/g, '\\$&')}"` : value;
|
|
6
|
+
return `${key}=${escapedValue}`;
|
|
7
|
+
}
|
|
6
8
|
export class ConfigWriter {
|
|
7
|
-
/**
|
|
8
|
-
* Write a complete .env file with the given key-value pairs.
|
|
9
|
-
* Creates parent directories if needed. Sets file permissions to 600.
|
|
10
|
-
*/
|
|
11
9
|
write(config, envPath) {
|
|
12
10
|
const dir = path.dirname(envPath);
|
|
13
11
|
if (!fs.existsSync(dir)) {
|
|
14
12
|
fs.mkdirSync(dir, { recursive: true });
|
|
15
13
|
}
|
|
16
|
-
const lines = [];
|
|
17
|
-
for (const [key, value] of Object.entries(config)) {
|
|
18
|
-
// Quote values that contain special characters
|
|
19
|
-
const needsQuoting = /[\s#"'\\$`!]/.test(value);
|
|
20
|
-
const escapedValue = needsQuoting ? `"${value.replace(/["\\$`]/g, '\\$&')}"` : value;
|
|
21
|
-
lines.push(`${key}=${escapedValue}`);
|
|
22
|
-
}
|
|
14
|
+
const lines = Object.entries(config).map(([key, value]) => formatEnvEntry(key, value));
|
|
23
15
|
fs.writeFileSync(envPath, lines.join('\n') + '\n', { encoding: 'utf-8' });
|
|
24
16
|
fs.chmodSync(envPath, 0o600);
|
|
25
17
|
}
|
|
26
|
-
/**
|
|
27
|
-
* Append or update a single key in an existing .env file.
|
|
28
|
-
* If the key already exists, it will be updated in place.
|
|
29
|
-
*/
|
|
30
18
|
appendToEnv(key, value, envPath) {
|
|
31
|
-
const
|
|
32
|
-
const escapedValue = needsQuoting ? `"${value.replace(/["\\$`]/g, '\\$&')}"` : value;
|
|
33
|
-
const newLine = `${key}=${escapedValue}`;
|
|
19
|
+
const newLine = formatEnvEntry(key, value);
|
|
34
20
|
if (!fs.existsSync(envPath)) {
|
|
35
21
|
fs.writeFileSync(envPath, newLine + '\n', { encoding: 'utf-8' });
|
|
36
22
|
fs.chmodSync(envPath, 0o600);
|
|
37
23
|
return;
|
|
38
24
|
}
|
|
39
25
|
const content = fs.readFileSync(envPath, 'utf-8');
|
|
40
|
-
const lines = content.split('\n');
|
|
41
|
-
const regex = new RegExp(`^${key}=`);
|
|
42
26
|
let found = false;
|
|
43
|
-
const updatedLines =
|
|
44
|
-
if (
|
|
27
|
+
const updatedLines = content.split('\n').map((line) => {
|
|
28
|
+
if (line.startsWith(key + '=')) {
|
|
45
29
|
found = true;
|
|
46
30
|
return newLine;
|
|
47
31
|
}
|
|
48
32
|
return line;
|
|
49
33
|
});
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
}
|
|
55
|
-
else {
|
|
56
|
-
fs.writeFileSync(envPath, updatedLines.join('\n') + '\n', { encoding: 'utf-8' });
|
|
57
|
-
}
|
|
34
|
+
const output = found
|
|
35
|
+
? updatedLines.join('\n') + '\n'
|
|
36
|
+
: content.trimEnd() + '\n' + newLine + '\n';
|
|
37
|
+
fs.writeFileSync(envPath, output, { encoding: 'utf-8' });
|
|
58
38
|
fs.chmodSync(envPath, 0o600);
|
|
59
39
|
}
|
|
60
40
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"config-writer.js","sourceRoot":"","sources":["../../src/installer/config-writer.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,SAAS,CAAC;AAC9B,OAAO,KAAK,IAAI,MAAM,WAAW,CAAC;AAElC
|
|
1
|
+
{"version":3,"file":"config-writer.js","sourceRoot":"","sources":["../../src/installer/config-writer.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,SAAS,CAAC;AAC9B,OAAO,KAAK,IAAI,MAAM,WAAW,CAAC;AAElC,SAAS,cAAc,CAAC,GAAW,EAAE,KAAa;IAChD,MAAM,YAAY,GAAG,cAAc,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IAChD,MAAM,YAAY,GAAG,YAAY,CAAC,CAAC,CAAC,IAAI,KAAK,CAAC,OAAO,CAAC,UAAU,EAAE,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,KAAK,CAAC;IACrF,OAAO,GAAG,GAAG,IAAI,YAAY,EAAE,CAAC;AAClC,CAAC;AAED,MAAM,OAAO,YAAY;IACvB,KAAK,CAAC,MAA8B,EAAE,OAAe;QACnD,MAAM,GAAG,GAAG,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;QAClC,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC;YACxB,EAAE,CAAC,SAAS,CAAC,GAAG,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;QACzC,CAAC;QAED,MAAM,KAAK,GAAG,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,EAAE,KAAK,CAAC,EAAE,EAAE,CAAC,cAAc,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC,CAAC;QAEvF,EAAE,CAAC,aAAa,CAAC,OAAO,EAAE,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,IAAI,EAAE,EAAE,QAAQ,EAAE,OAAO,EAAE,CAAC,CAAC;QAC1E,EAAE,CAAC,SAAS,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC;IAC/B,CAAC;IAED,WAAW,CAAC,GAAW,EAAE,KAAa,EAAE,OAAe;QACrD,MAAM,OAAO,GAAG,cAAc,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC;QAE3C,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,OAAO,CAAC,EAAE,CAAC;YAC5B,EAAE,CAAC,aAAa,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,EAAE,EAAE,QAAQ,EAAE,OAAO,EAAE,CAAC,CAAC;YACjE,EAAE,CAAC,SAAS,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC;YAC7B,OAAO;QACT,CAAC;QAED,MAAM,OAAO,GAAG,EAAE,CAAC,YAAY,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;QAClD,IAAI,KAAK,GAAG,KAAK,CAAC;QAClB,MAAM,YAAY,GAAG,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE;YACpD,IAAI,IAAI,CAAC,UAAU,CAAC,GAAG,GAAG,GAAG,CAAC,EAAE,CAAC;gBAC/B,KAAK,GAAG,IAAI,CAAC;gBACb,OAAO,OAAO,CAAC;YACjB,CAAC;YACD,OAAO,IAAI,CAAC;QACd,CAAC,CAAC,CAAC;QAEH,MAAM,MAAM,GAAG,KAAK;YAClB,CAAC,CAAC,YAAY,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,IAAI;YAChC,CAAC,CAAC,OAAO,CAAC,OAAO,EAAE,GAAG,IAAI,GAAG,OAAO,GAAG,IAAI,CAAC;QAE9C,EAAE,CAAC,aAAa,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE,QAAQ,EAAE,OAAO,EAAE,CAAC,CAAC;QACzD,EAAE,CAAC,SAAS,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC;IAC/B,CAAC;CACF"}
|
|
@@ -1,17 +1,4 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Initializes the SQLite database and runs migrations.
|
|
3
|
-
*
|
|
4
|
-
* Re-uses the same MigrationRunner logic from the server:
|
|
5
|
-
* creates a schema_version table and applies numbered .sql migration files.
|
|
6
|
-
*/
|
|
7
1
|
export declare class DbInitializer {
|
|
8
|
-
/**
|
|
9
|
-
* Open (or create) the SQLite database at the given path,
|
|
10
|
-
* apply recommended PRAGMAs, and run all pending migrations.
|
|
11
|
-
*
|
|
12
|
-
* @param dbPath - Absolute path to the SQLite database file.
|
|
13
|
-
* @param migrationsDir - Absolute path to the directory containing .sql migration files.
|
|
14
|
-
*/
|
|
15
2
|
initialize(dbPath: string, migrationsDir: string): void;
|
|
16
3
|
private runMigrations;
|
|
17
4
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"db-initializer.d.ts","sourceRoot":"","sources":["../../src/installer/db-initializer.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"db-initializer.d.ts","sourceRoot":"","sources":["../../src/installer/db-initializer.ts"],"names":[],"mappings":"AAMA,qBAAa,aAAa;IACxB,UAAU,CAAC,MAAM,EAAE,MAAM,EAAE,aAAa,EAAE,MAAM,GAAG,IAAI;IAoBvD,OAAO,CAAC,aAAa;CAmDtB"}
|
|
@@ -1,26 +1,10 @@
|
|
|
1
1
|
import Database from 'better-sqlite3';
|
|
2
2
|
import * as path from 'node:path';
|
|
3
3
|
import * as fs from 'node:fs';
|
|
4
|
-
|
|
5
|
-
* Initializes the SQLite database and runs migrations.
|
|
6
|
-
*
|
|
7
|
-
* Re-uses the same MigrationRunner logic from the server:
|
|
8
|
-
* creates a schema_version table and applies numbered .sql migration files.
|
|
9
|
-
*/
|
|
4
|
+
import { getErrorMessage } from '@overlordai/protocol';
|
|
10
5
|
export class DbInitializer {
|
|
11
|
-
/**
|
|
12
|
-
* Open (or create) the SQLite database at the given path,
|
|
13
|
-
* apply recommended PRAGMAs, and run all pending migrations.
|
|
14
|
-
*
|
|
15
|
-
* @param dbPath - Absolute path to the SQLite database file.
|
|
16
|
-
* @param migrationsDir - Absolute path to the directory containing .sql migration files.
|
|
17
|
-
*/
|
|
18
6
|
initialize(dbPath, migrationsDir) {
|
|
19
|
-
|
|
20
|
-
const dir = path.dirname(dbPath);
|
|
21
|
-
if (!fs.existsSync(dir)) {
|
|
22
|
-
fs.mkdirSync(dir, { recursive: true });
|
|
23
|
-
}
|
|
7
|
+
fs.mkdirSync(path.dirname(dbPath), { recursive: true });
|
|
24
8
|
const db = new Database(dbPath);
|
|
25
9
|
try {
|
|
26
10
|
// Apply recommended PRAGMAs for performance and safety
|
|
@@ -47,14 +31,11 @@ export class DbInitializer {
|
|
|
47
31
|
if (!fs.existsSync(migrationsDir)) {
|
|
48
32
|
throw new Error(`Migrations directory not found: ${migrationsDir}`);
|
|
49
33
|
}
|
|
34
|
+
const parseVersion = (f) => parseInt(f.split('-')[0], 10);
|
|
50
35
|
const files = fs
|
|
51
36
|
.readdirSync(migrationsDir)
|
|
52
|
-
.filter((f) => f.endsWith('.sql'))
|
|
53
|
-
.sort((a, b) =>
|
|
54
|
-
const numA = parseInt(a.split('-')[0], 10);
|
|
55
|
-
const numB = parseInt(b.split('-')[0], 10);
|
|
56
|
-
return numA - numB;
|
|
57
|
-
});
|
|
37
|
+
.filter((f) => f.endsWith('.sql') && !isNaN(parseVersion(f)))
|
|
38
|
+
.sort((a, b) => parseVersion(a) - parseVersion(b));
|
|
58
39
|
const applied = new Set(db
|
|
59
40
|
.prepare('SELECT version FROM schema_version')
|
|
60
41
|
.all()
|
|
@@ -73,7 +54,7 @@ export class DbInitializer {
|
|
|
73
54
|
runMigration();
|
|
74
55
|
}
|
|
75
56
|
catch (err) {
|
|
76
|
-
throw new Error(`Migration ${file} failed: ${
|
|
57
|
+
throw new Error(`Migration ${file} failed: ${getErrorMessage(err)}`);
|
|
77
58
|
}
|
|
78
59
|
}
|
|
79
60
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"db-initializer.js","sourceRoot":"","sources":["../../src/installer/db-initializer.ts"],"names":[],"mappings":"AAAA,OAAO,QAAQ,MAAM,gBAAgB,CAAC;AACtC,OAAO,KAAK,IAAI,MAAM,WAAW,CAAC;AAClC,OAAO,KAAK,EAAE,MAAM,SAAS,CAAC;AAE9B
|
|
1
|
+
{"version":3,"file":"db-initializer.js","sourceRoot":"","sources":["../../src/installer/db-initializer.ts"],"names":[],"mappings":"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"}
|
|
@@ -3,41 +3,14 @@ export interface CheckResult {
|
|
|
3
3
|
detail?: string;
|
|
4
4
|
optional?: boolean;
|
|
5
5
|
}
|
|
6
|
-
/**
|
|
7
|
-
* Checks system prerequisites for Overlord installation.
|
|
8
|
-
*/
|
|
9
6
|
export declare class EnvChecker {
|
|
10
|
-
/**
|
|
11
|
-
* Check Git is installed and version >= 2.20.
|
|
12
|
-
*/
|
|
13
7
|
checkGit(): CheckResult;
|
|
14
|
-
/**
|
|
15
|
-
* Check Node.js version >= 20.
|
|
16
|
-
*/
|
|
17
8
|
checkNode(): CheckResult;
|
|
18
|
-
/**
|
|
19
|
-
* Check Redis is reachable and version >= 6.2.
|
|
20
|
-
*/
|
|
21
9
|
checkRedis(url: string): Promise<CheckResult>;
|
|
22
|
-
/**
|
|
23
|
-
* Check claude CLI is available (optional).
|
|
24
|
-
*/
|
|
25
10
|
checkClaudeCli(): CheckResult;
|
|
26
|
-
/**
|
|
27
|
-
* Check Cursor agent CLI is available (optional).
|
|
28
|
-
*/
|
|
29
11
|
checkCursorCli(): CheckResult;
|
|
30
|
-
/**
|
|
31
|
-
* Check OpenAI Codex CLI is available (optional).
|
|
32
|
-
*/
|
|
33
12
|
checkCodexCli(): CheckResult;
|
|
34
|
-
/**
|
|
35
|
-
* Check available disk space at a given path (warn if < 1 GB).
|
|
36
|
-
*/
|
|
37
13
|
checkDiskSpace(dirPath: string): CheckResult;
|
|
38
|
-
/**
|
|
39
|
-
* Check if a TCP port is available.
|
|
40
|
-
*/
|
|
41
14
|
checkPort(port: number): Promise<CheckResult>;
|
|
42
15
|
private checkOptionalBinary;
|
|
43
16
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"env-checker.d.ts","sourceRoot":"","sources":["../../src/installer/env-checker.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"env-checker.d.ts","sourceRoot":"","sources":["../../src/installer/env-checker.ts"],"names":[],"mappings":"AAMA,MAAM,WAAW,WAAW;IAC1B,EAAE,EAAE,OAAO,CAAC;IACZ,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,QAAQ,CAAC,EAAE,OAAO,CAAC;CACpB;AAED,qBAAa,UAAU;IACrB,QAAQ,IAAI,WAAW;IAqBvB,SAAS,IAAI,WAAW;IAclB,UAAU,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,WAAW,CAAC;IAyBnD,cAAc,IAAI,WAAW;IAI7B,cAAc,IAAI,WAAW;IAI7B,aAAa,IAAI,WAAW;IAI5B,cAAc,CAAC,OAAO,EAAE,MAAM,GAAG,WAAW;IAgB5C,SAAS,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,WAAW,CAAC;IAsB7C,OAAO,CAAC,mBAAmB;CAQ5B"}
|
|
@@ -1,16 +1,11 @@
|
|
|
1
1
|
import { execFileSync } from 'node:child_process';
|
|
2
2
|
import * as net from 'node:net';
|
|
3
3
|
import * as fs from 'node:fs';
|
|
4
|
-
|
|
5
|
-
* Checks system prerequisites for Overlord installation.
|
|
6
|
-
*/
|
|
4
|
+
const EXEC_OPTS = { encoding: 'utf-8', stdio: ['pipe', 'pipe', 'pipe'] };
|
|
7
5
|
export class EnvChecker {
|
|
8
|
-
/**
|
|
9
|
-
* Check Git is installed and version >= 2.20.
|
|
10
|
-
*/
|
|
11
6
|
checkGit() {
|
|
12
7
|
try {
|
|
13
|
-
const output = execFileSync('git', ['--version'],
|
|
8
|
+
const output = execFileSync('git', ['--version'], EXEC_OPTS).trim();
|
|
14
9
|
const match = output.match(/git version (\d+)\.(\d+)/);
|
|
15
10
|
if (!match) {
|
|
16
11
|
return { ok: false, detail: 'Could not parse Git version' };
|
|
@@ -26,9 +21,6 @@ export class EnvChecker {
|
|
|
26
21
|
return { ok: false, detail: 'Git not found' };
|
|
27
22
|
}
|
|
28
23
|
}
|
|
29
|
-
/**
|
|
30
|
-
* Check Node.js version >= 20.
|
|
31
|
-
*/
|
|
32
24
|
checkNode() {
|
|
33
25
|
const match = process.version.match(/v(\d+)/);
|
|
34
26
|
if (!match) {
|
|
@@ -40,14 +32,10 @@ export class EnvChecker {
|
|
|
40
32
|
}
|
|
41
33
|
return { ok: true, detail: `Node.js ${process.version}` };
|
|
42
34
|
}
|
|
43
|
-
/**
|
|
44
|
-
* Check Redis is reachable and version >= 6.2.
|
|
45
|
-
*/
|
|
46
35
|
async checkRedis(url) {
|
|
47
36
|
try {
|
|
48
37
|
const output = execFileSync('redis-cli', ['-u', url, 'INFO', 'server'], {
|
|
49
|
-
|
|
50
|
-
stdio: ['pipe', 'pipe', 'pipe'],
|
|
38
|
+
...EXEC_OPTS,
|
|
51
39
|
timeout: 5000,
|
|
52
40
|
});
|
|
53
41
|
const versionMatch = output.match(/redis_version:(\d+)\.(\d+)/);
|
|
@@ -65,27 +53,15 @@ export class EnvChecker {
|
|
|
65
53
|
return { ok: false, detail: 'Redis not reachable' };
|
|
66
54
|
}
|
|
67
55
|
}
|
|
68
|
-
/**
|
|
69
|
-
* Check claude CLI is available (optional).
|
|
70
|
-
*/
|
|
71
56
|
checkClaudeCli() {
|
|
72
|
-
return this.checkOptionalBinary('claude'
|
|
57
|
+
return this.checkOptionalBinary('claude');
|
|
73
58
|
}
|
|
74
|
-
/**
|
|
75
|
-
* Check Cursor agent CLI is available (optional).
|
|
76
|
-
*/
|
|
77
59
|
checkCursorCli() {
|
|
78
|
-
return this.checkOptionalBinary('agent'
|
|
60
|
+
return this.checkOptionalBinary('agent');
|
|
79
61
|
}
|
|
80
|
-
/**
|
|
81
|
-
* Check OpenAI Codex CLI is available (optional).
|
|
82
|
-
*/
|
|
83
62
|
checkCodexCli() {
|
|
84
|
-
return this.checkOptionalBinary('codex'
|
|
63
|
+
return this.checkOptionalBinary('codex');
|
|
85
64
|
}
|
|
86
|
-
/**
|
|
87
|
-
* Check available disk space at a given path (warn if < 1 GB).
|
|
88
|
-
*/
|
|
89
65
|
checkDiskSpace(dirPath) {
|
|
90
66
|
try {
|
|
91
67
|
const stat = fs.statfsSync(dirPath);
|
|
@@ -100,9 +76,6 @@ export class EnvChecker {
|
|
|
100
76
|
return { ok: false, detail: 'Could not check disk space' };
|
|
101
77
|
}
|
|
102
78
|
}
|
|
103
|
-
/**
|
|
104
|
-
* Check if a TCP port is available.
|
|
105
|
-
*/
|
|
106
79
|
checkPort(port) {
|
|
107
80
|
return new Promise((resolve) => {
|
|
108
81
|
const server = net.createServer();
|
|
@@ -122,13 +95,13 @@ export class EnvChecker {
|
|
|
122
95
|
server.listen(port, '127.0.0.1');
|
|
123
96
|
});
|
|
124
97
|
}
|
|
125
|
-
checkOptionalBinary(command
|
|
98
|
+
checkOptionalBinary(command) {
|
|
126
99
|
try {
|
|
127
|
-
execFileSync('which', [command],
|
|
128
|
-
return { ok: true, detail: `${
|
|
100
|
+
execFileSync('which', [command], EXEC_OPTS);
|
|
101
|
+
return { ok: true, detail: `${command} found`, optional: true };
|
|
129
102
|
}
|
|
130
103
|
catch {
|
|
131
|
-
return { ok: false, detail: `${
|
|
104
|
+
return { ok: false, detail: `${command} not found`, optional: true };
|
|
132
105
|
}
|
|
133
106
|
}
|
|
134
107
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"env-checker.js","sourceRoot":"","sources":["../../src/installer/env-checker.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAClD,OAAO,KAAK,GAAG,MAAM,UAAU,CAAC;AAChC,OAAO,KAAK,EAAE,MAAM,SAAS,CAAC;
|
|
1
|
+
{"version":3,"file":"env-checker.js","sourceRoot":"","sources":["../../src/installer/env-checker.ts"],"names":[],"mappings":"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"}
|
|
@@ -3,25 +3,10 @@ export interface GeneratedSecrets {
|
|
|
3
3
|
workerJwtSecret: string;
|
|
4
4
|
encryptionKey: string;
|
|
5
5
|
}
|
|
6
|
-
/**
|
|
7
|
-
* Generates cryptographically secure secrets for Overlord configuration.
|
|
8
|
-
*/
|
|
9
6
|
export declare class SecretGenerator {
|
|
10
|
-
/**
|
|
11
|
-
* Generate a 64-byte hex JWT secret for user authentication.
|
|
12
|
-
*/
|
|
13
7
|
generateJwtSecret(): string;
|
|
14
|
-
/**
|
|
15
|
-
* Generate a 64-byte hex JWT secret for worker authentication and channel tokens.
|
|
16
|
-
*/
|
|
17
8
|
generateWorkerJwtSecret(): string;
|
|
18
|
-
/**
|
|
19
|
-
* Generate a 32-byte hex encryption key for AES-256-GCM.
|
|
20
|
-
*/
|
|
21
9
|
generateEncryptionKey(): string;
|
|
22
|
-
/**
|
|
23
|
-
* Generate all three secrets at once.
|
|
24
|
-
*/
|
|
25
10
|
generateAll(): GeneratedSecrets;
|
|
26
11
|
}
|
|
27
12
|
//# sourceMappingURL=secret-gen.d.ts.map
|