@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,265 @@
1
+ /**
2
+ * Vault CRUD commands: add, list, remove, rotate, update.
3
+ */
4
+ import { getConfig } from '../../config.js';
5
+ import { getDb, getVaultSalt, migrate } from '../../db.js';
6
+ import { deriveKey, Vault } from '../../vault/index.js';
7
+ import { requireUserAuth } from '../auth.js';
8
+ import { localTime, VALID_AUTH_TYPES, VALID_BODY_INSPECTION_MODES, validateDomains, validateEnum, validateIdentifier, validateNonNegativeFloat, validatePositiveInt, validateRateLimit, } from '../validation.js';
9
+ export function register(program) {
10
+ const vault = program.command('vault').description('Manage stored credentials');
11
+ vault
12
+ .command('add')
13
+ .description('Add a new credential to the vault')
14
+ .requiredOption('-n, --name <name>', 'Unique name for this credential')
15
+ .requiredOption('-s, --service <service>', 'Service identifier (used in proxy URL path)')
16
+ .requiredOption('--secret <secret>', 'The API key or token')
17
+ .requiredOption('-d, --domains <domains>', 'Comma-separated allowed domains (e.g. api.slack.com,*.slack.com)')
18
+ .option('-a, --auth-type <type>', 'Auth injection type: bearer, header, basic, query', 'bearer')
19
+ .option('--header-name <name>', 'Custom header name (for auth-type: header)')
20
+ .option('--query-param <name>', 'Query parameter name (for auth-type: query, default: "key")')
21
+ .option('--scopes <scopes>', 'Comma-separated scopes: read, write, *', '*')
22
+ .option('--ttl <days>', 'Credential expires after this many days')
23
+ .option('--rate-limit <limit>', 'Rate limit: e.g. 100/min, 1000/hour, 10/sec')
24
+ .option('--body-inspection <mode>', 'Body inspection mode: off, warn, block', 'block')
25
+ .action((opts) => {
26
+ // ── Input validation ──
27
+ validateIdentifier(opts.name, 'credential name');
28
+ validateIdentifier(opts.service, 'service');
29
+ const authType = validateEnum(opts.authType, VALID_AUTH_TYPES, 'auth type');
30
+ const bodyInspection = validateEnum(opts.bodyInspection, VALID_BODY_INSPECTION_MODES, 'body inspection mode');
31
+ const domains = validateDomains(opts.domains);
32
+ const ttlDays = opts.ttl ? parseInt(opts.ttl, 10) : undefined;
33
+ if (ttlDays !== undefined)
34
+ validatePositiveInt(ttlDays, 'TTL (days)');
35
+ if (opts.rateLimit)
36
+ validateRateLimit(opts.rateLimit);
37
+ // --query-param sets headerName when authType is query
38
+ const headerName = opts.queryParam && authType === 'query' ? opts.queryParam : opts.headerName;
39
+ const config = getConfig();
40
+ const db = getDb(config);
41
+ migrate(db);
42
+ const key = deriveKey(config.masterKey, getVaultSalt(config));
43
+ requireUserAuth(db, key, 'vault:write');
44
+ const vaultInstance = new Vault(db, config.masterKey, getVaultSalt(config));
45
+ try {
46
+ const cred = vaultInstance.add({
47
+ name: opts.name,
48
+ service: opts.service,
49
+ secret: opts.secret,
50
+ authType,
51
+ headerName,
52
+ domains,
53
+ scopes: opts.scopes.split(',').map((s) => s.trim()),
54
+ ttlDays,
55
+ rateLimit: opts.rateLimit,
56
+ bodyInspection,
57
+ });
58
+ console.log(`\n✓ Credential added to Aegis Vault\n`);
59
+ console.log(` Name: ${cred.name}`);
60
+ console.log(` Service: ${cred.service}`);
61
+ console.log(` Auth: ${cred.authType}`);
62
+ if (cred.authType === 'header' && cred.headerName) {
63
+ console.log(` Header: ${cred.headerName}`);
64
+ }
65
+ if (cred.authType === 'query') {
66
+ console.log(` Param: ${cred.headerName ?? 'key'}`);
67
+ }
68
+ console.log(` Domains: ${cred.domains.join(', ')}`);
69
+ console.log(` Scopes: ${cred.scopes.join(', ')}`);
70
+ if (cred.expiresAt) {
71
+ console.log(` Expires: ${localTime(cred.expiresAt)}`);
72
+ }
73
+ if (cred.rateLimit) {
74
+ console.log(` Rate: ${cred.rateLimit}`);
75
+ }
76
+ console.log(` Body: ${cred.bodyInspection}`);
77
+ console.log(`\n Your agent can now use: http://localhost:${config.port}/${cred.service}/...\n`);
78
+ }
79
+ catch (err) {
80
+ const message = err instanceof Error ? err.message : String(err);
81
+ if (message.includes('UNIQUE')) {
82
+ console.error(`\n✗ A credential named "${opts.name}" already exists. Remove it first with: aegis vault remove --name ${opts.name}\n`);
83
+ }
84
+ else {
85
+ console.error(`\n✗ Error: ${message}\n`);
86
+ }
87
+ process.exit(1);
88
+ }
89
+ finally {
90
+ db.close();
91
+ }
92
+ });
93
+ vault
94
+ .command('list')
95
+ .description('List all stored credentials (secrets are never shown)')
96
+ .action(() => {
97
+ const config = getConfig();
98
+ const db = getDb(config);
99
+ migrate(db);
100
+ const key = deriveKey(config.masterKey, getVaultSalt(config));
101
+ requireUserAuth(db, key, 'vault:read');
102
+ const vaultInstance = new Vault(db, config.masterKey, getVaultSalt(config));
103
+ const creds = vaultInstance.list();
104
+ if (creds.length === 0) {
105
+ console.log('\n No credentials stored. Add one with: aegis vault add\n');
106
+ db.close();
107
+ return;
108
+ }
109
+ console.log(`\n Aegis Vault — ${creds.length} credential(s)\n`);
110
+ for (const cred of creds) {
111
+ console.log(` ┌ ${cred.name} (${cred.service})`);
112
+ console.log(` │ Auth: ${cred.authType}`);
113
+ console.log(` │ Domains: ${cred.domains.join(', ')}`);
114
+ console.log(` │ Scopes: ${cred.scopes.join(', ')}`);
115
+ if (cred.rateLimit) {
116
+ console.log(` │ Rate: ${cred.rateLimit}`);
117
+ }
118
+ if (cred.expiresAt) {
119
+ console.log(` │ Expires: ${localTime(cred.expiresAt)}`);
120
+ }
121
+ console.log(` │ Added: ${localTime(cred.createdAt)}`);
122
+ console.log(` └`);
123
+ }
124
+ console.log();
125
+ db.close();
126
+ });
127
+ vault
128
+ .command('remove')
129
+ .description('Remove a credential from the vault')
130
+ .requiredOption('-n, --name <name>', 'Name of the credential to remove')
131
+ .action((opts) => {
132
+ const config = getConfig();
133
+ const db = getDb(config);
134
+ migrate(db);
135
+ const key = deriveKey(config.masterKey, getVaultSalt(config));
136
+ requireUserAuth(db, key, 'vault:write');
137
+ const vaultInstance = new Vault(db, config.masterKey, getVaultSalt(config));
138
+ const removed = vaultInstance.remove(opts.name);
139
+ if (removed) {
140
+ console.log(`\n✓ Credential "${opts.name}" removed from vault.\n`);
141
+ }
142
+ else {
143
+ console.error(`\n✗ No credential found with name "${opts.name}".\n`);
144
+ process.exit(1);
145
+ }
146
+ db.close();
147
+ });
148
+ vault
149
+ .command('rotate')
150
+ .description("Rotate a credential's secret (old secret saved to history)")
151
+ .requiredOption('-n, --name <name>', 'Name of the credential to rotate')
152
+ .requiredOption('--secret <secret>', 'The new API key or token')
153
+ .option('--grace-period <hours>', 'Keep old secret valid for this many hours (for zero-downtime rotation)')
154
+ .action((opts) => {
155
+ const gracePeriodHours = opts.gracePeriod ? parseFloat(opts.gracePeriod) : undefined;
156
+ if (gracePeriodHours !== undefined)
157
+ validateNonNegativeFloat(gracePeriodHours, 'grace period (hours)');
158
+ const config = getConfig();
159
+ const db = getDb(config);
160
+ migrate(db);
161
+ const key = deriveKey(config.masterKey, getVaultSalt(config));
162
+ requireUserAuth(db, key, 'vault:write');
163
+ const vaultInstance = new Vault(db, config.masterKey, getVaultSalt(config));
164
+ try {
165
+ const cred = vaultInstance.rotate({
166
+ name: opts.name,
167
+ newSecret: opts.secret,
168
+ gracePeriodHours,
169
+ });
170
+ console.log(`\n✓ Credential "${cred.name}" rotated successfully\n`);
171
+ console.log(` Old secret saved to history`);
172
+ if (gracePeriodHours) {
173
+ console.log(` Grace period: ${gracePeriodHours} hour(s)`);
174
+ }
175
+ console.log();
176
+ }
177
+ catch (err) {
178
+ const message = err instanceof Error ? err.message : String(err);
179
+ console.error(`\n✗ ${message}\n`);
180
+ process.exit(1);
181
+ }
182
+ finally {
183
+ db.close();
184
+ }
185
+ });
186
+ vault
187
+ .command('update')
188
+ .description("Update a credential's metadata without re-entering the secret")
189
+ .requiredOption('-n, --name <name>', 'Name of the credential to update')
190
+ .option('-d, --domains <domains>', 'New comma-separated allowed domains')
191
+ .option('--scopes <scopes>', 'New comma-separated scopes')
192
+ .option('-a, --auth-type <type>', 'New auth injection type: bearer, header, basic, query')
193
+ .option('--header-name <name>', 'New custom header name (for auth-type: header)')
194
+ .option('--query-param <name>', 'New query parameter name (for auth-type: query)')
195
+ .option('--rate-limit <limit>', "New rate limit: e.g. 100/min, 1000/hour (use 'none' to remove)")
196
+ .option('--body-inspection <mode>', 'Body inspection mode: off, warn, block')
197
+ .action((opts) => {
198
+ // ── Input validation ──
199
+ if (opts.authType)
200
+ validateEnum(opts.authType, VALID_AUTH_TYPES, 'auth type');
201
+ if (opts.bodyInspection)
202
+ validateEnum(opts.bodyInspection, VALID_BODY_INSPECTION_MODES, 'body inspection mode');
203
+ const domains = opts.domains ? validateDomains(opts.domains) : undefined;
204
+ if (opts.rateLimit && opts.rateLimit.toLowerCase() !== 'none')
205
+ validateRateLimit(opts.rateLimit);
206
+ const config = getConfig();
207
+ const db = getDb(config);
208
+ migrate(db);
209
+ const key = deriveKey(config.masterKey, getVaultSalt(config));
210
+ requireUserAuth(db, key, 'vault:write');
211
+ const vaultInstance = new Vault(db, config.masterKey, getVaultSalt(config));
212
+ try {
213
+ // "none" means remove the rate limit
214
+ const rateLimit = opts.rateLimit !== undefined
215
+ ? opts.rateLimit.toLowerCase() === 'none'
216
+ ? null
217
+ : opts.rateLimit
218
+ : undefined;
219
+ // --query-param sets headerName when authType is query
220
+ const resolvedAuthType = opts.authType;
221
+ let headerName = opts.headerName;
222
+ if (opts.queryParam) {
223
+ if (resolvedAuthType && resolvedAuthType !== 'query') {
224
+ console.warn(`\n⚠ --query-param is ignored when auth-type is "${resolvedAuthType}" (only applies to "query")\n`);
225
+ }
226
+ else {
227
+ headerName = opts.queryParam;
228
+ }
229
+ }
230
+ const cred = vaultInstance.update({
231
+ name: opts.name,
232
+ domains,
233
+ scopes: opts.scopes?.split(',').map((s) => s.trim()),
234
+ authType: opts.authType,
235
+ headerName,
236
+ rateLimit,
237
+ bodyInspection: opts.bodyInspection,
238
+ });
239
+ console.log(`\n✓ Credential "${cred.name}" updated\n`);
240
+ console.log(` Domains: ${cred.domains.join(', ')}`);
241
+ console.log(` Scopes: ${cred.scopes.join(', ')}`);
242
+ console.log(` Auth: ${cred.authType}`);
243
+ if (cred.authType === 'header' && cred.headerName) {
244
+ console.log(` Header: ${cred.headerName}`);
245
+ }
246
+ if (cred.authType === 'query') {
247
+ console.log(` Param: ${cred.headerName ?? 'key'}`);
248
+ }
249
+ if (cred.rateLimit) {
250
+ console.log(` Rate: ${cred.rateLimit}`);
251
+ }
252
+ console.log(` Body: ${cred.bodyInspection}`);
253
+ console.log();
254
+ }
255
+ catch (err) {
256
+ const message = err instanceof Error ? err.message : String(err);
257
+ console.error(`\n✗ ${message}\n`);
258
+ process.exit(1);
259
+ }
260
+ finally {
261
+ db.close();
262
+ }
263
+ });
264
+ }
265
+ //# sourceMappingURL=vault.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"vault.js","sourceRoot":"","sources":["../../../src/cli/commands/vault.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,6 @@
1
+ /**
2
+ * Webhook commands: add, list, remove, test, check-expiry.
3
+ */
4
+ import type { Command } from 'commander';
5
+ export declare function register(program: Command): void;
6
+ //# sourceMappingURL=webhook.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"webhook.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/webhook.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAQzC,wBAAgB,QAAQ,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CA2K/C"}
@@ -0,0 +1,151 @@
1
+ /**
2
+ * Webhook commands: add, list, remove, test, check-expiry.
3
+ */
4
+ import { getConfig } from '../../config.js';
5
+ import { getDb, getVaultSalt, migrate } from '../../db.js';
6
+ import { deriveKey, Vault } from '../../vault/index.js';
7
+ import { WEBHOOK_EVENT_TYPES, WebhookManager } from '../../webhook/index.js';
8
+ import { requireUserAuth } from '../auth.js';
9
+ import { localTime } from '../validation.js';
10
+ export function register(program) {
11
+ const webhookCmd = program.command('webhook').description('Manage webhook alert endpoints');
12
+ webhookCmd
13
+ .command('add')
14
+ .description('Register a webhook endpoint for event notifications')
15
+ .requiredOption('-u, --url <url>', 'Webhook endpoint URL (http or https)')
16
+ .requiredOption('-e, --events <events>', 'Comma-separated event types: blocked_request, credential_expiry, rate_limit_exceeded, agent_auth_failure, body_inspection')
17
+ .option('-l, --label <label>', 'Human-readable label for this webhook')
18
+ .action((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, 'webhook:write');
24
+ const webhookManager = new WebhookManager({ db, logLevel: config.logLevel });
25
+ const events = opts.events.split(',').map((e) => e.trim());
26
+ for (const event of events) {
27
+ if (!WEBHOOK_EVENT_TYPES.includes(event)) {
28
+ console.error(`\n ✗ Invalid event type: ${event}\n Valid types: ${WEBHOOK_EVENT_TYPES.join(', ')}\n`);
29
+ process.exit(1);
30
+ }
31
+ }
32
+ try {
33
+ const webhook = webhookManager.add({
34
+ url: opts.url,
35
+ events: events,
36
+ label: opts.label,
37
+ });
38
+ console.log(`\n ✔ Webhook registered`);
39
+ console.log(` ID: ${webhook.id}`);
40
+ console.log(` URL: ${webhook.url}`);
41
+ console.log(` Events: ${webhook.events.join(', ')}`);
42
+ if (webhook.label)
43
+ console.log(` Label: ${webhook.label}`);
44
+ console.log(` Secret: ${webhook.secret}`);
45
+ console.log(`\n Use the secret to verify payload signatures (X-Aegis-Signature header).\n`);
46
+ }
47
+ catch (err) {
48
+ console.error(`\n ✗ ${err instanceof Error ? err.message : String(err)}\n`);
49
+ process.exit(1);
50
+ }
51
+ db.close();
52
+ });
53
+ webhookCmd
54
+ .command('list')
55
+ .description('List all registered webhooks')
56
+ .action(() => {
57
+ const config = getConfig();
58
+ const db = getDb(config);
59
+ migrate(db);
60
+ const key = deriveKey(config.masterKey, getVaultSalt(config));
61
+ requireUserAuth(db, key, 'webhook:read');
62
+ const webhookManager = new WebhookManager({ db, logLevel: config.logLevel });
63
+ const webhooks = webhookManager.list();
64
+ if (webhooks.length === 0) {
65
+ console.log('\n No webhooks registered. Add one with: aegis webhook add --url https://example.com/hook --events blocked_request\n');
66
+ }
67
+ else {
68
+ console.log(`\n Aegis Webhooks — ${webhooks.length} registered\n`);
69
+ for (const w of webhooks) {
70
+ console.log(` ${w.label ?? w.id}`);
71
+ console.log(` URL: ${w.url}`);
72
+ console.log(` Events: ${w.events.join(', ')}`);
73
+ console.log(` Added: ${localTime(w.createdAt)}`);
74
+ console.log();
75
+ }
76
+ }
77
+ db.close();
78
+ });
79
+ webhookCmd
80
+ .command('remove')
81
+ .description('Remove a webhook by ID')
82
+ .requiredOption('--id <id>', 'Webhook ID to remove')
83
+ .action((opts) => {
84
+ const config = getConfig();
85
+ const db = getDb(config);
86
+ migrate(db);
87
+ const key = deriveKey(config.masterKey, getVaultSalt(config));
88
+ requireUserAuth(db, key, 'webhook:write');
89
+ const webhookManager = new WebhookManager({ db, logLevel: config.logLevel });
90
+ if (webhookManager.remove(opts.id)) {
91
+ console.log(`\n ✔ Webhook removed: ${opts.id}\n`);
92
+ }
93
+ else {
94
+ console.error(`\n ✗ Webhook not found: ${opts.id}\n`);
95
+ process.exit(1);
96
+ }
97
+ db.close();
98
+ });
99
+ webhookCmd
100
+ .command('test')
101
+ .description('Send a test event to a webhook')
102
+ .requiredOption('--id <id>', 'Webhook ID to test')
103
+ .action(async (opts) => {
104
+ const config = getConfig();
105
+ const db = getDb(config);
106
+ migrate(db);
107
+ const key = deriveKey(config.masterKey, getVaultSalt(config));
108
+ requireUserAuth(db, key, 'webhook:read');
109
+ const webhookManager = new WebhookManager({ db, logLevel: config.logLevel });
110
+ const webhook = webhookManager.getById(opts.id);
111
+ if (!webhook) {
112
+ console.error(`\n ✗ Webhook not found: ${opts.id}\n`);
113
+ db.close();
114
+ process.exit(1);
115
+ }
116
+ console.log(`\n Sending test event to ${webhook.url}...`);
117
+ webhookManager.emit('blocked_request', {
118
+ test: true,
119
+ service: 'test-service',
120
+ reason: 'test_event',
121
+ message: 'This is a test webhook delivery from Aegis',
122
+ });
123
+ // Give it a moment to deliver
124
+ await new Promise((resolve) => setTimeout(resolve, 3000));
125
+ console.log(` ✔ Test event sent\n`);
126
+ db.close();
127
+ });
128
+ webhookCmd
129
+ .command('check-expiry')
130
+ .description('Check for credentials approaching expiry and emit webhook alerts')
131
+ .option('--threshold <days>', 'Alert threshold in days (default: 7)', '7')
132
+ .action((opts) => {
133
+ const config = getConfig();
134
+ const db = getDb(config);
135
+ migrate(db);
136
+ const key = deriveKey(config.masterKey, getVaultSalt(config));
137
+ requireUserAuth(db, key, 'webhook:read');
138
+ const vaultInstance = new Vault(db, config.masterKey, getVaultSalt(config));
139
+ const webhookManager = new WebhookManager({ db, logLevel: config.logLevel });
140
+ const thresholdDays = Number.parseInt(opts.threshold, 10) || 7;
141
+ const alertCount = webhookManager.checkExpiringCredentials(vaultInstance, thresholdDays);
142
+ if (alertCount === 0) {
143
+ console.log(`\n ✔ No credentials expiring within ${thresholdDays} days\n`);
144
+ }
145
+ else {
146
+ console.log(`\n ⚠ ${alertCount} credential(s) expiring within ${thresholdDays} days — webhook alerts sent\n`);
147
+ }
148
+ db.close();
149
+ });
150
+ }
151
+ //# sourceMappingURL=webhook.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"webhook.js","sourceRoot":"","sources":["../../../src/cli/commands/webhook.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,12 @@
1
+ /**
2
+ * Shared CLI helper utilities.
3
+ */
4
+ /**
5
+ * Generate a self-signed TLS certificate using openssl.
6
+ * Creates certs/aegis.key and certs/aegis.crt in the given base directory.
7
+ *
8
+ * The certificate is valid for 365 days, issued to CN=localhost with
9
+ * SubjectAltNames for localhost and 127.0.0.1.
10
+ */
11
+ export declare function generateSelfSignedCert(baseDir: string): void;
12
+ //# sourceMappingURL=helpers.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"helpers.d.ts","sourceRoot":"","sources":["../../src/cli/helpers.ts"],"names":[],"mappings":"AAAA;;GAEG;AAMH;;;;;;GAMG;AACH,wBAAgB,sBAAsB,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI,CAqD5D"}
@@ -0,0 +1,61 @@
1
+ /**
2
+ * Shared CLI helper utilities.
3
+ */
4
+ import { execSync } from 'node:child_process';
5
+ import * as fs from 'node:fs';
6
+ import * as path from 'node:path';
7
+ /**
8
+ * Generate a self-signed TLS certificate using openssl.
9
+ * Creates certs/aegis.key and certs/aegis.crt in the given base directory.
10
+ *
11
+ * The certificate is valid for 365 days, issued to CN=localhost with
12
+ * SubjectAltNames for localhost and 127.0.0.1.
13
+ */
14
+ export function generateSelfSignedCert(baseDir) {
15
+ const certsDir = path.join(baseDir, 'certs');
16
+ if (!fs.existsSync(certsDir)) {
17
+ fs.mkdirSync(certsDir, { recursive: true });
18
+ }
19
+ const keyPath = path.join(certsDir, 'aegis.key');
20
+ const certPath = path.join(certsDir, 'aegis.crt');
21
+ if (fs.existsSync(keyPath) && fs.existsSync(certPath)) {
22
+ console.log(`\n TLS certificate already exists at ${certsDir}/`);
23
+ console.log(` ${keyPath}`);
24
+ console.log(` ${certPath}\n`);
25
+ return;
26
+ }
27
+ try {
28
+ // Check openssl is available
29
+ execSync('openssl version', { stdio: 'pipe' });
30
+ }
31
+ catch {
32
+ console.error('\n ✗ openssl not found. Install OpenSSL to generate self-signed certificates.\n');
33
+ return;
34
+ }
35
+ try {
36
+ // Generate RSA private key (2048 bits)
37
+ execSync(`openssl genrsa -out "${keyPath}" 2048`, { stdio: 'pipe' });
38
+ fs.chmodSync(keyPath, 0o600);
39
+ // Generate self-signed certificate with SAN for localhost
40
+ const opensslCmd = [
41
+ 'openssl req -new -x509',
42
+ `-key "${keyPath}"`,
43
+ `-out "${certPath}"`,
44
+ '-days 365',
45
+ '-subj "/CN=localhost/O=Aegis Local Dev"',
46
+ '-addext "subjectAltName=DNS:localhost,IP:127.0.0.1"',
47
+ ].join(' ');
48
+ execSync(opensslCmd, { stdio: 'pipe' });
49
+ console.log(`\n 🔒 Self-signed TLS certificate generated:`);
50
+ console.log(` Key: ${keyPath}`);
51
+ console.log(` Cert: ${certPath}`);
52
+ console.log(` Valid for 365 days (localhost + 127.0.0.1)\n`);
53
+ console.log(` Start Gate with TLS: aegis gate --tls`);
54
+ console.log(` Or specify paths: aegis gate --tls --cert ${certPath} --key ${keyPath}\n`);
55
+ }
56
+ catch (err) {
57
+ const message = err instanceof Error ? err.message : String(err);
58
+ console.error(`\n ✗ Failed to generate certificate: ${message}\n`);
59
+ }
60
+ }
61
+ //# sourceMappingURL=helpers.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"helpers.js","sourceRoot":"","sources":["../../src/cli/helpers.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,QAAQ,EAAE,MAAM,oBAAoB,CAAC;AAC9C,OAAO,KAAK,EAAE,MAAM,SAAS,CAAC;AAC9B,OAAO,KAAK,IAAI,MAAM,WAAW,CAAC;AAElC;;;;;;GAMG;AACH,MAAM,UAAU,sBAAsB,CAAC,OAAe;IACpD,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;IAC7C,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,QAAQ,CAAC,EAAE,CAAC;QAC7B,EAAE,CAAC,SAAS,CAAC,QAAQ,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IAC9C,CAAC;IAED,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,WAAW,CAAC,CAAC;IACjD,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,WAAW,CAAC,CAAC;IAElD,IAAI,EAAE,CAAC,UAAU,CAAC,OAAO,CAAC,IAAI,EAAE,CAAC,UAAU,CAAC,QAAQ,CAAC,EAAE,CAAC;QACtD,OAAO,CAAC,GAAG,CAAC,yCAAyC,QAAQ,GAAG,CAAC,CAAC;QAClE,OAAO,CAAC,GAAG,CAAC,OAAO,OAAO,EAAE,CAAC,CAAC;QAC9B,OAAO,CAAC,GAAG,CAAC,OAAO,QAAQ,IAAI,CAAC,CAAC;QACjC,OAAO;IACT,CAAC;IAED,IAAI,CAAC;QACH,6BAA6B;QAC7B,QAAQ,CAAC,iBAAiB,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC,CAAC;IACjD,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,CAAC,KAAK,CACX,kFAAkF,CACnF,CAAC;QACF,OAAO;IACT,CAAC;IAED,IAAI,CAAC;QACH,uCAAuC;QACvC,QAAQ,CAAC,wBAAwB,OAAO,QAAQ,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC,CAAC;QACrE,EAAE,CAAC,SAAS,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC;QAE7B,0DAA0D;QAC1D,MAAM,UAAU,GAAG;YACjB,wBAAwB;YACxB,SAAS,OAAO,GAAG;YACnB,SAAS,QAAQ,GAAG;YACpB,WAAW;YACX,yCAAyC;YACzC,qDAAqD;SACtD,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QAEZ,QAAQ,CAAC,UAAU,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC,CAAC;QAExC,OAAO,CAAC,GAAG,CAAC,+CAA+C,CAAC,CAAC;QAC7D,OAAO,CAAC,GAAG,CAAC,aAAa,OAAO,EAAE,CAAC,CAAC;QACpC,OAAO,CAAC,GAAG,CAAC,aAAa,QAAQ,EAAE,CAAC,CAAC;QACrC,OAAO,CAAC,GAAG,CAAC,kDAAkD,CAAC,CAAC;QAChE,OAAO,CAAC,GAAG,CAAC,2CAA2C,CAAC,CAAC;QACzD,OAAO,CAAC,GAAG,CAAC,oDAAoD,QAAQ,UAAU,OAAO,IAAI,CAAC,CAAC;IACjG,CAAC;IAAC,OAAO,GAAY,EAAE,CAAC;QACtB,MAAM,OAAO,GAAG,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;QACjE,OAAO,CAAC,KAAK,CAAC,yCAAyC,OAAO,IAAI,CAAC,CAAC;IACtE,CAAC;AACH,CAAC"}
@@ -0,0 +1,19 @@
1
+ /**
2
+ * CLI module barrel — re-exports all command registration functions.
3
+ */
4
+ export { register as registerAgent } from './commands/agent.js';
5
+ export { register as registerConfig } from './commands/config.js';
6
+ export { register as registerDashboard } from './commands/dashboard.js';
7
+ export { register as registerDb } from './commands/db.js';
8
+ export { register as registerDoctor } from './commands/doctor.js';
9
+ export { register as registerGate } from './commands/gate.js';
10
+ export { register as registerInit } from './commands/init.js';
11
+ export { register as registerKey } from './commands/key.js';
12
+ export { register as registerLedger } from './commands/ledger.js';
13
+ export { register as registerMcp } from './commands/mcp.js';
14
+ export { register as registerPolicy } from './commands/policy.js';
15
+ export { register as registerUser } from './commands/user.js';
16
+ export { register as registerVault } from './commands/vault.js';
17
+ export { register as registerVaultManager } from './commands/vault-manager.js';
18
+ export { register as registerWebhook } from './commands/webhook.js';
19
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/cli/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,QAAQ,IAAI,aAAa,EAAE,MAAM,qBAAqB,CAAC;AAChE,OAAO,EAAE,QAAQ,IAAI,cAAc,EAAE,MAAM,sBAAsB,CAAC;AAClE,OAAO,EAAE,QAAQ,IAAI,iBAAiB,EAAE,MAAM,yBAAyB,CAAC;AACxE,OAAO,EAAE,QAAQ,IAAI,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAC1D,OAAO,EAAE,QAAQ,IAAI,cAAc,EAAE,MAAM,sBAAsB,CAAC;AAClE,OAAO,EAAE,QAAQ,IAAI,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAC9D,OAAO,EAAE,QAAQ,IAAI,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAC9D,OAAO,EAAE,QAAQ,IAAI,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAC5D,OAAO,EAAE,QAAQ,IAAI,cAAc,EAAE,MAAM,sBAAsB,CAAC;AAClE,OAAO,EAAE,QAAQ,IAAI,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAC5D,OAAO,EAAE,QAAQ,IAAI,cAAc,EAAE,MAAM,sBAAsB,CAAC;AAClE,OAAO,EAAE,QAAQ,IAAI,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAC9D,OAAO,EAAE,QAAQ,IAAI,aAAa,EAAE,MAAM,qBAAqB,CAAC;AAChE,OAAO,EAAE,QAAQ,IAAI,oBAAoB,EAAE,MAAM,6BAA6B,CAAC;AAC/E,OAAO,EAAE,QAAQ,IAAI,eAAe,EAAE,MAAM,uBAAuB,CAAC"}
@@ -0,0 +1,19 @@
1
+ /**
2
+ * CLI module barrel — re-exports all command registration functions.
3
+ */
4
+ export { register as registerAgent } from './commands/agent.js';
5
+ export { register as registerConfig } from './commands/config.js';
6
+ export { register as registerDashboard } from './commands/dashboard.js';
7
+ export { register as registerDb } from './commands/db.js';
8
+ export { register as registerDoctor } from './commands/doctor.js';
9
+ export { register as registerGate } from './commands/gate.js';
10
+ export { register as registerInit } from './commands/init.js';
11
+ export { register as registerKey } from './commands/key.js';
12
+ export { register as registerLedger } from './commands/ledger.js';
13
+ export { register as registerMcp } from './commands/mcp.js';
14
+ export { register as registerPolicy } from './commands/policy.js';
15
+ export { register as registerUser } from './commands/user.js';
16
+ export { register as registerVault } from './commands/vault.js';
17
+ export { register as registerVaultManager } from './commands/vault-manager.js';
18
+ export { register as registerWebhook } from './commands/webhook.js';
19
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/cli/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,QAAQ,IAAI,aAAa,EAAE,MAAM,qBAAqB,CAAC;AAChE,OAAO,EAAE,QAAQ,IAAI,cAAc,EAAE,MAAM,sBAAsB,CAAC;AAClE,OAAO,EAAE,QAAQ,IAAI,iBAAiB,EAAE,MAAM,yBAAyB,CAAC;AACxE,OAAO,EAAE,QAAQ,IAAI,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAC1D,OAAO,EAAE,QAAQ,IAAI,cAAc,EAAE,MAAM,sBAAsB,CAAC;AAClE,OAAO,EAAE,QAAQ,IAAI,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAC9D,OAAO,EAAE,QAAQ,IAAI,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAC9D,OAAO,EAAE,QAAQ,IAAI,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAC5D,OAAO,EAAE,QAAQ,IAAI,cAAc,EAAE,MAAM,sBAAsB,CAAC;AAClE,OAAO,EAAE,QAAQ,IAAI,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAC5D,OAAO,EAAE,QAAQ,IAAI,cAAc,EAAE,MAAM,sBAAsB,CAAC;AAClE,OAAO,EAAE,QAAQ,IAAI,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAC9D,OAAO,EAAE,QAAQ,IAAI,aAAa,EAAE,MAAM,qBAAqB,CAAC;AAChE,OAAO,EAAE,QAAQ,IAAI,oBAAoB,EAAE,MAAM,6BAA6B,CAAC;AAC/E,OAAO,EAAE,QAAQ,IAAI,eAAe,EAAE,MAAM,uBAAuB,CAAC"}
@@ -0,0 +1,37 @@
1
+ /**
2
+ * CLI input validation helpers.
3
+ *
4
+ * Pure functions that validate user-provided CLI flags and exit with a
5
+ * descriptive error when the input is invalid. Extracted from cli.ts so
6
+ * they can be unit-tested independently.
7
+ */
8
+ export declare const IDENTIFIER_RE: RegExp;
9
+ export declare const VALID_AUTH_TYPES: readonly ["bearer", "header", "basic", "query"];
10
+ export declare const VALID_BODY_INSPECTION_MODES: readonly ["off", "warn", "block"];
11
+ export declare const VALID_POLICY_MODES: readonly ["enforce", "dry-run", "off"];
12
+ export declare const VALID_LOG_LEVELS: readonly ["debug", "info", "warn", "error"];
13
+ export declare const VALID_MCP_TRANSPORTS: readonly ["stdio", "streamable-http"];
14
+ /** Validate an identifier (name, service, etc.) used as a DB key or URL path segment. */
15
+ export declare function validateIdentifier(value: string, fieldName: string): void;
16
+ /** Validate a value is one of the allowed enum values. */
17
+ export declare function validateEnum<T extends string>(value: string, allowed: readonly T[], fieldName: string): T;
18
+ /** Validate a port number (1–65535). */
19
+ export declare function validatePort(value: number, fieldName: string): void;
20
+ /** Validate a positive integer. */
21
+ export declare function validatePositiveInt(value: number, fieldName: string): void;
22
+ /** Validate a non-negative float. */
23
+ export declare function validateNonNegativeFloat(value: number, fieldName: string): void;
24
+ /** Validate a rate limit string (e.g. 100/min) early, before storing. */
25
+ export declare function validateRateLimit(value: string): void;
26
+ /** Validate a comma-separated domain list. */
27
+ export declare function validateDomains(raw: string): string[];
28
+ /** Validate an ISO date string. */
29
+ export declare function validateIsoDate(value: string, fieldName: string): void;
30
+ /**
31
+ * Convert a UTC timestamp from SQLite (e.g. "2026-03-09 00:31:38") to
32
+ * the user's local time string. SQLite's datetime('now') stores UTC but
33
+ * omits the 'Z' suffix, so we append it before parsing so JavaScript's
34
+ * Date constructor treats it as UTC rather than local.
35
+ */
36
+ export declare function localTime(utcTimestamp: string): string;
37
+ //# sourceMappingURL=validation.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"validation.d.ts","sourceRoot":"","sources":["../../src/cli/validation.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAIH,eAAO,MAAM,aAAa,QAAqB,CAAC;AAEhD,eAAO,MAAM,gBAAgB,iDAAkD,CAAC;AAChF,eAAO,MAAM,2BAA2B,mCAAoC,CAAC;AAC7E,eAAO,MAAM,kBAAkB,wCAAyC,CAAC;AACzE,eAAO,MAAM,gBAAgB,6CAA8C,CAAC;AAC5E,eAAO,MAAM,oBAAoB,uCAAwC,CAAC;AAI1E,yFAAyF;AACzF,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,IAAI,CAOzE;AAED,0DAA0D;AAC1D,wBAAgB,YAAY,CAAC,CAAC,SAAS,MAAM,EAC3C,KAAK,EAAE,MAAM,EACb,OAAO,EAAE,SAAS,CAAC,EAAE,EACrB,SAAS,EAAE,MAAM,GAChB,CAAC,CAQH;AAED,wCAAwC;AACxC,wBAAgB,YAAY,CAAC,KAAK,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,IAAI,CAKnE;AAED,mCAAmC;AACnC,wBAAgB,mBAAmB,CAAC,KAAK,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,IAAI,CAK1E;AAED,qCAAqC;AACrC,wBAAgB,wBAAwB,CAAC,KAAK,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,IAAI,CAK/E;AAED,yEAAyE;AACzE,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI,CAcrD;AAED,8CAA8C;AAC9C,wBAAgB,eAAe,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,EAAE,CAmBrD;AAED,mCAAmC;AACnC,wBAAgB,eAAe,CAAC,KAAK,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,IAAI,CAQtE;AAID;;;;;GAKG;AACH,wBAAgB,SAAS,CAAC,YAAY,EAAE,MAAM,GAAG,MAAM,CAGtD"}