mcp-rubber-duck 1.8.0 → 1.9.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/CHANGELOG.md +8 -0
- package/README.md +158 -1
- package/audit-ci.json +2 -1
- package/dist/config/config.d.ts +2 -0
- package/dist/config/config.d.ts.map +1 -1
- package/dist/config/config.js +144 -1
- package/dist/config/config.js.map +1 -1
- package/dist/config/types.d.ts +1084 -2
- package/dist/config/types.d.ts.map +1 -1
- package/dist/config/types.js +59 -0
- package/dist/config/types.js.map +1 -1
- package/dist/guardrails/context.d.ts +10 -0
- package/dist/guardrails/context.d.ts.map +1 -0
- package/dist/guardrails/context.js +35 -0
- package/dist/guardrails/context.js.map +1 -0
- package/dist/guardrails/errors.d.ts +26 -0
- package/dist/guardrails/errors.d.ts.map +1 -0
- package/dist/guardrails/errors.js +42 -0
- package/dist/guardrails/errors.js.map +1 -0
- package/dist/guardrails/index.d.ts +6 -0
- package/dist/guardrails/index.d.ts.map +1 -0
- package/dist/guardrails/index.js +11 -0
- package/dist/guardrails/index.js.map +1 -0
- package/dist/guardrails/plugins/base-plugin.d.ts +35 -0
- package/dist/guardrails/plugins/base-plugin.d.ts.map +1 -0
- package/dist/guardrails/plugins/base-plugin.js +70 -0
- package/dist/guardrails/plugins/base-plugin.js.map +1 -0
- package/dist/guardrails/plugins/index.d.ts +6 -0
- package/dist/guardrails/plugins/index.d.ts.map +1 -0
- package/dist/guardrails/plugins/index.js +6 -0
- package/dist/guardrails/plugins/index.js.map +1 -0
- package/dist/guardrails/plugins/pattern-blocker.d.ts +27 -0
- package/dist/guardrails/plugins/pattern-blocker.d.ts.map +1 -0
- package/dist/guardrails/plugins/pattern-blocker.js +140 -0
- package/dist/guardrails/plugins/pattern-blocker.js.map +1 -0
- package/dist/guardrails/plugins/pii-redactor/detectors.d.ts +40 -0
- package/dist/guardrails/plugins/pii-redactor/detectors.d.ts.map +1 -0
- package/dist/guardrails/plugins/pii-redactor/detectors.js +134 -0
- package/dist/guardrails/plugins/pii-redactor/detectors.js.map +1 -0
- package/dist/guardrails/plugins/pii-redactor/index.d.ts +28 -0
- package/dist/guardrails/plugins/pii-redactor/index.d.ts.map +1 -0
- package/dist/guardrails/plugins/pii-redactor/index.js +157 -0
- package/dist/guardrails/plugins/pii-redactor/index.js.map +1 -0
- package/dist/guardrails/plugins/pii-redactor/pseudonymizer.d.ts +33 -0
- package/dist/guardrails/plugins/pii-redactor/pseudonymizer.d.ts.map +1 -0
- package/dist/guardrails/plugins/pii-redactor/pseudonymizer.js +70 -0
- package/dist/guardrails/plugins/pii-redactor/pseudonymizer.js.map +1 -0
- package/dist/guardrails/plugins/rate-limiter.d.ts +28 -0
- package/dist/guardrails/plugins/rate-limiter.d.ts.map +1 -0
- package/dist/guardrails/plugins/rate-limiter.js +91 -0
- package/dist/guardrails/plugins/rate-limiter.js.map +1 -0
- package/dist/guardrails/plugins/token-limiter.d.ts +30 -0
- package/dist/guardrails/plugins/token-limiter.d.ts.map +1 -0
- package/dist/guardrails/plugins/token-limiter.js +98 -0
- package/dist/guardrails/plugins/token-limiter.js.map +1 -0
- package/dist/guardrails/service.d.ts +38 -0
- package/dist/guardrails/service.d.ts.map +1 -0
- package/dist/guardrails/service.js +183 -0
- package/dist/guardrails/service.js.map +1 -0
- package/dist/guardrails/types.d.ts +96 -0
- package/dist/guardrails/types.d.ts.map +1 -0
- package/dist/guardrails/types.js +2 -0
- package/dist/guardrails/types.js.map +1 -0
- package/dist/providers/duck-provider-enhanced.d.ts +2 -1
- package/dist/providers/duck-provider-enhanced.d.ts.map +1 -1
- package/dist/providers/duck-provider-enhanced.js +55 -6
- package/dist/providers/duck-provider-enhanced.js.map +1 -1
- package/dist/providers/enhanced-manager.d.ts +2 -1
- package/dist/providers/enhanced-manager.d.ts.map +1 -1
- package/dist/providers/enhanced-manager.js +3 -3
- package/dist/providers/enhanced-manager.js.map +1 -1
- package/dist/providers/manager.d.ts +3 -1
- package/dist/providers/manager.d.ts.map +1 -1
- package/dist/providers/manager.js +4 -2
- package/dist/providers/manager.js.map +1 -1
- package/dist/providers/provider.d.ts +3 -1
- package/dist/providers/provider.d.ts.map +1 -1
- package/dist/providers/provider.js +43 -3
- package/dist/providers/provider.js.map +1 -1
- package/dist/server.d.ts +1 -0
- package/dist/server.d.ts.map +1 -1
- package/dist/server.js +28 -6
- package/dist/server.js.map +1 -1
- package/dist/services/function-bridge.d.ts +3 -1
- package/dist/services/function-bridge.d.ts.map +1 -1
- package/dist/services/function-bridge.js +40 -1
- package/dist/services/function-bridge.js.map +1 -1
- package/package.json +1 -1
- package/src/config/config.ts +187 -1
- package/src/config/types.ts +73 -0
- package/src/guardrails/context.ts +37 -0
- package/src/guardrails/errors.ts +46 -0
- package/src/guardrails/index.ts +20 -0
- package/src/guardrails/plugins/base-plugin.ts +103 -0
- package/src/guardrails/plugins/index.ts +5 -0
- package/src/guardrails/plugins/pattern-blocker.ts +190 -0
- package/src/guardrails/plugins/pii-redactor/detectors.ts +200 -0
- package/src/guardrails/plugins/pii-redactor/index.ts +203 -0
- package/src/guardrails/plugins/pii-redactor/pseudonymizer.ts +91 -0
- package/src/guardrails/plugins/rate-limiter.ts +142 -0
- package/src/guardrails/plugins/token-limiter.ts +155 -0
- package/src/guardrails/service.ts +209 -0
- package/src/guardrails/types.ts +120 -0
- package/src/providers/duck-provider-enhanced.ts +76 -7
- package/src/providers/enhanced-manager.ts +5 -3
- package/src/providers/manager.ts +6 -3
- package/src/providers/provider.ts +57 -6
- package/src/server.ts +32 -6
- package/src/services/function-bridge.ts +53 -2
- package/tests/guardrails/config.test.ts +267 -0
- package/tests/guardrails/errors.test.ts +109 -0
- package/tests/guardrails/plugins/pattern-blocker.test.ts +309 -0
- package/tests/guardrails/plugins/pii-redactor.test.ts +1004 -0
- package/tests/guardrails/plugins/rate-limiter.test.ts +310 -0
- package/tests/guardrails/plugins/token-limiter.test.ts +216 -0
- package/tests/guardrails/service.test.ts +911 -0
- package/tests/mcp-bridge.test.ts +248 -0
- package/tests/providers.test.ts +739 -0
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import { logger } from '../utils/logger.js';
|
|
2
2
|
import Ajv from 'ajv';
|
|
3
|
+
import { GuardrailBlockError } from '../guardrails/errors.js';
|
|
3
4
|
export class FunctionBridge {
|
|
4
5
|
mcpManager;
|
|
5
6
|
approvalService;
|
|
@@ -8,13 +9,15 @@ export class FunctionBridge {
|
|
|
8
9
|
ajv;
|
|
9
10
|
toolSchemas = new Map();
|
|
10
11
|
approvalMode;
|
|
11
|
-
|
|
12
|
+
guardrailsService;
|
|
13
|
+
constructor(mcpManager, approvalService, trustedTools = [], approvalMode = 'always', trustedToolsByServer = {}, guardrailsService) {
|
|
12
14
|
this.mcpManager = mcpManager;
|
|
13
15
|
this.approvalService = approvalService;
|
|
14
16
|
this.trustedTools = new Set(trustedTools);
|
|
15
17
|
// eslint-disable-next-line @typescript-eslint/no-unsafe-assignment, @typescript-eslint/no-unsafe-call
|
|
16
18
|
this.ajv = new Ajv({ allErrors: true, removeAdditional: 'all' });
|
|
17
19
|
this.approvalMode = approvalMode;
|
|
20
|
+
this.guardrailsService = guardrailsService;
|
|
18
21
|
// Initialize per-server trusted tools
|
|
19
22
|
Object.entries(trustedToolsByServer).forEach(([serverName, tools]) => {
|
|
20
23
|
this.trustedToolsByServer.set(serverName, new Set(tools));
|
|
@@ -178,15 +181,51 @@ export class FunctionBridge {
|
|
|
178
181
|
};
|
|
179
182
|
}
|
|
180
183
|
}
|
|
184
|
+
// Create guardrail context if service is enabled
|
|
185
|
+
let guardrailContext;
|
|
186
|
+
if (this.guardrailsService?.isEnabled()) {
|
|
187
|
+
guardrailContext = this.guardrailsService.createContext({
|
|
188
|
+
toolName: `${mcpServer}:${mcpTool}`,
|
|
189
|
+
toolArgs: cleanArgs,
|
|
190
|
+
});
|
|
191
|
+
// Execute pre_tool_input guardrails
|
|
192
|
+
const preResult = await this.guardrailsService.execute('pre_tool_input', guardrailContext);
|
|
193
|
+
if (preResult.action === 'block') {
|
|
194
|
+
throw new GuardrailBlockError(preResult.blockedBy || 'unknown', preResult.blockReason || 'Tool input blocked by guardrails');
|
|
195
|
+
}
|
|
196
|
+
// Use potentially modified args (e.g., PII redaction)
|
|
197
|
+
if (preResult.action === 'modify' && guardrailContext.toolArgs) {
|
|
198
|
+
Object.assign(cleanArgs, guardrailContext.toolArgs);
|
|
199
|
+
}
|
|
200
|
+
}
|
|
181
201
|
// Execute the MCP tool
|
|
182
202
|
logger.info(`Executing MCP tool ${mcpServer}:${mcpTool} for ${duckName}`);
|
|
183
203
|
const result = await this.mcpManager.callTool(mcpServer, mcpTool, cleanArgs);
|
|
204
|
+
// Execute post_tool_output guardrails
|
|
205
|
+
if (guardrailContext && this.guardrailsService?.isEnabled()) {
|
|
206
|
+
guardrailContext.toolResult = result;
|
|
207
|
+
const postResult = await this.guardrailsService.execute('post_tool_output', guardrailContext);
|
|
208
|
+
if (postResult.action === 'block') {
|
|
209
|
+
throw new GuardrailBlockError(postResult.blockedBy || 'unknown', postResult.blockReason || 'Tool output blocked by guardrails');
|
|
210
|
+
}
|
|
211
|
+
// Return potentially modified result
|
|
212
|
+
if (postResult.action === 'modify') {
|
|
213
|
+
return {
|
|
214
|
+
success: true,
|
|
215
|
+
data: guardrailContext.toolResult,
|
|
216
|
+
};
|
|
217
|
+
}
|
|
218
|
+
}
|
|
184
219
|
return {
|
|
185
220
|
success: true,
|
|
186
221
|
data: result,
|
|
187
222
|
};
|
|
188
223
|
}
|
|
189
224
|
catch (error) {
|
|
225
|
+
// Re-throw GuardrailBlockError as-is
|
|
226
|
+
if (error instanceof GuardrailBlockError) {
|
|
227
|
+
throw error;
|
|
228
|
+
}
|
|
190
229
|
const errorMessage = error instanceof Error ? error.message : String(error);
|
|
191
230
|
logger.error(`Function call failed for ${functionName}:`, errorMessage);
|
|
192
231
|
return {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"function-bridge.js","sourceRoot":"","sources":["../../src/services/function-bridge.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"function-bridge.js","sourceRoot":"","sources":["../../src/services/function-bridge.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,MAAM,EAAE,MAAM,oBAAoB,CAAC;AAC5C,OAAO,GAAyB,MAAM,KAAK,CAAC;AAG5C,OAAO,EAAE,mBAAmB,EAAE,MAAM,yBAAyB,CAAC;AAiB9D,MAAM,OAAO,cAAc;IACjB,UAAU,CAAmB;IAC7B,eAAe,CAAkB;IACjC,YAAY,GAAgB,IAAI,GAAG,EAAE,CAAC;IACtC,oBAAoB,GAA6B,IAAI,GAAG,EAAE,CAAC;IAC3D,GAAG,CAAU;IACb,WAAW,GAAyC,IAAI,GAAG,EAAE,CAAC;IAC9D,YAAY,CAAiC;IAC7C,iBAAiB,CAAqB;IAE9C,YACE,UAA4B,EAC5B,eAAgC,EAChC,eAAyB,EAAE,EAC3B,eAA+C,QAAQ,EACvD,uBAAiD,EAAE,EACnD,iBAAqC;QAErC,IAAI,CAAC,UAAU,GAAG,UAAU,CAAC;QAC7B,IAAI,CAAC,eAAe,GAAG,eAAe,CAAC;QACvC,IAAI,CAAC,YAAY,GAAG,IAAI,GAAG,CAAC,YAAY,CAAC,CAAC;QAC1C,sGAAsG;QACtG,IAAI,CAAC,GAAG,GAAG,IAAK,GAAoD,CAAC,EAAE,SAAS,EAAE,IAAI,EAAE,gBAAgB,EAAE,KAAK,EAAE,CAAC,CAAC;QACnH,IAAI,CAAC,YAAY,GAAG,YAAY,CAAC;QACjC,IAAI,CAAC,iBAAiB,GAAG,iBAAiB,CAAC;QAE3C,sCAAsC;QACtC,MAAM,CAAC,OAAO,CAAC,oBAAoB,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,UAAU,EAAE,KAAK,CAAC,EAAE,EAAE;YACnE,IAAI,CAAC,oBAAoB,CAAC,GAAG,CAAC,UAAU,EAAE,IAAI,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC;QAC5D,CAAC,CAAC,CAAC;IACL,CAAC;IAED,KAAK,CAAC,sBAAsB;QAC1B,IAAI,CAAC;YACH,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,UAAU,CAAC,YAAY,EAAE,CAAC;YAEtD,MAAM,mBAAmB,GAAyB,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE;gBACpE,MAAM,WAAW,GAAG,IAAI,CAAC,wBAAwB,CAAC,IAAI,CAAC,CAAC;gBACxD,uCAAuC;gBACvC,MAAM,OAAO,GAAG,GAAG,IAAI,CAAC,UAAU,IAAI,IAAI,CAAC,IAAI,EAAE,CAAC;gBAClD,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,OAAO,EAAE,IAAI,CAAC,WAAW,CAAC,CAAC;gBAChD,OAAO,WAAW,CAAC;YACrB,CAAC,CAAC,CAAC;YAEH,MAAM,CAAC,KAAK,CAAC,aAAa,mBAAmB,CAAC,MAAM,sCAAsC,CAAC,CAAC;YAC5F,OAAO,mBAAmB,CAAC;QAE7B,CAAC;QAAC,OAAO,KAAc,EAAE,CAAC;YACxB,MAAM,YAAY,GAAG,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;YAC5E,MAAM,CAAC,KAAK,CAAC,0CAA0C,EAAE,YAAY,CAAC,CAAC;YACvE,OAAO,EAAE,CAAC;QACZ,CAAC;IACH,CAAC;IAEO,wBAAwB,CAAC,OAAgB;QAC/C,OAAO;YACL,IAAI,EAAE,QAAQ,OAAO,CAAC,UAAU,KAAK,OAAO,CAAC,IAAI,EAAE;YACnD,WAAW,EAAE,IAAI,OAAO,CAAC,UAAU,KAAK,OAAO,CAAC,WAAW,EAAE;YAC7D,UAAU,EAAE;gBACV,IAAI,EAAE,QAAQ;gBACd,UAAU,EAAE;oBACV,6CAA6C;oBAC7C,GAAG,CAAE,OAAO,CAAC,WAAwD,EAAE,UAAU,IAAI,EAAE,CAAC;oBAExF,8BAA8B;oBAC9B,WAAW,EAAE;wBACX,IAAI,EAAE,QAAQ;wBACd,WAAW,EAAE,2BAA2B;wBACxC,OAAO,EAAE,OAAO,CAAC,UAAU;qBAC5B;oBACD,SAAS,EAAE;wBACT,IAAI,EAAE,QAAQ;wBACd,WAAW,EAAE,yBAAyB;wBACtC,OAAO,EAAE,OAAO,CAAC,IAAI;qBACtB;oBACD,YAAY,EAAE;wBACZ,IAAI,EAAE,QAAQ;wBACd,WAAW,EAAE,uCAAuC;qBACrD;iBACF;gBACD,QAAQ,EAAE,CAAE,OAAO,CAAC,WAAuC,EAAE,QAAQ,IAAI,EAAE,CAAC;aAC7E;SACF,CAAC;IACJ,CAAC;IAEO,qBAAqB,CAAC,OAAe,EAAE,IAA6B;QAC1E,MAAM,MAAM,GAAG,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;QAC7C,IAAI,CAAC,MAAM,EAAE,CAAC;YACZ,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC,uCAAuC;QACjE,CAAC;QAED,IAAI,CAAC;YACH,kJAAkJ;YAClJ,MAAM,QAAQ,GAAsB,IAAI,CAAC,GAA0D,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;YACpH,MAAM,KAAK,GAAG,QAAQ,CAAC,IAAI,CAAC,CAAC;YAE7B,IAAI,CAAC,KAAK,IAAI,QAAQ,CAAC,MAAM,EAAE,CAAC;gBAC9B,MAAM,MAAM,GAAG,QAAQ,CAAC,MAAM,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CACvC,GAAG,GAAG,CAAC,YAAY,IAAI,MAAM,KAAK,GAAG,CAAC,OAAO,IAAI,kBAAkB,EAAE,CACtE,CAAC;gBACF,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC;YAClC,CAAC;YAED,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC;QACzB,CAAC;QAAC,OAAO,KAAc,EAAE,CAAC;YACxB,MAAM,YAAY,GAAG,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;YAC5E,MAAM,CAAC,IAAI,CAAC,iCAAiC,OAAO,GAAG,EAAE,YAAY,CAAC,CAAC;YACvE,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC,2BAA2B;QACrD,CAAC;IACH,CAAC;IAED,KAAK,CAAC,kBAAkB,CACtB,QAAgB,EAChB,YAAoB,EACpB,IAA6B;QAE7B,IAAI,CAAC;YACH,MAAM,CAAC,IAAI,CAAC,6CAA6C,QAAQ,OAAO,YAAY,EAAE,CAAC,CAAC;YACxF,MAAM,CAAC,KAAK,CAAC,kBAAkB,IAAI,CAAC,YAAY,eAAe,YAAY,EAAE,CAAC,CAAC;YAE/E,wCAAwC;YACxC,IAAI,CAAC,YAAY,CAAC,UAAU,CAAC,OAAO,CAAC,EAAE,CAAC;gBACtC,MAAM,CAAC,IAAI,CAAC,iCAAiC,YAAY,EAAE,CAAC,CAAC;gBAC7D,OAAO;oBACL,OAAO,EAAE,KAAK;oBACd,KAAK,EAAE,0BAA0B,YAAY,EAAE;iBAChD,CAAC;YACJ,CAAC;YAED,+DAA+D;YAC/D,MAAM,SAAS,GAAI,IAAI,CAAC,WAAsB,IAAI,IAAI,CAAC,6BAA6B,CAAC,YAAY,CAAC,CAAC;YACnG,MAAM,OAAO,GAAI,IAAI,CAAC,SAAoB,IAAI,IAAI,CAAC,2BAA2B,CAAC,YAAY,CAAC,CAAC;YAC7F,MAAM,UAAU,GAAG,IAAI,CAAC,YAAsB,CAAC;YAE/C,IAAI,CAAC,SAAS,IAAI,CAAC,OAAO,EAAE,CAAC;gBAC3B,OAAO;oBACL,OAAO,EAAE,KAAK;oBACd,KAAK,EAAE,sDAAsD,YAAY,EAAE;iBAC5E,CAAC;YACJ,CAAC;YAED,yCAAyC;YACzC,MAAM,SAAS,GAAG,EAAE,GAAG,IAAI,EAAE,CAAC;YAC9B,OAAO,SAAS,CAAC,WAAW,CAAC;YAC7B,OAAO,SAAS,CAAC,SAAS,CAAC;YAC3B,OAAO,SAAS,CAAC,YAAY,CAAC;YAE9B,yCAAyC;YACzC,MAAM,OAAO,GAAG,GAAG,SAAS,IAAI,OAAO,EAAE,CAAC;YAC1C,MAAM,UAAU,GAAG,IAAI,CAAC,qBAAqB,CAAC,OAAO,EAAE,SAAS,CAAC,CAAC;YAClE,IAAI,CAAC,UAAU,CAAC,KAAK,EAAE,CAAC;gBACtB,OAAO;oBACL,OAAO,EAAE,KAAK;oBACd,KAAK,EAAE,yBAAyB,OAAO,KAAK,UAAU,CAAC,MAAM,EAAE,IAAI,CAAC,IAAI,CAAC,EAAE;iBAC5E,CAAC;YACJ,CAAC;YAED,qDAAqD;YACrD,IAAI,SAAS,GAAG,KAAK,CAAC;YAEtB,4CAA4C;YAC5C,MAAM,kBAAkB,GAAG,IAAI,CAAC,oBAAoB,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC;YACpE,IAAI,kBAAkB,EAAE,CAAC;gBACvB,SAAS,GAAG,kBAAkB,CAAC,GAAG,CAAC,GAAG,CAAC,IAAI,qCAAqC;oBACpE,kBAAkB,CAAC,GAAG,CAAC,OAAO,CAAC,IAAI,iBAAiB;oBACpD,kBAAkB,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,0BAA0B;gBACvE,MAAM,CAAC,KAAK,CAAC,mCAAmC,SAAS,KAAK,KAAK,CAAC,IAAI,CAAC,kBAAkB,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,iBAAiB,SAAS,EAAE,CAAC,CAAC;YACvI,CAAC;iBAAM,CAAC;gBACN,oCAAoC;gBACpC,SAAS,GAAG,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,OAAO,CAAC,IAAI,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;gBAC7E,MAAM,CAAC,KAAK,CAAC,mCAAmC,SAAS,EAAE,CAAC,CAAC;YAC/D,CAAC;YAED,MAAM,2BAA2B,GAAG,IAAI,CAAC,eAAe,CAAC,wBAAwB,CAAC,QAAQ,EAAE,SAAS,EAAE,OAAO,CAAC,CAAC;YAChH,IAAI,aAAa,GAAG,KAAK,CAAC;YAE1B,MAAM,CAAC,KAAK,CAAC,0BAA0B,IAAI,CAAC,YAAY,cAAc,SAAS,sBAAsB,2BAA2B,cAAc,OAAO,aAAa,SAAS,iBAAiB,UAAU,EAAE,CAAC,CAAC;YAE1M,IAAI,IAAI,CAAC,YAAY,KAAK,QAAQ,EAAE,CAAC;gBACnC,0EAA0E;gBAC1E,aAAa,GAAG,CAAC,UAAU,IAAI,CAAC,2BAA2B,CAAC;gBAC5D,MAAM,CAAC,KAAK,CAAC,gCAAgC,aAAa,EAAE,CAAC,CAAC;YAChE,CAAC;iBAAM,IAAI,IAAI,CAAC,YAAY,KAAK,SAAS,EAAE,CAAC;gBAC3C,0EAA0E;gBAC1E,aAAa,GAAG,CAAC,SAAS,IAAI,CAAC,UAAU,IAAI,CAAC,2BAA2B,CAAC;gBAC1E,MAAM,CAAC,KAAK,CAAC,iCAAiC,aAAa,EAAE,CAAC,CAAC;YACjE,CAAC;iBAAM,IAAI,IAAI,CAAC,YAAY,KAAK,OAAO,EAAE,CAAC;gBACzC,yBAAyB;gBACzB,aAAa,GAAG,KAAK,CAAC;gBACtB,MAAM,CAAC,KAAK,CAAC,+BAA+B,aAAa,EAAE,CAAC,CAAC;YAC/D,CAAC;YAED,IAAI,aAAa,EAAE,CAAC;gBAClB,0BAA0B;gBAC1B,MAAM,OAAO,GAAG,IAAI,CAAC,eAAe,CAAC,qBAAqB,CACxD,QAAQ,EACR,SAAS,EACT,OAAO,EACP,SAAS,CACV,CAAC;gBAEF,OAAO;oBACL,OAAO,EAAE,KAAK;oBACd,aAAa,EAAE,IAAI;oBACnB,UAAU,EAAE,OAAO,CAAC,EAAE;oBACtB,OAAO,EAAE,0BAA0B,QAAQ,YAAY,SAAS,IAAI,OAAO,iBAAiB,OAAO,CAAC,EAAE,EAAE;iBACzG,CAAC;YACJ,CAAC;YAED,8DAA8D;YAC9D,IAAI,UAAU,IAAI,IAAI,CAAC,YAAY,KAAK,OAAO,EAAE,CAAC;gBAChD,MAAM,cAAc,GAAG,IAAI,CAAC,eAAe,CAAC,iBAAiB,CAAC,UAAU,CAAC,CAAC;gBAE1E,IAAI,cAAc,KAAK,UAAU,EAAE,CAAC;oBAClC,OAAO;wBACL,OAAO,EAAE,KAAK;wBACd,KAAK,EAAE,4CAA4C,cAAc,GAAG;qBACrE,CAAC;gBACJ,CAAC;YACH,CAAC;YAED,iDAAiD;YACjD,IAAI,gBAA8C,CAAC;YACnD,IAAI,IAAI,CAAC,iBAAiB,EAAE,SAAS,EAAE,EAAE,CAAC;gBACxC,gBAAgB,GAAG,IAAI,CAAC,iBAAiB,CAAC,aAAa,CAAC;oBACtD,QAAQ,EAAE,GAAG,SAAS,IAAI,OAAO,EAAE;oBACnC,QAAQ,EAAE,SAAS;iBACpB,CAAC,CAAC;gBAEH,oCAAoC;gBACpC,MAAM,SAAS,GAAG,MAAM,IAAI,CAAC,iBAAiB,CAAC,OAAO,CAAC,gBAAgB,EAAE,gBAAgB,CAAC,CAAC;gBAC3F,IAAI,SAAS,CAAC,MAAM,KAAK,OAAO,EAAE,CAAC;oBACjC,MAAM,IAAI,mBAAmB,CAC3B,SAAS,CAAC,SAAS,IAAI,SAAS,EAChC,SAAS,CAAC,WAAW,IAAI,kCAAkC,CAC5D,CAAC;gBACJ,CAAC;gBACD,sDAAsD;gBACtD,IAAI,SAAS,CAAC,MAAM,KAAK,QAAQ,IAAI,gBAAgB,CAAC,QAAQ,EAAE,CAAC;oBAC/D,MAAM,CAAC,MAAM,CAAC,SAAS,EAAE,gBAAgB,CAAC,QAAQ,CAAC,CAAC;gBACtD,CAAC;YACH,CAAC;YAED,uBAAuB;YACvB,MAAM,CAAC,IAAI,CAAC,sBAAsB,SAAS,IAAI,OAAO,QAAQ,QAAQ,EAAE,CAAC,CAAC;YAC1E,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,UAAU,CAAC,QAAQ,CAAC,SAAS,EAAE,OAAO,EAAE,SAAS,CAAC,CAAC;YAE7E,sCAAsC;YACtC,IAAI,gBAAgB,IAAI,IAAI,CAAC,iBAAiB,EAAE,SAAS,EAAE,EAAE,CAAC;gBAC5D,gBAAgB,CAAC,UAAU,GAAG,MAAM,CAAC;gBACrC,MAAM,UAAU,GAAG,MAAM,IAAI,CAAC,iBAAiB,CAAC,OAAO,CAAC,kBAAkB,EAAE,gBAAgB,CAAC,CAAC;gBAC9F,IAAI,UAAU,CAAC,MAAM,KAAK,OAAO,EAAE,CAAC;oBAClC,MAAM,IAAI,mBAAmB,CAC3B,UAAU,CAAC,SAAS,IAAI,SAAS,EACjC,UAAU,CAAC,WAAW,IAAI,mCAAmC,CAC9D,CAAC;gBACJ,CAAC;gBACD,qCAAqC;gBACrC,IAAI,UAAU,CAAC,MAAM,KAAK,QAAQ,EAAE,CAAC;oBACnC,OAAO;wBACL,OAAO,EAAE,IAAI;wBACb,IAAI,EAAE,gBAAgB,CAAC,UAAU;qBAClC,CAAC;gBACJ,CAAC;YACH,CAAC;YAED,OAAO;gBACL,OAAO,EAAE,IAAI;gBACb,IAAI,EAAE,MAAM;aACb,CAAC;QAEJ,CAAC;QAAC,OAAO,KAAc,EAAE,CAAC;YACxB,qCAAqC;YACrC,IAAI,KAAK,YAAY,mBAAmB,EAAE,CAAC;gBACzC,MAAM,KAAK,CAAC;YACd,CAAC;YACD,MAAM,YAAY,GAAG,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;YAC5E,MAAM,CAAC,KAAK,CAAC,4BAA4B,YAAY,GAAG,EAAE,YAAY,CAAC,CAAC;YACxE,OAAO;gBACL,OAAO,EAAE,KAAK;gBACd,KAAK,EAAE,8BAA8B,YAAY,EAAE;aACpD,CAAC;QACJ,CAAC;IACH,CAAC;IAEO,6BAA6B,CAAC,YAAoB;QACxD,8CAA8C;QAC9C,MAAM,KAAK,GAAG,YAAY,CAAC,KAAK,CAAC,4BAA4B,CAAC,CAAC;QAC/D,OAAO,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;IACjC,CAAC;IAEO,2BAA2B,CAAC,YAAoB;QACtD,8CAA8C;QAC9C,MAAM,KAAK,GAAG,YAAY,CAAC,KAAK,CAAC,+BAA+B,CAAC,CAAC;QAClE,OAAO,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;IACjC,CAAC;IAED,4CAA4C;IAC5C,KAAK,CAAC,eAAe,CAAC,UAAkB,EAAE,QAAgB;QACxD,IAAI,CAAC;YACH,MAAM,KAAK,GAAG,MAAM,IAAI,CAAC,UAAU,CAAC,eAAe,CAAC,UAAU,CAAC,CAAC;YAChE,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC,IAAI,KAAK,QAAQ,CAAC,CAAC;QACpD,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,OAAO,KAAK,CAAC;QACf,CAAC;IACH,CAAC;IAED,4CAA4C;IAC5C,KAAK,CAAC,yBAAyB;QAC7B,IAAI,CAAC;YACH,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,UAAU,CAAC,YAAY,EAAE,CAAC;YACtD,MAAM,aAAa,GAA8B,EAAE,CAAC;YAEpD,QAAQ,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE;gBACtB,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,UAAU,CAAC,EAAE,CAAC;oBACpC,aAAa,CAAC,IAAI,CAAC,UAAU,CAAC,GAAG,EAAE,CAAC;gBACtC,CAAC;gBACD,aAAa,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YAC5C,CAAC,CAAC,CAAC;YAEH,OAAO,aAAa,CAAC;QACvB,CAAC;QAAC,OAAO,KAAc,EAAE,CAAC;YACxB,MAAM,YAAY,GAAG,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;YAC5E,MAAM,CAAC,KAAK,CAAC,gCAAgC,EAAE,YAAY,CAAC,CAAC;YAC7D,OAAO,EAAE,CAAC;QACZ,CAAC;IACH,CAAC;IAED,4BAA4B;IAC5B,kBAAkB,CAAC,YAAsB,EAAE,oBAA+C;QACxF,IAAI,CAAC,YAAY,GAAG,IAAI,GAAG,CAAC,YAAY,CAAC,CAAC;QAC1C,MAAM,CAAC,IAAI,CAAC,sCAAsC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QAE9F,IAAI,oBAAoB,EAAE,CAAC;YACzB,IAAI,CAAC,oBAAoB,CAAC,KAAK,EAAE,CAAC;YAClC,MAAM,CAAC,OAAO,CAAC,oBAAoB,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,UAAU,EAAE,KAAK,CAAC,EAAE,EAAE;gBACnE,IAAI,CAAC,oBAAoB,CAAC,GAAG,CAAC,UAAU,EAAE,IAAI,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC;gBAC1D,MAAM,CAAC,IAAI,CAAC,oCAAoC,UAAU,KAAK,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;YACrF,CAAC,CAAC,CAAC;QACL,CAAC;IACH,CAAC;IAED,sCAAsC;IACtC,QAAQ;QAMN,OAAO;YACL,cAAc,EAAE,CAAC,EAAE,0CAA0C;YAC7D,WAAW,EAAE,IAAI,CAAC,UAAU,CAAC,mBAAmB,EAAE,CAAC,MAAM;YACzD,gBAAgB,EAAE,IAAI,CAAC,YAAY,CAAC,IAAI;YACxC,gBAAgB,EAAE,IAAI,CAAC,UAAU,CAAC,mBAAmB,EAAE;SACxD,CAAC;IACJ,CAAC;CACF"}
|
package/package.json
CHANGED
package/src/config/config.ts
CHANGED
|
@@ -1,7 +1,14 @@
|
|
|
1
1
|
import { readFileSync, existsSync } from 'fs';
|
|
2
2
|
import { join } from 'path';
|
|
3
3
|
import * as dotenv from 'dotenv';
|
|
4
|
-
import {
|
|
4
|
+
import {
|
|
5
|
+
Config,
|
|
6
|
+
ConfigSchema,
|
|
7
|
+
ProviderConfig,
|
|
8
|
+
MCPBridgeConfig,
|
|
9
|
+
MCPServerConfig,
|
|
10
|
+
GuardrailsConfig,
|
|
11
|
+
} from './types.js';
|
|
5
12
|
import { logger } from '../utils/logger.js';
|
|
6
13
|
|
|
7
14
|
dotenv.config();
|
|
@@ -98,6 +105,9 @@ export class ConfigManager {
|
|
|
98
105
|
// Apply MCP bridge configuration from environment
|
|
99
106
|
merged.mcp_bridge = this.getMCPBridgeConfig(merged.mcp_bridge as Partial<MCPBridgeConfig>);
|
|
100
107
|
|
|
108
|
+
// Apply guardrails configuration from environment
|
|
109
|
+
merged.guardrails = this.getGuardrailsConfig(merged.guardrails as Partial<GuardrailsConfig>);
|
|
110
|
+
|
|
101
111
|
return merged;
|
|
102
112
|
}
|
|
103
113
|
|
|
@@ -332,6 +342,182 @@ export class ConfigManager {
|
|
|
332
342
|
return servers;
|
|
333
343
|
}
|
|
334
344
|
|
|
345
|
+
private getGuardrailsConfig(
|
|
346
|
+
existingConfig: Partial<GuardrailsConfig> = {}
|
|
347
|
+
): Partial<GuardrailsConfig> | undefined {
|
|
348
|
+
// Don't override if guardrails is explicitly disabled
|
|
349
|
+
if (existingConfig?.enabled === false) {
|
|
350
|
+
return existingConfig;
|
|
351
|
+
}
|
|
352
|
+
|
|
353
|
+
const guardrailsConfig: Partial<GuardrailsConfig> = { ...existingConfig };
|
|
354
|
+
|
|
355
|
+
// Enable guardrails if environment variable is set
|
|
356
|
+
if (process.env.GUARDRAILS_ENABLED !== undefined) {
|
|
357
|
+
guardrailsConfig.enabled = process.env.GUARDRAILS_ENABLED === 'true';
|
|
358
|
+
}
|
|
359
|
+
|
|
360
|
+
// Global guardrails settings
|
|
361
|
+
if (process.env.GUARDRAILS_LOG_VIOLATIONS !== undefined) {
|
|
362
|
+
guardrailsConfig.log_violations = process.env.GUARDRAILS_LOG_VIOLATIONS === 'true';
|
|
363
|
+
}
|
|
364
|
+
if (process.env.GUARDRAILS_LOG_MODIFICATIONS !== undefined) {
|
|
365
|
+
guardrailsConfig.log_modifications = process.env.GUARDRAILS_LOG_MODIFICATIONS === 'true';
|
|
366
|
+
}
|
|
367
|
+
if (process.env.GUARDRAILS_FAIL_OPEN !== undefined) {
|
|
368
|
+
guardrailsConfig.fail_open = process.env.GUARDRAILS_FAIL_OPEN === 'true';
|
|
369
|
+
}
|
|
370
|
+
|
|
371
|
+
// Initialize plugins object if any plugin env vars are set
|
|
372
|
+
const plugins = this.getGuardrailsPluginsFromEnv(guardrailsConfig.plugins || {});
|
|
373
|
+
if (Object.keys(plugins).length > 0) {
|
|
374
|
+
guardrailsConfig.plugins = plugins;
|
|
375
|
+
// Auto-enable guardrails if any plugin is enabled
|
|
376
|
+
if (!guardrailsConfig.enabled) {
|
|
377
|
+
const anyEnabled = Object.values(plugins).some(
|
|
378
|
+
(p) => p && typeof p === 'object' && 'enabled' in p && (p as { enabled?: boolean }).enabled === true
|
|
379
|
+
);
|
|
380
|
+
if (anyEnabled) {
|
|
381
|
+
guardrailsConfig.enabled = true;
|
|
382
|
+
}
|
|
383
|
+
}
|
|
384
|
+
}
|
|
385
|
+
|
|
386
|
+
return guardrailsConfig.enabled ? guardrailsConfig : undefined;
|
|
387
|
+
}
|
|
388
|
+
|
|
389
|
+
private getGuardrailsPluginsFromEnv(
|
|
390
|
+
existingPlugins: Record<string, unknown>
|
|
391
|
+
): Record<string, unknown> {
|
|
392
|
+
const plugins: Record<string, unknown> = { ...existingPlugins };
|
|
393
|
+
|
|
394
|
+
// Rate Limiter
|
|
395
|
+
if (
|
|
396
|
+
process.env.GUARDRAILS_RATE_LIMITER_ENABLED !== undefined ||
|
|
397
|
+
existingPlugins.rate_limiter
|
|
398
|
+
) {
|
|
399
|
+
plugins.rate_limiter = {
|
|
400
|
+
...(existingPlugins.rate_limiter as object),
|
|
401
|
+
...(process.env.GUARDRAILS_RATE_LIMITER_ENABLED !== undefined && {
|
|
402
|
+
enabled: process.env.GUARDRAILS_RATE_LIMITER_ENABLED === 'true',
|
|
403
|
+
}),
|
|
404
|
+
...(process.env.GUARDRAILS_RATE_LIMITER_REQUESTS_PER_MINUTE && {
|
|
405
|
+
requests_per_minute: parseInt(process.env.GUARDRAILS_RATE_LIMITER_REQUESTS_PER_MINUTE),
|
|
406
|
+
}),
|
|
407
|
+
...(process.env.GUARDRAILS_RATE_LIMITER_REQUESTS_PER_HOUR && {
|
|
408
|
+
requests_per_hour: parseInt(process.env.GUARDRAILS_RATE_LIMITER_REQUESTS_PER_HOUR),
|
|
409
|
+
}),
|
|
410
|
+
...(process.env.GUARDRAILS_RATE_LIMITER_PER_PROVIDER !== undefined && {
|
|
411
|
+
per_provider: process.env.GUARDRAILS_RATE_LIMITER_PER_PROVIDER === 'true',
|
|
412
|
+
}),
|
|
413
|
+
...(process.env.GUARDRAILS_RATE_LIMITER_BURST_ALLOWANCE && {
|
|
414
|
+
burst_allowance: parseInt(process.env.GUARDRAILS_RATE_LIMITER_BURST_ALLOWANCE),
|
|
415
|
+
}),
|
|
416
|
+
};
|
|
417
|
+
}
|
|
418
|
+
|
|
419
|
+
// Token Limiter
|
|
420
|
+
if (
|
|
421
|
+
process.env.GUARDRAILS_TOKEN_LIMITER_ENABLED !== undefined ||
|
|
422
|
+
existingPlugins.token_limiter
|
|
423
|
+
) {
|
|
424
|
+
plugins.token_limiter = {
|
|
425
|
+
...(existingPlugins.token_limiter as object),
|
|
426
|
+
...(process.env.GUARDRAILS_TOKEN_LIMITER_ENABLED !== undefined && {
|
|
427
|
+
enabled: process.env.GUARDRAILS_TOKEN_LIMITER_ENABLED === 'true',
|
|
428
|
+
}),
|
|
429
|
+
...(process.env.GUARDRAILS_TOKEN_LIMITER_MAX_INPUT_TOKENS && {
|
|
430
|
+
max_input_tokens: parseInt(process.env.GUARDRAILS_TOKEN_LIMITER_MAX_INPUT_TOKENS),
|
|
431
|
+
}),
|
|
432
|
+
...(process.env.GUARDRAILS_TOKEN_LIMITER_MAX_OUTPUT_TOKENS && {
|
|
433
|
+
max_output_tokens: parseInt(process.env.GUARDRAILS_TOKEN_LIMITER_MAX_OUTPUT_TOKENS),
|
|
434
|
+
}),
|
|
435
|
+
...(process.env.GUARDRAILS_TOKEN_LIMITER_WARN_AT_PERCENTAGE && {
|
|
436
|
+
warn_at_percentage: parseInt(process.env.GUARDRAILS_TOKEN_LIMITER_WARN_AT_PERCENTAGE),
|
|
437
|
+
}),
|
|
438
|
+
};
|
|
439
|
+
}
|
|
440
|
+
|
|
441
|
+
// Pattern Blocker
|
|
442
|
+
if (
|
|
443
|
+
process.env.GUARDRAILS_PATTERN_BLOCKER_ENABLED !== undefined ||
|
|
444
|
+
existingPlugins.pattern_blocker
|
|
445
|
+
) {
|
|
446
|
+
plugins.pattern_blocker = {
|
|
447
|
+
...(existingPlugins.pattern_blocker as object),
|
|
448
|
+
...(process.env.GUARDRAILS_PATTERN_BLOCKER_ENABLED !== undefined && {
|
|
449
|
+
enabled: process.env.GUARDRAILS_PATTERN_BLOCKER_ENABLED === 'true',
|
|
450
|
+
}),
|
|
451
|
+
...(process.env.GUARDRAILS_PATTERN_BLOCKER_PATTERNS && {
|
|
452
|
+
blocked_patterns: process.env.GUARDRAILS_PATTERN_BLOCKER_PATTERNS.split(',').map((p) =>
|
|
453
|
+
p.trim()
|
|
454
|
+
),
|
|
455
|
+
}),
|
|
456
|
+
...(process.env.GUARDRAILS_PATTERN_BLOCKER_PATTERNS_REGEX && {
|
|
457
|
+
blocked_patterns_regex: process.env.GUARDRAILS_PATTERN_BLOCKER_PATTERNS_REGEX.split(
|
|
458
|
+
','
|
|
459
|
+
).map((p) => p.trim()),
|
|
460
|
+
}),
|
|
461
|
+
...(process.env.GUARDRAILS_PATTERN_BLOCKER_CASE_SENSITIVE !== undefined && {
|
|
462
|
+
case_sensitive: process.env.GUARDRAILS_PATTERN_BLOCKER_CASE_SENSITIVE === 'true',
|
|
463
|
+
}),
|
|
464
|
+
...(process.env.GUARDRAILS_PATTERN_BLOCKER_ACTION && {
|
|
465
|
+
action_on_match: process.env.GUARDRAILS_PATTERN_BLOCKER_ACTION as
|
|
466
|
+
| 'block'
|
|
467
|
+
| 'warn'
|
|
468
|
+
| 'redact',
|
|
469
|
+
}),
|
|
470
|
+
};
|
|
471
|
+
}
|
|
472
|
+
|
|
473
|
+
// PII Redactor
|
|
474
|
+
if (
|
|
475
|
+
process.env.GUARDRAILS_PII_REDACTOR_ENABLED !== undefined ||
|
|
476
|
+
existingPlugins.pii_redactor
|
|
477
|
+
) {
|
|
478
|
+
plugins.pii_redactor = {
|
|
479
|
+
...(existingPlugins.pii_redactor as object),
|
|
480
|
+
...(process.env.GUARDRAILS_PII_REDACTOR_ENABLED !== undefined && {
|
|
481
|
+
enabled: process.env.GUARDRAILS_PII_REDACTOR_ENABLED === 'true',
|
|
482
|
+
}),
|
|
483
|
+
...(process.env.GUARDRAILS_PII_REDACTOR_DETECT_EMAILS !== undefined && {
|
|
484
|
+
detect_emails: process.env.GUARDRAILS_PII_REDACTOR_DETECT_EMAILS === 'true',
|
|
485
|
+
}),
|
|
486
|
+
...(process.env.GUARDRAILS_PII_REDACTOR_DETECT_PHONES !== undefined && {
|
|
487
|
+
detect_phones: process.env.GUARDRAILS_PII_REDACTOR_DETECT_PHONES === 'true',
|
|
488
|
+
}),
|
|
489
|
+
...(process.env.GUARDRAILS_PII_REDACTOR_DETECT_SSN !== undefined && {
|
|
490
|
+
detect_ssn: process.env.GUARDRAILS_PII_REDACTOR_DETECT_SSN === 'true',
|
|
491
|
+
}),
|
|
492
|
+
...(process.env.GUARDRAILS_PII_REDACTOR_DETECT_API_KEYS !== undefined && {
|
|
493
|
+
detect_api_keys: process.env.GUARDRAILS_PII_REDACTOR_DETECT_API_KEYS === 'true',
|
|
494
|
+
}),
|
|
495
|
+
...(process.env.GUARDRAILS_PII_REDACTOR_DETECT_CREDIT_CARDS !== undefined && {
|
|
496
|
+
detect_credit_cards: process.env.GUARDRAILS_PII_REDACTOR_DETECT_CREDIT_CARDS === 'true',
|
|
497
|
+
}),
|
|
498
|
+
...(process.env.GUARDRAILS_PII_REDACTOR_DETECT_IP_ADDRESSES !== undefined && {
|
|
499
|
+
detect_ip_addresses: process.env.GUARDRAILS_PII_REDACTOR_DETECT_IP_ADDRESSES === 'true',
|
|
500
|
+
}),
|
|
501
|
+
...(process.env.GUARDRAILS_PII_REDACTOR_ALLOWLIST && {
|
|
502
|
+
allowlist: process.env.GUARDRAILS_PII_REDACTOR_ALLOWLIST.split(',').map((a) => a.trim()),
|
|
503
|
+
}),
|
|
504
|
+
...(process.env.GUARDRAILS_PII_REDACTOR_ALLOWLIST_DOMAINS && {
|
|
505
|
+
allowlist_domains: process.env.GUARDRAILS_PII_REDACTOR_ALLOWLIST_DOMAINS.split(',').map(
|
|
506
|
+
(d) => d.trim()
|
|
507
|
+
),
|
|
508
|
+
}),
|
|
509
|
+
...(process.env.GUARDRAILS_PII_REDACTOR_RESTORE_ON_RESPONSE !== undefined && {
|
|
510
|
+
restore_on_response: process.env.GUARDRAILS_PII_REDACTOR_RESTORE_ON_RESPONSE === 'true',
|
|
511
|
+
}),
|
|
512
|
+
...(process.env.GUARDRAILS_PII_REDACTOR_LOG_DETECTIONS !== undefined && {
|
|
513
|
+
log_detections: process.env.GUARDRAILS_PII_REDACTOR_LOG_DETECTIONS === 'true',
|
|
514
|
+
}),
|
|
515
|
+
};
|
|
516
|
+
}
|
|
517
|
+
|
|
518
|
+
return plugins;
|
|
519
|
+
}
|
|
520
|
+
|
|
335
521
|
getConfig(): Config {
|
|
336
522
|
return this.config;
|
|
337
523
|
}
|
package/src/config/types.ts
CHANGED
|
@@ -43,6 +43,72 @@ export const PricingConfigSchema = z.record(
|
|
|
43
43
|
z.record(z.string(), ModelPricingSchema) // model name -> pricing
|
|
44
44
|
);
|
|
45
45
|
|
|
46
|
+
// Guardrails Plugin Configs
|
|
47
|
+
export const RateLimiterConfigSchema = z.object({
|
|
48
|
+
enabled: z.boolean().default(false),
|
|
49
|
+
priority: z.number().min(0).max(1000).default(10),
|
|
50
|
+
requests_per_minute: z.number().min(1).default(60),
|
|
51
|
+
requests_per_hour: z.number().min(1).default(1000),
|
|
52
|
+
per_provider: z.boolean().default(false),
|
|
53
|
+
burst_allowance: z.number().min(0).default(5),
|
|
54
|
+
});
|
|
55
|
+
|
|
56
|
+
export const TokenLimiterConfigSchema = z.object({
|
|
57
|
+
enabled: z.boolean().default(false),
|
|
58
|
+
priority: z.number().min(0).max(1000).default(20),
|
|
59
|
+
max_input_tokens: z.number().min(1).default(8192),
|
|
60
|
+
max_output_tokens: z.number().min(1).optional(),
|
|
61
|
+
warn_at_percentage: z.number().min(0).max(100).default(80),
|
|
62
|
+
});
|
|
63
|
+
|
|
64
|
+
export const PatternBlockerConfigSchema = z.object({
|
|
65
|
+
enabled: z.boolean().default(false),
|
|
66
|
+
priority: z.number().min(0).max(1000).default(30),
|
|
67
|
+
blocked_patterns: z.array(z.string()).default([]),
|
|
68
|
+
blocked_patterns_regex: z.array(z.string()).default([]),
|
|
69
|
+
case_sensitive: z.boolean().default(false),
|
|
70
|
+
action_on_match: z.enum(['block', 'warn', 'redact']).default('block'),
|
|
71
|
+
});
|
|
72
|
+
|
|
73
|
+
export const PIIRedactorConfigSchema = z.object({
|
|
74
|
+
enabled: z.boolean().default(false),
|
|
75
|
+
priority: z.number().min(0).max(1000).default(25),
|
|
76
|
+
detect_emails: z.boolean().default(true),
|
|
77
|
+
detect_phones: z.boolean().default(true),
|
|
78
|
+
detect_ssn: z.boolean().default(true),
|
|
79
|
+
detect_api_keys: z.boolean().default(true),
|
|
80
|
+
detect_credit_cards: z.boolean().default(true),
|
|
81
|
+
detect_ip_addresses: z.boolean().default(false),
|
|
82
|
+
custom_patterns: z
|
|
83
|
+
.array(
|
|
84
|
+
z.object({
|
|
85
|
+
name: z.string(),
|
|
86
|
+
pattern: z.string(),
|
|
87
|
+
placeholder: z.string(),
|
|
88
|
+
})
|
|
89
|
+
)
|
|
90
|
+
.default([]),
|
|
91
|
+
allowlist: z.array(z.string()).default([]),
|
|
92
|
+
allowlist_domains: z.array(z.string()).default([]),
|
|
93
|
+
restore_on_response: z.boolean().default(false),
|
|
94
|
+
log_detections: z.boolean().default(true),
|
|
95
|
+
});
|
|
96
|
+
|
|
97
|
+
export const GuardrailsPluginsConfigSchema = z.object({
|
|
98
|
+
rate_limiter: RateLimiterConfigSchema.optional(),
|
|
99
|
+
token_limiter: TokenLimiterConfigSchema.optional(),
|
|
100
|
+
pattern_blocker: PatternBlockerConfigSchema.optional(),
|
|
101
|
+
pii_redactor: PIIRedactorConfigSchema.optional(),
|
|
102
|
+
});
|
|
103
|
+
|
|
104
|
+
export const GuardrailsConfigSchema = z.object({
|
|
105
|
+
enabled: z.boolean().default(false),
|
|
106
|
+
log_violations: z.boolean().default(true),
|
|
107
|
+
log_modifications: z.boolean().default(false),
|
|
108
|
+
fail_open: z.boolean().default(false), // If true, allow on plugin errors
|
|
109
|
+
plugins: GuardrailsPluginsConfigSchema.optional(),
|
|
110
|
+
});
|
|
111
|
+
|
|
46
112
|
export const ConfigSchema = z.object({
|
|
47
113
|
providers: z.record(z.string(), ProviderConfigSchema),
|
|
48
114
|
default_provider: z.string().optional(),
|
|
@@ -52,6 +118,7 @@ export const ConfigSchema = z.object({
|
|
|
52
118
|
log_level: z.enum(['debug', 'info', 'warn', 'error']).default('info'),
|
|
53
119
|
mcp_bridge: MCPBridgeConfigSchema.optional(),
|
|
54
120
|
pricing: PricingConfigSchema.optional(),
|
|
121
|
+
guardrails: GuardrailsConfigSchema.optional(),
|
|
55
122
|
});
|
|
56
123
|
|
|
57
124
|
export type ProviderConfig = z.infer<typeof ProviderConfigSchema>;
|
|
@@ -59,6 +126,12 @@ export type MCPServerConfig = z.infer<typeof MCPServerConfigSchema>;
|
|
|
59
126
|
export type MCPBridgeConfig = z.infer<typeof MCPBridgeConfigSchema>;
|
|
60
127
|
export type ModelPricing = z.infer<typeof ModelPricingSchema>;
|
|
61
128
|
export type PricingConfig = z.infer<typeof PricingConfigSchema>;
|
|
129
|
+
export type RateLimiterConfig = z.infer<typeof RateLimiterConfigSchema>;
|
|
130
|
+
export type TokenLimiterConfig = z.infer<typeof TokenLimiterConfigSchema>;
|
|
131
|
+
export type PatternBlockerConfig = z.infer<typeof PatternBlockerConfigSchema>;
|
|
132
|
+
export type PIIRedactorConfig = z.infer<typeof PIIRedactorConfigSchema>;
|
|
133
|
+
export type GuardrailsPluginsConfig = z.infer<typeof GuardrailsPluginsConfigSchema>;
|
|
134
|
+
export type GuardrailsConfig = z.infer<typeof GuardrailsConfigSchema>;
|
|
62
135
|
export type Config = z.infer<typeof ConfigSchema>;
|
|
63
136
|
|
|
64
137
|
export interface ConversationMessage {
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
import { randomUUID } from 'crypto';
|
|
2
|
+
import { GuardrailContext, CreateContextOptions } from './types.js';
|
|
3
|
+
|
|
4
|
+
/**
|
|
5
|
+
* Create a new guardrail context with defaults
|
|
6
|
+
*/
|
|
7
|
+
export function createGuardrailContext(options: CreateContextOptions = {}): GuardrailContext {
|
|
8
|
+
return {
|
|
9
|
+
requestId: options.requestId || randomUUID(),
|
|
10
|
+
provider: options.provider || 'unknown',
|
|
11
|
+
model: options.model || 'unknown',
|
|
12
|
+
timestamp: new Date(),
|
|
13
|
+
messages: options.messages || [],
|
|
14
|
+
prompt: options.prompt,
|
|
15
|
+
response: options.response,
|
|
16
|
+
toolName: options.toolName,
|
|
17
|
+
toolArgs: options.toolArgs,
|
|
18
|
+
toolResult: options.toolResult,
|
|
19
|
+
metadata: new Map(),
|
|
20
|
+
violations: [],
|
|
21
|
+
modifications: [],
|
|
22
|
+
};
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
/**
|
|
26
|
+
* Clone a guardrail context (deep copy metadata but shallow copy violations/modifications)
|
|
27
|
+
*/
|
|
28
|
+
export function cloneContext(context: GuardrailContext): GuardrailContext {
|
|
29
|
+
return {
|
|
30
|
+
...context,
|
|
31
|
+
messages: [...context.messages],
|
|
32
|
+
toolArgs: context.toolArgs ? { ...context.toolArgs } : undefined,
|
|
33
|
+
metadata: new Map(context.metadata),
|
|
34
|
+
violations: [...context.violations],
|
|
35
|
+
modifications: [...context.modifications],
|
|
36
|
+
};
|
|
37
|
+
}
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Error thrown when a guardrail blocks a request
|
|
3
|
+
*/
|
|
4
|
+
export class GuardrailBlockError extends Error {
|
|
5
|
+
public readonly pluginName: string;
|
|
6
|
+
public readonly reason: string;
|
|
7
|
+
|
|
8
|
+
constructor(pluginName: string, reason: string) {
|
|
9
|
+
super(`Request blocked by guardrail '${pluginName}': ${reason}`);
|
|
10
|
+
this.name = 'GuardrailBlockError';
|
|
11
|
+
this.pluginName = pluginName;
|
|
12
|
+
this.reason = reason;
|
|
13
|
+
}
|
|
14
|
+
}
|
|
15
|
+
|
|
16
|
+
/**
|
|
17
|
+
* Error thrown when a guardrail plugin fails to initialize
|
|
18
|
+
*/
|
|
19
|
+
export class GuardrailInitError extends Error {
|
|
20
|
+
public readonly pluginName: string;
|
|
21
|
+
public readonly cause: Error | undefined;
|
|
22
|
+
|
|
23
|
+
constructor(pluginName: string, message: string, cause?: Error) {
|
|
24
|
+
super(`Failed to initialize guardrail plugin '${pluginName}': ${message}`);
|
|
25
|
+
this.name = 'GuardrailInitError';
|
|
26
|
+
this.pluginName = pluginName;
|
|
27
|
+
this.cause = cause;
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
/**
|
|
32
|
+
* Error thrown when a guardrail plugin execution fails
|
|
33
|
+
*/
|
|
34
|
+
export class GuardrailExecutionError extends Error {
|
|
35
|
+
public readonly pluginName: string;
|
|
36
|
+
public readonly phase: string;
|
|
37
|
+
public readonly cause: Error | undefined;
|
|
38
|
+
|
|
39
|
+
constructor(pluginName: string, phase: string, message: string, cause?: Error) {
|
|
40
|
+
super(`Guardrail plugin '${pluginName}' failed during '${phase}': ${message}`);
|
|
41
|
+
this.name = 'GuardrailExecutionError';
|
|
42
|
+
this.pluginName = pluginName;
|
|
43
|
+
this.phase = phase;
|
|
44
|
+
this.cause = cause;
|
|
45
|
+
}
|
|
46
|
+
}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
// Core types
|
|
2
|
+
export * from './types.js';
|
|
3
|
+
|
|
4
|
+
// Errors
|
|
5
|
+
export * from './errors.js';
|
|
6
|
+
|
|
7
|
+
// Context
|
|
8
|
+
export { createGuardrailContext, cloneContext } from './context.js';
|
|
9
|
+
|
|
10
|
+
// Service
|
|
11
|
+
export { GuardrailsService } from './service.js';
|
|
12
|
+
|
|
13
|
+
// Plugins
|
|
14
|
+
export {
|
|
15
|
+
BaseGuardrailPlugin,
|
|
16
|
+
RateLimiterPlugin,
|
|
17
|
+
TokenLimiterPlugin,
|
|
18
|
+
PatternBlockerPlugin,
|
|
19
|
+
PIIRedactorPlugin,
|
|
20
|
+
} from './plugins/index.js';
|
|
@@ -0,0 +1,103 @@
|
|
|
1
|
+
import {
|
|
2
|
+
GuardrailPlugin,
|
|
3
|
+
GuardrailPhase,
|
|
4
|
+
GuardrailContext,
|
|
5
|
+
GuardrailResult,
|
|
6
|
+
} from '../types.js';
|
|
7
|
+
|
|
8
|
+
/**
|
|
9
|
+
* Abstract base class for guardrail plugins
|
|
10
|
+
*/
|
|
11
|
+
export abstract class BaseGuardrailPlugin implements GuardrailPlugin {
|
|
12
|
+
abstract name: string;
|
|
13
|
+
abstract phases: GuardrailPhase[];
|
|
14
|
+
|
|
15
|
+
enabled: boolean = false;
|
|
16
|
+
priority: number = 100;
|
|
17
|
+
|
|
18
|
+
protected config: Record<string, unknown> = {};
|
|
19
|
+
|
|
20
|
+
initialize(config: Record<string, unknown>): Promise<void> {
|
|
21
|
+
this.config = config;
|
|
22
|
+
this.enabled = true;
|
|
23
|
+
if (typeof config.priority === 'number') {
|
|
24
|
+
this.priority = config.priority;
|
|
25
|
+
}
|
|
26
|
+
return Promise.resolve();
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
abstract execute(phase: GuardrailPhase, context: GuardrailContext): Promise<GuardrailResult>;
|
|
30
|
+
|
|
31
|
+
shutdown(): Promise<void> {
|
|
32
|
+
this.enabled = false;
|
|
33
|
+
return Promise.resolve();
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
/**
|
|
37
|
+
* Helper to create an 'allow' result
|
|
38
|
+
*/
|
|
39
|
+
protected allow(context: GuardrailContext): GuardrailResult {
|
|
40
|
+
return { action: 'allow', context };
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
/**
|
|
44
|
+
* Helper to create a 'block' result
|
|
45
|
+
*/
|
|
46
|
+
protected block(context: GuardrailContext, reason: string): GuardrailResult {
|
|
47
|
+
return {
|
|
48
|
+
action: 'block',
|
|
49
|
+
context,
|
|
50
|
+
blockedBy: this.name,
|
|
51
|
+
blockReason: reason,
|
|
52
|
+
};
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
/**
|
|
56
|
+
* Helper to create a 'modify' result
|
|
57
|
+
*/
|
|
58
|
+
protected modify(context: GuardrailContext): GuardrailResult {
|
|
59
|
+
return { action: 'modify', context };
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
/**
|
|
63
|
+
* Helper to add a violation to context
|
|
64
|
+
*/
|
|
65
|
+
protected addViolation(
|
|
66
|
+
context: GuardrailContext,
|
|
67
|
+
phase: GuardrailPhase,
|
|
68
|
+
rule: string,
|
|
69
|
+
severity: 'info' | 'warning' | 'error' | 'critical',
|
|
70
|
+
message: string,
|
|
71
|
+
details?: Record<string, unknown>
|
|
72
|
+
): void {
|
|
73
|
+
context.violations.push({
|
|
74
|
+
pluginName: this.name,
|
|
75
|
+
phase,
|
|
76
|
+
rule,
|
|
77
|
+
severity,
|
|
78
|
+
message,
|
|
79
|
+
details,
|
|
80
|
+
});
|
|
81
|
+
}
|
|
82
|
+
|
|
83
|
+
/**
|
|
84
|
+
* Helper to add a modification to context
|
|
85
|
+
*/
|
|
86
|
+
protected addModification(
|
|
87
|
+
context: GuardrailContext,
|
|
88
|
+
phase: GuardrailPhase,
|
|
89
|
+
field: string,
|
|
90
|
+
reason: string,
|
|
91
|
+
originalValue?: unknown,
|
|
92
|
+
newValue?: unknown
|
|
93
|
+
): void {
|
|
94
|
+
context.modifications.push({
|
|
95
|
+
pluginName: this.name,
|
|
96
|
+
phase,
|
|
97
|
+
field,
|
|
98
|
+
originalValue,
|
|
99
|
+
newValue,
|
|
100
|
+
reason,
|
|
101
|
+
});
|
|
102
|
+
}
|
|
103
|
+
}
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
export { BaseGuardrailPlugin } from './base-plugin.js';
|
|
2
|
+
export { RateLimiterPlugin } from './rate-limiter.js';
|
|
3
|
+
export { TokenLimiterPlugin } from './token-limiter.js';
|
|
4
|
+
export { PatternBlockerPlugin } from './pattern-blocker.js';
|
|
5
|
+
export { PIIRedactorPlugin } from './pii-redactor/index.js';
|