@getaegis/cli 0.8.0 → 0.9.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/README.md +43 -14
- package/dist/agent/agent.d.ts +98 -0
- package/dist/agent/agent.d.ts.map +1 -0
- package/dist/agent/agent.js +212 -0
- package/dist/agent/agent.js.map +1 -0
- package/dist/agent/index.d.ts +3 -0
- package/dist/agent/index.d.ts.map +1 -0
- package/dist/agent/index.js +2 -0
- package/dist/agent/index.js.map +1 -0
- package/dist/cli/auth.d.ts +19 -0
- package/dist/cli/auth.d.ts.map +1 -0
- package/dist/cli/auth.js +44 -0
- package/dist/cli/auth.js.map +1 -0
- package/dist/cli/commands/agent.d.ts +6 -0
- package/dist/cli/commands/agent.d.ts.map +1 -0
- package/dist/cli/commands/agent.js +241 -0
- package/dist/cli/commands/agent.js.map +1 -0
- package/dist/cli/commands/config.d.ts +6 -0
- package/dist/cli/commands/config.d.ts.map +1 -0
- package/dist/cli/commands/config.js +125 -0
- package/dist/cli/commands/config.js.map +1 -0
- package/dist/cli/commands/dashboard.d.ts +6 -0
- package/dist/cli/commands/dashboard.d.ts.map +1 -0
- package/dist/cli/commands/dashboard.js +195 -0
- package/dist/cli/commands/dashboard.js.map +1 -0
- package/dist/cli/commands/db.d.ts +6 -0
- package/dist/cli/commands/db.d.ts.map +1 -0
- package/dist/cli/commands/db.js +139 -0
- package/dist/cli/commands/db.js.map +1 -0
- package/dist/cli/commands/doctor.d.ts +6 -0
- package/dist/cli/commands/doctor.d.ts.map +1 -0
- package/dist/cli/commands/doctor.js +39 -0
- package/dist/cli/commands/doctor.js.map +1 -0
- package/dist/cli/commands/gate.d.ts +6 -0
- package/dist/cli/commands/gate.d.ts.map +1 -0
- package/dist/cli/commands/gate.js +202 -0
- package/dist/cli/commands/gate.js.map +1 -0
- package/dist/cli/commands/init.d.ts +6 -0
- package/dist/cli/commands/init.d.ts.map +1 -0
- package/dist/cli/commands/init.js +175 -0
- package/dist/cli/commands/init.js.map +1 -0
- package/dist/cli/commands/key.d.ts +6 -0
- package/dist/cli/commands/key.d.ts.map +1 -0
- package/dist/cli/commands/key.js +49 -0
- package/dist/cli/commands/key.js.map +1 -0
- package/dist/cli/commands/ledger.d.ts +6 -0
- package/dist/cli/commands/ledger.d.ts.map +1 -0
- package/dist/cli/commands/ledger.js +140 -0
- package/dist/cli/commands/ledger.js.map +1 -0
- package/dist/cli/commands/mcp.d.ts +6 -0
- package/dist/cli/commands/mcp.d.ts.map +1 -0
- package/dist/cli/commands/mcp.js +224 -0
- package/dist/cli/commands/mcp.js.map +1 -0
- package/dist/cli/commands/policy.d.ts +6 -0
- package/dist/cli/commands/policy.d.ts.map +1 -0
- package/dist/cli/commands/policy.js +126 -0
- package/dist/cli/commands/policy.js.map +1 -0
- package/dist/cli/commands/user.d.ts +6 -0
- package/dist/cli/commands/user.d.ts.map +1 -0
- package/dist/cli/commands/user.js +150 -0
- package/dist/cli/commands/user.js.map +1 -0
- package/dist/cli/commands/vault-manager.d.ts +6 -0
- package/dist/cli/commands/vault-manager.d.ts.map +1 -0
- package/dist/cli/commands/vault-manager.js +240 -0
- package/dist/cli/commands/vault-manager.js.map +1 -0
- package/dist/cli/commands/vault.d.ts +6 -0
- package/dist/cli/commands/vault.d.ts.map +1 -0
- package/dist/cli/commands/vault.js +265 -0
- package/dist/cli/commands/vault.js.map +1 -0
- package/dist/cli/commands/webhook.d.ts +6 -0
- package/dist/cli/commands/webhook.d.ts.map +1 -0
- package/dist/cli/commands/webhook.js +151 -0
- package/dist/cli/commands/webhook.js.map +1 -0
- package/dist/cli/helpers.d.ts +12 -0
- package/dist/cli/helpers.d.ts.map +1 -0
- package/dist/cli/helpers.js +61 -0
- package/dist/cli/helpers.js.map +1 -0
- package/dist/cli/index.d.ts +19 -0
- package/dist/cli/index.d.ts.map +1 -0
- package/dist/cli/index.js +19 -0
- package/dist/cli/index.js.map +1 -0
- package/dist/cli/validation.d.ts +37 -0
- package/dist/cli/validation.d.ts.map +1 -0
- package/dist/cli/validation.js +104 -0
- package/dist/cli/validation.js.map +1 -0
- package/dist/cli.d.ts +3 -0
- package/dist/cli.d.ts.map +1 -0
- package/dist/cli.js +37 -0
- package/dist/cli.js.map +1 -0
- package/dist/config.d.ts +120 -0
- package/dist/config.d.ts.map +1 -0
- package/dist/config.js +401 -0
- package/dist/config.js.map +1 -0
- package/dist/dashboard/dashboard-server.d.ts +95 -0
- package/dist/dashboard/dashboard-server.d.ts.map +1 -0
- package/dist/dashboard/dashboard-server.js +329 -0
- package/dist/dashboard/dashboard-server.js.map +1 -0
- package/dist/dashboard/index.d.ts +3 -0
- package/dist/dashboard/index.d.ts.map +1 -0
- package/dist/dashboard/index.js +2 -0
- package/dist/dashboard/index.js.map +1 -0
- package/dist/dashboard/public/assets/index-Cah0_BKk.js +148 -0
- package/dist/dashboard/public/assets/index-CpMruPNh.css +1 -0
- package/dist/dashboard/public/favicon.svg +6 -0
- package/dist/dashboard/public/index.html +14 -0
- package/dist/db.d.ts +27 -0
- package/dist/db.d.ts.map +1 -0
- package/dist/db.js +209 -0
- package/dist/db.js.map +1 -0
- package/dist/doctor.d.ts +37 -0
- package/dist/doctor.d.ts.map +1 -0
- package/dist/doctor.js +216 -0
- package/dist/doctor.js.map +1 -0
- package/dist/gate/body-inspector.d.ts +31 -0
- package/dist/gate/body-inspector.d.ts.map +1 -0
- package/dist/gate/body-inspector.js +193 -0
- package/dist/gate/body-inspector.js.map +1 -0
- package/dist/gate/gate.d.ts +190 -0
- package/dist/gate/gate.d.ts.map +1 -0
- package/dist/gate/gate.js +1243 -0
- package/dist/gate/gate.js.map +1 -0
- package/dist/gate/index.d.ts +7 -0
- package/dist/gate/index.d.ts.map +1 -0
- package/dist/gate/index.js +4 -0
- package/dist/gate/index.js.map +1 -0
- package/dist/gate/rate-limiter.d.ts +59 -0
- package/dist/gate/rate-limiter.d.ts.map +1 -0
- package/dist/gate/rate-limiter.js +120 -0
- package/dist/gate/rate-limiter.js.map +1 -0
- package/dist/index.d.ts +28 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +17 -0
- package/dist/index.js.map +1 -0
- package/dist/key-storage/credential-manager-windows.d.ts +19 -0
- package/dist/key-storage/credential-manager-windows.d.ts.map +1 -0
- package/dist/key-storage/credential-manager-windows.js +87 -0
- package/dist/key-storage/credential-manager-windows.js.map +1 -0
- package/dist/key-storage/file-fallback.d.ts +21 -0
- package/dist/key-storage/file-fallback.d.ts.map +1 -0
- package/dist/key-storage/file-fallback.js +62 -0
- package/dist/key-storage/file-fallback.js.map +1 -0
- package/dist/key-storage/index.d.ts +6 -0
- package/dist/key-storage/index.d.ts.map +1 -0
- package/dist/key-storage/index.js +6 -0
- package/dist/key-storage/index.js.map +1 -0
- package/dist/key-storage/key-storage.d.ts +41 -0
- package/dist/key-storage/key-storage.d.ts.map +1 -0
- package/dist/key-storage/key-storage.js +70 -0
- package/dist/key-storage/key-storage.js.map +1 -0
- package/dist/key-storage/keychain-macos.d.ts +19 -0
- package/dist/key-storage/keychain-macos.d.ts.map +1 -0
- package/dist/key-storage/keychain-macos.js +51 -0
- package/dist/key-storage/keychain-macos.js.map +1 -0
- package/dist/key-storage/secret-service-linux.d.ts +19 -0
- package/dist/key-storage/secret-service-linux.d.ts.map +1 -0
- package/dist/key-storage/secret-service-linux.js +55 -0
- package/dist/key-storage/secret-service-linux.js.map +1 -0
- package/dist/ledger/index.d.ts +3 -0
- package/dist/ledger/index.d.ts.map +1 -0
- package/dist/ledger/index.js +2 -0
- package/dist/ledger/index.js.map +1 -0
- package/dist/ledger/ledger.d.ts +98 -0
- package/dist/ledger/ledger.d.ts.map +1 -0
- package/dist/ledger/ledger.js +145 -0
- package/dist/ledger/ledger.js.map +1 -0
- package/dist/logger/index.d.ts +3 -0
- package/dist/logger/index.d.ts.map +1 -0
- package/dist/logger/index.js +2 -0
- package/dist/logger/index.js.map +1 -0
- package/dist/logger/logger.d.ts +58 -0
- package/dist/logger/logger.d.ts.map +1 -0
- package/dist/logger/logger.js +201 -0
- package/dist/logger/logger.js.map +1 -0
- package/dist/mcp/index.d.ts +3 -0
- package/dist/mcp/index.d.ts.map +1 -0
- package/dist/mcp/index.js +2 -0
- package/dist/mcp/index.js.map +1 -0
- package/dist/mcp/mcp-server.d.ts +130 -0
- package/dist/mcp/mcp-server.d.ts.map +1 -0
- package/dist/mcp/mcp-server.js +775 -0
- package/dist/mcp/mcp-server.js.map +1 -0
- package/dist/metrics/index.d.ts +3 -0
- package/dist/metrics/index.d.ts.map +1 -0
- package/dist/metrics/index.js +2 -0
- package/dist/metrics/index.js.map +1 -0
- package/dist/metrics/metrics.d.ts +88 -0
- package/dist/metrics/metrics.d.ts.map +1 -0
- package/dist/metrics/metrics.js +179 -0
- package/dist/metrics/metrics.js.map +1 -0
- package/dist/policy/index.d.ts +3 -0
- package/dist/policy/index.d.ts.map +1 -0
- package/dist/policy/index.js +2 -0
- package/dist/policy/index.js.map +1 -0
- package/dist/policy/policy.d.ts +119 -0
- package/dist/policy/policy.d.ts.map +1 -0
- package/dist/policy/policy.js +426 -0
- package/dist/policy/policy.js.map +1 -0
- package/dist/user/index.d.ts +3 -0
- package/dist/user/index.d.ts.map +1 -0
- package/dist/user/index.js +2 -0
- package/dist/user/index.js.map +1 -0
- package/dist/user/user.d.ts +102 -0
- package/dist/user/user.d.ts.map +1 -0
- package/dist/user/user.js +216 -0
- package/dist/user/user.js.map +1 -0
- package/dist/vault/crypto.d.ts +28 -0
- package/dist/vault/crypto.d.ts.map +1 -0
- package/dist/vault/crypto.js +44 -0
- package/dist/vault/crypto.js.map +1 -0
- package/dist/vault/index.d.ts +10 -0
- package/dist/vault/index.d.ts.map +1 -0
- package/dist/vault/index.js +6 -0
- package/dist/vault/index.js.map +1 -0
- package/dist/vault/seal.d.ts +68 -0
- package/dist/vault/seal.d.ts.map +1 -0
- package/dist/vault/seal.js +110 -0
- package/dist/vault/seal.js.map +1 -0
- package/dist/vault/shamir.d.ts +33 -0
- package/dist/vault/shamir.d.ts.map +1 -0
- package/dist/vault/shamir.js +174 -0
- package/dist/vault/shamir.js.map +1 -0
- package/dist/vault/vault-manager.d.ts +62 -0
- package/dist/vault/vault-manager.d.ts.map +1 -0
- package/dist/vault/vault-manager.js +151 -0
- package/dist/vault/vault-manager.js.map +1 -0
- package/dist/vault/vault.d.ts +104 -0
- package/dist/vault/vault.d.ts.map +1 -0
- package/dist/vault/vault.js +259 -0
- package/dist/vault/vault.js.map +1 -0
- package/dist/version.d.ts +3 -0
- package/dist/version.d.ts.map +1 -0
- package/dist/version.js +18 -0
- package/dist/version.js.map +1 -0
- package/dist/webhook/index.d.ts +3 -0
- package/dist/webhook/index.d.ts.map +1 -0
- package/dist/webhook/index.js +2 -0
- package/dist/webhook/index.js.map +1 -0
- package/dist/webhook/webhook.d.ts +114 -0
- package/dist/webhook/webhook.d.ts.map +1 -0
- package/dist/webhook/webhook.js +269 -0
- package/dist/webhook/webhook.js.map +1 -0
- package/package.json +12 -6
|
@@ -0,0 +1,139 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Database commands: backup, restore.
|
|
3
|
+
*/
|
|
4
|
+
import * as fs from 'node:fs';
|
|
5
|
+
import * as path from 'node:path';
|
|
6
|
+
import Database from 'better-sqlite3-multiple-ciphers';
|
|
7
|
+
import { getConfig } from '../../config.js';
|
|
8
|
+
import { deriveDbKey, getDb, getVaultSalt, migrate } from '../../db.js';
|
|
9
|
+
import { deriveKey } from '../../vault/index.js';
|
|
10
|
+
import { VaultManager } from '../../vault/vault-manager.js';
|
|
11
|
+
import { requireUserAuth } from '../auth.js';
|
|
12
|
+
export function register(program) {
|
|
13
|
+
const dbCmd = program.command('db').description('Database backup and restore');
|
|
14
|
+
dbCmd
|
|
15
|
+
.command('backup')
|
|
16
|
+
.description('Create a backup of the current vault database')
|
|
17
|
+
.option('-o, --output <path>', 'Output file path', './aegis-backup.db')
|
|
18
|
+
.action(async (opts) => {
|
|
19
|
+
const config = getConfig();
|
|
20
|
+
const db = getDb(config);
|
|
21
|
+
migrate(db);
|
|
22
|
+
const key = deriveKey(config.masterKey, getVaultSalt(config));
|
|
23
|
+
requireUserAuth(db, key, 'vault:manage');
|
|
24
|
+
const outputPath = path.resolve(opts.output);
|
|
25
|
+
const outputDir = path.dirname(outputPath);
|
|
26
|
+
if (!fs.existsSync(outputDir)) {
|
|
27
|
+
fs.mkdirSync(outputDir, { recursive: true });
|
|
28
|
+
}
|
|
29
|
+
if (fs.existsSync(outputPath)) {
|
|
30
|
+
console.error(`\n✗ Backup file already exists: ${outputPath}`);
|
|
31
|
+
console.error(` Remove it first or choose a different path.\n`);
|
|
32
|
+
db.close();
|
|
33
|
+
process.exit(1);
|
|
34
|
+
}
|
|
35
|
+
try {
|
|
36
|
+
console.log(`\n Backing up database to: ${outputPath}`);
|
|
37
|
+
await db.backup(outputPath);
|
|
38
|
+
db.close();
|
|
39
|
+
// Verify the backup is valid
|
|
40
|
+
const backupDb = new Database(outputPath, { readonly: true });
|
|
41
|
+
if (config.masterKey) {
|
|
42
|
+
const salt = getVaultSalt(config);
|
|
43
|
+
const dbKey = deriveDbKey(config.masterKey, salt);
|
|
44
|
+
backupDb.pragma(`key="x'${dbKey.toString('hex')}'"`);
|
|
45
|
+
}
|
|
46
|
+
const tables = backupDb
|
|
47
|
+
.prepare("SELECT count(*) as cnt FROM sqlite_master WHERE type='table'")
|
|
48
|
+
.get();
|
|
49
|
+
backupDb.close();
|
|
50
|
+
const stats = fs.statSync(outputPath);
|
|
51
|
+
const sizeKb = (stats.size / 1024).toFixed(1);
|
|
52
|
+
console.log(` ✓ Backup complete (${sizeKb} KB, ${tables.cnt} tables)\n`);
|
|
53
|
+
}
|
|
54
|
+
catch (err) {
|
|
55
|
+
db.close();
|
|
56
|
+
const message = err instanceof Error ? err.message : String(err);
|
|
57
|
+
console.error(`\n✗ Backup failed: ${message}\n`);
|
|
58
|
+
process.exit(1);
|
|
59
|
+
}
|
|
60
|
+
});
|
|
61
|
+
dbCmd
|
|
62
|
+
.command('restore')
|
|
63
|
+
.description('Restore a vault database from a backup file')
|
|
64
|
+
.requiredOption('-i, --input <path>', 'Backup file to restore from')
|
|
65
|
+
.option('--force', 'Overwrite the current database without confirmation')
|
|
66
|
+
.action((opts) => {
|
|
67
|
+
const config = getConfig();
|
|
68
|
+
const inputPath = path.resolve(opts.input);
|
|
69
|
+
if (!fs.existsSync(inputPath)) {
|
|
70
|
+
console.error(`\n✗ Backup file not found: ${inputPath}\n`);
|
|
71
|
+
process.exit(1);
|
|
72
|
+
}
|
|
73
|
+
// Verify the backup is a valid (possibly encrypted) SQLite database
|
|
74
|
+
try {
|
|
75
|
+
const backupDb = new Database(inputPath, { readonly: true });
|
|
76
|
+
if (config.masterKey) {
|
|
77
|
+
const salt = getVaultSalt(config);
|
|
78
|
+
const dbKey = deriveDbKey(config.masterKey, salt);
|
|
79
|
+
backupDb.pragma(`key="x'${dbKey.toString('hex')}'"`);
|
|
80
|
+
}
|
|
81
|
+
const tables = backupDb
|
|
82
|
+
.prepare("SELECT count(*) as cnt FROM sqlite_master WHERE type='table'")
|
|
83
|
+
.get();
|
|
84
|
+
if (tables.cnt === 0) {
|
|
85
|
+
backupDb.close();
|
|
86
|
+
console.error('\n✗ Backup file contains no tables — this does not look like an Aegis database.\n');
|
|
87
|
+
process.exit(1);
|
|
88
|
+
}
|
|
89
|
+
backupDb.close();
|
|
90
|
+
}
|
|
91
|
+
catch (err) {
|
|
92
|
+
const message = err instanceof Error ? err.message : String(err);
|
|
93
|
+
console.error(`\n✗ Backup file is not a valid Aegis database: ${message}\n`);
|
|
94
|
+
process.exit(1);
|
|
95
|
+
}
|
|
96
|
+
// Resolve the current database path
|
|
97
|
+
const manager = new VaultManager(config.dataDir);
|
|
98
|
+
const info = manager.getVaultInfo(config.vaultName);
|
|
99
|
+
const dbPath = info
|
|
100
|
+
? path.join(config.dataDir, info.dbPath)
|
|
101
|
+
: path.join(config.dataDir, 'aegis.db');
|
|
102
|
+
if (fs.existsSync(dbPath) && !opts.force) {
|
|
103
|
+
console.error(`\n✗ Database already exists at: ${dbPath}`);
|
|
104
|
+
console.error(` Use --force to overwrite, or back up first with: aegis db backup\n`);
|
|
105
|
+
process.exit(1);
|
|
106
|
+
}
|
|
107
|
+
try {
|
|
108
|
+
// Ensure directory exists
|
|
109
|
+
const dir = path.dirname(dbPath);
|
|
110
|
+
if (!fs.existsSync(dir)) {
|
|
111
|
+
fs.mkdirSync(dir, { recursive: true });
|
|
112
|
+
}
|
|
113
|
+
// Remove WAL and SHM files from the target (stale journal files cause issues)
|
|
114
|
+
for (const suffix of ['-wal', '-shm']) {
|
|
115
|
+
const walPath = `${dbPath}${suffix}`;
|
|
116
|
+
if (fs.existsSync(walPath)) {
|
|
117
|
+
fs.unlinkSync(walPath);
|
|
118
|
+
}
|
|
119
|
+
}
|
|
120
|
+
// Copy the backup file to the database path
|
|
121
|
+
fs.copyFileSync(inputPath, dbPath);
|
|
122
|
+
// Verify the restored database works
|
|
123
|
+
const db = getDb(config);
|
|
124
|
+
migrate(db);
|
|
125
|
+
const tables = db
|
|
126
|
+
.prepare("SELECT count(*) as cnt FROM sqlite_master WHERE type='table'")
|
|
127
|
+
.get();
|
|
128
|
+
db.close();
|
|
129
|
+
console.log(`\n ✓ Database restored from: ${inputPath}`);
|
|
130
|
+
console.log(` ✓ ${tables.cnt} tables verified\n`);
|
|
131
|
+
}
|
|
132
|
+
catch (err) {
|
|
133
|
+
const message = err instanceof Error ? err.message : String(err);
|
|
134
|
+
console.error(`\n✗ Restore failed: ${message}\n`);
|
|
135
|
+
process.exit(1);
|
|
136
|
+
}
|
|
137
|
+
});
|
|
138
|
+
}
|
|
139
|
+
//# sourceMappingURL=db.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"db.js","sourceRoot":"","sources":["../../../src/cli/commands/db.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"doctor.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/doctor.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAOzC,wBAAgB,QAAQ,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CAiC/C"}
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Doctor command: run health checks on the Aegis installation.
|
|
3
|
+
*/
|
|
4
|
+
import { getConfig } from '../../config.js';
|
|
5
|
+
import { getDb, getVaultSalt, migrate } from '../../db.js';
|
|
6
|
+
import { printDoctorReport, runDoctor } from '../../doctor.js';
|
|
7
|
+
import { deriveKey, VaultManager } from '../../vault/index.js';
|
|
8
|
+
import { requireUserAuth } from '../auth.js';
|
|
9
|
+
export function register(program) {
|
|
10
|
+
program
|
|
11
|
+
.command('doctor')
|
|
12
|
+
.description('Run health checks on your Aegis installation')
|
|
13
|
+
.action(() => {
|
|
14
|
+
console.log('\n Aegis Doctor — running health checks...\n');
|
|
15
|
+
const config = getConfig();
|
|
16
|
+
const manager = new VaultManager(config.dataDir);
|
|
17
|
+
const vaultInfo = manager.getVaultInfo(config.vaultName);
|
|
18
|
+
let db = null;
|
|
19
|
+
if (vaultInfo) {
|
|
20
|
+
try {
|
|
21
|
+
db = getDb(config);
|
|
22
|
+
}
|
|
23
|
+
catch {
|
|
24
|
+
// db stays null — runDoctor handles that case
|
|
25
|
+
}
|
|
26
|
+
}
|
|
27
|
+
if (db) {
|
|
28
|
+
migrate(db);
|
|
29
|
+
const key = deriveKey(config.masterKey, getVaultSalt(config));
|
|
30
|
+
requireUserAuth(db, key, 'doctor:run');
|
|
31
|
+
}
|
|
32
|
+
const report = runDoctor({ config, db });
|
|
33
|
+
printDoctorReport(report);
|
|
34
|
+
if (report.overall === 'fail') {
|
|
35
|
+
process.exit(1);
|
|
36
|
+
}
|
|
37
|
+
});
|
|
38
|
+
}
|
|
39
|
+
//# sourceMappingURL=doctor.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"doctor.js","sourceRoot":"","sources":["../../../src/cli/commands/doctor.ts"],"names":[],"mappings":"AAAA;;GAEG;AAGH,OAAO,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAC5C,OAAO,EAAE,KAAK,EAAE,YAAY,EAAE,OAAO,EAAE,MAAM,aAAa,CAAC;AAC3D,OAAO,EAAE,iBAAiB,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAC/D,OAAO,EAAE,SAAS,EAAE,YAAY,EAAE,MAAM,sBAAsB,CAAC;AAC/D,OAAO,EAAE,eAAe,EAAE,MAAM,YAAY,CAAC;AAE7C,MAAM,UAAU,QAAQ,CAAC,OAAgB;IACvC,OAAO;SACJ,OAAO,CAAC,QAAQ,CAAC;SACjB,WAAW,CAAC,8CAA8C,CAAC;SAC3D,MAAM,CAAC,GAAG,EAAE;QACX,OAAO,CAAC,GAAG,CAAC,+CAA+C,CAAC,CAAC;QAE7D,MAAM,MAAM,GAAG,SAAS,EAAE,CAAC;QAC3B,MAAM,OAAO,GAAG,IAAI,YAAY,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;QACjD,MAAM,SAAS,GAAG,OAAO,CAAC,YAAY,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC;QAEzD,IAAI,EAAE,GAAoC,IAAI,CAAC;QAC/C,IAAI,SAAS,EAAE,CAAC;YACd,IAAI,CAAC;gBACH,EAAE,GAAG,KAAK,CAAC,MAAM,CAAC,CAAC;YACrB,CAAC;YAAC,MAAM,CAAC;gBACP,8CAA8C;YAChD,CAAC;QACH,CAAC;QAED,IAAI,EAAE,EAAE,CAAC;YACP,OAAO,CAAC,EAAE,CAAC,CAAC;YACZ,MAAM,GAAG,GAAG,SAAS,CAAC,MAAM,CAAC,SAAS,EAAE,YAAY,CAAC,MAAM,CAAC,CAAC,CAAC;YAC9D,eAAe,CAAC,EAAE,EAAE,GAAG,EAAE,YAAY,CAAC,CAAC;QACzC,CAAC;QAED,MAAM,MAAM,GAAG,SAAS,CAAC,EAAE,MAAM,EAAE,EAAE,EAAE,CAAC,CAAC;QACzC,iBAAiB,CAAC,MAAM,CAAC,CAAC;QAE1B,IAAI,MAAM,CAAC,OAAO,KAAK,MAAM,EAAE,CAAC;YAC9B,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC;IACH,CAAC,CAAC,CAAC;AACP,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"gate.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/gate.ts"],"names":[],"mappings":"AAAA;;GAEG;AAIH,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAazC,wBAAgB,QAAQ,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CAkP/C"}
|
|
@@ -0,0 +1,202 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Gate command: start the Aegis Gate proxy.
|
|
3
|
+
*/
|
|
4
|
+
import * as fs from 'node:fs';
|
|
5
|
+
import * as path from 'node:path';
|
|
6
|
+
import { AgentRegistry } from '../../agent/index.js';
|
|
7
|
+
import { getConfig } from '../../config.js';
|
|
8
|
+
import { getDb, getVaultSalt, migrate } from '../../db.js';
|
|
9
|
+
import { Gate } from '../../gate/index.js';
|
|
10
|
+
import { Ledger } from '../../ledger/index.js';
|
|
11
|
+
import { AegisMetrics } from '../../metrics/index.js';
|
|
12
|
+
import { deriveKey, Vault } from '../../vault/index.js';
|
|
13
|
+
import { VERSION } from '../../version.js';
|
|
14
|
+
import { WebhookManager } from '../../webhook/index.js';
|
|
15
|
+
import { requireUserAuth } from '../auth.js';
|
|
16
|
+
import { VALID_POLICY_MODES, validateEnum, validatePort } from '../validation.js';
|
|
17
|
+
export function register(program) {
|
|
18
|
+
program
|
|
19
|
+
.command('gate')
|
|
20
|
+
.description('Start the Aegis Gate proxy')
|
|
21
|
+
.option('-p, --port <port>', 'Port to listen on')
|
|
22
|
+
.option('--tls', 'Enable TLS (HTTPS) on Gate')
|
|
23
|
+
.option('--cert <path>', 'Path to TLS certificate file (PEM)')
|
|
24
|
+
.option('--key <path>', 'Path to TLS private key file (PEM)')
|
|
25
|
+
.option('--no-agent-auth', 'Disable agent authentication (allows any localhost process to use credentials)')
|
|
26
|
+
.option('--policies-dir <path>', 'Directory containing YAML policy files')
|
|
27
|
+
.option('--policy-mode <mode>', 'Policy enforcement mode: enforce, dry-run, or off')
|
|
28
|
+
.action(async (opts) => {
|
|
29
|
+
// ── Validate CLI flags ──
|
|
30
|
+
if (opts.port) {
|
|
31
|
+
const p = Number.parseInt(opts.port, 10);
|
|
32
|
+
validatePort(p, 'gate port');
|
|
33
|
+
}
|
|
34
|
+
if (opts.policyMode) {
|
|
35
|
+
validateEnum(opts.policyMode, VALID_POLICY_MODES, 'policy mode');
|
|
36
|
+
}
|
|
37
|
+
let config;
|
|
38
|
+
try {
|
|
39
|
+
config = getConfig();
|
|
40
|
+
}
|
|
41
|
+
catch (err) {
|
|
42
|
+
const msg = err instanceof Error ? err.message : String(err);
|
|
43
|
+
console.error(`\n✗ ${msg}\n`);
|
|
44
|
+
process.exit(1);
|
|
45
|
+
}
|
|
46
|
+
const port = opts.port ? Number.parseInt(opts.port, 10) : config.port;
|
|
47
|
+
let db;
|
|
48
|
+
try {
|
|
49
|
+
db = getDb(config);
|
|
50
|
+
migrate(db);
|
|
51
|
+
}
|
|
52
|
+
catch (err) {
|
|
53
|
+
const msg = err instanceof Error ? err.message : String(err);
|
|
54
|
+
console.error(`\n✗ Cannot open database: ${msg}\n`);
|
|
55
|
+
process.exit(1);
|
|
56
|
+
}
|
|
57
|
+
if (!config.masterKey) {
|
|
58
|
+
console.error('\n✗ AEGIS_MASTER_KEY is not set.\n Run `aegis init` to generate a config and master key.\n');
|
|
59
|
+
process.exit(1);
|
|
60
|
+
}
|
|
61
|
+
const key = deriveKey(config.masterKey, getVaultSalt(config));
|
|
62
|
+
requireUserAuth(db, key, 'gate:start');
|
|
63
|
+
const vaultInstance = new Vault(db, config.masterKey, getVaultSalt(config));
|
|
64
|
+
const ledger = new Ledger(db);
|
|
65
|
+
// Resolve TLS: CLI flags → config file
|
|
66
|
+
const useTls = opts.tls ?? !!config.tls;
|
|
67
|
+
let tlsConfig;
|
|
68
|
+
if (useTls) {
|
|
69
|
+
const certPath = opts.cert ?? config.tls?.cert ?? path.join(process.cwd(), 'certs', 'aegis.crt');
|
|
70
|
+
const keyPath = opts.key ?? config.tls?.key ?? path.join(process.cwd(), 'certs', 'aegis.key');
|
|
71
|
+
if (!fs.existsSync(certPath)) {
|
|
72
|
+
console.error(`\n✗ TLS certificate not found at ${certPath}\n Generate one with: aegis init --generate-cert\n Or specify a path: aegis gate --tls --cert /path/to/cert.pem --key /path/to/key.pem\n`);
|
|
73
|
+
process.exit(1);
|
|
74
|
+
}
|
|
75
|
+
if (!fs.existsSync(keyPath)) {
|
|
76
|
+
console.error(`\n✗ TLS private key not found at ${keyPath}\n Generate one with: aegis init --generate-cert\n Or specify a path: aegis gate --tls --cert /path/to/cert.pem --key /path/to/key.pem\n`);
|
|
77
|
+
process.exit(1);
|
|
78
|
+
}
|
|
79
|
+
tlsConfig = { certPath, keyPath };
|
|
80
|
+
}
|
|
81
|
+
const registry = new AgentRegistry(db, key);
|
|
82
|
+
// Resolve policy: CLI flags → config file
|
|
83
|
+
const effectiveRequireAgentAuth = opts.agentAuth !== undefined ? opts.agentAuth : config.requireAgentAuth;
|
|
84
|
+
const effectivePolicyMode = opts.policyMode ??
|
|
85
|
+
(config.policyMode === 'off' ? undefined : config.policyMode);
|
|
86
|
+
const policyDir = opts.policiesDir
|
|
87
|
+
? path.resolve(opts.policiesDir)
|
|
88
|
+
: config.policiesDir
|
|
89
|
+
? path.resolve(config.policiesDir)
|
|
90
|
+
: undefined;
|
|
91
|
+
if (policyDir && !fs.existsSync(policyDir)) {
|
|
92
|
+
console.error(`\n✗ Policy directory not found at ${policyDir}\n Create it and add YAML policy files, or omit --policies-dir\n`);
|
|
93
|
+
process.exit(1);
|
|
94
|
+
}
|
|
95
|
+
const webhookManager = new WebhookManager({ db, logLevel: config.logLevel });
|
|
96
|
+
// Metrics: create instance if enabled in config
|
|
97
|
+
const metrics = config.metricsEnabled
|
|
98
|
+
? new AegisMetrics({ vault: vaultInstance })
|
|
99
|
+
: undefined;
|
|
100
|
+
const gate = new Gate({
|
|
101
|
+
port,
|
|
102
|
+
vault: vaultInstance,
|
|
103
|
+
ledger,
|
|
104
|
+
logLevel: config.logLevel,
|
|
105
|
+
tls: tlsConfig,
|
|
106
|
+
agentRegistry: registry,
|
|
107
|
+
requireAgentAuth: effectiveRequireAgentAuth,
|
|
108
|
+
policyDir,
|
|
109
|
+
policyMode: effectivePolicyMode,
|
|
110
|
+
webhooks: webhookManager,
|
|
111
|
+
metrics,
|
|
112
|
+
maxBodySize: config.maxBodySize,
|
|
113
|
+
requestTimeout: config.requestTimeout,
|
|
114
|
+
maxConnectionsPerAgent: config.maxConnectionsPerAgent,
|
|
115
|
+
});
|
|
116
|
+
const protocol = tlsConfig ? 'https' : 'http';
|
|
117
|
+
console.log(`\n ╔══════════════════════════════════╗`);
|
|
118
|
+
console.log(` ║ Aegis Gate ${VERSION.padEnd(13)}║`);
|
|
119
|
+
console.log(` ╚══════════════════════════════════╝\n`);
|
|
120
|
+
if (tlsConfig) {
|
|
121
|
+
console.log(' 🔒 TLS enabled\n');
|
|
122
|
+
}
|
|
123
|
+
else {
|
|
124
|
+
console.log(' ⚠ Running without TLS — credentials are transmitted in cleartext on localhost\n');
|
|
125
|
+
console.log(' To enable TLS: aegis gate --tls (after running aegis init --generate-cert)\n');
|
|
126
|
+
}
|
|
127
|
+
if (effectiveRequireAgentAuth) {
|
|
128
|
+
console.log(' 🔑 Agent authentication required (X-Aegis-Agent header)\n');
|
|
129
|
+
}
|
|
130
|
+
else {
|
|
131
|
+
console.log(' ⚠ Agent authentication disabled (--no-agent-auth) — any localhost process can use credentials\n');
|
|
132
|
+
}
|
|
133
|
+
if (metrics) {
|
|
134
|
+
console.log(' 📊 Metrics enabled (/_aegis/metrics)\n');
|
|
135
|
+
}
|
|
136
|
+
if (policyDir) {
|
|
137
|
+
const modeLabel = effectivePolicyMode === 'dry-run' ? 'DRY-RUN (log only)' : 'ENFORCE (block violations)';
|
|
138
|
+
console.log(` 📋 Policies: ${policyDir}`);
|
|
139
|
+
console.log(` Mode: ${modeLabel}\n`);
|
|
140
|
+
}
|
|
141
|
+
if (config.configFilePath) {
|
|
142
|
+
console.log(` 📄 Config: ${config.configFilePath}\n`);
|
|
143
|
+
}
|
|
144
|
+
const creds = vaultInstance.list();
|
|
145
|
+
if (creds.length === 0) {
|
|
146
|
+
console.log(' ⚠ No credentials in vault. Add some first: aegis vault add\n');
|
|
147
|
+
}
|
|
148
|
+
else {
|
|
149
|
+
console.log(` ${creds.length} credential(s) loaded:\n`);
|
|
150
|
+
for (const c of creds) {
|
|
151
|
+
console.log(` ${c.service} → ${c.domains.join(', ')} (${c.authType})`);
|
|
152
|
+
}
|
|
153
|
+
console.log();
|
|
154
|
+
}
|
|
155
|
+
try {
|
|
156
|
+
await gate.start();
|
|
157
|
+
}
|
|
158
|
+
catch (err) {
|
|
159
|
+
const message = err instanceof Error ? err.message : String(err);
|
|
160
|
+
console.error(`\n✗ Failed to start Gate: ${message}\n`);
|
|
161
|
+
db.close();
|
|
162
|
+
process.exit(1);
|
|
163
|
+
}
|
|
164
|
+
console.log(` Agent config: set your agent's base URL to ${protocol}://localhost:${port}`);
|
|
165
|
+
console.log(` Example: curl ${protocol}://localhost:${port}/slack/api/chat.postMessage\n`);
|
|
166
|
+
console.log(` Press Ctrl+C to stop.\n`);
|
|
167
|
+
// Graceful shutdown
|
|
168
|
+
let shutdownInProgress = false;
|
|
169
|
+
const shutdown = async () => {
|
|
170
|
+
if (shutdownInProgress) {
|
|
171
|
+
console.log('\n Force shutdown — terminating immediately.');
|
|
172
|
+
process.exit(1);
|
|
173
|
+
}
|
|
174
|
+
shutdownInProgress = true;
|
|
175
|
+
console.log('\n Shutting down Aegis Gate...');
|
|
176
|
+
console.log(' (Press Ctrl+C again to force quit)\n');
|
|
177
|
+
const result = await gate.stop();
|
|
178
|
+
if (result.drained) {
|
|
179
|
+
console.log(' All in-flight requests completed.');
|
|
180
|
+
}
|
|
181
|
+
else {
|
|
182
|
+
console.log(` Shutdown timed out — ${result.activeAtClose} request(s) were still in-flight.`);
|
|
183
|
+
}
|
|
184
|
+
// Log shutdown event to Ledger as a system event
|
|
185
|
+
ledger.logSystem({
|
|
186
|
+
service: '_aegis',
|
|
187
|
+
targetDomain: 'localhost',
|
|
188
|
+
method: 'SHUTDOWN',
|
|
189
|
+
path: '/',
|
|
190
|
+
reason: result.drained
|
|
191
|
+
? 'Graceful shutdown — all requests drained'
|
|
192
|
+
: `Forced shutdown — ${result.activeAtClose} request(s) still active`,
|
|
193
|
+
});
|
|
194
|
+
db.close();
|
|
195
|
+
console.log(' Aegis Gate stopped.\n');
|
|
196
|
+
process.exit(0);
|
|
197
|
+
};
|
|
198
|
+
process.on('SIGINT', shutdown);
|
|
199
|
+
process.on('SIGTERM', shutdown);
|
|
200
|
+
});
|
|
201
|
+
}
|
|
202
|
+
//# sourceMappingURL=gate.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"gate.js","sourceRoot":"","sources":["../../../src/cli/commands/gate.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"init.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/init.ts"],"names":[],"mappings":"AAAA;;GAEG;AAKH,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAMzC,wBAAgB,QAAQ,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CAwL/C"}
|
|
@@ -0,0 +1,175 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Init command: generate master key, config file, and data directory.
|
|
3
|
+
*/
|
|
4
|
+
import * as crypto from 'node:crypto';
|
|
5
|
+
import * as fs from 'node:fs';
|
|
6
|
+
import * as path from 'node:path';
|
|
7
|
+
import { FileFallbackStorage } from '../../key-storage/file-fallback.js';
|
|
8
|
+
import { getKeyStorage } from '../../key-storage/index.js';
|
|
9
|
+
import { VaultManager } from '../../vault/index.js';
|
|
10
|
+
import { generateSelfSignedCert } from '../helpers.js';
|
|
11
|
+
export function register(program) {
|
|
12
|
+
program
|
|
13
|
+
.command('init')
|
|
14
|
+
.description('Initialize Aegis — generate master key, config file, and data directory')
|
|
15
|
+
.option('--write-secrets', 'Write master key to config file (convenient but less secure)', false)
|
|
16
|
+
.option('--env-file', 'Store master key in .env file instead of OS keychain (for CI/headless)', false)
|
|
17
|
+
.option('--generate-cert', 'Generate a self-signed TLS certificate for local dev use', false)
|
|
18
|
+
.action((opts) => {
|
|
19
|
+
const configPath = path.join(process.cwd(), 'aegis.config.yaml');
|
|
20
|
+
if (fs.existsSync(configPath)) {
|
|
21
|
+
console.log('\n aegis.config.yaml already exists. To reinitialize, remove it first:\n');
|
|
22
|
+
console.log(' rm aegis.config.yaml && aegis init\n');
|
|
23
|
+
process.exit(1);
|
|
24
|
+
}
|
|
25
|
+
const masterKey = crypto.randomBytes(32).toString('hex');
|
|
26
|
+
const dataDir = path.join(process.cwd(), '.aegis');
|
|
27
|
+
if (!fs.existsSync(dataDir)) {
|
|
28
|
+
fs.mkdirSync(dataDir, { recursive: true });
|
|
29
|
+
}
|
|
30
|
+
// Create the "default" vault through VaultManager (skip if it already exists)
|
|
31
|
+
const manager = new VaultManager(dataDir);
|
|
32
|
+
let salt;
|
|
33
|
+
const existingVaults = manager.list();
|
|
34
|
+
const existing = existingVaults.find((v) => v.name === 'default');
|
|
35
|
+
if (existing) {
|
|
36
|
+
salt = existing.salt;
|
|
37
|
+
}
|
|
38
|
+
else {
|
|
39
|
+
const created = manager.create('default', masterKey);
|
|
40
|
+
salt = created.salt;
|
|
41
|
+
}
|
|
42
|
+
// ── Store master key ────────────────────────────────────────
|
|
43
|
+
let keyStorageMethod = 'shown';
|
|
44
|
+
if (opts.writeSecrets) {
|
|
45
|
+
// Stored in config file (legacy flag)
|
|
46
|
+
keyStorageMethod = 'config-file';
|
|
47
|
+
}
|
|
48
|
+
else if (opts.envFile) {
|
|
49
|
+
// Stored in .env file (CI/headless mode)
|
|
50
|
+
const envPath = path.join(process.cwd(), '.env');
|
|
51
|
+
let envContent = '';
|
|
52
|
+
if (fs.existsSync(envPath)) {
|
|
53
|
+
envContent = fs.readFileSync(envPath, 'utf-8');
|
|
54
|
+
// Remove existing AEGIS_MASTER_KEY line if present
|
|
55
|
+
envContent = envContent.replace(/^AEGIS_MASTER_KEY=.*\n?/m, '');
|
|
56
|
+
}
|
|
57
|
+
envContent += `AEGIS_MASTER_KEY=${masterKey}\n`;
|
|
58
|
+
fs.writeFileSync(envPath, envContent, { mode: 0o600 });
|
|
59
|
+
keyStorageMethod = 'env-file';
|
|
60
|
+
}
|
|
61
|
+
else {
|
|
62
|
+
// Default: store in OS keychain
|
|
63
|
+
const keyStorage = getKeyStorage(dataDir);
|
|
64
|
+
if (keyStorage.backend !== 'file' && keyStorage.isAvailable()) {
|
|
65
|
+
try {
|
|
66
|
+
keyStorage.setKey(masterKey);
|
|
67
|
+
keyStorageMethod = 'keychain';
|
|
68
|
+
}
|
|
69
|
+
catch {
|
|
70
|
+
// Keychain failed — auto-fallback to file storage
|
|
71
|
+
console.log('\n ⚠ OS keychain storage failed. Falling back to file storage.');
|
|
72
|
+
try {
|
|
73
|
+
const fileFallback = new FileFallbackStorage(dataDir);
|
|
74
|
+
fileFallback.setKey(masterKey);
|
|
75
|
+
keyStorageMethod = 'keychain'; // auto-stored in file fallback
|
|
76
|
+
console.log(` Key stored in ${dataDir}/.master-key (mode 0600)`);
|
|
77
|
+
console.log(' For better security, re-run with --env-file or fix your OS keychain.\n');
|
|
78
|
+
}
|
|
79
|
+
catch {
|
|
80
|
+
// File fallback also failed — show the key
|
|
81
|
+
console.log(' File fallback also failed. Displaying key for manual storage.\n');
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
}
|
|
85
|
+
else {
|
|
86
|
+
// No OS keychain available — store in file fallback
|
|
87
|
+
keyStorage.setKey(masterKey);
|
|
88
|
+
keyStorageMethod = 'keychain'; // File fallback is still auto-stored
|
|
89
|
+
}
|
|
90
|
+
}
|
|
91
|
+
const masterKeyLine = opts.writeSecrets
|
|
92
|
+
? ` master_key: "${masterKey}" # ⚠ stored in file — use OS keychain or env var for production`
|
|
93
|
+
: ' # master_key: stored in OS keychain (run "aegis key where" to check)';
|
|
94
|
+
const configContent = `# Aegis Configuration — generated by aegis init
|
|
95
|
+
# CLI flags override these values. Environment variables (AEGIS_*) override both.
|
|
96
|
+
|
|
97
|
+
gate:
|
|
98
|
+
port: 3100
|
|
99
|
+
# tls:
|
|
100
|
+
# cert: ./certs/aegis.crt
|
|
101
|
+
# key: ./certs/aegis.key
|
|
102
|
+
# require_agent_auth: false
|
|
103
|
+
|
|
104
|
+
vault:
|
|
105
|
+
${masterKeyLine}
|
|
106
|
+
name: default
|
|
107
|
+
data_dir: ./.aegis
|
|
108
|
+
|
|
109
|
+
observability:
|
|
110
|
+
log_level: info
|
|
111
|
+
log_format: pretty
|
|
112
|
+
metrics: true
|
|
113
|
+
# dashboard:
|
|
114
|
+
# enabled: true
|
|
115
|
+
# port: 3200
|
|
116
|
+
|
|
117
|
+
# policies:
|
|
118
|
+
# dir: ./policies
|
|
119
|
+
# mode: enforce
|
|
120
|
+
|
|
121
|
+
# mcp:
|
|
122
|
+
# transport: stdio
|
|
123
|
+
# port: 3200
|
|
124
|
+
|
|
125
|
+
# webhooks: []
|
|
126
|
+
`;
|
|
127
|
+
if (opts.writeSecrets) {
|
|
128
|
+
fs.writeFileSync(configPath, configContent, { mode: 0o600 });
|
|
129
|
+
}
|
|
130
|
+
else {
|
|
131
|
+
fs.writeFileSync(configPath, configContent, { mode: 0o644 });
|
|
132
|
+
}
|
|
133
|
+
console.log('\n ╔══════════════════════════════════╗');
|
|
134
|
+
console.log(' ║ Aegis Initialized ✓ ║');
|
|
135
|
+
console.log(' ╚══════════════════════════════════╝\n');
|
|
136
|
+
console.log(' Config file: aegis.config.yaml');
|
|
137
|
+
console.log(' Default vault created (salt stored in vault registry)');
|
|
138
|
+
// ── Key storage output ──────────────────────────────────────
|
|
139
|
+
const keyStorage = getKeyStorage(dataDir);
|
|
140
|
+
switch (keyStorageMethod) {
|
|
141
|
+
case 'keychain':
|
|
142
|
+
console.log(`\n ✓ Master key stored in ${keyStorage.name}`);
|
|
143
|
+
console.log(' The key is encrypted by your OS and never touches disk as plaintext.');
|
|
144
|
+
console.log(' Run "aegis key where" to verify.\n');
|
|
145
|
+
break;
|
|
146
|
+
case 'env-file':
|
|
147
|
+
console.log('\n Master key saved to .env (mode 0600)');
|
|
148
|
+
console.log(' ⚠ This file contains your master key in plaintext.');
|
|
149
|
+
console.log(' Add .env to .gitignore if not already present.\n');
|
|
150
|
+
break;
|
|
151
|
+
case 'config-file':
|
|
152
|
+
console.log(' Master key saved to aegis.config.yaml (mode 0600)\n');
|
|
153
|
+
break;
|
|
154
|
+
case 'shown':
|
|
155
|
+
console.log('\n ⚠ Store the following secret securely — it will NOT be shown again.\n');
|
|
156
|
+
console.log(` AEGIS_MASTER_KEY=${masterKey}\n`);
|
|
157
|
+
console.log(' Export it in your shell profile or use a secrets manager:');
|
|
158
|
+
console.log(` export AEGIS_MASTER_KEY=${masterKey}\n`);
|
|
159
|
+
console.log(' Or re-run with --write-secrets to save it to the config file (less secure):');
|
|
160
|
+
console.log(' rm aegis.config.yaml && aegis init --write-secrets');
|
|
161
|
+
break;
|
|
162
|
+
}
|
|
163
|
+
console.log(` Vault salt: ${salt} (stored in .aegis/vaults.json)`);
|
|
164
|
+
console.log(' Data directory: ./.aegis\n');
|
|
165
|
+
console.log(' Next steps:');
|
|
166
|
+
console.log(' 1. Add a credential: aegis vault add --name slack --service slack --secret xoxb-... --domains api.slack.com');
|
|
167
|
+
console.log(' 2. Start the gate: aegis gate');
|
|
168
|
+
console.log(' 3. Point your agent: http://localhost:3100/{service}/api/path\n');
|
|
169
|
+
// Generate self-signed TLS certificate for local dev
|
|
170
|
+
if (opts.generateCert) {
|
|
171
|
+
generateSelfSignedCert(process.cwd());
|
|
172
|
+
}
|
|
173
|
+
});
|
|
174
|
+
}
|
|
175
|
+
//# sourceMappingURL=init.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"init.js","sourceRoot":"","sources":["../../../src/cli/commands/init.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"key.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/key.ts"],"names":[],"mappings":"AAAA;;GAEG;AAGH,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAIzC,wBAAgB,QAAQ,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CAgD/C"}
|