@defai.digital/ax-cli 3.14.13 → 3.14.16

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 (49) hide show
  1. package/.ax-cli/CUSTOM.md +97 -0
  2. package/.ax-cli/auto-accept-audit.json +1302 -0
  3. package/.ax-cli/index.json +43 -0
  4. package/.ax-cli/memory.json +62 -0
  5. package/.ax-cli/settings.json +39 -0
  6. package/README.md +54 -2
  7. package/ax.config.json +304 -0
  8. package/dist/analyzers/ast/tree-sitter-parser.d.ts +134 -0
  9. package/dist/analyzers/ast/tree-sitter-parser.js +730 -0
  10. package/dist/analyzers/ast/tree-sitter-parser.js.map +1 -0
  11. package/dist/commands/setup.js +108 -0
  12. package/dist/commands/setup.js.map +1 -1
  13. package/dist/commands/update.js +55 -2
  14. package/dist/commands/update.js.map +1 -1
  15. package/dist/mcp/config-detector-v2.d.ts +83 -0
  16. package/dist/mcp/config-detector-v2.js +328 -0
  17. package/dist/mcp/config-detector-v2.js.map +1 -0
  18. package/dist/mcp/config-migrator-v2.d.ts +89 -0
  19. package/dist/mcp/config-migrator-v2.js +288 -0
  20. package/dist/mcp/config-migrator-v2.js.map +1 -0
  21. package/dist/mcp/config-v2.d.ts +111 -0
  22. package/dist/mcp/config-v2.js +443 -0
  23. package/dist/mcp/config-v2.js.map +1 -0
  24. package/dist/mcp/transports-v2.d.ts +152 -0
  25. package/dist/mcp/transports-v2.js +481 -0
  26. package/dist/mcp/transports-v2.js.map +1 -0
  27. package/dist/mcp/transports.d.ts +6 -2
  28. package/dist/mcp/transports.js +57 -103
  29. package/dist/mcp/transports.js.map +1 -1
  30. package/dist/schemas/settings-schemas.d.ts +2 -2
  31. package/dist/utils/error-sanitizer.d.ts +119 -0
  32. package/dist/utils/error-sanitizer.js +253 -0
  33. package/dist/utils/error-sanitizer.js.map +1 -0
  34. package/dist/utils/errors.d.ts +74 -0
  35. package/dist/utils/errors.js +139 -0
  36. package/dist/utils/errors.js.map +1 -0
  37. package/dist/utils/incremental-analyzer.d.ts +134 -0
  38. package/dist/utils/incremental-analyzer.js +377 -0
  39. package/dist/utils/incremental-analyzer.js.map +1 -0
  40. package/dist/utils/math.d.ts +1 -0
  41. package/dist/utils/math.js +4 -0
  42. package/dist/utils/math.js.map +1 -0
  43. package/dist/utils/settings.d.ts +1 -0
  44. package/dist/utils/settings.js +4 -0
  45. package/dist/utils/settings.js.map +1 -0
  46. package/dist/utils/streaming-analyzer.d.ts +160 -0
  47. package/dist/utils/streaming-analyzer.js +214 -0
  48. package/dist/utils/streaming-analyzer.js.map +1 -0
  49. package/package.json +1 -1
@@ -1,6 +1,7 @@
1
1
  import { StdioClientTransport } from "@modelcontextprotocol/sdk/client/stdio.js";
2
+ import { StreamableHTTPClientTransport as SDKStreamableHTTPClientTransport } from "@modelcontextprotocol/sdk/client/streamableHttp.js";
3
+ import { SSEClientTransport as SDKSSEClientTransport } from "@modelcontextprotocol/sdk/client/sse.js";
2
4
  import { EventEmitter } from "events";
3
- import axios from "axios";
4
5
  import { ContentLengthStdioTransport } from "./content-length-transport.js";
5
6
  export class StdioTransport {
6
7
  transport;
@@ -68,29 +69,36 @@ export class StdioTransport {
68
69
  }
69
70
  }
70
71
  export class HttpTransport extends EventEmitter {
71
- config;
72
- client;
72
+ transport;
73
+ url;
74
+ headers;
73
75
  constructor(config) {
74
76
  super();
75
- this.config = config;
76
77
  if (!config.url) {
77
78
  throw new Error('URL is required for HTTP transport');
78
79
  }
80
+ this.url = config.url;
81
+ this.headers = config.headers;
79
82
  }
80
83
  async connect() {
81
- this.client = axios.create({
82
- baseURL: this.config.url,
83
- headers: {
84
- 'Content-Type': 'application/json',
85
- ...this.config.headers
86
- }
87
- });
88
- // Skip health check - MCP endpoints don't have standard health endpoints
89
- // The actual connection will be verified when listTools() is called
90
- return new HttpClientTransport(this.client);
84
+ // Use MCP SDK's StreamableHTTPClientTransport for proper MCP protocol support
85
+ const requestInit = {};
86
+ if (this.headers) {
87
+ requestInit.headers = this.headers;
88
+ }
89
+ this.transport = new SDKStreamableHTTPClientTransport(new URL(this.url), { requestInit });
90
+ return this.transport;
91
91
  }
92
92
  async disconnect() {
93
- this.client = undefined;
93
+ if (this.transport) {
94
+ try {
95
+ await this.transport.close();
96
+ }
97
+ catch {
98
+ // Ignore close errors during disconnect
99
+ }
100
+ this.transport = undefined;
101
+ }
94
102
  this.removeAllListeners();
95
103
  }
96
104
  getType() {
@@ -98,87 +106,44 @@ export class HttpTransport extends EventEmitter {
98
106
  }
99
107
  }
100
108
  export class SSETransport extends EventEmitter {
109
+ transport;
101
110
  url;
111
+ headers;
102
112
  constructor(config) {
103
113
  super();
104
114
  if (!config.url) {
105
115
  throw new Error('URL is required for SSE transport');
106
116
  }
107
117
  this.url = config.url;
118
+ this.headers = config.headers;
108
119
  }
109
120
  async connect() {
110
- return new Promise((resolve, reject) => {
121
+ // Use MCP SDK's SSEClientTransport
122
+ const requestInit = {};
123
+ if (this.headers) {
124
+ requestInit.headers = this.headers;
125
+ }
126
+ this.transport = new SDKSSEClientTransport(new URL(this.url), { requestInit });
127
+ return this.transport;
128
+ }
129
+ async disconnect() {
130
+ if (this.transport) {
111
131
  try {
112
- // For Node.js environment, we'll use a simple HTTP-based approach
113
- // In a real implementation, you'd use a proper SSE library like 'eventsource'
114
- resolve(new SSEClientTransport(this.url));
132
+ await this.transport.close();
115
133
  }
116
- catch (error) {
117
- reject(error);
134
+ catch {
135
+ // Ignore close errors during disconnect
118
136
  }
119
- });
120
- }
121
- async disconnect() {
137
+ this.transport = undefined;
138
+ }
122
139
  this.removeAllListeners();
123
140
  }
124
141
  getType() {
125
142
  return 'sse';
126
143
  }
127
144
  }
128
- // Custom HTTP Transport implementation
129
- class HttpClientTransport extends EventEmitter {
130
- client;
131
- constructor(client) {
132
- super();
133
- this.client = client;
134
- }
135
- async start() {
136
- // HTTP transport is connection-less, so we're always "started"
137
- }
138
- async close() {
139
- this.removeAllListeners();
140
- }
141
- async send(message) {
142
- try {
143
- // Post directly to the base URL (MCP HTTP endpoints are the full URL, not /rpc sub-path)
144
- const response = await this.client.post('', message);
145
- return response.data;
146
- }
147
- catch (error) {
148
- const errorMessage = error?.response?.data?.message || error?.message || String(error);
149
- throw new Error(`HTTP transport error: ${errorMessage}`);
150
- }
151
- }
152
- }
153
- // Custom SSE Transport implementation
154
- class SSEClientTransport extends EventEmitter {
155
- url;
156
- constructor(url) {
157
- super();
158
- this.url = url;
159
- }
160
- async start() {
161
- // SSE transport is event-driven, so we're always "started"
162
- }
163
- async close() {
164
- this.removeAllListeners();
165
- }
166
- async send(message) {
167
- // For bidirectional communication over SSE, we typically use HTTP POST
168
- // for sending messages and SSE for receiving
169
- try {
170
- const response = await axios.post(this.url.replace('/sse', '/rpc'), message, {
171
- headers: { 'Content-Type': 'application/json' }
172
- });
173
- return response.data;
174
- }
175
- catch (error) {
176
- const errorMessage = error?.response?.data?.message || error?.message || String(error);
177
- throw new Error(`SSE transport error: ${errorMessage}`);
178
- }
179
- }
180
- }
181
145
  export class StreamableHttpTransport extends EventEmitter {
146
+ transport;
182
147
  url;
183
148
  headers;
184
149
  constructor(config) {
@@ -190,41 +155,30 @@ export class StreamableHttpTransport extends EventEmitter {
190
155
  this.headers = config.headers;
191
156
  }
192
157
  async connect() {
193
- return new Promise((resolve, reject) => {
158
+ // Use MCP SDK's StreamableHTTPClientTransport
159
+ const requestInit = {};
160
+ if (this.headers) {
161
+ requestInit.headers = this.headers;
162
+ }
163
+ this.transport = new SDKStreamableHTTPClientTransport(new URL(this.url), { requestInit });
164
+ return this.transport;
165
+ }
166
+ async disconnect() {
167
+ if (this.transport) {
194
168
  try {
195
- resolve(new StreamableHttpClientTransport(this.url, this.headers));
169
+ await this.transport.close();
196
170
  }
197
- catch (error) {
198
- reject(error);
171
+ catch {
172
+ // Ignore close errors during disconnect
199
173
  }
200
- });
201
- }
202
- async disconnect() {
174
+ this.transport = undefined;
175
+ }
203
176
  this.removeAllListeners();
204
177
  }
205
178
  getType() {
206
179
  return 'streamable_http';
207
180
  }
208
181
  }
209
- // Custom Streamable HTTP Transport implementation for GitHub Copilot MCP
210
- class StreamableHttpClientTransport extends EventEmitter {
211
- constructor(_url, _headers) {
212
- super();
213
- }
214
- async start() {
215
- // Streamable HTTP transport is connection-less, so we're always "started"
216
- }
217
- async close() {
218
- this.removeAllListeners();
219
- }
220
- async send(message) {
221
- console.log('StreamableHttpTransport: SSE endpoints require persistent connections, not suitable for MCP request-response pattern');
222
- console.log('StreamableHttpTransport: Message that would be sent:', JSON.stringify(message));
223
- // For now, return a mock response to indicate the transport type is not compatible
224
- // with the MCP protocol's request-response pattern
225
- throw new Error('StreamableHttpTransport: SSE endpoints are not compatible with MCP request-response pattern. GitHub Copilot MCP may require a different integration approach.');
226
- }
227
- }
228
182
  export function createTransport(config) {
229
183
  switch (config.type) {
230
184
  case 'stdio':
@@ -1 +1 @@
1
- {"version":3,"file":"transports.js","sourceRoot":"","sources":["../../src/mcp/transports.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"transports.js","sourceRoot":"","sources":["../../src/mcp/transports.ts"],"names":[],"mappings":"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"}
@@ -309,16 +309,16 @@ export declare const MCPTransportConfigSchema: z.ZodObject<{
309
309
  type: "stdio" | "http" | "sse" | "streamable_http";
310
310
  url?: string | undefined;
311
311
  headers?: Record<string, string> | undefined;
312
- env?: Record<string, string> | undefined;
313
312
  command?: string | undefined;
314
313
  args?: string[] | undefined;
314
+ env?: Record<string, string> | undefined;
315
315
  }, {
316
316
  type: "stdio" | "http" | "sse" | "streamable_http";
317
317
  url?: string | undefined;
318
318
  headers?: Record<string, string> | undefined;
319
- env?: Record<string, string> | undefined;
320
319
  command?: string | undefined;
321
320
  args?: string[] | undefined;
321
+ env?: Record<string, string> | undefined;
322
322
  }>;
323
323
  export declare const MCPServerConfigSchema: z.ZodType<any>;
324
324
  export type EncryptedValue = z.infer<typeof EncryptedValueSchema>;
@@ -0,0 +1,119 @@
1
+ /**
2
+ * Error Message Sanitization (REQ-SEC-010)
3
+ *
4
+ * Sanitizes error messages to prevent information disclosure
5
+ * Removes:
6
+ * - File system paths
7
+ * - API keys and secrets
8
+ * - Stack traces (for user-facing errors)
9
+ * - Internal implementation details
10
+ *
11
+ * Security: CVSS 6.5 (Medium Priority)
12
+ */
13
+ /**
14
+ * Sanitized error structure
15
+ */
16
+ export interface SanitizedError {
17
+ /**
18
+ * Sanitized error message (safe for user display)
19
+ */
20
+ message: string;
21
+ /**
22
+ * Error code (for documentation lookup)
23
+ */
24
+ code?: string;
25
+ /**
26
+ * Generic error category
27
+ */
28
+ category: string;
29
+ /**
30
+ * Suggested action for user
31
+ */
32
+ suggestion?: string;
33
+ /**
34
+ * Original error (for internal logging only)
35
+ */
36
+ originalError?: Error;
37
+ }
38
+ /**
39
+ * Error categories for user-friendly messages
40
+ */
41
+ export declare enum ErrorCategory {
42
+ NETWORK = "NETWORK",
43
+ FILE_SYSTEM = "FILE_SYSTEM",
44
+ VALIDATION = "VALIDATION",
45
+ AUTHENTICATION = "AUTHENTICATION",
46
+ RATE_LIMIT = "RATE_LIMIT",
47
+ API_ERROR = "API_ERROR",
48
+ INTERNAL = "INTERNAL",
49
+ USER_INPUT = "USER_INPUT"
50
+ }
51
+ /**
52
+ * Sanitize error message by removing sensitive information
53
+ *
54
+ * @param message - Raw error message
55
+ * @returns Sanitized message safe for user display
56
+ */
57
+ export declare function sanitizeErrorMessage(message: string): string;
58
+ /**
59
+ * Sanitize stack trace by removing sensitive paths
60
+ *
61
+ * @param stack - Raw stack trace
62
+ * @returns Sanitized stack trace
63
+ */
64
+ export declare function sanitizeStackTrace(stack: string): string;
65
+ /**
66
+ * Remove stack trace entirely (for user-facing errors)
67
+ *
68
+ * @param message - Error message with potential stack trace
69
+ * @returns Message without stack trace
70
+ */
71
+ export declare function removeStackTrace(message: string): string;
72
+ /**
73
+ * Categorize error and create user-friendly message
74
+ *
75
+ * @param error - Error object
76
+ * @returns Sanitized error with category and suggestion
77
+ */
78
+ export declare function sanitizeError(error: Error | unknown): SanitizedError;
79
+ /**
80
+ * Format sanitized error for user display
81
+ *
82
+ * @param sanitizedError - Sanitized error object
83
+ * @returns Formatted error message
84
+ */
85
+ export declare function formatUserError(sanitizedError: SanitizedError): string;
86
+ /**
87
+ * Create internal log message with full details (not sanitized)
88
+ *
89
+ * @param error - Original error
90
+ * @param context - Additional context
91
+ * @returns Detailed log message
92
+ */
93
+ export declare function createInternalLogMessage(error: Error | unknown, context?: Record<string, unknown>): string;
94
+ /**
95
+ * Safe error wrapper for user-facing operations
96
+ *
97
+ * @param operation - Async operation to execute
98
+ * @param errorHandler - Optional custom error handler
99
+ * @returns Result or sanitized error
100
+ *
101
+ * @example
102
+ * ```typescript
103
+ * const result = await safeExecute(
104
+ * () => riskyOperation(),
105
+ * (error) => console.error('Internal error:', error)
106
+ * );
107
+ *
108
+ * if (!result.success) {
109
+ * console.log(formatUserError(result.error));
110
+ * }
111
+ * ```
112
+ */
113
+ export declare function safeExecute<T>(operation: () => Promise<T>, errorHandler?: (error: Error, sanitized: SanitizedError) => void): Promise<{
114
+ success: true;
115
+ data: T;
116
+ } | {
117
+ success: false;
118
+ error: SanitizedError;
119
+ }>;
@@ -0,0 +1,253 @@
1
+ /**
2
+ * Error Message Sanitization (REQ-SEC-010)
3
+ *
4
+ * Sanitizes error messages to prevent information disclosure
5
+ * Removes:
6
+ * - File system paths
7
+ * - API keys and secrets
8
+ * - Stack traces (for user-facing errors)
9
+ * - Internal implementation details
10
+ *
11
+ * Security: CVSS 6.5 (Medium Priority)
12
+ */
13
+ import { homedir } from 'os';
14
+ import { getAuditLogger, AuditCategory } from './audit-logger.js';
15
+ /**
16
+ * Patterns to detect and sanitize in error messages
17
+ */
18
+ const SENSITIVE_PATTERNS = {
19
+ // File paths (Windows and Unix)
20
+ FILE_PATH: /([A-Za-z]:\\|\/)[^\s"'<>|]+/g,
21
+ // API keys and tokens (common formats)
22
+ // Matches patterns like "api_key=XXX", "secret: XXX", "API key: XXX", "bearer XXX"
23
+ API_KEY: /\b(?:api[_ -]?key|token|secret|password|bearer)[\s:=]+['"]?[a-zA-Z0-9_\-]{16,}['"]?/gi,
24
+ // Environment variables
25
+ ENV_VAR: /\$\{?[A-Z_][A-Z0-9_]*\}?/g,
26
+ // IP addresses (for SSRF protection)
27
+ IP_ADDRESS: /\b(?:\d{1,3}\.){3}\d{1,3}\b/g,
28
+ // URLs with credentials
29
+ URL_WITH_CREDS: /https?:\/\/[^:]+:[^@]+@[^\s]+/g,
30
+ // Stack trace lines
31
+ STACK_TRACE_LINE: /^\s*at\s+.+\(.+:\d+:\d+\)$/gm,
32
+ // Home directory references
33
+ HOME_DIR: new RegExp(homedir().replace(/[.*+?^${}()|[\]\\]/g, '\\$&'), 'g'),
34
+ };
35
+ /**
36
+ * Replacement strings for sanitized content
37
+ */
38
+ const REPLACEMENTS = {
39
+ FILE_PATH: '[REDACTED_PATH]',
40
+ API_KEY: '[REDACTED_KEY]',
41
+ ENV_VAR: '[REDACTED_ENV]',
42
+ IP_ADDRESS: '[REDACTED_IP]',
43
+ URL_WITH_CREDS: '[REDACTED_URL]',
44
+ STACK_TRACE_LINE: '',
45
+ HOME_DIR: '[USER_HOME]',
46
+ };
47
+ /**
48
+ * Error categories for user-friendly messages
49
+ */
50
+ export var ErrorCategory;
51
+ (function (ErrorCategory) {
52
+ ErrorCategory["NETWORK"] = "NETWORK";
53
+ ErrorCategory["FILE_SYSTEM"] = "FILE_SYSTEM";
54
+ ErrorCategory["VALIDATION"] = "VALIDATION";
55
+ ErrorCategory["AUTHENTICATION"] = "AUTHENTICATION";
56
+ ErrorCategory["RATE_LIMIT"] = "RATE_LIMIT";
57
+ ErrorCategory["API_ERROR"] = "API_ERROR";
58
+ ErrorCategory["INTERNAL"] = "INTERNAL";
59
+ ErrorCategory["USER_INPUT"] = "USER_INPUT";
60
+ })(ErrorCategory || (ErrorCategory = {}));
61
+ /**
62
+ * Sanitize error message by removing sensitive information
63
+ *
64
+ * @param message - Raw error message
65
+ * @returns Sanitized message safe for user display
66
+ */
67
+ export function sanitizeErrorMessage(message) {
68
+ let sanitized = message;
69
+ // Remove URLs with credentials first (before FILE_PATH catches them)
70
+ sanitized = sanitized.replace(SENSITIVE_PATTERNS.URL_WITH_CREDS, REPLACEMENTS.URL_WITH_CREDS);
71
+ // Remove home directory references (before FILE_PATH catches them)
72
+ sanitized = sanitized.replace(SENSITIVE_PATTERNS.HOME_DIR, REPLACEMENTS.HOME_DIR);
73
+ // Remove file paths
74
+ sanitized = sanitized.replace(SENSITIVE_PATTERNS.FILE_PATH, REPLACEMENTS.FILE_PATH);
75
+ // Remove API keys and secrets
76
+ sanitized = sanitized.replace(SENSITIVE_PATTERNS.API_KEY, REPLACEMENTS.API_KEY);
77
+ // Remove environment variables
78
+ sanitized = sanitized.replace(SENSITIVE_PATTERNS.ENV_VAR, REPLACEMENTS.ENV_VAR);
79
+ // Remove IP addresses
80
+ sanitized = sanitized.replace(SENSITIVE_PATTERNS.IP_ADDRESS, REPLACEMENTS.IP_ADDRESS);
81
+ return sanitized;
82
+ }
83
+ /**
84
+ * Sanitize stack trace by removing sensitive paths
85
+ *
86
+ * @param stack - Raw stack trace
87
+ * @returns Sanitized stack trace
88
+ */
89
+ export function sanitizeStackTrace(stack) {
90
+ let sanitized = stack;
91
+ // Remove home directory references first
92
+ sanitized = sanitized.replace(SENSITIVE_PATTERNS.HOME_DIR, REPLACEMENTS.HOME_DIR);
93
+ // Remove file paths from stack frames
94
+ sanitized = sanitized.replace(SENSITIVE_PATTERNS.FILE_PATH, REPLACEMENTS.FILE_PATH);
95
+ return sanitized;
96
+ }
97
+ /**
98
+ * Remove stack trace entirely (for user-facing errors)
99
+ *
100
+ * @param message - Error message with potential stack trace
101
+ * @returns Message without stack trace
102
+ */
103
+ export function removeStackTrace(message) {
104
+ // Split at first "at " (stack trace start)
105
+ const parts = message.split(/\n\s*at\s+/);
106
+ return parts[0].trim();
107
+ }
108
+ /**
109
+ * Categorize error and create user-friendly message
110
+ *
111
+ * @param error - Error object
112
+ * @returns Sanitized error with category and suggestion
113
+ */
114
+ export function sanitizeError(error) {
115
+ const errorObj = error instanceof Error ? error : new Error(String(error));
116
+ const message = errorObj.message;
117
+ // Sanitize the message
118
+ const sanitizedMessage = sanitizeErrorMessage(removeStackTrace(message));
119
+ // Determine category and suggestion
120
+ let category = ErrorCategory.INTERNAL;
121
+ let suggestion;
122
+ let code;
123
+ // Network errors
124
+ if (message.includes('ENOTFOUND') || message.includes('ECONNREFUSED') || message.includes('fetch failed')) {
125
+ category = ErrorCategory.NETWORK;
126
+ suggestion = 'Check your network connection and try again.';
127
+ code = 'ERR_NETWORK';
128
+ }
129
+ // File system errors
130
+ else if (message.includes('ENOENT') || message.includes('EACCES') || message.includes('EPERM')) {
131
+ category = ErrorCategory.FILE_SYSTEM;
132
+ suggestion = 'Check that the file exists and you have permission to access it.';
133
+ code = 'ERR_FILE_SYSTEM';
134
+ }
135
+ // Validation errors
136
+ else if (message.includes('validation') || message.includes('invalid') || message.includes('required')) {
137
+ category = ErrorCategory.VALIDATION;
138
+ suggestion = 'Check your input and try again.';
139
+ code = 'ERR_VALIDATION';
140
+ }
141
+ // Authentication errors
142
+ else if (message.includes('unauthorized') || message.includes('authentication') || message.includes('API key')) {
143
+ category = ErrorCategory.AUTHENTICATION;
144
+ suggestion = 'Check your API key configuration.';
145
+ code = 'ERR_AUTH';
146
+ }
147
+ // Rate limit errors
148
+ else if (message.includes('rate limit') || message.includes('too many requests')) {
149
+ category = ErrorCategory.RATE_LIMIT;
150
+ suggestion = 'Please wait a moment before trying again.';
151
+ code = 'ERR_RATE_LIMIT';
152
+ }
153
+ // API errors
154
+ else if (message.includes('API') || message.includes('status code')) {
155
+ category = ErrorCategory.API_ERROR;
156
+ suggestion = 'The API returned an error. Please try again later.';
157
+ code = 'ERR_API';
158
+ }
159
+ // REQ-SEC-008: Audit log errors with sensitive info detection
160
+ if (message !== sanitizedMessage) {
161
+ const auditLogger = getAuditLogger();
162
+ auditLogger.logWarning({
163
+ category: AuditCategory.SYSTEM_EVENT,
164
+ action: 'sensitive_data_in_error',
165
+ outcome: 'success',
166
+ details: {
167
+ category,
168
+ sanitized: true,
169
+ },
170
+ });
171
+ }
172
+ return {
173
+ message: sanitizedMessage,
174
+ code,
175
+ category,
176
+ suggestion,
177
+ originalError: errorObj,
178
+ };
179
+ }
180
+ /**
181
+ * Format sanitized error for user display
182
+ *
183
+ * @param sanitizedError - Sanitized error object
184
+ * @returns Formatted error message
185
+ */
186
+ export function formatUserError(sanitizedError) {
187
+ const parts = [];
188
+ if (sanitizedError.code) {
189
+ parts.push(`[${sanitizedError.code}]`);
190
+ }
191
+ parts.push(sanitizedError.message);
192
+ if (sanitizedError.suggestion) {
193
+ parts.push(`\nℹ️ ${sanitizedError.suggestion}`);
194
+ }
195
+ return parts.join(' ');
196
+ }
197
+ /**
198
+ * Create internal log message with full details (not sanitized)
199
+ *
200
+ * @param error - Original error
201
+ * @param context - Additional context
202
+ * @returns Detailed log message
203
+ */
204
+ export function createInternalLogMessage(error, context) {
205
+ const errorObj = error instanceof Error ? error : new Error(String(error));
206
+ const parts = [
207
+ `Error: ${errorObj.message}`,
208
+ ];
209
+ if (errorObj.stack) {
210
+ parts.push(`Stack: ${sanitizeStackTrace(errorObj.stack)}`);
211
+ }
212
+ if (context) {
213
+ parts.push(`Context: ${JSON.stringify(context, null, 2)}`);
214
+ }
215
+ return parts.join('\n');
216
+ }
217
+ /**
218
+ * Safe error wrapper for user-facing operations
219
+ *
220
+ * @param operation - Async operation to execute
221
+ * @param errorHandler - Optional custom error handler
222
+ * @returns Result or sanitized error
223
+ *
224
+ * @example
225
+ * ```typescript
226
+ * const result = await safeExecute(
227
+ * () => riskyOperation(),
228
+ * (error) => console.error('Internal error:', error)
229
+ * );
230
+ *
231
+ * if (!result.success) {
232
+ * console.log(formatUserError(result.error));
233
+ * }
234
+ * ```
235
+ */
236
+ export async function safeExecute(operation, errorHandler) {
237
+ try {
238
+ const data = await operation();
239
+ return { success: true, data };
240
+ }
241
+ catch (error) {
242
+ const sanitized = sanitizeError(error);
243
+ // Log internal error details
244
+ if (errorHandler) {
245
+ errorHandler(sanitized.originalError, sanitized);
246
+ }
247
+ else {
248
+ console.error(createInternalLogMessage(error));
249
+ }
250
+ return { success: false, error: sanitized };
251
+ }
252
+ }
253
+ //# sourceMappingURL=error-sanitizer.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"error-sanitizer.js","sourceRoot":"","sources":["../../src/utils/error-sanitizer.ts"],"names":[],"mappings":"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"}