@getaegis/cli 0.8.0 → 0.8.1

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 (210) hide show
  1. package/README.md +5 -0
  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 +189 -0
  25. package/dist/cli/commands/dashboard.js.map +1 -0
  26. package/dist/cli/commands/doctor.d.ts +6 -0
  27. package/dist/cli/commands/doctor.d.ts.map +1 -0
  28. package/dist/cli/commands/doctor.js +39 -0
  29. package/dist/cli/commands/doctor.js.map +1 -0
  30. package/dist/cli/commands/gate.d.ts +6 -0
  31. package/dist/cli/commands/gate.d.ts.map +1 -0
  32. package/dist/cli/commands/gate.js +196 -0
  33. package/dist/cli/commands/gate.js.map +1 -0
  34. package/dist/cli/commands/init.d.ts +6 -0
  35. package/dist/cli/commands/init.d.ts.map +1 -0
  36. package/dist/cli/commands/init.js +109 -0
  37. package/dist/cli/commands/init.js.map +1 -0
  38. package/dist/cli/commands/ledger.d.ts +6 -0
  39. package/dist/cli/commands/ledger.d.ts.map +1 -0
  40. package/dist/cli/commands/ledger.js +140 -0
  41. package/dist/cli/commands/ledger.js.map +1 -0
  42. package/dist/cli/commands/mcp.d.ts +6 -0
  43. package/dist/cli/commands/mcp.d.ts.map +1 -0
  44. package/dist/cli/commands/mcp.js +224 -0
  45. package/dist/cli/commands/mcp.js.map +1 -0
  46. package/dist/cli/commands/policy.d.ts +6 -0
  47. package/dist/cli/commands/policy.d.ts.map +1 -0
  48. package/dist/cli/commands/policy.js +126 -0
  49. package/dist/cli/commands/policy.js.map +1 -0
  50. package/dist/cli/commands/user.d.ts +6 -0
  51. package/dist/cli/commands/user.d.ts.map +1 -0
  52. package/dist/cli/commands/user.js +150 -0
  53. package/dist/cli/commands/user.js.map +1 -0
  54. package/dist/cli/commands/vault-manager.d.ts +6 -0
  55. package/dist/cli/commands/vault-manager.d.ts.map +1 -0
  56. package/dist/cli/commands/vault-manager.js +240 -0
  57. package/dist/cli/commands/vault-manager.js.map +1 -0
  58. package/dist/cli/commands/vault.d.ts +6 -0
  59. package/dist/cli/commands/vault.d.ts.map +1 -0
  60. package/dist/cli/commands/vault.js +241 -0
  61. package/dist/cli/commands/vault.js.map +1 -0
  62. package/dist/cli/commands/webhook.d.ts +6 -0
  63. package/dist/cli/commands/webhook.d.ts.map +1 -0
  64. package/dist/cli/commands/webhook.js +151 -0
  65. package/dist/cli/commands/webhook.js.map +1 -0
  66. package/dist/cli/helpers.d.ts +12 -0
  67. package/dist/cli/helpers.d.ts.map +1 -0
  68. package/dist/cli/helpers.js +61 -0
  69. package/dist/cli/helpers.js.map +1 -0
  70. package/dist/cli/index.d.ts +17 -0
  71. package/dist/cli/index.d.ts.map +1 -0
  72. package/dist/cli/index.js +17 -0
  73. package/dist/cli/index.js.map +1 -0
  74. package/dist/cli/validation.d.ts +37 -0
  75. package/dist/cli/validation.d.ts.map +1 -0
  76. package/dist/cli/validation.js +104 -0
  77. package/dist/cli/validation.js.map +1 -0
  78. package/dist/cli.d.ts +3 -0
  79. package/dist/cli.d.ts.map +1 -0
  80. package/dist/cli.js +30 -0
  81. package/dist/cli.js.map +1 -0
  82. package/dist/config.d.ts +108 -0
  83. package/dist/config.d.ts.map +1 -0
  84. package/dist/config.js +355 -0
  85. package/dist/config.js.map +1 -0
  86. package/dist/dashboard/dashboard-server.d.ts +95 -0
  87. package/dist/dashboard/dashboard-server.d.ts.map +1 -0
  88. package/dist/dashboard/dashboard-server.js +329 -0
  89. package/dist/dashboard/dashboard-server.js.map +1 -0
  90. package/dist/dashboard/index.d.ts +3 -0
  91. package/dist/dashboard/index.d.ts.map +1 -0
  92. package/dist/dashboard/index.js +2 -0
  93. package/dist/dashboard/index.js.map +1 -0
  94. package/dist/dashboard/public/assets/index-CpMruPNh.css +1 -0
  95. package/dist/dashboard/public/assets/index-DkHiw9_f.js +148 -0
  96. package/dist/dashboard/public/favicon.svg +6 -0
  97. package/dist/dashboard/public/index.html +14 -0
  98. package/dist/db.d.ts +15 -0
  99. package/dist/db.d.ts.map +1 -0
  100. package/dist/db.js +190 -0
  101. package/dist/db.js.map +1 -0
  102. package/dist/doctor.d.ts +37 -0
  103. package/dist/doctor.d.ts.map +1 -0
  104. package/dist/doctor.js +196 -0
  105. package/dist/doctor.js.map +1 -0
  106. package/dist/gate/body-inspector.d.ts +31 -0
  107. package/dist/gate/body-inspector.d.ts.map +1 -0
  108. package/dist/gate/body-inspector.js +193 -0
  109. package/dist/gate/body-inspector.js.map +1 -0
  110. package/dist/gate/gate.d.ts +168 -0
  111. package/dist/gate/gate.d.ts.map +1 -0
  112. package/dist/gate/gate.js +1016 -0
  113. package/dist/gate/gate.js.map +1 -0
  114. package/dist/gate/index.d.ts +7 -0
  115. package/dist/gate/index.d.ts.map +1 -0
  116. package/dist/gate/index.js +4 -0
  117. package/dist/gate/index.js.map +1 -0
  118. package/dist/gate/rate-limiter.d.ts +59 -0
  119. package/dist/gate/rate-limiter.d.ts.map +1 -0
  120. package/dist/gate/rate-limiter.js +120 -0
  121. package/dist/gate/rate-limiter.js.map +1 -0
  122. package/dist/index.d.ts +26 -0
  123. package/dist/index.d.ts.map +1 -0
  124. package/dist/index.js +16 -0
  125. package/dist/index.js.map +1 -0
  126. package/dist/ledger/index.d.ts +3 -0
  127. package/dist/ledger/index.d.ts.map +1 -0
  128. package/dist/ledger/index.js +2 -0
  129. package/dist/ledger/index.js.map +1 -0
  130. package/dist/ledger/ledger.d.ts +98 -0
  131. package/dist/ledger/ledger.d.ts.map +1 -0
  132. package/dist/ledger/ledger.js +145 -0
  133. package/dist/ledger/ledger.js.map +1 -0
  134. package/dist/logger/index.d.ts +3 -0
  135. package/dist/logger/index.d.ts.map +1 -0
  136. package/dist/logger/index.js +2 -0
  137. package/dist/logger/index.js.map +1 -0
  138. package/dist/logger/logger.d.ts +58 -0
  139. package/dist/logger/logger.d.ts.map +1 -0
  140. package/dist/logger/logger.js +201 -0
  141. package/dist/logger/logger.js.map +1 -0
  142. package/dist/mcp/index.d.ts +3 -0
  143. package/dist/mcp/index.d.ts.map +1 -0
  144. package/dist/mcp/index.js +2 -0
  145. package/dist/mcp/index.js.map +1 -0
  146. package/dist/mcp/mcp-server.d.ts +130 -0
  147. package/dist/mcp/mcp-server.d.ts.map +1 -0
  148. package/dist/mcp/mcp-server.js +775 -0
  149. package/dist/mcp/mcp-server.js.map +1 -0
  150. package/dist/metrics/index.d.ts +3 -0
  151. package/dist/metrics/index.d.ts.map +1 -0
  152. package/dist/metrics/index.js +2 -0
  153. package/dist/metrics/index.js.map +1 -0
  154. package/dist/metrics/metrics.d.ts +88 -0
  155. package/dist/metrics/metrics.d.ts.map +1 -0
  156. package/dist/metrics/metrics.js +179 -0
  157. package/dist/metrics/metrics.js.map +1 -0
  158. package/dist/policy/index.d.ts +3 -0
  159. package/dist/policy/index.d.ts.map +1 -0
  160. package/dist/policy/index.js +2 -0
  161. package/dist/policy/index.js.map +1 -0
  162. package/dist/policy/policy.d.ts +119 -0
  163. package/dist/policy/policy.d.ts.map +1 -0
  164. package/dist/policy/policy.js +426 -0
  165. package/dist/policy/policy.js.map +1 -0
  166. package/dist/user/index.d.ts +3 -0
  167. package/dist/user/index.d.ts.map +1 -0
  168. package/dist/user/index.js +2 -0
  169. package/dist/user/index.js.map +1 -0
  170. package/dist/user/user.d.ts +102 -0
  171. package/dist/user/user.d.ts.map +1 -0
  172. package/dist/user/user.js +216 -0
  173. package/dist/user/user.js.map +1 -0
  174. package/dist/vault/crypto.d.ts +28 -0
  175. package/dist/vault/crypto.d.ts.map +1 -0
  176. package/dist/vault/crypto.js +44 -0
  177. package/dist/vault/crypto.js.map +1 -0
  178. package/dist/vault/index.d.ts +10 -0
  179. package/dist/vault/index.d.ts.map +1 -0
  180. package/dist/vault/index.js +6 -0
  181. package/dist/vault/index.js.map +1 -0
  182. package/dist/vault/seal.d.ts +68 -0
  183. package/dist/vault/seal.d.ts.map +1 -0
  184. package/dist/vault/seal.js +110 -0
  185. package/dist/vault/seal.js.map +1 -0
  186. package/dist/vault/shamir.d.ts +33 -0
  187. package/dist/vault/shamir.d.ts.map +1 -0
  188. package/dist/vault/shamir.js +174 -0
  189. package/dist/vault/shamir.js.map +1 -0
  190. package/dist/vault/vault-manager.d.ts +62 -0
  191. package/dist/vault/vault-manager.d.ts.map +1 -0
  192. package/dist/vault/vault-manager.js +141 -0
  193. package/dist/vault/vault-manager.js.map +1 -0
  194. package/dist/vault/vault.d.ts +104 -0
  195. package/dist/vault/vault.d.ts.map +1 -0
  196. package/dist/vault/vault.js +259 -0
  197. package/dist/vault/vault.js.map +1 -0
  198. package/dist/version.d.ts +3 -0
  199. package/dist/version.d.ts.map +1 -0
  200. package/dist/version.js +18 -0
  201. package/dist/version.js.map +1 -0
  202. package/dist/webhook/index.d.ts +3 -0
  203. package/dist/webhook/index.d.ts.map +1 -0
  204. package/dist/webhook/index.js +2 -0
  205. package/dist/webhook/index.js.map +1 -0
  206. package/dist/webhook/webhook.d.ts +114 -0
  207. package/dist/webhook/webhook.d.ts.map +1 -0
  208. package/dist/webhook/webhook.js +269 -0
  209. package/dist/webhook/webhook.js.map +1 -0
  210. package/package.json +7 -3
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/logger/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,YAAY,EAAE,iBAAiB,EAAE,QAAQ,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC"}
@@ -0,0 +1,58 @@
1
+ /**
2
+ * Aegis Logger — structured logging with pino.
3
+ *
4
+ * Central logger factory for all Aegis modules. Provides:
5
+ * - Structured JSON output in production, pretty-print in development
6
+ * - Declarative field-level redaction (secrets, tokens, passwords)
7
+ * - Pattern-based scrubbing for credential-like strings in log values
8
+ * - Request correlation IDs via child loggers
9
+ * - stderr output support (required for MCP stdio transport)
10
+ *
11
+ * SECURITY: This is a security product — secrets must NEVER appear in logs.
12
+ * The logger enforces this through three layers:
13
+ * 1. Pino's `redact` option censors known sensitive field paths
14
+ * 2. Custom serializers scrub credential-like patterns from string values
15
+ * 3. The `safeMeta()` helper strips sensitive fields from ad-hoc objects
16
+ */
17
+ import pino from 'pino';
18
+ export type LogLevel = 'debug' | 'info' | 'warn' | 'error' | 'fatal' | 'silent';
19
+ export interface LoggerOptions {
20
+ /** Minimum log level (default: 'info') */
21
+ level?: LogLevel;
22
+ /** Module name — appears as `module` field in every log entry (e.g. 'gate', 'mcp', 'vault') */
23
+ module?: string;
24
+ /** Use pretty-print instead of JSON (default: auto-detect from NODE_ENV) */
25
+ pretty?: boolean;
26
+ /** Write to stderr instead of stdout (required for MCP stdio transport) */
27
+ stderr?: boolean;
28
+ }
29
+ /**
30
+ * Scrub credential-like patterns from a string value.
31
+ * Replaces matches with [REDACTED] to prevent accidental exposure.
32
+ */
33
+ export declare function scrubString(value: string): string;
34
+ /**
35
+ * Strip sensitive fields from an arbitrary object before logging.
36
+ * Use this for ad-hoc metadata objects that aren't covered by pino's redact paths.
37
+ */
38
+ export declare function safeMeta(obj: Record<string, unknown>): Record<string, unknown>;
39
+ /**
40
+ * Create a pino logger instance for an Aegis module.
41
+ *
42
+ * @example
43
+ * ```ts
44
+ * const logger = createLogger({ module: 'gate', level: 'debug' });
45
+ * logger.info({ service: 'slack', method: 'GET' }, 'Request proxied');
46
+ *
47
+ * // Child logger with request correlation ID
48
+ * const reqLogger = logger.child({ requestId: generateRequestId() });
49
+ * reqLogger.info({ status: 200 }, 'Response sent');
50
+ * ```
51
+ */
52
+ export declare function createLogger(options?: LoggerOptions): pino.Logger;
53
+ /**
54
+ * Generate a unique request correlation ID.
55
+ * Included in all log entries for a given request, and stored in Ledger records.
56
+ */
57
+ export declare function generateRequestId(): string;
58
+ //# sourceMappingURL=logger.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"logger.d.ts","sourceRoot":"","sources":["../../src/logger/logger.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AAGH,OAAO,IAAI,MAAM,MAAM,CAAC;AAIxB,MAAM,MAAM,QAAQ,GAAG,OAAO,GAAG,MAAM,GAAG,MAAM,GAAG,OAAO,GAAG,OAAO,GAAG,QAAQ,CAAC;AAEhF,MAAM,WAAW,aAAa;IAC5B,0CAA0C;IAC1C,KAAK,CAAC,EAAE,QAAQ,CAAC;IACjB,+FAA+F;IAC/F,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,4EAA4E;IAC5E,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,2EAA2E;IAC3E,MAAM,CAAC,EAAE,OAAO,CAAC;CAClB;AA8ED;;;GAGG;AACH,wBAAgB,WAAW,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAQjD;AAED;;;GAGG;AACH,wBAAgB,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAgC9E;AAID;;;;;;;;;;;;GAYG;AACH,wBAAgB,YAAY,CAAC,OAAO,GAAE,aAAkB,GAAG,IAAI,CAAC,MAAM,CA2CrE;AAID;;;GAGG;AACH,wBAAgB,iBAAiB,IAAI,MAAM,CAE1C"}
@@ -0,0 +1,201 @@
1
+ /**
2
+ * Aegis Logger — structured logging with pino.
3
+ *
4
+ * Central logger factory for all Aegis modules. Provides:
5
+ * - Structured JSON output in production, pretty-print in development
6
+ * - Declarative field-level redaction (secrets, tokens, passwords)
7
+ * - Pattern-based scrubbing for credential-like strings in log values
8
+ * - Request correlation IDs via child loggers
9
+ * - stderr output support (required for MCP stdio transport)
10
+ *
11
+ * SECURITY: This is a security product — secrets must NEVER appear in logs.
12
+ * The logger enforces this through three layers:
13
+ * 1. Pino's `redact` option censors known sensitive field paths
14
+ * 2. Custom serializers scrub credential-like patterns from string values
15
+ * 3. The `safeMeta()` helper strips sensitive fields from ad-hoc objects
16
+ */
17
+ import { randomUUID } from 'node:crypto';
18
+ import pino from 'pino';
19
+ // ─── Redaction ───────────────────────────────────────────────────
20
+ /**
21
+ * Field paths that are always redacted from log output.
22
+ * Uses pino's path syntax — supports wildcards and nested paths.
23
+ */
24
+ const REDACT_PATHS = [
25
+ // Direct secret fields
26
+ 'secret',
27
+ 'password',
28
+ 'masterKey',
29
+ 'master_key',
30
+ 'token',
31
+ 'apiKey',
32
+ 'api_key',
33
+ 'accessToken',
34
+ 'access_token',
35
+ 'refreshToken',
36
+ 'refresh_token',
37
+ 'clientSecret',
38
+ 'client_secret',
39
+ // Nested in objects
40
+ '*.secret',
41
+ '*.password',
42
+ '*.masterKey',
43
+ '*.master_key',
44
+ '*.token',
45
+ '*.apiKey',
46
+ '*.api_key',
47
+ '*.accessToken',
48
+ '*.access_token',
49
+ // HTTP headers that carry credentials
50
+ 'headers.authorization',
51
+ 'headers.Authorization',
52
+ 'headers.x-api-key',
53
+ 'headers.X-API-Key',
54
+ 'headers.x-aegis-agent',
55
+ 'headers.X-Aegis-Agent',
56
+ 'headers.cookie',
57
+ 'headers.Cookie',
58
+ 'headers.set-cookie',
59
+ 'headers.Set-Cookie',
60
+ 'headers.proxy-authorization',
61
+ 'headers.Proxy-Authorization',
62
+ // Credential object fields
63
+ 'credential.secret',
64
+ 'credential.password',
65
+ 'credential.token',
66
+ ];
67
+ // ─── Pattern Scrubbing ──────────────────────────────────────────
68
+ /**
69
+ * Patterns that look like credentials in arbitrary string values.
70
+ * These catch secrets that end up in unexpected places (error messages, URLs, etc.).
71
+ */
72
+ const CREDENTIAL_PATTERNS = [
73
+ // Bearer tokens
74
+ /Bearer\s+[A-Za-z0-9\-._~+/]+=*/g,
75
+ // Basic auth
76
+ /Basic\s+[A-Za-z0-9+/]+=*/g,
77
+ // Common API key formats (sk-, pk-, key-, etc.)
78
+ /\b(sk|pk|key|api|token|secret|password)[-_][A-Za-z0-9\-._]{16,}\b/gi,
79
+ // AWS-style keys
80
+ /\b(AKIA|ASIA)[A-Z0-9]{16}\b/g,
81
+ // Long hex strings (32+ chars — likely keys/tokens)
82
+ /\b[0-9a-f]{32,}\b/gi,
83
+ // JWT-like patterns (three dot-separated base64 segments)
84
+ /\beyJ[A-Za-z0-9_-]+\.eyJ[A-Za-z0-9_-]+\.[A-Za-z0-9_-]+\b/g,
85
+ // Aegis agent tokens
86
+ /\baegis_[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}_[0-9a-f]+\b/g,
87
+ ];
88
+ /**
89
+ * Scrub credential-like patterns from a string value.
90
+ * Replaces matches with [REDACTED] to prevent accidental exposure.
91
+ */
92
+ export function scrubString(value) {
93
+ let result = value;
94
+ for (const pattern of CREDENTIAL_PATTERNS) {
95
+ // Reset lastIndex for global regexes
96
+ pattern.lastIndex = 0;
97
+ result = result.replace(pattern, '[REDACTED]');
98
+ }
99
+ return result;
100
+ }
101
+ /**
102
+ * Strip sensitive fields from an arbitrary object before logging.
103
+ * Use this for ad-hoc metadata objects that aren't covered by pino's redact paths.
104
+ */
105
+ export function safeMeta(obj) {
106
+ const sensitiveKeys = new Set([
107
+ 'secret',
108
+ 'password',
109
+ 'masterkey',
110
+ 'master_key',
111
+ 'token',
112
+ 'apikey',
113
+ 'api_key',
114
+ 'accesstoken',
115
+ 'access_token',
116
+ 'refreshtoken',
117
+ 'refresh_token',
118
+ 'clientsecret',
119
+ 'client_secret',
120
+ 'authorization',
121
+ 'cookie',
122
+ ]);
123
+ const result = {};
124
+ for (const [key, value] of Object.entries(obj)) {
125
+ if (sensitiveKeys.has(key.toLowerCase())) {
126
+ result[key] = '[REDACTED]';
127
+ }
128
+ else if (typeof value === 'string') {
129
+ result[key] = scrubString(value);
130
+ }
131
+ else if (value !== null && typeof value === 'object' && !Array.isArray(value)) {
132
+ result[key] = safeMeta(value);
133
+ }
134
+ else {
135
+ result[key] = value;
136
+ }
137
+ }
138
+ return result;
139
+ }
140
+ // ─── Logger Factory ─────────────────────────────────────────────
141
+ /**
142
+ * Create a pino logger instance for an Aegis module.
143
+ *
144
+ * @example
145
+ * ```ts
146
+ * const logger = createLogger({ module: 'gate', level: 'debug' });
147
+ * logger.info({ service: 'slack', method: 'GET' }, 'Request proxied');
148
+ *
149
+ * // Child logger with request correlation ID
150
+ * const reqLogger = logger.child({ requestId: generateRequestId() });
151
+ * reqLogger.info({ status: 200 }, 'Response sent');
152
+ * ```
153
+ */
154
+ export function createLogger(options = {}) {
155
+ const { level = 'info', module: moduleName, pretty, stderr = false } = options;
156
+ // Auto-detect pretty mode from NODE_ENV unless explicitly set
157
+ const usePretty = pretty ?? process.env.NODE_ENV !== 'production';
158
+ const pinoOptions = {
159
+ level,
160
+ redact: {
161
+ paths: REDACT_PATHS,
162
+ censor: '[REDACTED]',
163
+ },
164
+ // Add the module name as a base field on every log entry
165
+ ...(moduleName ? { base: { module: moduleName } } : { base: {} }),
166
+ // Use ISO timestamps for consistency
167
+ timestamp: pino.stdTimeFunctions.isoTime,
168
+ formatters: {
169
+ level(label) {
170
+ return { level: label };
171
+ },
172
+ },
173
+ };
174
+ // Destination: stderr (fd 2) or stdout (fd 1)
175
+ const fd = stderr ? 2 : 1;
176
+ if (usePretty) {
177
+ // Pretty-print for development — human-readable output
178
+ pinoOptions.transport = {
179
+ target: 'pino-pretty',
180
+ options: {
181
+ colorize: true,
182
+ translateTime: 'HH:MM:ss.l',
183
+ ignore: 'pid,hostname',
184
+ destination: fd,
185
+ },
186
+ };
187
+ return pino(pinoOptions);
188
+ }
189
+ // Production: JSON to stdout/stderr
190
+ const destination = pino.destination({ fd, sync: false });
191
+ return pino(pinoOptions, destination);
192
+ }
193
+ // ─── Correlation IDs ────────────────────────────────────────────
194
+ /**
195
+ * Generate a unique request correlation ID.
196
+ * Included in all log entries for a given request, and stored in Ledger records.
197
+ */
198
+ export function generateRequestId() {
199
+ return randomUUID();
200
+ }
201
+ //# sourceMappingURL=logger.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"logger.js","sourceRoot":"","sources":["../../src/logger/logger.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ export type { AegisMcpServerOptions } from './mcp-server.js';
2
+ export { AegisMcpServer } from './mcp-server.js';
3
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/mcp/index.ts"],"names":[],"mappings":"AAAA,YAAY,EAAE,qBAAqB,EAAE,MAAM,iBAAiB,CAAC;AAC7D,OAAO,EAAE,cAAc,EAAE,MAAM,iBAAiB,CAAC"}
@@ -0,0 +1,2 @@
1
+ export { AegisMcpServer } from './mcp-server.js';
2
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/mcp/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,cAAc,EAAE,MAAM,iBAAiB,CAAC"}
@@ -0,0 +1,130 @@
1
+ /**
2
+ * Aegis MCP Server — exposes Aegis credential isolation as MCP tools.
3
+ *
4
+ * The MCP server sits between an AI agent (MCP client) and external APIs.
5
+ * The agent uses tools to make authenticated API calls without ever seeing credentials.
6
+ *
7
+ * Tools:
8
+ * - aegis_proxy_request: Make an authenticated API call through Aegis
9
+ * - aegis_list_services: List available services (names only, never secrets)
10
+ * - aegis_health: Check Aegis status
11
+ *
12
+ * Transports:
13
+ * - stdio: For local process-spawned integrations (Claude Desktop, Cursor, VS Code)
14
+ * - streamable-http: For remote server access
15
+ */
16
+ import type { AgentRegistry } from '../agent/index.js';
17
+ import type { Ledger } from '../ledger/index.js';
18
+ import type { AegisMetrics } from '../metrics/index.js';
19
+ import type { PolicyValidationResult } from '../policy/index.js';
20
+ import type { Vault } from '../vault/index.js';
21
+ import type { WebhookManager } from '../webhook/index.js';
22
+ export interface AegisMcpServerOptions {
23
+ /** Vault instance for credential lookup and injection. */
24
+ vault: Vault;
25
+ /** Ledger instance for audit logging. */
26
+ ledger: Ledger;
27
+ /** Agent registry — required when agentToken is provided. */
28
+ agentRegistry?: AgentRegistry;
29
+ /** Pre-configured agent token for this MCP session. */
30
+ agentToken?: string;
31
+ /** Transport type. */
32
+ transport: 'stdio' | 'streamable-http';
33
+ /** Port for streamable-http transport (default: 3200). */
34
+ port?: number;
35
+ /** Policy validation results for policy evaluation. */
36
+ policies?: PolicyValidationResult[];
37
+ /** Policy enforcement mode (default: "enforce"). */
38
+ policyMode?: 'enforce' | 'dry-run';
39
+ /** Log level (default: "info"). */
40
+ logLevel?: 'debug' | 'info' | 'warn' | 'error';
41
+ /** Prometheus metrics collector. */
42
+ metrics?: AegisMetrics;
43
+ /** Webhook manager for alert notifications. */
44
+ webhooks?: WebhookManager;
45
+ }
46
+ /**
47
+ * Aegis MCP Server — wraps the Aegis credential isolation layer as an MCP server.
48
+ *
49
+ * This gives any MCP-compatible AI agent (Claude, ChatGPT, Cursor, VS Code Copilot)
50
+ * the ability to make authenticated API calls without ever seeing credentials.
51
+ */
52
+ export declare class AegisMcpServer {
53
+ private server;
54
+ private vault;
55
+ private ledger;
56
+ private agentRegistry?;
57
+ private authenticatedAgent?;
58
+ private transportType;
59
+ private port;
60
+ private policyMap;
61
+ private policyMode;
62
+ private logger;
63
+ private rateLimiter;
64
+ private bodyInspector;
65
+ private httpServer?;
66
+ private metrics?;
67
+ private webhooks?;
68
+ constructor(options: AegisMcpServerOptions);
69
+ private registerTools;
70
+ /**
71
+ * aegis_proxy_request — Make an authenticated API call through Aegis.
72
+ *
73
+ * The agent provides service, path, method, headers, and body.
74
+ * Aegis injects credentials, enforces domain guard, rate limits, body inspection,
75
+ * and policy evaluation — then returns the response.
76
+ */
77
+ private registerProxyRequestTool;
78
+ /**
79
+ * aegis_list_services — List available services the agent can use.
80
+ *
81
+ * Returns service names and domains only — never secrets.
82
+ */
83
+ private registerListServicesTool;
84
+ /**
85
+ * aegis_health — Check Aegis status.
86
+ */
87
+ private registerHealthTool;
88
+ /**
89
+ * Execute an authenticated proxy request through Aegis.
90
+ *
91
+ * This replicates the Gate's security pipeline:
92
+ * 1. Credential lookup
93
+ * 2. TTL check
94
+ * 3. Agent credential scoping
95
+ * 4. Policy evaluation
96
+ * 5. Agent rate limiting
97
+ * 6. Credential rate limiting
98
+ * 7. Domain guard
99
+ * 8. Body inspection
100
+ * 9. Credential injection + forward
101
+ * 10. Audit logging
102
+ */
103
+ private proxyRequest;
104
+ /**
105
+ * Make the actual outbound HTTP request with credential injection.
106
+ */
107
+ private makeOutboundRequest;
108
+ /**
109
+ * Inject the credential into outbound request headers based on auth type.
110
+ * For `query` auth, the secret is appended as a URL query parameter instead.
111
+ */
112
+ private injectCredential;
113
+ /**
114
+ * Start the MCP server with the configured transport.
115
+ */
116
+ start(): Promise<void>;
117
+ /**
118
+ * Start with stdio transport (for local integrations).
119
+ */
120
+ private startStdio;
121
+ /**
122
+ * Start with Streamable HTTP transport (for remote access).
123
+ */
124
+ private startStreamableHttp;
125
+ /**
126
+ * Stop the MCP server.
127
+ */
128
+ stop(): Promise<void>;
129
+ }
130
+ //# sourceMappingURL=mcp-server.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mcp-server.d.ts","sourceRoot":"","sources":["../../src/mcp/mcp-server.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AASH,OAAO,KAAK,EAAS,aAAa,EAAE,MAAM,mBAAmB,CAAC;AAI9D,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,oBAAoB,CAAC;AAEjD,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AACxD,OAAO,KAAK,EAAU,sBAAsB,EAAE,MAAM,oBAAoB,CAAC;AAEzE,OAAO,KAAK,EAAwB,KAAK,EAAE,MAAM,mBAAmB,CAAC;AAErE,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC;AAI1D,MAAM,WAAW,qBAAqB;IACpC,0DAA0D;IAC1D,KAAK,EAAE,KAAK,CAAC;IACb,yCAAyC;IACzC,MAAM,EAAE,MAAM,CAAC;IACf,6DAA6D;IAC7D,aAAa,CAAC,EAAE,aAAa,CAAC;IAC9B,uDAAuD;IACvD,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,sBAAsB;IACtB,SAAS,EAAE,OAAO,GAAG,iBAAiB,CAAC;IACvC,0DAA0D;IAC1D,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,uDAAuD;IACvD,QAAQ,CAAC,EAAE,sBAAsB,EAAE,CAAC;IACpC,oDAAoD;IACpD,UAAU,CAAC,EAAE,SAAS,GAAG,SAAS,CAAC;IACnC,mCAAmC;IACnC,QAAQ,CAAC,EAAE,OAAO,GAAG,MAAM,GAAG,MAAM,GAAG,OAAO,CAAC;IAC/C,oCAAoC;IACpC,OAAO,CAAC,EAAE,YAAY,CAAC;IACvB,+CAA+C;IAC/C,QAAQ,CAAC,EAAE,cAAc,CAAC;CAC3B;AAUD;;;;;GAKG;AACH,qBAAa,cAAc;IACzB,OAAO,CAAC,MAAM,CAAY;IAC1B,OAAO,CAAC,KAAK,CAAQ;IACrB,OAAO,CAAC,MAAM,CAAS;IACvB,OAAO,CAAC,aAAa,CAAC,CAAgB;IACtC,OAAO,CAAC,kBAAkB,CAAC,CAAQ;IACnC,OAAO,CAAC,aAAa,CAA8B;IACnD,OAAO,CAAC,IAAI,CAAS;IACrB,OAAO,CAAC,SAAS,CAAsB;IACvC,OAAO,CAAC,UAAU,CAAwB;IAC1C,OAAO,CAAC,MAAM,CAAc;IAC5B,OAAO,CAAC,WAAW,CAAc;IACjC,OAAO,CAAC,aAAa,CAAgB;IACrC,OAAO,CAAC,UAAU,CAAC,CAAc;IACjC,OAAO,CAAC,OAAO,CAAC,CAAe;IAC/B,OAAO,CAAC,QAAQ,CAAC,CAAiB;gBAEtB,OAAO,EAAE,qBAAqB;IAgD1C,OAAO,CAAC,aAAa;IAMrB;;;;;;OAMG;IACH,OAAO,CAAC,wBAAwB;IAmEhC;;;;OAIG;IACH,OAAO,CAAC,wBAAwB;IA2ChC;;OAEG;IACH,OAAO,CAAC,kBAAkB;IA4C1B;;;;;;;;;;;;;;OAcG;YACW,YAAY;IA6Y1B;;OAEG;IACH,OAAO,CAAC,mBAAmB;IA6F3B;;;OAGG;IACH,OAAO,CAAC,gBAAgB;IA8BxB;;OAEG;IACG,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IAQ5B;;OAEG;YACW,UAAU;IAMxB;;OAEG;YACW,mBAAmB;IAwFjC;;OAEG;IACG,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;CAa5B"}