@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,269 @@
1
+ /**
2
+ * Aegis Webhook Alerts — fire-and-forget HTTP notifications for security events.
3
+ *
4
+ * Webhook endpoints are stored in SQLite and can subscribe to specific event types.
5
+ * When an event fires, all matching webhooks receive a JSON POST with event details.
6
+ *
7
+ * Delivery is best-effort: retries up to 3 times with exponential backoff.
8
+ * Failed deliveries are logged but never block the request pipeline.
9
+ */
10
+ import * as crypto from 'node:crypto';
11
+ import * as http from 'node:http';
12
+ import * as https from 'node:https';
13
+ import { createLogger } from '../logger/index.js';
14
+ export const WEBHOOK_EVENT_TYPES = [
15
+ 'blocked_request',
16
+ 'credential_expiry',
17
+ 'rate_limit_exceeded',
18
+ 'agent_auth_failure',
19
+ 'body_inspection',
20
+ ];
21
+ // ─── WebhookManager ──────────────────────────────────────────────
22
+ export class WebhookManager {
23
+ db;
24
+ logger;
25
+ maxRetries;
26
+ baseDelayMs;
27
+ timeoutMs;
28
+ testTransport;
29
+ constructor(options) {
30
+ this.db = options.db;
31
+ this.logger = createLogger({
32
+ module: 'webhook',
33
+ level: options.logLevel ?? 'info',
34
+ });
35
+ this.maxRetries = options.maxRetries ?? 3;
36
+ this.baseDelayMs = options.baseDelayMs ?? 1000;
37
+ this.timeoutMs = options.timeoutMs ?? 10_000;
38
+ this.testTransport = options._testTransport;
39
+ }
40
+ // ─── CRUD ────────────────────────────────────────────────────
41
+ /**
42
+ * Register a new webhook endpoint.
43
+ */
44
+ add(params) {
45
+ // Validate URL
46
+ const parsed = new URL(params.url);
47
+ if (!['http:', 'https:'].includes(parsed.protocol)) {
48
+ throw new Error(`Invalid webhook URL protocol: ${parsed.protocol} (must be http or https)`);
49
+ }
50
+ // Validate events
51
+ for (const event of params.events) {
52
+ if (!WEBHOOK_EVENT_TYPES.includes(event)) {
53
+ throw new Error(`Invalid event type: ${event}. Valid types: ${WEBHOOK_EVENT_TYPES.join(', ')}`);
54
+ }
55
+ }
56
+ if (params.events.length === 0) {
57
+ throw new Error('At least one event type is required');
58
+ }
59
+ const id = crypto.randomUUID();
60
+ const secret = crypto.randomBytes(32).toString('hex');
61
+ this.db
62
+ .prepare(`INSERT INTO webhooks (id, url, events, label, secret)
63
+ VALUES (?, ?, ?, ?, ?)`)
64
+ .run(id, params.url, JSON.stringify(params.events), params.label ?? null, secret);
65
+ this.logger.info({ id, url: params.url, events: params.events }, 'Webhook registered');
66
+ return {
67
+ id,
68
+ url: params.url,
69
+ events: params.events,
70
+ label: params.label,
71
+ secret,
72
+ createdAt: new Date().toISOString(),
73
+ };
74
+ }
75
+ /**
76
+ * List all registered webhooks.
77
+ */
78
+ list() {
79
+ const rows = this.db
80
+ .prepare('SELECT * FROM webhooks ORDER BY created_at DESC')
81
+ .all();
82
+ return rows.map((row) => this.rowToWebhook(row));
83
+ }
84
+ /**
85
+ * Get a webhook by ID.
86
+ */
87
+ getById(id) {
88
+ const row = this.db.prepare('SELECT * FROM webhooks WHERE id = ?').get(id);
89
+ return row ? this.rowToWebhook(row) : null;
90
+ }
91
+ /**
92
+ * Remove a webhook by ID.
93
+ */
94
+ remove(id) {
95
+ const result = this.db.prepare('DELETE FROM webhooks WHERE id = ?').run(id);
96
+ if (result.changes > 0) {
97
+ this.logger.info({ id }, 'Webhook removed');
98
+ return true;
99
+ }
100
+ return false;
101
+ }
102
+ // ─── Event Emission ──────────────────────────────────────────
103
+ /**
104
+ * Emit an event to all matching webhooks.
105
+ * This is fire-and-forget — it never blocks the caller.
106
+ */
107
+ emit(event, details) {
108
+ const payload = {
109
+ id: crypto.randomUUID(),
110
+ event,
111
+ timestamp: new Date().toISOString(),
112
+ details,
113
+ };
114
+ // Find all webhooks subscribed to this event
115
+ const webhooks = this.list().filter((w) => w.events.includes(event));
116
+ if (webhooks.length === 0)
117
+ return;
118
+ this.logger.debug({ event, webhookCount: webhooks.length, payloadId: payload.id }, 'Emitting webhook event');
119
+ // Fire-and-forget — don't await, don't block
120
+ for (const webhook of webhooks) {
121
+ this.deliver(webhook, payload).catch((err) => {
122
+ this.logger.error({ webhookId: webhook.id, url: webhook.url, err: String(err) }, 'Webhook delivery failed after all retries');
123
+ });
124
+ }
125
+ }
126
+ // ─── Delivery ────────────────────────────────────────────────
127
+ /**
128
+ * Deliver a payload to a webhook endpoint with retries.
129
+ */
130
+ async deliver(webhook, payload) {
131
+ const body = JSON.stringify(payload);
132
+ const signature = this.sign(body, webhook.secret);
133
+ const headers = {
134
+ 'Content-Type': 'application/json',
135
+ 'X-Aegis-Signature': signature,
136
+ 'X-Aegis-Event': payload.event,
137
+ 'X-Aegis-Delivery': payload.id,
138
+ 'User-Agent': 'Aegis-Webhook/1.0',
139
+ };
140
+ for (let attempt = 0; attempt <= this.maxRetries; attempt++) {
141
+ try {
142
+ const statusCode = await this.send(webhook.url, body, headers);
143
+ if (statusCode >= 200 && statusCode < 300) {
144
+ this.logger.debug({ webhookId: webhook.id, status: statusCode, attempt }, 'Webhook delivered');
145
+ return;
146
+ }
147
+ // Non-2xx but not a network error — log and retry
148
+ this.logger.warn({ webhookId: webhook.id, status: statusCode, attempt }, 'Webhook delivery non-2xx response');
149
+ }
150
+ catch (err) {
151
+ this.logger.warn({ webhookId: webhook.id, attempt, err: String(err) }, 'Webhook delivery failed');
152
+ }
153
+ // Exponential backoff before retry (skip delay on last attempt)
154
+ if (attempt < this.maxRetries) {
155
+ const delay = this.baseDelayMs * 2 ** attempt;
156
+ await this.sleep(delay);
157
+ }
158
+ }
159
+ // All retries exhausted
160
+ throw new Error(`Webhook delivery failed after ${this.maxRetries + 1} attempts to ${webhook.url}`);
161
+ }
162
+ /**
163
+ * Send an HTTP/HTTPS POST request.
164
+ */
165
+ send(url, body, headers) {
166
+ // Use test transport if provided
167
+ if (this.testTransport) {
168
+ return this.testTransport(url, body, headers);
169
+ }
170
+ return new Promise((resolve, reject) => {
171
+ const parsed = new URL(url);
172
+ const transport = parsed.protocol === 'https:' ? https : http;
173
+ const req = transport.request({
174
+ hostname: parsed.hostname,
175
+ port: parsed.port || (parsed.protocol === 'https:' ? 443 : 80),
176
+ path: parsed.pathname + parsed.search,
177
+ method: 'POST',
178
+ headers: {
179
+ ...headers,
180
+ 'Content-Length': Buffer.byteLength(body),
181
+ },
182
+ timeout: this.timeoutMs,
183
+ }, (res) => {
184
+ // Consume response body to free socket
185
+ res.resume();
186
+ resolve(res.statusCode ?? 0);
187
+ });
188
+ req.on('error', reject);
189
+ req.on('timeout', () => {
190
+ req.destroy(new Error('Webhook request timeout'));
191
+ });
192
+ req.write(body);
193
+ req.end();
194
+ });
195
+ }
196
+ /**
197
+ * HMAC-SHA256 signature for payload verification.
198
+ * Recipients can verify the webhook came from Aegis using:
199
+ * sha256=HMAC(body, secret)
200
+ */
201
+ sign(body, secret) {
202
+ const hmac = crypto.createHmac('sha256', secret);
203
+ hmac.update(body);
204
+ return `sha256=${hmac.digest('hex')}`;
205
+ }
206
+ /**
207
+ * Sleep for a given number of milliseconds.
208
+ */
209
+ sleep(ms) {
210
+ return new Promise((resolve) => setTimeout(resolve, ms));
211
+ }
212
+ rowToWebhook(row) {
213
+ return {
214
+ id: row.id,
215
+ url: row.url,
216
+ events: JSON.parse(row.events),
217
+ label: row.label ?? undefined,
218
+ secret: row.secret,
219
+ createdAt: row.created_at,
220
+ };
221
+ }
222
+ // ─── Credential Expiry Checking ────────────────────────────────
223
+ /**
224
+ * Check all credentials in the vault for approaching expiry.
225
+ * Emits `credential_expiry` webhook events for credentials expiring within `thresholdDays`.
226
+ * Returns the number of credentials that triggered alerts.
227
+ */
228
+ checkExpiringCredentials(vault, thresholdDays = 7) {
229
+ const credentials = vault.list();
230
+ const now = new Date();
231
+ const thresholdMs = thresholdDays * 24 * 60 * 60 * 1000;
232
+ let alertCount = 0;
233
+ for (const cred of credentials) {
234
+ if (!cred.expiresAt)
235
+ continue;
236
+ const expiresAt = new Date(cred.expiresAt);
237
+ const timeRemaining = expiresAt.getTime() - now.getTime();
238
+ // Already expired
239
+ if (timeRemaining <= 0) {
240
+ this.emit('credential_expiry', {
241
+ credential: cred.name,
242
+ service: cred.service,
243
+ expiredAt: cred.expiresAt,
244
+ status: 'expired',
245
+ daysRemaining: 0,
246
+ });
247
+ alertCount++;
248
+ continue;
249
+ }
250
+ // Expiring soon (within threshold)
251
+ if (timeRemaining <= thresholdMs) {
252
+ const daysRemaining = Math.ceil(timeRemaining / (24 * 60 * 60 * 1000));
253
+ this.emit('credential_expiry', {
254
+ credential: cred.name,
255
+ service: cred.service,
256
+ expiresAt: cred.expiresAt,
257
+ status: 'expiring_soon',
258
+ daysRemaining,
259
+ });
260
+ alertCount++;
261
+ }
262
+ }
263
+ if (alertCount > 0) {
264
+ this.logger.info({ alertCount, thresholdDays }, 'Credential expiry check completed with alerts');
265
+ }
266
+ return alertCount;
267
+ }
268
+ }
269
+ //# sourceMappingURL=webhook.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"webhook.js","sourceRoot":"","sources":["../../src/webhook/webhook.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,7 @@
1
1
  {
2
2
  "name": "@getaegis/cli",
3
- "version": "0.8.0",
3
+ "version": "0.9.0",
4
+ "mcpName": "io.github.getaegis/aegis",
4
5
  "description": "Credential isolation for AI agents. Store, guard, and record — your agent never sees your API keys.",
5
6
  "type": "module",
6
7
  "main": "dist/index.js",
@@ -32,8 +33,11 @@
32
33
  "format": "biome format --write src/ tests/",
33
34
  "typecheck": "tsc --noEmit",
34
35
  "verify": "biome check src/ tests/ && tsc --noEmit",
36
+ "bench": "tsx benchmarks/run.ts",
37
+ "bench:memory": "tsx --expose-gc benchmarks/memory-check.ts",
35
38
  "prepublishOnly": "yarn build && yarn test",
36
- "prepare": "husky"
39
+ "prepare": "husky",
40
+ "release": "release-it"
37
41
  },
38
42
  "lint-staged": {
39
43
  "*.{ts,tsx,js,jsx}": [
@@ -53,7 +57,7 @@
53
57
  "dependencies": {
54
58
  "@modelcontextprotocol/sdk": "^1.27.1",
55
59
  "@types/ws": "^8.18.1",
56
- "better-sqlite3": "^11.8.0",
60
+ "better-sqlite3-multiple-ciphers": "^12.6.2",
57
61
  "chalk": "^5.4.1",
58
62
  "commander": "^13.1.0",
59
63
  "pino": "^10.3.1",
@@ -65,12 +69,14 @@
65
69
  },
66
70
  "devDependencies": {
67
71
  "@biomejs/biome": "^2.4.4",
68
- "@types/better-sqlite3": "^7.6.12",
72
+ "@release-it/conventional-changelog": "^10.0.5",
73
+ "@types/autocannon": "^7.12.7",
69
74
  "@types/node": "^22.13.0",
70
- "@types/pino": "^7.0.5",
75
+ "autocannon": "^8.0.0",
71
76
  "husky": "^9.1.7",
72
77
  "lint-staged": "^16.2.7",
73
78
  "pino-pretty": "^13.1.3",
79
+ "release-it": "^19.2.4",
74
80
  "tsx": "^4.19.0",
75
81
  "typescript": "^5.7.0",
76
82
  "vitest": "^3.0.0"
@@ -79,4 +85,4 @@
79
85
  "node": ">=20.0.0"
80
86
  },
81
87
  "packageManager": "yarn@4.12.0+sha512.f45ab632439a67f8bc759bf32ead036a1f413287b9042726b7cc4818b7b49e14e9423ba49b18f9e06ea4941c1ad062385b1d8760a8d5091a1a31e5f6219afca8"
82
- }
88
+ }