@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.
- package/LICENSE +24 -0
- package/README.md +421 -0
- package/dist/bin/install-skills.d.ts +20 -0
- package/dist/bin/install-skills.d.ts.map +1 -0
- package/dist/bin/install-skills.js +196 -0
- package/dist/bin/install-skills.js.map +1 -0
- package/dist/chunker/index.d.ts +11 -0
- package/dist/chunker/index.d.ts.map +1 -0
- package/dist/chunker/index.js +6 -0
- package/dist/chunker/index.js.map +1 -0
- package/dist/chunker/semantic-chunker.d.ts +96 -0
- package/dist/chunker/semantic-chunker.d.ts.map +1 -0
- package/dist/chunker/semantic-chunker.js +267 -0
- package/dist/chunker/semantic-chunker.js.map +1 -0
- package/dist/chunker/sentence-splitter.d.ts +16 -0
- package/dist/chunker/sentence-splitter.d.ts.map +1 -0
- package/dist/chunker/sentence-splitter.js +114 -0
- package/dist/chunker/sentence-splitter.js.map +1 -0
- package/dist/embedder/index.d.ts +55 -0
- package/dist/embedder/index.d.ts.map +1 -0
- package/dist/embedder/index.js +146 -0
- package/dist/embedder/index.js.map +1 -0
- package/dist/errors/index.d.ts +73 -0
- package/dist/errors/index.d.ts.map +1 -0
- package/dist/errors/index.js +170 -0
- package/dist/errors/index.js.map +1 -0
- package/dist/index.d.ts +3 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +91 -0
- package/dist/index.js.map +1 -0
- package/dist/parser/html-parser.d.ts +14 -0
- package/dist/parser/html-parser.d.ts.map +1 -0
- package/dist/parser/html-parser.js +99 -0
- package/dist/parser/html-parser.js.map +1 -0
- package/dist/parser/index.d.ts +144 -0
- package/dist/parser/index.d.ts.map +1 -0
- package/dist/parser/index.js +446 -0
- package/dist/parser/index.js.map +1 -0
- package/dist/parser/pdf-filter.d.ts +89 -0
- package/dist/parser/pdf-filter.d.ts.map +1 -0
- package/dist/parser/pdf-filter.js +304 -0
- package/dist/parser/pdf-filter.js.map +1 -0
- package/dist/server/index.d.ts +144 -0
- package/dist/server/index.d.ts.map +1 -0
- package/dist/server/index.js +518 -0
- package/dist/server/index.js.map +1 -0
- package/dist/server/raw-data-utils.d.ts +81 -0
- package/dist/server/raw-data-utils.d.ts.map +1 -0
- package/dist/server/raw-data-utils.js +196 -0
- package/dist/server/raw-data-utils.js.map +1 -0
- package/dist/server/schemas.d.ts +186 -0
- package/dist/server/schemas.d.ts.map +1 -0
- package/dist/server/schemas.js +99 -0
- package/dist/server/schemas.js.map +1 -0
- package/dist/utils/config-parsers.d.ts +14 -0
- package/dist/utils/config-parsers.d.ts.map +1 -0
- package/dist/utils/config-parsers.js +47 -0
- package/dist/utils/config-parsers.js.map +1 -0
- package/dist/utils/config.d.ts +37 -0
- package/dist/utils/config.d.ts.map +1 -0
- package/dist/utils/config.js +52 -0
- package/dist/utils/config.js.map +1 -0
- package/dist/utils/logger.d.ts +36 -0
- package/dist/utils/logger.d.ts.map +1 -0
- package/dist/utils/logger.js +64 -0
- package/dist/utils/logger.js.map +1 -0
- package/dist/utils/math.d.ts +34 -0
- package/dist/utils/math.d.ts.map +1 -0
- package/dist/utils/math.js +73 -0
- package/dist/utils/math.js.map +1 -0
- package/dist/utils/process-handlers.d.ts +26 -0
- package/dist/utils/process-handlers.d.ts.map +1 -0
- package/dist/utils/process-handlers.js +69 -0
- package/dist/utils/process-handlers.js.map +1 -0
- package/dist/vectordb/index.d.ts +210 -0
- package/dist/vectordb/index.d.ts.map +1 -0
- package/dist/vectordb/index.js +613 -0
- package/dist/vectordb/index.js.map +1 -0
- package/dist/web/api-routes.d.ts +9 -0
- package/dist/web/api-routes.d.ts.map +1 -0
- package/dist/web/api-routes.js +127 -0
- package/dist/web/api-routes.js.map +1 -0
- package/dist/web/config-routes.d.ts +7 -0
- package/dist/web/config-routes.d.ts.map +1 -0
- package/dist/web/config-routes.js +54 -0
- package/dist/web/config-routes.js.map +1 -0
- package/dist/web/database-manager.d.ts +130 -0
- package/dist/web/database-manager.d.ts.map +1 -0
- package/dist/web/database-manager.js +382 -0
- package/dist/web/database-manager.js.map +1 -0
- package/dist/web/http-server.d.ts +28 -0
- package/dist/web/http-server.d.ts.map +1 -0
- package/dist/web/http-server.js +311 -0
- package/dist/web/http-server.js.map +1 -0
- package/dist/web/index.d.ts +3 -0
- package/dist/web/index.d.ts.map +1 -0
- package/dist/web/index.js +114 -0
- package/dist/web/index.js.map +1 -0
- package/dist/web/middleware/async-handler.d.ts +17 -0
- package/dist/web/middleware/async-handler.d.ts.map +1 -0
- package/dist/web/middleware/async-handler.js +26 -0
- package/dist/web/middleware/async-handler.js.map +1 -0
- package/dist/web/middleware/auth.d.ts +22 -0
- package/dist/web/middleware/auth.d.ts.map +1 -0
- package/dist/web/middleware/auth.js +81 -0
- package/dist/web/middleware/auth.js.map +1 -0
- package/dist/web/middleware/error-handler.d.ts +36 -0
- package/dist/web/middleware/error-handler.d.ts.map +1 -0
- package/dist/web/middleware/error-handler.js +68 -0
- package/dist/web/middleware/error-handler.js.map +1 -0
- package/dist/web/middleware/index.d.ts +6 -0
- package/dist/web/middleware/index.d.ts.map +1 -0
- package/dist/web/middleware/index.js +19 -0
- package/dist/web/middleware/index.js.map +1 -0
- package/dist/web/middleware/rate-limit.d.ts +38 -0
- package/dist/web/middleware/rate-limit.d.ts.map +1 -0
- package/dist/web/middleware/rate-limit.js +116 -0
- package/dist/web/middleware/rate-limit.js.map +1 -0
- package/dist/web/middleware/request-logger.d.ts +52 -0
- package/dist/web/middleware/request-logger.d.ts.map +1 -0
- package/dist/web/middleware/request-logger.js +74 -0
- package/dist/web/middleware/request-logger.js.map +1 -0
- package/dist/web/types.d.ts +6 -0
- package/dist/web/types.d.ts.map +1 -0
- package/dist/web/types.js +4 -0
- package/dist/web/types.js.map +1 -0
- package/package.json +135 -0
- package/skills/rag-vault/SKILL.md +111 -0
- package/skills/rag-vault/references/html-ingestion.md +73 -0
- package/skills/rag-vault/references/query-optimization.md +57 -0
- 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":"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"}
|
|
@@ -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 @@
|
|
|
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 @@
|
|
|
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
|
+
}
|