@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.
- package/.ax-cli/CUSTOM.md +97 -0
- package/.ax-cli/auto-accept-audit.json +1302 -0
- package/.ax-cli/index.json +43 -0
- package/.ax-cli/memory.json +62 -0
- package/.ax-cli/settings.json +39 -0
- package/README.md +54 -2
- package/ax.config.json +304 -0
- package/dist/analyzers/ast/tree-sitter-parser.d.ts +134 -0
- package/dist/analyzers/ast/tree-sitter-parser.js +730 -0
- package/dist/analyzers/ast/tree-sitter-parser.js.map +1 -0
- package/dist/commands/setup.js +108 -0
- package/dist/commands/setup.js.map +1 -1
- package/dist/commands/update.js +55 -2
- package/dist/commands/update.js.map +1 -1
- package/dist/mcp/config-detector-v2.d.ts +83 -0
- package/dist/mcp/config-detector-v2.js +328 -0
- package/dist/mcp/config-detector-v2.js.map +1 -0
- package/dist/mcp/config-migrator-v2.d.ts +89 -0
- package/dist/mcp/config-migrator-v2.js +288 -0
- package/dist/mcp/config-migrator-v2.js.map +1 -0
- package/dist/mcp/config-v2.d.ts +111 -0
- package/dist/mcp/config-v2.js +443 -0
- package/dist/mcp/config-v2.js.map +1 -0
- package/dist/mcp/transports-v2.d.ts +152 -0
- package/dist/mcp/transports-v2.js +481 -0
- package/dist/mcp/transports-v2.js.map +1 -0
- package/dist/mcp/transports.d.ts +6 -2
- package/dist/mcp/transports.js +57 -103
- package/dist/mcp/transports.js.map +1 -1
- package/dist/schemas/settings-schemas.d.ts +2 -2
- package/dist/utils/error-sanitizer.d.ts +119 -0
- package/dist/utils/error-sanitizer.js +253 -0
- package/dist/utils/error-sanitizer.js.map +1 -0
- package/dist/utils/errors.d.ts +74 -0
- package/dist/utils/errors.js +139 -0
- package/dist/utils/errors.js.map +1 -0
- package/dist/utils/incremental-analyzer.d.ts +134 -0
- package/dist/utils/incremental-analyzer.js +377 -0
- package/dist/utils/incremental-analyzer.js.map +1 -0
- package/dist/utils/math.d.ts +1 -0
- package/dist/utils/math.js +4 -0
- package/dist/utils/math.js.map +1 -0
- package/dist/utils/settings.d.ts +1 -0
- package/dist/utils/settings.js +4 -0
- package/dist/utils/settings.js.map +1 -0
- package/dist/utils/streaming-analyzer.d.ts +160 -0
- package/dist/utils/streaming-analyzer.js +214 -0
- package/dist/utils/streaming-analyzer.js.map +1 -0
- package/package.json +1 -1
package/dist/mcp/transports.js
CHANGED
|
@@ -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
|
-
|
|
72
|
-
|
|
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
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
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.
|
|
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
|
-
|
|
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
|
-
|
|
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
|
|
117
|
-
|
|
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
|
-
|
|
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
|
-
|
|
169
|
+
await this.transport.close();
|
|
196
170
|
}
|
|
197
|
-
catch
|
|
198
|
-
|
|
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":"AACA,OAAO,EAAE,oBAAoB,EAAE,MAAM,2CAA2C,CAAC;AACjF,OAAO,EAAE,
|
|
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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"}
|