@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.
Files changed (242) hide show
  1. package/README.md +43 -14
  2. package/dist/agent/agent.d.ts +98 -0
  3. package/dist/agent/agent.d.ts.map +1 -0
  4. package/dist/agent/agent.js +212 -0
  5. package/dist/agent/agent.js.map +1 -0
  6. package/dist/agent/index.d.ts +3 -0
  7. package/dist/agent/index.d.ts.map +1 -0
  8. package/dist/agent/index.js +2 -0
  9. package/dist/agent/index.js.map +1 -0
  10. package/dist/cli/auth.d.ts +19 -0
  11. package/dist/cli/auth.d.ts.map +1 -0
  12. package/dist/cli/auth.js +44 -0
  13. package/dist/cli/auth.js.map +1 -0
  14. package/dist/cli/commands/agent.d.ts +6 -0
  15. package/dist/cli/commands/agent.d.ts.map +1 -0
  16. package/dist/cli/commands/agent.js +241 -0
  17. package/dist/cli/commands/agent.js.map +1 -0
  18. package/dist/cli/commands/config.d.ts +6 -0
  19. package/dist/cli/commands/config.d.ts.map +1 -0
  20. package/dist/cli/commands/config.js +125 -0
  21. package/dist/cli/commands/config.js.map +1 -0
  22. package/dist/cli/commands/dashboard.d.ts +6 -0
  23. package/dist/cli/commands/dashboard.d.ts.map +1 -0
  24. package/dist/cli/commands/dashboard.js +195 -0
  25. package/dist/cli/commands/dashboard.js.map +1 -0
  26. package/dist/cli/commands/db.d.ts +6 -0
  27. package/dist/cli/commands/db.d.ts.map +1 -0
  28. package/dist/cli/commands/db.js +139 -0
  29. package/dist/cli/commands/db.js.map +1 -0
  30. package/dist/cli/commands/doctor.d.ts +6 -0
  31. package/dist/cli/commands/doctor.d.ts.map +1 -0
  32. package/dist/cli/commands/doctor.js +39 -0
  33. package/dist/cli/commands/doctor.js.map +1 -0
  34. package/dist/cli/commands/gate.d.ts +6 -0
  35. package/dist/cli/commands/gate.d.ts.map +1 -0
  36. package/dist/cli/commands/gate.js +202 -0
  37. package/dist/cli/commands/gate.js.map +1 -0
  38. package/dist/cli/commands/init.d.ts +6 -0
  39. package/dist/cli/commands/init.d.ts.map +1 -0
  40. package/dist/cli/commands/init.js +175 -0
  41. package/dist/cli/commands/init.js.map +1 -0
  42. package/dist/cli/commands/key.d.ts +6 -0
  43. package/dist/cli/commands/key.d.ts.map +1 -0
  44. package/dist/cli/commands/key.js +49 -0
  45. package/dist/cli/commands/key.js.map +1 -0
  46. package/dist/cli/commands/ledger.d.ts +6 -0
  47. package/dist/cli/commands/ledger.d.ts.map +1 -0
  48. package/dist/cli/commands/ledger.js +140 -0
  49. package/dist/cli/commands/ledger.js.map +1 -0
  50. package/dist/cli/commands/mcp.d.ts +6 -0
  51. package/dist/cli/commands/mcp.d.ts.map +1 -0
  52. package/dist/cli/commands/mcp.js +224 -0
  53. package/dist/cli/commands/mcp.js.map +1 -0
  54. package/dist/cli/commands/policy.d.ts +6 -0
  55. package/dist/cli/commands/policy.d.ts.map +1 -0
  56. package/dist/cli/commands/policy.js +126 -0
  57. package/dist/cli/commands/policy.js.map +1 -0
  58. package/dist/cli/commands/user.d.ts +6 -0
  59. package/dist/cli/commands/user.d.ts.map +1 -0
  60. package/dist/cli/commands/user.js +150 -0
  61. package/dist/cli/commands/user.js.map +1 -0
  62. package/dist/cli/commands/vault-manager.d.ts +6 -0
  63. package/dist/cli/commands/vault-manager.d.ts.map +1 -0
  64. package/dist/cli/commands/vault-manager.js +240 -0
  65. package/dist/cli/commands/vault-manager.js.map +1 -0
  66. package/dist/cli/commands/vault.d.ts +6 -0
  67. package/dist/cli/commands/vault.d.ts.map +1 -0
  68. package/dist/cli/commands/vault.js +265 -0
  69. package/dist/cli/commands/vault.js.map +1 -0
  70. package/dist/cli/commands/webhook.d.ts +6 -0
  71. package/dist/cli/commands/webhook.d.ts.map +1 -0
  72. package/dist/cli/commands/webhook.js +151 -0
  73. package/dist/cli/commands/webhook.js.map +1 -0
  74. package/dist/cli/helpers.d.ts +12 -0
  75. package/dist/cli/helpers.d.ts.map +1 -0
  76. package/dist/cli/helpers.js +61 -0
  77. package/dist/cli/helpers.js.map +1 -0
  78. package/dist/cli/index.d.ts +19 -0
  79. package/dist/cli/index.d.ts.map +1 -0
  80. package/dist/cli/index.js +19 -0
  81. package/dist/cli/index.js.map +1 -0
  82. package/dist/cli/validation.d.ts +37 -0
  83. package/dist/cli/validation.d.ts.map +1 -0
  84. package/dist/cli/validation.js +104 -0
  85. package/dist/cli/validation.js.map +1 -0
  86. package/dist/cli.d.ts +3 -0
  87. package/dist/cli.d.ts.map +1 -0
  88. package/dist/cli.js +37 -0
  89. package/dist/cli.js.map +1 -0
  90. package/dist/config.d.ts +120 -0
  91. package/dist/config.d.ts.map +1 -0
  92. package/dist/config.js +401 -0
  93. package/dist/config.js.map +1 -0
  94. package/dist/dashboard/dashboard-server.d.ts +95 -0
  95. package/dist/dashboard/dashboard-server.d.ts.map +1 -0
  96. package/dist/dashboard/dashboard-server.js +329 -0
  97. package/dist/dashboard/dashboard-server.js.map +1 -0
  98. package/dist/dashboard/index.d.ts +3 -0
  99. package/dist/dashboard/index.d.ts.map +1 -0
  100. package/dist/dashboard/index.js +2 -0
  101. package/dist/dashboard/index.js.map +1 -0
  102. package/dist/dashboard/public/assets/index-Cah0_BKk.js +148 -0
  103. package/dist/dashboard/public/assets/index-CpMruPNh.css +1 -0
  104. package/dist/dashboard/public/favicon.svg +6 -0
  105. package/dist/dashboard/public/index.html +14 -0
  106. package/dist/db.d.ts +27 -0
  107. package/dist/db.d.ts.map +1 -0
  108. package/dist/db.js +209 -0
  109. package/dist/db.js.map +1 -0
  110. package/dist/doctor.d.ts +37 -0
  111. package/dist/doctor.d.ts.map +1 -0
  112. package/dist/doctor.js +216 -0
  113. package/dist/doctor.js.map +1 -0
  114. package/dist/gate/body-inspector.d.ts +31 -0
  115. package/dist/gate/body-inspector.d.ts.map +1 -0
  116. package/dist/gate/body-inspector.js +193 -0
  117. package/dist/gate/body-inspector.js.map +1 -0
  118. package/dist/gate/gate.d.ts +190 -0
  119. package/dist/gate/gate.d.ts.map +1 -0
  120. package/dist/gate/gate.js +1243 -0
  121. package/dist/gate/gate.js.map +1 -0
  122. package/dist/gate/index.d.ts +7 -0
  123. package/dist/gate/index.d.ts.map +1 -0
  124. package/dist/gate/index.js +4 -0
  125. package/dist/gate/index.js.map +1 -0
  126. package/dist/gate/rate-limiter.d.ts +59 -0
  127. package/dist/gate/rate-limiter.d.ts.map +1 -0
  128. package/dist/gate/rate-limiter.js +120 -0
  129. package/dist/gate/rate-limiter.js.map +1 -0
  130. package/dist/index.d.ts +28 -0
  131. package/dist/index.d.ts.map +1 -0
  132. package/dist/index.js +17 -0
  133. package/dist/index.js.map +1 -0
  134. package/dist/key-storage/credential-manager-windows.d.ts +19 -0
  135. package/dist/key-storage/credential-manager-windows.d.ts.map +1 -0
  136. package/dist/key-storage/credential-manager-windows.js +87 -0
  137. package/dist/key-storage/credential-manager-windows.js.map +1 -0
  138. package/dist/key-storage/file-fallback.d.ts +21 -0
  139. package/dist/key-storage/file-fallback.d.ts.map +1 -0
  140. package/dist/key-storage/file-fallback.js +62 -0
  141. package/dist/key-storage/file-fallback.js.map +1 -0
  142. package/dist/key-storage/index.d.ts +6 -0
  143. package/dist/key-storage/index.d.ts.map +1 -0
  144. package/dist/key-storage/index.js +6 -0
  145. package/dist/key-storage/index.js.map +1 -0
  146. package/dist/key-storage/key-storage.d.ts +41 -0
  147. package/dist/key-storage/key-storage.d.ts.map +1 -0
  148. package/dist/key-storage/key-storage.js +70 -0
  149. package/dist/key-storage/key-storage.js.map +1 -0
  150. package/dist/key-storage/keychain-macos.d.ts +19 -0
  151. package/dist/key-storage/keychain-macos.d.ts.map +1 -0
  152. package/dist/key-storage/keychain-macos.js +51 -0
  153. package/dist/key-storage/keychain-macos.js.map +1 -0
  154. package/dist/key-storage/secret-service-linux.d.ts +19 -0
  155. package/dist/key-storage/secret-service-linux.d.ts.map +1 -0
  156. package/dist/key-storage/secret-service-linux.js +55 -0
  157. package/dist/key-storage/secret-service-linux.js.map +1 -0
  158. package/dist/ledger/index.d.ts +3 -0
  159. package/dist/ledger/index.d.ts.map +1 -0
  160. package/dist/ledger/index.js +2 -0
  161. package/dist/ledger/index.js.map +1 -0
  162. package/dist/ledger/ledger.d.ts +98 -0
  163. package/dist/ledger/ledger.d.ts.map +1 -0
  164. package/dist/ledger/ledger.js +145 -0
  165. package/dist/ledger/ledger.js.map +1 -0
  166. package/dist/logger/index.d.ts +3 -0
  167. package/dist/logger/index.d.ts.map +1 -0
  168. package/dist/logger/index.js +2 -0
  169. package/dist/logger/index.js.map +1 -0
  170. package/dist/logger/logger.d.ts +58 -0
  171. package/dist/logger/logger.d.ts.map +1 -0
  172. package/dist/logger/logger.js +201 -0
  173. package/dist/logger/logger.js.map +1 -0
  174. package/dist/mcp/index.d.ts +3 -0
  175. package/dist/mcp/index.d.ts.map +1 -0
  176. package/dist/mcp/index.js +2 -0
  177. package/dist/mcp/index.js.map +1 -0
  178. package/dist/mcp/mcp-server.d.ts +130 -0
  179. package/dist/mcp/mcp-server.d.ts.map +1 -0
  180. package/dist/mcp/mcp-server.js +775 -0
  181. package/dist/mcp/mcp-server.js.map +1 -0
  182. package/dist/metrics/index.d.ts +3 -0
  183. package/dist/metrics/index.d.ts.map +1 -0
  184. package/dist/metrics/index.js +2 -0
  185. package/dist/metrics/index.js.map +1 -0
  186. package/dist/metrics/metrics.d.ts +88 -0
  187. package/dist/metrics/metrics.d.ts.map +1 -0
  188. package/dist/metrics/metrics.js +179 -0
  189. package/dist/metrics/metrics.js.map +1 -0
  190. package/dist/policy/index.d.ts +3 -0
  191. package/dist/policy/index.d.ts.map +1 -0
  192. package/dist/policy/index.js +2 -0
  193. package/dist/policy/index.js.map +1 -0
  194. package/dist/policy/policy.d.ts +119 -0
  195. package/dist/policy/policy.d.ts.map +1 -0
  196. package/dist/policy/policy.js +426 -0
  197. package/dist/policy/policy.js.map +1 -0
  198. package/dist/user/index.d.ts +3 -0
  199. package/dist/user/index.d.ts.map +1 -0
  200. package/dist/user/index.js +2 -0
  201. package/dist/user/index.js.map +1 -0
  202. package/dist/user/user.d.ts +102 -0
  203. package/dist/user/user.d.ts.map +1 -0
  204. package/dist/user/user.js +216 -0
  205. package/dist/user/user.js.map +1 -0
  206. package/dist/vault/crypto.d.ts +28 -0
  207. package/dist/vault/crypto.d.ts.map +1 -0
  208. package/dist/vault/crypto.js +44 -0
  209. package/dist/vault/crypto.js.map +1 -0
  210. package/dist/vault/index.d.ts +10 -0
  211. package/dist/vault/index.d.ts.map +1 -0
  212. package/dist/vault/index.js +6 -0
  213. package/dist/vault/index.js.map +1 -0
  214. package/dist/vault/seal.d.ts +68 -0
  215. package/dist/vault/seal.d.ts.map +1 -0
  216. package/dist/vault/seal.js +110 -0
  217. package/dist/vault/seal.js.map +1 -0
  218. package/dist/vault/shamir.d.ts +33 -0
  219. package/dist/vault/shamir.d.ts.map +1 -0
  220. package/dist/vault/shamir.js +174 -0
  221. package/dist/vault/shamir.js.map +1 -0
  222. package/dist/vault/vault-manager.d.ts +62 -0
  223. package/dist/vault/vault-manager.d.ts.map +1 -0
  224. package/dist/vault/vault-manager.js +151 -0
  225. package/dist/vault/vault-manager.js.map +1 -0
  226. package/dist/vault/vault.d.ts +104 -0
  227. package/dist/vault/vault.d.ts.map +1 -0
  228. package/dist/vault/vault.js +259 -0
  229. package/dist/vault/vault.js.map +1 -0
  230. package/dist/version.d.ts +3 -0
  231. package/dist/version.d.ts.map +1 -0
  232. package/dist/version.js +18 -0
  233. package/dist/version.js.map +1 -0
  234. package/dist/webhook/index.d.ts +3 -0
  235. package/dist/webhook/index.d.ts.map +1 -0
  236. package/dist/webhook/index.js +2 -0
  237. package/dist/webhook/index.js.map +1 -0
  238. package/dist/webhook/webhook.d.ts +114 -0
  239. package/dist/webhook/webhook.d.ts.map +1 -0
  240. package/dist/webhook/webhook.js +269 -0
  241. package/dist/webhook/webhook.js.map +1 -0
  242. 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,6 @@
1
+ /**
2
+ * Doctor command: run health checks on the Aegis installation.
3
+ */
4
+ import type { Command } from 'commander';
5
+ export declare function register(program: Command): void;
6
+ //# sourceMappingURL=doctor.d.ts.map
@@ -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,6 @@
1
+ /**
2
+ * Gate command: start the Aegis Gate proxy.
3
+ */
4
+ import type { Command } from 'commander';
5
+ export declare function register(program: Command): void;
6
+ //# sourceMappingURL=gate.d.ts.map
@@ -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":"AAAA;;GAEG;AAEH,OAAO,KAAK,EAAE,MAAM,SAAS,CAAC;AAC9B,OAAO,KAAK,IAAI,MAAM,WAAW,CAAC;AAElC,OAAO,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AACrD,OAAO,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAC5C,OAAO,EAAE,KAAK,EAAE,YAAY,EAAE,OAAO,EAAE,MAAM,aAAa,CAAC;AAC3D,OAAO,EAAE,IAAI,EAAE,MAAM,qBAAqB,CAAC;AAC3C,OAAO,EAAE,MAAM,EAAE,MAAM,uBAAuB,CAAC;AAC/C,OAAO,EAAE,YAAY,EAAE,MAAM,wBAAwB,CAAC;AACtD,OAAO,EAAE,SAAS,EAAE,KAAK,EAAE,MAAM,sBAAsB,CAAC;AACxD,OAAO,EAAE,OAAO,EAAE,MAAM,kBAAkB,CAAC;AAC3C,OAAO,EAAE,cAAc,EAAE,MAAM,wBAAwB,CAAC;AACxD,OAAO,EAAE,eAAe,EAAE,MAAM,YAAY,CAAC;AAC7C,OAAO,EAAE,kBAAkB,EAAE,YAAY,EAAE,YAAY,EAAE,MAAM,kBAAkB,CAAC;AAElF,MAAM,UAAU,QAAQ,CAAC,OAAgB;IACvC,OAAO;SACJ,OAAO,CAAC,MAAM,CAAC;SACf,WAAW,CAAC,4BAA4B,CAAC;SACzC,MAAM,CAAC,mBAAmB,EAAE,mBAAmB,CAAC;SAChD,MAAM,CAAC,OAAO,EAAE,4BAA4B,CAAC;SAC7C,MAAM,CAAC,eAAe,EAAE,oCAAoC,CAAC;SAC7D,MAAM,CAAC,cAAc,EAAE,oCAAoC,CAAC;SAC5D,MAAM,CACL,iBAAiB,EACjB,gFAAgF,CACjF;SACA,MAAM,CAAC,uBAAuB,EAAE,wCAAwC,CAAC;SACzE,MAAM,CAAC,sBAAsB,EAAE,mDAAmD,CAAC;SACnF,MAAM,CACL,KAAK,EAAE,IAQN,EAAE,EAAE;QACH,2BAA2B;QAC3B,IAAI,IAAI,CAAC,IAAI,EAAE,CAAC;YACd,MAAM,CAAC,GAAG,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC;YACzC,YAAY,CAAC,CAAC,EAAE,WAAW,CAAC,CAAC;QAC/B,CAAC;QACD,IAAI,IAAI,CAAC,UAAU,EAAE,CAAC;YACpB,YAAY,CAAC,IAAI,CAAC,UAAU,EAAE,kBAAkB,EAAE,aAAa,CAAC,CAAC;QACnE,CAAC;QAED,IAAI,MAAoC,CAAC;QACzC,IAAI,CAAC;YACH,MAAM,GAAG,SAAS,EAAE,CAAC;QACvB,CAAC;QAAC,OAAO,GAAY,EAAE,CAAC;YACtB,MAAM,GAAG,GAAG,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;YAC7D,OAAO,CAAC,KAAK,CAAC,OAAO,GAAG,IAAI,CAAC,CAAC;YAC9B,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC;QACD,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC;QAEtE,IAAI,EAA4B,CAAC;QACjC,IAAI,CAAC;YACH,EAAE,GAAG,KAAK,CAAC,MAAM,CAAC,CAAC;YACnB,OAAO,CAAC,EAAE,CAAC,CAAC;QACd,CAAC;QAAC,OAAO,GAAY,EAAE,CAAC;YACtB,MAAM,GAAG,GAAG,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;YAC7D,OAAO,CAAC,KAAK,CAAC,6BAA6B,GAAG,IAAI,CAAC,CAAC;YACpD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC;QAED,IAAI,CAAC,MAAM,CAAC,SAAS,EAAE,CAAC;YACtB,OAAO,CAAC,KAAK,CACX,6FAA6F,CAC9F,CAAC;YACF,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC;QAED,MAAM,GAAG,GAAG,SAAS,CAAC,MAAM,CAAC,SAAS,EAAE,YAAY,CAAC,MAAM,CAAC,CAAC,CAAC;QAC9D,eAAe,CAAC,EAAE,EAAE,GAAG,EAAE,YAAY,CAAC,CAAC;QAEvC,MAAM,aAAa,GAAG,IAAI,KAAK,CAAC,EAAE,EAAE,MAAM,CAAC,SAAS,EAAE,YAAY,CAAC,MAAM,CAAC,CAAC,CAAC;QAC5E,MAAM,MAAM,GAAG,IAAI,MAAM,CAAC,EAAE,CAAC,CAAC;QAE9B,uCAAuC;QACvC,MAAM,MAAM,GAAG,IAAI,CAAC,GAAG,IAAI,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC;QACxC,IAAI,SAA4D,CAAC;QACjE,IAAI,MAAM,EAAE,CAAC;YACX,MAAM,QAAQ,GACZ,IAAI,CAAC,IAAI,IAAI,MAAM,CAAC,GAAG,EAAE,IAAI,IAAI,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,OAAO,EAAE,WAAW,CAAC,CAAC;YAClF,MAAM,OAAO,GACX,IAAI,CAAC,GAAG,IAAI,MAAM,CAAC,GAAG,EAAE,GAAG,IAAI,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,OAAO,EAAE,WAAW,CAAC,CAAC;YAEhF,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,QAAQ,CAAC,EAAE,CAAC;gBAC7B,OAAO,CAAC,KAAK,CACX,oCAAoC,QAAQ,4IAA4I,CACzL,CAAC;gBACF,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;YAClB,CAAC;YACD,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,OAAO,CAAC,EAAE,CAAC;gBAC5B,OAAO,CAAC,KAAK,CACX,oCAAoC,OAAO,4IAA4I,CACxL,CAAC;gBACF,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;YAClB,CAAC;YAED,SAAS,GAAG,EAAE,QAAQ,EAAE,OAAO,EAAE,CAAC;QACpC,CAAC;QAED,MAAM,QAAQ,GAAG,IAAI,aAAa,CAAC,EAAE,EAAE,GAAG,CAAC,CAAC;QAE5C,0CAA0C;QAC1C,MAAM,yBAAyB,GAC7B,IAAI,CAAC,SAAS,KAAK,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,MAAM,CAAC,gBAAgB,CAAC;QAC1E,MAAM,mBAAmB,GACtB,IAAI,CAAC,UAAgD;YACtD,CAAC,MAAM,CAAC,UAAU,KAAK,KAAK,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAE,MAAM,CAAC,UAAoC,CAAC,CAAC;QAC3F,MAAM,SAAS,GAAG,IAAI,CAAC,WAAW;YAChC,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,WAAW,CAAC;YAChC,CAAC,CAAC,MAAM,CAAC,WAAW;gBAClB,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,WAAW,CAAC;gBAClC,CAAC,CAAC,SAAS,CAAC;QAEhB,IAAI,SAAS,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,SAAS,CAAC,EAAE,CAAC;YAC3C,OAAO,CAAC,KAAK,CACX,qCAAqC,SAAS,mEAAmE,CAClH,CAAC;YACF,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC;QAED,MAAM,cAAc,GAAG,IAAI,cAAc,CAAC,EAAE,EAAE,EAAE,QAAQ,EAAE,MAAM,CAAC,QAAQ,EAAE,CAAC,CAAC;QAE7E,gDAAgD;QAChD,MAAM,OAAO,GAAG,MAAM,CAAC,cAAc;YACnC,CAAC,CAAC,IAAI,YAAY,CAAC,EAAE,KAAK,EAAE,aAAa,EAAE,CAAC;YAC5C,CAAC,CAAC,SAAS,CAAC;QAEd,MAAM,IAAI,GAAG,IAAI,IAAI,CAAC;YACpB,IAAI;YACJ,KAAK,EAAE,aAAa;YACpB,MAAM;YACN,QAAQ,EAAE,MAAM,CAAC,QAAQ;YACzB,GAAG,EAAE,SAAS;YACd,aAAa,EAAE,QAAQ;YACvB,gBAAgB,EAAE,yBAAyB;YAC3C,SAAS;YACT,UAAU,EAAE,mBAAmB;YAC/B,QAAQ,EAAE,cAAc;YACxB,OAAO;YACP,WAAW,EAAE,MAAM,CAAC,WAAW;YAC/B,cAAc,EAAE,MAAM,CAAC,cAAc;YACrC,sBAAsB,EAAE,MAAM,CAAC,sBAAsB;SACtD,CAAC,CAAC;QAEH,MAAM,QAAQ,GAAG,SAAS,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC;QAE9C,OAAO,CAAC,GAAG,CAAC,0CAA0C,CAAC,CAAC;QACxD,OAAO,CAAC,GAAG,CAAC,0BAA0B,OAAO,CAAC,MAAM,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC;QAC7D,OAAO,CAAC,GAAG,CAAC,0CAA0C,CAAC,CAAC;QAExD,IAAI,SAAS,EAAE,CAAC;YACd,OAAO,CAAC,GAAG,CAAC,oBAAoB,CAAC,CAAC;QACpC,CAAC;aAAM,CAAC;YACN,OAAO,CAAC,GAAG,CACT,oFAAoF,CACrF,CAAC;YACF,OAAO,CAAC,GAAG,CACT,mFAAmF,CACpF,CAAC;QACJ,CAAC;QAED,IAAI,yBAAyB,EAAE,CAAC;YAC9B,OAAO,CAAC,GAAG,CAAC,6DAA6D,CAAC,CAAC;QAC7E,CAAC;aAAM,CAAC;YACN,OAAO,CAAC,GAAG,CACT,oGAAoG,CACrG,CAAC;QACJ,CAAC;QAED,IAAI,OAAO,EAAE,CAAC;YACZ,OAAO,CAAC,GAAG,CAAC,0CAA0C,CAAC,CAAC;QAC1D,CAAC;QAED,IAAI,SAAS,EAAE,CAAC;YACd,MAAM,SAAS,GACb,mBAAmB,KAAK,SAAS,CAAC,CAAC,CAAC,oBAAoB,CAAC,CAAC,CAAC,4BAA4B,CAAC;YAC1F,OAAO,CAAC,GAAG,CAAC,kBAAkB,SAAS,EAAE,CAAC,CAAC;YAC3C,OAAO,CAAC,GAAG,CAAC,kBAAkB,SAAS,IAAI,CAAC,CAAC;QAC/C,CAAC;QAED,IAAI,MAAM,CAAC,cAAc,EAAE,CAAC;YAC1B,OAAO,CAAC,GAAG,CAAC,kBAAkB,MAAM,CAAC,cAAc,IAAI,CAAC,CAAC;QAC3D,CAAC;QAED,MAAM,KAAK,GAAG,aAAa,CAAC,IAAI,EAAE,CAAC;QACnC,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACvB,OAAO,CAAC,GAAG,CAAC,gEAAgE,CAAC,CAAC;QAChF,CAAC;aAAM,CAAC;YACN,OAAO,CAAC,GAAG,CAAC,KAAK,KAAK,CAAC,MAAM,0BAA0B,CAAC,CAAC;YACzD,KAAK,MAAM,CAAC,IAAI,KAAK,EAAE,CAAC;gBACtB,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,OAAO,MAAM,CAAC,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,QAAQ,GAAG,CAAC,CAAC;YAC5E,CAAC;YACD,OAAO,CAAC,GAAG,EAAE,CAAC;QAChB,CAAC;QAED,IAAI,CAAC;YACH,MAAM,IAAI,CAAC,KAAK,EAAE,CAAC;QACrB,CAAC;QAAC,OAAO,GAAY,EAAE,CAAC;YACtB,MAAM,OAAO,GAAG,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;YACjE,OAAO,CAAC,KAAK,CAAC,6BAA6B,OAAO,IAAI,CAAC,CAAC;YACxD,EAAE,CAAC,KAAK,EAAE,CAAC;YACX,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC;QAED,OAAO,CAAC,GAAG,CAAC,gDAAgD,QAAQ,gBAAgB,IAAI,EAAE,CAAC,CAAC;QAC5F,OAAO,CAAC,GAAG,CACT,wBAAwB,QAAQ,gBAAgB,IAAI,+BAA+B,CACpF,CAAC;QACF,OAAO,CAAC,GAAG,CAAC,2BAA2B,CAAC,CAAC;QAEzC,oBAAoB;QACpB,IAAI,kBAAkB,GAAG,KAAK,CAAC;QAC/B,MAAM,QAAQ,GAAG,KAAK,IAAI,EAAE;YAC1B,IAAI,kBAAkB,EAAE,CAAC;gBACvB,OAAO,CAAC,GAAG,CAAC,+CAA+C,CAAC,CAAC;gBAC7D,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;YAClB,CAAC;YACD,kBAAkB,GAAG,IAAI,CAAC;YAC1B,OAAO,CAAC,GAAG,CAAC,iCAAiC,CAAC,CAAC;YAC/C,OAAO,CAAC,GAAG,CAAC,wCAAwC,CAAC,CAAC;YAEtD,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,IAAI,EAAE,CAAC;YAEjC,IAAI,MAAM,CAAC,OAAO,EAAE,CAAC;gBACnB,OAAO,CAAC,GAAG,CAAC,qCAAqC,CAAC,CAAC;YACrD,CAAC;iBAAM,CAAC;gBACN,OAAO,CAAC,GAAG,CACT,0BAA0B,MAAM,CAAC,aAAa,mCAAmC,CAClF,CAAC;YACJ,CAAC;YAED,iDAAiD;YACjD,MAAM,CAAC,SAAS,CAAC;gBACf,OAAO,EAAE,QAAQ;gBACjB,YAAY,EAAE,WAAW;gBACzB,MAAM,EAAE,UAAU;gBAClB,IAAI,EAAE,GAAG;gBACT,MAAM,EAAE,MAAM,CAAC,OAAO;oBACpB,CAAC,CAAC,0CAA0C;oBAC5C,CAAC,CAAC,qBAAqB,MAAM,CAAC,aAAa,0BAA0B;aACxE,CAAC,CAAC;YAEH,EAAE,CAAC,KAAK,EAAE,CAAC;YACX,OAAO,CAAC,GAAG,CAAC,yBAAyB,CAAC,CAAC;YACvC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC,CAAC;QACF,OAAO,CAAC,EAAE,CAAC,QAAQ,EAAE,QAAQ,CAAC,CAAC;QAC/B,OAAO,CAAC,EAAE,CAAC,SAAS,EAAE,QAAQ,CAAC,CAAC;IAClC,CAAC,CACF,CAAC;AACN,CAAC"}
@@ -0,0 +1,6 @@
1
+ /**
2
+ * Init command: generate master key, config file, and data directory.
3
+ */
4
+ import type { Command } from 'commander';
5
+ export declare function register(program: Command): void;
6
+ //# sourceMappingURL=init.d.ts.map
@@ -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,6 @@
1
+ /**
2
+ * Key management commands: aegis key where
3
+ */
4
+ import type { Command } from 'commander';
5
+ export declare function register(program: Command): void;
6
+ //# sourceMappingURL=key.d.ts.map
@@ -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"}