@defai.digital/ax-cli 3.5.4 → 3.6.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 (162) hide show
  1. package/.ax-cli/checkpoints/2025-11-20/checkpoint-11e9e0ba-c39d-4fd2-aa77-bc818811c921.json +69 -0
  2. package/.ax-cli/checkpoints/2025-11-20/checkpoint-2b260b98-b418-4c7c-9694-e2b94967e662.json +24 -0
  3. package/.ax-cli/checkpoints/2025-11-20/checkpoint-7e03601e-e8ab-4cd7-9841-a74b66adf78f.json +69 -0
  4. package/.ax-cli/checkpoints/2025-11-20/checkpoint-7f9c6562-771f-4fd0-adcf-9e7e9ac34ae8.json +44 -0
  5. package/.ax-cli/checkpoints/2025-11-20/checkpoint-e1ebe666-4c3a-4367-ba5c-27fe512a9c70.json +24 -0
  6. package/.ax-cli/checkpoints/2025-11-21/checkpoint-15743e7d-430c-4d76-b6fc-955d7a5c250c.json +44 -0
  7. package/.ax-cli/checkpoints/2025-11-21/checkpoint-25cf7679-0b3f-4988-83d7-704548fbba91.json +69 -0
  8. package/.ax-cli/checkpoints/2025-11-21/checkpoint-54aedbac-6db0-464e-8ebb-dbb3979e6dca.json +24 -0
  9. package/.ax-cli/checkpoints/2025-11-21/checkpoint-7658aed8-fe5d-4222-903f-1a7c63717ea7.json +24 -0
  10. package/.ax-cli/checkpoints/2025-11-21/checkpoint-c9c13497-40dc-4294-a327-6a5fc854eaa1.json +69 -0
  11. package/.ax-cli/memory.json +15 -8
  12. package/README.md +423 -82
  13. package/ax.config.json +333 -0
  14. package/config-defaults/messages.yaml +75 -0
  15. package/config-defaults/models.yaml +66 -0
  16. package/config-defaults/prompts.yaml +156 -0
  17. package/config-defaults/settings.yaml +86 -0
  18. package/dist/agent/chat-history-manager.d.ts +56 -0
  19. package/dist/agent/chat-history-manager.js +150 -0
  20. package/dist/agent/chat-history-manager.js.map +1 -0
  21. package/dist/agent/llm-agent.js +1 -1
  22. package/dist/agent/llm-agent.js.map +1 -1
  23. package/dist/agent/tool-manager.d.ts +39 -0
  24. package/dist/agent/tool-manager.js +76 -0
  25. package/dist/agent/tool-manager.js.map +1 -0
  26. package/dist/analyzers/code-smells/detectors/data-clumps-detector.js +7 -9
  27. package/dist/analyzers/code-smells/detectors/data-clumps-detector.js.map +1 -1
  28. package/dist/analyzers/code-smells/detectors/dead-code-detector.js +1 -1
  29. package/dist/analyzers/code-smells/detectors/dead-code-detector.js.map +1 -1
  30. package/dist/analyzers/code-smells/detectors/duplicate-code-detector.js +22 -10
  31. package/dist/analyzers/code-smells/detectors/duplicate-code-detector.js.map +1 -1
  32. package/dist/analyzers/code-smells/detectors/feature-envy-detector.js +1 -1
  33. package/dist/analyzers/code-smells/detectors/feature-envy-detector.js.map +1 -1
  34. package/dist/analyzers/code-smells/detectors/inappropriate-intimacy-detector.js +1 -1
  35. package/dist/analyzers/code-smells/detectors/inappropriate-intimacy-detector.js.map +1 -1
  36. package/dist/analyzers/code-smells/detectors/large-class-detector.js +4 -1
  37. package/dist/analyzers/code-smells/detectors/large-class-detector.js.map +1 -1
  38. package/dist/analyzers/code-smells/detectors/long-method-detector.js +4 -1
  39. package/dist/analyzers/code-smells/detectors/long-method-detector.js.map +1 -1
  40. package/dist/analyzers/code-smells/detectors/long-parameter-list-detector.js +4 -1
  41. package/dist/analyzers/code-smells/detectors/long-parameter-list-detector.js.map +1 -1
  42. package/dist/analyzers/code-smells/detectors/magic-numbers-detector.js +4 -5
  43. package/dist/analyzers/code-smells/detectors/magic-numbers-detector.js.map +1 -1
  44. package/dist/analyzers/code-smells/detectors/nested-conditionals-detector.js +4 -1
  45. package/dist/analyzers/code-smells/detectors/nested-conditionals-detector.js.map +1 -1
  46. package/dist/commands/memory.js +1 -1
  47. package/dist/commands/memory.js.map +1 -1
  48. package/dist/commands/setup.js +19 -6
  49. package/dist/commands/setup.js.map +1 -1
  50. package/dist/index.js +7 -0
  51. package/dist/index.js.bak +664 -0
  52. package/dist/index.js.map +1 -1
  53. package/dist/llm/client.d.ts +1 -0
  54. package/dist/llm/client.js +44 -0
  55. package/dist/llm/client.js.map +1 -1
  56. package/dist/mcp/health.js +4 -2
  57. package/dist/mcp/health.js.map +1 -1
  58. package/dist/mcp/ssrf-protection.d.ts +86 -0
  59. package/dist/mcp/ssrf-protection.js +313 -0
  60. package/dist/mcp/ssrf-protection.js.map +1 -0
  61. package/dist/mcp/validation.d.ts +4 -0
  62. package/dist/mcp/validation.js +122 -11
  63. package/dist/mcp/validation.js.map +1 -1
  64. package/dist/schemas/settings-schemas.d.ts +53 -0
  65. package/dist/schemas/settings-schemas.js +47 -0
  66. package/dist/schemas/settings-schemas.js.map +1 -1
  67. package/dist/tools/bash.d.ts +3 -2
  68. package/dist/tools/bash.js +31 -2
  69. package/dist/tools/bash.js.map +1 -1
  70. package/dist/tools/search.d.ts +1 -1
  71. package/dist/tools/search.js +121 -128
  72. package/dist/tools/search.js.map +1 -1
  73. package/dist/tools/text-editor.js +52 -15
  74. package/dist/tools/text-editor.js.map +1 -1
  75. package/dist/tools/web-search/index.d.ts +0 -2
  76. package/dist/tools/web-search/index.js +0 -2
  77. package/dist/tools/web-search/index.js.map +1 -1
  78. package/dist/tools/web-search/router.d.ts +0 -2
  79. package/dist/tools/web-search/router.js +2 -37
  80. package/dist/tools/web-search/router.js.map +1 -1
  81. package/dist/tools/web-search/web-search-tool.js +2 -12
  82. package/dist/tools/web-search/web-search-tool.js.map +1 -1
  83. package/dist/ui/components/chat-history.js +1 -1
  84. package/dist/ui/components/chat-history.js.map +1 -1
  85. package/dist/ui/components/chat-input.d.ts +4 -1
  86. package/dist/ui/components/chat-input.js +133 -52
  87. package/dist/ui/components/chat-input.js.map +1 -1
  88. package/dist/ui/components/chat-interface.js +5 -4
  89. package/dist/ui/components/chat-interface.js.map +1 -1
  90. package/dist/ui/components/confirmation-dialog.js +1 -1
  91. package/dist/ui/components/confirmation-dialog.js.map +1 -1
  92. package/dist/ui/components/keyboard-hints.js +2 -0
  93. package/dist/ui/components/keyboard-hints.js.map +1 -1
  94. package/dist/ui/components/status-bar.js +3 -13
  95. package/dist/ui/components/status-bar.js.map +1 -1
  96. package/dist/ui/components/welcome-panel.js +4 -0
  97. package/dist/ui/components/welcome-panel.js.map +1 -1
  98. package/dist/ui/hooks/use-chat-reducer.d.ts +61 -0
  99. package/dist/ui/hooks/use-chat-reducer.js +118 -0
  100. package/dist/ui/hooks/use-chat-reducer.js.map +1 -0
  101. package/dist/ui/hooks/use-enhanced-input.d.ts +44 -0
  102. package/dist/ui/hooks/use-enhanced-input.js +364 -0
  103. package/dist/ui/hooks/use-enhanced-input.js.map +1 -0
  104. package/dist/ui/hooks/use-input-handler.d.ts +48 -0
  105. package/dist/ui/hooks/use-input-handler.js +1446 -0
  106. package/dist/ui/hooks/use-input-handler.js.map +1 -0
  107. package/dist/utils/audit-logger.d.ts +205 -0
  108. package/dist/utils/audit-logger.js +269 -0
  109. package/dist/utils/audit-logger.js.map +1 -0
  110. package/dist/utils/command-security.d.ts +85 -0
  111. package/dist/utils/command-security.js +200 -0
  112. package/dist/utils/command-security.js.map +1 -0
  113. package/dist/utils/config-loader.js +3 -3
  114. package/dist/utils/config-loader.js.map +1 -1
  115. package/dist/utils/encryption.d.ts +78 -0
  116. package/dist/utils/encryption.js +216 -0
  117. package/dist/utils/encryption.js.map +1 -0
  118. package/dist/utils/error-sanitizer.d.ts +119 -0
  119. package/dist/utils/error-sanitizer.js +253 -0
  120. package/dist/utils/error-sanitizer.js.map +1 -0
  121. package/dist/utils/input-sanitizer.d.ts +210 -0
  122. package/dist/utils/input-sanitizer.js +362 -0
  123. package/dist/utils/input-sanitizer.js.map +1 -0
  124. package/dist/utils/json-utils.d.ts +13 -0
  125. package/dist/utils/json-utils.js +55 -1
  126. package/dist/utils/json-utils.js.map +1 -1
  127. package/dist/utils/paste-collapse.d.ts +46 -0
  128. package/dist/utils/paste-collapse.js +77 -0
  129. package/dist/utils/paste-collapse.js.map +1 -0
  130. package/dist/utils/paste-utils.d.ts +99 -0
  131. package/dist/utils/paste-utils.js +239 -0
  132. package/dist/utils/paste-utils.js.map +1 -0
  133. package/dist/utils/path-security.d.ts +90 -0
  134. package/dist/utils/path-security.js +328 -0
  135. package/dist/utils/path-security.js.map +1 -0
  136. package/dist/utils/process-pool.d.ts +105 -0
  137. package/dist/utils/process-pool.js +326 -0
  138. package/dist/utils/process-pool.js.map +1 -0
  139. package/dist/utils/rate-limiter.d.ts +221 -0
  140. package/dist/utils/rate-limiter.js +317 -0
  141. package/dist/utils/rate-limiter.js.map +1 -0
  142. package/dist/utils/settings-manager.js +99 -6
  143. package/dist/utils/settings-manager.js.map +1 -1
  144. package/dist/utils/streaming-analyzer.js +9 -21
  145. package/dist/utils/streaming-analyzer.js.map +1 -1
  146. package/package.json +3 -7
  147. package/packages/schemas/dist/index.d.ts +14 -0
  148. package/packages/schemas/dist/index.d.ts.map +1 -0
  149. package/packages/schemas/dist/index.js +19 -0
  150. package/packages/schemas/dist/index.js.map +1 -0
  151. package/packages/schemas/dist/public/core/brand-types.d.ts +308 -0
  152. package/packages/schemas/dist/public/core/brand-types.d.ts.map +1 -0
  153. package/packages/schemas/dist/public/core/brand-types.js +243 -0
  154. package/packages/schemas/dist/public/core/brand-types.js.map +1 -0
  155. package/packages/schemas/dist/public/core/enums.d.ts +227 -0
  156. package/packages/schemas/dist/public/core/enums.d.ts.map +1 -0
  157. package/packages/schemas/dist/public/core/enums.js +222 -0
  158. package/packages/schemas/dist/public/core/enums.js.map +1 -0
  159. package/packages/schemas/dist/public/core/id-types.d.ts +286 -0
  160. package/packages/schemas/dist/public/core/id-types.d.ts.map +1 -0
  161. package/packages/schemas/dist/public/core/id-types.js +136 -0
  162. package/packages/schemas/dist/public/core/id-types.js.map +1 -0
@@ -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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"}
@@ -0,0 +1,210 @@
1
+ /**
2
+ * Input Sanitization Framework (REQ-SEC-007)
3
+ *
4
+ * Provides comprehensive input validation and sanitization to prevent:
5
+ * - ReDoS (Regular Expression Denial of Service)
6
+ * - Command injection
7
+ * - Path traversal
8
+ * - Unicode attacks
9
+ * - Buffer overflow
10
+ *
11
+ * Security: CVSS 7.3 (High Priority)
12
+ */
13
+ /**
14
+ * Sanitization result with validation and cleaned value
15
+ */
16
+ export interface SanitizationResult {
17
+ /**
18
+ * Whether the input passed validation
19
+ */
20
+ valid: boolean;
21
+ /**
22
+ * Sanitized/cleaned value (only if valid)
23
+ */
24
+ value?: string;
25
+ /**
26
+ * Error message if validation failed
27
+ */
28
+ error?: string;
29
+ /**
30
+ * Warning messages (non-fatal issues)
31
+ */
32
+ warnings?: string[];
33
+ }
34
+ /**
35
+ * Configuration for input sanitization
36
+ */
37
+ export interface SanitizerOptions {
38
+ /**
39
+ * Maximum allowed length (default: 10,000 characters)
40
+ */
41
+ maxLength?: number;
42
+ /**
43
+ * Whether to normalize Unicode (default: true)
44
+ */
45
+ normalizeUnicode?: boolean;
46
+ /**
47
+ * Character whitelist pattern (regex)
48
+ */
49
+ allowedPattern?: RegExp;
50
+ /**
51
+ * Whether to trim whitespace (default: true)
52
+ */
53
+ trim?: boolean;
54
+ /**
55
+ * Whether to allow empty strings (default: false)
56
+ */
57
+ allowEmpty?: boolean;
58
+ }
59
+ /**
60
+ * Default maximum input lengths for different contexts
61
+ */
62
+ export declare const MAX_INPUT_LENGTHS: {
63
+ readonly COMMAND: 10000;
64
+ readonly FILE_PATH: 4096;
65
+ readonly USER_INPUT: 50000;
66
+ readonly SEARCH_QUERY: 1000;
67
+ readonly ENV_VALUE: 10000;
68
+ readonly CONFIG_VALUE: 10000;
69
+ };
70
+ /**
71
+ * Safe characters for different contexts
72
+ */
73
+ export declare const SAFE_PATTERNS: {
74
+ /**
75
+ * Alphanumeric, spaces, and common punctuation
76
+ */
77
+ readonly BASIC: RegExp;
78
+ /**
79
+ * Safe for file paths (no directory traversal)
80
+ */
81
+ readonly FILE_PATH: RegExp;
82
+ /**
83
+ * Safe for environment variable values
84
+ */
85
+ readonly ENV_VALUE: RegExp;
86
+ /**
87
+ * Printable ASCII only (most restrictive)
88
+ */
89
+ readonly ASCII_PRINTABLE: RegExp;
90
+ };
91
+ /**
92
+ * Normalize Unicode string to prevent homograph attacks
93
+ *
94
+ * Uses NFC (Canonical Decomposition, followed by Canonical Composition)
95
+ * which is the recommended normalization form for most use cases
96
+ *
97
+ * @param input - String to normalize
98
+ * @returns Normalized string
99
+ */
100
+ export declare function normalizeUnicode(input: string): string;
101
+ /**
102
+ * Check for dangerous patterns in input
103
+ *
104
+ * @param input - String to check
105
+ * @returns Array of detected dangerous patterns
106
+ */
107
+ export declare function detectDangerousPatterns(input: string): string[];
108
+ /**
109
+ * Sanitize general user input with configurable options
110
+ *
111
+ * @param input - Raw input string
112
+ * @param options - Sanitization options
113
+ * @returns Sanitization result
114
+ *
115
+ * @example
116
+ * ```typescript
117
+ * const result = sanitizeInput('User input here', {
118
+ * maxLength: 1000,
119
+ * normalizeUnicode: true,
120
+ * allowedPattern: SAFE_PATTERNS.BASIC,
121
+ * });
122
+ *
123
+ * if (result.valid) {
124
+ * // Use result.value safely
125
+ * } else {
126
+ * console.error(result.error);
127
+ * }
128
+ * ```
129
+ */
130
+ export declare function sanitizeInput(input: string, options?: SanitizerOptions): SanitizationResult;
131
+ /**
132
+ * Sanitize file path input to prevent path traversal
133
+ *
134
+ * @param path - File path to sanitize
135
+ * @returns Sanitization result
136
+ *
137
+ * @example
138
+ * ```typescript
139
+ * const result = sanitizeFilePath('../../../etc/passwd');
140
+ * if (!result.valid) {
141
+ * console.error('Invalid path:', result.error);
142
+ * }
143
+ * ```
144
+ */
145
+ export declare function sanitizeFilePath(path: string): SanitizationResult;
146
+ /**
147
+ * Sanitize shell command input
148
+ *
149
+ * NOTE: This is a last line of defense. Prefer execFile over exec
150
+ * and use argument arrays instead of concatenating commands.
151
+ *
152
+ * @param command - Command string to sanitize
153
+ * @returns Sanitization result
154
+ *
155
+ * @example
156
+ * ```typescript
157
+ * const result = sanitizeCommand('ls -la');
158
+ * if (result.valid) {
159
+ * // Still prefer execFile with args array
160
+ * execFile(result.value.split(' ')[0], result.value.split(' ').slice(1));
161
+ * }
162
+ * ```
163
+ */
164
+ export declare function sanitizeCommand(command: string): SanitizationResult;
165
+ /**
166
+ * Sanitize search query input
167
+ *
168
+ * @param query - Search query to sanitize
169
+ * @returns Sanitization result
170
+ */
171
+ export declare function sanitizeSearchQuery(query: string): SanitizationResult;
172
+ /**
173
+ * Sanitize environment variable value
174
+ *
175
+ * @param value - Environment variable value to sanitize
176
+ * @returns Sanitization result
177
+ */
178
+ export declare function sanitizeEnvValue(value: string): SanitizationResult;
179
+ /**
180
+ * Escape shell arguments for safe execution
181
+ *
182
+ * NOTE: This is a defense-in-depth measure. Always prefer:
183
+ * 1. execFile with argument array over exec
184
+ * 2. Argument validation/whitelisting
185
+ * 3. This escaping function as a last resort
186
+ *
187
+ * @param arg - Argument to escape
188
+ * @returns Safely escaped argument
189
+ */
190
+ export declare function escapeShellArg(arg: string): string;
191
+ /**
192
+ * Validate regex pattern for ReDoS protection
193
+ *
194
+ * Checks for common ReDoS patterns:
195
+ * - Nested quantifiers (e.g., (a+)+)
196
+ * - Alternation with overlapping patterns
197
+ * - Excessive backtracking potential
198
+ *
199
+ * @param pattern - Regex pattern to validate
200
+ * @returns Validation result
201
+ *
202
+ * @example
203
+ * ```typescript
204
+ * const result = validateRegexPattern('(a+)+b');
205
+ * if (!result.valid) {
206
+ * console.error('Unsafe regex:', result.error);
207
+ * }
208
+ * ```
209
+ */
210
+ export declare function validateRegexPattern(pattern: string): SanitizationResult;