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,281 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* ConversationGuard
|
|
4
|
+
*
|
|
5
|
+
* Detects and prevents multi-turn manipulation attacks by:
|
|
6
|
+
* - Tracking conversation history patterns
|
|
7
|
+
* - Detecting gradual privilege escalation attempts
|
|
8
|
+
* - Identifying context manipulation across turns
|
|
9
|
+
* - Blocking suspicious conversation trajectories
|
|
10
|
+
*/
|
|
11
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
12
|
+
exports.ConversationGuard = void 0;
|
|
13
|
+
class ConversationGuard {
|
|
14
|
+
constructor(config = {}) {
|
|
15
|
+
this.sessions = new Map();
|
|
16
|
+
this.defaultManipulationPatterns = [
|
|
17
|
+
// Escalation patterns
|
|
18
|
+
{
|
|
19
|
+
name: "role_claim",
|
|
20
|
+
pattern: /(?:i am|i'm|as|acting as)\s+(?:an?\s+)?(?:admin|administrator|root|superuser|manager|supervisor)/gi,
|
|
21
|
+
weight: 3,
|
|
22
|
+
category: "escalation",
|
|
23
|
+
},
|
|
24
|
+
{
|
|
25
|
+
name: "permission_request",
|
|
26
|
+
pattern: /(?:give me|grant me|i need|enable|unlock)\s+(?:access|permission|privileges|admin|root)/gi,
|
|
27
|
+
weight: 4,
|
|
28
|
+
category: "escalation",
|
|
29
|
+
},
|
|
30
|
+
{
|
|
31
|
+
name: "bypass_attempt",
|
|
32
|
+
pattern: /(?:bypass|skip|ignore|override|disable)\s+(?:security|check|validation|permission|auth)/gi,
|
|
33
|
+
weight: 5,
|
|
34
|
+
category: "escalation",
|
|
35
|
+
},
|
|
36
|
+
// Confusion patterns
|
|
37
|
+
{
|
|
38
|
+
name: "context_switch",
|
|
39
|
+
pattern: /(?:forget|ignore|disregard)\s+(?:previous|earlier|what i said|instructions)/gi,
|
|
40
|
+
weight: 4,
|
|
41
|
+
category: "confusion",
|
|
42
|
+
},
|
|
43
|
+
{
|
|
44
|
+
name: "role_confusion",
|
|
45
|
+
pattern: /(?:you are now|pretend to be|act as if|imagine you're)\s+/gi,
|
|
46
|
+
weight: 4,
|
|
47
|
+
category: "confusion",
|
|
48
|
+
},
|
|
49
|
+
{
|
|
50
|
+
name: "scenario_framing",
|
|
51
|
+
pattern: /(?:in this scenario|hypothetically|let's say|imagine that|pretend that)/gi,
|
|
52
|
+
weight: 2,
|
|
53
|
+
category: "confusion",
|
|
54
|
+
},
|
|
55
|
+
// Override patterns
|
|
56
|
+
{
|
|
57
|
+
name: "instruction_override",
|
|
58
|
+
pattern: /(?:new instructions?|override|update your|change your)\s+(?:are|is|:)/gi,
|
|
59
|
+
weight: 5,
|
|
60
|
+
category: "override",
|
|
61
|
+
},
|
|
62
|
+
{
|
|
63
|
+
name: "system_impersonation",
|
|
64
|
+
pattern: /(?:\[system\]|\[admin\]|system:|\bSYSTEM\b|ADMIN:)/gi,
|
|
65
|
+
weight: 5,
|
|
66
|
+
category: "override",
|
|
67
|
+
},
|
|
68
|
+
{
|
|
69
|
+
name: "priority_claim",
|
|
70
|
+
pattern: /(?:priority|urgent|important|critical)[:.]?\s*(?:override|ignore|bypass)/gi,
|
|
71
|
+
weight: 4,
|
|
72
|
+
category: "override",
|
|
73
|
+
},
|
|
74
|
+
// Extraction patterns
|
|
75
|
+
{
|
|
76
|
+
name: "data_extraction",
|
|
77
|
+
pattern: /(?:list all|show me all|dump|export|extract)\s+(?:users|data|records|passwords|credentials)/gi,
|
|
78
|
+
weight: 4,
|
|
79
|
+
category: "extraction",
|
|
80
|
+
},
|
|
81
|
+
{
|
|
82
|
+
name: "internal_query",
|
|
83
|
+
pattern: /(?:what are your|tell me your|reveal your)\s+(?:instructions|rules|prompts|system)/gi,
|
|
84
|
+
weight: 3,
|
|
85
|
+
category: "extraction",
|
|
86
|
+
},
|
|
87
|
+
];
|
|
88
|
+
this.config = {
|
|
89
|
+
maxConversationLength: config.maxConversationLength ?? 50,
|
|
90
|
+
conversationTTLMinutes: config.conversationTTLMinutes ?? 30,
|
|
91
|
+
escalationThreshold: config.escalationThreshold ?? 10,
|
|
92
|
+
manipulationPatterns: config.manipulationPatterns ?? this.defaultManipulationPatterns,
|
|
93
|
+
detectToneShifts: config.detectToneShifts ?? true,
|
|
94
|
+
detectRoleConfusion: config.detectRoleConfusion ?? true,
|
|
95
|
+
detectInstructionOverride: config.detectInstructionOverride ?? true,
|
|
96
|
+
};
|
|
97
|
+
// Cleanup expired sessions periodically
|
|
98
|
+
setInterval(() => this.cleanupSessions(), 60000);
|
|
99
|
+
}
|
|
100
|
+
/**
|
|
101
|
+
* Analyze a new user message in context of the conversation
|
|
102
|
+
*/
|
|
103
|
+
check(sessionId, userMessage, toolCalls, claimedRole, requestId = "") {
|
|
104
|
+
const violations = [];
|
|
105
|
+
const riskFactors = [];
|
|
106
|
+
const suspiciousPatterns = [];
|
|
107
|
+
let riskScore = 0;
|
|
108
|
+
// Get or create session
|
|
109
|
+
const session = this.getOrCreateSession(sessionId);
|
|
110
|
+
// Add new turn
|
|
111
|
+
const turn = {
|
|
112
|
+
timestamp: Date.now(),
|
|
113
|
+
role: "user",
|
|
114
|
+
content: userMessage,
|
|
115
|
+
tool_calls: toolCalls,
|
|
116
|
+
risk_indicators: [],
|
|
117
|
+
};
|
|
118
|
+
// Check for manipulation patterns
|
|
119
|
+
for (const pattern of this.config.manipulationPatterns) {
|
|
120
|
+
if (pattern.pattern.test(userMessage)) {
|
|
121
|
+
riskScore += pattern.weight;
|
|
122
|
+
riskFactors.push({
|
|
123
|
+
factor: pattern.name,
|
|
124
|
+
weight: pattern.weight,
|
|
125
|
+
details: `Detected ${pattern.category} pattern: ${pattern.name}`,
|
|
126
|
+
});
|
|
127
|
+
turn.risk_indicators?.push(pattern.name);
|
|
128
|
+
suspiciousPatterns.push(pattern.name);
|
|
129
|
+
violations.push(`MANIPULATION_${pattern.category.toUpperCase()}_${pattern.name.toUpperCase()}`);
|
|
130
|
+
if (pattern.category === "escalation") {
|
|
131
|
+
session.escalation_attempts++;
|
|
132
|
+
}
|
|
133
|
+
session.manipulation_indicators++;
|
|
134
|
+
}
|
|
135
|
+
}
|
|
136
|
+
// Check for role confusion across turns
|
|
137
|
+
if (claimedRole && this.config.detectRoleConfusion) {
|
|
138
|
+
if (session.initial_role && claimedRole !== session.initial_role) {
|
|
139
|
+
riskScore += 3;
|
|
140
|
+
riskFactors.push({
|
|
141
|
+
factor: "role_change",
|
|
142
|
+
weight: 3,
|
|
143
|
+
details: `Role changed from ${session.initial_role} to ${claimedRole}`,
|
|
144
|
+
});
|
|
145
|
+
violations.push("ROLE_CHANGE_DETECTED");
|
|
146
|
+
}
|
|
147
|
+
if (!session.claimed_roles.includes(claimedRole)) {
|
|
148
|
+
session.claimed_roles.push(claimedRole);
|
|
149
|
+
}
|
|
150
|
+
if (!session.initial_role) {
|
|
151
|
+
session.initial_role = claimedRole;
|
|
152
|
+
}
|
|
153
|
+
}
|
|
154
|
+
// Check for progressive escalation
|
|
155
|
+
if (session.escalation_attempts >= 3) {
|
|
156
|
+
riskScore += 5;
|
|
157
|
+
riskFactors.push({
|
|
158
|
+
factor: "progressive_escalation",
|
|
159
|
+
weight: 5,
|
|
160
|
+
details: `${session.escalation_attempts} escalation attempts detected`,
|
|
161
|
+
});
|
|
162
|
+
violations.push("PROGRESSIVE_ESCALATION");
|
|
163
|
+
}
|
|
164
|
+
// Check conversation trajectory
|
|
165
|
+
if (session.turns.length > 5) {
|
|
166
|
+
const recentManipulation = session.turns
|
|
167
|
+
.slice(-5)
|
|
168
|
+
.filter((t) => (t.risk_indicators?.length ?? 0) > 0).length;
|
|
169
|
+
if (recentManipulation >= 3) {
|
|
170
|
+
riskScore += 4;
|
|
171
|
+
riskFactors.push({
|
|
172
|
+
factor: "sustained_manipulation",
|
|
173
|
+
weight: 4,
|
|
174
|
+
details: `${recentManipulation} of last 5 turns show manipulation attempts`,
|
|
175
|
+
});
|
|
176
|
+
violations.push("SUSTAINED_MANIPULATION");
|
|
177
|
+
}
|
|
178
|
+
}
|
|
179
|
+
// Check for sensitive tool sequences
|
|
180
|
+
if (toolCalls && toolCalls.length > 0) {
|
|
181
|
+
const sensitiveTools = ["delete", "modify", "admin", "system", "config"];
|
|
182
|
+
const hasSensitiveTool = toolCalls.some((t) => sensitiveTools.some((s) => t.toLowerCase().includes(s)));
|
|
183
|
+
if (hasSensitiveTool && session.manipulation_indicators > 0) {
|
|
184
|
+
riskScore += 3;
|
|
185
|
+
riskFactors.push({
|
|
186
|
+
factor: "sensitive_tool_after_manipulation",
|
|
187
|
+
weight: 3,
|
|
188
|
+
details: "Sensitive tool call following manipulation attempts",
|
|
189
|
+
});
|
|
190
|
+
violations.push("SENSITIVE_TOOL_AFTER_MANIPULATION");
|
|
191
|
+
}
|
|
192
|
+
}
|
|
193
|
+
// Add turn to session
|
|
194
|
+
session.turns.push(turn);
|
|
195
|
+
session.last_activity = Date.now();
|
|
196
|
+
// Trim session if too long
|
|
197
|
+
if (session.turns.length > this.config.maxConversationLength) {
|
|
198
|
+
session.turns = session.turns.slice(-this.config.maxConversationLength);
|
|
199
|
+
}
|
|
200
|
+
// Determine if blocked
|
|
201
|
+
const allowed = riskScore < this.config.escalationThreshold;
|
|
202
|
+
if (!allowed) {
|
|
203
|
+
console.log(`[ConversationGuard:${requestId}] BLOCKED: Risk score ${riskScore} exceeds threshold`);
|
|
204
|
+
}
|
|
205
|
+
return {
|
|
206
|
+
allowed,
|
|
207
|
+
reason: allowed
|
|
208
|
+
? undefined
|
|
209
|
+
: `Conversation risk score ${riskScore} exceeds threshold ${this.config.escalationThreshold}`,
|
|
210
|
+
violations,
|
|
211
|
+
risk_score: riskScore,
|
|
212
|
+
risk_factors: riskFactors,
|
|
213
|
+
conversation_analysis: {
|
|
214
|
+
turn_count: session.turns.length,
|
|
215
|
+
escalation_attempts: session.escalation_attempts,
|
|
216
|
+
manipulation_indicators: session.manipulation_indicators,
|
|
217
|
+
suspicious_patterns: suspiciousPatterns,
|
|
218
|
+
},
|
|
219
|
+
};
|
|
220
|
+
}
|
|
221
|
+
/**
|
|
222
|
+
* Record assistant response (for complete conversation tracking)
|
|
223
|
+
*/
|
|
224
|
+
recordResponse(sessionId, response, toolCalls) {
|
|
225
|
+
const session = this.sessions.get(sessionId);
|
|
226
|
+
if (session) {
|
|
227
|
+
session.turns.push({
|
|
228
|
+
timestamp: Date.now(),
|
|
229
|
+
role: "assistant",
|
|
230
|
+
content: response,
|
|
231
|
+
tool_calls: toolCalls,
|
|
232
|
+
});
|
|
233
|
+
session.last_activity = Date.now();
|
|
234
|
+
}
|
|
235
|
+
}
|
|
236
|
+
/**
|
|
237
|
+
* Get session analysis
|
|
238
|
+
*/
|
|
239
|
+
getSessionAnalysis(sessionId) {
|
|
240
|
+
const session = this.sessions.get(sessionId);
|
|
241
|
+
if (!session)
|
|
242
|
+
return null;
|
|
243
|
+
return {
|
|
244
|
+
turn_count: session.turns.length,
|
|
245
|
+
escalation_attempts: session.escalation_attempts,
|
|
246
|
+
manipulation_indicators: session.manipulation_indicators,
|
|
247
|
+
claimed_roles: session.claimed_roles,
|
|
248
|
+
session_age_minutes: (Date.now() - session.turns[0]?.timestamp || 0) / 60000,
|
|
249
|
+
};
|
|
250
|
+
}
|
|
251
|
+
/**
|
|
252
|
+
* Reset a session
|
|
253
|
+
*/
|
|
254
|
+
resetSession(sessionId) {
|
|
255
|
+
this.sessions.delete(sessionId);
|
|
256
|
+
}
|
|
257
|
+
getOrCreateSession(sessionId) {
|
|
258
|
+
if (!this.sessions.has(sessionId)) {
|
|
259
|
+
this.sessions.set(sessionId, {
|
|
260
|
+
id: sessionId,
|
|
261
|
+
turns: [],
|
|
262
|
+
escalation_attempts: 0,
|
|
263
|
+
manipulation_indicators: 0,
|
|
264
|
+
last_activity: Date.now(),
|
|
265
|
+
claimed_roles: [],
|
|
266
|
+
});
|
|
267
|
+
}
|
|
268
|
+
return this.sessions.get(sessionId);
|
|
269
|
+
}
|
|
270
|
+
cleanupSessions() {
|
|
271
|
+
const ttlMs = this.config.conversationTTLMinutes * 60000;
|
|
272
|
+
const now = Date.now();
|
|
273
|
+
for (const [id, session] of this.sessions.entries()) {
|
|
274
|
+
if (now - session.last_activity > ttlMs) {
|
|
275
|
+
this.sessions.delete(id);
|
|
276
|
+
}
|
|
277
|
+
}
|
|
278
|
+
}
|
|
279
|
+
}
|
|
280
|
+
exports.ConversationGuard = ConversationGuard;
|
|
281
|
+
//# sourceMappingURL=conversation-guard.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"conversation-guard.js","sourceRoot":"","sources":["../../src/guards/conversation-guard.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,182 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* DriftDetector (L14)
|
|
3
|
+
*
|
|
4
|
+
* Detects behavioral drift from intended agent purpose.
|
|
5
|
+
* Monitors for rogue agent behavior and goal misalignment.
|
|
6
|
+
*
|
|
7
|
+
* Threat Model:
|
|
8
|
+
* - ASI10: Rogue Agents
|
|
9
|
+
* - Goal misalignment
|
|
10
|
+
* - Behavioral drift over time
|
|
11
|
+
*
|
|
12
|
+
* Protection Capabilities:
|
|
13
|
+
* - Baseline behavior profiling
|
|
14
|
+
* - Anomaly detection
|
|
15
|
+
* - Goal alignment verification
|
|
16
|
+
* - Continuous monitoring
|
|
17
|
+
* - Alert thresholds
|
|
18
|
+
*/
|
|
19
|
+
export interface DriftDetectorConfig {
|
|
20
|
+
/** Minimum samples before drift detection activates */
|
|
21
|
+
minimumSamples?: number;
|
|
22
|
+
/** Standard deviation threshold for anomaly detection */
|
|
23
|
+
anomalyThreshold?: number;
|
|
24
|
+
/** Time window for baseline calculation in milliseconds */
|
|
25
|
+
baselineWindow?: number;
|
|
26
|
+
/** Enable automatic baseline updates */
|
|
27
|
+
autoUpdateBaseline?: boolean;
|
|
28
|
+
/** Maximum drift score before alert (0-100) */
|
|
29
|
+
alertThreshold?: number;
|
|
30
|
+
/** Enable goal alignment checking */
|
|
31
|
+
checkGoalAlignment?: boolean;
|
|
32
|
+
/** Callback when drift is detected */
|
|
33
|
+
onDrift?: (agentId: string, analysis: DriftAnalysis) => void;
|
|
34
|
+
/** Callback when agent returns to baseline */
|
|
35
|
+
onRecovery?: (agentId: string) => void;
|
|
36
|
+
}
|
|
37
|
+
export interface BehaviorSample {
|
|
38
|
+
/** Timestamp of the sample */
|
|
39
|
+
timestamp: number;
|
|
40
|
+
/** Tools/actions used */
|
|
41
|
+
tools: string[];
|
|
42
|
+
/** Topics/domains accessed */
|
|
43
|
+
topics: string[];
|
|
44
|
+
/** Sentiment indicator (-1 to 1) */
|
|
45
|
+
sentiment: number;
|
|
46
|
+
/** Response length */
|
|
47
|
+
responseLength: number;
|
|
48
|
+
/** Time to respond in milliseconds */
|
|
49
|
+
responseTime: number;
|
|
50
|
+
/** Error occurred */
|
|
51
|
+
hadError: boolean;
|
|
52
|
+
/** User satisfaction (if available, 0-1) */
|
|
53
|
+
satisfaction?: number;
|
|
54
|
+
/** Goal alignment indicators */
|
|
55
|
+
goalIndicators?: Record<string, number>;
|
|
56
|
+
/** Custom metrics */
|
|
57
|
+
customMetrics?: Record<string, number>;
|
|
58
|
+
}
|
|
59
|
+
export interface BaselineProfile {
|
|
60
|
+
/** Average tool usage distribution */
|
|
61
|
+
toolDistribution: Record<string, number>;
|
|
62
|
+
/** Average topic distribution */
|
|
63
|
+
topicDistribution: Record<string, number>;
|
|
64
|
+
/** Average sentiment */
|
|
65
|
+
avgSentiment: number;
|
|
66
|
+
/** Sentiment standard deviation */
|
|
67
|
+
sentimentStdDev: number;
|
|
68
|
+
/** Average response length */
|
|
69
|
+
avgResponseLength: number;
|
|
70
|
+
/** Response length standard deviation */
|
|
71
|
+
responseLengthStdDev: number;
|
|
72
|
+
/** Average response time */
|
|
73
|
+
avgResponseTime: number;
|
|
74
|
+
/** Response time standard deviation */
|
|
75
|
+
responseTimeStdDev: number;
|
|
76
|
+
/** Error rate */
|
|
77
|
+
errorRate: number;
|
|
78
|
+
/** Average satisfaction */
|
|
79
|
+
avgSatisfaction: number;
|
|
80
|
+
/** Sample count used for baseline */
|
|
81
|
+
sampleCount: number;
|
|
82
|
+
/** When baseline was last updated */
|
|
83
|
+
lastUpdated: number;
|
|
84
|
+
}
|
|
85
|
+
export interface DriftAnalysis {
|
|
86
|
+
/** Overall drift score (0-100) */
|
|
87
|
+
driftScore: number;
|
|
88
|
+
/** Is currently drifting */
|
|
89
|
+
isDrifting: boolean;
|
|
90
|
+
/** Specific drift indicators */
|
|
91
|
+
indicators: DriftIndicator[];
|
|
92
|
+
/** Comparison with baseline */
|
|
93
|
+
baselineComparison: {
|
|
94
|
+
toolDrift: number;
|
|
95
|
+
topicDrift: number;
|
|
96
|
+
sentimentDrift: number;
|
|
97
|
+
responseLengthDrift: number;
|
|
98
|
+
responseTimeDrift: number;
|
|
99
|
+
errorRateDrift: number;
|
|
100
|
+
};
|
|
101
|
+
/** Goal alignment score (if enabled) */
|
|
102
|
+
goalAlignment?: number;
|
|
103
|
+
/** Recommendations */
|
|
104
|
+
recommendations: string[];
|
|
105
|
+
}
|
|
106
|
+
export interface DriftIndicator {
|
|
107
|
+
type: string;
|
|
108
|
+
severity: "low" | "medium" | "high" | "critical";
|
|
109
|
+
description: string;
|
|
110
|
+
currentValue: number | string;
|
|
111
|
+
baselineValue: number | string;
|
|
112
|
+
deviation: number;
|
|
113
|
+
}
|
|
114
|
+
export interface DriftDetectorResult {
|
|
115
|
+
allowed: boolean;
|
|
116
|
+
reason: string;
|
|
117
|
+
request_id: string;
|
|
118
|
+
analysis: DriftAnalysis;
|
|
119
|
+
requires_review: boolean;
|
|
120
|
+
kill_switch_recommended: boolean;
|
|
121
|
+
}
|
|
122
|
+
export declare class DriftDetector {
|
|
123
|
+
private config;
|
|
124
|
+
private samples;
|
|
125
|
+
private baselines;
|
|
126
|
+
private driftState;
|
|
127
|
+
private goalDefinitions;
|
|
128
|
+
constructor(config?: DriftDetectorConfig);
|
|
129
|
+
/**
|
|
130
|
+
* Record a behavior sample
|
|
131
|
+
*/
|
|
132
|
+
recordSample(agentId: string, sample: BehaviorSample): void;
|
|
133
|
+
/**
|
|
134
|
+
* Analyze current behavior for drift
|
|
135
|
+
*/
|
|
136
|
+
analyze(agentId: string, currentSample?: BehaviorSample, requestId?: string): DriftDetectorResult;
|
|
137
|
+
/**
|
|
138
|
+
* Set baseline manually
|
|
139
|
+
*/
|
|
140
|
+
setBaseline(agentId: string, baseline: BaselineProfile): void;
|
|
141
|
+
/**
|
|
142
|
+
* Get current baseline for an agent
|
|
143
|
+
*/
|
|
144
|
+
getBaseline(agentId: string): BaselineProfile | null;
|
|
145
|
+
/**
|
|
146
|
+
* Update baseline from collected samples
|
|
147
|
+
*/
|
|
148
|
+
updateBaseline(agentId: string): void;
|
|
149
|
+
/**
|
|
150
|
+
* Define goals for goal alignment checking
|
|
151
|
+
*/
|
|
152
|
+
defineGoals(agentId: string, goals: Record<string, {
|
|
153
|
+
target: number;
|
|
154
|
+
tolerance: number;
|
|
155
|
+
}>): void;
|
|
156
|
+
/**
|
|
157
|
+
* Get drift state for an agent
|
|
158
|
+
*/
|
|
159
|
+
isDrifting(agentId: string): boolean;
|
|
160
|
+
/**
|
|
161
|
+
* Get all agents with drift
|
|
162
|
+
*/
|
|
163
|
+
getDriftingAgents(): string[];
|
|
164
|
+
/**
|
|
165
|
+
* Reset agent state
|
|
166
|
+
*/
|
|
167
|
+
resetAgent(agentId: string): void;
|
|
168
|
+
/**
|
|
169
|
+
* Get sample count for an agent
|
|
170
|
+
*/
|
|
171
|
+
getSampleCount(agentId: string): number;
|
|
172
|
+
private calculateBaseline;
|
|
173
|
+
private performAnalysis;
|
|
174
|
+
private calculateToolDistribution;
|
|
175
|
+
private calculateTopicDistribution;
|
|
176
|
+
private distributionDivergence;
|
|
177
|
+
private checkGoalAlignment;
|
|
178
|
+
private mean;
|
|
179
|
+
private stdDev;
|
|
180
|
+
private generateRecommendations;
|
|
181
|
+
}
|
|
182
|
+
//# sourceMappingURL=drift-detector.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"drift-detector.d.ts","sourceRoot":"","sources":["../../src/guards/drift-detector.ts"],"names":[],"mappings":"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"}
|