llm-trust-guard 4.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 +21 -0
- package/README.md +318 -0
- package/dist/guards/agent-communication-guard.d.ts +169 -0
- package/dist/guards/agent-communication-guard.d.ts.map +1 -0
- package/dist/guards/agent-communication-guard.js +468 -0
- package/dist/guards/agent-communication-guard.js.map +1 -0
- package/dist/guards/autonomy-escalation-guard.d.ts +137 -0
- package/dist/guards/autonomy-escalation-guard.d.ts.map +1 -0
- package/dist/guards/autonomy-escalation-guard.js +470 -0
- package/dist/guards/autonomy-escalation-guard.js.map +1 -0
- package/dist/guards/circuit-breaker.d.ts +142 -0
- package/dist/guards/circuit-breaker.d.ts.map +1 -0
- package/dist/guards/circuit-breaker.js +347 -0
- package/dist/guards/circuit-breaker.js.map +1 -0
- package/dist/guards/code-execution-guard.d.ts +114 -0
- package/dist/guards/code-execution-guard.d.ts.map +1 -0
- package/dist/guards/code-execution-guard.js +467 -0
- package/dist/guards/code-execution-guard.js.map +1 -0
- package/dist/guards/conversation-guard.d.ts +73 -0
- package/dist/guards/conversation-guard.d.ts.map +1 -0
- package/dist/guards/conversation-guard.js +281 -0
- package/dist/guards/conversation-guard.js.map +1 -0
- package/dist/guards/drift-detector.d.ts +182 -0
- package/dist/guards/drift-detector.d.ts.map +1 -0
- package/dist/guards/drift-detector.js +480 -0
- package/dist/guards/drift-detector.js.map +1 -0
- package/dist/guards/encoding-detector.d.ts +76 -0
- package/dist/guards/encoding-detector.d.ts.map +1 -0
- package/dist/guards/encoding-detector.js +698 -0
- package/dist/guards/encoding-detector.js.map +1 -0
- package/dist/guards/execution-monitor.d.ts +73 -0
- package/dist/guards/execution-monitor.d.ts.map +1 -0
- package/dist/guards/execution-monitor.js +205 -0
- package/dist/guards/execution-monitor.js.map +1 -0
- package/dist/guards/input-sanitizer.d.ts +87 -0
- package/dist/guards/input-sanitizer.d.ts.map +1 -0
- package/dist/guards/input-sanitizer.js +301 -0
- package/dist/guards/input-sanitizer.js.map +1 -0
- package/dist/guards/mcp-security-guard.d.ts +204 -0
- package/dist/guards/mcp-security-guard.d.ts.map +1 -0
- package/dist/guards/mcp-security-guard.js +618 -0
- package/dist/guards/mcp-security-guard.js.map +1 -0
- package/dist/guards/memory-guard.d.ts +124 -0
- package/dist/guards/memory-guard.d.ts.map +1 -0
- package/dist/guards/memory-guard.js +476 -0
- package/dist/guards/memory-guard.js.map +1 -0
- package/dist/guards/multimodal-guard.d.ts +93 -0
- package/dist/guards/multimodal-guard.d.ts.map +1 -0
- package/dist/guards/multimodal-guard.js +507 -0
- package/dist/guards/multimodal-guard.js.map +1 -0
- package/dist/guards/output-filter.d.ts +76 -0
- package/dist/guards/output-filter.d.ts.map +1 -0
- package/dist/guards/output-filter.js +289 -0
- package/dist/guards/output-filter.js.map +1 -0
- package/dist/guards/policy-gate.d.ts +57 -0
- package/dist/guards/policy-gate.d.ts.map +1 -0
- package/dist/guards/policy-gate.js +182 -0
- package/dist/guards/policy-gate.js.map +1 -0
- package/dist/guards/prompt-leakage-guard.d.ts +110 -0
- package/dist/guards/prompt-leakage-guard.d.ts.map +1 -0
- package/dist/guards/prompt-leakage-guard.js +529 -0
- package/dist/guards/prompt-leakage-guard.js.map +1 -0
- package/dist/guards/rag-guard.d.ts +188 -0
- package/dist/guards/rag-guard.d.ts.map +1 -0
- package/dist/guards/rag-guard.js +769 -0
- package/dist/guards/rag-guard.js.map +1 -0
- package/dist/guards/schema-validator.d.ts +35 -0
- package/dist/guards/schema-validator.d.ts.map +1 -0
- package/dist/guards/schema-validator.js +316 -0
- package/dist/guards/schema-validator.js.map +1 -0
- package/dist/guards/state-persistence-guard.d.ts +153 -0
- package/dist/guards/state-persistence-guard.d.ts.map +1 -0
- package/dist/guards/state-persistence-guard.js +484 -0
- package/dist/guards/state-persistence-guard.js.map +1 -0
- package/dist/guards/tenant-boundary.d.ts +67 -0
- package/dist/guards/tenant-boundary.d.ts.map +1 -0
- package/dist/guards/tenant-boundary.js +187 -0
- package/dist/guards/tenant-boundary.js.map +1 -0
- package/dist/guards/tool-chain-validator.d.ts +102 -0
- package/dist/guards/tool-chain-validator.d.ts.map +1 -0
- package/dist/guards/tool-chain-validator.js +480 -0
- package/dist/guards/tool-chain-validator.js.map +1 -0
- package/dist/guards/tool-registry.d.ts +45 -0
- package/dist/guards/tool-registry.d.ts.map +1 -0
- package/dist/guards/tool-registry.js +155 -0
- package/dist/guards/tool-registry.js.map +1 -0
- package/dist/guards/trust-exploitation-guard.d.ts +134 -0
- package/dist/guards/trust-exploitation-guard.d.ts.map +1 -0
- package/dist/guards/trust-exploitation-guard.js +354 -0
- package/dist/guards/trust-exploitation-guard.js.map +1 -0
- package/dist/index.d.ts +133 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +430 -0
- package/dist/index.js.map +1 -0
- package/dist/integrations/express.d.ts +119 -0
- package/dist/integrations/express.d.ts.map +1 -0
- package/dist/integrations/express.js +244 -0
- package/dist/integrations/express.js.map +1 -0
- package/dist/integrations/index.d.ts +9 -0
- package/dist/integrations/index.d.ts.map +1 -0
- package/dist/integrations/index.js +26 -0
- package/dist/integrations/index.js.map +1 -0
- package/dist/integrations/langchain.d.ts +165 -0
- package/dist/integrations/langchain.d.ts.map +1 -0
- package/dist/integrations/langchain.js +308 -0
- package/dist/integrations/langchain.js.map +1 -0
- package/dist/integrations/openai.d.ts +205 -0
- package/dist/integrations/openai.d.ts.map +1 -0
- package/dist/integrations/openai.js +380 -0
- package/dist/integrations/openai.js.map +1 -0
- package/dist/types/index.d.ts +245 -0
- package/dist/types/index.d.ts.map +1 -0
- package/dist/types/index.js +6 -0
- package/dist/types/index.js.map +1 -0
- package/package.json +64 -0
|
@@ -0,0 +1,119 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Express Middleware Integration for llm-trust-guard
|
|
3
|
+
*
|
|
4
|
+
* Provides ready-to-use middleware for Express.js applications
|
|
5
|
+
* to protect LLM-powered endpoints.
|
|
6
|
+
*/
|
|
7
|
+
import { InputSanitizer, EncodingDetector, MemoryGuard } from "../index.js";
|
|
8
|
+
import type { PAPSanitizerResult } from "../guards/input-sanitizer.js";
|
|
9
|
+
import type { EncodingDetectorResult } from "../guards/encoding-detector.js";
|
|
10
|
+
import type { MemoryGuardResult } from "../guards/memory-guard.js";
|
|
11
|
+
interface Request {
|
|
12
|
+
body?: any;
|
|
13
|
+
query?: any;
|
|
14
|
+
params?: any;
|
|
15
|
+
headers?: any;
|
|
16
|
+
session?: any;
|
|
17
|
+
get?(name: string): string | undefined;
|
|
18
|
+
}
|
|
19
|
+
interface Response {
|
|
20
|
+
status(code: number): Response;
|
|
21
|
+
json(body: any): Response;
|
|
22
|
+
}
|
|
23
|
+
type NextFunction = (err?: any) => void;
|
|
24
|
+
export interface TrustGuardMiddlewareConfig {
|
|
25
|
+
/** Fields to check in request body */
|
|
26
|
+
bodyFields?: string[];
|
|
27
|
+
/** Fields to check in query params */
|
|
28
|
+
queryFields?: string[];
|
|
29
|
+
/** Enable input sanitization */
|
|
30
|
+
sanitize?: boolean;
|
|
31
|
+
/** Enable encoding detection */
|
|
32
|
+
detectEncoding?: boolean;
|
|
33
|
+
/** Enable memory/context validation */
|
|
34
|
+
validateMemory?: boolean;
|
|
35
|
+
/** Custom error handler */
|
|
36
|
+
onBlocked?: (req: Request, res: Response, result: ExpressGuardResult) => void;
|
|
37
|
+
/** Custom logging function */
|
|
38
|
+
logger?: (message: string, data?: any) => void;
|
|
39
|
+
/** InputSanitizer configuration */
|
|
40
|
+
sanitizerConfig?: ConstructorParameters<typeof InputSanitizer>[0];
|
|
41
|
+
/** EncodingDetector configuration */
|
|
42
|
+
encodingConfig?: ConstructorParameters<typeof EncodingDetector>[0];
|
|
43
|
+
/** MemoryGuard configuration */
|
|
44
|
+
memoryConfig?: ConstructorParameters<typeof MemoryGuard>[0];
|
|
45
|
+
/** Session ID extractor */
|
|
46
|
+
getSessionId?: (req: Request) => string;
|
|
47
|
+
}
|
|
48
|
+
export interface ExpressGuardResult {
|
|
49
|
+
allowed: boolean;
|
|
50
|
+
guard: string;
|
|
51
|
+
violations: string[];
|
|
52
|
+
details?: PAPSanitizerResult | EncodingDetectorResult | MemoryGuardResult;
|
|
53
|
+
}
|
|
54
|
+
/**
|
|
55
|
+
* Create Express middleware for LLM input protection
|
|
56
|
+
*
|
|
57
|
+
* @example
|
|
58
|
+
* ```typescript
|
|
59
|
+
* import express from 'express';
|
|
60
|
+
* import { createTrustGuardMiddleware } from 'llm-trust-guard/integrations/express';
|
|
61
|
+
*
|
|
62
|
+
* const app = express();
|
|
63
|
+
* app.use(express.json());
|
|
64
|
+
*
|
|
65
|
+
* // Protect all LLM endpoints
|
|
66
|
+
* app.use('/api/chat', createTrustGuardMiddleware({
|
|
67
|
+
* bodyFields: ['message', 'prompt'],
|
|
68
|
+
* sanitize: true,
|
|
69
|
+
* detectEncoding: true
|
|
70
|
+
* }));
|
|
71
|
+
*
|
|
72
|
+
* app.post('/api/chat', (req, res) => {
|
|
73
|
+
* // req.body.message is now validated
|
|
74
|
+
* res.json({ response: 'Safe response' });
|
|
75
|
+
* });
|
|
76
|
+
* ```
|
|
77
|
+
*/
|
|
78
|
+
export declare function createTrustGuardMiddleware(config?: TrustGuardMiddlewareConfig): (req: Request, res: Response, next: NextFunction) => void | Response;
|
|
79
|
+
/**
|
|
80
|
+
* Create middleware for rate-limiting sensitive tool usage
|
|
81
|
+
*
|
|
82
|
+
* @example
|
|
83
|
+
* ```typescript
|
|
84
|
+
* app.use('/api/tools', createToolRateLimitMiddleware({
|
|
85
|
+
* sensitiveTools: ['delete', 'admin', 'execute'],
|
|
86
|
+
* maxSensitivePerSession: 5,
|
|
87
|
+
* windowMs: 60000
|
|
88
|
+
* }));
|
|
89
|
+
* ```
|
|
90
|
+
*/
|
|
91
|
+
export declare function createToolRateLimitMiddleware(config: {
|
|
92
|
+
sensitiveTools: string[];
|
|
93
|
+
maxSensitivePerSession?: number;
|
|
94
|
+
windowMs?: number;
|
|
95
|
+
getSessionId?: (req: Request) => string;
|
|
96
|
+
getToolName?: (req: Request) => string | undefined;
|
|
97
|
+
}): (req: Request, res: Response, next: NextFunction) => Response | undefined;
|
|
98
|
+
/**
|
|
99
|
+
* Create middleware for output filtering
|
|
100
|
+
*
|
|
101
|
+
* @example
|
|
102
|
+
* ```typescript
|
|
103
|
+
* app.use(createOutputFilterMiddleware({
|
|
104
|
+
* patterns: [
|
|
105
|
+
* /api[_-]?key/i,
|
|
106
|
+
* /password/i,
|
|
107
|
+
* /\b[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\.[A-Z|a-z]{2,}\b/
|
|
108
|
+
* ],
|
|
109
|
+
* replacement: '[REDACTED]'
|
|
110
|
+
* }));
|
|
111
|
+
* ```
|
|
112
|
+
*/
|
|
113
|
+
export declare function createOutputFilterMiddleware(config: {
|
|
114
|
+
patterns: RegExp[];
|
|
115
|
+
replacement?: string;
|
|
116
|
+
fields?: string[];
|
|
117
|
+
}): (req: Request, res: Response, next: NextFunction) => void;
|
|
118
|
+
export {};
|
|
119
|
+
//# sourceMappingURL=express.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"express.d.ts","sourceRoot":"","sources":["../../src/integrations/express.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,244 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Express Middleware Integration for llm-trust-guard
|
|
4
|
+
*
|
|
5
|
+
* Provides ready-to-use middleware for Express.js applications
|
|
6
|
+
* to protect LLM-powered endpoints.
|
|
7
|
+
*/
|
|
8
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
9
|
+
exports.createTrustGuardMiddleware = createTrustGuardMiddleware;
|
|
10
|
+
exports.createToolRateLimitMiddleware = createToolRateLimitMiddleware;
|
|
11
|
+
exports.createOutputFilterMiddleware = createOutputFilterMiddleware;
|
|
12
|
+
const index_js_1 = require("../index.js");
|
|
13
|
+
/**
|
|
14
|
+
* Create Express middleware for LLM input protection
|
|
15
|
+
*
|
|
16
|
+
* @example
|
|
17
|
+
* ```typescript
|
|
18
|
+
* import express from 'express';
|
|
19
|
+
* import { createTrustGuardMiddleware } from 'llm-trust-guard/integrations/express';
|
|
20
|
+
*
|
|
21
|
+
* const app = express();
|
|
22
|
+
* app.use(express.json());
|
|
23
|
+
*
|
|
24
|
+
* // Protect all LLM endpoints
|
|
25
|
+
* app.use('/api/chat', createTrustGuardMiddleware({
|
|
26
|
+
* bodyFields: ['message', 'prompt'],
|
|
27
|
+
* sanitize: true,
|
|
28
|
+
* detectEncoding: true
|
|
29
|
+
* }));
|
|
30
|
+
*
|
|
31
|
+
* app.post('/api/chat', (req, res) => {
|
|
32
|
+
* // req.body.message is now validated
|
|
33
|
+
* res.json({ response: 'Safe response' });
|
|
34
|
+
* });
|
|
35
|
+
* ```
|
|
36
|
+
*/
|
|
37
|
+
function createTrustGuardMiddleware(config = {}) {
|
|
38
|
+
const { bodyFields = ["message", "prompt", "input", "query", "content"], queryFields = [], sanitize = true, detectEncoding = true, validateMemory = false, onBlocked, logger = console.log, sanitizerConfig, encodingConfig, memoryConfig, getSessionId = (req) => req.session?.id || req.get?.("x-session-id") || "anonymous", } = config;
|
|
39
|
+
// Initialize guards
|
|
40
|
+
const inputSanitizer = sanitize ? new index_js_1.InputSanitizer(sanitizerConfig) : null;
|
|
41
|
+
const encodingDetector = detectEncoding ? new index_js_1.EncodingDetector(encodingConfig) : null;
|
|
42
|
+
const memoryGuard = validateMemory ? new index_js_1.MemoryGuard(memoryConfig) : null;
|
|
43
|
+
return function trustGuardMiddleware(req, res, next) {
|
|
44
|
+
const requestId = `req-${Date.now()}-${Math.random().toString(36).substr(2, 9)}`;
|
|
45
|
+
const sessionId = getSessionId(req);
|
|
46
|
+
// Collect all text fields to check
|
|
47
|
+
const textsToCheck = [];
|
|
48
|
+
// Check body fields
|
|
49
|
+
if (req.body) {
|
|
50
|
+
for (const field of bodyFields) {
|
|
51
|
+
const value = req.body[field];
|
|
52
|
+
if (typeof value === "string" && value.trim()) {
|
|
53
|
+
textsToCheck.push({ field, value, source: "body" });
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
// Check query fields
|
|
58
|
+
if (req.query) {
|
|
59
|
+
for (const field of queryFields) {
|
|
60
|
+
const value = req.query[field];
|
|
61
|
+
if (typeof value === "string" && value.trim()) {
|
|
62
|
+
textsToCheck.push({ field, value, source: "query" });
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
// Check each text field
|
|
67
|
+
for (const { field, value, source } of textsToCheck) {
|
|
68
|
+
// Input sanitization
|
|
69
|
+
if (inputSanitizer) {
|
|
70
|
+
const sanitizeResult = inputSanitizer.sanitize(value, requestId);
|
|
71
|
+
if (!sanitizeResult.allowed) {
|
|
72
|
+
const result = {
|
|
73
|
+
allowed: false,
|
|
74
|
+
guard: "InputSanitizer",
|
|
75
|
+
violations: sanitizeResult.violations,
|
|
76
|
+
details: sanitizeResult,
|
|
77
|
+
};
|
|
78
|
+
logger(`[TrustGuard] Blocked by InputSanitizer: ${source}.${field}`, {
|
|
79
|
+
requestId,
|
|
80
|
+
violations: sanitizeResult.violations,
|
|
81
|
+
});
|
|
82
|
+
if (onBlocked) {
|
|
83
|
+
return onBlocked(req, res, result);
|
|
84
|
+
}
|
|
85
|
+
return res.status(400).json({
|
|
86
|
+
error: "Request blocked by security policy",
|
|
87
|
+
code: "INPUT_SANITIZATION_FAILED",
|
|
88
|
+
field: `${source}.${field}`,
|
|
89
|
+
violations: sanitizeResult.violations,
|
|
90
|
+
});
|
|
91
|
+
}
|
|
92
|
+
}
|
|
93
|
+
// Encoding detection
|
|
94
|
+
if (encodingDetector) {
|
|
95
|
+
const encodingResult = encodingDetector.detect(value, requestId);
|
|
96
|
+
if (!encodingResult.allowed) {
|
|
97
|
+
const result = {
|
|
98
|
+
allowed: false,
|
|
99
|
+
guard: "EncodingDetector",
|
|
100
|
+
violations: encodingResult.violations,
|
|
101
|
+
details: encodingResult,
|
|
102
|
+
};
|
|
103
|
+
logger(`[TrustGuard] Blocked by EncodingDetector: ${source}.${field}`, {
|
|
104
|
+
requestId,
|
|
105
|
+
violations: encodingResult.violations,
|
|
106
|
+
});
|
|
107
|
+
if (onBlocked) {
|
|
108
|
+
return onBlocked(req, res, result);
|
|
109
|
+
}
|
|
110
|
+
return res.status(400).json({
|
|
111
|
+
error: "Request blocked by security policy",
|
|
112
|
+
code: "ENCODING_ATTACK_DETECTED",
|
|
113
|
+
field: `${source}.${field}`,
|
|
114
|
+
violations: encodingResult.violations,
|
|
115
|
+
});
|
|
116
|
+
}
|
|
117
|
+
}
|
|
118
|
+
// Memory/context validation
|
|
119
|
+
if (memoryGuard) {
|
|
120
|
+
const memoryResult = memoryGuard.validateContextInjection(value, sessionId, requestId);
|
|
121
|
+
if (!memoryResult.allowed) {
|
|
122
|
+
const result = {
|
|
123
|
+
allowed: false,
|
|
124
|
+
guard: "MemoryGuard",
|
|
125
|
+
violations: memoryResult.violations,
|
|
126
|
+
details: memoryResult,
|
|
127
|
+
};
|
|
128
|
+
logger(`[TrustGuard] Blocked by MemoryGuard: ${source}.${field}`, {
|
|
129
|
+
requestId,
|
|
130
|
+
violations: memoryResult.violations,
|
|
131
|
+
});
|
|
132
|
+
if (onBlocked) {
|
|
133
|
+
return onBlocked(req, res, result);
|
|
134
|
+
}
|
|
135
|
+
return res.status(400).json({
|
|
136
|
+
error: "Request blocked by security policy",
|
|
137
|
+
code: "CONTEXT_INJECTION_DETECTED",
|
|
138
|
+
field: `${source}.${field}`,
|
|
139
|
+
violations: memoryResult.violations,
|
|
140
|
+
});
|
|
141
|
+
}
|
|
142
|
+
}
|
|
143
|
+
}
|
|
144
|
+
// All checks passed
|
|
145
|
+
next();
|
|
146
|
+
};
|
|
147
|
+
}
|
|
148
|
+
/**
|
|
149
|
+
* Create middleware for rate-limiting sensitive tool usage
|
|
150
|
+
*
|
|
151
|
+
* @example
|
|
152
|
+
* ```typescript
|
|
153
|
+
* app.use('/api/tools', createToolRateLimitMiddleware({
|
|
154
|
+
* sensitiveTools: ['delete', 'admin', 'execute'],
|
|
155
|
+
* maxSensitivePerSession: 5,
|
|
156
|
+
* windowMs: 60000
|
|
157
|
+
* }));
|
|
158
|
+
* ```
|
|
159
|
+
*/
|
|
160
|
+
function createToolRateLimitMiddleware(config) {
|
|
161
|
+
const { sensitiveTools, maxSensitivePerSession = 10, windowMs = 60000, getSessionId = (req) => req.session?.id || "anonymous", getToolName = (req) => req.body?.tool || req.body?.toolName, } = config;
|
|
162
|
+
// Session usage tracking
|
|
163
|
+
const sessionUsage = new Map();
|
|
164
|
+
return function toolRateLimitMiddleware(req, res, next) {
|
|
165
|
+
const sessionId = getSessionId(req);
|
|
166
|
+
const toolName = getToolName(req);
|
|
167
|
+
// Check if this is a sensitive tool
|
|
168
|
+
if (toolName && sensitiveTools.some((t) => toolName.toLowerCase().includes(t.toLowerCase()))) {
|
|
169
|
+
const now = Date.now();
|
|
170
|
+
let usage = sessionUsage.get(sessionId);
|
|
171
|
+
// Reset if window expired
|
|
172
|
+
if (!usage || now > usage.resetAt) {
|
|
173
|
+
usage = { count: 0, resetAt: now + windowMs };
|
|
174
|
+
sessionUsage.set(sessionId, usage);
|
|
175
|
+
}
|
|
176
|
+
// Check limit
|
|
177
|
+
if (usage.count >= maxSensitivePerSession) {
|
|
178
|
+
return res.status(429).json({
|
|
179
|
+
error: "Rate limit exceeded for sensitive tool usage",
|
|
180
|
+
code: "TOOL_RATE_LIMIT_EXCEEDED",
|
|
181
|
+
retryAfter: Math.ceil((usage.resetAt - now) / 1000),
|
|
182
|
+
});
|
|
183
|
+
}
|
|
184
|
+
// Increment counter
|
|
185
|
+
usage.count++;
|
|
186
|
+
}
|
|
187
|
+
next();
|
|
188
|
+
};
|
|
189
|
+
}
|
|
190
|
+
/**
|
|
191
|
+
* Create middleware for output filtering
|
|
192
|
+
*
|
|
193
|
+
* @example
|
|
194
|
+
* ```typescript
|
|
195
|
+
* app.use(createOutputFilterMiddleware({
|
|
196
|
+
* patterns: [
|
|
197
|
+
* /api[_-]?key/i,
|
|
198
|
+
* /password/i,
|
|
199
|
+
* /\b[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\.[A-Z|a-z]{2,}\b/
|
|
200
|
+
* ],
|
|
201
|
+
* replacement: '[REDACTED]'
|
|
202
|
+
* }));
|
|
203
|
+
* ```
|
|
204
|
+
*/
|
|
205
|
+
function createOutputFilterMiddleware(config) {
|
|
206
|
+
const { patterns, replacement = "[REDACTED]", fields = ["response", "message", "content", "text"] } = config;
|
|
207
|
+
return function outputFilterMiddleware(req, res, next) {
|
|
208
|
+
const originalJson = res.json.bind(res);
|
|
209
|
+
res.json = function (body) {
|
|
210
|
+
if (body && typeof body === "object") {
|
|
211
|
+
const filtered = filterObject(body, fields, patterns, replacement);
|
|
212
|
+
return originalJson(filtered);
|
|
213
|
+
}
|
|
214
|
+
return originalJson(body);
|
|
215
|
+
};
|
|
216
|
+
next();
|
|
217
|
+
};
|
|
218
|
+
}
|
|
219
|
+
function filterObject(obj, fields, patterns, replacement) {
|
|
220
|
+
if (Array.isArray(obj)) {
|
|
221
|
+
return obj.map((item) => filterObject(item, fields, patterns, replacement));
|
|
222
|
+
}
|
|
223
|
+
if (obj && typeof obj === "object") {
|
|
224
|
+
const result = {};
|
|
225
|
+
for (const [key, value] of Object.entries(obj)) {
|
|
226
|
+
if (fields.includes(key) && typeof value === "string") {
|
|
227
|
+
let filtered = value;
|
|
228
|
+
for (const pattern of patterns) {
|
|
229
|
+
filtered = filtered.replace(new RegExp(pattern, "g"), replacement);
|
|
230
|
+
}
|
|
231
|
+
result[key] = filtered;
|
|
232
|
+
}
|
|
233
|
+
else if (typeof value === "object") {
|
|
234
|
+
result[key] = filterObject(value, fields, patterns, replacement);
|
|
235
|
+
}
|
|
236
|
+
else {
|
|
237
|
+
result[key] = value;
|
|
238
|
+
}
|
|
239
|
+
}
|
|
240
|
+
return result;
|
|
241
|
+
}
|
|
242
|
+
return obj;
|
|
243
|
+
}
|
|
244
|
+
//# sourceMappingURL=express.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"express.js","sourceRoot":"","sources":["../../src/integrations/express.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Framework Integrations for llm-trust-guard
|
|
3
|
+
*
|
|
4
|
+
* Ready-to-use integrations for popular frameworks and libraries.
|
|
5
|
+
*/
|
|
6
|
+
export { createTrustGuardMiddleware, createToolRateLimitMiddleware, createOutputFilterMiddleware, type TrustGuardMiddlewareConfig, type ExpressGuardResult, } from "./express.js";
|
|
7
|
+
export { TrustGuardLangChain, TrustGuardViolationError, createInputValidator, createOutputFilter, type TrustGuardCallbackConfig, type SecurityCheckResult, } from "./langchain.js";
|
|
8
|
+
export { SecureOpenAI, OpenAISecurityError, createMessageValidator, wrapOpenAIClient, type SecureOpenAIConfig, type ValidationResult, type SecureMessage, } from "./openai.js";
|
|
9
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/integrations/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAGH,OAAO,EACL,0BAA0B,EAC1B,6BAA6B,EAC7B,4BAA4B,EAC5B,KAAK,0BAA0B,EAC/B,KAAK,kBAAkB,GACxB,MAAM,cAAc,CAAC;AAGtB,OAAO,EACL,mBAAmB,EACnB,wBAAwB,EACxB,oBAAoB,EACpB,kBAAkB,EAClB,KAAK,wBAAwB,EAC7B,KAAK,mBAAmB,GACzB,MAAM,gBAAgB,CAAC;AAGxB,OAAO,EACL,YAAY,EACZ,mBAAmB,EACnB,sBAAsB,EACtB,gBAAgB,EAChB,KAAK,kBAAkB,EACvB,KAAK,gBAAgB,EACrB,KAAK,aAAa,GACnB,MAAM,aAAa,CAAC"}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Framework Integrations for llm-trust-guard
|
|
4
|
+
*
|
|
5
|
+
* Ready-to-use integrations for popular frameworks and libraries.
|
|
6
|
+
*/
|
|
7
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
8
|
+
exports.wrapOpenAIClient = exports.createMessageValidator = exports.OpenAISecurityError = exports.SecureOpenAI = exports.createOutputFilter = exports.createInputValidator = exports.TrustGuardViolationError = exports.TrustGuardLangChain = exports.createOutputFilterMiddleware = exports.createToolRateLimitMiddleware = exports.createTrustGuardMiddleware = void 0;
|
|
9
|
+
// Express.js middleware
|
|
10
|
+
var express_js_1 = require("./express.js");
|
|
11
|
+
Object.defineProperty(exports, "createTrustGuardMiddleware", { enumerable: true, get: function () { return express_js_1.createTrustGuardMiddleware; } });
|
|
12
|
+
Object.defineProperty(exports, "createToolRateLimitMiddleware", { enumerable: true, get: function () { return express_js_1.createToolRateLimitMiddleware; } });
|
|
13
|
+
Object.defineProperty(exports, "createOutputFilterMiddleware", { enumerable: true, get: function () { return express_js_1.createOutputFilterMiddleware; } });
|
|
14
|
+
// LangChain integration
|
|
15
|
+
var langchain_js_1 = require("./langchain.js");
|
|
16
|
+
Object.defineProperty(exports, "TrustGuardLangChain", { enumerable: true, get: function () { return langchain_js_1.TrustGuardLangChain; } });
|
|
17
|
+
Object.defineProperty(exports, "TrustGuardViolationError", { enumerable: true, get: function () { return langchain_js_1.TrustGuardViolationError; } });
|
|
18
|
+
Object.defineProperty(exports, "createInputValidator", { enumerable: true, get: function () { return langchain_js_1.createInputValidator; } });
|
|
19
|
+
Object.defineProperty(exports, "createOutputFilter", { enumerable: true, get: function () { return langchain_js_1.createOutputFilter; } });
|
|
20
|
+
// OpenAI integration
|
|
21
|
+
var openai_js_1 = require("./openai.js");
|
|
22
|
+
Object.defineProperty(exports, "SecureOpenAI", { enumerable: true, get: function () { return openai_js_1.SecureOpenAI; } });
|
|
23
|
+
Object.defineProperty(exports, "OpenAISecurityError", { enumerable: true, get: function () { return openai_js_1.OpenAISecurityError; } });
|
|
24
|
+
Object.defineProperty(exports, "createMessageValidator", { enumerable: true, get: function () { return openai_js_1.createMessageValidator; } });
|
|
25
|
+
Object.defineProperty(exports, "wrapOpenAIClient", { enumerable: true, get: function () { return openai_js_1.wrapOpenAIClient; } });
|
|
26
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/integrations/index.ts"],"names":[],"mappings":";AAAA;;;;GAIG;;;AAEH,wBAAwB;AACxB,2CAMsB;AALpB,wHAAA,0BAA0B,OAAA;AAC1B,2HAAA,6BAA6B,OAAA;AAC7B,0HAAA,4BAA4B,OAAA;AAK9B,wBAAwB;AACxB,+CAOwB;AANtB,mHAAA,mBAAmB,OAAA;AACnB,wHAAA,wBAAwB,OAAA;AACxB,oHAAA,oBAAoB,OAAA;AACpB,kHAAA,kBAAkB,OAAA;AAKpB,qBAAqB;AACrB,yCAQqB;AAPnB,yGAAA,YAAY,OAAA;AACZ,gHAAA,mBAAmB,OAAA;AACnB,mHAAA,sBAAsB,OAAA;AACtB,6GAAA,gBAAgB,OAAA"}
|
|
@@ -0,0 +1,165 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* LangChain Integration for llm-trust-guard
|
|
3
|
+
*
|
|
4
|
+
* Provides callbacks, wrappers, and utilities for securing
|
|
5
|
+
* LangChain-based applications.
|
|
6
|
+
*/
|
|
7
|
+
import { InputSanitizer, OutputFilter } from "../index.js";
|
|
8
|
+
import type { PAPSanitizerResult } from "../guards/input-sanitizer.js";
|
|
9
|
+
export interface TrustGuardCallbackConfig {
|
|
10
|
+
/** Enable input validation */
|
|
11
|
+
validateInput?: boolean;
|
|
12
|
+
/** Enable output filtering */
|
|
13
|
+
filterOutput?: boolean;
|
|
14
|
+
/** Enable tool chain validation */
|
|
15
|
+
validateTools?: boolean;
|
|
16
|
+
/** Throw error on violation (otherwise just log) */
|
|
17
|
+
throwOnViolation?: boolean;
|
|
18
|
+
/** Custom violation handler */
|
|
19
|
+
onViolation?: (type: string, details: any) => void;
|
|
20
|
+
/** InputSanitizer configuration */
|
|
21
|
+
sanitizerConfig?: ConstructorParameters<typeof InputSanitizer>[0];
|
|
22
|
+
/** OutputFilter configuration */
|
|
23
|
+
outputConfig?: ConstructorParameters<typeof OutputFilter>[0];
|
|
24
|
+
}
|
|
25
|
+
/**
|
|
26
|
+
* Security result from guard checks
|
|
27
|
+
*/
|
|
28
|
+
export interface SecurityCheckResult {
|
|
29
|
+
allowed: boolean;
|
|
30
|
+
guard: string;
|
|
31
|
+
violations: string[];
|
|
32
|
+
sanitizedInput?: string;
|
|
33
|
+
details?: any;
|
|
34
|
+
}
|
|
35
|
+
/**
|
|
36
|
+
* TrustGuard wrapper for LangChain
|
|
37
|
+
*
|
|
38
|
+
* @example
|
|
39
|
+
* ```typescript
|
|
40
|
+
* import { ChatOpenAI } from '@langchain/openai';
|
|
41
|
+
* import { TrustGuardLangChain } from 'llm-trust-guard/integrations/langchain';
|
|
42
|
+
*
|
|
43
|
+
* const guard = new TrustGuardLangChain({
|
|
44
|
+
* validateInput: true,
|
|
45
|
+
* filterOutput: true,
|
|
46
|
+
* throwOnViolation: true
|
|
47
|
+
* });
|
|
48
|
+
*
|
|
49
|
+
* // Validate before sending to LLM
|
|
50
|
+
* const result = guard.validateInput(userMessage);
|
|
51
|
+
* if (!result.allowed) {
|
|
52
|
+
* throw new Error(`Blocked: ${result.violations.join(', ')}`);
|
|
53
|
+
* }
|
|
54
|
+
*
|
|
55
|
+
* // Use with LangChain
|
|
56
|
+
* const llm = new ChatOpenAI();
|
|
57
|
+
* const response = await llm.invoke(result.sanitizedInput || userMessage);
|
|
58
|
+
*
|
|
59
|
+
* // Filter output before returning to user
|
|
60
|
+
* const filtered = guard.filterOutput(response.content);
|
|
61
|
+
* ```
|
|
62
|
+
*/
|
|
63
|
+
export declare class TrustGuardLangChain {
|
|
64
|
+
private inputSanitizer;
|
|
65
|
+
private encodingDetector;
|
|
66
|
+
private memoryGuard;
|
|
67
|
+
private toolChainValidator;
|
|
68
|
+
private outputFilter;
|
|
69
|
+
private config;
|
|
70
|
+
constructor(config?: TrustGuardCallbackConfig);
|
|
71
|
+
/**
|
|
72
|
+
* Validate user input before sending to LLM
|
|
73
|
+
*/
|
|
74
|
+
validateInput(input: string, requestId?: string): SecurityCheckResult;
|
|
75
|
+
/**
|
|
76
|
+
* Validate context/memory before injection
|
|
77
|
+
*/
|
|
78
|
+
validateContext(context: string | string[], sessionId: string, requestId?: string): SecurityCheckResult;
|
|
79
|
+
/**
|
|
80
|
+
* Validate RAG documents before context injection
|
|
81
|
+
*/
|
|
82
|
+
validateDocuments(documents: Array<{
|
|
83
|
+
content: string;
|
|
84
|
+
metadata?: any;
|
|
85
|
+
}>, sessionId: string): SecurityCheckResult;
|
|
86
|
+
/**
|
|
87
|
+
* Validate tool calls before execution
|
|
88
|
+
*/
|
|
89
|
+
validateToolCall(toolName: string, toolArgs: Record<string, any>, sessionId: string): SecurityCheckResult;
|
|
90
|
+
/**
|
|
91
|
+
* Filter LLM output before returning to user
|
|
92
|
+
*/
|
|
93
|
+
filterOutput(output: string, requestId?: string): string;
|
|
94
|
+
/**
|
|
95
|
+
* Create a secure message processor
|
|
96
|
+
*/
|
|
97
|
+
createSecureProcessor(sessionId: string): {
|
|
98
|
+
/**
|
|
99
|
+
* Process user message with full validation
|
|
100
|
+
*/
|
|
101
|
+
processUserMessage: (message: string) => {
|
|
102
|
+
allowed: boolean;
|
|
103
|
+
message: string;
|
|
104
|
+
violations: string[];
|
|
105
|
+
};
|
|
106
|
+
/**
|
|
107
|
+
* Process context/RAG content
|
|
108
|
+
*/
|
|
109
|
+
processContext: (context: string[]) => {
|
|
110
|
+
allowed: boolean;
|
|
111
|
+
violations: string[];
|
|
112
|
+
};
|
|
113
|
+
/**
|
|
114
|
+
* Process tool call
|
|
115
|
+
*/
|
|
116
|
+
processToolCall: (tool: string, args: any) => {
|
|
117
|
+
allowed: boolean;
|
|
118
|
+
violations: string[];
|
|
119
|
+
};
|
|
120
|
+
/**
|
|
121
|
+
* Process LLM output
|
|
122
|
+
*/
|
|
123
|
+
processOutput: (output: string) => string;
|
|
124
|
+
};
|
|
125
|
+
private handleViolation;
|
|
126
|
+
}
|
|
127
|
+
/**
|
|
128
|
+
* Error thrown when throwOnViolation is true
|
|
129
|
+
*/
|
|
130
|
+
export declare class TrustGuardViolationError extends Error {
|
|
131
|
+
type: string;
|
|
132
|
+
details: any;
|
|
133
|
+
constructor(type: string, details: any);
|
|
134
|
+
}
|
|
135
|
+
/**
|
|
136
|
+
* Create a simple input validator function for use with LangChain
|
|
137
|
+
*
|
|
138
|
+
* @example
|
|
139
|
+
* ```typescript
|
|
140
|
+
* const validateInput = createInputValidator();
|
|
141
|
+
*
|
|
142
|
+
* // In your chain
|
|
143
|
+
* const chain = RunnableSequence.from([
|
|
144
|
+
* new RunnableLambda({ func: (input) => {
|
|
145
|
+
* const result = validateInput(input.message);
|
|
146
|
+
* if (!result.allowed) throw new Error('Blocked');
|
|
147
|
+
* return { ...input, message: result.sanitized };
|
|
148
|
+
* }}),
|
|
149
|
+
* prompt,
|
|
150
|
+
* llm,
|
|
151
|
+
* outputParser
|
|
152
|
+
* ]);
|
|
153
|
+
* ```
|
|
154
|
+
*/
|
|
155
|
+
export declare function createInputValidator(config?: ConstructorParameters<typeof InputSanitizer>[0]): (input: string) => {
|
|
156
|
+
allowed: boolean;
|
|
157
|
+
sanitized: string;
|
|
158
|
+
violations: string[];
|
|
159
|
+
pap?: PAPSanitizerResult["pap"];
|
|
160
|
+
};
|
|
161
|
+
/**
|
|
162
|
+
* Create an output filter function for use with LangChain
|
|
163
|
+
*/
|
|
164
|
+
export declare function createOutputFilter(config?: ConstructorParameters<typeof OutputFilter>[0]): (output: string) => string;
|
|
165
|
+
//# sourceMappingURL=langchain.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"langchain.d.ts","sourceRoot":"","sources":["../../src/integrations/langchain.ts"],"names":[],"mappings":"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"}
|