@robthepcguy/rag-vault 1.0.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 (131) hide show
  1. package/LICENSE +24 -0
  2. package/README.md +421 -0
  3. package/dist/bin/install-skills.d.ts +20 -0
  4. package/dist/bin/install-skills.d.ts.map +1 -0
  5. package/dist/bin/install-skills.js +196 -0
  6. package/dist/bin/install-skills.js.map +1 -0
  7. package/dist/chunker/index.d.ts +11 -0
  8. package/dist/chunker/index.d.ts.map +1 -0
  9. package/dist/chunker/index.js +6 -0
  10. package/dist/chunker/index.js.map +1 -0
  11. package/dist/chunker/semantic-chunker.d.ts +96 -0
  12. package/dist/chunker/semantic-chunker.d.ts.map +1 -0
  13. package/dist/chunker/semantic-chunker.js +267 -0
  14. package/dist/chunker/semantic-chunker.js.map +1 -0
  15. package/dist/chunker/sentence-splitter.d.ts +16 -0
  16. package/dist/chunker/sentence-splitter.d.ts.map +1 -0
  17. package/dist/chunker/sentence-splitter.js +114 -0
  18. package/dist/chunker/sentence-splitter.js.map +1 -0
  19. package/dist/embedder/index.d.ts +55 -0
  20. package/dist/embedder/index.d.ts.map +1 -0
  21. package/dist/embedder/index.js +146 -0
  22. package/dist/embedder/index.js.map +1 -0
  23. package/dist/errors/index.d.ts +73 -0
  24. package/dist/errors/index.d.ts.map +1 -0
  25. package/dist/errors/index.js +170 -0
  26. package/dist/errors/index.js.map +1 -0
  27. package/dist/index.d.ts +3 -0
  28. package/dist/index.d.ts.map +1 -0
  29. package/dist/index.js +91 -0
  30. package/dist/index.js.map +1 -0
  31. package/dist/parser/html-parser.d.ts +14 -0
  32. package/dist/parser/html-parser.d.ts.map +1 -0
  33. package/dist/parser/html-parser.js +99 -0
  34. package/dist/parser/html-parser.js.map +1 -0
  35. package/dist/parser/index.d.ts +144 -0
  36. package/dist/parser/index.d.ts.map +1 -0
  37. package/dist/parser/index.js +446 -0
  38. package/dist/parser/index.js.map +1 -0
  39. package/dist/parser/pdf-filter.d.ts +89 -0
  40. package/dist/parser/pdf-filter.d.ts.map +1 -0
  41. package/dist/parser/pdf-filter.js +304 -0
  42. package/dist/parser/pdf-filter.js.map +1 -0
  43. package/dist/server/index.d.ts +144 -0
  44. package/dist/server/index.d.ts.map +1 -0
  45. package/dist/server/index.js +518 -0
  46. package/dist/server/index.js.map +1 -0
  47. package/dist/server/raw-data-utils.d.ts +81 -0
  48. package/dist/server/raw-data-utils.d.ts.map +1 -0
  49. package/dist/server/raw-data-utils.js +196 -0
  50. package/dist/server/raw-data-utils.js.map +1 -0
  51. package/dist/server/schemas.d.ts +186 -0
  52. package/dist/server/schemas.d.ts.map +1 -0
  53. package/dist/server/schemas.js +99 -0
  54. package/dist/server/schemas.js.map +1 -0
  55. package/dist/utils/config-parsers.d.ts +14 -0
  56. package/dist/utils/config-parsers.d.ts.map +1 -0
  57. package/dist/utils/config-parsers.js +47 -0
  58. package/dist/utils/config-parsers.js.map +1 -0
  59. package/dist/utils/config.d.ts +37 -0
  60. package/dist/utils/config.d.ts.map +1 -0
  61. package/dist/utils/config.js +52 -0
  62. package/dist/utils/config.js.map +1 -0
  63. package/dist/utils/logger.d.ts +36 -0
  64. package/dist/utils/logger.d.ts.map +1 -0
  65. package/dist/utils/logger.js +64 -0
  66. package/dist/utils/logger.js.map +1 -0
  67. package/dist/utils/math.d.ts +34 -0
  68. package/dist/utils/math.d.ts.map +1 -0
  69. package/dist/utils/math.js +73 -0
  70. package/dist/utils/math.js.map +1 -0
  71. package/dist/utils/process-handlers.d.ts +26 -0
  72. package/dist/utils/process-handlers.d.ts.map +1 -0
  73. package/dist/utils/process-handlers.js +69 -0
  74. package/dist/utils/process-handlers.js.map +1 -0
  75. package/dist/vectordb/index.d.ts +210 -0
  76. package/dist/vectordb/index.d.ts.map +1 -0
  77. package/dist/vectordb/index.js +613 -0
  78. package/dist/vectordb/index.js.map +1 -0
  79. package/dist/web/api-routes.d.ts +9 -0
  80. package/dist/web/api-routes.d.ts.map +1 -0
  81. package/dist/web/api-routes.js +127 -0
  82. package/dist/web/api-routes.js.map +1 -0
  83. package/dist/web/config-routes.d.ts +7 -0
  84. package/dist/web/config-routes.d.ts.map +1 -0
  85. package/dist/web/config-routes.js +54 -0
  86. package/dist/web/config-routes.js.map +1 -0
  87. package/dist/web/database-manager.d.ts +130 -0
  88. package/dist/web/database-manager.d.ts.map +1 -0
  89. package/dist/web/database-manager.js +382 -0
  90. package/dist/web/database-manager.js.map +1 -0
  91. package/dist/web/http-server.d.ts +28 -0
  92. package/dist/web/http-server.d.ts.map +1 -0
  93. package/dist/web/http-server.js +311 -0
  94. package/dist/web/http-server.js.map +1 -0
  95. package/dist/web/index.d.ts +3 -0
  96. package/dist/web/index.d.ts.map +1 -0
  97. package/dist/web/index.js +114 -0
  98. package/dist/web/index.js.map +1 -0
  99. package/dist/web/middleware/async-handler.d.ts +17 -0
  100. package/dist/web/middleware/async-handler.d.ts.map +1 -0
  101. package/dist/web/middleware/async-handler.js +26 -0
  102. package/dist/web/middleware/async-handler.js.map +1 -0
  103. package/dist/web/middleware/auth.d.ts +22 -0
  104. package/dist/web/middleware/auth.d.ts.map +1 -0
  105. package/dist/web/middleware/auth.js +81 -0
  106. package/dist/web/middleware/auth.js.map +1 -0
  107. package/dist/web/middleware/error-handler.d.ts +36 -0
  108. package/dist/web/middleware/error-handler.d.ts.map +1 -0
  109. package/dist/web/middleware/error-handler.js +68 -0
  110. package/dist/web/middleware/error-handler.js.map +1 -0
  111. package/dist/web/middleware/index.d.ts +6 -0
  112. package/dist/web/middleware/index.d.ts.map +1 -0
  113. package/dist/web/middleware/index.js +19 -0
  114. package/dist/web/middleware/index.js.map +1 -0
  115. package/dist/web/middleware/rate-limit.d.ts +38 -0
  116. package/dist/web/middleware/rate-limit.d.ts.map +1 -0
  117. package/dist/web/middleware/rate-limit.js +116 -0
  118. package/dist/web/middleware/rate-limit.js.map +1 -0
  119. package/dist/web/middleware/request-logger.d.ts +52 -0
  120. package/dist/web/middleware/request-logger.d.ts.map +1 -0
  121. package/dist/web/middleware/request-logger.js +74 -0
  122. package/dist/web/middleware/request-logger.js.map +1 -0
  123. package/dist/web/types.d.ts +6 -0
  124. package/dist/web/types.d.ts.map +1 -0
  125. package/dist/web/types.js +4 -0
  126. package/dist/web/types.js.map +1 -0
  127. package/package.json +135 -0
  128. package/skills/rag-vault/SKILL.md +111 -0
  129. package/skills/rag-vault/references/html-ingestion.md +73 -0
  130. package/skills/rag-vault/references/query-optimization.md +57 -0
  131. package/skills/rag-vault/references/result-refinement.md +54 -0
@@ -0,0 +1,68 @@
1
+ "use strict";
2
+ // Express error handling middleware
3
+ Object.defineProperty(exports, "__esModule", { value: true });
4
+ exports.HttpStatus = void 0;
5
+ exports.errorHandler = errorHandler;
6
+ exports.notFoundHandler = notFoundHandler;
7
+ const index_js_1 = require("../../errors/index.js");
8
+ /**
9
+ * HTTP status codes for API responses
10
+ */
11
+ var HttpStatus;
12
+ (function (HttpStatus) {
13
+ HttpStatus[HttpStatus["OK"] = 200] = "OK";
14
+ HttpStatus[HttpStatus["CREATED"] = 201] = "CREATED";
15
+ HttpStatus[HttpStatus["NO_CONTENT"] = 204] = "NO_CONTENT";
16
+ HttpStatus[HttpStatus["BAD_REQUEST"] = 400] = "BAD_REQUEST";
17
+ HttpStatus[HttpStatus["UNAUTHORIZED"] = 401] = "UNAUTHORIZED";
18
+ HttpStatus[HttpStatus["FORBIDDEN"] = 403] = "FORBIDDEN";
19
+ HttpStatus[HttpStatus["NOT_FOUND"] = 404] = "NOT_FOUND";
20
+ HttpStatus[HttpStatus["CONFLICT"] = 409] = "CONFLICT";
21
+ HttpStatus[HttpStatus["TOO_MANY_REQUESTS"] = 429] = "TOO_MANY_REQUESTS";
22
+ HttpStatus[HttpStatus["INTERNAL_ERROR"] = 500] = "INTERNAL_ERROR";
23
+ HttpStatus[HttpStatus["SERVICE_UNAVAILABLE"] = 503] = "SERVICE_UNAVAILABLE";
24
+ })(HttpStatus || (exports.HttpStatus = HttpStatus = {}));
25
+ /**
26
+ * Express error handling middleware
27
+ *
28
+ * Handles:
29
+ * - RAGError subclasses (with proper status codes)
30
+ * - Generic errors (500 Internal Server Error)
31
+ *
32
+ * In production, hides stack traces and internal details.
33
+ *
34
+ * @example
35
+ * // Add as the last middleware
36
+ * app.use(errorHandler)
37
+ */
38
+ function errorHandler(err, _req, res, _next) {
39
+ // Log the error
40
+ console.error('Request error:', err);
41
+ // Build error response
42
+ const response = {
43
+ error: err.message,
44
+ };
45
+ let statusCode = 500;
46
+ if (err instanceof index_js_1.RAGError) {
47
+ statusCode = err.statusCode;
48
+ response.code = err.code;
49
+ // Only include details in non-production
50
+ if (process.env['NODE_ENV'] !== 'production' && err.details) {
51
+ response.details = err.details;
52
+ }
53
+ }
54
+ else {
55
+ // For generic errors in production, use generic message
56
+ if (process.env['NODE_ENV'] === 'production') {
57
+ response.error = 'Internal server error';
58
+ }
59
+ }
60
+ res.status(statusCode).json(response);
61
+ }
62
+ /**
63
+ * 404 Not Found handler
64
+ */
65
+ function notFoundHandler(_req, res) {
66
+ res.status(404).json({ error: 'Not found' });
67
+ }
68
+ //# sourceMappingURL=error-handler.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"error-handler.js","sourceRoot":"","sources":["../../../src/web/middleware/error-handler.ts"],"names":[],"mappings":";AAAA,oCAAoC;;;AA4CpC,oCA2BC;AAKD,0CAEC;AA3ED,oDAAgD;AAEhD;;GAEG;AACH,IAAY,UAYX;AAZD,WAAY,UAAU;IACpB,yCAAQ,CAAA;IACR,mDAAa,CAAA;IACb,yDAAgB,CAAA;IAChB,2DAAiB,CAAA;IACjB,6DAAkB,CAAA;IAClB,uDAAe,CAAA;IACf,uDAAe,CAAA;IACf,qDAAc,CAAA;IACd,uEAAuB,CAAA;IACvB,iEAAoB,CAAA;IACpB,2EAAyB,CAAA;AAC3B,CAAC,EAZW,UAAU,0BAAV,UAAU,QAYrB;AAWD;;;;;;;;;;;;GAYG;AACH,SAAgB,YAAY,CAAC,GAAU,EAAE,IAAa,EAAE,GAAa,EAAE,KAAmB;IACxF,gBAAgB;IAChB,OAAO,CAAC,KAAK,CAAC,gBAAgB,EAAE,GAAG,CAAC,CAAA;IAEpC,uBAAuB;IACvB,MAAM,QAAQ,GAAkB;QAC9B,KAAK,EAAE,GAAG,CAAC,OAAO;KACnB,CAAA;IAED,IAAI,UAAU,GAAG,GAAG,CAAA;IAEpB,IAAI,GAAG,YAAY,mBAAQ,EAAE,CAAC;QAC5B,UAAU,GAAG,GAAG,CAAC,UAAU,CAAA;QAC3B,QAAQ,CAAC,IAAI,GAAG,GAAG,CAAC,IAAI,CAAA;QAExB,yCAAyC;QACzC,IAAI,OAAO,CAAC,GAAG,CAAC,UAAU,CAAC,KAAK,YAAY,IAAI,GAAG,CAAC,OAAO,EAAE,CAAC;YAC5D,QAAQ,CAAC,OAAO,GAAG,GAAG,CAAC,OAAO,CAAA;QAChC,CAAC;IACH,CAAC;SAAM,CAAC;QACN,wDAAwD;QACxD,IAAI,OAAO,CAAC,GAAG,CAAC,UAAU,CAAC,KAAK,YAAY,EAAE,CAAC;YAC7C,QAAQ,CAAC,KAAK,GAAG,uBAAuB,CAAA;QAC1C,CAAC;IACH,CAAC;IAED,GAAG,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAA;AACvC,CAAC;AAED;;GAEG;AACH,SAAgB,eAAe,CAAC,IAAa,EAAE,GAAa;IAC1D,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,WAAW,EAAE,CAAC,CAAA;AAC9C,CAAC"}
@@ -0,0 +1,6 @@
1
+ export { apiKeyAuth } from './auth.js';
2
+ export { asyncHandler } from './async-handler.js';
3
+ export { errorHandler, notFoundHandler } from './error-handler.js';
4
+ export { createRateLimiter, getRateLimitConfigFromEnv, stopRateLimiterCleanup, } from './rate-limit.js';
5
+ export { createRequestLogger, isRequestLoggingEnabled } from './request-logger.js';
6
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/web/middleware/index.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,UAAU,EAAE,MAAM,WAAW,CAAA;AACtC,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAA;AACjD,OAAO,EAAE,YAAY,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAA;AAClE,OAAO,EACL,iBAAiB,EACjB,yBAAyB,EACzB,sBAAsB,GACvB,MAAM,iBAAiB,CAAA;AACxB,OAAO,EAAE,mBAAmB,EAAE,uBAAuB,EAAE,MAAM,qBAAqB,CAAA"}
@@ -0,0 +1,19 @@
1
+ "use strict";
2
+ // Web middleware exports
3
+ Object.defineProperty(exports, "__esModule", { value: true });
4
+ exports.isRequestLoggingEnabled = exports.createRequestLogger = exports.stopRateLimiterCleanup = exports.getRateLimitConfigFromEnv = exports.createRateLimiter = exports.notFoundHandler = exports.errorHandler = exports.asyncHandler = exports.apiKeyAuth = void 0;
5
+ var auth_js_1 = require("./auth.js");
6
+ Object.defineProperty(exports, "apiKeyAuth", { enumerable: true, get: function () { return auth_js_1.apiKeyAuth; } });
7
+ var async_handler_js_1 = require("./async-handler.js");
8
+ Object.defineProperty(exports, "asyncHandler", { enumerable: true, get: function () { return async_handler_js_1.asyncHandler; } });
9
+ var error_handler_js_1 = require("./error-handler.js");
10
+ Object.defineProperty(exports, "errorHandler", { enumerable: true, get: function () { return error_handler_js_1.errorHandler; } });
11
+ Object.defineProperty(exports, "notFoundHandler", { enumerable: true, get: function () { return error_handler_js_1.notFoundHandler; } });
12
+ var rate_limit_js_1 = require("./rate-limit.js");
13
+ Object.defineProperty(exports, "createRateLimiter", { enumerable: true, get: function () { return rate_limit_js_1.createRateLimiter; } });
14
+ Object.defineProperty(exports, "getRateLimitConfigFromEnv", { enumerable: true, get: function () { return rate_limit_js_1.getRateLimitConfigFromEnv; } });
15
+ Object.defineProperty(exports, "stopRateLimiterCleanup", { enumerable: true, get: function () { return rate_limit_js_1.stopRateLimiterCleanup; } });
16
+ var request_logger_js_1 = require("./request-logger.js");
17
+ Object.defineProperty(exports, "createRequestLogger", { enumerable: true, get: function () { return request_logger_js_1.createRequestLogger; } });
18
+ Object.defineProperty(exports, "isRequestLoggingEnabled", { enumerable: true, get: function () { return request_logger_js_1.isRequestLoggingEnabled; } });
19
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/web/middleware/index.ts"],"names":[],"mappings":";AAAA,yBAAyB;;;AAEzB,qCAAsC;AAA7B,qGAAA,UAAU,OAAA;AACnB,uDAAiD;AAAxC,gHAAA,YAAY,OAAA;AACrB,uDAAkE;AAAzD,gHAAA,YAAY,OAAA;AAAE,mHAAA,eAAe,OAAA;AACtC,iDAIwB;AAHtB,kHAAA,iBAAiB,OAAA;AACjB,0HAAA,yBAAyB,OAAA;AACzB,uHAAA,sBAAsB,OAAA;AAExB,yDAAkF;AAAzE,wHAAA,mBAAmB,OAAA;AAAE,4HAAA,uBAAuB,OAAA"}
@@ -0,0 +1,38 @@
1
+ import type { NextFunction, Request, Response } from 'express';
2
+ /**
3
+ * Rate limit configuration
4
+ */
5
+ export interface RateLimitConfig {
6
+ /** Time window in milliseconds */
7
+ windowMs: number;
8
+ /** Maximum requests per window */
9
+ maxRequests: number;
10
+ /** Message to return when rate limited */
11
+ message?: string;
12
+ }
13
+ /**
14
+ * Create a rate limiting middleware
15
+ *
16
+ * Uses client IP address for tracking. In production with proxies,
17
+ * ensure trust proxy is configured in Express.
18
+ *
19
+ * @example
20
+ * app.use('/api', createRateLimiter({ windowMs: 60000, maxRequests: 100 }))
21
+ */
22
+ export declare function createRateLimiter(config?: Partial<RateLimitConfig>): (req: Request, res: Response, next: NextFunction) => void;
23
+ /**
24
+ * Get rate limit configuration from environment variables
25
+ *
26
+ * Environment variables:
27
+ * - RATE_LIMIT_WINDOW_MS: Time window in milliseconds (default: 60000)
28
+ * - RATE_LIMIT_MAX_REQUESTS: Max requests per window (default: 100)
29
+ */
30
+ export declare function getRateLimitConfigFromEnv(): RateLimitConfig;
31
+ /**
32
+ * Stop the rate limiter cleanup interval
33
+ *
34
+ * Call this during graceful shutdown to prevent memory leaks.
35
+ * Safe to call multiple times or when no interval is active.
36
+ */
37
+ export declare function stopRateLimiterCleanup(): void;
38
+ //# sourceMappingURL=rate-limit.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"rate-limit.d.ts","sourceRoot":"","sources":["../../../src/web/middleware/rate-limit.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,YAAY,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAA;AAQ9D;;GAEG;AACH,MAAM,WAAW,eAAe;IAC9B,kCAAkC;IAClC,QAAQ,EAAE,MAAM,CAAA;IAChB,kCAAkC;IAClC,WAAW,EAAE,MAAM,CAAA;IACnB,0CAA0C;IAC1C,OAAO,CAAC,EAAE,MAAM,CAAA;CACjB;AAmBD;;;;;;;;GAQG;AACH,wBAAgB,iBAAiB,CAAC,MAAM,GAAE,OAAO,CAAC,eAAe,CAAM,IAiC7D,KAAK,OAAO,EAAE,KAAK,QAAQ,EAAE,MAAM,YAAY,KAAG,IAAI,CAkC/D;AAED;;;;;;GAMG;AACH,wBAAgB,yBAAyB,IAAI,eAAe,CAY3D;AAED;;;;;GAKG;AACH,wBAAgB,sBAAsB,IAAI,IAAI,CAM7C"}
@@ -0,0 +1,116 @@
1
+ "use strict";
2
+ // Simple in-memory rate limiting middleware
3
+ Object.defineProperty(exports, "__esModule", { value: true });
4
+ exports.createRateLimiter = createRateLimiter;
5
+ exports.getRateLimitConfigFromEnv = getRateLimitConfigFromEnv;
6
+ exports.stopRateLimiterCleanup = stopRateLimiterCleanup;
7
+ // Track active cleanup interval for graceful shutdown
8
+ let cleanupInterval = null;
9
+ // Track if rate limiter has been created (for warning)
10
+ let rateLimiterCreated = false;
11
+ /**
12
+ * Default rate limit configuration
13
+ */
14
+ const DEFAULT_CONFIG = {
15
+ windowMs: 60 * 1000, // 1 minute
16
+ maxRequests: 100, // 100 requests per minute
17
+ message: 'Too many requests, please try again later',
18
+ };
19
+ /**
20
+ * Create a rate limiting middleware
21
+ *
22
+ * Uses client IP address for tracking. In production with proxies,
23
+ * ensure trust proxy is configured in Express.
24
+ *
25
+ * @example
26
+ * app.use('/api', createRateLimiter({ windowMs: 60000, maxRequests: 100 }))
27
+ */
28
+ function createRateLimiter(config = {}) {
29
+ const { windowMs, maxRequests, message } = { ...DEFAULT_CONFIG, ...config };
30
+ // Warn if rate limiter is being recreated (potential memory leak)
31
+ if (rateLimiterCreated) {
32
+ console.warn('Rate limiter already created. Creating a new instance replaces the previous one. ' +
33
+ 'If this is intentional, call stopRateLimiterCleanup() first.');
34
+ }
35
+ rateLimiterCreated = true;
36
+ // In-memory store for client request counts
37
+ const clients = new Map();
38
+ // Clear any existing cleanup interval before creating a new one
39
+ if (cleanupInterval) {
40
+ clearInterval(cleanupInterval);
41
+ }
42
+ // Cleanup old entries periodically
43
+ cleanupInterval = setInterval(() => {
44
+ const now = Date.now();
45
+ for (const [key, record] of clients.entries()) {
46
+ if (record.resetTime < now) {
47
+ clients.delete(key);
48
+ }
49
+ }
50
+ }, windowMs * 2);
51
+ // Prevent interval from keeping process alive
52
+ cleanupInterval.unref();
53
+ return (req, res, next) => {
54
+ // Get client identifier (IP address)
55
+ const clientId = req.ip || req.socket.remoteAddress || 'unknown';
56
+ const now = Date.now();
57
+ // Get or create client record
58
+ let record = clients.get(clientId);
59
+ if (!record || record.resetTime < now) {
60
+ // New window
61
+ record = { count: 1, resetTime: now + windowMs };
62
+ clients.set(clientId, record);
63
+ }
64
+ else {
65
+ // Increment existing window
66
+ record.count++;
67
+ }
68
+ // Set rate limit headers
69
+ res.setHeader('X-RateLimit-Limit', maxRequests);
70
+ res.setHeader('X-RateLimit-Remaining', Math.max(0, maxRequests - record.count));
71
+ res.setHeader('X-RateLimit-Reset', Math.ceil(record.resetTime / 1000));
72
+ // Check if rate limited
73
+ if (record.count > maxRequests) {
74
+ res.status(429).json({
75
+ error: message,
76
+ code: 'RATE_LIMIT_EXCEEDED',
77
+ retryAfter: Math.ceil((record.resetTime - now) / 1000),
78
+ });
79
+ return;
80
+ }
81
+ next();
82
+ };
83
+ }
84
+ /**
85
+ * Get rate limit configuration from environment variables
86
+ *
87
+ * Environment variables:
88
+ * - RATE_LIMIT_WINDOW_MS: Time window in milliseconds (default: 60000)
89
+ * - RATE_LIMIT_MAX_REQUESTS: Max requests per window (default: 100)
90
+ */
91
+ function getRateLimitConfigFromEnv() {
92
+ const windowMs = Number.parseInt(process.env['RATE_LIMIT_WINDOW_MS'] || '60000', 10);
93
+ const maxRequests = Number.parseInt(process.env['RATE_LIMIT_MAX_REQUESTS'] || '100', 10);
94
+ const config = {
95
+ windowMs: Number.isNaN(windowMs) ? DEFAULT_CONFIG.windowMs : windowMs,
96
+ maxRequests: Number.isNaN(maxRequests) ? DEFAULT_CONFIG.maxRequests : maxRequests,
97
+ };
98
+ if (DEFAULT_CONFIG.message !== undefined) {
99
+ config.message = DEFAULT_CONFIG.message;
100
+ }
101
+ return config;
102
+ }
103
+ /**
104
+ * Stop the rate limiter cleanup interval
105
+ *
106
+ * Call this during graceful shutdown to prevent memory leaks.
107
+ * Safe to call multiple times or when no interval is active.
108
+ */
109
+ function stopRateLimiterCleanup() {
110
+ if (cleanupInterval) {
111
+ clearInterval(cleanupInterval);
112
+ cleanupInterval = null;
113
+ }
114
+ rateLimiterCreated = false;
115
+ }
116
+ //# sourceMappingURL=rate-limit.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"rate-limit.js","sourceRoot":"","sources":["../../../src/web/middleware/rate-limit.ts"],"names":[],"mappings":";AAAA,4CAA4C;;AAgD5C,8CAmEC;AASD,8DAYC;AAQD,wDAMC;AAlJD,sDAAsD;AACtD,IAAI,eAAe,GAA0B,IAAI,CAAA;AAEjD,uDAAuD;AACvD,IAAI,kBAAkB,GAAG,KAAK,CAAA;AAsB9B;;GAEG;AACH,MAAM,cAAc,GAAoB;IACtC,QAAQ,EAAE,EAAE,GAAG,IAAI,EAAE,WAAW;IAChC,WAAW,EAAE,GAAG,EAAE,0BAA0B;IAC5C,OAAO,EAAE,2CAA2C;CACrD,CAAA;AAED;;;;;;;;GAQG;AACH,SAAgB,iBAAiB,CAAC,SAAmC,EAAE;IACrE,MAAM,EAAE,QAAQ,EAAE,WAAW,EAAE,OAAO,EAAE,GAAG,EAAE,GAAG,cAAc,EAAE,GAAG,MAAM,EAAE,CAAA;IAE3E,kEAAkE;IAClE,IAAI,kBAAkB,EAAE,CAAC;QACvB,OAAO,CAAC,IAAI,CACV,mFAAmF;YACjF,8DAA8D,CACjE,CAAA;IACH,CAAC;IACD,kBAAkB,GAAG,IAAI,CAAA;IAEzB,4CAA4C;IAC5C,MAAM,OAAO,GAAG,IAAI,GAAG,EAAwB,CAAA;IAE/C,gEAAgE;IAChE,IAAI,eAAe,EAAE,CAAC;QACpB,aAAa,CAAC,eAAe,CAAC,CAAA;IAChC,CAAC;IAED,mCAAmC;IACnC,eAAe,GAAG,WAAW,CAAC,GAAG,EAAE;QACjC,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,EAAE,CAAA;QACtB,KAAK,MAAM,CAAC,GAAG,EAAE,MAAM,CAAC,IAAI,OAAO,CAAC,OAAO,EAAE,EAAE,CAAC;YAC9C,IAAI,MAAM,CAAC,SAAS,GAAG,GAAG,EAAE,CAAC;gBAC3B,OAAO,CAAC,MAAM,CAAC,GAAG,CAAC,CAAA;YACrB,CAAC;QACH,CAAC;IACH,CAAC,EAAE,QAAQ,GAAG,CAAC,CAAC,CAAA;IAEhB,8CAA8C;IAC9C,eAAe,CAAC,KAAK,EAAE,CAAA;IAEvB,OAAO,CAAC,GAAY,EAAE,GAAa,EAAE,IAAkB,EAAQ,EAAE;QAC/D,qCAAqC;QACrC,MAAM,QAAQ,GAAG,GAAG,CAAC,EAAE,IAAI,GAAG,CAAC,MAAM,CAAC,aAAa,IAAI,SAAS,CAAA;QAChE,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,EAAE,CAAA;QAEtB,8BAA8B;QAC9B,IAAI,MAAM,GAAG,OAAO,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAA;QAElC,IAAI,CAAC,MAAM,IAAI,MAAM,CAAC,SAAS,GAAG,GAAG,EAAE,CAAC;YACtC,aAAa;YACb,MAAM,GAAG,EAAE,KAAK,EAAE,CAAC,EAAE,SAAS,EAAE,GAAG,GAAG,QAAQ,EAAE,CAAA;YAChD,OAAO,CAAC,GAAG,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAA;QAC/B,CAAC;aAAM,CAAC;YACN,4BAA4B;YAC5B,MAAM,CAAC,KAAK,EAAE,CAAA;QAChB,CAAC;QAED,yBAAyB;QACzB,GAAG,CAAC,SAAS,CAAC,mBAAmB,EAAE,WAAW,CAAC,CAAA;QAC/C,GAAG,CAAC,SAAS,CAAC,uBAAuB,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,WAAW,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC,CAAA;QAC/E,GAAG,CAAC,SAAS,CAAC,mBAAmB,EAAE,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,SAAS,GAAG,IAAI,CAAC,CAAC,CAAA;QAEtE,wBAAwB;QACxB,IAAI,MAAM,CAAC,KAAK,GAAG,WAAW,EAAE,CAAC;YAC/B,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC;gBACnB,KAAK,EAAE,OAAO;gBACd,IAAI,EAAE,qBAAqB;gBAC3B,UAAU,EAAE,IAAI,CAAC,IAAI,CAAC,CAAC,MAAM,CAAC,SAAS,GAAG,GAAG,CAAC,GAAG,IAAI,CAAC;aACvD,CAAC,CAAA;YACF,OAAM;QACR,CAAC;QAED,IAAI,EAAE,CAAA;IACR,CAAC,CAAA;AACH,CAAC;AAED;;;;;;GAMG;AACH,SAAgB,yBAAyB;IACvC,MAAM,QAAQ,GAAG,MAAM,CAAC,QAAQ,CAAC,OAAO,CAAC,GAAG,CAAC,sBAAsB,CAAC,IAAI,OAAO,EAAE,EAAE,CAAC,CAAA;IACpF,MAAM,WAAW,GAAG,MAAM,CAAC,QAAQ,CAAC,OAAO,CAAC,GAAG,CAAC,yBAAyB,CAAC,IAAI,KAAK,EAAE,EAAE,CAAC,CAAA;IAExF,MAAM,MAAM,GAAoB;QAC9B,QAAQ,EAAE,MAAM,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,cAAc,CAAC,QAAQ,CAAC,CAAC,CAAC,QAAQ;QACrE,WAAW,EAAE,MAAM,CAAC,KAAK,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,cAAc,CAAC,WAAW,CAAC,CAAC,CAAC,WAAW;KAClF,CAAA;IACD,IAAI,cAAc,CAAC,OAAO,KAAK,SAAS,EAAE,CAAC;QACzC,MAAM,CAAC,OAAO,GAAG,cAAc,CAAC,OAAO,CAAA;IACzC,CAAC;IACD,OAAO,MAAM,CAAA;AACf,CAAC;AAED;;;;;GAKG;AACH,SAAgB,sBAAsB;IACpC,IAAI,eAAe,EAAE,CAAC;QACpB,aAAa,CAAC,eAAe,CAAC,CAAA;QAC9B,eAAe,GAAG,IAAI,CAAA;IACxB,CAAC;IACD,kBAAkB,GAAG,KAAK,CAAA;AAC5B,CAAC"}
@@ -0,0 +1,52 @@
1
+ import type { NextFunction, Request, Response } from 'express';
2
+ /**
3
+ * Log entry structure
4
+ */
5
+ export interface RequestLogEntry {
6
+ timestamp: string;
7
+ method: string;
8
+ path: string;
9
+ statusCode: number;
10
+ responseTime: number;
11
+ clientIp: string;
12
+ userAgent: string;
13
+ contentLength?: number;
14
+ }
15
+ /**
16
+ * Logger function type
17
+ */
18
+ export type LoggerFn = (entry: RequestLogEntry) => void;
19
+ /**
20
+ * Request logging configuration
21
+ */
22
+ export interface RequestLoggerConfig {
23
+ /** Custom logger function */
24
+ logger?: LoggerFn;
25
+ /** Skip logging for certain paths (e.g., health checks) */
26
+ skip?: (req: Request) => boolean;
27
+ /** Include request body in logs (careful with sensitive data) */
28
+ includeBody?: boolean;
29
+ }
30
+ /**
31
+ * Create a request logging middleware
32
+ *
33
+ * Logs all incoming requests with timing information for audit trails.
34
+ *
35
+ * @example
36
+ * app.use(createRequestLogger())
37
+ *
38
+ * @example
39
+ * // With custom logger
40
+ * app.use(createRequestLogger({
41
+ * logger: (entry) => myLogger.info(entry),
42
+ * skip: (req) => req.path === '/health'
43
+ * }))
44
+ */
45
+ export declare function createRequestLogger(config?: RequestLoggerConfig): (req: Request, res: Response, next: NextFunction) => void;
46
+ /**
47
+ * Check if request logging is enabled via environment variable
48
+ *
49
+ * Enable with: REQUEST_LOGGING=true
50
+ */
51
+ export declare function isRequestLoggingEnabled(): boolean;
52
+ //# sourceMappingURL=request-logger.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"request-logger.d.ts","sourceRoot":"","sources":["../../../src/web/middleware/request-logger.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,YAAY,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAA;AAE9D;;GAEG;AACH,MAAM,WAAW,eAAe;IAC9B,SAAS,EAAE,MAAM,CAAA;IACjB,MAAM,EAAE,MAAM,CAAA;IACd,IAAI,EAAE,MAAM,CAAA;IACZ,UAAU,EAAE,MAAM,CAAA;IAClB,YAAY,EAAE,MAAM,CAAA;IACpB,QAAQ,EAAE,MAAM,CAAA;IAChB,SAAS,EAAE,MAAM,CAAA;IACjB,aAAa,CAAC,EAAE,MAAM,CAAA;CACvB;AAED;;GAEG;AACH,MAAM,MAAM,QAAQ,GAAG,CAAC,KAAK,EAAE,eAAe,KAAK,IAAI,CAAA;AAkBvD;;GAEG;AACH,MAAM,WAAW,mBAAmB;IAClC,6BAA6B;IAC7B,MAAM,CAAC,EAAE,QAAQ,CAAA;IACjB,2DAA2D;IAC3D,IAAI,CAAC,EAAE,CAAC,GAAG,EAAE,OAAO,KAAK,OAAO,CAAA;IAChC,iEAAiE;IACjE,WAAW,CAAC,EAAE,OAAO,CAAA;CACtB;AAED;;;;;;;;;;;;;;GAcG;AACH,wBAAgB,mBAAmB,CAAC,MAAM,GAAE,mBAAwB,IAG1D,KAAK,OAAO,EAAE,KAAK,QAAQ,EAAE,MAAM,YAAY,KAAG,IAAI,CAgC/D;AAED;;;;GAIG;AACH,wBAAgB,uBAAuB,IAAI,OAAO,CAGjD"}
@@ -0,0 +1,74 @@
1
+ "use strict";
2
+ // Request logging middleware for audit trail
3
+ Object.defineProperty(exports, "__esModule", { value: true });
4
+ exports.createRequestLogger = createRequestLogger;
5
+ exports.isRequestLoggingEnabled = isRequestLoggingEnabled;
6
+ /**
7
+ * Default logger - outputs to stderr in structured format
8
+ */
9
+ const defaultLogger = (entry) => {
10
+ const logLine = [
11
+ `[${entry.timestamp}]`,
12
+ entry.method,
13
+ entry.path,
14
+ entry.statusCode,
15
+ `${entry.responseTime}ms`,
16
+ entry.clientIp,
17
+ ].join(' ');
18
+ console.error(logLine);
19
+ };
20
+ /**
21
+ * Create a request logging middleware
22
+ *
23
+ * Logs all incoming requests with timing information for audit trails.
24
+ *
25
+ * @example
26
+ * app.use(createRequestLogger())
27
+ *
28
+ * @example
29
+ * // With custom logger
30
+ * app.use(createRequestLogger({
31
+ * logger: (entry) => myLogger.info(entry),
32
+ * skip: (req) => req.path === '/health'
33
+ * }))
34
+ */
35
+ function createRequestLogger(config = {}) {
36
+ const { logger = defaultLogger, skip } = config;
37
+ return (req, res, next) => {
38
+ // Skip logging if configured
39
+ if (skip?.(req)) {
40
+ next();
41
+ return;
42
+ }
43
+ const startTime = Date.now();
44
+ // Capture response finish
45
+ res.on('finish', () => {
46
+ const entry = {
47
+ timestamp: new Date().toISOString(),
48
+ method: req.method,
49
+ path: req.originalUrl || req.url,
50
+ statusCode: res.statusCode,
51
+ responseTime: Date.now() - startTime,
52
+ clientIp: req.ip || req.socket.remoteAddress || 'unknown',
53
+ userAgent: req.get('user-agent') || 'unknown',
54
+ };
55
+ // Add content length if available
56
+ const contentLength = res.get('content-length');
57
+ if (contentLength) {
58
+ entry.contentLength = Number.parseInt(contentLength, 10);
59
+ }
60
+ logger(entry);
61
+ });
62
+ next();
63
+ };
64
+ }
65
+ /**
66
+ * Check if request logging is enabled via environment variable
67
+ *
68
+ * Enable with: REQUEST_LOGGING=true
69
+ */
70
+ function isRequestLoggingEnabled() {
71
+ const envValue = process.env['REQUEST_LOGGING'];
72
+ return envValue === 'true' || envValue === '1';
73
+ }
74
+ //# sourceMappingURL=request-logger.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"request-logger.js","sourceRoot":"","sources":["../../../src/web/middleware/request-logger.ts"],"names":[],"mappings":";AAAA,6CAA6C;;AAkE7C,kDAmCC;AAOD,0DAGC;AAxFD;;GAEG;AACH,MAAM,aAAa,GAAa,CAAC,KAAK,EAAE,EAAE;IACxC,MAAM,OAAO,GAAG;QACd,IAAI,KAAK,CAAC,SAAS,GAAG;QACtB,KAAK,CAAC,MAAM;QACZ,KAAK,CAAC,IAAI;QACV,KAAK,CAAC,UAAU;QAChB,GAAG,KAAK,CAAC,YAAY,IAAI;QACzB,KAAK,CAAC,QAAQ;KACf,CAAC,IAAI,CAAC,GAAG,CAAC,CAAA;IAEX,OAAO,CAAC,KAAK,CAAC,OAAO,CAAC,CAAA;AACxB,CAAC,CAAA;AAcD;;;;;;;;;;;;;;GAcG;AACH,SAAgB,mBAAmB,CAAC,SAA8B,EAAE;IAClE,MAAM,EAAE,MAAM,GAAG,aAAa,EAAE,IAAI,EAAE,GAAG,MAAM,CAAA;IAE/C,OAAO,CAAC,GAAY,EAAE,GAAa,EAAE,IAAkB,EAAQ,EAAE;QAC/D,6BAA6B;QAC7B,IAAI,IAAI,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC;YAChB,IAAI,EAAE,CAAA;YACN,OAAM;QACR,CAAC;QAED,MAAM,SAAS,GAAG,IAAI,CAAC,GAAG,EAAE,CAAA;QAE5B,0BAA0B;QAC1B,GAAG,CAAC,EAAE,CAAC,QAAQ,EAAE,GAAG,EAAE;YACpB,MAAM,KAAK,GAAoB;gBAC7B,SAAS,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;gBACnC,MAAM,EAAE,GAAG,CAAC,MAAM;gBAClB,IAAI,EAAE,GAAG,CAAC,WAAW,IAAI,GAAG,CAAC,GAAG;gBAChC,UAAU,EAAE,GAAG,CAAC,UAAU;gBAC1B,YAAY,EAAE,IAAI,CAAC,GAAG,EAAE,GAAG,SAAS;gBACpC,QAAQ,EAAE,GAAG,CAAC,EAAE,IAAI,GAAG,CAAC,MAAM,CAAC,aAAa,IAAI,SAAS;gBACzD,SAAS,EAAE,GAAG,CAAC,GAAG,CAAC,YAAY,CAAC,IAAI,SAAS;aAC9C,CAAA;YAED,kCAAkC;YAClC,MAAM,aAAa,GAAG,GAAG,CAAC,GAAG,CAAC,gBAAgB,CAAC,CAAA;YAC/C,IAAI,aAAa,EAAE,CAAC;gBAClB,KAAK,CAAC,aAAa,GAAG,MAAM,CAAC,QAAQ,CAAC,aAAa,EAAE,EAAE,CAAC,CAAA;YAC1D,CAAC;YAED,MAAM,CAAC,KAAK,CAAC,CAAA;QACf,CAAC,CAAC,CAAA;QAEF,IAAI,EAAE,CAAA;IACR,CAAC,CAAA;AACH,CAAC;AAED;;;;GAIG;AACH,SAAgB,uBAAuB;IACrC,MAAM,QAAQ,GAAG,OAAO,CAAC,GAAG,CAAC,iBAAiB,CAAC,CAAA;IAC/C,OAAO,QAAQ,KAAK,MAAM,IAAI,QAAQ,KAAK,GAAG,CAAA;AAChD,CAAC"}
@@ -0,0 +1,6 @@
1
+ import type { RAGServer } from '../server/index.js';
2
+ /**
3
+ * Server accessor function type - allows dynamic server access
4
+ */
5
+ export type ServerAccessor = () => RAGServer;
6
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/web/types.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,oBAAoB,CAAA;AAEnD;;GAEG;AACH,MAAM,MAAM,cAAc,GAAG,MAAM,SAAS,CAAA"}
@@ -0,0 +1,4 @@
1
+ "use strict";
2
+ // Shared types for web module
3
+ Object.defineProperty(exports, "__esModule", { value: true });
4
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/web/types.ts"],"names":[],"mappings":";AAAA,8BAA8B"}
package/package.json ADDED
@@ -0,0 +1,135 @@
1
+ {
2
+ "name": "@robthepcguy/rag-vault",
3
+ "version": "1.0.0",
4
+ "description": "Local RAG MCP Server - Easy-to-setup document search with minimal configuration",
5
+ "main": "dist/index.js",
6
+ "bin": {
7
+ "rag-vault": "dist/index.js"
8
+ },
9
+ "files": [
10
+ "dist",
11
+ "skills"
12
+ ],
13
+ "keywords": [
14
+ "typescript",
15
+ "mcp",
16
+ "mcp-server",
17
+ "model-context-protocol",
18
+ "rag",
19
+ "vector-search",
20
+ "semantic-search",
21
+ "embeddings",
22
+ "lancedb",
23
+ "transformers",
24
+ "huggingface",
25
+ "local-ai",
26
+ "offline",
27
+ "privacy",
28
+ "document-search",
29
+ "pdf",
30
+ "json",
31
+ "claude-code",
32
+ "cursor",
33
+ "codex",
34
+ "skills"
35
+ ],
36
+ "author": "RobThePCGuy",
37
+ "license": "MIT",
38
+ "repository": {
39
+ "type": "git",
40
+ "url": "git+https://github.com/RobThePCGuy/rag-vault.git"
41
+ },
42
+ "scripts": {
43
+ "build": "tsc && tsc-alias",
44
+ "check": "pnpm type-check && pnpm lint && pnpm format:check",
45
+ "check:all": "pnpm check && pnpm check:unused && pnpm check:deps && pnpm build && pnpm test",
46
+ "check:deps": "madge --circular --extensions ts src",
47
+ "check:deps:graph": "madge --extensions ts --image graph.svg src",
48
+ "check:unused": "node scripts/check-unused-exports.js",
49
+ "check:unused:all": "knip",
50
+ "cleanup:processes": "bash ./scripts/cleanup-test-processes.sh",
51
+ "dev": "tsx src/index.ts",
52
+ "format": "biome format --write src",
53
+ "format:check": "biome format src",
54
+ "lint": "biome lint src",
55
+ "lint:fix": "biome lint --write src",
56
+ "start": "node dist/index.js",
57
+ "test": "vitest run",
58
+ "test:coverage": "vitest run --coverage",
59
+ "test:safe": "pnpm test && pnpm cleanup:processes",
60
+ "test:watch": "vitest",
61
+ "type-check": "tsc --noEmit",
62
+ "audit": "pnpm audit --audit-level=moderate",
63
+ "audit:fix": "pnpm audit --fix",
64
+ "setup:web": "pnpm install && pnpm web:build && pnpm --prefix web-ui install && pnpm ui:build && pnpm web:dev",
65
+ "ui:build": "pnpm --prefix web-ui build",
66
+ "ui:dev": "cd web-ui && pnpm dev",
67
+ "web:build": "pnpm build",
68
+ "web:dev": "concurrently -n api,ui -c blue,magenta \"pnpm web:watch\" \"pnpm --prefix web-ui dev\"",
69
+ "web:start": "node dist/web/index.js",
70
+ "web:watch": "tsx watch src/web/index.ts",
71
+ "web": "tsx src/web/index.ts"
72
+ },
73
+ "dependencies": {
74
+ "@huggingface/transformers": "^3.7.6",
75
+ "hono": "^4.11.7",
76
+ "@lancedb/lancedb": "^0.23.0",
77
+ "@modelcontextprotocol/sdk": "^1.25.3",
78
+ "@mozilla/readability": "^0.6.0",
79
+ "compression": "^1.8.1",
80
+ "cors": "^2.8.5",
81
+ "express": "^4.21.2",
82
+ "file-type": "^21.3.0",
83
+ "helmet": "^8.1.0",
84
+ "jsdom": "^27.4.0",
85
+ "mammoth": "^1.11.0",
86
+ "multer": "^2.0.2",
87
+ "pdfjs-dist": "^5.4.530",
88
+ "turndown": "^7.2.2",
89
+ "zod": "^3.25.76"
90
+ },
91
+ "devDependencies": {
92
+ "@biomejs/biome": "^2.3.12",
93
+ "@types/compression": "^1.8.1",
94
+ "@types/cors": "^2.8.17",
95
+ "@types/express": "^5.0.0",
96
+ "@types/jsdom": "^27.0.0",
97
+ "@types/multer": "^2.0.0",
98
+ "@types/node": "^24.0.0",
99
+ "@types/turndown": "5.0.6",
100
+ "@vitest/coverage-v8": "^4.0.18",
101
+ "concurrently": "^9.2.1",
102
+ "husky": "^9.1.7",
103
+ "knip": "^5.61.0",
104
+ "lint-staged": "^16.2.7",
105
+ "madge": "^8.0.0",
106
+ "ts-node": "^10.9.1",
107
+ "tsc-alias": "^1.8.7",
108
+ "tsx": "^4.19.4",
109
+ "typescript": "^5.0.0",
110
+ "vitest": "^4.0.18"
111
+ },
112
+ "engines": {
113
+ "node": ">=20"
114
+ },
115
+ "lint-staged": {
116
+ "src/**/*.{ts,tsx}": [
117
+ "biome check --write --no-errors-on-unmatched"
118
+ ]
119
+ },
120
+ "mcpName": "io.github.RobThePCGuy/rag-vault",
121
+ "pnpm": {
122
+ "overrides": {
123
+ "tar": ">=7.5.4",
124
+ "hono": "4.11.7",
125
+ "diff": ">=4.0.4"
126
+ },
127
+ "onlyBuiltDependencies": [
128
+ "esbuild",
129
+ "onnxruntime-node",
130
+ "protobufjs",
131
+ "@robthepcguy/rag-vault",
132
+ "sharp"
133
+ ]
134
+ }
135
+ }