wyrm-mcp 3.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (87) hide show
  1. package/LICENSE +667 -0
  2. package/README.md +384 -0
  3. package/dist/analytics.d.ts +100 -0
  4. package/dist/analytics.d.ts.map +1 -0
  5. package/dist/analytics.js +368 -0
  6. package/dist/analytics.js.map +1 -0
  7. package/dist/auto-orchestrator.d.ts +118 -0
  8. package/dist/auto-orchestrator.d.ts.map +1 -0
  9. package/dist/auto-orchestrator.js +325 -0
  10. package/dist/auto-orchestrator.js.map +1 -0
  11. package/dist/autoconfig.d.ts +89 -0
  12. package/dist/autoconfig.d.ts.map +1 -0
  13. package/dist/autoconfig.js +576 -0
  14. package/dist/autoconfig.js.map +1 -0
  15. package/dist/cli.d.ts +148 -0
  16. package/dist/cli.d.ts.map +1 -0
  17. package/dist/cli.js +281 -0
  18. package/dist/cli.js.map +1 -0
  19. package/dist/cloud-backup.d.ts +100 -0
  20. package/dist/cloud-backup.d.ts.map +1 -0
  21. package/dist/cloud-backup.js +545 -0
  22. package/dist/cloud-backup.js.map +1 -0
  23. package/dist/crypto.d.ts +72 -0
  24. package/dist/crypto.d.ts.map +1 -0
  25. package/dist/crypto.js +164 -0
  26. package/dist/crypto.js.map +1 -0
  27. package/dist/database.d.ts +218 -0
  28. package/dist/database.d.ts.map +1 -0
  29. package/dist/database.js +1058 -0
  30. package/dist/database.js.map +1 -0
  31. package/dist/http-auth.d.ts +68 -0
  32. package/dist/http-auth.d.ts.map +1 -0
  33. package/dist/http-auth.js +296 -0
  34. package/dist/http-auth.js.map +1 -0
  35. package/dist/http-fast.d.ts +13 -0
  36. package/dist/http-fast.d.ts.map +1 -0
  37. package/dist/http-fast.js +325 -0
  38. package/dist/http-fast.js.map +1 -0
  39. package/dist/http-server.d.ts +12 -0
  40. package/dist/http-server.d.ts.map +1 -0
  41. package/dist/http-server.js +383 -0
  42. package/dist/http-server.js.map +1 -0
  43. package/dist/index.d.ts +19 -0
  44. package/dist/index.d.ts.map +1 -0
  45. package/dist/index.js +1695 -0
  46. package/dist/index.js.map +1 -0
  47. package/dist/license.d.ts +177 -0
  48. package/dist/license.d.ts.map +1 -0
  49. package/dist/license.js +405 -0
  50. package/dist/license.js.map +1 -0
  51. package/dist/logger.d.ts +76 -0
  52. package/dist/logger.d.ts.map +1 -0
  53. package/dist/logger.js +195 -0
  54. package/dist/logger.js.map +1 -0
  55. package/dist/performance.d.ts +114 -0
  56. package/dist/performance.d.ts.map +1 -0
  57. package/dist/performance.js +228 -0
  58. package/dist/performance.js.map +1 -0
  59. package/dist/resilience.d.ts +146 -0
  60. package/dist/resilience.d.ts.map +1 -0
  61. package/dist/resilience.js +563 -0
  62. package/dist/resilience.js.map +1 -0
  63. package/dist/security.d.ts +68 -0
  64. package/dist/security.d.ts.map +1 -0
  65. package/dist/security.js +215 -0
  66. package/dist/security.js.map +1 -0
  67. package/dist/setup.d.ts +21 -0
  68. package/dist/setup.d.ts.map +1 -0
  69. package/dist/setup.js +261 -0
  70. package/dist/setup.js.map +1 -0
  71. package/dist/summarizer.d.ts +30 -0
  72. package/dist/summarizer.d.ts.map +1 -0
  73. package/dist/summarizer.js +139 -0
  74. package/dist/summarizer.js.map +1 -0
  75. package/dist/sync.d.ts +39 -0
  76. package/dist/sync.d.ts.map +1 -0
  77. package/dist/sync.js +356 -0
  78. package/dist/sync.js.map +1 -0
  79. package/dist/types.d.ts +267 -0
  80. package/dist/types.d.ts.map +1 -0
  81. package/dist/types.js +30 -0
  82. package/dist/types.js.map +1 -0
  83. package/dist/vectors.d.ts +103 -0
  84. package/dist/vectors.d.ts.map +1 -0
  85. package/dist/vectors.js +311 -0
  86. package/dist/vectors.js.map +1 -0
  87. package/package.json +73 -0
@@ -0,0 +1,563 @@
1
+ /**
2
+ * Wyrm Resilience Module - Professional-grade fault tolerance
3
+ *
4
+ * @copyright 2026 Ghost Protocol (Pvt) Ltd. All Rights Reserved.
5
+ * @license Proprietary - See LICENSE file for details.
6
+ * @module resilience
7
+ * @version 3.0.0
8
+ *
9
+ * Features:
10
+ * - Transaction safety with automatic rollback
11
+ * - Exponential backoff retry logic
12
+ * - Circuit breaker pattern
13
+ * - Operation checkpointing
14
+ * - Crash recovery via WAL
15
+ * - Graceful degradation
16
+ */
17
+ import { existsSync, readFileSync, writeFileSync, mkdirSync, unlinkSync, renameSync, readdirSync } from 'fs';
18
+ import { join } from 'path';
19
+ import { homedir } from 'os';
20
+ import { WyrmLogger } from './logger.js';
21
+ // ==================== DEFAULT CONFIGS ====================
22
+ const DEFAULT_RETRY_CONFIG = {
23
+ maxAttempts: 5,
24
+ baseDelayMs: 100,
25
+ maxDelayMs: 10000,
26
+ backoffMultiplier: 2,
27
+ retryableErrors: [
28
+ 'SQLITE_BUSY',
29
+ 'SQLITE_LOCKED',
30
+ 'ECONNRESET',
31
+ 'ETIMEDOUT',
32
+ 'ENOTFOUND',
33
+ 'EAI_AGAIN',
34
+ 'EPIPE',
35
+ 'ECONNREFUSED',
36
+ ],
37
+ };
38
+ const DEFAULT_CIRCUIT_CONFIG = {
39
+ failureThreshold: 5,
40
+ successThreshold: 3,
41
+ timeout: 30000,
42
+ };
43
+ // ==================== RESILIENCE MANAGER ====================
44
+ export class ResilienceManager {
45
+ logger;
46
+ checkpointDir;
47
+ retryConfig;
48
+ circuitConfig;
49
+ // Circuit breaker state
50
+ circuitState = 'closed';
51
+ failureCount = 0;
52
+ successCount = 0;
53
+ lastFailureTime = 0;
54
+ // Active operations for tracking
55
+ activeOperations = new Map();
56
+ constructor(logger, retryConfig, circuitConfig) {
57
+ this.logger = logger || new WyrmLogger();
58
+ this.retryConfig = { ...DEFAULT_RETRY_CONFIG, ...retryConfig };
59
+ this.circuitConfig = { ...DEFAULT_CIRCUIT_CONFIG, ...circuitConfig };
60
+ // Initialize checkpoint directory
61
+ this.checkpointDir = join(homedir(), '.wyrm', 'checkpoints');
62
+ if (!existsSync(this.checkpointDir)) {
63
+ mkdirSync(this.checkpointDir, { recursive: true });
64
+ }
65
+ // Recover any incomplete operations on startup
66
+ this.recoverIncompleteOperations();
67
+ }
68
+ // ==================== RETRY WITH BACKOFF ====================
69
+ /**
70
+ * Execute an operation with exponential backoff retry
71
+ */
72
+ async withRetry(operation, operationName, config) {
73
+ const cfg = { ...this.retryConfig, ...config };
74
+ let lastError;
75
+ let attempts = 0;
76
+ while (attempts < cfg.maxAttempts) {
77
+ attempts++;
78
+ try {
79
+ // Check circuit breaker
80
+ if (!this.checkCircuit()) {
81
+ return {
82
+ success: false,
83
+ error: new Error('Circuit breaker is open - service unavailable'),
84
+ attempts,
85
+ recoverable: true,
86
+ };
87
+ }
88
+ const result = await operation();
89
+ this.recordSuccess();
90
+ return {
91
+ success: true,
92
+ data: result,
93
+ attempts,
94
+ recoverable: false,
95
+ };
96
+ }
97
+ catch (error) {
98
+ lastError = error;
99
+ this.recordFailure();
100
+ const errorCode = error.code || '';
101
+ const errorMessage = error.message || '';
102
+ // Check if error is retryable
103
+ const isRetryable = cfg.retryableErrors?.some(code => errorCode.includes(code) || errorMessage.includes(code));
104
+ if (!isRetryable && attempts === 1) {
105
+ // Non-retryable error on first attempt
106
+ this.logger.error(`${operationName} failed with non-retryable error`, {
107
+ error: errorMessage,
108
+ code: errorCode,
109
+ });
110
+ return {
111
+ success: false,
112
+ error: lastError,
113
+ attempts,
114
+ recoverable: false,
115
+ };
116
+ }
117
+ if (attempts < cfg.maxAttempts) {
118
+ const delay = Math.min(cfg.baseDelayMs * Math.pow(cfg.backoffMultiplier, attempts - 1), cfg.maxDelayMs);
119
+ this.logger.warn(`${operationName} failed, retrying in ${delay}ms`, {
120
+ attempt: attempts,
121
+ maxAttempts: cfg.maxAttempts,
122
+ error: errorMessage,
123
+ });
124
+ await this.sleep(delay);
125
+ }
126
+ }
127
+ }
128
+ this.logger.error(`${operationName} failed after ${attempts} attempts`, {
129
+ error: lastError?.message,
130
+ });
131
+ return {
132
+ success: false,
133
+ error: lastError,
134
+ attempts,
135
+ recoverable: true,
136
+ };
137
+ }
138
+ /**
139
+ * Synchronous retry for database operations
140
+ */
141
+ withRetrySync(operation, operationName, config) {
142
+ const cfg = { ...this.retryConfig, ...config };
143
+ let lastError;
144
+ let attempts = 0;
145
+ while (attempts < cfg.maxAttempts) {
146
+ attempts++;
147
+ try {
148
+ if (!this.checkCircuit()) {
149
+ return {
150
+ success: false,
151
+ error: new Error('Circuit breaker is open'),
152
+ attempts,
153
+ recoverable: true,
154
+ };
155
+ }
156
+ const result = operation();
157
+ this.recordSuccess();
158
+ return {
159
+ success: true,
160
+ data: result,
161
+ attempts,
162
+ recoverable: false,
163
+ };
164
+ }
165
+ catch (error) {
166
+ lastError = error;
167
+ this.recordFailure();
168
+ const errorCode = error.code || '';
169
+ const errorMessage = error.message || '';
170
+ const isRetryable = cfg.retryableErrors?.some(code => errorCode.includes(code) || errorMessage.includes(code));
171
+ if (!isRetryable && attempts === 1) {
172
+ return {
173
+ success: false,
174
+ error: lastError,
175
+ attempts,
176
+ recoverable: false,
177
+ };
178
+ }
179
+ if (attempts < cfg.maxAttempts) {
180
+ const delay = Math.min(cfg.baseDelayMs * Math.pow(cfg.backoffMultiplier, attempts - 1), cfg.maxDelayMs);
181
+ this.logger.warn(`${operationName} sync retry ${attempts}/${cfg.maxAttempts}`);
182
+ this.sleepSync(delay);
183
+ }
184
+ }
185
+ }
186
+ return {
187
+ success: false,
188
+ error: lastError,
189
+ attempts,
190
+ recoverable: true,
191
+ };
192
+ }
193
+ // ==================== CIRCUIT BREAKER ====================
194
+ /**
195
+ * Check if circuit allows operations
196
+ */
197
+ checkCircuit() {
198
+ switch (this.circuitState) {
199
+ case 'closed':
200
+ return true;
201
+ case 'open':
202
+ // Check if timeout has passed
203
+ if (Date.now() - this.lastFailureTime >= this.circuitConfig.timeout) {
204
+ this.circuitState = 'half-open';
205
+ this.logger.info('Circuit breaker transitioning to half-open');
206
+ return true;
207
+ }
208
+ return false;
209
+ case 'half-open':
210
+ return true;
211
+ }
212
+ }
213
+ /**
214
+ * Record a successful operation
215
+ */
216
+ recordSuccess() {
217
+ if (this.circuitState === 'half-open') {
218
+ this.successCount++;
219
+ if (this.successCount >= this.circuitConfig.successThreshold) {
220
+ this.circuitState = 'closed';
221
+ this.failureCount = 0;
222
+ this.successCount = 0;
223
+ this.logger.info('Circuit breaker closed - service recovered');
224
+ }
225
+ }
226
+ else {
227
+ this.failureCount = 0;
228
+ }
229
+ }
230
+ /**
231
+ * Record a failed operation
232
+ */
233
+ recordFailure() {
234
+ this.failureCount++;
235
+ this.lastFailureTime = Date.now();
236
+ if (this.circuitState === 'half-open') {
237
+ this.circuitState = 'open';
238
+ this.successCount = 0;
239
+ this.logger.warn('Circuit breaker reopened after half-open failure');
240
+ }
241
+ else if (this.failureCount >= this.circuitConfig.failureThreshold) {
242
+ this.circuitState = 'open';
243
+ this.logger.warn('Circuit breaker opened due to failure threshold', {
244
+ failures: this.failureCount,
245
+ threshold: this.circuitConfig.failureThreshold,
246
+ });
247
+ }
248
+ }
249
+ /**
250
+ * Get circuit breaker status
251
+ */
252
+ getCircuitStatus() {
253
+ return {
254
+ state: this.circuitState,
255
+ failures: this.failureCount,
256
+ lastFailure: this.lastFailureTime,
257
+ };
258
+ }
259
+ /**
260
+ * Manually reset the circuit breaker
261
+ */
262
+ resetCircuit() {
263
+ this.circuitState = 'closed';
264
+ this.failureCount = 0;
265
+ this.successCount = 0;
266
+ this.logger.info('Circuit breaker manually reset');
267
+ }
268
+ // ==================== CHECKPOINTING ====================
269
+ /**
270
+ * Create a checkpoint for an operation
271
+ */
272
+ createCheckpoint(operationId, operation, stage, data) {
273
+ const checkpoint = {
274
+ id: operationId,
275
+ operation,
276
+ stage,
277
+ data,
278
+ timestamp: new Date().toISOString(),
279
+ completed: false,
280
+ };
281
+ const filePath = join(this.checkpointDir, `${operationId}.json`);
282
+ writeFileSync(filePath, JSON.stringify(checkpoint, null, 2));
283
+ this.activeOperations.set(operationId, checkpoint);
284
+ this.logger.debug(`Checkpoint created: ${operation}/${stage}`, { operationId });
285
+ }
286
+ /**
287
+ * Update checkpoint stage
288
+ */
289
+ updateCheckpoint(operationId, stage, data) {
290
+ const existing = this.activeOperations.get(operationId);
291
+ if (!existing) {
292
+ this.logger.warn('Checkpoint not found for update', { operationId });
293
+ return;
294
+ }
295
+ const updated = {
296
+ ...existing,
297
+ stage,
298
+ data: data ? { ...existing.data, ...data } : existing.data,
299
+ timestamp: new Date().toISOString(),
300
+ };
301
+ const filePath = join(this.checkpointDir, `${operationId}.json`);
302
+ writeFileSync(filePath, JSON.stringify(updated, null, 2));
303
+ this.activeOperations.set(operationId, updated);
304
+ }
305
+ /**
306
+ * Complete a checkpoint (mark as done and remove)
307
+ */
308
+ completeCheckpoint(operationId) {
309
+ const filePath = join(this.checkpointDir, `${operationId}.json`);
310
+ if (existsSync(filePath)) {
311
+ // Mark as completed before deletion
312
+ const checkpoint = this.activeOperations.get(operationId);
313
+ if (checkpoint) {
314
+ checkpoint.completed = true;
315
+ writeFileSync(filePath, JSON.stringify(checkpoint, null, 2));
316
+ }
317
+ // Move to completed folder or delete
318
+ try {
319
+ unlinkSync(filePath);
320
+ }
321
+ catch {
322
+ // Ignore deletion errors
323
+ }
324
+ }
325
+ this.activeOperations.delete(operationId);
326
+ this.logger.debug('Checkpoint completed', { operationId });
327
+ }
328
+ /**
329
+ * Get a checkpoint by ID
330
+ */
331
+ getCheckpoint(operationId) {
332
+ const cached = this.activeOperations.get(operationId);
333
+ if (cached)
334
+ return cached;
335
+ const filePath = join(this.checkpointDir, `${operationId}.json`);
336
+ if (existsSync(filePath)) {
337
+ try {
338
+ const data = JSON.parse(readFileSync(filePath, 'utf-8'));
339
+ return data;
340
+ }
341
+ catch {
342
+ return null;
343
+ }
344
+ }
345
+ return null;
346
+ }
347
+ /**
348
+ * Recover incomplete operations on startup
349
+ */
350
+ recoverIncompleteOperations() {
351
+ try {
352
+ const files = readdirSync(this.checkpointDir);
353
+ const checkpoints = [];
354
+ for (const file of files) {
355
+ if (!file.endsWith('.json'))
356
+ continue;
357
+ const filePath = join(this.checkpointDir, file);
358
+ try {
359
+ const data = JSON.parse(readFileSync(filePath, 'utf-8'));
360
+ if (!data.completed) {
361
+ checkpoints.push(data);
362
+ this.activeOperations.set(data.id, data);
363
+ }
364
+ else {
365
+ // Clean up completed checkpoints
366
+ unlinkSync(filePath);
367
+ }
368
+ }
369
+ catch {
370
+ // Corrupted checkpoint file, remove it
371
+ try {
372
+ unlinkSync(filePath);
373
+ }
374
+ catch {
375
+ // Ignore
376
+ }
377
+ }
378
+ }
379
+ if (checkpoints.length > 0) {
380
+ this.logger.warn('Found incomplete operations from previous run', {
381
+ count: checkpoints.length,
382
+ operations: checkpoints.map(c => c.operation),
383
+ });
384
+ }
385
+ }
386
+ catch {
387
+ // Checkpoint directory doesn't exist or not readable
388
+ }
389
+ }
390
+ /**
391
+ * Get all incomplete operations for recovery
392
+ */
393
+ getIncompleteOperations() {
394
+ return Array.from(this.activeOperations.values()).filter(c => !c.completed);
395
+ }
396
+ // ==================== TRANSACTION WRAPPER ====================
397
+ /**
398
+ * Execute a database transaction with automatic rollback on failure
399
+ */
400
+ executeTransaction(db, operations) {
401
+ const operationId = `txn-${Date.now()}-${Math.random().toString(36).slice(2, 8)}`;
402
+ this.createCheckpoint(operationId, 'transaction', 'begin', {});
403
+ try {
404
+ db.prepare('BEGIN IMMEDIATE').run();
405
+ this.updateCheckpoint(operationId, 'executing');
406
+ const result = operations();
407
+ db.prepare('COMMIT').run();
408
+ this.completeCheckpoint(operationId);
409
+ return {
410
+ success: true,
411
+ data: result,
412
+ attempts: 1,
413
+ recoverable: false,
414
+ };
415
+ }
416
+ catch (error) {
417
+ this.logger.error('Transaction failed, rolling back', {
418
+ operationId,
419
+ error: error.message,
420
+ });
421
+ try {
422
+ db.prepare('ROLLBACK').run();
423
+ }
424
+ catch (rollbackError) {
425
+ this.logger.error('Rollback failed', {
426
+ error: rollbackError.message,
427
+ });
428
+ }
429
+ this.updateCheckpoint(operationId, 'rolled_back', {
430
+ error: error.message,
431
+ });
432
+ return {
433
+ success: false,
434
+ error: error,
435
+ attempts: 1,
436
+ recoverable: true,
437
+ };
438
+ }
439
+ }
440
+ // ==================== SAFE FILE OPERATIONS ====================
441
+ /**
442
+ * Write file atomically (write to temp, then rename)
443
+ */
444
+ atomicWriteFile(filePath, content) {
445
+ const tempPath = `${filePath}.tmp.${Date.now()}`;
446
+ try {
447
+ writeFileSync(tempPath, content, { encoding: 'utf-8', flag: 'w' });
448
+ renameSync(tempPath, filePath);
449
+ return true;
450
+ }
451
+ catch (error) {
452
+ this.logger.error('Atomic write failed', {
453
+ filePath,
454
+ error: error.message,
455
+ });
456
+ // Clean up temp file if it exists
457
+ try {
458
+ if (existsSync(tempPath)) {
459
+ unlinkSync(tempPath);
460
+ }
461
+ }
462
+ catch {
463
+ // Ignore cleanup errors
464
+ }
465
+ return false;
466
+ }
467
+ }
468
+ /**
469
+ * Read file with fallback to backup
470
+ */
471
+ safeReadFile(filePath, backupPath) {
472
+ // Try primary file
473
+ try {
474
+ if (existsSync(filePath)) {
475
+ return readFileSync(filePath, 'utf-8');
476
+ }
477
+ }
478
+ catch {
479
+ this.logger.warn('Failed to read primary file', { filePath });
480
+ }
481
+ // Try backup if provided
482
+ if (backupPath) {
483
+ try {
484
+ if (existsSync(backupPath)) {
485
+ this.logger.info('Using backup file', { backupPath });
486
+ return readFileSync(backupPath, 'utf-8');
487
+ }
488
+ }
489
+ catch {
490
+ this.logger.error('Failed to read backup file', { backupPath });
491
+ }
492
+ }
493
+ return null;
494
+ }
495
+ // ==================== UTILITIES ====================
496
+ sleep(ms) {
497
+ return new Promise(resolve => setTimeout(resolve, ms));
498
+ }
499
+ sleepSync(ms) {
500
+ const end = Date.now() + ms;
501
+ while (Date.now() < end) {
502
+ // Busy wait - not ideal but necessary for sync operations
503
+ }
504
+ }
505
+ /**
506
+ * Generate a unique operation ID
507
+ */
508
+ generateOperationId(prefix = 'op') {
509
+ return `${prefix}-${Date.now()}-${Math.random().toString(36).slice(2, 8)}`;
510
+ }
511
+ }
512
+ // ==================== SINGLETON INSTANCE ====================
513
+ let _resilienceManager = null;
514
+ export function getResilienceManager() {
515
+ if (!_resilienceManager) {
516
+ _resilienceManager = new ResilienceManager();
517
+ }
518
+ return _resilienceManager;
519
+ }
520
+ // ==================== HELPER DECORATORS ====================
521
+ /**
522
+ * Decorator to add retry logic to a method
523
+ */
524
+ export function withRetry(config) {
525
+ return function (_target, propertyKey, descriptor) {
526
+ const originalMethod = descriptor.value;
527
+ descriptor.value = async function (...args) {
528
+ const manager = getResilienceManager();
529
+ const result = await manager.withRetry(() => originalMethod.apply(this, args), propertyKey, config);
530
+ if (!result.success) {
531
+ throw result.error;
532
+ }
533
+ return result.data;
534
+ };
535
+ return descriptor;
536
+ };
537
+ }
538
+ /**
539
+ * Decorator to add checkpointing to a method
540
+ */
541
+ export function withCheckpoint(operationName) {
542
+ return function (_target, _propertyKey, descriptor) {
543
+ const originalMethod = descriptor.value;
544
+ descriptor.value = async function (...args) {
545
+ const manager = getResilienceManager();
546
+ const operationId = manager.generateOperationId(operationName);
547
+ manager.createCheckpoint(operationId, operationName, 'started', { args });
548
+ try {
549
+ const result = await originalMethod.apply(this, args);
550
+ manager.completeCheckpoint(operationId);
551
+ return result;
552
+ }
553
+ catch (error) {
554
+ manager.updateCheckpoint(operationId, 'failed', {
555
+ error: error.message,
556
+ });
557
+ throw error;
558
+ }
559
+ };
560
+ return descriptor;
561
+ };
562
+ }
563
+ //# sourceMappingURL=resilience.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"resilience.js","sourceRoot":"","sources":["../src/resilience.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,68 @@
1
+ /**
2
+ * Wyrm Security Module - Input validation and path security
3
+ *
4
+ * @copyright 2026 Ghost Protocol (Pvt) Ltd. All Rights Reserved.
5
+ * @license Proprietary - See LICENSE file for details.
6
+ * @module security
7
+ * @version 3.0.0
8
+ */
9
+ /**
10
+ * Validate and sanitize a path to prevent traversal attacks
11
+ */
12
+ export declare function validatePath(basePath: string, targetPath: string): string;
13
+ /**
14
+ * Check if a path is a valid directory
15
+ */
16
+ export declare function validateDirectory(path: string): boolean;
17
+ /**
18
+ * Validate project path is within allowed directories
19
+ */
20
+ export declare function validateProjectPath(projectPath: string): string;
21
+ /**
22
+ * Sanitize FTS5 search query to prevent injection
23
+ */
24
+ export declare function sanitizeFtsQuery(query: string): string;
25
+ /**
26
+ * Validate and sanitize string input
27
+ */
28
+ export declare function sanitizeString(input: unknown, maxLength?: number): string;
29
+ /**
30
+ * Validate integer input
31
+ */
32
+ export declare function validateInt(input: unknown, min?: number, max?: number): number;
33
+ /**
34
+ * Validate enum value
35
+ */
36
+ export declare function validateEnum<T extends string>(input: unknown, allowed: readonly T[], defaultValue?: T): T;
37
+ /**
38
+ * Validate API key authentication
39
+ */
40
+ export declare function validateApiKey(authHeader: string | undefined, expectedHash: string): boolean;
41
+ /**
42
+ * Hash a token for storage/comparison
43
+ */
44
+ export declare function hashToken(token: string): string;
45
+ /**
46
+ * Constant-time string comparison to prevent timing attacks
47
+ */
48
+ export declare function constantTimeCompare(a: string, b: string): boolean;
49
+ /**
50
+ * Check rate limit for a given key (IP, API key, etc.)
51
+ */
52
+ export declare function checkRateLimit(key: string, maxRequests?: number, windowMs?: number): {
53
+ allowed: boolean;
54
+ remaining: number;
55
+ resetAt: number;
56
+ };
57
+ export declare class SecurityError extends Error {
58
+ code: string;
59
+ constructor(message: string, code: string);
60
+ }
61
+ export declare const MAX_REQUEST_SIZE: number;
62
+ export declare const MAX_BATCH_SIZE = 1000;
63
+ export declare const MAX_QUERY_RESULTS = 1000;
64
+ /**
65
+ * Validate batch operation size
66
+ */
67
+ export declare function validateBatchSize(items: unknown[]): void;
68
+ //# sourceMappingURL=security.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"security.d.ts","sourceRoot":"","sources":["../src/security.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AASH;;GAEG;AACH,wBAAgB,YAAY,CAAC,QAAQ,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,GAAG,MAAM,CAiBzE;AAED;;GAEG;AACH,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAMvD;AAED;;GAEG;AACH,wBAAgB,mBAAmB,CAAC,WAAW,EAAE,MAAM,GAAG,MAAM,CAsC/D;AAID;;GAEG;AACH,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAkBtD;AAED;;GAEG;AACH,wBAAgB,cAAc,CAAC,KAAK,EAAE,OAAO,EAAE,SAAS,SAAQ,GAAG,MAAM,CAWxE;AAED;;GAEG;AACH,wBAAgB,WAAW,CAAC,KAAK,EAAE,OAAO,EAAE,GAAG,SAAI,EAAE,GAAG,SAA0B,GAAG,MAAM,CAY1F;AAED;;GAEG;AACH,wBAAgB,YAAY,CAAC,CAAC,SAAS,MAAM,EAC3C,KAAK,EAAE,OAAO,EACd,OAAO,EAAE,SAAS,CAAC,EAAE,EACrB,YAAY,CAAC,EAAE,CAAC,GACf,CAAC,CAaH;AAID;;GAEG;AACH,wBAAgB,cAAc,CAAC,UAAU,EAAE,MAAM,GAAG,SAAS,EAAE,YAAY,EAAE,MAAM,GAAG,OAAO,CAY5F;AAED;;GAEG;AACH,wBAAgB,SAAS,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAE/C;AAED;;GAEG;AACH,wBAAgB,mBAAmB,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,GAAG,OAAO,CAWjE;AAWD;;GAEG;AACH,wBAAgB,cAAc,CAC5B,GAAG,EAAE,MAAM,EACX,WAAW,SAAM,EACjB,QAAQ,SAAQ,GACf;IAAE,OAAO,EAAE,OAAO,CAAC;IAAC,SAAS,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE,CAyB1D;AAID,qBAAa,aAAc,SAAQ,KAAK;IACtC,IAAI,EAAE,MAAM,CAAC;gBAED,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM;CAK1C;AAID,eAAO,MAAM,gBAAgB,QAAc,CAAC;AAC5C,eAAO,MAAM,cAAc,OAAO,CAAC;AACnC,eAAO,MAAM,iBAAiB,OAAO,CAAC;AAEtC;;GAEG;AACH,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,OAAO,EAAE,GAAG,IAAI,CAWxD"}