@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,174 @@
1
+ import * as crypto from 'node:crypto';
2
+ /**
3
+ * Shamir's Secret Sharing over GF(256).
4
+ *
5
+ * Splits a secret into N shares such that any K shares can reconstruct it,
6
+ * but K−1 shares reveal nothing about the secret. Uses the finite field
7
+ * GF(2^8) with the AES irreducible polynomial x^8 + x^4 + x^3 + x + 1.
8
+ */
9
+ // ─── GF(256) Arithmetic ───────────────────────────────────────────
10
+ /** Lookup tables for GF(256) multiplication via discrete logarithm. */
11
+ const EXP = new Uint8Array(256);
12
+ const LOG = new Uint8Array(256);
13
+ /**
14
+ * Initialize exp/log tables using generator g = 0x03.
15
+ * EXP[i] = g^i mod P(x) where P(x) = x^8 + x^4 + x^3 + x + 1 (0x11B).
16
+ */
17
+ function initTables() {
18
+ let x = 1;
19
+ for (let i = 0; i < 255; i++) {
20
+ EXP[i] = x;
21
+ LOG[x] = i;
22
+ // Multiply by generator 3: x * 3 = x * 2 XOR x
23
+ // x * 2 = left shift with conditional reduction by 0x1B
24
+ const x2 = (x << 1) ^ (x & 0x80 ? 0x1b : 0);
25
+ x = (x2 ^ x) & 0xff;
26
+ }
27
+ EXP[255] = EXP[0]; // Wrap for modular arithmetic convenience
28
+ }
29
+ initTables();
30
+ /** Addition in GF(256) — XOR. */
31
+ function gfAdd(a, b) {
32
+ return a ^ b;
33
+ }
34
+ /** Multiplication in GF(256) using log/exp tables. */
35
+ function gfMul(a, b) {
36
+ if (a === 0 || b === 0)
37
+ return 0;
38
+ return EXP[(LOG[a] + LOG[b]) % 255];
39
+ }
40
+ /** Division in GF(256) using log/exp tables. */
41
+ function gfDiv(a, b) {
42
+ if (b === 0)
43
+ throw new Error('Division by zero in GF(256).');
44
+ if (a === 0)
45
+ return 0;
46
+ return EXP[(LOG[a] - LOG[b] + 255) % 255];
47
+ }
48
+ // ─── Polynomial Evaluation ────────────────────────────────────────
49
+ /**
50
+ * Evaluate a polynomial at point x in GF(256) using Horner's method.
51
+ * coeffs[0] = constant term (the secret byte), coeffs[t−1] = leading term.
52
+ */
53
+ function evalPoly(coeffs, x) {
54
+ let result = 0;
55
+ for (let i = coeffs.length - 1; i >= 0; i--) {
56
+ result = gfAdd(gfMul(result, x), coeffs[i]);
57
+ }
58
+ return result;
59
+ }
60
+ /** Generate a random non-zero byte using rejection sampling. */
61
+ function randomNonZero() {
62
+ let b;
63
+ do {
64
+ b = crypto.randomBytes(1)[0];
65
+ } while (b === 0);
66
+ return b;
67
+ }
68
+ /**
69
+ * Split a secret into `totalShares` shares, requiring `threshold` to reconstruct.
70
+ *
71
+ * @param secret The secret to split (arbitrary-length Buffer).
72
+ * @param threshold Minimum shares needed for reconstruction (2 ≤ t ≤ n).
73
+ * @param totalShares Number of shares to produce (t ≤ n ≤ 255).
74
+ * @returns Array of shares, each with a unique index and data.
75
+ */
76
+ export function split(secret, threshold, totalShares) {
77
+ if (threshold < 2)
78
+ throw new Error('Threshold must be at least 2.');
79
+ if (totalShares < threshold)
80
+ throw new Error('Total shares must be ≥ threshold.');
81
+ if (totalShares > 255)
82
+ throw new Error('Maximum 255 shares supported.');
83
+ if (secret.length === 0)
84
+ throw new Error('Secret must not be empty.');
85
+ // Initialize empty shares
86
+ const shares = Array.from({ length: totalShares }, (_, i) => ({
87
+ index: i + 1,
88
+ data: Buffer.alloc(secret.length),
89
+ }));
90
+ // For each byte of the secret, create a random polynomial and evaluate at each share index
91
+ for (let b = 0; b < secret.length; b++) {
92
+ const coeffs = new Array(threshold);
93
+ coeffs[0] = secret[b]; // constant term = the secret byte
94
+ // Random non-zero coefficients ensure polynomial has full degree
95
+ for (let c = 1; c < threshold; c++) {
96
+ coeffs[c] = randomNonZero();
97
+ }
98
+ for (let s = 0; s < totalShares; s++) {
99
+ shares[s].data[b] = evalPoly(coeffs, shares[s].index);
100
+ }
101
+ }
102
+ return shares;
103
+ }
104
+ /**
105
+ * Reconstruct a secret from shares using Lagrange interpolation at x = 0.
106
+ *
107
+ * @param shares At least `threshold` shares with unique indices.
108
+ * @returns The reconstructed secret.
109
+ */
110
+ export function combine(shares) {
111
+ if (shares.length < 2)
112
+ throw new Error('At least 2 shares required.');
113
+ const len = shares[0].data.length;
114
+ if (!shares.every((s) => s.data.length === len)) {
115
+ throw new Error('All shares must have the same data length.');
116
+ }
117
+ const indices = new Set(shares.map((s) => s.index));
118
+ if (indices.size !== shares.length) {
119
+ throw new Error('Duplicate share indices.');
120
+ }
121
+ const secret = Buffer.alloc(len);
122
+ for (let b = 0; b < len; b++) {
123
+ let value = 0;
124
+ for (let i = 0; i < shares.length; i++) {
125
+ const xi = shares[i].index;
126
+ const yi = shares[i].data[b];
127
+ // Lagrange basis polynomial L_i(0)
128
+ let basis = 1;
129
+ for (let j = 0; j < shares.length; j++) {
130
+ if (i === j)
131
+ continue;
132
+ const xj = shares[j].index;
133
+ // L_i(0) = Π_{j≠i} (0 − x_j) / (x_i − x_j)
134
+ // In GF(256): subtraction = addition = XOR, and 0 − x_j = x_j
135
+ basis = gfMul(basis, gfDiv(xj, gfAdd(xi, xj)));
136
+ }
137
+ value = gfAdd(value, gfMul(yi, basis));
138
+ }
139
+ secret[b] = value;
140
+ }
141
+ return secret;
142
+ }
143
+ /**
144
+ * Encode a share as a human-readable string.
145
+ * Format: `aegis_share_<index_hex>_<data_hex>`
146
+ */
147
+ export function encodeShare(share) {
148
+ const idx = share.index.toString(16).padStart(2, '0');
149
+ return `aegis_share_${idx}_${share.data.toString('hex')}`;
150
+ }
151
+ /**
152
+ * Decode a share from its string representation.
153
+ */
154
+ export function decodeShare(encoded) {
155
+ const prefix = 'aegis_share_';
156
+ if (!encoded.startsWith(prefix)) {
157
+ throw new Error('Invalid share format: must start with "aegis_share_".');
158
+ }
159
+ const rest = encoded.slice(prefix.length);
160
+ const sep = rest.indexOf('_');
161
+ if (sep === -1) {
162
+ throw new Error('Invalid share format: missing data separator.');
163
+ }
164
+ const index = Number.parseInt(rest.slice(0, sep), 16);
165
+ if (Number.isNaN(index) || index < 1 || index > 255) {
166
+ throw new Error('Invalid share index: must be 1–255.');
167
+ }
168
+ const data = Buffer.from(rest.slice(sep + 1), 'hex');
169
+ if (data.length === 0) {
170
+ throw new Error('Invalid share: empty data.');
171
+ }
172
+ return { index, data };
173
+ }
174
+ //# sourceMappingURL=shamir.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"shamir.js","sourceRoot":"","sources":["../../src/vault/shamir.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,62 @@
1
+ import Database from 'better-sqlite3-multiple-ciphers';
2
+ /**
3
+ * Metadata for a named vault (stored in the registry).
4
+ * Master keys are NEVER stored — the user must provide them.
5
+ */
6
+ export interface VaultInfo {
7
+ /** Unique vault name (e.g. "production", "staging") */
8
+ name: string;
9
+ /** Database file path relative to the data directory */
10
+ dbPath: string;
11
+ /** Hex-encoded PBKDF2 salt (unique per vault) */
12
+ salt: string;
13
+ /** ISO timestamp of when the vault was created */
14
+ createdAt: string;
15
+ }
16
+ /**
17
+ * Manages multiple named vaults, each with its own SQLite database
18
+ * and encryption key. The registry tracks vault metadata but NEVER
19
+ * stores master keys.
20
+ *
21
+ * Layout:
22
+ * .aegis/vaults/<name>.db — all vaults (including "default")
23
+ * .aegis/vaults.json — vault registry
24
+ */
25
+ export declare class VaultManager {
26
+ private dataDir;
27
+ private registryPath;
28
+ private vaultsDir;
29
+ constructor(dataDir: string);
30
+ /**
31
+ * Create a new named vault with its own database and salt.
32
+ * Returns the generated salt (the caller provides the master key).
33
+ */
34
+ create(name: string, masterKey?: string): {
35
+ salt: string;
36
+ dbPath: string;
37
+ };
38
+ /**
39
+ * List all registered vaults.
40
+ */
41
+ list(): VaultInfo[];
42
+ /**
43
+ * Remove a named vault and delete its database file.
44
+ */
45
+ remove(name: string): void;
46
+ /**
47
+ * Get metadata for a named vault.
48
+ */
49
+ getVaultInfo(name: string): VaultInfo | undefined;
50
+ /**
51
+ * Open the SQLite database for a named vault.
52
+ * Caller is responsible for closing the returned database.
53
+ */
54
+ openDb(name: string, masterKey?: string): Database.Database;
55
+ /**
56
+ * Get the salt for a named vault.
57
+ */
58
+ getSalt(name: string): string;
59
+ private loadRegistry;
60
+ private saveRegistry;
61
+ }
62
+ //# sourceMappingURL=vault-manager.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"vault-manager.d.ts","sourceRoot":"","sources":["../../src/vault/vault-manager.ts"],"names":[],"mappings":"AAEA,OAAO,QAAQ,MAAM,iCAAiC,CAAC;AAIvD;;;GAGG;AACH,MAAM,WAAW,SAAS;IACxB,uDAAuD;IACvD,IAAI,EAAE,MAAM,CAAC;IACb,wDAAwD;IACxD,MAAM,EAAE,MAAM,CAAC;IACf,iDAAiD;IACjD,IAAI,EAAE,MAAM,CAAC;IACb,kDAAkD;IAClD,SAAS,EAAE,MAAM,CAAC;CACnB;AAMD;;;;;;;;GAQG;AACH,qBAAa,YAAY;IAIX,OAAO,CAAC,OAAO;IAH3B,OAAO,CAAC,YAAY,CAAS;IAC7B,OAAO,CAAC,SAAS,CAAS;gBAEN,OAAO,EAAE,MAAM;IAKnC;;;OAGG;IACH,MAAM,CAAC,IAAI,EAAE,MAAM,EAAE,SAAS,CAAC,EAAE,MAAM,GAAG;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAA;KAAE;IAgD1E;;OAEG;IACH,IAAI,IAAI,SAAS,EAAE;IAInB;;OAEG;IACH,MAAM,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI;IA2B1B;;OAEG;IACH,YAAY,CAAC,IAAI,EAAE,MAAM,GAAG,SAAS,GAAG,SAAS;IAIjD;;;OAGG;IACH,MAAM,CAAC,IAAI,EAAE,MAAM,EAAE,SAAS,CAAC,EAAE,MAAM,GAAG,QAAQ,CAAC,QAAQ;IA0B3D;;OAEG;IACH,OAAO,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM;IAU7B,OAAO,CAAC,YAAY;IAQpB,OAAO,CAAC,YAAY;CAMrB"}
@@ -0,0 +1,151 @@
1
+ import * as fs from 'node:fs';
2
+ import * as path from 'node:path';
3
+ import Database from 'better-sqlite3-multiple-ciphers';
4
+ import { deriveDbKey, migrate } from '../db.js';
5
+ import { generateSalt } from './crypto.js';
6
+ /**
7
+ * Manages multiple named vaults, each with its own SQLite database
8
+ * and encryption key. The registry tracks vault metadata but NEVER
9
+ * stores master keys.
10
+ *
11
+ * Layout:
12
+ * .aegis/vaults/<name>.db — all vaults (including "default")
13
+ * .aegis/vaults.json — vault registry
14
+ */
15
+ export class VaultManager {
16
+ dataDir;
17
+ registryPath;
18
+ vaultsDir;
19
+ constructor(dataDir) {
20
+ this.dataDir = dataDir;
21
+ this.registryPath = path.join(dataDir, 'vaults.json');
22
+ this.vaultsDir = path.join(dataDir, 'vaults');
23
+ }
24
+ /**
25
+ * Create a new named vault with its own database and salt.
26
+ * Returns the generated salt (the caller provides the master key).
27
+ */
28
+ create(name, masterKey) {
29
+ if (!name) {
30
+ throw new Error('Vault name is required.');
31
+ }
32
+ if (!/^[a-zA-Z0-9_-]+$/.test(name)) {
33
+ throw new Error('Vault name must contain only letters, numbers, hyphens, and underscores.');
34
+ }
35
+ const registry = this.loadRegistry();
36
+ if (registry.vaults.some((v) => v.name === name)) {
37
+ throw new Error(`Vault "${name}" already exists.`);
38
+ }
39
+ // Ensure vaults directory exists
40
+ if (!fs.existsSync(this.vaultsDir)) {
41
+ fs.mkdirSync(this.vaultsDir, { recursive: true });
42
+ }
43
+ const dbPath = path.join('vaults', `${name}.db`);
44
+ const absoluteDbPath = path.join(this.dataDir, dbPath);
45
+ const salt = generateSalt();
46
+ // Create and initialize the database with the full schema
47
+ const db = new Database(absoluteDbPath);
48
+ // Encrypt the new vault database from creation
49
+ if (masterKey) {
50
+ const dbKey = deriveDbKey(masterKey, salt);
51
+ db.pragma(`key="x'${dbKey.toString('hex')}'"`);
52
+ }
53
+ db.pragma('journal_mode = WAL');
54
+ migrate(db);
55
+ db.close();
56
+ // Register the vault
57
+ const info = {
58
+ name,
59
+ dbPath,
60
+ salt,
61
+ createdAt: new Date().toISOString(),
62
+ };
63
+ registry.vaults.push(info);
64
+ this.saveRegistry(registry);
65
+ return { salt, dbPath };
66
+ }
67
+ /**
68
+ * List all registered vaults.
69
+ */
70
+ list() {
71
+ return this.loadRegistry().vaults;
72
+ }
73
+ /**
74
+ * Remove a named vault and delete its database file.
75
+ */
76
+ remove(name) {
77
+ if (!name) {
78
+ throw new Error('Vault name is required.');
79
+ }
80
+ const registry = this.loadRegistry();
81
+ const index = registry.vaults.findIndex((v) => v.name === name);
82
+ if (index === -1) {
83
+ throw new Error(`Vault "${name}" not found.`);
84
+ }
85
+ const vaultInfo = registry.vaults[index];
86
+ const absoluteDbPath = path.join(this.dataDir, vaultInfo.dbPath);
87
+ // Remove database files (main, WAL, SHM)
88
+ for (const suffix of ['', '-wal', '-shm']) {
89
+ const filePath = `${absoluteDbPath}${suffix}`;
90
+ if (fs.existsSync(filePath)) {
91
+ fs.unlinkSync(filePath);
92
+ }
93
+ }
94
+ // Remove from registry
95
+ registry.vaults.splice(index, 1);
96
+ this.saveRegistry(registry);
97
+ }
98
+ /**
99
+ * Get metadata for a named vault.
100
+ */
101
+ getVaultInfo(name) {
102
+ return this.loadRegistry().vaults.find((v) => v.name === name);
103
+ }
104
+ /**
105
+ * Open the SQLite database for a named vault.
106
+ * Caller is responsible for closing the returned database.
107
+ */
108
+ openDb(name, masterKey) {
109
+ const info = this.getVaultInfo(name);
110
+ if (!info) {
111
+ throw new Error(`Vault "${name}" not found. Create it with: aegis vault create --name ${name}`);
112
+ }
113
+ const absoluteDbPath = path.join(this.dataDir, info.dbPath);
114
+ if (!fs.existsSync(absoluteDbPath)) {
115
+ throw new Error(`Vault database file not found: ${absoluteDbPath}`);
116
+ }
117
+ const db = new Database(absoluteDbPath);
118
+ // Decrypt the vault database when a master key is available
119
+ if (masterKey) {
120
+ const dbKey = deriveDbKey(masterKey, info.salt);
121
+ db.pragma(`key="x'${dbKey.toString('hex')}'"`);
122
+ }
123
+ db.pragma('journal_mode = WAL');
124
+ migrate(db);
125
+ return db;
126
+ }
127
+ /**
128
+ * Get the salt for a named vault.
129
+ */
130
+ getSalt(name) {
131
+ const info = this.getVaultInfo(name);
132
+ if (!info) {
133
+ throw new Error(`Vault "${name}" not found. Create it with: aegis vault create --name ${name}`);
134
+ }
135
+ return info.salt;
136
+ }
137
+ loadRegistry() {
138
+ if (!fs.existsSync(this.registryPath)) {
139
+ return { vaults: [] };
140
+ }
141
+ const content = fs.readFileSync(this.registryPath, 'utf-8');
142
+ return JSON.parse(content);
143
+ }
144
+ saveRegistry(registry) {
145
+ if (!fs.existsSync(this.dataDir)) {
146
+ fs.mkdirSync(this.dataDir, { recursive: true });
147
+ }
148
+ fs.writeFileSync(this.registryPath, JSON.stringify(registry, null, 2), 'utf-8');
149
+ }
150
+ }
151
+ //# sourceMappingURL=vault-manager.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"vault-manager.js","sourceRoot":"","sources":["../../src/vault/vault-manager.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,104 @@
1
+ import type Database from 'better-sqlite3-multiple-ciphers';
2
+ import type { BodyInspectionMode } from '../gate/body-inspector.js';
3
+ export type AuthType = 'bearer' | 'header' | 'query' | 'basic';
4
+ export interface Credential {
5
+ id: string;
6
+ name: string;
7
+ service: string;
8
+ authType: AuthType;
9
+ headerName?: string;
10
+ domains: string[];
11
+ scopes: string[];
12
+ expiresAt?: string;
13
+ rateLimit?: string;
14
+ bodyInspection: BodyInspectionMode;
15
+ createdAt: string;
16
+ updatedAt: string;
17
+ }
18
+ export interface CredentialWithSecret extends Credential {
19
+ secret: string;
20
+ }
21
+ export declare class Vault {
22
+ private db;
23
+ /** Cached derived key — PBKDF2 runs once in the constructor. */
24
+ private derivedKey;
25
+ constructor(db: Database.Database, masterKey: string, salt?: Buffer | string);
26
+ /**
27
+ * Verify the master key by attempting to decrypt the first stored credential.
28
+ * Throws a clear error if the key is wrong (AES-256-GCM auth tag mismatch).
29
+ * Silently succeeds if the vault is empty (nothing to verify against).
30
+ */
31
+ private verifyKey;
32
+ /**
33
+ * Store a new credential in the vault.
34
+ */
35
+ /** Maximum credential secret size: 512 KB. */
36
+ static readonly MAX_SECRET_BYTES: number;
37
+ /** Maximum credential name length: 128 characters. */
38
+ static readonly MAX_NAME_LENGTH = 128;
39
+ add(params: {
40
+ name: string;
41
+ service: string;
42
+ secret: string;
43
+ authType?: AuthType;
44
+ headerName?: string;
45
+ domains: string[];
46
+ scopes?: string[];
47
+ ttlDays?: number;
48
+ rateLimit?: string;
49
+ bodyInspection?: BodyInspectionMode;
50
+ }): Credential;
51
+ /**
52
+ * Rotate a credential's secret. The old secret is saved to credential_history
53
+ * with an optional grace period during which it remains valid.
54
+ */
55
+ rotate(params: {
56
+ name: string;
57
+ newSecret: string;
58
+ gracePeriodHours?: number;
59
+ }): Credential;
60
+ /**
61
+ * Update a credential's metadata (domains, scopes, auth type, header name)
62
+ * without re-entering the secret.
63
+ */
64
+ update(params: {
65
+ name: string;
66
+ domains?: string[];
67
+ scopes?: string[];
68
+ authType?: AuthType;
69
+ headerName?: string;
70
+ rateLimit?: string | null;
71
+ bodyInspection?: BodyInspectionMode;
72
+ }): Credential;
73
+ /**
74
+ * Check if a credential has expired based on its expiresAt field.
75
+ */
76
+ isExpired(credential: Credential): boolean;
77
+ /**
78
+ * List all credentials (without secrets).
79
+ */
80
+ list(): Credential[];
81
+ /**
82
+ * Get a credential by name, including the decrypted secret.
83
+ */
84
+ getByName(name: string): CredentialWithSecret | null;
85
+ /**
86
+ * Get a credential by service name, including the decrypted secret.
87
+ */
88
+ getByService(service: string): CredentialWithSecret | null;
89
+ /**
90
+ * Find a credential whose allowed domains match a given hostname.
91
+ */
92
+ findByDomain(hostname: string): CredentialWithSecret | null;
93
+ /**
94
+ * Remove a credential by name.
95
+ */
96
+ remove(name: string): boolean;
97
+ /**
98
+ * Check if a hostname matches any of the allowed domain patterns.
99
+ * Supports wildcards: *.slack.com matches api.slack.com
100
+ */
101
+ domainMatches(hostname: string, allowedDomains: string[]): boolean;
102
+ private rowToCredential;
103
+ }
104
+ //# sourceMappingURL=vault.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"vault.d.ts","sourceRoot":"","sources":["../../src/vault/vault.ts"],"names":[],"mappings":"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"}